ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2MDE4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOTQwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Q29weSBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlY2IzNzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy4zLjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249ImpzdF9qMmVlX3RvYy5kaXRhbWFwIiAvPiAKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCSAgICAgPGhlbHAuYnVpbGRIZWxwSW5kZXggbWFuaWZlc3Q9InBsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIuIi8+Ci0JCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2NiN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMTliMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIGpzdF9qMmVlX3RvYy54bWwsXAotICAgICAgICAgICAgICAganN0X2oyZWVfcmVsc21hcC54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouaHRtKixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGluZGV4LyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcmluZGV4LnhtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0JCSAgICAgICAgKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvQWRkUmVsYXRpb25zaGlwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL0FkZFJlbGF0aW9uc2hpcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmE3NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvQWRkUmVsYXRpb25zaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL1Byb2plY3RFeHBsb3Jlci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9Qcm9qZWN0RXhwbG9yZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM3MjkwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL1Byb2plY3RFeHBsb3Jlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9SZWxhdGlvbnNoaXBzLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL1JlbGF0aW9uc2hpcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWY1MmViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL1JlbGF0aW9uc2hpcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvbjVycGRjc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvbjVycGRjc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJlMThjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL241cnBkY3N0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL3ZhbGlkYXRlZmlsdGVycy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy92YWxpZGF0ZWZpbHRlcnMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDgxMDkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL3ZhbGlkYXRlZmlsdGVycy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy95Y3dpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy95Y3dpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMveWN3aW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9fMTguY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9fMTguY2ZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDAyNDE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvXzE4LmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY0MzZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jVHVlIE1heSAyNyAxMDo0Nzo0NCBFRFQgMjAwOA0KLW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyXG4xLjEuMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZTVmZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jVHVlIE1heSAyNyAxMDo0Nzo0NCBFRFQgMjAwOA0KLWx1Y2VuZT0xLjkuMS52MjAwNzA2MTExNzI0DQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMS52MjAwNzA4MTNfMzN4P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjg5YTI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjcgMTA6NDc6NDQgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqY2lyY2xlLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YWRkaW5nZmFjZXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGFwcC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NmYWNldHMuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90Y2hhbmdlZmFjZXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1qMmVlYXBwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphcHBwcm9qLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcHJvamVjdHMuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jdHlwZXNvZmFubm8uaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWU1b3ZlcnZpZXcuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXcuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcHJhci5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBlYXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1yZWYuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RjaGFuZ2VqYXZhbGV2ZWwuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxpZGF0b3JzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nhbm5vdGF0aW9ucy5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWFycHJvai5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwcmFyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phdmFlZTUuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J0dW5ldmFsaWRhdC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjNjQ5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV9yZWxzbWFwLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3JlbHNtYXAuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3Zjk0Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3JlbHNtYXAuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCB0aXRsZT0iSjJFRSBXVFAgcmVsYXRpb25hbCB0YWJsZSI+DQotPHJlbHRhYmxlPg0KLTxyZWxoZWFkZXI+DQotPHJlbGNvbHNwZWMgdHlwZT0iY29uY2VwdCI+PC9yZWxjb2xzcGVjPg0KLTxyZWxjb2xzcGVjIHR5cGU9InRhc2siPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJyZWZlcmVuY2UiPjwvcmVsY29sc3BlYz4NCi08L3JlbGhlYWRlcj4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGxpbmtpbmc9InRhcmdldG9ubHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2phcmNoLmRpdGEiIG5hdnRpdGxlPSJKMkVFIGFyY2hpdGVjdHVyZSI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgZm9ybWF0PSJodG1sIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmRvYy51c2VyL3RvcGljcy90d2luc3RwcmYuaHRtbCINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBsb2NrdGl0bGU9InllcyIgbmF2dGl0bGU9IkRlZmluaW5nIHRoZSBpbnN0YWxsZWQgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdmFsLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J2YWxlcnIuZGl0YSIgbmF2dGl0bGU9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnZhbGlkYXRvcnMuZGl0YSIgbmF2dGl0bGU9IkoyRUUgVmFsaWRhdG9ycyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGp2YWxkaXNhYmxlLmRpdGEiIG5hdnRpdGxlPSJEaXNhYmxpbmcgdmFsaWRhdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdmFsZ2xvYmFscHJlZi5kaXRhIiBuYXZ0aXRsZT0iT3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdmFsbWFudWFsLmRpdGEiIG5hdnRpdGxlPSJNYW51YWxseSB2YWxpZGF0aW5nIGNvZGUiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anZhbHNlbGVjdC5kaXRhIiBuYXZ0aXRsZT0iU2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9ycyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ydHVuZXZhbGlkYXQuZGl0YSIgbmF2dGl0bGU9IlR1bmluZyB2YWxpZGF0b3JzIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqYXJjaC5kaXRhIiBuYXZ0aXRsZT0iSjJFRSBhcmNoaXRlY3R1cmUiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jamVhcnByb2ouZGl0YSIgbmF2dGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZWFyLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amltcGVhci5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amV4cGVhci5kaXRhIiBuYXZ0aXRsZT0iRXhwb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gaW50byBhbiBFQVIgZmlsZSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2phcmNoLmRpdGEiIG5hdnRpdGxlPSJKMkVFIGFyY2hpdGVjdHVyZSI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqYXBwY2xpcHJvai5kaXRhIiBuYXZ0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amFwcHByb2ouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpleHBhcHAuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqaW1wYXBwLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqY2lyY2xlLmRpdGEiIG5hdnRpdGxlPSJDeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqaW1wZWFyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZSI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY2lyY2xlYi5kaXRhIiBuYXZ0aXRsZT0iQ29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9janZpZXcuZGl0YSIgbmF2dGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anZpZXdmaWx0ZXJzLmRpdGEiIG5hdnRpdGxlPSJGaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jamVhcnByb2ouZGl0YSIgbmF2dGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGplYXIuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqYXBwcHJvai5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anJhci5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2ZhY2V0cy5kaXRhIiBuYXZ0aXRsZT0iUHJvamVjdCBmYWNldHMiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9janBlcnMuZGl0YSIgbmF2dGl0bGU9IkoyRUUgcGVyc3BlY3RpdmUiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9janZpZXcuZGl0YSIgbmF2dGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgZm9ybWF0PSJodG1sIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jd29ya3NldC5odG0iDQotbG9ja3RpdGxlPSJ5ZXMiIG5hdnRpdGxlPSJXb3JraW5nIHNldHMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2ZhY2V0cy5kaXRhIiBuYXZ0aXRsZT0iUHJvamVjdCBmYWNldHMiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbmdmYWNldC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZmFjZXQgdG8gYSBKMkVFIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y2hhbmdlamF2YWxldmVsLmRpdGEiIG5hdnRpdGxlPSJDaGFuZ2luZyB0aGUgSmF2YSBjb21waWxlciB2ZXJzaW9uIGZvciBhIEoyRUUNCi1wcm9qZWN0Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNoYW5nZWZhY2V0LmRpdGEiIG5hdnRpdGxlPSJDaGFuZ2luZyB0aGUgdmVyc2lvbiBvZiBhIGZhY2V0Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTwvcmVsdGFibGU+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV9yZWxzbWFwLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfcmVsc21hcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzk5MGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV9yZWxzbWFwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iSjJFRSBXVFAgcmVsYXRpb25hbCB0YWJsZSIvPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmRhZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0ianN0ajJlZXRvYyIgdGl0bGU9IkoyRUUgYXBwbGljYXRpb25zIC0gV1RQIj4NCi08YW5jaG9yIGlkPSJtYXBfdG9wIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9waC1qMmVlYXBwLmRpdGEiIG5hdnRpdGxlPSJKYXZhIEVFIGFwcGxpY2F0aW9ucyI+DQotPGFuY2hvciBpZD0iYmVmb3JlX2ludHJvX3RvcGljcyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2phdmFlZTUuZGl0YSIgbmF2dGl0bGU9IkRldmVsb3BpbmcgSmF2YSBFRSA1IEFwcGxpY2F0aW9ucyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jamVlNW92ZXJ2aWV3LmRpdGEiIG5hdnRpdGxlPSJKYXZhIEVFIDU6IE92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2Fubm90YXRpb25zLmRpdGEiIG5hdnRpdGxlPSJKYXZhIEVFIDUgc3VwcG9ydCBmb3IgYW5ub3RhdGlvbnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGRlZmluaW5nYW5ub3RhdGlvbnMuZGl0YSIgbmF2dGl0bGU9IkRlZmluaW5nIGFuZCB1c2luZyBBbm5vdGF0aW9ucyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jdHlwZXNvZmFubm8uZGl0YSIgbmF2dGl0bGU9IlR5cGVzIG9mIGFubm90YXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2phcmNoLmRpdGEiIG5hdnRpdGxlPSJKMkVFIGFyY2hpdGVjdHVyZSI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqcGVycy5kaXRhIiBuYXZ0aXRsZT0iSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Nqdmlldy5kaXRhIiBuYXZ0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImFmdGVyX2ludHJvX3RvcGljcyIvPg0KLTxhbmNob3IgaWQ9ImJlZm9yZV9maWx0ZXJzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anZpZXdmaWx0ZXJzLmRpdGEiIG5hdnRpdGxlPSJGaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJhZnRlcl9maWx0ZXJzIi8+DQotPGFuY2hvciBpZD0iYmVmb3JlX3Byb2plY3RzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9waC1wcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIHByb2plY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqZWFycHJvai5kaXRhIiBuYXZ0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NqYXBwY2xpcHJvai5kaXRhIiBuYXZ0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InByb2plY3RfdHlwZXMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZWFyLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amFwcHByb2ouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpyYXIuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iY3JlYXRpbmdfcHJvamVjdHMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdGFyZ2V0c2VydmVyLmRpdGEiIG5hdnRpdGxlPSJTcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InRhcmdldF9zZXJ2ZXJzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZmFjZXRzLmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IGZhY2V0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW5nZmFjZXQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGZhY2V0IHRvIGEgSmF2YSBFRSBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNoYW5nZWZhY2V0LmRpdGEiIG5hdnRpdGxlPSJDaGFuZ2luZyB0aGUgdmVyc2lvbiBvZiBhIGZhY2V0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5kaXRhIiBuYXZ0aXRsZT0iQ2hhbmdpbmcgdGhlIEphdmEgY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iY2hpbGRvZl9KMkVFUHJvamVjdEZhY2V0cyIvPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iSjJFRVByb2plY3RGYWNldHMiLz4NCi08YW5jaG9yIGlkPSJiZWZvcmVfaW1wb3J0ZXhwb3J0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9waC1pbXBvcnRleHBvcnQuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlcyI+DQotPGFuY2hvciBpZD0iaW1wb3J0ZXhwb3J0X3RvcCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpleHBhcHAuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZXhwZWFyLmRpdGEiIG5hdnRpdGxlPSJFeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpleHByYXIuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBjb25uZWN0b3IgcHJvamVjdHMgdG8gUkFSIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImV4cG9ydF90eXBlcyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGppbXBlYXIuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGppbXBhcHAuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amltcHJhci5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGUiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sIg0KLWxpbmtpbmc9InRhcmdldG9ubHkiIGxvY2t0aXRsZT0ieWVzIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIg0KLXNjb3BlPSJwZWVyIiB0b2M9Im5vIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbCINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBsb2NrdGl0bGU9InllcyIgbmF2dGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyINCi1zY29wZT0icGVlciIgdG9jPSJubyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgZm9ybWF0PSJodG1sIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWltcC5odG1sIg0KLWxpbmtpbmc9InRhcmdldG9ubHkiIGxvY2t0aXRsZT0ieWVzIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIEVKQiBKQVIgZmlsZXMiIHNjb3BlPSJwZWVyIg0KLXRvYz0ibm8iPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVleHAuaHRtbCINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBsb2NrdGl0bGU9InllcyIgbmF2dGl0bGU9IkV4cG9ydGluZyBFSkIgcHJvamVjdHMgdG8gRUpCIEpBUiBmaWxlcyINCi1zY29wZT0icGVlciIgdG9jPSJubyI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJpbXBvcnRfdHlwZXMiLz4NCi08YW5jaG9yIGlkPSJiZWZvcmVfZGVwZW5kZW5jaWVzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jamNpcmNsZS5kaXRhIiBuYXZ0aXRsZT0iQ3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjaXJjbGViLmRpdGEiIG5hdnRpdGxlPSJDb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVINCi1pcyBpbXBvcnRlZCI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJhZnRlcl9kZXBlbmRlbmNpZXMiLz4NCi08YW5jaG9yIGlkPSJpbXBvcnRleHBvcnRfYm90dG9tIi8+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJhZnRlcl9pbXBvcnRleHBvcnQiLz48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImFmdGVyX3Byb2plY3RzIi8+DQotPGFuY2hvciBpZD0iYmVmb3JlX3ZhbGlkYXRpb24iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdmFsLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPg0KLTxhbmNob3IgaWQ9InZhbGlkYXRpb25fdG9wIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ydHVuZXZhbGlkYXQuZGl0YSIgbmF2dGl0bGU9IlR1bmluZyB2YWxpZGF0b3JzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnZhbGVyci5kaXRhIiBuYXZ0aXRsZT0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ydmFsaWRhdG9ycy5kaXRhIiBuYXZ0aXRsZT0iSjJFRSBWYWxpZGF0b3JzIj4NCi08YW5jaG9yIGlkPSJjaGlsZG9mX3ZhbGlkYXRvcnMiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGp2YWxkaXNhYmxlLmRpdGEiIG5hdnRpdGxlPSJEaXNhYmxpbmcgdmFsaWRhdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqdmFsc2VsZWN0LmRpdGEiIG5hdnRpdGxlPSJTZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmRpdGEiIG5hdnRpdGxlPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGp2YWxtYW51YWwuZGl0YSIgbmF2dGl0bGU9Ik1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ2YWxpZGF0aW9uX2JvdHRvbSIvPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iYWZ0ZXJfdmFsaWRhdGlvbiIvPg0KLTxhbmNob3IgaWQ9ImJlZm9yZV9yZWZlcmVuY2UiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3BoLXJlZi5kaXRhIiBuYXZ0aXRsZT0iUmVmZXJlbmNlIj4NCi08YW5jaG9yIGlkPSJyZWZlcmVuY2VfdG9wIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ydmFsaWRhdG9ycy5kaXRhIiBuYXZ0aXRsZT0iSjJFRSBWYWxpZGF0b3JzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnZhbGVyci5kaXRhIiBuYXZ0aXRsZT0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiPg0KLTxhbmNob3IgaWQ9InZhbGlkYXRpb25fZXJyb3JzIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JqbGltaXRjdXJyZW50LmRpdGEiIG5hdnRpdGxlPSJMaW1pdGF0aW9ucyBvZiBKMkVFIGRldmVsb3BtZW50IHRvb2xzIj4NCi08YW5jaG9yIGlkPSJsaW1pdGF0aW9ucyIvPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0icmVmZXJlbmNlX2JvdHRvbSIvPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iYWZ0ZXJfcmVmZXJlbmNlIi8+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJtYXBfYm90dG9tIi8+PC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGExYzM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkoyRUUgYXBwbGljYXRpb25zIC0gV1RQIiB0b3BpYz0idG9waWNzL3BoLWoyZWVhcHAuaHRtbCI+Ci08YW5jaG9yIGlkPSJtYXBfdG9wIi8+Ci08dG9waWMgbGFiZWw9IkphdmEgRUUgYXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvcGgtajJlZWFwcC5odG1sIj4KLTxhbmNob3IgaWQ9ImJlZm9yZV9pbnRyb190b3BpY3MiLz4KLTx0b3BpYyBsYWJlbD0iRGV2ZWxvcGluZyBKYXZhIEVFIDUgQXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvY2phdmFlZTUuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkphdmEgRUUgNTogT3ZlcnZpZXciIGhyZWY9InRvcGljcy9jamVlNW92ZXJ2aWV3Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSmF2YSBFRSA1IHN1cHBvcnQgZm9yIGFubm90YXRpb25zIiBocmVmPSJ0b3BpY3MvY2Fubm90YXRpb25zLmh0bWwiPgotPHRvcGljIGxhYmVsPSJEZWZpbmluZyBhbmQgdXNpbmcgYW5ub3RhdGlvbnMiIGhyZWY9InRvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iVHlwZXMgb2YgYW5ub3RhdGlvbnMiIGhyZWY9InRvcGljcy9jdHlwZXNvZmFubm8uaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIgaHJlZj0idG9waWNzL2NqYXJjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkphdmEgRUUgcGVyc3BlY3RpdmUiIGhyZWY9InRvcGljcy9janBlcnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUiIGhyZWY9InRvcGljcy9janZpZXcuaHRtbCIvPgotPGFuY2hvciBpZD0iYWZ0ZXJfaW50cm9fdG9waWNzIi8+Ci08YW5jaG9yIGlkPSJiZWZvcmVfZmlsdGVycyIvPgotPHRvcGljIGxhYmVsPSJGaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyIgaHJlZj0idG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbCIvPgotPGFuY2hvciBpZD0iYWZ0ZXJfZmlsdGVycyIvPgotPGFuY2hvciBpZD0iYmVmb3JlX3Byb2plY3RzIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9qZWN0cyIgaHJlZj0idG9waWNzL3BoLXByb2plY3RzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY2plYXJwcm9qLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiLz4KLTxhbmNob3IgaWQ9InByb2plY3RfdHlwZXMiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGplYXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIgaHJlZj0idG9waWNzL3RqYXBwcHJvai5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIGhyZWY9InRvcGljcy90anJhci5odG1sIi8+Ci08YW5jaG9yIGlkPSJjcmVhdGluZ19wcm9qZWN0cyIvPgotPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbCIvPgotPGFuY2hvciBpZD0idGFyZ2V0X3NlcnZlcnMiLz4KLTx0b3BpYyBsYWJlbD0iUHJvamVjdCBmYWNldHMiIGhyZWY9InRvcGljcy9jZmFjZXRzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdCIgaHJlZj0idG9waWNzL3RhZGRpbmdmYWNldC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQiIGhyZWY9InRvcGljcy90Y2hhbmdlZmFjZXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDaGFuZ2luZyB0aGUgSmF2YSBjb21waWxlciB2ZXJzaW9uIGZvciBhIEphdmEgRUUgcHJvamVjdCIgaHJlZj0idG9waWNzL3RjaGFuZ2VqYXZhbGV2ZWwuaHRtbCIvPgotPGFuY2hvciBpZD0iY2hpbGRvZl9KMkVFUHJvamVjdEZhY2V0cyIvPgotPC90b3BpYz4KLTxhbmNob3IgaWQ9IkoyRUVQcm9qZWN0RmFjZXRzIi8+Ci08YW5jaG9yIGlkPSJiZWZvcmVfaW1wb3J0ZXhwb3J0Ii8+Ci08dG9waWMgbGFiZWw9IkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlcyIgaHJlZj0idG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIj4KLTxhbmNob3IgaWQ9ImltcG9ydGV4cG9ydF90b3AiLz4KLTx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGpleHBhcHAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlIiBocmVmPSJ0b3BpY3MvdGpleHBlYXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlcyIgaHJlZj0idG9waWNzL3RqZXhwcmFyLmh0bWwiLz4KLTxhbmNob3IgaWQ9ImV4cG9ydF90eXBlcyIvPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZSIgaHJlZj0idG9waWNzL3RqaW1wZWFyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSIgaHJlZj0idG9waWNzL3RqaW1wYXBwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGUiIGhyZWY9InRvcGljcy90amltcHJhci5odG1sIi8+Ci08YW5jaG9yIGlkPSJpbXBvcnRfdHlwZXMiLz4KLTxhbmNob3IgaWQ9ImJlZm9yZV9kZXBlbmRlbmNpZXMiLz4KLTx0b3BpYyBsYWJlbD0iQ3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzIiBocmVmPSJ0b3BpY3MvY2pjaXJjbGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQiIGhyZWY9InRvcGljcy90amNpcmNsZWIuaHRtbCIvPgotPGFuY2hvciBpZD0iYWZ0ZXJfZGVwZW5kZW5jaWVzIi8+Ci08YW5jaG9yIGlkPSJpbXBvcnRleHBvcnRfYm90dG9tIi8+Ci08L3RvcGljPgotPGFuY2hvciBpZD0iYWZ0ZXJfaW1wb3J0ZXhwb3J0Ii8+Ci08L3RvcGljPgotPGFuY2hvciBpZD0iYWZ0ZXJfcHJvamVjdHMiLz4KLTxhbmNob3IgaWQ9ImJlZm9yZV92YWxpZGF0aW9uIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyIgaHJlZj0idG9waWNzL3RqdmFsLmh0bWwiPgotPGFuY2hvciBpZD0idmFsaWRhdGlvbl90b3AiLz4KLTx0b3BpYyBsYWJlbD0iVHVuaW5nIHZhbGlkYXRvcnMiIGhyZWY9InRvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDb21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9ucyIgaHJlZj0idG9waWNzL3J2YWxlcnIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJKMkVFIFZhbGlkYXRvcnMiIGhyZWY9InRvcGljcy9ydmFsaWRhdG9ycy5odG1sIj4KLTxhbmNob3IgaWQ9ImNoaWxkb2ZfdmFsaWRhdG9ycyIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iRGlzYWJsaW5nIHZhbGlkYXRpb24iIGhyZWY9InRvcGljcy90anZhbGRpc2FibGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzIiBocmVmPSJ0b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iTWFudWFsbHkgdmFsaWRhdGluZyBjb2RlIiBocmVmPSJ0b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIvPgotPGFuY2hvciBpZD0idmFsaWRhdGlvbl9ib3R0b20iLz4KLTwvdG9waWM+Ci08YW5jaG9yIGlkPSJhZnRlcl92YWxpZGF0aW9uIi8+Ci08YW5jaG9yIGlkPSJiZWZvcmVfcmVmZXJlbmNlIi8+Ci08dG9waWMgbGFiZWw9IlJlZmVyZW5jZSIgaHJlZj0idG9waWNzL3BoLXJlZi5odG1sIj4KLTxhbmNob3IgaWQ9InJlZmVyZW5jZV90b3AiLz4KLTx0b3BpYyBsYWJlbD0iSjJFRSBWYWxpZGF0b3JzIiBocmVmPSJ0b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDb21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9ucyIgaHJlZj0idG9waWNzL3J2YWxlcnIuaHRtbCI+Ci08YW5jaG9yIGlkPSJ2YWxpZGF0aW9uX2Vycm9ycyIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iTGltaXRhdGlvbnMgb2YgSjJFRSBkZXZlbG9wbWVudCB0b29scyIgaHJlZj0idG9waWNzL3JqbGltaXRjdXJyZW50Lmh0bWwiPgotPGFuY2hvciBpZD0ibGltaXRhdGlvbnMiLz4KLTwvdG9waWM+Ci08YW5jaG9yIGlkPSJyZWZlcmVuY2VfYm90dG9tIi8+Ci08L3RvcGljPgotPGFuY2hvciBpZD0iYWZ0ZXJfcmVmZXJlbmNlIi8+Ci08L3RvcGljPgotPGFuY2hvciBpZD0ibWFwX2JvdHRvbSIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE4MDU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjMiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgICA8dG9jIGZpbGU9ImpzdF9qMmVlX3RvYy54bWwiIC8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXJpbmRleC54bWwiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UubHVjZW5lU2VhcmNoUGFydGljaXBhbnRzIj4KLSAgICAgIDxiaW5kaW5nIHBhcnRpY2lwYW50SWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS54aHRtbCIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLm1hcGxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOGMyYWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9ImpzdF9qMmVlX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9ImpzdF9qMmVlX3RvYy5kaXRhbWFwIi8+DQotICAgIDxtYXAgZmlsZT0ianN0X2oyZWVfcmVsc21hcC5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1YjE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IkphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIDUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqYXZhZWU1Lmh0bWwjY2phdmFlZTUiIHRpdGxlPSJEZXZlbG9waW5nIEphdmEgRUUgNSBBcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YSBFRSA1Ij4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqZWU1b3ZlcnZpZXcuaHRtbCNjamF2YWVlNSIgdGl0bGU9IkphdmEgRUUgNTogT3ZlcnZpZXciLz4KLSAgICA8ZW50cnkga2V5d29yZD0iYW5ub3RhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jYW5ub3RhdGlvbnMuaHRtbCNjamF2YWVlNSIgdGl0bGU9IkphdmEgRUUgNSBzdXBwb3J0IGZvciBhbm5vdGF0aW9ucyIvPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sI3RqaW1wZWFyIiB0aXRsZT0iRGVmaW5pbmcgYW5kIHVzaW5nIGFubm90YXRpb25zIi8+Ci0gICAgICA8ZW50cnkga2V5d29yZD0idHlwZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N0eXBlc29mYW5uby5odG1sI2NqYXZhZWU1IiB0aXRsZT0iVHlwZXMgb2YgYW5ub3RhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVmaW5pbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sI3RqaW1wZWFyIiB0aXRsZT0iRGVmaW5pbmcgYW5kIHVzaW5nIGFubm90YXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Ik9lcnZpZXciPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2plZTVvdmVydmlldy5odG1sI2NqYXZhZWU1IiB0aXRsZT0iSmF2YSBFRSA1OiBPdmVydmlldyIvPgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSjJFRSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFyY2hpdGVjdHVyZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqYXJjaC5odG1sI2NqYXJjaCIgdGl0bGU9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqZWFycHJvai5odG1sI2NqZWFycHJvaiIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqZWFyLmh0bWwjdGplYXIiIHRpdGxlPSJDcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGFyZ2V0IHNlcnZlcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anRhcmdldHNlcnZlci5odG1sI3RqdGFyZ2V0c2VydmVyIiB0aXRsZT0iU3BlY2lmeWluZyB0YXJnZXQgc2VydmVycyBmb3IgSjJFRSBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRvb2wgbGltaXRhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yamxpbWl0Y3VycmVudC5odG1sI3JqbGltaXRjdXJyZW50IiB0aXRsZT0iTGltaXRhdGlvbnMgb2YgSjJFRSBkZXZlbG9wbWVudCB0b29scyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKYXZhIEVFIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqYXJjaC5odG1sI2NqYXJjaCIgdGl0bGU9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IndvcmtiZW5jaCBwZXJzcGVjdGl2ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9janBlcnMuaHRtbCNjanBlcnMiIHRpdGxlPSJKYXZhIEVFIHBlcnNwZWN0aXZlIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwjY2phcHBjbGlwcm9qIiB0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvamVjdCBmYWNldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZmFjZXRzLmh0bWwjY2ZhY2V0cyIgdGl0bGU9IlByb2plY3QgZmFjZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHByb2plY3QgZmFjZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGluZ2ZhY2V0Lmh0bWwjdGFkZGluZ2ZhY2V0IiB0aXRsZT0iQWRkaW5nIGEgZmFjZXQgdG8gYSBKYXZhIEVFIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFuZ2luZyBmYWNldCB2ZXJzaW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjaGFuZ2VmYWNldC5odG1sI3RjaGFuZ2VmYWNldCIgdGl0bGU9IkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0IGNvbXBpbGVyIGxldmVsIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sI3RjaGFuZ2VqYXZhbGV2ZWwiIHRpdGxlPSJDaGFuZ2luZyB0aGUgSmF2YSBjb21waWxlciB2ZXJzaW9uIGZvciBhIEphdmEgRUUgcHJvamVjdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIG1vZHVsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jamNpcmNsZS5odG1sI2NqY2lyY2xlIiB0aXRsZT0iQ3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSmF2YSBFRSBwZXJzcGVjdGl2ZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqcGVycy5odG1sI2NqcGVycyIgdGl0bGU9IkphdmEgRUUgcGVyc3BlY3RpdmUiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYXJ0aWZhY3RzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jamVhcnByb2ouaHRtbCNjamVhcnByb2oiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amVhci5odG1sI3RqZWFyIiB0aXRsZT0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpleHBlYXIuaHRtbCN0amV4cGVhciIgdGl0bGU9IkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGUiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amltcGVhci5odG1sI3RqaW1wZWFyIiB0aXRsZT0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpZXdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBFeHBsb3JlciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Nqdmlldy5odG1sI2NqdmlldyIgdGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgRXhwbG9yZXIgZmlsdGVycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbCNjanZpZXdmaWx0ZXJzQ2FpdCIgdGl0bGU9IkZpbHRlcmluZyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZpbHRlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anZpZXdmaWx0ZXJzLmh0bWwjY2p2aWV3ZmlsdGVyc0NhaXQiIHRpdGxlPSJGaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZpbHRlcmluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbCNjanZpZXdmaWx0ZXJzQ2FpdCIgdGl0bGU9IkZpbHRlcmluZyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jamVhcnByb2ouaHRtbCNjamVhcnByb2oiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGFyZ2V0IHNlcnZlcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anRhcmdldHNlcnZlci5odG1sI3RqdGFyZ2V0c2VydmVyIiB0aXRsZT0iU3BlY2lmeWluZyB0YXJnZXQgc2VydmVycyBmb3IgSjJFRSBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZhY2V0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NmYWNldHMuaHRtbCNjZmFjZXRzIiB0aXRsZT0iUHJvamVjdCBmYWNldHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW5nZmFjZXQuaHRtbCN0YWRkaW5nZmFjZXQiIHRpdGxlPSJBZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdCIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFuZ2luZyBmYWNldCB2ZXJzaW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjaGFuZ2VmYWNldC5odG1sI3RjaGFuZ2VmYWNldCIgdGl0bGU9IkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKYXZhIGNvbXBpbGVyIGxldmVsIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sI3RjaGFuZ2VqYXZhbGV2ZWwiIHRpdGxlPSJDaGFuZ2luZyB0aGUgSmF2YSBjb21waWxlciB2ZXJzaW9uIGZvciBhIEphdmEgRUUgcHJvamVjdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImN5Y2xpY2FsIGRlcGVuZGVuY2llcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqY2lyY2xlLmh0bWwjY2pjaXJjbGUiIHRpdGxlPSJDeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKYXZhIEVFIG1vZHVsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY2lyY2xlYi5odG1sI3RqY2lyY2xlYiIgdGl0bGU9IkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZCIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NqYXBwY2xpcHJvai5odG1sI2NqYXBwY2xpcHJvaiIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGphcHBwcm9qLmh0bWwjdGphcHBwcm9qIiB0aXRsZT0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJleHBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amV4cGFwcC5odG1sI3RqZXhwYXBwIiB0aXRsZT0iRXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGppbXBhcHAuaHRtbCN0amltcGFwcCIgdGl0bGU9IkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29ubmVjdG9yIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anJhci5odG1sI3RqcmFyIiB0aXRsZT0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqZXhwcmFyLmh0bWwjdGpleHByYXIiIHRpdGxlPSJFeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqaW1wcmFyLmh0bWwjdGppbXByYXIiIHRpdGxlPSJJbXBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0YXJnZXQgc2VydmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkoyRUUgYXBwbGljYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbCN0anRhcmdldHNlcnZlciIgdGl0bGU9IlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YVNlcnZlciBGYWNlcyAoSlNGKSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2plY3QgZmFjZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2ZhY2V0cy5odG1sI2NmYWNldHMiIHRpdGxlPSJQcm9qZWN0IGZhY2V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmYWNldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFuZ2luZyB2ZXJzaW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjaGFuZ2VmYWNldC5odG1sI3RjaGFuZ2VmYWNldCIgdGl0bGU9IkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRUFSIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZmlsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpleHBlYXIuaHRtbCN0amV4cGVhciIgdGl0bGU9IkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGUiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amltcGVhci5odG1sI3RqaW1wZWFyIiB0aXRsZT0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlJBUiBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqZXhwcmFyLmh0bWwjdGpleHByYXIiIHRpdGxlPSJFeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqaW1wcmFyLmh0bWwjdGppbXByYXIiIHRpdGxlPSJJbXBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkZXBlbmRlbmNpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjeWNsZXMgYmV0d2VlbiBtb2R1bGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2pjaXJjbGUuaHRtbCNjamNpcmNsZSIgdGl0bGU9IkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEphdmEgRUUgbW9kdWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvcnJlY3RpbmcgY3ljbGljYWwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNpcmNsZWIuaHRtbCN0amNpcmNsZWIiIHRpdGxlPSJDb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRUFSIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNpcmNsZWIuaHRtbCN0amNpcmNsZWIiIHRpdGxlPSJDb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYnVpbGQgdmFsaWRhdGlvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVuYWJsaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp2YWwuaHRtbCN0anZhbCIgdGl0bGU9IlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb2RlIHZhbGlkYXRpb24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqdmFsLmh0bWwjdGp2YWwiIHRpdGxlPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlcnJvciBzb2x1dGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ydmFsZXJyLmh0bWwjcnZhbGVyciIgdGl0bGU9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSjJFRSB2YWxpZGF0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCNydmFsaWRhdG9ycyIgdGl0bGU9IkoyRUUgVmFsaWRhdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRpc2FibGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqdmFsZGlzYWJsZS5odG1sI3RqdmFsZGlzYWJsZSIgdGl0bGU9IkRpc2FibGluZyB2YWxpZGF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2VsZWN0aW5nIHZhbGlkYXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anZhbHNlbGVjdC5odG1sI3RqdmFsc2VsZWN0IiB0aXRsZT0iU2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJyaWRpbmcgZ2xvYmFsIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwjdGp2YWxnbG9iYWxwcmVmIiB0aXRsZT0iT3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnVhbCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqdmFsbWFudWFsLmh0bWwjdGp2YWxtYW51YWwiIHRpdGxlPSJNYW51YWxseSB2YWxpZGF0aW5nIGNvZGUiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp2YWwuaHRtbCN0anZhbCIgdGl0bGU9IlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVycm9yIHNvbHV0aW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J2YWxlcnIuaHRtbCNydmFsZXJyIiB0aXRsZT0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKMkVFIHZhbGlkYXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ydmFsaWRhdG9ycy5odG1sI3J2YWxpZGF0b3JzIiB0aXRsZT0iSjJFRSBWYWxpZGF0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGlzYWJsaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwjdGp2YWxkaXNhYmxlIiB0aXRsZT0iRGlzYWJsaW5nIHZhbGlkYXRpb24iLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWxlY3RpbmcgdmFsaWRhdG9ycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwjdGp2YWxzZWxlY3QiIHRpdGxlPSJTZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnJpZGluZyBnbG9iYWwgcHJlZmVyZW5jZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCN0anZhbGdsb2JhbHByZWYiIHRpdGxlPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFudWFsIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGp2YWxtYW51YWwuaHRtbCN0anZhbG1hbnVhbCIgdGl0bGU9Ik1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE0OTUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIgCi0jIE5MU19FTkNPRElORz1VVEYtOCAKLXBsdWdpbk5hbWUgPSBKMkVFIHRvb2xzIGRvY3VtZW50YXRpb24KLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxODA1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMyI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgIDx0b2MgZmlsZT0ianN0X2oyZWVfdG9jLnhtbCIgLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlcmluZGV4LnhtbCIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nhbm5vdGF0aW9ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2Fubm90YXRpb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmY3MjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2Fubm90YXRpb25zLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNqYXZhZWU1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIDUgc3VwcG9ydCBmb3IgYW5ub3RhdGlvbnM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIGdvYWwgb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgNSBwbGF0Zm9ybSBkZXZlbG9wbWVudCBpcyB0byBtaW5pbWl6ZQ0KLXRoZSBudW1iZXIgb2YgYXJ0aWZhY3RzIHRoYXQgeW91IGhhdmUgdG8gY3JlYXRlIGFuZCBtYWludGFpbiwgdGhlcmVieSBzaW1wbGlmeWluZw0KLXRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1IHN1cHBvcnRzIHRoZSBpbmplY3Rpb24gb2YgYW5ub3RhdGlvbnMNCi1pbnRvIHlvdXIgc291cmNlIGNvZGUsIHNvIHRoYXQgeW91IGNhbiBlbWJlZCByZXNvdXJjZXMsIGRlcGVuZGVuY2llcywgc2VydmljZXMsDQotYW5kIGxpZmUtY3ljbGUgbm90aWZpY2F0aW9ucyBpbiB5b3VyIHNvdXJjZSBjb2RlLCB3aXRob3V0IGhhdmluZyB0byBtYWludGFpbg0KLXRoZXNlIGFydGlmYWN0cyBlbHNld2hlcmUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SmF2YSBFRSA1PGluZGV4dGVybT5hbm5vdGF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5BbiBhbm5vdGF0aW9uIGlzIGEgbW9kaWZpZXIgb3IgTWV0YWRhdGEgdGFnIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkYXRhDQotdG8gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMsDQotaW50ZXJmYWNlcywgY29uc3RydWN0b3JzLCBtZXRob2RzLCBmaWVsZHMsIHBhcmFtZXRlcnMsIGFuZCBsb2NhbCB2YXJpYWJsZXMuDQotQW5ub3RhdGlvbnMgcmVwbGFjZSBib2lsZXJwbGF0ZSBjb2RlLCBjb21tb24gY29kZSB0aGF0IGlzIHJlcXVpcmVkIGJ5IGNlcnRhaW4NCi1hcHBsaWNhdGlvbnMuIEZvciBleGFtcGxlLCBhbiBhbm5vdGF0aW9uIGNhbiByZXBsYWNlIHRoZSBwYWlyZWQgaW50ZXJmYWNlDQotYW5kIGltcGxlbWVudGF0aW9uIHJlcXVpcmVkIGZvciBhIFdlYiBzZXJ2aWNlLiBBbm5vdGF0aW9ucyBjYW4gYWxzbyByZXBsYWNlDQotYWRkaXRpb25hbCBmaWxlcyB0aGF0IHByb2dyYW1zIHJlcXVpcmUsIHdoaWNoIGFyZSBtYWludGFpbmVkIHNlcGFyYXRlbHkuIEJ5DQotdXNpbmcgYW4gYW5ub3RhdGlvbiwgdGhpcyBzZXBhcmF0ZSBmaWxlIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gRm9yIGV4YW1wbGUsDQotYW5ub3RhdGlvbnMgY2FuIHJlcGxhY2UgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGVseSBtYWludGFpbmVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcg0KLWZvciA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhQmVhbnMiPkphdmFCZWFuczwvdG0+LiA8L3A+DQotPHA+QW5ub3RhdGlvbnM8dWw+DQotPGxpPlJlcGxhY2UgZGVzY3JpcHRvcnMgZm9yIG1vc3QgcHVycG9zZXM8L2xpPg0KLTxsaT5SZW1vdmUgdGhlIG5lZWQgZm9yIG1hcmtlciBpbnRlcmZhY2VzIChsaWtlIGphdmEucm1pLlJlbW90ZSk8L2xpPg0KLTxsaT5BbGxvdyBhcHBsaWNhdGlvbiBzZXR0aW5ncyB0byBiZSB2aXNpYmxlIGluIHRoZSBjb21wb25lbnQgdGhleSBhZmZlY3Q8L2xpPg0KLTwvdWw+PC9wPg0KLTxwPkphdmEgRUUgNSBwcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyB0YXNrcywgYW1vbmcgb3RoZXJzOjx1bD4NCi08bGk+RGV2ZWxvcGluZyBFbnRlcnByaXNlIEphdmFCZWFuIGFwcGxpY2F0aW9uczwvbGk+DQotPGxpPkRlZmluaW5nIGFuZCB1c2luZyBXZWIgc2VydmljZXM8L2xpPg0KLTxsaT5NYXBwaW5nIEphdmEgdGVjaG5vbG9neSBjbGFzc2VzIHRvIFhNTDwvbGk+DQotPGxpPk1hcHBpbmcgSmF2YSB0ZWNobm9sb2d5IGNsYXNzZXMgdG8gZGF0YWJhc2VzPC9saT4NCi08bGk+TWFwcGluZyBtZXRob2RzIHRvIG9wZXJhdGlvbnM8L2xpPg0KLTxsaT5TcGVjaWZ5aW5nIGV4dGVybmFsIGRlcGVuZGVuY2llczwvbGk+DQotPGxpPlNwZWNpcnlpbmcgZGVwbG95bWVudCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHNlY3VyaXR5IGF0dHJpYnV0ZXM8L2xpPg0KLTwvdWw+PC9wPg0KLTxwPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRQ0KLTUgZGVmaW5lcyBhIG51bWJlciBvZiBhbm5vdGF0aW9ucyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHlvdXIgc291cmNlIGNvZGUuDQotVG8gZGVjbGFyZSBhbiBhbm5vdGF0aW9uLCB5b3Ugc2ltcGx5IHByZWNlZGUgdGhlIGtleXdvcmQgd2l0aCBhbiAiYXQiIHNpZ24NCi0oQCkuIDxjb2RlYmxvY2s+DQotcGFja2FnZSBjb20uaWJtLmNvdW50ZXI7DQotDQotaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7DQotDQotQFN0YXRlbGVzcw0KLQ0KLXB1YmxpYyBjbGFzcyBDb3VudGVyQmVhbiB7DQotDQotfTwvY29kZWJsb2NrPjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2F0ZWdvcmllcyBvZiBhbm5vdGF0aW9ucyB0aGF0IDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFDQotNSBzdXBwb3J0cywgc2VlIDx4cmVmIGhyZWY9ImN0eXBlc29mYW5uby5kaXRhIj5UeXBlcyBvZiBhbm5vdGF0aW9uczwveHJlZj4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2Fubm90YXRpb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jYW5ub3RhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5Y2UxYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jYW5ub3RhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJKYXZhIEVFIDUgc3VwcG9ydCBmb3IgYW5ub3RhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGdvYWwgb2YgSmF2YSBFRSA1IHBsYXRmb3JtIGRldmVsb3BtZW50IGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgYXJ0aWZhY3RzIHRoYXQgeW91IGhhdmUgdG8gY3JlYXRlIGFuZCBtYWludGFpbiwgdGhlcmVieSBzaW1wbGlmeWluZyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gSmF2YSBFRSA1IHN1cHBvcnRzIHRoZSBpbmplY3Rpb24gb2YgYW5ub3RhdGlvbnMgaW50byB5b3VyIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHlvdSBjYW4gZW1iZWQgcmVzb3VyY2VzLCBkZXBlbmRlbmNpZXMsIHNlcnZpY2VzLCBhbmQgbGlmZS1jeWNsZSBub3RpZmljYXRpb25zIGluIHlvdXIgc291cmNlIGNvZGUsIHdpdGhvdXQgaGF2aW5nIHRvIG1haW50YWluIHRoZXNlIGFydGlmYWN0cyBlbHNld2hlcmUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBnb2FsIG9mIEphdmEgRUUgNSBwbGF0Zm9ybSBkZXZlbG9wbWVudCBpcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGFydGlmYWN0cyB0aGF0IHlvdSBoYXZlIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4sIHRoZXJlYnkgc2ltcGxpZnlpbmcgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuIEphdmEgRUUgNSBzdXBwb3J0cyB0aGUgaW5qZWN0aW9uIG9mIGFubm90YXRpb25zIGludG8geW91ciBzb3VyY2UgY29kZSwgc28gdGhhdCB5b3UgY2FuIGVtYmVkIHJlc291cmNlcywgZGVwZW5kZW5jaWVzLCBzZXJ2aWNlcywgYW5kIGxpZmUtY3ljbGUgbm90aWZpY2F0aW9ucyBpbiB5b3VyIHNvdXJjZSBjb2RlLCB3aXRob3V0IGhhdmluZyB0byBtYWludGFpbiB0aGVzZSBhcnRpZmFjdHMgZWxzZXdoZXJlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRUUgNSwgYW5ub3RhdGlvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFIDUsIGFubm90YXRpb25zIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqYXZhZWU1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNqYXZhZWU1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SmF2YSBFRSA1IHN1cHBvcnQgZm9yIGFubm90YXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjamF2YWVlNSI+PGEgbmFtZT0iY2phdmFlZTUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkphdmEgRUUgNSBzdXBwb3J0IGZvciBhbm5vdGF0aW9uczwvaDE+Ci0KLQotCi08ZGl2PjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZSBnb2FsIG9mIEphdmHihKIgRUUgNSBwbGF0Zm9ybSBkZXZlbG9wbWVudCBpcyB0byBtaW5pbWl6ZQotdGhlIG51bWJlciBvZiBhcnRpZmFjdHMgdGhhdCB5b3UgaGF2ZSB0byBjcmVhdGUgYW5kIG1haW50YWluLCB0aGVyZWJ5IHNpbXBsaWZ5aW5nCi10aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gSmF2YSBFRSA1IHN1cHBvcnRzIHRoZSBpbmplY3Rpb24gb2YgYW5ub3RhdGlvbnMKLWludG8geW91ciBzb3VyY2UgY29kZSwgc28gdGhhdCB5b3UgY2FuIGVtYmVkIHJlc291cmNlcywgZGVwZW5kZW5jaWVzLCBzZXJ2aWNlcywKLWFuZCBsaWZlLWN5Y2xlIG5vdGlmaWNhdGlvbnMgaW4geW91ciBzb3VyY2UgY29kZSwgd2l0aG91dCBoYXZpbmcgdG8gbWFpbnRhaW4KLXRoZXNlIGFydGlmYWN0cyBlbHNld2hlcmUuPC9wPgotCi08cD5BbiBhbm5vdGF0aW9uIGlzIGEgbW9kaWZpZXIgb3IgTWV0YWRhdGEgdGFnIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkYXRhCi10byBKYXZhIGNsYXNzZXMsCi1pbnRlcmZhY2VzLCBjb25zdHJ1Y3RvcnMsIG1ldGhvZHMsIGZpZWxkcywgcGFyYW1ldGVycywgYW5kIGxvY2FsIHZhcmlhYmxlcy4KLUFubm90YXRpb25zIHJlcGxhY2UgYm9pbGVycGxhdGUgY29kZSwgY29tbW9uIGNvZGUgdGhhdCBpcyByZXF1aXJlZCBieSBjZXJ0YWluCi1hcHBsaWNhdGlvbnMuIEZvciBleGFtcGxlLCBhbiBhbm5vdGF0aW9uIGNhbiByZXBsYWNlIHRoZSBwYWlyZWQgaW50ZXJmYWNlCi1hbmQgaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgZm9yIGEgV2ViIHNlcnZpY2UuIEFubm90YXRpb25zIGNhbiBhbHNvIHJlcGxhY2UKLWFkZGl0aW9uYWwgZmlsZXMgdGhhdCBwcm9ncmFtcyByZXF1aXJlLCB3aGljaCBhcmUgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LiBCeQotdXNpbmcgYW4gYW5ub3RhdGlvbiwgdGhpcyBzZXBhcmF0ZSBmaWxlIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gRm9yIGV4YW1wbGUsCi1hbm5vdGF0aW9ucyBjYW4gcmVwbGFjZSB0aGUgbmVlZCBmb3IgYSBzZXBhcmF0ZWx5IG1haW50YWluZWQgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1mb3IgSmF2YUJlYW5z4oSiLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkFubm90YXRpb25zPHVsPgotPGxpPlJlcGxhY2UgZGVzY3JpcHRvcnMgZm9yIG1vc3QgcHVycG9zZXM8L2xpPgotCi08bGk+UmVtb3ZlIHRoZSBuZWVkIGZvciBtYXJrZXIgaW50ZXJmYWNlcyAobGlrZSBqYXZhLnJtaS5SZW1vdGUpPC9saT4KLQotPGxpPkFsbG93IGFwcGxpY2F0aW9uIHNldHRpbmdzIHRvIGJlIHZpc2libGUgaW4gdGhlIGNvbXBvbmVudCB0aGV5IGFmZmVjdDwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+SmF2YSBFRSA1IHByb3ZpZGVzIGFubm90YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHRhc2tzLCBhbW9uZyBvdGhlcnM6PHVsPgotPGxpPkRldmVsb3BpbmcgRW50ZXJwcmlzZSBKYXZhQmVhbiBhcHBsaWNhdGlvbnM8L2xpPgotCi08bGk+RGVmaW5pbmcgYW5kIHVzaW5nIFdlYiBzZXJ2aWNlczwvbGk+Ci0KLTxsaT5NYXBwaW5nIEphdmEgdGVjaG5vbG9neSBjbGFzc2VzIHRvIFhNTDwvbGk+Ci0KLTxsaT5NYXBwaW5nIEphdmEgdGVjaG5vbG9neSBjbGFzc2VzIHRvIGRhdGFiYXNlczwvbGk+Ci0KLTxsaT5NYXBwaW5nIG1ldGhvZHMgdG8gb3BlcmF0aW9uczwvbGk+Ci0KLTxsaT5TcGVjaWZ5aW5nIGV4dGVybmFsIGRlcGVuZGVuY2llczwvbGk+Ci0KLTxsaT5TcGVjaXJ5aW5nIGRlcGxveW1lbnQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBzZWN1cml0eSBhdHRyaWJ1dGVzPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJwIj5KYXZhIEVFCi01IGRlZmluZXMgYSBudW1iZXIgb2YgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byB5b3VyIHNvdXJjZSBjb2RlLgotVG8gZGVjbGFyZSBhbiBhbm5vdGF0aW9uLCB5b3Ugc2ltcGx5IHByZWNlZGUgdGhlIGtleXdvcmQgd2l0aCBhbiAiYXQiIHNpZ24KLShAKS4gPHByZT4KLXBhY2thZ2UgY29tLmlibS5jb3VudGVyOwotCi1pbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKLQotQFN0YXRlbGVzcwotCi1wdWJsaWMgY2xhc3MgQ291bnRlckJlYW4gewotCi19PC9wcmU+Ci08L2Rpdj4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhdGVnb3JpZXMgb2YgYW5ub3RhdGlvbnMgdGhhdCBKYXZhIEVFCi01IHN1cHBvcnRzLCBzZWUgPGEgaHJlZj0iY3R5cGVzb2Zhbm5vLmh0bWwiPlR5cGVzIG9mIGFubm90YXRpb25zPC9hPi48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RkZWZpbmluZ2Fubm90YXRpb25zLmh0bWwiPkRlZmluaW5nIGFuZCB1c2luZyBhbm5vdGF0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBjYW4gdXNlIHRoZSBASW50ZXJmYWNlIGFubm90YXRpb24gdG8gZGVmaW5lIHlvdXIgb3duIGFubm90YXRpb24gZGVmaW5pdGlvbi48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jamF2YWVlNS5odG1sIiB0aXRsZT0iVGhlIEphdmEgRUUgNSBwcm9ncmFtbWluZyBtb2RlbCBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIEphdmEgYXBwbGljYXRpb25zLiI+RGV2ZWxvcGluZyBKYXZhIEVFIDUgQXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NmYWNldHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NmYWNldHMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMDU3OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jZmFjZXRzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNmYWNldHMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+UHJvamVjdCBmYWNldHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+RmFjZXRzIGRlZmluZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlcXVpcmVtZW50cw0KLWZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkphdmEgRUU8aW5kZXh0ZXJtPnByb2plY3QgZmFjZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KYXZhU2VydmVyIEZhY2VzIChKU0YpPGluZGV4dGVybT5wcm9qZWN0IGZhY2V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cHJvamVjdHM8aW5kZXh0ZXJtPmZhY2V0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHkgb3V0cHV0Y2xhc3M9ImlkX2NvbmJvZHkiPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4NCi08cCBpZD0iYWJvdXRmYWNldCI+V2hlbiB5b3UgYWRkIGEgZmFjZXQgdG8gYSBwcm9qZWN0LCB0aGF0IHByb2plY3QgaXMgY29uZmlndXJlZA0KLXRvIHBlcmZvcm0gYSBjZXJ0YWluIHRhc2ssIGZ1bGZpbGwgY2VydGFpbiByZXF1aXJlbWVudHMsIG9yIGhhdmUgY2VydGFpbiBjaGFyYWN0ZXJpc3RpY3MuDQotRm9yIGV4YW1wbGUsIHRoZSBFQVIgZmFjZXQgc2V0cyB1cCBhIHByb2plY3QgdG8gZnVuY3Rpb24gYXMgYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uIGJ5IGFkZGluZyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgc2V0dGluZyB1cCB0aGUgcHJvamVjdCdzDQotY2xhc3NwYXRoLjwvcD4NCi08cD5Zb3UgY2FuIGFkZCBmYWNldHMgb25seSB0byBKYXZhIEVFIHByb2plY3RzIGFuZCBvdGhlciB0eXBlcyBvZiBwcm9qZWN0cw0KLXRoYXQgYXJlIGJhc2VkIG9uIEoyRUUgcHJvamVjdHMsIHN1Y2ggYXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cywNCi1keW5hbWljIFdlYiBwcm9qZWN0cywgYW5kIEVKQiBwcm9qZWN0cy4gWW91IGNhbm5vdCBhZGQgZmFjZXRzIHRvIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdA0KLW9yIHBsdWctaW4gcHJvamVjdCwgZm9yIGV4YW1wbGUuIFR5cGljYWxseSwgYSBmYWNldC1lbmFibGVkIHByb2plY3QgaGFzIGF0DQotbGVhc3Qgb25lIGZhY2V0IHdoZW4gaXQgaXMgY3JlYXRlZCwgYWxsb3dpbmcgeW91IHRvIGFkZCBtb3JlIGZhY2V0cyBpZiBuZWNlc3NhcnkuDQotRm9yIGV4YW1wbGUsIGEgbmV3IEVKQiBwcm9qZWN0IGhhcyB0aGUgRUpCIE1vZHVsZSBmYWNldC4gWW91IGNhbiB0aGVuIGFkZA0KLW90aGVyIGZhY2V0cyB0byB0aGlzIHByb2plY3QgbGlrZSB0aGUgRUpCRG9jbGV0IChYRG9jbGV0KSBmYWNldC4gVG8gYWRkIGENCi1mYWNldCB0byBhIHByb2plY3QsIHNlZSA8eHJlZiBocmVmPSJ0YWRkaW5nZmFjZXQuZGl0YSI+PC94cmVmPi48L3A+DQotPHA+U29tZSBmYWNldHMgcmVxdWlyZSBvdGhlciBmYWNldHMgYXMgcHJlcmVxdWlzaXRlcy4gT3RoZXIgZmFjZXRzIGNhbm5vdA0KLWJlIGluIHRoZSBzYW1lIHByb2plY3QgdG9nZXRoZXIuIEZvciBleGFtcGxlLCB5b3UgY2Fubm90IGFkZCB0aGUgRHluYW1pYyBXZWINCi1Nb2R1bGUgZmFjZXQgdG8gYW4gRUpCIHByb2plY3QgYmVjYXVzZSB0aGUgRUpCIHByb2plY3QgYWxyZWFkeSBoYXMgdGhlIEVKQg0KLU1vZHVsZSBmYWNldC4gU29tZSBmYWNldHMgY2FuIGJlIHJlbW92ZWQgZnJvbSBhIHByb2plY3QgYW5kIG90aGVycyBjYW5ub3QuPC9wPg0KLTxwPkZhY2V0cyBhbHNvIGhhdmUgdmVyc2lvbiBudW1iZXJzLiBZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXJzIG9mDQotZmFjZXRzIGFzIGxvbmcgYXMgeW91IHN0YXkgd2l0aGluIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBmYWNldHMuIFRvIGNoYW5nZQ0KLXRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIGZhY2V0LCBzZWUgPHhyZWYgaHJlZj0idGNoYW5nZWZhY2V0LmRpdGEiPjwveHJlZj4uPC9wPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NmYWNldHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NmYWNldHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NThlNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jZmFjZXRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9qZWN0IGZhY2V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzIGZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkZhY2V0cyBkZWZpbmUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXF1aXJlbWVudHMgZm9yIEphdmEgRUUgcHJvamVjdHMgYW5kIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFLCBwcm9qZWN0IGZhY2V0cywgSmF2YVNlcnZlciBGYWNlcyAoSlNGKSwgcHJvamVjdHMsIGZhY2V0cywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFLCBwcm9qZWN0IGZhY2V0cywgSmF2YVNlcnZlciBGYWNlcyAoSlNGKSwgcHJvamVjdHMsIGZhY2V0cywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anJhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluZ2ZhY2V0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y2hhbmdlamF2YWxldmVsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y2hhbmdlZmFjZXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjZmFjZXRzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+UHJvamVjdCBmYWNldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNmYWNldHMiPjxhIG5hbWU9ImNmYWNldHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPlByb2plY3QgZmFjZXRzPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX2NvbmJvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkZhY2V0cyBkZWZpbmUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXF1aXJlbWVudHMKLWZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIDwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHAgaWQ9ImNmYWNldHNfX2Fib3V0ZmFjZXQiPjxhIG5hbWU9ImNmYWNldHNfX2Fib3V0ZmFjZXQiPjwhLS0gLS0+PC9hPldoZW4geW91IGFkZCBhIGZhY2V0IHRvIGEgcHJvamVjdCwgdGhhdCBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQKLXRvIHBlcmZvcm0gYSBjZXJ0YWluIHRhc2ssIGZ1bGZpbGwgY2VydGFpbiByZXF1aXJlbWVudHMsIG9yIGhhdmUgY2VydGFpbiBjaGFyYWN0ZXJpc3RpY3MuCi1Gb3IgZXhhbXBsZSwgdGhlIEVBUiBmYWNldCBzZXRzIHVwIGEgcHJvamVjdCB0byBmdW5jdGlvbiBhcyBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBieSBhZGRpbmcgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHNldHRpbmcgdXAgdGhlIHByb2plY3QncwotY2xhc3NwYXRoLjwvcD4KLQotPHA+WW91IGNhbiBhZGQgZmFjZXRzIG9ubHkgdG8gSmF2YSBFRSBwcm9qZWN0cyBhbmQgb3RoZXIgdHlwZXMgb2YgcHJvamVjdHMKLXRoYXQgYXJlIGJhc2VkIG9uIEoyRUUgcHJvamVjdHMsIHN1Y2ggYXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cywKLWR5bmFtaWMgV2ViIHByb2plY3RzLCBhbmQgRUpCIHByb2plY3RzLiBZb3UgY2Fubm90IGFkZCBmYWNldHMgdG8gYSBKYXZh4oSiIHByb2plY3QKLW9yIHBsdWctaW4gcHJvamVjdCwgZm9yIGV4YW1wbGUuIFR5cGljYWxseSwgYSBmYWNldC1lbmFibGVkIHByb2plY3QgaGFzIGF0Ci1sZWFzdCBvbmUgZmFjZXQgd2hlbiBpdCBpcyBjcmVhdGVkLCBhbGxvd2luZyB5b3UgdG8gYWRkIG1vcmUgZmFjZXRzIGlmIG5lY2Vzc2FyeS4KLUZvciBleGFtcGxlLCBhIG5ldyBFSkIgcHJvamVjdCBoYXMgdGhlIEVKQiBNb2R1bGUgZmFjZXQuIFlvdSBjYW4gdGhlbiBhZGQKLW90aGVyIGZhY2V0cyB0byB0aGlzIHByb2plY3QgbGlrZSB0aGUgRUpCRG9jbGV0IChYRG9jbGV0KSBmYWNldC4gVG8gYWRkIGEKLWZhY2V0IHRvIGEgcHJvamVjdCwgc2VlIDxhIGhyZWY9InRhZGRpbmdmYWNldC5odG1sIiB0aXRsZT0iVGhpcyB0b3BpYyBleHBsYWlucyBob3cgdG8gYWRkIGEgZmFjZXQmIzEwO3RvIGFuIGV4aXN0aW5nIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UuIj5BZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdDwvYT4uPC9wPgotCi08cD5Tb21lIGZhY2V0cyByZXF1aXJlIG90aGVyIGZhY2V0cyBhcyBwcmVyZXF1aXNpdGVzLiBPdGhlciBmYWNldHMgY2Fubm90Ci1iZSBpbiB0aGUgc2FtZSBwcm9qZWN0IHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgeW91IGNhbm5vdCBhZGQgdGhlIER5bmFtaWMgV2ViCi1Nb2R1bGUgZmFjZXQgdG8gYW4gRUpCIHByb2plY3QgYmVjYXVzZSB0aGUgRUpCIHByb2plY3QgYWxyZWFkeSBoYXMgdGhlIEVKQgotTW9kdWxlIGZhY2V0LiBTb21lIGZhY2V0cyBjYW4gYmUgcmVtb3ZlZCBmcm9tIGEgcHJvamVjdCBhbmQgb3RoZXJzIGNhbm5vdC48L3A+Ci0KLTxwPkZhY2V0cyBhbHNvIGhhdmUgdmVyc2lvbiBudW1iZXJzLiBZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXJzIG9mCi1mYWNldHMgYXMgbG9uZyBhcyB5b3Ugc3RheSB3aXRoaW4gdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGZhY2V0cy4gVG8gY2hhbmdlCi10aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBmYWNldCwgc2VlIDxhIGhyZWY9InRjaGFuZ2VmYWNldC5odG1sIiB0aXRsZT0iWW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgYSBmYWNldCYjMTA7aW4gYSBKYXZhIEVFIHByb2plY3QgYnkgZWRpdGluZyB0aGUgZmFjZXRzIGZvciB0aGUgcHJvamVjdC4iPkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQ8L2E+LjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZWFyLmh0bWwiIHRpdGxlPSJVc2luZyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYWxsb3dzIHlvdSB0byBwYWNrYWdlIG1hbnkgd2ViIGFwcGxpY2F0aW9ucyBhbmQgbW9kdWxlcyBpbiBhIHByb2plY3QgYW5kIGRlcGxveSB0aGVzZSBtb2R1bGVzIGFzIGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIj5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqcmFyLmh0bWwiIHRpdGxlPSJBIGNvbm5lY3RvciBpcyBhIEoyRUUgc3RhbmRhcmQgZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3IgY29udGFpbmVycyB0byBwcm92aWRlIGNvbm5lY3Rpdml0eSB0byBlbnRlcnByaXNlIGluZm9ybWF0aW9uIHN5c3RlbXMgKEVJU3MpLiI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbmdmYWNldC5odG1sIiB0aXRsZT0iVGhpcyB0b3BpYyBleHBsYWlucyBob3cgdG8gYWRkIGEgZmFjZXQgdG8gYW4gZXhpc3RpbmcgcHJvamVjdCBpbiB5b3VyIHdvcmtzcGFjZS4iPkFkZGluZyBhIGZhY2V0IHRvIGEgSmF2YSBFRSBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sIiB0aXRsZT0iWW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgSmF2YSB1c2VkIGluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgSmF2YSBmYWNldC4iPkNoYW5naW5nIHRoZSBKYXZhIGNvbXBpbGVyIHZlcnNpb24gZm9yIGEgSmF2YSBFRSBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNoYW5nZWZhY2V0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiBhIGZhY2V0IGluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuIj5DaGFuZ2luZyB0aGUgdmVyc2lvbiBvZiBhIGZhY2V0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcHBjbGlwcm9qLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDQ0YTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcHBjbGlwcm9qLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNqYXBwY2xpcHJvaiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4NCi1wcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbQ0KLWEgc2VydmVyJ3MgdG9vbHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+YXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SmF2YSBFRTxpbmRleHRlcm0+YXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5IG91dHB1dGNsYXNzPSJpZF9jb25ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHA+IEFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbg0KLWNsaWVudCBtb2R1bGVzLiBBbiBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIGlzIHVzZWQgdG8gY29udGFpbiBhIGZ1bGwtZnVuY3Rpb24NCi1jbGllbnQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYXBwbGljYXRpb24gKG5vbiBXZWItYmFzZWQpIHRoYXQgY29ubmVjdHMgdG8gYW5kDQotdXNlcyB0aGUgSmF2YSBFRSByZXNvdXJjZXMgZGVmaW5lZCBpbiB5b3VyIHNlcnZlci4gV2hlbiB5b3UgcGxhY2UgdGhlIGNsaWVudA0KLWNvZGUgaW4gYW4gYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSBpbnN0ZWFkIG9mIGEgc2ltcGxlIEpBUiBmaWxlLCB0aGUgYXBwbGljYXRpb24NCi1jbGllbnQgYmVuZWZpdHMgZnJvbSB0aGUgc2VydmVyJ3MgcmVzb3VyY2VzIChpdCBkb2VzIG5vdCBuZWVkIHRvIHJlLXNwZWNpZnkNCi10aGUgY2xhc3MgcGF0aCB0byBKYXZhIEVFIGFuZCBzZXJ2ZXIgSkFSIGZpbGVzKSBhcyB3ZWxsIGFzIGZyb20gZWFzaWVyIEpOREkNCi1sb29rdXAgKHRoZSBjbGllbnQgY29udGFpbmVyIGZpbGxzIGluIHRoZSBpbml0aWFsIGNvbnRleHQgYW5kIG90aGVyIHBhcmFtZXRlcnMpLg0KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbGxvd3MgeW91IHRvIHdvcmsgYXMgaWYgeW91IGFyZSBjcmVhdGluZyBhDQotc3RhbmRhbG9uZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBhcHBsaWNhdGlvbiBpbiBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3QuPC9wPg0KLTxwPkFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGVuYWJsZXMgeW91IHRvIGRvIHRoZSBmb2xsb3dpbmcgdGhpbmdzOjwvcD4NCi08dWw+DQotPGxpPkRldmVsb3AgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGNsaWVudCBtb2R1bGU8L2xpPg0KLTxsaT5TZXQgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3I8L2xpPg0KLTxsaT5UZXN0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQ8L2xpPg0KLTwvdWw+DQotPHA+TGlrZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9qZWN0cywgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4gdGhlDQotcmVzb3VyY2VzIG5lZWRlZCBmb3IgYXBwbGljYXRpb24gY2xpZW50cywgaW5jbHVkaW5nIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzDQotZmlsZXMuIFdoZW4geW91IGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCwgdGhlIGVudmlyb25tZW50IGlzDQotc2V0IHVwIGZvciA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBkZXZlbG9wbWVudC4gQSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdA0KLXNvIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UgY2FuIGJlIGluY3JlbWVudGFsbHkgY29tcGlsZWQgYXMgaXQgaXMgdXBkYXRlZC4NCi1UaGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgaGllcmFyY2h5DQotYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBlbGVtZW50cy4NCi1UaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgY3VycmVudCBhcyBjaGFuZ2VzIGFyZSBtYWRlLCBhbmQgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkZXINCi13aWxsIGluY3JlbWVudGFsbHkgY29tcGlsZSB0aGUgcmVzb3VyY2VzIHdpdGhpbiB0aGVzZSBwcm9qZWN0cyBhcyB0aGUgcmVzb3VyY2VzDQotYXJlIHVwZGF0ZWQuPC9wPg0KLTxwPkluIHRoZSB3b3JrYmVuY2gsIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgYnkNCi1lbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIpIHByb2plY3RzLiBXaGVuIHlvdSBjcmVhdGUgYW4gYXBwbGljYXRpb24gY2xpZW50DQotcHJvamVjdCwgeW91IHNwZWNpZnkgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0byB3aGljaCB0aGUgYXBwbGljYXRpb24NCi1jbGllbnQgcHJvamVjdCBiZWxvbmdzLiBBIG1vZHVsZSBlbGVtZW50IGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIDxjb2RlcGg+YXBwbGljYXRpb24ueG1sPC9jb2RlcGg+IGRlcGxveW1lbnQNCi1kZXNjcmlwdG9yIGZvciB0aGUgRUFSIHByb2plY3QuPC9wPg0KLTxwPkFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGlzIGRlcGxveWVkIGFzIGEgSkFSIGZpbGUuIFRoaXMgYXBwbGljYXRpb24NCi1jbGllbnQgSkFSIGZpbGUgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzDQotZmlsZXMsIGFuZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gYW5kIGFueSBtZXRhLWRhdGEgZXh0ZW5zaW9ucw0KLWFuZCBiaW5kaW5ncyBmaWxlcy48L3A+DQotPHA+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSB0eXBpY2FsbHkgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcw0KLWNvbm5lY3RlZCB0byBKYXZhIEVFIChFSkIpIHNlcnZlcnMuIFRoZSBwb2ludCBvZiBlbnRyeSBmb3IgdGhlIGFwcGxpY2F0aW9uDQotY2xpZW50IGlzIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gbWFpbi1jbGFzcywgd2hpY2ggaXMgc2ltcGx5IGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY2xhc3MNCi10aGF0IGNvbnRhaW5zIGEgc3RhdGljIG1haW4gbWV0aG9kLiBUaGUgY2xhc3MgaXMgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0DQotZmlsZSBvZiB0aGUgY2xpZW50IG1vZHVsZS4gPC9wPg0KLTxwPkEgSmF2YSBFRSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgSmF2YSBFRSBzZXJ2aWNlDQotKEpOREkgbmFtaW5nIHNlcnZpY2VzLCBkZXBsb3ltZW50IHNlcnZpY2VzLCB0cmFuc2FjdGlvbiBzZXJ2aWNlcywgYW5kIHNlY3VyaXR5DQotc2VydmljZXMpIGFuZCBjb21tdW5pY2F0aW9ucyBBUElzIChpbnRlcm5ldCBwcm90b2NvbHMsIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbg0KLXByb3RvY29scywgT2JqZWN0IE1hbmFnZW1lbnQgR3JvdXAgcHJvdG9jb2xzLCBNZXNzYWdpbmcgcHJvdG9jb2xzLCBhbmQgZGF0YQ0KLWZvcm1hdHMpLjwvcD4NCi08cD5CeSBkZWZhdWx0LCBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBvbmUgZm9sZGVyIG5hbWVkIDx1aWNvbnRyb2w+YXBwQ2xpZW50TW9kdWxlPC91aWNvbnRyb2w+LA0KLXdoaWNoIGNvbnRhaW5zIGJvdGggPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlIGNvZGUgYW5kIGNvbXBpbGVkIDxjb2RlcGg+LmNsYXNzPC9jb2RlcGg+IGZpbGVzLA0KLWFsb25nIHdpdGggYWxsIHRoZSBtZXRhLWRhdGEgZmlsZXMgaW4gdGhlIDx1aWNvbnRyb2w+TUVUQS1JTkY8L3VpY29udHJvbD4gc3ViZm9sZGVyLjwvcD4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQ4NzcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbSBhIHNlcnZlcidzIHRvb2xzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbSBhIHNlcnZlcidzIHRvb2xzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cywgb3ZlcnZpZXcsIEphdmEgRUUiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMsIG92ZXJ2aWV3LCBKYXZhIEVFIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amV4cGFwcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjamFwcGNsaXByb2oiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqYXBwY2xpcHJvaiI+PGEgbmFtZT0iY2phcHBjbGlwcm9qIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfY29uYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4KLXByb2dyYW1zIHRoYXQgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcyBzbyB0aGUgcHJvamVjdCBjYW4gYmVuZWZpdCBmcm9tCi1hIHNlcnZlcidzIHRvb2xzLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHA+IEFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbgotY2xpZW50IG1vZHVsZXMuIEFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaXMgdXNlZCB0byBjb250YWluIGEgZnVsbC1mdW5jdGlvbgotY2xpZW50IEphdmHihKIgYXBwbGljYXRpb24gKG5vbiBXZWItYmFzZWQpIHRoYXQgY29ubmVjdHMgdG8gYW5kCi11c2VzIHRoZSBKYXZhIEVFIHJlc291cmNlcyBkZWZpbmVkIGluIHlvdXIgc2VydmVyLiBXaGVuIHlvdSBwbGFjZSB0aGUgY2xpZW50Ci1jb2RlIGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaW5zdGVhZCBvZiBhIHNpbXBsZSBKQVIgZmlsZSwgdGhlIGFwcGxpY2F0aW9uCi1jbGllbnQgYmVuZWZpdHMgZnJvbSB0aGUgc2VydmVyJ3MgcmVzb3VyY2VzIChpdCBkb2VzIG5vdCBuZWVkIHRvIHJlLXNwZWNpZnkKLXRoZSBjbGFzcyBwYXRoIHRvIEphdmEgRUUgYW5kIHNlcnZlciBKQVIgZmlsZXMpIGFzIHdlbGwgYXMgZnJvbSBlYXNpZXIgSk5ESQotbG9va3VwICh0aGUgY2xpZW50IGNvbnRhaW5lciBmaWxscyBpbiB0aGUgaW5pdGlhbCBjb250ZXh0IGFuZCBvdGhlciBwYXJhbWV0ZXJzKS4KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbGxvd3MgeW91IHRvIHdvcmsgYXMgaWYgeW91IGFyZSBjcmVhdGluZyBhCi1zdGFuZGFsb25lIEphdmEgYXBwbGljYXRpb24gaW4gYSBKYXZhIHByb2plY3QuPC9wPgotCi08cD5BbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBlbmFibGVzIHlvdSB0byBkbyB0aGUgZm9sbG93aW5nIHRoaW5nczo8L3A+Ci0KLTx1bD4KLTxsaT5EZXZlbG9wIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGNsaWVudCBtb2R1bGU8L2xpPgotCi08bGk+U2V0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yPC9saT4KLQotPGxpPlRlc3QgdGhlIGFwcGxpY2F0aW9uIGNsaWVudDwvbGk+Ci0KLTwvdWw+Ci0KLTxwPkxpa2UgSmF2YSBwcm9qZWN0cywgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4gdGhlCi1yZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzLCBpbmNsdWRpbmcgSmF2YSBjbGFzcwotZmlsZXMuIFdoZW4geW91IGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCwgdGhlIGVudmlyb25tZW50IGlzCi1zZXQgdXAgZm9yIEphdmEgZGV2ZWxvcG1lbnQuIEEgSmF2YSBidWlsZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdAotc28gdGhlIEphdmEgc291cmNlIGNhbiBiZSBpbmNyZW1lbnRhbGx5IGNvbXBpbGVkIGFzIGl0IGlzIHVwZGF0ZWQuCi1UaGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgaGllcmFyY2h5Ci1hbmQgSmF2YSBlbGVtZW50cy4KLVRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCBjdXJyZW50IGFzIGNoYW5nZXMgYXJlIG1hZGUsIGFuZCB0aGUgSmF2YSBidWlsZGVyCi13aWxsIGluY3JlbWVudGFsbHkgY29tcGlsZSB0aGUgcmVzb3VyY2VzIHdpdGhpbiB0aGVzZSBwcm9qZWN0cyBhcyB0aGUgcmVzb3VyY2VzCi1hcmUgdXBkYXRlZC48L3A+Ci0KLTxwPkluIHRoZSB3b3JrYmVuY2gsIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgYnkKLWVudGVycHJpc2UgYXBwbGljYXRpb24gKEVBUikgcHJvamVjdHMuIFdoZW4geW91IGNyZWF0ZSBhbiBhcHBsaWNhdGlvbiBjbGllbnQKLXByb2plY3QsIHlvdSBzcGVjaWZ5IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uCi1jbGllbnQgcHJvamVjdCBiZWxvbmdzLiBBIG1vZHVsZSBlbGVtZW50IGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFwcGxpY2F0aW9uLnhtbDwvc2FtcD4gZGVwbG95bWVudAotZGVzY3JpcHRvciBmb3IgdGhlIEVBUiBwcm9qZWN0LjwvcD4KLQotPHA+QW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaXMgZGVwbG95ZWQgYXMgYSBKQVIgZmlsZS4gVGhpcyBhcHBsaWNhdGlvbgotY2xpZW50IEpBUiBmaWxlIGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBKYXZhIGNsYXNzCi1maWxlcywgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBhbmQgYW55IG1ldGEtZGF0YSBleHRlbnNpb25zCi1hbmQgYmluZGluZ3MgZmlsZXMuPC9wPgotCi08cD5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgYXJlIHR5cGljYWxseSBydW4gb24gbmV0d29ya2VkIGNsaWVudCBzeXN0ZW1zCi1jb25uZWN0ZWQgdG8gSmF2YSBFRSAoRUpCKSBzZXJ2ZXJzLiBUaGUgcG9pbnQgb2YgZW50cnkgZm9yIHRoZSBhcHBsaWNhdGlvbgotY2xpZW50IGlzIGEgSmF2YSBtYWluLWNsYXNzLCB3aGljaCBpcyBzaW1wbHkgYSBKYXZhIGNsYXNzCi10aGF0IGNvbnRhaW5zIGEgc3RhdGljIG1haW4gbWV0aG9kLiBUaGUgY2xhc3MgaXMgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0Ci1maWxlIG9mIHRoZSBjbGllbnQgbW9kdWxlLiA8L3A+Ci0KLTxwPkEgSmF2YSBFRSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgSmF2YSBFRSBzZXJ2aWNlCi0oSk5ESSBuYW1pbmcgc2VydmljZXMsIGRlcGxveW1lbnQgc2VydmljZXMsIHRyYW5zYWN0aW9uIHNlcnZpY2VzLCBhbmQgc2VjdXJpdHkKLXNlcnZpY2VzKSBhbmQgY29tbXVuaWNhdGlvbnMgQVBJcyAoaW50ZXJuZXQgcHJvdG9jb2xzLCBSZW1vdGUgTWV0aG9kIEludm9jYXRpb24KLXByb3RvY29scywgT2JqZWN0IE1hbmFnZW1lbnQgR3JvdXAgcHJvdG9jb2xzLCBNZXNzYWdpbmcgcHJvdG9jb2xzLCBhbmQgZGF0YQotZm9ybWF0cykuPC9wPgotCi08cD5CeSBkZWZhdWx0LCBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBvbmUgZm9sZGVyIG5hbWVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFwcENsaWVudE1vZHVsZTwvc3Bhbj4sCi13aGljaCBjb250YWlucyBib3RoIEphdmEgc291cmNlIGNvZGUgYW5kIGNvbXBpbGVkIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi5jbGFzczwvc2FtcD4gZmlsZXMsCi1hbG9uZyB3aXRoIGFsbCB0aGUgbWV0YS1kYXRhIGZpbGVzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NRVRBLUlORjwvc3Bhbj4gc3ViZm9sZGVyLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBhcHAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiB0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZCBhcyBKQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlIGJ5IHVzaW5nIHRoZSBJbXBvcnQgd2l6YXJkLiI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXJjaC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzE1Y2Q0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXJjaC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjamFyY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+SjJFRSBhcmNoaXRlY3R1cmU8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkNCi1wcm92aWRlcyBhIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SjJFRTxpbmRleHRlcm0+YXJjaGl0ZWN0dXJlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5KYXZhDQotRUU8L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHkgb3V0cHV0Y2xhc3M9ImlkX2NvbmJvZHkiPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4NCi08cD5UaGUgZWNvbm9teSBhbmQgdGVjaG5vbG9neSBvZiB0b2RheSBoYXZlIGludGVuc2lmaWVkIHRoZSBuZWVkIGZvciBmYXN0ZXIsDQotbW9yZSBlZmZpY2llbnQsIGFuZCBsYXJnZXItc2NhbGUgaW5mb3JtYXRpb24gbWFuYWdlbWVudCBzb2x1dGlvbnMuIFRoZSBKMkVFDQotc3BlY2lmaWNhdGlvbiBzYXRpc2ZpZXMgdGhlc2UgY2hhbGxlbmdlcyBieSBwcm92aWRpbmcgYSBwcm9ncmFtbWluZyBtb2RlbA0KLXRoYXQgaW1wcm92ZXMgZGV2ZWxvcG1lbnQgcHJvZHVjdGl2aXR5LCBzdGFuZGFyZGl6ZXMgdGhlIHBsYXRmb3JtIGZvciBob3N0aW5nDQotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIGFuZCBlbnN1cmVzIHBvcnRhYmlsaXR5IG9mIGRldmVsb3BlZCBhcHBsaWNhdGlvbnMNCi13aXRoIGFuIGV4dGVuc2l2ZSB0ZXN0IHN1aXRlLjwvcD4NCi08cD5KMkVFIGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQgb2YgbXVsdGktdGllciBlbnRlcnByaXNlDQotYXBwbGljYXRpb25zLiBBIEoyRUUgYXBwbGljYXRpb24gc3lzdGVtIHR5cGljYWxseSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHRpZXJzOjwvcD4NCi08ZGw+PGRsZW50cnkgb3V0cHV0Y2xhc3M9ImlkX3Byb2plY3RmaWxlc190b3AiPg0KLTxkdD5DbGllbnQgdGllcjwvZHQ+DQotPGRkPkluIHRoZSBjbGllbnQgdGllciwgV2ViIGNvbXBvbmVudHMsIHN1Y2ggYXMgU2VydmxldHMgYW5kIEphdmFTZXJ2ZXIgUGFnZXMNCi0oSlNQcyksIG9yIHN0YW5kYWxvbmUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYXBwbGljYXRpb25zIHByb3ZpZGUgYSBkeW5hbWljIGludGVyZmFjZQ0KLXRvIHRoZSBtaWRkbGUgdGllci48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TWlkZGxlIHRpZXI8L2R0Pg0KLTxkZD5JbiB0aGUgc2VydmVyIHRpZXIsIG9yIG1pZGRsZSB0aWVyLCBlbnRlcnByaXNlIGJlYW5zIGFuZCBXZWIgU2VydmljZXMNCi1lbmNhcHN1bGF0ZSByZXVzYWJsZSwgZGlzdHJpYnV0YWJsZSBidXNpbmVzcyBsb2dpYyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGVzZQ0KLXNlcnZlci10aWVyIGNvbXBvbmVudHMgYXJlIGNvbnRhaW5lZCBvbiBhIEoyRUUgQXBwbGljYXRpb24gU2VydmVyLCB3aGljaCBwcm92aWRlcw0KLXRoZSBwbGF0Zm9ybSBmb3IgdGhlc2UgY29tcG9uZW50cyB0byBwZXJmb3JtIGFjdGlvbnMgYW5kIHN0b3JlIGRhdGEuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVudGVycHJpc2UgZGF0YSB0aWVyPC9kdD4NCi08ZGQ+SW4gdGhlIGRhdGEgdGllciwgdGhlIGVudGVycHJpc2UncyBkYXRhIGlzIHN0b3JlZCBhbmQgcGVyc2lzdGVkLCB0eXBpY2FsbHkNCi1pbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UuPC9kZD4NCi08L2RsZW50cnk+PC9kbD4NCi08cD5KMkVFIGFwcGxpY2F0aW9ucyBhcmUgY29tcHJpc2VkIG9mIGNvbXBvbmVudHMsIGNvbnRhaW5lcnMsIGFuZCBzZXJ2aWNlcy4NCi1Db21wb25lbnRzIGFyZSBhcHBsaWNhdGlvbi1sZXZlbCBjb21wb25lbnRzLiBXZWIgY29tcG9uZW50cywgc3VjaCBhcyBTZXJ2bGV0cw0KLWFuZCBKU1BzLCBwcm92aWRlIGR5bmFtaWMgcmVzcG9uc2VzIHRvIHJlcXVlc3RzIGZyb20gYSBXZWIgcGFnZS4gRUpCIGNvbXBvbmVudHMNCi1jb250YWluIHNlcnZlci1zaWRlIGJ1c2luZXNzIGxvZ2ljIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4gV2ViIGFuZCBFSkINCi1jb21wb25lbnQgY29udGFpbmVycyBob3N0IHNlcnZpY2VzIHRoYXQgc3VwcG9ydCBXZWIgYW5kIEVKQiBtb2R1bGVzLjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKMkVFIGFyY2hpdGVjdHVyZSBhbmQgaXRzIGltcGxpY2l0IHRlY2hub2xvZ2llcywNCi1kb3dubG9hZCBhbmQgcmVhZCB0aGUgPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZG93bmxvYWQuaHRtbCNwbGF0Zm9ybXNwZWMiDQotc2NvcGU9ImV4dGVybmFsIj5KMkVFIDEuNCBTcGVjaWZpY2F0aW9uPGRlc2M+PC9kZXNjPjwveHJlZj4uPC9wPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXJjaC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjFmZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSjJFRSBhcmNoaXRlY3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBwcm92aWRlcyBhIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkoyRUUsIGFyY2hpdGVjdHVyZSwgSmF2YSBFRSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkoyRUUsIGFyY2hpdGVjdHVyZSwgSmF2YSBFRSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amV4cGFwcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjamFyY2giIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5KMkVFIGFyY2hpdGVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2phcmNoIj48YSBuYW1lPSJjamFyY2giPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkoyRUUgYXJjaGl0ZWN0dXJlPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX2NvbmJvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZSBKYXZh4oSiIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkKLXByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0KLTxwPlRoZSBlY29ub215IGFuZCB0ZWNobm9sb2d5IG9mIHRvZGF5IGhhdmUgaW50ZW5zaWZpZWQgdGhlIG5lZWQgZm9yIGZhc3RlciwKLW1vcmUgZWZmaWNpZW50LCBhbmQgbGFyZ2VyLXNjYWxlIGluZm9ybWF0aW9uIG1hbmFnZW1lbnQgc29sdXRpb25zLiBUaGUgSjJFRQotc3BlY2lmaWNhdGlvbiBzYXRpc2ZpZXMgdGhlc2UgY2hhbGxlbmdlcyBieSBwcm92aWRpbmcgYSBwcm9ncmFtbWluZyBtb2RlbAotdGhhdCBpbXByb3ZlcyBkZXZlbG9wbWVudCBwcm9kdWN0aXZpdHksIHN0YW5kYXJkaXplcyB0aGUgcGxhdGZvcm0gZm9yIGhvc3RpbmcKLWVudGVycHJpc2UgYXBwbGljYXRpb25zLCBhbmQgZW5zdXJlcyBwb3J0YWJpbGl0eSBvZiBkZXZlbG9wZWQgYXBwbGljYXRpb25zCi13aXRoIGFuIGV4dGVuc2l2ZSB0ZXN0IHN1aXRlLjwvcD4KLQotPHA+SjJFRSBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IG9mIG11bHRpLXRpZXIgZW50ZXJwcmlzZQotYXBwbGljYXRpb25zLiBBIEoyRUUgYXBwbGljYXRpb24gc3lzdGVtIHR5cGljYWxseSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHRpZXJzOjwvcD4KLQotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkNsaWVudCB0aWVyPC9kdD4KLQotPGRkPkluIHRoZSBjbGllbnQgdGllciwgV2ViIGNvbXBvbmVudHMsIHN1Y2ggYXMgU2VydmxldHMgYW5kIEphdmFTZXJ2ZXIgUGFnZXMKLShKU1BzKSwgb3Igc3RhbmRhbG9uZSBKYXZhIGFwcGxpY2F0aW9ucyBwcm92aWRlIGEgZHluYW1pYyBpbnRlcmZhY2UKLXRvIHRoZSBtaWRkbGUgdGllci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NaWRkbGUgdGllcjwvZHQ+Ci0KLTxkZD5JbiB0aGUgc2VydmVyIHRpZXIsIG9yIG1pZGRsZSB0aWVyLCBlbnRlcnByaXNlIGJlYW5zIGFuZCBXZWIgU2VydmljZXMKLWVuY2Fwc3VsYXRlIHJldXNhYmxlLCBkaXN0cmlidXRhYmxlIGJ1c2luZXNzIGxvZ2ljIGZvciB0aGUgYXBwbGljYXRpb24uIFRoZXNlCi1zZXJ2ZXItdGllciBjb21wb25lbnRzIGFyZSBjb250YWluZWQgb24gYSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlciwgd2hpY2ggcHJvdmlkZXMKLXRoZSBwbGF0Zm9ybSBmb3IgdGhlc2UgY29tcG9uZW50cyB0byBwZXJmb3JtIGFjdGlvbnMgYW5kIHN0b3JlIGRhdGEuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+RW50ZXJwcmlzZSBkYXRhIHRpZXI8L2R0PgotCi08ZGQ+SW4gdGhlIGRhdGEgdGllciwgdGhlIGVudGVycHJpc2UncyBkYXRhIGlzIHN0b3JlZCBhbmQgcGVyc2lzdGVkLCB0eXBpY2FsbHkKLWluIGEgcmVsYXRpb25hbCBkYXRhYmFzZS48L2RkPgotCi08L2RsPgotCi08cD5KMkVFIGFwcGxpY2F0aW9ucyBhcmUgY29tcHJpc2VkIG9mIGNvbXBvbmVudHMsIGNvbnRhaW5lcnMsIGFuZCBzZXJ2aWNlcy4KLUNvbXBvbmVudHMgYXJlIGFwcGxpY2F0aW9uLWxldmVsIGNvbXBvbmVudHMuIFdlYiBjb21wb25lbnRzLCBzdWNoIGFzIFNlcnZsZXRzCi1hbmQgSlNQcywgcHJvdmlkZSBkeW5hbWljIHJlc3BvbnNlcyB0byByZXF1ZXN0cyBmcm9tIGEgV2ViIHBhZ2UuIEVKQiBjb21wb25lbnRzCi1jb250YWluIHNlcnZlci1zaWRlIGJ1c2luZXNzIGxvZ2ljIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4gV2ViIGFuZCBFSkIKLWNvbXBvbmVudCBjb250YWluZXJzIGhvc3Qgc2VydmljZXMgdGhhdCBzdXBwb3J0IFdlYiBhbmQgRUpCIG1vZHVsZXMuPC9wPgotCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKMkVFIGFyY2hpdGVjdHVyZSBhbmQgaXRzIGltcGxpY2l0IHRlY2hub2xvZ2llcywKLWRvd25sb2FkIGFuZCByZWFkIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZG93bmxvYWQuaHRtbCNwbGF0Zm9ybXNwZWMiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iIj5KMkVFIDEuNCBTcGVjaWZpY2F0aW9uPC9hPi48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiB0aXRsZT0iQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRpZXMgdG9nZXRoZXIgdGhlIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiIHRpdGxlPSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbSBhIHNlcnZlcidzIHRvb2xzLiI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIiB0aXRsZT0iVXNpbmcgdGhlIHdpemFyZCB0byBjcmVhdGUgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFsbG93cyB5b3UgdG8gcGFja2FnZSBtYW55IHdlYiBhcHBsaWNhdGlvbnMgYW5kIG1vZHVsZXMgaW4gYSBwcm9qZWN0IGFuZCBkZXBsb3kgdGhlc2UgbW9kdWxlcyBhcyBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqaW1wZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGFyZSBkZXBsb3llZCBpbnRvIEVBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGJ5IGltcG9ydGluZyBpdCBmcm9tIGEgZGVwbG95ZWQgRUFSIGZpbGUuIj5JbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIj5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgYXMgSkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC4iPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phdmFlZTUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXZhZWU1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWUxNDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phdmFlZTUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2phdmFlZTUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+RGV2ZWxvcGluZyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1IEFwcGxpY2F0aW9uczwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgNSBwcm9ncmFtbWluZyBtb2RlbCBzaW1wbGlmaWVzIHRoZQ0KLXByb2Nlc3Mgb2YgY3JlYXRpbmcgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYXBwbGljYXRpb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIDU8aW5kZXh0ZXJtPk92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5IG91dHB1dGNsYXNzPSJpZF9jb25ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHAgaWQ9ImFib3V0ZmFjZXQiPkluIHRoZSBKYXZhIEVFIDUgc3BlY2lmaWNhdGlvbnMsIHByb2dyYW1taW5nIHJlcXVpcmVtZW50cw0KLWhhdmUgYmVlbiBzdHJlYW1saW5lZCwgYW5kIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZSBvcHRpb25hbC4gSW5zdGVhZCwNCi15b3UgY2FuIHNwZWNpZnkgbWFueSBkZXRhaWxzIG9mIGFzc2VtYmx5IGFuZCBkZXBsb3ltZW50IHdpdGggSmF2YSBhbm5vdGF0aW9ucy4NCi1KYXZhIEVFIDUgd2lsbCBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGluIG1hbnkgc2l0dWF0aW9ucyBzbyBleHBsaWNpdGx5IHNwZWNpZmljYXRpb24NCi1vZiB0aGVzZSB2YWx1ZXMgYXJlIG5vdCByZXF1aXJlZC48L3A+DQotPHA+Q29kZSB2YWxpZGF0aW9uLCBjb250ZW50IGFzc2lzdGFuY2UsIFF1aWNrIEZpeGVzLCBhbmQgcmVmYWN0b3Jpbmcgc2ltcGxpZnkNCi13b3JraW5nIHdpdGggeW91ciBjb2RlLiBDb2RlIHZhbGlkYXRvcnMgY2hlY2sgeW91ciBwcm9qZWN0cyBmb3IgZXJyb3JzLiBXaGVuDQotYW4gZXJyb3IgaXMgZm91bmQsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGl0IGluIHRoZSBQcm9ibGVtcyB2aWV3IGluIHRoZQ0KLXByb2R1Y3Qgd29ya2JlbmNoIHRvIGdvIHRvIHRoZSBlcnJvciBsb2NhdGlvbi4gRm9yIHNvbWUgZXJyb3IgdHlwZXMsIHlvdSBjYW4NCi11c2UgYSBRdWljayBGaXggdG8gY29ycmVjdCB0aGUgZXJyb3IgYXV0b21hdGljYWxseS4gRm9yIGJvdGggPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlDQotYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBhbm5vdGF0aW9ucywNCi15b3UgY2FuIHJlbHkgb24gY29udGVudCBhc3Npc3RhbmNlIHRvIHNpbXBsaWZ5IHlvdXIgcHJvZ3JhbW1pbmcgdGFzay4gV2hlbg0KLXlvdSByZWZhY3RvciBzb3VyY2UgY29kZSwgdGhlIHRvb2xzIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLjwvcD4NCi08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1LjAsIHNlZSB0aGUgb2ZmaWNpYWwgc3BlY2lmaWNhdGlvbjogPHhyZWYNCi1ocmVmPSJodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTI0NCIgc2NvcGU9ImV4dGVybmFsIj5KU1IgMjQ0OiA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBQbGF0Zm9ybSwNCi1FbnRlcnByaXNlIEVkaXRpb24gNSAoPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgNSkgU3BlY2lmaWNhdGlvbjwveHJlZj48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phdmFlZTUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXZhZWU1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGMyYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phdmFlZTUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3BpbmcgSmF2YSBFRSA1IEFwcGxpY2F0aW9ucyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgSmF2YSBFRSA1IHByb2dyYW1taW5nIG1vZGVsIHNpbXBsaWZpZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgSmF2YSBhcHBsaWNhdGlvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBKYXZhIEVFIDUgcHJvZ3JhbW1pbmcgbW9kZWwgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBKYXZhIGFwcGxpY2F0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVudGVycHJpc2UgRWRpdGlvbiA1LCBPdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIDUsIE92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3BoLWoyZWVhcHAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqZWU1b3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Nhbm5vdGF0aW9ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNqYXZhZWU1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RGV2ZWxvcGluZyBKYXZhIEVFIDUgQXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjamF2YWVlNSI+PGEgbmFtZT0iY2phdmFlZTUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkRldmVsb3BpbmcgSmF2YSBFRSA1IEFwcGxpY2F0aW9uczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9jb25ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGUgSmF2YeKEoiBFRSA1IHByb2dyYW1taW5nIG1vZGVsIHNpbXBsaWZpZXMgdGhlCi1wcm9jZXNzIG9mIGNyZWF0aW5nIEphdmEgYXBwbGljYXRpb25zLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHAgaWQ9ImNqYXZhZWU1X19hYm91dGZhY2V0Ij48YSBuYW1lPSJjamF2YWVlNV9fYWJvdXRmYWNldCI+PCEtLSAtLT48L2E+SW4gdGhlIEphdmEgRUUgNSBzcGVjaWZpY2F0aW9ucywgcHJvZ3JhbW1pbmcgcmVxdWlyZW1lbnRzCi1oYXZlIGJlZW4gc3RyZWFtbGluZWQsIGFuZCBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUgb3B0aW9uYWwuIEluc3RlYWQsCi15b3UgY2FuIHNwZWNpZnkgbWFueSBkZXRhaWxzIG9mIGFzc2VtYmx5IGFuZCBkZXBsb3ltZW50IHdpdGggSmF2YSBhbm5vdGF0aW9ucy4KLUphdmEgRUUgNSB3aWxsIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgaW4gbWFueSBzaXR1YXRpb25zIHNvIGV4cGxpY2l0bHkgc3BlY2lmaWNhdGlvbgotb2YgdGhlc2UgdmFsdWVzIGFyZSBub3QgcmVxdWlyZWQuPC9wPgotCi08cD5Db2RlIHZhbGlkYXRpb24sIGNvbnRlbnQgYXNzaXN0YW5jZSwgUXVpY2sgRml4ZXMsIGFuZCByZWZhY3RvcmluZyBzaW1wbGlmeQotd29ya2luZyB3aXRoIHlvdXIgY29kZS4gQ29kZSB2YWxpZGF0b3JzIGNoZWNrIHlvdXIgcHJvamVjdHMgZm9yIGVycm9ycy4gV2hlbgotYW4gZXJyb3IgaXMgZm91bmQsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGl0IGluIHRoZSBQcm9ibGVtcyB2aWV3IGluIHRoZQotcHJvZHVjdCB3b3JrYmVuY2ggdG8gZ28gdG8gdGhlIGVycm9yIGxvY2F0aW9uLiBGb3Igc29tZSBlcnJvciB0eXBlcywgeW91IGNhbgotdXNlIGEgUXVpY2sgRml4IHRvIGNvcnJlY3QgdGhlIGVycm9yIGF1dG9tYXRpY2FsbHkuIEZvciBib3RoIEphdmEgc291cmNlCi1hbmQgSmF2YSBhbm5vdGF0aW9ucywKLXlvdSBjYW4gcmVseSBvbiBjb250ZW50IGFzc2lzdGFuY2UgdG8gc2ltcGxpZnkgeW91ciBwcm9ncmFtbWluZyB0YXNrLiBXaGVuCi15b3UgcmVmYWN0b3Igc291cmNlIGNvZGUsIHRoZSB0b29scyBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YS48L3A+Ci0KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIEphdmEgRUUgNS4wLCBzZWUgdGhlIG9mZmljaWFsIHNwZWNpZmljYXRpb246IDxhIGhyZWY9Imh0dHA6Ly9qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjQ0IiB0YXJnZXQ9Il9ibGFuayI+SlNSIDI0NDogSmF2YSBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIDUgKEphdmEgRUUgNSkgU3BlY2lmaWNhdGlvbjwvYT48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWU1b3ZlcnZpZXcuaHRtbCI+SmF2YSBFRSA1OiBPdmVydmlldzwvYT48L3N0cm9uZz48YnIgLz4KLVVzaW5nIHRoZSBKYXZhIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpIGFyY2hpdGVjdHVyZSwgeW91IGNhbiBidWlsZCBkaXN0cmlidXRlZCBXZWIgYW5kIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiBUaGlzIGFyY2hpdGVjdHVyZSBoZWxwcyB5b3UgZm9jdXMgb24gcHJlc2VudGF0aW9uIGFuZCBhcHBsaWNhdGlvbiBpc3N1ZXMsIHJhdGhlciB0aGFuIG9uIHN5c3RlbXMgaXNzdWVzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9jYW5ub3RhdGlvbnMuaHRtbCI+SmF2YSBFRSA1IHN1cHBvcnQgZm9yIGFubm90YXRpb25zPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIGdvYWwgb2YgSmF2YSBFRSA1IHBsYXRmb3JtIGRldmVsb3BtZW50IGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgYXJ0aWZhY3RzIHRoYXQgeW91IGhhdmUgdG8gY3JlYXRlIGFuZCBtYWludGFpbiwgdGhlcmVieSBzaW1wbGlmeWluZyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gSmF2YSBFRSA1IHN1cHBvcnRzIHRoZSBpbmplY3Rpb24gb2YgYW5ub3RhdGlvbnMgaW50byB5b3VyIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHlvdSBjYW4gZW1iZWQgcmVzb3VyY2VzLCBkZXBlbmRlbmNpZXMsIHNlcnZpY2VzLCBhbmQgbGlmZS1jeWNsZSBub3RpZmljYXRpb25zIGluIHlvdXIgc291cmNlIGNvZGUsIHdpdGhvdXQgaGF2aW5nIHRvIG1haW50YWluIHRoZXNlIGFydGlmYWN0cyBlbHNld2hlcmUuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtajJlZWFwcC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGRlYWwgd2l0aCB0aGUgSmF2YSBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpLiI+SmF2YSBFRSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pjaXJjbGUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqY2lyY2xlLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGFiNTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pjaXJjbGUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2pjaXJjbGUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+Q3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPkEgY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvcg0KLW1vcmUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMNCi1hcmUgaW1wb3J0ZWQgZnJvbSBvdXRzaWRlIHRoZSBXb3JrYmVuY2guPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZGVwZW5kZW5jaWVzPGluZGV4dGVybT5jeWNsZXMgYmV0d2VlbiBtb2R1bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KYXZhIEVFPGluZGV4dGVybT5jeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5wcm9qZWN0czxpbmRleHRlcm0+Y3ljbGljYWwgZGVwZW5kZW5jaWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5IG91dHB1dGNsYXNzPSJpZF9jb25ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHA+V2hlbiBhIGN5Y2xlIGV4aXN0cyBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwNCi10aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkZXINCi1jYW5ub3QgYWNjdXJhdGVseSBjb21wdXRlIHRoZSBidWlsZCBvcmRlciBvZiB0aGUgcHJvamVjdHMuIEZ1bGwgYnVpbGRzIGZhaWwNCi11bmRlciB0aGVzZSBjb25kaXRpb25zLCBvciByZXF1aXJlIHNldmVyYWwgaW52b2NhdGlvbnMuPC9wPg0KLTxwPlRoZXJlZm9yZSwgdGhlIGJlc3QgcHJhY3RpY2UgaXMgdG8gY29tcG9uZW50aXplIHlvdXIgcHJvamVjdHMgb3IgbW9kdWxlcy4NCi1UaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB5b3VyIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnVuY3Rpb24gYXMgYSB0cmVlIGluc3RlYWQNCi1vZiBhIGN5Y2xlIGRpYWdyYW0uIFRoaXMgcHJhY3RpY2UgaGFzIHRoZSBhZGRlZCBiZW5lZml0IG9mIHByb2R1Y2luZyBhIGJldHRlcg0KLWZhY3RvcmVkIGFuZCBsYXllcmVkIGFwcGxpY2F0aW9uLjwvcD4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamNpcmNsZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pjaXJjbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMmZlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamNpcmNsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBtb3N0IGNvbW1vbmx5IG9jY3VycyB3aGVuIHByb2plY3RzIGFyZSBpbXBvcnRlZCBmcm9tIG91dHNpZGUgdGhlIFdvcmtiZW5jaC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjeWNsaWNhbCBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG9yIG1vcmUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMgYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUgV29ya2JlbmNoLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVuY2llcywgY3ljbGVzIGJldHdlZW4gbW9kdWxlcywgSmF2YSBFRSwgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gbW9kdWxlcywgcHJvamVjdHMsIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVuY2llcywgY3ljbGVzIGJldHdlZW4gbW9kdWxlcywgSmF2YSBFRSwgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gbW9kdWxlcywgcHJvamVjdHMsIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjaXJjbGViLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2pjaXJjbGUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKYXZhIEVFIG1vZHVsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqY2lyY2xlIj48YSBuYW1lPSJjamNpcmNsZSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+Q3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX2NvbmJvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkEgY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvcgotbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gbW9zdCBjb21tb25seSBvY2N1cnMgd2hlbiBwcm9qZWN0cwotYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUgV29ya2JlbmNoLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHA+V2hlbiBhIGN5Y2xlIGV4aXN0cyBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwKLXRoZSBKYXZh4oSiIGJ1aWxkZXIKLWNhbm5vdCBhY2N1cmF0ZWx5IGNvbXB1dGUgdGhlIGJ1aWxkIG9yZGVyIG9mIHRoZSBwcm9qZWN0cy4gRnVsbCBidWlsZHMgZmFpbAotdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgb3IgcmVxdWlyZSBzZXZlcmFsIGludm9jYXRpb25zLjwvcD4KLQotPHA+VGhlcmVmb3JlLCB0aGUgYmVzdCBwcmFjdGljZSBpcyB0byBjb21wb25lbnRpemUgeW91ciBwcm9qZWN0cyBvciBtb2R1bGVzLgotVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgeW91ciBtb2R1bGUgZGVwZW5kZW5jaWVzIGZ1bmN0aW9uIGFzIGEgdHJlZSBpbnN0ZWFkCi1vZiBhIGN5Y2xlIGRpYWdyYW0uIFRoaXMgcHJhY3RpY2UgaGFzIHRoZSBhZGRlZCBiZW5lZml0IG9mIHByb2R1Y2luZyBhIGJldHRlcgotZmFjdG9yZWQgYW5kIGxheWVyZWQgYXBwbGljYXRpb24uPC9wPgotCi08cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiB0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLiI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amNpcmNsZWIuaHRtbCIgdGl0bGU9IllvdSBjYW4gcmVzb2x2ZSBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkLiI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWFycHJvai5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plYXJwcm9qLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTAwNTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plYXJwcm9qLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNqZWFycHJvaiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0aWVzDQotdG9nZXRoZXIgdGhlIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT5hcnRpZmFjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkoyRUU8aW5kZXh0ZXJtPmVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5wcm9qZWN0czxpbmRleHRlcm0+ZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHkgb3V0cHV0Y2xhc3M9ImlkX2NvbmJvZHkiPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4NCi08cD5BbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgY29udGFpbnMgYSBzZXQgb2YgcmVmZXJlbmNlcyB0byBvdGhlcg0KLUoyRUUgbW9kdWxlcyBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdHMgdGhhdCBhcmUgY29tYmluZWQgdG8gY29tcG9zZSBhbiBFQVIgZmlsZS4NCi1UaGVzZSBwcm9qZWN0cyBjYW4gYmUgV2ViIG1vZHVsZXMsIEVKQiBtb2R1bGVzLCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywNCi1jb25uZWN0b3IgbW9kdWxlcywgZ2VuZXJhbCB1dGlsaXR5IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEpBUiBmaWxlcywgYW5kIEVKQiBjbGllbnQgSkFSIGZpbGVzLg0KLUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgY3JlYXRlZCBpbiB0aGUgd29ya2JlbmNoIGluY2x1ZGUgYSBkZXBsb3ltZW50DQotZGVzY3JpcHRvciwgYXMgd2VsbCBhcyBmaWxlcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEoyRUUgbW9kdWxlcyB0aGF0IGFyZQ0KLWRlZmluZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci48L3A+DQotPHA+V2hlbiBhIEoyRUUgbW9kdWxlIHByb2plY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRlcnByaXNlDQotYXBwbGljYXRpb24gcHJvamVjdC4gVGhlIHByb2plY3Qgd2l6YXJkcyBhaWQgdGhpcyBieSBhbGxvd2luZyB5b3UgdG8gc3BlY2lmeQ0KLWEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cw0KLWFyZSBleHBvcnRlZCBhcyBFQVIgKGVudGVycHJpc2UgYXJjaGl2ZSkgZmlsZXMgdGhhdCBpbmNsdWRlIGFsbCBmaWxlcyBkZWZpbmVkDQotaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBhcyB3ZWxsIGFzIHRoZSBhcHByb3ByaWF0ZSBhcmNoaXZlIGZpbGUNCi1mb3IgZWFjaCBKMkVFIG1vZHVsZSBvciB1dGlsaXR5IEpBUiBwcm9qZWN0IGRlZmluZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwNCi1zdWNoIGFzIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIGFuZCBFSkIgSkFSIGZpbGVzLjwvcD4NCi08cD5BbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGNhbiBjb250YWluIHV0aWxpdHkgSkFSIGZpbGVzIHRoYXQgYXJlIHRvIGJlDQotdXNlZCBieSB0aGUgY29udGFpbmVkIG1vZHVsZXMuIFRoaXMgYWxsb3dzIHNoYXJpbmcgb2YgY29kZSBhdCB0aGUgYXBwbGljYXRpb24NCi1sZXZlbCBieSBtdWx0aXBsZSBXZWIsIEVKQiwgb3IgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMuIFRoZXNlIEpBUiBmaWxlcw0KLWFyZSBjb21tb25seSByZWZlcnJlZCB0byBhcyB1dGlsaXR5IEpBUiBmaWxlcy4gVGhlIHV0aWxpdHkgSkFSIGZpbGVzIGRlZmluZWQNCi1mb3IgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNhbiBiZSBhY3R1YWwgSkFSIGZpbGVzIGluIHRoZSBwcm9qZWN0LA0KLW9yIHlvdSBjYW4gaW5jbHVkZSB1dGlsaXR5IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3RzIHRoYXQgYXJlIGRlc2lnbmF0ZWQgdG8gYmVjb21lDQotdGhlIHV0aWxpdHkgSkFSIGZpbGVzIGR1cmluZyBhc3NlbWJseSBhbmQgZGVwbG95bWVudC48L3A+DQotPHA+VG8gc3RhcnQgZGV2ZWxvcGluZyBKMkVFIGFwcGxpY2F0aW9ucywgeW91IHR5cGljYWxseSBmaXJzdCBjcmVhdGUgYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uIHByb2plY3QgdG8gdGllIHRvZ2V0aGVyIHlvdXIgV2ViLCBFSkIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQNCi1tb2R1bGVzLiBUaGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGlzIHVzZWQgdG8gY29tcG9zZSBhbiBlbnRpcmUgYXBwbGljYXRpb24NCi1mcm9tIHRoZSB2YXJpb3VzIG1vZHVsZXMuIFNpbmNlIG5vIHNvdXJjZSBjb2RlIGlzIGJ1aWx0IGRpcmVjdGx5IGludG8gYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uLCB0aGVzZSBwcm9qZWN0cyBhcmUgbm90IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3RzLCBhbmQgdGhleSBhcmUgbm90IGNvbXBpbGVkDQotYnkgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkZXIuPC9wPg0KLTxwPldoZW4geW91IGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdXNpbmcgdGhlIHdvcmtiZW5jaCwNCi10aGUgZm9sbG93aW5nIGtleSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkOjxkbD48ZGxlbnRyeSBvdXRwdXRjbGFzcz0iaWRfcHJvamVjdGZpbGVzX3RvcCI+DQotPGR0Pk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbDwvZHQ+DQotPGRkPlRoaXMgZmlsZSBpcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwNCi1hcyBkZWZpbmVkIGluIHRoZSBKMkVFIHNwZWNpZmljYXRpb24sIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGFzc29jaWF0aW5nDQotSjJFRSBtb2R1bGVzIHRvIGEgc3BlY2lmaWMgRUFSIGZpbGUuIFRoaXMgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSA8dWljb250cm9sPk1FVEEtSU5GPC91aWNvbnRyb2w+IGZvbGRlci48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+LnNldHRpbmdzLy5jb21wb25lbnQ8L2R0Pg0KLTxkZD5UaGlzIGZpbGUgbWF0Y2hlcyB0aGUgbG9jYXRpb24gb2YgZWFjaCBtb2R1bGUncyBzb3VyY2UgY29kZSB0byB0aGUgbG9jYXRpb24NCi1vZiB0aGUgbW9kdWxlIGF0IGRlcGxveW1lbnQuIEZvciBlYWNoIG1vZHVsZSBpbmNsdWRlZCBmb3IgZGVwbG95bWVudCB3aXRoDQotdGhlIEVBUiBmaWxlLCB0aGUgLmNvbXBvbmVudCBmaWxlIGxpc3RzIGl0cyBzb3VyY2UgcGF0aCBhbmQgZGVwbG95bWVudCBwYXRoLg0KLVRoaXMgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSA8dWljb250cm9sPi5zZXR0aW5nczwvdWljb250cm9sPiBmb2xkZXIuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWw8L2R0Pg0KLTxkZD5UaGlzIGZpbGUgbGlzdHMgdGhlIGZhY2V0cyBvZiB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBTZWUgPHhyZWYNCi1ocmVmPSJjZmFjZXRzLmRpdGEiPjwveHJlZj4uIFRoaXMgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSA8dWljb250cm9sPi5zZXR0aW5nczwvdWljb250cm9sPiBmb2xkZXIuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnkgb3V0cHV0Y2xhc3M9ImlkX3Byb2plY3RmaWxlc19ib3R0b20iPg0KLTxkdD4ucHJvamVjdDwvZHQ+DQotPGRkPlRoaXMgaXMgYSB3b3JrYmVuY2ggYXJ0aWZhY3QsIHRoZSBzdGFuZGFyZCBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plYXJwcm9qLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVhcnByb2ouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2NjEzOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVhcnByb2ouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0aWVzIHRvZ2V0aGVyIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gZGVwbG95IGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgcHJvamVjdHMsIGFydGlmYWN0cywgSjJFRSwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgcHJvamVjdHMsIGFydGlmYWN0cywgSjJFRSwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anJhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2ZhY2V0cy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNqZWFycHJvaiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqZWFycHJvaiI+PGEgbmFtZT0iY2plYXJwcm9qIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX2NvbmJvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0aWVzCi10b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0KLTxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyBhIHNldCBvZiByZWZlcmVuY2VzIHRvIG90aGVyCi1KMkVFIG1vZHVsZXMgYW5kIEphdmHihKIgcHJvamVjdHMgdGhhdCBhcmUgY29tYmluZWQgdG8gY29tcG9zZSBhbiBFQVIgZmlsZS4KLVRoZXNlIHByb2plY3RzIGNhbiBiZSBXZWIgbW9kdWxlcywgRUpCIG1vZHVsZXMsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLAotY29ubmVjdG9yIG1vZHVsZXMsIGdlbmVyYWwgdXRpbGl0eSBKYXZhIEpBUiBmaWxlcywgYW5kIEVKQiBjbGllbnQgSkFSIGZpbGVzLgotRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBjcmVhdGVkIGluIHRoZSB3b3JrYmVuY2ggaW5jbHVkZSBhIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IsIGFzIHdlbGwgYXMgZmlsZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBKMkVFIG1vZHVsZXMgdGhhdCBhcmUKLWRlZmluZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci48L3A+Ci0KLTxwPldoZW4gYSBKMkVFIG1vZHVsZSBwcm9qZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdC4gVGhlIHByb2plY3Qgd2l6YXJkcyBhaWQgdGhpcyBieSBhbGxvd2luZyB5b3UgdG8gc3BlY2lmeQotYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzCi1hcmUgZXhwb3J0ZWQgYXMgRUFSIChlbnRlcnByaXNlIGFyY2hpdmUpIGZpbGVzIHRoYXQgaW5jbHVkZSBhbGwgZmlsZXMgZGVmaW5lZAotaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBhcyB3ZWxsIGFzIHRoZSBhcHByb3ByaWF0ZSBhcmNoaXZlIGZpbGUKLWZvciBlYWNoIEoyRUUgbW9kdWxlIG9yIHV0aWxpdHkgSkFSIHByb2plY3QgZGVmaW5lZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLAotc3VjaCBhcyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyBhbmQgRUpCIEpBUiBmaWxlcy48L3A+Ci0KLTxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gY2FuIGNvbnRhaW4gdXRpbGl0eSBKQVIgZmlsZXMgdGhhdCBhcmUgdG8gYmUKLXVzZWQgYnkgdGhlIGNvbnRhaW5lZCBtb2R1bGVzLiBUaGlzIGFsbG93cyBzaGFyaW5nIG9mIGNvZGUgYXQgdGhlIGFwcGxpY2F0aW9uCi1sZXZlbCBieSBtdWx0aXBsZSBXZWIsIEVKQiwgb3IgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMuIFRoZXNlIEpBUiBmaWxlcwotYXJlIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIHV0aWxpdHkgSkFSIGZpbGVzLiBUaGUgdXRpbGl0eSBKQVIgZmlsZXMgZGVmaW5lZAotZm9yIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjYW4gYmUgYWN0dWFsIEpBUiBmaWxlcyBpbiB0aGUgcHJvamVjdCwKLW9yIHlvdSBjYW4gaW5jbHVkZSB1dGlsaXR5IEphdmEgcHJvamVjdHMgdGhhdCBhcmUgZGVzaWduYXRlZCB0byBiZWNvbWUKLXRoZSB1dGlsaXR5IEpBUiBmaWxlcyBkdXJpbmcgYXNzZW1ibHkgYW5kIGRlcGxveW1lbnQuPC9wPgotCi08cD5UbyBzdGFydCBkZXZlbG9waW5nIEoyRUUgYXBwbGljYXRpb25zLCB5b3UgdHlwaWNhbGx5IGZpcnN0IGNyZWF0ZSBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBwcm9qZWN0IHRvIHRpZSB0b2dldGhlciB5b3VyIFdlYiwgRUpCLCBhbmQgYXBwbGljYXRpb24gY2xpZW50Ci1tb2R1bGVzLiBUaGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGlzIHVzZWQgdG8gY29tcG9zZSBhbiBlbnRpcmUgYXBwbGljYXRpb24KLWZyb20gdGhlIHZhcmlvdXMgbW9kdWxlcy4gU2luY2Ugbm8gc291cmNlIGNvZGUgaXMgYnVpbHQgZGlyZWN0bHkgaW50byBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiwgdGhlc2UgcHJvamVjdHMgYXJlIG5vdCBKYXZhIHByb2plY3RzLCBhbmQgdGhleSBhcmUgbm90IGNvbXBpbGVkCi1ieSB0aGUgSmF2YSBidWlsZGVyLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB1c2luZyB0aGUgd29ya2JlbmNoLAotdGhlIGZvbGxvd2luZyBrZXkgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZDo8ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+TUVUQS1JTkYvYXBwbGljYXRpb24ueG1sPC9kdD4KLQotPGRkPlRoaXMgZmlsZSBpcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwKLWFzIGRlZmluZWQgaW4gdGhlIEoyRUUgc3BlY2lmaWNhdGlvbiwgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgYXNzb2NpYXRpbmcKLUoyRUUgbW9kdWxlcyB0byBhIHNwZWNpZmljIEVBUiBmaWxlLiBUaGlzIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TUVUQS1JTkY8L3NwYW4+IGZvbGRlci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4uc2V0dGluZ3MvLmNvbXBvbmVudDwvZHQ+Ci0KLTxkZD5UaGlzIGZpbGUgbWF0Y2hlcyB0aGUgbG9jYXRpb24gb2YgZWFjaCBtb2R1bGUncyBzb3VyY2UgY29kZSB0byB0aGUgbG9jYXRpb24KLW9mIHRoZSBtb2R1bGUgYXQgZGVwbG95bWVudC4gRm9yIGVhY2ggbW9kdWxlIGluY2x1ZGVkIGZvciBkZXBsb3ltZW50IHdpdGgKLXRoZSBFQVIgZmlsZSwgdGhlIC5jb21wb25lbnQgZmlsZSBsaXN0cyBpdHMgc291cmNlIHBhdGggYW5kIGRlcGxveW1lbnQgcGF0aC4KLVRoaXMgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj4uc2V0dGluZ3M8L3NwYW4+IGZvbGRlci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sPC9kdD4KLQotPGRkPlRoaXMgZmlsZSBsaXN0cyB0aGUgZmFjZXRzIG9mIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIFNlZSA8YSBocmVmPSJjZmFjZXRzLmh0bWwiIHRpdGxlPSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzJiMxMDtmb3IgSmF2YSBFRSBwcm9qZWN0cyBhbmQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLiAiPlByb2plY3QgZmFjZXRzPC9hPi4gVGhpcyBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPi5zZXR0aW5nczwvc3Bhbj4gZm9sZGVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPi5wcm9qZWN0PC9kdD4KLQotPGRkPlRoaXMgaXMgYSB3b3JrYmVuY2ggYXJ0aWZhY3QsIHRoZSBzdGFuZGFyZCBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUuPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIHRpdGxlPSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzIGZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIj5Qcm9qZWN0IGZhY2V0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGplYXIuaHRtbCIgdGl0bGU9IlVzaW5nIHRoZSB3aXphcmQgdG8gY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbGxvd3MgeW91IHRvIHBhY2thZ2UgbWFueSB3ZWIgYXBwbGljYXRpb25zIGFuZCBtb2R1bGVzIGluIGEgcHJvamVjdCBhbmQgZGVwbG95IHRoZXNlIG1vZHVsZXMgYXMgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiB0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLiI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cGVhci5odG1sIiB0aXRsZT0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgYXJlIGRlcGxveWVkIGluIHRoZSBmb3JtIG9mIGFuIEVBUiBmaWxlLiBVc2UgdGhlIEV4cG9ydCB3aXphcmQgdG8gZXhwb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuIEVBUiBmaWxlIGZvciBkZXBsb3ltZW50LiI+RXhwb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gaW50byBhbiBFQVIgZmlsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqYXBwcHJvai5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anJhci5odG1sIiB0aXRsZT0iQSBjb25uZWN0b3IgaXMgYSBKMkVFIHN0YW5kYXJkIGV4dGVuc2lvbiBtZWNoYW5pc20gZm9yIGNvbnRhaW5lcnMgdG8gcHJvdmlkZSBjb25uZWN0aXZpdHkgdG8gZW50ZXJwcmlzZSBpbmZvcm1hdGlvbiBzeXN0ZW1zIChFSVNzKS4iPkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plZTVvdmVydmlldy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plZTVvdmVydmlldy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDYyYjE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWU1b3ZlcnZpZXcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2phdmFlZTUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgNTogT3ZlcnZpZXc8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VXNpbmcgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFKQ0KLWFyY2hpdGVjdHVyZSwgeW91IGNhbiBidWlsZCBkaXN0cmlidXRlZCBXZWIgYW5kIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiBUaGlzDQotYXJjaGl0ZWN0dXJlIGhlbHBzIHlvdSBmb2N1cyBvbiBwcmVzZW50YXRpb24gYW5kIGFwcGxpY2F0aW9uIGlzc3VlcywgcmF0aGVyDQotdGhhbiBvbiBzeXN0ZW1zIGlzc3Vlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5KYXZhIEVFIDU8L2luZGV4dGVybT48aW5kZXh0ZXJtPk9lcnZpZXc8L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+WW91IGNhbiB1c2UgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIDUgdG9vbHMgYW5kIGZlYXR1cmVzIHRvIGNyZWF0ZSBhcHBsaWNhdGlvbnMNCi10aGF0IGFyZSBzdHJ1Y3R1cmVkIGFyb3VuZCBtb2R1bGVzIHdpdGggZGlmZmVyZW50IHB1cnBvc2VzLCBzdWNoIGFzIFdlYiBzaXRlcw0KLWFuZCBFbnRlcnByaXNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YUJlYW5zIj5KYXZhQmVhbnM8L3RtPiAoRUpCKSBhcHBsaWNhdGlvbnMuIFdoZW4geW91IHVzZSBFSkINCi0zLjAgY29tcG9uZW50cywgeW91IGNhbiBjcmVhdGUgYSBkaXN0cmlidXRlZCwgc2VjdXJlIGFwcGxpY2F0aW9uIHdpdGggdHJhbnNhY3Rpb25hbA0KLXN1cHBvcnQuIFdoZW4geW91IGRldmVsb3AgYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIHBlcnNpc3RlbnQgZGF0YSwgeW91IGNhbg0KLXVzZSB0aGUgbmV3IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFBlcnNpc3RlbmNlIEFQSSAoSlBBKS4gVGhpcyBzdGFuZGFyZCBzaW1wbGlmaWVzDQotdGhlIGNyZWF0aW9uIGFuZCB1c2Ugb2YgcGVyc2lzdGVudCBlbnRpdGllcywgYXMgd2VsbCBhcyBhZGRpbmcgbmV3IGZlYXR1cmVzLg0KLUZvciBkZXZlbG9waW5nIHByZXNlbnRhdGlvbiBsb2dpYywgeW91IGNhbiB1c2UgdGVjaG5vbG9naWVzIHN1Y2ggYXMgSmF2YVNlcnZlcg0KLVBhZ2VzIChKU1ApIG9yIEphdmFTZXJ2ZXIgRmFjZXMgKEpTRikuPC9wPg0KLTxwPlVzaW5nIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1IFBsYXRmb3JtIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkgLCB5b3UNCi1jYW4gZGV2ZWxvcCBhcHBsaWNhdGlvbnMgbW9yZSBxdWlja2x5IGFuZCBjb252ZW5pZW50bHkgdGhhbiBpbiBwcmV2aW91cyB2ZXJzaW9ucy4NCi1UaGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFDQotNSBwbGF0Zm9ybSByZXBsYWNlcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiAyIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSksIHZlcnNpb24NCi0xLjQuIFRoZSBwcm9kdWN0IHRvb2xzIHN1cHBvcnQgZm9yIGJvdGggdmVyc2lvbnMuIEphdmEgRUUgNSBzaWduaWZpY2FudGx5DQotZW5oYW5jZXMgZWFzZSBvZiB1c2UgcHJvdmlkaW5nPHVsPg0KLTxsaT5SZWR1Y2VkIGRldmVsb3BtZW50IHRpbWU8L2xpPg0KLTxsaT5SZWR1Y2VkIGFwcGxpY2F0aW9uIGNvbXBsZXhpdHk8L2xpPg0KLTxsaT5JbXByb3ZlZCBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZTwvbGk+DQotPC91bD48L3A+DQotPHA+SmF2YSBFRSA1IHByb3ZpZGVzIGEgc2ltcGxpZmllZCBwcm9ncmFtbWluZyBtb2RlbCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmcNCi10b29sczo8dWw+DQotPGxpPklubGluZSBjb25maWd1cmF0aW9uIHdpdGggYW5ub3RhdGlvbnMsIG1ha2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG5vdw0KLW9wdGlvbmFsPC9saT4NCi08bGk+RGVwZW5kZW5jeSBpbmplY3Rpb24sIGhpZGluZyByZXNvdXJjZSBjcmVhdGlvbiBhbmQgbG9va3VwIGZyb20gYXBwbGljYXRpb24NCi1jb2RlPC9saT4NCi08bGk+SmF2YSBwZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYWxsb3dzIGRhdGEgbWFuYWdlbWVudCB3aXRob3V0IGV4cGxpY2l0IFNRTA0KLW9yIEpEQkM8L2xpPg0KLTxsaT5Vc2Ugb2YgcGxhaW4gb2xkIEphdmEgb2JqZWN0cyAoUE9KT3MpIGZvciBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgV2ViDQotc2VydmljZXM8L2xpPg0KLTwvdWw+PC9wPg0KLTxwPkphdmEgRUUgNSBwcm92aWRlcyBzaW1wbGlmaWVkIHBhY2thZ2luZyBydWxlcyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM6PHVsPg0KLTxsaT5XZWIgYXBwbGljYXRpb25zIHVzIC5XQVIgZmlsZXM8L2xpPg0KLTxsaT5SZXNvdXJjZSBhZGFwdGVycyB1c2UgLlJBUiBmaWxlczwvbGk+DQotPGxpPkVudGVycHJpc2UgYXBwbGljYXRpb25zIHVzZSAuRUFSIGZpbGVzPC9saT4NCi08bGk+VGhlIDxjb2RlcGg+bGliPC9jb2RlcGg+IGRpcmVjdG9yeSBjb250YWlucyBzaGFyZWQgLkpBUiBmaWxlczwvbGk+DQotPGxpPkEgLkpBUiBmaWxlIHdpdGggPGNvZGVwaD5NYWluLUNsYXNzPC9jb2RlcGg+IGltcGxpZXMgYW4gYXBwbGljYXRpb24gY2xpZW50PC9saT4NCi08bGk+QSAuSkFSIGZpbGUgd2l0aCBAU3RhdGVsZXNzIGFubm90YXRpb24gaW1wbGllcyBhbiBFSkIgYXBwbGljYXRpb248L2xpPg0KLTxsaT5NYW55IHNpbXBsZSBhcHBsaWNhdGlvbnMgbm8gbG9uZ2VyIHJlcXVpcmUgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgaW5jbHVkaW5nPHVsPg0KLTxsaT5FSkIgYXBwbGljYXRpb25zICguSkFSIGZpbGVzKTwvbGk+DQotPGxpPldlYiBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgSlNQIHRlY2hub2xvZ3kgb25seTwvbGk+DQotPGxpPkFwcGxpY2F0aW9uIGNsaWVudHM8L2xpPg0KLTxsaT5FbnRlcnByaXNlIGFwcGxpY2F0aW9ucyAoLkVBUiBmaWxlcyk8L2xpPg0KLTwvdWw+PC9saT4NCi08L3VsPjwvcD4NCi08cD5KYXZhIEVFIDUgcHJvdmlkZXMgc2ltcGxpZmllZCByZXNvdXJjZSBhY2Nlc3MgdXNpbmcgZGVwZW5kZW5jeSBpbmplY3Rpb246PHVsPg0KLTxsaT5JbiB0aGUgRGVwZW5kZW5jeSBJbmplY3Rpb24gcGF0dGVybiwgYW4gZXh0ZXJuYWwgZW50aXR5IGF1dG9tYXRpY2FsbHkNCi1zdXBwbGllcyBhbiBvYmplY3QncyBkZXBlbmRlbmNpZXMuPHVsPg0KLTxsaT5UaGUgb2JqZWN0IG5lZWQgbm90IHJlcXVlc3QgdGhlc2UgcmVzb3VyY2VzIGV4cGxpY2l0bHk8L2xpPg0KLTwvdWw+PC9saT4NCi08bGk+SW4gSmF2YSBFRSA1LCBkZXBlbmRlbmN5IGluamVjdGlvbiBjYW4gYmUgYXBwbGllZCB0byBhbGwgcmVzb3VyY2VzIHRoYXQNCi1hIGNvbXBvbmVudCBuZWVkczx1bD4NCi08bGk+Q3JlYXRpb24gYW5kIGxvb2t1cCBvZiByZXNvdXJjZXMgYXJlIGhpZGRlbiBmcm9tIGFwcGxpY2F0aW9uIGNvZGU8L2xpPg0KLTwvdWw+PC9saT4NCi08bGk+RGVwZW5kZW5jeSBpbmplY3Rpb24gY2FuIGJlIGFwcGxpZWQgdGhyb3VnaG91dCBKYXZhIEVFIDUgdGVjaG5vbG9neTo8dWw+DQotPGxpPkVKQiBjb250YWluZXJzPC9saT4NCi08bGk+V2ViIGNvbnRhaW5lcnM8L2xpPg0KLTxsaT5DbGllbnRzPC9saT4NCi08bGk+V2ViIHNlcnZpY2VzPC9saT4NCi08L3VsPjwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVlNW92ZXJ2aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVlNW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYjI4ZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plZTVvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkphdmEgRUUgNTogT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVXNpbmcgdGhlIEphdmEgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkgYXJjaGl0ZWN0dXJlLCB5b3UgY2FuIGJ1aWxkIGRpc3RyaWJ1dGVkIFdlYiBhbmQgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuIFRoaXMgYXJjaGl0ZWN0dXJlIGhlbHBzIHlvdSBmb2N1cyBvbiBwcmVzZW50YXRpb24gYW5kIGFwcGxpY2F0aW9uIGlzc3VlcywgcmF0aGVyIHRoYW4gb24gc3lzdGVtcyBpc3N1ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlVzaW5nIHRoZSBKYXZhIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpIGFyY2hpdGVjdHVyZSwgeW91IGNhbiBidWlsZCBkaXN0cmlidXRlZCBXZWIgYW5kIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiBUaGlzIGFyY2hpdGVjdHVyZSBoZWxwcyB5b3UgZm9jdXMgb24gcHJlc2VudGF0aW9uIGFuZCBhcHBsaWNhdGlvbiBpc3N1ZXMsIHJhdGhlciB0aGFuIG9uIHN5c3RlbXMgaXNzdWVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRUUgNSwgT2VydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRUUgNSwgT2VydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamF2YWVlNS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNqYXZhZWU1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SmF2YSBFRSA1OiBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2phdmFlZTUiPjxhIG5hbWU9ImNqYXZhZWU1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5KYXZhIEVFIDU6IE92ZXJ2aWV3PC9oMT4KLQotCi0KLTxkaXY+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+VXNpbmcgdGhlIEphdmHihKIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkKLWFyY2hpdGVjdHVyZSwgeW91IGNhbiBidWlsZCBkaXN0cmlidXRlZCBXZWIgYW5kIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiBUaGlzCi1hcmNoaXRlY3R1cmUgaGVscHMgeW91IGZvY3VzIG9uIHByZXNlbnRhdGlvbiBhbmQgYXBwbGljYXRpb24gaXNzdWVzLCByYXRoZXIKLXRoYW4gb24gc3lzdGVtcyBpc3N1ZXMuPC9wPgotCi08cD5Zb3UgY2FuIHVzZSB0aGUgSmF2YSBFRSA1IHRvb2xzIGFuZCBmZWF0dXJlcyB0byBjcmVhdGUgYXBwbGljYXRpb25zCi10aGF0IGFyZSBzdHJ1Y3R1cmVkIGFyb3VuZCBtb2R1bGVzIHdpdGggZGlmZmVyZW50IHB1cnBvc2VzLCBzdWNoIGFzIFdlYiBzaXRlcwotYW5kIEVudGVycHJpc2UgSmF2YUJlYW5z4oSiIChFSkIpIGFwcGxpY2F0aW9ucy4gV2hlbiB5b3UgdXNlIEVKQgotMy4wIGNvbXBvbmVudHMsIHlvdSBjYW4gY3JlYXRlIGEgZGlzdHJpYnV0ZWQsIHNlY3VyZSBhcHBsaWNhdGlvbiB3aXRoIHRyYW5zYWN0aW9uYWwKLXN1cHBvcnQuIFdoZW4geW91IGRldmVsb3AgYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIHBlcnNpc3RlbnQgZGF0YSwgeW91IGNhbgotdXNlIHRoZSBuZXcgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkuIFRoaXMgc3RhbmRhcmQgc2ltcGxpZmllcwotdGhlIGNyZWF0aW9uIGFuZCB1c2Ugb2YgcGVyc2lzdGVudCBlbnRpdGllcywgYXMgd2VsbCBhcyBhZGRpbmcgbmV3IGZlYXR1cmVzLgotRm9yIGRldmVsb3BpbmcgcHJlc2VudGF0aW9uIGxvZ2ljLCB5b3UgY2FuIHVzZSB0ZWNobm9sb2dpZXMgc3VjaCBhcyBKYXZhU2VydmVyCi1QYWdlcyAoSlNQKSBvciBKYXZhU2VydmVyIEZhY2VzIChKU0YpLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VXNpbmcgdGhlIEphdmEgRUUgNSBQbGF0Zm9ybSBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpICwgeW91Ci1jYW4gZGV2ZWxvcCBhcHBsaWNhdGlvbnMgbW9yZSBxdWlja2x5IGFuZCBjb252ZW5pZW50bHkgdGhhbiBpbiBwcmV2aW91cyB2ZXJzaW9ucy4KLVRoZSBKYXZhIEVFCi01IHBsYXRmb3JtIHJlcGxhY2VzIEphdmEgMiBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpLCB2ZXJzaW9uCi0xLjQuIFRoZSBwcm9kdWN0IHRvb2xzIHN1cHBvcnQgZm9yIGJvdGggdmVyc2lvbnMuIEphdmEgRUUgNSBzaWduaWZpY2FudGx5Ci1lbmhhbmNlcyBlYXNlIG9mIHVzZSBwcm92aWRpbmc8dWw+Ci08bGk+UmVkdWNlZCBkZXZlbG9wbWVudCB0aW1lPC9saT4KLQotPGxpPlJlZHVjZWQgYXBwbGljYXRpb24gY29tcGxleGl0eTwvbGk+Ci0KLTxsaT5JbXByb3ZlZCBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+SmF2YSBFRSA1IHByb3ZpZGVzIGEgc2ltcGxpZmllZCBwcm9ncmFtbWluZyBtb2RlbCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmcKLXRvb2xzOjx1bD4KLTxsaT5JbmxpbmUgY29uZmlndXJhdGlvbiB3aXRoIGFubm90YXRpb25zLCBtYWtpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBub3cKLW9wdGlvbmFsPC9saT4KLQotPGxpPkRlcGVuZGVuY3kgaW5qZWN0aW9uLCBoaWRpbmcgcmVzb3VyY2UgY3JlYXRpb24gYW5kIGxvb2t1cCBmcm9tIGFwcGxpY2F0aW9uCi1jb2RlPC9saT4KLQotPGxpPkphdmEgcGVyc2lzdGVuY2UgQVBJIChKUEEpIGFsbG93cyBkYXRhIG1hbmFnZW1lbnQgd2l0aG91dCBleHBsaWNpdCBTUUwKLW9yIEpEQkM8L2xpPgotCi08bGk+VXNlIG9mIHBsYWluIG9sZCBKYXZhIG9iamVjdHMgKFBPSk9zKSBmb3IgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIFdlYgotc2VydmljZXM8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkphdmEgRUUgNSBwcm92aWRlcyBzaW1wbGlmaWVkIHBhY2thZ2luZyBydWxlcyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM6PHVsPgotPGxpPldlYiBhcHBsaWNhdGlvbnMgdXMgLldBUiBmaWxlczwvbGk+Ci0KLTxsaT5SZXNvdXJjZSBhZGFwdGVycyB1c2UgLlJBUiBmaWxlczwvbGk+Ci0KLTxsaT5FbnRlcnByaXNlIGFwcGxpY2F0aW9ucyB1c2UgLkVBUiBmaWxlczwvbGk+Ci0KLTxsaT5UaGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+bGliPC9zYW1wPiBkaXJlY3RvcnkgY29udGFpbnMgc2hhcmVkIC5KQVIgZmlsZXM8L2xpPgotCi08bGk+QSAuSkFSIGZpbGUgd2l0aCA8c2FtcCBjbGFzcz0iY29kZXBoIj5NYWluLUNsYXNzPC9zYW1wPiBpbXBsaWVzIGFuIGFwcGxpY2F0aW9uIGNsaWVudDwvbGk+Ci0KLTxsaT5BIC5KQVIgZmlsZSB3aXRoIEBTdGF0ZWxlc3MgYW5ub3RhdGlvbiBpbXBsaWVzIGFuIEVKQiBhcHBsaWNhdGlvbjwvbGk+Ci0KLTxsaT5NYW55IHNpbXBsZSBhcHBsaWNhdGlvbnMgbm8gbG9uZ2VyIHJlcXVpcmUgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgaW5jbHVkaW5nPHVsPgotPGxpPkVKQiBhcHBsaWNhdGlvbnMgKC5KQVIgZmlsZXMpPC9saT4KLQotPGxpPldlYiBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgSlNQIHRlY2hub2xvZ3kgb25seTwvbGk+Ci0KLTxsaT5BcHBsaWNhdGlvbiBjbGllbnRzPC9saT4KLQotPGxpPkVudGVycHJpc2UgYXBwbGljYXRpb25zICguRUFSIGZpbGVzKTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkphdmEgRUUgNSBwcm92aWRlcyBzaW1wbGlmaWVkIHJlc291cmNlIGFjY2VzcyB1c2luZyBkZXBlbmRlbmN5IGluamVjdGlvbjo8dWw+Ci08bGk+SW4gdGhlIERlcGVuZGVuY3kgSW5qZWN0aW9uIHBhdHRlcm4sIGFuIGV4dGVybmFsIGVudGl0eSBhdXRvbWF0aWNhbGx5Ci1zdXBwbGllcyBhbiBvYmplY3QncyBkZXBlbmRlbmNpZXMuPHVsPgotPGxpPlRoZSBvYmplY3QgbmVlZCBub3QgcmVxdWVzdCB0aGVzZSByZXNvdXJjZXMgZXhwbGljaXRseTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+SW4gSmF2YSBFRSA1LCBkZXBlbmRlbmN5IGluamVjdGlvbiBjYW4gYmUgYXBwbGllZCB0byBhbGwgcmVzb3VyY2VzIHRoYXQKLWEgY29tcG9uZW50IG5lZWRzPHVsPgotPGxpPkNyZWF0aW9uIGFuZCBsb29rdXAgb2YgcmVzb3VyY2VzIGFyZSBoaWRkZW4gZnJvbSBhcHBsaWNhdGlvbiBjb2RlPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5EZXBlbmRlbmN5IGluamVjdGlvbiBjYW4gYmUgYXBwbGllZCB0aHJvdWdob3V0IEphdmEgRUUgNSB0ZWNobm9sb2d5Ojx1bD4KLTxsaT5FSkIgY29udGFpbmVyczwvbGk+Ci0KLTxsaT5XZWIgY29udGFpbmVyczwvbGk+Ci0KLTxsaT5DbGllbnRzPC9saT4KLQotPGxpPldlYiBzZXJ2aWNlczwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jamF2YWVlNS5odG1sIiB0aXRsZT0iVGhlIEphdmEgRUUgNSBwcm9ncmFtbWluZyBtb2RlbCBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIEphdmEgYXBwbGljYXRpb25zLiI+RGV2ZWxvcGluZyBKYXZhIEVFIDUgQXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOGJkMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNqcGVycyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZTwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUgaW5jbHVkZXMgd29ya2JlbmNoIHZpZXdzDQotdGhhdCB5b3UgY2FuIHVzZSB3aGVuIGRldmVsb3BpbmcgcmVzb3VyY2VzIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgRUpCDQotbW9kdWxlcywgV2ViIG1vZHVsZXMsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBhbmQgY29ubmVjdG9yIHByb2plY3RzIG9yDQotbW9kdWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5KYXZhIEVFPGluZGV4dGVybT53b3JrYmVuY2ggcGVyc3BlY3RpdmVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5lbnRlcnByaXNlIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+SmF2YSBFRSBwZXJzcGVjdGl2ZTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keSBvdXRwdXRjbGFzcz0iaWRfY29uYm9keSI+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPg0KLTxwPllvdSBjYW4gcmVhcnJhbmdlIHRoZSBsb2NhdGlvbiwgdGlsaW5nLCBhbmQgc2l6ZSBvZiB0aGUgdmlld3Mgd2l0aGluIHRoZQ0KLXBlcnNwZWN0aXZlLiBZb3UgY2FuIGFsc28gYWRkIG90aGVyIHZpZXdzIHRvIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZSBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlNob3cgVmlldzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZA0KLXNlbGVjdGluZyB0aGUgdmlldy48L3A+DQotPHA+VGhlIHdvcmtiZW5jaCBwcm92aWRlcyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgdmlld3MgYW5kIGVkaXRvcnMuDQotVGhpcyBpcyBhbHNvIHRydWUgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUuPC9wPg0KLTxwPkJ5IGRlZmF1bHQsIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nDQotd29ya2JlbmNoIHZpZXdzOjwvcD4NCi08ZGw+PGRsZW50cnkgb3V0cHV0Y2xhc3M9ImlkX3BlcnNwZWN0aXZldmlld3NfdG9wIj4NCi08ZHQ+PHVpY29udHJvbD5Qcm9qZWN0IEV4cGxvcmVyPC91aWNvbnRyb2w+PC9kdD4NCi08ZGQ+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIHZpZXcgb2YgeW91ciBwcm9qZWN0cw0KLWFuZCB0aGVpciBhcnRpZmFjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiBZb3UgY2FuIHNob3cgb3IgaGlkZSB5b3VyDQotcHJvamVjdHMgYmFzZWQgb24gd29ya2luZyBzZXRzLiBUaGlzIHZpZXcgZGlzcGxheXMgbmF2aWdhYmxlIG1vZGVscyBvZiBKMkVFDQotZGVwbG95bWVudCBkZXNjcmlwdG9ycywgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYXJ0aWZhY3RzIChzb3VyY2UgZm9sZGVycywgcGFja2FnZXMsDQotYW5kIGNsYXNzZXMpLCBuYXZpZ2FibGUgbW9kZWxzIG9mIHRoZSBhdmFpbGFibGUgV2ViIHNlcnZpY2VzLCBhbmQgc3BlY2lhbGl6ZWQNCi12aWV3cyBvZiBXZWIgbW9kdWxlcyB0byBzaW1wbGlmeSB0aGUgZGV2ZWxvcG1lbnQgb2YgZHluYW1pYyBXZWIgYXBwbGljYXRpb25zLg0KLUluIGFkZGl0aW9uLCBFSkIgZGF0YWJhc2UgbWFwcGluZyBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcHJvamVjdHMgZm9yIGENCi1KMkVFIGFwcGxpY2F0aW9uIHNlcnZlciBhcmUgbWFkZSByZWFkaWx5IGF2YWlsYWJsZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHVpY29udHJvbD4gT3V0bGluZTwvdWljb250cm9sPjwvZHQ+DQotPGRkPlRoZSBPdXRsaW5lIHZpZXcgaW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlIHNob3dzIHRoZSBvdXRsaW5lIG9mDQotdGhlIGZpbGUgdGhhdCB5b3UgYXJlIGVkaXRpbmcuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIGEgdGFiYmVkIGRlcGxveW1lbnQNCi1kZXNjcmlwdG9yIGVkaXRvciwgdGhlIE91dGxpbmUgdmlldyBzaG93cyB0aGUgb3V0bGluZSBmb3IgdGhlIHNlbGVjdGVkIHBhZ2Uncw0KLWVsZW1lbnRzLCBhbmQgaWYgeW91IGFyZSBlZGl0aW5nIG9uIHRoZSBTb3VyY2UgdGFiLCB0aGUgb3V0bGluZSBmb3IgdGhlIFhNTA0KLXNvdXJjZSBpcyBkaXNwbGF5ZWQuIElmIHlvdSBhcmUgZWRpdGluZyBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGVkaXRvciwNCi10aGUgT3V0bGluZSB2aWV3IHNob3dzIHRoZSBvdXRsaW5lIGZvciB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY2xhc3MuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pjx1aWNvbnRyb2w+VGFza3M8L3VpY29udHJvbD48L2R0Pg0KLTxkZD5UaGUgVGFza3MgdmlldyBsaXN0cyB0aGUgdG8tZG8gaXRlbXMgdGhhdCB5b3UgaGF2ZSBlbnRlcmVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dWljb250cm9sPlByb2JsZW1zPC91aWNvbnRyb2w+PC9kdD4NCi08ZGQ+VGhlIFByb2JsZW1zIHZpZXcgZGlzcGxheXMgcHJvYmxlbXMsIHdhcm5pbmdzLCBvciBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoDQotdGhlIHNlbGVjdGVkIHByb2plY3QuIFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gdG8gYWRkcmVzcyB0aGUgc3BlY2lmaWMNCi1wcm9ibGVtIGluIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9kdD4NCi08ZGQ+VGhlIFByb3BlcnRpZXMgdmlldyBwcm92aWRlcyBhIHRhYnVsYXIgdmlldyBvZiB0aGUgcHJvcGVydGllcyBhbmQgYXNzb2NpYXRlZA0KLXZhbHVlcyBvZiBvYmplY3RzIGluIGZpbGVzIHlvdSBoYXZlIG9wZW4gaW4gYW4gZWRpdG9yLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dWljb250cm9sPlNlcnZlcnM8L3VpY29udHJvbD48L2R0Pg0KLTxkZD5UaGUgU2VydmVycyB2aWV3IHNob3dzIGFsbCB0aGUgY3JlYXRlZCBzZXJ2ZXIgaW5zdGFuY2VzLiBZb3UgY2FuIHN0YXJ0DQotYW5kIHN0b3AgZWFjaCBzZXJ2ZXIgZnJvbSB0aGlzIHZpZXcsIGFuZCB5b3UgY2FuIGxhdW5jaCB0aGUgdGVzdCBjbGllbnQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnkgb3V0cHV0Y2xhc3M9ImlkX3BlcnNwZWN0aXZldmlld3NfYm90dG9tIj4NCi08ZHQ+PHVpY29udHJvbD5TbmlwcGV0czwvdWljb250cm9sPjwvZHQ+DQotPGRkPlRoZSBTbmlwcGV0cyB2aWV3IHByb3ZpZGVzIGNhdGVnb3JpemVkIHBpZWNlcyBvZiBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQNCi1pbnRvIGFwcHJvcHJpYXRlIHBsYWNlcyBpbiB5b3VyIHNvdXJjZSBjb2RlLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dWljb250cm9sPkRhdGEgU291cmNlIEV4cGxvcmVyPC91aWNvbnRyb2w+PC9kdD4NCi08ZGQ+VGhlIERhdGEgU291cmNlIEV4cGxvcmVyIHByb3ZpZGVzIGEgbGlzdCBvZiBjb25maWd1cmVkIGNvbm5lY3Rpb24gcHJvZmlsZXMuDQotSWYgY2F0ZWdvcmllcyBhcmUgZW5hYmxlZCwgeW91IGNhbiBzZWUgdGhlIGxpc3QgZ3JvdXBlZCBpbnRvIGNhdGVnb3JpZXMuIFVzZQ0KLXRoZSBEYXRhIFNvdXJjZSBFeHBsb3JlciB0byBjb25uZWN0IHRvLCBuYXZpZ2F0ZSwgYW5kIGludGVyYWN0IHdpdGggcmVzb3VyY2VzDQotYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUuIEl0IGFsc28gcHJvdmlkZXMgaW1wb3J0IGFuZA0KLWV4cG9ydCBjYXBhYmlsaXRpZXMgdG8gc2hhcmUgY29ubmVjdGlvbiBwcm9maWxlIGRlZmluaXRpb25zIHdpdGggb3RoZXIgRWNsaXBzZQ0KLVdvcmtiZW5jaGVzLiA8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHVpY29udHJvbD5TdGF0dXMgYmFyPC91aWNvbnRyb2w+PC9kdD4NCi08ZGQ+VGhlIFN0YXR1cyBiYXIgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYXRpb24gb2Ygc2VsZWN0ZWQgb2JqZWN0cw0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXdzIGluIHRoZSBsZWZ0IHNpZGUuIFdoZW4gZmlsZSBhbmQgZGVwbG95bWVudCBkZXNjcmlwdG9ycw0KLWFyZSBvcGVuLCB0aGUgc3RhdHVzIGJhciBzaG93cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBmaWxlcyBhbmQgdGhlIGxpbmUNCi1hbmQgY29sdW1uIG51bWJlcnMgd2hlbiBhcHBsaWNhYmxlLiBTb21ldGltZXMgd2hlbiBsb25nIG9wZXJhdGlvbnMgcnVuLCBhDQotc3RhdHVzIG1vbml0b3Igd2lsbCBhcHBlYXIgaW4gdGhlIHN0YXR1cyBiYXIsIGFsb25nIHdpdGggYSBidXR0b24gd2l0aCBhIHN0b3ANCi1zaWduIGljb24uIENsaWNraW5nIHRoZSBzdG9wIHNpZ24gc3RvcHMgdGhlIG9wZXJhdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gY2FuDQotYmUgY2FuY2VsbGVkLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janBlcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZmUwYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janBlcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJKYXZhIEVFIHBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIGluY2x1ZGVzIHdvcmtiZW5jaCB2aWV3cyB0aGF0IHlvdSBjYW4gdXNlIHdoZW4gZGV2ZWxvcGluZyByZXNvdXJjZXMgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zLCBFSkIgbW9kdWxlcywgV2ViIG1vZHVsZXMsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBhbmQgY29ubmVjdG9yIHByb2plY3RzIG9yIG1vZHVsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIGluY2x1ZGVzIHdvcmtiZW5jaCB2aWV3cyB0aGF0IHlvdSBjYW4gdXNlIHdoZW4gZGV2ZWxvcGluZyByZXNvdXJjZXMgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zLCBFSkIgbW9kdWxlcywgV2ViIG1vZHVsZXMsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBhbmQgY29ubmVjdG9yIHByb2plY3RzIG9yIG1vZHVsZXMuIiAvPgotPG1ldGEgY29udGVudD0iSmF2YSBFRSwgd29ya2JlbmNoIHBlcnNwZWN0aXZlcywgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIEphdmEgRUUgcGVyc3BlY3RpdmUiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFLCB3b3JrYmVuY2ggcGVyc3BlY3RpdmVzLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgSmF2YSBFRSBwZXJzcGVjdGl2ZSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2N3b3Jrc2V0Lmh0bSIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjanBlcnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5KYXZhIEVFIHBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjanBlcnMiPjxhIG5hbWU9ImNqcGVycyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+SmF2YSBFRSBwZXJzcGVjdGl2ZTwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9jb25ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGUgSmF2YeKEoiBFRSBwZXJzcGVjdGl2ZSBpbmNsdWRlcyB3b3JrYmVuY2ggdmlld3MKLXRoYXQgeW91IGNhbiB1c2Ugd2hlbiBkZXZlbG9waW5nIHJlc291cmNlcyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIEVKQgotbW9kdWxlcywgV2ViIG1vZHVsZXMsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBhbmQgY29ubmVjdG9yIHByb2plY3RzIG9yCi1tb2R1bGVzLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHA+WW91IGNhbiByZWFycmFuZ2UgdGhlIGxvY2F0aW9uLCB0aWxpbmcsIGFuZCBzaXplIG9mIHRoZSB2aWV3cyB3aXRoaW4gdGhlCi1wZXJzcGVjdGl2ZS4gWW91IGNhbiBhbHNvIGFkZCBvdGhlciB2aWV3cyB0byB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgVmlldzwvc3Bhbj48L3NwYW4+IGFuZAotc2VsZWN0aW5nIHRoZSB2aWV3LjwvcD4KLQotPHA+VGhlIHdvcmtiZW5jaCBwcm92aWRlcyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgdmlld3MgYW5kIGVkaXRvcnMuCi1UaGlzIGlzIGFsc28gdHJ1ZSBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZS48L3A+Ci0KLTxwPkJ5IGRlZmF1bHQsIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcKLXdvcmtiZW5jaCB2aWV3czo8L3A+Ci0KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPjwvZHQ+Ci0KLTxkZD5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgdmlldyBvZiB5b3VyIHByb2plY3RzCi1hbmQgdGhlaXIgYXJ0aWZhY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC4gWW91IGNhbiBzaG93IG9yIGhpZGUgeW91cgotcHJvamVjdHMgYmFzZWQgb24gd29ya2luZyBzZXRzLiBUaGlzIHZpZXcgZGlzcGxheXMgbmF2aWdhYmxlIG1vZGVscyBvZiBKMkVFCi1kZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBKYXZhIGFydGlmYWN0cyAoc291cmNlIGZvbGRlcnMsIHBhY2thZ2VzLAotYW5kIGNsYXNzZXMpLCBuYXZpZ2FibGUgbW9kZWxzIG9mIHRoZSBhdmFpbGFibGUgV2ViIHNlcnZpY2VzLCBhbmQgc3BlY2lhbGl6ZWQKLXZpZXdzIG9mIFdlYiBtb2R1bGVzIHRvIHNpbXBsaWZ5IHRoZSBkZXZlbG9wbWVudCBvZiBkeW5hbWljIFdlYiBhcHBsaWNhdGlvbnMuCi1JbiBhZGRpdGlvbiwgRUpCIGRhdGFiYXNlIG1hcHBpbmcgYW5kIHRoZSBjb25maWd1cmF0aW9uIG9mIHByb2plY3RzIGZvciBhCi1KMkVFIGFwcGxpY2F0aW9uIHNlcnZlciBhcmUgbWFkZSByZWFkaWx5IGF2YWlsYWJsZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj4gT3V0bGluZTwvc3Bhbj48L2R0PgotCi08ZGQ+VGhlIE91dGxpbmUgdmlldyBpbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSBzaG93cyB0aGUgb3V0bGluZSBvZgotdGhlIGZpbGUgdGhhdCB5b3UgYXJlIGVkaXRpbmcuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIGEgdGFiYmVkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgZWRpdG9yLCB0aGUgT3V0bGluZSB2aWV3IHNob3dzIHRoZSBvdXRsaW5lIGZvciB0aGUgc2VsZWN0ZWQgcGFnZSdzCi1lbGVtZW50cywgYW5kIGlmIHlvdSBhcmUgZWRpdGluZyBvbiB0aGUgU291cmNlIHRhYiwgdGhlIG91dGxpbmUgZm9yIHRoZSBYTUwKLXNvdXJjZSBpcyBkaXNwbGF5ZWQuIElmIHlvdSBhcmUgZWRpdGluZyBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIEphdmEgZWRpdG9yLAotdGhlIE91dGxpbmUgdmlldyBzaG93cyB0aGUgb3V0bGluZSBmb3IgdGhlIEphdmEgY2xhc3MuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFza3M8L3NwYW4+PC9kdD4KLQotPGRkPlRoZSBUYXNrcyB2aWV3IGxpc3RzIHRoZSB0by1kbyBpdGVtcyB0aGF0IHlvdSBoYXZlIGVudGVyZWQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvYmxlbXM8L3NwYW4+PC9kdD4KLQotPGRkPlRoZSBQcm9ibGVtcyB2aWV3IGRpc3BsYXlzIHByb2JsZW1zLCB3YXJuaW5ncywgb3IgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aAotdGhlIHNlbGVjdGVkIHByb2plY3QuIFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gdG8gYWRkcmVzcyB0aGUgc3BlY2lmaWMKLXByb2JsZW0gaW4gdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9kdD4KLQotPGRkPlRoZSBQcm9wZXJ0aWVzIHZpZXcgcHJvdmlkZXMgYSB0YWJ1bGFyIHZpZXcgb2YgdGhlIHByb3BlcnRpZXMgYW5kIGFzc29jaWF0ZWQKLXZhbHVlcyBvZiBvYmplY3RzIGluIGZpbGVzIHlvdSBoYXZlIG9wZW4gaW4gYW4gZWRpdG9yLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlcnZlcnM8L3NwYW4+PC9kdD4KLQotPGRkPlRoZSBTZXJ2ZXJzIHZpZXcgc2hvd3MgYWxsIHRoZSBjcmVhdGVkIHNlcnZlciBpbnN0YW5jZXMuIFlvdSBjYW4gc3RhcnQKLWFuZCBzdG9wIGVhY2ggc2VydmVyIGZyb20gdGhpcyB2aWV3LCBhbmQgeW91IGNhbiBsYXVuY2ggdGhlIHRlc3QgY2xpZW50LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNuaXBwZXRzPC9zcGFuPjwvZHQ+Ci0KLTxkZD5UaGUgU25pcHBldHMgdmlldyBwcm92aWRlcyBjYXRlZ29yaXplZCBwaWVjZXMgb2YgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0Ci1pbnRvIGFwcHJvcHJpYXRlIHBsYWNlcyBpbiB5b3VyIHNvdXJjZSBjb2RlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRhdGEgU291cmNlIEV4cGxvcmVyPC9zcGFuPjwvZHQ+Ci0KLTxkZD5UaGUgRGF0YSBTb3VyY2UgRXhwbG9yZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGNvbmZpZ3VyZWQgY29ubmVjdGlvbiBwcm9maWxlcy4KLUlmIGNhdGVnb3JpZXMgYXJlIGVuYWJsZWQsIHlvdSBjYW4gc2VlIHRoZSBsaXN0IGdyb3VwZWQgaW50byBjYXRlZ29yaWVzLiBVc2UKLXRoZSBEYXRhIFNvdXJjZSBFeHBsb3JlciB0byBjb25uZWN0IHRvLCBuYXZpZ2F0ZSwgYW5kIGludGVyYWN0IHdpdGggcmVzb3VyY2VzCi1hc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZS4gSXQgYWxzbyBwcm92aWRlcyBpbXBvcnQgYW5kCi1leHBvcnQgY2FwYWJpbGl0aWVzIHRvIHNoYXJlIGNvbm5lY3Rpb24gcHJvZmlsZSBkZWZpbml0aW9ucyB3aXRoIG90aGVyIEVjbGlwc2UKLVdvcmtiZW5jaGVzLiA8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5TdGF0dXMgYmFyPC9zcGFuPjwvZHQ+Ci0KLTxkZD5UaGUgU3RhdHVzIGJhciBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2NhdGlvbiBvZiBzZWxlY3RlZCBvYmplY3RzCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3cyBpbiB0aGUgbGVmdCBzaWRlLiBXaGVuIGZpbGUgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLWFyZSBvcGVuLCB0aGUgc3RhdHVzIGJhciBzaG93cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBmaWxlcyBhbmQgdGhlIGxpbmUKLWFuZCBjb2x1bW4gbnVtYmVycyB3aGVuIGFwcGxpY2FibGUuIFNvbWV0aW1lcyB3aGVuIGxvbmcgb3BlcmF0aW9ucyBydW4sIGEKLXN0YXR1cyBtb25pdG9yIHdpbGwgYXBwZWFyIGluIHRoZSBzdGF0dXMgYmFyLCBhbG9uZyB3aXRoIGEgYnV0dG9uIHdpdGggYSBzdG9wCi1zaWduIGljb24uIENsaWNraW5nIHRoZSBzdG9wIHNpZ24gc3RvcHMgdGhlIG9wZXJhdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gY2FuCi1iZSBjYW5jZWxsZWQuPC9kZD4KLQotPC9kbD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2N3b3Jrc2V0Lmh0bSI+V29ya2luZyBzZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nqdmlldy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTQ5ZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNqdmlldyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFDQotcGVyc3BlY3RpdmU8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+V2hpbGUgZGV2ZWxvcGluZyBKMkVFIGFwcGxpY2F0aW9ucyBpbg0KLXRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUNCi1wZXJzcGVjdGl2ZSwgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBpcyB5b3VyIG1haW4gdmlldyBvZiB5b3VyIEoyRUUgcHJvamVjdHMNCi1hbmQgcmVzb3VyY2VzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnZpZXdzPGluZGV4dGVybT5Qcm9qZWN0IEV4cGxvcmVyPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5IG91dHB1dGNsYXNzPSJpZF9jb25ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHA+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIHZpZXcgb2YgYWxsIHByb2plY3QgcmVzb3VyY2VzLA0KLWluY2x1ZGluZyBtb2RlbHMgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBhcnRpZmFjdHMsIHJlc291cmNlcywgV2ViIHNlcnZpY2VzLA0KLWRhdGFiYXNlcywgYW5kIGR5bmFtaWMgV2ViIHByb2plY3QgYXJ0aWZhY3RzLjwvcD4NCi08cD5Zb3Ugc2hvdWxkIHVzZSB0aGlzIHZpZXcgdG8gd29yayB3aXRoIHlvdXIgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzDQotYW5kIHRoZWlyIGNvbnRlbnQuIFlvdSBjYW4gdmlldyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIHNlZQ0KLWFsbCBvZiB0aGUgbW9kdWxlcyBhc3NvY2lhdGVkIHdpdGggaXQuIDwvcD4NCi08cD5Zb3UgY2FuIGFsc28gZmlsdGVyIHdoYXQgeW91IHNlZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHRvIGhpZGUgcHJvamVjdHMsDQotZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBzZWUuIFRvIGVuYWJsZSBvciBkaXNhYmxlIGZpbHRlcnMsDQotc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplIFZpZXcuLi48L3VpY29udHJvbD4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUgYXQNCi10aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgdmlldy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBocmVmPSJjanZpZXdmaWx0ZXJzLmRpdGEiPkZpbHRlcnMNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC94cmVmPi48L3A+DQotPHA+QWx0ZXJuYXRlbHksIHlvdSBjYW4gZmlsdGVyIHdoYXQgeW91IHNlZSBieSBzaG93aW5nIG9yIGhpZGluZyB3b3JraW5nIHNldHMsDQotZ3JvdXBzIG9mIHJlbGF0ZWQgcmVzb3VyY2VzIG9yIHByb2plY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmIGZvcm1hdD0iaHRtbCINCi1ocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jd29ya3NldC5odG0iIHNjb3BlPSJwZWVyIj5Xb3JraW5nDQotU2V0czxkZXNjPjwvZGVzYz48L3hyZWY+LjwvcD4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nqdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM4YzBkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nqdmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoaWxlIGRldmVsb3BpbmcgSjJFRSBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgaXMgeW91ciBtYWluIHZpZXcgb2YgeW91ciBKMkVFIHByb2plY3RzIGFuZCByZXNvdXJjZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoaWxlIGRldmVsb3BpbmcgSjJFRSBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgaXMgeW91ciBtYWluIHZpZXcgb2YgeW91ciBKMkVFIHByb2plY3RzIGFuZCByZXNvdXJjZXMuIiAvPgotPG1ldGEgY29udGVudD0idmlld3MsIFByb2plY3QgRXhwbG9yZXIiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ2aWV3cywgUHJvamVjdCBFeHBsb3JlciIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZpZXdmaWx0ZXJzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2N3b3Jrc2V0Lmh0bSIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjanZpZXciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIEphdmEgRUUKLXBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjanZpZXciPjxhIG5hbWU9ImNqdmlldyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+UHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKYXZhIEVFCi1wZXJzcGVjdGl2ZTwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9jb25ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5XaGlsZSBkZXZlbG9waW5nIEoyRUUgYXBwbGljYXRpb25zIGluCi10aGUgSmF2YeKEoiBFRQotcGVyc3BlY3RpdmUsIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgaXMgeW91ciBtYWluIHZpZXcgb2YgeW91ciBKMkVFIHByb2plY3RzCi1hbmQgcmVzb3VyY2VzLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHA+VGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIHZpZXcgb2YgYWxsIHByb2plY3QgcmVzb3VyY2VzLAotaW5jbHVkaW5nIG1vZGVscyBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMsIEphdmEgYXJ0aWZhY3RzLCByZXNvdXJjZXMsIFdlYiBzZXJ2aWNlcywKLWRhdGFiYXNlcywgYW5kIGR5bmFtaWMgV2ViIHByb2plY3QgYXJ0aWZhY3RzLjwvcD4KLQotPHA+WW91IHNob3VsZCB1c2UgdGhpcyB2aWV3IHRvIHdvcmsgd2l0aCB5b3VyIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotYW5kIHRoZWlyIGNvbnRlbnQuIFlvdSBjYW4gdmlldyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIHNlZQotYWxsIG9mIHRoZSBtb2R1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4gPC9wPgotCi08cD5Zb3UgY2FuIGFsc28gZmlsdGVyIHdoYXQgeW91IHNlZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHRvIGhpZGUgcHJvamVjdHMsCi1mb2xkZXJzLCBvciBmaWxlcyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIHNlZS4gVG8gZW5hYmxlIG9yIGRpc2FibGUgZmlsdGVycywKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemUgVmlldy4uLjwvc3Bhbj4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUgYXQKLXRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSB2aWV3LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNqdmlld2ZpbHRlcnMuaHRtbCI+RmlsdGVycyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC9hPi48L3A+Ci0KLTxwPkFsdGVybmF0ZWx5LCB5b3UgY2FuIGZpbHRlciB3aGF0IHlvdSBzZWUgYnkgc2hvd2luZyBvciBoaWRpbmcgd29ya2luZyBzZXRzLAotZ3JvdXBzIG9mIHJlbGF0ZWQgcmVzb3VyY2VzIG9yIHByb2plY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2N3b3Jrc2V0Lmh0bSIgdGl0bGU9IiI+V29ya2luZyBTZXRzPC9hPi48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbCIgdGl0bGU9IllvdSBjYW4gZmlsdGVyIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLiI+RmlsdGVyaW5nIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jd29ya3NldC5odG0iPldvcmtpbmcgc2V0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXdmaWx0ZXJzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXdmaWx0ZXJzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMzc3YTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3ZmlsdGVycy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjanZpZXdmaWx0ZXJzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkZpbHRlcnMgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5Zb3UgY2FuIGZpbHRlciB0aGUgUHJvamVjdCBFeHBsb3Jlcg0KLXZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmZpbHRlcnM8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dmlld3M8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgZmlsdGVyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keSBvdXRwdXRjbGFzcz0iaWRfY29uYm9keSI+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPg0KLTxwPlRvIGVuYWJsZSBvciBkaXNhYmxlIGZpbHRlcnMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PG9sPg0KLTxsaT5PcGVuIHRoZSBTZWxlY3QgQ29tbW9uIE5hdmlnYXRvciBGaWx0ZXJzIHdpbmRvdyBieSBzZWxlY3RpbmcgPHVpY29udHJvbD5DdXN0b21pemUNCi1WaWV3Li4uPC91aWNvbnRyb2w+IGZyb20gdGhlIGRyb3AtZG93biBtZW51IGF0IHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZQ0KLXZpZXcuPC9saT4NCi08bGk+T24gdGhlIDx1aWNvbnRyb2w+RmlsdGVyczwvdWljb250cm9sPiB0YWIsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dA0KLXRvIHRoZSBmaWx0ZXJzIHlvdSB3YW50IHRvIGVuYWJsZS4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIDx1aWNvbnRyb2w+Q2xvc2VkDQotIHByb2plY3RzPC91aWNvbnRyb2w+IGZpbHRlciBpcyBlbmFibGVkLCBjbG9zZWQgcHJvamVjdHMgYXJlIG5vdCBzaG93biBpbg0KLXRoZSAgUHJvamVjdCBFeHBsb3JlciB2aWV3LiBPdGhlciBmaWx0ZXJzIGNhbiBoaWRlIGVtcHR5IHBhY2thZ2VzLCBub24tamF2YQ0KLWZpbGVzLCBhbmQgZmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5jbGFzcyIuPC9saT4NCi08bGk+T24gdGhlIEF2YWlsYWJsZSBFeHRlbnNpb25zIGFuZCBGaWx0ZXJzIHRhYiwgdGhlIGZpbHRlcnMgd29yayBpbiB0aGUgb3Bwb3NpdGUNCi13YXk6IHRoZSBzZWxlY3RlZCBjaGVjayBib3hlcyBkZXNjcmliZSB0aGUgcHJvamVjdHMsIGZvbGRlcnMsIGFuZCBmaWxlcyB0aGF0DQotYXJlIHNob3duIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuIEZvciBleGFtcGxlLCBpZiB5b3UgY2xlYXIgdGhlIGNoZWNrYm94DQotbmV4dCB0byA8dWljb250cm9sPkoyRUUgRGVwbG95bWVudCBEZXNjcmlwdG9yczwvdWljb250cm9sPiwgdGhlIGRlcGxveW1lbnQNCi1kZXNjcmlwdG9ycyBhcmUgaGlkZGVuIGZyb20gZWFjaCBwcm9qZWN0IGluIHRoZSB2aWV3LjwvbGk+DQotPC9vbD48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3ZmlsdGVycy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3ZmlsdGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFiYmEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2Nqdmlld2ZpbHRlcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkZpbHRlcnMgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGZpbHRlciB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHRvIGhpZGUgcHJvamVjdHMsIGZvbGRlcnMsIG9yIGZpbGVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHNlZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBmaWx0ZXIgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyB0byBoaWRlIHByb2plY3RzLCBmb2xkZXJzLCBvciBmaWxlcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBzZWUuIiAvPgotPG1ldGEgY29udGVudD0iZmlsdGVycywgUHJvamVjdCBFeHBsb3JlciB2aWV3LCB2aWV3cywgUHJvamVjdCBFeHBsb3JlciBmaWx0ZXJzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZmlsdGVycywgUHJvamVjdCBFeHBsb3JlciB2aWV3LCB2aWV3cywgUHJvamVjdCBFeHBsb3JlciBmaWx0ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjanZpZXdmaWx0ZXJzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RmlsdGVycyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjanZpZXdmaWx0ZXJzIj48YSBuYW1lPSJjanZpZXdmaWx0ZXJzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5GaWx0ZXJzIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfY29uYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBmaWx0ZXIgdGhlIFByb2plY3QgRXhwbG9yZXIKLXZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPGRpdiBjbGFzcz0icCI+VG8gZW5hYmxlIG9yIGRpc2FibGUgZmlsdGVycywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8b2w+Ci08bGk+T3BlbiB0aGUgU2VsZWN0IENvbW1vbiBOYXZpZ2F0b3IgRmlsdGVycyB3aW5kb3cgYnkgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZQotVmlldy4uLjwvc3Bhbj4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUgYXQgdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlCi12aWV3LjwvbGk+Ci0KLTxsaT5PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsdGVyczwvc3Bhbj4gdGFiLCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQKLXRvIHRoZSBmaWx0ZXJzIHlvdSB3YW50IHRvIGVuYWJsZS4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsb3NlZAotIHByb2plY3RzPC9zcGFuPiBmaWx0ZXIgaXMgZW5hYmxlZCwgY2xvc2VkIHByb2plY3RzIGFyZSBub3Qgc2hvd24gaW4KLXRoZSAgUHJvamVjdCBFeHBsb3JlciB2aWV3LiBPdGhlciBmaWx0ZXJzIGNhbiBoaWRlIGVtcHR5IHBhY2thZ2VzLCBub24tamF2YQotZmlsZXMsIGFuZCBmaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLmNsYXNzIi48L2xpPgotCi08bGk+T24gdGhlIEF2YWlsYWJsZSBFeHRlbnNpb25zIGFuZCBGaWx0ZXJzIHRhYiwgdGhlIGZpbHRlcnMgd29yayBpbiB0aGUgb3Bwb3NpdGUKLXdheTogdGhlIHNlbGVjdGVkIGNoZWNrIGJveGVzIGRlc2NyaWJlIHRoZSBwcm9qZWN0cywgZm9sZGVycywgYW5kIGZpbGVzIHRoYXQKLWFyZSBzaG93biBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyIHRoZSBjaGVja2JveAotbmV4dCB0byA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KMkVFIERlcGxveW1lbnQgRGVzY3JpcHRvcnM8L3NwYW4+LCB0aGUgZGVwbG95bWVudAotZGVzY3JpcHRvcnMgYXJlIGhpZGRlbiBmcm9tIGVhY2ggcHJvamVjdCBpbiB0aGUgdmlldy48L2xpPgotCi08L29sPgotPC9kaXY+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jdHlwZXNvZmFubm8uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2N0eXBlc29mYW5uby5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTI4OGJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2N0eXBlc29mYW5uby5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjamF2YWVlNSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5UeXBlcyBvZiBhbm5vdGF0aW9uczwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1IGRlZmluZXMgYSBudW1iZXIgb2YgdHlwZXMgb3IgZ3JvdXBzDQotb2YgYW5ub3RhdGlvbnMsIGRlZmluZWQgaW4gYSBudW1iZXIgb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU3BlY2lmaWNhdGlvbiBSZXF1ZXN0cyAoSlNScykuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SmF2YSBFRSA1PGluZGV4dGVybT5hbm5vdGF0aW9uczxpbmRleHRlcm0+dHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHkgb3V0cHV0Y2xhc3M9ImlkX2NvbmJvZHkiPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4NCi08cD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUNCi01IGRlZmluZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBhbm5vdGF0aW9uczo8L3A+DQotPHVsPg0KLTxsaT5KU1IgMjUwOiBDb21tb24gYW5ub3RhdGlvbnM8Yj48L2I+PC9saT4NCi08bGk+SlNSLTIyMDogRUpCIDMuMCBhbm5vdGF0aW9uczwvbGk+DQotPGxpPkpTUi0xODE6IFdlYiBTZXJ2aWNlcyBhbm5vdGF0aW9uczwvbGk+DQotPGxpPkpTUi0yMjA6IEphdmEgUGVyc2lzdGVuY2UgQVBJIGFubm90YXRpb25zPC9saT4NCi08bGk+SlNSLTIyMjogSmF4QiBhbm5vdGF0aW9uczwvbGk+DQotPGxpPkpTUi0yMjQ6IFdTMiBhbm5vdGF0aW9uczwvbGk+DQotPC91bD4NCi08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSA1LjAsIHNlZSB0aGUgb2ZmaWNpYWwgc3BlY2lmaWNhdGlvbjogPHhyZWYNCi1ocmVmPSJodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTI0NCIgc2NvcGU9ImV4dGVybmFsIj5KU1IgMjQ0OiA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBQbGF0Zm9ybSwNCi1FbnRlcnByaXNlIEVkaXRpb24gNSAoPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgNSkgU3BlY2lmaWNhdGlvbjwveHJlZj48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY3R5cGVzb2Zhbm5vLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jdHlwZXNvZmFubm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNjIzYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jdHlwZXNvZmFubm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlR5cGVzIG9mIGFubm90YXRpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkphdmEgRUUgNSBkZWZpbmVzIGEgbnVtYmVyIG9mIHR5cGVzIG9yIGdyb3VwcyBvZiBhbm5vdGF0aW9ucywgZGVmaW5lZCBpbiBhIG51bWJlciBvZiBKYXZhIFNwZWNpZmljYXRpb24gUmVxdWVzdHMgKEpTUnMpLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJKYXZhIEVFIDUgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlcyBvciBncm91cHMgb2YgYW5ub3RhdGlvbnMsIGRlZmluZWQgaW4gYSBudW1iZXIgb2YgSmF2YSBTcGVjaWZpY2F0aW9uIFJlcXVlc3RzIChKU1JzKS4iIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFIDUsIGFubm90YXRpb25zLCB0eXBlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRUUgNSwgYW5ub3RhdGlvbnMsIHR5cGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RkZWZpbmluZ2Fubm90YXRpb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2phdmFlZTUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5UeXBlcyBvZiBhbm5vdGF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2phdmFlZTUiPjxhIG5hbWU9ImNqYXZhZWU1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5UeXBlcyBvZiBhbm5vdGF0aW9uczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9jb25ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5KYXZh4oSiIEVFIDUgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlcyBvciBncm91cHMKLW9mIGFubm90YXRpb25zLCBkZWZpbmVkIGluIGEgbnVtYmVyIG9mIEphdmEgU3BlY2lmaWNhdGlvbiBSZXF1ZXN0cyAoSlNScykuPC9wPgotCi08cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotCi08cD5KYXZhIEVFCi01IGRlZmluZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBhbm5vdGF0aW9uczo8L3A+Ci0KLTx1bD4KLTxsaT5KU1IgMjUwOiBDb21tb24gYW5ub3RhdGlvbnM8c3Ryb25nIC8+PC9saT4KLQotPGxpPkpTUi0yMjA6IEVKQiAzLjAgYW5ub3RhdGlvbnM8L2xpPgotCi08bGk+SlNSLTE4MTogV2ViIFNlcnZpY2VzIGFubm90YXRpb25zPC9saT4KLQotPGxpPkpTUi0yMjA6IEphdmEgUGVyc2lzdGVuY2UgQVBJIGFubm90YXRpb25zPC9saT4KLQotPGxpPkpTUi0yMjI6IEpheEIgYW5ub3RhdGlvbnM8L2xpPgotCi08bGk+SlNSLTIyNDogV1MyIGFubm90YXRpb25zPC9saT4KLQotPC91bD4KLQotPHA+Rm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gSmF2YSBFRSA1LjAsIHNlZSB0aGUgb2ZmaWNpYWwgc3BlY2lmaWNhdGlvbjogPGEgaHJlZj0iaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yNDQiIHRhcmdldD0iX2JsYW5rIj5KU1IgMjQ0OiBKYXZhIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gNSAoSmF2YSBFRSA1KSBTcGVjaWZpY2F0aW9uPC9hPjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RkZWZpbmluZ2Fubm90YXRpb25zLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgQEludGVyZmFjZSBhbm5vdGF0aW9uIHRvIGRlZmluZSB5b3VyIG93biBhbm5vdGF0aW9uIGRlZmluaXRpb24uIj5EZWZpbmluZyBhbmQgdXNpbmcgYW5ub3RhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1pbXBvcnRleHBvcnQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzYzM5Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1pbXBvcnRleHBvcnQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCFET0NUWVBFIHRvcGljIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRvcGljLy9FTiINCi0gInRvcGljLmR0ZCI+DQotPHRvcGljIGlkPSJwaC1pbXBvcnRleHBvcnQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzDQotYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGJvZHkgb3V0cHV0Y2xhc3M9ImlkX2JvZHkiPg0KLTxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+DQotPC9ib2R5Pg0KLTwvdG9waWM+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1MGVkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1pbXBvcnRleHBvcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0b3BpYyIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBwcm9qZWN0cyBhbmQgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGVzZSB0b3BpY3MgY292ZXIgaG93IHRvIGltcG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgaW50byB0aGUgd29ya2JlbmNoIGFuZCBleHBvcnQgZmlsZXMgYW5kIHByb2plY3RzIHRvIGRpc2suIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amV4cGVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpleHByYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqaW1wZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXByYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlaW1wLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlZXhwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamNpcmNsZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjaXJjbGViLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icGgtaW1wb3J0ZXhwb3J0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwaC1pbXBvcnRleHBvcnQiPjxhIG5hbWU9InBoLWltcG9ydGV4cG9ydCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzCi1hbmQgcHJvamVjdHMgaW50byB0aGUgd29ya2JlbmNoIGFuZCBleHBvcnQgZmlsZXMgYW5kIHByb2plY3RzIHRvIGRpc2suPC9wPgotCi08cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotCi08cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotCi08L2Rpdj4KLQotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cGFwcC5odG1sIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cGVhci5odG1sIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9hPjwvc3Ryb25nPjxiciAvPgotRW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgYXJlIGRlcGxveWVkIGluIHRoZSBmb3JtIG9mIGFuIEVBUiBmaWxlLiBVc2UgdGhlIEV4cG9ydCB3aXphcmQgdG8gZXhwb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuIEVBUiBmaWxlIGZvciBkZXBsb3ltZW50LjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cHJhci5odG1sIj5FeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlczwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBjYW4gZXhwb3J0IGEgY29ubmVjdG9yIHByb2plY3QgdG8gYSBSQVIgZmlsZSBpbiBwcmVwYXJhdGlvbiBmb3IgZGVwbG95aW5nIGl0IHRvIGEgc2VydmVyLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGVhci5odG1sIj5JbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZTwvYT48L3N0cm9uZz48YnIgLz4KLUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L3N0cm9uZz48YnIgLz4KLUFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgYXMgSkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGppbXByYXIuaHRtbCI+SW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Db25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIGRlcGxveWVkIFJBUiBmaWxlLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuaHRtbCI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5odG1sIj5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWltcC5odG1sIj5JbXBvcnRpbmcgRUpCIEpBUiBmaWxlczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlZXhwLmh0bWwiPkV4cG9ydGluZyBFSkIgcHJvamVjdHMgdG8gRUpCIEpBUiBmaWxlczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9jamNpcmNsZS5odG1sIj5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKYXZhIEVFIG1vZHVsZXM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1BIGN5Y2xpY2FsIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gbW9zdCBjb21tb25seSBvY2N1cnMgd2hlbiBwcm9qZWN0cyBhcmUgaW1wb3J0ZWQgZnJvbSBvdXRzaWRlIHRoZSBXb3JrYmVuY2guPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqY2lyY2xlYi5odG1sIj5Db3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQ8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIHJlc29sdmUgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZiB0aGUgdHlwZXMgb2YgcHJvamVjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiI+V29ya2luZyB3aXRoIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWoyZWVhcHAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWoyZWVhcHAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2YjRlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1qMmVlYXBwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRvcGljIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRvcGljLy9FTiINCi0gInRvcGljLmR0ZCI+DQotPHRvcGljIGlkPSJwaC1qMmVlYXBwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkphdmEgRUUgYXBwbGljYXRpb25zPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZXNlIHRvcGljcyBkZWFsIHdpdGggdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVudGVycHJpc2UNCi1FZGl0aW9uIChKYXZhIEVFKS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxib2R5IG91dHB1dGNsYXNzPSJpZF9ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvYm9keT4NCi08L3RvcGljPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWoyZWVhcHAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLWoyZWVhcHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjZjNmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1qMmVlYXBwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idG9waWMiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSmF2YSBFRSBhcHBsaWNhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlc2UgdG9waWNzIGRlYWwgd2l0aCB0aGUgSmF2YSBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkuIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phdmFlZTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2pwZXJzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9janZpZXcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3Rqdmlld2ZpbHRlcnMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3BoLXByb2plY3RzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZhbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcGgtcmVmLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icGgtajJlZWFwcCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkphdmEgRUUgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwaC1qMmVlYXBwIj48YSBuYW1lPSJwaC1qMmVlYXBwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5KYXZhIEVFIGFwcGxpY2F0aW9uczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZh4oSiIEVudGVycHJpc2UKLUVkaXRpb24gKEphdmEgRUUpLjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2phdmFlZTUuaHRtbCI+RGV2ZWxvcGluZyBKYXZhIEVFIDUgQXBwbGljYXRpb25zPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIEphdmEgRUUgNSBwcm9ncmFtbWluZyBtb2RlbCBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIEphdmEgYXBwbGljYXRpb25zLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2pwZXJzLmh0bWwiPkphdmEgRUUgcGVyc3BlY3RpdmU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSBpbmNsdWRlcyB3b3JrYmVuY2ggdmlld3MgdGhhdCB5b3UgY2FuIHVzZSB3aGVuIGRldmVsb3BpbmcgcmVzb3VyY2VzIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgRUpCIG1vZHVsZXMsIFdlYiBtb2R1bGVzLCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywgYW5kIGNvbm5lY3RvciBwcm9qZWN0cyBvciBtb2R1bGVzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9janZpZXcuaHRtbCI+UHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlPC9hPjwvc3Ryb25nPjxiciAvPgotV2hpbGUgZGV2ZWxvcGluZyBKMkVFIGFwcGxpY2F0aW9ucyBpbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBpcyB5b3VyIG1haW4gdmlldyBvZiB5b3VyIEoyRUUgcHJvamVjdHMgYW5kIHJlc291cmNlcy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGp2aWV3ZmlsdGVycy5odG1sIj5GaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBjYW4gZmlsdGVyIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIj5Xb3JraW5nIHdpdGggcHJvamVjdHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGUgd29ya2JlbmNoIGNhbiB3b3JrIHdpdGggbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgdG9waWNzIGNvdmVyIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzb21lIG9mIHRoZSB0eXBlcyBvZiBwcm9qZWN0cyByZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLVRoZSB3b3JrYmVuY2ggaW5jbHVkZXMgdmFsaWRhdG9ycyB0aGF0IGNoZWNrIGNlcnRhaW4gZmlsZXMgaW4geW91ciBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vZHVsZSBwcm9qZWN0cyBmb3IgZXJyb3JzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9waC1yZWYuaHRtbCI+UmVmZXJlbmNlPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIGZvbGxvd2luZyByZWZlcmVuY2UgbWF0ZXJpYWwgb24gSjJFRSBpcyBhdmFpbGFibGU6PC9saT4KLTwvdWw+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzU3MmZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhRE9DVFlQRSB0b3BpYyBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUb3BpYy8vRU4iDQotICJ0b3BpYy5kdGQiPg0KLTx0b3BpYyBpZD0icGhwcm9qZWN0cyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5Xb3JraW5nIHdpdGggcHJvamVjdHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50DQotdHlwZXMgb2YgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgdG9waWNzIGNvdmVyIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzb21lIG9mDQotdGhlIHR5cGVzIG9mIHByb2plY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxib2R5IG91dHB1dGNsYXNzPSJpZF9ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvYm9keT4NCi08L3RvcGljPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM4NjFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idG9waWMiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIHByb2plY3RzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSB3b3JrYmVuY2ggY2FuIHdvcmsgd2l0aCBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyB0b3BpY3MgY292ZXIgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNvbWUgb2YgdGhlIHR5cGVzIG9mIHByb2plY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIHdvcmtiZW5jaCBjYW4gd29yayB3aXRoIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZiB0aGUgdHlwZXMgb2YgcHJvamVjdHMgcmVsYXRlZCB0byBKMkVFIGRldmVsb3BtZW50LiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3BoLWoyZWVhcHAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anJhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NmYWNldHMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InBocHJvamVjdHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBocHJvamVjdHMiPjxhIG5hbWU9InBocHJvamVjdHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPldvcmtpbmcgd2l0aCBwcm9qZWN0czwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF9ib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGUgd29ya2JlbmNoIGNhbiB3b3JrIHdpdGggbWFueSBkaWZmZXJlbnQKLXR5cGVzIG9mIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIHRvcGljcyBjb3ZlciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc29tZSBvZgotdGhlIHR5cGVzIG9mIHByb2plY3RzIHJlbGF0ZWQgdG8gSjJFRSBkZXZlbG9wbWVudC48L3A+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvc3Ryb25nPjxiciAvPgotQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRpZXMgdG9nZXRoZXIgdGhlIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbSBhIHNlcnZlcidzIHRvb2xzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Vc2luZyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYWxsb3dzIHlvdSB0byBwYWNrYWdlIG1hbnkgd2ViIGFwcGxpY2F0aW9ucyBhbmQgbW9kdWxlcyBpbiBhIHByb2plY3QgYW5kIGRlcGxveSB0aGVzZSBtb2R1bGVzIGFzIGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqcmFyLmh0bWwiPkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci1BIGNvbm5lY3RvciBpcyBhIEoyRUUgc3RhbmRhcmQgZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3IgY29udGFpbmVycyB0byBwcm92aWRlIGNvbm5lY3Rpdml0eSB0byBlbnRlcnByaXNlIGluZm9ybWF0aW9uIHN5c3RlbXMgKEVJU3MpLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sIj5TcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzPC9hPjwvc3Ryb25nPjxiciAvPgotV2hlbiB5b3UgZGV2ZWxvcCBKMkVFIGFwcGxpY2F0aW9ucywgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHMgZm9yIHlvdXIgSjJFRSBwcm9qZWN0cy4gVGhlIHRhcmdldCBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uIGFuZCBpbXBvcnQsIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLiBUaGUgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGUgY2xhc3MgcGF0aCBmb3IgSjJFRSBwcm9qZWN0cy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY2ZhY2V0cy5odG1sIj5Qcm9qZWN0IGZhY2V0czwvYT48L3N0cm9uZz48YnIgLz4KLUZhY2V0cyBkZWZpbmUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXF1aXJlbWVudHMgZm9yIEphdmEgRUUgcHJvamVjdHMgYW5kIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwiPkltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHByb2plY3RzIGFuZCBmaWxlczwvYT48L3N0cm9uZz48YnIgLz4KLVRoZXNlIHRvcGljcyBjb3ZlciBob3cgdG8gaW1wb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIGV4cG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgdG8gZGlzay48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkuIj5KYXZhIEVFIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1yZWYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXJlZi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY4YzhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXJlZi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IURPQ1RZUEUgdG9waWMgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVG9waWMvL0VOIg0KLSAidG9waWMuZHRkIj4NCi08dG9waWMgaWQ9InBoLXJlZiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5SZWZlcmVuY2U8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIGZvbGxvd2luZyByZWZlcmVuY2UgbWF0ZXJpYWwgb24NCi1KMkVFIGlzIGF2YWlsYWJsZTo8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxib2R5IG91dHB1dGNsYXNzPSJpZF9ib2R5Ij4NCi08cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+DQotPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPg0KLTwvYm9keT4NCi08L3RvcGljPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXJlZi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcmVmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjllOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcmVmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idG9waWMiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVmZXJlbmNlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlIG1hdGVyaWFsIG9uIEoyRUUgaXMgYXZhaWxhYmxlOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgZm9sbG93aW5nIHJlZmVyZW5jZSBtYXRlcmlhbCBvbiBKMkVFIGlzIGF2YWlsYWJsZToiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJwaC1yZWYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBoLXJlZiI+PGEgbmFtZT0icGgtcmVmIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5SZWZlcmVuY2U8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIGZvbGxvd2luZyByZWZlcmVuY2UgbWF0ZXJpYWwgb24KLUoyRUUgaXMgYXZhaWxhYmxlOjwvcD4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotPHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCI+SjJFRSBWYWxpZGF0b3JzPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YWJsZSBsaXN0cyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBkaWZmZXJlbnQgcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBlYWNoIHZhbGlkYXRvci48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L3N0cm9uZz48YnIgLz4KLVRoaXMgdGFibGUgbGlzdHMgdGhlIGNvbW1vbiBlcnJvciBtZXNzYWdlcyB5b3UgbWF5IGVuY291bnRlciB3aGVuIHlvdSB2YWxpZGF0ZSB5b3VyIHByb2plY3RzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9yamxpbWl0Y3VycmVudC5odG1sIj5MaW1pdGF0aW9ucyBvZiBKMkVFIGRldmVsb3BtZW50IHRvb2xzPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMgZm9yIEoyRUUgdG9vbGluZy48L2xpPgotPC91bD4KLQotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9waC1qMmVlYXBwLmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgZGVhbCB3aXRoIHRoZSBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiAoSmF2YSBFRSkuIj5KYXZhIEVFIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcmpsaW1pdGN1cnJlbnQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYWQwOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJqbGltaXRjdXJyZW50IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zDQotYW5kIHJlc3RyaWN0aW9ucyBmb3IgSjJFRSB0b29saW5nLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkoyRUU8aW5kZXh0ZXJtPnRvb2wgbGltaXRhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHkgb3V0cHV0Y2xhc3M9ImlkX3JlZmJvZHkiPg0KLTxzZWN0aW9uIG91dHB1dGNsYXNzPSJpZF9zcGFjZXNMaW1pdGF0aW9uIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+PHRpdGxlPlNwYWNlcw0KLW5vdCBzdXBwb3J0ZWQgaW4gSkFSIFVSSXMgd2l0aGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb248L3RpdGxlPlNwYWNlcyBhcmUNCi1ub3Qgc3VwcG9ydGVkIGluIHRoZSBVUkkgZm9yIG1vZHVsZXMgb3IgdXRpbGl0eSBKQVIgZmlsZXMgaW4gYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uLiBUaGUgIkNsYXNzLVBhdGg6IiBhdHRyaWJ1dGUgb2YgYSBNQU5JRkVTVC5NRiBmaWxlIGluIGEgSkFSIGZpbGUNCi1vciBtb2R1bGUgaXMgYSBzcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB3aXRoaW4gYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uLiBBIEpBUiBmaWxlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlZmVyZW5jZSBhbm90aGVyIEpBUiBmaWxlIGluDQotdGhlIEVBUiBpZiB0aGUgVVJJIG9mIHRoZSByZWZlcmVuY2VkIEpBUiBmaWxlIGNvbnRhaW5lZCBzcGFjZXMuPC9zZWN0aW9uPg0KLTxzZWN0aW9uIG91dHB1dGNsYXNzPSJpZF9FQVJEQkNTTGltaXRhdGlvbiI+PHRpdGxlPkVudGVycHJpc2UgYXBwbGljYXRpb24NCi1wcm9qZWN0IG5hbWVzIHNob3VsZCBub3QgY29udGFpbiBEQkNTIGNoYXJhY3RlcnM8L3RpdGxlPjxwIGlkPSJsaW1pdGF0aW9uX2Vhcl9kYmNzIj5XaGVuDQoteW91IGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvDQotbm90IGdpdmUgaXQgYSBuYW1lIHRoYXQgY29udGFpbnMgZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHNldCAoREJDUykgY2hhcmFjdGVycy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uIG91dHB1dGNsYXNzPSJpZF91dGlsaXR5SkFSTGltaXRhdGlvbiI+PHRpdGxlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkDQotcGF0aCB1cGRhdGVzIHdoZW4gcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYSBVdGlsaXR5IEpBUiBmaWxlPC90aXRsZT5XaGVuDQotcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYSBVdGlsaXR5IEpBUiwgdGhlIGNvcnJlc3BvbmRpbmcgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdA0KLXdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBwYXRoIG9ubHkgaWYgdGhlIGRlcGVuZGVudCBKQVINCi1pcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoZSBFQVIgcHJvamVjdC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSBhDQotSjJFRSAxLjMgV2ViIHByb2plY3QgYW5kIEVBUiBhbG9uZyB3aXRoIHRoZSBKVW5pdCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFeGFtcGxlIHByb2plY3QuIE5leHQsIGFkZCB0aGUgSlVuaXQNCi1wcm9qZWN0IGFzIGEgVXRpbGl0eSBKQVIgaW4gdGhlIEVBUiwgdGhlbiBhZGQgSlVuaXQgYXMgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBKQVINCi1EZXBlbmRlbmN5IG9mIHRoZSBXZWIgcHJvamVjdC4gSWYgeW91IHRoZW4gd2FudGVkIHRvIHJlbW92ZSB0aGUgZGVwZW5kZW5jeQ0KLWJldHdlZW4gSlVuaXQgYW5kIHRoZSBXZWIgcHJvamVjdCwgcmVtb3ZlIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBKQVIgRGVwZW5kZW5jeSBmcm9tIHRoZSBXZWIgcHJvamVjdA0KLWZpcnN0LCB0aGVuIHJlbW92ZSB0aGUgVXRpbGl0eSBKQVIgZnJvbSB0aGUgRUFSLiBGb2xsb3cgdGhpcyBvcmRlciB0byBlbnN1cmUNCi10aGF0IHRoaXMgd29ya3MgY29ycmVjdGx5Ljwvc2VjdGlvbj4NCi08c2VjdGlvbiBvdXRwdXRjbGFzcz0iaWRfSkFSZGVwTGltaXRhdGlvbiI+PHRpdGxlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEpBUiBEZXBlbmRlbmNpZXMgcGFnZSBmYWlscyB0byB1cGRhdGUgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQNCi1wYXRoPC90aXRsZT5UaGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gSkFSIERlcGVuZGVuY2llcyBwYWdlIGlzIG5vdCBzeW5jaHJvbml6ZWQgd2l0aA0KLXRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQNCi1wYXRoIHBhZ2UgaW4gdGhlIHByb2plY3QgcHJvcGVydGllcyBkaWFsb2cuIFRoZXJlZm9yZSwgYSBjaGFuZ2UgYXBwbGllZCBpbg0KLW9uZSBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgb3RoZXIgd2l0aGluIHRoZSBzYW1lIGRpYWxvZyBzZXNzaW9uLiBUaGVyZQ0KLWFyZSBhbHNvIHNvbWUgaW5zdGFuY2VzIHdoZXJlIGZsaXBwaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHBhZ2VzIHdpbGwNCi1jYXVzZSB0aGUgdXBkYXRlIGZyb20gb25lIHRvIGNhbmNlbCBvdXQgdGhlIHVwZGF0ZSBmcm9tIGFub3RoZXIgd2hlbiB0aGUgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBidXR0b24NCi1pcyBjbGlja2VkIG9yIGlmIHRoZSA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+IGJ1dHRvbiBpcyBjbGlja2VkIHByaW9yDQotdG8gdGhlIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYnV0dG9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGFwcGVhciBhcyBpZg0KLWEgSkFSIGRlcGVuZGVuY3kgd2FzIGFkZGVkLCBidXQgdGhlIHByb2plY3QgZGlkIG5vdCBnZXQgYWRkZWQgdG8gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkDQotcGF0aC4gVGhlIHdvcmthcm91bmQgaXMgdG8gcmVvcGVuIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZ3MsIHN3aXRjaCB0byB0aGUgSkFSDQotZGVwZW5kZW5jeSBwYWdlLCBjbGVhciBhbmQgcmUtc2VsZWN0IHRoZSBkZXBlbmRlbnQgSkFSIGZpbGVzLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9zZWN0aW9uPg0KLTxzZWN0aW9uIG91dHB1dGNsYXNzPSJpZF9sb2NhdGlvbkxpbWl0YXRpb24iPjx0aXRsZT4nSW52YWxpZCBwcm9qZWN0IGRlc2NyaXB0aW9uJw0KLWVycm9yIHdoZW4gdXNpbmcgYSBub24tZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uIGZvciBhIG5ldyBKMkVFIHByb2plY3Q8L3RpdGxlPldoZW4NCi15b3UgY3JlYXRlIGEgbmV3IEoyRUUgcHJvamVjdCAoaW5jbHVkaW5nIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+LCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCBEeW5hbWljIFdlYiwNCi1FSkIsIGFwcGxpY2F0aW9uIGNsaWVudCwgYW5kIGNvbm5lY3RvciBwcm9qZWN0cyksIHlvdSBjYW5ub3QgdXNlIGEgcHJvamVjdA0KLWxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLiBJZiB5b3UNCi1jaG9vc2UgYSBwcm9qZWN0IGxvY2F0aW9uIHRoYXQgaXMgdXNlZCBieSBhbm90aGVyIHByb2plY3QsIHRoZSB3aXphcmQgZGlzcGxheXMNCi1hbiAiSW52YWxpZCBwcm9qZWN0IGRlc2NyaXB0aW9uIiBlcnJvciBkaWFsb2cgb3IgbWVzc2FnZS4gSWYgYWZ0ZXIgeW91IHJlY2VpdmUNCi10aGlzIG1lc3NhZ2UgeW91IHRoZW4gc2VsZWN0IGEgdmFsaWQgcHJvamVjdCBsb2NhdGlvbiBieSBjbGlja2luZyB0aGUgQnJvd3NlDQotYnV0dG9uLCB0aGUgcHJvamVjdCBjcmVhdGlvbiB3aWxsIHN0aWxsIG5vdCBmaW5pc2guIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGNsaWNrDQotQ2FuY2VsIGFuZCByZW9wZW4gdGhlIHByb2plY3QgY3JlYXRpb24gd2l6YXJkLjwvc2VjdGlvbj4NCi08ZXhhbXBsZSBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L2V4YW1wbGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3JqbGltaXRjdXJyZW50Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQ2YmFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3JqbGltaXRjdXJyZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMgZm9yIEoyRUUgdG9vbGluZy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMgZm9yIEoyRUUgdG9vbGluZy4iIC8+Ci08bWV0YSBjb250ZW50PSJKMkVFLCB0b29sIGxpbWl0YXRpb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iSjJFRSwgdG9vbCBsaW1pdGF0aW9ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmpsaW1pdGN1cnJlbnQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBKMkVFIGRldmVsb3BtZW50IHRvb2xzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyamxpbWl0Y3VycmVudCI+PGEgbmFtZT0icmpsaW1pdGN1cnJlbnQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHM8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfcmVmYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhpcyB0b3BpYyBvdXRsaW5lcyBjdXJyZW50IGtub3duIGxpbWl0YXRpb25zCi1hbmQgcmVzdHJpY3Rpb25zIGZvciBKMkVFIHRvb2xpbmcuPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9zcGFjZXNMaW1pdGF0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3BhY2VzCi1ub3Qgc3VwcG9ydGVkIGluIEpBUiBVUklzIHdpdGhpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uPC9oND48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotU3BhY2VzIGFyZQotbm90IHN1cHBvcnRlZCBpbiB0aGUgVVJJIGZvciBtb2R1bGVzIG9yIHV0aWxpdHkgSkFSIGZpbGVzIGluIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uLiBUaGUgIkNsYXNzLVBhdGg6IiBhdHRyaWJ1dGUgb2YgYSBNQU5JRkVTVC5NRiBmaWxlIGluIGEgSkFSIGZpbGUKLW9yIG1vZHVsZSBpcyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHdpdGhpbiBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbi4gQSBKQVIgZmlsZSB3b3VsZCBub3QgYmUgYWJsZSB0byByZWZlcmVuY2UgYW5vdGhlciBKQVIgZmlsZSBpbgotdGhlIEVBUiBpZiB0aGUgVVJJIG9mIHRoZSByZWZlcmVuY2VkIEpBUiBmaWxlIGNvbnRhaW5lZCBzcGFjZXMuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX0VBUkRCQ1NMaW1pdGF0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCBuYW1lcyBzaG91bGQgbm90IGNvbnRhaW4gREJDUyBjaGFyYWN0ZXJzPC9oND48cCBpZD0icmpsaW1pdGN1cnJlbnRfX2xpbWl0YXRpb25fZWFyX2RiY3MiPjxhIG5hbWU9InJqbGltaXRjdXJyZW50X19saW1pdGF0aW9uX2Vhcl9kYmNzIj48IS0tIC0tPjwvYT5XaGVuCi15b3UgY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG8KLW5vdCBnaXZlIGl0IGEgbmFtZSB0aGF0IGNvbnRhaW5zIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBzZXQgKERCQ1MpIGNoYXJhY3RlcnMuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX3V0aWxpdHlKQVJMaW1pdGF0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SmF2YeKEoiBidWlsZAotcGF0aCB1cGRhdGVzIHdoZW4gcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYSBVdGlsaXR5IEpBUiBmaWxlPC9oND5XaGVuCi1yZW1vdmluZyB0aGUgZGVwZW5kZW5jeSBvbiBhIFV0aWxpdHkgSkFSLCB0aGUgY29ycmVzcG9uZGluZyBKYXZhIHByb2plY3QKLXdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBKYXZhIGJ1aWxkIHBhdGggb25seSBpZiB0aGUgZGVwZW5kZW50IEpBUgotaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgRUFSIHByb2plY3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBjcmVhdGUgYQotSjJFRSAxLjMgV2ViIHByb2plY3QgYW5kIEVBUiBhbG9uZyB3aXRoIHRoZSBKVW5pdCBKYXZhIEV4YW1wbGUgcHJvamVjdC4gTmV4dCwgYWRkIHRoZSBKVW5pdAotcHJvamVjdCBhcyBhIFV0aWxpdHkgSkFSIGluIHRoZSBFQVIsIHRoZW4gYWRkIEpVbml0IGFzIGEgSmF2YSBKQVIKLURlcGVuZGVuY3kgb2YgdGhlIFdlYiBwcm9qZWN0LiBJZiB5b3UgdGhlbiB3YW50ZWQgdG8gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5Ci1iZXR3ZWVuIEpVbml0IGFuZCB0aGUgV2ViIHByb2plY3QsIHJlbW92ZSB0aGUgSmF2YSBKQVIgRGVwZW5kZW5jeSBmcm9tIHRoZSBXZWIgcHJvamVjdAotZmlyc3QsIHRoZW4gcmVtb3ZlIHRoZSBVdGlsaXR5IEpBUiBmcm9tIHRoZSBFQVIuIEZvbGxvdyB0aGlzIG9yZGVyIHRvIGVuc3VyZQotdGhhdCB0aGlzIHdvcmtzIGNvcnJlY3RseS48L2Rpdj4KLQotPGRpdiBjbGFzcz0iaWRfSkFSZGVwTGltaXRhdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkphdmEgSkFSIERlcGVuZGVuY2llcyBwYWdlIGZhaWxzIHRvIHVwZGF0ZSBKYXZhIGJ1aWxkCi1wYXRoPC9oND5UaGUgSmF2YSBKQVIgRGVwZW5kZW5jaWVzIHBhZ2UgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoCi10aGUgSmF2YSBidWlsZAotcGF0aCBwYWdlIGluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgZGlhbG9nLiBUaGVyZWZvcmUsIGEgY2hhbmdlIGFwcGxpZWQgaW4KLW9uZSBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgb3RoZXIgd2l0aGluIHRoZSBzYW1lIGRpYWxvZyBzZXNzaW9uLiBUaGVyZQotYXJlIGFsc28gc29tZSBpbnN0YW5jZXMgd2hlcmUgZmxpcHBpbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgcGFnZXMgd2lsbAotY2F1c2UgdGhlIHVwZGF0ZSBmcm9tIG9uZSB0byBjYW5jZWwgb3V0IHRoZSB1cGRhdGUgZnJvbSBhbm90aGVyIHdoZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBidXR0b24KLWlzIGNsaWNrZWQgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiBidXR0b24gaXMgY2xpY2tlZCBwcmlvcgotdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBidXR0b24uIFR5cGljYWxseSB0aGlzIHdpbGwgYXBwZWFyIGFzIGlmCi1hIEpBUiBkZXBlbmRlbmN5IHdhcyBhZGRlZCwgYnV0IHRoZSBwcm9qZWN0IGRpZCBub3QgZ2V0IGFkZGVkIHRvIHRoZSBKYXZhIGJ1aWxkCi1wYXRoLiBUaGUgd29ya2Fyb3VuZCBpcyB0byByZW9wZW4gdGhlIHByb3BlcnRpZXMgZGlhbG9ncywgc3dpdGNoIHRvIHRoZSBKQVIKLWRlcGVuZGVuY3kgcGFnZSwgY2xlYXIgYW5kIHJlLXNlbGVjdCB0aGUgZGVwZW5kZW50IEpBUiBmaWxlcywgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX2xvY2F0aW9uTGltaXRhdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPidJbnZhbGlkIHByb2plY3QgZGVzY3JpcHRpb24nCi1lcnJvciB3aGVuIHVzaW5nIGEgbm9uLWRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiBmb3IgYSBuZXcgSjJFRSBwcm9qZWN0PC9oND5XaGVuCi15b3UgY3JlYXRlIGEgbmV3IEoyRUUgcHJvamVjdCAoaW5jbHVkaW5nIEphdmEsIGVudGVycHJpc2UgYXBwbGljYXRpb24sIER5bmFtaWMgV2ViLAotRUpCLCBhcHBsaWNhdGlvbiBjbGllbnQsIGFuZCBjb25uZWN0b3IgcHJvamVjdHMpLCB5b3UgY2Fubm90IHVzZSBhIHByb2plY3QKLWxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLiBJZiB5b3UKLWNob29zZSBhIHByb2plY3QgbG9jYXRpb24gdGhhdCBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvamVjdCwgdGhlIHdpemFyZCBkaXNwbGF5cwotYW4gIkludmFsaWQgcHJvamVjdCBkZXNjcmlwdGlvbiIgZXJyb3IgZGlhbG9nIG9yIG1lc3NhZ2UuIElmIGFmdGVyIHlvdSByZWNlaXZlCi10aGlzIG1lc3NhZ2UgeW91IHRoZW4gc2VsZWN0IGEgdmFsaWQgcHJvamVjdCBsb2NhdGlvbiBieSBjbGlja2luZyB0aGUgQnJvd3NlCi1idXR0b24sIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpbGwgc3RpbGwgbm90IGZpbmlzaC4gVGhlIHdvcmthcm91bmQgaXMgdG8gY2xpY2sKLUNhbmNlbCBhbmQgcmVvcGVuIHRoZSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZC48L2Rpdj4KLQotPGRpdiBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnR1bmV2YWxpZGF0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydHVuZXZhbGlkYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0ZjJkZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydHVuZXZhbGlkYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJydHVuZXZhbGlkYXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlR1bmluZyB2YWxpZGF0b3JzPC90aXRsZT4NCi08c2hvcnRkZXNjPldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcw0KLW9uIHRoZSBmaWx0ZXJzIHRoYXQgYXJlIGluIHBsYWNlIGZvciB0aGF0IHZhbGlkYXRvci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb2RlIHZhbGlkYXRpb248aW5kZXh0ZXJtPnR1bmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dmFsaWRhdGlvbjxpbmRleHRlcm0+dHVuaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjxwPldoZW4gYSB2YWxpZGF0b3IgaXMgZmlyc3QgZGV2ZWxvcGVkLCB0aGUgaW1wbGVtZW50ZXIgb2YgdGhlIHZhbGlkYXRvcg0KLWRlZmluZXMgYSBkZWZhdWx0IHNldCBvZiBmaWx0ZXJzLiBUaGVzZSBmaWx0ZXJzIG1heSBiZSBiYXNlZCBvbjo8dWw+DQotPGxpPmZpbGUgZXh0ZW5zaW9uczwvbGk+DQotPGxpPmZvbGRlciBvZiBmaWxlIG5hbWVzPC9saT4NCi08bGk+cHJvamVjdCBuYXR1cmVzPC9saT4NCi08bGk+cHJvamVjdCBmYWNldHM8L2xpPg0KLTxsaT5jb250ZW50IHR5cGVzPC9saT4NCi08L3VsPlRocm91Z2ggdGhlIFZhbGlkYXRpb24gRmlsdGVycyBkaWFsb2csIHlvdSBhcmUgYWJsZSB0byBmdXJ0aGVyIHR1bmUgdGhlc2UNCi1zZXR0aW5ncy5Ob3JtYWxseSB5b3Ugd291bGQgc2ltcGx5IGtlZXAgdGhlIGRlZmF1bHRzLCBob3dldmVyIHR3byByZWFzb25zDQotd2h5IHlvdSBtYXkgd2FudCB0byB0dW5lIHZhbGlkYXRpb24gYXJlOjx1bD4NCi08bGk+UGVyZm9ybWFuY2U6IGlmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZSB3b3Jrc3BhY2UsIHlvdSBjb3VsZCByZWR1Y2UgdGhlDQotYW1vdW50IG9mIHZhbGlkYXRpb24uPC9saT4NCi08bGk+Tm9uIHN0YW5kYXJkIGNvbnZlbnRpb25zOiBpZiB5b3UgdXNlIGEgIG5vbiBzdGFuZGFyZCBuYW1pbmcgY29udmVudGlvbg0KLShmb3IgZXhhbXBsZSBzdG9yZXMgWE1MIGluIGZpbGVzIHdpdGggYW4gLmFjbWUteG1sIGV4dGVuc2lvbiksIHlvdSBjb3VsZCBzdGlsbA0KLWVuYWJsZSB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdG9ycyB0byBydW4gYWdhaW5zdCB0aG9zZSBmaWxlcy48L2xpPg0KLTwvdWw+WW91IGNhbiBhY2Nlc3MgdGhpcyBkaWFsb2cgYnkgY2xpY2tpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZA0KLXRoZW4gY2xpY2tpbmcgPHVpY29udHJvbD5TZXR0aW5nczwvdWljb250cm9sPiBiZXNpZGUgZWFjaCB2YWxpZGF0b3IuPC9wPjxwPkZpbHRlcnMNCi1hcmUgc3RvcmVkIGluIGdyb3Vwcy4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBncm91cHM6IEluY2x1ZGUgZ3JvdXBzIGFuZCBFeGNsdWRlDQotZ3JvdXBzLiBZb3UgY2FuIGhhdmUgYXMgbWFueSBJbmNsdWRlIGdyb3VwcyBhcyB5b3UgbGlrZS4gRmlsdGVycyBpbnNpZGUgb2YNCi1hbiBJbmNsdWRlIGdyb3VwIGNhdXNlIHJlc291cmNlcyB0byBiZSB2YWxpZGF0ZWQuIElmIGFueSBydWxlIG1hdGNoZXMgdGhlbg0KLXRoZSBlbnRpcmUgZ3JvdXAgbWF0Y2hlcy4gSW5zaWRlIG9mIGEgZ3JvdXAgdGhlIGZpbHRlciBydWxlcyBhcmUgT1LigJlkIHRvZ2V0aGVyLg0KLUhvd2V2ZXIgaW5kaXZpZHVhbCBJbmNsdWRlIGdyb3VwcyBhcmUgQU5E4oCZZWQgdG9nZXRoZXIuIFlvdSBjYW4gaGF2ZSBvbmUgRXhjbHVkZQ0KLWdyb3VwLiBJZiBhbnkgb2YgaXRzIGZpbHRlciBydWxlcyBtYXRjaCwgdGhlbiB0aGUgcmVzb3VyY2UgaXMgZXhjbHVkZWQuIEV4Y2x1c2lvbg0KLXRha2VzIHByZWNlZGVuY2Ugb3ZlciBpbmNsdXNpb24uPC9wPjwvc2VjdGlvbj4NCi08ZXhhbXBsZT48cD5UaGVzZSBydWxlcyBhcmUgaWxsdXN0cmF0ZWQgd2l0aCB0aGlzIGh5cG90aGV0aWNhbCBleGFtcGxlOjxpbWFnZQ0KLWhyZWY9Ii4uL2ltYWdlcy92YWxpZGF0ZWZpbHRlcnMuanBnIiBwbGFjZW1lbnQ9ImJyZWFrIj48YWx0PnNjcmVlbiBjYXB0dXJlDQotb2YgdGhlIHZhbGlkYXRpb24gZmlsdGVycyBwYW5lbCBzaG93aW5nIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgZ3JvdXBzPC9hbHQ+PC9pbWFnZT48dWw+DQotPGxpPklmIHRoZSByZXNvdXJjZSBpcyBpbiB0aGUgZGlzYWJsZWQgZm9sZGVyLCBpdCB3aWxsIGJlIGV4Y2x1ZGVkIGJlY2F1c2UNCi1leGNsdXNpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcgZWxzZS48L2xpPg0KLTxsaT5JZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSB0aGUgSlNQIHNvdXJjZSBjb250ZW50IHR5cGUsIGFuZCBpdCBkb2VzDQotbm90IGhhdmUgdGhlIEpTUCBmcmFnbWVudCBzb3VyY2UgY29udGVudCB0eXBlLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSBhIGZpbGUNCi1leHRlbnNpb24gb2YgLmpzcCBvciAuanNwZiB0aGVuIGl0IHdpbGwgYmUgZXhjbHVkZWQgYmVjYXVzZSBub25lIG9mIHRoZSBydWxlcw0KLWluIHRoZSBmaXJzdCBncm91cCBtYXRjaGVkLjwvbGk+DQotPGxpPklmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgdGhlIG1vZHVsZSBjb3JlIG5hdHVyZSB0aGVuIGl0IHdpbGwgYmUgZXhjbHVkZWQNCi1iZWNhdXNlIHRoZSBzaW5nbGUgcnVsZSBpbiB0aGUgc2Vjb25kIGdyb3VwIGRpZCBub3QgbWF0Y2guPC9saT4NCi08bGk+T3RoZXJ3aXNlIHRoZSByZXNvdXJjZSB3aWxsIGJlIHZhbGlkYXRlZCBieSB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLjwvbGk+DQotPC91bD5UbyBhZGQgYSBydWxlIHRvIGEgZ3JvdXAsIHNlbGVjdCB0aGUgZ3JvdXAgb24gdGhlIGxlZnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLVJ1bGU8L3VpY29udHJvbD4uPC9wPjwvZXhhbXBsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnR1bmV2YWxpZGF0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczMzE1OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlR1bmluZyB2YWxpZGF0b3JzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcyBvbiB0aGUgZmlsdGVycyB0aGF0IGFyZSBpbiBwbGFjZSBmb3IgdGhhdCB2YWxpZGF0b3IuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcyBvbiB0aGUgZmlsdGVycyB0aGF0IGFyZSBpbiBwbGFjZSBmb3IgdGhhdCB2YWxpZGF0b3IuIiAvPgotPG1ldGEgY29udGVudD0iY29kZSB2YWxpZGF0aW9uLCB0dW5pbmcsIHZhbGlkYXRpb24iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb2RlIHZhbGlkYXRpb24sIHR1bmluZywgdmFsaWRhdGlvbiIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZhbGRpc2FibGUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icnR1bmV2YWxpZGF0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VHVuaW5nIHZhbGlkYXRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJ0dW5ldmFsaWRhdCI+PGEgbmFtZT0icnR1bmV2YWxpZGF0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UdW5pbmcgdmFsaWRhdG9yczwvaDE+Ci0KLQotCi08ZGl2PjxwPldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcwotb24gdGhlIGZpbHRlcnMgdGhhdCBhcmUgaW4gcGxhY2UgZm9yIHRoYXQgdmFsaWRhdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+V2hlbiBhIHZhbGlkYXRvciBpcyBmaXJzdCBkZXZlbG9wZWQsIHRoZSBpbXBsZW1lbnRlciBvZiB0aGUgdmFsaWRhdG9yCi1kZWZpbmVzIGEgZGVmYXVsdCBzZXQgb2YgZmlsdGVycy4gVGhlc2UgZmlsdGVycyBtYXkgYmUgYmFzZWQgb246PHVsPgotPGxpPmZpbGUgZXh0ZW5zaW9uczwvbGk+Ci0KLTxsaT5mb2xkZXIgb2YgZmlsZSBuYW1lczwvbGk+Ci0KLTxsaT5wcm9qZWN0IG5hdHVyZXM8L2xpPgotCi08bGk+cHJvamVjdCBmYWNldHM8L2xpPgotCi08bGk+Y29udGVudCB0eXBlczwvbGk+Ci0KLTwvdWw+Ci1UaHJvdWdoIHRoZSBWYWxpZGF0aW9uIEZpbHRlcnMgZGlhbG9nLCB5b3UgYXJlIGFibGUgdG8gZnVydGhlciB0dW5lIHRoZXNlCi1zZXR0aW5ncy5Ob3JtYWxseSB5b3Ugd291bGQgc2ltcGx5IGtlZXAgdGhlIGRlZmF1bHRzLCBob3dldmVyIHR3byByZWFzb25zCi13aHkgeW91IG1heSB3YW50IHRvIHR1bmUgdmFsaWRhdGlvbiBhcmU6PHVsPgotPGxpPlBlcmZvcm1hbmNlOiBpZiB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2Ugd29ya3NwYWNlLCB5b3UgY291bGQgcmVkdWNlIHRoZQotYW1vdW50IG9mIHZhbGlkYXRpb24uPC9saT4KLQotPGxpPk5vbiBzdGFuZGFyZCBjb252ZW50aW9uczogaWYgeW91IHVzZSBhICBub24gc3RhbmRhcmQgbmFtaW5nIGNvbnZlbnRpb24KLShmb3IgZXhhbXBsZSBzdG9yZXMgWE1MIGluIGZpbGVzIHdpdGggYW4gLmFjbWUteG1sIGV4dGVuc2lvbiksIHlvdSBjb3VsZCBzdGlsbAotZW5hYmxlIHRoZSBhcHByb3ByaWF0ZSB2YWxpZGF0b3JzIHRvIHJ1biBhZ2FpbnN0IHRob3NlIGZpbGVzLjwvbGk+Ci0KLTwvdWw+Ci1Zb3UgY2FuIGFjY2VzcyB0aGlzIGRpYWxvZyBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+PC9zcGFuPiBhbmQKLXRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2V0dGluZ3M8L3NwYW4+IGJlc2lkZSBlYWNoIHZhbGlkYXRvci48L2Rpdj4KLTxwPkZpbHRlcnMKLWFyZSBzdG9yZWQgaW4gZ3JvdXBzLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGdyb3VwczogSW5jbHVkZSBncm91cHMgYW5kIEV4Y2x1ZGUKLWdyb3Vwcy4gWW91IGNhbiBoYXZlIGFzIG1hbnkgSW5jbHVkZSBncm91cHMgYXMgeW91IGxpa2UuIEZpbHRlcnMgaW5zaWRlIG9mCi1hbiBJbmNsdWRlIGdyb3VwIGNhdXNlIHJlc291cmNlcyB0byBiZSB2YWxpZGF0ZWQuIElmIGFueSBydWxlIG1hdGNoZXMgdGhlbgotdGhlIGVudGlyZSBncm91cCBtYXRjaGVzLiBJbnNpZGUgb2YgYSBncm91cCB0aGUgZmlsdGVyIHJ1bGVzIGFyZSBPUuKAmWQgdG9nZXRoZXIuCi1Ib3dldmVyIGluZGl2aWR1YWwgSW5jbHVkZSBncm91cHMgYXJlIEFOROKAmWVkIHRvZ2V0aGVyLiBZb3UgY2FuIGhhdmUgb25lIEV4Y2x1ZGUKLWdyb3VwLiBJZiBhbnkgb2YgaXRzIGZpbHRlciBydWxlcyBtYXRjaCwgdGhlbiB0aGUgcmVzb3VyY2UgaXMgZXhjbHVkZWQuIEV4Y2x1c2lvbgotdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGluY2x1c2lvbi48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iZXhhbXBsZSI+PGRpdiBjbGFzcz0icCI+VGhlc2UgcnVsZXMgYXJlIGlsbHVzdHJhdGVkIHdpdGggdGhpcyBoeXBvdGhldGljYWwgZXhhbXBsZTo8YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL3ZhbGlkYXRlZmlsdGVycy5qcGciIGFsdD0ic2NyZWVuIGNhcHR1cmUmIzEwO29mIHRoZSB2YWxpZGF0aW9uIGZpbHRlcnMgcGFuZWwgc2hvd2luZyBpbmNsdWRlIGFuZCBleGNsdWRlIGdyb3VwcyIgLz48YnIgLz48dWw+Ci08bGk+SWYgdGhlIHJlc291cmNlIGlzIGluIHRoZSBkaXNhYmxlZCBmb2xkZXIsIGl0IHdpbGwgYmUgZXhjbHVkZWQgYmVjYXVzZQotZXhjbHVzaW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBldmVyeXRoaW5nIGVsc2UuPC9saT4KLQotPGxpPklmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIHRoZSBKU1Agc291cmNlIGNvbnRlbnQgdHlwZSwgYW5kIGl0IGRvZXMKLW5vdCBoYXZlIHRoZSBKU1AgZnJhZ21lbnQgc291cmNlIGNvbnRlbnQgdHlwZSwgYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBmaWxlCi1leHRlbnNpb24gb2YgLmpzcCBvciAuanNwZiB0aGVuIGl0IHdpbGwgYmUgZXhjbHVkZWQgYmVjYXVzZSBub25lIG9mIHRoZSBydWxlcwotaW4gdGhlIGZpcnN0IGdyb3VwIG1hdGNoZWQuPC9saT4KLQotPGxpPklmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgdGhlIG1vZHVsZSBjb3JlIG5hdHVyZSB0aGVuIGl0IHdpbGwgYmUgZXhjbHVkZWQKLWJlY2F1c2UgdGhlIHNpbmdsZSBydWxlIGluIHRoZSBzZWNvbmQgZ3JvdXAgZGlkIG5vdCBtYXRjaC48L2xpPgotCi08bGk+T3RoZXJ3aXNlIHRoZSByZXNvdXJjZSB3aWxsIGJlIHZhbGlkYXRlZCBieSB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLjwvbGk+Ci0KLTwvdWw+Ci1UbyBhZGQgYSBydWxlIHRvIGEgZ3JvdXAsIHNlbGVjdCB0aGUgZ3JvdXAgb24gdGhlIGxlZnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLVJ1bGU8L3NwYW4+LjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgaW5kaXZpZHVhbGx5IG9yIGRpc2FibGUgdmFsaWRhdGlvbiBlbnRpcmVseS4gQWxzbywgeW91IGNhbiBzZXQgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgeW91ciBlbnRpcmUgd29ya3NwYWNlIGFuZCBmb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4iPkRpc2FibGluZyB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIHRpdGxlPSJGb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MuIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiB0aXRsZT0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZHVyaW5nIG1hbnVhbCBhbmQgYnVpbGQgY29kZSB2YWxpZGF0aW9uLiBZb3UgY2FuIHNldCBlYWNoIHZhbGlkYXRvciB0byBydW4gb24gbWFudWFsIHZhbGlkYXRpb24sIGJ1aWxkIHZhbGlkYXRpb24sIGJvdGgsIG9yIG5laXRoZXIuIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjMTRkZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsZXJyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJ2YWxlcnIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhpcyB0YWJsZSBsaXN0cyB0aGUgY29tbW9uIGVycm9yIG1lc3NhZ2VzPD9QdWIgQ2FyZXQ/Pg0KLXlvdSBtYXkgZW5jb3VudGVyIHdoZW4geW91IHZhbGlkYXRlIHlvdXIgcHJvamVjdHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+Y29kZSB2YWxpZGF0aW9uPGluZGV4dGVybT5lcnJvciBzb2x1dGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnZhbGlkYXRpb248aW5kZXh0ZXJtPmVycm9yIHNvbHV0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keSBvdXRwdXRjbGFzcz0iaWRfcmVmYm9keSI+DQotPGV4YW1wbGUgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9leGFtcGxlPg0KLTx0YWJsZSBmcmFtZT0iYWxsIj4NCi08dGdyb3VwIGNvbHM9IjMiIGNvbHNlcD0iMSIgcm93c2VwPSIxIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iNjAqIi8+DQotPGNvbHNwZWMgY29sbmFtZT0iY29sMiIgY29sd2lkdGg9IjcyKiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiIGNvbHdpZHRoPSIxNjQqIi8+DQotPHRoZWFkPg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX3RhYmxlSGVhZFJvdyI+DQotPGVudHJ5Pk1lc3NhZ2UgcHJlZml4PC9lbnRyeT4NCi08ZW50cnk+TWVzc2FnZTwvZW50cnk+DQotPGVudHJ5PkV4cGxhbmF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9hcHBjbGllbnRWYWxpZGF0b3IiPg0KLTxlbnRyeSBuYW1lZW5kPSJjb2wzIiBuYW1lc3Q9ImNvbDEiPjx1aWNvbnRyb2w+QXBwbGljYXRpb24gQ2xpZW50IHZhbGlkYXRvcjwvdWljb250cm9sPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfQ0hLSjEwMDAiPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DSEtKMTAwMDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlZhbGlkYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBmaWxlDQotaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPlRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGUgY2Fubm90IGJlIGxvYWRlZC4gVGhlDQotcHJvamVjdCBtZXRhZGF0YSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlLg0KLSAgPG9sPg0KLTxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD4NCi08bGk+dGhhdCB0aGUgTUVUQS1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2xpPg0KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGU8L2xpPg0KLTxsaT50aGF0IE1FVEEtSU5GIGlzIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLjwvbGk+DQotPC91bD4gIDwvbGk+DQotPGxpPlZhbGlkYXRlIHRoZSBzeW50YXggb2YgdGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvcg0KLXZpZXcsIGhpZ2hsaWdodCB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRlDQotWE1MIGZpbGU8L3VpY29udHJvbD4uPC9saT4NCi08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZA0KLXJlYnVpbGQgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1ldGFkYXRhIHdpbGwgcmVmcmVzaC48L2xpPg0KLTwvb2w+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfRUFSVmFsaWRhdG9yIj4NCi08ZW50cnkgbmFtZWVuZD0iY29sMyIgbmFtZXN0PSJjb2wxIj48dWljb250cm9sPkVBUiB2YWxpZGF0b3I8L3VpY29udHJvbD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0NIS0oxMDAxIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+Q0hLSjEwMDE8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5UaGUgRUFSIHByb2plY3QgezB9IGlzIGludmFsaWQuPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+VGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQuIFRoZSBwcm9qZWN0DQotbWV0YWRhdGEgY2Fubm90IGJlIGluaXRpYWxpemVkIGZyb20gdGhlIGFwcGxpY2F0aW9uLnhtbCBmaWxlLiAgPG9sPg0KLTxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD4NCi08bGk+dGhhdCB0aGUgTUVUQS1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgRUFSIHByb2plY3Q8L2xpPg0KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIDxjb2RlcGg+YXBwbGljYXRpb24ueG1sPC9jb2RlcGg+PC9saT4NCi08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPg0KLTwvdWw+ICA8L2xpPg0KLTxsaT5WYWxpZGF0ZSB0aGUgc3ludGF4IG9mIHRoZSBhcHBsaWNhdGlvbi54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvciB2aWV3LA0KLWhpZ2hsaWdodCB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGUNCi1YTUwgZmlsZTwvdWljb250cm9sPi48L2xpPg0KLTxsaT5JZiBib3RoIDEpIGFuZCAyKSBhcmUgb2theSwgY2xvc2UgdGhlIHByb2plY3QsIHJlb3BlbiB0aGUgcHJvamVjdCwgYW5kDQotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+DQotPC9vbD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0VKQlZhbGlkYXRvciI+DQotPGVudHJ5IG5hbWVlbmQ9ImNvbDMiIG5hbWVzdD0iY29sMSI+PHVpY29udHJvbD5FSkIgdmFsaWRhdG9yPC91aWNvbnRyb2w+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9DSEtKMjAxOSI+DQotPGVudHJ5PkNIS0oyMDE5PC9lbnRyeT4NCi08ZW50cnk+VGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gPC9lbnRyeT4NCi08ZW50cnkgbW9yZXJvd3M9IjIiPlRoZSBFSkIgaXMgY29tcGxpYW50IHdpdGggdGhlIEVKQiBzcGVjaWZpY2F0aW9uLiBUaGlzDQotbWVzc2FnZSBpcyBhIHdhcm5pbmcgdGhhdCBwcm9ibGVtcyBtYXkgb2NjdXIuIFRoZSB3YXJuaW5nIGFwcGVhcnMgd2hlbiBhIHR5cGUNCi1uZWVkcyB0byBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSBhbmQgd2hlbiBzZXJpYWxpemFiaWxpdHkgY2Fubm90IGJlIHZlcmlmaWVkDQotYXQgY29tcGlsZS10aW1lLiBBIHR5cGUgaXMgc2VyaWFsaXphYmxlIGlmLCBhdCBydW50aW1lLCBpdCBpcyBhIHByaW1pdGl2ZQ0KLXR5cGUsIGEgcHJpbWl0aXZlIGFycmF5LCBhIHJlbW90ZSBvYmplY3QsIG9yIGlmIGl0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUuDQotVGhpcyBtZXNzYWdlIGZsYWdzIGphdmEubGFuZy5PYmplY3QgYW5kIGl0IGNhbm5vdCBiZSBkaXNhYmxlZC4gWW91IGNhbiBlaXRoZXINCi1tYWtlIHRoZSBvYmplY3Qgc2VyaWFsaXphYmxlIGF0IGNvbXBpbGUtdGltZSBvciBpZ25vcmUgdGhlIHdhcm5pbmcuIDwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfQ0hLSjI0MTIiPg0KLTxlbnRyeT5DSEtKMjQxMjwvZW50cnk+DQotPGVudHJ5PlRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0NIS0oyNDEzIj4NCi08ZW50cnk+Q0hLSjI0MTM8L2VudHJ5Pg0KLTxlbnRyeT5Bcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9DSEtKMjEwMiI+DQotPGVudHJ5PkNIS0oyMTAyPC9lbnRyeT4NCi08ZW50cnk+RWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2Qgb24gdGhlDQotezB9IGNsYXNzLCBtdXN0IGJlIGRlZmluZWQuPC9lbnRyeT4NCi08ZW50cnk+QSBmaW5kZXIgZGVzY3JpcHRvciBtdXN0IGV4aXN0IGZvciBldmVyeSBmaW5kZXIgbWV0aG9kLiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0NIS0oyODczIj4NCi08ZW50cnk+Q0hLSjI4NzM8L2VudHJ5Pg0KLTxlbnRyeT5NaWdyYXRlIHRoaXMgYmVhbidzIGRhdGFzb3VyY2UgYmluZGluZyB0byBhIENNUCBDb25uZWN0aW9uIEZhY3RvcnkNCi1iaW5kaW5nLjwvZW50cnk+DQotPGVudHJ5PjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfQ0hLSjI4NzQiPg0KLTxlbnRyeT5DSEtKMjg3NDwvZW50cnk+DQotPGVudHJ5Pk1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUA0KLUNvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLjwvZW50cnk+DQotPGVudHJ5PjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfQ0hLSjI4NzVFIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+Q0hLSjI4NzVFICAgICAgIDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPiZsdDtlamItY2xpZW50LWphcj4gezB9IG11c3QgZXhpc3QgaW4gZXZlcnkgRUFSIGZpbGUNCi10aGF0IGNvbnRhaW5zIHRoaXMgRUpCIG1vZHVsZS48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5JZiA8Y29kZXBoPiZsdDtlamItY2xpZW50LWphcj48L2NvZGVwaD4gaXMgc3BlY2lmaWVkDQotaW4gPGZpbGVwYXRoPmVqYi1qYXIueG1sPC9maWxlcGF0aD4sIGEgY29ycmVzcG9uZGluZyBFSkIgY2xpZW50IHByb2plY3QgbXVzdA0KLWNvbnRhaW4gdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGFuZCBhbnkgb3RoZXIgdHlwZXMgdGhhdCBhIGNsaWVudCB3aWxsDQotbmVlZC4gSWYgdGhlc2UgdHlwZXMgYXJlIGFsbCBjb250YWluZWQgaW4gYSBzaW5nbGUgRUpCIHByb2plY3QsIGRlbGV0ZSB0aGUgPGNvZGVwaD4mbHQ7ZWpiLWNsaWVudC1qYXI+PC9jb2RlcGg+IGxpbmUNCi1pbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IHRoZSBFSkIgY2xpZW50IHByb2plY3QNCi1leGlzdHMsIGlzIG9wZW4sIGFuZCBpcyBhIHByb2plY3QgdXRpbGl0eSBKQVIgaW4gZXZlcnkgRUFSIHRoYXQgdXNlcyB0aGlzDQotRUpCIHByb2plY3QgYXMgYSBtb2R1bGUuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9DSEtKMjkwNSI+DQotPGVudHJ5PkNIS0oyOTA1PC9lbnRyeT4NCi08ZW50cnk+VGhlIEVKQiB2YWxpZGF0b3IgZGlkIG5vdCBydW4gYmVjYXVzZSBlamItamFyLnhtbCBjb3VsZCBub3QgYmUgbG9hZGVkLg0KLVJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2VudHJ5Pg0KLTxlbnRyeT5DSEtKMjkwNSBtZWFucyB0aGF0IHRoZSBwcm9qZWN0J3MgbWV0YWRhdGEgY291bGQgbm90IGJlIGluaXRpYWxpemVkDQotZnJvbSBlamItamFyLnhtbC4gPG9sPg0KLTxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD4NCi08bGk+dGhhdCB0aGUgTUVUQS1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgRUpCIHByb2plY3Q8L2xpPg0KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIGVqYi1qYXIueG1sPC9saT4NCi08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPg0KLTwvdWw+ICA8L2xpPg0KLTxsaT5WYWxpZGF0ZSB0aGUgc3ludGF4IG9mIHRoZSBlamItamFyLnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIGhpZ2hsaWdodA0KLXRoZSBlamItamFyLnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRlIFhNTCBmaWxlPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPklmIGJvdGggMSkgYW5kIDIpIGFyZSBva2F5LCBjbG9zZSB0aGUgcHJvamVjdCwgcmVvcGVuIHRoZSBwcm9qZWN0LCBhbmQNCi1yZWJ1aWxkIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtZXRhZGF0YSB3aWxsIHJlZnJlc2guPC9saT4NCi08L29sPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfSlNQVmFsaWRhdG9yIj4NCi08ZW50cnkgbmFtZWVuZD0iY29sMyIgbmFtZXN0PSJjb2wxIj48dWljb250cm9sPkpTUCB2YWxpZGF0b3I8L3VpY29udHJvbD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0lXQVcwNDgyIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+SVdBVzA0ODI8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5ObyB2YWxpZCBKc3BUcmFuc2xhdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+VGhlcmUgaXMgYSBwYXRoIHByb2JsZW0gd2l0aCB0aGUgcHJvamVjdDsgdGhlIEpTUCBWYWxpZGF0b3INCi1uZWVkcyBhY2Nlc3MgdG8gdGhlIFdBUyBydW50aW1lIGNvZGUuIElmIElXQVcwNDgyRSBhcHBlYXJzIG9uIGFsbCB3ZWIgcHJvamVjdHMsDQotY2hlY2sgdGhlIFZhcmlhYmxlIG9yIEpSRSBwYXRoOiAgIDxvbD4NCi08bGk+Q2hlY2sgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyAoPHVpY29udHJvbD5XaW5kb3cgPiBQcmVmZXJlbmNlcyA+IEphdmEgPkluc3RhbGxlZA0KLUpSRXM8L3VpY29udHJvbD4pIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYXRpb24gZm9yIHRoZSBKUkUgaXMgcG9pbnRpbmcNCi10byBhIHZhbGlkIEpSRSBkaXJlY3RvcnkuICA8L2xpPg0KLTxsaT5FbnN1cmUgdGhhdCB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlcyAoPHVpY29udHJvbD5XaW5kb3cgPiBQcmVmZXJlbmNlcyA+DQotSmF2YSA+IENsYXNzcGF0aCBWYXJpYWJsZXM8L3VpY29udHJvbD4pIGFyZSBzZXQgY29ycmVjdGx5LjwvbGk+DQotPC9vbD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9XQVJWYWxpZGF0b3IiPg0KLTxlbnRyeSBuYW1lZW5kPSJjb2wzIiBuYW1lc3Q9ImNvbDEiPjx1aWNvbnRyb2w+V0FSIHZhbGlkYXRvcjwvdWljb250cm9sPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfQ0hLSjMwMDgiPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DSEtKMzAwODwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPk1pc3Npbmcgb3IgaW52YWxpZCBXQVIgZmlsZS48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5UaGUgd2ViLnhtbCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQuIFRoZSBwcm9qZWN0IG1ldGFkYXRhDQotY2Fubm90IGJlIGluaXRpYWxpemVkIGZyb20gdGhlIHdlYi54bWwgZmlsZS4gICA8b2w+DQotPGxpPkVuc3VyZSB0aGUgZm9sbG93aW5nOiAgPHVsPg0KLTxsaT50aGF0IHRoZSBXRUItSU5GIGZvbGRlciBleGlzdHMgaW4gdGhlIHdlYiBwcm9qZWN0PC9saT4NCi08bGk+dGhhdCBXRUItSU5GIGNvbnRhaW5zIHRoZSB3ZWIueG1sIGZpbGU8L2xpPg0KLTxsaT50aGF0IFdFQi1JTkYgaXMgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguPC9saT4NCi08L3VsPiAgPC9saT4NCi08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgd2ViLnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIGhpZ2hsaWdodA0KLXRoZSB3ZWIueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGUgWE1MIGZpbGU8L3VpY29udHJvbD4uPC9saT4NCi08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZA0KLXJlYnVpbGQgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1ldGFkYXRhIHdpbGwgcmVmcmVzaC48L2xpPg0KLTwvb2w+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9YTUxWYWxpZGF0b3IiPg0KLTxlbnRyeSBuYW1lZW5kPSJjb2wzIiBuYW1lc3Q9ImNvbDEiPjx1aWNvbnRyb2w+WE1MIHZhbGlkYXRvcjwvdWljb250cm9sPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDwvZW50cnk+DQotPGVudHJ5PlRoZSBjb250ZW50IG9mIGVsZW1lbnQgdHlwZSAiZWpiLWphciIgaXMgaW5jb21wbGV0ZSwgaXQgbXVzdCBtYXRjaA0KLSIoZGVzY3JpcHRpb24/LGRpc3BsYXktbmFtZT8sc21hbGwtaWNvbj8sbGFyZ2UtaWNvbj8sZW50ZXJwcmlzZS1iZWFucyxhc3NlbWJseS1kZXNjcmlwdG9yPyxlamItY2xpZW50LWphcj8pIi48L2VudHJ5Pg0KLTxlbnRyeT5UaGUgRUpCIDEuMSBhbmQgMi4wIHNwZWNpZmljYXRpb25zIG1hbmRhdGUgdGhhdCBhdCBsZWFzdCBvbmUgZW50ZXJwcmlzZQ0KLWJlYW4gbXVzdCBleGlzdCBpbiBhbiBFSkIgLmphciBmaWxlLiBUaGlzIGVycm9yIG1lc3NhZ2UgaXMgbm9ybWFsIGR1cmluZyBkZXZlbG9wbWVudA0KLW9mIEVKQiAuamFyIGZpbGVzIGFuZCBjYW4gYmUgaWdub3JlZCB1bnRpbCB5b3UgcGVyZm9ybSBhIHByb2R1Y3Rpb24gYWN0aW9uLA0KLXN1Y2ggYXMgZXhwb3J0aW5nIG9yIGRlcGxveWluZyBjb2RlLiBEZWZpbmUgYXQgbGVhc3Qgb25lIGVudGVycHJpc2UgYmVhbiBpbg0KLXRoZSBwcm9qZWN0LjwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxleGFtcGxlIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvZXhhbXBsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDg4ODM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkMzBjYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsZXJyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9ucyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBjb21tb24gZXJyb3IgbWVzc2FnZXMgeW91IG1heSBlbmNvdW50ZXIgd2hlbiB5b3UgdmFsaWRhdGUgeW91ciBwcm9qZWN0cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgY29tbW9uIGVycm9yIG1lc3NhZ2VzIHlvdSBtYXkgZW5jb3VudGVyIHdoZW4geW91IHZhbGlkYXRlIHlvdXIgcHJvamVjdHMuIiAvPgotPG1ldGEgY29udGVudD0iY29kZSB2YWxpZGF0aW9uLCBlcnJvciBzb2x1dGlvbnMsIHZhbGlkYXRpb24iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb2RlIHZhbGlkYXRpb24sIGVycm9yIHNvbHV0aW9ucywgdmFsaWRhdGlvbiIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWwuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJydmFsZXJyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJ2YWxlcnIiPjxhIG5hbWU9InJ2YWxlcnIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3JlZmJvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoaXMgdGFibGUgbGlzdHMgdGhlIGNvbW1vbiBlcnJvciBtZXNzYWdlcwoteW91IG1heSBlbmNvdW50ZXIgd2hlbiB5b3UgdmFsaWRhdGUgeW91ciBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci0KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgY2xhc3M9ImlkX3RhYmxlSGVhZFJvdyI+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGlkPSJOMTAwNzgiPk1lc3NhZ2UgcHJlZml4PC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaWQ9Ik4xMDA3RiI+TWVzc2FnZTwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBpZD0iTjEwMDg2Ij5FeHBsYW5hdGlvbjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0ciBjbGFzcz0iaWRfYXBwY2xpZW50VmFsaWRhdG9yIj4KLTx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDc4IE4xMDA3RiBOMTAwODYgIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgdmFsaWRhdG9yPC9zcGFuPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjEwMDAiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJOMTAwNzggIj5DSEtKMTAwMDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPlZhbGlkYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBmaWxlCi1pcyBub3QgdmFsaWQuIEVuc3VyZSB0aGF0IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgdmFsaWQuPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9Ik4xMDA4NiAiPlRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGUgY2Fubm90IGJlIGxvYWRlZC4gVGhlCi1wcm9qZWN0IG1ldGFkYXRhIGNhbm5vdCBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGUuCi0gIDxvbD4KLTxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD4KLTxsaT50aGF0IHRoZSBNRVRBLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvbGk+Ci0KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGU8L2xpPgotCi08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotCi08L3VsPgotICA8L2xpPgotCi08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yCi12aWV3LCBoaWdobGlnaHQgdGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZSwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGUKLVhNTCBmaWxlPC9zcGFuPi48L2xpPgotCi08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZAotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+Ci0KLTwvb2w+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9FQVJWYWxpZGF0b3IiPgotPHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzggTjEwMDdGIE4xMDA4NiAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9DSEtKMTAwMSI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9Ik4xMDA3OCAiPkNIS0oxMDAxPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iTjEwMDdGICI+VGhlIEVBUiBwcm9qZWN0IHswfSBpcyBpbnZhbGlkLjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJOMTAwODYgIj5UaGUgYXBwbGljYXRpb24ueG1sIGZpbGUgY2Fubm90IGJlIGxvYWRlZC4gVGhlIHByb2plY3QKLW1ldGFkYXRhIGNhbm5vdCBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBhcHBsaWNhdGlvbi54bWwgZmlsZS4gIDxvbD4KLTxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD4KLTxsaT50aGF0IHRoZSBNRVRBLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSBFQVIgcHJvamVjdDwvbGk+Ci0KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFwcGxpY2F0aW9uLnhtbDwvc2FtcD48L2xpPgotCi08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotCi08L3VsPgotICA8L2xpPgotCi08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGU6IGluIHRoZSBOYXZpZ2F0b3IgdmlldywKLWhpZ2hsaWdodCB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlCi1YTUwgZmlsZTwvc3Bhbj4uPC9saT4KLQotPGxpPklmIGJvdGggMSkgYW5kIDIpIGFyZSBva2F5LCBjbG9zZSB0aGUgcHJvamVjdCwgcmVvcGVuIHRoZSBwcm9qZWN0LCBhbmQKLXJlYnVpbGQgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1ldGFkYXRhIHdpbGwgcmVmcmVzaC48L2xpPgotCi08L29sPgotPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9FSkJWYWxpZGF0b3IiPgotPHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzggTjEwMDdGIE4xMDA4NiAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVKQiB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9DSEtKMjAxOSI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9Ik4xMDA3OCAiPkNIS0oyMDE5PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iTjEwMDdGICI+VGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gPC90ZD4KLQotPHRkIHJvd3NwYW49IjMiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9Ik4xMDA4NiAiPlRoZSBFSkIgaXMgY29tcGxpYW50IHdpdGggdGhlIEVKQiBzcGVjaWZpY2F0aW9uLiBUaGlzCi1tZXNzYWdlIGlzIGEgd2FybmluZyB0aGF0IHByb2JsZW1zIG1heSBvY2N1ci4gVGhlIHdhcm5pbmcgYXBwZWFycyB3aGVuIGEgdHlwZQotbmVlZHMgdG8gYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgYW5kIHdoZW4gc2VyaWFsaXphYmlsaXR5IGNhbm5vdCBiZSB2ZXJpZmllZAotYXQgY29tcGlsZS10aW1lLiBBIHR5cGUgaXMgc2VyaWFsaXphYmxlIGlmLCBhdCBydW50aW1lLCBpdCBpcyBhIHByaW1pdGl2ZQotdHlwZSwgYSBwcmltaXRpdmUgYXJyYXksIGEgcmVtb3RlIG9iamVjdCwgb3IgaWYgaXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZS4KLVRoaXMgbWVzc2FnZSBmbGFncyBqYXZhLmxhbmcuT2JqZWN0IGFuZCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQuIFlvdSBjYW4gZWl0aGVyCi1tYWtlIHRoZSBvYmplY3Qgc2VyaWFsaXphYmxlIGF0IGNvbXBpbGUtdGltZSBvciBpZ25vcmUgdGhlIHdhcm5pbmcuIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjI0MTIiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJOMTAwNzggIj5DSEtKMjQxMjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPlRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiA8L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX0NIS0oyNDEzIj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iTjEwMDc4ICI+Q0hLSjI0MTM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJOMTAwN0YgIj5Bcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9DSEtKMjEwMiI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9Ik4xMDA3OCAiPkNIS0oyMTAyPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iTjEwMDdGICI+RWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2Qgb24gdGhlCi17MH0gY2xhc3MsIG11c3QgYmUgZGVmaW5lZC48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iTjEwMDg2ICI+QSBmaW5kZXIgZGVzY3JpcHRvciBtdXN0IGV4aXN0IGZvciBldmVyeSBmaW5kZXIgbWV0aG9kLiA8L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX0NIS0oyODczIj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iTjEwMDc4ICI+Q0hLSjI4NzM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJOMTAwN0YgIj5NaWdyYXRlIHRoaXMgYmVhbidzIGRhdGFzb3VyY2UgYmluZGluZyB0byBhIENNUCBDb25uZWN0aW9uIEZhY3RvcnkKLWJpbmRpbmcuPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9Ik4xMDA4NiAiPiZuYnNwOzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjI4NzQiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJOMTAwNzggIj5DSEtKMjg3NDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPk1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUAotQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9Ik4xMDA4NiAiPiZuYnNwOzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjI4NzVFIj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iTjEwMDc4ICI+Q0hLSjI4NzVFICAgICAgIDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPiZsdDtlamItY2xpZW50LWphciZndDsgezB9IG11c3QgZXhpc3QgaW4gZXZlcnkgRUFSIGZpbGUKLXRoYXQgY29udGFpbnMgdGhpcyBFSkIgbW9kdWxlLjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJOMTAwODYgIj5JZiA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7ZWpiLWNsaWVudC1qYXImZ3Q7PC9zYW1wPiBpcyBzcGVjaWZpZWQKLWluIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+ZWpiLWphci54bWw8L3NwYW4+LCBhIGNvcnJlc3BvbmRpbmcgRUpCIGNsaWVudCBwcm9qZWN0IG11c3QKLWNvbnRhaW4gdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGFuZCBhbnkgb3RoZXIgdHlwZXMgdGhhdCBhIGNsaWVudCB3aWxsCi1uZWVkLiBJZiB0aGVzZSB0eXBlcyBhcmUgYWxsIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBFSkIgcHJvamVjdCwgZGVsZXRlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7ZWpiLWNsaWVudC1qYXImZ3Q7PC9zYW1wPiBsaW5lCi1pbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IHRoZSBFSkIgY2xpZW50IHByb2plY3QKLWV4aXN0cywgaXMgb3BlbiwgYW5kIGlzIGEgcHJvamVjdCB1dGlsaXR5IEpBUiBpbiBldmVyeSBFQVIgdGhhdCB1c2VzIHRoaXMKLUVKQiBwcm9qZWN0IGFzIGEgbW9kdWxlLjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjI5MDUiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJOMTAwNzggIj5DSEtKMjkwNTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPlRoZSBFSkIgdmFsaWRhdG9yIGRpZCBub3QgcnVuIGJlY2F1c2UgZWpiLWphci54bWwgY291bGQgbm90IGJlIGxvYWRlZC4KLVJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iTjEwMDg2ICI+Q0hLSjI5MDUgbWVhbnMgdGhhdCB0aGUgcHJvamVjdCdzIG1ldGFkYXRhIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZAotZnJvbSBlamItamFyLnhtbC4gPG9sPgotPGxpPkVuc3VyZSB0aGUgZm9sbG93aW5nOiAgPHVsPgotPGxpPnRoYXQgdGhlIE1FVEEtSU5GIGZvbGRlciBleGlzdHMgaW4gdGhlIEVKQiBwcm9qZWN0PC9saT4KLQotPGxpPnRoYXQgTUVUQS1JTkYgY29udGFpbnMgZWpiLWphci54bWw8L2xpPgotCi08bGk+dGhhdCBNRVRBLUlORiBpcyBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC48L2xpPgotCi08L3VsPgotICA8L2xpPgotCi08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgZWpiLWphci54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvciB2aWV3LCBoaWdobGlnaHQKLXRoZSBlamItamFyLnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZSBYTUwgZmlsZTwvc3Bhbj4uPC9saT4KLQotPGxpPklmIGJvdGggMSkgYW5kIDIpIGFyZSBva2F5LCBjbG9zZSB0aGUgcHJvamVjdCwgcmVvcGVuIHRoZSBwcm9qZWN0LCBhbmQKLXJlYnVpbGQgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1ldGFkYXRhIHdpbGwgcmVmcmVzaC48L2xpPgotCi08L29sPgotPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9KU1BWYWxpZGF0b3IiPgotPHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzggTjEwMDdGIE4xMDA4NiAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9JV0FXMDQ4MiI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9Ik4xMDA3OCAiPklXQVcwNDgyPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iTjEwMDdGICI+Tm8gdmFsaWQgSnNwVHJhbnNsYXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBoZWFkZXJzPSJOMTAwODYgIj5UaGVyZSBpcyBhIHBhdGggcHJvYmxlbSB3aXRoIHRoZSBwcm9qZWN0OyB0aGUgSlNQIFZhbGlkYXRvcgotbmVlZHMgYWNjZXNzIHRvIHRoZSBXQVMgcnVudGltZSBjb2RlLiBJZiBJV0FXMDQ4MkUgYXBwZWFycyBvbiBhbGwgd2ViIHByb2plY3RzLAotY2hlY2sgdGhlIFZhcmlhYmxlIG9yIEpSRSBwYXRoOiAgIDxvbD4KLTxsaT5DaGVjayB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcyAmZ3Q7IEphdmEgJmd0O0luc3RhbGxlZAotSlJFczwvc3Bhbj4pIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYXRpb24gZm9yIHRoZSBKUkUgaXMgcG9pbnRpbmcKLXRvIGEgdmFsaWQgSlJFIGRpcmVjdG9yeS4gIDwvbGk+Ci0KLTxsaT5FbnN1cmUgdGhhdCB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlcyAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgUHJlZmVyZW5jZXMgJmd0OwotSmF2YSAmZ3Q7IENsYXNzcGF0aCBWYXJpYWJsZXM8L3NwYW4+KSBhcmUgc2V0IGNvcnJlY3RseS48L2xpPgotCi08L29sPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfV0FSVmFsaWRhdG9yIj4KLTx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDc4IE4xMDA3RiBOMTAwODYgIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XQVIgdmFsaWRhdG9yPC9zcGFuPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfQ0hLSjMwMDgiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJOMTAwNzggIj5DSEtKMzAwODwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9Ik4xMDA3RiAiPk1pc3Npbmcgb3IgaW52YWxpZCBXQVIgZmlsZS48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iTjEwMDg2ICI+VGhlIHdlYi54bWwgZmlsZSBjYW5ub3QgYmUgbG9hZGVkLiBUaGUgcHJvamVjdCBtZXRhZGF0YQotY2Fubm90IGJlIGluaXRpYWxpemVkIGZyb20gdGhlIHdlYi54bWwgZmlsZS4gICA8b2w+Ci08bGk+RW5zdXJlIHRoZSBmb2xsb3dpbmc6ICA8dWw+Ci08bGk+dGhhdCB0aGUgV0VCLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSB3ZWIgcHJvamVjdDwvbGk+Ci0KLTxsaT50aGF0IFdFQi1JTkYgY29udGFpbnMgdGhlIHdlYi54bWwgZmlsZTwvbGk+Ci0KLTxsaT50aGF0IFdFQi1JTkYgaXMgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguPC9saT4KLQotPC91bD4KLSAgPC9saT4KLQotPGxpPlZhbGlkYXRlIHRoZSBzeW50YXggb2YgdGhlIHdlYi54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvciB2aWV3LCBoaWdobGlnaHQKLXRoZSB3ZWIueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlIFhNTCBmaWxlPC9zcGFuPi48L2xpPgotCi08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZAotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+Ci0KLTwvb2w+Ci08L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX1hNTFZhbGlkYXRvciI+Ci08dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3OCBOMTAwN0YgTjEwMDg2ICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIHZhbGlkYXRvcjwvc3Bhbj48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9Ik4xMDA3OCAiPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJOMTAwN0YgIj5UaGUgY29udGVudCBvZiBlbGVtZW50IHR5cGUgImVqYi1qYXIiIGlzIGluY29tcGxldGUsIGl0IG11c3QgbWF0Y2gKLSIoZGVzY3JpcHRpb24/LGRpc3BsYXktbmFtZT8sc21hbGwtaWNvbj8sbGFyZ2UtaWNvbj8sZW50ZXJwcmlzZS1iZWFucyxhc3NlbWJseS1kZXNjcmlwdG9yPyxlamItY2xpZW50LWphcj8pIi48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iTjEwMDg2ICI+VGhlIEVKQiAxLjEgYW5kIDIuMCBzcGVjaWZpY2F0aW9ucyBtYW5kYXRlIHRoYXQgYXQgbGVhc3Qgb25lIGVudGVycHJpc2UKLWJlYW4gbXVzdCBleGlzdCBpbiBhbiBFSkIgLmphciBmaWxlLiBUaGlzIGVycm9yIG1lc3NhZ2UgaXMgbm9ybWFsIGR1cmluZyBkZXZlbG9wbWVudAotb2YgRUpCIC5qYXIgZmlsZXMgYW5kIGNhbiBiZSBpZ25vcmVkIHVudGlsIHlvdSBwZXJmb3JtIGEgcHJvZHVjdGlvbiBhY3Rpb24sCi1zdWNoIGFzIGV4cG9ydGluZyBvciBkZXBsb3lpbmcgY29kZS4gRGVmaW5lIGF0IGxlYXN0IG9uZSBlbnRlcnByaXNlIGJlYW4gaW4KLXRoZSBwcm9qZWN0LjwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBpbmNsdWRlcyB2YWxpZGF0b3JzIHRoYXQgY2hlY2sgY2VydGFpbiBmaWxlcyBpbiB5b3VyIGVudGVycHJpc2UgYXBwbGljYXRpb24gbW9kdWxlIHByb2plY3RzIGZvciBlcnJvcnMuIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCB2YWxpZGF0b3IuIj5KMkVFIFZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGlkYXRvcnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxpZGF0b3JzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYmRkN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGlkYXRvcnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icnZhbGlkYXRvcnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+SjJFRSBWYWxpZGF0b3JzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdA0KLWFyZSBhdmFpbGFibGUgZm9yIHRoZSBkaWZmZXJlbnQgcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbg0KLW9mIGVhY2ggdmFsaWRhdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnZhbGlkYXRpb248aW5kZXh0ZXJtPkoyRUUgdmFsaWRhdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+Y29kZSB2YWxpZGF0aW9uPGluZGV4dGVybT5KMkVFIHZhbGlkYXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHkgb3V0cHV0Y2xhc3M9ImlkX3JlZmJvZHkiPg0KLTxleGFtcGxlIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvZXhhbXBsZT4NCi08dGFibGUgZnJhbWU9ImFsbCI+DQotPHRncm91cCBjb2xzPSIyIiBjb2xzZXA9IjEiIHJvd3NlcD0iMSI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9IjUwKiIvPg0KLTxjb2xzcGVjIGNvbG5hbWU9ImNvbDIiIGNvbHdpZHRoPSI1MCoiLz4NCi08dGhlYWQ+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfdG9wcm93Ij4NCi08ZW50cnk+VmFsaWRhdG9yIG5hbWU8L2VudHJ5Pg0KLTxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfYXBwY2xpZW50VmFsaWRhdG9yIj4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5BcHBsaWNhdGlvbiBDbGllbnQgVmFsaWRhdG9yPC9lbnRyeT4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5UaGUgQXBwbGljYXRpb24gQ2xpZW50IFZhbGlkYXRvciB2YWxpZGF0ZXMNCi10aGUgZm9sbG93aW5nIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0IHJlc291cmNlczogICA8dWw+DQotPGxpPkRlcGxveW1lbnQgZGVzY3JpcHRvciAoYXBwbGljYXRpb24tY2xpZW50LnhtbCk8L2xpPg0KLTxsaT5FSkIgcmVmZXJlbmNlczwvbGk+DQotPGxpPlJlc291cmNlIHJlZmVyZW5jZXM8L2xpPg0KLTwvdWw+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9jb25uZWN0b3JWYWxpZGF0b3IiPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5Db25uZWN0b3IgVmFsaWRhdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+VGhlIENvbm5lY3RvciB2YWxpZGF0b3IgY2hlY2tzIGZvciBpbnZhbGlkIEoyRUUgc3BlY2lmaWNhdGlvbg0KLWxldmVscyBpbiBjb25uZWN0b3IgcHJvamVjdHMuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9EVERWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkRURCBWYWxpZGF0b3I8L2VudHJ5Pg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlRoZSBEVEQgdmFsaWRhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUNCi1jdXJyZW50IHN0YXRlIG9mIGEgRFREIGlzIHNlbWFudGljYWxseSB2YWxpZC4gWE1MIGZpbGVzIGFyZSB2YWxpZGF0ZWQgYWNjb3JkaW5nDQotdG8gdGhlIFhNTCBzcGVjaWZpY2F0aW9uIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2Ig0KLXNjb3BlPSJleHRlcm5hbCI+IEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMDxkZXNjPjwvZGVzYz48L3hyZWY+IGZyb20NCi10aGUgVzNDIFdlYiBzaXRlLiBBcyB3ZWxsLCB0aGUgRFREIHZhbGlkYXRvciBjaGVja3MgZm9yIGVycm9ycyBzdWNoIGFzIHJlZmVyZW5jZXMNCi10byBlbnRpdGllcyBhbmQgZWxlbWVudHMgdGhhdCBkbyBub3QgZXhpc3QuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9FQVJWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkVBUiBWYWxpZGF0b3I8L2VudHJ5Pg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlRoZSBFQVIgVmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgZm9sbG93aW5nOg0KLSA8dWw+DQotPGxpPkVBUiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFwcGxpY2F0aW9uLnhtbCk8L2xpPg0KLTxsaT5FSkIgcmVmZXJlbmNlcyBvZiBhbGwgbW9kdWxlIHByb2plY3RzIGluIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2xpPg0KLTxsaT5TZWN1cml0eSByb2xlczwvbGk+DQotPGxpPlJlc291cmNlIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5NYW5pZmVzdCBmaWxlcyBmb3IgYWxsIGNvbnRhaW5lZCBvciByZWZlcmVuY2VkIG1vZHVsZXMgYW5kIHV0aWxpdHkgSkFSDQotZmlsZXM8L2xpPg0KLTxsaT5UYXJnZXQgc2VydmVyIGNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbmQNCi1hbnkgdXRpbGl0eSBhbmQgbW9kdWxlIHByb2plY3RzPC9saT4NCi08bGk+RXhpc3RlbmNlIG9mIHByb2plY3RzIGZvciBlYWNoIG1vZHVsZSBkZWZpbmVkIGluIGVudGVycHJpc2UgYXBwbGljYXRpb248L2xpPg0KLTwvdWw+ICA8cD5Ob3RlIHRoYXQgdGhlIEVBUiBWYWxpZGF0b3Igb25seSBlbnN1cmVzIHRoZSB2YWxpZGl0eSBhbmQgZGVwZW5kZW5jeQ0KLW9mIHRoZSBtb2R1bGUgcHJvamVjdHMgd2l0aCByZXNwZWN0IHRvIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9wPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfRUpCVmFsaWRhdG9yIj4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5FSkIgVmFsaWRhdG9yPC9lbnRyeT4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5UaGUgRUpCIFZhbGlkYXRvciB2ZXJpZmllcyB0aGF0IGVudGVycHJpc2UNCi1iZWFucyBjb250YWluZWQgaW4gYW4gRUpCIHByb2plY3QgY29tcGx5IHdpdGggdGhlIFN1biBFbnRlcnByaXNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YUJlYW5zIj5KYXZhQmVhbnM8L3RtPiBTcGVjaWZpY2F0aW9ucw0KLSgxLjEsIDIuMCwgYW5kIDIuMSksIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgdGhlIGJlYW4uIENvZGUgdmFsaWRhdGlvbiBmb3INCi10aGUgRUpCIDEuMCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFNwZWNpZmljYWxseSwgdGhlIEVKQiBWYWxpZGF0b3INCi12YWxpZGF0ZXMgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6IDx1bD4NCi08bGk+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IC5jbGFzcw0KLWZpbGVzIHRoYXQgYXJlIG1lbWJlcnMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwNCi1lbnRlcnByaXNlIGJlYW4gY2xhc3MsIGFuZCwgaWYgdGhlIGJlYW4gaXMgYW4gZW50aXR5IGJlYW4sIHRoZSBrZXkgY2xhc3MpPC9saT4NCi08bGk+ZWpiLWphci54bWw8L2xpPg0KLTwvdWw+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9FTFZhbGlkYXRvciI+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkVMIFN5bnRheCBWYWxpZGF0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX0hUTUxWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkhUTUwgU3ludGF4IFZhbGlkYXRvcjwvZW50cnk+DQotPGVudHJ5IGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+VGhlIEhUTUwgU3ludGF4IFZhbGlkYXRvciB2YWxpZGF0ZXMgSFRNTA0KLWJhc2ljIHN5bnRheCBhbmQgSFRNTCBEVEQgY29tcGxpYW5jZSBpbiB0aGUgZm9sbG93aW5nIFdlYiBwcm9qZWN0IHJlc291cmNlczoNCi0gPHVsPg0KLTxsaT5IVE1MIGZpbGVzPC9saT4NCi08bGk+SlNQIGZpbGVzPC9saT4NCi08L3VsPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfSlNQVmFsaWRhdG9yIj4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5KU1AgU3ludGF4IFZhbGlkYXRvcjwvZW50cnk+DQotPGVudHJ5IGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+VGhlIEpTUCBTeW50YXggVmFsaWRhdG9yIHZhbGlkYXRlcyBKU1AgZmlsZXMNCi1pbiBhIHByb2plY3QgYnkgdHJhbnNsYXRpbmcgdGhlbSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvZGUNCi1hbmQgdGhlbiBjaGVja2luZyB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29kZSBmb3IgY29tcGlsZSBlcnJvcnMuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9XQVJWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPldhciBWYWxpZGF0b3I8L2VudHJ5Pg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlRoZSBXYXIgVmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgZm9sbG93aW5nDQotd2ViIHByb2plY3QgcmVzb3VyY2VzOiAgIDx1bD4NCi08bGk+RGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKTwvbGk+DQotPGxpPlNlcnZsZXRzPC9saT4NCi08bGk+U2VjdXJpdHkgcm9sZXM8L2xpPg0KLTxsaT5TZXJ2bGV0ICZhbXA7IHNlcnZsZXQgbWFwcGluZ3M8L2xpPg0KLTxsaT5FSkIgcmVmZXJlbmNlczwvbGk+DQotPC91bD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3cgb3V0cHV0Y2xhc3M9ImlkX1dTRExWYWxpZGF0b3IiPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5XU0RMIFZhbGlkYXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlRoZSBXU0RMIHZhbGlkYXRvciBjaGVja3MgdGhlIGZvbGxvd2luZyBpbiBXU0RMIGZpbGVzOiA8dWw+DQotPGxpPlhNTCBzeW50YXg8L2xpPg0KLTxsaT5YTUwgU2NoZW1hIHR5cGVzIGluIHRoZSAmbHQ7dHlwZXM+IHNlY3Rpb248L2xpPg0KLTxsaT5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgb2YgdGhlIHZhcmlvdXMgY29uc3RydWN0cyBpbiBXU0RMIDwvbGk+DQotPC91bD5UaGUgdmFsaWRhdG9yIGFsc28gaW5jbHVkZXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGFsbG93IG90aGVyIHZhbGlkYXRvcnMNCi10byBiZSBwbHVnZ2VkIGludG8gdGhlIFdTREwgdmFsaWRhdGlvbiB0byBwcm92aWRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uDQotb2YgdGhlIFdTREwgZmlsZS4gVGhyb3VnaCB0aGlzIG1lY2hhbmlzbSwgaW50ZXJvcGVyYWJpbGl0eSBpcyBjaGVja2VkIGJ5IHZhbGlkYXRpbmcNCi1hIFdTREwgZmlsZSBhZ2FpbnN0IFdTLUkgUHJvZmlsZXMuIDwvZW50cnk+DQotPC9yb3c+DQotPHJvdyBvdXRwdXRjbGFzcz0iaWRfV1NJVmFsaWRhdG9yIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+V1MtSSBNZXNzYWdlIFZhbGlkYXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPldTLUkgTWVzc2FnZSB2YWxpZGF0b3IgY2hlY2tzIFNPQVAgbWVzc2FnZXMgYWdhaW5zdA0KLVdTLUkgUHJvZmlsZXMuIEEgdXNlciBjYW4gY2FwdHVyZSBhbmQgdmVyaWZ5IFNPQVAgbWVzc2FnZXMgdXNpbmcgdGhlIFRDUC9JUA0KLU1vbml0b3IuIFRoZSB2YWxpZGF0b3IgY2hlY2tzIGEgbWVzc2FnZSBsb2cgdGhhdCBpcyBzYXZlZCBhcyBhIHByb2plY3QgcmVzb3VyY2UNCi0oLndzaW1zZykuIFRoZSBsb2cgY29uZm9ybXMgdG8gYSBmb3JtYXQgYXMgc3BlY2lmaWVkIGJ5IFdTLUkuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9YTUxTY2hlbWFWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlhNTCBTY2hlbWEgVmFsaWRhdG9yPC9lbnRyeT4NCi08ZW50cnkgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5UaGUgWE1MIHNjaGVtYSB2YWxpZGF0b3IgZGV0ZXJtaW5lcyB3aGV0aGVyDQotdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gWE1MIHNjaGVtYXMNCi1hcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIDx4cmVmIGZvcm1hdD0iaHRtbCINCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8iIHNjb3BlPSJsb2NhbCI+IFhNTCBTY2hlbWEgUGFydCAxOg0KLVN0cnVjdHVyZXM8ZGVzYz48L2Rlc2M+PC94cmVmPiBmcm9tIHRoZSBXM0MgV2ViIHNpdGUuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93IG91dHB1dGNsYXNzPSJpZF9YTUxWYWxpZGF0b3IiPg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlhNTCBWYWxpZGF0b3I8L2VudHJ5Pg0KLTxlbnRyeSBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPlRoZSBYTUwgdmFsaWRhdG9yIGVuc3VyZXMgdGhhdCBhbiBYTUwgZmlsZQ0KLWlzIHdlbGwtZm9ybWVkLiBJdCBhbHNvIHZlcmlmaWVzIGlmIGFuIFhNTCBmaWxlIGlzIHZhbGlkIC0gdGhhdCBpcywgaXQgZm9sbG93cw0KLXRoZSBjb25zdHJhaW50cyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQNCi13aXRoLjwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxleGFtcGxlIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvZXhhbXBsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxpZGF0b3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGU3ODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkoyRUUgVmFsaWRhdG9ycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGRpZmZlcmVudCBwcm9qZWN0IHR5cGVzIGFuZCBnaXZlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGVhY2ggdmFsaWRhdG9yLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGRpZmZlcmVudCBwcm9qZWN0IHR5cGVzIGFuZCBnaXZlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGVhY2ggdmFsaWRhdG9yLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIEoyRUUgdmFsaWRhdG9ycywgY29kZSB2YWxpZGF0aW9uIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idmFsaWRhdGlvbiwgSjJFRSB2YWxpZGF0b3JzLCBjb2RlIHZhbGlkYXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWwuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJydmFsaWRhdG9ycyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkoyRUUgVmFsaWRhdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icnZhbGlkYXRvcnMiPjxhIG5hbWU9InJ2YWxpZGF0b3JzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5KMkVFIFZhbGlkYXRvcnM8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfcmVmYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhpcyB0YWJsZSBsaXN0cyB0aGUgdmFsaWRhdG9ycyB0aGF0Ci1hcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIGVhY2ggdmFsaWRhdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLQotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0ciBjbGFzcz0iaWRfdG9wcm93Ij4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaWQ9Ik4xMDA3MyI+VmFsaWRhdG9yIG5hbWU8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGlkPSJOMTAwN0EiPkRlc2NyaXB0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyIGNsYXNzPSJpZF9hcHBjbGllbnRWYWxpZGF0b3IiPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDczICI+QXBwbGljYXRpb24gQ2xpZW50IFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3QSAiPlRoZSBBcHBsaWNhdGlvbiBDbGllbnQgVmFsaWRhdG9yIHZhbGlkYXRlcwotdGhlIGZvbGxvd2luZyBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCByZXNvdXJjZXM6ICAgPHVsPgotPGxpPkRlcGxveW1lbnQgZGVzY3JpcHRvciAoYXBwbGljYXRpb24tY2xpZW50LnhtbCk8L2xpPgotCi08bGk+RUpCIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+UmVzb3VyY2UgcmVmZXJlbmNlczwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX2Nvbm5lY3RvclZhbGlkYXRvciI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3MyAiPkNvbm5lY3RvciBWYWxpZGF0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3QSAiPlRoZSBDb25uZWN0b3IgdmFsaWRhdG9yIGNoZWNrcyBmb3IgaW52YWxpZCBKMkVFIHNwZWNpZmljYXRpb24KLWxldmVscyBpbiBjb25uZWN0b3IgcHJvamVjdHMuPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9EVERWYWxpZGF0b3IiPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDczICI+RFREIFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3QSAiPlRoZSBEVEQgdmFsaWRhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUKLWN1cnJlbnQgc3RhdGUgb2YgYSBEVEQgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBYTUwgZmlsZXMgYXJlIHZhbGlkYXRlZCBhY2NvcmRpbmcKLXRvIHRoZSBYTUwgc3BlY2lmaWNhdGlvbiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy14bWwtMjAwMDEwMDYiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iIj5FeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjA8L2E+IGZyb20KLXRoZSBXM0MgV2ViIHNpdGUuIEFzIHdlbGwsIHRoZSBEVEQgdmFsaWRhdG9yIGNoZWNrcyBmb3IgZXJyb3JzIHN1Y2ggYXMgcmVmZXJlbmNlcwotdG8gZW50aXRpZXMgYW5kIGVsZW1lbnRzIHRoYXQgZG8gbm90IGV4aXN0LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfRUFSVmFsaWRhdG9yIj4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3MyAiPkVBUiBWYWxpZGF0b3I8L3RkPgotCi08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwN0EgIj5UaGUgRUFSIFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhlIGZvbGxvd2luZzoKLSA8dWw+Ci08bGk+RUFSIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoYXBwbGljYXRpb24ueG1sKTwvbGk+Ci0KLTxsaT5FSkIgcmVmZXJlbmNlcyBvZiBhbGwgbW9kdWxlIHByb2plY3RzIGluIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2xpPgotCi08bGk+U2VjdXJpdHkgcm9sZXM8L2xpPgotCi08bGk+UmVzb3VyY2UgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5NYW5pZmVzdCBmaWxlcyBmb3IgYWxsIGNvbnRhaW5lZCBvciByZWZlcmVuY2VkIG1vZHVsZXMgYW5kIHV0aWxpdHkgSkFSCi1maWxlczwvbGk+Ci0KLTxsaT5UYXJnZXQgc2VydmVyIGNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbmQKLWFueSB1dGlsaXR5IGFuZCBtb2R1bGUgcHJvamVjdHM8L2xpPgotCi08bGk+RXhpc3RlbmNlIG9mIHByb2plY3RzIGZvciBlYWNoIG1vZHVsZSBkZWZpbmVkIGluIGVudGVycHJpc2UgYXBwbGljYXRpb248L2xpPgotCi08L3VsPgotICA8cD5Ob3RlIHRoYXQgdGhlIEVBUiBWYWxpZGF0b3Igb25seSBlbnN1cmVzIHRoZSB2YWxpZGl0eSBhbmQgZGVwZW5kZW5jeQotb2YgdGhlIG1vZHVsZSBwcm9qZWN0cyB3aXRoIHJlc3BlY3QgdG8gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L3A+Ci08L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX0VKQlZhbGlkYXRvciI+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwNzMgIj5FSkIgVmFsaWRhdG9yPC90ZD4KLQotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDdBICI+VGhlIEVKQiBWYWxpZGF0b3IgdmVyaWZpZXMgdGhhdCBlbnRlcnByaXNlCi1iZWFucyBjb250YWluZWQgaW4gYW4gRUpCIHByb2plY3QgY29tcGx5IHdpdGggdGhlIFN1biBFbnRlcnByaXNlIEphdmFCZWFuc+KEoiBTcGVjaWZpY2F0aW9ucwotKDEuMSwgMi4wLCBhbmQgMi4xKSwgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiB0aGUgYmVhbi4gQ29kZSB2YWxpZGF0aW9uIGZvcgotdGhlIEVKQiAxLjAgc3BlY2lmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBTcGVjaWZpY2FsbHksIHRoZSBFSkIgVmFsaWRhdG9yCi12YWxpZGF0ZXMgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6IDx1bD4KLTxsaT5KYXZh4oSiIC5jbGFzcwotZmlsZXMgdGhhdCBhcmUgbWVtYmVycyBvZiBhbiBlbnRlcnByaXNlIGJlYW4gKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLAotZW50ZXJwcmlzZSBiZWFuIGNsYXNzLCBhbmQsIGlmIHRoZSBiZWFuIGlzIGFuIGVudGl0eSBiZWFuLCB0aGUga2V5IGNsYXNzKTwvbGk+Ci0KLTxsaT5lamItamFyLnhtbDwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX0VMVmFsaWRhdG9yIj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDczICI+RUwgU3ludGF4IFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDdBICI+Jm5ic3A7PC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9IVE1MVmFsaWRhdG9yIj4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3MyAiPkhUTUwgU3ludGF4IFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3QSAiPlRoZSBIVE1MIFN5bnRheCBWYWxpZGF0b3IgdmFsaWRhdGVzIEhUTUwKLWJhc2ljIHN5bnRheCBhbmQgSFRNTCBEVEQgY29tcGxpYW5jZSBpbiB0aGUgZm9sbG93aW5nIFdlYiBwcm9qZWN0IHJlc291cmNlczoKLSA8dWw+Ci08bGk+SFRNTCBmaWxlczwvbGk+Ci0KLTxsaT5KU1AgZmlsZXM8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyIGNsYXNzPSJpZF9KU1BWYWxpZGF0b3IiPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDczICI+SlNQIFN5bnRheCBWYWxpZGF0b3I8L3RkPgotCi08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwN0EgIj5UaGUgSlNQIFN5bnRheCBWYWxpZGF0b3IgdmFsaWRhdGVzIEpTUCBmaWxlcwotaW4gYSBwcm9qZWN0IGJ5IHRyYW5zbGF0aW5nIHRoZW0gaW50byB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGUKLWFuZCB0aGVuIGNoZWNraW5nIHRoZSBKYXZhIGNvZGUgZm9yIGNvbXBpbGUgZXJyb3JzLjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfV0FSVmFsaWRhdG9yIj4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3MyAiPldhciBWYWxpZGF0b3I8L3RkPgotCi08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwN0EgIj5UaGUgV2FyIFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhlIGZvbGxvd2luZwotd2ViIHByb2plY3QgcmVzb3VyY2VzOiAgIDx1bD4KLTxsaT5EZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpPC9saT4KLQotPGxpPlNlcnZsZXRzPC9saT4KLQotPGxpPlNlY3VyaXR5IHJvbGVzPC9saT4KLQotPGxpPlNlcnZsZXQgJmFtcDsgc2VydmxldCBtYXBwaW5nczwvbGk+Ci0KLTxsaT5FSkIgcmVmZXJlbmNlczwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX1dTRExWYWxpZGF0b3IiPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwNzMgIj5XU0RMIFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDdBICI+VGhlIFdTREwgdmFsaWRhdG9yIGNoZWNrcyB0aGUgZm9sbG93aW5nIGluIFdTREwgZmlsZXM6IDx1bD4KLTxsaT5YTUwgc3ludGF4PC9saT4KLQotPGxpPlhNTCBTY2hlbWEgdHlwZXMgaW4gdGhlICZsdDt0eXBlcyZndDsgc2VjdGlvbjwvbGk+Ci0KLTxsaT5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgb2YgdGhlIHZhcmlvdXMgY29uc3RydWN0cyBpbiBXU0RMIDwvbGk+Ci0KLTwvdWw+Ci1UaGUgdmFsaWRhdG9yIGFsc28gaW5jbHVkZXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGFsbG93IG90aGVyIHZhbGlkYXRvcnMKLXRvIGJlIHBsdWdnZWQgaW50byB0aGUgV1NETCB2YWxpZGF0aW9uIHRvIHByb3ZpZGUgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24KLW9mIHRoZSBXU0RMIGZpbGUuIFRocm91Z2ggdGhpcyBtZWNoYW5pc20sIGludGVyb3BlcmFiaWxpdHkgaXMgY2hlY2tlZCBieSB2YWxpZGF0aW5nCi1hIFdTREwgZmlsZSBhZ2FpbnN0IFdTLUkgUHJvZmlsZXMuIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0ciBjbGFzcz0iaWRfV1NJVmFsaWRhdG9yIj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDczICI+V1MtSSBNZXNzYWdlIFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDdBICI+V1MtSSBNZXNzYWdlIHZhbGlkYXRvciBjaGVja3MgU09BUCBtZXNzYWdlcyBhZ2FpbnN0Ci1XUy1JIFByb2ZpbGVzLiBBIHVzZXIgY2FuIGNhcHR1cmUgYW5kIHZlcmlmeSBTT0FQIG1lc3NhZ2VzIHVzaW5nIHRoZSBUQ1AvSVAKLU1vbml0b3IuIFRoZSB2YWxpZGF0b3IgY2hlY2tzIGEgbWVzc2FnZSBsb2cgdGhhdCBpcyBzYXZlZCBhcyBhIHByb2plY3QgcmVzb3VyY2UKLSgud3NpbXNnKS4gVGhlIGxvZyBjb25mb3JtcyB0byBhIGZvcm1hdCBhcyBzcGVjaWZpZWQgYnkgV1MtSS48L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX1hNTFNjaGVtYVZhbGlkYXRvciI+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwNzMgIj5YTUwgU2NoZW1hIFZhbGlkYXRvcjwvdGQ+Ci0KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9Ik4xMDA3QSAiPlRoZSBYTUwgc2NoZW1hIHZhbGlkYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIKLXRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIFhNTCBzY2hlbWFzCi1hcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyIgdGl0bGU9IiI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+IGZyb20gdGhlIFczQyBXZWIgc2l0ZS48L3RkPgotCi08L3RyPgotCi08dHIgY2xhc3M9ImlkX1hNTFZhbGlkYXRvciI+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJOMTAwNzMgIj5YTUwgVmFsaWRhdG9yPC90ZD4KLQotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iTjEwMDdBICI+VGhlIFhNTCB2YWxpZGF0b3IgZW5zdXJlcyB0aGF0IGFuIFhNTCBmaWxlCi1pcyB3ZWxsLWZvcm1lZC4gSXQgYWxzbyB2ZXJpZmllcyBpZiBhbiBYTUwgZmlsZSBpcyB2YWxpZCAtIHRoYXQgaXMsIGl0IGZvbGxvd3MKLXRoZSBjb25zdHJhaW50cyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQKLXdpdGguPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiIHRpdGxlPSJUaGUgd29ya2JlbmNoIGluY2x1ZGVzIHZhbGlkYXRvcnMgdGhhdCBjaGVjayBjZXJ0YWluIGZpbGVzIGluIHlvdXIgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBtb2R1bGUgcHJvamVjdHMgZm9yIGVycm9ycy4iPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ydmFsZXJyLmh0bWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBjb21tb24gZXJyb3IgbWVzc2FnZXMgeW91IG1heSBlbmNvdW50ZXIgd2hlbiB5b3UgdmFsaWRhdGUgeW91ciBwcm9qZWN0cy4iPkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmdmYWNldC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFkZGluZ2ZhY2V0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZGE0OWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFkZGluZ2ZhY2V0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRpbmdmYWNldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5BZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdDwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5UaGlzIHRvcGljIGV4cGxhaW5zIGhvdyB0byBhZGQgYSBmYWNldA0KLXRvIGFuIGV4aXN0aW5nIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+cHJvamVjdHM8aW5kZXh0ZXJtPmZhY2V0czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KYXZhIEVFPGluZGV4dGVybT5hZGRpbmcgcHJvamVjdCBmYWNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD48cA0KLWNvbnJlZj0iY2ZhY2V0cy5kaXRhI2NmYWNldHMvYWJvdXRmYWNldCI+PC9wPiA8cD5OZXcgcHJvamVjdHMgZ2VuZXJhbGx5IGhhdmUNCi1mYWNldHMgYWRkZWQgdG8gdGhlbSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuIFRvIGFkZCBhbm90aGVyIGZhY2V0IHRvIGEgcHJvamVjdA0KLXRoYXQgYWxyZWFkeSBleGlzdHMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgb2YgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlLCByaWdodC1jbGljayB0aGUgcHJvamVjdA0KLWFuZCB0aGVuIHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlByb2plY3QgRmFjZXRzPC91aWNvbnRyb2w+IHBhZ2UgaW4gdGhlIGluDQotdGhlIFByb3BlcnRpZXMgd2luZG93LjwvY21kPjxpbmZvPlRoaXMgcGFnZSBsaXN0cyB0aGUgZmFjZXRzIGluIHRoZSBwcm9qZWN0DQotYW5kIHRoZWlyIHZlcnNpb25zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk1vZGlmeSBQcm9qZWN0PC91aWNvbnRyb2w+IGFuZCBzZWxlY3QgdGhlIGNoZWNrDQotYm94ZXMgbmV4dCB0byB0aGUgZmFjZXRzIHlvdSB3YW50IHRoZSBwcm9qZWN0IHRvIGhhdmUuPC9jbWQ+PGluZm8+PHA+T25seQ0KLXRoZSBmYWNldHMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBwcm9qZWN0IGFyZSBsaXN0ZWQ6PHVsPg0KLTxsaT5UaGUgbGlzdCBvZiBydW50aW1lcyBzZWxlY3RlZCBmb3IgdGhlIHByb2plY3QgbGltaXRzIHRoZSBmYWNldHMgc2hvd24NCi1pbiB0aGUgbGlzdC4gT25seSB0aGUgZmFjZXRzIGNvbXBhdGlibGUgd2l0aCBhbGwgc2VsZWN0ZWQgdGFyZ2V0IHJ1bnRpbWVzDQotYXJlIHNob3duLjwvbGk+DQotPGxpPlRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmFjZXRzIGFuZCB0aGVpciB2ZXJzaW9uIG51bWJlcnMgbGltaXQgdGhlIG90aGVyDQotZmFjZXRzIHNob3duIGluIHRoZSBsaXN0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2plY3QgY29udGFpbnMgdGhlIER5bmFtaWMNCi1XZWIgTW9kdWxlIGZhY2V0LCB0aGUgRUpCIE1vZHVsZSBmYWNldCBpcyBub3QgbGlzdGVkIGJlY2F1c2UgdGhlc2UgdHdvIGZhY2V0cw0KLWNhbm5vdCBiZSBpbiB0aGUgc2FtZSBwcm9qZWN0LjwvbGk+DQotPC91bD5Zb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlIHJlcXVpcmVtZW50cyBhbmQgbGltaXRhdGlvbnMgZm9yIGVhY2gNCi1mYWNldCBieSByaWdodC1jbGlja2luZyB0aGUgZmFjZXQgbmFtZSBhbmQgdGhlbiBjbGlja2luZyA8dWljb250cm9sPlNob3cgQ29uc3RyYWludHM8L3VpY29udHJvbD4uPC9wPjxwPllvdQ0KLWNhbiBhbHNvIGNob29zZSBhIHByZXNldCBjb21iaW5hdGlvbiBvZiBmYWNldHMgZnJvbSB0aGUgPHVpY29udHJvbD5QcmVzZXRzPC91aWNvbnRyb2w+IGxpc3QuPC9wPjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DaG9vc2UgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGZhY2V0IGJ5IGNsaWNraW5nIHRoZSBjdXJyZW50IHZlcnNpb24NCi1udW1iZXIgYW5kIHNlbGVjdGluZyB0aGUgdmVyc2lvbiBudW1iZXIgeW91IHdhbnQgZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIHJlbW92ZSBhIGZhY2V0LCBjbGVhciBpdHMgY2hlY2sgYm94LjwvY21kPg0KLTxpbmZvPk5vdCBhbGwgZmFjZXRzIGNhbiBiZSByZW1vdmVkLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+SWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIHByb2plY3Qgc28gaXQgd2lsbA0KLWJlIGNvbXBhdGlibGUgd2l0aCBvbmUgb3IgbW9yZSBydW50aW1lcywgY2xpY2sgb24gdGhlIFJ1bnRpbWVzIHRhYiBhbmQgc2VsZWN0DQotdGhlIHJ1bnRpbWVzIHRoYXQgeW91IHdhbnQgdGhlIHByb2plY3QgdG8gYmUgY29tcGF0aWJsZSB3aXRoLjwvY21kPjxpbmZvPkZvcg0KLW1vcmUgaW5mb3JtYXRpb24gb24gcnVudGltZXMsIHNlZSA8eHJlZiBocmVmPSJ0anRhcmdldHNlcnZlci5kaXRhIj48L3hyZWY+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPiB0byBleGl0IHRoZSBNb2RpZnkgRmFjZXRlZA0KLVByb2plY3QgZGlhbG9nIGFuZCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGFkZGluZ2ZhY2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YWRkaW5nZmFjZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1M2QxMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90YWRkaW5nZmFjZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyB0byBhZGQgYSBmYWNldCB0byBhbiBleGlzdGluZyBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyB0byBhZGQgYSBmYWNldCB0byBhbiBleGlzdGluZyBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InByb2plY3RzLCBmYWNldHMsIGFkZGluZywgSmF2YSBFRSwgYWRkaW5nIHByb2plY3QgZmFjZXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0icHJvamVjdHMsIGZhY2V0cywgYWRkaW5nLCBKYXZhIEVFLCBhZGRpbmcgcHJvamVjdCBmYWNldHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNoYW5nZWZhY2V0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGluZ2ZhY2V0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGEgZmFjZXQgdG8gYSBKYXZhIEVFIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRpbmdmYWNldCI+PGEgbmFtZT0idGFkZGluZ2ZhY2V0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5BZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF90YXNrYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhpcyB0b3BpYyBleHBsYWlucyBob3cgdG8gYWRkIGEgZmFjZXQKLXRvIGFuIGV4aXN0aW5nIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9jb250ZXh0Ij48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotPHA+V2hlbiB5b3UgYWRkIGEgZmFjZXQgdG8gYSBwcm9qZWN0LCB0aGF0IHByb2plY3QgaXMgY29uZmlndXJlZAotdG8gcGVyZm9ybSBhIGNlcnRhaW4gdGFzaywgZnVsZmlsbCBjZXJ0YWluIHJlcXVpcmVtZW50cywgb3IgaGF2ZSBjZXJ0YWluIGNoYXJhY3RlcmlzdGljcy4KLUZvciBleGFtcGxlLCB0aGUgRUFSIGZhY2V0IHNldHMgdXAgYSBwcm9qZWN0IHRvIGZ1bmN0aW9uIGFzIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIGJ5IGFkZGluZyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgc2V0dGluZyB1cCB0aGUgcHJvamVjdCdzCi1jbGFzc3BhdGguPC9wPgotIDxwPk5ldyBwcm9qZWN0cyBnZW5lcmFsbHkgaGF2ZQotZmFjZXRzIGFkZGVkIHRvIHRoZW0gd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiBUbyBhZGQgYW5vdGhlciBmYWNldCB0byBhIHByb2plY3QKLXRoYXQgYWxyZWFkeSBleGlzdHMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IG9mIHRoZSBKYXZh4oSiIEVFIHBlcnNwZWN0aXZlLCByaWdodC1jbGljayB0aGUgcHJvamVjdAotYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdCBGYWNldHM8L3NwYW4+IHBhZ2UgaW4gdGhlIGluCi10aGUgUHJvcGVydGllcyB3aW5kb3cuPC9zcGFuPiBUaGlzIHBhZ2UgbGlzdHMgdGhlIGZhY2V0cyBpbiB0aGUgcHJvamVjdAotYW5kIHRoZWlyIHZlcnNpb25zLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TW9kaWZ5IFByb2plY3Q8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIGNoZWNrCi1ib3hlcyBuZXh0IHRvIHRoZSBmYWNldHMgeW91IHdhbnQgdGhlIHByb2plY3QgdG8gaGF2ZS48L3NwYW4+IDxkaXYgY2xhc3M9InAiPk9ubHkKLXRoZSBmYWNldHMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBwcm9qZWN0IGFyZSBsaXN0ZWQ6PHVsPgotPGxpPlRoZSBsaXN0IG9mIHJ1bnRpbWVzIHNlbGVjdGVkIGZvciB0aGUgcHJvamVjdCBsaW1pdHMgdGhlIGZhY2V0cyBzaG93bgotaW4gdGhlIGxpc3QuIE9ubHkgdGhlIGZhY2V0cyBjb21wYXRpYmxlIHdpdGggYWxsIHNlbGVjdGVkIHRhcmdldCBydW50aW1lcwotYXJlIHNob3duLjwvbGk+Ci0KLTxsaT5UaGUgY3VycmVudGx5IHNlbGVjdGVkIGZhY2V0cyBhbmQgdGhlaXIgdmVyc2lvbiBudW1iZXJzIGxpbWl0IHRoZSBvdGhlcgotZmFjZXRzIHNob3duIGluIHRoZSBsaXN0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2plY3QgY29udGFpbnMgdGhlIER5bmFtaWMKLVdlYiBNb2R1bGUgZmFjZXQsIHRoZSBFSkIgTW9kdWxlIGZhY2V0IGlzIG5vdCBsaXN0ZWQgYmVjYXVzZSB0aGVzZSB0d28gZmFjZXRzCi1jYW5ub3QgYmUgaW4gdGhlIHNhbWUgcHJvamVjdC48L2xpPgotCi08L3VsPgotWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSByZXF1aXJlbWVudHMgYW5kIGxpbWl0YXRpb25zIGZvciBlYWNoCi1mYWNldCBieSByaWdodC1jbGlja2luZyB0aGUgZmFjZXQgbmFtZSBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TaG93IENvbnN0cmFpbnRzPC9zcGFuPi48L2Rpdj4KLTxwPllvdQotY2FuIGFsc28gY2hvb3NlIGEgcHJlc2V0IGNvbWJpbmF0aW9uIG9mIGZhY2V0cyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVzZXRzPC9zcGFuPiBsaXN0LjwvcD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DaG9vc2UgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGZhY2V0IGJ5IGNsaWNraW5nIHRoZSBjdXJyZW50IHZlcnNpb24KLW51bWJlciBhbmQgc2VsZWN0aW5nIHRoZSB2ZXJzaW9uIG51bWJlciB5b3Ugd2FudCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIHJlbW92ZSBhIGZhY2V0LCBjbGVhciBpdHMgY2hlY2sgYm94Ljwvc3Bhbj4KLSBOb3QgYWxsIGZhY2V0cyBjYW4gYmUgcmVtb3ZlZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPklmIHlvdSB3YW50IHRvIGxpbWl0IHRoZSBwcm9qZWN0IHNvIGl0IHdpbGwKLWJlIGNvbXBhdGlibGUgd2l0aCBvbmUgb3IgbW9yZSBydW50aW1lcywgY2xpY2sgb24gdGhlIFJ1bnRpbWVzIHRhYiBhbmQgc2VsZWN0Ci10aGUgcnVudGltZXMgdGhhdCB5b3Ugd2FudCB0aGUgcHJvamVjdCB0byBiZSBjb21wYXRpYmxlIHdpdGguPC9zcGFuPiBGb3IKLW1vcmUgaW5mb3JtYXRpb24gb24gcnVudGltZXMsIHNlZSA8YSBocmVmPSJ0anRhcmdldHNlcnZlci5odG1sIiB0aXRsZT0iV2hlbiB5b3UgZGV2ZWxvcCBKMkVFIGFwcGxpY2F0aW9ucywmIzEwO3lvdSBjYW4gc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZSYjMTA7dGFyZ2V0IHNlcnZlciBpcyBzcGVjaWZpZWQgZHVyaW5nIHByb2plY3QgY3JlYXRpb24gYW5kIGltcG9ydCwgYW5kIGl0IGNhbiYjMTA7YmUgY2hhbmdlZCBpbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzLiBUaGUgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0JiMxMDttZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuIj5TcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzPC9hPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBleGl0IHRoZSBNb2RpZnkgRmFjZXRlZAotUHJvamVjdCBkaWFsb2cgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9wb3N0cmVxIj48cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NmYWNldHMuaHRtbCIgdGl0bGU9IkZhY2V0cyBkZWZpbmUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXF1aXJlbWVudHMgZm9yIEphdmEgRUUgcHJvamVjdHMgYW5kIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4iPlByb2plY3QgZmFjZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y2hhbmdlamF2YWxldmVsLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiBKYXZhIHVzZWQgaW4gYSBKYXZhIEVFIHByb2plY3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIGZhY2V0LiI+Q2hhbmdpbmcgdGhlIEphdmEgY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y2hhbmdlZmFjZXQuaHRtbCIgdGl0bGU9IllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQgaW4gYSBKYXZhIEVFIHByb2plY3QgYnkgZWRpdGluZyB0aGUgZmFjZXRzIGZvciB0aGUgcHJvamVjdC4iPkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGNoYW5nZWZhY2V0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90Y2hhbmdlZmFjZXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMjQ0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90Y2hhbmdlZmFjZXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNoYW5nZWZhY2V0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQ8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgYSBmYWNldA0KLWluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZmFjZXRzPGluZGV4dGVybT5jaGFuZ2luZyB2ZXJzaW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SmF2YSBFRTxpbmRleHRlcm0+Y2hhbmdpbmcgZmFjZXQgdmVyc2lvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT5jaGFuZ2luZyBmYWNldCB2ZXJzaW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5DaGFuZ2luZw0KLXRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi12ZXJzaW9uIG9mIGEgSmF2YSBFRSBwcm9qZWN0IGludm9sdmVzIGNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSA8dWljb250cm9sPkphdmE8L3VpY29udHJvbD4gZmFjZXQuDQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBocmVmPSJ0Y2hhbmdlamF2YWxldmVsLmRpdGEiPjwveHJlZj4uPC9wPjxwPlRvDQotY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQgaW4geW91ciBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IG9mIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sgdGhlIHByb2plY3QNCi1hbmQgdGhlbiBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Qcm9qZWN0IEZhY2V0czwvdWljb250cm9sPiBwYWdlIGluIHRoZSBpbg0KLXRoZSBQcm9wZXJ0aWVzIHdpbmRvdy48L2NtZD48aW5mbz4gVGhpcyBwYWdlIGxpc3RzIHRoZSBmYWNldHMgaW4gdGhlIHByb2plY3QNCi1hbmQgdGhlaXIgdmVyc2lvbnMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TW9kaWZ5IFByb2plY3Q8L3VpY29udHJvbD4gYW5kIGNsaWNrIHRoZSBmYWNldA0KLXlvdSB3YW50IHRvIGNoYW5nZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHZlcnNpb24gb2YgdGhlIGZhY2V0IGZyb20gdGhlIGRyb3AtZG93biBib3ggbmV4dCB0bw0KLXRoZSBmYWNldCdzIG5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4gdG8gY2xvc2UgdGhlIE1vZGlmeSBGYWNldGVkDQotUHJvamVjdCB3aW5kb3cgYW5kIHRoZW4gY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90Y2hhbmdlZmFjZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RjaGFuZ2VmYWNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjk2MjMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RjaGFuZ2VmYWNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2hhbmdpbmcgdGhlIHZlcnNpb24gb2YgYSBmYWNldCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiBhIGZhY2V0IGluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQgaW4gYSBKYXZhIEVFIHByb2plY3QgYnkgZWRpdGluZyB0aGUgZmFjZXRzIGZvciB0aGUgcHJvamVjdC4iIC8+Ci08bWV0YSBjb250ZW50PSJmYWNldHMsIGNoYW5naW5nIHZlcnNpb25zLCBKYXZhIEVFLCBjaGFuZ2luZyBmYWNldCB2ZXJzaW9ucywgcHJvamVjdHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJmYWNldHMsIGNoYW5naW5nIHZlcnNpb25zLCBKYXZhIEVFLCBjaGFuZ2luZyBmYWNldCB2ZXJzaW9ucywgcHJvamVjdHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluZ2ZhY2V0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y2hhbmdlamF2YWxldmVsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNoYW5nZWZhY2V0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q2hhbmdpbmcgdGhlIHZlcnNpb24gb2YgYSBmYWNldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNoYW5nZWZhY2V0Ij48YSBuYW1lPSJ0Y2hhbmdlZmFjZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkNoYW5naW5nIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQ8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIGEgZmFjZXQKLWluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9jb250ZXh0Ij48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotIDxwPkNoYW5naW5nCi10aGUgSmF2YeKEoiBjb21waWxlcgotdmVyc2lvbiBvZiBhIEphdmEgRUUgcHJvamVjdCBpbnZvbHZlcyBjaGFuZ2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YTwvc3Bhbj4gZmFjZXQuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InRjaGFuZ2VqYXZhbGV2ZWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIEphdmEgdXNlZCYjMTA7aW4gYSBKYXZhIEVFIHByb2plY3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIGZhY2V0LiI+Q2hhbmdpbmcgdGhlIEphdmEgY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3Q8L2E+LjwvcD4KLTxwPlRvCi1jaGFuZ2UgdGhlIHZlcnNpb24gb2YgYSBmYWNldCBpbiB5b3VyIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IG9mIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCByaWdodC1jbGljayB0aGUgcHJvamVjdAotYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdCBGYWNldHM8L3NwYW4+IHBhZ2UgaW4gdGhlIGluCi10aGUgUHJvcGVydGllcyB3aW5kb3cuPC9zcGFuPiAgVGhpcyBwYWdlIGxpc3RzIHRoZSBmYWNldHMgaW4gdGhlIHByb2plY3QKLWFuZCB0aGVpciB2ZXJzaW9ucy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1vZGlmeSBQcm9qZWN0PC9zcGFuPiBhbmQgY2xpY2sgdGhlIGZhY2V0Ci15b3Ugd2FudCB0byBjaGFuZ2UuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB2ZXJzaW9uIG9mIHRoZSBmYWNldCBmcm9tIHRoZSBkcm9wLWRvd24gYm94IG5leHQgdG8KLXRoZSBmYWNldCdzIG5hbWUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBjbG9zZSB0aGUgTW9kaWZ5IEZhY2V0ZWQKLVByb2plY3Qgd2luZG93IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIHRpdGxlPSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzIGZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIj5Qcm9qZWN0IGZhY2V0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluZ2ZhY2V0Lmh0bWwiIHRpdGxlPSJUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyB0byBhZGQgYSBmYWNldCB0byBhbiBleGlzdGluZyBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlLiI+QWRkaW5nIGEgZmFjZXQgdG8gYSBKYXZhIEVFIHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y2hhbmdlamF2YWxldmVsLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiBKYXZhIHVzZWQgaW4gYSBKYXZhIEVFIHByb2plY3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIGZhY2V0LiI+Q2hhbmdpbmcgdGhlIEphdmEgY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVlOTllLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RjaGFuZ2VqYXZhbGV2ZWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNoYW5nZWphdmFsZXZlbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5DaGFuZ2luZyB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gdXNlZA0KLWluIGEgSmF2YSBFRSBwcm9qZWN0IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgPHVpY29udHJvbD5KYXZhPC91aWNvbnRyb2w+IGZhY2V0Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkphdmEgRUU8aW5kZXh0ZXJtPnByb2plY3QgY29tcGlsZXIgbGV2ZWw8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT5KYXZhIGNvbXBpbGVyIGxldmVsPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+IDxwPlRoZSA8dWljb250cm9sPkphdmE8L3VpY29udHJvbD4gZmFjZXQNCi1hcHBsaWVzIG9ubHkgdG8gSjJFRSBwcm9qZWN0cy4gVG8gc2V0IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlciBsZXZlbCBvZiBhIG5vbi1KYXZhIEVFIHByb2plY3QsDQotc3VjaCBhcyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3QsIHNlZSA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9yZWZlcmVuY2UvcmVmLXByb3BlcnRpZXMtY29tcGlsZXIuaHRtIg0KLXNjb3BlPSJwZWVyIj5KYXZhIENvbXBpbGVyPC94cmVmPi48L3A+PHA+VG8gY2hhbmdlIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlcg0KLXZlcnNpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgb2YgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlLCByaWdodC1jbGljayB0aGUgcHJvamVjdA0KLWFuZCB0aGVuIHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlByb2plY3QgRmFjZXRzPC91aWNvbnRyb2w+IHBhZ2UgaW4gdGhlIGluDQotdGhlIFByb3BlcnRpZXMgd2luZG93LjwvY21kPjxpbmZvPiBUaGlzIHBhZ2UgbGlzdHMgdGhlIGZhY2V0cyBpbiB0aGUgcHJvamVjdA0KLWFuZCB0aGVpciB2ZXJzaW9ucy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5Nb2RpZnkgUHJvamVjdDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Eb3VibGUgY2xpY2sgdGhlIHZlcnNpb24gbnVtYmVyIG5leHQgdG8gdGhlPHVpY29udHJvbD5KYXZhPC91aWNvbnRyb2w+IGZhY2V0DQotdG8gc2VsZWN0IGEgZGlmZmVyZW50IGxldmVsIG9mIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvbXBpbGVyLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+IHRvIGNsb3NlIHRoZSBNb2RpZnkgRmFjZXRlZA0KLVByb2plY3Qgd2luZG93IGFuZCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGNoYW5nZWphdmFsZXZlbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQ5ZDRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RjaGFuZ2VqYXZhbGV2ZWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNoYW5naW5nIHRoZSBKYXZhIGNvbXBpbGVyIHZlcnNpb24gZm9yIGEgSmF2YSBFRSBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIEphdmEgdXNlZCBpbiBhIEphdmEgRUUgcHJvamVjdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIEphdmEgZmFjZXQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIEphdmEgdXNlZCBpbiBhIEphdmEgRUUgcHJvamVjdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIEphdmEgZmFjZXQuIiAvPgotPG1ldGEgY29udGVudD0iSmF2YSBFRSwgcHJvamVjdCBjb21waWxlciBsZXZlbCwgcHJvamVjdHMsIEphdmEgY29tcGlsZXIgbGV2ZWwiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFLCBwcm9qZWN0IGNvbXBpbGVyIGxldmVsLCBwcm9qZWN0cywgSmF2YSBjb21waWxlciBsZXZlbCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5nZmFjZXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjaGFuZ2VmYWNldC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2ZhY2V0cy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjaGFuZ2VqYXZhbGV2ZWwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DaGFuZ2luZyB0aGUgSmF2YSBjb21waWxlciB2ZXJzaW9uIGZvciBhIEphdmEgRUUgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNoYW5nZWphdmFsZXZlbCI+PGEgbmFtZT0idGNoYW5nZWphdmFsZXZlbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+Q2hhbmdpbmcgdGhlIEphdmEgY29tcGlsZXIgdmVyc2lvbiBmb3IgYSBKYXZhIEVFIHByb2plY3Q8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIEphdmHihKIgdXNlZAotaW4gYSBKYXZhIEVFIHByb2plY3QgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhPC9zcGFuPiBmYWNldC48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPjxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmE8L3NwYW4+IGZhY2V0Ci1hcHBsaWVzIG9ubHkgdG8gSjJFRSBwcm9qZWN0cy4gVG8gc2V0IHRoZSBKYXZhIGNvbXBpbGVyIGxldmVsIG9mIGEgbm9uLUphdmEgRUUgcHJvamVjdCwKLXN1Y2ggYXMgYSBKYXZhIHByb2plY3QsIHNlZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1wcm9wZXJ0aWVzLWNvbXBpbGVyLmh0bSI+SmF2YSBDb21waWxlcjwvYT4uPC9wPgotPHA+VG8gY2hhbmdlIHRoZSBKYXZhIGNvbXBpbGVyCi12ZXJzaW9uLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sgdGhlIHByb2plY3QKLWFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QgRmFjZXRzPC9zcGFuPiBwYWdlIGluIHRoZSBpbgotdGhlIFByb3BlcnRpZXMgd2luZG93Ljwvc3Bhbj4gIFRoaXMgcGFnZSBsaXN0cyB0aGUgZmFjZXRzIGluIHRoZSBwcm9qZWN0Ci1hbmQgdGhlaXIgdmVyc2lvbnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2RpZnkgUHJvamVjdDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RG91YmxlIGNsaWNrIHRoZSB2ZXJzaW9uIG51bWJlciBuZXh0IHRvIHRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmE8L3NwYW4+IGZhY2V0Ci10byBzZWxlY3QgYSBkaWZmZXJlbnQgbGV2ZWwgb2YgSmF2YSBjb21waWxlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+IHRvIGNsb3NlIHRoZSBNb2RpZnkgRmFjZXRlZAotUHJvamVjdCB3aW5kb3cgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9wb3N0cmVxIj48cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NmYWNldHMuaHRtbCIgdGl0bGU9IkZhY2V0cyBkZWZpbmUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXF1aXJlbWVudHMgZm9yIEphdmEgRUUgcHJvamVjdHMgYW5kIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4iPlByb2plY3QgZmFjZXRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5nZmFjZXQuaHRtbCIgdGl0bGU9IlRoaXMgdG9waWMgZXhwbGFpbnMgaG93IHRvIGFkZCBhIGZhY2V0IHRvIGFuIGV4aXN0aW5nIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UuIj5BZGRpbmcgYSBmYWNldCB0byBhIEphdmEgRUUgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjaGFuZ2VmYWNldC5odG1sIiB0aXRsZT0iWW91IGNhbiBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgYSBmYWNldCBpbiBhIEphdmEgRUUgcHJvamVjdCBieSBlZGl0aW5nIHRoZSBmYWNldHMgZm9yIHRoZSBwcm9qZWN0LiI+Q2hhbmdpbmcgdGhlIHZlcnNpb24gb2YgYSBmYWNldDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGRlZmluaW5nYW5ub3RhdGlvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0ZjZiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amltcGVhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5EZWZpbmluZyBhbmQgdXNpbmcgYW5ub3RhdGlvbnM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiB1c2UgdGhlIEBJbnRlcmZhY2UgYW5ub3RhdGlvbg0KLXRvIGRlZmluZSB5b3VyIG93biBhbm5vdGF0aW9uIGRlZmluaXRpb24uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SmF2YSBFRSA1PGluZGV4dGVybT5hbm5vdGF0aW9uczwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZGVmaW5pbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPiA8cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+PHA+PGI+RGVmaW5pbmcNCi15b3VyIG93biBhbm5vdGF0aW9uczwvYj48L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlVzZSB0aGUgQEludGVyZmFjZSBhbm5vdGF0aW9uIHRvIGRlZmluZSB5b3VyIG93biBhbm5vdGF0aW9uIGRlZmluaXRpb246PC9jbWQ+DQotPGluZm8+PHA+PHVsPg0KLTxsaT5Bbm5vdGF0aW9uIGRlZmluaXRpb25zIHJlc2VtYmxlIGludGVyZmFjZSBkZWZpbml0aW9uczwvbGk+DQotPGxpPkFubm90YXRpb24gbWV0aG9kIGRlY2xhcmF0aW9ucyBoYXZlIG5laXRoZXIgcGFyYW1ldGVycyBub3IgPGNvZGVwaD50aHJvd3M8L2NvZGVwaD4gY2xhdXNlcywNCi1hbmQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOjx1bD4NCi08bGk+cHJpbWl0aXZlczwvbGk+DQotPGxpPlN0cmluZzwvbGk+DQotPGxpPkNsYXNzPC9saT4NCi08bGk+ZW51bTwvbGk+DQotPGxpPmFycmF5IG9mIHRoZSBhYm92ZSB0eXBlczwvbGk+DQotPC91bD48L2xpPg0KLTxsaT5NZXRob2RzIG1heSBoYXZlIGRlZmF1bHQgdmFsdWVzPC9saT4NCi08L3VsPjwvcD48cD48Y29kZWJsb2NrPnB1YmxpYyBAaW50ZXJmYWNlIENyZWF0ZWRCeXsNCi0gICAgIFN0cmluZyBuYW1lKCk7DQotICAgICBTdHJpbmcgZGF0ZSgpOw0KLSAgICAgYm9vbGVhbiBjb250cmFjdG9yKCkgZGVmYXVsdCBmYWxzZTsNCi19ICAgICAgICAgIDwvY29kZWJsb2NrPjxjb2RlYmxvY2s+QENyZWF0ZWRCeShuYW1lID0gIk1hcnkgU21pdGgiLGRhdGU9IjAyLzAyLzIwMDgiKTsNCi1wdWJsaWMgY2xhc3MgTXlDbGFzc3suLi4ufSAgICAgICAgIDwvY29kZWJsb2NrPjwvcD48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwPjxiPk1ldGEtYW5ub3RhdGlvbnM8L2I+OiBNZXRhLWFubm90YXRpb25zDQotKGFubm90YXRpb25zIG9mIGFubm90YXRpb25zKSBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGFuIGFubm90YXRpb24NCi1zaG91bGQgYmUgdXNlZDo8dWw+DQotPGxpPkBUYXJnZXQ8dWw+DQotPGxpPlJlc3RyaWN0cyB0aGUgdXNlIG9mIGFuIGFubm90YXRpb248L2xpPg0KLTxsaT5TaW5nbGUgYXJndW1lbnQgbXVzdCBiZSBmcm9tIEVudW0gRWxlbWVudFR5cGUgPHVsPg0KLTxsaT57VFlQRSwgRklFTEQsTUVUSE9ELCBQQVJBTUVURVIsIENPTlNUUlVDVE9SLCBMT0NBTF9WQVJJQUJMRSwgQU5OT1RBVElPTl9UWVBFfTwvbGk+DQotPC91bD48L2xpPg0KLTwvdWw+PC9saT4NCi08bGk+QFJldGVudGlvbjx1bD4NCi08bGk+SW5kaWNhdGVzIHdoZXJlIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0YWluZWQ8L2xpPg0KLTxsaT5TaW5nbGUgYXJndW1lbnQgbXVzdCBiZSBmcm9tIEVudW0gUmV0ZW50aW9uUG9saWN5PHVsPg0KLTxsaT57U09VUkNFLCBDTEFTUywgUlVOVElNRX08L2xpPg0KLTwvdWw+PC9saT4NCi08L3VsPjwvbGk+DQotPGxpPkBEb2N1bWVudGVkPHVsPg0KLTxsaT5NYXJrZXIgZm9yIGFubm90YXRpb25zIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIEphdmFkb2M8L2xpPg0KLTwvdWw+PC9saT4NCi08bGk+QEluaGVyaXRlZDx1bD4NCi08bGk+bWFya2VyIGZvciBUeXBlIGFubm90YXRpb25zIHRoYXQgYXJlIHRvIGJlIGluaGVyaXRlZCBieSBzdWJ0eXBlczwvbGk+DQotPC91bD48L2xpPg0KLTwvdWw+PGI+T3RoZXIgYnVpbHQtaW4gYW5ub3RhdGlvbnM8L2I+OiA8dWw+DQotPGxpPkBPdmVycmlkZXM8dWw+DQotPGxpPkFwcGxpZWQgdG8gYSBtZXRob2Q8L2xpPg0KLTxsaT5JbmRpY2F0ZXMgdGhhdCB0aGUgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIGFuIGVycm9yIGlmIHRoZSBtZXRob2QgZG9lcw0KLW5vdCBhY3R1YWxseSBvdmVycmlkZSBhIHN1cGVyY2xhc3MgbWV0aG9kLjwvbGk+DQotPC91bD48L2xpPg0KLTxsaT5ARGVwcmVjYXRlZDx1bD4NCi08bGk+QXBwbGllZCB0byBhIG1ldGhvZDwvbGk+DQotPGxpPkluZGljYXRlcyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQgZ2VuZXJhdGUgYSB3YXJuaW5nIHdoZW4gdGhlIG1ldGhvZA0KLWlzIHVzZWQgZXh0ZXJuYWxseTwvbGk+DQotPC91bD48L2xpPg0KLTxsaT5AU3VwcHJlc3NXYXJuaW5nczx1bD4NCi08bGk+QXBwbGllcyB0byBhIHR5cGUgb3IgYSBtZXRob2Q8L2xpPg0KLTxsaT5JbmRpY2F0ZXMgdGhhdCB0aGUgY29tcGlsZXIgc2hvdWxkIHN1cHJlc3Mgd2FybmluZ3MgZm9yIHRoYXQgZWxlbWVudCBhbmQNCi1hbGwgc3ViZWxlbWVudHM8cD48Y29kZWJsb2NrPkBEZXByZWNhdGVkDQotcHVibGljIHZvaWQgb2xkTWV0aG9kKCkgey4uLn0NCi0NCi1AIFN1cHJlc3NXYXJuaW5ncw0KLXB1YmxpYyB2b2lkIHllc0lrbm93SXVzZURlcHJlY2F0ZWRNZXRob2RzKCkgey4uLn08L2NvZGVibG9jaz48L3A+PC9saT4NCi08L3VsPjwvbGk+DQotPC91bD48L3A+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGRlZmluaW5nYW5ub3RhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNWNlNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90ZGVmaW5pbmdhbm5vdGF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlZmluaW5nIGFuZCB1c2luZyBhbm5vdGF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgQEludGVyZmFjZSBhbm5vdGF0aW9uIHRvIGRlZmluZSB5b3VyIG93biBhbm5vdGF0aW9uIGRlZmluaXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBASW50ZXJmYWNlIGFubm90YXRpb24gdG8gZGVmaW5lIHlvdXIgb3duIGFubm90YXRpb24gZGVmaW5pdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhIEVFIDUsIGFubm90YXRpb25zLCBkZWZpbmluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmEgRUUgNSwgYW5ub3RhdGlvbnMsIGRlZmluaW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Nhbm5vdGF0aW9ucy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3R5cGVzb2Zhbm5vLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGppbXBlYXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWZpbmluZyBhbmQgdXNpbmcgYW5ub3RhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqaW1wZWFyIj48YSBuYW1lPSJ0amltcGVhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+RGVmaW5pbmcgYW5kIHVzaW5nIGFubm90YXRpb25zPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3Rhc2tib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5Zb3UgY2FuIHVzZSB0aGUgQEludGVyZmFjZSBhbm5vdGF0aW9uCi10byBkZWZpbmUgeW91ciBvd24gYW5ub3RhdGlvbiBkZWZpbml0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci08cD48c3Ryb25nPkRlZmluaW5nCi15b3VyIG93biBhbm5vdGF0aW9uczwvc3Ryb25nPjwvcD4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuPlVzZSB0aGUgQEludGVyZmFjZSBhbm5vdGF0aW9uIHRvIGRlZmluZSB5b3VyIG93biBhbm5vdGF0aW9uIGRlZmluaXRpb246PC9zcGFuPgotIDxkaXYgY2xhc3M9InAiPjx1bD4KLTxsaT5Bbm5vdGF0aW9uIGRlZmluaXRpb25zIHJlc2VtYmxlIGludGVyZmFjZSBkZWZpbml0aW9uczwvbGk+Ci0KLTxsaT5Bbm5vdGF0aW9uIG1ldGhvZCBkZWNsYXJhdGlvbnMgaGF2ZSBuZWl0aGVyIHBhcmFtZXRlcnMgbm9yIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnRocm93czwvc2FtcD4gY2xhdXNlcywKLWFuZCByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6PHVsPgotPGxpPnByaW1pdGl2ZXM8L2xpPgotCi08bGk+U3RyaW5nPC9saT4KLQotPGxpPkNsYXNzPC9saT4KLQotPGxpPmVudW08L2xpPgotCi08bGk+YXJyYXkgb2YgdGhlIGFib3ZlIHR5cGVzPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5NZXRob2RzIG1heSBoYXZlIGRlZmF1bHQgdmFsdWVzPC9saT4KLQotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHByZT5wdWJsaWMgQGludGVyZmFjZSBDcmVhdGVkQnl7Ci0gICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgIFN0cmluZyBkYXRlKCk7Ci0gICAgIGJvb2xlYW4gY29udHJhY3RvcigpIGRlZmF1bHQgZmFsc2U7Ci19ICAgICAgICAgIDwvcHJlPgotPHByZT5AQ3JlYXRlZEJ5KG5hbWUgPSAiTWFyeSBTbWl0aCIsZGF0ZT0iMDIvMDIvMjAwOCIpOwotcHVibGljIGNsYXNzIE15Q2xhc3N7Li4uLn0gICAgICAgICA8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PGRpdiBjbGFzcz0icCI+PHN0cm9uZz5NZXRhLWFubm90YXRpb25zPC9zdHJvbmc+OiBNZXRhLWFubm90YXRpb25zCi0oYW5ub3RhdGlvbnMgb2YgYW5ub3RhdGlvbnMpIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBob3cgYW4gYW5ub3RhdGlvbgotc2hvdWxkIGJlIHVzZWQ6PHVsPgotPGxpPkBUYXJnZXQ8dWw+Ci08bGk+UmVzdHJpY3RzIHRoZSB1c2Ugb2YgYW4gYW5ub3RhdGlvbjwvbGk+Ci0KLTxsaT5TaW5nbGUgYXJndW1lbnQgbXVzdCBiZSBmcm9tIEVudW0gRWxlbWVudFR5cGUgPHVsPgotPGxpPntUWVBFLCBGSUVMRCxNRVRIT0QsIFBBUkFNRVRFUiwgQ09OU1RSVUNUT1IsIExPQ0FMX1ZBUklBQkxFLCBBTk5PVEFUSU9OX1RZUEV9PC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+QFJldGVudGlvbjx1bD4KLTxsaT5JbmRpY2F0ZXMgd2hlcmUgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSByZXRhaW5lZDwvbGk+Ci0KLTxsaT5TaW5nbGUgYXJndW1lbnQgbXVzdCBiZSBmcm9tIEVudW0gUmV0ZW50aW9uUG9saWN5PHVsPgotPGxpPntTT1VSQ0UsIENMQVNTLCBSVU5USU1FfTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkBEb2N1bWVudGVkPHVsPgotPGxpPk1hcmtlciBmb3IgYW5ub3RhdGlvbnMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gSmF2YWRvYzwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+QEluaGVyaXRlZDx1bD4KLTxsaT5tYXJrZXIgZm9yIFR5cGUgYW5ub3RhdGlvbnMgdGhhdCBhcmUgdG8gYmUgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci08c3Ryb25nPk90aGVyIGJ1aWx0LWluIGFubm90YXRpb25zPC9zdHJvbmc+OiA8dWw+Ci08bGk+QE92ZXJyaWRlczx1bD4KLTxsaT5BcHBsaWVkIHRvIGEgbWV0aG9kPC9saT4KLQotPGxpPkluZGljYXRlcyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgdGhlIG1ldGhvZCBkb2VzCi1ub3QgYWN0dWFsbHkgb3ZlcnJpZGUgYSBzdXBlcmNsYXNzIG1ldGhvZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkBEZXByZWNhdGVkPHVsPgotPGxpPkFwcGxpZWQgdG8gYSBtZXRob2Q8L2xpPgotCi08bGk+SW5kaWNhdGVzIHRoYXQgdGhlIGNvbXBpbGVyIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiB0aGUgbWV0aG9kCi1pcyB1c2VkIGV4dGVybmFsbHk8L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkBTdXBwcmVzc1dhcm5pbmdzPHVsPgotPGxpPkFwcGxpZXMgdG8gYSB0eXBlIG9yIGEgbWV0aG9kPC9saT4KLQotPGxpPkluZGljYXRlcyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQgc3VwcmVzcyB3YXJuaW5ncyBmb3IgdGhhdCBlbGVtZW50IGFuZAotYWxsIHN1YmVsZW1lbnRzPGRpdiBjbGFzcz0icCI+PHByZT5ARGVwcmVjYXRlZAotcHVibGljIHZvaWQgb2xkTWV0aG9kKCkgey4uLn0KLQotQCBTdXByZXNzV2FybmluZ3MKLXB1YmxpYyB2b2lkIHllc0lrbm93SXVzZURlcHJlY2F0ZWRNZXRob2RzKCkgey4uLn08L3ByZT4KLTwvZGl2PgotPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvY3R5cGVzb2Zhbm5vLmh0bWwiPlR5cGVzIG9mIGFubm90YXRpb25zPC9hPjwvc3Ryb25nPjxiciAvPgotSmF2YSBFRSA1IGRlZmluZXMgYSBudW1iZXIgb2YgdHlwZXMgb3IgZ3JvdXBzIG9mIGFubm90YXRpb25zLCBkZWZpbmVkIGluIGEgbnVtYmVyIG9mIEphdmEgU3BlY2lmaWNhdGlvbiBSZXF1ZXN0cyAoSlNScykuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY2Fubm90YXRpb25zLmh0bWwiIHRpdGxlPSJUaGUgZ29hbCBvZiBKYXZhIEVFIDUgcGxhdGZvcm0gZGV2ZWxvcG1lbnQgaXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBhcnRpZmFjdHMgdGhhdCB5b3UgaGF2ZSB0byBjcmVhdGUgYW5kIG1haW50YWluLCB0aGVyZWJ5IHNpbXBsaWZ5aW5nIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiBKYXZhIEVFIDUgc3VwcG9ydHMgdGhlIGluamVjdGlvbiBvZiBhbm5vdGF0aW9ucyBpbnRvIHlvdXIgc291cmNlIGNvZGUsIHNvIHRoYXQgeW91IGNhbiBlbWJlZCByZXNvdXJjZXMsIGRlcGVuZGVuY2llcywgc2VydmljZXMsIGFuZCBsaWZlLWN5Y2xlIG5vdGlmaWNhdGlvbnMgaW4geW91ciBzb3VyY2UgY29kZSwgd2l0aG91dCBoYXZpbmcgdG8gbWFpbnRhaW4gdGhlc2UgYXJ0aWZhY3RzIGVsc2V3aGVyZS4iPkphdmEgRUUgNSBzdXBwb3J0IGZvciBhbm5vdGF0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFwcHByb2ouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYXBwcHJvai5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM5NjA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYXBwcHJvai5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amFwcHByb2oiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3DQotYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uDQotcHJvamVjdC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij4gPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5BcHBsaWNhdGlvbg0KLWNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcw0KLWFuZCBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMuIEFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0DQotaXMgZGVwbG95ZWQgYXMgYSBKQVIgZmlsZS48L3A+PHA+TGlrZSB0aGUgb3RoZXIgdHlwZXMgb2YgcHJvamVjdHMsIGFwcGxpY2F0aW9uDQotY2xpZW50IHByb2plY3RzIGNhbiBjb250YWluIG9uZSBvciBtb3JlIHByb2plY3QgZmFjZXRzLCB3aGljaCByZXByZXNlbnQgdW5pdHMNCi1vZiBmdW5jdGlvbmFsaXR5IGluIHRoZSBwcm9qZWN0LiBBIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBzaG91bGQgaGF2ZQ0KLXRoZSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIGZhY2V0LiBEZXBlbmRpbmcgb24gd2hhdCB5b3Ugd2FudCB0byB1c2UgdGhlDQotcHJvamVjdCBmb3IsIHlvdSBtYXkgd2FudCB0byBlbmFibGUgb3RoZXIgZmFjZXRzIGZvciB0aGUgcHJvamVjdC48L3A+PHA+VG8NCi1jcmVhdGUgYSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJvamVjdDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBOZXcgUHJvamVjdCBXaXphcmQsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5KYXZhDQotRUU8L3VpY29udHJvbD48dWljb250cm9sPkFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kDQotY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlByb2plY3QgTmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBhIG5hbWUgZm9yDQotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+VG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByb2plY3QgbG9jYXRpb24sIGNsZWFyDQotdGhlIDx1aWNvbnRyb2w+VXNlIGRlZmF1bHQ8L3VpY29udHJvbD4gY2hlY2sgYm94IHVuZGVyIDx1aWNvbnRyb2w+UHJvamVjdA0KLWNvbnRlbnRzPC91aWNvbnRyb2w+IGFuZCBzZWxlY3QgYSBuZXcgbG9jYXRpb24gd2l0aCB0aGUgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gYnV0dG9uLjwvY21kPg0KLTxpbmZvPklmIHlvdSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgYmVpbmcNCi11c2VkIGJ5IGFub3RoZXIgcHJvamVjdCwgdGhlIHByb2plY3QgY3JlYXRpb24gd2lsbCBmYWlsLjxub3RlPklmIHlvdSB0eXBlDQotYSBuZXcgRUFSIHByb2plY3QgbmFtZSwgdGhlIEVBUiBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbg0KLXdpdGggdGhlIGxvd2VzdCBjb21wYXRpYmxlIEphdmEgRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdA0KLWJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvciBhIGRpZmZlcmVudCBsb2NhdGlvbg0KLWZvciB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbg0KLVByb2plY3Qgd2l6YXJkLjwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIGFkZCB0aGUgbmV3IHByb2plY3QgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3QsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BZGQgcHJvamVjdCB0byBhbiBFQVI8L3VpY29udHJvbD4gY2hlY2sgYm94DQotYW5kIHNlbGVjdCBhIHByb2plY3QgaW4gdGhlIDx1aWNvbnRyb2w+RUFSIFByb2plY3QgTmFtZTwvdWljb250cm9sPiBsaXN0LjwvY21kPg0KLTxpbmZvPklmIHlvdSBjaG9vc2UgdG8gYWRkIHRoZSBwcm9qZWN0IHRvIGFuIGV4aXN0aW5nIEVBUiBwcm9qZWN0LCB0aGUgPHVpY29udHJvbD5UYXJnZXQNCi1ydW50aW1lPC91aWNvbnRyb2w+IGZpZWxkIGJlY29tZXMgZGlzYWJsZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IHJ1bnRpbWUgZm9yDQotdGhlIG5ldyBwcm9qZWN0IHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgRUFSIHByb2plY3QuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlRhcmdldCBydW50aW1lPC91aWNvbnRyb2w+IGZpZWxkLCBzZWxlY3QgdGhlDQotdGFyZ2V0IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyB1c2UgYSBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXINCi1wcm9qZWN0LCBzZWxlY3QgYSBjb25maWd1cmF0aW9uIGluIHRoZSA8dWljb250cm9sPkNvbmZpZ3VyYXRpb25zPC91aWNvbnRyb2w+IGxpc3QuDQotWW91IGNhbiBjbGljayB0aGUgPHVpY29udHJvbD5Nb2RpZnk8L3VpY29udHJvbD4gYnV0dG9uIHRvIGRvIHRoZSBmb2xsb3dpbmc6PC9jbWQ+DQotPGluZm8+PHVsPg0KLTxsaT5DdXN0b21pemUgcHJvamVjdCBmYWNldHMuIFNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byB0aGUgZmFjZXRzIHlvdQ0KLXdhbnQgdGhlIHByb2plY3QgdG8gaGF2ZSBhbmQgc2VsZWN0IGEgdmVyc2lvbiBudW1iZXIgZm9yIGVhY2ggZmFjZXQuIFNlbGVjdA0KLWEgZmFjZXQgbmFtZSB0byBzZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGZhY2V0IGluIHRoZSA8dWljb250cm9sPkRldGFpbHM8L3VpY29udHJvbD4gdGFiLg0KLVlvdSBjYW4gYWxzbyBjaG9vc2UgYSBwcmVzZXQgY29tYmluYXRpb24gb2YgZmFjZXRzIGZyb20gdGhlIDx1aWNvbnRyb2w+Q29uZmlndXJhdGlvbnM8L3VpY29udHJvbD4gbGlzdC48L2xpPg0KLTxsaT5MaW1pdCB5b3VyIHByb2plY3QgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9uZSBvciBtb3JlIHJ1bnRpbWVzLiBDbGljayB0aGUgPHVpY29udHJvbD5TaG93DQotUnVudGltZXM8L3VpY29udHJvbD4gdGFiIGFuZCBzZWxlY3QgdGhlIHJ1bnRpbWVzIHRoYXQgeW91IHdhbnQgdGhlIHByb2plY3QNCi10byBiZSBjb21wYXRpYmxlIHdpdGguIDwvbGk+DQotPC91bD5DbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlNvdXJjZSBGb2xkZXI8L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBuYW1lDQotb2YgdGhlIGZvbGRlciB0byB1c2UgZm9yIHNvdXJjZSBjb2RlLiA8L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+VG8gY3JlYXRlIGEgZGVmYXVsdCBjbGFzcyBmb3IgdGhlIG1vZHVsZSwNCi1zZWxlY3QgdGhlIDx1aWNvbnRyb2w+Q3JlYXRlIGEgZGVmYXVsdCBNYWluIGNsYXNzPC91aWNvbnRyb2w+IGNoZWNrIGJveC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFwcHByb2ouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYXBwcHJvai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY4ODAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqYXBwcHJvai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2ZhY2V0cy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqYXBwcHJvaiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amFwcHByb2oiPjxhIG5hbWU9InRqYXBwcHJvaiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldwotYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0LjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+QXBwbGljYXRpb24KLWNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcwotYW5kIHByb2dyYW1zIHRoYXQgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcy4gQW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QKLWlzIGRlcGxveWVkIGFzIGEgSkFSIGZpbGUuPC9wPgotPHA+TGlrZSB0aGUgb3RoZXIgdHlwZXMgb2YgcHJvamVjdHMsIGFwcGxpY2F0aW9uCi1jbGllbnQgcHJvamVjdHMgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgcHJvamVjdCBmYWNldHMsIHdoaWNoIHJlcHJlc2VudCB1bml0cwotb2YgZnVuY3Rpb25hbGl0eSBpbiB0aGUgcHJvamVjdC4gQSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Qgc2hvdWxkIGhhdmUKLXRoZSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIGZhY2V0LiBEZXBlbmRpbmcgb24gd2hhdCB5b3Ugd2FudCB0byB1c2UgdGhlCi1wcm9qZWN0IGZvciwgeW91IG1heSB3YW50IHRvIGVuYWJsZSBvdGhlciBmYWNldHMgZm9yIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRvCi1jcmVhdGUgYSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEphdmHihKIgRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmV3IFByb2plY3QgV2l6YXJkLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhCi1FRTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdDwvc3Bhbj48L3NwYW4+IGFuZAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QgTmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lIGZvcgotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiwgY2xlYXIKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gY2hlY2sgYm94IHVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QKLWNvbnRlbnRzPC9zcGFuPiBhbmQgc2VsZWN0IGEgbmV3IGxvY2F0aW9uIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYnV0dG9uLjwvc3Bhbj4KLSBJZiB5b3Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IHByb2plY3QgbG9jYXRpb24gdGhhdCBpcyBhbHJlYWR5IGJlaW5nCi11c2VkIGJ5IGFub3RoZXIgcHJvamVjdCwgdGhlIHByb2plY3QgY3JlYXRpb24gd2lsbCBmYWlsLjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB5b3UgdHlwZQotYSBuZXcgRUFSIHByb2plY3QgbmFtZSwgdGhlIEVBUiBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbgotd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUgSmF2YSBFRSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0Ci1iZWluZyBjcmVhdGVkLiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IHZlcnNpb24gb3IgYSBkaWZmZXJlbnQgbG9jYXRpb24KLWZvciB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotUHJvamVjdCB3aXphcmQuPC9kaXY+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGFkZCB0aGUgbmV3IHByb2plY3QgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgcHJvamVjdCB0byBhbiBFQVI8L3NwYW4+IGNoZWNrIGJveAotYW5kIHNlbGVjdCBhIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+IGxpc3QuPC9zcGFuPgotIElmIHlvdSBjaG9vc2UgdG8gYWRkIHRoZSBwcm9qZWN0IHRvIGFuIGV4aXN0aW5nIEVBUiBwcm9qZWN0LCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0Ci1ydW50aW1lPC9zcGFuPiBmaWVsZCBiZWNvbWVzIGRpc2FibGVkIGJlY2F1c2UgdGhlIHRhcmdldCBydW50aW1lIGZvcgotdGhlIG5ldyBwcm9qZWN0IHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgRUFSIHByb2plY3QuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHJ1bnRpbWU8L3NwYW4+IGZpZWxkLCBzZWxlY3QgdGhlCi10YXJnZXQgcnVudGltZSBmb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gdXNlIGEgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9uIGZvciB5b3VyCi1wcm9qZWN0LCBzZWxlY3QgYSBjb25maWd1cmF0aW9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25maWd1cmF0aW9uczwvc3Bhbj4gbGlzdC4KLVlvdSBjYW4gY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1vZGlmeTwvc3Bhbj4gYnV0dG9uIHRvIGRvIHRoZSBmb2xsb3dpbmc6PC9zcGFuPgotIDx1bD4KLTxsaT5DdXN0b21pemUgcHJvamVjdCBmYWNldHMuIFNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byB0aGUgZmFjZXRzIHlvdQotd2FudCB0aGUgcHJvamVjdCB0byBoYXZlIGFuZCBzZWxlY3QgYSB2ZXJzaW9uIG51bWJlciBmb3IgZWFjaCBmYWNldC4gU2VsZWN0Ci1hIGZhY2V0IG5hbWUgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBmYWNldCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGV0YWlsczwvc3Bhbj4gdGFiLgotWW91IGNhbiBhbHNvIGNob29zZSBhIHByZXNldCBjb21iaW5hdGlvbiBvZiBmYWNldHMgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uZmlndXJhdGlvbnM8L3NwYW4+IGxpc3QuPC9saT4KLQotPGxpPkxpbWl0IHlvdXIgcHJvamVjdCB0byBiZSBjb21wYXRpYmxlIHdpdGggb25lIG9yIG1vcmUgcnVudGltZXMuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TaG93Ci1SdW50aW1lczwvc3Bhbj4gdGFiIGFuZCBzZWxlY3QgdGhlIHJ1bnRpbWVzIHRoYXQgeW91IHdhbnQgdGhlIHByb2plY3QKLXRvIGJlIGNvbXBhdGlibGUgd2l0aC4gPC9saT4KLQotPC91bD4KLUNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNvdXJjZSBGb2xkZXI8L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgbmFtZQotb2YgdGhlIGZvbGRlciB0byB1c2UgZm9yIHNvdXJjZSBjb2RlLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBjcmVhdGUgYSBkZWZhdWx0IGNsYXNzIGZvciB0aGUgbW9kdWxlLAotc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgYSBkZWZhdWx0IE1haW4gY2xhc3M8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiIHRpdGxlPSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBwcm9ncmFtcyB0aGF0IHJ1biBvbiBuZXR3b3JrZWQgY2xpZW50IHN5c3RlbXMgc28gdGhlIHByb2plY3QgY2FuIGJlbmVmaXQgZnJvbSBhIHNlcnZlcidzIHRvb2xzLiI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIHRpdGxlPSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzIGZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIj5Qcm9qZWN0IGZhY2V0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBhcHAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiB0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZCBhcyBKQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlIGJ5IHVzaW5nIHRoZSBJbXBvcnQgd2l6YXJkLiI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqY2lyY2xlYi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTIwMDNlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqY2lyY2xlYi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amNpcmNsZWIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSDQotaXMgaW1wb3J0ZWQ8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiByZXNvbHZlIGN5Y2xpY2FsIGRlcGVuZGVuY2llcw0KLWFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5kZXBlbmRlbmNpZXM8aW5kZXh0ZXJtPmNvcnJlY3RpbmcgY3ljbGljYWw8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkVBUiBmaWxlczxpbmRleHRlcm0+Y29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT5jb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5BDQotY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLW1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMgYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUgd29ya2JlbmNoLg0KLVdoZW4gYSBjeWNsZSBleGlzdHMgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24sDQotdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZGVyDQotY2Fubm90IGFjY3VyYXRlbHkgY29tcHV0ZSB0aGUgYnVpbGQgb3JkZXIgb2YgdGhlIHByb2plY3RzLiBGdWxsIGJ1aWxkcyBmYWlsDQotdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgb3IgcmVxdWlyZSBzZXZlcmFsIGludm9jYXRpb25zLjwvcD48cD5UaGVyZWZvcmUsIHRoZQ0KLWJlc3QgcHJhY3RpY2UgaXMgdG8gb3JnYW5pemUgeW91ciBwcm9qZWN0cyBvciBtb2R1bGVzIGludG8gY29tcG9uZW50cy4gVGhpcw0KLWFsbG93cyB5b3VyIG1vZHVsZSBkZXBlbmRlbmNpZXMgdG8gZnVuY3Rpb24gYXMgYSB0cmVlIGluc3RlYWQgb2YgYSBjeWNsZSBkaWFncmFtLg0KLVRoaXMgcHJhY3RpY2UgaGFzIHRoZSBhZGRlZCBiZW5lZml0IG9mIHByb2R1Y2luZyBhIGJldHRlciBmYWN0b3JlZCBhbmQgbGF5ZXJlZA0KLWFwcGxpY2F0aW9uLjwvcD48cD5UbyByZW9yZ2FuaXplIHlvdXIgcHJvamVjdCB0byBjb3JyZWN0IGN5Y2xpY2FsIGRlcGVuZGVuY2llcywNCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JZGVudGlmeSBhbGwgdGhlIGNsYXNzZXMgd2l0aGluIHRoZSBKQVIgZmlsZXMgdGhhdCBoYXZlIGN5Y2xpY2FsDQotZGVwZW5kZW5jaWVzIGFuZCBtb3ZlIHRob3NlIGNsYXNzZXMgaW50byBhIGNvbW1vbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9qZWN0IG9yIEpBUiBmaWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzZSB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBlZGl0b3IgdG8gbWFwIHV0aWxpdHkgSkFSIGZpbGVzDQotdG8gdGhlIGNvbW1vbiBwcm9qZWN0cy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb3IgZWFjaCBtb2R1bGUgb2YgdGhlIEpBUiBpbiB0aGUgYXBwbGljYXRpb24sIHVzZSB0aGUgSkFSIGRlcGVuZGVuY3kNCi1lZGl0b3Igb3IgcHJvcGVydGllcyBwYWdlIHRvIHNldCBkZXBlbmRlbmNpZXMgb25seSB0byB0aGUgSkFSIGZpbGVzIHRoYXQgYXJlDQotdHJ1bHkgcmVxdWlyZWQuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpjaXJjbGViLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0ZDA0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHJlc29sdmUgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiByZXNvbHZlIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQuIiAvPgotPG1ldGEgY29udGVudD0iZGVwZW5kZW5jaWVzLCBjb3JyZWN0aW5nIGN5Y2xpY2FsLCBFQVIgZmlsZXMsIGNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzLCBwcm9qZWN0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVuY2llcywgY29ycmVjdGluZyBjeWNsaWNhbCwgRUFSIGZpbGVzLCBjb3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcywgcHJvamVjdHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqY2lyY2xlLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjaXJjbGViIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSCi1pcyBpbXBvcnRlZDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpjaXJjbGViIj48YSBuYW1lPSJ0amNpcmNsZWIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUgotaXMgaW1wb3J0ZWQ8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gcmVzb2x2ZSBjeWNsaWNhbCBkZXBlbmRlbmNpZXMKLWFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPjxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+QQotY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotbW9zdCBjb21tb25seSBvY2N1cnMgd2hlbiBwcm9qZWN0cyBhcmUgaW1wb3J0ZWQgZnJvbSBvdXRzaWRlIHRoZSB3b3JrYmVuY2guCi1XaGVuIGEgY3ljbGUgZXhpc3RzIGJldHdlZW4gdHdvIG9yIG1vcmUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLAotdGhlIEphdmHihKIgYnVpbGRlcgotY2Fubm90IGFjY3VyYXRlbHkgY29tcHV0ZSB0aGUgYnVpbGQgb3JkZXIgb2YgdGhlIHByb2plY3RzLiBGdWxsIGJ1aWxkcyBmYWlsCi11bmRlciB0aGVzZSBjb25kaXRpb25zLCBvciByZXF1aXJlIHNldmVyYWwgaW52b2NhdGlvbnMuPC9wPgotPHA+VGhlcmVmb3JlLCB0aGUKLWJlc3QgcHJhY3RpY2UgaXMgdG8gb3JnYW5pemUgeW91ciBwcm9qZWN0cyBvciBtb2R1bGVzIGludG8gY29tcG9uZW50cy4gVGhpcwotYWxsb3dzIHlvdXIgbW9kdWxlIGRlcGVuZGVuY2llcyB0byBmdW5jdGlvbiBhcyBhIHRyZWUgaW5zdGVhZCBvZiBhIGN5Y2xlIGRpYWdyYW0uCi1UaGlzIHByYWN0aWNlIGhhcyB0aGUgYWRkZWQgYmVuZWZpdCBvZiBwcm9kdWNpbmcgYSBiZXR0ZXIgZmFjdG9yZWQgYW5kIGxheWVyZWQKLWFwcGxpY2F0aW9uLjwvcD4KLTxwPlRvIHJlb3JnYW5pemUgeW91ciBwcm9qZWN0IHRvIGNvcnJlY3QgY3ljbGljYWwgZGVwZW5kZW5jaWVzLAotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sIGNsYXNzPSJpZF9zdGVwcyI+Ci08bGk+PHNwYW4+SWRlbnRpZnkgYWxsIHRoZSBjbGFzc2VzIHdpdGhpbiB0aGUgSkFSIGZpbGVzIHRoYXQgaGF2ZSBjeWNsaWNhbAotZGVwZW5kZW5jaWVzIGFuZCBtb3ZlIHRob3NlIGNsYXNzZXMgaW50byBhIGNvbW1vbiBKYXZhIHByb2plY3Qgb3IgSkFSIGZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Vc2UgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gZWRpdG9yIHRvIG1hcCB1dGlsaXR5IEpBUiBmaWxlcwotdG8gdGhlIGNvbW1vbiBwcm9qZWN0cy48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkZvciBlYWNoIG1vZHVsZSBvZiB0aGUgSkFSIGluIHRoZSBhcHBsaWNhdGlvbiwgdXNlIHRoZSBKQVIgZGVwZW5kZW5jeQotZWRpdG9yIG9yIHByb3BlcnRpZXMgcGFnZSB0byBzZXQgZGVwZW5kZW5jaWVzIG9ubHkgdG8gdGhlIEpBUiBmaWxlcyB0aGF0IGFyZQotdHJ1bHkgcmVxdWlyZWQuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2pjaXJjbGUuaHRtbCIgdGl0bGU9IkEgY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBtb3N0IGNvbW1vbmx5IG9jY3VycyB3aGVuIHByb2plY3RzIGFyZSBpbXBvcnRlZCBmcm9tIG91dHNpZGUgdGhlIFdvcmtiZW5jaC4iPkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEphdmEgRUUgbW9kdWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODlmNjMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRqZWFyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5Vc2luZyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlDQotYXBwbGljYXRpb24gcHJvamVjdCBhbGxvd3MgeW91IHRvIHBhY2thZ2UgbWFueSB3ZWIgYXBwbGljYXRpb25zIGFuZCBtb2R1bGVzDQotaW4gYSBwcm9qZWN0IGFuZCBkZXBsb3kgdGhlc2UgbW9kdWxlcyBhcyBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5lbnRlcnByaXNlIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+cHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KMkVFPGluZGV4dGVybT5lbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5FbnRlcnByaXNlDQotYXBwbGljYXRpb24gcHJvamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBlbnRlcnByaXNlDQotYXBwbGljYXRpb25zIGFuZCBjYW4gY29udGFpbiBhIGNvbWJpbmF0aW9uIG9mIFdlYiBtb2R1bGVzLCBKQVIgZmlsZXMsIGNvbm5lY3Rvcg0KLW1vZHVsZXMsIEVKQiBtb2R1bGVzLCBhbmQgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMuIEFuIGVudGVycHJpc2UgYXBwbGljYXRpb24NCi1wcm9qZWN0IGlzIGRlcGxveWVkIGluIHRoZSBmb3JtIG9mIGFuIEVBUiBmaWxlLCBhbmQgaXMgdGhlcmVmb3JlIHNvbWV0aW1lcw0KLXJlZmVycmVkIHRvIGFzIGFuIEVBUiBwcm9qZWN0LiBUaGUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QNCi1hcmUgbWFwcGVkIHRvIG90aGVyIEoyRUUgcHJvamVjdHMuIFRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBtZXRhZGF0YQ0KLWZpbGVzIHdpdGhpbiB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBUaGUgbWV0YWRhdGEgZmlsZXMgYXJlIHVzZWQNCi1mb3IgZXhwb3J0aW5nIHRoZSBwcm9qZWN0IHRvIGFuIEVBUiBmaWxlIGFuZCBmb3IgcnVubmluZyB0aGUgcHJvamVjdCBvbiB0aGUNCi1zZXJ2ZXIuPC9wPjxwPkxpa2UgdGhlIG90aGVyIHR5cGVzIG9mIHByb2plY3RzLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzDQotY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgcHJvamVjdCBmYWNldHMsIHdoaWNoIHJlcHJlc2VudCB1bml0cyBvZiBmdW5jdGlvbmFsaXR5DQotaW4gdGhlIHByb2plY3QuIFRvIGJlIGRlcGxveWVkIGFzIGFuIEVBUiBmaWxlLCB0aGUgbmV3IHByb2plY3QgbXVzdCBoYXZlIHRoZQ0KLUVBUiBmYWNldC4gRGVwZW5kaW5nIG9uIHdoYXQgeW91IHdhbnQgdG8gdXNlIHRoZSBwcm9qZWN0IGZvciwgeW91IG1heSB3YW50DQotdG8gZW5hYmxlIG90aGVyIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuPC9wPjxwIGNvbnJlZj0icmpsaW1pdGN1cnJlbnQuZGl0YSNyamxpbWl0Y3VycmVudC9saW1pdGF0aW9uX2Vhcl9kYmNzIj48L3A+PHA+VG8NCi1jcmVhdGUgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcyBvdXRwdXRjbGFzcz0iaWRfc3RlcHMiPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPlByb2plY3Q8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmV3IFByb2plY3QgV2l6YXJkLCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+SjJFRTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Qcm9qZWN0IE5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBuYW1lIGZvcg0KLXRoZSBuZXcgcHJvamVjdC4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uLCBjbGVhcg0KLXRoZSA8dWljb250cm9sPlVzZSBkZWZhdWx0PC91aWNvbnRyb2w+IGNoZWNrIGJveCB1bmRlciA8dWljb250cm9sPlByb2plY3QNCi1jb250ZW50czwvdWljb250cm9sPiBhbmQgc2VsZWN0IGEgbmV3IGxvY2F0aW9uIHdpdGggdGhlIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGJ1dHRvbi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5UYXJnZXQgcnVudGltZTwvdWljb250cm9sPiBmaWVsZCwgc2VsZWN0IHRoZQ0KLXRhcmdldCBydW50aW1lIGZvciB0aGUgcHJvamVjdC48L2NtZD48aW5mbz5Zb3UgY2FuIGNsaWNrIHRoZSA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBidXR0b24NCi10byBjcmVhdGUgYSBuZXcgcnVudGltZSBmb3IgdGhlIHByb2plY3QgdG8gdXNlLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+VG8gdXNlIGEgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9uIGZvciB5b3VyDQotcHJvamVjdCwgc2VsZWN0IGEgY29uZmlndXJhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5Db25maWd1cmF0aW9uPC91aWNvbnRyb2w+IGxpc3QuDQotWW91IGNhbiBjbGljayB0aGUgPHVpY29udHJvbD5Nb2RpZnk8L3VpY29udHJvbD4gYnV0dG9uIHRvIGRvIHRoZSBmb2xsb3dpbmc6PC9jbWQ+DQotPGluZm8+PHVsPg0KLTxsaT5DdXN0b21pemUgcHJvamVjdCBmYWNldHMuIFNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byB0aGUgZmFjZXRzIHlvdQ0KLXdhbnQgdGhlIHByb2plY3QgdG8gaGF2ZSBhbmQgc2VsZWN0IGEgdmVyc2lvbiBudW1iZXIgZm9yIGVhY2ggZmFjZXQuIFNlbGVjdA0KLWEgZmFjZXQgbmFtZSB0byBzZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGZhY2V0IGluIHRoZSA8dWljb250cm9sPkRldGFpbHM8L3VpY29udHJvbD4gdGFiLg0KLVlvdSBjYW4gYWxzbyBjaG9vc2UgYSBwcmVzZXQgY29tYmluYXRpb24gb2YgZmFjZXRzIGZyb20gdGhlIDx1aWNvbnRyb2w+Q29uZmlndXJhdGlvbnM8L3VpY29udHJvbD4gbGlzdC48L2xpPg0KLTxsaT5MaW1pdCB5b3VyIHByb2plY3QgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9uZSBvciBtb3JlIHJ1bnRpbWVzLiBDbGljayB0aGUgPHVpY29udHJvbD5TaG93DQotUnVudGltZXM8L3VpY29udHJvbD4gdGFiIGFuZCBzZWxlY3QgdGhlIHJ1bnRpbWVzIHRoYXQgeW91IHdhbnQgdGhlIHByb2plY3QNCi10byBiZSBjb21wYXRpYmxlIHdpdGguIDwvbGk+DQotPC91bD5DbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPk9uIHRoZSBKMkVFIE1vZHVsZXMgdG8gQWRkIHRvIHRoZSBFQVIgcGFnZSBvZiB0aGUgd2l6YXJkLCBzZWxlY3QNCi10aGUgZXhpc3RpbmcgbW9kdWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24NCi1wcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBjcmVhdGUgbmV3IG1vZHVsZXMgdG8gYWRkIHRvIHRoZSBwcm9qZWN0LA0KLWNsaWNrIHRoZSA8dWljb250cm9sPk5ldyBNb2R1bGU8L3VpY29udHJvbD4gYnV0dG9uIHRvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvY21kPg0KLTxjaG9pY2V0YWJsZSBrZXljb2w9IjAiPg0KLTxjaHJvdz48Y2hvcHRpb24+Q3JlYXRpbmcgb25lIG1vZHVsZTwvY2hvcHRpb24+PGNoZGVzYz5DbGVhciB0aGUgPHVpY29udHJvbD5DcmVhdGUNCi1kZWZhdWx0IG1vZHVsZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBzZWxlY3QgdGhlIHR5cGUgb2YgbW9kdWxlIHlvdSB3YW50DQotdG8gY3JlYXRlLCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4gYW5kIGZvbGxvdyB0aGUgTmV3IFByb2plY3Qgd2l6YXJkDQotZm9yIHRoYXQgdHlwZSBvZiBwcm9qZWN0LjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5DcmVhdGluZyB0d28gb3IgbW9yZSBtb2R1bGVzPC9jaG9wdGlvbj48Y2hkZXNjPlNlbGVjdCB0aGUgPHVpY29udHJvbD5DcmVhdGUNCi1kZWZhdWx0IG1vZHVsZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIGZvciBlYWNoIHR5cGUNCi1vZiBwcm9qZWN0IHlvdSB3YW50IHRvIGNyZWF0ZSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08aW5mbz5Zb3UgY2FuIGVudGVyIGEgbmFtZSBmb3IgZWFjaCBtb2R1bGUuIEVhY2ggb2YgdGhlc2UgbW9kdWxlcyB3aWxsIGhhdmUNCi10aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhhdCB0eXBlIG9mIHByb2plY3QgYW5kIHRoZXkgd2lsbCBoYXZlIHRoZSBzYW1lDQotc2VydmVyIHRhcmdldCBhcyB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxIG91dHB1dGNsYXNzPSJpZF9wb3N0cmVxIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzgwZGExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlVzaW5nIHRoZSB3aXphcmQgdG8gY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbGxvd3MgeW91IHRvIHBhY2thZ2UgbWFueSB3ZWIgYXBwbGljYXRpb25zIGFuZCBtb2R1bGVzIGluIGEgcHJvamVjdCBhbmQgZGVwbG95IHRoZXNlIG1vZHVsZXMgYXMgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlVzaW5nIHRoZSB3aXphcmQgdG8gY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbGxvd3MgeW91IHRvIHBhY2thZ2UgbWFueSB3ZWIgYXBwbGljYXRpb25zIGFuZCBtb2R1bGVzIGluIGEgcHJvamVjdCBhbmQgZGVwbG95IHRoZXNlIG1vZHVsZXMgYXMgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uIiAvPgotPG1ldGEgY29udGVudD0iZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIHByb2plY3RzLCBjcmVhdGluZywgSjJFRSwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cywgY3JlYXRpbmcsIEoyRUUsIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGplYXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZWFyIj48YSBuYW1lPSJ0amVhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3Rhc2tib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5Vc2luZyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBwcm9qZWN0IGFsbG93cyB5b3UgdG8gcGFja2FnZSBtYW55IHdlYiBhcHBsaWNhdGlvbnMgYW5kIG1vZHVsZXMKLWluIGEgcHJvamVjdCBhbmQgZGVwbG95IHRoZXNlIG1vZHVsZXMgYXMgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9jb250ZXh0Ij48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotIDxwPkVudGVycHJpc2UKLWFwcGxpY2F0aW9uIHByb2plY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgZW50ZXJwcmlzZQotYXBwbGljYXRpb25zIGFuZCBjYW4gY29udGFpbiBhIGNvbWJpbmF0aW9uIG9mIFdlYiBtb2R1bGVzLCBKQVIgZmlsZXMsIGNvbm5lY3RvcgotbW9kdWxlcywgRUpCIG1vZHVsZXMsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4gQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCBpcyBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZSwgYW5kIGlzIHRoZXJlZm9yZSBzb21ldGltZXMKLXJlZmVycmVkIHRvIGFzIGFuIEVBUiBwcm9qZWN0LiBUaGUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QKLWFyZSBtYXBwZWQgdG8gb3RoZXIgSjJFRSBwcm9qZWN0cy4gVGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIG1ldGFkYXRhCi1maWxlcyB3aXRoaW4gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gVGhlIG1ldGFkYXRhIGZpbGVzIGFyZSB1c2VkCi1mb3IgZXhwb3J0aW5nIHRoZSBwcm9qZWN0IHRvIGFuIEVBUiBmaWxlIGFuZCBmb3IgcnVubmluZyB0aGUgcHJvamVjdCBvbiB0aGUKLXNlcnZlci48L3A+Ci08cD5MaWtlIHRoZSBvdGhlciB0eXBlcyBvZiBwcm9qZWN0cywgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cwotY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgcHJvamVjdCBmYWNldHMsIHdoaWNoIHJlcHJlc2VudCB1bml0cyBvZiBmdW5jdGlvbmFsaXR5Ci1pbiB0aGUgcHJvamVjdC4gVG8gYmUgZGVwbG95ZWQgYXMgYW4gRUFSIGZpbGUsIHRoZSBuZXcgcHJvamVjdCBtdXN0IGhhdmUgdGhlCi1FQVIgZmFjZXQuIERlcGVuZGluZyBvbiB3aGF0IHlvdSB3YW50IHRvIHVzZSB0aGUgcHJvamVjdCBmb3IsIHlvdSBtYXkgd2FudAotdG8gZW5hYmxlIG90aGVyIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuPC9wPgotPHA+V2hlbgoteW91IGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvCi1ub3QgZ2l2ZSBpdCBhIG5hbWUgdGhhdCBjb250YWlucyBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIgc2V0IChEQkNTKSBjaGFyYWN0ZXJzLjwvcD4KLTxwPlRvCi1jcmVhdGUgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sIGNsYXNzPSJpZF9zdGVwcyI+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKYXZh4oSiIEVFIHBlcnNwZWN0aXZlLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5ldyBQcm9qZWN0IFdpemFyZCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SjJFRTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdDwvc3Bhbj48L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IE5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIGEgbmFtZSBmb3IKLXRoZSBuZXcgcHJvamVjdC4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByb2plY3QgbG9jYXRpb24sIGNsZWFyCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIGRlZmF1bHQ8L3NwYW4+IGNoZWNrIGJveCB1bmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0Ci1jb250ZW50czwvc3Bhbj4gYW5kIHNlbGVjdCBhIG5ldyBsb2NhdGlvbiB3aXRoIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgcnVudGltZTwvc3Bhbj4gZmllbGQsIHNlbGVjdCB0aGUKLXRhcmdldCBydW50aW1lIGZvciB0aGUgcHJvamVjdC48L3NwYW4+IFlvdSBjYW4gY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYnV0dG9uCi10byBjcmVhdGUgYSBuZXcgcnVudGltZSBmb3IgdGhlIHByb2plY3QgdG8gdXNlLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gdXNlIGEgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9uIGZvciB5b3VyCi1wcm9qZWN0LCBzZWxlY3QgYSBjb25maWd1cmF0aW9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25maWd1cmF0aW9uPC9zcGFuPiBsaXN0LgotWW91IGNhbiBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TW9kaWZ5PC9zcGFuPiBidXR0b24gdG8gZG8gdGhlIGZvbGxvd2luZzo8L3NwYW4+Ci0gPHVsPgotPGxpPkN1c3RvbWl6ZSBwcm9qZWN0IGZhY2V0cy4gU2VsZWN0IHRoZSBjaGVjayBib3hlcyBuZXh0IHRvIHRoZSBmYWNldHMgeW91Ci13YW50IHRoZSBwcm9qZWN0IHRvIGhhdmUgYW5kIHNlbGVjdCBhIHZlcnNpb24gbnVtYmVyIGZvciBlYWNoIGZhY2V0LiBTZWxlY3QKLWEgZmFjZXQgbmFtZSB0byBzZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGZhY2V0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXRhaWxzPC9zcGFuPiB0YWIuCi1Zb3UgY2FuIGFsc28gY2hvb3NlIGEgcHJlc2V0IGNvbWJpbmF0aW9uIG9mIGZhY2V0cyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25maWd1cmF0aW9uczwvc3Bhbj4gbGlzdC48L2xpPgotCi08bGk+TGltaXQgeW91ciBwcm9qZWN0IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbmUgb3IgbW9yZSBydW50aW1lcy4gQ2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cKLVJ1bnRpbWVzPC9zcGFuPiB0YWIgYW5kIHNlbGVjdCB0aGUgcnVudGltZXMgdGhhdCB5b3Ugd2FudCB0aGUgcHJvamVjdAotdG8gYmUgY29tcGF0aWJsZSB3aXRoLiA8L2xpPgotCi08L3VsPgotQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgSjJFRSBNb2R1bGVzIHRvIEFkZCB0byB0aGUgRUFSIHBhZ2Ugb2YgdGhlIHdpemFyZCwgc2VsZWN0Ci10aGUgZXhpc3RpbmcgbW9kdWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gY3JlYXRlIG5ldyBtb2R1bGVzIHRvIGFkZCB0byB0aGUgcHJvamVjdCwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgTW9kdWxlPC9zcGFuPiBidXR0b24gdG8gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6PC9zcGFuPgotCi08dGFibGUgY2xhc3M9ImNob2ljZXRhYmxlYm9yZGVyIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgcnVsZXM9InJvd3MiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSI+Ci08dGhlYWQ+PHRyPjx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDE2Qy1vcHRpb24iIGFsaWduPSJsZWZ0Ij5PcHRpb248L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMTZDLWRlc2MiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPgotPHRib2R5PgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTZDLW9wdGlvbiIgaWQ9Ik4xMDE3NiI+Q3JlYXRpbmcgb25lIG1vZHVsZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE2Qy1kZXNjIE4xMDE3NiI+Q2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZQotZGVmYXVsdCBtb2R1bGVzPC9zcGFuPiBjaGVjayBib3gsIHNlbGVjdCB0aGUgdHlwZSBvZiBtb2R1bGUgeW91IHdhbnQKLXRvIGNyZWF0ZSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4gYW5kIGZvbGxvdyB0aGUgTmV3IFByb2plY3Qgd2l6YXJkCi1mb3IgdGhhdCB0eXBlIG9mIHByb2plY3QuPC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE2Qy1vcHRpb24iIGlkPSJOMTAxOTEiPkNyZWF0aW5nIHR3byBvciBtb3JlIG1vZHVsZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNkMtZGVzYyBOMTAxOTEiPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlCi1kZWZhdWx0IG1vZHVsZXM8L3NwYW4+IGNoZWNrIGJveCwgc2VsZWN0IHRoZSBjaGVjayBib3hlcyBmb3IgZWFjaCB0eXBlCi1vZiBwcm9qZWN0IHlvdSB3YW50IHRvIGNyZWF0ZSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT48L3RhYmxlPgotCi0gWW91IGNhbiBlbnRlciBhIG5hbWUgZm9yIGVhY2ggbW9kdWxlLiBFYWNoIG9mIHRoZXNlIG1vZHVsZXMgd2lsbCBoYXZlCi10aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhhdCB0eXBlIG9mIHByb2plY3QgYW5kIHRoZXkgd2lsbCBoYXZlIHRoZSBzYW1lCi1zZXJ2ZXIgdGFyZ2V0IGFzIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jZmFjZXRzLmh0bWwiIHRpdGxlPSJGYWNldHMgZGVmaW5lIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVxdWlyZW1lbnRzIGZvciBKYXZhIEVFIHByb2plY3RzIGFuZCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uIj5Qcm9qZWN0IGZhY2V0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwYXBwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OTUxOWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpleHBhcHAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudA0KLXByb2plY3QgYXMgYSBKQVIgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8aW5kZXh0ZXJtPmV4cG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5Ubw0KLWV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBmcm9tIHRoZSB3b3JrYmVuY2gsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcyBvdXRwdXRjbGFzcz0iaWRfc3RlcHMiPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FeHBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5VbmRlciA8dWljb250cm9sPlNlbGVjdCBhbiBleHBvcnQgZGVzdGluYXRpb248L3VpY29udHJvbD4sIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkoyRUU8L3VpY29udHJvbD48dWljb250cm9sPkFwcCBDbGllbnQgSkFSIGZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiwNCi1hbmQgdGhlbiBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+QXBwbGljYXRpb24gQ2xpZW50IHByb2plY3Q8L3VpY29udHJvbD4gbGlzdCwNCi1zZWxlY3QgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5EZXN0aW5hdGlvbjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGZ1bGwNCi1wYXRoIGFuZCBKQVIgZmlsZSBuYW1lIHdoZXJlIHlvdSB3YW50IHRvIGV4cG9ydCB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIGV4cG9ydCBzb3VyY2UgZmlsZXMsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5FeHBvcnQNCi1zb3VyY2UgZmlsZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5JZiB5b3UgYXJlIGV4cG9ydGluZyB0byBhbiBleGlzdGluZyBKQVIgZmlsZQ0KLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+T3ZlcndyaXRlDQotZXhpc3RpbmcgZmlsZTwvdWljb250cm9sPiBjaGVjayBib3guPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwYXBwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjJiZjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBhcHAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cywgZXhwb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzLCBleHBvcnRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amV4cGFwcCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpleHBhcHAiPjxhIG5hbWU9InRqZXhwYXBwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudAotcHJvamVjdCBhcyBhIEpBUiBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLSA8cD5UbwotZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGZyb20gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpPjxzcGFuPkluIHRoZSBKYXZh4oSiIEVFIHBlcnNwZWN0aXZlLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBleHBvcnQgZGVzdGluYXRpb248L3NwYW4+LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SjJFRTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHAgQ2xpZW50IEpBUiBmaWxlPC9zcGFuPjwvc3Bhbj4sCi1hbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDwvc3Bhbj4gbGlzdCwKLXNlbGVjdCB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgeW91IHdhbnQgdG8gZXhwb3J0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc3RpbmF0aW9uPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGZ1bGwKLXBhdGggYW5kIEpBUiBmaWxlIG5hbWUgd2hlcmUgeW91IHdhbnQgdG8gZXhwb3J0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdC48L3NwYW4+Ci08L2xpPgotCi08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VG8gZXhwb3J0IHNvdXJjZSBmaWxlcywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQKLXNvdXJjZSBmaWxlczwvc3Bhbj4gY2hlY2sgYm94Ljwvc3Bhbj48L2xpPgotCi08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgSkFSIGZpbGUKLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZQotZXhpc3RpbmcgZmlsZTwvc3Bhbj4gY2hlY2sgYm94Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHByb2dyYW1zIHRoYXQgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcyBzbyB0aGUgcHJvamVjdCBjYW4gYmVuZWZpdCBmcm9tIGEgc2VydmVyJ3MgdG9vbHMuIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqYXBwcHJvai5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amltcGFwcC5odG1sIiB0aXRsZT0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZCBhcyBKQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlIGJ5IHVzaW5nIHRoZSBJbXBvcnQgd2l6YXJkLiI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBlYXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxZTViMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amV4cGVhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuDQotRUFSIGZpbGU8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgYXJlIGRlcGxveWVkDQotaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5FQVI8aW5kZXh0ZXJtPmZpbGVzPGluZGV4dGVybT5leHBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmVudGVycHJpc2UgYXBwbGljYXRpb25zPGluZGV4dGVybT5wcm9qZWN0czxpbmRleHRlcm0+ZXhwb3J0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij4gPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5Ubw0KLWV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPkV4cG9ydDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVuZGVyIDx1aWNvbnRyb2w+U2VsZWN0IGFuIGV4cG9ydCBkZXN0aW5hdGlvbjwvdWljb250cm9sPiwgY2xpY2sgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+SjJFRTwvdWljb250cm9sPjx1aWNvbnRyb2w+RUFSIGZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiwNCi1hbmQgdGhlbiBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RUFSIHByb2plY3Q8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBlbnRlcnByaXNlDQotYXBwbGljYXRpb24gcHJvamVjdCB5b3Ugd2FudCB0byBleHBvcnQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RGVzdGluYXRpb248L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBmdWxsDQotcGF0aCBhbmQgRUFSIGZpbGUgbmFtZSB3aGVyZSB5b3Ugd2FudCB0byBleHBvcnQgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24NCi1wcm9qZWN0IHRoYXQgaXMgc2VsZWN0ZWQgaW4gdGhlIDx1aWNvbnRyb2w+RUFSIGFwcGxpY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+RXhwb3J0DQotc291cmNlIGZpbGVzPC91aWNvbnRyb2w+IGNoZWNrIGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgRUFSIGZpbGUNCi1hbmQgeW91IGRvIG5vdCB3YW50IHRvIGJlIHdhcm5lZCBhYm91dCBvdmVyd3JpdGluZyBpdCwgc2VsZWN0IHRoZSA8dWljb250cm9sPk92ZXJ3cml0ZQ0KLWV4aXN0aW5nIGZpbGU8L3VpY29udHJvbD4gY2hlY2sgYm94LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQgb3V0cHV0Y2xhc3M9ImlkX3Jlc3VsdCI+VGhlIHdpemFyZCBleHBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgRUFSDQotcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkIEVBUiBmaWxlLiBBZGRpdGlvbmFsbHksIGZvciBlYWNoIHByb2plY3QgdGhhdCBjb3JyZXNwb25kcw0KLXRvIGEgbW9kdWxlIG9yIHV0aWxpdHkgSkFSIGluIHRoZSBhcHBsaWNhdGlvbiwgdGhlIHByb2plY3QgY29udGVudHMgYXJlIGV4cG9ydGVkDQotaW50byBhIG5lc3RlZCBtb2R1bGUgb3IgSkFSIGZpbGUgaW4gdGhlIEVBUiBmaWxlLiBJZiBhbnkgdW5zYXZlZCBjaGFuZ2VzIGV4aXN0DQotb24gYW55IG9mIHRoZSBmaWxlcyBpbiBhbnkgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMsIHlvdSBhcmUgcHJvbXB0ZWQgdG8NCi1zYXZlIHRoZXNlIGZpbGVzIHByaW9yIHRvIGV4cG9ydC48L3Jlc3VsdD4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBlYXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlM2JmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGVhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRXhwb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gaW50byBhbiBFQVIgZmlsZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJFbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJFQVIsIGZpbGVzLCBleHBvcnRpbmcsIGVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkVBUiwgZmlsZXMsIGV4cG9ydGluZywgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIHByb2plY3RzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90amltcGVhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amV4cGVhciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4KLUVBUiBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amV4cGVhciI+PGEgbmFtZT0idGpleHBlYXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4KLUVBUiBmaWxlPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3Rhc2tib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQKLWluIHRoZSBmb3JtIG9mIGFuIEVBUiBmaWxlLiBVc2UgdGhlIEV4cG9ydCB3aXphcmQgdG8gZXhwb3J0IGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPiA8cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotIDxwPlRvCi1leHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaT48c3Bhbj5JbiB0aGUgSmF2YeKEoiBFRSBwZXJzcGVjdGl2ZSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwb3J0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5VbmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgYW4gZXhwb3J0IGRlc3RpbmF0aW9uPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkoyRUU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGZpbGU8L3NwYW4+PC9zcGFuPiwKLWFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBwcm9qZWN0PC9zcGFuPiBsaXN0LCBzZWxlY3QgdGhlIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIHByb2plY3QgeW91IHdhbnQgdG8gZXhwb3J0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc3RpbmF0aW9uPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGZ1bGwKLXBhdGggYW5kIEVBUiBmaWxlIG5hbWUgd2hlcmUgeW91IHdhbnQgdG8gZXhwb3J0IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0IHRoYXQgaXMgc2VsZWN0ZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBhcHBsaWNhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGV4cG9ydCBzb3VyY2UgZmlsZXMsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwb3J0Ci1zb3VyY2UgZmlsZXM8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+PC9saT4KLQotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPklmIHlvdSBhcmUgZXhwb3J0aW5nIHRvIGFuIGV4aXN0aW5nIEVBUiBmaWxlCi1hbmQgeW91IGRvIG5vdCB3YW50IHRvIGJlIHdhcm5lZCBhYm91dCBvdmVyd3JpdGluZyBpdCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVyd3JpdGUKLWV4aXN0aW5nIGZpbGU8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Jlc3VsdCI+VGhlIHdpemFyZCBleHBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgRUFSCi1wcm9qZWN0IHRvIHRoZSBzcGVjaWZpZWQgRUFSIGZpbGUuIEFkZGl0aW9uYWxseSwgZm9yIGVhY2ggcHJvamVjdCB0aGF0IGNvcnJlc3BvbmRzCi10byBhIG1vZHVsZSBvciB1dGlsaXR5IEpBUiBpbiB0aGUgYXBwbGljYXRpb24sIHRoZSBwcm9qZWN0IGNvbnRlbnRzIGFyZSBleHBvcnRlZAotaW50byBhIG5lc3RlZCBtb2R1bGUgb3IgSkFSIGZpbGUgaW4gdGhlIEVBUiBmaWxlLiBJZiBhbnkgdW5zYXZlZCBjaGFuZ2VzIGV4aXN0Ci1vbiBhbnkgb2YgdGhlIGZpbGVzIGluIGFueSBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cywgeW91IGFyZSBwcm9tcHRlZCB0bwotc2F2ZSB0aGVzZSBmaWxlcyBwcmlvciB0byBleHBvcnQuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZWFyLmh0bWwiIHRpdGxlPSJVc2luZyB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYWxsb3dzIHlvdSB0byBwYWNrYWdlIG1hbnkgd2ViIGFwcGxpY2F0aW9ucyBhbmQgbW9kdWxlcyBpbiBhIHByb2plY3QgYW5kIGRlcGxveSB0aGVzZSBtb2R1bGVzIGFzIGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwcmFyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cHJhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI0MDViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwcmFyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRqZXhwcmFyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkV4cG9ydGluZyBjb25uZWN0b3IgcHJvamVjdHMgdG8gUkFSIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gZXhwb3J0IGEgY29ubmVjdG9yIHByb2plY3QgdG8NCi1hIFJBUiBmaWxlIGluIHByZXBhcmF0aW9uIGZvciBkZXBsb3lpbmcgaXQgdG8gYSBzZXJ2ZXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+Y29ubmVjdG9yIHByb2plY3RzPGluZGV4dGVybT5leHBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlJBUiBmaWxlczxpbmRleHRlcm0+ZXhwb3J0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij4gPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5Ubw0KLWV4cG9ydCB0aGUgY29udGVudHMgb2YgYSBjb25uZWN0b3IgcHJvamVjdCB0byBhIFJBUiBmaWxlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkluIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZSwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RXhwb3J0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VW5kZXIgPHVpY29udHJvbD5TZWxlY3QgYW4gZXhwb3J0IGRlc3RpbmF0aW9uPC91aWNvbnRyb2w+LCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5KMkVFPC91aWNvbnRyb2w+PHVpY29udHJvbD5SQVIgZmlsZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LA0KLWFuZCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Db25uZWN0b3IgcHJvamVjdDwvdWljb250cm9sPiBsaXN0LCBzZWxlY3QgdGhlDQotY29ubmVjdG9yIHByb2plY3QgdG8gZXhwb3J0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkRlc3RpbmF0aW9uPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgZnVsbA0KLXBhdGggYW5kIFJBUiBmaWxlIG5hbWUgd2hlcmUgeW91IHdhbnQgdG8gZXhwb3J0IHRoZSBjb25uZWN0b3IgcHJvamVjdC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+VG8gZXhwb3J0IHNvdXJjZSBmaWxlcywgc2VsZWN0IHRoZSA8dWljb250cm9sPkV4cG9ydA0KLXNvdXJjZSBmaWxlczwvdWljb250cm9sPiBjaGVjayBib3guPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPklmIHlvdSBhcmUgZXhwb3J0aW5nIHRvIGFuIGV4aXN0aW5nIFJBUiBmaWxlDQotYW5kIHlvdSBkbyBub3Qgd2FudCB0byBiZSB3YXJuZWQgYWJvdXQgb3ZlcndyaXRpbmcgaXQsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5PdmVyd3JpdGUNCi1leGlzdGluZyBmaWxlPC91aWNvbnRyb2w+IGNoZWNrIGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48c3RlcHJlc3VsdCBvdXRwdXRjbGFzcz0iaWRfcmVzdWx0Ij5UaGUNCi13aXphcmQgZXhwb3J0cyB0aGUgY29udGVudHMgb2YgdGhlIFJBUiBwcm9qZWN0IHRvIHRoZSBzcGVjaWZpZWQgUkFSIGZpbGUuPC9zdGVwcmVzdWx0Pg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxIG91dHB1dGNsYXNzPSJpZF9wb3N0cmVxIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwcmFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cHJhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTUwNTkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwcmFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGV4cG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IHRvIGEgUkFSIGZpbGUgaW4gcHJlcGFyYXRpb24gZm9yIGRlcGxveWluZyBpdCB0byBhIHNlcnZlci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBleHBvcnQgYSBjb25uZWN0b3IgcHJvamVjdCB0byBhIFJBUiBmaWxlIGluIHByZXBhcmF0aW9uIGZvciBkZXBsb3lpbmcgaXQgdG8gYSBzZXJ2ZXIuIiAvPgotPG1ldGEgY29udGVudD0iY29ubmVjdG9yIHByb2plY3RzLCBleHBvcnRpbmcsIFJBUiBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbm5lY3RvciBwcm9qZWN0cywgZXhwb3J0aW5nLCBSQVIgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpleHByYXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpleHByYXIiPjxhIG5hbWU9InRqZXhwcmFyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5FeHBvcnRpbmcgY29ubmVjdG9yIHByb2plY3RzIHRvIFJBUiBmaWxlczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF90YXNrYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBleHBvcnQgYSBjb25uZWN0b3IgcHJvamVjdCB0bwotYSBSQVIgZmlsZSBpbiBwcmVwYXJhdGlvbiBmb3IgZGVwbG95aW5nIGl0IHRvIGEgc2VydmVyLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+VG8KLWV4cG9ydCB0aGUgY29udGVudHMgb2YgYSBjb25uZWN0b3IgcHJvamVjdCB0byBhIFJBUiBmaWxlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sIGNsYXNzPSJpZF9zdGVwcyI+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKYXZh4oSiIEVFIHBlcnNwZWN0aXZlLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgYW4gZXhwb3J0IGRlc3RpbmF0aW9uPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkoyRUU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UkFSIGZpbGU8L3NwYW4+PC9zcGFuPiwKLWFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25uZWN0b3IgcHJvamVjdDwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZQotY29ubmVjdG9yIHByb2plY3QgdG8gZXhwb3J0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXN0aW5hdGlvbjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBmdWxsCi1wYXRoIGFuZCBSQVIgZmlsZSBuYW1lIHdoZXJlIHlvdSB3YW50IHRvIGV4cG9ydCB0aGUgY29ubmVjdG9yIHByb2plY3QuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydAotc291cmNlIGZpbGVzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgUkFSIGZpbGUKLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJ3cml0ZQotZXhpc3RpbmcgZmlsZTwvc3Bhbj4gY2hlY2sgYm94Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPiBUaGUKLXdpemFyZCBleHBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUkFSIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBSQVIgZmlsZS4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiB0aXRsZT0iVGhlc2UgdG9waWNzIGNvdmVyIGhvdyB0byBpbXBvcnQgZmlsZXMgYW5kIHByb2plY3RzIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgZXhwb3J0IGZpbGVzIGFuZCBwcm9qZWN0cyB0byBkaXNrLiI+SW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wYXBwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGFwcC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE0N2MxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wYXBwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRqaW1wYXBwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBkZXBsb3llZA0KLWFzIEpBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdGhhdCBoYXMgYmVlbiBkZXBsb3llZA0KLWludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+IDxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4gPHA+VG8NCi1pbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcyBvdXRwdXRjbGFzcz0iaWRfc3RlcHMiPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEVFIHBlcnNwZWN0aXZlLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5VbmRlciA8dWljb250cm9sPlNlbGVjdCBhbiBpbXBvcnQgc291cmNlPC91aWNvbnRyb2w+LCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5KMkVFPC91aWNvbnRyb2w+PHVpY29udHJvbD5BcHAgQ2xpZW50IEpBUiBmaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+QXBwbGljYXRpb24gQ2xpZW50IGZpbGU8L3VpY29udHJvbD4gZmllbGQsIGVudGVyDQotdGhlIGxvY2F0aW9uIGFuZCBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0bw0KLWltcG9ydC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDwvdWljb250cm9sPiBmaWVsZCwNCi10eXBlIGEgbmV3IHByb2plY3QgbmFtZSBvciBhY2NlcHQgdGhlIGRlZmF1bHQgcHJvamVjdCBuYW1lLiA8L2NtZD48aW5mbz5UaGUNCi1hcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uDQotY2xpZW50IEpBUiBmaWxlLCBhbmQgaXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgbG9jYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlRhcmdldCBydW50aW1lPC91aWNvbnRyb2w+IGRyb3AtZG93biBsaXN0LCBzZWxlY3QNCi10aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzDQotc2VsZWN0aW9uIGFmZmVjdHMgdGhlIHJ1biB0aW1lIHNldHRpbmdzIGJ5IG1vZGlmeWluZyB0aGUgY2xhc3MgcGF0aCBlbnRyaWVzDQotZm9yIHRoZSBwcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBhZGQgdGhlIG5ldyBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3QsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BZGQgcHJvamVjdCB0byBhbiBFQVI8L3VpY29udHJvbD4gY2hlY2sgYm94DQotYW5kIHRoZW4gc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBmcm9tIHRoZSBsaXN0IG9yDQotY3JlYXRlIGEgbmV3IG9uZSBieSBjbGlja2luZyA8dWljb250cm9sPk5ldzwvdWljb250cm9sPi48L2NtZD48aW5mbz48bm90ZT5JZg0KLXlvdSB0eXBlIGEgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBuYW1lLCB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHdpdGggdGhlIGxvd2VzdCBjb21wYXRpYmxlDQotSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50DQotdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uIGZvciB0aGUgZW50ZXJwcmlzZQ0KLWFwcGxpY2F0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3Qgd2l6YXJkLjwvbm90ZT48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4gdG8gaW1wb3J0IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQNCi1KQVIgZmlsZS48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGFwcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBhcHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiZGIyYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGFwcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgYXJlIGRlcGxveWVkIGFzIEpBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdGhhdCBoYXMgYmVlbiBkZXBsb3llZCBpbnRvIGEgSkFSIGZpbGUgYnkgdXNpbmcgdGhlIEltcG9ydCB3aXphcmQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgYXMgSkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIGludG8gYSBKQVIgZmlsZSBieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC4iIC8+Ci08bWV0YSBjb250ZW50PSJhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqYXBwcHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpleHBhcHAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGppbXBhcHAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amltcGFwcCI+PGEgbmFtZT0idGppbXBhcHAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGU8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBhcmUgZGVwbG95ZWQKLWFzIEpBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdGhhdCBoYXMgYmVlbiBkZXBsb3llZAotaW50byBhIEpBUiBmaWxlIGJ5IHVzaW5nIHRoZSBJbXBvcnQgd2l6YXJkLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+VG8KLWltcG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSmF2YeKEoiBFRSBwZXJzcGVjdGl2ZSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IGFuIGltcG9ydCBzb3VyY2U8L3NwYW4+LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SjJFRTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHAgQ2xpZW50IEpBUiBmaWxlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbGljYXRpb24gQ2xpZW50IGZpbGU8L3NwYW4+IGZpZWxkLCBlbnRlcgotdGhlIGxvY2F0aW9uIGFuZCBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0bwotaW1wb3J0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDwvc3Bhbj4gZmllbGQsCi10eXBlIGEgbmV3IHByb2plY3QgbmFtZSBvciBhY2NlcHQgdGhlIGRlZmF1bHQgcHJvamVjdCBuYW1lLiA8L3NwYW4+IFRoZQotYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbgotY2xpZW50IEpBUiBmaWxlLCBhbmQgaXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgbG9jYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHJ1bnRpbWU8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzZWxlY3QKLXRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB0YXJnZXQgZm9yIHlvdXIgZGV2ZWxvcG1lbnQuIFRoaXMKLXNlbGVjdGlvbiBhZmZlY3RzIHRoZSBydW4gdGltZSBzZXR0aW5ncyBieSBtb2RpZnlpbmcgdGhlIGNsYXNzIHBhdGggZW50cmllcwotZm9yIHRoZSBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGFkZCB0aGUgbmV3IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvc3Bhbj4gY2hlY2sgYm94Ci1hbmQgdGhlbiBzZWxlY3QgYW4gZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGZyb20gdGhlIGxpc3Qgb3IKLWNyZWF0ZSBhIG5ldyBvbmUgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPi48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZgoteW91IHR5cGUgYSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG5hbWUsIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiB3aXRoIHRoZSBsb3dlc3QgY29tcGF0aWJsZQotSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50Ci10byBzcGVjaWZ5IGEgZGlmZmVyZW50IHZlcnNpb24gb3IgYSBkaWZmZXJlbnQgbG9jYXRpb24gZm9yIHRoZSBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHdpemFyZC48L2Rpdj4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+IHRvIGltcG9ydCB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci1KQVIgZmlsZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2UgYXBwbGljYXRpb25zLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCIgdGl0bGU9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHByb2dyYW1zIHRoYXQgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcyBzbyB0aGUgcHJvamVjdCBjYW4gYmVuZWZpdCBmcm9tIGEgc2VydmVyJ3MgdG9vbHMuIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqYXBwcHJvai5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiI+Q3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amV4cGFwcC5odG1sIiB0aXRsZT0iWW91IGNhbiBleHBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYXMgYSBKQVIgZmlsZS4iPkV4cG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGVhci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBlYXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2YzRhZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGVhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amltcGVhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5JbXBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBFQVIgZmlsZTwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGFyZQ0KLWRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QNCi1ieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkVBUjxpbmRleHRlcm0+ZmlsZXM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPiA8cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+IDxwPllvdQ0KLWNhbiBhbHNvIGNob29zZSB0byBpbXBvcnQgdXRpbGl0eSBKQVIgZmlsZXMgYXMgdXRpbGl0eSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9qZWN0cy4NCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSB3aXphcmQgdG8gY2hhbmdlIHRoZSBuZXcgcHJvamVjdCBuYW1lcyBmb3IgdGhlIEVBUiBmaWxlDQotYW5kIG1vZHVsZXMgdGhhdCB3aWxsIGJlIGltcG9ydGVkLjwvcD48cD5UbyBpbXBvcnQgYW4gRUFSIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwNCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPkltcG9ydDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVuZGVyIDx1aWNvbnRyb2w+U2VsZWN0IGFuIGltcG9ydCBzb3VyY2U8L3VpY29udHJvbD4sIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkoyRUU8L3VpY29udHJvbD48dWljb250cm9sPkVBUiBmaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kDQotY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkVBUiBmaWxlPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgbG9jYXRpb24NCi1hbmQgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5FQVIgcHJvamVjdDwvdWljb250cm9sPiBmaWVsZCwgYWNjZXB0IHRoZSBkZWZhdWx0DQotcHJvamVjdCBuYW1lIG9yIHR5cGUgYSBuZXcgcHJvamVjdCBuYW1lLiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5UYXJnZXQgcnVudGltZTwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc2VsZWN0DQotdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHRhcmdldCBmb3IgeW91ciBkZXZlbG9wbWVudC48L2NtZD4NCi08aW5mbz5UaGlzIHNlbGVjdGlvbiBhZmZlY3RzIHRoZSBydW4gdGltZSBzZXR0aW5ncyBieSBtb2RpZnlpbmcgdGhlIGNsYXNzDQotcGF0aCBlbnRyaWVzIGZvciB0aGUgcHJvamVjdC4gQ2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYW55IHV0aWxpdHkgSkFSIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCB5b3Ugd2FudCB0bw0KLWltcG9ydCBhcyB1dGlsaXR5IHByb2plY3RzLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPk1vZHVsZSBSb290IExvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLCBzcGVjaWZ5DQotdGhlIHJvb3QgZGlyZWN0b3J5IGZvciBhbGwgb2YgdGhlIHByb2plY3RzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZCBvciBjcmVhdGVkDQotZHVyaW5nIGltcG9ydCwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5PbiB0aGUgRUFSIE1vZHVsZSBhbmQgVXRpbGl0eSBKQVIgUHJvamVjdHMgcGFnZSwgc2VsZWN0IHRoZSBwcm9qZWN0cw0KLXRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IHdpdGggdGhlIEVBUiBmaWxlLiBZb3UgY2FuIGVkaXQgdGhlIG5ldyBwcm9qZWN0IG5hbWUNCi1mb3IgZWFjaCBtb2R1bGUgYW5kIHV0aWxpdHkgcHJvamVjdCB0byBiZSBpbXBvcnRlZC48L2NtZD48aW5mbz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4gdG8gaW1wb3J0IHRoZSBjb250ZW50cyBvZiB0aGUNCi1FQVIgZmlsZS48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGVhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXBlYXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3OWYyMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGVhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYnkgaW1wb3J0aW5nIGl0IGZyb20gYSBkZXBsb3llZCBFQVIgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50byBFQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkVBUiwgZmlsZXMsIGltcG9ydGluZywgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMsIHByb2plY3RzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRUFSLCBmaWxlcywgaW1wb3J0aW5nLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucywgcHJvamVjdHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGplYXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjaXJjbGViLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamNpcmNsZS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqaW1wZWFyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqaW1wZWFyIj48YSBuYW1lPSJ0amltcGVhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlCi1kZXBsb3llZCBpbnRvIEVBUiBmaWxlcy4gWW91IGNhbiBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0Ci1ieSBpbXBvcnRpbmcgaXQgZnJvbSBhIGRlcGxveWVkIEVBUiBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+WW91Ci1jYW4gYWxzbyBjaG9vc2UgdG8gaW1wb3J0IHV0aWxpdHkgSkFSIGZpbGVzIGFzIHV0aWxpdHkgSmF2YeKEoiBwcm9qZWN0cy4KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIHdpemFyZCB0byBjaGFuZ2UgdGhlIG5ldyBwcm9qZWN0IG5hbWVzIGZvciB0aGUgRUFSIGZpbGUKLWFuZCBtb2R1bGVzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZC48L3A+Ci08cD5UbyBpbXBvcnQgYW4gRUFSIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwKLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IGFuIGltcG9ydCBzb3VyY2U8L3NwYW4+LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SjJFRTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgZmlsZTwvc3Bhbj48L3NwYW4+IGFuZAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBmaWxlPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGxvY2F0aW9uCi1hbmQgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FQVIgcHJvamVjdDwvc3Bhbj4gZmllbGQsIGFjY2VwdCB0aGUgZGVmYXVsdAotcHJvamVjdCBuYW1lIG9yIHR5cGUgYSBuZXcgcHJvamVjdCBuYW1lLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHJ1bnRpbWU8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzZWxlY3QKLXRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB0YXJnZXQgZm9yIHlvdXIgZGV2ZWxvcG1lbnQuPC9zcGFuPgotIFRoaXMgc2VsZWN0aW9uIGFmZmVjdHMgdGhlIHJ1biB0aW1lIHNldHRpbmdzIGJ5IG1vZGlmeWluZyB0aGUgY2xhc3MKLXBhdGggZW50cmllcyBmb3IgdGhlIHByb2plY3QuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGFueSB1dGlsaXR5IEpBUiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8KLWltcG9ydCBhcyB1dGlsaXR5IHByb2plY3RzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2R1bGUgUm9vdCBMb2NhdGlvbjwvc3Bhbj4gZmllbGQsIHNwZWNpZnkKLXRoZSByb290IGRpcmVjdG9yeSBmb3IgYWxsIG9mIHRoZSBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgb3IgY3JlYXRlZAotZHVyaW5nIGltcG9ydCwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBFQVIgTW9kdWxlIGFuZCBVdGlsaXR5IEpBUiBQcm9qZWN0cyBwYWdlLCBzZWxlY3QgdGhlIHByb2plY3RzCi10aGF0IHlvdSB3YW50IHRvIGltcG9ydCB3aXRoIHRoZSBFQVIgZmlsZS4gWW91IGNhbiBlZGl0IHRoZSBuZXcgcHJvamVjdCBuYW1lCi1mb3IgZWFjaCBtb2R1bGUgYW5kIHV0aWxpdHkgcHJvamVjdCB0byBiZSBpbXBvcnRlZC48L3NwYW4+IDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBpbXBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZQotRUFSIGZpbGUuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy4iPkoyRUUgYXJjaGl0ZWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2plYXJwcm9qLmh0bWwiIHRpdGxlPSJBbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdGllcyB0b2dldGhlciB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamNpcmNsZS5odG1sIiB0aXRsZT0iQSBjeWNsaWNhbCBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG9yIG1vcmUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vc3QgY29tbW9ubHkgb2NjdXJzIHdoZW4gcHJvamVjdHMgYXJlIGltcG9ydGVkIGZyb20gb3V0c2lkZSB0aGUgV29ya2JlbmNoLiI+Q3ljbGljYWwgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBFRSBtb2R1bGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIiB0aXRsZT0iVXNpbmcgdGhlIHdpemFyZCB0byBjcmVhdGUgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFsbG93cyB5b3UgdG8gcGFja2FnZSBtYW55IHdlYiBhcHBsaWNhdGlvbnMgYW5kIG1vZHVsZXMgaW4gYSBwcm9qZWN0IGFuZCBkZXBsb3kgdGhlc2UgbW9kdWxlcyBhcyBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4iPkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjaXJjbGViLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHJlc29sdmUgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZC4iPkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcHJhci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGppbXByYXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5YTI5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcHJhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amltcHJhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5JbXBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZTwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5Db25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8NCi1SQVIgZmlsZXMuIFlvdSBjYW4gaW1wb3J0IGEgY29ubmVjdG9yIHByb2plY3QgYnkgaW1wb3J0aW5nIGEgZGVwbG95ZWQgUkFSDQotZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb25uZWN0b3IgcHJvamVjdHM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+UkFSIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4gPHA+VG8NCi1pbXBvcnQgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSB1c2luZyB0aGUgd2l6YXJkLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkluIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBFRSBwZXJzcGVjdGl2ZSwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VW5kZXIgPHVpY29udHJvbD5TZWxlY3QgYW4gaW1wb3J0IHNvdXJjZTwvdWljb250cm9sPiwgY2xpY2sgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+SjJFRTwvdWljb250cm9sPjx1aWNvbnRyb2w+UkFSIGZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Db25uZWN0b3IgZmlsZTwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGZ1bGwNCi1wYXRoIGFuZCBuYW1lIG9mIHRoZSBjb25uZWN0b3IgUkFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQuIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkNvbm5lY3RvciBtb2R1bGU8L3VpY29udHJvbD4gY29tYmluYXRpb24gYm94LA0KLXR5cGUgYSBuZXcgcHJvamVjdCBuYW1lIG9yIHNlbGVjdCBhIGNvbm5lY3RvciBwcm9qZWN0IGZyb20gdGhlIGRyb3AtZG93biBsaXN0LiA8L2NtZD4NCi08aW5mbz5JZiB5b3UgdHlwZSBhIG5ldyBwcm9qZWN0IG5hbWUgaW4gdGhpcyBmaWVsZCwgdGhlIGNvbm5lY3RvciBwcm9qZWN0DQotd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgUkFSIGZpbGUsIGFuZCBpdCB3aWxsDQotdXNlIHRoZSBkZWZhdWx0IGxvY2F0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5UYXJnZXQgcnVudGltZTwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc2VsZWN0DQotdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHRhcmdldCBmb3IgeW91ciBkZXZlbG9wbWVudC4gPC9jbWQ+DQotPGluZm8+VGhpcyBzZWxlY3Rpb24gYWZmZWN0cyB0aGUgcnVuLXRpbWUgc2V0dGluZ3MgYnkgbW9kaWZ5aW5nIHRoZSBjbGFzcw0KLXBhdGggZW50cmllcyBmb3IgdGhlIHByb2plY3QuPC9pbmZvPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBhZGQgdGhlIG5ldyBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3QsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BZGQgcHJvamVjdCB0byBhbiBFQVI8L3VpY29udHJvbD4gY2hlY2sgYm94DQotYW5kIHRoZW4gc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gIHByb2plY3QgZnJvbSB0aGUgbGlzdA0KLW9yIGNyZWF0ZSBhIG5ldyBvbmUgYnkgY2xpY2tpbmcgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RUFSIGFwcGxpY2F0aW9uPC91aWNvbnRyb2w+IGNvbWJpbmF0aW9uIGJveCwNCi10eXBlIGEgbmV3IHByb2plY3QgbmFtZSBvciBzZWxlY3QgYW4gZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0DQotZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuIE9yLCBjbGljayB0aGUgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gYnV0dG9uIHRvDQotbGF1bmNoIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHdpemFyZC48L2NtZD48aW5mbz48bm90ZT5JZg0KLXlvdSB0eXBlIGEgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24gIHByb2plY3QgbmFtZSwgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24NCi0gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24gd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUNCi1KMkVFIHZlcnNpb24gYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgYmVpbmcgY3JlYXRlZC4gSWYgeW91IHdhbnQNCi10byBzcGVjaWZ5IGEgZGlmZmVyZW50IHZlcnNpb24gb3IgYSBkaWZmZXJlbnQgbG9jYXRpb24gZm9yIHRoZSBlbnRlcnByaXNlDQotYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9ub3RlPjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPiB0byBpbXBvcnQgdGhlIGNvbm5lY3RvciBSQVINCi1maWxlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxIG91dHB1dGNsYXNzPSJpZF9wb3N0cmVxIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wcmFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcHJhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzI5MmVkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wcmFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCBSQVIgZmlsZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDb25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIGRlcGxveWVkIFJBUiBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJDb25uZWN0b3IgcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIGRlcGxveWVkIFJBUiBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbm5lY3RvciBwcm9qZWN0cywgaW1wb3J0aW5nLCBSQVIgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb25uZWN0b3IgcHJvamVjdHMsIGltcG9ydGluZywgUkFSIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3BoLWltcG9ydGV4cG9ydC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqaW1wcmFyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqaW1wcmFyIj48YSBuYW1lPSJ0amltcHJhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+SW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGU8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkNvbm5lY3RvciBwcm9qZWN0cyBhcmUgZGVwbG95ZWQgaW50bwotUkFSIGZpbGVzLiBZb3UgY2FuIGltcG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIGRlcGxveWVkIFJBUgotZmlsZS48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPjxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+VG8KLWltcG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IFJBUiBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEphdmHihKIgRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBpbXBvcnQgc291cmNlPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkoyRUU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UkFSIGZpbGU8L3NwYW4+PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25uZWN0b3IgZmlsZTwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBmdWxsCi1wYXRoIGFuZCBuYW1lIG9mIHRoZSBjb25uZWN0b3IgUkFSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQuIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25uZWN0b3IgbW9kdWxlPC9zcGFuPiBjb21iaW5hdGlvbiBib3gsCi10eXBlIGEgbmV3IHByb2plY3QgbmFtZSBvciBzZWxlY3QgYSBjb25uZWN0b3IgcHJvamVjdCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdC4gPC9zcGFuPgotIElmIHlvdSB0eXBlIGEgbmV3IHByb2plY3QgbmFtZSBpbiB0aGlzIGZpZWxkLCB0aGUgY29ubmVjdG9yIHByb2plY3QKLXdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yIFJBUiBmaWxlLCBhbmQgaXQgd2lsbAotdXNlIHRoZSBkZWZhdWx0IGxvY2F0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBydW50aW1lPC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc2VsZWN0Ci10aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiA8L3NwYW4+Ci0gVGhpcyBzZWxlY3Rpb24gYWZmZWN0cyB0aGUgcnVuLXRpbWUgc2V0dGluZ3MgYnkgbW9kaWZ5aW5nIHRoZSBjbGFzcwotcGF0aCBlbnRyaWVzIGZvciB0aGUgcHJvamVjdC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGFkZCB0aGUgbmV3IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvc3Bhbj4gY2hlY2sgYm94Ci1hbmQgdGhlbiBzZWxlY3QgYW4gZXhpc3RpbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiAgcHJvamVjdCBmcm9tIHRoZSBsaXN0Ci1vciBjcmVhdGUgYSBuZXcgb25lIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiBhcHBsaWNhdGlvbjwvc3Bhbj4gY29tYmluYXRpb24gYm94LAotdHlwZSBhIG5ldyBwcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdAotZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuIE9yLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8KLWxhdW5jaCB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYKLXlvdSB0eXBlIGEgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24gIHByb2plY3QgbmFtZSwgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24KLSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiB3aXRoIHRoZSBsb3dlc3QgY29tcGF0aWJsZQotSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50Ci10byBzcGVjaWZ5IGEgZGlmZmVyZW50IHZlcnNpb24gb3IgYSBkaWZmZXJlbnQgbG9jYXRpb24gZm9yIHRoZSBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiwgeW91IG11c3QgdXNlIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHdpemFyZC48L2Rpdj4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+IHRvIGltcG9ydCB0aGUgY29ubmVjdG9yIFJBUgotZmlsZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvcGgtaW1wb3J0ZXhwb3J0Lmh0bWwiIHRpdGxlPSJUaGVzZSB0b3BpY3MgY292ZXIgaG93IHRvIGltcG9ydCBmaWxlcyBhbmQgcHJvamVjdHMgaW50byB0aGUgd29ya2JlbmNoIGFuZCBleHBvcnQgZmlsZXMgYW5kIHByb2plY3RzIHRvIGRpc2suIj5JbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBwcm9qZWN0cyBhbmQgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpyYXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTM2NmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpyYXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpyYXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5BIGNvbm5lY3RvciBpcyBhIEoyRUUgc3RhbmRhcmQgZXh0ZW5zaW9uDQotbWVjaGFuaXNtIGZvciBjb250YWluZXJzIHRvIHByb3ZpZGUgY29ubmVjdGl2aXR5IHRvIGVudGVycHJpc2UgaW5mb3JtYXRpb24NCi1zeXN0ZW1zIChFSVNzKS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb25uZWN0b3IgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij4gPHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5BDQotY29ubmVjdG9yIGlzIHNwZWNpZmljIHRvIGFuIEVJUyBhbmQgY29uc2lzdHMgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFuZCBhcHBsaWNhdGlvbg0KLWRldmVsb3BtZW50IHRvb2xzLiBBIHJlc291cmNlIGFkYXB0ZXIgaXMgYSBzeXN0ZW0tbGV2ZWwgc29mdHdhcmUgZHJpdmVyIHRoYXQNCi1pcyB1c2VkIGJ5IGFuIEVKQiBjb250YWluZXIgb3IgYW4gYXBwbGljYXRpb24gY2xpZW50IHRvIGNvbm5lY3QgdG8gYW4gRUlTLg0KLUNvbm5lY3RvcnMgY29tcGx5IHdpdGggdGhlIEoyRUUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSAoSkNBKS48L3A+PHA+TGlrZSB0aGUNCi1vdGhlciB0eXBlcyBvZiBwcm9qZWN0cywgY29ubmVjdG9yIHByb2plY3RzIGNhbiBjb250YWluIG9uZSBvciBtb3JlIHByb2plY3QNCi1mYWNldHMsIHdoaWNoIHJlcHJlc2VudCB1bml0cyBvZiBmdW5jdGlvbmFsaXR5IGluIHRoZSBwcm9qZWN0LiBBIG5ldyBjb25uZWN0b3INCi1wcm9qZWN0IHNob3VsZCBoYXZlIHRoZSBKMkMgTW9kdWxlIGZhY2V0LiBEZXBlbmRpbmcgb24gd2hhdCB5b3Ugd2FudCB0byB1c2UNCi10aGUgcHJvamVjdCBmb3IsIHlvdSBtYXkgd2FudCB0byBlbmFibGUgb3RoZXIgZmFjZXRzIGZvciB0aGUgcHJvamVjdC48L3A+PG5vdGUNCi10eXBlPSJyZXN0cmljdGlvbiI+SjJFRSAxLjIgc3BlY2lmaWNhdGlvbiBsZXZlbCBkb2VzIG5vdCBpbmNsdWRlIGNvbm5lY3Rvcg0KLWNhcGFiaWxpdHkuPC9ub3RlPjxwPlRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0b3IgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJvamVjdDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBOZXcgUHJvamVjdCBXaXphcmQsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5KMkVFPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Db25uZWN0b3IgUHJvamVjdDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+UHJvamVjdCBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIGEgbmFtZSBmb3INCi10aGUgY29ubmVjdG9yIHByb2plY3QuIDwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiwgY2xlYXINCi10aGUgPHVpY29udHJvbD5Vc2UgZGVmYXVsdDwvdWljb250cm9sPiBjaGVjayBib3ggdW5kZXIgPHVpY29udHJvbD5Qcm9qZWN0DQotY29udGVudHM8L3VpY29udHJvbD4gYW5kIHNlbGVjdCBhIG5ldyBsb2NhdGlvbiB3aXRoIHRoZSA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBidXR0b24uPC9jbWQ+DQotPGluZm8+SWYgeW91IHNwZWNpZnkgYSBub24tZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSBiZWluZw0KLXVzZWQgYnkgYW5vdGhlciBwcm9qZWN0LCB0aGUgcHJvamVjdCBjcmVhdGlvbiB3aWxsIGZhaWwuPG5vdGU+SWYgeW91IHR5cGUNCi1hIG5ldyBFQVIgcHJvamVjdCBuYW1lLCB0aGUgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uDQotd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUgSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0DQotYmVpbmcgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uDQotZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uDQotUHJvamVjdCB3aXphcmQuPC9ub3RlPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+SWYgeW91IHdhbnQgdG8gYWRkIHRoZSBuZXcgcHJvamVjdCB0byBhbg0KLWVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCwgc2VsZWN0IHRoZSA8dWljb250cm9sPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvdWljb250cm9sPiBjaGVjaw0KLWJveCBhbmQgc2VsZWN0IGEgcHJvamVjdCBpbiB0aGUgPHVpY29udHJvbD5FQVIgUHJvamVjdCBOYW1lPC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+DQotPGluZm8+SWYgeW91IGNob29zZSB0byBhZGQgdGhlIHByb2plY3QgdG8gYW4gZXhpc3RpbmcgRUFSIHByb2plY3QsIHRoZSA8dWljb250cm9sPlRhcmdldA0KLXJ1bnRpbWU8L3VpY29udHJvbD4gZmllbGQgYmVjb21lcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSB0YXJnZXQgcnVudGltZSBmb3INCi10aGUgbmV3IHByb2plY3Qgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBFQVIgcHJvamVjdC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+VGFyZ2V0IHJ1bnRpbWU8L3VpY29udHJvbD4gZmllbGQsIHNlbGVjdCB0aGUNCi10YXJnZXQgcnVudGltZSBmb3IgdGhlIHByb2plY3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIHVzZSBhIHByZWRlZmluZWQgY29uZmlndXJhdGlvbiBmb3IgeW91cg0KLXByb2plY3QsIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24gaW4gdGhlIDx1aWNvbnRyb2w+Q29uZmlndXJhdGlvbjwvdWljb250cm9sPiBsaXN0Lg0KLVlvdSBjYW4gY2xpY2sgdGhlIDx1aWNvbnRyb2w+TW9kaWZ5PC91aWNvbnRyb2w+IGJ1dHRvbiB0byBkbyB0aGUgZm9sbG93aW5nOjwvY21kPg0KLTxpbmZvPjx1bD4NCi08bGk+Q3VzdG9taXplIHByb2plY3QgZmFjZXRzLiBTZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gdGhlIGZhY2V0cyB5b3UNCi13YW50IHRoZSBwcm9qZWN0IHRvIGhhdmUgYW5kIHNlbGVjdCBhIHZlcnNpb24gbnVtYmVyIGZvciBlYWNoIGZhY2V0LiBTZWxlY3QNCi1hIGZhY2V0IG5hbWUgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBmYWNldCBpbiB0aGUgPHVpY29udHJvbD5EZXRhaWxzPC91aWNvbnRyb2w+IHRhYi4NCi1Zb3UgY2FuIGFsc28gY2hvb3NlIGEgcHJlc2V0IGNvbWJpbmF0aW9uIG9mIGZhY2V0cyBmcm9tIHRoZSA8dWljb250cm9sPkNvbmZpZ3VyYXRpb25zPC91aWNvbnRyb2w+IGxpc3QuPC9saT4NCi08bGk+TGltaXQgeW91ciBwcm9qZWN0IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbmUgb3IgbW9yZSBydW50aW1lcy4gQ2xpY2sgdGhlIDx1aWNvbnRyb2w+U2hvdw0KLVJ1bnRpbWVzPC91aWNvbnRyb2w+IHRhYiBhbmQgc2VsZWN0IHRoZSBydW50aW1lcyB0aGF0IHlvdSB3YW50IHRoZSBwcm9qZWN0DQotdG8gYmUgY29tcGF0aWJsZSB3aXRoLiA8L2xpPg0KLTwvdWw+Q2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Tb3VyY2UgRm9sZGVyPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgbmFtZQ0KLW9mIHRoZSBmb2xkZXIgdG8gdXNlIGZvciBzb3VyY2UgY29kZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpyYXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzZjZiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBjb25uZWN0b3IgaXMgYSBKMkVFIHN0YW5kYXJkIGV4dGVuc2lvbiBtZWNoYW5pc20gZm9yIGNvbnRhaW5lcnMgdG8gcHJvdmlkZSBjb25uZWN0aXZpdHkgdG8gZW50ZXJwcmlzZSBpbmZvcm1hdGlvbiBzeXN0ZW1zIChFSVNzKS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjb25uZWN0b3IgaXMgYSBKMkVFIHN0YW5kYXJkIGV4dGVuc2lvbiBtZWNoYW5pc20gZm9yIGNvbnRhaW5lcnMgdG8gcHJvdmlkZSBjb25uZWN0aXZpdHkgdG8gZW50ZXJwcmlzZSBpbmZvcm1hdGlvbiBzeXN0ZW1zIChFSVNzKS4iIC8+Ci08bWV0YSBjb250ZW50PSJjb25uZWN0b3IgcHJvamVjdHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY29ubmVjdG9yIHByb2plY3RzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NmYWNldHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0anJhciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqcmFyIj48YSBuYW1lPSJ0anJhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF90YXNrYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+QSBjb25uZWN0b3IgaXMgYSBKMkVFIHN0YW5kYXJkIGV4dGVuc2lvbgotbWVjaGFuaXNtIGZvciBjb250YWluZXJzIHRvIHByb3ZpZGUgY29ubmVjdGl2aXR5IHRvIGVudGVycHJpc2UgaW5mb3JtYXRpb24KLXN5c3RlbXMgKEVJU3MpLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+QQotY29ubmVjdG9yIGlzIHNwZWNpZmljIHRvIGFuIEVJUyBhbmQgY29uc2lzdHMgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFuZCBhcHBsaWNhdGlvbgotZGV2ZWxvcG1lbnQgdG9vbHMuIEEgcmVzb3VyY2UgYWRhcHRlciBpcyBhIHN5c3RlbS1sZXZlbCBzb2Z0d2FyZSBkcml2ZXIgdGhhdAotaXMgdXNlZCBieSBhbiBFSkIgY29udGFpbmVyIG9yIGFuIGFwcGxpY2F0aW9uIGNsaWVudCB0byBjb25uZWN0IHRvIGFuIEVJUy4KLUNvbm5lY3RvcnMgY29tcGx5IHdpdGggdGhlIEoyRUUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSAoSkNBKS48L3A+Ci08cD5MaWtlIHRoZQotb3RoZXIgdHlwZXMgb2YgcHJvamVjdHMsIGNvbm5lY3RvciBwcm9qZWN0cyBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSBwcm9qZWN0Ci1mYWNldHMsIHdoaWNoIHJlcHJlc2VudCB1bml0cyBvZiBmdW5jdGlvbmFsaXR5IGluIHRoZSBwcm9qZWN0LiBBIG5ldyBjb25uZWN0b3IKLXByb2plY3Qgc2hvdWxkIGhhdmUgdGhlIEoyQyBNb2R1bGUgZmFjZXQuIERlcGVuZGluZyBvbiB3aGF0IHlvdSB3YW50IHRvIHVzZQotdGhlIHByb2plY3QgZm9yLCB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIG90aGVyIGZhY2V0cyBmb3IgdGhlIHByb2plY3QuPC9wPgotPGRpdiBjbGFzcz0icmVzdHJpY3Rpb24iPjxzcGFuIGNsYXNzPSJyZXN0cmljdGlvbnRpdGxlIj5SZXN0cmljdGlvbjo8L3NwYW4+IEoyRUUgMS4yIHNwZWNpZmljYXRpb24gbGV2ZWwgZG9lcyBub3QgaW5jbHVkZSBjb25uZWN0b3IKLWNhcGFiaWxpdHkuPC9kaXY+Ci08cD5UbyBjcmVhdGUgYSBuZXcgY29ubmVjdG9yIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEphdmHihKIgRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmV3IFByb2plY3QgV2l6YXJkLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5KMkVFPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29ubmVjdG9yIFByb2plY3Q8L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdCBOYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSBhIG5hbWUgZm9yCi10aGUgY29ubmVjdG9yIHByb2plY3QuIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9qZWN0IGxvY2F0aW9uLCBjbGVhcgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBkZWZhdWx0PC9zcGFuPiBjaGVjayBib3ggdW5kZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdAotY29udGVudHM8L3NwYW4+IGFuZCBzZWxlY3QgYSBuZXcgbG9jYXRpb24gd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBidXR0b24uPC9zcGFuPgotIElmIHlvdSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgYmVpbmcKLXVzZWQgYnkgYW5vdGhlciBwcm9qZWN0LCB0aGUgcHJvamVjdCBjcmVhdGlvbiB3aWxsIGZhaWwuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSB0eXBlCi1hIG5ldyBFQVIgcHJvamVjdCBuYW1lLCB0aGUgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uCi13aXRoIHRoZSBsb3dlc3QgY29tcGF0aWJsZSBKMkVFIHZlcnNpb24gYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QKLWJlaW5nIGNyZWF0ZWQuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvciBhIGRpZmZlcmVudCBsb2NhdGlvbgotZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIE5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1Qcm9qZWN0IHdpemFyZC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IHdhbnQgdG8gYWRkIHRoZSBuZXcgcHJvamVjdCB0byBhbgotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvc3Bhbj4gY2hlY2sKLWJveCBhbmQgc2VsZWN0IGEgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIFByb2plY3QgTmFtZTwvc3Bhbj4gbGlzdC48L3NwYW4+Ci0gSWYgeW91IGNob29zZSB0byBhZGQgdGhlIHByb2plY3QgdG8gYW4gZXhpc3RpbmcgRUFSIHByb2plY3QsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQKLXJ1bnRpbWU8L3NwYW4+IGZpZWxkIGJlY29tZXMgZGlzYWJsZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IHJ1bnRpbWUgZm9yCi10aGUgbmV3IHByb2plY3Qgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBFQVIgcHJvamVjdC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgcnVudGltZTwvc3Bhbj4gZmllbGQsIHNlbGVjdCB0aGUKLXRhcmdldCBydW50aW1lIGZvciB0aGUgcHJvamVjdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyB1c2UgYSBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIKLXByb2plY3QsIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24gaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbmZpZ3VyYXRpb248L3NwYW4+IGxpc3QuCi1Zb3UgY2FuIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2RpZnk8L3NwYW4+IGJ1dHRvbiB0byBkbyB0aGUgZm9sbG93aW5nOjwvc3Bhbj4KLSA8dWw+Ci08bGk+Q3VzdG9taXplIHByb2plY3QgZmFjZXRzLiBTZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gdGhlIGZhY2V0cyB5b3UKLXdhbnQgdGhlIHByb2plY3QgdG8gaGF2ZSBhbmQgc2VsZWN0IGEgdmVyc2lvbiBudW1iZXIgZm9yIGVhY2ggZmFjZXQuIFNlbGVjdAotYSBmYWNldCBuYW1lIHRvIHNlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgZmFjZXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRldGFpbHM8L3NwYW4+IHRhYi4KLVlvdSBjYW4gYWxzbyBjaG9vc2UgYSBwcmVzZXQgY29tYmluYXRpb24gb2YgZmFjZXRzIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbmZpZ3VyYXRpb25zPC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaT5MaW1pdCB5b3VyIHByb2plY3QgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9uZSBvciBtb3JlIHJ1bnRpbWVzLiBDbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdwotUnVudGltZXM8L3NwYW4+IHRhYiBhbmQgc2VsZWN0IHRoZSBydW50aW1lcyB0aGF0IHlvdSB3YW50IHRoZSBwcm9qZWN0Ci10byBiZSBjb21wYXRpYmxlIHdpdGguIDwvbGk+Ci0KLTwvdWw+Ci1DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2UgRm9sZGVyPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIG5hbWUKLW9mIHRoZSBmb2xkZXIgdG8gdXNlIGZvciBzb3VyY2UgY29kZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9wb3N0cmVxIj48cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiB0aXRsZT0iQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRpZXMgdG9nZXRoZXIgdGhlIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24uIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2ZhY2V0cy5odG1sIiB0aXRsZT0iRmFjZXRzIGRlZmluZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlcXVpcmVtZW50cyBmb3IgSmF2YSBFRSBwcm9qZWN0cyBhbmQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLiI+UHJvamVjdCBmYWNldHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdGFyZ2V0c2VydmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTUxZGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGp0YXJnZXRzZXJ2ZXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+U3BlY2lmeWluZyB0YXJnZXQgc2VydmVycyBmb3IgSjJFRSBwcm9qZWN0czwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5XaGVuIHlvdSBkZXZlbG9wIEoyRUUgYXBwbGljYXRpb25zLA0KLXlvdSBjYW4gc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZQ0KLXRhcmdldCBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uIGFuZCBpbXBvcnQsIGFuZCBpdCBjYW4NCi1iZSBjaGFuZ2VkIGluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMuIFRoZSB0YXJnZXQgc2VydmVyIHNldHRpbmcgaXMgdGhlIGRlZmF1bHQNCi1tZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SjJFRTxpbmRleHRlcm0+dGFyZ2V0IHNlcnZlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByb2plY3RzPGluZGV4dGVybT50YXJnZXQgc2VydmVyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dGFyZ2V0DQotc2VydmVyczxpbmRleHRlcm0+SjJFRSBhcHBsaWNhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4gPHA+SW4NCi1vcmRlciB0byBzdXBwb3J0IGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHRoYXQgdXNlIGRpZmZlcmVudCBKREsgbGV2ZWxzDQotZm9yIHRoZWlyIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFJ1bnRpbWUgRW52aXJvbm1lbnQgKEpSRSksIHRoZSB3b3JrYmVuY2ggcHJvbXB0cw0KLXlvdSBmb3IgYSB0YXJnZXQgc2VydmVyIHNldHRpbmcgZm9yIGVhY2ggSjJFRSBwcm9qZWN0LiBGb3IgZXhhbXBsZSwgaWYgeW91DQotd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmVhdHVyZXMgb2YgSkRLIDEuNC4yLCB5b3VyIGFwcGxpY2F0aW9ucyByZXF1aXJlDQotZGlmZmVyZW50IGNsYXNzIHBhdGggZW50cmllcyB0aGFuIHRob3NlIHRoYXQgd2VyZSB1c2VkIGluIHByZXZpb3VzIHZlcnNpb25zDQotb2YgdGhlIHdvcmtiZW5jaC4gQnkgcHJvbXB0aW5nIHlvdSB0byBzcGVjaWZ5IGEgdGFyZ2V0IHNlcnZlciwgdGhlIHdvcmtiZW5jaA0KLWVuZm9yY2VzIHRoYXQgcHJvcGVyIGVudHJpZXMgYXJlIGFkZGVkIGZvciBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIgeW91IGNob29zZS48L3A+PHA+WW91DQotY2FuIGFsc28gYWRkIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IHNlcnZlciBmb3IgeW91ciBwcm9qZWN0LiBJbiB0aGlzIGNhc2UsIHRoZQ0KLXdvcmtiZW5jaCBwcmV2ZW50cyB5b3UgZnJvbSBhZGRpbmcgYW55IGZhY2V0cyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBvZiB0aGUNCi10YXJnZXQgc2VydmVycy4gSWYgeW91IGFkZCBtb3JlIHRoYW4gb25lIHRhcmdldCBzZXJ2ZXIsIGNob29zZSBhIHNlcnZlciB0aGF0DQotd2lsbCBjb250cmlidXRlIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3MgcGF0aCBhcyB0aGUgcHJpbWFyeSBzZXJ2ZXIuPC9wPjxwPldoZW4NCi10aGUgcHJvamVjdCBpcyBjcmVhdGVkLCB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgcHJvamVjdCBpcyB1cGRhdGVkIHdpdGggdHdvDQotY2xhc3MgcGF0aCBjb250YWluZXJzLiBPbmUgY29udGFpbmVyIGlzIHRoZSBKREsgY29udGFpbmVyIGFuZCB0aGUgb3RoZXIgaXMNCi10aGUgc2VydmVyIGNvbnRhaW5lci4gVGhlIEpESyBjb250YWluZXIgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucw0KLXRoZSBKQVIgZmlsZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlIEpESyB2ZXJzaW9uLiBUaGUgc2VydmVyIGNvbnRhaW5lcg0KLXBvaW50cyB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIG11bHRpcGxlIHB1YmxpYyBKQVIgZmlsZXMgYXZhaWxhYmxlDQotaW4gdGhlIHNlbGVjdGVkIHNlcnZlci4gVGhlIHByb2plY3QgdGhlbiBjb21waWxlcyBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgSkFSDQotZmlsZXMgbG9jYXRlZCBpbiB0aGVzZSBmb2xkZXJzLCBhbmQgeW91IGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGFkZGluZw0KLWFkZGl0aW9uYWwgSkFSIGZpbGVzIGZyb20gdGhlIHNlcnZlciBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4gdGhlIHByb2plY3QNCi1pcyBjb21waWxlZCwgdGhlIEpBUiBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIHBhdGguIFlvdSBjYW4gc3RpbGwgYWRkDQoteW91ciBvd24gSkFSIGZpbGVzIHRvIHRoZSBjbGFzcyBwYXRoLjwvcD48cD5UaGUgdGFyZ2V0IHJ1bnRpbWUgZW52aXJvbm1lbnQNCi1pcyBzcGVjaWZpZWQgaW4gdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCBmaWxlIGluDQotdGhlIHByb2plY3QncyAuc2V0dGluZ3MgZm9sZGVyLiBZb3Ugc2hvdWxkIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseTsgaW5zdGVhZCwNCi11c2UgdGhlIHByb3BlcnRpZXMgd2luZG93IGFzIGRlc2NyaWJlZCBpbiB0aGlzIHRvcGljLjwvcD48cD5BbGwgSjJFRSBwcm9qZWN0DQotY3JlYXRpb24gYW5kIGltcG9ydCB3aXphcmRzIHByb21wdCB5b3UgdG8gc3BlY2lmeSB0aGUgdGFyZ2V0IHNlcnZlciBmb3IgdGhlDQotcmVzdWx0aW5nIHByb2plY3RzLiBUaGUgbGlzdCBvZiB0YXJnZXQgc2VydmVycyB0aGF0IHlvdSBjYW4gY2hvb3NlIGZyb20gaXMNCi1maWx0ZXJlZCBiYXNlZCBvbiBpbnN0YWxsZWQgcnVudGltZXMsIHRoZSBKMkVFIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kDQotdGhlIEoyRUUgbW9kdWxlIHR5cGUuIEZvciBleGFtcGxlLCBmb3IgRUpCIHByb2plY3RzIG9ubHkgYXBwbGljYXRpb24gc2VydmVycw0KLXRoYXQgc3VwcG9ydCBFbnRlcnByaXNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YUJlYW5zIj5KYXZhQmVhbnM8L3RtPiBhcmUgZGlzcGxheWVkLiBBbGwgcHJvamVjdHMNCi1pbnNpZGUgYSBzaW5nbGUgRUFSIGZpbGUgbXVzdCBiZSB0YXJnZXRlZCB0byB0aGUgc2FtZSBzZXJ2ZXIuIElmIHlvdSBjcmVhdGUNCi1hIG5ldyBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYW4gZXhpc3RpbmcgRUFSIHByb2plY3QgZHVyaW5nIGNyZWF0aW9uLCB0aGUgcHJvamVjdA0KLWluaGVyaXRzIHRoZSB0YXJnZXQgc2VydmVyIHNldHRpbmcgb2YgdGhlIEVBUiBwcm9qZWN0LjwvcD48bm90ZT5VdGlsaXR5IDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3RzDQotdGhhdCBhcmUgYWRkZWQgdG8gYW4gYXBwbGljYXRpb24gYXJlIHRhcmdldGVkIHRvIHRoZSBzYW1lIHRhcmdldCBzZXJ2ZXIgYXMNCi10aGUgYXBwbGljYXRpb24uIFdlYiBsaWJyYXJ5IHByb2plY3RzIHRoYXQgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QgYXJlDQotdGFyZ2V0ZWQgdG8gdGhlIHNhbWUgdGFyZ2V0IHNlcnZlciBhcyB0aGUgV2ViIHByb2plY3QuPC9ub3RlPjxwPlRvIG1vZGlmeQ0KLXRoZSB0YXJnZXQgcnVudGltZSBhbmQgZGVmYXVsdCBzZXJ2ZXIgZm9yIGFuIGV4aXN0aW5nIHByb2plY3QsIGNvbXBsZXRlIHRoZQ0KLWZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcyBvdXRwdXRjbGFzcz0iaWRfc3RlcHMiPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gRUUgcGVyc3BlY3RpdmUsIHJpZ2h0LWNsaWNrIHRoZSBlbnRlcnByaXNlDQotYXBwbGljYXRpb24gb3IgbW9kdWxlIHByb2plY3QsIGFuZCBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5UYXJnZXRlZCBSdW50aW1lczwvdWljb250cm9sPiBwYWdlIGluIHRoZQ0KLVByb3BlcnRpZXMgZGlhbG9nLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlRhcmdldGVkIFJ1bnRpbWVzPC91aWNvbnRyb2w+IGxpc3QsIHNlbGVjdCB0aGUNCi1jaGVjayBib3hlcyBuZXh0IHRvIGVhY2ggb2YgdGhlIHJ1bnRpbWVzIHRoYXQgeW91IHdhbnQgdG8gZGV2ZWxvcCB0aGUgcHJvamVjdA0KLWZvci4gSWYgeW91IGRvbid0IHNlZSB0aGUgcnVudGltZSB0aGF0IHlvdSB3YW50IHRvIHVzZSwgeW91IG5lZWQgdG8gYWRkIGl0DQotdG8gdGhlIHJ1bnRpbWVzIGluIHRoZSB3b3JrYmVuY2guIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYgZm9ybWF0PSIiDQotaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlci90b3BpY3MvdHdpbnN0cHJmLmRpdGEiIHNjb3BlPSJwZWVyIj5EZWZpbmluZw0KLXRoZSBpbnN0YWxsZWQgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC94cmVmPi48L2NtZD48aW5mbz48bm90ZT5Pbmx5IHRoZQ0KLXJ1bnRpbWVzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvamVjdCdzIGZhY2V0cyBhcmUgc2hvd24uIFlvdSBjYW4gc2VsZWN0IHRoZSA8dWljb250cm9sPlNob3cNCi1hbGwgcnVudGltZXM8L3VpY29udHJvbD4gY2hlY2sgYm94IHRvIGRpc3BsYXkgdGhlIHJ1bnRpbWVzIG5vdCBjb21wYXRpYmxlDQotd2l0aCB0aGUgcHJvamVjdCdzIGN1cnJlbnQgZmFjZXQgY29uZmlndXJhdGlvbi4gVGhlc2UgcnVudGltZXMgYXJlIGdyYXllZA0KLW91dC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHNlbGVjdCB0aGUgcHJpbWFyeSBydW50aW1lLCBjbGljayBvbiBhIHJ1bnRpbWUgYW5kIHRoZW4gY2xpY2sNCi10aGUgPHVpY29udHJvbD5NYWtlIFByaW1hcnk8L3VpY29udHJvbD4gYnV0dG9uLjwvY21kPjxpbmZvPklmIHlvdSBzZWxlY3QgYW55DQotcnVudGltZXMgZm9yIHRoZSBwcm9qZWN0LCB5b3UgbXVzdCBtYWtlIG9uZSBvZiB0aG9zZSBydW50aW1lcyB0aGUgcHJpbWFyeQ0KLXJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LiBJZiB5b3Ugc2VsZWN0IG9ubHkgb25lIHJ1bnRpbWUgZnJvbSB0aGUgbGlzdCwgdGhhdA0KLXJ1bnRpbWUgaXMgYXV0b21hdGljYWxseSBtYWRlIHRoZSBwcmltYXJ5IHJ1bnRpbWUuIFRoZSBwcmltYXJ5IHJ1bnRpbWUgaXMNCi1zaG93biBpbiBib2xkIHRleHQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXEgb3V0cHV0Y2xhc3M9ImlkX3Bvc3RyZXEiPjxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iPjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdGFyZ2V0c2VydmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWE5ZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4geW91IGRldmVsb3AgSjJFRSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZSB0YXJnZXQgc2VydmVyIGlzIHNwZWNpZmllZCBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbiBhbmQgaW1wb3J0LCBhbmQgaXQgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIHByb2plY3QgcHJvcGVydGllcy4gVGhlIHRhcmdldCBzZXJ2ZXIgc2V0dGluZyBpcyB0aGUgZGVmYXVsdCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IGRldmVsb3AgSjJFRSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzIGZvciB5b3VyIEoyRUUgcHJvamVjdHMuIFRoZSB0YXJnZXQgc2VydmVyIGlzIHNwZWNpZmllZCBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbiBhbmQgaW1wb3J0LCBhbmQgaXQgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIHByb2plY3QgcHJvcGVydGllcy4gVGhlIHRhcmdldCBzZXJ2ZXIgc2V0dGluZyBpcyB0aGUgZGVmYXVsdCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIGNsYXNzIHBhdGggZm9yIEoyRUUgcHJvamVjdHMuIiAvPgotPG1ldGEgY29udGVudD0iSjJFRSwgdGFyZ2V0IHNlcnZlcnMsIHByb2plY3RzLCB0YXJnZXQgc2VydmVycywgSjJFRSBhcHBsaWNhdGlvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKMkVFLCB0YXJnZXQgc2VydmVycywgcHJvamVjdHMsIHRhcmdldCBzZXJ2ZXJzLCBKMkVFIGFwcGxpY2F0aW9ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlci90b3BpY3MvdHdpbnN0cHJmLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGp0YXJnZXRzZXJ2ZXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anRhcmdldHNlcnZlciI+PGEgbmFtZT0idGp0YXJnZXRzZXJ2ZXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHM8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPldoZW4geW91IGRldmVsb3AgSjJFRSBhcHBsaWNhdGlvbnMsCi15b3UgY2FuIHNwZWNpZnkgdGhlIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50cyBmb3IgeW91ciBKMkVFIHByb2plY3RzLiBUaGUKLXRhcmdldCBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uIGFuZCBpbXBvcnQsIGFuZCBpdCBjYW4KLWJlIGNoYW5nZWQgaW4gdGhlIHByb2plY3QgcHJvcGVydGllcy4gVGhlIHRhcmdldCBzZXJ2ZXIgc2V0dGluZyBpcyB0aGUgZGVmYXVsdAotbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZSBjbGFzcyBwYXRoIGZvciBKMkVFIHByb2plY3RzLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLSA8cD5Jbgotb3JkZXIgdG8gc3VwcG9ydCBkaWZmZXJlbnQgYXBwbGljYXRpb24gc2VydmVycyB0aGF0IHVzZSBkaWZmZXJlbnQgSkRLIGxldmVscwotZm9yIHRoZWlyIEphdmHihKIgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSwgdGhlIHdvcmtiZW5jaCBwcm9tcHRzCi15b3UgZm9yIGEgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIGZvciBlYWNoIEoyRUUgcHJvamVjdC4gRm9yIGV4YW1wbGUsIGlmIHlvdQotd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmVhdHVyZXMgb2YgSkRLIDEuNC4yLCB5b3VyIGFwcGxpY2F0aW9ucyByZXF1aXJlCi1kaWZmZXJlbnQgY2xhc3MgcGF0aCBlbnRyaWVzIHRoYW4gdGhvc2UgdGhhdCB3ZXJlIHVzZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMKLW9mIHRoZSB3b3JrYmVuY2guIEJ5IHByb21wdGluZyB5b3UgdG8gc3BlY2lmeSBhIHRhcmdldCBzZXJ2ZXIsIHRoZSB3b3JrYmVuY2gKLWVuZm9yY2VzIHRoYXQgcHJvcGVyIGVudHJpZXMgYXJlIGFkZGVkIGZvciBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIgeW91IGNob29zZS48L3A+Ci08cD5Zb3UKLWNhbiBhbHNvIGFkZCBtb3JlIHRoYW4gb25lIHRhcmdldCBzZXJ2ZXIgZm9yIHlvdXIgcHJvamVjdC4gSW4gdGhpcyBjYXNlLCB0aGUKLXdvcmtiZW5jaCBwcmV2ZW50cyB5b3UgZnJvbSBhZGRpbmcgYW55IGZhY2V0cyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBvZiB0aGUKLXRhcmdldCBzZXJ2ZXJzLiBJZiB5b3UgYWRkIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IHNlcnZlciwgY2hvb3NlIGEgc2VydmVyIHRoYXQKLXdpbGwgY29udHJpYnV0ZSB0byB0aGUgcHJvamVjdCdzIGNsYXNzIHBhdGggYXMgdGhlIHByaW1hcnkgc2VydmVyLjwvcD4KLTxwPldoZW4KLXRoZSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHRoZSBjbGFzcyBwYXRoIG9mIHRoZSBwcm9qZWN0IGlzIHVwZGF0ZWQgd2l0aCB0d28KLWNsYXNzIHBhdGggY29udGFpbmVycy4gT25lIGNvbnRhaW5lciBpcyB0aGUgSkRLIGNvbnRhaW5lciBhbmQgdGhlIG90aGVyIGlzCi10aGUgc2VydmVyIGNvbnRhaW5lci4gVGhlIEpESyBjb250YWluZXIgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucwotdGhlIEpBUiBmaWxlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGUgSkRLIHZlcnNpb24uIFRoZSBzZXJ2ZXIgY29udGFpbmVyCi1wb2ludHMgdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBtdWx0aXBsZSBwdWJsaWMgSkFSIGZpbGVzIGF2YWlsYWJsZQotaW4gdGhlIHNlbGVjdGVkIHNlcnZlci4gVGhlIHByb2plY3QgdGhlbiBjb21waWxlcyBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgSkFSCi1maWxlcyBsb2NhdGVkIGluIHRoZXNlIGZvbGRlcnMsIGFuZCB5b3UgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgYWRkaW5nCi1hZGRpdGlvbmFsIEpBUiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgZHVyaW5nIGRldmVsb3BtZW50LiBXaGVuIHRoZSBwcm9qZWN0Ci1pcyBjb21waWxlZCwgdGhlIEpBUiBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIHBhdGguIFlvdSBjYW4gc3RpbGwgYWRkCi15b3VyIG93biBKQVIgZmlsZXMgdG8gdGhlIGNsYXNzIHBhdGguPC9wPgotPHA+VGhlIHRhcmdldCBydW50aW1lIGVudmlyb25tZW50Ci1pcyBzcGVjaWZpZWQgaW4gdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCBmaWxlIGluCi10aGUgcHJvamVjdCdzIC5zZXR0aW5ncyBmb2xkZXIuIFlvdSBzaG91bGQgbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5OyBpbnN0ZWFkLAotdXNlIHRoZSBwcm9wZXJ0aWVzIHdpbmRvdyBhcyBkZXNjcmliZWQgaW4gdGhpcyB0b3BpYy48L3A+Ci08cD5BbGwgSjJFRSBwcm9qZWN0Ci1jcmVhdGlvbiBhbmQgaW1wb3J0IHdpemFyZHMgcHJvbXB0IHlvdSB0byBzcGVjaWZ5IHRoZSB0YXJnZXQgc2VydmVyIGZvciB0aGUKLXJlc3VsdGluZyBwcm9qZWN0cy4gVGhlIGxpc3Qgb2YgdGFyZ2V0IHNlcnZlcnMgdGhhdCB5b3UgY2FuIGNob29zZSBmcm9tIGlzCi1maWx0ZXJlZCBiYXNlZCBvbiBpbnN0YWxsZWQgcnVudGltZXMsIHRoZSBKMkVFIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kCi10aGUgSjJFRSBtb2R1bGUgdHlwZS4gRm9yIGV4YW1wbGUsIGZvciBFSkIgcHJvamVjdHMgb25seSBhcHBsaWNhdGlvbiBzZXJ2ZXJzCi10aGF0IHN1cHBvcnQgRW50ZXJwcmlzZSBKYXZhQmVhbnPihKIgYXJlIGRpc3BsYXllZC4gQWxsIHByb2plY3RzCi1pbnNpZGUgYSBzaW5nbGUgRUFSIGZpbGUgbXVzdCBiZSB0YXJnZXRlZCB0byB0aGUgc2FtZSBzZXJ2ZXIuIElmIHlvdSBjcmVhdGUKLWEgbmV3IHByb2plY3QgYW5kIGFkZCBpdCB0byBhbiBleGlzdGluZyBFQVIgcHJvamVjdCBkdXJpbmcgY3JlYXRpb24sIHRoZSBwcm9qZWN0Ci1pbmhlcml0cyB0aGUgdGFyZ2V0IHNlcnZlciBzZXR0aW5nIG9mIHRoZSBFQVIgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVXRpbGl0eSBKYXZhIHByb2plY3RzCi10aGF0IGFyZSBhZGRlZCB0byBhbiBhcHBsaWNhdGlvbiBhcmUgdGFyZ2V0ZWQgdG8gdGhlIHNhbWUgdGFyZ2V0IHNlcnZlciBhcwotdGhlIGFwcGxpY2F0aW9uLiBXZWIgbGlicmFyeSBwcm9qZWN0cyB0aGF0IGFyZSBhZGRlZCB0byBhIFdlYiBwcm9qZWN0IGFyZQotdGFyZ2V0ZWQgdG8gdGhlIHNhbWUgdGFyZ2V0IHNlcnZlciBhcyB0aGUgV2ViIHByb2plY3QuPC9kaXY+Ci08cD5UbyBtb2RpZnkKLXRoZSB0YXJnZXQgcnVudGltZSBhbmQgZGVmYXVsdCBzZXJ2ZXIgZm9yIGFuIGV4aXN0aW5nIHByb2plY3QsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sgdGhlIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIG9yIG1vZHVsZSBwcm9qZWN0LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXRlZCBSdW50aW1lczwvc3Bhbj4gcGFnZSBpbiB0aGUKLVByb3BlcnRpZXMgZGlhbG9nLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXRlZCBSdW50aW1lczwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZQotY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIG9mIHRoZSBydW50aW1lcyB0aGF0IHlvdSB3YW50IHRvIGRldmVsb3AgdGhlIHByb2plY3QKLWZvci4gSWYgeW91IGRvbid0IHNlZSB0aGUgcnVudGltZSB0aGF0IHlvdSB3YW50IHRvIHVzZSwgeW91IG5lZWQgdG8gYWRkIGl0Ci10byB0aGUgcnVudGltZXMgaW4gdGhlIHdvcmtiZW5jaC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmRvYy51c2VyL3RvcGljcy90d2luc3RwcmYuaHRtbCI+RGVmaW5pbmcgdGhlIGluc3RhbGxlZCBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHM8L2E+Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IE9ubHkgdGhlCi1ydW50aW1lcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBmYWNldHMgYXJlIHNob3duLiBZb3UgY2FuIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdwotYWxsIHJ1bnRpbWVzPC9zcGFuPiBjaGVjayBib3ggdG8gZGlzcGxheSB0aGUgcnVudGltZXMgbm90IGNvbXBhdGlibGUKLXdpdGggdGhlIHByb2plY3QncyBjdXJyZW50IGZhY2V0IGNvbmZpZ3VyYXRpb24uIFRoZXNlIHJ1bnRpbWVzIGFyZSBncmF5ZWQKLW91dC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gc2VsZWN0IHRoZSBwcmltYXJ5IHJ1bnRpbWUsIGNsaWNrIG9uIGEgcnVudGltZSBhbmQgdGhlbiBjbGljawotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1ha2UgUHJpbWFyeTwvc3Bhbj4gYnV0dG9uLjwvc3Bhbj4gSWYgeW91IHNlbGVjdCBhbnkKLXJ1bnRpbWVzIGZvciB0aGUgcHJvamVjdCwgeW91IG11c3QgbWFrZSBvbmUgb2YgdGhvc2UgcnVudGltZXMgdGhlIHByaW1hcnkKLXJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LiBJZiB5b3Ugc2VsZWN0IG9ubHkgb25lIHJ1bnRpbWUgZnJvbSB0aGUgbGlzdCwgdGhhdAotcnVudGltZSBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgdGhlIHByaW1hcnkgcnVudGltZS4gVGhlIHByaW1hcnkgcnVudGltZSBpcwotc2hvd24gaW4gYm9sZCB0ZXh0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9wb3N0cmVxIj48cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXJjaC5odG1sIiB0aXRsZT0iVGhlIEphdmEgMiBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBwcm92aWRlcyBhIHN0YW5kYXJkIGZvciBkZXZlbG9waW5nIG11bHRpdGllciwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZG9jLnVzZXIvdG9waWNzL3R3aW5zdHByZi5odG1sIj5EZWZpbmluZyB0aGUgaW5zdGFsbGVkIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3YmU4MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0anZhbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+VGhlIHdvcmtiZW5jaCBpbmNsdWRlcyB2YWxpZGF0b3JzIHRoYXQNCi1jaGVjayBjZXJ0YWluIGZpbGVzIGluIHlvdXIgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBtb2R1bGUgcHJvamVjdHMgZm9yIGVycm9ycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5idWlsZCB2YWxpZGF0aW9uPGluZGV4dGVybT5lbmFibGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+Y29kZSB2YWxpZGF0aW9uPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dmFsaWRhdGlvbjxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5IG91dHB1dGNsYXNzPSJpZF90YXNrYm9keSI+DQotPGNvbnRleHQgb3V0cHV0Y2xhc3M9ImlkX2NvbnRleHQiPiA8cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+IDxwPkJ5DQotZGVmYXVsdCwgdGhlIHdvcmtiZW5jaCB2YWxpZGF0ZXMgeW91ciBmaWxlcyBhdXRvbWF0aWNhbGx5IGFmdGVyIGFueSBidWlsZCwNCi1pbmNsdWRpbmcgYXV0b21hdGljIGJ1aWxkcy4gWW91IGNhbiBhbHNvIGJlZ2luIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MgbWFudWFsbHkNCi13aXRob3V0IGJ1aWxkaW5nLjwvcD48cD5PbiB0aGUgd29ya2JlbmNoIFByZWZlcmVuY2VzIHdpbmRvdywgeW91IGNhbiBlbmFibGUNCi1vciBkaXNhYmxlIHZhbGlkYXRvcnMgdG8gYmUgdXNlZCBvbiB5b3VyIHByb2plY3RzLiBBbHNvLCB5b3UgY2FuIGVuYWJsZSBvcg0KLWRpc2FibGUgdmFsaWRhdG9ycyBmb3IgZWFjaCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vZHVsZSBwcm9qZWN0IGluZGl2aWR1YWxseQ0KLW9uIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgZm9yIHRoYXQgcHJvamVjdC48L3A+PHA+RWFjaCB2YWxpZGF0b3IgY2FuIGFwcGx5IHRvDQotY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLg0KLVdoZW4gYSB2YWxpZGF0b3IgYXBwbGllcyB0byBhIHByb2plY3QgZmFjZXQgb3IgbmF0dXJlLCB0aGUgd29ya2JlbmNoIHVzZXMNCi10aGF0IHZhbGlkYXRvciBvbmx5IG9uIHByb2plY3RzIHRoYXQgaGF2ZSB0aGF0IGZhY2V0IG9yIG5hdHVyZS4gTGlrZXdpc2UsDQotbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzDQotdGhvc2UgdmFsaWRhdG9ycyBvbmx5IG9uIHRob3NlIHR5cGVzIG9mIGZpbGVzLjwvcD48cD5UbyB2YWxpZGF0ZSB5b3VyIGZpbGVzLA0KLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPiBpbiB0aGUgbGVmdCBwYW5lLjwvY21kPg0KLTxzdGVwcmVzdWx0PlRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBsaXN0cyB0aGUgdmFsaWRhdG9ycw0KLWF2YWlsYWJsZSBpbiB5b3VyIHByb2plY3QgYW5kIHRoZWlyIHNldHRpbmdzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+UmV2aWV3IHRoZSBjaGVjayBib3ggb3B0aW9ucyBhdmFpbGFibGUgbmVhcg0KLXRoZSB0b3Agb2YgdGhlIHdpbmRvdyB0byBjdXN0b21pemUgeW91ciB2YWxpZGF0aW9uIHNldHRpbmdzOjwvY21kPg0KLTxjaG9pY2V0YWJsZT4NCi08Y2hoZWFkPjxjaG9wdGlvbmhkPk9wdGlvbjwvY2hvcHRpb25oZD48Y2hkZXNjaGQ+RGVzY3JpcHRpb248L2NoZGVzY2hkPjwvY2hoZWFkPg0KLTxjaHJvdz48Y2hvcHRpb24+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvY2hvcHRpb24+DQotPGNoZGVzYz5TZWxlY3QgdG8gc2V0IGluZGl2aWR1YWwgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3Igb25lIG9yIG1vcmUgb2YgeW91cg0KLXByb2plY3RzLjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9jaG9wdGlvbj48Y2hkZXNjPlNlbGVjdCB0byBwcmV2ZW50DQotdmFsaWRhdGlvbiBhdCB0aGUgZ2xvYmFsIGxldmVsLjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nPC9jaG9wdGlvbj4NCi08Y2hkZXNjPlNlbGVjdCB0byBzYXZlIHJlc291cmNlcyB5b3UgaGF2ZSBtb2RpZmllZCBiZWZvcmUgdGhlIHZhbGlkYXRpb24gYmVnaW5zLjwvY2hkZXNjPg0KLTwvY2hyb3c+PGNocm93PjxjaG9wdGlvbj5TaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aGVuIHBlcmZvcm1pbmcgbWFudWFsIHZhbGlkYXRpb248L2Nob3B0aW9uPg0KLTxjaGRlc2M+U2VsZWN0IHRvIHNob3cgYW4gaW5mb3JtYXRpb25hbCBkaWFsb2cgYWZ0ZXIgYSBtYW51YWwgdmFsaWRhdGlvbiByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuPC9jaGRlc2M+DQotPC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoDQotdmFsaWRhdG9yIHlvdSB3YW50IHRvIHVzZSBhdCB0aGUgZ2xvYmFsIGxldmVsLjwvY21kPjxpbmZvPkVhY2ggdmFsaWRhdG9yIGhhcw0KLWEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIGFuZC9vciBvbiBidWlsZA0KLXZhbGlkYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlR1bmUgYSB2YWxpZGF0b3IgYnkgY2xpY2tpbmcNCi10aGUgYnV0dG9uIGluIHRoZSA8dWljb250cm9sPlNldHRpbmdzPC91aWNvbnRyb2w+IGNvbHVtbi48L2NtZD4NCi08aW5mbz5Ob3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBhZGRpdGlvbmFsIHNldHRpbmdzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5CZWdpbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5SaWdodC1jbGljayBhIHByb2plY3QgYW5kIGNsaWNrIDx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD4uPC9jaG9pY2U+DQotPGNob2ljZT5TdGFydCBhIGJ1aWxkLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0IG91dHB1dGNsYXNzPSJpZF9yZXN1bHQiPkFueSBlcnI8P1B1YiBDYXJldD8+b3JzIGZvdW5kIGJ5IHRoZSB2YWxpZGF0b3JzDQotYXJlIGxpc3RlZCBpbiB0aGUgUHJvYmxlbXMgdmlldy48cD5JZiB5b3Ugd2FudCB0byBzZXQgaW5kaXZpZHVhbCB2YWxpZGF0aW9uDQotc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIG9mIHlvdXIgcHJvamVjdHMsIHNlZSA8eHJlZiBocmVmPSJ0anZhbGdsb2JhbHByZWYuZGl0YSI+PC94cmVmPiBmb3INCi1tb3JlIGluZm9ybWF0aW9uLjwvcD48L3Jlc3VsdD4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzk0OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YWI2YTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIHdvcmtiZW5jaCBpbmNsdWRlcyB2YWxpZGF0b3JzIHRoYXQgY2hlY2sgY2VydGFpbiBmaWxlcyBpbiB5b3VyIGVudGVycHJpc2UgYXBwbGljYXRpb24gbW9kdWxlIHByb2plY3RzIGZvciBlcnJvcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSB3b3JrYmVuY2ggaW5jbHVkZXMgdmFsaWRhdG9ycyB0aGF0IGNoZWNrIGNlcnRhaW4gZmlsZXMgaW4geW91ciBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vZHVsZSBwcm9qZWN0cyBmb3IgZXJyb3JzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImJ1aWxkIHZhbGlkYXRpb24sIGVuYWJsaW5nLCBjb2RlIHZhbGlkYXRpb24sIG92ZXJ2aWV3LCB2YWxpZGF0aW9uIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iYnVpbGQgdmFsaWRhdGlvbiwgZW5hYmxpbmcsIGNvZGUgdmFsaWRhdGlvbiwgb3ZlcnZpZXcsIHZhbGlkYXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0anZhbCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGp2YWwiPjxhIG5hbWU9InRqdmFsIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9ImlkX3RpdGxlIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPlRoZSB3b3JrYmVuY2ggaW5jbHVkZXMgdmFsaWRhdG9ycyB0aGF0Ci1jaGVjayBjZXJ0YWluIGZpbGVzIGluIHlvdXIgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBtb2R1bGUgcHJvamVjdHMgZm9yIGVycm9ycy48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPiA8cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotIDxwPkJ5Ci1kZWZhdWx0LCB0aGUgd29ya2JlbmNoIHZhbGlkYXRlcyB5b3VyIGZpbGVzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYW55IGJ1aWxkLAotaW5jbHVkaW5nIGF1dG9tYXRpYyBidWlsZHMuIFlvdSBjYW4gYWxzbyBiZWdpbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIG1hbnVhbGx5Ci13aXRob3V0IGJ1aWxkaW5nLjwvcD4KLTxwPk9uIHRoZSB3b3JrYmVuY2ggUHJlZmVyZW5jZXMgd2luZG93LCB5b3UgY2FuIGVuYWJsZQotb3IgZGlzYWJsZSB2YWxpZGF0b3JzIHRvIGJlIHVzZWQgb24geW91ciBwcm9qZWN0cy4gQWxzbywgeW91IGNhbiBlbmFibGUgb3IKLWRpc2FibGUgdmFsaWRhdG9ycyBmb3IgZWFjaCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vZHVsZSBwcm9qZWN0IGluZGl2aWR1YWxseQotb24gdGhlIFByb3BlcnRpZXMgcGFnZSBmb3IgdGhhdCBwcm9qZWN0LjwvcD4KLTxwPkVhY2ggdmFsaWRhdG9yIGNhbiBhcHBseSB0bwotY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLgotV2hlbiBhIHZhbGlkYXRvciBhcHBsaWVzIHRvIGEgcHJvamVjdCBmYWNldCBvciBuYXR1cmUsIHRoZSB3b3JrYmVuY2ggdXNlcwotdGhhdCB2YWxpZGF0b3Igb25seSBvbiBwcm9qZWN0cyB0aGF0IGhhdmUgdGhhdCBmYWNldCBvciBuYXR1cmUuIExpa2V3aXNlLAotbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzCi10aG9zZSB2YWxpZGF0b3JzIG9ubHkgb24gdGhvc2UgdHlwZXMgb2YgZmlsZXMuPC9wPgotPHA+VG8gdmFsaWRhdGUgeW91ciBmaWxlcywKLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPiBpbiB0aGUgbGVmdCBwYW5lLjwvc3Bhbj4KLSBUaGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgbGlzdHMgdGhlIHZhbGlkYXRvcnMKLWF2YWlsYWJsZSBpbiB5b3VyIHByb2plY3QgYW5kIHRoZWlyIHNldHRpbmdzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+UmV2aWV3IHRoZSBjaGVjayBib3ggb3B0aW9ucyBhdmFpbGFibGUgbmVhcgotdGhlIHRvcCBvZiB0aGUgd2luZG93IHRvIGN1c3RvbWl6ZSB5b3VyIHZhbGlkYXRpb24gc2V0dGluZ3M6PC9zcGFuPgotCi08dGFibGUgY2xhc3M9ImNob2ljZXRhYmxlYm9yZGVyIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgcnVsZXM9InJvd3MiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSI+Ci08dGhlYWQ+PHRyPjx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDBBOS1vcHRpb24iPk9wdGlvbjwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwQTktZGVzYyI+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KLTx0Ym9keT4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEE5LW9wdGlvbiIgaWQ9Ik4xMDBDMiI+PHN0cm9uZz5BbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTktZGVzYyBOMTAwQzIiPlNlbGVjdCB0byBzZXQgaW5kaXZpZHVhbCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBvbmUgb3IgbW9yZSBvZiB5b3VyCi1wcm9qZWN0cy48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEE5LW9wdGlvbiIgaWQ9Ik4xMDBEMiI+PHN0cm9uZz5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEE5LWRlc2MgTjEwMEQyIj5TZWxlY3QgdG8gcHJldmVudAotdmFsaWRhdGlvbiBhdCB0aGUgZ2xvYmFsIGxldmVsLjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTktb3B0aW9uIiBpZD0iTjEwMEUxIj48c3Ryb25nPlNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmc8L3N0cm9uZz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBOS1kZXNjIE4xMDBFMSI+U2VsZWN0IHRvIHNhdmUgcmVzb3VyY2VzIHlvdSBoYXZlIG1vZGlmaWVkIGJlZm9yZSB0aGUgdmFsaWRhdGlvbiBiZWdpbnMuPC90ZD4KLQotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBOS1vcHRpb24iIGlkPSJOMTAwRjEiPjxzdHJvbmc+U2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2hlbiBwZXJmb3JtaW5nIG1hbnVhbCB2YWxpZGF0aW9uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTktZGVzYyBOMTAwRjEiPlNlbGVjdCB0byBzaG93IGFuIGluZm9ybWF0aW9uYWwgZGlhbG9nIGFmdGVyIGEgbWFudWFsIHZhbGlkYXRpb24gcmVxdWVzdCBoYXMgY29tcGxldGVkLjwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+PC90YWJsZT4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gZWFjaAotdmFsaWRhdG9yIHlvdSB3YW50IHRvIHVzZSBhdCB0aGUgZ2xvYmFsIGxldmVsLjwvc3Bhbj4gRWFjaCB2YWxpZGF0b3IgaGFzCi1hIGNoZWNrIGJveCB0byBzcGVjaWZ5IHdoZXRoZXIgaXQgaXMgdXNlZCBvbiBtYW51YWwgdmFsaWRhdGlvbiBhbmQvb3Igb24gYnVpbGQKLXZhbGlkYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UdW5lIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nCi10aGUgYnV0dG9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXR0aW5nczwvc3Bhbj4gY29sdW1uLjwvc3Bhbj4KLSBOb3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBhZGRpdGlvbmFsIHNldHRpbmdzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QmVnaW4gdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOjwvc3Bhbj4KLTx1bD4KLTxsaT5SaWdodC1jbGljayBhIHByb2plY3QgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPi48L2xpPgotCi08bGk+U3RhcnQgYSBidWlsZC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9yZXN1bHQiPkFueSBlcnJvcnMgZm91bmQgYnkgdGhlIHZhbGlkYXRvcnMKLWFyZSBsaXN0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuPHA+SWYgeW91IHdhbnQgdG8gc2V0IGluZGl2aWR1YWwgdmFsaWRhdGlvbgotc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIG9mIHlvdXIgcHJvamVjdHMsIHNlZSA8YSBocmVmPSJ0anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUmIzEwO3RoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+IGZvcgotbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3J2YWxlcnIuaHRtbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGNvbW1vbiBlcnJvciBtZXNzYWdlcyB5b3UgbWF5IGVuY291bnRlciB3aGVuIHlvdSB2YWxpZGF0ZSB5b3VyIHByb2plY3RzLiI+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBkaWZmZXJlbnQgcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBlYWNoIHZhbGlkYXRvci4iPkoyRUUgVmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGRpc2FibGUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZGlzYWJsZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUzYWExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZGlzYWJsZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0anZhbGRpc2FibGUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+RGlzYWJsaW5nIHZhbGlkYXRpb248L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMNCi1pbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uDQotc2V0dGluZ3MgZm9yIHlvdXIgZW50aXJlIHdvcmtzcGFjZSBhbmQgZm9yIGluZGl2aWR1YWwgcHJvamVjdHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+dmFsaWRhdGlvbjxpbmRleHRlcm0+ZGlzYWJsaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5jb2RlIHZhbGlkYXRpb248aW5kZXh0ZXJtPmRpc2FibGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPjxwPlRvDQotZGlzYWJsZSB2YWxpZGF0b3JzIGluIHlvdXIgcHJvamVjdCBvciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPiBpbiB0aGUgbGVmdCBwYW5lLjwvY21kPg0KLTxzdGVwcmVzdWx0PlRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBsaXN0cyB0aGUgdmFsaWRhdG9ycw0KLWF2YWlsYWJsZSBpbiB5b3VyIHByb2plY3QgYW5kIHRoZWlyIHNldHRpbmdzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBkaXNhYmxlIGluZGl2aWR1YWwgdmFsaWRhdG9ycywgY2xlYXIgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8NCi1lYWNoIHZhbGlkYXRvciB0aGF0IHlvdSB3YW50IHRvIGRpc2FibGUuPC9jbWQ+PGluZm8+RWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sNCi1ib3ggdG8gc3BlY2lmeSB3aGV0aGVyIGl0IGlzIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGEgYnVpbGQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD48P1B1YiBDYXJldDE/PllvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIGZvbGxvd2luZw0KLWNoZWNrIGJveCBvcHRpb25zIG9uIHRoaXMgcGFnZTo8L2NtZD4NCi08Y2hvaWNldGFibGU+DQotPGNoaGVhZD48Y2hvcHRpb25oZD5PcHRpb248L2Nob3B0aW9uaGQ+PGNoZGVzY2hkPkRlc2NyaXB0aW9uPC9jaGRlc2NoZD48L2NoaGVhZD4NCi08Y2hyb3c+PGNob3B0aW9uPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2Nob3B0aW9uPg0KLTxjaGRlc2M+U2VsZWN0IHRvIHNldCBpbmRpdmlkdWFsIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIG9mIHlvdXINCi1wcm9qZWN0cy48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+U3VzcGVuZCBhbGwgdmFsaWRhdG9yczwvY2hvcHRpb24+PGNoZGVzYz5TZWxlY3QgdG8gcHJldmVudA0KLXZhbGlkYXRpb24gYXQgdGhlIGdsb2JhbCBsZXZlbC4gSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgeW91IGNhbiBzdGlsbA0KLWVuYWJsZSB2YWxpZGF0aW9uIGF0IHRoZSBwcm9qZWN0IGxldmVsLjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+SWYgeW91IHdhbnQgdG8gc2V0IGluZGl2aWR1YWwgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3Igb25lIG9yIG1vcmUNCi1vZiB5b3VyIHByb2plY3RzLCBzZWUgPHhyZWYgaHJlZj0idGp2YWxnbG9iYWxwcmVmLmRpdGEiPjwveHJlZj48L3Jlc3VsdD4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjQ0NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGRpc2FibGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmYmI4Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGRpc2FibGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaXNhYmxpbmcgdmFsaWRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBpbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciB5b3VyIGVudGlyZSB3b3Jrc3BhY2UgYW5kIGZvciBpbmRpdmlkdWFsIHByb2plY3RzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBpbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciB5b3VyIGVudGlyZSB3b3Jrc3BhY2UgYW5kIGZvciBpbmRpdmlkdWFsIHByb2plY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIGRpc2FibGluZywgY29kZSB2YWxpZGF0aW9uIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idmFsaWRhdGlvbiwgZGlzYWJsaW5nLCBjb2RlIHZhbGlkYXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3J0dW5ldmFsaWRhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqdmFsZGlzYWJsZSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRpc2FibGluZyB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGRpc2FibGUiPjxhIG5hbWU9InRqdmFsZGlzYWJsZSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+RGlzYWJsaW5nIHZhbGlkYXRpb248L2gxPgotCi0KLQotPGRpdiBjbGFzcz0iaWRfdGFza2JvZHkiPjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzCi1pbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uCi1zZXR0aW5ncyBmb3IgeW91ciBlbnRpcmUgd29ya3NwYWNlIGFuZCBmb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImlkX2NvbnRleHQiPjxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci08cD5UbwotZGlzYWJsZSB2YWxpZGF0b3JzIGluIHlvdXIgcHJvamVjdCBvciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbCBjbGFzcz0iaWRfc3RlcHMiPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPiBpbiB0aGUgbGVmdCBwYW5lLjwvc3Bhbj4KLSBUaGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgbGlzdHMgdGhlIHZhbGlkYXRvcnMKLWF2YWlsYWJsZSBpbiB5b3VyIHByb2plY3QgYW5kIHRoZWlyIHNldHRpbmdzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZGlzYWJsZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMsIGNsZWFyIHRoZSBjaGVjayBib3hlcyBuZXh0IHRvCi1lYWNoIHZhbGlkYXRvciB0aGF0IHlvdSB3YW50IHRvIGRpc2FibGUuPC9zcGFuPiBFYWNoIHZhbGlkYXRvciBoYXMgYSBjaGVjawotYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbiBvciBvbiBhIGJ1aWxkLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5Zb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBmb2xsb3dpbmcKLWNoZWNrIGJveCBvcHRpb25zIG9uIHRoaXMgcGFnZTo8L3NwYW4+Ci0KLTx0YWJsZSBjbGFzcz0iY2hvaWNldGFibGVib3JkZXIiIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBydWxlcz0icm93cyIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIj4KLTx0aGVhZD48dHI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMDlELW9wdGlvbiI+T3B0aW9uPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA5RC1kZXNjIj5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPgotPHRib2R5PgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOUQtb3B0aW9uIiBpZD0iTjEwMEI2Ij48c3Ryb25nPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L3N0cm9uZz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5RC1kZXNjIE4xMDBCNiI+U2VsZWN0IHRvIHNldCBpbmRpdmlkdWFsIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIG9mIHlvdXIKLXByb2plY3RzLjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOUQtb3B0aW9uIiBpZD0iTjEwMEM2Ij48c3Ryb25nPlN1c3BlbmQgYWxsIHZhbGlkYXRvcnM8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOUQtZGVzYyBOMTAwQzYiPlNlbGVjdCB0byBwcmV2ZW50Ci12YWxpZGF0aW9uIGF0IHRoZSBnbG9iYWwgbGV2ZWwuIElmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHlvdSBjYW4gc3RpbGwKLWVuYWJsZSB2YWxpZGF0aW9uIGF0IHRoZSBwcm9qZWN0IGxldmVsLjwvdGQ+Ci08L3RyPgotCi08L3Rib2R5PjwvdGFibGU+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JZiB5b3Ugd2FudCB0byBzZXQgaW5kaXZpZHVhbCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBvbmUgb3IgbW9yZQotb2YgeW91ciBwcm9qZWN0cywgc2VlIDxhIGhyZWY9InRqdmFsZ2xvYmFscHJlZi5odG1sIiB0aXRsZT0iRm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSYjMTA7dGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBkdXJpbmcgbWFudWFsIGFuZCBidWlsZCBjb2RlIHZhbGlkYXRpb24uIFlvdSBjYW4gc2V0IGVhY2ggdmFsaWRhdG9yIHRvIHJ1biBvbiBtYW51YWwgdmFsaWRhdGlvbiwgYnVpbGQgdmFsaWRhdGlvbiwgYm90aCwgb3IgbmVpdGhlci4iPlNlbGVjdGluZyBjb2RlIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnR1bmV2YWxpZGF0Lmh0bWwiIHRpdGxlPSJXaGV0aGVyIG9yIG5vdCBhIHZhbGlkYXRvciB2YWxpZGF0ZXMgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24gdGhlIGZpbHRlcnMgdGhhdCBhcmUgaW4gcGxhY2UgZm9yIHRoYXQgdmFsaWRhdG9yLiI+VHVuaW5nIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ODdkZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGp2YWxnbG9iYWxwcmVmIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+Rm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZQ0KLXRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT52YWxpZGF0aW9uPGluZGV4dGVybT5vdmVycmlkaW5nIGdsb2JhbCBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+Y29kZSB2YWxpZGF0aW9uPGluZGV4dGVybT5vdmVycmlkaW5nIGdsb2JhbCBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+IDxwIG91dHB1dGNsYXNzPSJhbmNob3JfdG9waWN0b3AiPjwvcD4gPHA+VGhlDQotZGVmYXVsdCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGFyZSBzcGVjaWZpZWQgZ2xvYmFsbHkgb24gdGhlIFZhbGlkYXRpb24gcGFnZQ0KLW9mIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuIFRvIGFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsaWRhdGlvbg0KLXByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4gaW4gdGhlIGxlZnQgcGFuZS48L2NtZD4NCi08c3RlcHJlc3VsdD5UaGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgbGlzdHMgdGhlIHZhbGlkYXRvcnMNCi1hdmFpbGFibGUgaW4geW91ciBwcm9qZWN0IGFuZCB0aGVpciBzZXR0aW5ncy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2UNCi1zZXR0aW5nczwvdWljb250cm9sPiBjaGVjayBib3ggYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPHN0ZXByZXN1bHQ+Tm93IGluZGl2aWR1YWwgcHJvamVjdHMgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMuPC9zdGVwcmVzdWx0Pg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIGEgcHJvamVjdCBhbmQgdGhlbiBjbGljayA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4uPC9jbWQ+PD9QdWIgQ2FyZXQ/Pg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgd2luZG93LCBjbGljayA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPk92ZXJyaWRlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L3VpY29udHJvbD4gY2hlY2sNCi1ib3guPC9jbWQ+PGluZm8+VGhpcyBjaGVjayBib3ggaXMgYXZhaWxhYmxlIG9ubHkgaWYgeW91IGNoZWNrZWQgdGhlIDx1aWNvbnRyb2w+QWxsb3cNCi1wcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC91aWNvbnRyb2w+IGNoZWNrIGJveCBvbiB0aGUNCi13b3JrYmVuY2ggdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBwYWdlLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBwcmV2ZW50IHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdCwgc2VsZWN0IHRoZSA8dWljb250cm9sPlN1c3BlbmQNCi1hbGwgdmFsaWRhdG9yczwvdWljb250cm9sPiBjaGVjayBib3guPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycywgc2VsZWN0IHRoZSBjaGVjayBib3hlcyBuZXh0IHRvIGVhY2gNCi12YWxpZGF0b3IgeW91IHdhbnQgdG8gdXNlLjwvY21kPjxpbmZvPkVhY2ggdmFsaWRhdG9yIGhhcyBhIGNoZWNrIGJveCB0byBzcGVjaWZ5DQotd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGEgYnVpbGQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nDQotdGhlIGJ1dHRvbiBpbiB0aGUgPHVpY29udHJvbD5TZXR0aW5nczwvdWljb250cm9sPiBjb2x1bW4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5Ob3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjgxNj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0NTYwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIG92ZXJyaWRpbmcgZ2xvYmFsIHByZWZlcmVuY2VzLCBjb2RlIHZhbGlkYXRpb24iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ2YWxpZGF0aW9uLCBvdmVycmlkaW5nIGdsb2JhbCBwcmVmZXJlbmNlcywgY29kZSB2YWxpZGF0aW9uIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0anZhbGdsb2JhbHByZWYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGdsb2JhbHByZWYiPjxhIG5hbWU9InRqdmFsZ2xvYmFscHJlZiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF90YXNrYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+Rm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZQotdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+IDxwIGNsYXNzPSJhbmNob3JfdG9waWN0b3AiIC8+Ci0gPHA+VGhlCi1kZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgYXJlIHNwZWNpZmllZCBnbG9iYWxseSBvbiB0aGUgVmFsaWRhdGlvbiBwYWdlCi1vZiB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nLiBUbyBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBkZWZhdWx0IHZhbGlkYXRpb24KLXByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4gaW4gdGhlIGxlZnQgcGFuZS48L3NwYW4+Ci0gVGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgUHJlZmVyZW5jZXMgd2luZG93IGxpc3RzIHRoZSB2YWxpZGF0b3JzCi1hdmFpbGFibGUgaW4geW91ciBwcm9qZWN0IGFuZCB0aGVpciBzZXR0aW5ncy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZQotc2V0dGluZ3M8L3NwYW4+IGNoZWNrIGJveCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLSBOb3cgaW5kaXZpZHVhbCBwcm9qZWN0cyBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgYSBwcm9qZWN0IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIGxlZnQgcGFuZSBvZiB0aGUgUHJvcGVydGllcyB3aW5kb3csIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9zcGFuPiBjaGVjawotYm94Ljwvc3Bhbj4gVGhpcyBjaGVjayBib3ggaXMgYXZhaWxhYmxlIG9ubHkgaWYgeW91IGNoZWNrZWQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFsbG93Ci1wcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC9zcGFuPiBjaGVjayBib3ggb24gdGhlCi13b3JrYmVuY2ggdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBwYWdlLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gcHJldmVudCB2YWxpZGF0aW9uIGZvciB0aGlzIHByb2plY3QsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3VzcGVuZAotYWxsIHZhbGlkYXRvcnM8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gZWFjaAotdmFsaWRhdG9yIHlvdSB3YW50IHRvIHVzZS48L3NwYW4+IEVhY2ggdmFsaWRhdG9yIGhhcyBhIGNoZWNrIGJveCB0byBzcGVjaWZ5Ci13aGV0aGVyIGl0IGlzIHVzZWQgb24gbWFudWFsIHZhbGlkYXRpb24gb3Igb24gYSBidWlsZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nCi10aGUgYnV0dG9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXR0aW5nczwvc3Bhbj4gY29sdW1uLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci0gTm90IGFsbCB2YWxpZGF0b3JzIGhhdmUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJpZF9wb3N0cmVxIj48cCBjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIiAvPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgaW5kaXZpZHVhbGx5IG9yIGRpc2FibGUgdmFsaWRhdGlvbiBlbnRpcmVseS4gQWxzbywgeW91IGNhbiBzZXQgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgeW91ciBlbnRpcmUgd29ya3NwYWNlIGFuZCBmb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4iPkRpc2FibGluZyB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIgdGl0bGU9IldoZW4geW91IHJ1biBhIG1hbnVhbCB2YWxpZGF0aW9uLCBhbGwgcmVzb3VyY2VzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IGFyZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLiI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGR1cmluZyBtYW51YWwgYW5kIGJ1aWxkIGNvZGUgdmFsaWRhdGlvbi4gWW91IGNhbiBzZXQgZWFjaCB2YWxpZGF0b3IgdG8gcnVuIG9uIG1hbnVhbCB2YWxpZGF0aW9uLCBidWlsZCB2YWxpZGF0aW9uLCBib3RoLCBvciBuZWl0aGVyLiI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIgdGl0bGU9IldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcyBvbiB0aGUgZmlsdGVycyB0aGF0IGFyZSBpbiBwbGFjZSBmb3IgdGhhdCB2YWxpZGF0b3IuIj5UdW5pbmcgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxtYW51YWwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiODAwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0anZhbG1hbnVhbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L3RpdGxlPg0KLTxzaG9ydGRlc2Mgb3V0cHV0Y2xhc3M9ImlkX3Nob3J0ZGVzYyI+V2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbA0KLXJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgdmFsaWRhdGlvbg0KLXNldHRpbmdzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnZhbGlkYXRpb248aW5kZXh0ZXJtPm1hbnVhbDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+Y29kZQ0KLXZhbGlkYXRpb248aW5kZXh0ZXJtPm1hbnVhbDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPiA8cD5UaGUNCi12YWxpZGF0b3JzIHVzZWQgZGVwZW5kIG9uIHRoZSBnbG9iYWwgYW5kIHByb2plY3QgdmFsaWRhdGlvbiBzZXR0aW5ncy4gV2hlbg0KLXlvdSB2YWxpZGF0ZSBhIHByb2plY3QgbWFudWFsbHksIHRoZSBnbG9iYWwgc2V0dGluZ3MgYXJlIHVzZWQgdW5sZXNzIGJvdGgNCi1vZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOjx1bD4NCi08bGk+VGhlIDx1aWNvbnRyb2w+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpcyBzZWxlY3RlZCBvbiB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgcGFnZS48L2xpPg0KLTxsaT5UaGUgPHVpY29udHJvbD5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC91aWNvbnRyb2w+IGNoZWNrIGJveCBpcw0KLXNlbGVjdGVkIG9uIHRoZSBwcm9qZWN0J3MgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBwYWdlLjwvbGk+DQotPC91bD48L3A+PHA+V2hldGhlciB0aGUgd29ya2JlbmNoIHVzZXMgdGhlIGdsb2JhbCBvciBwcm9qZWN0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMsDQotb25seSB0aGUgdmFsaWRhdG9ycyBzZWxlY3RlZCB0byBydW4gb24gbWFudWFsIHZhbGlkYXRpb24gYXJlIHVzZWQgd2hlbiB5b3UNCi1ydW4gYSBtYW51YWwgdmFsaWRhdGlvbi48L3A+PHA+VG8gbWFudWFsbHkgaW52b2tlIGFuIGltbWVkaWF0ZSBjb2RlIHZhbGlkYXRpb24sDQotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczw/UHViIENhcmV0Pz46PC9wPjwvY29udGV4dD4NCi08c3RlcHMgb3V0cHV0Y2xhc3M9ImlkX3N0ZXBzIj4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgcHJvamVjdCB0aGF0IHlvdSB3YW50IHRvIHZhbGlkYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGFuZCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+SWYgdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSwgdmFsaWRhdGlvbiBpcyBkaXNhYmxlZCBvciB0aGVyZSBhcmUNCi1ubyB2YWxpZGF0b3JzIGVuYWJsZWQgZm9yIHRoZSBwcm9qZWN0LiBUbyBlbmFibGUgdmFsaWRhdGlvbiBhdCB0aGUgZ2xvYmFsDQotbGV2ZWwsIHNlZSA8eHJlZiBocmVmPSJ0anZhbC5kaXRhIj48L3hyZWY+LiBUbyBlbmFibGUgdmFsaWRhdG9ycyBmb3IgdGhpcw0KLXByb2plY3QsIHNlZSA8eHJlZiBocmVmPSJ0anZhbGdsb2JhbHByZWYuZGl0YSI+PC94cmVmPi48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdCBvdXRwdXRjbGFzcz0iaWRfcmVzdWx0Ij5UaGUgd29ya2JlbmNoIHZhbGlkYXRlcyB0aGUgcHJvamVjdCB1c2luZw0KLXRoZSBlbmFibGVkIHZhbGlkYXRvcnMuIEFueSBlcnJvcnMgZm91bmQgYnkgdGhlIHZhbGlkYXRvcnMgYXJlIGxpc3RlZCBpbiB0aGUNCi1Qcm9ibGVtcyB2aWV3LjwvcmVzdWx0Pg0KLTxwb3N0cmVxIG91dHB1dGNsYXNzPSJpZF9wb3N0cmVxIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjk2Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxtYW51YWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViYmZkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWFudWFsbHkgdmFsaWRhdGluZyBjb2RlIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4geW91IHJ1biBhIG1hbnVhbCB2YWxpZGF0aW9uLCBhbGwgcmVzb3VyY2VzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IGFyZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy4iIC8+Ci08bWV0YSBjb250ZW50PSJ2YWxpZGF0aW9uLCBtYW51YWwsIGNvZGUgdmFsaWRhdGlvbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIG1hbnVhbCwgY29kZSB2YWxpZGF0aW9uIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnR1bmV2YWxpZGF0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGp2YWxtYW51YWwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdmFsbWFudWFsIj48YSBuYW1lPSJ0anZhbG1hbnVhbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3Rhc2tib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5XaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsCi1yZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbGlkYXRpb24KLXNldHRpbmdzLjwvcD4KLQotPGRpdiBjbGFzcz0iaWRfY29udGV4dCI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY3RvcCIgLz4KLSA8ZGl2IGNsYXNzPSJwIj5UaGUKLXZhbGlkYXRvcnMgdXNlZCBkZXBlbmQgb24gdGhlIGdsb2JhbCBhbmQgcHJvamVjdCB2YWxpZGF0aW9uIHNldHRpbmdzLiBXaGVuCi15b3UgdmFsaWRhdGUgYSBwcm9qZWN0IG1hbnVhbGx5LCB0aGUgZ2xvYmFsIHNldHRpbmdzIGFyZSB1c2VkIHVubGVzcyBib3RoCi1vZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOjx1bD4KLTxsaT5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvc3Bhbj4gY2hlY2sKLWJveCBpcyBzZWxlY3RlZCBvbiB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgcGFnZS48L2xpPgotCi08bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L3NwYW4+IGNoZWNrIGJveCBpcwotc2VsZWN0ZWQgb24gdGhlIHByb2plY3QncyB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIHBhZ2UuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+V2hldGhlciB0aGUgd29ya2JlbmNoIHVzZXMgdGhlIGdsb2JhbCBvciBwcm9qZWN0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMsCi1vbmx5IHRoZSB2YWxpZGF0b3JzIHNlbGVjdGVkIHRvIHJ1biBvbiBtYW51YWwgdmFsaWRhdGlvbiBhcmUgdXNlZCB3aGVuIHlvdQotcnVuIGEgbWFudWFsIHZhbGlkYXRpb24uPC9wPgotPHA+VG8gbWFudWFsbHkgaW52b2tlIGFuIGltbWVkaWF0ZSBjb2RlIHZhbGlkYXRpb24sCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2wgY2xhc3M9ImlkX3N0ZXBzIj4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gdmFsaWRhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgdGhlIHByb2plY3QgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGU8L3NwYW4+Ljwvc3Bhbj4KLSBJZiB0aGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlLCB2YWxpZGF0aW9uIGlzIGRpc2FibGVkIG9yIHRoZXJlIGFyZQotbm8gdmFsaWRhdG9ycyBlbmFibGVkIGZvciB0aGUgcHJvamVjdC4gVG8gZW5hYmxlIHZhbGlkYXRpb24gYXQgdGhlIGdsb2JhbAotbGV2ZWwsIHNlZSA8YSBocmVmPSJ0anZhbC5odG1sIiB0aXRsZT0iVGhlIHdvcmtiZW5jaCBpbmNsdWRlcyB2YWxpZGF0b3JzIHRoYXQmIzEwO2NoZWNrIGNlcnRhaW4gZmlsZXMgaW4geW91ciBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG1vZHVsZSBwcm9qZWN0cyBmb3IgZXJyb3JzLiI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPi4gVG8gZW5hYmxlIHZhbGlkYXRvcnMgZm9yIHRoaXMKLXByb2plY3QsIHNlZSA8YSBocmVmPSJ0anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUmIzEwO3RoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+LjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImlkX3Jlc3VsdCI+VGhlIHdvcmtiZW5jaCB2YWxpZGF0ZXMgdGhlIHByb2plY3QgdXNpbmcKLXRoZSBlbmFibGVkIHZhbGlkYXRvcnMuIEFueSBlcnJvcnMgZm91bmQgYnkgdGhlIHZhbGlkYXRvcnMgYXJlIGxpc3RlZCBpbiB0aGUKLVByb2JsZW1zIHZpZXcuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBpbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciB5b3VyIGVudGlyZSB3b3Jrc3BhY2UgYW5kIGZvciBpbmRpdmlkdWFsIHByb2plY3RzLiI+RGlzYWJsaW5nIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBkdXJpbmcgbWFudWFsIGFuZCBidWlsZCBjb2RlIHZhbGlkYXRpb24uIFlvdSBjYW4gc2V0IGVhY2ggdmFsaWRhdG9yIHRvIHJ1biBvbiBtYW51YWwgdmFsaWRhdGlvbiwgYnVpbGQgdmFsaWRhdGlvbiwgYm90aCwgb3IgbmVpdGhlci4iPlNlbGVjdGluZyBjb2RlIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnR1bmV2YWxpZGF0Lmh0bWwiIHRpdGxlPSJXaGV0aGVyIG9yIG5vdCBhIHZhbGlkYXRvciB2YWxpZGF0ZXMgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24gdGhlIGZpbHRlcnMgdGhhdCBhcmUgaW4gcGxhY2UgZm9yIHRoYXQgdmFsaWRhdG9yLiI+VHVuaW5nIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsc2VsZWN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWU1Y2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGp2YWxzZWxlY3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlIG91dHB1dGNsYXNzPSJpZF90aXRsZSI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5Zb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvDQotcnVuIGR1cmluZyBtYW51YWwgYW5kIGJ1aWxkIGNvZGUgdmFsaWRhdGlvbi4gWW91IGNhbiBzZXQgZWFjaCB2YWxpZGF0b3IgdG8NCi1ydW4gb24gbWFudWFsIHZhbGlkYXRpb24sIGJ1aWxkIHZhbGlkYXRpb24sIGJvdGgsIG9yIG5laXRoZXIuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnZhbGlkYXRpb248aW5kZXh0ZXJtPnNlbGVjdGluZyB2YWxpZGF0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5jb2RlIHZhbGlkYXRpb248aW5kZXh0ZXJtPnNlbGVjdGluZyB2YWxpZGF0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keSBvdXRwdXRjbGFzcz0iaWRfdGFza2JvZHkiPg0KLTxjb250ZXh0IG91dHB1dGNsYXNzPSJpZF9jb250ZXh0Ij48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljdG9wIj48L3A+PHA+VG8NCi1jaG9vc2UgdGhlIHZhbGlkYXRvcnMgdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIGEgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzIG91dHB1dGNsYXNzPSJpZF9zdGVwcyI+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4gaW4gdGhlIGxlZnQgcGFuZS48L2NtZD4NCi08c3RlcHJlc3VsdD5UaGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgbGlzdHMgdGhlIHZhbGlkYXRvcnMNCi1hdmFpbGFibGUgaW4geW91ciBwcm9qZWN0IGFuZCB0aGVpciBzZXR0aW5ncy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xlYXIgdGhlIDx1aWNvbnRyb2w+U3VzcGVuZCBhbGwgdmFsaWRhdG9yczwvdWljb250cm9sPiBjaGVjayBib3guPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPjw/UHViIENhcmV0MT8+SWYgeW91IHdhbnQgdG8gc2V0IGluZGl2aWR1YWwNCi12YWxpZGF0aW9uIHNldHRpbmdzIGZvciBvbmUgb3IgbW9yZSBvZiB5b3VyIHByb2plY3RzLCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+QWxsb3cNCi1wcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC91aWNvbnRyb2w+IGNoZWNrIGJveC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gZWFjaA0KLXZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgYXQgdGhlIGdsb2JhbCBsZXZlbC48L2NtZD48aW5mbz5FYWNoIHZhbGlkYXRvciBoYXMNCi1hIGNoZWNrIGJveCB0byBzcGVjaWZ5IHdoZXRoZXIgaXQgaXMgdXNlZCBvbiBtYW51YWwgdmFsaWRhdGlvbiBvciBvbiBhIGJ1aWxkLjxub3RlPklmDQoteW91IGRlc2VsZWN0IGFueSB2YWxpZGF0b3IgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIGFueSBtZXNzYWdlcyBhc3NvY2lhdGVkDQotd2l0aCB0aGUgZGVzZWxlY3RlZCB2YWxpZGF0b3Igd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHRhc2sgbGlzdCwNCi10aGUgbmV4dCB0aW1lIHlvdSBwZXJmb3JtIGEgZnVsbCBidWlsZC48L25vdGU+PC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlR1bmUgYSB2YWxpZGF0b3IgYnkgY2xpY2tpbmcNCi10aGUgYnV0dG9uIGluIHRoZSA8dWljb250cm9sPlNldHRpbmdzPC91aWNvbnRyb2w+IGNvbHVtbi48L2NtZD4NCi08aW5mbz5Ob3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBhZGRpdGlvbmFsIHNldHRpbmdzLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PklmIHlvdSB3YW50IHRvIHNldCBpbmRpdmlkdWFsIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlDQotb2YgeW91ciBwcm9qZWN0cywgc2VlIDx4cmVmIGhyZWY9InRqdmFsZ2xvYmFscHJlZi5kaXRhIj48L3hyZWY+LiBMaWtlIHRoZQ0KLWdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLCB5b3UgY2FuIHNldCB2YWxpZGF0b3JzIGF0IHRoZSBwcm9qZWN0IGxldmVsDQotdG8gcnVuIG9uIG1hbnVhbCB2YWxpZGF0aW9uLCBidWlsZCB2YWxpZGF0aW9uLCBib3RoLCBvciBuZWl0aGVyLjwvcmVzdWx0Pg0KLTxwb3N0cmVxIG91dHB1dGNsYXNzPSJpZF9wb3N0cmVxIj48cCBvdXRwdXRjbGFzcz0iYW5jaG9yX3RvcGljYm90dG9tIj48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNjg1Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbHNlbGVjdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlNGFhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbHNlbGVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9ycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBkdXJpbmcgbWFudWFsIGFuZCBidWlsZCBjb2RlIHZhbGlkYXRpb24uIFlvdSBjYW4gc2V0IGVhY2ggdmFsaWRhdG9yIHRvIHJ1biBvbiBtYW51YWwgdmFsaWRhdGlvbiwgYnVpbGQgdmFsaWRhdGlvbiwgYm90aCwgb3IgbmVpdGhlci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZHVyaW5nIG1hbnVhbCBhbmQgYnVpbGQgY29kZSB2YWxpZGF0aW9uLiBZb3UgY2FuIHNldCBlYWNoIHZhbGlkYXRvciB0byBydW4gb24gbWFudWFsIHZhbGlkYXRpb24sIGJ1aWxkIHZhbGlkYXRpb24sIGJvdGgsIG9yIG5laXRoZXIuIiAvPgotPG1ldGEgY29udGVudD0idmFsaWRhdGlvbiwgc2VsZWN0aW5nIHZhbGlkYXRvcnMsIGNvZGUgdmFsaWRhdGlvbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIHNlbGVjdGluZyB2YWxpZGF0b3JzLCBjb2RlIHZhbGlkYXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0anZhbHNlbGVjdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlbGVjdGluZyBjb2RlIHZhbGlkYXRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdmFsc2VsZWN0Ij48YSBuYW1lPSJ0anZhbHNlbGVjdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvaDE+Ci0KLQotCi08ZGl2IGNsYXNzPSJpZF90YXNrYm9keSI+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyI+WW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0bwotcnVuIGR1cmluZyBtYW51YWwgYW5kIGJ1aWxkIGNvZGUgdmFsaWRhdGlvbi4gWW91IGNhbiBzZXQgZWFjaCB2YWxpZGF0b3IgdG8KLXJ1biBvbiBtYW51YWwgdmFsaWRhdGlvbiwgYnVpbGQgdmFsaWRhdGlvbiwgYm90aCwgb3IgbmVpdGhlci4gPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9jb250ZXh0Ij48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotPHA+VG8KLWNob29zZSB0aGUgdmFsaWRhdG9ycyB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgYSBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sIGNsYXNzPSJpZF9zdGVwcyI+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+IGluIHRoZSBsZWZ0IHBhbmUuPC9zcGFuPgotIFRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBsaXN0cyB0aGUgdmFsaWRhdG9ycwotYXZhaWxhYmxlIGluIHlvdXIgcHJvamVjdCBhbmQgdGhlaXIgc2V0dGluZ3MuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGVhciB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3VzcGVuZCBhbGwgdmFsaWRhdG9yczwvc3Bhbj4gY2hlY2sgYm94Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IHdhbnQgdG8gc2V0IGluZGl2aWR1YWwKLXZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIG9mIHlvdXIgcHJvamVjdHMsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWxsb3cKLXByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L3NwYW4+IGNoZWNrIGJveC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoCi12YWxpZGF0b3IgeW91IHdhbnQgdG8gdXNlIGF0IHRoZSBnbG9iYWwgbGV2ZWwuPC9zcGFuPiBFYWNoIHZhbGlkYXRvciBoYXMKLWEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGEgYnVpbGQuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmCi15b3UgZGVzZWxlY3QgYW55IHZhbGlkYXRvciB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgYW55IG1lc3NhZ2VzIGFzc29jaWF0ZWQKLXdpdGggdGhlIGRlc2VsZWN0ZWQgdmFsaWRhdG9yIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YXNrIGxpc3QsCi10aGUgbmV4dCB0aW1lIHlvdSBwZXJmb3JtIGEgZnVsbCBidWlsZC48L2Rpdj4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UdW5lIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nCi10aGUgYnV0dG9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXR0aW5nczwvc3Bhbj4gY29sdW1uLjwvc3Bhbj4KLSBOb3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBhZGRpdGlvbmFsIHNldHRpbmdzLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPklmIHlvdSB3YW50IHRvIHNldCBpbmRpdmlkdWFsIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlCi1vZiB5b3VyIHByb2plY3RzLCBzZWUgPGEgaHJlZj0idGp2YWxnbG9iYWxwcmVmLmh0bWwiIHRpdGxlPSJGb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlJiMxMDt0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIj5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9hPi4gTGlrZSB0aGUKLWdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLCB5b3UgY2FuIHNldCB2YWxpZGF0b3JzIGF0IHRoZSBwcm9qZWN0IGxldmVsCi10byBydW4gb24gbWFudWFsIHZhbGlkYXRpb24sIGJ1aWxkIHZhbGlkYXRpb24sIGJvdGgsIG9yIG5laXRoZXIuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImlkX3Bvc3RyZXEiPjxwIGNsYXNzPSJhbmNob3JfdG9waWNib3R0b20iIC8+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBpbmRpdmlkdWFsbHkgb3IgZGlzYWJsZSB2YWxpZGF0aW9uIGVudGlyZWx5LiBBbHNvLCB5b3UgY2FuIHNldCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciB5b3VyIGVudGlyZSB3b3Jrc3BhY2UgYW5kIGZvciBpbmRpdmlkdWFsIHByb2plY3RzLiI+RGlzYWJsaW5nIHZhbGlkYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgdGl0bGU9IkZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIgdGl0bGU9IldoZXRoZXIgb3Igbm90IGEgdmFsaWRhdG9yIHZhbGlkYXRlcyBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcyBvbiB0aGUgZmlsdGVycyB0aGF0IGFyZSBpbiBwbGFjZSBmb3IgdGhhdCB2YWxpZGF0b3IuIj5UdW5pbmcgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZpZXdmaWx0ZXJzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZpZXdmaWx0ZXJzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmNjNmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2aWV3ZmlsdGVycy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJjanZpZXdmaWx0ZXJzQ2FpdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgaWQ9ImlkX3RpdGxlIj5GaWx0ZXJpbmcgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5Zb3UgY2FuIGZpbHRlciB0aGUgUHJvamVjdCBFeHBsb3Jlcg0KLXZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmZpbHRlcnM8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dmlld3M8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgZmlsdGVyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cHJvamVjdHM8aW5kZXh0ZXJtPmZpbHRlcmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHkgb3V0cHV0Y2xhc3M9ImlkX3Rhc2tib2R5Ij4NCi08Y29udGV4dCBvdXRwdXRjbGFzcz0iaWRfY29udGV4dCI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY3RvcCI+PC9wPjxwPlRvDQotZW5hYmxlIG9yIGRpc2FibGUgZmlsdGVycywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgU2VsZWN0IENvbW1vbiBOYXZpZ2F0b3IgRmlsdGVycyB3aW5kb3cgYnkgc2VsZWN0aW5nIDx1aWNvbnRyb2w+Q3VzdG9taXplDQotVmlldy4uLjwvdWljb250cm9sPiBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBhdCB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUNCi12aWV3LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5PbiB0aGUgPHVpY29udHJvbD5GaWx0ZXJzPC91aWNvbnRyb2w+IHRhYiwgc2VsZWN0IHRoZSBjaGVjayBib3hlcw0KLW5leHQgdG8gdGhlIGZpbHRlcnMgeW91IHdhbnQgdG8gZW5hYmxlLjwvY21kPjxpbmZvPiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgPHVpY29udHJvbD5DbG9zZWQNCi1wcm9qZWN0czwvdWljb250cm9sPiBmaWx0ZXIgaXMgZW5hYmxlZCwgY2xvc2VkIHByb2plY3RzIGFyZSBub3Qgc2hvd24gaW4gdGhlDQotUHJvamVjdCBFeHBsb3JlciB2aWV3LiBPdGhlciBmaWx0ZXJzIGNhbiBoaWRlIGVtcHR5IHBhY2thZ2VzLCBub24tamF2YSBmaWxlcywNCi1hbmQgZmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5jbGFzcyIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPk9uIHRoZSA8dWljb250cm9sPkNvbnRlbnQ8L3VpY29udHJvbD4gdGFiLCB0aGUgZmlsdGVycyB3b3JrIGluDQotdGhlIG9wcG9zaXRlIHdheTogdGhlIHNlbGVjdGVkIGNoZWNrIGJveGVzIGRlc2NyaWJlIHRoZSBwcm9qZWN0cywgZm9sZGVycywNCi1hbmQgZmlsZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy4gU2VsZWN0IHRoZSBjaGVjayBib3hlcw0KLW5leHQgdG8gdGhlIGZpbHRlcnMgeW91IHdhbnQgdG8gaGlkZS48L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyDQotdGhlIGNoZWNrIGJveCBuZXh0IHRvIDx1aWNvbnRyb2w+SjJFRSBFSkIgRGVwbG95bWVudCBEZXNjcmlwdG9yczwvdWljb250cm9sPiwNCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUgaGlkZGVuIGZyb20gZWFjaCBwcm9qZWN0IGluIHRoZSB2aWV3LjwvaW5mbz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcSBvdXRwdXRjbGFzcz0iaWRfcG9zdHJlcSI+PHAgb3V0cHV0Y2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSI+PC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZpZXdmaWx0ZXJzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZpZXdmaWx0ZXJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODhlMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2aWV3ZmlsdGVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRmlsdGVyaW5nIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBmaWx0ZXIgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyB0byBoaWRlIHByb2plY3RzLCBmb2xkZXJzLCBvciBmaWxlcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBzZWUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZmlsdGVyIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgdG8gaGlkZSBwcm9qZWN0cywgZm9sZGVycywgb3IgZmlsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gc2VlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZpbHRlcnMsIFByb2plY3QgRXhwbG9yZXIgdmlldywgdmlld3MsIFByb2plY3QgRXhwbG9yZXIgZmlsdGVycywgcHJvamVjdHMsIGZpbHRlcmluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZpbHRlcnMsIFByb2plY3QgRXhwbG9yZXIgdmlldywgdmlld3MsIFByb2plY3QgRXhwbG9yZXIgZmlsdGVycywgcHJvamVjdHMsIGZpbHRlcmluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9janZpZXcuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjanZpZXdmaWx0ZXJzQ2FpdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkZpbHRlcmluZyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjanZpZXdmaWx0ZXJzQ2FpdCI+PGEgbmFtZT0iY2p2aWV3ZmlsdGVyc0NhaXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkZpbHRlcmluZyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC9oMT4KLQotCi0KLTxkaXYgY2xhc3M9ImlkX3Rhc2tib2R5Ij48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIj5Zb3UgY2FuIGZpbHRlciB0aGUgUHJvamVjdCBFeHBsb3JlcgotdmlldyB0byBoaWRlIHByb2plY3RzLCBmb2xkZXJzLCBvciBmaWxlcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBzZWUuPC9wPgotCi08ZGl2IGNsYXNzPSJpZF9jb250ZXh0Ij48cCBjbGFzcz0iYW5jaG9yX3RvcGljdG9wIiAvPgotPHA+VG8KLWVuYWJsZSBvciBkaXNhYmxlIGZpbHRlcnMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBTZWxlY3QgQ29tbW9uIE5hdmlnYXRvciBGaWx0ZXJzIHdpbmRvdyBieSBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VzdG9taXplCi1WaWV3Li4uPC9zcGFuPiBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBhdCB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUKLXZpZXcuIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXJzPC9zcGFuPiB0YWIsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMKLW5leHQgdG8gdGhlIGZpbHRlcnMgeW91IHdhbnQgdG8gZW5hYmxlLjwvc3Bhbj4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbG9zZWQKLXByb2plY3RzPC9zcGFuPiBmaWx0ZXIgaXMgZW5hYmxlZCwgY2xvc2VkIHByb2plY3RzIGFyZSBub3Qgc2hvd24gaW4gdGhlCi1Qcm9qZWN0IEV4cGxvcmVyIHZpZXcuIE90aGVyIGZpbHRlcnMgY2FuIGhpZGUgZW1wdHkgcGFja2FnZXMsIG5vbi1qYXZhIGZpbGVzLAotYW5kIGZpbGVzIHdpdGggbmFtZXMgZW5kaW5nIGluICIuY2xhc3MiLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQ8L3NwYW4+IHRhYiwgdGhlIGZpbHRlcnMgd29yayBpbgotdGhlIG9wcG9zaXRlIHdheTogdGhlIHNlbGVjdGVkIGNoZWNrIGJveGVzIGRlc2NyaWJlIHRoZSBwcm9qZWN0cywgZm9sZGVycywKLWFuZCBmaWxlcyB0aGF0IGFyZSBzaG93biBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LiBTZWxlY3QgdGhlIGNoZWNrIGJveGVzCi1uZXh0IHRvIHRoZSBmaWx0ZXJzIHlvdSB3YW50IHRvIGhpZGUuPC9zcGFuPiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyCi10aGUgY2hlY2sgYm94IG5leHQgdG8gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SjJFRSBFSkIgRGVwbG95bWVudCBEZXNjcmlwdG9yczwvc3Bhbj4sCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUgaGlkZGVuIGZyb20gZWFjaCBwcm9qZWN0IGluIHRoZSB2aWV3LgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iaWRfcG9zdHJlcSI+PHAgY2xhc3M9ImFuY2hvcl90b3BpY2JvdHRvbSIgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9janZpZXcuaHRtbCIgdGl0bGU9IldoaWxlIGRldmVsb3BpbmcgSjJFRSBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgaXMgeW91ciBtYWluIHZpZXcgb2YgeW91ciBKMkVFIHByb2plY3RzIGFuZCByZXNvdXJjZXMuIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgaW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ViOGM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRUpCQ3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRUpCQ3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzQ1ODguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0VKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQotPCEtLSBQYWdlIDEsIENyZWF0ZSBhbiBFbnRlcnByaXNlIEJlYW4gIC0tPgotPGNvbnRleHQgaWQ9ImFudGVqYjAwMDAiIHRpdGxlPSJDcmVhdGUgYW4gRW50ZXJwcmlzZSBCZWFuIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZW50ZXJwcmlzZSBiZWFuIHR5cGU6IHNlc3Npb24gYmVhbiwgbWVzc2FnZS1kcml2ZW4gYmVhbiwgb3IgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5IGJlYW4uCi0KLVlvdSBtdXN0IGluc3RhbGwgYW5kIGVuYWJsZSBYRG9jbGV0IGJlZm9yZSBjcmVhdGluZyBhbiBlbnRpdHkgYmVhbi4gQ29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczoKLTEgLSBEb3dubG9hZCBhbmQgaW5zdGFsbCBYRG9jbGV0IGZyb20gaHR0cDovL3hkb2NsZXQuc291cmNlZm9yZ2UubmV0L3hkb2NsZXQvaW5zdGFsbC5odG1sCi0yIC0gQ2xpY2sgdGhlIDxiPnByZWZlcmVuY2VzPC9iPiBsaW5rIGluIHRoZSB3aXphcmQgdG8gY29uZmlndXJlIHRoZSBYRG9jbGV0IFJ1bnRpbWUgUHJlZmVyZW5jZXMuIEFub3RoZXIgd2F5IHRvIGdldCB0byB0aGUgWERvY2xldCBSdW50aW1lIFByZWZlcmVuY2VzIHBhZ2UgaXMgZnJvbSA8Yj5XaW5kb3cgPiBQcmVmZXJlbmNlcyA+IFhEb2NsZXQ8L2I+LgotMyAtIENoZWNrIHRoZSA8Yj5FbmFibGUgWERvY2xldCBCdWlsZGVyPC9iPiBjaGVjayBib3guCi00IC0gU2VsZWN0IHRoZSB2ZXJzaW9uIG9mIFhEb2NsZXQgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQuCi01IC0gVXNlIHRoZSBCcm93c2UgYnV0dG9uIHRvIGxvY2F0ZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgWERvY2xldCAoPGI+WERvY2xldCBIb21lPC9iPikuCi02IC0gQ2xpY2sgPGI+T0s8L2I+IHRvIHNhdmUgdGhlIHByZWZlcmVuY2VzLgotCi1BZnRlciBpbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBYRG9jbGV0LCBzZWxlY3QgdGhlIGJlYW4gdHlwZSB5b3Ugd2FudCB0byBjcmVhdGUgYW5kIGNsaWNrIDxiPk5leHQ8L2I+LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW50ZXJwcmlzZSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgc2Vzc2lvbiBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVzZXNzYi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVlbnRpdHliLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgbWVzc2FnZS1kcml2ZW4gYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlbWVzc2IuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDb25maWd1cmluZyBYRG9jbGV0IGFubm90YXRpb24gc3VwcG9ydCIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdHhkb2NsZXRjb25mLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRUpCIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvY2VhcmNoLmh0bWwiLz4KLTwhLS0gbGluayB0byBvcmcuZWNsaXBzZS5qc3QuYW5ub3RhdGlvbi51c2VyLmRvYyAgYW5ub3RhdGlvbiB0YWdnaW5nIC0tPgotPC9jb250ZXh0PgotCi08IS0tIFBhZ2UgMiwgRW50ZXJwcmlzZSBCZWFuIGNsYXNzIGZpbGUgZGVmaW5pdGlvbiAtLT4KLTxjb250ZXh0IGlkPSJhbnRlamIxMTAwIj4KLTxkZXNjcmlwdGlvbj5FbnRlciB0aGUgPGI+UHJvamVjdDwvYj4sIDxiPk1vZHVsZSBOYW1lPC9iPiwgYW5kIHdvcmtzcGFjZSA8Yj5Gb2xkZXI8L2I+IGZvciB0aGUgbmV3IGVudGVycHJpc2UgYmVhbi4KLQotRW50ZXIgdGhlIDxiPkphdmEgcGFja2FnZTwvYj4gYW5kIDxiPkNsYXNzIG5hbWU8L2I+IGZvciB0aGUgbmV3IGVudGVycHJpc2UgYmVhbi4gCi1DaGFuZ2UgdGhlIDxiPlN1cGVyY2xhc3M8L2I+IGlmIHlvdXIgY2xhc3Mgd2lsbCBvdmVycmlkZSBhIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdC4KLQotPCEtLSBTZWxlY3QgdGhlIDxiPkdlbmVyYXRlIGFuIGFubm90YXRlZCBiZWFuIGNsYXNzPC9iPiBjaGVjayBib3ggdG8gYWRkIEoyRUUgYW5ub3RhdGlvbnMgdG8gdGhlIHNvdXJjZSBmaWxlLiAtLT4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGVudGVycHJpc2UgYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydHByby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHNlc3Npb24gYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3Rlc2Vzc2IuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlZW50aXR5Yi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIG1lc3NhZ2UtZHJpdmVuIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZW1lc3NiLmh0bWwiLz4KLTwhLS0gbGluayB0byBvcmcuZWNsaXBzZS5qc3QuYW5ub3RhdGlvbi51c2VyLmRvYyAgYW5ub3RhdGlvbiB0YWdnaW5nIC0tPgotPC9jb250ZXh0PgotCi08IS0tIFBhZ2UgMywgRW50ZXJwcmlzZSBCZWFuIGRldGFpbHMgLS0+Ci08Y29udGV4dCBpZD0iYW50ZWpiMTAwMCI+Ci08ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgRUpCLCBKTkRJIGFuZCBEaXNwbGF5IG5hbWVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuLiAKLVRoZSA8Yj5FSkIgbmFtZTwvYj4gaXMgdGhlIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcy4KLVRoZSA8Yj5KTkRJIG5hbWU8L2I+IGlzIGEgbG9naWNhbCBuYW1lIHVzZWQgYnkgdGhlIHNlcnZlciB0byBsb2NhdGUgYW4gZW50ZXJwcmlzZSBiZWFuIGF0IHJ1bnRpbWUuCi1UaGUgPGI+RGlzcGxheSBuYW1lPC9iPiBpcyBhIHNob3J0IG5hbWUgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4gdGhhdCBpcyB1c2VkIGJ5IHRvb2xzLgotCi1PcHRpb25hbGx5LCBwcm92aWRlIGEgdGV4dCA8Yj5EZXNjcmlwdGlvbjwvYj4gb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcy4KLQotU2VsZWN0IHRoZSA8Yj5TdGF0ZSBUeXBlPC9iPiAoc3RhdGVsZXNzIG9yIHN0YXRlZnVsKSBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgc2Vzc2lvbiBiZWFuLgotQSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4gbWFpbnRhaW5zIGNsaWVudC1zcGVjaWZpYyBzZXNzaW9uIGluZm9ybWF0aW9uLCBvciBjb252ZXJzYXRpb25hbCBzdGF0ZSwgYWNyb3NzIG11bHRpcGxlIG1ldGhvZCBjYWxscyBhbmQgdHJhbnNhY3Rpb25zLgotQSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIGRvZXMgbm90IG1haW50YWluIGNvbnZlcnNhdGlvbmFsIHN0YXRlLgotCi1TZWxlY3QgdGhlIDxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+IChjb250YWluZXIgb3IgYmVhbikgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4uIFRoaXMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBvciB0aGUgYmVhbiB3aWxsIGhhbmRsZSB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGVudGVycHJpc2UgYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydHByby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHNlc3Npb24gYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3Rlc2Vzc2IuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlZW50aXR5Yi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIG1lc3NhZ2UtZHJpdmVuIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZW1lc3NiLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPCEtLSBQYWdlIDQsIEVudGVycHJpc2UgQmVhbiBtb2RpZmllcnMsIGludGVyZmFjZXMgYW5kIG1ldGhvZCBzdHVicyAtLT4KLTxjb250ZXh0IGlkPSJhbnRlamIxMjAwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHR5cGUgb2YgPGI+TW9kaWZpZXJzPC9iPiBmb3IgdGhlIGJlYW4gY2xhc3MuCi0KLVNlbGVjdCB0aGUgPGI+SW50ZXJmYWNlczwvYj4gdGhhdCB5b3VyIGJlYW4gY2xhc3Mgd2lsbCBpbXBsZW1lbnQuIFVzZSB0aGUgPGI+QWRkPC9iPiBhbmQgPGI+UmVtb3ZlPC9iPiBidXR0b25zIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLgotCi1TZWxlY3Qgd2hpY2ggbWV0aG9kIHN0dWJzIHlvdSB3YW50IGNyZWF0ZWQgaW4gdGhlIGJlYW4gY2xhc3MuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbnRlcnByaXNlIGJlYW5zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBFSkIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRwcm8uaHRtbCIvPgotPC9jb250ZXh0PgotCi0KLQotIAotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRXhwb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRXhwb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjI1NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0V4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJBUFBDTElFTlRfRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBleHBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaW50byBhIEpBUiBmaWxlLiAgU2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgSkFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgSkFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amV4cGFwcC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amFwcHByb2ouaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUFSX0VYUE9SVF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZS4gU2VsZWN0IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgdG8gZXhwb3J0LCBhbmQgcHJvdmlkZSBhIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgZm9yIHRoZSBleHBvcnRlZCBFQVIgZmlsZS4KLQotU2VsZWN0IDxiPkV4cG9ydCBzb3VyY2UgZmlsZXM8L2I+IHRvIGluY2x1ZGUgc291cmNlIGZpbGVzIGluIHRoZSBFQVIgZmlsZS4gCi0KLVNlbGVjdCA8Yj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZTwvYj4gdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amV4cGVhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGplYXIuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUpCX0VYUE9SVF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhbiBFSkIgbW9kdWxlIGludG8gYSBKQVIgZmlsZS4gU2VsZWN0IHRoZSBFSkIgbW9kdWxlIHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgSkFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgSkFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIEVKQiBKQVIgZmlsZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvdGVleHAuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBFSkIgSkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlaW1wLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRVhQT1JUX1JBUl9XSVpBUkRfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGV4cG9ydCBhIGNvbm5lY3RvciBwcm9qZWN0IGludG8gYSBSQVIgZmlsZS4gIFNlbGVjdCB0aGUgY29ubmVjdG9yIHByb2plY3QgdG8gZXhwb3J0LCBhbmQgcHJvdmlkZSBhIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgZm9yIHRoZSBleHBvcnRlZCBSQVIgZmlsZS4KLQotU2VsZWN0IDxiPkV4cG9ydCBzb3VyY2UgZmlsZXM8L2I+IHRvIGluY2x1ZGUgc291cmNlIGZpbGVzIGluIHRoZSBSQVIgZmlsZS4gCi0KLVNlbGVjdCA8Yj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZTwvYj4gdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkV4cG9ydGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IHRvIGEgUkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL3RvcGljcy90amV4cHJhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZS5kb2MvdG9waWNzL3RqcmFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTNmYzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0ltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJBUFBDTElFTlRfSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlLiBMb2NhdGUgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBwcm9qZWN0IG5hbWUgcHJvdmlkZWQuCi0KLVVzZSB0aGUgPGI+VGFyZ2V0IHJ1bnRpbWVzPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB0aGUgaW1wb3J0ZWQgcHJvamVjdCB3aWxsIGJlIGRldmVsb3BlZCBmb3IuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGltcG9ydGVkIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBDaG9vc2UgYW4gZXhpc3RpbmcgcHJvamVjdCBvciB1c2UgdGhlIDxiPk5ldzwvYj4gYnV0dG9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0LgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGppbXBhcHAuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGphcHBwcm9qLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRUFSX0lNUE9SVF9FQVJfV0laQVJEX1BBR0UxIj4KLSAgICA8IS0tIHdpemFyZCBicm9rZW4gYXQgdGltZSBvZiB0aGlzIHdyaXRpbmcgLS0+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGltcG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlLiAgTG9jYXRlIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlIG9uIHlvdXIgZmlsZSBzeXN0ZW0gdXNpbmcgdGhlIDxiPkJyb3dzZTwvYj4gYnV0dG9uLiBPcHRpb25hbGx5LCBtb2RpZnkgdGhlIHByb2plY3QgbmFtZSBwcm92aWRlZC4KLQotVXNlIHRoZSA8Yj5UYXJnZXQgcnVudGltZXM8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSByZXN1bHRpbmcgcHJvamVjdHMgd2lsbCBiZSBkZXZlbG9wZWQgZm9yLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGppbXBlYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi0KLTxjb250ZXh0IGlkPSJFSkJfSU1QT1JUX0VKQl9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYW4gRUpCIEpBUiBmaWxlLiBMb2NhdGUgdGhlIEVKQiBKQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBtb2R1bGUgbmFtZSBwcm92aWRlZC4KLQotVXNlIHRoZSA8Yj5UYXJnZXQgcnVudGltZXM8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSBpbXBvcnRlZCBwcm9qZWN0IHdpbGwgYmUgZGV2ZWxvcGVkIGZvci4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGUgaW1wb3J0ZWQgRUpCIG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENob29zZSBhbiBleGlzdGluZyBwcm9qZWN0IG9yIHVzZSB0aGUgPGI+TmV3PC9iPiBidXR0b24gdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYW4gRUpCIEpBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWltcC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlY3J0cHJvLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSU1QT1JUX1JBUl9XSVpBUkRfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGltcG9ydCBhIEpDQSBDb25uZWN0b3IgUkFSIGZpbGUuIExvY2F0ZSB0aGUgQ29ubmVjdG9yIFJBUiBmaWxlIG9uIHlvdXIgZmlsZSBzeXN0ZW0gdXNpbmcgdGhlIDxiPkJyb3dzZTwvYj4gYnV0dG9uLiBPcHRpb25hbGx5LCBtb2RpZnkgdGhlIG1vZHVsZSBuYW1lIHByb3ZpZGVkLgotCi1Vc2UgdGhlIDxiPlRhcmdldCBydW50aW1lczwvYj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgYXBwbGljYXRpb24gc2VydmVyIHRoYXQgdGhlIGltcG9ydGVkIHByb2plY3Qgd2lsbCBiZSBkZXZlbG9wZWQgZm9yLiAKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdG8gYWRkIHRoZSBpbXBvcnRlZCBjb25uZWN0b3IgbW9kdWxlIHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gQ2hvb3NlIGFuIGV4aXN0aW5nIHByb2plY3Qgb3IgdXNlIHRoZSA8Yj5OZXc8L2I+IGJ1dHRvbiB0byBjcmVhdGUgYSBuZXcgcHJvamVjdC4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IFJBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlLmRvYy90b3BpY3MvdGppbXByYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL2htdGwvdGpyYXIuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0oyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSjJFRUdlbmVyYWxfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiZDUzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSjJFRUdlbmVyYWxfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY29tLmlibS53dHAudWkuUHJvamVjdE5hdmlnYXRvciI+Ci08ZGVzY3JpcHRpb24+VGhlIEoyRUUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIGEgaGllcmFyY2hpY2FsIHZpZXcgb2YgdGhlIGNvbnRlbnQgbW9kZWxzIGZvciByZXNvdXJjZXMgaW4gdGhlIHdvcmtiZW5jaC4gRnJvbSB0aGlzIHZpZXcsIHlvdSBjYW4gb3BlbiB0aGUgdmFyaW91cyBwcm9qZWN0IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IuIAotCi1CeSByaWdodC1jbGlja2luZyBvbiBtb2R1bGVzLCB5b3UgY2FuIGFjY2VzcyB0aGUgcG9wLXVwIGNvbnRleHQgbWVudSBmb3IgYWRkaXRpb25hbCBkZXZlbG9wbWVudCBvcHRpb25zLgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iSjJFRSBIaWVyYXJjaHkgYW5kIFByb2plY3QgTmF2aWdhdG9yIHZpZXdzIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvY2p2aWV3Lmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIHBlcnNwZWN0aXZlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvY2pwZXJzLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI1YzkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiNmU0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08IS0tRWNsaXBzZSBwcmVmZXJlbmNlcyAtLT4KLQotPGNvbnRleHQgaWQ9IkZsZXhpYmxlUHJvamVjdCI+Ci0JPCEtLSBGbGV4aWJsZSBKYXZhIFByb2plY3QgIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IDxiPkFsbG93IE11bHRpcGxlIG1vZHVsZXMgcGVyIHByb2plY3Q8L2I+IHRvIGFsbG93IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gKEVBUikgcHJvamVjdCB0byBjb250YWluIG1vcmUgdGhhbiBvbmUgbW9kdWxlCi1vZiBhIHBhcnRpY3VsYXIgdHlwZS4gRm9yIGluc3RhbmNlLCBtb3JlIHRoYW4gb25lIEFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUuIAotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbGlua3MgdG8gRmxleGlibGUgamF2YSBwcm9qZWN0IHN0dWZmLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSjJFRUFubm90YXRpb25zX1BBR0UxIj4KLQk8IS0tIEoyRUUgQW5ub3RhdGlvbnMgIHByZWZlcmVuY2VzIG1haW4tLT4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIEoyRUUgQW5ub3RhdGlvbiBQcm92aWRlciAgdG8gdXNlLiAKLQotSjJFRSBBbm5vdGF0aW9ucyBhbGxvdyBwcm9ncmFtbWVycyB0byBhZGQgc3BlY2lhbGl6ZWQgSmF2YWRvYyB0YWdzIHRvIHRoZWlyIHNvdXJjZSBjb2RlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIGFydGlmYWN0cyBmcm9tIHRlbXBsYXRlcy4KLTwvZGVzY3JpcHRpb24+Ci08IS0tIGxpbmtzIHRvIGFubm90YXRpb24gc3R1ZmYgKFhEb2NsZXQgYW5kIGVqYmRvY2xldCwgYW5kIGdlbmVyaWMgaW5mbykgLS0+Ci08IS0tIGh0dHA6Ly94ZG9jbGV0LnNvdXJjZWZvcmdlLm5ldC94ZG9jbGV0L2luZGV4Lmh0bWwgLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iSjJFRUFubm90YXRpb25zX1BBR0UyIj4KLQk8IS0tIEoyRUUgQW5ub3RhdGlvbnMgIHByZWZlcmVuY2VzIFhEb2NsZXQtLT4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNldCB0aGUgWERvY2xldCBydW50aW1lIHByZWZlcmVuY2VzLiBYRG9jbGV0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBsb2NhbCBzeXN0ZW0gdG8gdXNlIHRoaXMgZnVuY3Rpb24uCi0KLVNlbGVjdCA8Yj5FbmFibGUgWERvY2xldCBCdWlsZGVyPC9iPiB0byB0dXJuIG9uIGFubm90YXRpb24tYmFzZWQgYXJ0aWZhY3QgY3JlYXRpb24uCi0KLVNlbGVjdCB0aGUgPGI+VmVyc2lvbjwvYj4gb2YgWERvY2xldC4gU3VwcG9ydGVkIHZlcnNpb25zIGluY2x1ZGUgMS4yLjEsIDEuMi4yLCAxLjIuMzsgWERvY2xldCB2ZXJzaW9uIDEuMS4yIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLVByb3ZpZGUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKDxiPlhEb2NsZXQgSG9tZTwvYj4pIGZvciBYRG9jbGV0IG9uIHRoZSBsb2NhbCBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBsaW5rcyB0byBhbm5vdGF0aW9uIHN0dWZmIChYRG9jbGV0IGFuZCBlamJkb2NsZXQsIGFuZCBnZW5lcmljIGluZm8pIC0tPgotPCEtLSBodHRwOi8veGRvY2xldC5zb3VyY2Vmb3JnZS5uZXQveGRvY2xldC9pbmRleC5odG1sIC0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkoyRUVBbm5vdGF0aW9uc19QQUdFMyI+Ci0JPCEtLSBKMkVFIEFubm90YXRpb25zICBwcmVmZXJlbmNlcyBlamJkb2NsZXQtLT4KLTxkZXNjcmlwdGlvbj5FamJkb2NsZXQgaXMgYSBzdWJzZXQgb2YgdGhlIFhEb2NsZXQgc3BlY2lmaWNhdGlvbiB0aGF0IHNwZWNpZmllcyBkZXRhaWxzIG9uIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotVGhlIHN5bnRheCBvZiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGRpZmZlcnMsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIG9mICB0aGUgQXBwbGljYXRpb24gU2VydmVyIGJlaW5nIHVzZWQuIAotCi1Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSB3aGljaCBBcHBsaWNhdGlvbiBTZXJ2ZXIgdmVuZG9ycyB0byBzdXBwb3J0LiBZb3UgY2FuIHNlbGVjdCBvbmUgb3IgbW9yZSBBcHBsaWNhdGlvbiBTZXJ2ZXIKLXZlbmRvcnMsIGluY2x1ZGluZyBKQm9zcywgSk9uQVMsIFdlYkxvZ2ljLCBhbmQgV2ViU3BoZXJlLiBBbHNvIHNlbGVjdCB0aGUgdmVyc2lvbiBvZiB0aGUgQXBwbGljYXRpb24gU2VydmVyIHRvIHN1cHBvcnQuCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBsaW5rcyB0byBhbm5vdGF0aW9uIHN0dWZmIChYRG9jbGV0IGFuZCBlamJkb2NsZXQsIGFuZCBnZW5lcmljIGluZm8pIC0tPgotPCEtLWh0dHA6Ly94ZG9jbGV0LnNvdXJjZWZvcmdlLm5ldC94ZG9jbGV0L2FudC94ZG9jbGV0L21vZHVsZXMvZWpiL0VqYkRvY2xldFRhc2suaHRtbCAtLT4KLTwhLS0gaHR0cDovL3d3dy5qYm9zcy5vcmctLT4KLTwhLS0gaHR0cDovL2pvbmFzLm9iamVjdHdlYi5vcmcvLS0+Ci08IS0tIGh0dHA6L3d3dy5iZWEuY29tLS0+Ci08IS0tIGh0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS93ZWJzcGhlcmUvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi0KLQotPC9jb250ZXh0cz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjljZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1Byb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciIgdGl0bGU9IlByb2plY3QgY3JlYXRpb24gd2l6YXJkcyI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IkFQUENMSUVOVF9ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMSIgdGl0bGU9Ik5ldyBhcHBsaWNhdGlvbiBjbGllbnQiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBjcmVhdGUgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QuCi0KLU9uIHRoaXMgcGFnZSwgbmFtZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIHNlbGVjdCB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwcm9qZWN0IGZpbGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IGEgdGFyZ2V0IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0IGFuZCBhZGQgdGhlIHByb2plY3QgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LgotCi1DbGljayB0aGUgPGI+TW9kaWZ5PC9iPiBidXR0b24gdW5kZXIgQ29uZmlndXJhdGlvbiB0byBlZGl0IHRoZSBmYWNldHMgYW5kIHJ1bnRpbWVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBvciBzdXBwb3J0ZWQgYnkgdGhlIHByb2plY3QuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbCIgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCIgbGFiZWw9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyIvPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphcHBwcm9qLmh0bWwiIGxhYmVsPSJDcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IkFQUENMSUVOVF9ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMyIgdGl0bGU9Ik5ldyBhcHBsaWNhdGlvbiBjbGllbnQiPgotPGRlc2NyaXB0aW9uPkluIHRoZSA8Yj5Tb3VyY2UgRm9sZGVyPC9iPiBmaWVsZCwgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGZvbGRlciB0byB1c2UgZm9yIHNvdXJjZSBjb2RlLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBkZWZhdWx0IGNsYXNzIGZvciB0aGUgbW9kdWxlLCBzZWxlY3QgdGhlIDxiPkNyZWF0ZSBhIGRlZmF1bHQgTWFpbiBjbGFzczwvYj4gY2hlY2sgYm94LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBmaWx0ZXI9InBsdWdpbj1vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXJjaC5odG1sIiBsYWJlbD0iSjJFRSBhcmNoaXRlY3R1cmUiLz4KLTx0b3BpYyBmaWx0ZXI9InBsdWdpbj1vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIiBsYWJlbD0iQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFwcHByb2ouaHRtbCIgbGFiZWw9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUFSX05FV19FQVJfV0laQVJEX1BBR0UxIiB0aXRsZT0iTmV3IEVBUiI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QuIEFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0aWVzIHRvZ2V0aGVyIG9uZSBvciBtb3JlIEoyRUUgbW9kdWxlcywgaW5jbHVkaW5nIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLCBFSkIgbW9kdWxlcywgQ29ubmVjdG9yIG1vZHVsZXMsIG9yIFdlYiBtb2R1bGVzLgotCi1PbiB0aGlzIHBhZ2UsIG5hbWUgdGhlIEVBUiBhcHBsaWNhdGlvbiBwcm9qZWN0IGFuZCBzZWxlY3QgdGhlIHdvcmtzcGFjZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcHJvamVjdCBmaWxlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCBhIHRhcmdldCBydW50aW1lIGFuZCBhIGNvbW1vbiBjb25maWd1cmF0aW9uIGZvciB0aGUgcHJvamVjdC4KLQotQ2xpY2sgdGhlIDxiPk1vZGlmeTwvYj4gYnV0dG9uIHVuZGVyIENvbmZpZ3VyYXRpb24gdG8gZWRpdCB0aGUgZmFjZXRzIGFuZCBydW50aW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gb3Igc3VwcG9ydGVkIGJ5IHRoZSBwcm9qZWN0LgotCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwiIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIvPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2plYXJwcm9qLmh0bWwiIGxhYmVsPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iTkVXX0VBUl9DT01QX1BBR0UiPgotPCEtLSBUaGlzIHBhZ2UgaXMgbm8gbG9uZ2VyIHVzZWQgLS0+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZhY2V0cyB0aGUgcHJvamVjdCB3aWxsIGhhdmUgYW5kIHRoZSBydW50aW1lcyB0aGUgcHJvamVjdCB3aWxsIHN1cHBvcnQuCi0KLVNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgdW5kZXIgPGI+UHJvamVjdCBGYWNldDwvYj4gdG8gc2VsZWN0IHRoZSBmYWNldHMgdGhhdCB0aGUgcHJvamVjdCB3aWxsIGhhdmUuIFlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQgdmVyc2lvbiBsZXZlbCBvZiBlYWNoIGZhY2V0LgotCi1UbyBzZWUgdGhlIHJ1bnRpbWVzIHRoYXQgeW91ciBuZXcgcHJvamVjdCB3aWxsIHN1cHBvcnQsIGNsaWNrIDxiPlNob3cgUnVudGltZXM8L2I+LiBUaGUgPGI+UnVudGltZXM8L2I+IGZpZWxkIGxpc3RzIHRoZSBhdmFpbGFibGUgcnVudGltZXMuIFNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byB0aGUgcnVudGltZXMgdGhhdCB5b3Ugd2FudCB0aGUgbmV3IHByb2plY3QgdG8gc3VwcG9ydC4gVGhlIDxiPlByb2plY3QgRmFjZXRzPC9iPiBsaXN0IHNob3dzIG9ubHkgdGhlIGZhY2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIHJ1bnRpbWVzLCBwcmV2ZW50aW5nIHlvdSBmcm9tIHNlbGVjdGluZyBhIGZhY2V0IHRoYXQgZG9lcyBub3Qgd29yayBvbiBhIHNlbGVjdGVkIHJ1bnRpbWUuIFlvdSBjYW4gYWxzbyBjaG9vc2UgYSBwcmVmZXJyZWQgcnVudGltZSBieSBzZWxlY3RpbmcgYSBydW50aW1lIGFuZCB0aGVuIGNsaWNraW5nIHRoZSA8Yj5NYWtlIFByZWZlcnJlZDwvYj4gYnV0dG9uLiBUaGUgcHJlZmVycmVkIHJ1bnRpbWUgcHJvdmlkZXMgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QuCi0KLVlvdSBjYW4gc2F2ZSB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcHJvamVjdCBzbyB5b3UgY2FuIGNyZWF0ZSBvdGhlciBwcm9qZWN0cyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIGxhdGVyLiBUbyBzYXZlIHRoZSBzZXR0aW5ncyBmb3IgYSBwcm9qZWN0LCBzZXQgdXAgdGhlIHByb2plY3Qgb24gdGhlIFNlbGVjdCBQcm9qZWN0IEZhY2V0cyBwYWdlLCBjbGljayB0aGUgPGI+U2F2ZTwvYj4gYnV0dG9uLCBhbmQgdHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgcHJlc2V0LiBXaGVuIHlvdSBjcmVhdGUgYSBwcm9qZWN0IGxhdGVyLCB5b3UgY2FuIHNlbGVjdCB0aGF0IHByZXNldCBmcm9tIHRoZSA8Yj5QcmVzZXRzPC9iPiBsaXN0LgotCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwiIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIvPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2ZhY2V0cy5odG1sIiBsYWJlbD0iUHJvamVjdCBmYWNldHMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UiIHRpdGxlPSJOZXcgRUFSIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gZWFjaCBKMkVFIG1vZHVsZSB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIG5ldyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENsaWNrIHRoZSA8Yj5OZXcgTW9kdWxlPC9iPiBidXR0b24gdG8gY3JlYXRlIG5ldyBtb2R1bGVzLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbCIgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUFSX05FV19NT0RVTEVfUFJPSkVDVFNfUEFHRSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBjcmVhdGUgbmV3IEoyRUUgbW9kdWxlcyB0byBhZGQgdG8gdGhlIG5ldyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiBUaGUgd2l6YXJkIGNhbiBnZW5lcmF0ZSBhIHNldCBvZiBkZWZhdWx0IEoyRUUgbW9kdWxlcyBvciBpbmRpdmlkdWFsIGN1c3RvbWl6ZWQgSjJFRSBtb2R1bGVzLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amVhci5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0Ii8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbCIgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iRUpCX05FV19FSkJfV0laQVJEX1BBR0UxIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gY3JlYXRlIGFuIEVKQiBwcm9qZWN0LgotCi1PbiB0aGlzIHBhZ2UsIG5hbWUgdGhlIHByb2plY3QgYW5kIHNlbGVjdCB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwcm9qZWN0IGZpbGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IGEgdGFyZ2V0IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0IGFuZCBhZGQgdGhlIHByb2plY3QgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LgotCi1DbGljayB0aGUgPGI+TW9kaWZ5PC9iPiBidXR0b24gdW5kZXIgQ29uZmlndXJhdGlvbiB0byBlZGl0IHRoZSBmYWNldHMgYW5kIHJ1bnRpbWVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBvciBzdXBwb3J0ZWQgYnkgdGhlIHByb2plY3QuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRwcm8uaHRtbCIgbGFiZWw9IkNyZWF0aW5nIEVKQiBwcm9qZWN0cyIvPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL2NlYXJjaC5odG1sIiBsYWJlbD0iRUpCIGFyY2hpdGVjdHVyZSIvPgotPHRvcGljIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL2NlY2xpZW50amFycy5odG1sIiBsYWJlbD0iRUpCIGNsaWVudCBKQVIgcHJvamVjdHMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJFSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTIiPgotPGRlc2NyaXB0aW9uPgotCi1JbiB0aGUgU291cmNlIEZvbGRlciBmaWVsZCwgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGZvbGRlciB0byB1c2UgZm9yIHNvdXJjZSBjb2RlLiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgRUpCIGNsaWVudCBKQVIgbW9kdWxlLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBKQVIgZmlsZSAoPGI+Q2xpZW50IEpBUiBVUkk8L2I+KS4KLQotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBmaWx0ZXI9InBsdWdpbj1vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyIiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydHByby5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgRUpCIHByb2plY3RzIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvY2VjbGllbnRqYXJzLmh0bWwiIGxhYmVsPSJFSkIgY2xpZW50IEpBUiBwcm9qZWN0cyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IkpDQV9ORVdJWkFSRF9QQUdFMSIgdGl0bGU9Ik5ldyBjb25uZWN0b3Igd2l6YXJkIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gY3JlYXRlIGEgQ29ubmVjdG9yIHByb2plY3QuIFRoZSBKMkVFIENvbm5lY3RvciBBcmNoaXRlY3R1cmUgKEpDQSkgc3BlY2lmaWVzIGhvdyBhIEoyRUUgYXBwbGljYXRpb24gY29tcG9uZW50IGFjY2Vzc2VzIGEgY29ubmVjdGlvbi1iYXNlZCByZXNvdXJjZS4KLQotT24gdGhpcyBwYWdlLCBuYW1lIHRoZSBDb25uZWN0b3IgcHJvamVjdCBhbmQgc2VsZWN0IHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHByb2plY3QgZmlsZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgYSB0YXJnZXQgcnVudGltZSBmb3IgdGhlIHByb2plY3QgYW5kIGFkZCB0aGUgcHJvamVjdCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuCi0KLUNsaWNrIHRoZSA8Yj5Nb2RpZnk8L2I+IGJ1dHRvbiB1bmRlciBDb25maWd1cmF0aW9uIHRvIGVkaXQgdGhlIGZhY2V0cyBhbmQgcnVudGltZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIG9yIHN1cHBvcnRlZCBieSB0aGUgcHJvamVjdC4KLQotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBmaWx0ZXI9InBsdWdpbj1vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXJjaC5odG1sIiBsYWJlbD0iSjJFRSBhcmNoaXRlY3R1cmUiLz4KLTx0b3BpYyBmaWx0ZXI9InBsdWdpbj1vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmh0bWwiIGxhYmVsPSJDcmVhdGluZyBhIGNvbm5lY3RvciBwcm9qZWN0Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iSkNBX05FV0laQVJEX1BBR0UzIiB0aXRsZT0iTmV3IGNvbm5lY3RvciB3aXphcmQiPgotPGRlc2NyaXB0aW9uPkluIHRoZSA8Yj5Tb3VyY2UgRm9sZGVyPC9iPiBmaWVsZCwgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGZvbGRlciB0byB1c2UgZm9yIHNvdXJjZSBjb2RlLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbCIgbGFiZWw9IkoyRUUgYXJjaGl0ZWN0dXJlIi8+Ci08dG9waWMgZmlsdGVyPSJwbHVnaW49b3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkM2EwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJvamVjdFByZWZzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPCEtLSBwcm9qZWN0IHByZWZlcmVuY2VzIC0tPgotCi08Y29udGV4dCBpZD0iSkFSZGVwIj4KLQkJPCEtLSBKQVIgZGVwZW5kZW5jaWVzIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IGRlcGVuZGVudCBKQVIgZmlsZXMgZm9yIG1vZHVsZXMgd2l0aGluIHRoZSBhc3NvY2lhdGVkIHByb2plY3QuCi0KLVNlbGVjdCA8Yj5Vc2UgRUpCIEpBUnM8L2I+LCA8Yj5Vc2UgRUpCIGNsaWVudCBKQVJzPC9iPiwgb3IgPGI+QWxsb3cgYm90aDwvYj4gdG8gY29udHJvbCB3aGljaCBKQVIgZmlsZXMgYXJlIGxpc3RlZC4gIFRoZW4sIHNlbGVjdCB0aGUgSkFSIGZpbGVzIGZyb20gdGhlIGxpc3QuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIGNsYXNzIHBhdGggYW5kIEphdmEgcHJvamVjdCBidWlsZCBwYXRoIHdpdGggdGhlIGFwcHJvcHJpYXRlIEpBUiBmaWxlcy4KLQotVGhlIDxiPk1hbmlmZXN0IENsYXNzLVBhdGg8L2I+IGZpZWxkIGRpc3BsYXlzIHRoZSBtYW5pZmVzdCBjbGFzcy1wYXRoIGNoYW5nZXMgYmFzZWQgb24gdGhlIEpBUiBmaWxlcyBzZWxlY3RlZC4gVGhpcyBmaWVsZCBpcyBkaXNwbGF5IG9ubHkgYW5kIHNob3dzIHlvdSB0aGUgY2xhc3MgcGF0aCBmb3IgeW91ciBtb2R1bGUgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08IS0tIG5lZWQgbGlua3MgdG8gRUpCIGJhc2UgaW5mbywgRUpCIENsaWVudCBpbmZvLCBwcm9qZWN0IGNsYXNzIHBhdGhzLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRUFSbW9kIj4KLQk8IS0tIEVBUiBtb2R1bGVzIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+PCEtLSBwYWdlIGlzIGJsYW5rIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyAtLT4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi0KLQotPC9jb250ZXh0cz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGE4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IEVKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEV4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEoyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgUHJlZmVyZW5jZXNfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBQcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgUHJvamVjdFByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmQyYjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSIAotIyBOTFNfRU5DT0RJTkc9VVRGLTggCi0KLXBsdWdpbk5hbWUgICAgPSBKMkVFIHRvb2xzIGluZm9wb3BzCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRmZjZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotCTxjb250ZXh0cyBmaWxlPSJFeHBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIgLz4KLQk8Y29udGV4dHMgZmlsZT0iSW1wb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IkoyRUVHZW5lcmFsX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlByb2plY3RDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIgLz4KLQk8Y29udGV4dHMgZmlsZT0iRUpCQ3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlByb2plY3RQcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIiAvPgotCTxjb250ZXh0cyBmaWxlPSJQcmVmZXJlbmNlc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIiAvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVlZGM0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvRHluV2ViV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL0R5bldlYldpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiZWE0Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvRHluV2ViV2l6Q29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJ3ZWJ3MTAwMCI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBuYW1lIHlvdXIgV2ViIHByb2plY3QgYW5kIHNwZWNpZnkgdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uICh0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlc291cmNlcyB5b3UgY3JlYXRlIGFyZSBzdG9yZWQuKSBXaGVuIHRoZSBVc2UgZGVmYXVsdCBjaGVjayBib3ggaXMgc2VsZWN0ZWQsIHRoZSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gd2hlcmUgeW91ciB3b3Jrc3BhY2UgcmVzaWRlcy4gVG8gY2hhbmdlIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGxvY2F0aW9uLCBjbGVhciB0aGUgY2hlY2tib3ggYW5kIGxvY2F0ZSB0aGUgcGF0aCB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBidXR0b24uIFRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIG9wdGlvbnMsIHNlbGVjdCB0aGUgPGI+TmV4dDwvYj4gYnV0dG9uLgotSW4gdGhlIFRhcmdldCBSdW50aW1lIGZpZWxkLCBzZWxlY3QgdGhlIHNlcnZlciB3aGVyZSB5b3Ugd2FudCB0byBkZXBsb3kgdGhlIFdlYiBwcm9qZWN0LiBpZiBhIHNlcnZlciBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8Yj5OZXc8L2I+IHRvIHNlbGVjdCBhIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50LiAKLUNsaWNrIDxiPkFkZCBwcm9qZWN0IHRvIEVBUjwvYj4gdG8gYWRkIHRoZSBwcm9qZWN0IHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gVGhlIGRlZmF1bHQgRUFSIHByb2plY3QgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgV2ViIHByb2plY3QgYXBwZW5kZWQgd2l0aCBFQVIuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYncxMTAwIj4KLTxkZXNjcmlwdGlvbj5QcmVzZXRzIGFyZSB1c2VkIHRvIGRlZmluZSBhIGRlZmF1bHQgc2V0IG9mIGZhY2V0IHZlcnNpb25zIHRoYXQgd2lsbCBjb25maWd1cmUgYSBwcm9qZWN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBkZXZlbG9wbWVudC4gU2VsZWN0IG9uZSBvciBtb3JlIGZhY2V0cyBmb3IgdGhlIGR5bmFtaWMgV2ViIHByb2plY3QuIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiB0aGUgZmFjZXQsIGNsaWNrIHRoZSBmYWNldCB2ZXJzaW9uIGFuZCBzZWxlY3QgYSB2ZXJzaW9uIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LgotQ2xpY2sgU2hvdyBSdW50aW1lcyB0byB2aWV3IHRoZSBhdmFpbGFibGUgcnVudGltZXMgYW5kIHJ1bnRpbWUgY29tcG9zaXRpb25zLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ3MTIwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIGNvbnRleHQgcm9vdCBpcyB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gYSBXZWIgc2VydmVyLiAKLVRoZSBDb250ZW50IGRpcmVjdG9yeSBmb2xkZXIgaXMgdGhlIG1hbmRhdG9yeSBsb2NhdGlvbiBvZiBhbGwgV2ViIHJlc291cmNlcywgZm9yIGV4YW1wbGUgV2ViIHBhZ2VzLCBzdHlsZSBzaGVldHMgb3IgZ3JhcGhpY3MuIElmIHRoZSBmaWxlcyBhcmUgbm90IHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSAob3IgaW4gYSBzdWJkaXJlY3Rvcnkgc3RydWN0dXJlIHVuZGVyIHRoaXMgZGlyZWN0b3J5KSwgdGhlIGZpbGVzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHNlcnZlci4gCi1UaGUgSmF2YSBzb3VyY2UgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBwcm9qZWN0J3MgSmF2YSBzb3VyY2UgY29kZSBmb3IgY2xhc3NlcywgYmVhbnMsIGFuZCBzZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgY29tcGlsZWQgYW5kIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWwiLz4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvRmlsdGVyV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL0ZpbHRlcldpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViZjIzYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvRmlsdGVyV2l6Q29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iZmx0dzEwNTAiPgotPGRlc2NyaXB0aW9uPgotQSBmaWx0ZXIgaXMgdXNlZCB0byBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0cyBiZWZvcmUgdGhleSBhcmUgcGFzc2VkIGludG8gYSBzZXJ2bGV0LgotCi1TcGVjaWZ5IHRoZSA8Yj5Qcm9qZWN0PC9iPiBhbmQgPGI+Rm9sZGVyPC9iPiB3aGVyZSB0aGUgZmlsdGVyIGNsYXNzIHdpbGwgYmUgcGxhY2VkLiBUaGUgZmlsdGVyIGNsYXNzIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEphdmEgc291cmNlIGRpcmVjdG9yeSwgd2hpY2ggeW91IHNwZWNpZmllZCB3aGVuIHlvdSBjcmVhdGVkIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IChmb3IgZXhhbXBsZSBzcmMpLgotCi1TcGVjaWZ5IHRoZSA8Yj5KYXZhIHBhY2thZ2U8L2I+IHRoYXQgdGhlIGNsYXNzIHdpbGwgYmVsb25nIHRvLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgb25lLCB0aGUgY2xhc3Mgd2lsbCBiZSBhZGRlZCBpbnRvIGEgZGVmYXVsdCBwYWNrYWdlLgotCi1TcGVjaWZ5IHRoZSA8Yj5DbGFzcyBuYW1lPC9iPiBvZiB0aGUgZmlsdGVyIChmb3IgZXhhbXBsZSBNeUZpbHRlcikuCi0KLUluIHRoZSBmaWVsZCA8Yj5TdXBlcmNsYXNzPC9iPiBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgZmlsdGVyLG9ubHkgaWYgaXQgaXMgZGVyaXZlZCBmcm9tIG9uZS4gQ2xpY2sgPGI+QnJvd3NlPC9iPiB0byBjaG9vc2UgZnJvbSB0aGUgYXZhaWxhYmxlLCBhbHJlYWR5IGV4aXN0aW5nIG9yIGNyZWF0ZWQsIHN1cGVyY2xhc3Nlcy4gKFRoaXMgZmllbGQgaXMgb3B0aW9uYWwpLgotCi1DaGVjayA8Yj5Vc2UgZXhpc3RpbmcgRmlsdGVyIGNsYXNzPC9iPiBhbmQgeW91IGNvdWxkIGdldCBhbiBhbHJlYWR5IGV4aXN0aW5nIGNsYXNzIGFuZCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseSBpbiB5b3VyIHdlYi54bWwuCi0KLU5vdGU6IElmIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSBYRG9jbGV0IGZhY2V0IHdoZW4gY3JlYXRpbmcgdGhlIER5bmFtaWMgV2ViIFByb2plY3QsIHlvdSBjYW4gbm93IHNlbGVjdCA8Yj5HZW5lcmF0ZSBhIFhEb2NsZXQgYW5ub3RhdGVkIGNsYXNzPC9iPi4gVGhpcyB3aWxsIGNyZWF0ZSBhIFhEb2NsZXQgYW5ub3RhdGVkIGZpbHRlciBjbGFzcy4gVGhlIGFubm90YXRpb25zIHdpbGwgZ2VuZXJhdGUgdGhlIG1ldGFkYXRhIGluIHRoZSB3ZWIueG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEZpbHRlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdmbHR3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iZmx0dzExMDAiPgotPGRlc2NyaXB0aW9uPgotTm90ZSB0aGF0IHRoZSBDbGFzcyBOYW1lIHZhbHVlIHByb3ZpZGVkIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3aXphcmQgaXMgYXV0b21hdGljYWxseSBtYXBwZWQgdG8gdGhlIDxiPk5hbWU8L2I+IGZpZWxkIG9uIHRoaXMgcGFnZS4gCi0KLVNwZWNpZnkgdGhlIDxiPkluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM8L2I+IG9mIHRoZSBmaWx0ZXIgYXMgbmFtZS92YWx1ZSBwYWlycyAoZm9yIGV4YW1wbGUgcGFzc3dvcmRzKS4KLQotSW4gdGhlIDxiPkZpbHRlciBNYXBwaW5nczwvYj4gZmllbGQsIHNwZWNpZnkgdGhlIFNlcnZsZXQsIHRvIHdoaWNoIHRoZSBmaWx0ZXIgd2lsbCBiZSBtYXBwZWQuIERvIHRoaXMgYnkgY2xpY2tpbmcgdGhlIDxiPkFkZDwvYj4gYnV0dG9uLiBJbiB0aGUgPGI+QWRkIGZpbHRlciBtYXBwaW5nPC9iPiBkaWFsb2cgdGhhdCBhcHBlYXJzIGFmdGVyIHlvdSBjbGljayB0aGUgPGI+QWRkPC9iPiBidXR0b24sIGlmIHlvdSBzZWxlY3QgdGhlIDxiPlNlcnZsZXQ8L2I+IHJhZGlvIGJ1dHRvbiB5b3UgY2FuIGNob29zZSBhbiBleGlzdGluZyBzZXJ2bGV0IGNsYXNzLCBidXQgaWYgeW91IHNlbGVjdCB0aGUgPGI+VVJMIFBhdHRlcm48L2I+IHJhZGlvIGJ1dHRvbiB5b3UgaGF2ZSB0byBlbnRlciB0aGUgVVJMIHBhdHRlcm4gdG8gd2hpY2ggeW91IHdhbnQgdG8gbWFwIHRoZSBmaWx0ZXIuIEluIHRoZSBzYW1lIGRpYWxvZywgYnV0IGZyb20gPGI+U2VsZWN0IERpc3BhdGNoZXJzPC9iPiBncm91cCwgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZGlzcGF0Y2hlcnMgdG8gYmUgaW52b2tlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgZGlzcGF0Y2hlciBoYXMgZm91ciBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsIElOQ0xVREUsIGFuZCBFUlJPUi4gCi0gPGI+LTwvYj4gQSB2YWx1ZSBvZiA8Yj5GT1JXQVJEPC9iPiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciA8Yj5SZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCk8L2I+IGNhbGxzLgotIDxiPi08L2I+IEEgdmFsdWUgb2YgPGI+UkVRVUVTVDwvYj4gbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSA8Yj5wYXRoPC9iPiBvciA8Yj5zZXJ2bGV0PC9iPi4KLSA8Yj4tPC9iPiBBIHZhbHVlIG9mIDxiPklOQ0xVREU8L2I+IG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIDxiPlJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKTwvYj4gY2FsbHMuCi0gPGI+LTwvYj4gQSB2YWx1ZSBvZiA8Yj5FUlJPUjwvYj4gbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGVycm9yIHBhZ2UgbWVjaGFuaXNtLgotIDxiPi08L2I+IElmIG5vIGRlc3BhdGNoZXIgaXMgc2VsZWN0ZWQsIGl0IGluZGljYXRlcyB0aGF0IGZpbHRlcnMgd2lsbCBiZSBhcHBsaWVkIG9ubHkgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSA8Yj5wYXRoPC9iPiBvciA8Yj5zZXJ2bGV0PC9iPi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEZpbHRlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdmbHR3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iZmx0dzEyMDAiPgotPGRlc2NyaXB0aW9uPgotTm90ZSB0aGF0IHRoZSBTdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCBTcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGEgU2VydmxldCBjbGFzcyBtdXN0IGJlIDxiPnB1YmxpYzwvYj4gYW5kIG5vdCA8Yj5hYnN0cmFjdDwvYj4uIFRoZXJlZm9yZSwgeW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgdGhlIDxiPmZpbmFsPC9iPiBtb2RpZmllci4gCi0KLUEgZmlsdGVyIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBGaWx0ZXIgaW50ZXJmYWNlLCB0aGF0J3Mgd2h5IHRoZSA8Yj5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvYj4gaXMgcHJvdmlkZWQgYXMgdGhlIGRlZmF1bHQgSW50ZXJmYWNlLiBZb3UgY2FuIGFsc28gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQuIENsaWNrIDxiPkFkZDwvYj4gdG8gb3BlbiB0aGUgPGI+SW50ZXJmYWNlIFNlbGVjdGlvbjwvYj4gZGlhbG9nLiBJbiB0aGlzIGRpYWxvZywgYXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgaW50ZXJlc3RlZCB0byBhZGQsIHRoZXJlIHdpbGwgYmUgZGlzcGxheWVkIG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KLQotTm90ZTogQmVjYXVzZSB0aGUgbWV0aG9kcyBpbml0LCBkb0ZpbHRlciBhbmQgZGVzdHJveSBhcmUgcHJvdmlkZWQgZnJvbSBqYXZheC5zZXJ2bGV0LkZpbHRlciBpbnRlcmZhY2UgYW5kIHRoaXMgaW50ZXJmYWNlIGlzIG9ibGlnYXRvcnkgZm9yIGVhY2ggRmlsdGVyIGNsYXNzLCB0aGUgb3B0aW9uIDxiPkluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzPC9iPiBpcyBhbHdheXMgY2hlY2tlZCBhbmQgY2FuJ3QgYmUgY2hhbmdlZC4KLQotVXNpbmcgdGhlIG9wdGlvbiA8Yj5Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzPC9iPiB5b3UgY2FuIGNob29zZSB3aGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MsIHdoaWNoIHlvdSBzcGVjaWZpZWQgYXMgc3VwZXJjbGFzcyBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLiBOb3RlOiBJZiB5b3UgZGlkIG5vdCBzcGVjaWZ5IGFueSBjbGFzcyBhcyBzdXBlcmNsYXNzLCB5b3UgY2FuIG5vdCBjaGVjayB0aGlzIG9wdGlvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEZpbHRlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdmbHR3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL0xpc3RlbmVyV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL0xpc3RlbmVyV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDYwOWQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9MaXN0ZW5lcldpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJsc3R3MTA1MCI+Ci08ZGVzY3JpcHRpb24+Ci1TcGVjaWZ5IHRoZSA8Yj5Qcm9qZWN0PC9iPiBhbmQgPGI+Rm9sZGVyPC9iPiB3aGVyZSB0aGUgbGlzdGVuZXIgY2xhc3Mgd2lsbCBiZSBwbGFjZWQuIFRoZSBsaXN0ZW5lciBjbGFzcyBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBKYXZhIHNvdXJjZSBkaXJlY3RvcnksIHdoaWNoIHlvdSBzcGVjaWZpZWQgd2hlbiB5b3UgY3JlYXRlZCB0aGUgRHluYW1pYyBXZWIgUHJvamVjdCAoZm9yIGV4YW1wbGUgc3JjKS4KLQotU3BlY2lmeSB0aGUgPGI+SmF2YSBwYWNrYWdlPC9iPiB0aGF0IHRoZSBjbGFzcyB3aWxsIGJlbG9uZyB0by4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IG9uZSwgdGhlIGNsYXNzIHdpbGwgYmUgYWRkZWQgaW50byBhIGRlZmF1bHQgcGFja2FnZS4gU3BlY2lmeSB0aGUgPGI+Q2xhc3MgbmFtZTwvYj4gb2YgdGhlIGxpc3RlbmVyIChmb3IgZXhhbXBsZSBNeUxpc3RlbmVyKS4KLQotSW4gdGhlIGZpZWxkIDxiPlN1cGVyY2xhc3M8L2I+IHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsaXN0ZW5lciBjbGFzcyxvbmx5IGlmIHlvdXIgbGlzdGVuZXIgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIG9uZS4gQ2xpY2sgPGI+QnJvd3NlPC9iPiB0byBjaG9vc2UgZnJvbSB0aGUgYXZhaWxhYmxlLCBhbHJlYWR5IGV4aXN0aW5nIG9yIGNyZWF0ZWQsIHN1cGVyY2xhc3Nlcy4gKFRoaXMgZmllbGQgaXMgb3B0aW9uYWwpLgotCi1Ob3RlOiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgWERvY2xldCBmYWNldCB3aGVuIGNyZWF0aW5nIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0LCB5b3UgY2FuIG5vdyBzZWxlY3QgPGI+R2VuZXJhdGUgYSBYRG9jbGV0IGFubm90YXRlZCBjbGFzczwvYj4uIFRoaXMgd2lsbCBjcmVhdGUgYSBYRG9jbGV0IGFubm90YXRlZCBsaXN0ZW5lciBjbGFzcy4gVGhlIGFubm90YXRpb25zIHdpbGwgZ2VuZXJhdGUgdGhlIG1ldGFkYXRhIGluIHRoZSB3ZWIueG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIExpc3RlbmVycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2xzdHdpei5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsc3R3MTEwMCI+Ci08ZGVzY3JpcHRpb24+Ci1Gcm9tIHRoZSA8Yj5TZXJ2bGV0IENvbnRleHQgRXZlbnRzPC9iPiBncm91cCwgeW91IGNhbiBzZWxlY3QgYW55IGFwcHJvcHJpYXRlIGdyb3VwIG9mIG1ldGhvZCBzdHVicyB0byBiZSBjcmVhdGVkIGluIHRoZSBsaXN0ZW5lciBmaWxlLiBUaGVzZSBhcmUgdGhlIG1ldGhvZHMgb2YgdGhlIHR3byBiYXNpYyBsaXN0ZW5lciBpbnRlcmZhY2VzLCB0aGF0IGFyZSBwcm92aWRlZCBmcm9tIHRoZSA8Yj5qYXZheC5zZXJ2bGV0PC9iPiBwYWNrYWdlOgotICA8Yj4tPC9iPiBUaGUgPGI+U2VydmxldENvbnRleHRMaXN0ZW5lcjwvYj4gaW50ZXJmYWNlIGlzIHVzZWQgdG8gbGlzdGVuIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCBsaWZlIGN5Y2xlIGV2ZW50cy4KLSAgPGI+LTwvYj4gVGhlIDxiPlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI8L2I+IGludGVyZmFjZSBpcyB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IGF0dHJpYnV0ZSBpcyBhZGRlZCB0byB0aGUgU2VydmxldENvbnRleHQgb3IgaWYgYW55IG9mIHRoZSBTZXJ2bGV0Q29udGV4dCdzIGF0dHJpYnV0ZXMgYXJlIGNoYW5nZWQgb3IgcmVtb3ZlZC4gCi0KLUZyb20gdGhlIDxiPkhUVFAgU2Vzc2lvbiBFdmVudHM8L2I+IGdyb3VwLCB5b3UgY2FuIHNlbGVjdCBhbnkgYXBwcm9wcmlhdGUgZ3JvdXAgb2YgbWV0aG9kIHN0dWJzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIGxpc3RlbmVyIGNsYXNzLiBUaGVzZSBhcmUgdGhlIG1ldGhvZHMgb2YgdGhlIGxpc3RlbmVyIGludGVyZmFjZXMgcHJvdmlkZWQgZnJvbSB0aGUgPGI+amF2YXguc2VydmxldC5odHRwPC9iPiBwYWNrYWdlOgotICA8Yj4tPC9iPiBUaGUgPGI+SHR0cFNlc3Npb25MaXN0ZW5lcjwvYj4gYW5kIDxiPkh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyPC9iPiBpbnRlcmZhY2VzIGFyZSB1c2VkIHRvIGxpc3RlbiB0byBjcmVhdGlvbiwgaW52YWxpZGF0aW9uLCBhY3RpdmF0aW9uLCBwYXNzaXZhdGlvbiBhbmQgdGltZW91dCBvZiBhbiBIdHRwRXZlbnQgb2JqZWN0LiAKLSAgPGI+LTwvYj4gVGhlIDxiPkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI8L2I+IGFuZCA8Yj5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvYj4gaW50ZXJmYWNlcyBhcmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8sIHJlbW92ZWQgZnJvbSwgb3IgcmVwbGFjZWQgaW4gdGhlIEh0dHBTZXNzaW9uIG9iamVjdC4gCi0KLUZyb20gdGhlIDxiPlNlcnZsZXQgUmVxdWVzdCBFdmVudHM8L2I+IGdyb3VwLCB5b3UgY2FuIHNlbGVjdCBhbnkgYXBwcm9wcmlhdGUgZ3JvdXAgb2YgbWV0aG9kIHN0dWJzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIGxpc3RlbmVyIGNsYXNzLiBUaGVzZSBhcmUgdGhlIG1ldGhvZHMgb2YgdGhlIGFkZGl0aW9uYWwgbGlzdGVuZXIgaW50ZXJmYWNlcyBwcm92aWRlZCBmcm9tIHRoZSA8Yj5qYXZheC5zZXJ2bGV0PC9iPiBwYWNrYWdlOgotICA8Yj4tPC9iPiBUaGUgPGI+U2VydmxldFJlcXVlc3RMaXN0ZW5lcjwvYj4gaW50ZXJmYWNlIGlzIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHNlcnZsZXQgcmVxdWVzdCBoYXMgc3RhcnRlZCBiZWluZyBwcm9jZXNzZWQgYnkgd2ViIGNvbXBvbmVudHMuCi0gIDxiPi08L2I+IFRoZSA8Yj5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyPC9iPiBpbnRlcmZhY2UgaXMgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8sIHJlbW92ZWQgZnJvbSBvciByZXBsYWNlZCBpbiB0aGUgU2VydmxldFJlcXVlc3Qgb2JqZWN0LgotCi1Zb3UgY2FuIGNsaWNrIHRoZSA8Yj5TZWxlY3QgQWxsPC9iPiBidXR0b24gdG8gc2VsZWN0IGFsbCBhdmFpbGFibGUgZ3JvdXBzIG9mIG1ldGhvZCBzdHVicyBvciBjbGljayB0aGUgPGI+Q2xlYXI8L2I+IGJ1dHRvbiB0byBjbGVhciBhbGwgYWxyZWFkeSBzZWxlY3RlZCBtZXRob2Qgc3R1YnMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBMaXN0ZW5lcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbCIvPiAKLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImxzdHcxMjAwIj4KLTxkZXNjcmlwdGlvbj4KLU5vdGUgdGhhdCB0aGUgU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBhIFNlcnZsZXQgY2xhc3MgbXVzdCBiZSA8Yj5wdWJsaWM8L2I+IGFuZCBub3QgPGI+YWJzdHJhY3Q8L2I+LiBUaGVyZWZvcmUsIHlvdSBjYW5ub3QgY2hhbmdlIHRoZXNlIG1vZGlmaWVycy4gVGhlIG9ubHkgb25lIGF2YWlsYWJsZSBmb3IgY2hhbmdlIGlzIHRoZSA8Yj5maW5hbDwvYj4gbW9kaWZpZXIuIAotCi1Ob3RlIHRoYXQgdGhlIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHN0dWJzIHByb3ZpZGVkIGluIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSB3aXphcmQsIGlzIGF1dG9tYXRpY2FsbHkgbWFwcGVkIHRvIHRoZSBJbnRlcmZhY2VzIGZpZWxkIG9uIHRoaXMgcGFnZS4gWW91IGNhbiBjbGljayB0aGUgPGI+QWRkPC9iPiBidXR0b24gdG8gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQuCi0KLUlmIHRoZSA8Yj5Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kczwvYj4gb3B0aW9uIGlzIGNoZWNrZWQsIGl0IG1lYW5zIHRoYXQgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIGludGVyZmFjZSwgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgPGI+SW50ZXJmYWNlczwvYj4gZmlsZWQuCi0KLVVzaW5nIHRoZSBvcHRpb24gPGI+Q29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzczwvYj4geW91IGNhbiBjaG9vc2Ugd2hldGhlciB0byBvdmVycmlkZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzLCB3aGljaCB5b3Ugc3BlY2lmaWVkIGFzIHN1cGVyY2xhc3MgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gTm90ZTogSWYgeW91IGRpZCBub3Qgc3BlY2lmeSBhbnkgY2xhc3MgYXMgc3VwZXJjbGFzcywgeW91IGNhbiBub3QgY2hlY2sgdGhpcyBvcHRpb24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBMaXN0ZW5lcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTFiYzAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9TZXJ2bGV0V2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL1NlcnZsZXRXaXpDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDJiNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL1NlcnZsZXRXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9InNydncxMDUwIj4KLTxkZXNjcmlwdGlvbj4KLVNwZWNpZnkgdGhlIDxiPlByb2plY3Q8L2I+IGFuZCA8Yj5Gb2xkZXI8L2I+IHdoZXJlIHRoZSBzZXJ2bGV0IGNsYXNzIHdpbGwgYmUgcGxhY2VkLiBUaGUgc2VydmxldCBjbGFzcyBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBKYXZhIHNvdXJjZSBkaXJlY3RvcnkgdGhhdCB5b3Ugc3BlY2lmaWVkIHdoZW4geW91IGNyZWF0ZWQgdGhlIER5bmFtaWMgV2ViIFByb2plY3QgKGZvciBleGFtcGxlIHNyYykuIAotCi1TcGVjaWZ5IHRoZSA8Yj5KYXZhIHBhY2thZ2U8L2I+IHRoYXQgdGhlIGNsYXNzIHdpbGwgYmVsb25nIHRvIChpdCBpcyBhZGRlZCBpbnRvIGEgZGVmYXVsdCBwYWNrYWdlIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBvbmUpLgotCi1TcGVjaWZ5IHRoZSA8Yj5DbGFzcyBuYW1lPC9iPiBvZiB0aGUgc2VydmxldCAoZm9yIGV4YW1wbGUgSGVsbG9TZXJ2bGV0KS4KLQotSW4gdGhlIGZpZWxkIDxiPlN1cGVyY2xhc3M8L2I+IHNwZWNpZnkgYSBzdXBlcmNsYXNzIGZvciB0aGUgc2VydmxldCBjbGFzcy4gQSBzZXJ2bGV0IGNyZWF0ZWQgYnkgdGhpcyB3aXphcmQgY2FuIGhhdmUgSHR0cFNlcnZsZXQsIG9yIGFueSBjbGFzcyB0aGF0IGhhcyBIdHRwU2VydmxldCBpbiBpdHMgaGllcmFyY2h5IGFzIGl0cyBzdXBlcmNsYXNzLiBDbGljayA8Yj5Ccm93c2U8L2I+IHRvIGNob29zZSBmcm9tIHRoZSBhdmFpbGFibGUgc3VwZXJjbGFzc2VzLgotCi1DaGVjayA8Yj5Vc2UgZXhpc3RpbmcgU2VydmxldCBjbGFzczwvYj4gYW5kIHlvdSBjb3VsZCBnZXQgYW4gYWxyZWFkeSBleGlzdGluZyBjbGFzcyBhbmQgaXQgd2lsbCBiZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkgaW4geW91ciB3ZWIueG1sLgotCi1Ob3RlOiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgWERvY2xldCBmYWNldCB3aGVuIGNyZWF0aW5nIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0LCB5b3UgY2FuIG5vdyBzZWxlY3QgPGI+R2VuZXJhdGUgYSBYRG9jbGV0IGFubm90YXRlZCBjbGFzczwvYj4uIFRoaXMgd2lsbCBjcmVhdGUgYSBYRG9jbGV0IGFubm90YXRlZCBzZXJ2bGV0IGNsYXNzLiBUaGUgYW5ub3RhdGlvbnMgd2lsbCBnZW5lcmF0ZSB0aGUgbWV0YWRhdGEgaW4gdGhlIHdlYi54bWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgU2VydmxldHMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic3J2dzExMDAiPgotPGRlc2NyaXB0aW9uPgotTm90ZSB0aGF0IHRoZSBDbGFzcyBOYW1lIHZhbHVlIHByb3ZpZGVkIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3aXphcmQgaXMgYXV0b21hdGljYWxseSBtYXBwZWQgdG8gdGhlIDxiPk5hbWU8L2I+IGZpZWxkIG9uIHRoaXMgcGFnZS4gCi0KLVNwZWNpZnkgdGhlIDxiPkluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM8L2I+IG9mIHRoZSBzZXJ2bGV0IGFzIG5hbWUvdmFsdWUgcGFpcnMsIGZvciBleGFtcGxlIHBhc3N3b3Jkcy4KLQotSW4gdGhlIDxiPlVSTCBNYXBwaW5nczwvYj4gZmllbGQsIHNwZWNpZnkgdGhlIFVSTCBwYXR0ZXJuIHRvIGJlIG1hcHBlZCB3aXRoIHRoZSBzZXJ2bGV0LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgU2VydmxldHMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic3J2dzEyMDAiPgotPGRlc2NyaXB0aW9uPgotTm90ZSB0aGF0IHRoZSBTdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCBTcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGEgU2VydmxldCBjbGFzcyBtdXN0IGJlIDxiPnB1YmxpYzwvYj4gYW5kIG5vdCA8Yj5hYnN0cmFjdDwvYj4uIFRoZXJlZm9yZSwgeW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgdGhlIDxiPmZpbmFsPC9iPiBtb2RpZmllci4gIAotCi1JZiBvbmUgb2YgdGhlIEh0dHBTZXJ2bGV0IG9yIEdlbmVyaWNTZXJ2bGV0IGNsYXNzZXMgaXMgbm90IHNwZWNpZmllZCBhcyBhIHN1cGVyY2xhc3Mgb2YgdGhlIFNlcnZsZXQgY2xhc3MsIHRoZSA8Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXQ8L2I+IGlzIHByb3ZpZGVkIGFzIHRoZSBkZWZhdWx0IGludGVyZmFjZSBhbmQgZGVmaW5lcyBsaWZlIGN5Y2xlIG1ldGhvZHMuIFlvdSBjYW4gdXNlIHRoZSB3aXphcmQgdG8gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQuQ2xpY2sgPGI+QWRkPC9iPiB0byBvcGVuIHRoZQotPGI+SW50ZXJmYWNlIFNlbGVjdGlvbjwvYj4gZGlhbG9nLiBJbiB0aGlzIGRpYWxvZywgYXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhZGRpbmcgaW4gdGhlIDxiPkNob29zZSBpbnRlcmZhY2VzPC9iPiBmaWVsZCwgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgbGlzdGVkIGluIHRoZSA8Yj5NYXRjaGluZyBpdGVtczwvYj4gbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5IG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gCi0KLVdoZW4gdGhlIDxiPkluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzPC9iPiBvcHRpb24gaXMgY2hlY2tlZCB5b3UgY2FuIHNlbGVjdCB3aGljaCBtZXRob2RzLCBwcm92aWRlZCBieSBIdHRwU2VydmxldCBjbGFzcywgdG8gYmUgb3ZlcnJpZGRlbi4gVGhlIGF2YWlsYWJsZSBtZXRob2RzIGFyZToKLSAgLSA8Yj5pbml0LCBzZXJ2aWNlIGFuZCBkZXN0cm95PC9iPiB3aGljaCBjYXJyaWVzIG9mIHRoZSBzZXJ2bGV0J3MgbGlmZSBjeWNsZTsgCi0gIC0gPGI+Z2V0U2VydmxldENvbmZpZyBhbmQgZ2V0U2VydmxldEluZm88L2I+LCB3aGljaCByZXR1cm5zIHJlc3BlY3RpdmVseSBzZXJ2bGV0J3MgU2VydmxldENvbmZpZyBvYmplY3QgY29udGFpbmluZyBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnR1cCBwYXJhbWV0ZXJzIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzZXJ2bGV0OyAgCi0gIC0gdGhlIHNpeCA8Yj5kb1hYWDwvYj4gdGhhdCBnZXQgY2FsbGVkIHdoZW4gYSByZWxhdGVkIEhUVFAgcmVxdWVzdCBtZXRob2QgaXMgdXNlZC4gCi0KLU5vdGU6IElmIHlvdSBkaWQgbm90IHNwZWNpZnkgSHR0cFNlcnZsZXQgY2xhc3MgYXMgc3VwZXJjbGFzcyBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLCB0aGUgb3B0aW9uIDxiPkluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzPC9iPiBpcyBhbHdheXMgY2hlY2tlZCBhbmQgY2FuIG5vdCBiZSBjaGFuZ2VkLCBiZWNhdXNlIGVhY2ggc2VydmxldCBtdXN0IGltcGxlbWVudCB0aGUgbWV0aG9kcyBvZiB0aGUgamF2YXguc2VydmxldC5TZXJ2bGV0IGludGVyZmFjZTogaW5pdCwgc2VydmljZSwgZGVzdHJveSwgZ2V0U2VydmxldENvbmZpZyBhbmQgZ2V0U2VydmxldEluZm8uICAgCi0KLVVzaW5nIHRoZSBvcHRpb24gPGI+Q29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzczwvYj4geW91IGNhbiBjaG9vc2Ugd2hldGhlciB0byBvdmVycmlkZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzLCB3aGljaCB5b3Ugc3BlY2lmaWVkIGFzIHN1cGVyY2xhc3MgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gTm90ZTogSWYgeW91IGRpZCBub3Qgc3BlY2lmeSBhbnkgY2xhc3MgYXMgc3VwZXJjbGFzcywgeW91IGNhbiBub3QgY2hlY2sgdGhpcyBvcHRpb24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBTZXJ2bGV0cyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY4YWNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gU2VydmxldFdpekNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBGaWx0ZXJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTGlzdGVuZXJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBEeW5XZWJXaXpDb250ZXh0cy54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWFiYWRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gU2VydmxldCBpbmZvcG9wCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmNmQxZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgIDxjb250ZXh0cyBmaWxlPSJTZXJ2bGV0V2l6Q29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSIvPgotICAgPGNvbnRleHRzIGZpbGU9IkR5bldlYldpekNvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkiLz4KLSAgIDxjb250ZXh0cwotICAgICAgICAgZmlsZT0iTGlzdGVuZXJXaXpDb250ZXh0cy54bWwiCi0gICAgICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpIj4KLSAgIDwvY29udGV4dHM+Ci0gICA8Y29udGV4dHMKLSAgICAgICAgIGZpbGU9IkZpbHRlcldpekNvbnRleHRzLnhtbCIKLSAgICAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkiPgotICAgPC9jb250ZXh0cz4KLQotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM0YTZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MGM1Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogU3RhdGljIFdlYiBpbmZvcG9wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwZjQwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9TdGF0aWNXZWJXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9IndlYncyMDAwIj4KLTxkZXNjcmlwdGlvbj4gVXNlIHRoaXMgcGFnZSB0byBuYW1lIHlvdXIgV2ViIHByb2plY3QgYW5kIHNwZWNpZnkgdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uICh0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlc291cmNlcyB5b3UgY3JlYXRlIGFyZSBzdG9yZWQuKSBXaGVuIHRoZSBVc2UgZGVmYXVsdCBjaGVjayBib3ggaXMgc2VsZWN0ZWQsIHRoZSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gd2hlcmUgeW91ciB3b3Jrc3BhY2UgcmVzaWRlcy4gVG8gY2hhbmdlIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGxvY2F0aW9uLCBjbGVhciB0aGUgY2hlY2tib3ggYW5kIGxvY2F0ZSB0aGUgcGF0aCB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBidXR0b24uIFRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIG9wdGlvbnMsIHNlbGVjdCB0aGUgPGI+TmV4dDwvYj4gYnV0dG9uLgotSW4gdGhlIFRhcmdldCBSdW50aW1lIGZpZWxkLCBzZWxlY3QgdGhlIHNlcnZlciB3aGVyZSB5b3Ugd2FudCB0byBwdWJsaXNoIHRoZSBXZWIgcHJvamVjdC4gaWYgYSBzZXJ2ZXIgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgY2xpY2sgPGI+TmV3PC9iPiB0byBzZWxlY3QgYSBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudC4gPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIxMDAiPgotPGRlc2NyaXB0aW9uPlByZXNldHMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgZGVmYXVsdCBzZXQgb2YgZmFjZXQgdmVyc2lvbnMgdGhhdCB3aWxsIGNvbmZpZ3VyZSBhIHByb2plY3QgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIGRldmVsb3BtZW50LiBUaGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYwotV2ViIG1vZHVsZS4gQ2xpY2sgU2hvdyBSdW50aW1lcyB0byB2aWV3IHRoZSBhdmFpbGFibGUgcnVudGltZXMgYW5kIHJ1bnRpbWUgY29tcG9zaXRpb25zLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYncyMjAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGlzIHdoZXJlIHRoZSBlbGVtZW50cyBvZiB5b3VyIFdlYiBzaXRlIHN1Y2ggYXMgV2ViIHBhZ2VzLCBncmFwaGljcyBhbmQgc3R5bGUgc2hlZXRzIGFyZSBzdG9yZWQuIFRoaXMgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgb2YgeW91ciBXZWIgc2l0ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSBhdCBkZXBsb3ltZW50IGFuZCB0aGF0IGxpbmsgdmFsaWRhdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3YzFhOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFkMmRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBTdGF0aWMgV2ViIGluZm9wb3AKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhYzAxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgPGNvbnRleHRzIGZpbGU9IlN0YXRpY1dlYldpekNvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2NDY2Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9hcmNoaXZlZC50eHQgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9hcmNoaXZlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlN2MzMjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvYXJjaGl2ZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGlzIGZlYXR1cmUgaXMgbm8gbG9uZ2VyIHVzZWQsIAotc28gSSBoYXZlICJudWxsZWQgb3V0IiB0aGUgaGVhZCBzdHJlYW0gCi10byBhdm9pZCBjb25mdXNpb24uIAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU2MTYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlMTllNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjdkZjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDx0aXRsZT5XVFAgMS41LjUgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+UHJvZHVjdDogV1RQIDEuNS41IFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qZW0gKGZlYXR1cmUpPC9oMj4KLQotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzcxNDgiPjIzNzE0ODwvYT4gY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgaW5uZXIgaW50ZXJmYWNlcyB3aGljaCBhcmUgYWxzbyBpbm5lciBpbnRlcmZhY2VzIGFyZSBub3QgcmVzb2x2ZWQgY29ycmVjdGx5PC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3Y2E5NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2ggZm9yIEphdmEgRU1GIE1vZGVsCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1WaXN1YWwgRWRpdG9yIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cCi1Db250YWlucyBmaXhlcyBpbiB0aGUgZm9sbG93aW5nOiBcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3MTQ4IGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IGlubmVyIGludGVyZmFjZXMgd2hpY2ggYXJlIGFsc28gaW5uZXIgaW50ZXJmYWNlcyBhcmUgbm90IHJlc29sdmVkIGNvcnJlY3RseVxuXAotXG5cCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotU2VwdGVtYmVyLCAyMDA4XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYWM4OGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuNS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgIDxkZXNjcmlwdGlvbj4lZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvcHlyaWdodD4lY29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0KLSAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4lbGljZW5zZTwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZW0iIHZlcnNpb249IjEuMi40LnYyMDA3MDQxODEwMjAtLTZ6WEpLMEwwU0UzYTk1IiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBhYTkzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmVfMC43LjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIwNjZhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmRvYy5pc3YuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NkNjM0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkMjBjMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIFVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UxYTU5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0gICA8aW5zdGFsbC1oYW5kbGVyLz4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ0OTRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjkzYTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjU1YTJhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSJQYXRjaCBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNS52MjAwNzA3MzExNjM1LS0yUEQ4OFM4Vl9LQVNBOCIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMmI0Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxODZkYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIEVudGVycHJpc2UgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBlbnRlcnByaXNlIGNvcmUgZnVuY3Rpb25hbGl0eQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmVkOGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5lamIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmMTkyNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gRW50ZXJwcmlzZSBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YmY2ZTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIEVudGVycHJpc2UgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTlmODllLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIEVudGVycHJpc2UgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIGVudGVycHJpc2UgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2YxOTI1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBFbnRlcnByaXNlIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViZjZlNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gRW50ZXJwcmlzZSBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE4ZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWZlYXR1cmVzCi1wbHVnaW5zCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlNjk4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWEwNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUsIGZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnNvdXJjZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTc3MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIEVudGVycHJpc2UgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIGVudGVycHJpc2UgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4YzUzYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2Vfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1N2Q2NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2M2FjYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2giCi0gICAgICBsYWJlbD0iUGF0Y2ggRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUiIHZlcnNpb249IjEuNS41LnF1YWxpZmllciIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY5NTYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5ZWFjNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBFbnRlcnByaXNlIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIGVudGVycHJpc2UgVUkgZnVuY3Rpb25hbGl0eQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3ODcwZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuYW5ub3RhdGlvbnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuYW5ub3RhdGlvbi5tb2RlbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9ucy5lbWl0dGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb25zLnhkb2NsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS54ZG9jbGV0LnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGZhZmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBFbnRlcnByaXNlIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjIwOWVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gRW50ZXJwcmlzZSBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmOTIzNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5zb3VyY2UgPSBvcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGQwMGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIEVudGVycHJpc2UgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpTVCBlbnRlcnByaXNlIFVJLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwZmFmYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIEVudGVycHJpc2UgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjA5ZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBFbnRlcnByaXNlIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWY2MDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNmYjU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGRjYmY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgRW50ZXJwcmlzZSBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1QgZW50ZXJwcmlzZSB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk4OTMzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdmMWVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjdmZTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wYXRjaCIKLSAgICAgIGxhYmVsPSJQYXRjaCBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMS41LjUucXVhbGlmaWVyIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MWNhYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmYzZkMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9kZXNjcmlwdGlvbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoZSBIRUFEIGJyYW5jaCBvZiB0aGlzIHBhdGNoIGZlYXR1cmUgaXMgaW50ZW50aW9uYWxseSBlbXB0eSwgCi10byBhdHRlbXB0IHRvIHRyeSBhbmQgYXZvaWQgY29uZnVzaW9uLiAKLQotUGxlYXNlIGxvYWQgdGhlIGNvcnJlY3QgdmVyc2lvbiBmcm9tIHRoZSBicmFuY2ggb2YgdGhlIHJlbGF0ZWQgcGF0Y2guCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFjN2JhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzk0YzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFdlYiBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIFdlYiBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTgyMGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbiIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUud2ViIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIyMjQiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjIyNCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5jb21tb24ucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc2YuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc2YuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5mYWNlc2NvbmZpZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc2Yuc3RhbmRhcmQudGFnc3VwcG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRjYmVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTg4ODE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJjNzk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgV2ViIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKU1QgV2ViIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGNiZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODg4MTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIxODNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcAotZmVhdHVyZXMKLXBsdWdpbnMKLWRldi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNmY1Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlMDQwMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLCBmZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MThkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBXZWIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIFdlYiB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YmY0Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNmLmRvYy5kZXYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwM2E2Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY5M2E5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzNiYzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPldUUCAxLjUuNSBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMS41LjUgUGF0Y2hlczwvaDE+Ci0KLTxoMj5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmU8L2gyPgotCi08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTQwMic+MTg1NDAyPC9hPi4gSlNQIHZhbGlkYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBkZWZhdWx0ZWQgYXR0cmlidXRlIGZsdXNoIG9uIGpzcDppbmNsdWRlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM3MTEnPjIwMzcxMTwvYT4uIHRhZ2xpYiBkZWNsYXJhdGlvbnMgaW4gSlNQIGZyYWdtZW50czwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MDUzJz4xOTkwNTM8L2E+LiBTeW50YXggZXJyb3JzIG91dHNpZGUgb2Ygc2NyaXB0aW5nIGFyZWFzIG5vdCByZXBvcnRlZDwvcD4KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTc0ODUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdUUCBQYXRjaCBmb3IganN0LndlYl91aQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLUEgcGF0Y2ggZm9yIHdzdC5odG1sLmNvcmUsIHNzZS51aSwgYW5kIGpzcC5jb3JlICBcblwKLVRoaXMgcGF0Y2ggZml4ZXMgcHJvYmxlbXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnczogXG5cCi1cblwKLUJ1ZyAxODU0MDIgSlNQIHZhbGlkYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBkZWZhdWx0ZWQgYXR0cmlidXRlIGZsdXNoIG9uIGpzcDppbmNsdWRlICBcblwKLVNlZSBidWcgMTg1NDAyIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NDAyKSkgXG5cCi1cblwKLUJ1ZyAyMDM3MTEgdGFnbGliIGRlY2xhcmF0aW9ucyBpbiBKU1AgZnJhZ21lbnRzICBcblwKLVNlZSBidWcgMjAzNzExIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNzExKSkgXG5cCi1cblwKLUJ1ZyAxOTkwNTMgU3ludGF4IGVycm9ycyBvdXRzaWRlIG9mIHNjcmlwdGluZyBhcmVhcyBub3QgcmVwb3J0ZWQgIFxuXAotU2VlIGJ1ZyAxOTkwNTMgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTkwNTMpKSBcblwKLVxuXAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1PY3RvYmVyLCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDNhMTVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuNS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUiIHZlcnNpb249IjEuNS41LnYyMDA3MDgwMjAxMjAtLTJQRDg4UThUOUZBSUFIIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNzY5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNDBlZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFdlYiBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBXZWIgVUkgZnVuY3Rpb25hbGl0eS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmUxOThhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmdlZiIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjEuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNmLmZhY2VzY29uZmlnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDdiYWI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzExYWNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M5NzNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5zb3VyY2UgPSBvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzE5ZTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgV2ViIFVJIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKU1QgV2ViIFVJLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwN2JhYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFdlYiBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTFhY2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFdlYiBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjUwMTA0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZGJlNDIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFdlYiBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1QgV2ViIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODQ1YTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxZWY0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uY29tbW9uPC9uYW1lPgotCTxjb21tZW50PkNvbnNpZGVyZWQgYXJjaGl2ZWQgdmVyc2lvbi4gQXMgZmFyIGFzIHdlIGtub3csIHRoaXMgYnVuZGxlIHdhcyBuZXZlciB1c2VkIGluIGEgcmVsZWFzZSwgYnV0IAotICAgIHRvIHBsYXkgaXQgc2FmZSwgd2lsbCBqdXN0IG51bGwgb3V0IEhFQUQsIGFuZCBsZWF2ZSB0aGUgcmVzdCBpbiBDVlMgYXMgaXMuIFRoZSBmaW5hbCB2ZXJzaW9uIGluIEhFQUQgCi0gICAgd2FzIHZlcnNpb25lZCB3aXRoIHYyMDA4MTIxMUZpbmFsVmVyc2lvbiBpbiBjYXNlIGl0J3MgZXZlciBkaXNjb3ZlcmVkIHRoaXMgbmVlZHMgdG8gYmUgcmVpbnN0YW50aWF0ZWQgaW4gSEVBRC4KLSAgICBOb3RlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bSBhbmQgb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbiBiYXNpY2FsbHkgZG8gd2hhdCB0aGlzIHdhcyBhdHRlbXB0aW5nIHRvIGRvLCBJIGJlbGlldmUuCi0gICAgU2VlIGJ1Z3MgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjQ0MSBhbmQgCi0gICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjU0OTwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5OGQ1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udWkvT0JTT0xFVEUtbW92ZWQgdG8gb3JnLmVjbGlwc2UuamVtLnVpIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udWkvT0JTT0xFVEUtbW92ZWQgdG8gb3JnLmVjbGlwc2UuamVtLnVpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnVpL09CU09MRVRFLW1vdmVkIHRvIG9yZy5lY2xpcHNlLmplbS51aQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RhN2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJiZWFuaW5mb0NvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4MTcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWJpbl9iZWFuaW5mb2NvbW1vbgotYmluX3ZtX2JlYW5pbmZvdm0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjZTc2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnJ0cC50b29scy5yb3NlLmJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PnJvc2U8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ydHAudG9vbHMucm9zZS50b29sbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1YjI2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLSNXZWQgTm92IDI2IDAwOjU1OjA1IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZTEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkYzE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEp1biAxNiAxMTowOTowOCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmluX3ZtX2JlYW5pbmZvdm0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjMDcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbgotQnVuZGxlLVZlcnNpb246IDIuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5jb21tb24sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTtyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLURlc2NyaXB0aW9uOiAlQnVuZGxlLURlc2NyaXB0aW9uLjAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2VlZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vY29tbW9uL0lCYXNlQmVhbkluZm9Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vY29tbW9uL0lCYXNlQmVhbkluZm9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2M2M3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL2NvbW1vbi9JQmFzZUJlYW5JbmZvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uY29tbW9uOwotCi0gCi0KLS8qKgotICogQ29uc3RhbnRzIGZvciB0aGUgQmFzZUJlYW5JbmZvIGZvciBhcmd1bWVudHMuIFRoaXMgY2xhc3MgaXMgY29tbW9uIGJldHdlZW4KLSAqIHRoZSBJREUgYW5kIHRoZSByZW1vdGUgdm0gc28gdGhhdCB0aGVzZSBjb25zdGFudHMgY2FuIGJlIHVzZWQgb24gYm90aCBzaWRlcy4KLSAqIDxwPgotICogVGhlc2UgYXJlIGNvbnN0YW50cyB1c2VkIGluIEZlYXR1cmVBdHRyaWJ1dGVzIGFzIGtleXMuIFRoZSBvdGhlciBzcGVjaWFsCi0gKiBjb25zdGFudHMgdGhhdCBhcmUgbm90IGtleXMgaW4gRmVhdHVyZUF0dHJpYnV0ZXMgYXJlIGxlZnQgaW4gQmFzZUJlYW5JbmZvCi0gKiBzaW5jZSB0aGV5IGFyZSBub3QgbmVlZGVkIG9uIGJvdGggc2lkZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCYXNlQmVhbkluZm9Db25zdGFudHMgewotCi0JLyoqCi0JICogSW5kaWNhdG9yIHVzZWQgdG8gZGVzY3JpYmUgYSBmYWN0b3J5IGluc3RhbnRpYXRpb24gcGF0dGVybi4gCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBCZWFuRGVzY3JpcHRvciBmb3IgdGhlIGZhY3RvcnkgY2xhc3MuIEl0IHdpbGwgYmUgY29tcGxldGUsIGluIHRoYXQgaWYgdGhpcwotCSAqIGZhY3RvcnkgaXMgaW5oZXJpdGVkIGZyb20gYW5vdGhlciBmYWN0b3J5LCBpdCBtdXN0IGNvcHkgaW4gdGhlIHN1cGVyY2xhc3MncyBmYWN0b3J5IGF0dHJpYnV0ZS4gVGhleSB3b24ndCBiZQotCSAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgaXMgYW4gT2JqZWN0W11bXS4gVGhlIGZpcnN0IGRpbWVuc2lvbiBhdCBpbmRleCB6ZXJvIGlzIGZvciB0b29sa2l0IHdpZGUgaW5mb3JtYXRpb24gYW5kIHRoZW4gaW5kZXhlcyBvbmUgYW5kIGJleW9uZCBhcmUgb25lIGZvciBlYWNoIGNyZWF0aW9uIG1ldGhvZCBuYW1lLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBpcyBmb3Igb25lIGVudHJ5Ci0JICogb2YgY2xhc3N3aWRlIGRhdGEgYW5kIHRoZSByZXN0IGFyZSB0aGUgZGF0YSBmb3IgCi0JICogZWFjaCBjcmVhdGlvbiBtZXRob2QuCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IGVudHJ5IGF0IE9iamVjdFswXSB3aWxsIGJlIDxjb2RlPntpbml0U3RyaW5nLCBpc1NoYXJlZCwgb25GcmVlZm9ybX08L2NvZGU+IHdoZXJlOgotCSAqIDxkbD4KLQkgKiA8ZHQ+aW5pdFN0cmluZwotCSAqIDxkZD5UaGUgaW5pdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHRvb2xraXQgaWYgaXQgbmVlZHMgb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0Ci0JICogbmVlZCBvbmUgKGkuZS4gYWxsIHN0YXRpYykgb3IgaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQuCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gYSBjb21wb25lbnQgaXMgZHJvcHBlZCBmcm9tIHRoZSBwYWxldHRlIHRoYXQgaXMgZm9yIGEgdG9vbGtpdCBjb21wb25lbnQuCi0JICogPGR0PmlzU2hhcmVkCi0JICogPGRkPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiBlYWNoIGNhbGwgdG8gdGhlIGNyZWF0aW9uIG1ldGhvZCBzaG91bGQgaGF2ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdG9vbGtpdC4gVGhpcyBtZWFucyB0aGF0IHRoZSB0b29sa2l0IG1hbmFnZXMgb25seQotCSAqIG9uZSBpbnN0YW5jZS4gVGhpcyBpcyBtb3JlIGxpa2UgYSBjb250cm9sbGVyIHRoYW4gYSB0b29sa2l0IGluIHRoaXMgY2FzZS4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc2hvdWxkCi0JICogdHJ5IHRvIHJldXNlIHRoZSB0b29sa2l0IG9mIHRoZSBwYXJlbnQgaWYgaXQgaGFzIG9uZSwgIG9yIGFueSBvdGhlciBmb3VuZCB0b29sa2l0IG9mIHRoZSBzYW1lIHR5cGUsIChpLmUuIGEgc3VidHlwZSB3aWxsIGJlIGFjY2VwdGFibGUpLiAgCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gYSBjb21wb25lbnQgaXMgZHJvcHBlZCBmcm9tIHRoZSBwYWxldHRlIHRoYXQgaXMgZm9yIGEgdG9vbGtpdCBjb21wb25lbnQuCi0JICogPGR0Pm9uRnJlZWZvcm0KLQkgKiA8ZGQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRvb2xraXQgaXMgY3JlYXRlZCB0aGF0IGl0IHNob3VsZCBhcHBlYXIgb24gdGhlIGZyZWVmb3JtIHN1cmZhY2UgdG8gYmUgc2VsZWN0YWJsZS4gVGhpcyB3b3VsZCBiZSBvZiB1c2UKLQkgKiBpZiB0aGUgdG9vbGtpdCBoYWQgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgc2V0LiBJZiB0aGUgdG9vbGtpdCBoYWQgbm8gcHJvcGVydGllcyB0aGVuIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBzZWxlY3RhYmxlIGFuZCBzaG91bGQKLQkgKiBub3QgYmUgb24gdGhlIGZyZWVmb3JtLiBVc2UgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIHRoYXQgY2FzZS4KLQkgKiA8L2RsPiAKLQkgKiA8cD4KLQkgKiBUaGUgc2Vjb25kIGFuZCBvdGhlciBlbnRyaWVzIG9mIHRoZSBhcnJheSBhcmUgb2YgdGhlIGZvcm1hdDoKLQkgKiA8Y29kZT57bWV0aG9kTmFtZSwgcmV0dXJuZWRDbGFzc25hbWUsIGlzU3RhdGljLCBPYmplY3RbXSwgLi4ufTwvY29kZT4gd2hlcmU6Ci0JICogPGRsPgotCSAqIDxkdD5tZXRob2ROYW1lCi0JICogPGRkPlRoZSBuYW1lIG9mIHRoZSBjcmVhdGlvbiBtZXRob2QgdGhpcyBlbnRyeSBpcyBmb3IgKFN0cmluZykuCi0JICogPGR0PnJldHVybmVkQ2xhc3NuYW1lCi0JICogPGRkPlRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZCAoU3RyaW5nKS4KLQkgKiA8ZHQ+aXNTdGF0aWMKLQkgKiA8ZGQ+PGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCwgPGNvZGU+Qm9vbGVhbi5GQUxTRTwvY29kZT4gaWYgbm90LiAKLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBkcm9wcGVkIGZyb20gdGhlIHBhbGV0dGUgdGhhdCBpcyBmb3IgYSB0b29sa2l0IGNvbXBvbmVudC4KLQkgKiA8ZHQ+T2JqZWN0W10KLQkgKiA8ZGQ+WmVybyBvciBtb3JlIGFycmF5cy4gVGhlIGFycmF5IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGZvciBlYWNoIG1ldGhvZCBzaWduYXR1cmUgdGhhdCBlYWNoCi0JICogcmVzcGVjdGl2ZSBhcmd1bWVudCBpcyBmb3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgYXJnIGlzIG5vdCBhIHByb3BlcnR5LiBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcnJheSBpZiB0aGVyZQotCSAqIGlzIG1vcmUgdGhhbiBvbmUgZmFjdG9yeSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSwgYW5kIHJldHVybnMgdGhlIHNhbWUgdHlwZSwgYnV0IHdoYXQgaXMgZGlmZmVyZW50IGlzIG9ubHkgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0JICogSWYgdGhlcmUgaXMgYQotCSAqIGZhY3RvcnkgbWV0aG9kIHRoYXQgaGFzIG5vIHByb3BlcnRpZXMgYXMgYXJndW1lbnRzIG9yIGhhcyBubyBhcmd1bWVudHMsIGRvbid0IGluY2x1ZGUgYW4gYXJyYXkgZm9yIGl0LiBGb3IgZXhhbXBsZSBpZiB0aGVyZSB3YXMgb25seSBvbmUgZmFjdG9yeSBtZXRob2QgYW5kIGl0IGhhZCBubwotCSAqIGFyZ3VtZW50cyB0aGVuIHRoZXJlIHdvdWxkIG5vdCBiZSBhbnkgYXJyYXlzLgotCSAqIEN1cnJlbnRseSBjYW5ub3QgaGFuZGxlIHdoZXJlIG1vcmUgdGhhbiBvbmUgbWV0aG9kIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGJ1dCBkaWZmZXJlbnQgdHlwZXMgZm9yIHRoZSBhcmd1bWVudHMuCi0JICogPC9kbD4KLQkgKiA8cD4KLQkgKiBBIGV4YW1wbGUgaXM6Ci0JICogPHByZT48Y29kZT4KLQkgKiBuZXcgT2JqZWN0W11bXSB7Ci0JICogICB7Im5ldyBhLmIuYy5Ub29sa2l0KFwiQUJDXCIpIiwgQm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFfSwKLQkgKiAgIHsiY3JlYXRlQnV0dG9uIiwgImEuYi5jLkJ1dHRvbiIsIEJvb2xlYW4uRkFMU0UsIG5ldyBPYmplY3RbXSB7InBhcmVudCIsICJ0ZXh0In0sIG5ldyBPYmplY3RbXSB7InBhcmVudCJ9fQotCSAqIH0KLQkgKiA8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogPHA+Ci0JICogVGhpcyBleGFtcGxlIHNheXMgdGhhdCB0aGlzIGNsYXNzIGlzIHRvb2xraXQgKGZhY3RvcnkpLiBUbyBjb25zdHJ1Y3QgYW4gaW5zdGVhZCB1c2UgPGNvZGU+Im5ldyBhLmIuYy5Ub29sa2l0KFwiQUJDXCIpIjwvY29kZT4gYW5kIGl0IGlzIHNoYXJlZAotCSAqIHdpdGggb3RoZXIgb2JqZWN0cyBjcmVhdGVkIGZyb20gdGhpcyBmYWN0b3J5IGluc3RhbmNlLiBBbHNvLCB0aGUgZmFjdG9yeSBtZXRob2QgaXMgImNyZWF0ZUJ1dHRvbiIsIHJldHVybnMgYW4gImEuYi5jLkJ1dHRvbiIsIGFuZCBpdCBpcwotCSAqIG5vdCBhIHN0YXRpYyBjYWxsIChpLmUuIHVzZSBhIHRvb2xraXQgaW5zdGFuY2UgdG8gY3JlYXRlIGl0KS4gSXQgaGFzIHR3byBmb3JtcyBvZiBmYWN0b3J5IG1ldGhvZHMuIE9uZSBpcyB0d28gYXJndW1lbnRzIHdoZXJlIHRoZSBmaXJzdAotCSAqIGFyZyBpcyB0aGUgcGFyZW50IHByb3BlcnR5IGFuZCB0aGUgc2Vjb25kIGFyZyBpcyB0aGUgdGV4dCBwcm9wZXJ0eS4gVGhlIG90aGVyIGZvcm0gaGFzIG9ubHkgb25lIGFyZ3VtZW50LCB0aGUgcGFyZW50IHByb3BlcnR5LgotCSAqIDxwPgotCSAqIFRoZSB3YXkgdGhpcyBpcyB1c2VkIGluIGEgcGFsZXR0ZSBlbnRyeSB0byBkcm9wIGEgbmV3IG9iamVjdCB0aGF0IGEgdG9vbGtpdCBjYW4gY3JlYXRlIGlzIHRvIGhhdmUgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybQotCSAqIDxjb2RlPnt0b29sa2l0OmNsYXNzbmFtZX0uZmFjdG9yeW1ldGhvZChhcmdzKTwvY29kZT4uIFNvIGZvciB0aGUgYWJvdmUgZXhhbXBsZSBpdCB3b3VsZCBiZSA8Y29kZT57dG9vbGtpdDphLmIuYy5Ub29sa2l0fS5jcmVhdGVCdXR0b24ocGFyZW50KTwvY29kZT4uCi0JICogVGhlIGNsYXNzbmFtZSA8Yj5tdXN0PC9iPiBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzIGl0IG11c3QgdXNlIHRoZSAiJCIgaW5zdGVhZCBvZiAiLiIgZm9yIHRoZSBuYW1lLCBpLmUuIGEuYi5jLlRvb2xraXQuSW5uZXJGYWN0b3J5Ci0JICogd291bGQgYmUgYS5iLmMuVG9vbGtpdCRJbm5lckZhY3RvcnkuIAotCSAqIDxwPgotCSAqIDxiPk5PVEU6PC9iPiBUaGlzIGlzIGFuIEVYUEVSSU1FTlRBTCBBUEkgYW5kIGNhbiBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB1bnRpbCBjb21taXR0ZWQuICAKLQkgKiAgIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NSRUFUSU9OID0gIkZBQ1RPUllfQ1JFQVRJT04iOy8vJE5PTi1OTFMtMSQKLQkJCi0JLyoqCi0JICogQ2F0ZWdvcnkgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIENhdGVnb3J5IGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBjYXRlZ29yeSBpcyBzdG9yZWQgaW4gYQotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRW51bWVyYXRpb24gdmFsdWVzIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLiBFbnVtZXJhdGlvbiB2YWx1ZXMgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlCi0JICogZW51bWVyYXRpb24gdmFsdWVzIGFyZSBzdG9yZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRJT05WQUxVRVMgPSAiZW51bWVyYXRpb25WYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUga2V5cyBmb3IgaWNvbiBmaWxlIG5hbWVzLCBOT1QgVEhFIGphdmEuYXd0Lmljb24ga2V5LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05DT0xPUjE2WDE2VVJMID0gIklDT05fQ09MT1JfMTZ4MTZfVVJMIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OQ09MT1IzMlgzMlVSTCA9ICJJQ09OX0NPTE9SXzMyeDMyX1VSTCI7IC8vJE5PTi1OTFMtMSQgICAgIAkvLyBOb3QgdXNlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05NT05PMTZYMTZVUkwgPSAiSUNPTl9NT05PXzE2eDE2X1VSTCI7IC8vJE5PTi1OTFMtMSQgICAgICAgIAkvLyBOb3QgdXNlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05NT05PMzJYMzJVUkwgPSAiSUNPTl9NT05PXzMyeDMyX1VSTCI7IC8vJE5PTi1OTFMtMSQJCQkvLyBOb3QgdXNlZAotCi0KLQkvKioKLQkgKiBGZWF0dXJlQXR0cmlidXRlIGtleSBmb3IgZXhwbGljaXQgcHJvcGVydHkgY2hhbmdlcy4gVGhlIHZhbHVlIGlzIGEgQm9vbGVhbi4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgQ3VzdG9taXplIEJlYW4gY3VzdG9taXplciBzdXBwbGllZCBieSB0aGUgQmVhbkluZm8gd2lsbCBpbmRpY2F0ZSB3aGljaAotCSAqIHByb3BlcnRpZXMgaXQgaGFzIGNoYW5nZWQgdGhyb3VnaCBmaXJpbmcge0BsaW5rIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudH0gaW5zdGVhZCBvZiB0aGUgCi0JICogVmlzdWFsIEVkaXRvciBhdXRvbWF0aWNhbGx5IHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIHNldCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaWYgbm90IHNldCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBMSUNJVF9QUk9QRVJUWV9DSEFOR0UgPSAiRVhQTElDSVRfUFJPUEVSVFlfQ0hBTkdFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVXNlZCBieSBWaXN1YWwgRWRpdG9yIGFzIGZlYXR1cmUgYXR0cmlidXRlIGtleS92YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IGl0IG11c3QgY3JlYXRlIGFuIGltcGxpY2l0IHNldHRpbmcgb2YgYSBwcm9wZXJ0eShzKS4KLQkgKiBGb3IgZXhhbXBsZSB7QGxpbmsgamF2YXguc3dpbmcuSkZyYW1lI2dldENvbnRlbnRQYW5lKCl9LiBUaGVyZSBtdXN0IGJlIGEgY29udGVudCBwYW5lCi0JICogc2V0IGluIHRoZSBWRSBtb2RlbCBzbyB0aGF0IHVzZXJzIGNhbiBkcm9wIHRoZSBjb21wb25lbnRzIG9uIGl0LiBTZXR0aW5nIHRoaXMgaGVyZQotCSAqIG1lYW5zIHRoYXQgdGhlIGRlZmF1bHQgY29udGVudCBwYW5lIGZyb20gdGhlIEpGcmFtZSB3aWxsIHNob3cgdXAgaW4gdGhlIGVkaXRvciB0byB1c2UuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUgaW4gdGhhdCBub3QgYWxsIHByb3BlcnRpZXMgYXJlIHJlcXVpcmVkIHRvIGFsd2F5cyBzaG93IHVwLgotCSAqIFRoZXkgY2FuIGJlIHF1ZXJpZWQgd2hlbiBuZWVkZWQuCi0JICogPHA+Ci0JICogVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSB7QGxpbmsgU3RyaW5nfSBmb3Igb25lIHByb3BlcnR5LiBPciBpdCBjYW4gYmUgYSB7QGxpbmsgU3RyaW5nW119IGZvciBtb3JlCi0JICogdGhhbiBvbmUgcHJvcGVydHkuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfSU1QTElDSVRfUFJPUEVSVElFUyA9ICJyZXF1aXJlZEltcGxpY2l0UHJvcGVydGllcyI7CS8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vQmVhblJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vQmVhblJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjRiMGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0JlYW5SZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBCZWFuRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEJlYW5EZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhblJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTkyMDY2NEw7Ci0JCi0JcHVibGljIFN0cmluZyBjdXN0b21pemVyQ2xhc3NOYW1lOwotCXB1YmxpYyBib29sZWFuIG1lcmdlSW5oZXJpdGVkUHJvcGVydGllczsKLQlwdWJsaWMgYm9vbGVhbiBtZXJnZUluaGVyaXRlZE9wZXJhdGlvbnM7Ci0JcHVibGljIGJvb2xlYW4gbWVyZ2VJbmhlcml0ZWRFdmVudHM7Ci0JLyoqCi0JICogTmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGFyZSB0byBub3QgYmUgaW5oZXJpdGVkIGluIGdldEFsbFByb3BlcnRpZXMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgcHJvcGVydGllcy4KLQkgKiBJZiBhbGwgaW5oZXJpdGVkIG9yIG1lcmdlSW5oZXJpdGVkUHJvcGVydGllcyBpcyBmYWxzZSwgdGhlbiB0aGUgZmllbGQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gU2F2ZSBzcGFjZSB0aGF0IHdheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lczsKLQkvKioKLQkgKiBOYW1lcyBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIHRvIG5vdCBiZSBpbmhlcml0ZWQgaW4gZ2V0RUFsbE9wZXJhdGlvbnMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgb3BlcmF0aW9ucy4gCi0JICogSWYgYWxsIGFyZSBpbmhlcml0ZWQgb3IgaWYgbWVyZ2VJbmhlcml0ZWRPcGVyYXRpb25zIGlzIGZhbHNlLCB0aGVuIHRoZSBmaWVsZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBTYXZlIHNwYWNlIHRoYXQgd2F5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBub3RJbmhlcml0ZWRPcGVyYXRpb25OYW1lczsKLQkvKioKLQkgKiBOYW1lcyBvZiBldmVudHMgdGhhdCBhcmUgdG8gbm90IGJlIGluaGVyaXRlZCBpbiBnZXRBbGxFdmVudHMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgZXZlbnRzLgotCSAqIElmIGFsbCBhcmUgaW5oZXJpdGVkIG9yIGlmIG1lcmdlSW5oZXJpdGVkRXZlbnRzIGlzIGZhbHNlLCB0aGVuIHRoZSBmaWVsZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBTYXZlIHNwYWNlIHRoYXQgd2F5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBub3RJbmhlcml0ZWRFdmVudE5hbWVzOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9FdmVudFNldFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRXZlbnRTZXRSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzNTM4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9FdmVudFNldFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEV2ZW50U2V0RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEV2ZW50U2V0RGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50U2V0UmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MDc3MzQyMEw7Ci0JCi0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgYWRkTGlzdGVuZXJNZXRob2Q7Ci0JcHVibGljIFN0cmluZyBldmVudEFkYXB0ZXJDbGFzc05hbWU7Ci0JcHVibGljIE1ldGhvZFJlY29yZFtdIGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnM7Ci0JcHVibGljIFN0cmluZyBsaXN0ZW5lclR5cGVOYW1lOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCXB1YmxpYyBib29sZWFuIGluRGVmYXVsdEV2ZW50U2V0OwotCXB1YmxpYyBib29sZWFuIHVuaWNhc3Q7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBiNTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1hcFR5cGVzOwotCi0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgdmFsdWUgZm9yIGEgRmVhdHVyZUF0dHJpYnV0ZS4gSXQgd3JhcHBlcnMgdGhlIHRydWUgamF2YSBvYmplY3QuCi0gKiBVc2UgdGhlIGdldE9iamVjdCBtZXRob2QgdG8gZ2V0IHRoZSBqYXZhIHZhbHVlLgotICogPHA+Ci0gKiBXZSBjYW4gb25seSByZXByZXNlbnQgU3RyaW5ncywgcHJpbWl0aXZlcywgYW5kIGFycmF5cy4gKFByaW1pdGl2ZXMgd2lsbCBjb252ZXJ0ZWQKLSAqIHRvIHRoZWlyIHdyYXBwZXIgY2xhc3MgKGUuZy4gTG9uZyksIGFuZCBieXRlLCBzaG9ydCwgYW5kIGludCB3aWxsIG1vdmUgdXAgdG8gTG9uZywKLSAqIGFuZCBmbG9hdCB3aWxsIG1vdmUgdXAgdG8gRG91YmxlKS4gIEFuZCBhbnkga2luZCBvZiB2YWxpZCBhcnJheSBvbiB0aGUgamF2YSBCZWFuSW5mbyBzaWRlCi0gKiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBPYmplY3QgYXJyYXkgb24gdGhlIElERSBzaWRlLiBXZSBkb24ndCBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIGFsbG93IG1vcmUgY29tcGxleCBvYmplY3RzIAotICogYmVjYXVzZSB0aGUgSURFIG1heSBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMgYXZhaWxhYmxlIHRvIGl0IHRoYXQgCi0gKiB0aGUgQmVhbkluZm8gbWF5IG9mIGhhZCBhdmFpbGFibGUgdG8gaXQuIEludmFsaWQgb2JqZWN0cyB3aWxsIGJlIHJlcHJlc2VudGVkCi0gKiBieSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkludmFsaWRPYmplY3R9LgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4KLSAqIENsYXNzIG9iamVjdHMgdGhhdCBhcmUgdmFsdWVzIG9mIEZlYXR1cmUgYXR0cmlidXRlcyBvbiB0aGUgamF2YSBCZWFuSW5mbyBzaWRlIHdpbGwgYmUKLSAqIGNvbnZlcnRlZCB0byBzaW1wbGUgc3RyaW5ncyBjb250YWluaW5nIHRoZSBjbGFzc25hbWUgd2hlbiBtb3ZlZCB0byB0aGUgY2xpZW50IChJREUpIHNpZGUuCi0gKiBUaGF0IGlzIGJlY2F1c2UgdGhlIGNsYXNzZXMgcHJvYmFibHkgd2lsbCBub3QgYmUgYXZhaWxhYmxlIG9uIHRoZSBJREUgc2lkZSwgYnV0IGNhbiBiZQotICogdXNlZCB0byByZWNvbnN0cnVjdCB0aGUgY2xhc3Mgd2hlbiB1c2VkIGJhY2sgb24gdGhlIGphdmEgdm0gc2lkZS4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCi0JcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBpbnRlcm5hbFZhbHVlOwotCXByaXZhdGUgYm9vbGVhbiBpbXBsaWNpdFZhbHVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU3MTc2MzQ4NDRMOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5pdCBzdHJpbmcuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjbGllbnRzLgotCSAqIEBwYXJhbSBpbml0U3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgaW5pdFN0cmluZykgewotCQkvLyBVc2UgdGhlIGluaXQgc3RyaW5nIHRvIGNyZWF0ZSB0aGUgdmFsdWUuIFRoaXMgaXMgb3VyCi0JCS8vIG93biBzaG9ydC1oYW5kIGZvciB0aGlzLgotCQlpZiAoaW5pdFN0cmluZy5zdGFydHNXaXRoKElNUExJQ0lUKSkgewotCQkJc2V0SW1wbGljaXRWYWx1ZSh0cnVlKTsKLQkJCWluaXRTdHJpbmcgPSBpbml0U3RyaW5nLnN1YnN0cmluZyhJTVBMSUNJVC5sZW5ndGgoKSk7Ci0JCX0KLQkJdmFsdWUgPSBwYXJzZVN0cmluZyhpbml0U3RyaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gY3VzdG9tZXIgd2FudHMgdG8gZmx1ZmYgb25lIHVwLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoKSB7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5zZXRJbnRlcm5hbFZhbHVlKG51bGwpOwotCX0KLQkJCi0JLyoqCi0JICogU2V0IHRoZSBpbnRlcm5hbCB2YWx1ZS4KLQkgKiBAcGFyYW0gaW50ZXJuYWxWYWx1ZSBUaGUgaW50ZXJuYWxWYWx1ZSB0byBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxWYWx1ZShPYmplY3QgaW50ZXJuYWxWYWx1ZSkgewotCQl0aGlzLmludGVybmFsVmFsdWUgPSBpbnRlcm5hbFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGludGVybmFsIHZhbHVlLiBJdCBpcyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG1hc3NhZ2VkIGludG8gYW4gZWFzaWVyIHRvIHVzZSBmb3JtCi0JICogaW4gdGhlIElERS4gSXQgd2lsbCBub3QgYmUgc2VyaWFsaXplZCBvdXQuIEl0IHdpbGwgbm90IGJlIHJlY29uc3RydWN0ZWQgZnJvbSBhbiBpbml0IHN0cmluZy4KLQkgKiA8cD4gCi0JICogSXQgZG9lcyBub3QgbmVlZCB0byBiZSB1c2VkLiBJdCB3aWxsIGJlIGNsZWFyZWQgaWYKLQkgKiBhIG5ldyB2YWx1ZSBpcyBzZXQuIEZvciBleGFtcGxlLCBpZiB0aGUgdmFsdWUgaXMgYSBjb21wbGljYXRlZCBhcnJheSAoYmVjYXVzZSB5b3UgY2FuJ3QgaGF2ZQotCSAqIHNwZWNpYWwgY2xhc3NlcyBpbiB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBCZWFuSW5mbyBzaWRlKSB0aGUgZmlyc3QgdXNhZ2Ugb2YgdGhpcyB2YWx1ZSBjYW4KLQkgKiBiZSB0cmFuc2xhdGVkIGludG8gYW4gZWFzaWVyIGZvcm0gdG8gdXNlLCBzdWNoIGFzIGEgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW50ZXJuYWxWYWx1ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEludGVybmFsVmFsdWUoKSB7Ci0JCXJldHVybiBpbnRlcm5hbFZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWlmIChpc0ltcGxpY2l0VmFsdWUoKSkKLQkJCW91dC5hcHBlbmQoSU1QTElDSVQpOwotCQltYWtlU3RyaW5nKHZhbHVlLCBvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byB0YWtlIHRoZSBvYmplY3QgYW5kIHR1cm4gaXQgaW50byB0aGUKLQkgKiBzdHJpbmcgZm9ybSB0aGF0IGlzIHJlcXVpcmVkIGZvciBFTUYgc2VyaWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseS4gSXQgY2FuIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IAotCSAqIHB1cnBvc2VzIGJ5IGNsaWVudHMsIGJ1dCB0aGV5IHdvdWxkIG5vdCBoYXZlIGFueSByZWFsCi0JICogcnVudGltZSBuZWVkIGZvciB0aGlzLgotCSAqIDxwPgotCSAqIE91dHB1dCBmb3JtYXQgd291bGQgYmUgKHRoZXJlIHdvbid0IGJlIGFueSBuZXdsaW5lcyBpbiB0aGUgYWN0dWFsIHN0cmluZykKLQkgKiA8cHJlPgotCSAqICAgU3RyaW5nOiAienh2enh2IgotCSAqICAgTnVtYmVyOiBudW1iZXIKLQkgKiAgIEJvb2xlYW46IHRydWUgb3IgZmFsc2UKLQkgKiAgIENoYXJhY3RlcjogJ2MnCi0JICogICBudWxsOiBudWxsCi0JICogCi0JICogICBBcnJheTogKGFsbCBhcnJheXMgd2lsbCBiZSB0dXJuZWQgaW50byBPYmplY3RbXSkKLQkgKiAgICAgW2RpbV17ZTEsIGUyfQotCSAqICAgICBbZGltMV1bZGltMl17W2RpbTFhXXtlMSwgZTJ9LCBbZGltMmFde2UzLCBlNH19Ci0JICogICB3aGVyZSBlbiBhcmUgb2JqZWN0cyB0aGF0IGZvbGxvdyB0aGUgcGF0dGVybiBmb3Igc2luZ2xlIG91dHB1dCBhYm92ZS4KLQkgKiAKLQkgKiAgIEFueSBpbnZhbGlkIG9iamVjdCAoaS5lLiBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGhhbmRsZSkgd2lsbCBiZToKLQkgKiAgICAgSU5WCi0JICogCi0JICogICBBcnJheXMgb2YgaW52YWxpZCB0eXBlcyAobm90IE9iamVjdCwgU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4sIENoYXJhY3RlciwKLQkgKiAgICAgb3IgcHJpbWl0aXZlcykgd2lsbCBiZSBtYXJrZWQgYXMgSU5WLgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gc2VyaWFsaXplZCBmb3JtIGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCW1ha2VTdHJpbmcodmFsdWUsIG91dCk7Ci0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUVVPVEUgPSBQYXR0ZXJuLmNvbXBpbGUoIlwiIik7CS8vIFBhdHRlcm4gZm9yIHNlYXJjaGluZyBmb3IgZG91YmxlLXF1b3RlLiBNYWtlIGl0IHN0YXRpYyBzbyBkb24ndCB3YXN0ZSB0aW1lIGNvbXBpbGluZyBlYWNoIHRpbWUuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTCA9ICJudWxsIjsJLy8gT3V0cHV0IHN0cmluZyBmb3IgbnVsbCAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSUQgPSAiSU5WIjsJLy8gSW52YWxpZCBvYmplY3QgZmxhZy4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMSUNJVCA9ICJpbXBsaWNpdCwiOwkvLyBJbXBsaWNpdCBmbGFnLiAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBVc2VkIGZvciByZWN1cnNpdmUgYnVpbGRpbmcgb2YgdGhlIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VTdHJpbmcoT2JqZWN0IHZhbHVlLCBTdHJpbmdCdWZmZXIgb3V0KSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJb3V0LmFwcGVuZChOVUxMKTsKLQkJZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBDbGFzcykgewotCQkJLy8gU3RyaW5nOiAic3RyaW5nIiBvciAic3RyaW5nXCJzdHJpbmdlbmQiIGlmIHN0ciBpbmNsdWRlZCBhIGRvdWJsZS1xdW90ZS4KLQkJCW91dC5hcHBlbmQoJyInKTsKLQkJCS8vIElmIGNsYXNzLCB0dXJuIHZhbHVlIGludG8gdGhlIGNsYXNzbmFtZS4KLQkJCVN0cmluZyBzdHIgPSB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyA/IChTdHJpbmcpIHZhbHVlIDogKChDbGFzcykgdmFsdWUpLmdldE5hbWUoKTsKLQkJCWlmIChzdHIuaW5kZXhPZignIicpICE9IC0xKSB7Ci0JCQkJLy8gUmVwbGFjZSBkb3VibGUtcXVvdGUgd2l0aCBlc2NhcGUgZG91YmxlLXF1b3RlIHNvIHdlIGNhbiBkaXN0aW5xdWlzaCBpdCBmcm9tIHRoZSB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUuCi0JCQkJb3V0LmFwcGVuZChRVU9URS5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiXFxcXFwiIikpOwkvLyBEb24ndCBrbm93IHdoeSB3ZSBuZWVkIHRoZSBiYWNrLXNsYXNoIHRvIGJlIGRvdWJsZWQgZm9yIHJlcGxhY2VhbGwsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb3RoZXJ3aXNlLiAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UKLQkJCQlvdXQuYXBwZW5kKHN0cik7Ci0JCQlvdXQuYXBwZW5kKCdcIicpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkvLyBXaWxsIGdvIG91dCBhcyBlaXRoZXIgYSBpbnRlZ2VyIG51bWJlciBvciBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gCi0JCQkvLyBXaGVuIHJlYWQgYmFjayBpbiBpdCB3aWxsIGJlIGVpdGhlciBhIExvbmcgb3IgYSBEb3VibGUuCi0JCQlvdXQuYXBwZW5kKHZhbHVlKTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCS8vIEl0IHdpbGwgZ28gb3V0IGFzIGVpdGhlciB0cnVlIG9yIGZhbHNlLgotCQkJb3V0LmFwcGVuZCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCS8vIENoYXJhY3RlcjogJ2MnIG9yICdcJycgaWYgY2hhciB3YXMgYSBxdW90ZS4KLQkJCW91dC5hcHBlbmQoJ1wnJyk7Ci0JCQlDaGFyYWN0ZXIgYyA9IChDaGFyYWN0ZXIpIHZhbHVlOwotCQkJaWYgKGMuY2hhclZhbHVlKCkgIT0gJ1wnJykKLQkJCQlvdXQuYXBwZW5kKGMuY2hhclZhbHVlKCkpOwotCQkJZWxzZQotCQkJCW91dC5hcHBlbmQoIlxcJyIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQuYXBwZW5kKCdcJycpOwotCQl9IGVsc2UgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkvLyBIYW5kbGUgYXJyYXkgZm9ybWF0LgotCQkJQ2xhc3MgdHlwZSA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQkvLyBTZWUgaWYgZmluYWwgdHlwZSBpcyBhIHZhbGlkIHR5cGUuCi0JCQlDbGFzcyBmdCA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaW50IGRpbXMgPSAxOwotCQkJd2hpbGUgKGZ0LmlzQXJyYXkoKSkgewotCQkJCWRpbXMrKzsKLQkJCQlmdCA9IGZ0LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCX0KLQkJCWlmIChmdCA9PSBPYmplY3QuY2xhc3MgfHwgZnQgPT0gU3RyaW5nLmNsYXNzIHx8IGZ0ID09IEJvb2xlYW4uY2xhc3MgfHwgZnQgPT0gQ2hhcmFjdGVyLmNsYXNzIHx8IGZ0LmlzUHJpbWl0aXZlKCkgfHwgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZnQpKSB7Ci0JCQkJLy8gW2xlbmd0aF1bXVtdIHsuLi4ufQotCQkJCW91dC5hcHBlbmQoJ1snKTsKLQkJCQlpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbHVlKTsgCi0JCQkJb3V0LmFwcGVuZChsZW5ndGgpOwotCQkJCW91dC5hcHBlbmQoJ10nKTsKLQkJCQl3aGlsZSgtLWRpbXMgPiAwKSB7Ci0JCQkJCW91dC5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJb3V0LmFwcGVuZCgneycpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlvdXQuYXBwZW5kKCcsJyk7Ci0JCQkJCW1ha2VTdHJpbmcoQXJyYXkuZ2V0KHZhbHVlLCBpKSwgb3V0KTsKLQkJCQl9Ci0JCQkJb3V0LmFwcGVuZCgnfScpOwotCQkJfSBlbHNlCi0JCQkJb3V0LmFwcGVuZChJTlZBTElEKTsJLy8gQW55IG90aGVyIGtpbmQgb2YgYXJyYXkgaXMgaW52YWxpZC4KLQkJfSBlbHNlIHsKLQkJCW91dC5hcHBlbmQoSU5WQUxJRCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byB0YWtlIHRoZSBzdHJpbmcgaW5wdXQgZnJvbSBFTUYgc2VyaWFsaXphdGlvbiBhbmQgdHVybiBpdAotCSAqIGludG8gYW4gT2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5LiBJdCBjYW4gYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgCi0JICogcHVycG9zZXMgYnkgY2xpZW50cywgYnV0IHRoZXkgd291bGQgbm90IGhhdmUgYW55IHJlYWwKLQkgKiBydW50aW1lIG5lZWQgZm9yIHRoaXMuCi0JICogPHA+Ci0JICogVGhlIG9iamVjdCB3aWxsIGJlIGFuIG9iamVjdCwgbnVsbCwgb3IgYW4gT2JqZWN0IGFycmF5LiBBbnkgdmFsdWUKLQkgKiB0aGF0IGlzIGludmFsaWQgd2lsbCBiZSBzZXQgdG8gdGhlIHtAbGluayBJbnZhbGlkT2JqZWN0I0lOU1RBTkNFfSBzdGF0aWMKLQkgKiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIG9iamVjdCBkZWNvZGVkIGZyb20gdGhlIGlucHV0LgotCSAqIAotCSAqIEBzZWUgI21ha2VTdHJpbmcoT2JqZWN0KQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlU3RyaW5nKFN0cmluZyBpbnB1dCkgewotCQlyZXR1cm4gcGFyc2VTdHJpbmcobmV3IFN0cmluZ1BhcnNlcihpbnB1dCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdQYXJzZXIgewotCQlwcml2YXRlIGludCBuZXh0PTA7Ci0JCXByaXZhdGUgaW50IGxlbmd0aDsKLQkJcHJpdmF0ZSBTdHJpbmcgaW5wdXQ7Ci0JCQotCQlwdWJsaWMgU3RyaW5nUGFyc2VyKFN0cmluZyBpbnB1dCkgewotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQkJdGhpcy5sZW5ndGggPSBpbnB1dC5sZW5ndGgoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3RyaW5nUGFyc2VyOiBcIiIraW5wdXQrJyInOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNraXBXaGl0ZXNwYWNlKCkgewotCQkJd2hpbGUobmV4dCA8IGxlbmd0aCkgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShpbnB1dC5jaGFyQXQobmV4dCsrKSkpIHsKLQkJCQkJbmV4dC0tOwkvLyBQdXQgaXQgYmFjayBhcyBub3QgeWV0IHJlYWQgc2luY2UgaXQgaXMgbm90IHdoaXRlc3BhY2UuCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBpbmRleAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQKLQkJICogQHJldHVybiBpbnB1dCBsZW5ndGgKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gbGVuZ3RoOwotCQl9Ci0JCQotCQkKLQkJLyoqCi0JCSAqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGFuZCBnbyB0byBuZXh0LgotCQkgKiBAcmV0dXJuIGN1cnJlbnQgY2hhcmFjdGVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBjaGFyIHJlYWQoKSB7Ci0JCQlyZXR1cm4gbmV4dDxsZW5ndGggPyBpbnB1dC5jaGFyQXQobmV4dCsrKSA6IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBCYWNrdXAgdGhlIHBhcnNlciBvbmUgY2hhcmFjdGVyLgotCQkgKiAKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgYmFja3VwKCkgewotCQkJaWYgKC0tbmV4dCA8IDApCi0JCQkJbmV4dCA9IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBQZWVrIGF0IHRoZSBjaGFyIGF0IHRoZSBuZXh0IGluZGV4LCBidXQgZG9uJ3QgaW5jcmVtZW50IGFmdGVyd2FyZHMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGNoYXIgcGVlaygpIHsKLQkJCXJldHVybiBuZXh0PGxlbmd0aCA/IGlucHV0LmNoYXJBdChuZXh0KSA6IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBIYXZlIHdlIHJlYWQgdGhlIGxhc3QgY2hhci4KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWFkIGxhc3QgY2hhci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYXRFbmQoKSB7Ci0JCQlyZXR1cm4gbmV4dD49bGVuZ3RoOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmVzZXQgdG8gdGhlIGdpdmVuIG5leHQgaW5kZXguCi0JCSAqIEBwYXJhbSBuZXh0SW5kZXggdGhlIG5leHQgaW5kZXggdG8gZG8gYSByZWFkIGF0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNldChpbnQgbmV4dEluZGV4KSB7Ci0JCQlpZiAobmV4dEluZGV4PD1sZW5ndGgpCi0JCQkJbmV4dCA9IG5leHRJbmRleDsKLQkJCWVsc2UKLQkJCQluZXh0ID0gbGVuZ3RoOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2tpcCB0aGUgbmV4dCBudW1iZXIgb2YgY2hhcnMuCi0JCSAqIEBwYXJhbSBza2lwIG51bWJlciBvZiBjaGFycyB0byBza2lwLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBza2lwKGludCBza2lwKSB7Ci0JCQlpZiAoKG5leHQrPXNraXApID4gbGVuZ3RoKQotCQkJCW5leHQgPSBsZW5ndGg7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHN0cmluZyBpbnB1dC4KLQkJICogQHJldHVybiB0aGUgc3RyaW5nIGlucHV0Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXQoKSB7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JLyoKLQkgKiBTdGFydGluZyBhIHBhcnNlIGZvciBhbiBvYmplY3QgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqIFJldHVybiB0aGUgcGFyc2VkIG9iamVjdCBvciBJbnZhbGlkT2JqZWN0IGlmIG5vCi0JICogb2JqZWN0IG9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmdQYXJzZXIgcGFyc2VyKSB7Ci0JCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQlpZiAoIXBhcnNlci5hdEVuZCgpKSB7Ci0JCQljaGFyIGMgPSBwYXJzZXIucmVhZCgpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCS8vIFN0YXJ0IG9mIGEgcXVvdGVkIHN0cmluZy4gU2NhbiBmb3IgY2xvc2luZyBxdW90ZSwgaWdub3JpbmcgZXNjYXBlZCBxdW90ZXMuCi0JCQkJCWludCBzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKTsJLy8gSW5kZXggb2YgZmlyc3QgY2hhciBhZnRlciAnIicKLQkJCQkJY2hhcltdIGRlcXVvdGVkID0gbnVsbDsJLy8gVXNlZCBpZiB0aGVyZSBpcyBhbiBlc2NhcGVkIHF1b3RlLiBUaGF0IGlzIHRoZSBvbmx5IHRoaW5nIHdlIHN1cHBvcnQgZXNjYXBlIG9uLCBxdW90ZXMuCi0JCQkJCWludCBkZXF1b3RlSW5kZXggPSAwOwotCQkJCQl3aGlsZSAoIXBhcnNlci5hdEVuZCgpKSB7Ci0JCQkJCQljaGFyIGNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCWlmIChjYyA9PSAnIicpIHsKLQkJCQkJCQkvLyBJZiB3ZSBkaWRuJ3QgZGVxdW90ZSwgdGhlbiBqdXN0IGRvIHN1YnN0cmluZy4KLQkJCQkJCQlpZiAoZGVxdW90ZWQgPT0gbnVsbCkKLQkJCQkJCQkJcmV0dXJuIHBhcnNlci5nZXRJbnB1dCgpLnN1YnN0cmluZyhzdGFydCwgcGFyc2VyLm5leHRJbmRleCgpLTEpOwkvLyBuZXh0IGlzIGNoYXIgYWZ0ZXIgJyInLCBzbyBlbmQgb2Ygc3RyaW5nIGluZGV4IGlzIGluZGV4IG9mICciJwotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBXZSBoYXZlIGEgZGVxdW90ZWQgc3RyaW5nLiBTbyB0dXJuIGludG8gYSBzdHJpbmcuCi0JCQkJCQkJCS8vIEdhdGhlciB0aGUgbGFzdCBncm91cAotCQkJCQkJCQlpbnQgZW5kTmR4ID0gcGFyc2VyLm5leHRJbmRleCgpLTE7Ci0JCQkJCQkJCXBhcnNlci5nZXRJbnB1dCgpLmdldENoYXJzKHN0YXJ0LCBlbmROZHgsIGRlcXVvdGVkLCBkZXF1b3RlSW5kZXgpOwotCQkJCQkJCQlkZXF1b3RlSW5kZXgrPSAoZW5kTmR4LXN0YXJ0KTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVxdW90ZWQsIDAsIGRlcXVvdGVJbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChjYyA9PSAnXFwnKSB7Ci0JCQkJCQkJLy8gV2UgaGFkIGFuIGVzY2FwZSwgc2VlIGlmIG5leHQgaXMgYSBxdW90ZS4gSWYgaXQgaXMgd2UgbmVlZCB0byBzdHJpcCBvdXQgdGhlICdcJy4KLQkJCQkJCQlpZiAocGFyc2VyLnBlZWsoKSA9PSAnIicpIHsKLQkJCQkJCQkJaWYgKGRlcXVvdGVkID09IG51bGwpIHsKLQkJCQkJCQkJCWRlcXVvdGVkID0gbmV3IGNoYXJbcGFyc2VyLmdldExlbmd0aCgpXTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpbnQgZW5kTmR4ID0gcGFyc2VyLm5leHRJbmRleCgpLTE7Ci0JCQkJCQkJCXBhcnNlci5nZXRJbnB1dCgpLmdldENoYXJzKHN0YXJ0LCBlbmROZHgsIGRlcXVvdGVkLCBkZXF1b3RlSW5kZXgpOwkvLyBHZXQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nICdcJwotCQkJCQkJCQlkZXF1b3RlSW5kZXgrPSAoZW5kTmR4LXN0YXJ0KTsKLQkJCQkJCQkJLy8gTm93IGFsc28gYWRkIGluIHRoZSBlc2NhcGVkIHF1b3RlLgotCQkJCQkJCQlkZXF1b3RlZFtkZXF1b3RlSW5kZXgrK10gPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQlzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKTsJLy8gTmV4dCBncm91cCBpcyBmcm9tIG5leHQgaW5kZXguCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwkvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnLSc6Ci0JCQkJY2FzZSAnMCc6Ci0JCQkJY2FzZSAnMSc6Ci0JCQkJY2FzZSAnMic6Ci0JCQkJY2FzZSAnMyc6Ci0JCQkJY2FzZSAnNCc6Ci0JCQkJY2FzZSAnNSc6Ci0JCQkJY2FzZSAnNic6Ci0JCQkJY2FzZSAnNyc6Ci0JCQkJY2FzZSAnOCc6Ci0JCQkJY2FzZSAnOSc6Ci0JCQkJCS8vIFBvc3NpYmxlIG51bWJlci4KLQkJCQkJLy8gU2NhbiB0byBuZXh0IG5vbi1kaWdpdCwgb3Igbm90IHBhcnQgb2YgdmFsaWQgbnVtYmVyLgotCQkJCQlib29sZWFuIG51bWJlckNvbXBsZXRlID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZmxvYXRUeXBlID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZm91bmRFID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZm91bmRFU2lnbiA9IGZhbHNlOwotCQkJCQlzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKS0xOwkvLyBXZSB3YW50IHRvIGluY2x1ZGUgdGhlIHNpZ24gb3IgZmlyc3QgZGlnaXQgaW4gdGhlIG51bWJlci4KLQkJCQkJd2hpbGUgKCFwYXJzZXIuYXRFbmQoKSAmJiAhbnVtYmVyQ29tcGxldGUpIHsKLQkJCQkJCWNoYXIgY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJc3dpdGNoIChjYykgewotCQkJCQkJCWNhc2UgJzAnOgotCQkJCQkJCWNhc2UgJzEnOgotCQkJCQkJCWNhc2UgJzInOgotCQkJCQkJCWNhc2UgJzMnOgotCQkJCQkJCWNhc2UgJzQnOgotCQkJCQkJCWNhc2UgJzUnOgotCQkJCQkJCWNhc2UgJzYnOgotCQkJCQkJCWNhc2UgJzcnOgotCQkJCQkJCWNhc2UgJzgnOgotCQkJCQkJCWNhc2UgJzknOgotCQkJCQkJCQlicmVhazsJLy8gVGhpcyBpcyBnb29kLCBnbyBvbi4KLQkJCQkJCQljYXNlICcuJzoKLQkJCQkJCQkJaWYgKGZsb2F0VHlwZSkKLQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwkvLyBXZSBhbHJlYWR5IGZvdW5kIGEgJy4nLCB0d28gYXJlIGludmFsaWQuCi0JCQkJCQkJCWZsb2F0VHlwZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ2UnOgotCQkJCQkJCWNhc2UgJ0UnOgotCQkJCQkJCQlpZiAoZm91bmRFKQotCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7CS8vIFdlIGFscmVhZHkgZm91bmQgYSAnZScsIHR3byBhcmUgaW52YWxpZC4KLQkJCQkJCQkJZm91bmRFID0gdHJ1ZTsKLQkJCQkJCQkJZmxvYXRUeXBlID0gdHJ1ZTsJLy8gQW4gJ2UnIG1ha2VzIGl0IGEgZmxvYXQsIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICcrJzoKLQkJCQkJCQljYXNlICctJzoKLQkJCQkJCQkJaWYgKCFmb3VuZEUgfHwgZm91bmRFU2lnbikgCi0JCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsJLy8gQSArLy0gd2l0aCBubyAnZScgZmlyc3QgaXMgaW52YWxpZC4gT3IgbW9yZSB0aGFuIG9uZSBzaWduLgotCQkJCQkJCQlmb3VuZEVTaWduID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJLy8gQW55dGhpbmcgZWxzZSBpcyBlbmQgb2YgbnVtYmVyLgotCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7CS8vIEJhY2sgaXQgdXAgc28gdGhhdCBuZXh0IHBhcnNlIHdpbGwgc3RhcnQgd2l0aCB0aGlzIGNoYXIuCi0JCQkJCQkJCW51bWJlckNvbXBsZXRlID0gdHJ1ZTsJLy8gU28gd2Ugc3RvcCBzY2FubmluZwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFmbG9hdFR5cGUpCi0JCQkJCQkJcmV0dXJuIExvbmcudmFsdWVPZihwYXJzZXIuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIHBhcnNlci5uZXh0SW5kZXgoKSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBEb3VibGUudmFsdWVPZihwYXJzZXIuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIHBhcnNlci5uZXh0SW5kZXgoKSkpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAndCc6Ci0JCQkJY2FzZSAnVCc6Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnRic6Ci0JCQkJCS8vIFBvc3NpYmxlIGJvb2xlYW4uCi0JCQkJCWlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHRydWUsIHBhcnNlci5uZXh0SW5kZXgoKS0xLCAidHJ1ZSIsIDAsIDQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDMpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJCQl9IGVsc2UgaWYgKHBhcnNlci5nZXRJbnB1dCgpLnJlZ2lvbk1hdGNoZXModHJ1ZSwgcGFyc2VyLm5leHRJbmRleCgpLTEsICJmYWxzZSIsIDAsIDUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDQpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsJCQkJCQkKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJLy8gUG9zc2libGUgY2hhcmFjdGVyCi0JCQkJCWNoYXIgY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkvLyBXZSByZWFsbHkgb25seSBzdXBwb3J0ICdcXCcgYW5kICdcJycgYW55dGhpbmcgZWxzZSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWdub3JlICdcJyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaGFuZGxlIGZ1bGwgZXNjYXBlcy4KLQkJCQkJaWYgKGNjID09ICdcXCcpCi0JCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7CS8vIEdldCB3aGF0J3MgYWZ0ZXIgaXQuCi0JCQkJCWVsc2UgaWYgKGNjID09ICdcJycpCi0JCQkJCQlicmVhazsJLy8gJycgaXMgaW52YWxpZC4KLQkJCQkJaWYgKHBhcnNlci5wZWVrKCkgPT0gJ1wnJykgewotCQkJCQkJLy8gU28gbmV4dCBjaGFyIGFmdGVyICJjaGFyYWN0ZXIiIGlzIGlzIGEgcXVvdGUuIFRoaXMgaXMgZ29vZC4KLQkJCQkJCXBhcnNlci5yZWFkKCk7CS8vIE5vdyBjb25zdW1lIHRoZSBxdW90ZQotCQkJCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoY2MpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnbic6Ci0JCQkJCS8vIFBvc3NpYmxlIG51bGwuCi0JCQkJCWlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHBhcnNlci5uZXh0SW5kZXgoKS0xLCAibnVsbCIsIDAsIDQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDMpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ0knOgotCQkJCQkvLyBQb3NzaWJsZSBpbnZhbGlkIHZhbHVlLgotCQkJCQlpZiAocGFyc2VyLmdldElucHV0KCkucmVnaW9uTWF0Y2hlcyhwYXJzZXIubmV4dEluZGV4KCktMSwgSU5WQUxJRCwgMCwgSU5WQUxJRC5sZW5ndGgoKSkpIHsKLQkJCQkJCXBhcnNlci5za2lwKElOVkFMSUQubGVuZ3RoKCktMSk7CS8vIFNraXAgb3ZlciByZXN0IG9mIHN0cmluZy4KLQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnWyc6Ci0JCQkJCS8vIFBvc3NpYmxlIGFycmF5LgotCQkJCQkvLyBUaGUgbmV4dCBmaWVsZCBzaG91bGQgYmUgYSBudW1iZXIsIHNvIHdlJ2xsIHVzZSBwYXJzZVN0cmluZyB0byBnZXQgdGhlIG51bWJlci4gCi0JCQkJCU9iamVjdCBzaXplID0gcGFyc2VTdHJpbmcocGFyc2VyKTsKLQkJCQkJaWYgKHNpemUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsJLy8gU2UgaWYgbmV4dCBpcyAnXScKLQkJCQkJCWlmIChjYyA9PSAnXScpIHsKLQkJCQkJCQkvLyBHb29kLCB3ZWxsLWZvcm1lZCBmaXJzdCBkaW1lbnNpb24KLQkJCQkJCQlpbnQgZGltID0gMTsKLQkJCQkJCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJCQkJCQkvLyBTZWUgaWYgdGhlcmUgYXJlIG1vcmUgb2YganVzdCAiW10iLiB0aGUgbnVtYmVyIG9mIHRoZW0gaXMgdGhlIGRpbS4KLQkJCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQlpZiAoY2MgPT0gJ1snKSB7Ci0JCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJCWlmIChjYyA9PSAnXScpCi0JCQkJCQkJCQkJZGltKys7Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyBUaGlzIGlzIGludmFsaWQuCi0JCQkJCQkJCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7Ci0JCQkJCQkJCQkJYnJlYWs7CS8vIE5vIG1vcmUgZGltcy4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXBhcnNlci5iYWNrdXAoKTsKLQkJCQkJCQkJCWJyZWFrOwkvLyBObyBtb3JlIGRpbXMuCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCWlmIChjYyA9PSAneycpIHsKLQkJCQkJCQkJCS8vIEdvb2QsIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gY29kZS4KLQkJCQkJCQkJCWludFtdIGRpbXMgPSBuZXcgaW50W2RpbV07Ci0JCQkJCQkJCQlpbnQgbGVuID0gKChMb25nKSBzaXplKS5pbnRWYWx1ZSgpOwotCQkJCQkJCQkJZGltc1swXSA9IGxlbjsKLQkJCQkJCQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKE9iamVjdC5jbGFzcywgZGltcyk7Ci0JCQkJCQkJCQlBcnJheXMuZmlsbCgoT2JqZWN0W10pIGFycmF5LCBudWxsKTsJLy8gQmVjYXVzZSBuZXdJbnN0YW5jZSB1c2VkIGFib3ZlIGZpbGxzIHRoZSBhcnJheSBjcmVhdGVkIHdpdGggZW1wdHkgYXJyYXlzIHdoZW4gYSBkaW0+MS4KLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gTm93IHdlIHN0YXJ0IGZpbGxpbmcgaXQgaW4uCi0JCQkJCQkJCQlPYmplY3QgaW52U2V0dGluZyA9IG51bGw7CS8vIFdoYXQgd2Ugd2lsbCB1c2UgZm9yIHRoZSBpbnZhbGlkIHNldHRpbmcuIElmIHRoaXMgaXMgYSBtdWx0aWRpbSwgdGhpcyBuZWVkcyB0byBiZSBhbiBhcnJheS4gV2lsbCBub3QgY3JlYXRlIGl0IHVudGlsIG5lZWRlZC4KLQkJCQkJCQkJCU9iamVjdCBlbnRyeSA9IHBhcnNlU3RyaW5nKHBhcnNlcik7CS8vIEdldCB0aGUgZmlyc3QgZW50cnkKLQkJCQkJCQkJCUNsYXNzIGNvbXBUeXBlID0gYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJCQlpbnQgaSA9IC0xOwotCQkJCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQkJCQlpZiAoKytpIDwgbGVuKSB7Ci0JCQkJCQkJCQkJCWlmIChjb21wVHlwZS5pc0luc3RhbmNlKGVudHJ5KSkgewotCQkJCQkJCQkJCQkJLy8gR29vZCwgaXQgY2FuIGJlIGFzc2lnbmVkLgotCQkJCQkJCQkJCQkJQXJyYXkuc2V0KGFycmF5LCBpLCBlbnRyeSk7Ci0JCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkvLyBCYWQuIE5lZWQgdG8gc2V0IGludmFsaWQuCi0JCQkJCQkJCQkJCQlpZiAoaW52U2V0dGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJLy8gV2UgaGF2ZW4ndCBjcmVhdGVkIGl0IHlldC4KLQkJCQkJCQkJCQkJCQlpZiAoZGltID09IDEpCi0JCQkJCQkJCQkJCQkJCWludlNldHRpbmcgPSBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOyAvLyBHcmVhdCwgb25lIGRpbWVuc2lvbmFsLCB3ZSBjYW4gdXNlIGludmFsaWQgZGlyZWN0bHkKLQkJCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCQkJLy8gTXVsdGktZGltLiBOZWVkIHRvIGNyZWF0ZSBhIHZhbGlkIGFycmF5IHRoYXQgd2UgY2FuIHNldC4KLQkJCQkJCQkJCQkJCQkJaW50W10gaW52RGltcyA9IG5ldyBpbnRbZGltIC0gMV07Ci0JCQkJCQkJCQkJCQkJCUFycmF5cy5maWxsKGludkRpbXMsIDEpOyAvLyBMZW5ndGggb25lIGFsbCBvZiB0aGUgd2F5IHNvIHRoYXQgdGhlIGZpbmFsIGNvbXBvbmVudCBjYW4gYmUgaW52YWxpZCBvYmplY3QKLQkJCQkJCQkJCQkJCQkJaW52U2V0dGluZyA9IEFycmF5Lm5ld0luc3RhbmNlKE9iamVjdC5jbGFzcywgaW52RGltcyk7Ci0JCQkJCQkJCQkJCQkJCU9iamVjdCBmaW5hbEVudHJ5ID0gaW52U2V0dGluZzsgLy8gRmluYWwgYXJyYXkgKHdpdGggY29tcG9uZW50IHR5cGUgb2YganVzdCBPYmplY3QpLiBTdGFydCB3aXRoIHRoZSBmdWxsIGFycmF5IGFuZCB3b3JrIGRvd24uCi0JCQkJCQkJCQkJCQkJCWZvciAoaW50IGogPSBpbnZEaW1zLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHsKLQkJCQkJCQkJCQkJCQkJCWZpbmFsRW50cnkgPSBBcnJheS5nZXQoZmluYWxFbnRyeSwgMCk7Ci0JCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJQXJyYXkuc2V0KGZpbmFsRW50cnksIDAsIEludmFsaWRPYmplY3QuSU5TVEFOQ0UpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCUFycmF5LnNldChhcnJheSwgaSwgaW52U2V0dGluZyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQkJCWlmIChjYyA9PSAnLCcpIHsKLQkJCQkJCQkJCQkJLy8gR29vZCwgZ2V0IG5leHQKLQkJCQkJCQkJCQkJZW50cnkgPSBwYXJzZVN0cmluZyhwYXJzZXIpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoY2MgPT0gJ30nKSB7Ci0JCQkJCQkJCQkJCS8vIEdvb2QsIHJlYWNoZWQgdGhlIGVuZC4KLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJaWYgKCFwYXJzZXIuYXRFbmQoKSkgewotCQkJCQkJCQkJCQkJcGFyc2VyLmJhY2t1cCgpOwotCQkJCQkJCQkJCQkJZW50cnkgPSBwYXJzZVN0cmluZyhwYXJzZXIpOyAvLyBUZWNobmljYWxseSB0aGlzIHNob3VsZCBiZSBpbnZhbGlkLCBidXQgd2UnbGwgbGV0IGEgd2hpdGVzcGFjZSBhbHNvIGRlbm90ZSBuZXh0IGVudHJ5LgotCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJLy8gSXQncyByZWFsbHkgc2NyZXdlZCB1cC4gVGhlIHN0cmluZyBqdXN0IGVuZGVkLiBMb2cgaXQuCi0JCQkJCQkJCQkJCQlFeGNlcHRpb24gZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ocGFyc2VyLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQkvLyBTZWUgaWYgQmVhbmluZm8gcGx1Z2luIGlzIGF2YWlsYWJsZSAod2UgYXJlIHJ1bm5pbmcgdW5kZXIgZWNsaXBzZSkuIElmIHNvLCB1c2UgaXQsIGVsc2UganVzdCBwcmludCB0byBlcnJvci4KLQkJCQkJCQkJCQkJCQkvLyBXZSBtYXkgYmUgaW4gdGhlIHJlbW90ZSB2bSBhbmQgc28gaXQgd29uJ3QgYmUgYXZhaWxhYmxlLgotCQkJCQkJCQkJCQkJCUNsYXNzIGJpUGx1Z2luQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJTWV0aG9kIGdldFBsdWdpbiA9IGJpUGx1Z2luQ2xhc3MuZ2V0TWV0aG9kKCJnZXRQbHVnaW4iLCAoQ2xhc3NbXSkgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlNZXRob2QgZ2V0TG9nZ2VyID0gYmlQbHVnaW5DbGFzcy5nZXRNZXRob2QoImdldExvZ2dlciIsIChDbGFzc1tdKSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCU1ldGhvZCBsb2cgPSBnZXRMb2dnZXIuZ2V0UmV0dXJuVHlwZSgpLmdldE1ldGhvZCgibG9nIiwgbmV3IENsYXNzW10ge1Rocm93YWJsZS5jbGFzcywgTGV2ZWwuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCU9iamVjdCBiaVBsdWdpbiA9IGdldFBsdWdpbi5pbnZva2UobnVsbCwgKE9iamVjdFtdKSBudWxsKTsKLQkJCQkJCQkJCQkJCQlPYmplY3QgbG9nZ2VyID0gZ2V0TG9nZ2VyLmludm9rZShiaVBsdWdpbiwgKE9iamVjdFtdKSBudWxsKTsKLQkJCQkJCQkJCQkJCQlsb2cuaW52b2tlKGxvZ2dlciwgbmV3IE9iamVjdFtdIHtlLCBMZXZlbC5XQVJOSU5HfSk7Ci0JCQkJCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkvLyBOb3QgaW4gZWNsaXBzZSwgc28ganVzdCBwcmludCBzdGFjayB0cmFjZS4KLQkJCQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlyZXR1cm4gYXJyYXk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCX0KLQkJfQotCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFdyaXRlIG91dCBhbnkgaGlkZGVuIHN0dWZmCi0JCW91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJd3JpdGVPYmplY3QodmFsdWUsIG91dCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3QgdmFsdWUsIE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJb3V0LndyaXRlT2JqZWN0KHZhbHVlKTsKLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQlvdXQud3JpdGVPYmplY3QoKChDbGFzcykgdmFsdWUpLmdldE5hbWUoKSk7Ci0JCQllbHNlIGlmICghdmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQlvdXQud3JpdGVPYmplY3QodmFsdWUpOwotCQkJCWVsc2UKLQkJCQkJb3V0LndyaXRlT2JqZWN0KEludmFsaWRPYmplY3QuSU5TVEFOQ0UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBcnJheSBpcyB0cmlja3kuIFNlZSBpZiBpdCBpcyBvbmUgd2UgY2FuIGhhbmRsZSwgaWYgbm90IHRoZW4gaW52YWxpZC4gCi0JCQkJLy8gVG8gaW5kaWNhdGUgYXJyYXksIHdlIHdpbGwgZmlyc3Qgd3JpdGUgb3V0IHRoZSBDbGFzcyBvZiB0aGUgQ29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5IChpdCB3aWxsCi0JCQkJLy8gYmUgY29udmVydGVkIHRvIGJlIE9iamVjdCBvciBPYmplY3RbXS4uLikuCi0JCQkJLy8gVGhpcyB3aWxsIGJlIHRoZSBjbHVlIHRoYXQgYW4gYXJyYXkgaXMgY29taW5nLiBDbGFzcyB2YWx1ZXMgd2lsbCBuZXZlcgotCQkJCS8vIGJlIHJldHVybmVkLCBzbyB0aGF0IGlzIGhvdyB3ZSBjYW4gdGVsbCBpdCBpcyBhbiBhcnJheS4KLQkJCQkvLyBOb3RlOiBUaGUgcmVhc29uIHdlIGFyZSB1c2luZyB0aGUgY29tcG9uZW50IHR5cGUgKGNvbnZlcnRlZCB0byBPYmplY3QpIGlzIGJlY2F1c2UgdG8gcmVjb25zdHJ1Y3Qgb24gdGhlIG90aGVyIHNpZGUgd2UgbmVlZAotCQkJCS8vIHRvIHVzZSB0aGUgY29tcG9uZW50IHR5cGUgcGx1cyBsZW5ndGggb2YgdGhlIGFycmF5J3MgZmlyc3QgZGltZW5zaW9uLgotCQkJCS8vIAotCQkJCS8vIFdlIGNhbiBub3QganVzdCBzZXJpYWxpemUgdGhlIGFycmF5IGluIHRoZSBub3JtYWwgd2F5IGJlY2F1c2UgaXQgbWF5IGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMsIGFuZCB3ZSBuZWVkIHRvIAotCQkJCS8vIGhhbmRsZSB0aGF0LiBBbHNvLCBpZiBpdCB3YXNuJ3QgYW4gT2JqZWN0IGFycmF5LCB3ZSBuZWVkIHRvIHR1cm4gaXQgaW50byBhbiBvYmplY3QgYXJyYXkuIFdlIG5lZWQgY29uc2lzdGVuY3kKLQkJCQkvLyBpbiB0aGF0IGl0IHNob3VsZCBhbHdheXMgYmUgYW4gT2JqZWN0IGFycmF5LgotCQkJCS8vIFNvIG91dHB1dCBmb3JtYXQgd2lsbCBiZToKLQkJCQkvLyBDbGFzcyhjb21wb25lbnQgdHlwZSkKLQkJCQkvLyBpbnQoc2l6ZSBvZiBmaXJzdCBkaW1lbnNpb24pCi0JCQkJLy8gT2JqZWN0KHZhbHVlIG9mIGZpcnN0IGVudHJ5KSAtIEFjdHVhbGx5IHVzZSBvdXQgd3JpdGVPYmplY3QoKSBmb3JtYXQgdG8gYWxsb3cgbmVzdGluZyBvZiBhcnJheXMuCi0JCQkJLy8gT2JqZWN0KHZhbHVlIG9mIHNlY29uZCBlbnRyeSkKLQkJCQkvLyAuLi4gdXAgdG8gc2l6ZSBvZiBkaW1lbnNpb24uCi0JCQkJQ2xhc3MgdHlwZSA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQkJLy8gU2VlIGlmIGZpbmFsIHR5cGUgaXMgYSB2YWxpZCB0eXBlLgotCQkJCUNsYXNzIGZ0ID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJaW50IGRpbXMgPSAxOwotCQkJCXdoaWxlIChmdC5pc0FycmF5KCkpIHsKLQkJCQkJZGltcysrOwotCQkJCQlmdCA9IGZ0LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJaWYgKGZ0ID09IE9iamVjdC5jbGFzcyB8fCBmdCA9PSBTdHJpbmcuY2xhc3MgfHwgZnQgPT0gQm9vbGVhbi5jbGFzcyB8fCBmdCA9PSBDaGFyYWN0ZXIuY2xhc3MgfHwgZnQuaXNQcmltaXRpdmUoKSB8fCBmdCA9PSBDbGFzcy5jbGFzcyB8fCBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmdCkpIHsKLQkJCQkJU3RyaW5nIGpuaVR5cGUgPSBkaW1zID09IDEgPyAiamF2YS5sYW5nLk9iamVjdCIgOiBNYXBUeXBlcy5nZXRKTklUeXBlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIsIGRpbXMtMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IENsYXNzLmZvck5hbWUoam5pVHlwZSk7Ci0JCQkJCQlvdXQud3JpdGVPYmplY3QoY29tcG9uZW50VHlwZSk7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbHVlKTsKLQkJCQkJCW91dC53cml0ZUludChsZW5ndGgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCXdyaXRlT2JqZWN0KEFycmF5LmdldCh2YWx1ZSwgaSksIG91dCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiBPYmplY3QgYXJyYXlzIGFyZSBhbHdheXMgYXZhaWxhYmxlLgotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCW91dC53cml0ZU9iamVjdChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gUmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQotCQl2YWx1ZSA9IHJlYWRBY3R1YWxPYmplY3QoaW4pOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCByZWFkQWN0dWFsT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3QgdmFsID0gaW4ucmVhZE9iamVjdCgpOwotCQlpZiAodmFsIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCS8vIEl0IG11c3QgYmUgYW4gYXJyYXkuIE9ubHkgQ2xhc3Mgb2JqZWN0cyB0aGF0IGNvbWUgaW4gYXJlIEFycmF5cyBvZiBPYmplY3QuCi0JCQlpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOwotCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoKENsYXNzKSB2YWwsIGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQXJyYXkuc2V0KGFycmF5LCBpLCByZWFkQWN0dWFsT2JqZWN0KGluKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHZhbDsJLy8gSXQgaXMgdGhlIHZhbHVlIGl0c2VsZi4KLQl9Ci0KLQkKLQkvKioKLQkgKiBJcyB0aGlzIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBhbiBpbXBsaWNpdCB2YWx1ZSwgaS5lLiBvbmUgdGhhdCBjYW1lIGZyb20KLQkgKiBCZWFuSW5mbyBJbnRyb3NwZWN0aW9uIGFuZCBub3QgZnJvbSBhbiBvdmVycmlkZSBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW1wbGljaXRWYWx1ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0VmFsdWUoKSB7Ci0JCXJldHVybiBpbXBsaWNpdFZhbHVlOwotCX0KLQotCQotCS8qKgotCSAqIFNldCB0aGUgaW1wbGljaXQgdmFsdWUgZmxhZy4KLQkgKiBAcGFyYW0gaW1wbGljaXRWYWx1ZSBUaGUgaW1wbGljaXRWYWx1ZSB0byBzZXQuCi0JICogCi0JICogQHNlZSAjaXNJbXBsaWNpdFZhbHVlKCkKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFZhbHVlKGJvb2xlYW4gaW1wbGljaXRWYWx1ZSkgewotCQl0aGlzLmltcGxpY2l0VmFsdWUgPSBpbXBsaWNpdFZhbHVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzOTJmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBGZWF0dXJlRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEZlYXR1cmVEZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVJlY29yZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTc5Mjc2NjQ4TDsKLQkKLQlwdWJsaWMgU3RyaW5nIG5hbWU7CS8vIFNvbWUgZGVjb3JhdG9ycyB1c2UgdGhpcyBhbmQgb3RoZXJzIGRvbid0LiBFYWNoIGRlY29yYXRvciB0eXBlIHdpbGwgZGVjaWRlIHdoZXRoZXIgdGhpcyBpcyBvZiBpbXBvcnRhbmNlLgotCXB1YmxpYyBTdHJpbmcgZGlzcGxheU5hbWU7Ci0JcHVibGljIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgY2F0ZWdvcnk7Ci0JcHVibGljIGJvb2xlYW4gZXhwZXJ0OwotCXB1YmxpYyBib29sZWFuIGhpZGRlbjsKLQlwdWJsaWMgYm9vbGVhbiBwcmVmZXJyZWQ7Ci0JcHVibGljIFN0cmluZ1tdIGF0dHJpYnV0ZU5hbWVzOwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWVbXSBhdHRyaWJ1dGVWYWx1ZXM7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjc0NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoZXNlIGFyZSBjb25zdGFudHMgbmVlZGVkIGZvciB0cmFuc2ZlcnJpbmcgQmVhbkluZm8gcmVzdWx0cyBmcm9tIHRoZSBCZWFuSW5mbyBWTS4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMgewotCQotCS8qKgotCSAqIEludHJvc3BlY3Rpb24gYml0IGZsYWcgaW5kaWNhdGluZyBkbyB0aGUgQmVhbkRlY29yYXRvci4gU2VudCB0byBNb2RlbGluZ0JlYW5JbmZvLmludHJvc3BlY3QgbWV0aG9kLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPX0JFQU5fREVDT1IgPSAweDE7Ci0JCi0JLyoqCi0JICogSW50cm9zcGVjdGlvbiBiaXQgZmxhZyBpbmRpY2F0aW5nIGRvIHRoZSBQcm9wZXJ0aWVzLiBTZW50IHRvIE1vZGVsaW5nQmVhbkluZm8uaW50cm9zcGVjdCBtZXRob2QuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fUFJPUEVSVElFUyA9IDB4MjsKLQotCS8qKgotCSAqIEludHJvc3BlY3Rpb24gYml0IGZsYWcgaW5kaWNhdGluZyBkbyB0aGUgTWV0aG9kcy4gU2VudCB0byBNb2RlbGluZ0JlYW5JbmZvLmludHJvc3BlY3QgbWV0aG9kLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPX01FVEhPRFMgPSAweDQ7Ci0KLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIEV2ZW50cy4gU2VudCB0byBNb2RlbGluZ0JlYW5JbmZvLmludHJvc3BlY3QgbWV0aG9kLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPX0VWRU5UUyA9IDB4ODsKLQotCS8qKgotCSAqIEJlYW5EZWNvcmF0b3Igd2FzIHNlbnQgY29tbWFuZCBpZC4gCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGUgZGF0YSBmb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSBhIEJlYW5SZWNvcmQgZnJvbSB0aGUgT2JqZWN0SW5wdXRTdHJlYW0uCi0JICogCi0JICogQHNlZSBCZWFuUmVjb3JkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFQU5fREVDT1JBVE9SX1NFTlQgPSAxOwotCi0JLyoqCi0JICogUHJvcGVydHlEZWNvcmF0b3JzIHNlbmQgY29tbWFuZCBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSAgYW4gaW50IGFuZCB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBhbmQgZWFjaCBvYmplY3QgYWZ0ZXIgdGhhdAotCSAqIHdpbGwgYmUgYSBQcm9wZXJ0eVJlY29yZC9JbmRleGVkUHJvcGVydHlSZWNvcmQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2VlIFByb3BlcnR5UmVjb3JkCi0JICogQHNlZSBJbmRleGVkUHJvcGVydHlSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQgPSAyOwotCi0JLyoqCi0JICogTWV0aG9kRGVjb3JhdG9ycyBzZW5kIGNvbW1hbmQgaWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLgotCSAqIFRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSAgYW4gaW50IGFuZCB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbWV0aG9kcyBhbmQgZWFjaCBvYmplY3QgYWZ0ZXIgdGhhdAotCSAqIHdpbGwgYmUgYSBNZXRob2RSZWNvcmQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2VlIE1ldGhvZFJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUNPUkFUT1JTX1NFTlQgPSAzOwotCQotCS8qKgotCSAqIEV2ZW50U2V0RGVjb3JhdG9ycyBzZW5kIGNvbW1hbmQgaWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgIGFuIGludCBhbmQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGV2ZW50cyBhbmQgZWFjaCBvYmplY3QgYWZ0ZXIgdGhhdAotCSAqIHdpbGwgYmUgYSBFdmVudFNldFJlY29yZC4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzZWUgTWV0aG9kUmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVDT1JBVE9SU19TRU5UID0gNDsKLQotCS8qKgotCSAqIERvbmUgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhpcyBjb21tYW5kIGlkIG1lYW5zIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSBhbmQgaXQgc2hvdWxkIHJldHVybi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBNZXRob2RSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05FID0gNTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW5kZXhlZFByb3BlcnR5UmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDI5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW5kZXhlZFByb3BlcnR5UmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleGVkUHJvcGVydHlSZWNvcmQgZXh0ZW5kcyBQcm9wZXJ0eVJlY29yZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MzIyNzk5MEw7Ci0JCi0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgaW5kZXhlZFJlYWRNZXRob2Q7Ci0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgaW5kZXhlZFdyaXRlTWV0aG9kOwotCXB1YmxpYyBTdHJpbmcgaW5kZXhlZFByb3BlcnR5VHlwZU5hbWU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbnZhbGlkT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbnZhbGlkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzMxY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW52YWxpZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBBbiBpbmRpY2F0b3Igb2JqZWN0IGZvciBpbnZhbGlkIG9iamVjdCB0eXBlLiBUaGlzIGlzIHVzZWQgd2l0aCBmZWF0dXJlIGF0dHJpYnV0ZQotICogdmFsdWVzIGZyb20gdGhlIEJlYW5JbmZvIGNsYXNzZXMuIFdlIGNhbiBvbmx5IGhhbmRsZSBjZXJ0YWluIHR5cGVzIHdoZW4gd2UKLSAqIGJyaW5nIHRoZW0gb3ZlciBmcm9tIHRoZSBCZWFuSW5mbyBWTS4gVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGFzc2VzIGluc3RhbnRpYXRlZAotICogaW4gdGhlIEJlYW5JbmZvIGNsYXNzIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBJREUuICBTbyBhbnkgaW52YWxpZCB2YWx1ZQotICogd2lsbCBiZSByZXBsYWNlZCBieSB0aGlzIGNsYXNzIGluc3RhbmNlLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLgotICogVGhlcmUgd2lsbCBiZSBvbmUgaW5zdGFuY2UgKEludmFsaWRPYmplY3QuSU5TVEFOQ0UpIGluIHRoZSBzeXN0ZW0uIFRoYXQgd2F5Ci0gKiAiPT0iIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIGl0LgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBJbnZhbGlkT2JqZWN0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW52YWxpZE9iamVjdCBJTlNUQU5DRSA9IG5ldyBJbnZhbGlkT2JqZWN0KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTY0MzgwNDM3MEw7Ci0JCi0JLyoKLQkgKiBOb2JvZHkgZWxzZSBzaG91bGQgY3JlYXRlIG9uZSBvZiB0aGVzZS4KLQkgKi8KLQlwcml2YXRlIEludmFsaWRPYmplY3QoKSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vTWV0aG9kUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzdiZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vTWV0aG9kUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgTWV0aG9kRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIE1ldGhvZERlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTgyMjEzMTEwTDsKLQkKLQkvKioKLQkgKiBNZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgbWV0aG9kIHRoaXMgcmVjb3JkIGRlc2NyaWJlcy4KLQkgKi8KLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCBtZXRob2RGb3JEZXNjcmlwdG9yOwotCS8qKgotCSAqIFBhcmFtZXRlciByZWNvcmRzIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlbid0IGFueS4KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyUmVjb3JkW10gcGFyYW1ldGVyczsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1BhcmFtZXRlclJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUGFyYW1ldGVyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmYzNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUGFyYW1ldGVyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgUGFyYW1ldGVyRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IuCi0gKiA8cD4KLSAqIFRoZSBvbmx5IGZpZWxkIG9mIGltcG9ydGFuY2UgaXMgdGhlIG5hbWUsIGFuZCB0aGF0IGNvbWVzIGZyb20gRmVhdHVyZVJlY29yZC4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlclJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MjQzODk1NUw7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUHJvcGVydHlSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwMzI0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFByb3BlcnR5RGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5UmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTI3NjY0OEw7Ci0JCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUVkaXRvckNsYXNzTmFtZTsKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5VHlwZU5hbWU7Ci0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgcmVhZE1ldGhvZDsKLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCB3cml0ZU1ldGhvZDsKLQlwdWJsaWMgUmVmbGVjdEZpZWxkUmVjb3JkIGZpZWxkOwotCXB1YmxpYyBib29sZWFuIGJvdW5kOwotCXB1YmxpYyBib29sZWFuIGNvbnN0cmFpbmVkOwotCXB1YmxpYyBCb29sZWFuIGRlc2lnblRpbWU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0RmllbGRSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RGaWVsZFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI5ODM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RGaWVsZFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmxlY3RGaWVsZFJlY29yZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MTUxMjQ1M0w7Ci0JCi0JcHVibGljIFN0cmluZyBjbGFzc05hbWU7Ci0JcHVibGljIFN0cmluZyBmaWVsZE5hbWU7Ci0JcHVibGljIGJvb2xlYW4gcmVhZE9ubHk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMTEyOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUmVmbGVjdE1ldGhvZFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmbGVjdE1ldGhvZFJlY29yZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MTUxMjc3M0w7Ci0JCi0JcHVibGljIFN0cmluZyBjbGFzc05hbWU7Ci0JcHVibGljIFN0cmluZyBtZXRob2ROYW1lOwotCXB1YmxpYyBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXM7CS8vIE1heWJlIG51bGwgaWYgbm8gcGFyYW1ldGVycy4KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODg0MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zcmMuZXhjbHVkZXMgPSAqKi8uY3ZzaWdub3JlCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IGJlYW5pbmZvQ29tbW9uLwotb3V0cHV0Li4gPSBiaW4vCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNGE3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5jb21tb24KLUJ1bmRsZS1OYW1lLjAgPSBKRU0gQmVhbmluZm8gQ29tbW9uIEphcgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1EZXNjcmlwdGlvbi4wID0gVGhpcyBidW5kbGUgaXMgdXNlZCBvbmx5IGFzIGEgamFyIGJ5IHRoZSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8gYnVuZGxlLCBzbyBpdCBzaG91bGQgbmV2ZXIgYmUgInByZS1yZXEnZCIgYnkgb3RoZXJzLCBvbmx5IGJ5IG8uZS5qZW0uYmVhbmluZm8uIE90aGVyIGFkb3B0ZXJzIHdvdWxkIHVzZSBvbmx5IHRoYXQgby5lLmplbS5iZWFuaW5mbyBidW5kbGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkODJjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idm1fYmVhbmluZm92bSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcwYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5Nzk5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgTm92IDI2IDAxOjIzOjAwIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDQxYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtCi1CdW5kbGUtVmVyc2lvbjogMi4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMC4yMDAsMy4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1EZXNjcmlwdGlvbjogJUJ1bmRsZS1EZXNjcmlwdGlvbi4wCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZWE1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+PGhlYWQ+PHRpdGxlPkFib3V0PC90aXRsZT4KLQotCi0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvaGVhZD48Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY4MjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zcmMuZXhjbHVkZXMgPSAqKi8uY3ZzaWdub3JlCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHZtX2JlYW5pbmZvdm0vCi1vdXRwdXQuLiA9IGJpbi8KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlMTBjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtCi1CdW5kbGUtTmFtZS4wID0gSkVNIEJlYW5pbmZvIFZNIEphcgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1EZXNjcmlwdGlvbi4wID0gVGhpcyBidW5kbGUgaXMgdXNlZCBvbmx5IGFzIGEgamFyIGJ5IHRoZSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8gYnVuZGxlLCBzbyBpdCBzaG91bGQgbmV2ZXIgYmUgInByZS1yZXEnZCIgYnkgb3RoZXJzLCBvbmx5IGJ5IG8uZS5qZW0uYmVhbmluZm8uIEV4dGVuZGVycyB3b3VsZCB1c2Ugb25seSB0aGF0IG8uZS5qZW0uYmVhbmluZm8gYnVuZGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL0Jhc2VCZWFuSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWI2MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbi5JQmFzZUJlYW5JbmZvQ29uc3RhbnRzOwotCi0KLS8qKgotICogQSBCYXNlQmVhbkluZm8gdGhhdCBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgQmVhbkluZm9zIHdpdGhpbiB0aGUgSkVNIGVudmlyb25tZW50LgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VCZWFuSW5mbyBleHRlbmRzIFNpbXBsZUJlYW5JbmZvIGltcGxlbWVudHMgSUJhc2VCZWFuSW5mb0NvbnN0YW50cyB7Ci0KLQkvLyBDb25zdGFudHMgdG8gdXNlIHRvIGNyZWF0ZSBhbGwgZGVzY3JpcHRvcnMgZXRjLgotCXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIFJFU0JVTkRMRSA9IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5iZWFuaW5mbyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCb3VuZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1VORCA9ICJib3VuZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RyYWluZWQgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlORUQgPSAiY29uc3RyYWluZWQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByb3BlcnR5IGVkaXRvciBjbGFzcyBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWUVESVRPUkNMQVNTID0gInByb3BlcnR5RWRpdG9yQ2xhc3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlYWQgTWV0aG9kIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURNRVRIT0QgPSAicmVhZE1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogV3JpdGUgbWV0aG9kIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFTUVUSE9EID0gIndyaXRlTWV0aG9kIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEaXNwbGF5bmFtZSBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEV4cGVydCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFUlQgPSAiZXhwZXJ0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBIaWRkZW4gaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOID0gImhpZGRlbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVycmVkIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUlJFRCA9ICJwcmVmZXJyZWQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNob3J0IGRlc2NyaXB0aW9uIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUREVTQ1JJUFRJT04gPSAic2hvcnREZXNjcmlwdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3VzdG9taXplciBjbGFzcyBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSQ0xBU1MgPSAiY3VzdG9taXplckNsYXNzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbiBEZWZhdWx0IGV2ZW50c2V0IGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVGQVVMVEVWRU5UU0VUID0gImluRGVmYXVsdEV2ZW50U2V0IjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhpcyBpcyBhIEZlYXR1cmUgQXR0cmlidXRlIEtleS4gV2hlbiB0aGlzIGtleSBleGlzdHMsIHRoZSB2YWx1ZSBpcyBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLiBJdCBtZWFucyB0aGlzIHByb3BlcnR5Ci0JICogaXMgYSBmaWVsZCBhbmQgbm90IGEgZ2V0dGVyL3NldHRlci4gVGhlIGdldHRlci9zZXR0ZXIgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgcHJvcGVydHkgdHlwZSB3aWxsIGJlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLQkgKiA8cD4KLQkgKiBBdCB0aGlzIHRpbWUsIGRvIG5vdCB1c2UgZmllbGQgb24gYW4gaW5kZXhlZCBwcm9wZXJ0eS4gVGhpcyBpcyBjdXJyZW50bHkgYW4gdW5kZWZpbmVkIHNpdHVhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRFBST1BFUlRZID0gImZpZWxkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT2JzY3VyZSBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4gT2JzdXJlIGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBvYnNjdXJlIHNldHRpbmcgaXMgc3RvcmVkLgotCSAqIDxwPgotCSAqIE9ic3VyZSBtZWFucyBtb3N0IHVzZXJzIGRvbid0IG5lZWQgaXQuIEluIHRoZSBmdXR1cmUgc3VjaCBmZWF0dXJlcyB3b24ndCBldmVuIGJlIGNhY2hlZCBzbyBhcyB0byByZWR1Y2UgdGhlIGluLW1lbW9yeSBjb3N0cy4gQ3VycmVudGx5IHRoaXMKLQkgKiBmbGFnIGlzIGlnbm9yZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JTQ1VSRSA9ICJpdmpPYnNjdXJlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZXNpZ24gdGltZSBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4gRGVzaWduIHRpbWUgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlIGRlc2lnbiB0aW1lIHNldHRpbmcgaXMKLQkgKiBzdG9yZWQuCi0JICogPHA+Ci0JICogRGVzaWduIHRpbWUgbWVhbnM6Ci0JICogPHVsPgotCSAqIDxsaT5Ob3Qgc2V0OiBXaWxsIGJlIGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvLCBhbmQgc2hvd3Mgb24gcHJvcGVydHkgc2hlZXQgKGlmIG5vdCBoaWRkZW4pLgotCSAqIDxsaT48Y29kZT50cnVlPC9jb2RlPjogU3BlY2lhbCBwcm9wZXJ0eSAoaXQgd2lsbCBzaG93IG9uIHByb3BlcnR5IHNoZWV0IGlmIG5vdCBoaWRkZW4pLCBidXQgaXQgY2FuJ3QgYmUgY29ubmVjdGVkIHRvLiBVc3VhbGx5IHRoaXMgaXMgYQotCSAqIHByb3BlcnR5IHRoYXQgaXMgZmx1ZmZlZCB1cCBmb3IgdGhlIElERSBwdXJwb3NlcyBidXQgZG9lc24ndCBoYXZlIGEgZ2V0L3NldCBtZXRob2QuIFRoaXMgbWVhbnMgaXQgaXMgYSBwcm9wZXJ0eSBmb3IgZGVzaWduIHRpbWUgYW5kIG5vdCBmb3IKLQkgKiBydW50aW1lLgotCSAqIDxsaT48Y29kZT5mYWxzZTwvY29kZT46IFRoaXMgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiBwcm9wZXJ0eSBzaGVldCBidXQgaXQgY2FuIGJlIGNvbm5lY3RlZCB0by4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTlRJTUVQUk9QRVJUWSA9ICJpdmpEZXNpZ25UaW1lUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRXZlbnRBZGFwdGVyQ2xhc3MgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIEV2ZW50IGFkYXB0ZXIgY2xhc3MgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlIGV2ZW50Ci0JICogYWRhcHRlciBpcyBzdG9yZWQuCi0JICogPHA+Ci0JICogQWRhcHRlciBjbGFzcyBmb3IgZXZlbnRTZXREZXNjcmlwdG9ycyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIG1ldGhvZHMuIEZvciBleGFtcGxlCi0JICogPGNvZGU+amF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI8L2NvZGU+IGhhcyBhbiBhZGFwdGVyIG9mIDxjb2RlPmphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI8L2NvZGU+LiBXaGF0IGlzIHN0b3JlZCBpcyBhY3R1YWxseSB0aGUKLQkgKiBjbGFzcyBuYW1lLCBub3QgdGhlIGNsYXNzIGl0c2VsZi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVEFEQVBURVJDTEFTUyA9ICJldmVudEFkYXB0ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEpWTV8xXzMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsICIiKS5zdGFydHNXaXRoKCIxLjMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkCi0JCi0JLyoqCi0JICogRW1wdHkgYXJncyBsaXN0IGZvciB0aG9zZSBkZXNjcmlwdG9ycyB0aGF0IGRvbid0IGhhdmUgYXJndW1lbnRzLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJHUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYXBpdGFsaXplIHRoZSBzdHJpbmcuIFRoaXMgdXBwZXJjYXNlcyBvbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIuIFNvIGlmIHlvdSBoYXZlIHByb3BlcnR5IG5hbWUgb2YgImFiYyIgaXQgd2lsbCBiZWNvbWUgIkFiYyIuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuIHN0cmluZyB3aXRoIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzKSB7Ci0JCWlmIChzLmxlbmd0aCgpID09IDApIHsgcmV0dXJuIHM7IH0KLQkJY2hhciBjaGFyc1tdID0gcy50b0NoYXJBcnJheSgpOwotCQljaGFyc1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaGFyc1swXSk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBCZWFuRGVzY3JpcHRvciBvYmplY3QgZ2l2ZW4gYW4gYXJyYXkgb2Yga2V5d29yZC92YWx1ZSBhcmd1bWVudHMuIFVzZSB0aGUga2V5d29yZHMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLCBlLmcuIEJPVU5ELCBFWFBFUlQsIGV0Yy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBiZWFuIGZvciB3aGljaCB0aGUgYmVhbiBkZXNjcmlwdG9yIGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGFyZyBwYWlycywgWzBdIGtleXdvcmQsIFsxXSB2YWx1ZSwgWzJdIGtleXdvcmQsIFszXSB2YWx1ZSwgZXRjLiBvciBudWxsIGlmIG5vIGFyZ3MKLQkgKiBAcmV0dXJuIG5ldyBiZWFuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5EZXNjcmlwdG9yIGNyZWF0ZUJlYW5EZXNjcmlwdG9yKENsYXNzIGNscywgT2JqZWN0W10gYXJncykgewotCQlDbGFzcyBjdXN0b21pemVyQ2xhc3MgPSBudWxsOwotCi0JCWlmIChhcmdzICE9IG51bGwpIHsKLQkJCS8qIEZpbmQgdGhlIHNwZWNpZmllZCBjdXN0b21pemVyQ2xhc3MgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJCWlmIChDVVNUT01JWkVSQ0xBU1MuZXF1YWxzKGFyZ3NbaV0pKSB7Ci0JCQkJCWN1c3RvbWl6ZXJDbGFzcyA9IChDbGFzcykgYXJnc1tpICsgMV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUJlYW5EZXNjcmlwdG9yIGJkID0gbmV3IEJlYW5EZXNjcmlwdG9yKGNscywgY3VzdG9taXplckNsYXNzKTsKLQotCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYXJnc1tpXTsKLQkJCQlPYmplY3QgdmFsdWUgPSBhcmdzW2kgKyAxXTsKLQkJCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKGJkLCBrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBiZDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBiZWFucyBFdmVudFNldERlc2NyaXB0b3IgZ2l2ZW4gdGhlIGZvbGxvd2luZzoKLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBUaGUgYmVhbiBjbGFzcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIGV2ZW50IHNldAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4gb3IgbnVsbCBpZiBubyBhcmdzLgotCSAqIEBwYXJhbSBsbWRzCi0JICogICAgICAgICAgICBhcnJheSBvZiBNZXRob2REZXNjcmlwdG9ycyBkZWZpbmluZyB0aGUgbGlzdGVuZXIgbWV0aG9kcwotCSAqIEBwYXJhbSBsaXN0ZW5lclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgbGlzdGVuZXIKLQkgKiBAcGFyYW0gYWRkTGlzdGVuZXJOYW1lCi0JICogICAgICAgICAgICBhZGQgbGlzdGVuZXIgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gcmVtb3ZlTGlzdGVuZXJOYW1lcmVtb3ZlCi0JICogICAgICAgICAgICBsaXN0ZW5lciBtZXRob2QgbmFtZQotCSAqIEByZXR1cm4gbmV3IGV2ZW50IHNldCBkZXNjcmlwdG9yCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFdmVudFNldERlc2NyaXB0b3IgY3JlYXRlRXZlbnRTZXREZXNjcmlwdG9yKENsYXNzIGNscywgU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZERlc2NyaXB0b3JbXSBsbWRzLCBDbGFzcyBsaXN0ZW5lclR5cGUsCi0JCQlTdHJpbmcgYWRkTGlzdGVuZXJOYW1lLCBTdHJpbmcgcmVtb3ZlTGlzdGVuZXJOYW1lKSB7Ci0JCUV2ZW50U2V0RGVzY3JpcHRvciBlc2QgPSBudWxsOwotCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSB7IGxpc3RlbmVyVHlwZX07Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYWRkTWV0aG9kID0gbnVsbDsKLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCByZW1vdmVNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvKiBnZXQgYWRkTGlzdGVuZXJNZXRob2Qgd2l0aCBwYXJhbWV0ZXIgdHlwZXMuICovCi0JCQkJYWRkTWV0aG9kID0gY2xzLmdldE1ldGhvZChhZGRMaXN0ZW5lck5hbWUsIHBhcmFtVHlwZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9nZXRfdGhlX21ldGgxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3IE9iamVjdFtdIHsgYWRkTGlzdGVuZXJOYW1lfSkpOwotCQkJfQotCQkJOwotCQkJdHJ5IHsKLQkJCQkvKiBnZXQgcmVtb3ZlTGlzdGVuZXJNZXRob2Qgd2l0aCBwYXJhbWV0ZXIgdHlwZXMuICovCi0JCQkJcmVtb3ZlTWV0aG9kID0gY2xzLmdldE1ldGhvZChyZW1vdmVMaXN0ZW5lck5hbWUsIHBhcmFtVHlwZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9nZXRfdGhlX21ldGgxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVtb3ZlTGlzdGVuZXJOYW1lfSkpOwotCQkJfQotCQkJOwotCi0JCQllc2QgPSBuZXcgRXZlbnRTZXREZXNjcmlwdG9yKG5hbWUsIGxpc3RlbmVyVHlwZSwgbG1kcywgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9FMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCQk7Ci0JCWlmIChhcmdzICE9IG51bGwpIHsKLQkJCS8vIHNldCB0aGUgZXZlbnQgc2V0IGRlc2NyaXB0b3IgcHJvcGVydGllcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQkJaWYgKElOREVGQVVMVEVWRU5UU0VULmVxdWFscyhrZXkpKSB7Ci0JCQkJCWVzZC5zZXRJbkRlZmF1bHRFdmVudFNldCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUoZXNkLCBrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBlc2Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgYmVhbidzIE1ldGhvZERlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgY2xhc3Mgb2YgdGhlIG1ldGhvZC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgbWV0aG9kLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4gb3IgbnVsbCBpZiBubyBhcmdzCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBkZXNjcmlwdG9ycy4KLQkgKiBAcGFyYW0gcGFyYW1UeXBlcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIHR5cGVzCi0JICogQHJldHVybiBuZXcgbWV0aG9kIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZERlc2NyaXB0b3IgY3JlYXRlTWV0aG9kRGVzY3JpcHRvcihDbGFzcyBjbHMsIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzLCBQYXJhbWV0ZXJEZXNjcmlwdG9yW10gcGFyYW1zLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQkJTWV0aG9kRGVzY3JpcHRvciBtZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYU1ldGhvZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8qIGdldE1ldGhvZCB3aXRoIHBhcmFtZXRlciB0eXBlcy4gKi8KLQkJCQlhTWV0aG9kID0gY2xzLmdldE1ldGhvZChuYW1lLCBwYXJhbVR5cGVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgewotCQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfZ2V0X3RoZV9tZXRoMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCQl9Ci0JCQk7Ci0JCQlpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmxlbmd0aCA+IDApCi0JCQkJbWQgPSBuZXcgTWV0aG9kRGVzY3JpcHRvcihhTWV0aG9kLCBwYXJhbXMpOwotCQkJZWxzZQotCQkJCW1kID0gbmV3IE1ldGhvZERlc2NyaXB0b3IoYU1ldGhvZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQl9Ci0JCTsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJLy8gc2V0IHRoZSBtZXRob2QgcHJvcGVydGllcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShtZCwga2V5LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZU90aGVyUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBDbGFzcyBjbHMpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJTWV0aG9kIHJlYWRNZXRob2QgPSBudWxsOwotCQlNZXRob2Qgd3JpdGVNZXRob2QgPSBudWxsOwotCQlTdHJpbmcgYmFzZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IG5ldyBDbGFzc1swXTsKLQotCQkvLyBGaXJzdCB3ZSB0cnkgYm9vbGVhbiBhY2Nlc3NvciBwYXR0ZXJuCi0JCXRyeSB7Ci0JCQlyZWFkTWV0aG9kID0gY2xzLmdldE1ldGhvZCgiaXMiICsgYmFzZSwgcGFyYW1ldGVycyk7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgxKSB7Ci0JCX0KLQkJaWYgKHJlYWRNZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBFbHNlIHdlIHRyeSB0aGUgZ2V0IGFjY2Vzc29yIHBhdHRlcm4uCi0JCQkJcmVhZE1ldGhvZCA9IGNscy5nZXRNZXRob2QoImdldCIgKyBiYXNlLCBwYXJhbWV0ZXJzKTsvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0JCQkJLy8gRmluZCBieSBtYXRjaGluZyBtZXRob2RzIG9mIHRoZSBjbGFzcwotCQkJCXJlYWRNZXRob2QgPSBmaW5kTWV0aG9kKGNscywgImdldCIgKyBiYXNlLCAwKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocmVhZE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBGb3Igd3JpdGUtb25seSBwcm9wZXJ0aWVzLCBmaW5kIHRoZSB3cml0ZSBtZXRob2QKLQkJCXdyaXRlTWV0aG9kID0gZmluZE1ldGhvZChjbHMsICJzZXQiICsgYmFzZSwgMSk7Ly8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy8gSW4gU3VuJ3MgY29kZSwgcmVmbGVjdGlvbiBmYWlscyBpZiB0aGVyZSBhcmUgdHdvCi0JCQkvLyBzZXR0ZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdGhlIGZpcnN0IHNldHRlciBsb2NhdGVkCi0JCQkvLyBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHJldHVybiB0eXBlIG9mIHRoZSBnZXR0ZXIuCi0JCQkvLyBUaGlzIGZpeGVzIHRoYXQuCi0JCQlwYXJhbWV0ZXJzID0gbmV3IENsYXNzWzFdOwotCQkJcGFyYW1ldGVyc1swXSA9IHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJdHJ5IHsKLQkJCQl3cml0ZU1ldGhvZCA9IGNscy5nZXRNZXRob2QoInNldCIgKyBiYXNlLCBwYXJhbWV0ZXJzKTsvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgzKSB7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0JCWlmICgocmVhZE1ldGhvZCAhPSBudWxsKSB8fCAod3JpdGVNZXRob2QgIT0gbnVsbCkpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIHJlYWRNZXRob2QsIHdyaXRlTWV0aG9kKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfZmluZF90aGVfYWNjMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlYW5zIHBhcmFtZXRlciBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHBhcmFtZXRlcgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4gb3IgbnVsbCBpZiBubyBhcmdzCi0JICogQHJldHVybiBuZXcgcGFyYW1ldGVyIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhcmFtZXRlckRlc2NyaXB0b3IgY3JlYXRlUGFyYW1ldGVyRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncykgewotCQlQYXJhbWV0ZXJEZXNjcmlwdG9yIHBkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBkID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0b3IoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCX0KLQkJOwotCQkvLyBzZXQgdGhlIG5hbWUKLQkJcGQuc2V0TmFtZShuYW1lKTsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJLy8gc2V0IHRoZSBtZXRob2QgcHJvcGVydGllcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShwZCwga2V5LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gcGQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBHRVRDTEFTUzsgCi0JCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUdFVENMQVNTID0gT2JqZWN0LmNsYXNzLmdldE1ldGhvZCgiZ2V0Q2xhc3MiLCAoQ2xhc3NbXSkgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZGVzY3JpYmluZyBhIGZpZWxkIHByb3BlcnR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgbm9uLXN0YW5kYXJkLiBUaGUgVkUga25vd3MgaG93IHRvIGhhbmRsZSB0aGlzLCBidXQgYW55IG9uZSBlbHNlIHVzaW5nIEJlYW5JbmZvIHdpbGwgc2VlIHRoaXMgYXMgYSBwcm9wZXJ0eSB3aXRoCi0JICogbm8gZ2V0dGVyIG9yIHNldHRlci4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBmaWVsZAotCSAqIEBwYXJhbSBhcmdzIGFyZyBwYWlycywgWzBdIGtleXdvcmQsIFsxXSB2YWx1ZSwgWzJdIGtleXdvcmQsIFszXSB2YWx1ZSwgZXRjLiBvciBudWxsIGlmIG5vIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRmllbGRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIEZpZWxkIGZpZWxkLCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG51bGwsIG51bGwpOwotCQkJcGQuc2V0VmFsdWUoRklFTERQUk9QRVJUWSwgZmllbGQpOwkvLyBTZXQgdGhlIGZpZWxkIHByb3BlcnR5IHNvIHdlIGtub3cgaXQgaXMgYSBmaWVsZC4KLQkJCWFwcGx5RmllbGRBcmd1bWVudHMocGQsIGFyZ3MpOwotCQkJLy8gTmVlZCB0byBzZXQgaW4gYSBwaG9ueSByZWFkIG1ldGhvZCBiZWNhdXNlIEludHJvc3BlY3RvciB3aWxsIHRocm93IGl0IGF3YXkgb3RoZXJ3aXNlLiBXZSBqdXN0IHVzZSBPYmplY3QuZ2V0Q2xhc3MgZm9yIHRoaXMuCi0JCQkvLyBXZSB3aWxsIGlnbm9yZSB0aGUgcHJvcGVydHkgdHlwZSBmb3IgZmllbGRzLiBJZiB1c2VkIG91dHNpZGUgb2YgVkUgdGhlbiBpdCB3aWxsIGxvb2sgbGlrZSBhIGNsYXNzIHByb3BlcnR5LgotCQkJcGQuc2V0UmVhZE1ldGhvZChHRVRDTEFTUyk7Ci0JCQlyZXR1cm4gcGQ7Ci0JCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3dFcnJvcihlLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV90aGVfUDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlYW4ncyBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIGNsYXNzIG9mIHdobyBvd25zIHRoZSBwcm9wZXJ0eSAodXN1YWxseSB0aGUgYmVhbikuIEl0IGlzIHVzZWQgdG8gbG9vayB1cCBnZXQvc2V0IG1ldGhvZHMgZm9yIHRoZSBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVydHkuIEl0IHdpbGwgdXNlIGdldHtOYW1lfSBhbmQgc2V0e05hbWV9IHRvIGZpbmQgZ2V0L3NldCBtZXRob2RzLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4KLQkgKiBAcmV0dXJuIG5ldyBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKENsYXNzIGNscywgU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ3MpIHsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIENyZWF0ZSBhc3N1bWluZyB0aGF0IHRoZSBnZXR0ZXIvc2V0dGVyIGZvbGxvd3MgcmVmbGVjdGlvbiBwYXR0ZXJucwotCQkJcGQgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGNscyk7Ci0JCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVHJ5IGNyZWF0aW5nIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgcmVhZC1vbmx5LCB3cml0ZS1vbmx5Ci0JCQkvLyBvciBpZiBTdW4ncyByZWZsZWN0aW9uIGZhaWxzCi0JCQl0cnkgewotCQkJCXBkID0gY3JlYXRlT3RoZXJQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgY2xzKTsKLQkJCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gaWUpIHsKLQkJCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV90aGVfUDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQkJfQotCQl9Ci0KLQkJYXBwbHlQcm9wZXJ0eUFyZ3VtZW50cyhwZCwgYXJncywgY2xzKTsKLQotCQlyZXR1cm4gcGQ7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yIGJhc2VkIHVwb24gdGhlIFBEIHNlbnQgaW4uIEl0IHdpbGwgY2xvbmUgdGhlIHNlbnQgaW4gb25lLCBhbmQgYXBwbHkgdGhlIGFyZ3MgdG8gb3ZlcnJpZGUgYW55IHNwZWNpZmljIHNldHRpbmcuCi0JICogQ2xhc3MgY2xzIGlzIHVzZWQgZm9yIGZpbmRpbmcgcmVhZC93cml0ZSBtZXRob2RzLCBpZiBhbnkuCi0JICogCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gd2FudGluZyB0byBvdmVycmlkZSBvbmx5IGEgZmV3IHNwZWNpZmljIHNldHRpbmdzIGZyb20gYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZyb20gdGhlIHN1cGVyIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tUERTCi0JICogICAgICAgICAgICBUaGUgUHJvcGVydHlEZXNjcmlwdG9yIGFycmF5IHRvIGZpbmQgdGhlIGVudHJ5IHRvIGNsb25lLiBJdCB3aWxsIGJlIGNoYW5nZWQgaW4gcGxhY2UgaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZmluZCBhbmQgY2xvbmUgYW5kIG92ZXJyaWRlLgotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIFRoZSBjbGFzcyB0byB1c2UgdG8gZmluZCByZWFkL3dyaXRlIG1ldGhvZHMgaW4gYXJncy4gSWYgbm8gcmVhZC93cml0ZSBtZXRob2RzIHNwZWNpZmllZCwgdGhlbiB0aGlzIG1heSBiZSBudWxsLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvIG92ZXJyaWRlIGZyb20gZnJvbVBELiBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4gb3IgbnVsbCBpZiBub25lIHRvIG92ZXJyaWRlCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMsIFN0cmluZyBuYW1lLCBDbGFzcyBjbHMsIE9iamVjdFtdIGFyZ3MpIHsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbnVsbDsKLQkJaW50IGlQRCA9IGZpbmRQcm9wZXJ0eURlc2NyaXB0b3IocGRzLCBuYW1lKTsKLQkJaWYgKGlQRCA9PSAtMSkKLQkJCXJldHVybjsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIGZyb21QRCA9IHBkc1tpUERdOwotCQl0cnkgewotCi0JCQlwZCA9IHBkc1tpUERdID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihmcm9tUEQuZ2V0TmFtZSgpLCBudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZnJvbVBELmdldE5hbWUoKX0pKTsKLQkJfQotCi0JCS8vIE5vdyBjb3B5IG92ZXIgdGhlIGNvbnRlbnRzIG9mIGZyb21QRC4KLQkJY2xvbmVQcm9wZXJ0eVNldHRpbmdzKGZyb21QRCwgcGQpOwotCi0JCS8vIE5vdyBhcHBseSB0aGUgb3ZlcnJpZGVzCi0JCWFwcGx5UHJvcGVydHlBcmd1bWVudHMocGQsIGFyZ3MsIGNscyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvbmVQcm9wZXJ0eVNldHRpbmdzKFByb3BlcnR5RGVzY3JpcHRvciBmcm9tUEQsIFByb3BlcnR5RGVzY3JpcHRvciBwZCkgewotCQl0cnkgewotCQkJcGQuc2V0UmVhZE1ldGhvZChmcm9tUEQuZ2V0UmVhZE1ldGhvZCgpKTsKLQkJCXBkLnNldFdyaXRlTWV0aG9kKGZyb21QRC5nZXRXcml0ZU1ldGhvZCgpKTsKLQkJCXBkLnNldFByb3BlcnR5RWRpdG9yQ2xhc3MoZnJvbVBELmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSk7Ci0JCQlwZC5zZXRCb3VuZChmcm9tUEQuaXNCb3VuZCgpKTsKLQkJCXBkLnNldENvbnN0cmFpbmVkKGZyb21QRC5pc0NvbnN0cmFpbmVkKCkpOwotCQkJY2xvbmVGZWF0dXJlU2V0dGluZ3MoZnJvbVBELCBwZCk7Ci0JCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3dFcnJvcihlLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV90aGVfUDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGZyb21QRC5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvbmVGZWF0dXJlU2V0dGluZ3MoRmVhdHVyZURlc2NyaXB0b3IgZnJvbUZELCBGZWF0dXJlRGVzY3JpcHRvciBmZCkgewotCQlmZC5zZXRFeHBlcnQoZnJvbUZELmlzRXhwZXJ0KCkpOwotCQlmZC5zZXRIaWRkZW4oZnJvbUZELmlzSGlkZGVuKCkpOwotCQlmZC5zZXRQcmVmZXJyZWQoZnJvbUZELmlzUHJlZmVycmVkKCkpOwotCQlmZC5zZXRTaG9ydERlc2NyaXB0aW9uKGZyb21GRC5nZXRTaG9ydERlc2NyaXB0aW9uKCkpOwotCQlmZC5zZXREaXNwbGF5TmFtZShmcm9tRkQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLQkJamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMgPSBmcm9tRkQuYXR0cmlidXRlTmFtZXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBmcm9tRkQuZ2V0VmFsdWUoa2V5KTsKLQkJCWZkLnNldFZhbHVlKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgY29tbW9uIHByb3BlcnR5IGFyZ3VtZW50cyBiZXR3ZWVuIGZpZWxkIGFuZCBzdGFuZGFyZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXBwbHlDb21tb25Qcm9wZXJ0eUFyZ3VtZW50cyhQcm9wZXJ0eURlc2NyaXB0b3IgcGQsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoQk9VTkQuZXF1YWxzKGtleSkpIHsKLQkJCXBkLnNldEJvdW5kKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChDT05TVFJBSU5FRC5lcXVhbHMoa2V5KSkgewotCQkJcGQuc2V0Q29uc3RyYWluZWQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKFBST1BFUlRZRURJVE9SQ0xBU1MuZXF1YWxzKGtleSkpIHsKLQkJCXBkLnNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKENsYXNzKSB2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoRklFTERQUk9QRVJUWS5lcXVhbHMoa2V5KSkKLQkJCXJldHVybiB0cnVlOwkvLyBUaGlzIHNob3VsZCBub3QgYmUgYXBwbGllZCBleGNlcHQgdGhyb3VnaCBjcmVhdGVGaWVsZFByb3BlcnR5LgotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5UHJvcGVydHlBcmd1bWVudHMoUHJvcGVydHlEZXNjcmlwdG9yIHBkLCBPYmplY3RbXSBhcmdzLCBDbGFzcyBjbHMpIHsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQkJCi0JCQkJaWYgKCFhcHBseUNvbW1vblByb3BlcnR5QXJndW1lbnRzKHBkLCBrZXksIHZhbHVlKSkgewotCQkJCQlpZiAoUkVBRE1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJCU1ldGhvZCBtZXRob2Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1ldGhvZCA9IGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzWzBdKTsKLQkJCQkJCQlwZC5zZXRSZWFkTWV0aG9kKG1ldGhvZCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93RXJyb3IoZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoInswfV9ub19yZWFkX21ldGhvZF9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGNscywgbWV0aG9kTmFtZX0pKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChXUklURU1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewotCQkJCQkJCQlwZC5zZXRXcml0ZU1ldGhvZChudWxsKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlNZXRob2QgbWV0aG9kOwotCQkJCQkJCQlDbGFzcyB0eXBlID0gcGQuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQkJCQkJCW1ldGhvZCA9IGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzW10geyB0eXBlfSk7Ci0JCQkJCQkJCXBkLnNldFdyaXRlTWV0aG9kKG1ldGhvZCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJ7MH1fbm9fd3JpdGVfbWV0aG9kX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgY2xzLCBtZXRob2ROYW1lfSkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gYXJiaXRyYXJ5IHZhbHVlCi0JCQkJCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKHBkLCBrZXksIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlGaWVsZEFyZ3VtZW50cyhQcm9wZXJ0eURlc2NyaXB0b3IgcGQsIE9iamVjdFtdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0KLQkJCQlpZiAoIWFwcGx5Q29tbW9uUHJvcGVydHlBcmd1bWVudHMocGQsIGtleSwgdmFsdWUpKSB7Ci0JCQkJCWlmIChSRUFETUVUSE9ELmVxdWFscyhrZXkpKSB7Ci0JCQkJCQkvLyBpZ25vcmVkIGZvciBmaWVsZC4KLQkJCQkJfSBlbHNlIGlmIChXUklURU1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQkJLy8gaWdub3JlZCBmb3IgZmllbGQuCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhcmJpdHJhcnkgdmFsdWUKLQkJCQkJCXNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUocGQsIGtleSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBtZXRob2QgYnkgY29tcGFyaW5nIChuYW1lICYgcGFyYW1ldGVyIHNpemUpIGFnYWluc3QgdGhlIG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIGFuZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmCi0JICogZ2V0TWV0aG9kIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVyIHR5cGVzIGNhbid0IGZpbmQgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCi0JICogQHBhcmFtIGFDbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyYW1ldGVyQ291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGZpbmRNZXRob2QoamF2YS5sYW5nLkNsYXNzIGFDbGFzcywgamF2YS5sYW5nLlN0cmluZyBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBTaW5jZSB0aGlzIG1ldGhvZCBhdHRlbXB0cyB0byBmaW5kIGEgbWV0aG9kIGJ5IGdldHRpbmcgYWxsIG1ldGhvZHMgZnJvbSB0aGUgY2xhc3MsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBnZXRNZXRob2QKLQkJCSAqIGNhbm5vdCBmaW5kIHRoZSBtZXRob2QuCi0JCQkgKi8KLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2RzW10gPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaW5kZXhdOwotCQkJCWlmICgobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KSAmJiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpKSB7IHJldHVybiBtZXRob2Q7IH0KLQkJCQk7Ci0JCQl9Ci0JCQk7Ci0JCX0gY2F0Y2ggKGphdmEubGFuZy5UaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIGEgZ2l2ZW4gbmFtZSBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGRzCi0JICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgdG8gc2VhcmNoLCBtYXkgYmUgbnVsbC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2VhcmNoIGZvci4KLQkgKiBAcmV0dXJuIFRoZSBmb3VuZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZFByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMocGRzW2ldLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5iZWFucy5CZWFuSW5mbyNnZXREZWZhdWx0RXZlbnRJbmRleCgpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0RXZlbnRJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5iZWFucy5CZWFuSW5mbyNnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmJlYW5zLlNpbXBsZUJlYW5JbmZvI2dldEJlYW5EZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7Ci0JCS8vIERlZmF1bHQgaXMgdG8gY3JlYXRlIGFuIGVtcHR5IG9uZS4KLQkJcmV0dXJuIGNyZWF0ZUJlYW5EZXNjcmlwdG9yKGdldEJlYW5DbGFzcygpLCBFTVBUWV9BUkdTKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBmb3IgQmVhbkluZm8uIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCByZXR1cm4gdGhlIEJlYW5JbmZvIG9mIHRoZSBzdXBlcmNsYXNzLgotCSAqIAotCSAqIEBzZWUgQmVhbkluZm8jZ2V0QWRkaXRpb25hbEJlYW5JbmZvKCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQmVhbkluZm9bXSBnZXRBZGRpdGlvbmFsQmVhbkluZm8oKSB7Ci0JCXRyeSB7Ci0JCQlCZWFuSW5mb1tdIHJlc3VsdCA9IG5ldyBCZWFuSW5mb1tdIHsgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGdldEJlYW5DbGFzcygpLmdldFN1cGVyY2xhc3MoKSl9OwotCQkJUHJvcGVydHlEZXNjcmlwdG9yW10gb1BEcyA9IHJlc3VsdFswXS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBuUERzID0gb3ZlcnJpZGVQcm9wZXJ0eURlc2NyaXB0b3JzKG9QRHMpOwotCQkJaWYgKG9QRHMgIT0gblBEcykKLQkJCQlyZXN1bHRbMF0gPSBuZXcgT3ZlcnJpZGVQREJlYW5JbmZvKHJlc3VsdFswXSwgblBEcyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgQmVhbkluZm9bMF07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPdmVycmlkZVBEQmVhbkluZm8gaW1wbGVtZW50cyBCZWFuSW5mbyB7Ci0KLQkJcHJpdmF0ZSBCZWFuSW5mbyBvcmlnaW5hbEJlYW5JbmZvOwotCi0JCXByaXZhdGUgUHJvcGVydHlEZXNjcmlwdG9yW10gb3ZlcnJpZGVQRHM7Ci0KLQkJcHVibGljIE92ZXJyaWRlUERCZWFuSW5mbyhCZWFuSW5mbyBiaSwgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzKSB7Ci0JCQlvcmlnaW5hbEJlYW5JbmZvID0gYmk7Ci0JCQlvdmVycmlkZVBEcyA9IHBkczsKLQkJfQotCi0JCXB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldEFkZGl0aW9uYWxCZWFuSW5mbygpOwotCQl9Ci0KLQkJcHVibGljIEJlYW5EZXNjcmlwdG9yIGdldEJlYW5EZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0QmVhbkRlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEV2ZW50SW5kZXgoKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxCZWFuSW5mby5nZXREZWZhdWx0RXZlbnRJbmRleCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREZWZhdWx0UHJvcGVydHlJbmRleCgpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldERlZmF1bHRQcm9wZXJ0eUluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yW10gZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJY29uKGludCBpY29uS2luZCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0SWNvbihpY29uS2luZCk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRGVzY3JpcHRvcltdIGdldE1ldGhvZERlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCXB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIG92ZXJyaWRlUERzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgb3ZlcnJpZGVzIHRvIHBhcmVudCBiZWFuaW5mby4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSB3aXNoIHRvIG92ZXJyaWRlIGFuZCBjaGFuZ2UgYW55IGluaGVyaXRlZCBwcm9wZXJ0aWVzLiBUaGlzCi0JICogYWxsb3dzIHJlbW92YWwgb2YgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3IgY2hhbmdlcyBvZiBzcGVjaWZpYyBwcm9wZXJ0aWVzIChzdWNoIGFzIGNoYW5nZSBmcm9tIGhpZGRlbiB0byBub3QgaGlkZGVuKS4KLQkgKiAKLQkgKiBOb3RlOiBJZiB0aGVyZSBhbnkgY2hhbmdlcywgdGhpcyBtdXN0IHJldHVybiBhIERJRkZFUkVOVCBhcnJheS4gSWYgaXQgcmV0dXJucyB0aGUgc2FtZSBhcnJheSwgdGhlbiB0aGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gSWYganVzdAotCSAqIG92ZXJyaWRpbmcsIHNob3VsZCB1c2UgcGRzLmNsb25lKCkgdG8gZ2V0IHRoZSBuZXcgYXJyYXkgYW5kIHRoZW4gY2hhbmdlIHRoZSBzcGVjaWZpYyBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBwZHMKLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2hhbmdlZCBhcnJheSBvciB0aGUgc2FtZSBhcnJheSBpZiBubyBjaGFuZ2VzLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eURlc2NyaXB0b3JbXSBvdmVycmlkZVByb3BlcnR5RGVzY3JpcHRvcnMoUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzKSB7Ci0JCXJldHVybiBwZHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiZWFuIGNsYXNzIHRoaXMgYmVhbmluZm8gaXMgZm9yLiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gcXVpY2tseSBnZXQgdGhlIGJlYW4gY2xhc3Mgd2l0aG91dCBoYXZpbmcgdG8gY29kZSBpdCBvdmVyIGFuZCBvdmVyLgotCSAqIAotCSAqIEByZXR1cm4gYmVhbiBjbGFzcyBmb3IgdGhpcyBiZWFuaW5mby4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0QmVhbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGJlYW4gaW5mb3JtYXRpb24gY2xhc3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gQnkgZGVmYXVsdCBpdCBwcmludHMgYSBtZXNzYWdlIGFuZCB0aGVuIGEgc3RhY2t0cmFjZSB0byBzeXMgZXJyLgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5UaHJvd2FibGUKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlTeXN0ZW0uZXJyLnByaW50bG4oUkVTQlVORExFLmdldFN0cmluZygiVU5DQVVHSFRfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKEZlYXR1cmVEZXNjcmlwdG9yIGZkLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKERJU1BMQVlOQU1FLmVxdWFscyhrZXkpKSB7Ci0JCQlmZC5zZXREaXNwbGF5TmFtZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoRVhQRVJULmVxdWFscyhrZXkpKSB7Ci0JCQlmZC5zZXRFeHBlcnQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKEhJRERFTi5lcXVhbHMoa2V5KSkgewotCQkJZmQuc2V0SGlkZGVuKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChQUkVGRVJSRUQuZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldFByZWZlcnJlZCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlpZiAoSlZNXzFfMykgewotCQkJCS8vIEJ1ZyBpbiAxLjMgZG9lc24ndCBwcmVzZXJ2ZSB0aGUgcHJlZmVycmVkIGZsYWcsIHNvIHdlIHdpbGwgcHV0IGl0IGludG8gdGhlIGF0dHJpYnV0ZXMgdG9vLgotCQkJCWZkLnNldFZhbHVlKFBSRUZFUlJFRCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgaWYgKFNIT1JUREVTQ1JJUFRJT04uZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZykgdmFsdWUpOwotCQl9Ci0JCS8vIE90aGVyd2lzZSBhc3N1bWUgYW4gYXJiaXRyYXJ5LW5hbWVkIHZhbHVlCi0JCS8vIEFzc3VtZSB0aGF0IHRoZSBGZWF0dXJlRGVzY3JpcHRvciBwcml2YXRlIGhhc2hUYWJsZVwKLQkJLy8gY29udGFpbnMgb25seSBhcmJpdHJhcnktbmFtZWQgYXR0cmlidXRlcwotCQllbHNlIHsKLQkJCWZkLnNldFZhbHVlKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmF0YWwgZXJyb3JzIGFyZSBoYW5kbGVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QuIEJ5IGRlZmF1bHQgaXQgdGhyb3dzIGFuIEVycm9yIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIGV4Y2VwdGlvbiBtZXNzYWdlIHBsYWNlZCBpbnRvIHRoZSBuZXcgRXJyb3IgdGhyb3duLgotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBtZXNzYWdlIGFkZGVkIHRvIGV4Y2VwdGlvbiBtZXNzYWdlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RoaW5nIHRvIGFkZC4KLQkgKiAKLQkgKiBAdGhyb3dzIEVycm9yCi0JICogICAgICAgICAgICAgdHVybnMgZXhjZXB0aW9uIGludG8gYW4gRXJyb3IuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRocm93RXJyb3IoRXhjZXB0aW9uIGUsIFN0cmluZyBzKSB7Ci0JCXRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkgKyAiICIgKyBzKTsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmFzZWJlYW5pbmZvbmxzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyYTVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDgvMTEvMjYgMDY6NDA6MjEgJAotIwotCi0KLSMKLSMgUHJvcGVydGllcyBmb3IgdGhlIEl2akJlYW5JbmZvCi0jCi0KLSMKLSMgSXZqQmVhbkluZm8gU3RyaW5ncwotIwotQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyA9IElXQVYwMDExRSBDYW5ub3QgZ2V0IHRoZSBtZXRob2QgezB9LgotQ2Fubm90X2NyZWF0ZV90aGVfRTFfRVhDXyA9IElXQVYwMDEyRSBDYW5ub3QgY3JlYXRlIHRoZSBFdmVudFNldERlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18gPSBJV0FWMDAxM0UgQ2Fubm90IGNyZWF0ZSB0aGUgTWV0aG9kRGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2ZpbmRfdGhlX2FjYzFfRVhDXyA9IElXQVYwMDE0RSBDYW5ub3QgZmluZCBhdCBsZWFzdCB0aGUgd3JpdGUgb3IgcmVhZCBhY2Nlc3NvciBmb3IgcHJvcGVydHkgezB9LgotQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyA9IElXQVYwMDE1RSBDYW5ub3QgY3JlYXRlIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9QMSAgICAgID0gQ2Fubm90IGNyZWF0ZSB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIGZvciB7MH0uCi17MH1fbm9fcmVhZF9tZXRob2RfRVhDXyAgID0gSVdBVjAwMTZFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgcmVhZCBhY2Nlc3NvciB7MX0uCi17MH1fbm9fd3JpdGVfbWV0aG9kX0VYQ18gID0gSVdBVjAwMTdFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgd3JpdGUgYWNjZXNzb3IgezF9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmVhbmluZm8ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL2JlYW5pbmZvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZThkZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmVhbmluZm8ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iZWFuaW5mby5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwOC8xMS8yNiAwNjo0MDoyMSAkCi0jCi0KLQotIwotIyBQcm9wZXJ0aWVzIGZvciB0aGUgVkNFIEJlYW5pbmZvCi0jCi0KLSMKLSMgSXZqQmVhbkluZm8gU3RyaW5ncwotIwotQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyA9IElXQVYwMDA3RSBDYW5ub3QgZ2V0IHRoZSBtZXRob2QgezB9LgotQ2Fubm90X2NyZWF0ZV90aGVfRTFfRVhDXyA9IElXQVYwMDA4RSBDYW5ub3QgY3JlYXRlIHRoZSBFdmVudFNldERlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfTWV0aG9kX0VYQ18gPSBJV0FWMDAwOUUgQ2Fubm90IGNyZWF0ZSB0aGUgTWV0aG9kRGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2ZpbmRfdGhlX2FjYzFfRVhDXyA9IElXQVYwMDEwRSBDYW5ub3QgZmluZCBhdCBsZWFzdCB0aGUgd3JpdGUgb3IgcmVhZCBhY2Nlc3NvciBmb3IgcHJvcGVydHkgezB9LgotQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyA9IElXQVYwMTQ2RSBDYW5ub3QgY3JlYXRlIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfID0gSVdBVjAxNDdFIENhbm5vdCBjcmVhdGUgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBmb3IgezB9LgotezB9X25vX3JlYWRfbWV0aG9kX0VYQ18gICA9IElXQVYwMTQ4RSBDbGFzcyB7MH0gZG9lc24nJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHJlYWQgYWNjZXNzb3IgezF9LgotezB9X25vX3dyaXRlX21ldGhvZF9FWENfICA9IElXQVYwMTQ5RSBDbGFzcyB7MH0gZG9lc24nJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHdyaXRlIGFjY2Vzc29yIHsxfS4KLVVOQ0FVR0hUX0VYQ18gICAgICAgICAgICAgPSBJV0FWMDEyM0UgLS0tLS0tLS0tIFVOQ0FVR0hUIEVYQ0VQVElPTiAtLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0JlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0JlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5OWRlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9CZWFuRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0vKioKLSAqIEVxdWFsaXR5IHRlc3RlciBmb3IgQmVhbkRlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuRGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoQmVhbkRlc2NyaXB0b3IuY2xhc3MsIChCZWFuRGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7QmVhbkRlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuCi0JICovCi0JcHVibGljIEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3JFcXVhbGl0eShCZWFuRGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlCZWFuRGVzY3JpcHRvciBiZCA9IChCZWFuRGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0JCWludCBoYyA9IGJkLmdldEJlYW5DbGFzcygpLmhhc2hDb2RlKCk7Ci0JCWlmIChiZC5nZXRDdXN0b21pemVyQ2xhc3MoKSAhPSBudWxsKQotCQkJaGMgKz0gYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkuaGFzaENvZGUoKTsKLQkJCQotCQlyZXR1cm4gaGFzaGNvZGUqMzEgKyBoYzsKLQl9Ci0JIAotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotIAkKLQkJQmVhbkRlc2NyaXB0b3Igb2IgPSAoQmVhbkRlc2NyaXB0b3IpICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZTsKLQkJQmVhbkRlc2NyaXB0b3IgZmIgPSAoQmVhbkRlc2NyaXB0b3IpIGZGZWF0dXJlOwotIAkJCi0JCWlmIChvYi5nZXRCZWFuQ2xhc3MoKSAhPSBmYi5nZXRCZWFuQ2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iLmdldEN1c3RvbWl6ZXJDbGFzcygpICE9IGZiLmdldEN1c3RvbWl6ZXJDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotIAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9FdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzYWE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9FdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0vKioKLSAqIEVxdWFsaXR5IHRlc3RlciBmb3IgRXZlbnRTZXREZXNjcmlwdG9ycwotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQkKLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChFdmVudFNldERlc2NyaXB0b3IuY2xhc3MsIChFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0V2ZW50U2V0RGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEFycmF5TGlzdCBmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9yczsJLy8gQXJyYXkgb2YgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5J3MuCi0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5LgotCSAqLwotCXB1YmxpYyBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eShFdmVudFNldERlc2NyaXB0b3IgZGVzY3IpIHsKLQkJc3VwZXIoZGVzY3IpOwotCX0KLQkKLQkvKioKLQkgKiBBIG5ldyBmZWF0dXJlIGlzIGJlaW5nIHNldCBpbnRvIHRoaXMgb2JqZWN0LAotCSAqIGNsZWFyIGFueSBjYWNoZSBtZW1iZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZC4KLQkgKgotCSAqIE5PVEU6IFN1YmNsYXNzZXMgLSByZW1lbWJlciB0byBjYWxsIHN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyRmVhdHVyZSgpIHsKLQkJc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JCWZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID0gbnVsbDsKLQl9Ci0JCQotCXByb3RlY3RlZCBBcnJheUxpc3QgbGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpIHsKLQkJaWYgKGZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCU1ldGhvZERlc2NyaXB0b3JbXSBtZHMgPSAoKEV2ZW50U2V0RGVzY3JpcHRvcikgZkZlYXR1cmUpLmdldExpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJCWZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChtZHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZHMubGVuZ3RoOyBpKyspCi0JCQkJZkxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMuYWRkKG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkobWRzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzOwotCX0JCi0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JCUV2ZW50U2V0RGVzY3JpcHRvciBiZCA9IChFdmVudFNldERlc2NyaXB0b3IpIGZGZWF0dXJlOwotCQlpbnQgaGMgPSBiZC5nZXRBZGRMaXN0ZW5lck1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBiZC5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJaW50IG1oYyA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKQotCQkJbWhjID0gbWhjKjMxICsgbWV0aG9kc1tpXS5oYXNoQ29kZSgpOwotCQloYyArPSBtaGM7Ci0JCWhjICs9IGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKS5oYXNoQ29kZSgpOwotCQloYyArPSBiZC5nZXRMaXN0ZW5lclR5cGUoKS5oYXNoQ29kZSgpOwotCQloYyArPSBiZC5nZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCWhjICs9IChiZC5pc0luRGVmYXVsdEV2ZW50U2V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQloYyArPSAoYmQuaXNVbmljYXN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwkJCi0KLQkJcmV0dXJuIGhhc2hjb2RlKjMxICsgaGM7Ci0JfQotCi0JIAotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0gCQkJcmV0dXJuIGZhbHNlOwotIAkKLQkJRXZlbnRTZXREZXNjcmlwdG9yIG9lID0gKEV2ZW50U2V0RGVzY3JpcHRvcikgKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlOwotCQlFdmVudFNldERlc2NyaXB0b3IgZmUgPSAoRXZlbnRTZXREZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJCi0JCUV2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5IG9lZSA9IChFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eSkgb2JqOwotIAkJCi0JCWlmICghb2UuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKS5lcXVhbHMoZmUuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMob2UuZ2V0TGlzdGVuZXJNZXRob2RzKCksIGZlLmdldExpc3RlbmVyTWV0aG9kcygpKSkKLQkJCXJldHVybiBmYWxzZTsJCi0JCWlmIChvZS5nZXRMaXN0ZW5lclR5cGUoKSAhPSBmZS5nZXRMaXN0ZW5lclR5cGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9lLmdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkgIT0gZmUuZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9lLmlzSW5EZWZhdWx0RXZlbnRTZXQoKSAhPSBmZS5pc0luRGVmYXVsdEV2ZW50U2V0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvZS5pc1VuaWNhc3QoKSAhPSBvZS5pc1VuaWNhc3QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyAhPSBudWxsIHx8IG9lZS5mTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBNYXAgbG9va3VwIHNpdHVhdGlvbiwgc28gb25lIHNpZGUgaGFzIGxpc3RlbmVyIG1ldGhvZCBlcXVhbGl0aWVzLCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhhdCB3YXkuCi0JCQlpZiAoIW9lZS5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCkuZXF1YWxzKGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKSkpCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJLy8gV2UgYXJlIGluIHRoZSBidWlsZGluZyB0aGUgbGlzdCBwaGFzZXMsIGRvbid0IHdhc3RlIHNwYWNlIGJ1aWxkaW5nIGVudGlyZSBsaXN0LgotCQkJTWV0aG9kRGVzY3JpcHRvcltdIG91cnMgPSBmZS5nZXRMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JCQlNZXRob2REZXNjcmlwdG9yW10gdGhlaXJzID0gb2UuZ2V0TGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpOwotCQkJaWYgKG91cnMubGVuZ3RoICE9IHRoZWlycy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG91cnMubGVuZ3RoID4gMCkgewotCQkJCU1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nT3VycyA9IG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ1RoaWVycyA9IG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG91cnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJd29ya2luZ091cnMuc2V0RmVhdHVyZShvdXJzW2ldKTsKLQkJCQkJd29ya2luZ1RoaWVycy5zZXRGZWF0dXJlKHRoZWlyc1tpXSk7Ci0JCQkJCWlmICghd29ya2luZ091cnMuZXF1YWxzKHdvcmtpbmdUaGllcnMpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkJCi0JCXJldHVybiB0cnVlOwkJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0ZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0ZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4ODM5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9GZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0vKioKLSAqIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gdGVzdCBmb3Igc2VtYW50aWMgZXF1YWxpdHkgKGVxdWFscygpKQotICogYmV0d2VlbiBmZWF0dXJlIG9iamVjdHMuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIEZlYXR1cmUncyBkb24ndAotICogcHJvdmlkZSBhIHNlbWFudGljIGVxdWFsaXR5LCBvbmx5IGFuIGlkZW50aXR5IGVxdWFsaXR5LiBOZWVkCi0gKiBzZW1hbnRpYyBlcXVhbGl0eSBzbyB0aGF0IGtleXMgaW4gbWFwIGNhbiBiZSBmb3VuZCBlcXVhbAotICogc2VtYW50aWNhbGx5LgotICovCi0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQlwcm90ZWN0ZWQgRmVhdHVyZURlc2NyaXB0b3IgZkZlYXR1cmU7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGZWYWx1ZXM7CS8vIFRoZSBrZXkvdmFsdWVzIGZvciB0aGlzIGZlYXR1cmUuIFdlIGdyYWIgdGhlbSBvdXQKLQkJCQkJCQkJLy8gc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgcmUtZ2V0dGluZyB0aGVtIGZvciBlcXVhbGl0eQotCQkJCQkJCQkvLyBjb21wYXJlcy4gVGhpcyBpcyBkb25lIHRoZSBmaXJzdCB0aW1lIG5lZWRlZCBpbiB0aGUgZXF1YWxzCi0JCQkJCQkJCS8vIHN0YXRlbWVudC4KLQkJCQkJCQkJCi0JcHJpdmF0ZSBpbnQgZkhhc2hDb2RlID0gMDsJLy8gSGFzaGNvZGUgb2YgdGhpcyBlcXVhbGl0eSBvYmplY3QuIFRoZSBoYXNoY29kZSBmb3IgdGhlIGZlYXR1cmUgaXMgZXhwZW5zaXZlCi0JCQkJCS8vIHNvIHdlIHdpbGwgY2FsY3VsYXRlIGl0IG9uY2UgKHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQKLQkJCQkJLy8gZmVhdHVyZXMgb25jZSBjcmVhdGVkIGFyZW4ndCBjaGFuZ2VkLCB3aGljaCBmb3Igb3VyCi0JCQkJCS8vIHB1cnBvc2VzIGhlcmUgaW4gYmVhbmluZm8gbGFuZCBpcyBnb29kKS4KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIE1BUF9FUVVBTElUWSA9IG5ldyBIYXNoTWFwKDEwKTsJLy8gTWFwIGZyb20gZGVzY3JpcHRvciB0byBlcXVhbGl0eSB0eXBlLgotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlNQVBfRVFVQUxJVFkucHV0KEZlYXR1cmVEZXNjcmlwdG9yLmNsYXNzLCAoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0ZlYXR1cmVEZXNjcmlwdG9yLmNsYXNzfSkpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JCS8vIE5lZWQgdG8gc2V0IHVwIHRoZSBvdGhlcnMuCi0JCUJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuSU5JVCgpOwotCQlFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5JTklUKCk7CQkKLQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsKLQkJTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsJCQotCQlQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuSU5JVCgpOwotCX0KLQkJCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRvciBlcXVhbGl0eSBmb3IgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IGNyZWF0ZUVxdWFsaXR5KEZlYXR1cmVEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpICgoQ29uc3RydWN0b3IpIE1BUF9FUVVBTElUWS5nZXQoZGVzY3IuZ2V0Q2xhc3MoKSkpLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7ZGVzY3J9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogTk9URTogRXZlcnkgc3ViY2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50IGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kczoKLQkgKiAgICAgICBjYWxjdWxhdGVIYXNoQ29kZQotCSAqICAgICAgIGVxdWFscwotCSAqICAgICAgIGNsZWFyRmVhdHVyZSAtIGlmIGl0IGhhcyBhbnkgY2FjaGUgdmFsdWVzCi0JICovCi0JCQkJCQotCXB1YmxpYyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KEZlYXR1cmVEZXNjcmlwdG9yIGZlYXR1cmUpIHsKLQkJc2V0RmVhdHVyZShmZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RmVhdHVyZShGZWF0dXJlRGVzY3JpcHRvciBmZWF0dXJlKSB7Ci0JCWNsZWFyRmVhdHVyZSgpOwotCQlmRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCS8qKgotCSAqIEEgbmV3IGZlYXR1cmUgaXMgYmVpbmcgc2V0IGludG8gdGhpcyBvYmplY3QsCi0JICogY2xlYXIgYW55IGNhY2hlIG1lbWJlcnMgc28gdGhhdCB0aGV5IGNhbiBiZSByZWNvbnN0cnVjdGVkLgotCSAqCi0JICogTk9URTogU3ViY2xhc3NlcyAtIHJlbWVtYmVyIHRvIGNhbGwgc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJGZWF0dXJlKCkgewotCQlmVmFsdWVzID0gbnVsbDsKLQkJZkhhc2hDb2RlID0gMDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGZIYXNoQ29kZSA9PSAwKQotCQkJZkhhc2hDb2RlID0gY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJcmV0dXJuIGZIYXNoQ29kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcCB2YWx1ZXMoKSB7Ci0JCWlmIChmVmFsdWVzID09IG51bGwpIHsKLQkJCWZWYWx1ZXMgPSBuZXcgSGFzaE1hcCg1KTsKLQkJCQotCQkJRW51bWVyYXRpb24ga2V5cyA9IGZGZWF0dXJlLmF0dHJpYnV0ZU5hbWVzKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkJZlZhbHVlcy5wdXQoa2V5LCBmRmVhdHVyZS5nZXRWYWx1ZShrZXkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlZhbHVlczsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IDA7Ci0JCWlmIChmRmVhdHVyZS5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCWhhc2hjb2RlICs9IGZGZWF0dXJlLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJCi0JCWlmIChmRmVhdHVyZS5nZXREaXNwbGF5TmFtZSgpICE9IGZGZWF0dXJlLmdldE5hbWUoKSkKLQkJCWhhc2hjb2RlICs9IGZGZWF0dXJlLmdldERpc3BsYXlOYW1lKCkuaGFzaENvZGUoKTsKLQkJaWYgKGZGZWF0dXJlLmdldFNob3J0RGVzY3JpcHRpb24oKSAhPSBmRmVhdHVyZS5nZXREaXNwbGF5TmFtZSgpKQotCQkJaGFzaGNvZGUgKz0gZkZlYXR1cmUuZ2V0U2hvcnREZXNjcmlwdGlvbigpLmhhc2hDb2RlKCk7CQkJCi0JCQkKLQkJaGFzaGNvZGUgKz0gKGZGZWF0dXJlLmlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQloYXNoY29kZSArPSAoZkZlYXR1cmUuaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpLmhhc2hDb2RlKCk7CQkKLQkJaGFzaGNvZGUgKz0gKGZGZWF0dXJlLmlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQkKLQkJaGFzaGNvZGUgKz0gdmFsdWVzKCkuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2hjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBlcXVhbHM6IFNlZSBpZiB0aGlzIGlzIGVxdWFsIHNlbWFudGljYWxseS4KLQkgKgotCSAqIE5PVEU6IEV2ZXJ5IHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudCB0aGlzIGFuZAotCSAqICAgICAgIHRoZSBmaXJzdCBmZXcgbGluZXMgc2hvdWxkIGJlOgotCSAqICAgICAgICAgaWYgKGlkZW50aXR5VGVzdCgpKQotCSAqICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgKiAgICAgICAgIGlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JICogICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgKi8KLQkgCi0JIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IG9mZSA9IChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmo7CSAJCQotCSAJRmVhdHVyZURlc2NyaXB0b3Igb2YgPSBvZmUuZkZlYXR1cmU7Ci0JIAkJCi0JIAlpZiAoZkZlYXR1cmUuZ2V0Q2xhc3MoKSAhPSBvZi5nZXRDbGFzcygpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCQkKLQkgCWlmICghZkZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyhvZi5nZXROYW1lKCkpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCWlmICghZkZlYXR1cmUuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMob2YuZ2V0RGlzcGxheU5hbWUoKSkpCi0JIAkJcmV0dXJuIGZhbHNlOwotCSAJaWYgKCFmRmVhdHVyZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkuZXF1YWxzKG9mLmdldFNob3J0RGVzY3JpcHRpb24oKSkpCi0JIAkJcmV0dXJuIGZhbHNlOwkgCi0JIAlpZiAoZkZlYXR1cmUuaXNFeHBlcnQoKSAhPSBvZi5pc0V4cGVydCgpIHx8Ci0JCSAJCWZGZWF0dXJlLmlzSGlkZGVuKCkgIT0gb2YuaXNIaWRkZW4oKSB8fAotCQkgCQlmRmVhdHVyZS5pc1ByZWZlcnJlZCgpICE9IG9mLmlzUHJlZmVycmVkKCkpCi0JIAkJcmV0dXJuIGZhbHNlOwotCSAJCi0JCWlmICghdmFsdWVzKCkuZXF1YWxzKG9mZS52YWx1ZXMoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCSB9Ci0JIAotCSAvKgotCSAgKiBJZGVudGl0eSB0ZXN0OiBUZXN0cyBmb3IgcXVpY2sgaWRlbnRpdHkgb2YKLQkgICogZGVzY3JpcHRvcnMuIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIAotCSAgKiBubyBvdGhlciB0ZXN0cyByZXF1aXJlZC4KLQkgICovCi0JIHByb3RlY3RlZCBib29sZWFuIGlkZW50aXR5VGVzdChPYmplY3Qgb2JqKSB7Ci0JIAlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSkKLQkgCQlyZXR1cm4gZmFsc2U7Ci0JIAlpZiAodGhpcyA9PSBvYmopCi0JIAkJcmV0dXJuIHRydWU7Ci0KLQkgCWlmICgoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmUgPT0gZkZlYXR1cmUpCi0JIAkJcmV0dXJuIHRydWU7Ci0JIAkJCi0JIAlyZXR1cm4gZmFsc2U7CSAJCi0JIH0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0luZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjEwMGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0luZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotLyoqCi0gKiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkgewotCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvci5jbGFzcywgKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1Byb3BlcnR5RGVzY3JpcHRvci5jbGFzc30pKTsKLQkJCU1BUF9FUVVBTElUWS5wdXQoUHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzLCAoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7UHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzfSkpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGhhc2hjb2RlIGZvciB0aGUgY3VycmVudCBmZWF0dXJlLCBhZGQgdGhpcwotCSAqIHRvIHRoZSBoYXNoY29kZSByZWNlaXZlZCBmcm9tIHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlCi0JICogYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqCi0JICogTk9URTogZm9yIHN1YmNsYXNzZXMsIGl0IGlzIE1BTkRJVE9SWSB0aGF0IHRoZSBmaXJzdCBsaW5lIGJlOgotCSAqICAgICAgICAgaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkgKiAgICAgICBhbmQgdGhlIGxhc3QgbGluZSBiZToKLQkgKiAgICAgICAgIHJldHVybiBoYXNoY29kZSozMSArICh5b3VyIGNhbGN1bGF0ZWQgaGFzaGNvZGUgZm9yIGp1c3QgdGhpcyBzdWJjbGFzcyk7Ci0JICovCi0JcHJvdGVjdGVkIGludCBjYWxjdWxhdGVIYXNoQ29kZSgpIHsKLQkJaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJaWYgKGZGZWF0dXJlIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJCQotCQkJaW50IGhjID0gcGQuZ2V0SW5kZXhlZFByb3BlcnR5VHlwZSgpLmhhc2hDb2RlKCk7Ci0JCi0JCQlpZiAocGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSAhPSBudWxsKQotCQkJCWhjICs9IHBkLmdldEluZGV4ZWRSZWFkTWV0aG9kKCkuaGFzaENvZGUoKTsKLQkJCWlmIChwZC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKSAhPSBudWxsKQotCQkJCWhjICs9IHBkLmdldEluZGV4ZWRXcml0ZU1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCQlyZXR1cm4gaGFzaGNvZGUqMzEgKyBoYzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gaGFzaGNvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZkZlYXR1cmUuZ2V0Q2xhc3MoKSAhPSAoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmUuZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsJLy8gSWYgdGhleSBhcmVuJ3QgYm90aCBQcm9wZXJ0eURlc2NpcHRvcnMgb3IgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcnMsIHRoZW4gdGhleSBkb24ndCBtYXRjaC4KLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLSAJCi0JCWlmIChmRmVhdHVyZSBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCUluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3Igb3AgPSAoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlOwotCQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBmcCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQotCQkJaWYgKG9wLmdldEluZGV4ZWRQcm9wZXJ0eVR5cGUoKSAhPSBmcC5nZXRJbmRleGVkUHJvcGVydHlUeXBlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9wLmdldEluZGV4ZWRSZWFkTWV0aG9kKCkgIT0gZnAuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob3AuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgIT0gZnAuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpCi0JCQkJcmV0dXJuIGZhbHNlOyAKLQkJfQkJCQkJCQkJCQkJCQkKLQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9NZXRob2REZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTYxNTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLS8qKgotICogRXF1YWxpdHkgdGVzdGVyIGZvciBNZXRob2REZXNjcmlwdG9ycwotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0JCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoTWV0aG9kRGVzY3JpcHRvci5jbGFzcywgKE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge01ldGhvZERlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgQXJyYXlMaXN0IGZQYXJhbWV0ZXJEZXNjcmlwdG9yczsJLy8gQXJyYXkgb2YgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5J3MuCi0JCi0JcHVibGljIE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eShNZXRob2REZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBuZXcgZmVhdHVyZSBpcyBiZWluZyBzZXQgaW50byB0aGlzIG9iamVjdCwKLQkgKiBjbGVhciBhbnkgY2FjaGUgbWVtYmVycyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlY29uc3RydWN0ZWQuCi0JICoKLQkgKiBOT1RFOiBTdWJjbGFzc2VzIC0gcmVtZW1iZXIgdG8gY2FsbCBzdXBlci5jbGVhckZlYXR1cmUoKTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckZlYXR1cmUoKSB7Ci0JCXN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCQlmUGFyYW1ldGVyRGVzY3JpcHRvcnMgPSBudWxsOwotCX0JCi0JCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBwYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKGZQYXJhbWV0ZXJEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlQYXJhbWV0ZXJEZXNjcmlwdG9yW10gcGRzID0gKChNZXRob2REZXNjcmlwdG9yKSBmRmVhdHVyZSkuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCWlmIChwZHMgIT0gbnVsbCkgewkJCQotCQkJCWZQYXJhbWV0ZXJEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QocGRzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHBkcy5sZW5ndGg7IGkrKykKLQkJCQkJZlBhcmFtZXRlckRlc2NyaXB0b3JzLmFkZChuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5KHBkc1tpXSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFyYW1ldGVyRGVzY3JpcHRvcnM7Ci0JfQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlNZXRob2REZXNjcmlwdG9yIGJkID0gKE1ldGhvZERlc2NyaXB0b3IpIGZGZWF0dXJlOwotCQlpbnQgaGMgPSBiZC5nZXRNZXRob2QoKS5oYXNoQ29kZSgpOwotCQlpZiAocGFyYW1ldGVyRGVzY3JpcHRvcnMoKSAhPSBudWxsKQotCQkJaGMgKz0gcGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5oYXNoQ29kZSgpOyAKLQotCQlyZXR1cm4gaGFzaGNvZGUqMzEgKyBoYzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoaWRlbnRpdHlUZXN0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSBvZW0gPSAoTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KSBvYmo7Ci0JCU1ldGhvZERlc2NyaXB0b3Igb20gPSAoTWV0aG9kRGVzY3JpcHRvcikgb2VtLmZGZWF0dXJlOwotCQlNZXRob2REZXNjcmlwdG9yIGZtID0gKE1ldGhvZERlc2NyaXB0b3IpIGZGZWF0dXJlOwotIAkJCi0JCWlmIChmbS5nZXRNZXRob2QoKSAhPSBvbS5nZXRNZXRob2QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQkKLQkJaWYgKGZQYXJhbWV0ZXJEZXNjcmlwdG9ycyAhPSBudWxsIHx8IG9lbS5mUGFyYW1ldGVyRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJLy8gV2UgYXJlIGluIGEgTWFwIGxvb2t1cCBzaXR1YXRpb24sIHNvIG9uZSBzaWRlIGhhcyBsaXN0ZW5lciBtZXRob2QgZXF1YWxpdGllcywgc28gd2Ugd2lsbCBjb21wYXJlIHRoYXQgd2F5LgotCQkJaWYgKHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgPT0gbnVsbCkKLQkJCQlpZiAoKChNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikucGFyYW1ldGVyRGVzY3JpcHRvcnMoKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZSA7Ci0JCQllbHNlCi0JCQkJaWYgKCFwYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmVxdWFscygoKE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5wYXJhbWV0ZXJEZXNjcmlwdG9ycygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJLy8gV2UgYXJlIGluIHRoZSBidWlsZGluZyB0aGUgbGlzdCBwaGFzZXMsIGRvbid0IHdhc3RlIHNwYWNlIGJ1aWxkaW5nIGVudGlyZSBsaXN0LgotCQkJUGFyYW1ldGVyRGVzY3JpcHRvcltdIG91cnMgPSBmbS5nZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCQkJUGFyYW1ldGVyRGVzY3JpcHRvcltdIHRoZWlycyA9IG9tLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQlpZiAob3VycyA9PSB0aGVpcnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlIGlmIChvdXJzID09IG51bGwpCi0JCQkJaWYgKHRoZWlycyAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQk7Ci0JCQllbHNlIGlmICh0aGVpcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlIGlmIChvdXJzLmxlbmd0aCAhPSB0aGVpcnMubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UgaWYgKG91cnMubGVuZ3RoID4gMCkgewotCQkJCVBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nT3VycyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ1RoaWVycyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG91cnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJd29ya2luZ091cnMuc2V0RmVhdHVyZShvdXJzW2ldKTsKLQkJCQkJd29ya2luZ1RoaWVycy5zZXRGZWF0dXJlKHRoZWlyc1tpXSk7Ci0JCQkJCWlmICghd29ya2luZ091cnMuZXF1YWxzKHdvcmtpbmdUaGllcnMpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkJCQotIAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDQ1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5jb21tb24uSUJhc2VCZWFuSW5mb0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uQmFzZUJlYW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgYmVhbmluZm8gY2xhc3MgdGhhdCBpcyBjcmVhdGVkIHdoZW4gYmVhbmluZm8gbW9kZWxpbmcgaW50cm9zcGVjdHMgYSBiZWFuLiBJdHMgcHVycG9zZSBpcyB0byBnYXRoZXIgdG9nZXRoZXIgYW5kIGFuYWx5emUgdGhlCi0gKiBiZWFuaW5mby4gRm9yIGV4YW1wbGUsIGl0IGNoZWNrcyB3aXRoIHRoZSBzdXBlcnR5cGUgYmVhbmluZm8gdG8gc2VlIGlmIGFsbCBvZiB0aGUgc3VwZXJ0eXBlJ3MgZGVzY3JpcHRvcnMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbGlzdC4gSWYgdGhleSBhcmUsCi0gKiB0aGVuIGl0IGtub3dzIHRoYXQgaXQgZG9lcyBhIHN0cmFpZ2h0IGluaGVyaXRhbmNlIG9mIHRoZSBzdXBlcnR5cGUncyBkZXNjcmlwdG9ycywgYW5kIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFRoaXMgbWFrZXMgaXQKLSAqIGVhc2llciBvbiB0aGUgbW9kZWwgc2lkZSBzbyB0aGF0IHRoZXJlIGlzbid0IGEgZ3JlYXQgcHJvbGlmZXJhdGlvbiBvZiBkZXNjcmlwdG9ycyBhbGwgZGVzY3JpYmluZyB0aGUgc2FtZSBwcm9wZXJ0aWVzLiBJbiB0aGF0IGNhc2UgdGhleSBjYW4gYmUKLSAqIG1lcmdlZCBmcm9tIHRoZSBzdXBlcnR5cGUgbW9kZWwuIElmIHNvbWUgYXJlIG5vdCBmb3VuZCwgdGhlbiB0aGF0IG1lYW5zIHRoaXMgYmVhbmluZm8gaXMgdHJ5aW5nIHRvIGhpZGUgc29tZSBvZiB0aGVtLCBhbmQgaW4gdGhhdCBjYXNlIHRoaXMgaXMgdGhlCi0gKiBkZWZpbml0aXZlIGxpc3QgYW5kIGluaGVyaXRhbmNlIHNob3VsZG4ndCBiZSB1c2VkIG9uIHRoZSBtb2RlbCBzaWRlLiBIb3dldmVyLCBmb3IgdGhvc2UgZmVhdHVyZXMgd2hpY2ggYXJlIGVzc2VudGlhbGx5IHRoZSBpbmhlcml0ZWQgZmVhdHVyZSAoaS5lLgotICogdGhlIEJlYW5JbmZvIHNpbXBseSBmaWx0ZXJlZCBvdXQgc29tZSBpbmhlcml0ZWQgYnV0IG5vdCBhbGwpLCB0aGV5IHdpbGwgYmUgcmV0dXJuYWJsZSAoYnkgbmFtZSkuIFRoZSBJREUgc2lkZSB3aWxsIHRha2UgdGhlc2UgdGhhdCBhcmUgImluaGVyaXRlZCIKLSAqIGFuZCB3aWxsIHJldHVybiB0aGUgYWN0dWFsIHN0cnVjdHVyZWQgZmVhdHVyZSBmcm9tIHRoZSBpbmhlcml0ZWQgY2xhc3MuCi0gKiAKLSAqIFRoZSB0ZXN0IGZvciBzZWVpbmcgaWYgdGhlIHN1cGVyIGZlYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGJlYW5pbmZvIGlzIGZpcnN0IHRvIHNlZSBpZiB0aGUgdGhlIGZlYXR1cmUgaXMgaW4gdGhlIGJlYW5pbmZvIGJ5IG5hbWUsIGlmIGl0IGlzIHRoZW4KLSAqIGl0IGlzIG1hcmtlZCBhcyBpbmNsdWRlZC4gVGhlbiBhIGNoZWNrIGlzIG1hZGUgb24gZXF1YWxpdHksIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHRoZSBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgYmVhbmluZm8gbGlzdCwgYnV0IHRoZSBtZXJnZQotICogZmxhZyBpcyBzdGlsbCBsZWZ0IG9uLCBhbmQgcmVtb3ZlZCBpbmhlcml0ZWQgZmVhdHVyZSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgZmVhdHVyZXMuIElmIGFsbCBpbmhlcml0ZWQgZmVhdHVyZXMgYXJlIGZvdW5kLCB0aGlzIGxpc3QgaXMKLSAqIGNsZWFyZWQgYW5kIGZsYWcgaXMgc2V0IHdoaWNoIHNpbXBseSBzYXlzIG1lcmdlIGFsbCBpbmhlcml0ZWQuIFRoaXMgYWxsb3dzIG1lcmdpbmcgdG8gb2NjdXIgYnV0IGl0IGFsc28gYWxsb3dzIG92ZXJyaWRlcyB0byBvY2N1ci4KLSAqIAotICogTm90ZTogVGVzdCBmb3IgaWRlbnRpdHkgaXMgZGlmZmVyZW50IGJldHdlZW4gSkRLIDEuNSBhbmQgYWJvdmUgYW5kIGJlbG93LiAxLjUgYW5kIGFib3ZlLCB3ZSBjYW4gdXNlIGFjdHVhbCBlcXVhbHMoKSBiZWNhdXNlIHRoZSBzYW1lIGRlc2NyaXB0b3IgaXMKLSAqIHJldHVybmVkIGZyb20gaW5oZXJpdGVkIGZlYXR1cmVzLiBJbiAxLjMsIGNsb25lcyB3ZXJlIGFsd2F5cyByZXR1cm5lZCBhbmQgZXF1YWxzKCkgd291bGQgYW5zd2VyIGZhbHNlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgZXF1YWxpdHkKLSAqIGRlc2NyaXB0b3Igd2hpY2ggdHVybnMgdGhlIGVxdWFscygpIGludG8gb25lIHRoYXQgY2FuIHRlc3QgY2xvbmVzIGZvciBzZW1hbnRpYyBlcXVhbGl0eS4gU2VlIEphdmEgQnVnIElEIzQ5OTY2NzMgVGhlIHByb2JsZW0gd2FzIHN1cHBvc2VkIHRvIGJlCi0gKiBmaXhlZCBpbiAxLjQgYnV0IGl0IHdhcyBub3QgZml4ZWQuIE9yaWdpbmFsbHkgYSBuZXcgY2xvbmUgd2FzIGNyZWF0ZWQgZWFjaCB0aW1lIGEgYmVhbmluZm8gd2FzIHJlcXVlc3RlZC4gVGhhdCBpcyBubyBsb25nZXIgZG9uZSBpbiAxLjQsIGJ1dCB0aGUKLSAqIHByb2Nlc3NpbmcgdG8gY3JlYXRlIHRoZSBvcmlnaW5hbCBiZWFuaW5mbyBkb2VzIGEgY2xvbmUgYWNjaWRlbnRseSB1bmRlciB0aGUgY292ZXJzLiBMb29raW5nIGF0IDEuNSBpdCBsb29rcyB0aGlzIHdhcyBmaXhlZCwgYnV0IGl0IGhhc24ndCBiZWVuCi0gKiB0ZXN0ZWQgaGVyZSB5ZXQuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsaW5nQmVhbkluZm8gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBQUkUxNTsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJUFJFMTUgPSB2ZXJzaW9uLnN0YXJ0c1dpdGgoIjEuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFBSRTE1KSB7Ci0JCQkvLyBDb250aW51ZSB0byBjaGVjaywgZ2V0IHRoZSByZXZpc2lvbi4KLQkJCWludCByZXZpc2lvbiA9IDA7Ci0JCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA+IDIpIHsKLQkJCQlpbnQgcmV2RW5kID0gdmVyc2lvbi5pbmRleE9mKCcuJywgMik7Ci0JCQkJcmV2aXNpb24gPSB2ZXJzaW9uLmxlbmd0aCgpID4gMiA/IEludGVnZXIucGFyc2VJbnQocmV2RW5kICE9IC0xID8gdmVyc2lvbi5zdWJzdHJpbmcoMiwgcmV2RW5kKSA6IHZlcnNpb24uc3Vic3RyaW5nKDIpKSA6IDA7Ci0JCQkJUFJFMTUgPSByZXZpc2lvbiA8IDU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRmVhdHVyZUVxdWFsaXR5U2V0IGV4dGVuZHMgSGFzaFNldCB7Ci0KLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNzQ0Nzc2NzQwNjA0MzI4MzI0TDsKLQkJcHJpdmF0ZSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdLZXk7Ci0KLQkJcHVibGljIEZlYXR1cmVFcXVhbGl0eVNldChMaXN0IGZlYXR1cmVzKSB7Ci0JCQlzdXBlcihmZWF0dXJlcy5zaXplKCkpOwotCQkJLy8gR2V0IGZpcnN0IGZlYXR1cmUgdG8gZmlxdXJlIG91dCB0eXBlIG9mIHdvcmtpbmcga2V5LiBUaGlzIHdpbGwgbm90IGJlIHJlZW50cmFudC4KLQkJCXdvcmtpbmdLZXkgPSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmNyZWF0ZUVxdWFsaXR5KChGZWF0dXJlRGVzY3JpcHRvcikgZmVhdHVyZXMuZ2V0KDApKTsKLQkJCXRoaXMuYWRkQWxsKGZlYXR1cmVzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZChPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBzdXBlci5hZGQoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIG8pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCQl3b3JraW5nS2V5LnNldEZlYXR1cmUoKEZlYXR1cmVEZXNjcmlwdG9yKSBvKTsKLQkJCXJldHVybiBzdXBlci5jb250YWlucyh3b3JraW5nS2V5KTsKLQkJfQotCi0JfQotCi0JLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgaW5kaWNhdGUgaWYgdGhlIHN1cGVyIGluZm8gc2hvdWxkIGJlIG1lcmdlZAotCS8vIGluIG9uIHRoZSBtb2RlbCBzaWRlLiBubyBtZXJnZSBtZWFucyB0aGVyZSB3ZXJlIG5vIGluaGVyaXRlZCBtZXRob2RzIGF0IGFsbC4gU28gdGhlCi0JLy8gYmVhbmluZm8gcHJlc2VudGVkIGlzIGRlZmluaXRpdmUuIElmIG1lcmdlLCB0aGVuIGdldC4uLkRlc2NyaXB0b3JzIHdpbGwgcmV0dXJuIGp1c3QKLQkvLyB0aGUgb25lcyBmb3IgdGhpcyBsZXZlbCwgYW5kIGdldFN1cGVyLi4uRGVzY3JpcHRvcnMgd2lsbCByZXR1cm4gdGhlIGluaGVyaXRlZCBvbmVzLgotCS8vIFRob3VnaCBpbiB0aGlzIGNhc2UsIGlmIHRoZSByZXR1cm5lZCBzdXBlciBsaXN0IGlzIG51bGwsIHRoZW4gdGhhdCBtZWFucyB1c2UgQUxMIG9mCi0JLy8gdGhlIGluaGVyaXRlZCBvbmVzLgotCS8vIFRoZSBzdXBlciBsaXN0IHJldHVybnMgc2ltcGx5IHRoZSBuYW1lcywgZG9uJ3QgbmVlZCB0byBoYXZlIHRoZSBmdWxsIGRlc2NyaXB0b3JzIGluIHRoYXQgY2FzZS4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTWVyZ2VJbmhlcml0ZWRFdmVudHMgPSBmYWxzZSwgZk1lcmdlSW5oZXJpdGVkTWV0aG9kcyA9IGZhbHNlLCBmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQmVhbkluZm8gZlRhcmdldEJlYW5JbmZvOyAvLyBUaGUgYmVhbmluZm8gYmVpbmcgbW9kZWxlZC4KLQotCS8vIExvY2FsIGRlc2NyaXB0b3JzCi0JcHJvdGVjdGVkIEV2ZW50U2V0RGVzY3JpcHRvcltdIGZFdmVudFNldHM7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRGVzY3JpcHRvcltdIGZNZXRob2RzOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvcltdIGZQcm9wZXJ0aWVzOwotCi0JLy8gTm90IGluaGVyaXRlZCBkZXNjcmlwdG9yIG5hbWVzLCB3aWxsIGJlIG51bGwgaWYgbm8gbWVyZ2Ugb3IgaWYgbWVyZ2UgYWxsLiBUaGlzIGlzIGxpc3Qgb2YgbmFtZXMgdG8gTk9UIG1lcmdlLiBJdCBpcyB1c3VhbGx5IHNob3J0ZXIgdGhhbiB0aGUgbGlzdCB0byBtZXJnZSBmcm9tIHN1cGVyLgotCi0JLy8gTWV0aG9kcyBhcmUgc3BlY2lhbC4gWW91IGNhbiBoYXZlIGR1cGxpY2F0ZXMsIHNvIG5hbWUgaXMgbm90IHN1ZmZpY2llbnQuCi0JLy8gU28gZm9yIG1ldGhvZHMsCi0JLy8gd2lsbCB1c2UgYW4gYXJyYXkgb2YgU3RyaW5ncyB3aGVyZToKLQkvLyAgIEZvciBlYWNoIG9uZSB0aGUgZnVsbCBzaWduYXR1cmUKLQkvLyAgIHdpbGwgYmUgaW4gdGhlIGxpc3QsIGUuZy4gIm5hbWU6bWV0aG9kTmFtZShhcmd0eXBlLC4uLiIgd2hlcmUgYXJndHlwZSBpcyB0aGUgZnVsbHlxdWFsaWZpZWQKLQkvLyAgIGNsYXNzbmFtZSAodXNpbmcgIi4iIG5vdGF0aW9uIGZvciBpbm5lciBjbGFzc2VzKSwgYW5kIHVzaW5nIGZvcm1hdCAiamF2YS5sYW5nLlN0cmluZ1tdIiBmb3IKLQkvLyAgIGFycmF5cy4KLQkvLwotCS8vIFRoaXMgaXMgYmVjYXVzZSBldmVuIGlmIHRoZXJlIGFyZSBubyBkdXBsaWNhdGVzLCBpdCB3aWxsIHRha2UgbGVzcyB0aW1lL3NwYWNlIHRvIHNpbXBseSBjcmVhdGUgdGhlIGVudHJpZXMKLQkvLyB0aGVuIGl0IHdvdWxkIHRvIGNyZWF0ZSBhIHNldCB0byBzZWUgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgYW5kIHRoZW4gY3JlYXRlIHRoZSBmaW5hbCBhcnJheS4KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZk5vdEluaGVyaXRlZEV2ZW50U2V0czsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBmTm90SW5oZXJpdGVkTWV0aG9kczsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBmTm90SW5oZXJpdGVkUHJvcGVydGllczsKLQkKLQlwcm90ZWN0ZWQgaW50IGRvRmxhZ3M7Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBkbyBpbnRyb3NwZWN0aW9uIGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIE1vZGVsaW5nQmVhbkluZm8KLQkgKiAKLQkgKiBUaGlzIHdpbGwgYWx3YXlzIGludHJvc3BlY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbGluZ0JlYW5JbmZvIGludHJvc3BlY3QoQ2xhc3MgaW50cm9zcGVjdENsYXNzLCBpbnQgZG9GbGFncykgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotCQlyZXR1cm4gaW50cm9zcGVjdChpbnRyb3NwZWN0Q2xhc3MsIHRydWUsIGRvRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIHRvIGRvIGludHJvc3BlY3Rpb24gYW5kIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgTW9kZWxpbmdCZWFuSW5mbwotCSAqIAotCSAqIGludHJvc3BlY3RJZk5vQmVhbkluZm86IElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiBpZiBubyBleHBsaWNpdCBiZWFuaW5mbyB3YXMgZm91bmQgZm9yIHRoaXMgY2xhc3MsIHRoZW4gaW50cm9zcGVjdGlvbiB3aWxsIGJlIGRvbmUgYW55d2F5LiBUaGUKLQkgKiBJbnRyb3NwZWN0b3Igd2lsbCB1c2UgcmVmbGVjdGlvbiBmb3IgbG9jYWwgbWV0aG9kcy9ldmVudHMvcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzIGFuZCB0aGVuIGFkZCBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgc3VwZXJjbGFzcyBpbnRyb3NwZWN0aW9uLgotCSAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIGlmIHRoZSBleHBsaWNpdCBiZWFuaW5mbyBpcyBub3QgZm91bmQsIHRoZW4gbm8gaW50cm9zcGVjdGlvbiB3aWxsIGJlIGRvbmUgYW5kIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsaW5nQmVhbkluZm8gaW50cm9zcGVjdChDbGFzcyBpbnRyb3NwZWN0Q2xhc3MsIGJvb2xlYW4gaW50cm9zcGVjdElmTm9CZWFuSW5mbywgaW50IGRvRmxhZ3MpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFCZWFucy5pc0Rlc2lnblRpbWUoKSkKLQkJCUJlYW5zLnNldERlc2lnblRpbWUodHJ1ZSk7CS8vIFNpbmNlIHRoaXMgYSBqZW0gYmVhbmluZm8gc3BlY2lmaWMgdm0sIHdlIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgZGVzaWduIHRpbWUuCi0JCWlmICghaW50cm9zcGVjdElmTm9CZWFuSW5mbykgewotCQkJLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgYmVhbmluZm8gaXMgZXhwbGljaXRseSBzdXBwbGllZC4KLQkJCS8vIElmIG5vdCwgdGhlbiB3ZSByZXR1cm4gbnVsbC4KLQkJCS8vIFRoZSBjaGVja3Mgd2lsbCBiZSB0aGUgc2FtZSB0aGF0IEludHJvc3BlY3RvciB3aWxsIHVzZS4KLQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJLy8gMS4gSXMgdGhlcmUgYSBCZWFuSW5mbyBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCi0JCQlpZiAoIWNsYXNzRXhpc3RzKGludHJvc3BlY3RDbGFzcy5nZXROYW1lKCkgKyAiQmVhbkluZm8iLCBpbnRyb3NwZWN0Q2xhc3MpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAyLiBJcyB0aGlzIGNsYXNzIGEgQmVhbkluZm8gY2xhc3MgZm9yIGl0c2VsZi4KLQkJCQlpZiAoIShCZWFuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShpbnRyb3NwZWN0Q2xhc3MpKSB7Ci0JCQkJCS8vIDMuIENhbiB0aGlzIGNsYXNzIGJlIGZvdW5kIGluIHRoZSBCZWFuaW5mbyBzZWFyY2hwYXRoLgotCQkJCQlTdHJpbmdbXSBzZWFyY2hQYXRoID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvU2VhcmNoUGF0aCgpOwotCQkJCQlpbnQgc3RhcnRDbGFzc25hbWUgPSBpbnRyb3NwZWN0Q2xhc3MuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIuIikgKyAxOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBiaU5hbWUgPSAiLiIgKyBpbnRyb3NwZWN0Q2xhc3MuZ2V0TmFtZSgpLnN1YnN0cmluZyhzdGFydENsYXNzbmFtZSkgKyAiQmVhbkluZm8iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoY2xhc3NFeGlzdHMoc2VhcmNoUGF0aFtpXSArIGJpTmFtZSwgaW50cm9zcGVjdENsYXNzKSkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlmb3VuZCA9IHRydWU7Ci0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCZWFuSW5mbyBiSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhpbnRyb3NwZWN0Q2xhc3MpOwotCQlDbGFzcyBzdXBlckNsYXNzID0gaW50cm9zcGVjdENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQotCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIFBSRTE1ID8gKE1vZGVsaW5nQmVhbkluZm8pIG5ldyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUoYkluZm8sIGRvRmxhZ3MpIDogbmV3IE1vZGVsaW5nQmVhbkluZm8xNShiSW5mbywgZG9GbGFncyk7Ci0JCWVsc2UKLQkJCXJldHVybiBQUkUxNSA/IChNb2RlbGluZ0JlYW5JbmZvKSBuZXcgTW9kZWxpbmdCZWFuSW5mb1ByZTE1KGJJbmZvLCBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc3VwZXJDbGFzcyksIGRvRmxhZ3MpIDogbmV3IE1vZGVsaW5nQmVhbkluZm8xNShiSW5mbywKLQkJCQkJSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHN1cGVyQ2xhc3MpLCBkb0ZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgaWYgdGhpcyBjbGFzcyBleGlzdHMsIGZpcnN0IGluIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIHNlbnQgY2xhc3MsIHRoZW4gaW4gdGhlIHN5c3RlbSBsb2FkZXIsIHRoZW4gdGhlIGJvb3RzdHJhcCBsb2FkZXIsIGFuZCBmaW5hbGx5IHRoZQotCSAqIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjbGFzc0V4aXN0cyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzcyBmcm9tQ2xhc3MpIHsKLQkJaWYgKGZyb21DbGFzcy5nZXRDbGFzc0xvYWRlcigpICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWZyb21DbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCWlmIChDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpICE9IG51bGwpCi0JCQl0cnkgewotCQkJCUNsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBVc2UgdGhlIGNsYXNzbG9hZGVyIGZyb20gdGhlIGN1cnJlbnQgVGhyZWFkLgotCQkJQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJY2wubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIG9ubHkgZm9yIE9iamVjdCBzaW5jZSB0aGF0IGlzIHRoZSBvbmx5IGJlYW4gdGhhdCBkb2Vzbid0IGhhdmUgYSBzdXBlcmNsYXNzLiBTdXBlcmNsYXNzIGJlYW5pbmZvIHJlcXVpcmVkIGZvciBhbGwgb3RoZXIgY2xhc3Nlcy4gSWYgdGhpcyBpcwotCSAqIGNvbnN0cnVjdGVkIHRoZW4gdGhpcyBtZWFucyBubyBtZXJnZSBhbmQgdGhlIGxpc3QgaXMgZGVmaW5pdGl2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxpbmdCZWFuSW5mbyhCZWFuSW5mbyBiZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJZlRhcmdldEJlYW5JbmZvID0gYmVhbkluZm87Ci0JCXRoaXMuZG9GbGFncyA9IGRvRmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGVsaW5nQmVhbkluZm8oQmVhbkluZm8gYmVhbkluZm8sIEJlYW5JbmZvIHN1cGVyQmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXRoaXMoYmVhbkluZm8sIGRvRmxhZ3MpOwotCi0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBiZWFuaW5mbyB0byBkZXRlcm1pbmUgdGhlIG1lcmdlIHN0YXRlLgotCQkvLyBUaGUgZGVmYXVsdCBpcyBubyBtZXJnZS4KLQotCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0VWRU5UUykgIT0gMCkgewotCQkJTGlzdCBmdWxsID0gYWRkQWxsKGJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSk7Ci0JCQlMaXN0IGluaGVyaXRlZCA9IGFkZEFsbChzdXBlckJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZEV2ZW50cyA9IHN0cmlwTGlzdChmdWxsLCBpbmhlcml0ZWQpOwotCQkJaWYgKGZNZXJnZUluaGVyaXRlZEV2ZW50cykgewotCQkJCWlmICghZnVsbC5pc0VtcHR5KCkpCi0JCQkJCWZFdmVudFNldHMgPSAoRXZlbnRTZXREZXNjcmlwdG9yW10pIGZ1bGwudG9BcnJheShuZXcgRXZlbnRTZXREZXNjcmlwdG9yW2Z1bGwuc2l6ZSgpXSk7Ci0JCQkJaWYgKCFpbmhlcml0ZWQuaXNFbXB0eSgpKQotCQkJCQljcmVhdGVFdmVudEFycmF5KGluaGVyaXRlZCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBsaXN0IG9mIHRob3NlIE5PVCBpbmhlcml0ZWQuCi0JCQl9Ci0JCX0KLQotCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX01FVEhPRFMpICE9IDApIHsKLQkJCUxpc3QgZnVsbCA9IGFkZEFsbChiZWFuSW5mby5nZXRNZXRob2REZXNjcmlwdG9ycygpKTsKLQkJCUxpc3QgaW5oZXJpdGVkID0gYWRkQWxsKHN1cGVyQmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZE1ldGhvZHMgPSBzdHJpcExpc3QoZnVsbCwgaW5oZXJpdGVkKTsKLQkJCWlmIChmTWVyZ2VJbmhlcml0ZWRNZXRob2RzKSB7Ci0JCQkJaWYgKCFmdWxsLmlzRW1wdHkoKSkKLQkJCQkJZk1ldGhvZHMgPSAoTWV0aG9kRGVzY3JpcHRvcltdKSBmdWxsLnRvQXJyYXkobmV3IE1ldGhvZERlc2NyaXB0b3JbZnVsbC5zaXplKCldKTsKLQkJCQlpZiAoIWluaGVyaXRlZC5pc0VtcHR5KCkpCi0JCQkJCWNyZWF0ZU1ldGhvZEVudHJpZXMoaW5oZXJpdGVkKTsgLy8gVGhpcyBpcyBhY3R1YWxseSBhIGxpc3Qgb2YgdGhvc2UgTk9UIGluaGVyaXRlZC4KLQkJCX0KLQkJfQotCi0JCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUykgIT0gMCkgewotCQkJTGlzdCBmdWxsID0gYWRkQWxsKGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSk7Ci0JCQlMaXN0IGluaGVyaXRlZCA9IGFkZEFsbChzdXBlckJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWZNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMgPSBzdHJpcExpc3QoZnVsbCwgaW5oZXJpdGVkKTsKLQkJCWlmIChmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzKSB7Ci0JCQkJaWYgKCFmdWxsLmlzRW1wdHkoKSkKLQkJCQkJZlByb3BlcnRpZXMgPSAoUHJvcGVydHlEZXNjcmlwdG9yW10pIGZ1bGwudG9BcnJheShuZXcgUHJvcGVydHlEZXNjcmlwdG9yW2Z1bGwuc2l6ZSgpXSk7Ci0JCQkJaWYgKCFpbmhlcml0ZWQuaXNFbXB0eSgpKQotCQkJCQljcmVhdGVQcm9wZXJ0eUFycmF5KGluaGVyaXRlZCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBsaXN0IG9mIHRob3NlIE5PVCBpbmhlcml0ZWQuCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFdmVudEFycmF5KExpc3QgZmVhdHVyZXMpIHsKLQkJZk5vdEluaGVyaXRlZEV2ZW50U2V0cyA9IGNyZWF0ZURlc2NyaXB0b3JOYW1lcyhmZWF0dXJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWV0aG9kRW50cmllcyhMaXN0IGZlYXR1cmVzKSB7Ci0JCWludCBzID0gZmVhdHVyZXMuc2l6ZSgpOwotCQlmTm90SW5oZXJpdGVkTWV0aG9kcyA9IG5ldyBTdHJpbmdbc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlmTm90SW5oZXJpdGVkTWV0aG9kc1tpXSA9IGxvbmdOYW1lKChNZXRob2REZXNjcmlwdG9yKSBmZWF0dXJlcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBsb25nTmFtZShNZXRob2REZXNjcmlwdG9yIG1kKSB7Ci0JCVN0cmluZyBuID0gbWQuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG4ubGVuZ3RoKCkgKyAyMCk7Ci0JCXNiLmFwcGVuZChuKTsKLQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCU1ldGhvZCBtID0gbWQuZ2V0TWV0aG9kKCk7Ci0JCXNiLmFwcGVuZChtLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlDbGFzc1tdIHBhcm1zID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1zLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoaiA+IDApCi0JCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQlpZiAoIXBhcm1zW2pdLmlzQXJyYXkoKSkKLQkJCQlzYi5hcHBlbmQocGFybXNbal0uZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCWVsc2UgewotCQkJCUNsYXNzIGZpbmFsVHlwZSA9IHBhcm1zW2pdLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQlpbnQgaW5zcnQgPSBzYi5sZW5ndGgoKTsKLQkJCQl3aGlsZSAoZmluYWxUeXBlLmlzQXJyYXkoKSkgewotCQkJCQlzYi5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZmluYWxUeXBlID0gZmluYWxUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJc2IuaW5zZXJ0KGluc3J0LCBmaW5hbFR5cGUuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9wZXJ0eUFycmF5KExpc3QgZmVhdHVyZXMpIHsKLQkJZk5vdEluaGVyaXRlZFByb3BlcnRpZXMgPSBjcmVhdGVEZXNjcmlwdG9yTmFtZXMoZmVhdHVyZXMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVEZXNjcmlwdG9yTmFtZXMoTGlzdCBmZWF0dXJlcykgewotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2ZlYXR1cmVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSAoKEZlYXR1cmVEZXNjcmlwdG9yKSBmZWF0dXJlcy5nZXQoaSkpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGFkZEFsbChPYmplY3RbXSBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3QgbCA9IG5ldyBBcnJheUxpc3Qoc2V0Lmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgewotCQkJCWwuYWRkKHNldFtpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiBhbGwgb2YgdGhlIHN1cGVyIGNsYXNzJ3MgZXZlbnRzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIGV2ZW50cyByZXR1cm5lZCBhcmUgaXQsIHRoZXJlIGFyZQotCSAqIG5vIG90aGVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlSW5oZXJpdGVkRXZlbnRzKCkgewotCQlyZXR1cm4gZk1lcmdlSW5oZXJpdGVkRXZlbnRzOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIGFsbCBvZiB0aGUgc3VwZXIgY2xhc3MncyBtZXRob2RzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIG1ldGhvZHMgcmV0dXJuZWQgYXJlIGl0LCB0aGVyZQotCSAqIGFyZSBubyBvdGhlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUluaGVyaXRlZE1ldGhvZHMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIGFsbCBvZiB0aGUgc3VwZXIgY2xhc3MncyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBtZXJnZWQgaW4uIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgYXJlIGl0LAotCSAqIHRoZXJlIGFyZSBubyBvdGhlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLQkJcmV0dXJuIGZUYXJnZXRCZWFuSW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLQl9Ci0KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBmVGFyZ2V0QmVhbkluZm8uZ2V0QmVhbkRlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgRXZlbnRTZXREZXNjcmlwdG9yW10gZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZNZXJnZUluaGVyaXRlZEV2ZW50cyA/IGZFdmVudFNldHMgOiBmVGFyZ2V0QmVhbkluZm8uZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpOwotCX0KLQotCXB1YmxpYyBqYXZhLmF3dC5JbWFnZSBnZXRJY29uKGludCBpY29uS2luZCkgewotCQlyZXR1cm4gZlRhcmdldEJlYW5JbmZvLmdldEljb24oaWNvbktpbmQpOwotCX0KLQotCXB1YmxpYyBNZXRob2REZXNjcmlwdG9yW10gZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRNZXRob2RzID8gZk1ldGhvZHMgOiBmVGFyZ2V0QmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMgPyBmUHJvcGVydGllcyA6IGZUYXJnZXRCZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE5vdEluaGVyaXRlZEV2ZW50U2V0RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTm90SW5oZXJpdGVkRXZlbnRTZXRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmhlcml0ZWRNZXRob2REZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZOb3RJbmhlcml0ZWRNZXRob2RzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZk5vdEluaGVyaXRlZFByb3BlcnRpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlS2V5KEZlYXR1cmVEZXNjcmlwdG9yIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgaW5zdGFuY2VvZiBNZXRob2REZXNjcmlwdG9yID8gbG9uZ05hbWUoKE1ldGhvZERlc2NyaXB0b3IpIGZlYXR1cmUpIDogZmVhdHVyZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBTdHJpcCB0aGUgbGlzdCBkb3duIHVzaW5nIHRoZSBFcXVhbGl0eSBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN0cmlwTGlzdChMaXN0IGZ1bGxMaXN0LCBMaXN0IGluaGVyaXRlZExpc3QpIHsKLQkJLy8gVGhlIHByb2Nlc3MgaXMgdG8gY3JlYXRlIGEgYm9vbGVhbiBsaXN0IG1pcnJvcmluZyB0aGUgaW5oZXJpdGVkTGlzdC4KLQkJLy8gVGhpcyBib29sZWFuIGxpc3QgaW5kaWNhdGVzIGlmIHRoZSBjb3JyZXNwb25kaW5nIChieSBpbmRleCkKLQkJLy8gZW50cnkgZnJvbSB0aGUgaW5oZXJpdGVkTGlzdCBpcyB0byBiZSByZXRhaW5lZCBpbiB0aGUgZmluYWwgY29tcHV0ZWQKLQkJLy8gbGlzdC4KLQkJLy8KLQkJLy8gQSBIYXNobWFwIGlzIGNyZWF0ZWQgd2hlcmUgdGhlIGtleSBpcyB0aGUgY29tcHV0ZWRLZXkgZnJvbSB0aGUgaW5oZXJpdGVkTGlzdAotCQkvLyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBpbmhlcml0ZWRMaXN0LiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHRoZQotCQkvLyBlbnRyeSBpcyBtYXRjaGluZy4KLQkJLy8KLQkJLy8gVGhlbiB0aGUgZnVsbExpc3Qgd2lsbCBiZSBzdGVwcGVkIHRocm91Z2ggYW5kIHNlZSBpZiB0aGVyZSBpcwotCQkvLyBhbiBlbnRyeSBpbiB0aGUgSGFzaG1hcCBmb3IgaXQuIElmIHRoZXJlIGlzIGFuIGVudHJ5LCB0aGVuCi0JCS8vIHRoZSBlbnRyeSBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBzZW1hbnRpY2FsbHkgZXF1YWwuCi0JCS8vIElmIGl0IGlzLCB0aGVuIHRoZSBib29sZWFuIGxpc3QgZW50cnkgaXMgbWFya2VkIHNvIHRoYXQKLQkJLy8gdGhlIGluaGVyaXRlZExpc3QgZW50cnkgd2lsbCBiZSByZXRhaW5lZCwgdGhlIGZ1bGxMaXN0IGVudHJ5IHJlbW92ZWQgYW5kIHRoZSBjb3VudGVyCi0JCS8vIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaW5oZXJpdGVkTGlzdCBjb3B5IGlzIGluY3JlbWVudGVkLgotCQkvLyBJZiB0aGV5IGFyZW4ndCBzZW1hbnRpY2FsbHkgZXF1YWwsIHRoZW4gd2Uga25vdyB0aGF0IHRoaXMgaXMKLQkJLy8gYW4gb3ZlcnJpZGUuIEluIHRoYXQgY2FzZSwgdGhlIGZ1bGxMaXN0IGVudHJ5IGlzIGtlcHQsIHRoZSBpbmhlcml0ZWRMaXN0Ci0JCS8vIGVudHJ5IGlzIG5vdCByZXRhaW5lZCwgYnV0IHdlIGRvbid0IHByZXZlbnQgbWVyZ2UgbGF0ZXIuCi0JCS8vCi0JCS8vIElmIHRoZSBmdWxsTGlzdCBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIEhhc2hNYXAsIHRoZW4gd2Uga25vdyBpdCBpcyBub3QKLQkJLy8gZnJvbSB0aGUgaW5oZXJpdGVkTGlzdCwgc28gaXQgd2lsbCBiZSByZXRhaW5lZCBpbiB0aGUgZnVsbExpc3QuCi0JCS8vCi0JCS8vIElmIHdlIGdldCBhbGwgb2YgdGhlIHdheSB0aHJvdWdoLCB0aGVuIHdlIGtub3cgdGhhdCB3aGF0IGlzIGxlZnQKLQkJLy8gaW4gZnVsbExpc3QgaXMganVzdCB0aGlzIGxldmVsLgotCQkvLwotCQkvLyBXaGVuIHdlIHJldHVybiB3ZSBrbm93IHRoYXQKLQkJLy8gICBhKSBmdWxsTGlzdCBoYXMgb25seSB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgZm91bmQgYXQgdGhlIGxvY2FsIGxldmVsCi0JCS8vICAgYikgaW5oZXJpdGVkTGlzdCBpZiBub3QgZW1wdHkgY29udGFpbnMgdGhlIG9uZXMgZnJvbSBzdXBlciB0aGF0IFNIT1VMRCBOT1QgYmUgaW5oZXJpdGVkLgotCQkvLyAgICAgIElmIGl0IGlzIGVtcHR5LCB0aGVuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgdGhlbiBBTEwgc2hvdWxkIGJlIGluaGVyaXRlZCwKLQkJLy8gICAgICBvciBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2Ugd2UgYXJlbid0IG1lcmdpbmcgYW55LgotCQkvLwotCQkvLyBBbGwgb2YgdGhpcyBpcyBiYXNlZCB1cG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGxpc3QgY2FuCi0JCS8vIGdldCBxdWl0ZSBsYXJnZSAod2hpY2ggaXQgZG9lcyBmb3IgamF2YXguc3dpbmcpIGFuZCB0aGF0Ci0JCS8vIGEgc2ltcGxlIG4tc3F1YXJlZCBvcmRlciBzZWFyY2ggd291bGQgYmUgdG9vIHNsb3cuCi0KLQkJaWYgKGZ1bGxMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAvLyBUaGVyZSBhcmUgbm9uZSBpbiB0aGUgZnVsbCBsaXN0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm9uZSwgYW5kIGRvbid0IG1lcmdlLgotCQl9IGVsc2UgaWYgKGluaGVyaXRlZExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBUaGVyZSBhcmUgbm8gaW5oZXJpdGVkTGlzdCBmZWF0dXJlcywgc28gdHJlYXQgYXMgbm8gbWVyZ2UuCi0KLQkJLy8gV2UgaGF2ZSBzb21lIGZlYXR1cmVzIGFuZCBzb21lIGluaGVyaXRlZExpc3QgZmVhdHVyZXMsIHNvIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgbGlzdHMuCi0KLQkJLy8gQ3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IGZvciBmdWxsTGlzdCBhbmQgc3RyaXBMaXN0IGFuZCBqdXN0IHJldXNlIHRoZW0KLQkJRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nU3RyaXAgPSBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmNyZWF0ZUVxdWFsaXR5KChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQoMCkpOwotCQlGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdGdWxsID0gRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIGZ1bGxMaXN0LmdldCgwKSk7Ci0KLQkJaW50IGluaGVyaXRlZFNpemUgPSBpbmhlcml0ZWRMaXN0LnNpemUoKTsKLQkJYm9vbGVhbltdIGNvcHkgPSBuZXcgYm9vbGVhbltpbmhlcml0ZWRTaXplXTsKLQotCQlIYXNoTWFwIGluaGVyaXRlZE1hcCA9IG5ldyBIYXNoTWFwKGluaGVyaXRlZFNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluaGVyaXRlZFNpemU7IGkrKykgewotCQkJRmVhdHVyZURlc2NyaXB0b3IgZiA9IChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcga2V5ID0gY29tcHV0ZUtleShmKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGluaGVyaXRlZE1hcC5nZXQoa2V5KTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWluaGVyaXRlZE1hcC5wdXQoa2V5LCBuZXcgSW50ZWdlcihpKSk7Ci0JCQllbHNlIHsKLQkJCQkvLyBTaG91bGRuJ3Qgb2NjdXIuCi0JCQl9Ci0KLQkJfQotCi0JCS8vIFdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHByb2Nlc3NpbmcsIGluaGVyaXRlZExpc3Qgd2lsbCBjb250YWluIHRoZSBzdXBlciB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCwgYW5kIGZ1bGwgbGlzdCB3aWxsIGNvbnRhaW4gb25seSB0aGUgbG9jYWxzCi0JCS8vICh0aG9zZSBkZWZpbmVkIGF0IHRoaXMgY2xhc3MgbGV2ZWwpLjsKLQkJaW50IGluaGVyaXRlZFJldGFpbmVkID0gMDsKLQkJSXRlcmF0b3IgZnVsbEl0ciA9IGZ1bGxMaXN0Lml0ZXJhdG9yKCk7Ci0JCS8vIENvbnRpbnVlIHdoaWxlIHdlJ3ZlIHJldGFpbmVkIGxlc3MgdGhhbiB0aGUgZnVsbCBzdXBlciBhbW91bnQuIElmIHdlJ3ZlIHJldGFpbmVkIGFsbCBvZiB0aGUgaW5oZXJpdGVkTGlzdCwgdGhlcmUgaXMgbm8KLQkJLy8gbmVlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBmdWxsTGlzdCBiZWNhdXNlIHRoZXJlIGNhbid0IHBvc3NpYmx5IGJlIGFueSBpbmhlcml0ZWRMaXN0IGVudHJpZXMgbGVmdCB0byBmaW5kLgotCQl3aGlsZSAoaW5oZXJpdGVkUmV0YWluZWQgPCBpbmhlcml0ZWRTaXplICYmIGZ1bGxJdHIuaGFzTmV4dCgpKSB7Ci0JCQlGZWF0dXJlRGVzY3JpcHRvciBmID0gKEZlYXR1cmVEZXNjcmlwdG9yKSBmdWxsSXRyLm5leHQoKTsKLQkJCWJvb2xlYW4gZm91bmRGdWxsID0gZmFsc2U7Ci0JCQlPYmplY3QgaW5kZXggPSBpbmhlcml0ZWRNYXAuZ2V0KGNvbXB1dGVLZXkoZikpOwotCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQl3b3JraW5nRnVsbC5zZXRGZWF0dXJlKGYpOwotCQkJCWludCBuZHggPSAoKEludGVnZXIpIGluZGV4KS5pbnRWYWx1ZSgpOwotCQkJCXdvcmtpbmdTdHJpcC5zZXRGZWF0dXJlKChGZWF0dXJlRGVzY3JpcHRvcikgaW5oZXJpdGVkTGlzdC5nZXQobmR4KSk7Ci0JCQkJaWYgKHdvcmtpbmdGdWxsLmVxdWFscyh3b3JraW5nU3RyaXApKSB7Ci0JCQkJCS8vIFRoZXkgYXJlIHNlbWFudGljYWxseSBpZGVudGljYWwsIHNvIHJldGFpbiBpbiB0aGUgaW5oZXJpdGVkTGlzdC4KLQkJCQkJY29weVtuZHhdID0gdHJ1ZTsKLQkJCQkJZm91bmRGdWxsID0gdHJ1ZTsKLQkJCQkJaW5oZXJpdGVkUmV0YWluZWQrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmb3VuZEZ1bGwpIHsKLQkJCQkvLyBXZSBmb3VuZCB0aGUgaW5oZXJpdGVkTGlzdCBlbnRyeSBzZW1hbnRpY2FsbHkgZXF1YWwgaW4gdGhlIGZ1bGwgbGlzdCBzb21ld2hlcmUsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBmdWxsIGVudHJ5LgotCQkJCWZ1bGxJdHIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5oZXJpdGVkUmV0YWluZWQgPT0gaW5oZXJpdGVkU2l6ZSkgewotCQkJaW5oZXJpdGVkTGlzdC5jbGVhcigpOyAvLyBBbGwgd2VyZSBmb3VuZCBpbiBpbmhlcml0ZWRMaXN0LCBzbyBqdXN0IGNsZWFyIHRoZSBpbmhlcml0ZWRMaXN0IGFuZCByZXR1cm4ganVzdCB3aGF0IHdhcyBsZWZ0IGluIHRoZSBmb3VuZC4KLQkJCQkJCQkJICAgLy8gVGhvc2UgaW4gZnVsbCBmb3VuZCBpbiBzdXBlciBoYWQgYmVlbiByZW1vdmVkIGZyb20gZnVsbCBkdXJpbmcgdGhlIHByb2Nlc3NpbmcuCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gV2UgbWVyZ2Ugd2l0aCBhbGwgaW5oZXJpdGVkLiAKLQkJfSBlbHNlCWlmIChpbmhlcml0ZWRSZXRhaW5lZCAhPSAwKSB7Ci0JCQkvLyBTb21lIHdlcmUgcmV0YWluZWQsIHRha2Ugb3V0IG9mIHRoZSBsaXN0IHRob3NlIHRoYXQgd2VyZSByZXRhaW5lZC4KLQkJCS8vIFdoZW4gZG9uZSB0aGUgbGlzdCB3aWxsIGNvbnRhaW4gdGhvc2UgdGhhdCBzaG91bGQgYmUgZHJvcHBlZCBmcm9tIHRoZSBpbmhlcml0ZWQgbGlzdC4KLQkJCS8vIFdlIHN0YXJ0IGZyb20gZW5kIGJlY2F1c2UgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgbW92ZWQgb3ZlcmFsbCB3aWxsIGJlIGxlc3MgdGhhbiBpZiB3ZSBzdGFydGVkIGZyb20gdGhlIGZyb250LgotCQkJZm9yIChMaXN0SXRlcmF0b3IgaXRyID0gaW5oZXJpdGVkTGlzdC5saXN0SXRlcmF0b3IoaW5oZXJpdGVkTGlzdC5zaXplKCkpOyBpdHIuaGFzUHJldmlvdXMoKTspIHsKLQkJCQlpbnQgaSA9IGl0ci5wcmV2aW91c0luZGV4KCk7Ci0JCQkJaXRyLnByZXZpb3VzKCk7CS8vIFRvIGJhY2sgdXAgdGhlIGl0ciBzbyB0aGF0IHJlbW92ZSBjYW4gcmVtb3ZlIGl0LiBXZSBhY3R1YWxseSBkb24ndCBjYXJlIHdoYXQgdGhlIHZhbHVlIGlzLgotCQkJCWlmIChjb3B5W2ldKQotCQkJCQlpdHIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gV2UgbWVyZ2UsIGFuZCB0aGUgbGlzdCBpcyBub3QgZW1wdHkgYnV0IGl0IGRpZCBoYXZlIHNvbWUgcmVtb3ZlZCwgc28gd2UgbGVhdmUgdGhlIGxpc3QgYWxvbmUuIFRob3NlIGFyZSBub3QgaW5oZXJpdGVkLgotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsJLy8gQWxsIHdlcmUgcmVtb3ZlZCAocmV0YWluZWQgPT0gMCkuIE5vbmUgd2VyZSByZXRhaW5lZC4gU28gd2UganVzdCBkb24ndCBkbyBhIG1lcmdlLiBUaGUgbGlzdCB3aWxsIGJlIGlnbm9yZWQuCi0JfQotCi0JLy8gVGhlIG1vZGVsaW5nIGJlYW5pbmZvIGlzIGFsc28gdXNlZCB0byBzZW5kIGl0c2VsZiBiYWNrIGluIHNlcmlhbGl6ZWQgbW9kZSBhcyBhIGNhbGxiYWNrLgotCi0JcHJpdmF0ZSBJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlcjsKLQotCXByaXZhdGUgaW50IGNhbGxiYWNrSUQ7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrI2luaXRpYWxpemVDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklWTVNlcnZlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlciwgaW50IGNhbGxiYWNrSUQpIHsKLQkJdGhpcy52bVNlcnZlciA9IHZtU2VydmVyOwotCQl0aGlzLmNhbGxiYWNrSUQgPSBjYWxsYmFja0lEOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGRvRmxhZ3MgIT0gMCkgewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0odm1TZXJ2ZXIucmVxdWVzdFN0cmVhbShjYWxsYmFja0lELCAwKSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0JFQU5fREVDT1IpICE9IDApCi0JCQkJc2VuZEJlYW5EZWNvcmF0b3Ioc3RyZWFtKTsKLQkJCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUykgIT0gMCkKLQkJCQlzZW5kUHJvcGVydHlEZWNvcmF0b3JzKHN0cmVhbSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX01FVEhPRFMpICE9IDApCi0JCQkJc2VuZE1ldGhvZERlY29yYXRvcnMoc3RyZWFtKTsKLQkJCWlmICgoZG9GbGFncyAmIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fRVZFTlRTKSAhPSAwKQotCQkJCXNlbmRFdmVudERlY29yYXRvcnMoc3RyZWFtKTsKLQkJCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPTkUpOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgSURFIHRvIHNlbmQgdGhlIGJlYW4gZGVjb3JhdG9yIGluZm9ybWF0aW9uIGJhY2sgdGhyb3VnaCB0aGUgY2FsbGJhY2suCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRCZWFuRGVjb3JhdG9yKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCUJlYW5SZWNvcmQgYnIgPSBuZXcgQmVhblJlY29yZCgpOwotCQlCZWFuRGVzY3JpcHRvciBiZCA9IGdldEJlYW5EZXNjcmlwdG9yKCk7Ci0KLQkJaWYgKGJkICE9IG51bGwpIHsKLQkJCWJyLmN1c3RvbWl6ZXJDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQkJYnIubWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID0gaXNNZXJnZUluaGVyaXRlZFByb3BlcnRpZXMoKTsKLQkJCWJyLm1lcmdlSW5oZXJpdGVkT3BlcmF0aW9ucyA9IGlzTWVyZ2VJbmhlcml0ZWRNZXRob2RzKCk7Ci0JCQlici5tZXJnZUluaGVyaXRlZEV2ZW50cyA9IGlzTWVyZ2VJbmhlcml0ZWRFdmVudHMoKTsKLQkJCWJyLm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPSBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCQlici5ub3RJbmhlcml0ZWRPcGVyYXRpb25OYW1lcyA9IGdldE5vdEluaGVyaXRlZE1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JCQlici5ub3RJbmhlcml0ZWRFdmVudE5hbWVzID0gZ2V0Tm90SW5oZXJpdGVkRXZlbnRTZXREZXNjcmlwdG9ycygpOwotCQkJZmlsbChiZCwgYnIsIEJFQU5fUkVDT1JEX1RZUEUpOwotCQl9Ci0JCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkJFQU5fREVDT1JBVE9SX1NFTlQpOwotCQlzdHJlYW0ud3JpdGVPYmplY3QoYnIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBJREUgdG8gc2VuZCB0aGUgcHJvcGVydHkgZGVjb3JhdG9ycyBpbmZvcm1hdGlvbiBiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kUHJvcGVydHlEZWNvcmF0b3JzKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCVByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQkvLyBOb3cgc3RhcnQgd3JpdGluZyB0aGUgcmVjb3Jkcy4KLQkJCXN0cmVhbS53cml0ZUludChJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLlBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCk7Ci0JCQlzdHJlYW0ud3JpdGVJbnQocHJvcGVydGllcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gcHJvcGVydGllc1tpXTsKLQkJCQkvLyBNdWNoIG9mIHRoZSB0d28gdHlwZXMgYXJlIGNvbW1vbiwgc28gaWYgaW5kZXhlZCwgZmlsbCBpbiB0aGUgaW5kZXggcGFydCBhbmQgdGhlbiBwYXNzIG9uIHRvIHByb3BlcnR5IHBhcnQuCi0JCQkJUHJvcGVydHlSZWNvcmQgdXNlcHIgPSBudWxsOwotCQkJCWludCB1c2VUeXBlID0gMDsKLQkJCQlpZiAocGQuZ2V0Q2xhc3MoKSA9PSBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQkJCUluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgaXBkID0gKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHBkOwotCQkJCQlJbmRleGVkUHJvcGVydHlSZWNvcmQgaXByID0gbmV3IEluZGV4ZWRQcm9wZXJ0eVJlY29yZCgpOwotCQkJCQl1c2VwciA9IGlwcjsKLQkJCQkJdXNlVHlwZSA9IElOREVYRURQUk9QRVJUWV9SRUNPUkRfVFlQRTsKLQkJCQkJaXByLmluZGV4ZWRSZWFkTWV0aG9kID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKGlwZC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpKTsKLQkJCQkJaXByLmluZGV4ZWRXcml0ZU1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChpcGQuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpOwotCQkJCQlpcHIuaW5kZXhlZFByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoaXBkLmdldEluZGV4ZWRQcm9wZXJ0eVR5cGUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNlcHIgPSBuZXcgUHJvcGVydHlSZWNvcmQoKTsKLQkJCQkJdXNlVHlwZSA9IFBST1BFUlRZX1JFQ09SRF9UWVBFOwotCQkJCX0KLQkJCQl1c2Vwci5wcm9wZXJ0eUVkaXRvckNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwZC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkpOwotCQkJCXVzZXByLnByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUocGQuZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJCXVzZXByLnJlYWRNZXRob2QgPSBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQocGQuZ2V0UmVhZE1ldGhvZCgpKTsKLQkJCQl1c2Vwci53cml0ZU1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZCgocGQuZ2V0V3JpdGVNZXRob2QoKSkpOwotCQkJCXVzZXByLmJvdW5kID0gcGQuaXNCb3VuZCgpOwotCQkJCXVzZXByLmNvbnN0cmFpbmVkID0gcGQuaXNDb25zdHJhaW5lZCgpOwotCQkJCXVzZXByLmRlc2lnblRpbWUgPSBudWxsOwotCQkJCXVzZXByLmZpZWxkID0gbnVsbDsKLQkJCQlmaWxsKHBkLCB1c2VwciwgdXNlVHlwZSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KHVzZXByKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBJREUgdG8gc2VuZCB0aGUgbWV0aG9kIGRlY29yYXRvcnMgaW5mb3JtYXRpb24gYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjay4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2VuZE1ldGhvZERlY29yYXRvcnMoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJTWV0aG9kRGVzY3JpcHRvcltdIG1ldGhvZHMgPSBnZXRNZXRob2REZXNjcmlwdG9ycygpOwotCQlpZiAobWV0aG9kcyAhPSBudWxsICYmIG1ldGhvZHMubGVuZ3RoID4gMCkgewotCQkJLy8gTm93IHN0YXJ0IHdyaXRpbmcgdGhlIHJlY29yZHMuCi0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5NRVRIT0RfREVDT1JBVE9SU19TRU5UKTsKLQkJCXN0cmVhbS53cml0ZUludChtZXRob2RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlNZXRob2RSZWNvcmQgbXIgPSBuZXcgTWV0aG9kUmVjb3JkKCk7Ci0JCQkJZmlsbChtciwgbWV0aG9kc1tpXSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KG1yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gYSBNZXRob2RSZWNvcmQgZnJvbSB0aGUgTWV0aG9kRGVzY3JpcHRvci4KLQkgKiBAcGFyYW0gbXIKLQkgKiBAcGFyYW0gbWQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsKE1ldGhvZFJlY29yZCBtciwgTWV0aG9kRGVzY3JpcHRvciBtZCkgewotCQltci5tZXRob2RGb3JEZXNjcmlwdG9yID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKG1kLmdldE1ldGhvZCgpKTsKLQkJUGFyYW1ldGVyRGVzY3JpcHRvcltdIHBhcm1zID0gbWQuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJaWYgKHBhcm1zID09IG51bGwpCi0JCQltci5wYXJhbWV0ZXJzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQltci5wYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlclJlY29yZFtwYXJtcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtcy5sZW5ndGg7IGorKykgewotCQkJCVBhcmFtZXRlclJlY29yZCBwciA9IG5ldyBQYXJhbWV0ZXJSZWNvcmQoKTsKLQkJCQlmaWxsKHBhcm1zW2pdLCBwciwgUEFSQU1FVEVSX1JFQ09SRF9UWVBFKTsKLQkJCQltci5wYXJhbWV0ZXJzW2pdID0gcHI7Ci0JCQl9Ci0JCX0KLQkJZmlsbChtZCwgbXIsIE1FVEhPRF9SRUNPUkRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IElERSB0byBzZW5kIHRoZSBldmVudCBzZXQgZGVjb3JhdG9ycyBpbmZvcm1hdGlvbiBiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kRXZlbnREZWNvcmF0b3JzKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0gKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRFeGNlcHRpb24gewotCQlFdmVudFNldERlc2NyaXB0b3JbXSBldmVudHMgPSBnZXRFdmVudFNldERlc2NyaXB0b3JzKCk7Ci0JCWlmIChldmVudHMgIT0gbnVsbCAmJiBldmVudHMubGVuZ3RoID4gMCkgewotCQkJLy8gTm93IHN0YXJ0IHdyaXRpbmcgdGhlIHJlY29yZHMuCi0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5FVkVOVF9ERUNPUkFUT1JTX1NFTlQpOwotCQkJc3RyZWFtLndyaXRlSW50KGV2ZW50cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlFdmVudFNldERlc2NyaXB0b3IgZWQgPSBldmVudHNbaV07Ci0JCQkJRXZlbnRTZXRSZWNvcmQgZXIgPSBuZXcgRXZlbnRTZXRSZWNvcmQoKTsKLQkJCQllci5hZGRMaXN0ZW5lck1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChlZC5nZXRBZGRMaXN0ZW5lck1ldGhvZCgpKTsKLQkJCQlNZXRob2REZXNjcmlwdG9yW10gbWRzID0gZWQuZ2V0TGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpOwotCQkJCWlmIChtZHMgPT0gbnVsbCkKLQkJCQkJZXIubGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyA9IG51bGw7Ci0JCQkJZWxzZSB7Ci0JCQkJCWVyLmxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMgPSBuZXcgTWV0aG9kUmVjb3JkW21kcy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1kcy5sZW5ndGg7IGorKykgewotCQkJCQkJZmlsbChlci5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzW2pdID0gbmV3IE1ldGhvZFJlY29yZCgpLCBtZHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVyLmxpc3RlbmVyVHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoZWQuZ2V0TGlzdGVuZXJUeXBlKCkpOwotCQkJCWVyLnJlbW92ZUxpc3RlbmVyTWV0aG9kID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKGVkLmdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkpOwotCQkJCWVyLmluRGVmYXVsdEV2ZW50U2V0ID0gZWQuaXNJbkRlZmF1bHRFdmVudFNldCgpOwotCQkJCWVyLnVuaWNhc3QgPSBlZC5pc1VuaWNhc3QoKTsKLQkJCQllci5ldmVudEFkYXB0ZXJDbGFzc05hbWUgPSBudWxsOwotCQkJCWZpbGwoZWQsIGVyLCBFVkVOVFNFVF9SRUNPUkRfVFlQRSk7Ci0JCQkJc3RyZWFtLndyaXRlT2JqZWN0KGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJFQU5fUkVDT1JEX1RZUEUgPSAwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVDT1JEX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhFRFBST1BFUlRZX1JFQ09SRF9UWVBFID0gMjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfUkVDT1JEX1RZUEUgPSAzOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBBUkFNRVRFUl9SRUNPUkRfVFlQRSA9IDQ7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRTRVRfUkVDT1JEX1RZUEUgPSA1OwotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgc3BlY2lhbCBhdHRyL3ZhbHVlcyBmb3IgdGhlIGdpdmVuIHJlY29yZCB0eXBlLiBUaGUgZGVmYXVsdCBoYW5kbGVzIHRoZSBzdGFuZGFyZCBvbmVzLgotCSAqIAotCSAqIEBwYXJhbSByZWNvcmQKLQkgKiBAcGFyYW0gZGVzY3IKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSByZWNvcmRUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIHJlY29yZCB1bHRpbWF0ZWx5IGJlaW5nIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYXR0cmlidXRlIGlzIGEgc3BlY2lhbCBvbmUgYW5kIHByb2Nlc3NlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzcGVjaWFsIGFuZCBzaG91bGQgYmUgYWRkZWQgdG8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZXMgbGlzdCB0cmFuc2ZlcnJlZCB0byBJREUuCi0JICogCi0JICogQHNlZSBNb2RlbGluZ0JlYW5JbmZvI1BST1BFUlRZX1JFQ09SRF9UWVBFCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsbEZyb21BdHRyaWJ1dGVzKEZlYXR1cmVSZWNvcmQgcmVjb3JkLCBGZWF0dXJlRGVzY3JpcHRvciBkZXNjciwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCByZWNvcmRUeXBlKSB7Ci0JCXN3aXRjaCAocmVjb3JkVHlwZSkgewotCQkJY2FzZSBJTkRFWEVEUFJPUEVSVFlfUkVDT1JEX1RZUEU6Ci0JCQljYXNlIFBST1BFUlRZX1JFQ09SRF9UWVBFOgotCQkJCWlmIChCYXNlQmVhbkluZm8uREVTSUdOVElNRVBST1BFUlRZLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCQkoKFByb3BlcnR5UmVjb3JkKSByZWNvcmQpLmRlc2lnblRpbWUgPSAoQm9vbGVhbikgZGVzY3IuZ2V0VmFsdWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoQmFzZUJlYW5JbmZvLkZJRUxEUFJPUEVSVFkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7Ci0JCQkJCUZpZWxkIGYgPSAoRmllbGQpIGRlc2NyLmdldFZhbHVlKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQkvLyBXZSBoYXZlIGEgZmllbGQsIHNldCB0aGUgcHJvcGVydHkgdHlwZSB0byB0aGlzIHNpbmNlIHdlIGNvdWxkbid0IGNvcnJlY3RseSBjcmVhdGUgdGhpcyBvdGhlcndpc2UuCi0JCQkJCVByb3BlcnR5UmVjb3JkIHByID0gKFByb3BlcnR5UmVjb3JkKSByZWNvcmQ7Ci0JCQkJCXByLnByb3BlcnR5VHlwZU5hbWUgPSBnZXRDbGFzc05hbWUoZi5nZXRUeXBlKCkpOwotCQkJCQlwci5maWVsZCA9IGdldFJlZmxlY3RlZEZpZWxkUmVjb3JkKGYpOwotCQkJCQlwci5yZWFkTWV0aG9kID0gbnVsbDsJLy8gTmVlZCB0byB3aXBlIG91dCBvdXIgZHVtbXkuCi0JCQkJCXByLndyaXRlTWV0aG9kID0gbnVsbDsJLy8gT3IgaWYgaXQgc2V0LCBub3QgdmFsaWQgZm9yIGEgZmllbGQuCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRTRVRfUkVDT1JEX1RZUEU6Ci0JCQkJaWYgKEJhc2VCZWFuSW5mby5FVkVOVEFEQVBURVJDTEFTUy5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLQkJCQkJKChFdmVudFNldFJlY29yZCkgcmVjb3JkKS5ldmVudEFkYXB0ZXJDbGFzc05hbWUgPSAoU3RyaW5nKSBkZXNjci5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsgLy8gRGlkbid0IGhhbmRsZSBpdC4KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZmVhdHVyZSBwb3J0aW9uIG9mIHRoZSBEZXNjcmlwdG9yIGludG8gdGhlIHJlY29yZC4gV2UgY2FuIGJlIHJldXNpbmcgc29tZSByZWNvcmRzIChzbyB3ZSBkb24ndCBrZWVwIGFsbG9jYXRpbmcgd2hlbiBub3QgbmVlZGVkKSwgc28KLQkgKiB3ZSB3aWxsIG51bGwgb3V0IHVuc2V0IGZpZWxkcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3IKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogQHBhcmFtIHJlY29yZFR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgcmVjb3JkIHVsdGltYXRlbHkgYmVpbmcgcHJvY2Vzc2VkLiBVc2VkIGZvciBmaWxsRnJvbUF0dHJpYnV0ZXMuCi0JICogCi0JICogQHNlZSBNb2RlbGluZ0JlYW5JbmZvI1BST1BFUlRZX1JFQ09SRF9UWVBFCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbChGZWF0dXJlRGVzY3JpcHRvciBkZXNjciwgRmVhdHVyZVJlY29yZCByZWNvcmQsIGludCByZWNvcmRUeXBlKSB7Ci0JCXJlY29yZC5uYW1lID0gZGVzY3IuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZG4gPSBkZXNjci5nZXREaXNwbGF5TmFtZSgpOwotCQlpZiAoIXJlY29yZC5uYW1lLmVxdWFscyhkbikpCi0JCQlyZWNvcmQuZGlzcGxheU5hbWUgPSBkbjsgLy8gZGlzcGxheSBuYW1lIHJldHVybnMgbmFtZSBpZiBkaXNwbGF5IG5hbWUgbm90IHNldC4gV2UgZG9uJ3Qgd2FudCB0byBzZW5kIGl0IGlmIGlkZW50aWNhbC4gKE5vdGUgc29tZSBCZWFuaW5mb3MgYXJlIHNldHRpbmcgZGlzcGxheW5hbWUgdGhlIHNhbWUgdGV4dCBidXQgbm90IHNhbWUgc3RyaW5nKS4KLQkJZWxzZQotCQkJcmVjb3JkLmRpc3BsYXlOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHNoZCA9IGRlc2NyLmdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJaWYgKCFkbi5lcXVhbHMoc2hkKSkKLQkJCXJlY29yZC5zaG9ydERlc2NyaXB0aW9uID0gc2hkOyAvLyBzaG9ydCBkZXNjcmlwdGlvbiByZXR1cm5zIGRpc3BsYXluYW1lIGlmIHNob3J0IGRlc2NyaXB0aW9uIG5vdCBzZXQuIFdlIGRvbid0IHdhbnQgdG8gc2VuZCBpdCBpZgotCQkJCQkJCQkJCSAgIC8vIGlkZW50aWNhbC4KLQkJZWxzZQotCQkJcmVjb3JkLnNob3J0RGVzY3JpcHRpb24gPSBudWxsOwotCQlyZWNvcmQuZXhwZXJ0ID0gZGVzY3IuaXNFeHBlcnQoKTsKLQkJcmVjb3JkLmhpZGRlbiA9IGRlc2NyLmlzSGlkZGVuKCk7Ci0JCXJlY29yZC5wcmVmZXJyZWQgPSBkZXNjci5pc1ByZWZlcnJlZCgpOwotCQlyZWNvcmQuY2F0ZWdvcnkgPSBudWxsOyAvLyBDbGVhciBvdXQgaW4gY2FzZSBub3Qgc2V0LgotCQlFbnVtZXJhdGlvbiBhdHRycyA9IGRlc2NyLmF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWlmIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJLy8gV2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiBrbm93aW5nIGhvdyBtYW55IHRoZXJlIGFyZSBhaGVhZCBvZiB0aW1lLCBzbyB3ZSB3aWxsIGJ1aWxkIGludG8gbGlzdHMgYW5kIHRoZW4gdHVybiBpbnRvIGFycmF5cyBhdCB0aGUgZW5kLgotCQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGF0dHJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgYXR0cnMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKElCYXNlQmVhbkluZm9Db25zdGFudHMuQ0FURUdPUlkpKQotCQkJCQlyZWNvcmQuY2F0ZWdvcnkgPSAoU3RyaW5nKSBkZXNjci5nZXRWYWx1ZShJQmFzZUJlYW5JbmZvQ29uc3RhbnRzLkNBVEVHT1JZKTsKLQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoQmFzZUJlYW5JbmZvLlBSRUZFUlJFRCkpIHsKLQkJCQkJLy8gQSBidWcgaW4gSmF2YSAxLjMsIGRvaW5nIHNldFByZWZlcnJlZCB3YXMgbG9zdC4gU28gZm9yIHRob3NlIGFsc28gc3RvcmVkIGl0IGluIGF0dHJpYnV0ZXMuIFNvIGlmIHNldCBoZXJlLCB0aGVuIHVzZSBpdC4KLQkJCQkJcmVjb3JkLnByZWZlcnJlZCA9ICgoQm9vbGVhbikgZGVzY3IuZ2V0VmFsdWUoQmFzZUJlYW5JbmZvLlBSRUZFUlJFRCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoIWZpbGxGcm9tQXR0cmlidXRlcyhyZWNvcmQsIGRlc2NyLCBhdHRyTmFtZSwgcmVjb3JkVHlwZSkpIHsKLQkJCQkJLy8gSnVzdCBjb3B5IGFjY3Jvc3MuIEZpbGxmcm9tQXR0cmlidXRlcyBkaWRuJ3QgaGFuZGxlIGl0LgotCQkJCQlGZWF0dXJlQXR0cmlidXRlVmFsdWUgZnYgPSBuZXcgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCWZ2LnNldFZhbHVlKGRlc2NyLmdldFZhbHVlKGF0dHJOYW1lKSk7Ci0JCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCXZhbHVlcy5hZGQoZnYpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZU5hbWVzID0gKFN0cmluZ1tdKSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IChGZWF0dXJlQXR0cmlidXRlVmFsdWVbXSkgdmFsdWVzLnRvQXJyYXkobmV3IEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVt2YWx1ZXMuc2l6ZSgpXSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlY29yZC5hdHRyaWJ1dGVOYW1lcyA9IG51bGw7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZWNvcmQuYXR0cmlidXRlTmFtZXMgPSBudWxsOwotCQkJcmVjb3JkLmF0dHJpYnV0ZVZhbHVlcyA9IG51bGw7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogR2V0IHRoZSBjbGFzc25hbWUgZnJvbSB0aGUgY2xhc3MuIElmIGNsYXNzcyBpcyBudWxsLCB0aGVuIHRoaXMgcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIGNsYXNzcykgewotCQlyZXR1cm4gY2xhc3NzICE9IG51bGwgPyBjbGFzc3MuZ2V0TmFtZSgpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlZmxlY3RNZXRob2RSZWNvcmQgZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlSZWZsZWN0TWV0aG9kUmVjb3JkIHJtciA9IG5ldyBSZWZsZWN0TWV0aG9kUmVjb3JkKCk7Ci0JCQlybXIuY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQkJCXJtci5tZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJCUNsYXNzW10gcGFybVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlpZiAocGFybVR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQlybXIucGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFN0cmluZ1twYXJtVHlwZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlybXIucGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gZ2V0Q2xhc3NOYW1lKHBhcm1UeXBlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJtcjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBSZWZsZWN0RmllbGRSZWNvcmQgZ2V0UmVmbGVjdGVkRmllbGRSZWNvcmQoRmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCVJlZmxlY3RGaWVsZFJlY29yZCByZiA9IG5ldyBSZWZsZWN0RmllbGRSZWNvcmQoKTsKLQkJCXJmLmNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQkJCXJmLmZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQkJCXJmLnJlYWRPbmx5ID0gTW9kaWZpZXIuaXNGaW5hbChmaWVsZC5nZXRNb2RpZmllcnMoKSk7Ci0JCQlyZXR1cm4gcmY7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mbzE1LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkMmNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci0KLS8qKgotICogVGhpcyB3YXMgc3VwcG9zZWQgdG8gZm9yIDEuNCBvciBhYm92ZSB3aGVyZSBpdCBjYW4gdXNlIGlkZW50aXR5Ci0gKiB0byB0ZXN0IGZvciBpbmhlcml0ZWQgZmVhdHVyZXMsIGJ1dCBpdCBzdGlsbCBpcyBub3QgY29ycmVjdAotICogaW4gMS40LiBTZWUgdGhlIGhlYWRlciBjb21tZW50cyBpbiBNb2RlbGluZ0JlYW5JbmZvLgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm0uTW9kZWxpbmdCZWFuSW5mbwotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxpbmdCZWFuSW5mbzE1IGV4dGVuZHMgTW9kZWxpbmdCZWFuSW5mbyB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxpbmdCZWFuSW5mbzE1LgotCSAqIEBwYXJhbSBiZWFuSW5mbwotCSAqLwotCXB1YmxpYyBNb2RlbGluZ0JlYW5JbmZvMTUoQmVhbkluZm8gYmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXN1cGVyKGJlYW5JbmZvLCBkb0ZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxpbmdCZWFuSW5mbzE1LgotCSAqIEBwYXJhbSBiZWFuSW5mbwotCSAqIEBwYXJhbSBzdXBlckJlYW5JbmZvCi0JICovCi0JcHVibGljIE1vZGVsaW5nQmVhbkluZm8xNShCZWFuSW5mbyBiZWFuSW5mbywgQmVhbkluZm8gc3VwZXJCZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJc3VwZXIoYmVhbkluZm8sIHN1cGVyQmVhbkluZm8sIGRvRmxhZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm9QcmUxNS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mb1ByZTE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmQ4NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mb1ByZTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1vZGVsaW5nIEJlYW5JbmZvIGZvciBQcmUtSkRLIDEuNC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsaW5nQmVhbkluZm9QcmUxNSBleHRlbmRzIE1vZGVsaW5nQmVhbkluZm8gewotCi0JcHVibGljIE1vZGVsaW5nQmVhbkluZm9QcmUxNShCZWFuSW5mbyBiZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJc3VwZXIoYmVhbkluZm8sIGRvRmxhZ3MpOwotCX0KLQotCXB1YmxpYyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUoQmVhbkluZm8gYmVhbkluZm8sIEJlYW5JbmZvIHN1cGVyQmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXN1cGVyKGJlYW5JbmZvLCBzdXBlckJlYW5JbmZvLCBkb0ZsYWdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9QYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1BhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA5ZmNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1BhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotLyoqCi0gKiBQYXJhbWV0ZXJEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5IGV4dGVuZHMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0JCi0Jc3RhdGljIHZvaWQgSU5JVCgpIHsKLQkJdHJ5IHsKLQkJCU1BUF9FUVVBTElUWS5wdXQoUGFyYW1ldGVyRGVzY3JpcHRvci5jbGFzcywgKFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1BhcmFtZXRlckRlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkoUGFyYW1ldGVyRGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1Byb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDVlZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLS8qKgotICogUHJvcGVydHlEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsJCi0JCi0JcHVibGljIFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9CQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJaW50IGhjID0gMDsKLQkJaWYgKHBkLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpLmhhc2hDb2RlKCk7Ci0JCWlmIChwZC5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UHJvcGVydHlUeXBlKCkuaGFzaENvZGUoKTsKLQkJaWYgKHBkLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UmVhZE1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCWlmIChwZC5nZXRXcml0ZU1ldGhvZCgpICE9IG51bGwpCi0JCQloYyArPSBwZC5nZXRXcml0ZU1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCQkKLQkJaGMgKz0gKHBkLmlzQm91bmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpLmhhc2hDb2RlKCk7Ci0JCWhjICs9IChwZC5pc0NvbnN0cmFpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwkJCi0JCQkJCQkKLQkJcmV0dXJuIGhhc2hjb2RlKjMxICsgaGM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGlkZW50aXR5VGVzdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLSAJCi0JCVByb3BlcnR5RGVzY3JpcHRvciBvcCA9IChQcm9wZXJ0eURlc2NyaXB0b3IpICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZTsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIGZwID0gKFByb3BlcnR5RGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0gCQkKLQkJaWYgKG9wLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSAhPSBmcC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvcC5nZXRSZWFkTWV0aG9kKCkgIT0gZnAuZ2V0UmVhZE1ldGhvZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3AuZ2V0V3JpdGVNZXRob2QoKSAhPSBmcC5nZXRXcml0ZU1ldGhvZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3AuaXNCb3VuZCgpICE9IGZwLmlzQm91bmQoKSkKLQkJCXJldHVybiBmYWxzZTsJCQkJCi0JCWlmIChvcC5pc0NvbnN0cmFpbmVkKCkgIT0gZnAuaXNDb25zdHJhaW5lZCgpKQotCQkJcmV0dXJuIGZhbHNlOwkJCQkJCQkJCQkJCQkJCi0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGYwNTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJlYW5pbmZvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhYTllYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotQGRvdAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNDY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjJhNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm88L25hbWU+Ci0gICAgPGNvbW1lbnQ+PC9jb21tZW50PgotICAgIDxwcm9qZWN0cz48L3Byb2plY3RzPgotICAgIDxidWlsZFNwZWM+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgICAgICA8YnVpbGRDb21tYW5kPgotICAgICAgICAgICAgPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgICAgICA8YnVpbGRDb21tYW5kPgotICAgICAgICAgICAgPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICA8L2J1aWxkU3BlYz4KLSAgICA8bmF0dXJlcz4KLSAgICAgICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0gICAgICAgIDxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotICAgIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTM2ZjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1N1biBBcHIgMTUgMjE6MTU6MDQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OGFkODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLSNTYXQgTWFyIDMxIDIzOjA1OjQzIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWUxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZGMxNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEp1biAxNiAxMTowOTowOCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmluX3ZtX2JlYW5pbmZvdm0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjM5NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbywKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZW0ucHJveHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIGNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudDtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2U7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bTtidW5kbGUtdmVyc2lvbj0iWzIuMC4yMDAsMy4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlYTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5EZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODIxZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJlYW4gRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBCZWFuRGVjb3JhdG9yIGluIGphdmEuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyUHJvcGVydGllcyA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyTWV0aG9kcyA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyRXZlbnRzIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzSW50cm9zcGVjdFByb3BlcnRpZXMgPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0TWV0aG9kcyA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RFdmVudHMgPGVtPkludHJvc3BlY3QgRXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0RvQmVhbmluZm8gPGVtPkRvIEJlYW5pbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBNZXRob2QgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgRXZlbnQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldEN1c3RvbWl6ZXJDbGFzcyA8ZW0+Q3VzdG9taXplciBDbGFzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBCZWFuRGVjb3JhdG9yIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvcnsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2hvdWxkIHRoZSBwcm9wZXJ0aWVzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEF0dHJpYnV0ZXMvZUFsbFJlZmVyZW5jZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3Vuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMgPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3Vuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzIDxlbT5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRNZXJnZVN1cGVyUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyUHJvcGVydGllcyA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVyZ2UgU3VwZXIgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXJnZSBTdXBlciBCZWhhdmlvcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2hvdWxkIHRoZSBtZXRob2RzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEJlaGF2aW9ycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjc2V0TWVyZ2VTdXBlck1ldGhvZHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNZXJnZVN1cGVyTWV0aG9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyTWV0aG9kcyA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjaXNNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVyZ2VTdXBlck1ldGhvZHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlck1ldGhvZHMgPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKQotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlck1ldGhvZHMoKQotCSAqIEBzZWUgI3NldE1lcmdlU3VwZXJNZXRob2RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJNZXRob2RzIDxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjaXNNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjc2V0TWVyZ2VTdXBlck1ldGhvZHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1lcmdlU3VwZXJNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXJnZSBTdXBlciBFdmVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNob3VsZCB0aGUgZXZlbnRzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEV2ZW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBzZWUgI3Vuc2V0TWVyZ2VTdXBlckV2ZW50cygpCi0JICogQHNlZSAjc2V0TWVyZ2VTdXBlckV2ZW50cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWVyZ2VTdXBlckV2ZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyRXZlbnRzIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXJnZVN1cGVyRXZlbnRzKCkKLQkgKiBAc2VlICN1bnNldE1lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlckV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVyZ2VTdXBlckV2ZW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyRXZlbnRzIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWVyZ2VTdXBlckV2ZW50cygpCi0JICogQHNlZSAjaXNNZXJnZVN1cGVyRXZlbnRzKCkKLQkgKiBAc2VlICNzZXRNZXJnZVN1cGVyRXZlbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNZXJnZVN1cGVyRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlckV2ZW50cyA8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlckV2ZW50cygpCi0JICogQHNlZSAjc2V0TWVyZ2VTdXBlckV2ZW50cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWVyZ2VTdXBlckV2ZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTaG91bGQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnRyb3NwZWN0UHJvcGVydGllcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzIDxlbT5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW50cm9zcGVjdFByb3BlcnRpZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRyb3NwZWN0IE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50cm9zcGVjdCBCZWhhdmlvcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2hvdWxkIHRoZSBtZXRob2RzIGZyb20gdGhlIGludHJvc3BlY3Rpb24gYmUgYWRkZWQgdG8gdGhlIGNsYXNzLiBUaGlzIGFsbG93cyBtZXRob2RzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludHJvc3BlY3QgTWV0aG9kczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW50cm9zcGVjdE1ldGhvZHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0TWV0aG9kcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJbnRyb3NwZWN0TWV0aG9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0TWV0aG9kcyA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludHJvc3BlY3RNZXRob2RzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50cm9zcGVjdCBFdmVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2hvdWxkIHRoZSBldmVudHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIGV2ZW50cyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW50cm9zcGVjdEV2ZW50cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RFdmVudHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSW50cm9zcGVjdEV2ZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0RXZlbnRzIDxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdEV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW50cm9zcGVjdEV2ZW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3VzdG9taXplckNsYXNzKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9DdXN0b21pemVyQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0Q3VzdG9taXplckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXRDdXN0b21pemVyQ2xhc3MgPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VzdG9taXplckNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EbyBCZWFuaW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EbyBCZWFuaW5mbzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIG1lYW5zIGRvIHdlIGdvIGFuZCBnZXQgdGhlIGJlYW5pbmZvIGZyb20gdGhlIHJlbW90ZSB2bS4gSWYgZmFsc2UsIHRoZW4gaXQgd2lsbCBub3QgdHJ5IHRvIGdldCB0aGUgYmVhbmluZm8uIFRoaXMgZG9lc24ndCBwcmV2ZW50IGludHJvc3BlY3Rpb24gdGhyb3VnaCByZWZsZWN0aW9uLiBUaGF0IGlzIGNvbnRyb2xlZCBieSB0aGUgc2VwYXJhdGUgaW50cm9zcGVjdC4uLiBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EbyBCZWFuaW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RG9CZWFuaW5mbyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yX0RvQmVhbmluZm8oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRG9CZWFuaW5mbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNEb0JlYW5pbmZvIDxlbT5EbyBCZWFuaW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RG8gQmVhbmluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRG9CZWFuaW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RG9CZWFuaW5mbyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdCBJbmhlcml0ZWQgUHJvcGVydHkgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzIHRvIG5vdCB1c2UgaW4gZ2V0QWxsUHJvcGVydGllcygpLiBUaGVzZSBuYW1lcyBhcmUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgaW5oZXJpdGVkIGFuZCBzaG91bGQgbm90IHNob3cgdGhyb3VnaC4gSWYgdGhlIGluaGVyaXRlZCBwcm9wZXJ0eSBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsUHJvcGVydGllcygpLgotCSAqIDxwPgotCSAqIFRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJQcm9wZXJ0aWVzIGZsYWcgaXMgZmFsc2UuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBhdHRyaWJ1dGUgaXMgbm90IG1lYW50IHRvIGJlIGNoYW5nZWQgYnkgY2xpZW50cy4gSXQgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgbWV0aG9kIG5hbWVzIHRvIG5vdCB1c2UgaW4gZUFsbE9wZXJhdGlvbnMoKS4gVGhlc2UgbmFtZXMgYXJlIG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGluaGVyaXRlZCBhbmQgc2hvdWxkIG5vdCBzaG93IHRocm91Z2guIElmIHRoZSBpbmhlcml0ZWQgb3BlcmF0aW9uIGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxPcGVyYXRpb25zKCkuCi0JICogPHA+Ci0JICogVGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIG9wZXJhdGlvbnMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlckJlaGF2aW9ycyBmbGFnIGlzIGZhbHNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIEV2ZW50IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBldmVudCBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbEV2ZW50cygpLiBUaGVzZSBuYW1lcyBhcmUgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIGV2ZW50IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxFdmVudHMoKS4KLQkgKiA8cD4KLQkgKiBUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBhbGwgZXZlbnRzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJFdmVudHMgZmxhZyBpcyBmYWxzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBVUkwgb2YgYSAxNngxNiBDb2xvciBpY29uCi0JICovCi0JVVJMIGdldEljb25VUkwoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyZWJhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vQmVhbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEV2ZW50IGZyb20gSW50cm9zcGVjdGlvbi9SZWZsZWN0aW9uLgotICogPHA+Ci0gKiBUaGUgQmVhbkV2ZW50IHdpbGwgYmUgdW5kZXIgdGhlIEphdmFDbGFzcycgZXZlbnRzIGFuZCBhbGxFdmVudHMgZmVhdHVyZS4gRWFjaCBCZWFuRXZlbnQgd2lsbCBiZSBkZWNvcmF0ZWQgYnkgYW4gRXZlbnRTZXREZWNvcmF0b3IuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRCZWFuRXZlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBCZWFuRXZlbnQgZXh0ZW5kcyBKYXZhRXZlbnR7Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuaW5mb0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuaW5mb0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjOWExMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vQmVhbmluZm9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbmluZm9GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCZWFuaW5mb0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9GYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZlYXR1cmUgRGVjb3JhdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GZWF0dXJlIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZURlY29yYXRvciBjcmVhdGVGZWF0dXJlRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV2ZW50U2V0RGVjb3JhdG9yIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQcm94eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFByb3h5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQcm94eSBjcmVhdGVNZXRob2RQcm94eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5IERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5kZXhlZCBQcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRGVjb3JhdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CZWFuIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbkRlY29yYXRvciBjcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZERlY29yYXRvciBjcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFyYW1ldGVyRGVjb3JhdG9yIGNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCZWFuaW5mb1BhY2thZ2UgZ2V0QmVhbmluZm9QYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRXZlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRXZlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJlYW5FdmVudCBjcmVhdGVCZWFuRXZlbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ4MWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuaW5mb1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9GYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5pbmZvUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImJlYW5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9iZWFuaW5mby5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5iZWFuaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbmluZm9QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCA8ZW0+RmVhdHVyZSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRSA9IEVjb3JlUGFja2FnZS5FQU5OT1RBVElPTl9fU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbHM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUyA9IEVjb3JlUGFja2FnZS5FQU5OT1RBVElPTl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fX0VNT0RFTF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFMgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUUgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3J0IERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWSA9IEVjb3JlUGFja2FnZS5FQU5OT1RBVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVCA9IEVjb3JlUGFja2FnZS5FQU5OT1RBVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRkZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZlcnJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXRseSBTZXQgQml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwgPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUiA9IDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2RQcm94eUltcGwgPGVtPk1ldGhvZCBQcm94eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZFByb3h5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRNZXRob2RQcm94eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFkgPSA3OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsIDxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SID0gNTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwgPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1IgPSA2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwgPGVtPkJlYW4gRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUiA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2REZWNvcmF0b3JJbXBsIDxlbT5NZXRob2QgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kRGVjb3JhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRNZXRob2REZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUiA9IDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5QYXJhbWV0ZXJEZWNvcmF0b3JJbXBsIDxlbT5QYXJhbWV0ZXIgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUGFyYW1ldGVyRGVjb3JhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUiA9IDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBWYWx1ZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGRUFUVVJFX0FUVFJJQlVURV9WQUxVRSA9IDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GZWF0dXJlIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVBTk5PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19TT1VSQ0UgPSBGRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbHM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fREVUQUlMUyA9IEZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNb2RlbCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRSA9IEZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3J0IERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19DQVRFR09SWSA9IEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0VYUEVSVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0hJRERFTiA9IEZFQVRVUkVfREVDT1JBVE9SX19ISURERU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZmVycmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWSA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0bHkgU2V0IEJpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHID0gRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgU3VwZXIgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgU3VwZXIgRXZlbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludHJvc3BlY3QgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRyb3NwZWN0IEV2ZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EbyBCZWFuaW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdCBJbmhlcml0ZWQgTWV0aG9kIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIEV2ZW50IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QmVhbiBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUyA9IEZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUyA9IEZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNb2RlbCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUyA9IEZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FID0gRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19DQVRFR09SWSA9IEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVhQRVJUID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRkZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19ISURERU4gPSBGRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZlcnJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdGx5IFNldCBCaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUcgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaWNhc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFkgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkV2ZW50SW1wbCA8ZW0+QmVhbiBFdmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5FdmVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0QmVhbkV2ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJFQU5fRVZFTlQgPSA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGQgTGlzdGVuZXIgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBNZXRob2RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VyIExpc3QgTXRoZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19FQU5OT1RBVElPTlMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX1NPVVJDRSA9IEZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fQ09OVEVOVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRSA9IEZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3J0IERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fQ0FURUdPUlkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX0VYUEVSVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fSElEREVOID0gRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmZXJyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIEludHJvc3BlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXRseSBTZXQgQml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHID0gRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFkgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXIgUGFybSBEZXNjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUyA9IEZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUyA9IEZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNb2RlbCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUyA9IEZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FID0gRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19DQVRFR09SWSA9IEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fRVhQRVJUID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRkZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19ISURERU4gPSBGRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZlcnJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdGx5IFNldCBCaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUcgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUUgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUyA9IEZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0UgPSBGRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbHM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FID0gRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRkZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTiA9IEZFQVRVUkVfREVDT1JBVE9SX19ISURERU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZmVycmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIEludHJvc3BlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWSA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0bHkgU2V0IEJpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUcgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25zdHJhaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNpZ24gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUUgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgSW5jb21wYXRpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIEZsYWdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWSA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5IEVkaXRvciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xcml0ZSBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TID0gUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRSA9IFBST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbHM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUyA9IFBST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFMgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUUgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04gPSBQUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWSA9IFBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRkZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOID0gUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZmVycmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IFBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIEludHJvc3BlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTiA9IFBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZID0gUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0bHkgU2V0IEJpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyA9IFBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRyA9IFBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTID0gUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORCA9IFBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2lnbiBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FID0gUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgSW5jb21wYXRpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEUgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIEZsYWdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTID0gUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFkgPSBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTID0gUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EID0gUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3JpdGUgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCA9IFBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCA9IFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXhlZCBSZWFkIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EID0gUFJPUEVSVFlfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleGVkIFdyaXRlIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCA9IFBST1BFUlRZX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5kZXhlZCBQcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCA9IFBST1BFUlRZX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19OQU1FID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FR0VORVJJQ19UWVBFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX0VUWVBFX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVRZUEVfUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXhjZXB0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBFeGNlcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX0VHRU5FUklDX0VYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUdFTkVSSUNfRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX01FVEhPRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUHJveHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0VBTk5PVEFUSU9OUyA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fTkFNRSA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19PUkRFUkVEID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19VTklRVUUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19MT1dFUl9CT1VORCA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVVBQRVJfQk9VTkQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fTUFOWSA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19SRVFVSVJFRCA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fRVRZUEUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fRUdFTkVSSUNfVFlQRSA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0NIQU5HRUFCTEUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVk9MQVRJTEUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19UUkFOU0lFTlQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19ERUZBVUxUX1ZBTFVFID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVU5TRVRUQUJMRSA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVyaXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0RFUklWRUQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QmVhbiBFdmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX0ZFQVRVUkVfQ09VTlQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwgPGVtPkZlYXR1cmUgQXR0cmlidXRlIE1hcCBFbnRyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVkgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmVhdHVyZSBBdHRyaWJ1dGUgTWFwIEVudHJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtIDxlbT5JbXBsaWNpdCBJdGVtPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldEltcGxpY2l0SXRlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTVBMSUNJVF9JVEVNID0gMTA7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciA8ZW0+RmVhdHVyZSBEZWNvcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmVhdHVyZSBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmVhdHVyZURlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0U2hvcnREZXNjcmlwdGlvbiA8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfU2hvcnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0IDxlbT5FeHBlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHBlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0V4cGVydCgpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9FeHBlcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNIaWRkZW4gPGVtPkhpZGRlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhpZGRlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzSGlkZGVuKCkKLQkgKiBAc2VlICNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc1ByZWZlcnJlZCA8ZW0+UHJlZmVycmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZmVycmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNQcmVmZXJyZWQoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfUHJlZmVycmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzTWVyZ2VJbnRyb3NwZWN0aW9uIDxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzTWVyZ2VJbnRyb3NwZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX01lcmdlSW50cm9zcGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IDxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXRseVNldEJpdHMgPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXRseVNldEJpdHMoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXRseVNldEJpdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnIDxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkKLQkgKiBAc2VlICNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yIDxlbT5FdmVudCBTZXQgRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFdmVudFNldERlY29yYXRvcl9JbkRlZmF1bHRFdmVudFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNVbmljYXN0IDxlbT5VbmljYXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pY2FzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc1VuaWNhc3QoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFdmVudFNldERlY29yYXRvcl9VbmljYXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEFkZExpc3RlbmVyTWV0aG9kIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRBZGRMaXN0ZW5lck1ldGhvZCgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyTWV0aG9kcyA8ZW0+TGlzdGVuZXIgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGlzdGVuZXIgTWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRMaXN0ZW5lck1ldGhvZHMoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyVHlwZSA8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkxpc3RlbmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJUeXBlKCkKLQkgKiBAc2VlICNnZXRFdmVudFNldERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCA8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MgPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEV2ZW50QWRhcHRlckNsYXNzKCkKLQkgKiBAc2VlICNnZXRFdmVudFNldERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfRXZlbnRBZGFwdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0U2VyTGlzdE10aGQgPGVtPlNlciBMaXN0IE10aGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlciBMaXN0IE10aGQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0U2VyTGlzdE10aGQoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9TZXJMaXN0TXRoZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5IDxlbT5NZXRob2QgUHJveHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFByb3h5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQcm94eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHkjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHkjZ2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQcm94eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IgPGVtPlByb3BlcnR5IERlY29yYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0JvdW5kIDxlbT5Cb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvdW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Cb3VuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNDb25zdHJhaW5lZCA8ZW0+Q29uc3RyYWluZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25zdHJhaW5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0NvbnN0cmFpbmVkKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfQ29uc3RyYWluZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRGVzaWduVGltZSA8ZW0+RGVzaWduIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNpZ24gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Rlc2lnblRpbWUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9EZXNpZ25UaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Fsd2F5c0luY29tcGF0aWJsZSA8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsd2F5cyBJbmNvbXBhdGlibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNBbHdheXNJbmNvbXBhdGlibGUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9BbHdheXNJbmNvbXBhdGlibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0RmlsdGVyRmxhZ3MgPGVtPkZpbHRlciBGbGFnczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RmlsdGVyIEZsYWdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpbHRlckZsYWdzKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmlsdGVyRmxhZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRmllbGRSZWFkT25seSA8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRmllbGRSZWFkT25seSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFByb3BlcnR5RWRpdG9yQ2xhc3MgPGVtPlByb3BlcnR5IEVkaXRvciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByb3BlcnR5IEVkaXRvciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UmVhZE1ldGhvZCA8ZW0+UmVhZCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWFkIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfUmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0V3JpdGVNZXRob2QgPGVtPldyaXRlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPldyaXRlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX1dyaXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWVsZCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIDxlbT5JbmRleGVkIFByb3BlcnR5IERlY29yYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbmRleGVkIFByb3BlcnR5IERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRSZWFkTWV0aG9kIDxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRSZWFkTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IgPGVtPkJlYW4gRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJlYW4gRGVjb3JhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJlYW5EZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyUHJvcGVydGllcyA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlck1ldGhvZHMgPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJFdmVudHMgPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlckV2ZW50cygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzSW50cm9zcGVjdFByb3BlcnRpZXMgPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzSW50cm9zcGVjdFByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0TWV0aG9kcyA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0TWV0aG9kcygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0TWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RFdmVudHMgPGVtPkludHJvc3BlY3QgRXZlbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RFdmVudHMoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdEV2ZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXRDdXN0b21pemVyQ2xhc3MgPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5DdXN0b21pemVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjZ2V0Q3VzdG9taXplckNsYXNzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCZWFuRGVjb3JhdG9yX0N1c3RvbWl6ZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciA8ZW0+TWV0aG9kIERlY29yYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRGVjb3JhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjaXNQYXJtc0V4cGxpY2l0RW1wdHkgPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAc2VlICNnZXRNZXRob2REZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZERlY29yYXRvcl9QYXJtc0V4cGxpY2l0RW1wdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2dldFBhcmFtZXRlckRlc2NyaXB0b3JzIDxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlciBEZXNjcmlwdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRGVjb3JhdG9yX1BhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRTZXJQYXJtRGVzYyA8ZW0+U2VyIFBhcm0gRGVzYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VyIFBhcm0gRGVzYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjZ2V0U2VyUGFybURlc2MoKQotCSAqIEBzZWUgI2dldE1ldGhvZERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yIDxlbT5QYXJhbWV0ZXIgRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcmFtZXRlciBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVyRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIDxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RmVhdHVyZSBBdHRyaWJ1dGUgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbmluZm9GYWN0b3J5IGdldEJlYW5pbmZvRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCA8ZW0+RmVhdHVyZSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGRUFUVVJFX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FID0gZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfRGlzcGxheU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNob3J0IERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfU2hvcnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9DYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVCA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0V4cGVydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTiA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZmVycmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX1ByZWZlcnJlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OID0gZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXRseSBTZXQgQml0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTID0gZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXRseVNldEJpdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHID0gZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCA8ZW0+QmVhbiBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0QmVhbkRlY29yYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCRUFOX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgU3VwZXIgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTID0gZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlck1ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIFN1cGVyIEV2ZW50czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFMgPSBlSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyRXZlbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdFByb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludHJvc3BlY3QgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0TWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50cm9zcGVjdCBFdmVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFMgPSBlSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0RXZlbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EbyBCZWFuaW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTyA9IGVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX0RvQmVhbmluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdCBJbmhlcml0ZWQgUHJvcGVydHkgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTID0gZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm90IEluaGVyaXRlZCBNZXRob2QgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUyA9IGVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIEV2ZW50IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUyA9IGVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX0N1c3RvbWl6ZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsIDxlbT5FdmVudCBTZXQgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRFdmVudFNldERlY29yYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFVkVOVF9TRVRfREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbiBEZWZhdWx0IEV2ZW50IFNldDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUID0gZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmljYXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVCA9IGVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9VbmljYXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWSA9IGVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGQgTGlzdGVuZXIgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9BZGRMaXN0ZW5lck1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXIgTWV0aG9kczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFID0gZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXIgTGlzdCBNdGhkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEID0gZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2REZWNvcmF0b3JJbXBsIDxlbT5NZXRob2QgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kRGVjb3JhdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0TWV0aG9kRGVjb3JhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9ERUNPUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZID0gZUlOU1RBTkNFLmdldE1ldGhvZERlY29yYXRvcl9QYXJtc0V4cGxpY2l0RW1wdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBEZXNjcmlwdG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTID0gZUlOU1RBTkNFLmdldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VyIFBhcm0gRGVzYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0RFQ09SQVRPUl9fU0VSX1BBUk1fREVTQyA9IGVJTlNUQU5DRS5nZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlBhcmFtZXRlckRlY29yYXRvckltcGwgPGVtPlBhcmFtZXRlciBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5QYXJhbWV0ZXJEZWNvcmF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFSQU1FVEVSX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQVJBTUVURVJfREVDT1JBVE9SX19OQU1FID0gZUlOU1RBTkNFLmdldFBhcmFtZXRlckRlY29yYXRvcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVIgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX1BhcmFtZXRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsIDxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Qm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EID0gZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25zdHJhaW5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfQ29uc3RyYWluZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2lnbiBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9EZXNpZ25UaW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgSW5jb21wYXRpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFID0gZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0Fsd2F5c0luY29tcGF0aWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIEZsYWdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUyA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9GaWx0ZXJGbGFncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgUmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EID0gZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX1JlYWRNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldyaXRlIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EID0gZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX1dyaXRlTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwgPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kZXhlZCBSZWFkIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EID0gZUlOU1RBTkNFLmdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuTWV0aG9kUHJveHlJbXBsIDxlbT5NZXRob2QgUHJveHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2RQcm94eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldE1ldGhvZFByb3h5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QUk9YWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQcm94eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BST1hZX19NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRXZlbnRJbXBsIDxlbT5CZWFuIEV2ZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkV2ZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0QmVhbkV2ZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJFQU5fRVZFTlQgPSBlSU5TVEFOQ0UuZ2V0QmVhbkV2ZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsIDxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZID0gZUlOU1RBTkNFLmdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVkgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5X0tleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbSA8ZW0+SW1wbGljaXQgSXRlbTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0SW1wbGljaXRJdGVtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gSU1QTElDSVRfSVRFTSA9IGVJTlNUQU5DRS5nZXRJbXBsaWNpdEl0ZW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZlYXR1cmUgQXR0cmlidXRlIFZhbHVlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBGRUFUVVJFX0FUVFJJQlVURV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlQXR0cmlidXRlVmFsdWUoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNEb0JlYW5pbmZvIDxlbT5EbyBCZWFuaW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRvIEJlYW5pbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNEb0JlYW5pbmZvKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0RvQmVhbmluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgTWV0aG9kIE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yI2dldFBhcmFtZXRlciA8ZW0+UGFyYW1ldGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXRQYXJhbWV0ZXIoKQotCSAqIEBzZWUgI2dldFBhcmFtZXRlckRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX1BhcmFtZXRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5FdmVudCA8ZW0+QmVhbiBFdmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CZWFuIEV2ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5FdmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmVhbkV2ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmVhdHVyZSBBdHRyaWJ1dGUgTWFwIEVudHJ5PC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQotCSAqIEBtb2RlbCBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICB2YWx1ZVR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIiB2YWx1ZURhdGFUeXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPktleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKLQkgKiBAc2VlICNnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9LZXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKLQkgKiBAc2VlICNnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtIDxlbT5JbXBsaWNpdCBJdGVtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SW1wbGljaXQgSXRlbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0SW1wbGljaXRJdGVtKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9FdmVudFNldERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0V2ZW50U2V0RGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODg5ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0V2ZW50U2V0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXZlbnQgU2V0IERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVxdWl2YWxlbnQgdG8gRXZlbnRTZXREZWNvcmF0b3IgaW4gamF2YS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNJbkRlZmF1bHRFdmVudFNldCA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc1VuaWNhc3QgPGVtPlVuaWNhc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRBZGRMaXN0ZW5lck1ldGhvZCA8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyTWV0aG9kcyA8ZW0+TGlzdGVuZXIgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyVHlwZSA8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kIDxlbT5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MgPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRTZXJMaXN0TXRoZCA8ZW0+U2VyIExpc3QgTXRoZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRXZlbnRTZXREZWNvcmF0b3IgZXh0ZW5kcyBGZWF0dXJlRGVjb3JhdG9yewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluIERlZmF1bHQgRXZlbnQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjc2V0SW5EZWZhdWx0RXZlbnRTZXQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RXZlbnRTZXREZWNvcmF0b3JfSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSW5EZWZhdWx0RXZlbnRTZXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBzZWUgI3Vuc2V0SW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBzZWUgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluRGVmYXVsdEV2ZW50U2V0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNJbkRlZmF1bHRFdmVudFNldCA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBzZWUgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBzZWUgI3NldEluRGVmYXVsdEV2ZW50U2V0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNJbkRlZmF1bHRFdmVudFNldCA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjc2V0SW5EZWZhdWx0RXZlbnRTZXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluRGVmYXVsdEV2ZW50U2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmljYXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmljYXN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaWNhc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pY2FzdCgpCi0JICogQHNlZSAjdW5zZXRVbmljYXN0KCkKLQkgKiBAc2VlICNzZXRVbmljYXN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX1VuaWNhc3QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVW5pY2FzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pY2FzdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVbmljYXN0KCkKLQkgKiBAc2VlICN1bnNldFVuaWNhc3QoKQotCSAqIEBzZWUgI2lzVW5pY2FzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pY2FzdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVbmljYXN0KCkKLQkgKiBAc2VlICNpc1VuaWNhc3QoKQotCSAqIEBzZWUgI3NldFVuaWNhc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuaWNhc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pY2FzdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VW5pY2FzdCgpCi0JICogQHNlZSAjaXNVbmljYXN0KCkKLQkgKiBAc2VlICNzZXRVbmljYXN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVbmljYXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdHJ1ZSBpZiB0aGUgbGlzdGVuZXJNZXRob2RzIGZlYXR1cmUgaXMgZXhwbGljaXRseSBzZXQgYXMgZW1wdHkgYW5kIGlzIG5vdCB0byBoYXZlIGxpc3RlbmVyIG1ldGhvZHMgbWVyZ2VkIGluIGZyb20gQmVhbkluZm8gb3IgcmVmbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWRkTGlzdGVuZXJNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9BZGRMaXN0ZW5lck1ldGhvZCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0QWRkTGlzdGVuZXJNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRBZGRMaXN0ZW5lck1ldGhvZCA8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWRkTGlzdGVuZXJNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZExpc3RlbmVyTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lciBNZXRob2RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpc3RlbmVyIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBsaXN0ZW5lciBtZXRob2RzLiBJZiBpdCBpcyBkZXNpcmVkIHRoYXQgdGhlIGxpc3QgYmUgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8gc2V0IGl0LCB0aGVuIHNldCBsaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5IHRvIHRydWUuCi0JICogPHA+Ci0JICogTGlzdGVuZXJNZXRob2RzIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggTWV0aG9kRGVjb3JhdG9ycy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZGVyaXZlZCBzZXR0aW5nLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBub3RpZnkgb3V0IGNoYW5nZXMgdG8gaXQuIFRvIGhlcmUgY2hhbmdlcyB0byBpdCwgbGlzdGVuIG9uICJzZXJMaXN0TXRoZCIgbm90aWZpY2F0aW9ucyBpbnN0ZWFkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHkiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpc3RlbmVyIFR5cGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TGlzdGVuZXJUeXBlKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRMaXN0ZW5lclR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRMaXN0ZW5lclR5cGUgPGVtPkxpc3RlbmVyIFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpc3RlbmVyIFR5cGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldExpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlzdGVuZXJUeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlbW92ZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kIGdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QgPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1vdmVMaXN0ZW5lck1ldGhvZChNZXRob2QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXZlbnQgQWRhcHRlciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRm9yIHNvbWUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhbiBhZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRoYXQgaW1wbGVtZW50cyBkZWZhdWx0IG5vLW9wIG1ldGhvZHMsIGUuZy4gamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudCB3aGljaCBoYXMgamF2YS5hd3QuZXZlbnQuRm9jdXNBZGFwdGVyLiBUaGUgQWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCBpbiBhIGtleS92YWx1ZSBwYWlyIG9uIHRoZSBqYXZhLmJlYW5zLkV2ZW50U2V0RGVzY3JpcHRvciB3aXRoIGEga2V5IGRlZmluZWQgaW4gYSBzdGF0aWMgZmluYWwgY29uc3RhbnRzIEVWRU5UQURBUFRFUkNMQVNTID0gImV2ZW50QWRhcHRlckNsYXNzIi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXZlbnRBZGFwdGVyQ2xhc3MoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9FdmVudEFkYXB0ZXJDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRFdmVudEFkYXB0ZXJDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEV2ZW50QWRhcHRlckNsYXNzIDxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFdmVudEFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXZlbnRBZGFwdGVyQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlciBMaXN0IE10aGQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXIgTGlzdCBNdGhkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9TZXJMaXN0TXRoZCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZXJMaXN0TXRoZCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vRmVhdHVyZURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0ZlYXR1cmVEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4ZmIzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vRmVhdHVyZURlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBGZWF0dXJlRGVzY3JpcHRvciBpbiBqYXZhLgotICogPHA+Ci0gKiBOb3RlOiBJZiBhbnkgYXR0cmlidXRlIGlzIGV4cGxpY2l0bHkgc2V0IHRoZW4gdGhlIEJlYW5JbmZvL1JlZmxlY3Rpb24gd2lsbCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIGRlY29yYXRvci4gVGhpcyBwcm92aWRlcyBhIHdheSBvZiBvdmVycmlkaW5nIHRoZSBCZWFuSW5mb3MuIEFsc28gZm9yIGFueSBtYW55LXZhbHVlZCBhdHRyaWJ1dGUsIGlmIGl0IGlzIGRlc2lyZWQgdG8gaGF2ZSBpdCBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBmaWxsIGl0IGluLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgYXR0cmlidXRlIG5hbWVkIG9mIHRoZSBmb3JtICJhdHRpYnV0dWVFeHBsaWNpdEVtcHR5IiBJZiB0aGlzIGlzIHRydWUgdGhlbiB0aGUgQmVhbkluZm8gd2lsbCBub3QgbWVyZ2UgaW4gYW5kIHdpbGwgbGVhdmUgaXQgZW1wdHkuCi0gKiA8cD4KLSAqIFRoZXNlIGNvbW1lbnRzIGFib3V0IG1lcmdpbmcgYXBwbHkgdG8gYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBkZWNvcmF0b3IgdG9vLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRTaG9ydERlc2NyaXB0aW9uIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0V4cGVydCA8ZW0+RXhwZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc1ByZWZlcnJlZCA8ZW0+UHJlZmVycmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc01lcmdlSW50cm9zcGVjdGlvbiA8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSA8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXRseVNldEJpdHMgPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZyA8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZURlY29yYXRvciBleHRlbmRzIEVBbm5vdGF0aW9uewotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI3Vuc2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9EaXNwbGF5TmFtZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICN1bnNldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZShTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hvcnQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI3Vuc2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjc2V0U2hvcnREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfU2hvcnREZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRTaG9ydERlc2NyaXB0aW9uIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjdW5zZXRTaG9ydERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTaG9ydERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaG9ydERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldFNob3J0RGVzY3JpcHRpb24gPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI3NldFNob3J0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRTaG9ydERlc2NyaXB0aW9uIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI3NldFNob3J0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRlZ29yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHBlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4cGVydCgpCi0JICogQHNlZSAjdW5zZXRFeHBlcnQoKQotCSAqIEBzZWUgI3NldEV4cGVydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0V4cGVydCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeHBlcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0IDxlbT5FeHBlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cGVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHBlcnQoKQotCSAqIEBzZWUgI3Vuc2V0RXhwZXJ0KCkKLQkgKiBAc2VlICNpc0V4cGVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhwZXJ0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0V4cGVydCA8ZW0+RXhwZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEV4cGVydCgpCi0JICogQHNlZSAjaXNFeHBlcnQoKQotCSAqIEBzZWUgI3NldEV4cGVydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXhwZXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0IDxlbT5FeHBlcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cGVydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RXhwZXJ0KCkKLQkgKiBAc2VlICNpc0V4cGVydCgpCi0JICogQHNlZSAjc2V0RXhwZXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFeHBlcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpZGRlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGlkZGVuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpZGRlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRkZW4oKQotCSAqIEBzZWUgI3Vuc2V0SGlkZGVuKCkKLQkgKiBAc2VlICNzZXRIaWRkZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9IaWRkZW4oKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSGlkZGVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRkZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGlkZGVuKCkKLQkgKiBAc2VlICN1bnNldEhpZGRlbigpCi0JICogQHNlZSAjaXNIaWRkZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhpZGRlbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNIaWRkZW4gPGVtPkhpZGRlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIaWRkZW4oKQotCSAqIEBzZWUgI2lzSGlkZGVuKCkKLQkgKiBAc2VlICNzZXRIaWRkZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhpZGRlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRkZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhpZGRlbigpCi0JICogQHNlZSAjaXNIaWRkZW4oKQotCSAqIEBzZWUgI3NldEhpZGRlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGlkZGVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVmZXJyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWZlcnJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmZXJyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UHJlZmVycmVkKCkKLQkgKiBAc2VlICN1bnNldFByZWZlcnJlZCgpCi0JICogQHNlZSAjc2V0UHJlZmVycmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfUHJlZmVycmVkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1ByZWZlcnJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNQcmVmZXJyZWQgPGVtPlByZWZlcnJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZmVycmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByZWZlcnJlZCgpCi0JICogQHNlZSAjdW5zZXRQcmVmZXJyZWQoKQotCSAqIEBzZWUgI2lzUHJlZmVycmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmZXJyZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzUHJlZmVycmVkIDxlbT5QcmVmZXJyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UHJlZmVycmVkKCkKLQkgKiBAc2VlICNpc1ByZWZlcnJlZCgpCi0JICogQHNlZSAjc2V0UHJlZmVycmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRQcmVmZXJyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNQcmVmZXJyZWQgPGVtPlByZWZlcnJlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZmVycmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQcmVmZXJyZWQoKQotCSAqIEBzZWUgI2lzUHJlZmVycmVkKCkKLQkgKiBAc2VlICNzZXRQcmVmZXJyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFByZWZlcnJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNob3VsZCB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGJlIG1lcmdlZCBpbnRvIHRoaXMgZGVjb3JhdG9yLiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGFyZSBpZ25vcmVkIGZvciB0aGlzIHBhcnRpY3VsYXIgZGVjb3JhdG9yLiBUaGlzIGlzIGFuIGludGVybmFsIGZlYXR1cmUgc2ltcGx5IHRvIGFsbG93IGRlc2lyZWQgb3ZlcnJpZGUgY2FwYWJpbGl0aWVzLiBDdXN0b21lcnMgd291bGQgdXNlIGl0IHRvIHByZXZlbnQgQU5ZIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbiBmcm9tIG9jY3VycmluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01lcmdlSW50cm9zcGVjdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNNZXJnZUludHJvc3BlY3Rpb24gPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTWVyZ2VJbnRyb3NwZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXJnZUludHJvc3BlY3Rpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXR0cmlidXRlcyBhcmUgZXhwbGljaXRseSBzZXQgYXMgZW1wdHkgYW5kIG5vdCByZXRyaWV2ZWQgZnJvbSB0aGUgYmVhbmluZm8vcmVmbGVjdGlvbi4gQ3VzdG9tZXJzIHNob3VsZCBzZXQgdGhpcyBpZiB0aGV5IHdhbnQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBiZSBlbXB0eSBhbmQgbm90IG1lcmdlZCB3aXRoIHRoZSBCZWFuSW5mbyByZXN1bHRzLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSA8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlcyBFeHBsaWNpdCBFbXB0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBsaWNpdGx5IFNldCBCaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGJpdGZsYWcgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCBieSBCZWFuSW5mby9SZWZsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wbGljaXRseSBTZXQgQml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wbGljaXRseVNldEJpdHMobG9uZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdGx5U2V0Qml0cygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWxvbmcgZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldEltcGxpY2l0bHlTZXRCaXRzIDxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbXBsaWNpdGx5U2V0Qml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wbGljaXRseVNldEJpdHMobG9uZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSXMgdGhpcyBkZWNvcmF0b3IvZmVhdHVyZSBpbXBsaWNpdC4gVGhpcyBtZWFucyBjcmVhdGVkIGJ5IEludHJvc3BlY3Rpb24vUmVmbGVjdGlvbiBhbmQgbm90IGJ5IGN1c3RvbWVyLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbQotCSAqIEBzZWUgI3NldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJbXBsaWNpdEl0ZW0pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXREZWNvcmF0b3JGbGFnKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW1wbGljaXRJdGVtIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnIDxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbQotCSAqIEBzZWUgI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGZWF0dXJlIGF0dHJpYnV0ZXMuIEtleS92YWx1ZSBwYWlycy4gSWYgaXQgaXMgZGVzaXJlZCB0aGF0IHRoZSBmZWF0dXJlIGF0dHJpYnV0ZXMgaXMgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8vcmVmbGVjdGlvbiBzZXQgaXQsIHNldCBhdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSB0byB0cnVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbXBsaWNpdEl0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbXBsaWNpdEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNWI0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vSW1wbGljaXRJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkltcGxpY2l0IEl0ZW08L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBlbnVtIGlzIGFuIGludGVybmFsIGVudW0uIEl0IGlzIHVzZWQgYnkgQmVhbkluZm8gZm9yIGNhY2hlIG1haW50ZW5hbmNlLgotICogPHA+Ci0gKiBUaGlzIGVudW0gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRJbXBsaWNpdEl0ZW0oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbXBsaWNpdEl0ZW0gZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVCBJTVBMSUNJVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1lYW5zIHRoaXMgZGVjb3JhdG9yIGlzIG5vdCBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgY3JlYXRlZCBieSBjdXN0b21lci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX0lNUExJQ0lUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfSU1QTElDSVQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElDSVQgREVDT1JBVE9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNvcmF0b3IgaXMgaW1wbGljaXQuIFRoYXQgaXMgaXQgd2FzIG5vdCBjcmVhdGVkIGJ5IHRoZSBjdXN0b21lci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBMSUNJVF9ERUNPUkFUT1IgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElDSVQgREVDT1JBVE9SIEFORCBGRUFUVVJFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBtZWFucyB0aGUgZGVjb3JhdG9yIGFuZCB0aGUgZmVhdHVyZSB3aGVyZSBpbXBsaWNpdC4gVGhhdCBpcyB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1QgSU1QTElDSVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX0lNUExJQ0lUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbXBsaWNpdEl0ZW0gTk9UX0lNUExJQ0lUX0xJVEVSQUwgPSBuZXcgSW1wbGljaXRJdGVtKE5PVF9JTVBMSUNJVCwgIk5PVF9JTVBMSUNJVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElDSVQgREVDT1JBVE9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lNUExJQ0lUX0RFQ09SQVRPUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1wbGljaXRJdGVtIElNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMID0gbmV3IEltcGxpY2l0SXRlbShJTVBMSUNJVF9ERUNPUkFUT1IsICJJTVBMSUNJVF9ERUNPUkFUT1IiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklNUExJQ0lUIERFQ09SQVRPUiBBTkQgRkVBVFVSRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltcGxpY2l0SXRlbSBJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCA9IG5ldyBJbXBsaWNpdEl0ZW0oSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFLCAiSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SW1wbGljaXQgSXRlbTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1wbGljaXRJdGVtW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEltcGxpY2l0SXRlbVtdIHsKLQkJCU5PVF9JTVBMSUNJVF9MSVRFUkFMLAotCQkJSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwsCi0JCQlJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5JbXBsaWNpdCBJdGVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5JbXBsaWNpdCBJdGVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGljaXRJdGVtIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSW1wbGljaXRJdGVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW1wbGljaXQgSXRlbTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsaWNpdEl0ZW0gZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PVF9JTVBMSUNJVDogcmV0dXJuIE5PVF9JTVBMSUNJVF9MSVRFUkFMOwotCQkJY2FzZSBJTVBMSUNJVF9ERUNPUkFUT1I6IHJldHVybiBJTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTDsKLQkJCWNhc2UgSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFOiByZXR1cm4gSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEltcGxpY2l0SXRlbShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9JbXBsaWNpdEl0ZW0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1MzUxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmRleGVkIFByb3BlcnR5IERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVxdWl2YWxlbnQgdG8gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkUmVhZE1ldGhvZCA8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkV3JpdGVNZXRob2QgPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGV4dGVuZHMgUHJvcGVydHlEZWNvcmF0b3J7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXhlZCBSZWFkIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNpc1NldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRJbmRleGVkUmVhZE1ldGhvZChNZXRob2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZCBnZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkUmVhZE1ldGhvZCA8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4ZWRSZWFkTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFJlYWRNZXRob2QgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRJbmRleGVkUmVhZE1ldGhvZChNZXRob2QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRSZWFkTWV0aG9kIDxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI3NldEluZGV4ZWRSZWFkTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleGVkIFdyaXRlIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0SW5kZXhlZFdyaXRlTWV0aG9kKE1ldGhvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZCBnZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleGVkV3JpdGVNZXRob2QoTWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkV3JpdGVNZXRob2QgPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRJbmRleGVkV3JpdGVNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRJbmRleGVkV3JpdGVNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9NZXRob2REZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9NZXRob2REZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkM2NiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2lzUGFybXNFeHBsaWNpdEVtcHR5IDxlbT5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycyA8ZW0+UGFyYW1ldGVyIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2dldFNlclBhcm1EZXNjIDxlbT5TZXIgUGFybSBEZXNjPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldE1ldGhvZERlY29yYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRGVjb3JhdG9yIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvcnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRydWUgaWYgdGhlIHBhcm1zIGZlYXR1cmUgaXMgZXhwbGljaXRseSBzZXQgYXMgZW1wdHkgYW5kIGlzIG5vdCB0byBoYXZlIHBhcmFtZXRlcnMgbWVyZ2VkIGluIGZyb20gQmVhbkluZm8gb3IgcmVmbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcm1zRXhwbGljaXRFbXB0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2REZWNvcmF0b3JfUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Bhcm1zRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNpc1Bhcm1zRXhwbGljaXRFbXB0eSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1Bhcm1zRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFybXNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIERlc2NyaXB0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgbGlzdC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZGVyaXZlZCBzZXR0aW5nLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBub3RpZnkgb3V0IGNoYW5nZXMgdG8gaXQuIFRvIGhlcmUgY2hhbmdlcyB0byBpdCwgbGlzdGVuIG9uICJzZXJQYXJtRGVzYyIgbm90aWZpY2F0aW9ucyBpbnN0ZWFkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXIgUGFybSBEZXNjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXIgUGFybSBEZXNjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXIgUGFybSBEZXNjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U2VyUGFybURlc2MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL01ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0NWE3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQcm94eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgb2YgYSBqYXZhIE1ldGhvZC4gSXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgbWV0aG9kIGJ1dCBkb2Vzbid0IGR1cGxpY2F0ZSB0aGUgaW50ZXJmYWNlIGZvciBpdC4KLSAqIDxwPgotICogTWV0aG9kUHJveGllcyB3aWxsIGJlIGluIHRoZSBlQmVoYXZpb3JzIHNldHRpbmcgZm9yIGFueSBtZXRob2RzIHRoYXQgYXJlIGluIHRoZSBKYXZhQ2xhc3MgbWV0aG9kcyBzZXR0aW5nIHNvIHRoYXQgdGhleSBhcmUgbm90IGR1cGxpY2F0ZWQuCi0gKiA8cD4KLSAqIE1ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldE1ldGhvZFByb3h5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBNZXRob2RQcm94eSBleHRlbmRzIEVPcGVyYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2RQcm94eV9NZXRob2QoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kIGdldE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9QYXJhbWV0ZXJEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9QYXJhbWV0ZXJEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZjliOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUGFyYW1ldGVyRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbWV0ZXIgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXRQYXJhbWV0ZXIgPGVtPlBhcmFtZXRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtZXRlckRlY29yYXRvciBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3J7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBpcyBleHBsaWNpdCBoZXJlIGJlY2F1c2UgdW5saWtlIHRoZSBvdGhlciBmZWF0dXJlIGRlY29yYXRvcnMsIHRoZSBuYW1lIGRvZXMgbm90IGNvbWUgZnJvbSB0aGUgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFBhcmFtZXRlckRlY29yYXRvcl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIEphdmFQYXJhbWV0ZXIgdGhhdCB0aGlzIFBhcmFtZXRlckRlY29yYXRvciBpcyBkZWNvcmF0aW5nLiBDYW4ndCB1c2UgZURlY29yYXRlcyBpbiB0aGlzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcmFtZXRlcihKYXZhUGFyYW1ldGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfUGFyYW1ldGVyKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXRQYXJhbWV0ZXIgPGVtPlBhcmFtZXRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL1Byb3BlcnR5RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUHJvcGVydHlEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3N2I0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUHJvcGVydHlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHkgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBQcm9wZXJ0eURlY29yYXRvciBpbiBqYXZhLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0JvdW5kIDxlbT5Cb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQ29uc3RyYWluZWQgPGVtPkNvbnN0cmFpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQWx3YXlzSW5jb21wYXRpYmxlIDxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0RmlsdGVyRmxhZ3MgPGVtPkZpbHRlciBGbGFnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRmllbGRSZWFkT25seSA8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyA8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UmVhZE1ldGhvZCA8ZW0+UmVhZCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eURlY29yYXRvciBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3J7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJvdW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJvdW5kKCkKLQkgKiBAc2VlICN1bnNldEJvdW5kKCkKLQkgKiBAc2VlICNzZXRCb3VuZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9Cb3VuZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNCb3VuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCb3VuZCgpCi0JICogQHNlZSAjdW5zZXRCb3VuZCgpCi0JICogQHNlZSAjaXNCb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm91bmQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0JvdW5kIDxlbT5Cb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCb3VuZCgpCi0JICogQHNlZSAjaXNCb3VuZCgpCi0JICogQHNlZSAjc2V0Qm91bmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0JvdW5kIDxlbT5Cb3VuZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm91bmQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJvdW5kKCkKLQkgKiBAc2VlICNpc0JvdW5kKCkKLQkgKiBAc2VlICNzZXRCb3VuZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Qm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25zdHJhaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjdW5zZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjc2V0Q29uc3RyYWluZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfQ29uc3RyYWluZWQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ29uc3RyYWluZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0NvbnN0cmFpbmVkIDxlbT5Db25zdHJhaW5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWluZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29uc3RyYWluZWQoKQotCSAqIEBzZWUgI3Vuc2V0Q29uc3RyYWluZWQoKQotCSAqIEBzZWUgI2lzQ29uc3RyYWluZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNDb25zdHJhaW5lZCA8ZW0+Q29uc3RyYWluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q29uc3RyYWluZWQoKQotCSAqIEBzZWUgI2lzQ29uc3RyYWluZWQoKQotCSAqIEBzZWUgI3NldENvbnN0cmFpbmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb25zdHJhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNDb25zdHJhaW5lZCA8ZW0+Q29uc3RyYWluZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjaXNDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjc2V0Q29uc3RyYWluZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENvbnN0cmFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNpZ24gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzaWduIFRpbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgbm90IHNldCwgdGhlbiBub3JtYWwgZGVmYXVsdCBwcm9jZXNzaW5nLgotCSAqIAotCSAqIElmIHNldCB0cnVlLCB0aGVuIHRoaXMgcHJvcGVydHkgaXMgYSBkZXNpZ24gdGltZSBwcm9wZXJ0eS4gVGhpcyBtZWFucyBpdCB3aWxsIHNob3cgdXAgaW4gdGhlIHByb3BlcnR5IHNoZWV0LCBidXQgaXQgd29uJ3QgYmUgYWJsZSB0byBiZSBjb25uZWN0ZWQgdG8gYXQgcnVudGltZS4gSXQgbWF5IG5vdCBldmVuIGJlIGEgdHJ1ZSBiZWFuIHByb3BlcnR5IGJ1dCBpbnN0ZWFkIHRoZSBidWlsZGVyIHdpbGwga25vdyBob3cgdG8gaGFuZGxlIGl0LgotCSAqIAotCSAqIElmIHNldCBmYWxzZSwgdGhlbiB0aGlzIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gdGhlIHByb3BlcnR5IHNoZWV0LCBidXQgd2lsbCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBmb3IgcnVudGltZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzaWduIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVzaWduVGltZSgpCi0JICogQHNlZSAjdW5zZXREZXNpZ25UaW1lKCkKLQkgKiBAc2VlICNzZXREZXNpZ25UaW1lKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRGVzaWduVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRGVzaWduVGltZSA8ZW0+RGVzaWduIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2lnbiBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlc2lnblRpbWUoKQotCSAqIEBzZWUgI3Vuc2V0RGVzaWduVGltZSgpCi0JICogQHNlZSAjaXNEZXNpZ25UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNpZ25UaW1lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZXNpZ25UaW1lKCkKLQkgKiBAc2VlICNpc0Rlc2lnblRpbWUoKQotCSAqIEBzZWUgI3NldERlc2lnblRpbWUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlc2lnblRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRGVzaWduVGltZSA8ZW0+RGVzaWduIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2lnbiBUaW1lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZXNpZ25UaW1lKCkKLQkgKiBAc2VlICNpc0Rlc2lnblRpbWUoKQotCSAqIEBzZWUgI3NldERlc2lnblRpbWUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERlc2lnblRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsd2F5cyBJbmNvbXBhdGlibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsd2F5cyBJbmNvbXBhdGlibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgc2V0IHRydWUsIHRoZW4gd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFyZSBzZWxlY3RlZCwgdGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgaW5jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4gU28gaW4gdGhpcyBjYXNlIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCBpZiBtb3JlIHRoYW4gb25lIG9iamVjdCBoYXMgYmVlbiBzZWxlY3RlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx3YXlzSW5jb21wYXRpYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yX0Fsd2F5c0luY29tcGF0aWJsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBbHdheXNJbmNvbXBhdGlibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Fsd2F5c0luY29tcGF0aWJsZSA8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBbHdheXNJbmNvbXBhdGlibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsd2F5c0luY29tcGF0aWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBGbGFnczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsdGVyIEZsYWdzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIEZsYWdzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWx0ZXJGbGFncygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEZpbHRlckZsYWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElzIHRoaXMgZmllbGQgcmVhZC1vbmx5IChpLmUuIGlzIGEgImZpbmFsIiBmaWVsZCkuIFRoaXMgaXMgb25seSByZWZlcmVuY2VkIGlmIHRoZSBmaWVsZCByZWZlcmVuY2UgaXMgc2V0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkUmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNGaWVsZFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNGaWVsZFJlYWRPbmx5IDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaWVsZFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZFJlYWRPbmx5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9wZXJ0eUVkaXRvckNsYXNzKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyA8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb3BlcnR5RWRpdG9yQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgTWV0aG9kPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI3NldFJlYWRNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kIGdldFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRSZWFkTWV0aG9kIDxlbT5SZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0UmVhZE1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRSZWFkTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRSZWFkTWV0aG9kIDxlbT5SZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRSZWFkTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFJlYWRNZXRob2QgPGVtPlJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVhZE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UmVhZE1ldGhvZCgpCi0JICogQHNlZSAjc2V0UmVhZE1ldGhvZChNZXRob2QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWFkTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xcml0ZSBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldyaXRlIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI3Vuc2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI3NldFdyaXRlTWV0aG9kKE1ldGhvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0V3JpdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI3Vuc2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldFdyaXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXcml0ZU1ldGhvZChNZXRob2QgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0V3JpdGVNZXRob2QgPGVtPldyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI3NldFdyaXRlTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdyaXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xcml0ZSBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0V3JpdGVNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V3JpdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZmllbGQgYW5kIG5vdCBhIGdldHRlci9zZXR0ZXIgcHJvcGVydHkuIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhlIFZpc3VhbCBFZGl0b3IgdXNlcyB0byB0aGUgQmVhbkluZm8gbW9kZWwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNpc1NldEZpZWxkKCkKLQkgKiBAc2VlICN1bnNldEZpZWxkKCkKLQkgKiBAc2VlICNzZXRGaWVsZChGaWVsZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGaWVsZCBnZXRGaWVsZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0RmllbGQoKQotCSAqIEBzZWUgI3Vuc2V0RmllbGQoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZChGaWVsZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RmllbGQoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAc2VlICNzZXRGaWVsZChGaWVsZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn0nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaWVsZCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBzZWUgI3NldEZpZWxkKEZpZWxkKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RmllbGQoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2V0IHRoZSBwcm9wZXJ0eSB0eXBlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3NpZmllciBnZXRQcm9wZXJ0eVR5cGUoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBwcm9wZXJ0eSB0eXBlIGlzIG5vdCBwZXJzaXN0ZWQgaWYgdGhpcyBjbGFzcyBpcyBzZXJpYWxpemVkIGludG8gYW4gWE1JIGZpbGUuIE5vciBpcyAKLQkgKiBpdCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCBmcm9tIGFuIFhNSSBmaWxlLiBJdCBpcyBhbiBvcGVyYXRpb24uIEl0IGlzIHVzZWQgYnkKLQkgKiBjbGllbnRzIHdoaWNoIHdhbnQgYSBQcm9wZXJ0eURlY29yYXRvciB0aGF0IGlzIG5vdCBwYXJ0IG9mIGEgQmVhbkluZm8gbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRoZSBwcm9wZXJ0eSB0eXBlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9wZXJ0eVR5cGUoRUNsYXNzaWZpZXIgcHJvcGVydHlUeXBlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbiBmb3Igd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHdyaXRlYWJsZSBvciBub3QKLQkgKiBJdCBjb3VsZCBoYXZlIGEgd3JpdGUgbWV0aG9kIG9yIGl0IGNvdWxkIGhhdmUgYSBmaWVsZCAoZS5nLiBqYXZhLmF3dC5JbnNldHMudG9wKQotCSAqLwotCWJvb2xlYW4gaXNXcml0ZWFibGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbiBmb3Igd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHJlYWRhYmxlIG9yIG5vdAotCSAqIEl0IGNvdWxkIGhhdmUgYSByZWFkIG1ldGhvZCBvciBpdCBjb3VsZCBoYXZlIGEgZmllbGQgKGUuZy4gamF2YS5hd3QuSW5zZXRzLnRvcCkKLQkgKi8KLQlib29sZWFuIGlzUmVhZGFibGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0OTcxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5UUk9TUEVDVF9GQUlMRURfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb0NsYXNzQWRhcHRlcl9DbGFzc05vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvTmF0dXJlX0ludmFsaWRQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyX1N0YXJ0QmVhbmluZm9SZWdpc3RyeTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQ2NWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBoYW5kbGluZyB0aGUgQmVhbkluZm8gZGVjb3JhdG9ycyB3aXRoIHJlc3BlY3QgdG8gdGhlIG92ZXJyaWRlcyAoZXhwbGljaXQgc2V0dGluZ3MpIHZzLiBpbnRyb3NwZWN0ZWQvcmVmbGVjdGVkIChpbXBsaWNpdAotICogc2V0dGluZ3MpIEl0IGhhbmRsZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBkYXRhIGZyb20gdGhlIFZNIGZvciBpbnRyb3NwZWN0aW9uLgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkgewotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBmb3IgRmVhdHVyZURlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoRmVhdHVyZURlY29yYXRvciBkZWNvcikgewotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQkvLyBGb3IgZWFjaCBzZXR0aW5nLCBzZWUgaWYgaXQgd2FzIGltcGxpY2l0bHkgc2V0LCBhbmQgaWYgaXQgd2FzLCB0aGVuIHVuc2V0IGl0LgotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0RJU1BMQVlOQU1FX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXREaXNwbGF5TmFtZSgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX1NIT1JUREVTQ19JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9DYXRlZ29yeSgpKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9FWFBFUlRfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldEV4cGVydCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0hJRERFTl9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0SGlkZGVuKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRQcmVmZXJyZWQoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9BVFRSSUJVVEVTX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGRlY29yLmdldEF0dHJpYnV0ZXMoKS5saXN0SXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsIGVudHJ5ID0gKEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwpaXRyLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0VHlwZWRWYWx1ZSgpLmlzSW1wbGljaXRWYWx1ZSgpKSB7Ci0JCQkJCWl0ci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCWRlY29yCi0JCQkJLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MKLQkJCQkJCSYgfihGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0RJU1BMQVlOQU1FX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9TSE9SVERFU0NfSU1QTElDSVQKLQkJCQkJCQkJfCBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9FWFBFUlRfSU1QTElDSVQKLQkJCQkJCQkJfCBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0hJRERFTl9JTVBMSUNJVCB8IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9BVFRSSUJVVEVTX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBmb3IgQmVhbkRlY29yYXRvcgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihCZWFuRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEJlYW5EZWNvcmF0b3JJbXBsLkJFQU5fQ1VTVE9NSVpFUl9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9QUk9QRVJUSUVTX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRNZXJnZVN1cGVyUHJvcGVydGllcygpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9FVkVOVFNfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldE1lcmdlU3VwZXJFdmVudHMoKTsKLQkJaWYgKGRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKSkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKTsgLy8gSnVzdCBjbGVhciB0aGVtLiBUaGlzIGlzIG91ciBhdHRyaWJ1dGUuIEl0IHNob3VsZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBub3QgYmUgc2V0IG92ZXJyaWRlcy4KLQkJaWYgKGRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSkpCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkpOyAvLyBKdXN0IGNsZWFyIHRoZW0uIFRoaXMgaXMgb3VyIGF0dHJpYnV0ZS4gSXQgc2hvdWxkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIG5vdCBiZSBzZXQgb3ZlcnJpZGVzLgotCQlpZiAoZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkpKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkpOyAvLyBKdXN0IGNsZWFyIHRoZW0uIFRoaXMgaXMgb3VyIGF0dHJpYnV0ZS4gSXQgc2hvdWxkIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZSBzZXQgb3ZlcnJpZGVzLgotCi0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MKLQkJCQkmIH4oQmVhbkRlY29yYXRvckltcGwuQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUIHwgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfUFJPUEVSVElFU19JTVBMSUNJVAotCQkJCQkJfCBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUIHwgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBvZiB0aGUgUHJvcGVydHlEZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKFByb3BlcnR5RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9FRElUT1JfQ0xBU1NfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0UmVhZE1ldGhvZCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldFdyaXRlTWV0aG9kKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9GSUVMRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJZGVjb3IudW5zZXRGaWVsZCgpOwkJCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZCgpKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldEJvdW5kKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0Q29uc3RyYWluZWQoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0RFU0lHTlRJTUVfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldERlc2lnblRpbWUoKTsKLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncwotCQkJCSYgfihQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRURJVE9SX0NMQVNTX0lNUExJQ0lUIHwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1JFQURNRVRIT0RfSU1QTElDSVQKLQkJCQkJCXwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1dSSVRFTUVUSE9EX0lNUExJQ0lUIHwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0JPVU5EX0lNUExJQ0lUCi0JCQkJCQl8IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVCB8IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9ERVNJR05USU1FX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBvZiB0aGUgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgZGVjb3IpIHsKLQkJY2xlYXIoKFByb3BlcnR5RGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUIHwgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1dSSVRFTUVUSE9EX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG1ldGhvZCBkZWNvcmF0b3Igb2YgYW55IGltcGxpY2l0IHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihNZXRob2REZWNvcmF0b3IgZGVjb3IpIHsKLQkJY2xlYXIoKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJLy8gRm9yIGVhY2ggc2V0dGluZywgc2VlIGlmIGl0IHdhcyBpbXBsaWNpdGx5IHNldCwgYW5kIGlmIGl0IHdhcywgdGhlbiB1bnNldCBpdC4KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgKE1ldGhvZERlY29yYXRvckltcGwuTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQgfCBNZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKSAhPSAwKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCkpOwotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KE1ldGhvZERlY29yYXRvckltcGwuTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQgfCBNZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZXZlbnQgc2V0IGRlY29yYXRvciBvZiBhbnkgaW1wbGljaXQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKEV2ZW50U2V0RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfRXZlbnRBZGFwdGVyQ2xhc3MoKSk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIChFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUIHwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUKSkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0RFRkFVTFRFVkVOVFNFVF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0SW5EZWZhdWx0RXZlbnRTZXQoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX1VOSUNBU1RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldFVuaWNhc3QoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpKTsKLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCB8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BREFQVEVSQ0xBU1NfSU1QTElDSVQKLQkJCQkJCXwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSTUVUSE9EU19JTVBMSUNJVCB8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVAotCQkJCQkJfCBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQgfCBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfREVGQVVMVEVWRU5UU0VUX0lNUExJQ0lUCi0JCQkJCQl8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9VTklDQVNUX0lNUExJQ0lUIHwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGludHJvc3BlY3QoSUJlYW5Qcm94eSBtb2RlbEJlYW5pbmZvUHJveHksIEludHJvc3BlY3RDYWxsQmFjayBjYWxsYmFjaykgewotCQlQcm94eUludHJvc3BlY3RDYWxsQmFjayBjYiA9IG5ldyBQcm94eUludHJvc3BlY3RDYWxsQmFjayhjYWxsYmFjayk7Ci0JCW1vZGVsQmVhbmluZm9Qcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldENhbGxiYWNrUmVnaXN0cnkoKS5yZWdpc3RlckNhbGxiYWNrKG1vZGVsQmVhbmluZm9Qcm94eSwgY2IpOwotCQl0cnkgewotCQkJQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMobW9kZWxCZWFuaW5mb1Byb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkpLmdldFNlbmRCZWFuSW5mb1Byb3h5KCkKLQkJCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhtb2RlbEJlYW5pbmZvUHJveHkpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWxCZWFuaW5mb1Byb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLmRlcmVnaXN0ZXJDYWxsYmFjayhtb2RlbEJlYW5pbmZvUHJveHkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNhbGwgYmFjayBpcyBmb3IgZWFjaCByZXF1ZXN0ZWQgdHlwZSBvZiByZWNvcmQuIEl0IGFsbG93cyB0aGUgY2FsbGVlIHRvIHByb2Nlc3MgdGhpcyByZWNvcmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJbnRyb3NwZWN0Q2FsbEJhY2sgewotCi0JCS8qKgotCQkgKiBQcm9jZXNzIHRoZSBCZWFuRGVjb3JhdG9yUmVjb3JkLiBUaGUgY2FsbGVlIGNhbiBkZWNpZGUgd2hhdCBuZWVkcyB0byBiZSBkb25lIHdpdGggdGhpcyByZWNvcmQuIEl0IHdvdWxkIHJldHVybiB0aGUgQmVhbmREZWNvcmF0b3IgdGhhdCBuZWVkcwotCQkgKiB0byBoYXZlIHRoZSByZWNvcmQgYXBwbGllZCB0by4gSWYgaXQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSByZWNvcmQgd2lsbCBiZSBpZ25vcmVkLgotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gQmVhbkRlY29yYXRvciB0byBiZSBhcHBsaWVkIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZWNvcmQgaXMgdG8gYmUgaWdub3JlZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIEJlYW5EZWNvcmF0b3IgcHJvY2VzcyhCZWFuUmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIFByb3BlcnR5UmVjb3JkLiBUaGUgY2FsbGVlIGNhbiBkZWNpZGUgd2hhdCBuZWVkcyB0byBiZSBkb25lIHdpdGggdGhpcyByZWNvcmQuIEl0IHdvdWxkIHJldHVybiB0aGUgUHJvcGVydHlEZWNvcmF0b3IgdGhhdCBuZWVkcwotCQkgKiB0byBoYXZlIHRoZSByZWNvcmQgYXBwbGllZCB0by4gSWYgaXQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSByZWNvcmQgd2lsbCBiZSBpZ25vcmVkLgotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gUHJvcGVydHlEZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBwcm9jZXNzKFByb3BlcnR5UmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIEluZGV4ZWRQcm9wZXJ0eVJlY29yZC4gVGhlIGNhbGxlZSBjYW4gZGVjaWRlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgcmVjb3JkLiBJdCB3b3VsZCByZXR1cm4gdGhlCi0JCSAqIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciB0aGF0IG5lZWRzIHRvIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gUHJvcGVydHlEZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHN0cmFpZ2h0Ci0JCSAqICAgICAgICAgUHJvcGVydHlEZWNvcmF0b3IgY2FuIGJlIHJldHVybmVkIGluc3RlYWQgKGluIHRoZSBjYXNlIHRoYXQgaXQgd2FzIGV4cGxpY3RseSBzZXQgYnkgb3ZlcnJpZGVzIGFzIGEgcHJvcGVydHkgYnV0IGJlYW5pbmZvIHRoaW5rcyBpdAotCQkgKiAgICAgICAgIGlzIGFuIGluZGV4LiBUaGlzIGNhbiBiZSBoYW5kbGVkIGJ5IGl0IHdpbGwgb25seSBzZXQgdGhlIFByb3BlcnR5UmVjb3JkIHBhcnQuIEl0IG5vcm1hbGx5IHNob3VsZCBiZSBhbiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IKLQkJICogICAgICAgICByZXR1cm5lZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFByb3BlcnR5RGVjb3JhdG9yIHByb2Nlc3MoSW5kZXhlZFByb3BlcnR5UmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIE1ldGhvZFJlY29yZC4gVGhlIGNhbGxlZSBjYW4gZGVjaWRlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgcmVjb3JkLiBJdCB3b3VsZCByZXR1cm4gdGhlIE1ldGhvZERlY29yYXRvciB0aGF0IG5lZWRzIHRvCi0JCSAqIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gTWV0aG9kRGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlY29yZCBpcyB0byBiZSBpZ25vcmVkLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCi0JCXB1YmxpYyBNZXRob2REZWNvcmF0b3IgcHJvY2VzcyhNZXRob2RSZWNvcmQgcmVjb3JkKTsKLQotCQkvKioKLQkJICogUHJvY2VzcyB0aGUgRXZlbnRSZWNvcmQuIFRoZSBjYWxsZWUgY2FuIGRlY2lkZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2l0aCB0aGlzIHJlY29yZC4gSXQgd291bGQgcmV0dXJuIHRoZSBFdmVudFNldERlY29yYXRvciB0aGF0IG5lZWRzIHRvCi0JCSAqIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gRXZlbnRTZXREZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0KLQkJcHVibGljIEV2ZW50U2V0RGVjb3JhdG9yIHByb2Nlc3MoRXZlbnRTZXRSZWNvcmQgcmVjb3JkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eUludHJvc3BlY3RDYWxsQmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0KLQkJcHJpdmF0ZSBJbnRyb3NwZWN0Q2FsbEJhY2sgaW50cm9zcGVjdENhbGxiYWNrOwotCi0JCXB1YmxpYyBQcm94eUludHJvc3BlY3RDYWxsQmFjayhJbnRyb3NwZWN0Q2FsbEJhY2sgaW50cm9zcGVjdENhbGxiYWNrKSB7Ci0JCQl0aGlzLmludHJvc3BlY3RDYWxsYmFjayA9IGludHJvc3BlY3RDYWxsYmFjazsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgSUJlYW5Qcm94eSBwYXJtKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHVzZWQuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrKGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdCBwYXJtKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHVzZWQuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrKGludCwgamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpIHsKLQkJCXJldHVybiBudWxsOyAvLyBOb3QgdXNlZC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBqYXZhLmlvLklucHV0U3RyZWFtKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGlzKSB7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbSBvaXM7Ci0JCQl0cnkgewotCQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpcyk7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaW50IGNtZElkID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJc3dpdGNoIChjbWRJZCkgewotCQkJCQkJY2FzZSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkJFQU5fREVDT1JBVE9SX1NFTlQ6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJQmVhblJlY29yZCBiciA9IChCZWFuUmVjb3JkKSBvaXMucmVhZE9iamVjdCgpOwotCQkJCQkJCQlCZWFuRGVjb3JhdG9yIGJkID0gaW50cm9zcGVjdENhbGxiYWNrLnByb2Nlc3MoYnIpOwotCQkJCQkJCQlpZiAoYmQgIT0gbnVsbCkgewotCQkJCQkJCQkJY2xlYXIoYmQpOwotCQkJCQkJCQkJYXBwbHlSZWNvcmQoYmQsIGJyKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5QUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQ6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW50IHByb3BDb3VudCA9IG9pcy5yZWFkSW50KCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCVByb3BlcnR5UmVjb3JkIHByID0gKFByb3BlcnR5UmVjb3JkKSBvaXMucmVhZE9iamVjdCgpOwotCQkJCQkJCQkJaWYgKHByLmdldENsYXNzKCkgPT0gSW5kZXhlZFByb3BlcnR5UmVjb3JkLmNsYXNzKSB7Ci0JCQkJCQkJCQkJSW5kZXhlZFByb3BlcnR5UmVjb3JkIGlwciA9IChJbmRleGVkUHJvcGVydHlSZWNvcmQpIHByOwotCQkJCQkJCQkJCVByb3BlcnR5RGVjb3JhdG9yIGlwID0gaW50cm9zcGVjdENhbGxiYWNrLnByb2Nlc3MoaXByKTsKLQkJCQkJCQkJCQlpZiAoaXAgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkvLyBJdCBhY3R1YWxseSBjb3VsZCBiZSBlaXRoZXIgYSBwcm9wZXJ0eSBkZWNvcmF0b3Igb3IgYW4gaW5kZXhlZCBwcm9wZXJ0eSBkZWNvcmF0b3IuIFRoaXMgY291bGQgaGFwcGVuCi0JCQkJCQkJCQkJCS8vIGJlY2F1c2UgdGhlIG92ZXJyaWRlcyBmaWxlIGhhcyBleHBsaWNpdGx5IGRlY2xhcmVkIGEgUHJvcGVydHlEZWNvcmF0b3IsIHNvIHdlIGNhbid0IGNoYW5nZSBpdCB0byBhbgotCQkJCQkJCQkJCQkvLyBJbmRleGVkLgotCQkJCQkJCQkJCQkvLyBTbyBpbiB0aGF0IGNhc2Ugd2UgY2FuIG9ubHkgZmlsbCB0aGUgcHJvcGVydHkgcGFydC4KLQkJCQkJCQkJCQkJaWYgKGlwLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUikKLQkJCQkJCQkJCQkJCWFwcGx5UmVjb3JkKChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIGlwLCBpcHIpOwotCQkJCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJCQlhcHBseVJlY29yZChpcCwgcHIpOyAvLyBJdCB3YXMgZm9yY2VkIHRvIGJlIGEgcHJvcGVydHkgYW5kIG5vdCBpbmRleGVkLgotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJUHJvcGVydHlEZWNvcmF0b3IgcCA9IGludHJvc3BlY3RDYWxsYmFjay5wcm9jZXNzKHByKTsKLQkJCQkJCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCS8vIEl0IGFjdHVhbGx5IGNvdWxkIGJlIGVpdGhlciBhIHByb3BlcnR5IGRlY29yYXRvciBvciBhbiBpbmRleGVkIHByb3BlcnR5IGRlY29yYXRvci4gVGhpcyBjb3VsZCBoYXBwZW4KLQkJCQkJCQkJCQkJLy8gYmVjYXVzZSB0aGUgb3ZlcnJpZGVzIGZpbGUgaGFzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYW4gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLCBzbyB3ZSBjYW4ndCBjaGFuZ2UgaXQKLQkJCQkJCQkJCQkJLy8gdG8gYW4KLQkJCQkJCQkJCQkJLy8gUHJvcGVydHkuCi0JCQkJCQkJCQkJCS8vIFNvIGluIHRoYXQgY2FzZSB3ZSBjYW4gb25seSBmaWxsIHRoZSBwcm9wZXJ0eSBwYXJ0LgotCQkJCQkJCQkJCQlhcHBseVJlY29yZChwLCBwcik7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCWNhc2UgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5NRVRIT0RfREVDT1JBVE9SU19TRU5UOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWludCBvcENvdW50ID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCU1ldGhvZFJlY29yZCBtciA9IChNZXRob2RSZWNvcmQpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbSA9IGludHJvc3BlY3RDYWxsYmFjay5wcm9jZXNzKG1yKTsKLQkJCQkJCQkJCWlmIChtICE9IG51bGwpCi0JCQkJCQkJCQkJYXBwbHlSZWNvcmQobSwgbXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRVZFTlRfREVDT1JBVE9SU19TRU5UOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWludCBvcENvdW50ID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCUV2ZW50U2V0UmVjb3JkIGV2ciA9IChFdmVudFNldFJlY29yZCkgb2lzLnJlYWRPYmplY3QoKTsKLQkJCQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGUgPSBpbnRyb3NwZWN0Q2FsbGJhY2sucHJvY2VzcyhldnIpOwotCQkJCQkJCQkJaWYgKGUgIT0gbnVsbCkKLQkJCQkJCQkJCQlhcHBseVJlY29yZChlLCBldnIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9ORToKLQkJCQkJCQlyZXR1cm47CS8vIEdvb2QuIFRoaXMgaXMgYSBnb29kIHN0b3AuCi0JCQkJCQkJCi0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCXJldHVybjsJLy8gVGhpcyBpcyBpbnZhbGlkLiBTaG91bGQgb2YgZ290dG9uIHNvbWV0aGluZy4KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgZmVhdHVyZSByZWNvcmQgdG8gdGhlIGZlYXR1cmUgZGVjb3JhdG9yLiBUaGlzIGlzIHByb3RlY3RlZCBiZWNhdXNlIHRoaXMgaXMgYW4gYWJzdHJhY3QgYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgaXRzZWxmLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIEBwYXJhbSByZWNvcmQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXBwbHlSZWNvcmQoRmVhdHVyZURlY29yYXRvciBkZWNvciwgRmVhdHVyZVJlY29yZCByZWNvcmQpIHsKLQkJLy8gU3ViY2xhc3NlcyB3aWxsIGNsZWFyIHRoZWlyIGRlY29yLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYXIgdGhlIEZlYXR1cmVEZWNvciBwYXJ0IGZvciB1cy4KLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKHJlY29yZC5kaXNwbGF5TmFtZSAhPSBudWxsICYmICFkZWNvci5pc1NldERpc3BsYXlOYW1lKCkpIHsKLQkJCWRlY29yLnNldERpc3BsYXlOYW1lKHJlY29yZC5kaXNwbGF5TmFtZSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRElTUExBWU5BTUVfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5zaG9ydERlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlY29yLmlzU2V0U2hvcnREZXNjcmlwdGlvbigpKSB7Ci0JCQlkZWNvci5zZXRTaG9ydERlc2NyaXB0aW9uKHJlY29yZC5zaG9ydERlc2NyaXB0aW9uKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9TSE9SVERFU0NfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5jYXRlZ29yeSAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCkpKSB7Ci0JCQlkZWNvci5zZXRDYXRlZ29yeShyZWNvcmQuY2F0ZWdvcnkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRFeHBlcnQoKSkgewotCQkJaWYgKGRlY29yLmlzRXhwZXJ0KCkgIT0gcmVjb3JkLmV4cGVydCkKLQkJCQlkZWNvci5zZXRFeHBlcnQocmVjb3JkLmV4cGVydCk7IC8vIERvbid0IHdhbnQgdG8gZXhwbGljaXRseSBzZXQgaXQgaWYgaXQgaXMgZXF1YWwgdG8gZGVmYXVsdCAodGhpcyB3aWxsIHB1dCBsZXNzIG91dCB0byB0aGUgY2FjaGUgZmlsZQotCQkJCQkJCQkJCQkJLy8gYW5kIHNvIHdpbGwgcGFyc2UgYW5kIGFwcGx5IGZhc3RlcikuCi0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRVhQRVJUX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRIaWRkZW4oKSkgewotCQkJaWYgKGRlY29yLmlzSGlkZGVuKCkgIT0gcmVjb3JkLmhpZGRlbikKLQkJCQlkZWNvci5zZXRIaWRkZW4ocmVjb3JkLmhpZGRlbik7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfSElEREVOX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRQcmVmZXJyZWQoKSkgewotCQkJaWYgKGRlY29yLmlzUHJlZmVycmVkKCkgIT0gcmVjb3JkLnByZWZlcnJlZCkKLQkJCQlkZWNvci5zZXRQcmVmZXJyZWQocmVjb3JkLnByZWZlcnJlZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuYXR0cmlidXRlTmFtZXMgIT0gbnVsbCAmJiAhZGVjb3IuaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpKSB7Ci0JCQkvLyBUaGlzIGlzIGEgbGlzdCwgc28gd2UgbmVlZCB0byByZWFkIGFuIGZpbGwgaW4uCi0JCQlFTWFwIGF0dHJzID0gZGVjb3IuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmQuYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsIGVudHJ5ID0gKEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwpICgoQmVhbmluZm9GYWN0b3J5SW1wbCkgQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRSkKLQkJCQkJCS5jcmVhdGVGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKTsKLQkJCQllbnRyeS5zZXRUeXBlZEtleShyZWNvcmQuYXR0cmlidXRlTmFtZXNbaV0pOwotCQkJCUZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBmdiA9IHJlY29yZC5hdHRyaWJ1dGVWYWx1ZXNbaV07Ci0JCQkJZnYuc2V0SW1wbGljaXRWYWx1ZSh0cnVlKTsKLQkJCQllbnRyeS5zZXRUeXBlZFZhbHVlKGZ2KTsKLQkJCQlhdHRycy5hZGQoZW50cnkpOwotCQkJfQotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0FUVFJJQlVURVNfSU1QTElDSVQ7Ci0JCX0KLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCS8qKgotCSAqIEFwcGx5IHRoZSBiZWFuIHJlY29yZCB0byB0aGUgYmVhbiBkZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIHJlY29yZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVJlY29yZChCZWFuRGVjb3JhdG9yIGRlY29yLCBCZWFuUmVjb3JkIHJlY29yZCkgewotCQlhcHBseVJlY29yZCgoRmVhdHVyZURlY29yYXRvcikgZGVjb3IsIHJlY29yZCk7Ci0KLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKHJlY29yZC5jdXN0b21pemVyQ2xhc3NOYW1lICE9IG51bGwgJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCkpKSB7Ci0JCQlkZWNvci5zZXRDdXN0b21pemVyQ2xhc3MoY3JlYXRlSmF2YUNsYXNzUHJveHkocmVjb3JkLmN1c3RvbWl6ZXJDbGFzc05hbWUpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gQmVhbkRlY29yYXRvckltcGwuQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlpZiAoZGVjb3IuaXNNZXJnZVN1cGVyUHJvcGVydGllcygpICE9IHJlY29yZC5tZXJnZUluaGVyaXRlZFByb3BlcnRpZXMpCi0JCQkJZGVjb3Iuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMocmVjb3JkLm1lcmdlSW5oZXJpdGVkUHJvcGVydGllcyk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEJlYW5EZWNvcmF0b3JJbXBsLkJFQU5fTUVSR0VfSU5IRVJJVEVEX1BST1BFUlRJRVNfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFkZWNvci5pc1NldE1lcmdlU3VwZXJNZXRob2RzKCkpIHsKLQkJCWlmIChkZWNvci5pc01lcmdlU3VwZXJNZXRob2RzKCkgIT0gcmVjb3JkLm1lcmdlSW5oZXJpdGVkT3BlcmF0aW9ucykKLQkJCQlkZWNvci5zZXRNZXJnZVN1cGVyTWV0aG9kcyhyZWNvcmQubWVyZ2VJbmhlcml0ZWRPcGVyYXRpb25zKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfT1BFUkFUSU9OU19JTVBMSUNJVDsKLQkJfQotCQlpZiAoIWRlY29yLmlzU2V0TWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlpZiAoZGVjb3IuaXNNZXJnZVN1cGVyRXZlbnRzKCkgIT0gcmVjb3JkLm1lcmdlSW5oZXJpdGVkRXZlbnRzKQotCQkJCWRlY29yLnNldE1lcmdlU3VwZXJFdmVudHMocmVjb3JkLm1lcmdlSW5oZXJpdGVkRXZlbnRzKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQubm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIGFsd2F5cyBhcHBsaWVkLiBUaGlzIGlzbid0IGEgY2xpZW50IG92ZXJyaWRlIHNvIHdlIGNhbiBqdXN0IHNsYW0gaXQuCi0JCQlkZWNvci5nZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVjb3JkLm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMpKTsKLQkJfQotCQlpZiAocmVjb3JkLm5vdEluaGVyaXRlZE9wZXJhdGlvbk5hbWVzICE9IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgYWx3YXlzIGFwcGxpZWQuIFRoaXMgaXNuJ3QgYSBjbGllbnQgb3ZlcnJpZGUgc28gd2UgY2FuIGp1c3Qgc2xhbSBpdC4KLQkJCWRlY29yLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVjb3JkLm5vdEluaGVyaXRlZE9wZXJhdGlvbk5hbWVzKSk7Ci0JCX0KLQkJaWYgKHJlY29yZC5ub3RJbmhlcml0ZWRFdmVudE5hbWVzICE9IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgYWx3YXlzIGFwcGxpZWQuIFRoaXMgaXNuJ3QgYSBjbGllbnQgb3ZlcnJpZGUgc28gd2UgY2FuIGp1c3Qgc2xhbSBpdC4KLQkJCWRlY29yLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZWNvcmQubm90SW5oZXJpdGVkRXZlbnROYW1lcykpOwotCQl9Ci0KLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgUHJvcGVydHlSZWNvcmQgdG8gdGhlIFByb3BlcnR5RGVjb3JhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIEBwYXJhbSByZWNvcmQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlSZWNvcmQoUHJvcGVydHlEZWNvcmF0b3IgZGVjb3IsIFByb3BlcnR5UmVjb3JkIHJlY29yZCkgewotCQlhcHBseVJlY29yZCgoRmVhdHVyZURlY29yYXRvcikgZGVjb3IsIHJlY29yZCk7Ci0KLQkJYXBwbHlPbmx5KGRlY29yLCByZWNvcmQpOwotCX0KLQotCS8qCi0JICogQXBwbHkgb25seSB0byBwcm9wZXJ0eSBkZWNvcmF0b3IgcGFydC4gQWxsb3dzIEluZGV4ZWRQcm9wZXJ0eSB0byBhcHBseSBqdXN0IHRoZSBQcm9wZXJ0eSBwYXJ0IGFuZCBub3QgZG8gZHVwbGljYXRlIHdvcmsKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5T25seShQcm9wZXJ0eURlY29yYXRvciBkZWNvciwgUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChyZWNvcmQucHJvcGVydHlFZGl0b3JDbGFzc05hbWUgIT0gbnVsbCAmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpKSkgewotCQkJZGVjb3Iuc2V0UHJvcGVydHlFZGl0b3JDbGFzcyhjcmVhdGVKYXZhQ2xhc3NQcm94eShyZWNvcmQucHJvcGVydHlFZGl0b3JDbGFzc05hbWUpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0VESVRPUl9DTEFTU19JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVjb3JkLnJlYWRNZXRob2QgIT0gbnVsbCAmJiAhZGVjb3IuaXNTZXRSZWFkTWV0aG9kKCkpIHsKLQkJCWRlY29yLnNldFJlYWRNZXRob2QoY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5yZWFkTWV0aG9kKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9SRUFETUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQud3JpdGVNZXRob2QgIT0gbnVsbCAmJiAhZGVjb3IuaXNTZXRXcml0ZU1ldGhvZCgpKSB7Ci0JCQlkZWNvci5zZXRXcml0ZU1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLndyaXRlTWV0aG9kKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9XUklURU1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVjb3JkLmZpZWxkICE9IG51bGwgJiYgIWRlY29yLmlzU2V0RmllbGQoKSkgewotCQkJZGVjb3Iuc2V0RmllbGQoY3JlYXRlSmF2YUZpZWxkUHJveHkocmVjb3JkLmZpZWxkKSk7Ci0JCQlpZiAoZGVjb3IuaXNGaWVsZFJlYWRPbmx5KCkgIT0gcmVjb3JkLmZpZWxkLnJlYWRPbmx5KQotCQkJCWRlY29yLnNldEZpZWxkUmVhZE9ubHkocmVjb3JkLmZpZWxkLnJlYWRPbmx5KTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0ZJRUxEX0lNUExJQ0lUOwotCQl9CQkKLQkJaWYgKCFkZWNvci5pc1NldEJvdW5kKCkpIHsKLQkJCWlmIChkZWNvci5pc0JvdW5kKCkgIT0gcmVjb3JkLmJvdW5kKQotCQkJCWRlY29yLnNldEJvdW5kKHJlY29yZC5ib3VuZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9CT1VORF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoIWRlY29yLmlzU2V0Q29uc3RyYWluZWQoKSkgewotCQkJaWYgKGRlY29yLmlzQ29uc3RyYWluZWQoKSAhPSByZWNvcmQuY29uc3RyYWluZWQpCi0JCQkJZGVjb3Iuc2V0Q29uc3RyYWluZWQocmVjb3JkLmNvbnN0cmFpbmVkKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0NPTlNUUkFJTkVEX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuZGVzaWduVGltZSAhPSBudWxsICYmICFkZWNvci5pc1NldERlc2lnblRpbWUoKSkgewotCQkJLy8gRGVzaWduIHRpbWUgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVyIGJvb2xlYW5zIGJlY2F1c2UKLQkJCS8vIGV4cGxpY2l0bHkgc2V0IHRvIHRydWUvZmFsc2UgaXMgaW1wb3J0YW50IHZlcnN1cyBub3QgZXhwbGljaXRseSBzZXQgYXQgYWxsICh3aGljaCBpcyBmYWxzZSkuCi0JCQlkZWNvci5zZXREZXNpZ25UaW1lKHJlY29yZC5kZXNpZ25UaW1lLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0RFU0lHTlRJTUVfSU1QTElDSVQ7Ci0JCX0KLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5UmVjb3JkKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBkZWNvciwgSW5kZXhlZFByb3BlcnR5UmVjb3JkIHJlY29yZCkgewotCQlhcHBseVJlY29yZCgoRmVhdHVyZURlY29yYXRvcikgZGVjb3IsIHJlY29yZCk7Ci0JCWFwcGx5T25seShkZWNvciwgcmVjb3JkKTsKLQotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAocmVjb3JkLmluZGV4ZWRSZWFkTWV0aG9kICE9IG51bGwgJiYgIWRlY29yLmlzU2V0SW5kZXhlZFJlYWRNZXRob2QoKSkgewotCQkJZGVjb3Iuc2V0SW5kZXhlZFJlYWRNZXRob2QoY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5pbmRleGVkUmVhZE1ldGhvZCkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfUkVBRE1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVjb3JkLmluZGV4ZWRXcml0ZU1ldGhvZCAhPSBudWxsICYmICFkZWNvci5pc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpKSB7Ci0JCQlkZWNvci5zZXRJbmRleGVkV3JpdGVNZXRob2QoY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5pbmRleGVkV3JpdGVNZXRob2QpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1dSSVRFTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogQXBwbHkgdGhlIG1ldGhvZCByZWNvcmQgdG8gdGhlIG1ldGhvZCBkZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIHJlY29yZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVJlY29yZChNZXRob2REZWNvcmF0b3IgZGVjb3IsIE1ldGhvZFJlY29yZCByZWNvcmQpIHsKLQkJYXBwbHlSZWNvcmQoKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yLCByZWNvcmQpOwotCi0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChyZWNvcmQucGFyYW1ldGVycyAhPSBudWxsICYmICFkZWNvci5pc1Bhcm1zRXhwbGljaXRFbXB0eSgpCi0JCQkJJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpKSkgewotCQkJLy8gVGhpcyBpcyBhIGxpc3QsIHNvIHdlIG5lZWQgdG8gcmVhZCBhbiBmaWxsIGluLgotCQkJTGlzdCBwYXJtcyA9IGRlY29yLmdldFNlclBhcm1EZXNjKCk7IC8vIFNvIGFzIG5vdCB0byBoYXZlIGl0IGltcGxpY2l0bHkgZmlsbCBpdCBpbiwgd2hpY2ggaXQgd291bGQgaWYgd2UgY2FsbGVkIGdldFBhcmFtZXRlckRlc2NyaXB0b3JzLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmQucGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJCVBhcmFtZXRlckRlY29yYXRvciBwYXJtID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQkJCQlhcHBseVJlY29yZChwYXJtLCByZWNvcmQucGFyYW1ldGVyc1tpXSk7Ci0JCQkJcGFybXMuYWRkKHBhcm0pOwotCQkJfQotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBNZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0lNUExJQ0lUOwotCQkJaW1wbGljaXRTZXR0aW5ncyAmPSB+TWV0aG9kRGVjb3JhdG9ySW1wbC5NRVRIT0RfUEFSQU1FVEVSU19ERUZBVUxUOyAvLyBTaG91bGQgb2YgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIGJ1dCBiZSBzYWZlLgotCQl9Ci0KLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlSZWNvcmQoUGFyYW1ldGVyRGVjb3JhdG9yIGRlY29yLCBQYXJhbWV0ZXJSZWNvcmQgcmVjb3JkKSB7Ci0JCWFwcGx5UmVjb3JkKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvciwgcmVjb3JkKTsKLQotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAocmVjb3JkLm5hbWUgIT0gbnVsbCAmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX05hbWUoKSkpIHsKLQkJCWRlY29yLnNldE5hbWUocmVjb3JkLm5hbWUpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQYXJhbWV0ZXJEZWNvcmF0b3JJbXBsLlBBUkFNRVRFUl9OQU1FX0lNUExJQ0lUOwotCQl9Ci0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogQXBwbHkgdGhlIGV2ZW50IHNldCByZWNvcmQgdG8gdGhlIGV2ZW50IHNldCBkZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIHJlY29yZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVJlY29yZChFdmVudFNldERlY29yYXRvciBkZWNvciwgRXZlbnRTZXRSZWNvcmQgcmVjb3JkKSB7Ci0JCWFwcGx5UmVjb3JkKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvciwgcmVjb3JkKTsKLQotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAocmVjb3JkLmFkZExpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkpKSB7Ci0JCQlkZWNvci5zZXRBZGRMaXN0ZW5lck1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLmFkZExpc3RlbmVyTWV0aG9kKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVjb3JkLmV2ZW50QWRhcHRlckNsYXNzTmFtZSAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9FdmVudEFkYXB0ZXJDbGFzcygpKSkgewotCQkJZGVjb3Iuc2V0RXZlbnRBZGFwdGVyQ2xhc3MoY3JlYXRlSmF2YUNsYXNzUHJveHkocmVjb3JkLmV2ZW50QWRhcHRlckNsYXNzTmFtZSkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQubGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyAhPSBudWxsICYmICFkZWNvci5pc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKQotCQkJCSYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKSkpIHsKLQkJCUxpc3QgbWV0aG9kcyA9IGRlY29yLmdldFNlckxpc3RNdGhkKCk7IC8vIFNvIGFzIG5vdCB0byBoYXZlIGl0IGltcGxpY2l0bHkgZmlsbCBpdCBpbiwgd2hpY2ggaXQgd291bGQgaWYgd2UgY2FsbGVkIGdldExpc3RlbmVyTWV0aG9kcy4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3JkLmxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlCZWFuaW5mb0ZhY3RvcnkgYmZhY3QgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFOwotCQkJCU1ldGhvZFJlY29yZCBtciA9IHJlY29yZC5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzW2ldOwotCQkJCU1ldGhvZCBtZXRob2QgPSBjcmVhdGVKYXZhTWV0aG9kUHJveHkobXIubWV0aG9kRm9yRGVzY3JpcHRvcik7Ci0JCQkJLy8gV2UgbmVlZCBhIG1ldGhvZCBwcm94eSwgYW5kIGEgbWV0aG9kIGRlY29yYXRvci4KLQkJCQlNZXRob2RQcm94eSBtcHJveHkgPSBiZmFjdC5jcmVhdGVNZXRob2RQcm94eSgpOwotCQkJCW1wcm94eS5zZXRNZXRob2QobWV0aG9kKTsKLQkJCQltcHJveHkuc2V0TmFtZShtci5uYW1lKTsKLQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBiZmFjdC5jcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQkJCQlhcHBseVJlY29yZChtZCwgbXIpOwotCQkJCW1wcm94eS5nZXRFQW5ub3RhdGlvbnMoKS5hZGQobWQpOwotCQkJCW1ldGhvZHMuYWRkKG1wcm94eSk7Ci0JCQl9Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUk1FVEhPRFNfSU1QTElDSVQ7Ci0JCQlpbXBsaWNpdFNldHRpbmdzICY9IH5FdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfTElTVEVORVJNRVRIT0RTX0RFRkFVTFQ7IC8vIFNob3VsZCBvZiBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgYnV0IGJlIHNhZmUuCi0JCX0KLQkJaWYgKHJlY29yZC5saXN0ZW5lclR5cGVOYW1lICE9IG51bGwgJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpKSkgewotCQkJZGVjb3Iuc2V0TGlzdGVuZXJUeXBlKGNyZWF0ZUphdmFDbGFzc1Byb3h5KHJlY29yZC5saXN0ZW5lclR5cGVOYW1lKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUlRZUEVfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5yZW1vdmVMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpKSkgewotCQkJZGVjb3Iuc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5yZW1vdmVMaXN0ZW5lck1ldGhvZCkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFkZWNvci5pc1NldEluRGVmYXVsdEV2ZW50U2V0KCkpIHsKLQkJCWlmIChyZWNvcmQuaW5EZWZhdWx0RXZlbnRTZXQgIT0gZGVjb3IuaXNJbkRlZmF1bHRFdmVudFNldCgpKQotCQkJCWRlY29yLnNldEluRGVmYXVsdEV2ZW50U2V0KHJlY29yZC5pbkRlZmF1bHRFdmVudFNldCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9ERUZBVUxURVZFTlRTRVRfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFkZWNvci5pc1NldFVuaWNhc3QoKSkgewotCQkJaWYgKHJlY29yZC51bmljYXN0ICE9IGRlY29yLmlzVW5pY2FzdCgpKQotCQkJCWRlY29yLnNldFVuaWNhc3QocmVjb3JkLnVuaWNhc3QpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfVU5JQ0FTVF9JTVBMSUNJVDsKLQkJfQotCi0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgamF2YSBjbGFzcyBwcm94eSBmb3IgdGhlIGdpdmVuIG5hbWUuIEJ5IGJlaW5nIGEgcHJveHkgd2UgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBoYXZlIHRoZSByZXNvdXJjZSBzZXQuIE5vciBkbyB3ZSBuZWVkIHRvIGZsdWZmIG9uZSB1cAotCSAqIHVudGlsIHNvbWVvbmUgYWN0dWFsbHkgYXNrcyBmb3IgaXQuCi0JICogPHA+Ci0JICogVGhlIGpuaU5hbWUgbXVzdCByZWZlciB0byBhIEphdmFDbGFzcyBvciBlcnJvcnMgY291bGQgb2NjdXIgbGF0ZXIgb24uCi0JICogCi0JICogQHBhcmFtIGpuaU5hbWUKLQkgKiAgICAgICAgICAgIGNsYXNzbmFtZSBpbiBKTkkgZm9ybWF0LgotCSAqIEByZXR1cm4gSmF2YUNsYXNzIHByb3h5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIGphdmEgY2xhc3MgKGl0IG1heSBiZSBhIHR5cGUpLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzc1Byb3h5KFN0cmluZyBqbmlOYW1lKSB7Ci0JCUphdmFIZWxwZXJzIGpoID0gY3JlYXRlSmF2YVR5cGVQcm94eShqbmlOYW1lKTsKLQkJcmV0dXJuIGpoIGluc3RhbmNlb2YgSmF2YUNsYXNzID8gKEphdmFDbGFzcykgamggOiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIEphdmFIZWxwZXJzIHByb3h5IGZvciB0aGUgZ2l2ZW4gbmFtZS4gQnkgYmVpbmcgYSBwcm94eSB3ZSBkb24ndCBuZWVkIHRvIGFjdHVhbGx5IGhhdmUgdGhlIHJlc291cmNlIHNldC4gTm9yIGRvIHdlIG5lZWQgdG8gZmx1ZmYgb25lIHVwCi0JICogdW50aWwgc29tZW9uZSBhY3R1YWxseSBhc2tzIGZvciBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gam5pTmFtZQotCSAqICAgICAgICAgICAgdHlwZW5hbWUgaW4gSk5JIGZvcm1hdC4KLQkgKiBAcmV0dXJuIEphdmFIZWxwZXIgcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBjcmVhdGVKYXZhVHlwZVByb3h5KFN0cmluZyBqbmlOYW1lKSB7Ci0JCVN0cmluZyBmb3JtYWxOYW1lID0gTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUoam5pTmFtZSk7Ci0KLQkJVVJJIHVyaSA9IFV0aWxpdGllcy5nZXRKYXZhQ2xhc3NVUkkoZm9ybWFsTmFtZSk7Ci0JCUphdmFIZWxwZXJzIGpoID0gbnVsbDsKLQkJaWYgKE1hcEpOSVR5cGVzLmlzRm9ybWFsVHlwZVByaW1pdGl2ZShmb3JtYWxOYW1lKSkKLQkJCWpoID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFEYXRhVHlwZSgpOwotCQllbHNlCi0JCQlqaCA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3MoKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIGpoKS5lU2V0UHJveHlVUkkodXJpKTsKLQkJcmV0dXJuIGpoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2RQcm94eShSZWZsZWN0TWV0aG9kUmVjb3JkIG1ldGhvZCkgewotCQlTdHJpbmdbXSBwYXJtVHlwZXMgPSBtZXRob2QucGFyYW1ldGVyVHlwZU5hbWVzICE9IG51bGwgPyBuZXcgU3RyaW5nW21ldGhvZC5wYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoXSA6IG51bGw7Ci0JCWlmIChwYXJtVHlwZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kLnBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1UeXBlc1tpXSA9IE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKG1ldGhvZC5wYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOwotCQkJfQotCQlVUkkgdXJpID0gVXRpbGl0aWVzLmdldE1ldGhvZFVSSShNYXBKTklUeXBlcy5nZXRGb3JtYWxUeXBlTmFtZShtZXRob2QuY2xhc3NOYW1lKSwgbWV0aG9kLm1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCU1ldGhvZCBtZXRob2RFTUYgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kKCk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KSBtZXRob2RFTUYpLmVTZXRQcm94eVVSSSh1cmkpOwotCQlyZXR1cm4gbWV0aG9kRU1GOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZFByb3h5KFJlZmxlY3RGaWVsZFJlY29yZCBmaWVsZCkgewotCQlVUkkgdXJpID0gVXRpbGl0aWVzLmdldEZpZWxkVVJJKE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKGZpZWxkLmNsYXNzTmFtZSksIGZpZWxkLmZpZWxkTmFtZSk7Ci0JCUZpZWxkIGZpZWxkRU1GID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpZWxkKCk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KSBmaWVsZEVNRikuZVNldFByb3h5VVJJKHVyaSk7Ci0JCXJldHVybiBmaWVsZEVNRjsKLQl9CQotCi0JLyoqCi0JICogU2V0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBQcm9wZXJ0eURlY29yYXRvci4gVGhlc2UgY29tZSBmcm9tIHJlZmxlY3Rpb24uIFNpbmNlIHRoaXMgaXMgYSBwcml2YXRlIGludGVyZmFjZSBiZXR3ZWVuIEJlYW5pbmZvQ2xhc3NBZGFwdGVyIGFuZAotCSAqIHRoaXMgY2xhc3MsIG5vdCBhbGwgcG9zc2libGUgc2V0dGluZ3MgbmVlZCB0byBiZSBtZW50aW9uZWQuIE9ubHkgdGhlIG9uZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHJlZmxlY3Rpb24uIEl0IGlzIGFzc3VtZWQgdGhhdCBjbGVhciBoYXMgYWxyZWFkeQotCSAqIGJlZW4gZG9uZSBzbyB0aGF0IHRoZXJlIGFyZSBubyBvbGQgaW1wbGljaXQgc2V0dGluZ3MuIEl0IHdpbGwgY2hlY2sgaWYgcHJvcGVydGllcyBhcmUgc2V0IGFscmVhZHkgYmVmb3JlIHNldHRpbmcgc28gdGhhdCBkb24ndCB3aXBlIG91dAotCSAqIGV4cGxpY2l0IHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHBhcmFtIGJvdW5kCi0JICogQHBhcmFtIGNvbnN0cmFpbmVkCi0JICogQHBhcmFtIGdldHRlcgotCSAqIEBwYXJhbSBzZXR0ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0eURlY29yYXRvciBwcm9wLCBib29sZWFuIGJvdW5kLCBib29sZWFuIGNvbnN0cmFpbmVkLCBNZXRob2QgZ2V0dGVyLCBNZXRob2Qgc2V0dGVyKSB7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IHByb3AuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKGdldHRlciAhPSBudWxsICYmICFwcm9wLmlzU2V0UmVhZE1ldGhvZCgpKSB7Ci0JCQlwcm9wLnNldFJlYWRNZXRob2QoZ2V0dGVyKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1JFQURNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHNldHRlciAhPSBudWxsICYmICFwcm9wLmlzU2V0V3JpdGVNZXRob2QoKSkgewotCQkJcHJvcC5zZXRXcml0ZU1ldGhvZChzZXR0ZXIpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFwcm9wLmlzU2V0Qm91bmQoKSkgewotCQkJaWYgKHByb3AuaXNCb3VuZCgpICE9IGJvdW5kKQotCQkJCXByb3Auc2V0Qm91bmQoYm91bmQpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFwcm9wLmlzU2V0Q29uc3RyYWluZWQoKSkgewotCQkJaWYgKHByb3AuaXNDb25zdHJhaW5lZCgpICE9IGNvbnN0cmFpbmVkKQotCQkJCXByb3Auc2V0Q29uc3RyYWluZWQoY29uc3RyYWluZWQpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQ09OU1RSQUlORURfSU1QTElDSVQ7Ci0JCX0KLQkJcHJvcC5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLiBUaGVzZSBjb21lIGZyb20gcmVmbGVjdGlvbi4gSXQgaXMgb25seSB0aGUgaW5kZXhlZCBwb3J0aW9uLiBUaGUgYmFzZSBwcm9wZXJ0eSBwb3J0aW9uCi0JICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldC4gU2luY2UgdGhpcyBpcyBhIHByaXZhdGUgaW50ZXJmYWNlIGJldHdlZW4gQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kIHRoaXMgY2xhc3MsIG5vdCBhbGwgcG9zc2libGUgc2V0dGluZ3MgbmVlZCB0bwotCSAqIGJlIG1lbnRpb25lZC4gT25seSB0aGUgb25lcyB0aGF0IGNhbiBiZSBzZXQgYnkgcmVmbGVjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IGNsZWFyIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBzbyB0aGF0IHRoZXJlIGFyZSBubyBvbGQgaW1wbGljaXQKLQkgKiBzZXR0aW5ncy4gSXQgd2lsbCBjaGVjayBpZiBwcm9wZXJ0aWVzIGFyZSBzZXQgYWxyZWFkeSBiZWZvcmUgc2V0dGluZyBzbyB0aGF0IGRvbid0IHdpcGUgb3V0IGV4cGxpY2l0IHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHBhcmFtIGluZGV4ZWRHZXR0ZXIKLQkgKiBAcGFyYW0gaW5kZXhlZFNldHRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0aWVzKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBwcm9wLCBNZXRob2QgaW5kZXhlZEdldHRlciwgTWV0aG9kIGluZGV4ZWRTZXR0ZXIpIHsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gcHJvcC5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAoaW5kZXhlZEdldHRlciAhPSBudWxsICYmICFwcm9wLmlzU2V0SW5kZXhlZFJlYWRNZXRob2QoKSkgewotCQkJcHJvcC5zZXRJbmRleGVkUmVhZE1ldGhvZChpbmRleGVkR2V0dGVyKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1JFQURNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKGluZGV4ZWRTZXR0ZXIgIT0gbnVsbCAmJiAhcHJvcC5pc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpKSB7Ci0JCQlwcm9wLnNldEluZGV4ZWRXcml0ZU1ldGhvZChpbmRleGVkU2V0dGVyKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1dSSVRFTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCXByb3Auc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHByb3BlcnRpZXMgb24gdGhlIEV2ZW50U2V0RGVjb3JhdG9yLiBUaGVzZSBjb21lIGZyb20gcmVmbGVjdGlvbi4gU2luY2UgdGhpcyBpcyBhIHByaXZhdGUgaW50ZXJmYWNlIGJldHdlZW4gQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kCi0JICogdGhpcyBjbGFzcywgbm90IGFsbCBwb3NzaWJsZSBzZXR0aW5ncyBuZWVkIHRvIGJlIG1lbnRpb25lZC4gT25seSB0aGUgb25lcyB0aGF0IGNhbiBiZSBzZXQgYnkgcmVmbGVjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IGNsZWFyIGhhcyBhbHJlYWR5Ci0JICogYmVlbiBkb25lIHNvIHRoYXQgdGhlcmUgYXJlIG5vIG9sZCBpbXBsaWNpdCBzZXR0aW5ncy4gSXQgd2lsbCBjaGVjayBpZiBwcm9wZXJ0aWVzIGFyZSBzZXQgYWxyZWFkeSBiZWZvcmUgc2V0dGluZyBzbyB0aGF0IGRvbid0IHdpcGUgb3V0Ci0JICogZXhwbGljaXQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogQHBhcmFtIGJvdW5kCi0JICogQHBhcmFtIGNvbnN0cmFpbmVkCi0JICogQHBhcmFtIGdldHRlcgotCSAqIEBwYXJhbSBzZXR0ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhFdmVudFNldERlY29yYXRvciBldmVudCwgTWV0aG9kIGFkZExpc3RlbmVyTWV0aG9kLCBNZXRob2QgcmVtb3ZlTGlzdGVuZXJNZXRob2QsIGJvb2xlYW4gdW5pY2FzdCwKLQkJCUphdmFDbGFzcyBsaXN0ZW5lclR5cGUpIHsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZXZlbnQuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKGFkZExpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgIWV2ZW50LmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkpKSB7Ci0JCQlldmVudC5zZXRBZGRMaXN0ZW5lck1ldGhvZChhZGRMaXN0ZW5lck1ldGhvZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVtb3ZlTGlzdGVuZXJNZXRob2QgIT0gbnVsbCAmJiAhZXZlbnQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKSkpIHsKLQkJCWV2ZW50LnNldFJlbW92ZUxpc3RlbmVyTWV0aG9kKHJlbW92ZUxpc3RlbmVyTWV0aG9kKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX1JFTU9WRUxJU1RFTkVSTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZXZlbnQuaXNTZXRVbmljYXN0KCkpIHsKLQkJCWlmIChldmVudC5pc1VuaWNhc3QoKSAhPSB1bmljYXN0KQotCQkJCWV2ZW50LnNldFVuaWNhc3QodW5pY2FzdCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9CT1VORF9JTVBMSUNJVDsKLQkJfQotCQlpZiAobGlzdGVuZXJUeXBlICE9IG51bGwgJiYgIWV2ZW50LmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpKSkgewotCQkJZXZlbnQuc2V0TGlzdGVuZXJUeXBlKGxpc3RlbmVyVHlwZSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUlRZUEVfSU1QTElDSVQ7Ci0JCX0KLQotCQlldmVudC5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2UgcmVjb3JkIGZvciB0aGUgYmVhbiBkZWNvcmF0b3IuIEVpdGhlciBpdCBpcyBhbiBhZGQgb2YgYSBuZXcgYmVhbiBkZWNvcmF0b3Igb3IgaXQgaXMgdGhlIHNldHRpbmcgb2YgdGhlIGltcGxpY2l0Ci0JICogc2V0dGluZ3Mgb24gYW4gbm9uLWltcGxpY2l0IGJlYW4gZGVjb3JhdG9yLgotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBiZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgQmVhbkRlY29yYXRvciBiZCkgewotCQkvLyBPbmx5IGRvIGFueXRoaW5nIGlmIG1lcmdlIGludHJvc3BlY3Rpb24uIElmIG5vIG1lcmdlIGludHJvc3BlY3Rpb24sIHRoZW4gdGhlcmUgaXMgbm8gY2hhbmdlIG5lZWRlZC4KLQkJaWYgKGJkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpIHsKLQkJCWlmIChiZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSAhPSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkvLyBJdCBpcyBpbXBsaWNpdCwgc28gZG8gYW4gYWRkIHRvIGVuZCwgbmV3IHZhbHVlLgotCQkJCWRvQWRkVG9FbmQoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBiZC5nZXRFTW9kZWxFbGVtZW50KCkpLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksIGJkLCB0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSnVzdCBkbyBzZXRzIG9uIGltcGxpY2l0IGNoYW5nZWQgb25lcwotCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBiZCksIGJkKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSByZWNvcmQgZm9yIHRoZSBwcm9wZXJ0eSBkZWNvcmF0b3IuIEVpdGhlciBpdCBpcyBhbiBhZGQgb2YgYSBuZXcgcHJvcGVydHkgZGVjb3JhdG9yIG9yIGl0IGlzIHRoZSBzZXR0aW5nIG9mIHRoZSBpbXBsaWNpdAotCSAqIHNldHRpbmdzIG9uIGFuIG5vbi1pbXBsaWNpdCBwcm9wZXJ0eSBkZWNvcmF0b3IuIFRoZSBzYW1lIGlzIHRydWUgb2YgdGhlIGZlYXR1cmUgdGhhdCBpdCBkZWNvcmF0ZXMuIEl0IG1heSBiZSBuZXcgb3IgaXQgbWF5IGJlIGFuIGV4aXN0aW5nIG9uZS4KLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gcGQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIFByb3BlcnR5RGVjb3JhdG9yIHBkKSB7Ci0JCS8vIE9ubHkgZG8gY2hhbmdlcyBpZiBtZXJnZSBpbnRyb3NwZWN0aW9uLiBJZiBub3QgbWVyZ2luZywgdGhlbiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KLQkJaWYgKHBkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpIHsKLQkJCWJvb2xlYW4gaW5kZXhlZCA9IHBkLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUjsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcGQuZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJc3dpdGNoIChwZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJY2FzZSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SOgotCQkJCQkvLyBUaGUgZGVjb3JhdG9yIGlzIGltcGxpY2l0LCBzbyBjbG9uZSBpdCwgYW5kIGFwcGx5IHRvIGZlYXR1cmUsIGFuZCB0aGVuIGRvIHRoZSBzdGFuZGFyZCBwcm9wZXJ0eSBhcHBsaWVzIHRvIHRoZSBmZWF0dXJlLgotCQkJCQlMaXN0IGZjcyA9IGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBmZWF0dXJlKTsKLQkJCQkJZG9BZGRUb0VuZChjZCwgZmNzLCBwZC5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgcGQsIHRydWUpOwotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBmY3MsIGZlYXR1cmUsIGluZGV4ZWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkU6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgQU5EIGZlYXR1cmUgYXJlIGltcGxpY2l0LiBKdXN0IGNsb25lIHRoZW0gYW5kIGFkZCB0byB0aGUgY2xhc3MuCi0JCQkJCWRvQWRkVG9FbmQoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBmZWF0dXJlLmVDb250YWluZXIoKSksIGZlYXR1cmUuZUNvbnRhaW5pbmdGZWF0dXJlKCksIGZlYXR1cmUsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVQ6Ci0JCQkJCS8vIE5laXRoZXIgdGhlIGZlYXR1cmUgbm9yIHRoZSBkZWNvcmF0b3IgYXJlIGltcGxpY2l0LiBTbyBuZWVkIHRvIGRvIGFwcGxpZXMgYWdhaW5zdCB0aGVtLgotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgcGQpLCBwZCwgaW5kZXhlZCk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBmZWF0dXJlKSwgZmVhdHVyZSwgaW5kZXhlZCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2UgcmVjb3JkIGZvciB0aGUgZXZlbnQgc2V0IGRlY29yYXRvci4gRWl0aGVyIGl0IGlzIGFuIGFkZCBvZiBhIG5ldyBldmVudCBzZXQgZGVjb3JhdG9yIG9yIGl0IGlzIHRoZSBzZXR0aW5nIG9mIHRoZSBpbXBsaWNpdAotCSAqIHNldHRpbmdzIG9uIGFuIG5vbi1pbXBsaWNpdCBldmVudCBzZXQgZGVjb3JhdG9yLiBUaGUgc2FtZSBpcyB0cnVlIG9mIHRoZSBmZWF0dXJlIHRoYXQgaXQgZGVjb3JhdGVzLiBJdCBtYXkgYmUgbmV3IG9yIGl0IG1heSBiZSBhbiBleGlzdGluZyBvbmUuCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGVkCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkQ2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBFdmVudFNldERlY29yYXRvciBlZCkgewotCQkvLyBPbmx5IGJ1aWxkIGNoYW5nZXMgaWYgbWVyZ2UgaW50cm9zcGVjdGlvbi4gSWYgbm90IG1lcmdlIHRoZW4gdGhlcmUgYXJlIG5vIGNoYW5nZXMuCi0JCWlmIChlZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSB7Ci0JCQlKYXZhRXZlbnQgZXZlbnQgPSAoSmF2YUV2ZW50KSBlZC5nZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQlzd2l0Y2ggKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1I6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgaXMgaW1wbGljaXQsIHNvIGNsb25lIGl0LCBhbmQgYXBwbHkgdG8gZmVhdHVyZSwgYW5kIHRoZW4gZG8gdGhlIHN0YW5kYXJkIHByb3BlcnR5IGFwcGxpZXMgdG8gdGhlIGZlYXR1cmUuCi0JCQkJCUxpc3QgZmNzID0gZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGV2ZW50KTsKLQkJCQkJZG9BZGRUb0VuZChjZCwgZmNzLCBlZC5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgZWQsIHRydWUpOwotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBmY3MsIGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFOgotCQkJCQkvLyBUaGUgZGVjb3JhdG9yIEFORCBmZWF0dXJlIGFyZSBpbXBsaWNpdC4gSnVzdCBjbG9uZSB0aGVtIGFuZCBhZGQgdG8gdGhlIGNsYXNzLgotCQkJCQlkb0FkZFRvRW5kKGNkLCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgZXZlbnQuZUNvbnRhaW5lcigpKSwgZXZlbnQuZUNvbnRhaW5pbmdGZWF0dXJlKCksIGV2ZW50LCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUOgotCQkJCQkvLyBOZWl0aGVyIHRoZSBmZWF0dXJlIG5vciB0aGUgZGVjb3JhdG9yIGFyZSBpbXBsaWNpdC4gU28gbmVlZCB0byBkbyBhcHBsaWVzIGFnYWluc3QgdGhlbS4KLQkJCQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGVkKSwgZWQpOwotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgZXZlbnQpLCBldmVudCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSByZWNvcmQgZm9yIHRoZSBtZXRob2QgZGVjb3JhdG9yLiBFaXRoZXIgaXQgaXMgYW4gYWRkIG9mIGEgbmV3IG1ldGhvZCBkZWNvcmF0b3Igb3IgaXQgaXMgdGhlIHNldHRpbmcgb2YgdGhlIGltcGxpY2l0Ci0JICogc2V0dGluZ3Mgb24gYW4gbm9uLWltcGxpY2l0IG1ldGhvZCBkZWNvcmF0b3IuIFRoZSBzYW1lIGlzIHRydWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IGl0IGRlY29yYXRlcy4gSXQgbWF5IGJlIG5ldyBvciBpdCBtYXkgYmUgYW4gZXhpc3Rpbmcgb25lLgotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBtZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTWV0aG9kRGVjb3JhdG9yIG1kKSB7Ci0JCS8vIE9ubHkgZG8gYW55IGJ1aWxkcyBpZiBtZXJnZSBpbnRyb3NwZWN0aW9uLiBJZiBub3QgbWVyZ2UgaW50cm9zcGVjdGlvbiB0aGVuIG5vdGhpbmcgc2hvdWxkIGJlIGNoYW5nZWQuCi0JCWlmIChtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSB7Ci0JCQlFT3BlcmF0aW9uIG9wZXIgPSAoRU9wZXJhdGlvbikgbWQuZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJc3dpdGNoIChtZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJY2FzZSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SOgotCQkJCQkvLyBUaGUgZGVjb3JhdG9yIGlzIGltcGxpY2l0LCBzbyBjbG9uZSBpdCwgYW5kIGFwcGx5IHRvIGZlYXR1cmUsIGFuZCB0aGVuIGRvIHRoZSBzdGFuZGFyZCBwcm9wZXJ0eSBhcHBsaWVzIHRvIHRoZSBmZWF0dXJlLgotCQkJCQlMaXN0IGZjcyA9IGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBvcGVyKTsKLQkJCQkJZG9BZGRUb0VuZChjZCwgZmNzLCBtZC5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgbWQsIHRydWUpOwotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBmY3MsIG9wZXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkU6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgQU5EIGZlYXR1cmUgYXJlIGltcGxpY2l0LiBKdXN0IGNsb25lIHRoZW0gYW5kIGFkZCB0byB0aGUgY2xhc3MuCi0JCQkJCWRvQWRkVG9FbmQoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBvcGVyLmVDb250YWluZXIoKSksIG9wZXIuZUNvbnRhaW5pbmdGZWF0dXJlKCksIG9wZXIsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVQ6Ci0JCQkJCS8vIE5laXRoZXIgdGhlIGZlYXR1cmUgbm9yIHRoZSBkZWNvcmF0b3IgYXJlIGltcGxpY2l0LiBTbyBuZWVkIHRvIGRvIGFwcGxpZXMgYWdhaW5zdCB0aGVtLgotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgbWQpLCBtZCk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBvcGVyKSwgb3Blcik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXIgWkVSTyA9IG5ldyBJbnRlZ2VyKDApOwotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXIgT05FID0gbmV3IEludGVnZXIoMSk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlciBNSU5VU19PTkUgPSBuZXcgSW50ZWdlcigtMSk7Ci0JCi0JLyoqCi0JICogQnVpbGQgdGhlIG5vbi1pbXBsaWNpdCBjaGFuZ2VzIGludG8gdGhlIGZlYXR1cmUuIFRoaXMgY3JlYXRlcyBjaGFuZ2VzIGZvciB0aGUgaW1wbGljaXQgc2V0dGluZ3MKLQkgKiB0aGF0IGFsd2F5cyBvY2N1ciBmb3IgYSBwcm9wZXJ0eSBkZWNvcmF0b3IuCi0JICogIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGZlYXR1cmUuCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXhlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGZvciBhbiBpbmRleGVkIGZlYXR1cmUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBpbmRleGVkKSB7Ci0JCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCksIGZlYXR1cmUuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0JCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlX1RyYW5zaWVudCgpLCBCb29sZWFuLkZBTFNFLCBmYWxzZSk7Ci0JCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlX1ZvbGF0aWxlKCksIEJvb2xlYW4uRkFMU0UsIGZhbHNlKTsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RydWN0dXJhbEZlYXR1cmVfQ2hhbmdlYWJsZSgpLCBCb29sZWFuLnZhbHVlT2YoZmVhdHVyZS5pc0NoYW5nZWFibGUoKSksIGZhbHNlKTsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X0VUeXBlKCksIGZlYXR1cmUuZ2V0RVR5cGUoKSwgZmFsc2UpOwotCQlpZiAoIWluZGV4ZWQpIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVR5cGVkRWxlbWVudF9Mb3dlckJvdW5kKCksIFpFUk8sIGZhbHNlKTsKLQkJCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVR5cGVkRWxlbWVudF9VcHBlckJvdW5kKCksIE9ORSwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X0xvd2VyQm91bmQoKSwgWkVSTywgZmFsc2UpOwotCQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X1VwcGVyQm91bmQoKSwgTUlOVVNfT05FLCBmYWxzZSk7Ci0JCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVUeXBlZEVsZW1lbnRfVW5pcXVlKCksIEJvb2xlYW4uVFJVRSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIG5vbi1pbXBsaWNpdCBjaGFuZ2VzIGludG8gdGhlIGV2ZW50LiBUaGlzIGNyZWF0ZXMgY2hhbmdlcyBmb3IgdGhlIGltcGxpY2l0IHNldHRpbmdzCi0JICogdGhhdCBhbHdheXMgb2NjdXIgZm9yIGFuIGV2ZW50IHNldCBkZWNvcmF0b3IuCi0JICogIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGZlYXR1cmUuCi0JICogQHBhcmFtIGV2ZW50Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBKYXZhRXZlbnQgZXZlbnQpIHsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSwgZXZlbnQuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIG5vbi1pbXBsaWNpdCBjaGFuZ2VzIGludG8gdGhlIG9wZXJhdGlvbi4gVGhpcyBjcmVhdGVzIGNoYW5nZXMgZm9yIHRoZSBpbXBsaWNpdCBzZXR0aW5ncwotCSAqIHRoYXQgYWx3YXlzIG9jY3VyIGZvciBhbiBtZXRob2QgZGVjb3JhdG9yLgotCSAqICAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzIEZlYXR1cmVDaGFuZ2VzIGxpc3QgZm9yIHRoZSBmZWF0dXJlLgotCSAqIEBwYXJhbSBvcGVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBFT3BlcmF0aW9uIG9wZXIpIHsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSwgb3Blci5nZXROYW1lKCksIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCksICgoTWV0aG9kUHJveHkpIG9wZXIpLmdldE1ldGhvZCgpLCBmYWxzZSk7CS8vIFRoaXMgaXMgYSBtZXRob2QgdGhhdCBpcyBub3QgaW4gdGhpcyByZXNvdXJjZSwgc28gbm8gY2xvbmUuCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJdCB3aWxsIGJlIGEgTWV0aG9kUHJveHkgOTkuOSUgb2YgdGhlIHRpbWUsIHNvIHNhdmUgYnkgbm90IGRvaW5nIGluc3RhbmNlb2YuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB1cCB0aGUgY2hhbmdlcyBmb3IgYSBub24taW1wbGljaXQgZmVhdHVyZSBkZWNvcmF0b3IuIFRoaXMgbWVhbnMgY3JlYXRlIGNoYW5nZXMgZm9yIGltcGxpY2l0IHNldCBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzCi0JICogICAgICAgICAgICB0aGUgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGdpdmVuIGRlY29yYXRvci4KLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEZlYXR1cmVEZWNvcmF0b3IgZGVjb3IpIHsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKGltcGxpY2l0U2V0dGluZ3MgIT0gMCkKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdGx5U2V0Qml0cygpLCBuZXcgTG9uZyhpbXBsaWNpdFNldHRpbmdzKSwgZmFsc2UpOwotCQkKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9ESVNQTEFZTkFNRV9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0Rpc3BsYXlOYW1lKCksIGRlY29yLmdldERpc3BsYXlOYW1lKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX1NIT1JUREVTQ19JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX1Nob3J0RGVzY3JpcHRpb24oKSwgZGVjb3IuZ2V0U2hvcnREZXNjcmlwdGlvbigpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9DQVRFR09SWV9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCksIGRlY29yLmdldENhdGVnb3J5KCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0VYUEVSVF9JTVBMSUNJVCkgIT0gMCAmJiBkZWNvci5pc1NldEV4cGVydCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfRXhwZXJ0KCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc0V4cGVydCgpKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfSElEREVOX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0SGlkZGVuKCkpIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9IaWRkZW4oKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzSGlkZGVuKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9QUkVGRVJSRURfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRQcmVmZXJyZWQoKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX1ByZWZlcnJlZCgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNQcmVmZXJyZWQoKSksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0FUVFJJQlVURVNfSU1QTElDSVQpICE9IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gZGVjb3IuZ2V0QXR0cmlidXRlcygpLmxpc3RJdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwgZW50cnkgPSAoRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbClpdHIubmV4dCgpOwotCQkJCWlmIChlbnRyeS5nZXRUeXBlZFZhbHVlKCkuaXNJbXBsaWNpdFZhbHVlKCkpIHsKLQkJCQkJZG9BZGRUb0VuZChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlcygpLCBlbnRyeSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdXAgdGhlIGNoYW5nZXMgZm9yIGEgbm9uLWltcGxpY2l0IGJlYW4gZGVjb3JhdG9yLiBUaGlzIG1lYW5zIGNyZWF0ZSBjaGFuZ2VzIGZvciBpbXBsaWNpdCBzZXQgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgdGhlIEZlYXR1cmVDaGFuZ2VzIGxpc3QgZm9yIHRoZSBnaXZlbiBkZWNvcmF0b3IuCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBCZWFuRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgQmVhbkRlY29yYXRvckltcGwuQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCksIGRlY29yLmdldEN1c3RvbWl6ZXJDbGFzcygpLCBmYWxzZSk7IC8vIEN1c3RvbWl6ZXIgY2xhc3MgaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gbm90IGluIHRoaXMgcmVzb3VyY2UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIHNvIHdlIGRvbid0IGNsb25lIGl0LgotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEJlYW5EZWNvcmF0b3JJbXBsLkJFQU5fTUVSR0VfSU5IRVJJVEVEX1BST1BFUlRJRVNfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJNZXRob2RzKCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc01lcmdlU3VwZXJNZXRob2RzKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0TWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlckV2ZW50cygpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNNZXJnZVN1cGVyRXZlbnRzKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKCFkZWNvci5nZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlkb0FkZEFsbFRvRW5kKGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCksIGRlY29yLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICghZGVjb3IuZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWRvQWRkQWxsVG9FbmQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCksIGRlY29yLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoIWRlY29yLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWRvQWRkQWxsVG9FbmQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSwgZGVjb3IuZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB1cCB0aGUgY2hhbmdlcyBmb3IgYSBub24taW1wbGljaXQgcHJvcGVydHkgZGVjb3JhdG9yLiBUaGlzIG1lYW5zIGNyZWF0ZSBjaGFuZ2VzIGZvciBpbXBsaWNpdCBzZXQgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgdGhlIEZlYXR1cmVDaGFuZ2VzIGxpc3QgZm9yIHRoZSBnaXZlbiBkZWNvcmF0b3IuCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIGluZGV4ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBpbmRleGVkIHByb3BlcnR5IGRlY29yYXRvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIFByb3BlcnR5RGVjb3JhdG9yIGRlY29yLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZmNzLCBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9FRElUT1JfQ0xBU1NfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpLCBkZWNvci5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCksIGZhbHNlKTsgLy8gUHJvcGVydHkgRWRpdG9yIGNsYXNzIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIG5vdCBpbiB0aGlzIHJlc291cmNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBzbyB3ZSBkb24ndCBjbG9uZSBpdC4KLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCksIGRlY29yLmdldFJlYWRNZXRob2QoKSwgZmFsc2UpOyAKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKSwgZGVjb3IuZ2V0V3JpdGVNZXRob2QoKSwgZmFsc2UpOyAKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRklFTERfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKSwgZGVjb3IuZ2V0RmllbGQoKSwgZmFsc2UpOyAKLQkJCWlmIChkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZFJlYWRPbmx5KCkpKQotCQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNGaWVsZFJlYWRPbmx5KCkpLCBmYWxzZSk7Ci0JCX0JCQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRCb3VuZCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc0JvdW5kKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0NPTlNUUkFJTkVEX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0Q29uc3RyYWluZWQoKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNDb25zdHJhaW5lZCgpKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9ERVNJR05USU1FX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzRGVzaWduVGltZSgpKSwgZmFsc2UpOwotCQl9Ci0JCQotCQlpZiAoaW5kZXhlZCkgewotCQkJSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGlwZCA9IChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIGRlY29yOwotCQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1JFQURNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpLCBpcGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSwgZmFsc2UpOyAKLQkJCX0KLQkJCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9XUklURU1FVEhPRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpLCBpcGQuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCksIGZhbHNlKTsgCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgdXAgdGhlIGNoYW5nZXMgZm9yIGEgbm9uLWltcGxpY2l0IGV2ZW50IHNldCBkZWNvcmF0b3IuIFRoaXMgbWVhbnMgY3JlYXRlIGNoYW5nZXMgZm9yIGltcGxpY2l0IHNldCBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzCi0JICogICAgICAgICAgICB0aGUgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGdpdmVuIGRlY29yYXRvci4KLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEV2ZW50U2V0RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0FERExJU1RFTkVSTUVUSE9EX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCksIGRlY29yLmdldEFkZExpc3RlbmVyTWV0aG9kKCksIGZhbHNlKTsgLy8gbGlzdGVuZXIgbWV0aG9kIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIG5vdCBpbiB0aGlzIHJlc291cmNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBzbyB3ZSBkb24ndCBjbG9uZSBpdC4KLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCksIGRlY29yLmdldEV2ZW50QWRhcHRlckNsYXNzKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb0FkZEFsbFRvRW5kKGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfU2VyTGlzdE10aGQoKSwgZGVjb3IuZ2V0U2VyTGlzdE10aGQoKSwgdHJ1ZSk7CS8vIFRoZXNlIG5lZWQgdG8gYmUgY2xvbmVkIGJlY2F1c2UgdGhleSBhcmUgY29udGFpbmVkIGhlcmUuCi0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKSwgZGVjb3IuZ2V0TGlzdGVuZXJUeXBlKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKSwgZGVjb3IuZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9ERUZBVUxURVZFTlRTRVRfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc0luRGVmYXVsdEV2ZW50U2V0KCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX1VOSUNBU1RfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRVbmljYXN0KCkpIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfVW5pY2FzdCgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNVbmljYXN0KCkpLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB1cCB0aGUgY2hhbmdlcyBmb3IgYSBub24taW1wbGljaXQgbWV0aG9kIGRlY29yYXRvci4gVGhpcyBtZWFucyBjcmVhdGUgY2hhbmdlcyBmb3IgaW1wbGljaXQgc2V0IGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIHRoZSBGZWF0dXJlQ2hhbmdlcyBsaXN0IGZvciB0aGUgZ2l2ZW4gZGVjb3JhdG9yLgotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBidWlsZE5vbkltcGxpY2l0Q2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgTWV0aG9kRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgTWV0aG9kRGVjb3JhdG9ySW1wbC5NRVRIT0RfUEFSQU1FVEVSU19JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9BZGRBbGxUb0VuZChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZERlY29yYXRvcl9TZXJQYXJtRGVzYygpLCBkZWNvci5nZXRTZXJQYXJtRGVzYygpLCB0cnVlKTsgCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgZmVhdHVyZSBjaGFuZ2UgbGlzdCBmb3IgYW4gb2JqZWN0LiBDcmVhdGUgaXQgb25lIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBmZWF0dXJlIGNoYW5nZSBsaXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBmY3MgPSBjZC5nZXRPYmplY3RDaGFuZ2VzKCkuZ2V0KG9iamVjdCk7IC8vIEdldCB0aGUgZmVhdHVyZSBjaGFuZ2VzIGlmIGFueS4KLQkJaWYgKGZjcyA9PSBudWxsKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSBDaGFuZ2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFT2JqZWN0VG9DaGFuZ2VzTWFwRW50cnkob2JqZWN0KTsKLQkJCWNkLmdldE9iamVjdENoYW5nZXMoKS5hZGQoZW50cnkpOwotCQkJZmNzID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZjczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEZlYXR1cmVDaGFuZ2UgcmVjb3JkIGZvciBhIGZlYXR1cmUgd3J0L29iamVjdC4gQ3JlYXRlIG9uZSBpZiBuZWNlc3NhcnkuIElmIGl0IGNyZWF0ZXMgaXQsIGl0IHdpbGwgbWFyayBpdCBhcyAic2V0Ii4gQWxsIG9mIG91cgotCSAqIGNoYW5nZXMgaGVyZSBhcmUgc2V0IGtpbmQgb2YgY2hhbmdlcywgbm90IHVuc2V0IGtpbmQuCi0JICogCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgZmVhdHVyZSBjaGFuZ2UgbGlzdCBmcm9tIHRoZSBDaGFuZ2VEZXNjcmlwaW9uLmdldE9iamVjdENoYW5nZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGZlYXR1cmUgY2hhbmdlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBGZWF0dXJlQ2hhbmdlIGdldEZlYXR1cmVDaGFuZ2UoTGlzdCBmY3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghZmNzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmY3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlGZWF0dXJlQ2hhbmdlIGZjID0gKEZlYXR1cmVDaGFuZ2UpIGZjcy5nZXQoaSk7Ci0JCQkJaWYgKGZjLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlKQotCQkJCQlyZXR1cm4gZmM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBFaXRoZXIgbmV3IG9iamVjdCBjaGFuZ2VzIG9yIG5vIGZlYXR1cmUgY2hhbmdlIGZvdW5kLiBDcmVhdGUgb25lLgotCQlGZWF0dXJlQ2hhbmdlIGZjID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmVhdHVyZUNoYW5nZShmZWF0dXJlLCBudWxsLCB0cnVlKTsKLQkJZmNzLmFkZChmYyk7Ci0JCXJldHVybiBmYzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjaGFuZ2UgZm9yIGFkZCB0byBlbmQgb2YgdGhlIGdpdmVuIGZlYXR1cmUgKG11c3QgYmUgaXNNYW55KCkpLiBJZiBuZXdPYmplY3QgaXMgdHJ1ZSwgdGhlbiB0aGlzIG1lYW5zIHRoaXMgaXMgbm90IGEgcG9pbnRlciB0byBhbgotCSAqIGV4aXN0aW5nIG9iamVjdCBhbmQgc28gaXQgbXVzdCBiZSBjbG9uZWQuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIGZ1cnRoZXIgY2hhbmdlcyB0byB0aGlzIG9iamVjdCBiZWNhdXNlIHRob3NlIHdpbGwgbm90IGJlIGtub3duCi0JICogYWJvdXQuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgZmVhdHVyZSBjaGFuZ2UgbGlzdCBmcm9tIHRoZSBDaGFuZ2VEZXNjcmlwaW9uLmdldE9iamVjdENoYW5nZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIGJlaW5nIGFkZGVkIHRvLgotCSAqIEBwYXJhbSBhZGRlZFZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgYmVpbmcgYWRkZWQuCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXcgb2JqZWN0IGluIHRoZSByZXNvdXJjZSwgYSBjbG9uZSB3aWxsIGJlIG1hZGUuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhbiBleGlzdGluZyBvYmplY3QuIE11c3QgYmUgYW4KLQkgKiAgICAgICAgICAgIEVPYmplY3QgZm9yIGNsb25pbmcuIEJlc3QgaWYgbm90IHRydWUgZm9yIG5vbi1lb2JqZWN0cy4KLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFZhbHVlIG9yIHRoZSBjbG9uZSBpZiBpdCB3YXMgY2xvbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGRvQWRkVG9FbmQoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGFkZGVkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJRmVhdHVyZUNoYW5nZSBmYyA9IGdldEZlYXR1cmVDaGFuZ2UoZmNzLCBmZWF0dXJlKTsKLQkJaWYgKG5ld1ZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCWFkZGVkVmFsdWUgPSBFY29yZVV0aWwuY29weSgoRU9iamVjdCkgYWRkZWRWYWx1ZSk7Ci0JCQkJY2QuZ2V0T2JqZWN0c1RvQXR0YWNoKCkuYWRkKChFT2JqZWN0KWFkZGVkVmFsdWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOb3JtYWxseSBzaG91bGQgbm90IG9jY3VyLCBidXQgaWYgaXQgZG9lcywgaXQgbWVhbnMgd2UgY2FuJ3QgY2xvbmUsIHNvIGRvbid0IGNsb25lLgotCQkJfQotCQl9Ci0JCUxpc3QgbGNzID0gZmMuZ2V0TGlzdENoYW5nZXMoKTsKLQkJLy8gRmluZCB0aGUgb25lIHdpdGggYWRkIGFuZCAtMSwgaS5lLiBhZGQgdG8gZW5kLiBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUuCi0JCUxpc3RDaGFuZ2UgbGMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxjcy5zaXplKCk7IGkrKykgewotCQkJTGlzdENoYW5nZSBsY2EgPSAoTGlzdENoYW5nZSkgbGNzLmdldChpKTsKLQkJCWlmIChsY2EuZ2V0S2luZCgpID09IENoYW5nZUtpbmQuQUREX0xJVEVSQUwgJiYgbGNhLmdldEluZGV4KCkgPT0gLTEpIHsKLQkJCQlsYyA9IGxjYTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobGMgPT0gbnVsbCkgewotCQkJbGMgPSBDaGFuZ2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaXN0Q2hhbmdlKCk7Ci0JCQlsY3MuYWRkKGxjKTsKLQkJfQotCi0JCWxjLmdldFZhbHVlcygpLmFkZChhZGRlZFZhbHVlKTsKLQkJcmV0dXJuIGFkZGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hhbmdlIGZvciBhZGQgYWxsIHRvIGVuZCBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSAobXVzdCBiZSBpc01hbnkoKSkuIElmIG5ld1ZhbHVlIGlzIHRydWUsIHRoZW4gdGhpcyBtZWFucyB0aGlzIGlzIG5vdCBhIHBvaW50ZXIgdG8KLQkgKiBleGlzdGluZyBvYmplY3RzIGFuZCBzbyBpdCBtdXN0IGJlIGNsb25lZC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciBjaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IGJlY2F1c2UgdGhvc2Ugd2lsbCBub3QgYmUga25vd24KLQkgKiBhYm91dC4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzCi0JICogICAgICAgICAgICBmZWF0dXJlIGNoYW5nZSBsaXN0IGZyb20gdGhlIENoYW5nZURlc2NyaXBpb24uZ2V0T2JqZWN0Q2hhbmdlcyBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgYmVpbmcgYWRkZWQgdG8uCi0JICogQHBhcmFtIGFkZGVkVmFsdWVzCi0JICogICAgICAgICAgICB0aGUgdmFsdWVzIGJlaW5nIGFkZGVkLgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IG9iamVjdHMgaW4gdGhlIHJlc291cmNlLCBjbG9uZXMgd2lsbCBiZSBtYWRlLiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYW4gZXhpc3Rpbmcgb2JqZWN0LiBNdXN0IGJlIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZvciBjbG9uaW5nLiBCZXN0IGlmIG5vdCB0cnVlIGZvciBub24tZW9iamVjdHMuCi0JICogQHJldHVybiB0aGUgYWRkZWRWYWx1ZXMgb3IgdGhlIGNsb25lcyBpZiBpdCB3YXMgY2xvbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGRvQWRkQWxsVG9FbmQoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBhZGRlZFZhbHVlcywgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlGZWF0dXJlQ2hhbmdlIGZjID0gZ2V0RmVhdHVyZUNoYW5nZShmY3MsIGZlYXR1cmUpOwotCQlpZiAobmV3VmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJYWRkZWRWYWx1ZXMgPSBFY29yZVV0aWwuY29weUFsbChhZGRlZFZhbHVlcyk7Ci0JCQkJY2QuZ2V0T2JqZWN0c1RvQXR0YWNoKCkuYWRkQWxsKGFkZGVkVmFsdWVzKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTm9ybWFsbHkgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGlmIGl0IGRvZXMsIGl0IG1lYW5zIHdlIGNhbid0IGNsb25lLCBzbyBkb24ndCBjbG9uZS4KLQkJCX0KLQkJfQotCQlMaXN0IGxjcyA9IGZjLmdldExpc3RDaGFuZ2VzKCk7Ci0JCS8vIEZpbmQgdGhlIG9uZSB3aXRoIGFkZCBhbmQgLTEsIGkuZS4gYWRkIHRvIGVuZC4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLgotCQlMaXN0Q2hhbmdlIGxjID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsY3Muc2l6ZSgpOyBpKyspIHsKLQkJCUxpc3RDaGFuZ2UgbGNhID0gKExpc3RDaGFuZ2UpIGxjcy5nZXQoaSk7Ci0JCQlpZiAobGNhLmdldEtpbmQoKSA9PSBDaGFuZ2VLaW5kLkFERF9MSVRFUkFMICYmIGxjYS5nZXRJbmRleCgpID09IC0xKSB7Ci0JCQkJbGMgPSBsY2E7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxjID09IG51bGwpIHsKLQkJCWxjID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdENoYW5nZSgpOwotCQkJbGNzLmFkZChsYyk7Ci0JCX0KLQotCQlsYy5nZXRWYWx1ZXMoKS5hZGRBbGwoYWRkZWRWYWx1ZXMpOwotCQlyZXR1cm4gYWRkZWRWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hhbmdlIGZvciBzZXQgYSBnaXZlbiBmZWF0dXJlIChtdXN0IGJlICFpc01hbnkoKSkuIElmIG5ld1ZhbHVlIGlzIHRydWUsIHRoZW4gdGhpcyBtZWFucyB0aGlzIGlzIG5vdCBhIHBvaW50ZXIgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0Ci0JICogYW5kIHNvIGl0IG11c3QgYmUgY2xvbmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhpcyBvYmplY3QgYmVjYXVzZSB0aG9zZSB3aWxsIG5vdCBiZSBrbm93biBhYm91dC4KLQkgKiA8cD4KLQkgKiBBbnkgZnVydGhlciBzZXRzIHRvIHRoaXMgZmVhdHVyZSB3aWxsIHJlc3VsdCBpbiB0aGUgcHJldmlvdXMgc2V0dGluZyBiZWluZyBsb3N0LgotCSAqIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgY2hhbmdlIGxpc3QgZnJvbSB0aGUgQ2hhbmdlRGVzY3JpcGlvbi5nZXRPYmplY3RDaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSBiZWluZyBzZXQgdG8uCi0JICogQHBhcmFtIHNldFZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgYmVpbmcgc2V0LgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IG9iamVjdCBpbiB0aGUgcmVzb3VyY2UsIGEgY2xvbmUgd2lsbCBiZSBtYWRlLiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYW4gZXhpc3Rpbmcgb2JqZWN0LiBNdXN0IGJlIGFuCi0JICogICAgICAgICAgICBFT2JqZWN0IGZvciBjbG9uaW5nLiBCZXN0IGlmIG5vdCB0cnVlIGZvciBub24tZW9iamVjdHMuCi0JICogQHJldHVybiB0aGUgc2V0VmFsdWUgb3IgdGhlIGNsb25lIGlmIGl0IHdhcyBjbG9uZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZG9TZXQoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHNldFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0KLQkJRmVhdHVyZUNoYW5nZSBmYyA9IGdldEZlYXR1cmVDaGFuZ2UoZmNzLCBmZWF0dXJlKTsKLQkJaWYgKG5ld1ZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCXNldFZhbHVlID0gRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIHNldFZhbHVlKTsKLQkJCQljZC5nZXRPYmplY3RzVG9BdHRhY2goKS5hZGQoKEVPYmplY3Qpc2V0VmFsdWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOb3JtYWxseSBzaG91bGQgbm90IG9jY3VyLCBidXQgaWYgaXQgZG9lcywgaXQgbWVhbnMgd2UgY2FuJ3QgY2xvbmUsIHNvIGRvbid0IGNsb25lLgotCQkJfQotCQl9Ci0KLQkJaWYgKHNldFZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCWZjLnNldFJlZmVyZW5jZVZhbHVlKChFT2JqZWN0KSBzZXRWYWx1ZSk7Ci0JCWVsc2UKLQkJCWZjLnNldERhdGFWYWx1ZShFY29yZVV0aWwuY29udmVydFRvU3RyaW5nKChFRGF0YVR5cGUpIGZlYXR1cmUuZ2V0RVR5cGUoKSwgc2V0VmFsdWUpKTsKLQkJcmV0dXJuIHNldFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3ZThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgLSB0aGUgZmFjdG9yeSBmb3IgCi0gKiBiZWFuaW5mbyBpbnRyb3NwZWN0aW9uIHRvIHBvcHVsYXRlIHRoZSBKYXZhIE1vZGVsLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzEvMjAwMCAxMTo1Mjo1NSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBJQmVhbmluZm9TdXBwbGllciBmSW5mb1N1cHBsaWVyOwotCi0JLy8gTWFpbnRhaW4gYSBtYXBwaW5nIG9mIHRoZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgYWRhcHRvcnMgd2hpY2ggaGF2ZQotCS8vIGludHJvc3BlY3RlZCBmcm9tIHRoZW0uICBUaGlzIGFsbG93cyBhIGNsb3NlIG9wZXJhdGlvbiB0byBmb3JjZSB0aG9zZQotCS8vIGFkYXB0ZXJzIHRvIGNsZWFyIG91dCB0aGUgZGF0YS4gSXQgYWxzbyBhbGxvd3MgZm9yIG1hcmtpbmcgYW4gYWRhcHRlciBhcyBzdGFsZQotCS8vIHNvIHRoYXQgbmV4dCB0aW1lIGl0IGludHJvc3BlY3RzIGl0IHdpbGwgcmUtZ2V0IHRoZSBkYXRhLgotCS8vIAotCS8vIFRoaXMgaXMgYSBXZWFrUmVmZXJlbmNlIHNvIHRoYXQgd2UgZG9uJ3QgaG9sZCBvbnRvIGFkYXB0ZXJzIHRoYXQgd2VyZQotCS8vIGV4cGxpY2l0bHkgcmVtb3ZlZCBpbiBvdGhlciB3YXlzLgotCXByaXZhdGUgTWFwIGZJbnRyb3NwZWN0ZWQgPSBuZXcgSGFzaE1hcCgpOwkvLyBOT1RFOiBUaGlzIGlzIHRvIGJlIGFjY2Vzc2VkIG9ubHkgdW5kZXIgc3luYyh0aGlzKSEKLQlwcml2YXRlIFJlZmVyZW5jZVF1ZXVlIGZSZWZRID0gbmV3IFJlZmVyZW5jZVF1ZXVlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2Vha1ZhbHVlIGV4dGVuZHMgV2Vha1JlZmVyZW5jZSB7Ci0JCXByaXZhdGUgT2JqZWN0IGtleTsKLQkJcHVibGljIFdlYWtWYWx1ZShPYmplY3QgYUtleSwgT2JqZWN0IHZhbHVlLCBSZWZlcmVuY2VRdWV1ZSBxdWUpIHsKLQkJCXN1cGVyKHZhbHVlLCBxdWUpOwotCQkJa2V5ID0gYUtleTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQmVhbmluZm9BZGFwdGVyRmFjdG9yeShJQmVhbmluZm9TdXBwbGllciBzdXBwbGllcikgewotCQlmSW5mb1N1cHBsaWVyID0gc3VwcGxpZXI7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpIHsKLQkJCXJldHVybiAhKHRhcmdldCBpbnN0YW5jZW9mIEFycmF5VHlwZSkgPyBuZXcgQmVhbmluZm9DbGFzc0FkYXB0ZXIodGhpcykgOiBudWxsOwkvLyBBcnJheSB0eXBlcyBkb24ndCBoYXZlIGJlYW5pbmZvIGFkYXB0ZXJzLgotCQl9IGVsc2UKLQkJCXJldHVybiBuZXcgQmVhbmluZm9TdXBlckFkYXB0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkgPT0gdHlwZSB8fCBCZWFuaW5mb1N1cGVyQWRhcHRlci5BREFQVEVSX0tFWSA9PSB0eXBlOwotCX0JCi0KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmSW5mb1N1cHBsaWVyLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0cnlDcmVhdGVkKCkgewotCQlyZXR1cm4gZkluZm9TdXBwbGllci5pc1JlZ2lzdHJ5Q3JlYXRlZCgpOwotCX0KLQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWN5Y2xlUmVnaXN0cnkoKSB7Ci0JCW1hcmtBbGxTdGFsZSgpOyAvLyBBdCB0aGlzIHBvaW50IGluIHRpbWUgd2UgbmVlZCB0byBtYXJrIHRoZW0gYWxsIHN0YWxlIGJlY2F1c2Ugd2UgYXJlIHJlY3ljbGluZy4gTWFya0FsbFN0YWxlIGFsc28gY2xvc2VzIHRoZSByZWdpc3RyeS4KLQkJcmV0dXJuIGdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZkluZm9TdXBwbGllci5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBQcm9qZWN0UmVzb3VyY2VTZXQgZ2V0TmV3UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBmSW5mb1N1cHBsaWVyLmdldE5ld1Jlc291cmNlU2V0KCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRQcm9qZWN0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBmSW5mb1N1cHBsaWVyLmdldFByb2plY3RSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIEFMTCBhZGFwdGVycy4gQWxzbyByZW1vdmUgdGhlIGFkYXB0ZXJzIHNvIHRoYXQgdGhleQotCSAqIGFyZSBub3QgYmVpbmcgaGVsZCBvbnRvLiBUaGlzIG1lYW5zIHdlIGFyZSBjbG9zaW5nIHRoZSBwcm9qZWN0IG9yIHJlbW92aW5nIHRoZSBuYXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VBbGwoYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gV2UgYXJlIGdvaW5nIHRvIGJlIHJlbW92aW5nIGFsbCBvZiB0aGVtLCBzbyBqdXN0IHNldCBpbnRyb3NwZWN0ZWQgdG8gYW4gZW1wdHkgb25lCi0JCQkvLyBhbmQgdXNlIHRoZSByZWFsIG9uZS4gVGhpcyB3YXkgd2Ugd29uJ3QgZ2V0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucyBhcyB3ZSByZW1vdmUKLQkJCS8vIGl0IGZyb20gdGhlIG5vdGlmaWVyIHJlbW92ZUFkYXB0ZXIuCi0JCQlNYXAgaW50ciA9IGZJbnRyb3NwZWN0ZWQ7Ci0JCQlmSW50cm9zcGVjdGVkID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwkvLyBTaW5jZSB3ZSBhcmUgY2xvc2luZyB3ZSBjYW4ga2VlcCB0aGUgdW5tb2RpZmlhYmxlIG9uZSBoZXJlLgotCQkJSXRlcmF0b3IgaSA9IGludHIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpICgoV2Vha1ZhbHVlKSBpLm5leHQoKSkuZ2V0KCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCQlpZiAoY2xlYXJSZXN1bHRzKQotCQkJCQkJYS5jbGVhckludHJvc3BlY3Rpb24oKTsKLQkJCQkJTm90aWZpZXIgbm90aWZpZXIgPSBhLmdldFRhcmdldCgpOwotCQkJCQlpZiAobm90aWZpZXIgIT0gbnVsbCkKLQkJCQkJCW5vdGlmaWVyLmVBZGFwdGVycygpLnJlbW92ZShhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWFyayBhbGwgc3RhbGUsIGJ1dCBsZWF2ZSB0aGUgb3ZlcnJpZGVzIGFsb25lLiBUaGUgb3ZlcnJpZGVzIGFyZW4ndCBzdGFsZS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtBbGxTdGFsZSgpIHsKLQkJbWFya0FsbFN0YWxlKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTWFyayB0aGUgcGFja2FnZSBhcyBzdGFsZS4gVGhlIG92ZXJyaWRlcyBhcmUgbGVmdCBhbG9uZSBzaW5jZSB0aGV5IGFyZSBub3Qgc3RhbGUuCi0JICogCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIG5hbWUgb2YgcGFja2FnZSAoJy4nIHF1YWxpZmllZCkuCi0JICogQHNpbmNlIDEuMi4xCi0JICovCi0JcHVibGljIHZvaWQgbWFya1BhY2thZ2VTdGFsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXBhY2thZ2VOYW1lKz0nLic7CS8vIEluY2x1ZGUgdGhlICcuJyBzbyB0aGF0IGNhbiBkaXN0aW5ndWlzaCBwYWNrYWdlIGZyb20gY2xhc3MuIAotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUl0ZXJhdG9yIGl0ciA9IGZJbnRyb3NwZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpKSB7Ci0JCQkJCS8vIEl0IGlzIHRoZSBpdGVtIG9yIG9uZSBvZiBpdHMgaW5uZXIgY2xhc3Nlcy4KLQkJCQkJV2Vha1ZhbHVlIHJlZiA9IChXZWFrVmFsdWUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIHJlZi5nZXQoKTsJCQkJCQotCQkJCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQkJCQlhLm1hcmtTdGFsZUZhY3RvcnkoaXNSZWdpc3RyeUNyZWF0ZWQoKSA/IGdldFJlZ2lzdHJ5KCkgOiBudWxsKTsgLy8gTWFyayBpdCBzdGFsZSB3aXRoIHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayBBTEwgYWRhcHRlcnMgYXMgc3RhbGUuIFRoaXMgb2NjdXJzIGJlY2F1c2Ugd2UndmUgcmVjeWNsZWQgdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBjbGVhck92ZXJyaWRlcyBjbGVhciB0aGUgb3ZlcnJpZGVzIHRvby4gVGhpcyBpcyBmdWxsLWZsZWRnZWQgc3RhbGUuIFRoZSBvdmVycmlkZXMgYXJlIHN0YWxlIHRvby4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrQWxsU3RhbGUoYm9vbGVhbiBjbGVhck92ZXJyaWRlcykgewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSBmYWN0ID0gaXNSZWdpc3RyeUNyZWF0ZWQoKSA/IGdldFJlZ2lzdHJ5KCkgOiBudWxsOwotCQlwcm9jZXNzUXVldWUoKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlJdGVyYXRvciBpID0gZkludHJvc3BlY3RlZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgKChXZWFrVmFsdWUpIGkubmV4dCgpKS5nZXQoKTsKLQkJCQlpZiAoYSAhPSBudWxsKQotCQkJCQlhLm1hcmtTdGFsZUZhY3RvcnkoZmFjdCwgY2xlYXJPdmVycmlkZXMpOwotCQkJfQotCQkJZkluZm9TdXBwbGllci5jbG9zZVJlZ2lzdHJ5KCk7CS8vIEdldCByaWQgb2YgdGhlIHJlZ2lzdHJ5IG5vdyBzaW5jZSBpdCBpcyBub3QgbmVlZGVkLiBUaGlzIHdheSB3ZSB3b24ndCBhY2NpZGVudGlseSBob2xkIG9udG8gaXQgd2hlbiBub3QgbmVlZGVkLgotCQl9Ci0JfQotCS8qKgotCSAqIE1hcmsgdGhlIGludHJvc3BlY3Rpb24gYXMgc3RhbGUgZm9yIGEgc291cmNlIG9iamVjdC4gQWxzbyBjbGVhciByZXN1bHRzIGlmIHRvbGQgdG8uCi0JICogQHBhcmFtIHNvdXJjZU5hbWUgRnVsbHkgcXVhbGlmaWVkIHNvdXJjZSBuYW1lLCB1c2UgdHlwZSBmb3IgcmVmbGVjdGlvbiwgaS5lLiAiYS5iLmMuQ2xhc3MxJElubmVyQ2xhc3MiCi0JICogQHBhcmFtIGNsZWFyUmVzdWx0cyBjbGVhciBvdXQgdGhlIHJlc3VsdHMuIElmIGZhbHNlLCB0aGV5IHdpbGwgYmUgcmV1c2VkIGlmIHBvc3NpYmxlIG9uIHJlY3ljbGUuCi0JICovCi0JcHVibGljIHZvaWQgbWFya1N0YWxlSW50cm9zcGVjdGlvbihTdHJpbmcgc291cmNlTmFtZSwgYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJV2Vha1ZhbHVlIHJlZiA9IChXZWFrVmFsdWUpIGZJbnRyb3NwZWN0ZWQuZ2V0KHNvdXJjZU5hbWUpOwotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgcmVmLmdldCgpOwotCQkJCWlmIChhICE9IG51bGwpIHsKLQkJCQkJaWYgKGNsZWFyUmVzdWx0cykKLQkJCQkJCWEuY2xlYXJJbnRyb3NwZWN0aW9uKCk7Ci0JCQkJCWEubWFya1N0YWxlRmFjdG9yeShpc1JlZ2lzdHJ5Q3JlYXRlZCgpID8gZ2V0UmVnaXN0cnkoKSA6IG51bGwpOyAvLyBNYXJrIGl0IHN0YWxlIHdpdGggdGhlIGN1cnJlbnQgcmVnaXN0cnkuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoU3RyaW5nIHNvdXJjZU5hbWUsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCXByb2Nlc3NRdWV1ZSgpOwotCQlTdHJpbmcgc291cmNlTmFtZUZvcklubmVyID0gc291cmNlTmFtZSArICckJzsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlJdGVyYXRvciBpdHIgPSBmSW50cm9zcGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyLm5leHQoKTsKLQkJCQlTdHJpbmcgZW50cnlOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGVudHJ5TmFtZS5lcXVhbHMoc291cmNlTmFtZSkgfHwgZW50cnlOYW1lLnN0YXJ0c1dpdGgoc291cmNlTmFtZUZvcklubmVyKSkgewotCQkJCQkvLyBJdCBpcyB0aGUgaXRlbSBvciBvbmUgb2YgaXRzIGlubmVyIGNsYXNzZXMuCi0JCQkJCVdlYWtWYWx1ZSByZWYgPSAoV2Vha1ZhbHVlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlciBhID0gKEJlYW5pbmZvQ2xhc3NBZGFwdGVyKSByZWYuZ2V0KCk7CQkJCQkKLQkJCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNsZWFyUmVzdWx0cykKLQkJCQkJCQlhLmNsZWFySW50cm9zcGVjdGlvbigpOwotCQkJCQkJYS5tYXJrU3RhbGVGYWN0b3J5KGlzUmVnaXN0cnlDcmVhdGVkKCkgPyBnZXRSZWdpc3RyeSgpIDogbnVsbCk7IC8vIE1hcmsgaXQgc3RhbGUgd2l0aCB0aGUgY3VycmVudCByZWdpc3RyeS4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0JCi0KLQkvKioKLQkgKiBSZWdpc3RlciBhbiBhZGFwdGVyIGZvciBpbnRyb3NwZWN0aW9uLgotCSAqIEBwYXJhbSBzb3VyY2VOYW1lIEZ1bGx5IHF1YWxpZmllZCBzb3VyY2UgbmFtZSwgdXNlIHR5cGUgZm9yIHJlZmxlY3Rpb24sIGkuZS4gImEuYi5jLkNsYXNzMSRJbm5lckNsYXNzIgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoZSBhZGFwdGVyIHRvIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJJbnRyb3NwZWN0aW9uKFN0cmluZyBzb3VyY2VOYW1lLCBCZWFuaW5mb0NsYXNzQWRhcHRlciBhZGFwdGVyKSB7Ci0JCS8vIENyZWF0ZSBpdCBhcyBhIHdlYWsgcmVmZXJlbmNlIHNvIHRoYXQgaXQgZG9lc24ndCBob2xkIG9udG8gdGhlIGFkYXB0ZXIgaWYgaXQgaXMgZXZlciByZW1vdmVkCi0JCS8vIGFuZCB0aHJvd24gYXdheSAob3IgdGhlIE1PRiByZXNvdXJjZSBpdHNlbGYgaXMgdGhyb3duIGF3YXkpLgotCQlwcm9jZXNzUXVldWUoKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlmSW50cm9zcGVjdGVkLnB1dChzb3VyY2VOYW1lLCBuZXcgV2Vha1ZhbHVlKHNvdXJjZU5hbWUsIGFkYXB0ZXIsIGZSZWZRKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFkYXB0ZXIuIFRoaXMgaGFwcGVucyBpbiB0aGUgY2FzZSB0aGF0IGFkYXB0ZXIgaXMgYmVpbmcgcmVtb3ZlZCBhbmQKLQkgKiB3ZSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tIG91ciBsaXN0LiBUaGlzIGlzIGFuIGludGVybmFsIEFQSSBvbmx5IGZvciB1c2UgYnkKLQkgKiB0aGUgYWRhcHRlciBpdHNlbGYuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFkYXB0ZXIoQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSkgewotCQlmSW50cm9zcGVjdGVkLnJlbW92ZShhLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcHJvY2Vzc1F1ZXVlKCkgewotCQlXZWFrVmFsdWUgd3Y7Ci0JCXdoaWxlICgod3YgPSAoV2Vha1ZhbHVlKSBmUmVmUS5wb2xsKCkpICE9IG51bGwpIHsKLQkJCWZJbnRyb3NwZWN0ZWQucmVtb3ZlKHd2LmdldEtleSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0NsYXNzQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvQ2xhc3NBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYWIzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvQ2xhc3NBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN1cGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5QYWNrYWdlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIEJlYW5pbmZvIGFkYXB0ZXIgZm9yIGRvaW5nIGludHJvc3BlY3Rpb24gb24gYSBKYXZhIE1vZGVsIGNsYXNzLgotICogPHA+Ci0gKiBUaGUgZmlyc3QgdGltZSBhIGludHJvc3BlY3QgcmVxdWVzdCBpcyBtYWRlLCBpdCB3aWxsIHVzZSB0aGUgQ2xhc3NFbnRyeSBmcm9tIHRoZSBjYWNoZSBjb250cm9sbGVyIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgbG9hZCBmcm9tIHRoZQotICogY2FjaGUgb3IgZG8gYSBjb21wbGV0ZSBpbnRyb3NwZWN0aW9uLiBBZnRlciB0aGF0IGl0IHdpbGwgYWx3YXlzIGRvIGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiB3aGVuIGl0IGlzIG1hcmtlZCBhcyBuZWVkaW5nIGludHJvc3BlY3Rpb24uCi0gKiBUaGlzIGlzIGJlY2F1c2UgdGhlIGNhY2hlIGlzIHVzZWxlc3MgdG8gdXMgdGhlbi4gQXQgdGhhdCBwb2ludCBpbiB0aW1lIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIG9yIG9uZSBvZiBvdXIgc3VwZXJjbGFzc2VzIG9yIG9uZSBvZiAKLSAqIG91dGVyIGNsYXNzZXMgaGFzIGNoYW5nZWQsIHRoZXJlYnkgcmVxdWlyaW5nIHVzIHRvIHJlaW50cm9zcGVjdCwgdGhlIGNhY2hlIGlzIGludmFsaWQgYXQgdGhhdCBwb2ludC4gQWxzbyBvbmNlIHdlIGRpZCBhbiBpbnRyb3NwZWN0aW9uIHdlCi0gKiBkb24ndCB3YW50IHRvIGRvIGEgbG9hZCBmcm9tIGNhY2hlIGJ1dCBpbnN0ZWFkIGRvIGEgbWVyZ2UgYmVjYXVzZSBzb21lb25lIG1heSBvZiBiZWVuIGhvbGRpbmcgb250byB0aGUgZmVhdHVyZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAqIHRocm93IHRoZW0gYXdheSB1bm5lY2Vzc2FyaWx5LgotICogPHA+IAotICogVE9ETyBOZWVkIHRvIHJlLWxvb2sgaW50byB0aGlzIHRvIHNlZSBpZiB3ZSBjYW4gZG8gYSBtZXJnZSB3aXRoIHRoZSBjYWNoZSBmaWxlIGJlY2F1c2UgaWYgaXQgd2FzIGFuIGV4dGVybmFsIGphciBhbmQgaXQgaGFzIG5vdyBnb25lCi0gKiB2YWxpZCwgd2h5IHdhc3RlIHRpbWUgcmVpbnRyb3NwZWN0aW5nLiBCdXQgdGhpcyBuZWVkcyB0byBiZSBjYXJlZnVsbHkgdGhvdWdodCBhYm91dC4gCi0gKiA8cD4gCi0gKiBUaGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0gKiB3aWxsIGF1dG9tYXRpY2FsbHkgbWFyayBhbnkgc3ViY2xhc3NlcyAoYm90aCB0aGUgQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kIHRoZSBDbGFzc0VudHJ5KSBhcyBiZWluZyBzdGFsZSBmb3IgdXMuIFRoYXQgd2F5IHdlIGRvbid0IG5lZWQKLSAqIHRvIHdhc3RlIHRpbWUgY2hlY2tpbmcgdGhlIGNlIGFuZCBzdXBlcmNsYXNzZXMgZXZlcnl0aW1lLiBXZSB3aWxsIGtlZXAgdGhlIENsYXNzRW50cnkgYXJvdW5kIHNpbXBseSB0byBtYWtlIHRoZSBtYXJraW5nIG9mIGl0IGFzIHN0YWxlIGVhc2llciBmb3IgdGhlCi0gKiByZXNvdXJjZSBsaXN0ZW5lci4gRmluZGluZyB0aGUgY2UgZXZlcnl0aW1lIHdvdWxkIGJlIGV4cGVuc2l2ZS4KLSAqIDxwPiAKLSAqIFRoaXMgaXMgdGhlIHByb2Nlc3MgZm9yIGRldGVybWluaW5nIGlmIGludHJvc3BlY3Rpb24gcmVxdWlyZWQ6Ci0gKiA8b2w+Ci0gKiA8bGk+SWYgbmVlZHNJbnRyb3NwZWN0aW9uIGZsYWcgaXMgZmFsc2UsIHRoZW4gZG8gbm90aGluZy4gRG9lc24ndCBuZWVkIGludHJvc3BlY3Rpb24uCi0gKiA8bGk+SWYgY2xhc3MgaXMgdW5kZWZpbmVkLCB0aGVuIGp1c3Qgc2V0IHVwIGZvciBhbiB1bmRlZmluZWQgY2xhc3MgYW5kIHJldHVybi4gKEluIHRoaXMgY2FzZSB0aGUgQ0Ugc2hvdWxkIGJlIHRocm93biBhd2F5LCBpdCBzaG91bGQgb2YgYmVlbiBkZWxldGVkKS4KLSAqIDxsaT5JZiBuZXZlciBpbnRyb3NwZWN0ZWQgKG5vdCBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCksIGdldCB0aGUgQ0UsIGdldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBjYWxsIGlzU3RhbGVTdGFtcC4gVGhpcyBkZXRlcm1pbmVzIGlmIHRoaXMKLSAqIHN0YW1wIG9yIGFueSBzdXBlciBjbGFzcyBzdGFtcCBpcyBzdGFsZSB3cnQgdG8gY3VycmVudCBzdGFtcC4gSWYgaXQgaXMgbm90IHN0YWxlLCB0aGVuIGxvYWQgZnJvbSBjYWNoZSBiZWNhdXNlIHRoZSBjYWNoZSBpcyBnb29kLiAKLSAqIDxsaT5JZiBubyBjYWNoZSBvciBjYWNoZSBpcyBzdGFsZSBvciBoYXMgaW50cm9zcGVjdGVkIG9uY2UsIHRoZW4gaW50cm9zcGVjdCBhbmQgcmVwbGFjZSBjYWNoZS4KLSAqIDwvb2w+Ci0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElJbnRyb3NwZWN0aW9uQWRhcHRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9QUk9QRVJUSUVTID0gIlJlZmxlY3QgcHJvcGVydGllcyI7CS8vIFJlZmxlY3QgcHJvcGVydGllcyBpbiBJREUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX0VYVEVOU0lPTlMgPSAiQXBwbHkgT3ZlcnJpZGVzIjsJLy8gQXBwbHkgb3ZlcnJpZGUgZmlsZXMgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9JTlRST1NQRUNUID0gIlJlbW90ZSBJbnRyb3NwZWN0IjsJLy8gSW50cm9zcGVjdCBvbiByZW1vdGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVFJPU1BFQ1QgPSAiSW50cm9zcGVjdCI7CS8vIFN0cmFpZ2h0IGludHJvc3BlY3Rpb24sIHdoZXRoZXIgbG9hZCBmcm9tIGNhY2hlIG9yIGludHJvc3BlY3QuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0ZST01fQ0FDSEUgPSAiTG9hZCBmcm9tIENhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZ2V0QmVhbmluZm9DbGFzc0FkYXB0ZXIoRU9iamVjdCBqYykgewotCQlyZXR1cm4gKEJlYW5pbmZvQ2xhc3NBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGpjLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhciBvdXQgdGhlIGludHJvc3BlY3Rpb24gYmVjYXVzZSBpbnRyb3NwZWN0aW9uIGlzIGJlaW5nIGNsb3NlZCBvciByZW1vdmVkIGZyb20gdGhlIHByb2plY3QuCi0JICogRG9uJ3Qgd2FudCBhbnl0aGluZyBoYW5naW5nIGFyb3VuZCB0aGF0IHdlIGhhZCBkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFySW50cm9zcGVjdGlvbigpIHsKLQkJLy8gQ2xlYXIgb3V0IHRoZSBiZWFuZGVjb3JhdG9yIGlmIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgYmVhbkl0ciA9IGdldEphdmFDbGFzcygpLmdldEVBbm5vdGF0aW9uc0ludGVybmFsKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJlYW5JdHIuaGFzTmV4dCgpKSB7Ci0JCQlFQW5ub3RhdGlvbiBkZWMgPSAoRUFubm90YXRpb24pIGJlYW5JdHIubmV4dCgpOwotCQkJaWYgKGRlYyBpbnN0YW5jZW9mIEJlYW5EZWNvcmF0b3IpIHsKLQkJCQlCZWFuRGVjb3JhdG9yIGRlY29yID0gKEJlYW5EZWNvcmF0b3IpIGRlYzsKLQkJCQlpZiAoZGVjb3IuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMKSB7Ci0JCQkJCWJlYW5JdHIucmVtb3ZlKCk7Ci0JCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBkZWNvcikuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCX0gZWxzZSB7Ci0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcigoQmVhbkRlY29yYXRvcikgZGVjKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gQ2xlYXIgb3V0IHRoZSBmZWF0dXJlcyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgcHJvcEl0ciA9IGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwcm9wSXRyLmhhc05leHQoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHByb3AgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wSXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIHBkSXRyID0gcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBkSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgcGRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY29yYXRvcikgewotCQkJCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgZGVjOwotCQkJCQlpZiAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKHBkKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlwZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIHByb3BlcnR5LgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHBkKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCX0KLQkJCQkJaWYgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJcHJvcEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBmZWF0dXJlIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHByb3ApLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIENsZWFyIG91dCB0aGUgb3BlcmF0aW9ucyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3Igb3Blckl0ciA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3Blckl0ci5oYXNOZXh0KCkpIHsKLQkJCUVPcGVyYXRpb24gb3BlciA9IChFT3BlcmF0aW9uKSBvcGVySXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIG1kSXRyID0gb3Blci5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG1kSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgbWRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBNZXRob2REZWNvcmF0b3IpIHsKLQkJCQkJTWV0aG9kRGVjb3JhdG9yIG1kID0gKE1ldGhvZERlY29yYXRvcikgZGVjOwotCQkJCQlpZiAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKG1kKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQltZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIG9wZXJhdGlvbi4KLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBtZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQl9Ci0JCQkJCWlmIChtZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUwpIHsKLQkJCQkJCW9wZXJJdHIucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgb2VwcmF0aW9uIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG9wZXIpLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIENsZWFyIG91dCB0aGUgZXZlbnRzIHRoYXQgd2UgaW1wbGljaXRseSBjcmVhdGVkLgotCQkJSXRlcmF0b3IgZXZ0SXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChldnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUV2ZW50IGV2dCA9IChKYXZhRXZlbnQpIGV2dEl0ci5uZXh0KCk7Ci0JCQkJSXRlcmF0b3IgZWRJdHIgPSBldnQuZ2V0RUFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgZWRJdHIubmV4dCgpOwotCQkJCQlpZiAoZGVjIGluc3RhbmNlb2YgRXZlbnRTZXREZWNvcmF0b3IpIHsKLQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gKEV2ZW50U2V0RGVjb3JhdG9yKSBkZWM7Ci0JCQkJCQlpZiAoZWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihlZCk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGV2ZW50LgotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBlZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJfQotCQkJCQkJaWYgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWV2dEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBldmVudCBpdHNlbGYKLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZXZ0KS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCi0JCX0KLQotCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWNsZWFySW50cm9zcGVjdGlvbigpOwkvLyBGaXJzdCBnZXQgcmlkIG9mIHRoZSBvbmVzIHdlIGRpZCBzbyB0aGF0IHRoZXkgYXJlIG1hcmtlZCBhcyBwcm94aWVzLgotCQkKLQkJLy8gQ2xlYXIgb3V0IHRoZSBhbm5vdGF0aW9ucy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGF0dHJpYnV0ZXMuCi0JCWdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLmNsZWFyKCk7CQotCQkvLyBDbGVhciBvdXQgdGhlIG9wZXJhdGlvbnMuCi0JCWdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGV2ZW50cy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuY2xlYXIoKTsKLQkJCi0JCXJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID0gTkVWRVJfUkVUUklFVkVEX0VYVEVOU0lPTl9ET0NVTUVOVDsJLy8gU2luY2Ugd2UgY2xlYXJlZCBldmVyeXRoaW5nLCBnbyBiYWNrIHRvIG5vIGRvYyBhcHBsaWVkLgotCX0KLQkKLQotCS8qKgotCSAqIEB2ZXJzaW9uIAkxLjAKLQkgKiBAYXV0aG9yCi0JICovCi0KLQkvLyBBIFVSSSB0aGF0IHdpbGwgbmV2ZXIgcmVzb2x2ZS4gVXNlZCB0byBtYXJrIGFuIG9iamVjdCBhcyBubyBsb25nZXIgdmFsaWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgQkFEX1VSSSA9IFVSSS5jcmVhdGVVUkkoImJhZHVyaSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc0ludHJvc3BlY3Rpb24gPSB0cnVlOwotCQotCXByb3RlY3RlZCBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGNsYXNzRW50cnk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRyb3NwZWN0aW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2luZ0FsbFByb3BlcnRpZXM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvaW5nQWxsT3BlcmF0aW9uczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9pbmdBbGxFdmVudHM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludAotCQlORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UID0gMCwKLQkJUkVUUklFVkVEX1JPT1RfT05MWSA9IDEsCi0JCVJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UID0gMiwKLQkJQ0xFQVJfRVhURU5TSU9OUyA9IDM7Ci0JcHJvdGVjdGVkIGludCByZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9IE5FVkVSX1JFVFJJRVZFRF9FWFRFTlNJT05fRE9DVU1FTlQ7Ci0KLQlwcm90ZWN0ZWQgQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBzdGFsZUZhY3Rvcnk7IC8vIFdoZW4gcmVmZXJlbmNlIG5vdCBudWxsLCB0aGVuIHRoaXMgZmFjdG9yeSBpcyBhIHN0YWxlIGZhY3RvcnkgYW5kIAotCS8vIGEgbmV3IG9uZSBpcyBuZWVkZWQgd2hlbiB0aGUgZmFjdG9yeSByZXR1cm5lZCA9PSB0aGlzIG9uZS4KLQkvLyBJdCBpcyBhIFdlYWtSZWYgc28gdGhhdCBpZiB0aGUgZmFjdG9yeSBnb2VzIGF3YXkgb24gaXRzIG93bgotCS8vIHRoYXQgd2UgZG9uJ3QgaG9sZCBvbnRvIGl0LgotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgcHJvcGVydGllcy4gVXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3Ci0JLy8gcHJvcGVydHkgdG8gdXNlIHRoZSBvbGQgb25lLiBJdCBpcyBjbGVhcmVkIG91dCBhdCB0aGUgZW5kIG9mIGF0dHJpYnV0ZSBpbnRyb3NwZWN0aW9uLgotCS8vIEl0IGlzIG9ubHkgYnVpbHQgb25jZSBkdXJpbmcgYXR0cmlidXRlIGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBmUHJvcGVydGllc01hcCBhbmQKLQkvLyBpdCBpcyBub3QgdGhlIHZhbHVlIEJvb2xlYW4uRkFMU0UgaW4gdGhlIG1hcCwgYW5kIHRoZSBlbnRyeSBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQuIFRoaXMgbWVhbnMgdGhpcwotCS8vIHdhcyBhbiBpbXBsaWNpdCBlbnRyeSBmcm9tIHRoZSBwcmV2aW91cyBpbnRyb3NwZWN0aW9uIGFuZCB3YXMgbm90IHJlLWNyZWF0ZWQgaW4gdGhpcyBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBwcm9wZXJ0aWVzTWFwOwotCXByaXZhdGUgTGlzdCBmZWF0dXJlc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkKLQkvLyBBIHRlbXBvcmFyeSBoYXNobWFwIG9mIHRoZSBsb2NhbCBvcGVyYXRpb25zLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBvcGVyYXRpb24gdG8gcmV1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2Ygb3BlcmF0aW9uIGludHJvc3BlY3Rpb24uCi0JLy8gSXQgaXMgb25seSBidWlsdCBvbmNlIGR1cmluZyBvcGVyYXRpb24gaW50cm9zcGVjdGlvbiBzbyB0aGF0IHdlIGhhdmUgdGhlIHNuYXBzaG90Ci0JLy8gb2YgYmVmb3JlIHRoZSBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBvcGVyYXRpb25zTWFwOwotCXByaXZhdGUgRUxpc3Qgb3BlcmF0aW9uc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkvLyBBIHNldCBvZiBvcGVyYXRpb25zIGFzIHdlIGNyZWF0ZSB0aGVtIHNvIHRoYXQgd2Ugd2hpY2ggb25lcyB3ZSBhZGRlZC9rZXB0IGFuZCB3aGljaCBhcmUgbm8gbG9uZ2VyIGluIHVzZSBhbmQgY2FuIGJlIHJlbW92ZWQuCQotCS8vIElmIHRoZXkgYXJlbid0IGluIHRoaXMgc2V0IGF0IHRoZSBlbmQsIHRoZW4gd2Uga25vdyBpdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBpdCBpcyBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JcHJpdmF0ZSBIYXNoU2V0IG5ld29wZXJhdGlvbnM7IAotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgZXZlbnRzLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBldmVudCB0byB1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2YgZXZlbnQgaW50cm9zcGVjdGlvbi4KLQkvLyBJdCBpcyBvbmx5IGJ1aWx0IG9uY2UgZHVyaW5nIGV2ZW50IGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBldmVudHMgYW5kIHNlZSBpZiBpdCBleGlzdHMgaW4gdGhlIGZFdmVudHNNYXAgYW5kCi0JLy8gaXQgaXMgbm90IHRoZSB2YWx1ZSBCb29sZWFuLkZBTFNFIGluIHRoZSBtYXAsIGFuZCB0aGUgZW50cnkgaXMgaW1wbGljaXRseSBjcmVhdGVkLiBUaGlzIG1lYW5zIHRoaXMKLQkvLyB3YXMgYW4gaW1wbGljaXQgZW50cnkgZnJvbSB0aGUgcHJldmlvdXMgaW50cm9zcGVjdGlvbiBhbmQgd2FzIG5vdCByZS1jcmVhdGVkIGluIHRoaXMgaW50cm9zcGVjdGlvbi4KLQlwcml2YXRlIEhhc2hNYXAgZXZlbnRzTWFwOwotCXByaXZhdGUgRUxpc3QgZXZlbnRzUmVhbExpc3Q7IC8vIFRlbXAgcG9pbnRlciB0byB0aGUgcmVhbCBsaXN0IHdlIGFyZSBidWlsZGluZy4gSXQgaXMgdGhlIHRydWUgbGlzdCBpbiBqYXZhIGNsYXNzLgotCi0JcHJpdmF0ZSBCb29sZWFuIGRlZmF1bHRCb3VuZDsKLQkvLyBXaGV0aGVyIHRoaXMgY2xhc3MgaXMgZGVmYXVsdCBib3VuZCBvciBub3QgKGkuZS4gZG9lcyB0aGlzIGNsYXNzIGltcGxlbWVudCBhZGQvcmVtb3ZlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lci4gSWYgbnVsbCwgdGhlbiBub3QgeWV0IHF1ZXJpZWQuCi0KLQlwdWJsaWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgamF2YSBjbGFzcyBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gYSBsaXZlIHJlc291cmNlLiBJdCBoYXBwZW5zIGR1cmluZyB1bmxvYWRpbmcKLQkgKiB0aGF0IHdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgcmVzb3VyY2UgKGJlY2F1c2UgdGhlIGphdmFwYWNrYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZAotCSAqIHVubG9hZGVkKSBvciB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdW5sb2FkZWQsIGJ1dCB0aGUgdW5sb2FkaW5nIHByb2Nlc3Mgd2lsbCBzdGlsbCAKLQkgKiBjYWxsIGFjY2Vzc29ycyBvbiB0aGlzIGphdmEgY2xhc3MsIHdoaWNoIHdpbGwgY29tZSBvdmVyIGhlcmUuIEluIHRob3NlIGNhc2VzIHdlIHNob3VsZCB0cmVhdCBhcwotCSAqIGludHJvc3BlY3Rpb24gY29tcGxldGVkIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZUNvbm5lY3RlZCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0SmF2YUNsYXNzKCkuZVJlc291cmNlKCk7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeS5nZXRSZWdpc3RyeSgpOwotCQlpZiAoc3RhbGVGYWN0b3J5ICE9IG51bGwgJiYgZmFjdG9yeSA9PSBzdGFsZUZhY3RvcnkuZ2V0KCkpIHsKLQkJCS8vIFdlIG5lZWQgdG8gcmVjeWNsZSB0aGUgZmFjdG9yeS4gVGhlIHJldHVybmVkIGZhY3RvcnkgaXMgdGhlIHNhbWUgZmFjdG9yeSB3aGVuIGl0IHdlbnQgc3RhbGUuCi0JCQlmYWN0b3J5ID0gYWRhcHRlckZhY3RvcnkucmVjeWNsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJc3RhbGVGYWN0b3J5ID0gbnVsbDsgLy8gV2hldGhlciB3ZSByZWN5Y2xlZCBvciBub3QsIGl0IGlzIG5vIGxvbmdlciBzdGFsZS4KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGhhcyBiZWVuIG1hcmtlZCBhcyBzdGFsZS4gTmVlZGVkCi0JICogYnkgdGhlIHVzZXJzIHNvIHRoYXQgdGhleSBjYW4gcmVjeWNsZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJcmV0dXJuIHN0YWxlRmFjdG9yeSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkuZXF1YWxzKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXAgaXMga2V5ZWQgYnkgbmFtZS4gSXQgaXMgYSBzbmFwc2hvdCBvZiB0aGUgcHJvcGVydGllcyBhdCB0aGUKLQkgKiB0aW1lIHRoZSBpbnRyb3NwZWN0aW9uL3JlZmxlY3Rpb24gb2YgcHJvcGVydGllcyB3YXMgc3RhcnRlZC4gSXQgaXMgdXNlZAotCSAqIGZvciBxdWljayBsb29rdXAuCi0JICoKLQkgKiBPbmNlIGEgcHJvcGVydHkgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0UHJvcGVydGllc01hcCgpIHsKLQkJaWYgKHByb3BlcnRpZXNNYXAgPT0gbnVsbCkgewotCQkJTGlzdCBsb2NhbEZlYXR1cmVzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCQlwcm9wZXJ0aWVzTWFwID0gbmV3IEhhc2hNYXAobG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkJSXRlcmF0b3IgaXRyID0gbG9jYWxGZWF0dXJlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQkJcHJvcGVydGllc01hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCBpdCBvbmNlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGdldHRpbmcgaXQgb3ZlciBhbmQgb3Zlci4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGZWF0dXJlc0xpc3QoKSB7Ci0JCWlmIChmZWF0dXJlc1JlYWxMaXN0ID09IG51bGwpCi0JCQlmZWF0dXJlc1JlYWxMaXN0ID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCXJldHVybiBmZWF0dXJlc1JlYWxMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSBtYXAgaXMga2V5ZWQgYnkgbG9uZ05hbWUuIElmIGEgTWV0aG9kIGlzIHBhc3NlZCBpbiwgdGhlbiB0aGUKLQkgKiBpZCBvZiB0aGUgbWV0aG9kIGlzIHVzZWQgKHRoaXMgaXMgaW4gcmVmbGVjdGlvbiksIGlmIGFuIElCZWFuUHJveHkKLQkgKiBpcyBwYXNzZWQgaW4sIHRoZW4gYW4gaWQgaXMgY3JlYXRlZCBhbmQgbG9va2VkIHVwICh0aGlzIGlzIGluIGludHJvc3BlY3Rpb24pLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgYmVoYXZpb3JzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBiZWhhdmlvcnMgc3RhcnRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXRPcGVyYXRpb25zTWFwKCkgewotCQlpZiAob3BlcmF0aW9uc01hcCA9PSBudWxsKSB7Ci0JCQlMaXN0IGxvY2FscyA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKTsKLQkJCWludCBsID0gbG9jYWxzLnNpemUoKTsKLQkJCW9wZXJhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcChsKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJRU9wZXJhdGlvbiBvcCA9IChFT3BlcmF0aW9uKSBsb2NhbHMuZ2V0KGkpOwotCQkJCW9wZXJhdGlvbnNNYXAucHV0KGZvcm1Mb25nTmFtZShvcCksIG9wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3BlcmF0aW9uc01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldE9wZXJhdGlvbnNMaXN0KCkgewotCQlpZiAob3BlcmF0aW9uc1JlYWxMaXN0ID09IG51bGwpCi0JCQlvcGVyYXRpb25zUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFT3BlcmF0aW9uc0ludGVybmFsKCk7Ci0JCXJldHVybiBvcGVyYXRpb25zUmVhbExpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1hcCBpcyBrZXllZCBieSBuYW1lLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgZXZlbnRzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBldmVudHMgc3RhcnRlZC4KLQkgKgotCSAqIE9uY2UgYW4gZXZlbnQgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RXZlbnRzTWFwKCkgewotCQlpZiAoZXZlbnRzTWFwID09IG51bGwpIHsKLQkJCUxpc3QgbG9jYWxzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCk7Ci0JCQlldmVudHNNYXAgPSBuZXcgSGFzaE1hcChsb2NhbHMuc2l6ZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ciA9IGxvY2Fscy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhRXZlbnQgZXZlbnQgPSAoSmF2YUV2ZW50KSBpdHIubmV4dCgpOwotCQkJCWV2ZW50c01hcC5wdXQoZXZlbnQuZ2V0TmFtZSgpLCBldmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50c01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldEV2ZW50c0xpc3QoKSB7Ci0JCWlmIChldmVudHNSZWFsTGlzdCA9PSBudWxsKQotCQkJZXZlbnRzUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQkJcmV0dXJuIGV2ZW50c1JlYWxMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGludHJvc3BlY3RJZk5lY2Vzc2FyeSgpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW50cm9zcGVjdElmTmVjZXNzYXJ5KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZG9JbnRyb3NwZWN0aW9uID0gbmVlZHNJbnRyb3NwZWN0aW9uICYmICFpc0ludHJvc3BlY3Rpbmc7IAotCQkJaWYgKGRvSW50cm9zcGVjdGlvbikKLQkJCQlpc0ludHJvc3BlY3RpbmcgPSB0cnVlOwotCQl9Ci0JCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCWJvb2xlYW4gZGlkSW50cm9zcGVjdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsJCQkJCi0JCQkJaW50cm9zcGVjdChkb09wZXJhdGlvbnMpOwotCQkJCWRpZEludHJvc3BlY3Rpb24gPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCAKLQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQllKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0ludHJvc3BlY3RpbmcgPSBmYWxzZTsKLQkJCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gIWRpZEludHJvc3BlY3Rpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBlbnRyeS4gCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGdldENsYXNzRW50cnkoKSB7Ci0JCXJldHVybiBjbGFzc0VudHJ5OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlQ2FjaGUoKSB7Ci0JCS8vIFdlIGNoZWNrIG91ciBsZXZlbCwgd2UgYXNzdW1lIG5vdCBzdGFsZSB1bmxlc3MgQ0Ugc2F5cyBzdGFsZS4KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBXZSBtYXkgYWxyZWFkeSBoYXZlIGEgY2xhc3MgZW50cnkgZHVlIHRvIGEgc3ViY2xhc3MgZG9pbmcgYSBjaGVjaywgc28gaWYgd2UgZG8sIHdlJ2xsIHVzZSBpdC4gRWxzZSB3ZSdsbCBnZXQgdGhlIGxhdGVzdCBvbmUuCi0JCQlpZiAoY2xhc3NFbnRyeSA9PSBudWxsKQotCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCWlmIChjbGFzc0VudHJ5ICE9IG51bGwpIHsKLQkJCQkvLyBXZSBoYXZlIGEgY2FjaGUgdG8gY2hlY2suCi0JCQkJbG9uZyBtb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgfHwgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBhcmUgc3RhbGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQl9Ci0JCQotCQkvLyBOb3cgdHJ5IHRoZSBzdXBlcnMgdG8gc2VlIGlmIHdlIGFyZSBvdXQgb2YgZGF0ZSB0byB0aGVtLgotCQkvLyBOb3RlOiBPbmx5IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmUgZVN1cGVyVHlwZS4KLQkJTGlzdCBzdXBlcnMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQlpZiAoIXN1cGVycy5pc0VtcHR5KCkpIHsKLQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKChFT2JqZWN0KSBzdXBlcnMuZ2V0KDApKTsKLQkJCUNsYXNzRW50cnkgc3VwZXJDRSA9IGJjYS5nZXRDbGFzc0VudHJ5KCk7Ci0JCQkvLyBJZiBzdXBlciBpcyBkZWZpbmVkIGFuZCBvdXQgb2YgZGF0ZSBkb24ndCB1c2UgY2FjaGUuIElmIHN1cGVyIGlzIHVuZGVmaW5lZCBhbmQgc3VwZXIgbW9kaWZpY2F0aW9uIHN0YW1wIGlzIG5vdCBzdXBlcl91bmRlZmluZWQsCi0JCQkvLyB0aGVuIHRoYXQgbWVhbnMgaXQgd2FzIGRlZmluZWQgYXQgdGltZSBvZiBjYWNoZSBhbmQgbm93IG5vdCBkZWZpbmVkLCBzbyBkb24ndCB1c2UgY2FjaGUuCi0JCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJaWYgKHN1cGVyQ0UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBjbGFzc0VudHJ5LmdldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBPdXQtb2YtZGF0ZSB3cnQvc3VwZXIuCi0JCQl9IGVsc2UgaWYgKGNsYXNzRW50cnkuZ2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcCgpICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIHdhcyBwcmV2aW91c2x5IGRlZmluZWQsIGFuZCBub3cgdW5kZWZpbmVkLCBzbyBvdXQgb2YgZGF0ZS4KLQkJCVN0cmluZ1tdIGlOYW1lcyA9IGNsYXNzRW50cnkuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKLQkJCWlmIChpTmFtZXMgIT0gbnVsbCkgewotCQkJCWlmIChpTmFtZXMubGVuZ3RoICE9IHN1cGVycy5zaXplKCkgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIFdlIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHN1cGVycywgc28gc3RhbGUuCi0JCQkJLy8gTm93IHRoZSBpbnRlcmZhY2VzIG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIsIGJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnksIHNvIHdlJ2xsIHVzZSBPKG4yKSBsb29rdXAuIFdlJ2xsIHRyeSBzdGFydGluZyBhdAotCQkJCS8vIHRoZSBzYW1lIGluZGV4IGp1c3QgaW4gY2FzZS4gVGhhdCB3YXkgaWYgdGhleSBhcmUgdGhlIHNhbWUgb3JkZXIgaXQgd2lsbCBiZSBsaW5lYXIgaW5zdGVhZC4gTW9zdCBsaWtlbHkgd2lsbCBiZSBzYW1lIG9yZGVyLgotCQkJCWxvbmdbXSBpU3RhbXAgPSBjbGFzc0VudHJ5LmdldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcygpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IGlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgc3VwZXJzLmdldChpKTsKLQkJCQkJU3RyaW5nIGludE5hbWUgPSAoamF2YUNsYXNzKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJCQkvLyBGaW5kIGl0IGluIHRoZSBuYW1lcyBsaXN0LgotCQkJCQlpbnQgc3RvcCA9IGktMTsKLQkJCQkJaW50IGluZHggPSBzdG9wOwkvLyBTdGFydCBhdCB0aGUgc3RvcCwgd2hlbiB3ZSBoaXQgaXQgYWdhaW4gd2Ugd2lsbCBiZSBkb25lLgotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWRvIHsKLQkJCQkJCWlmIChpTmFtZXNbaW5keF0uZXF1YWxzKGludE5hbWUpKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlICgoKytpbmR4KSVpTmFtZXMubGVuZ3RoICE9IHN0b3ApOwotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCBmaW5kIGl0LCBzbyB3ZSBhcmUgc3RhbGUuXQotCQkJCQkKLQkJCQkJc3VwZXJDRSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKGphdmFDbGFzcykuZ2V0Q2xhc3NFbnRyeSgpOwotCQkJCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoc3VwZXJDRS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IGlTdGFtcFtpbmR4XSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE91dC1vZi1kYXRlIHdydC9pbnRlcmZhY2UuCi0JCQkJCX0gZWxzZSBpZiAoaVN0YW1wW2luZHhdICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJCXJldHVybiBmYWxzZTsJLy8gd2FzIHByZXZpb3VzbHkgZGVmaW5lZCwgYW5kIG5vdyB1bmRlZmluZWQsIHNvIG91dCBvZiBkYXRlLgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWYgd2UgZ290IGhlcmUgZXZlcnl0aGluZyBpcyBvay4KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlT3ZlcnJpZGVDYWNoZSgpIHsKLQkJLy8gV2UgY2hlY2sgb3VyIGNvbmZpZyBzdGFtcC4KLQkJLy8gVE9ETyBpbiBmdXR1cmUgY2FuIHdlIGxpc3RlbiBmb3IgY29uZmlnIGNoYW5nZXMgYW5kIG1hcmsgY2xhc3NlcyBzdGFsZSBpZiB0aGUgY29uZmlnIGNoYW5nZXM/Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gV2UgbWF5IGFscmVhZHkgaGF2ZSBhIGNsYXNzIGVudHJ5IGR1ZSB0byBhIHN1YmNsYXNzIGRvaW5nIGEgY2hlY2ssIHNvIGlmIHdlIGRvLCB3ZSdsbCB1c2UgaXQuIEVsc2Ugd2UnbGwgZ2V0IHRoZSBsYXRlc3Qgb25lLgotCQkJaWYgKGNsYXNzRW50cnkgPT0gbnVsbCkKLQkJCQljbGFzc0VudHJ5ID0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0UuZ2V0Q2xhc3NFbnRyeShnZXRKYXZhQ2xhc3MoKSk7Ci0JCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKSB7Ci0JCQkJLy8gV2UgaGF2ZSBhIGNhY2hlIHRvIGNoZWNrLgotCQkJCS8vIEEgc2FuaXR5IGNoZWNrLCBpZiB0aGlzIHdhcyBhbiBvbGQsIGJ1dCBub3cgZGVsZXRlZCBvbmUgd2Ugd2FudCB0byB0aHJvdyBpdCBhd2F5IGFuZCBnZXQgaXQgYWdhaW4uIEl0IG1heSBub3cgYmUgdmFsaWQuCi0JCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpIHsKLQkJCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKQotCQkJCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBoYXZlIGJlZW4gZGVsZXRlZC4gUHJvYmFibHkgc2hvdWxkbid0IG9mIGdvdHRvbiBoZXJlIGluIHRoaXMgY2FzZS4KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQkJcmV0dXJuIGNsYXNzRW50cnkuZ2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKCkgPT0gUGxhdGZvcm0uZ2V0UGxhdGZvcm1BZG1pbigpLmdldFN0YXRlKGZhbHNlKS5nZXRUaW1lU3RhbXAoKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgY2FjaGUgZm9yIHRoaXMgZW50cnkgaXMgc3RhbGUgY29tcGFyZWQgdG8gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCwgb3IgaWYgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBpdHNlbGYgaXMgc3RhbGUsIG1lYW5pbmcKLQkgKiBzdWJjbGFzcyB3YXMgc3RhbGUgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdFN0YW1wIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0LiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdlIGNhbiB1c2UgdGhlIGluY29taW5nIGNhY2hlIHN0YW1wLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblVzZUNhY2hlKGxvbmcgcmVxdWVzdFN0YW1wKSB7Ci0JCWxvbmcgbW9kU3RhbXA7Ci0JCS8vIE5vdyBnZXQgdGhlIGN1cnJlbnQgbW9kIHN0YW1wIGZvciB0aGlzIGNsYXNzIHNvIHdlIGNhbiBjb21wYXJlIGl0LgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFdlIG1heSBhbHJlYWR5IGhhdmUgYSBjbGFzcyBlbnRyeSBkdWUgdG8gYSBzdWJjbGFzcyBkb2luZyBhIGNoZWNrLCBzbyBpZiB3ZSBkbywgd2UnbGwgdXNlIGl0LiBFbHNlIHdlJ2xsIGdldCB0aGUgbGF0ZXN0IG9uZS4KLQkJCWlmIChjbGFzc0VudHJ5ID09IG51bGwpCi0JCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCS8vIFdlIGhhdmUgYSBjYWNoZSB0byBjaGVjay4KLQkJCQltb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBTaW5jZSB3ZSBhcmUgc3RhbGUsIGNoaWxkIGFza2luZyBxdWVzdGlvbiBtdXN0IGFsc28gYmUgc3RhbGUgYW5kIGNhbid0IHVzZSB0aGUgY2FjaGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCBzbyBjaGlsZCBtdXN0IGJlIHN0YWxlIHRvby4KLQkJfQotCQkvLyBJZiB0aGUgcmVxdWVzdGVkIHN0YW1wIGlzIG5vdCB0aGUgc2FtZSBhcyBvdXJzLCB0aGVuIGl0IGlzIG91dCBvZiBkYXRlIChpdCBjb3VsZG4ndCBiZSBuZXdlciBidXQgaXQgY291bGQgYmUgb2xkZXIpLgotCQlyZXR1cm4gcmVxdWVzdFN0YW1wID09IG1vZFN0YW1wOwotCX0KLQkJCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0aHJvdWdoIGludHJvc3BlY3RJZk5lY2Vzc2FyeSBzbyB0aGF0IGZsYWdzIGFyZSBzZXQgY29ycmVjdGx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRyb3NwZWN0KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCUlCZWFuUHJveHkgYmVhbmluZm8gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzUmVzb3VyY2VDb25uZWN0ZWQoKSkgewotCQkJCS8vIFNlZSBpZiBhcmUgdmFsaWQga2luZCBvZiBjbGFzcy4KLQkJCQlpZiAoZ2V0SmF2YUNsYXNzKCkuZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKSB7Ci0JCQkJCS8vIE5vdCB2YWxpZCwgZG9uJ3QgbGV0IGFueSBmdXJ0aGVyIGludHJvc3BlY3Rpb24gb2NjdXIuCi0JCQkJCS8vIE1hcmsgdGhhdCB3ZSd2ZSBkb25lIGFsbCBpbnRyb3NwZWN0aW9ucyBzbyBhcyBub3QgdG8gd2FzdGUgdGltZSB1bnRpbCB3ZSBnZXQgbm90aWZpZWQgdGhhdCBpdCBoYXMgYmVlbiBhZGRlZAotCQkJCQkvLyBiYWNrIGluLgotCQkJCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCQkJCWNsYXNzRW50cnkubWFya0RlbGV0ZWQoKTsJLy8gbWFyayBpdCBkZWxldGVkIGluIGNhc2Ugc3RpbGwgc2l0dGluZyBpbiBjYWNoZSAobWF5YmUgYmVjYXVzZSBpdCB3YXMgaW4gYW4gZXh0ZXJuYWwgamFyLCB3ZSBjYW4ndCBrbm93IGlmIGRlbGV0ZWQgd2hlbiBqYXIgY2hhbmdlZCkuCi0JCQkJCQkJY2xhc3NFbnRyeSA9IG51bGw7CS8vIEdldCByaWQgb2YgaXQgc2luY2Ugbm93IGRlbGV0ZWQuCi0JCQkJCQl9Ci0JCQkJCQluZWVkc0ludHJvc3BlY3Rpb24gPSBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IFJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlJ3ZlIGJlZW4gZGVmaW5lZCBhdCBvbmUgcG9pbnQuIE5lZWQgdG8gY2xlYXIgZXZlcnl0aGluZyBhbmQgc3RlcCBiYWNrCi0JCQkJCQkvLyB0byBuZXZlciByZXRyaWV2ZWQgc28gdGhhdCB3ZSBub3cgZ2V0IHRoZSByb290IGFkZGVkIGluLiBJZiB3ZSBoYWQgYmVlbgotCQkJCQkJLy8gcHJldmlvdXNseSBkZWZpbmVkLCB0aGVuIHdlIGRpZG4ndCBoYXZlIHJvb3QuIFdlIHdpbGwgaGF2ZSB0byBsb3NlCi0JCQkJCQkvLyBhbGwgb3RoZXIgdXBkYXRlcyB0b28uIEJ1dCB0aGV5IGNhbiBjb21lIGJhY2sgd2hlbiB3ZSdyZSBkZWZpbmVkLgotCQkJCQkJLy8gT3Igd2UndmUgYmVlbiBhc2tlZCB0byBjbGVhciBhbGwuCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQkJcmV0cmlldmVkRXh0ZW5zaW9uRG9jdW1lbnQgPSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UOwotCQkJCQl9Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UKQotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudCh0cnVlKTsJLy8gQWRkIGluIFJvb3Qgc3R1ZmYgc28gdGhhdCBpdCB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gdGhvdWdoIHVuZGVmaW5lZC4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUT0RPIEZvciBub3cgY2F1c2UgcmVjeWNsZSBvZiB2bSBpZiBhbnkgc3VwZXIgdHlwZSBpcyBzdGFsZSBzbyB0aGF0IGlmIHJlZ2lzdHJ5IGlzIHN0YWxlIGZvciB0aGUgc3VwZXIgdHlwZSBpdCB3aWxsIGJlCi0JCQkJCS8vIHJlY3JlYXRlZC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSByZWZsZWN0aW9uIHJlcXVpcmVzIHN1cGVyUHJvcGVydGllcywgZXRjLiBhbmQgcmVjcmVhdGluZyB0aGUgcmVnaXN0cnkKLQkJCQkJLy8gY3VycmVudGx5IHJlLW1hcmtzIGV2ZXJ5b25lIGFzIHN0YWxlLCBpbmNsdWRpbmcgdGhpcyBzdWJjbGFzcy4gVGhpcyB3b3VsZCBtZWFuIHRoYXQKLQkJCQkJLy8gcmUtaW50cm9zcGVjdGlvbiB3b3VsZCBuZWVkIHRvIGJlIGRvbmUsIGV2ZW4gdGhvdWdoIHdlIGp1c3QgZGlkIGl0LiBUaGUgc3RhbGUgcmVnaXN0cnkgYnVzaW5lc3MgbmVlZHMgdG8gYmUgcmUtYWRkcmVzc2VkIHNvIHRoYXQgaXQgaXMKLQkJCQkJLy8gYSBsb3Qgc21hcnRlci4gCi0JCQkJCUxpc3Qgc3VwZXJzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWlmIChiY2EgIT0gbnVsbCAmJiBiY2EuaXNTdGFsZSgpKQotCQkJCQkJCWJjYS5nZXRSZWdpc3RyeSgpOwotCQkJCQl9Ci0JCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZvcmNlIGludHJvc3BlY3Rpb24sIGlmIG5lZWRlZCwgb2YgYWxsIHBhcmVudHMgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gdG8gYmUgdXAtdG8tZGF0ZSBmb3IgdGhlCi0JCQkJCS8vIGNsYXNzIGVudHJ5LgotCQkJCQkvLyBUT0RPIHNlZSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIHdheSB0aGF0IHdlIEtOT1cgdGhlIENFIGlzIGNvcnJlY3QsIGV2ZW4gaWYgYW55IHN1cGVycyBhcmUgc3RhbGUuCi0JCQkJCXN1cGVycyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlciBiY2EgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWJjYS5pbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJCQkJfQotCi0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoSU5UUk9TUEVDVCk7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBSRVRSSUVWRURfUk9PVF9PTkxZIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlIG5lZWQgdG8gY2xlYXIgb3V0IEVWRVJZVEhJTkcgYmVjYXVzZSB3ZSBhcmUgY29taW5nIGZyb20gYW4gdW5kZWZpbmVkIHRvIGEgZGVmaW5lZC4KLQkJCQkJCS8vIE5vdGhpbmcgcHJldmlvdXMgaXMgbm93IHZhbGlkLiAoUGFydGljdWxhcmx5IHRoZSByb290IHN0dWZmKS4KLQkJCQkJCS8vIE9yIHdlIGhhZCBhIENsZWFuIHJlcXVlc3RlZCBhbmQgbmVlZCB0byBjbGVhciB0aGUgZXh0ZW5zaW9ucyB0b28uCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCAhPSBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCkgewotCQkJCQkJZmlyc3RUaW1lID0gdHJ1ZTsJLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgZXh0ZW5zaW9uIGRvYywgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLgotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudChmYWxzZSk7IC8vIEFwcGx5IHRoZSBleHRlbnNpb24gZG9jIGJlZm9yZSB3ZSBkbyBhbnl0aGluZy4KLQkJCQkJfQotCi0JCQkJCS8vIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJCQkJaWYgKGZpcnN0VGltZSkgewotCQkJCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuIFVzZSBNYXggdmFsdWUgc28gdGhhdCBmaXJzdCBsZXZlbCB0ZXN0IChvdXJzZWxmKSB3aWxsIGFsd2F5cyBwYXNzIGFuZCBnbyBvbiB0byB0aGUgc3VwZXJzLgotCQkJCQkJaWYgKGNhblVzZUNhY2hlKCkpIHsKLQkJCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQkJLy8gV2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCQkJUmVzb3VyY2UgY3JlcyA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENhY2hlKGdldEphdmFDbGFzcygpLCBjbGFzc0VudHJ5LCB0cnVlKTsKLQkJCQkJCQlpZiAoY3JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkvLyBHb3QgYSBjYWNoZSB0byB1c2UsIG5vdyBhcHBseSBpdC4KLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgY2RzID0gY3Jlcy5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGNkcy5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJQ2hhbmdlRGVzY3JpcHRpb24gY2FjaGVDRCA9IChDaGFuZ2VEZXNjcmlwdGlvbikgY2RzLm5leHQoKTsKLQkJCQkJCQkJCQljYWNoZUNELmFwcGx5KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkvLyBXZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCBhbmQgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBJRCdzIGZvciBldmVudHMvYWN0aW9ucy9wcm9wZXJ0aWVzIGJlY2F1c2UgYnkKLQkJCQkJCQkJCS8vIGRlZmF1bHQgZnJvbSB0aGUgY2hhbmdlIGRlc2NyaXB0aW9ucyB0aGVzZSBkb24ndCBnZXQgcmVmbGVjdGVkIGJhY2suIEFuZCBpZiBzb21lIG9uZSBkb2Vzbid0Ci0JCQkJCQkJCQkvLyB1c2UgYW4gSUQgdG8gZ2V0IHRoZW0sIHRoZXkgd29uJ3QgaGF2ZSBhbiBpZCBzZXQuCi0JCQkJCQkJCQlkb0lEcygpOwotCQkJCQkJCQkJZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkvLyBSZW1vdmUgdGhlIGNyZXMgc2luY2UgaXQgaXMgbm93IGludmFsaWQuIFRoZSBhcHBsaWVzIGNhdXNlIHRoZW0gdG8gYmUgaW52YWxpZC4KLQkJCQkJCQkJCWNyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY3Jlcyk7Ci0JCQkJCQkJCQlpZiAoZG9JbnRyb3NwZWN0aW9uKSB7Ci0JCQkJCQkJCQkJLy8gQXBwbHkgaGFkIGZhaWxlZC4gV2UgZG9uJ3Qga25vdyBob3cgZmFyIGl0IHdlbnQuIFdlIG5lZWQgdG8gd2lwZSBvdXQgYW5kIHJlZ2V0IEVWRVJZVEhJTkcuCi0JCQkJCQkJCQkJY2xlYXJBbGwoKTsKLQkJCQkJCQkJCQlhcHBseUV4dGVuc2lvbkRvY3VtZW50KGZhbHNlKTsgLy8gUmUtYXBwbHkgdGhlIGV4dGVuc2lvbiBkb2MgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UuCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCQkJCS8vIEZpbmFsbHkgd2UgY2FuIGdldCB0byBoYW5kbGluZyBvdXJzZWx2ZXMuCi0JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFTU9URV9JTlRST1NQRUNUKTsKLQkJCQkJCUJlYW5EZWNvcmF0b3IgZGVjb3IgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCQkJCQlpZiAoZGVjb3IgPT0gbnVsbCkgewotCQkJCQkJCWRlY29yID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0JCQkJCQkJZGVjb3Iuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCk7Ci0JCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zKCkuYWRkKGRlY29yKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihkZWNvcik7CS8vIENsZWFyIG91dCBwcmV2aW91cyByZXN1bHRzLgotCQkJCQkJCi0JCQkJCQlib29sZWFuIGRvUmVmbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQlpZiAoZG9PcGVyYXRpb25zKQotCQkJCQkJCW5ld29wZXJhdGlvbnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCQkJCQlpZiAoZGVjb3IuaXNEb0JlYW5pbmZvKCkpIHsKLQkJCQkJCQlpbnQgZG9GbGFncyA9IDA7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQkJCQkJZG9GbGFncyB8PSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0JFQU5fREVDT1I7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0RXZlbnRzKCkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19FVkVOVFM7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0UHJvcGVydGllcygpKQotCQkJCQkJCQlkb0ZsYWdzIHw9IElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUzsKLQkJCQkJCQlpZiAoZG9PcGVyYXRpb25zICYmIChkZWNvciA9PSBudWxsIHx8IGRlY29yLmlzSW50cm9zcGVjdE1ldGhvZHMoKSkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19NRVRIT0RTOwotCQkJCQkJCQotCQkJCQkJCWlmIChkb0ZsYWdzICE9IDApIHsKLQkJCQkJCQkJLy8gVGhlcmUgd2FzIHNvbWV0aGluZyByZW1vdGUgdG8gZG8uCi0JCQkJCQkJCUlCZWFuVHlwZVByb3h5IHRhcmdldFR5cGUgPSBudWxsOwotCQkJCQkJCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7Ci0JCQkJCQkJCWlmIChyZWdpc3RyeSAhPSBudWxsICYmIHJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCQkJCQkJCXRhcmdldFR5cGUgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0JCQkJCQkJCWlmICh0YXJnZXRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICh0YXJnZXRUeXBlLmdldEluaXRpYWxpemF0aW9uRXJyb3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdHJlYXQgdGhpcyBhcyBubyBwcm94eSwgaG93ZXZlciBsb2cgaXQgYmVjYXVzZSB3ZQotCQkJCQkJCQkJCS8vIHNob3VsZG4ndCBoYXZlIGV4Y2VwdGlvbnMgZHVyaW5nIGludHJvc3BlY3Rpb24sIGJ1dCBpZiB3ZSBkbyBpdCBzaG91bGQgYmUgbG9nZ2VkCi0JCQkJCQkJCQkJLy8gc28gaXQgY2FuIGJlIGNvcnJlY3RlZC4KLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIHByb3h5Q29uc3RhbnRzID0gZ2V0UHJveHlDb25zdGFudHMoKTsKLQkJCQkJCQkJCQkJaWYgKHByb3h5Q29uc3RhbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWJlYW5pbmZvID0gcHJveHlDb25zdGFudHMuZ2V0SW50cm9zcGVjdFByb3h5KCkuaW52b2tlKAotCQkJCQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCQkJCQluZXcgSUJlYW5Qcm94eVtdIHsgdGFyZ2V0VHlwZSwKLQkJCQkJCQkJCQkJCQkJCQlnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKSwKLQkJCQkJCQkJCQkJCQkJCQlnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGRvRmxhZ3MpfSk7Ci0JCQkJCQkJCQkJCX0JCQkJCQkJCQkJCQotCQkJCQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLklOVFJPU1BFQ1RfRkFJTEVEX0VYQ18sIG5ldyBPYmplY3RbXSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSwgIiJ9KSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQllKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkvLyBUaGUgY2xhc3MgaXRzZWxmIGNvdWxkbid0IGJlIGluaXRpYWxpemVkLiBKdXN0IGxvZyBpdCwgYnV0IHRyZWF0IGFzIG5vIHByb3h5LgotCQkJCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZygKLQkJCQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgbmV3IE9iamVjdFtdIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCWdldEphdmFDbGFzcygpLmdldEphdmFOYW1lKCksIHRhcmdldFR5cGUuZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpfSksIG51bGwpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIFRoZSBjbGFzcyBpdHNlbGYgY291bGQgbm90IGJlIGZvdW5kLiBKdXN0IGxvZyBpdCwgYnV0IHRyZWF0IGFzIG5vIHByb3h5LgotCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJCQkJCUJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLklOVFJPU1BFQ1RfRkFJTEVEX0VYQ18sIG5ldyBPYmplY3RbXSB7IAotCQkJCQkJCQkJCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSwKLQkJCQkJCQkJCQkJCQkJCUJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLkJlYW5pbmZvQ2xhc3NBZGFwdGVyX0NsYXNzTm90Rm91bmR9KSwgCi0JCQkJCQkJCQkJCQkJCQludWxsKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCWlmIChiZWFuaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkb1JlZmxlY3Rpb24gPSBmYWxzZTsJLy8gV2UgaGF2ZSBhIGJlYW5pbmZvLCBzbyB3ZSBhcmUgZG9pbmcgaW50cm9zcGVjdGlvbi4KLQkJCQkJCQkJCWZpbmFsIEJlYW5EZWNvcmF0b3IgYmRlY29yID0gZGVjb3I7Ci0JCQkJCQkJCQkvLyBXZSBoYXZlIGEgYmVhbmluZm8gdG8gcHJvY2Vzcy4KLQkJCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5pbnRyb3NwZWN0KGJlYW5pbmZvLCBuZXcgQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjaygpIHsKLQotCQkJCQkJCQkJCS8qOyAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjayNwcm9jZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uQmVhblJlY29yZCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgQmVhbkRlY29yYXRvciBwcm9jZXNzKEJlYW5SZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBiZGVjb3I7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLlByb3BlcnR5UmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBwcm9jZXNzKFByb3BlcnR5UmVjb3JkIHJlY29yZCkgewotCQkJCQkJCQkJCQlyZXR1cm4gY2FsY3VsYXRlUHJvcGVydHkocmVjb3JkLCBmYWxzZSk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkluZGV4ZWRQcm9wZXJ0eVJlY29yZCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgUHJvcGVydHlEZWNvcmF0b3IgcHJvY2VzcyhJbmRleGVkUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBjYWxjdWxhdGVQcm9wZXJ0eShyZWNvcmQsIHRydWUpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkJCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrI3Byb2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5NZXRob2RSZWNvcmQpCi0JCQkJCQkJCQkJICovCi0JCQkJCQkJCQkJcHVibGljIE1ldGhvZERlY29yYXRvciBwcm9jZXNzKE1ldGhvZFJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGNhbGN1bGF0ZU9wZXJhdGlvbihyZWNvcmQpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkJCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrI3Byb2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5FdmVudFNldFJlY29yZCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgRXZlbnRTZXREZWNvcmF0b3IgcHJvY2VzcyhFdmVudFNldFJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGNhbGN1bGF0ZUV2ZW50KHJlY29yZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSk7Ci0JCQkJCQkJCX0gCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoZG9SZWZsZWN0aW9uKSB7Ci0JCQkJCQkJLy8gTmVlZCB0byBkbyByZWZsZWN0aW9uIHN0dWZmLgotCQkJCQkJCWlmIChkZWNvci5pc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkpCi0JCQkJCQkJCXJlZmxlY3RQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJaWYgKGRvT3BlcmF0aW9ucyAmJiBkZWNvci5pc0ludHJvc3BlY3RNZXRob2RzKCkpCi0JCQkJCQkJCXJlZmxlY3RPcGVyYXRpb25zKCk7Ci0JCQkJCQkJaWYgKGRlY29yLmlzSW50cm9zcGVjdEV2ZW50cygpKQotCQkJCQkJCQlyZWZsZWN0RXZlbnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlDaGFuZ2VEZXNjcmlwdGlvbiBjZCA9IENoYW5nZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoYW5nZURlc2NyaXB0aW9uKCk7CQkJCQkJCi0JCQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIGRlY29yKTsKLQkJCQkJCWZpbmFsaXplUHJvcGVydGllcyhjZCk7Ci0JCQkJCQlpZiAoZG9PcGVyYXRpb25zKQotCQkJCQkJCWZpbmFsaXplT3BlcmF0aW9ucyhjZCk7Ci0JCQkJCQlmaW5hbGl6ZUV2ZW50cyhjZCk7Ci0KLQkJCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5uZXdDYWNoZShnZXRKYXZhQ2xhc3MoKSwgY2QsIGRvT3BlcmF0aW9ucyA/IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLlJFRkxFQ1RJT05fT1BFUkFUSU9OU19DQUNIRSA6IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLlJFRkxFQ1RJT05fQ0FDSEUpOwotCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFTU9URV9JTlRST1NQRUNUKTsgCi0JCQkJCX0KLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKElOVFJPU1BFQ1QpOwotCQkJCX0KLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnJlZ2lzdGVySW50cm9zcGVjdGlvbihnZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpLCB0aGlzKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChiZWFuaW5mbyAhPSBudWxsKSB7Ci0JCQkJYmVhbmluZm8uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5yZWxlYXNlUHJveHkoYmVhbmluZm8pOyAvLyBEaXNwb3NlIG9mIHRoZSBiZWFuaW5mbyBzaW5jZSB3ZSBub3cgaGF2ZSBldmVyeXRoaW5nLgotCQkJfQotCQkJZXZlbnRzTWFwID0gbnVsbDsgLy8gQ2xlYXIgb3V0IHRoZSB0ZW1wIGxpc3RzLgotCQkJZXZlbnRzUmVhbExpc3QgPSBudWxsOwotCQkJb3BlcmF0aW9uc01hcCA9IG51bGw7IC8vIENsZWFyIG91dCB0aGUgdGVtcCBsaXN0cy4KLQkJCW9wZXJhdGlvbnNSZWFsTGlzdCA9IG51bGw7Ci0JCQluZXdvcGVyYXRpb25zID0gbnVsbDsKLQkJCXByb3BlcnRpZXNNYXAgPSBudWxsOyAvLyBHZXQgcmlkIG9mIGFjY3VtdWxhdGVkIG1hcC4KLQkJCWZlYXR1cmVzUmVhbExpc3QgPSBudWxsOyAvLyBSZWxlYXNlIHRoZSByZWFsIGxpc3QuCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JRHMoKSB7Ci0JCS8vIERvIHByb3BlcnRpZXMuCi0JCWlmIChnZXRKYXZhQ2xhc3MoKS5lSXNTZXQoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NfRVN0cnVjdHVyYWxGZWF0dXJlcygpKSkgewotCQkJTGlzdCBmZWF0dXJlcyA9IGdldEZlYXR1cmVzTGlzdCgpOwotCQkJaW50IGxlbiA9IGZlYXR1cmVzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihmKTsKLQkJCQlpZiAocGQgPT0gbnVsbCB8fCAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQkJY29udGludWU7IC8vIE5vdCBhIHByb3BlcnR5IGZvciB1cyB0byBnaXZlIGFuIElEIHRvLgotCQkJCXNldFByb3BlcnR5SUQoZi5nZXROYW1lKCksIGYpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBEbyBldmVudHMuCi0JCWlmIChnZXRKYXZhQ2xhc3MoKS5lSXNTZXQoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzc19FdmVudHMoKSkpIHsKLQkJCUxpc3QgZXZlbnRzID0gZ2V0RXZlbnRzTGlzdCgpOwotCQkJaW50IGxlbiA9IGV2ZW50cy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJQmVhbkV2ZW50IGUgPSAoQmVhbkV2ZW50KSBldmVudHMuZ2V0KGkpOwotCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGUpOwotCQkJCWlmIChlZCA9PSBudWxsIHx8ICFlZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKQotCQkJCQljb250aW51ZTsgLy8gTm90IGFuIGV2ZW50IGZvciB1cyB0byBnaXZlIGFuIElEIHRvLgotCQkJCXNldEV2ZW50SUQoZS5nZXROYW1lKCksIGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gRG8gT3BlcmF0aW9ucy4KLQkJaWYgKGdldEphdmFDbGFzcygpLmVJc1NldChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FT3BlcmF0aW9ucygpKSkgewotCQkJTGlzdCBvcHMgPSBnZXRPcGVyYXRpb25zTGlzdCgpOwotCQkJaW50IGxlbiA9IG9wcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJRU9wZXJhdGlvbiBvID0gKEVPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0JCQkJTWV0aG9kRGVjb3JhdG9yIG1kID0gVXRpbGl0aWVzLmdldE1ldGhvZERlY29yYXRvcihvKTsKLQkJCQlpZiAobWQgPT0gbnVsbCB8fCAhbWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQkJY29udGludWU7IC8vIE5vdCBhbiBldmVudCBmb3IgdXMgdG8gZ2l2ZSBhbiBJRCB0by4KLQkJCQlzZXRNZXRob2RJRChvLmdldE5hbWUoKSwgbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9PVkVSUklERSA9IEJlYW5pbmZvUGx1Z2luLlJPT1QrJy4nK0JlYW5pbmZvUGx1Z2luLk9WRVJSSURFX0VYVEVOU0lPTjsJIC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUV4dGVuc2lvbkRvY3VtZW50KGJvb2xlYW4gcm9vdE9ubHkpIHsKLQkJdHJ5IHsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoQVBQTFlfRVhURU5TSU9OUyk7Ci0JCQlib29sZWFuIGNhblVzZUNhY2hlID0gIXJvb3RPbmx5ICYmIGNhblVzZU92ZXJyaWRlQ2FjaGUoKTsKLQkJCWJvb2xlYW4gYWxyZWFkeVJldHJpZXZlZFJvb3QgPSByZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBSRVRSSUVWRURfUk9PVF9PTkxZOwotCQkJcmV0cmlldmVkRXh0ZW5zaW9uRG9jdW1lbnQgPSByb290T25seSA/IFJFVFJJRVZFRF9ST09UX09OTFkgOiBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVDsKLQkJCUphdmFDbGFzcyBqYyA9IGdldEphdmFDbGFzcygpOwotCQkJUmVzb3VyY2UgbWVyZ2VJbnRvUmVzb3VyY2UgPSBqYy5lUmVzb3VyY2UoKTsKLQkJCVJlc291cmNlU2V0IHJzZXQgPSBtZXJnZUludG9SZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGpjLmdldE5hbWUoKTsKLQkJCWlmIChjYW5Vc2VDYWNoZSkgewotCQkJCS8vIFdlIGNhbiB1c2UgdGhlIGNhY2hlLCBzZWUgaWYgd2UgYWN0dWFsbHkgaGF2ZSBvbmUuCi0JCQkJaWYgKGdldENsYXNzRW50cnkoKS5vdmVycmlkZUNhY2hlRXhpc3RzKCkpIHsKLQkJCQkJLy8gR2V0IHRoZSBjYWNoZSBhbmQgYXBwbHkgaXQgYmVmb3JlIGFueXRoaW5nIGVsc2UuCi0JCQkJCVJlc291cmNlIGNhY2hlUmVzID0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0UuZ2V0Q2FjaGUoamMsIGdldENsYXNzRW50cnkoKSwgZmFsc2UpOwotCQkJCQlpZiAoY2FjaGVSZXMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXcgRXh0ZW5zaW9uRG9jQXBwbGllcyhudWxsLCByc2V0LCBqYywgbnVsbCkucnVuKGNhY2hlUmVzKTsKLQkJCQkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwKLQkJCQkJCQkJCQkJIkVycm9yIHByb2Nlc3NpbmcgZmlsZVwiIiArIGNhY2hlUmVzLmdldFVSSSgpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJY2FjaGVSZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY2FjaGVSZXMpOyAvLyBXZSBkb24ndCBuZWVkIGl0IGFyb3VuZCBvbmNlIHdlIGRvIHRoZSBtZXJnZS4gTm9ybWFsIG1lcmdlIHdvdWxkIG9mIGdvdHRvbiByaWQgb2YgaXQsIGJ1dCBpbiBjYXNlIG9mIGVycm9yIHdlIGRvIGl0IGhlcmUuCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJY2FuVXNlQ2FjaGUgPSBmYWxzZTsgLy8gTmVlZCB0byByZWJ1aWxkIHRoZSBjYWNoZS4KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IG92ZXJyaWRlQ2FjaGUgPSBudWxsOwotCQkJaWYgKCFhbHJlYWR5UmV0cmlldmVkUm9vdCAmJiAocm9vdE9ubHkgfHwgamMuZ2V0U3VwZXJ0eXBlKCkgPT0gbnVsbCkpIHsKLQkJCQkvLyBJdCBpcyBhIHJvb3QgY2xhc3MuIE5lZWQgdG8gbWVyZ2UgaW4gcm9vdCBzdHVmZi4KLQkJCQlpZiAoIWNhblVzZUNhY2hlKSB7Ci0JCQkJCW92ZXJyaWRlQ2FjaGUgPSBjcmVhdGVPdmVycmlkZUNhY2hlKG92ZXJyaWRlQ2FjaGUsIGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0UHJvamVjdCgpLCBCZWFuaW5mb1BsdWdpbi5ST09ULCBST09UX09WRVJSSURFLCByc2V0LCBqYyk7Ci0JCQkJfQotCQkJCWFwcGx5RXh0ZW5zaW9uRG9jVG8ocnNldCwgamMsIFJPT1RfT1ZFUlJJREUsIEJlYW5pbmZvUGx1Z2luLlJPT1QsIEJlYW5pbmZvUGx1Z2luLlJPT1QpOwotCQkJCWlmIChyb290T25seSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgYmFzZU92ZXJyaWRlZmlsZSA9IGNsYXNzTmFtZSArICcuJyArIEJlYW5pbmZvUGx1Z2luLk9WRVJSSURFX0VYVEVOU0lPTjsgLy8gZ2V0TmFtZSgpIHJldHVybnMgaW5uZXIgY2xhc3NlcyB3aXRoICIkIiBub3RhdGlvbiwgd2hpY2ggaXMgZ29vZC4gLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gamMuZ2V0SmF2YVBhY2thZ2UoKS5nZXRQYWNrYWdlTmFtZSgpOwotCQkJaWYgKCFjYW5Vc2VDYWNoZSkgewotCQkJCW92ZXJyaWRlQ2FjaGUgPSBjcmVhdGVPdmVycmlkZUNhY2hlKG92ZXJyaWRlQ2FjaGUsIGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0UHJvamVjdCgpLCBwYWNrYWdlTmFtZSwgYmFzZU92ZXJyaWRlZmlsZSwgcnNldCwgamMpOwotCQkJfQotCQkJYXBwbHlFeHRlbnNpb25Eb2NUbyhyc2V0LCBqYywgYmFzZU92ZXJyaWRlZmlsZSwgcGFja2FnZU5hbWUsIGNsYXNzTmFtZSk7Ci0JCQkKLQkJCWlmICghY2FuVXNlQ2FjaGUpIHsKLQkJCQkvLyBXZSBoYXZlIGFuIG92ZXJyaWRlIGNhY2hlIHRvIHN0b3JlLiBJZiB0aGUgY2FjaGUgaXMgbnVsbCwgdGhpcyB3aWxsIGZsYWcgdGhhdCB0aGVyZSBpcyBubyBvdmVycmlkZSBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVGhhdCB3YXkgd2Ugd29uJ3QgYm90aGVyIHRyeWluZyBhZ2FpbiB1bnRpbCBjb25maWcgY2hhbmdlcy4KLQkJCQlCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5uZXdDYWNoZShqYywgb3ZlcnJpZGVDYWNoZSwgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuT1ZFUlJJREVTX0NBQ0hFKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKEFQUExZX0VYVEVOU0lPTlMpOwkKLQkJfQotCX0KLQkKLQkvKgotCSAqIEJ1aWxkIHVwIHRoZSBmaXhlZCBvdmVycmlkZXMgaW50byB0aGUgY2FjaGUsIGFuZCBhcHBseSBhcyB3ZSBnYXRoZXIgdGhlbS4KLQkgKiBSZXR1cm4gdGhlIGNhY2hlIG9yIG51bGwgaWYgdGhlIGNhY2hlIGlzIGVtcHR5IGF0IHRoZSBlbmQuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNyZWF0ZU92ZXJyaWRlQ2FjaGUoTGlzdCBjYWNoZSwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3ZlcnJpZGVGaWxlLCBSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzKSB7Ci0JCS8vIE5vdyBnZXQgdGhlIG92ZXJyaWRlcyBwYXRocwotCQlTdHJpbmdbXSBwYXRocyA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldE92ZXJyaWRlUGF0aHMocHJvamVjdCwgcGFja2FnZU5hbWUpOwotCQlpZiAocGF0aHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gY2FjaGU7Ci0JCQotCQkvLyBOb3cgYXBwbHkgdGhlIG92ZXJyaWRlcy4KLQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQmVhbmluZm9QbHVnaW4uSU92ZXJyaWRlUnVubmFibGUgcnVubmFibGUgPSBuZXcgRXh0ZW5zaW9uRG9jQXBwbGllcyhvdmVycmlkZUZpbGUsIHJzZXQsIG1lcmdlSW50b0phdmFDbGFzcywgY2FjaGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlydW5uYWJsZS5ydW4ocGF0aHNbaV0pOwotCQl9Ci0JCXJldHVybiAhY2FjaGUuaXNFbXB0eSgpID8gY2FjaGUgOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgUk9PVF9VUkkgPSBVUkkuY3JlYXRlR2VuZXJpY1VSSShCZWFuaW5mb1BsdWdpbi5ST09UX1NDSEVNQSwgQmVhbmluZm9QbHVnaW4uUk9PVF9PUEFRVUUsIG51bGwpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0ZSQUdNRU5UID0gIi8vQHJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGUkFHTUVOVF9TUExJVFRFUiA9IFBhdHRlcm4uY29tcGlsZSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gVE9ETyBUaGlzIGlzIHRvIG1ha2UgZXZlbnQgdXRpbCBvcHRpb25hbC4gVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBlbnRpcmVseSB3aXRoIDEuMyB3aGVuIGV2ZW50IHV0aWwgZ29lcyBhd2F5LgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gUkVUUklFVkVEX0VWRU5UX01FVEhPRFM7Ci0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IEVWRU5UX0ZBQ1RPUllfSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIENSRUFURV9FVkVOVF9VVElMX01FVEhPRDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgRE9fRk9SV0FSRF9FVkVOVFNfTUVUSE9EOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFdmVudFV0aWxMb2FkZWQoKSB7Ci0JCWlmICghUkVUUklFVkVEX0VWRU5UX01FVEhPRFMpIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgZXZlbnRGYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQuRXZlbnRGYWN0b3J5Iik7Ci0JCQkJRmllbGQgZXZlbnRGYWN0b3J5RmllbGQgPSBldmVudEZhY3RvcnlDbGFzcy5nZXRGaWVsZCgiZUlOU1RBTkNFIik7Ci0JCQkJT2JqZWN0IGV2ZW50RmFjdG9yeUluc3RhbmNlID0gZXZlbnRGYWN0b3J5RmllbGQuZ2V0KG51bGwpOwotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBjcmVhdGVFdmVudE1ldGhvZCA9IGV2ZW50RmFjdG9yeUNsYXNzLmdldE1ldGhvZCgiY3JlYXRlRXZlbnRVdGlsIiwgbmV3IENsYXNzW10ge05vdGlmaWVyLmNsYXNzLCBSZXNvdXJjZVNldC5jbGFzc30pOwotCQkJCUNsYXNzIGV2ZW50VXRpbENsYXNzID0gY3JlYXRlRXZlbnRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBkb0ZvcndhcmRFdmVudHNNZXRob2QgPSBldmVudFV0aWxDbGFzcy5nZXRNZXRob2QoImRvRm9yd2FyZEV2ZW50cyIsIG5ldyBDbGFzc1tdIHtMaXN0LmNsYXNzfSk7Ci0JCQkJRVZFTlRfRkFDVE9SWV9JTlNUQU5DRSA9IGV2ZW50RmFjdG9yeUluc3RhbmNlOwotCQkJCUNSRUFURV9FVkVOVF9VVElMX01FVEhPRCA9IGNyZWF0ZUV2ZW50TWV0aG9kOwotCQkJCURPX0ZPUldBUkRfRVZFTlRTX01FVEhPRCA9IGRvRm9yd2FyZEV2ZW50c01ldGhvZDsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCVJFVFJJRVZFRF9FVkVOVF9NRVRIT0RTID0gdHJ1ZTsKLQkJfSAKLQkJcmV0dXJuIEVWRU5UX0ZBQ1RPUllfSU5TVEFOQ0UgIT0gbnVsbDsKLQkJCi0JfQotCXByaXZhdGUgY2xhc3MgRXh0ZW5zaW9uRG9jQXBwbGllcyBpbXBsZW1lbnRzIEJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG92ZXJyaWRlRmlsZTsKLQkJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVNldCByc2V0OwotCQlwcml2YXRlIGZpbmFsIEphdmFDbGFzcyBtZXJnZUludG9KYXZhQ2xhc3M7Ci0JCXByaXZhdGUgZmluYWwgTGlzdCBvdmVycmlkZXNDYWNoZTsKLQotCQlwdWJsaWMgRXh0ZW5zaW9uRG9jQXBwbGllcyhTdHJpbmcgb3ZlcnJpZGVGaWxlLCBSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBMaXN0IG92ZXJyaWRlc0NhY2hlKSB7Ci0JCQl0aGlzLm92ZXJyaWRlRmlsZSA9IG92ZXJyaWRlRmlsZTsKLQkJCXRoaXMucnNldCA9IHJzZXQ7Ci0JCQl0aGlzLm1lcmdlSW50b0phdmFDbGFzcyA9IG1lcmdlSW50b0phdmFDbGFzczsKLQkJCXRoaXMub3ZlcnJpZGVzQ2FjaGUgPSBvdmVycmlkZXNDYWNoZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlI3J1bihqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpIHsKLQkJCVJlc291cmNlIG92ZXJyaWRlUmVzID0gbnVsbDsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG92ZXJyaWRlUGF0aCtvdmVycmlkZUZpbGUpOwotCQkJdHJ5IHsKLQkJCQlvdmVycmlkZVJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlydW4ob3ZlcnJpZGVSZXMpOwotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIG9rCi0JCQkJaWYgKCEoZS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uCi0JCQkJCQkmJiAoKENvcmVFeGNlcHRpb24pIGUuZXhjZXB0aW9uKCkpLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIG9rLiBNZWFucyB1cmlfbWFwcGluZyBub3Qgc2V0IHNvIGNvdWxkbid0IGZpbmQgaW4gV29ya3NwYWNlLCBhbHNvIG9rLgotCQkJCQl9IGVsc2UgaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24gJiYgKChQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24pIGUuZXhjZXB0aW9uKCkpLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJldmVudC54bWkiKSAhPSAtMSkgewotCQkJCQkJaWYgKCFSRVRSSUVWRURfRVZFTlRfTUVUSE9EUykgewotCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsIDAsICJBbiBvbGQgc3R5bGUgb3ZlcnJpZGUgZmlsZSB1c2luZyB0aGUgY29tLmlibS5ldmVudCBmb3JtYXQgd2FzIGZvdW5kLCBidXQgY29tLmlibS5ldmVudCB3YXMgbm90IGluc3RhbGxlZC4gVGhlIGZpcnN0IHN1Y2ggZmlsZSBpcyAiK3VyaSwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUkVUUklFVkVEX0VWRU5UX01FVEhPRFMgPSB0cnVlOwkvLyBNYXJrIHdlJ3ZlIHJldHJpZXZlZC4gVGhpcyBpcyBvayBiZWNhdXNlIGlmIGV2ZW50IGlzIG1pc3NpbmcgaGVyZSwgaXQgd2lsbCBiZSBtaXNzaW5nIGZvciByZXRyaWV2ZSB0b28uCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAwLCAiRXJyb3IgbG9hZGluZyBmaWxlXCIiICsgdXJpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJbiBjYXNlIGl0IGhhcHBlbmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGJ1dCBkdXJpbmcgbG9hZC4gTmVlZCB0byBnZXQgcmlkIG9mIGl0IGluIHRoZSBmaW5hbGx5LgkKLQkJCQlvdmVycmlkZVJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7CQkJCQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBDb3VsZG4ndCBsb2FkIGl0IGZvciBzb21lIHJlYXNvbi4KLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAwLCAiRXJyb3IgbG9hZGluZyBmaWxlXCIiICsgdXJpICsgIlwiIiwgZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlvdmVycmlkZVJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7IC8vIEluIGNhc2UgaXQgaGFwcGVuZWQgYWZ0ZXIgY3JlYXRpbmcgcmVzb3VyY2UgYnV0IGR1cmluZyBsb2FkIHNvIHRoYXQgd2UgY2FuIGdldCByaWQgb2YgaXQuCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChvdmVycmlkZVJlcyAhPSBudWxsKQotCQkJCQlyc2V0LmdldFJlc291cmNlcygpLnJlbW92ZShvdmVycmlkZVJlcyk7IC8vIFdlIGRvbid0IG5lZWQgaXQgYXJvdW5kIG9uY2Ugd2UgZG8gdGhlIG1lcmdlLiBOb3JtYWwgbWVyZ2Ugd291bGQgb2YgZ290dG9uIHJpZCBvZiBpdCwgYnV0IGluIGNhc2Ugb2YgZXJyb3Igd2UgZG8gaXQgaGVyZS4KLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlI3J1bihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oUmVzb3VyY2Ugb3ZlcnJpZGVSZXMpIHsKLQkJCXRyeSB7Ci0JCQkJRUxpc3QgY29udGVudHMgPSBvdmVycmlkZVJlcy5nZXRDb250ZW50cygpOwotCQkJCWlmIChvdmVycmlkZXNDYWNoZSAhPSBudWxsKSB7Ci0JCQkJCS8vIFRPRE8gVW50aWwgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTE2OSBpcyBmaXhlZCwgd2UgbmVlZCBvdXIgb3duIENvcGllci4KLQkJCQkJRWNvcmVVdGlsLkNvcGllciBjb3BpZXIgPSBuZXcgRWNvcmVVdGlsLkNvcGllcigpIHsKLQotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBFT2JqZWN0IGVPYmplY3QsIEVPYmplY3QgY29weUVPYmplY3QpIHsKLQkJCQkJCQlpZiAoZU9iamVjdC5lSXNTZXQoZVJlZmVyZW5jZSkpIHsKLQkJCQkJCQkJaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJCQkJCUxpc3Qgc291cmNlID0gKExpc3QpIGVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgdGFyZ2V0ID0gKEludGVybmFsRUxpc3QpIGNvcHlFT2JqZWN0LmVHZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpKTsKLQkJCQkJCQkJCWlmIChzb3VyY2UuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LmNsZWFyKCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWJvb2xlYW4gaXNCaWRpcmVjdGlvbmFsID0gZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsOwotCQkJCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBrID0gKChFY29yZUVMaXN0KSBzb3VyY2UpLmJhc2ljSXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGsubmV4dCgpOwotCQkJCQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlpZiAoIWlzQmlkaXJlY3Rpb25hbCkgewotCQkJCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsIHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJaWYgKGlzQmlkaXJlY3Rpb25hbCkgewotCQkJCQkJCQkJCQkJCWludCBwb3NpdGlvbiA9IHRhcmdldC5pbmRleE9mKGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJfSBlbHNlIGlmIChpbmRleCAhPSBwb3NpdGlvbikgewotCQkJCQkJCQkJCQkJCQl0YXJnZXQubW92ZShpbmRleCwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UsIGZhbHNlKTsKLQkJCQkJCQkJCWlmIChyZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIG51bGwpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQlpZiAoY29weVJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQkJCQkJaWYgKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCS8vIFdlIGZpeHVwIHRoZSBDRCBmaXJzdCBzbyB0aGF0IHdoZW4gc2VyaWFsaXplZCBpdCB3aWxsIGJlIHRvIHRoZSBjb3JyZWN0IG9iamVjdCBhbHJlYWR5LiBTaW1wbGlmaWVzIGFwcGx5IGxhdGVyLgotCQkJCQlJdGVyYXRvciBpdHIgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBDaGFuZ2VEZXNjcmlwdGlvbikgewotCQkJCQkJCWZpeHVwQ0QoKENoYW5nZURlc2NyaXB0aW9uKSBvKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJICAgIENvbGxlY3Rpb24gcmVzdWx0ID0gY29waWVyLmNvcHlBbGwoY29udGVudHMpOwotCQkJCSAgICBjb3BpZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJCQkJb3ZlcnJpZGVzQ2FjaGUuYWRkQWxsKHJlc3VsdCk7CS8vIE1ha2UgYSBjb3B5IGZvciB0aGUgb3ZlcnJpZGUgY2FjaGUgdG8gYmUgdXNlZCBuZXh0IHRpbWUgbmVlZGVkLgotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIWNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBUT0RPIEl0IGNvdWxkIGJlIGVpdGhlciB0aGUgb2xkIGV2ZW50IG1vZGVsIG9yIHRoZSBuZXcgQ2hhbmdlRGVzY3JpcHRpb24uIFdoZW4gd2UgcmVtb3ZlIEV2ZW50IE1vZGVsIHdlIG5lZWQgdG8gcmVtb3ZlCi0JCQkJCS8vIHRoZSB0ZXN0LiBUaGlzIGNvdWxkIGJlIHRoZSBvdmVycmlkZSBjYWNoZSB0b28sIHNvIHdlIG11c3QgYXBwbHkgdGhlIGNvbnRlbnRzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBpbiB0aGUgcmVzb3VyY2UuCi0JCQkJCXRyeSB7Ci0JCQkJCQlMaXN0IGV2ZW50cyA9IG51bGw7Ci0JCQkJCQlPYmplY3RbXSBldmVudHNQYXJtID0gbnVsbDsKLQkJCQkJCUl0ZXJhdG9yIGl0ciA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gKENoYW5nZURlc2NyaXB0aW9uKSBvOwotCQkJCQkJCQlmaXh1cENEKGNkKTsKLQkJCQkJCQkJY2QuYXBwbHkoKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGlzRXZlbnRVdGlsTG9hZGVkKCkpIHsKLQkJCQkJCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlldmVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCQkJCQkJZXZlbnRzLmFkZChudWxsKTsgLy8gRXZlbnRVdGlsIG5lZWRzIGEgbGlzdCwgYnV0IHdlIHdpbGwgYmUgY2FsbGluZyBvbmUgYnkgb25lLiBTbyBqdXN0IHJldXNlIHRoaXMgbGlzdC4KLQkJCQkJCQkJCWV2ZW50c1Bhcm0gPSBuZXcgT2JqZWN0W10geyBldmVudHN9OwotCQkJCQkJCQl9CQkJCQkJCQkKLQkJCQkJCQkJLy8gSXQgaXMgdGhlIG9sZCBmb3JtYXQuCi0JCQkJCQkJCWV2ZW50cy5zZXQoMCwgbyk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlPYmplY3QgdXRpbCA9IENSRUFURV9FVkVOVF9VVElMX01FVEhPRC5pbnZva2UoRVZFTlRfRkFDVE9SWV9JTlNUQU5DRSwgbmV3IE9iamVjdFtdIHttZXJnZUludG9KYXZhQ2xhc3MsIHJzZXR9KTsKLQkJCQkJCQkJCURPX0ZPUldBUkRfRVZFTlRTX01FVEhPRC5pbnZva2UodXRpbCwgZXZlbnRzUGFybSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsIDAsICJFcnJvciBwcm9jZXNzaW5nIGZpbGVcIiIgKyBvdmVycmlkZVJlcy5nZXRVUkkoKSArICJcIiIsIGUuZ2V0Q2F1c2UoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXVuaW5zdGFsbFJvb3RSZXNvdXJjZSgpOwotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIHByb2Nlc3NpbmcgZmlsZVwiIiArIG92ZXJyaWRlUmVzLmdldFVSSSgpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogZml4IGl0IHVwIHNvIHRoYXQgcmVmZXJlbmNlcyB0byAiWDpST09UIy8vQHJvb3QiIGFyZSByZXBsYWNlZCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgamF2YWNsYXNzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGZpeHVwQ0QoQ2hhbmdlRGVzY3JpcHRpb24gY2QpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBrZXlGZWF0dXJlID0gQ2hhbmdlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5X0tleSgpOwotCQkJSXRlcmF0b3IgY2hhbmdlcyA9IGNkLmdldE9iamVjdENoYW5nZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNoYW5nZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRU9iamVjdCBlbnRyeSA9IChFT2JqZWN0KSBjaGFuZ2VzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGtleSA9IChFT2JqZWN0KSBlbnRyeS5lR2V0KGtleUZlYXR1cmUsIGZhbHNlKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVJc1Byb3h5KCkpIHsKLQkJCQkJLy8gU2VlIGlmIGl0IGlzIG91ciBzcGVjaWFsLgotCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIGtleSkuZVByb3h5VVJJKCk7Ci0JCQkJCVN0cmluZyByb290RnJhZyA9IHVyaS5mcmFnbWVudCgpOwotCQkJCQlpZiAoQmVhbmluZm9QbHVnaW4uUk9PVF9TQ0hFTUEuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgQmVhbmluZm9QbHVnaW4uUk9PVF9PUEFRVUUuZXF1YWxzKHVyaS5vcGFxdWVQYXJ0KCkpICYmIChyb290RnJhZyAhPSBudWxsICYmIHJvb3RGcmFnLnN0YXJ0c1dpdGgoUk9PVF9GUkFHTUVOVCkpKSB7Ci0JCQkJCQkvLyBJdCBpcyBvbmUgb2Ygb3Vycy4gR2V0IHRoZSBmcmFnbWVudCwgcmVtb3ZlIHRoZSBsZWFkaW5nIC8vcm9vdCBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlCi0JCQkJCQkvLyB1cmkgZnJvbSB0aGUgamF2YSBjbGFzcyBpdHNlbGYuCi0JCQkJCQlpZiAocm9vdEZyYWcubGVuZ3RoKCkgPD0gUk9PVF9GUkFHTUVOVC5sZW5ndGgoKSkKLQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG1lcmdlSW50b0phdmFDbGFzcyk7CS8vIE5vIHN1Yi1wYXRoLCBzbyBqdXN0IHRoZSBqYXZhIGNsYXNzLgotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVGhlcmUgaXMgYSBzdWItcGF0aCBiZWxvdyB0aGUgamF2YSBjbGFzcyB0aGF0IGlzIG5lZWRlZC4gTmVlZCB0byB3YWxrIGRvd24gdGhlIHBhdGguCi0JCQkJCQkJU3RyaW5nW10gcGF0aCA9IEZSQUdNRU5UX1NQTElUVEVSLnNwbGl0KHJvb3RGcmFnLnN1YnN0cmluZyhST09UX0ZSQUdNRU5ULmxlbmd0aCgpKzEpKTsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3S2V5ID0gKEludGVybmFsRU9iamVjdCkgbWVyZ2VJbnRvSmF2YUNsYXNzOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBuZXdLZXkgIT0gbnVsbCAmJiBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCQkJCQluZXdLZXkgPSAoSW50ZXJuYWxFT2JqZWN0KSBuZXdLZXkuZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChwYXRoW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG5ld0tleSAhPSBudWxsKQotCQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG5ld0tleSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFVuaW5zdGFsbCB0aGUgZmFrZSByb290IHJlc291cmNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGluc3RhbGxSb290UmVzb3VyY2UgaGFzIGJlZW4gY2FsbGVkLiBTbyBtdXN0IHVzZSB0cnkvZmluYWxseS4gCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdW5pbnN0YWxsUm9vdFJlc291cmNlKCkgewotCQkJUmVzb3VyY2Ugcm9vdCA9IHJzZXQuZ2V0UmVzb3VyY2UoUk9PVF9VUkksIGZhbHNlKTsKLQkJCWlmIChyb290ICE9IG51bGwpCi0JCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocm9vdCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYXBwbHlFeHRlbnNpb25Eb2NUbyhSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBTdHJpbmcgb3ZlcnJpZGVGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuYXBwbHlPdmVycmlkZXMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIG1lcmdlSW50b0phdmFDbGFzcywgcnNldCwgCi0JCQluZXcgRXh0ZW5zaW9uRG9jQXBwbGllcyhvdmVycmlkZUZpbGUsIHJzZXQsIG1lcmdlSW50b0phdmFDbGFzcywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IGFzIGEgSmF2YUNsYXNzIAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGJlYW5pbmZvIGNvbnN0YW50cyByZWNvcmQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbmluZm9Qcm94eUNvbnN0YW50cyBnZXRQcm94eUNvbnN0YW50cygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGdldFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkgewotCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJcmV0dXJuIGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRBbGxQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXMoKTsKLQl9CQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVPcGVyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRDbGFzc0VudHJ5KCkgIT0gbnVsbCAmJiBnZXRDbGFzc0VudHJ5KCkuaXNPcGVyYXRpb25zU3RvcmVkKCkpCi0JCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsJLy8gQWxyZWFkeSBzdG9yZWQsIGp1c3QgZG8gaWYgbmVjZXNzYXJ5LgotCQllbHNlIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCW5lZWRzSW50cm9zcGVjdGlvbiA9IHRydWU7CS8vIEZvcmNlIHJlaW50cm9zcGVjdGlvbiBiZWNhdXNlIHdlIGVpdGhlciBhcmVuJ3Qgc3RvcmluZyBvcGVyYXRpb25zLCBvciBoYXZlIG5ldmVyIGxvYWRlZC4KLQkJCX0KLQkJCWludHJvc3BlY3RJZk5lY2Vzc2FyeSh0cnVlKTsJLy8gQnV0IGZvcmNlIHRoZSBvcGVyYXRpb25zIG5vdy4KLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRFQWxsT3BlcmF0aW9ucygpCi0JICovCi0JcHVibGljIEJhc2ljRUxpc3QgZ2V0RUFsbE9wZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBhbGxPcGVyYXRpb25zKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEV2ZW50cygpCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50cygpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7Ci0JCXJldHVybiBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXIjZ2V0QWxsRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlyZXR1cm4gYWxsRXZlbnRzKCk7Ci0JfQkJCQkJCi0KLQlwcml2YXRlIHZvaWQgZmluYWxpemVQcm9wZXJ0aWVzKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCwgYW5kIHNldCB0aGUgZXR5cGUgZm9yIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBpdCBzZXQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRQcm9wZXJ0aWVzTWFwKCk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGdldEZlYXR1cmVzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gcC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJcC5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgZnJvbSB0aGUgZmVhdHVyZTsKLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBwKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQkvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJcCA9IG51bGw7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBSZW1vdmUgaXQsIHRoaXMgd2FzIGltcGxpY2l0bHkgY3JlYXRlZCBhbmQgbm90IHByb2Nlc3NlZCB0aGlzIHRpbWUuCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIGEpLmVTZXRQcm94eVVSSShCQURfVVJJKTsJLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vIE5lZWQgdG8gZ28gb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlVHlwZSB0byBtYWtlIHN1cmUgaXQgaXMgc2V0LiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm8gZGVjb3JhdG9yIGJ1dCB3ZSBzdGlsbCBoYXZlIGEgZmVhdHVyZS4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gWzc5MDgzXSBBbHNvIGNoZWNrIGZvciBlVHlwZSBub3Qgc2V0LCBhbmQgaWYgaXQgaXMsIHNldCBpdCB0byBFT2JqZWN0IHR5cGUuIFRoYXQgd2F5IGl0IHdpbGwgYmUgdmFsaWQsIGJ1dCBub3QgdmFsaWQgYXMgCi0JCQkvLyBhIGJlYW4gc2V0dGluZy4KLQkJCWlmIChhLmdldEVUeXBlKCkgPT0gbnVsbCkgewotCQkJCS8vIFNldCBpdCB0byBFT2JqZWN0IHR5cGUuIElmIGl0IGJlY29tZXMgdmFsaWQgbGF0ZXIgKHRocm91Z2ggdGhlIGNsYXNzIGJlaW5nIGNoYW5nZWQpLCB0aGVuIHRoZSBpbnRyb3NwZWN0L3JlZmxlY3QKLQkJCQkvLyB3aWxsIHNldCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLgotCQkJCWEuc2V0RVR5cGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFT2JqZWN0KCkpOwotCQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCQlsb2dnZXIubG9nV2FybmluZygiRmVhdHVyZSBcIiIrZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKyItPiIrYS5nZXROYW1lKCkrIlwiIGRpZCBub3QgaGF2ZSBhIHR5cGUgc2V0LiBUeXBpY2FsbHkgZHVlIHRvIG92ZXJyaWRlIGZpbGUgY3JlYXRpbmcgZmVhdHVyZSBidXQgcHJvcGVydHkgbm90IGZvdW5kIG9uIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCQotCQkJaWYgKHAgIT0gbnVsbCAmJiBjZCAhPSBudWxsKSB7Ci0JCQkJLy8gTm93IGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2FjaGUgZW50cnkgZm9yIHRoaXMgcHJvcGVydHkuCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmJ1aWxkQ2hhbmdlKGNkLCBwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIG1lcmdlIGFsbCAgdGhlIFByb3BlcnRpZXMgKGkuZS4gc3VwZXJ0eXBlcykgKHByb3BlcnRpZXMpCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFsbFByb3BlcnRpZXMoKSB7Ci0JCQotCQlFTGlzdCBqY0FsbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxQcm9wZXJ0aWVzR2VuKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsUHJvcGVydGllczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCQkKLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsUHJvcGVydGllcyA9IG5ldyBVbmlxdWVFTGlzdC5GYXN0Q29tcGFyZSgpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqIAotCQkJICogQHNpbmNlIDEuMS4wCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgT2JqZWN0W10gbmV3RGF0YShpbnQgY2FwYWNpdHkpIHsKLQkJCQlyZXR1cm4gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtjYXBhY2l0eV07Ci0JCQl9Ci0JCX07Ci0JCWJvb2xlYW4gZG9BbGxQcm9wZXJ0aWVzID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkvLyBJZiB3ZSBhcmUgaW50cm9zcGVjdGluZywgZG9uJ3QgZG8gYWxsIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGxpc3QuIEp1c3QgcmV0dXJuIGVtcHR5IHdpdGhvdXQgcmVzZXRpbmcgdGhlIGFsbCBtb2RpZmllZCBmbGFnLgotCQkJZG9BbGxQcm9wZXJ0aWVzID0gIWlzRG9pbmdBbGxQcm9wZXJ0aWVzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsUHJvcGVydGllcykKLQkJCQlpc0RvaW5nQWxsUHJvcGVydGllcyA9IHRydWU7Ci0JCX0KLQkJaWYgKGRvQWxsUHJvcGVydGllcykgewotCQkJdHJ5IHsKLQkJCQlFTGlzdCBsb2NhbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbFByb3BlcnRpZXMgPSBzdXBlclR5cGVzLnNpemUoKSA9PSAxID8gKENvbGxlY3Rpb24pIGFsbFByb3BlcnRpZXMgOiBuZXcgTGlua2VkSGFzaFNldCgpOyAKLQkJCQkJLy8gV2Ugd2lsbCBub3cgbWVyZ2UgYXMgZGlyZWN0ZWQuCi0JCQkJCWJvb2xlYW4gbWVyZ2VBbGwgPSBiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBwcm9wZXJ0aWVzLCBidXQgd2Ugc3RpbGwgbmVlZCBzdXBlciBub24tcHJvcGVydGllcyBvciBleHBsaWN0IG9uZXMuCi0JCQkJCQlpbnQgbGVuU1QgPSBzdXBlclR5cGVzLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQkJCQkJCQlpZiAoIHBkID09IG51bGwgfHwgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2Ugd2FudCB0byBtZXJnZSBhbGwuCQkJCQkKLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBwcm9wZXJ0aWVzIChhbmQgYmVhbiBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IGFkZGVkIGFuZCBub3QgbWVyZ2VhYmxlIChpLmUuIGRpZG4ndCBjb21lIHRocnUgYmVhbmluZm8pKSAKLQkJCQkJCQkvLyBhbmQgYWRkIHRob3NlIG5vdCBzcGVjaWZpY2FsbHkgY2FsbGVkIG91dCBieSBCZWFuSW5mbyBpbiB0aGUgbm90IGluaGVyaXRlZCBsaXN0LgotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCQkJCQkJCQlpZiAocGQgPT0gbnVsbCB8fCAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSB8fCAhc3VwZXJTZXQuY29udGFpbnMocGQuZ2V0TmFtZSgpKSkKLQkJCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIChvciByZWZsZWN0aW9uIGFsd2F5cyBkb2VzIHRoaXMpIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgcHJvcGVydGllcyBhcmUgZ29vZAotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCXdvcmtpbmdBbGxQcm9wZXJ0aWVzLmFkZEFsbCgoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsUHJvcGVydGllcyAhPSBhbGxQcm9wZXJ0aWVzKQotCQkJCQkJYWxsUHJvcGVydGllcy5hZGRBbGwod29ya2luZ0FsbFByb3BlcnRpZXMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIHByb3BlcnRpZXMuCi0JCQkJfQotCQkJCWFsbFByb3BlcnRpZXMuYWRkQWxsKGxvY2FsUHJvcGVydGllcyk7CQkJCQotCQkJCXN1cGVyQWRhcHRlci5zZXRBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbFByb3BlcnRpZXMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbFByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQlhbGxQcm9wZXJ0aWVzLnNocmluaygpOwotCQkJcmV0dXJuIG5ldyBFY29yZUVMaXN0LlVubW9kaWZpYWJsZUVMaXN0LkZhc3RDb21wYXJlKAotCQkJCWdldEphdmFDbGFzcygpLAotCQkJCW51bGwsCi0JCQkJYWxsUHJvcGVydGllcy5zaXplKCksCi0JCQkJYWxsUHJvcGVydGllcy5kYXRhKCkpOwotCQl9IGVsc2UKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcCByZWNvcmQuIElmIHRoaXMgb25lIHRoYXQgc2hvdWxkIGhhdmUgbWVyZ2luZyBkb25lLCB0aGVuCi0JICogcmV0dXJuIHRoZSBQcm9wZXJ0eURlY29yYXRvciBzbyB0aGF0IGl0IGNhbiBoYXZlIHRoZSBQcm9wZXJ0eVJlY29yZCBtZXJnZWQgaW50byBpdC4gRWxzZQotCSAqIHJldHVybiBudWxsIGlmIG5vIG1lcmdpbmcuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVjb3JhdG9yIGNhbGN1bGF0ZVByb3BlcnR5KFByb3BlcnR5UmVjb3JkIHByLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJLy8gSWYgdGhpcyBpcyBhbiBpbmRleGVkIHByb3BlcnR5LCB0aGVuIGEgZmV3IGZpZWxkcyB3aWxsIG5vdCBiZSBzZXQgaW4gaGVyZSwgYnV0Ci0JCS8vIHdpbGwgaW5zdGVhZCBiZSBzZXQgYnkgdGhlIGNhbGN1bGF0ZUluZGV4ZWRQcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQuCi0JCUphdmFIZWxwZXJzIHR5cGUgPSBwci5wcm9wZXJ0eVR5cGVOYW1lICE9IG51bGwgPyBVdGlsaXRpZXMuZ2V0SmF2YVR5cGUoTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUocHIucHJvcGVydHlUeXBlTmFtZSksIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpIDogbnVsbDsKLQotCQlpZiAoaW5kZXhlZCkgewotCQkJLy8gSWYgbm8gYXJyYXkgd3JpdGUgbWV0aG9kIGZvdW5kLCB0aGVuIHNlZSBpZiB0aGVyZSBpcyBhbiBpbmRleGVkIHdyaXRlIG1ldGhvZC4gSWYgdGhlcmUgaXMsIHRoZW4gaXQgaXMgY2hhbmdhYmxlLgotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCS8vIElmIG5vIGFycmF5IHR5cGUgZnJvbSBhYm92ZSwgY3JlYXRlIG9uZSBmcm9tIHRoZSBpbmRleGVkIHR5cGUgcHJveHkuIEFkZCAnW10nIHRvIHR1cm4gaXQgaW50byBhbiBhcnJheS4KLQkJCQl0eXBlID0gVXRpbGl0aWVzLmdldEphdmFUeXBlKE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKCgoSW5kZXhlZFByb3BlcnR5UmVjb3JkKSBwcikuaW5kZXhlZFByb3BlcnR5VHlwZU5hbWUpKyJbXSIsIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5KHByLm5hbWUsIGluZGV4ZWQsIHR5cGUpOyAvLyBBIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3IuCi0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gdGhlIHByb3BlcnR5IGFuZCBpdHMgZGVjb3JhdG9yIHVzaW5nIHRoZSBwYXNzZWQgaW4gaW5mb3JtYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVjb3JhdG9yIGNyZWF0ZVByb3BlcnR5KFN0cmluZyBuYW1lLCBib29sZWFuIGluZGV4ZWQsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJLy8gRmlyc3QgZmluZCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHJvcGVydHkgb2YgdGhpcyBuYW1lLCBhbmQgaWYgdGhlcmUgaXMsIGlzIHRoZSBQcm9wZXJ0eURlY29yYXRvcgotCQkvLyBtYXJrZWQgdG8gbm90IGFsbG93IG1lcmdpbmcgaW4gb2YgaW50cm9zcGVjdGlvbiByZXN1bHRzLgkJCi0JCUhhc2hNYXAgZXhpc3RpbmdMb2NhbHMgPSBnZXRQcm9wZXJ0aWVzTWFwKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwcm9wID0gbnVsbDsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBudWxsOwotCQlPYmplY3QgcCA9IGV4aXN0aW5nTG9jYWxzLmdldChuYW1lKTsKLQkJaWYgKEJvb2xlYW4uRkFMU0UgPT0gcCkKLQkJCXJldHVybiBudWxsOyAvLyBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIG5hbWUsIGNhbid0IHByb2Nlc3MgaXQgYWdhaW4uCi0JCWlmIChwICE9IG51bGwpIHsKLQkJCS8vIFdlJ3ZlIGZvdW5kIG9uZSBvZiB0aGUgc2FtZSBuYW1lLiBXaGV0aGVyIHdlIG1vZGlmeSBpdCBvciB1c2UgaXQgYXMgaXMsIHdlIHB1dCBpbiBhCi0JCQkvLyBzcGVjaWFsIGR1bW15IGluIGl0cyBwbGFjZS4gVGhhdCBtYXJrcyB0aGF0IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIGl0IGFuZCBhY2NlcHRlZCBpdC4KLQkJCWV4aXN0aW5nTG9jYWxzLnB1dChuYW1lLCBCb29sZWFuLkZBTFNFKTsKLQotCQkJLy8gSWYgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBlbnRyeSBzYXlzIG5vdCB0byBtZXJnZSB0aGVuIHJldHVybi4KLQkJCS8vIElmIHRoZXJlIGlzIG5vIFByb3BlcnR5RGVjb3JhdG9yLCB0aGVuIHdlIHdpbGwgbWVyZ2UuIElmIHRoZXkKLQkJCS8vIGRpZG4ndCB3YW50IHRvIG1lcmdlIHRoZW4gc2hvdWxkIG9mIGNyZWF0ZWQgb2YgcHJvcGVydHkgZGVjb3JhdG9yIGFuZCBzYWlkIG5vIG1lcmdlLgotCQkJcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcCk7Ci0JCQlpZiAocGQgIT0gbnVsbCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXByb3AgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwOwotCQl9Ci0KLQkJLy8gTmVlZCB0byB0ZXN0IGlmIHRoaXMgaXMgYW4gaW1wbGljaXQgZGVjb3JhdG9yIGFuZCBpdCBpcyBub3Qgb2YgdGhlIAotCQkvLyBzYW1lIHR5cGUgKGkuZS4gaXMgaW5kZXhlZCBub3cgYnV0IHdhc24ndCBvciB2aXNhLXZlcnNhLCB0aGVuIHdlIG5lZWQKLQkJLy8gdG8gZ2V0IHJpZCBvZiB0aGUgZGVjb3JhdG9yIGFuZCByZWNyZWF0ZSBpdC4gSWYgaXQgaXMgbm90IGltcGxpY2l0LCB0aGVuCi0JCS8vIHdlIGhhdmUgdG8gdXNlIGl0IGFzIGlzIGJlY2F1c2UgdGhlIHVzZXIgc3BlY2lmaWVkLCBzbyBpdCB3b24ndCBiZWNvbWUKLQkJLy8gYW4gaW5kZXhlZCBpZiB0aGUgdXNlciBkaWQgbm90IGNyZWF0ZWQgaXQgYXMgYW4gaW5kZXgsIGFuZCB2aXNhLXZlcnNhLgotCQkvLyBBbHNvIGlmIGl0IGlzIGltcGxpY2l0LCB0aGVuIHdlIG5lZWQgdG8gdW5zZXQgY2VydGFpbiBmZWF0dXJlcyB0aGF0IG1heSBvZgotCQkvLyBiZWVuIHNldCBieSBhIHByZXZpb3VzIHJlZmxlY3Rpb24gd2hpY2ggaGFzIG5vdyBiZWNvbWUgaW50cm9zcGVjdGVkLgotCQkvLyBXaGVuIHJlZmxlY3RlZCB3ZSBzZXQgdGhlIGFjdHVhbCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgbGV0dGluZyBwcm94eSBkZXRlcm1pbmUgdGhlbS4KLQkJaWYgKHBkICE9IG51bGwpIHsKLQkJCWlmIChwZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkvLyBXZSBjYW4ndCBjaGFuZ2UgdGhlIHR5cGUgZm9yIGV4cGxpY2l0LgotCQkJCWluZGV4ZWQgPSBwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChpbmRleGVkICYmICEocGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpKSB8fCAoIWluZGV4ZWQgJiYgcGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpKSB7Ci0JCQkJCS8vIEl0IGlzIGltcGxpY2l0IGFuZCBvZiBhIGRpZmZlcmVudCB0eXBlLCBzbyBqdXN0IGdldCByaWQgb2YgaXQgYW5kIGxldCBpdCBiZSByZWNyZWF0ZWQgY29ycmVjdGx5LgotCQkJCQlwcm9wLmdldEVBbm5vdGF0aW9ucygpLnJlbW92ZShwZCk7Ci0JCQkJCXBkID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGQgIT0gbnVsbCkKLQkJCQlpZiAoaW5kZXhlZCkKLQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIHBkKTsKLQkJCQllbHNlCi0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihwZCk7Ci0JCX0KLQotCQlJbXBsaWNpdEl0ZW0gaW1wbGljaXQgPSBwZCA9PSBudWxsID8gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMIDogcGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IHByb3BlcnR5LgotCQkJLy8gV2UgY2FuJ3QgaGF2ZSBhbiBpbXBsaWNpdCBmZWF0dXJlLCBidXQgYW4gZXhwbGljaXQgZGVjb3JhdG9yLgotCQkJZ2V0RmVhdHVyZXNMaXN0KCkuYWRkKHByb3AgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVSZWZlcmVuY2UoKSk7Ci0JCQlpbXBsaWNpdCA9IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsKLQkJfQotCi0JCXNldFByb3BlcnR5SUQobmFtZSwgcHJvcCk7Ci0JCXByb3Auc2V0TmFtZShuYW1lKTsKLQkJcHJvcC5zZXRUcmFuc2llbnQoZmFsc2UpOwotCQlwcm9wLnNldFZvbGF0aWxlKGZhbHNlKTsKLQotCQkvLyBDb250YWlubWVudCBhbmQgVW5zZXR0YWJsZSBpcyB0cmlja3kgZm9yIEVSZWZlcmVuY2VzLiBUaGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLCBvciBpdCBkZWZhdWx0ZWQgdG8KLQkJLy8gZmFsc2UgYmVjYXVzZSBFQ29yZSBoYXMgbm90IG1hZGUgY29udGFpbm1lbnQvdW5zZXR0YWJsZSBhbiB1bnNldHRhYmxlIGZlYXR1cmUuIFNvIHdlIG5lZWQgdG8gaW5zdGVhZCB1c2UgdGhlIGFsZ29yaXRobSBvZiBpZiB3ZSBoZXJlIAotCQkvLyBjcmVhdGVkIHRoZSBmZWF0dXJlLCB0aGVuIHdlIHdpbGwgYnkgZGVmYXVsdCBzZXQgaXQgdG8gY29udGFpbm1lbnQvdW5zZXR0YWJsZS4gSWYgaXQgd2FzIGNyZWF0ZWQgdGhyb3VnaCBkaWZmIG1lcmdlLCB0aGVuCi0JCS8vIHdlIHdpbGwgbGVhdmUgaXQgYWxvbmUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgbWVyZ2UgZmlsZSB3cml0ZXIgdG8gc2V0IGNvbnRhaW5tZW50L3Vuc2V0dGFibGUgY29ycmVjdGx5LgotCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQlwcm9wLnNldFVuc2V0dGFibGUodHJ1ZSk7Ci0JCX0KLQkJcHJvcC5zZXRFVHlwZSh0eXBlKTsKLQkJaWYgKCFpbmRleGVkKSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoLTEpOwotCQkJcHJvcC5zZXRVbmlxdWUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBOb3cgY3JlYXRlL2ZpbGwgaW4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmZpbmZvLgkJCi0JCWlmIChwZCA9PSBudWxsKSB7Ci0JCQlwZCA9Ci0JCQkJKCFpbmRleGVkKQotCQkJCQk/IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoKQotCQkJCQk6IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JCQlwZC5zZXRJbXBsaWNpdERlY29yYXRvckZsYWcoaW1wbGljaXQpOwotCQkJcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQocGQpOwotCQl9Ci0JCXJldHVybiBwZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwcm9wCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5SUQoU3RyaW5nIG5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwcm9wKSB7Ci0JCS8vIE5vdyBmaWxsIGl0IGluLiBOb3JtYWwgaWQgZm9yIGFuIGF0dHJpYnV0ZSBpcyAiY2xhc3NuYW1lLmF0dHJpYnV0ZW5hbWUiIGJ1dCB3ZSBjYW4ndCB1c2UgdGhhdAotCQkvLyBmb3IgdXMgYmVjYXVzZSB0aGF0IGZvcm1hdCBpcyB1c2VkIGJ5IEphdmEgQ29yZSBmb3IgYSBmaWVsZCBhbmQgdGhlcmUgd291bGQgYmUgY29uZnVzaW9uLgotCQkvLyBTbyB3ZSB3aWxsIHVzZSAnLycgaW5zdGVhZC4KLQkJKChYTUlSZXNvdXJjZSkgcHJvcC5lUmVzb3VyY2UoKSkuc2V0SUQocHJvcCwgZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpICsgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5GRUFUVVJFICsgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBSZWZsZWN0IHRoZSBwcm9wZXJ0aWVzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgbWV0aG9kcyBhbmQgbWF0Y2hpbmcgdGhlbSB1cCB0bwotCSAqIHNlZSBpZiB0aGV5IGFyZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZsZWN0UHJvcGVydGllcygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZVByb3BlcnRpZXMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIHByb3BlcnRpZXMuCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBkdXBsaWNhdGUgYW55IGZyb20gc3VwZXIgdGhhdCB3ZSBmaW5kIGhlcmUuIFdoZW4gcmVmbGVjdGluZyB3ZSBkb24ndAotCQkvLyBhbGxvdyBkaXNjb3ZlcmVkIGR1cGxpY2F0ZXMgdW5sZXNzIHRoZXkgYXJlIGRpZmZlcmVudCB0eXBlcy4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfUFJPUEVSVElFUyk7CQkKLQkJU2V0IHN1cGVycyA9IG5ldyBIYXNoU2V0KDUwKTsKLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJaWYgKGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBzdXBlckFsbC5nZXQoaTEpOwotCQkJCQkJc3VwZXJzLmFkZChzZi5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgYW55IG9mIHRoZSBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIGJvdW5kLCB0aGVuIGFsbCByZWZsZWN0ZWQgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZCBib3VuZC4KLQkJYm9vbGVhbiBpc0JvdW5kID0gaXNEZWZhdWx0Qm91bmQoKTsKLQkJaWYgKCFpc0JvdW5kKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJLy8gU3RhcnQgZnJvbSBlbmQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgZmlyc3QgY2xhc3MgYWJvdmUgdGhlIHRoaXMgb25lLgotCQkJZm9yIChpbnQgaT1zdXBlclR5cGVzLnNpemUoKS0xOyAhaXNCb3VuZCAmJiBpPj0wOyBpLS0pIHsKLQkJCQlKYXZhQ2xhc3Mgc3ByID0gKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSk7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYmkgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoc3ByLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQkJCS8vIFRoZXkgc2hvdWxkIGFsbCBiZSByZWZsZWN0ZWQsIGJ1dCBiZSBvbiBzYWZlIHNpZGUsIGNoZWNrIGlmIG51bGwuCi0JCQkJaWYgKGJpICE9IG51bGwpCi0JCQkJCWlzQm91bmQgPSBiaS5pc0RlZmF1bHRCb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJSGFzaE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBwcm9wZXJ0aWVzCi0JCQlpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG10aGQuZ2V0TmFtZSgpLnN1YnN0cmluZygzKSk7Ci0JCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBzdXBlcnMuY29udGFpbnMobmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBIYWQgZ2V0KC4uLikgYW5kIG5vdCBnZXRYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgZmFsc2UpKQotCQkJCQkJcHJvcHMucHV0KG5hbWUsIHByb3BJbmZvKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJvcEluZm8uc2V0R2V0dGVyKG10aGQsIGZhbHNlKTsKLQkJCX0gZWxzZSBpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG5hbWUgPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobXRoZC5nZXROYW1lKCkuc3Vic3RyaW5nKDIpKTsKLQkJCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwIHx8IHN1cGVycy5jb250YWlucyhuYW1lKSkKLQkJCQkJY29udGludWU7CS8vIEhhZCBpcyguLi4pIGFuZCBub3QgaXNYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSkpCi0JCQkJCQlwcm9wcy5wdXQobmFtZSwgcHJvcEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKG10aGQuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbmFtZSA9IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtdGhkLmdldE5hbWUoKS5zdWJzdHJpbmcoMykpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID09IDAgfHwgc3VwZXJzLmNvbnRhaW5zKG5hbWUpKQotCQkJCQljb250aW51ZTsJLy8gSGFkIHNldCguLi4pIGFuZCBub3Qgc2V0WFhYKC4uLikgc28gbm90IGEgc2V0dGVyLiBPciB0aGlzIGlzIHRoZSBzYW1lIG5hbWUgYXMgYSBzdXBlciwgZWl0aGVyIHdheSBpZ25vcmUgaXQuCQkJCQotCQkJCVByb3BlcnR5SW5mbyBwcm9wSW5mbyA9IChQcm9wZXJ0eUluZm8pIHByb3BzLmdldChuYW1lKTsKLQkJCQlpZiAocHJvcEluZm8gPT0gbnVsbCkgewotCQkJCQlwcm9wSW5mbyA9IG5ldyBQcm9wZXJ0eUluZm8oKTsKLQkJCQkJaWYgKHByb3BJbmZvLnNldFNldHRlcihtdGhkKSkKLQkJCQkJCXByb3BzLnB1dChuYW1lLCBwcm9wSW5mbyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXByb3BJbmZvLnNldFNldHRlcihtdGhkKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBoYXNoIG1hcCBhbmQgY3JlYXRlIHRoZSBwcm9wZXJ0aWVzLgotCQlpdHIgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOwotCQkJKChQcm9wZXJ0eUluZm8pIGVudHJ5LmdldFZhbHVlKCkpLmNyZWF0ZVByb3BlcnR5KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBpc0JvdW5kKTsKLQkJfQotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9QUk9QRVJUSUVTKTsJCQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlJbmZvIHsKLQkJCi0JCXB1YmxpYyBFQ2xhc3NpZmllciB0eXBlLCBpbmRleGVkVHlwZTsKLQkJcHVibGljIGJvb2xlYW4gY29uc3RyYWluZWQ7Ci0JCXB1YmxpYyBNZXRob2QgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4ZWRHZXR0ZXIsIGluZGV4ZWRTZXR0ZXI7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2V0R2V0dGVyKE1ldGhvZCBnZXQsIGJvb2xlYW4gbXVzdEJlQm9vbGVhbikgewotCQkJTGlzdCBwYXJtcyA9IGdldC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlpZiAocGFybXMuc2l6ZSgpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbXByb3BlciBudW1iZXIgb2YgcGFybXMuCi0JCQlib29sZWFuIGluZGV4ZWQgPSBwYXJtcy5zaXplKCkgPT0gMTsKLQkJCWlmIChpbmRleGVkICYmICEoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJpbnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGEgcGFybSB0aGF0IGlzIG5vdCBhbiBpbnQgaXMgaW52YWxpZCBmb3IgaW5kZXhlZC4KLQkJCUVDbGFzc2lmaWVyIHJldFR5cGUgPSBnZXQuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKHJldFR5cGUgPT0gbnVsbCB8fCByZXRUeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlpZiAobXVzdEJlQm9vbGVhbiAmJiAhcmV0VHlwZS5nZXROYW1lKCkuZXF1YWxzKCJib29sZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpdCBtdXN0IGJlIGEgYm9vbGVhbi4KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgISgoKEphdmFIZWxwZXJzKSB0eXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHR5cGUpLmdldENvbXBvbmVudFR5cGUoKSA9PSByZXRUeXBlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW5kZXhlZCB0eXBlIGRvZXNuJ3QgbWF0Y2ggY29tcG9uZW50IHR5cGUgb2YgYmFzZSB0eXBlLgotCQkJfSBlbHNlIHsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmIChpbmRleGVkVHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgcmV0VHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSByZXRUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQuIFNvIGl0IHRha2VzIHByaW9yaXR5IGFuZCB3aWxsIHdpcGUgb3V0Ci0JCQkJCQkvLyB0aGUgaW5kZXhlZCB0eXBlLgotCQkJCQkJaW5kZXhlZEdldHRlciA9IG51bGw7Ci0JCQkJCQlpbmRleGVkU2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRUeXBlID0gbnVsbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUgd2UgYWxyZWFkeSBoYXZlCi0JCQl9Ci0KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRHZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYW4gaW5kZXhlZCBnZXR0ZXIuCi0JCQkJaW5kZXhlZEdldHRlciA9IGdldDsKLQkJCQlpbmRleGVkVHlwZSA9IHJldFR5cGU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChnZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYSBnZXR0ZXIKLQkJCQlnZXR0ZXIgPSBnZXQ7Ci0JCQkJdHlwZSA9IHJldFR5cGU7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNldFNldHRlcihNZXRob2Qgc2V0KSB7Ci0JCQlMaXN0IHBhcm1zID0gc2V0LmdldFBhcmFtZXRlcnMoKTsKLQkJCWlmIChwYXJtcy5zaXplKCkgPiAyIHx8IHBhcm1zLnNpemUoKSA8IDEpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCQkJYm9vbGVhbiBpbmRleGVkID0gcGFybXMuc2l6ZSgpID09IDI7Ci0JCQlpZiAoaW5kZXhlZCAmJiAhKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiaW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBhIHBhcm0gdGhhdCBpcyBub3QgYW4gaW50IGlzIGludmFsaWQgZm9yIGluZGV4ZWQuCi0JCQlFQ2xhc3NpZmllciByZXRUeXBlID0gc2V0LmdldFJldHVyblR5cGUoKTsKLQkJCWlmIChyZXRUeXBlICE9IG51bGwgJiYgIXJldFR5cGUuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gbXVzdCBub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlFQ2xhc3NpZmllciBwcm9wVHlwZSA9IG51bGw7Ci0JCQlpZiAoaW5kZXhlZCkgewotCQkJCXByb3BUeXBlID0gKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMSkpLmdldEVUeXBlKCk7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAodHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgdHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSB0eXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gcHJvcFR5cGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUsIG9yIGJhc2UgdHlwZSBub3QgYW4gYXJyYXkKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvcFR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAoaW5kZXhlZFR5cGUgIT0gbnVsbAotCQkJCQkmJiAhKCgoSmF2YUhlbHBlcnMpIHByb3BUeXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHByb3BUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU28gaXQgdGFrZXMgcHJpb3JpdHkgYW5kIHdpbGwgd2lwZSBvdXQKLQkJCQkJCS8vIHRoZSBpbmRleGVkIHR5cGUuCi0JCQkJCQlpbmRleGVkR2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRTZXR0ZXIgPSBudWxsOwotCQkJCQkJaW5kZXhlZFR5cGUgPSBudWxsOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGluZGV4ZWQgdHlwZSBkb2Vzbid0IG1hdGNoIGNvbXBvbmVudCB0eXBlIG9mIGJhc2UgdHlwZSBmcm9tIHRoaXMgc2V0dGVyLgotCQkJfQotCi0JCQlpZiAoaW5kZXhlZCkgewotCQkJCWlmIChpbmRleGVkU2V0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBoYXZlIGFuIGluZGV4ZWQgZ2V0dGVyLgotCQkJCWluZGV4ZWRTZXR0ZXIgPSBzZXQ7Ci0JCQkJaW5kZXhlZFR5cGUgPSBwcm9wVHlwZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNldHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEFscmVhZHkgaGF2ZSBhIGdldHRlcgotCQkJCXNldHRlciA9IHNldDsKLQkJCQl0eXBlID0gcHJvcFR5cGU7Ci0JCQl9Ci0KLQkJCWlmIChzZXQuZ2V0SmF2YUV4Y2VwdGlvbnMoKS5jb250YWlucyhVdGlsaXRpZXMuZ2V0SmF2YUNsYXNzKCJqYXZhLmJlYW5zLlByb3BlcnR5VmV0b0V4Y2VwdGlvbiIsIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnN0cmFpbmVkID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNCb3VuZCkgewotCQkJYm9vbGVhbiBpbmRleGVkID0gaW5kZXhlZFR5cGUgIT0gbnVsbDsKLQkJCWlmIChpbmRleGVkICYmIHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIEEgcG90ZW50aWFsIGluZGV4ZWQsIGJ1dCBuZXZlciBmb3VuZCB0aGUgZ2V0dGVyL3NldHRlciBvZiB0aGUgcmVndWxhciB0eXBlLgotCi0JCQlQcm9wZXJ0eURlY29yYXRvciBwcm9wID0KLQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmNyZWF0ZVByb3BlcnR5KAotCQkJCQluYW1lLAotCQkJCQlpbmRleGVkLAotCQkJCQl0eXBlKTsKLQkJCWlmIChwcm9wID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBSZWZsZWN0aW9uIG5vdCB3YW50ZWQuCi0KLQkJCWluZGV4ZWQgPSBwcm9wIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yOyAvLyBJdCBjb3VsZCBvZiBiZWVuIGZvcmNlZCBiYWNrIHRvIG5vdCBpbmRleGVkIGlmIGV4cGxpY2l0bHkgc2V0LgotCi0JCQkvLyBBdCB0aGlzIHBvaW50IGluIHRpbWUgYWxsIGltcGxpY2l0IHNldHRpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLiBUaGlzIGlzIGRvbmUgYmFjayBpbiBjcmVhdGVQcm9wZXJ0eSgpIG1ldGhvZCBhYm92ZS4KLQkJCS8vIFNvIG5vdyBhcHBseSByZWZsZWN0ZWQgc2V0dGluZ3Mgb24gdGhlIHByb3BlcnR5IGRlY29yYXRvci4gCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuc2V0UHJvcGVydGllcyhwcm9wLCBpc0JvdW5kLCBjb25zdHJhaW5lZCwgZ2V0dGVyLCBzZXR0ZXIpOwotCQkJaWYgKGluZGV4ZWQpCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LnNldFByb3BlcnRpZXMoKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcHJvcCwgaW5kZXhlZEdldHRlciwgaW5kZXhlZFNldHRlcik7Ci0KLQkJfQotCX07Ci0KLQkvKgotCSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGludHJvc3BlY3Qgc28gdGhhdCBmbGFncyBhcmUgY29ycmVjdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmluYWxpemVPcGVyYXRpb25zKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KLQkJSXRlcmF0b3IgaXRyID0gZ2V0T3BlcmF0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJRU9wZXJhdGlvbiBhID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlNZXRob2REZWNvcmF0b3IgbSA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYSk7Ci0JCQlpZiAoIW5ld29wZXJhdGlvbnMuY29udGFpbnMoYSkpIHsKLQkJCQkvLyBBIGNhbmRpZGF0ZSBmb3IgcmVtb3ZhbC4gSXQgaXMgaW4gdGhlIGxpc3QgYnV0IHdlIGRpZG4ndCBhZGQgaXQuIENoZWNrIHRvIHNlZSBpZiBpdCBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JCQkJLy8gSWYgbm8gbWV0aG9kZGVjb3JhdG9yLCB0aGVuIGtlZXAgaXQsIG5vdCBvbmUgb3Vycy4KLQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG0uZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQkJCWlmIChpbXBsaWNpdCAhPSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkJCW0uc2V0RU1vZGVsRWxlbWVudChudWxsKTsgLy8gUmVtb3ZlIGl0IGJlY2F1c2UgaXQgd2FzIGltcGxpY2l0LgotCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBtKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBUaGUgb3BlcmF0aW9uIHdhcyBpbXBsaWNpdCB0b28uCi0JCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBhKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsJLy8gQXQgdGhpcyBwb2ludCB3ZSBubyBsb25nZXIgaGF2ZSBhIG1ldGhvZCBkZWNvcmF0b3IsIHNvIGdvIHRvIG5leHQuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChtICE9IG51bGwgJiYgY2QgIT0gbnVsbCkgewotCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNhY2hlIGVudHJ5IGZvciB0aGlzIG1ldGhvZC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIG0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIG10aGREZXNjLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2REZWNvcmF0b3IgY2FsY3VsYXRlT3BlcmF0aW9uKE1ldGhvZFJlY29yZCByZWNvcmQpIHsKLQkJcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbihyZWNvcmQubmFtZSwgZm9ybUxvbmdOYW1lKHJlY29yZCksIG51bGwsIHJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRGVjb3JhdG9yIGNyZWF0ZU9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGxvbmdOYW1lLCBNZXRob2QgbWV0aG9kLCBNZXRob2RSZWNvcmQgcmVjb3JkKSB7Ci0JCS8vIEZpcnN0IGZpbmQgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGJlaGF2aW9yIG9mIHRoaXMgbmFtZSBhbmQgbWV0aG9kIHNpZ25hdHVyZSAsIGFuZCBpZiB0aGVyZSBpcywgaXMgdGhlIE1ldGhvZERlY29yYXRvcgotCQkvLyBtYXJrZWQgdG8gbm90IGFsbG93IG1lcmdpbmcgaW4gb2YgaW50cm9zcGVjdGlvbiByZXN1bHRzLgotCQlIYXNoTWFwIGV4aXN0aW5nTG9jYWxzID0gZ2V0T3BlcmF0aW9uc01hcCgpOwotCQlFT3BlcmF0aW9uIG9wZXIgPSBudWxsOwotCQlNZXRob2REZWNvcmF0b3IgbWQgPSBudWxsOwotCQlPYmplY3QgYiA9IG51bGw7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQliID0gZXhpc3RpbmdMb2NhbHMuZ2V0KGxvbmdOYW1lKTsKLQkJZWxzZQotCQkJYiA9IGV4aXN0aW5nTG9jYWxzLmdldChsb25nTmFtZSk7Ci0JCQkKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBlbnRyeSBzYXlzIG5vdCB0byBtZXJnZSB0aGVuIHJldHVybi4KLQkJCS8vIElmIHRoZXJlIGlzIG5vIGRlY29yYXRvciwgdGhlbiB3ZSB3aWxsIG1lcmdlLiBJZiB0aGV5IGRpZG4ndCB3YW50IHRvCi0JCQkvLyBtZXJnZSwgdGhlbiB0aGV5IHNob3VsZCBvZiBjcmVhdGVkIGEgZGVjb3JhdG9yIHdpdGggbm8gbWVyZ2Ugb24gaXQuCi0JCQltZCA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoKEVPcGVyYXRpb24pIGIpOwotCQkJaWYgKG1kICE9IG51bGwgJiYgIW1kLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlvcGVyID0gKEVPcGVyYXRpb24pIGI7Ci0JCX0KLQotCQkvLyBOZWVkIHRvIGZpbmQgdGhlIG1ldGhvZCBhbmQgbWV0aG9kIGlkLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCS8vIE5vIG1ldGhvZCBzZW50LCBjcmVhdGUgYSBwcm94eSB0byBpdCBmcm9tIHRoZSByZWNvcmQuCi0JCQltZXRob2QgPSBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yKTsKLQkJfQotCi0JCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG1kID09IG51bGwgPyBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwgOiBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUw7Ci0JCWlmIChvcGVyID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IE1ldGhvZFByb3h5LgotCQkJb3BlciA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCWdldE9wZXJhdGlvbnNMaXN0KCkuYWRkKG9wZXIpOwotCQkJaW1wbGljaXQgPSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUw7IAotCQl9CQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwkJCi0KLQkJLy8gTm93IGZpbGwgaXQgaW4uCi0JCWlmIChvcGVyIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQkgKChNZXRob2RQcm94eSkgb3Blcikuc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCXNldE1ldGhvZElEKG5hbWUsIG9wZXIpOwotCQlvcGVyLnNldE5hbWUobmFtZSk7Ci0JCW5ld29wZXJhdGlvbnMuYWRkKG9wZXIpOwotCi0JCS8vIE5vdyBjcmVhdGUvZmlsbCBpbiB0aGUgbWV0aG9kIGRlY29yYXRvciBmb3IgaXQuCi0JCS8vIElmIHRoZXJlIGFscmVhZHkgaXMgb25lIHRoZW4gd2UKLQkJLy8gd2lsbCB1c2UgaXQuIFRoaXMgYWxsb3dzIG1lcmdpbmcgd2l0aCBiZWFuaW5mby4JCQotCQlpZiAobWQgPT0gbnVsbCkgewotCQkJbWQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZERlY29yYXRvcigpOwotCQkJbWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCW9wZXIuZ2V0RUFubm90YXRpb25zKCkuYWRkKG1kKTsKLQkJfSBlbHNlCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY2xlYXIobWQpOwotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gb3BlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RJRChTdHJpbmcgbmFtZSwgRU9wZXJhdGlvbiBvcGVyKSB7Ci0JCSgoWE1JUmVzb3VyY2UpIG9wZXIuZVJlc291cmNlKCkpLnNldElEKG9wZXIsIGdldEphdmFDbGFzcygpLmdldE5hbWUoKSArIEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uQkVIQVZJT1IgKyBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmbGVjdE9wZXJhdGlvbnMoKSB7Ci0JCS8vIElmIHdlIGFyZSBzZXQgdG8gbWVyZ2VTdXBlclR5cGVCZWhhdmlvcnMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIGJlaGF2aW9ycy4KLQkJLy8gVGhpcyBpcyBzbyB0aGF0IGR1cGxpY2F0ZSBhbnkgZnJvbSBzdXBlciB0aGF0IHdlIGZpbmQgaGVyZS4gV2hlbiByZWZsZWN0aW5nIHdlIGRvbid0Ci0JCS8vIGFsbG93IGRpc2NvdmVyZWQgZHVwbGljYXRlcyB1bmxlc3MgdGhleSBhcmUgZGlmZmVyZW50IHNpZ25hdHVyZXMuIFNvIGFsbCBzdXBlciBvcGVyYXRpb25zCi0JCS8vIHdpbGwgYmUgYWxsb3dlZCBhbmQgd2Ugd2lsbCBub3Qgb3ZlcnJpZGUgdGhlbS4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlTZXQgc3VwZXJzID0gbmV3IEhhc2hTZXQoNTApOwotCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQlpZiAoYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJNZXRob2RzKCkpIHsKLQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlpZiAoIXN1cGVyVHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJTGlzdCBzdXBlckFsbCA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKGZvcm1Mb25nTmFtZShvcCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBiZWhhdmlvcnMJCi0JCQlTdHJpbmcgbG9uZ05hbWUgPSBmb3JtTG9uZ05hbWUobXRoZCk7Ci0JCQkvLyBBZGQgaWYgc3VwZXIgbm90IGFscmVhZHkgY29udGFpbiBpdC4KLQkJCWlmICghc3VwZXJzLmNvbnRhaW5zKGxvbmdOYW1lKSkKLQkJCQljcmVhdGVPcGVyYXRpb24obnVsbCwgbG9uZ05hbWUsIG10aGQsIG51bGwpOwkvLyBEb24ndCBwYXNzIGEgbmFtZSwgdHJ5IHRvIGNyZWF0ZSBpdCBieSBuYW1lLCBvbmx5IHVzZSBJRCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG9mIHRoZSBzYW1lIG5hbWUuCi0JCX0KLQl9Ci0KLQkvKgotCSAqIG1lcmdlIGFsbCAgdGhlIEJlaGF2aW9ycyhpLmUuIHN1cGVydHlwZXMpCi0JICovCi0JcHJvdGVjdGVkIEJhc2ljRUxpc3QgYWxsT3BlcmF0aW9ucygpIHsKLQkJQmFzaWNFTGlzdCBqY0FsbE9wZXJhdGlvbnMgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzKCkucHJpbUdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxPcGVyYXRpb25zICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsT3BlcmF0aW9uczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCi0JCVVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlIGFsbE9wZXJhdGlvbnMgPSBuZXcgVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUoKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIE9iamVjdFtdIG5ld0RhdGEoaW50IGNhcGFjaXR5KSB7Ci0JCQkJcmV0dXJuIG5ldyBFT3BlcmF0aW9uW2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJYm9vbGVhbiBkb0FsbE9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgb3BlcmF0b2lucyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbE9wZXJhdGlvbnMgPSAhaXNEb2luZ0FsbE9wZXJhdGlvbnMgJiYgIWlzSW50cm9zcGVjdGluZyAmJiBpc1Jlc291cmNlQ29ubmVjdGVkKCk7Ci0JCQlpZiAoZG9BbGxPcGVyYXRpb25zKQotCQkJCWlzRG9pbmdBbGxPcGVyYXRpb25zID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChkb0FsbE9wZXJhdGlvbnMpIHsKLQkJCXRyeSB7Ci0JCQkJRUxpc3QgbG9jYWxPcGVyYXRpb25zID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkJCS8vIEludGVyZmFjZXMgY2FuIGhhdmUgbXVsdGlwbGUgZXh0ZW5kcywgd2hpbGUgdGhlIEludHJvc3BlY3RvciBpZ25vcmVzIHRoZXNlIGZvciByZWZsZWN0aW9uLAotCQkJCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkJCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMgYW5kIHN0aWxsIGtlZXAgb3JkZXIuCi0JCQkJLy8KLQkJCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBtZXJnZSBpbiB0aGUgc3VwZXJzLgotCQkJCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzdXBlcnR5cGUsIHdlIGNhbiBhZGQgdG8gdGhlIGFjdHVhbCBldmVudHMsIGVsc2Ugd2Ugd2lsbCB1c2UgdGhlIGxpbmtlZCBoYXNoc2V0IHNvIHRoYXQKLQkJCQkJLy8gd2UgZG9uJ3QgYWRkIHBvc3NpYmxlIGR1cGxpY2F0ZXMgKGUuZy4gSUEgZXh0ZW5kcyBJQixJQyBhbmQgSUIgZXh0ZW5kcyBJQy4gSW4gdGhpcyBjYXNlIHRoZXJlIHdvdWxkIGJlIGR1cHMKLQkJCQkJLy8gYmVjYXVzZSBJQiB3b3VsZCBjb250cmlidXRlIElDJ3MgdG9vKS4KLQkJCQkJQ29sbGVjdGlvbiB3b3JraW5nQWxsT3BlcmF0aW9ucyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsT3BlcmF0aW9ucyA6IG5ldyBMaW5rZWRIYXNoU2V0KCk7IAotCQkJCQkvLyBXZSB3aWxsIG5vdyBtZXJnZSBhcyBkaXJlY3RlZC4KLQkJCQkJYm9vbGVhbiBtZXJnZUFsbCA9IGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyTWV0aG9kcygpOwotCQkJCQlpZiAoIW1lcmdlQWxsKSB7Ci0JCQkJCQkvLyB3ZSBkb24ndCB0byB3YW50IHRvIG1lcmdlIHN1cGVyIG9wZXJhdGlvbnMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1vcGVyYXRpb25zLgotCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuU1Q7IGkrKykgewotCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGkxID0gMDsgaTEgPCBsZW47IGkxKyspIHsKLQkJCQkJCQkJRU9wZXJhdGlvbiBvID0gKEVPcGVyYXRpb24pIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQlpZiAobWQgPT0gbnVsbCB8fCAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSkKLQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4KLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBkb24ndCBtZXJnZSBsaXN0LiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgdGhlbiB3ZSBhY2NlcHQgYWxsLgotCQkJCQkJaWYgKGJkICE9IG51bGwgJiYgYmQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIE5vdyB3YWxrIGFuZCBhZGQgaW4gbm9uLWJlYW4gb3BlcmF0aW9ucyAoYW5kIGJlYW4gb3BlcmF0aW9ucyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8gbm90IG1lcmdlIGxpc3QuCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFT3BlcmF0aW9uIG8gPSAoRU9wZXJhdGlvbikgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQkJaWYgKG1kID09IG51bGwgfHwgKG1kLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhbWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkKG8pOwotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGxvbmdOYW1lID0gZm9ybUxvbmdOYW1lKG8pOwotCQkJCQkJCQkJCWlmIChsb25nTmFtZSA9PSBudWxsIHx8ICFzdXBlclNldC5jb250YWlucyhsb25nTmFtZSkpCi0JCQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkQWxsKCgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsT3BlcmF0aW9ucyAhPSBhbGxPcGVyYXRpb25zKQotCQkJCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwod29ya2luZ0FsbE9wZXJhdGlvbnMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIG9wZXJhdGlvbnMuCQkJCQkKLQkJCQl9Ci0JCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwobG9jYWxPcGVyYXRpb25zKTsJCQkJCi0JCQkJRVN1cGVyQWRhcHRlciBzYSA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlckFkYXB0ZXIoKTsKLQkJCQlzYS5zZXRBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbE9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhbGxPcGVyYXRpb25zLnNocmluaygpOwotCQlyZXR1cm4gbmV3IEVjb3JlRUxpc3QuVW5tb2RpZmlhYmxlRUxpc3QuRmFzdENvbXBhcmUoCi0JCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VBbGxPcGVyYXRpb25zKCksCi0JCQlhbGxPcGVyYXRpb25zLnNpemUoKSwKLQkJCWFsbE9wZXJhdGlvbnMuZGF0YSgpKTsKLQotCX0KLQotCS8qCi0JICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gaW50cm9zcGVjdCBzbyB0aGF0IGZsYWdzIGFyZSBjb3JyZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBmaW5hbGl6ZUV2ZW50cyhDaGFuZ2VEZXNjcmlwdGlvbiBjZCkgewotCQkvLyBOb3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRFdmVudHNNYXAoKTsKLQkJSXRlcmF0b3IgaXRyID0gZ2V0RXZlbnRzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhRXZlbnQgYSA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlFdmVudFNldERlY29yYXRvciBlID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZS5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJZS5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgaXQgYmVjYXVzZSBpdCB3YXMgaW1wbGljaXQuCi0JCQkJCQkoKEludGVybmFsRU9iamVjdCkgZSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJaWYgKGltcGxpY2l0ID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWl0ci5yZW1vdmUoKTsgLy8gVGhlIGZlYXR1cmUgd2FzIGltcGxpY2l0IHRvby4KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgYSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7CS8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSBhIGRlY29yYXRvciBhbnkgbW9yZSwgc28gZG9uJ3QgYm90aGVyIGdvaW5nIG9uLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZSAhPSBudWxsICYmIGNkICE9IG51bGwpIHsKLQkJCQkvLyBOb3cgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjYWNoZSBlbnRyeSBmb3IgdGhpcyBldmVudC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIGV2ZW50RGVzYy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY2FsY3VsYXRlRXZlbnQoRXZlbnRTZXRSZWNvcmQgcmVjb3JkKSB7Ci0JCXJldHVybiBjcmVhdGVFdmVudChyZWNvcmQubmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY3JlYXRlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gRmlyc3QgZmluZCBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGV2ZW50IG9mIHRoaXMgbmFtZSwgYW5kIGlmIHRoZXJlIGlzLCBpcyB0aGUgRXZlbnRTZXREZWNvcmF0b3IKLQkJLy8gbWFya2VkIHRvIG5vdCBhbGxvdyBtZXJnaW5nIGluIG9mIGludHJvc3BlY3Rpb24gcmVzdWx0cy4KLQkJSGFzaE1hcCBleGlzdGluZ0xvY2FscyA9IGdldEV2ZW50c01hcCgpOwotCQlKYXZhRXZlbnQgZXZlbnQgPSBudWxsOwotCQlFdmVudFNldERlY29yYXRvciBlZCA9IG51bGw7Ci0JCU9iamVjdCBiID0gZXhpc3RpbmdMb2NhbHMuZ2V0KG5hbWUpOwotCQlpZiAoQm9vbGVhbi5GQUxTRSA9PSBiKQotCQkJcmV0dXJuIG51bGw7IC8vIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZXZlbnQsIGNhbid0IHByb2Nlc3MgaXQgYWdhaW4uCQkJCi0JCWlmIChiICE9IG51bGwpIHsKLQkJCS8vIFdlJ3ZlIGZvdW5kIG9uZSBvZiB0aGUgc2FtZSBldmVudC4gV2hldGhlciB3ZSBtb2RpZnkgaXQgb3IgdXNlIGl0IGFzIGlzLCB3ZSBwdXQgaW4gYQotCQkJLy8gc3BlY2lhbCBkdW1teSBpbiBpdHMgcGxhY2UuIFRoYXQgbWFya3MgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBhbmQgYWNjZXB0ZWQgaXQuCi0JCQlleGlzdGluZ0xvY2Fscy5wdXQobmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCS8vIElmIHRoZSBkZWNvcmF0b3IgZm9yIHRoaXMgZW50cnkgc2F5cyBub3QgdG8gbWVyZ2UgdGhlbiByZXR1cm4uCi0JCQkvLyBJZiB0aGVyZSBpcyBubyBkZWNvcmF0b3IsIHRoZW4gd2Ugd2lsbCBtZXJnZS4gSWYgdGhleSBkaWRuJ3Qgd2FudCB0bwotCQkJLy8gbWVyZ2UsIHRoZW4gdGhleSBzaG91bGQgb2YgY3JlYXRlZCBhIGRlY29yYXRvciB3aXRoIG5vIG1lcmdlIG9uIGl0LgotCQkJZWQgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoKEphdmFFdmVudCkgYik7Ci0JCQlpZiAoZWQgIT0gbnVsbCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWV2ZW50ID0gKEphdmFFdmVudCkgYjsKLQkJfQotCQkKLQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZWQgPT0gbnVsbCA/IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCA6IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTDsKLQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IEV2ZW50LgotCQkJZXZlbnQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJlYW5FdmVudCgpOwotCQkJZ2V0RXZlbnRzTGlzdCgpLmFkZChldmVudCk7Ci0JCQlpbXBsaWNpdCA9IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsgLy8gQ2FuJ3QgaGF2ZSBhbiBpbXBsaWNpdCBmZWF0dXJlIGJ1dCBleHBsaWNpdCBkZWNvcmF0b3IuCi0JCX0KLQotCQlzZXRFdmVudElEKG5hbWUsIGV2ZW50KTsKLQkJZXZlbnQuc2V0TmFtZShuYW1lKTsKLQotCQkvLyBOb3cgY3JlYXRlIGluIHRoZSBldmVudCBkZWNvcmF0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmluZm8uCQkKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWVkID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFdmVudFNldERlY29yYXRvcigpOwotCQkJZWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCWV2ZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlZCk7Ci0JCX0gZWxzZQotCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKGVkKTsKLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGV2ZW50Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEV2ZW50SUQoU3RyaW5nIG5hbWUsIEphdmFFdmVudCBldmVudCkgewotCQkvLyBOb3cgZmlsbCBpdCBpbi4KLQkJKChYTUlSZXNvdXJjZSkgZXZlbnQuZVJlc291cmNlKCkpLnNldElEKGV2ZW50LCBnZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCkgKyBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLkVWRU5UICsgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgZXZlbnRzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgcHVibGljIG1ldGhvZHMgYW5kIGNyZWF0aW5nIGFuIAotCSAqIGV2ZW50IGZvciB0aGUgZGlzY292ZXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEV2ZW50cygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZUV2ZW50cywgdGhlbiB3ZSBuZWVkIHRvIGdldCB0aGUgc3VwZXIgZXZlbnRzLgotCQkvLyBUaGlzIGlzIHNvIHRoYXQgZHVwbGljYXRlIGFueSBmcm9tIHN1cGVyIHRoYXQgd2UgZmluZCBoZXJlLiBXaGVuIHJlZmxlY3Rpbmcgd2UgZG9uJ3QKLQkJLy8gYWxsb3cgZGlzY292ZXJlZCBkdXBsaWNhdGVzLgotCQkvLwotCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJLy8gdGhlIHRydXRoIGlzIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UuIFNvIHdlIHdpbGwgYWRkIHRoZW0gaW4uIEJ1dCBzaW5jZSB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIGl0Ci0JCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMuCi0JCS8vCi0JCS8vIFN1cGVydHlwZXMgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGZvciBjbGFzc2VzLCBpdCBpcyBwb3NzaWJsZSB0byBiZSAwLCAxLCAyIG9yIG1vcmUgZm9yIGludGVyZmFjZXMuCi0JCVNldCBzdXBlcnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCUJlYW5EZWNvcmF0b3IgYmQgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCWlmIChiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQlpbnQgbGVuID0gc3VwZXJBbGwuc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpMT0wOyBpMTxsZW47IGkxKyspIHsKLQkJCQkJCUphdmFFdmVudCBzZSA9IChKYXZhRXZlbnQpIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKHNlLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlIYXNoTWFwIGV2ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWV2ZW50TGlzdGVuZXJDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YS51dGlsLkV2ZW50TGlzdGVuZXIiLCBnZXRKYXZhQ2xhc3MoKSk7IC8vIEluaXRpYWxpemUsIG5lZWRlZCBmb3IgYnVpbGRpbmcgZXZlbnRpbmZvcy4gLy8kTk9OLU5MUy0xJAotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uIiwgZ2V0SmF2YUNsYXNzKCkpOyAvLyBJbml0aWFsaXplLCBuZWVkZWQgZm9yIGJ1aWxkaW5nIGV2ZW50aW5mb3MuIC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiBldmVudHMuCi0JCQlTdHJpbmcga2V5ID0gdmFsaWRFdmVudEFkZGVyKG10aGQpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJRXZlbnRJbmZvIGV2ZW50SW5mbyA9IChFdmVudEluZm8pIGV2ZW50cy5nZXQoa2V5KTsKLQkJCQlpZiAoZXZlbnRJbmZvID09IG51bGwpIHsKLQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQkJCWV2ZW50cy5wdXQoa2V5LCBldmVudEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQl9IGVsc2UgewotCQkJCWtleSA9IHZhbGlkRXZlbnRSZW1vdmUobXRoZCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJCUV2ZW50SW5mbyBldmVudEluZm8gPSAoRXZlbnRJbmZvKSBldmVudHMuZ2V0KGtleSk7Ci0JCQkJCWlmIChldmVudEluZm8gPT0gbnVsbCkgewotCQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQkJZXZlbnRJbmZvLnNldFJlbW92ZXIobXRoZCk7Ci0JCQkJCQlldmVudHMucHV0KGtleSwgZXZlbnRJbmZvKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlldmVudEluZm8uc2V0UmVtb3ZlcihtdGhkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlldmVudExpc3RlbmVyQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQotCQkvLyBOb3cgYWN0dWFsbHkgY3JlYXRlIHRoZSBldmVudHMuCi0JCUhhc2hTZXQgZXZlbnROYW1lcyA9IG5ldyBIYXNoU2V0KGV2ZW50cy5zaXplKCkpOyAvLyBTZXQgb2YgZm91bmQgZXZlbnQgbmFtZXMsIHRvIHByZXZlbnQgZHVwbGljYXRlcwotCQlJdGVyYXRvciBldnRJdHIgPSBldmVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZXZ0SXRyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGV2ZW50TWFwID0gKE1hcC5FbnRyeSkgZXZ0SXRyLm5leHQoKTsKLQkJCUV2ZW50SW5mbyBlaSA9IChFdmVudEluZm8pIGV2ZW50TWFwLmdldFZhbHVlKCk7Ci0JCQlpZiAoZWkuaXNWYWxpZEluZm8oKSkgewotCQkJCVN0cmluZyBldmVudE5hbWUgPSBnZXRFdmVudE5hbWUoKFN0cmluZykgZXZlbnRNYXAuZ2V0S2V5KCkpOwotCQkJCWlmIChldmVudE5hbWVzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBBbGVhZHkgY3JlYXRlZCBpdC4gKE5vdGU6IEludHJvc3BlY3RvciBhY3R1YWxseSB0YWtlcyBsYXN0IG9uZSBvdmVyIHByZXZpb3VzIGR1cHMsIGJ1dCB0aGUgb3JkZXIgaXMgdG90YWxseSB1bmRlZmluZWQsIHNvIGNob29zaW5nIGZpcnN0IGlzIGp1c3QgYXMgZ29vZCBvciBiYWQuCi0KLQkJCQlpZiAoc3VwZXJzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOyAvLyBEb24ndCBvdmVycmlkZSBhIHN1cGVyIGV2ZW50LgotCi0JCQkJaWYgKGVpLmNyZWF0ZUV2ZW50KGV2ZW50TmFtZSkpCi0JCQkJCWV2ZW50TmFtZXMuYWRkKGV2ZW50TmFtZSk7IC8vIEl0IHdhcyB2YWxpZGx5IGNyZWF0ZWQuCi0JCQl9Ci0JCX0KLQotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQl9Ci0KLQkvKioKLQkgKiBtZXJnZSBhbGwgdGhlIEV2ZW50cyAoaS5lLiBzdXBlcnR5cGVzKQotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhbGxFdmVudHMoKSB7Ci0KLQkJRUxpc3QgamNBbGxFdmVudHMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxFdmVudHNHZW4oKTsKLQkJQmVhbmluZm9TdXBlckFkYXB0ZXIgc3VwZXJBZGFwdGVyID0KLQkJCShCZWFuaW5mb1N1cGVyQWRhcHRlcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGdldEphdmFDbGFzcygpLCBCZWFuaW5mb1N1cGVyQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChqY0FsbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkvLyBTZWUgaWYgbmV3IG9uZSByZXF1aXJlZC4KLQkJCWlmIChzdXBlckFkYXB0ZXIgPT0gbnVsbCB8fCAhc3VwZXJBZGFwdGVyLmlzQWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsRXZlbnRzOwotCQkJLy8gQ2FuJ3QgZ2V0IHN1cGVyYWRhcHRlciwgc28gbXVzdCBub3QgYmUgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gcmV0dXJuIGN1cnJlbnQgbGlzdC4gT3Igbm8gY2hhbmdlIHJlcXVpcmVkLiAgICAgICAJCQotCQl9Ci0KLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsRXZlbnRzID0gbmV3IFVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlKCkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4xLjAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBPYmplY3RbXSBuZXdEYXRhKGludCBjYXBhY2l0eSkgewotCQkJCXJldHVybiBuZXcgSmF2YUV2ZW50W2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJCi0JCWJvb2xlYW4gZG9BbGxFdmVudHMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgcHJvcGVydGllcyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbEV2ZW50cyA9ICFpc0RvaW5nQWxsRXZlbnRzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsRXZlbnRzKQotCQkJCWlzRG9pbmdBbGxFdmVudHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGRvQWxsRXZlbnRzKSB7Ci0JCQl0cnkgewotCQkJCUVMaXN0IGxvY2FsRXZlbnRzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbEV2ZW50cyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsRXZlbnRzIDogbmV3IExpbmtlZEhhc2hTZXQoKTsgCi0JCQkJCS8vIFdlIHdpbGwgbm93IG1lcmdlIGFzIGRpcmVjdGVkLgotCQkJCQlib29sZWFuIG1lcmdlQWxsID0gYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJFdmVudHMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBldmVudHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1ldmVudHMgb3IgZXhwbGljaXQgb25lcy4KLQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQlMaXN0IHN1cGVycyA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0QWxsRXZlbnRzKCk7Ci0JCQkJCQkJaW50IGxlbiA9IHN1cGVycy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQlKYXZhRXZlbnQgZSA9IChKYXZhRXZlbnQpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlFdmVudFNldERlY29yYXRvciBlZCA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihlKTsKLQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsRXZlbnRzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4JCQkJCQotCQkJCQkJLy8gQmVhbkluZm8gaGFzIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBldmVudHMgKGFuZCBiZWFuIGV2ZW50cyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQkJSmF2YUV2ZW50IGUgPSAoSmF2YUV2ZW50KSBzdXBlcnMuZ2V0KGkxKTsKLQkJCQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGUpOwotCQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkgfHwgIXN1cGVyU2V0LmNvbnRhaW5zKGVkLmdldE5hbWUoKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGQoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgZXZlbnRzIHNob3VsZCBiZSBhZGRlZCwgb3Igbm8gYmVhbmluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGRBbGwoKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxFdmVudHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsRXZlbnRzICE9IGFsbEV2ZW50cykKLQkJCQkJCWFsbEV2ZW50cy5hZGRBbGwod29ya2luZ0FsbEV2ZW50cyk7CS8vIE5vdyBjb3B5IG92ZXIgdGhlIG9yZGVyZWQgc3VwZXIgZXZlbnRzLgotCQkJCX0KLQkJCQlhbGxFdmVudHMuYWRkQWxsKGxvY2FsRXZlbnRzKTsJCQkJCi0JCQkJc3VwZXJBZGFwdGVyLnNldEFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZChmYWxzZSk7IC8vIE5vdyBidWlsdCwgc28gcmVzZXQgdG8gbm90IGNoYW5nZWQuCi0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0RvaW5nQWxsRXZlbnRzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbEV2ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCQllbHNlIHsKLQkJCWFsbEV2ZW50cy5zaHJpbmsoKTsKLQkJCXJldHVybiBuZXcgRWNvcmVFTGlzdC5Vbm1vZGlmaWFibGVFTGlzdC5GYXN0Q29tcGFyZSgKLQkJCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpLAotCQkJCWFsbEV2ZW50cy5zaXplKCksCi0JCQkJYWxsRXZlbnRzLmRhdGEoKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSmF2YUNsYXNzIGV2ZW50TGlzdGVuZXJDbGFzcywgLy8gRXZlbnQgTGlzdGVuZXIgY2xhc3MuIE5lZWRlZCBmb3IgdmFsaWRhdGlvbi4KLQl0b29NYW55RXhjZXB0aW9uQ2xhc3M7IC8vIFRvbyBtYW55IGxpc3RlbmVycyBleGNlcHRpb24uCi0KLQkvKgotCSAqIFBhc3MgaW4gdGhlIGtleSwgaXQgd2lsbCBiZSB1c2VkIHRvIGZvcm0gdGhlIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudE5hbWUoU3RyaW5nIGtleSkgewotCQlyZXR1cm4ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignOicpKTsKLQl9Ci0KLQkvKgkKLQkgKiBBbnN3ZXJzIGV2ZW50IGtleSBpZiB2YWxpZCwgbnVsbCBpZiBub3QgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZEV2ZW50QWRkZXIoTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmICghbmFtZS5zdGFydHNXaXRoKCJhZGQiKSB8fCAhbmFtZS5lbmRzV2l0aCgiTGlzdGVuZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHZhbGlkIGZvcm1hdCBmb3IgYW4gYWRkIGxpc3RlbmVyIG5hbWUuCi0JCS8vIE5vdGUuIFRoZSBCZWFuIHNwZWNzIG9ubHkgc3RhdGUgdGhhdCBpdCBzaG91bGQgYmUgImFkZDxMaXN0ZW5lclR5cGU+IiBidXQgdGhlCi0JCS8vIGludHJvc3BlY3RvciBpbXBsaWNpdGx5IGFkZHMgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IGluIHRoYXQgdGhlIGxpc3RlbmVyIHR5cGUKLQkJLy8gc2hvdWxkIGVuZCB3aXRoICJMaXN0ZW5lciIuIElmIGl0IGRvZXNuJ3QgdGhlIGludHJvc3BlY3RvciB3b3VsZCBhY3R1YWxseSB0aHJvdwotCQkvLyBhbiBpbmRleCBvdXQgb2YgYm91bmRzLiBXZSdsbCBqdXN0IGlnbm9yZSBzdWNoIG1ldGhvZHMuCi0KLQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwYXJtcy5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCi0JCUVDbGFzc2lmaWVyIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8ICFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7IC8vIEludmFsaWQgLSBtdXN0IGJlIHZvaWQgcmV0dXJuIHR5cGUuCi0KLQkJRUNsYXNzaWZpZXIgcGFybVR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJaWYgKCFCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmV2ZW50TGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcm1UeXBlKSkKLQkJCXJldHVybiBudWxsOyAvLyBQYXJtIG11c3QgYmUgaW5oZXJpdCBmcm9tIEV2ZW50TGlzdGVuZXIKLQotCQkvLyBCZWFucyBpbnRyb3NwZWN0b3IgYWxzbyByZXF1aXJlcyB0aGF0IHRoZSAibGlzdGVuZXIiIHBhcnQgb2YgdGhlIG5hbWUgYmUgYQotCQkvLyBzdWZmaXggb2YgdGhlIHR5cGUgbmFtZS4gU28gaWYgdGhlIHR5cGUgbmFtZSB3YXMgIklTb21lTGlzdGVuZXIiIHRoZW4KLQkJLy8gdGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgImFkZFNvbWVMaXN0ZW5lciIgKGFjdHVhbGx5ICJhZGRvbWVMaXN0ZW5lciIKLQkJLy8gd291bGQgYWxzbyBiZSB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIGludHJvc3BlY3RvciEpLgotCQkvLyBUaGlzIGFsbG93cyB0aGUgdHlwZSB0byBiZSBhbiBpbnRlcmZhY2UgdXNpbmcgdGhlICJJIiBjb252ZW50aW9uIHdoaWxlIG5vdAotCQkvLyByZXF1aXJpbmcgdGhlICJJIiB0byBiZSBpbiB0aGUgbmFtZSBvZiB0aGUgZXZlbnQuCQkKLQkJaWYgKCFwYXJtVHlwZS5nZXROYW1lKCkuZW5kc1dpdGgobmFtZS5zdWJzdHJpbmcoMykpKQotCQkJcmV0dXJuIG51bGw7CS8vIEl0IGlzIG5vdCAiYWRke0xpc3RlbmVyVHlwZX0iLgotCi0JCS8vIFRoaXMgaXMgYSB1bmlxdWUgY29udGFpbmluZyBldmVudCBuYW1lIGFuZCBsaXN0ZW5lciB0eXBlCi0JCS8vIFRoaXMgaXMgc28gd2UgY2FuIGhhdmUgYSB1bmlxdWUga2V5IGZvciB0d28gZXZlbnRzIHdpdGggdGhlIHNhbWUKLQkJLy8gbmFtZSBidXQgZGlmZmVyZW50IGxpc3RlbmVyIHR5cGUuIChUaGlzIG1hdGNoZXMgSW50cm9zcGVjdG9yIHNvIHRoYXQgd2UgYXJlbid0Ci0JCS8vIGNvbWluZyB1cCB3aXRoIGRpZmZlcmVudCByZXN1bHRzLgotCQlyZXR1cm4gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDMsIG5hbWUubGVuZ3RoKCkgLSA4KSkKLQkJCSsgJzonCi0JCQkrICgoSmF2YUhlbHBlcnMpIHBhcm1UeXBlKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBBbnN3ZXJzIGV2ZW50IGtleSBpZiB2YWxpZCwgbnVsbCBpZiBub3QgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZEV2ZW50UmVtb3ZlKE1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQlpZiAoIW5hbWUuc3RhcnRzV2l0aCgicmVtb3ZlIikgfHwgIW5hbWUuZW5kc1dpdGgoIkxpc3RlbmVyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG51bGw7IC8vIE5vdCB2YWxpZCBmb3JtYXQgZm9yIGEgcmVtb3ZlIGxpc3RlbmVyIG5hbWUuCi0JCS8vIE5vdGUuIFRoZSBCZWFuIHNwZWNzIG9ubHkgc3RhdGUgdGhhdCBpdCBzaG91bGQgYmUgImFkZDxMaXN0ZW5lclR5cGU+IiBidXQgdGhlCi0JCS8vIGludHJvc3BlY3RvciBpbXBsaWNpdGx5IGFkZHMgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IGluIHRoYXQgdGhlIGxpc3RlbmVyIHR5cGUgbmFtZQotCQkvLyBzaG91bGQgZW5kIHdpdGggIkxpc3RlbmVyIi4gSWYgaXQgZG9lc24ndCB0aGUgaW50cm9zcGVjdG9yIHdvdWxkIGFjdHVhbGx5IHRocm93Ci0JCS8vIGFuIGluZGV4IG91dCBvZiBib3VuZHMuIFdlJ2xsIGp1c3QgaWdub3JlIHN1Y2ggbWV0aG9kcy4KLQkJCi0KLQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwYXJtcy5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCi0JCUVDbGFzc2lmaWVyIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8ICFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7IC8vIEludmFsaWQgLSBtdXN0IGJlIHZvaWQgcmV0dXJuIHR5cGUuCi0KLQkJRUNsYXNzaWZpZXIgcGFybVR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJaWYgKCFCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmV2ZW50TGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcm1UeXBlKSkKLQkJCXJldHVybiBudWxsOyAvLyBQYXJtIG11c3QgYmUgaW5oZXJpdCBmcm9tIEV2ZW50TGlzdGVuZXIKLQotCQkvLyBCZWFucyBpbnRyb3NwZWN0b3IgYWxzbyByZXF1aXJlcyB0aGF0IHRoZSAibGlzdGVuZXIiIHBhcnQgb2YgdGhlIG5hbWUgYmUgYQotCQkvLyBzdWZmaXggb2YgdGhlIHR5cGUgbmFtZS4gU28gaWYgdGhlIHR5cGUgbmFtZSB3YXMgIklTb21lTGlzdGVuZXIiIHRoZW4KLQkJLy8gdGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgInJlbW92ZVNvbWVMaXN0ZW5lciIgKGFjdHVhbGx5ICJyZW1vdmVvbWVMaXN0ZW5lciIKLQkJLy8gd291bGQgYWxzbyBiZSB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIGludHJvc3BlY3RvciEpLgotCQkvLyBUaGlzIGFsbG93cyB0aGUgdHlwZSB0byBiZSBhbiBpbnRlcmZhY2UgdXNpbmcgdGhlICJJIiBjb252ZW50aW9uIHdoaWxlIG5vdAotCQkvLyByZXF1aXJpbmcgdGhlICJJIiB0byBiZSBpbiB0aGUgbmFtZSBvZiB0aGUgZXZlbnQuCi0JCWlmICghcGFybVR5cGUuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUuc3Vic3RyaW5nKDYpKSkKLQkJCXJldHVybiBudWxsOwkvLyBJdCBpcyBub3QgImFkZHtMaXN0ZW5lclR5cGV9Ii4KLQotCQkvLyBUaGlzIGlzIGEgdW5pcXVlIGNvbnRhaW5pbmcgZXZlbnQgbmFtZSBhbmQgbGlzdGVuZXIgdHlwZQotCQkvLyBUaGlzIGlzIHNvIHdlIGNhbiBoYXZlIGEgdW5pcXVlIGtleSBmb3IgdHdvIGV2ZW50cyB3aXRoIHRoZSBzYW1lCi0JCS8vIG5hbWUgYnV0IGRpZmZlcmVudCBsaXN0ZW5lciB0eXBlLiAoVGhpcyBtYXRjaGVzIEludHJvc3BlY3RvciBzbyB0aGF0IHdlIGFyZW4ndAotCQkvLyBjb21pbmcgdXAgd2l0aCBkaWZmZXJlbnQgcmVzdWx0cykuCi0JCXJldHVybiBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZS5zdWJzdHJpbmcoNiwgbmFtZS5sZW5ndGgoKSAtIDgpKQotCQkJKyAnOicKLQkJCSsgKChKYXZhSGVscGVycykgcGFybVR5cGUpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRCb3VuZCgpIHsKLQkJaWYgKGRlZmF1bHRCb3VuZCA9PSBudWxsKSB7Ci0JCQkvLyBIYXZlbid0IHlldCBkZWNpZGVkIG9uIGl0LgotCQkJSXRlcmF0b3IgbWV0aG9kcyA9IGdldEphdmFDbGFzcygpLmdldFB1YmxpY01ldGhvZHMoKS5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBmb3VuZEFkZCA9IGZhbHNlLCBmb3VuZFJlbW92ZSA9IGZhbHNlOwotCQkJd2hpbGUgKG1ldGhvZHMuaGFzTmV4dCgpICYmICghZm91bmRBZGQgfHwgIWZvdW5kUmVtb3ZlKSkgewotCQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLm5leHQoKTsKLQkJCQlpZiAoImFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQkJCQlpZiAocGFybXMuc2l6ZSgpID09IDEpIHsKLQkJCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCk7Ci0JCQkJCQlpZiAoImphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciIuZXF1YWxzKCgoSmF2YUhlbHBlcnMpIHBhcm0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm91bmRBZGQgPSB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgicmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciIuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJCWlmIChwYXJtcy5zaXplKCkgPT0gMSkgewotCQkJCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKTsKLQkJCQkJCWlmICgiamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIi5lcXVhbHMoKChKYXZhSGVscGVycykgcGFybS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlmb3VuZFJlbW92ZSA9IHRydWU7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRlZmF1bHRCb3VuZCA9IChmb3VuZEFkZCAmJiBmb3VuZFJlbW92ZSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0Qm91bmQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFdmVudEluZm8gewotCQkKLQkJcHVibGljIE1ldGhvZCBhZGRMaXN0ZW5lck1ldGhvZDsKLQkJcHVibGljIE1ldGhvZCByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQotCQlwdWJsaWMgdm9pZCBzZXRBZGRlcihNZXRob2QgYWRkTWV0aG9kKSB7Ci0JCQlhZGRMaXN0ZW5lck1ldGhvZCA9IGFkZE1ldGhvZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlbW92ZXIoTWV0aG9kIHJlbW92ZU1ldGhvZCkgewotCQkJcmVtb3ZlTGlzdGVuZXJNZXRob2QgPSByZW1vdmVNZXRob2Q7Ci0JCX0KLQotCQkvLyBBbnN3ZXIgd2hldGhlciB0aGlzIGlzIGEgdmFsaWQgZXZlbnQgaW5mby4KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZEluZm8oKSB7Ci0JCQlyZXR1cm4gKGFkZExpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgcmVtb3ZlTGlzdGVuZXJNZXRob2QgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVFdmVudChTdHJpbmcgbmFtZSkgewotCQkJRXZlbnRTZXREZWNvcmF0b3IgZWQgPSBCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmNyZWF0ZUV2ZW50KG5hbWUpOwotCQkJaWYgKGVkID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBSZWZsZWN0aW9uIG5vdCB3YW50ZWQuCi0KLQotCQkJLy8gU2VlIGlmIHVuaWNhc3QuCi0JCQlib29sZWFuIHVuaWNhc3QgPSBmYWxzZTsKLQkJCUxpc3QgZXhjZXB0aW9ucyA9IGFkZExpc3RlbmVyTWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCQlpbnQgbGVuID0gZXhjZXB0aW9ucy5zaXplKCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxsZW47IGkrKykgewotCQkJCWlmIChleGNlcHRpb25zLmdldChpKSA9PSBCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLnRvb01hbnlFeGNlcHRpb25DbGFzcykgewotCQkJCQl1bmljYXN0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2UnbGwgbGV0IGxpc3RlbmVyIG1ldGhvZHMgZ2V0IHJldHJpZXZlZCBkeW5hbWljYWxseSB3aGVuIG5lZWRlZC4KLQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5zZXRQcm9wZXJ0aWVzKGVkLCBhZGRMaXN0ZW5lck1ldGhvZCwgcmVtb3ZlTGlzdGVuZXJNZXRob2QsIHVuaWNhc3QsIChKYXZhQ2xhc3MpICgoSmF2YVBhcmFtZXRlcikgYWRkTGlzdGVuZXJNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkuZ2V0RVR5cGUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTWFyaCB0aGUgZmFjdG9yeSBhcyBzdGFsZSwgYnV0IGxlYXZlIHRoZSBvdmVycmlkZXMgYWxvbmUuIFRoZXkgYXJlIG5vdCBzdGFsZS4KLQkgKiBAcGFyYW0gc3RhbGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUZhY3RvcnkoUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhbGUpIHsKLQkJbWFya1N0YWxlRmFjdG9yeShzdGFsZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBNYXJrIHRoaXMgZmFjdG9yeSBhcyB0aGUgc3RhbGUgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xlYXJPdmVycmlkZGVzIGNsZWFyIHRoZSBvdmVycmlkZXMgdG9vLiBUaGV5IGFyZSBzdGFsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVGYWN0b3J5KFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YWxlLCBib29sZWFuIGNsZWFyT3ZlcnJpZGRlcykgewotCQlpZiAoc3RhbGVGYWN0b3J5ID09IG51bGwpIHsKLQkJCS8vIEl0J3Mgbm90IHN0YWxlIHNvIG1ha2UgaXQgc3RhbGUuCi0JCQkvLyBTbyB0aGF0IG5leHQgYWNjZXNzIHdpbGwgcmUtaW50cm9zcGVjdAotCQkJZGVmYXVsdEJvdW5kID0gbnVsbDsgLy8gU28gcXVlcnkgb24gbmV4dCByZXF1ZXN0LgotCQkJc3RhbGVGYWN0b3J5ID0gbmV3IFdlYWtSZWZlcmVuY2Uoc3RhbGUpOwotCi0JCQkvLyBOZWVkIHRvIG1hcmsgdGhlIGVzdXBlcmFkYXB0ZXIgdGhhdCB0aGluZ3MgaGF2ZSBjaGFuZ2VkIHNvIHRoYXQgYW55IAotCQkJLy8gc3VidHlwZSB3aWxsIGtub3cgdG8gcmV1c2UgdGhlIHBhcmVudCBmb3IgYW55dGhpbmcgdGhhdCByZXF1aXJlcyBrbm93aW5nIHBhcmVudCBpbmZvLgotCQkJQWRhcHRlciBhID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihnZXRUYXJnZXQoKSwgRVN1cGVyQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBTaW11bGF0ZSB0aGF0IHRoaXMgb2JqZWN0cyBzdXBlciBoYXMgY2hhbmdlZC4gVGhpcyB3aWxsIG1ha2UgYWxsIHN1YmNsYXNzZXMKLQkJCS8vIHRoaW5rIGFib3V0IHRoZSBzdXBlciBoYXMgY2hhbmdlZCBhbmQgbmV4dCByZXRyaWV2aW5nIGFueXRoaW5nIHRoYXQgaW52b2x2ZXMgdGhlCi0JCQkvLyBzdXBlciB3aWxsIGNhdXNlIGEgcmVidWlsZCB0byBvY2N1ci4KLQkJCU5vdGlmaWNhdGlvbiBub3RlID0KLQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgZ2V0VGFyZ2V0KCksIE5vdGlmaWNhdGlvbi5TRVQsIEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUywgbnVsbCwgbnVsbCk7Ci0JCQlpZiAoYSAhPSBudWxsKQotCQkJCWEubm90aWZ5Q2hhbmdlZChub3RlKTsKLQkJCS8vIERvIHRoZSBzYW1lIHdpdGggQmVhbmluZm9TdXBlckFkYXB0ZXIgc28gdGhhdCBldmVudHMgYWxzbyB3aWxsIGJlIHJlYnVpbHQuCi0JCQlhID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihnZXRUYXJnZXQoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQlhLm5vdGlmeUNoYW5nZWQobm90ZSk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQluZWVkc0ludHJvc3BlY3Rpb24gPSB0cnVlOwotCQkJCWlmIChjbGVhck92ZXJyaWRkZXMpIHsKLQkJCQkJcmV0cmlldmVkRXh0ZW5zaW9uRG9jdW1lbnQgPSBDTEVBUl9FWFRFTlNJT05TOwotCQkJCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQljbGFzc0VudHJ5Lm1hcmtEZWxldGVkKCk7Ci0JCQkJCQljbGFzc0VudHJ5ID0gbnVsbDsgLy8gR2V0IGEgbmV3IG9uZSBuZXh0IHRpbWUuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JtIGEgbG9uZ25hbWUgZm9yIHRoZSBhZGRrZXkgZnVuY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybUxvbmdOYW1lKEVPcGVyYXRpb24gZmVhdHVyZSkgewotCQlNZXRob2QgbXRoZCA9IG51bGw7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWV0aG9kKQotCQkJbXRoZCA9IChNZXRob2QpIGZlYXR1cmU7Ci0JCWVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNZXRob2RQcm94eSkKLQkJCW10aGQgPSAoKE1ldGhvZFByb3h5KSBmZWF0dXJlKS5nZXRNZXRob2QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7IC8vIERvbid0IGtub3cgd2hhdCBpdCBpcy4KLQotCQlTdHJpbmdCdWZmZXIgbG9uZ05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWxvbmdOYW1lLmFwcGVuZChmZWF0dXJlLmdldE5hbWUoKSk7IC8vIEZlYXR1cmUgTmFtZQotCQlsb25nTmFtZS5hcHBlbmQoJzonKTsKLQkJbG9uZ05hbWUuYXBwZW5kKG10aGQuZ2V0TmFtZSgpKTsgLy8gTWV0aG9kIE5hbWUKLQkJbG9uZ05hbWUuYXBwZW5kKCcoJyk7Ci0JCUxpc3QgcCA9IG10aGQuZ2V0UGFyYW1ldGVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHAuc2l6ZSgpOyBpKyspIHsKLQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwLmdldChpKTsKLQkJCWlmIChpPjApCi0JCQkJbG9uZ05hbWUuYXBwZW5kKCcsJyk7Ci0JCQlsb25nTmFtZS5hcHBlbmQocGFybS5nZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbG9uZ05hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBjYW4gaGF2ZSB0aGUgc2FtZSBuYW1lLiBUbyBpZGVudGlmeSB0aGVtIHVuaXF1ZWx5LCB0aGUgbG9uZyBuYW1lIGlzIGNyZWF0ZWQsCi0JICogd2hpY2ggaXMgZm9ybWVkIGZyb20gdGhlIG5hbWUgYW5kIHRoZSBtZXRob2Qgc2lnbmF0dXJlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1Mb25nTmFtZShNZXRob2RSZWNvcmQgcmVjb3JkKSB7Ci0JCVN0cmluZ0J1ZmZlciBsb25nTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJbG9uZ05hbWUuYXBwZW5kKHJlY29yZC5uYW1lKTsgLy8gRmVhdHVyZSBOYW1lCi0JCWxvbmdOYW1lLmFwcGVuZCgnOicpOwotCQlsb25nTmFtZS5hcHBlbmQocmVjb3JkLm1ldGhvZEZvckRlc2NyaXB0b3IubWV0aG9kTmFtZSk7IC8vIE1ldGhvZCBOYW1lCi0JCWxvbmdOYW1lLmFwcGVuZCgnKCcpOwotCQlTdHJpbmdbXSBwID0gcmVjb3JkLm1ldGhvZEZvckRlc2NyaXB0b3IucGFyYW1ldGVyVHlwZU5hbWVzOwotCQlpZiAocCAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGk+MCkKLQkJCQkJbG9uZ05hbWUuYXBwZW5kKCcsJyk7Ci0JCQkJbG9uZ05hbWUuYXBwZW5kKE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKHBbaV0pKTsKLQkJCX0KLQotCQlyZXR1cm4gbG9uZ05hbWUudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBJbiBjYXNlIG9mIHJlbW92aW5nIGFkYXB0ZXIsIG1ha2Ugc3VyZSB3ZSBhcmUgZmlyc3QgcmVtb3ZlZCBmcm9tIHRoZSBmYWN0b3J5IHNvIGl0IGRvZXNuJ3Qga25vdyBhYm91dCB1cyBhbnltb3JlLgotCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSKQotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5yZW1vdmVBZGFwdGVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAnKCcgKyAoZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbCA/IGdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSA6ICI/IikgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDMwNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbjsKLQotLyoqCi0gKiBKYXZhIFJlZmxlY3Rpb24gS2V5IGV4dGVuc2lvbiB0byByZXRyaWV2ZSBrZXlzIGZvciBiZWFuaW5mbyBjcmVhdGlvbnMuCi0gKiAKLSAqIEhhbmRsZXMgYXR0cmlidXRlcyBhbmQgYmVoYXZpb3JzLgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yIFIuIEwuIEt1bHAgIAotICovCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBpbXBsZW1lbnRzIElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiB7Ci0JCi0JLy8gVGhlIGZvcm1hdCBvZiB0aGUga2V5cyBhcmU6Ci0JLy8gYmVoYXZpb3JzOiAgImNsYXNzbmFtZS9iZWhhdmlvci9iZWhhdmlvcm5hbWUiCi0JLy8gc3RydWN0dXJhbCBmZWF0dXJlczogImNsYXNzbmFtZS9mZWF0dXJlbmFtZSIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAKLQkJQkVIQVZJT1IgPSAiL29wZXJhdGlvbi8iLAkvLyBQaWVjZSBpbiBrZXkgdGhhdCBpbmRpY2F0ZXMgdGhpcyBpcyBhIGJlaGF2aW9yLiAvLyROT04tTkxTLTEkCi0JCUVWRU5UID0gIi9ldmVudC8iLAkJLy8gUGllY2UgaW4ga2V5IHRoYXQgaW5kaWNhdGVzIHRoaXMgaXMgYW4gZXZlbnQuIC8vJE5PTi1OTFMtMSQKLQkJRkVBVFVSRSA9ICIvIjsJCQkvLyBQaWVjZSBpbiBrZXkgdGhhdCBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBhdHRyaWJ1dGUuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmb3IgdGhpcyBrZXkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGtleSwgSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXkpIHsKLQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQlpbnQgaWJlaGF2ZSA9IGtleS5pbmRleE9mKEJFSEFWSU9SKTsKLQkJCWlmIChpYmVoYXZlID4gLTEpIHsKLQkJCQkvLyBXZSBoYXZlIGEgcG9zc2libGUgYmVoYXZpb3IuCi0JCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGtleS5zdWJzdHJpbmcoMCwgaWJlaGF2ZSk7Ci0JCQkJaW50IGliZWhhdmVOYW1lID0gaWJlaGF2ZStCRUhBVklPUi5sZW5ndGgoKTsKLQkJCQlpZiAoaWJlaGF2ZU5hbWUgPCBrZXkubGVuZ3RoKCkpIHsKLQkJCQkJSmF2YUNsYXNzIGphdmFjbGFzcyA9IGdldEphdmFDbGFzcyhyZWZsZWN0aW9uS2V5LCBjbGFzc25hbWUpOwotCQkJCQlpZiAoamF2YWNsYXNzICE9IG51bGwpIHsKLQkJCQkJCWphdmFjbGFzcy5nZXRFT3BlcmF0aW9ucygpOwkvLyBHZXQgdGhlIGxpc3QgaW50cm9zcGVjdGVkIGFuZCBwb3B1bGF0ZWQgaWYgbm90IGFscmVhZHkuCi0JCQkJCQlyZXR1cm4gcmVmbGVjdGlvbktleS5wcmltR2V0KGtleSk7CS8vIEl0IHNob3VsZCBub3cgYmUgdGhlcmUsIAotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgaWV2ZW50ID0ga2V5LmluZGV4T2YoRVZFTlQpOwotCQkJCWlmIChpZXZlbnQgPiAtMSkgewotCQkJCQkvLyBXZSBoYXZlIGEgcG9zc2libGUgZXZlbnQuCi0JCQkJCVN0cmluZyBjbGFzc25hbWUgPSBrZXkuc3Vic3RyaW5nKDAsIGlldmVudCk7Ci0JCQkJCWludCBpZXZlbnROYW1lID0gaWV2ZW50K0VWRU5ULmxlbmd0aCgpOwotCQkJCQlpZiAoaWV2ZW50TmFtZSA8IGtleS5sZW5ndGgoKSkgewotCQkJCQkJSmF2YUNsYXNzIGphdmFjbGFzcyA9IGdldEphdmFDbGFzcyhyZWZsZWN0aW9uS2V5LCBjbGFzc25hbWUpOwotCQkJCQkJaWYgKGphdmFjbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQkJamF2YWNsYXNzLmdldEV2ZW50cygpOwkvLyBHZXQgdGhlIGxpc3QgaW50cm9zcGVjdGVkIGFuZCBwb3B1bGF0ZWQgaWYgbm90IGFscmVhZHkuCi0JCQkJCQkJcmV0dXJuIHJlZmxlY3Rpb25LZXkucHJpbUdldChrZXkpOwkvLyBJdCBzaG91bGQgbm93IGJlIHRoZXJlLCAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBpZmVhdHVyZSA9IGtleS5pbmRleE9mKEZFQVRVUkUpOwotCQkJCQlpZiAoaWZlYXR1cmUgPiAtMSkgewotCQkJCQkJLy8gV2UgaGF2ZSBhIHBvc3NpYmxlIGZlYXR1cmUuCi0JCQkJCQlTdHJpbmcgY2xhc3NuYW1lID0ga2V5LnN1YnN0cmluZygwLCBpZmVhdHVyZSk7Ci0JCQkJCQlpbnQgaWZlYXR1cmVOYW1lID0gaWZlYXR1cmUrRkVBVFVSRS5sZW5ndGgoKTsKLQkJCQkJCWlmIChpZmVhdHVyZU5hbWUgPCBrZXkubGVuZ3RoKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmVhdHVyZSA9IGtleS5zdWJzdHJpbmcoaWZlYXR1cmVOYW1lKTsKLQkJCQkJCQlKYXZhQ2xhc3MgamF2YWNsYXNzID0gZ2V0SmF2YUNsYXNzKHJlZmxlY3Rpb25LZXksIGNsYXNzbmFtZSk7Ci0JCQkJCQkJaWYgKGphdmFjbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIFRoaXMgaXMganVzdCBhIGhhY2sgdW50aWwgd2UgY2FuIGdldCBJRCBzaXR1YXRpb24gc3RyYWlnaHRlbmVkIG91dC4KLQkJCQkJCQkJLy8gTmVlZCB0byBjYXVzZSBpbnRyb3NwZWN0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzLgotCQkJCQkJCQlqYXZhY2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJCQkJCQlPYmplY3QgcmVzdWx0ID0gcmVmbGVjdGlvbktleS5wcmltR2V0KGtleSk7CS8vIFNlZSBpZiBpdCBub3cgZ290IGFkZGVkIGFzIGFuIGlkLgotCQkJCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQkJCS8vIFdlbGwsIGl0IGNvdWxkIG9mIGJlZW4gYWRkZWQgYnkgdGhlIGRpZmYgbWVyZ2UsIHdoaWNoIGFzIG9mIG5vdyBjYW4ndCBoYW5kbGUgaWRzLgotCQkJCQkJCQkJLy8gU28gd2Ugd2lsbCBmaW5kIGl0IHdpdGhpbiB0aGUgYXR0cmlidXRlcy9yZWZlcmVuY2VzLgotCQkJCQkJCQkJcmVzdWx0ID0gZmluZEZlYXR1cmUoZmVhdHVyZSwgamF2YWNsYXNzLmdldEVSZWZlcmVuY2VzKCkpOwotCQkJCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCQkJCXJlc3VsdCA9IGZpbmRGZWF0dXJlKGZlYXR1cmUsIGphdmFjbGFzcy5nZXRFQXR0cmlidXRlcygpKTsJCQkJCQkJCQkKLQkJCQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCQkJCQkJCQkvLyBOZWVkIHRvIGFkZCBpdCBhcyBhbiBpZCBzbyBuZXh0IHRpbWUgd29uJ3QgY29tZSB0aHJvdWdoIGhlcmUuCi0JCQkJCQkJCQkJKChYTUlSZXNvdXJjZSkgamF2YWNsYXNzLmVSZXNvdXJjZSgpKS5zZXRJRCgoRU9iamVjdCkgcmVzdWx0LCBrZXkpOwkvLyBTbyBuZXh0IHRpbWUgaXQgd2lsbCBmaW5kIGl0IGRpcmVjdGx5LgotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmluZEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lLCBMaXN0IGZlYXR1cmVMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IGZlYXR1cmVMaXN0Lml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRyLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXksIFN0cmluZyBjbGFzc25hbWUpIHsKLQkJT2JqZWN0IGVjbGFzcyA9IHJlZmxlY3Rpb25LZXkucHJpbUdldChjbGFzc25hbWUpOwotCQlpZiAoZWNsYXNzID09IG51bGwpIAotCQkJZWNsYXNzID0gcmVmbGVjdGlvbktleS5nZXRKYXZhVHlwZShjbGFzc25hbWUpOwkvLyBMZXQgaXQgY3JlYXRlIGl0LgotCQlpZiAoZWNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzKQotCQkJcmV0dXJuIChKYXZhQ2xhc3MpIGVjbGFzczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MDEzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmF2YU1vZGVsTGlzdGVuZXI7Ci0vKioKLSAqIFRoaXMgY2xhc3MgbGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgamF2YSBtb2RlbCBhbmQgZmx1c2hzIHRoZQotICogYXBwcm9wcmlhdGUgY2xhc3MgaW50cm9zcGVjdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplciBleHRlbmRzIEphdmFNb2RlbExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBmUHJvamVjdDsgLy8gVGhlIHByb2plY3QgdGhpcyBsaXN0ZW5lciBpcyBvcGVuZWQgb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggQkVBTklORk9DT05GSUdfUEFUSCA9IG5ldyBQYXRoKEJlYW5pbmZvTmF0dXJlLlBfQkVBTklORk9fU0VBUkNIX1BBVEgpOwkvLyROT04tTkxTLTEkCQotCi0JcHVibGljIEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSwgSUphdmFQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UpOwotCQlmQWRhcHRlckZhY3RvcnkgPSBhRmFjdG9yeTsKLQkJZlByb2plY3QgPSBhUHJvamVjdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNnZXRKYXZhUHJvamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNpc0Fsc29DbGFzc3BhdGhDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWxzb0NsYXNzcGF0aENoYW5nZShJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLmVxdWFscyhCRUFOSU5GT0NPTkZJR19QQVRIKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGZyb20gbGlzdGVuaW5nIHRvIGFueSBtb3JlIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFN5bmNocm9uaXplcihib29sZWFuIGNsZWFyUmVzdWx0cykgewotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlnZXRBZGFwdGVyRmFjdG9yeSgpLmNsb3NlQWxsKGNsZWFyUmVzdWx0cyk7Ci0JfQotCi0JcHVibGljIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YVByb2plY3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGlzSW5DbGFzc3BhdGgoZWxlbWVudCkpIHsKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBkZWxldGUvY2xvc2UvYWRkL29wZW4gb2YgbWFpbiBwcm9qZWN0IGJlY2F1c2UgdGhlcmUgaXMgbXVjaCBtb3JlIHRoYXQgbmVlZHMgdG8KLQkJCQkvLyBiZSBkb25lIGJ5IEJlYW5pbmZvTmF0dXJlIG9uIHByb2plY3QgY2xvc2UvZGVsZXRlLCBzbyBuYXR1cmUgbGlzdGVucyBmb3IgdGhpcyBhbmQgZG9lcyB0aGUgYXBwcm9wcmlhdGUgY2xlYW51cC4JCQkKLQkJCQlpZiAoIWVsZW1lbnQuZXF1YWxzKGZQcm9qZWN0KSkgewotCQkJCQkvLyBIb3dldmVyLCBhbGwgb3RoZXIgcHJvamVjdHMgYXJlIHJlcXVpcmVkIHByb2plY3RzIGFuZCBpZiB0aGV5IGFyZSBkZWxldGVkL2Nsb3NlZC9hZGRlZC9vcGVuZWQgd2hlbiBuZWVkIHRvIGRvCi0JCQkJCS8vIGEgZnVsbCBmbHVzaCBiZWNhdXNlIHdlIGRvbid0IGtub3cgYW55IG9mIHRoZSBzdGF0ZSwgd2hldGhlciB0aGV5IGFyZSBzdGlsbCB0aGVyZSBvciBub3QuCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkubWFya0FsbFN0YWxlKCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZShkZWx0YSkpIHsKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtBbGxTdGFsZSgpOyAvLyBUaGUgLmNsYXNzcGF0aCBmaWxlIChvciAuYmVhbmluZm9jb25maWcpIGl0c2VsZiBpbiBTT01FIERFUEVOREVOVCBQUk9KRUNUIGhhcyBjaGFuZ2VkLiAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqIElmIGEgd29ya2luZyBjb3B5LCB0aGVuIGlnbm9yZSBpdCBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgY2hhbmdlcyB1bnRpbAotCSAqIHRoZXkgYXJlIGNvbW1pdHRlZC4gRWxzZSwgaWYgdGhlIENVIGhhcyBjaGFuZ2VkIGNvbnRlbnQgdGhlbiBtYXJrIGFsbCBvZiB0aGUKLQkgKiB0eXBlcyBpbiB0aGlzIENVIChzdWNoIGFzIGlubmVyIGNsYXNzZXMpIGFzIHN0YWxlLgotCSAqIElmIGl0IGlzIG5vdCBhIGNvbnRlbnQgY2hhbmdlIHRoZW4gcHJvY2VzcyB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgOgotCQkJCS8vIEEgZmlsZSBzYXZlIGhhZCBvY2N1cnJlZC4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3VycmVudGx5IHdvcmtpbmcgY29weSBvciBub3QuCi0JCQkJLy8gSXQgbWVhbnMgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRvIHRoZSBmaWxlIG9uIGRpc2ssIGJ1dCBkb24ndCBrbm93IHdoYXQuCi0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7Ci0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkubWFya1N0YWxlSW50cm9zcGVjdGlvblBsdXNJbm5lcihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpLCBmYWxzZSk7CS8vIEZsdXNoIGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyBpbm5lciBjbGFzc2VzLgotCQkJCX0JCQkJCQkKLQkJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQ6Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ6Ci0JCQkJLy8gTmVlZCB0byBrbm93IGZvciBhZGQgYmVjYXVzZSB3ZSBvcHRpbWl6ZSB0aGUgYmVhbmluZm8gc3VjaCB0aGF0IG9uY2UgZm91bmQgYXMgdW5kZWZpbmVkLCBpdCB3b24ndAotCQkJCS8vIGludHJvc3BlY3QgYWdhaW4gdW50aWwgd2UgbWFyayBpdCBzdGFsZS4gU28gd2UgbmVlZCB0byBtYXJrIGl0IHN0YWxlIHRvIHJlZnJlc2ggaXQuCi0JCQkJCi0JCQkJLy8gSXQgZG9lc24ndCBtYXR0ZXIgaWYgdG90YWxseSByZW1vdmVkIG9yIGp1c3QgbW92ZWQgc29tZXdoZXJlIGVsc2UsIHdlIHdpbGwgY2xlYXIgb3V0Ci0JCQkJLy8gYWRhcHRlciBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGEgcmVuYW1lIHdoaWNoIHdvdWxkIGJlIGEgZGlmZmVyZW50IGNsYXNzLgotCQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgb3IgYWRkZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byBmbHVzaC4KLQkJCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIGZsdXNoIGFsbCBpdCBhbnkgdGhhdCBzdGFydCB3aXRoIGl0IHBsdXMgZm9yIGlubmVyIGNsYXNzZXMuCQkJCQotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkubWFya1N0YWxlSW50cm9zcGVjdGlvblBsdXNJbm5lcihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpLCB0cnVlKTsJLy8gRmx1c2ggZXZlcnl0aGluZywgaW5jbHVkaW5nIGlubmVyIGNsYXNzZXMuCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNsYXNzRmlsZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCS8vIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRvdGFsbHkgcmVtb3ZlZCBvciBqdXN0IG1vdmVkIHNvbWV3aGVyZSBlbHNlLCB3ZSB3aWxsIGNsZWFyIG91dCBhbmQgcmVtb3ZlIHRoZQotCQkJLy8gYWRhcHRlciBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGEgcmVuYW1lIHdoaWNoIHdvdWxkIGJlIGEgZGlmZmVyZW50IGNsYXNzLgotCQkJLy8gQ3VycmVudGx5IHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZGVsZXRlZCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGZpbmQgdGhlIHR5cGVzIGluIHRoZSB1bml0IHRvIHJlbW92ZS4KLQkJCS8vIFNvIGluc3RlYWQgd2UgYXNrIGZhY3RvcnkgdG8gcmVtb3ZlIGFsbCBpdCBhbnkgdGhhdCBzdGFydCB3aXRoIGl0IHBsdXMgZm9yIGlubmVyIGNsYXNzZXMuCi0JCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSwgdHJ1ZSk7Ci0JCQlyZXR1cm47IC8vIFNpbmNlIHRoZSBjbGFzc2ZpbGUgd2FzIHJlbW92ZWQgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiAoYWN0dWFsbHkgdGhlIGNoaWxkcmVuIGxpc3Qgd2lsbCBiZSBlbXB0eQotCQl9Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBjaGlsZHJlbi5sZW5ndGg7IGlpKyspIHsKLQkJCXByb2Nlc3NEZWx0YShjaGlsZHJlbltpaV0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwkJCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSkKLQkJCXJldHVybiBuYW1lOwkvLyBTaG91bGRuJ3QgYmUgaGVyZQotCQkKLQkJLy8gcmVtb3ZlIGV4dGVuc2lvbi4KLQkJaW50IHBlcmlvZE5keCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBlcmlvZE5keCA9PSAtMSkKLQkJCXJldHVybiBuYW1lOwkvLyBTaG91bGRuJ3QgYmUgaGVyZS4gVGhlcmUgc2hvdWxkIGJlIGFuIGV4dGVuc2lvbgotCQkJCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHBhcmVudE5hbWUgPSBlbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChwYXJlbnROYW1lID09IG51bGwgfHwgcGFyZW50TmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJdHlwZU5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBwZXJpb2ROZHgpOyAvLyBJbiBkZWZhdWx0IHBhY2thZ2UKLQkJZWxzZQotCQkJdHlwZU5hbWUgPSBwYXJlbnROYW1lICsgIi4iICsgbmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kTmR4KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKiBJZiB0aGUgY2xhc3NwYXRoIGhhcyBjaGFuZ2VkLCBtYXJrIGFsbCBhcyBzdGFsZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdAotCSAqIGhhcyBjaGFuZ2VkLiBUaGluZ3MgdGhhdCB3ZXJlIGluIHRoZSBwYXRoIG1heSBubyBsb25nZXIgYmUgaW4gdGhlIHBhdGgsIG9yCi0JICogdGhlIG9yZGVyIHdhcyBjaGFuZ2VkLCB3aGljaCBjb3VsZCBhZmZlY3QgdGhlIGludHJvc3BlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50Um9vdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoaXNDbGFzc1BhdGhDaGFuZ2UoZGVsdGEpKQotCQkJZkFkYXB0ZXJGYWN0b3J5Lm1hcmtBbGxTdGFsZSgpOwotCQllbHNlCi0JCQlzdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEOgotCQkJCS8vIEV2ZW4gdGhvdWdoIGFkZGVkIHRoZXJlIGlzIHBvc3NpYmlsaXR5IHRoYXQgcGFja2FnZSBleGlzdHMgaW4gb3RoZXIgcm9vdCBidXQgdGhpcwotCQkJCS8vIG9uZSBtYXkgbm93IHRha2UgcHJpb3JpdHksIHNvIHdlIHdpbGwgY2xlYXIgdGhlIHBhY2thZ2UgYW55d2F5LgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgotCQkJCWZBZGFwdGVyRmFjdG9yeS5tYXJrUGFja2FnZVN0YWxlKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQsIGRlbHRhKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKiBTb21ldGhpbmcgYWJvdXQgdGhlIHR5cGUgaGFzIGNoYW5nZWQuIElmIGl0IHdhcyByZW1vdmVkIChub3QgYSBtb3ZlKSwgdGhlbiBjbG9zZSB0aGUKLQkgKiBhZGFwdGVyIHRvby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElUeXBlIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkgewotCQkJLy8gQ2xvc2UgaXQgb3V0LiBEb2Vzbid0IG1hdHRlciBpZiBtb3ZlZF90bywgdGhhdCB3b3VsZCBiZSBhIHJlbmFtZSB3aGljaCByZXF1aXJlcyBicmFuZCBuZXcgY2xhc3MuCi0JCQkvLyBXZSBjYW4ndCBhY3R1YWxseSBnZXQgcmlkIG9mIHRoZSBiZWFuaW5mbyBhZGFwdGVyIGJlY2F1c2UgaXQgbWF5IGJlIGFza2VkIGZvciBhZ2FpbgotCQkJLy8ganVzdCB0byBzZWUgaWYgbm90IGRlZmluZWQuIEl0IG1heSBhbHNvIGNvbWUgYmFjayBsYXRlciBhbmQgd2Ugd2FudCB0byBrbm93IGFib3V0Ci0JCQkvLyBpdCB0byByZWN5Y2xlIHRoZSB2bS4KLQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkubWFya1N0YWxlSW50cm9zcGVjdGlvbihlbGVtZW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCB0cnVlKTsJCi0JCX0gZWxzZQotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrU3RhbGVJbnRyb3NwZWN0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGZhbHNlKTsgLy8gSnVzdCBtYXJrIGl0IHN0YWxlCi0JCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIiAiK2ZQcm9qZWN0LmdldEVsZW1lbnROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9OYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb05hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU5MDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb05hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uQ29udGFpbmVyUGF0aHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUaGUgYmVhbmluZm8gbmF0dXJlLiBJdCBpcyBjcmVhdGVkIGZvciBhIHByb2plY3QgYW5kIGhvbGRzIHRoZQotICogbmVjZXNzYXJ5IGluZm8gZm9yIGJlYW5pbmZvIHRvIGJlIHBlcmZvcm1lZCBvbiBhIHByb2plY3QuCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQgKyAiLkJlYW5JbmZvTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQkVBTklORk9fU0VBUkNIX1BBVEggPSAiLmJlYW5pbmZvQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBDT05GSUdfSU5GT19TRVNTSU9OX0tFWSA9IG5ldyBRdWFsaWZpZWROYW1lKEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAiQ09ORklHX0lORk8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBCRUFOSU5GT19DT05UUklCVVRPUlNfU0VTU0lPTl9LRVkgPSBuZXcgUXVhbGlmaWVkTmFtZShCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgIkJFQU5JTkZPX0NPTlRSSUJVVE9SUyIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5RmFjdG9yeVJlZ2lzdHJ5LklSZWdpc3RyeUxpc3RlbmVyIHJlZ2lzdHJ5TGlzdGVuZXIgPSBuZXcgUHJveHlGYWN0b3J5UmVnaXN0cnkuSVJlZ2lzdHJ5TGlzdGVuZXIoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5LklSZWdpc3RyeUxpc3RlbmVyI3JlZ2lzdHJ5VGVybWluYXRlZChQcm94eUZhY3RvcnlSZWdpc3RyeSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdHJ5VGVybWluYXRlZChQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJcHJlbWF0dXJlUmVnaXN0cnlUZXJtaW5hdGUoKTsKLQkJCW1hcmtBbGxTdGFsZSgpOwotCQl9OwotCX07Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJ1bnRpbWUgbmF0dXJlIGZvciB0aGUgcHJvamVjdCwgY3JlYXRlIGl0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvTmF0dXJlIGdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7CS8vIE11c3QgZm9yY2UgSkFWQUVNRk5hdHVyZSBjcmVhdGlvbiBmaXJzdCBiZWZvcmUgd2UgdHJ5IHRvIGdldCBvdXJzLiBUaGVyZSBpcyBhIGNoaWNrZW4vZWdnIHByb2JsZW0gaWYgd2UgbGV0IG91ciBuYXR1cmUgdHJ5IHRvIGdldCBKYXZhRU1GTmF0dXJlIGR1cmluZyBzZXRQcm9qZWN0LgotCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoTkFUVVJFX0lEKSkKLQkJCXJldHVybiAoQmVhbmluZm9OYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKE5BVFVSRV9JRCk7Ci0JCWVsc2UKLQkJCXJldHVybiBjcmVhdGVSdW50aW1lKHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHByb2plY3QgaGFzIGEgQmVhbkluZm8gcnVudGltZSB0dXJuZWQgb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGhhcyB0aGUgYSBCZWFuSW5mbyBydW50aW1lLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKE5BVFVSRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGlzIGlzIGEgdmFsaWQgcHJvamVjdCBmb3IgYSBCZWFuaW5mbyBOYXR1cmUuIEl0IG11c3QgYmUKLQkgKiBhIEphdmFQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJ1bnRpbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQmVhbmluZm9OYXR1cmUgY3JlYXRlUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZFByb2plY3QocHJvamVjdCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwKLQkJCQkJMCwKLQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCAKLQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb2plY3QuZ2V0TmFtZSgpLCBCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5CZWFuaW5mb05hdHVyZV9JbnZhbGlkUHJvamVjdH0pLCAKLQkJCQkJbnVsbCkpOwotCi0JCWFkZE5hdHVyZVRvUHJvamVjdChwcm9qZWN0LCBOQVRVUkVfSUQpOwotCQlyZXR1cm4gKEJlYW5pbmZvTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShOQVRVUkVfSUQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQlwcm90ZWN0ZWQgUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCBqYXZhUlNldDsKLQlwcm90ZWN0ZWQgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplciBmU3luY2hyb25pemVyOwotCXByb3RlY3RlZCBzdGF0aWMgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBmUmVmbGVjdGlvbktleUV4dGVuc2lvbjsKLQotCS8qKiAKLQkgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhpcyBuYXR1cmUuCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QuZ2V0TmF0dXJlPC9jb2RlPiBhbmQgc2hvdWxkIG5vdAotCSAqIGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotCSAqIFRoZSBuYXR1cmUgZXh0ZW5zaW9uIGlkIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIG5hdHVyZXMgb24gdGhlIHByb2plY3QgYnkKLQkgKiA8Y29kZT5JUHJvamVjdC5nZXROYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgYWRkZWQgaGVyZS4KLQkgKgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqIAotCSAqIFJlbW92ZXMgdGhpcyBuYXR1cmUgZnJvbSB0aGUgcHJvamVjdCwgcGVyZm9ybWluZyBhbnkgcmVxdWlyZWQgZGVjb25maWd1cmF0aW9uLgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QKLQkgKiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLQkgKiBUaGUgbmF0dXJlIGlkIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBuYXR1cmVzIG9uIHRoZSBwcm9qZWN0IGJ5Ci0JICogPGNvZGU+SVByb2plY3QucmVtb3ZlTmF0dXJlPC9jb2RlPiwgYW5kIG5lZWQgbm90IGJlIHJlbW92ZWQgaGVyZS4KLQkgKgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4gCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgsIG51bGwpOwotCQljbGVhbnVwKHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTaHV0ZG93biB0aGUgbmF0dXJlLiBDYWxsZWQgYnkgQmVhbkluZm9QbHVnaW4gdG8gdGVsbCB0aGUgbmF0dXJlIHRoYXQgdGhlIHBsdWdpbiBpcyBiZWluZyBzaHV0ZG93bi4KLQkgKiBJdCBuZWVkcyB0byBjbGVhbnVwLgotCSAqIFRPRE8gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgQmVhbkluZm9QbHVnaW4gc2hvdWxkIGNhbGwgaXQuIChwdWJsaWMgZm9yIG5vdyBidXQgd2hlbiB3ZSBtYWtlCi0JICogQmVhbkluZm9OYXR1cmUgYW4gQVBJIGl0IHdpbGwgYmUgbW92ZWQgaW50byB0aGUgc2FtZSBwYWNrYWdlIGFzIEJlYW5JbmZvUGx1Z2luKS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJY2xlYW51cCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgUmVzb3VyY2VTZXQgdGhhdCBpcyBsaW5rZWQgY29ycmVjdGx5IHRvIHRoaXMgQmVhbmluZm8gTmF0dXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbGlua3MgdXAgYSBSZXNvdXJjZVNldCBzbyB0aGF0IGl0IHdpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGlzIG5hdHVyZS4KLQkgKiBJdCBtYWtlcyBzdXJlIHRoYXQgZ29pbmcgdGhyb3VnaCB0aGUgUmVzb3VyY2VTZXQgdGhhdCBhbnkgImphdmE6Ly4uLiIKLQkgKiBjbGFzc2VzIGNhbiBiZSBmb3VuZCBhbmQgaXQgbWFrZXMgc3VyZSB0aGF0IGFueSBuZXcgY2xhc3NlcyBhcmUgcGxhY2VkIGludG8gdGhlCi0JICogbmF0dXJlJ3MgcmVzb3VyY2Ugc2V0IGFuZCBub3QgcmVzb3VyY2Ugc2V0IGRvaW5nIHRoZSBjYWxsaW5nLgotCSAqIDxwPgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgYW55IHRpbWUgYSByZXNvdXJjZSBzZXQgaXMgbmVlZGVkIHRoYXQgaXMgbm90IHRoZQotCSAqIHByb2plY3Qgd2lkZSByZXNvdXJjZSBzZXQgYXNzb2NpYXRlZCB3aXRoIGJlYW5pbmZvcywgYnV0IHdpbGwgcmVmZXJlbmNlCi0JICogSmF2YSBNb2RlbCBjbGFzc2VzIG9yIGluc3RhbnRpYXRlLgotCSAqIDxwPgotCSAqIEFuIGFkZGl0aW9uYWwgY2hhbmdlIGlzIG1hZGUgdG9vLiBUaGUgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkncyBleHRlbnNpb25Ub1Jlc291cmNlRmFjdG9yeSBtYXAgaXMgbW9kaWZpZWQKLQkgKiB0byBoYXZlIGFuICJqYXZhIi0+WE1JUmVzb3VyY2VGYWN0b3J5IGVudHJ5IGFkZGVkIHRvIGl0IGlmIEVNRiBFeGFtcGxlcyBpcyBsb2FkZWQuIEVNRiBFeGFtcGxlcyBhZGQKLQkgKiB0aGUgImphdmEiIGV4dGVuc2lvbiBhbmQgc2V0cyBpdCB0byB0aGVpciBvd24gc3BlY2lhbCBKYXZhUmVzb3VyY2VGYWN0b3J5LiAKLQkgKiBJZiBFTUYgRXhhbXBsZXMgaXMgbm90IGxvYWRlZCwgdGhlbiBpdCBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0ICIqIiBtYXBwaW5nLCB3aGljaCBpcyB0byBYTUlSZXNvdXJjZUZhY3RvcnkuCi0JICogVGhpcyBub3JtYWxseSBjYXVzZXMgcHJvYmxlbXMgZm9yIG1hbnkKLQkgKiBjdXN0b21lcnMuIElmIHVzZXJzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IHJlYWxseSB3YW50IHRoZSBFTUYgZXhhbXBsZXMgZW50cnkgaW5zdGVhZCwgYWZ0ZXIgdGhleSByZXRyaWV2ZSB0aGUKLQkgKiBuZXcgcmVzb3VyY2Ugc2V0IHRoZXkgY2FuIGRvIHRoaXM6Ci0JICogPHA+Ci0JICogPHByZT48Y29kZT4KLQkgKiAJcnNldCA9IGJlYW5pbmZvTmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7Ci0JICogCXJzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5yZW1vdmUoImphdmEiKTsKLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogCi0JICogQHJldHVybiBhIFJlc291cmNlU2V0IHRoYXQgaXMgc3BlY2lhbGx5IGNvbm5lY3RlZCB0byB0aGUgSkVNIGphdmEgbW9kZWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBuZXdSZXNvdXJjZVNldCgpIHsKLQkJU3BlY2lhbFJlc291cmNlU2V0IHJzZXQgPSBuZXcgU3BlY2lhbFJlc291cmNlU2V0KCk7Ci0JCXJzZXQuYWRkKG5ldyBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7IC8vIFdlIGRvbid0IGhhdmUgYW55IHNwZWNpYWwgdGhpbmdzIHdlIGNhbiBkbyBpbiB0aGlzIGNhc2UuCi0JCQl9Ci0KLQkJCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkJLy8gQWx3YXlzIHRyeSB0byBnZXQgaXQgb3V0IG9mIHRoZSBuYXR1cmUncyByZXNvdXJjZSBzZXQgYmVjYXVzZSBpdCBtYXkgb2YgYmVlbiBsb2FkZWQgdGhlcmUgZWl0aGVyIGFzIAotCQkJCS8vIHRoZSAiamF2YTouLi4iIHR5cGUgb3IgaXQgY291bGQgb2YgYmVlbiBhbiBvdmVycmlkZSBleHRyYSBmaWxlIChzdWNoIGFzIGFuIG92ZXJyaWRlIEVNRiBwYWNrYWdlLCBmb3IKLQkJCQkvLyBleGFtcGxlIGpjZiBoYXMgYSBzaWRlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbmV3IGF0dHJpYnV0ZSB0eXBlLiBUaGF0IGZpbGUKLQkJCQkvLyB3aWxsIGFsc28gYmUgbG9hZGVkIGludG8gdGhpcyByZXNvdXJjZXNldC4gU28gdG8gZmluZCBpdCB3ZSBuZWVkIHRvIGdvIGluIGhlcmUgYW5kIHRyeS4KLQkJCQkvLwotCQkJCS8vIEhvd2V2ZXIsIGlmIG5vdCBmb3VuZCB3ZSB3b24ndCBnbyBhbmQgdHJ5IHRvIGxvYWQgdGhlIHJlc291cmNlLiBUaGF0IGNvdWxkIGxvYWQgaW4gdGhlIHdyb25nIHBsYWNlLgotCQkJCS8vIEtsdWRnZTogQmVjYXVzZSBvZiBhIGJ1ZyAoZmVhdHVyZSA6LSkpIGluIFhNTEhhbmRsZXIuZ2V0UGFja2FnZUZyb21VUkkoKSwgaXQgZG9lc24ndCB1c2UgZ2V0UmVzb3VyY2UoLi4uLHRydWUpIGFuZCBpdCB0cmllcyBpbnN0ZWFkCi0JCQkJLy8gdG8gdXNlIHVyaSBpbnB1dHN0cmVhbSB0byBsb2FkIHRoZSBwYWNrYWdlIHdoZW4gbm90IGZvdW5kLiBUaGlzIGJ5cGFzc2VzIG91ciBzcGVjaWFsIGNyZWF0ZSByZXNvdXJjZSBhbmQgc28KLQkJCQkvLyBwYWNrYWdlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gU28gd2UgbmVlZCB0byBkbyBsb2FkIG9uIGRlbWFuZCBoZXJlIGluc3RlYWQgaWYgaXQgaXMgYSBqYXZhIHByb3RvY29sLgotCQkJCS8vIEVNRiB3aWxsIG5vdCBiZSBmaXhpbmcgdGhpcy4gSXQgaXMgd29ya2luZyBhcyBkZXNpZ25lZC4KLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIEphdmFYTUlGYWN0b3J5LlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkJLy8gVGhpcyBpcyB0aGUgb25lLiBJdCBoYXMgZ290IGhlcmUgYmVjYXVzZSBpdCBjb3VsZG4ndCBmaW5kIGEgcmVzb3VyY2UgYWxyZWFkeSBsb2FkZWQuCi0JCQkJLy8gSWYgaXQgaXMgYSAiamF2YTovLi4uIiBwcm90b2NvbCByZXNvdXJjZSwgdGhlbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYXQgdGhlIEJlYW5pbmZvTmF0dXJlIGNvbnRleHQKLQkJCQkvLyBpbnN0ZWFkIG9mIHRoZSBsb3dlciBvbmUuCi0JCQkJaWYgKEphdmFYTUlGYWN0b3J5LlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSkKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQkJLy8gWzcxNDczXSBSZXN0b3JlICIqLmphdmEiIHRvIGJlIGFuIFhNSVJlc291cmNlLiBJZiBFTUYgRXhhbXBsZXMgYXJlIGxvYWRlZCB0aGV5IG92ZXJsb2FkIHRoaXMgYW5kIGxvYWQgdGhlaXIgc3BlY2lhbCByZXNvdXJjZSBmb3IgIiouamF2YSIgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KLQkJLy8gSWYgc29tZSB1c2VyIHJlYWxseSB3YW50cyB0aGF0LCB0aGV5IGdyYWIgdGhlIHJlc291cmNlIHJlc291cmNlIHNldCBhbmQgcmVtb3ZlIG91ciBvdmVycmlkZS4KLQkJaWYgKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkuY29udGFpbnNLZXkoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBOZWVkIHRvIGFkZCBhbiBvdmVycmlkZSB0byBnbyB0byBYTUkgaW5zdGVhZC4KLQkJCXJzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoImphdmEiLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByc2V0OwotCX0KLQkvKioKLQkgKiBDbGVhbiB1cCwgdGhpcyBtZWFucyBlaXRoZXIgdGhlIHByb2plY3QgaXMgYmVpbmcgY2xvc2VkLCBkZWxldGVkLCBvciBpdCBtZWFucyB0aGF0Ci0JICogdGhlIG5hdHVyZSBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHByb2plY3QuIEVpdGhlciB3YXkgdGhhdCBtZWFucyB0bwotCSAqIHRlcm1pbmF0ZSB0aGUgVk0gYW5kIHJlbW92ZSB3aGF0IHdlIGFkZGVkIHRvIHRoZSBjb250ZXh0IGlmIHRoZSBmbGFnIHNheXMgY2xlYXIgaXQuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIE9OTFkgd2hlbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBuYXR1cmUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gSXQKLQkgKiB3aWxsIGJlIHJlY3JlYXRlZCBmb3IgYW55IG5ldyB1c2VzLiBUaGF0IGlzIGJlY2F1c2Ugd2Ugd2lsbCBiZSByZW1vdmluZyBvdXJzZWx2ZXMKLQkgKiBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBuYXR1cmVzIGluIHRoZSBCZWFuSW5mb1BsdWdpbi4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci4gSXQga25vd3Mgd2hlbiB0aGUgcHJvamVjdCBpcwotCSAqIGJlaW5nIGNsb3NlZCBvciBkZWxldGVkLgotCSAqIAotCSAqIEBwYXJhbSBjbGVhclJlc3VsdHMgY2xlYXIgdGhlIHJlc3VsdHMgc3VjaCB0aGF0IGFueSBKRU0gbW9kZWwgb2JqZWN0cyBoYXZlIG5vIEJlYW5JbmZvCi0JICogYWRhcHRlcnMgYXR0YWNoZWQgdG8gdGhlbS4gVGhpcyBhbGxvd3MgQmVhbkluZm8gdG8gYmUgR0MnZCB3aXRob3V0IGJlaW5nIGh1bmcgb250by4KLQkgKiAgCi0JICogQHBhcmFtIGRlcmVnaXN0ZXIgRGVyZWdpc3RlciBmcm9tIHRoZSBCZWFuSW5mb1BsdWdpbi4gTm9ybWFsbHkgdGhpcyB3aWxsIGFsd2F5cyBiZSB0cnVlLCBidXQgaXQKLQkgKiB3aWxsIGJlIGNhbGxlZCB3aXRoIGZhbHNlIHdoZW4gQmVhbkluZm9QbHVnaW4gaXMgY2FsbGluZyBiYWNrIHRvIHNodXRkb3duLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhbnVwKGJvb2xlYW4gY2xlYXJSZXN1bHRzLCBib29sZWFuIGRlcmVnaXN0ZXIpIHsKLQkJaWYgKGRlcmVnaXN0ZXIpCi0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5yZW1vdmVCZWFuSW5mb05hdHVyZSh0aGlzKTsKLQkJZlN5bmNocm9uaXplci5zdG9wU3luY2hyb25pemVyKGNsZWFyUmVzdWx0cyk7Ci0JCUluaXQuY2xlYW51cChqYXZhUlNldCwgY2xlYXJSZXN1bHRzKTsKLQkJaWYgKGZSZWdpc3RyeSAhPSBudWxsKQotCQkJZlJlZ2lzdHJ5LnRlcm1pbmF0ZVJlZ2lzdHJ5KHRydWUpOwotCi0JCXByb2plY3RDbGVhbmVkKCk7Ci0JCWphdmFSU2V0ID0gbnVsbDsKLQkJZlJlZ2lzdHJ5ID0gbnVsbDsKLQkJZlByb2plY3QgPSBudWxsOwotCQlmU3luY2hyb25pemVyID0gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIHByb2plY3QgbmF0dXJlIGFwcGxpZXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIG5hdHVyZSBhcHBsaWVzLgotCSAqIFVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgcHJvamVjdCBuYXR1cmUgcnVudGltZS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+Ci0JICogYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0JICoKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIG5hdHVyZSBhcHBsaWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0UuZ2V0Q2xhc3MoKTsJLy8gSW5zdGFudGlhdGVzIHRoZSBjb250cm9sbGVyIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQuCi0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuYWRkQmVhbkluZm9OYXR1cmUodGhpcyk7Ci0KLQkJdHJ5IHsKLQkJCS8vIFRoZSBuYXR1cmUgaGFzIGJlZW4gc3RhcnRlZCBmb3IgdGhpcyBwcm9qZWN0LCBuZWVkIHRvIHNldHVwIHRoZSBpbnRyb3NwZWN0aW9uIHByb2Nlc3Mgbm93LgotCQkJSmF2YUVNRk5hdHVyZSBqYXZhTmF0dXJlID0gSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKGZQcm9qZWN0KTsKLQkJCUphdmFJbml0LmluaXQoKTsKLQkJCWlmIChmUmVmbGVjdGlvbktleUV4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gUmVnaXN0ZXIgdGhlIHJlZmxlY3Rpb24ga2V5IGV4dGVuc2lvbi4KLQkJCQlmUmVmbGVjdGlvbktleUV4dGVuc2lvbiA9IG5ldyBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKCk7Ci0JCQkJSmF2YVhNSUZhY3RvcnkuSU5TVEFOQ0UucmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKGZSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKTsKLQkJCX0KLQotCQkJamF2YVJTZXQgPSBqYXZhTmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlJbml0LmluaXRpYWxpemUoamF2YVJTZXQsIG5ldyBJQmVhbmluZm9TdXBwbGllcigpIHsKLQkJCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCQkJCXJldHVybiBCZWFuaW5mb05hdHVyZS50aGlzLmdldFJlZ2lzdHJ5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNSZWdpc3RyeUNyZWF0ZWQoKSB7Ci0JCQkJCXJldHVybiBCZWFuaW5mb05hdHVyZS50aGlzLmlzUmVnaXN0cnlDcmVhdGVkKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGNsb3NlUmVnaXN0cnkoKSB7Ci0JCQkJCUJlYW5pbmZvTmF0dXJlLnRoaXMuY2xvc2VSZWdpc3RyeSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCQkJcmV0dXJuIEJlYW5pbmZvTmF0dXJlLnRoaXMuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBQcm9qZWN0UmVzb3VyY2VTZXQgZ2V0TmV3UmVzb3VyY2VTZXQoKSB7Ci0JCQkJCXJldHVybiBCZWFuaW5mb05hdHVyZS50aGlzLm5ld1Jlc291cmNlU2V0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFJlc291cmNlU2V0IGdldFByb2plY3RSZXNvdXJjZVNldCgpIHsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlmU3luY2hyb25pemVyID0KLQkJCQluZXcgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplcigKLQkJCQkJKEJlYW5pbmZvQWRhcHRlckZhY3RvcnkpIEVjb3JlVXRpbC5nZXRBZGFwdGVyRmFjdG9yeShqYXZhUlNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCksIElJbnRyb3NwZWN0aW9uQWRhcHRlci5BREFQVEVSX0tFWSksCi0JCQkJCUphdmFDb3JlLmNyZWF0ZShqYXZhTmF0dXJlLmdldFByb2plY3QoKSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlIHRoZSByZWdpc3RyeS4gSXQgbmVlZHMgdG8gYmUgcmVjeWNsZWQgYmVjYXVzZSBhIGNsYXNzIGhhcyBjaGFuZ2VkCi0JICogYW5kIG5vdyB0aGUgbmV3IGNsYXNzIG5lZWRzIHRvIGJlIGFjY2Vzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb3NlUmVnaXN0cnkoKSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJcmVnID0gZlJlZ2lzdHJ5OwotCQkJZlJlZ2lzdHJ5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gV2lwZSBvdXQgdGhlIFNlc3Npb24gcHJvcGVydGllcyBzbyB0aGF0IHRoZXkgYXJlIHJlY29tcHV0ZWQuCi0JCQkJZ2V0UHJvamVjdCgpLnNldFNlc3Npb25Qcm9wZXJ0eShDT05GSUdfSU5GT19TRVNTSU9OX0tFWSwgbnVsbCk7Ci0JCQkJZ2V0UHJvamVjdCgpLnNldFNlc3Npb25Qcm9wZXJ0eShCRUFOSU5GT19DT05UUklCVVRPUlNfU0VTU0lPTl9LRVksIG51bGwpOwkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLklORk8pOwotCQkJfQotCQl9Ci0JCWlmIChyZWcgIT0gbnVsbCkgewotCQkJcmVnLnJlbW92ZVJlZ2lzdHJ5TGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JCQlyZWcudGVybWluYXRlUmVnaXN0cnkoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBVc2luZyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBpbmZvLCBjb21wdXRlIHRoZSBCZWFuSW5mbyBjb25maWcgaW5mbyBuZWVkZWQuIFRoaXMgc2V0cyB0aGUKLQkgKiBzZXNzaW9uIHByb3BlcnRpZXMgQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZIGFuZCBDT05GSUdfSU5GT19TRVNTSU9OX0tFWS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5mbwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wdXRlQmVhbkluZm9Db25maWdJbmZvKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0IHRpbWUgZm9yIHRoaXMgbmF0dXJlLCBvciBmaXJzdCB0aW1lIGFmdGVyIHJlZ2lzdHJ5IHJlc2V0LiBOZWVkIHRvIGNvbXB1dGUgdGhlIGluZm8uCi0JCS8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIGNhbGxlZCBCRUZPUkUgdGhlIGZpcnN0IHVzYWdlIG9mIEJlYW5JbmZvLiBUaGUgZWRpdG9yIHVzdWFsbHkKLQkJLy8gYnJpbmdzIHVwIHRoZSBlZGl0b3IncyByZWdpc3RyeSBiZWZvcmUgaXQgZ2V0cyBhbnl0aGluZyBmcm9tIEJlYW5JbmZvLgotCQlMaXN0IGNvbnRyaWJ1dG9yc0xpc3QgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJaWYgKCFpbmZvLmdldENvbnRhaW5lcklkcygpLmlzRW1wdHkoKSkgewotCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIGNvbnRhaW5lciBpZHMgdGhhdCBhcmUgYXBwbGljYWJsZSBhbmQgZ2V0IEJlYW5JbmZvIGNvbnRyaWJ1dG9ycy4KLQkJCUl0ZXJhdG9yIGNvbnRhaW5lcklkSXRyID0gaW5mby5nZXRDb250YWluZXJJZHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNvbnRhaW5lcklkSXRyLmhhc05leHQoKSkgewotCQkJCUNvbnRhaW5lclBhdGhzIGNvbnRhaW5lclBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBjb250YWluZXJJZEl0ci5uZXh0KCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udHJpYnV0b3JzID0gQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Q29udGFpbmVySWRDb250cmlidXRvcnMoY29udGFpbmVyUGF0aHMuZ2V0Q29udGFpbmVySWQoKSwgY29udGFpbmVyUGF0aHMuZ2V0VmlzaWJsZUNvbnRhaW5lclBhdGhzKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQSV9DTEFTUyk7Ci0JCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQmVhbkluZm9Db250cmlidXRvcikKLQkJCQkJCQljb250cmlidXRvcnNMaXN0LmFkZChjb250cmlidXRvcik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQkJCQotCQl9Ci0JCQotCQlpZiAoIWluZm8uZ2V0UGx1Z2luSWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcGx1Z2luIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlIGFuZCBnZXQgQmVhbkluZm8gY29udHJpYnV0b3JzLgotCQkJCUl0ZXJhdG9yIHBsdWdpbklkSXRyID0gaW5mby5nZXRQbHVnaW5JZHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBsdWdpbklkSXRyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwbHVnaW5JZEl0ci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5Db250cmlidXRvcnMoCi0JCQkJCQkJCShTdHJpbmcpIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJCWlmIChjb250cmlidXRvcnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJT2JqZWN0IGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUElfQ0xBU1MpOwotCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQmVhbkluZm9Db250cmlidXRvcikKLQkJCQkJCQkJCWNvbnRyaWJ1dG9yc0xpc3QuYWRkKGNvbnRyaWJ1dG9yKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCi0JCQkvLyBTYXZlIGl0IGZvciBhbGwgYmVhbmluZm8gcHJvY2Vzc2luZyAoYW5kIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZyBpZiB0aGV5IGltcGxlbWVudCBwcm94eSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9yKS4KLQkJSUJlYW5JbmZvQ29udHJpYnV0b3JbXSBleHBsaWNpdENvbnRyaWJ1dG9ycyA9IChJQmVhbkluZm9Db250cmlidXRvcltdKSBjb250cmlidXRvcnNMaXN0LnRvQXJyYXkobmV3IElCZWFuSW5mb0NvbnRyaWJ1dG9yW2NvbnRyaWJ1dG9yc0xpc3Quc2l6ZSgpXSk7Ci0JCWluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KEJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSwgZXhwbGljaXRDb250cmlidXRvcnMpOwotCQkvLyBTYXZlIGl0IGZvciBvdmVycmlkZSBwcm9jZXNzaW5nLiBUaGF0IGhhcHBlbnMgb3ZlciBhbmQgb3ZlciBsYXRlciBhZnRlciBhbGwgY29uZmlnIHByb2Nlc3NpbmcgaXMgZG9uZS4KLQkJLy8gRG8gaXQgbGFzdCBzbyB0aGF0IGlmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24sIHNpbmNlIHRoaXMgcHJvcGVydHkgaXMgYSBmbGFnIHRvIGluZGljYXRlIHdlIGhhdmUgZGF0YSwKLQkJLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIEJlYW5pbmZvIGRhdGEgaXMgYWxyZWFkeSBzZXQgYXQgdGhlIHBvaW50IHdlIHNldCB0aGlzLgotCQkvLyBXZSBjb3VsZCBhY3R1YWxseSBzZXQgaXQgdHdpY2UgYmVjYXVzZSBvZiB0aGlzLCBidXQgaXQgaXMgdGhlIHNhbWUgZGF0YSwgc28sIHNvIHdoYXQuCi0JCWluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KENPTkZJR19JTkZPX1NFU1NJT05fS0VZLCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcmVnaXN0cnksIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KLQkgKiBAcmV0dXJuIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGZSZWdpc3RyeSAhPSBudWxsKQotCQkJCXJldHVybiBmUmVnaXN0cnk7Ci0JCX0KLQkJLy8gTm93IG5lZWQgdG8gc3RhcnQgdGhlIGFwcHJvcHJpYXRlIGpvYi4gSW4gYW5vdGhlciBjbGFzcyBzbyB0aGF0IGl0IGNhbiBoYW5kbGUgZHluYW1pY2FsbHkgY2hlY2tpbmcgaWYgCi0JCS8vIFVJIGlzIGF2YWlsYWJsZSB0byBldmVuIGRvIHRoaXMgKGl0IG1heWJlIG5vdCBpbiBhIFVJIG1vZGUsIHNvIHRoZW4ganVzdCBkbyBpdC4KLQkJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmNyZWF0ZVJlZ2lzdHJ5KHRoaXMpOwotCQlyZXR1cm4gZlJlZ2lzdHJ5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5PX1BSRU1BVFVSRV9URVJNSU5BVEVfVElNRSA9IC0xOwotCXByaXZhdGUgaW50IHJlZ2lzdHJ5UHJlbWF0dXJlVGVybWluYXRlQ291bnQ7Ci0JcHJpdmF0ZSBsb25nIHJlZ2lzdHJ5TGFzdFByZW1hdHVyZVRlcm1pbmF0ZVRpbWUgPSBOT19QUkVNQVRVUkVfVEVSTUlOQVRFX1RJTUU7Ci0JCi0JLyoKLQkgKiBUaGlzIGlzIDxwYWNrYWdlLXByb3RlY3RlZD4gc28gdGhhdCBvbmx5IHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgam9iIGluIHRoaXMKLQkgKiBwYWNrYWdlIGNhbiBjYWxsIGl0LiBUaGlzIGlzIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGNvbnRyb2xsZWQgdG8gb25seSBiZQotCSAqIGRvbmUgd2hlbiBidWlsZCBub3QgaW4gcHJvZ3Jlc3MgYW5kIHNlcmlhbCBhY2Nlc3MuCi0JICovCi0Jdm9pZCBjcmVhdGVSZWdpc3RyeShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCXBtLmJlZ2luVGFzayhCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5VSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcl9TdGFydEJlYW5pbmZvUmVnaXN0cnksIDEwMCk7IAotCQlpZiAoaXNSZWdpc3RyeUNyZWF0ZWQoKSkgewotCQkJcG0uZG9uZSgpOwotCQkJcmV0dXJuOyAvLyBJdCBoYWQgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuIENvdWxkIG9mIGJlZW4gYmVjYXVzZSB0aHJlYWRzIHdlcmUgcmFjaW5nIHRvIGRvIHRoZSBjcmVhdGlvbiwgYW5kIG9uZSBnb3QgdGhlcmUgZmlyc3QuCi0JCX0KLQotCQkvLyBUZXN0IHRvIHNlZSBpZiB3ZSBoYXZlIHRlcm1pbmF0ZWQgdG9vIG1hbnkgdGltZXMgd2l0aGluIHRoZSBsYXN0IDEwIG1pbnV0ZXMuIElmIHdlIGhhdmUgdGhlbiBkb24ndCB0cnkgYWdhaW4uCi0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQlpZiAocmVnaXN0cnlMYXN0UHJlbWF0dXJlVGVybWluYXRlVGltZSAhPSBOT19QUkVNQVRVUkVfVEVSTUlOQVRFX1RJTUUpIHsKLQkJCQlsb25nIGxhc3RQcmVtYXR1cmVUZXJtaW5hdGVJbnRlcnZhbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcmVnaXN0cnlMYXN0UHJlbWF0dXJlVGVybWluYXRlVGltZTsKLQkJCQkvLyBEb24ndCB0cnkgYWdhaW4gd2l0aGluIDEgc2VjIG9mIGxhc3QgcHJlbWF0dXJlIHRlcm1pbmF0ZS4gSXQgd2lsbCBzdGlsbCBiZSBiYWQuCi0JCQkJLy8gT2YgaWYgdGhlcmUgaGF2ZSBiZWVuIG1vcmUgdGhhbiAzIGFuZCBpdCBoYXMgYmVlbiAxMCBtaW5zIHNpbmNlIHRoZSBsYXN0IHRyeS4KLQkJCQlpZiAobGFzdFByZW1hdHVyZVRlcm1pbmF0ZUludGVydmFsIDwgMyoxMDAwIHx8IChyZWdpc3RyeVByZW1hdHVyZVRlcm1pbmF0ZUNvdW50ID4gMyAmJiBsYXN0UHJlbWF0dXJlVGVybWluYXRlSW50ZXJ2YWwgPCAxMCAqIDYwICogMTAwMCkpCi0JCQkJCXJldHVybjsKLQkJCX0JCQkKLQkJfQotCQkKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotCQl0cnkgewotCQkJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGNvbmZpZ3VyYXRpb25Db250cmlidXRvciA9IChDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpIGdldENvbmZpZ3VyYXRpb25Db250cmlidXRvcigpOwotCQkJY29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLnNldE5hdHVyZSh0aGlzKTsKLQkJCXJlZ2lzdHJ5ID0gUHJveHlMYXVuY2hTdXBwb3J0LnN0YXJ0SW1wbGVtZW50YXRpb24oZlByb2plY3QsICJCZWFuaW5mbyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSB7IGNvbmZpZ3VyYXRpb25Db250cmlidXRvcn0sIGZhbHNlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxMDApKTsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJaWYgKCFpc1JlZ2lzdHJ5Q3JlYXRlZCgpKSB7Ci0JCQkJCXByb2plY3RDbGVhbmVkKCk7Ci0JCQkJCXJlZ2lzdHJ5LmFkZFJlZ2lzdHJ5TGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JCQkJCWZSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEl0IHdhcyBjcmVhdGVkIHdoaWxlIHdlIHdlcmUgY3JlYXRpbmcuIFNvIHVzZSB0aGUgY3VycmVudCBvbmUuIFRlcm1pbmF0ZSB0aGUgb25lIGp1c3QgY3JlYXRlZC4gTm90IG5lZWRlZC4KLQkJCQkJcmVnaXN0cnkudGVybWluYXRlUmVnaXN0cnkoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVnaXN0cnkgPT0gbnVsbCkgewotCQkJCS8vIEl0IGRpZG4ndCBjcmVhdGUuIFRyZWF0IGFzIHByZW1hdHVyZSB0ZXJtaW5hdGUuCi0JCQkJcHJlbWF0dXJlUmVnaXN0cnlUZXJtaW5hdGUoKTsKLQkJCX0KLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBvdGhlcnMgaW4gcGFja2FnZSAoQmVhbmluZm9DYWNoZUNvbnRyb2xsZXIpIHRvIGxldCBrbm93IGEgY2xlYW4gaGFzIG9jY3VyZWQuCi0JICogCi0JICogVE9ETyB0aGlzIHNob3VsZCBiZSBwYWNrYWdlLXByb3RlY3RlZCBidXQgdW50aWwgaW4gc2FtZSBwYWNrYWdlIGFzIGNhY2hlIGNvbnRyb2xsZXIgaXQgaXMgcHVibGljLgotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcm9qZWN0Q2xlYW5lZCgpIHsKLQkJLy8gT24gYSBjbGVhbiB3ZSB3aWxsIHJlc2V0IHRoZSBjb3VudGVycy4KLQkJcmVnaXN0cnlQcmVtYXR1cmVUZXJtaW5hdGVDb3VudCA9IDA7Ci0JCXJlZ2lzdHJ5TGFzdFByZW1hdHVyZVRlcm1pbmF0ZVRpbWUgPSBOT19QUkVNQVRVUkVfVEVSTUlOQVRFX1RJTUU7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpIHsKLQkJcmV0dXJuIGZSZWdpc3RyeSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIG5hdHVyZSBpcyBzdGlsbCB2YWxpZC4gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4KLQkgKiByZW5hbWVkLCB0aGUgbmF0dXJlIGlzIHN0aWxsIGFyb3VuZCwgYnV0IHRoZSBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiBTbyB0aGUgbmF0dXJlIGlzIG5vdyBpbnZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gSXMgdGhpcyBhIHZhbGlkIG5hdHVyZS4gSS5lLiBpcyB0aGUgcHJvamVjdCBzdGlsbCBvcGVuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWROYXR1cmUoKSB7Ci0JCXJldHVybiBmUHJvamVjdCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VhcmNoIHBhdGggb250byB0aGUgcmVnaXN0cnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJveHlTZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBMaXN0IHNlYXJjaFBhdGhzKSB7Ci0JCWlmIChzZWFyY2hQYXRocyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzdHJpbmdTZWFyY2hQYXRoID0gKFN0cmluZ1tdKSBzZWFyY2hQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbc2VhcmNoUGF0aHMuc2l6ZSgpXSk7Ci0JCQlVdGlsaXRpZXMuc2V0QmVhbkluZm9TZWFyY2hQYXRoKHJlZ2lzdHJ5LCBzdHJpbmdTZWFyY2hQYXRoKTsKLQkJfSBlbHNlCi0JCQlVdGlsaXRpZXMuc2V0QmVhbkluZm9TZWFyY2hQYXRoKHJlZ2lzdHJ5LCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzQmVhbmluZm9zID0gImJlYW5pbmZvcyI7IC8vIFJvb3QgZWxlbWVudCBuYW1lIC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBHZXQgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIHBhdGguIEl0IGlzIGNvcHkuCi0JICovCi0JcHVibGljIEJlYW5pbmZvc0RvYyBnZXRTZWFyY2hQYXRoKCkgewotCQlCZWFuaW5mb3NEb2MgYmRvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBwcm9wZXJ0eSA9IGdldFNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgpOwotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBOZWVkIHRvIHJlY29uc3RydWN0IGZyb20gdGhlIFhNTCBmb3JtYXQuCi0JCQkJCURvY3VtZW50IGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IElucHV0U3RyZWFtUmVhZGVyKHByb3BlcnR5LCBFTkNPRElORykpKTsKLQkJCQkJRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQlpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNCZWFuaW5mb3MpKSB7Ci0JCQkJCQliZG9jID0gQmVhbmluZm9zRG9jLnJlYWRFbnRyeShuZXcgRE9NUmVhZGVyKCksIHJvb3QsIGdldFByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJcHJvcGVydHkuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYmRvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIHBhdGguIE5vIHByb2dyZXNzIG1vbml0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoUGF0aChCZWFuaW5mb3NEb2Mgc2VhcmNoUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRTZWFyY2hQYXRoKHNlYXJjaFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcGVyc2lzdGVudCBzZWFyY2ggcGF0aCB3aXRoIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlYXJjaFBhdGgoQmVhbmluZm9zRG9jIHNlYXJjaFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcHJvcGVydHkgPSBudWxsOwotCQlpZiAoc2VhcmNoUGF0aCAhPSBudWxsICYmIHNlYXJjaFBhdGguZ2V0U2VhcmNocGF0aCgpLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoc0JlYW5pbmZvcyk7IC8vIENyZWF0ZSBSb290IEVsZW1lbnQKLQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBlbnRyaWVzID0gc2VhcmNoUGF0aC5nZXRTZWFyY2hwYXRoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCQlyb290LmFwcGVuZENoaWxkKGVudHJpZXNbaV0ud3JpdGVFbnRyeShkb2MsIGdldFByb2plY3QoKSkpOyAvLyBBZGQgdG8gdGhlIHNlYXJjaCBwYXRoCi0JCQkJZG9jLmFwcGVuZENoaWxkKHJvb3QpOyAvLyBBZGQgUm9vdCB0byBEb2N1bWVudAotCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLQkJCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChzdHJXcml0ZXIpOwotCQkJCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0JCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJCQlwcm9wZXJ0eSA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCS8vIElmIGl0IGhhc24ndCBjaGFuZ2VkLCBkb24ndCB3cml0ZSBpdCBiYWNrIG91dC4gVGhpcyBpcyBzbyB0aGF0IGlmIHRoZSBmaWxlIGhhc24ndAotCQkJLy8gYmVlbiBjaGVja2VkIG91dCBhbmQgaXQgaXMgdGhlIHNhbWUsIHdlIGRvbid0IHdhbnQgdG8gYm90aGVyIHRoZSB1c2VyLiBUaGlzIGlzIGJlY2F1c2UKLQkJCS8vIHdlIGRvbid0IGtub3cgaWYgdGhlIHVzZXIgaGFkIHNpbXBseSBicm93c2VkIHRoZSBzZWFyY2ggcGF0aCBvciBoYWQgYWN0dWFsbHkgY2hhbmdlZCBhbmQKLQkJCS8vIHNldCBpdCBiYWNrIHRvIHdoYXQgaXQgd2FzLiBJbiBlaXRoZXIgb2YgdGhvc2UgY2FzZXMgaXQgd291bGQgYmUgYSBib3RoZXIgdG8gYXNrIHRoZQotCQkJLy8gdXNlciB0byBjaGVja291dCB0aGUgZmlsZS4KLQkJCUlucHV0U3RyZWFtIGlzID0gZ2V0U2hhcmVkUHJvcGVydHkoUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCk7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIEVOQ09ESU5HKTsKLQkJCQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMDBdOwotCQkJCQkJU3RyaW5nQnVmZmVyIG9sZFByb3BlcnR5ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDAwKTsKLQkJCQkJCWludCByZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotCQkJCQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCQkJCQlvbGRQcm9wZXJ0eS5hcHBlbmQoY2hhcnMsIDAsIHJlYWQpOwotCQkJCQkJCXJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob2xkUHJvcGVydHkudG9TdHJpbmcoKS5lcXVhbHMocHJvcGVydHkpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9IC8vIERpZG4ndCBjaGFuZ2UuCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNldFNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgsIHByb3BlcnR5LCBtb25pdG9yKTsKLQkJfSBlbHNlCi0JCQlyZW1vdmVTaGFyZWRQcm9wZXJ0eShQX0JFQU5JTkZPX1NFQVJDSF9QQVRILCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHNldCBmb3IgYWxsIGphdmEgcGFja2FnZXMgaW4gdGhpcyBuYXR1cmUuCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gamF2YVJTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFya0FsbFN0YWxlKCkgewotCQkvLyBNYXJrIGFsbCBzdGFsZSBzbyB0aGF0IHRoZSByZWdpc3RyeSB3aWxsIGJlIHJlY3ljbGVkLgotCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCS8vIFdlIGhhdmUgYSByZWdpc3RyeSBydW5uaW5nLCB3ZSBuZWVkIHRvIGluZGljYXRlIHJlY3ljbGUgaXMgbmVlZGVkLgotCQkJZlN5bmNocm9uaXplci5nZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtBbGxTdGFsZSgpOwotCQkJLy8gTWFyayBhbGwgc3RhbGUuIE5leHQgdGltZSB3ZSBuZWVkIGFueXRoaW5nIGl0IHdpbGwgYmUgcmVjeWNsZWQuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGZvciBhIGdpdmVuIHNoYXJlZCBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVNoYXJlZFByb3BlcnR5RmlsZU5hbWUoUXVhbGlmaWVkTmFtZSBxTmFtZSkgewotCQlyZXR1cm4gcU5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgYSBzaGFyZWQgcHJvcGVydHkgb24gYSBwcm9qZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGFuc3dlcnMgbnVsbC4KLQkgKiBOb3RlIHRoYXQgaXQgaXMgb3J0aG9nb25hbCB0byBJUmVzb3VyY2UgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLCBhbmQgY2xpZW50IGNvZGUgaGFzIHRvIGRlY2lkZQotCSAqIHdoaWNoIGZvcm0gb2Ygc3RvcmFnZSB0byB1c2UgYXBwcm9wcmlhdGVseS4gU2hhcmVkIHByb3BlcnRpZXMgcHJvZHVjZSByZWFsIHJlc291cmNlIGZpbGVzIHdoaWNoCi0JICogY2FuIGJlIHNoYXJlZCB0aHJvdWdoIGEgVkNNIG9udG8gYSBzZXJ2ZXIuIFBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgbm90IHNoYXJlYWJsZS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRTaGFyZWRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlGaWxlTmFtZSk7Ci0JCWlmIChyc2NGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIHJzY0ZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlY29yZCBhIHNoYXJlZCBwZXJzaXN0ZW50IHByb3BlcnR5IG9udG8gYSBwcm9qZWN0LgotCSAqIE5vdGUgdGhhdCBpdCBpcyBvcnRob2dvbmFsIHRvIElSZXNvdXJjZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMsIGFuZCBjbGllbnQgY29kZSBoYXMgdG8gZGVjaWRlCi0JICogd2hpY2ggZm9ybSBvZiBzdG9yYWdlIHRvIHVzZSBhcHByb3ByaWF0ZWx5LiBTaGFyZWQgcHJvcGVydGllcyBwcm9kdWNlIHJlYWwgcmVzb3VyY2UgZmlsZXMgd2hpY2gKLQkgKiBjYW4gYmUgc2hhcmVkIHRocm91Z2ggYSBWQ00gb250byBhIHNlcnZlci4gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2hhcmVhYmxlLgotCSAqIAotCSAqIHNoYXJlZCBwcm9wZXJ0aWVzIGVuZCB1cCBpbiByZXNvdXJjZSBmaWxlcywgYW5kIHRodXMgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZwotCSAqIGRlbHRhIG5vdGlmaWNhdGlvbnMgKGEgQ29yZUV4Y2VwdGlvbiB3b3VsZCB0aGVuIGJlIHRocm93bikuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJSUZpbGUgcnNjRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHByb3BlcnR5TmFtZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2YWx1ZS5nZXRCeXRlcyhFTkNPRElORykpOwotCQkJLy8gdXBkYXRlIHRoZSByZXNvdXJjZSBjb250ZW50Ci0JCQlpZiAocnNjRmlsZS5leGlzdHMoKSkgewotCQkJCXJzY0ZpbGUuc2V0Q29udGVudHMoaW5wdXQsIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnNjRmlsZS5jcmVhdGUoaW5wdXQsIHRydWUsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHNoYXJlZCBwZXJzaXN0ZW50IHByb3BlcnR5IG9udG8gYSBwcm9qZWN0LgotCSAqIE5vdGUgdGhhdCBpdCBpcyBvcnRob2dvbmFsIHRvIElSZXNvdXJjZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMsIGFuZCBjbGllbnQgY29kZSBoYXMgdG8gZGVjaWRlCi0JICogd2hpY2ggZm9ybSBvZiBzdG9yYWdlIHRvIHVzZSBhcHByb3ByaWF0ZWx5LiBTaGFyZWQgcHJvcGVydGllcyBwcm9kdWNlIHJlYWwgcmVzb3VyY2UgZmlsZXMgd2hpY2gKLQkgKiBjYW4gYmUgc2hhcmVkIHRocm91Z2ggYSBWQ00gb250byBhIHNlcnZlci4gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2hhcmVhYmxlLgotCSAqIAotCSAqIHNoYXJlZCBwcm9wZXJ0aWVzIGVuZCB1cCBpbiByZXNvdXJjZSBmaWxlcywgYW5kIHRodXMgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZwotCSAqIGRlbHRhIG5vdGlmaWNhdGlvbnMgKGEgQ29yZUV4Y2VwdGlvbiB3b3VsZCB0aGVuIGJlIHRocm93bikuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2hhcmVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSUZpbGUgcnNjRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHByb3BlcnR5TmFtZSk7Ci0JCXJzY0ZpbGUuZGVsZXRlKHRydWUsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3IgdGhhdCBzZXRzIHVwIGEgdm0gdG8gYWxsb3cKLQkgKiBpbnRyb3NwZWN0aW9uLiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBwYXRocwotCSAqIGFyZSBpbiB0aGUgY2xhc3NwYXRoIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgYmVhbmluZm9zLCBhbmQKLQkgKiBpdCB3aWxsIHNldHVwIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGdldENvbmZpZ3VyYXRpb25Db250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IoZ2V0U2VhcmNoUGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlbWF0dXJlUmVnaXN0cnlUZXJtaW5hdGUoKSB7Ci0JCXN5bmNocm9uaXplZChCZWFuaW5mb05hdHVyZS50aGlzKSB7Ci0JCQlyZWdpc3RyeVByZW1hdHVyZVRlcm1pbmF0ZUNvdW50Kys7Ci0JCQlyZWdpc3RyeUxhc3RQcmVtYXR1cmVUZXJtaW5hdGVUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyIHsKLQotCQlwcml2YXRlIEJlYW5pbmZvc0RvYyBkb2M7Ci0JCUxpc3QgY29tcHV0ZWRTZWFyY2hQYXRoOwotCQkJCQotCQkvLyBUaGUgbmF0dXJlLiBJZiB0aGUgbmF0dXJlIGlzIG5vdCBzZXQgdGhlbiB0aGlzIGNvbnRyaWJ1dG9yIGlzIG9uZQotCQkvLyB1c2VkIGJ5IHNvbWUgb3RoZXIgbGF0ZXIgcHJveHkgcmVnaXN0cnkgdG8gZ2V0IHRoZSBiZWFuaW5mbyBjbGFzc2VzIGludG8gdGhlaXIgcGF0aHMuIEluIHRoYXQgY2FzZQotCQkvLyB3ZSBjYW4gZXhwZWN0IHRoZSBjb25maWcgaW5mbyB0byBiZSBpbiB0aGUgc2Vzc2lvbiB2YXJpYWJsZSBmb3Igb3VyIHVzZS4gT3RoZXJ3aXNlIHdlIHdpbGwgbmVlZCB0bwotCQkvLyBhZGQgaXQgaGVyZS4gQWxzbyBkb24ndCBzZXQgc2VhcmNocGF0aCBzdHVmZiBpZiBub3QgbmF0dXJlIGJlY2F1c2Ugb25seSB0aGUgYmVhbmluZm8gb25lIHdpbGwgZG8gaW50cm9zcGVjdGlvbi4KLQkJcHJpdmF0ZSBCZWFuaW5mb05hdHVyZSBuYXR1cmU7CQotCQkKLQkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbzsKLQkJcHJpdmF0ZSBJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzOwotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IoQmVhbmluZm9zRG9jIGRvYykgewotCQkJdGhpcy5kb2MgPSBkb2M7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgdGhhdCB0aGlzIGlzIHRoZSBuYXR1cmUgY29udHJpYnV0b3IuIE5vdCBudWxsLCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGNvbnRyaWJ1dG9yIGJlaW5nCi0JCSAqIHVzZWQgdG8gc2V0dXAgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvamVjdCdzIGJlYW5pbmZvIG5hdHVyZS4gbnVsbCAoZGVmYXVsdCkgbWVhbnMgdGhhdCB0aGlzCi0JCSAqIGlzIG9uZSBjcmVhdGVkIHRvIGFkZCB0byBzb21lIGVkaXRvcidzIHJlZ2lzdHJ5LgotCQkgKiAKLQkJICogTm90ZTogVGhpcyBNVVNUIGJlIHNldCBiZWZvcmUgaW5pdGlhbGl6ZSBpcyBjYWxsZWQgb3IgaXQgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuIElmIG5vdCBzZXQsIGl0IAotCQkgKiB3aWxsIGJlIGNvbnNpZGVyZWQgbm90IGZvciBCZWFuSW5mbyBuYXR1cmUgZGlyZWN0bHkuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXROYXR1cmUoQmVhbmluZm9OYXR1cmUgbmF0dXJlKSB7Ci0JCQl0aGlzLm5hdHVyZSA9IG5hdHVyZTsKLQkJCWlmIChuYXR1cmUgIT0gbnVsbCkKLQkJCQljb21wdXRlZFNlYXJjaFBhdGggPSBuZXcgQXJyYXlMaXN0KDMpOwkvLyBXZSB3aWxsIGJlIGdhdGhlcmluZyB0aGlzIGluZm8uCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2luaXRpYWxpemUob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgewotCQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0U2Vzc2lvblByb3BlcnR5KENPTkZJR19JTkZPX1NFU1NJT05fS0VZKSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRPRE8gRm9yIG5vdyB3ZSB3aWxsIHJlYnVpbGQgZm9yIGVhY2ggdGltZSB3ZSBvcGVuIGEgcmVnaXN0cnksIGJ1dCBpdCBhY3R1YWxseSBpcyBvbmx5IG5lZWRlZCBpZiBhIGNsYXNzcGF0aAotCQkJCQkvLyBjaGFuZ2VzIGZvciBzb21lIHJlYXNvbi4gQXQgdGhhdCBwb2ludCB3ZSBjYW4gZ2V0IGl0IG91dCBvZiBoZXJlLgotCQkJCQkKLQkJCQkJY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhpbmZvKTsJCQkJCQotCQkJCX0gCi0JCQkJZXhwbGljaXRDb250cmlidXRvcnMgPSAoSUJlYW5JbmZvQ29udHJpYnV0b3JbXSkgaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRTZXNzaW9uUHJvcGVydHkoQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIENvbnRyaWJ1dGUgZm9yIHRoaXMgcHJvamVjdAotCQkJY29udHJpYnV0ZUNsYXNzcGF0aHNGb3JQcm9qZWN0KGNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCksIGRvYywgdHJ1ZSk7Ci0JCQkJCQkKLQkJCWlmICghaW5mby5nZXRQcm9qZWN0UGF0aHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcHJvamVjdHMgYW5kIGNvbnRyaWJ1dGUgdGhlIGNsYXNzcGF0aHMgKHdoaWNoIGNvbWUgZnJvbSB0aGUgQmVhbkluZm8gZG9jcywgaWYgdGhleSBoYXZlIGFueSkuCi0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCUl0ZXJhdG9yIHByb2pJdGVyID0gaW5mby5nZXRQcm9qZWN0UGF0aHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHByb2pJdGVyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwcm9qSXRlci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKChJUGF0aCkgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpIHJlcykuaXNPcGVuKCkgJiYgQmVhbmluZm9OYXR1cmUuaGFzUnVudGltZSgoSVByb2plY3QpIHJlcykpCi0JCQkJCQkJY29udHJpYnV0ZUNsYXNzcGF0aHNGb3JQcm9qZWN0KGNvbnRyb2xsZXIsIChJUHJvamVjdCkgcmVzLCBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKChJUHJvamVjdCkgcmVzKQotCQkJCQkJCQkJLmdldFNlYXJjaFBhdGgoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQkJCi0JCQlpZiAoIWluZm8uZ2V0Q29udGFpbmVySWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIGNvbnRhaW5lciBpZHMgdGhhdCBhcmUgYXBwbGljYWJsZS4KLQkJCQlJdGVyYXRvciBjb250YWluZXJJZEl0ciA9IGluZm8uZ2V0Q29udGFpbmVySWRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY29udGFpbmVySWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUNvbnRhaW5lclBhdGhzIGNvbnRhaW5lclBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBjb250YWluZXJJZEl0ci5uZXh0KCk7Ci0JCQkJCXByb2Nlc3NCZWFuaW5mb0VudHJpZXMoQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Q29udGFpbmVySWRCZWFuSW5mb3MoY29udGFpbmVyUGF0aHMuZ2V0Q29udGFpbmVySWQoKSwgY29udGFpbmVyUGF0aHMuZ2V0VmlzaWJsZUNvbnRhaW5lclBhdGhzKCkpLAotCQkJCQkJCWNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJCi0JCQlpZiAoIWluZm8uZ2V0UGx1Z2luSWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIHBsdWdpbiBpZHMgdGhhdCBhcmUgYXBwbGljYWJsZS4KLQkJCQlJdGVyYXRvciBwbHVnaW5JZEl0ciA9IGluZm8uZ2V0UGx1Z2luSWRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwbHVnaW5JZEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgcGx1Z2luSWRJdHIubmV4dCgpOwotCQkJCQlpZiAoKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cmllcyhCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5CZWFuSW5mb3MoKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpLCBjb250cm9sbGVyLCBpbmZvLmdldEphdmFQcm9qZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJCi0JCQlpZiAoIWluZm8uZ2V0Q29udGFpbmVycygpLmlzRW1wdHkoKSkgewotCQkJCS8vIFJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgdmlzaWJsZSBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElCZWFuSW5mb0NvbnRyaWJ1dG9yIGFuZCBhc2sgdGhlbSBmb3IgdGhlIGNvbnRyaWJ1dGlvbnMuCi0JCQkJSXRlcmF0b3IgY29udGFpbmVySXRyID0gaW5mby5nZXRDb250YWluZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChjb250YWluZXJJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGNvbnRhaW5lckl0ci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBJQmVhbkluZm9Db250cmlidXRvcikKLQkJCQkJCQlwcm9jZXNzQmVhbmluZm9FbnRyaWVzKCgoSUJlYW5JbmZvQ29udHJpYnV0b3IpIGVudHJ5LmdldEtleSgpKS5nZXRCZWFuSW5mb0VudHJ5Q29udHJpYnV0aW9ucyhpbmZvKSwKLQkJCQkJCQkJCWNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9CQkJCi0JCQkJCi0JCQkvLyBBbmQgZmluYWxseSBydW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzLgkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwbGljaXRDb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJQmVhbkluZm9Db250cmlidXRvciBjb250cmlidXRvciA9IGV4cGxpY2l0Q29udHJpYnV0b3JzW2ldOwotCQkJCXByb2Nlc3NCZWFuaW5mb0VudHJpZXMoY29udHJpYnV0b3IuZ2V0QmVhbkluZm9FbnRyeUNvbnRyaWJ1dGlvbnMoaW5mbyksIGNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikgewotCQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZy4gYnkgZGVmYXVsdCBwbGF0Zm9ybSBsb2dzLgotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHs7Ci0JCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJKChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuY29udHJpYnV0ZUNsYXNzcGF0aHMoY29udHJvbGxlcik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQWRkIHRoZSBjb21tb24gdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLiAoU2luY2Ugd2UgYXJlIG5vdyBhIGphcnJlZCBwbHVnaW4sIHRoZSBjb21tb24gaXMgbm90IHRoZSBwbHVnaW4gamFyIGl0c2VsZikuCi0JCQkvLyBXaXRoIGJ1ZyAyNTY0NDEgd2UndmUgcmV2ZXJ0ZWQgdG8gcHV0dGluZyBvbmx5IHRoZSAiY29tbW9uLmphciIgb24gdGhlIGNsYXNzcGF0aCwgdGhvdWdoIG5vdyBpdCBpcyBpdHMgb3duIGJ1bmRsZS4gU2VlCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2NDQxCi0JCQlCdW5kbGUgY29tbW9uQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm0uY29tbW9uIik7Ci0JCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoY29tbW9uQnVuZGxlLCAoSVBhdGgpIG51bGwsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBBZGQgdGhlIGJlYW5pbmZvdm0uamFyIGFuZCBhbnkgbmxzIHRvIHRoZSBlbmQgb2YgdGhlIGNsYXNzcGF0aC4KLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY0NDEKLQkJCUJ1bmRsZSB2bUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtIik7Ci0JCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgodm1CdW5kbGUsIChJUGF0aCkgbnVsbCwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldChJQ2xhc3NwYXRoRW50cnlbXSBhcnJheSwgU2VhcmNocGF0aEVudHJ5IHNlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldLmdldEVudHJ5S2luZCgpID09IHNlLmdldEtpbmQoKSAmJiBhcnJheVtpXS5nZXRQYXRoKCkuZXF1YWxzKHNlLmdldFBhdGgoKSkpCi0JCQkJCXJldHVybiBhcnJheVtpXTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUJlYW5pbmZvc0RvY0VudHJ5W10gRU1QVFlfRU5UUklFUyA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbMF07Ci0JCQotCQkvKgotCQkgKiBDb250cmlidXRlIGNsYXNzcGF0aHMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSWYgZG9jIGlzIHBhc3NlZCBpbiwgdGhlbiB0aGlzIGlzIHRoZSB0b3AgbGV2ZWwgYW5kCi0JCSAqIGFsbCBzaG91bGQgYmUgYWRkZWQuIElmIG5vIGRvYywgdGhlbiB0aGlzIGlzIHByZS1yZXEnZCBwcm9qZWN0LCBhbmQgdGhlbiB3ZSB3aWxsIGhhbmRsZSBleHBvcnRlZCBlbnRyaWVzIG9ubHkuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoc0ZvclByb2plY3QoCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciwKLQkJCUlQcm9qZWN0IHByb2plY3QsCi0JCQlCZWFuaW5mb3NEb2MgZG9jLAotCQkJYm9vbGVhbiB0b3BsZXZlbFByb2plY3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJhd1BhdGggPSBqUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQotCQkJLy8gU2VhcmNoIHBhdGggb2YgdGhpcyBwcm9qZWN0Ci0JCQlJQmVhbmluZm9zRG9jRW50cnlbXSBlbnRyaWVzID0gKGRvYyAhPSBudWxsKSA/IGRvYy5nZXRTZWFyY2hwYXRoKCkgOiBFTVBUWV9FTlRSSUVTOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhbmluZm9zRG9jRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCWlmIChlbnRyeSBpbnN0YW5jZW9mIEJlYW5pbmZvRW50cnkpIHsKLQkJCQkJQmVhbmluZm9FbnRyeSBiZSA9IChCZWFuaW5mb0VudHJ5KSBlbnRyeTsKLQkJCQkJaWYgKHRvcGxldmVsUHJvamVjdCB8fCBiZS5pc0V4cG9ydGVkKCkpIHsKLQkJCQkJCS8vIEZpcnN0IHByb2plY3Qgb3IgdGhpcyBpcyBhbiBleHBvcnRlZCBiZWFuaW5mbywgc28gd2UgcHJvY2VzcyBpdC4KLQkJCQkJCXByb2Nlc3NCZWFuaW5mb0VudHJ5KGJlLCBjb250cm9sbGVyLCBqUHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG5hdHVyZSAhPSBudWxsKXsKLQkJCQkJLy8gSnVzdCBhIHNlYXJjaCBwYXRoIGVudHJ5LiBUaGVyZSBpcyBubyBiZWFuaW5mbyBqYXIgdG8gcGljayB1cC4KLQkJCQkJLy8gV2UgaGF2ZSBhIG5hdHVyZSwgc28gd2UgcHJvY2VzcyBzZWFyY2ggcGF0aC4KLQkJCQkJU2VhcmNocGF0aEVudHJ5IHNlID0gKFNlYXJjaHBhdGhFbnRyeSkgZW50cnk7Ci0JCQkJCWlmICghdG9wbGV2ZWxQcm9qZWN0KSB7Ci0JCQkJCQkvLyBXZSBhcmUgaW4gYSBuZXN0ZWQgcHJvamVjdCwgZmluZCB0aGUgcmF3IGNsYXNzcGF0aCBlbnRyeSB0byBzZWUKLQkJCQkJCS8vIGlmIHRoaXMgZW50cnkgaXMgZXhwb3J0ZWQuIE9ubHkgZG8gaXQgaWYgZXhwb3J0ZWQuIChOb3RlOiBleHBvcnRlZCBpcyBvbmx5IHVzZWQgb24gbm9uLXNvdXJjZS4gU291cmNlIGFyZSBhbHdheXMgZXhwb3J0ZWQpLgotCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGdldChyYXdQYXRoLCBzZSk7Ci0JCQkJCQlpZiAoY3BlID09IG51bGwgfHwgKGNwZS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSAmJiAhY3BlLmlzRXhwb3J0ZWQoKSkpIHsKLQkJCQkJCQljb250aW51ZTsgLy8gTm90IGV4aXN0IG9yIG5vdCBleHBvcnRlZCwgc28gd2UgZG9uJ3Qgd2FudCBpdCBoZXJlIGVpdGhlci4KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCVN0cmluZyBwa2cgPSBzZS5nZXRQYWNrYWdlKCk7Ci0JCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQkJLy8gRXhwbGljaXQgc2VhcmNoIHBhdGgKLQkJCQkJCWlmICghY29tcHV0ZWRTZWFyY2hQYXRoLmNvbnRhaW5zKHBrZykpCi0JCQkJCQkJY29tcHV0ZWRTZWFyY2hQYXRoLmFkZChwa2cpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2Ugbm8gbG9uZ2VyIGFsbG93IHRoaXMsIGJ1dCBqdXN0IHRvIGJlIG9uIHNhZmUgc2lkZSB3ZSB0ZXN0IGZvciBpdC4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NCZWFuaW5mb0VudHJpZXMoCi0JCQlCZWFuaW5mb0VudHJ5W10gZW50cmllcywKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyLAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKGVudHJpZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cnkoZW50cmllc1tpXSwgY29udHJvbGxlciwgamF2YVByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW5pbmZvRW50cnkoCi0JCQlCZWFuaW5mb0VudHJ5IGVudHJ5LAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlPYmplY3RbXSBjcHMgPSBlbnRyeS5nZXRDbGFzc3BhdGgoamF2YVByb2plY3QpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcHMubGVuZ3RoOyBqKyspIHsKLQkJCQlPYmplY3QgY3AgPSBjcHNbal07Ci0JCQkJaWYgKGNwIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZVByb2plY3QoKElQcm9qZWN0KSBjcCk7Ci0JCQkJZWxzZSBpZiAoY3AgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhUb1VSTCgoU3RyaW5nKSBjcCksIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgpOwotCQkJCWVsc2UgaWYgKGNwIGluc3RhbmNlb2YgSVBhdGgpIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgY3A7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGF0aC5zZWdtZW50KDApKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKGJ1bmRsZSwgcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX1VTRVJfQ0xBU1NQQVRILCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCS8vIE5vdyBhZGQgaW4gdGhlIHBhY2thZ2UgbmFtZXMuCi0JCQkJU2VhcmNocGF0aEVudHJ5W10gc2VlcyA9IGVudHJ5LmdldFNlYXJjaFBhdGhzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVNlYXJjaHBhdGhFbnRyeSBzZWFyY2hwYXRoRW50cnkgPSBzZWVzW2pdOwotCQkJCQlpZiAoIWNvbXB1dGVkU2VhcmNoUGF0aC5jb250YWlucyhzZWFyY2hwYXRoRW50cnkuZ2V0UGFja2FnZSgpKSkKLQkJCQkJCWNvbXB1dGVkU2VhcmNoUGF0aC5hZGQoc2VhcmNocGF0aEVudHJ5LmdldFBhY2thZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29uZmlndXJhdGlvbihmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBsaWNpdENvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIGludCBpaSA9IGk7Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBkbyBub3RoaW5nLiBieSBkZWZhdWx0IHBsYXRmb3JtIGxvZ3MuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCUlCZWFuSW5mb0NvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZXhwbGljaXRDb250cmlidXRvcnNbaWldOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkoKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5jb250cmlidXRlVG9Db25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KGZpbmFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlpZiAobmF0dXJlICE9IG51bGwpCi0JCQkJbmF0dXJlLnNldFByb3h5U2VhcmNoUGF0aChyZWdpc3RyeSwgY29tcHV0ZWRTZWFyY2hQYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwbGljaXRDb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gZG8gbm90aGluZy4gYnkgZGVmYXVsdCBwbGF0Zm9ybSBsb2dzLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlJQmVhbkluZm9Db250cmlidXRvciBjb250cmlidXRvciA9IGV4cGxpY2l0Q29udHJpYnV0b3JzW2lpXTsKLQkJCQkJCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpCi0JCQkJCQkJKChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuY29udHJpYnV0ZVRvUmVnaXN0cnkocmVnaXN0cnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvUHJveHlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTBiODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvUHJveHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0KLS8qKgotICogVGhpcyBob2xkcyB0aGUgcHJveHkgY29uc3RhbnRzIGZvciBhY2Nlc3MgaW4gYmVhbmluZm8uIEl0IGlzIGNyZWF0ZWQgb24gYSBwZXItcmVnaXN0cnkgYmFzaXMgYW5kIHN0b3JlZCBpbiB0aGUgY29uc3RhbnRzIHNlY3Rpb24gb2YgdGhlIHJlZ2lzdHJ5IHNvCi0gKiB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGFzIG5lZWRlZC4KLSAqIDxwPgotICogVG8gZ2FpbiBhY2Nlc3MgdG8gdGhlc2UgY29uc3RhbnRzLCB1c2UgdGhlIHN0YXRpYyBhY2Nlc3NvciBtZXRob2QgImdldENvbnN0YW50cygpIiBzbyB0aGF0IHRoZSBpbnN0YW5jZSBpcyBub3QgY3JlYXRlZCB1bnRpbCBhY3R1YWxseSBuZWVkZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmVhbmluZm9Qcm94eUNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHSVNUUllfS0VZID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBJTWV0aG9kUHJveHkgaW50cm9zcGVjdFByb3h5OwotCi0JcHJpdmF0ZSBmaW5hbCBJTWV0aG9kUHJveHkgZ2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHk7Ci0KLQlwcml2YXRlIGZpbmFsIElNZXRob2RQcm94eSBzZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQotCXByaXZhdGUgZmluYWwgSU1ldGhvZFByb3h5IHNlbmRCZWFuSW5mb1Byb3h5OwotCi0JLyoqCi0JICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGdldENvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCAmJiByZWdpc3RyeS5pc1ZhbGlkKCkpIHsKLQkJCUJlYW5pbmZvUHJveHlDb25zdGFudHMgY29uc3RhbnRzID0gKEJlYW5pbmZvUHJveHlDb25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCQkJaWYgKGNvbnN0YW50cyA9PSBudWxsKQotCQkJCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IEJlYW5pbmZvUHJveHlDb25zdGFudHMocmVnaXN0cnkpKTsKLQkJCXJldHVybiBjb25zdGFudHM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCi0JCUlCZWFuVHlwZVByb3h5IGludHJvc3BlY3RvciA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYmVhbnMuSW50cm9zcGVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkgPSBpbnRyb3NwZWN0b3IuZ2V0TWV0aG9kUHJveHkoImdldEJlYW5JbmZvU2VhcmNoUGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCXNldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5ID0gaW50cm9zcGVjdG9yLmdldE1ldGhvZFByb3h5KCJzZXRCZWFuSW5mb1NlYXJjaFBhdGgiLCAiW0xqYXZhLmxhbmcuU3RyaW5nOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlJQmVhblR5cGVQcm94eSBtb2RlbGluZ0JlYW5pbmZvID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtLk1vZGVsaW5nQmVhbkluZm8iKTsvLyROT04tTkxTLTEkCi0JCWludHJvc3BlY3RQcm94eSA9IG1vZGVsaW5nQmVhbmluZm8uZ2V0TWV0aG9kUHJveHkoImludHJvc3BlY3QiLCBuZXcgU3RyaW5nW10geyAiamF2YS5sYW5nLkNsYXNzIiwgImJvb2xlYW4iLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0KLQkJc2VuZEJlYW5JbmZvUHJveHkgPSBtb2RlbGluZ0JlYW5pbmZvLmdldE1ldGhvZFByb3h5KCJzZW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2VuZEJlYW5EZWNvcmF0b3IgbWV0aG9kIHByb3h5IGZyb20gTW9kZWxpbmdCZWFuSW5mby4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRTZW5kQmVhbkluZm9Qcm94eSgpIHsKLQkJcmV0dXJuIHNlbmRCZWFuSW5mb1Byb3h5OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGdldEJlYW5JbmZvU2VhcmNoUGF0aCBtZXRob2QgcHJveHkgZnJvbSBJbnRyb3NwZWN0b3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKSB7Ci0JCXJldHVybiBnZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNldEJlYW5JbmZvU2VhcmNoUGF0aCBtZXRob2QgcHJveHkgZnJvbSBJbnRyb3NwZWN0b3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKSB7Ci0JCXJldHVybiBzZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGludHJvc3BlY3QgbWV0aG9kIHByb3h5IGZyb20gTW9kZWxpbmdCZWFuSW5mby4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRJbnRyb3NwZWN0UHJveHkoKSB7Ci0JCXJldHVybiBpbnRyb3NwZWN0UHJveHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvU3VwZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9TdXBlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNDkzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9TdXBlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3VwZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci0KLS8qKgotICogVXNlZCB0byBrbm93IHdoZW4gZXZlbnRzIG9yIGFueSBvZiB0aGUgc3VwZXIgY2xhc3NlcyBjaGFuZ2Ugc28KLSAqIHRoYXQgd2UgY2FuIHJlLWNvbnN0cnVjdCBvdXIgYWxsIGV2ZW50cyBsaXN0IG5leHQgdGltZSB3ZSBuZWVkIGl0LgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9TdXBlckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfS0VZID0gQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gYWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbE9wZXJhdGlvbnNDb2xsZWN0aW9uTW9kaWZpZWQgPSB0cnVlOwotCi0JcHVibGljIEJlYW5pbmZvU3VwZXJBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSKQotCQkJc2V0RmxhZ3MobXNnLmdldEZlYXR1cmVJRChKYXZhQ2xhc3MuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZCgpIHsKLQkJcmV0dXJuIGFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQoYm9vbGVhbiBuZXdFdmVudHNNb2RpZmllZCkgewotCQlhbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQgPSBuZXdFdmVudHNNb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbE9wZXJhdGlvbnNDb2xsZWN0aW9uTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBhbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbE9wZXJhdGlvbnNDb2xsZWN0aW9uTW9kaWZpZWQoYm9vbGVhbiBuZXdPcGVyYXRpb25zTW9kaWZpZWQpIHsKLQkJYWxsT3BlcmF0aW9uc0NvbGxlY3Rpb25Nb2RpZmllZCA9IG5ld09wZXJhdGlvbnNNb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZChib29sZWFuIGFsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQpIHsKLQkJdGhpcy5hbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkID0gYWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBhbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTdWJjbGFzc2VzKCkgewotCQkvLyBHZXQgdGhlbSBmcm9tIHRoZSBFU3VwZXJBZGFwdGVyLiBFYXNpZXN0IHRvIGRvLgotCQlFU3VwZXJBZGFwdGVyIGVhID0gKChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKSkuZ2V0RVN1cGVyQWRhcHRlcigpOwotCQlyZXR1cm4gZWEuZ2V0U3ViY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfS0VZLmVxdWFscyh0eXBlKTsKLQl9Ci0KLQl2b2lkIHNldEZsYWdzKGludCBmZWF0dXJlSWQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSWQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTIDoKLQkJCQlzZXRBbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCXNldEFsbE9wZXJhdGlvbnNDb2xsZWN0aW9uTW9kaWZpZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOgotCQkJCXNldEFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZCh0cnVlKTsKLQkJCQlzZXRBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKHRydWUpOwotCQkJCWJyZWFrOwkJCQkKLQkJCQkKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJc2V0QWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZCh0cnVlKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCUl0ZXJhdG9yIGkgPSBnZXRTdWJjbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlOb3RpZmllciBuID0gKE5vdGlmaWVyKSBpLm5leHQoKTsKLQkJCUJlYW5pbmZvU3VwZXJBZGFwdGVyIGEgPSAoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIobiwgQURBUFRFUl9LRVkpOwotCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQlhLnNldEZsYWdzKGZlYXR1cmVJZCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9DcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9DcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhNWM1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLSAKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgQmVhbmluZm9OYXR1cmUgdG8gaGFuZGxlIHRoZSBjcmVhdGlvbiBvZiB0aGUgcmVnaXN0cnksCi0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgYSBzaW5nbGV0b24uIEl0IGlzIG5lZWRlZCB0byBoYW5kbGUgaWYgVUkgYWN0aXZlIHdpdGhvdXQKLSAqIHJlcXVpcmluZyBVSSBwbHVnaW4uIChTbyBoZWFkbGVzcyB3aWxsIHdvcmsgdG9vKS4gVGhlIHN1YmNsYXNzIDxjb2RlPlVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyPC9jb2RlPgotICogd2lsbCBiZSBpbnN0YW50aWF0ZWQgaW4gY2FzZSBvZiBVSSBhY3RpdmUuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotY2xhc3MgQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIgam9iSGFuZGxlciA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJlZ2lzdHJ5KEJlYW5pbmZvTmF0dXJlIG5hdHVyZSkgewotCQlzeW5jaHJvbml6ZWQgKENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlci5jbGFzcykgewotCQkJaWYgKGpvYkhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpIikgIT0gbnVsbCkgewkvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBUaGVyZSBpcyBhIFVJLCBpdCBtYXkgbm90IGJlIGFjdGl2ZSwgYnV0IGJyaW5nIGluIFVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyIHRvIGRvIHRoZQotCQkJCQkJLy8gYWN0dWFsIHdvcmsgc2luY2UgaXQgY2FuIHJlZmVyZW5jZSB0aGUgVUkuCi0JCQkJCQlqb2JIYW5kbGVyID0gKENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcikgQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLlVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyIikubmV3SW5zdGFuY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWpvYkhhbmRsZXIgPSBuZXcgQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyKCk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJam9iSGFuZGxlciA9IG5ldyBDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIoKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlqb2JIYW5kbGVyID0gbmV3IENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBTZWUgaWYgQXV0b2J1aWxkIHNsZWVwaW5nIG9yIHdhaXRpbmcuIFRoaXMgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBmb3IgdXMuIFdlIGNhbid0IHdhaXQgZm9yIGl0Ci0JCS8vIGJlY2F1c2Ugd2UgbWF5IGFscmVhZHkgaGF2ZSB0aGUgYnVpbGQgcnVsZSBsb2NrZWQgYnkgb3VyIHRocmVhZC4gTm8gd2F5IG9mIHRlc3RpbmcgdGhpcyBpZiBiZWdpblJ1bGUgd2FzIHVzZWQuCi0JCS8vIFdlIGNhbiB0ZXN0IGlmIHdlIGFyZSBhIGJ1aWxkIGpvYiAobm90IGFuIGlubGluZSBidWlsZCksIGFuZCBpZiBzbywganVzdCBnbyBvbi4KLQkJLy8gTWF5YmUgd2UgY2FuIGZpZ3VyZSBvdXQgaW4gZnV0dXJlIGlmIHdlIGZpbmQgcmFjZSBjb25kaXRpb24gaGFwcGVucyBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IEpvYi5nZXRKb2JNYW5hZ2VyKCk7Ci0JCUpvYiBjdXJyZW50Sm9iID0gam9iTWFuYWdlci5jdXJyZW50Sm9iKCk7Ci0JCWlmIChjdXJyZW50Sm9iID09IG51bGwgfHwgKCFjdXJyZW50Sm9iLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpICYmICFjdXJyZW50Sm9iLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkpKSB7Ci0JCQkvLyBTZWUgaWYgYXV0b2pvYiBpcyB3YWl0aW5nIG9yIHNsZWVwaW5nLgotCQkJLy8gR2l2ZSBpdCB1cCB0byBhIHNlY29uZCBhdCAuMiBzZWNvbmQgaW50ZXJ2YWxzIHRvIHRyeSAoaS5lLiA1IHRyaWVzKQotCQkJaW50IHRyaWVzID0gNTsKLQkJCXdoaWxlIChpc0F1dG9XYWl0aW5nKCkgJiYgLS10cmllcz4wKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7CS8vIFdhaXQganVzdCAuMiBzZWNvbmRzIHRvIGdpdmUgYnVpbGQgYSBjaGFuY2UgdG8gc3RhcnQuIElmIGl0IGlzIHN0aWxsIG5vdCBzdGFydGVkLCB0aGVuIGp1c3QgZ28gb24uCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmICh0cmllcz09MCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCQlsb2dnZXIubG9nKCJCdWlsZCBqb2Igd2FpdGluZyB3aGVuIHRyeWluZyB0byBzdGFydCBiZWFuaW5mbyByZWdpc3RyeS4gUG9zc2libGUgcmFjZS4iLCBMZXZlbC5XQVJOSU5HKTsJLy8gJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlqb2JIYW5kbGVyLnByb2Nlc3NDcmVhdGVSZWdpc3RyeShuYXR1cmUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdXRvV2FpdGluZygpIHsKLQkJSm9iW10gYXV0b2pvYnMgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxEKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRvam9icy5sZW5ndGg7IGkrKykgewotCQkJaW50IHN0YXRlID0gYXV0b2pvYnNbaV0uZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBKb2IuV0FJVElORyB8fCBzdGF0ZSA9PSBKb2IuU0xFRVBJTkcpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBjcmVhdGUgb2YgdGhlIHJlZ2lzdHJ5LiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIHRvCi0JICogZG8gd2hhdCB0aGUgVUkgbmVlZHMuIFRoZSBVSSBpbXBsaW1lbnRhdGlvbiBzaG91bGQgY2FsbCBkb0NyZWF0ZVJlZ2lzdHJ5IGF0IHRoZQotCSAqIGFwcHJvcHJpYXRlIHRpbWUuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcmVhdGVSZWdpc3RyeShmaW5hbCBCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IEpvYi5nZXRKb2JNYW5hZ2VyKCk7Ci0JCUlTY2hlZHVsaW5nUnVsZSBidWlsZFJ1bGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5idWlsZFJ1bGUoKTsKLQkJYm9vbGVhbiBnb3RSdWxlTG9jYWxseSA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWpvYk1hbmFnZXIuYmVnaW5SdWxlKGJ1aWxkUnVsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCWdvdFJ1bGVMb2NhbGx5ID0gZmFsc2U7CS8vIFRoaXMgdGhyZWFkIGFscmVhZHkgaGFkIGEgcnVsZSwgYW5kIGl0IGNvbmZsaWN0ZWQgd2l0aCB0aGUgYnVpbGQgcnVsZSwgc28gd2UgbmVlZCB0byBzcGF3biBvZmYuCi0JCQl9Ci0JCQlpZiAoZ290UnVsZUxvY2FsbHkpCi0JCQkJZG9DcmVhdGVSZWdpc3RyeShuYXR1cmUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGZpbmFsbHkgewotCQkJam9iTWFuYWdlci5lbmRSdWxlKGJ1aWxkUnVsZSk7CS8vIFdoZXRoZXIgd2UgZ290IHRoZSBydWxlIG9yIG5vdCwgd2UgbXVzdCBkbyBlbmRydWxlLgotCQl9Ci0JCQotCQlpZiAoIWdvdFJ1bGVMb2NhbGx5KSB7Ci0JCQkvLyBTcGF3biBvZmYgdG8gYSBqb2IgYW5kIHdhaXQgZm9yIGl0LiBIb3BlZnVsbHkgd2UgZG9uJ3QgaGF2ZSBhIGRlYWRsb2NrIHNvbWV3aGVyZS4KLQkJCUpvYiBkb0NyZWF0ZUpvYiA9IG5ldyBKb2IoQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXJfU3RhcnRCZWFuaW5mb1JlZ2lzdHJ5KSB7IAotCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlkb0NyZWF0ZVJlZ2lzdHJ5KG5hdHVyZSwgbW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCQlkb0NyZWF0ZUpvYi5zY2hlZHVsZSgpOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQl0cnkgewotCQkJCQlkb0NyZWF0ZUpvYi5qb2luKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCS8qCi0JICogRG8gdGhlIGNyZWF0aW9uLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBidWlsZCBydWxlIGhhcyBhbHJlYWR5IGJlZW4gZ2l2ZW4gdG8gdGhpcyB0aHJlYWQuCi0JICogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGJ1aWxkIHJ1bGUgYmUgZ2l2ZW4gdG8gdGhpcyB0aHJlYWQuIFRoaXMgaXMgc28gdGhhdCBhIGJ1aWxkIHdvbid0Ci0JICogc3RhcnQgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgc2FtZSByZWdpc3RyeSAod2hpY2ggaGFzIGhhcHBlbmVkIGluIHRoZSBwYXN0KSBhdCB0aGUgc2FtZSB0aW1lCi0JICogYSBkaWZmZXJlbnQgdGhyZWFkIHdhcyB0cnlpbmcgdG8gc3RhcnQgdGhlIHJlZ2lzdHJ5LiBZb3Ugd291bGQgZWl0aGVyIGhhdmUgYSBkZWFkbG9jaywgb3IgCi0JICogYSByYWNlIGFuZCBnZXQgdHdvIGRpZmZlcmVudCByZWdpc3RyaWVzIHN0YXJ0ZWQuCi0JICogCi0JICogVGhlIGJ1aWxkIHJ1bGUgYWxzbyBtZWFucyB0aGF0IGFsbCBiZWFuaW5mbyByZWdpc3RyeSBjcmVhdGlvbnMgd2lsbCBiZSBzZXJpYWxpemVkIGFuZCBoYXZlCi0JICogYSByYWNlIGNvbmRpdGlvbi4gVGhlIHVuZm9ydHVuYXRlIHBhcnQgaXMgdGhhdCB0d28gaW5kZXBlbmRlbnQgcHJvamVjdCdzIHJlZ2lzdHJpZXMgY2FuJ3QgYmUKLQkgKiBjcmVhdGVkIGF0IHNhbWUgdGltZS4gQnV0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB0aGUgYnVpbGQgcnVsZS4gV2UgY2FuJ3QgYWxsb3cgdGhlIGJ1aWxkcywgc28KLQkgKiB3ZSBuZWVkIHRvIHN0b3AgYWxsIHBhcmFsbGVsIGJlYW5pbmZvIHJlZ2lzdHJ5IGNyZWF0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlCi0JICogQHBhcmFtIHBtCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9DcmVhdGVSZWdpc3RyeShCZWFuaW5mb05hdHVyZSBuYXR1cmUsIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJcG0uYmVnaW5UYXNrKCIiLCAxMDApOwkvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQluYXR1cmUuY3JlYXRlUmVnaXN0cnkobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7CQotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvRE9NUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvRE9NUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODEzYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0RPTVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotLyoqCi0gKiBUaGUgaW50ZXJuYWwgY2xhc3MgZm9yIHJlYWRpbmcgZG9tIGVsZW1lbnRzLgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1jbGFzcyBET01SZWFkZXIgaW1wbGVtZW50cyBJUmVhZGVyIHsKLQkKLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSA/ICgoTm9kZSkgbm9kZSkuZ2V0Q2hpbGROb2RlcygpIDogbnVsbDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0TGVuZ3RoKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aChPYmplY3Qgbm9kZUxpc3QpIHsKLQkJcmV0dXJuIChub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSA/ICgoTm9kZUxpc3QpIG5vZGVMaXN0KS5nZXRMZW5ndGgoKSA6IDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0SXRlbShPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEl0ZW0oT2JqZWN0IG5vZGVMaXN0LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSA/ICgoTm9kZUxpc3QpIG5vZGVMaXN0KS5pdGVtKGluZGV4KSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjaXNOb2RlVHlwZUVsZW1lbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9kZVR5cGVFbGVtZW50KE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpID8gKChOb2RlKSBub2RlKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFIDogZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0Tm9kZU5hbWUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIChub2RlIGluc3RhbmNlb2YgTm9kZSkgPyAoKE5vZGUpIG5vZGUpLmdldE5vZGVOYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2dldEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgJiYgKChFbGVtZW50KSBlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyAoKEVsZW1lbnQpIGVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvSVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0lSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzODMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvSVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotLyoqCi0gKiBUaGlzIGlzIGludGVybmFsIGludGVyZmFjZSBmb3IgcmVhZGluZyBiZWFuaW5mb0NvbmZpZyBlaXRoZXIgdGhyb3VnaCBJQ29uZmlndXJhdGlvbkVsZW1lbnRzIG9yCi0gKiB3My5kb20uTm9kZXMuIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHJlYWRpbmcgdGhlIC5iZWFuaW5mb0NvbmZpZyB3ZSB3aWxsIGJlIHVzaW5nIE5vZGVzLCBidXQKLSAqIHdoZW4gcmVhZGluZyBjb25maWdzIGZyb20gcmVnaXN0ZXJlZCBleHRlbnNpb25zIHRoZXkgd2lsbCBiZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRzLgotICogQHZlcnNpb24gCTEuMAotICogVE9ETyBOZWVkIHRvIG1vdmUgdG8gY29yZSB3aGVuIHdlIG1ha2UgdGhpbmdzIEFQSS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVhZGVyIHsKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkcmVuKE9iamVjdCBub2RlKTsKLQlwdWJsaWMgaW50IGdldExlbmd0aChPYmplY3Qgbm9kZUxpc3QpOwotCXB1YmxpYyBPYmplY3QgZ2V0SXRlbShPYmplY3Qgbm9kZUxpc3QsIGludCBpbmRleCk7Ci0JcHVibGljIGJvb2xlYW4gaXNOb2RlVHlwZUVsZW1lbnQoT2JqZWN0IG5vZGUpOwkvLyBJcyB0aGlzIGFuIGVsZW1lbnQgdHlwZSBub2RlCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgbm9kZSk7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1NwZWNpYWxSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1NwZWNpYWxSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBlZjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9TcGVjaWFsUmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIEEgU3BlY2lhbCByZXNvdXJjZSBzZXQgdGhhdCBpcyB1c2VkIHRvIGxpbmsgdG9nZXRoZXIgdG8gdGhlIGJlYW5pbmZvCi0gKiBuYXR1cmUncyByZXNvdXJjZSBzZXQgYW5kIG1ha2VzIHN1cmUgdGhhdCBhbnkgcmVxdWVzdCBmb3IgYSBuZXcgImphdmE6Ly4uLiIKLSAqIEphdmFDbGFzcyBpcyByZWRpcmVjdGVkIHRvIHRoZSBiZWFuaW5mbyBuYXR1cmUncyByZXNvdXJjZSBzZXQuIE90aGVyd2lzZQotICogdGhlIGNsYXNzZXMgd2lsbCBiZSBhbGwgb3ZlciB0aGUgcGxhY2UgYW5kIG5vdCBhbGwgZ2F0aGVyZWQgaW4gb25lIHBsYWNlLgotICogCi0gKiAqcGFja2FnZSogcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lIHNob3VsZCBjcmVhdGUgb25lIG9mIHRoZXNlLiBUaGV5IGFyZQotICogcmV0dXJuZWQgYnkgdGhlIEJlYW5pbmZvTmF0dXJlLm5ld1Jlc291cmNlU2V0KCkgcmVxdWVzdC4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1jbGFzcyBTcGVjaWFsUmVzb3VyY2VTZXQgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTcGVjaWFsUmVzb3VyY2VTZXQuCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIFNwZWNpYWxSZXNvdXJjZVNldCgpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0U2hhcmVkQ2FjaGUoKS5zdG9wTGlzdGVuaW5nKHRoaXMpOwkvLyBXZSBkb24ndCBjYXJlIGFib3V0IGxpc3RlbmluZy4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9VSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1VJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTIyNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1VJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIHdoaWNoIGNhbiBhY3R1YWxseSByZWZlcmVuY2UgYW5kIHVzZSB0aGUgVUkgY2xhc3Nlcy4gSXQgd29uJ3QgYmUgbG9hZGVkIGV4Y2VwdCBpZiB1aSBwbHVnaW4gaXMgYXZhaWxhYmxlLgotICogCi0gKiBJdCB3aWxsIGNoZWNrIHRvIHNlZSBpZiBVSSBpcyBydW5uaW5nLCBhbmQgaWYgaXQgaXMgbm90LCB0aGVuIGxldCBzdXBlciBjbGFzcyBoYW5kbGUuIElmIGl0IGlzIHJ1bm5pbmcsIHRoZW4gaWYgdGhpcyBpcyB0aGUgVUkgdGhyZWFkLCBkbyBzcGVjaWFsCi0gKiBidXQgcnVuIGluIHVpLCBlbHNlIGlmIG5vdCB0aGVuIGxldCBzdXBlciBoYW5kbGUgaXQgbm9ybWFsbHkuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1jbGFzcyBVSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciBleHRlbmRzIENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5DcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIjcHJvY2Vzc0NyZWF0ZVJlZ2lzdHJ5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ3JlYXRlUmVnaXN0cnkoZmluYWwgQmVhbmluZm9OYXR1cmUgbmF0dXJlKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkKLQkJCQlzdXBlci5wcm9jZXNzQ3JlYXRlUmVnaXN0cnkobmF0dXJlKTsgLy8gV2UgYXJlIG5vdCBpbiB0aGUgVUkgdGhyZWFkLiBEbyBub3JtYWwuCi0JCQllbHNlIHsKLQkJCQlJUHJvZ3Jlc3NTZXJ2aWNlIHBzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCQlmaW5hbCBJU2NoZWR1bGluZ1J1bGUgYnVpbGRSdWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCk7Ci0JCQkJLy8gRmlyc3QgZmluZCBvdXQgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBidWlsZCBydWxlLiBJZiB3ZSBkbywgd2UgTVVTVCBydW4gaW4gdGhlIFVJIHRocmVhZC4gSGF2ZSBubyBvcHRpb24sIGNhbid0IHRyYW5zZmVyIHRoZQotCQkJCS8vIHJ1bGUgdG8gdGhlIHRocmVhZCBhbmQgdGhlbiBiYWNrIHRvIHVzIHdoZW4gZG9uZS4KLQkJCQkvLyBUaGlzIG1lYW5zIGEgYnVzeSBjdXJzb3IgaW5zdGVhZCBvZiBhIHBvc3NpYmxlIHByb2dyZXNzIGRpYWxvZyB0byBrZWVwIHRoZSBVSSBhY3RpdmUuIE9ubHkgcG9zc2libGUgZGVhZGxvY2sKLQkJCQkvLyBzaXR1YXRpb24gaXMgaWYgc29tZSBvdGhlciB0aHJlYWQgaGFzIHRoZSBidWlsZCBydWxlIChvdGhlciB0aGFuIHRoZSBidWlsZCkgYW5kIGlzIGRvaW5nIGFuIGFzeW5jRXhlYyBvcgotCQkJCS8vIGlzIHdhaXRpbmcgb24gc29tZXRoaW5nIGZyb20gdGhlIFVJIHRocmVhZC4KLQkJCQlmaW5hbCBJSm9iTWFuYWdlciBqb2JNYW5hZ2VyID0gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQkJCQlKb2IgY3VycmVudEpvYiA9IGpvYk1hbmFnZXIuY3VycmVudEpvYigpOwotCQkJCWlmIChjdXJyZW50Sm9iID09IG51bGwgfHwgY3VycmVudEpvYi5nZXRSdWxlKCkgPT0gbnVsbCB8fCAhY3VycmVudEpvYi5nZXRSdWxlKCkuY29udGFpbnMoYnVpbGRSdWxlKSkgewotCQkJCQkvLyBVSSBpcyBub3QgaW4gYSBqb2IsIG9yIGl0IGlzIGFuZCB0aGVyZSBpcyBubyBydWxlLCBvciB0aGVyZSBpcyBhIHJ1bGUgYW5kIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGJ1aWxkUnVsZS4KLQkJCQkJLy8gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gcnVuIGluIGFub3RoZXIgdGhyZWFkLiBUaGF0IGlzIHNvIHRoYXQgd2UgY2FuIHB1dCB1cCBhIHByb2dyZXNzIGRpYWxvZyBpZiBpdCB0YWtlcwotCQkJCQkvLyB0b28gbG9uZy4gCi0JCQkJCS8vIElmIG5vIHJ1bGUgdGhlbiB3ZSBjYW4ndCBydW4gaW4gVUkgYmVjYXVzZSBzb21lIG90aGVyIGpvYiBtYXkgaGF2ZSB0aGUgcnVsZSwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byB0ZXN0Ci0JCQkJCS8vIGZvciB0aGlzLiBTbyB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBVSSBlbnRpcmVseSB3YWl0aW5nIGZvciB0aGUgcnVsZSwgc28gd2UgY2FuIHVzZSBwcm9ncmVzcyBkaWFsb2cKLQkJCQkJLy8gZm9yIHRoaXMuIEFsc28gaWYgd2UgaGF2ZSBhIHJ1bGUgYW5kIGl0IGNvbmZsaWN0cyB3aXRoIGJ1aWxkIHJ1bGUgdGhlbiB3ZSBzaG91bGQgYWxzbyBnbyB0byBhbm90aGVyIHRocmVhZC4KLQkJCQkJLy8gYnVzeUN1cnNvcldoaWxlIHdpbGwgZG8gdGhpcy4gSXQgd2lsbCBydW4gdGhlIGNyZWF0ZSBpbiBhbm90aGVyIHRocmVhZCBidXQga2VlcCB0aGUgVUkgcmVzcG9uc2l2ZSB3aXRoCi0JCQkJCS8vIHByb2dyZXNzIGRpYWxvZyBhZnRlciBhICJsb25nIG9wZXJhdGlvbiIgdGltZW91dC4KLQkJCQkJdHJ5IHsKLQkJCQkJCXBzLmJ1c3lDdXJzb3JXaGlsZShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDApOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlqb2JNYW5hZ2VyLmJlZ2luUnVsZShidWlsZFJ1bGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCQkJCQlkb0NyZWF0ZVJlZ2lzdHJ5KG5hdHVyZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCWpvYk1hbmFnZXIuZW5kUnVsZShidWlsZFJ1bGUpOwotCQkJCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMikgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUyLmdldENhdXNlKCksIExldmVsLldBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gV2UgYXJlIGEgam9iIGluIHRoZSBVSSBhbmQgd2UgaGF2ZSBvciBjYW4gY29udGFpbiB0aGUgYnVpbGQgcnVsZS4gVGhlcmVmb3Igd2UgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZCBpdHNlbGYuIE90aGVyd2lzZQotCQkJCQkvLyB0aGVyZSB3aWxsIGJlIGEgZGVhZGxvY2sgYmVjYXVzZSB3ZSBoYXZlIHRoZSBidWlsZCBydWxlIGFuZCB0aGUgb3RoZXIgdGhyZWFkIHdvbid0IGJlIGFibGUgdG8gZ2V0IGl0LgotCQkJCQkvLyBOb3RlOiBUaGVyZSBpcyBQcm9ncmVzc1NlcnZpY2UucnVuSW5VSSgpIGJ1dCB0aGF0IGd1eSBpcyBjb21wbGljYXRlZCB3aXRoIHNvbWUgaW50ZXJhY3Rpb25zIEknbSBub3Qgc3VyZSBhYm91dC4gU2FmZXIgdG8gZG8gdGhpcy4KLQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlqb2JNYW5hZ2VyLmJlZ2luUnVsZShidWlsZFJ1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCQlkb0NyZWF0ZVJlZ2lzdHJ5KG5hdHVyZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJam9iTWFuYWdlci5lbmRSdWxlKGJ1aWxkUnVsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIucHJvY2Vzc0NyZWF0ZVJlZ2lzdHJ5KG5hdHVyZSk7IC8vIFdvcmtiZW5jaCBub3QgcnVubmluZywgZG8gZGVmYXVsdC4KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmNjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkCi0jCi0KLUlOVFJPU1BFQ1RfRkFJTEVEX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTU1RSBJbnRyb3NwZWN0aW9uIGZhaWxlZCBvbiBjbGFzcyAiezB9LiIgbXNnPSJ7MX0uIgotQmVhbmluZm9DbGFzc0FkYXB0ZXJfQ2xhc3NOb3RGb3VuZCAgICAgICAgICAgICAgID0gQ2xhc3Mgbm90IGZvdW5kCi1CZWFuaW5mb05hdHVyZV9JbnZhbGlkUHJvamVjdCAgICAgICAgICAgICAgICAgICAgPSBJbnZhbGlkIHByb2plY3QKLVVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyX1N0YXJ0QmVhbmluZm9SZWdpc3RyeSA9IFN0YXJ0IEJlYW5pbmZvIHJlZ2lzdHJ5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuSW5mb0NhY2hlQ29udHJvbGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MDRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuSW5mb0NhY2hlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLkNoYW5nZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UuaW1wbC5FT2JqZWN0VG9DaGFuZ2VzTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbi5DbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogQ29udHJvbGxlciBvZiB0aGUgQmVhbkluZm8gY2FjaGUuIFRoZXJlIGlzIG9uZSBwZXIgd29ya3NwYWNlIChpdCBpcyBhIHN0YXRpYykuCi0gKiAKLSAqIFRoZSBjYWNoZSBpcyBzdG9yZWQgb24gYSBwZXIgSVBhY2thZ2VGcmFnbWVudFJvb3QgYmFzaXMuIEVhY2ggcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqICByb290ezk5OX0vY2xhc3NuYW1lLnhtaQotICogIAotICogPC9wcmU+Ci0gKiAKLSAqICJyb290ezk5OX0iIHdpbGwgYmUgYSB1bmlndWUgbmFtZSAocm9vdCBhcHBlbmRlZCB3aXRoIGEgbnVtYmVyfSwgb25lIGZvciBlYWNoIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4gVGhlICJjbGFzc25hbWUueG1pIiB3aWxsIGJlIHRoZSBCZWFuSW5mbyBjYWNoZQotICogZm9yIGEgY2xhc3MgaW4gdGhlIHJvb3QuIEEgcm9vdCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lLCBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGNvbGxpc2lvbnMuCi0gKiA8cD4KLSAqIE5vdyByb290cyBjYW4gZWl0aGVyIGJlIGluIGEgcHJvamVjdCwgb3IgdGhleSBjYW4gYmUgYW4gZXh0ZXJuYWwgamFyICh3aGljaCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gcHJvamVjdHMpLgotICogPHA+Ci0gKiBOb3cgYWxsIHJvb3RzIGZvciBhIHByb2plY3Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHByb2plY3QncyB3b3JraW5nIGxvY2F0aW9uCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QjZ2V0V29ya2luZ0xvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpfXVuZGVyIHRoZSAiLmNhY2hlIiBkaXJlY3RvcnkuIEl0IHdpbGwgYmUgdGhpcyBmb3JtYXQgaW4gZWFjaAotICogcHJvamVjdCBsb2NhdGlvbiAodW5kZXIgdGhlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyBkaXJlY3RvcnkpOgotICogCi0gKiA8cHJlPgotICogCi0gKiAgLmluZGV4Ci0gKiAgcm9vdHs5OTl9Ly4uLgotICogIAotICogPC9wcmU+Ci0gKiAKLSAqIFRoZSAiLmluZGV4IiBmaWxlIHdpbGwgYmUgc3RvcmVkL2xvYWRlZCB0aHJvdWdoIGFuIE9iamVjdFN0cmVhbS4gSXQgd2lsbCBiZSBhIHtAbGluayBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JbmRleH0uIEl0IGlzIHRoZSBpbmRleCB0byBhbGwgb2YgdGhlCi0gKiByb290J3MgaW4gdGhlIGRpcmVjdG9yeS4KLSAqIDxwPgotICogQWxsIG9mIHRoZSBleHRlcm5hbCBqYXIgcm9vdHMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyBwbHVnaW4ncyBzdGF0ZSBsb2NhdGlvbgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNnZXRTdGF0ZUxvY2F0aW9uKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUpfXVuZGVyIHRoZSAiLmNhY2hlIiBkaXJlY3RvcnkuIFRoZSBmb3JtYXQgb2YgdGhpcyBkaXJlY3RvcnkKLSAqIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGVhY2ggcHJvamVjdC4gQW5kIHRoZSByb290cyB3aWxsIGJlIGZvciBlYWNoIHVuaXF1ZSBzaGFyZWQgZXh0ZXJuYWwgamFyIChzdWNoIGFzIHRoZSBkaWZmZXJudCBqcmUncyBydC5qYXJzKS4KLSAqIDxwPgotICogTm90ZTogVGhlcmUgYXJlIHNvIG1hbnkgcGxhY2VzIHdoZXJlIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQsIHNvIGl0IGlzIGRlY2lkZWQgdG8gc3luY2hyb25pemUgb25seSBvbiBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS4gSXQgd291bGQKLSAqIGJlIHRvbyBlYXN5IHRvIGdldCBhIGRlYWQtbG9jayBiZWNhdXNlIHRoZSBvcmRlciBvZiBzeW5jaHJvbml6YXRpb25zIGNhbid0IGJlIGVhc2lseSBjb250cm9sbGVkLiBTaW5jZSBlYWNoIHBpZWNlIG9mIHN5bmMgY29udHJvbCBpcyB2ZXJ5IHNob3J0Ci0gKiAoZXhjZXB0IGZvciBzYXZlIG9mIHRoZSBpbmRpY2VzLCBidXQgdGhhdCBpcyBvayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlbSBjaGFuZ2luZyB3aGlsZSBzYXZpbmcpIGl0IHNob3VsZG4ndCBibG9jayBhIGxvdC4gVGhlcmUgaXMgb25lIHBsYWNlIHdlCi0gKiB2aW9sYXRlIHRoaXMgYW5kIHRoYXQgaXMgd2UgZG8gYSBzeW5jIG9uIENsYXNzRW50cnkgaW5zdGFuY2Ugd2hlbiB3b3JraW5nIHdpdGggdGhlIHBlbmRpbmcuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgY2FjaGUgd3JpdGUKLSAqIGpvYiB0byBob2xkIHVwIGV2ZXJ5dGhpbmcgd2hpbGUgd3JpdGluZywgc28gd2Ugc3luYyBvbiB0aGUgZW50cnkgYmVpbmcgd3JpdHRlbiBpbnN0ZWFkLiBUaGVyZSB3ZSBtdXN0IGJlIHZlcnkgY2FyZWZ1bCB0aGF0IHdlIG5ldmVyIHRvCi0gKiBCZWFuSW5mb0NhY2hlQ29udHJvbGVyLklOU1RBTkNFIHN5bmMgYW5kIHRoZW4gYSBDbGFzc0VudHJ5IHN5bmMgYmVjYXVzZSB3ZSBjb3VsZCBkZWFkbG9jay4gVGhlIENFIGFjY2VzcyB1bmRlciB0aGUgY292ZXJzIG1heSBkbyBhIENFIHN5bmMgYW5kIHRoZW4KLSAqIGEgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0Ugc3luYy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gY2FjaGUgY29udHJvbGxlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyIElOU1RBTkNFID0gbmV3IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyKCk7Ci0KLQlwcml2YXRlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyKCkgewotCQkvLyBTdGFydCB1cCBzYXZlIHBhcnRpY2lwZW50LiBUaGlzIG9ubHkgaXMgdXNlZCBmb3Igc2F2aW5nIGluZGV4ZXMgYW5kIHNodXRkb3duLiBDdXJyZW50bHkgdGhlIHNhdmVkIHN0YXRlIGRlbHRhCi0JCS8vIGlzIG9mIG5vIGludGVyZXN0LiBJZiBhIHByb2plY3QgaXMgZGVsZXRlZCB3aGlsZSB3ZSB3ZXJlIG5vdCB1cCwgdGhlbiB0aGUgcHJvamVjdCBpbmRleCB3b3VsZCBiZSBnb25lLCBzbwotCQkvLyBvdXIgZGF0YSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ29uZSBmb3IgdGhlIHByb2plY3QuIAotCQkvLyBJZiBhIGNsYXNzIHdhcyBkZWxldGVkIHdoaWxlIHRoZSBwcm9qZWN0J3MgYmVhbmluZm8gd2FzIG5vdCBhY3RpdmUsIHRoZSBjYWNoZSB3aWxsIHN0aWxsIGNvbnRhaW4gaXQuIElmIHRoZSBjbGFzcyBldmVyIGNhbWUgYmFjayBpdAotCQkvLyB3b3VsZCBiZSBzdGFsZSBhbmQgc28gcmVjcmVhdGVkLiBJZiBpdCBuZXZlciBjb21lcyBiYWNrLCB1bnRpbCBhIGNsZWFuIGlzIGRvbmUsIGl0IHdvdWxkIGp1c3QgaGFuZyBhcm91bmQuCi0JCS8vIFRoZSBwcm9ibGVtIHdpdGggZGVsZXRlIGlzIGl0IGlzIGhhcmQgdG8gZGV0ZXJtaW5lIHRoYXQgdGhlIGZpbGUgaXMgYWN0dWFsbHkgYSBjbGFzcyBvZiBpbnRlcmVzdC4gVGhlIGphdmFtb2RlbAotCQkvLyBoYW5kbGVzIHRoYXQgZm9yIHVzIGJ1dCB3ZSB3b24ndCBoYXZlIGEgamF2YW1vZGVsIHRvIGhhbmRsZSB0aGlzIG9uIHN0YXJ0IHVwIHRvIHRlbGwgdXMgdGhlIGZpbGUgd2FzIGEgY2xhc3Mgb2YgaW50ZXJlc3QuIFNvCi0JCS8vIHdlJ2xsIHRha2UgdGhlIGhpdCBvZiBwb3NzaWJsZSBjYWNoZSBmb3Igbm9uLWV4aXN0YW50IGNsYXNzZXMuIEEgY2xlYW4gd2lsbCB0YWtlIGNhcmUgb2YgdGhpcy4KLQkJc2F2ZVBhcnRpY2lwYW50ID0gbmV3IFNhdmVQYXJ0aWNpcGFudCgpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFNhdmVQYXJ0aWNpcGFudChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKSwgc2F2ZVBhcnRpY2lwYW50KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBhIGNsZWFudXAgbGlzdGVuZXIgdG8gaGFuZGxlIGNsZWFuIHJlcXVlc3RzIGFuZCBwcm9qZWN0IGRlbGV0ZXMuIFdlIG5lZWQgdG8ga25vdyBhYm91dCBwcm9qZWN0IGRlbGV0ZXMgd2hpbGUKLQkJLy8gYWN0aXZlIGJlY2F1c2Ugd2UgbWF5IGhhdmUgYSBwcm9qZWN0IGluZGV4IGluIG1lbW9yeSBhbmQgdGhhdCBuZWVkcyB0byBiZSB0aHJvd24gYXdheS4KLQkJSkVNVXRpbFBsdWdpbi5hZGRDbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBjbGVhblByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQkJCS8vIEdldCByaWQgb2YgdGhlIHByb2plY3QgaW5kZXggYW5kIHRoZSBkYXRhIGZvciB0aGUgcHJvamVjdC4KLQkJCQlzeW5jaHJvbml6ZWQgKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUluZGV4IHByb2plY3RJbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJaWYgKHByb2plY3RJbmRleCAhPSBudWxsKSB7Ci0JCQkJCQkJcHJvamVjdC5zZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVksIG51bGwpOwotCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCWNsZWFuRGlyZWN0b3J5KGdldENhY2hlRGlyKHByb2plY3QpLnRvRmlsZSgpLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldE5hdHVyZShwcm9qZWN0KTsKLQkJCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQkJCW5hdHVyZS5wcm9qZWN0Q2xlYW5lZCgpOwotCQkJCQkJCUJlYW5pbmZvQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSkgRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKSwgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJCQlhZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUodHJ1ZSk7CS8vIEFsc28gY2xlYXIgdGhlIG92ZXJyaWRlcy4KLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gU2hvdWxkbid0IG9jY3VyLiAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIHZvaWQgY2xlYW5BbGwoKSB7Ci0JCQkJc3luY2hyb25pemVkKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXMpIHsKLQkJCQkJLy8gR2V0IE1BSU5fSU5ERVgsIG1hcmsgaXQgZGVhZCwgYW5kIHRoZW4gZGVsZXRlIGV2ZXJ5dGhpbmcgdW5kZXIgaXQuCi0JCQkJCWlmIChNQUlOX0lOREVYICE9IG51bGwpIHsKLQkJCQkJCU1BSU5fSU5ERVgubWFya0RlYWQoKTsKLQkJCQkJCU1BSU5fSU5ERVggPSBudWxsOwotCQkJCQkJY2xlYW5EaXJlY3RvcnkoZ2V0Q2FjaGVEaXIobnVsbCkudG9GaWxlKCksIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN1cGVyLmNsZWFuQWxsKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIFBSRV9DTE9TRSBiZWNhdXNlIFNhdmVQYXJ0aWNpcGVudCBwcm9qZWN0IHNhdmUgd2lsbCBoYW5kbGUgY2xvc2luZy4KLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEU6Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBkaXJlY3RvcnkgYmVjYXVzZSBFY2xpcHNlIHdpbGwgZ2V0IHJpZCBvZiBpdC4KLQkJCQkJCXN5bmNocm9uaXplZCAoQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIudGhpcykgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUluZGV4IHByb2plY3RJbmRleCA9IChJbmRleCkgZXZlbnQuZ2V0UmVzb3VyY2UoKS5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJCQlpZiAocHJvamVjdEluZGV4ICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIE5vIG5lZWQgdG8gcmVtb3ZlIGZyb20gdGhlIHByb2plY3QgYmVjYXVzZSB0aGUgcHJvamVjdCBpcyBnb2luZyBhd2F5IGFuZCB3aWxsIGNsZWFuIGl0c2VsZiB1cC4KLQkJCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIFNob3VsZG4ndCBvY2N1ci4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBGbG93IGludG8gUFJFX0NMT1NFIHRvIHJlbGVhc2UgdGhlIG5hdHVyZS4KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0U6Ci0JCQkJCQkvLyBBYm91dCB0byBjbG9zZSBvciBkZWxldGUsIHNvIHJlbGVhc2UgdGhlIG5hdHVyZSwgaWYgYW55LgotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldE5hdHVyZShwcm9qZWN0KTsKLQkJCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQkJCW5hdHVyZS5jbGVhbnVwKGZhbHNlLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCi0JCX0sIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlUGFydGljaXBhbnQgc2F2ZVBhcnRpY2lwYW50OwotCi0JLyoqCi0JICogQW4gaW5kZXggc3RydWN0dXJlIGZvciB0aGUgTWFpbiBhbmQgUHJvamVjdCBpbmRleGVzLiBBY2Nlc3MgdG8gdGhlIGluZGV4IGNvbnRlbnRzIGFuZCBtZXRob2RzIHNob3VsZCBzeW5jaHJvbml6ZSBvbiB0aGUgaW5kZXggaXRzZWxmLgotCSAqIDxwPgotCSAqIEdldHRpbmcgdG8gdGhlIGluZGV4IGluc3RhbmNlIHNob3VsZCBvbmx5IGJlIHRocm91Z2ggdGhlIDxjb2RlPmdldE1haW5JbmRleCgpPC9jb2RlPiBhbmQgPGNvZGU+Z2V0UHJvamVjdEluZGV4KElQcm9qZWN0KTwvY29kZT4gYWNjZXNzb3JzCi0JICogc28gdGhhdCBzeW5jaHJvbml6YXRpb24gYW5kIHNlcmlhbGl6YXRpb24gaXMgY29udHJvbGxlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEluZGV4IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA2ODY0NDI1NTY3TDsKLQotCQkvKgotCQkgKiBJcyB0aGlzIGEgZGlydHkgaW5kZXgsIGkuZS4gaXQgaGFzIGJlZW4gY2hhbmdlZCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JCSAqLwotCQl0cmFuc2llbnQgcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUFEID0gLTE7CS8vIFVzZWQgaW4gaGlnaFJvb3ROdW1iZXIgdG8gaW5kaWNhdGUgdGhlIGluZGV4IGlzIGRlYWQuCi0JCS8qKgotCQkgKiBUaGUgaGlnaGVzdCByb290IG51bWJlciB1c2VkLiBJdCBpcyBpbmNyZW1lbnRlZCBldmVyeXRpbWUgb25lIGlzIG5lZWRlZC4gSXQgZG9lc24ndCBldmVyIGRlY3JlYXNlIHRvIHJlY292ZXIgcmVtb3ZlZCByb290cy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBoaWdoUm9vdE51bWJlcjsKLQotCQkvKioKLQkJICogTWFwIG9mIHJvb3QgbmFtZXMgdG8gdGhlIHJvb3QgSW5kZXguIFRoZSBrZXkgaXMgYSB7QGxpbmsgSVBhdGh9LiBUaGUgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UgaWYgYSBwcm9qZWN0IHJvb3QsIG9yIGFuCi0JCSAqIGFic29sdXRlIGxvY2FsIHBhdGggdG8gdGhlIGFyY2hpdmUgaWYgaXQgaXMgYW4gZXh0ZXJuYWwgYXJjaGl2ZS4gSXQgaXMgdGhlIElQYXRoIHRvIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoZWl0aGVyIGEgZm9sZGVyIG9yIGEgamFyIGZpbGUpLgotCQkgKiA8cD4KLQkJICogVGhlIHZhbHVlIHdpbGwgYmUgYSB7QGxpbmsgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUm9vdEluZGV4fS4gVGhpcyBpcyB0aGUgaW5kZXggZm9yIHRoZSBjb250ZW50cyBvZiB0aGF0IHJvb3QuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXRyYW5zaWVudCBwdWJsaWMgTWFwIHJvb3RUb1Jvb3RJbmRleDsKLQotCQkvKioKLQkJICogQHBhcmFtIGRpcnR5Ci0JCSAqICAgICAgICAgICAgVGhlIGRpcnR5IHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCXRoaXMuZGlydHkgPSBkaXJ0eTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRpcnR5LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCXJldHVybiBkaXJ0eTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlciBpZiB0aGlzIGluZGV4IGlzIGRlYWQuIEl0IGlzIGRlYWQgaWYgYSBjbGVhbiBoYXMgb2NjdXJyZWQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgc29tZSBDbGFzc0VudHJ5J3Mgc3RpbGwKLQkJICogYXJvdW5kIChzdWNoIGFzIGluIHRoZSBwZW5kaW5nIHdyaXRlIHF1ZXVlKSB0aGF0IGFyZSBmb3IgY2xlYW5lZCByb290cy4gVGhpcyBpcyB1c2VkIHRvIHRlc3QgaWYgaXQgaGFzIGJlZW4gY2xlYW5lZC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RlYWQoKSB7Ci0JCQlyZXR1cm4gaGlnaFJvb3ROdW1iZXIgPT0gREVBRDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1hcmsgdGhlIGluZGV4IGFzIGRlYWQuCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIG1hcmtEZWFkKCkgewotCQkJaGlnaFJvb3ROdW1iZXIgPSBERUFEOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCW9zLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQkJLy8gTm93IHdyaXRlIG91dCB0aGUgcm9vdCB0byByb290IGluZGV4IG1hcC4gV2UgYXJlIG5vdCBzZXJpYWxpemluZyB0aGUgTWFwIGRpcmVjdGx5IHVzaW5nIG5vcm1hbCBNYXAgc2VyaWFsaXphdGlvbiBiZWNhdXNlCi0JCQkvLyB0aGUga2V5IG9mIHRoZSBtYXAgaXMgYW4gSVBhdGggKHdoaWNoIGlzIGEgUGF0aCB1bmRlciB0aGUgY292ZXJzKSBhbmQgUGF0aCBpcyBub3Qgc2VyaWFsaXphYmxlLgotCQkJb3Mud3JpdGVJbnQocm9vdFRvUm9vdEluZGV4LnNpemUoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIG1hcEl0ciA9IHJvb3RUb1Jvb3RJbmRleC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IG1hcEl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgbWFwSXRyLm5leHQoKTsKLQkJCQlvcy53cml0ZVVURigoKElQYXRoKSBlbnRyeS5nZXRLZXkoKSkudG9TdHJpbmcoKSk7Ci0JCQkJb3Mud3JpdGVPYmplY3QoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQlpbnQgc2l6ZSA9IGlzLnJlYWRJbnQoKTsKLQkJCXJvb3RUb1Jvb3RJbmRleCA9IG5ldyBIYXNoTWFwKHNpemUgPCAxMDAgPyAxMDAgOiBzaXplKTsKLQkJCXdoaWxlIChzaXplLS0gPiAwKSB7Ci0JCQkJcm9vdFRvUm9vdEluZGV4LnB1dChuZXcgUGF0aChpcy5yZWFkVVRGKCkpLCBpcy5yZWFkT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gaW5kZXggZm9yIGEgcm9vdC4gSXQgaGFzIGFuIGVudHJ5IGZvciBlYWNoIGNsYXNzIGluIHRoaXMgcm9vdC4gVGhlIGNsYXNzIGNhY2hlIGVudHJ5IGRlc2NyaWJlcyB0aGUgY2FjaGUsIHdoZXRoZXIgaXQgaXMgc3RhbGUsIHdoYXQgdGhlCi0JICogY3VycmVudCBtb2Qgc3RhbXAgaXMsIGV0Yy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvb3RJbmRleCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNjg2ODY3NDEwMUw7Ci0KLQkJdHJhbnNpZW50IHByaXZhdGUgSVBhdGggY2FjaGVQYXRoOyAvLyBBYnNvbHV0ZSBsb2NhbCBmaWxlc3lzdGVtIElQYXRoIHRvIHRoZSByb290IGNhY2hlIGRpcmVjdG9yeS4gQ29tcHV0ZWQgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBjaGFuZ2UKLQkJCQkJCQkJCQkgICAvLyBpZiB3b3Jrc3BhY2UgcmVsb2NhdGVkLgotCi0JCXByb3RlY3RlZCBNYXAgY2xhc3NOYW1lVG9DbGFzc0VudHJ5OyAvLyBNYXAgb2YgY2xhc3MgbmFtZXMgdG8gY2xhc3MgZW50cmllcy4KLQotCQlwcml2YXRlIFN0cmluZyByb290TmFtZTsgLy8gTmFtZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgaW4gdGhlIGNhY2hlIChlLmcuICJyb290MSIpLgotCi0JCXByb3RlY3RlZCBJbmRleCBpbmRleDsgLy8gSW5kZXggY29udGFpbmluZyB0aGlzIHJvb3QgaW5kZXguCi0KLQkJcHJvdGVjdGVkIFJvb3RJbmRleCgpIHsKLQkJfQotCi0JCXB1YmxpYyBSb290SW5kZXgoU3RyaW5nIHJvb3ROYW1lLCBJbmRleCBpbmRleCkgewotCQkJdGhpcy5yb290TmFtZSA9IHJvb3ROYW1lOwotCQkJY2xhc3NOYW1lVG9DbGFzc0VudHJ5ID0gbmV3IEhhc2hNYXAoMTAwKTsgLy8gV2hlbiBjcmVhdGVkIGJyYW5kIG5ldywgcHV0IGluIGEgbWFwLiBPdGhlcndpc2Ugb2JqZWN0IHN0cmVhbSB3aWxsIGNyZWF0ZSB0aGUgbWFwLgotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBpbmRleCB0aGF0IHBvaW50cyB0byB0aGlzIHJvb3QuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJSW5kZXggZ2V0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSByb290IGRpcmVjdG9yeSBuYW1lCi0JCSAqIAotCQkgKiBAcmV0dXJuIHJvb3RuYW1lCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5hbWUoKSB7Ci0JCQlyZXR1cm4gcm9vdE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0IHRoaXMgUm9vdEluZGV4IChhbmQgdGhlIGNvbnRhaW5pbmcgSW5kZXgpIGFzIGJlaW5nIGRpcnR5IGFuZCBpbiBuZWVkIG9mIHNhdmluZy4KLQkJICogCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERpcnR5KCkgewotCQkJaW5kZXguc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXR1cCBmb3IgaW5kZXguIEl0IHdpbGwgaW5pdGlhbGl6ZSB0aGUgcGF0aC4gT25jZSBzZXQgaXQgd29uJ3Qgc2V0IGl0IGFnYWluLiBUaGlzIHdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIGNhY2hlIGNvbnRyb2xsZXIKLQkJICogYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBpZiBpdCB3YXMgbGF6aWx5IGNyZWF0ZWQgb3Igd2FzIGJyb3VnaHQgaW4gZnJvbSBmaWxlLiBXaGVuIGJyb3VnaHQgaW4gZnJvbSBmaWxlIHRoZSBwYXRoIGlzIG5vdCBzZXQgYmVjYXVzZQotCQkgKiBpdCBzaG91bGQgYmUgcmVsb2NhdGFibGUgYW5kIHdlIGRvbid0IHdhbnQgYWJzb2x1dGUgcGF0aHMgb3V0IG9uIHRoZSBkaXNrIGNhY2hlcywgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FzdGUgdGltZSBjcmVhdGluZyB0aGUgcGF0aCBhdCBsb2FkCi0JCSAqIHRpbWUgYmVjYXVzZSBpdCBtYXkgbm90IGJlIG5lZWRlZCBmb3IgYSB3aGlsZS4gU28gaXQgd2lsbCBiZSBsYXppbHkgY3JlYXRlZC4gPHA+IElmIHRoZSBwcm9qZWN0IGlzIHNldCwgdGhlbiB0aGUgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvCi0JCSAqIHRoZSBwcm9qZWN0J3Mgd29ya2luZyBsb2NhdGlvbi4gSWYgcHJvamVjdCBpcyA8Y29kZT4gbnVsbCA8L2NvZGU+IHRoZW4gaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgQmVhbkluZm8gcGx1Z2luJ3Mgc3RhdGUgbG9jYXRpb24uIDxwPgotCQkgKiBUaGlzIGlzIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjcmVhdG9yIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlciBjbGFzcykgc2hvdWxkIHNldCB0aGlzIHVwLgotCQkgKiAKLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXR1cEluZGV4KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmIChnZXRDYWNoZVBhdGgoKSA9PSBudWxsKQotCQkJCWNhY2hlUGF0aCA9IGdldENhY2hlRGlyKHByb2plY3QpLmFwcGVuZChyb290TmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSByb290LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgSVBhdGggZ2V0Q2FjaGVQYXRoKCkgewotCQkJcmV0dXJuIGNhY2hlUGF0aDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgcm9vdCBmb3IgYSBhcmNoaXZlIG9yIGEgZm9sZGVyLgotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhcmNoaXZlIGZvciBhIHJvb3QuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhcmNoaXZlIGZvciBhIGZvbGRlci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcmNoaXZlUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEEgcm9vdCBpbmRleCB0aGF0IGlzIGZvciBhbiBhcmNoaXZlLCBlaXRoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwuIEl0IGNvbnRhaW5zIHRoZSBhcmNoaXZlJ3MgbW9kaWZpY2F0aW9uIHN0YW1wLiBFYWNoIGNsYXNzIGNhY2hlIGVudHJ5IHdpbGwKLQkgKiBoYXZlIHRoaXMgc2FtZSBtb2RpZmljYXRpb24gc3RhbXAuIElmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdGhlbiBhbGwgb2YgdGhlIGNsYXNzIGNhY2hlIGVudHJpZXMgd2lsbCBiZSByZW1vdmVkIGJlY2F1c2UgdGhleSBhcmUgYWxsIHBvc3NpYmx5Ci0JICogc3RhbGUuIE5vIHdheSB0byBrbm93IHdoaWNoIG1heSBiZSBzdGFsZSBhbmQgd2hpY2ggbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXJjaGl2ZVJvb3RJbmRleCBleHRlbmRzIFJvb3RJbmRleCB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNjg2ODY3NDQ0TDsKLQotCQlwcml2YXRlIGxvbmcgYXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wOwotCi0JCS8qCi0JCSAqIEZvciBzZXJpYWxpemVyIHRvIGNhbGwuCi0JCSAqLwotCQlwcm90ZWN0ZWQgQXJjaGl2ZVJvb3RJbmRleCgpIHsKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlUm9vdEluZGV4KFN0cmluZyByb290TmFtZSwgbG9uZyBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAsIEluZGV4IGluZGV4KSB7Ci0JCQlzdXBlcihyb290TmFtZSwgaW5kZXgpOwotCQkJdGhpcy5hcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAgPSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLlJvb3RJbmRleCNpc0FyY2hpdmVSb290KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZVJvb3QoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGNoYW5nZSBpdC4KLQkJICogCi0JCSAqIEBwYXJhbSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAgVGhlIGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcCB0byBzZXQuCi0JCSAqIAotCQkgKiBAc2VlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyI01PRElGSUNBVElPTl9TVEFNUF9TVEFMRQotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0QXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKGxvbmcgYXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQl0aGlzLmFyY2hpdmVNb2RpZmljYXRpb25TdGFtcCA9IGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcDsKLQkJCXNldERpcnR5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLgotCQkgKiAKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAuCi0JCSAqIEBzZWUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIjTU9ESUZJQ0FUSU9OX1NUQU1QX1NUQUxFCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0QXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSByb290IGluZGV4IGZvciBhIGZvbGRlciAod2hpY2ggd2lsbCBiZSBpbiB0aGUgd29ya3NwYWNlKS4gRWFjaCBjbGFzcyBjYWNoZSBlbnRyeSBjYW4gaGF2ZSBhIGRpZmZlcmVudCBtb2RpZmljYXRpb24gc3RhbXAgd2l0aCBhCi0JICogZm9sZGVyIHJvb3QgaW5kZXguCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGb2xkZXJSb290SW5kZXggZXh0ZW5kcyBSb290SW5kZXggewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDY4Njg2NzQ5MjJMOwotCi0JCS8qCi0JCSAqIEZvciBzZXJpYWxpemF0aW9uLgotCQkgKi8KLQkJcHJvdGVjdGVkIEZvbGRlclJvb3RJbmRleCgpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcm9vdE5hbWUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIEZvbGRlclJvb3RJbmRleChTdHJpbmcgcm9vdE5hbWUsIEluZGV4IGluZGV4KSB7Ci0JCQlzdXBlcihyb290TmFtZSwgaW5kZXgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuSW5mb0NhY2hlQ29udHJvbGxlci5Sb290SW5kZXgjaXNBcmNoaXZlUm9vdCgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmVSb290KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gaW5kaXZpZHVhbCBjbGFzcyBlbnRyeSBmcm9tIHRoZSBjYWNoZS4gSXQgaGFzIGFuIGVudHJ5IGZvciBlYWNoIGNsYXNzIGluIHRoZSByb290LiBUaGUgY2xhc3MgY2FjaGUgZW50cnkgZGVzY3JpYmVzIHRoZSBjYWNoZSwgd2hldGhlciBpdCBpcwotCSAqIHN0YWxlLCB3aGF0IHRoZSBjdXJyZW50IG1vZCBzdGFtcCBpcywgZXRjLgotCSAqIDxwPgotCSAqIFRoZXJlIGlzIGEgbWV0aG9kIHRvIGNhbGwgdG8gc2VlIGlmIGRlbGV0ZWQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGVudHJ5IGlzIGJlaW5nIGhlbGQgb24gdG8gYmVjYXVzZQotCSAqIDxjb2RlPmdldENsYXNzRW50cnkoSmF2YUNsYXNzKTwvY29kZT4gd2lsbCBuZXZlciByZXR1cm4gYSBkZWxldGVkIGVudHJ5LiBUaGVyZSBpcyBhIG1ldGhvZCB0byBnZXQgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgY3VycmVudCBjYWNoZQotCSAqIGVudHJ5LiBUaGlzIGlzIHRoZSB0aW1lIHN0YW1wIG9mIHRoZSBjb29yZXNwb25kaW5nIGNsYXNzIHJlc291cmNlIChvciBhcmNoaXZlIGZpbGUpIHRoYXQgdGhlIGNhY2hlIGZpbGUgd2FzIGNyZWF0ZWQgZnJvbS4gSWYgdGhlIHZhbHVlIGlzCi0JICogPGNvZGU+SVJlc291cmNlLk5VTExfU1RBTVA8L2NvZGU+LCB0aGVuIHRoZSBjYWNoZSBmaWxlIGlzIGtub3duIHRvIGJlIHN0YWxlLiBPdGhlcndpc2UgaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiBhIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiBhCi0JICogc3VwZXIgY2xhc3MgdGhlbiB0aGUgY2FjaGUgZmlsZSBpcyBzdGFsZS4KLQkgKiAKLQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkgKiBAc2VlIENsYXNzRW50cnkjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqIEBzZWUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIjZ2V0Q2xhc3NFbnRyeShKYXZhQ2xhc3MpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc0VudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA2ODY4Njc0MzMzTDsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVMRVRFRF9NT0RJRklDQVRJT05fU1RBTVAgPSBMb25nLk1JTl9WQUxVRTsgLy8gVGhpcyBmbGFnIHdvbid0IGJlIHNlZW4gZXh0ZXJuYWxseS4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW50cnkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGhhcyBiZWVuIGRlbGV0ZWQgZm9yIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGhvbGRpbmcgYSBDRS4KLQkJCi0JCS8qKgotCQkgKiBDaGVjayBhZ2FpbnN0IHRoZSBzdXBlciBtb2RpZmljYXRpb24gc3RhbXAgYW5kIHRoZSBpbnRlcmZhY2Ugc3RhbXBzIHRvIHNlZSBpZiB0aGV5IHdlcmUgc2V0Ci0JCSAqIGJ5IHVuZGVmaW5lZCBzdXBlciBjbGFzcyBvciBpbnRlcmZhY2UgYXQgY2FjaGUgY3JlYXRpb24gdGltZS4gCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTVVBFUl9VTkRFRklORURfTU9ESUZJQ0FUSU9OX1NUQU1QID0gTG9uZy5NSU5fVkFMVUUrMTsJCi0KLQkJcHJpdmF0ZSBsb25nIG1vZGlmaWNhdGlvblN0YW1wOwotCQlwcml2YXRlIGxvbmcgc3VwZXJNb2RpZmljYXRpb25TdGFtcDsJLy8gU3RhbXAgb2Ygc3VwZXJjbGFzcywgaWYgYW55LCBhdCB0aW1lIG9mIGNhY2hlIGNyZWF0aW9uLgotCQlwcml2YXRlIFN0cmluZ1tdIGludGVyZmFjZU5hbWVzOwkvLyBJbnRlcmZhY2VzIG5hbWVzIChudWxsIGlmIG5vIGludGVyZmFjZXMpCi0JCXByaXZhdGUgbG9uZ1tdIGludGVyZmFjZU1vZGljYXRpb25TdGFtcHM7CS8vIE1vZGlmaWNhdGlvbiBzdGFtcHMgb2YgaW50ZXJmYWNlcywgaWYgYW55LiAobnVsbCBpZiBubyBpbnRlcmZhY2VzKS4KLQkJcHJpdmF0ZSB0cmFuc2llbnQgUmVzb3VyY2UgcGVuZGluZ1Jlc291cmNlOwkvLyBSZXNvdXJjZSBpcyB3YWl0aW5nIHRvIGJlIHNhdmVkLCBidXQgdGhlIHRpbWVzdGFtcHMgYXJlIGZvciB0aGlzIHBlbmRpbmcgcmVzb3VyY2Ugc28gdGhhdCB3ZSBrbm93IHdoYXQgaXQgd2lsbCBiZSBhaGVhZCBvZiB0aW1lLiBBdCB0aGlzIHBvaW50IHRoZSBjbGFzcyB3aWxsIGJlIGludHJvc3BlY3RlZC4gCi0KLQkJcHJpdmF0ZSBSb290SW5kZXggcm9vdEluZGV4OyAvLyBUaGUgcm9vdCBpbmRleCB0aGlzIGNsYXNzIGVudHJ5IGlzIGluLCBzbyB0aGF0IGFueSBjaGFuZ2VzIGNhbiBtYXJrIHRoZSBlbnRyeSBhcyBkaXJ0eS4KLQotCQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7IC8vIFRoZSBjbGFzc25hbWUgZm9yIHRoaXMgZW50cnkuCi0JCQotCQlwcml2YXRlIGJvb2xlYW4gc2F2ZU9wZXJhdGlvbnM7CS8vIEZsYWcgZm9yIHNhdmluZyBvcGVyYXRpb25zLiBPbmNlIHRoaXMgaXMgc2V0LCBpdCB3aWxsIGNvbnRpbnVlIHRvIHNhdmUgb3BlcmF0aW9ucyBpbiB0aGUgY2FjaGUgaW4gYWRkaXRpb24gdG8gZXZlcnl0aGluZyBlbHNlLgotCi0JCXByaXZhdGUgbG9uZyBjb25maWd1cmF0aW9uTW9kaWZpY2F0aW9uU3RhbXA7CS8vIE1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgRWNsaXBzZSBjb25maWd1cmF0aW9uLiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGUgb2Ygb3ZlcnJpZGUgZmlsZXMgaXMgb3V0IG9mIGRhdGUgZHVlIHRvIGEgY29uZmlnIGNoYW5nZS4KLQkJcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHM7CS8vIEZsYWcgdGhhdCB0aGVyZSBpcyBhbiBvdmVycmlkZSBjYWNoZSB0byBsb2FkLiBUaGlzIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGNvbmZpZyBtb2Qgc3RhbXAgYmVjYXVzZSBpdCBzaW1wbHkgbWVhbnMgdGhhdCBvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRoZXJlIGlzIG5vIG92ZXJyaWRlIGNhY2hlLgotCQlwcml2YXRlIHRyYW5zaWVudCBSZXNvdXJjZSBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZTsJLy8gT3ZlcnJpZGUgcmVzb3VyY2UgaXMgd2FpdGluZyB0byBiZSBzYXZlZC4KLQkJCi0JCXByb3RlY3RlZCBDbGFzc0VudHJ5KCkgewotCQl9Ci0KLQkJQ2xhc3NFbnRyeShSb290SW5kZXggcm9vdEluZGV4LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQl0aGlzLnNldFJvb3RJbmRleChyb290SW5kZXgpOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQltb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQkJcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5wdXQoY2xhc3NOYW1lLCB0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQuIFRoaXMgd2lsbCBuZXZlciBiZSBzZWVuIGluIGFuIGVudHJ5IHRoYXQgaXMgc3RpbGwgaW4gYW4gaW5kZXguIEl0IGlzIHVzZWQgZm9yIGVudHJpZXMgdGhhdCBoYXZlCi0JCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBpbmRleC4gSXQgaXMgZm9yIGNsYXNzZXMgKHN1Y2ggYXMgdGhlIEJlYW5JbmZvQ2xhc3NBZGFwdGVyKSB3aGljaCBhcmUgaG9sZGluZyBvbnRvIGEgY29weSBvZiBlbnRyeSB0byBsZXQgdGhlbSBrbm93LgotCQkgKiA8cD4KLQkJICogSG9sZGVycyBvZiBlbnRyaWVzIHNob3VsZCBjYWxsIGlzRGVsZXRlZCBpZiB0aGV5IGRvbid0IG5lZWQgdG8gZnVydGhlciBjaGVjayB0aGUgbW9kIHN0YW1wLiBFbHNlIHRoZXkgc2hvdWxkIGNhbGwgZ2V0TW9kaWZpY2F0aW9uU3RhbXAgYW5kCi0JCSAqIGNoZWNrIG9mIGRlbGV0ZWQsIHN0YWxlLCBvciBtb2Qgc3RhbXAuIFRoYXQgd291bGQgc2F2ZSBleHRyYSBzeW5jaHJvbml6YXRpb25zLiBJZiBlbnRyeSBpcyBkZWxldGVkIHRoZW4gaXQgc2hvdWxkIHRocm93IHRoZSBlbnRyeSBhd2F5LgotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50cnkgaGFzIGJlZW4gZGVsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHN0aWxsIHZhbGlkLgotCQkgKiAKLQkJICogQHNlZSBDbGFzc0VudHJ5I2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkJICogQHNlZSBDbGFzc0VudHJ5I2lzU3RhbGUoKQotCQkgKiBAc2VlIENsYXNzRW50cnkjREVMRVRFRF9NT0RJRklDQVRJT05fU1RBTVAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA9PSBERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUDsKLQkJfQotCi0JCS8qKgotCQkgKiBNYXJrIHRoZSBlbnRyeSBhcyBkZWxldGVkLiBJdCB3aWxsIGFsc28gYmUgcmVtb3ZlZCBmcm9tIHJvb3QgaW5kZXggaW4gdGhhdCBjYXNlLgotCQkgKiA8cD4KLQkJICogTm90ZTogSXQgaXMgcHVibGljIG9ubHkgc28gdGhhdCBCZWFuSW5mb0NsYXNzQWRhcHRlciBjYW4gYWNjZXNzIGl0LiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhbnlvbmUgZWxzZSBvdXRzaWRlIG9mIEJlYW5JbmZvLgotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtEZWxldGVkKCkgewotCQkJaWYgKCFpc0RlbGV0ZWQoKSkgewotCQkJCWdldFJvb3RJbmRleCgpLmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5yZW1vdmUoY2xhc3NOYW1lKTsKLQkJCQlzZXRNb2RpZmljYXRpb25TdGFtcChERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCk7IC8vIEFsc28gbWFya3MgaW5kZXggYXMgZGlydHkuCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGlzIHN0YWxlIG9yIG5vdC4gVGhpcyBvcnRob2dhbmFsIHRvIGlzRGVsZXRlZC4gaXNEZWxldGVkIHdpbGwgbm90IGJlIHRydWUgaWYgaXNTdGFsZSBhbmQgaXNTdGFsZSB3aWxsIG5vdCBiZSB0cnVlCi0JCSAqIGlmIGlzRGVsZXRlZC4gTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgZ2V0TW9kaWZpY2F0aW9uU3RhbXAgYW5kIGNoZWNrIHRoZSB2YWx1ZSBmb3IgSVJlc291cmNlLk5VTExfU1RBTVAgYW5kIG90aGVyIHZhbHVlcyB0byBicmluZyBpdCBkb3duCi0JCSAqIHRvIG9ubHkgb25lIHN5bmNocm9uaXplZCBjYWxsIHRvIENFLCBidXQgaWYgb25seSBuZWVkaW5nIHRvIGtub3cgaWYgc3RhbGUsIHlvdSBjYW4gdXNlIHRoaXMuCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICogQHNlZSBJUmVzb3VyY2UjTlVMTF9TVEFNUAotCQkgKiBAc2VlIENsYXNzRW50cnkjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcC4gRm9yIHRob3NlIGhvbGRpbmcgb250byBhbiBlbnRyeSwgYW5kIHRoZXkgbmVlZCB0byBrbm93IG1vcmUgdGhhbiBpZiBqdXN0IGRlbGV0ZWQsIHRoZW4gdGhleSBzaG91bGQganVzdCB0aGUKLQkJICogcmV0dXJuIHZhbHVlIGZyb20gZ2V0TW9kaWZpY2F0aW9uU3RhbXAuIEVsc2UgdGhleSBzaG91bGQgdXNlIGlzRGVsZXRlZCBvciBpc1N0YWxlLgotCQkgKiAKLQkJICogQHJldHVybiBtb2RpZmljYXRpb24gc3RhbXAsIG9yIHtAbGluayBJUmVzb3VyY2UjTlVMTF9TVEFNUH1pZiBzdGFsZSBvciBub3QgeWV0IGNyZWF0ZWQsIG9yIHtAbGluayBDbGFzc0VudHJ5I0RFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QfQotCQkgKiAgICAgICAgIGlmIGRlbGV0ZWQuCi0JCSAqIAotCQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkJICogQHNlZSBDbGFzc0VudHJ5I2lzU3RhbGUoKQotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3VwZXIgbW9kaWZpY2F0aW9uIHN0YW1wLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRTdXBlck1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIHN1cGVyTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGludGVyZmFjZSBuYW1lcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbnRlcmZhY2UgbmFtZXMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKLQkJCXJldHVybiBpbnRlcmZhY2VOYW1lczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGludGVyZmFjZSBtb2RpZmljYXRpb24gc3RhbXBzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGludGVyZmFjZXMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nW10gZ2V0SW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKCkgewotCQkJcmV0dXJuIGludGVyZmFjZU1vZGljYXRpb25TdGFtcHM7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIHNldCBpdC4gQHBhcmFtIG1vZGlmaWNhdGlvblN0YW1wCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJaWYgKHRoaXMubW9kaWZpY2F0aW9uU3RhbXAgIT0gbW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCQl0aGlzLm1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJZ2V0Um9vdEluZGV4KCkuc2V0RGlydHkoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBbnN3ZXIgd2hldGhlciBvcGVyYXRpb25zIGFyZSBhbHNvIHN0b3JlZCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2xhc3MuIEJ5IGRlZmF1bHQgdGhleSBhcmUgbm90LiBPbmNlIHR1cm5lZCBvbiB0aGV5Ci0JCSAqIHdpbGwgYWx3YXlzIGJlIHN0b3JlZCBmb3IgdGhpcyBjbGFzcyB1bnRpbCB0aGUgY2xhc3MgaXMgZGVsZXRlZC4KLQkJICogCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb3BlcmF0aW9ucyBhcmUgY2FjaGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBhcmUgbm90IGNhY2hlZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzT3BlcmF0aW9uc1N0b3JlZCgpIHsKLQkJCXJldHVybiBzYXZlT3BlcmF0aW9uczsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBvcGVyYXRpb25zIHN0b3JlZCBmbGFnLgotCQkgKiBAcGFyYW0gc3RvcmVPcGVyYXRpb25zCi0JCSAqIAotCQkgKiBAc2VlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnkjaXNPcGVyYXRpb25zU3RvcmVkKCkKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldE9wZXJhdGlvbnNTdG9yZWQoYm9vbGVhbiBzdG9yZU9wZXJhdGlvbnMpIHsKLQkJCXNhdmVPcGVyYXRpb25zID0gc3RvcmVPcGVyYXRpb25zOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBjb25maWd1cmF0aW9uIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgbGFzdCBzYXZlZCBvdmVycmlkZSBjYWNoZS4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKiAKLQkJICogU2V0IHRoZSBjb25maWd1cmF0aW9uIG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKGxvbmcgY29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcCA9IGNvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcDsKLQkJCWdldFJvb3RJbmRleCgpLnNldERpcnR5KCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBbnN3ZXIgd2hldGhlciB0aGVyZSBpcyBhbiBvdmVycmlkZSBjYWNoZSBhdmFpbGFibGUuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHMoKSB7Ci0JCQlyZXR1cm4gb3ZlcnJpZGVDYWNoZUV4aXN0czsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBvdmVycmlkZSBjYWNoZSBleGlzdHMgZmxhZy4KLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIEBwYXJhbSBvdmVycmlkZUNhY2hlRXhpc3RzCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0T3ZlcnJpZGVDYWNoZUV4aXN0cyhib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHMpIHsKLQkJCXRoaXMub3ZlcnJpZGVDYWNoZUV4aXN0cyA9IG92ZXJyaWRlQ2FjaGVFeGlzdHM7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHBlbmRpbmcgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBlbmRpbmcuCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBwZW5kaW5nIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBwZW5kaW5nLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlIGdldFBlbmRpbmdSZXNvdXJjZSgpIHsKLQkJCXJldHVybiBwZW5kaW5nUmVzb3VyY2U7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNldCB0aGUgZW50cnkuIFRoZSBzZXF1ZW5jZSBnZXQsZG8gc29tZXRoaW5nLHNldCBtdXN0IGJlIGdyb3VwZWQgd2l0aGluIGEgc3luY2hyb25pemVkKENsYXNzRW50cnkpLiAKLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuIAotCQkgKiBAcGFyYW0gY2FjaGVSZXNvdXJjZSBUaGUgY2FjaGVSZXNvdXJjZSB0byBzZXQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0UGVuZGluZ1Jlc291cmNlKFJlc291cmNlIHBlbmRpbmdSZXNvdXJjZSkgewotCQkJdGhpcy5wZW5kaW5nUmVzb3VyY2UgPSBwZW5kaW5nUmVzb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBwZW5kaW5nIG92ZXJyaWRlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBwZW5kaW5nLgotCQkgKiAKLQkJICogQHJldHVybiB0aGUgcGVuZGluZyBvdmVycmlkZSByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgcGVuZGluZy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZSBnZXRQZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJCXJldHVybiBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZTsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBlbnRyeS4gVGhlIHNlcXVlbmNlIGdldCxkbyBzb21ldGhpbmcsc2V0IG11c3QgYmUgZ3JvdXBlZCB3aXRoaW4gYSBzeW5jaHJvbml6ZWQoQ2xhc3NFbnRyeSkuIAotCQkgKiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGFjY2VzcyBpdC4gCi0JCSAqIEBwYXJhbSBjYWNoZVJlc291cmNlIFRoZSBjYWNoZVJlc291cmNlIHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRQZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZShSZXNvdXJjZSBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSkgewotCQkJdGhpcy5wZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSA9IHBlbmRpbmdPdmVycmlkZVJlc291cmNlOwotCQl9Ci0KLQkJLyoKLQkJICogPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGFjY2VzcyBpdC4gQHBhcmFtIHJvb3RJbmRleCBUaGUgcm9vdEluZGV4IHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRSb290SW5kZXgoUm9vdEluZGV4IHJvb3RJbmRleCkgewotCQkJdGhpcy5yb290SW5kZXggPSByb290SW5kZXg7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LiBAcmV0dXJuIFJldHVybnMgdGhlIHJvb3RJbmRleC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJUm9vdEluZGV4IGdldFJvb3RJbmRleCgpIHsKLQkJCXJldHVybiByb290SW5kZXg7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcChsb25nIHN1cGVyTW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCXRoaXMuc3VwZXJNb2RpZmljYXRpb25TdGFtcCA9IHN1cGVyTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldEludGVyZmFjZU5hbWVzKFN0cmluZ1tdIGludGVyZmFjZU5hbWVzKSB7Ci0JCQl0aGlzLmludGVyZmFjZU5hbWVzID0gaW50ZXJmYWNlTmFtZXM7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcyhsb25nW10gaW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKSB7Ci0JCQl0aGlzLmludGVyZmFjZU1vZGljYXRpb25TdGFtcHMgPSBpbnRlcmZhY2VNb2RpZmljYXRpb25TdGFtcHM7Ci0JCX0KLQkJCi0JfQotCi0JLyoKLQkgKiBNYWluIGluZGV4IGZvciB0aGUgZXh0ZXJuYWwgamFycy4gVGhpcyB2YXJpYWJsZSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZXhjZXB0IHRocm91Z2ggdGhlIGdldE1haW5JbmRleCgpIGFjY2Vzc29yLiBUaGF0IGNvbnRyb2xzCi0JICogc3luY2hyb25pemF0aW9uIGFuZCByZXN0b3JhdGlvbiBhcyBuZWVkZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXggTUFJTl9JTkRFWDsKLQotCS8qCi0JICogS2V5IGludG8gdGhlIFByb2plY3QncyBzZXNzaW9uIGRhdGEgZm9yIHRoZSBwcm9qZWN0IGluZGV4LiBUaGUgUHJvamVjdCBpbmRleCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QncyBzZXNzaW9uIGRhdGEuIFRoYXQKLQkgKiB3YXkgd2hlbiB0aGUgcHJvamVjdCBpcyBjbG9zZWQgb3IgZGVsZXRlZCBpdCB3aWxsIGdvIGF3YXkuIAotCSAqIAotCSAqIFRoZSBwcm9qZWN0IGluZGV4ZXMgd2lsbCBiZSByZWFkIGluIGFzIG5lZWRlZCBvbiBhIHBlci1wcm9qZWN0IGJhc2lzLiBUaGlzIHZhcmlhYmxlIHNob3VsZCBub3QgYmUKLQkgKiByZWZlcmVuY2VkIGRpcmVjdGx5IGV4Y2VwdCB0aHJvdWdoIHRoZSBnZXRQcm9qZWN0SW5kZXgoSVByb2plY3QpIGFjY2Vzc29yLiBUaGF0IGNvbnRyb2xzIHN5bmNocm9uaXphdGlvbiBhbmQgcmVzdG9yYXRpb24gYXMgbmVlZGVkLgotCSAqIE9ubHkgZHVyaW5nIGNsZWFudXAgYW5kIHN1Y2ggd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeW91IG11c3QgdXNlIHN5bmModGhpcykuIEJlIGNhcmVmdWwgdG8ga2VlcCAKLQkgKiB0aGUgc3luYyBzbWFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST0pFQ1RfSU5ERVhfS0VZID0gbmV3IFF1YWxpZmllZE5hbWUoQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsICJwcm9qZWN0X2luZGV4Iik7CS8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogU3VmZml4IGZvciBjbGFzcyBjYWNoZSBmaWxlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQ0FDSEVfU1VGRklYID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0JLyoKLQkgKiBTdWZmaWMgZm9yIGNsYXNzIG92ZXJyaWRlIGNhY2hlIGZpbGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSUklERV9DQUNIRV9TVUZGSVggPSAiLm92ZXJyaWRlLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBjbGFzcyBlbnRyeSBmb3IgdGhlIEphdmFDbGFzcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY3VycmVudCBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gamNsYXNzCi0JICogQHJldHVybiBjbGFzcyBlbnRyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjdXJyZW50IGVudHJ5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBDbGFzc0VudHJ5IGdldENsYXNzRW50cnkoSmF2YUNsYXNzIGpjbGFzcykgewotCQlJVHlwZSB0eXBlID0gKElUeXBlKSBqY2xhc3MuZ2V0UmVmbGVjdGlvblR5cGUoKTsKLQkJUm9vdEluZGV4IHJvb3RJbmRleCA9IGdldFJvb3RJbmRleCh0eXBlKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gZ2V0Q2xhc3NFbnRyeShyb290SW5kZXgsIGNsYXNzTmFtZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEVudW1lcmF0aW9uIGZvciBuZXdDYWNoZTogU2lnbmFscyB0aGF0IHRoaXMgY2FjaGUgaXMgdGhlIFJlZmxlY3Rpb24gQ2FjaGUgd2l0aCBubyBvcGVyYXRpb25zIGluIGl0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFRkxFQ1RJT05fQ0FDSEUgPSAxOwotCS8qKgotCSAqIEVudW1lcmF0aW9uIGZvciBuZXdDYWNoZTogU2lnbmFscyB0aGF0IHRoaXMgY2FjaGUgaXMgdGhlIFJlZmxlY3Rpb24gQ2FjaGUgd2l0aCBvcGVyYXRpb25zIGluIGl0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFRkxFQ1RJT05fT1BFUkFUSU9OU19DQUNIRSA9IDI7Ci0JLyoqCi0JICogRW51bWVyYXRpb24gZm9yIG5ld0NhY2hlOiBTaWduYWxzIHRoYXQgdGhpcyBjYWNoZSBpcyB0aGUgT3ZlcnJpZGVzIGNhY2hlLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE9WRVJSSURFU19DQUNIRSA9IDM7Ci0JLyoqCi0JICogQSBuZXcgY2FjaGUgZW50cnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkLiBOZWVkIHRvIHdyaXRlIGl0IG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gamNsYXNzCi0JICogICAgICAgICAgICB0aGUgSmF2YUNsYXNzIHRoZSBjYWNoZSBpcyBmb3IuCi0JICogQHBhcmFtIGNhY2hlCi0JICogICAgICAgICAgICB0aGUgQ2hhbmdlRGVzY3JpcHRpb24gdG8gcHV0IG91dCBpZiBjYWNoZVR5cGUgaXMgUmVmbGVjdGlvbiB0eXBlcywgYSBMaXN0IGlmIG92ZXJyaWRlIGNhY2hlIHR5cGUuCi0JICogQHBhcmFtIGNhY2hlVHlwZQotCSAqICAgICAgICAgICAge0BsaW5rIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnkjUkVGTEVDVElPTl9DQUNIRX0gZm9yIHRoZSBlbnVtIHZhbHVlcy4KLQkgKiBAcmV0dXJuIG5ldyBjbGFzcyBlbnRyeSAob3Igb2xkIG9uZSBpZiBzYW1lIG9uZSkuIFNob3VsZCBhbHdheXMgcmVwbGFjZSBvbmUgYmVpbmcgaGVsZCBieSB0aGlzIG9uZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgY2FjaGUgY291bGQgbm90IGJlCi0JICogICAgICAgICB1cGRhdGVkIGZvciBzb21lIHJlYXNvbi4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQ2xhc3NFbnRyeSBuZXdDYWNoZShKYXZhQ2xhc3MgamNsYXNzLCBPYmplY3QgY2FjaGUsIGludCBjYWNoZVR5cGUpIHsKLQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpOwotCQkJU3RyaW5nIHR5cGUgPSBjYWNoZVR5cGUhPU9WRVJSSURFU19DQUNIRT8iQ2xhc3MiOiJPdmVycmlkZXMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChjYWNoZVR5cGUgPT0gT1ZFUlJJREVTX0NBQ0hFICYmIGNhY2hlID09IG51bGwpCi0JCQkJdHlwZSs9IiAgZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nKCJDcmVhdGluZyBjYWNoZSBmb3IgY2xhc3MgIitqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSsiIGNhY2hlIHR5cGU9Iit0eXBlLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gbnVsbDsKLQkJaWYgKGNhY2hlVHlwZSAhPSBPVkVSUklERVNfQ0FDSEUpIHsKLQkJCS8vIEZpcnN0IGdvIHRocm91Z2ggdGhlIGNkIGFuZCByZW1vdmUgYW55IGVtcHR5IGNoYW5nZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBjcmVhdGVkIHRoZSBmZWF0dXJlIGNoYW5nZSBiZWZvcmUgd2Uga25ldyB3aGF0IHdlbnQgaW50bwotCQkJLy8gaXQsIGFuZCBhdCB0aW1lcyBub3RoaW5nIGdvZXMgaW50byBpdC4KLQkJCWNkID0gKENoYW5nZURlc2NyaXB0aW9uKSBjYWNoZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNkLmdldE9iamVjdENoYW5nZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0VG9DaGFuZ2VzTWFwRW50cnlJbXBsIGZjRW50cnkgPSAoRU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5SW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCgoTGlzdCkgZmNFbnRyeS5nZXRWYWx1ZSgpKS5pc0VtcHR5KCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7IC8vIEVtcHR5IGNoYW5nZXMsIHJlbW92ZSBpdC4KLQkJCX0KLQkJfQotCQlJVHlwZSB0eXBlID0gKElUeXBlKSBqY2xhc3MuZ2V0UmVmbGVjdGlvblR5cGUoKTsKLQkJUm9vdEluZGV4IHJvb3RJbmRleCA9IGdldFJvb3RJbmRleCh0eXBlKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlDbGFzc0VudHJ5IGNlID0gZ2V0Q2xhc3NFbnRyeShyb290SW5kZXgsIGNsYXNzTmFtZSwgdHJ1ZSk7IC8vIENyZWF0ZSBpdCBpZiBub3QgZXhpc3RpbmcuCi0JCS8vIFN5bmMgb24gY2Ugc28gdGhhdCBvbmx5IGNhbiBjcmVhdGUgYSBjYWNoZSBmb3IgYSBjbGFzcyBhdCBhIHRpbWUgYW5kIHNvIHRoYXQgd3JpdGluZyAoaWYgb2NjdXJyaW5nIGF0IHRoZSBzYW1lIHRpbWUgZm9yIHRoZSBjbGFzcykgY2FuIGJlCi0JCS8vIGhlbGQgdXAuCi0JCS8vIHRoaXMgaXMgYSB2aW9sYXRpb24gb2YgdGhlIGFncmVlbWVudCB0byBvbmx5IHN5bmMgb24gVEhJUywgYnV0IGl0IGlzIG5lY2Vzc2FyeSBvciBlbHNlIHRoZSB3cml0ZSBqb2Igd291bGQgbG9jayBldmVyeXRoaW5nIG91dCB3aGlsZSBpdCBpcwotCQkvLyB3cml0aW5nLiBUaGlzIHdheSBpdCBvbmx5IGxvY2tzIG91dCBvbmUgY2xhc3MsIGlmIHRoZSBjbGFzcyBpcyBhdCB0aGUgc2FtZSB0aW1lLgotCQkvLyBXZSBzaG91bGRuJ3QgaGF2ZSBkZWFkbG9jayBiZWNhdXNlIGhlcmUgd2UgbG9jayBjZSBhbmQgdGhlbiBUSElTIChtYXliZSkuIFRoZSB3cml0ZSBqb2Igd2lsbCBsb2NrIGNlLCBhbmQgdGhlbiBsb2NrIFRISVMuIEV2ZXJ5d2hlcmUgZWxzZQotCQkvLyB3ZSBtdXN0Ci0JCS8vIGFsc28gZG8gbG9jayBjZSB0aGVuIFRISVMuIE11c3RuJ3QgZG8gb3RoZXIgd2F5IGFyb3VuZCBvciBwb3NzaWJpbGl0eSBvZiBkZWFkbG9jay4gQmUgY2FyZWZ1bCB0aGF0IGFueSBzeW5jaHJvbml6ZWQgbWV0aG9kcyBpbiB0aGlzIGNsYXNzCi0JCS8vIGRvCi0JCS8vIG5vdCBsb2NrIGFuIGV4aXN0aW5nIGNlLgotCQlSZXNvdXJjZVNldCBjYWNoZVJzZXQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGNlKSB7Ci0JCQlSZXNvdXJjZSBjcmVzOwotCQkJaWYgKGNhY2hlVHlwZSAhPSBPVkVSUklERVNfQ0FDSEUpIHsKLQkJCQljcmVzID0gY2UuZ2V0UGVuZGluZ1Jlc291cmNlKCk7Ci0JCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkvLyBXZSBoYXZlIGEgcGVuZGluZywgc28gY2xlYXIgYW5kIHJldXNlIHRoZSByZXNvdXJjZS4KLQkJCQkJY3Jlcy5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gTm90IGN1cnJlbnRseSB3cml0aW5nIG9yIHdhaXRpbmcgdG8gd3JpdGUsIHNvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZS4KLQkJCQkJY3JlcyA9IGpjbGFzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHJvb3RJbmRleC5nZXRDYWNoZVBhdGgoKS5hcHBlbmQoY2xhc3NOYW1lICsgQ0xBU1NfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSk7Ci0JCQkJfQotCQkJCWNhY2hlUnNldCA9IGNyZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQljZS5zZXRPcGVyYXRpb25zU3RvcmVkKGNhY2hlVHlwZSA9PSBSRUZMRUNUSU9OX09QRVJBVElPTlNfQ0FDSEUpOwotCQkJCWNlLnNldFBlbmRpbmdSZXNvdXJjZShjcmVzKTsKLQkJCQljcmVzLmdldENvbnRlbnRzKCkuYWRkKGNkKTsKLQkJCQkvLyBBcmNoaXZlcyB1c2Ugc2FtZSBtb2QgYXMgYXJjaGl2ZSAocmV0cmlldmUgZnJvbSByb290aW5kZXgpLCB3aGlsZSBub24tYXJjaGl2ZSB1c2UgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UncyBtb2Qgc3RhbXAuCi0JCQkJaWYgKHJvb3RJbmRleC5pc0FyY2hpdmVSb290KCkpCi0JCQkJCWNlLnNldE1vZGlmaWNhdGlvblN0YW1wKCgoQXJjaGl2ZVJvb3RJbmRleCkgcm9vdEluZGV4KS5nZXRBcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljZS5zZXRNb2RpZmljYXRpb25TdGFtcCh0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJY2UubWFya0RlbGV0ZWQoKTsgLy8gTWFyayBhcyBkZWxldGVkIGluIGNhc2UgdGhpcyB3YXMgYW4gZXhpc3RpbmcgdGhhdCBzb21lb25lIGlzIGhvbGRpbmcuCi0JCQkJCQlyZXR1cm4gbnVsbDsgLy8gQ291bGRuJ3QgZG8gaXQsIHRocm93IGNhY2hlIGVudHJ5IGF3YXkuIFRoaXMgYWN0dWFsbHkgc2hvdWxkIG5ldmVyIG9jY3VyLgotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBzdXBlcnMgaW5mby4gCi0JCQkJTGlzdCBzdXBlcnMgPSBqY2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCQlpZiAoIXN1cGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gV2UgYXNzdW1lIHRoYXQgdGhleSBhbGwgaGF2ZSBiZWVuIGludHJvc3BlY3RlZC4gVGhpcyB3YXMgZG9uZSBiYWNrIGluIG1haW4gaW50cm9zcGVjdGlvbi4gSWYgdGhleSBhcmUgaW50cm9zcGVjdGVkIHRoZXkgd2lsbCBoYXZlIGEgY2xhc3MgZW50cnkuCi0JCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IEJlYW5pbmZvQ2xhc3NBZGFwdGVyLmdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKChFT2JqZWN0KSBzdXBlcnMuZ2V0KDApKTsKLQkJCQkJQ2xhc3NFbnRyeSBzdXBlckNFID0gYmNhLmdldENsYXNzRW50cnkoKTsKLQkJCQkJaWYgKHN1cGVyQ0UgIT0gbnVsbCkKLQkJCQkJCWNlLnNldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoc3VwZXJDRS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKLQkJCQkJZWxzZQotCQkJCQkJY2Uuc2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcChDbGFzc0VudHJ5LlNVUEVSX1VOREVGSU5FRF9NT0RJRklDQVRJT05fU1RBTVApOwkvLyBObyBjbGFzc2VudHJ5IG1lYW5zIHVuZGVmaW5lZC4gU28gcHV0IHNvbWV0aGluZyBpbiBzbyB0aGF0IHdoZW4gaXQgYmVjb21lcyBkZWZpbmVkIHdlIHdpbGwga25vdy4KLQkJCQkJaWYoc3VwZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljZS5zZXRJbnRlcmZhY2VOYW1lcyhudWxsKTsKLQkJCQkJCWNlLnNldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcyhudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1tdIGludGVyTmFtZXMgPSBuZXcgU3RyaW5nW3N1cGVycy5zaXplKCktMV07Ci0JCQkJCQlsb25nW10gaW50ZXJNb2RzID0gbmV3IGxvbmdbaW50ZXJOYW1lcy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDEsIGluZHggPSAwOyBpbmR4IDwgaW50ZXJOYW1lcy5sZW5ndGg7IGkrKywgaW5keCsrKSB7Ci0JCQkJCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIHN1cGVycy5nZXQoaSk7Ci0JCQkJCQkJYmNhID0gQmVhbmluZm9DbGFzc0FkYXB0ZXIuZ2V0QmVhbmluZm9DbGFzc0FkYXB0ZXIoamF2YUNsYXNzKTsKLQkJCQkJCQliY2EuaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7CS8vIEZvcmNlIGludHJvc3BlY3Rpb24gdG8gZ2V0IGEgdmFsaWQgc3VwZXIgbW9kIHN0YW1wLgotCQkJCQkJCXN1cGVyQ0UgPSBiY2EuZ2V0Q2xhc3NFbnRyeSgpOwotCQkJCQkJCWludGVyTmFtZXNbaW5keF0gPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoc3VwZXJDRSAhPSBudWxsKQotCQkJCQkJCQlpbnRlck1vZHNbaW5keF0gPSBzdXBlckNFLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlpbnRlck1vZHNbaW5keF0gPSBDbGFzc0VudHJ5LlNVUEVSX1VOREVGSU5FRF9NT0RJRklDQVRJT05fU1RBTVA7CS8vIE5vIGNsYXNzZW50cnkgbWVhbnMgdW5kZWZpbmVkLiBTbyBwdXQgc29tZXRoaW5nIGluIHNvIHRoYXQgd2hlbiBpdCBiZWNvbWVzIGRlZmluZWQgd2Ugd2lsbCBrbm93LgotCQkJCQkJfQotCQkJCQkJY2Uuc2V0SW50ZXJmYWNlTmFtZXMoaW50ZXJOYW1lcyk7Ci0JCQkJCQljZS5zZXRJbnRlcmZhY2VNb2RpZmljYXRpb25TdGFtcHMoaW50ZXJNb2RzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNlLnNldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlLk5VTExfU1RBTVApOwotCQkJCQljZS5zZXRJbnRlcmZhY2VOYW1lcyhudWxsKTsKLQkJCQkJY2Uuc2V0SW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKG51bGwpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gV2UgYXJlIGFuIG92ZXJyaWRlIGNhY2hlLgotCQkJCWlmIChjYWNoZSAhPSBudWxsKSB7IAotCQkJCQljcmVzID0gY2UuZ2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkJLy8gV2UgaGF2ZSBhIHBlbmRpbmcsIHNvIGNsZWFyIGFuZCByZXVzZSB0aGUgcmVzb3VyY2UuCi0JCQkJCQljcmVzLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIE5vdCBjdXJyZW50bHkgd3JpdGluZyBvciB3YWl0aW5nIHRvIHdyaXRlLCBzbyBjcmVhdGUgYSBuZXcgcmVzb3VyY2UuCi0JCQkJCQljcmVzID0gamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoCi0JCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHJvb3RJbmRleC5nZXRDYWNoZVBhdGgoKS5hcHBlbmQoY2xhc3NOYW1lICsgT1ZFUlJJREVfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSk7Ci0JCQkJCX0KLQkJCQkJY2FjaGVSc2V0ID0gY3Jlcy5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQljcmVzLmdldENvbnRlbnRzKCkuYWRkQWxsKChMaXN0KSBjYWNoZSk7Ci0JCQkJCWNlLnNldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKGNyZXMpOwotCQkJCQljZS5zZXRPdmVycmlkZUNhY2hlRXhpc3RzKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNlLnNldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKG51bGwpOwotCQkJCQljZS5zZXRPdmVycmlkZUNhY2hlRXhpc3RzKGZhbHNlKTsKLQkJCQl9Ci0JCQkJY2Uuc2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKFBsYXRmb3JtLmdldFBsYXRmb3JtQWRtaW4oKS5nZXRTdGF0ZShmYWxzZSkuZ2V0VGltZVN0YW1wKCkpOwotCQkJfQotCQl9Ci0JCXF1ZXVlQ2xhc3NFbnRyeShjZSwgY2FjaGVSc2V0KTsgLy8gTm93IHF1ZXVlIGl0IHVwLgotCQlyZXR1cm4gY2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjYWNoZSByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGphdmEgY2xhc3MuCi0JICogPHA+Ci0JICogTk9URTogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gQUxXQVlTIHJlbW92ZSB0aGUgUmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IHdoZW4gZG9uZSB3aXRoIGl0LgotCSAqIAotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKiBAcGFyYW0gY2UgdGhlIGNsYXNzIGVudHJ5IGZvciB0aGUgamNsYXNzCi0JICogQHBhcmFtIHJlZmxlY3RDYWNoZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHRoZSByZWZsZWN0aW9uL2ludHJvc3BlY3Rpb24gY2FjaGUgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIG92ZXJyaWRlIGNhY2hlLgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBjYWNoZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHRoZXJlIChmb3Igc29tZSByZWFzb24pIG9yIGFuIGVycm9yIHRyeWluZyB0byBsb2FkIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRDYWNoZShKYXZhQ2xhc3MgamNsYXNzLCBDbGFzc0VudHJ5IGNlLCBib29sZWFuIHJlZmxlY3RDYWNoZSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gamNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCWlmIChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVmbGVjdENhY2hlPyJDbGFzcyI6Ik92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLmxvZygiTG9hZGluZyBjYWNoZSBmb3IgY2xhc3MgIitjbGFzc05hbWUrIiBjYWNoZSB0eXBlPSIrdHlwZSwgTGV2ZWwuRklORVIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChyZWZsZWN0Q2FjaGUpIHsKLQkJCWJvb2xlYW4gd2FpdEZvckpvYiA9IGZhbHNlOwotCQkJc3luY2hyb25pemVkIChjZSkgewotCQkJCWlmIChjZS5nZXRQZW5kaW5nUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGhhdmUgb25lIHBlbmRpbmcuIFNvIHdhaXQgdW50aWwgd3JpdGUgY2FjaGUgam9iIGlzIGRvbmUsIGFuZCB0aGVuIGxvYWQgaXQgaW4uCi0JCQkJCS8vIE5vdGU6IENhbid0IGp1c3QgY29weSB0aGUgcGVuZGluZyByZXNvdXJjZSBiZWNhdXNlIGl0IGhhcyByZWZlcmVuY2VzIHRvIEphdmFDbGFzc2VzCi0JCQkJCS8vIGFuZCB0aGVzZSBjb3VsZCBiZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0IChzaW5jZSB0aGlzIGNvdWxkIGJlIGEgd29ya3NwYWNlIHdpZGUgY2xhc3MpLgotCQkJCQkvLyBXZSB3b3VsZCBnZXQgdGhlIHdyb25nIGphdmEgY2xhc3NlcyB0aGVuIHdoZW4gd2UgYXBwbHkgaXQuIAotCQkJCQl3YWl0Rm9ySm9iID0gdHJ1ZTsKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiVXNpbmcgcGVuZGluZyBjbGFzcyBjYWNoZS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2FpdEZvckpvYikKLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7CQotCi0JCQl0cnkgewotCQkJCXJldHVybiBqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKGNlLmdldFJvb3RJbmRleCgpLmdldENhY2hlUGF0aCgpLmFwcGVuZCgKLQkJCQkJCQkJY2xhc3NOYW1lICsgQ0xBU1NfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWV0aGluZyBoYXBwZW5lZCBhbmQgY291bGRuJ3QgbG9hZCBpdC4KLQkJCQkvLyBUT0RPIC0gbmVlZCB0byByZW1vdmUgdGhlIExldmVsLklORk8gYXJnIHdoZW4gdGhlIGJlYW5pbmZvIGNhY2hlIGlzIHdvcmtpbmcgZHluYW1pY2FsbHkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHdhaXRGb3JKb2IgPSBmYWxzZTsKLQkJCXN5bmNocm9uaXplZCAoY2UpIHsKLQkJCQlpZiAoY2UuZ2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGhhdmUgb25lIHBlbmRpbmcuIFNvIHdhaXQgdW50aWwgd3JpdGUgY2FjaGUgam9iIGlzIGRvbmUsIGFuZCB0aGVuIGxvYWQgaXQgaW4uCi0JCQkJCS8vIE5vdGU6IENhbid0IGp1c3QgY29weSB0aGUgcGVuZGluZyByZXNvdXJjZSBiZWNhdXNlIGl0IGhhcyByZWZlcmVuY2VzIHRvIEphdmFDbGFzc2VzCi0JCQkJCS8vIGFuZCB0aGVzZSBjb3VsZCBiZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0IChzaW5jZSB0aGlzIGNvdWxkIGJlIGEgd29ya3NwYWNlIHdpZGUgY2xhc3MpLgotCQkJCQkvLyBXZSB3b3VsZCBnZXQgdGhlIHdyb25nIGphdmEgY2xhc3NlcyB0aGVuIHdoZW4gd2UgYXBwbHkgaXQuIAotCQkJCQl3YWl0Rm9ySm9iID0gdHJ1ZTsKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiVXNpbmcgcGVuZGluZyBvdmVycmlkZSBjYWNoZS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2FpdEZvckpvYikKLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7CQotCi0JCQl0cnkgewotCQkJCXJldHVybiBqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKGNlLmdldFJvb3RJbmRleCgpLmdldENhY2hlUGF0aCgpLmFwcGVuZCgKLQkJCQkJCQkJY2xhc3NOYW1lICsgT1ZFUlJJREVfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWV0aGluZyBoYXBwZW5lZCBhbmQgY291bGRuJ3QgbG9hZCBpdC4KLQkJCQkvLyBUT0RPIC0gbmVlZCB0byByZW1vdmUgdGhlIExldmVsLklORk8gYXJnIHdoZW4gdGhlIGJlYW5pbmZvIGNhY2hlIGlzIHdvcmtpbmcgZHluYW1pY2FsbHkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDbGFzc0VudHJ5IGdldENsYXNzRW50cnkoUm9vdEluZGV4IHJvb3RJbmRleCwgU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiBjcmVhdGVFbnRyeSkgewotCQlDbGFzc0VudHJ5IGNlID0gKENsYXNzRW50cnkpIHJvb3RJbmRleC5jbGFzc05hbWVUb0NsYXNzRW50cnkuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChjcmVhdGVFbnRyeSAmJiBjZSA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGNyZWF0ZSBvbmUuCi0JCQljZSA9IG5ldyBDbGFzc0VudHJ5KHJvb3RJbmRleCwgY2xhc3NOYW1lKTsKLQkJCS8vIERvbid0IGFjdHVhbGx5IG1hcmsgdGhlIHJvb3RJbmRleCBkaXJ0eSB1bnRpbCB0aGUgY2FjaGUgZm9yIGl0IGlzIGFjdHVhbGx5IHNhdmVkIG91dC4KLQkJfQotCQlyZXR1cm4gY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUFJFRklYID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEdldCB0aGUgcm9vdCBpbmRleCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gamF2YSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIFJvb3RJbmRleCBnZXRSb290SW5kZXgoSVR5cGUgdHlwZSkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSB0eXBlLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlpZiAoIXJvb3QuaXNFeHRlcm5hbCgpKSB7Ci0JCQkvLyBTbyBpdCBpcyBpbiBhIHByb2plY3QuIEdldCB0aGUgcHJvamVjdCBpbmRleC4KLQkJCXJldHVybiBnZXRSb290SW5kZXgocm9vdCwgcm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCBpcyBhbiBleHRlcm5hbCBqYXIgKGFyY2hpdmUpLCBzbyBuZWVkcyB0byBjb21lIGZyb20gbWFpbiBpbmRleCwgbm8gcHJvamVjdC4KLQkJCXJldHVybiBnZXRSb290SW5kZXgocm9vdCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgcm9vdCBpbmRleCBmb3IgdGhlIGdpdmVuIHJvb3QuIEEgUHJvamVjdCBpbmRleCBpZiBwcm9qZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIFJvb3RJbmRleCBnZXRSb290SW5kZXgoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgSVByb2plY3QgcHJvamVjdCkgewotCQlJbmRleCBpbmRleCA9IHByb2plY3QgIT0gbnVsbCA/IGdldFByb2plY3RJbmRleChwcm9qZWN0KSA6IGdldE1haW5JbmRleCgpOwotCQlJUGF0aCByb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOwotCQlSb290SW5kZXggcm9vdEluZGV4ID0gKFJvb3RJbmRleCkgaW5kZXgucm9vdFRvUm9vdEluZGV4LmdldChyb290UGF0aCk7Ci0JCWlmIChyb290SW5kZXggPT0gbnVsbCkgewotCQkJLy8gTmVlZCB0byBkbyBhIG5ldyByb290IHBhdGguCi0JCQlTdHJpbmcgcm9vdE5hbWUgPSBST09UX1BSRUZJWCArICgrK2luZGV4LmhpZ2hSb290TnVtYmVyKTsKLQkJCXJvb3RJbmRleCA9IHJvb3QuaXNBcmNoaXZlKCkgPyBjcmVhdGVBcmNoaXZlUm9vdEluZGV4KHJvb3QsIHJvb3ROYW1lLCBpbmRleCkgOiBuZXcgRm9sZGVyUm9vdEluZGV4KHJvb3ROYW1lLCBpbmRleCk7Ci0JCQlpbmRleC5yb290VG9Sb290SW5kZXgucHV0KHJvb3RQYXRoLCByb290SW5kZXgpOwotCQkJLy8gRG9uJ3Qgc2V0IGluZGV4IGRpcnR5IHVudGlsIHdlIGFjdHVhbGx5IHNhdmUgYSBjbGFzcyBjYWNoZSBmaWxlLiBVbnRpbCB0aGVuIGl0IG9ubHkgbmVlZHMgdG8gYmUgaW4gbWVtb3J5LgotCQl9Ci0JCXJvb3RJbmRleC5zZXR1cEluZGV4KHByb2plY3QpOyAvLyBTZXQgaXQgdXAsIG9yIG1heSBhbHJlYWR5IGJlIHNldCwgc28gaXQgd2lsbCBkbyBub3RoaW5nIGluIHRoYXQgY2FzZS4KLQkJcmV0dXJuIHJvb3RJbmRleDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhbiBhcmNoaXZlIHJvb3Qgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBudW1iZXIgYW5kIHJvb3QuCi0JICovCi0JcHJpdmF0ZSBSb290SW5kZXggY3JlYXRlQXJjaGl2ZVJvb3RJbmRleChJUGFja2FnZUZyYWdtZW50Um9vdCByb290QXJjaGl2ZSwgU3RyaW5nIHJvb3ROYW1lLCBJbmRleCBpbmRleCkgewotCQlsb25nIG1vZFN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCWlmIChyb290QXJjaGl2ZS5pc0V4dGVybmFsKCkpIHsKLQkJCW1vZFN0YW1wID0gcm9vdEFyY2hpdmUuZ2V0UGF0aCgpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQltb2RTdGFtcCA9IHJvb3RBcmNoaXZlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IEFyY2hpdmVSb290SW5kZXgocm9vdE5hbWUsIG1vZFN0YW1wLCBpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYRklMRU5BTUUgPSAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFRElSID0gIi5jYWNoZSI7IC8vIENhY2hlIGRpcmVjdG9yeSAoc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggYW55IGZ1dHVyZSBCZWFuSW5mbyBQbHVnaW4gc3BlY2lmaWMgZGF0YSBmaWxlcy4gLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBHZXQgdGhlIGNhY2hlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QgKG9yIGlmIHByb2plY3QgaXMgbnVsbCwgdGhlIG1haW4gcGx1Z2luIGNhY2hlIGRpcmVjdG9yeSkuCi0JICovCi0JLy8gVE9ETzogbWFrZSB0aGlzIG9uZSBwcml2YXRlCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDYWNoZURpcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvamVjdC5nZXRXb3JraW5nTG9jYXRpb24oQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpLmFwcGVuZChDQUNIRURJUik7Ci0JCWVsc2UKLQkJCXJldHVybiBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKENBQ0hFRElSKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgcHJvamVjdCBpbmRleC4gU3luY2hyb25pemVkIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkgYW5kIG5vdCBnZXQgcmFjZSBjb25kaXRpb25zLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIEluZGV4IGdldFByb2plY3RJbmRleChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJbmRleCBpbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJaWYgKGluZGV4ID09IG51bGwpIHsKLQkJCQkvLyBSZWFkIHRoZSBpbmRleCBpbi4KLQkJCQlGaWxlIGluZGV4RGlyRmlsZSA9IGdldENhY2hlRGlyKHByb2plY3QpLmFwcGVuZChJTkRFWEZJTEVOQU1FKS50b0ZpbGUoKTsKLQkJCQlpZiAoaW5kZXhEaXJGaWxlLmNhblJlYWQoKSkgewotCQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5kZXhEaXJGaWxlKSkpOwotCQkJCQkJaW5kZXggPSAoSW5kZXgpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJCX0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIG9rLiBJdCBzaW1wbHkgbWVhbnMgdGhlIGNhY2hlIGluZGV4IGlzIGF0IGEgZG93bmxldmVsIGZvcm1hdCBhbmQgbmVlZHMgdG8gYmUgcmVjb25zdHJ1Y3RlZC4KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChvaXMgIT0gbnVsbCkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5kZXggPT0gbnVsbCkgewotCQkJCQkvLyBEb2Vzbid0IHlldCBleGlzdCBvciBpdCBjb3VsZG4ndCBiZSByZWFkIGZvciBzb21lIHJlYXNvbiwgb3IgaXQgd2FzIGRvd25sZXZlbCBjYWNoZSBpbiB3aGljaCBjYXNlIHdlIGp1c3QgdGhyb3cgaXQgYXdheSBhbmQgY3JlYXRlCi0JCQkJCS8vIG5ldykuCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KCk7Ci0JCQkJCWluZGV4LmhpZ2hSb290TnVtYmVyID0gMDsKLQkJCQkJaW5kZXgucm9vdFRvUm9vdEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJCQl9Ci0KLQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgaW5kZXgpOyAvLyBXZSBlaXRoZXIgY3JlYXRlZCBhIG5ldyBvbmUsIG9yIHdlIHdlcmUgYWJsZSB0byBsb2FkIGl0LgotCQkJfQotCQkJcmV0dXJuIGluZGV4OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZG4ndCBvY2N1ciwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIG1haW4gaW5kZXguIFN5bmNocm9uaXplZCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5IGFuZCBub3QgZ2V0IHJhY2UgY29uZGl0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJbmRleCBnZXRNYWluSW5kZXgoKSB7Ci0JCWlmIChNQUlOX0lOREVYID09IG51bGwpIHsKLQkJCS8vIFJlYWQgdGhlIGluZGV4IGluLgotCQkJRmlsZSBpbmRleERpckZpbGUgPSBnZXRDYWNoZURpcihudWxsKS5hcHBlbmQoSU5ERVhGSUxFTkFNRSkudG9GaWxlKCk7Ci0JCQlpZiAoaW5kZXhEaXJGaWxlLmNhblJlYWQoKSkgewotCQkJCU9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5kZXhEaXJGaWxlKSkpOwotCQkJCQlNQUlOX0lOREVYID0gKEluZGV4KSBvaXMucmVhZE9iamVjdCgpOwotCQkJCX0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRoaXMgaXMgb2suIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgY2FjaGUgaW5kZXggaXMgYXQgYSBkb3dubGV2ZWwgZm9ybWF0IGFuZCBuZWVkcyB0byBiZSByZWNvbnN0cnVjdGVkLgotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKG9pcyAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoTUFJTl9JTkRFWCA9PSBudWxsKSB7Ci0JCQkJLy8gRG9lc24ndCB5ZXQgZXhpc3Qgb3IgaXQgY291bGRuJ3QgYmUgcmVhZCBmb3Igc29tZSByZWFzb24sIG9yIGl0IHdhcyBkb3dubGV2ZWwgY2FjaGUgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHRocm93IGl0IGF3YXkgYW5kIGNyZWF0ZQotCQkJCS8vIG5ldykuCi0JCQkJTUFJTl9JTkRFWCA9IG5ldyBJbmRleCgpOwotCQkJCU1BSU5fSU5ERVguaGlnaFJvb3ROdW1iZXIgPSAwOwotCQkJCU1BSU5fSU5ERVgucm9vdFRvUm9vdEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBNQUlOX0lOREVYOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tIFNhdmUgUGFydGljaXBhbnQgY29kZSAtLS0tLS0tLS0tLS0tLS0tLQotCi0JcHJvdGVjdGVkIGNsYXNzIFNhdmVQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTYXZlUGFydGljaXBhbnQgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNkb25lU2F2aW5nKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvbmVTYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNwcmVwYXJlVG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByZXBhcmVUb1NhdmUoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNyb2xsYmFjayhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByb2xsYmFjayhJU2F2ZUNvbnRleHQgY29udGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZVBhcnRpY2lwYW50I3NhdmluZyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWJvb2xlYW4gZnVsbHNhdmUgPSBmYWxzZTsKLQkJCXN3aXRjaCAoY29udGV4dC5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElTYXZlQ29udGV4dC5QUk9KRUNUX1NBVkU6Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsKLQkJCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCQkJLy8gV3JpdGUgdGhlIGluZGV4LiBUaGUgY2FjaGUgc2F2ZSBqb2Igd2lsbCBldmVudHVhbGx5IHJ1biBhbmQgYXQgdGhhdCBwb2ludCB3cml0ZSBvdXQgdGhlIHBlbmRpbmcgY2FjaGUgZmlsZXMgdG9vLgotCQkJCQkJLy8gVGhleSBkb24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBwcm9qZWN0IHNhdmUgaXMgY29tcGxldGUuCi0JCQkJCQlJbmRleCBwcm9qZWN0SW5kZXggPSAoSW5kZXgpIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KFBST0pFQ1RfSU5ERVhfS0VZKTsKLQkJCQkJCWlmIChwcm9qZWN0SW5kZXggIT0gbnVsbCAmJiBwcm9qZWN0SW5kZXguaXNEaXJ0eSgpKQotCQkJCQkJCWlmIChyZWNvbmNpbGVJbmRleERpcmVjdG9yeShwcm9qZWN0LCBwcm9qZWN0SW5kZXgpKQotCQkJCQkJCQl3cml0ZUluZGV4KHByb2plY3QsIHByb2plY3RJbmRleCk7Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IHdhcyBlbXB0eSwganVzdCBnZXQgcmlkIG9mIHRoZSBpbmRleC4gVGhlIGRpcmVjdG9yaWVzIGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFyZWQuCi0JCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVNhdmVDb250ZXh0LkZVTExfU0FWRToKLQkJCQkJZnVsbHNhdmUgPSB0cnVlOwotCQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7Ci0JCQkJLy8gTm93IGZsb3cgaW50byB0aGUgc25hcHNob3Qgc2F2ZSB0byBjb21wbGV0ZSB0aGUgZnVsbHNhdmUuCi0JCQkJY2FzZSBJU2F2ZUNvbnRleHQuU05BUFNIT1Q6Ci0JCQkJCS8vIEZvciBhIHNuYXBzaG90LCBqdXN0IHRoZSBkaXJ0eSBpbmRleGVzLCBubyBjbGVhbiB1cC4gSWYgZnVsbHNhdmUsIGNsZWFudXAgdGhlIGluZGV4ZXMsIGJ1dCBvbmx5IHNhdmUgdGhlIGRpcnR5LgotCQkJCQlzeW5jaHJvbml6ZWQgKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFKSB7Ci0JCQkJCQlpZiAoTUFJTl9JTkRFWCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGZ1bGxzYXZlKSB7Ci0JCQkJCQkJCWlmIChyZWNvbmNpbGVJbmRleERpcmVjdG9yeShudWxsLCBNQUlOX0lOREVYKSkgewotCQkJCQkJCQkJaWYgKE1BSU5fSU5ERVguaXNEaXJ0eSgpKQotCQkJCQkJCQkJCXdyaXRlSW5kZXgobnVsbCwgTUFJTl9JTkRFWCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBJdCB3YXMgZW1wdHksIGp1c3QgZ2V0IHJpZCBvZiB0aGUgaW5kZXguIFRoZSBkaXJlY3RvcmllcyBoYXZlIGFscmVhZHkgYmVlbiBjbGVhcmVkLgotCQkJCQkJCQkJTUFJTl9JTkRFWC5tYXJrRGVhZCgpOwotCQkJCQkJCQkJTUFJTl9JTkRFWCA9IG51bGw7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKE1BSU5fSU5ERVguaXNEaXJ0eSgpKQotCQkJCQkJCQl3cml0ZUluZGV4KG51bGwsIE1BSU5fSU5ERVgpOwotCQkJCQkJfQotCQkJCQkJLy8gTm93IGRvIHRoZSBwcm9qZWN0IGluZGV4ZXMuIFdlIGhhdmUgdG8gd2FsayBhbGwgb3BlbiBwcm9qZWN0cyB0byBzZWUgd2hpY2ggaGF2ZSBhbiBpbmRleC4gU2luY2Ugd2UgYXJlCi0JCQkJCQkvLyBkb2luZyBhIG1ham9yIHNhdmUsIHRoZSBoaXQgd2lsbCBvawotCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJCQlJbmRleCBpbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJCQlpZiAoaW5kZXggIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGZ1bGxzYXZlKSB7Ci0JCQkJCQkJCQkJaWYgKHJlY29uY2lsZUluZGV4RGlyZWN0b3J5KHByb2plY3QsIGluZGV4KSkgewotCQkJCQkJCQkJCQlpZiAoaW5kZXguaXNEaXJ0eSgpKQotCQkJCQkJCQkJCQkJd3JpdGVJbmRleChwcm9qZWN0LCBpbmRleCk7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJLy8gSXQgd2FzIGVtcHR5LCBqdXN0IGdldCByaWQgb2YgdGhlIGluZGV4IGZyb20gbWVtb3J5LiBJdCBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgZnJvbSBkaXNrLgotCQkJCQkJCQkJCQlpbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgbnVsbCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIGlmIChpbmRleC5pc0RpcnR5KCkpCi0JCQkJCQkJCQkJd3JpdGVJbmRleChwcm9qZWN0LCBpbmRleCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFdyaXRlIGFuIGluZGV4LiBQcm9qZWN0IGlmIG5vdCBudWxsIGluZGljYXRlcyBhIHByb2plY3QgaW5kZXguCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgd3JpdGVJbmRleChJUHJvamVjdCBwcm9qZWN0LCBJbmRleCBpbmRleCkgewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUZpbGUgaW5kZXhEaXJGaWxlID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkudG9GaWxlKCk7Ci0JCQkJaW5kZXhEaXJGaWxlLm1rZGlycygpOwotCQkJCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoaW5kZXhEaXJGaWxlLCBJTkRFWEZJTEVOQU1FKTsKLQkJCQlvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbmRleEZpbGUpKSk7Ci0JCQkJb29zLndyaXRlT2JqZWN0KGluZGV4KTsKLQkJCQlpbmRleC5zZXREaXJ0eShmYWxzZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob29zICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlvb3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBSZWNvbmNpbGUgdGhlIGluZGV4IGRpcmVjdG9yeSBvZiB1bnVzZWQgKGVtcHR5KSByb290IGRpcmVjdG9yaWVzLiBJZiBhZnRlciByZWNvbmNpbGluZyB0aGUgaW5kZXggaXMgZW1wdHksIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGluZGV4IGZpbGUgdG9vLiBAcmV0dXJuCi0JCSAqIHRydWUgaWYgaW5kZXggbm90IGVtcHR5LCBmYWxzZSBpZiBpbmRleCB3YXMgZW1wdHkgYW5kIHdhcyBlcmFzZWQgdG9vLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHJlY29uY2lsZUluZGV4RGlyZWN0b3J5KElQcm9qZWN0IHByb2plY3QsIEluZGV4IGluZGV4KSB7Ci0JCQkvLyBjbGVhbiBvdXQgdW51c2VkIHJvb3RJbmRleGVzCi0JCQlGaWxlIGluZGV4RGlyID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkudG9GaWxlKCk7Ci0JCQlpZiAoaW5kZXhEaXIuY2FuV3JpdGUoKSkgewotCQkJCS8vIENyZWF0ZSBhIHNldCBvZiBhbGwgcm9vdCBuYW1lcyBmb3IgcXVpY2sgbG9vayB1cC4KLQkJCQlpZiAoaW5kZXgucm9vdFRvUm9vdEluZGV4LmlzRW1wdHkoKSkgewotCQkJCQkvLyBJdCBpcyBlbXB0eSwgY2xlYXIgZXZlcnl0aGluZywgaW5jbHVkaW5nIGluZGV4IGZpbGUuCi0JCQkJCWNsZWFuRGlyZWN0b3J5KGluZGV4RGlyLCBmYWxzZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBOZWVkIGEgc2V0IG9mIHRoZSB2YWxpZCByb290bmFtZXMgZm9yIHF1aWNrIGxvb2t1cCBvZiBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IGxpc3QuCi0JCQkJCS8vIEFuZCB3aGlsZSBhY2N1bXVsYXRpbmcgdGhpcyBsaXN0LCBjbGVhbiBvdXQgdGhlIHJvb3QgaW5kZXhlcyBjYWNoZSB0b28gKGkuZS4gdGhlIGNsYXNzIGNhY2hlIGZpbGVzKS4KLQkJCQkJZmluYWwgU2V0IHZhbGlkRmlsZXMgPSBuZXcgSGFzaFNldChpbmRleC5yb290VG9Sb290SW5kZXguc2l6ZSgpKTsKLQkJCQkJdmFsaWRGaWxlcy5hZGQoSU5ERVhGSUxFTkFNRSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gaW5kZXgucm9vdFRvUm9vdEluZGV4LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSb290SW5kZXggcm9vdEluZGV4ID0gKFJvb3RJbmRleCkgaXRyLm5leHQoKTsKLQkJCQkJCWlmIChyZWNvbmNpbGVDbGFzc0NhY2hlRGlyZWN0b3J5KHJvb3RJbmRleCwgcHJvamVjdCkpIHsKLQkJCQkJCQkvLyBUaGUgY2xhc3MgY2FjaGUgaGFzIGJlZW4gcmVjb25jaWxlZCwgYW5kIHRoZXJlIGFyZSBzdGlsbCBzb21lIGNsYXNzZXMgbGVmdCwgc28ga2VlcCB0aGUgcm9vdCBpbmRleC4KLQkJCQkJCQl2YWxpZEZpbGVzLmFkZChyb290SW5kZXguZ2V0Um9vdE5hbWUoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWl0ci5yZW1vdmUoKTsgLy8gVGhlIHJvb3QgaW5kZXggaXMgZW1wdHksIHNvIGdldCByaWQgb2YgaXQuIFNpbmNlIG5vdCBhIHZhbGlkIG5hbWUsIGl0IHdpbGwgYmUgZGVsZXRlZCBpbiBuZXh0IHN0ZXAuCi0JCQkJCQkJaW5kZXguc2V0RGlydHkodHJ1ZSk7IC8vIEFsc28gc2V0IGl0IGRpcnR5IGluIGNhc2UgaXQgd2Fzbid0IGJlY2F1c2Ugd2UgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGNvbnRhaW5lciBJbmRleCBzaW5jZSBpdCB3YXMKLQkJCQkJCQkvLyBjaGFuZ2VkLgotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIEdldCBsaXN0IG9mIGZpbGVzIGFuZCBkZWxldGUgdGhvc2UgdGhhdCBhcmUgbm90IGEgdmFsaWQgbmFtZSAodXNlZCByb290IG5hbWUsIG9yIGluZGV4IGZpbGUpCi0JCQkJCVN0cmluZ1tdIGZpbGVOYW1lcyA9IGluZGV4RGlyLmxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdmFsaWRGaWxlcy5jb250YWlucyhmaWxlTmFtZXNbaV0pKSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5kZXhEaXIsIGZpbGVOYW1lc1tpXSk7Ci0JCQkJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCQkJY2xlYW5EaXJlY3RvcnkoZmlsZSwgdHJ1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gCi0JCQl9IGVsc2UgCi0JCQkJcmV0dXJuIHRydWU7CS8vIENhbid0IHdyaXRlLCBzbyB0cmVhdCBhcyBsZWF2ZSBhbG9uZS4KLQkJfQotCi0JCS8qCi0JCSAqIFJlY29uY2lsZSB0aGUgY2xhc3MgY2FjaGUgZGlyZWN0b3J5IGZvciB0aGUgcm9vdCBpbmRleC4gUmV0dXJuIHRydWUgaWYgcmVjb25jaWxlZCBnb29kIGJ1dCBub3QgZW1wdHkuIFJldHVybiBmYWxzZSBpZiB0aGUgY2xhc3MgY2FjaGUKLQkJICogZGlyZWN0b3J5IGlzIG5vdyBlbXB0eS4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBhY3R1YWxseSBnZXQgcmlkIG9mIHRoZSBlbnRpcmUgcm9vdCBpbmRleC4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBtYXRjaGVzCi0JCSAqIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggYnkgcmVtb3ZpbmcgYW55IGZpbGUgbm90IGZvdW5kIGluIHRoZSBpbmRleC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiByZWNvbmNpbGVDbGFzc0NhY2hlRGlyZWN0b3J5KFJvb3RJbmRleCByb290SW5kZXgsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmIChyb290SW5kZXguY2xhc3NOYW1lVG9DbGFzc0VudHJ5LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIFRoZXJlIGFyZSBubyBjbGFzc2VzLCBzbyBnZXQgcmlkIHRoZSBlbnRpcmUgcm9vdCBpbmRleC4KLQkJCWVsc2UgewotCQkJCWZpbmFsIFNldCB2YWxpZEZpbGVzID0gcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5rZXlTZXQoKTsgLy8gVGhlIGtleXMgKGNsYXNzbmFtZXMpIGFyZSB0aGUgZmlsZW5hbWVzICh3aXRob3V0IGV4dGVuc2lvbikKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoYXQKLQkJCQkvLyBzaG91bGQgYmUga2VwdC4KLQkJCQlGaWxlIGluZGV4RGlyID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkuYXBwZW5kKHJvb3RJbmRleC5nZXRSb290TmFtZSgpKS50b0ZpbGUoKTsKLQkJCQkvLyBHZXQgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSBub3QgYSB2YWxpZCBuYW1lICh1c2VkIGNsYXNzbmFtZSkKLQkJCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBpbmRleERpci5saXN0KCk7Ci0JCQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlTmFtZXNbaV07Ci0JCQkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoT1ZFUlJJREVfQ0FDSEVfU1VGRklYKSkgewotCQkJCQkJCS8vIEVuZHMgd2l0aCBvdXQgY2xhc3MgY2FjaGUgZXh0ZW5zaW9uLCBzZWUgaWYgdmFsaWQgY2xhc3NuYW1lLgotCQkJCQkJCVN0cmluZyBjbGFzc25hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSBPVkVSUklERV9DQUNIRV9TVUZGSVgubGVuZ3RoKCkpOwotCQkJCQkJCUNsYXNzRW50cnkgY2UgPSAoQ2xhc3NFbnRyeSkgcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5nZXQoY2xhc3NuYW1lKTsKLQkJCQkJCQlpZiAoY2UgIT0gbnVsbCAmJiBjZS5vdmVycmlkZUNhY2hlRXhpc3RzKCkpCi0JCQkJCQkJCWNvbnRpbnVlOyAvLyBJdCBpcyBvbmUgb2Ygb3Vycy4gS2VlcCBpdC4KLQkJCQkJCX0gZWxzZSBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoQ0xBU1NfQ0FDSEVfU1VGRklYKSkgewotCQkJCQkJCS8vIEVuZHMgd2l0aCBvdXQgY2xhc3MgY2FjaGUgZXh0ZW5zaW9uLCBzZWUgaWYgdmFsaWQgY2xhc3NuYW1lLgotCQkJCQkJCWlmICh2YWxpZEZpbGVzLmNvbnRhaW5zKGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIENMQVNTX0NBQ0hFX1NVRkZJWC5sZW5ndGgoKSkpKSAvLyBTdHJpcCBkb3duIHRvIGp1c3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2xhc3MgYW5kIHNlZSBpZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmUgb2Ygb3Vycy4KLQkJCQkJCQkJY29udGludWU7IC8vIEl0IGlzIG9uZSBvZiBvdXJzLiBLZWVwIGl0LgotCQkJCQkJfQotCQkJCQkJLy8gTm90IHZhbGlkLCBnZXQgcmlkIG9mIGl0LgotCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5kZXhEaXIsIGZpbGVOYW1lKTsKLQkJCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQkJY2xlYW5EaXJlY3RvcnkoZmlsZSwgdHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZmlsZS5kZWxldGUoKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5EaXJlY3RvcnkoRmlsZSBkaXIsIGJvb2xlYW4gZXJhc2VEaXIpIHsKLQkJaWYgKGRpci5jYW5Xcml0ZSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWNsZWFuRGlyZWN0b3J5KGZpbGVzW2ldLCB0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJfQotCQkJaWYgKGVyYXNlRGlyKQotCQkJCWRpci5kZWxldGUoKTsKLQkJfQotCX0JCi0KLQkvLy0tLS0tLS0tLS0tLS0tIFNhdmUgQ2xhc3MgQ2FjaGUgRW50cnkgSm9iIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBUaGlzIGlzIHdyaXRlIHF1ZXVlIGZvciBjbGFzcyBjYWNoZXMuIEl0IGlzIGEgRklGTyBxdWV1ZS4gSXQgaXMgc3ljaHJvbml6ZWQgc28gdGhhdCBhZGRzL3JlbW92ZXMgYXJlIGNvbnRyb2xsZWQuCi0JLy8gRW50cmllcyBhcmUgQ2xhc3NFbnRyeSdzLiBUaGUgY2xhc3MgZW50cnkgaGFzIHRoZSByZXNvdXJjZSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0LiBJdCB3aWxsIGJlIHNldCB0byBudWxsCi0JLy8gYnkgdGhlIGpvYiB3aGVuIGl0IGlzIHdyaXR0ZW4uIFRoZSBqb2Igd2lsbCBoYXZlIGEgQ2xhc3NFbnRyeSBsb2NrZWQgd2hpbGUgaXQgaXMgcmV0cmlldmluZyBhbmQgcmVzZXR0aW5nIHRoZSByZXNvdXJjZQotCS8vIGZpZWxkIGluIHRoZSBlbnRyeS4KLQkvLwotCS8vIFRoZSBwcm9jZXNzIGlzIHRoZSBuZXcgY2FjaGUgd2lsbCBsb2NrLCBjcmVhdGUgcmVzb3VyY2UsIHNldCByZXNvdXJjZSBpbnRvIHRoZSBDRSBhbmQgcmVsZWFzZSBsb2NrLiBUaGVuIGFkZCB0aGUgQ0UgdG8gdGhlIHF1ZXVlCi0JLy8gYW5kIHNjaGVkdWxlIHRoZSBqb2IgKGluIGNhc2Ugam9iIGlzIG5vdCBydW5uaW5nKS4KLQkvLwotCS8vIFRoZSBqb2Igd2lsbCBsb2NrIHRoZSBDRSwgZ2V0IHJlc291cmNlIGZyb20gdGhlIENFLCB3cml0ZSBpdCBvdXQsIHNldCBpdCBiYWNrIHRvIG51bGwsIHJlbGVhc2UgdGhlIENFKS4gSWYgdGhlIHJlc291cmNlIGlzIG51bGwsCi0JLy8gdGhlbiBpdCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKHRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBqb2IgZGlkbid0IGdldCBhIGNoYW5jZSB0byBzYXZlIGl0IGJlZm9yZSBhbm90aGVyIGVudHJ5IHdhcyBwb3N0ZWQKLQkvLyBhbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcXVlc3QgYW5kIGl0IHdhcyBhY3R1YWxseSBwcm9jZXNzZWQgYnkgdGhlIGZpcnN0IHJlcXVlc3QpLgotCS8vIElFOgotCS8vIDEpIHJlc291cmNlIGNyZWF0ZWQsIHF1ZXVlIGVudHJ5IGFkZGVkCi0JLy8gMikgMm5kIHJlcSwgam9iIG5vdCBwcm9jZXNzZWQgeWV0LCByZXNvdXJjZSByZWNyZWF0ZWQgYW5kIHB1dCBiYWNrIGludG8gQ0UsIG5ldyBxdWV1ZSBlbnRyeS4KLQkvLyAzKSBqb2IgcHVsbHMgZnJvbSBxdWV1ZSwgbG9ja3MgY2UsIGdyYWJzIHJlc291cmNlLCB3cml0ZXMgb3V0IHRoZSByZXNvdXJjZSwgc2V0cyBiYWNrIHRvIG51bGwsIHJlbGVhc2UgY2UuCi0JLy8gNCkgam9iIHB1bGxzIGZyb20gcXVldWUuIFRoaXMgdGltZSB0aGUgcmVzb3VyZSBpcyBudWxsIHNvIGl0IHNraXBzIGl0LgotCS8vCi0JLy8gTmVlZCB0byBsb2NrIENlIGR1cmluZyBlbnRpcmUgY3JlYXRlIGFuZCB3cml0ZSBiZWNhdXNlIHRoZSByZXNvdXJjZSBzZXQgaXMgbm90IHJlZW50cmFudCBzbyBjYW4ndCBiZSB3cml0aW5nIGl0IHdoaWxlIGNyZWF0aW5nIGl0LgotCi0JcHJpdmF0ZSBMaXN0IGNhY2hlV3JpdGVRdWV1ZSA9IG51bGw7Ci0KLQl2b2lkIHdhaXRGb3JDYWNoZVNhdmVKb2IoKSB7Ci0JCS8vIEZvciBhIGZ1bGwgc2F2ZSB3ZSB3YW50IHRvIGdldCB0aGUgY2xhc3MgY2FjaGUgZmlsZXMgd3JpdHRlbiB0b28sIHNvIHdlIG5lZWQgdG8gbWFuaXB1bGF0ZSB0aGUgam9iIHRvIGdldCBpdCB0byBmaW5pc2ggQVNBUC4KLQkJaWYgKGNhY2hlV3JpdGVKb2IgIT0gbnVsbCkgewotCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coIkZvcmNpbmcgYSBjYWNoZSBzYXZlIGpvYiB0byBzdGFydCBlYXJseS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAoY2FjaGVXcml0ZUpvYi5nZXRTdGF0ZSgpKSB7Ci0JCQkJY2FzZSBKb2IuU0xFRVBJTkc6Ci0JCQkJCS8vIEl0IGNvdWxkIGJlIHdhaXRpbmcgYSBsb25nIHRpbWUsIHNvIHdlIG5lZWQgdG8gd2FrZSBpdCB1cCBhdCBhIGhpZ2ggcHJpb3JpdHkgdG8gZ2V0IGl0IHJ1bm5pbmcgQVNBUC4KLQkJCQkJY2FjaGVXcml0ZUpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOyAvLyBOZWVkIHRvIGdldCBpdCBnb2luZyByaWdodCBhd2F5Ci0JCQkJCWNhY2hlV3JpdGVKb2Iud2FrZVVwKCk7Ci0JCQkJCS8vIE5vdyBkcm9wIGludG8gdGhlIHdhaXQuCi0JCQkJZGVmYXVsdDoKLQkJCQkJLy8gTm93IHdhaXQgZm9yIGl0IChpZiBub3QgcnVubmluZyB0aGlzIHdpbGwgcmV0dXJuIHJpZ2h0IGF3YXkpLgotCQkJCQl0cnkgewotCQkJCQkJY2FjaGVXcml0ZUpvYi5qb2luKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIE1hcCBTQVZFX0NBQ0hFX09QVElPTlM7Ci0Jc3RhdGljIHsKLQkJU0FWRV9DQUNIRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoMyk7Ci0JCVNBVkVfQ0FDSEVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NBVkVfVFlQRV9JTkZPUk1BVElPTiwgQm9vbGVhbi5UUlVFKTsKLQkJU0FWRV9DQUNIRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBTQVZFX0NBQ0hFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGNhY2hlV3JpdGVKb2IgPSBudWxsOwotCXByb3RlY3RlZCBBZGFwdGVyIHByb2plY3RSZWxlYXNlQWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiB0eXBlID09IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXM7CS8vIFdlJ3JlIG1ha2luZyB0aGUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIudGhpcyBiZSB0aGUgYWRhcHRlciB0eXBlLgotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUHJvamVjdFJlc291cmNlU2V0LlNQRUNJQUxfTk9USUZJQ0FUSU9OX1RZUEUgJiYgbXNnLmdldEZlYXR1cmVJRChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5jbGFzcykgPT0gUHJvamVjdFJlc291cmNlU2V0LlBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEKSB7Ci0JCQkJLy8gVGhpcyBpcyBhbiBhYm91dCB0byBiZSBjbG9zZWQuIElmIHdlIGhhdmUgYW4gYWN0aXZlIHdyaXRlIGpvYiwgYnJpbmcgaXQgdXAgdG8gdG9wIHByaW9yaXR5IGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCi0JCQkJLy8gVGhpcyB3aWxsIG1ha2Ugc3VyZSBhbnkgcmVzb3VyY2VzIGluIHRoZSBwcm9qZWN0IGFyZSB3cml0dGVuLiBUaGVyZSBtYXkgbm90IGJlIGFueSB3YWl0aW5nLCBidXQgdGhpcyBpcyBkb2luZyBhIGNsb3NlCi0JCQkJLy8gcHJvamVjdCwgd2hpY2ggaXMgc2xvdyBhbHJlYWR5IHJlbGF0aXZlbHkgc3BlYWtpbmcsIHRoYXQgd2FpdGluZyBmb3IgdGhlIGNhY2hlIHdyaXRlIGpvYiB0byBmaW5pc2ggaXMgbm90IGJhZC4KLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSB2b2lkIHF1ZXVlQ2xhc3NFbnRyeShDbGFzc0VudHJ5IGNlLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCWlmIChjYWNoZVdyaXRlUXVldWUgPT0gbnVsbCkgewotCQkJY2FjaGVXcml0ZVF1ZXVlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdCgpKTsKLQkJCWNhY2hlV3JpdGVKb2IgPSBuZXcgSm9iKEJlYW5pbmZvQ29yZU1lc3NhZ2VzLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyX0pvYl9Xcml0ZUJlYW5pbmZvQ2FjaGVfVGl0bGUpIHsgCi0KLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBjYWNoZVdyaXRlUXVldWUuc2l6ZSgpICsgMTApOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBydW4sIHNvIHdlIGFkZCAxMCBmb3IgdGhlIGhlY2sgb2YgaXQuIC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiU3RhcnRpbmcgd3JpdGUgQmVhbkluZm8gQ2FjaGUgZmlsZXMuIiwgTGV2ZWwuRklORVIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdoaWxlICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIWNhY2hlV3JpdGVRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCUNsYXNzRW50cnkgY2UgPSAoQ2xhc3NFbnRyeSkgY2FjaGVXcml0ZVF1ZXVlLnJlbW92ZSgwKTsgLy8gR2V0IGZpcnN0IG9uZS4KLQkJCQkJCWJvb2xlYW4gZGVhZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci50aGlzKSB7Ci0JCQkJCQkJaWYgKGNlLmdldFJvb3RJbmRleCgpLmdldEluZGV4KCkuaXNEZWFkKCkpIHsKLQkJCQkJCQkJZGVhZCA9IHRydWU7CS8vIFRoZSBpbmRleCBpcyBkZWFkLCBzbyBkb24ndCB3cml0ZSBpdC4gV2Ugc3RpbGwgbmVlZCB0byBnbyB0aHJvdWdoIGFuZCBnZXQgdGhlIHBlbmRpbmcgcmVzb3VyY2Ugb3V0IG9mIGl0cyByZXNvdXJjZSBzZXQgc28gdGhhdCBpdCBnb2VzIGF3YXkuCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc3luY2hyb25pemVkIChjZSkgewotCQkJCQkJCVJlc291cmNlIGNyZXMgPSBjZS5nZXRQZW5kaW5nUmVzb3VyY2UoKTsKLQkJCQkJCQlpZiAoY3JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoIWRlYWQpCi0JCQkJCQkJCQkJY3Jlcy5zYXZlKFNBVkVfQ0FDSEVfT1BUSU9OUyk7Ci0JCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCS8vIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSByZXNvdXJjZSBzZXQsIGNsZWFyIG91dCB0aGUgcGVuZGluZy4KLQkJCQkJCQkJCWNyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY3Jlcyk7Ci0JCQkJCQkJCQljZS5zZXRQZW5kaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY3JlcyA9IGNlLmdldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKCk7Ci0JCQkJCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKCFkZWFkKQotCQkJCQkJCQkJCWNyZXMuc2F2ZShTQVZFX0NBQ0hFX09QVElPTlMpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkvLyBSZW1vdmUgdGhlIHJlc291cmNlIGZyb20gcmVzb3VyY2Ugc2V0LCBjbGVhciBvdXQgdGhlIHBlbmRpbmcuCi0JCQkJCQkJCQljcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGNyZXMpOwotCQkJCQkJCQkJY2Uuc2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UobnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpCi0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coIkZpbmlzaGVkIHdyaXRlIEJlYW5JbmZvIENhY2hlIGZpbGVzLiIsIExldmVsLkZJTkVSKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQkJY2FjaGVXcml0ZUpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJY2FjaGVXcml0ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCX0KLQkJaWYgKHJzZXQgIT0gbnVsbCAmJiBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJzZXQsIHRoaXMpID09IG51bGwpIHsKLQkJCS8vIElmIGl0IGlzIGEgcHJvamVjdCByZXNvdXJjZSBzZXQsIHRoZW4gYWRkIG91cnNlbHZlcyBhcyBsaXN0ZW5lcnMgc28gd2Uga25vdyB3aGVuIHJlbGVhc2VkLgotCQkJaWYgKHJzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQkJcnNldC5lQWRhcHRlcnMoKS5hZGQocHJvamVjdFJlbGVhc2VBZGFwdGVyKTsKLQkJfQotCQljYWNoZVdyaXRlUXVldWUuYWRkKGNlKTsKLQkJY2FjaGVXcml0ZUpvYi5zY2hlZHVsZSg2MCAqIDEwMDBMKTsgLy8gUHV0IG9mZiBmb3IgMSBtaW51dGUgdG8gbGV0IG90aGVyIHN0dWZmIGdvIG9uLiBOb3QgaW1wb3J0YW50IHRoYXQgaXQgaGFwcGVucyBpbW1lZGlhdGVseS4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5JbmZvQ29udHJpYnV0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODdmZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW4uSUNvbnRyaWJ1dG9yT3ZlcnJpZGVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0gCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJQmVhbkluZm9Db250cmlidXRvciBmb3IgdXNlcnMgdG8gc3ViY2xhc3MuIERlZmF1bHQgZG9lcyBub3RoaW5nLgotICogPHA+Ci0gKiBCdXQgdGhpcyBkb2VzIHN1cHBseSBzZXZlcmFsIHZlcnkgdXNlZnVsIHV0aWxpdHkgbWV0aG9kcy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlciBpbXBsZW1lbnRzIElCZWFuSW5mb0NvbnRyaWJ1dG9yIHsKLQkKLQkvKioKLQkgKiBBbiBlbXB0eSBhcnJheSBvZiBCZWFuaW5mb0VudHJ5LiBBdmFpbGFibGUgZm9yIHN1YmNsYXNzZXMgdG8gcmV0dXJuIGlmIHRoZXkKLQkgKiBkZWNpZGUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCZWFuaW5mb0VudHJ5W10gRU1QVFlfQkVBTklORk9fRU5UUklFUyA9IG5ldyBCZWFuaW5mb0VudHJ5WzBdOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyBwYXJ0IG9mIHRoZSBwYWNrYWdlLiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gZGV0ZXJtaW5lCi0JICogaWYgYSBvdmVycmlkZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBmcmFnbWVudCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHBhY2thZ2UuCi0JICogPHA+Ci0JICogSW4gb3RoZXIgd29yZHMsIDxjb2RlPm9yZy5lY2xpcHNlPC9jb2RlPiBhcyBhIGZyYWdtZW50IGFuZCBhbmQgPGNvZGU+b3JnLmVjbGlwc2UuY29yZTwvY29kZT4gYXMKLQkgKiBhIHBhY2thZ2VQYXRoIHdpbGwgYW5zd2VyIHRydWUsIGJ1dCBpZiB5b3Ugc3dhcHBlZCB0aGVtIGl0IHdpbGwgYW5zd2VyIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBmcmFnbWVudAotCSAqIEBwYXJhbSBwYWNrYWdlUGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZyYWdtZW50IGlzIGEgbGVhZGluZyBwYXJ0IG9mIHRoZSBwYWNrYWdlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRnJhZ21lbnQoSVBhdGggZnJhZ21lbnQsIElQYXRoIHBhY2thZ2VQYXRoKSB7Ci0JCXJldHVybiBmcmFnbWVudC5pc1ByZWZpeE9mKHBhY2thZ2VQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bm1hdGNoZWQgcG9ydGlvbiBvZiB0aGUgcGFja2FnZSBwYXRoIGZyb20gYSBmcmFnbWVudC4gVXNlZCBieSBzdWJjbGFzc2VzCi0JICogdG8gZ2V0IHRoZSBwYXJ0IG9mIHRoZSBwYWNrYWdlIHBhdGggdGhhdCBpcyBhZnRlciB0aGUgZnJhZ21lbnQuIFRoaXMgaXMgdGhlbiB1c2VkIHRvCi0JICogYXBwZW5kIHRvIHRoZSBwYXRoIGZyb20gdGhlIG92ZXJyaWRlIHRvIGdldCB0aGUgZnVsbCBwYXRoIHRvIG92ZXJyaWRlIGZpbGVzIGZvciB0aGlzCi0JICogcGFja2FnZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBwYXJ0IG9mIHRoZSBwYWNrYWdlUGF0aCB0aGF0IGlzIG5vdCBtYXRjaGVkIGJ5IHRoZSBmcmFnbWVudC4gCi0JICogPHA+Ci0JICogTm90ZTogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGZyYWdtZW50IGFuZCBwYWNrYWdlUGF0aCBoYXZlIGZpcnN0IGJlZW4gdGVzdGVkIHRocm91Z2gKLQkgKiBpc0ZyYWdtZW50LiBPdGhlcndpc2UgYW4gaW52YWxpZCByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZnJhZ21lbnQKLQkgKiBAcGFyYW0gcGFja2FnZVBhdGgKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0IG9mIHRoZSBwYWNrYWdlIHBhdGggbm90IG1hdGNoZWQuCi0JICogCi0JICogQHNlZSBCZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlciNpc0ZyYWdtZW50KElQYXRoLCBJUGF0aCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVubWF0Y2hlZFBhdGgoSVBhdGggZnJhZ21lbnQsIElQYXRoIHBhY2thZ2VQYXRoKSB7Ci0JCXJldHVybiBmcmFnbWVudC5yZW1vdmVGaXJzdFNlZ21lbnRzKHBhY2thZ2VQYXRoLnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyBoZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgb3ZlcnJpZGUgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gKHBsdWdpbikgYnVuZGxlLiAKLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlIHRoZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGggcGF0aCBvZiBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4uCi0JICogQHBhcmFtIHJlc291cmNlIHNldCB0byBsb2FkIGludG8uCi0JICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBydW5uYWJsZSB0aGF0IGlzIGJlaW5nIHVzZWQgZm9yIHRoZSBvdmVycmlkZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgcmVzb3VyY2UgYWxyZWFkeSB1c2VkIG9uY2UuCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY291bGRuJ3QgYmUgbG9hZGVkIG9yIGlmIGl0IHdhcyBhbHJlYWR5IHVzZWQgb25jZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZE92ZXJyaWRlUmVzb3VyY2UoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHJlbGF0aXZlUGF0aCwgUmVzb3VyY2VTZXQgcnNldCwgQmVhbmluZm9QbHVnaW4uSUNvbnRyaWJ1dG9yT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BST1RPQ09MKyI6LyIrSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QTFVHSU4rJy8nK2J1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSsnLycrcmVsYXRpdmVQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocnVubmFibGUucmVzb3VyY2VDb250cmlidXRlZCh1cmkpKQotCQkJcmV0dXJuIG51bGw7CS8vIEFscmVhZHkgY29udHJpYnV0ZWQgb25jZS4KLQkJUmVzb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaXMgb2sKLQkJCWlmICghKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKSB7Ci0JCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uCi0JCQkJCSYmICgoQ29yZUV4Y2VwdGlvbikgZS5leGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQpIHsKLQkJCQkJLy8gVGhpcyBpcyBvay4gTWVhbnMgdXJpX21hcHBpbmcgbm90IHNldCBzbyBjb3VsZG4ndCBmaW5kIGluIFdvcmtzcGFjZSwgYWxzbyBvay4KLQkJCQl9IGVsc2UgewotCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAwLCAiRXJyb3IgbG9hZGluZyBmaWxlXCIiICsgdXJpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJbiBjYXNlIGl0IGhhcHBlbmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGJ1dCBkdXJpbmcgbG9hZC4gTmVlZCB0byBnZXQgcmlkIG9mIGl0IGluIHRoZSBmaW5hbGx5LgotCQkJcmVzdWx0ID0gbnVsbDsKLQkJCVJlc291cmNlIHJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvdWxkbid0IGxvYWQgaXQgZm9yIHNvbWUgcmVhc29uLgotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvLyBJbiBjYXNlIGl0IGhhcHBlbmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGJ1dCBkdXJpbmcgbG9hZC4gTmVlZCB0byBnZXQgcmlkIG9mIGl0IGluIHRoZSBmaW5hbGx5LgotCQkJcmVzdWx0ID0gbnVsbDsKLQkJCVJlc291cmNlIHJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzKTsKLQkJfTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5JbmZvQ29udHJpYnV0b3IjZ2V0QmVhbkluZm9FbnRyeUNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotCSAqLwotCXB1YmxpYyBCZWFuaW5mb0VudHJ5W10gZ2V0QmVhbkluZm9FbnRyeUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pIHsKLQkJcmV0dXJuIEVNUFRZX0JFQU5JTkZPX0VOVFJJRVM7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5JbmZvQ29udHJpYnV0b3IjcnVuT3ZlcnJpZGVzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGUpCi0JICovCi0JcHVibGljIHZvaWQgcnVuT3ZlcnJpZGVzKElQYXRoIHBhY2thZ2VQYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBKYXZhQ2xhc3MgamF2YUNsYXNzLCBSZXNvdXJjZVNldCByc2V0LCBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCS8vIERlZmF1bHQgaXMgZG8gbm90aGluZwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb0NvcmVNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkNTY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEJlYW5pbmZvQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBCZWFuaW5mb0NvcmVNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXJfSm9iX1dyaXRlQmVhbmluZm9DYWNoZV9UaXRsZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJlYW5pbmZvQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9FbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ3ZmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLio7Ci0KLS8qKgotICogQmVhbmluZm8gZW50cnkuIExvY2F0aW9uIG9mIHRoZSBiZWFuaW5mb3MuIE11Y2ggbGlrZSBhIHN0YW5kYXJkIGNsYXNzcGF0aCBlbnRyeS4KLSAqIFRoZSBCZWFuSW5mb3MgYXJlIGVpdGhlciBpbiBhIGphciBvciBhbm90aGVyIHByb2plY3QuIFRoZXkgY2FuIGJlIHN1cHBsaWVkIGFzCi0gKiBhIGxvY2FsIGZpbGUgaW4gdGhlIHByb2plY3QsIG9yIGFzIGFuIGV4dGVybmFsIGphciwgb3IgYXMgZXh0ZXJuYWwgamFyIHRocm91Z2ggYQotICogdmFyaWFibGUsIG9yIGFuIGV4dGVybmFsIGphciB0aHJvdWdoIGEgcGx1Z2luLgotICogPHA+Ci0gKiBBbiBleHRlcm5hbCBqYXIgdGhyb3VnaCBjb250YWluZXJzIGlzIG5vdCB2YWxpZCBiZWNhdXNlIGNvbnRhaW5lciBhcmUgYXR0YWNoZWQgdG8KLSAqIHByb2plY3RzLiB0aGV5IGFyZW4ndCBzdGFuZGFsb25lLgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb0VudHJ5IGltcGxlbWVudHMgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgc0JlYW5pbmZvID0gImJlYW5pbmZvIjsgLy8gQmVhbmluZm8gZW50cnksIHNoYXJlZCB3aXRoIEJlYW5pbmZvc0RvYy4gLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRV9QTFVHSU4gPSAxMDA7CS8vIEJlYW5pbmZvIGphciBjYW4gYmUgZm91bmQgaW4gYSBwbHVnaW4uCi0KLQlzdGF0aWMgaW50IGtpbmRGcm9tU3RyaW5nKFN0cmluZyBraW5kU3RyKSB7Ci0JCWlmIChraW5kU3RyID09IG51bGwgfHwga2luZFN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIEJJRV9QTFVHSU47CS8vIERlZmF1bHQgdG8gcGx1Z2luLiBJZiBjb21pbmcgZnJvbSBiZWFuaW5mb2NvbmZpZywgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBraW5kLiBCdXQgaWYgY29taW5nIGZyb20gcGx1Z2luLnhtbCB0aGVyZSBzaG91bGRuJ3QgYmUgb25lLgotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJjb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ2YXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInNyYyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImxpYiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJwbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEJJRV9QTFVHSU47Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGtpbmRUb1N0cmluZyhpbnQga2luZCkgewotCi0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCXJldHVybiAic3JjIjsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQlyZXR1cm4gInNyYyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJcmV0dXJuICJ2YXIiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCXJldHVybiAiY29uIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBCSUVfUExVR0lOOgotCQkJCXJldHVybiAicGx1Z2luIjsJLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGVudHJ5IHdoZW4gd2Uga25vdyBpdCBpcyBhIGNsYXNzcGF0aCBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBjcmVhdGVFbnRyeShpbnQga2luZCwgSVBhdGggcGF0aCwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQotCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwsIGlzRXhwb3J0ZWQpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQkJLy8gbXVzdCBiZSBhbiBlbnRyeSBpbiB0aGlzIHByb2plY3Qgb3Igc3BlY2lmeSBhbm90aGVyIHByb2plY3QKLQkJCQkJU3RyaW5nIHByb2pTZWdtZW50ID0gcGF0aC5zZWdtZW50KDApOwotCQkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2pTZWdtZW50ICE9IG51bGwgJiYgcHJvalNlZ21lbnQuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCQkJLy8gdGhpcyBwcm9qZWN0Ci0JCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3U291cmNlRW50cnkocGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhbm90aGVyIHByb2plY3QKLQkJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJcmV0dXJuIEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkocGF0aCwgbnVsbCwgbnVsbCwgaXNFeHBvcnRlZCk7Ci0JCQkKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHBhdGgsIGlzRXhwb3J0ZWQpOwotCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmVhZCB0aGUgZW50cnkgaW4gZnJvbSB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvRW50cnkgcmVhZEVudHJ5KElSZWFkZXIgcmVhZGVyLCBPYmplY3QgZWxlbWVudCwgSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgZWxlbWVudEtpbmQgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEJlYW5pbmZvc0RvYy5zS2luZCk7Ci0JCVN0cmluZyBwYXRoU3RyID0gcmVhZGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBCZWFuaW5mb3NEb2Muc1BhdGgpOwotCQkvLyBlbnN1cmUgcGF0aCBpcyBhYnNvbHV0ZQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7Ci0JCWludCBraW5kID0ga2luZEZyb21TdHJpbmcoZWxlbWVudEtpbmQpOwotCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYga2luZCAhPSBCSUVfUExVR0lOICYmICFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJcGF0aCA9IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocGF0aCkgOiBwYXRoLm1ha2VBYnNvbHV0ZSgpOyAvLyBTb21lIGZvbGRlci9qYXIgd2l0aGluIHRoaXMgcHJvamVjdAotCQl9Ci0KLQkJLy8gZXhwb3J0ZWQgZmxhZwotCQlTdHJpbmcgZXhwb3J0ZWRTdHJpbmcgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEJlYW5pbmZvc0RvYy5zRXhwb3J0ZWQpOwotCQlib29sZWFuIGlzRXhwb3J0ZWQgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShleHBvcnRlZFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJlY3JlYXRlIHRoZSBlbnRyeQotCQlJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IG51bGw7Ci0JCUlQYXRoIHBsdWdpblBhdGggPSBudWxsOwotCQlpZiAoa2luZCAhPSBCSUVfUExVR0lOKSB7Ci0JCQljcEVudHJ5ID0gY3JlYXRlRW50cnkoa2luZCwgcGF0aCwgcHJvamVjdCwgaXNFeHBvcnRlZCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0JCQkJcGx1Z2luUGF0aCA9IHBhdGg7Ci0JCQllbHNlIHsKLQkJCQkvLyBLbHVkZ2UgVGhpcyBzaG91bGQgb25seSBiZSBhIHBsdWdpbiB0eXBlIGlmIGZyb20gY29uZmlndXJhdGlvbiBlbGVtZW50LiBTbyB3ZSB3aWxsIGNhc3QgdG8gdGhhdAotCQkJCS8vIGFuZCBnZXQgdGhlIHBsdWdpbiBpZCB0byBjcmVhdGUgYW4gYWJzb2x1dGUgcGx1Z2luIHBhdGguCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJCQkJcGx1Z2luUGF0aCA9IG5ldyBQYXRoKCcvJysoKElDb25maWd1cmF0aW9uRWxlbWVudCkgZWxlbWVudCkuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpLmFwcGVuZChwYXRoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG51bGw7CS8vIE5vdCB2YWxpZCBiZWNhdXNlIGNhbid0IGhhdmUgcGx1Z2luIGZyb20gLmJlYW5pbmZvY29uZmlnIGZpbGUuCi0JCQl9Ci0JCX0KLQotCQlBcnJheUxpc3Qgc2VhcmNocGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdCBjaGlsZHJlbiA9IHJlYWRlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJaW50IGNoaWxkcmVuTGVuZ3RoID0gcmVhZGVyLmdldExlbmd0aChjaGlsZHJlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gcmVhZGVyLmdldEl0ZW0oY2hpbGRyZW4sIGkpOwotCQkJaWYgKHJlYWRlci5pc05vZGVUeXBlRWxlbWVudChjaGlsZCkpIHsKLQkJCQlPYmplY3QgZW50cnkgPSBudWxsOwotCQkJCWlmIChyZWFkZXIuZ2V0Tm9kZU5hbWUoY2hpbGQpLmVxdWFsc0lnbm9yZUNhc2UoU2VhcmNocGF0aEVudHJ5LnNTZWFyY2hwYXRoKSkgewotCQkJCQllbnRyeSA9IFNlYXJjaHBhdGhFbnRyeS5yZWFkRW50cnkocmVhZGVyLCBjaGlsZCwgcHJvamVjdCwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCQlzZWFyY2hwYXRocy5hZGQoZW50cnkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNwRW50cnkgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQmVhbmluZm9FbnRyeSgKLQkJCQljcEVudHJ5LAotCQkJCShTZWFyY2hwYXRoRW50cnlbXSkgc2VhcmNocGF0aHMudG9BcnJheShuZXcgU2VhcmNocGF0aEVudHJ5W3NlYXJjaHBhdGhzLnNpemUoKV0pLAotCQkJCWlzRXhwb3J0ZWQpOwotCQllbHNlIHJldHVybiBuZXcgQmVhbmluZm9FbnRyeSgKLQkJCQlwbHVnaW5QYXRoLAotCQkJCShTZWFyY2hwYXRoRW50cnlbXSkgc2VhcmNocGF0aHMudG9BcnJheShuZXcgU2VhcmNocGF0aEVudHJ5W3NlYXJjaHBhdGhzLnNpemUoKV0pLAotCQkJCWlzRXhwb3J0ZWQpOwotCX0KLQotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnkgZW50cnk7IC8vIFN0b3JlIGl0IGFzIGEgY2xhc3NwYXRoIGVudHJ5IGZvciBjb252aWVuZW5jZS4gSXQgaXMgdGhlIFJBVyBjbGFzc3BhdGggZW50cnkuIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gcG9pbnRpbmcgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBwbHVnaW4uCi0JcHJvdGVjdGVkIElQYXRoIHBsdWdpblBhdGg7CS8vIFdoZW4gc3RvcmVkIGluIGEgcGx1Z2luLCB0aGlzIHdpbGwgYmUgc2V0IGluc3RlYWQuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBvcnRlZDsKLQlwcm90ZWN0ZWQgU2VhcmNocGF0aEVudHJ5W10gc2VhcmNocGF0aHM7Ci0JCi0JLyoqCi0JICogVXNlZCB3aGVuIHRoZSBiZWFuaW5mbyBqYXIgaXMgd2l0aGluIGEgcGx1Z2luLiBJbiB0aGF0IGNhc2UsIHRoZSBmaXJzdCBzZWdtZW50Ci0JICogb2YgdGhlIHBhdGggaXMgdGhlIHBsdWdpbiBkZXNjcmlwdG9yLCBhbmQgdGhlIHJlc3QgaXMgdGhlIHBhdGggZnJvbSB0aGUgcGx1Z2luCi0JICogZGlyZWN0b3J5IHRvIHRoZSBqYXIuCi0JICovCi0JcHVibGljIEJlYW5pbmZvRW50cnkoSVBhdGggcGx1Z2luUGF0aCwgU2VhcmNocGF0aEVudHJ5W10gc2VhcmNocGF0aHMsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQl0aGlzKHNlYXJjaHBhdGhzLCBpc0V4cG9ydGVkKTsKLQkJdGhpcy5wbHVnaW5QYXRoID0gcGx1Z2luUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHdoZW4gdGhlIGJlYW5pbmZvIGphci9mb2xkZXIgaXMgZWl0aGVyIGFuIGV4dGVybmFsIGphci9mb2xkZXIgb3IgaXMgc29tZXdoZXJlIGVsc2UKLQkgKiBpbiB0aGUgd29ya3NwYWNlLiBJbiB0aGF0IGNhc2UgdGhlIGVudHJ5IGlzIHRoZSBSQVcgY2xhc3NwYXRoIGVudHJ5IHRvIHRoYXQgY29kZS4KLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9FbnRyeShJQ2xhc3NwYXRoRW50cnkgZW50cnksIFNlYXJjaHBhdGhFbnRyeVtdIHNlYXJjaHBhdGhzLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJdGhpcyhzZWFyY2hwYXRocywgaXNFeHBvcnRlZCk7Ci0JCXRoaXMuZW50cnkgPSBlbnRyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJlYW5pbmZvRW50cnkoU2VhcmNocGF0aEVudHJ5W10gc2VhcmNocGF0aHMsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQl0aGlzLmlzRXhwb3J0ZWQgPSBpc0V4cG9ydGVkOwotCQl0aGlzLnNlYXJjaHBhdGhzID0gc2VhcmNocGF0aHMgIT0gbnVsbCA/IHNlYXJjaHBhdGhzIDogbmV3IFNlYXJjaHBhdGhFbnRyeVswXTsKLQl9Ci0JCi0JcHVibGljIFNlYXJjaHBhdGhFbnRyeVtdIGdldFNlYXJjaFBhdGhzKCkgewotCQlyZXR1cm4gc2VhcmNocGF0aHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaFBhdGhzKFNlYXJjaHBhdGhFbnRyeVtdIHNlYXJjaHBhdGhzKSB7Ci0JCXRoaXMuc2VhcmNocGF0aHMgPSBzZWFyY2hwYXRoczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFeHBvcnRlZCgpIHsKLQkJcmV0dXJuIGlzRXhwb3J0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElzRXhwb3J0ZWQoYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXRoaXMuaXNFeHBvcnRlZCA9IGlzRXhwb3J0ZWQ7Ci0JfQotCi0JcHVibGljIE5vZGUgd3JpdGVFbnRyeShEb2N1bWVudCBkb2MsIElQcm9qZWN0IHByb2plY3QpIHsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChzQmVhbmluZm8pOwotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKEJlYW5pbmZvc0RvYy5zS2luZCwga2luZFRvU3RyaW5nKGVudHJ5LmdldEVudHJ5S2luZCgpKSk7Ci0JCQlwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYgZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkvLyB0cmFuc2xhdGUgdG8gcHJvamVjdCByZWxhdGl2ZSBmcm9tIGFic29sdXRlICh1bmxlc3MgYSBkZXZpY2UgcGF0aCkKLQkJCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lcXVhbHMocHJvamVjdC5nZXRGdWxsUGF0aCgpLnNlZ21lbnQoMCkpKSB7Ci0JCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoID0gcGF0aC5tYWtlQWJzb2x1dGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKEJlYW5pbmZvc0RvYy5zS2luZCwga2luZFRvU3RyaW5nKEJJRV9QTFVHSU4pKTsKLQkJCXBhdGggPSBwbHVnaW5QYXRoOwotCQl9Ci0KLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNQYXRoLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc0V4cG9ydGVkKCkpIHsKLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKEJlYW5pbmZvc0RvYy5zRXhwb3J0ZWQsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNocGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVNlYXJjaHBhdGhFbnRyeSBzcGUgPSBzZWFyY2hwYXRoc1tpXTsKLQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoc3BlLndyaXRlRW50cnkoZG9jLCBwcm9qZWN0KSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhpcyBpcyBub3QgYSBwbHVnaW4gaW5mbywgdGhlbiByZXR1cm4gdGhlIGNsYXNzcGF0aCBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldENsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvbHZlZCBjbGFzc3BhdGhzLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIGVpdGhlcjoKLQkgKiAxKSBJUHJvamVjdCAtIElmIGl0IGlzIGEgcHJvamVjdCB0eXBlIGVudHJ5LiBXYW50IHRoZSB3aG9sZSBwcm9qZWN0Ci0JICogMikgU3RyaW5nIC0gYW4gYWJzb2x1dGUgZXh0ZXJuYWwgcGF0aCB0byBhIGphcgotCSAqIDMpIElQYXRoIC0gYSBwYXRoIHRvIGEgcGx1Z2luIGphci4gVGhlIGZpcnN0IHNlZ21lbnQgaXMgdGhlIHBsdWdpbiBpZCwgdGhlIHJlc3QgaXMgdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhhdCBwbHVnaW4uCi0JICogICAgICAgICAgICAKLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBwYXRocywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGF0aHMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCS8vIEl0IGlzIGEgc3RhbmRhcmQgQ1BFIEVudHJ5LgotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCUlDbGFzc3BhdGhFbnRyeSByZXNvbHZlZEVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSk7Ci0JCQlyZXNvbHZlRW50cnkocm9vdCwgcGF0aHMsIHJlc29sdmVkRW50cnksIGphdmFQcm9qZWN0KTsKLQkJCXJldHVybiBwYXRocy50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGx1Z2luUGF0aCAhPSBudWxsKSAKLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge3BsdWdpblBhdGh9OwotCQkKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVFbnRyeShJV29ya3NwYWNlUm9vdCByb290LCBMaXN0IHBhdGhzLCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJSVByb2plY3QgcmVxUHJvamVjdCA9IChJUHJvamVjdCkgcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQkvLyBQcm9qZWN0IGVudHJpZXMgb25seSBoYXZlIG9uZSBzZWdtZW50LgotCQkJCWlmIChyZXFQcm9qZWN0ICE9IG51bGwgJiYgcmVxUHJvamVjdC5pc09wZW4oKSkKLQkJCQkJcGF0aHMuYWRkKHJlcVByb2plY3QpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQlyZXFQcm9qZWN0ID0gKElQcm9qZWN0KSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCS8vIEZpbmQgcHJvamVjdCBmcm9tIHRoZSBmaXJzdCBzZWdtZW50LgotCQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShyZXFQcm9qZWN0KTsKLQkJCQlpZiAoalByb2plY3QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBqUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5maW5kTWVtYmVyKG91dHB1dExvY2F0aW9uKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJcGF0aHMuYWRkKHJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCUlSZXNvdXJjZSBsaWJyYXJ5ID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJLy8gY2FuIGJlIGV4dGVybmFsIG9yIGluIHdvcmtzcGFjZQotCQkJCXBhdGhzLmFkZCgobGlicmFyeSAhPSBudWxsKSA/IGxpYnJhcnkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpIDogZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIGphdmFQcm9qZWN0KTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXJlc29sdmVFbnRyeShyb290LCBwYXRocywgZW50cmllc1tpXSwgamF2YVByb2plY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCX0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRFbnRyeUtpbmQoKSA6IEJJRV9QTFVHSU47Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFBhdGgoKSA6IHBsdWdpblBhdGg7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJlYW5pbmZvRW50cnkpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIFJldHVybiBlcXVhbCBpZiB0aGUgY2xhc3NwYXRoIGVudHJ5IGlzIHRoZSBzYW1lIGNsYXNzcGF0aCBlbnRyeSBvciBwbHVnaW4gcGF0aCBlbnRyeS4KLQkJLy8gVGhlIHNlYXJjaCBwYXRoIGRvZXNuJ3QgaGF2ZSBhbnkgYWZmZWN0IG9uIHRoZSBzZW1hbnRpYyBlcXVhbGl0eS4KLQkJQmVhbmluZm9FbnRyeSBvdGhlckVudHJ5ID0gKEJlYW5pbmZvRW50cnkpIG90aGVyOwotCQlpZiAoaXNFeHBvcnRlZCAhPSBvdGhlckVudHJ5LmlzRXhwb3J0ZWQpCi0JCQlyZXR1cm4gZmFsc2U7CQotCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCXJldHVybiBlbnRyeS5lcXVhbHMob3RoZXJFbnRyeS5lbnRyeSk7Ci0JCQotCQlyZXR1cm4gcGx1Z2luUGF0aC5lcXVhbHMob3RoZXJFbnRyeS5wbHVnaW5QYXRoKTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGVudHJ5ICE9IG51bGwpCi0JCQlyZXR1cm4gZW50cnkuaGFzaENvZGUoKSBeIChpc0V4cG9ydGVkID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHBsdWdpblBhdGguaGFzaENvZGUoKSBeIChpc0V4cG9ydGVkID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkuaGFzaENvZGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUxMmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Db250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZy5Db250YWluZXJDb250cmlidXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uQ29udGFpbmVyUGF0aHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUgcGx1Z2luLgotICovCi0KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQkVBTklORk9fUExVR0lOSUQgPSAib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIjsJLy8gUGx1Z2luIElELCB1c2VkIGZvciBRdWFsaWZpZWROYW1lLiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQkVBTklORk9fT1ZFUlJJREVTID0gIm92ZXJyaWRlcyI7CS8vIElEIG9mIHRoZSBvdmVycmlkZXMgZXh0ZW5zaW9uIHBvaW50LiAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgQmVhbmluZm9QbHVnaW4gQkVBTklORk9fUExVR0lOID0gbnVsbDsKLQkJCi0JcHVibGljIEJlYW5pbmZvUGx1Z2luKCkgewkKLQkJQkVBTklORk9fUExVR0lOID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXNzb3IgbWV0aG9kIHRvIGdldCB0aGUgc2luZ2xldG9uIHBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIEJFQU5JTkZPX1BMVUdJTjsKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBPdmVycmlkZSBmaWxlIG5hbWUgdXNlZCB3aGVuIG5lZWQgdG8gYXBwbHkgYW4gb3ZlcnJpZGUgdG8gYSBjbGFzcyB0aGF0IGlzIGF0IHRoZSByb290LgotCSAqIEEgcm9vdCBpcyBvbmUgdGhhdCBkb2Vzbid0IGhhdmUgYSBzdXBlciB0eXBlLiBUaGVzZSBhcmUgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4sIGludGVyZmFjZXMsIGFuZCBhbnkKLQkgKiB1bmRlZmluZWQgY2xhc3NlcyAoaS5lLiBjbGFzc2VzIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZXhpc3QpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAiLi5ST09ULi4iOyAvLyROT04tTkxTLTEkCi0JCi0KLQkvKioKLQkgKiBTcGVjaWFsIG92ZXJyaWRlIHNjaGVtZSB0byByZWZlciB0byB0aGUgY3VycmVudCBqYXZhIGNsYXNzLiAoQXMgaW4gIlg6Uk9PVCMvL0Byb290IikuCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9TQ0hFTUEgPSAiWCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG92ZXJyaWRlIG9wYXF1ZSBwYXJ0IHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGphdmEgY2xhc3MuIChBcyBpbiAiWDpST09UIy8vQHJvb3QiKS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX09QQVFVRSA9ICJST09UIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gdXNlZCBvbiBhbnkgb3ZlcnJpZGUgZmlsZSB3aGVuIHlvdSBwYXNzIGluIGEgcGF0aCB0aHJvdWdoIHRoZSBtZXRob2QgdGhhdCB0YWtlcyBhIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSUklERV9FWFRFTlNJT04gPSAib3ZlcnJpZGUiOwkvLyROT04tTkxTLTEkCi0JCQotCQotCS8qCi0JICogTWFwIG9mIG9wZW4gbmF0dXJlcy4gVGhpcyBtYXAgaXMgbmVlZGVkIGJlY2F1c2Ugb24gc2h1dGRvd24gb2YgYmVhbmluZm8gcGx1Z2luIHdlIG5lZWQKLQkgKiB0byBzaHV0ZG93biB0aGUgbmF0dXJlcy4gSWYgd2UgZG9uJ3QgZG8gdGhhdCB0aGVyZSBpcyBhIHNsaWdodCBwb3NzaWJpbGl0eSBvZiBhbiBlcnJvcgotCSAqIGJlY2F1c2UgcHJveHkgcGx1Z2luIHdpbGwgc2h1dGRvd24gYW5kIHRoaXMgY2FuIGNhdXNlIGEgY2FsbGJhY2sgaW50byBiZWFuaW5mbyB3aGljaCBoYXMKLQkgKiBhbHJlYWR5IGJlZW4gc2h1dGRvd24uIEl0IGNhbGxzIGJhY2sgdGhyb3VnaCB0aGUgcmVnaXN0cnkgbGlzdGVuZXIgdGhhdCBCZWFuaW5mb05hdHVyZQotCSAqIGFkZGVkIHRvIHRoZSByZWdpc3RyeSB0byBub3RpZnkgdGhhdCB0aGUgcmVnaXN0cnkgaXMgYmVpbmcgc2h1dGRvd24uCi0JICogCi0JICogQWxzbyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlciBuZWVkcyB0byBrbm93IHNvIHRoYXQgaXQgY2FuIHRlbGwgaXQgdGhlIHByb2plY3QgaXMgY2xvc2luZyBvcgotCSAqIGJlaW5nIGRlbGV0ZWQgb3IgdGhhdCBpdCBuZWVkcyB0byBiZSBjbGVhcmVkIGR1ZSB0byBhIGNsZWFyIHJlcXVlc3QuCi0JICovCi0JcHJpdmF0ZSBNYXAgb3Blbk5hdHVyZXM7Ci0JCi0JcHJpdmF0ZSBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyBiZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9uc01hcHBpbmc7Ci0JcHJpdmF0ZSBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyBjb250cmlidXRvckNvbnRyaWJ1dGlvbnNNYXBwaW5nOwotCXByaXZhdGUgTWFwIHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnM7Ci0JcHJpdmF0ZSBNYXAgcGx1Z2luVG9Db250cmlidXRvcnM7Ci0JCi0JLyoKLQkgKiBPdmVycmlkZSBjb250cmlidXRpb25zIGZyb20gZXh0ZW5zaW9uIHBvaW50LgotCSAqIG9jRnJhZ21lbnRzOiBBcnJheSBvZiBmcmFnbWVudHMgcGF0aHMuIFdoZW4gYSBtYXRjaCBpcyBmb3VuZCBmb3IgYSBwYXRoLCB0aGUgaW5kZXgKLQkgKiAJCWlzIHRoZSBpbmRleCBpbnRvIHRoZSBvY0NvbnRhaW5lcklkcyBhbmQgb2NQbHVnaW5JZHMgYXJyYXkgZm9yIHRoZSBjb250cmlidXRpb25zLgotCSAqIG9jQ29udGFpbmVySWRzOiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSBpbmRleCBvZiB0aGUgZnJhZ21lbnQgdGhhdCB0aGUgbGlzdCBvZiBPdmVycmlkZUNvbnRyaWJ1dGlvbnMgaXMgZm9yLgotCSAqIAkJVGhlIHNlY29uZCBkaW1lbnNpb24gaXMgdGhlIGFycmF5IG9mIGNvbnRyaWJ1dGlvbnMgZm9yIHRoYXQgZnJhZ21lbnQsIG9uZSBwZXIgY29udGFpbmVyIGlkLgotCSAqIG9jUGx1Z2luSWRzOiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSBpbmRleCBvZiB0aGUgZnJhZ21lbnQgdGhhdCB0aGUgbGlzdCBvZiBPdmVycmlkZUNvbnRyaWJ1dGlvbnMgaXMgZm9yLgotCSAqIAkJVGhlIHNlY29uZCBkaW1lbnNpb24gaXMgdGhlIGFycmF5IG9mIGNvbnRyaWJ1dGlvbnMgZm9yIHRoYXQgZnJhZ21lbnQsIG9uZSBwZXIgcGx1Z2luIGlkLgotCSAqIAotCSAqIElmIGEgcGFydGljdWxhciBmcmFnbWVudCBkb2Vzbid0IGhhdmUgYW55IGVudHJpZXMgb2YgY29udGFpbmVyIGFuZC9vciBwbHVnaW4sIHRoZW4gRU1QVFlfT0MgaXMgdXNlZCBmb3IgdGhhdAotCSAqIGVudHJ5IHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgbnVsbC4KLQkgKiAKLQkgKiBIb3cgdGhpcyBpcyB1c2VkIGlzIGZvciBhIHBhcnRpY3VsYXIgcGF0aCByZXF1ZXN0ZWQsIHRoZSBvY0ZyYWdtZW50cyB3aWxsIGJlIHNlYXJjaGVkIGZvciB0aGUgZnJhZ21lbnRzIHRoYXQKLQkgKiBhcmUgYXBwcm9wcmlhdGUsIHRoZW4gdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpcyB1c2VkIHRvIHdhbGsgdGhyb3VnaCB0aGUgT0NbXSBhcnJheSByZXR1cm5lZCBmcm9tIHRoZSBvY0NvbnRhaW5lcklkcwotCSAqIG9yIG9jUGx1Z2luSWRzLiBFYWNoIGNvbnRyaWJ1dGlvbiB3b3VsZCBiZSBjaGVja2VkIHRvIHNlZSBpZiB0aGUgY29udGFpbmVyIGlkL3BsdWdpbiBpZCBpcyBpbiB0aGUgdmlzaWJsZSBjbGFzc3BhdGggKHRocm91Z2ggCi0JICogdGhlIGluZm8gZGF0YSBzdG9yZWQgaW4gdGhlIHBlcnNpc3RlbnQgcHJvcGVydHkpLiBJZiBpdCBpcywgdGhlbiB0aGUgb3ZlcnJpZGVzIGZyb20gdGhhdCBjb250cmlidXRpb24gd2lsbCBiZSB1c2VkLgotCSAqLwotCXByaXZhdGUgSVBhdGggb2NGcmFnbWVudHNbXTsKLQlwcml2YXRlIE92ZXJyaWRlQ29udHJpYnV0aW9uW11bXSBvY0NvbnRhaW5lcklkczsKLQlwcml2YXRlIE92ZXJyaWRlQ29udHJpYnV0aW9uW11bXSBvY1BsdWdpbklkczsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPdmVycmlkZUNvbnRyaWJ1dGlvbltdIEVNUFRZX09DID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uWzBdOwkvLyBVc2VkIGZvciBhbiBlbXB0eSBjb250cmlidXRpb24gbGlzdCBmb3IgYSBmcmFnbWVudC4KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQmVhbmluZm9FbnRyeVtdIGdldENvbnRhaW5lcklkQmVhbkluZm9zKFN0cmluZyBjb250YWluZXJJRCwgU3RyaW5nW10gY29udGFpbmVyUGF0aHMpIHsKLQkJaWYgKGJlYW5pbmZvRW50cnlDb250cmlidXRpb25zTWFwcGluZyA9PSBudWxsKQotCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChCZWFuaW5mb0VudHJ5W10pIGJlYW5pbmZvRW50cnlDb250cmlidXRpb25zTWFwcGluZy5nZXRDb250cmlidXRvcnMoY29udGFpbmVySUQsIGNvbnRhaW5lclBhdGhzKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBCZWFuaW5mb0VudHJ5W10gZ2V0UGx1Z2luQmVhbkluZm9zKFN0cmluZyBwbHVnaW5pZCkgewotCQlpZiAocGx1Z2luVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChCZWFuaW5mb0VudHJ5W10pIHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMuZ2V0KHBsdWdpbmlkKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRQbHVnaW5Db250cmlidXRvcnMoU3RyaW5nIHBsdWdpbmlkKSB7Ci0JCWlmIChwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgcGx1Z2luVG9Db250cmlidXRvcnMuZ2V0KHBsdWdpbmlkKTsKLQl9CQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29udGFpbmVySWRDb250cmlidXRvcnMoU3RyaW5nIGNvbnRhaW5lcklELCBTdHJpbmdbXSBjb250YWluZXJQYXRocykgewotCQlpZiAoY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZyA9PSBudWxsKQotCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgY29udHJpYnV0b3JDb250cmlidXRpb25zTWFwcGluZy5nZXRDb250cmlidXRvcnMoY29udGFpbmVySUQsIGNvbnRhaW5lclBhdGhzKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0JFQU5JTkZPX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQgPSBQSV9CRUFOSU5GT19QTFVHSU5JRCsiLnJlZ2lzdHJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfUkVHSVNUUkFUSU9OID0gInJlZ2lzdHJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GTyA9ICJiZWFuaW5mbyI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfT1ZFUlJJREUgPSAib3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ09OVFJJQlVUT1IgPSAiY29udHJpYnV0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfUEFDS0FHRSA9ICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCUNvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIGluZm8gPSBQcm94eVBsdWdpbi5wcm9jZXNzQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoUElfQkVBTklORk9fQ09OVFJJQlVUSU9OX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCUNvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyIHJlYWRlciA9IG5ldyBDb25maWd1cmF0aW9uRWxlbWVudFJlYWRlcigpOwotCQkvLyBQcm9jZXNzIHRoZSBjb250YWluZXIgSURzIGZpcnN0LiBXZSBjYW4ndCB1c2UgdGhlIGluZm8gZGlyZWN0bHkgYmVjYXVzZSB0aGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgb2YgaW50ZXJlc3QgYXJlCi0JCS8vIHN1Yi1lbGVtZW50cyBvZiB0aGUgaW5mby4gVGhlIGluZm8gY29udGFpbnMgdGhlIGNvbnRhaW5lciBwYXRoIHRoYXQgd2UgbmVlZC4KLQkJYmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnNNYXBwaW5nID0gbmV3IENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nKEJlYW5pbmZvRW50cnkuY2xhc3MpOwotCQljb250cmlidXRvckNvbnRyaWJ1dGlvbnNNYXBwaW5nID0gbmV3IENvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nKElDb25maWd1cmF0aW9uRWxlbWVudC5jbGFzcyk7Ci0KLQkJTWFwIGZyYWdtZW50c1RvSWRzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mby5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5jb250YWluZXJJZFRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5PSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBjb250YWluZXJpZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbXSBjb250cmliRWxlbWVudHMgPSAoQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnkgY29udHJpYkVsZW1lbnQgPSBjb250cmliRWxlbWVudHNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjb250cmliRWxlbWVudC5nZXRDb250cmlidXRpb24oKTsKLQkJCQlpZiAoUElfUkVHSVNUUkFUSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2pdOwotCQkJCQkJaWYgKFBJX0JFQU5JTkZPLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIGJlYW5pbmZvIGVudHJ5Ci0JCQkJCQkJQmVhbmluZm9FbnRyeSBiZSA9IEJlYW5pbmZvRW50cnkucmVhZEVudHJ5KHJlYWRlciwgY2hpbGQsIG51bGwpOwotCQkJCQkJCWlmIChiZSAhPSBudWxsKQotCQkJCQkJCQliZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9uc01hcHBpbmcuYWRkQ29udHJpYnV0aW9uKGNvbnRhaW5lcmlkLCBjb250cmliRWxlbWVudC5nZXRDb250YWluZXJQYXRoUGF0dGVybigpLCBiZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKFBJX09WRVJSSURFLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJYWRkT3ZlcnJpZGVFbnRyeShmcmFnbWVudHNUb0lkcywgdHJ1ZSwgY29udGFpbmVyaWQsIGNvbnRyaWJFbGVtZW50LmdldENvbnRhaW5lclBhdGhQYXR0ZXJuKCksIGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoUElfQ09OVFJJQlVUT1IuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQljb250cmlidXRvckNvbnRyaWJ1dGlvbnNNYXBwaW5nLmFkZENvbnRyaWJ1dGlvbihjb250YWluZXJpZCwgY29udHJpYkVsZW1lbnQuZ2V0Q29udGFpbmVyUGF0aFBhdHRlcm4oKSwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkKLQkJYmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnNNYXBwaW5nLmZpbmFsaXplTWFwcGluZygpOwotCQljb250cmlidXRvckNvbnRyaWJ1dGlvbnNNYXBwaW5nLmZpbmFsaXplTWFwcGluZygpOwotCQkKLQkJLy8gTm93IHByb2Nlc3MgdGhlIHBsdWdpbiBJRHMuCi0JCXBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcChpbmZvLnBsdWdpblRvQ29udHJpYnV0aW9ucy5zaXplKCkpOwkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluZm8ucGx1Z2luVG9Db250cmlidXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnk9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHBsdWdpbklkID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2ldOwotCQkJCWlmIChQSV9SRUdJU1RSQVRJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bal07Ci0JCQkJCQlpZiAoUElfQkVBTklORk8uZXF1YWxzKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkJCQkvLyBUaGlzIGlzIGEgYmVhbmluZm8gZW50cnkKLQkJCQkJCQlCZWFuaW5mb0VudHJ5IGJlID0gQmVhbmluZm9FbnRyeS5yZWFkRW50cnkocmVhZGVyLCBjaGlsZCwgbnVsbCk7Ci0JCQkJCQkJaWYgKGJlICE9IG51bGwpCi0JCQkJCQkJCWFkZEVudHJ5KHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMsIHBsdWdpbklkLCBiZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKFBJX09WRVJSSURFLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJYWRkT3ZlcnJpZGVFbnRyeShmcmFnbWVudHNUb0lkcywgZmFsc2UsIHBsdWdpbklkLCBudWxsLCBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFBJX0NPTlRSSUJVVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmIChwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJCQkJCXBsdWdpblRvQ29udHJpYnV0b3JzID0gbmV3IEhhc2hNYXAoNSk7CS8vIFRoZXNlIGFyZSByYXJlLCBkb24ndCBjcmVhdGUgdW50aWwgbmVjZXNzYXJ5LgotCQkJCQkJYWRkRW50cnkocGx1Z2luVG9Db250cmlidXRvcnMsIHBsdWdpbklkLCBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkvLyBOb3cgZ28gdGhyb3VnaCBhbmQgdHVybiBhbGwgb2YgdGhlIGNvbnRyaWJ1dGlvbiBsaXN0cyBpbnRvIGFycmF5cy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IEJlYW5pbmZvRW50cnlbKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS5zaXplKCldKSk7Ci0JCX0KLQkJCi0JCWlmIChwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJCXBsdWdpblRvQ29udHJpYnV0b3JzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwkvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGFueS4KLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW5Ub0NvbnRyaWJ1dG9ycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWVudHJ5LnNldFZhbHVlKCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WygoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkuc2l6ZSgpXSkpOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBOb3cgaGFuZGxlIHRoZSBlbnRpcmUgbGlzdCBvZiBmcmFnbWVudHMuCi0JCW9jRnJhZ21lbnRzID0gbmV3IElQYXRoW2ZyYWdtZW50c1RvSWRzLnNpemUoKV07Ci0JCW9jQ29udGFpbmVySWRzID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uW29jRnJhZ21lbnRzLmxlbmd0aF1bXTsKLQkJb2NQbHVnaW5JZHMgPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bb2NGcmFnbWVudHMubGVuZ3RoXVtdOwotCQlJdGVyYXRvciBpdGVyOwotCQlpbnQgZnJhZ0luZGV4OwotCQlmb3IgKGl0ZXIgPSBmcmFnbWVudHNUb0lkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCksIGZyYWdJbmRleD0wOyBpdGVyLmhhc05leHQoKTsgZnJhZ0luZGV4KyspIHsKLQkJCU1hcC5FbnRyeSBtYXBFbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJb2NGcmFnbWVudHNbZnJhZ0luZGV4XSA9IChJUGF0aCkgbWFwRW50cnkuZ2V0S2V5KCk7Ci0JCQlNYXBbXSBtYXBWYWx1ZSA9IChNYXBbXSkgbWFwRW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChtYXBWYWx1ZVswXSA9PSBudWxsKQotCQkJCW9jQ29udGFpbmVySWRzW2ZyYWdJbmRleF0gPSBFTVBUWV9PQzsKLQkJCWVsc2UgewotCQkJCU1hcCBjb250YWluZXJzID0gbWFwVmFsdWVbMF07Ci0JCQkJTGlzdCBvY0NvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBvY0l0ZXJhdG9yID0gY29udGFpbmVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IG9jSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgY29udGFpbmVyRW50cnkgPSAoTWFwLkVudHJ5KSBvY0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJU3RyaW5nIGNvbnRhaW5lcklEID0gKFN0cmluZykgY29udGFpbmVyRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgcGF0dGVybkl0ZXJhdG9yID0gKChNYXApIGNvbnRhaW5lckVudHJ5LmdldFZhbHVlKCkpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgcGF0dGVybkl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcC5FbnRyeSBwYXR0ZXJuRW50cnkgPSAoRW50cnkpIHBhdHRlcm5JdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBvYyA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbigpOwotCQkJCQkJb2MuaWQgPSBjb250YWluZXJJRDsKLQkJCQkJCW9jLnBhdHRlcm4gPSAoUGF0dGVybikgcGF0dGVybkVudHJ5LmdldEtleSgpOwotCQkJCQkJTGlzdFtdIG9jTGlzdHMgPSAoTGlzdFtdKSBwYXR0ZXJuRW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCW9jLnBsdWdpbklkcyA9IChTdHJpbmdbXSkgb2NMaXN0c1swXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1swXS5zaXplKCldKTsKLQkJCQkJCW9jLnBhdGhzID0gKFN0cmluZ1tdKSBvY0xpc3RzWzFdLnRvQXJyYXkobmV3IFN0cmluZ1tvY0xpc3RzWzFdLnNpemUoKV0pOwotCQkJCQkJb2NDb250cmlidXRpb25zLmFkZChvYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2NDb250YWluZXJJZHNbZnJhZ0luZGV4XSA9IChPdmVycmlkZUNvbnRyaWJ1dGlvbltdKSBvY0NvbnRyaWJ1dGlvbnMudG9BcnJheShuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bb2NDb250cmlidXRpb25zLnNpemUoKV0pOwotCQkJfQotCQkJaWYgKG1hcFZhbHVlWzFdID09IG51bGwpCi0JCQkJb2NQbHVnaW5JZHNbZnJhZ0luZGV4XSA9IEVNUFRZX09DOwotCQkJZWxzZSB7Ci0JCQkJTWFwIHBsdWdpbnMgPSBtYXBWYWx1ZVsxXTsKLQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbltdIG9jQ29udHJpYnV0aW9uID0gb2NQbHVnaW5JZHNbZnJhZ0luZGV4XSA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbltwbHVnaW5zLnNpemUoKV07Ci0JCQkJaW50IG9jSW5kZXg7Ci0JCQkJSXRlcmF0b3Igb2NJdGVyYXRvcjsKLQkJCQlmb3IgKG9jSXRlcmF0b3IgPSBwbHVnaW5zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKSwgb2NJbmRleD0wOyBvY0l0ZXJhdG9yLmhhc05leHQoKTsgb2NJbmRleCsrKSB7Ci0JCQkJCU1hcC5FbnRyeSBwbHVnaW5FbnRyeSA9IChNYXAuRW50cnkpIG9jSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBvYyA9IG9jQ29udHJpYnV0aW9uW29jSW5kZXhdID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uKCk7Ci0JCQkJCW9jLmlkID0gKFN0cmluZykgcGx1Z2luRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCUxpc3RbXSBvY0xpc3RzID0gKExpc3RbXSkgcGx1Z2luRW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJb2MucGx1Z2luSWRzID0gKFN0cmluZ1tdKSBvY0xpc3RzWzBdLnRvQXJyYXkobmV3IFN0cmluZ1tvY0xpc3RzWzBdLnNpemUoKV0pOwotCQkJCQlvYy5wYXRocyA9IChTdHJpbmdbXSkgb2NMaXN0c1sxXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1sxXS5zaXplKCldKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBBZGQgYW4gZW50cnkgdG8gdGhlIG1hcC4gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYW4gZW50cnkgYXMgYW4gYXJyYXkuIFRoZW4gYWRkIHRoZSBlbnRyeSB0byBhcnJheS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRW50cnkoTWFwIG1hcCwgT2JqZWN0IGtleSwgT2JqZWN0IGVudHJ5KSB7Ci0JCUxpc3QgbWFwRW50cnkgPSAoTGlzdCkgbWFwLmdldChrZXkpOwotCQlpZiAobWFwRW50cnkgPT0gbnVsbCkgewotCQkJbWFwRW50cnkgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJbWFwLnB1dChrZXksIG1hcEVudHJ5KTsKLQkJfQotCQltYXBFbnRyeS5hZGQoZW50cnkpOwotCX0KLQkKLQkvKgotCSAqIEFkZCBhbiBlbnRyeSB0byB0aGUgbWFwLgotCSAqIGlkIGlzIHRoZSBjb250YWluZXIgcGF0aCBwYXR0ZXJuL3BsdWdpbiBpZC4KLQkgKiAKLQkgKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBtYXAgaXM6Ci0JICogCWtleTogZnJhZ21lbnQgbmFtZQotCSAqIAl2YWx1ZTogTWFwWzJdLCB3aGVyZSBbMF0gaXMgZm9yIGNvbnRhaW5lciBpZCwgYW5kIFsxXSBpcyBmb3IgcGx1Z2luIGlkcy4KLQkgKiAJCU1hcFt4XToKLQkgKiAJCQlrZXk6IGNvbnRhaW5lci9wbHVnaW4gaWQKLQkgKiAJCQl2YWx1ZTogTWFwKHBhdHRlcm4tPkxpc3QoRmluYWxPdmVycmlkZSkpIGZvciBjb250YWluZXIsIG9mIEZpbmFsT3ZlcnJpZGUgZm9yIHBsdWdpbi4gCi0JICogCi0JICogRmluYWxPdmVycmlkZTogTGlzdFsyXSwgd2hlcmUgWzBdIGlzIGxpc3Qgb2YgcGx1Z2luIGlkcyBmb3IgdGhlIG92ZXJyaWRlLCBhbmQgWzFdIGlzIGxpc3Qgb2YgcGF0aHMgZm9yIHRoZSBvdmVycmlkZSBmaWxlcyByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbiBpZC4KLQkgKiAKLQkgKiBBZnRlciBhbGwgZG9uZSB0aGVzZSBtYXBzL2xpc3Qgd2lsbCBiZSBib2lsZWQgZG93biB0byB0aGUgYXJyYXlzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBsb29rdXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE92ZXJyaWRlRW50cnkoTWFwIG1hcCwgYm9vbGVhbiBjb250YWluZXIsIE9iamVjdCBpZCwgUGF0dGVybiBwYXR0ZXJuLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW50cnkpIHsKLQkJCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGVudHJ5LmdldEF0dHJpYnV0ZShQSV9QQUNLQUdFKTsKLQkJU3RyaW5nIHBsdWdpbiA9IG51bGw7Ci0JCVN0cmluZyBwYXRoU3RyaW5nID0gZW50cnkuZ2V0QXR0cmlidXRlKFBJX1BBVEgpOwotCQlJUGF0aCBmcmFnbWVudCA9IG51bGw7IAotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDAgJiYgcGF0aFN0cmluZyAhPSBudWxsICYmIHBhdGhTdHJpbmcubGVuZ3RoKCkgPiAwKSB7IAotCQkJZnJhZ21lbnQgPSBuZXcgUGF0aChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQocGF0aFN0cmluZy5sZW5ndGgoKS0xKSAhPSAnLycpCi0JCQkJcGF0aFN0cmluZyArPSAnLyc7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQoMCkgIT0gJy8nKQotCQkJCXBsdWdpbiA9IGVudHJ5LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPiA0KSB7Ci0JCQkJCWludCBwZW5kID0gcGF0aFN0cmluZy5pbmRleE9mKCcvJywgMSk7Ci0JCQkJCWlmIChwZW5kID09IC0xIHx8IHBlbmQgPj0gcGF0aFN0cmluZy5sZW5ndGgoKS0xKQotCQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQkJCXBsdWdpbiA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKDEsIHBlbmQpOwotCQkJCQlwYXRoU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocGVuZCsxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQl9Ci0JCX0KLQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0KLQkJTWFwW10gbWFwRW50cnkgPSAoTWFwW10pIG1hcC5nZXQoZnJhZ21lbnQpOwotCQlpZiAobWFwRW50cnkgPT0gbnVsbCkgewotCQkJbWFwRW50cnkgPSBuZXcgSGFzaE1hcFsyXTsKLQkJCW1hcC5wdXQoZnJhZ21lbnQsIG1hcEVudHJ5KTsKLQkJfQotCQlMaXN0W10gaWRFbnRyeTsKLQkJaWYgKGNvbnRhaW5lcikgewotCQkJaWYgKG1hcEVudHJ5WzBdID09IG51bGwpCi0JCQkJbWFwRW50cnlbMF0gPSBuZXcgSGFzaE1hcCgyKTsKLQkJCQotCQkJTWFwIHBhdHRlcm5NYXAgPSAoTWFwKSBtYXBFbnRyeVswXS5nZXQoaWQpOwotCQkJaWYgKHBhdHRlcm5NYXAgPT0gbnVsbCkKLQkJCQltYXBFbnRyeVswXS5wdXQoaWQsIHBhdHRlcm5NYXAgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQotCQkJaWRFbnRyeSA9IChMaXN0W10pIHBhdHRlcm5NYXAuZ2V0KHBhdHRlcm4pOwotCQkJaWYgKGlkRW50cnkgPT0gbnVsbCkgewotCQkJCXBhdHRlcm5NYXAucHV0KHBhdHRlcm4sIGlkRW50cnkgPSBuZXcgTGlzdFtdIHsgbmV3IEFycmF5TGlzdCgxKSwgbmV3IEFycmF5TGlzdCgxKX0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG1hcEVudHJ5WzFdID09IG51bGwpCi0JCQkJbWFwRW50cnlbMV0gPSBuZXcgSGFzaE1hcCgyKTsKLQotCQkJaWRFbnRyeSA9IChMaXN0W10pIG1hcEVudHJ5WzFdLmdldChpZCk7Ci0JCQlpZiAoaWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJbWFwRW50cnlbMV0ucHV0KGlkLCBpZEVudHJ5ID0gbmV3IExpc3RbXSB7IG5ldyBBcnJheUxpc3QoMSksIG5ldyBBcnJheUxpc3QoMSl9KTsKLQkJCX0KLQkJfQotCQlpZEVudHJ5WzBdLmFkZChwbHVnaW4pOwotCQlpZEVudHJ5WzFdLmFkZChwYXRoU3RyaW5nKTsKLQotCi0JfQkKLQkJCQotCS8qCi0JICogVGhpcyBpcyBhbiBsaXN0IG9mIG92ZXJyaWRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYXMgYSBjb250cmlidXRpb24gZm9yIGEgc3BlY2lmaWMgZnJhZ21lbnQuCi0JICogPHVsPgotCSAqIDxsaT5UaGUgaWQgb2YgdGhpcyBjb250cmlidXRpb24uIEVpdGhlciBjb250YWluZXIgKFBhdHRlcm4pIG9yIHBsdWdpbiBpZCBkZXBlbmRpbmcgb24gd2hpY2ggbGlzdCBpdCB3YXMgaW4uLgotCSAqIDxsaT5UaGUgcGx1Z2lucyBhcnJheSBsaXN0cyB0aGUgcGx1Z2luIGlkcyBmb3IgYWxsIG9mIHRoZSBwYXRocyBpbiB0aGlzIGNvbnRyaWJ1dGlvbi4KLQkgKiA8bGk+VGhlIHBhdGhzIGFycmF5IGxpc3RzIHRoZSBmb2xkZXIgcGF0aCB1bmRlciB0aGF0IGNvcnJlc3BvbmRpbmcgcGx1Z2luIGZyb20gInBsdWdpbklkcyIuCi0JICogPC91bD4gCi0JICogPHA+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3ZlcnJpZGVDb250cmlidXRpb24gewotCQlwdWJsaWMgU3RyaW5nIGlkOwotCQlwdWJsaWMgUGF0dGVybiBwYXR0ZXJuOwkvLyBVc2VkIG9ubHkgZm9yIGNvbnRhaW5lcnMuCi0JCXB1YmxpYyBTdHJpbmdbXSBwbHVnaW5JZHM7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHJ1bm5hYmxlIGlzIHRvIHVzZWQgdG8gYXBwbHkgb3ZlcnJpZGUuIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UgZm9yIGVhY2ggb3ZlcnJpZGUgcGF0aCBmb3VuZC4gSXQgaXMgc2VuZCBpbiBvbiB0aGUgYXBwbHkgb3ZlcnJpZGVzIGNhbGwuIFRoaXMKLQkgKiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gaXMgcHJpdmF0ZS4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIChpbXBsZW1lbnRlcnMgb2YgdGhlIElCZWFuSW5mb0NvbnRyaWJ1dG9yKSB3aWxsIGJlIHBhc3NlZCBpbiB0aGUgc3ViaW50ZXJmYWNlIDxjb2RlPklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGU8L2NvZGU+IHdoaWNoCi0JICogaW5oZXJpdHMgZnJvbSB0aGlzIGludGVyZmFjZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQHNlZSBCZWFuaW5mb1BsdWdpbiNhcHBseU92ZXJyaWRlcyhJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIFJlc291cmNlU2V0LCBJT3ZlcnJpZGVSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElPdmVycmlkZVJ1bm5hYmxlIHsKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZGlyZWN0b3J5IHBhdGggdG8gdXNlLiBJdCB3aWxsIGJlIGNhbGxlZCBvdmVyIGFuZCBvdmVyIGZvciBldmVyeQotCQkgKiBvdmVycmlkZSBwYXRoIGZvdW5kIGZvciBhIHBhY2thZ2UuIFRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuCi0JCSAqIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlcnVubmFibGUgaW1wbGVtZW50YXRpb24gd2lsbCB0aGVuIGFwcGVuZCB0aGUgZmlsZW5hbWUgY2FsbCAoaS5lLiBjbGFzc2JlaW5naW50cm9zcGVjdGVkLm92ZXJyaWRlKSB0byBnZXQgYSBjb21wbGV0ZSBwYXRoLgotCQkgKiA8cD4KLQkJICogQ2xpZW50cyAoSUJlYW5JbmZvQ29udHJpYnV0b3IgaW1wbGVtZW50ZXJzKSBjYW4gY2FsbCB0aGlzIHRvIGFwcGx5IGEgc3BlY2lmaWMgb3ZlcnJpZGUgZmlsZSB0byB0aGUgY3VycmVudAotCQkgKiBjbGFzcyBiZWluZyBwcm9jZXNzZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVQYXRoIHRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlIGZpbGUgbmFtZSAoY2xhc3NuYW1lLm92ZXJyaWRlKSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgYW5kIHJldHJpZXZlZCBhbmQgYXBwbGllZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYWN0dWFsIHJlc291cmNlIHRvIHVzZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBzcGVjaWFsIGNvbnRyaWJ1dG9ycyB0aGF0IHdhbnQKLQkJICogYSBzcGVjaWFsIGV4cGxpY2l0IG92ZXJyaWRlIHJlc291cmNlIHRvIGJlIHVzZWQuCi0JCSAqIDxwPgotCQkgKiBDb250cmlidXRvcnMgc2hvdWxkIHVzZSB0aGUgUmVzb3VyY2VTZXQgdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlbS4gVGhpcyBpcyBzbyB0aGF0IGFueXRoaW5nIGphdmEgY2xhc3MgdGhhdAotCQkgKiB0aGUgb3ZlcnJpZGUgcmVzb3VyY2UgcG9pbnRzIHRvIHdpbGwgYmUgZm91bmQuCi0JCSAqIDxwPgotCQkgKiBUaGlzIHJlc291cmNlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGJ5IEJlYW5JbmZvIGFmdGVyIGJlaW5nIGFwcGxpZWQuIEl0IG11c3Qgbm90IGJlIGxlZnQgYXJvdW5kIGJlY2F1c2UKLQkJICogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgYXBwbGllZCBpdCB3aWxsIGJlIG1vZGlmaWVkLCBzbyBpdCBjb3VsZCBub3QgYmUgcmV1c2VkLiAKLQkJICogIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVSZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgY2xhc3MuIE5PVEU6IFRoaXMgcmVzb3VyY2UgV0lMTCBiZSByZW1vdmVkIGZyb20KLQkJICogdGhlIHJlc291cmNlIHNldCBpdCBpcyBpbiBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgY2FsbC4gSXQgd29uJ3QgYmUgbGVmdCBhcm91bmQgYmVjYXVzZSB0aGUgYWN0aW9uIG9mIGFwcGx5Ci0JCSAqIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSByZXNvdXJjZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFJlc291cmNlIG92ZXJyaWRlUmVzKTsKLQl9Ci0JCi0JLyoqCi0JICogSUJlYW5JbmZvQ29udHJpYnV0b3IgcnVubmFibGUgdG8gdXNlIHRvIGFwcGx5IG92ZXJyaWRlcy4KLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHdpbGwgYmUgcGFzc2VkIGluIHRvIElCZWFuSW5mb0NvbnRyaWJ1dG9yJ3Mgc28gdGhhdCB0aGV5IGNhbiBjYWxsIGJhY2sgdG8gYXBwbHkgdGhlIG92ZXJyaWRlcy4gVGhleQotCSAqIHNob3VsZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBydW4gbWV0aG9kIG9uY2UgZm9yIGVhY2ggb3ZlcnJpZGUgdG8gYmUgYXBwbGllZC4gVGhlIHJ1biBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZyb20gZWFjaCBJQmVhbkluZm9Db250cmlidXRvci4KLQkgKiA8cD4KLQkgKiBJdCBpbmhlcml0cyBmcm9tIDxjb2RlPklPdmVycmlkZVJ1bm5hYmxlPC9jb2RlPiwgc28gc2VlIHRoYXQgZm9yIG1vcmUgbWV0aG9kcyB0byBjYWxsLgotCSAqIDxwPgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqIAotCSAqIEBzZWUgQmVhbmluZm9QbHVnaW4uSU92ZXJyaWRlUnVubmFibGUgZm9yIG1vcmUgbWV0aG9kcyB0aGF0IGNhbiBiZSBjYWxsZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGV4dGVuZHMgSU92ZXJyaWRlUnVubmFibGUgewotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHBhdGggaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUgSUJlYW5JbmZvQ29udHJpYnV0b3IgZm9yIG92ZXJyaWRlcyB0byB0ZXN0IGlmIHRoZSBwYXRoIChzYW1lIHBhdGggYXMgZm9yIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oU3RyaW5nKSBtZXRob2QpCi0JCSAqIGhhcyBhbHJlYWR5IGJlZW4gY29udHJpYnV0ZWQgb25jZSBmb3IgdGhpcyBjbGFzcy4gSXQgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aW1lLiBIb3dldmVyIGl0IGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgaXQgdG8gYmUgY29udHJpYnV0ZWQgbW9yZSB0aGFuIG9uY2UgZm9yIGEgY2xhc3MuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0aAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFN0cmluZykKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwYXRoQ29udHJpYnV0ZWQoU3RyaW5nIHBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHRoZSBVUkkgaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSBhbiBJQmVhbkluZm9Db250cmlidXRvciBmb3Igb3ZlcnJpZGVzIHRvIHNlZSBpZiB0aGUgVVJJIChzYW1lIHBhdGggYXMgdGhlIFVSSSBmcm9tIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oUmVzb3VyY2UpIG1ldGhvZCkKLQkJICogaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGlzIGNsYXNzLiBJdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRpbWUuIEhvd2V2ZXIsIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgdGhlIFVSSSB0byBiZSBjb250cmlidXRlZCBtb3JlIHRoYW4gb25jZSBmb3IgYSBjbGFzcy4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZVVSSQotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFJlc291cmNlKQotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fUEFUSFMgPSBuZXcgU3RyaW5nWzBdOwotCQotCS8qKgotCSAqIFJldHVybiBqdXN0IHRoZSBjb250cmlidXRlZCBvdmVycmlkZSBwYXRocyAodGhyb3VnaCB0aGUgQmVhbkluZm8gcmVnaXN0cmF0aW9ucykuIERvZXMgbm90IGluY2x1ZGUgYW55IHBhdGhzIHRoYXQgYXJlIGNvbnRyaWJ1dGVkIGZyb20KLQkgKiBJQmVhbkluZm9Db250cmlidXRvcidzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvQ2xhc3NBZGFwdGVyIHRvIGxvYWQgdGhlIG92ZXJyaWRlcyBmaWxlcyBpbnRvIG9uZSBjYWNoZSBmaWxlIHNvIHRoYXQgaXQgY2FuCi0JICogYmUgZG9uZSBhdCBvbmUgdGltZSB0aGUgbmV4dCB0aW1lIGl0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZQotCSAqIEByZXR1cm4gYXJyYXkgb2YgcGF0aCBzdHJpbmdzIHRvIHRoZSBvdmVycmlkZS4gVGhlIGZpbGVzIG1heSBub3QgZXhpc3QsIHRoZXkgaXMganVzdCBwb3NzaWJsZSBvdmVycmlkZXMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRPdmVycmlkZVBhdGhzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCUxpc3Qgb3ZlcnJpZGVQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvID0gKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbykgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoQmVhbmluZm9OYXR1cmUuQ09ORklHX0lORk9fU0VTU0lPTl9LRVkpOwotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCS8vIEl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvdXIgb3duIGludGVybmFsIHZlcnNpb24gaGVyZS4KLQkJCQlpbmZvID0gUHJveHlMYXVuY2hTdXBwb3J0LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwkJCQkJCi0JCQkJQmVhbmluZm9OYXR1cmUuY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhpbmZvKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvY0ZyYWdtZW50cyA9PSBudWxsKQotCQkJCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOyAvLyBXZSBoYXZlbid0IHByb2Nlc3NlZCB0aGVtIHlldC4KLQkJCX0KLQkJCQotCQkJLy8gQ2FjaGUgb2YgdGVzdGVkIHBhdHRlcm5zLiAoUGF0dGVybi0+Qm9vbGVhbikuIElmIGEgcGF0dGVybiBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBhbGwgdmlzaWJsZSBjb250YWluZXIgcGF0aHMgd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZQotCQkJLy8gcGF0dGVybiBhZ2FpbiBpZiBpdCBpcyBmb3VuZCBhZ2Fpbi4gKE5vdGU6IFRoaXMgd29ya3MgZm9yIGVmZmljaWVuY3kgYmVjYXVzZSBQcm94eVBsdWdpbiB1c2VzIHRoZSBzYW1lIHBhdHRlcm4gaW5zdGFuY2UgZm9yCi0JCQkvLyBzYW1lIHBhdHRlcm4gZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBvbmUgZXh0ZW5zaW9uIHBvaW50KS4gVGhlIHZhbHVlIGlzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhIHZpc2libGUgY29udGFpbmVyIHBhdGguCi0JCQlNYXAgdGVzdGVkUGF0dGVybnMgPSBuZXcgSGFzaE1hcCgpOwkKLQkJCWZvciAoaW50IGZyYWdtZW50SW5kZXggPSAwOyBmcmFnbWVudEluZGV4IDwgb2NGcmFnbWVudHMubGVuZ3RoOyBmcmFnbWVudEluZGV4KyspIHsKLQkJCQlpZiAob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0uaXNQcmVmaXhPZihwYWNrYWdlUGF0aCkpIHsKLQkJCQkJU3RyaW5nIGxlZnRPdmVyID0gbnVsbDsJLy8gVGhlIGxlZnQgb3ZlciBwb3J0aW9uIG9mIHRoZSBwYWNrYWdlLiBUaGlzIHdpbGwgYmUgc2V0IGZpcnN0IHRpbWUgbmVlZGVkLiAKLQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb25bXSBjbnRyQ29udHJpYnV0aW9ucyA9IG9jQ29udGFpbmVySWRzW2ZyYWdtZW50SW5kZXhdOwotCQkJCQlmb3IgKGludCBvY2luZGV4ID0gMDsgb2NpbmRleCA8IGNudHJDb250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBjbnRyQ29udHJpYnV0aW9uc1tvY2luZGV4XTsKLQkJCQkJCUJvb2xlYW4gdGVzdGVkID0gKEJvb2xlYW4pIHRlc3RlZFBhdHRlcm5zLmdldChjb250cmlidXRpb24ucGF0dGVybik7Ci0JCQkJCQlpZiAodGVzdGVkID09IG51bGwpIHsKLQkJCQkJCQl0ZXN0ZWQgPSBCb29sZWFuLkZBTFNFOwotCQkJCQkJCUNvbnRhaW5lclBhdGhzIGNvbnRhaW5lclBhdGhzID0gKENvbnRhaW5lclBhdGhzKSBpbmZvLmdldENvbnRhaW5lcklkcygpLmdldChjb250cmlidXRpb24uaWQpOwotCQkJCQkJCWlmIChjb250YWluZXJQYXRocyAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIHZpc2libGUgPSBjb250YWluZXJQYXRocy5nZXRWaXNpYmxlQ29udGFpbmVyUGF0aHMoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0aW9uLnBhdHRlcm4ubWF0Y2hlcih2aXNpYmxlW2ldKS5tYXRjaGVzKCkpIHsKLQkJCQkJCQkJCQl0ZXN0ZWQgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJdGVzdGVkUGF0dGVybnMucHV0KGNvbnRyaWJ1dGlvbi5wYXR0ZXJuLCB0ZXN0ZWQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAodGVzdGVkLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJZm9yIChpbnQgY2luZGV4ID0gMDsgY2luZGV4IDwgY29udHJpYnV0aW9uLnBsdWdpbklkcy5sZW5ndGg7IGNpbmRleCsrKSB7Ci0JCQkJCQkJCS8vIEJlY2F1c2Ugb2YgVVJJQ29udmVydGVycyBhbmQgbm9ybWFsaXphdGlvbiBpbiBvcmcuZWNsaXBzZS5qZW0udXRpbCBzdHVmZiwgd2UKLQkJCQkJCQkJLy8gbmVlZCB0byBoYXZlIHBsdWdpbiB1cmkncyBpbiB0aGUgZm9ybSAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5uYW1lIi4KLQkJCQkJCQkJLy8gQnVuZGxlJ3MgZG9uJ3QgcmV0dXJuIHRoaXMgZm9ybWF0LiBUaGV5IHJldHVybiBidW5kbGU6L3N0dWZmCi0JCQkJCQkJCS8vIFNvIHdlIHdpbGwgc2ltcGxlIGNyZWF0ZSBpdCBvZiB0aGUgcGxhdGZvcm06L3BsdWdpbiBmb3JtYXQuCi0JCQkJCQkJCS8vIFRvIHNhdmUgdGltZSwgd2Ugd2lsbCBmaXJzdCBzZWUgaWYgd2UgaGF2ZSB0aGUgYnVuZGxlLgotCQkJCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbnRyaWJ1dGlvbi5wbHVnaW5JZHNbY2luZGV4XSk7Ci0JCQkJCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGxlZnRPdmVyID09IG51bGwpCi0JCQkJCQkJCQkJbGVmdE92ZXIgPSBnZXRMZWZ0T3ZlcihvY0ZyYWdtZW50c1tmcmFnbWVudEluZGV4XSwgcGFja2FnZVBhdGgpOwotCQkJCQkJCQkJb3ZlcnJpZGVQYXRocy5hZGQoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTCsiOi8iK0pFTVV0aWxQbHVnaW4uUExBVEZPUk1fUExVR0lOKycvJytidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkrJy8nK2NvbnRyaWJ1dGlvbi5wYXRoc1tjaW5kZXhdK2xlZnRPdmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbltdIHBsdWdpbkNvbnRyaWJ1dGlvbnMgPSBvY1BsdWdpbklkc1tmcmFnbWVudEluZGV4XTsKLQkJCQkJZm9yIChpbnQgb2NpbmRleCA9IDA7IG9jaW5kZXggPCBwbHVnaW5Db250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBwbHVnaW5Db250cmlidXRpb25zW29jaW5kZXhdOwotCQkJCQkJQm9vbGVhbiB2aXNpYmxlID0gKEJvb2xlYW4pIGluZm8uZ2V0UGx1Z2luSWRzKCkuZ2V0KGNvbnRyaWJ1dGlvbi5pZCk7Ci0JCQkJCQlpZiAodmlzaWJsZSAhPSBudWxsICYmIHZpc2libGUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlmb3IgKGludCBjaW5kZXggPSAwOyBjaW5kZXggPCBjb250cmlidXRpb24ucGx1Z2luSWRzLmxlbmd0aDsgY2luZGV4KyspIHsKLQkJCQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShjb250cmlidXRpb24ucGx1Z2luSWRzW2NpbmRleF0pOwotCQkJCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChsZWZ0T3ZlciA9PSBudWxsKQotCQkJCQkJCQkJCWxlZnRPdmVyID0gZ2V0TGVmdE92ZXIob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0sIHBhY2thZ2VQYXRoKTsKLQkJCQkJCQkJCW92ZXJyaWRlUGF0aHMuYWRkKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wrIjovIitKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTisnLycrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKycvJytjb250cmlidXRpb24ucGF0aHNbY2luZGV4XStsZWZ0T3Zlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJyaWRlUGF0aHMuaXNFbXB0eSgpID8gTk9fUEFUSFMgOiAoU3RyaW5nW10pIG92ZXJyaWRlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW292ZXJyaWRlUGF0aHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGx5IHRoZSBydW5uYWJsZSB0byBhbGwgb2YgdGhlIG92ZXJyaWRlIHBhdGhzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIAotCSAqIGdpdmVuIHBhY2thZ2UgbmFtZS4gSXQgd2lsbCBydW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzIGFuZCB0aGUgSUNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IuCi0JICogPHA+Ci0JICogVGhlIHBhY2thZ2UgbmFtZSB1c2VzICcuJyB0byBkZWxpbmVhdGUgdGhlIGZyYWdtZW50cyBvZiB0aGUgbmFtZSwKLQkgKiBpLmUuIHVzZSAiPGNvZGU+amF2YS5sYW5nPC9jb2RlPiIgYXMgYSBwYWNrYWdlIG5hbWUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgYW4gaW50ZXJuYWwgY2xhc3MgaW4gYW5vdGhlciBwYWNrYWdlIG5lZWRzIHRvIGNhbGwgaXQuCi0JICogVE9ETyBUaGlzIHNob3VsZCBiZSBwYWNrYWdlLXByb3RlY3RlZC4gTGF0ZXIgdGhlIG90aGVyIGNsYXNzIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcnVuIGFnYWluc3QuCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lCi0JICogQHBhcmFtIGNsYXNzTmFtZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzIGJlaW5nIG92ZXJyaWRkZW4uCi0JICogQHBhcmFtIGphdmFDbGFzcyB0aGUgamF2YSBjbGFzcyB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgYXBwbGllZCB0by4KLQkgKiBAcGFyYW0gcmVzb3VyY2Ugc2V0IHRoYXQgY29udHJpYnV0b3JzIGNhbiB1c2UgdG8gdGVtcG9yYXJpbHkgbG9hZCBkeW5hbWljIG92ZXJyaWRlIGZpbGVzLgotCSAqIEBwYXJhbSBydW5uYWJsZSB1c2UgdGhpcyBydW5uYWJsZSB0byBhY3R1YWxseSBhcHBseSBvdmVycmlkZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlPdmVycmlkZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBKYXZhQ2xhc3MgamF2YUNsYXNzLCBmaW5hbCBSZXNvdXJjZVNldCByc2V0LCBmaW5hbCBJT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCXRyeSB7Ci0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbyA9IChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkNPTkZJR19JTkZPX1NFU1NJT05fS0VZKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgc28gd2UgbmVlZCB0byBjcmVhdGUgb3VyIG93biBpbnRlcm5hbCB2ZXJzaW9uIGhlcmUuCi0JCQkJaW5mbyA9IFByb3h5TGF1bmNoU3VwcG9ydC5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsJCQkJCQotCQkJCUJlYW5pbmZvTmF0dXJlLmNvbXB1dGVCZWFuSW5mb0NvbmZpZ0luZm8oaW5mbyk7Ci0JCQl9Ci0JCQlmaW5hbCBJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzID0gKElCZWFuSW5mb0NvbnRyaWJ1dG9yW10pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2NGcmFnbWVudHMgPT0gbnVsbCkKLQkJCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsgLy8gV2UgaGF2ZW4ndCBwcm9jZXNzZWQgdGhlbSB5ZXQuCi0JCQl9Ci0KLQkJCWZpbmFsIFNldCB1c2VkUGF0aHMgPSBuZXcgSGFzaFNldCgxMCk7CS8vIFNldCBvZiB1c2VkIHBhdGhzLiBTbyB0aGF0IHRoZSBjb250cmlidXRvcnMgZG9uJ3Qgc3VwcGx5IGEgcGF0aCBhbHJlYWR5IHVzZWQuIFRoaXMgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYgdGhleSBkaWQuCi0JCQlmaW5hbCBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGNvbnRyaWJSdW5uYWJsZSA9IG5ldyBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgb3ZlcnJpZGVQYXRoKSB7Ci0JCQkJCWlmICghdXNlZFBhdGhzLmNvbnRhaW5zKG92ZXJyaWRlUGF0aCkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVQYXRoKTsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihvdmVycmlkZVBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bihSZXNvdXJjZSBvdmVycmlkZVJlcykgewotCQkJCQlpZiAoIXVzZWRQYXRocy5jb250YWlucyhvdmVycmlkZVJlcy5nZXRVUkkoKSkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVSZXMuZ2V0VVJJKCkpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW5uYWJsZS5ydW4ob3ZlcnJpZGVSZXMpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlvdmVycmlkZVJlcy5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShvdmVycmlkZVJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIGJvb2xlYW4gcGF0aENvbnRyaWJ1dGVkKFN0cmluZyBwYXRoKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocGF0aCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocmVzb3VyY2VVUkkpOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCS8vIFJ1biB0aHJvdWdoIHRoZSBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElCZWFuSW5mb0NvbnRyaWJ1dG9yLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mby5nZXRDb250YWluZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgbWFwRW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBtYXBFbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUJlYW5JbmZvQ29udHJpYnV0b3IgJiYgKChCb29sZWFuKSBtYXBFbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gU3RhbmRhcmQgcnVuIGxvZ3MgdG8gLmxvZwotCQkJCQkJfQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJKChJQmVhbkluZm9Db250cmlidXRvcikgY29udGFpbmVyKS5ydW5PdmVycmlkZXMocGFja2FnZVBhdGgsIGNsYXNzTmFtZSwgamF2YUNsYXNzLCByc2V0LCBjb250cmliUnVubmFibGUpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIFJ1biB0aHJvdWdoIHRoZSBleHBsaWNpdCBjb250cmlidXRvcnMuCi0JCQlmb3IgKGludCBpPTA7IGk8ZXhwbGljaXRDb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gU3RhbmRhcmQgcnVuIGxvZ3MgdG8gLmxvZwotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJZXhwbGljaXRDb250cmlidXRvcnNbaWldLnJ1bk92ZXJyaWRlcyhwYWNrYWdlUGF0aCwgY2xhc3NOYW1lLCBqYXZhQ2xhc3MsIHJzZXQsIGNvbnRyaWJSdW5uYWJsZSk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCX0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGVmdE92ZXIoSVBhdGggZnJhZ21lbnQsIElQYXRoIHBhY2thZ2VQYXRoKSB7Ci0JCXJldHVybiBwYWNrYWdlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGZyYWdtZW50LnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkKLQkJCWxvZ2dlciA9IEVjbGlwc2VMb2dnZXIuZ2V0RWNsaXBzZUxvZ2dlcih0aGlzKTsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoYXQgYSBCZWFuSW5mbyBuYXR1cmUgaXMgYWN0aXZlLiBUaGlzIGlzIHVzZWQgdG8gdGVsbCBpdCB0byBzaHV0ZG93biB3aGVuIGJlYW5pbmZvIHNodXRzIGRvd24uCi0JICogVE9ETyA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBCZWFuSW5mb05hdHVyZSBzaG91bGQgY2FsbCBpdC4gKHB1YmxpYyBmb3Igbm93IGJ1dCB3aGVuIHdlIG1ha2UKLQkgKiBCZWFuSW5mb05hdHVyZSBhbiBBUEkgaXQgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBzYW1lIHBhY2thZ2UgYXMgQmVhbkluZm9QbHVnaW4pLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCZWFuSW5mb05hdHVyZShCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJaWYgKG9wZW5OYXR1cmVzID09IG51bGwpCi0JCQlvcGVuTmF0dXJlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9wZW5OYXR1cmVzLnB1dChuYXR1cmUuZ2V0UHJvamVjdCgpLCBuYXR1cmUpOwotCX0KLQkKLQkvKioKLQkgKiBNYXJrIHRoYXQgYSBCZWFuSW5mbyBuYXR1cmUgaXMgbm90IGFjdGl2ZS4gVGhpcyBpcyB1c2VkIHRvIHRlbGwgaXQgdG8gc2h1dGRvd24gd2hlbiBiZWFuaW5mbyBzaHV0cyBkb3duLgotCSAqIFRPRE8gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgQmVhbkluZm9OYXR1cmUgc2hvdWxkIGNhbGwgaXQuIChwdWJsaWMgZm9yIG5vdyBidXQgd2hlbiB3ZSBtYWtlCi0JICogQmVhbkluZm9OYXR1cmUgYW4gQVBJIGl0IHdpbGwgYmUgbW92ZWQgaW50byB0aGUgc2FtZSBwYWNrYWdlIGFzIEJlYW5JbmZvUGx1Z2luKS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQmVhbkluZm9OYXR1cmUoQmVhbmluZm9OYXR1cmUgbmF0dXJlKSB7Ci0JCWlmIChvcGVuTmF0dXJlcyAhPSBudWxsKQotCQkJb3Blbk5hdHVyZXMucmVtb3ZlKG5hdHVyZS5nZXRQcm9qZWN0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdGVyZWQgbmF0dXJlLCBpZiBhbnksIGZvciB0aGUgcHJvamVjdC4gVGhpcyB3aWxsIG5vdCBjYXVzZSB0aGUKLQkgKiBuYXR1cmUgdG8gYmUgY3JlYXRlZC4KLQkgKiA8cD4KLQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBuYXR1cmUgZm9yIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JQmVhbmluZm9OYXR1cmUgZ2V0TmF0dXJlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChCZWFuaW5mb05hdHVyZSkgb3Blbk5hdHVyZXMuZ2V0KHByb2plY3QpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3Blbk5hdHVyZXMgIT0gbnVsbCAmJiAhb3Blbk5hdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIG5hdHVyZUl0ciA9IG9wZW5OYXR1cmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IG5hdHVyZUl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJQmVhbmluZm9OYXR1cmUgbmF0dXJlID0gKEJlYW5pbmZvTmF0dXJlKSBuYXR1cmVJdHIubmV4dCgpOwotCQkJCW5hdHVyZS5zaHV0ZG93bigpOwotCQkJfQotCQl9Ci0JCQkKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9SZWdpc3RyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvUmVnaXN0cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2I4MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9SZWdpc3RyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIHJlZ2lzdGVyZWQgYmVhbmluZm9zIGluIHRoZSBCZWFuaW5mb1BsdWdpbi4KLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvUmVnaXN0cmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgQmVhbmluZm9zRG9jIGRvYzsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudDsJLy8gVGhpcyBpcyB1c2VkIHRvIGdldCBjb250cmlidXRvciBlbGVtZW50LiBJZiBudWxsLCB0aGVuIG5vIGNvbnRyaWJ1dG9yLgotCQotCXB1YmxpYyBCZWFuaW5mb1JlZ2lzdHJhdGlvbigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9SZWdpc3RyYXRpb24oQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MgYW5kIHZhcmlhYmxlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEJlYW5pbmZvUmVnaXN0cmF0aW9uKEJlYW5pbmZvc0RvYyBkb2MsIElDb25maWd1cmF0aW9uRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQpIHsKLQkJdGhpcy5kb2MgPSBkb2M7Ci0JCXRoaXMudmFyaWFibGVFbGVtZW50ID0gdmFyaWFibGVFbGVtZW50OwotCX0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2MuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQmVhbmluZm9zRG9jCi0JICovCi0JcHVibGljIEJlYW5pbmZvc0RvYyBnZXREb2MoKSB7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jLgotCSAqIEBwYXJhbSBkb2MgVGhlIGRvYyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2MoQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YXJpYWJsZUVsZW1lbnQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRWYXJpYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVFbGVtZW50LgotCSAqIEBwYXJhbSB2YXJpYWJsZUVsZW1lbnQgVGhlIHZhcmlhYmxlRWxlbWVudCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudCkgewotCQl0aGlzLnZhcmlhYmxlRWxlbWVudCA9IHZhcmlhYmxlRWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvc0RvYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjljODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuKjsKLS8qKgotICogQmVhbmluZm9zIGRvY3VtZW50IGluLW1lbW9yeSBmb3JtYXQuCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvc0RvYyBpbXBsZW1lbnRzIElCZWFuaW5mb3NEb2NFbnRyeSB7Ci0KLQlwcm90ZWN0ZWQgSUJlYW5pbmZvc0RvY0VudHJ5W10gc2VhcmNocGF0aDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgc0V4cG9ydGVkID0gImV4cG9ydGVkIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzS2luZCA9ICJraW5kIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzUGF0aCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEJlYW5pbmZvc0RvYygpIHsKLQl9Ci0KLQlwdWJsaWMgQmVhbmluZm9zRG9jKElCZWFuaW5mb3NEb2NFbnRyeVtdIHNlYXJjaHBhdGgpIHsKLQkJdGhpcy5zZWFyY2hwYXRoID0gc2VhcmNocGF0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiAtMTsJLy8gTi5BLgotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7CS8vIE4uQS4KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCZWFuaW5mb3NEb2MgcmVhZEVudHJ5KElSZWFkZXIgcmVhZGVyLCBPYmplY3Qgcm9vdCwgSVByb2plY3QgcHJvamVjdCkgewotCQlBcnJheUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdCBjaGlsZHJlbiA9IHJlYWRlci5nZXRDaGlsZHJlbihyb290KTsKLQkJaW50IGNoaWxkcmVuTGVuZ3RoID0gcmVhZGVyLmdldExlbmd0aChjaGlsZHJlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gcmVhZGVyLmdldEl0ZW0oY2hpbGRyZW4sIGkpOwotCQkJaWYgKHJlYWRlci5pc05vZGVUeXBlRWxlbWVudChjaGlsZCkpIHsKLQkJCQlPYmplY3QgZW50cnkgPSBudWxsOwotCQkJCWlmIChyZWFkZXIuZ2V0Tm9kZU5hbWUoY2hpbGQpLmVxdWFsc0lnbm9yZUNhc2UoQmVhbmluZm9FbnRyeS5zQmVhbmluZm8pKSB7Ci0JCQkJCWVudHJ5ID0gQmVhbmluZm9FbnRyeS5yZWFkRW50cnkocmVhZGVyLCBjaGlsZCwgcHJvamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFkZXIuZ2V0Tm9kZU5hbWUoY2hpbGQpLmVxdWFsc0lnbm9yZUNhc2UoU2VhcmNocGF0aEVudHJ5LnNTZWFyY2hwYXRoKSkgewotCQkJCQllbnRyeSA9IFNlYXJjaHBhdGhFbnRyeS5yZWFkRW50cnkocmVhZGVyLCBjaGlsZCwgcHJvamVjdCwgZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCQkJcGF0aHMuYWRkKGVudHJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IEJlYW5pbmZvc0RvYygoSUJlYW5pbmZvc0RvY0VudHJ5W10pIHBhdGhzLnRvQXJyYXkobmV3IElCZWFuaW5mb3NEb2NFbnRyeVtwYXRocy5zaXplKCldKSk7Ci0JfQotCi0JcHVibGljIElCZWFuaW5mb3NEb2NFbnRyeVtdIGdldFNlYXJjaHBhdGgoKSB7Ci0JCXJldHVybiBzZWFyY2hwYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaHBhdGgoSUJlYW5pbmZvc0RvY0VudHJ5W10gc2VhcmNocGF0aCkgewotCQl0aGlzLnNlYXJjaHBhdGggPSBzZWFyY2hwYXRoOwotCX0KLQotCXB1YmxpYyBOb2RlIHdyaXRlRW50cnkoRG9jdW1lbnQgZG9jLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KFNlYXJjaHBhdGhFbnRyeS5zU2VhcmNocGF0aCk7IC8vIENyZWF0ZSBSb290IEVsZW1lbnQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlyb290LmFwcGVuZENoaWxkKHNlYXJjaHBhdGhbaV0ud3JpdGVFbnRyeShkb2MsIHByb2plY3QpKTsgLy8gQWRkIHRvIHRoZSBkb2N1bWVudAotCQl9Ci0JCXJldHVybiByb290OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0NvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9Db25maWd1cmF0aW9uRWxlbWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZjMWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0NvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotCi0KLS8qKgotICogRm9yIHJlYWRpbmcgZnJvbSBJQ29uZmlndXJhdGlvbkVsZW1lbnRzCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWNsYXNzIENvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyIGltcGxlbWVudHMgSVJlYWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldENoaWxkcmVuKCkgOiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2dldExlbmd0aChPYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoT2JqZWN0IG5vZGVMaXN0KSB7Ci0JCXJldHVybiAobm9kZUxpc3QgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgPyBBcnJheS5nZXRMZW5ndGgobm9kZUxpc3QpIDogMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRJdGVtKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SXRlbShPYmplY3Qgbm9kZUxpc3QsIGludCBpbmRleCkgewotCQlyZXR1cm4gKG5vZGVMaXN0IGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pID8gQXJyYXkuZ2V0KG5vZGVMaXN0LCBpbmRleCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2lzTm9kZVR5cGVFbGVtZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vZGVUeXBlRWxlbWVudChPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXROb2RlTmFtZShPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0QXR0cmlidXRlKE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9JQmVhbkluZm9Db250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5JbmZvQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MDczOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9JQmVhbkluZm9Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLSAKLS8qKgotICogSW50ZXJmYWNlIGZvciBCZWFuSW5mbyBjb250cmlidXRvcnMuIFN1cHBsaWVkIGVpdGhlciBhcyBhZGRpdGlvbmFsIGludGVyZmFjZSBvbiBhIElDbGFzc3BhdGhDb250YWluZXIsIG9yIGFzCi0gKiBhbiBleHBsaWNpdCBjb250cmlidXRvciBmb3IgQmVhbkluZm9zIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVzLgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgYWxsb3dzIGEgZHluYW1pYyBzdXBwbHkgb2YgQmVhbkluZm8gY29udHJpYnV0aW9ucyAoYmVhbmluZm8gamFycyBhbmQgc2VhcmNoIHBhdGhzKQotICogYW5kIG92ZXJyaWRlIGZpbGVzLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgZGVmYXVsdCBwbHVnaW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSBpcyB0b28gc3RhdGljIGZvciB0aGUgcmVxdWlyZW1lbnRzLiAKLSAqIDxwPgotICogVGhlcmUgaXMgYSB2ZXJ5IHVzZWZ1bCBkZWZhdWx0IGltcGxlbWVudGF0aW9uICg8Y29kZT5CZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlcjwvY29kZT4pIHRoYXQgY2FuIGJlIHN1YmNsYXNzZWQuIFRoZQotICogZGVmYXVsdCBkb2Vzbid0IGRvIGFueXRoaW5nIG9uIGl0cyBvd24uIEJ1dCBpdCBkb2VzIGhhdmUgYSB2ZXJ5IHVzZWZ1bCB1dGlsaXR5IG1ldGhvZCBmb3IgbG9hZGluZyByZXNvdXJjZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuSW5mb0NvbnRyaWJ1dG9yIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEJlYW5JbmZvRW50cnkgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBCZWFuSW5mbyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGlzIGNvbnRyaWJ1dG9yIGlzIGFwcGxpY2FibGUgCi0JICogZm9yIHRoZSBjdXJyZW50IHByb2plY3QgYmVpbmcgcHJvY2Vzc2VkLiBCZWFuaW5mb0VudHJ5J3MgZGVmaW5lIHRoZSBCZWFuSW5mbyBqYXJzIGFuZCBzZWFyY2ggcGF0aHMgdG8gdXNlLgotCSAqIAotCSAqIEBwYXJhbSBpbmZvCi0JICogQHJldHVybiBCZWFuSW5mbyBjb250cmlidXRpb25zIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgdG8gY29udHJpYnV0ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9FbnRyeVtdIGdldEJlYW5JbmZvRW50cnlDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKTsKLQkKLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIHBhY2thZ2UgcGF0aCBydW4gdGhlIG92ZXJyaWRlIGNvbnRyaWJ1dGlvbnMgdGhyb3VnaCB0aGUgcnVubmFibGUuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBCZWFuSW5mbyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGlzCi0JICogY29udHJpYnV0b3IgaXMgYXBwbGljYWJsZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBiZWluZyBwcm9jZXNzZWQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB0aGUgcnVubmFibGUgKHRoZSBhcmd1bWVudCA8Y29kZT5ydW5uYWJsZTwvY29kZT4pIGZvciBlYWNoIG92ZXJyaWRlIGZpbGUgdGhhdCBpcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBpbmNvbWluZyBjbGFzcy4KLQkgKiBZb3UgY2FuIGVpdGhlciBjYWxsIHRoZSBydW4gbWV0aG9kIHRoYXQgcGFzc2VzIGluIGEgc3RyaW5nIHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHlvdXIgb3ZlcnJpZGUgZmlsZSBpcwotCSAqIGxvY2F0ZWQgKGkuZS4gPGNvZGU+b3ZlcnJpZGVGaWxlTmFtZS5vdmVycmlkZTwvY29kZT4gd2hlcmUgIm92ZXJyaWRlRmlsZU5hbWUiIGlzIHRoZSBuYW1lIHBhc3NlZC4gT3IgeW91IGNhbiBjYWxsIHRoZSBydW4gbWV0aG9kIHRoYXQgCi0JICogdGFrZXMgYSBSZXNvdXJjZSB0aGF0IGlzIGFscmVhZHkgbG9hZGVkIChhbmQgbWF5YmUgbW9kaWZpZWQgb3IgY3JlYXRlZCBsb2NhbGx5KS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZVBhdGgKLQkgKiBAcGFyYW0gb3ZlcnJpZGVGaWxlTmFtZSB0aGUgb3ZlcnJpZGVGaWxlTmFtZSB0aGF0IHRoZSBvdmVycmlkZXMgaXMgZm9yLiBUaGlzIGNhbiBiZSB1c2VkIGluIHZlcnkgc3BlY2lhbCBjYXNlcyB0byBwcm92aWRlIAotCSAqIGV4YWN0IG92ZXJyaWRlIGZpbGVzIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgcGF0aCBiZSBzZWFyY2hlZC4gQW4gZXhhbXBsZSB3b3VsZCBiZSBmb3IgcHJvdmlkaW5nIGEgZmlsZSB0aGF0IGlzbid0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzLgotCSAqIEEgdmVyeSBzcGVjaWFsIGNhc2UgaXMgPGNvZGU+Uk9PVDwvY29kZT4uIFRoaXMgaXMgdXNlZCB3aGVuIGFza2luZyB0byBhcHBseSByb290IG92ZXJyaWRlcyB0byBjbGFzc2VzIHRoYXQgaGF2ZSBubyAKLQkgKiBzdXBlciB0eXBlLiAKLQkgKiBAcGFyYW0gamF2YUNsYXNzIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhlIG92ZXJyaWRlcyB3aWxsIGJlIGFwcGxpZWQgdG8uIE5vdGU6IERvIG5vdCBjYWxsIGFueSBwcm9wZXJ0eSwgZmVhdHVyZXMsIGV2ZW50cywgb3Igb3BlcmF0aW9ucyBjYWxscwotCSAqIG9yIGFueSBwcm9wZXJ0eSwgZXZlbnRzLCBvciBvcGVyYXRpb25zIFV0aWxpdGllcyBhZ2FpbnN0IHRoaXMgY2xhc3MuIFRoYXQgaXMgYmVjYXVzZSB0aGlzIGNsYXNzIGlzIGJlaW5nIGludHJvc3BlY3RlZCBhdCB0aGlzIHRpbWUKLQkgKiBhbmQgdGhvc2UgY2FsbHMgd2lsbCByZXR1cm4gaW52YWxpZCB2YWx1ZXMgaWYgY2FsbGVkIGF0IHRoaXMgcG9pbnQgc2luY2UgaW50cm9zcGVjdGlvbiBpcyBub3QgeWV0IGNvbXBsZXRlLiAKLQkgKiBAcGFyYW0gcmVzb3VyY2Ugc2V0IHRoYXQgY29udHJpYnV0b3JzIGNhbiB1c2UgdG8gdGVtcG9yYXJpbHkgbG9hZCBkeW5hbWljIG92ZXJyaWRlIGZpbGVzLgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUgdGhhdCB5b3UgY2FsbCB0byBhY3R1YWxseSBhcHBseSB0aGUgb3ZlcnJpZGUgZmlsZXMuCi0JICogCi0JICogQHNlZSBCZWFuaW5mb1BsdWdpbiNST09UCi0JICogQHNlZSBCZWFuaW5mb1BsdWdpbiNPVkVSUklERV9FWFRFTlNJT04KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5PdmVycmlkZXMoSVBhdGggcGFja2FnZVBhdGgsIFN0cmluZyBvdmVycmlkZUZpbGVOYW1lLCBKYXZhQ2xhc3MgamF2YUNsYXNzLCBSZXNvdXJjZVNldCByc2V0LCBCZWFuaW5mb1BsdWdpbi5JQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIHJ1bm5hYmxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb1N1cHBsaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9JQmVhbmluZm9TdXBwbGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA3NWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb1N1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEludGVyZmFjZSB0byBzdXBwbHkgaW5mb3JtYXRpb24gZm9yIGJlYW5pbmZvIHRvIGRlY291cGxlCi0gKiB0aGUgaW50cm9zcGVjdGlvbiBmcm9tIHRoZSBkZXNrdG9wLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5pbmZvU3VwcGxpZXIgewotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJuIHRoZSByZWdpc3RyeSB0byB1c2UuIEluaXRpYWxpemUgaXQgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byBrbm93IGlmIHdlIGN1cnJlbnRseSBoYXZlIGEgcmVnaXN0cnkgY3JlYXRlZCBpbiB0aGUgc3VwcGxpZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVnaXN0cnkgY3VycmVudGx5IGluIHRoZSBzdXBwbGllci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpOwotCQotCS8qKgotCSAqIENsb3NlIHRoZSByZWdpc3RyeS4gVGhpcyB0ZWxscyB0aGUgcmVnaXN0cnkgdG8gY2xvc2UuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0JICogYXQgdGltZXMgYmVjYXVzZSBvZiBjaGFuZ2VzIHRvIGNsYXNzZXMgcmVxdWlyZSB0aGUgcmVnaXN0cnkgdG8gYmUKLQkgKiByZWNvbnN0cnVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlUmVnaXN0cnkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3QgdGhhdCB0aGlzIHN1cHBsaWVyIGlzIGZvci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2Ugc2V0IGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyByZXNvdXJjZSBzZXQgaXMgaG9va2VkIGludG8gdGhlCi0JICogcHJvamVjdCdzIHJlc291cmNlIHNldCBzbyB0aGF0IGFueSBzZWFyY2hlcyBmb3IgamF2YSBjbGFzc2VzLgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2Ugc2V0IHRoYXQgaXMgaG9va2VkIGludG8gdGhlIHByb2plY3QncyBqYXZhIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldE5ld1Jlc291cmNlU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0IGZvciB0aGlzIHN1cHBsaWVyLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UHJvamVjdFJlc291cmNlU2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb3NEb2NFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzkwYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgRE9NIERvYyB3cml0YWJsZSBlbnRyaWVzLgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQlwdWJsaWMgTm9kZSB3cml0ZUVudHJ5KERvY3VtZW50IGRvYywgSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JcHVibGljIGludCBnZXRLaW5kKCk7Ci0JcHVibGljIElQYXRoIGdldFBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0luaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0luaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlZmFlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9Jbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi0vKioKLSAqIFN0YXRpYyBpbml0aWFsaXplciBjbGFzcyB0byBpbml0aWFsaXplIHRoZSBiZWFuaW5mbyBzdHVmZi4KLSAqIEl0IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBkZXNrdG9wIGFuZCBzbyBkb2Vzbid0IHJlcXVpcmUgaXQuCi0gKi8KLQotcHVibGljIGNsYXNzIEluaXQgewotCQotCS8vIFNvIGl0IGNhbid0IGJlIGluc3RhbnRpYXRlZC4KLQlwcml2YXRlIEluaXQoKSB7Ci0JfTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQgd2l0aCBhbiBJQmVhbmluZm9TdXBwbGllciwgdXNlZCB0byBzZXQgdXAgdGhlCi0JICogaW50cm9zcGVjdGlvbiBwcm9jZXNzLiAKLQkgKgotCSAqIFRoZSBiZWFuaW5mbyBzdXBwbGllciBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCB0aGUgYmVhbiBpbmZvIHNlYXJjaCBwYXRoLAotCSAqIGluY2x1ZGluZyByZW1vdmluZyB0aGUgc3VuIGJlYW5pbmZvcywgaWYgZGVzaXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShSZXNvdXJjZVNldCByc2V0LCBmaW5hbCBJQmVhbmluZm9TdXBwbGllciBzdXBwbGllcikgewotCQlyc2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IEJlYW5pbmZvQWRhcHRlckZhY3Rvcnkoc3VwcGxpZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZWdpc3RyeSBub3cgdGhhdCBpdCBpcyBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy8gUmVtb3ZlIHRoZSAic3VuLmJlYW5zLmluZm8iIGZyb20gdGhlIGJlYW5pbmZvIHNlYXJjaCBwYXRoIGJlY2F1c2UKLQkJLy8gd2UgY29tcGxldGVseSBvdmVycmlkZSB0aGUgc3VuIGJlYW4gaW5mb3MuCi0JCVV0aWxpdGllcy5yZW1vdmVCZWFuSW5mb1BhdGgocmVnaXN0cnksICJzdW4uYmVhbnMuaW5mb3MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENsZWFudXAgZnJvbSB0aGUgY29udGV4dCBiZWNhdXNlIHdlIGFyZSBiZWluZyByZW1vdmVkLgotCSAqIElmIGNsZWFyUmVzdWx0cyBpcyB0cnVlLCB0aGVuIHRoZSBmYWN0b3J5IHNob3VsZCBjbGVhciB0aGUgcmVzdWx0cyBvZiBpbnRyb3NwZWN0aW9uCi0JICogZnJvbSB0aGUgZXZlcnl0aGluZyBiZWNhdXNlIHRoZSBjb250ZXh0IHdpbGwgc3RpbGwgYmUgYXJvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbnVwKFJlc291cmNlU2V0IHJzZXQsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCUJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9Ci0JCQkoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSkgRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KHJzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQlyc2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5yZW1vdmUoZmFjdG9yeSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlmYWN0b3J5LmNsb3NlQWxsKGNsZWFyUmVzdWx0cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9TZWFyY2hwYXRoRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1NlYXJjaHBhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc3ZWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1NlYXJjaHBhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLio7Ci0KLS8qKgotICogU2VhcmNocGF0aCBlbnRyeS4gQmVhbmluZm8gc2VhcmNocGF0aCBlbnRyeSAoaS5lLiBwYWNrYWdlIG5hbWUpLiBDYW4gaW5jbHVkZQotICoga2luZC9wYXRoL2V4cG9ydGVkIGlmIG5vdCBhIGNoaWxkIG9mIHRoZSBCZWFuaW5mb0VudHJ5LgotICogCi0gKiBOb3RlOiBpZiBub3QgYSBjaGlsZCBvZiBhIEJlYW5JbmZvRW50cnksIHRoZW4gdGhlIHBhdGggcmVmZXJzIHRvIGEgcGFja2FnZQotICogaW4gdGhlIGNsYXNzcGF0aCwgc28gY29udGFpbmVyIGlzIHN1cHBvcnRlZCBoZXJlLgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hwYXRoRW50cnkgaW1wbGVtZW50cyBJQmVhbmluZm9zRG9jRW50cnkgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBzU2VhcmNocGF0aCA9ICJzZWFyY2hwYXRoIjsgLy8gU2VhcmNocGF0aCBlbnRyeSwgc2hhcmVkIHdpdGggQmVhbmluZm9zRG9jLiAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBzUGFja2FnZSA9ICJwYWNrYWdlIjsgLy8gUGFja2FnZSBuYW1lLiAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbnRyeSBpbiBmcm9tIHRoZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNocGF0aEVudHJ5IHJlYWRFbnRyeShJUmVhZGVyIHJlYWRlciwgT2JqZWN0IGVsZW1lbnQsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYmVhbmluZm9DaGlsZCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIHNQYWNrYWdlKTsKLQkJaWYgKGJlYW5pbmZvQ2hpbGQpCi0JCQlyZXR1cm4gbmV3IFNlYXJjaHBhdGhFbnRyeShwYWNrYWdlTmFtZSk7IC8vIEtpbmQvcGF0aCBhcmVuJ3QgdmFsaWQgb24gYmVhbmluZm8gY2hpbGRyZW4uCi0KLQkJU3RyaW5nIGVsZW1lbnRLaW5kID0gcmVhZGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBCZWFuaW5mb3NEb2Muc0tpbmQpOwotCQlTdHJpbmcgcGF0aFN0ciA9IHJlYWRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQmVhbmluZm9zRG9jLnNQYXRoKTsKLQkJaW50IGtpbmQgPSBCZWFuaW5mb0VudHJ5LmtpbmRGcm9tU3RyaW5nKGVsZW1lbnRLaW5kKTsJCQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJaWYgKHBhdGhTdHIgIT0gbnVsbCkgewotCQkJLy8gZW5zdXJlIHBhdGggaXMgYWJzb2x1dGUKLQkJCXBhdGggPSBuZXcgUGF0aChwYXRoU3RyKTsKLQkJCWlmIChraW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYga2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJiAhcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlwYXRoID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChwYXRoKSA6IHBhdGgubWFrZUFic29sdXRlKCk7IC8vIFNvbWUgZm9sZGVyL2phciB3aXRoaW4gdGhpcyBwcm9qZWN0Ci0JCQl9Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGVudHJ5Ci0JCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCQlzd2l0Y2ggKGtpbmQpIHsKLQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCXZhbGlkID0gcGF0aCAhPSBudWxsICYmIHBhdGguaXNBYnNvbHV0ZSgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCWVsc2UgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCS8vIG11c3QgYmUgYW4gZW50cnkgaW4gdGhpcyBwcm9qZWN0IG9yIHNwZWNpZnkgYW5vdGhlciBwcm9qZWN0Ci0JCQkJCVN0cmluZyBwcm9qU2VnbWVudCA9IHBhdGguc2VnbWVudCgwKTsKLQkJCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCBwcm9qU2VnbWVudCA9PSBudWxsIHx8ICFwcm9qU2VnbWVudC5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkvLyBhbm90aGVyIHByb2plY3QKLQkJCQkJCWtpbmQgPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgkJCQkKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICh2YWxpZCkKLQkJCXJldHVybiBuZXcgU2VhcmNocGF0aEVudHJ5KGtpbmQsIHBhdGgsIHBhY2thZ2VOYW1lKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGtpbmQgPSAtMTsgLy8gVW5kZXIgQmVhbmluZm8gZW50cnksIHRoZXNlIGRvbid0IGhhdmUga2luZC9wYXRoJ3MuCi0JcHJvdGVjdGVkIElQYXRoIHBhdGg7CS8vIFBhdGggY2FuIGJlIG51bGwgaWYgdW5kZXIgYmVhbmluZm8gZW50cnkKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VOYW1lOwkvLyBQYWNrYWdlbmFtZSBjYW4gYmUgbnVsbCBpZiBraW5kL3BhdGggcmVmZXIgdG8gYSBwcm9qZWN0IG9yIHJlZ2lzdGVyZWQgdmFyaWFibGUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBvcnRlZDsKLQotCXB1YmxpYyBTZWFyY2hwYXRoRW50cnkoaW50IGtpbmQsIElQYXRoIHBhdGgsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQl0aGlzLmtpbmQgPSBraW5kOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JfQotCi0JcHVibGljIFNlYXJjaHBhdGhFbnRyeShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBwYWNrYWdlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSB3cml0ZUVudHJ5KERvY3VtZW50IGRvYywgSVByb2plY3QgcHJvamVjdCkgewotCi0JCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHNTZWFyY2hwYXRoKTsKLQkJaWYgKGtpbmQgIT0gLTEpIHsKLQkJCS8vIEEgbm9uLWJlYW5pbmZvIGNoaWxkCi0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShCZWFuaW5mb3NEb2Muc0tpbmQsIEJlYW5pbmZvRW50cnkua2luZFRvU3RyaW5nKGtpbmQpKTsKLQkJCUlQYXRoIHRQYXRoID0gcGF0aDsKLQkJCWlmIChraW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYga2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotCQkJCS8vIHRyYW5zbGF0ZSB0byBwcm9qZWN0IHJlbGF0aXZlIGZyb20gYWJzb2x1dGUgKHVubGVzcyBhIGRldmljZSBwYXRoKQotCQkJCWlmICh0UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQkJaWYgKHRQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKHByb2plY3QuZ2V0RnVsbFBhdGgoKS5zZWdtZW50KDApKSkgewotCQkJCQkJdFBhdGggPSB0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQkJdFBhdGggPSB0UGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRQYXRoID0gdFBhdGgubWFrZUFic29sdXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKEJlYW5pbmZvc0RvYy5zUGF0aCwgdFBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpCi0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShzUGFja2FnZSwgcGFja2FnZU5hbWUpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAodGhpcyA9PSBvdGhlcikKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgU2VhcmNocGF0aEVudHJ5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkKLQkJU2VhcmNocGF0aEVudHJ5IG90aGVyRW50cnkgPSAoU2VhcmNocGF0aEVudHJ5KSBvdGhlcjsKLQkJaWYgKGtpbmQgIT0gb3RoZXJFbnRyeS5raW5kKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWlmIChwYXRoID09IG51bGwpCi0JCQlpZiAob3RoZXJFbnRyeS5wYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCTsKLQkJZWxzZSBpZiAoIXBhdGguZXF1YWxzKG90aGVyRW50cnkucGF0aCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCi0JCQlpZiAob3RoZXJFbnRyeS5wYWNrYWdlTmFtZSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQk7Ci0JCWVsc2UgaWYgKCFwYWNrYWdlTmFtZS5lcXVhbHMob3RoZXJFbnRyeS5wYWNrYWdlTmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoYXNoQ29kZSA9IGtpbmQ7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQloYXNoQ29kZSBePSBwYXRoLmhhc2hDb2RlKCk7Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKQotCQkJaGFzaENvZGUgXj0gcGFja2FnZU5hbWUuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMTI5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9Qcm94eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQmVhbmluZm8gKGludHJvc3BlY3Rpb24pIHV0aWxpdGllcyBtZXRob2RzCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFV0aWxpdGllcyB7Ci0JCi0JcHJpdmF0ZSBVdGlsaXRpZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIGNsYXNzIGFzIGEgSmF2YUNsYXNzLiBJZiBpdCBhY3R1YWxseSBpcyBhIEphdmFUeXBlIHRoaXMgd2lsbAotCSAqIGZhaWwgd2l0aCBhIENsYXNzQ2FzdEV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIHJzZXQKLQkgKiBAcmV0dXJuIGphdmEgY2xhc3MKLQkgKiAKLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBub3QgYSBqYXZhIGNsYXNzLCBidXQgaW5zdGVhZCBhIGphdmEgcHJpbWl0aXZlLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSBnZXRKYXZhVHlwZShjbGFzc05hbWUsIHJzZXQpOwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHVybiB0aGUgY2xhc3MgYXMgYSBKYXZhSGVscGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIHJzZXQKLQkgKiBAcmV0dXJuIGphdmEgaGVscGVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKFN0cmluZyBjbGFzc05hbWUsIFJlc291cmNlU2V0IHJzZXQpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgcnNldC5nZXRFT2JqZWN0KGdldEphdmFDbGFzc1VSSShjbGFzc05hbWUpLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgVVJJIHRvIHRoZSBnaXZlbiBjbGFzc25hbWUuCi0JICogPHA+Ci0JICogTm90ZTogSXQgbXVzdCBiZSBpbiBub3JtYWwgZm9ybSwgaS5lLiBmdWxseS1xdWFsaWZpZWQsIGlmIHByaW1pdGl2ZSBzcGVsbGVkIG91dCAoZS5nLiAiaW50IiBub3QgSSksIGFuZCBpZgotCSAqIGFycmF5cyBpdCBtdXN0IHJlYWRhYmxlIGZvcm0gKGUuZy4gImphdmEubGFuZy5TdHJpbmdbXSIgYW5kIG5vdCAiW0xqYXZhLmxhbmcuU3RyaW5nOyIpLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0SmF2YUNsYXNzVVJJKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlVVJJKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqIAotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIHRoZSBFQ2xhc3NpZmllciBmcm9tIHRoZSBnaXZlbiBJQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVDbGFzc2lmaWVyIGdldEphdmFDbGFzcyhJQmVhblR5cGVQcm94eSB0eXBlLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRKYXZhVHlwZSh0eXBlLmdldEZvcm1hbFR5cGVOYW1lKCksIHJzZXQpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIHRoZSBNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gSU1ldGhvZFByb3h5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChJTWV0aG9kUHJveHkgbWV0aG9kLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCXJldHVybiBtZXRob2QgIT0gbnVsbCA/IChNZXRob2QpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKGdldE1ldGhvZFVSTChtZXRob2QpKSwgdHJ1ZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgVVJMIFN0cmluZyBmb3IgTWV0aG9kIGZyb20gdGhlIGdpdmVuIElNZXRob2RQcm94eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZFVSTChJTWV0aG9kUHJveHkgbWV0aG9kKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBtZXRob2QuZ2V0Q2xhc3NUeXBlKCkuZ2V0VHlwZU5hbWUoKTsKLQkJSUJlYW5UeXBlUHJveHlbXSBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlTdHJpbmdbXSBwYXJtVHlwZXMgPSBwYXJtcy5sZW5ndGggPiAwID8gbmV3IFN0cmluZ1twYXJtcy5sZW5ndGhdIDogbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJcGFybVR5cGVzW2ldID0gcGFybXNbaV0uZ2V0Rm9ybWFsVHlwZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gY29tcHV0ZU1ldGhvZFVSTChjbGFzc05hbWUsIG1ldGhvZC5nZXROYW1lKCksIHBhcm1UeXBlcyk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RVUkwoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFybVR5cGVzKSB7Ci0JCWludCBjbGFzc1N0YXJ0ID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIoNTApOwotCQl1cmwuYXBwZW5kKCJqYXZhOi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2xhc3NTdGFydCA+IC0xKQotCQkJdXJsLmFwcGVuZChmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NTdGFydCkpOwotCQl1cmwuYXBwZW5kKCcjJyk7Ci0JCXVybC5hcHBlbmQoY29tcHV0ZU1ldGhvZElEKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc1N0YXJ0ICsgMSksIG1ldGhvZE5hbWUsIHBhcm1UeXBlcykpOwotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbXB1dGVGaWVsZFVSTChTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaW50IGNsYXNzU3RhcnQgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7Ci0JCXVybC5hcHBlbmQoImphdmE6LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbGFzc1N0YXJ0ID4gLTEpCi0JCQl1cmwuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc1N0YXJ0KSk7Ci0JCXVybC5hcHBlbmQoJyMnKTsKLQkJdXJsLmFwcGVuZChmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NTdGFydCArIDEpKTsKLQkJdXJsLmFwcGVuZChSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCQl1cmwuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWVsZCB1cmkgZm9yIHRoZSBnaXZlbiBjbGFzc25hbWUsIGZpZWxkbmFtZS4KLQkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZpZWxkVVJJKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShjb21wdXRlRmllbGRVUkwoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIGZpZWxkTmFtZSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCB1cmkgZm9yIHRoZSBnaXZlbiBjbGFzc25hbWUsIG1ldGhvZG5hbWUsIHBhcm0gdHlwZXMuCi0JICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFybVR5cGVzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBwYXJtcy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0TWV0aG9kVVJJKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1UeXBlcykgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShjb21wdXRlTWV0aG9kVVJMKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJuIGl0IGludG8gYW4gVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldE1ldGhvZFVSSShJTWV0aG9kUHJveHkgbWV0aG9kKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGdldE1ldGhvZFVSTChtZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNvbXB1dGUgdGhlIEphdmEgTW9kZWxpbmcgTUVUSE9ESUQgZnJvbSBtZXRob2QgZGVjbGFyaW5nIGNsYXNzIG5hbWUsCi0JICogbWV0aG9kIG5hbWUsIGFuZCBwYXJhbWV0ZXIgY2xhc3MgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7Ci0JCW91dC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJb3V0LmFwcGVuZChSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCQlvdXQuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb3V0LmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKQotCQkJCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfUEFSTV9QQVJNX0RFTElNSVRFUik7Ci0JCQl9Ci0JCWlmIChjbGFzc05hbWUuZXF1YWxzKG1ldGhvZE5hbWUpKQotCQkJb3V0LmFwcGVuZChSZWZsZWN0aW9uQWRhcHRvci5TX0NPTlNUUlVDVE9SX1RPS0VOKTsgLy9JdCdzIGEgY29uc3RydWN0b3IKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIEJlYW5EZWNvcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuRGVjb3JhdG9yIGdldEJlYW5EZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKEJlYW5EZWNvcmF0b3IpIGdldERlY29yYXRvcihtb2RlbCwgQmVhbkRlY29yYXRvci5jbGFzcyk7Ci0JfQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgYSBkZWNvcmF0b3Igb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBbm5vdGF0aW9uIGdldERlY29yYXRvcihFTW9kZWxFbGVtZW50IG1vZGVsLCBDbGFzcyBkZWNvcmF0b3JDbGFzcykgewotCQlJdGVyYXRvciBpdHIgPSBtb2RlbC5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJRUFubm90YXRpb24gZGVjciA9IChFQW5ub3RhdGlvbikgaXRyLm5leHQoKTsKLQkJCWlmIChkZWNvcmF0b3JDbGFzcy5pc0luc3RhbmNlKGRlY3IpKQotCQkJCXJldHVybiBkZWNyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIEV2ZW50U2V0RGVjb3JhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXZlbnRTZXREZWNvcmF0b3IgZ2V0RXZlbnRTZXREZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKEV2ZW50U2V0RGVjb3JhdG9yKSBnZXREZWNvcmF0b3IobW9kZWwsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHJpZXZlIHRoZSBNZXRob2REZWNvcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2REZWNvcmF0b3IgZ2V0TWV0aG9kRGVjb3JhdG9yKEVNb2RlbEVsZW1lbnQgbW9kZWwpIHsKLQkJcmV0dXJuIChNZXRob2REZWNvcmF0b3IpIGdldERlY29yYXRvcihtb2RlbCwgTWV0aG9kRGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHJpZXZlIHRoZSBQcm9wZXJ0eURlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVjb3JhdG9yIGdldFByb3BlcnR5RGVjb3JhdG9yKEVNb2RlbEVsZW1lbnQgbW9kZWwpIHsKLQkJcmV0dXJuIChQcm9wZXJ0eURlY29yYXRvcikgZ2V0RGVjb3JhdG9yKG1vZGVsLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IGRlY29yYXRvcnMKLQkgKiBvZiBvbmx5IHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBFTGlzdCBwYXNzZWQgaW4uIElmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEKLQkgKiBwcm9wZXJ0eSBkZWNvcmF0b3IsIHRoZW4gaXQgaXMgbm90IGEgYmVhbmluZm8gcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzSXRlcmF0b3IoZmluYWwgRUxpc3QgcHJvcGVydGllcykgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJcHJpdmF0ZSBJdGVyYXRvciBpdHIgPSBwcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0JCQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCA9IHRydWU7Ci0JCQlwcml2YXRlIFByb3BlcnR5RGVjb3JhdG9yIG5leHQ7Ci0JCQl7Ci0JCQkJZmluZE5leHQoKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIGhhc05leHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQlQcm9wZXJ0eURlY29yYXRvciB0ZW1wID0gbmV4dDsKLQkJCQlmaW5kTmV4dCgpOwotCQkJCXJldHVybiB0ZW1wOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBmaW5kTmV4dCgpIHsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG5leHRPbmUgPSAoRU1vZGVsRWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCQkJbmV4dCA9IGdldFByb3BlcnR5RGVjb3JhdG9yKG5leHRPbmUpOwotCQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaGFzTmV4dCA9IGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBFdmVudFNldCBkZWNvcmF0b3JzCi0JICogb2Ygb25seSB0aGUgQmVhbkV2ZW50cyBpbiB0aGUgRUxpc3QgcGFzc2VkIGluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0RXZlbnRTZXRzSXRlcmF0b3IoZmluYWwgRUxpc3QgZXZlbnRzKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlwcml2YXRlIEl0ZXJhdG9yIGl0ciA9IGV2ZW50cy5pdGVyYXRvcigpOwotCQkJcHJpdmF0ZSBib29sZWFuIGhhc05leHQgPSB0cnVlOwotCQkJcHJpdmF0ZSBFdmVudFNldERlY29yYXRvciBuZXh0OwotCQkJewotCQkJCWZpbmROZXh0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCXJldHVybiBoYXNOZXh0OwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgdGVtcCA9IG5leHQ7Ci0JCQkJZmluZE5leHQoKTsKLQkJCQlyZXR1cm4gdGVtcDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgZmluZE5leHQoKSB7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBuZXh0T25lID0gKEVNb2RlbEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJCW5leHQgPSBnZXRFdmVudFNldERlY29yYXRvcihuZXh0T25lKTsKLQkJCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWhhc05leHQgPSBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCB3aGljaCB3aWxsIHJldHVybiB0aGUgTWV0aG9kIGRlY29yYXRvcnMKLQkgKiBvZiBvbmx5IHRoZSBNZXRob2RzIGluIHRoZSBFTGlzdCBwYXNzZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRNZXRob2RzSXRlcmF0b3IoZmluYWwgRUxpc3QgbWV0aG9kcykgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJcHJpdmF0ZSBJdGVyYXRvciBpdHIgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCA9IHRydWU7Ci0JCQlwcml2YXRlIE1ldGhvZERlY29yYXRvciBuZXh0OwotCQkJewotCQkJCWZpbmROZXh0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCXJldHVybiBoYXNOZXh0OwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJTWV0aG9kRGVjb3JhdG9yIHRlbXAgPSBuZXh0OwotCQkJCWZpbmROZXh0KCk7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIGZpbmROZXh0KCkgewotCQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbmV4dE9uZSA9IChFTW9kZWxFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJCQluZXh0ID0gZ2V0TWV0aG9kRGVjb3JhdG9yKG5leHRPbmUpOwotCQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaGFzTmV4dCA9IGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2VhcmNoIHBhdGggZnJvbSB0aGUgcmVtb3RlIHZtLiAKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIHNob3VsZG4ndCBiZSB1c2VkIHdoZW4gd29ya2luZyB3aXRoIGEgQmVhbmluZm9OYXR1cmUuIFVzZSB0aGUKLQkgKiBhY2Nlc3NvcnMgdGFraW5nIHRoZSBuYXR1cmUgIGluc3RlYWQuIE90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGluY29uc2lzdGVuY2llcyBzaW5jZSB0aGUgc2VhcmNoIHBhdGggd29uJ3QgYmUKLQkgKiBzYXZlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgdGhlIHdvcmtzcGFjZSBpZiBpdCBpcyBub3QgdXBkYXRlZCB0aHJvdWdoIHRoZSBuYXR1cmUpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFycmF5QmVhblByb3h5IGdldEJlYW5JbmZvU2VhcmNoUGF0aChQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpY29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQlpZiAoYmljb25zdGFudHMgIT0gbnVsbCkKLQkJCXJldHVybiAoSUFycmF5QmVhblByb3h5KSBiaWNvbnN0YW50cwotCQkJCS5nZXRHZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eSgpCi0JCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQludWxsKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZWFyY2ggcGF0aCB0byB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBwYXNzZWQgaW4gb24gdGhlIHJlbW90ZSB2bS4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmdbXSBwYXRocykgewotCi0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJaWYgKGJpQ29uc3RhbnRzICE9IG51bGwpIHsKLQkJCQlKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgakNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJCUlTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQkJCUlBcnJheUJlYW5Qcm94eSBuZXdQYXRoID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoakNvbnN0YW50cy5nZXRTdHJpbmdUeXBlKCksIHBhdGhzICE9IG51bGwgPyBwYXRocy5sZW5ndGggOiAwKTsKLQkJCQlpZiAocGF0aHMgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykKLQkJCQkJCW5ld1BhdGguc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHBhdGhzW2ldKSwgaSk7Ci0JCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIEJlYW5pbmZvIE5hdHVyZSwgaW5zZXJ0IGEgcGF0aCB0byB0aGUgYmVhbmluZm8gcGF0aCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIC0xIG1lYW5zIGF0IHRoZSBlbmQuCi0JICogSWYgaW5kZXggaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgcGF0aCwgaXQgd2lsbCBhbHNvIGFkZCBhdCB0aGUgZW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRCZWFuSW5mb1NlYXJjaFBhdGgoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJQmVhbmluZm9zRG9jRW50cnkgcGF0aCwgaW50IGluZGV4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUJlYW5pbmZvc0RvYyBpbmZvUGF0aCA9IG5hdHVyZS5nZXRTZWFyY2hQYXRoKCk7Ci0JCUlCZWFuaW5mb3NEb2NFbnRyeVtdIG9sZFBhdGggPSBpbmZvUGF0aC5nZXRTZWFyY2hwYXRoKCk7Ci0KLQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gbmV3UGF0aCA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbb2xkUGF0aC5sZW5ndGggKyAxXTsKLQotCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gb2xkUGF0aC5sZW5ndGgpIHsKLQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgMCwgbmV3UGF0aCwgMCwgb2xkUGF0aC5sZW5ndGgpOwotCQkJbmV3UGF0aFtvbGRQYXRoLmxlbmd0aF0gPSBwYXRoOwotCQl9IGVsc2UgewotCQkJLy8gSW4gdGhlIG1pZGRsZQotCQkJU3lzdGVtLmFycmF5Y29weShvbGRQYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmRleCk7Ci0JCQluZXdQYXRoW2luZGV4XSA9IHBhdGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBhdGgsIGluZGV4LCBuZXdQYXRoLCBpbmRleCArIDEsIG9sZFBhdGgubGVuZ3RoIC0gaW5kZXgpOwotCQl9Ci0KLQkJaW5mb1BhdGguc2V0U2VhcmNocGF0aChuZXdQYXRoKTsKLQkJbmF0dXJlLnNldFNlYXJjaFBhdGgoaW5mb1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIHBhdGggdG8gdGhlIGJlYW5pbmZvIHBhdGggYXQgdGhlIGdpdmVuIGluZGV4LCAtMSBtZWFucyBhdCB0aGUgZW5kLgotCSAqIElmIGluZGV4IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHBhdGgsIGl0IHdpbGwgYWxzbyBhZGQgYXQgdGhlIGVuZC4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGF0aCwgaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJaWYgKGJpQ29uc3RhbnRzICE9IG51bGwpIHsKLQkJCQlJQXJyYXlCZWFuUHJveHkgaW5mb1BhdGggPSAoSUFycmF5QmVhblByb3h5KSBiaUNvbnN0YW50cy5nZXRHZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eSgpLmludm9rZShudWxsKTsKLQkJCQlpbnQgcGF0aExlbmd0aCA9IGluZm9QYXRoLmdldExlbmd0aCgpOwotCQkJCUlTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQkJCUlBcnJheUJlYW5Qcm94eSBuZXdQYXRoID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5mb1BhdGguZ2V0VHlwZVByb3h5KCksIHBhdGhMZW5ndGggKyAxKTsKLQkJCQlJQmVhblByb3h5IHN0cmluZ1Byb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocGF0aCk7Ci0JCQkJSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBwYXRoTGVuZ3RoKSB7Ci0JCQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaW5mb1BhdGguZ2V0TGVuZ3RoKCkpOwotCQkJCQluZXdQYXRoLnNldChzdHJpbmdQcm94eSwgcGF0aExlbmd0aCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSW4gdGhlIG1pZGRsZQotCQkJCQljb25zdGFudHMuYXJyYXljb3B5KGluZm9QYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmRleCk7Ci0JCQkJCW5ld1BhdGguc2V0KHN0cmluZ1Byb3h5LCBpbmRleCk7Ci0JCQkJCWNvbnN0YW50cy5hcnJheWNvcHkoaW5mb1BhdGgsIGluZGV4LCBuZXdQYXRoLCBpbmRleCArIDEsIHBhdGhMZW5ndGggLSBpbmRleCk7Ci0JCQkJfQotCQkJCWJpQ29uc3RhbnRzLmdldFNldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5KCkuaW52b2tlKG51bGwsIG5ld1BhdGgpOwotCQkJfQkJCQotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGcm9tIHRoZSBCZWFuaW5mbyBOYXR1cmUsIHJlbW92ZSB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGguCi0JICogTm90IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQmVhbkluZm9QYXRoKEJlYW5pbmZvTmF0dXJlIG5hdHVyZSwgSUJlYW5pbmZvc0RvY0VudHJ5IHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQmVhbmluZm9zRG9jIGluZm9QYXRoID0gbmF0dXJlLmdldFNlYXJjaFBhdGgoKTsKLQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gb2xkUGF0aCA9IGluZm9QYXRoLmdldFNlYXJjaHBhdGgoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXRoLmVxdWFscyhvbGRQYXRoW2ldKSkgewotCQkJCS8vIFdlIGZvdW5kIGl0LCBzbyByZW1vdmUgaXQuCi0JCQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gbmV3UGF0aCA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbb2xkUGF0aC5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBhdGgsIDAsIG5ld1BhdGgsIDAsIGkpOwotCQkJCWlmIChpIDwgb2xkUGF0aC5sZW5ndGggLSAxKQotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBhdGgsIGkgKyAxLCBuZXdQYXRoLCBpLCBvbGRQYXRoLmxlbmd0aCAtIGkgLSAxKTsKLQkJCQlpbmZvUGF0aC5zZXRTZWFyY2hwYXRoKG5ld1BhdGgpOwotCQkJCW5hdHVyZS5zZXRTZWFyY2hQYXRoKGluZm9QYXRoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBwYXRoIGZyb20gdGhlIGJlYW5pbmZvIHNlYXJjaCBwYXRoLgotCSAqIE5vdCBhbiBlcnJvciBpZiBub3QgZm91bmQuCi0JICoKLQkgKiBOb3RlOiBUaGlzIHNob3VsZG4ndCBiZSB1c2VkIHdoZW4gd29ya2luZyB3aXRoIGEgQmVhbmluZm9OYXR1cmUuIFVzZSB0aGUKLQkgKiBhY2Nlc3NvcnMgdGFraW5nIHRoZSBuYXR1cmUgIGluc3RlYWQuIE90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGluY29uc2lzdGVuY2llcyBzaW5jZSB0aGUgc2VhcmNoIHBhdGggd29uJ3QgYmUKLQkgKiBzYXZlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgdGhlIHdvcmtzcGFjZSBpZiBpdCBpcyBub3QgdXBkYXRlZCB0aHJvdWdoIHRoZSBuYXR1cmUpLgkgCSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQmVhbkluZm9QYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJQmVhbmluZm9Qcm94eUNvbnN0YW50cyBiaUNvbnN0YW50cyA9IEJlYW5pbmZvUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KTsKLQkJCWlmIChiaUNvbnN0YW50cyAhPSBudWxsKSB7Ci0JCQkJSUFycmF5QmVhblByb3h5IGluZm9QYXRoID0gKElBcnJheUJlYW5Qcm94eSkgYmlDb25zdGFudHMuZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCk7Ci0JCQkJaW50IHBhdGhMZW5ndGggPSBpbmZvUGF0aC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhMZW5ndGg7IGkrKykgewotCQkJCQlJU3RyaW5nQmVhblByb3h5IGFQYXRoID0gKElTdHJpbmdCZWFuUHJveHkpIGluZm9QYXRoLmdldChpKTsKLQkJCQkJaWYgKHBhdGguZXF1YWxzKGFQYXRoLnN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkvLyBXZSBmb3VuZCBpdCwgc28gcmVtb3ZlIGl0LgotCQkJCQkJSUFycmF5QmVhblByb3h5IG5ld1BhdGggPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChpbmZvUGF0aC5nZXRUeXBlUHJveHkoKSwgcGF0aExlbmd0aCAtIDEpOwotCQkJCQkJSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaSk7Ci0JCQkJCQlpZiAoaSA8IHBhdGhMZW5ndGggLSAxKQotCQkJCQkJCWNvbnN0YW50cy5hcnJheWNvcHkoaW5mb1BhdGgsIGkgKyAxLCBuZXdQYXRoLCBpLCBwYXRoTGVuZ3RoIC0gaSAtIDEpOwotCQkJCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM0MTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotQmVhbkluZm9DYWNoZUNvbnRyb2xsZXJfSm9iX1dyaXRlQmVhbmluZm9DYWNoZV9UaXRsZT1Xcml0ZSBCZWFuSW5mbyBjYWNoZSBmaWxlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5EZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODUwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbi5JQmFzZUJlYW5JbmZvQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMgPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzTWVyZ2VTdXBlck1ldGhvZHMgPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzTWVyZ2VTdXBlckV2ZW50cyA8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzIDxlbT5JbnRyb3NwZWN0IFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzSW50cm9zcGVjdE1ldGhvZHMgPGVtPkludHJvc3BlY3QgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNJbnRyb3NwZWN0RXZlbnRzIDxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNEb0JlYW5pbmZvIDxlbT5EbyBCZWFuaW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBQcm9wZXJ0eSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgTWV0aG9kIE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIEV2ZW50IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNnZXRDdXN0b21pemVyQ2xhc3MgPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQmVhbkRlY29yYXRvckltcGwgZXh0ZW5kcyBGZWF0dXJlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEJlYW5EZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUID0gMHgxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkVBTl9NRVJHRV9JTkhFUklURURfUFJPUEVSVElFU19JTVBMSUNJVCA9IDB4Mkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJFQU5fTUVSR0VfSU5IRVJJVEVEX09QRVJBVElPTlNfSU1QTElDSVQgPSAweDRMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCRUFOX01FUkdFX0lOSEVSSVRFRF9FVkVOVFNfSU1QTElDSVQgPSAweDhMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRURFRkFVTFQgPSB0cnVlOwotCQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSA8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRyA9IDEgPDwgMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgTWVyZ2UgU3VwZXIgUHJvcGVydGllcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRyA9IDEgPDwgMTk7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyTWV0aG9kcygpIDxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVSR0VfU1VQRVJfTUVUSE9EU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJNZXRob2RzKCkgPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlck1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUcgPSAxIDw8IDIwOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIE1lcmdlIFN1cGVyIE1ldGhvZHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUcgPSAxIDw8IDIxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlckV2ZW50cygpIDxlbT5NZXJnZSBTdXBlciBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlckV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FUkdFX1NVUEVSX0VWRU5UU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJFdmVudHMoKSA8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRyA9IDEgPDwgMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgTWVyZ2UgU3VwZXIgRXZlbnRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUcgPSAxIDw8IDIzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdFByb3BlcnRpZXMoKSA8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdFByb3BlcnRpZXMoKSA8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUcgPSAxIDw8IDI0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdE1ldGhvZHMoKSA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5UUk9TUEVDVF9NRVRIT0RTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdE1ldGhvZHMoKSA8ZW0+SW50cm9zcGVjdCBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUcgPSAxIDw8IDI1OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdEV2ZW50cygpIDxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0RXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5UUk9TUEVDVF9FVkVOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRyb3NwZWN0RXZlbnRzKCkgPGVtPkludHJvc3BlY3QgRXZlbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludHJvc3BlY3RFdmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHID0gMSA8PCAyNjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RvQmVhbmluZm8oKSA8ZW0+RG8gQmVhbmluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRG9CZWFuaW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERPX0JFQU5JTkZPX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRG9CZWFuaW5mbygpIDxlbT5EbyBCZWFuaW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEb0JlYW5pbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBET19CRUFOSU5GT19FRkxBRyA9IDEgPDwgMjc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkgPGVtPk5vdCBJbmhlcml0ZWQgUHJvcGVydHkgTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSA8ZW0+Tm90IEluaGVyaXRlZCBNZXRob2QgTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBub3RJbmhlcml0ZWRNZXRob2ROYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkgPGVtPk5vdCBJbmhlcml0ZWQgRXZlbnQgTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9taXplckNsYXNzKCkgPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBjdXN0b21pemVyQ2xhc3MgPSBudWxsOwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgQmVhbkRlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRzsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRzsKLQkJZUZsYWdzIHw9IElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRzsKLQkJZUZsYWdzIHw9IElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRzsKLQkJZUZsYWdzIHw9IElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHOwotCQllRmxhZ3MgfD0gRE9fQkVBTklORk9fRUZMQUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoYm9vbGVhbiBuZXdNZXJnZVN1cGVyUHJvcGVydGllcykgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdNZXJnZVN1cGVyUHJvcGVydGllcykgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTLCBvbGRNZXJnZVN1cGVyUHJvcGVydGllcywgbmV3TWVyZ2VTdXBlclByb3BlcnRpZXMsICFvbGRNZXJnZVN1cGVyUHJvcGVydGllc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlclByb3BlcnRpZXNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VERUZBVUxUKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUc7Ci0JCWVGbGFncyAmPSB+TUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVMsIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzLCBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VERUZBVUxULCBvbGRNZXJnZVN1cGVyUHJvcGVydGllc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZVN1cGVyTWV0aG9kcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lcmdlU3VwZXJNZXRob2RzKGJvb2xlYW4gbmV3TWVyZ2VTdXBlck1ldGhvZHMpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyTWV0aG9kcyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3TWVyZ2VTdXBlck1ldGhvZHMpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRzsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyTWV0aG9kc0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUywgb2xkTWVyZ2VTdXBlck1ldGhvZHMsIG5ld01lcmdlU3VwZXJNZXRob2RzLCAhb2xkTWVyZ2VTdXBlck1ldGhvZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyTWV0aG9kcyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJNZXRob2RzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoTUVSR0VfU1VQRVJfTUVUSE9EU19FREVGQVVMVCkgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHOwotCQllRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTLCBvbGRNZXJnZVN1cGVyTWV0aG9kcywgTUVSR0VfU1VQRVJfTUVUSE9EU19FREVGQVVMVCwgb2xkTWVyZ2VTdXBlck1ldGhvZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXJnZVN1cGVyTWV0aG9kcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VTdXBlckV2ZW50cygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVyZ2VTdXBlckV2ZW50cyhib29sZWFuIG5ld01lcmdlU3VwZXJFdmVudHMpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyRXZlbnRzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld01lcmdlU3VwZXJFdmVudHMpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlckV2ZW50c0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUywgb2xkTWVyZ2VTdXBlckV2ZW50cywgbmV3TWVyZ2VTdXBlckV2ZW50cywgIW9sZE1lcmdlU3VwZXJFdmVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNZXJnZVN1cGVyRXZlbnRzKCkgewotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJFdmVudHMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJFdmVudHNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRykgIT0gMDsKLQkJaWYgKE1FUkdFX1NVUEVSX0VWRU5UU19FREVGQVVMVCkgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRzsKLQkJZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFMsIG9sZE1lcmdlU3VwZXJFdmVudHMsIE1FUkdFX1NVUEVSX0VWRU5UU19FREVGQVVMVCwgb2xkTWVyZ2VTdXBlckV2ZW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1lcmdlU3VwZXJFdmVudHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50cm9zcGVjdFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludHJvc3BlY3RQcm9wZXJ0aWVzKGJvb2xlYW4gbmV3SW50cm9zcGVjdFByb3BlcnRpZXMpIHsKLQkJYm9vbGVhbiBvbGRJbnRyb3NwZWN0UHJvcGVydGllcyA9IChlRmxhZ3MgJiBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdJbnRyb3NwZWN0UHJvcGVydGllcykgZUZsYWdzIHw9IElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfklOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVMsIG9sZEludHJvc3BlY3RQcm9wZXJ0aWVzLCBuZXdJbnRyb3NwZWN0UHJvcGVydGllcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50cm9zcGVjdE1ldGhvZHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludHJvc3BlY3RNZXRob2RzKGJvb2xlYW4gbmV3SW50cm9zcGVjdE1ldGhvZHMpIHsKLQkJYm9vbGVhbiBvbGRJbnRyb3NwZWN0TWV0aG9kcyA9IChlRmxhZ3MgJiBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdJbnRyb3NwZWN0TWV0aG9kcykgZUZsYWdzIHw9IElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfklOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFMsIG9sZEludHJvc3BlY3RNZXRob2RzLCBuZXdJbnRyb3NwZWN0TWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50cm9zcGVjdEV2ZW50cygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTlRST1NQRUNUX0VWRU5UU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRyb3NwZWN0RXZlbnRzKGJvb2xlYW4gbmV3SW50cm9zcGVjdEV2ZW50cykgewotCQlib29sZWFuIG9sZEludHJvc3BlY3RFdmVudHMgPSAoZUZsYWdzICYgSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdJbnRyb3NwZWN0RXZlbnRzKSBlRmxhZ3MgfD0gSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5JTlRST1NQRUNUX0VWRU5UU19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUywgb2xkSW50cm9zcGVjdEV2ZW50cywgbmV3SW50cm9zcGVjdEV2ZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXJDbGFzcyhKYXZhQ2xhc3MgbmV3Q3VzdG9taXplckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCWN1c3RvbWl6ZXJDbGFzcyA9IG5ld0N1c3RvbWl6ZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTLCBvbGRDdXN0b21pemVyQ2xhc3MsIGN1c3RvbWl6ZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUzoKLQkJCQlyZXR1cm4gaXNNZXJnZVN1cGVyTWV0aG9kcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFM6Ci0JCQkJcmV0dXJuIGlzTWVyZ2VTdXBlckV2ZW50cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGlzSW50cm9zcGVjdFByb3BlcnRpZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTOgotCQkJCXJldHVybiBpc0ludHJvc3BlY3RNZXRob2RzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTOgotCQkJCXJldHVybiBpc0ludHJvc3BlY3RFdmVudHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk86Ci0JCQkJcmV0dXJuIGlzRG9CZWFuaW5mbygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTOgotCQkJCXJldHVybiBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDdXN0b21pemVyQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRDdXN0b21pemVyQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVM6Ci0JCQkJc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFM6Ci0JCQkJc2V0TWVyZ2VTdXBlck1ldGhvZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUzoKLQkJCQlzZXRNZXJnZVN1cGVyRXZlbnRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVM6Ci0JCQkJc2V0SW50cm9zcGVjdFByb3BlcnRpZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUzoKLQkJCQlzZXRJbnRyb3NwZWN0TWV0aG9kcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFM6Ci0JCQkJc2V0SW50cm9zcGVjdEV2ZW50cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk86Ci0JCQkJc2V0RG9CZWFuaW5mbygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5jbGVhcigpOwotCQkJCWdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUzoKLQkJCQlzZXRDdXN0b21pemVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTOgotCQkJCXVuc2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUzoKLQkJCQl1bnNldE1lcmdlU3VwZXJNZXRob2RzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUzoKLQkJCQl1bnNldE1lcmdlU3VwZXJFdmVudHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTOgotCQkJCXNldEludHJvc3BlY3RQcm9wZXJ0aWVzKElOVFJPU1BFQ1RfUFJPUEVSVElFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUzoKLQkJCQlzZXRJbnRyb3NwZWN0TWV0aG9kcyhJTlRST1NQRUNUX01FVEhPRFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUzoKLQkJCQlzZXRJbnRyb3NwZWN0RXZlbnRzKElOVFJPU1BFQ1RfRVZFTlRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk86Ci0JCQkJc2V0RG9CZWFuaW5mbyhET19CRUFOSU5GT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUzoKLQkJCQlzZXRDdXN0b21pemVyQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0R2VuKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZGV0YWlscyAhPSBudWxsICYmICFkZXRhaWxzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiByZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gQ0FURUdPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGVnb3J5ICE9IG51bGwgOiAhQ0FURUdPUllfRURFRkFVTFQuZXF1YWxzKGNhdGVnb3J5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcmVmZXJyZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzICE9IElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGlzU2V0TWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTOgotCQkJCXJldHVybiBpc1NldE1lcmdlU3VwZXJNZXRob2RzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTOgotCQkJCXJldHVybiBpc1NldE1lcmdlU3VwZXJFdmVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwKSAhPSBJTlRST1NQRUNUX1BST1BFUlRJRVNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRykgIT0gMCkgIT0gSU5UUk9TUEVDVF9NRVRIT0RTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHKSAhPSAwKSAhPSBJTlRST1NQRUNUX0VWRU5UU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBET19CRUFOSU5GT19FRkxBRykgIT0gMCkgIT0gRE9fQkVBTklORk9fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUzoKLQkJCQlyZXR1cm4gbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyAhPSBudWxsICYmICFub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUzoKLQkJCQlyZXR1cm4gbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgIT0gbnVsbCAmJiAhbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVM6Ci0JCQkJcmV0dXJuIG5vdEluaGVyaXRlZEV2ZW50TmFtZXMgIT0gbnVsbCAmJiAhbm90SW5oZXJpdGVkRXZlbnROYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUzoKLQkJCQlyZXR1cm4gY3VzdG9taXplckNsYXNzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtZXJnZVN1cGVyUHJvcGVydGllczogIik7Ci0JCWlmICgoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lcmdlU3VwZXJNZXRob2RzOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVyZ2VTdXBlckV2ZW50czogIik7Ci0JCWlmICgoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRyb3NwZWN0UHJvcGVydGllczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW50cm9zcGVjdE1ldGhvZHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludHJvc3BlY3RFdmVudHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBJTlRST1NQRUNUX0VWRU5UU19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZG9CZWFuaW5mbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIERPX0JFQU5JTkZPX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RJbmhlcml0ZWRNZXRob2ROYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90SW5oZXJpdGVkTWV0aG9kTmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdEluaGVyaXRlZEV2ZW50TmFtZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdEluaGVyaXRlZEV2ZW50TmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0Q3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gY3VzdG9taXplckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9CZWFuaW5mbygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBET19CRUFOSU5GT19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb0JlYW5pbmZvKGJvb2xlYW4gbmV3RG9CZWFuaW5mbykgewotCQlib29sZWFuIG9sZERvQmVhbmluZm8gPSAoZUZsYWdzICYgRE9fQkVBTklORk9fRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdEb0JlYW5pbmZvKSBlRmxhZ3MgfD0gRE9fQkVBTklORk9fRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5ET19CRUFOSU5GT19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTywgb2xkRG9CZWFuaW5mbywgbmV3RG9CZWFuaW5mbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkgewotCQlpZiAobm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyA9PSBudWxsKSB7Ci0JCQlub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSB7Ci0JCWlmIChub3RJbmhlcml0ZWRNZXRob2ROYW1lcyA9PSBudWxsKSB7Ci0JCQlub3RJbmhlcml0ZWRNZXRob2ROYW1lcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBub3RJbmhlcml0ZWRNZXRob2ROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpIHsKLQkJaWYgKG5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPT0gbnVsbCkgewotCQkJbm90SW5oZXJpdGVkRXZlbnROYW1lcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIG5vdEluaGVyaXRlZEV2ZW50TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCWlmIChjdXN0b21pemVyQ2xhc3MgIT0gbnVsbCAmJiBjdXN0b21pemVyQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZEN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKLQkJCWN1c3RvbWl6ZXJDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWN1c3RvbWl6ZXJDbGFzcyk7Ci0JCQlpZiAoY3VzdG9taXplckNsYXNzICE9IG9sZEN1c3RvbWl6ZXJDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUywgb2xkQ3VzdG9taXplckNsYXNzLCBjdXN0b21pemVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3VzdG9taXplckNsYXNzOwotCX0KLQotCXByaXZhdGUgVVJMIGljb25VUkw7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1F1ZXJpZWRJY29uVVJMOwotCQotCXB1YmxpYyBVUkwgZ2V0SWNvblVSTCgpewotCQlpZiAoIWhhc1F1ZXJpZWRJY29uVVJMKXsKLQkJCUZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSB2YWx1ZSA9IChGZWF0dXJlQXR0cmlidXRlVmFsdWUpIGdldEF0dHJpYnV0ZXMoKS5nZXQoSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5JQ09OQ09MT1IxNlgxNlVSTCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAKLQkJCQkvLyBHZXQgdGhlIHZhbHVlCi0JCQkJT2JqZWN0IGF0dHIgPSB2YWx1ZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChhdHRyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloYXNRdWVyaWVkSWNvblVSTCA9IHRydWU7Ci0JCQkJCQlpY29uVVJMID0gbmV3IFVSTCgoU3RyaW5nKSBhdHRyKTsKLQkJCQkJfSBjYXRjaCAoIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKSB7Ci0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZXhjLCBMZXZlbC5JTkZPKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gaWNvblVSTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuRXZlbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiN2U1ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUV2ZW50SW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbkV2ZW50SW1wbCBleHRlbmRzIEphdmFFdmVudEltcGwgaW1wbGVtZW50cyBCZWFuRXZlbnR7Ci0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbkV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5MaXRlcmFscy5CRUFOX0VWRU5UOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDczZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5pbmZvRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBCZWFuaW5mb0ZhY3Rvcnl7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuaW5mb0ZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUJlYW5pbmZvRmFjdG9yeSB0aGVCZWFuaW5mb0ZhY3RvcnkgPSAoQmVhbmluZm9GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9iZWFuaW5mby5lY29yZSIpOyAKLQkJCWlmICh0aGVCZWFuaW5mb0ZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVCZWFuaW5mb0ZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgQmVhbmluZm9GYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXB1YmxpYyBCZWFuaW5mb0ZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUZlYXR1cmVEZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlQmVhbkRlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlTWV0aG9kRGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlUGFyYW1ldGVyRGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWTogcmV0dXJuIGNyZWF0ZU1ldGhvZFByb3h5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UOiByZXR1cm4gY3JlYXRlQmVhbkV2ZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTVBMSUNJVF9JVEVNOgotCQkJCXJldHVybiBjcmVhdGVJbXBsaWNpdEl0ZW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX1ZBTFVFOgotCQkJCXJldHVybiBjcmVhdGVGZWF0dXJlQXR0cmlidXRlVmFsdWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTVBMSUNJVF9JVEVNOgotCQkJCXJldHVybiBjb252ZXJ0SW1wbGljaXRJdGVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX1ZBTFVFOgotCQkJCXJldHVybiBjb252ZXJ0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEZlYXR1cmVEZWNvcmF0b3IgY3JlYXRlRmVhdHVyZURlY29yYXRvcigpIHsKLQkJRmVhdHVyZURlY29yYXRvckltcGwgZmVhdHVyZURlY29yYXRvciA9IG5ldyBGZWF0dXJlRGVjb3JhdG9ySW1wbCgpOwotCQlmZWF0dXJlRGVjb3JhdG9yLnNldFNvdXJjZShGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmZWF0dXJlRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEV2ZW50U2V0RGVjb3JhdG9yIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCkgewotCQlFdmVudFNldERlY29yYXRvckltcGwgZXZlbnRTZXREZWNvcmF0b3IgPSBuZXcgRXZlbnRTZXREZWNvcmF0b3JJbXBsKCk7Ci0JCWV2ZW50U2V0RGVjb3JhdG9yLnNldFNvdXJjZShFdmVudFNldERlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gZXZlbnRTZXREZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFByb3h5IGNyZWF0ZU1ldGhvZFByb3h5KCkgewotCQlNZXRob2RQcm94eUltcGwgbWV0aG9kUHJveHkgPSBuZXcgTWV0aG9kUHJveHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcigpIHsKLQkJUHJvcGVydHlEZWNvcmF0b3JJbXBsIHByb3BlcnR5RGVjb3JhdG9yID0gbmV3IFByb3BlcnR5RGVjb3JhdG9ySW1wbCgpOwotCQlwcm9wZXJ0eURlY29yYXRvci5zZXRTb3VyY2UoUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHByb3BlcnR5RGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBjcmVhdGVJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKSB7Ci0JCUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwgaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yID0gbmV3IEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwoKTsKLQkJaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLnNldFNvdXJjZShJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBCZWFuRGVjb3JhdG9yIGNyZWF0ZUJlYW5EZWNvcmF0b3IoKSB7Ci0JCUJlYW5EZWNvcmF0b3JJbXBsIGJlYW5EZWNvcmF0b3IgPSBuZXcgQmVhbkRlY29yYXRvckltcGwoKTsKLQkJYmVhbkRlY29yYXRvci5zZXRTb3VyY2UoQmVhbkRlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gYmVhbkRlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBNZXRob2REZWNvcmF0b3IgY3JlYXRlTWV0aG9kRGVjb3JhdG9yKCkgewotCQlNZXRob2REZWNvcmF0b3JJbXBsIG1ldGhvZERlY29yYXRvciA9IG5ldyBNZXRob2REZWNvcmF0b3JJbXBsKCk7Ci0JCW1ldGhvZERlY29yYXRvci5zZXRTb3VyY2UoTWV0aG9kRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBtZXRob2REZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyRGVjb3JhdG9yIGNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpIHsKLQkJUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCBwYXJhbWV0ZXJEZWNvcmF0b3IgPSBuZXcgUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCgpOwotCQlwYXJhbWV0ZXJEZWNvcmF0b3Iuc2V0U291cmNlKFBhcmFtZXRlckRlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gcGFyYW1ldGVyRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCZWFuaW5mb1BhY2thZ2UgZ2V0QmVhbmluZm9QYWNrYWdlKCkgewotCQlyZXR1cm4gKEJlYW5pbmZvUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuaW5mb1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5FdmVudCBjcmVhdGVCZWFuRXZlbnQoKSB7Ci0JCUJlYW5FdmVudEltcGwgYmVhbkV2ZW50ID0gbmV3IEJlYW5FdmVudEltcGwoKTsKLQkJcmV0dXJuIGJlYW5FdmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwLkVudHJ5IGNyZWF0ZUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpIHsKLQkJRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCBmZWF0dXJlQXR0cmlidXRlTWFwRW50cnkgPSBuZXcgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCgpOwotCQlyZXR1cm4gZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbXBsaWNpdEl0ZW0gY3JlYXRlSW1wbGljaXRJdGVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUltcGxpY2l0SXRlbSByZXN1bHQgPSBJbXBsaWNpdEl0ZW0uZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEltcGxpY2l0SXRlbVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBjcmVhdGVGZWF0dXJlQXR0cmlidXRlVmFsdWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuaW5mb1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuaW5mb1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGRmNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBCZWFuaW5mb1BhY2thZ2V7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmVhdHVyZURlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiZWFuRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZERlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFByb3h5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJlYW5FdmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBpbXBsaWNpdEl0ZW1FRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBmZWF0dXJlQXR0cmlidXRlVmFsdWVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQmVhbmluZm9QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQmVhbmluZm9QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEJlYW5pbmZvUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUJlYW5pbmZvUGFja2FnZUltcGwgdGhlQmVhbmluZm9QYWNrYWdlID0gKEJlYW5pbmZvUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQmVhbmluZm9QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEJlYW5pbmZvUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQmVhbmluZm9QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQmVhbmluZm9QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUJlYW5pbmZvUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQmVhbmluZm9QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmVhdHVyZURlY29yYXRvcigpIHsKLQkJcmV0dXJuIGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9EaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX1Nob3J0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0V4cGVydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX1ByZWZlcnJlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX01lcmdlSW50cm9zcGVjdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXRseVNldEJpdHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdERlY29yYXRvckZsYWcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV2ZW50U2V0RGVjb3JhdG9yKCkgewotCQlyZXR1cm4gZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXZlbnRTZXREZWNvcmF0b3JfSW5EZWZhdWx0RXZlbnRTZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1VuaWNhc3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9TZXJMaXN0TXRoZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQcm94eSgpIHsKLQkJcmV0dXJuIG1ldGhvZFByb3h5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFByb3h5X01ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFByb3h5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eURlY29yYXRvcigpIHsKLQkJcmV0dXJuIHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRGVzaWduVGltZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfQWx3YXlzSW5jb21wYXRpYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWx0ZXJGbGFncygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfUmVhZE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpIHsKLQkJcmV0dXJuIGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFJlYWRNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFdyaXRlTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCZWFuRGVjb3JhdG9yKCkgewotCQlyZXR1cm4gYmVhbkRlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlck1ldGhvZHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyRXZlbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0TWV0aG9kcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RFdmVudHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QmVhbkRlY29yYXRvcl9DdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRGVjb3JhdG9yKCkgewotCQlyZXR1cm4gbWV0aG9kRGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZERlY29yYXRvcl9QYXJtc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2REZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2REZWNvcmF0b3JfUGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2REZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2REZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhcmFtZXRlckRlY29yYXRvcigpIHsKLQkJcmV0dXJuIHBhcmFtZXRlckRlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFtZXRlckRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZmVhdHVyZUF0dHJpYnV0ZVZhbHVlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCZWFuaW5mb0ZhY3RvcnkgZ2V0QmVhbmluZm9GYWN0b3J5KCkgewotCQlyZXR1cm4gKEJlYW5pbmZvRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZFQVRVUkVfREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUyk7Ci0KLQkJYmVhbkRlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCRUFOX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19ET19CRUFOSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTKTsKLQotCQlldmVudFNldERlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFVkVOVF9TRVRfREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRCk7Ci0KLQkJbWV0aG9kRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZERlY29yYXRvckVDbGFzcywgTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZERlY29yYXRvckVDbGFzcywgTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2REZWNvcmF0b3JFQ2xhc3MsIE1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0MpOwotCi0JCXBhcmFtZXRlckRlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQVJBTUVURVJfREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MsIFBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFtZXRlckRlY29yYXRvckVDbGFzcywgUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSKTsKLQotCQlwcm9wZXJ0eURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWV9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEKTsKLQotCQlpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcywgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcywgSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9EKTsKLQotCQltZXRob2RQcm94eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUFJPWFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFByb3h5RUNsYXNzLCBNRVRIT0RfUFJPWFlfX01FVEhPRCk7Ci0KLQkJYmVhbkV2ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJFQU5fRVZFTlQpOwotCi0JCWZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcywgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcywgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRSk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWltcGxpY2l0SXRlbUVFbnVtID0gY3JlYXRlRUVudW0oSU1QTElDSVRfSVRFTSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJZmVhdHVyZUF0dHJpYnV0ZVZhbHVlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEZFQVRVUkVfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBbm5vdGF0aW9uKCkpOwotCQliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmVhdHVyZURlY29yYXRvcigpKTsKLQkJZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQltZXRob2REZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQlwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVEZWNvcmF0b3IoKSk7Ci0JCWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb3BlcnR5RGVjb3JhdG9yKCkpOwotCQltZXRob2RQcm94eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RU9wZXJhdGlvbigpKTsKLQkJYmVhbkV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFFdmVudCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICJGZWF0dXJlRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9TaG9ydERlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaG9ydERlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjYXRlZ29yeSIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfRXhwZXJ0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXhwZXJ0IiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImhpZGRlbiIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9QcmVmZXJyZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcmVmZXJyZWQiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWVyZ2VJbnRyb3NwZWN0aW9uIiwgInRydWUiLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0bHlTZXRCaXRzKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAiaW1wbGljaXRseVNldEJpdHMiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0RGVjb3JhdG9yRmxhZygpLCB0aGlzLmdldEltcGxpY2l0SXRlbSgpLCAiaW1wbGljaXREZWNvcmF0b3JGbGFnIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24oZmVhdHVyZURlY29yYXRvckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldE5hbWUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICJCZWFuRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJQcm9wZXJ0aWVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWVyZ2VTdXBlclByb3BlcnRpZXMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyTWV0aG9kcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm1lcmdlU3VwZXJNZXRob2RzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlckV2ZW50cygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm1lcmdlU3VwZXJFdmVudHMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0UHJvcGVydGllcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImludHJvc3BlY3RQcm9wZXJ0aWVzIiwgInRydWUiLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RNZXRob2RzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW50cm9zcGVjdE1ldGhvZHMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdEV2ZW50cygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImludHJvc3BlY3RFdmVudHMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfRG9CZWFuaW5mbygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRvQmVhbmluZm8iLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyIsIG51bGwsIDAsIC0xLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJub3RJbmhlcml0ZWRNZXRob2ROYW1lcyIsIG51bGwsIDAsIC0xLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5vdEluaGVyaXRlZEV2ZW50TmFtZXMiLCBudWxsLCAwLCAtMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QmVhbkRlY29yYXRvcl9DdXN0b21pemVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjdXN0b21pemVyQ2xhc3MiLCBudWxsLCAwLCAxLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAiRXZlbnRTZXREZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW5EZWZhdWx0RXZlbnRTZXQiLCBudWxsLCAwLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFdmVudFNldERlY29yYXRvcl9VbmljYXN0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5pY2FzdCIsIG51bGwsIDAsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJsaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5IiwgbnVsbCwgMCwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAiYWRkTGlzdGVuZXJNZXRob2QiLCBudWxsLCAxLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJNZXRob2RzKCksIHRoaXMuZ2V0TWV0aG9kUHJveHkoKSwgbnVsbCwgImxpc3RlbmVyTWV0aG9kcyIsIG51bGwsIDEsIC0xLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibGlzdGVuZXJUeXBlIiwgbnVsbCwgMSwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX1JlbW92ZUxpc3RlbmVyTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAicmVtb3ZlTGlzdGVuZXJNZXRob2QiLCBudWxsLCAxLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfRXZlbnRBZGFwdGVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJldmVudEFkYXB0ZXJDbGFzcyIsIG51bGwsIDAsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9TZXJMaXN0TXRoZCgpLCB0aGlzLmdldE1ldGhvZFByb3h5KCksIG51bGwsICJzZXJMaXN0TXRoZCIsIG51bGwsIDEsIC0xLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZERlY29yYXRvckVDbGFzcywgTWV0aG9kRGVjb3JhdG9yLmNsYXNzLCAiTWV0aG9kRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2REZWNvcmF0b3JfUGFybXNFeHBsaWNpdEVtcHR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFybXNFeHBsaWNpdEVtcHR5IiwgbnVsbCwgMCwgMSwgTWV0aG9kRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2REZWNvcmF0b3JfUGFyYW1ldGVyRGVzY3JpcHRvcnMoKSwgdGhpcy5nZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKSwgbnVsbCwgInBhcmFtZXRlckRlc2NyaXB0b3JzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZERlY29yYXRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCksIHRoaXMuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yKCksIG51bGwsICJzZXJQYXJtRGVzYyIsIG51bGwsIDAsIC0xLCBNZXRob2REZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MsIFBhcmFtZXRlckRlY29yYXRvci5jbGFzcywgIlBhcmFtZXRlckRlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBhcmFtZXRlckRlY29yYXRvcl9QYXJhbWV0ZXIoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YVBhcmFtZXRlcigpLCBudWxsLCAicGFyYW1ldGVyIiwgbnVsbCwgMCwgMSwgUGFyYW1ldGVyRGVjb3JhdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICJQcm9wZXJ0eURlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfQm91bmQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJib3VuZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0NvbnN0cmFpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY29uc3RyYWluZWQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9EZXNpZ25UaW1lKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGVzaWduVGltZSIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0Fsd2F5c0luY29tcGF0aWJsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImFsd2F5c0luY29tcGF0aWJsZSIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWx0ZXJGbGFncygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmlsdGVyRmxhZ3MiLCBudWxsLCAwLCAtMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkUmVhZE9ubHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmaWVsZFJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb3BlcnR5RGVjb3JhdG9yX1Byb3BlcnR5RWRpdG9yQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJwcm9wZXJ0eUVkaXRvckNsYXNzIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb3BlcnR5RGVjb3JhdG9yX1JlYWRNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJyZWFkTWV0aG9kIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCBJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJ3cml0ZU1ldGhvZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpZWxkKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEZpZWxkKCksIG51bGwsICJmaWVsZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgImdldFByb3BlcnR5VHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgbnVsbCwgInNldFByb3BlcnR5VHlwZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgInByb3BlcnR5VHlwZSIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICJJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgImluZGV4ZWRSZWFkTWV0aG9kIiwgbnVsbCwgMCwgMSwgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkV3JpdGVNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJpbmRleGVkV3JpdGVNZXRob2QiLCBudWxsLCAwLCAxLCBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCBJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFByb3h5RUNsYXNzLCBNZXRob2RQcm94eS5jbGFzcywgIk1ldGhvZFByb3h5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQcm94eV9NZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJtZXRob2QiLCBudWxsLCAxLCAxLCBNZXRob2RQcm94eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJlYW5FdmVudEVDbGFzcywgQmVhbkV2ZW50LmNsYXNzLCAiQmVhbkV2ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzLCBNYXAuRW50cnkuY2xhc3MsICJGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfS2V5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJrZXkiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9WYWx1ZSgpLCB0aGlzLmdldEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSgpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGltcGxpY2l0SXRlbUVFbnVtLCBJbXBsaWNpdEl0ZW0uY2xhc3MsICJJbXBsaWNpdEl0ZW0iKTsKLQkJYWRkRUVudW1MaXRlcmFsKGltcGxpY2l0SXRlbUVFbnVtLCBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaW1wbGljaXRJdGVtRUVudW0sIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpbXBsaWNpdEl0ZW1FRW51bSwgSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShmZWF0dXJlQXR0cmlidXRlVmFsdWVFRGF0YVR5cGUsIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZS5jbGFzcywgIkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfRG9CZWFuaW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX1BhcmFtZXRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFtZXRlckRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmVhbkV2ZW50KCkgewotCQlyZXR1cm4gYmVhbkV2ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCkgewotCQlyZXR1cm4gZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9LZXkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SW1wbGljaXRJdGVtKCkgewotCQlyZXR1cm4gaW1wbGljaXRJdGVtRUVudW07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9FdmVudFNldERlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0V2ZW50U2V0RGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDc4NzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0V2ZW50U2V0RGVjb3JhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV2ZW50IFNldCBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldEFkZExpc3RlbmVyTWV0aG9kIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0TGlzdGVuZXJNZXRob2RzIDxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0TGlzdGVuZXJUeXBlIDxlbT5MaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QgPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRFdmVudEFkYXB0ZXJDbGFzcyA8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldFNlckxpc3RNdGhkIDxlbT5TZXIgTGlzdCBNdGhkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIEV2ZW50U2V0RGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgRXZlbnRTZXREZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfQURETElTVEVORVJNRVRIT0RfSU1QTElDSVQgPSAweDFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9BREFQVEVSQ0xBU1NfSU1QTElDSVQgPSAweDJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9MSVNURU5FUk1FVEhPRFNfSU1QTElDSVQgPSAweDRMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9MSVNURU5FUlRZUEVfSU1QTElDSVQgPSAweDhMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9SRU1PVkVMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCA9IDB4MTBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9ERUZBVUxURVZFTlRTRVRfSU1QTElDSVQgPSAweDIwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVZFTlRfVU5JQ0FTVF9JTVBMSUNJVCA9IDB4NDBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVCA9IDB4ODBMOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbkRlZmF1bHRFdmVudFNldCgpIDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luRGVmYXVsdEV2ZW50U2V0KCkgPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRyA9IDEgPDwgMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgSW4gRGVmYXVsdCBFdmVudCBTZXQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHID0gMSA8PCAxOTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuaWNhc3QoKSA8ZW0+VW5pY2FzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVbmljYXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5JQ0FTVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmljYXN0KCkgPGVtPlVuaWNhc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVW5pY2FzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVU5JQ0FTVF9FRkxBRyA9IDEgPDwgMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgVW5pY2FzdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVU5JQ0FTVF9FU0VURkxBRyA9IDEgPDwgMjE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpIDxlbT5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUcgPSAxIDw8IDIyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkTGlzdGVuZXJNZXRob2QoKSA8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkTGlzdGVuZXJNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgYWRkTGlzdGVuZXJNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpc3RlbmVyVHlwZSgpIDxlbT5MaXN0ZW5lciBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXN0ZW5lclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbGlzdGVuZXJUeXBlID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpIDxlbT5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCByZW1vdmVMaXN0ZW5lck1ldGhvZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MoKSA8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZXZlbnRBZGFwdGVyQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VyTGlzdE10aGQoKSA8ZW0+U2VyIExpc3QgTXRoZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJMaXN0TXRoZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlckxpc3RNdGhkID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5EZWZhdWx0RXZlbnRTZXQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5EZWZhdWx0RXZlbnRTZXQoYm9vbGVhbiBuZXdJbkRlZmF1bHRFdmVudFNldCkgewotCQlib29sZWFuIG9sZEluRGVmYXVsdEV2ZW50U2V0ID0gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3SW5EZWZhdWx0RXZlbnRTZXQpIGVGbGFncyB8PSBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfklOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHOwotCQlib29sZWFuIG9sZEluRGVmYXVsdEV2ZW50U2V0RVNldCA9IChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQsIG9sZEluRGVmYXVsdEV2ZW50U2V0LCBuZXdJbkRlZmF1bHRFdmVudFNldCwgIW9sZEluRGVmYXVsdEV2ZW50U2V0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW5EZWZhdWx0RXZlbnRTZXQoKSB7Ci0JCWJvb2xlYW4gb2xkSW5EZWZhdWx0RXZlbnRTZXQgPSAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkSW5EZWZhdWx0RXZlbnRTZXRFU2V0ID0gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoSU5fREVGQVVMVF9FVkVOVF9TRVRfRURFRkFVTFQpIGVGbGFncyB8PSBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfklOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHOwotCQllRmxhZ3MgJj0gfklOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVCwgb2xkSW5EZWZhdWx0RXZlbnRTZXQsIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VERUZBVUxULCBvbGRJbkRlZmF1bHRFdmVudFNldEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluRGVmYXVsdEV2ZW50U2V0KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5pY2FzdCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBVTklDQVNUX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaWNhc3QoYm9vbGVhbiBuZXdVbmljYXN0KSB7Ci0JCWJvb2xlYW4gb2xkVW5pY2FzdCA9IChlRmxhZ3MgJiBVTklDQVNUX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3VW5pY2FzdCkgZUZsYWdzIHw9IFVOSUNBU1RfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5VTklDQVNUX0VGTEFHOwotCQlib29sZWFuIG9sZFVuaWNhc3RFU2V0ID0gKGVGbGFncyAmIFVOSUNBU1RfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBVTklDQVNUX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVCwgb2xkVW5pY2FzdCwgbmV3VW5pY2FzdCwgIW9sZFVuaWNhc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRVbmljYXN0KCkgewotCQlib29sZWFuIG9sZFVuaWNhc3QgPSAoZUZsYWdzICYgVU5JQ0FTVF9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRVbmljYXN0RVNldCA9IChlRmxhZ3MgJiBVTklDQVNUX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoVU5JQ0FTVF9FREVGQVVMVCkgZUZsYWdzIHw9IFVOSUNBU1RfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5VTklDQVNUX0VGTEFHOwotCQllRmxhZ3MgJj0gflVOSUNBU1RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1QsIG9sZFVuaWNhc3QsIFVOSUNBU1RfRURFRkFVTFQsIG9sZFVuaWNhc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVbmljYXN0KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFVOSUNBU1RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eShib29sZWFuIG5ld0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkpIHsKLQkJYm9vbGVhbiBvbGRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5ID0gKGVGbGFncyAmIExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KSBlRmxhZ3MgfD0gTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkxJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZLCBvbGRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5LCBuZXdMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRBZGRMaXN0ZW5lck1ldGhvZCgpIHsKLQkJaWYgKGFkZExpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgYWRkTGlzdGVuZXJNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZEFkZExpc3RlbmVyTWV0aG9kID0gYWRkTGlzdGVuZXJNZXRob2Q7Ci0JCQlhZGRMaXN0ZW5lck1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWFkZExpc3RlbmVyTWV0aG9kKTsKLQkJCWlmIChhZGRMaXN0ZW5lck1ldGhvZCAhPSBvbGRBZGRMaXN0ZW5lck1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9ELCBvbGRBZGRMaXN0ZW5lck1ldGhvZCwgYWRkTGlzdGVuZXJNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkTGlzdGVuZXJNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldEFkZExpc3RlbmVyTWV0aG9kKCkgewotCQlyZXR1cm4gYWRkTGlzdGVuZXJNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkTGlzdGVuZXJNZXRob2QoTWV0aG9kIG5ld0FkZExpc3RlbmVyTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRBZGRMaXN0ZW5lck1ldGhvZCA9IGFkZExpc3RlbmVyTWV0aG9kOwotCQlhZGRMaXN0ZW5lck1ldGhvZCA9IG5ld0FkZExpc3RlbmVyTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRCwgb2xkQWRkTGlzdGVuZXJNZXRob2QsIGFkZExpc3RlbmVyTWV0aG9kKSk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldExpc3RlbmVyTWV0aG9kcygpIHsKLQkJaWYgKCFpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSAmJiBnZXRTZXJMaXN0TXRoZCgpLmlzRW1wdHkoKSAmJiAoZ2V0SW1wbGljaXRseVNldEJpdHMoKSYoRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUIHwgRVZFTlRfTElTVEVORVJNRVRIT0RTX0RFRkFVTFQpKSA9PSAwKSB7Ci0JCQkvLyBOb3QgZXhwbGljaXRseSBlbXB0eSwgaXQgaXMgZW1wdHksIGFuZCB3ZSBoYXZlIG5vdCBpbXBsaWNpdGx5IG9yIGJ5IGRlZmF1bHRzIG1hZGUgaXQgZW1wdHksIHRoZW4gY3JlYXRlIHRoZSBkZWZhdWx0cy4KLQkJCWNyZWF0ZURlZmF1bHRMaXN0ZW5lck1ldGhvZHNMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGdldFNlckxpc3RNdGhkKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldExpc3RlbmVyTWV0aG9kc0dlbigpIHsKLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ0xpc3RlbmVyIE1ldGhvZHMnIHJlZmVyZW5jZSBsaXN0Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TGlzdGVuZXJUeXBlKCkgewotCQlpZiAobGlzdGVuZXJUeXBlICE9IG51bGwgJiYgbGlzdGVuZXJUeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRMaXN0ZW5lclR5cGUgPSBsaXN0ZW5lclR5cGU7Ci0JCQlsaXN0ZW5lclR5cGUgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClsaXN0ZW5lclR5cGUpOwotCQkJaWYgKGxpc3RlbmVyVHlwZSAhPSBvbGRMaXN0ZW5lclR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRSwgb2xkTGlzdGVuZXJUeXBlLCBsaXN0ZW5lclR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGlmIG1ldGhvZCBsaXN0ZW5lcnMgbGlzdCBub3QgZXhwbGljaXRseSBzZXQgYW5kIHRoZXJlIGlzIG5vIGZlYXR1cmUgcHJveHkgb3IKLQkgKiB0aGVyZSBpcyBhIGZlYXR1cmUgcHJveHkgYW5kIHRoZSBwcm94eSBoYXMgbm90aGluZyBkZWZpbmVkLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgQmVhbkluZm8gY2xhc3Nlcy4gSXQgaXMgbm90IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgY3JlYXRlRGVmYXVsdExpc3RlbmVyTWV0aG9kc0xpc3QoKSB7Ci0JCWlmICghZUlzU2V0KEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUFubm90YXRpb25fRU1vZGVsRWxlbWVudCgpKSkKLQkJCXJldHVybiB0aGlzLmdldFNlckxpc3RNdGhkKCk7CS8vIFdlIGFyZSBub3QgYXR0YWNoZWQsIGNhbid0IGRldGVybWluZSB0aGUgbGlzdCB5ZXQuCi0JCUVMaXN0IG10aGRzTGlzdCA9IHRoaXMuZ2V0U2VyTGlzdE10aGQoKTsJCQotCQkJCi0JCUphdmFDbGFzcyBldmVudE9iamVjdENsYXNzID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJqYXZhLnV0aWwuRXZlbnRPYmplY3QiLCBnZXRFTW9kZWxFbGVtZW50KCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCW10aGRzTGlzdC5jbGVhcigpOwotCQkKLQkJLy8gVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kuIE5lZWQgdG8gZ2V0IHRoZSBtZXRob2RzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSwgYW5kCi0JCS8vIHRoZW4gZ28gdGhyb3VnaCB0aGUgbWV0aG9kcyBhbmQgZmlsdGVyIG91dCB0aGUgbm9uLWV2ZW50IG9uZXMuCi0JCUphdmFDbGFzcyBsdCA9IGdldExpc3RlbmVyVHlwZSgpOwotCQlpZiAobHQgPT0gbnVsbCkKLQkJCXJldHVybiBtdGhkc0xpc3Q7CS8vIENvdWxkbid0IGdldCB0aGUgbGlzdGVuZXIgdHlwZSBmb3Igc29tZSByZWFzb24sIHNvIGxlYXZlIGFzIGlzLgotCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpfEVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUKTsJLy8gTWFyayBhcyB3ZSBpbXBsaWNpdGx5IGZpbGxlZCBpdCBpbi4KLQkJCi0JCUJlYW5pbmZvRmFjdG9yeSBiZmFjdCA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCUxpc3QgbXMgPSBsdC5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJaW50IG1zaXplID0gbXMuc2l6ZSgpOwotCQlmb3IgKGludCBpPTA7IGk8bXNpemU7IGkrKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIG1zLmdldChpKTsKLQkJCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQkJaWYgKHBhcm1zLnNpemUoKSAhPSAxKQotCQkJCWNvbnRpbnVlOwkvLyBNdXN0IGhhdmUgb25seSBvbmUgcGFybS4KLQkJCWlmICghZXZlbnRPYmplY3RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKCgoSmF2YVBhcmFtZXRlcikgcGFybXMuZ2V0KDApKS5nZXRFVHlwZSgpKSkKLQkJCQljb250aW51ZTsJLy8gUGFybSBkb2VzIG5vdCBpbmhlcml0IGZyb20gamF2YS51dGlsLkV2ZW50T2JqZWN0Ci0JCQkJCi0JCQkvLyBXZSBuZWVkIGEgbWV0aG9kIHByb3h5LCBhbmQgYSBtZXRob2QgZGVjb3JhdG9yLgotCQkJTWV0aG9kUHJveHkgbXByb3h5ID0gYmZhY3QuY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCW1wcm94eS5zZXRNZXRob2QobWV0aG9kKTsKLQkJCW1wcm94eS5zZXROYW1lKG1ldGhvZC5nZXROYW1lKCkpOwkJCQotCQkJTWV0aG9kRGVjb3JhdG9yIG1kID0gYmZhY3QuY3JlYXRlTWV0aG9kRGVjb3JhdG9yKCk7Ci0JCQltZC5zZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKTsKLQkJCW1kLnNldEVNb2RlbEVsZW1lbnQobXByb3h5KTsJCQkKLQkJCW10aGRzTGlzdC5hZGQobXByb3h5KTsKLQkJfQotCQlyZXR1cm4gbXRoZHNMaXN0OwotCX0JCi0JCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gbGlzdGVuZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyVHlwZShKYXZhQ2xhc3MgbmV3TGlzdGVuZXJUeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRMaXN0ZW5lclR5cGUgPSBsaXN0ZW5lclR5cGU7Ci0JCWxpc3RlbmVyVHlwZSA9IG5ld0xpc3RlbmVyVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEUsIG9sZExpc3RlbmVyVHlwZSwgbGlzdGVuZXJUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpIHsKLQkJaWYgKHJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgcmVtb3ZlTGlzdGVuZXJNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZFJlbW92ZUxpc3RlbmVyTWV0aG9kID0gcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0JCQlyZW1vdmVMaXN0ZW5lck1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXJlbW92ZUxpc3RlbmVyTWV0aG9kKTsKLQkJCWlmIChyZW1vdmVMaXN0ZW5lck1ldGhvZCAhPSBvbGRSZW1vdmVMaXN0ZW5lck1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9ELCBvbGRSZW1vdmVMaXN0ZW5lck1ldGhvZCwgcmVtb3ZlTGlzdGVuZXJNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkgewotCQlyZXR1cm4gcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoTWV0aG9kIG5ld1JlbW92ZUxpc3RlbmVyTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRSZW1vdmVMaXN0ZW5lck1ldGhvZCA9IHJlbW92ZUxpc3RlbmVyTWV0aG9kOwotCQlyZW1vdmVMaXN0ZW5lck1ldGhvZCA9IG5ld1JlbW92ZUxpc3RlbmVyTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRCwgb2xkUmVtb3ZlTGlzdGVuZXJNZXRob2QsIHJlbW92ZUxpc3RlbmVyTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRFdmVudEFkYXB0ZXJDbGFzcygpIHsKLQkJaWYgKGV2ZW50QWRhcHRlckNsYXNzICE9IG51bGwgJiYgZXZlbnRBZGFwdGVyQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZEV2ZW50QWRhcHRlckNsYXNzID0gZXZlbnRBZGFwdGVyQ2xhc3M7Ci0JCQlldmVudEFkYXB0ZXJDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWV2ZW50QWRhcHRlckNsYXNzKTsKLQkJCWlmIChldmVudEFkYXB0ZXJDbGFzcyAhPSBvbGRFdmVudEFkYXB0ZXJDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTLCBvbGRFdmVudEFkYXB0ZXJDbGFzcywgZXZlbnRBZGFwdGVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXZlbnRBZGFwdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldEV2ZW50QWRhcHRlckNsYXNzKCkgewotCQlyZXR1cm4gZXZlbnRBZGFwdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXZlbnRBZGFwdGVyQ2xhc3MoSmF2YUNsYXNzIG5ld0V2ZW50QWRhcHRlckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRFdmVudEFkYXB0ZXJDbGFzcyA9IGV2ZW50QWRhcHRlckNsYXNzOwotCQlldmVudEFkYXB0ZXJDbGFzcyA9IG5ld0V2ZW50QWRhcHRlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUywgb2xkRXZlbnRBZGFwdGVyQ2xhc3MsIGV2ZW50QWRhcHRlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlckxpc3RNdGhkKCkgewotCQlpZiAoc2VyTGlzdE10aGQgPT0gbnVsbCkgewotCQkJc2VyTGlzdE10aGQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kUHJveHkuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEKTsKLQkJfQotCQlyZXR1cm4gc2VyTGlzdE10aGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlckxpc3RNdGhkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVDoKLQkJCQlyZXR1cm4gaXNJbkRlZmF1bHRFdmVudFNldCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1Q6Ci0JCQkJcmV0dXJuIGlzVW5pY2FzdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRBZGRMaXN0ZW5lck1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldEFkZExpc3RlbmVyTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTOgotCQkJCXJldHVybiBnZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaXN0ZW5lclR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMaXN0ZW5lclR5cGUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RXZlbnRBZGFwdGVyQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFdmVudEFkYXB0ZXJDbGFzcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQlyZXR1cm4gZ2V0U2VyTGlzdE10aGQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXNldEV4cGVydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZygoSW1wbGljaXRJdGVtKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUOgotCQkJCXNldEluRGVmYXVsdEV2ZW50U2V0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1Q6Ci0JCQkJc2V0VW5pY2FzdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldExpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlzZXRBZGRMaXN0ZW5lck1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTOgotCQkJCWdldExpc3RlbmVyTWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TGlzdGVuZXJNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFOgotCQkJCXNldExpc3RlbmVyVHlwZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EOgotCQkJCXNldFJlbW92ZUxpc3RlbmVyTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1M6Ci0JCQkJc2V0RXZlbnRBZGFwdGVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQlnZXRTZXJMaXN0TXRoZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VyTGlzdE10aGQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQ6Ci0JCQkJdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1Q6Ci0JCQkJdW5zZXRVbmljYXN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJc2V0QWRkTGlzdGVuZXJNZXRob2QoKE1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTOgotCQkJCWdldExpc3RlbmVyTWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRToKLQkJCQlzZXRMaXN0ZW5lclR5cGUoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9EOgotCQkJCXNldFJlbW92ZUxpc3RlbmVyTWV0aG9kKChNZXRob2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUzoKLQkJCQlzZXRFdmVudEFkYXB0ZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJZ2V0U2VyTGlzdE10aGQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgb3ZlcnJpZGRlbiBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjaWFsIGlzIHNldCB0ZXN0czoKLQkgKiAxKSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnM6IGNoZWNrIGlmIHNlclBhcm1EZXNjIGV4aXN0cyBhbmQgbm90IGVtcHR5LCBzaW5jZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgaXMgZGVyaXZlZC4KLQkgKiAyKSBzZXJQYXJtRGVzYzogaWYgZmxhZyBzZXQgdG8gZGVmYXVsdCBwYXJtIGRlc2MsIHRoZW4gYW5zd2VyIG5vdCBzZXQsIGVsc2UgZG8gbm9ybWFsIGlzU2V0IHRlc3QuIFRoYXQgd2F5IGlmIHNldCBieSBkZWZhdWx0IGl0IHdvbid0IHNlcmlhbGl6ZQotCSAqICAgIG91dCB0aGUgdW5uZWVkZWQgZGVmYXVsdCBwYXJtcy4gVGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZCBxdWlja2x5IHdoZW4gbmVlZGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTOgotCQkJCXJldHVybiBlSXNTZXRHZW4oQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9TZXJMaXN0TXRoZCgpKTsJLy8gTGV0IGRlZmF1bHQgc2VyTGlzdE10aGQgaXMgc2V0IHdvcmsuCi0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCWlmICgoZ2V0SW1wbGljaXRseVNldEJpdHMoKSAmIEVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUKSAhPSAwKQotCQkJCQlyZXR1cm4gZmFsc2U7CS8vIE5vdCBjb25zaWRlcmVkIHNldCBpZiBpbml0aWFsaXplZCBieSBkZWZhdWx0LgotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7CS8vIE5vdCBzZXQgYnkgZGVmYXVsdCwgc28gY2hlY2sgdHJ1ZSBzZXR0aW5nLgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsJLy8gRXZlcnl0aGluZyBlbHNlIHVzZSB0aGUgZ2VuIG1ldGhvZC4KLQkJfQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQ6Ci0JCQkJcmV0dXJuIGlzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0VW5pY2FzdCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlyZXR1cm4gYWRkTGlzdGVuZXJNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFM6Ci0JCQkJcmV0dXJuICFnZXRMaXN0ZW5lck1ldGhvZHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFOgotCQkJCXJldHVybiBsaXN0ZW5lclR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIHJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTOgotCQkJCXJldHVybiBldmVudEFkYXB0ZXJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQlyZXR1cm4gc2VyTGlzdE10aGQgIT0gbnVsbCAmJiAhc2VyTGlzdE10aGQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5EZWZhdWx0RXZlbnRTZXQ6ICIpOwotCQlpZiAoKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaWNhc3Q6ICIpOwotCQlpZiAoKGVGbGFncyAmIFVOSUNBU1RfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFVOSUNBU1RfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjhmMDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwjZ2V0VHlwZWRLZXkgPGVtPktleTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCNnZXRUeXBlZFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJhc2ljRU1hcC5FbnRyeSB7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZWRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVkS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleSA9IEtFWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlZEtleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlZEtleShTdHJpbmcgbmV3S2V5KSB7Ci0JCVN0cmluZyBvbGRLZXkgPSBrZXk7Ci0JCWtleSA9IG5ld0tleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZLCBvbGRLZXksIGtleSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgZ2V0VHlwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVkVmFsdWUoRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIG5ld1ZhbHVlKSB7Ci0JCUZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVk6Ci0JCQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVk6Ci0JCQkJc2V0VHlwZWRLZXkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRToKLQkJCQlzZXRUeXBlZFZhbHVlKChGZWF0dXJlQXR0cmlidXRlVmFsdWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlzZXRUeXBlZEtleShLRVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VHlwZWRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlyZXR1cm4gS0VZX0VERUZBVUxUID09IG51bGwgPyBrZXkgIT0gbnVsbCA6ICFLRVlfRURFRkFVTFQuZXF1YWxzKGtleSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChrZXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkgewotCQlpZiAoaGFzaCA9PSAtMSkgewotCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOwotCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkgewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkgewotCQlzZXRUeXBlZEtleSgoU3RyaW5nKWtleSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotCQlzZXRUeXBlZFZhbHVlKChGZWF0dXJlQXR0cmlidXRlVmFsdWUpdmFsdWUpOwotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0RU1hcCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoRU1hcCljb250YWluZXIuZUdldChlQ29udGFpbm1lbnRGZWF0dXJlKCkpOwotCX0KLQotfSAvL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9GZWF0dXJlRGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2VkZTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQW5ub3RhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GZWF0dXJlIERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjZ2V0U2hvcnREZXNjcmlwdGlvbiA8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVEZWNvcmF0b3JJbXBsI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjaXNFeHBlcnQgPGVtPkV4cGVydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjaXNIaWRkZW4gPGVtPkhpZGRlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjaXNQcmVmZXJyZWQgPGVtPlByZWZlcnJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZURlY29yYXRvckltcGwjaXNNZXJnZUludHJvc3BlY3Rpb24gPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVEZWNvcmF0b3JJbXBsI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgPGVtPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVEZWNvcmF0b3JJbXBsI2dldEltcGxpY2l0bHlTZXRCaXRzIDxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcgPGVtPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlRGVjb3JhdG9ySW1wbCNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZURlY29yYXRvckltcGwgZXh0ZW5kcyBFQW5ub3RhdGlvbkltcGwgaW1wbGVtZW50cyBGZWF0dXJlRGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICogTm90ZTogVG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFrZSBjaGFuZ2VzIEZlYXR1cmUgZ29lcyBmcm9tIGhpZ2ggYml0cyBkb3duLCB3aGlsZSB0aGUKLQkgKiBzdWJjbGFzc2VzIGdvIGZyb20gbG93LWJpdHMgdXAuIFRoYXQgd2F5IGlmIGEgY2hhbmdlIGlzIG1hZGUgdG8gYWRkIHNvbWV0aGluZyBvZgotCSAqIGludGVyZXN0IHRvIEZlYXR1cmUsIGFsbCBvZiB0aGUgc3ViY2xhc3NlcyBkb24ndCBuZWVkIHRvIGhhdmUgdGhlaXIgYml0cyByZS1vcmRlcmVkLgotCSAqIFNpbmNlIHRoZXNlIGFyZSBiaXRzLCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBvbmVzIHRvIHVzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9ESVNQTEFZTkFNRV9JTVBMSUNJVCA9IDB4ODAwMDAwMDAwMDAwMDAwMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZFQVRVUkVfU0hPUlRERVNDX0lNUExJQ0lUID0gMHg0MDAwMDAwMDAwMDAwMDAwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9DQVRFR09SWV9JTVBMSUNJVCA9IDB4MjAwMDAwMDAwMDAwMDAwMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZFQVRVUkVfRVhQRVJUX0lNUExJQ0lUID0gMHgxMDAwMDAwMDAwMDAwMDAwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkVBVFVSRV9ISURERU5fSU1QTElDSVQgPSAweDgwMDAwMDAwMDAwMDAwMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUID0gMHg0MDAwMDAwMDAwMDAwMDBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGRUFUVVJFX0FUVFJJQlVURVNfSU1QTElDSVQgPSAweDIwMDAwMDAwMDAwMDAwMEw7IAotCQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JIAotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBESVNQTEFZX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIERpc3BsYXkgTmFtZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9OQU1FX0VTRVRGTEFHID0gMSA8PCA4OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNob3J0RGVzY3JpcHRpb24oKSA8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNob3J0RGVzY3JpcHRpb24oKSA8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFNIT1JUX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBTaG9ydCBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUcgPSAxIDw8IDk7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcnkoKSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHBlcnQoKSA8ZW0+RXhwZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4cGVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYUEVSVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHBlcnQoKSA8ZW0+RXhwZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4cGVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhQRVJUX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBFeHBlcnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVYUEVSVF9FU0VURkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRkZW4oKSA8ZW0+SGlkZGVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGRlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhJRERFTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRkZW4oKSA8ZW0+SGlkZGVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGRlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOX0VGTEFHID0gMSA8PCAxMjsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBIaWRkZW4gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEhJRERFTl9FU0VURkxBRyA9IDEgPDwgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcmVmZXJyZWQoKSA8ZW0+UHJlZmVycmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByZWZlcnJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUlJFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcmVmZXJyZWQoKSA8ZW0+UHJlZmVycmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByZWZlcnJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJFRkVSUkVEX0VGTEFHID0gMSA8PCAxNDsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBQcmVmZXJyZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRUZFUlJFRF9FU0VURkxBRyA9IDEgPDwgMTU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZUludHJvc3BlY3Rpb24oKSA8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZUludHJvc3BlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VJbnRyb3NwZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHID0gMSA8PCAxNjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPGVtPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPGVtPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcgPSAxIDw8IDE3OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGxpY2l0bHlTZXRCaXRzKCkgPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGxpY2l0bHlTZXRCaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGljaXRseVNldEJpdHMoKSA8ZW0+SW1wbGljaXRseSBTZXQgQml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wbGljaXRseVNldEJpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBsb25nIGltcGxpY2l0bHlTZXRCaXRzID0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbXBsaWNpdEl0ZW0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQgPSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEltcGxpY2l0SXRlbSBpbXBsaWNpdERlY29yYXRvckZsYWcgPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKSA8ZW0+QXR0cmlidXRlczwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZURlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVGbGFncyB8PSBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKSA/IGdldERpc3BsYXlOYW1lR2VuKCkgOiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUdlbigpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJRU5hbWVkRWxlbWVudCBuZSA9IChFTmFtZWRFbGVtZW50KSBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCWlmIChuZSAhPSBudWxsKQotCQkJcmV0dXJuIG5lLmdldE5hbWUoKTsJLy8gVGhlIG5hbWUgZnJvbSB0aGUgb3duZXIgb2YgdGhlIGZlYXR1cmUgaGFzIHRvIGJlIHRoZSBuYW1lIG9mIGZlYXR1cmUuCi0JCWVsc2UKLQkJCXJldHVybiAiPyI7CS8vIERvbid0IGtub3cgd2hhdCBpdCBpcy4gLy8kTk9OLU5MUy0xJAotCX0KLQkKLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlib29sZWFuIG9sZERpc3BsYXlOYW1lRVNldCA9IChlRmxhZ3MgJiBESVNQTEFZX05BTUVfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBESVNQTEFZX05BTUVfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FLCBvbGREaXNwbGF5TmFtZSwgZGlzcGxheU5hbWUsICFvbGREaXNwbGF5TmFtZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERpc3BsYXlOYW1lKCkgewotCQlTdHJpbmcgb2xkRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJYm9vbGVhbiBvbGREaXNwbGF5TmFtZUVTZXQgPSAoZUZsYWdzICYgRElTUExBWV9OQU1FX0VTRVRGTEFHKSAhPSAwOwotCQlkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQkJZUZsYWdzICY9IH5ESVNQTEFZX05BTUVfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBESVNQTEFZX05BTUVfRURFRkFVTFQsIG9sZERpc3BsYXlOYW1lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRElTUExBWV9OQU1FX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHNob3J0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvcnREZXNjcmlwdGlvbihTdHJpbmcgbmV3U2hvcnREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkU2hvcnREZXNjcmlwdGlvbiA9IHNob3J0RGVzY3JpcHRpb247Ci0JCXNob3J0RGVzY3JpcHRpb24gPSBuZXdTaG9ydERlc2NyaXB0aW9uOwotCQlib29sZWFuIG9sZFNob3J0RGVzY3JpcHRpb25FU2V0ID0gKGVGbGFncyAmIFNIT1JUX0RFU0NSSVBUSU9OX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gU0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04sIG9sZFNob3J0RGVzY3JpcHRpb24sIHNob3J0RGVzY3JpcHRpb24sICFvbGRTaG9ydERlc2NyaXB0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2hvcnREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIG9sZFNob3J0RGVzY3JpcHRpb24gPSBzaG9ydERlc2NyaXB0aW9uOwotCQlib29sZWFuIG9sZFNob3J0RGVzY3JpcHRpb25FU2V0ID0gKGVGbGFncyAmIFNIT1JUX0RFU0NSSVBUSU9OX0VTRVRGTEFHKSAhPSAwOwotCQlzaG9ydERlc2NyaXB0aW9uID0gU0hPUlRfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JCWVGbGFncyAmPSB+U0hPUlRfREVTQ1JJUFRJT05fRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTiwgb2xkU2hvcnREZXNjcmlwdGlvbiwgU0hPUlRfREVTQ1JJUFRJT05fRURFRkFVTFQsIG9sZFNob3J0RGVzY3JpcHRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNIT1JUX0RFU0NSSVBUSU9OX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgbmV3Q2F0ZWdvcnkpIHsKLQkJU3RyaW5nIG9sZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCWNhdGVnb3J5ID0gbmV3Q2F0ZWdvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlksIG9sZENhdGVnb3J5LCBjYXRlZ29yeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwZXJ0KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEVYUEVSVF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBlcnQoYm9vbGVhbiBuZXdFeHBlcnQpIHsKLQkJYm9vbGVhbiBvbGRFeHBlcnQgPSAoZUZsYWdzICYgRVhQRVJUX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RXhwZXJ0KSBlRmxhZ3MgfD0gRVhQRVJUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RVhQRVJUX0VGTEFHOwotCQlib29sZWFuIG9sZEV4cGVydEVTZXQgPSAoZUZsYWdzICYgRVhQRVJUX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gRVhQRVJUX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVCwgb2xkRXhwZXJ0LCBuZXdFeHBlcnQsICFvbGRFeHBlcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFeHBlcnQoKSB7Ci0JCWJvb2xlYW4gb2xkRXhwZXJ0ID0gKGVGbGFncyAmIEVYUEVSVF9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRFeHBlcnRFU2V0ID0gKGVGbGFncyAmIEVYUEVSVF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKEVYUEVSVF9FREVGQVVMVCkgZUZsYWdzIHw9IEVYUEVSVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkVYUEVSVF9FRkxBRzsKLQkJZUZsYWdzICY9IH5FWFBFUlRfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQsIG9sZEV4cGVydCwgRVhQRVJUX0VERUZBVUxULCBvbGRFeHBlcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFeHBlcnQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRVhQRVJUX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEhJRERFTl9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbiBuZXdIaWRkZW4pIHsKLQkJYm9vbGVhbiBvbGRIaWRkZW4gPSAoZUZsYWdzICYgSElEREVOX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3SGlkZGVuKSBlRmxhZ3MgfD0gSElEREVOX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SElEREVOX0VGTEFHOwotCQlib29sZWFuIG9sZEhpZGRlbkVTZXQgPSAoZUZsYWdzICYgSElEREVOX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gSElEREVOX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTiwgb2xkSGlkZGVuLCBuZXdIaWRkZW4sICFvbGRIaWRkZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIaWRkZW4oKSB7Ci0JCWJvb2xlYW4gb2xkSGlkZGVuID0gKGVGbGFncyAmIEhJRERFTl9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRIaWRkZW5FU2V0ID0gKGVGbGFncyAmIEhJRERFTl9FU0VURkxBRykgIT0gMDsKLQkJaWYgKEhJRERFTl9FREVGQVVMVCkgZUZsYWdzIHw9IEhJRERFTl9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkhJRERFTl9FRkxBRzsKLQkJZUZsYWdzICY9IH5ISURERU5fRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU4sIG9sZEhpZGRlbiwgSElEREVOX0VERUZBVUxULCBvbGRIaWRkZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIaWRkZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSElEREVOX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJlZmVycmVkKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFBSRUZFUlJFRF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWQoYm9vbGVhbiBuZXdQcmVmZXJyZWQpIHsKLQkJYm9vbGVhbiBvbGRQcmVmZXJyZWQgPSAoZUZsYWdzICYgUFJFRkVSUkVEX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UHJlZmVycmVkKSBlRmxhZ3MgfD0gUFJFRkVSUkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+UFJFRkVSUkVEX0VGTEFHOwotCQlib29sZWFuIG9sZFByZWZlcnJlZEVTZXQgPSAoZUZsYWdzICYgUFJFRkVSUkVEX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gUFJFRkVSUkVEX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRCwgb2xkUHJlZmVycmVkLCBuZXdQcmVmZXJyZWQsICFvbGRQcmVmZXJyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQcmVmZXJyZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUHJlZmVycmVkID0gKGVGbGFncyAmIFBSRUZFUlJFRF9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRQcmVmZXJyZWRFU2V0ID0gKGVGbGFncyAmIFBSRUZFUlJFRF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKFBSRUZFUlJFRF9FREVGQVVMVCkgZUZsYWdzIHw9IFBSRUZFUlJFRF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflBSRUZFUlJFRF9FRkxBRzsKLQkJZUZsYWdzICY9IH5QUkVGRVJSRURfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQsIG9sZFByZWZlcnJlZCwgUFJFRkVSUkVEX0VERUZBVUxULCBvbGRQcmVmZXJyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQcmVmZXJyZWQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUFJFRkVSUkVEX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKGJvb2xlYW4gbmV3TWVyZ2VJbnRyb3NwZWN0aW9uKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VJbnRyb3NwZWN0aW9uID0gKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdNZXJnZUludHJvc3BlY3Rpb24pIGVGbGFncyB8PSBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OLCBvbGRNZXJnZUludHJvc3BlY3Rpb24sIG5ld01lcmdlSW50cm9zcGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShib29sZWFuIG5ld0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KSB7Ci0JCWJvb2xlYW4gb2xkQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgPSAoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KSBlRmxhZ3MgfD0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWSwgb2xkQXR0cmlidXRlc0V4cGxpY2l0RW1wdHksIG5ld0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGxvbmcgZ2V0SW1wbGljaXRseVNldEJpdHMoKSB7Ci0JCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdGx5U2V0Qml0cyhsb25nIG5ld0ltcGxpY2l0bHlTZXRCaXRzKSB7Ci0JCWxvbmcgb2xkSW1wbGljaXRseVNldEJpdHMgPSBpbXBsaWNpdGx5U2V0Qml0czsKLQkJaW1wbGljaXRseVNldEJpdHMgPSBuZXdJbXBsaWNpdGx5U2V0Qml0czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTLCBvbGRJbXBsaWNpdGx5U2V0Qml0cywgaW1wbGljaXRseVNldEJpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRJdGVtIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpIHsKLQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSW1wbGljaXRJdGVtIG5ld0ltcGxpY2l0RGVjb3JhdG9yRmxhZykgewotCQlJbXBsaWNpdEl0ZW0gb2xkSW1wbGljaXREZWNvcmF0b3JGbGFnID0gaW1wbGljaXREZWNvcmF0b3JGbGFnOwotCQlpbXBsaWNpdERlY29yYXRvckZsYWcgPSBuZXdJbXBsaWNpdERlY29yYXRvckZsYWcgPT0gbnVsbCA/IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUIDogbmV3SW1wbGljaXREZWNvcmF0b3JGbGFnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHLCBvbGRJbXBsaWNpdERlY29yYXRvckZsYWcsIGltcGxpY2l0RGVjb3JhdG9yRmxhZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZXMgPSBuZXcgRWNvcmVFTWFwKEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCksIEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3BsYXlOYW1lOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBESVNQTEFZX05BTUVfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoZGlzcGxheU5hbWUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzaG9ydERlc2NyaXB0aW9uOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBTSE9SVF9ERVNDUklQVElPTl9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZChzaG9ydERlc2NyaXB0aW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGVnb3J5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHBlcnQ6ICIpOwotCQlpZiAoKGVGbGFncyAmIEVYUEVSVF9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRVhQRVJUX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGlkZGVuOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBISURERU5fRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEhJRERFTl9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZlcnJlZDogIik7Ci0JCWlmICgoZUZsYWdzICYgUFJFRkVSUkVEX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBQUkVGRVJSRURfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXJnZUludHJvc3BlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdHRyaWJ1dGVzRXhwbGljaXRFbXB0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGltcGxpY2l0bHlTZXRCaXRzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBsaWNpdGx5U2V0Qml0cyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW1wbGljaXREZWNvcmF0b3JGbGFnOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBsaWNpdERlY29yYXRvckZsYWcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJ5IG92ZXJyaWRlcyB0byBlSXNTZXQgdG8gdGVzdCBpZiBzb3VyY2UgaXMgc2V0LiBUaGlzIGlzIGJlY2F1c2UgZm9yIHRoZSAKLQkgKiBGZWF0dXJlRGVjb3JhdG9yIGFuZCBzdWJjbGFzc2VzLCBzZXR0aW5nIHNvdXJjZSB0byB0aGUgY2xhc3NuYW1lIGlzIGNvbnNpZGVyZWQKLQkgKiB0byBiZSBub3Qgc2V0IHNpbmNlIHRoYXQgaXMgdGhlIG5ldyBkZWZhdWx0IGZvciBlYWNoIGNsYXNzIGxldmVsLiBCeSBkb2luZyB0aGlzCi0JICogd2hlbiBzZXJpYWxpemluZyBpdCB3b24ndCB3YXN0ZSBzcGFjZSBhbmQgdGltZSBhZGRpbmcgYSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyaW5nCi0JICogdG8gdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IGFuZCB0aGVuIGNyZWF0aW5nIGEgTkVXIGNvcHkgb24gZWFjaCBkZWNvcmF0b3IgbG9hZGVkCi0JICogZnJvbSBhbiBYTUkgZmlsZS4gCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzb3VyY2UgaXMgbm90IG51bGwgYW5kIG5vdCBlcXVhbCB0byBjbGFzcyBuYW1lIChsZXNzIHRoZSAiSW1wbCIgYXQgdGhlIGVuZCkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBzb3VyY2UgIT0gbnVsbCAmJiAhZUNsYXNzKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKS5lcXVhbHMoc291cmNlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E0NTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmRleGVkIFByb3BlcnR5IERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRJbmRleGVkUmVhZE1ldGhvZCA8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRJbmRleGVkV3JpdGVNZXRob2QgPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwgZXh0ZW5kcyBQcm9wZXJ0eURlY29yYXRvckltcGwgaW1wbGVtZW50cyBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUID0gMHgxMDAwMDBMOwkvLyBTdGFydCBraW5kIG9mIGhpZ2ggc28gYXMgdG8gYWxsb3cgUHJvcGVydHlEZWNvcmF0b3IgdG8gaW5jcmVhc2Ugd2l0aG91dCBjb25mbGlnLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBJTkRFWEVEX1dSSVRFTUVUSE9EX0lNUExJQ0lUID0gMHgyMDAwMDBMOwotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4ZWRSZWFkTWV0aG9kKCkgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGluZGV4ZWRSZWFkTWV0aG9kID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgSW5kZXhlZCBSZWFkIE1ldGhvZCByZWZlcmVuY2UgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRyA9IDEgPDwgMjk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleGVkV3JpdGVNZXRob2QoKSA8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCBpbmRleGVkV3JpdGVNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBJbmRleGVkIFdyaXRlIE1ldGhvZCByZWZlcmVuY2UgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUcgPSAxIDw8IDMwOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldEluZGV4ZWRSZWFkTWV0aG9kKCkgewotCQlpZiAoaW5kZXhlZFJlYWRNZXRob2QgIT0gbnVsbCAmJiBpbmRleGVkUmVhZE1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkSW5kZXhlZFJlYWRNZXRob2QgPSBpbmRleGVkUmVhZE1ldGhvZDsKLQkJCWluZGV4ZWRSZWFkTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpaW5kZXhlZFJlYWRNZXRob2QpOwotCQkJaWYgKGluZGV4ZWRSZWFkTWV0aG9kICE9IG9sZEluZGV4ZWRSZWFkTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9ELCBvbGRJbmRleGVkUmVhZE1ldGhvZCwgaW5kZXhlZFJlYWRNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXhlZFJlYWRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXhlZFJlYWRNZXRob2QoTWV0aG9kIG5ld0luZGV4ZWRSZWFkTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRJbmRleGVkUmVhZE1ldGhvZCA9IGluZGV4ZWRSZWFkTWV0aG9kOwotCQlpbmRleGVkUmVhZE1ldGhvZCA9IG5ld0luZGV4ZWRSZWFkTWV0aG9kOwotCQlib29sZWFuIG9sZEluZGV4ZWRSZWFkTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBJTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gSU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9ELCBvbGRJbmRleGVkUmVhZE1ldGhvZCwgaW5kZXhlZFJlYWRNZXRob2QsICFvbGRJbmRleGVkUmVhZE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEluZGV4ZWRSZWFkTWV0aG9kKCkgewotCQlNZXRob2Qgb2xkSW5kZXhlZFJlYWRNZXRob2QgPSBpbmRleGVkUmVhZE1ldGhvZDsKLQkJYm9vbGVhbiBvbGRJbmRleGVkUmVhZE1ldGhvZEVTZXQgPSAoZUZsYWdzICYgSU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJaW5kZXhlZFJlYWRNZXRob2QgPSBudWxsOwotCQllRmxhZ3MgJj0gfklOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9ELCBvbGRJbmRleGVkUmVhZE1ldGhvZCwgbnVsbCwgb2xkSW5kZXhlZFJlYWRNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgewotCQlpZiAoaW5kZXhlZFdyaXRlTWV0aG9kICE9IG51bGwgJiYgaW5kZXhlZFdyaXRlTWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRJbmRleGVkV3JpdGVNZXRob2QgPSBpbmRleGVkV3JpdGVNZXRob2Q7Ci0JCQlpbmRleGVkV3JpdGVNZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClpbmRleGVkV3JpdGVNZXRob2QpOwotCQkJaWYgKGluZGV4ZWRXcml0ZU1ldGhvZCAhPSBvbGRJbmRleGVkV3JpdGVNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9ELCBvbGRJbmRleGVkV3JpdGVNZXRob2QsIGluZGV4ZWRXcml0ZU1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleGVkV3JpdGVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXhlZFdyaXRlTWV0aG9kKE1ldGhvZCBuZXdJbmRleGVkV3JpdGVNZXRob2QpIHsKLQkJTWV0aG9kIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCA9IGluZGV4ZWRXcml0ZU1ldGhvZDsKLQkJaW5kZXhlZFdyaXRlTWV0aG9kID0gbmV3SW5kZXhlZFdyaXRlTWV0aG9kOwotCQlib29sZWFuIG9sZEluZGV4ZWRXcml0ZU1ldGhvZEVTZXQgPSAoZUZsYWdzICYgSU5ERVhFRF9XUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBJTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCwgb2xkSW5kZXhlZFdyaXRlTWV0aG9kLCBpbmRleGVkV3JpdGVNZXRob2QsICFvbGRJbmRleGVkV3JpdGVNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbmRleGVkV3JpdGVNZXRob2QoKSB7Ci0JCU1ldGhvZCBvbGRJbmRleGVkV3JpdGVNZXRob2QgPSBpbmRleGVkV3JpdGVNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkSW5kZXhlZFdyaXRlTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBJTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJaW5kZXhlZFdyaXRlTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5JTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9ELCBvbGRJbmRleGVkV3JpdGVNZXRob2QsIG51bGwsIG9sZEluZGV4ZWRXcml0ZU1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQlyZXR1cm4gaXNCb3VuZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlyZXR1cm4gaXNDb25zdHJhaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNEZXNpZ25UaW1lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJcmV0dXJuIGlzQWx3YXlzSW5jb21wYXRpYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyRmxhZ3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzRmllbGRSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UHJvcGVydHlFZGl0b3JDbGFzcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVhZE1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGaWVsZCgpOwotCQkJCXJldHVybiBiYXNpY0dldEZpZWxkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXNldEV4cGVydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZygoSW1wbGljaXRJdGVtKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJc2V0Qm91bmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXNldENvbnN0cmFpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlzZXREZXNpZ25UaW1lKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCWdldEZpbHRlckZsYWdzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlzZXRGaWVsZFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJc2V0UHJvcGVydHlFZGl0b3JDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJc2V0UmVhZE1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXNldFdyaXRlTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlzZXRGaWVsZCgoRmllbGQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EOgotCQkJCXNldEluZGV4ZWRSZWFkTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRDoKLQkJCQlzZXRJbmRleGVkV3JpdGVNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQl1bnNldEJvdW5kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXVuc2V0Q29uc3RyYWluZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJdW5zZXREZXNpZ25UaW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJc2V0QWx3YXlzSW5jb21wYXRpYmxlKEFMV0FZU19JTkNPTVBBVElCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJc2V0RmllbGRSZWFkT25seShGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJc2V0UHJvcGVydHlFZGl0b3JDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQl1bnNldFJlYWRNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXVuc2V0V3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ6Ci0JCQkJdW5zZXRGaWVsZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EOgotCQkJCXVuc2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0Q6Ci0JCQkJdW5zZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU291cmNlU2V0KCk7CS8vIE92ZXJyaWRlIHNvIHRoYXQgaWYgc2V0IHRvIHRoZSBzYW1lIGFzIGNsYXNzbmFtZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIG5vdCBzZXQuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0R2VuKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZGV0YWlscyAhPSBudWxsICYmICFkZXRhaWxzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiByZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gQ0FURUdPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGVnb3J5ICE9IG51bGwgOiAhQ0FURUdPUllfRURFRkFVTFQuZXF1YWxzKGNhdGVnb3J5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcmVmZXJyZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzICE9IElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXJldHVybiBpc1NldEJvdW5kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJcmV0dXJuIGlzU2V0Q29uc3RyYWluZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNTZXREZXNpZ25UaW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHKSAhPSAwKSAhPSBBTFdBWVNfSU5DT01QQVRJQkxFX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlyZXR1cm4gZmlsdGVyRmxhZ3MgIT0gbnVsbCAmJiAhZmlsdGVyRmxhZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSUVMRF9SRUFEX09OTFlfRUZMQUcpICE9IDApICE9IEZJRUxEX1JFQURfT05MWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJcmV0dXJuIHByb3BlcnR5RWRpdG9yQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRSZWFkTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ6Ci0JCQkJcmV0dXJuIGlzU2V0RmllbGQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGlzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRJbmRleGVkUmVhZE1ldGhvZCgpIHsKLQkJcmV0dXJuIGluZGV4ZWRSZWFkTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRJbmRleGVkV3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiBpbmRleGVkV3JpdGVNZXRob2Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2REZWNvcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2REZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODUyNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvTWV0aG9kRGVjb3JhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZERlY29yYXRvckltcGwjaXNQYXJtc0V4cGxpY2l0RW1wdHkgPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2REZWNvcmF0b3JJbXBsI2dldFBhcmFtZXRlckRlc2NyaXB0b3JzIDxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZERlY29yYXRvckltcGwjZ2V0U2VyUGFybURlc2MgPGVtPlNlciBQYXJtIERlc2M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgTWV0aG9kRGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1FVEhPRF9QQVJBTUVURVJTX0lNUExJQ0lUID0gMHgxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCA9IDAyTDsJLy8gU3BlY2lhbCwgbWVhbnMgd2VyZSBjcmVhdGVkIGJ5IGRlZmF1bHQgYW5kIG5vdCBieSBpbXBsaWNpdCAoZnJvbSBiZWFuaW5mbykuCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFSTVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkgPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Bhcm1zRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcgPSAxIDw8IDE4OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VyUGFybURlc2MoKSA8ZW0+U2VyIFBhcm0gRGVzYzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJQYXJtRGVzYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlclBhcm1EZXNjID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgTWV0aG9kRGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFybXNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gbmV3UGFybXNFeHBsaWNpdEVtcHR5KSB7Ci0JCWJvb2xlYW4gb2xkUGFybXNFeHBsaWNpdEVtcHR5ID0gKGVGbGFncyAmIFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UGFybXNFeHBsaWNpdEVtcHR5KSBlRmxhZ3MgfD0gUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5QQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZLCBvbGRQYXJtc0V4cGxpY2l0RW1wdHksIG5ld1Bhcm1zRXhwbGljaXRFbXB0eSkpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyBjYWxsZWQgaWYgcGFybXMgbGlzdCBub3QgZXhwbGljaXRseSBzZXQgYW5kIGl0IHdhcyBlbXB0eSBmcm9tIEJlYW5JbmZvIG9yCi0JICogdGhpcyBpcyBmcm9tIHJlZmxlY3Rpb24uIFRoaXMgYmVjb21lcyB0aGUgZGVmYXVsdCBsaXN0IGJhc2VkIHVwb24gdGhlIG1ldGhvZAotCSAqIHdlIGFyZSBhdHRhY2hlZCB0by4KLQkgKi8KLQlwcml2YXRlIEVMaXN0IGNyZWF0ZURlZmF1bHRQYXJtc0xpc3QoKSB7Ci0JCUVMaXN0IHBhcm1zTGlzdCA9IHRoaXMuZ2V0U2VyUGFybURlc2MoKTsKLQkJcGFybXNMaXN0LmNsZWFyKCk7Ci0JCQotCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpfE1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpOwkvLyBNYXJrIGFzIHdlIGltcGxpY2l0bHkgZmlsbGVkIGl0IGluLgotCQlMaXN0IHAgPSBnZXRNZXRob2RQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm4gcGFybXNMaXN0OwkvLyBDb3VsZG4ndCBnZXQgdGhlIGxpc3QgZm9yIHNvbWUgcmVhc29uLCBzbyBsZWF2ZSBhcyBpcy4KLQkJaW50IHBzaXplID0gcC5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwc2l6ZTsgaSsrKSB7Ci0JCQlQYXJhbWV0ZXJEZWNvcmF0b3IgcGQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpOwotCQkJSmF2YVBhcmFtZXRlciBqcCA9IChKYXZhUGFyYW1ldGVyKSBwLmdldChpKTsKLQkJCXBkLnNldE5hbWUoanAuZ2V0TmFtZSgpKTsKLQkJCXBkLnNldEltcGxpY2l0bHlTZXRCaXRzKFBhcmFtZXRlckRlY29yYXRvckltcGwuUEFSQU1FVEVSX05BTUVfSU1QTElDSVQpOwotCQkJcGQuc2V0UGFyYW1ldGVyKGpwKTsKLQkJCXBhcm1zTGlzdC5hZGQocGQpOwotCQl9Ci0JCXJldHVybiBwYXJtc0xpc3Q7Ci0JfQotCQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgUGFyYW1ldGVyRGVjb3JhdG9ycyB0byBob29rIHVwIHRoZSBKYXZhUGFyYW1ldGVyIHRoZXkgYXJlIGRlc2NyaWJpbmcuCi0JICogVGhpcyBpcyBjYWxsZWQgZnJvbSBQYXJhbWV0ZXJEZWNvcmF0b3Igd2hlbiBpdCBmaW5kcyB0aGF0IGl0cyBKYXZhUGFyYW1ldGVyIGhhcyBub3QgYmVlbiBzZXQuCi0JICogVGhpcyBtZWFucyB0aGF0IGl0IHdhcyBleHBsaWNpdGx5IGFkZGVkIGFuZCB3ZSBuZWVkIHRvIHNldHVwIHRoZSBwYXJtcy4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoaXMgYW4gaW50ZXJuYWwgbWV0aG9kIGZvciBCZWFuSW5mby4gSXQgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVBhcmFtZXRlcnMoKSB7Ci0JCWlmICh0aGlzLnNlclBhcm1EZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgbXAgPSBnZXRNZXRob2RQYXJhbWV0ZXJzKCk7Ci0JCWlmIChtcC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47CS8vIE5vdGhpbmcgdGhhdCBjYW4gYmUgZGVzY3JpYmVkLgotCQlpbnQgcHNpemUgPSBNYXRoLm1pbih0aGlzLnNlclBhcm1EZXNjLnNpemUoKSwgbXAuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgcHNpemU7IGkrKykKLQkJCSgoUGFyYW1ldGVyRGVjb3JhdG9yKSB0aGlzLnNlclBhcm1EZXNjLmdldChpKSkuc2V0UGFyYW1ldGVyKChKYXZhUGFyYW1ldGVyKSBtcC5nZXQoaSkpOwotCX0KLQotCi0JLyoKLQkgKiBHZXQgdGhlIGplbSBwYXJhbWV0ZXJzIGZyb20gdGhlIG1ldGhvZCAoamVtIG1ldGhvZCkKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0TWV0aG9kUGFyYW1ldGVycygpIHsKLQkJLy8gR2V0IHRoZSBtZXRob2QKLQkJTWV0aG9kIG0gPSBudWxsOwotCQlPYmplY3QgZCA9IGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJaWYgKGQgaW5zdGFuY2VvZiBNZXRob2QpCi0JCQltID0gKE1ldGhvZCkgZDsKLQkJZWxzZSAKLQkJCWlmIChkIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQkJbSA9ICgoTWV0aG9kUHJveHkpIGQpLmdldE1ldGhvZCgpOwotCQkJZWxzZQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkvLyBOb3QgZGVjb3JhdGluZyBjb3JyZWN0IG9iamVjdC4KLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkvLyBDb3VsZG4ndCBmaW5kIHRoZSBtZXRob2QuCi0JCUxpc3QgcCA9IG0uZ2V0UGFyYW1ldGVycygpOwotCQlyZXR1cm4gcDsKLQl9Ci0JCQkKLQkJCQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJtc0V4cGxpY2l0RW1wdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKCFpc1Bhcm1zRXhwbGljaXRFbXB0eSgpICYmIGdldFNlclBhcm1EZXNjKCkuaXNFbXB0eSgpICYmIChnZXRJbXBsaWNpdGx5U2V0Qml0cygpJihNRVRIT0RfUEFSQU1FVEVSU19JTVBMSUNJVCB8IE1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKSA9PSAwKSB7Ci0JCQkvLyBOb3QgZXhwbGljaXRseSBlbXB0eSwgaXQgaXMgZW1wdHksIGFuZCB3ZSBoYXZlIG5vdCBpbXBsaWNpdGx5IG9yIGJ5IGRlZmF1bHRzIG1hZGUgaXQgZW1wdHksIHRoZW4gY3JlYXRlIHRoZSBkZWZhdWx0cy4KLQkJCWNyZWF0ZURlZmF1bHRQYXJtc0xpc3QoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U2VyUGFybURlc2MoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzR2VuKCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnUGFyYW1ldGVyIERlc2NyaXB0b3JzJyByZWZlcmVuY2UgbGlzdAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VyUGFybURlc2MoKSB7Ci0JCWlmIChzZXJQYXJtRGVzYyA9PSBudWxsKSB7Ci0JCQlzZXJQYXJtRGVzYyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDKTsKLQkJfQotCQlyZXR1cm4gc2VyUGFybURlc2M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlclBhcm1EZXNjKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJNU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJBTUVURVJfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCXJldHVybiBnZXRTZXJQYXJtRGVzYygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0UGFybXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUzoKLQkJCQlnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJZ2V0U2VyUGFybURlc2MoKS5jbGVhcigpOwotCQkJCWdldFNlclBhcm1EZXNjKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldFBhcm1zRXhwbGljaXRFbXB0eShQQVJNU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCWdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCWdldFNlclBhcm1EZXNjKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG92ZXJyaWRkZW4gc28gdGhhdCB3ZSBjYW4gZG8gc3BlY2lhbCBpcyBzZXQgdGVzdHM6Ci0JICogMSkgcGFyYW1ldGVyIGRlc2NyaXB0b3JzOiBjaGVjayBpZiBzZXJQYXJtRGVzYyBleGlzdHMgYW5kIG5vdCBlbXB0eSwgc2luY2UgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIGlzIGRlcml2ZWQuCi0JICogMikgc2VyUGFybURlc2M6IGlmIGZsYWcgc2V0IHRvIGRlZmF1bHQgcGFybSBkZXNjLCB0aGVuIGFuc3dlciBub3Qgc2V0LCBlbHNlIGRvIG5vcm1hbCBpc1NldCB0ZXN0LiBUaGF0IHdheSBpZiBzZXQgYnkgZGVmYXVsdCBpdCB3b24ndCBzZXJpYWxpemUKLQkgKiAgICBvdXQgdGhlIHVubmVlZGVkIGRlZmF1bHQgcGFybXMuIFRoZXkgY2FuIGJlIHJlY29uc3RydWN0ZWQgcXVpY2tseSB3aGVuIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCkpOwkvLyBMZXQgZGVmYXVsdCBzZXJQYXJtRGVzYyBpcyBzZXQgd29yay4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJaWYgKChnZXRJbXBsaWNpdGx5U2V0Qml0cygpICYgTUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCkgIT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3QgY29uc2lkZXJlZCBzZXQgaWYgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdC4KLQkJCQllbHNlCi0JCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwkvLyBOb3Qgc2V0IGJ5IGRlZmF1bHQsIHNvIGNoZWNrIHRydWUgc2V0dGluZy4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7CS8vIEV2ZXJ5dGhpbmcgZWxzZSB1c2UgdGhlIGdlbiBtZXRob2QuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiAhZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCXJldHVybiBzZXJQYXJtRGVzYyAhPSBudWxsICYmICFzZXJQYXJtRGVzYy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvTWV0aG9kUHJveHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2RQcm94eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyOTk0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2RQcm94eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFByb3h5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2RQcm94eUltcGwjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kUHJveHlJbXBsIGV4dGVuZHMgRU9wZXJhdGlvbkltcGwgaW1wbGVtZW50cyBNZXRob2RQcm94eSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kKCkgPGVtPk1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBNZXRob2RQcm94eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BST1hZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRNZXRob2QgPSAoSW50ZXJuYWxFT2JqZWN0KW1ldGhvZDsKLQkJCW1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eShvbGRNZXRob2QpOwotCQkJaWYgKG1ldGhvZCAhPSBvbGRNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NRVRIT0QsIG9sZE1ldGhvZCwgbWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0TWV0aG9kKCkgewotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChNZXRob2QgbmV3TWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRNZXRob2QgPSBtZXRob2Q7Ci0JCW1ldGhvZCA9IG5ld01ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9ELCBvbGRNZXRob2QsIG1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NRVRIT0Q6Ci0JCQkJc2V0TWV0aG9kKChNZXRob2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRDoKLQkJCQlyZXR1cm4gbWV0aG9kICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIyMTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1BhcmFtZXRlckRlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5QYXJhbWV0ZXJEZWNvcmF0b3JJbXBsI2dldFBhcmFtZXRlciA8ZW0+UGFyYW1ldGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJEZWNvcmF0b3JJbXBsIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvckltcGwgaW1wbGVtZW50cyBQYXJhbWV0ZXJEZWNvcmF0b3J7Ci0JCi0JLyoqCi0JICogQml0cyBmb3IgaW1wbGljaXRseSBzZXQgZmVhdHVyZXMuIFRoaXMgaXMgaW50ZXJuYWwsIG5vdCBtZWFudCBmb3IgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUEFSQU1FVEVSX05BTUVfSU1QTElDSVQgPSAweDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyYW1ldGVyRGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVyKCkgPGVtPlBhcmFtZXRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBudWxsOwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogRmxhZyBmb3IgaWYgd2UgdHJpZWQgdG8gbGluayB1cCB0aGlzIHBhcmFtZXRlciB0byBqYXZhIHBhcm0uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRyaWVkT25jZTsKLQkKLQkvKioKLQkgKiBUaGUgSmF2YVBhcmFtZXRlciB0aGF0IHRoaXMgUGFyYW1ldGVyRGVjb3JhdG9yIGlzIGRlY29yYXRpbmcuCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKCkgewotCQlpZiAoIWVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtZXRlckRlY29yYXRvcl9QYXJhbWV0ZXIoKSkgJiYgIXRyaWVkT25jZSkgewotCQkJLy8gTmVlZCB0byB0cnkgdG8gZmlsbCBpbiB0aGUgcGFyYW1ldGVyIHNldHRpbmcuCi0JCQl0cmllZE9uY2UgPSB0cnVlOwotCQkJRU9iamVjdCBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7CS8vIFNlZSBpZiB3ZSBhcmUgaW4gYSBNZXRob2REZWNvcmF0b3IuCi0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kRGVjb3JhdG9ySW1wbCkKLQkJCQkoKE1ldGhvZERlY29yYXRvckltcGwpIGNvbnRhaW5lcikuaW5pdGlhbGl6ZVBhcmFtZXRlcnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldFBhcmFtZXRlckdlbigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXJHZW4oKSB7Ci0JCWlmIChwYXJhbWV0ZXIgIT0gbnVsbCAmJiBwYXJhbWV0ZXIuZUlzUHJveHkoKSkgewotCQkJSmF2YVBhcmFtZXRlciBvbGRQYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7Ci0JCQlwYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcGFyYW1ldGVyKTsKLQkJCWlmIChwYXJhbWV0ZXIgIT0gb2xkUGFyYW1ldGVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUiwgb2xkUGFyYW1ldGVyLCBwYXJhbWV0ZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGJhc2ljR2V0UGFyYW1ldGVyKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIG5ld1BhcmFtZXRlcikgewotCQlpZiAobmV3UGFyYW1ldGVyID09IG51bGwpCi0JCQl0cmllZE9uY2UgPSBmYWxzZTsKLQkJc2V0UGFyYW1ldGVyR2VuKG5ld1BhcmFtZXRlcik7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckdlbihKYXZhUGFyYW1ldGVyIG5ld1BhcmFtZXRlcikgewotCQlKYXZhUGFyYW1ldGVyIG9sZFBhcmFtZXRlciA9IHBhcmFtZXRlcjsKLQkJcGFyYW1ldGVyID0gbmV3UGFyYW1ldGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSLCBvbGRQYXJhbWV0ZXIsIHBhcmFtZXRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFyYW1ldGVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UGFyYW1ldGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGV0YWlscygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJc2V0UHJlZmVycmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cygoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSOgotCQkJCXNldFBhcmFtZXRlcigoSmF2YVBhcmFtZXRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQl1bnNldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXVuc2V0SGlkZGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSOgotCQkJCXNldFBhcmFtZXRlcigoSmF2YVBhcmFtZXRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSOgotCQkJCXJldHVybiBwYXJhbWV0ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9Qcm9wZXJ0eURlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1Byb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTEwMWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1Byb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNpc0JvdW5kIDxlbT5Cb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsI2lzQ29uc3RyYWluZWQgPGVtPkNvbnN0cmFpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsI2lzQWx3YXlzSW5jb21wYXRpYmxlIDxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0RmlsdGVyRmxhZ3MgPGVtPkZpbHRlciBGbGFnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuUHJvcGVydHlEZWNvcmF0b3JJbXBsI2lzRmllbGRSZWFkT25seSA8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyA8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0UmVhZE1ldGhvZCA8ZW0+UmVhZCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlByb3BlcnR5RGVjb3JhdG9ySW1wbCNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5Qcm9wZXJ0eURlY29yYXRvckltcGwjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIFByb3BlcnR5RGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgUHJvcGVydHlEZWNvcmF0b3J7Ci0KLQkvKioKLQkgKiBCaXRzIGZvciBpbXBsaWNpdGx5IHNldCBmZWF0dXJlcy4gVGhpcyBpcyBpbnRlcm5hbCwgbm90IG1lYW50IGZvciBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9FRElUT1JfQ0xBU1NfSU1QTElDSVQgPSAweDFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9UWVBFX0lNUExJQ0lUID0gMHgyTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVCA9IDB4NEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBST1BFUlRZX1dSSVRFTUVUSE9EX0lNUExJQ0lUID0gMHg4TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQgPSAweDEwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUFJPUEVSVFlfQ09OU1RSQUlORURfSU1QTElDSVQgPSAweDIwTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUFJPUEVSVFlfREVTSUdOVElNRV9JTVBMSUNJVCA9IDB4NDBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQUk9QRVJUWV9GSUVMRF9JTVBMSUNJVCA9IDB4ODBMOwotCQotCQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0JvdW5kKCkgPGVtPkJvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQk9VTkRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm91bmQoKSA8ZW0+Qm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJPVU5EX0VGTEFHID0gMSA8PCAxODsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBCb3VuZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQk9VTkRfRVNFVEZMQUcgPSAxIDw8IDE5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uc3RyYWluZWQoKSA8ZW0+Q29uc3RyYWluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ29uc3RyYWluZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05TVFJBSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25zdHJhaW5lZCgpIDxlbT5Db25zdHJhaW5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25zdHJhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RSQUlORURfRUZMQUcgPSAxIDw8IDIwOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIENvbnN0cmFpbmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05TVFJBSU5FRF9FU0VURkxBRyA9IDEgPDwgMjE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNpZ25UaW1lKCkgPGVtPkRlc2lnbiBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Rlc2lnblRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERVNJR05fVElNRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNpZ25UaW1lKCkgPGVtPkRlc2lnbiBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Rlc2lnblRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFU0lHTl9USU1FX0VGTEFHID0gMSA8PCAyMjsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBEZXNpZ24gVGltZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVTSUdOX1RJTUVfRVNFVEZMQUcgPSAxIDw8IDIzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWx3YXlzSW5jb21wYXRpYmxlKCkgPGVtPkFsd2F5cyBJbmNvbXBhdGlibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWx3YXlzSW5jb21wYXRpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbHdheXNJbmNvbXBhdGlibGUoKSA8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbHdheXNJbmNvbXBhdGlibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUcgPSAxIDw8IDI0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyRmxhZ3MoKSA8ZW0+RmlsdGVyIEZsYWdzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlckZsYWdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmlsdGVyRmxhZ3MgPSBudWxsOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpZWxkUmVhZE9ubHkoKSA8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpZWxkUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmllbGRSZWFkT25seSgpIDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmllbGRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVBRF9PTkxZX0VGTEFHID0gMSA8PCAyNTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSA8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHByb3BlcnR5RWRpdG9yQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRNZXRob2QoKSA8ZW0+UmVhZCBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgcmVhZE1ldGhvZCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIFJlYWQgTWV0aG9kIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRUFEX01FVEhPRF9FU0VURkxBRyA9IDEgPDwgMjY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXcml0ZU1ldGhvZCgpIDxlbT5Xcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdyaXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIHdyaXRlTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgV3JpdGUgTWV0aG9kIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXUklURV9NRVRIT0RfRVNFVEZMQUcgPSAxIDw8IDI3OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGQoKSA8ZW0+RmllbGQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmllbGQgZmllbGQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEZpZWxkIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUVMRF9FU0VURkxBRyA9IDEgPDwgMjg7Ci0KLQkvKioKLQkgKiBUaGlzIGl0IHRoZSBwcm9wZXJ0eSB0eXBlLiBJZiBudWxsLCB0aGVuIGl0IHdpbGwKLQkgKiBxdWVyeSBhZ2FpbnN0IG1vZGVsIGVsZW1lbnQgb3duZXIuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzc2lmaWVyIHByb3BlcnR5VHlwZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgUHJvcGVydHlEZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm91bmQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDA7Ci0JfQotCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldFByb3BlcnR5VHlwZSgpIHsKLQkJaWYgKHByb3BlcnR5VHlwZSA9PSBudWxsKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCXJldHVybiAoZmVhdHVyZSAhPSBudWxsKSA/IGZlYXR1cmUuZ2V0RVR5cGUoKSA6IG51bGw7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHByb3BlcnR5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoRUNsYXNzaWZpZXIgcHJvcGVydHlUeXBlKSB7Ci0JCXRoaXMucHJvcGVydHlUeXBlID0gcHJvcGVydHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdW5kKGJvb2xlYW4gbmV3Qm91bmQpIHsKLQkJYm9vbGVhbiBvbGRCb3VuZCA9IChlRmxhZ3MgJiBCT1VORF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0JvdW5kKSBlRmxhZ3MgfD0gQk9VTkRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5CT1VORF9FRkxBRzsKLQkJYm9vbGVhbiBvbGRCb3VuZEVTZXQgPSAoZUZsYWdzICYgQk9VTkRfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBCT1VORF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQsIG9sZEJvdW5kLCBuZXdCb3VuZCwgIW9sZEJvdW5kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Qm91bmQoKSB7Ci0JCWJvb2xlYW4gb2xkQm91bmQgPSAoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkQm91bmRFU2V0ID0gKGVGbGFncyAmIEJPVU5EX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoQk9VTkRfRURFRkFVTFQpIGVGbGFncyB8PSBCT1VORF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkJPVU5EX0VGTEFHOwotCQllRmxhZ3MgJj0gfkJPVU5EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5ELCBvbGRCb3VuZCwgQk9VTkRfRURFRkFVTFQsIG9sZEJvdW5kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Qm91bmQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQk9VTkRfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJhaW5lZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW5lZChib29sZWFuIG5ld0NvbnN0cmFpbmVkKSB7Ci0JCWJvb2xlYW4gb2xkQ29uc3RyYWluZWQgPSAoZUZsYWdzICYgQ09OU1RSQUlORURfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdDb25zdHJhaW5lZCkgZUZsYWdzIHw9IENPTlNUUkFJTkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Q09OU1RSQUlORURfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkQ29uc3RyYWluZWRFU2V0ID0gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gQ09OU1RSQUlORURfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVELCBvbGRDb25zdHJhaW5lZCwgbmV3Q29uc3RyYWluZWQsICFvbGRDb25zdHJhaW5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENvbnN0cmFpbmVkKCkgewotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkID0gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkRVNldCA9IChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKENPTlNUUkFJTkVEX0VERUZBVUxUKSBlRmxhZ3MgfD0gQ09OU1RSQUlORURfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5DT05TVFJBSU5FRF9FRkxBRzsKLQkJZUZsYWdzICY9IH5DT05TVFJBSU5FRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRCwgb2xkQ29uc3RyYWluZWQsIENPTlNUUkFJTkVEX0VERUZBVUxULCBvbGRDb25zdHJhaW5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvbnN0cmFpbmVkKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVzaWduVGltZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBERVNJR05fVElNRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNpZ25UaW1lKGJvb2xlYW4gbmV3RGVzaWduVGltZSkgewotCQlib29sZWFuIG9sZERlc2lnblRpbWUgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdEZXNpZ25UaW1lKSBlRmxhZ3MgfD0gREVTSUdOX1RJTUVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5ERVNJR05fVElNRV9FRkxBRzsKLQkJYm9vbGVhbiBvbGREZXNpZ25UaW1lRVNldCA9IChlRmxhZ3MgJiBERVNJR05fVElNRV9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IERFU0lHTl9USU1FX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRSwgb2xkRGVzaWduVGltZSwgbmV3RGVzaWduVGltZSwgIW9sZERlc2lnblRpbWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZXNpZ25UaW1lKCkgewotCQlib29sZWFuIG9sZERlc2lnblRpbWUgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRUZMQUcpICE9IDA7Ci0JCWJvb2xlYW4gb2xkRGVzaWduVGltZUVTZXQgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChERVNJR05fVElNRV9FREVGQVVMVCkgZUZsYWdzIHw9IERFU0lHTl9USU1FX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+REVTSUdOX1RJTUVfRUZMQUc7Ci0JCWVGbGFncyAmPSB+REVTSUdOX1RJTUVfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUUsIG9sZERlc2lnblRpbWUsIERFU0lHTl9USU1FX0VERUZBVUxULCBvbGREZXNpZ25UaW1lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGVzaWduVGltZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBERVNJR05fVElNRV9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBBTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsd2F5c0luY29tcGF0aWJsZShib29sZWFuIG5ld0Fsd2F5c0luY29tcGF0aWJsZSkgewotCQlib29sZWFuIG9sZEFsd2F5c0luY29tcGF0aWJsZSA9IChlRmxhZ3MgJiBBTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3QWx3YXlzSW5jb21wYXRpYmxlKSBlRmxhZ3MgfD0gQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEUsIG9sZEFsd2F5c0luY29tcGF0aWJsZSwgbmV3QWx3YXlzSW5jb21wYXRpYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbHRlckZsYWdzKCkgewotCQlpZiAoZmlsdGVyRmxhZ3MgPT0gbnVsbCkgewotCQkJZmlsdGVyRmxhZ3MgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1MpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJGbGFnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkUmVhZE9ubHkoYm9vbGVhbiBuZXdGaWVsZFJlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkRmllbGRSZWFkT25seSA9IChlRmxhZ3MgJiBGSUVMRF9SRUFEX09OTFlfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaWVsZFJlYWRPbmx5KSBlRmxhZ3MgfD0gRklFTERfUkVBRF9PTkxZX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklFTERfUkVBRF9PTkxZX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFksIG9sZEZpZWxkUmVhZE9ubHksIG5ld0ZpZWxkUmVhZE9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSB7Ci0JCWlmIChwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGwgJiYgcHJvcGVydHlFZGl0b3JDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkUHJvcGVydHlFZGl0b3JDbGFzcyA9IHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JCQlwcm9wZXJ0eUVkaXRvckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcHJvcGVydHlFZGl0b3JDbGFzcyk7Ci0JCQlpZiAocHJvcGVydHlFZGl0b3JDbGFzcyAhPSBvbGRQcm9wZXJ0eUVkaXRvckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTLCBvbGRQcm9wZXJ0eUVkaXRvckNsYXNzLCBwcm9wZXJ0eUVkaXRvckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlFZGl0b3JDbGFzcyhKYXZhQ2xhc3MgbmV3UHJvcGVydHlFZGl0b3JDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkUHJvcGVydHlFZGl0b3JDbGFzcyA9IHByb3BlcnR5RWRpdG9yQ2xhc3M7Ci0JCXByb3BlcnR5RWRpdG9yQ2xhc3MgPSBuZXdQcm9wZXJ0eUVkaXRvckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1MsIG9sZFByb3BlcnR5RWRpdG9yQ2xhc3MsIHByb3BlcnR5RWRpdG9yQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFJlYWRNZXRob2QoKSB7Ci0JCWlmIChyZWFkTWV0aG9kICE9IG51bGwgJiYgcmVhZE1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkUmVhZE1ldGhvZCA9IHJlYWRNZXRob2Q7Ci0JCQlyZWFkTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcmVhZE1ldGhvZCk7Ci0JCQlpZiAocmVhZE1ldGhvZCAhPSBvbGRSZWFkTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QsIG9sZFJlYWRNZXRob2QsIHJlYWRNZXRob2QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkTWV0aG9kKE1ldGhvZCBuZXdSZWFkTWV0aG9kKSB7Ci0JCU1ldGhvZCBvbGRSZWFkTWV0aG9kID0gcmVhZE1ldGhvZDsKLQkJcmVhZE1ldGhvZCA9IG5ld1JlYWRNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkUmVhZE1ldGhvZEVTZXQgPSAoZUZsYWdzICYgUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBSRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QsIG9sZFJlYWRNZXRob2QsIHJlYWRNZXRob2QsICFvbGRSZWFkTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVhZE1ldGhvZCgpIHsKLQkJTWV0aG9kIG9sZFJlYWRNZXRob2QgPSByZWFkTWV0aG9kOwotCQlib29sZWFuIG9sZFJlYWRNZXRob2RFU2V0ID0gKGVGbGFncyAmIFJFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQlyZWFkTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5SRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRCwgb2xkUmVhZE1ldGhvZCwgbnVsbCwgb2xkUmVhZE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlYWRNZXRob2QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRXcml0ZU1ldGhvZCgpIHsKLQkJaWYgKHdyaXRlTWV0aG9kICE9IG51bGwgJiYgd3JpdGVNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZFdyaXRlTWV0aG9kID0gd3JpdGVNZXRob2Q7Ci0JCQl3cml0ZU1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXdyaXRlTWV0aG9kKTsKLQkJCWlmICh3cml0ZU1ldGhvZCAhPSBvbGRXcml0ZU1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCwgb2xkV3JpdGVNZXRob2QsIHdyaXRlTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyaXRlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdyaXRlTWV0aG9kKE1ldGhvZCBuZXdXcml0ZU1ldGhvZCkgewotCQlNZXRob2Qgb2xkV3JpdGVNZXRob2QgPSB3cml0ZU1ldGhvZDsKLQkJd3JpdGVNZXRob2QgPSBuZXdXcml0ZU1ldGhvZDsKLQkJYm9vbGVhbiBvbGRXcml0ZU1ldGhvZEVTZXQgPSAoZUZsYWdzICYgV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gV1JJVEVfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0QsIG9sZFdyaXRlTWV0aG9kLCB3cml0ZU1ldGhvZCwgIW9sZFdyaXRlTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V3JpdGVNZXRob2QoKSB7Ci0JCU1ldGhvZCBvbGRXcml0ZU1ldGhvZCA9IHdyaXRlTWV0aG9kOwotCQlib29sZWFuIG9sZFdyaXRlTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBXUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCXdyaXRlTWV0aG9kID0gbnVsbDsKLQkJZUZsYWdzICY9IH5XUklURV9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9ELCBvbGRXcml0ZU1ldGhvZCwgbnVsbCwgb2xkV3JpdGVNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBXUklURV9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKCkgewotCQlpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5lSXNQcm94eSgpKSB7Ci0JCQlGaWVsZCBvbGRGaWVsZCA9IGZpZWxkOwotCQkJZmllbGQgPSAoRmllbGQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWZpZWxkKTsKLQkJCWlmIChmaWVsZCAhPSBvbGRGaWVsZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxELCBvbGRGaWVsZCwgZmllbGQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpZWxkIGJhc2ljR2V0RmllbGQoKSB7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZChGaWVsZCBuZXdGaWVsZCkgewotCQlGaWVsZCBvbGRGaWVsZCA9IGZpZWxkOwotCQlmaWVsZCA9IG5ld0ZpZWxkOwotCQlib29sZWFuIG9sZEZpZWxkRVNldCA9IChlRmxhZ3MgJiBGSUVMRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IEZJRUxEX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCwgb2xkRmllbGQsIGZpZWxkLCAhb2xkRmllbGRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaWVsZCgpIHsKLQkJRmllbGQgb2xkRmllbGQgPSBmaWVsZDsKLQkJYm9vbGVhbiBvbGRGaWVsZEVTZXQgPSAoZUZsYWdzICYgRklFTERfRVNFVEZMQUcpICE9IDA7Ci0JCWZpZWxkID0gbnVsbDsKLQkJZUZsYWdzICY9IH5GSUVMRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCwgb2xkRmllbGQsIG51bGwsIG9sZEZpZWxkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RmllbGQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklFTERfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJvdW5kOiAiKTsKLQkJaWYgKChlRmxhZ3MgJiBCT1VORF9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25zdHJhaW5lZDogIik7Ci0JCWlmICgoZUZsYWdzICYgQ09OU1RSQUlORURfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIENPTlNUUkFJTkVEX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzaWduVGltZTogIik7Ci0JCWlmICgoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIERFU0lHTl9USU1FX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx3YXlzSW5jb21wYXRpYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmlsdGVyRmxhZ3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbHRlckZsYWdzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZFJlYWRPbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgYmFzaWNHZXRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gcmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0V3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiB3cml0ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRU1PREVMX0VMRU1FTlRfX0VBTk5PVEFUSU9OUywgRU1vZGVsRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGdldERldGFpbHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1ByZWZlcnJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldEltcGxpY2l0bHlTZXRCaXRzKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJcmV0dXJuIGlzQm91bmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXJldHVybiBpc0NvbnN0cmFpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNEZXNpZ25UaW1lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXJldHVybiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJGbGFncygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzRmllbGRSZWFkT25seSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmllbGQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJc2V0Qm91bmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlzZXRDb25zdHJhaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXNldERlc2lnblRpbWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXNldEZpZWxkUmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1M6Ci0JCQkJc2V0UHJvcGVydHlFZGl0b3JDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXNldFJlYWRNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJc2V0V3JpdGVNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlzZXRGaWVsZCgoRmllbGQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJdW5zZXRCb3VuZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJdW5zZXRDb25zdHJhaW5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJdW5zZXREZXNpZ25UaW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXNldEFsd2F5c0luY29tcGF0aWJsZShBTFdBWVNfSU5DT01QQVRJQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJc2V0RmllbGRSZWFkT25seShGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXVuc2V0UmVhZE1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXVuc2V0V3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXVuc2V0RmllbGQoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QjZUlzU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQlyZXR1cm4gaXNTZXRCb3VuZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlyZXR1cm4gaXNTZXRDb25zdHJhaW5lZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlyZXR1cm4gaXNTZXREZXNpZ25UaW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMCkgIT0gQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBmaWx0ZXJGbGFncyAhPSBudWxsICYmICFmaWx0ZXJGbGFncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSUVMRF9SRUFEX09OTFlfRUZMQUcpICE9IDApICE9IEZJRUxEX1JFQURfT05MWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFdyaXRlTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXJldHVybiBpc1NldEZpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc1dyaXRlYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoKSB7Ci0JCXJldHVybiBnZXRXcml0ZU1ldGhvZCgpICE9IG51bGwgfHwgKGdldEZpZWxkKCkgIT0gbnVsbCAmJiAhaXNGaWVsZFJlYWRPbmx5KCkpOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzUmVhZGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKSB7Ci0JCXJldHVybiBnZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCB8fCBnZXRGaWVsZCgpICE9IG51bGw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vY29tbW9uL0lCYXNlQmVhbkluZm9Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby9jb21tb24vSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjYzYzc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby9jb21tb24vSUJhc2VCZWFuSW5mb0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmNvbW1vbjsKLQotIAotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgdGhlIEJhc2VCZWFuSW5mbyBmb3IgYXJndW1lbnRzLiBUaGlzIGNsYXNzIGlzIGNvbW1vbiBiZXR3ZWVuCi0gKiB0aGUgSURFIGFuZCB0aGUgcmVtb3RlIHZtIHNvIHRoYXQgdGhlc2UgY29uc3RhbnRzIGNhbiBiZSB1c2VkIG9uIGJvdGggc2lkZXMuCi0gKiA8cD4KLSAqIFRoZXNlIGFyZSBjb25zdGFudHMgdXNlZCBpbiBGZWF0dXJlQXR0cmlidXRlcyBhcyBrZXlzLiBUaGUgb3RoZXIgc3BlY2lhbAotICogY29uc3RhbnRzIHRoYXQgYXJlIG5vdCBrZXlzIGluIEZlYXR1cmVBdHRyaWJ1dGVzIGFyZSBsZWZ0IGluIEJhc2VCZWFuSW5mbwotICogc2luY2UgdGhleSBhcmUgbm90IG5lZWRlZCBvbiBib3RoIHNpZGVzLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzZUJlYW5JbmZvQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIEluZGljYXRvciB1c2VkIHRvIGRlc2NyaWJlIGEgZmFjdG9yeSBpbnN0YW50aWF0aW9uIHBhdHRlcm4uIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgQmVhbkRlc2NyaXB0b3IgZm9yIHRoZSBmYWN0b3J5IGNsYXNzLiBJdCB3aWxsIGJlIGNvbXBsZXRlLCBpbiB0aGF0IGlmIHRoaXMKLQkgKiBmYWN0b3J5IGlzIGluaGVyaXRlZCBmcm9tIGFub3RoZXIgZmFjdG9yeSwgaXQgbXVzdCBjb3B5IGluIHRoZSBzdXBlcmNsYXNzJ3MgZmFjdG9yeSBhdHRyaWJ1dGUuIFRoZXkgd29uJ3QgYmUKLQkgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZC4KLQkgKiA8cD4KLQkgKiBUaGUgZm9ybWF0IGlzIGFuIE9iamVjdFtdW10uIFRoZSBmaXJzdCBkaW1lbnNpb24gYXQgaW5kZXggemVybyBpcyBmb3IgdG9vbGtpdCB3aWRlIGluZm9ybWF0aW9uIGFuZCB0aGVuIGluZGV4ZXMgb25lIGFuZCBiZXlvbmQgYXJlIG9uZSBmb3IgZWFjaCBjcmVhdGlvbiBtZXRob2QgbmFtZS4gVGhlIHNlY29uZCBkaW1lbnNpb24gaXMgZm9yIG9uZSBlbnRyeQotCSAqIG9mIGNsYXNzd2lkZSBkYXRhIGFuZCB0aGUgcmVzdCBhcmUgdGhlIGRhdGEgZm9yIAotCSAqIGVhY2ggY3JlYXRpb24gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoZSBmaXJzdCBlbnRyeSBhdCBPYmplY3RbMF0gd2lsbCBiZSA8Y29kZT57aW5pdFN0cmluZywgaXNTaGFyZWQsIG9uRnJlZWZvcm19PC9jb2RlPiB3aGVyZToKLQkgKiA8ZGw+Ci0JICogPGR0PmluaXRTdHJpbmcKLQkgKiA8ZGQ+VGhlIGluaXQgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB0b29sa2l0IGlmIGl0IG5lZWRzIG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lc24ndAotCSAqIG5lZWQgb25lIChpLmUuIGFsbCBzdGF0aWMpIG9yIGlmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkLgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgY29tcG9uZW50IGlzIGRyb3BwZWQgZnJvbSB0aGUgcGFsZXR0ZSB0aGF0IGlzIGZvciBhIHRvb2xraXQgY29tcG9uZW50LgotCSAqIDxkdD5pc1NoYXJlZAotCSAqIDxkZD48Y29kZT5mYWxzZTwvY29kZT4gaWYgZWFjaCBjYWxsIHRvIHRoZSBjcmVhdGlvbiBtZXRob2Qgc2hvdWxkIGhhdmUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRvb2xraXQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdG9vbGtpdCBtYW5hZ2VzIG9ubHkKLQkgKiBvbmUgaW5zdGFuY2UuIFRoaXMgaXMgbW9yZSBsaWtlIGEgY29udHJvbGxlciB0aGFuIGEgdG9vbGtpdCBpbiB0aGlzIGNhc2UuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHNob3VsZAotCSAqIHRyeSB0byByZXVzZSB0aGUgdG9vbGtpdCBvZiB0aGUgcGFyZW50IGlmIGl0IGhhcyBvbmUsICBvciBhbnkgb3RoZXIgZm91bmQgdG9vbGtpdCBvZiB0aGUgc2FtZSB0eXBlLCAoaS5lLiBhIHN1YnR5cGUgd2lsbCBiZSBhY2NlcHRhYmxlKS4gIAotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgY29tcG9uZW50IGlzIGRyb3BwZWQgZnJvbSB0aGUgcGFsZXR0ZSB0aGF0IGlzIGZvciBhIHRvb2xraXQgY29tcG9uZW50LgotCSAqIDxkdD5vbkZyZWVmb3JtCi0JICogPGRkPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0b29sa2l0IGlzIGNyZWF0ZWQgdGhhdCBpdCBzaG91bGQgYXBwZWFyIG9uIHRoZSBmcmVlZm9ybSBzdXJmYWNlIHRvIGJlIHNlbGVjdGFibGUuIFRoaXMgd291bGQgYmUgb2YgdXNlCi0JICogaWYgdGhlIHRvb2xraXQgaGFkIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIHNldC4gSWYgdGhlIHRvb2xraXQgaGFkIG5vIHByb3BlcnRpZXMgdGhlbiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgc2VsZWN0YWJsZSBhbmQgc2hvdWxkCi0JICogbm90IGJlIG9uIHRoZSBmcmVlZm9ybS4gVXNlIDxjb2RlPmZhbHNlPC9jb2RlPiBpbiB0aGF0IGNhc2UuCi0JICogPC9kbD4gCi0JICogPHA+Ci0JICogVGhlIHNlY29uZCBhbmQgb3RoZXIgZW50cmllcyBvZiB0aGUgYXJyYXkgYXJlIG9mIHRoZSBmb3JtYXQ6Ci0JICogPGNvZGU+e21ldGhvZE5hbWUsIHJldHVybmVkQ2xhc3NuYW1lLCBpc1N0YXRpYywgT2JqZWN0W10sIC4uLn08L2NvZGU+IHdoZXJlOgotCSAqIDxkbD4KLQkgKiA8ZHQ+bWV0aG9kTmFtZQotCSAqIDxkZD5UaGUgbmFtZSBvZiB0aGUgY3JlYXRpb24gbWV0aG9kIHRoaXMgZW50cnkgaXMgZm9yIChTdHJpbmcpLgotCSAqIDxkdD5yZXR1cm5lZENsYXNzbmFtZQotCSAqIDxkZD5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2QgKFN0cmluZykuCi0JICogPGR0PmlzU3RhdGljCi0JICogPGRkPjxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4gaWYgdGhlIG1ldGhvZCBpcyBhIHN0YXRpYyBtZXRob2QsIDxjb2RlPkJvb2xlYW4uRkFMU0U8L2NvZGU+IGlmIG5vdC4gCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gYSBjb21wb25lbnQgaXMgZHJvcHBlZCBmcm9tIHRoZSBwYWxldHRlIHRoYXQgaXMgZm9yIGEgdG9vbGtpdCBjb21wb25lbnQuCi0JICogPGR0Pk9iamVjdFtdCi0JICogPGRkPlplcm8gb3IgbW9yZSBhcnJheXMuIFRoZSBhcnJheSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBmb3IgZWFjaCBtZXRob2Qgc2lnbmF0dXJlIHRoYXQgZWFjaAotCSAqIHJlc3BlY3RpdmUgYXJndW1lbnQgaXMgZm9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGFyZyBpcyBub3QgYSBwcm9wZXJ0eS4gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJyYXkgaWYgdGhlcmUKLQkgKiBpcyBtb3JlIHRoYW4gb25lIGZhY3RvcnkgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUsIGFuZCByZXR1cm5zIHRoZSBzYW1lIHR5cGUsIGJ1dCB3aGF0IGlzIGRpZmZlcmVudCBpcyBvbmx5IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAqIElmIHRoZXJlIGlzIGEKLQkgKiBmYWN0b3J5IG1ldGhvZCB0aGF0IGhhcyBubyBwcm9wZXJ0aWVzIGFzIGFyZ3VtZW50cyBvciBoYXMgbm8gYXJndW1lbnRzLCBkb24ndCBpbmNsdWRlIGFuIGFycmF5IGZvciBpdC4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgd2FzIG9ubHkgb25lIGZhY3RvcnkgbWV0aG9kIGFuZCBpdCBoYWQgbm8KLQkgKiBhcmd1bWVudHMgdGhlbiB0aGVyZSB3b3VsZCBub3QgYmUgYW55IGFycmF5cy4KLQkgKiBDdXJyZW50bHkgY2Fubm90IGhhbmRsZSB3aGVyZSBtb3JlIHRoYW4gb25lIG1ldGhvZCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBidXQgZGlmZmVyZW50IHR5cGVzIGZvciB0aGUgYXJndW1lbnRzLgotCSAqIDwvZGw+Ci0JICogPHA+Ci0JICogQSBleGFtcGxlIGlzOgotCSAqIDxwcmU+PGNvZGU+Ci0JICogbmV3IE9iamVjdFtdW10gewotCSAqICAgeyJuZXcgYS5iLmMuVG9vbGtpdChcIkFCQ1wiKSIsIEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRX0sCi0JICogICB7ImNyZWF0ZUJ1dHRvbiIsICJhLmIuYy5CdXR0b24iLCBCb29sZWFuLkZBTFNFLCBuZXcgT2JqZWN0W10geyJwYXJlbnQiLCAidGV4dCJ9LCBuZXcgT2JqZWN0W10geyJwYXJlbnQifX0KLQkgKiB9Ci0JICogPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIFRoaXMgZXhhbXBsZSBzYXlzIHRoYXQgdGhpcyBjbGFzcyBpcyB0b29sa2l0IChmYWN0b3J5KS4gVG8gY29uc3RydWN0IGFuIGluc3RlYWQgdXNlIDxjb2RlPiJuZXcgYS5iLmMuVG9vbGtpdChcIkFCQ1wiKSI8L2NvZGU+IGFuZCBpdCBpcyBzaGFyZWQKLQkgKiB3aXRoIG90aGVyIG9iamVjdHMgY3JlYXRlZCBmcm9tIHRoaXMgZmFjdG9yeSBpbnN0YW5jZS4gQWxzbywgdGhlIGZhY3RvcnkgbWV0aG9kIGlzICJjcmVhdGVCdXR0b24iLCByZXR1cm5zIGFuICJhLmIuYy5CdXR0b24iLCBhbmQgaXQgaXMKLQkgKiBub3QgYSBzdGF0aWMgY2FsbCAoaS5lLiB1c2UgYSB0b29sa2l0IGluc3RhbmNlIHRvIGNyZWF0ZSBpdCkuIEl0IGhhcyB0d28gZm9ybXMgb2YgZmFjdG9yeSBtZXRob2RzLiBPbmUgaXMgdHdvIGFyZ3VtZW50cyB3aGVyZSB0aGUgZmlyc3QKLQkgKiBhcmcgaXMgdGhlIHBhcmVudCBwcm9wZXJ0eSBhbmQgdGhlIHNlY29uZCBhcmcgaXMgdGhlIHRleHQgcHJvcGVydHkuIFRoZSBvdGhlciBmb3JtIGhhcyBvbmx5IG9uZSBhcmd1bWVudCwgdGhlIHBhcmVudCBwcm9wZXJ0eS4KLQkgKiA8cD4KLQkgKiBUaGUgd2F5IHRoaXMgaXMgdXNlZCBpbiBhIHBhbGV0dGUgZW50cnkgdG8gZHJvcCBhIG5ldyBvYmplY3QgdGhhdCBhIHRvb2xraXQgY2FuIGNyZWF0ZSBpcyB0byBoYXZlIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0KLQkgKiA8Y29kZT57dG9vbGtpdDpjbGFzc25hbWV9LmZhY3RvcnltZXRob2QoYXJncyk8L2NvZGU+LiBTbyBmb3IgdGhlIGFib3ZlIGV4YW1wbGUgaXQgd291bGQgYmUgPGNvZGU+e3Rvb2xraXQ6YS5iLmMuVG9vbGtpdH0uY3JlYXRlQnV0dG9uKHBhcmVudCk8L2NvZGU+LgotCSAqIFRoZSBjbGFzc25hbWUgPGI+bXVzdDwvYj4gYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcyBpdCBtdXN0IHVzZSB0aGUgIiQiIGluc3RlYWQgb2YgIi4iIGZvciB0aGUgbmFtZSwgaS5lLiBhLmIuYy5Ub29sa2l0LklubmVyRmFjdG9yeQotCSAqIHdvdWxkIGJlIGEuYi5jLlRvb2xraXQkSW5uZXJGYWN0b3J5LiAKLQkgKiA8cD4KLQkgKiA8Yj5OT1RFOjwvYj4gVGhpcyBpcyBhbiBFWFBFUklNRU5UQUwgQVBJIGFuZCBjYW4gY2hhbmdlIGluIHRoZSBmdXR1cmUgdW50aWwgY29tbWl0dGVkLiAgCi0JICogICAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9DUkVBVElPTiA9ICJGQUNUT1JZX0NSRUFUSU9OIjsvLyROT04tTkxTLTEkCi0JCQotCS8qKgotCSAqIENhdGVnb3J5IGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLiBDYXRlZ29yeSBpcyBhIHByZS1kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lIHRvby4gVGhhdCBpcyB3aGVyZSB0aGUgY2F0ZWdvcnkgaXMgc3RvcmVkIGluIGEKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEVudW1lcmF0aW9uIHZhbHVlcyBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4gRW51bWVyYXRpb24gdmFsdWVzIGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZQotCSAqIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgc3RvcmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFUSU9OVkFMVUVTID0gImVudW1lcmF0aW9uVmFsdWVzIjsvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhlIGtleXMgZm9yIGljb24gZmlsZSBuYW1lcywgTk9UIFRIRSBqYXZhLmF3dC5pY29uIGtleS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OQ09MT1IxNlgxNlVSTCA9ICJJQ09OX0NPTE9SXzE2eDE2X1VSTCI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTkNPTE9SMzJYMzJVUkwgPSAiSUNPTl9DT0xPUl8zMngzMl9VUkwiOyAvLyROT04tTkxTLTEkICAgICAJLy8gTm90IHVzZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OTU9OTzE2WDE2VVJMID0gIklDT05fTU9OT18xNngxNl9VUkwiOyAvLyROT04tTkxTLTEkICAgICAgICAJLy8gTm90IHVzZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OTU9OTzMyWDMyVVJMID0gIklDT05fTU9OT18zMngzMl9VUkwiOyAvLyROT04tTkxTLTEkCQkJLy8gTm90IHVzZWQKLQotCi0JLyoqCi0JICogRmVhdHVyZUF0dHJpYnV0ZSBrZXkgZm9yIGV4cGxpY2l0IHByb3BlcnR5IGNoYW5nZXMuIFRoZSB2YWx1ZSBpcyBhIEJvb2xlYW4uIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaW5kaWNhdGVzIHRoYXQgdGhlIEN1c3RvbWl6ZSBCZWFuIGN1c3RvbWl6ZXIgc3VwcGxpZWQgYnkgdGhlIEJlYW5JbmZvIHdpbGwgaW5kaWNhdGUgd2hpY2gKLQkgKiBwcm9wZXJ0aWVzIGl0IGhhcyBjaGFuZ2VkIHRocm91Z2ggZmlyaW5nIHtAbGluayBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnR9IGluc3RlYWQgb2YgdGhlIAotCSAqIFZpc3VhbCBFZGl0b3IgYXV0b21hdGljYWxseSB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGlmIG5vdCBzZXQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQTElDSVRfUFJPUEVSVFlfQ0hBTkdFID0gIkVYUExJQ0lUX1BST1BFUlRZX0NIQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVzZWQgYnkgVmlzdWFsIEVkaXRvciBhcyBmZWF0dXJlIGF0dHJpYnV0ZSBrZXkvdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBtdXN0IGNyZWF0ZSBhbiBpbXBsaWNpdCBzZXR0aW5nIG9mIGEgcHJvcGVydHkocykuCi0JICogRm9yIGV4YW1wbGUge0BsaW5rIGphdmF4LnN3aW5nLkpGcmFtZSNnZXRDb250ZW50UGFuZSgpfS4gVGhlcmUgbXVzdCBiZSBhIGNvbnRlbnQgcGFuZQotCSAqIHNldCBpbiB0aGUgVkUgbW9kZWwgc28gdGhhdCB1c2VycyBjYW4gZHJvcCB0aGUgY29tcG9uZW50cyBvbiBpdC4gU2V0dGluZyB0aGlzIGhlcmUKLQkgKiBtZWFucyB0aGF0IHRoZSBkZWZhdWx0IGNvbnRlbnQgcGFuZSBmcm9tIHRoZSBKRnJhbWUgd2lsbCBzaG93IHVwIGluIHRoZSBlZGl0b3IgdG8gdXNlLgotCSAqIDxwPgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlIGluIHRoYXQgbm90IGFsbCBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCB0byBhbHdheXMgc2hvdyB1cC4KLQkgKiBUaGV5IGNhbiBiZSBxdWVyaWVkIHdoZW4gbmVlZGVkLgotCSAqIDxwPgotCSAqIFRoZSB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEge0BsaW5rIFN0cmluZ30gZm9yIG9uZSBwcm9wZXJ0eS4gT3IgaXQgY2FuIGJlIGEge0BsaW5rIFN0cmluZ1tdfSBmb3IgbW9yZQotCSAqIHRoYW4gb25lIHByb3BlcnR5LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX0lNUExJQ0lUX1BST1BFUlRJRVMgPSAicmVxdWlyZWRJbXBsaWNpdFByb3BlcnRpZXMiOwkvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vQmVhblJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9CZWFuUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNGIwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9CZWFuUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgQmVhbkRlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCZWFuRGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5SZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5Nzk5MjA2NjRMOwotCQotCXB1YmxpYyBTdHJpbmcgY3VzdG9taXplckNsYXNzTmFtZTsKLQlwdWJsaWMgYm9vbGVhbiBtZXJnZUluaGVyaXRlZFByb3BlcnRpZXM7Ci0JcHVibGljIGJvb2xlYW4gbWVyZ2VJbmhlcml0ZWRPcGVyYXRpb25zOwotCXB1YmxpYyBib29sZWFuIG1lcmdlSW5oZXJpdGVkRXZlbnRzOwotCS8qKgotCSAqIE5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgdG8gbm90IGJlIGluaGVyaXRlZCBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuIEl0IGlzIHNldCBvbmx5Ci0JICogaWYgdGhlIGxpc3QgaXMgbm90IHRoZSBmdWxsIGxpc3Qgb2YgaW5oZXJpdGVkIHByb3BlcnRpZXMuCi0JICogSWYgYWxsIGluaGVyaXRlZCBvciBtZXJnZUluaGVyaXRlZFByb3BlcnRpZXMgaXMgZmFsc2UsIHRoZW4gdGhlIGZpZWxkIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFNhdmUgc3BhY2UgdGhhdCB3YXkuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXM7Ci0JLyoqCi0JICogTmFtZXMgb2Ygb3BlcmF0aW9ucyB0aGF0IGFyZSB0byBub3QgYmUgaW5oZXJpdGVkIGluIGdldEVBbGxPcGVyYXRpb25zKCkuIEl0IGlzIHNldCBvbmx5Ci0JICogaWYgdGhlIGxpc3QgaXMgbm90IHRoZSBmdWxsIGxpc3Qgb2YgaW5oZXJpdGVkIG9wZXJhdGlvbnMuIAotCSAqIElmIGFsbCBhcmUgaW5oZXJpdGVkIG9yIGlmIG1lcmdlSW5oZXJpdGVkT3BlcmF0aW9ucyBpcyBmYWxzZSwgdGhlbiB0aGUgZmllbGQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gU2F2ZSBzcGFjZSB0aGF0IHdheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gbm90SW5oZXJpdGVkT3BlcmF0aW9uTmFtZXM7Ci0JLyoqCi0JICogTmFtZXMgb2YgZXZlbnRzIHRoYXQgYXJlIHRvIG5vdCBiZSBpbmhlcml0ZWQgaW4gZ2V0QWxsRXZlbnRzKCkuIEl0IGlzIHNldCBvbmx5Ci0JICogaWYgdGhlIGxpc3QgaXMgbm90IHRoZSBmdWxsIGxpc3Qgb2YgaW5oZXJpdGVkIGV2ZW50cy4KLQkgKiBJZiBhbGwgYXJlIGluaGVyaXRlZCBvciBpZiBtZXJnZUluaGVyaXRlZEV2ZW50cyBpcyBmYWxzZSwgdGhlbiB0aGUgZmllbGQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gU2F2ZSBzcGFjZSB0aGF0IHdheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gbm90SW5oZXJpdGVkRXZlbnROYW1lczsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9FdmVudFNldFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9FdmVudFNldFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM1MzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRXZlbnRTZXRSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBFdmVudFNldERlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFdmVudFNldERlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudFNldFJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODA3NzM0MjBMOwotCQotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGFkZExpc3RlbmVyTWV0aG9kOwotCXB1YmxpYyBTdHJpbmcgZXZlbnRBZGFwdGVyQ2xhc3NOYW1lOwotCXB1YmxpYyBNZXRob2RSZWNvcmRbXSBsaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzOwotCXB1YmxpYyBTdHJpbmcgbGlzdGVuZXJUeXBlTmFtZTsKLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQlwdWJsaWMgYm9vbGVhbiBpbkRlZmF1bHRFdmVudFNldDsKLQlwdWJsaWMgYm9vbGVhbiB1bmljYXN0OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZUF0dHJpYnV0ZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MGI1NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLQotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHZhbHVlIGZvciBhIEZlYXR1cmVBdHRyaWJ1dGUuIEl0IHdyYXBwZXJzIHRoZSB0cnVlIGphdmEgb2JqZWN0LgotICogVXNlIHRoZSBnZXRPYmplY3QgbWV0aG9kIHRvIGdldCB0aGUgamF2YSB2YWx1ZS4KLSAqIDxwPgotICogV2UgY2FuIG9ubHkgcmVwcmVzZW50IFN0cmluZ3MsIHByaW1pdGl2ZXMsIGFuZCBhcnJheXMuIChQcmltaXRpdmVzIHdpbGwgY29udmVydGVkCi0gKiB0byB0aGVpciB3cmFwcGVyIGNsYXNzIChlLmcuIExvbmcpLCBhbmQgYnl0ZSwgc2hvcnQsIGFuZCBpbnQgd2lsbCBtb3ZlIHVwIHRvIExvbmcsCi0gKiBhbmQgZmxvYXQgd2lsbCBtb3ZlIHVwIHRvIERvdWJsZSkuICBBbmQgYW55IGtpbmQgb2YgdmFsaWQgYXJyYXkgb24gdGhlIGphdmEgQmVhbkluZm8gc2lkZQotICogd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gT2JqZWN0IGFycmF5IG9uIHRoZSBJREUgc2lkZS4gV2UgZG9uJ3QgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBhbGxvdyBtb3JlIGNvbXBsZXggb2JqZWN0cyAKLSAqIGJlY2F1c2UgdGhlIElERSBtYXkgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeSBjbGFzc2VzIGF2YWlsYWJsZSB0byBpdCB0aGF0IAotICogdGhlIEJlYW5JbmZvIG1heSBvZiBoYWQgYXZhaWxhYmxlIHRvIGl0LiBJbnZhbGlkIG9iamVjdHMgd2lsbCBiZSByZXByZXNlbnRlZAotICogYnkgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5JbnZhbGlkT2JqZWN0fS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+Ci0gKiBDbGFzcyBvYmplY3RzIHRoYXQgYXJlIHZhbHVlcyBvZiBGZWF0dXJlIGF0dHJpYnV0ZXMgb24gdGhlIGphdmEgQmVhbkluZm8gc2lkZSB3aWxsIGJlCi0gKiBjb252ZXJ0ZWQgdG8gc2ltcGxlIHN0cmluZ3MgY29udGFpbmluZyB0aGUgY2xhc3NuYW1lIHdoZW4gbW92ZWQgdG8gdGhlIGNsaWVudCAoSURFKSBzaWRlLgotICogVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGFzc2VzIHByb2JhYmx5IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGUgSURFIHNpZGUsIGJ1dCBjYW4gYmUKLSAqIHVzZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIGNsYXNzIHdoZW4gdXNlZCBiYWNrIG9uIHRoZSBqYXZhIHZtIHNpZGUuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgdHJhbnNpZW50IE9iamVjdCB2YWx1ZTsKLQlwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgaW50ZXJuYWxWYWx1ZTsKLQlwcml2YXRlIGJvb2xlYW4gaW1wbGljaXRWYWx1ZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1NzE3NjM0ODQ0TDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZhbHVlIHdpdGggdGhlIGdpdmVuIGluaXQgc3RyaW5nLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLQkgKiBAcGFyYW0gaW5pdFN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoU3RyaW5nIGluaXRTdHJpbmcpIHsKLQkJLy8gVXNlIHRoZSBpbml0IHN0cmluZyB0byBjcmVhdGUgdGhlIHZhbHVlLiBUaGlzIGlzIG91cgotCQkvLyBvd24gc2hvcnQtaGFuZCBmb3IgdGhpcy4KLQkJaWYgKGluaXRTdHJpbmcuc3RhcnRzV2l0aChJTVBMSUNJVCkpIHsKLQkJCXNldEltcGxpY2l0VmFsdWUodHJ1ZSk7Ci0JCQlpbml0U3RyaW5nID0gaW5pdFN0cmluZy5zdWJzdHJpbmcoSU1QTElDSVQubGVuZ3RoKCkpOwotCQl9Ci0JCXZhbHVlID0gcGFyc2VTdHJpbmcoaW5pdFN0cmluZyk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIGN1c3RvbWVyIHdhbnRzIHRvIGZsdWZmIG9uZSB1cC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuc2V0SW50ZXJuYWxWYWx1ZShudWxsKTsKLQl9Ci0JCQotCS8qKgotCSAqIFNldCB0aGUgaW50ZXJuYWwgdmFsdWUuCi0JICogQHBhcmFtIGludGVybmFsVmFsdWUgVGhlIGludGVybmFsVmFsdWUgdG8gc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVybmFsVmFsdWUoT2JqZWN0IGludGVybmFsVmFsdWUpIHsKLQkJdGhpcy5pbnRlcm5hbFZhbHVlID0gaW50ZXJuYWxWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCB2YWx1ZS4gSXQgaXMgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBtYXNzYWdlZCBpbnRvIGFuIGVhc2llciB0byB1c2UgZm9ybQotCSAqIGluIHRoZSBJREUuIEl0IHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgb3V0LiBJdCB3aWxsIG5vdCBiZSByZWNvbnN0cnVjdGVkIGZyb20gYW4gaW5pdCBzdHJpbmcuCi0JICogPHA+IAotCSAqIEl0IGRvZXMgbm90IG5lZWQgdG8gYmUgdXNlZC4gSXQgd2lsbCBiZSBjbGVhcmVkIGlmCi0JICogYSBuZXcgdmFsdWUgaXMgc2V0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZhbHVlIGlzIGEgY29tcGxpY2F0ZWQgYXJyYXkgKGJlY2F1c2UgeW91IGNhbid0IGhhdmUKLQkgKiBzcGVjaWFsIGNsYXNzZXMgaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiB0aGUgQmVhbkluZm8gc2lkZSkgdGhlIGZpcnN0IHVzYWdlIG9mIHRoaXMgdmFsdWUgY2FuCi0JICogYmUgdHJhbnNsYXRlZCBpbnRvIGFuIGVhc2llciBmb3JtIHRvIHVzZSwgc3VjaCBhcyBhIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGludGVybmFsVmFsdWUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbnRlcm5hbFZhbHVlKCkgewotCQlyZXR1cm4gaW50ZXJuYWxWYWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlpZiAoaXNJbXBsaWNpdFZhbHVlKCkpCi0JCQlvdXQuYXBwZW5kKElNUExJQ0lUKTsKLQkJbWFrZVN0cmluZyh2YWx1ZSwgb3V0KTsKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gdGFrZSB0aGUgb2JqZWN0IGFuZCB0dXJuIGl0IGludG8gdGhlCi0JICogc3RyaW5nIGZvcm0gdGhhdCBpcyByZXF1aXJlZCBmb3IgRU1GIHNlcmlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkuIEl0IGNhbiBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAKLQkgKiBwdXJwb3NlcyBieSBjbGllbnRzLCBidXQgdGhleSB3b3VsZCBub3QgaGF2ZSBhbnkgcmVhbAotCSAqIHJ1bnRpbWUgbmVlZCBmb3IgdGhpcy4KLQkgKiA8cD4KLQkgKiBPdXRwdXQgZm9ybWF0IHdvdWxkIGJlICh0aGVyZSB3b24ndCBiZSBhbnkgbmV3bGluZXMgaW4gdGhlIGFjdHVhbCBzdHJpbmcpCi0JICogPHByZT4KLQkgKiAgIFN0cmluZzogInp4dnp4diIKLQkgKiAgIE51bWJlcjogbnVtYmVyCi0JICogICBCb29sZWFuOiB0cnVlIG9yIGZhbHNlCi0JICogICBDaGFyYWN0ZXI6ICdjJwotCSAqICAgbnVsbDogbnVsbAotCSAqIAotCSAqICAgQXJyYXk6IChhbGwgYXJyYXlzIHdpbGwgYmUgdHVybmVkIGludG8gT2JqZWN0W10pCi0JICogICAgIFtkaW1de2UxLCBlMn0KLQkgKiAgICAgW2RpbTFdW2RpbTJde1tkaW0xYV17ZTEsIGUyfSwgW2RpbTJhXXtlMywgZTR9fQotCSAqICAgd2hlcmUgZW4gYXJlIG9iamVjdHMgdGhhdCBmb2xsb3cgdGhlIHBhdHRlcm4gZm9yIHNpbmdsZSBvdXRwdXQgYWJvdmUuCi0JICogCi0JICogICBBbnkgaW52YWxpZCBvYmplY3QgKGkuZS4gbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBoYW5kbGUpIHdpbGwgYmU6Ci0JICogICAgIElOVgotCSAqIAotCSAqICAgQXJyYXlzIG9mIGludmFsaWQgdHlwZXMgKG5vdCBPYmplY3QsIFN0cmluZywgTnVtYmVyLCBCb29sZWFuLCBDaGFyYWN0ZXIsCi0JICogICAgIG9yIHByaW1pdGl2ZXMpIHdpbGwgYmUgbWFya2VkIGFzIElOVi4KLQkgKiA8L3ByZT4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgZm9ybSBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKE9iamVjdCB2YWx1ZSkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQltYWtlU3RyaW5nKHZhbHVlLCBvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFFVT1RFID0gUGF0dGVybi5jb21waWxlKCJcIiIpOwkvLyBQYXR0ZXJuIGZvciBzZWFyY2hpbmcgZm9yIGRvdWJsZS1xdW90ZS4gTWFrZSBpdCBzdGF0aWMgc28gZG9uJ3Qgd2FzdGUgdGltZSBjb21waWxpbmcgZWFjaCB0aW1lLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTEwgPSAibnVsbCI7CS8vIE91dHB1dCBzdHJpbmcgZm9yIG51bGwgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEID0gIklOViI7CS8vIEludmFsaWQgb2JqZWN0IGZsYWcuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElDSVQgPSAiaW1wbGljaXQsIjsJLy8gSW1wbGljaXQgZmxhZy4gLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogVXNlZCBmb3IgcmVjdXJzaXZlIGJ1aWxkaW5nIG9mIHRoZSBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlU3RyaW5nKE9iamVjdCB2YWx1ZSwgU3RyaW5nQnVmZmVyIG91dCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCW91dC5hcHBlbmQoTlVMTCk7Ci0JCWVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCS8vIFN0cmluZzogInN0cmluZyIgb3IgInN0cmluZ1wic3RyaW5nZW5kIiBpZiBzdHIgaW5jbHVkZWQgYSBkb3VibGUtcXVvdGUuCi0JCQlvdXQuYXBwZW5kKCciJyk7Ci0JCQkvLyBJZiBjbGFzcywgdHVybiB2YWx1ZSBpbnRvIHRoZSBjbGFzc25hbWUuCi0JCQlTdHJpbmcgc3RyID0gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgPyAoU3RyaW5nKSB2YWx1ZSA6ICgoQ2xhc3MpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQlpZiAoc3RyLmluZGV4T2YoJyInKSAhPSAtMSkgewotCQkJCS8vIFJlcGxhY2UgZG91YmxlLXF1b3RlIHdpdGggZXNjYXBlIGRvdWJsZS1xdW90ZSBzbyB3ZSBjYW4gZGlzdGlucXVpc2ggaXQgZnJvbSB0aGUgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlLgotCQkJCW91dC5hcHBlbmQoUVVPVEUubWF0Y2hlcihzdHIpLnJlcGxhY2VBbGwoIlxcXFxcIiIpKTsJLy8gRG9uJ3Qga25vdyB3aHkgd2UgbmVlZCB0aGUgYmFjay1zbGFzaCB0byBiZSBkb3VibGVkIGZvciByZXBsYWNlYWxsLCBidXQgaXQgZG9lc24ndCB3b3JrIG90aGVyd2lzZS4gLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlCi0JCQkJb3V0LmFwcGVuZChzdHIpOwotCQkJb3V0LmFwcGVuZCgnXCInKTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJLy8gV2lsbCBnbyBvdXQgYXMgZWl0aGVyIGEgaW50ZWdlciBudW1iZXIgb3IgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuIAotCQkJLy8gV2hlbiByZWFkIGJhY2sgaW4gaXQgd2lsbCBiZSBlaXRoZXIgYSBMb25nIG9yIGEgRG91YmxlLgotCQkJb3V0LmFwcGVuZCh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkvLyBJdCB3aWxsIGdvIG91dCBhcyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KLQkJCW91dC5hcHBlbmQodmFsdWUpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkvLyBDaGFyYWN0ZXI6ICdjJyBvciAnXCcnIGlmIGNoYXIgd2FzIGEgcXVvdGUuCi0JCQlvdXQuYXBwZW5kKCdcJycpOwotCQkJQ2hhcmFjdGVyIGMgPSAoQ2hhcmFjdGVyKSB2YWx1ZTsKLQkJCWlmIChjLmNoYXJWYWx1ZSgpICE9ICdcJycpCi0JCQkJb3V0LmFwcGVuZChjLmNoYXJWYWx1ZSgpKTsKLQkJCWVsc2UKLQkJCQlvdXQuYXBwZW5kKCJcXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LmFwcGVuZCgnXCcnKTsKLQkJfSBlbHNlIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotCQkJLy8gSGFuZGxlIGFycmF5IGZvcm1hdC4KLQkJCUNsYXNzIHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOwotCQkJLy8gU2VlIGlmIGZpbmFsIHR5cGUgaXMgYSB2YWxpZCB0eXBlLgotCQkJQ2xhc3MgZnQgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWludCBkaW1zID0gMTsKLQkJCXdoaWxlIChmdC5pc0FycmF5KCkpIHsKLQkJCQlkaW1zKys7Ci0JCQkJZnQgPSBmdC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQl9Ci0JCQlpZiAoZnQgPT0gT2JqZWN0LmNsYXNzIHx8IGZ0ID09IFN0cmluZy5jbGFzcyB8fCBmdCA9PSBCb29sZWFuLmNsYXNzIHx8IGZ0ID09IENoYXJhY3Rlci5jbGFzcyB8fCBmdC5pc1ByaW1pdGl2ZSgpIHx8IE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZ0KSkgewotCQkJCS8vIFtsZW5ndGhdW11bXSB7Li4uLn0KLQkJCQlvdXQuYXBwZW5kKCdbJyk7Ci0JCQkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7IAotCQkJCW91dC5hcHBlbmQobGVuZ3RoKTsKLQkJCQlvdXQuYXBwZW5kKCddJyk7Ci0JCQkJd2hpbGUoLS1kaW1zID4gMCkgewotCQkJCQlvdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW91dC5hcHBlbmQoJ3snKTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJb3V0LmFwcGVuZCgnLCcpOwotCQkJCQltYWtlU3RyaW5nKEFycmF5LmdldCh2YWx1ZSwgaSksIG91dCk7Ci0JCQkJfQotCQkJCW91dC5hcHBlbmQoJ30nKTsKLQkJCX0gZWxzZQotCQkJCW91dC5hcHBlbmQoSU5WQUxJRCk7CS8vIEFueSBvdGhlciBraW5kIG9mIGFycmF5IGlzIGludmFsaWQuCi0JCX0gZWxzZSB7Ci0JCQlvdXQuYXBwZW5kKElOVkFMSUQpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gdGFrZSB0aGUgc3RyaW5nIGlucHV0IGZyb20gRU1GIHNlcmlhbGl6YXRpb24gYW5kIHR1cm4gaXQKLQkgKiBpbnRvIGFuIE9iamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseS4gSXQgY2FuIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IAotCSAqIHB1cnBvc2VzIGJ5IGNsaWVudHMsIGJ1dCB0aGV5IHdvdWxkIG5vdCBoYXZlIGFueSByZWFsCi0JICogcnVudGltZSBuZWVkIGZvciB0aGlzLgotCSAqIDxwPgotCSAqIFRoZSBvYmplY3Qgd2lsbCBiZSBhbiBvYmplY3QsIG51bGwsIG9yIGFuIE9iamVjdCBhcnJheS4gQW55IHZhbHVlCi0JICogdGhhdCBpcyBpbnZhbGlkIHdpbGwgYmUgc2V0IHRvIHRoZSB7QGxpbmsgSW52YWxpZE9iamVjdCNJTlNUQU5DRX0gc3RhdGljCi0JICogaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybiBvYmplY3QgZGVjb2RlZCBmcm9tIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBAc2VlICNtYWtlU3RyaW5nKE9iamVjdCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmcgaW5wdXQpIHsKLQkJcmV0dXJuIHBhcnNlU3RyaW5nKG5ldyBTdHJpbmdQYXJzZXIoaW5wdXQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nUGFyc2VyIHsKLQkJcHJpdmF0ZSBpbnQgbmV4dD0wOwotCQlwcml2YXRlIGludCBsZW5ndGg7Ci0JCXByaXZhdGUgU3RyaW5nIGlucHV0OwotCQkKLQkJcHVibGljIFN0cmluZ1BhcnNlcihTdHJpbmcgaW5wdXQpIHsKLQkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJCXRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ1BhcnNlcjogXCIiK2lucHV0KyciJzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBza2lwV2hpdGVzcGFjZSgpIHsKLQkJCXdoaWxlKG5leHQgPCBsZW5ndGgpIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoaW5wdXQuY2hhckF0KG5leHQrKykpKSB7Ci0JCQkJCW5leHQtLTsJLy8gUHV0IGl0IGJhY2sgYXMgbm90IHlldCByZWFkIHNpbmNlIGl0IGlzIG5vdCB3aGl0ZXNwYWNlLgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5leHQgaW5kZXgKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJCXJldHVybiBuZXh0OwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGlucHV0Ci0JCSAqIEByZXR1cm4gaW5wdXQgbGVuZ3RoCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIGxlbmd0aDsKLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBSZWFkIHRoZSBjdXJyZW50IGNoYXJhY3RlciBhbmQgZ28gdG8gbmV4dC4KLQkJICogQHJldHVybiBjdXJyZW50IGNoYXJhY3RlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgY2hhciByZWFkKCkgewotCQkJcmV0dXJuIG5leHQ8bGVuZ3RoID8gaW5wdXQuY2hhckF0KG5leHQrKykgOiAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogQmFja3VwIHRoZSBwYXJzZXIgb25lIGNoYXJhY3Rlci4KLQkJICogCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJhY2t1cCgpIHsKLQkJCWlmICgtLW5leHQgPCAwKQotCQkJCW5leHQgPSAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogUGVlayBhdCB0aGUgY2hhciBhdCB0aGUgbmV4dCBpbmRleCwgYnV0IGRvbid0IGluY3JlbWVudCBhZnRlcndhcmRzLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBjaGFyIHBlZWsoKSB7Ci0JCQlyZXR1cm4gbmV4dDxsZW5ndGggPyBpbnB1dC5jaGFyQXQobmV4dCkgOiAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogSGF2ZSB3ZSByZWFkIHRoZSBsYXN0IGNoYXIuCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVhZCBsYXN0IGNoYXIuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGF0RW5kKCkgewotCQkJcmV0dXJuIG5leHQ+PWxlbmd0aDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJlc2V0IHRvIHRoZSBnaXZlbiBuZXh0IGluZGV4LgotCQkgKiBAcGFyYW0gbmV4dEluZGV4IHRoZSBuZXh0IGluZGV4IHRvIGRvIGEgcmVhZCBhdC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzZXQoaW50IG5leHRJbmRleCkgewotCQkJaWYgKG5leHRJbmRleDw9bGVuZ3RoKQotCQkJCW5leHQgPSBuZXh0SW5kZXg7Ci0JCQllbHNlCi0JCQkJbmV4dCA9IGxlbmd0aDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNraXAgdGhlIG5leHQgbnVtYmVyIG9mIGNoYXJzLgotCQkgKiBAcGFyYW0gc2tpcCBudW1iZXIgb2YgY2hhcnMgdG8gc2tpcC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2tpcChpbnQgc2tpcCkgewotCQkJaWYgKChuZXh0Kz1za2lwKSA+IGxlbmd0aCkKLQkJCQluZXh0ID0gbGVuZ3RoOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzdHJpbmcgaW5wdXQuCi0JCSAqIEByZXR1cm4gdGhlIHN0cmluZyBpbnB1dAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldElucHV0KCkgewotCQkJcmV0dXJuIGlucHV0OwotCQl9Ci0JCQkJCi0JfQotCQotCS8qCi0JICogU3RhcnRpbmcgYSBwYXJzZSBmb3IgYW4gb2JqZWN0IGF0IHRoZSBnaXZlbiBpbmRleC4KLQkgKiBSZXR1cm4gdGhlIHBhcnNlZCBvYmplY3Qgb3IgSW52YWxpZE9iamVjdCBpZiBubwotCSAqIG9iamVjdCBvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgcGFyc2VTdHJpbmcoU3RyaW5nUGFyc2VyIHBhcnNlcikgewotCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJaWYgKCFwYXJzZXIuYXRFbmQoKSkgewotCQkJY2hhciBjID0gcGFyc2VyLnJlYWQoKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJyInOgotCQkJCQkvLyBTdGFydCBvZiBhIHF1b3RlZCBzdHJpbmcuIFNjYW4gZm9yIGNsb3NpbmcgcXVvdGUsIGlnbm9yaW5nIGVzY2FwZWQgcXVvdGVzLgotCQkJCQlpbnQgc3RhcnQgPSBwYXJzZXIubmV4dEluZGV4KCk7CS8vIEluZGV4IG9mIGZpcnN0IGNoYXIgYWZ0ZXIgJyInCi0JCQkJCWNoYXJbXSBkZXF1b3RlZCA9IG51bGw7CS8vIFVzZWQgaWYgdGhlcmUgaXMgYW4gZXNjYXBlZCBxdW90ZS4gVGhhdCBpcyB0aGUgb25seSB0aGluZyB3ZSBzdXBwb3J0IGVzY2FwZSBvbiwgcXVvdGVzLgotCQkJCQlpbnQgZGVxdW90ZUluZGV4ID0gMDsKLQkJCQkJd2hpbGUgKCFwYXJzZXIuYXRFbmQoKSkgewotCQkJCQkJY2hhciBjYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQlpZiAoY2MgPT0gJyInKSB7Ci0JCQkJCQkJLy8gSWYgd2UgZGlkbid0IGRlcXVvdGUsIHRoZW4ganVzdCBkbyBzdWJzdHJpbmcuCi0JCQkJCQkJaWYgKGRlcXVvdGVkID09IG51bGwpCi0JCQkJCQkJCXJldHVybiBwYXJzZXIuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIHBhcnNlci5uZXh0SW5kZXgoKS0xKTsJLy8gbmV4dCBpcyBjaGFyIGFmdGVyICciJywgc28gZW5kIG9mIHN0cmluZyBpbmRleCBpcyBpbmRleCBvZiAnIicKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gV2UgaGF2ZSBhIGRlcXVvdGVkIHN0cmluZy4gU28gdHVybiBpbnRvIGEgc3RyaW5nLgotCQkJCQkJCQkvLyBHYXRoZXIgdGhlIGxhc3QgZ3JvdXAKLQkJCQkJCQkJaW50IGVuZE5keCA9IHBhcnNlci5uZXh0SW5kZXgoKS0xOwotCQkJCQkJCQlwYXJzZXIuZ2V0SW5wdXQoKS5nZXRDaGFycyhzdGFydCwgZW5kTmR4LCBkZXF1b3RlZCwgZGVxdW90ZUluZGV4KTsKLQkJCQkJCQkJZGVxdW90ZUluZGV4Kz0gKGVuZE5keC1zdGFydCk7Ci0JCQkJCQkJCXJldHVybiBuZXcgU3RyaW5nKGRlcXVvdGVkLCAwLCBkZXF1b3RlSW5kZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoY2MgPT0gJ1xcJykgewotCQkJCQkJCS8vIFdlIGhhZCBhbiBlc2NhcGUsIHNlZSBpZiBuZXh0IGlzIGEgcXVvdGUuIElmIGl0IGlzIHdlIG5lZWQgdG8gc3RyaXAgb3V0IHRoZSAnXCcuCi0JCQkJCQkJaWYgKHBhcnNlci5wZWVrKCkgPT0gJyInKSB7Ci0JCQkJCQkJCWlmIChkZXF1b3RlZCA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXF1b3RlZCA9IG5ldyBjaGFyW3BhcnNlci5nZXRMZW5ndGgoKV07Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaW50IGVuZE5keCA9IHBhcnNlci5uZXh0SW5kZXgoKS0xOwotCQkJCQkJCQlwYXJzZXIuZ2V0SW5wdXQoKS5nZXRDaGFycyhzdGFydCwgZW5kTmR4LCBkZXF1b3RlZCwgZGVxdW90ZUluZGV4KTsJLy8gR2V0IHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyAnXCcKLQkJCQkJCQkJZGVxdW90ZUluZGV4Kz0gKGVuZE5keC1zdGFydCk7Ci0JCQkJCQkJCS8vIE5vdyBhbHNvIGFkZCBpbiB0aGUgZXNjYXBlZCBxdW90ZS4KLQkJCQkJCQkJZGVxdW90ZWRbZGVxdW90ZUluZGV4KytdID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJc3RhcnQgPSBwYXJzZXIubmV4dEluZGV4KCk7CS8vIE5leHQgZ3JvdXAgaXMgZnJvbSBuZXh0IGluZGV4LgotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsJLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJy0nOgotCQkJCWNhc2UgJzAnOgotCQkJCWNhc2UgJzEnOgotCQkJCWNhc2UgJzInOgotCQkJCWNhc2UgJzMnOgotCQkJCWNhc2UgJzQnOgotCQkJCWNhc2UgJzUnOgotCQkJCWNhc2UgJzYnOgotCQkJCWNhc2UgJzcnOgotCQkJCWNhc2UgJzgnOgotCQkJCWNhc2UgJzknOgotCQkJCQkvLyBQb3NzaWJsZSBudW1iZXIuCi0JCQkJCS8vIFNjYW4gdG8gbmV4dCBub24tZGlnaXQsIG9yIG5vdCBwYXJ0IG9mIHZhbGlkIG51bWJlci4KLQkJCQkJYm9vbGVhbiBudW1iZXJDb21wbGV0ZSA9IGZhbHNlOwotCQkJCQlib29sZWFuIGZsb2F0VHlwZSA9IGZhbHNlOwotCQkJCQlib29sZWFuIGZvdW5kRSA9IGZhbHNlOwotCQkJCQlib29sZWFuIGZvdW5kRVNpZ24gPSBmYWxzZTsKLQkJCQkJc3RhcnQgPSBwYXJzZXIubmV4dEluZGV4KCktMTsJLy8gV2Ugd2FudCB0byBpbmNsdWRlIHRoZSBzaWduIG9yIGZpcnN0IGRpZ2l0IGluIHRoZSBudW1iZXIuCi0JCQkJCXdoaWxlICghcGFyc2VyLmF0RW5kKCkgJiYgIW51bWJlckNvbXBsZXRlKSB7Ci0JCQkJCQljaGFyIGNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCXN3aXRjaCAoY2MpIHsKLQkJCQkJCQljYXNlICcwJzoKLQkJCQkJCQljYXNlICcxJzoKLQkJCQkJCQljYXNlICcyJzoKLQkJCQkJCQljYXNlICczJzoKLQkJCQkJCQljYXNlICc0JzoKLQkJCQkJCQljYXNlICc1JzoKLQkJCQkJCQljYXNlICc2JzoKLQkJCQkJCQljYXNlICc3JzoKLQkJCQkJCQljYXNlICc4JzoKLQkJCQkJCQljYXNlICc5JzoKLQkJCQkJCQkJYnJlYWs7CS8vIFRoaXMgaXMgZ29vZCwgZ28gb24uCi0JCQkJCQkJY2FzZSAnLic6Ci0JCQkJCQkJCWlmIChmbG9hdFR5cGUpCi0JCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsJLy8gV2UgYWxyZWFkeSBmb3VuZCBhICcuJywgdHdvIGFyZSBpbnZhbGlkLgotCQkJCQkJCQlmbG9hdFR5cGUgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICdlJzoKLQkJCQkJCQljYXNlICdFJzoKLQkJCQkJCQkJaWYgKGZvdW5kRSkKLQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwkvLyBXZSBhbHJlYWR5IGZvdW5kIGEgJ2UnLCB0d28gYXJlIGludmFsaWQuCi0JCQkJCQkJCWZvdW5kRSA9IHRydWU7Ci0JCQkJCQkJCWZsb2F0VHlwZSA9IHRydWU7CS8vIEFuICdlJyBtYWtlcyBpdCBhIGZsb2F0LCBpZiBub3QgYWxyZWFkeS4KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnKyc6Ci0JCQkJCQkJY2FzZSAnLSc6Ci0JCQkJCQkJCWlmICghZm91bmRFIHx8IGZvdW5kRVNpZ24pIAotCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7CS8vIEEgKy8tIHdpdGggbm8gJ2UnIGZpcnN0IGlzIGludmFsaWQuIE9yIG1vcmUgdGhhbiBvbmUgc2lnbi4KLQkJCQkJCQkJZm91bmRFU2lnbiA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCS8vIEFueXRoaW5nIGVsc2UgaXMgZW5kIG9mIG51bWJlci4KLQkJCQkJCQkJcGFyc2VyLmJhY2t1cCgpOwkvLyBCYWNrIGl0IHVwIHNvIHRoYXQgbmV4dCBwYXJzZSB3aWxsIHN0YXJ0IHdpdGggdGhpcyBjaGFyLgotCQkJCQkJCQludW1iZXJDb21wbGV0ZSA9IHRydWU7CS8vIFNvIHdlIHN0b3Agc2Nhbm5pbmcKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICghZmxvYXRUeXBlKQotCQkJCQkJCXJldHVybiBMb25nLnZhbHVlT2YocGFyc2VyLmdldElucHV0KCkuc3Vic3RyaW5nKHN0YXJ0LCBwYXJzZXIubmV4dEluZGV4KCkpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2YocGFyc2VyLmdldElucHV0KCkuc3Vic3RyaW5nKHN0YXJ0LCBwYXJzZXIubmV4dEluZGV4KCkpKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ3QnOgotCQkJCWNhc2UgJ1QnOgotCQkJCWNhc2UgJ2YnOgotCQkJCWNhc2UgJ0YnOgotCQkJCQkvLyBQb3NzaWJsZSBib29sZWFuLgotCQkJCQlpZiAocGFyc2VyLmdldElucHV0KCkucmVnaW9uTWF0Y2hlcyh0cnVlLCBwYXJzZXIubmV4dEluZGV4KCktMSwgInRydWUiLCAwLCA0KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwYXJzZXIuc2tpcCgzKTsJLy8gU2tpcCBvdmVyIHJlc3Qgb2Ygc3RyaW5nLgotCQkJCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQkJfSBlbHNlIGlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHRydWUsIHBhcnNlci5uZXh0SW5kZXgoKS0xLCAiZmFsc2UiLCAwLCA1KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwYXJzZXIuc2tpcCg0KTsJLy8gU2tpcCBvdmVyIHJlc3Qgb2Ygc3RyaW5nLgotCQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CQkJCQkJCi0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICdcJyc6Ci0JCQkJCS8vIFBvc3NpYmxlIGNoYXJhY3RlcgotCQkJCQljaGFyIGNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJLy8gV2UgcmVhbGx5IG9ubHkgc3VwcG9ydCAnXFwnIGFuZCAnXCcnIGFueXRoaW5nIGVsc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGlnbm9yZSAnXCcgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhhbmRsZSBmdWxsIGVzY2FwZXMuCi0JCQkJCWlmIChjYyA9PSAnXFwnKQotCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwkvLyBHZXQgd2hhdCdzIGFmdGVyIGl0LgotCQkJCQllbHNlIGlmIChjYyA9PSAnXCcnKQotCQkJCQkJYnJlYWs7CS8vICcnIGlzIGludmFsaWQuCi0JCQkJCWlmIChwYXJzZXIucGVlaygpID09ICdcJycpIHsKLQkJCQkJCS8vIFNvIG5leHQgY2hhciBhZnRlciAiY2hhcmFjdGVyIiBpcyBpcyBhIHF1b3RlLiBUaGlzIGlzIGdvb2QuCi0JCQkJCQlwYXJzZXIucmVhZCgpOwkvLyBOb3cgY29uc3VtZSB0aGUgcXVvdGUKLQkJCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKGNjKTsKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ24nOgotCQkJCQkvLyBQb3NzaWJsZSBudWxsLgotCQkJCQlpZiAocGFyc2VyLmdldElucHV0KCkucmVnaW9uTWF0Y2hlcyhwYXJzZXIubmV4dEluZGV4KCktMSwgIm51bGwiLCAwLCA0KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwYXJzZXIuc2tpcCgzKTsJLy8gU2tpcCBvdmVyIHJlc3Qgb2Ygc3RyaW5nLgotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8vIElmIHdlIGdvdCBoZXJlLCBpdCBpcyBpbnZhbGlkLgotCQkJCQkKLQkJCQljYXNlICdJJzoKLQkJCQkJLy8gUG9zc2libGUgaW52YWxpZCB2YWx1ZS4KLQkJCQkJaWYgKHBhcnNlci5nZXRJbnB1dCgpLnJlZ2lvbk1hdGNoZXMocGFyc2VyLm5leHRJbmRleCgpLTEsIElOVkFMSUQsIDAsIElOVkFMSUQubGVuZ3RoKCkpKSB7Ci0JCQkJCQlwYXJzZXIuc2tpcChJTlZBTElELmxlbmd0aCgpLTEpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ1snOgotCQkJCQkvLyBQb3NzaWJsZSBhcnJheS4KLQkJCQkJLy8gVGhlIG5leHQgZmllbGQgc2hvdWxkIGJlIGEgbnVtYmVyLCBzbyB3ZSdsbCB1c2UgcGFyc2VTdHJpbmcgdG8gZ2V0IHRoZSBudW1iZXIuIAotCQkJCQlPYmplY3Qgc2l6ZSA9IHBhcnNlU3RyaW5nKHBhcnNlcik7Ci0JCQkJCWlmIChzaXplIGluc3RhbmNlb2YgTG9uZykgewotCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7CS8vIFNlIGlmIG5leHQgaXMgJ10nCi0JCQkJCQlpZiAoY2MgPT0gJ10nKSB7Ci0JCQkJCQkJLy8gR29vZCwgd2VsbC1mb3JtZWQgZmlyc3QgZGltZW5zaW9uCi0JCQkJCQkJaW50IGRpbSA9IDE7Ci0JCQkJCQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCQkJCQkJLy8gU2VlIGlmIHRoZXJlIGFyZSBtb3JlIG9mIGp1c3QgIltdIi4gdGhlIG51bWJlciBvZiB0aGVtIGlzIHRoZSBkaW0uCi0JCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJaWYgKGNjID09ICdbJykgewotCQkJCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCQlpZiAoY2MgPT0gJ10nKQotCQkJCQkJCQkJCWRpbSsrOwotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJLy8gVGhpcyBpcyBpbnZhbGlkLgotCQkJCQkJCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJCQkJCQkJcGFyc2VyLmJhY2t1cCgpOwotCQkJCQkJCQkJCWJyZWFrOwkvLyBObyBtb3JlIGRpbXMuCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7Ci0JCQkJCQkJCQlicmVhazsJLy8gTm8gbW9yZSBkaW1zLgotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh2YWxpZCkgewotCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQlpZiAoY2MgPT0gJ3snKSB7Ci0JCQkJCQkJCQkvLyBHb29kLCB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGluaXRpYWxpemF0aW9uIGNvZGUuCi0JCQkJCQkJCQlpbnRbXSBkaW1zID0gbmV3IGludFtkaW1dOwotCQkJCQkJCQkJaW50IGxlbiA9ICgoTG9uZykgc2l6ZSkuaW50VmFsdWUoKTsKLQkJCQkJCQkJCWRpbXNbMF0gPSBsZW47Ci0JCQkJCQkJCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShPYmplY3QuY2xhc3MsIGRpbXMpOwotCQkJCQkJCQkJQXJyYXlzLmZpbGwoKE9iamVjdFtdKSBhcnJheSwgbnVsbCk7CS8vIEJlY2F1c2UgbmV3SW5zdGFuY2UgdXNlZCBhYm92ZSBmaWxscyB0aGUgYXJyYXkgY3JlYXRlZCB3aXRoIGVtcHR5IGFycmF5cyB3aGVuIGEgZGltPjEuCi0JCQkJCQkJCQkKLQkJCQkJCQkJCS8vIE5vdyB3ZSBzdGFydCBmaWxsaW5nIGl0IGluLgotCQkJCQkJCQkJT2JqZWN0IGludlNldHRpbmcgPSBudWxsOwkvLyBXaGF0IHdlIHdpbGwgdXNlIGZvciB0aGUgaW52YWxpZCBzZXR0aW5nLiBJZiB0aGlzIGlzIGEgbXVsdGlkaW0sIHRoaXMgbmVlZHMgdG8gYmUgYW4gYXJyYXkuIFdpbGwgbm90IGNyZWF0ZSBpdCB1bnRpbCBuZWVkZWQuCi0JCQkJCQkJCQlPYmplY3QgZW50cnkgPSBwYXJzZVN0cmluZyhwYXJzZXIpOwkvLyBHZXQgdGhlIGZpcnN0IGVudHJ5Ci0JCQkJCQkJCQlDbGFzcyBjb21wVHlwZSA9IGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQkJCQkJaW50IGkgPSAtMTsKLQkJCQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJCQkJaWYgKCsraSA8IGxlbikgewotCQkJCQkJCQkJCQlpZiAoY29tcFR5cGUuaXNJbnN0YW5jZShlbnRyeSkpIHsKLQkJCQkJCQkJCQkJCS8vIEdvb2QsIGl0IGNhbiBiZSBhc3NpZ25lZC4KLQkJCQkJCQkJCQkJCUFycmF5LnNldChhcnJheSwgaSwgZW50cnkpOwotCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJLy8gQmFkLiBOZWVkIHRvIHNldCBpbnZhbGlkLgotCQkJCQkJCQkJCQkJaWYgKGludlNldHRpbmcgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCS8vIFdlIGhhdmVuJ3QgY3JlYXRlZCBpdCB5ZXQuCi0JCQkJCQkJCQkJCQkJaWYgKGRpbSA9PSAxKQotCQkJCQkJCQkJCQkJCQlpbnZTZXR0aW5nID0gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsgLy8gR3JlYXQsIG9uZSBkaW1lbnNpb25hbCwgd2UgY2FuIHVzZSBpbnZhbGlkIGRpcmVjdGx5Ci0JCQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQkJCS8vIE11bHRpLWRpbS4gTmVlZCB0byBjcmVhdGUgYSB2YWxpZCBhcnJheSB0aGF0IHdlIGNhbiBzZXQuCi0JCQkJCQkJCQkJCQkJCWludFtdIGludkRpbXMgPSBuZXcgaW50W2RpbSAtIDFdOwotCQkJCQkJCQkJCQkJCQlBcnJheXMuZmlsbChpbnZEaW1zLCAxKTsgLy8gTGVuZ3RoIG9uZSBhbGwgb2YgdGhlIHdheSBzbyB0aGF0IHRoZSBmaW5hbCBjb21wb25lbnQgY2FuIGJlIGludmFsaWQgb2JqZWN0Ci0JCQkJCQkJCQkJCQkJCWludlNldHRpbmcgPSBBcnJheS5uZXdJbnN0YW5jZShPYmplY3QuY2xhc3MsIGludkRpbXMpOwotCQkJCQkJCQkJCQkJCQlPYmplY3QgZmluYWxFbnRyeSA9IGludlNldHRpbmc7IC8vIEZpbmFsIGFycmF5ICh3aXRoIGNvbXBvbmVudCB0eXBlIG9mIGp1c3QgT2JqZWN0KS4gU3RhcnQgd2l0aCB0aGUgZnVsbCBhcnJheSBhbmQgd29yayBkb3duLgotCQkJCQkJCQkJCQkJCQlmb3IgKGludCBqID0gaW52RGltcy5sZW5ndGggLSAxOyBqID4gMDsgai0tKSB7Ci0JCQkJCQkJCQkJCQkJCQlmaW5hbEVudHJ5ID0gQXJyYXkuZ2V0KGZpbmFsRW50cnksIDApOwotCQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCUFycmF5LnNldChmaW5hbEVudHJ5LCAwLCBJbnZhbGlkT2JqZWN0LklOU1RBTkNFKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlBcnJheS5zZXQoYXJyYXksIGksIGludlNldHRpbmcpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJCQlpZiAoY2MgPT0gJywnKSB7Ci0JCQkJCQkJCQkJCS8vIEdvb2QsIGdldCBuZXh0Ci0JCQkJCQkJCQkJCWVudHJ5ID0gcGFyc2VTdHJpbmcocGFyc2VyKTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKGNjID09ICd9JykgewotCQkJCQkJCQkJCQkvLyBHb29kLCByZWFjaGVkIHRoZSBlbmQuCi0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCWlmICghcGFyc2VyLmF0RW5kKCkpIHsKLQkJCQkJCQkJCQkJCXBhcnNlci5iYWNrdXAoKTsKLQkJCQkJCQkJCQkJCWVudHJ5ID0gcGFyc2VTdHJpbmcocGFyc2VyKTsgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgaW52YWxpZCwgYnV0IHdlJ2xsIGxldCBhIHdoaXRlc3BhY2UgYWxzbyBkZW5vdGUgbmV4dCBlbnRyeS4KLQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCS8vIEl0J3MgcmVhbGx5IHNjcmV3ZWQgdXAuIFRoZSBzdHJpbmcganVzdCBlbmRlZC4gTG9nIGl0LgotCQkJCQkJCQkJCQkJRXhjZXB0aW9uIGUgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHBhcnNlci50b1N0cmluZygpKTsKLQkJCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQkJLy8gU2VlIGlmIEJlYW5pbmZvIHBsdWdpbiBpcyBhdmFpbGFibGUgKHdlIGFyZSBydW5uaW5nIHVuZGVyIGVjbGlwc2UpLiBJZiBzbywgdXNlIGl0LCBlbHNlIGp1c3QgcHJpbnQgdG8gZXJyb3IuCi0JCQkJCQkJCQkJCQkJLy8gV2UgbWF5IGJlIGluIHRoZSByZW1vdGUgdm0gYW5kIHNvIGl0IHdvbid0IGJlIGF2YWlsYWJsZS4KLQkJCQkJCQkJCQkJCQlDbGFzcyBiaVBsdWdpbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCU1ldGhvZCBnZXRQbHVnaW4gPSBiaVBsdWdpbkNsYXNzLmdldE1ldGhvZCgiZ2V0UGx1Z2luIiwgKENsYXNzW10pIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJTWV0aG9kIGdldExvZ2dlciA9IGJpUGx1Z2luQ2xhc3MuZ2V0TWV0aG9kKCJnZXRMb2dnZXIiLCAoQ2xhc3NbXSkgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlNZXRob2QgbG9nID0gZ2V0TG9nZ2VyLmdldFJldHVyblR5cGUoKS5nZXRNZXRob2QoImxvZyIsIG5ldyBDbGFzc1tdIHtUaHJvd2FibGUuY2xhc3MsIExldmVsLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQlPYmplY3QgYmlQbHVnaW4gPSBnZXRQbHVnaW4uaW52b2tlKG51bGwsIChPYmplY3RbXSkgbnVsbCk7Ci0JCQkJCQkJCQkJCQkJT2JqZWN0IGxvZ2dlciA9IGdldExvZ2dlci5pbnZva2UoYmlQbHVnaW4sIChPYmplY3RbXSkgbnVsbCk7Ci0JCQkJCQkJCQkJCQkJbG9nLmludm9rZShsb2dnZXIsIG5ldyBPYmplY3RbXSB7ZSwgTGV2ZWwuV0FSTklOR30pOwotCQkJCQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQkJCQkJCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJLy8gTm90IGluIGVjbGlwc2UsIHNvIGp1c3QgcHJpbnQgc3RhY2sgdHJhY2UuCi0JCQkJCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJcmV0dXJuIGFycmF5OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBXcml0ZSBvdXQgYW55IGhpZGRlbiBzdHVmZgotCQlvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCXdyaXRlT2JqZWN0KHZhbHVlLCBvdXQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IHZhbHVlLCBPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCW91dC53cml0ZU9iamVjdCh2YWx1ZSk7Ci0JCWVsc2UgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpCi0JCQkJb3V0LndyaXRlT2JqZWN0KCgoQ2xhc3MpIHZhbHVlKS5nZXROYW1lKCkpOwotCQkJZWxzZSBpZiAoIXZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8IHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJb3V0LndyaXRlT2JqZWN0KHZhbHVlKTsKLQkJCQllbHNlCi0JCQkJCW91dC53cml0ZU9iamVjdChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQXJyYXkgaXMgdHJpY2t5LiBTZWUgaWYgaXQgaXMgb25lIHdlIGNhbiBoYW5kbGUsIGlmIG5vdCB0aGVuIGludmFsaWQuIAotCQkJCS8vIFRvIGluZGljYXRlIGFycmF5LCB3ZSB3aWxsIGZpcnN0IHdyaXRlIG91dCB0aGUgQ2xhc3Mgb2YgdGhlIENvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheSAoaXQgd2lsbAotCQkJCS8vIGJlIGNvbnZlcnRlZCB0byBiZSBPYmplY3Qgb3IgT2JqZWN0W10uLi4pLgotCQkJCS8vIFRoaXMgd2lsbCBiZSB0aGUgY2x1ZSB0aGF0IGFuIGFycmF5IGlzIGNvbWluZy4gQ2xhc3MgdmFsdWVzIHdpbGwgbmV2ZXIKLQkJCQkvLyBiZSByZXR1cm5lZCwgc28gdGhhdCBpcyBob3cgd2UgY2FuIHRlbGwgaXQgaXMgYW4gYXJyYXkuCi0JCQkJLy8gTm90ZTogVGhlIHJlYXNvbiB3ZSBhcmUgdXNpbmcgdGhlIGNvbXBvbmVudCB0eXBlIChjb252ZXJ0ZWQgdG8gT2JqZWN0KSBpcyBiZWNhdXNlIHRvIHJlY29uc3RydWN0IG9uIHRoZSBvdGhlciBzaWRlIHdlIG5lZWQKLQkJCQkvLyB0byB1c2UgdGhlIGNvbXBvbmVudCB0eXBlIHBsdXMgbGVuZ3RoIG9mIHRoZSBhcnJheSdzIGZpcnN0IGRpbWVuc2lvbi4KLQkJCQkvLyAKLQkJCQkvLyBXZSBjYW4gbm90IGp1c3Qgc2VyaWFsaXplIHRoZSBhcnJheSBpbiB0aGUgbm9ybWFsIHdheSBiZWNhdXNlIGl0IG1heSBjb250YWluIGludmFsaWQgdmFsdWVzLCBhbmQgd2UgbmVlZCB0byAKLQkJCQkvLyBoYW5kbGUgdGhhdC4gQWxzbywgaWYgaXQgd2Fzbid0IGFuIE9iamVjdCBhcnJheSwgd2UgbmVlZCB0byB0dXJuIGl0IGludG8gYW4gb2JqZWN0IGFycmF5LiBXZSBuZWVkIGNvbnNpc3RlbmN5Ci0JCQkJLy8gaW4gdGhhdCBpdCBzaG91bGQgYWx3YXlzIGJlIGFuIE9iamVjdCBhcnJheS4KLQkJCQkvLyBTbyBvdXRwdXQgZm9ybWF0IHdpbGwgYmU6Ci0JCQkJLy8gQ2xhc3MoY29tcG9uZW50IHR5cGUpCi0JCQkJLy8gaW50KHNpemUgb2YgZmlyc3QgZGltZW5zaW9uKQotCQkJCS8vIE9iamVjdCh2YWx1ZSBvZiBmaXJzdCBlbnRyeSkgLSBBY3R1YWxseSB1c2Ugb3V0IHdyaXRlT2JqZWN0KCkgZm9ybWF0IHRvIGFsbG93IG5lc3Rpbmcgb2YgYXJyYXlzLgotCQkJCS8vIE9iamVjdCh2YWx1ZSBvZiBzZWNvbmQgZW50cnkpCi0JCQkJLy8gLi4uIHVwIHRvIHNpemUgb2YgZGltZW5zaW9uLgotCQkJCUNsYXNzIHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOwotCQkJCS8vIFNlZSBpZiBmaW5hbCB0eXBlIGlzIGEgdmFsaWQgdHlwZS4KLQkJCQlDbGFzcyBmdCA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCWludCBkaW1zID0gMTsKLQkJCQl3aGlsZSAoZnQuaXNBcnJheSgpKSB7Ci0JCQkJCWRpbXMrKzsKLQkJCQkJZnQgPSBmdC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJfQotCQkJCWlmIChmdCA9PSBPYmplY3QuY2xhc3MgfHwgZnQgPT0gU3RyaW5nLmNsYXNzIHx8IGZ0ID09IEJvb2xlYW4uY2xhc3MgfHwgZnQgPT0gQ2hhcmFjdGVyLmNsYXNzIHx8IGZ0LmlzUHJpbWl0aXZlKCkgfHwgZnQgPT0gQ2xhc3MuY2xhc3MgfHwgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZnQpKSB7Ci0JCQkJCVN0cmluZyBqbmlUeXBlID0gZGltcyA9PSAxID8gImphdmEubGFuZy5PYmplY3QiIDogTWFwVHlwZXMuZ2V0Sk5JVHlwZU5hbWUoImphdmEubGFuZy5PYmplY3QiLCBkaW1zLTEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBDbGFzcy5mb3JOYW1lKGpuaVR5cGUpOwotCQkJCQkJb3V0LndyaXRlT2JqZWN0KGNvbXBvbmVudFR5cGUpOwotCQkJCQkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7Ci0JCQkJCQlvdXQud3JpdGVJbnQobGVuZ3RoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl3cml0ZU9iamVjdChBcnJheS5nZXQodmFsdWUsIGkpLCBvdXQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gT2JqZWN0IGFycmF5cyBhcmUgYWx3YXlzIGF2YWlsYWJsZS4KLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlvdXQud3JpdGVPYmplY3QoSW52YWxpZE9iamVjdC5JTlNUQU5DRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIFJlYWQgaW4gYW55IGhpZGRlbiBzdHVmZgotCQlpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQkKLQkJdmFsdWUgPSByZWFkQWN0dWFsT2JqZWN0KGluKTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgcmVhZEFjdHVhbE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHZhbCA9IGluLnJlYWRPYmplY3QoKTsKLQkJaWYgKHZhbCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQkvLyBJdCBtdXN0IGJlIGFuIGFycmF5LiBPbmx5IENsYXNzIG9iamVjdHMgdGhhdCBjb21lIGluIGFyZSBBcnJheXMgb2YgT2JqZWN0LgotCQkJaW50IGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKLQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKChDbGFzcykgdmFsLCBsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUFycmF5LnNldChhcnJheSwgaSwgcmVhZEFjdHVhbE9iamVjdChpbikpOwotCQkJfQotCQkJcmV0dXJuIGFycmF5OwotCQl9IGVsc2UKLQkJCXJldHVybiB2YWw7CS8vIEl0IGlzIHRoZSB2YWx1ZSBpdHNlbGYuCi0JfQotCi0JCi0JLyoqCi0JICogSXMgdGhpcyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgYW4gaW1wbGljaXQgdmFsdWUsIGkuZS4gb25lIHRoYXQgY2FtZSBmcm9tCi0JICogQmVhbkluZm8gSW50cm9zcGVjdGlvbiBhbmQgbm90IGZyb20gYW4gb3ZlcnJpZGUgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltcGxpY2l0VmFsdWUuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdFZhbHVlKCkgewotCQlyZXR1cm4gaW1wbGljaXRWYWx1ZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGltcGxpY2l0IHZhbHVlIGZsYWcuCi0JICogQHBhcmFtIGltcGxpY2l0VmFsdWUgVGhlIGltcGxpY2l0VmFsdWUgdG8gc2V0LgotCSAqIAotCSAqIEBzZWUgI2lzSW1wbGljaXRWYWx1ZSgpCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wbGljaXRWYWx1ZShib29sZWFuIGltcGxpY2l0VmFsdWUpIHsKLQkJdGhpcy5pbXBsaWNpdFZhbHVlID0gaW1wbGljaXRWYWx1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZVJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM5MmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZVJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgRmVhdHVyZURlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBGZWF0dXJlRGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTI3NjY0OEw7Ci0JCi0JcHVibGljIFN0cmluZyBuYW1lOwkvLyBTb21lIGRlY29yYXRvcnMgdXNlIHRoaXMgYW5kIG90aGVycyBkb24ndC4gRWFjaCBkZWNvcmF0b3IgdHlwZSB3aWxsIGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMgb2YgaW1wb3J0YW5jZS4KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlOYW1lOwotCXB1YmxpYyBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGNhdGVnb3J5OwotCXB1YmxpYyBib29sZWFuIGV4cGVydDsKLQlwdWJsaWMgYm9vbGVhbiBoaWRkZW47Ci0JcHVibGljIGJvb2xlYW4gcHJlZmVycmVkOwotCXB1YmxpYyBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lczsKLQlwdWJsaWMgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlW10gYXR0cmlidXRlVmFsdWVzOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0lCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2NzQ0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0lCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGVzZSBhcmUgY29uc3RhbnRzIG5lZWRlZCBmb3IgdHJhbnNmZXJyaW5nIEJlYW5JbmZvIHJlc3VsdHMgZnJvbSB0aGUgQmVhbkluZm8gVk0uCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIEJlYW5EZWNvcmF0b3IuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19CRUFOX0RFQ09SID0gMHgxOwotCQotCS8qKgotCSAqIEludHJvc3BlY3Rpb24gYml0IGZsYWcgaW5kaWNhdGluZyBkbyB0aGUgUHJvcGVydGllcy4gU2VudCB0byBNb2RlbGluZ0JlYW5JbmZvLmludHJvc3BlY3QgbWV0aG9kLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPX1BST1BFUlRJRVMgPSAweDI7Ci0KLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIE1ldGhvZHMuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19NRVRIT0RTID0gMHg0OwotCi0JLyoqCi0JICogSW50cm9zcGVjdGlvbiBiaXQgZmxhZyBpbmRpY2F0aW5nIGRvIHRoZSBFdmVudHMuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19FVkVOVFMgPSAweDg7Ci0KLQkvKioKLQkgKiBCZWFuRGVjb3JhdG9yIHdhcyBzZW50IGNvbW1hbmQgaWQuIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIGRhdGEgZm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgYSBCZWFuUmVjb3JkIGZyb20gdGhlIE9iamVjdElucHV0U3RyZWFtLgotCSAqIAotCSAqIEBzZWUgQmVhblJlY29yZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUFOX0RFQ09SQVRPUl9TRU5UID0gMTsKLQotCS8qKgotCSAqIFByb3BlcnR5RGVjb3JhdG9ycyBzZW5kIGNvbW1hbmQgaWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgIGFuIGludCBhbmQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgUHJvcGVydHlSZWNvcmQvSW5kZXhlZFByb3BlcnR5UmVjb3JkLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBQcm9wZXJ0eVJlY29yZAotCSAqIEBzZWUgSW5kZXhlZFByb3BlcnR5UmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UID0gMjsKLQotCS8qKgotCSAqIE1ldGhvZERlY29yYXRvcnMgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4KLQkgKiBUaGUgZmlyc3Qgb2JqZWN0IHdpbGwgYmUgIGFuIGludCBhbmQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgTWV0aG9kUmVjb3JkLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBNZXRob2RSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfREVDT1JBVE9SU19TRU5UID0gMzsKLQkKLQkvKioKLQkgKiBFdmVudFNldERlY29yYXRvcnMgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IG9iamVjdCB3aWxsIGJlICBhbiBpbnQgYW5kIHdpbGwgYmUgdGhlIG51bWJlciBvZiBldmVudHMgYW5kIGVhY2ggb2JqZWN0IGFmdGVyIHRoYXQKLQkgKiB3aWxsIGJlIGEgRXZlbnRTZXRSZWNvcmQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2VlIE1ldGhvZFJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFQ09SQVRPUlNfU0VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBEb25lIHNlbmQgY29tbWFuZCBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoaXMgY29tbWFuZCBpZCBtZWFucyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYW5kIGl0IHNob3VsZCByZXR1cm4uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzZWUgTWV0aG9kUmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9ORSA9IDU7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbmRleGVkUHJvcGVydHlSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkMjkxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5UmVjb3JkIGV4dGVuZHMgUHJvcGVydHlSZWNvcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODMyMjc5OTBMOwotCQotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGluZGV4ZWRSZWFkTWV0aG9kOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGluZGV4ZWRXcml0ZU1ldGhvZDsKLQlwdWJsaWMgU3RyaW5nIGluZGV4ZWRQcm9wZXJ0eVR5cGVOYW1lOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbnZhbGlkT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ludmFsaWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3MzFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ludmFsaWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogQW4gaW5kaWNhdG9yIG9iamVjdCBmb3IgaW52YWxpZCBvYmplY3QgdHlwZS4gVGhpcyBpcyB1c2VkIHdpdGggZmVhdHVyZSBhdHRyaWJ1dGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBCZWFuSW5mbyBjbGFzc2VzLiBXZSBjYW4gb25seSBoYW5kbGUgY2VydGFpbiB0eXBlcyB3aGVuIHdlCi0gKiBicmluZyB0aGVtIG92ZXIgZnJvbSB0aGUgQmVhbkluZm8gVk0uIFRoYXQgaXMgYmVjYXVzZSB0aGUgY2xhc3NlcyBpbnN0YW50aWF0ZWQKLSAqIGluIHRoZSBCZWFuSW5mbyBjbGFzcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgSURFLiAgU28gYW55IGludmFsaWQgdmFsdWUKLSAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhpcyBjbGFzcyBpbnN0YW5jZS4KLSAqIDxwPgotICogVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcy4KLSAqIFRoZXJlIHdpbGwgYmUgb25lIGluc3RhbmNlIChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKSBpbiB0aGUgc3lzdGVtLiBUaGF0IHdheQotICogIj09IiBjYW4gYmUgdXNlZCB0byB0ZXN0IGZvciBpdC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkT2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkKLQkvKioKLQkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgSW52YWxpZE9iamVjdC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludmFsaWRPYmplY3QgSU5TVEFOQ0UgPSBuZXcgSW52YWxpZE9iamVjdCgpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU2NDM4MDQzNzBMOwotCQotCS8qCi0JICogTm9ib2R5IGVsc2Ugc2hvdWxkIGNyZWF0ZSBvbmUgb2YgdGhlc2UuCi0JICovCi0JcHJpdmF0ZSBJbnZhbGlkT2JqZWN0KCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9NZXRob2RSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzN2JlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIE1ldGhvZERlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNZXRob2REZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk4MjIxMzExMEw7Ci0JCi0JLyoqCi0JICogTWV0aG9kIHNpZ25hdHVyZSBmb3IgdGhlIG1ldGhvZCB0aGlzIHJlY29yZCBkZXNjcmliZXMuCi0JICovCi0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgbWV0aG9kRm9yRGVzY3JpcHRvcjsKLQkvKioKLQkgKiBQYXJhbWV0ZXIgcmVjb3JkcyBhcnJheS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZW4ndCBhbnkuCi0JICovCi0JcHVibGljIFBhcmFtZXRlclJlY29yZFtdIHBhcmFtZXRlcnM7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1BhcmFtZXRlclJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9QYXJhbWV0ZXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZjM3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1BhcmFtZXRlclJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yLgotICogPHA+Ci0gKiBUaGUgb25seSBmaWVsZCBvZiBpbXBvcnRhbmNlIGlzIHRoZSBuYW1lLCBhbmQgdGhhdCBjb21lcyBmcm9tIEZlYXR1cmVSZWNvcmQuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJSZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODI0Mzg5NTVMOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9Qcm9wZXJ0eVJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTAzMjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUHJvcGVydHlSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5NzkyNzY2NDhMOwotCQotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlFZGl0b3JDbGFzc05hbWU7Ci0JcHVibGljIFN0cmluZyBwcm9wZXJ0eVR5cGVOYW1lOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIHJlYWRNZXRob2Q7Ci0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgd3JpdGVNZXRob2Q7Ci0JcHVibGljIFJlZmxlY3RGaWVsZFJlY29yZCBmaWVsZDsKLQlwdWJsaWMgYm9vbGVhbiBib3VuZDsKLQlwdWJsaWMgYm9vbGVhbiBjb25zdHJhaW5lZDsKLQlwdWJsaWMgQm9vbGVhbiBkZXNpZ25UaW1lOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0RmllbGRSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUmVmbGVjdEZpZWxkUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Mjk4MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0RmllbGRSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZsZWN0RmllbGRSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODE1MTI0NTNMOwotCQotCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lOwotCXB1YmxpYyBTdHJpbmcgZmllbGROYW1lOwotCXB1YmxpYyBib29sZWFuIHJlYWRPbmx5OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RNZXRob2RSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMTI5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RNZXRob2RSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmxlY3RNZXRob2RSZWNvcmQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODE1MTI3NzNMOwotCQotCXB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lOwotCXB1YmxpYyBTdHJpbmcgbWV0aG9kTmFtZTsKLQlwdWJsaWMgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzOwkvLyBNYXliZSBudWxsIGlmIG5vIHBhcmFtZXRlcnMuCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4MjdmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG1vZGVsLyxcCi0gICAgICAgICAgICAgICByb3NlLyxcCi0gICAgICAgICAgICAgICBwcm94eS5qYXJzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLXNvdXJjZS4uID0gYmVhbmluZm8KLW91dHB1dC4uID0gYmluLwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9tb2RlbC9iZWFuaW5mby5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2JlYW5pbmZvLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzkyNTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2JlYW5pbmZvLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImJlYW5pbmZvIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9iZWFuaW5mby5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5iZWFuaW5mbyI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmVhdHVyZURlY29yYXRvciIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VBbm5vdGF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEZlYXR1cmVEZXNjcmlwdG9yIGluIGphdmEuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBJZiBhbnkgYXR0cmlidXRlIGlzIGV4cGxpY2l0bHkgc2V0IHRoZW4gdGhlIEJlYW5JbmZvL1JlZmxlY3Rpb24gd2lsbCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIGRlY29yYXRvci4gVGhpcyBwcm92aWRlcyBhIHdheSBvZiBvdmVycmlkaW5nIHRoZSBCZWFuSW5mb3MuIEFsc28gZm9yIGFueSBtYW55LXZhbHVlZCBhdHRyaWJ1dGUsIGlmIGl0IGlzIGRlc2lyZWQgdG8gaGF2ZSBpdCBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBmaWxsIGl0IGluLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgYXR0cmlidXRlIG5hbWVkIG9mIHRoZSBmb3JtICZxdW90O2F0dGlidXR1ZUV4cGxpY2l0RW1wdHkmcXVvdDsgSWYgdGhpcyBpcyB0cnVlIHRoZW4gdGhlIEJlYW5JbmZvIHdpbGwgbm90IG1lcmdlIGluIGFuZCB3aWxsIGxlYXZlIGl0IGVtcHR5LiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhlc2UgY29tbWVudHMgYWJvdXQgbWVyZ2luZyBhcHBseSB0byBhbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGRlY29yYXRvciB0b28uICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNob3J0RGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhwZXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoaWRkZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZlcnJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VJbnRyb3NwZWN0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNob3VsZCB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGJlIG1lcmdlZCBpbnRvIHRoaXMgZGVjb3JhdG9yLiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGFyZSBpZ25vcmVkIGZvciB0aGlzIHBhcnRpY3VsYXIgZGVjb3JhdG9yLiBUaGlzIGlzIGFuIGludGVybmFsIGZlYXR1cmUgc2ltcGx5IHRvIGFsbG93IGRlc2lyZWQgb3ZlcnJpZGUgY2FwYWJpbGl0aWVzLiBDdXN0b21lcnMgd291bGQgdXNlIGl0IHRvIHByZXZlbnQgQU5ZIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbiBmcm9tIG9jY3VycmluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF0dHJpYnV0ZXMgYXJlIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBub3QgcmV0cmlldmVkIGZyb20gdGhlIGJlYW5pbmZvL3JlZmxlY3Rpb24uIEN1c3RvbWVycyBzaG91bGQgc2V0IHRoaXMgaWYgdGhleSB3YW50IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gYmUgZW1wdHkgYW5kIG5vdCBtZXJnZWQgd2l0aCB0aGUgQmVhbkluZm8gcmVzdWx0cy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0bHlTZXRCaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgYml0ZmxhZyBmb3Igd2hpY2ggYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0IGJ5IEJlYW5JbmZvL1JlZmxlY3Rpb24uJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGlzIGFuIGludGVybmFsIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvIG1haW50YW5hbmNlLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0RGVjb3JhdG9yRmxhZyIKLSAgICAgICAgZVR5cGU9IiMvL0ltcGxpY2l0SXRlbSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgZGVjb3JhdG9yL2ZlYXR1cmUgaW1wbGljaXQuIFRoaXMgbWVhbnMgY3JlYXRlZCBieSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24gYW5kIG5vdCBieSBjdXN0b21lci4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmVhdHVyZSBhdHRyaWJ1dGVzLiBLZXkvdmFsdWUgcGFpcnMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgZmVhdHVyZSBhdHRyaWJ1dGVzIGlzIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvL3JlZmxlY3Rpb24gc2V0IGl0LCBzZXQgYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmVhbkRlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVxdWl2YWxlbnQgdG8gQmVhbkRlY29yYXRvciBpbiBqYXZhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXJnZVN1cGVyUHJvcGVydGllcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIHByb3BlcnRpZXMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsQXR0cmlidXRlcy9lQWxsUmVmZXJlbmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VTdXBlck1ldGhvZHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBtZXRob2RzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEJlaGF2aW9ycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VTdXBlckV2ZW50cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIGV2ZW50cyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxFdmVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludHJvc3BlY3RQcm9wZXJ0aWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNob3VsZCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgcHJvcGVydGllcyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRyb3NwZWN0TWV0aG9kcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIG1ldGhvZHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIG1ldGhvZHMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50cm9zcGVjdEV2ZW50cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIGV2ZW50cyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgZXZlbnRzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRvQmVhbmluZm8iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBtZWFucyBkbyB3ZSBnbyBhbmQgZ2V0IHRoZSBiZWFuaW5mbyBmcm9tIHRoZSByZW1vdGUgdm0uIElmIGZhbHNlLCB0aGVuIGl0IHdpbGwgbm90IHRyeSB0byBnZXQgdGhlIGJlYW5pbmZvLiBUaGlzIGRvZXNuJ3QgcHJldmVudCBpbnRyb3NwZWN0aW9uIHRocm91Z2ggcmVmbGVjdGlvbi4gVGhhdCBpcyBjb250cm9sZWQgYnkgdGhlIHNlcGFyYXRlIGludHJvc3BlY3QuLi4gYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbFByb3BlcnRpZXMoKS4gVGhlc2UgbmFtZXMgYXJlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90IGJlIGluaGVyaXRlZCBhbmQgc2hvdWxkIG5vdCBzaG93IHRocm91Z2guIElmIHRoZSBpbmhlcml0ZWQgcHJvcGVydHkgaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbFByb3BlcnRpZXMoKS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJQcm9wZXJ0aWVzIGZsYWcgaXMgZmFsc2UuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgbWVhbnQgdG8gYmUgY2hhbmdlZCBieSBjbGllbnRzLiBJdCBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIG1ldGhvZCBuYW1lcyB0byBub3QgdXNlIGluIGVBbGxPcGVyYXRpb25zKCkuIFRoZXNlIG5hbWVzIGFyZSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIG9wZXJhdGlvbiBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsT3BlcmF0aW9ucygpLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIG9wZXJhdGlvbnMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlckJlaGF2aW9ycyBmbGFnIGlzIGZhbHNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RJbmhlcml0ZWRFdmVudE5hbWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIGV2ZW50IG5hbWVzIHRvIG5vdCB1c2UgaW4gZ2V0QWxsRXZlbnRzKCkuIFRoZXNlIG5hbWVzIGFyZSBldmVudHMgdGhhdCBzaG91bGQgbm90IGJlIGluaGVyaXRlZCBhbmQgc2hvdWxkIG5vdCBzaG93IHRocm91Z2guIElmIHRoZSBpbmhlcml0ZWQgZXZlbnQgaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbEV2ZW50cygpLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIGV2ZW50cyBhcmUgaW5oZXJpdGVkIG9yIGlmIHRoZSBtZXJnZVN1cGVyRXZlbnRzIGZsYWcgaXMgZmFsc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1c3RvbWl6ZXJDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFdmVudFNldERlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVxdWl2YWxlbnQgdG8gRXZlbnRTZXREZWNvcmF0b3IgaW4gamF2YS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5EZWZhdWx0RXZlbnRTZXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaWNhc3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRydWUgaWYgdGhlIGxpc3RlbmVyTWV0aG9kcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBsaXN0ZW5lciBtZXRob2RzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZExpc3RlbmVyTWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVyTWV0aG9kcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQcm94eSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Imxpc3RlbmVyIG1ldGhvZHMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgbGlzdCBiZSBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBzZXQgaXQsIHRoZW4gc2V0IGxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO0xpc3RlbmVyTWV0aG9kcyB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIE1ldGhvZERlY29yYXRvcnMuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtOb3RlOiBUaGlzIGlzIGEgZGVyaXZlZCBzZXR0aW5nLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBub3RpZnkgb3V0IGNoYW5nZXMgdG8gaXQuIFRvIGhlcmUgY2hhbmdlcyB0byBpdCwgbGlzdGVuIG9uICZxdW90O3Nlckxpc3RNdGhkJnF1b3Q7IG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlzdGVuZXJUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbW92ZUxpc3RlbmVyTWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV2ZW50QWRhcHRlckNsYXNzIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRm9yIHNvbWUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhbiBhZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRoYXQgaW1wbGVtZW50cyBkZWZhdWx0IG5vLW9wIG1ldGhvZHMsIGUuZy4gamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudCB3aGljaCBoYXMgamF2YS5hd3QuZXZlbnQuRm9jdXNBZGFwdGVyLiBUaGUgQWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCBpbiBhIGtleS92YWx1ZSBwYWlyIG9uIHRoZSBqYXZhLmJlYW5zLkV2ZW50U2V0RGVzY3JpcHRvciB3aXRoIGEga2V5IGRlZmluZWQgaW4gYSBzdGF0aWMgZmluYWwgY29uc3RhbnRzIEVWRU5UQURBUFRFUkNMQVNTID0gJnF1b3Q7ZXZlbnRBZGFwdGVyQ2xhc3MmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlckxpc3RNdGhkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFByb3h5IiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgYSBwcml2YXRlIGZlYXR1cmUuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBvbmx5LiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRGVjb3JhdG9yIiBlU3VwZXJUeXBlcz0iIy8vRmVhdHVyZURlY29yYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFybXNFeHBsaWNpdEVtcHR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0cnVlIGlmIHRoZSBwYXJtcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBwYXJhbWV0ZXJzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlckRlc2NyaXB0b3JzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BhcmFtZXRlckRlY29yYXRvciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBsaXN0LiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAmcXVvdDtzZXJQYXJtRGVzYyZxdW90OyBub3RpZmljYXRpb25zIGluc3RlYWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlclBhcm1EZXNjIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BhcmFtZXRlckRlY29yYXRvciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcmFtZXRlckRlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgaXMgZXhwbGljaXQgaGVyZSBiZWNhdXNlIHVubGlrZSB0aGUgb3RoZXIgZmVhdHVyZSBkZWNvcmF0b3JzLCB0aGUgbmFtZSBkb2VzIG5vdCBjb21lIGZyb20gdGhlIG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBKYXZhUGFyYW1ldGVyIHRoYXQgdGhpcyBQYXJhbWV0ZXJEZWNvcmF0b3IgaXMgZGVjb3JhdGluZy4gQ2FuJ3QgdXNlIGVEZWNvcmF0ZXMgaW4gdGhpcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHlEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlRGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIFByb3BlcnR5RGVjb3JhdG9yIGluIGphdmEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFByb3BlcnR5VHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgcHJvcGVydHkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFByb3BlcnR5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgcHJvcGVydHkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InByb3BlcnR5VHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvdW5kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzaWduVGltZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBub3Qgc2V0LCB0aGVuIG5vcm1hbCBkZWZhdWx0IHByb2Nlc3NpbmcuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiBzZXQgdHJ1ZSwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZGVzaWduIHRpbWUgcHJvcGVydHkuIFRoaXMgbWVhbnMgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IGl0IHdvbid0IGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGF0IHJ1bnRpbWUuIEl0IG1heSBub3QgZXZlbiBiZSBhIHRydWUgYmVhbiBwcm9wZXJ0eSBidXQgaW5zdGVhZCB0aGUgYnVpbGRlciB3aWxsIGtub3cgaG93IHRvIGhhbmRsZSBpdC4mI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHNldCBmYWxzZSwgdGhlbiB0aGlzIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gdGhlIHByb3BlcnR5IHNoZWV0LCBidXQgd2lsbCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBmb3IgcnVudGltZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx3YXlzSW5jb21wYXRpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHNldCB0cnVlLCB0aGVuIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyBhcmUgc2VsZWN0ZWQsIHRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuIFNvIGluIHRoaXMgY2FzZSB0aGUgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgcHJvcGVydHkgc2hlZXQgaWYgbW9yZSB0aGFuIG9uZSBvYmplY3QgaGFzIGJlZW4gc2VsZWN0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbHRlckZsYWdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZFJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgZmllbGQgcmVhZC1vbmx5IChpLmUuIGlzIGEgJnF1b3Q7ZmluYWwmcXVvdDsgZmllbGQpLiBUaGlzIGlzIG9ubHkgcmVmZXJlbmNlZCBpZiB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHlFZGl0b3JDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWFkTWV0aG9kIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndyaXRlTWV0aG9kIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpZWxkIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vRmllbGQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZmllbGQgYW5kIG5vdCBhIGdldHRlci9zZXR0ZXIgcHJvcGVydHkuIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhlIFZpc3VhbCBFZGl0b3IgdXNlcyB0byB0aGUgQmVhbkluZm8gbW9kZWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL1Byb3BlcnR5RGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVkUmVhZE1ldGhvZCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVkV3JpdGVNZXRob2QiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9NZXRob2QiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUHJveHkiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIG9mIGEgamF2YSBNZXRob2QuIEl0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIG1ldGhvZCBidXQgZG9lc24ndCBkdXBsaWNhdGUgdGhlIGludGVyZmFjZSBmb3IgaXQuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtNZXRob2RQcm94aWVzIHdpbGwgYmUgaW4gdGhlIGVCZWhhdmlvcnMgc2V0dGluZyBmb3IgYW55IG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIEphdmFDbGFzcyBtZXRob2RzIHNldHRpbmcgc28gdGhhdCB0aGV5IGFyZSBub3QgZHVwbGljYXRlZC4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO01ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCZWFuRXZlbnQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFFdmVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlbnQgZnJvbSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24uJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGUgQmVhbkV2ZW50IHdpbGwgYmUgdW5kZXIgdGhlIEphdmFDbGFzcycgZXZlbnRzIGFuZCBhbGxFdmVudHMgZmVhdHVyZS4gRWFjaCBCZWFuRXZlbnQgd2lsbCBiZSBkZWNvcmF0ZWQgYnkgYW4gRXZlbnRTZXREZWNvcmF0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5NYXAkRW50cnkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9GZWF0dXJlQXR0cmlidXRlVmFsdWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgZmVhdHVyZSBhdHRyaWJ1dGUuIEl0IGNhbiBvbmx5IHJlcHJlc2VudCB0aGUgZm9sbG93aW5nOiYjeEQ7JiN4QTsmI3hEOyYjeEE7LSBTdHJpbmcmI3hEOyYjeEE7LSBwcmltaXRpdmVzJiN4RDsmI3hBOy0gYXJyYXkgKHR5cGUgT2JqZWN0KSBjb250YWluaW5nIG1peHR1cmUgb2YgU3RyaW5ncyBhbmQgcHJpbWl0aXZlcyAoYXMgdGhlIG9iamVjdCB0eXBlcykmI3hEOyYjeEE7LSBhcnJheSAodHlwZSBTdHJpbmcpJiN4RDsmI3hBOy0gYXJyYXkgKHR5cGUgcHJpbWl0aXZlKSYjeEQ7JiN4QTsmI3hEOyYjeEE7QW55dGhpbmcgZWxzZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSW1wbGljaXRJdGVtIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGVudW0gaXMgYW4gaW50ZXJuYWwgZW51bS4gSXQgaXMgdXNlZCBieSBCZWFuSW5mbyBmb3IgY2FjaGUgbWFpbnRlbmFuY2UuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGVudW0gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PVF9JTVBMSUNJVCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1lYW5zIHRoaXMgZGVjb3JhdG9yIGlzIG5vdCBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgY3JlYXRlZCBieSBjdXN0b21lci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU1QTElDSVRfREVDT1JBVE9SIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjb3JhdG9yIGlzIGltcGxpY2l0LiBUaGF0IGlzIGl0IHdhcyBub3QgY3JlYXRlZCBieSB0aGUgY3VzdG9tZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIG1lYW5zIHRoZSBkZWNvcmF0b3IgYW5kIHRoZSBmZWF0dXJlIHdoZXJlIGltcGxpY2l0LiBUaGF0IGlzIHRoZXkgd2VyZSBub3QgY3JlYXRlZCBieSB0aGUgY3VzdG9tZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vbW9kZWwvaW50cm9zcGVjdC5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2ludHJvc3BlY3QuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjE2YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vbW9kZWwvaW50cm9zcGVjdC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mbyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSIiIG1vZGVsTmFtZT0iQmVhbmluZm8iIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnByb3ZpZGVyLkJlYW5pbmZvRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnByZXNlbnRhdGlvbi5CZWFuaW5mb0VkaXRvclBsdWdpbiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcaW50cm9zcGVjdC5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5Xb3Jrc3BhY2VSb290PC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQmVhbmluZm8iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iYmVhbmluZm8uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iYmVhbmluZm8uZWNvcmUjLy9JbXBsaWNpdEl0ZW0iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJiZWFuaW5mby5lY29yZSMvL0ltcGxpY2l0SXRlbS9OT1RfSU1QTElDSVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iYmVhbmluZm8uZWNvcmUjLy9JbXBsaWNpdEl0ZW0vSU1QTElDSVRfREVDT1JBVE9SIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImJlYW5pbmZvLmVjb3JlIy8vSW1wbGljaXRJdGVtL0lNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2Rpc3BsYXlOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL3Nob3J0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvY2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvZXhwZXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2hpZGRlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9wcmVmZXJyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvbWVyZ2VJbnRyb3NwZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2ltcGxpY2l0bHlTZXRCaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2ltcGxpY2l0RGVjb3JhdG9yRmxhZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvYXR0cmlidXRlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9nZXROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL21lcmdlU3VwZXJFdmVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdFByb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdE1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvaW50cm9zcGVjdEV2ZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9kb0JlYW5pbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL25vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3Ivbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3Ivbm90SW5oZXJpdGVkRXZlbnROYW1lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9jdXN0b21pemVyQ2xhc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9pbkRlZmF1bHRFdmVudFNldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvdW5pY2FzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvbGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvYWRkTGlzdGVuZXJNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9saXN0ZW5lck1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2xpc3RlbmVyVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvcmVtb3ZlTGlzdGVuZXJNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2V2ZW50QWRhcHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3Ivc2VyTGlzdE10aGQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9NZXRob2REZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kRGVjb3JhdG9yL3Bhcm1zRXhwbGljaXRFbXB0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZERlY29yYXRvci9wYXJhbWV0ZXJEZXNjcmlwdG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZERlY29yYXRvci9zZXJQYXJtRGVzYyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL1BhcmFtZXRlckRlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9QYXJhbWV0ZXJEZWNvcmF0b3IvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUGFyYW1ldGVyRGVjb3JhdG9yL3BhcmFtZXRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9jb25zdHJhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZGVzaWduVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvYWx3YXlzSW5jb21wYXRpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9maWx0ZXJGbGFncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZmllbGRSZWFkT25seSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvcHJvcGVydHlFZGl0b3JDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvcmVhZE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3Ivd3JpdGVNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2ZpZWxkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9nZXRQcm9wZXJ0eVR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3NldFByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3NldFByb3BlcnR5VHlwZS9wcm9wZXJ0eVR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yL2luZGV4ZWRSZWFkTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IvaW5kZXhlZFdyaXRlTWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kUHJveHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kUHJveHkvbWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vQmVhbkV2ZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y1NWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBCZWFuSW5mbyAoSW50cm9zcGVjdGlvbikgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLWJlYW5pbmZvTmF0dXJlTmFtZT1KYXZhIE1vZGVsIEJlYW5JbmZvIE5hdHVyZQotcmVnaXN0cmF0aW9ucy5leHRlbnNpb25wb2ludC5uYW1lPUJlYW5JbmZvIGV4dGVuc2lvbiByZWdpc3RyYXRpb25zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmMWYxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVnaXN0cmF0aW9ucyIgbmFtZT0iJXJlZ2lzdHJhdGlvbnMuZXh0ZW5zaW9ucG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJCZWFuSW5mb05hdHVyZSIKLSAgICAgICAgIG5hbWU9IiViZWFuaW5mb05hdHVyZU5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYmVhbmluZm8uZWNvcmUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249ImJlYW5pbmZvQ29uZmlnIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0ib3ZlcnJpZGUiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wcm94eS5qYXJzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcHJveHkuamFycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ODIwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi12bS9iZWFuaW5mb3ZtLmphcj0vb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2Jpbl92bV9iZWFuaW5mb3ZtLwotYmVhbmluZm9jb21tb24uamFyPS9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmluX2JlYW5pbmZvY29tbW9uLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlM2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSoubWR+Ci0qLmNhfgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvYmVhbmluZm8uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9iZWFuaW5mby5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjI3Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9iZWFuaW5mby5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAxICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJiZWFuaW5mbyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbyIpKSkKLSAgICBxdWlkICAgICAgIAkiM0E3OTlBQkIwMzUzIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJGZWF0dXJlRGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OTlCM0UwMUU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxFcXVpdmFsZW50IHRvIEZlYXR1cmVEZXNjcmlwdG9yIGluIGphdmEuCi18PHA+Ci18Tm90ZTogSWYgYW55IGF0dHJpYnV0ZSBpcyBleHBsaWNpdGx5IHNldCB0aGVuIHRoZSBCZWFuSW5mby9SZWZsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBkZWNvcmF0b3IuIFRoaXMgcHJvdmlkZXMgYSB3YXkgb2Ygb3ZlcnJpZGluZyB0aGUgQmVhbkluZm9zLiBBbHNvIGZvciBhbnkgbWFueS12YWx1ZWQgYXR0cmlidXRlLCBpZiBpdCBpcyBkZXNpcmVkIHRvIGhhdmUgaXQgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8gZmlsbCBpdCBpbiwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lZCBvZiB0aGUgZm9ybSAiYXR0aWJ1dHVlRXhwbGljaXRFbXB0eSIgSWYgdGhpcyBpcyB0cnVlIHRoZW4gdGhlIEJlYW5JbmZvIHdpbGwgbm90IG1lcmdlIGluIGFuZCB3aWxsIGxlYXZlIGl0IGVtcHR5LgotfDxwPgotfFRoZXNlIGNvbW1lbnRzIGFib3V0IG1lcmdpbmcgYXBwbHkgdG8gYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBkZWNvcmF0b3IgdG9vLiAKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzREZBMTg1OTAwREMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUFubm90YXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0Q5OEExQzcwMUFCIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NjdEMEQwMTg0IgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGQ0MwMTMxIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaG9ydERlc2NyaXB0aW9uIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5Q0ZENTAxRTgiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNhdGVnb3J5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSIzQkEyNzk3MTAyREMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cGVydCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGRTcwMEZFIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGlkZGVuIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDAwNTAzMjgiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmZXJyZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEMDI0MDMxOCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lcmdlSW50cm9zcGVjdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQTgyQzBBNjAzODkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2hvdWxkIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYmUgbWVyZ2VkIGludG8gdGhpcyBkZWNvcmF0b3IuIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYXJlIGlnbm9yZWQgZm9yIHRoaXMgcGFydGljdWxhciBkZWNvcmF0b3IuIFRoaXMgaXMgYW4gaW50ZXJuYWwgZmVhdHVyZSBzaW1wbHkgdG8gYWxsb3cgZGVzaXJlZCBvdmVycmlkZSBjYXBhYmlsaXRpZXMuIEN1c3RvbWVycyB3b3VsZCB1c2UgaXQgdG8gcHJldmVudCBBTlkgaW50cm9zcGVjdGlvbi9yZWZsZWN0aW9uIGZyb20gb2NjdXJyaW5nLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzlCNDkzMjAyNjUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGF0dHJpYnV0ZXMgYXJlIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBub3QgcmV0cmlldmVkIGZyb20gdGhlIGJlYW5pbmZvL3JlZmxlY3Rpb24uIEN1c3RvbWVycyBzaG91bGQgc2V0IHRoaXMgaWYgdGhleSB3YW50IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gYmUgZW1wdHkgYW5kIG5vdCBtZXJnZWQgd2l0aCB0aGUgQmVhbkluZm8gcmVzdWx0cy4gIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbXBsaWNpdGx5U2V0Qml0cyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1ODE1RDAyQjkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBIGJpdGZsYWcgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCBieSBCZWFuSW5mby9SZWZsZWN0aW9uLgotfDxwPgotfFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJImxvbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbXBsaWNpdERlY29yYXRvckZsYWciCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNUEwNUQwMjFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18SXMgdGhpcyBkZWNvcmF0b3IvZmVhdHVyZSBpbXBsaWNpdC4gVGhpcyBtZWFucyBjcmVhdGVkIGJ5IEludHJvc3BlY3Rpb24vUmVmbGVjdGlvbiBhbmQgbm90IGJ5IGN1c3RvbWVyLgotfDxwPgotfFRoaXMgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBieSB0aGUgQmVhbkluZm8gbWFpbnRhbmFuY2UuIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIkltcGxpY2l0SXRlbSIKLQkJICAgIHF1aWR1ICAgICAgCSI0MUU1OUU1RDAyOTYiKSkpCi0JKG9iamVjdCBDbGFzcyAiQmVhbkRlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEMERGMDJEMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gQmVhbkRlY29yYXRvciBpbiBqYXZhLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERThFMDA3RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZVN1cGVyUHJvcGVydGllcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E4MkI3M0UwMjAwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgcHJvcGVydGllcyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxBdHRyaWJ1dGVzL2VBbGxSZWZlcmVuY2VzLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZVN1cGVyTWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E4MkI5OTQwMDE1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgbWV0aG9kcyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxCZWhhdmlvcnMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lcmdlU3VwZXJFdmVudHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBODJCOTlGMDE2NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIGV2ZW50cyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxFdmVudHMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImludHJvc3BlY3RQcm9wZXJ0aWVzIgotCQkgICAgcXVpZCAgICAgICAJIjNBODQyN0VDMDBBNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW50cm9zcGVjdE1ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0E4NDI4NzUwMUIxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgbWV0aG9kcyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbnRyb3NwZWN0RXZlbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBODQyODc3MDAwRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIGV2ZW50cyBmcm9tIHRoZSBpbnRyb3NwZWN0aW9uIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgZXZlbnRzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvQmVhbmluZm8iCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTQ2RkMwMjdDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgbWVhbnMgZG8gd2UgZ28gYW5kIGdldCB0aGUgYmVhbmluZm8gZnJvbSB0aGUgcmVtb3RlIHZtLiBJZiBmYWxzZSwgdGhlbiBpdCB3aWxsIG5vdCB0cnkgdG8gZ2V0IHRoZSBiZWFuaW5mby4gVGhpcyBkb2Vzbid0IHByZXZlbnQgaW50cm9zcGVjdGlvbiB0aHJvdWdoIHJlZmxlY3Rpb24uIFRoYXQgaXMgY29udHJvbGVkIGJ5IHRoZSBzZXBhcmF0ZSBpbnRyb3NwZWN0Li4uIGF0dHJpYnV0ZXMuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFRUQ1MEIwMTg1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMgdG8gbm90IHVzZSBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuIFRoZXNlIG5hbWVzIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIHByb3BlcnR5IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuCi18PHA+Ci18VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlclByb3BlcnRpZXMgZmxhZyBpcyBmYWxzZS4KLXw8cD4KLXxOb3RlOiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgbWVhbnQgdG8gYmUgY2hhbmdlZCBieSBjbGllbnRzLiBJdCBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjAyQzVGMDM5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIG1ldGhvZCBuYW1lcyB0byBub3QgdXNlIGluIGVBbGxPcGVyYXRpb25zKCkuIFRoZXNlIG5hbWVzIGFyZSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIG9wZXJhdGlvbiBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsT3BlcmF0aW9ucygpLgotfDxwPgotfFRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBvcGVyYXRpb25zIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJCZWhhdmlvcnMgZmxhZyBpcyBmYWxzZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90SW5oZXJpdGVkRXZlbnROYW1lcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYwMkQwQTAzMTIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBldmVudCBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbEV2ZW50cygpLiBUaGVzZSBuYW1lcyBhcmUgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIGV2ZW50IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxFdmVudHMoKS4KLXw8cD4KLXxUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBhbGwgZXZlbnRzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJFdmVudHMgZmxhZyBpcyBmYWxzZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpKQotCShvYmplY3QgQ2xhc3MgIkV2ZW50U2V0RGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQxRDIwMDRGIgotCSAgICBkb2N1bWVudGF0aW9uIAkiRXF1aXZhbGVudCB0byBFdmVudFNldERlY29yYXRvciBpbiBqYXZhLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERUEyMDBFQyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbkRlZmF1bHRFdmVudFNldCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ5NEYwMDRDIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pY2FzdCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ5NTgwMTY3IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0IxQUY3RDAyODYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRydWUgaWYgdGhlIGxpc3RlbmVyTWV0aG9kcyBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgc2V0IGFzIGVtcHR5IGFuZCBpcyBub3QgdG8gaGF2ZSBsaXN0ZW5lciBtZXRob2RzIG1lcmdlZCBpbiBmcm9tIEJlYW5JbmZvIG9yIHJlZmxlY3Rpb24uIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKSkpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kRGVjb3JhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQzNUUwMDI3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REVBNjAzRTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFybXNFeHBsaWNpdEVtcHR5IgotCQkgICAgcXVpZCAgICAgICAJIjNCODZBQkU4MDA5MiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdHJ1ZSBpZiB0aGUgcGFybXMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgcGFyYW1ldGVycyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpKQotCShvYmplY3QgQ2xhc3MgIlBhcmFtZXRlckRlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEOUMyMDMwNCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERUJCMDFDNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODZBNjcwMDA5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBpcyBleHBsaWNpdCBoZXJlIGJlY2F1c2UgdW5saWtlIHRoZSBvdGhlciBmZWF0dXJlIGRlY29yYXRvcnMsIHRoZSBuYW1lIGRvZXMgbm90IGNvbWUgZnJvbSB0aGUgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQcm9wZXJ0eURlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQTY4MDEwRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gUHJvcGVydHlEZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU5NzAyQkQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJvcGVydHlUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCOENGNTI2MDM5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIHByb3BlcnR5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJIkVDbGFzc2lmaWVyIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNBQ0U0RkVFMDM3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRQcm9wZXJ0eVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDMyOUQxQ0UwMzBFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgcHJvcGVydHkgdHlwZS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJvcGVydHlUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSI0MzI5RDFFMjAxNjgiCi0JCQkgICAgdHlwZSAgICAgICAJIkVDbGFzc2lmaWVyIgotCQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJib3VuZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURDMjUwMzAzIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWluZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQzJDMDBBMCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2lnblRpbWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNCQTI3NDU1MDE5QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfElmIG5vdCBzZXQsIHRoZW4gbm9ybWFsIGRlZmF1bHQgcHJvY2Vzc2luZy4KLXwKLXxJZiBzZXQgdHJ1ZSwgdGhlbiB0aGlzIHByb3BlcnR5IGlzIGEgZGVzaWduIHRpbWUgcHJvcGVydHkuIFRoaXMgbWVhbnMgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IGl0IHdvbid0IGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGF0IHJ1bnRpbWUuIEl0IG1heSBub3QgZXZlbiBiZSBhIHRydWUgYmVhbiBwcm9wZXJ0eSBidXQgaW5zdGVhZCB0aGUgYnVpbGRlciB3aWxsIGtub3cgaG93IHRvIGhhbmRsZSBpdC4KLXwKLXxJZiBzZXQgZmFsc2UsIHRoZW4gdGhpcyBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IHdpbGwgYmUgYWJsZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIHJ1bnRpbWUuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsd2F5c0luY29tcGF0aWJsZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQkEyN0ExNzAwQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSWYgc2V0IHRydWUsIHRoZW4gd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFyZSBzZWxlY3RlZCwgdGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgaW5jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4gU28gaW4gdGhpcyBjYXNlIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCBpZiBtb3JlIHRoYW4gb25lIG9iamVjdCBoYXMgYmVlbiBzZWxlY3RlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWx0ZXJGbGFncyIKLQkJICAgIHF1aWQgICAgICAgCSIzQkEzQjE4RjAwMzYiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGRSZWFkT25seSIKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RTEwMTAxOEUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJcyB0aGlzIGZpZWxkIHJlYWQtb25seSAoaS5lLiBpcyBhICJmaW5hbCIgZmllbGQpLiBUaGlzIGlzIG9ubHkgcmVmZXJlbmNlZCBpZiB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIHNldC4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQzQ1MDMwOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFODQwMzg4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTY4MDEwRSIpKSkKLQkob2JqZWN0IENsYXNzICJNZXRob2RQcm94eSIKLQkgICAgcXVpZCAgICAgICAJIjNBODk4NEM5MDFDMyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyBqdXN0IGEgd3JhcHBlciBvZiBhIGphdmEgTWV0aG9kLiBJdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBtZXRob2QgYnV0IGRvZXNuJ3QgZHVwbGljYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGl0LgotfDxwPgotfE1ldGhvZFByb3hpZXMgd2lsbCBiZSBpbiB0aGUgZUJlaGF2aW9ycyBzZXR0aW5nIGZvciBhbnkgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgSmF2YUNsYXNzIG1ldGhvZHMgc2V0dGluZyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVkLgotfDxwPgotfE1ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0RGQTE5QjYwMERFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNERBQTIwMEEwIikpKQotCShvYmplY3QgQ2xhc3MgIkJlYW5FdmVudCIKLQkgICAgcXVpZCAgICAgICAJIjNDQjA5Q0E5MDIxMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18RXZlbnQgZnJvbSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24uCi18PHA+Ci18VGhlIEJlYW5FdmVudCB3aWxsIGJlIHVuZGVyIHRoZSBKYXZhQ2xhc3MnIGV2ZW50cyBhbmQgYWxsRXZlbnRzIGZlYXR1cmUuIEVhY2ggQmVhbkV2ZW50IHdpbGwgYmUgZGVjb3JhdGVkIGJ5IGFuIEV2ZW50U2V0RGVjb3JhdG9yLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNDQjA5Q0I2MDM4RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiKSkpCi0JKG9iamVjdCBDbGFzcyAiRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IgotCSAgICBxdWlkICAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCSAgICBzdGVyZW90eXBlIAkiTWFwRW50cnkiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDRDQzhCNzAzMDQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1ODQxNDAxMEEiCi0JCSAgICB0eXBlICAgICAgIAkiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCQkgICAgcXVpZHUgICAgICAJIjQxRTU4MkY4MDBCQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCSAgICBxdWlkICAgICAgIAkiNDFFNTgyRjgwMEJCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGZlYXR1cmUgYXR0cmlidXRlLiBJdCBjYW4gb25seSByZXByZXNlbnQgdGhlIGZvbGxvd2luZzoKLXwKLXwtIFN0cmluZwotfC0gcHJpbWl0aXZlcwotfC0gYXJyYXkgKHR5cGUgT2JqZWN0KSBjb250YWluaW5nIG1peHR1cmUgb2YgU3RyaW5ncyBhbmQgcHJpbWl0aXZlcyAoYXMgdGhlIG9iamVjdCB0eXBlcykKLXwtIGFycmF5ICh0eXBlIFN0cmluZykKLXwtIGFycmF5ICh0eXBlIHByaW1pdGl2ZSkKLXwKLXxBbnl0aGluZyBlbHNlIGNhbm5vdCBiZSByZXByZXNlbnRlZC4KLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNTgzQjUwM0NBIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJbXBsaWNpdEl0ZW0iCi0JICAgIHF1aWQgICAgICAgCSI0MUU1OUU1RDAyOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgZW51bSBpcyBhbiBpbnRlcm5hbCBlbnVtLiBJdCBpcyB1c2VkIGJ5IEJlYW5JbmZvIGZvciBjYWNoZSBtYWludGVuYW5jZS4KLXw8cD4KLXxUaGlzIGVudW0gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UX0lNUExJQ0lUIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTU5RjJBMDBFQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJNZWFucyB0aGlzIGRlY29yYXRvciBpcyBub3QgaW1wbGljaXQuIFRoYXQgaXMgaXQgd2FzIGNyZWF0ZWQgYnkgY3VzdG9tZXIuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU1QTElDSVRfREVDT1JBVE9SIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTU5RjcyMDBCNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY29yYXRvciBpcyBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRSIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1OUZBMzAzQjciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBtZWFucyB0aGUgZGVjb3JhdG9yIGFuZCB0aGUgZmVhdHVyZSB3aGVyZSBpbXBsaWNpdC4gVGhhdCBpcyB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUNGNkMwMzc4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5Q0Y2RTAwQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRmVhdHVyZSBhdHRyaWJ1dGVzLiBLZXkvdmFsdWUgcGFpcnMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgZmVhdHVyZSBhdHRyaWJ1dGVzIGlzIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvL3JlZmxlY3Rpb24gc2V0IGl0LCBzZXQgYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4iCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiCi0JCSAgICBxdWlkdSAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlDRjZFMDBDOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzk5QjNFMDFFOSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDEzNTAyNDgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImN1c3RvbWl6ZXJDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQxMzYwMUQyIgotCQkgICAgbGFiZWwgICAgICAJImN1c3RvbWl6ZXJDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEMTM2MDFFNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpCZWFuRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMERGMDJEMSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQzMDgwMTI4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJhZGRMaXN0ZW5lck1ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDMwOTAzNDYiCi0JCSAgICBsYWJlbCAgICAgIAkiYWRkTGlzdGVuZXJNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDMwOTAzNUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDNFMTAzNjQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImxpc3RlbmVyTWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQzRTYwMDdEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18bGlzdGVuZXIgbWV0aG9kcy4gSWYgaXQgaXMgZGVzaXJlZCB0aGF0IHRoZSBsaXN0IGJlIGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvIHNldCBpdCwgdGhlbiBzZXQgbGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSB0byB0cnVlLgotfDxwPgotfExpc3RlbmVyTWV0aG9kcyB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIE1ldGhvZERlY29yYXRvcnMuCi18PHA+Ci18Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAic2VyTGlzdE10aGQiIG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVyTWV0aG9kcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpNZXRob2RQcm94eSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODRDOTAxQzMiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEM0U2MDA5MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkKLQkgICAgZGVyaXZlZCAgICAJVFJVRSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0QTgwMTU4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJsaXN0ZW5lclR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0QUEwMzhCIgotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVyVHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlENEFBMDNCNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDRERjAyMEIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlbW92ZUxpc3RlbmVyTWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlENEUxMDM5NSIKLQkJICAgIGxhYmVsICAgICAgCSJyZW1vdmVMaXN0ZW5lck1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDRFMTAzQTkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIgotCSAgICBxdWlkICAgICAgIAkiM0E3OURBMUEwMkY3IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURBMUMwMjMxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIGxpc3QuCi18PHA+Ci18Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAic2VyUGFybURlc2MiIG5vdGlmaWNhdGlvbnMgaW5zdGVhZC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInBhcmFtZXRlckRlc2NyaXB0b3JzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REExQzAyMzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kRGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzVFMDAyNyIpKQotCSAgICBkZXJpdmVkICAgIAlUUlVFKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0IgotCSAgICBxdWlkICAgICAgIAkiM0E3OURCMEIwMzM5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQjBFMDEzRiIKLQkJICAgIGxhYmVsICAgICAgCSJwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQjBFMDE3MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REJCRDAwMDAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlYWRNZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQkJGMDA3MSIKLQkJICAgIGxhYmVsICAgICAgCSJyZWFkTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQkJGMDA4NSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REJERjAyRDAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndyaXRlTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REJFMTAxRjciCi0JCSAgICBsYWJlbCAgICAgIAkid3JpdGVNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURCRTEwMjBCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTY4MDEwRSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlERTM0MDM2RiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5kZXhlZFJlYWRNZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERTM1MDNDQSIKLQkJICAgIGxhYmVsICAgICAgCSJpbmRleGVkUmVhZE1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REUzNTAzREUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQzQ1MDMwOSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlERTU0MDE4MCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5kZXhlZFdyaXRlTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU1NTAzRDAiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5kZXhlZFdyaXRlTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERTU1MDNFNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURDNDUwMzA5IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0IgotCSAgICBxdWlkICAgICAgIAkiM0E4OTg2NUIwMUQ1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0E4OTg2NUMwMUFFIgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTg5ODY1QzAxQ0MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kUHJveHkiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E4OTg0QzkwMUMzIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2IgotCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREQwMkMyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREUwMUZCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBKYXZhUGFyYW1ldGVyIHRoYXQgdGhpcyBQYXJhbWV0ZXJEZWNvcmF0b3IgaXMgZGVjb3JhdGluZy4gQ2FuJ3QgdXNlIGVEZWNvcmF0ZXMgaW4gdGhpcy4iCi0JCSAgICBsYWJlbCAgICAgIAkicGFyYW1ldGVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjciCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QTZFREUwMjA1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiCi0JICAgIHF1aWQgICAgICAgCSI0MUYwMTZFNzAwMkUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlclBhcm1EZXNjIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjAxNkU4MDJBNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIgotCQkgICAgbGFiZWwgICAgICAJInNlclBhcm1EZXNjIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDlDMjAzMDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlByaXZhdGUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMDE2RTgwMkIxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDM1RTAwMjciCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMCIKLQkgICAgcXVpZCAgICAgICAJIjQxRjExRTcxMDM4NyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXZlbnRBZGFwdGVyQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMTFFNzMwMjQ5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18Rm9yIHNvbWUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhbiBhZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIHRoYXQgaW1wbGVtZW50cyBkZWZhdWx0IG5vLW9wIG1ldGhvZHMsIGUuZy4gamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudCB3aGljaCBoYXMgamF2YS5hd3QuZXZlbnQuRm9jdXNBZGFwdGVyLiBUaGUgQWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCBpbiBhIGtleS92YWx1ZSBwYWlyIG9uIHRoZSBqYXZhLmJlYW5zLkV2ZW50U2V0RGVzY3JpcHRvciB3aXRoIGEga2V5IGRlZmluZWQgaW4gYSBzdGF0aWMgZmluYWwgY29uc3RhbnRzIEVWRU5UQURBUFRFUkNMQVNTID0gImV2ZW50QWRhcHRlckNsYXNzIi4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJImV2ZW50QWRhcHRlckNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjExRTczMDI1RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDFEMjAwNEYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiCi0JICAgIHF1aWQgICAgICAgCSI0MUYxMjc4QTAxQTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlckxpc3RNdGhkIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjEyNzhCMDIxRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIgotCQkgICAgbGFiZWwgICAgICAJInNlckxpc3RNdGhkIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZFByb3h5IgotCQkgICAgcXVpZHUgICAgICAJIjNBODk4NEM5MDFDMyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHJpdmF0ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYxMjc4QjAyMjkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiCi0JICAgIHF1aWQgICAgICAgCSI0MjA3RDgzRjAxREEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZpZWxkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RDg0MDAyOTAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGZpZWxkIGFuZCBub3QgYSBnZXR0ZXIvc2V0dGVyIHByb3BlcnR5LiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0aGF0IHRoZSBWaXN1YWwgRWRpdG9yIHVzZXMgdG8gdGhlIEJlYW5JbmZvIG1vZGVsLiIKLQkJICAgIGxhYmVsICAgICAgCSJmaWVsZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSIKLQkJICAgIHF1aWQgICAgICAgCSI0MjA3RDg0MDAyOTIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBNjgwMTBFIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjNBNzk5QUM4MDM4RSIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTk0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgTm90ZVZpZXcgQDEKLQkJICAgIGxvY2F0aW9uICAgCSgzMjMyLCAxNzEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMjk1MCwgMTYyNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1MjgKLQkJCWxhYmVsICAgICAgCSJMaXN0ZW5lck1ldGhvZHMgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBNZXRob2REZWNvcmF0b3JzLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJNTg4Ci0JCSAgICBoZWlnaHQgICAgIAkxODgpCi0JCShvYmplY3QgTm90ZVZpZXcgQDIKLQkJICAgIGxvY2F0aW9uICAgCSgzMzkyLCAyNzg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMzA3NiwgMjU2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk4Ci0JCQltYXhfd2lkdGggIAk1OTYKLQkJCWxhYmVsICAgICAgCQotfE1ldGhvZFByb3hpZXMgd2lsbCBiZSBpbiB0aGUgZUJlaGF2aW9ycyBzZXR0aW5nIGZvciBhbnkgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgSmF2YUNsYXNzIG1ldGhvZHMgc2V0dGluZyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVkLgotfAotfE1ldGhvZFByb3hpZXMgd291bGQgYWxzbyBoYXZlIE1ldGhvZERlY29yYXRvcnMuCi0JCQkpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJNjU2Ci0JCSAgICBoZWlnaHQgICAgIAk0NDQpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ4LCAyNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMTE0LCAyNjE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFFdmVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgd2lkdGggICAgICAJMjg2Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkJlYW5FdmVudCIgQDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMjk5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANAotCQkJbG9jYXRpb24gICAJKDEwOTYsIDI5NDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmVhbkV2ZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IwOUNBOTAyMTIiCi0JCSAgICB3aWR0aCAgICAgIAkyOTAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQjA5Q0I2MDM4RCIKLQkJICAgIGNsaWVudCAgICAgCUA0Ci0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBOb3RlVmlldyBANgotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDI5NDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYKLQkJCWxvY2F0aW9uICAgCSgxNTYxLCAyODE1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTU1NQotCQkJbGFiZWwgICAgICAJIlRoZSBCZWFuRXZlbnQgd2lsbCBiZSB1bmRlciB0aGUgSmF2YUNsYXNzJyBldmVudHMgYW5kIGFsbEV2ZW50cyBmZWF0dXJlLiBFYWNoIEJlYW5FdmVudCB3aWxsIGJlIGRlY29yYXRlZCBieSBhbiBFdmVudFNldERlY29yYXRvci4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTYxNQotCQkgICAgaGVpZ2h0ICAgICAJMjcwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQW5ub3RhdGlvbiIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoOTA2LCA1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQW5ub3RhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiM0Q5OEExQzcwMUFCIgotCQkgICAgd2lkdGggICAgICAJMzE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4NDgsIDIyNzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgyNzAyLCAyMTk4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIKLQkJICAgIHdpZHRoICAgICAgCTMxMAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiIEA5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDE3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOQotCQkJbG9jYXRpb24gICAJKDE4ODcsIDkyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5Ci0JCQlsb2NhdGlvbiAgIAkoMTg4NywgNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8TWFwRW50cnk+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDA0Q0M4NTUwMUY1IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAOQotCQkJbG9jYXRpb24gICAJKDE4ODcsIDE1MykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1ODEpCi0JCSAgICB3aWR0aCAgICAgIAk2OTIKLQkJICAgIGhlaWdodCAgICAgCTI5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIgQDEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSg2NjUsIDMyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGZWF0dXJlRGVjb3JhdG9yIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJbG9jYXRpb24gICAJKDY2NSwgMzg2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTEyCi0JCQltYXhfd2lkdGggIAk3MDApCi0JCSAgICB3aWR0aCAgICAgIAk4MzIKLQkJICAgIGhlaWdodCAgICAgCTY4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTEwNSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNzIsIDExMDUpCi0JCQkoMTA3MiwgOTk5KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGQTE4NTkwMERDIgotCQkgICAgY2xpZW50ICAgICAJQDEwCi0JCSAgICBzdXBwbGllciAgIAlANwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMwotCQkgICAgbG9jYXRpb24gICAJKDE2ODIsIDQwMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlDRjZDMDM3OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlcyIgQDE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg2MjYsIC02MykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJCWxvY2F0aW9uICAgCSgxNzQ3LCAzMDkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZXMiCi0JCQkJcGN0RGlzdCAgICAJMC40NTcwMTIKLQkJCQloZWlnaHQgICAgIAk2MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlDRjZFMDBCRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTgxMiwgMzk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjU4NDY1MwotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDE3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg2MjYsIC02MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5Q0Y2RTAwQzgiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpGZWF0dXJlQXR0cmlidXRlVmFsdWUiIEAxOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNDU2LCAxNzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQlsb2NhdGlvbiAgIAkoMjY4MywgMTE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE1NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGZWF0dXJlQXR0cmlidXRlVmFsdWUiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCWxvY2F0aW9uICAgCSgyNjgzLCA2NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTU0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDFFNTgyRjgwMEJCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCWxvY2F0aW9uICAgCSgyNjgzLCAxNzgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTQ5MykKLQkJICAgIHdpZHRoICAgICAgCTE1NjQKLQkJICAgIGhlaWdodCAgICAgCTI0MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW1wbGljaXRJdGVtIiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OCwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJbG9jYXRpb24gICAJKDE4MTUsIDU0NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk5NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbXBsaWNpdEl0ZW0iKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxODE1LCA0OTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTk0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDFFNTlFNUQwMjk2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxODE1LCA2MDgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJODEyKQotCQkgICAgd2lkdGggICAgICAJOTY0Ci0JCSAgICBoZWlnaHQgICAgIAkzNDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIgQDIwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMDQsIDE3OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIwCi0JCQlsb2NhdGlvbiAgIAkoNDEyNSwgMTcxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkzNzYKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UGFyYW1ldGVyRGVjb3JhdG9yIiBAMjEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg2NCwgMTM2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCWxvY2F0aW9uICAgCSg0NjMxLCAxMjc5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcmFtZXRlckRlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ5QzIwMzA0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCWxvY2F0aW9uICAgCSg0NjMxLCAxMzQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTI5NCkKLQkJICAgIHdpZHRoICAgICAgCTQ4NAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEAyMgotCQkgICAgbG9jYXRpb24gICAJKDQ1NzgsIDE1NzkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzlBNkVERDAyQzIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmFtZXRlciIgQDIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJICAgIGxvY2F0aW9uICAgCSgxNjY2LCAtMjEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNAotCQkJCVBhcmVudF9WaWV3IAlAMjMKLQkJCQlsb2NhdGlvbiAgIAkoNDU0MCwgMTY1OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVyIgotCQkJCXBjdERpc3QgICAgCTAuMzg2NTk4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzlBNkVERTAxRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDIyCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMwotCQkJCWxvY2F0aW9uICAgCSg0NDgwLCAxNTg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjQxMjM3MQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjciIEAyNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2NiwgLTIxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDOUE2RURFMDIwNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjIKLQkJCSAgICBzdXBwbGllciAgIAlAMjEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFQkIwMUM0IgotCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY1OCwgMTI2NykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjU4LCAxMTA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTEpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZERlY29yYXRvciIgQDI4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM3MTIsIDEzNjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI4Ci0JCQlsb2NhdGlvbiAgIAkoMzM2MiwgMTI3OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2REZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzVFMDAyNyIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDI4Ci0JCQlsb2NhdGlvbiAgIAkoMzM2MiwgMTM0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1OTQpCi0JCSAgICB3aWR0aCAgICAgIAk3MTgKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REVBNjAzRTEiCi0JCSAgICBjbGllbnQgICAgIAlAMjgKLQkJICAgIHN1cHBsaWVyICAgCUAxMAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjk0LCAxMjY3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2OTQsIDExMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMzAKLQkJICAgIGxvY2F0aW9uICAgCSg0MzE0LCAxNDkwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBMUEwMkY3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIgQDMxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJICAgIGxvY2F0aW9uICAgCSgyODQyLCA1OTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMgotCQkJCVBhcmVudF9WaWV3IAlAMzEKLQkJCQlsb2NhdGlvbiAgIAkoNDM4OSwgMTQyNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDI3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVyRGVzY3JpcHRvcnMiCi0JCQkJcGN0RGlzdCAgICAJMC4zMDgyNjIKLQkJCQloZWlnaHQgICAgIAk2OQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTFDMDIzMSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzAKLQkJCSAgICBzdXBwbGllciAgIAlAMjEKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNDMxNCwgMTQ5MCkKLQkJCQkoNDM3MywgMTUwMykKLQkJCQkoNDYyMSwgMTQyOSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzCi0JCQkJUGFyZW50X1ZpZXcgCUAzMQotCQkJCWxvY2F0aW9uICAgCSg0NTU1LCAxNDkxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc0NTk3NwotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAzNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjg0MiwgNTk0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTFDMDIzMiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzAKLQkJCSAgICBzdXBwbGllciAgIAlAMjgKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDM1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNDM4NSwgMTI3MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjAxNkU3MDAyRSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VyUGFybURlc2MiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NSwgLTcxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDQ1MzQsIDEyNTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI4NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiLXNlclBhcm1EZXNjIgotCQkJCXBjdERpc3QgICAgCTAuNTk1ODkzCi0JCQkJaGVpZ2h0ICAgICAJNDgKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYwMTZFODAyQTciCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIxCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSg0NTkwLCAxMzY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwNDM4NgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkiIEAzOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NSwgLTcxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjAxNkU4MDJCMSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUKLQkJCSAgICBzdXBwbGllciAgIAlAMjgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNDM4NSwgMTI3MykKLQkJCQkoNDMyNiwgMTI2MykKLQkJCQkoNDA3MSwgMTMwMikpCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTkyLCAzMjY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJbG9jYXRpb24gICAJKDI0OTIsIDMxOTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICB3aWR0aCAgICAgIAkyMTgKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kUHJveHkiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCAyNzY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJbG9jYXRpb24gICAJKDIzOTgsIDI3MTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kUHJveHkiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBODk4NEM5MDFDMyIKLQkJICAgIHdpZHRoICAgICAgCTM0MgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA0MwotCQkgICAgbG9jYXRpb24gICAJKDI1NzUsIDMwMDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODY1QjAxRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDQ0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDEwODQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCVBhcmVudF9WaWV3IAlANDQKLQkJCQlsb2NhdGlvbiAgIAkoMjUzOSwgMzA3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTYyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMzc2MDY4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODY1QzAxQUUiCi0JCQkgICAgY2xpZW50ICAgICAJQDQzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUA0NAotCQkJCWxvY2F0aW9uICAgCSgyNjM5LCAzMTU4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEA0NwotCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAxMDg0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBODk4NjVDMDFDQyIKLQkJCSAgICBjbGllbnQgICAgIAlANDMKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGQTE5QjYwMERFIgotCQkgICAgY2xpZW50ICAgICAJQDQxCi0JCSAgICBzdXBwbGllciAgIAlAOAotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0OQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDYKLQkJICAgIHN1cHBsaWVyICAgCUA0Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiIEA1MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg3NTIsIDIyODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUwCi0JCQlsb2NhdGlvbiAgIAkoNDYwLCAyMjM3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU4NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURDNDUwMzA5IgotCQkgICAgd2lkdGggICAgICAJNjAyCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkJlYW5EZWNvcmF0b3IiIEA1MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDE0NTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUxCi0JCQlsb2NhdGlvbiAgIAkoNywgMTE1MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMDEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmVhbkRlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQwREYwMkQxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTEKLQkJCWxvY2F0aW9uICAgCSg3LCAxMjExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTExCi0JCQltYXhfd2lkdGggIAk4NjgpCi0JCSAgICB3aWR0aCAgICAgIAkxMDI4Ci0JCSAgICBoZWlnaHQgICAgIAk2MzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFOEUwMDdGIgotCQkgICAgY2xpZW50ICAgICAJQDUxCi0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzgxLCAxMTM3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM4MSwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpFdmVudFNldERlY29yYXRvciIgQDUzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4NDgsIDE0MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUzCi0JCQlsb2NhdGlvbiAgIAkoMjM5NSwgMTI2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk5MDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFdmVudFNldERlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTMKLQkJCWxvY2F0aW9uICAgCSgyMzk1LCAxMzI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTc3OCkKLQkJICAgIHdpZHRoICAgICAgCTkyNAotCQkgICAgaGVpZ2h0ICAgICAJMzM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlERUEyMDBFQyIKLQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI4MzEsIDEyNTUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgzMSwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDU1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjY5MiwgMjE0OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEM0UxMDM2NCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJNZXRob2RzIiBANTYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNTIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCVBhcmVudF9WaWV3IAlANTYKLQkJCQlsb2NhdGlvbiAgIAkoMjU4MCwgMjU4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJNZXRob2RzIgotCQkJCXBjdERpc3QgICAgCTAuNzkwNTAzCi0JCQkJaGVpZ2h0ICAgICAJMTkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDNFNjAwN0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDU1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4Ci0JCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJCWxvY2F0aW9uICAgCSgyNTk4LCAyNTIyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjY3Njk2MQotCQkJCWhlaWdodCAgICAgCTE0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjUyKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEM0U2MDA5MSIKLQkJCSAgICBjbGllbnQgICAgIAlANTUKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANjAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlANTUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDYxCi0JCSAgICBsb2NhdGlvbiAgIAkoMjUyNSwgMjIyMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhBMDFBNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VyTGlzdE10aGQiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCA4MTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MwotCQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCQlsb2NhdGlvbiAgIAkoMjI5NiwgMjY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSItc2VyTGlzdE10aGQiCi0JCQkJcGN0RGlzdCAgICAJMC43NjUwMTIKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhCMDIxRiIKLQkJCSAgICBjbGllbnQgICAgIAlANjEKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjUyNSwgMjIyMSkKLQkJCQkoMjMwMywgMjc3MSkKLQkJCQkoMjM4OCwgMjc2OSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY0Ci0JCQkJUGFyZW50X1ZpZXcgCUA2MgotCQkJCWxvY2F0aW9uICAgCSgyMjM5LCAyNTg3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjY1NzY5MgotCQkJCWhlaWdodCAgICAgCTEyOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMzIiBANjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYxCi0JCQkgICAgbG9jYXRpb24gICAJKDI2OSwgODEzKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjEyNzhCMDIyOSIKLQkJCSAgICBjbGllbnQgICAgIAlANjEKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANjYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCSAgICBzdXBwbGllciAgIAlANTMKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDE4NzgsIDI4MDgpCi0JCQkoMjAxNiwgMjAyMSkKLQkJCSgyNjEyLCAxNTkyKSkKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBANjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NjQsIDIwOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY3Ci0JCQlsb2NhdGlvbiAgIAkoMTU2NCwgMjAyMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxOAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEA2OAotCQkgICAgbG9jYXRpb24gICAJKDEzMTUsIDIyODkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNDAzNkYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluZGV4ZWRSZWFkTWV0aG9kIiBANjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKDU2MywgNDAxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDE0MjEsIDIyNzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luZGV4ZWRSZWFkTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMzg1MjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNTAzQ0EiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEzMTUsIDIyODkpCi0JCQkJKDEzNzUsIDIyODkpCi0JCQkJKDE1NTQsIDIxNjgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMTI0OSwgMjIzOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJLTAuMjQwNzc1Ci0JCQkJaGVpZ2h0ICAgICAJNTIKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMSIgQDcyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDQwMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REUzNTAzREUiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA3MwotCQkgICAgbG9jYXRpb24gICAJKDE0NDIsIDIzNjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU1NDAxODAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluZGV4ZWRXcml0ZU1ldGhvZCIgQDc0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MwotCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDQ3MykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCWxvY2F0aW9uICAgCSgxNTk3LCAyMzc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbmRleGVkV3JpdGVNZXRob2QiCi0JCQkJcGN0RGlzdCAgICAJMC41MDExNzcKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlERTU1MDNEMCIKLQkJCSAgICBjbGllbnQgICAgIAlANzMKLQkJCSAgICBzdXBwbGllciAgIAlANjcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTQ0MiwgMjM2MSkKLQkJCQkoMTYzMiwgMjM4MikKLQkJCQkoMTY1NCwgMjE4MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCWxvY2F0aW9uICAgCSgxNjM5LCAyMzA2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY4MTk3MgotCQkJCWhlaWdodCAgICAgCTIKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMyIgQDc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MwotCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDQ3MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU1NTAzRTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDczCi0JCQkgICAgc3VwcGxpZXIgICAJQDUwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDc4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTg5OCwgMTY5MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzA4MDEyOCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYWRkTGlzdGVuZXJNZXRob2QiIEA3OQotCQkJICAgIFBhcmVudF9WaWV3IAlANzgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNzk1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAKLQkJCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQkJbG9jYXRpb24gICAJKDE1NjEsIDE4MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM4NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2FkZExpc3RlbmVyTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNjI3Mzg2Ci0JCQkJaGVpZ2h0ICAgICAJOTAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDMwOTAzNDYiCi0JCQkgICAgY2xpZW50ICAgICAJQDc4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE4OTgsIDE2OTEpCi0JCQkJKDE2NDcsIDE3NjMpCi0JCQkJKDE2NTgsIDIwMDkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlANzkKLQkJCQlsb2NhdGlvbiAgIAkoMTY5OSwgMTg1MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC42OTQwNjgKLQkJCQloZWlnaHQgICAgIAk0OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEA4MgotCQkJICAgIFBhcmVudF9WaWV3IAlANzgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNzk1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMzA5MDM1QSIKLQkJCSAgICBjbGllbnQgICAgIAlANzgKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDgzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2MiwgMTgxMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlENERGMDIwQiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicmVtb3ZlTGlzdGVuZXJNZXRob2QiIEA4NAotCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgOTE2KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQkJbG9jYXRpb24gICAJKDIxMTUsIDE4NDYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3JlbW92ZUxpc3RlbmVyTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuMTI5MDU4Ci0JCQkJaGVpZ2h0ICAgICAJNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEUxMDM5NSIKLQkJCSAgICBjbGllbnQgICAgIAlAODMKLQkJCSAgICBzdXBwbGllciAgIAlANjcKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYKLQkJCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQkJbG9jYXRpb24gICAJKDE4MzksIDIwNTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDg3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4MwotCQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCA5MTYpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ0RTEwM0E5IgotCQkJICAgIGNsaWVudCAgICAgCUA4MwotCQkJICAgIHN1cHBsaWVyICAgCUA1MwotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA4OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAyMTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJbG9jYXRpb24gICAJKDEwNiwgMjExOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4NgotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDg5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMzMyLCAxOTM5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxMzUwMjQ4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjdXN0b21pemVyQ2xhc3MiIEA5MAotCQkJICAgIFBhcmVudF9WaWV3IAlAODkKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTIsIDEwNDMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQotCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQlsb2NhdGlvbiAgIAkoMjk4LCAyMDQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjdXN0b21pemVyQ2xhc3MiCi0JCQkJcGN0RGlzdCAgICAJMC42MzE2NzQKLQkJCQloZWlnaHQgICAgIAk0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxMzYwMUQyIgotCQkJICAgIGNsaWVudCAgICAgCUA4OQotCQkJICAgIHN1cHBsaWVyICAgCUA4OAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MgotCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQlsb2NhdGlvbiAgIAkoMzI2LCAxOTg5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjI4NDE4OAotCQkJCWhlaWdodCAgICAgCTEyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDkzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQotCQkJICAgIGxvY2F0aW9uICAgCSg5MiwgMTA0MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDEzNjAxRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDg5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUxCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDk0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM4NCwgMTg1NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEE4MDE1OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJUeXBlIiBAOTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgOTU4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYKLQkJCQlQYXJlbnRfVmlldyAJQDk1Ci0JCQkJbG9jYXRpb24gICAJKDc4MiwgMjA2NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJUeXBlIgotCQkJCXBjdERpc3QgICAgCTAuNjEwNjc3Ci0JCQkJaGVpZ2h0ICAgICAJMzMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRBQTAzOEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDk0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDg4Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCWxvY2F0aW9uICAgCSg5NzcsIDIwNjEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNDI5NTkwCi0JCQkJaGVpZ2h0ICAgICAJODMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAOTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgOTU4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEFBMDNCNCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTQKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMCIgQDk5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM5MiwgMTkxMykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTcxMDM4NyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXZlbnRBZGFwdGVyQ2xhc3MiIEAxMDAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkgICAgbG9jYXRpb24gICAJKC04NjQsIDUwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMQotCQkJCVBhcmVudF9WaWV3IAlAMTAwCi0JCQkJbG9jYXRpb24gICAJKDc3MSwgMjEzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzY3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXZlbnRBZGFwdGVyQ2xhc3MiCi0JCQkJcGN0RGlzdCAgICAJMC42Mjk3MDIKLQkJCQloZWlnaHQgICAgIAkxMAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTczMDI0OSIKLQkJCSAgICBjbGllbnQgICAgIAlAOTkKLQkJCSAgICBzdXBwbGllciAgIAlAODgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTM5MiwgMTkxMykKLQkJCQkoNzY2LCAyMTI0KQotCQkJCSgzODMsIDIxNzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDIxOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODk4MjU3Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDEwMwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg2NCwgNTA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQxRjExRTczMDI1RCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTkKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxMDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCAyNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDQKLQkJCWxvY2F0aW9uICAgCSg3MjAsIDI1OTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIgQDEwNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAxNDU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDUKLQkJCWxvY2F0aW9uICAgCSgxMzE2LCAxMjAwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTk4NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlByb3BlcnR5RGVjb3JhdG9yIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMDUKLQkJCWxvY2F0aW9uICAgCSgxMzE2LCAxMjYxKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTkKLQkJCW1heF93aWR0aCAgCTgzOCkKLQkJICAgIHdpZHRoICAgICAgCTEwMDIKLQkJICAgIGhlaWdodCAgICAgCTUzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFODQwMzg4IgotCQkgICAgY2xpZW50ICAgICAJQDUwCi0JCSAgICBzdXBwbGllciAgIAlAMTA1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU5NzAyQkQiCi0JCSAgICBjbGllbnQgICAgIAlAMTA1Ci0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMTE4OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzcyLCAxMTA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTEpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDEwOAotCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE5NjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJCRDAwMDAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInJlYWRNZXRob2QiIEAxMDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOAotCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDEwNzIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAKLQkJCQlQYXJlbnRfVmlldyAJQDEwOQotCQkJCWxvY2F0aW9uICAgCSgxMzA4LCAyMDMzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNTQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIityZWFkTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNTUzNzE0Ci0JCQkJaGVpZ2h0ICAgICAJNwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQkJGMDA3MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQotCQkJCVBhcmVudF9WaWV3IAlAMTA5Ci0JCQkJbG9jYXRpb24gICAJKDE0NzEsIDIxMzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODczMzY1Ci0JCQkJaGVpZ2h0ICAgICAJNzIKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDExMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Ci0JCQkgICAgbG9jYXRpb24gICAJKDIzNSwgMTA3MikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJCRjAwODUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOAotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAwMywgMTk2OCkKLQkJCQkoOTA5LCAxOTUwKQotCQkJCSgxMzE2LCAxNzI0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDExMwotCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDIxMDYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJERjAyRDAiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndyaXRlTWV0aG9kIiBAMTE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxMjEwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTMyNSwgMjA5MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjU0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3JpdGVNZXRob2QiCi0JCQkJcGN0RGlzdCAgICAJMC41NjA5MzAKLQkJCQloZWlnaHQgICAgIAkxMgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQkUxMDFGNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCVBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJbG9jYXRpb24gICAJKDE1MDMsIDIwNTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAxNjMyCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDExNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIxMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJFMTAyMEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAzNSwgMjEwNikKLQkJCQkoOTc1LCAyMTA3KQotCQkJCSgxNDYyLCAxNzI0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDExOAotCQkgICAgbG9jYXRpb24gICAJKDg0NCwgMTkwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQjBCMDMzOSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicHJvcGVydHlFZGl0b3JDbGFzcyIgQDExOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ci0JCQkgICAgbG9jYXRpb24gICAJKDc2LCAxMDExKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTkKLQkJCQlsb2NhdGlvbiAgIAkoNzc4LCAxOTY3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwcm9wZXJ0eUVkaXRvckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuMTY2NDMwCi0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REIwRTAxM0YiCi0JCQkgICAgY2xpZW50ICAgICAJQDExOAotCQkJICAgIHN1cHBsaWVyICAgCUA4OAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEKLQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCWxvY2F0aW9uICAgCSgxMTIzLCAxOTE1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAktMC40OTAxODIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNSIgQDEyMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ci0JCQkgICAgbG9jYXRpb24gICAJKDc2LCAxMDExKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQjBFMDE3MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTE4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM0IiBAMTIzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5NiwgMjE4NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQyMDdEODNGMDFEQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGQiIEAxMjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMwotCQkJICAgIGxvY2F0aW9uICAgCSgtMTEyLCA3NzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUKLQkJCQlQYXJlbnRfVmlldyAJQDEyNAotCQkJCWxvY2F0aW9uICAgCSg5MzgsIDI1MTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTExMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ZpZWxkIgotCQkJCXBjdERpc3QgICAgCTAuODkyNTE1Ci0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MjA3RDg0MDAyOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTI5NiwgMjE4NikKLQkJCQkoMTEwMywgMjQ2MykKLQkJCQkoOTIxLCAyNTkzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjQKLQkJCQlsb2NhdGlvbiAgIAkoMTA0NiwgMjU1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43ODA5ODYKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAMTI3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTExMiwgNzc4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQyMDdEODQwMDI5MiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTIzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlL2ludHJvc3BlY3QubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9pbnRyb3NwZWN0Lm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjYTllZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlL2ludHJvc3BlY3QubWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiSURFIgotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCSAgICB2YWx1ZSAgICAgIAkiIikpCi0gICAgcXVpZCAgICAgICAJIjNBNzlFQkE1MDMzMSIKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjk3IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI4RSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNBNzk5OUFEMDJBMSIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0IgotCQlxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYmVhbmluZm8iCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm9cXHJvc2VcXGJlYW5pbmZvLmNhdCIKLQkJcXVpZCAgICAgICAJIjNBNzk5QUJCMDM1MyIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBNzk5OUI3MDMwOSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvIiBAMQotCQkJbG9jYXRpb24gICAJKDI3MiwgMjI0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTQwKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiYmVhbmluZm8iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNBNzk5QUJCMDM1MyIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJEZXBlbmRlbmNpZXMgKERvbid0IGVkaXQpIgotCQlxdWlkICAgICAgIAkiM0I4NjlDOTEwMkU0IgotCQl0aXRsZSAgICAgIAkiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAyCi0JCQlsb2NhdGlvbiAgIAkoMjU2LCAyNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyLCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMwotCQkJbG9jYXRpb24gICAJKDg5NiwgMjU2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKDc0OSwgMjIyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiamF2YSIpCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSg3NDksIDE3MikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkgICAgbmxpbmVzICAgICAJMQotCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCQlxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIgotCQkJd2lkdGggICAgICAJMzA2Ci0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IE5vdGVWaWV3IEA0Ci0JCQlsb2NhdGlvbiAgIAkoNjg4LCA2ODgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjgwLCA1MzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAk3Ci0JCQkgICAgbWF4X3dpZHRoICAJNzgwCi0JCQkgICAgbGFiZWwgICAgICAJIlRoZXNlIGFyZSBwYWNrYWdlcyAoY2F0IGZpbGVzKSB0aGF0IHRoaXMgbW9kZWwgZGVwZW5kcyBvbi4gVGhleSBtdXN0IG5vdCBiZSBlZGl0ZWQgaW4gaGVyZS4gVGhleSBhcmUgb25seSBiZSBlZGl0ZWQgYnkgdGhlIG1vZGVsIHRoYXQgb3ducyB0aGVtLiIpCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxNjc0NDcwMwotCQkJd2lkdGggICAgICAJODQwCi0JCQloZWlnaHQgICAgIAkzMjUpKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDJBMSIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY1IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMkEyIgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyQTQiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKSkKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMkEzIikpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9zY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vc2NoZW1hL3JlZ2lzdHJhdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MDM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9zY2hlbWEvcmVnaXN0cmF0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiBpZD0icmVnaXN0cmF0aW9ucyIgbmFtZT0iQmVhbkluZm8gRXh0ZW5zaW9uIFJlZ2lzdHJhdGlvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byByZWdpc3RlciBjb250cmlidXRvcnMsIGJlYW5pbmZvLCBhbmQgb3ZlcnJpZGVzIGZvciBCZWFuSW5mbyBjb250cmlidXRpb25zLgotJmx0O3AmZ3Q7QW4gaW1wb3J0YW50IGNvbmNlcHQgaXMgdmlzaWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgcGx1Z2luLCBvciBwcm9qZWN0IHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4gVGhlIHRvcC1sZXZlbCBwcm9qZWN0IGlzIHRoZSBwcm9qZWN0IGJlaW5nIGludHJvc3BlY3RlZC4gRm9yIGEgY29udGFpbmVyLCBwbHVnaW4sIG9yIHByb2plY3QgdG8gYmUgdmlzaWJsZSB0byB0aGF0IHByb2plY3QsIHRoZSBjb250YWluZXIsIHBsdWdpbiwgb3IgcHJvamVjdCBtdXN0IGJlIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHRvcC1sZXZlbCBwcm9qZWN0LCBvciBpdCBtdXN0IGJlIGV4cG9ydGVkIGZyb20gYSB2aXNpYmxlIHByb2plY3Qgb3IgcGx1Z2luLiBPbmNlIGEgbm9uLXZpc2libGUgcHJvamVjdC9wbHVnaW4gaXMgcmVhY2hlZCwgYW55IHByb2plY3RzLCBjb250YWluZXJzLCBvciBwbHVnaW5zIHRoYXQgaXQgbWF5IGNvbnRhaW4gYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHZpc2libGUuCi0mbHQ7cCZndDtUaGUgcmVnaXN0cmF0aW9ucyBhcmUgaWRlbnRpZmllZCB3aXRoIHRoZSBjb250YWluZXIgaWQgYW5kL29yIHBsdWdpbiBpZC4gSWYgdGhhdCBjb250YWluZXIgb3IgcGx1Z2luIGlzIHZpc2libGUsIHRoZW4gdGhhdCByZWdpc3RyYXRpb24gd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4gSWYgdGhlIGNvbnRhaW5lci9wbHVnaW4gaXMgZm91bmQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGJ1aWxkIHBhdGggb2YgdGhlIHRvcC1sZXZlbCBwcm9qZWN0LCBpdCB3aWxsIG9ubHkgYmUgcHJvY2Vzc2VkIG9uY2UuCi0mbHQ7cCZndDtUaGVyZSBhcmUgdGhyZWUgZm9ybXMgb2YgcmVnaXN0cmF0aW9ucy4KLSZsdDt1bCZndDsKLSZsdDtsaSZndDtCZWFuSW5mbyByZWdpc3RyYXRpb25zLiBUaGVzZSBzdXBwbHkgc3RhbmRhcmQgQmVhbkluZm8gYW5kIG92ZXJyaWRlcy4KLSZsdDtsaSZndDsmbHQ7c2FtcCZndDtJQ2xhc3NwYXRoQ29udGFpbmVyJmx0Oy9zYW1wJmd0OyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7SUJlYW5JbmZvQ29udHJpYnV0b3ImbHQ7L3NhbXAmZ3Q7LgotJmx0O2xpJmd0O0FuIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtJQmVhbkluZm9Db250cmlidXRvciZsdDsvc2FtcCZndDsuCi0mbHQ7L3VsJmd0OwotJmx0O3AmZ3Q7SXQgcnVucyB0aHJvdWdoIHRoZSB2aXNpYmxlIEJlYW5JbmZvIHJlZ2lzdHJhdGlvbnMuIAotJmx0O3AmZ3Q7Ci1UaGUgSUNsYXNzcGF0aENvbnRhaW5lciByZWdpc3RyYXRpb24gaXNuJmFwb3M7dCBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC4gRm9yIGFsbCB2aXNpYmxlIGNvbnRhaW5lcnMsIGlmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIChmcm9tIEpEVCkgYWxzbyBpbXBsZW1lbnRzIElCZWFuSW5mb0NvbnRyaWJ1dG9yLCB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIEJlYW5JbmZvLgotJmx0O3AmZ3Q7VGhlbiBpdCBydW5zIHRocm91Z2ggdGhlIHZpc2libGUgZXhwbGljaXQgY29udHJpYnV0b3JzLiBOb3RlIHRoYXQgaWYgdGhlIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIGFsc28gaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0OyBpdCB3aWxsIGFsc28gYmUgY2FsbGVkIGZvciBwcm94eSBjb250cmlidXRpb25zLiBUaGlzIGFsbG93cyBmb3Igc3BlY2lhbCBzZXR1cCByZXF1aXJlZCBieSBhbnkgY29udHJpYnV0ZWQgQmVhbkluZm8gZm9yIHRoZSBsYXVuY2hlZCBwcm94eSByZWdpc3RyeS4gVGhpcyBzaG91bGRuJmFwb3M7dCBub3JtYWxseSBiZSBuZWNlc3NhcnkgYmVjYXVzZSBub3JtYWwgY2xhc3NwYXRoIHVwZGF0ZXMgdG8gaW5jbHVkZSB0aGUgQmVhbkluZm8gamFyIHdpbGwgYmUgZG9uZSBieSB0aGUgSUJlYW5JbmZvQ29udHJpYnV0b3IgaXRzZWxmIHRocm91Z2ggdGhlIEJlYW5JbmZvIHJlZ2lzdHJhdGlvbiBjYWxsYmFjay4KLSZsdDtwJmd0O1RoZSBvcmRlciBvZiBwcm9jZXNzaW5nIGZvciB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgdG8gZmlyc3QgcnVuIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvdmVycmlkZXMgKHRocm91Z2ggQmVhbmluZm8gcmVnaXN0cmF0aW9ucykuIFRoZW4gaXQgcnVucyB0aHJvdWdoIHRoZSB2aXNpYmxlIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IsIGFuZCB0aGVuIGZpbmFsbHkgaXQgcnVucyB0aHJvdWdoIHRoZSBleHBsaWNpdCBJQmVhbkluZm9Db250cmlidXRvcnMuIFRoaXMgb3JkZXIgaXMgY2hvc2VuIGJlY2F1c2UgdGhlIG92ZXJyaWRlcyBmaWxlcyBhcmUgbm90IGR5bmFtaWMgc28gdGhleSBuZWVkIHRvIGJlIGFwcGxpZWQgaW4gYSBjb25zaXN0ZW50IHdheS4gVGhlIGNvbnRyaWJ1dG9ycyBhcmUgZHluYW1pYyBhbmQgY2FuIGhhbmRsZSBjaGFuZ2UuCi0mbHQ7cCZndDtUaGUgb25seSBvcmRlciBndWFyYW50ZWUgaXMgdGhhdCBjb250cmlidXRpb25zIGZyb20gdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBwcm9jZXNzZWQgaW4gcGx1Z2luIG9yZGVyIG9mIHdoZXJlIHRoZSBleHRlbnNpb24gd2FzIGRlY2xhcmVkLiBGb3IgZXhhbXBsZSBpZiB0aGVyZSB3YXMgYW4gZXh0ZW5zaW9uIGRlY2xhcmVkIGluIHBsdWdpbiBBIGFuZCBpbiBwbHVnaW4gQiwgYW5kIHBsdWdpbiBCIHJlcXVpcmVzIHBsdWdpbiBBLCB0aGVuIHRoZSBleHRlbnNpb25zIGRlY2xhcmF0aW9ucyBpbiBwbHVnaW4gQSB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnMgaW4gcGx1Z2luIEIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlZ2lzdHJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250cmlidXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlZ2lzdHJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBpcyBhIHJlZ2lzdHJhdGlvbiBmb3IgYSBjb250YWluZXIgb3IgcGx1Z2luLiBJdCBzdXBwbGllcyB0aGUgQmVhbkluZm8gYW5kIHRoZSBvdmVycmlkZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImJlYW5pbmZvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8uKi9KRkFDRSZxdW90OyZsdDsvYiZndDsgd2lsbCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRyaWJ1dG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGlzIGEgY29udHJpYnV0b3IgZm9yIHRoZSB2aXNpYmxlIGNvbnRhaW5lci9wbHVnaW4gZGVmaW5lZCBieSBjb250YWluZXIgYW5kIHBsdWdpbiBhdHRyaWJ1dGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8uKi9KRkFDRSZxdW90OyZsdDsvYiZndDsgd2lsbCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyaWJ1dG9yLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbkluZm9Db250cmlidXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJiZWFuaW5mbyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUHJvdmlkZSBhIEJlYW5JbmZvIGphciBmcm9tIHRoaXMgb3Igc29tZSBvdGhlciBwbHVnaW4sIGFuZCBwcm92aWRlIHNlYXJjaCBwYXRoIHBhY2thZ2VzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWFyY2hwYXRoIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIEJlYW5JbmZvIGphciBmcm9tIHdpdGhpbiB0aGlzIG9yIHNvbWUgb3RoZXIgcGx1Z2luLiBJZiBpdCBpcyB3aXRoaW4gdGhpcyBwbHVnaW4sIHRoZXJlIHNob3VsZCBiZSBubyBsZWFkaW5nICZhcG9zOy8mYXBvczsuIFRoZXJlIGNhbiBiZSBzdWJmb2xkZXJzIHRob3VnaCwgZS5nLiAmbHQ7c2FtcCZndDt4eXovcXhyLmphciZsdDsvc2FtcCZndDsuIElmIGl0IGlzIHdpdGhpbiBhbm90aGVyIHBsdWdpbiwgdGhlbiBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCB3aXRoIGxlYWRpbmcgJmFwb3M7LyZhcG9zOyBmb2xsb3dlZCBieSBwbHVnaW4gaWQsIGZvbGxvd2VkIGJ5IGEgJmFwb3M7LyZhcG9zOyBhbmQgdGhlbiB0aGUgcGF0aCB0byB0aGUgamFyIHJlbGF0aXZlIHRvIHRoYXQgcGx1Z2luLCBlLmcuICZsdDtzYW1wJmd0Oy9vcmcueHl6L3F4ci9kZGQuamFyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VhcmNocGF0aCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBpcyBhIHNlYXJjaCBwYXRoLiBJdCBnaXZlcyB0aGUgcGFja2FnZSB0byBhZGQgdG8gdGhlIHNlYXJjaCBwYXRoIGZvciBCZWFuSW5mby4KLUl0IHJlZmVycyB0byBwYWNrYWdlcyB3aXRoaW4gdGhlIEJlYW5JbmZvIGphciBjb250cmlidXRlZCBieSB0aGUgJmx0O3NhbXAmZ3Q7YmVhbmluZm8mbHQ7L3NhbXAmZ3Q7IGVsZW1lbnQgdGhhdCBpdCBpcyBmb3VuZCB3aXRoaW4uCi1UaGVyZSByZWFsbHkgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBzZWFyY2ggcGF0aC4gVGhlIG9ubHkgd2F5IHRoaXMgamFyIGNvdWxkIGNvbnRyaWJ1dGUgQmVhbkluZm8gYW5kIG5vdCBuZWVkIHNvbWV0aGluZyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggaXMgaWYgdGhlIEJlYW5JbmZvcyBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgYmVhbiBpdHNlbGYuIFRoaXMgaXMgbm90IGEgcmVjb21tZW5kZWQgd2F5IG9mIHN1cHBseWluZyBCZWFuSW5mby4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBqYXZhIHBhY2thZ2UgdG8gc2VhcmNoIGludG8gZm9yIEJlYW5JbmZvLiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzZWFyY2ggcGF0aHMgaW4gdGhpcyAmbHQ7c2FtcCZndDtiZWFuaW5mbyZsdDsvc2FtcCZndDsgZWxlbWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgc2VhcmNoZWQgaW4gdGhlIG9yZGVyIGZvdW5kIGluIHRoZSBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvdmVycmlkZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0icGFja2FnZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGRlc2NyaWJlcyBhbiBvdmVycmlkZSBmaWxlIGZvciBCZWFuSW5mby4gQW4gb3ZlcnJpZGUgZmlsZSBpcyBhbiBYTUkgZmlsZSB0aGF0IGlzIHJlYWQgd2hlbiBhIGNsYXNzIGlzIGZpcnN0IGludHJvc3BlY3RlZC4gSXQgaGFwcGVucyBiZWZvcmUgdGhlIGFjdHVhbCBpbnRyb3NwZWN0aW9uLiBJdCBhbGxvd3Mgb3ZlcnJpZGVzIHRvIHRoZSBKYXZhIEVNRiBtb2RlbCBjbGFzcyAoJmx0O3NhbXAmZ3Q7SmF2YUNsYXNzJmx0Oy9zYW1wJmd0OykgdGhhdCBjYW4gYmUgZG9uZSB0aHJvdWdoIHN0YW5kYXJkIEJlYW5JbmZvLiBUaGVzZSBhcmUgYW5ub3RhdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIFZpc3VhbCBFZGl0b3IgaW1wbGVtZW50YXRpb24gaW4gRWNsaXBzZS4gVGhlIGFubm90YXRpb25zIGhhdmUgbm8gbWVhbmluZyB0byB0aGUgc3RhbmRhcmQgQmVhbkluZm8gc3BlY2lmaWNhdGlvbiBzbyB0aGV5IGFyZSBzdXBwbGllZCBoZXJlIGluc3RlYWQuIFRoZXkgcHJvdmlkZSBhIG11Y2ggZW5yaWNoZWQgZXhwZXJpZW5jZSBpbiB0aGUgVmlzdWFsIEVkaXRvciBieSBwcm92aWRpbmcgY2xhc3NlcyB0aGF0IHJ1biBpbiB0aGUgZWRpdG9yLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIG9yIGEgcGFja2FnZSBmcmFnbWVudC4gV2hlbiB0aGlzIHBhY2thZ2Ugb3IgcGFja2FnZSBmcmFnbWVudCBtYXRjaGVzIHRoZSBwYWNrYWdlIG9yIGZyYWdtZW50IG9mIGEgY2xhc3MgYmVpbmcgaW50cm9zcGVjdGVkLCB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGFwcGxpZWQuIEZvciBleGFtcGxlIGlmIHRoZSBwYWNrYWdlIHdhcyAmbHQ7c2FtcCZndDtqYXZheC5zd2luZyZsdDsvc2FtcCZndDsgYW5kIHRoZSBwYXRoIHdhcyAmcXVvdDt4eXomcXVvdDssIHRoZW4gZm9yIGNsYXNzICZxdW90O2phdmF4LnN3aW5nLkNvbnRhaW5lciZxdW90OyBpdCB3aWxsIGxvb2sgZm9yIGZpbGUgJnF1b3Q7eHl6L0NvbnRhaW5lci5vdmVycmlkZSZxdW90OywgYW5kIGlmIGZvdW5kLCBpdCB3aWxsIGFwcGx5IGl0LiBJZiBpdCB3YXMgJmx0O3NhbXAmZ3Q7amF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudCZsdDsvc2FtcCZndDsgaXQgd2lsbCBsb29rIGZvciBmaWxlICZxdW90O3h5ei90ZXh0L0pUZXh0Q29tcG9uZW50Lm92ZXJyaWRlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIHdoZXJlIHRoaXMgZXh0ZW5zaW9uIGlzIGRlY2xhcmVkIGZvciB0aGUgZm9sZGVyIHRvIHNlYXJjaCBmb3IgdGhlIG92ZXJyaWRlIGZpbGVzLiBTZWUgdGhlIHBhY2thZ2UgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlIGZvciBob3cgdGhpcyB3b3Jrcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcmVnaXN0cmF0aW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5yZWdpc3RyYXRpb24mcXVvdDsmZ3Q7Ci0gICAgJmx0O3JlZ2lzdHJhdGlvbiBjb250YWluZXI9JnF1b3Q7VkVfQ09OVEFJTkVSJnF1b3Q7Jmd0OwotICAgICAgJmx0O2JlYW5pbmZvIHBhdGg9JnF1b3Q7eHl6YmVhbmluZm8uamFyJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7c2VhcmNocGF0aCBwYWNrYWdlPSZxdW90O2NvbS54eXouYmVhbmluZm8mcXVvdDsvJmd0OwotICAgICAgICAmbHQ7c2VhcmNocGF0aCBwYWNrYWdlPSZxdW90O2NvbS54eXoucXhyLmJlYW5pbmZvJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvYmVhbmluZm8mZ3Q7Ci0gICAgICAmbHQ7b3ZlcnJpZGUgcGFja2FnZT0mcXVvdDtjb20ueHl6JnF1b3Q7IHBhdGg9JnF1b3Q7b3ZlcnJpZGVzL2UmcXVvdDsvJmd0OwotICAgICZsdDsvcmVnaXN0cmF0aW9uJmd0OwotICAgICZsdDtjb250cmlidXRvciBwbHVnaW49JnF1b3Q7b3JnLmVjbGlwc2UudmUmcXVvdDsgY2xhc3M9JnF1b3Q7Y29tLnh5ei5teUNvbnRyaWJ1dG9yJnF1b3Q7LyZndDsKLSAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhpcyBzYXlzIHRoYXQgaWYgY29udGFpbmVyICZxdW90O1ZFX0NPTlRBSU5FUiZxdW90OyBpcyB2aXNpYmxlIHRvIHRoZSBwcm9qZWN0IGJlaW5nIGludHJvc3BlY3RlZCwgdGhlbiB0aGVuIEJlYW5JbmZvIGphciAmcXVvdDt4eXpiZWFuaW5mby5qYXImcXVvdDsgKGZvdW5kIGluIHRoZSBwbHVnaW4gdGhhdCBkZWNsYXJlZCB0aGlzIGV4dGVuc2lvbikgd2lsbCBiZSBsb29rZWQgaW50byBmb3IgQmVhbkluZm9zLiBUaGUgdHdvIHBhY2thZ2VzIGxpc3RlZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCBvZiBwYWNrYWdlcy4KLSZsdDtwJmd0OwotVGhlIG92ZXJyaWRlIHNheXMgdGhhdCwgYWdhaW4gZm9yICZxdW90O1ZFX0NPTlRBSU5FUiZxdW90OyB2aXNpYmxlLCBmb3IgYW55IGNsYXNzZXMgdGhhdCBzdGFydCB3aXRoICZxdW90O2NvbS54eXomcXVvdDssIHRoZW4gdGhlIG92ZXJyaWRlIGZpbGUgKGNsYXNzbmFtZS5vdmVycmlkZSkgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gdGhlIGRpcmVjdG9yeSAmcXVvdDtvdmVycmlkZXMvZSZxdW90Oy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjbGFzcyB3YXMgJmx0O3NhbXAmZ3Q7Y29tLnh5ei5BQkMmbHQ7L3NhbXAmZ3Q7IGl0IHdpbGwgbG9vayBmb3Igb3ZlcnJpZGUgZmlsZSAmcXVvdDtvdmVycmlkZXMvZS9BQkMub3ZlcnJpZGUmcXVvdDsuIElmIHRoZSBjbGFzcyB3YXMgJmx0O3NhbXAmZ3Q7Y29tLnh5ei5xeHIuQUJDJmx0Oy9zYW1wJmd0OyBpdCB3aWxsIGZvciBmaWxlICZxdW90O292ZXJyaWRlcy9lL3F4ci9BQkMub3ZlcnJpZGUmcXVvdDsuCi0mbHQ7cCZndDsKLUZpbmFsbHkgaWYgcGx1Z2luICZxdW90O29yZy5lY2xpcHNlLnZlJnF1b3Q7IGlzIHZpc2libGUgdG8gdGhlIHByb2plY3QsIHRoZW4gJmx0O3NhbXAmZ3Q7Y29tLnh5ei5teUNvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0OyB3aWxsIGJlIHVzZWQgdG8gY29udHJpYnV0ZSB0byB0aGUgQmVhbkluZm8uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5JbmZvQ29udHJpYnV0b3ImbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFlMTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm94eUNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImluaXRQYXJzZXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJyZW1vdGVDb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9InZtX2JpbiIgcGF0aD0idm1fcmVtb3Rldm0iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm94eSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3h5UmVtb3RlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHlpZGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDVlMDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1jb21tb25fYmluCi12bV9iaW4KLWphdmFDb21waWxlci52bV9yZW1vdGV2bS5qYXIuYXJncwotamF2YUNvbXBpbGVyLi4uYXJncwotQGRvdAotb3JnLmVjbGlwc2UuamVtLnByb3h5XzIuMC4xMDAuMjAwODA2MDMxMzA0Lmphcgotdm0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzA4MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvdm10cmFjZW91dD1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvdHJhY2VleHByZXNzaW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnN0aW1ldGhyZXNob2xkPTEwMAotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjMzNGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLnByb3h5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMzcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNTdW4gQXByIDE1IDIxOjE1OjE1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWRkMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNNb24gTWFyIDEyIDE3OjE5OjU3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlMTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgRmViIDIxIDEwOjA5OjE4IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2p2ZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTAKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVhY2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBKdW4gMTYgMTE6MDg6MTMgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1zZWxmaG9zdGluZy5iaW5FeGNsdWRlcz0vb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX2JpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjODc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW0ucHJveHk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3QsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0LAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2VhNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0OWE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdm0vcmVtb3Rldm0uamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwcm94eS5qYXJzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuLFwKLSAgICAgICAgICAgICAgICAgICAgIHZtL3JlbW90ZXZtLmphcgotc291cmNlLnZtL3JlbW90ZXZtLmphciA9IHZtX3JlbW90ZXZtLwotb3V0cHV0LnZtL3JlbW90ZXZtLmphciA9IHZtX2Jpbi8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBwcm94eUNvbW1vbi8sXAotICAgICAgICAgICBpbml0UGFyc2VyLyxcCi0gICAgICAgICAgIHJlbW90ZUNvbW1vbi8sXAotICAgICAgICAgICBwcm94eS8sXAotICAgICAgICAgICBwcm94eVJlbW90ZS8sXAotICAgICAgICAgICBwcm94eWlkZS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlBcmd1bWVudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlBcmd1bWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZDg4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0FycmF5QXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLS8qKgotICogVGhpcyByZXByZXNlbnRzIHRoZSBhcmd1bWVudHMgaW4gYSBtdWx0aSBkaW1lbnNpb25hbCBhcnJheSB3aXRoIGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzLCBlLmcuCi0gKiBuZXcgaW50W11bXSB7IHsgMiAsMyB9ICwgeyA0ICw1IH19Ci0gKiB0aGUgYXJndW1lbnRzIG9mIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGluc3RhbmNlIG9mIEFycmF5QXJndW1lbnRzIAotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlBcmd1bWVudHMgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKLQlTdGF0aWMgZlR5cGU7Ci0JTGlzdCBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCWJvb2xlYW4gYXJnc0Nsb3NlZDsKLQlib29sZWFuIGluc2lkZUFyZ3NPcGVuZWRQYXJlbjsKLQlib29sZWFuIGluc2lkZUFyZ3NDbG9zZWRQYXJlbjsKLQkKLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCi0JLy8gSWYgdGhlIGFyZ3MgYXJlIG9wZW5lZCBhbmQgYSB0b2tlbiB3YXMgc3VwcGxpZWQgdGhlbiBpdCBtdXN0IGJlIGFuIGFyZ3VtZW50Ci0JLy9pZiAoIGFyZ3NPcGVuZWQgJiYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IAotCS8vdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKSkgewotCWlmICghYXJnc0Nsb3NlZCl7CQotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICl7Ci0JCQlFeHByZXNzaW9uIG9wZW5Bcmd1bWVudCA9IChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKTsKLQkJCWlmICggIW9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJb3BlbkFyZ3VtZW50LnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJCS8vIElmIHRoZSBhcmd1bWVudCBpcyBjb21wbGV0ZSBhbmQgd2UgcmVjZWl2ZWQgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKLQkJCQlpZiAoIG9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UpewotCQkJCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCX0JCi0JCQotCQkvLyBXZSBtdXN0IGhhdmUgYSBuZXcgYXJndW1lbnQgLSBwcm9jZXNzIGFjY29yZGluZ2x5CQotCQlFeHByZXNzaW9uIG5ld0FyZ3VtZW50ID0gbnVsbDsKLQkJaWYgKCFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKXsKLQkJCWluc2lkZUFyZ3NPcGVuZWRQYXJlbiA9IHRydWU7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQotCQl9Ci0JCWlmICggdG9rZW4ubGVuZ3RoID4gMCB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSB8fCB0b2tlbkRlbGltaXRlciA9PSBPcGVyTWludXMgKSB7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQkJfQotCQkvLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGFyZ3VtZW50IGlzIGEgKSB0aGVuIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoICFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlRWxpcHNlICkgewotCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoIGluc2lkZUFyZ3NPcGVuZWRQYXJlbiAgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UgKSB7Ci0JCQlpbnNpZGVBcmdzQ2xvc2VkUGFyZW4gID0gdHJ1ZTsKLQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRoaXM7Ci19Ci0vKioKLSAqIEluIHRoZSBjYXNlIG9mIHRoZSBleHByZXNzaW9uIG5ldyBpbnRbXVtdIHsgezIsM30gLCB7NCw1fSB9IHRoZW4gd2UgYXJlIHRoZSAyLDMgb3IgdGhlIDQsNQotICogdG8gZXZhbHVhdGUgd2UgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgaW50cyBiYXNlZCBvbiBvdXIgc2l6ZS4gIFRoZSB0eXBlIHdlIHJldHVybiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpbml0aWFsIAotICogY29uc3RydWN0b3Igd2hvIHdpbGwgaGF2ZSBnaXZlbiB0aGlzIHRvIHVzIGFzIG91ciBmVHlwZQotICovCQotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JT2JqZWN0IHJlc3VsdCA9IEFycmF5Lm5ld0luc3RhbmNlKGZUeXBlLmdldFByaW1pdGl2ZVR5cGVDbGFzcygpLGFyZ3VtZW50cy5zaXplKCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCU9iamVjdCBhcmd1bWVudFZhbHVlID0gKChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoaSkpLmV2YWx1YXRlKCk7Ci0JCUFycmF5LnNldChyZXN1bHQsaSxhcmd1bWVudFZhbHVlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCXJldHVybiBhcmdzQ2xvc2VkOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyB2b2lkIHNldFR5cGUoU3RhdGljIHR5cGUpIHsKLQlmVHlwZSA9IHR5cGU7Ci19Ci1wdWJsaWMgdm9pZCBjb250cmlidXRlQXJndW1lbnROdW1iZXIoTGlzdCBhcmd1bWVudE51bWJlckxpc3QpewotCQotCS8vIEFkZCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZSBoYXZlIHRvIHRoZSBsaXN0Ci0JYXJndW1lbnROdW1iZXJMaXN0LmFkZChuZXcgSW50ZWdlcihhcmd1bWVudHMuc2l6ZSgpKSk7Ci0JLy8gSWYgb3VyIGFyZ3VtZW50cyBhcmUgdGhlbXNlbHZlcyBhcnJheSBhcmd1bWVudHMgKCB3aGljaCB3aWxsIG9jY3VyIGluIGFuIGFycmF5IG9mIDMgb3IgbW9yZSBkaW1lbnNpb25zICkKLQkvLyB0aGVuIHdlIHNob3VsZCBjYXNjYWRlIHRoaXMgbWVzc2FnZSB0byBvdXIgYXJndW1lbnQgc28gdGhhdCB0aGUgdG90YWwgYXJyYXkgZGVwdGggaXMga25vd24KLQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICkgewotCQlPYmplY3QgZmlyc3RBcmd1bWVudCA9IGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWlmICggZmlyc3RBcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5QXJndW1lbnRzICkgewotLy8JCQkoKEFycmF5QXJndW1lbnRzKWZpcnN0QXJndW1lbnQpY29udHJpYnV0ZUFyZ3VtZW50TnVtYmVyKGFyZ3VtZW50TnVtYmVyTGlzdCk7Ci0JCX0KLQl9Ci0JCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIkFyZ3MoIik7IC8vJE5PTi1OTFMtMSQKLQl3cml0ZXIud3JpdGUobmV3IEludGVnZXIoYXJndW1lbnRzLnNpemUoKSkudG9TdHJpbmcoKSk7Ci0Jd3JpdGVyLndyaXRlKCIpLSIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLndyaXRlKGFyZ3VtZW50cy50b1N0cmluZygpKTsKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci19Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuaW5pdFBhcnNlci5FeHByZXNzaW9uI2dldFR5cGVDbGFzc05hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICIiOwkvLyBOb3QgYXBwbGljYWJsZSAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Jsb2NrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzcyZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ2xvc2VkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ29tcGxldGUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTWVzc2FnZU9yRmllbGQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQmxvY2soRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24pewotCQljdXJyZW50RXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgQmxvY2soQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyKXsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gZklzQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCk7Ci0JfQotCi0KLQlwdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCQkJCi0JCS8vIElmIHdlIGFyZSBjbG9zZWQgKGkuZS4gY29tcGxldGVkIHdpdGggYSApKSBhbmQgd2UgZ2V0IGEgKSBvciAsIHRoZW4gd2UgYXJlIGFsbCBmaW5pc2hlZCB1cAotCQkvLyBXZSBzaG91bGQgbm90IGZvcndhcmQgdGhpcyB0b2tlbiB0byB0aGUgZXhwcmVzc2lvbiwgYXMgaXQgaXNDb21wbGV0ZQotCQlpZiAoKGZJc0Nsb3NlZCB8fCBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkpICYmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSl7Ci0JCQlmSXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQkKLQkJLy8gSWYgd2UgYXJlIGEgbWVzc2FnZSBvZiBmaWVsZCBhbmQgd2UgZ2V0IGEgKCB3ZSBhcmUgbWVzc2FnZSBvciBhIGZpZWxkIG90aGVyd2lzZQotCQlpZiAoZk1lc3NhZ2VPckZpZWxkKXsKLQkJCWZNZXNzYWdlT3JGaWVsZCA9IGZhbHNlOwotCQkJLy8gVGhlIHByb2JsZW0gbm93IGlzIHRoYXQgd2UgYXJlIGEgYmxvY2sgb2YgYW4gZXhwcmVzc2lvbiBhbmQgd2UgbmVlZCB0byBjcmVhdGUgYSBtZXNzYWdlCi0JCQkvLyB3aGVyZSB3ZSBhcmUgdGhlIHJlY2VpdmVyLiAgSG93ZXZlciB3ZSBhcmUgb24gdGhlIHN0YWNrIGFuZCBnb2luZyB0byBiZSBwb3BwZWQgd2hlbiB0aGUgbWVzc2FnZSBmaW5pc2hlcwotCQkJLy8gc28gd2UgbXVzdCBhbHRlciBvdXJzZWxmIHRvIGJlIGEgYmxvY2sgd2hvc2UgY3VycmVudCBleHByZXNzaW9uIGlzIG1lc3NhZ2Ugd2hvc2UgYXJndW1lbnQKLQkJCS8vIGlzIGEgY29weSBvZiB1cwotCQkJaWYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGN1cnJlbnRFeHByZXNzaW9uLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQkJY3VycmVudEV4cHJlc3Npb24gPSBtZXNzYWdlOwotCQkJCXJldHVybiBtZXNzYWdlOwotCQkJfSBlbHNlIHsKLQkJCQlGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZChjdXJyZW50RXhwcmVzc2lvbix0b2tlbixmQ2xhc3NMb2FkZXIpOwotCQkJCWN1cnJlbnRFeHByZXNzaW9uID0gZmllbGQ7Ci0JCQkJcmV0dXJuIGZpZWxkOwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiB3ZSBhcmUgY2xvc2VkIGFuZCB3ZSBnZXQgYSAuIHRoZW4gd2UgbXVzdCBiZWdpbiBhIG1lc3NhZ2Ugb3IgZmllbGQgZXhwcmVzc2lvbgotCQlpZiAoY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCApewotCQkJZk1lc3NhZ2VPckZpZWxkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCQotCQlFeHByZXNzaW9uIHJlc3VsdCA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkvLyBJZiB0aGUgcmVzdWx0IGlmIGEgcHVzaCB0aGVuIHB1c2ggdGhlIHN0YWNrCi0JCWlmICggcmVzdWx0ICE9IGN1cnJlbnRFeHByZXNzaW9uICkgewotCQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwkKLQkJfQotCQkvLyBJZiBvdXIgY3VycmVudCBleHByZXNzaW9uIGlzIGNvbXBsZXRlIGFuZCB3ZSBhcmUgcmVjZWl2aW5nIGEgY2xvc2UgcGFyZW50IHRoZW4gd2UgYXJlIGNsb3NlZAotCQlpZiAoY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4pewotCQkJZklzQ2xvc2VkID0gdHJ1ZTsKLQotCQl9Ci0JCS8vIElmIHdlIGFyZSBoZXJlIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgc3RpbGwgcHJvY2Vzc2luZyB0b2tlbnMgc28gd2Ugc2hvdWxkIHJldHVybiBpdAotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIkJsb2NrKCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoY3VycmVudEV4cHJlc3Npb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuaW5pdFBhcnNlci5FeHByZXNzaW9uI2dldFR5cGVDbGFzc05hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzc05hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQm9vbGVhbkxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQm9vbGVhbkxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhMTVmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Jvb2xlYW5MaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQm9vbGVhbkxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZTsKLXB1YmxpYyBCb29sZWFuTGl0ZXJhbChib29sZWFuIGFWYWx1ZSl7Ci0KLQl2YWx1ZSA9IGFWYWx1ZTsKLQotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgewotCXJldHVybiBuZXcgQm9vbGVhbih2YWx1ZSk7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCl7Ci0JcmV0dXJuIEJvb2xlYW4uVFlQRTsKLX0KLS8qKgotICogdHJ1ZSBvciBmYWxzZSBjYW5ub3QgY29uc3VtZSBhbnkga2luZCBvZiBleHByZXNzaW9uIHNvIHdlIG11c3QgcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0KLQlyZXR1cm4gbnVsbDsJCi0KLX0KLQotLyoqCi0gKiBUaGlzIGlzIHByaW1pdGl2ZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5pbml0UGFyc2VyLkV4cHJlc3Npb24jZ2V0VHlwZUNsYXNzTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gQm9vbGVhbi5UWVBFLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlZmNiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotLyoqCi0gKiBFeGNlcHRpb24gdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5pdFN0cmluZ1BhcnNlciBjYW4ndCBkZWFsIHdpdGggYXJyYXlzIHJpZ2h0IG5vdwotICovCi1wdWJsaWMgY2xhc3MgQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyNDU5ODQwMjAwNjU3NjE2MzRMOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYW5ub3RQcm9jZXNzSW5uZXJDbGFzc2VzRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiZWNkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB0byBpbmRpY2F0ZSB0aGF0IGlubmVyIGNsYXNzZXMgY2Fubm90IGJlIHByb2Nlc3NlZAotICovCi1wdWJsaWMgY2xhc3MgQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MjkwNTA0NTgwNzM4NDk5NDQ1TDsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3MGI4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBDYXN0IGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQllURV9UWVBFID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTSE9SVF9UWVBFID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRfVFlQRSA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTE9OR19UWVBFID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTE9BVF9UWVBFID0gNDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBET1VCTEVfVFlQRSA9IDU7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBIYXNoTWFwIHNUeXBlTG9va3VwOwotCXN0YXRpYyB7Ci0JCXNUeXBlTG9va3VwID0gbmV3IEhhc2hNYXAoNik7Ci0JCXNUeXBlTG9va3VwLnB1dChCeXRlLlRZUEUsIG5ldyBJbnRlZ2VyKEJZVEVfVFlQRSkpOwotCQlzVHlwZUxvb2t1cC5wdXQoU2hvcnQuVFlQRSwgbmV3IEludGVnZXIoU0hPUlRfVFlQRSkpOwotCQlzVHlwZUxvb2t1cC5wdXQoSW50ZWdlci5UWVBFLCBuZXcgSW50ZWdlcihJTlRfVFlQRSkpOwotCQlzVHlwZUxvb2t1cC5wdXQoTG9uZy5UWVBFLCBuZXcgSW50ZWdlcihMT05HX1RZUEUpKTsKLQkJc1R5cGVMb29rdXAucHV0KEZsb2F0LlRZUEUsIG5ldyBJbnRlZ2VyKEZMT0FUX1RZUEUpKTsKLQkJc1R5cGVMb29rdXAucHV0KERvdWJsZS5UWVBFLCBuZXcgSW50ZWdlcihET1VCTEVfVFlQRSkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFN0YXRpYyBmQ2FzdFR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ2xvc2VkID0gZmFsc2U7Ci0JCi0JcHVibGljIENhc3QoU3RhdGljIGNhc3RUeXBlLCBDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpIHsKLQkJZkNhc3RUeXBlID0gY2FzdFR5cGU7Ci0JCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFR5cGVDbGFzcygpLmlzUHJpbWl0aXZlKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGEgQ2FzdCBleHByZXNzaW9uIGlzIHRoZSB0eXBlIG9mIHRoZSBjYXN0IHR5cGUuCi0JICovCi0JcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZkNhc3RUeXBlLmdldFR5cGVDbGFzcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCAmJiBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIHByaW1pdGl2ZSwgdGhlbiB3ZSBuZWVkIHRvCi0JICogY29udmVydCB0aGUgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHBhc3MKLQkgKiB0aGUgdmFsdWUgb24uCi0JICoKLQkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcHJpbWl0aXZlcyBiZWNhdXNlIGlmIHlvdXIKLQkgKiBlbnRpcmUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIHdhcyBzaW1wbHkgIihzaG9ydCkgMyIKLQkgKiB0aGVuIGEgU2hvcnQgdmFsdWUgbXVzdCBiZSByZXR1cm5lZCBzbyB0aGF0IHRoZQotCSAqIGNvcnJlY3Qga2luZCBvZiBwcmltaXRpdmUgcHJveHkgaXMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRUeXBlQ2xhc3MoKSA9PSBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKSkKLQkJCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwkvLyBUaGV5J3JlIHRoZSBzYW1lLCBzbyBqdXN0IHJldHVybiBpdC4KLQkJaWYgKGdldFR5cGVDbGFzcygpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIENhbiBvbmx5IGNhc3QgYSBwcmltaXRpdmUgdG8gYSBwcmltaXRpdmUsIGV4Y2VwdCBudWxsIGNhbid0IGJlIGNhc3QgdG8gYSBwcmltaXRpdmUuCi0JCQlpZiAoIWN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpLmlzUHJpbWl0aXZlKCkgfHwgY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkgPT0gVm9pZC5UWVBFKQotCQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkuZ2V0TmFtZSgpKSk7CQkJCi0JCQkvLyBib29sZWFuIG9ubHkgYWxsb3dzIGJvb2xlYW4gY2FzdC4KLQkJCWlmIChmQ2FzdFR5cGUuZ2V0VHlwZUNsYXNzKCkgPT0gQm9vbGVhbi5UWVBFIHx8IGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpID09IEJvb2xlYW4uVFlQRSkKLQkJCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpLmdldE5hbWUoKSkpOwotCQkJaWYgKGZDYXN0VHlwZS5nZXRUeXBlQ2xhc3MoKSA9PSBDaGFyYWN0ZXIuVFlQRSkgewotCQkJCS8vIFNvIHdlIGhhdmUgZWl0aGVyIGEgQ2hhcmFjdGVyIG9yIGEgbnVtYmVyIGFzIHRoZSB2YWx1ZS4gQ2FzdCB0aGF0LgkJCQkKLQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcigoY2hhcikgKChOdW1iZXIpIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCkpLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlOdW1iZXIgdmFsdWUgPSBudWxsOwotCQkJCS8vIFNlZSBpZiB0aGUgdmFsdWUgaXMgY2hhcmFjdGVyIG9yIGEgbnVtYmVyLgotCQkJCWlmIChjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKSA9PSBDaGFyYWN0ZXIuVFlQRSkKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKENoYXJhY3RlcikgY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKSkuY2hhclZhbHVlKCkpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSAoTnVtYmVyKSBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBzVHlwZUxvb2t1cC5nZXQoZkNhc3RUeXBlLmdldFR5cGVDbGFzcygpKSkuaW50VmFsdWUoKSkgewotCQkJCQljYXNlIEJZVEVfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgQnl0ZSh2YWx1ZS5ieXRlVmFsdWUoKSk7Ci0JCQkJCWNhc2UgU0hPUlRfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgU2hvcnQodmFsdWUuc2hvcnRWYWx1ZSgpKTsKLQkJCQkJY2FzZSBJTlRfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcih2YWx1ZS5pbnRWYWx1ZSgpKTsKLQkJCQkJY2FzZSBMT05HX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IExvbmcodmFsdWUubG9uZ1ZhbHVlKCkpOwotCQkJCQljYXNlIEZMT0FUX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IEZsb2F0KHZhbHVlLmZsb2F0VmFsdWUoKSk7Ci0JCQkJCWNhc2UgRE9VQkxFX1RZUEU6Ci0JCQkJCQlyZXR1cm4gbmV3IERvdWJsZSh2YWx1ZS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybiBudWxsOwkvLyBTaG91bGRuJ3Qgb2NjdXIuIEp1c3Qgc2F0aXNpZmllcyBjb21waWxlci4KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQl9Ci0JLyoqCi0JICogQSBjYXN0IGV4cHJlc3Npb24gYWx3YXlzIHB1c2hlcyBvbnRvIHRoZSBjYXN0IHZhbHVlCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCS8vIElmIHdlIGRvbid0IGhhdmUgYSBjbGFzcyB5ZXQgdGhlbiB3ZSBhcmUgd2l0aGluIHRoZSBzdGF0ZW1lbnQgdG8gdHJ5IGFuZCBkZXRlcmluZSB0aGUgdHlwZSBiZWluZyBjYXN0IHRvCi0JCWlmKGZDYXN0VHlwZS5nZXRQcmltaXRpdmVUeXBlQ2xhc3MoKSA9PSBudWxsICYmICFmSXNDbG9zZWQpewotCQkJZkNhc3RUeXBlLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJLy8gSWYgdGhlIHR5cGUgd2FzIGNvbXBsZXRlZCBhbmQgd2UgaGF2ZSBhICkgdGhlbiBjbG9zZSB1cwotCQkJaWYoZkNhc3RUeXBlLmdldFByaW1pdGl2ZVR5cGVDbGFzcygpICE9IG51bGwgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbil7Ci0JCQkJZklzQ2xvc2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwkJCQotCQl9Ci0JCQotCQlpZiAoIWZJc0Nsb3NlZCkgewotCQkJLy8gVGhlIGNhc3QgaXMgbm90IGNsb3NlZCwgYnV0IHdlIGhhdmUgYSBzdGF0aWMgY2xhc3MuICBUaGlzIGNsYXNzIG11c3QgdGhlcmVmb3JlIGtlZXAgcHJvY2Vzc2luZyB0aGUgdG9rZW5zIGFzIGl0IGNvdWxkIGJlIGEgbWV0aG9kIG9yIG1lc3NhZ2Ugc2VuZAotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSAgZkNhc3RUeXBlLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJcmVzdWx0LnBhcmVudGhlc2lzTGV2ZWwrKzsKLQkJCXJldHVybiByZXN1bHQ7IAotCQl9Ci0JCQotCQkvLyBJZiB3ZSBoYXZlIG5vIGV4cHJlc3Npb24gcHVzaCBvbnRvIHRoZSBjYXN0IHZhbHVlCQkKLQkJaWYoY3VycmVudEV4cHJlc3Npb24gPT0gbnVsbCl7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKTsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gY3VycmVudEV4cHJlc3Npb24ucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSAKLQkJRXhwcmVzc2lvbiByZXN1bHQgPSBjdXJyZW50RXhwcmVzc2lvbi5wdXNoKHRva2VuLCB0b2tlbkRlbGltaXRlcik7Ci0JCS8vIElmIHRoZSByZXN1bHQgaWYgYSBwdXNoIHRoZW4gcHVzaCB0aGUgc3RhY2sKLQkJaWYgKCByZXN1bHQuaXNDb21wbGV0ZSgpICkgewotCQkJcG9wRXhwcmVzc2lvblN0YWNrKCk7Ci0JCX0gZWxzZSBpZiAoIHJlc3VsdCAhPSBjdXJyZW50RXhwcmVzc2lvbiApIHsKLQkJCXB1c2hFeHByZXNzaW9uU3RhY2socmVzdWx0KTsKLQkJfQkJCi0JCXJldHVybiB0aGlzOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIkNhc3QoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZDYXN0VHlwZSAhPSBudWxsKXsKLQkJCWJ1ZmZlci5hcHBlbmQoZkNhc3RUeXBlLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgiPz8/Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWZmZXIuYXBwZW5kKCIpICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCl7Ci0JCQlidWZmZXIuYXBwZW5kKGN1cnJlbnRFeHByZXNzaW9uLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgiPz8/Iik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLmluaXRQYXJzZXIuRXhwcmVzc2lvbiNnZXRUeXBlQ2xhc3NOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2FzdFR5cGUuZ2V0VHlwZUNsYXNzTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DaGFyTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DaGFyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFkMjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2hhckxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0KLQotcHVibGljIGNsYXNzIENoYXJMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQlwdWJsaWMgY2hhciB2YWx1ZTsKLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXByb3RlY3RlZCBib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCi0vKioKLSAqIGNvbnN0cnVjdG9yCi0gKi8KLXB1YmxpYyBDaGFyTGl0ZXJhbCgpewotfQotCQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWlmICh2YWx1ZUJ1ZmZlci5sZW5ndGgoKSA9PSAxKQotCQlyZXR1cm4gbmV3IENoYXJhY3Rlcih2YWx1ZUJ1ZmZlci5jaGFyQXQoMCkpOwotCWVsc2UKLQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oCi0JCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmdldFN0cmluZygiQ2hhclRvb0NvbXBsaWNhdGVkX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBPYmplY3RbXSB7dmFsdWVCdWZmZXIudG9TdHJpbmcoKX0pKSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLS8qKgotICogV2UgbXVzdCBldmFsdWF0ZSBvdXJzZWxmIGFuZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotICovCi0gCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCXJldHVybiBDaGFyYWN0ZXIuVFlQRTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBDaGFyYWN0ZXIuVFlQRS5nZXROYW1lKCk7Ci19Ci0vKioKLSAqVGhpcyBzdHJpbmcgbWlnaHQgYmUgYnJva2VuIGludG8gYSBmZXcgdG9rZW5zCi0gKnNvIHdlIG5lZWQgYSBTdHJpbmdCdWZmZXIgCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCQotCWlmIChpc0VzY2FwZWQpIHsKLQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCWlmICh0b2tlbi5sZW5ndGggIT0gMCkgewotCQkJLy8gSGFkIGFuIGVzY2FwZSBmb2xsb3dlZCBieSBzdHVmZiwgc28gbm90IGEgdHJ1ZSBlc2MgZm9yIG91ciBjdXJyZW50IGRlZmluaXRpb24KLQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyRXNjYXBlKQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwkvLyBJdCB3YXMgYSB0cnVlIGVzY2FwZS4KLQkJCWVsc2UgewotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwkvLyBJZiB3YXNuJ3QgYSB0cnVlIGVzY2FwZQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCi0JdmFsdWVCdWZmZXIuYXBwZW5kKHRva2VuKTsKLQkKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlKXsJCQotCQlpc0NvbXBsZXRlID10cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLy8gSWYgdGhlIGRlbGltaXRlciBpcyBhbiBlc2NhcGUgY2hhcmFjdGVyIHJlbWVtYmVyIGl0IHNvIHdlIGNhbiBlc2NhcGUKLQkvLyB0aGUgbmV4dCB0b2tlbiwgb3RoZXJ3aXNlIHRyZWF0IGl0IGFzIGEgbGl0ZXJhbAotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyRXNjYXBlICl7Ci0JCWlzRXNjYXBlZCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJdmFsdWVCdWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCXJldHVybiB0aGlzOwotfQotCi0vKioKLSAqIGNoYXJzIGFyZSBwcmltaXRpdmVzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoIkNoYXIoJyIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCB2YWx1ZUJ1ZmZlciAhPSBudWxsICkgewotCQlidWZmZXIuYXBwZW5kKHZhbHVlQnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NvbnN0cnVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOTRlNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgODo1MjozNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cnVjdG9yIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHVibGljIGJvb2xlYW4gYXJnc09wZW5lZCA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIGFyZ3NDbG9zZWQgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiB0cmFpbGluZ1BlcmlvZCA9IGZhbHNlOwotCXB1YmxpYyBBcnJheUxpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLQlwdWJsaWMgU3RhdGljIHR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ29tcGxldGU7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc0Nsb3NlZFBhcmVuID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaXNTdHJpbmcgPSBmYWxzZTsKLQlwdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvcjsKLS8qKgotICogQ29uc3RydWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIENvbnN0cnVjdG9yKENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgewotCXN1cGVyKCk7Ci0JZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGZJc0NvbXBsZXRlOwotfQotCi0vKioKLSAqIEludm9rZSB0aGUgY29uc3RydXRvcgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlpZiAoIHR5cGUuaXNBcnJheSgpICkgewotCQkvLyBGb3IgYXJyYXlzIHdlIGdldCB0aGUgYXJyYXkgdGhhdCBpcyBhY3R1YWxseSBoZWxkIGluc2lkZSB0aGUgc3RhdGljCi0JCS8vIFRvIGluc3RhbnRpYXRlIHRoZSBhcnJheSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzdGF0aWMga25vd3MgdGhlIGFycmF5IHNpemUsIGUuZy4gbmV3IGludFsyXQotCQkvLyBvciBlbHNlIGl0IG11c3QgYmUgZ2l2ZW4gdGhpcyBmcm9tIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHdlIGhhdmUsIGUuZy4gbmV3IGludFtdIHsgMiAsIDMgfQotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICkgewotCQkJdHlwZS5zZXRBcnJheUFyZ3VtZW50cyhhcmd1bWVudHMpOwotCQl9Ci0JCU9iamVjdCByZXN1bHQgPSB0eXBlLmV2YWx1YXRlKCk7Ci0JCS8vIERlYWwgd2l0aCBhcnJheSBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMKLQkJcmV0dXJuIHJlc3VsdDsKLQl9IGVsc2UgewotCQkvLyBGb3Igbm9uIGFycmF5cyB3ZSBmaW5kIHRoZSBtZXRob2QgYW5kIGludm9rZSBpdCBvbiB0aGUgdHlwZQotCQljYWNoZUN0b3IoKTsKLQkJLy8gR2V0IHRoZSBhcnJheSBvZiBhcmd1bWVudHMKLQkJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbYXJndW1lbnRzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IGFyZ3VtZW50cy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCkgOyBpKyspewotCQkJRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbilpdHIubmV4dCgpOwotCQkJYXJnc1tpXSA9IGFuRXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCQl9Ci0JCi0JCXRyeSB7Ci0JCQlyZXR1cm4gY3Rvci5uZXdJbnN0YW5jZShhcmdzKTsJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZW4gd2UgaGF2ZSBhIHZhbGlkIHBhcnNlLCBzbyBhbnl0aGluZyBpcyBhbiBldmFsdWF0aW9uIGV4Y2VwdGlvbi4KLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQotLyoqIEEgY29uc3RydWN0b3IgY2FuIG9ubHkgcmV0dXJuIHRoZSBjbGFzcyBvZiBpdHMgdHlwZQotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKCB0eXBlLmlzQXJyYXkoKSApIHsKLQkJLy8gRm9yIGFycmF5cyB3ZSBnZXQgdGhlIGFycmF5IHRoYXQgaXMgYWN0dWFsbHkgaGVsZCBpbnNpZGUgdGhlIHN0YXRpYwotCQkvLyBUbyBpbnN0YW50aWF0ZSB0aGUgYXJyYXkgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3RhdGljIGtub3dzIHRoZSBhcnJheSBzaXplLCBlLmcuIG5ldyBpbnRbMl0KLQkJLy8gb3IgZWxzZSBpdCBtdXN0IGJlIGdpdmVuIHRoaXMgZnJvbSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZSBoYXZlLCBlLmcuIG5ldyBpbnRbXSB7IDIgLCAzIH0KLQkJaWYgKCBhcmd1bWVudHMuc2l6ZSgpID4gMCApIHsKLQkJCXR5cGUuc2V0QXJyYXlBcmd1bWVudHMoYXJndW1lbnRzKTsKLQkJfQotCX0KLQlyZXR1cm4gdHlwZS5nZXRUeXBlQ2xhc3MoKTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiB0eXBlLmdldFR5cGVDbGFzc05hbWUoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNhY2hlQ3RvcigpIHRocm93cyBFeGNlcHRpb24gewotCQotCWlmIChjdG9yID09IG51bGwpIHsKLQkJQ2xhc3NbXSBhcmdUeXBlcyA9IG5ldyBDbGFzc1thcmd1bWVudHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gYXJndW1lbnRzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcmdUeXBlcy5sZW5ndGg7IGkrKykKLQkJCWFyZ1R5cGVzW2ldID0gZ2V0RXZhbHVhdGlvblR5cGVDbGFzcygoRXhwcmVzc2lvbikgaXRyLm5leHQoKSk7Ci0JCQkKLQkJdHJ5IHsKLQkJCWN0b3IgPSBNZXRob2RIZWxwZXIuZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcihnZXRFdmFsdWF0aW9uVHlwZUNsYXNzKHRoaXMpLCBhcmdUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxpbWl0ZXJPcGVuZWQoY2hhciB0b2tlbil7Ci0JcmV0dXJuIHR5cGUuaXNBcnJheSgpID8gdG9rZW4gPT0gRGVsaW1pdGVyT3BlbkVsaXBzZSA6IHRva2VuID09IERlbGltaXRlck9wZW5QYXJlbjsJCi19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGltaXRlckNsb3NlZChjaGFyIHRva2VuKXsKLQlyZXR1cm4gdHlwZS5pc0FycmF5KCkgPyB0b2tlbiA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSA6IHRva2VuID09IERlbGltaXRlckNsb3NlUGFyZW47Ci19Ci0vKioKLSAqIHB1c2ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0KLQkvLyBJZiB3ZSBhcmUgY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgLiB3aXRoIG5vIHRva2VuIHRoZW4gcmVtZW1iZXIgdGhpcwotCWlmICggYXJnc0Nsb3NlZCAmJiAhdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICYmIHRva2VuLmxlbmd0aCA9PSAwICkgewotCQl0cmFpbGluZ1BlcmlvZCA9IHRydWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIHdpdGggYSAuIGFuZCB3ZSByZWNlaXZlIGEgLiB0aGVuIHdlIGFyZSBhIGZpZWxkCi0JaWYgKCB0cmFpbGluZ1BlcmlvZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgKSB7Ci0JCXJldHVybiBuZXcgRmllbGQodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIHdpdGggYSAuIGFuZCB3ZSByZWNlaXZlIGEgKCB3ZSBhcmUgYSBtZXNzYWdlCi0JaWYgKCB0cmFpbGluZ1BlcmlvZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4gKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZSh0aGlzLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JfQotCQotCS8vIExhenkgaW5pdGlhbGl6ZSB0aGUgdHlwZSBpZiByZXF1aXJlZAotCWlmICggdHlwZSA9PSBudWxsICkgewotCQlzd2l0Y2ggKCB0b2tlbkRlbGltaXRlciApIHsKLQkJCWNhc2UgRGVsaW1pdGVyUGVyaW9kOiB7Ci0JCQkJdHlwZSA9IG5ldyBTdGF0aWModG9rZW4sdG9rZW5EZWxpbWl0ZXIsZkNsYXNzTG9hZGVyKTsKLQkJCQl0eXBlLnNldENsYXNzTG9hZGVyKGZDbGFzc0xvYWRlcik7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlck9wZW5QYXJlbjogewotCQkJCXR5cGUgPSBuZXcgU3RhdGljKHRva2VuLHRva2VuRGVsaW1pdGVyLGZDbGFzc0xvYWRlcik7Ci0JCQkJdHlwZS5zZXRDbGFzc0xvYWRlcihmQ2xhc3NMb2FkZXIpOwotCQkJCWFyZ3NPcGVuZWQgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfSAKLQkJCWNhc2UgRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlOiB7IAotLy8JCQkJdGhyb3cgbmV3IENhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uKCk7Ci0JCQkJLy8gQXJyYXkgZGltZW5pb25zIGFyZSBjcmVhdGVkIGFzIHN0YWVtZW50cyBpbiB0aGUgYXJyYXlEaW1lbnNpb25zCi0JCQkJLy8gVGhpcyBpcyBmb3IgZXhwcmVzc2lvbnMgbGlrZSBuZXcgU3RyaW5nW10gb3IgbmV3IFN0cmluZ1szXSwgd2hlcmUgdGhlIFN0YXRlbWVudCByZXByZXNlbnRzIHRoZSAzLCBpLmUuCi0JCQkJLy8gdGhlIGNvZGUgdGhhdCBkZWNsYXJlcyB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKLQkJCQl0eXBlID0gbmV3IFN0YXRpYyh0b2tlbix0b2tlbkRlbGltaXRlcixmQ2xhc3NMb2FkZXIsdHJ1ZSk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBnZXQgYSB7IGFuZCBvdXIgc3RhdGljIGlzIGFuIGFycmF5IHRoZW4gdGhpcyBpcyB0aGUgYXJyYXkgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycwotCQkJY2FzZSBEZWxpbWl0ZXJPcGVuRWxpcHNlOiB7IAotCQkJCWlmICggdHlwZSAhPSBudWxsICYmIHR5cGUuaXNBcnJheSgpICkgewotCQkJCQlhcmdzT3BlbmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gSWYgd2UgaGF2ZSBhIHN0YXRpYyB0aGF0IGlzIGFuIGFycmF5IHRoZW4gaXQgY29uc3VtZXMgdG9rZW4gdW50aWwgaXQgaXMgY29tcGxldGUKLQlpZiAoIHR5cGUgIT0gbnVsbCAmJiB0eXBlLmlzQXJyYXkoKSApIHsKLQkJLy8gVGhlIHR5cGUgY29uc3VtZXMgdG9rZW4gYXMgbG9uZyBhcyBpdCBpcyBzdGlsbCBpbiB0aGUgYXJyYXkgZGVjbGFyYXRpb24gc2VjdGlvbgotCQlpZiAoIHR5cGUuaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlICkgewotCQkJdHlwZS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQotCQkKLQkvLyBJZiB0aGUgdHlwZSBpcyBpbmNvbXBsZXRlIGFuZCB0aGUgdG9rZW4gaXMgYSAuICggZm9yIGFub3RoZXIgY2xhc3MgKSBvciBhIFsgZm9yIGFuIGFycmF5IHRoZW4gcHVzaCBpdCBvbnRvIHRoZSB0eXBlCi0JaWYgKCF0eXBlLmlzQXJyYXkoKSAmJiB0eXBlLmdldFR5cGVDbGFzcygpID09IG51bGwgJiYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2UpKSB7Ci0JCXR5cGUucHVzaCh0b2tlbiAsIHRva2VuRGVsaW1pdGVyKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCS8vIElmIHRoZSB0eXBlIGlzIGluY29tcGxldGUgYW5kIHRoZSB0b2tlbiBpcyBhICggdGhlbiBwdXNoIGl0IG9udG8gdGhlIHR5cGUgYW5kIG9wZW4gdGhlIHBhcmVucwotCWlmICghdHlwZS5pc0FycmF5KCkpewotCQlpZiAodHlwZS5nZXRUeXBlQ2xhc3MoKSA9PSBudWxsICYmICFhcmdzT3BlbmVkICYmIGlzRGVsaW1pdGVyT3BlbmVkKHRva2VuRGVsaW1pdGVyKSkgewotCQkJYXJnc09wZW5lZCA9IHRydWU7Ci0JCQlpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSB0cnVlOwotCQkJdHlwZS5wdXNoKHRva2VuICwgRGVsaW1pdGVyU3BhY2UgKTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfSBlbHNlIHsgCi0JCWlmICggIWFyZ3NPcGVuZWQgJiYgaXNEZWxpbWl0ZXJPcGVuZWQodG9rZW5EZWxpbWl0ZXIpKSB7Ci0JCQlhcmdzT3BlbmVkID0gdHJ1ZTsKLQkJCWluc2lkZUFyZ3NPcGVuZWRQYXJlbiA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsJCQkKLQkJfQotCX0KLQkKLQkvLyBJZiB0aGUgYXJncyBhcmUgYWxyZWFkeSBjbG9zZWQgYW5kIHdlIGdldCBhbm90aGVyIGNsb3NlIGV4cHJlc3Npb24sIHRoZW4ganVzdCByZXR1cm4gb3Vyc2VsdmVzCi0JLy8gVGhpcyBvY2N1cnMgaW4gdGhlIGNhc2Ugb2YgbmVzdGVkIGFycmF5IGFyZ3VtZW50cyB3aXRoaW4gY29uc3RydWN0b3JzCi0JaWYgKCBhcmdzQ2xvc2VkICYmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuKSl7Ci0JCWZJc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIElmIHRoZSBhcmd1bWVudHMgYXJlIGNsb3NlZCBhbmQgd2UgcmVjZWl2ZSBhIHsgdGhlbiB0aGlzIGlzIGFuIGlubmVyIGNsYXNzIGRlY2xhcmF0aW9uLCBlLmcuCi0JLy8gbmV3IGphdmF4LnN3aW5nLnRhYmxlLkRlZmF1bHRUYWJsZU1vZGVsKCl7fQotCS8vIFRoaXMgY2FuJ3QgYmUgcHJvY2Vzc2VkIGJ5IHVzIHNvIHdlIG5lZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JaWYgKGFyZ3NDbG9zZWQgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlbkVsaXBzZSApIHsKLQkJdGhyb3cgbmV3IENhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyBJZiB0aGUgYXJncyBhcmUgb3BlbmVkIGFuZCBhIHRva2VuIHdhcyBzdXBwbGllZCB0aGVuIGl0IG11c3QgYmUgYW4gYXJndW1lbnQKLQlpZiAoYXJnc09wZW5lZCl7Ci0JCS8vIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbmNvbXBsZXRlIGFyZ3VtZW50IHRoZW4gdGhpcyBtYXkgYmUgYSBjb25zdHJ1Y3RvciwgYSBzdGF0aWMgcmVmZXJlbmNlLCBldGMuLi4KLQkJLy8gYW5kIHdlIHNob3VsZCBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBhcmd1bWVudAotCQlFeHByZXNzaW9uIG9wZW5Bcmd1bWVudCA9IG51bGw7Ci0JCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKXsKLQkJCW9wZW5Bcmd1bWVudCA9IChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKTsKLQkJCWlmICggIW9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJb3BlbkFyZ3VtZW50LnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJCS8vIElmIHRoZSBhcmd1bWVudCBpcyBjb21wbGV0ZSBhbmQgd2UgcmVjZWl2ZWQgYSApIHRoZW4gdGhlIGNvbnN0cnVjdG9yIGlzIGNvbXBsZXRlCi0JCQkJLy8gb3IgaWYgd2UgcmVjZWl2ZSBhIH0gYW5kIGFyZSBhbiBhcnJheSB3ZSBhcmUgY29tcGxldGUKLQkJCQlpZiAoIG9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgJiYgaXNEZWxpbWl0ZXJDbG9zZWQodG9rZW5EZWxpbWl0ZXIpICl7Ci0JCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0gCi0JCX0KLQkJCQotCQlFeHByZXNzaW9uIG5ld0FyZ3VtZW50ID0gbnVsbDsKLQkJLy8gSWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluc2lkZSB0aGUgb3BlbiBhcmcgYW5kIHdlIGdldCBhbm90aGVyIG9wZW4gcGFyZW4gdGhpcyBpcyBwcm9iYWJseSBhIGNhc3QKLQkJLy8gb3Igc29tZSBraW5kIG9mIHN0YXRlbWVudCwgYW5kIE9wZXJNaW51cyBpcyBwcm9iYWJseSB0aGUgc3RhcnQgb2YgYSBudW1iZXIKLQkJLy8gSWYgdGhlIGFyZ3MgYXJlIG5vdCBhbHJlYWR5IG9wZW4gd2UgbXVzdCBiZSBvcGVuZWQgd2l0aCBlaXRoZXIgYSB7IG9yIGEgKCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgYW4gYXJyYXkgb3Igbm90Ci0JCS8vIGhvd2V2ZXIgaWYgdGhlIGFyZ3MgYXJlIG9wZW5lZCBhbHJlYWR5IGFuZCB3ZSByZWNlaXZlIGEgKCB0aGVuIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHN0YXRlbWVudAotLy8JCWlmICgoIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAmJiBpc0RlbGltaXRlck9wZW5lZCh0b2tlbkRlbGltaXRlcikpIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCWlmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuRWxpcHNlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCQlpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSB0cnVlOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlpZiAoIG5ld0FyZ3VtZW50IGluc3RhbmNlb2YgQXJyYXlBcmd1bWVudHMgKSB7Ci0JCQkJKChBcnJheUFyZ3VtZW50cyluZXdBcmd1bWVudCkuc2V0VHlwZSh0eXBlKTsKLQkJCX0KLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQotCQl9Ci0JCQotCQkvLyBTdGFydCBvZiBhIHBvc3NpYmxlIHN0cmluZyBvciBudW1iZXIgb3IgY2hhcmFjdGVyCi0JCWlmICggKCB0b2tlbi5sZW5ndGggPiAwIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlKSB8fCB0b2tlbkRlbGltaXRlciA9PSBPcGVyTWludXMgKXsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCQl9Ci0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcgY2xvc2VkCi0JCWlmICggIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiB8fCBhcmd1bWVudHNBcmVDb21wbGV0ZSgpICYmIGlzRGVsaW1pdGVyQ2xvc2VkKHRva2VuRGVsaW1pdGVyKSApIHsKLQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKCBpbnNpZGVBcmdzT3BlbmVkUGFyZW4gJiYgaXNEZWxpbWl0ZXJDbG9zZWQodG9rZW5EZWxpbWl0ZXIpICkgewotCQkJaW5zaWRlQXJnc0Nsb3NlZFBhcmVuICA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSAsIG9yIGEgJyAnIHRoZW4gdGhlIGFyZ3VtZW50IGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlICkgewotCQkJLy8gSWYgb3VyIGFyZ3VtZW50cyBhcmUgY2xvc2VkIHRoZW4gd2UgbXVzdCBiZSBjb21wbGV0ZS4gIFdlIG5lZWQgdG8gc2lnbmFsIHRoZSBmYWN0IHdlIGFyZSBjbG9zZWQKLQkJCS8vIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgY29ycmVjdGx5IGlmIHdlIGFyZSBwYXJ0IG9mIGEgc3RhY2sgCi0JCQlpZiAoIGFyZ3NDbG9zZWQgKSB7Ci0JCQkJZklzQ29tcGxldGUgPSB0cnVlOwotCQkJfQkJCQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCS8vIElmIHdlIHJlY2VpdmUgYSBjbG9zZSBicmFja2V0IHRoZW4gd2UgYXJlIGNsb3NlZCBhcyBsb25nIGFzIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGNsb3NlZAotCQlpZihhcmdzT3BlbmVkICYmICBpc0RlbGltaXRlckNsb3NlZCh0b2tlbkRlbGltaXRlcikpewotCQkJLy8gTm8gcGFybXMgLSB3ZSBhcmUgYSBjbG9zZWQgY29uc3RydWN0b3IKLQkJCWlmKGFyZ3VtZW50cy5zaXplKCkgPT0gMCl7Ci0JCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9IAotCQl9Ci0JCQotCQkvLyBJZiBvdXIgbGFzdCBhcmd1bWVudCBpcyBjbG9zZWQgYW5kIHJlY2VpdmUgYSApIGFuZCB3ZSBoYXZlIG5vIG5ldyBhcmd1bWVudCB0aGVuIHdlIGFyZSBjbG9zZWQKLQkJaWYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gJiYgbmV3QXJndW1lbnQgPT0gbnVsbCl7Ci0JCQlFeHByZXNzaW9uIGxhc3RBcmd1bWVudCA9IChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKTsKLQkJCWlmICggbGFzdEFyZ3VtZW50LmlzQ29tcGxldGUoKSApIHsKLQkJCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfQkJCQotCQkJCQotCQkvLyBPdGhlcndpc2UgdGhlIG5ldyBhcmd1bWVudCBpcyBzdGlsIHByb2Nlc3NpbmcuICBSZXR1cm4gaXQKLQkJcmV0dXJuIG5ld0FyZ3VtZW50OwotCX0KLQotCXJldHVybiB0aGlzOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gYXJndW1lbnRzQXJlQ29tcGxldGUoKXsKLQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0JcmV0dXJuICgoRXhwcmVzc2lvbilhcmd1bWVudHMuZ2V0KGFyZ3VtZW50cy5zaXplKCktMSkpLmlzQ29tcGxldGUoKTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQotCWphdmEuaW8uU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOwotCXdyaXRlci53cml0ZSgiQ29uc3RydWN0b3IgXCIiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggdHlwZSAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUodHlwZS50eXBlV3JpdGVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiVU5UWVBFRCIpOyAvLyROT04tTkxTLTEkCi0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnNpemUoKSA7IGkrKyl7Ci0JCXdyaXRlci53cml0ZSgiIEFyZygiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIiIgKyAoaSsxKSk7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCIpID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKGFyZ3VtZW50cy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi0vKioKLSAqIFRoaXMgaXMgbmV2ZXIgcHJpbWl0aXZlCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXZhbHVhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjE1YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyBhbiBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24sIGJ1dAotICogaW4gYWRkaXRpb24sIHRoZSBleGNlcHRpb24gdGhhdCBpdCB3cmFwcGVycyBpcyB3aGF0IHNob3VsZCBiZQotICogcmV0dXJuZWQuIFRoaXMgbWVhbnMgaXQgd2FzIGEgdmFsaWQgZXhjZXB0aW9uLCBwYXJzaW5nIGhhZAotICogZ29uZSBmaW5lLCBidXQgaXQgd2FzIGFuIGV2YWx1YXRpb24gdGhhdCBvY2N1cmVkLiBUaGlzIGlzCi0gKiBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIHN0cmFpZ2h0IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiwKLSAqIHdoaWNoIG1lYW5zIHNvbWUgZXJyb3IgZHVyaW5nIHBhcnNpbmcgYW5kIGV2YWx1YXRpb24uCi0gKiAKLSAqIE5vdGU6IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25zIHdpbGwgYmUgdW53cmFwcGVyZWQgdG8gdGhlIHRydWUgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02OTk3MjM5MDIxODg1MzEwOTg2TDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXR1cm5hYmxlRXhjZXB0aW9uLgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLQlwdWJsaWMgRXZhbHVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgZXhjKSB7Ci0JCXN1cGVyKGV4YyBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gPyAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4YykuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgOiBleGMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiZjY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgODo0Njo0NCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBJUGFyc2VyQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBjdXJyZW50RXhwcmVzc2lvbjsKLQlwcm90ZWN0ZWQgTGlzdCBmRXhwcmVzc2lvblN0YWNrOwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBmQ2xhc3NMb2FkZXI7Ci0JcHVibGljIGludCBwYXJlbnRoZXNpc0xldmVsID0gMDsKLS8qKiBDb21wYXJlIHRoZSB0d28gY2hhciBhcnJheXMKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmUoY2hhcltdIGZyb20gLCBjaGFyW10gdG8pewotCi0JcmV0dXJuIEFycmF5cy5lcXVhbHMoZnJvbSwgdG8pOwotfQotLyoqCi0gKiBFeHByZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBOb3RlOiBJZiBhbnkgZXhjZXB0aW9ucyB0aGF0IGFyZSBkdWUgdG8gZXZhbHVhdGlvbiwgYW5kIG5vdCBkdWUgdG8gc29tZQotICogaW52YWxpZCBzdGF0ZSwgdGhlbiB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSB3cmFwcGVyZWQgaW4gYW4gRXZhbHVhdGlvbkV4Y2VwdGlvbiwKLSAqIGFuZCB0aGUgRXZhbHVhdGlvbkV4Y2VwdGlvbiB0aHJvd24gaW5zdGVhZC4gVGhpcyB3YXkgd2UgY2FuIGRpc3RpbnF1aXNoIGJldHdlZW4KLSAqIHZhbGlkIGV4Y2VwdGlvbnMgdGhhdCByZXN1bHQgZXZhbHVhdGlvbnMgKHN1Y2ggYXMgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMpIGZyb20KLSAqIHBhcnNlciBlcnJvcnMgZHVlIHRvIHN0cmluZyBpcyB0b28gY29tcGxpY2F0ZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBsZXRlKCk7Ci0vKioKLSAqIFJldHVybiBhIGNsYXNzIHR5cGUgdGhhdCB0aGUgZXhwcmVzc2lvbiBzeW50YWN0aWNhbGx5IHdvdWxkIHByb2R1Y2UuCi0gKiBGb3IgZXhhbXBsZSwgaWYgYSBmaWVsZCBpcyBvZiB0eXBlIFhZWiwgcmV0dXJuIFhZWiwgZXZlbiB0aG91Z2gKLSAqIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgbWF5IGJlIFN1YlhZWiB3aGVyZSBTdWJYWVogaXMgYSBzdWJjbGFzcyBvZiBYWVouCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uOwotLyoqCi0gKiBJbiBldmFsdWF0aW9uIHBoYXNlLCBnZXQgdGhlIHR5cGUgY2xhc3MgZnJvbSB0aGUgZXhwcmVzc2lvbi4KLSAqIElmIHR5cGVjbGFzcyBub3QgZm91bmQsIHRoZW4gYSBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duLgotICogQHBhcmFtIGV4cCBUbyBnZXRUeXBlQ2xhc3MgZnJvbQotICogQHJldHVybiB0eXBlIGNsYXNzLgotICogQHRocm93cyBFeGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0eXBlIG5vdCBmb3VuZC4KLSAqLwotcHVibGljIENsYXNzIGdldEV2YWx1YXRpb25UeXBlQ2xhc3MoRXhwcmVzc2lvbiBleHApIHRocm93cyBFeGNlcHRpb24gewotCUNsYXNzIGNscyA9IGV4cC5nZXRUeXBlQ2xhc3MoKTsKLQlpZiAoY2xzID09IG51bGwpCi0JCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGV4cC5nZXRUeXBlQ2xhc3NOYW1lKCkpKTsKLQlyZXR1cm4gY2xzOwotfQotCi0vKioKLSAqIEByZXR1cm4gVHlwZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGZyb20gdGhpcyBleHByZXNzaW9uLgotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKTsKLQotcHVibGljIGJvb2xlYW4gaXNOdW1iZXIoY2hhcltdIHRva2VuKXsKLQotCWlmICggdG9rZW4ubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsKLQkvLyBTZWUgd2hldGhlciB0aGUgdG9rZW4gaXMgYSBudW1iZXIKLQlpbnQgcGFyc2VQb3NpdGlvbiA9IDA7Ci0JLy8gVGFrZSBpbnRvIGFjY291bnQgaXQgbWF5IHN0YXJ0IHdpdGggYSAtIHNpZ24sIGUuZy4gLTEKLQlpZiAoIHRva2VuWzBdID09ICctJyApIHBhcnNlUG9zaXRpb24gPSAxOwotCWZvciAoaW50IGkgPSBwYXJzZVBvc2l0aW9uOyBpIDwgdG9rZW4ubGVuZ3RoIDsgaSsrKXsKLQkJLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBkaWdpdCByZXR1cm4gdHJ1ZQotCQkvLyBPdGhlciB0aGluZ3MgbGlrZSBkZWNpbWFscyBvciBwcmltaXRpdmUgdHlwZXMsIGUuZy4gMi4yIG9yIDIuMmYgYXJlIAotCQkvLyBoYW5kbGVkIGJ5IE51bWJlckxpdGVyYWwKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0RpZ2l0KHRva2VuW2ldKTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1BvcCgpewotCXJldHVybiBmYWxzZTsKLX0KLXByb3RlY3RlZCB2b2lkIHBvcEV4cHJlc3Npb25TdGFjaygpewotCi0JaWYgKCBmRXhwcmVzc2lvblN0YWNrICE9IG51bGwgJiYgZkV4cHJlc3Npb25TdGFjay5zaXplKCkgPiAwICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBmRXhwcmVzc2lvblN0YWNrLnJlbW92ZShmRXhwcmVzc2lvblN0YWNrLnNpemUoKS0xKTsKLQl9CQotfQotcHJvdGVjdGVkIHZvaWQgcHVzaEV4cHJlc3Npb25TdGFjayhFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0KLQlpZiAoIGZFeHByZXNzaW9uU3RhY2sgPT0gbnVsbCApIGZFeHByZXNzaW9uU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDIpOwotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gc2hvdWxkIGdvIG9udG8gdGhlIHN0YWNrCi0JZkV4cHJlc3Npb25TdGFjay5hZGQoY3VycmVudEV4cHJlc3Npb24pOwotCS8vIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXJndW1lbnQKLQljdXJyZW50RXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLQkKLX0JCi0KLXZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLX0KLQotLyoqCi0gKiBQdXNoIGFuIGV4cHJlc3Npb24gb250byB1cwotICogUmV0dXJuIHRoZSBuZXcgZXhwcmVzc2lvbiBvbnRvIHdoaWNoIHN1YnNlcXVlbnQgdG9rZW4gc2hvdWxkIGJlIHB1c2hlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgdG9rZW5EZWxpbWl0ZXIpOwotCi0vKioKLSAqIEFuc3dlciBpZiB0aGlzIGV4cHJlc3Npb24gcmVzdWx0cyBpbiBhIHByaW1pdGl2ZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBkZXB0aCwgYm9vbGVhbiBhQnJlYWspewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaWYgKCBhQnJlYWsgKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJTeXN0ZW0ubGluZVNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlmb3IoaW50IGk9MDtpPGRlcHRoO2krKyl7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlidWZmZXIuYXBwZW5kKHRvU3RyaW5nKCkpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRmllbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyNWNhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0ZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzA1LzAwIDEwOjM5OjI4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmllbGQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlOwotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmRmllbGQ7Ci0JcHVibGljIEV4cHJlc3Npb24gcmVjZWl2ZXI7Ci0JcHVibGljIFN0cmluZyBmaWVsZE5hbWU7Ci0JcHJvdGVjdGVkIENsYXNzIGZSZXN1bHRUeXBlOwotCQotcHVibGljIEZpZWxkKEV4cHJlc3Npb24gYVJlY2VpdmVyICwgY2hhcltdIHRva2VuICwgQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQotCXJlY2VpdmVyID0gYVJlY2VpdmVyOwotCWlmICggdG9rZW4ubGVuZ3RoID4gMCApewotCQlmaWVsZE5hbWUgPSBuZXcgU3RyaW5nKHRva2VuKTsKLQl9Ci0KLX0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLQotLyoqCi0gKiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSByZWNlaXZlcgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JT2JqZWN0IHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlci5ldmFsdWF0ZSgpOwkvLyBTbyBpZiBpdCBmYWlscywgd2UgZ2V0IGFuIGV2YWx1YXRpb24gZXhjZXB0aW9uIGdvaW5nIG9uIHVwLgotCXRyeSB7Ci0JCWNhY2hlRmllbGQoKTsJCQotCQlyZXR1cm4gZkZpZWxkLmdldChyZWNlaXZlclZhbHVlKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsJLy8gQW55IGV4Y2VwdGlvbiBhdCB0aGlzIHBvaW50IGlzIGFuIGV2YWx1YXRpb24gZXhjZXB0aW9uLgotCX0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIGZpZWxkIGZyb20gcmVmbGVjdGlvbi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgY2FjaGVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCWlmIChmRmllbGQgPT0gbnVsbCkgewotCQlDbGFzcyBhUmVjZWl2ZXJDbGFzcyA9IGdldEV2YWx1YXRpb25UeXBlQ2xhc3MocmVjZWl2ZXIpOwotCQlmRmllbGQgPSBhUmVjZWl2ZXJDbGFzcy5nZXRGaWVsZChmaWVsZE5hbWUpOwotCQlmUmVzdWx0VHlwZSA9IGZGaWVsZC5nZXRUeXBlKCk7CQkKLQl9Ci19Ci0KLS8qKgotICogVGhlIHJlc3VsdCB0eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCWlmICggZlJlc3VsdFR5cGUgPT0gbnVsbCApIHsKLQkJY2FjaGVGaWVsZCgpOwotCX0KLQlyZXR1cm4gZlJlc3VsdFR5cGU7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gIiI7CS8vIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLiAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIHB1c2ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0KLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGEgKCB0aGVuIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZQotCWlmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UodGhpcyAsIHRva2VuICwgZkNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGEgLiB0aGVuIHRoaXMgaXMgYSBmaWVsZAotCWlmICh0b2tlbi5sZW5ndGggPiAwICAmJiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZQotCXx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSkgewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIG5ldyBGaWVsZCh0aGlzICwgdG9rZW4gLCBmQ2xhc3NMb2FkZXIpOwotCQkKLQl9Ci0JCi0JaWYoZmllbGROYW1lICE9IG51bGwgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIElmIHdlIGhhdmUgbm8gZGVsaW1pdGVyIG9yIGEgY2xvc2UgcGFyZW4gdGhlbiB3ZSBoYXZlIGp1c3QgcmVjZWl2ZWQgdGhlIGZpZWxkIG5hbWUKLQlpZiAoIWlzQ29tcGxldGUgJiYgZmllbGROYW1lID09IG51bGwpIHsKLQkJZmllbGROYW1lID0gbmV3IFN0cmluZyh0b2tlbik7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlpZih0b2tlbkRlbGltaXRlciA9PSBCaXRPUiB8fCB0b2tlbkRlbGltaXRlciA9PSBCaXRBTkQpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJUHJpbWl0aXZlT3BlcmF0aW9uIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVPcGVyYXRpb24odGhpcyx0b2tlbkRlbGltaXRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8vIElnbm9yZSBzcGFjZXMgYXMgdGhpcyBtYXliZSBwYWRkaW5nIGJldHdlZW4gdGhlIGZpZWxkIGFuZCB0aGUgbmV4dCB2YWxpZCB0b2tlbgotCWlmKHRva2VuLmxlbmd0aCA9PSAwICYmIHRva2VuRGVsaW1pdGVyID09ICcgJykgcmV0dXJuIHRoaXM7Ci0KLQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLlVORVhQRUNURURfVE9LRU4pLCBuZXcgT2JqZWN0W10ge25ldyBTdHJpbmdCdWZmZXIodG9rZW4ubGVuZ3RoKzEpLmFwcGVuZCh0b2tlbikuYXBwZW5kKHRva2VuRGVsaW1pdGVyKS50b1N0cmluZygpfSkpOwotCQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JamF2YS5pby5TdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJGaWVsZCBOYW1lPVwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGZpZWxkTmFtZSAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoZmllbGROYW1lKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUoIlwiIFJlY2VpdmVyPSIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCByZWNlaXZlciAhPSBudWxsICl7Ci0JCXdyaXRlci53cml0ZShyZWNlaXZlci50b1N0cmluZygpKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLX0KLQotLyoqCi0gKiBUZXN0IHRoZSBmaWVsZCB0eXBlIHRvIGRldGVybWluZSBpZiBwcmltaXRpdmUgb3Igbm90LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWNhY2hlRmllbGQoKTsKLQlyZXR1cm4gZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSVBhcnNlckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9JUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzBmM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9JUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgdGhlIHBhcnNlci4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNS8wMCA5OjM3OjQ1IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJzZXJDb25zdGFudHMgewotCS8vIERlZmluZSB0aGUgZGVsaW1pdGVycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJTcGFjZSA9ICcgJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyUGVyaW9kID0gJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJPcGVuUGFyZW4gPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlckNsb3NlUGFyZW4gPSAnKSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlckNvbW1hID0gJywnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJRdW90ZSA9ICciJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyRXNjYXBlID0gJ1xcJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyU2luZ2xlUXVvdGUgPSAnXCcnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJPcGVuRWxpcHNlID0gJ3snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJDbG9zZUVsaXBzZSA9ICd9JzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlck9wZW5TcXVhcmVCcmFjZSA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyQ2xvc2VTcXVhcmVCcmFjZSA9ICddJzsKLQkvLyBEZWZpbmUgdGhlIG1hdGggZnVuY3Rpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9wZXJQbHVzID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPcGVyTWludXMgPSAnLSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9wZXJNdWx0aXBseSA9ICcqJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT3BlckRpdmlkZSA9ICcvJzsKLQkvLyBEZWZpbmUgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQml0T1IgPSAnfCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJpdEFORCA9ICcmJzsKLQkKLQkvLyBEZWZpbmUgY29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnROZXcgPSBuZXcgY2hhcltdIHsgJ24nICwgJ2UnICwgJ3cnIH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnRUcnVlID0gbmV3IGNoYXJbXSB7ICd0JyAsICdyJyAsICd1JyAsICdlJyB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENvbnN0YW50RmFsc2UgPSBuZXcgY2hhcltdIHsgJ2YnICwgJ2EnICwgJ2wnICwgJ3MnICwgJ2UnIH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnROdWxsID0gbmV3IGNoYXJbXSB7ICduJyAsICd1JyAsICdsJyAsICdsJyB9OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjg0YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotCi0KLSAqLwotCi0KLQotcHVibGljIGNsYXNzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JCi0vKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NjMzMzkwOTI2MjEwMjc2NzI3TDsKLXB1YmxpYyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGV4Yyl7Ci0Jc3VwZXIoZXhjKTsKLX0KLXB1YmxpYyBUaHJvd2FibGUgZ2V0T3JpZ2luYWxFeGNlcHRpb24oKXsKLQlyZXR1cm4gZ2V0Q2F1c2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZGM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0luaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgODo1Mzo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlckNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGZDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSW5pdFN0cmluZzsKLQlwcm90ZWN0ZWQgaW50IGZTb3VyY2VMZW5ndGg7Ci0JcHJvdGVjdGVkIGNoYXJbXSBmU291cmNlOwotCXByb3RlY3RlZCBpbnQgZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JcHJpdmF0ZSBjaGFyW10gZkN1cnJlbnRUb2tlbjsKLQlwcml2YXRlIGNoYXIgZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IDA7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCBmRXhwcmVzc2lvblN0YWNrID0gbmV3IEFycmF5TGlzdCg0KTsKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBmRXhwcmVzc2lvbjsKLS8qKgotICogSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyKFN0cmluZyBpbml0U3RyaW5nKXsKLQotCWZJbml0U3RyaW5nID0gaW5pdFN0cmluZzsKLQlmU291cmNlID0gaW5pdFN0cmluZy50b0NoYXJBcnJheSgpOwotCWZTb3VyY2VMZW5ndGggPSBmU291cmNlLmxlbmd0aDsKLQotfQotLyoqIExvb2sgZm9yIGEga25vd24gdG9rZW4KLSAqLwotcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmV4dFRva2VuKCl7Ci0KLQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gMDsKLQlpZiAoIGZTb3VyY2VQb3NpdGlvbiA+PSBmU291cmNlTGVuZ3RoIC0gMSApIHsKLQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybjsKLQl9Ci0KLQlmU291cmNlUG9zaXRpb24rKzsKLQkvLyBJZiB3ZSBhcmUgbm90IGluIGEgdG9rZW4gdGhlbiBsb29rIGZvciAiICIgb3IgZWxzZSBmb3IgYSBwZXJpb2QKLQljaGFyW10gZkN1cnJlbnRUb2tlblNvdXJjZSA9IG5ldyBjaGFyW2ZTb3VyY2VMZW5ndGhdOwotCWludCBpID0gMDsKLQlzY2FubmVyIDogZm9yICggOyBmU291cmNlUG9zaXRpb24gPCBmU291cmNlTGVuZ3RoIDsgZlNvdXJjZVBvc2l0aW9uKysgLCBpKysgKXsKLQkJLy8gQWR2YW5jZSB0aGUgc291cmNlIHBvc2l0aW9uIHNvIHdoZW4gZmluZGluZyB0aGUgbmV4dCB0b2tlbiB3ZSBza2lwIG92ZXIgdGhlICcuJyBvciAnICcKLQkJLy8gUmVjb3JkIHRoZSBkZWxpbWl0ZXIgdGhhdCB3YXMgZm91bmQKLQkJc3dpdGNoICggZlNvdXJjZVtmU291cmNlUG9zaXRpb25dICkgewotCQkJY2FzZSBEZWxpbWl0ZXJQZXJpb2Q6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyUGVyaW9kOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlck9wZW5QYXJlbjogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJPcGVuUGFyZW47Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyQ2xvc2VQYXJlbjogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJDbG9zZVBhcmVuOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlckNvbW1hOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlckNvbW1hOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclNwYWNlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclNwYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclF1b3RlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclF1b3RlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclNpbmdsZVF1b3RlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclNpbmdsZVF1b3RlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9CQkJCi0JCQljYXNlIERlbGltaXRlckVzY2FwZTogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJFc2NhcGU7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlbkVsaXBzZTp7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlck9wZW5FbGlwc2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlOnsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlckNsb3NlU3F1YXJlQnJhY2U6ewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJDbG9zZVNxdWFyZUJyYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9CQkJCi0JCQljYXNlIERlbGltaXRlckNsb3NlRWxpcHNlOnsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyQ2xvc2VFbGlwc2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0JCQkJCi0JCQkvLyBEbyB0aGUgbWF0aCBmdW5jdGlvbnMKLQkJCWNhc2UgT3BlclBsdXM6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3BlclBsdXM7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgT3Blck1pbnVzOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IE9wZXJNaW51czsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBPcGVyTXVsdGlwbHk6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3Blck11bHRpcGx5OwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIE9wZXJEaXZpZGU6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3BlckRpdmlkZTsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJLy8gRG8gdGhlIHByaW1pdGl2ZSBCaXRXaXNlIG9wZXJhdGlvbnMKLQkJCWNhc2UgQml0T1I6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gQml0T1I7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgQml0QU5EOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IEJpdEFORDsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQkJCQotCQkJZGVmYXVsdDogewotCQkJCWZDdXJyZW50VG9rZW5Tb3VyY2VbaV0gPSBmU291cmNlW2ZTb3VyY2VQb3NpdGlvbl07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBQdXNoIHRoZSB0b2tlbiBvbnRvIHRoZSBzdGFjayBmb3IgbGF0ZXIgZGVjb2RpbmcKLQlpZiAoIGkgPj0gMSApIHsKLQkJZkN1cnJlbnRUb2tlbiA9IG5ldyBjaGFyW2ldOwotCQlTeXN0ZW0uYXJyYXljb3B5KCBmQ3VycmVudFRva2VuU291cmNlICwgMCAsIGZDdXJyZW50VG9rZW4gLCAwICwgaSApOwotCX0gZWxzZSB7Ci0JCWZDdXJyZW50VG9rZW4gPSBuZXcgY2hhclswXTsKLQl9Ci0KLX0KLS8qKiBBbnN3ZXIgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCXRyeSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9IGNhdGNoIChFdmFsdWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgZTsJLy8gRG9uJ3QgbG9vc2UgdGhlc2UKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLQotfQotcHVibGljIHN0YXRpYyBPYmplY3QgZXZhbHVhdGUoU3RyaW5nIGluaXRTdHJpbmcpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCi0JcmV0dXJuIGV2YWx1YXRlKGluaXRTdHJpbmcsbnVsbCk7Ci0KLX0KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyBpbml0U3RyaW5nLENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0KLQlJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBwYXJzZXIgPSBudWxsOzsKLQl0cnkgewotCQlwYXJzZXIgPSBuZXcgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIoaW5pdFN0cmluZyk7Ci0JCXBhcnNlci5zZXRDbGFzc0xvYWRlcihhQ2xhc3NMb2FkZXIpOwotCQlwYXJzZXIucGFyc2UoKTsKLQl9IGNhdGNoICggVGhyb3dhYmxlIGV4YyApIHsKLQkJdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihleGMpOwotCX0JCQotCXJldHVybiBwYXJzZXIuZXZhbHVhdGUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwYXJzZXIgYWxyZWFkeSBwYXJzZWQuIFVzZSB0aGUgZGVmYXVsdCBjbGFzc2xvYWRlciAoaS5lLiBjbGFzc2xvYWRlciB0aGF0IGxvYWRlZCBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcikuCi0gKiAKLSAqIEBwYXJhbSBpbml0U3RyaW5nCi0gKiBAcmV0dXJuIFRoZSBwYXJzZXIsIGFscmVhZHkgcGFyc2VkLgotICogQHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24KLSAqLwotCi1wdWJsaWMgc3RhdGljIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGNyZWF0ZVBhcnNlcihTdHJpbmcgaW5pdFN0cmluZykgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGNyZWF0ZVBhcnNlcihpbml0U3RyaW5nLCBudWxsKTsKLX0KLSAKLS8qKgotICogUmV0dXJuIGEgcGFyc2VyIGFscmVhZHkgcGFyc2VkLiBVc2UgdGhlIGdpdmVuIGNsYXNzbG9hZGVyLgotICogCi0gKiBAcGFyYW0gaW5pdFN0cmluZwotICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gKiBAcmV0dXJuIFRoZSBwYXJzZXIsIGFscmVhZHkgcGFyc2VkLgotICogQHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24KLSAqLwotcHVibGljIHN0YXRpYyBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBjcmVhdGVQYXJzZXIoU3RyaW5nIGluaXRTdHJpbmcsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCXRyeSB7Ci0JCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcihpbml0U3RyaW5nKTsKLQkJcGFyc2VyLnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLQkJcGFyc2VyLnBhcnNlKCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfSBjYXRjaCAoIFRocm93YWJsZSBleGMgKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZXhjKTsKLQl9Ci0KLX0KLQotLyoqIEFuYWx5emUgdGhlIHN0cmluZwotICovCi1wdWJsaWMgdm9pZCBwYXJzZSgpewotCQotCWNyZWF0ZUZpcnN0RXhwcmVzc2lvbigpOwotCWludCBpID0xOwotCXdoaWxlICggdHJ1ZSApewotCQljcmVhdGVOZXh0VG9rZW4oKTsKLQkJaWYgKCBpc0NvbXBsZXRlICkgewotCQkJLy8gSWYgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBpbmNvbXBsZXRlIGl0IG11c3QgYmUgY29tcGxldGVkIAotCQkJLy8gYnkgdGhlIGVuZCwgd2hpY2ggaXMgYmFzaWNhbGx5IHRoZSBlcXVpYXZsZW50IG9mIGE7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSAgewotCQkJaSsrOwotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBmRXhwcmVzc2lvbi5wdXNoKCBmQ3VycmVudFRva2VuICwgZkN1cnJlbnRUb2tlbkRlbGltaXRlciApOwotCQkJLy8gSWYgdGhlIHJlc3VsdCBpZiBhIHB1c2ggdGhlbiBwdXNoIHRoZSBzdGFjawotCQkJaWYgKCByZXN1bHQuaXNDb21wbGV0ZSgpICkgewotCQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQkJfSBlbHNlIGlmICggcmVzdWx0ICE9IGZFeHByZXNzaW9uICkgewotCQkJCXB1c2hFeHByZXNzaW9uU3RhY2socmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqCi0gKiBBbnN3ZXIgaWYgdGhlIHN0cmluZyByZXN1bHRzIGluIGEgcHJpbWl0aXZlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCXRyeSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbi5pc1ByaW1pdGl2ZSgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JfQotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0RXhwZWN0ZWRUeXBlKCkgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJcmV0dXJuIGZFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JfQotfQotCi0vKiBQb3AgdGhlIHRvcCBleHByZXNzaW9uIG9mZiB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcG9wRXhwcmVzc2lvblN0YWNrKCl7Ci0KLQlpZiAoIGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpID4gMCApIHsKLQkJZkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgZkV4cHJlc3Npb25TdGFjay5yZW1vdmUoZkV4cHJlc3Npb25TdGFjay5zaXplKCktMSk7Ci0JfQkKLX0KLS8qIFB1c2ggdGhlIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHVzaEV4cHJlc3Npb25TdGFjayhFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0KLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIHNob3VsZCBnbyBvbnRvIHRoZSBzdGFjawotCWZFeHByZXNzaW9uU3RhY2suYWRkKGZFeHByZXNzaW9uKTsKLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFyZ3VtZW50Ci0JZkV4cHJlc3Npb24gPSBhbkV4cHJlc3Npb247Ci0JCi19Ci1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaXJzdEV4cHJlc3Npb24oKXsKLQlpZiAoIGZFeHByZXNzaW9uID09IG51bGwgKSB7Ci0JCWZFeHByZXNzaW9uID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpOwotCX07Ci19Ci1wdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsJCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nQnVmZmVyIHdyaXRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl3cml0ZXIuYXBwZW5kKCJQYXJzZXIuIHRva2VuPVwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGZDdXJyZW50VG9rZW4gIT0gbnVsbCApIHsKLQkJd3JpdGVyLmFwcGVuZChmQ3VycmVudFRva2VuKTsKLQl9IAotCXdyaXRlci5hcHBlbmQoIlwiLCBkZWxpbT1cIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLmFwcGVuZChmQ3VycmVudFRva2VuRGVsaW1pdGVyKTsKLQl3cml0ZXIuYXBwZW5kKCJcIiwgaW5pdFN0cmluZz1cIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLmFwcGVuZChmSW5pdFN0cmluZyk7Ci0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwkKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2NhZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZSBleHRlbmRzIEV4cHJlc3Npb24gewotCXByb3RlY3RlZCBib29sZWFuIHRyYWlsaW5nUGVyaW9kID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1ldGhvZCBmTWV0aG9kOwotCXB1YmxpYyBFeHByZXNzaW9uIHJlY2VpdmVyOwotCXB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKLQlwdWJsaWMgYm9vbGVhbiBhcmdzQ2xvc2VkID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc0Nsb3NlZFBhcmVuID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCXB1YmxpYyBBcnJheUxpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLXB1YmxpYyBNZXNzYWdlKEV4cHJlc3Npb24gYVJlY2VpdmVyICwgY2hhcltdIHRva2VuICwgQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQlyZWNlaXZlciA9IGFSZWNlaXZlcjsKLQltZXNzYWdlID0gbmV3IFN0cmluZyh0b2tlbik7Ci0JZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwotfQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlOwotfQotCi0vKioKLSAqIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHJlY2VpdmVyCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQljYWNoZU1ldGhvZCgpOwotCQotCS8vIEdldCB0aGUgYXJyYXkgb2YgYXJndW1lbnRzCi0JT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbYXJndW1lbnRzLnNpemUoKV07Ci0JSXRlcmF0b3IgaXRyID0gYXJndW1lbnRzLml0ZXJhdG9yKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpIDsgaSsrKXsKLQkJRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbilpdHIubmV4dCgpOwotCQlhcmdzW2ldID0gYW5FeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JfQotCQotCU9iamVjdCByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXIuZXZhbHVhdGUoKTsJLy8gU28gaWYgZXZhbHVhdGlvbiBleGNlcHRpb24gdGhyb3duLCB3ZSBkb24ndCB3cmFwcGVyIGFnYWluLgotCQotCXRyeSB7Ci0JCXJldHVybiBmTWV0aG9kLmludm9rZShyZWNlaXZlclZhbHVlLCBhcmdzKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci19Ci0KLS8qKgotICogQ2FjaGUgdGhlIG1lc3NhZ2UKLSAqLwotcHJvdGVjdGVkIHZvaWQgY2FjaGVNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAoZk1ldGhvZCA9PSBudWxsKSB7Ci0JCUNsYXNzW10gYXJnVHlwZXMgPSBuZXcgQ2xhc3NbYXJndW1lbnRzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IGFyZ3VtZW50cy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpPTA7IGk8YXJnVHlwZXMubGVuZ3RoOyBpKyspCi0JCQlhcmdUeXBlc1tpXSA9IGdldEV2YWx1YXRpb25UeXBlQ2xhc3MoKEV4cHJlc3Npb24pIGl0ci5uZXh0KCkpOwotCQkJCi0JCXRyeSB7Ci0JCQlmTWV0aG9kID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlTWV0aG9kKGdldEV2YWx1YXRpb25UeXBlQ2xhc3MocmVjZWl2ZXIpLCBtZXNzYWdlLCBhcmdUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQotCi0KLS8qKgotICogZ2V0VHlwZUNsYXNzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JY2FjaGVNZXRob2QoKTsKLQlyZXR1cm4gZk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gIiI7CS8vIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLiAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIHB1c2ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCi0JLy8gSWYgd2UgYXJlIGNsb3NlZCBhbmQgd2UgcmVjZWl2ZSBhIC4gd2l0aCBubyB0b2tlbiB0aGVuIHJlbWVtYmVyIHRoaXMKLQlpZiAoIGFyZ3NDbG9zZWQgJiYgIXRyYWlsaW5nUGVyaW9kICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCAmJiB0b2tlbi5sZW5ndGggPT0gMCApIHsKLQkJdHJhaWxpbmdQZXJpb2QgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhIC4gdGhlbiB3ZSBhcmUgYSBmaWVsZAotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICkgewotCQlyZXR1cm4gbmV3IEZpZWxkKHRoaXMsdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhICggd2UgYXJlIGEgbWVzc2FnZQotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgLCBvciBhICkgd2UgYXJlIGNvbXBsZXRlIC0gdGhpcyBpcyBhIHN0cnVjdHVyYWwgdG9rZW4gaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSwKLQkvLyBwcm9iYWJseSBhIG1lc3NhZ2UgYXJndW1lbnQgbG93ZXIgZG93biB0aGUgc3RhY2sKLQlpZiAoYXJnc0Nsb3NlZCAmJiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbikpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCi0JLy8gSWYgdGhlIGFyZ3MgYXJlIG9wZW5lZCBhbmQgYSB0b2tlbiB3YXMgc3VwcGxpZWQgdGhlbiBpdCBtdXN0IGJlIGFuIGFyZ3VtZW50Ci0JLy9pZiAoIGFyZ3NPcGVuZWQgJiYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IAotCS8vdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKSkgewotCWlmICghYXJnc0Nsb3NlZCl7CQotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICl7Ci0JCQlFeHByZXNzaW9uIG9wZW5Bcmd1bWVudCA9IChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKTsKLQkJCWlmICggIW9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJb3BlbkFyZ3VtZW50LnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJCS8vIElmIHRoZSBhcmd1bWVudCBpcyBjb21wbGV0ZSBhbmQgd2UgcmVjZWl2ZWQgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKLQkJCQlpZiAoIG9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbil7Ci0JCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfQkKLQkJCi0JCS8vIFdlIG11c3QgaGF2ZSBhIG5ldyBhcmd1bWVudCAtIHByb2Nlc3MgYWNjb3JkaW5nbHkJCi0JCUV4cHJlc3Npb24gbmV3QXJndW1lbnQgPSBudWxsOwotCQlpZiAoIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCi0JCX0KLQkJaWYgKCBuZXdBcmd1bWVudCA9PSBudWxsICYmICh0b2tlbi5sZW5ndGggPiAwIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbiApKSB7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQkJfQotCQkvLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGFyZ3VtZW50IGlzIGEgKSB0aGVuIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoICFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gKSB7Ci0JCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmICggaW5zaWRlQXJnc09wZW5lZFBhcmVuICAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuICkgewotCQkJaW5zaWRlQXJnc0Nsb3NlZFBhcmVuICA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSAsIG9yIGEgJyAnIHRoZW4gdGhlIGFyZ3VtZW50IGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlICkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSB0aGUgbmV3IGFyZ3VtZW50IGlzIHN0aWwgcHJvY2Vzc2luZy4gIFJldHVybiBpdAotLy8JCXJldHVybiBuZXdBcmd1bWVudDsKLQl9Ci0JCi0JLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1lc3NhZ2UgeWV0LCB0aGVuIGNvbnN1bWUgdGhpcyBvbmUKLQlpZiAoIG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCApIHsKLQkJbWVzc2FnZSA9IG5ldyBTdHJpbmcodG9rZW4pOwotCQlyZXR1cm4gdGhpczsKLQl9CQotCi0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JamF2YS5pby5TdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJNc2cgTmFtZT1cIiIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCBtZXNzYWdlICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZShtZXNzYWdlKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUoIlwiIFJjdj0oIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHJlY2VpdmVyICE9IG51bGwgKXsKLQkJd3JpdGVyLndyaXRlKHJlY2VpdmVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0JfQotCXdyaXRlci53cml0ZSgnKScpOwotCWlmICggYXJndW1lbnRzICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiQXJncygiKTsJCSAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhcmd1bWVudHMuaXRlcmF0b3IoKTsKLQkJaW50IGk9MTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGkpLnRvU3RyaW5nKCkpOwotCQkJd3JpdGVyLndyaXRlKCcoJyk7Ci0JCQl3cml0ZXIud3JpdGUoaXRlci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZXIud3JpdGUoIiksIik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQl3cml0ZXIud3JpdGUoJyknKTsJCQkJCi0JfQotCQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi0vKioKLSAqIElzIHRoZSBtZXNzYWdlIHJlc3VsdCBhIHByaW1pdGl2ZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQljYWNoZU1ldGhvZCgpOwotCXJldHVybiBmTWV0aG9kLmdldFJldHVyblR5cGUoKS5pc1ByaW1pdGl2ZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlQXJndW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTWVzc2FnZUFyZ3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZmViZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlQXJndW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQXJndW1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQlFeHByZXNzaW9uIGZFeHByZXNzaW9uOwotCUFycmF5TGlzdCBmRXhwcmVzc2lvblN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotCi1wdWJsaWMgTWVzc2FnZUFyZ3VtZW50KEV4cHJlc3Npb24gYW5FeHByZXNzaW9uKXsKLQlmRXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLX0KLQkKLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQlyZXR1cm4gZkV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQkKLX0JCi0KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQlyZXR1cm4gZkV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCk7Ci0JCi19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gZkV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzTmFtZSgpOwotfQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlIHx8IGZFeHByZXNzaW9uLmlzQ29tcGxldGUoKTsKLX0KLQkKLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCi0JLy8gRXZlbiBpZiBvdXIgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZSBhbmQgd2UgcmVjZWl2ZSBhbnl0aGluZyBvdGhlciB0aGFuIGEgLCB0aGVuIHRoZSBleHByZXNzaW9uIG11c3QgcHJvY2VzcyBpdCBhcyB0aGlzIG1heSBiZSBhIGZpZWxkIG9yIG1lc3NhZ2UKLQkvLyB0aGF0IGlzIGJlaW5nIHNlbnQgdG8gdGhlIGV4cHJlc3Npb24gdG8gbWFrZSB1cCBhIGNvbXBsZXggYXJndW1lbnQJCi0JRXhwcmVzc2lvbiByZXN1bHQgPSBmRXhwcmVzc2lvbi5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JLy8gSWYgdGhlIHJlc3VsdCBpZiBhIHB1c2ggdGhlbiBwdXNoIHRoZSBzdGFjawotCWlmICggcmVzdWx0ICE9IGZFeHByZXNzaW9uICkgewotCQlwdXNoRXhwcmVzc2lvblN0YWNrKHJlc3VsdCk7Ci0JfSBlbHNlIGlmIChyZXN1bHQuaXNDb21wbGV0ZSgpKXsKLQkJLy8gSWYgb3VyIGV4cHJlc3Npb24gaXMgY29tcGxldGUsIHdlIGFyZSBjb21wbGV0ZWQgd2l0aCBhICkgcG9wIHRoZSBzdGFjayBzbyB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBjYW4gcHJvY2VzcyB1cwotCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gKSB7Ci0JCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQl9IGVsc2UgaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgKSB7Ci0JCQkvLyBJZiB3ZSByZWNlaXZlIGEgY29tbWEgd2UgcG9wIHRoZSBzdGFjayBzbyB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBjYW4gcHJvY2VzcyB1cyBidXQgd2UgZG9uJ3QgZmxhZyB1cyBhcyBjb21wbGV0ZQotCQkJcG9wRXhwcmVzc2lvblN0YWNrKCk7Ci0JCQkvLyB1bmxlc3Mgb3VyIGV4cHJlc3Npb24gaXMgc29tZSBhcnJheSBhcmd1bWVudCBBTkQgaXQgaXMgY29tcGxldGUgQU5EIHdlIGhhdmUgYSBjbG9zZSBlbGlwc2UgfQotCQl9IGVsc2UgaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UgKSB7Ci0JCQlwb3BFeHByZXNzaW9uU3RhY2soKTsKLQkJCWlmICggZkV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUFyZ3VtZW50cyApIHsKLQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdGhpczsKLX0JCi0JCi0vKiBQb3AgdGhlIHRvcCBleHByZXNzaW9uIG9mZiB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcG9wRXhwcmVzc2lvblN0YWNrKCl7Ci0KLQlpZiAoIGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpID4gMCApIHsKLQkJRXhwcmVzc2lvbiBsYXN0RXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKWZFeHByZXNzaW9uU3RhY2suZ2V0KGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpIC0gMSk7Ci0JCWlmICggIWxhc3RFeHByZXNzaW9uLmlzQ29tcGxldGUoKSApIHsKLQkJCWZFeHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGZFeHByZXNzaW9uU3RhY2sucmVtb3ZlKGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpIC0gMSk7Ci0JCX0gZWxzZSB7IAotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCX0gCi0JfSBlbHNlIHsKLQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JfQotfQotCi0vKiBQdXNoIHRoZSBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrCi0gKi8KLXByb3RlY3RlZCB2b2lkIHB1c2hFeHByZXNzaW9uU3RhY2soRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24pewotCi0JLy8gVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBzaG91bGQgZ28gb250byB0aGUgc3RhY2sKLQlmRXhwcmVzc2lvblN0YWNrLmFkZChmRXhwcmVzc2lvbik7Ci0JLy8gVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyByZXBsYWNlZCB3aXRoIHRoZSBhcmd1bWVudAotCWZFeHByZXNzaW9uID0gYW5FeHByZXNzaW9uOwotCQotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCXdyaXRlci53cml0ZSgiQXJnKCIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCBmRXhwcmVzc2lvbiAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoZkV4cHJlc3Npb24udG9TdHJpbmcoKSk7Ci0JfQotCXdyaXRlci53cml0ZSgiKSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotfQotcHVibGljIHZvaWQgY29udHJpYnV0ZUFyZ3VtZW50TnVtYmVyKExpc3QgYXJndW1lbnROdW1iZXJMaXN0KXsKLQotCWlmICggZkV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUFyZ3VtZW50cyApIHsKLQkJKChBcnJheUFyZ3VtZW50cylmRXhwcmVzc2lvbikuY29udHJpYnV0ZUFyZ3VtZW50TnVtYmVyKGFyZ3VtZW50TnVtYmVyTGlzdCk7Ci0JfQkKLQkKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVsbExpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVsbExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzZDBlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL051bGxMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXI7Ci0KLS8qCi0KLQotICovCi0KLQotcHVibGljIGNsYXNzIE51bGxMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci1wdWJsaWMgTnVsbExpdGVyYWwoKXsKLX0KLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCl7Ci0JcmV0dXJuIE1ldGhvZEhlbHBlci5OVUxMX1RZUEU7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gTWV0aG9kSGVscGVyLk5VTExfVFlQRS5nZXROYW1lKCk7Ci19Ci0vKioKLSAqIHRydWUgb3IgZmFsc2UgY2Fubm90IGNvbnN1bWUgYW55IGtpbmQgb2YgZXhwcmVzc2lvbiBzbyB3ZSBtdXN0IHJldHVybiBudWxsCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogTnVsbCBpcyBub3QgcHJpbWl0aXZlCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL051bWJlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZkOTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotCi0KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBOdW1iZXJMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBudW1iZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQ2xhc3MgbnVtYmVyQ2xhc3MgPSBJbnRlZ2VyLlRZUEU7Ci0JcHJvdGVjdGVkIGludCBleHBvbmVudEZsYWcgPSBOT19FWFBPTkVOVDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludAotCQlOT19FWFBPTkVOVCA9IDAsCi0JCUhBU19FWFBPTkVOVCA9IDEsCi0JCUhBU19FWFBPTkVOVF9NSU5VUyA9IDI7Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyTGl0ZXJhbCgpewotfQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXRyeSB7Ci0JCS8vIFJldHVybiBhIG51bWJlciBvZiB0aGUgY29ycmVjdCBpbnN0YW5jZQotCQlpZiAobnVtYmVyQ2xhc3MgPT0gRmxvYXQuVFlQRSl7Ci0JCQlyZXR1cm4gbmV3IEZsb2F0KEZsb2F0LnBhcnNlRmxvYXQobnVtYmVyU3RyaW5nKSk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyQ2xhc3MgPT0gTG9uZy5UWVBFICkgewotCQkJcmV0dXJuIExvbmcuZGVjb2RlKG51bWJlclN0cmluZyk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyQ2xhc3MgPT0gRG91YmxlLlRZUEUgKXsKLQkJCXJldHVybiBuZXcgRG91YmxlKERvdWJsZS5wYXJzZURvdWJsZShudW1iZXJTdHJpbmcpKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gSW50ZWdlci5kZWNvZGUobnVtYmVyU3RyaW5nKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci0JCi19Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0eXBlIG9mIG51bWJlciB0aGF0IHdlIGFyZS4KLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpewotCXJldHVybiBudW1iZXJDbGFzczsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBudW1iZXJDbGFzcyAhPSBudWxsID8gbnVtYmVyQ2xhc3MuZ2V0TmFtZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSWYgdGhlIGRlbGltaXRlciBpcyBhbiBvcGVyYXRpb24gc3VjaCBhcyBhICssLSwvLCogdGhlbiB3ZSBjYW4gY29uc3VtZSBpdAotICogSWYgdGhlIGRlbGltaXRlciBpcyBwZXJpb2QgYW5kIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUgdGhlbiBpdCBpcyB0aGUgZGVjaW1hbCBwb3J0aW9uIG9mIHVzCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCQkKLQkvLyBDbG9zZSBicmFja2V0cyBjb21wbGV0ZSB1c2UJCQotCWlmKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQl9Ci0JCi0JaWYgKGRlbGltaXRlciA9PSBPcGVyTWludXMgJiYgbnVtYmVyU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCW51bWJlclN0cmluZys9T3Blck1pbnVzOwkvLyBObyBkaWdpdHMgeWV0LCBidXQgd2UgaGF2ZSBhIG1pbnVzIHNpZ24sIHNvIGFkZCB0byBhY2N1bXVsYXRpbmcgbnVtYmVyLgotCQkKLQludW1iZXJTdHJpbmcgKz0gcHJvY2Vzc051bWJlclRva2VuKHRva2VuKTsJCi0JCi0JLy8gSWYgd2UgaGF2ZSBwYXJ0IG9mIGEgbnVtYmVyIGFuZCBhcmUgYXNrZWQgdG8gZG8gc29tZSBhcml0aG1ldGljIHRocm93IGFuIAotCS8vIGVycm9yIHRoYXQgdGhpcyBoYXMgbm90IGJlZW4gY29kZWQgeWV0LCBleGNlcHQgbWludXMgY291bGQgYmUgcGFydCBvZiBhbiBleHBvbmVudC4KLQlpZihudW1iZXJTdHJpbmcubGVuZ3RoKCkgPiAwICYmIHRva2VuLmxlbmd0aCA+IDEpIHsKLQkJc3dpdGNoKGRlbGltaXRlcil7Ci0JCQljYXNlIE9wZXJNaW51czoKLQkJCQlpZiAoZXhwb25lbnRGbGFnID09IEhBU19FWFBPTkVOVCkgewotCQkJCQlleHBvbmVudEZsYWcgPSBIQVNfRVhQT05FTlRfTUlOVVM7Ci0JCQkJCW51bWJlclN0cmluZyArPSBPcGVyTWludXM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgT3BlclBsdXM6CQkJCi0JCQljYXNlIE9wZXJNdWx0aXBseToKLQkJCWNhc2UgT3BlckRpdmlkZToKLQkJCXsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZG8gYXJpdGhtZXRpYyB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKXsKLQkJbnVtYmVyQ2xhc3MgPSBEb3VibGUuVFlQRTsJLy8gQSBkZWNpbWFsIG1ha2VzIGl0IGRvdWJsZS4KLQkJbnVtYmVyU3RyaW5nICs9IERlbGltaXRlclBlcmlvZDsKLQl9CQotCi0JaWYoZGVsaW1pdGVyID09IEJpdE9SIHx8IGRlbGltaXRlciA9PSBCaXRBTkQpewotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJpbWl0aXZlT3BlcmF0aW9uKHRoaXMsZGVsaW1pdGVyKTsKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXR1cm4gdGhpczsKLQkKLX0KLXByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc051bWJlclRva2VuKGNoYXJbXSB0b2tlbil7Ci0JCi0JZm9yIChpbnQgaT0wOyBpPHRva2VuLmxlbmd0aDsgaSsrKQotCQlpZiAodG9rZW5baV0gPT0gJ0UnIHx8IHRva2VuW2ldID09ICdlJykgewotCQkJbnVtYmVyQ2xhc3MgPSBEb3VibGUuVFlQRTsJLy8gRGVmaW5pdGVseSBhIGZsb2F0aW5nIGJlY2F1c2Ugb2YgdGhpcy4KLQkJCWV4cG9uZW50RmxhZyA9IEhBU19FWFBPTkVOVDsKLQkJCWJyZWFrOwotCQl9Ci0JCQkKLQkvLyBUaGUgdG9rZW4gY291bGQgYmUgYSBudW1iZXIsIGUuZy4gMTAgb3IgNSBvciBjb3VsZCBiZSBxdWFsaWZpZWQgd2l0aCBhIHByaW1pdGl2ZQotCS8vIHN1ZmZpeCwgZS5nLiAxMGwgb3IgNWYKLQljaGFyW10gbnVtYmVyVG9rZW4gPSB0b2tlbjsKLQlpZiAoIHRva2VuLmxlbmd0aCA+IDAgKSB7Ci0JCXN3aXRjaCh0b2tlblt0b2tlbi5sZW5ndGggLSAxXSl7Ci0JCQljYXNlICdGJzogCQkJCi0JCQljYXNlICdmJzoKLQkJCQludW1iZXJDbGFzcyA9IEZsb2F0LlRZUEU7Ci0JCQkJbnVtYmVyVG9rZW4gPSBuZXcgY2hhclt0b2tlbi5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRva2VuLDAsbnVtYmVyVG9rZW4sMCxudW1iZXJUb2tlbi5sZW5ndGgpOwotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnTCc6CQkJCi0JCQljYXNlICdsJzoKLQkJCQludW1iZXJDbGFzcyA9IExvbmcuVFlQRTsKLQkJCQludW1iZXJUb2tlbiA9IG5ldyBjaGFyW3Rva2VuLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodG9rZW4sMCxudW1iZXJUb2tlbiwwLG51bWJlclRva2VuLmxlbmd0aCk7CQkJCQotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnRCc6CQkJCi0JCQljYXNlICdkJzoKLQkJCQludW1iZXJDbGFzcyA9IERvdWJsZS5UWVBFOwotCQkJCW51bWJlclRva2VuID0gbmV3IGNoYXJbdG9rZW4ubGVuZ3RoIC0gMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSh0b2tlbiwwLG51bWJlclRva2VuLDAsbnVtYmVyVG9rZW4ubGVuZ3RoKTsJCQkJCi0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCQkKLQlyZXR1cm4gbmV3IFN0cmluZyhudW1iZXJUb2tlbik7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlqYXZhLmlvLlN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIk51bWJlciBcIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLndyaXRlKG51bWJlclN0cmluZyk7Ci0Jd3JpdGVyLndyaXRlKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCi19Ci0KLS8qKgotICogTnVtYmVyIGxpdGVyYWxzIGFyZSBwcmltaXRpdmUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1ByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9QcmltaXRpdmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MTQ3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1ByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBUaGlzIGlzIGZvciBwcmltaXRpdmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgb3B0aW1pemVkIG91dCB0aGUgY29tcGlsZXIgc3VjaCBhcyBiaXQgb3IsIGJpdCBhbmQsIGV0Yy4uCi0gICAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKgotCi0KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlT3BlcmF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCi0JcHJvdGVjdGVkIGludCBvcGVyYXRpb247CQkJCS8vIFRoaXMgY2FuIGJlIEJpdE9SIG9yIEJpdEFORAotCXByb3RlY3RlZCBFeHByZXNzaW9uIHJlY2VpdmVyOwkvLyBUaGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGV4cHJlc3Npb24KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0JCi0JcHVibGljIFByaW1pdGl2ZU9wZXJhdGlvbihFeHByZXNzaW9uIGFSZWNlaXZlciwgaW50IGFuT3BlcmF0aW9uKXsKLQkJcmVjZWl2ZXIgPSBhUmVjZWl2ZXI7Ci0JCW9wZXJhdGlvbiA9IGFuT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGxlZnRIYW5kU2lkZSA9IHJlY2VpdmVyLmV2YWx1YXRlKCk7Ci0JCU9iamVjdCByaWdodEhhbmRTaWRlID0gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQkJaWYgKGxlZnRIYW5kU2lkZSBpbnN0YW5jZW9mIEludGVnZXIgJiYgcmlnaHRIYW5kU2lkZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCWlmKG9wZXJhdGlvbiA9PSBCaXRPUikgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKEludGVnZXIpbGVmdEhhbmRTaWRlKS5pbnRWYWx1ZSgpIHwgKChJbnRlZ2VyKXJpZ2h0SGFuZFNpZGUpLmludFZhbHVlKCkpOwkJCQkKLQkJCX0gZWxzZSBpZihvcGVyYXRpb24gPT0gQml0QU5EKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCgoSW50ZWdlcilsZWZ0SGFuZFNpZGUpLmludFZhbHVlKCkgJiAoKEludGVnZXIpcmlnaHRIYW5kU2lkZSkuaW50VmFsdWUoKSk7CQkJCQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmdldFN0cmluZygiUHJpbWl0aXZlT3BlcmF0aW9uLkV2YWx1YXRlLkludmFsaWRPcGVyYXRvcl9FWENfIiksIG5ldyBPYmplY3RbXXtnZXRPcGVyRGVzY3JpcHRpb24oKSwgbGVmdEhhbmRTaWRlLCByaWdodEhhbmRTaWRlfSkpOwkJIC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyRGVzY3JpcHRpb24oKXsKLQkJaWYob3BlcmF0aW9uID09IEJpdE9SKSByZXR1cm4gInwiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcGVyYXRpb24gPT0gQml0QU5EKSByZXR1cm4gIiYiOwkJCSAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiPz8/IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEludGVnZXIuVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLlRZUEUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCi0JCS8vIENyZWF0ZSBhIG5ldyBzdGF0ZW1lbnQgaWYgdGhlIGFyZ3VtZW50IGlzIG51bGwgKCB3ZSBhcmUgYWx3YXlzIGNyZWF0ZWQgd2l0aCBhIHJlY2VpdmVyICkKLQkJaWYoY3VycmVudEV4cHJlc3Npb24gPT0gbnVsbCAmJiB0b2tlbi5sZW5ndGggPiAwKXsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJcHVzaEV4cHJlc3Npb25TdGFjayhjdXJyZW50RXhwcmVzc2lvbik7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSAKLQkJCi0JCS8vIElnbm9yZSB3aGl0ZXNwYWNlCi0JCWlmKHRva2VuLmxlbmd0aCA9PSAwICYmIHRva2VuRGVsaW1pdGVyID09ICcgJykgcmV0dXJuIHRoaXM7Ci0JCQotCQkvLyBJZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHdlIGp1c3Qga2VlcCBwdXNoaW5nIHRoZSBleHByZXNzaW9uIG9udG8gdGhpcwotCQlpZihjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsKXsKLQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gY3VycmVudEV4cHJlc3Npb24ucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlpZihyZXN1bHQgIT0gY3VycmVudEV4cHJlc3Npb24pewotCQkJCXB1c2hFeHByZXNzaW9uU3RhY2socmVzdWx0KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCAmJiBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkpewotCQkJaWYodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpewotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfSBlbHNlIGlmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuKXsKLQkJCQlpZihyZWNlaXZlci5wYXJlbnRoZXNpc0xldmVsID4gMCl7Ci0JCQkJCXJlY2VpdmVyLnBhcmVudGhlc2lzTGV2ZWwtLTsKLQkJCQl9IGVsc2UgewotCQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsJCQkKLQkJCQkJcmV0dXJuIHRoaXM7CQkKLQkJCQl9Ci0JCQl9Ci0JCX0JCQkJCi0JCi0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChyZWNlaXZlciAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHJlY2VpdmVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKGdldE9wZXJEZXNjcmlwdGlvbigpKTsKLQkJaWYgKGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoY3VycmVudEV4cHJlc3Npb24udG9TdHJpbmcoKSk7IAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1Byb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1Byb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTYyMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Qcm94eUluaXRQYXJzZXJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotLyoqCi0gKiBHZW5lcmFsIFByb3h5IE5MUyBDb25zdGFudHMKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEzLzAwIDEwOjQ2OjU4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlJbml0UGFyc2VyTWVzc2FnZXMgewotCS8vIFJlc291cmNlIEJ1bmRsZSB0byB1c2UgZm9yIGJhc2ljIFByb3h5IE5MUyByZXNvdXJjZXMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5tZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBLZXlzIGZvciBtZXNzYWdlcy9zdHJpbmdzIHdpdGhpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nCi0JCVVORVhQRUNURURfVE9LRU4gPSAiVW5leHBlY3RlZFRva2VuX0VYQ18iLCAvLyROT04tTkxTLTEkCi0JCVNUQVRFTUVOVF9VTkVYUEVDVEVEX0VYRUNVVElPTiA9ICJTdGF0ZW1lbnQuVW5leHBlY3RlZEV4ZWN1dGlvbl9FWENfIiwgLy8kTk9OLU5MUy0xJAotCQlTVEFURU1FTlRfVU5FWFBFQ1RFRF9FVkFMVUFUSU9OID0gIlN0YXRlbWVudC5VbmV4cGVjdGVkRXZhbHVhdGlvbl9FWENfIgkJOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgUHJveHlJbml0UGFyc2VyTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJhZDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0KLQotICovCi0KLQotCi1wdWJsaWMgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHVibGljIGJvb2xlYW4gaXNTdHJpbmdPYmplY3QgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc3QgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXNzYWdlT3JGaWVsZFN0YXJ0ZWQ7Ci0JCi0vKioKLSAqIFN0YXRlbWVudCBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgU3RhdGVtZW50KENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgewotCXN1cGVyKCk7Ci0JZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgJiYgY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpOwotfQotCi0vKiogRGVmZXIgdGhpcyB0byB0aGUgZXhwcmVzc2lvbgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKCBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICkgewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQl9IGVsc2UgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5nZXRTdHJpbmcoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuU1RBVEVNRU5UX1VORVhQRUNURURfRVhFQ1VUSU9OKSk7CS8vIFRoaXMgaXMgbm90IGFuIGV2YWx1YXRpb24gZXJyb3IsIGl0IHNob3VsZG4ndCBvZiBvY2N1cmVkLCBzbyBpdCBpcyBhIHBhcnNlciBlcnJvci4KLQl9Ci19Ci0vKioKLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKTsKLQkvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5QmFzZVZNTkxTLlJFU0JVTkRMRS5nZXRTdHJpbmcoUHJveHlCYXNlVk1OTFMuU1RBVEVNRU5UX1VORVhQRUNURURfRVZBTFVBVElPTikpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzc05hbWUoKTsKLX0KLS8qKiBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiB0b2tlbiB0aGF0IGNhbiBiZWdpbiBhIHN0YXRlbWVudC4KLSAqICBuZXcgLCAnICcJCQkJCQktCUNyZWF0ZSBhIGNvbnN0cnVjdG9yCi0gKgkxLTEwLCB0cnVlLCBmYWxzZSwgZXRjLi4uCQktCUNyZWF0ZSBhIGxpdGVyYWwKLSAqICBGb28sICAnLicJCQkJCQktCUNyZWF0ZSBhIFR5cGUKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0JCi0JLy8gSWYgbWVzc2FnZU9yRmllbGRTdGFydCBpcyB0cnVlIHRoZW4gb3VyIGV4cHJlc3Npb24gaXMgY29tcGxldGUgYW5kIGVpdGhlciBhIG1lc3NhZ2Ugb3IgZmllbGQgaXMgYmVpbmcgY3JlYXRlZAotCS8vIFNlZSB3aGljaCBpdCBpcyBhbmQgY3JlYXRlIHRoZSBjb3JyZWN0IGV4cHJlc3Npb24KLQlpZiAobWVzc2FnZU9yRmllbGRTdGFydGVkKXsKLQkJbWVzc2FnZU9yRmllbGRTdGFydGVkID0gZmFsc2U7Ci0JCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbil7Ci0JCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShjdXJyZW50RXhwcmVzc2lvbix0b2tlbixmQ2xhc3NMb2FkZXIpOwotCQkJY3VycmVudEV4cHJlc3Npb24gPSBtZXNzYWdlOwotCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCX0gZWxzZSB7IAotCQkJRmllbGQgZmllbGQgPSBuZXcgRmllbGQoY3VycmVudEV4cHJlc3Npb24sdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gZmllbGQ7Ci0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KLQl9CQotCQotCS8vIExvb2sgZm9yICJuZXcgIiBmb3IgYSBjb25zdHJ1Y3RvciIKLQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSAmJiBjb21wYXJlKCB0b2tlbiAsIENvbnN0YW50TmV3ICkgKSB7Ci0JCS8vIElmIHdlIHRob3VnaHQgd2Ugd2VyZSBhIHBvc3NpYmxlIGNhc3QgYW5kIHdlIG5vdyBhcmVuJ3QgdGhlbiB3ZSBtdXN0IGJlIGEgYmxvY2sgZXhwcmVzc2lvbgotCQlpZiAoIGlzQ2FzdCApIHsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IEJsb2NrKG5ldyBDb25zdHJ1Y3RvcihmQ2xhc3NMb2FkZXIpKTsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IENvbnN0cnVjdG9yKGZDbGFzc0xvYWRlcik7Ci0JCX0KLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCQotCS8vIExvb2sgZm9yICJudWxsIiAKLQlpZiAoIGNvbXBhcmUoIHRva2VuICwgQ29uc3RhbnROdWxsICkgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IE51bGxMaXRlcmFsKCk7Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJLy8gTnVsbCBjYW5ub3QgcHJvY2VzcyBhbnl0aGluZyBzbyB3ZSByZXR1cm4gdGhlIHN0YXRlbWVudAotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvLyBMb29rIGZvciBhIG51bWJlcgotCWlmICggaXNOdW1iZXIoIHRva2VuICkgfHwgZGVsaW1pdGVyID09IE9wZXJNaW51cyApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgTnVtYmVyTGl0ZXJhbCgpOwotCQljdXJyZW50RXhwcmVzc2lvbiA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sZGVsaW1pdGVyKTsKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCi0JaWYgKCBjb21wYXJlKCB0b2tlbiAsIENvbnN0YW50VHJ1ZSApICkgewotCQljdXJyZW50RXhwcmVzc2lvbiAgPSBuZXcgQm9vbGVhbkxpdGVyYWwodHJ1ZSk7Ci0JCS8vIHRydWUgY2Fubm90IHByb2Nlc3MgYW55dGhpbmcgc28gd2UgcmV0dXJuIHRoZSBzdGF0ZW1lbnQKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0vLwkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JaWYgKCBjb21wYXJlKCB0b2tlbiAsIENvbnN0YW50RmFsc2UgKSApIHsKLQkJLy8gZmFsc2UgY2Fubm90IHByb2Nlc3MgYW55dGhpbmcgc28gd2UgcmV0dXJuIHRoZSBzdGF0ZW1lbnQKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQm9vbGVhbkxpdGVyYWwoZmFsc2UpOwotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RyaW5nTGl0ZXJhbCgpOwotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsJCQotCX0KLQkKLQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQ2hhckxpdGVyYWwoKTsKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247CQkKLQl9CQotCQotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICYmIHRva2VuLmxlbmd0aCA9PSAwICYmIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwpewotCQlpZiAoY3VycmVudEV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKXsKLQkJCS8vU3RyaW5nIHMgPSAiXCIiICsgKFN0cmluZykoY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKSkgKyAiXCIiIDsKLQkJCS8vcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihzKTsKLQkJCWlzU3RyaW5nT2JqZWN0ID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQotCQotCWlmIChpc1N0cmluZ09iamVjdCAmJiAodG9rZW4ubGVuZ3RoID4gMCkgJiYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pKXsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlKGN1cnJlbnRFeHByZXNzaW9uLCB0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvL2hhbmRsZSB0eXBlIGNhc3RpbmcKLQlpZiAoKHRva2VuLmxlbmd0aCA9PSAwKSAmJiAoZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbikpewotCQkvLyBJZiB3ZSBhcmUgYSBhbHJlYWR5IGEgY2FzdCB0aGVuIHdlIG11c3QgYmUgYSBibG9jay4KLQkJaWYgKCBpc0Nhc3QgKSB7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBCbG9jayhmQ2xhc3NMb2FkZXIpOwotCQl9IGVsc2UgewotCQkJaXNDYXN0ID0gdHJ1ZTsJLy8gUG9zc2libHkgYSBjYXN0Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQkKLQlpZiAoaXNDYXN0ICYmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiB8fCB0b2tlbi5sZW5ndGggIT0gMCkpewotCQlTdGF0aWMgYVN0YXRpYyA9IG5ldyBTdGF0aWMoZkNsYXNzTG9hZGVyKTsKLQkJQ2FzdCBhQ2FzdCA9IG5ldyBDYXN0KGFTdGF0aWMsZkNsYXNzTG9hZGVyKTsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBhQ2FzdC5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0JCi0JaWYgKCB0b2tlbi5sZW5ndGggIT0gMCApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RhdGljKGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbixkZWxpbWl0ZXIpOwotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCQotCS8vIElmIHdlIGdldCBhIHsgdGhlbiB3ZSBhcmUgcGFydCBvZiBhbiBhcnJheSBhcmd1bWVudAotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlbkVsaXBzZSl7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IEFycmF5QXJndW1lbnRzKCk7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLy8gSWYgb3VyIGV4cHJlc3Npb24gaXMgY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgLiB3ZSBhcmUgZWl0aGVyIGEgbWVzc2FnZSBvciBhIGZpZWxkLiAgV2Ugd29uJ3Qga25vdyB0aGlzIHVudGlsCi0JLy8gdGhlIG5leHQgdG9rZW4gd2UgcmVjZWl2ZSwgd2hpY2ggd2lsbCBiZSBlaXRoZXIgYmUgZGVsaW1pdGVkIGJ5IGEgKCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgbWVzc2FnZSwgZWxzZSBpdCBpcyBhIGZpZWxkCi0JaWYgKGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgJiYgY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICYmIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QpewotCQltZXNzYWdlT3JGaWVsZFN0YXJ0ZWQgPSB0cnVlOwotCX0KLQkJCi0JcmV0dXJuIHRoaXM7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoIlN0YXRlbWVudHsiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJYnVmZmVyLmFwcGVuZChjdXJyZW50RXhwcmVzc2lvbi50b1N0cmluZygpKTsKLQl9Ci0JYnVmZmVyLmFwcGVuZCgnfScpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLS8qKgotICogSXMgdGhpcyBzdGF0ZW1lbnQgYSBwcmltaXRpdmUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKCBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICkgewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uaXNQcmltaXRpdmUoKTsKLQl9IGVsc2UgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5nZXRTdHJpbmcoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuU1RBVEVNRU5UX1VORVhQRUNURURfRVhFQ1VUSU9OKSk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdGF0aWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NWI3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBIYXNoTWFwIHNQcmltaXRpdmVUeXBlczsKLQkKLQlzdGF0aWMgewotCQlzUHJpbWl0aXZlVHlwZXMgPSBuZXcgSGFzaE1hcCgxMCk7Ci0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImJ5dGUiLCBCeXRlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImNoYXIiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJc1ByaW1pdGl2ZVR5cGVzLnB1dCgic2hvcnQiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJpbnQiLCBJbnRlZ2VyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImxvbmciLCBMb25nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoImZsb2F0IiwgRmxvYXQuVFlQRSk7CQkgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJkb3VibGUiLCBEb3VibGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGFycmF5RGltZW5zaW9uczsKLQlwcm90ZWN0ZWQgTGlzdCBmQXJyYXlBcmd1bWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1dyaXRlciB0eXBlV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCXByb3RlY3RlZCBib29sZWFuIGNvbXBsZXRlZFdpdGhQZXJpb2QgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgY2hhcltdIGNvbXBsZXRpb25Ub2tlbjsKLQlwdWJsaWMgQ2xhc3MgdHlwZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlOwotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb247Ci0vKioKLSAqIENyZWF0ZSBhbiB1bmtub3duIGV4cHJlc3Npb24KLSAqLwotcHVibGljIFN0YXRpYyhDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLX0KLXB1YmxpYyBTdGF0aWMoY2hhcltdIGFUb2tlbixjaGFyIGRlbGltaXRlcixDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCQotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsKLQl0cnkgeyAKLQkJdHlwZVdyaXRlci53cml0ZShhVG9rZW4pOwotCX0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBleGMgKSB7fTsKLQljaGVja0ZvclZhbGlkVHlwZSgpOwotCWlmICggdHlwZSA9PSBudWxsICYmIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgKXsKLQkJdHlwZVdyaXRlci53cml0ZShEZWxpbWl0ZXJQZXJpb2QpOwotCX0KLQkJCi19Ci1wdWJsaWMgU3RhdGljKGNoYXJbXSBhVG9rZW4sY2hhciBkZWxpbWl0ZXIsQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyLGJvb2xlYW4gaXNBcnJheSl7Ci0JdGhpcyhhVG9rZW4sZGVsaW1pdGVyLGFDbGFzc0xvYWRlcik7Ci0JaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gPSB0cnVlOwotCWFycmF5RGltZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JYXJyYXlEaW1lbnNpb25zLmFkZChuZXcgU3RhdGVtZW50KGFDbGFzc0xvYWRlcikpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0FycmF5KCl7Ci0JcmV0dXJuIGFycmF5RGltZW5zaW9ucyAhPSBudWxsOwotfQotLyoqCi0gKiBTZWUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhIHZhbGlkIHR5cGUKLSAqIFRoaXMgdXNlcyB0aGUgY2xhc3MgbG9hZGVyIGdpdmVuIHRvIHVzIGlmIG9uZSBzcGVjaWZpZWQuICBUaGUgcmVhc29uIGZvciB0aGlzCi0gKiBpcyB0aGF0IEVjbGlwc2UgdXNlcyBhIHNwZWNpYWwgcGx1Z2luIGNsYXNzIGxvYWRlciBhbmQgd2hlbiB3ZSBhcmUgcnVubmluZwotICogaW4gYSBWTSBpbnNpZGUgZWNsaXBzZSAoIGUuZy4gZm9yIElERVZNIHByb3h5IHN0dWZmICkgd2UgbXVzdCBoYXZlCi0gKiByZWZlcmVuY2UgdG8gdGhlIHBsdWdpbiB0aGF0IGlzIHVzaW5nIHVzIG90aGVyd2lzZSB3ZSBjYW4ndCBsb2FkIGl0cyBjbGFzc2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yVmFsaWRUeXBlKCl7Ci0KLQl0eXBlID0gKENsYXNzKSBzUHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0JaWYgKHR5cGUgPT0gbnVsbCkKLQkJdHJ5IHsKLQkJCWlmICggZkNsYXNzTG9hZGVyID09IG51bGwgKSB7Ci0JCQkJdHlwZSA9IENsYXNzLmZvck5hbWUodHlwZVdyaXRlci50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZSA9IGZDbGFzc0xvYWRlci5sb2FkQ2xhc3ModHlwZVdyaXRlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjICkgewotCQkJdHJ5IHsKLQkJCQl0eXBlID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLiIgKyB0eXBlV3JpdGVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQl3cml0ZXIud3JpdGUodHlwZS5nZXROYW1lKCkpOwotCQkJCXR5cGVXcml0ZXIgPSB3cml0ZXI7Ci0JCQl9IGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMxICkge30KLQkJfSBjYXRjaCAoIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4YyApIHsKLQkJCS8vIEEgbWlzbWF0Y2ggaW4gc29tZSB3YXkuIEZvdW5kIGEgY2xhc3MsIHByb2JhYmx5IGRpZmZlcmVudCBjYXNlLiBPbmUgcG9zc2liaWxpdHkKLQkJCS8vIGlzIGZvdW5kIGEgY2xhc3MsIGJ1dCB0aGlzIHdhcyByZWFsbHkgYSBwYWNrYWdlLiBTbyBjbGFzcyBhbmQgcGFja2FnZSB3aXRoIHNhbWUgbmFtZQotCQkJLy8gYnV0IGRpZmZlcmVudCBjYXNlIGNhdXNlZCB0aGlzIHRvIG9jY3VyLiBbNDYzNzZdLgotCQl9Ci0JCi19Ci0vKioKLSAqIElmIHdlIGhhdmUgYW55IHN0YXRpYyBtZXRob2RzIHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlbSBhZ2FpbnN0IHRoZSB0eXBlCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0KLQkvLyBJZiB3ZSBhcmUgYW4gYXJyYXkgYnV0IGhhdmVuJ3QgY3JlYXRlZCBpdCBkbyBzbwotCWlmICggaXNBcnJheSgpICkgewotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQlldmFsdWF0ZUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0gZWxzZSB7Ci0JCWlmICggdHlwZSAhPSBudWxsICkgeyAKLQkJCXJldHVybiB0eXBlOwotCQl9IGVsc2UgeyAKLQkJCS8vIElmIHdlIGhhdmUgbm8gdHlwZSB0aGVuIHdlIGFyZSBzb21lIGtpbmQgaW5jb21wbGV0ZSBleHByZXNzaW9uIHRoYXQgY2Fubm90IGJlIGV2YWx1dGVkCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUaGUgdHlwZSBvZiB1cyBpcyBlaXRoZXIgc2ltcGx5IHRoZSBjbGFzcywgb3IgaWYgd2UgYXJlIGFuIGFycmF5IHRoZW4gd2UgbXVzdCBjcmVhdGUgdGhlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ci0gKiB1c2luZyB0aGUgcmVmbGVjdGl2ZSBBUElzCi0gKi8KLXByb3RlY3RlZCBPYmplY3QgYXJyYXk7Ci1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCi0JaWYgKCBpc0FycmF5KCkgKSB7Ci0JCWlmICggYXJyYXkgPT0gbnVsbCApIHsKLQkJCS8vIERvIG5vdCBldmFsdWF0ZSB0aGUgYXJyYXkgYW5kIHJldHVybiBpdHMgY2xhc3MuICBJbnN0ZWFkIGp1c3Qgd29yayBvdXQgdGhlIGNsYXNzIGJ5IG91ciB0eXBlCi0JCQkvLyBhbmQgbnVtYmVyIG9mIGRpbWVuc2lvbnMKLQkJCU9iamVjdCByZXN1bHQgPSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLGdldE51bWJlck9mRGltZW5zaW9ucygpKTsKLQkJCXJldHVybiByZXN1bHQuZ2V0Q2xhc3MoKTsKLQkJfSBlbHNlIHsgCi0JCQlyZXR1cm4gYXJyYXkuZ2V0Q2xhc3MoKTsKLQkJfQotCX0gZWxzZSB7IAotCQlyZXR1cm4gdHlwZTsKLQl9Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gdHlwZVdyaXRlci50b1N0cmluZygpOwotfQotcHVibGljIENsYXNzIGdldFByaW1pdGl2ZVR5cGVDbGFzcygpewotCXJldHVybiB0eXBlOwotfQotcHJvdGVjdGVkIGludFtdIGdldE51bWJlck9mRGltZW5zaW9ucygpewotCUxpc3QgZGltZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JZGltZW5zaW9ucy5hZGQobmV3IEludGVnZXIoZkFycmF5QXJndW1lbnRzLnNpemUoKSkpOwotCSgoTWVzc2FnZUFyZ3VtZW50KWZBcnJheUFyZ3VtZW50cy5nZXQoMCkpLmNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihkaW1lbnNpb25zKTsKLQkvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBhIHNldCBvZiBJbnRlZ2VyIG9iamVjdHMgaW4gdGhlIGRpbWVuc2lvbnMgbGlzdAotCS8vIGNvbnZlcnQgdGhpcyB0byBhbiBpbnRbXQotCWludFtdIGludERpbWVuc2lvbnMgPSBuZXcgaW50W2RpbWVuc2lvbnMuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJaW50RGltZW5zaW9uc1tpXSA9ICgoSW50ZWdlcilkaW1lbnNpb25zLmdldChpKSkuaW50VmFsdWUoKTsKLQl9Ci0JcmV0dXJuIGludERpbWVuc2lvbnM7Ci19Ci0vKioKLSAqIEV2YWx1YXRlIHRoZSBhcnJheQotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUFycmF5KCl7Ci0JaWYgKCBmQXJyYXlBcmd1bWVudHMgIT0gbnVsbCApIHsgCi0JCS8vIElmIHRoZSBhcnJheSBpc24ndCBkZWNsYXJlZCB3aXRoIGEgc2l6ZSBidXQgdGhpcyBpcyBzdXBwbGllZCB3aXRoIGFyZ3VtZW50IHRoZXNlIHdpbGwgYmUgaW4gdGhlIGZBcnJheUFyZ3VtZW50cwotCQkvLyBuZXcgaW50W10geyAyICwzIH0gd2lsbCBoYXZlIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgc3VwcGxpZWQgYXMgdHdvIG1lc3NhZ2UgYXJndW1lbnRzIHdpdGggCi0JCWlmICggYXJyYXkgPT0gbnVsbCApIHsKLQkJCS8vIFRoZSBzaXplIG9mIHRoZSBhcnJheSBhcmd1bWVudHMgaXMgb3VyIGFycmF5IHNpemUsIGhvd2V2ZXIgZm9yIGEgbXVsdGkgYXJnIGFycmF5IHdlIG5lZWQKLQkJCS8vIHRvIGZpbmQgdGhlIHNpemUgb2YgYW55IG5lc3RlZCBhcnJheXMgd2l0aGluIGFyZ3VtZW50cyB0aGVtc2VsdmVzLCBlLmcuIAotCQkJLy8gbmV3IGludFtdW10geyB7MiwzfSAsIHszLDR9IH0gdGhlbiB3ZSBoYXZlIHR3byBhcnJheSBhcmd1bWVudHMsIGVhY2ggb2Ygd2hpY2ggaXMgYSBNZXNzYWdlQXJndW1lbnQKLQkJCS8vIHdob3NlIHN0YXRlbWVudCBpcyBhbiBBcnJheUFyZ3VtZW50cyB0aGF0IGhhcyB0d28gYXJndW1lbnRzLCBldGMuLi4KLQkJCS8vIFRvIGZpbmQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgd2UgY3JlYXRlIGEgbGlzdCB0aGF0IHdlIGFkZCBvdXIgbnVtYmVyIG9mIGFyZ3VtZW50cyB0bywgYW5kIHRoZW4KLQkJCS8vIHBhc3MgdGhpcyBhbGwgdGhlIHdheSB1cCB0aGUgYXJndW1lbnRzIGNoYWluIHVzaW5nIGNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihMaXN0KSBzbyB0aGF0IGVhY2ggZWxlbWVudAotCQkJLy8gY2FuIGFkZCB0byB0aGUgbGlzdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIGlmIGFueSApIHRoYXQgdGhleSBoYXZlLiAgCi0JCQlhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKHR5cGUsZ2V0TnVtYmVyT2ZEaW1lbnNpb25zKCkpOwotCQkJLy8gU2V0IHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgdG8gYmUgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkFycmF5QXJndW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pZkFycmF5QXJndW1lbnRzLmdldChpKTsKLQkJCQl0cnkgewkKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBleHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCQkJCUFycmF5LnNldChhcnJheSxpLGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gZXhjICkgewotCQkJCQkvLyBBbnkgZXZhbHVhdGlvbiBleGNlcHRpb25zIHNob3VsZCBiZSB0aHJvd24gYmFjawotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoIGFycmF5RGltZW5zaW9ucyAhPSBudWxsICkgewotCQkvLyBUbyBnZXQgdGhlIGNsYXNzIG9mIGEgcmVmbGVjdGl2ZSBhcnJheSB3ZSBtdXN0IGFjdHVhbGx5IGZpcnN0IGNyZWF0ZSBpdCBhbmQgdGhlbiBhc2sgaXQgZm9yIGl0cyBjbGFzcwotCQkvLyBUaGUgYXJyYXkgRGltZW5zaW9ucyBhcmUgcHJlc2VudCBpZiB0aGUgYXJyYXkgd2FzIGV4cGxpY2l0bHkgZGVjbGFyZWQgd2l0aCBhIHNpemUsIGUuZy4gbmV3IGludFsyXVszXQotCQkvLyB3aWxsIGhhdmUgdG8gYXJyYXlEaW1lbnNpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBleHByZXNzaW9ucyAyIGFuZCAzICggYXMgTnVtYmVyTGl0ZXJhbCBpbnN0YW5jZXMgKQotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQkvLyBFdmFsdWF0ZSBhbGwgb2YgdGhlIGFycmF5RGltZW5zaW9ucy4gIFRoZXNlIHNob3VsZCBiZSBpbnRlZ2VycwotCQkJaW50W10gZGltZW5zaW9uU2l6ZXMgPSBuZXcgaW50W2FycmF5RGltZW5zaW9ucy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25TaXplcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7IAotCQkJCQlJbnRlZ2VyIGRpbWVuc2lvblNpemUgPSAoSW50ZWdlcikgKChFeHByZXNzaW9uKWFycmF5RGltZW5zaW9ucy5nZXQoaSkpLmV2YWx1YXRlKCk7Ci0JCQkJCWRpbWVuc2lvblNpemVzW2ldID0gZGltZW5zaW9uU2l6ZS5pbnRWYWx1ZSgpOwotCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gZXhjICkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEZvciBhIG11bHRpIGFyZyBhcnJheSB3ZSBuZWVkIHRvIGNyZWF0ZSB1c2luZyB0aGUgc3RhdGljIG1ldGhvZCBvbiBhcnJheSB0aGF0IHRha2VzIGFuIGludFtdIHRoYXQgcmVwcmVzZW50cwotCQkJLy8gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLCBlLmcuIGZvciBuZXcgU3RyaW5nWzJdWzNdIHdlIGRvIEFycmF5Lm5ld0luc3RhbmNlKFN0cmluZy5jbGFzcyxuZXcgaW50W10geyAyICwgMyB9OwotCQkJYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLGRpbWVuc2lvblNpemVzKTsKLQkJfQotCX0KLX0KLS8qKgotICogSWYgdGhlIHRva2VuIGlzIGEgcGVyaW9kIHRoZW4gaXQgY291bGQgZWl0aGVyIGJlIHBhcnQgb2YgdGhlIHR5cGUgb3IgZWxzZSBhIHN0YXRpYyBtZXRob2QgY2FsbAotICovCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgZGVsaW1pdGVyICkgewotCi0JLy8gSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSB2YWxpZCB0eXBlIHRoZW4gc2VlIGlmIHdlIG5vdyBkbwotCWlmICh0eXBlID09IG51bGwpewotCQl0cnkgeyAKLQkJCXR5cGVXcml0ZXIud3JpdGUodG9rZW4pOwotCQl9IGNhdGNoICggSU9FeGNlcHRpb24gZXhjICkge307Ci0JCWNoZWNrRm9yVmFsaWRUeXBlKCk7Ci0JCS8vIElmIHdlIGdvdCBhIHZhbGlkIHR5cGUgYW5kIGEgcGVyaW9kIHRoZW4gcmVtZW1iZXIgaXQKLQkJaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICkgewotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbXBsZXRlZFdpdGhQZXJpb2QgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JaWYgKCBhcnJheURpbWVuc2lvbnMgIT0gbnVsbCAmJiBpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiApIHsKLQkJRXhwcmVzc2lvbiBsYXN0QXJyYXlEaW1lbnNpb24gPSAoRXhwcmVzc2lvbilhcnJheURpbWVuc2lvbnMuZ2V0KGFycmF5RGltZW5zaW9ucy5zaXplKCktMSk7Ci0JCWxhc3RBcnJheURpbWVuc2lvbi5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlU3F1YXJlQnJhY2UgJiYgaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gKSB7Ci0JCQlpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2UgJiYgIWlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uICkgewotCQlpZiAoIGFycmF5RGltZW5zaW9ucyA9PSBudWxsICkgYXJyYXlEaW1lbnNpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKTsKLQkJYXJyYXlEaW1lbnNpb25zLmFkZChzdGF0ZW1lbnQpOwotCQlpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiA9IHRydWU7Ci0JCXJldHVybiB0aGlzOwkJCi0JfQotCQotCS8vIElmIHdlIGhhdmUgYSB0eXBlIGFuZCB0aGUgZGVsaW1pdGVyIGlzIGEgKCB0aGVuIGl0IG11c3QgYmUgYSBtZXNzYWdlIGJlZ2lubmluZwotCWlmICggdHlwZSAhPSBudWxsICkgewotCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbikgewotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gbmV3IE1lc3NhZ2UoIHRoaXMgLCB0b2tlbiAsIGZDbGFzc0xvYWRlciApOwotCQl9IGVsc2UgaWYgKGNvbXBsZXRlZFdpdGhQZXJpb2QpewotCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZCh0aGlzLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQkvLyBJZiBvdXIgdG9rZW4gaXMgYSApLCAnICcgb3IgLCB0aGVuIHRoZSBmaWVsZCBpcyBjb21wbGV0ZWQsCi0JCQkvLyBvdGhlcndpc2UgbGVhdmUgaXQgb3BlbiBzbyBpdCB3aWxsIHByb2Nlc3MgdGhlIHJlbWFpbmluZyB0b2tlbnMKLS8vCQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpIHsKLQkJCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpIHsKLQkJCQlmaWVsZC5pc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmaWVsZDsKLQkJfQotCX0KLQkJCQotCS8vIFdlIGFyZSBzdGlsbCBsb29raW5nIGZvciBhIHR5cGUgc28gYXBwZW5kIGEgLgotCWlmICggdHlwZSA9PSBudWxsICkgewotCQl0eXBlV3JpdGVyLndyaXRlKCcuJyk7Ci0JfQotCXJldHVybiB0aGlzOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIlN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICggdHlwZSA9PSBudWxsICkgeyAKLQkJd3JpdGVyLndyaXRlKCIoSW5jb21wbGV0ZSkgeyIpOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIHsKLQkJd3JpdGVyLndyaXRlKCIoQ29tcGxldGUpIHsiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUodHlwZVdyaXRlci50b1N0cmluZygpKTsKLQl3cml0ZXIud3JpdGUoIn0iKTsgLy8kTk9OLU5MUy0xJAotCWlmICggYXJyYXlEaW1lbnNpb25zICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiIGFycmF5IGRpbWVuc2lvbnM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGFycmF5RGltZW5zaW9ucy5zaXplKCkpLnRvU3RyaW5nKCkpOwotCX0KLQlpZiAoIGZBcnJheUFyZ3VtZW50cyAhPSBudWxsICkgewkKLQkJd3JpdGVyLndyaXRlKCIgYXJyYXkgZGltZW5zaW9ucz0iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUobmV3IEludGVnZXIoZkFycmF5QXJndW1lbnRzLnNpemUoKSkudG9TdHJpbmcoKSk7Ci0JfQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEFycmF5QXJndW1lbnRzKExpc3QgYXJndW1lbnRzKSB7Ci0JZkFycmF5QXJndW1lbnRzID0gYXJndW1lbnRzOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0cmluZ0xpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNzNkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0cmluZ0xpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLQotCi0gKi8KLQotCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFc2NhcGVkID0gZmFsc2U7Ci0KLS8qKgotICogY29uc3RydWN0b3IKLSAqLwotcHVibGljIFN0cmluZ0xpdGVyYWwoKXsKLX0KLQkKLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0JcmV0dXJuIHZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLS8qKgotICogV2UgbXVzdCBldmFsdWF0ZSBvdXJzZWxmIGFuZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotICovCi0gCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCXJldHVybiBTdHJpbmcuY2xhc3M7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gU3RyaW5nLmNsYXNzLmdldE5hbWUoKTsKLX0KLQotLyoqCi0gKlRoaXMgc3RyaW5nIG1pZ2h0IGJlIGJyb2tlbiBpbnRvIGEgZmV3IHRva2VucwotICpzbyB3ZSBuZWVkIGEgU3RyaW5nQnVmZmVyLgotICogCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCWludCBhcHBlbmRUb2tlblN0YXJ0ID0gMDsKLQlpbnQgYXBwZW5kVG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7Ci0JaWYgKGlzRXNjYXBlZCkgewotCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJaWYgKHRva2VuLmxlbmd0aCAhPSAwKSB7Ci0JCQljaGFyIGMgPSB0b2tlblswXTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ2InOgotCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoJ1xiJyk7Ci0JCQkJCWFwcGVuZFRva2VuU3RhcnQgPSAxOwotCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICd0JzoKLQkJCQkJdmFsdWVCdWZmZXIuYXBwZW5kKCdcdCcpOwotCQkJCQlhcHBlbmRUb2tlblN0YXJ0ID0gMTsKLQkJCQkJYXBwZW5kVG9rZW5MZW5ndGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnbic6Ci0JCQkJCXZhbHVlQnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCQkJYXBwZW5kVG9rZW5TdGFydCA9IDE7Ci0JCQkJCWFwcGVuZFRva2VuTGVuZ3RoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ3InOgotCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoJ1xyJyk7Ci0JCQkJCWFwcGVuZFRva2VuU3RhcnQgPSAxOwotCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICd1JzoKLQkJCQkJLy8gVW5pY29kZSwgbmV4dCBmb3VyIGdhdGhlciBmb3IgdGV4dDsKLQkJCQkJaWYgKGFwcGVuZFRva2VuTGVuZ3RoPj01KSB7Ci0JCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyh0b2tlbiwgMSwgNCksIDE2KSk7Ci0JCQkJCQlhcHBlbmRUb2tlblN0YXJ0PTU7Ci0JCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC09NTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIElmIHdlIGRpZG4ndCBhcHBlbmQgYW55dGhpbmcsIHRoZW4gbm90IGEgdHJ1ZSBlc2NhcGUsIHNvIHB1dCB0aGUgZXNjYXBlIG9uLgotCQkJaWYgKGFwcGVuZFRva2VuU3RhcnQ9PTApCi0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKERlbGltaXRlckVzY2FwZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJFc2NhcGUgfHwgZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlKQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwkvLyBJdCB3YXMgYSB0cnVlIGVzY2FwZS4KLQkJCWVsc2UgewotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwkvLyBJZiB3YXNuJ3QgYSB0cnVlIGVzY2FwZQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCi0JaWYgKGFwcGVuZFRva2VuTGVuZ3RoID4gMCkKLQkJdmFsdWVCdWZmZXIuYXBwZW5kKHRva2VuLCBhcHBlbmRUb2tlblN0YXJ0LCBhcHBlbmRUb2tlbkxlbmd0aCk7Ci0JCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSl7CQkKLQkJaXNDb21wbGV0ZSA9dHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIElmIHRoZSBkZWxpbWl0ZXIgaXMgYW4gZXNjYXBlIGNoYXJhY3RlciByZW1lbWJlciBpdCBzbyB3ZSBjYW4gZXNjYXBlCi0JLy8gdGhlIG5leHQgdG9rZW4sIG90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGxpdGVyYWwKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlckVzY2FwZSApewotCQlpc0VzY2FwZWQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCX0KLQlyZXR1cm4gdGhpczsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGFyZSBub3QgcHJpbWl0aXZlcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZCgiU3RyaW5nKFwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHZhbHVlQnVmZmVyICE9IG51bGwgKSB7Ci0JCWJ1ZmZlci5hcHBlbmQodmFsdWVCdWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTY5MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvbWVzc2FnZXMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJAotIwotCi0KLSMKLSMgUHJvcGVydGllcyBmb3IgdGhlIFByb3h5IEJhc2UgVk0gU3VwcG9ydAotIwotVW5leHBlY3RlZFRva2VuX0VYQ18gICAgICAgICAgICAgICAgPSBJV0FWMDEyN0UgVW5leHBlY3RlZCBUb2tlbiAiezB9Ii4KLVN0YXRlbWVudC5VbmV4cGVjdGVkRXhlY3V0aW9uX0VYQ18gID0gSVdBVjAxMjhFIFN0YXRlbWVudCB3YXMgZXhlY3V0ZWQgdW5leHBlY3RlZGx5LgotU3RhdGVtZW50LlVuZXhwZWN0ZWRFdmFsdWF0aW9uX0VYQ18gPSBJV0FWMDEyOUUgU3RhdGVtZW50cyBzaG91bGQgbm90IGJlIGV2YWx1YXRlZC4KLUNoYXJUb29Db21wbGljYXRlZF9FWENfICAgICAgICAgICAgID0gSVdBVjAxMzBFIElucHV0IHRleHQgbm90IGEgY2hhciB0aGF0IGNhbiBiZSBldmFsdWF0ZWQuIFRvbyBjb21wbGljYXRlZC4gXCJ7MH0iCi1QcmltaXRpdmVPcGVyYXRpb24uRXZhbHVhdGUuSW52YWxpZE9wZXJhdG9yX0VYQ189SW52YWxpZCBvcGVyYXRvciB7MH0gYmV0d2VlbiB7MX0gYW5kIHsyfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0Fic3RyYWN0RW51bS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0Fic3RyYWN0RW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFlNzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BYnN0cmFjdEVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEJhc2UgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVudW0uCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW51bSBpbXBsZW1lbnRzIEVudW0gewotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbml0aWFsaXplZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRW51bS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0VudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYTYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogVHlwZVNhZmUgZW51bWVyYXRpb25zIGZvciB0aGUgSUV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW51bSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUuCi0JICovCi0JaW50IGdldFZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0V4cHJlc3Npb25Qcm9jZXNzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9FeHByZXNzaW9uUHJvY2Vzc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTUzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0V4cHJlc3Npb25Qcm9jZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLkluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcjsKLSAKLS8qKgotICogRXhwcmVzc2lvbiBwcm9jZXNzaW5nLiBUaGlzIGRvZXMgdGhlIGFjdHVhbCBleHByZXNzaW9uIHByb2Nlc3Npbmcgd2l0aCB0aGUgbGl2ZSBvYmplY3RzLgotICogSXQgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBvbmx5IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBleHByZXNzaW9uIHR5cGVzLiBBbGwgb2YgdGhlCi0gKiBjdXJyZW50IGV4cHJlc3Npb25zIGNhbm5vdCBiZSBvdmVycmlkZGVuLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHN0YWNrIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIAotICogY2FsbCBvcmRlci4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uUHJvY2Vzc2VyIHsKLQotCS8qKgotCSAqIEEgdmFyaWFibGUgcmVmZXJlbmNlIGZvciBhIGZpZWxkIGFjY2Vzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEZpZWxkQWNjZXNzUmVmZXJlbmNlIGV4dGVuZHMgVmFyaWFibGVSZWZlcmVuY2UgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVjZWl2ZXI7Ci0KLQkJLyoqCi0JCSAqIFVzZSB0aGlzIHRvIGNvbnN0cnVjdCBhIEZpZWxkQWNjZXNzUmVmZXJlbmNlLiBUaGlzIHdpbGwgZG8gY2hlY2tzIHRvIG1ha2Ugc3VyZQotCQkgKiBpdCBpcyB2YWxpZCBzbyB0aGF0IGV4Y2VwdGlvbnMgd29uJ3QgYmUgdGhyb3duIGxhdGVyIHdoZW4gYWN0dWFsbHkgZGVyZWZlcmVuY2VkLgotCQkgKiAKLQkJICogQHBhcmFtIGZpZWxkCi0JCSAqIEBwYXJhbSByZWNlaXZlcgotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmllbGRBY2Nlc3NSZWZlcmVuY2UgY3JlYXRlRmllbGRBY2Nlc3NSZWZlcmVuY2UoRmllbGQgZmllbGQsIE9iamVjdCByZWNlaXZlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQkvLyBJZiBzdGF0aWMsIHRoZW4gcmVjZWl2ZXIgaXMgaWdub3JlZC4KLQkJCWlmICghTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJaWYgKCFmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmlzSW5zdGFuY2UocmVjZWl2ZXIpKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkNyZWF0ZUZpZWxkQWNjZXNzUmVmZXJlbmNlLkZpZWxkc1R5cGVzTm90TWF0Y2hpbmdfRVhDXyIpLCBuZXcgT2JqZWN0W117ZmllbGQuZ2V0VHlwZSgpLCAocmVjZWl2ZXIhPW51bGwgPyByZWNlaXZlci5nZXRDbGFzcygpIDogbnVsbCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CS8vIE1ha2UgaXQgYWx3YXlzIGFjY2Vzc2libGUuIFRydXN0IGl0LiAKLQkJCXJldHVybiBuZXcgRmllbGRBY2Nlc3NSZWZlcmVuY2UoZmllbGQsIHJlY2VpdmVyKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIEZpZWxkQWNjZXNzUmVmZXJlbmNlKEZpZWxkIGZpZWxkLCBPYmplY3QgcmVjZWl2ZXIpIHsKLQkJCXRoaXMuZmllbGQgPSBmaWVsZDsKLQkJCXRoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkV4cHJlc3Npb25Qcm9jZXNzZXIuVmFyaWFibGVSZWZlcmVuY2UjZGVyZWZlcmVuY2UoKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZXJlZmVyZW5jZSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZpZWxkLmdldChyZWNlaXZlcik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIFNob3VsZG4ndCBvY2N1ci4gQWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMuCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIFNob3VsZG4ndCBvY2N1ci4gQWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMuCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRXhwcmVzc2lvblByb2Nlc3Nlci5WYXJpYWJsZVJlZmVyZW5jZSNzZXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBzZXQoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQkJCWZpZWxkLnNldChyZWNlaXZlciwgdmFsdWUpOwotCQkJcmV0dXJuIGZpZWxkLmdldChyZWNlaXZlcik7CS8vIEp1c3QgaW4gY2FzZSBzb21lIGNvbnZlcnNpb24gaGFwcGVuZWQuIFRlY2huaWNhbGx5IGl0IGlzIG5vdCB0aGUgdmFsdWUgc2V0IGJ1dCB0aGUgcmV0cmlldmVkIHdoZW4gaW4gYW4gYXNzaWdubWVudC4KLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkZpZWxkQWNjZXNzeyIrZmllbGQudG9TdHJpbmcoKSsifSBvbiAiKyhyZWNlaXZlciAhPSBudWxsID8gcmVjZWl2ZXIudG9TdHJpbmcoKSA6ICI8c3RhdGljIGFjY2Vzcz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBIHZhcmlhYmxlIHJlZmVyZW5jZSBmb3IgYW4gQXJyYXkgYWNjZXNzLiBJdCB3aWxsIHJlZmVyZW5jZSBvbmx5IHRoZSBsYXN0IGluZGV4ZWQgZW50cnkgb2YgdGhlIGFycmF5LgotCSAqIEZvciBleGFtcGxlIGlmIDxjb2RlPnhbM11bNF08L2NvZGU+IGlzIHRoZSBhY2Nlc3MsIHRoZW4gd2hhdCB3aWxsIGJlIGdpdmVuIHRvIHRoaXMgcmVmZXJlbmNlIHdpbGwgYmUKLQkgKiB0aGUgYXJyYXkgZW50cnkgYXQgeFszXVs0XSwgbm90IHRoZSB4IGFycmF5IGl0c2VsZi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFycmF5QWNjZXNzUmVmZXJlbmNlIGV4dGVuZHMgVmFyaWFibGVSZWZlcmVuY2UgewotCQkKLQkJCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0IGFycmF5OwotCQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCQkvKioKLQkJICogVXNlIHRoaXMgdG8gY29uc3RydWN0IGFuIGFycmF5IGFjY2VzcyByZWZlcmVuY2UuIFRoaXMgd2lsbCBkbyBjaGVja3MgdG8gbWFrZSBzdXJlCi0JCSAqIGl0IGlzIHZhbGlkIHNvIHRoYXQgZXhjZXB0aW9ucyB3b24ndCBiZSB0aHJvd24gbGF0ZXIgd2hlbiBhY3R1YWxseSBkZXJlZmVyZW5jZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gYXJyYXkKLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBcnJheUFjY2Vzc1JlZmVyZW5jZSBjcmVhdGVBcnJheUFjY2Vzc1JlZmVyZW5jZShPYmplY3QgYXJyYXksIGludCBpbmRleCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKLQkJCWludCBsZW4gPSBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOwotCQkJaWYgKGluZGV4IDwgMCB8fCBsZW4gPD0gaW5kZXgpCi0JCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVBcnJheUFjY2Vzc1JlZmVyZW5jZS5PdXRPZkJvdW5kc19FWENfIiksIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihpbmRleCksIG5ldyBJbnRlZ2VyKGxlbil9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgQXJyYXlBY2Nlc3NSZWZlcmVuY2UoYXJyYXksIGluZGV4KTsKLQkJfQotCQkvKioKLQkJICogQ29uc3RydWN0IHRoZSByZWZlcmVuY2Ugd2l0aCB0aGUgYXJyYXkgYW5kIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgYmVpbmcgcmVmZXJlbmNlZC4KLQkJICogQHBhcmFtIGFycmF5Ci0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgQXJyYXlBY2Nlc3NSZWZlcmVuY2UoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuYXJyYXkgPSBhcnJheTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLlZhcmlhYmxlUmVmZXJlbmNlI2RlcmVmZXJlbmNlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZGVyZWZlcmVuY2UoKSB7Ci0JCQlyZXR1cm4gQXJyYXkuZ2V0KGFycmF5LCBpbmRleCk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5WYXJpYWJsZVJlZmVyZW5jZSNzZXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBzZXQoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCUFycmF5LnNldChhcnJheSwgaW5kZXgsIHZhbHVlKTsKLQkJCXJldHVybiBBcnJheS5nZXQoYXJyYXksIGluZGV4KTsJLy8gSW4gY2FzZSB0aGVyZSB3YXMgc29tZSBjb252ZXJzaW9uIGFwcGxpZWQuIFRlY2huaWNhbGx5IGl0IGlzIG5vdCB0aGUgdmFsdWUgc2V0IGJ1dCB0aGUgcmV0cmlldmVkIHdoZW4gaW4gYW4gYXNzaWdubWVudC4KLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkFycmF5QWNjZXNzWyIraW5kZXgrIl06ICIrYXJyYXkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGV4cHJlc3Npb24gcmVzdWx0IHN0YWNrIGFuZCB0aGUgZXhwcmVzc2lvbiByZXN1bHQgdHlwZSBzdGFjay4KLQkgKiBUaGUgdHlwZSBzdGFjayBpcyB1c2VkIHRvIGJlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBleHByZXNzaW9uIHJlc3VsdC4gVGhpcyBpcyBuZWVkZWQgZm9yIGNvbnZlcnRpbmcgdG8gcHJpbWl0aXZlcwotCSAqIGFuZCBmb3IgZmluZGluZyBjb3JyZWN0IG1ldGhvZCBjYWxsIGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLiBJbgotCSAqIHRoaXMgY2FzZSwgaXQgaXMgbm90IHRoZSB0cnVlIHZhbHVlLCBidXQgdGhlIHZhbHVlIGV4cGVjdGVkLCBlLmcuCi0JICogPGNvZGU+T2JqZWN0IGdldE9iamVjdCgpPC9jb2RlPiByZXR1cm5zIHNvbWV0aGluZyBvZiB0eXBlIE9iamVjdC4KLQkgKiBUaGlzIG5lZWRzIHRvIGJlIG1haW50YWluZWQgc28gdGhhdCBpZiBpdCBnb2VzIGludG8gYW5vdGhlciBtZXRob2QKLQkgKiB3ZSBkb24ndCBhY2NpZGVudGx5IHJldHVybiBhIG1vcmUgc3BlY2lmaWMgbWV0aG9kIGluc3RlYWQgb2YgdGhlCi0JICogb25lIHRoYXQgdGFrZXMgT2JqZWN0IGFzIGFuIGFyZ3VtZW50LiAKLQkgKiAKLQkgKiBleHByZXNzaW9uU3RhY2sgaGFzIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbi4KLQkgKiBleHByZXNzaW9uVHlwZVN0YWNrIGhhcyB0aGUgY29tcHV0ZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpLmUuCi0JICogdGhlIHR5cGUgdGhhdCB0aGUgZXhwcmVzc2lvbiByZXR1cm5zLCBub3QgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLgotCSAqIFRoZXNlIGNhbiBiZSBkaWZmZXJlbnQgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiAoZS5nLiBtZXRob2QpIG1heQotCSAqIHJldHVybiBhbiBPYmplY3QsIGJ1dCB0aGUgZXhwcmVzc2lvbiB2YWx1ZSB3aWxsIGJlIHNvbWUgc3BlY2lmaWMKLQkgKiBzdWJjbGFzcy4gU28gdGhlIGV4cHJlc3Npb25UeXBlU3RhY2sgd291bGQgaGF2ZSBhIDxjb2RlPmphdmEubGFuZy5PYmplY3QuY2xhc3M8L2NvZGU+Ci0JICogb24gaXQgaW4gdGhhdCBjYXNlLgotCSAqIE5vdGU6IGlmIHRoZSBleHByZXNzaW9uU3RhY2sgaGFzIGEgPGNvZGU+bnVsbDwvY29kZT4gb24gaXQsIHRoZW4gdGhlIHR5cGUgc3RhY2sKLQkgKiBtYXkgZWl0aGVyIGhhdmUgYSBzcGVjaWZpYyB0eXBlIGluIGl0LCBvciBpdCBtYXkgYmUgPGNvZGU+TWV0aG9kSGVscGVyLk5VTExfVFlQRTwvY29kZT4uIEl0Ci0JICogd291bGQgYmUgdGhpcyBpZiBpdCB3YXMgZXhwbGljaXRseSBwdXNoZWQgaW4gYW5kIG5vdCBhcyB0aGUKLQkgKiByZXN1bHQgb2YgYSBjb21wdXRhdGlvbi4gSWYgdGhlIHJlc3VsdCBvZiBhIGNvbXB1dGF0aW9uLCBpdCB3b3VsZCBoYXZlIHRoZQotCSAqIHRydWUgdmFsdWUuCi0JICogTm90ZTogaWYgdGhlIGV4cHJlc3Npb25TdGFjayBoYXMgYSA8Y29kZT5Wb2lkLnR5cGU8L2NvZGU+IG9uIGl0LCB0aGVuIHRoYXQKLQkgKiBtZWFucyB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBoYWQgbm8gcmVzdWx0LiBUaGlzIGlzIGFuIGVycm9yIGlmIHRyeWluZyB0bwotCSAqIHVzZSB0aGUgZXhwcmVzc2lvbiBpbiBhbm90aGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5NZXRob2RIZWxwZXIjTlVMTF9UWVBFCi0JICovCi0JcHJpdmF0ZSBMaXN0IGV4cHJlc3Npb25TdGFjayA9IG5ldyBBcnJheUxpc3QoMTApOwotCXByaXZhdGUgTGlzdCBleHByZXNzaW9uVHlwZVN0YWNrID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JCi0JLyoqCi0JICogTGlzdCBvZiB0aGUgZXhwcmVzc2lvbiBwcm94aWVzLiBUaGUgaW5kZXggaW50byB0aGUgbGlzdCBpcyB0aGUKLQkgKiBzYW1lIGFzIHRoZSBleHByZXNzaW9uIHByb3h5IGlkLiAKLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBleHByZXNzaW9uUHJveGllczsJLy8gSXQgaXMgYXJyYXkgbGlzdCBiZWNhdXNlIHdlIHdhbnQgdG8gY2FsbCBlbnN1cmVDYXBhY2l0eSBhbmQgdGhhdCBpcyBub3QgYXZhaWxhYmxlIG9uIExpc3QuCi0JCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkLiBBdCB0aGlzIHBvaW50IGFsbCBzdWJjb21tYW5kcyB3aWxsIHNpbXBseSBtYWtlIHN1cmUgdGhleSBmbHVzaCB0aGUgaW5wdXQgc3RyZWFtCi0JICogY29ycmVjdGx5LCBidXQgdGhleSBkbyBub3QgcHJvY2VzcyBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXJyb3JPY2N1cnJlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBub3ZhbHVlRXhjZXB0aW9uID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBUaHJvd2FibGUgZXhjZXB0aW9uID0gbnVsbDsJLy8gV2FzIHRoZXJlIGFub3RoZXIga2luZCBvZiBleGNlcHRpb24gdGhhdCB3YXMgY2F1Z2h0LgotCQotCS8qKgotCSAqIFByb2Nlc3MgYWxsIG90aGVyIGV4Y2VwdGlvbnMgdGhlbiB0aGUgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHVzYWdlIGNvZGUgc28gdGhhdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKLQkgKiBpbiBzZXR0aW5nIHVwIGZvciBhIGNhbGwgdG8gdGhlIHByb2Nlc3NlciBpdCBjYW4gYmUgbG9nZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkvLyBQcm9jZXNzIGFsbCBvdGhlciBleGNlcHRpb25zLgotCQlub3ZhbHVlRXhjZXB0aW9uID0gZmFsc2U7Ci0JCXdoaWxlIChlLmdldENhdXNlKCkgIT0gbnVsbCkKLQkJCWUgPSBlLmdldENhdXNlKCk7Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIioqKioqID4+Plx0RXhjZXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JCXRocm93RXhjZXB0aW9uKGUpOwkvLyBUcmVhdCBhcyBhIHRocm93IHRvIGxldCB0cnkvY2F0Y2hlcyBleHByZXNzaW9ucyBoYW5kbGUgaXQuCi0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgYSBzeW50YXggZXhjZXB0aW9uLiBUaGlzIG1lYW5zIGRhdGEgY29taW5nIGFjcm9zcyBpcyBjb3JydXB0ZWQgaW4KLQkgKiBzb21lIHdheSBzbyBubyBmdXJ0aGVyIHByb2Nlc3Npbmcgc2hvdWxkIG9jY3VyLiAKLQkgKiBAcGFyYW0gZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTeW50YXhFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJZXJyb3JPY2N1cnJlZCA9IHRydWU7Ci0JCW5vdmFsdWVFeGNlcHRpb24gPSBmYWxzZTsKLQkJZXhjZXB0aW9uID0gZTsJCQotCX0KLQkJCi0JLyoqCi0JICogUHJvY2VzcyBhIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLiBEb24ndCB3cmFwcGVyIHRoZXNlLgotCSAqIEBwYXJhbSBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQkvLyBUaGlzIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUsIHNvIG1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBuZXcgbGluZS4KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJcHJpbnRUcmFjZSgiRXhwcmVzc2lvbiBoYXMgbm8gdmFsdWUiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXJyb3JPY2N1cnJlZCA9IHRydWU7Ci0JCQlub3ZhbHVlRXhjZXB0aW9uID0gdHJ1ZTsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBubyBlcnJvcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gbm9FcnJvcnMoKSB7Ci0JCXJldHVybiAhZXJyb3JPY2N1cnJlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVycm9yIGlzIGEgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vRXhwcmVzc2lvblZhbHVlKCkgewotCQlyZXR1cm4gbm92YWx1ZUV4Y2VwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aHJvd2FibGUgaWYgYSBUaHJvd2FibGUgd2FzIGNhdWdodC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB0aHJvd2FibGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRFcnJvclRocm93YWJsZSgpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBleHByZXNzaW9uIHZhbHVlIGFuZCBpdHMgZXhwZWN0ZWQgdHlwZS4KLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB0eXBlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHVzaEV4cHJlc3Npb25WYWx1ZShPYmplY3QgbywgQ2xhc3MgdHlwZSkgewotCQlleHByZXNzaW9uU3RhY2suYWRkKG8pOwotCQlleHByZXNzaW9uVHlwZVN0YWNrLmFkZCh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3AganVzdCB0aGUgZXhwcmVzc2lvbiB2YWx1ZS4gSXQgaXMgaW1wZXJpdGl2ZSB0aGF0IHRoZSBleHByZXNzaW9uIHR5cGUKLQkgKiBpcyBwb3BwZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nLiBTZXBhcmF0ZWQgdGhlIG1ldGhvZHMgc28gdGhhdCB3ZQotCSAqIGRvbid0IG5lZWQgdG8gY3JlYXRlIGFuIGFycmF5IHRvIHJldHVybiB0d28gdmFsdWVzLiBUaGlzIHdpbGwgZGVyZWZlcmVuY2UKLQkgKiBhbnkgdmFyaWFibGUgcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBwb3BFeHByZXNzaW9uKCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBvcEV4cHJlc3Npb24odHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFBvcCBqdXN0IHRoZSBleHByZXNzaW9uIHZhbHVlLiBJdCBpcyBpbXBlcml0aXZlIHRoYXQgdGhlIGV4cHJlc3Npb24gdHlwZQotCSAqIGlzIHBvcHBlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcuIFNlcGFyYXRlZCB0aGUgbWV0aG9kcyBzbyB0aGF0IHdlCi0JICogZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgdG8gcmV0dXJuIHR3byB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGRlUmVmZXJlbmNlIElmIHRoZSB0b3AgZXhwcmVzc2lvbiBpcyBhIFJlZmVyZW5jZSwgdGhlbiBkZXJlZmVyZW5jZSBpdC4KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBwb3BFeHByZXNzaW9uKGJvb2xlYW4gZGVSZWZlcmVuY2UpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBEbyBub3QgcG9wIGFib3ZlIHRoZSBjdXJyZW50IHN1YmV4cHJlc3Npb24gcG9zLCBpZiBhbnkuCi0JCQlpZiAodG9wU3ViZXhwcmVzc2lvbiAhPSAtMSkKLQkJCQlpZiAoZXhwcmVzc2lvblN0YWNrLnNpemUoKSA9PSBzdWJleHByZXNzaW9uU3RhY2tQb3NbdG9wU3ViZXhwcmVzc2lvbl0pCi0JCQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQkJCi0JCQlPYmplY3QgcmVzdWx0ID0gZXhwcmVzc2lvblN0YWNrLnJlbW92ZShleHByZXNzaW9uU3RhY2suc2l6ZSgpLTEpOwotCQkJaWYgKGRlUmVmZXJlbmNlICYmIHJlc3VsdCBpbnN0YW5jZW9mIFZhcmlhYmxlUmVmZXJlbmNlKQotCQkJCXJlc3VsdCA9ICgoVmFyaWFibGVSZWZlcmVuY2UpIHJlc3VsdCkuZGVyZWZlcmVuY2UoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGV4cHJlc3Npb24gYXQgPGNvZGU+ZnJvbVRvcDwvY29kZT4gZG93biBmcm9tIHRoZSB0b3AuIFRoaXMgaXMKLQkgKiBuZWVkIGZvciB3aGVuIG11bHRpLW9wZXJhdG9ycyBoYXBwZW4gYW5kIHRoZXkgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9mIAotCSAqIHdoYXQgaXMgbmVlZGVkLiBUaGV5IHdvdWxkIG5vcm1hbGx5IGJlIHN0b3JlZCBsZWZ0IHRvIHJpZ2h0LCB3aXRoIHRoZQotCSAqIHJpZ2h0bW9zdCBvbmUgb24gdG9wLiBCdXQgdGhleSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBsZWZ0IHRvIHJpZ2h0LCBzbwotCSAqIHRvIGdldCB0aGUgbGVmdCBtb3N0IG9uZSByZXF1aXJlcyBkaWdnaW5nIGRvd24gaW4gdGhlIHN0YWNrLgotCSAqIDxwPgotCSAqIFdoZW4gZG9uZSwgPGNvZGU+cG9wRXhwcmVzc2lvbnMoaW50IGNvdW50KTwvY29kZT4gbXVzdCBiZSBjYWxsZWQgdG8KLQkgKiBjbGVhbiB0aGVtIG91dCBzaW5jZSB0aGV5IHdlcmUgcHJvY2Vzc2VkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBub3QgZGVyZWZlcmVuY2UgdGhlIGV4cHJlc3Npb24uIEl0IGlzIHRoZSBqb2Igb2YgdGhlIGNhbGxlciB0byBkbyB0aGlzLiAKLQkgKiAgCi0JICogQHBhcmFtIGZyb21Ub3AgPGNvZGU+MTwvY29kZT4gaXMgdGhlIHRvcCBvbmUsIDxjb2RlPjI8L2NvZGU+IGlzIHRoZSBuZXh0IG9uZSBkb3duLgotCSAqIEByZXR1cm4gVGhlIGVudHJ5IGZyb20gdGhlIHRvcCB0aGF0IHdhcyByZXF1ZXN0ZWQuCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSURFRXhwcmVzc2lvbiNwb3BFeHByZXNzaW9ucyhpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBnZXRFeHByZXNzaW9uKGludCBmcm9tVG9wKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gRG8gbm90IHB1bGwgYWJvdmUgdGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBwb3MsIGlmIGFueS4JCQkKLQkJCWlmICh0b3BTdWJleHByZXNzaW9uICE9IC0xKQotCQkJCWlmIChleHByZXNzaW9uU3RhY2suc2l6ZSgpLWZyb21Ub3AgPCBzdWJleHByZXNzaW9uU3RhY2tQb3NbdG9wU3ViZXhwcmVzc2lvbl0pCi0JCQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQkJCi0JCQlyZXR1cm4gZXhwcmVzc2lvblN0YWNrLmdldChleHByZXNzaW9uU3RhY2suc2l6ZSgpLWZyb21Ub3ApOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgdG9wIDxjb2RlPmNvdW50PC9jb2RlPiBpdGVtcy4gVGhpcyB3aWxsIG5vdCBjYXVzZSBkZXJlZmVyZW5jaW5nIHRvIG9jY3VyLiBJdAotCSAqIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBzdGFjayBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBjb3VudAotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwb3BFeHByZXNzaW9ucyhpbnQgY291bnQpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBEbyBub3QgcG9wIGFib3ZlIHRoZSBjdXJyZW50IHN1YmV4cHJlc3Npb24gcG9zLCBpZiBhbnkuCi0JCQlpbnQgc3RvcCA9IHRvcFN1YmV4cHJlc3Npb24gIT0gLTEgPyBzdWJleHByZXNzaW9uU3RhY2tQb3NbdG9wU3ViZXhwcmVzc2lvbl0gOiAtMTsKLQkJCWludCByZW1vdmUgPSBleHByZXNzaW9uU3RhY2suc2l6ZSgpLTE7Ci0JCQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJCQlpZiAoZXhwcmVzc2lvblN0YWNrLnNpemUoKSA8PSBzdG9wKQotCQkJCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsJLy8gVHJ5IHRvIGdvIGFib3ZlIHRoZSBjdXJyZW50IHN1YmV4cHJlc3Npb24uCi0JCQkJZXhwcmVzc2lvblN0YWNrLnJlbW92ZShyZW1vdmUpOwotCQkJCWV4cHJlc3Npb25UeXBlU3RhY2sucmVtb3ZlKHJlbW92ZS0tKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQb3AganVzdCB0aGUgZXhwcmVzc2lvbiB0eXBlLiBJdCBpcyBpbXBlcml0aXZlIHRoYXQgdGhlIGV4cHJlc3Npb24gdHlwZQotCSAqIGlzIHBvcHBlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgcG9wRXhwcmVzc2lvbi4gU2VwYXJhdGVkIHRoZSBtZXRob2RzIHNvIHRoYXQgd2UKLQkgKiBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSB0byByZXR1cm4gdHdvIHZhbHVlcy4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWxsb3dWb2lkIGlzIGZhbHNlIGFuZCB0eXBlIGlzIHZvaWQsIHRoZW4gYSBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiBUaGlzIGlzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgZXhwcmVzc2lvbiB3YXMgdHJ5aW5nIHRvIGJlIHVzZWQgaW4gYSBkaWZmZXJlbnQKLQkgKiBleHByZXNzaW9uLiBUaGlzIHdpbGwgYmUgc2V0IHRvIHZvaWQgb25seSBvbiBleHByZXNzaW9ucyB0aGF0IHJldHVybiBubyB2YWx1ZSAob25seQotCSAqIG1ldGhvZCdzIGRvIHRoaXMgZm9yIG5vdykuCi0JICogCi0JICogQHBhcmFtIGFsbG93Vm9pZCBBbGxvdyB2b2lkIHR5cGVzIGlmIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgdHlwZS4KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENsYXNzIHBvcEV4cHJlc3Npb25UeXBlKGJvb2xlYW4gYWxsb3dWb2lkKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQ2xhc3MgcmVzdWx0ID0gKENsYXNzKSBleHByZXNzaW9uVHlwZVN0YWNrLnJlbW92ZShleHByZXNzaW9uVHlwZVN0YWNrLnNpemUoKS0xKTsKLQkJCWlmICghYWxsb3dWb2lkICYmIHJlc3VsdCA9PSBWb2lkLlRZUEUpCi0JCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlBvcEV4cHJlc3Npb25UeXBlLkV4cHJlc3Npb25Wb2lkX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCi0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGV4cHJlc3Npb24gdHlwZSBhdCA8Y29kZT5mcm9tVG9wPC9jb2RlPiBkb3duIGZyb20gdGhlIHRvcC4gVGhpcyBpcwotCSAqIG5lZWQgZm9yIHdoZW4gbXVsdGktb3BlcmF0b3JzIGhhcHBlbiBhbmQgdGhleSBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb2YgCi0JICogd2hhdCBpcyBuZWVkZWQuIFRoZXkgd291bGQgbm9ybWFsbHkgYmUgc3RvcmVkIGxlZnQgdG8gcmlnaHQsIHdpdGggdGhlCi0JICogcmlnaHRtb3N0IG9uZSBvbiB0b3AuIEJ1dCB0aGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGxlZnQgdG8gcmlnaHQsIHNvCi0JICogdG8gZ2V0IHRoZSBsZWZ0IG1vc3Qgb25lIHJlcXVpcmVzIGRpZ2dpbmcgZG93biBpbiB0aGUgc3RhY2suCi0JICogPHA+Ci0JICogV2hlbiBkb25lLCA8Y29kZT5wb3BFeHByZXNzaW9uVHlwZXMoaW50IGNvdW50KTwvY29kZT4gbXVzdCBiZSBjYWxsZWQgdG8KLQkgKiBjbGVhbiB0aGVtIG91dCBzaW5jZSB0aGV5IHdlcmUgcHJvY2Vzc2VkLgotCi0JICogQHBhcmFtIGZyb21Ub3AgPGNvZGU+MTwvY29kZT4gaXMgdGhlIHRvcCBvbmUsIDxjb2RlPjI8L2NvZGU+IGlzIHRoZSBuZXh0IG9uZSBkb3duLgotCSAqIEBwYXJhbSBhbGxvd1ZvaWQgQWxsb3cgdm9pZCB0eXBlcyBpZiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIEByZXR1cm4gVGhlIHR5cGUgZnJvbSB0aGUgdG9wIHRoYXQgd2FzIHJlcXVlc3RlZC4KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSURFRXhwcmVzc2lvbiNwb3BFeHByZXNzaW9uVHlwZXMoaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDbGFzcyBnZXRFeHByZXNzaW9uVHlwZShpbnQgZnJvbVRvcCwgYm9vbGVhbiBhbGxvd1ZvaWQpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyByZXN1bHQgPSAoQ2xhc3MpIGV4cHJlc3Npb25UeXBlU3RhY2suZ2V0KGV4cHJlc3Npb25UeXBlU3RhY2suc2l6ZSgpLWZyb21Ub3ApOwotCQkJaWYgKCFhbGxvd1ZvaWQgJiYgcmVzdWx0ID09IFZvaWQuVFlQRSkKLQkJCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRmxhZyBpbmRpY2F0aW5nIGV4cHJlc3Npb24gc2hvdWxkIGJlIGlnbm9yZWQgYW5kIG5vdCBwcm9jZXNzZWQuCi0JICogVGhpcyBoYXBwZW5zIGJlY2F1c2Ugb2YgZmV3IGNhc2VzLCBsaWtlIGNvbmRpdGlvbmFsIGFuZCwgdGhhdAotCSAqIGlmIG9uZSByZXR1cm5zIGZhbHNlLCB0aGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbnMgaW4gdGhhdCBjb25kaXRpb25hbCBhbmQKLQkgKiBleHByZXNzaW9uIHNob3VsZCBiZSBpZ25vcmVkIGFuZCBub3QgcHJvY2Vzc2VkLgotCSAqIDxwPgotCSAqIEl0IGlzIGFuIE9iamVjdCB0aGF0IGFjdHMgYXMgYW4gZW51bSBmb3IgdGhlIHR5cGUgb2YgZXhwcmVzc2lvbiB0aGF0IGluaXRpYXRlZCB0aGUgaWdub3JlLiAKLQkgKiBJZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIG5vIG9uZSBpcyBpZ25vcmluZy4gCi0JICogPHA+Ci0JICogQWxsIG9mIHRoZSBwdXNoVG8uLi5Qcm94eSBtZXRob2RzIG11c3QgdGVzdCB0aGlzIGZvciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5LgotCSAqIEVhY2ggZXhwcmVzc2lvbiBoYXMgc29tZSB3YXkgb2YgdGVzdGluZyB0aGF0IHRoZWlyIHBhcnRpY3VsYXIgbmVzdGluZyBvZiAKLQkgKiBleHByZXNzaW9ucyBpcyBjb21wbGV0ZSBhbmQgdGhleSBjYW4gdHVybiBvZmYgdGhlIGlnbm9yZSBmbGFnLgotCSAqIDxwPgotCSAqIE9ubHkgb25lIHR5cGUgb2YgaWdub3JlIGNhbiBleGlzdCBhdCBhIHRpbWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsJCi0JCi0JCi0JcHJpdmF0ZSBMaXN0IHNhdmVTdGF0ZXM7Ci0JCi0JLyoqCi0JICogQXJlIHdlIHRyYWNpbmcgb3Igbm90LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyYWNlT247Ci0JcHJpdmF0ZSBmaW5hbCBsb25nIHRocmVzaG9sZFRpbWU7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0RXhwcmVzc2lvblN0ZXBUaW1lOwotCXByaXZhdGUgbG9uZyBzdGFydEV4cHJlc3Npb25UaW1lOwotCXByaXZhdGUgbG9uZyBsYXN0RXhwcmVzc2lvbkVuZFRpbWU7Ci0JCi0JLyoqCi0JICogVHJhY2UgaGVhZCBvZiB0aGlzIGV4cHJlc3Npb24uIFNvIHRoYXQgdHJhY2VzIGZyb20gZGlmZmVyZW50IGV4cHJlc3Npb25zIGNhbiBiZSBkaXN0aW5xdWlzaGVkLgotCSAqIEl0IGlzIHNpbXBseSBhbiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgY291bnRlci4gSXQgaXMgdGhlIGhlYWRlciBzdHJpbmcgZm9yIGFueSB0cmFjZSBvdXRwdXQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0cmFjZUhlYWRlcjsKLQkKLQlwcml2YXRlIGludCBpbmRlbnQgPSAwOwkvLyBJbmRlbnRlZCBmb3IgY2VydGFpbiBibG9jayBleHByZXNzaW9ucy4KLQkKLQkvKgotCSAqIFRyYWNlIGNvdW50ZXIuIEl0IGlzIGluY3JlbWVudGVkIG9uY2UgZm9yIGVhY2ggZXhwcmVzc2lvbiBhbmQgYXNzaWduZWQgdG8gdGhlIHRyYWNlSWQgb2YgdGhlIGV4cHJlc3Npb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFRSQUNFX0NPVU5URVI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBFeHByZXNzaW9uIHdpdGhvdXQgdHJhY2luZy4KLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb2Nlc3NlcigpIHsKLQkJdGhpcyhmYWxzZSwgLTEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24sIGFuZCBzZXQgdGhlIHRyYWNpbmcgbW9kZSBhbmQgdGhyZXNob2xkIHRpbWUuIFVzZSAtMQotCSAqIGZvciBkZWZhdWx0IHRpbWUgb2YgMTAwbXMuCi0JICogQHBhcmFtIHRyYWNlT24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb2Nlc3Nlcihib29sZWFuIHRyYWNlT24sIGxvbmcgdGhyZXNob2xkKSB7Ci0JCXRoaXMudHJhY2VPbiA9IHRyYWNlT247Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQl0cmFjZUhlYWRlciA9ICIqKiIrKCsrVFJBQ0VfQ09VTlRFUikrJzonOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50KHRyYWNlSGVhZGVyKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFN0YXJ0IGV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy50aHJlc2hvbGRUaW1lID0gdGhyZXNob2xkICE9IC0xID8gdGhyZXNob2xkIDogMTAwOwotCQkJbGFzdEV4cHJlc3Npb25FbmRUaW1lID0gc3RhcnRFeHByZXNzaW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9IGVsc2UgewotCQkJdHJhY2VIZWFkZXIgPSBudWxsOwotCQkJdGhyZXNob2xkVGltZSA9IDEwMDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSBtc2cgaGVscGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdHJhY2VPbiBpcyB0cnVlLiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gc3RhcnQgYSBuZXcgdHJhY2UgbWVzc2FnZS4KLQkgKiBUaGUgY2FsbGVyIGlzIG11c3QgY2FsbCBwcmludFRyYWNlRW5kIGF0IHRoZSBlbmQuCi0JICogIAotCSAqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byBwcmludAotCSAqIEBwYXJhbSBpZ25vcmUgYXJlIHdlIGlnbm9yaW5nIHRoZSBleHByZXNzaW9uLCBvciBpcyBpdCBiZWluZyBwcm9jZXNzZWQgKHRoaXMganVzdCBhbHRlcnMgdGhlIHRyYWNlIG91dHB1dCBzbGlnaHRseSkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRUcmFjZShTdHJpbmcgbXNnLCBib29sZWFuIGlnbm9yZSkgewotCQlzdGFydEV4cHJlc3Npb25TdGVwVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlsb25nIHNpbmNlTGFzdEV4cHJlc3Npb24gPSBzdGFydEV4cHJlc3Npb25TdGVwVGltZSAtIGxhc3RFeHByZXNzaW9uRW5kVGltZTsKLQkJU3lzdGVtLm91dC5wcmludCh0cmFjZUhlYWRlcik7Ci0JCWlmIChzaW5jZUxhc3RFeHByZXNzaW9uID4gMCkgewotCQkJU3lzdGVtLm91dC5wcmludCgnKCcpOwotCQkJaWYgKHNpbmNlTGFzdEV4cHJlc3Npb24gPiB0aHJlc2hvbGRUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnQoIioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50KHNpbmNlTGFzdEV4cHJlc3Npb24pOwotCQkJU3lzdGVtLm91dC5wcmludCgibXMpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCdcdCcpOwotCQlpZiAoIWlnbm9yZSkKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludCgiIyNcdCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlwcmludEluZGVudCgpOwotCQlTeXN0ZW0ub3V0LnByaW50KG1zZyk7Ci0JfQotCQotCS8qKgotCSAqIHByaW50IHRoZSBpbmRlbnQuIEl0IHdpbGwgbm90IGRvIGEgbmV3IGxpbmUgYmVmb3JlIG5vciBhZnRlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludEluZGVudCgpIHsKLQkJZm9yKGludCBpPWluZGVudDsgaT4wOyBpLS0pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50VHJhY2VFbmQoKSB7Ci0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0RXhwcmVzc2lvblN0ZXBUaW1lOwotCQlpZiAoc3RvcCA+IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIiAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdG9wID4gdGhyZXNob2xkVGltZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludChzdG9wKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIm1zKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCWxhc3RFeHByZXNzaW9uRW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCX0KLQkKLQkvKioKLQkgKiBEbyBhbiBpbmRlbnQgKHVuZGVudCkgYWNjb3JkaW5nIHRvIGluZGVudCBmbGFnLgotCSAqIEBwYXJhbSBpbmRlbnQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jcmVtZW50IGluZGVudCwgb3Igb3RoZXJ3aXNlIGRlY3JlbWVudC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoYm9vbGVhbiBpbmRlbnQpIHsKLQkJdGhpcy5pbmRlbnQgKz0gKGluZGVudCA/IDEgOiAtMSk7Ci0JCWlmICh0aGlzLmluZGVudCA8IDApCi0JCQl0aGlzLmluZGVudCA9IDA7Ci0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBvYmplY3QgYW5kIHR5cGUuIEl0IHdpbGwgbm90IGVuZCB3aXRoIGEgbmV3bGluZSBjaGFyLCBzbyBvbmUgd2lsbCBiZSBuZWVkZWQgYWZ0ZXJ3YXJkcy4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB0Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRPYmplY3RBbmRUeXBlKE9iamVjdCBvLCBDbGFzcyB0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoJyAnKTsKLQkJU3lzdGVtLm91dC5wcmludCgiT2JqZWN0LSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnQobyk7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIiBUeXBlLSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnQodCk7Ci0JCVN5c3RlbS5vdXQucHJpbnQoJyAnKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGV4Y2VwdGlvbiBwcm9jZXNzaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xvc2UoKSB7Ci0JCWJvb2xlYW4gZmlyc3RDbG9zZSA9IGV4cHJlc3Npb25TdGFjayAhPSBudWxsOwotCQlpZiAoZmlyc3RDbG9zZSAmJiB0cmFjZU9uKSB7Ci0JCQlwcmludFRyYWNlKCJFbmQgZXhwcmVzc2lvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9uZyB0b3RhbFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydEV4cHJlc3Npb25UaW1lOwotCQkJU3lzdGVtLm91dC5wcmludCgiIFRvdGFsIGV4cHJlc3Npb24gZXZhbHVhdGlvbiB0aW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludCh0b3RhbFRpbWUpOwotCQkJU3lzdGVtLm91dC5wcmludCgibXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZXhwcmVzc2lvblN0YWNrID0gbnVsbDsKLQkJCWV4cHJlc3Npb25UeXBlU3RhY2sgPSBudWxsOwotCQkJZXhwcmVzc2lvblByb3hpZXMgPSBudWxsOwotCQkJZXhjZXB0aW9uID0gbnVsbDsKLQkJCWNhdGNoVGhyb3dhYmxlID0gbnVsbDsKLQkJCXNhdmVTdGF0ZXMgPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZpcnN0Q2xvc2UgJiYgdHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdWxsIHRoZSB2YWx1ZS4gVGhlIHZhbHVlIHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIGFycmF5IHBhc3NlZCBpbi4KLQkgKiBJdCB3aWxsIGJlIHN0b3JlZCBhcyB2YWx1ZVswXSA9IHZhbHVlIHZhbHVlWzFdID0gdmFsdWV0eXBlKENsYXNzKS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGFycmF5IHRvIHN0b3JlIHRoZSB2YWx1ZSBhbmQgdHlwZSBpbnRvLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdWxsVmFsdWUoT2JqZWN0W10gdmFsdWUpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiUHVsbCB2YWx1ZToiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXZhbHVlWzBdID0gcG9wRXhwcmVzc2lvbigpOwotCQkJdmFsdWVbMV0gPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCXByaW50T2JqZWN0QW5kVHlwZSh2YWx1ZVswXSwgKENsYXNzKSB2YWx1ZVsxXSk7Ci0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJfQotCQl9Ci0JCWNsb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFB1bGwgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIHByb3h5LCBkZXJlZmVyZW5jaW5nIGl0IGlmIG5lY2Vzc2FyeS4gVGhpcyBpcyBmb3IgcmVzb2x1dGlvbiBvbmx5IHB1cnBvc2VzIGF0IHRoZQotCSAqIGVuZCBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQuIE5vdCBtZWFudCBmb3IgZ2VuZXJhbCBhY2Nlc3MgdG8gdGhlIHZhbHVlIG9mIGV4cHJlc3Npb24gcHJveHkuIFVzZSAKLQkgKiB7QGxpbmsgRXhwcmVzc2lvblByb2Nlc3NlciNnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQsIE9iamVjdFtdKX0gaW5zdGVhZCBmb3IgZ2VuZXJhbCBhY2Nlc3MgdG8gdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eWlkCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1bGxFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQgcHJveHlpZCwgT2JqZWN0W10gdmFsdWUpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWdldEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5aWQsIHZhbHVlLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBleHByZXNzaW9uIHByb3h5IHZhbHVlLiBJZiB0aGUgZXhwcmVzc2lvbiBoYXMgbm90IHlldCBiZWVuIGV2YWx1YXRlZCBpdCB3aWxsCi0JICogcmV0dXJuIGZhbHNlLiBJZiBpdCBoYXMgaXQgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKiBAcGFyYW0gcHJveHlpZAotCSAqIEBwYXJhbSB2YWx1ZSBwdXQgdmFsdWUgaW50byB2YWx1ZVswXSBhbmQgdGhlIHR5cGUgaW50byB2YWx1ZVsxXS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWwsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZXhwcmVzc2lvbiBwcm94eSB3YXMgbmV2ZXIgcmVzb2x2ZWQgb3IgZG9lc24ndCBleGlzdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQgcHJveHlpZCwgT2JqZWN0W10gdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShwcm94eWlkLCB2YWx1ZSwgdHJ1ZSwgZmFsc2UpOwotCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBleHByZXNzaW9uIHByb3h5IHZhbHVlLCBvciB0aGUgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gaWYgbm90IHJlc29sdmVkLiBUaGlzCi0JICogaXMgdXNlZnVsIGZvciBjYWxsZXJzIHRoYXQgbmVlZCB0byBoYW5kbGUgdGhlIHByb3h5IGl0c2VsZiBmb3IgZmFpbGVkIGNhbGxzLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eWlkCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgT2JqZWN0W10gdmFsdWUpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWdldEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5aWQsIHZhbHVlLCB0cnVlLCBmYWxzZSk7Ci0JfQotCQotCS8qCi0JICogSW50ZXJuYWwgbWV0aG9kIHVzZSB0byBhY3R1YWxseSBnZXQgdGhlIHZhbHVlLCBidXQgdG8gZGlzdGlucXVpc2ggYmV0d2VlbiBwdWxsIGFuZCBnZXQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuCi0JICogR2V0IHdpbGwgcHJvY2VzcyB0aGUgZXJyb3JzIGFzIG5vcm1hbCBleGVjdXRpb24gZXJyb3JzLCB3aGlsZSBwdWxsIHdpbGwgdGhyb3cgdGhlIGVycm9ycy4gZmluYWxUcmFjZSBpcyB3aGVuCi0JICogdGhpcyBpcyB0aGUgZmluYWwgY2FsbCB0byByZXR1cm4gdGhlIHZhbHVlcyB0byB0aGUgY2xpZW50LiBXZSB3aWxsIHRyYWNlIHRoZSByZXN1bHRzIGluIHRoYXQgY2FzZS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQgcHJveHlpZCwgT2JqZWN0W10gdmFsdWUsIGJvb2xlYW4gcHVsbCwgYm9vbGVhbiBmaW5hbFRyYWNlKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBOb3RlOiBUaGlzIHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbnMgcmlnaHQgYXdheSBzaW5jZSB0aGlzIGlzIGNhbGxlZCBmcm9tIG91dHNpZGUgdG8gZmlsbCBpbiB0aGUgdmFsdWUgYW5kCi0JCS8vIHNvIHdlIGFyZSBob2xkaW5nIHN1Y2ggZXhjZXB0aW9ucy4KLQkJYm9vbGVhbiBkb1RyYWNlID0gZmluYWxUcmFjZSAmJiB0cmFjZU9uOwotCQl0cnkgewotCQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwgJiYgZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpID4gcHJveHlpZCkgewotCQkJCUludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5ID0gKEludGVybmFsRXhwcmVzc2lvblByb3h5KSBleHByZXNzaW9uUHJveGllcy5nZXQocHJveHlpZCk7Ci0JCQkJaWYgKHByb3h5ICE9IG51bGwgJiYgcHJveHkuaXNTZXQoKSkgewotCQkJCQl2YWx1ZVswXSA9IHByb3h5LmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZVswXSBpbnN0YW5jZW9mIFZhcmlhYmxlUmVmZXJlbmNlKQotCQkJCQkJdmFsdWVbMF0gPSAoKFZhcmlhYmxlUmVmZXJlbmNlKSB2YWx1ZVswXSkuZGVyZWZlcmVuY2UoKTsgLy8gSGVyZSB3ZSB3YW50IHRoZSBmaW5hbCBjdXJyZW50IHZhbHVlLgotCQkJCQl2YWx1ZVsxXSA9IHByb3h5LmdldFR5cGUoKTsKLQkJCQkJaWYgKGRvVHJhY2UpCi0JCQkJCQlpZiAodmFsdWVbMV0gIT0gVm9pZC5UWVBFKSB7Ci0JCQkJCQkJcHJpbnRUcmFjZSgiUmV0dXJuIFByb3h5ICMiICsgcHJveHlpZCArICIgUmVzb2x2ZWQgdG8iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXByaW50T2JqZWN0QW5kVHlwZSh2YWx1ZVswXSwgKENsYXNzKSB2YWx1ZVsxXSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlwcmludFRyYWNlKCJSZXR1cm4gUHJveHkgIyIgKyBwcm94eWlkICsgIiBSZXNvbHZlZCB0byB2b2lkLiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGRvVHJhY2UpCi0JCQkJCQlwcmludFRyYWNlKCJSZXR1cm4gUHJveHkgIyIgKyBwcm94eWlkICsgIjogTm90IHJlc29sdmVkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSA9IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5HZXRFeHByZXNzaW9uUHJveHlWYWx1ZS5FeHByZXNzaW9uUHJveHlOb3RTZXRfRVhDXyIpLCBwcm94eSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHB1bGwpCi0JCQkJCQl0aHJvdyBlOwotCQkJCQllbHNlCi0JCQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZG9UcmFjZSkKLQkJCQkJcHJpbnRUcmFjZSgiUmV0dXJuIFByb3h5ICMiICsgcHJveHlpZCArICI6IE5ldmVyIGNyZWF0ZWQuIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlID0gbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkdldEV4cHJlc3Npb25Qcm94eVZhbHVlLkV4cHJlc3Npb25Qcm94eURvZXNudEV4aXN0X0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHVsbCkKLQkJCQkJdGhyb3cgZTsKLQkJCQllbHNlCi0JCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRvVHJhY2UpCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGV4cHJlc3Npb24gKGp1c3QgYSB2YWx1ZSkgb250byB0aGUgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hFeHByZXNzaW9uKE9iamVjdCBvLCBDbGFzcyB0KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIlB1c2g6ICIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByaW50T2JqZWN0QW5kVHlwZShvLCB0KTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQlwdXNoRXhwcmVzc2lvblZhbHVlKG8sIHQpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gcHJveHkgKGZyb20gcHJveHkgaWQpLCBhbmQgcHVzaCB0aGUgdmFsdWUgb250byB0aGUgc3RhY2suCi0JICogIAotCSAqIEBwYXJhbSBwcm94eWlkIFRoZSBwcm94eSBpZCBvZiB0aGUgRXhwcmVzc2lvblByb3h5IHRvIHB1c2ggYXMgYSB2YWx1ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkKSB7Ci0JCWJvb2xlYW4gaWdub3JlID0oaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIlB1c2ggRXhwcmVzc2lvbiBQcm94eSAjIitwcm94eWlkLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCWlmIChleHByZXNzaW9uUHJveGllcyAhPSBudWxsICYmIGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKSA+IHByb3h5aWQpIHsKLQkJCQlJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSA9IChJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSkgZXhwcmVzc2lvblByb3hpZXMuZ2V0KHByb3h5aWQpOwotCQkJCWlmIChwcm94eSAhPSBudWxsICYmIHByb3h5LmlzU2V0KCkpIHsKLQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQlwcmludE9iamVjdEFuZFR5cGUocHJveHkuZ2V0VmFsdWUoKSwgcHJveHkuZ2V0VHlwZSgpKTsKLQkJCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShwcm94eS5nZXRWYWx1ZSgpLCBwcm94eS5nZXRUeXBlKCkpOwkvLyBDYW4gcHVzaCBhIFZhcmlhYmxlUmVmZXJlbmNlLiBUaGlzIGlzIG9rLiBXaGVuIHVzZWQgaXQgd2lsbCB0aGVuIGRlcmVmIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUuCi0JCQkJfSBlbHNlCi0JCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCJQcm94eSBpZDogIitwcm94eWlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZQotCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCJQcm94eSBpZDogIitwcm94eWlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXNoIGEgY2FzdCBvbnRvIHN0YWNrLiBUaGUgdHlwZSBwYXNzZWQgaW4gaXMgZWl0aGVyIGEgU3RyaW5nICh3aXRoIGNsYXNzbmFtZSB0byBjYXN0IHRvKSBvciB0aGUKLQkgKiB0eXBlIHRvIGNhc3QgdG8uCi0JICogQHBhcmFtIHR5cGUgVG8gY2FzdCB0by4gSWYgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGVuIGNvbnZlcnQgdG8gdHlwZSAodXNpbmcgc29tZXRoaW5nIGxpa2UgPGNvZGU+Q2xhc3MuZm9yTmFtZSgpPC9jb2RlPikgb3IgaXQgaXMgYSBDbGFzcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hDYXN0KENsYXNzIHR5cGUpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkNhc3QgdG86ICIrdHlwZSwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IGV4cCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyBleHB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoY2FzdEJlYW4odHlwZSwgZXhwLCBleHB0eXBlKSwgdHlwZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQkJCQotCX0KLQkKLQkvKioKLQkgKiBDYXN0IGEgYmVhbiBpbnRvIHRoZSByZXR1cm4gdHlwZS4gSWYgdGhlIHJldHVybiB0eXBlIGlzIG5vdCBwcmltaXRpdmUsIHRoZW4KLQkgKiB0aGUgYmVhbiBpcyBsZWZ0IGFsb25lLCBob3dldmVyIGl0IGlzIGNoZWNrZWQgdG8gYmUgYW4gaW5zdGFuY2Ugb2YKLQkgKiB0aGUgcmV0dXJuIHR5cGUuIElmIHRoZSByZXR1cm4gdHlwZSBpcyBwcmltaXRpdmUsIHRoZW4gdGhlCi0JICogY29ycmVjdCBwcmltaXRpdmUgd3JhcHBlciBpcyBjcmVhdGVkIGZyb20gdGhlIGJlYW4gKGJlYW4gbXVzdCBiZSBhIG51bWJlciBvciBjaGFyYWN0ZXIgb3IgYm9vbGVhbiBwcmltaXR2ZSBzbwotCSAqIHRoYXQgY2FzdCB3aWxsIHdvcmspLgotCSAqIDxwPgotCSAqIEhvd2V2ZXIgaWYgY2FuJ3QgYmUgY2FzdCBmb3IgcHJpbWl0aXZlIG9yIGlmIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUKLQkgKiByZXR1cm50eXBlIGZvciBvYmplY3RzLCBhIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gY2FzdCBhIGJlYW4uIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmV0dXJuVHlwZQotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGJlYW5UeXBlIFRoZSB0eXBlIHRoYXQgYmVhbiBpcyBzdXBwb3NlZCB0byBiZSAoZS5nLiBldmVuIHRob3VnaCBpdCBpcyBhIE51bWJlciwgaXQgYWN0dWFsbHkgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSkuCi0JICogQHJldHVybiBUaGUgY2FzdCBiZWFuIChlaXRoZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGUgb3IgYmVhbikKLQkgKiAKLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgY2FzdEJlYW4oQ2xhc3MgcmV0dXJuVHlwZSwgT2JqZWN0IGJlYW4sIENsYXNzIGJlYW5UeXBlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJLy8gQ2FzdCB1c2VzIHRydWUgdmFsdWUgYW5kIHRydWUgY2xhc3Mgb2YgYmVhbiwgbm90IGV4cGVjdGVkIHR5cGUgKGkuZS4gbm90IGJlYW5UeXBlKS4KLQkJaWYgKGJlYW4gPT0gbnVsbCkKLQkJCWlmICghcmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCXJldHVybiBiZWFuOwkvLyBiZWFuIGlzIG51bGwsIGFuZCByZXR1cm4gdHlwZSBpcyBub3QgcHJpbWl0aXZlLCBzbyB0aGlzIGlzIGEgdmFsaWQgY2FzdC4KLQkJCWVsc2UgCi0JCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7Ci0JCWVsc2UgaWYgKHJldHVyblR5cGUuZXF1YWxzKGJlYW4uZ2V0Q2xhc3MoKSkpCi0JCQlyZXR1cm4gYmVhbjsJLy8gVGhleSBhcmUgYWxyZWFkeSB0aGUgc2FtZS4KLQkJZWxzZSBpZiAoIXJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKCFiZWFuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIHJldHVyblR5cGUuaXNJbnN0YW5jZShiZWFuKSkKLQkJCQlyZXR1cm4gYmVhbjsKLQkJCWVsc2UKLQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsJLy8gRWl0aGVyIGJlYW4gdHlwZSB3YXMgd3JhcHBlcmluZyBwcmltaXRpdmUgb3Igbm90IGluc3RhbmNlb2YgcmV0dXJudHlwZS4KLQkJfSBlbHNlIHsKLQkJCWlmICghYmVhblR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsJLy8gYmVhbiB0eXBlIHdhcyBub3Qgd3JhcHBlcmluZyBhIHByaW1pdGl2ZS4gQ2FuJ3QgY2FzdCB0byBwcmltaXRpdmUuCi0JCQkvLyBJdCBpcyByZXR1cm4gdHlwZSBvZiBwcmltaXRpdmUuIE5vdyBjb252ZXJ0IHRvIGNvcnJlY3QgcHJpbWl0aXZlLgotCQkJaWYgKHJldHVyblR5cGUgPT0gQm9vbGVhbi5UWVBFKQotCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJZWxzZQotCQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsKLQkJCWVsc2UgewotCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCWlmIChyZXR1cm5UeXBlID09IEludGVnZXIuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChOdW1iZXIpIGJlYW4pLmludFZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IEJ5dGUuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQnl0ZSkKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEJ5dGUoKChOdW1iZXIpIGJlYW4pLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKChjaGFyKSAoKE51bWJlcikgYmVhbikuaW50VmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gRG91YmxlLlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIERvdWJsZSkKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IERvdWJsZSgoKE51bWJlcikgYmVhbikuZG91YmxlVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gRmxvYXQuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgRmxvYXQpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBGbG9hdCgoKE51bWJlcikgYmVhbikuZmxvYXRWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBMb25nLlRZUEUpCi0JCQkJCQlpZiAoYmVhbiBpbnN0YW5jZW9mIExvbmcpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBMb25nKCgoTnVtYmVyKSBiZWFuKS5sb25nVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gU2hvcnQuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgU2hvcnQpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBTaG9ydCgoKE51bWJlcikgYmVhbikuc2hvcnRWYWx1ZSgpKTsJCi0JCQkJCWVsc2UKLQkJCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwotCQkJCX0gZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQlpZiAocmV0dXJuVHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSkKLQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IEludGVnZXIuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IEJ5dGUuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgQnl0ZSgoYnl0ZSkgKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBEb3VibGUuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgRG91YmxlKCgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gRmxvYXQuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgRmxvYXQoKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBMb25nLlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IExvbmcoKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBTaG9ydC5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBTaG9ydCgoc2hvcnQpICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7CQotCQkJCQllbHNlCi0JCQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsJLy8gSXQgc2hvdWxkIG5ldmVyIGdldCBoZXJlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGhyb3dDbGFzc0Nhc3QoQ2xhc3MgcmV0dXJuVHlwZSwgT2JqZWN0IGJlYW4pIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkNhbm5vdENhc3RYVG9ZX0VYQ18iKSwgbmV3IE9iamVjdFtdIHtiZWFuICE9IG51bGwgPyBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogbnVsbCwgcmV0dXJuVHlwZS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSB0eXBlIHRoYXQgdGhlIHdyYXBwZXIgYmVhbiByZXByZXNlbnRzIChpLmUuIEJvb2xlYW4gaW5zdGFuY2UgcmV0dXJucyBCb29sZWFuLlRZUEUpIAotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIHByaW1pdGl2ZSB0eXBlLiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0KLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSB0eXBlIGNsYXNzIG9mIHRoZSBnaXZlbiBiZWFuLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJlYW4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3Igbm90IG9mIHRoZSB0eXBlIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHByaW1pdGl2ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgZ2V0UHJpbWl0aXZlVHlwZShPYmplY3QgYmVhbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChiZWFuIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCXJldHVybiBCb29sZWFuLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJcmV0dXJuIEludGVnZXIuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIEJ5dGUpCi0JCQlyZXR1cm4gQnl0ZS5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJcmV0dXJuIENoYXJhY3Rlci5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgRG91YmxlKQotCQkJcmV0dXJuIERvdWJsZS5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgRmxvYXQpCi0JCQlyZXR1cm4gRmxvYXQuVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIExvbmcpCi0JCQlyZXR1cm4gTG9uZy5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgU2hvcnQpCi0JCQlyZXR1cm4gU2hvcnQuVFlQRTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihiZWFuICE9IG51bGwgPyBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUZFTFNFX0lHTk9SRSA9ICJJRi9FTFNFIElHTk9SRSI7CS8vIEZsYWcgZm9yIGlmL2Vsc2UgaW4gaW5nb3JlIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBpZkVsc2VOZXN0aW5nID0gMDsJLy8gTmVzdGluZyBvZiBpZi9lbHNlIGV4cHJlc3Npb25zLgotCXByaXZhdGUgaW50IGlmRWxzZUlnbm9yZU5lc3RDb3VudCA9IDA7CS8vIFdoZW4gaWdub3JpbmcgaWYvZWxzZSBleHByZXNzaW9ucywgaWdub3JlIHVudGlsIHRoaXMgbmVzdCBjb3VudC4KLQlwcml2YXRlIGJvb2xlYW4gaWZFbHNlU2tpcFRydWVQYXJ0OwotCi0JCi0JLyoqCi0JICogUHVzaCBhbiBpZiB0ZXN0IGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGhhc0Vsc2VDbGF1c2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoSWZFbHNlKCkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vIFNsaWdodGx5IGRpZmZlcmVudCBoZXJlIGluIHRoYXQgaWYgYW4gaWdub3Jpbmcgb2NjdXJyZWQgd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIGF0IGxlYXN0IHBhcnQgb2YgaXQgc28gdGhhdAotCQkJCS8vIHdlIGNhbiBnZXQgdGhlIGV4cHJlc3Npb24gZ3JvdXBpbmcgY29ycmVjdC4KLQkJCQlpZkVsc2VOZXN0aW5nKys7CS8vIFdlIGhhdmUgdGhlIHRlc3QuCi0JCi0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiSWYgdGVzdCBjb25kaXRpb24iLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkJCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgY29uZGl0aW9uID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIHR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJaWYgKHR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQl0aHJvd0NsYXNzQ2FzdChCb29sZWFuLlRZUEUsIGNvbmRpdGlvbik7Ci0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiIFRlc3QgUmVzdWx0PSIrY29uZGl0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQkJCWluZGVudCh0cnVlKTsKLQkJCQkJcHJpbnRUcmFjZSgiQmVnaW4gVHJ1ZSBFeHByZXNzaW9uLiIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJCQlpbmRlbnQodHJ1ZSk7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoKChCb29sZWFuKSBjb25kaXRpb24pLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCS8vIENvbmRpdGlvbiB3YXMgdHJ1ZS4KLQkJCQkJLy8gRG8gbm90aGluZy4gTGV0IHRydWUgY29uZGl0aW9uIGJlIHByb2Nlc3NlZC4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb25kaXRpb24gd2FzIGZhbHNlLgotCQkJCQlpZkVsc2VTa2lwVHJ1ZVBhcnQgPSB0cnVlOwkvLyBUZWxsIHRoZSB0cnVlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IElGRUxTRV9JR05PUkU7Ci0JCQkJCWlmRWxzZUlnbm9yZU5lc3RDb3VudCA9IGlmRWxzZU5lc3Rpbmc7Ci0JCQkJfQotCQkJCS8vIFdlIGRvbid0IHB1dCBhbnl0aGluZyBiYWNrIG9uIHRoZSBzdGFjayBiZWNhdXNlIHRoZSBjb25kaXRpb24gdGVzdCBpcyBub3QgZXZlciByZXR1cm5lZC4KLQkJCQkvLyBUaGUgYXBwcm9wcmlhdGUgdHJ1ZSBvciBmYWxzZSBjb25kaXRpb24gZXZhbHVhdGlvbiB3aWxsIGJlIGxlZnQgb24gdGhlIHN0YWNrLgotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVzaCBhbiBpZi9lbHNlIGNsYXVzZS4gSXQgY2FuIGJlIGFueSBjbGF1c2Ugb2YgdGhlIGlmICh0cnVlLCBvciBmYWxzZSBjbGF1c2UpLgotCSAqIEBwYXJhbSBjbGF1c2VUeXBlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaElmRWxzZShJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGNsYXVzZVR5cGUpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaWdub3JlID0gdHJ1ZTsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFNsaWdodGx5IGRpZmZlcmVudCBoZXJlIGluIHRoYXQgaWYgYW4gaWdub3Jpbmcgb2NjdXJyZWQgd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIGF0IGxlYXN0IHBhcnQgb2YgaXQgc28gdGhhdAotCQkJLy8gd2UgY2FuIGdldCB0aGUgZXhwcmVzc2lvbiBncm91cGluZyBjb3JyZWN0LgotCQkJc3dpdGNoIChjbGF1c2VUeXBlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5UUlVFX0NMQVVTRV9WQUxVRToKLQkJCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJCQlwcmludFRyYWNlKCJCZWdpbiBGYWxzZSBFeHByZXNzaW9uLiIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCQkJCWluZGVudCh0cnVlKTsKLQkJCQkJfQotCQkJCQlpZiAoaWZFbHNlU2tpcFRydWVQYXJ0ICYmIGlnbm9yZUV4cHJlc3Npb24gPT0gSUZFTFNFX0lHTk9SRSAmJiBpZkVsc2VJZ25vcmVOZXN0Q291bnQgPT0gaWZFbHNlTmVzdGluZykgewotCQkJCQkJLy8gc3RvcCBpZ25vcmluZywgd2UndmUgaWdub3JlZCB0aGUgdHJ1ZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJCXJldHVybjsgLy8gSG93ZXZlciwgbGVhdmUgYmVjYXVzZSBzaW5jZSB0aGlzIGNvbmRpdGlvbiB3YXMgaWdub3JlZC4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuRUxTRV9DTEFVU0VfVkFMVUU6Ci0JCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCQkJaW5kZW50KGZhbHNlKTsKLQkJCQkJCXByaW50VHJhY2UoIkVuZCBJRi9FTFNFIEV4cHJlc3Npb24uIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJCQl9CQkJCQkKLQkJCQkJaW50IGN1cnJlbnROZXN0aW5nID0gaWZFbHNlTmVzdGluZy0tOwotCQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBJRkVMU0VfSUdOT1JFICYmIGlmRWxzZUlnbm9yZU5lc3RDb3VudCA9PSBjdXJyZW50TmVzdGluZykgewotCQkJCQkJLy8gc3RvcCBpZ25vcmluZywgd2UndmUgaWdub3JlZCB0aGUgZmFsc2UgY29uZGl0aW9uIG9mIGludGVyZXN0LgotCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47IC8vIEhvd2V2ZXIsIGxlYXZlIGJlY2F1c2Ugc2luY2UgdGhpcyBjb25kaXRpb24gd2FzIGlnbm9yZWQuCi0JCQkJCX0KLQkJCX0KLQkKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0KLQkJCQkJCi0JCQl0cnkgewotCQkJCXN3aXRjaCAoY2xhdXNlVHlwZS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5UUlVFX0NMQVVTRV9WQUxVRToKLQkJCQkJCWlmRWxzZVNraXBUcnVlUGFydCA9IGZhbHNlOwkvLyBUZWxsIHRoZSBmYWxzZSBjb25kaXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gSUZFTFNFX0lHTk9SRTsKLQkJCQkJCWlmRWxzZUlnbm9yZU5lc3RDb3VudCA9IGlmRWxzZU5lc3Rpbmc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLkVMU0VfQ0xBVVNFX1ZBTFVFOgotCQkJCQkJLy8gVGhlcmUncyBub3RoaW5nIHRvIGRvLCBpZiBpdCB3YXMgaWdub3JlZCBkdWUgdG8gdHJ1ZSwgd2Ugd291bGRuJ3Qgb2YgZ290dG9uIGhlcmUuCi0JCQkJCQkvLyBJZiBpdCB3YXNuJ3QgaWdub3JlZCwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBmYWxzZSBleHByZXNzaW9uIGlzIG9uIHRoZSBzdGFjaywgd2hpY2ggaXMgd2hhdCBpdCBzaG91bGQgYmUuCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgaW5zdGFuY2VvZiBleHByZXNzaW9uLiAgVGhlIHR5cGUgcGFzc2VkIGluIGlzIGVpdGhlciBhIFN0cmluZyAod2l0aCBjbGFzc25hbWUgdG8gdGVzdCBhZ2FpbnN0KSBvciB0aGUKLQkgKiB0eXBlIHRvIHRlc3QgYWdhaW5zdC4KLQkgKiBAcGFyYW0gdHlwZSBUbyB0ZXN0IGFnYWluc3QuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEluc3RhbmNlb2YoQ2xhc3MgdHlwZSkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiSW5zdGFuY2VvZiB0eXBlOiAiK3R5cGUsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCU9iamVjdCBleHAgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgZXhwdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKEJvb2xlYW4udmFsdWVPZihpc0luc3RhbmNlKHR5cGUsIGV4cCwgZXhwdHlwZSkpLCBCb29sZWFuLlRZUEUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgaWYgaW5zdGFuY2Ugb2YuIEl0IHdpbGwgbWFrZSBzdXJlIHRoYXQgcHJpbWl0aXZlIHRvIG5vbi1wcmltaXRpdmUgaXMgbm90IHBlcm1pdHRlZC4KLQkgKiBUaGlzIGlzIGEgdHJ1ZSBpbnN0YW5jZSBvZiwgd2hpY2ggbWVhbnMgbnVsbCBJUyBOT1QgQU4gaW5zdGFuY2Ugb2YgYW55IHR5cGUuIFRoaXMgaXMKLQkgKiBkaWZmZXJlbnQgdGhlbiBhc3NpZ25hYmxlIGZyb20sIGluIHRoYXQgY2FzZSBudWxsIGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgY2xhc3MgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZG8gaXNJbnN0YW5jZS4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyBleGNlcHRpb25zLgotCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0luc3RhbmNlKENsYXNzIHR5cGUsIE9iamVjdCBiZWFuLCBDbGFzcyBiZWFuVHlwZSkgewotCQlpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJcmV0dXJuIGJlYW5UeXBlLmlzUHJpbWl0aXZlKCkgJiYgdHlwZSA9PSBiZWFuVHlwZTsJLy8gQ2FuJ3QgdXNlIGlzSW5zdGFuY2UgYmVjYXVzZSBmb3IgYSBwcmltaXRpdmUgdHlwZSBpc0luc3RhbmNlIHJldHVybnMgZmFsc2UuCi0JCWVsc2UgCi0JCQlyZXR1cm4gdHlwZS5pc0luc3RhbmNlKGJlYW4pOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIG5ldyBpbnN0YW5jZSBmcm9tIHN0cmluZy4KLQkgKiBAcGFyYW0gaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkgKiBAcGFyYW0gcmVzdWx0VHlwZSBleHBlY3RlZCByZXN1bHQgdHlwZS4gSWYgaXQgaXNuJ3Qgb2YgdGhhdCB0eXBlLCBhIGNsYXNzY2FzdCB3aWxsIGJlIHByb2Nlc3NlZC4gCi0JICogQHBhcmFtIGNsYXNzbG9hZGVyIGNsYXNzbG9hZGVyIHRvIHVzZSBmb3IgZmluZGluZyBjbGFzc2VzLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgY2xhc3Nsb2FkZXIgb2YgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaE5ld0luc3RhbmNlRnJvbVN0cmluZyhTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIENsYXNzIHJlc3VsdFR5cGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJOZXcgaW5zdGFuY2UgZnJvbSBzdHJpbmc6IFwiIitpbml0aWFsaXphdGlvblN0cmluZysiXCIgVHlwZT0iK3Jlc3VsdFR5cGUsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgcGFyc2VyID0gSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuY3JlYXRlUGFyc2VyKGluaXRpYWxpemF0aW9uU3RyaW5nLCBjbGFzc2xvYWRlcik7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gcGFyc2VyLmV2YWx1YXRlKCk7Ci0JCQkJbmV3VmFsdWUgPSBjYXN0QmVhbihyZXN1bHRUeXBlLCBuZXdWYWx1ZSwgcGFyc2VyLmdldEV4cGVjdGVkVHlwZSgpKTsKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKG5ld1ZhbHVlLCByZXN1bHRUeXBlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFB1c2ggcHJlZml4IGV4cHJlc3Npb24uCi0JICogQHBhcmFtIG9wZXJhdG9yIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hQcmVmaXgoUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJQcmVmaXg6IFwnIitvcGVyYXRvcisiXCciLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAob3BlcmF0b3IgPT0gUHJlZml4T3BlcmF0b3IuUFJFX1BMVVMpCi0JCQkJcmV0dXJuOwkvLyBEbyBub3RoaW5nLiAiKyIgZG9lc24ndCBhZmZlY3QgdGhlIHJlc3VsdCBvZiB0aGUgY3VycmVudCB0b3AgZXhwcmVzc2lvbi4KLQkKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2UoIlByZWZpeDogXCciK29wZXJhdG9yKyJcJyAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgZXhwID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIGV4cHR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJaWYgKCFleHB0eXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCXRocm93SW52YWxpZFByZWZpeChvcGVyYXRvciwgZXhwKTsKLQkJCQkKLQkJCQlpbnQgcHJpbVR5cGVFbnVtID0gZ2V0RW51bUZvclByaW1pdGl2ZShleHB0eXBlKTsKLQkJCQlzd2l0Y2ggKG9wZXJhdG9yLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBQcmVmaXhPcGVyYXRvci5QUkVfTUlOVVNfVkFMVUU6Ci0JCQkJCQlzd2l0Y2ggKHByaW1UeXBlRW51bSkgewotCQkJCQkJCWNhc2UgQk9PTEVBTjoKLQkJCQkJCQkJdGhyb3dJbnZhbGlkUHJlZml4KG9wZXJhdG9yLCBleHApOwkJCQkJCQotCQkJCQkJCWNhc2UgQllURToKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIoLSgoTnVtYmVyKSBleHApLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBDSEFSOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcigtKChDaGFyYWN0ZXIpIGV4cCkuY2hhclZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIERPVUJMRToKLQkJCQkJCQkJZXhwID0gbmV3IERvdWJsZSgtKChOdW1iZXIpIGV4cCkuZG91YmxlVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJCQkJCWV4cCA9IG5ldyBGbG9hdCgtKChOdW1iZXIpIGV4cCkuZmxvYXRWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJTlQ6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKC0oKE51bWJlcikgZXhwKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBMT05HOgotCQkJCQkJCQlleHAgPSBuZXcgTG9uZygtKChOdW1iZXIpIGV4cCkubG9uZ1ZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFNIT1JUOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcigtKChOdW1iZXIpIGV4cCkuc2hvcnRWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlleHB0eXBlID0gZ2V0UHJpbWl0aXZlVHlwZShleHApOwkvLyBJdCBjYW4gYWN0dWFsbHkgY2hhbmdlIHRoZSB0eXBlLgkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgUHJlZml4T3BlcmF0b3IuUFJFX0NPTVBMRU1FTlRfVkFMVUU6Ci0JCQkJCQlzd2l0Y2ggKHByaW1UeXBlRW51bSkgewotCQkJCQkJCWNhc2UgQk9PTEVBTjoKLQkJCQkJCQljYXNlIERPVUJMRToKLQkJCQkJCQljYXNlIEZMT0FUOgotCQkJCQkJCQl0aHJvd0ludmFsaWRQcmVmaXgob3BlcmF0b3IsIGV4cCk7CQkJCQkJCi0JCQkJCQkJY2FzZSBCWVRFOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcih+KChOdW1iZXIpIGV4cCkuYnl0ZVZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIENIQVI6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKH4oKENoYXJhY3RlcikgZXhwKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSU5UOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcih+KChOdW1iZXIpIGV4cCkuaW50VmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgTE9ORzoKLQkJCQkJCQkJZXhwID0gbmV3IExvbmcofigoTnVtYmVyKSBleHApLmxvbmdWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTSE9SVDoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIofigoTnVtYmVyKSBleHApLnNob3J0VmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZXhwdHlwZSA9IGdldFByaW1pdGl2ZVR5cGUoZXhwKTsJLy8gSXQgY2FuIGFjdHVhbGx5IGNoYW5nZSB0aGUgdHlwZS4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFByZWZpeE9wZXJhdG9yLlBSRV9OT1RfVkFMVUU6Ci0JCQkJCQlzd2l0Y2ggKHByaW1UeXBlRW51bSkgewotCQkJCQkJCWNhc2UgQk9PTEVBTjoKLQkJCQkJCQkJZXhwID0gISgoQm9vbGVhbikgZXhwKS5ib29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQllURToKLQkJCQkJCQljYXNlIENIQVI6Ci0JCQkJCQkJY2FzZSBET1VCTEU6Ci0JCQkJCQkJY2FzZSBGTE9BVDoKLQkJCQkJCQljYXNlIElOVDoKLQkJCQkJCQljYXNlIExPTkc6Ci0JCQkJCQkJY2FzZSBTSE9SVDoKLQkJCQkJCQkJdGhyb3dJbnZhbGlkUHJlZml4KG9wZXJhdG9yLCBleHApOwkJCQkJCQotCQkJCQkJfQkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZShleHAsIGV4cHR5cGUpOwotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoZXhwLCBleHB0eXBlKTsJLy8gUHVzaCB0aGUgcmVzdWx0IGJhY2sgb24gdGhlIHN0YWNrLgotCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSAKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmlnaHQgZXhwcmVzc2lvbiB0byB0aGUgbGVmdCBleHByZXNzaW9uLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hBc3NpZ25tZW50KCkgewotCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpIHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJcHJpbnRUcmFjZSgiQXNzaWdubWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJLy8gS0xVREdFOiBUaGUgb25seSByZWFzb24gbGVmdFZhbHVlL3JlZlR5cGUgYXJlIG91dHNpZGUgb2YgdHJ5L2ZpbmFsbHkgaXMgYmVjYXVzZQotCQkJLy8gb2YgdHJhY2luZy4gcHVzaEV4cHJlc3Npb24oKSBkb2VzIGl0cyBvd24gdHJhY2Ugc3RhdGVtZW50cywgc28gd2UgbmVlZCB0byBlbmQKLQkJCS8vIG91ciB0cmFjZSBiZWZvcmUgY2FsbGluZyBwdXNoRXhwcmVzc2lvbi4gCi0JCQlPYmplY3QgbGVmdFZhbHVlOwotCQkJQ2xhc3MgcmVmVHlwZTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIkFzc2lnbm1lbnQ6ICIsIGZhbHNlKTsJCQkgLy8kTk9OLU5MUy0xJAkKLQkJCQkvLyBUaGUgb3JkZXIgb24gdGhlIHN0YWNrIGlzIHJpZ2h0IHRoZW4gbGVmdCBvcGVyYW5kLgotCQkJCS8vIEZpcnN0IHRoZSByaWdodCBvcGVyYW5kCi0JCQkJT2JqZWN0IHZhbHVlID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIHR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0KLQkJCQkvLyBOZXh0IHRoZSBsZWZ0IG9wZXJhbmQsIHNob3VsZCBiZSBhIHJlZmVyZW5jZS4KLQkJCQlWYXJpYWJsZVJlZmVyZW5jZSBsZWZ0ID0gKFZhcmlhYmxlUmVmZXJlbmNlKSBwb3BFeHByZXNzaW9uKGZhbHNlKTsgLy8gRG9uJ3QgZGVyZWZlcmVuY2UgaXQuCi0JCQkJcmVmVHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludE9iamVjdEFuZFR5cGUobGVmdCwgcmVmVHlwZSk7Ci0KLQkJCQlsZWZ0VmFsdWUgPSBsZWZ0LnNldCh2YWx1ZSwgdHlwZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIE5vdyBkbyBhc3NpZ25tZW50IGFuZCByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBzdGFjay4KLQkJCXB1c2hFeHByZXNzaW9uKGxlZnRWYWx1ZSwgcmVmVHlwZSk7CS8vIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgaXMgdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4KLQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCQotCX0KLQkKLQkvKioKLQkgKiBBc3NpZ24gdGhlIGV4cHJlc3Npb24gcHJveHkgdG8gdGhlIHRvcCBleHByZXNzaW9uIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hBc3NpZ25tZW50KEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJcHJpbnRUcmFjZSgiQXNzaWduIHRvIFByb3h5ICMiK3Byb3h5LmdldFByb3h5SUQoKSwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJYXNzaWduVG9FeHByZXNzaW9uUHJveHlGcm9tVG9wU3RhY2tFbnRyeShwcm94eSk7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZShwcm94eS5nZXRWYWx1ZSgpLCBwcm94eS5nZXRUeXBlKCkpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIHRvcCBzdGFjayBlbnRyeSB0byB0aGUgbmV3IGV4cHJlc3Npb24gcHJveHkgYW5kIGFsbG9jYXRlIGl0IGZvciBjYWxsYmFjayBsYXRlci4KLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNzaWduVG9FeHByZXNzaW9uUHJveHlGcm9tVG9wU3RhY2tFbnRyeShJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0RXhwcmVzc2lvbigxKTsKLQkJQ2xhc3MgdHlwZSA9IGdldEV4cHJlc3Npb25UeXBlKDEsIHRydWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBWYXJpYWJsZVJlZmVyZW5jZSkKLQkJCXZhbHVlID0gKChWYXJpYWJsZVJlZmVyZW5jZSkgdmFsdWUpLmRlcmVmZXJlbmNlKCk7CS8vIEhlcmUgd2Ugd2FudCB0aGUgZmluYWwgY3VycmVudCB2YWx1ZS4KLQotCQlwcm94eS5zZXRQcm94eSh2YWx1ZSwgdHlwZSk7Ci0JCWFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHByb3h5KTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvY2F0ZSBhbiBleHByZXNzaW9uIHByb3h5LiBUaGlzIGlzIHVzZWQgdG8gbWFrZSBhbiBleHByZXNzaW9uIHByb3h5IGtub3duIHRvIHRoZSBwcm9jZXNzb3IuIFRoZSBleHByZXNzaW9uIHByb3h5IG11c3QKLQkgKiBoYXZlIGJlZW4gc2V0UHJveHkoKSBhdCB0aGlzIHBvaW50LiBUaGlzIGlzIHVzZWQgdG8gYXNzaWduIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgb3IgdG8gYWRkIGZyb20gb3V0c2lkZSBhbiBldmFsdWF0ZWQgcHJveHkKLQkgKiB0byBiZSB1c2VkIGxhdGVyIGJ5IG90aGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQlpbnQgbWluU2l6ZSA9IHByb3h5LmdldFByb3h5SUQoKSsxOwotCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgPT0gbnVsbCkKLQkJCWV4cHJlc3Npb25Qcm94aWVzID0gbmV3IEFycmF5TGlzdChtaW5TaXplKzEwKTsJLy8gQWxsb3cgcm9vbSB0byBncm93IHRlbiBtb3JlLgotCQllbHNlIGlmIChleHByZXNzaW9uUHJveGllcy5zaXplKCkgPCBtaW5TaXplKQotCQkJZXhwcmVzc2lvblByb3hpZXMuZW5zdXJlQ2FwYWNpdHkobWluU2l6ZSsxMCk7CS8vIEFsbG93IHJvb20gdG8gZ3JvdyB0ZW4gbW9yZS4KLQkJaW50IGZpbGwgPSBtaW5TaXplLWV4cHJlc3Npb25Qcm94aWVzLnNpemUoKTsJLy8gTnVtYmVyIG9mICJudWxsIiBmaWxsIGVudHJpZXMgbmVlZGVkLiBQcm9iYWJseSBzaG91bGRuJ3Qgb2NjdXIsIGJ1dCB0byBiZSBzYWZlLgotCQlpZiAoZmlsbCA+IDApIHsKLQkJCXdoaWxlICgtLWZpbGwgPiAwKQotCQkJCWV4cHJlc3Npb25Qcm94aWVzLmFkZChudWxsKTsKLQkJCWV4cHJlc3Npb25Qcm94aWVzLmFkZChwcm94eSk7Ci0JCX0gZWxzZQotCQkJZXhwcmVzc2lvblByb3hpZXMuc2V0KHByb3h5LmdldFByb3h5SUQoKSwgcHJveHkpOwkvLyBBbHJlYWR5IGxhcmdlIGVub3VnaCwgcmVwbGFjZSBlbnRyeS4KLQotCX0KLQotCS8qKgotCSAqIFRoZSBwcmltaXRpdmUgZW51bXMuIAotCSAqIE5PVEU6IFRoZWlyIG9yZGVyIG11c3Qgbm90IGNoYW5nZWQuIFRoZXkgYXJlIGluIG9yZGVyIG9mIHBlcm1pdHRlZCB3aWRlbmluZy4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludAotCQlCT09MRUFOID0gMCwKLQkJQllURSA9IDEsCi0JCVNIT1JUID0gMiwJCi0JCUNIQVIgPSAzLAotCQlJTlQgPSA0LAotCQlMT05HID0gNSwKLQkJRkxPQVQgPSA2LAotCQlET1VCTEUgPSA3OwotCQkKLQkJCi0JCi0JLyoqCi0JICogR2V0IHRoZSBlbnVtIGNvbnN0YW50IGZvciB0aGUgdHlwZSBvZiBwcmltaXRpdmUgcGFzc2VkIGluLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIGVudW0gZm9yIHRoZSBwcmltaXRpdmUgdHlwZS4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCi0JICogQHBhcmFtIHByaW1pdGl2ZVR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCi0JICogCi0JICogQHNlZSBFeHByZXNzaW9uUHJvY2Vzc2VyI0JPT0xFQU4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEVudW1Gb3JQcmltaXRpdmUoQ2xhc3MgcHJpbWl0aXZlVHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChwcmltaXRpdmVUeXBlID09IEJvb2xlYW4uVFlQRSkKLQkJCXJldHVybiBCT09MRUFOOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IEludGVnZXIuVFlQRSkKLQkJCXJldHVybiBJTlQ7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQnl0ZS5UWVBFKQotCQkJcmV0dXJuIEJZVEU7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUpCi0JCQlyZXR1cm4gQ0hBUjsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBEb3VibGUuVFlQRSkKLQkJCXJldHVybiBET1VCTEU7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gRmxvYXQuVFlQRSkKLQkJCXJldHVybiBGTE9BVDsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBMb25nLlRZUEUpCi0JCQlyZXR1cm4gTE9ORzsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBTaG9ydC5UWVBFKQotCQkJcmV0dXJuIFNIT1JUOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZVR5cGUgIT0gbnVsbCA/IHByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpIDogIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGhyb3dJbnZhbGlkUHJlZml4KFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yLCBPYmplY3QgZXhwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5JbnZhbGlkT3BlcmFuZE9mUHJlZml4T3BlcmF0b3JfRVhDXyIpLCBuZXcgT2JqZWN0W10ge2V4cCAhPSBudWxsID8gZXhwLnRvU3RyaW5nKCkgOiBudWxsLCBvcGVyYXRvci50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCi0JfQkJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElORklYX0lHTk9SRSA9ICJJTkZJWCBJR05PUkUiOwkvLyBGbGFnIGZvciBpbmZpeCBpbiBpbmdvcmUgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IGluZml4TmVzdGluZyA9IDA7CS8vIE5lc3Rpbmcgb2YgaW5maXggZXhwcmVzc2lvbnMuCi0JcHJpdmF0ZSBpbnQgaW5maXhJZ25vcmVOZXN0Q291bnQgPSAwOwkvLyBXaGVuIGlnbm9yaW5nIGluZml4IGV4cHJlc3Npb25zLCBpZ25vcmUgdW50aWwgdGhpcyBuZXN0IGNvdW50LgotCS8qKgotCSAqIFB1c2ggdGhlIGluZml4IGV4cHJlc3Npb24gb250byB0aGUgc3RhY2suCi0JICogQHBhcmFtIG9wZXJhdG9yCi0JICogQHBhcmFtIG9wZXJhbmRUeXBlIFRoZSBvcGVyYXRvciB0eXBlLiBMZWZ0LCByaWdodCwgb3RoZXIuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEluZml4KEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBvcGVyYW5kVHlwZSkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlpZiAoZXJyb3JPY2N1cnJlZCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vIFNsaWdodGx5IGRpZmZlcmVudCBoZXJlIGluIHRoYXQgaWYgYW4gaWdub3JlZCBvY2N1cnJlZCB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgYXQgbGVhc3QgcGFydCBvZiBpdCBzbyB0aGF0Ci0JCQkJLy8gd2UgY2FuIGdldCB0aGUgZXhwcmVzc2lvbiBncm91cGluZyBjb3JyZWN0LgotCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQlpbmZpeE5lc3RpbmcrKzsKLQkJCQllbHNlIGlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEFTVF9PUEVSQU5EKSB7Ci0JCQkJCWludCBjdXJyZW50TmVzdCA9IGluZml4TmVzdGluZy0tOwotCQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBJTkZJWF9JR05PUkUgJiYgY3VycmVudE5lc3QgPT0gaW5maXhJZ25vcmVOZXN0Q291bnQpIHsKLQkJCQkJCS8vIFdlIHdlcmUgaWdub3JpbmcsIGFuZCBpdCB3YXMgdGhpcyBleHByZXNzaW9uIHRoYXQgd2FzIGJlaW5nIGlnbm9yZS4KLQkJCQkJCS8vIFdlIGhhdmUgcmVjZWl2ZWQgdGhlIGxhc3Qgb3BlcmFuZCBvZiB0aGUgbmVzdGVkIGV4cHJlc3Npb24gdGhhdCB3YXMgYmVpbmcgaWdub3JlZCwKLQkJCQkJCS8vIHNvIHdlIGNhbiBzdG9wIGlnbm9yaW5nLiBCdXQgd2Ugc3RpbGwgbGVhdmUgc2luY2UgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIG9uIHRoZQotCQkJCQkJLy8gdG9wIG9mIHRoZSBzdGFjay4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIkluZml4OiAiK29wZXJhdG9yLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IHJpZ2h0ID0gbnVsbDsKLQkJCQlDbGFzcyByaWdodFR5cGUgPSBudWxsOwotCQkJCWlmIChvcGVyYW5kVHlwZSAhPSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKSB7Ci0JCQkJCS8vIFdlIGFyZSBub3QgdGhlIGxlZnQgb3BlcmFuZCwgc28gdGhlIHN0YWNrIGhhcyB0aGUgcmlnaHQgb24gdGhlIHRvcCwgZm9sbG93ZWQgYnkgdGhlIGxlZnQuCi0JCQkJCXJpZ2h0ID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlyaWdodFR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfSAKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgdmFsdWVUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQotCQkJCXN3aXRjaCAob3BlcmF0b3IuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fQU5EX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0FORCk7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9BTkQpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgJiBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpICYgZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkRfVkFMVUU6Ci0JCQkJCQkvLyBUaGlzIGlzIHRyaWNreS4KLQkJCQkJCS8vIEZpcnN0IGlmIHRoaXMgaXMgbGVmdCB0eXBlLCB0aGVuIGp1c3QgY29udGludWUuCi0JCQkJCQkvLyBFbHNlIGlmIHRoaXMgb3RoZXIgb3IgbGFzdCwgdGhlbiBuZWVkIHRvIG1ha2UgaXQgdGhlIG5ldyB2YWx1ZS4KLQkJCQkJCWlmIChvcGVyYW5kVHlwZSAhPSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKSB7Ci0JCQkJCQkJdmFsdWUgPSByaWdodDsKLQkJCQkJCQl2YWx1ZVR5cGUgPSByaWdodFR5cGU7Ci0JCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkvL0lmIHRoZSB2YWx1ZSBpcyBub3cgZmFsc2UsIHdlIG5lZWQgdG8gaWdub3JlIHRoZSByZXN0LgotCQkJCQkJaWYgKHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUpCi0JCQkJCQkJdGhyb3dJbnZhbGlkSW5maXgob3BlcmF0b3IsIHZhbHVlKTsKLQkJCQkJCWlmICghKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgJiYgb3BlcmFuZFR5cGUgIT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xBU1RfT1BFUkFORCkKLQkJCQkJCQlzdGFydEluZml4SWdub3JlKCk7CS8vIFN0YXJ0IGlnbm9yaW5nIGJlY2F1c2Ugd2Uga25vdyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYXQgdGhpcyBwb2ludC4gSXQgaXMgZmFsc2UuCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SX1ZBTFVFOgotCQkJCQkJLy8gVGhpcyBpcyB0cmlja3kuCi0JCQkJCQkvLyBGaXJzdCBpZiB0aGlzIGlzIGxlZnQgdHlwZSwgdGhlbiBqdXN0IGNvbnRpbnVlLgotCQkJCQkJLy8gRWxzZSBpZiB0aGlzIG90aGVyIG9yIGxhc3QsIHRoZW4gbmVlZCB0byBtYWtlIGl0IHRoZSBuZXcgdmFsdWUuCi0JCQkJCQlpZiAob3BlcmFuZFR5cGUgIT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkgewotCQkJCQkJCXZhbHVlID0gcmlnaHQ7Ci0JCQkJCQkJdmFsdWVUeXBlID0gcmlnaHRUeXBlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvL0lmIHRoZSB2YWx1ZSBpcyBub3cgdHJ1ZSwgd2UgbmVlZCB0byBpZ25vcmUgdGhlIHJlc3QuCi0JCQkJCQlpZiAodmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJCQl0aHJvd0ludmFsaWRJbmZpeChvcGVyYXRvciwgdmFsdWUpOwotCQkJCQkJaWYgKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpICYmIG9wZXJhbmRUeXBlICE9IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MQVNUX09QRVJBTkQpCi0JCQkJCQkJc3RhcnRJbmZpeElnbm9yZSgpOyAvLyBTdGFydCBpZ25vcmluZyBiZWNhdXNlIHdlIGtub3cgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGF0IHRoaXMgcG9pbnQuIEl0IGlzIHRydWUuCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0RJVklERV9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fRElWSURFKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIHRoZSByZXN1bHQgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGdldERvdWJsZSh2YWx1ZSkgLyBnZXREb3VibGUocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBEb3VibGUuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gbmV3IEZsb2F0KGdldEZsb2F0KHZhbHVlKSAvIGdldEZsb2F0KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRmxvYXQuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSAvIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCByZXN1bHQgaW4gYW4gaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSAvIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGV4dGVuZGVkIG9wZXJhdG9yIGZvciB0aGlzLCBidXQgd2UnbGwgaWdub3JlIHRoZSBwb3NzaWJpbGl0eS4KLQkJCQkJCWlmICh2YWx1ZVR5cGUuaXNQcmltaXRpdmUoKSAmJiByaWdodFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCS8vIFByaW1pdGl2ZXMgcmVxdWlyZSBtb3JlIHRlc3RpbmcgdGhhbiBqdXN0ID09LiBib29sZWFuIHByaW1pdGl2ZXMgCi0JCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBCb29sZWFuLlRZUEUgfHwgcmlnaHRUeXBlID09IEJvb2xlYW4uVFlQRSkgewotCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBhIGJvb2xlYW4sIHRoZW4gdGhlIG90aGVyIHNpZGUgbmVlZHMgdG8gYmUgYm9vbGVhbiBmb3IgaXQgdG8gZXZlbiB0cnkgdG8gYmUgdHJ1ZS4KLQkJCQkJCQkJaWYgKHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUgfHwgdmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJCQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJdmFsdWUgPSAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgPT0gKChCb29sZWFuKSByaWdodCkuYm9vbGVhblZhbHVlKCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBOb3cgZG8gbnVtYmVyIHRlc3RzIHNpbmNlIG5vdCBib29sZWFuIHByaW1pdGl2ZSwgb25seSBudW1iZXJzIGFyZSBsZWZ0Ci0JCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgYXMgZG91YmxlLgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSA9PSBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIGFzIGZsb2F0LgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpID09IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIGNvbXBhcmUgYXMgbG9uZy4KLQkJCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpID09IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgY29tcGFyZSBhcyBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpID09IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlLmlzUHJpbWl0aXZlKCkgfHwgcmlnaHRUeXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCQkJdmFsdWUgPSBCb29sZWFuLkZBTFNFOwkvLyBDYW4ndCBiZSB0cnVlIGlmIG9uZSBzaWRlIHByaW0gYW5kIHRoZSBvdGhlciBpc24ndAotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gSnVzdCBkbyBvYmplY3QgPT0KLQkJCQkJCQl2YWx1ZSA9ICh2YWx1ZSA9PSByaWdodCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfQotCQkJCQkJdmFsdWVUeXBlID0gQm9vbGVhbi5UWVBFOwkvLyBXZSBrbm93IHJlc3VsdCB3aWxsIGJlIGEgYm9vbGVhbi4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUik7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUik7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpID4gZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpID4gZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIGNvbXBhcmUgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpID4gZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBjb21wYXJlIHdpbGwgYmUgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgPiBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9FUVVBTFMpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgPj0gZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpID49IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCBjb21wYXJlIHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSA+PSBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGNvbXBhcmUgd2lsbCBiZSBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSA+PSBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9MRUZUX1NISUZUX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlQpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVCk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSA8PCBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpIDw8IGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fTEVTU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVTUyk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVTUyk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpIDwgZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpIDwgZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIGNvbXBhcmUgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpIDwgZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBjb21wYXJlIHdpbGwgYmUgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgPCBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVTU19FUVVBTFMpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgPD0gZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpIDw9IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCBjb21wYXJlIHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSA8PSBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGNvbXBhcmUgd2lsbCBiZSBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSA8PSBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9NSU5VU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCB0aGUgcmVzdWx0IHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShnZXREb3VibGUodmFsdWUpIC0gZ2V0RG91YmxlKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRG91YmxlLlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdChnZXRGbG9hdCh2YWx1ZSkgLSBnZXRGbG9hdChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEZsb2F0LlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgLSBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgcmVzdWx0IGluIGFuIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgLSBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCS8vIFdlIHNob3VsZCBuZXZlciBnZXQgZXh0ZW5kZWQgb3BlcmF0b3IgZm9yIHRoaXMsIGJ1dCB3ZSdsbCBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5LgotCQkJCQkJaWYgKHZhbHVlVHlwZS5pc1ByaW1pdGl2ZSgpICYmIHJpZ2h0VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJLy8gUHJpbWl0aXZlcyByZXF1aXJlIG1vcmUgdGVzdGluZyB0aGFuIGp1c3QgPT0uIGJvb2xlYW4gcHJpbWl0aXZlcyAKLQkJCQkJCQlpZiAodmFsdWVUeXBlID09IEJvb2xlYW4uVFlQRSB8fCByaWdodFR5cGUgPT0gQm9vbGVhbi5UWVBFKSB7Ci0JCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGEgYm9vbGVhbiwgdGhlbiB0aGUgb3RoZXIgc2lkZSBuZWVkcyB0byBiZSBib29sZWFuIGZvciBpdCB0byBldmVuIHRyeSB0byBiZSB0cnVlLgotCQkJCQkJCQlpZiAodmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSB8fCB2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCQkJdmFsdWUgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXZhbHVlID0gKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpICE9ICgoQm9vbGVhbikgcmlnaHQpLmJvb2xlYW5WYWx1ZSgpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gTm93IGRvIG51bWJlciB0ZXN0cyBzaW5jZSBub3QgYm9vbGVhbiBwcmltaXRpdmUsIG9ubHkgbnVtYmVycyBhcmUgbGVmdAotCQkJCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIGFzIGRvdWJsZS4KLQkJCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgIT0gZ2V0RG91YmxlKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgY29tcGFyZSBhcyBmbG9hdC4KLQkJCQkJCQkJCXZhbHVlID0gKGdldEZsb2F0KHZhbHVlKSAhPSBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSBjb21wYXJlIGFzIGxvbmcuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRMb25nKHZhbHVlKSAhPSBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gRWxzZSBpdCB3aWxsIGNvbXBhcmUgYXMgaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSAhPSBnZXRJbnQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IHJpZ2h0VHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOwkvLyBNdXN0IGJlIHRydWUgaWYgb25lIHNpZGUgcHJpbSBhbmQgdGhlIG90aGVyIGlzbid0Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBKdXN0IGRvIG9iamVjdCAhPQotCQkJCQkJCXZhbHVlID0gKHZhbHVlICE9IHJpZ2h0KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9PUl9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9PUik7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9PUik7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSB8IGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgfCBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1BMVVNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkgewotCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCQkJCQkJCS8vIFNwZWNpYWwuIGxlZnQgYXJndW1lbnQgaXMgYSBzdHJpbmcsIHNvIHdlIHdhbnQgdG8gc3RvcmUgYSBzdHJpbmcgYnVmZmVyIGluc3RlYWQKLQkJCQkJCQkJLy8gc2luY2Ugd2Uga25vdyB3ZSB3aWxsIGJlIGFwcGVuZGluZyB0byBpdC4gCi0JCQkJCQkJCXZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCQkJfQkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkUGx1c1R5cGUodmFsdWVUeXBlLCByaWdodFR5cGUpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBTdHJpbmcuY2xhc3MgfHwgcmlnaHRUeXBlID09IFN0cmluZy5jbGFzcykgewotCQkJCQkJCS8vIFNwZWNpYWwgd2UgaGF2ZSBhIHN0cmluZyBvbiBvbmUgc2lkZS4gTmVlZCB0byBkbyBpdCBhcyBzdHJpbmdzIGluc3RlYWQuCi0JCQkJCQkJLy8gV2UgYXJlIGdvaW5nIHRvIGJlIHRyaWNreSBpbiB0aGF0IHdlIHdpbGwgc3RvcmUgYSBTdHJpbmdCdWZmZXIgb24gdGhlIHN0YWNrIChpZiBub3QgbGFzdCBvcGVyYW5kKQotCQkJCQkJCS8vIGJ1dCBjYWxsIGl0IGEgc3RyaW5nLgotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0JCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKLQkJCQkJCQkJc2IgPSAoU3RyaW5nQnVmZmVyKSB2YWx1ZTsJLy8gV2Uga25vdyB0aGF0IGlmIHRoZSB2YWx1ZSAobGVmdCkgaXMgc3RyaW5nIHR5cGUsIHdlJ3ZlIGFscmVhZHkgY29udmVydGVkIGl0IHRvIGJ1ZmZlci4KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBUaGUgcmlnaHQgaXMgdGhlIG9uZSB0aGF0IGludHJvZHVjZXMgdGhlIHN0cmluZywgc28gd2UgY2hhbmdlIHRoZSB2YWx1ZSBvdmVyIHRvIGEgc3RyaW5nIGJ1ZmZlci4KLQkJCQkJCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCgoU3RyaW5nKSByaWdodCkubGVuZ3RoKCkrMTYpOwkvLyBXZSBjYW4ndCBwdXQgdGhlIHZhbHVlIGluIHlldCwgbmVlZCB0byBnZXQgbGVmdCBpbnRvIGl0LgotCQkJCQkJCQlhcHBlbmRUb0J1ZmZlcihzYiwgdmFsdWUsIHZhbHVlVHlwZSk7CS8vIFB1dCB0aGUgbGVmdCB2YWx1ZSBpbiBub3cKLQkJCQkJCQkJdmFsdWUgPSBzYjsKLQkJCQkJCQkJdmFsdWVUeXBlID0gU3RyaW5nLmNsYXNzOwkvLyBNYWtlIGl0IGEgc3RyaW5nIGNsYXNzCi0JCQkJCQkJfQotCQkJCQkJCWFwcGVuZFRvQnVmZmVyKHNiLCByaWdodCwgcmlnaHRUeXBlKTsKLQkJCQkJCQkvLyBOb3cgaWYgd2UgYXJlIHRoZSBsYXN0IG9wZXJhbmQsIHdlIHNob3VsZCBnZXQgcmlkIG9mIHRoZSBidWZmZXIgYW5kIHB1dCBhIHRydWUgc3RyaW5nIGJhY2sgaW4uCi0JCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MQVNUX09QRVJBTkQpCi0JCQkJCQkJCXZhbHVlID0gc2IudG9TdHJpbmcoKTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKHZhbHVlKSArIGdldERvdWJsZShyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IERvdWJsZS5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCB0aGUgcmVzdWx0IHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoZ2V0RmxvYXQodmFsdWUpICsgZ2V0RmxvYXQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBGbG9hdC5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpICsgZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpICsgZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVJfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUik7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fUkVNQUlOREVSKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCB0aGUgcmVzdWx0IHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShnZXREb3VibGUodmFsdWUpICUgZ2V0RG91YmxlKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRG91YmxlLlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdChnZXRGbG9hdCh2YWx1ZSkgJSBnZXRGbG9hdChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEZsb2F0LlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgJSBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgcmVzdWx0IGluIGFuIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgJSBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRF9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9TSUdORUQpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpID4+IGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgPj4gZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRF9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRCk7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRCk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSA+Pj4gZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSA+Pj4gZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9USU1FU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fVElNRVMpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1RJTUVTKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCB0aGUgcmVzdWx0IHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShnZXREb3VibGUodmFsdWUpICogZ2V0RG91YmxlKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRG91YmxlLlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdChnZXRGbG9hdCh2YWx1ZSkgKiBnZXRGbG9hdChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEZsb2F0LlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgKiBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgcmVzdWx0IGluIGFuIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgKiBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1hPUl9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9YT1IpOwotCQkJCQkJdGVzdFZhbGlkQml0VHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fWE9SKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpIF4gZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSBeIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9IAotCQkJCQotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludE9iamVjdEFuZFR5cGUodmFsdWUsIHZhbHVlVHlwZSk7Ci0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKTsJLy8gUHVzaCB0aGUgcmVzdWx0IGJhY2sgb24gdGhlIHN0YWNrLgotCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBpZ25vcmluZyByZXN0IG9mIHRoZSBjdXJyZW50IGluZml4IGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0SW5maXhJZ25vcmUoKSB7Ci0JCWlnbm9yZUV4cHJlc3Npb24gPSBJTkZJWF9JR05PUkU7Ci0JCWluZml4SWdub3JlTmVzdENvdW50ID0gaW5maXhOZXN0aW5nOwkvLyBJZ25vcmUgdW50aWwgd2UgZ2V0IGJhY2sgdG8gdGhlIGN1cnJlbnQgbmVzdGluZy4KLQotCX0KLQotCS8qKgotCSAqIEdldCBpbnQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGJlYW4gcGFzc2VkIGluIChtdXN0IGJlIGVpdGhlciBhIDxjb2RlPk51bWJlci9jb2RlPiBvciA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+LgotCSAqIEFueXRoaW5nIGVsc2Ugd2lsbCBjYXVzZSBhIGNsYXNzIGNhc3QgZXJyb3IuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgaW50IHZhbHVlIG9mIHRoZSBvYmplY3QuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgbnVtYmVyL2NoYXJhY3RlcgotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRJbnQoT2JqZWN0IGJlYW4pIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQlyZXR1cm4gKGJlYW4gaW5zdGFuY2VvZiBOdW1iZXIpID8gKChOdW1iZXIpIGJlYW4pLmludFZhbHVlKCkgOiAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBmbG9hdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgYmVhbiBwYXNzZWQgaW4gKG11c3QgYmUgZWl0aGVyIGEgPGNvZGU+TnVtYmVyL2NvZGU+IG9yIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4uCi0JICogQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlIGEgY2xhc3MgY2FzdCBlcnJvci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgb2JqZWN0LiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0JICogQHBhcmFtIGJlYW4gCi0JICogQHJldHVybiBmbG9hdCB2YWx1ZSBvZiB0aGUgTnVtYmVyL2NoYXJhY3RlcgotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGZsb2F0IGdldEZsb2F0KE9iamVjdCBiZWFuKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIChiZWFuIGluc3RhbmNlb2YgTnVtYmVyKSA/ICgoTnVtYmVyKSBiZWFuKS5mbG9hdFZhbHVlKCkgOiAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRvdWJsZSB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgYmVhbiBwYXNzZWQgaW4gKG11c3QgYmUgZWl0aGVyIGEgPGNvZGU+TnVtYmVyL2NvZGU+IG9yIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4uCi0JICogQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlIGEgY2xhc3MgY2FzdCBlcnJvci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgb2JqZWN0LiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuIGRvdWJsZSB2YWx1ZSBvZiB0aGUgTnVtYmVyL0NoYXJhY3Rlci4KLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBkb3VibGUgZ2V0RG91YmxlKE9iamVjdCBiZWFuKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIChiZWFuIGluc3RhbmNlb2YgTnVtYmVyKSA/ICgoTnVtYmVyKSBiZWFuKS5kb3VibGVWYWx1ZSgpIDogKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgbG9uZyB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgYmVhbiBwYXNzZWQgaW4gKG11c3QgYmUgZWl0aGVyIGEgPGNvZGU+TnVtYmVyL2NvZGU+IG9yIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4uCi0JICogQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlIGEgY2xhc3MgY2FzdCBlcnJvci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgb2JqZWN0LiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgbG9uZyBnZXRMb25nKE9iamVjdCBiZWFuKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIChiZWFuIGluc3RhbmNlb2YgTnVtYmVyKSA/ICgoTnVtYmVyKSBiZWFuKS5sb25nVmFsdWUoKSA6ICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93SW52YWxpZEluZml4KEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuSW52YWxpZE9wZXJhbmRPZk9wZXJhdG9yX0VYQ18iKSwgbmV3IE9iamVjdFtdIHt2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IG51bGwsIG9wZXJhdG9yLnRvU3RyaW5nKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRlc3RWYWxpZEJpdFR5cGUoQ2xhc3MgdHlwZSwgSW5maXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSB8fCB0eXBlID09IEJvb2xlYW4uVFlQRSB8fCB0eXBlID09IERvdWJsZS5UWVBFfHwgdHlwZSA9PSBGbG9hdC5UWVBFKQotCQkJdGhyb3dJbnZhbGlkSW5maXgob3BlcmF0b3IsIHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUoQ2xhc3MgdHlwZSwgSW5maXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSB8fCB0eXBlID09IEJvb2xlYW4uVFlQRSkKLQkJCXRocm93SW52YWxpZEluZml4KG9wZXJhdG9yLCB0eXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFZhbGlkUGx1c1R5cGUoQ2xhc3MgbGVmdCwgQ2xhc3MgcmlnaHQpIHsKLQkJLy8gUGx1cyBpcyBzcGVjaWFsIGluIHRoYXQgc3RyaW5nIG9iamVjdHMgYXJlIGFsc28gdmFsaWQuCi0JCWlmIChsZWZ0ID09IFN0cmluZy5jbGFzcyB8fCByaWdodCA9PSBTdHJpbmcuY2xhc3MpCi0JCQlyZXR1cm47CS8vIEFzIGxvbmcgYXMgb25lIHNpZGUgaXMgc3RyaW5nLiBBbnl0aGluZyBpcyB2YWxpZC4KLQkJLy8gSWYgbmVpdGhlciBpcyBzdHJpbmcsIHRoZW4gc3RhbmRhcmQgYXJpdGhtZXRpYyB0ZXN0LgotCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShsZWZ0LCBJbmZpeE9wZXJhdG9yLklOX1BMVVMpOwotCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodCwgSW5maXhPcGVyYXRvci5JTl9QTFVTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRvQnVmZmVyKFN0cmluZ0J1ZmZlciBzYiwgT2JqZWN0IHZhbHVlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlzYi5hcHBlbmQoKE9iamVjdCludWxsKTsKLQkJZWxzZSBpZiAodmFsdWVUeXBlID09IFN0cmluZy5jbGFzcykKLQkJCXNiLmFwcGVuZCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCWVsc2UgaWYgKHZhbHVlVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlzd2l0Y2ggKGdldEVudW1Gb3JQcmltaXRpdmUodmFsdWVUeXBlKSkgewotCQkJCWNhc2UgQk9PTEVBTjoKLQkJCQkJc2IuYXBwZW5kKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCWVRFOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ0hBUjoKLQkJCQkJc2IuYXBwZW5kKCgoQ2hhcmFjdGVyKSB2YWx1ZSkuY2hhclZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERPVUJMRToKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5UOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMT05HOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwkJCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBKdXN0IGFuIG9iamVjdC4KLQkJCXNiLmFwcGVuZCh2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGluZGV4Q291bnQgTnVtYmVyIG9mIGRpbWVuc2lvbnMgYmVpbmcgYWNjZXNzZWQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQXJyYXlBY2Nlc3MoaW50IGluZGV4Q291bnQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQkKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIkFycmF5IEFjY2Vzc1siK2luZGV4Q291bnQrJ10nLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCS8vIFdlIG5lZWQgdG8gcG9wIG9mZiB0aGUgYXJncy4gVGhlIHRvcG1vc3Qgd2lsbCBiZSB0aGUgcmlnaHRtb3N0IGluZGV4LCBhbmQgdGhlIGJvdHRvbSBtb3N0IHdpbGwgYmUgdGhlIGFycmF5IGl0c2VsZi4KLQkJCQlpbnRbXSBhcmd1bWVudHMgPSBuZXcgaW50W2luZGV4Q291bnRdOwotCQkJCS8vIEZpbGwgdGhlIGFyZyBhcnJheSBpbiByZXZlcnNlIG9yZGVyLgotCQkJCWZvcihpbnQgaT1pbmRleENvdW50LTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCU9iamVjdCBpbmRleCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJQ2xhc3MgaW5kZXhUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQlpZiAoaW5kZXhUeXBlLmlzUHJpbWl0aXZlKCkgJiYgKGluZGV4VHlwZSA9PSBJbnRlZ2VyLlRZUEUgfHwgaW5kZXhUeXBlID09IFNob3J0LlRZUEUgfHwgaW5kZXhUeXBlID09IENoYXJhY3Rlci5UWVBFIHx8IGluZGV4VHlwZSA9PSBCeXRlLlRZUEUpKSB7Ci0JCQkJCQlhcmd1bWVudHNbaV0gPSBnZXRJbnQoaW5kZXgpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRocm93Q2xhc3NDYXN0KEludGVnZXIuVFlQRSwgaW5kZXgpOwotCQkJCX0KLQkJCQkKLQkJCQlPYmplY3QgYXJyYXkgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgYXJyYXlUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCWlmIChhcnJheVR5cGUuaXNBcnJheSgpKSB7Ci0JCQkJCS8vIEZpcnN0IGZpZ3VyZSBvdXQgaG93IG1hbnkgZGltZW5zaW9ucyBhcmUgYXZhaWxhYmxlLiBTdG9wIHdoZW4gd2UgaGl0IGluZGV4Y291bnQgYmVjYXVzZSB3ZSB3b24ndCBiZSBnb2luZyBmdXJ0aGVyLgotCQkJCQlpbnQgZGltY291bnQgPSAwOwotCQkJCQlDbGFzc1tdIGNvbXBvbmVudFR5cGVzID0gbmV3IENsYXNzW2luZGV4Q291bnRdOwkvLyAKLQkJCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGFycmF5VHlwZTsKLQkJCQkJd2hpbGUgKGRpbWNvdW50IDwgaW5kZXhDb3VudCAmJiBjb21wb25lbnRUeXBlLmlzQXJyYXkoKSkgewotCQkJCQkJY29tcG9uZW50VHlwZXNbZGltY291bnQrK10gPSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChkaW1jb3VudCA8IGluZGV4Q291bnQpCi0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlhJc0dyZWF0ZXJUaGFuTnVtYmVyT2ZEaW1lbnNpb25zSW5BcnJheV9FWENfIiksIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW5kZXhDb3VudCksIG5ldyBJbnRlZ2VyKGRpbWNvdW50KX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQkJLy8gTm93IHN0YXJ0IGFjY2Vzc2luZyBvbmUgaW5kZXggYXQgYSB0aW1lLCBzdG9wIGp1c3QgYmVmb3JlIHRoZSBsYXN0IG9uZS4gVGhlIGxhc3Qgb25lIHdpbGwgYmUgdHVybmVkIGludG8gYW4gQXJyYXlBY2Nlc3NSZWZlcmVuY2UuCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGFycmF5OwkvLyBGaW5hbCB2YWx1ZSwgc3RhcnQgd2l0aCBmdWxsIGFycmF5LgotCQkJCQlpbnQgcHVsbENvdW50ID0gaW5kZXhDb3VudC0xOwotCQkJCQlmb3IoaW50IGk9MDsgaTxwdWxsQ291bnQ7IGkrKykgewotCQkJCQkJdmFsdWUgPSBBcnJheS5nZXQodmFsdWUsIGFyZ3VtZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQkJQXJyYXlBY2Nlc3NSZWZlcmVuY2UgYXJyYXlWYWx1ZSA9IEFycmF5QWNjZXNzUmVmZXJlbmNlLmNyZWF0ZUFycmF5QWNjZXNzUmVmZXJlbmNlKHZhbHVlLCBhcmd1bWVudHNbcHVsbENvdW50XSk7Ci0JCQkJCWlmICh0cmFjZU9uKQotCQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKGFycmF5VmFsdWUsIGNvbXBvbmVudFR5cGVzW3B1bGxDb3VudF0pOwotCQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKGFycmF5VmFsdWUsIGNvbXBvbmVudFR5cGVzW3B1bGxDb3VudF0pOwotCQkJCX0gIGVsc2UKLQkJCQkJIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuTm90QW5BcnJheV9FWENfIiksIG5ldyBPYmplY3RbXSB7YXJyYXlUeXBlfSkpOyAvLyROT04tTkxTLTEkCi0JCi0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgYXJyYXkgY3JlYXRpb24gcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJyYXlUeXBlIFRoZSB0eXBlIG9mIHRoZSBhcnJheQotCSAqIEBwYXJhbSBkaW1lbnNpb25Db3VudCBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgYmVpbmcgaW5pdGlhbGl6ZWQuIFplcm8gaWYgdXNpbmcgYW4gaW5pdGlhbGl6ZXIuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEFycmF5Q3JlYXRpb24oQ2xhc3MgYXJyYXlUeXBlLCBpbnQgZGltZW5zaW9uQ291bnQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkFycmF5IENyZWF0aW9uOiAiK2FycmF5VHlwZS5nZXROYW1lKCkrJ1snK2RpbWVuc2lvbkNvdW50KyddJywgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCWlmIChkaW1lbnNpb25Db3VudCA9PSAwKSB7Ci0JCQkJCS8vIFRoZSB0b3AgdmFsdWUgaXMgdGhlIGFycmF5IGl0c2VsZiwgZnJvbSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JCQkJCS8vIFNvIHdlIGRvIG5vdGhpbmcuCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gU3RyaXAgb2ZmIGRpbWVuc2lvbkNvdW50cyBmcm9tIHRoZSBhcnJheSB0eXBlLCBlLmcuCi0JCQkJCS8vIEFycmF5VHlwZSBpcyBpbnRbXVtdW10KLQkJCQkJLy8gRGltZW5zaW9uY291bnQgaXMgMgotCQkJCQkvLyBUaGVuIHdlIG5lZWQgdG8gc3RyaXAgdHdvIGNvbXBvbmVudHR5cGVzIG9mZiBvZiB0aGUgYXJyYXkgdHlwZQotCQkJCQkvLyB3aW5kIHVwIHdpdGggaW50W10KLQkJCQkJLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBBcnJheS5uZXcgd2lsbCBhZGQgdGhvc2UgZGltZW5zaW9ucyBiYWNrCi0JCQkJCS8vIG9uIHRocm91Z2ggdGhlIGRpbWVuc2lvbiBjb3VudC4KLQkJCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGFycmF5VHlwZTsKLQkJCQkJZm9yKGludCBpPTA7IGkgPCBkaW1lbnNpb25Db3VudCAmJiBjb21wb25lbnRUeXBlICE9IG51bGw7IGkrKykKLQkJCQkJCWNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuQXJyYXl0eXBlSGFzRmV3ZXJEaW1lbnNpb25zVGhhblJlcXVlc3RlZF9FWENfIiksIG5ldyBPYmplY3RbXSB7YXJyYXlUeXBlLCBuZXcgSW50ZWdlcihkaW1lbnNpb25Db3VudCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJCS8vIFdlIG5lZWQgdG8gcHVsbCBpbiB0aGUgZGltZW5zaW9uIGluaXRpYWxpemVycy4gVGhleSBhcmUgc3RhY2tlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJCQlpbnRbXSBkaW1Jbml0ID0gbmV3IGludFtkaW1lbnNpb25Db3VudF07Ci0JCQkJCWZvcihpbnQgaT1kaW1lbnNpb25Db3VudC0xOyBpID49IDA7IGktLSkgewotCQkJCQkJT2JqZWN0IGluZGV4ID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQkJQ2xhc3MgZGltVHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQkJCWlmIChkaW1UeXBlLmlzUHJpbWl0aXZlKCkgJiYgKGRpbVR5cGUgPT0gSW50ZWdlci5UWVBFIHx8IGRpbVR5cGUgPT0gU2hvcnQuVFlQRSB8fCBkaW1UeXBlID09IENoYXJhY3Rlci5UWVBFIHx8IGRpbVR5cGUgPT0gQnl0ZS5UWVBFKSkgewotCQkJCQkJCWRpbUluaXRbaV0gPSBnZXRJbnQoaW5kZXgpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJdGhyb3dDbGFzc0Nhc3QoSW50ZWdlci5UWVBFLCBpbmRleCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIEZpbmFsbHkgY3JlYXRlIHRoZSBhcnJheS4KLQkJCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgZGltSW5pdCk7Ci0JCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoYXJyYXksIGFycmF5VHlwZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBhcnJheSBpbml0aWFsaXplciByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBhcnJheVR5cGUgVGhlIG9yaWdpbmFsIHR5cGUgb2YgdGhlIGFycmF5IHRvIGNyZWF0ZS4KLQkgKiBAcGFyYW0gc3RyaXBDb3VudCB0aGUgY291bnQgb2YgaG93IG1hbnkgZGltZW5zaW9ucyB0byBzdHJpcCB0byBnZXQgdGhlIHR5cGUgbmVlZGVkIGZvciB0aGlzIGluaXRpYWxpemVyLgotCSAqIEBwYXJhbSBleHByZXNzaW9uQ291bnQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQXJyYXlJbml0aWFsaXplcihDbGFzcyBhcnJheVR5cGUsIGludCBzdHJpcENvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJCi0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiSW5pdGlhbGl6ZSBBcnJheTogIithcnJheVR5cGUuZ2V0TmFtZSgpKyd7JytleHByZXNzaW9uQ291bnQrJ30nLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCi0JCQl0cnkgewotCQkJCWlmICghYXJyYXlUeXBlLmlzQXJyYXkoKSkgewotCQkJCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkgdHlwZS4KLQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5DYW5ub3RDYXN0WFRvWV9FWENfIiksIG5ldyBPYmplY3RbXSB7YXJyYXlUeXBlLCAiYXJyYXkifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IAotCQkJCS8vIFN0cmlwIG9mZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLgotCQkJCXdoaWxlKHN0cmlwQ291bnQtLT4wKSB7Ci0JCQkJCWFycmF5VHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJfQotCQkJCU9iamVjdFtdIGRpbVZhbHVlcyA9IG51bGw7Ci0JCQkJaWYgKGV4cHJlc3Npb25Db3VudCA+IDApIHsKLQkJCQkJLy8gV2UgbmVlZCB0byBwdWxsIGluIHRoZSBpbml0aWFsaXplcnMuIFRoZXkgYXJlIHN0YWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCQkJZGltVmFsdWVzID0gbmV3IE9iamVjdFtleHByZXNzaW9uQ291bnRdOwotCQkJCQlmb3IgKGludCBpID0gZXhwcmVzc2lvbkNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCU9iamVjdCBkaW1WYWx1ZSA9IGRpbVZhbHVlc1tpXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJCUNsYXNzIGRpbVR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJCQlpZiAoYXJyYXlUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQlpZiAoZGltVmFsdWUgPT0gbnVsbCB8fCAhZGltVHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCS8vIEEgbGl0dGxlIHRyaWNraWVyLiBDYW4gYXNzaWduIHNob3J0IHRvIGFuIGludCwgYnV0IGNhbid0IGFzc2lnbiBsb25nIHRvIGFuIGludC4gV2lkZW5pbmcgaXMgcGVybWl0dGVkLgotCQkJCQkJCWlmIChhcnJheVR5cGUgIT0gZGltVHlwZSkgewotCQkJCQkJCQlpbnQgY29tcEVudW0gPSBnZXRFbnVtRm9yUHJpbWl0aXZlKGFycmF5VHlwZSk7Ci0JCQkJCQkJCWludCBkaW1FbnVtID0gZ2V0RW51bUZvclByaW1pdGl2ZShkaW1UeXBlKTsKLQkJCQkJCQkJaWYgKGNvbXBFbnVtID09IEJPT0xFQU4gfHwgZGltRW51bSA9PSBCT09MRUFOKQotCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJaW50IGRpbVZhbHVlQXNJbnQgPSBnZXRJbnQoZGltVmFsdWUpOwotCQkJCQkJCQlzd2l0Y2ggKGNvbXBFbnVtKSB7Ci0JCQkJCQkJCQljYXNlIEJZVEUgOgotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIG9yIGludCBhcyBsb25nIGFzIHZhbHVlIGlzIDw9IGJ5dGUgbWF4LiBDYW4ndCBhY2NlcHQgbG9uZywgZG91YmxlLCBmbG9hdCBhdCBhbGwuCi0JCQkJCQkJCQkJLy8gTm90ZTogVGhpcyBpc24ndCBhY3R1YWxseSB0cnVlLiBUaGUgbWF4L21pbiB0ZXN0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHZhbHVlIGlzIGEgbGl0ZXJhbCwgbm90IGFuIGV4cHJlc3Npb24sCi0JCQkJCQkJCQkJLy8gaG93ZXZlciwgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHdlIG5vIGxvbmdlciBrbm93IHRoaXMuIFNvIHdlIHdpbGwgc2ltcGx5IGFsbG93IGl0LgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gSU5UIHx8IGRpbVZhbHVlQXNJbnQgPiBCeXRlLk1BWF9WQUxVRSB8fCBkaW1WYWx1ZUFzSW50IDwgQnl0ZS5NSU5fVkFMVUUpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IEJ5dGUoKGJ5dGUpZGltVmFsdWVBc0ludCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNIT1JUIDoJCQkJCQkJCQotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIG9yIGludCBhcyBsb25nIGFzIHZhbHVlIGlzIDw9IGJ5dGUgbWF4LiBDYW4ndCBhY2NlcHQgbG9uZywgZG91YmxlLCBmbG9hdCBhdCBhbGwuCi0JCQkJCQkJCQkJLy8gTm90ZTogVGhpcyBpc24ndCBhY3R1YWxseSB0cnVlLiBUaGUgbWF4L21pbiB0ZXN0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHZhbHVlIGlzIGEgbGl0ZXJhbCwgbm90IGFuIGV4cHJlc3Npb24sCi0JCQkJCQkJCQkJLy8gaG93ZXZlciwgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHdlIG5vIGxvbmdlciBrbm93IHRoaXMuIFNvIHdlIHdpbGwgc2ltcGx5IGFsbG93IGl0LgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gSU5UIHx8IGRpbVZhbHVlQXNJbnQgPiBTaG9ydC5NQVhfVkFMVUUgfHwgZGltVmFsdWVBc0ludCA8IFNob3J0Lk1JTl9WQUxVRSkKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgU2hvcnQoKHNob3J0KWRpbVZhbHVlQXNJbnQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBDSEFSIDoKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBvciBpbnQgYXMgbG9uZyBhcyB2YWx1ZSBpcyA8PSBieXRlIG1heC4gQ2FuJ3QgYWNjZXB0IGxvbmcsIGRvdWJsZSwgZmxvYXQgYXQgYWxsLgotCQkJCQkJCQkJCS8vIE5vdGU6IFRoaXMgaXNuJ3QgYWN0dWFsbHkgdHJ1ZS4gVGhlIG1heC9taW4gdGVzdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSB2YWx1ZSBpcyBhIGxpdGVyYWwsIG5vdCBhbiBleHByZXNzaW9uLAotCQkJCQkJCQkJCS8vIGhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgaW4gdGltZSB3ZSBubyBsb25nZXIga25vdyB0aGlzLiBTbyB3ZSB3aWxsIHNpbXBseSBhbGxvdyBpdC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IElOVCB8fCBkaW1WYWx1ZUFzSW50ID4gQ2hhcmFjdGVyLk1BWF9WQUxVRSB8fCBkaW1WYWx1ZUFzSW50IDwgQ2hhcmFjdGVyLk1JTl9WQUxVRSkKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgQ2hhcmFjdGVyKChjaGFyKWRpbVZhbHVlQXNJbnQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBJTlQgOgotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIG9yIGludC4gQ2FuJ3QgYWNjZXB0IGxvbmcsIGRvdWJsZSwgZmxvYXQgYXQgYWxsLgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gSU5UKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBJbnRlZ2VyKGRpbVZhbHVlQXNJbnQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBMT05HIDoKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBpbnQsIG9yIGxvbmcuIENhbid0IGFjY2VwdCBkb3VibGUsIGZsb2F0IGF0IGFsbC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IExPTkcpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IExvbmcoZ2V0TG9uZyhkaW1WYWx1ZSkpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBGTE9BVCA6Ci0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgaW50LCBsb25nLCBvciBmbG9hdC4gQ2FuJ3QgYWNjZXB0IGRvdWJsZSBhdCBhbGwuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBGTE9BVCkKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgRmxvYXQoZ2V0RmxvYXQoZGltVmFsdWUpKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgRE9VQkxFIDoKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgRG91YmxlKGdldERvdWJsZShkaW1WYWx1ZSkpOwotCQkJCQkJCQkJCWJyZWFrOwotCQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIENvbXBhdGlibGUsIHNvIG9rLgotCQkJCQkJfSBlbHNlIGlmIChkaW1UeXBlICE9IE1ldGhvZEhlbHBlci5OVUxMX1RZUEUgJiYgIWFycmF5VHlwZS5pc0Fzc2lnbmFibGVGcm9tKGRpbVR5cGUpKSB7Ci0JCQkJCQkJLy8gSWYgaXQgaXMgTlVMTF9UWVBFLCB0aGVuIHRoaXMgaXMgYSBwdXNoZWQgbnVsbC4gVGhpcyBpcyBhbHdheXMgYXNzaWduYWJsZSB0byBhIG5vbi1wcmltaXRpdmUuCi0JCQkJCQkJLy8gU28gd2UgZG9uJ3QgZW50ZXIgaGVyZSBpbiB0aGF0IGNhc2UuIEhvd2V2ZXIsIGEgbnVsbCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHNvbWUgZXhwcmVzc2lvbgotCQkJCQkJCS8vIHdvbid0IGhhdmUgYSBOVUxMX1RZUEUsIGl0IHdpbGwgaW5zdGVhZCBoYXZlIHRoZSBleHBlY3RlZCByZXR1cm4gdHlwZS4gVGhhdCBtdXN0IGJlIHVzZWQKLQkJCQkJCQkvLyBpbiB0aGUgYXNzaWdubWVudCBpbnN0ZWFkLiBUaGF0IGlzIGJlY2F1c2UgaW4gamF2YSBpdCB1c2VzIHRoZSBleHBlY3RlZCB0eXBlIHRvIGRldGVybWluZQotCQkJCQkJCS8vIGNvbXBhdGliaWxpdHksIG5vdCB0aGUgYWN0dWFsIHR5cGUuCi0JCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gTm93IHdlIGZpbmFsbHkgY3JlYXRlIHRoZSBhcnJheS4KLQkJCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShhcnJheVR5cGUsIG5ldyBpbnRbXSB7ZXhwcmVzc2lvbkNvdW50fSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHByZXNzaW9uQ291bnQ7IGkrKykgewotCQkJCQlBcnJheS5zZXQoYXJyYXksIGksIGRpbVZhbHVlc1tpXSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoYXJyYXksIGFycmF5LmdldENsYXNzKCkpOwkvLyBBZGp1c3QgdG8gdHJ1ZSBhcnJheSB0eXBlLCBub3QgdGhlIGluY29taW5nIHR5cGUgKHdoaWNoIGlzIG9uZSBkaW1lbnNpb24gdG9vIHNtYWxsKS4KLQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLQkgKiBAcGFyYW0gYXJndW1lbnRDb3VudCBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAod2hpY2ggYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2spLgkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihDbGFzcyB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCQotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkNyZWF0ZSBDbGFzczogIit0eXBlKyIgKCIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkJCQkKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgbmVlZCB0byBwdWxsIGluIHRoZSBhcmd1bWVudHMuIFRoZXkgYXJlIHN0YWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCQlPYmplY3QgdmFsdWUgPSBudWxsOwkvLyBUaGUgbmV3IGluc3RhbmNlLgotCQkJCU9iamVjdFtdICBhcmdzID0gbmV3IE9iamVjdFthcmd1bWVudENvdW50XTsKLQkJCQlDbGFzc1tdIGFyZ1R5cGVzID0gbmV3IENsYXNzW2FyZ3VtZW50Q291bnRdOwotCQkJCWZvciAoaW50IGkgPSBhcmd1bWVudENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJYXJnc1tpXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJYXJnVHlwZXNbaV0gPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yLgotCQkJCUNvbnN0cnVjdG9yIGN0b3I7Ci0JCQkJY3RvciA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKHR5cGUsIGFyZ1R5cGVzKTsKLQkJCQlpZiAodHJhY2VPbikgewotCQkJCQlpZiAoYXJndW1lbnRDb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBObyBhcmdzLCBqdXN0IGRvIGRlZmF1bHQgY3Rvci4KLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIkRlZmF1bHQgY3RvcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewkJCQkJCQotCQkJCQkJU3lzdGVtLm91dC5wcmludChjdG9yKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoJyknKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl2YWx1ZSA9IGN0b3IubmV3SW5zdGFuY2UoYXJncyk7Ci0JCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZSh2YWx1ZSwgdHlwZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2xhc3MoKSA9PSBFcnJvci5jbGFzcykgewotCQkJCQkvLyBJZiBleGFjdGx5IEVycm9yLmNsYXNzLCB0aGVuIHByb2Nlc3MgaXQuIFRoaXMgaXMgaG9wZWZ1bGx5IGp1c3QgYSAidW5yZXNvbHZlZCBjb21waWxhdGlvbiBlcnJvciIuCi0JCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IFVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yKGUpKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3cgZTsJLy8gQWxsIHN1YmNsYXNzZXMgd2UgdGhyb3cgb24gb3V0LgotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gZmllbGQgU3RyaW5nIGZvciBmaWVsZG5hbWUsIG9yIGEgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuCi0JICogQHBhcmFtIGZpZWxkSXNTdHJpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmllbGQgaXMgYSBzdHJpbmcgbmFtZSwgYW5kIG5vdCBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLgotCSAqIEBwYXJhbSBoYXNSZWNlaXZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hGaWVsZEFjY2VzcyhPYmplY3QgZmllbGQsIGJvb2xlYW4gZmllbGRJc1N0cmluZywgYm9vbGVhbiBoYXNSZWNlaXZlcikgewotCQl0cnkgewotCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIkZpZWxkIEFjY2VzcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2UoIkZpZWxkIEFjY2VzczogIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCS8vIEdldCB0aGUgcmVjZWl2ZXIgb2ZmIG9mIHRoZSBzdGFjay4KLQkJCQlPYmplY3QgcmVjZWl2ZXIgPSBudWxsOwotCQkJCUNsYXNzIHJlY2VpdmVyVHlwZSA9IG51bGw7Ci0JCQkJaWYgKGhhc1JlY2VpdmVyKSB7Ci0JCQkJCXJlY2VpdmVyID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlyZWNlaXZlclR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGZpZWxkLgotCQkJCUZpZWxkIHJlZmxlY3RGaWVsZCA9IGZpZWxkSXNTdHJpbmcgPyByZWNlaXZlclR5cGUuZ2V0RmllbGQoKFN0cmluZykgZmllbGQpIDogKEZpZWxkKSBmaWVsZDsKLQkJCQkvLyBBY2Nlc3MgdGhlIGZpZWxkLgotCQkJCU9iamVjdCB2YWx1ZSA9IEZpZWxkQWNjZXNzUmVmZXJlbmNlLmNyZWF0ZUZpZWxkQWNjZXNzUmVmZXJlbmNlKHJlZmxlY3RGaWVsZCwgcmVjZWl2ZXIpOwotCQkJCUNsYXNzIHZhbHVlVHlwZSA9IHJlZmxlY3RGaWVsZC5nZXRUeXBlKCk7Ci0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiRmllbGQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmaWVsZElzU3RyaW5nKQotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiKGxvb2tlZCB1cCkgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludChyZWZsZWN0RmllbGQpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlLCB2YWx1ZVR5cGUpOwotCQkJCX0KLQkJCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcGFyYW0gbWV0aG9kSXNTdHJpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbWV0aG9kIGlzIGEgc3RyaW5nIChzbyBzdHJpbmcgbmFtZSkgb3IgZWxzZSBpdCBpcyBhIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIKLQkgKiBAcGFyYW0gYXJnQ291bnQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvbihPYmplY3QgbWV0aG9kLCBib29sZWFuIG1ldGhvZElzU3RyaW5nLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJnQ291bnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJJbnZva2UiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiSW52b2tlOiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJTWV0aG9kIHJlZmxlY3RNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBXZSBuZWVkIHRvIHB1bGwgaW4gdGhlIGFyZ3VtZW50cy4gVGhleSBhcmUgc3RhY2tlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJCU9iamVjdFtdICBhcmdzID0gbmV3IE9iamVjdFthcmdDb3VudF07Ci0JCQkJQ2xhc3NbXSBhcmdUeXBlcyA9IG5ldyBDbGFzc1thcmdDb3VudF07Ci0JCQkJZm9yIChpbnQgaSA9IGFyZ0NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJYXJnc1tpXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJYXJnVHlwZXNbaV0gPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyBnZXQgcmVjZWl2ZXIKLQkJCQlPYmplY3QgcmVjZWl2ZXIgPSBudWxsOwotCQkJCUNsYXNzIHJlY2VpdmVyVHlwZSA9IG51bGw7Ci0JCQkJaWYgKGhhc1JlY2VpdmVyKSB7Ci0JCQkJCXJlY2VpdmVyID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlyZWNlaXZlclR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZC4gSWYgaXQgaXMgYSBzdHJpbmcgdGhlbiB0aGVyZSBtdXN0IGJlIGEgcmVjZWl2ZXIsIG90aGVyd2lzZSBubyB3YXkgdG8ga25vdy4KLQkJCQlpZiAobWV0aG9kSXNTdHJpbmcpIHsKLQkJCQkJcmVmbGVjdE1ldGhvZCA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZU1ldGhvZChyZWNlaXZlclR5cGUsIChTdHJpbmcpIG1ldGhvZCwgYXJnVHlwZXMpOwotCQkJCX0gZWxzZQotCQkJCQlyZWZsZWN0TWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kOwotCQkJCQotCQkJCWlmICh0cmFjZU9uICYmIHJlZmxlY3RNZXRob2QgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJNZXRob2Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChtZXRob2RJc1N0cmluZykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIihsb29rZWQgdXApICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnQocmVmbGVjdE1ldGhvZCk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFNb2RpZmllci5pc1N0YXRpYyhyZWZsZWN0TWV0aG9kLmdldE1vZGlmaWVycygpKSAmJiByZWNlaXZlciA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIHJlY2VpdmVyIGZvciBub24tc3RhdGljIG1ldGhvZDogIityZWZsZWN0TWV0aG9kLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IHJlZmxlY3RNZXRob2QuaW52b2tlKHJlY2VpdmVyLCBhcmdzKTsKLQkJCQkKLQkJCQlpZiAodHJhY2VPbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgcmV0dXJuczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlLCByZWZsZWN0TWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCQkJfQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUodmFsdWUsIHJlZmxlY3RNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZml4VXBNZXRob2RFeGNlcHRpb24oZSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZml4VXBNZXRob2RFeGNlcHRpb24oZSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihmaXhVcE1ldGhvZEV4Y2VwdGlvbihlLCByZWZsZWN0TWV0aG9kKSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGZpeFVwTWV0aG9kRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoKLQkgKiBNYW55IG9mIHRoZSBleGNlcHRpb25zIGRvbid0IGFkZCBpbiB3aGF0IG1ldGhvZCBoYWQgdGhlIGVycm9yLCBzbyB3ZQotCSAqIHdpbGwgZG8gdGhhdCBoZXJlLgotCSAqLwotCXByaXZhdGUgVGhyb3dhYmxlIGZpeFVwTWV0aG9kRXhjZXB0aW9uKFRocm93YWJsZSBlLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybiBlOwotCQl0cnkgewotCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJQ29uc3RydWN0b3IgZVdpdGhTdHJpbmdDdG9yID0gZS5nZXRDbGFzcygpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJCVN0cmluZyBuZXdNc2c7Ci0JCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQluZXdNc2cgPSBtZXRob2QudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3TXNnID0gbWV0aG9kLnRvU3RyaW5nKCkrIjogXCIiK21zZysnXCInOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlFeGNlcHRpb24gZml4ZWR1cEUgPSAoRXhjZXB0aW9uKSBlV2l0aFN0cmluZ0N0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtuZXdNc2d9KTsKLQkJCWZpeGVkdXBFLnNldFN0YWNrVHJhY2UoZS5nZXRTdGFja1RyYWNlKCkpOwotCQkJcmV0dXJuIGZpeGVkdXBFOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCXJldHVybiBlOwotCQl9Ci0gIAotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBDT05ESVRJT05BTF9JR05PUkUgPSAiQ09ORElUSU9OQUwgSUdOT1JFIjsJLy8gRmxhZyBmb3IgY29uZGl0aW9uYWwgaW4gaW5nb3JlIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBjb25kaXRpb25hbE5lc3RpbmcgPSAwOwkvLyBOZXN0aW5nIG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLgotCXByaXZhdGUgaW50IGNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID0gMDsJLy8gV2hlbiBpZ25vcmluZyBjb25kaXRpb25hbCBleHByZXNzaW9ucywgaWdub3JlIHVudGlsIHRoaXMgbmVzdCBjb3VudC4KLQlwcml2YXRlIGJvb2xlYW4gc2tpcFRydWVQYXJ0OwotCi0JLyoqCi0JICogUHVzaCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uIEl0IGNhbiBiZSBhbnkgY2xhdXNlIG9mIHRoZSBjb25kaXRpb25hbCAodGVzdCwgdHJ1ZSwgb3IgZmFsc2UgY2xhdXNlKS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvblR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ29uZGl0aW9uYWwoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4cHJlc3Npb25UeXBlKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGlnbm9yZSA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gU2xpZ2h0bHkgZGlmZmVyZW50IGhlcmUgaW4gdGhhdCBpZiBhbiBpZ25vcmluZyBvY2N1cnJlZCB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgYXQgbGVhc3QgcGFydCBvZiBpdCBzbyB0aGF0Ci0JCQkJLy8gd2UgY2FuIGdldCB0aGUgZXhwcmVzc2lvbiBncm91cGluZyBjb3JyZWN0LgotCQkJCXN3aXRjaCAoZXhwcmVzc2lvblR5cGUuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9URVNUX1ZBTFVFOgotCQkJCQkJY29uZGl0aW9uYWxOZXN0aW5nKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVFJVRV9WQUxVRToKLQkJCQkJCWlmIChza2lwVHJ1ZVBhcnQgJiYgaWdub3JlRXhwcmVzc2lvbiA9PSBDT05ESVRJT05BTF9JR05PUkUgJiYgY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPT0gY29uZGl0aW9uYWxOZXN0aW5nKSB7Ci0JCQkJCQkJLy8gc3RvcCBpZ25vcmluZywgd2UndmUgaWdub3JlZCB0aGUgdHJ1ZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFOgotCQkJCQkJaW50IGN1cnJlbnROZXN0aW5nID0gY29uZGl0aW9uYWxOZXN0aW5nLS07Ci0JCQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBDT05ESVRJT05BTF9JR05PUkUgJiYgY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPT0gY3VycmVudE5lc3RpbmcpIHsKLQkJCQkJCQkvLyBzdG9wIGlnbm9yaW5nLCB3ZSd2ZSBpZ25vcmVkIHRoZSBmYWxzZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJDb25kaXRpb25hbCAiK2V4cHJlc3Npb25UeXBlLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkJCQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGV4cHJlc3Npb25UeXBlLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVEVTVF9WQUxVRToKLQkJCQkJCU9iamVjdCBjb25kaXRpb24gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCQlDbGFzcyB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQkJaWYgKHR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCXRocm93Q2xhc3NDYXN0KEJvb2xlYW4uVFlQRSwgY29uZGl0aW9uKTsKLQkJCQkJCWlmICgoKEJvb2xlYW4pIGNvbmRpdGlvbikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkvLyBDb25kaXRpb24gd2FzIHRydWUuCi0JCQkJCQkJLy8gRG8gbm90aGluZy4gTGV0IHRydWUgY29uZGl0aW9uIGJlIHByb2Nlc3NlZC4KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gQ29uZGl0aW9uIHdhcyBmYWxzZS4KLQkJCQkJCQlza2lwVHJ1ZVBhcnQgPSB0cnVlOwkvLyBUZWxsIHRoZSB0cnVlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gQ09ORElUSU9OQUxfSUdOT1JFOwotCQkJCQkJCWNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID0gY29uZGl0aW9uYWxOZXN0aW5nOwotCQkJCQkJfQotCQkJCQkJLy8gV2UgZG9uJ3QgcHV0IGFueXRoaW5nIGJhY2sgb24gdGhlIHN0YWNrIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIG5vdCBldmVyIHJldHVybmVkLgotCQkJCQkJLy8gVGhlIGFwcHJvcHJpYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uIGV2YWx1YXRpb24gd2lsbCBiZSBsZWZ0IG9uIHRoZSBzdGFjay4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9UUlVFX1ZBTFVFOgotCQkJCQkJc2tpcFRydWVQYXJ0ID0gZmFsc2U7CS8vIFRlbGwgdGhlIGZhbHNlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBDT05ESVRJT05BTF9JR05PUkU7Ci0JCQkJCQljb25kaXRpb25hbElnbm9yZU5lc3RDb3VudCA9IGNvbmRpdGlvbmFsTmVzdGluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9GQUxTRV9WQUxVRToKLQkJCQkJCS8vIFRoZXJlJ3Mgbm90aGluZyB0byBkbywgaWYgaXQgd2FzIGlnbm9yZWQgZHVlIHRvIHRydWUsIHdlIHdvdWxkbid0IG9mIGdvdHRvbiBoZXJlLgotCQkJCQkJLy8gSWYgaXQgd2Fzbid0IGlnbm9yZWQsIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgZmFsc2UgZXhwcmVzc2lvbiBpcyBvbiB0aGUgc3RhY2ssIHdoaWNoIGlzIHdoYXQgaXQgc2hvdWxkIGJlLgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBCTE9DS19JR05PUkUgPSAiQkxPQ0sgSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50W10gYmxvY2tzOwkvLyBTdGFjayBvZiBibG9jayBudW1iZXJzIGN1cnJlbnRseSBldmFsdWF0aW5nLgotCXByaXZhdGUgaW50IHRvcEJsb2NrID0gLTE7CS8vIFRvcCBibG9jayBpbmRleC4KLQlwcml2YXRlIGludCBicmVha0Jsb2NrID0gLTE7CS8vIEJsb2NrIG51bWJlciB3ZSBhcmUgYnJlYWtpbmcgdG8uCi0JCi0JLyoqCi0JICogUHVzaCBhIGJlZ2luIGJsb2NrLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hCbG9ja0JlZ2luKGludCBibG9ja051bWJlcikgewotCQlpZiAodHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiQmVnaW4gQmxvY2sgIyIrYmxvY2tOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQlpbmRlbnQodHJ1ZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmIChibG9ja3MgPT0gbnVsbCkKLQkJCQlibG9ja3MgPSBuZXcgaW50WzEwXTsKLQkJCWlmICgrK3RvcEJsb2NrID49IGJsb2Nrcy5sZW5ndGgpIHsKLQkJCQlpbnRbXSBuZXdMaXN0ID0gbmV3IGludFtibG9ja3MubGVuZ3RoKjJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYmxvY2tzLCAwLCBuZXdMaXN0LCAwLCBibG9ja3MubGVuZ3RoKTsKLQkJCQlibG9ja3MgPSBuZXdMaXN0OwotCQkJfQotCQkJYmxvY2tzW3RvcEJsb2NrXSA9IGJsb2NrTnVtYmVyOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBibG9jayBlbmQuIFRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgdGhlIGdpdmVuIG51bWJlciwgb3IgaXQgaXMgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEJsb2NrRW5kKGludCBibG9ja051bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCXByaW50VHJhY2UoIkVuZCBCbG9jayAjIitibG9ja051bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmIChibG9ja3MgPT0gbnVsbCB8fCB0b3BCbG9jayA8IDAgfHwgYmxvY2tzW3RvcEJsb2NrXSAhPSBibG9ja051bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoQmxvY2tFbmQuUmVjZWl2ZWRFbmRCbG9ja3NPdXRPZk9yZGVyX0VYQ18iKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRvcEJsb2NrLS07Ci0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gQkxPQ0tfSUdOT1JFICYmIGJsb2NrTnVtYmVyID09IGJyZWFrQmxvY2spIHsKLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIFNraXAgYWxsIGZvbGxvd2luZyB1bnRpbCB3ZSBoaXQgdGhlIHJlcXVlc3RlZCBibG9jayBudW1iZXIuCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEJsb2NrQnJlYWsoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlKCJCcmVhayBCbG9jayAjIitibG9ja051bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uID09IG51bGwpIHsKLQkJCQlpZ25vcmVFeHByZXNzaW9uID0gQkxPQ0tfSUdOT1JFOwkvLyBTdGFydCBpZ25vcmluZyBleHByZXNzaW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGJsb2NrIG51bWJlciBlbmQgYmxvY2suCi0JCQkJYnJlYWtCbG9jayA9IGJsb2NrTnVtYmVyOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBUUllfVEhST1dfSUdOT1JFID0gIlRSWSBUSFJPVyBJR05PUkUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFRSWV9GSU5BTF9JR05PUkUgPSAiVFJZIEZJTkFMIElHTk9SRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludFtdIHRyeXM7CS8vIFN0YWNrIG9mIHRyeSBudW1iZXJzIGN1cnJlbnRseSBldmFsdWF0aW5nLgotCS8vIFN0YWNrIG9mIHRyeXMgaW4gY2F0Y2ggY2xhdXNlIChpLmUuIHN0YXJ0aW5nIGV4ZWN1dGluZyBhIGNhdGNoL2ZpbmFsIGNsYXVzZSBmb3IgdGhlIHRyeSkuIENvcnJlc3BvbmRzIHdpdGggdHJ5IGZyb20gc2FtZSBpbmRleCBpbiB0cnlzLiBDb250YWlucyB0aGUgdGhyb3dhYmxlIGZvciB0aGUgY2F0Y2guCi0JLy8gVGhpcyBpcyB1c2VkIHRvIGtub3cgd2UgYXJlIGV4ZWN1dGluZyBhIGNhdGNoIChlbnRyeSBub3QgbnVsbCkgYW5kIGZvciB0aGUgcmV0aHJvdyBzaG9ydC1oYW5kIHRvIHJldGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uIHdpdGhpbiB0aGUgY2F0Y2guCi0JcHJpdmF0ZSBUaHJvd2FibGVbXSB0cnlzSW5DYXRjaDsJCi0JcHJpdmF0ZSBpbnQgdG9wVHJ5ID0gLTE7CS8vIFRvcCB0cnkgaW5kZXguCi0JcHJpdmF0ZSBpbnQgYnJlYWtUcnkgPSAtMTsJLy8gVHJ5IG51bWJlciB3ZSBhcmUgYnJlYWtpbmcgdG8uCi0JcHJpdmF0ZSBUaHJvd2FibGUgY2F0Y2hUaHJvd2FibGU7CS8vIFRoZSB0aHJvd2FibGUgdG8gY2hlY2sgY2F0Y2hlcyBhZ2FpbnN0LgotCQotCS8qKgotCSAqIFB1c2ggYSB0cnkgc3RhdGVtZW50LgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5QmVnaW4oaW50IHRyeU51bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlwcmludFRyYWNlKCJCZWdpbiBUcnkgIyIrdHJ5TnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwpIHsKLQkJCQl0cnlzID0gbmV3IGludFsxMF07Ci0JCQkJdHJ5c0luQ2F0Y2ggPSBuZXcgVGhyb3dhYmxlWzEwXTsKLQkJCX0KLQkJCWlmICgrK3RvcFRyeSA+PSB0cnlzLmxlbmd0aCkgewotCQkJCWludFtdIG5ld0xpc3QgPSBuZXcgaW50W3RyeXMubGVuZ3RoKjJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodHJ5cywgMCwgbmV3TGlzdCwgMCwgdHJ5cy5sZW5ndGgpOwotCQkJCXRyeXMgPSBuZXdMaXN0OwotCQkJCVRocm93YWJsZVtdIG5ld0NhdGNoZXMgPSBuZXcgVGhyb3dhYmxlW3RyeXMubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRyeXNJbkNhdGNoLCAwLCBuZXdDYXRjaGVzLCAwLCB0cnlzSW5DYXRjaC5sZW5ndGgpOwotCQkJCXRyeXNJbkNhdGNoID0gbmV3Q2F0Y2hlczsKLQkJCX0KLQkJCXRyeXNbdG9wVHJ5XSA9IHRyeU51bWJlcjsKLQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhyb3cgdGhlIHRvcCBzdGFjayBlbnRyeS4gSXQgbXVzdCBiZSBhbiBleGNlcHRpb24uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRocm93RXhjZXB0aW9uKCkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiVGhyb3cgZXhjZXB0aW9uOiAiLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgdCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCh0KTsKLQkJCQl9Ci0JCQkJdGhyb3dFeGNlcHRpb24oKFRocm93YWJsZSkgdCk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBUaHJvdyB0aGlzIGV4Y2VwdGlvbiAobWVhbnMgdGhyb3cgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQsIG5vdCB0aHJvdyBmb3IgdGhpcyB0aHJlYWQpLgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB0aHJvd0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmICh0b3BUcnkgPT0gLTEpIHsKLQkJCS8vIFRoZXJlIGFyZSBubyB0cmllcywgc28gdHJlYXQgdGhpcyBhcyBhIHN5bnRheCBlcnJvci4KLQkJCWlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikgZXhjZXB0aW9uKTsKLQkJCWVsc2UKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gZWxzZSBpZiAodHJ5c0luQ2F0Y2hbdG9wVHJ5XSA9PSBudWxsKSB7Ci0JCQkvLyBXZSBhcmUgbm90IGluIGEgY2F0Y2ggY2xhdXNlIG9mIHRoZSB0b3AgdHJ5LiBTbyBkbyBhIHRocm93IGlnbm9yZSBmb3IgdG9wdHJ5LgotCQkJaWdub3JlRXhwcmVzc2lvbiA9IFRSWV9USFJPV19JR05PUkU7Ci0JCQlicmVha1RyeSA9IHRyeXNbdG9wVHJ5XTsKLQkJCWNhdGNoVGhyb3dhYmxlID0gZXhjZXB0aW9uOwotCQl9IGVsc2UgewotCQkJLy8gV2UgYXJlIGluIGEgY2F0Y2ggb2YgdGhlIHRvcCB0cnkuIFNvIGRvIGEgdGhyb3cgdG8gZmluYWxseSBpbnN0ZWFkLgotCQkJaWdub3JlRXhwcmVzc2lvbiA9IFRSWV9GSU5BTF9JR05PUkU7Ci0JCQl0cnlzSW5DYXRjaFt0b3BUcnldID0gRklOQUxfQ0FUQ0g7Ci0JCQlicmVha1RyeSA9IHRyeXNbdG9wVHJ5XTsKLQkJCWNhdGNoVGhyb3dhYmxlID0gZXhjZXB0aW9uOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBjYXRjaCBjbGF1c2UKLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeUNhdGNoQ2xhdXNlKGludCB0cnlOdW1iZXIsIENsYXNzIGV4Y2VwdGlvblR5cGUsIEludGVybmFsRXhwcmVzc2lvblByb3h5IGV4cHJlc3Npb25Qcm94eSkgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCWlmIChleHByZXNzaW9uUHJveHkgPT0gbnVsbCkKLQkJCQkJcHJpbnRUcmFjZSgiQ2F0Y2ggVHJ5ICMiK3RyeU51bWJlcisiICgiK2V4Y2VwdGlvblR5cGUrJyknLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZWxzZQotCQkJCQlwcmludFRyYWNlKCJDYXRjaCBUcnkgIyIrdHJ5TnVtYmVyKyIgKCIrZXhjZXB0aW9uVHlwZSsiKSBSZXR1cm4gZXhjZXB0aW9uIGluIHByb3h5ICMiK2V4cHJlc3Npb25Qcm94eS5nZXRQcm94eUlEKCksIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkJCQotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAodHJ5cyA9PSBudWxsIHx8IHRvcFRyeSA8IDAgfHwgdHJ5c1t0b3BUcnldICE9IHRyeU51bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5Q2F0Y2hDbGF1c2UuQ2F0Y2hSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJCQkvLyBOb3JtYWwgZmxvdywgbm8gdGhyb3cgaW4gcHJvZ3Jlc3MsIHNvIGp1c3QgaWdub3JlIG5vdyB1bnRpbCB0aGUgZmluYWxseSBvciBlbmQgdHJ5IHJlYWNoZWQuCi0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBUUllfRklOQUxfSUdOT1JFOwotCQkJCQlicmVha1RyeSA9IHRyeU51bWJlcjsKLQkJCQl9IGVsc2UgaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gVFJZX1RIUk9XX0lHTk9SRSAmJiB0cnlOdW1iZXIgPT0gYnJlYWtUcnkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb2NjdXJpbmcgaW4gdGhpcyB0cnkgYmxvY2ssIHNlZSBpZiBmb3IgdXMsIGFuZCBpZiBpdCBpcywgc3RvcCBpZ25vcmluZy4KLQkJCQkJLy8gRWxzZSBqdXN0IGNvbnRpbnVlIGlnbm9yaW5nLgotCQkJCQlpZiAoZXhjZXB0aW9uVHlwZS5pc0luc3RhbmNlKGNhdGNoVGhyb3dhYmxlKSkgewotCQkJCQkJLy8gRm9yIHVzLCBzbyBqdXN0IHR1cm4gZXZlcnl0aGluZyBiYWNrIG9uLCBleGNlcHQgbWFyayB0aGF0IHdlIGFyZSBpbiB0aGUgY2F0Y2ggcGhhc2UuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBjYXRjaFRocm93YWJsZTsgLy8gVGhpcyBpcyBzbyB0aGF0IHdlIGtub3cgaWYgd2UgdGhyb3cgYWdhaW4gdGhhdCB3ZSBzaG91bGQgbm90IGNhdGNoIGFueXRoaW5nLgotCQkJCQkJYnJlYWtUcnkgPSAtMTsKLQkJCQkJCWlmIChleHByZXNzaW9uUHJveHkgIT0gbnVsbCkgewotCQkJCQkJCWV4cHJlc3Npb25Qcm94eS5zZXRQcm94eShjYXRjaFRocm93YWJsZSwgY2F0Y2hUaHJvd2FibGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoZXhwcmVzc2lvblByb3h5KTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludCgiIENhdWdodDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KGNhdGNoVGhyb3dhYmxlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoVGhyb3dhYmxlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvLyBUaGlzIGlzIHVzZWQgb25seSBzbyB0aGF0IGZpbmFsbHkgY2xhdXNlIGNhbiBpbmRpY2F0ZSBpdCB3YXMgZXhlY3V0aW5nIHNvIHRoYXQgZW5kIGV4cHJlc3Npb24ga25vd3MgdGhpcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJvd2FibGUgRklOQUxfQ0FUQ0ggPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUHVzaCB0aGUgdHJ5IGZpbmFsbHkgY2xhdXNlLgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5RmluYWxseUNsYXVzZShpbnQgdHJ5TnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJcHJpbnRUcmFjZSgiRmluYWxseSBUcnkgIyIrdHJ5TnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlGaW5hbGx5Q2xhdXNlLkZpbmFsbHlSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRyeU51bWJlciA9PSBicmVha1RyeSAmJiAoaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfVEhST1dfSUdOT1JFIHx8IGlnbm9yZUV4cHJlc3Npb24gPT0gVFJZX0ZJTkFMX0lHTk9SRSkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb2NjdXJpbmcgaW4gdGhpcyB0cnkgYmxvY2sgb3IgYSBjYXRjaCB3YXMgcmVhY2hlZCAoaW4gd2hpY2ggY2FzZSBhbGwgaW50ZXJ2ZW5pbmcgY2F0Y2gncyB3ZXJlIGlnbm9yZWQpLgotCQkJCQkvLyBOb3cgZG8gYSBub3JtYWwgZXhlY3V0aW9uLiBJZiB3ZSBhcmUgaGVyZSBkdWUgdG8gYSB0aHJvdyB0aGF0IHdhc24ndCBjbGVhcmVkIChlaXRoZXIgbm8gY2F0Y2ggb3IgYW5vdGhlciB0aHJvdyBvY2N1cmVkIHdpdGhpbiB0aGUgY2F0Y2gpCi0JCQkJCS8vIHRoZW4gd2UgbGVhdmUgaXQgdW5jbGVhcmVkIHNvIHRoYXQgdHJ5L2VuZCBtYXkgcmV0aHJvdyBpdC4KLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBGSU5BTF9DQVRDSDsgLy8gV2UgYXJlIGluIHRoZSBmaW5hbGx5IGNsYXVzZSBvZiBhIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24gd2l0aGluIHRoaXMgdHJ5LgotCQkJCQlicmVha1RyeSA9IC0xOwotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiBFeGVjdXRpbmcgZmluYWxseS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBSZXRocm93IHRoZSBjYXVnaHQgZXhjZXB0aW9uLiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yOgotCSAqIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICogICAuLi4gZG8gc3R1ZmYgLi4uCi0JICogICB0aHJvdyBlOwotCSAqIH0KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeVJldGhyb3coaW50IHRyeU51bWJlcikgewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIlJldGhyb3cgVHJ5ICMiK3RyeU51bWJlciwgZXJyb3JPY2N1cnJlZCAgfHwgaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpcyBub3QgY2FsbGVkIG91dCBvZiBvcmRlci4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlSZXRocm93LlJldGhyb3dSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJaWYgKHRyeXNJbkNhdGNoW3RvcFRyeV0gPT0gbnVsbCB8fCB0cnlzSW5DYXRjaFt0b3BUcnldID09IEZJTkFMX0NBVENIKQotCQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeVJldGhyb3cuUmV0cnlSZWNlaXZlZE91dE9mRXhlY3V0aW5nQ2F0Y2hDbGF1c2VfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIHsKLQkJCQkJdGhyb3dFeGNlcHRpb24odHJ5c0luQ2F0Y2hbdG9wVHJ5XSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeUVuZChpbnQgdHJ5TnVtYmVyKSB7Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQlpbmRlbnQoZmFsc2UpOwotCQkJcHJpbnRUcmFjZSgiRW5kIFRyeSAjIit0cnlOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlFbmQuVHJ5RW5kUmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ18iKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gaW5DYXRjaCA9IHRyeXNJbkNhdGNoW3RvcFRyeV0gIT0gbnVsbDsKLQkJCQl0cnlzSW5DYXRjaFt0b3BUcnldID0gbnVsbDsKLQkJCQl0b3BUcnktLTsKLQkJCQlpZiAoaW5DYXRjaCB8fCAodHJ5TnVtYmVyID09IGJyZWFrVHJ5ICYmIChpZ25vcmVFeHByZXNzaW9uID09IFRSWV9USFJPV19JR05PUkUgfHwgaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfRklOQUxfSUdOT1JFKSkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb3Igbm9ybWFsIGZsb3cgdGhyb3VnaCBhIGNhdGNoLiBFaXRoZXIgd2F5IGlmIHRoZXJlIGlzIGEgdGhyb3dhYmxlIHN0aWxsIHBlbmRpbmcsIHdlIHJldGhyb3cuCi0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQlicmVha1RyeSA9IC0xOwotCQkJCQlpZiAoY2F0Y2hUaHJvd2FibGUgIT0gbnVsbCkKLQkJCQkJCXRocm93RXhjZXB0aW9uKGNhdGNoVGhyb3dhYmxlKTsKLQkJCQl9IAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIENsYXNzIHVzZWQgdG8gc2F2ZSB0aGUgc3RhdGUgYXQgdGltZSBvZiBtYXJrLiBJdCB3aWxsCi0JICogYmUgdXNlZCB0byByZXN0b3JlIHN0YXRlIGlmIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTYXZlU3RhdGUgewotCQlwdWJsaWMgaW50IG1hcmtJRDsKLQkJCi0JCS8vIEJsb2NrIHN0YXRlCi0JCXB1YmxpYyBpbnQgdG9wQmxvY2s7Ci0JCXB1YmxpYyBpbnQgYnJlYWtCbG9jazsKLQotCQkvLyBTdWJleHByZXNzaW9uIHN0YXRlCi0JCXB1YmxpYyBpbnQgdG9wU3ViZXhwcmVzc2lvbjsKLQotCQkvLyBUcnkgc3RhdGUKLQkJcHVibGljIGludCB0b3BUcnk7Ci0JCXB1YmxpYyBpbnQgYnJlYWtUcnk7Ci0JCXB1YmxpYyBUaHJvd2FibGUgY2F0Y2hUaHJvd2FibGU7Ci0JCQotCQkvLyBFcnJvciBzdGF0ZQotCQlwdWJsaWMgYm9vbGVhbiBlcnJvck9jY3VycmVkOwotCQlwdWJsaWMgYm9vbGVhbiBub3ZhbHVlRXhjZXB0aW9uOwotCQlwdWJsaWMgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKLQkJcHVibGljIE9iamVjdCBpZ25vcmVFeHByZXNzaW9uOwotCQkKLQkJLy8gRXhwcmVzc2lvbiBzdGFjayBzdGF0ZQotCQlwdWJsaWMgaW50IGV4cHJlc3Npb25TdGFja1BvczsKLQkJCi0JCS8vIElmL2Vsc2Ugc3RhdGUKLQkJcHVibGljIGludCBpZkVsc2VOZXN0aW5nOwotCQlwdWJsaWMgaW50IGlmRWxzZUlnbm9yZU5lc3RDb3VudDsKLQkJcHVibGljIGJvb2xlYW4gaWZFbHNlU2tpcFRydWVQYXJ0OwotCQkKLQkJLy8gT3RoZXIKLQkJcHVibGljIGludCBpbmRlbnQ7Ci0JCXB1YmxpYyBpbnQgZXhwcmVzc2lvblByb3h5UG9zOwotCQkKLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhbmQgc2F2ZSB0aGUgc3RhdGUuCi0JCSAqIAotCQkgKiBAcGFyYW0gbWFya051bWJlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgU2F2ZVN0YXRlKGludCBtYXJrSUQpIHsKLQkJCXRoaXMubWFya0lEID0gbWFya0lEOwotCQkJCi0JCQlFeHByZXNzaW9uUHJvY2Vzc2VyIGVwID0gRXhwcmVzc2lvblByb2Nlc3Nlci50aGlzOwotCQkJdGhpcy50b3BCbG9jayA9IGVwLnRvcEJsb2NrOwotCQkJdGhpcy5icmVha0Jsb2NrID0gZXAuYnJlYWtCbG9jazsKLQkJCQotCQkJdGhpcy50b3BTdWJleHByZXNzaW9uID0gZXAudG9wU3ViZXhwcmVzc2lvbjsKLQkJCQotCQkJdGhpcy50b3BUcnkgPSBlcC50b3BUcnk7Ci0JCQl0aGlzLmJyZWFrVHJ5ID0gZXAuYnJlYWtUcnk7Ci0JCQl0aGlzLmNhdGNoVGhyb3dhYmxlID0gZXAuY2F0Y2hUaHJvd2FibGU7Ci0JCQkKLQkJCXRoaXMuZXJyb3JPY2N1cnJlZCA9IGVwLmVycm9yT2NjdXJyZWQ7Ci0JCQl0aGlzLm5vdmFsdWVFeGNlcHRpb24gPSBlcC5ub3ZhbHVlRXhjZXB0aW9uOwotCQkJdGhpcy5leGNlcHRpb24gPSBlcC5leGNlcHRpb247Ci0JCQl0aGlzLmlnbm9yZUV4cHJlc3Npb24gPSBlcC5pZ25vcmVFeHByZXNzaW9uOwotCQkJCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1BvcyA9IGV4cHJlc3Npb25TdGFjay5zaXplKCktMTsKLQkJCQotCQkJdGhpcy5pZkVsc2VOZXN0aW5nID0gZXAuaWZFbHNlTmVzdGluZzsKLQkJCXRoaXMuaWZFbHNlSWdub3JlTmVzdENvdW50ID0gZXAuaWZFbHNlSWdub3JlTmVzdENvdW50OwotCQkJdGhpcy5pZkVsc2VTa2lwVHJ1ZVBhcnQgPSBlcC5pZkVsc2VTa2lwVHJ1ZVBhcnQ7Ci0JCQkKLQkJCXRoaXMuaW5kZW50ID0gZXAuaW5kZW50OwotCQkJdGhpcy5leHByZXNzaW9uUHJveHlQb3MgPSBleHByZXNzaW9uUHJveGllcyAhPSBudWxsID8gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpLTEgOiAtMTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJlc3RvcmUgdGhlIHN0YXRlLgotCQkgKiAKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKCkgewotCQkJRXhwcmVzc2lvblByb2Nlc3NlciBlcCA9IEV4cHJlc3Npb25Qcm9jZXNzZXIudGhpczsKLQkJCWVwLnRvcEJsb2NrID0gdGhpcy50b3BCbG9jazsKLQkJCWVwLmJyZWFrQmxvY2sgPSB0aGlzLmJyZWFrQmxvY2s7Ci0KLQkJCWVwLnRvcFN1YmV4cHJlc3Npb24gPSB0aGlzLnRvcFN1YmV4cHJlc3Npb247Ci0JCQkKLQkJCWVwLnRvcFRyeSA9IHRoaXMudG9wVHJ5OwotCQkJZXAuYnJlYWtUcnkgPSB0aGlzLmJyZWFrVHJ5OwotCQkJZXAuY2F0Y2hUaHJvd2FibGUgPSB0aGlzLmNhdGNoVGhyb3dhYmxlOwotCQkJaWYgKHRyeXNJbkNhdGNoICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gdG9wVHJ5ICsgMTsgaSA8IGVwLnRyeXNJbkNhdGNoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWVwLnRyeXNJbkNhdGNoW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWVwLmVycm9yT2NjdXJyZWQgPSB0aGlzLmVycm9yT2NjdXJyZWQ7Ci0JCQllcC5ub3ZhbHVlRXhjZXB0aW9uID0gZXAubm92YWx1ZUV4Y2VwdGlvbjsKLQkJCWVwLmV4Y2VwdGlvbiA9IHRoaXMuZXhjZXB0aW9uOwotCQkJZXAuaWdub3JlRXhwcmVzc2lvbiA9IHRoaXMuaWdub3JlRXhwcmVzc2lvbjsKLQkJCQotCQkJLy8gUG9wIHN0YWNrIGRvd24gdG8gc2F2ZWQgc3RhdGUuCi0JCQlmb3IgKGludCBpID0gZXhwcmVzc2lvblN0YWNrLnNpemUoKS0xOyBpID4gdGhpcy5leHByZXNzaW9uU3RhY2tQb3M7IGktLSkgewotCQkJCWV4cHJlc3Npb25TdGFjay5yZW1vdmUoaSk7Ci0JCQkJZXhwcmVzc2lvblR5cGVTdGFjay5yZW1vdmUoaSk7Ci0JCQl9Ci0JCQkKLQkJCWVwLmlmRWxzZU5lc3RpbmcgPSB0aGlzLmlmRWxzZU5lc3Rpbmc7Ci0JCQllcC5pZkVsc2VJZ25vcmVOZXN0Q291bnQgPSB0aGlzLmlmRWxzZUlnbm9yZU5lc3RDb3VudDsKLQkJCWVwLmlmRWxzZVNraXBUcnVlUGFydCA9IHRoaXMuaWZFbHNlU2tpcFRydWVQYXJ0OwotCQkJCi0JCQllcC5pbmRlbnQgPSB0aGlzLmluZGVudDsKLQkJCQotCQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpIC0gMTsgaSA+IHRoaXMuZXhwcmVzc2lvblByb3h5UG9zOyBpLS0pIHsKLQkJCQkJZXhwcmVzc2lvblByb3hpZXMucmVtb3ZlKGkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gVGhlc2Ugc2V0dGluZ3MgY2FuJ3QgY3Jvc3MgbWFyayBib3VuZGFyaWVzLCBzbyByZXNldCB0aGVtIHRvIG5vdCBzZXQuIFRoaXMgaXMgaW4gY2FzZSB3ZSB3ZXJlIGluIHRoaXMgc3RhdGUgc29tZXdoZXJlCi0JCQkvLyBpbiB0aGUgbWFyayB3aGVuIHRoZSByZXN0b3JlIG9jY3VycmVkLgotCQkJZXAuY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPSAwOwotCQkJZXAuY29uZGl0aW9uYWxOZXN0aW5nID0gMDsKLQkJCWVwLnNraXBUcnVlUGFydCA9IGZhbHNlOwotCQkJCi0JCQllcC5pbmZpeElnbm9yZU5lc3RDb3VudCA9IDA7Ci0JCQllcC5pbmZpeE5lc3RpbmcgPSAwOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgc2F2ZSBzdGF0ZSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiBAcGFyYW0gbWFya0lECi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RhdGUgY3JlYXRlU2F2ZVN0YXRlKGludCBtYXJrSUQpIHsKLQkJcmV0dXJuIG5ldyBTYXZlU3RhdGUobWFya0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgc3RhcnQgb2YgYSBtYXJrLgotCSAqIEBwYXJhbSBtYXJrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaE1hcmsoaW50IG1hcmtOdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJNYXJrIyIrbWFya051bWJlciwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoc2F2ZVN0YXRlcyA9PSBudWxsKQotCQkJc2F2ZVN0YXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2F2ZVN0YXRlcy5hZGQoY3JlYXRlU2F2ZVN0YXRlKG1hcmtOdW1iZXIpKTsKLQkJCi0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZUVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBlbmQgbWFyay4gSWYgdGhlcmUgaXMgbm8gZXJyb3IsIGl0IHdpbGwgc2ltcGx5Ci0JICogcmVtb3ZlIGl0IGFuZCBhbGwgc2F2ZSBzdGF0ZXMgaW4gdGhlIG1hcCBhZnRlciBpdC4gSWYgdGhlcmUKLQkgKiBpcyBhbiBlcnJvciBpdCB3aWxsIGRvIHRoaXMgcGx1cyBpdCB3aWxsIHJlc3RvcmUgdGhlIHN0YXRlLgotCSAqIDxwPgotCSAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgY2FsbHMgYXJlIGNvbWluZyBpbiBjb3JyZWN0IG9yZGVyIGZyb20KLQkgKiB0aGUgc2VydmVyIHNvIHdlIHdvbid0IGNoZWNrIHZhbGlkaXR5LgotCSAqIAotCSAqIEBwYXJhbSBtYXJrSUQKLQkgKiBAcGFyYW0gcmVzdG9yZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hFbmRtYXJrKGludCBtYXJrSUQsIGJvb2xlYW4gcmVzdG9yZSkgewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkVuZCBNYXJrIyIrbWFya0lEKyIgUmVzdG9yZWQ9IityZXN0b3JlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChzYXZlU3RhdGVzICE9IG51bGwpIHsKLQkJCQkvLyBTdGFydCBmcm9tIHRoZSBlbmQgKHNpbmNlIHRoYXQgaXMgd2hlcmUgaXQgbW9zdCBsaWtlbHkgd2lsbCBiZSkgYW5kIHN0YXJ0Ci0JCQkJLy8gc2VhcmNoLCByZW1vdmluZyB0aGUgZW5kIG9uZSB1bnRpbCB3ZSByZWFjaCB0aGUgbWFya0lELgotCQkJCWZvciAoaW50IGkgPSBzYXZlU3RhdGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCVNhdmVTdGF0ZSBzdGF0ZSA9IChTYXZlU3RhdGUpIHNhdmVTdGF0ZXMucmVtb3ZlKGkpOwotCQkJCQlpZiAoc3RhdGUubWFya0lEID09IG1hcmtJRCkgewotCQkJCQkJLy8gV2UgZm91bmQgaXQuCi0JCQkJCQlpZiAocmVzdG9yZSkKLQkJCQkJCQlzdGF0ZS5yZXN0b3JlU3RhdGUoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBCdXQgdG8gYmUgc2FmZSwgaWYgd2UgZ290IGhlcmUsIHRoaXMgaXMgYmFkLiBXZSB0cmllZCByZXN0b3JlIGEgbWFyayB3ZSBkaWRuJ3QgaGF2ZS4KLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaEVuZG1hcmsuRW5kTWFya09uTm9uRXhpc3RpbmdJRF9FWENfIiksIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihtYXJrSUQpfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgaW50W10gc3ViZXhwcmVzc2lvbnM7CS8vIFN0YWNrIG9mIHN1YmV4cHJlc3Npb24gbnVtYmVycyBjdXJyZW50bHkgZXZhbHVhdGluZy4KLQlwcml2YXRlIGludFtdIHN1YmV4cHJlc3Npb25TdGFja1BvczsJLy8gU3RhY2sgb2YgdGhlIGV4cHJlc3Npb24gc3RhY2sgcG9zaXRpb25zIChuZXh0IGVudHJ5IGluZGV4KSBmb3IgY3VycmVudGx5IGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMuIFRoZSBldmFsdWF0aW9uIHN0YWNrIGNhbm5vdCBiZSBwb3BwZWQgYmV5b25kIHRoZSBjdXJyZW50IHRvcC4gQW5kIGF0IGVuZCBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgdG8gdGhlIHBvc2l0aW9uLgotCXByaXZhdGUgaW50IHRvcFN1YmV4cHJlc3Npb24gPSAtMTsJLy8gVG9wIHN1YmV4cHJlc3Npb24gaW5kZXguCi0KLQkKLQkvKioKLQkgKiBQdXNoIGEgYmVnaW4gc3ViZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gc3ViZXhwcmVzc2lvbk51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hTdWJleHByZXNzaW9uQmVnaW4oaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIkJlZ2luIFN1YmV4cHJlc3Npb24gIyIrc3ViZXhwcmVzc2lvbk51bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCWluZGVudCh0cnVlKTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHN1YmV4cHJlc3Npb25zID09IG51bGwpIHsKLQkJCQlzdWJleHByZXNzaW9ucyA9IG5ldyBpbnRbMTBdOwotCQkJCXN1YmV4cHJlc3Npb25TdGFja1BvcyA9IG5ldyBpbnRbMTBdOwotCQkJfQotCQkJaWYgKCsrdG9wU3ViZXhwcmVzc2lvbiA+PSBzdWJleHByZXNzaW9ucy5sZW5ndGgpIHsKLQkJCQlpbnRbXSBuZXdMaXN0ID0gbmV3IGludFtzdWJleHByZXNzaW9ucy5sZW5ndGgqMl07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShzdWJleHByZXNzaW9ucywgMCwgbmV3TGlzdCwgMCwgc3ViZXhwcmVzc2lvbnMubGVuZ3RoKTsKLQkJCQlzdWJleHByZXNzaW9ucyA9IG5ld0xpc3Q7Ci0JCQkJbmV3TGlzdCA9IG5ldyBpbnRbc3ViZXhwcmVzc2lvblN0YWNrUG9zLmxlbmd0aCoyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1YmV4cHJlc3Npb25TdGFja1BvcywgMCwgbmV3TGlzdCwgMCwgc3ViZXhwcmVzc2lvblN0YWNrUG9zLmxlbmd0aCk7Ci0JCQkJc3ViZXhwcmVzc2lvblN0YWNrUG9zID0gbmV3TGlzdDsJCQkJCi0JCQl9Ci0JCQlzdWJleHByZXNzaW9uc1t0b3BTdWJleHByZXNzaW9uXSA9IHN1YmV4cHJlc3Npb25OdW1iZXI7Ci0JCQlzdWJleHByZXNzaW9uU3RhY2tQb3NbdG9wU3ViZXhwcmVzc2lvbl0gPSBleHByZXNzaW9uU3RhY2suc2l6ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBzdWJleHByZXNzaW9uIGVuZC4gVGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBtdXN0IGJlIHRoZSBnaXZlbiBudW1iZXIsIG9yIGl0IGlzIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBzdWJleHByZXNzaW9uTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25FbmQoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJaW5kZW50KGZhbHNlKTsKLQkJCQlwcmludFRyYWNlKCJFbmQgU3ViZXhwcmVzc2lvbiAjIitzdWJleHByZXNzaW9uTnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHN1YmV4cHJlc3Npb25zID09IG51bGwgfHwgdG9wU3ViZXhwcmVzc2lvbiA8IDAgfHwgc3ViZXhwcmVzc2lvbnNbdG9wU3ViZXhwcmVzc2lvbl0gIT0gc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoU3ViZXhwcmVzc2lvbkVuZC5SZWNlaXZlZEVuZFN1YmV4cHJlc3Npb25zT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlwb3BFeHByZXNzaW9ucyhleHByZXNzaW9uU3RhY2suc2l6ZSgpLXN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSk7Ci0JCQkJCXRvcFN1YmV4cHJlc3Npb24tLTsKLQkJCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Gb3JFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRm9yRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ3YmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Gb3JFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogRW51bSBmb3IgdGhlIGZvckV4cHJlc3Npb24gcGFyYW1ldGVycy4KLSAqIDxwPgotICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjdXN0b21lcnMuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEZvckV4cHJlc3Npb24gZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYSByb290IGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST09URVhQUkVTU0lPTl9WQUxVRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gUk9PVEVYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihST09URVhQUkVTU0lPTl9WQUxVRSwgIlJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGFycmF5IGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGFjY2VzcyAoaS5lLiB0aGUgYXJyYXkgdG8gYWNjZXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZQUNDRVNTX0FSUkFZX1ZBTFVFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUFDQ0VTU19BUlJBWSA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZQUNDRVNTX0FSUkFZX1ZBTFVFLCAiQXJyYXkgQWNjZXNzOiBBcnJheSBPcGVyYW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIGFuIGluZGV4IGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGFjY2VzcyAoaS5lLiBvbmUgb2YgdGhlIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgPGNvZGU+W108L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWUFDQ0VTU19JTkRFWF9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQVJSQVlBQ0NFU1NfSU5ERVggPSBuZXcgRm9yRXhwcmVzc2lvbihBUlJBWUFDQ0VTU19JTkRFWF9WQUxVRSwgIkFycmF5IEFjY2VzczogSW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZGltZW5zaW9uIGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGNyZWF0aW9uIChpLmUuIG9uZSBvZiB0aGUgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSA8Y29kZT5bXTwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZQ1JFQVRJT05fRElNRU5TSU9OX1ZBTFVFID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZQ1JFQVRJT05fRElNRU5TSU9OX1ZBTFVFLCAiQXJyYXkgQWNjZXNzOiBEaW1lbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgKGkuZS4gb25lIG9mIHRoZSBleHByZXNzaW9ucyB3aXRoIHRoZSA8Y29kZT57fTwvY29kZT4pLiBTcGVjaWFsIGNhc2UgaXMgdGhhdAotCSAqIGFycmF5IGluaXRpYWxpemVycyBhcmUgdmFsaWQgYXMgYW4gZXhwcmVzc2lvbiB3aXRoaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIgYW5kIGl0IGRvZXNuJ3QgdXNlIGEgZm9yIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihBUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUsICJBcnJheSBJbml0aWFsaXplciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGNhc3QgKGkuZS4gdGhlIGV4cHJlc2lvbiBhZnRlciB0aGUgPGNvZGU+KHR5cGUpPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTVF9FWFBSRVNTSU9OX1ZBTFVFID0gNTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDQVNUX0VYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihDQVNUX0VYUFJFU1NJT05fVkFMVUUsICJDYXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBhcmd1bWVudCBleHByZXNzaW9uIGZvciB0aGUgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVF9WQUxVRSA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UID0gbmV3IEZvckV4cHJlc3Npb24oQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UX1ZBTFVFLAotCQkJIkNsYXNzIEluc3RhbmNlIENyZWF0aW9uOiBBcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgY29uZGl0aW9uIGZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfQ09ORElUSU9OX1ZBTFVFID0gNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDT05ESVRJT05BTF9DT05ESVRJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihDT05ESVRJT05BTF9DT05ESVRJT05fVkFMVUUsICJDb25kaXRpb25hbDogQ29uZGl0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSB0cnVlICh0aGVuKSBleHByZXNzaW9uIGZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfVFJVRV9WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQ09ORElUSU9OQUxfVFJVRSA9IG5ldyBGb3JFeHByZXNzaW9uKENPTkRJVElPTkFMX1RSVUVfVkFMVUUsICJDb25kaXRpb25hbDogVHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgZmFsc2UgKGVsc2UpIGNvbmRpdGlvbiBmb3IgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFID0gOTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDT05ESVRJT05BTF9GQUxTRSA9IG5ldyBGb3JFeHByZXNzaW9uKENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFLCAiQ29uZGl0aW9uYWw6IEZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSByZWNlaXZlciBmb3IgYSBmaWVsZCBhY2Nlc3MgKGkuZS4gdGhlIGV4cHJlc3Npb24gYmVmb3JlIHRoZSAiLiIpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVDRUlWRVJfVkFMVUUgPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBGSUVMRF9SRUNFSVZFUiA9IG5ldyBGb3JFeHByZXNzaW9uKEZJRUxEX1JFQ0VJVkVSX1ZBTFVFLCAiRmllbGQgQWNjZXNzOiBSZWNlaXZlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFuIGluZml4IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSVhfTEVGVF9WQUxVRSA9IDExOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElORklYX0xFRlQgPSBuZXcgRm9yRXhwcmVzc2lvbihJTkZJWF9MRUZUX1ZBTFVFLCAiSW5maXg6IExlZnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgYW4gaW5maXggZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9SSUdIVF9WQUxVRSA9IDEyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElORklYX1JJR0hUID0gbmV3IEZvckV4cHJlc3Npb24oSU5GSVhfUklHSFRfVkFMVUUsICJJbmZpeDogUmlnaHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZXh0ZW5kZWQgb3BlcmFuZCBvZiBhbiBpbmZpeCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklYX0VYVEVOREVEX1ZBTFVFID0gMTM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSU5GSVhfRVhURU5ERUQgPSBuZXcgRm9yRXhwcmVzc2lvbihJTkZJWF9FWFRFTkRFRF9WQUxVRSwgIkluZml4OiBFeHRlbmRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgdmFsdWUgZXhwcmVzc2lvbiBvZiBhbiBpbnN0YW5jZW9mLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTkNFT0ZfVkFMVUVfVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBJTlNUQU5DRU9GX1ZBTFVFID0gbmV3IEZvckV4cHJlc3Npb24oSU5TVEFOQ0VPRl9WQUxVRV9WQUxVRSwgIkluc3RhbmNlb2YiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYSByZWNlaXZlciBleHByZXNzaW9uIGZvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9SRUNFSVZFUl9WQUxVRSA9IDE1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIE1FVEhPRF9SRUNFSVZFUiA9IG5ldyBGb3JFeHByZXNzaW9uKE1FVEhPRF9SRUNFSVZFUl9WQUxVRSwgIk1ldGhvZCBJbnZva2U6IFJlY2VpdmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIGFuIGFyZ3VtZW50IGZvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BUkdVTUVOVF9WQUxVRSA9IDE2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIE1FVEhPRF9BUkdVTUVOVCA9IG5ldyBGb3JFeHByZXNzaW9uKE1FVEhPRF9BUkdVTUVOVF9WQUxVRSwgIk1ldGhvZCBJbnZva2U6IEFyZ3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBvcGVyYW5kIGV4cHJlc3Npb24gZm9yIGEgcHJlZml4IG9wZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9PUEVSQU5EX1ZBTFVFID0gMTc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gUFJFRklYX09QRVJBTkQgPSBuZXcgRm9yRXhwcmVzc2lvbihQUkVGSVhfT1BFUkFORF9WQUxVRSwgIlByZWZpeDogT3BlcmFuZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgcmlnaHQgb3BlcmFuZCBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0lHTk1FTlRfUklHSFRfVkFMVUUgPSAxODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBU1NJR05NRU5UX1JJR0hUID0gbmV3IEZvckV4cHJlc3Npb24oQVNTSUdOTUVOVF9SSUdIVF9WQUxVRSwgIkFzc2lnbm1lbnQ6IFJpZ2h0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgbGVmdCBleHByZXNzaW9uIGNhbiBvbmx5IGJlIGEgRmllbGRBY2Nlc3Mgb3IgQXJyYXlBY2Nlc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTSUdOTUVOVF9MRUZUX1ZBTFVFID0gMTk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQVNTSUdOTUVOVF9MRUZUID0gbmV3IEZvckV4cHJlc3Npb24oQVNTSUdOTUVOVF9MRUZUX1ZBTFVFLCAiQXNzaWdubWVudDogTGVmdCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgdGhyb3cgb3BlcmFuZCBvZiB0aGUgdGhyb3cgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJPV19PUEVSQU5EX1ZBTFVFID0gMjA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVEhST1dfT1BFUkFORCA9IG5ldyBGb3JFeHByZXNzaW9uKFRIUk9XX09QRVJBTkRfVkFMVUUsICJUaHJvdyBvcGVyYW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBpZiBjb25kaXRpb25hbCBvcGVyYW5kIG9mIHRoZSBpZiBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElGX0NPTkRJVElPTl9WQUxVRSA9IDIxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElGX0NPTkRJVElPTiA9IG5ldyBGb3JFeHByZXNzaW9uKElGX0NPTkRJVElPTl9WQUxVRSwgIklmIGNvbmRpdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgaWYgdHJ1ZSBjbGF1c2Ugb2YgdGhlIGlmIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfVFJVRV9WQUxVRSA9IDIyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElGX1RSVUUgPSBuZXcgRm9yRXhwcmVzc2lvbihJRl9UUlVFX1ZBTFVFLCAiSWYgdHJ1ZSBjbGF1c2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGlmIGVsc2UgY2xhdXNlIG9mIHRoZSBpZiBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElGX0VMU0VfVkFMVUUgPSAyMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBJRl9FTFNFID0gbmV3IEZvckV4cHJlc3Npb24oSUZfRUxTRV9WQUxVRSwgIklmIGVsc2UgY2xhdXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFRoaXMgaXMgbm90IHByaXZhdGUsIGJ1dCBwcm90ZWN0ZWQgb25seSBzbyB0aGF0IHByb3h5IGNvcmUgY2FuIGFkZCBhbiBpbnRlcm5hbCBGb3JFeHByZXNzaW9uIGVudW0uCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjdXN0b21lcnMuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRm9yRXhwcmVzc2lvbihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSUV4cHJlc3Npb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY3MjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLS8qKgotICogVGhlc2UgYXJlIGNvbnN0YW50cyBuZWVkZWQgYnkgSUV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGNvbW1vbiBiZXR3ZWVuCi0gKiB0aGUgdm0gYW5kIHRoZSBJREUuIFRoZXkgYXJlIGFsc28gYXZhaWxhYmxlIHRvIHVzZXJzIG9mIHRoZSBJRXhwcmVzc2lvbgotICogaW50ZXJmYWNlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkNvbnN0YW50cyB7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5maXhPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luZml4T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2NDg2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5maXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEVudW0gZm9yIEluZml4IG9wZXJhdG9yCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5maXhPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBJbmZpeCB0aW1lcyAiKiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9USU1FU19WQUxVRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fVElNRVMgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9USU1FU19WQUxVRSwgIkluZml4ICoiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggZGl2aWRlICIvIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0RJVklERV9WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fRElWSURFID0gbmV3IEluZml4T3BlcmF0b3IoSU5fRElWSURFX1ZBTFVFLCAiSW5maXggLyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCByZW1haW5kZXIgIiUiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUkVNQUlOREVSX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9SRU1BSU5ERVIgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9SRU1BSU5ERVJfVkFMVUUsICJJbmZpeCAlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IHBsdXMgIisiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUExVU19WQUxVRSA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fUExVUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX1BMVVNfVkFMVUUsICJJbmZpeCArIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IG1pbnVzICItIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX01JTlVTX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9NSU5VUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX01JTlVTX1ZBTFVFLCAiSW5maXggLSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBsZWZ0IHNoaWZ0ICIgPCA8IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0xFRlRfU0hJRlRfVkFMVUUgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0xFRlRfU0hJRlQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9MRUZUX1NISUZUX1ZBTFVFLCAiSW5maXggPDwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggcmlnaHQgc2hpZnQgc2lnbmVkICI+PiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUUgPSA2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1JJR0hUX1NISUZUX1NJR05FRCA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX1JJR0hUX1NISUZUX1NJR05FRF9WQUxVRSwgIkluZml4ID4+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IHJpZ2h0IHNoaWZ0IHVuc2lnbmVkICI+Pj4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUUgPSA3OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1JJR0hUX1NISUZUX1VOU0lHTkVEID0gbmV3IEluZml4T3BlcmF0b3IoSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUUsICJJbmZpeCA+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggbGVzcyAiIDwiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fTEVTU19WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fTEVTUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0xFU1NfVkFMVUUsICJJbmZpeCA8Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGdyZWF0ZXIgIj4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fR1JFQVRFUl9WQUxVRSA9IDk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fR1JFQVRFUiA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0dSRUFURVJfVkFMVUUsICJJbmZpeCA+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGxlc3MgdGhhbiBvciBlcXVhbHMgIiA8PSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9MRVNTX0VRVUFMU19WQUxVRSA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0xFU1NfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fTEVTU19FUVVBTFNfVkFMVUUsICJJbmZpeCA8PSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBHcmVhdGVyIHRoYW4gb3IgZXF1bGFzICI+PSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9HUkVBVEVSX0VRVUFMU19WQUxVRSA9IDExOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0dSRUFURVJfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fR1JFQVRFUl9FUVVBTFNfVkFMVUUsICJJbmZpeCA+PSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBlcXVhbHMgIj09IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0VRVUFMU19WQUxVRSA9IDEyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0VRVUFMUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0VRVUFMU19WQUxVRSwgIkluZml4ID09Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IG5vdCBlcXVhbHMgIiE9IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX05PVF9FUVVBTFNfVkFMVUUgPSAxMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9OT1RfRVFVQUxTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fTk9UX0VRVUFMU19WQUxVRSwgIkluZml4ICE9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGV4Y2x1c2l2ZSBvciAiXiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9YT1JfVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9YT1IgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9YT1JfVkFMVUUsICJJbmZpeCBeIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGJpdHdpc2UgYW5kICImIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0FORF9WQUxVRSA9IDE1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0FORCA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0FORF9WQUxVRSwgIkluZml4ICYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggYml0d2lzZSBvciAifCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9PUl9WQUxVRSA9IDE2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX09SID0gbmV3IEluZml4T3BlcmF0b3IoSU5fT1JfVkFMVUUsICJJbmZpeCB8Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IENvbmRpdGlvbmFsIGxvZ2ljYWwgYW5kICImJiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9DT05ESVRJT05BTF9BTkRfVkFMVUUgPSAxNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9DT05ESVRJT05BTF9BTkQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9DT05ESVRJT05BTF9BTkRfVkFMVUUsICJJbmZpeCAmJiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBDb25kaXRpb25hbCBsb2dpY2FsIG9yICJ8fCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9DT05ESVRJT05BTF9PUl9WQUxVRSA9IDE4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0NPTkRJVElPTkFMX09SID0gbmV3IEluZml4T3BlcmF0b3IoSU5fQ09ORElUSU9OQUxfT1JfVkFMVUUsICJJZm5peCB8fCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZml4IG9wZXJhdG9yIGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTl9USU1FU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fVElNRVM7Ci0JCQljYXNlIElOX0RJVklERV9WQUxVRToKLQkJCQlyZXR1cm4gSU5fRElWSURFOwotCQkJY2FzZSBJTl9SRU1BSU5ERVJfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JFTUFJTkRFUjsKLQkJCWNhc2UgSU5fUExVU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fUExVUzsKLQkJCWNhc2UgSU5fTUlOVVNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX01JTlVTOwotCQkJY2FzZSBJTl9MRUZUX1NISUZUX1ZBTFVFOgotCQkJCXJldHVybiBJTl9MRUZUX1NISUZUOwotCQkJY2FzZSBJTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JJR0hUX1NISUZUX1NJR05FRDsKLQkJCWNhc2UgSU5fUklHSFRfU0hJRlRfVU5TSUdORURfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1JJR0hUX1NISUZUX1VOU0lHTkVEOwotCQkJY2FzZSBJTl9MRVNTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9MRVNTOwotCQkJY2FzZSBJTl9HUkVBVEVSX1ZBTFVFOgotCQkJCXJldHVybiBJTl9HUkVBVEVSOwotCQkJY2FzZSBJTl9MRVNTX0VRVUFMU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fTEVTU19FUVVBTFM7Ci0JCQljYXNlIElOX0dSRUFURVJfRVFVQUxTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9HUkVBVEVSX0VRVUFMUzsKLQkJCWNhc2UgSU5fRVFVQUxTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9FUVVBTFM7Ci0JCQljYXNlIElOX05PVF9FUVVBTFNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX05PVF9FUVVBTFM7Ci0JCQljYXNlIElOX1hPUl9WQUxVRToKLQkJCQlyZXR1cm4gSU5fWE9SOwotCQkJY2FzZSBJTl9BTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0FORDsKLQkJCWNhc2UgSU5fT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX09SOwotCQkJY2FzZSBJTl9DT05ESVRJT05BTF9BTkRfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0NPTkRJVElPTkFMX0FORDsKLQkJCWNhc2UgSU5fQ09ORElUSU9OQUxfT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0NPTkRJVElPTkFMX09SOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW5maXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luaXRwYXJzZXJUcmVlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViZGQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3Igc3JpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSW5pdHBhcnNlclRyZWVNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgSW5pdHBhcnNlclRyZWVNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YjRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyBmb3IgdGhlIENvbmRpdGlvbmFsIG9wZXJhbmQgdHlwZS4gTm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBVc2VkIGluIENvbmRpdGlvbmFsIHByb2Nlc3NpbmcuIEZhbHNlIG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFID0gMDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIENPTkRJVElPTkFMX0ZBTFNFID0gbmV3IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZShDT05ESVRJT05BTF9GQUxTRV9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBGYWxzZSBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVXNlZCBpbiBDb25kaXRpb25hbCBwcm9jZXNzaW5nLiBUcnVlIG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkRJVElPTkFMX1RSVUVfVkFMVUUgPSAxOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUgQ09ORElUSU9OQUxfVFJVRSA9IG5ldyBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUoQ09ORElUSU9OQUxfVFJVRV9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBUcnVlIE9wZXJhbmQgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGluIENvbmRpdGlvbmFsIHByb2Nlc3NpbmcuIFRlc3Qgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfVEVTVF9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBDT05ESVRJT05BTF9URVNUID0gbmV3IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZShDT05ESVRJT05BTF9URVNUX1ZBTFVFLAotCQkJIkNvbmRpdGlvbmFsIFRlc3QgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSBmb3IgdGhlIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09ORElUSU9OQUxfRkFMU0VfVkFMVUU6Ci0JCQkJcmV0dXJuIENPTkRJVElPTkFMX0ZBTFNFOwotCQkJY2FzZSBDT05ESVRJT05BTF9UUlVFX1ZBTFVFOgotCQkJCXJldHVybiBDT05ESVRJT05BTF9UUlVFOwotCQkJY2FzZSBDT05ESVRJT05BTF9URVNUX1ZBTFVFOgotCQkJCXJldHVybiBDT05ESVRJT05BTF9URVNUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxFeHByZXNzaW9uUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkMzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBleHByZXNzaW9uIHByb3hpZXMgaW4gdGhlIGV2YWx1YXRpb24gc2lkZSAoaW4ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRXhwcmVzc2lvblByb2Nlc3Nlcn0pLgotICogPHA+Ci0gKiBJdCBpcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBvbmx5IGJ5IHVzZXJzIG9mIHRoZSBFeHByZXNzaW9uUHJvY2Vzc29yLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBpZCBvZiB0aGUgcHJveHkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJveHlJRCgpOwotCQotCS8qKgotCSAqIENhbGxlZCBieSBFeHByZXNzaW9uUHJvY2Vzc2VyIHRvIGdpdmUgdGhlIGV4cHJlc3Npb24gcHJveHkgaXRzIHZhbHVlIGFuZCB0eXBlLCBpLmUuIGl0IGhhcyBiZWVuIGV2YWx1YXRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgdHlwZSBtYXkgbm90IGJlIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgdmFsdWUsIGl0IG1heSBiZSBhIHN1cGVyY2xhc3Mgb2YgaXQuIEl0IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHByb3h5Ci0JICogcmVwcmVzZW50cyBmcm9tIHRoZSByZXR1cm4gb2YgdGhlIGV4cHJlc3Npb24uIEZvciBpbnN0YW5jZSBpdCBtYXkgb2YgcmV0dXJuZWQgbnVsbCBidXQgaXQgaXMgc3VwcG9zZWQgdG8gYmUKLQkgKiBqYXZhLmxhbmcuU3RyaW5nLiBPciBpdCBpcyBzdXBwb3NlZCB0byBiZSBhIHByaW1pdGl2ZSBpbnQsIHNpbmNlIHdlIGNhbid0IHN0b3JlIHRoYXQsIHdlIG5lZWQgdG8gc3RvcmUKLQkgKiBhbiBJbnRlZ2VyIHZhbHVlIHdpdGggdGhlIHR5cGUgaW5kaWNhdGluZyBpdCBpcyBJbnRlcmdlci5UWVBFLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSB0eXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm94eS4gCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHZhbHVlIG1heSBiZSBhIHtAbGluayBWYXJpYWJsZVJlZmVyZW5jZX0sIGluIHdoaWNoCi0JICogY2FzZSBmdXJ0aGVyIGRlcmVmZXJlbmNpbmcgbWF5IGJlIHdpdGggdGhlIHJldHVybmVkIHZhbHVlLgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm94eSwgaXQgbWF5IGJlIGFuIEV4cHJlc3Npb25Qcm9jZXNzZXIuVmFyaWFibGVSZWZlcmVuY2UuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgdHlwZSBvZiB0aGUgcHJveHkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjc2V0UHJveHkoT2JqZWN0LCBDbGFzcykgZm9yIHdoYXQgdHlwZSBtZWFucy4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb3h5IGhhcyBoYWQgYSB2YWx1ZS9jbGFzcyBzZXQgaW50byBpdCB5ZXQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBoYXMgYmVlbiBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTM1ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsRXhwcmVzc2lvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0aGUgSURFIGFuZCB0aGUgcHJveHkgc2lkZSBmb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogQVJSQVkgQUNDRVNTIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSA9IDE7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFycmF5IEFjY2VzcyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFSUkFZIENSRUFUSU9OIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFycmF5IENyZWF0aW9uIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQVJSQVkgSU5JVElBTElaRVIgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUgPSAzOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBBUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXJyYXkgSW5pdGlhbGl6ZXIgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDQVNUIEV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0FTVF9FWFBSRVNTSU9OX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQ0FTVF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKENBU1RfRVhQUkVTU0lPTl9WQUxVRSwgIkNhc3QgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDT05ESVRJT05BTCBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRSA9IDU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIENPTkRJVElPTkFMX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENMQVNTIElOU1RBTkNFIENSRUFUSU9OIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFID0gNjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcygKLQkJCUNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0VYUFJFU1NJT05fVkFMVUUsICJDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZJRUxEIEFDQ0VTUyBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFID0gNzsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgRklFTERfQUNDRVNTX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoRklFTERfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRmllbGQgQWNjZXNzIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSU5TVEFOQ0VPRiBFeHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOU1RBTkNFT0ZfRVhQUkVTU0lPTl9WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIElOU1RBTkNFT0ZfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhJTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiSW5zdGFuY2VvZiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9FWFBSRVNTSU9OX1ZBTFVFID0gOTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgSU5GSVhfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhJTkZJWF9FWFBSRVNTSU9OX1ZBTFVFLCAiSW5maXggRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNZXRob2QgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0RfRVhQUkVTU0lPTl9WQUxVRSA9IDEwOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBNRVRIT0RfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhNRVRIT0RfRVhQUkVTU0lPTl9WQUxVRSwgIk1ldGhvZCBJbnZva2UgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmaXggZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFID0gMTE7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBSRUZJWF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFLCAiUHJlZml4IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHVzaCB0byBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDEyOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX1RPX1BST1hZX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggdG8gUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIEJlYW5UeXBlIGV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTM7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfQkVBTlRZUEVfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUHVzaCBCZWFuVHlwZSBFeHByZXNzaW9uUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBUeXBlIHJlY2VpdmVyIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiVHlwZSBSZWNlaXZlciBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFzc2lnbm1lbnQgdG8gYW4gRXhwcmVzc2lvblByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFTU0lHTk1FTlRfUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXNzaWdubWVudCB0byBQcm94eSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggZXhwcmVzc2lvbiBwcm94eSB2YWx1ZSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMTY7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKAotCQkJUFVTSF9UT19FWFBSRVNTSU9OX1BST1hZX0VYUFJFU1NJT05fVkFMVUUsICJQdXNoIHRvIEV4cHJlc3Npb24gUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVNTSUdOTUVOVF9FWFBSRVNTSU9OX1ZBTFVFID0gMTc7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFTU0lHTk1FTlRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBU1NJR05NRU5UX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQXNzaWdubWVudCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUgPSAxODsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEJMT0NLX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQkxPQ0tfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJCZWdpbiBibG9jayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0JSRUFLX0VYUFJFU1NJT05fVkFMVUUgPSAxOTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEJMT0NLX0JSRUFLX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQkxPQ0tfQlJFQUtfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJCcmVhayBibG9jayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJsb2NrIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0VORF9FWFBSRVNTSU9OX1ZBTFVFID0gMjA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBCTE9DS19FTkRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhCTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJFbmQgYmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUcnkgQmVnaW4gZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUUllfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSA9IDIxOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgVFJZX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQmVnaW4gdHJ5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVHJ5IENhdGNoIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJZX0NBVENIX0VYUFJFU1NJT05fVkFMVUUgPSAyMjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9DQVRDSF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlRyeSBjYXRjaCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUcnkgRmluYWxseSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRSWV9GSU5BTExZX0VYUFJFU1NJT05fVkFMVUUgPSAyMzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9GSU5BTExZX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFJZX0ZJTkFMTFlfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJUcnkgZmluYWxseSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRyeSBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUUllfRU5EX0VYUFJFU1NJT05fVkFMVUUgPSAyNDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9FTkRfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhUUllfRU5EX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRW5kIHRyeSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaHJvdyBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRIUk9XX0VYUFJFU1NJT05fVkFMVUUgPSAyNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRIUk9XX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVEhST1dfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJUaHJvdyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldGhyb3cgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRVRIUk9XX0VYUFJFU1NJT05fVkFMVUUgPSAyNjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFJFVEhST1dfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhSRVRIUk9XX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUmV0aHJvdyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggTWV0aG9kIExvb2t1cCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFVTSF9NRVRIT0RfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUgPSAyNzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggTWV0aG9kIEV4cHJlc3Npb25Qcm94eSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggRmllbGQgTG9va3VwIGV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMjg7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfRklFTERfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiUHVzaCBGaWVsZCBFeHByZXNzaW9uUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIElmL2Vsc2UgKHRoZSBjbGF1c2VzKSBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFID0gMjk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBJRl9FTFNFX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggSWYvZWxzZSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggSWYvZWxzZSBjb25kaXRpb24gdGVzdCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFID0gMzA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBJRl9URVNUX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggSWYgVGVzdCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUHVzaCBuZXcgaW5zdGFuY2UgZnJvbSBpbml0IHN0cmluZyBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5FV19JTlNUQU5DRV9WQUxVRSA9IDMxOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgTkVXX0lOU1RBTkNFID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKE5FV19JTlNUQU5DRV9WQUxVRSwKLQkJCSJQdXNoIE5ldyBJbnN0YW5jZSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUHVzaCBtYXJrIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUFSS19WQUxVRSA9IDMyOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgTUFSSyA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhNQVJLX1ZBTFVFLAotCQkJIlB1c2ggTWFyayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggZW5kIG1hcmsgcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRNQVJLX1ZBTFVFID0gMzM7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBFTkRNQVJLID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEVORE1BUktfVkFMVUUsCi0JCQkiUHVzaCBFbmQgTWFyayBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN1YmV4cHJlc3Npb24gRW5kIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFID0gMzQ7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBTVUJFWFBSRVNTSU9OX0JFR0lOX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkJlZ2luIFN1YmV4cHJlc3Npb24gRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdWJleHByZXNzaW9uIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT05fVkFMVUUgPSAzNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJFbmQgU3ViZXhwcmVzc2lvbiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIEludGVybmFsRXhwcmVzc2lvblR5cGVzKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5OThjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgZm9yIHRoZSBJZi9lbHNlIG9wZXJhbmQgdHlwZS4gTm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogVXNlZCBpbiBJZi9lbHNlIHByb2Nlc3NpbmcuIEZhbHNlIGNsYXVzZSBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUxTRV9DTEFVU0VfVkFMVUUgPSAwOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIEVMU0VfQ0xBVVNFID0gbmV3IEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoRUxTRV9DTEFVU0VfVkFMVUUsCi0JCQkiRWxzZSBDbGF1c2UgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGluIElmL2Vsc2UgcHJvY2Vzc2luZy4gSWYgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJVRV9DTEFVU0VfVkFMVUUgPSAxOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIFRSVUVfQ0xBVVNFID0gbmV3IEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoVFJVRV9DTEFVU0VfVkFMVUUsCi0JCQkiSWYgVHJ1ZSBDbGF1c2UgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVudW0gZm9yIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBFTFNFX0NMQVVTRV9WQUxVRToKLQkJCQlyZXR1cm4gRUxTRV9DTEFVU0U7Ci0JCQljYXNlIFRSVUVfQ0xBVVNFX1ZBTFVFOgotCQkJCXJldHVybiBUUlVFX0NMQVVTRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MDRiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyBmb3IgdGhlIFByZWZpeCBvcGVyYW5kIHR5cGUuIE5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIFVzZWQgaW4gSW5maXggcHJvY2Vzc2luZy4gTGVmdCBvcGVyYW5kIG9uIGV4cHJlc3Npb24gc3RhY2sKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9MRUZUX09QRVJBTkRfVkFMVUUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIElORklYX0xFRlRfT1BFUkFORCA9IG5ldyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUoSU5GSVhfTEVGVF9PUEVSQU5EX1ZBTFVFLCAiSW5maXggTGVmdCBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFVzZWQgaW4gSW5maXggcHJvY2Vzc2luZy4gT3RoZXIgb3BlcmFuZCAoYnV0IG5vdCBsYXN0KSBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GSVhfT1RIRVJfT1BFUkFORF9WQUxVRSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgSU5GSVhfT1RIRVJfT1BFUkFORCA9IG5ldyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUoSU5GSVhfT1RIRVJfT1BFUkFORF9WQUxVRSwKLQkiSW5maXggT3RoZXIgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBVc2VkIGluIEluZml4IHByb2Nlc3NpbmcuIFJpZ2h0bW9zdCAobGFzdCkgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GSVhfTEFTVF9PUEVSQU5EX1ZBTFVFID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBJTkZJWF9MQVNUX09QRVJBTkQgPSBuZXcgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlKElORklYX0xBU1RfT1BFUkFORF9WQUxVRSwgIkluZml4IExhc3QgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSBmb3IgdGhlIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU5GSVhfTEFTVF9PUEVSQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTkZJWF9MQVNUX09QRVJBTkQ7Ci0JCQljYXNlIElORklYX0xFRlRfT1BFUkFORF9WQUxVRToKLQkJCQlyZXR1cm4gSU5GSVhfTEVGVF9PUEVSQU5EOwotCQkJY2FzZSBJTkZJWF9PVEhFUl9PUEVSQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTkZJWF9PVEhFUl9PUEVSQU5EOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEludGVybmFsSW5maXhPcGVyYW5kVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDA1MzU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0gCi0KLS8qKgotICogVGhlIGV4cHJlc3Npb24gKG9yIHNvbWUgbmVzdGVkIGV4cHJlc3Npb24pIGRpZCBub3QgcmV0dXJuIGEgdmFsdWUuIEkuZS4gaXQgd2FzIDxjb2RlPnZvaWQ8L2NvZGU+LgotICogVGhpcyB3b3VsZCBvY2N1ciBvbmx5IGlmIHRoZSB2YWx1ZSBvZiBleHByZXNzaW9uIHdhcyBiZWluZyByZXRyaWV2ZWQgdGhyb3VnaCBnZXRFeHByZXNzaW9uVmFsdWUsCi0gKiBvciBpZiBhIG5lc3RlZCBleHByZXNzaW9uIHdhcyB1c2VkLCBzaW5jZSBpbiB0aGF0IGNhc2UgdGhlIHZhbHVlIHdvdWxkIG9mIGJlZW4gdXNlZCBhcyBhbgotICogYXJndW1lbnQgb3IgcmVjZWl2ZXIgdG8gYW5vdGhlciBleHByZXNzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03OTUzMTAxODY3NzgyNDE3OTY0TDsKLQkKLQlwcml2YXRlIEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5OwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggbm8gYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIG1lc3NhZ2UgYW5kIGEgcHJveHkuIFRoaXMgaXMgb25seSB1c2VkIGZyb20ge0BsaW5rIEV4cHJlc3Npb25Qcm9jZXNzZXIjZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUoaW50LCBPYmplY3RbXSl9IHdoZW4KLQkgKiB0aGUgcHJveHkgZXhpc3RlZCBidXQgaXQgd2FzIG5vdCBzZXQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCXN1cGVyIChtZXNzYWdlKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHByb3h5IGlmIHRoZXJlIGlzIG9uZS4gSXQgd2lsbCBiZSBhIHByb3h5IGlmIHtAbGluayBFeHByZXNzaW9uUHJvY2Vzc2VyI2dldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCwgT2JqZWN0W10pfQotCSAqIHdhcyBmb3IgYW4gZXhpc3RpbmcgcHJveHkgYnV0IHRoYXQgcHJveHkgd2FzIG5vdCBzZXQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIG51bGwuIFRoaXMgaXMgaGVyZSBmb3IgY2FsbGVycyB0bwotCSAqIHB1dCBzcGVjaWFsIGluZm8gaW4gdGhlIHByb3h5IGZvciB0aGUgbm90IHNldCBjb25kaXRpb24gYW5kIHJlcG9ydCBiZXR0ZXIgaW5mby4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSAoaWYgbm90IHNldCkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBnZXRQcm94eSgpIHsKLQkJcmV0dXJuIHByb3h5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvUHJlZml4T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9QcmVmaXhPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGI5OWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9QcmVmaXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogRW51bSBmb3IgcHJlZml4IG9wZXJhdG9yLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWZpeE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIFByZWZpeCBwbHVzICIrIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9QTFVTX1ZBTFVFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZml4T3BlcmF0b3IgUFJFX1BMVVMgPSBuZXcgUHJlZml4T3BlcmF0b3IoUFJFX1BMVVNfVkFMVUUsICJQcmVmaXggKyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmaXggbWludXMgIi0iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX01JTlVTX1ZBTFVFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZml4T3BlcmF0b3IgUFJFX01JTlVTID0gbmV3IFByZWZpeE9wZXJhdG9yKFBSRV9NSU5VU19WQUxVRSwgIlByZWZpeCAtIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZpeCBiaXR3aXNlIGNvbXBsZW1lbnQgIn4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0NPTVBMRU1FTlRfVkFMVUUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvciBQUkVfQ09NUExFTUVOVCA9IG5ldyBQcmVmaXhPcGVyYXRvcihQUkVfQ09NUExFTUVOVF9WQUxVRSwgIlByZWZpeCB+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZpeCBsb2dpY2FsIG5vdCAiISIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfTk9UX1ZBTFVFID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZml4T3BlcmF0b3IgUFJFX05PVCA9IG5ldyBQcmVmaXhPcGVyYXRvcihQUkVfTk9UX1ZBTFVFLCAiUHJlZml4ICEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmaXggb3BlcmF0b3IgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBQUkVfUExVU19WQUxVRToKLQkJCQlyZXR1cm4gUFJFX1BMVVM7Ci0JCQljYXNlIFBSRV9NSU5VU19WQUxVRToKLQkJCQlyZXR1cm4gUFJFX01JTlVTOwotCQkJY2FzZSBQUkVfQ09NUExFTUVOVF9WQUxVRToKLQkJCQlyZXR1cm4gUFJFX0NPTVBMRU1FTlQ7Ci0JCQljYXNlIFBSRV9OT1RfVkFMVUU6Ci0JCQkJcmV0dXJuIFBSRV9OT1Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmaXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvVmFyaWFibGVSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9WYXJpYWJsZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg4YjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9WYXJpYWJsZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgYSBWYXJpYWJsZSBSZWZlcmVuY2UgdmFsdWUuIEEgdmFyaWFibGUgcmVmZXJlbmNlIHZhbHVlIGNhbiBiZSBvbiB0aGUgbGVmdAotICogc2lkZSBvZiBhbiBhc3NpZ25tZW50IChlLmcuIGZpZWxkIG9yIGFycmF5IGFjY2Vzcykgb3Igb24gYW55IHNpZGUKLSAqIG9mIGFueSBleHByZXNzaW9uLiBXaGVuIG9uIHRoZSBsZWZ0IHNpZGUgb2YgYW4gYXNzaWdubWVudCwgdGhlbiB0aGUKLSAqIHZhbHVlIGNhbiBhc3NpZ25lZCB0by4gU3VjaCBhcyA8Y29kZT54WzNdID0gNDwvY29kZT4uIE9yIGl0IGlzIHZhbHVlCi0gKiB0aGF0IGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zLCBzdWNoIGFzIDxjb2RlPnhbM10gKyAyPC9jb2RlPi4KLSAqIDxwPgotICogV2hlbiBkZXJlZmVyZW5jZWQsIHRoZSB2YWx1ZSBpcyBnaXZlbiAoc2VlIHtAbGluayBWYXJpYWJsZVJlZmVyZW5jZSNkZXJlZmVyZW5jZSgpfSkgYXMKLSAqIHRoZSByZXN1bHQgb3IgaXQgaXMgc2V0IHdpdGggYSB2YWx1ZSBhbmQgdGhlbiBkZWZlcmVuY2VkIChzZWUge0BsaW5rIFZhcmlhYmxlUmVmZXJlbmNlI3NldChPYmplY3QsIENsYXNzKX0pLgotICogPHA+Ci0gKiBUaGUgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uVHlwZVN0YWNrIGVudHJ5LiBUaGlzIGlzIHRoZSB0eXBlCi0gKiBmb3IgYXNzaWdubWVudCwgYW5kIHRoZSB0eXBlIGZvciBkZXJlZmVyZW5jZWQuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlUmVmZXJlbmNlIHsKLQotCS8qKgotCSAqIERlcmVmZXJlbmNlIHRoZSB2YWx1ZS4gCi0JICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlLiBTdWNoIGFzIHRoZSByZXN1bHQgb2YgPGNvZGU+eFszXTwvY29kZT4uIFRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UgCi0JICogaXMgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25UeXBlU3RhY2sgZW50cnkgZm9yIHRoaXMgcmVmZXJlbmNlLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBkZXJlZmVyZW5jZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgaW50byB0aGUgdmFyaWFibGUgYW5kIGRlcmVmZXJlbmNlIGl0LiBPbmNlIGl0IGlzIHNldCBpdCBpcwotCSAqIG5vIGxvbmdlciBhIHJlZmVyZW5jZSBhbmQgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCi0JICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHNldCB0by4KLQkgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBzZXQuIEl0IG1heSBiZSBvZiB1c2UgdG8gdGhlIHJlZmVyZW5jZSBvciBtYXliZSBub3QuCi0JICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlIGFmdGVyIGJlaW5nIHNldC4gVGhlIHR5cGUgb2YgdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSAKLQkgKiBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblR5cGVTdGFjayBlbnRyeSBmb3IgdGhpcyByZWZlcmVuY2UuCi0JICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHNldChPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY4NDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUV4cHJlc3Npb25Qcm9jZXNzZXIuQ2Fubm90Q2FzdFhUb1lfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNTZFIENhbm5vdCBjYXN0ICJ7MH0iIHRvIGJlICJ7MX0iLgotRXhwcmVzc2lvblByb2Nlc3Nlci5JbnZhbGlkT3BlcmFuZE9mUHJlZml4T3BlcmF0b3JfRVhDXyAgICAgICAgICAgPSBJV0FWMDE1N0UgezB9IG5vdCB2YWxpZCBhcyB0aGUgb3BlcmFuZCBvZiBwcmVmaXggb3BlcmF0b3IgInsxfSIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlBvcEV4cHJlc3Npb25UeXBlLkV4cHJlc3Npb25Wb2lkX0VYQ189RXhwcmVzc2lvbiB3YXMgdm9pZC4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuSW52YWxpZE9wZXJhbmRPZk9wZXJhdG9yX0VYQ18gICAgICAgICAgICAgICAgID0gSVdBVjAxNThFIHswfSBub3QgdmFsaWQgYXMgdGhlIG9wZXJhbmQgb2Ygb3BlcmF0b3IgInsxfSIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlhJc0dyZWF0ZXJUaGFuTnVtYmVyT2ZEaW1lbnNpb25zSW5BcnJheV9FWENfICA9IElXQVYwMTU5RSB7MH0gaXMgZ3JlYXRlciB0aGVuIG51bWJlciBvZiBkaW1lbnNpb25zICh7MX0pIGluIHRoZSBhcnJheQotRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVBcnJheUFjY2Vzc1JlZmVyZW5jZS5PdXRPZkJvdW5kc19FWENfPUluZGV4OiB7MH0gc2l6ZTp7MX0KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUVuZC5UcnlFbmRSZWNlaXZlZE91dE9mT3JkZXJfRVhDXz1UcnkvZW5kIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaEVuZG1hcmsuRW5kTWFya09uTm9uRXhpc3RpbmdJRF9FWENfPVRyaWVkIHRvIGRvIGFuIGVuZCBtYXJrIG9uIGEgbm9uLWV4aXN0aW5nIG1hcmtJRCAoezB9KQotRXhwcmVzc2lvblByb2Nlc3Nlci5Ob3RBbkFycmF5X0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2MEUgInswfSIgaXMgbm90IGFuIGFycmF5LgotRXhwcmVzc2lvblByb2Nlc3Nlci5BcnJheXR5cGVIYXNGZXdlckRpbWVuc2lvbnNUaGFuUmVxdWVzdGVkX0VYQ18gPSBJV0FWMDE2MUUgQXJyYXl0eXBlICJ7MH0iIGhhcyBmZXdlciBkaW1lbnNpb25zIHRoYW4gY3JlYXRpb24gcmVxdWVzdGVkICh7MX0pLgotRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVGaWVsZEFjY2Vzc1JlZmVyZW5jZS5GaWVsZHNUeXBlc05vdE1hdGNoaW5nX0VYQ189RmllbGQgcmVjZWl2ZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGZpZWxkOiBGaWVsZDogezB9IHJlY2VpdmVyOiB7MX0KLUV4cHJlc3Npb25Qcm9jZXNzZXIuR2V0RXhwcmVzc2lvblByb3h5VmFsdWUuRXhwcmVzc2lvblByb3h5Tm90U2V0X0VYQ189RXhwcmVzc2lvbiBQcm94eSBuZXZlciBzZXQuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLkdldEV4cHJlc3Npb25Qcm94eVZhbHVlLkV4cHJlc3Npb25Qcm94eURvZXNudEV4aXN0X0VYQ189RXhwcmVzc2lvbiBwcm94eSBkb2Vzbid0IGV4aXN0LgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoQmxvY2tFbmQuUmVjZWl2ZWRFbmRCbG9ja3NPdXRPZk9yZGVyX0VYQ189RW5kIEJsb2NrcyByZWNlaXZlZCBvdXQgb2Ygb3JkZXIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlDYXRjaENsYXVzZS5DYXRjaFJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfPUNhdGNoIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUZpbmFsbHlDbGF1c2UuRmluYWxseVJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfPUZpbmFsbHkgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5UmV0aHJvdy5SZXRocm93UmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ189UmV0aHJvdyByZWNlaXZlZCBvdXQgb2Ygb3JkZXIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlSZXRocm93LlJldHJ5UmVjZWl2ZWRPdXRPZkV4ZWN1dGluZ0NhdGNoQ2xhdXNlX0VYQ189UmV0cnkgcmVjZWl2ZWQgb3V0c2lkZSBvZiBhbiBleGVjdXRpbmcgY2F0Y2ggY2xhdXNlCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hTdWJleHByZXNzaW9uRW5kLlJlY2VpdmVkRW5kU3ViZXhwcmVzc2lvbnNPdXRPZk9yZGVyX0VYQ189RW5kIFN1YmV4cHJlc3Npb25zIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwN2RmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFByb3h5IFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1jb250cmlidXRvcnMuZXh0ZW5zaW9ucG9pbnQubmFtZT1Qcm94eSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9ycwotZXh0ZW5zaW9ucy5leHRlbnNpb25wb2ludC5uYW1lPVByb3h5IGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMKLUxhdW5jaC5sb2NhbFByb3h5PUxvY2FsIFByb3h5IEFwcGxpY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3NGI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udHJpYnV0b3JzIiBuYW1lPSIlY29udHJpYnV0b3JzLmV4dGVuc2lvbnBvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpb25zIiBuYW1lPSIlZXh0ZW5zaW9ucy5leHRlbnNpb25wb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS9leHRlbnNpb25zLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQotICAgICAgICAgICAgbmFtZT0iJUxhdW5jaC5sb2NhbFByb3h5IgotICAgICAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIKLSAgICAgICAgICAgIG1vZGVzPSJydW4iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnByb3h5LkxvY2FsUHJveHlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvb2t1cC5qYXZhU291cmNlUGF0aENvbXB1dGVyIj4KLSAgICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS5qYXJzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkuamFycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZWRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wcm94eWNvbW1vbi5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS9jb21tb25fYmluLwotaW5pdHBhcnNlci5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS9jb21tb25fYmluLwotcmVtb3RlY29tbW9uLmphcj0vb3JnLmVjbGlwc2UuamVtLnByb3h5L2NvbW1vbl9iaW4vCi12bS9yZW1vdGV2bS5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9iaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2F3dC9JU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0lTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlODk0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0lTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3Rvcnk7Ci0vKioKLSAqIFRoZSBTdGFuZGFyZCBhd3QgYmVhbiBwcm94eSBmYWN0b3J5LgotICogVGhpcyBpcyB0aGUgSW50ZXJmYWNlIHRoYXQgdGhlIGRlc2t0b3Agd2lsbCB0YWxrCi0gKiB0by4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjA5IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5Qcm94eUZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0lTVFJZX0tFWSA9ICJzdGFuZGFyZC1qYXZhLmF3dCI7IC8vJE5PTi1OTFMtMSQKLQotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIGRpbWVuc2lvbiBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJRGltZW5zaW9uQmVhblByb3h5IGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eVdpdGgoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwb2ludCBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcmVjdGFuZ2xlIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElSZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0phdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NlY2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogU3RhbmRhcmQgQVdUIENvbnN0YW50cwotICoKLSAqIFVzZSB0aGUgc3RhdGljIGFjY2Vzc29yIG1ldGhvZCAoZ2V0Q29uc3RhbnRzKCkpIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgCi0gKiBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSByZWdpc3RyeS4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdW50aWwgdGhlCi0gKiB0aGUgY29uc3RhbnRzIGFyZSBuZWVkZWQsIHRoZXkgYXJlbid0IHJlZ2lzdGVyZWQuCi0gKgotICogTk9URTogU2luY2UgZXZlcnl0aGluZyBpbiBoZXJlIGp1c3QgcHJveGllcywgdGhlcmUgaXMKLSAqICAgICAgIG5vIG5lZWQgdG8gaGF2ZSB0aGVtIHNlcGFyYXRlZCBieSBWTS4gVGhhdCBpcyB3aHkKLSAqICAgICAgIHRoaXMgaW4gdGhlIFByb3h5IHBhY2thZ2UuCi0gKgotICogVGhpcyBpcyBmaW5hbCBiZWNhdXNlIHRoaXMgY2FuJ3QgYmUgZXh0ZW5kZWQuIFRoaXMgc3BlY2lmaWMgb25lCi0gKiB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhpcyBrZXkuIEFueSBleHRlbnNpb25zCi0gKiBtdXN0IGJlIGRvbmUgaW4gdGhlaXIgb3duIGNvbnN0YW50cyBhbmQgcmVnaXN0cnkga2V5LgotICoKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgNDo0Nzo0OCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMgewotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0JCQkKLQlmaW5hbCBib29sZWFuIEFXVExvYWRlZDsJLy8gQVdUIG1heSBub3QgYmUgYXZhaWxhYmxlLiBTbyBub24tdWkgSlZNJ3MgZG9uJ3QgaGF2ZSBBV1QuCi0JZmluYWwgYm9vbGVhbiBBV1RSZWdpc3RlcmVkOwkvLyBBV1Qgd2FzIHJlZ2lzdGVyZWQgdG8gYmUgdXNlZCBpbiB0aGlzIFZNLiBJdCBtYXkgYmUgcmVnaXN0ZXJlZCwgYnV0IHN0aWxsIG5vdCBhdmFpbGFibGUuCi0JCQotCWZpbmFsIElGaWVsZFByb3h5IGRpbWVuc2lvbkhlaWdodFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IGRpbWVuc2lvbldpZHRoUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldERpbWVuc2lvblNpemVIV1Byb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXREaW1lbnNpb25TaXplRFByb3h5OwotCQotCWZpbmFsIElGaWVsZFByb3h5IHBvaW50WFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHBvaW50WVByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRQb2ludExvY2F0aW9uWFlQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0UG9pbnRMb2NhdGlvblBQcm94eTsKLQkKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVIZWlnaHRQcm94eTsKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVXaWR0aFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHJlY3RhbmdsZVhQcm94eTsKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVZUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZVNpemVIV1Byb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVTaXplRFByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVCb3VuZHNYWUhXUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eTsKLQkKLS8qKgotICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyBnZXRDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzIGNvbnN0YW50cyA9IChKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzKSByZWdpc3RyeS5nZXRDb25zdGFudHMoUkVHSVNUUllfS0VZKTsKLQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMocmVnaXN0cnksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnlFeHRlbnNpb24oSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVkpICE9IG51bGwpKTsKLQlyZXR1cm4gY29uc3RhbnRzOwotfQotCQkKLQotcHVibGljIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIGJvb2xlYW4gaXNSZWdpc3RlcmVkKSB7Ci0Jc3VwZXIoKTsKLQkKLQlBV1RSZWdpc3RlcmVkID0gaXNSZWdpc3RlcmVkOwotCWlmICghQVdUUmVnaXN0ZXJlZCkgewotCQlBV1RMb2FkZWQgPSBmYWxzZTsKLQkJZGltZW5zaW9uSGVpZ2h0UHJveHkgPSBkaW1lbnNpb25XaWR0aFByb3h5ID0gcG9pbnRYUHJveHkgPSBwb2ludFlQcm94eSA9IHJlY3RhbmdsZUhlaWdodFByb3h5ID0gcmVjdGFuZ2xlV2lkdGhQcm94eSA9IHJlY3RhbmdsZVhQcm94eSA9IHJlY3RhbmdsZVlQcm94eSA9IG51bGw7Ci0JCXNldERpbWVuc2lvblNpemVIV1Byb3h5ID0gc2V0RGltZW5zaW9uU2l6ZURQcm94eSA9IHNldFBvaW50TG9jYXRpb25YWVByb3h5ID0gc2V0UG9pbnRMb2NhdGlvblBQcm94eSA9IHNldFJlY3RhbmdsZVNpemVIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlU2l6ZURQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzWFlIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5ID0gbnVsbDsJCQotCQlyZXR1cm47Ci0JfQotCQotCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkKLQlJQmVhblR5cGVQcm94eSBkaW1lbnNpb25UeXBlUHJveHkgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5EaW1lbnNpb24iKTsvLyROT04tTkxTLTEkCi0JaWYgKGRpbWVuc2lvblR5cGVQcm94eSAhPSBudWxsKSB7Ci0JCS8vIEFXVCBpcyBhdmFpbGFibGUuCi0JCUFXVExvYWRlZCA9IHRydWU7Ci0JCUlCZWFuVHlwZVByb3h5IGludFR5cGVQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlkaW1lbnNpb25IZWlnaHRQcm94eSA9IGRpbWVuc2lvblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJoZWlnaHQiKTsvLyROT04tTkxTLTEkCi0JCWRpbWVuc2lvbldpZHRoUHJveHkgPSBkaW1lbnNpb25UeXBlUHJveHkuZ2V0RmllbGRQcm94eSgid2lkdGgiKTsvLyROT04tTkxTLTEkCi0JCXNldERpbWVuc2lvblNpemVIV1Byb3h5ID0gZGltZW5zaW9uVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRTaXplIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGltZW5zaW9uU2l6ZURQcm94eSA9IGRpbWVuc2lvblR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0U2l6ZSIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtkaW1lbnNpb25UeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGVQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ly8kTk9OLU5MUy0xJAotCQlwb2ludFhQcm94eSA9IHBvaW50VHlwZVByb3h5LmdldEZpZWxkUHJveHkoIngiKTsvLyROT04tTkxTLTEkCi0JCXBvaW50WVByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgieSIpOwkvLyROT04tTkxTLTEkCi0JCXNldFBvaW50TG9jYXRpb25YWVByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldExvY2F0aW9uIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UG9pbnRMb2NhdGlvblBQcm94eSA9IHBvaW50VHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwb2ludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCQotCQkKLQkJSUJlYW5UeXBlUHJveHkgcmVjdGFuZ2xlVHlwZVByb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUmVjdGFuZ2xlIik7Ly8kTk9OLU5MUy0xJAotCQlyZWN0YW5nbGVIZWlnaHRQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJoZWlnaHQiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZVdpZHRoUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgid2lkdGgiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZVhQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ4Iik7Ly8kTk9OLU5MUy0xJAotCQlyZWN0YW5nbGVZUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgieSIpOy8vJE5PTi1OTFMtMSQKLQkJc2V0UmVjdGFuZ2xlU2l6ZUhXUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldFNpemUiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRSZWN0YW5nbGVTaXplRFByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRTaXplIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2RpbWVuc2lvblR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cG9pbnRUeXBlUHJveHl9KTsJCSAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0Qm91bmRzIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHksIGludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUJvdW5kc1JQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0Qm91bmRzIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3JlY3RhbmdsZVR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIHsKLQkJQVdUTG9hZGVkID0gZmFsc2U7Ci0JCWRpbWVuc2lvbkhlaWdodFByb3h5ID0gZGltZW5zaW9uV2lkdGhQcm94eSA9IHBvaW50WFByb3h5ID0gcG9pbnRZUHJveHkgPSByZWN0YW5nbGVIZWlnaHRQcm94eSA9IHJlY3RhbmdsZVdpZHRoUHJveHkgPSByZWN0YW5nbGVYUHJveHkgPSByZWN0YW5nbGVZUHJveHkgPSBudWxsOwotCQlzZXREaW1lbnNpb25TaXplSFdQcm94eSA9IHNldERpbWVuc2lvblNpemVEUHJveHkgPSBzZXRQb2ludExvY2F0aW9uWFlQcm94eSA9IHNldFBvaW50TG9jYXRpb25QUHJveHkgPSBzZXRSZWN0YW5nbGVTaXplSFdQcm94eSA9IHNldFJlY3RhbmdsZVNpemVEUHJveHkgPSBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHkgPSBzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eSA9IHNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eSA9IHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eSA9IG51bGw7Ci0JfQotfQotCi0vKioKLSAqIEFuc3dlciBpZiBBV1QgaXMgYXZhaWxhYmxlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FXVEF2YWlsYWJsZSgpIHsKLQlyZXR1cm4gQVdUTG9hZGVkOwotfQotCi0vKioKLSAqIEFuc3dlciBpZiBBV1Qgd2FzIHJlZ2lzdGVyZWQgdG8gYmUgYXZhaWxhYmxlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FXVFJlZ2lzdGVyZWQoKSB7Ci0JcmV0dXJuIEFXVFJlZ2lzdGVyZWQ7Ci19Ci0KLQotCi0vKioKLSAqIGdldERpbWVuc2lvbkhlaWdodEZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXREaW1lbnNpb25IZWlnaHRGaWVsZFByb3h5KCkgewotCXJldHVybiBkaW1lbnNpb25IZWlnaHRQcm94eTsKLX0KLS8qKgotICogZ2V0RGltZW5zaW9uV2lkdGhQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldERpbWVuc2lvbldpZHRoRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gZGltZW5zaW9uV2lkdGhQcm94eTsKLX0KLS8qKgotICogZ2V0RGltZW5zaW9uU2V0U2l6ZVdIUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGltZW5zaW9uU2V0U2l6ZUhXUHJveHkoKSB7Ci0JcmV0dXJuIHNldERpbWVuc2lvblNpemVIV1Byb3h5OwotfQotLyoqCi0gKiBnZXREaW1lbnNpb25TZXRTaXplRFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldERpbWVuc2lvblNldFNpemVEUHJveHkoKSB7Ci0JcmV0dXJuIHNldERpbWVuc2lvblNpemVEUHJveHk7Ci19Ci0KLS8qKgotICogZ2V0UG9pbnRYRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFBvaW50WEZpZWxkUHJveHkoKSB7Ci0JcmV0dXJuIHBvaW50WFByb3h5OwotfQotLyoqCi0gKiBnZXRQb2ludFlGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UG9pbnRZRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcG9pbnRZUHJveHk7Ci19Ci0vKioKLSAqIGdldFBvaW50U2V0TG9jYXRpb25YWVByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFBvaW50U2V0TG9jYXRpb25YWVByb3h5KCkgewotCXJldHVybiBzZXRQb2ludExvY2F0aW9uWFlQcm94eTsKLX0KLS8qKgotICogZ2V0UG9pbnRTZXRMb2NhdGlvblBQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRQb2ludFNldExvY2F0aW9uUFByb3h5KCkgewotCXJldHVybiBzZXRQb2ludExvY2F0aW9uUFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVIZWlnaHRGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UmVjdGFuZ2xlSGVpZ2h0RmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlSGVpZ2h0UHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlV2lkdGhQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlWEZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXRSZWN0YW5nbGVYRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlWFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVZRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFJlY3RhbmdsZVlGaWVsZFByb3h5KCkgewotCXJldHVybiByZWN0YW5nbGVZUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldFNpemVXSFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldFNpemVIV1Byb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVTaXplSFdQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlU2V0U2l6ZURQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRTaXplRFByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVTaXplRFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVTZXRMb2NhdGlvblhZUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25YWVByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldExvY2F0aW9uUFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldExvY2F0aW9uUFByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eTsKLX0KLQotLyoqCi0gKiBnZXRSZWN0YW5nbGVTZXRCb3VuZHNYWUhXUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0Qm91bmRzWFlIV1Byb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVCb3VuZHNYWUhXUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldEJvdW5kc1JQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRCb3VuZHNSUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9CYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0Jhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk3MjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0Jhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotLyoqCi0gKiBUaGlzIGlzIHRoZSBCYXNlIFJlZ2lzdHJ5IHRoYXQgYWxsIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3ViY2xhc3MuIAotICogPHA+Ci0gKiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuIEl0IHByb3ZpZGVzIHB1YmxpYyBmdW5jdGlvbnMgb25seSBmb3IgYWNjZXNzIG9mIGluZGl2aWR1YWwgaW1wbGVtZW50YXRpb25zLgotICogQ3VzdG9tZXJzIHNob3VsZCBvbmx5IGFjY2VzcyB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnl9LgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZ2lzdHJ5VHlwZUlEOwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggcmVnaXN0cnkgdHlwZSBJRC4gVGhlIHR5cGUgaWQgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5Ci0JICogZWFjaCBpbXBsZW1lbnRhdGlvbi4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyB0eXBlCi0JICogcmVnaXN0cmF0aW9ucyB0aHJvdWdoIGNvbnRyaWJ1dGlvbnMuCi0JICogIAotCSAqIEBwYXJhbSByZWdpc3RyeVR5cGVJRAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkoU3RyaW5nIHJlZ2lzdHJ5VHlwZUlEKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVnaXN0cnlUeXBlSUQgPSByZWdpc3RyeVR5cGVJRDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXFpc3RyeSB0eXBlIGlkLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJ5VHlwZUlEKCkgewotCQlyZXR1cm4gcmVnaXN0cnlUeXBlSUQ7Ci0JfQotCi0JLyoqCi0JIFJlZ2lzdGVyIHRoZSBjdXJyZW50IHJlZ2lzdGVyZWQgYmVhbiBwcm94eSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuUHJveHlGYWN0b3J5KElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgYVN0YW5kYXJkRmFjdG9yeSkgewotCQlmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSA9IGFTdGFuZGFyZEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JIFJlZ2lzdGVyIGEgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeShTdHJpbmcgcGFja2FnZU5hbWUsIElCZWFuUHJveHlGYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCWZSZWdpc3RlcmVkRXh0ZW5zaW9uQmVhblByb3h5RmFjdG9yaWVzLnB1dChwYWNrYWdlTmFtZSwgYUZhY3RvcnkpOwotCX0KLQotCS8qKgotCSBSZWdpc3RlciB0aGUgY3VycmVudCByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuVHlwZVByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYVN0YW5kYXJkRmFjdG9yeSkgewotCQlmQ3VycmVudFN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgPSBhU3RhbmRhcmRGYWN0b3J5OwotCX0KLQotCS8qKgotCSBSZWdpc3RlciBhIGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5UeXBlUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeShTdHJpbmcgcGFja2FnZU5hbWUsIElCZWFuVHlwZVByb3h5RmFjdG9yeSBhRmFjdG9yeSkgewotCQlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMucHV0KHBhY2thZ2VOYW1lLCBhRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBNZXRob2QgUHJveHkgRmFjdG9yeSBmb3IgdGhpcyBWTS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMy8xMy8wMCAxMDo1ODoxOSBBTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3Rlck1ldGhvZFByb3h5RmFjdG9yeShJTWV0aG9kUHJveHlGYWN0b3J5IG5ld01ldGhvZFByb3h5RmFjdG9yeSkgewotCQlmTWV0aG9kUHJveHlGYWN0b3J5ID0gbmV3TWV0aG9kUHJveHlGYWN0b3J5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzQxNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkNvbGxlY3Rpb24gcHJveHkuCi0gKiBJdCBwcm92aWRlcyB0aGUgY29sbGVjdGlvbiBtZXRob2RzIHRvIGludGVyZmFjZSB0bwotICogdGhlIHByb3h5LgotICovCi0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIElCZWFuUHJveHkgZkNvbGxlY3Rpb247Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBmQ29uc3RhbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFDb2xsZWN0aW9uUHJveHkpIHsKLQkJaWYgKCFhQ29sbGVjdGlvblByb3h5LmdldFR5cGVQcm94eSgpLmlzS2luZE9mKGFDb2xsZWN0aW9uUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5Db2xsZWN0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkNsYXNzQ2FzdF9FWENfX0luY29ycmVjdFR5cGUsIG5ldyBPYmplY3RbXSB7YUNvbGxlY3Rpb25Qcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCAiamF2YS51dGlsLkNvbGxlY3Rpb24ifSkpOyAgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlmQ29sbGVjdGlvbiA9IGFDb2xsZWN0aW9uUHJveHk7Ci0JCQkKLQkJZkNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoYUNvbGxlY3Rpb25Qcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBjb2xsZWN0aW9uIHByb3h5IHRoYXQgdGhpcyBpcyB3cmFwcGVyaW5nLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIGZDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIGVxdWFscyAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmQ29sbGVjdGlvbi5lcXVhbHMob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogaGFzaENvZGUgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkNvbGxlY3Rpb24uaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29sbGVjdGlvbiBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25BZGQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoSUJlYW5Qcm94eSBjb2xsZWN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uQWRkQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uQ2xlYXIoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQmVhblByb3h5IG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkNvbnRhaW5zKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkNvbnRhaW5zQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0JCQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uSXNFbXB0eSgpLmludm9rZShmQ29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCQotCX0JCQotCXB1YmxpYyBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgaXRlcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlJQmVhblByb3h5IGl0ciA9IGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yKCkuaW52b2tlKGZDb2xsZWN0aW9uKTsKLQkJCWlmIChpdHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihpdHIpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25SZW1vdmUoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoSUJlYW5Qcm94eSBjb2xsZWN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uUmVtb3ZlQWxsKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQkJCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvblJldGFpbkFsbCgpLmludm9rZShmQ29sbGVjdGlvbiwgY29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJSW50ZWdlckJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uU2l6ZSgpLmludm9rZShmQ29sbGVjdGlvbikpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiAwOwotCQl9CQkJCi0JfQkKLQlwdWJsaWMgSUFycmF5QmVhblByb3h5IHRvQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKElBcnJheUJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uVG9BcnJheSgpLmludm9rZShmQ29sbGVjdGlvbik7Ci0JfQotCXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgdG9BcnJheShJQXJyYXlCZWFuUHJveHkgYXJyYXkpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoSUFycmF5QmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5KCkuaW52b2tlKGZDb2xsZWN0aW9uLCBhcnJheSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYzcyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLSAKLS8qKgotICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIHRoYXQgZG9lcyBub3RoaW5nLiBJdAotICogY2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBvdmVycmlkZXMuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIHsKLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVDbGFzc3BhdGhzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRocyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlVG9SZWdpc3RyeShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9SZWdpc3RyeShQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRjYTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0NvbnRhaW5lclBhdGhDb250cmlidXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLQotLyoqCi0gKiBNYXBwaW5nIG9mIGNvbnRhaW5lciBwYXRocyAoUmVndWxhciBleHByZXNzaW9ucykgdG8gY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLSAqIDxwPgotICogSXQgY2FuIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byBidWlsdCB1cCBhIHN1YnNldCBvZiB0aGUgbWFwcGluZyBmcm9tIHRoZSAKLSAqIG5vcm1hbCBtYXBwaW5nIGRvbmUgYnkge0BsaW5rIFByb3h5UGx1Z2luI2dldFBsdWdpbkV4dGVuc2lvbnMoU3RyaW5nKX0uCi0gKiA8cD4KLSAqIFRvIGJ1aWxkIG9uZSB1cCBzZXBhcmF0ZWx5IGNsaWVudHMgd291bGQ6Ci0gKiA8cHJlPjxjb2RlPgotICogQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcgbWFwcGluZyA9IG5ldyBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyhjb250cmlidXRpb25UeXBlKTsKLSAqIG1hcHBpbmcuYWRkQ29udHJpYnV0aW9uKGNvbnRhaW5lcmlkLCBwYXR0ZXJuLCBjb250cmlidXRpb24pOwotICogCS4uLgotICogbWFwcGluZy5maW5hbGl6ZU1hcHBpbmcoKTsKLSAqIDwvY29kZT48L3ByZT4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJQYXRoQ29udHJpYnV0aW9uTWFwcGluZyB7Ci0JCi0JLyoqCi0JICogVXNlZCBpbiB7QGxpbmsgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcjY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnN9IGFzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwLiAKLQkgKiBUaGlzIGNvbnRhaW5zIGEgUGF0dGVybiBmb3IgYSBjb250YWluZXIgcGF0aCB0byBtYXRjaCBhZ2FpbnN0IHRvIHNlZSBpZiB0aGUgY29udHJpYnV0aW9uCi0JICogc2hvdWxkIGJlIHVzZWQuCi0JICogPHA+Ci0JICogTm9ybWFsbHkgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSB7QGxpbmsgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcjZ2V0Q29udHJpYnV0b3JzKFN0cmluZywgU3RyaW5nW10pfQotCSAqIHRvIGdldCBhbGwgb2YgdGhlIGNvbnRyaWJ1dG9ycyBmb3IgYWxsIG9mIHRoZSBwYXRocyBvZiB0aGUgc2FtZSBjb250YWluZXIgaWQuIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnkgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgY29udHJpYnV0aW9uOwotCQlwcml2YXRlIGZpbmFsIFBhdHRlcm4gY29udGFpbmVyUGF0aFBhdHRlcm47Ci0JCi0JCXB1YmxpYyBDb250YWluZXJDb250cmlidXRpb25FbnRyeShPYmplY3QgY29udHJpYnV0aW9uLCBQYXR0ZXJuIGNvbnRhaW5lclBhdGhQYXR0ZXJuKSB7Ci0JCQl0aGlzLmNvbnRyaWJ1dGlvbiA9IGNvbnRyaWJ1dGlvbjsKLQkJCXRoaXMuY29udGFpbmVyUGF0aFBhdHRlcm4gPSBjb250YWluZXJQYXRoUGF0dGVybjsKLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRyaWJ1dGlvbi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb250cmlidXRpb24oKSB7Ci0JCQlyZXR1cm4gY29udHJpYnV0aW9uOwotCQl9Ci0JCQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGFpbmVyIHBhdHRlcm4gZm9yIG1hdGNoaW5nLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgUGF0dGVybiBnZXRDb250YWluZXJQYXRoUGF0dGVybigpIHsKLQkJCXJldHVybiBjb250YWluZXJQYXRoUGF0dGVybjsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE1hcCBvZiBjb250YWluZXIgaWRzIChTdHJpbmcsIGZpcnN0IHNlZ21lbnQgb2YgY29udGFpbmVyIHBhdGgpIHRvIHtAbGluayBDb250YWluZXJDb250cmlidXRpb25FbnRyeVtdfS4KLQkgKiA8cD4KLQkgKiBOb3JtYWxseSBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIHtAbGluayAjZ2V0Q29udHJpYnV0b3JzKFN0cmluZywgU3RyaW5nW10pfQotCSAqIHRvIGdldCBhbGwgb2YgdGhlIGNvbnRyaWJ1dG9ycyBmb3IgYWxsIG9mIHRoZSBwYXRocyBvZiB0aGUgc2FtZSBjb250YWluZXIgaWQuIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBNYXAgY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCi0JLy8gVE9ETyBXaGVuIDEuNSwgdGhpcyBjYW4gZ28gYXdheS4KLQlwcml2YXRlIGZpbmFsIENsYXNzIGNvbnRyaWJ1dGlvblR5cGU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggY29udHJpYnV0aW9uIHR5cGUgKGkuZS4gdGhlIGFycmF5IHR5cGUgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2dldENvbnRyaWJ1dG9ycyhTdHJpbmcsIFN0cmluZ1tdKX0uCi0JICogPHA+Ci0JICogVE9ETyBUaGlzIHdpbGwgZ28gYXdheSB3aXRoIDEuNSBiZWNhdXNlIHRoaXMgd2lsbCBiZSB0ZW1wbGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcoQ2xhc3MgdHlwZSkgewotCQljb250cmlidXRpb25UeXBlID0gdHlwZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IHRoZSB1bmlxdWUgYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyAobm8gZHVwbGljYXRlcykgZm9yIHRoZSBnaXZlbiBjb250YWluZXIgaWQsIGFuZAotCSAqIHRoZSBzZXQgb2YgY29udGFpbmVyIHBhdGhzIGZvciB0aGF0IGNvbnRhaW5lciBpZC4gRm9yIGV4YW1wbGUsICJTV1RfQ09OVEFJTkVSIiBhcyBjb250YWluZXJJRCBhbmQKLQkgKiB7Ii9TV1RfQ09OVEFJTkVSLyIsICIvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UifSBmb3IgY29udGFpbmVyIHBhdGhzLiBUaGlzIHdpbGwgdGhlbiByZXR1cm4gY29uZmlndXJhdGlvbiBlbGVtZW50cwotCSAqIHRoYXQgbWF0Y2ggdGhlc2UgdHdvIHBhdGhzIGluIHRoZSBjb250YWluZXIgYXR0cmlidXRlIG9mIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQuIFRoZSBjb250YWluZXIgYXR0cmlidXRlCi0JICogaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uIEZvciBleGFtcGxlICJTV1RfQ09OVEFJTkVSIiB3aWxsIG1hdGNoIGJvdGggIi9TV1RfQ09OVEFJTkVSLyIgYW5kICIvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UiCi0JICogd2hpbGUgIlNXVF9DT05UQUlORVIvLiogL0pGQUNFIiB3aWxsIG1hdGNoICIvU1dUX0NPTlRBSU5FUi9QREUvSkZBQ0UiLiAoTm90ZSBpdCBpcyBhY3R1YWxseSBubyBzcGFjZSBiZXR3ZWVuIHRoZSAiKiIgYW5kICIvIiBidXQgamF2YSBjb21tZW50IHN5bnRheCB3b24ndCBhbGxvdyBpdC4pICAgCi0JICogQHBhcmFtIGNvbnRhaW5lcklkIGlkIG9mIGFsbCB0aGUgY29udGFpbmVycyBpbiB0aGUgbGlzdCBvZiBwYXRocyAodGhlIGZpcnN0IHNlZ21lbnQgb2YgYWxsIG9mIHRoZSBwYXRocykuCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGhzIGFycmF5IG9mIGFsbCBvZiB0aGUgcGF0aHMgdG8gbG9vayBmb3IgY29udHJpYnV0aW9ucyBmb3IuCi0JICogQHJldHVybiBhcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXRocy4gVGhleSB3aWxsIGJlIGluIG9yZGVyIGRlY2xhcmVkIHdpdGhpbiBhIHBsdWdpbiB3aXRoaW4gcGx1Z2luIG9yZGVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDb250cmlidXRvcnMoU3RyaW5nIGNvbnRhaW5lcklkLCBTdHJpbmdbXSBjb250YWluZXJQYXRocykgewotCQlDb250YWluZXJDb250cmlidXRpb25FbnRyeVtdIGJ1bmRsZUNvbnRyaWJ1dGlvbnMgPSAoQ29udGFpbmVyQ29udHJpYnV0aW9uRW50cnlbXSkgY29udGFpbmVySWRUb0NvbnRyaWJ1dGlvbnMuZ2V0KGNvbnRhaW5lcklkKTsKLQkJaWYgKGJ1bmRsZUNvbnRyaWJ1dGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGNvbnRyaWJ1dGlvblR5cGUsIDApOwotCQlMaXN0IGNvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFBhdHRlcm5zIHRoYXQgaGF2ZSBiZWVuIHRlc3RlZC4gS2V5IGlzIGEgcGF0dGVybiwgdmFsdWUgaXMgQm9vbGVhbi4gdHJ1ZSBpZiB0aGlzIHBhdHRlcm4gbWF0Y2hlZCBhbnkgb2YgdGhlIGNvbnRhaW5lciBwYXRocy4KLQkJLy8gVGhpcyB3YXkgYSBwYXR0ZXJuIHdpbGwgb25seSBiZSB0ZXN0ZWQgb25jZSBmb3IgdGhlIGxpc3Qgb2YgcGF0aHMuIElmIHRoZSBwYXR0ZXJuIGlzIGZvdW5kIHRoZSBsaXN0IGFnYWluIHdlIHdpbGwga25vdyBpZiBpdAotCQkvLyBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90LgotCQkvLyBUaGUgYnVuZGxlQ29udHJpYnV0aW9ucyBhcmUgaW4gb3JkZXIgZGVjbGFyZWQgd2l0aGluIGVhY2ggcGx1Z2luIHdpdGhpbiBwbHVnaW4gb3JkZXIuCi0JCU1hcCB0ZXN0ZWRQYXR0ZXJucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlQ29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJQm9vbGVhbiB0ZXN0ZWQgPSAoQm9vbGVhbikgdGVzdGVkUGF0dGVybnMuZ2V0KGJ1bmRsZUNvbnRyaWJ1dGlvbnNbaV0uZ2V0Q29udGFpbmVyUGF0aFBhdHRlcm4oKSk7Ci0JCQlpZiAodGVzdGVkID09IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIHRlc3QgaXQuCi0JCQkJLy8gUnVuIHRocm91Z2ggY29udGFpbmVyIHBhdGhzIGFuZCBzZWUgaWYgYW55IG1hdGNoLgotCQkJCXRlc3RlZCA9IEJvb2xlYW4uRkFMU0U7Ci0JCQkJUGF0dGVybiBwYXR0ZXJuID0gYnVuZGxlQ29udHJpYnV0aW9uc1tpXS5nZXRDb250YWluZXJQYXRoUGF0dGVybigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHBhdHRlcm4ubWF0Y2hlcihjb250YWluZXJQYXRoc1tqXSkubWF0Y2hlcygpKSB7Ci0JCQkJCQl0ZXN0ZWQgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXN0ZWRQYXR0ZXJucy5wdXQocGF0dGVybiwgdGVzdGVkKTsKLQkJCX0KLQkJCWlmICh0ZXN0ZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkJY29udHJpYnV0aW9ucy5hZGQoYnVuZGxlQ29udHJpYnV0aW9uc1tpXS5nZXRDb250cmlidXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyaWJ1dGlvbnMudG9BcnJheSgoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGNvbnRyaWJ1dGlvblR5cGUsIGNvbnRyaWJ1dGlvbnMuc2l6ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRyaWJ1dGlvbiB0byBtYXBwaW5nLiBUaGlzIGlzIG5vdCBub3JtYWxseSBuZWVkZWQgYnkgY2xpZW50cyB1bmxlc3MgdGhlIGNsaWVudCBuZWVkcyB0bwotCSAqIGJ1aWxkIHVwIGEgZGlmZmVyZW50IGNvbnRhaW5lciBwYXRoIG1hcHBpbmcgdGhhbiB0aGUgb25lIG5vcm1hbGx5IGNyZWF0ZWQgYnkge0BsaW5rIFByb3h5UGx1Z2luI3Byb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChTdHJpbmcpfS4KLQkgKiA8cD4KLQkgKiBBZnRlciBhbGwgY29udHJpYnV0aW9ucyBoYXZlIGJlZW4gYWRkZWQge0BsaW5rICNmaW5hbGl6ZU1hcHBpbmcoKX0gbXVzdCBiZSBjYWxsZWQuIElmIHRoaXMKLQkgKiBpcyBub3QgY2FsbGVkIHRoZW4ge0BsaW5rICNnZXRDb250cmlidXRvcnMoU3RyaW5nLCBTdHJpbmdbXSl9IHdpbGwgZmFpbCB3aXRoIGV4Y2VwdGlvbnMuCi0KLQkgKiBAcGFyYW0gY29udGFpbmVySWQKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqIEBwYXJhbSBjb250cmlidXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRpb24oU3RyaW5nIGNvbnRhaW5lcklkLCBQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBjb250cmlidXRpb24pIHsKLQkJaWYgKGNvbnRhaW5lcklkVG9Db250cmlidXRpb25zID09IENvbGxlY3Rpb25zLkVNUFRZX01BUCkKLQkJCWNvbnRhaW5lcklkVG9Db250cmlidXRpb25zID0gbmV3IEhhc2hNYXAoKTsJLy8gVGhpcyBpcyBmaXJzdCBjYWxsIHRvIGFkZCBzb21ldGhpbmcuCi0JCS8vIFdlIHdpbGwgYnVpbGQgYXMgbGlzdCwgYnV0IHRoZW4gY2hhbmdlIHRvIGFycmF5IHdoZW4gZG9uZS4KLQkJT2JqZWN0IGNvbnRyaWJ1dGlvbnMgPSBjb250YWluZXJJZFRvQ29udHJpYnV0aW9ucy5nZXQoY29udGFpbmVySWQpOwotCQlpZiAoY29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQljb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCWNvbnRhaW5lcklkVG9Db250cmlidXRpb25zLnB1dChjb250YWluZXJJZCwgY29udHJpYnV0aW9ucyk7Ci0JCX0gZWxzZSBpZiAoIShjb250cmlidXRpb25zIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCS8vIEl0IG11c3QgYmUgYW4gYXJyYXksIHNvIGNvbnZlcnQgYmFjayB0byBsaXN0IHNvIHRoYXQgd2UgY2FuIGFkZCB0byBpdC4KLQkJCUxpc3Qgb2xkQ29udHJpYnV0aW9ucyA9IEFycmF5cy5hc0xpc3QoKE9iamVjdFtdKSBjb250cmlidXRpb24pOwotCQkJY29udHJpYnV0aW9ucyA9IG5ldyBBcnJheUxpc3Qob2xkQ29udHJpYnV0aW9ucy5zaXplKCkpOwotCQkJKChMaXN0KSBjb250cmlidXRpb25zKS5hZGRBbGwob2xkQ29udHJpYnV0aW9ucyk7Ci0JCQljb250YWluZXJJZFRvQ29udHJpYnV0aW9ucy5wdXQoY29udGFpbmVySWQsIGNvbnRyaWJ1dGlvbnMpOwotCQl9Ci0JCSgoTGlzdCkgY29udHJpYnV0aW9ucykuYWRkKG5ldyBDb250YWluZXJDb250cmlidXRpb25FbnRyeShjb250cmlidXRpb24sIHBhdHRlcm4pKTsKLQotCX0KLQkKLQkvKioKLQkgKiBGaW5hbGl6ZSB0aGUgbWFwcGluZy4gVGhpcyBpcyBjYWxsZWQgd2hlbiBjbGllbnRzIGFyZSBkb25lIHdpdGggYWxsIHtAbGluayAjYWRkQ29udHJpYnV0aW9uKFN0cmluZyl9LgotCSAqIEl0IHRha2VzIHRoZSBtYXBwaW5nIGZyb20gYW4gaW50ZXJuYWwgZm9ybWF0IHRoYXQgYWxsb3dlZCBmb3IgcXVpY2tlciBidWlsZGluZyBpbnRvIHRoZSBmaW5hbCBmb3JtYXQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgZmluYWxpemVNYXBwaW5nKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXJJZFRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3QpCi0JCQkJZW50cnkuc2V0VmFsdWUoKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS50b0FycmF5KG5ldyBDb250YWluZXJDb250cmlidXRpb25FbnRyeVsoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnNpemUoKV0pKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db250cmlidXRvckV4dGVuc2lvblBvaW50SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4MzllMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db250cmlidXRvckV4dGVuc2lvblBvaW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0vKioKLSAqIFJlc3VsdCBmcm9tIHtAbGluayBQcm94eVBsdWdpbiNwcm9jZXNzQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoU3RyaW5nKX0KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbyB7Ci0JCi0JLyoqCi0JICogQ29udHJpYnV0aW9ucyB0aGF0IGFyZSBiYXNlZCB1cG9uIGNvbnRhaW5lciBwYXRocyB0aGF0IGFyZSBidWlsdCB1cCBmcm9tCi0JICogdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcgY29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbnM7Ci0KLQlDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbygpIHsKLQkJLy8gTm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIG91dHNpZGUgb2YgUHJveHlQbHVnaW4uCi0JfQotCQotCS8qKgotCSAqIE1hcCBvZiBwbHVnaW4gaWRzIChTdHJpbmcpIHRvIGNvbnRyaWJ1dGlvbnMgKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSB0aGF0IHdhcyBmb3VuZCB3aXRoIHRoYXQgaWQuIEZvciBlYWNoIHBsdWdpbiwKLQkgKiB0aGUgY29udHJpYnV0aW9ucyB3aWxsIGJlIGxpc3RlZCBpbiBwbHVnaW4gcHJlcmVxIG9yZGVyLgotCSAqLwotCXB1YmxpYyBNYXAgcGx1Z2luVG9Db250cmlidXRpb25zOwotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRW51bWVyYXRpb25CZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViOTAwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkVudW1lcmF0aW9uIHByb3h5LgotICogSXQgcHJvdmlkZXMgdGhlIEVudW1lcmF0aW9uIG1ldGhvZHMgdG8gaW50ZXJmYWNlIHRvCi0gKiB0aGUgcHJveHkuCi0gKi8KLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIElCZWFuUHJveHkgZkVudW1lcmF0aW9uOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgZkNvbnN0YW50czsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25CZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYW5FbnVtZXJhdGlvblByb3h5KSB7Ci0JCQotCQlmRW51bWVyYXRpb24gPSBhbkVudW1lcmF0aW9uUHJveHk7Ci0JCQkKLQkJZkNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoYW5FbnVtZXJhdGlvblByb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGl0ZXJhdG9yIHByb3h5IHRoYXQgdGhpcyBpcyB3cmFwcGVyaW5nLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIGZFbnVtZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHMgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZkVudW1lcmF0aW9uLmVxdWFscyhvYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBoYXNoQ29kZSAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRW51bWVyYXRpb24uaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRW51bWVyYXRpb24gYWNjZXNzb3JzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0RW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHMoKS5pbnZva2UoZkVudW1lcmF0aW9uKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXh0RWxlbWVudCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldEVudW1lcmF0aW9uTmV4dEVsZW1lbnQoKS5pbnZva2UoZkVudW1lcmF0aW9uKTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY0NWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBJRXhwcmVzc2lvbi4gSXQgZW5jYXBzdWxhdGVzIG11Y2ggb2YgdGhlIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAqIGludG8gYSBjb21tb24gZm9ybSB0aGF0IHdpbGwgYmUgdHVybmVkIGludG8gc2ltcGxlIHB1c2gvcG9wL2V2YWx1YXRlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLSAqIGFjdHVhbCBvdGhlciBzaWRlLiBBbGwgcmVnaXN0cnkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIElFeHByZXNzaW9uIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogSXQgd2lsbCBtYWludGFpbiBhIHN0YWNrIG9mIHRoZSBleHByZXNzaW9ucy4gQXMgdGhlIGV4cHJlc3Npb25zIGNvbWUgaW4gdGhleSB3aWxsIGJlIHN0YWNrZWQgaWYgbm90Ci0gKiBhYmxlIHRvIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBUaGUgZXhwcmVzc2lvbnMgY29tZSB0byB0aGlzIGNsYXNzIGluIGFuICBvdXRzaWRlIHRvIGluc2lkZSBvcmRlciwKLSAqIGJ1dCB0aGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGFuIGluc2lkZS1vdXQgb3JkZXIgaW5zdGVhZC4gCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByb3h5IGludGVyZmFjZXMuIFRoZSBhYnN0cmFjdCBtZXRob2RzIHdpbGwKLSAqIHRoZW4gYmUgdGhlIHNpbXBsZSBpbnRlcmZhY2UuIAotICogPHA+Ci0gKiBJdCBpcyBub3QgbWVhbnQgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlIGFjdHVhbCBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzIGJlY2F1c2UgdGhlIHByb2Nlc3NpbmcgdGhlIHN0YWNrCi0gKiBpcyB2ZXJ5IHNlbnNpdGl2ZSBhbmQgbXVzdCBleGVjdXRlIGluIHRoZSBwcm9wZXIgc2VxdWVuY2UuIFNvIHRoZSBjcmVhdGUgbWV0aG9kcyBhcmUgZmluYWwgZm9yIHRoaXMgcmVhc29uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbHNvIGhhcyBBUEkgb2YgaXRzIG93biBhbmQgY2FuIGJlIHVzZWQgYnkgY3VzdG9tZXJzIGZvciBhZHZhbmNlZCB1c2FnZS4gVGhvc2UgYWR2YW5jZWQgQVBJIGFyZQotICogbGlzdGVkIG9uIGVhY2ggbWV0aG9kIGFzIHRvIHdoZXRoZXIgaXQgaXMgY3VzdG9tZXIgQVBJIG9yIGltcGxlbWVudGVycyBBUEkgKGkuZS4gQVBJIGZvciBpbXBsZW1lbnRlcnMgb2YKLSAqIGV4cHJlc3Npb24gc3ViY2xhc3NlcyB0byB1c2UpLiAKLSAqIAotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBJRXhwcmVzc2lvbiB7Ci0KLQkvKgotCSAqIFdlIGhhdmUgc3RhY2sgaGVyZSwgYnV0IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGNsYXNzIHRoYXQgZG9lcyB0aGUKLQkgKiBzdGFjayBwcm90b2NvbCwgd2lsbCBzaW1wbHkgaGF2ZSBzb21lIHByaXZhdGUgbWV0aG9kcyB0byBkbwotCSAqIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgc3RhY2suIChOb3RlOiBDYW4ndCB1c2UgamF2YS51dGlsLlN0YWNrCi0JICogYmVjYXVzZSB0aGF0IGlzIGEgc3luY2hyb25pemVkIGNsYXNzLCBhbmQgZG9uJ3Qgd2FudCB0aGUgb3ZlcmhlYWQpLiAKLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGUgc3RhY2sgaXMgdG8gc3RhY2sgdXAgZXhwcmVzc2lvbnMgdGhhdCBoYXZlIG5vdCB5ZXQKLQkgKiBiZWVuIGV2YWx1YXRlZC4gCi0JICogCi0JICogRWFjaCBleHByZXNzaW9uIHR5cGUgd2lsbCBjb250cm9sIHRoZSBjb250ZW50IG9mIHdoYXQgaXQgcHVzaGVzIGFuZCBwb3BzLgotCSAqIFRoZSBleHByZXNzaW9uIHR5cGUgd2lsbCBiZSB0aGUgbGFzdCB0aGluZyBpdCBwdXNoZXMgc28gdGhhdCBvbiBwb3BwaW5nCi0JICogd2Uga25vdyB3aGF0IGtpbmQgb2YgZXhwcmVzc2lvbiBpcyBub3cgY29tcGxldGVkIGFuZCByZWFkeSBmb3IgZXZhbHVhdGlvbi4KLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBjb250cm9sU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDMwKTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJvdGVjdGVkIGZpbmFsIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgYmVhblByb3h5RmFjdG9yeTsKLQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFjZUZsYWc7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdHJhY2UgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQuCi0JICogVGhpcyBpcyBub3QgaW4gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIGZvciBhZHZhbmNlZCB1c2Vycy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFjZVNldCgpIHsKLQkJcmV0dXJuIHRyYWNlRmxhZyAhPSBudWxsOyAKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGlmIHRyYWNlIGlzIG9uLiBJZiBub3QgZXhwbGljaXRseSBzZXQgdGhpcyB3aWxsIGFuc3dlciBmYWxzZS4KLQkgKiBVc2Uge0BsaW5rIEV4cHJlc3Npb24jaXNUcmFjZVNldCgpfSBmaXJzdCB0byBkZXRlcm1pbmUgaWYgdGhpcwotCSAqIHNob3VsZCBiZSBjYWxsZWQgb3Igbm90LgotCSAqIFRoaXMgaXMgbm90IGluIHRoZSBJRXhwcmVzc2lvbiBpbnRlcmZhY2UgYmVjYXVzZSBpdCBpcyBmb3IgYWR2YW5jZWQgdXNlcnMuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhY2UoKSB7Ci0JCXJldHVybiB0cmFjZUZsYWcgIT0gbnVsbCA/IHRyYWNlRmxhZy5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBFeHBsaWNpdGx5IHNldCB0aGUgdHJhY2UgZmxhZy4gVGhpcyB3aWxsIG9ubHkgYmUgaG9ub3VyZWQgYmVmb3JlIGFueQotCSAqIGV4cHJlc3Npb25zIGhhdmUgYmVlbiBjcmVhdGVkLiBBZnRlciB0aGF0IHRoaXMgd2lsbCBiZSBpZ25vcmVkLgotCSAqIFRoZSB0cmFjZSBpcyBpbml0aWFsbHkgc2V0IHRvIHVzZSBkZWZhdWx0LiBPbmNlIHNldCBpdCBjYW5ub3QgYmUgdW5zZXQuCi0JICogVGhpcyBpcyBub3QgaW4gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIGZvciBhZHZhbmNlZCB1c2Vycy4KLQkgKiBAcGFyYW0gdHJhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZShib29sZWFuIHRyYWNlKSB7Ci0JCXRyYWNlRmxhZyA9IEJvb2xlYW4udmFsdWVPZih0cmFjZSk7Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYW4gb2JqZWN0IG9udG8gdGhlIGNvbnRyb2wgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdXNoKE9iamVjdCBvKSB7Ci0JCWNvbnRyb2xTdGFjay5hZGQobyk7Ci0JfQotCQotCS8qKgotCSAqIFBvcCBhbiBvYmplY3Qgb2ZmIG9mIHRoZSBjb250cm9sIHN0YWNrCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcG9wKCkgewotCQlyZXR1cm4gY29udHJvbFN0YWNrLnJlbW92ZShjb250cm9sU3RhY2suc2l6ZSgpLTEpOwotCX0KLQkKLQkvKioKLQkgKiBQZWVrIGF0IGFuIG9iamVjdCBmcm9tIHRoZSBjb250cm9sIHN0YWNrLiA8Y29kZT5mcm9tVG9wPC9jb2RlPiBpcyBob3cgZmFyIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgdG8gbG9vay4KLQkgKiBJZiBpdCBvbmUsIHRoZW4gaXQgaXMgdGhlIHRvcCBlbnRyeSwgdHdvIGlzIHRoZSBuZXh0IG9uZSBkb3duLiBaZXJvIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuCi0JICogQHBhcmFtIGZyb21Ub3AgSG93IGZhciBmcm9tIHRoZSB0b3AgdG8gcGVlay4gPGNvZGU+MTwvY29kZT4gaXMgdGhlIHRvcCwgbm90IHplcm8uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcGVlayhpbnQgZnJvbVRvcCkgewotCQkvLyAxIG1lYW5zIHRoZSB0b3AsIDIgaXMgdGhlIG5leHQgb25lIGRvd24uCi0JCXJldHVybiBjb250cm9sU3RhY2suZ2V0KGNvbnRyb2xTdGFjay5zaXplKCktZnJvbVRvcCk7Ci0JfQotCQotCS8qCi0JICogRXhwcmVzc2lvbiB0eXBlIGNvbnN0YW50cy4KLQkgKi8KLQkKLQkvKgotCSAqIEFSUkFZIEFDQ0VTUyBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVkKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVggKGZvciAxIHRvIG4gdGltZXMgZGVwZW5kaW5nIG9uIGluZGV4IGNvdW50KQotCSAqIAlQUk9DRVNTX0VYUFJFU1NJT04KLQkgKiAKLQkgKiBUaGUgdmFsdWUgc3RhY2sgd2lsbCBoYXZlCi0JICogCUFSUkFZQUNDRVNTCi0JICogCUludGVnZXIoaW5kZXggY291bnQpIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQVJSQVlBQ0NFU1NfSU5ERVhfMSA9IG5ldyBJbnRlZ2VyKDEpOwkvLyBVc2UgaW4gbm9ybWFsIGNhc2Ugb2Ygb25lIGluZGV4IGNvdW50LiBTYXZlcyBvYmplY3QgY3JlYXRpb24uCi0JCi0JLyoKLQkgKiBBUlJBWSBDUkVBVElPTiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJQVJSQVlDUkVBVElPTl9JTklUSUFMSVpFUiAtIGlmIGhhc0luaXRpYWxpemVyCi0JICogIElFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OIChmb3IgMCB0byBuIHRpbWVzIGRlcGVuZGluZyBvbiBkaW1lbnNpb24gY291bnQpCi0JICogIFBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmUKLQkgKiAgQVJSQVlDUkVBVElPTgotCSAqICB0eXBlIChlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlLCBvciBhbiBJQmVhblByb3h5VHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUpLgotCSAqICBJbnRlZ2VyKGRpbWVuc2lvbiBjb3VudCkgKGlmIHplcm8gdGhlbiB0aGVyZSBpcyBhbiBpbml0aWFsaXplcikgCi0JICogCi0JICogCi0JICogTm90ZTogQXJyYXkgSW5pdGlhbGl6ZXIgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgZGltZW5zaW9uLiBTYXZlIG9iamVjdCBjcmVhdGlvbi4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8wID0gbmV3IEludGVnZXIoMCk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBpbml0aWFsaXplci4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWV9JTklUSUFMSVpFUiA9IG5ldyBFeHByZXNzaW9uRW51bShJbnRlZ2VyLk1JTl9WQUxVRSsxLCAiQXJyYXkgSW5pdGlhbGl6ZXIgSW50ZXJuYWwiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogQVJSQVkgSU5JVElBTElaRVIgZXhwcmVzc2lvbgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OIChmb3IgbiB0aW1lcyBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIGV4cHJlc3Npb25zIGNvdW50KQotCSAqIAlQUk9DRVNTX0VYUFJFU1NJT04KLQkgKiAKLQkgKiBUaGUgdmFsdWUgc3RhY2sgd2lsbCBoYXZlCi0JICogCUFSUkFZSU5JVElBTElaRVIKLQkgKiAgdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKiAJCUkuZS4gaWYgYXJyYXkgYmVpbmcgY3JlYXRlZCBpcyBpbnRbXVtdLCB0aGUgdmFsdWUgcHVzaGVkIGhlcmUgd2lsbCBiZSBpbnRbXS4gVGhpcyBpcyBiZWNhdXNlIHdoZW4gY3JlYXRlZAotCSAqIAkJdGhlIGFycmF5IHdpbGwgd2luZCB1cCB3aXRoIGludFtleHByZXNzaW9uY291bnRdW10gaW4gdGhlIGVuZC4KLQkgKiAJSW50ZWdlciAoZXhwcmVzc2lvbiBjb3VudCkKLQkgKiAKLQkgKiBOb3RlOiBJbWJlZGRlZCBBcnJheSBJbml0aWFsaXplcnMgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZSU5JVElBTElaRVJfQ09VTlRfMCA9IG5ldyBJbnRlZ2VyKDApOwkvLyBVc2UgaW4gbm9ybWFsIGNhc2Ugb2YgZW1wdHkgYXJyYXkuIFNhdmUgb2JqZWN0IGNyZWF0aW9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQVJSQVlJTklUSUFMSVpFUl9DT1VOVF8xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgZWxlbWVudCBhcnJheS4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBBUlJBWUlOSVRJQUxJWkVSX0NPVU5UXzIgPSBuZXcgSW50ZWdlcigyKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIHR3byBlbGVtZW50IGFycmF5LiBTYXZlIG9iamVjdCBjcmVhdGlvbi4JCi0JCi0JLyoKLQkgKiBDQVNUIGV4cHJlc3Npb24uCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04KLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJQ0FTVAotCSAqIAl0eXBlIChlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlLCBvciBhbiBJQmVhblByb3h5VHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUpLgotCSAqLwotCi0JLyoKLQkgKiBDTEFTUyBJTlNUQU5DRSBDUkVBVElPTiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgSUV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UIChmb3IgMCB0byBuIHRpbWVzIGRlcGVuZGluZyBvbiBhcmd1bWVudCBjb3VudCkKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZQotCSAqICBDTEFTU0lOU1RBTkNFQ1JFQVRJT04KLQkgKiAgdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKiAgSW50ZWdlcihhcmd1bWVudCBjb3VudCkgCi0JICogCi0JICogCi0JICogTm90ZTogQXJyYXkgSW5pdGlhbGl6ZXIgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0FSR1VNRU5UU18xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgYXJndW1lbnQuIFNhdmUgb2JqZWN0IGNyZWF0aW9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fQVJHVU1FTlRTXzAgPSBuZXcgSW50ZWdlcigwKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG5vIGFyZ3VtZW50cyAoZGVmYXVsdCBjdG9yKS4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0KLQkvKgotCSAqIENPTkRJVElPTkFMIGV4cHJlc3Npb24uCi0JICogU2luY2UgdGhpcyBjYW4gY2F1c2Ugc2tpcHBpbmcgb2YgZXhwcmVzc2lvbnMgKGUuZy4gaWYgY29uZGl0aW9uIGlzIGZhbHNlLCB0aGVuIHRoZSB0cnVlIGNvbmRpdGlvbiBzaG91bGQgbm90IGJlIGV2YWx1YXRlZCksCi0JICogd2UgbmVlZCB0byBoYXZlIGEgcHJvY2VzcyBleHByZXNzaW9uIGFuZCBwcm9jZXNzIGNhbGwgdG8gdGhlIG90aGVyIHNpZGUgZm9yIGVhY2ggZXhwcmVzc2lvbiBzbyB0aGF0IGl0IGNhbgotCSAqIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuCi0JICogCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04KLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUNPTkRJVElPTkFMCi0JICogCUNPTkRJVElPTkFMX0NPTkRJVElPTgotCSAqIAlDT05ESVRJT05BTAotCSAqIAlDT05ESVRJT05BTF9UUlVFCi0JICogCUNPTkRJVElPTkFMCi0JICogCUNPTkRJVElPTkFMX0ZBTFNFCi0JICogCi0JICovCi0JCi0JLyoKLQkgKiBQUkVGSVggZXhwcmVzc2lvbi4KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ECi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCVBSRUZJWAotCSAqIAlvcGVyYXRvciAodXNpbmcgSW50ZWdlciBwcmVmaXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkgCi0JICovCi0JCi0JLyoKLQkgKiBJTkZJWCBleHByZXNzaW9uLgotCSAqIFNpbmNlIHR3byB0eXBlcyBvZiBpbmZpeCBvcGVyYXRvcnMgKGNvbmRpdGlvbmFsIGFuZCBBTkQgb3IpIGNhbiBjYXVzZSBza2lwcGluZyBvZiBleHByZXNzaW9ucyAoZS5nLiBvbmNlCi0JICogY29uZGl0aW9uYWwgYW5kIHNlZXMgYSBmYWxzZSBleHByZXNzaW9uLCB0aGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbnMgYXJlIHNraXBwZWQgYW5kIHNob3VsZCBub3QgYmUgZXZhbHVhdGVkKSwKLQkgKiB3ZSBuZWVkIHRvIGhhdmUgYSBwcm9jZXNzIGV4cHJlc3Npb24gYW5kIHByb2Nlc3MgY2FsbCB0byB0aGUgb3RoZXIgc2lkZSBmb3IgZWFjaCBleHByZXNzaW9uIHNvIHRoYXQgaXQgY2FuCi0JICogZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBpZ25vcmVkIG9yIG5vdC4KLQkgKiAKLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLklORklYX0xFRlQKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLklORklYX1JJR0hUCi0JICogIFBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAkJKGZvciAwIHRvIG4gdGltZXMgZGVwZW5kaW5nIHVwb24gZXh0ZW5kZWQgY291bnQpCi0JICogCQlJRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCAKLQkgKiAJCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlORklYCi0JICogCW9wZXJhdG9yICh1c2luZyBJbnRlZ2VyIGluZml4IG9wZXJhdG9yIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUpCi0JICogIElOX0xFRlQKLQkgKiAJCShmb3IgKGV4dGVuZGVkQ291bnQpIHRpbWVzKSBUaGlzIHdpbGwgY292ZXIgdGhlIHJpZ2h0IG9uZSBhbmQgYWxsIGJ1dCBsYXN0IGV4dGVuZGVkCi0JICogCQlJTkZJWAotCSAqIAkJb3BlcmF0b3IgKHVzaW5nIEludGVnZXIgaW5maXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkKLQkgKiAgCUlOX09USEVSCi0JICogSU5GSVgKLQkgKiAJb3BlcmF0b3IgKHVzaW5nIEludGVnZXIgaW5maXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkKLQkgKiAgSU5fTEFTVCAodGhpcyBpcyBjb3ZlcnMgZWl0aGVyIHRoZSByaWdodCBvbmUgaWYgbm8gZXh0ZW5kZWQsIG9yIHRoZSBsYXN0IGV4dGVuZGVkKQotCSAqLwotCQotCS8qCi0JICogSU5TVEFOQ0VPRiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uSU5TVEFOQ0VPRl9FWFBSRVNTSU9OCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlOU1RBTkNFT0YKLQkgKiAJdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKi8KLQotCS8qCi0JICogRmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiAoaWYgaGFzUmVjZWl2ZXIgaXMgdHJ1ZSkKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJRklFTERBQ0NFU1MKLQkgKiAJbmFtZSAodGhlIG5hbWUgb2YgdGhlIGZpZWxkKQotCSAqICBCb29sZWFuICh0cnVlIGlmIGhhcyByZWNlaXZlcikKLQkgKi8KLQotCS8qCi0JICogTWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiAoaWYgaGFzUmVjZWl2ZXIgaXMgdHJ1ZSkKLQkgKiAJSUV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5UICgwIHRvIG4gdGltZXMgZm9yIGhvdyBtYW55IGFyZ3VtZW50cykuCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCU1FVEhPRElOVk9DQVRJT04KLQkgKiAJbmFtZSAodGhlIG5hbWUgb2YgdGhlIG1ldGhvZCkKLQkgKiAgQm9vbGVhbiAodHJ1ZSBpZiBoYXMgcmVjZWl2ZXIpCi0JICogIGFyZ0NvdW50ICh0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cykuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBNRVRIT0RfQVJHVU1FTlRTXzEgPSBuZXcgSW50ZWdlcigxKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG9uZSBhcmd1bWVudC4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBNRVRIT0RfQVJHVU1FTlRTXzAgPSBuZXcgSW50ZWdlcigwKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG5vIGFyZ3VtZW50cy4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JCi0KLQkvKgotCSAqIEFzc2lnbm1lbnQgZXhwcmVzc2lvbgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgSUV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVAotCSAqICBJRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgQVNTSUdOTUVOVAotCSAqICBsZWZ0IGV4cHJlc3Npb24gKHZhcmlhYmxlIHJlZmVyZW5jZSkKLQkgKiAgcmlnaHQgZXhwcmVzc2lvbgotCSAqLwotCi0JLyoKLQkgKiBBc3NpZ25tZW50IHByb3h5IGV4cHJlc3Npb24KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogIElFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgQVNTSUdOTUVOVF9QUk9YWQotCSAqICBleHByZXNzaW9uIHByb3h5IChhbiBleHByZXNzaW9uIHByb3h5KQotCSAqLwotCQotCS8qCi0JICogTmV4dCB2YWxpZCBmb3IgZXhwcmVzc2lvbiBzdGFjay4gVGhpcyBpcyBrZXB0IGFzIGEgc3RhY2sgYWxzby4KLQkgKiBBcyB0aGUgZXhwcmVzc2lvbnMgY29tZSBpbiwgdGhlIGFwcHJvcHJpYXRlIG9yZGVyIChpbiByZXZlcnNlKQotCSAqIG9mIGV4cHJlc3Npb24gdHlwZXMgd2lsbCBiZSBwdXNoZWQsIGFuZCB0aGVuIHBvcHBlZCBhcyB0aGV5IAotCSAqIGNvbWUgaW4uCi0JICogCi0JICogU2luY2Ugd2UgY2FuJ3QgaGF2ZSBhbiBhcnJheSBsaXN0IG9mIGludHMsIHdpbGwgc2ltdWxhdGUgdGhlCi0JICogc3RhY2sgaGVyZS4KLQkgKi8KLQlwcml2YXRlIEZvckV4cHJlc3Npb25bXSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrID0gbmV3IEZvckV4cHJlc3Npb25bMzBdOwotCXByaXZhdGUgaW50IG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPSAtMTsJLy8gUG9zaXRpb24gb2YgdG9wIGVudHJ5IGluIHN0YWNrLgotCXByaXZhdGUgYm9vbGVhbiBleHByZXNzaW9uVmFsaWQgPSB0cnVlOwkvLyBJcyB0aGUgZXhwcmVzc2lvbiBjdXJyZW50bHkgdmFsaWQuCi0JcHJpdmF0ZSBTdHJpbmcgaW52YWxpZE1zZyA9IG51bGw7CS8vIE1zZyBmb3IgYmVpbmcgaW52YWxpZCBpZiBkZWZhdWx0IG1zZyBub3Qgc3VmZmljaWVudC4KLQlwcml2YXRlIExpc3QgZXhwcmVzc2lvblByb3hpZXM7CS8vIExpc3Qgb2YgZXhwcmVzc2lvbiBwcm94aWVzLiBUaGUgaW5kZXggb2YgdGhlIHByb3h5IGlzIGl0cyBpZC4gVGhpcyBsaXN0IG11c3QgbmV2ZXIgc2hyaW5rIGluIHNpemUuCi0KLQkvLyBBIE1hcmtFbnRyeS4gVG8gYWxsb3cgcmVzdG9yZSBpbiBjYXNlIG9mIGVycm9yLgotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtFbnRyeSB7Ci0JCXB1YmxpYyBpbnQgbWFya0lEOwotCQlwdWJsaWMgaW50IGNvbnRyb2xTdGFja1BvczsJLy8gUG9zaXRpb24gb2YgY29udHJvbCBzdGFjayBhdCB0aW1lIG9mIG1hcmsuCi0JCXB1YmxpYyBpbnQgbmV4dEV4cHJlc3Npb25TdGFja1BvczsJLy8gUG9zaXRpb24gb2YgbmV4dEZvckV4cHJlc3Npb24gc3RhY2sgYXQgdGltZSBvZiBtYXJrLgotCQlwdWJsaWMgaW50IGV4cHJlc3Npb25Qcm94aWVzUG9zOwkvLyBQb3NpdGlvbiBvZiBleHByZXNzaW9uUHJveGllcyBsaXN0IGF0IHRpbWUgb2YgbWFyay4KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgaGlnaGVzdE1hcmtJRCA9IDA7CS8vIE5leHQgbWFyayBpZC4gJzAnIGlzIGludmFsaWQsIGFzIGluIG5vIG1hcmtzLiBUaGlzIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBtYXJrLiBOZXZlciBkZWNyZW1lbnRlZC4KLQlwcml2YXRlIE1hcmtFbnRyeSBjdXJyZW50TWFya0VudHJ5OwkvLyBKdXN0IGEgY29udmllbmVuY2UgdG8gdGhlIGN1cnJlbnQgbWFyayBlbnRyeSBzbyBubyBuZWVkIHRvIGxvb2sgaW50byB0aGUgbGlzdCBldmVyeSB0aW1lLgotCXByaXZhdGUgTGlzdCBtYXJrRW50cmllczsJLy8gU3RhY2sgb2YgbWFyayBlbnRyaWVzLgotCQotCS8vIFRoaXMgY2xhc3MgaXMgaGVyZSBzbyB3ZSBjYW4gYWRkIG91ciBzcGVjaWFsIGludGVybmFsIEZvckV4cHJlc3Npb246IFBST0NFU1NfRVhQUkVTU0lPTi4gVGhlc2UgYXJlIG5ldmVyIHVzZWQgb3V0c2lkZSBFeHByZXNzaW9uLgotCXByaXZhdGUgc3RhdGljIGNsYXNzIEV4cHJlc3Npb25FbnVtIGV4dGVuZHMgRm9yRXhwcmVzc2lvbiB7Ci0KLQkJcHVibGljIEV4cHJlc3Npb25FbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQkJfQotCQkKLQl9Ci0JCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrLCBhbmQgd2hlbiBpdCBpcyBwb3BwZWQsIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgY29tcGxldGUgYW5kIHJlYWR5IHRvIGJlIHB1c2hlZCB0byB0aGUgcHJveHkgc2lkZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIFBST0NFU1NfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShJbnRlZ2VyLk1JTl9WQUxVRSwgIlByb2Nlc3MgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrIGZvciBlbmQgYmxvY2sgYW5kIHdpbGwgdGVzdCBpZiB0aGlzIHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBCTE9DS0VORF9FWFBSRVNTSU9OID0gbmV3IEV4cHJlc3Npb25FbnVtKFBST0NFU1NfRVhQUkVTU0lPTi5nZXRWYWx1ZSgpLTIsICJFbmQgQmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGlzIGlzIHB1c2hlZCBvbnRvIHRoZSBuZXh0IGV4cHJlc3Npb24gc3RhY2sgZm9yIGVuZCB0cnkgYW5kIHdpbGwgdGVzdCBpZiB0aGlzIHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBUUllFTkRfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShCTE9DS0VORF9FWFBSRVNTSU9OLmdldFZhbHVlKCktMSwgIkVuZCBUcnkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGlzIGlzIHB1c2hlZCBvbnRvIHRoZSBuZXh0IGV4cHJlc3Npb24gc3RhY2sgZm9yIGNhdGNoIGFuZCB3aWxsIHRlc3QgaWYgdGhpcyB0aGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVFJZQ0FUQ0hfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUUllFTkRfRVhQUkVTU0lPTi5nZXRWYWx1ZSgpLTEsICJDYXRjaCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQotCS8vIFRoaXMgaXMgcHVzaGVkIG9udG8gdGhlIG5leHQgZXhwcmVzc2lvbiBzdGFjayBmb3IgYmVnaW4gdGhyZWFkIHRyYW5zZmVyIGFuZCB3aWxsIHRlc3QgaWYgdGhpcyB0aGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVEhSRUFEVFJBTlNGRVJfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUUllDQVRDSF9FWFBSRVNTSU9OLmdldFZhbHVlKCktMSwgIkNhdGNoIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrIGZvciBlbmQgc3ViZXhwcmVzc2lvbiBhbmQgd2lsbCB0ZXN0IGlmIHRoaXMgdGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIFNVQkVYUFJFU1NJT05FTkRfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUSFJFQURUUkFOU0ZFUl9FWFBSRVNTSU9OLmdldFZhbHVlKCktMiwgIkVuZCBTdWJleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENoZWNrIHRoZSBmb3IgZXhwcmVzc2lvbiwgYW5kIGlmIGxlZ2FsLCBzZXQgdG8gdGhlIG5leHQgdmFsaWQgZm9yIGV4cHJlc3Npb24gdHlwZSwKLQkgKiBpZiBpdCBjYW4uIElmIHRoZSBzdGFjayBlbnRyeSBpcyBST09URVhQUkVTU0lPTiwgYW5kIHRoZSBmb3JFeHByZXNzaW9uIGlzIFJPT1RFWFBSRVNTSU9OLAotCSAqIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgYWxsb3dlZCwgYnV0IGl0IGlzIG5vdCBwb3BwZWQuIEl0IG11c3QgYmUgcG9wcGVkIGxhdGVyIHdoZW4gYXBwcm9wcmlhdGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBmb3IgImJsb2NrIiBleHByZXNzaW9ucy4gV2UgZG9uJ3Qgd2FudCB0byBwb3AgZG93biB0aGUgc3RhY2sgcGFzc2VkIHRoZSBST09URVhQUkVTU0lPTgotCSAqIHRoYXQgZ290IGFkZGVkIGJ5IHRoZSBjcmVhdGUgYmxvY2sgdW50aWwgd2UgZ2V0IGFuIGVuZCBibG9jay4gVGhhdCBhbGxvd3Mgcm9vdCBleHByZXNzaW9ucyB0bwotCSAqIGJlIGFkZGVkIHRvIHRoZSBibG9jayB3aXRob3V0IHRoZSBzdGFjayBwb3BwaW5nIHVwIHBhc3QgdGhlIGJsb2NrIHN0YXJ0IGluIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWlmIChleHByZXNzaW9uVmFsaWQpIHsKLQkJCWlmIChuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID09IC0xKQotCQkJCWlmIChmb3JFeHByZXNzaW9uID09IEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pCi0JCQkJCXJldHVybjsJLy8gdmFsaWQuIFdlIGFyZSBhdCB0aGUgcm9vdCAoaS5lLiBub3RoaW5nIGlzIHdhaXRpbmcpLgotCQkJCWVsc2UKLQkJCQkJOwkvLyBpbnZhbGlkLiBkcm9wIHRocm91Z2gKLQkJCWVsc2UgaWYgKG5leHRGb3JFeHByZXNzaW9uU3RhY2tbbmV4dEZvckV4cHJlc3Npb25TdGFja1Bvc10gPT0gZm9yRXhwcmVzc2lvbikgewotCQkJCS8vIFZhbGlkLCBlaXRoZXIgdGhlIHJvb3QgZXhwcmVzc2lvbiBtYXRjaGVkIChXZSBkb24ndCBpbXBsaWNpdGx5IHBvcCB0aG9zZS4gVGhhdCBuZWVkcyB0byBiZSBkb25lIGV4cGxpY2l0bHkpLiAKLQkJCQkvLyBPciB3ZSBtYXRjaGVkIG5vbi1yb290LCB0aG9zZSB3aWxsIGJlIHBvcHBlZC4KLQkJCQlpZiAoZm9yRXhwcmVzc2lvbiAhPSBGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKSB7Ci0JCQkJCXBvcEZvckV4cHJlc3Npb24oKTsJLy8gUG9wIHRoZSBzdGFjayBzaW5jZSBzdGFjayBub3QgYSByb290IGV4cHJlc3Npb24uCi0JCQkJfQotCQkJCXJldHVybjsJCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgZXhwTXNnID0gaW52YWxpZE1zZyAhPSBudWxsID8gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX0luSW52YWxpZFN0YXRlRHVlVG9fRVhDXywgbmV3IE9iamVjdFtdIHtpbnZhbGlkTXNnfSkgOiBQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVfRVhDXzsgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cE1zZyk7Ci0JCX0KLQkJCi0JCS8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIGludmFsaWQuCi0JCUZvckV4cHJlc3Npb24gZXhwZWN0ZWQgPSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID49IDAgPyBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrW25leHRGb3JFeHByZXNzaW9uU3RhY2tQb3NdIDogRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkJZXhwcmVzc2lvblZhbGlkID0gZmFsc2U7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX1R5cGVTZW50SW5JbnZhbGlkT3JkZXJfRVhDXywgbmV3IE9iamVjdFtdIHtmb3JFeHByZXNzaW9uLCBleHBlY3RlZH0pKTsgCi0JfQotCQotCS8qKgotCSAqIFBvcCB0aGUgdG9wIGZvciBleHByZXNzaW9uLCB3aGF0ZXZlciBpdCBpcy4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdHJ5IHRvIHBvcCB0aHJvdWdoIHRocm91Z2ggdGhlIGN1cnJlbnQgbWFyayBlbnRyeS4gVGhlIGVuZE1hcmsgaXMgdGhlIG9ubHkgb25lIHdobyBjYW4gZG8gdGhpcy4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwb3BGb3JFeHByZXNzaW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWlmIChleHByZXNzaW9uVmFsaWQgJiYgbmV4dEZvckV4cHJlc3Npb25TdGFja1BvcyA+PSAwKSB7Ci0JCQluZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zLS07Ci0JCQlpZiAoY3VycmVudE1hcmtFbnRyeSAhPSBudWxsICYmIG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPCBjdXJyZW50TWFya0VudHJ5Lm5leHRFeHByZXNzaW9uU3RhY2tQb3MpIHsKLQkJCQluZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zKys7CS8vIFJlc3RvcmUgdG8gd2hhdCBpdCB3YXMKLQkJCQl0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCB0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlleHByZXNzaW9uVmFsaWQgPSBmYWxzZTsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fSW52YWxpZE1hcmtOZXN0aW5nLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGN1cnJlbnRNYXJrRW50cnkgIT0gbnVsbCA/IGN1cnJlbnRNYXJrRW50cnkubWFya0lEIDogMCl9KSk7IAotCX0KLQkKLQkvKioKLQkgKiBQZWVrIGludG8gdGhlIGZvciBleHByZXNzaW9uIHN0YWNrIHRvIHNlZSBpZiB0aGUgdG9wIGVudHJ5IGlzIHRoZSBwYXNzZWQgaW4gdmFsdWUuIEl0IHdpbGwKLQkgKiBub3QgcG9wIHRoZSBzdGFjayBub3IgdGhyb3cgYW55IGV4Y2VwdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24gVGhlIHRvcCBleHByZXNzaW9uIGZsYWcgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoaXMgdmFsdWUuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdG9wIGV4cHJlc3Npb24gZXF1YWxzIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHBlZWtGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgewotCQlpZiAoZXhwcmVzc2lvblZhbGlkKSB7Ci0JCQlpZiAobmV4dEZvckV4cHJlc3Npb25TdGFja1BvcyA9PSAtMSkKLQkJCQlpZiAoZm9yRXhwcmVzc2lvbiA9PSBGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKQotCQkJCQlyZXR1cm4gdHJ1ZTsJLy8gdmFsaWQuIFdlIGFyZSBhdCB0aGUgcm9vdCAoaS5lLiBub3RoaW5nIGlzIHdhaXRpbmcpLgotCQkJCWVsc2UKLQkJCQkJOwkvLyBpbnZhbGlkLiBkcm9wIHRocm91Z2gKLQkJCWVsc2UgaWYgKG5leHRGb3JFeHByZXNzaW9uU3RhY2tbbmV4dEZvckV4cHJlc3Npb25TdGFja1Bvc10gPT0gZm9yRXhwcmVzc2lvbikKLQkJCQlyZXR1cm4gdHJ1ZTsJLy8gVmFsaWQsIHRoZSB0b3AgZXhwcmVzc2lvbiBtYXRjaGVkLgotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQkvKioKLQkgKiBNYXJrIHRoaXMgZXhwcmVzc2lvbiBhcyBub3cgaW52YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtYXJrSW52YWxpZCgpIHsKLQkJZXhwcmVzc2lvblZhbGlkID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIE1hcmsgdGhpcyBleHByZXNzaW9uIGFzIG5vdyBpbnZhbGlkLCBidXQgc3VwcGx5IGEgbWVzc2FnZSB0byBnbyB3aXRoIGl0LgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtYXJrSW52YWxpZChTdHJpbmcgbXNnKSB7Ci0JCWludmFsaWRNc2cgPSBtc2c7Ci0JCW1hcmtJbnZhbGlkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQluZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID0gLTE7Ci0JCWNvbnRyb2xTdGFjay5jbGVhcigpOwotCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCkKLQkJCW1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoZXhwcmVzc2lvblByb3hpZXMpOwkvLyBUaGV5IHdlcmVuJ3QgcHJvY2Vzc2VkLCBjbG9zZSBtdXN0IG9mIGJlZW4gY2FsbGVkIGVhcmx5LgotCQlleHByZXNzaW9uUHJveGllcyA9IG51bGw7Ci0JCW1hcmtFbnRyaWVzID0gbnVsbDsKLQkJZXhwcmVzc2lvblZhbGlkID0gZmFsc2U7Ci0JCWNsb3NlUHJveHkoKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb25WYWxpZDsKLQl9Ci0JCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgcGVuZGluZyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBldmFsdWF0aW9uLgotCSAqIEl0IGlzIGNvbXBsZXRlIGlmIHRoZSBuZXh0IGVudHJ5IG9uIHRoZSBzdGFjayBpcyBhIFBST0NFU1NfRVhQUkVTU0lPTgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHByZXNzaW9uUmVhZHkoKSB7Ci0JCWlmIChuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID49IDAgJiYgbmV4dEZvckV4cHJlc3Npb25TdGFja1tuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zXSA9PSBQUk9DRVNTX0VYUFJFU1NJT04pIHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwkvLyBwb3AgaXQKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBuZXh0RXhwcmVzc2lvbikgewotCQlpZiAoKytuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID49IG5leHRGb3JFeHByZXNzaW9uU3RhY2subGVuZ3RoKSB7Ci0JCQkvLyBJbmNyZWFzZSBzdGFjayBzaXplLgotCQkJRm9yRXhwcmVzc2lvbltdIG5ld1N0YWNrID0gbmV3IEZvckV4cHJlc3Npb25bbmV4dEZvckV4cHJlc3Npb25TdGFja1BvcyoyXTsJLy8gU28gcm9vbSB0byBncm93IHdpdGhvdXQgZXhjZXNzaXZlIGFsbG9jYXRpb25zLgotCQkJU3lzdGVtLmFycmF5Y29weShuZXh0Rm9yRXhwcmVzc2lvblN0YWNrLCAwLCBuZXdTdGFjaywgMCwgbmV4dEZvckV4cHJlc3Npb25TdGFjay5sZW5ndGgpOwotCQkJbmV4dEZvckV4cHJlc3Npb25TdGFjayA9IG5ld1N0YWNrOwotCQl9Ci0JCW5leHRGb3JFeHByZXNzaW9uU3RhY2tbbmV4dEZvckV4cHJlc3Npb25TdGFja1Bvc10gPSBuZXh0RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyoKLQkgKiBDaGVjayBpZiBleHByZXNzaW9uIGlzIGNvbXBsZXRlLCBhbmQgaWYgaXQgaXMsIHByb2Nlc3MgaXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHByZXNzaW9uKCkgewotCQl3aGlsZSAoZXhwcmVzc2lvblJlYWR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gV2UndmUgcmVjZWl2ZWQgYWxsIG9mIHRoZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24sIHNvIHByb2Nlc3MgaXQuCi0JCQkJaW50IGV4cFR5cGUgPSAoKEludGVybmFsRXhwcmVzc2lvblR5cGVzKSBwb3AoKSkuZ2V0VmFsdWUoKTsKLQkJCQlzd2l0Y2ggKGV4cFR5cGUpIHsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DQVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQ2FzdFRvUHJveHkoKElQcm94eUJlYW5UeXBlKSBwb3AoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoSW5zdGFuY2VvZlRvUHJveHkoKElQcm94eUJlYW5UeXBlKSBwb3AoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QUkVGSVhfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hQcmVmaXhUb1Byb3h5KChQcmVmaXhPcGVyYXRvcilwb3AoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaEluZml4VG9Qcm94eSgoSW5maXhPcGVyYXRvcikgcG9wKCksIChJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUpIHBvcCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaEFycmF5QWNjZXNzVG9Qcm94eSgoKEludGVnZXIpIHBvcCgpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0NSRUFUSU9OX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkoKElQcm94eUJlYW5UeXBlKSBwb3AoKSwgKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaEFycmF5SW5pdGlhbGl6ZXJUb1Byb3h5KChJUHJveHlCZWFuVHlwZSkgcG9wKCksICgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCksICgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KChJUHJveHlCZWFuVHlwZSkgcG9wKCksICgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRklFTERfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoRmllbGRBY2Nlc3NUb1Byb3h5KHBvcCgpLCAoKEJvb2xlYW4pIHBvcCgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NRVRIT0RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShwb3AoKSwgKChCb29sZWFuKSBwb3AoKSkuYm9vbGVhblZhbHVlKCksICgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hDb25kaXRpb25hbFRvUHJveHkoKEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSkgcG9wKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaEFzc2lnbm1lbnRUb1Byb3h5KChFeHByZXNzaW9uUHJveHkpIHBvcCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hBc3NpZ25tZW50VG9Qcm94eSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQmxvY2tFbmRUb1Byb3h5KCgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0VORF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaFRyeUVuZFRvUHJveHkoKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5USFJPV19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaFRocm93VG9Qcm94eSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfVEVTVF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaElmVGVzdFRvUHJveHkoKTsKLQkJCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX0VMU0VfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hJZkVsc2VUb1Byb3h5KChJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKSBwb3AoKSk7Ci0JCQkJCQlicmVhazsJCi0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hTdWJleHByZXNzaW9uRW5kVG9Qcm94eSgoKEludGVnZXIpIHBvcCgpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQlkZWZhdWx0OgotCQkJCQkJaW50ZXJuYWxQcm9jZXNzVW5rbm93bkV4cHJlc3Npb25UeXBlKGV4cFR5cGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbWFya0ludmFsaWQoKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUHJvY2Vzc1Vua25vd25FeHByZXNzaW9uVHlwZShpbnQgZXhwcmVzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAoIXByb2Nlc3NVbmtub3duRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvblR5cGUpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEFuIHVua25vd24gZXhwcmVzc2lvbiB0eXBlIHdhcyBmb3VuZCBpbiB0aGUgcHJvY2Vzc2luZyBvZiBleHByZXNzaW9uIHN0YWNrLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqIHRvIHByb2Nlc3MgbmV3IHR5cGVzIG9mIGV4cHJlc3Npb25zLiAKLQkgKiA8cD4KLQkgKiBPdmVycmlkZXMgbXVzdCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhleSBwcm9jZXNzZWQgdGhlIGV4cHJlc3Npb24gdHlwZS4gSWYgdGhleSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaXQgbWVhbnMgdGhleSBkaWRuJ3QgdW5kZXJzdGFuZCBpdCBlaXRoZXIgYW5kIHdlIHNob3VsZCBkbyBkZWZhdWx0IHByb2Nlc3NpbmcgZm9yIHVua25vdyB0eXBlLgotCSAqIEBwYXJhbSBleHByZXNzaW9uVHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSB3YXMgcHJvY2Vzc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IGtub3duIGJ5IHN1YmNsYXNzIGVpdGhlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzVW5rbm93bkV4cHJlc3Npb25UeXBlKGludCBleHByZXNzaW9uVHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJdGhpcy5iZWFuUHJveHlGYWN0b3J5ID0gdGhpcy5yZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2dldFJlZ2lzdHJ5KCkKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jaW52b2tlRXhwcmVzc2lvbigpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW52b2tlRXhwcmVzc2lvbigpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IC8vIFdlIGFyZSBhdCB0aGUgcm9vdC4KLQkJCXBvcEZvckV4cHJlc3Npb24oKTsJLy8gR2V0IHJpZCBvZiBhbnkgaW50ZXJtZWRpYXRlIHJvb3RzLgotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkvLyBXZSBzaG91bGQgYmUgYXQgdHJ1ZSByb290IG5vdy4gV2UgZG9uJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGludGVybWVkaWF0ZSByb290IHB1c2hlZCBpbiBzZXF1ZW5jZS4KLQkJCUxpc3QgcHJveGllcyA9IGV4cHJlc3Npb25Qcm94aWVzOwotCQkJZXhwcmVzc2lvblByb3hpZXMgPSBudWxsOwotCQkJcHVzaEludm9rZShwcm9jZXNzRXhwcmVzc2lvblByb3h5Q2FsbGJhY2tzKHByb3hpZXMpLCBwcm94aWVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1hcmtJbnZhbGlkKCk7IC8vIE1hcmsgaW52YWxpZCBzbyBhbnkgbmV3IGNhbGxzIGFmdGVyIHRoaXMgd2lsbCBmYWlsLgotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQkJCi0JLyoKLQkgKiBQcm9jZXNzIHRoZSBleHByZXNzaW9uIHByb3h5IGNhbGxiYWNrcywgaWYgYW55LgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwcm94aWVzIHRoYXQgaGF2ZSBjYWxsYmFja3MuCi0JICovCi0JcHJpdmF0ZSBpbnQgcHJvY2Vzc0V4cHJlc3Npb25Qcm94eUNhbGxiYWNrcyhMaXN0IHByb3hpZXMpIHsKLQkJaWYgKHByb3hpZXMgIT0gbnVsbCkgewotCQkJLy8gU3RyaXAgbGlzdCBkb3duIHRvIG9ubHkgdGhvc2Ugd2l0aCBjYWxsYmFja3MgYW5kIHNlbmQgb24uCi0JCQlpbnQgcHJveGllc1dpdGhDYWxsYmFja3MgPSAwOwotCQkJZm9yIChMaXN0SXRlcmF0b3IgZXBzID0gcHJveGllcy5saXN0SXRlcmF0b3IoKTsgZXBzLmhhc05leHQoKTspIHsKLQkJCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSAoRXhwcmVzc2lvblByb3h5KSBlcHMubmV4dCgpOwotCQkJCWlmICghcHJveHkuaGFzTGlzdGVuZXJzKCkpCi0JCQkJCWVwcy5zZXQobnVsbCk7CS8vIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBObyBvbmUgY2FyZXMuCi0JCQkJZWxzZQotCQkJCQlwcm94aWVzV2l0aENhbGxiYWNrcysrOwotCQkJfQotCQkJcmV0dXJuIHByb3hpZXNXaXRoQ2FsbGJhY2tzOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgdG8gdmFsaWRhdGUgdGhpcyBpcyBhIHZhbGlkIHByb3h5IGZvciB0aGlzIGV4cHJlc3Npb24uIFRoaXMgY291bGQgaGFwcGVuCi0JICogaWYgYSBwcm94eSBmcm9tIGFub3RoZXIgZXhwcmVzc2lvbiBpcyBzZW50IHRvIHRoaXMgZXhwcmVzc2lvbi4gSWYgdGhlIHByb3h5Ci0JICogaXMgYSBiZWFuIHByb3h5IG9yIGlzIGFuIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoaXMgZXhwcmVzc2lvbiwgdGhlbiB0aGlzCi0JICoganVzdCByZXR1cm5zLiBFbHNlIGl0IHdpbGwgdGhyb3cgdGhlIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259LiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJveHkgaXMgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgYW5vdGhlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJveHkoSVByb3h5IHByb3h5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKHByb3h5ICE9IG51bGwgJiYgKHByb3h5LmlzRXhwcmVzc2lvblByb3h5KCkgJiYgKChFeHByZXNzaW9uUHJveHkpIHByb3h5KS5nZXRFeHByZXNzaW9uKCkgIT0gdGhpcykpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9JbnZhbGlkUHJveHkpOwotCX0KLQkJCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHN1YmNsYXNzIHRvIGZpbGwgaW4gdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gcHJveHkuIFNlZSB7QGxpbmsgRXhwcmVzc2lvbiNwdWxsUHJveHlWYWx1ZShpbnQsIExpc3QpKX0gZm9yIGFuIGV4YW1wbGUgb2Ygd2hvIHdvdWxkIGNhbGwgaXQuCi0JICogQHBhcmFtIGVwCi0JICogQHBhcmFtIGJlYW5wcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm94eVJlc29sdmVkKEV4cHJlc3Npb25Qcm94eSBlcCwgSUJlYW5Qcm94eSBiZWFucHJveHkpIHsKLQkJZXAuZmlyZVJlc29sdmVkKGJlYW5wcm94eSk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSBzdWJjbGFzcyB0byBmaXJlIHByb3h5IHdhcyBub3QgcmVzb2x2ZWQuIFNlZSB7QGxpbmsgRXhwcmVzc2lvbiNwdWxsUHJveHlWYWx1ZShpbnQsIExpc3QpKX0gZm9yIGFuIGV4YW1wbGUgb2Ygd2hvIHdvdWxkIGNhbGwgaXQuCi0JICogQHBhcmFtIGVwCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5IGVwKSB7Ci0JCWVwLmZpcmVOb3RSZXNvbHZlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgc3ViY2xhc3MgdG8gZmlyZSBwcm94eSByZXNvbHZlZCB0byBhIHZvaWQgcmV0dXJuIHR5cGUuIFNlZSB7QGxpbmsgRXhwcmVzc2lvbiNwdWxsUHJveHlWYWx1ZShpbnQsIExpc3QpKX0gZm9yIGFuIGV4YW1wbGUgb2Ygd2hvIHdvdWxkIGNhbGwgaXQuCi0JICogQHBhcmFtIGVwCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5Vm9pZChFeHByZXNzaW9uUHJveHkgZXApIHsKLQkJZXAuZmlyZVZvaWRSZXNvbHZlZCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2dldEV4cHJlc3Npb25WYWx1ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIElCZWFuUHJveHkgZ2V0RXhwcmVzc2lvblZhbHVlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgLy8gV2UgYXJlIGF0IHRoZSByb290LgotCQkJcG9wRm9yRXhwcmVzc2lvbigpOwkvLyBHZXQgcmlkIG9mIGFueSBpbnRlcm1lZGlhdGUgcm9vdHMuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7CS8vIFdlIHNob3VsZCBiZSBhdCB0cnVlIHJvb3Qgbm93LiBXZSBkb24ndCBoYXZlIG1vcmUgdGhhbiBvbmUgaW50ZXJtZWRpYXRlIHJvb3QgcHVzaGVkIGluIHNlcXVlbmNlLgotCQkJTGlzdCBwcm94aWVzID0gZXhwcmVzc2lvblByb3hpZXM7Ci0JCQlleHByZXNzaW9uUHJveGllcyA9IG51bGw7Ci0JCQlyZXR1cm4gcHVsbFByb3h5VmFsdWUocHJvY2Vzc0V4cHJlc3Npb25Qcm94eUNhbGxiYWNrcyhwcm94aWVzKSwgcHJveGllcyk7IC8vIEdldCB0aGUgdG9wIHZhbHVlLgotCQl9IGZpbmFsbHkgewotCQkJbWFya0ludmFsaWQoKTsJLy8gTWFyayBpbnZhbGlkIHNvIGFueSBuZXcgY2FsbHMgYWZ0ZXIgdGhpcyB3aWxsIGZhaWwuIAotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE1hcmsgdGhlIGxpc3Qgb2YgcHJveGllcyBhcyBub3QgcmVzb2x2ZWQuIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoTGlzdCBwcm94aWVzKSB7Ci0JCWlmIChwcm94aWVzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yIGVwcyA9IHByb3hpZXMubGlzdEl0ZXJhdG9yKCk7IGVwcy5oYXNOZXh0KCk7KSB7Ci0JCQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gKEV4cHJlc3Npb25Qcm94eSkgZXBzLm5leHQoKTsKLQkJCQlpZiAocHJveHkgIT0gbnVsbCAmJiBwcm94eS5oYXNMaXN0ZW5lcnMoKSkKLQkJCQkJZmlyZVByb3h5Tm90UmVzb2x2ZWQocHJveHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgYmxvY2tOdW1iZXIgPSAtMTsJLy8gQ3VycmVudCBibG9jayBudW1iZXIuIFRoaXMgaXMgYWx3YXlzIGluY3JlbWVudGluZy4KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVCbG9ja0JlZ2luKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNyZWF0ZUJsb2NrQmVnaW4oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIEJsb2NrcyBhcmUgc3BlY2lhbCwgdGhleSBjYW4gYmUgYW55d2hlcmUgYXQgcm9vdCwgb2YgY291bGQgYmUgdGhlIHRydWUgb3IgZWxzZSBjbGF1c2Ugb2YgYW4gaWYvZWxzZS4KLQkJCWlmIChwZWVrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKSkKLQkJCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQllbHNlIGlmIChwZWVrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpKQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQkJZWxzZQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0VMU0UpOwotCQkJCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oQkxPQ0tFTkRfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQotCQkJcHVzaEJsb2NrQmVnaW5Ub1Byb3h5KCsrYmxvY2tOdW1iZXIpOwotCQkJcHVzaChuZXcgSW50ZWdlcihibG9ja051bWJlcikpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19FTkRfRVhQUkVTU0lPTik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQkJcmV0dXJuIGJsb2NrTnVtYmVyOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUJsb2NrQnJlYWsoaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUJsb2NrQnJlYWsoaW50IGJsb2NrTnVtYmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXB1c2hCbG9ja0JyZWFrVG9Qcm94eShibG9ja051bWJlcik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQmxvY2tFbmQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUJsb2NrRW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlwb3BGb3JFeHByZXNzaW9uKCk7IC8vIFJlbW92ZSB0aGUgcm9vdCBleHByZXNzaW9uIHNpbmNlIGJsb2NrIGlzIGRvbmUuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oQkxPQ0tFTkRfRVhQUkVTU0lPTik7IC8vIFRoaXMgbmVlZHMgdG8gYmUgbmV4dCBmb3IgaXQgdG8gYmUgdmFsaWQuCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBOb3cgbGV0IGl0IGhhbmRsZSB0aGUgcHJldmlvdXNseSBwdXNoZWQgZW5kIGJsb2NrLCBjb250YWluaW5nIHRoZSBibG9jayBudW1iZXIgYmVpbmcgZW5kZWQuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVBcnJheUFjY2VzcyhpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGludCBpbmRleENvdW50KSB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJaW50IGkgPSBpbmRleENvdW50OwotCQkJd2hpbGUgKGktLSA+IDApCi0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCk7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZKTsKLQotCQkJcHVzaChpbmRleENvdW50ID09IDEgPyBBUlJBWUFDQ0VTU19JTkRFWF8xIDogbmV3IEludGVnZXIoaW5kZXhDb3VudCkpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUFycmF5Q3JlYXRpb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlLCBpbnQgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KQotCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJcHVzaEFycmF5Q3JlYXRpb24oZm9yRXhwcmVzc2lvbiwgZ2V0UHJveHlCZWFuVHlwZSh0eXBlKSwgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVBcnJheUNyZWF0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCkKLQkJdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcHVzaEFycmF5Q3JlYXRpb24oZm9yRXhwcmVzc2lvbiwgdHlwZSwgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVzaEFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJCXN3aXRjaCAoZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlwdXNoKEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8wKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlwdXNoKEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8xKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcHVzaChuZXcgSW50ZWdlcihkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwdXNoKHR5cGUpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCWlmIChkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgPT0gMCkKLQkJCQlwdXNoRm9yRXhwcmVzc2lvbihBUlJBWV9JTklUSUFMSVpFUik7Ci0JCQllbHNlIHsKLQkJCQl3aGlsZSAoZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50LS0gPiAwKQotCQkJCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OKTsKLQkJCX0KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQXJyYXlJbml0aWFsaXplcihpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQXJyYXlJbml0aWFsaXplcihpbnQgZXhwcmVzc2lvbkNvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIFRoaXMgaXMgc3BlY2lhbCwgd2UgY291bGQgYmUgd2FpdGluZyBmb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KLQkJCS8vIFdlIHdpbGwgcGVlayB0byBzZWUgd2hhdCBpdCBpcyBhbmQgaGFuZGxlIGl0LgotCQkJaWYgKHBlZWtGb3JFeHByZXNzaW9uKEFSUkFZX0lOSVRJQUxJWkVSKSkKLQkJCQljaGVja0ZvckV4cHJlc3Npb24oQVJSQVlfSU5JVElBTElaRVIpOwotCQkJZWxzZQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0KLQkJCS8vIEF0IHRoaXMgcG9pbnQgaW4gdGltZSB0aGF0IHN0YWNrIG1heSBlaXRoZXIgaGF2ZToKLQkJCS8vIGFycmF5X3R5cGUsIGFycmF5X2NyZWF0aW9uCi0JCQkvLyBzdHJpcF9jb3VudCwgYXJyYXlfdHlwZSwgYXJyYXlfaW5pdGlhbGl6ZXIKLQkJCS8vIFNvIHdlIGNhbiBnZXQgdGhlIGFycmF5IHR5cGUgZnJvbSBwZWVrKDIpLCBhbmQgZ2V0IHRoZSBjb21tYW5kIHR5cGUgZnJvbSBwZWVrKDEpLgotCQkJLy8gVGhlbiBpZiB0aGUgY29tbWFuZCB0eXBlIGlzIGFycmF5X2NyZWF0aW9uLCBzdHJpcF9jb3VudCB3aWxsIGJlIGluaXRlZCB0byAwLCB3aGlsZQotCQkJLy8gZWxzZSBpdCB3aWxsIGJlIGluaXRlZCB0byBwZWVrKDMpLiBGcm9tIHRoYXQgd2UgY2FuIGluY3JlbWVudCB0aGUgc3RyaXBfY291bnQgdG8KLQkJCS8vIHVzZSBmb3IgdGhpcyBpbml0aWFsaXplci4KLQkJCS8vCi0JCQkvLyBXZSBuZWVkIHRvIHBlZWsgaGVyZSBiZWNhdXNlIHdlIHdpbGwgYmUgYWRkaW5nIHZhcmlvdXMgcHVzaGVzIHRvIHRoZSBzdGFjayBhbmQgd2UKLQkJCS8vIG5lZWQgdG8gZ2V0IHRoZSBpbmZvIHdoaWxlIGl0IGlzIHN0aWxsIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCQkJT2JqZWN0IGFycmF5VHlwZSA9IHBlZWsoMik7IAotCQkJaW50IHN0cmlwQ291bnQgPSAwOwotCQkJaWYgKHBlZWsoMSkgPT0gSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfSU5JVElBTElaRVJfRVhQUkVTU0lPTikKLQkJCQlzdHJpcENvdW50ID0gKChJbnRlZ2VyKSBwZWVrKDMpKS5pbnRWYWx1ZSgpOwotCi0JCQlzd2l0Y2ggKGV4cHJlc3Npb25Db3VudCkgewotCQkJCWNhc2UgMDoKLQkJCQkJcHVzaChBUlJBWUlOSVRJQUxJWkVSX0NPVU5UXzApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXB1c2goQVJSQVlJTklUSUFMSVpFUl9DT1VOVF8xKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlwdXNoKEFSUkFZSU5JVElBTElaRVJfQ09VTlRfMik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXB1c2gobmV3IEludGVnZXIoZXhwcmVzc2lvbkNvdW50KSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoYXJyYXlUeXBlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJU3RyaW5nIGF0ID0gKFN0cmluZykgYXJyYXlUeXBlOwotCQkJCWludCBpID0gYXQubGFzdEluZGV4T2YoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaSA9PSAtMSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fQXJyYXlUeXBlTm90QW5BcnJheV9FWENfLCBuZXcgT2JqZWN0W10geyBhcnJheVR5cGV9KSk7IAotCQkJCWFycmF5VHlwZSA9IGdldFByb3h5QmVhblR5cGUoYXQpOwotCQkJfSBlbHNlIGlmICghKGFycmF5VHlwZSBpbnN0YW5jZW9mIElQcm94eUJlYW5UeXBlKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fQXJyYXlUeXBlTm90QW5BcnJheV9FWENfLCBuZXcgT2JqZWN0W10geyBhcnJheVR5cGV9KSk7IAotCQkJfQotCQkJcHVzaChuZXcgSW50ZWdlcigrK3N0cmlwQ291bnQpKTsKLQkJCXB1c2goYXJyYXlUeXBlKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQl3aGlsZSAoZXhwcmVzc2lvbkNvdW50LS0gPiAwKQotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0gCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQ2FzdEV4cHJlc3Npb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIEEgY2FzdCBleHByZXNzaW9uIGhhcyBvbmUgbmVzdGVkIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXB1c2hDYXN0KGZvckV4cHJlc3Npb24sIGdldFByb3h5QmVhblR5cGUodHlwZSkpOyAvLyBQdXNoIHRoaXMgb250byB0aGUgbG9jYWwgc3RhY2sgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVDYXN0RXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcHVzaENhc3QoZm9yRXhwcmVzc2lvbiwgdHlwZSk7IC8vIFB1c2ggdGhpcyBvbnRvIHRoZSBsb2NhbCBzdGFjayB0byB3YWl0IGZvciBjb21wbGV0aW9uLgotCX0KLQkKLQkvKgotCSAqIFB1c2ggZm9yIGEgY2FzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaENhc3QoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJCXB1c2godHlwZSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNBU1RfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04pOyAvLyBUaGUgbmV4dCBleHByZXNzaW9uIG11c3QgYmUgZm9yIHRoZSBjYXN0IGV4cHJlc3Npb24uCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUsIGludCBhcmd1bWVudENvdW50KQotCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihmb3JFeHByZXNzaW9uLCBnZXRQcm94eUJlYW5UeXBlKHR5cGUpLCBhcmd1bWVudENvdW50KTsJLy8gUHVzaCB0aGlzIG9udG8gdGhlIGxvY2FsIHN0YWNrIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkKLQkJdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihmb3JFeHByZXNzaW9uLCB0eXBlLCBhcmd1bWVudENvdW50KTsJLy8gUHVzaCB0aGlzIG9udG8gdGhlIGxvY2FsIHN0YWNrIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0JfQotCi0JLyoKLQkgKiBQdXNoIGZvciBhIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXZhbGlkYXRlUHJveHkodHlwZSk7Ci0JCQlzd2l0Y2ggKGFyZ3VtZW50Q291bnQpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXB1c2goQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fQVJHVU1FTlRTXzApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXB1c2goQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fQVJHVU1FTlRTXzEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwdXNoKG5ldyBJbnRlZ2VyKGFyZ3VtZW50Q291bnQpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwdXNoKHR5cGUpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXdoaWxlIChhcmd1bWVudENvdW50LS0gPiAwKQotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgkJCQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUpOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OKTsKLQotCQkJcHVzaChJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfRkFMU0UpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DT05ESVRJT05BTF9FWFBSRVNTSU9OKTsKLQkJCXB1c2goSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX1RSVUUpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DT05ESVRJT05BTF9FWFBSRVNTSU9OKTsKLQkJCXB1c2goSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX1RFU1QpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DT05ESVRJT05BTF9FWFBSRVNTSU9OKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVGaWVsZEFjY2VzcyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgZmllbGROYW1lLCBib29sZWFuIGhhc1JlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gT25seSBmb3Igc3RyaW5nIGZpZWxkbmFtZXMgaXMgdGhpcyBpbnZhbGlkIHdoZW4gbm8gcmVjZWl2ZXIgYmVjYXVzZSBubyB3YXkgdG8gZGV0ZXJtaW5lIHJlY2VpdmVyLiAoRG9uJ3QgaGFuZGxlIGltcGxpY2l0ICJ0aGlzIiB5ZXQgZm9yIGZpZWxkcykuIAotCQkJLy8gRm9yIHRoZSBhY2Nlc3NvciB0aGF0IHRha2VzIGEgSUZpZWxkUHJveHkgd2UgY2FuIGdldCBhd2F5IHdpdGggbm8gcmVjZWl2ZXIgYmVjYXVzZSB0aGUgZmllbGQgcHJveHkgY2FuIGRldGVybWluZSBpZiBzdGF0aWMgb3Igbm90LCBhbmQgaWYgbm90Ci0JCQkvLyBzdGF0aWMgaXQgd2lsbCBmYWlsIGF0IGV2YWx1YXRpb24gdGltZS4KLQkJCWlmICghaGFzUmVjZWl2ZXIpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCVByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9DYW5ub3RIYW5kbGVOb1JlY2VpdmVPbkZpZWxkQWNjZXNzX0VYQ18sIG5ldyBPYmplY3RbXSB7IGZpZWxkTmFtZX0pKTsgCi0JCQlwdXNoRmllbGRBY2Nlc3MoZm9yRXhwcmVzc2lvbiwgZmllbGROYW1lLCBoYXNSZWNlaXZlcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlSWZFbHNlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlSWZFbHNlKGJvb2xlYW4gaGFzRWxzZUNsYXVzZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQkKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlpZiAoaGFzRWxzZUNsYXVzZSkgewotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7Ci0JCQl9Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9UUlVFKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTik7Ci0KLQkJCS8vIFdlIHN0aWxsIHB1c2ggYW4gZWxzZSBjbGF1c2Ugc28gdGhhdCB3ZSBrbm93IHdoZW4gZmluaXNoZWQuIFdlIGRvbid0IGhhdmUgYSBwdXNoRm9yRXhwcmVzc2lvbiBmb3IgaXQgYmVjYXVzZSB0aGVyZQotCQkJLy8gd29uJ3QgYmUgYW55LiBCdXQgdGhlIGVsc2UgY2xhdXNlIHByb2Nlc3Npbmcgd2lsbCBiZSBvbiB0aGUgcHVzaCBzdGFjayBzbyB0aGF0IHdlIGNhbiBjbGVhbiB1cCB3aGVuIGVuZCBvZiBpZiBzdG10IG9jY3Vycy4KLQkJCXB1c2goSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5FTFNFX0NMQVVTRSk7CQotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9FTFNFX0VYUFJFU1NJT04pOwotCQkJCi0JCQlwdXNoKEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuVFJVRV9DTEFVU0UpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9FTFNFX0VYUFJFU1NJT04pOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9URVNUX0VYUFJFU1NJT04pOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogUHVzaCB0aGUgZmllbGQgYWNjZXNzLgotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIGZpZWxkIFN0cmluZyBpZiBmaWVsZCBuYW1lLCBvciBJUHJveHlGaWVsZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIKLQkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaEZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgT2JqZWN0IGZpZWxkLCBib29sZWFuIGhhc1JlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2goaGFzUmVjZWl2ZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsgLy8gV2UgaGF2ZSBhIHJlY2VpdmVyCi0JCQlwdXNoKGZpZWxkKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRklFTERfQUNDRVNTX0VYUFJFU1NJT04pOwotCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJaWYgKGhhc1JlY2VpdmVyKQotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVJbmZpeEV4cHJlc3Npb24oaW50LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBpbnQgZXh0ZW5kZWRPcGVyYW5kQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaChJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEFTVF9PUEVSQU5EKTsKLQkJCXB1c2gob3BlcmF0b3IpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OKTsKLQkJCWludCBpID0gZXh0ZW5kZWRPcGVyYW5kQ291bnQ7Ci0JCQl3aGlsZSAoaS0tID4gMCkgewotCQkJCXB1c2goSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX09USEVSX09QRVJBTkQpOwotCQkJCXB1c2gob3BlcmF0b3IpOwotCQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCQl9Ci0JCQlwdXNoKEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpOwotCQkJcHVzaChvcGVyYXRvcik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklORklYX0VYUFJFU1NJT04pOwotCi0JCQlpID0gZXh0ZW5kZWRPcGVyYW5kQ291bnQ7Ci0JCQl3aGlsZSAoaS0tID4gMCkgewotCQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCk7Ci0JCQl9Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCk7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZUKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlwdXNoSW5zdGFuY2VvZihmb3JFeHByZXNzaW9uLCBnZXRQcm94eUJlYW5UeXBlKHR5cGUpKTsJLy8gUHVzaCB0aGlzIG9udG8gdGhlIGxvY2FsIHN0YWNrIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXB1c2hJbnN0YW5jZW9mKGZvckV4cHJlc3Npb24sIHR5cGUpOwkvLyBQdXNoIHRoaXMgb250byB0aGUgbG9jYWwgc3RhY2sgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIGZvciBhIGNhc3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1c2hJbnN0YW5jZW9mKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXZhbGlkYXRlUHJveHkodHlwZSk7Ci0JCQlwdXNoKHR5cGUpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTlNUQU5DRU9GX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5TVEFOQ0VPRl9WQUxVRSk7IC8vIFRoZSBuZXh0IGV4cHJlc3Npb24gbXVzdCBiZSBmb3IgdGhlIGluc3RhbmNlIG9mIGV4cHJlc3Npb24uCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZU1ldGhvZEludm9jYXRpb24oaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuLCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJndW1lbnRDb3VudCkKLQkJdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIE9ubHkgZm9yIHN0cmluZyBtZXRob2RuYW1lcyBpcyB0aGlzIGludmFsaWQgd2hlbiBubyByZWNlaXZlciBiZWNhdXNlIG5vIHdheSB0byBkZXRlcm1pbmUgcmVjZWl2ZXIuIChEb24ndCBoYW5kbGUgaW1wbGljaXQgInRoaXMiIHlldCBmb3IgbWV0aG9kcykuIAotCQkJLy8gRm9yIHRoZSBhY2Nlc3NvciB0aGF0IHRha2VzIGEgSUZpZWxkUHJveHkgd2UgY2FuIGdldCBhd2F5IHdpdGggbm8gcmVjZWl2ZXIgYmVjYXVzZSB0aGUgZmllbGQgcHJveHkgY2FuIGRldGVybWluZSBpZiBzdGF0aWMgb3Igbm90LCBhbmQgaWYgbm90Ci0JCQkvLyBzdGF0aWMgaXQgd2lsbCBmYWlsIGF0IGV2YWx1YXRpb24gdGltZS4KLQkJCWlmICghaGFzUmVjZWl2ZXIpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCVByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9NZXRob2RzTmVlZFJlY2VpdmVyX0VYQ18sIG5ldyBPYmplY3RbXSB7IG5hbWV9KSk7IAotCi0JCQlwdXNoTWV0aG9kSW52b2NhdGlvbihmb3JFeHByZXNzaW9uLCBuYW1lLCBoYXNSZWNlaXZlciwgYXJndW1lbnRDb3VudCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbWV0aG9kIFN0cmluZyBmb3IgbWV0aG9kIG5hbWUsIElNZXRob2RQcm94eSBvdGhlcndpc2UuCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIAotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50Ci0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaE1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBPYmplY3QgbWV0aG9kLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXN3aXRjaCAoYXJndW1lbnRDb3VudCkgewotCQkJCWNhc2UgMDoKLQkJCQkJcHVzaChNRVRIT0RfQVJHVU1FTlRTXzApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXB1c2goTUVUSE9EX0FSR1VNRU5UU18xKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcHVzaChuZXcgSW50ZWdlcihhcmd1bWVudENvdW50KSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcHVzaChoYXNSZWNlaXZlciA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCQkJcHVzaChtZXRob2QpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NRVRIT0RfRVhQUkVTU0lPTik7Ci0KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQl3aGlsZSAoYXJndW1lbnRDb3VudC0tID4gMCkKLQkJCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCk7Ci0JCQlpZiAoaGFzUmVjZWl2ZXIpCi0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmVmaXhFeHByZXNzaW9uKGludCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5QcmVmaXhPcGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaChvcGVyYXRvcik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBSRUZJWF9FWFBSRVNTSU9OKTsKLQkJCQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsJLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHVzaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcuIFRoZSByZXN1bHQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlCi0JICogZ2l2ZW4gdHlwZS4gVGhpcyBpcyBub3Qgb24gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIG5vdCBmb3IgdXNlIG9mIHJlZ3VsYXIKLQkgKiBjdXN0b21lcnMuIEl0IGlzIGhlcmUgZm9yIHRoZSBhbGxvY2F0aW9uIHByb2Nlc3NlciB0byBjcmVhdGUgZW50cmllcyB0aGF0IGFyZSBqdXN0IHN0cmluZ3MuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgY3VzdG9tZXIgYWR2YW5jZWQgQVBJLiBUaGlzIEFQSSBmb3IgdGhlIGltcGxlbWVudGVycyBvZiByZWdpc3RyaWVzIGFuZCBleHByZXNzaW9uIHN1YmNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJCXB1c2hOZXdJbnN0YW5jZVRvUHJveHkoaW5pdGlhbGl6YXRpb25TdHJpbmcsIHR5cGUpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZU51bGwoaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZU51bGwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KG51bGwpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsJLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVUeXBlTGl0ZXJhbChpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByb3h5RXhwcmVzc2lvbihmb3JFeHByZXNzaW9uLCBnZXRQcm94eUJlYW5UeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVUeXBlUmVjZWl2ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlwdXNoVHlwZVJlY2VpdmVyKGdldFByb3h5QmVhblR5cGUodHlwZSkpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUeXBlUmVjZWl2ZXIoSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJcHVzaFR5cGVSZWNlaXZlcih0eXBlKTsKLQl9Ci0KLQkvKgotCSAqIFB1c2ggZm9yIGEgdHlwZSByZWNlaXZlci4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoVHlwZVJlY2VpdmVyKElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gVGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgdHlwZSByZWNlaXZlcnMgYXJlIG9ubHkgdmFsaWQgYXMgdGhlIHJlY2VpdmVyIGZvciBhIGZpZWxkIGFjY2VzcyBvciBhIG1ldGhvZCBhY2Nlc3MuCi0JCQkvLyBTaW5jZSBlYWNoIGhhcyBhIGRpZmZlcmVudCBmb3JFeHByZXNzaW9uIHdlIG5lZWQgdG8gdGVzdCBmb3Igb25lIG9yIHRoZSBvdGhlci4gSXQgZG9lc24ndCBtYWtlIGFueSBkaWZmZXJlbmNlCi0JCQkvLyB3aGljaCBvbmUgaXQgaXMsIGJ1dCBpdCBtdXN0IGJlIG9uZSBvciB0aGUgb3RoZXIuCi0JCQlpZiAocGVla0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUikpCi0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIpOwotCQkJZWxzZQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUik7Ci0JCQkKLQkJCXB1c2hUeXBlUmVjZWl2ZXJUb1Byb3h5KHR5cGUpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsJLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0JCQkKLQl9Ci0JCi0JLyoKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMgd2Ugd2lsbCBiZSBjcmVhdGluZyBhIElCZWFuUHJveHkgZm9yIHRoZW0uIFRoYXQgaXMgYmVjYXVzZSB0aGF0Ci0JICogd291bGQgYmUgdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiwgYW5kIG5vIG5lZWQgdG8gZ2V0IHRoZSBvdGhlciBzaWRlIGludm9sdmVkLgotCSAqLwotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgY2hhciB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgYnl0ZSB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgZG91YmxlKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBkb3VibGUgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaFRvUHJveHkoYmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHZhbHVlKSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChpbnQsIGZsb2F0KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBpbnQgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaFRvUHJveHkoYmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHZhbHVlKSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChpbnQsIGxvbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGxvbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaFRvUHJveHkoYmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHZhbHVlKSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChpbnQsIHNob3J0KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBzaG9ydCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVTdHJpbmdMaXRlcmFsKGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByb3h5RXhwcmVzc2lvbihpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHkgcHJveHkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQl2YWxpZGF0ZVByb3h5KHByb3h5KTsKLQkJCXB1c2hUb1Byb3h5KHByb3h5KTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfRVhQUkVTU0lPTik7Ci0JCQkKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQpOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsJLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSBhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWSk7Ci0JCQlwdXNoKHByb3h5KTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJCXJldHVybiBwcm94eTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgcmVnaXN0cmllcyB0byBjcmVhdGUgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgYSBiZWFuIHR5cGUuIEl0IGlzIG5vdCBpbiB0aGUgaW50ZXJmYWNlIGJlY2F1c2UgaXQgc2hvdWxkCi0JICogb25seSBiZSBjYWxsZWQgYnkgdGhlIHByb3h5IHJlZ2lzdHJ5IHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5LiBJdCBzaG91bGRuJ3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHJlZ2lzdHJpZXMKLQkgKiBiZWNhdXNlIHRoZXJlIG1heSBhbHJlYWR5IGV4aXN0IGluIHRoZSByZWdpc3RyeSB0aGUgdHJ1ZSBJQmVhblR5cGVQcm94eSwgYW5kIHRoYXQgb25lIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgY3VzdG9tZXIgYWR2YW5jZWQgQVBJLiBUaGlzIEFQSSBmb3IgdGhlIGltcGxlbWVudGVycyBvZiByZWdpc3RyaWVzIGFuZCBleHByZXNzaW9uIHN1YmNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIHR5cGVOYW1lCi0JICogQHJldHVybiBleHByZXNzaW9uIHByb3h5IHRoYXQgaXMgaG9va2VkIHVwIGFuZCB3aWxsIG5vdGlmeSB3aGVuIHJlc29sdmVkLiBJdCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLiBUaGUgcmVzb2x1dGlvbiB3aWxsIG9jY3VyIGF0IHRoaXMgcG9pbnQgaW4gdGhlCi0JICogZXhlY3V0aW9uIHN0YWNrLCBidXQgc2luY2UgaXQgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggdGhlIHN0YWNrIHRoaXMgaXMgT0ssIG90aGVyIHRoYW4gaXQgY291bGQgdGhyb3cgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIG9uIHRoZQotCSAqIGV4ZWN1dGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVByb3h5QmVhblR5cGUgY3JlYXRlQmVhblR5cGVFeHByZXNzaW9uUHJveHkoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUlCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IChJQmVhblR5cGVFeHByZXNzaW9uUHJveHkpIGFsbG9jYXRlRXhwcmVzc2lvblByb3h5KEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFkpOwotCQlwcm94eS5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0JCS8vIFRoaXMgY2FuIGJlIHNlbnQgYXQgYW55IHRpbWUuIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgaXMgb24gdGhlIGV4cHJlc3Npb24gc3RhY2suIEl0IHdpbGwgYmUgc2VudCB0byBiZSByZXNvbHZlZCBpbW1lZGlhdGVseS4KLQkJcHVzaEJlYW5UeXBlVG9Qcm94eShwcm94eSk7Ci0JCXJldHVybiBwcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgcmVnaXN0cmllcyB0byBjcmVhdGUgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgYSBtZXRob2QuIEl0IGlzIG5vdCBpbiB0aGUgaW50ZXJmYWNlIGJlY2F1c2UgaXQgc2hvdWxkCi0JICogb25seSBiZSBjYWxsZWQgYnkgdGhlIHByb3h5IHJlZ2lzdHJ5IHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5LiBJdCBzaG91bGRuJ3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHJlZ2lzdHJpZXMKLQkgKiBiZWNhdXNlIHRoZXJlIG1heSBhbHJlYWR5IGV4aXN0IGluIHRoZSByZWdpc3RyeSB0aGUgdHJ1ZSBJTWV0aG9kUHJveHksIGFuZCB0aGF0IG9uZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IGN1c3RvbWVyIGFkdmFuY2VkIEFQSS4gVGhpcyBBUEkgZm9yIHRoZSBpbXBsZW1lbnRlcnMgb2YgcmVnaXN0cmllcyBhbmQgZXhwcmVzc2lvbiBzdWJjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgcGFyYW1ldGVyIHR5cGVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVByb3h5TWV0aG9kIGNyZWF0ZU1ldGhvZEV4cHJlc3Npb25Qcm94eShJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnsKLQkJdmFsaWRhdGVQcm94eShkZWNsYXJpbmdUeXBlKTsKLQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwgJiYgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXZhbGlkYXRlUHJveHkocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IGFsbG9jYXRlRXhwcmVzc2lvblByb3h5KE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZKTsKLQkJLy8gVGhpcyBjYW4gYmUgc2VudCBhdCBhbnkgdGltZS4gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBpcyBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjay4gSXQgd2lsbCBiZSBzZW50IHRvIGJlIHJlc29sdmVkIGltbWVkaWF0ZWx5LgotCQlwdXNoTWV0aG9kVG9Qcm94eShwcm94eSwgZGVjbGFyaW5nVHlwZSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlyZXR1cm4gKElQcm94eU1ldGhvZCkgcHJveHk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSByZWdpc3RyaWVzIHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5IGZvciBhIGZpZWxkLiBJdCBpcyBub3QgaW4gdGhlIGludGVyZmFjZSBiZWNhdXNlIGl0IHNob3VsZAotCSAqIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBwcm94eSByZWdpc3RyeSB0byBjcmVhdGUgYW4gZXhwcmVzc2lvbiBwcm94eS4gSXQgc2hvdWxkbid0IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSByZWdpc3RyaWVzCi0JICogYmVjYXVzZSB0aGVyZSBtYXkgYWxyZWFkeSBleGlzdCBpbiB0aGUgcmVnaXN0cnkgdGhlIHRydWUgSUZpZWxkUHJveHksIGFuZCB0aGF0IG9uZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IGN1c3RvbWVyIGFkdmFuY2VkIEFQSS4gVGhpcyBBUEkgZm9yIHRoZSBpbXBsZW1lbnRlcnMgb2YgcmVnaXN0cmllcyBhbmQgZXhwcmVzc2lvbiBzdWJjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIGZpZWxkTmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJveHlGaWVsZCBjcmVhdGVGaWVsZEV4cHJlc3Npb25Qcm94eShJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShkZWNsYXJpbmdUeXBlKTsKLQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoRklFTERfRVhQUkVTU0lPTl9QUk9YWSk7Ci0JCS8vIFRoaXMgY2FuIGJlIHNlbnQgYXQgYW55IHRpbWUuIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgaXMgb24gdGhlIGV4cHJlc3Npb24gc3RhY2suIEl0IHdpbGwgYmUgc2VudCB0byBiZSByZXNvbHZlZCBpbW1lZGlhdGVseS4KLQkJcHVzaEZpZWxkVG9Qcm94eShwcm94eSwgZGVjbGFyaW5nVHlwZSwgZmllbGROYW1lKTsKLQkJcmV0dXJuIChJUHJveHlGaWVsZCkgcHJveHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcm94eVJlYXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBFeHByZXNzaW9uUHJveHkgcHJveHkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlpZiAoIXByb3h5LmlzVmFsaWRGb3JSZWFzc2lnbm1lbnQoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9DcmVhdGVQcm94eVJlYXNzaWdubWVudEV4cHJlc3Npb25fSW52YWxpZEZvclJlYXNzaWdubWVudF9FWENfLCBuZXcgT2JqZWN0W117cHJveHkudG9TdHJpbmcoKX0pKTsgCi0JCQlwdXNoKHByb3h5KTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX0VYUFJFU1NJT05fUFJPWFkgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFkgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUVMRF9FWFBSRVNTSU9OX1BST1hZID0gMzsKLQkvKioKLQkgKiBBbGxvY2F0ZSBhIG5ldyBFeHByZXNzaW9uUHJveHkKLQkgKiBAcmV0dXJuIG5ldyBFeHByZXNzaW9uUHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlUeXBlKSB7Ci0JCWlmIChleHByZXNzaW9uUHJveGllcyA9PSBudWxsKQotCQkJZXhwcmVzc2lvblByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhpcyBhbHdheXMgY3JlYXRlcyBhIHByb3h5IGlkIHRoYXQgaXMgZ3JlYXRlciB0aGFuIGFsbCBwcmV2aW91cy4gVGhpcyBpcwotCQkvLyBzbyB0aGF0IGl0IGNhbiBiZSBhc3N1cmVkIHRoYXQgcHJveGllcyB3aWxsIGJlIHJlc29sdmVkIGluIG9yZGVyIG9mIGNyZWF0aW9uLgotCQkvLyBDdXJyZW50bHkgdGhpcyBpcyBkb25lIGhlcmUgYnkgdXNpbmcgZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpLgotCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSBjcmVhdGVFeHByZXNzaW9uUHJveHkocHJveHlUeXBlLCBleHByZXNzaW9uUHJveGllcy5zaXplKCkpOwotCQlleHByZXNzaW9uUHJveGllcy5hZGQocHJveHkpOwotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlRmllbGRBY2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlGaWVsZCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUZpZWxkIGZpZWxkUHJveHksIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlUHJveHkoZmllbGRQcm94eSk7Ci0JCXB1c2hGaWVsZEFjY2Vzcyhmb3JFeHByZXNzaW9uLCBmaWVsZFByb3h5LCBoYXNSZWNlaXZlcik7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZU1ldGhvZEludm9jYXRpb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlNZXRob2QsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5TWV0aG9kIG1ldGhvZFByb3h5LCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKLQkJCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlUHJveHkobWV0aG9kUHJveHkpOwotCQlwdXNoTWV0aG9kSW52b2NhdGlvbihmb3JFeHByZXNzaW9uLCBtZXRob2RQcm94eSwgaGFzUmVjZWl2ZXIsIGFyZ3VtZW50Q291bnQpOwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVTaW1wbGVGaWVsZEFjY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlGaWVsZCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5KQotCSAqLwotCXB1YmxpYyBmaW5hbCBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlRmllbGRBY2Nlc3MoSVByb3h5RmllbGQgZmllbGQsIElQcm94eSByZWNlaXZlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShmaWVsZCk7Ci0JCXZhbGlkYXRlUHJveHkocmVjZWl2ZXIpOwotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBmaWVsZCwgcmVjZWl2ZXIgIT0gbnVsbCk7Ci0JCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsIHJlY2VpdmVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlU2ltcGxlRmllbGRTZXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5RmllbGQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlRmllbGRTZXQoSVByb3h5RmllbGQgZmllbGQsIElQcm94eSByZWNlaXZlciwgSVByb3h5IHZhbHVlLCBib29sZWFuIHdhbnRSZXN1bHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlUHJveHkoZmllbGQpOwotCQl2YWxpZGF0ZVByb3h5KHJlY2VpdmVyKTsKLQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IG51bGw7Ci0JCUZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiA9IEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT047Ci0JCWlmICh3YW50UmVzdWx0KSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJZm9yRXhwcmVzc2lvbiA9IEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVDsJCQkKLQkJfQkJCi0JCWNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQljcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgZmllbGQsIHJlY2VpdmVyICE9IG51bGwpOwotCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkKLQkJCWNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCByZWNlaXZlcik7Ci0JCWNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlbXSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShJUHJveHlNZXRob2QgbWV0aG9kLCBJUHJveHkgcmVjZWl2ZXIsIElQcm94eVtdIGFyZ3VtZW50cywgYm9vbGVhbiB3YW50UmVzdWx0KQotCQkJdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShtZXRob2QpOwotCQl2YWxpZGF0ZVByb3h5KHJlY2VpdmVyKTsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhbGlkYXRlUHJveHkoYXJndW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IG51bGw7Ci0JCWlmICh3YW50UmVzdWx0KSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKG5leHRFeHByZXNzaW9uKTsKLQkJCW5leHRFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUOwotCQl9Ci0JCWNyZWF0ZU1ldGhvZEludm9jYXRpb24obmV4dEV4cHJlc3Npb24sIG1ldGhvZCwgcmVjZWl2ZXIgIT0gbnVsbCwgYXJndW1lbnRzICE9IG51bGwgPyBhcmd1bWVudHMubGVuZ3RoIDogMCk7Ci0JCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCByZWNlaXZlcik7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQljcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsIGFyZ3VtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgc3ViZXhwcmVzc2lvbk51bWJlciA9IC0xOwkvLyBDdXJyZW50IHN1YmV4cHJlc3Npb24gbnVtYmVyLiBUaGlzIGlzIGFsd2F5cyBpbmNyZW1lbnRpbmcuCi0JCi0JcHVibGljIHZvaWQgY3JlYXRlU3ViZXhwcmVzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gU3ViZXhwcmVzc2lvbnMgYXJlIHNwZWNpYWwsIHRoZXkgY2FuIGJlIGFueXdoZXJlLgotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFNVQkVYUFJFU1NJT05FTkRfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQotCQkJcHVzaFN1YmV4cHJlc3Npb25CZWdpblRvUHJveHkoKytzdWJleHByZXNzaW9uTnVtYmVyKTsKLQkJCXB1c2gobmV3IEludGVnZXIoc3ViZXhwcmVzc2lvbk51bWJlcikpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5TVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVTdWJleHByZXNzaW9uRW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlwb3BGb3JFeHByZXNzaW9uKCk7IC8vIFJlbW92ZSB0aGUgcm9vdCBleHByZXNzaW9uIHNpbmNlIGJsb2NrIGlzIGRvbmUuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oU1VCRVhQUkVTU0lPTkVORF9FWFBSRVNTSU9OKTsgLy8gVGhpcyBuZWVkcyB0byBiZSBuZXh0IGZvciBpdCB0byBiZSB2YWxpZC4KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIE5vdyBsZXQgaXQgaGFuZGxlIHRoZSBwcmV2aW91c2x5IHB1c2hlZCBlbmQgc3ViZXhwcmVzc2lvbiwgY29udGFpbmluZyB0aGUgc3ViZXhwcmVzc2lvbiBudW1iZXIgYmVpbmcgZW5kZWQuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkKLQlwcml2YXRlIGludCB0cnlOdW1iZXIgPSAtMTsJLy8gQ3VycmVudCB0cnkgbnVtYmVyLiBUaGlzIGlzIGFsd2F5cyBpbmNyZW1lbnRpbmcuCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHJ5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUcnkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7IC8vIFNldCB1cCBzbyB0aGF0IHdoZW4gcmVhY2hlZCB3ZSBjYW4gcHJvY2VzcyB0aGUgVFJZX0VORCB0aGF0IHdlJ3ZlIHB1c2hlZCBkYXRhIGZvciBsYXRlciBpbiB0aGlzIG1ldGhvZC4KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFRSWUVORF9FWFBSRVNTSU9OKTsgLy8gTXVzdCBnZXQgYSB0cnkgZW5kIGJlZm9yZSB3ZSBjYW4gcHJvY2VzcyBpdC4KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pOyAvLyBNdXN0IGdldCBhIGNhdGNoL2ZpbmFsbHkgY2xhdXNlIChvciB0cnkgZW5kLCB3aGljaCBrbm93cyBob3cgdG8gaGFuZGxlIHRoaXMpLgotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IC8vIEV4cGVjdGluZyByb290IGV4cHJlc3Npb25zIGZvciB0aGUgdHJ5IGNsYXVzZS4KLQotCQkJcHVzaFRyeUJlZ2luVG9Qcm94eSgrK3RyeU51bWJlcik7Ci0JCQlwdXNoKG5ldyBJbnRlZ2VyKHRyeU51bWJlcikpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRU5EX0VYUFJFU1NJT04pOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVRyeUNhdGNoQ2xhdXNlKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCBFeHByZXNzaW9uUHJveHkgY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UoSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgYm9vbGVhbiB3YW50RXhjZXB0aW9uUmV0dXJuZWQpCi0JCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl2YWxpZGF0ZVByb3h5KGV4Y2VwdGlvblR5cGUpOwotCQlyZXR1cm4gcHVzaFRyeUNhdGNoKGV4Y2VwdGlvblR5cGUsIHdhbnRFeGNlcHRpb25SZXR1cm5lZCk7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVRyeUNhdGNoQ2xhdXNlKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVUcnlDYXRjaENsYXVzZShTdHJpbmcgZXhjZXB0aW9uVHlwZSwgYm9vbGVhbiB3YW50RXhjZXB0aW9uUmV0dXJuZWQpCi0JCXRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlyZXR1cm4gcHVzaFRyeUNhdGNoKGdldFByb3h5QmVhblR5cGUoZXhjZXB0aW9uVHlwZSksIHdhbnRFeGNlcHRpb25SZXR1cm5lZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUKLQkgKiBAcGFyYW0gd2FudEV4Y2VwdGlvblJldHVybmVkCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBFeHByZXNzaW9uUHJveHkgcHVzaFRyeUNhdGNoKElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIGJvb2xlYW4gd2FudEV4Y2VwdGlvblJldHVybmVkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgdHJ5IG9yIHByZXZpb3VzIGNhdGNoIGNsYXVzZSBpcyBkb25lLgotCQkJY2hlY2tGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pOyAvLyBUaGlzIG5lZWRzIHRvIGJlIG5leHQgZm9yIGl0IHRvIGJlIHZhbGlkLgotCQkJcHVzaEZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7IC8vIFNldCB1cCBmb3IgYSBmb2xsb3dpbmcgY2F0Y2gvZmluYWxseSBjbGF1c2UuCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgLy8gUm9vdCBleHByZXNzaW9ucyBhcmUgbmV4dCBmb3IgdGhlIGNhdGNoIGNsYXVzZS4KLQotCQkJaW50IHRyeU51bWJlciA9ICgoSW50ZWdlcikgcGVlaygyKSkuaW50VmFsdWUoKTsgLy8gR2V0IHRoZSB0cnkjLiBJdCBzaG91bGQgYmUgaW4gdGhpcyBwbGFjZSBvbiB0aGUgc3RhY2suCi0KLQkJCUV4cHJlc3Npb25Qcm94eSBlcCA9IG51bGw7Ci0JCQlpZiAod2FudEV4Y2VwdGlvblJldHVybmVkKQotCQkJCWVwID0gYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoTk9STUFMX0VYUFJFU1NJT05fUFJPWFkpOwotCQkJcHVzaFRyeUNhdGNoQ2xhdXNlVG9Qcm94eSh0cnlOdW1iZXIsIGV4Y2VwdGlvblR5cGUsIGVwKTsKLQotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJCXJldHVybiBlcDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVRyeUVuZCgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlVHJ5RW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlwb3BGb3JFeHByZXNzaW9uKCk7IC8vIFJlbW92ZSB0aGUgcm9vdCBleHByZXNzaW9uIHNpbmNlIHRyeSBvciBwcmV2aW91cyBjYXRjaCBjbGF1c2UgaXMgZG9uZS4KLQkJCWlmIChwZWVrRm9yRXhwcmVzc2lvbihUUllDQVRDSF9FWFBSRVNTSU9OKSkKLQkJCQljaGVja0ZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7IC8vIFRoaXMgbWF5IG9mIGJlZW4gbmV4dCBpZiBubyBmaW5hbGx5IGNsYXVzZSB3YXMgYWRkZWQuIElmIGEgZmluYWxseSBjbGF1c2Ugd2FzIGFkZGVkIHRoaXMgd291bGQgbm90IGJlIGhlcmUuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oVFJZRU5EX0VYUFJFU1NJT04pOyAvLyBBbmQgdGhpcyBuZWVkcyB0byBiZSBhZnRlciB0aGF0IHRvIGJlIHZhbGlkLgotCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgdHJ5IG9yIHByZXZpb3VzIGNhdGNoIGNsYXVzZSBpcyBkb25lLgotCQkJY2hlY2tGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pOyAvLyBUaGlzIG5lZWRzIHRvIGJlIG5leHQgZm9yIGl0IHRvIGJlIHZhbGlkLgotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IC8vIFJvb3QgZXhwcmVzc2lvbnMgYXJlIG5leHQgZm9yIHRoZSBmaW5hbGx5IGNsYXVzZS4KLQotCQkJaW50IHRyeU51bWJlciA9ICgoSW50ZWdlcikgcGVlaygyKSkuaW50VmFsdWUoKTsgLy8gR2V0IHRoZSB0cnkjLiBJdCBzaG91bGQgYmUgaW4gdGhpcyBwbGFjZSBvbiB0aGUgc3RhY2suCi0KLQkJCXB1c2hUcnlGaW5hbGx5Q2xhdXNlVG9Qcm94eSh0cnlOdW1iZXIpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVSZXRocm93KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVSZXRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlwb3BGb3JFeHByZXNzaW9uKCk7IC8vIFJlbW92ZSB0aGUgcm9vdCBleHByZXNzaW9uIHNpbmNlIHRyeSBvciBwcmV2aW91cyBjYXRjaCBjbGF1c2UgaXMgZG9uZS4KLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihUUllDQVRDSF9FWFBSRVNTSU9OKTsgLy8gVGhpcyBuZWVkcyB0byBiZSBuZXh0IGZvciBpdCB0byBiZSB2YWxpZC4KLQkJCS8vIEl0IGlzIGluIGEgdmFsaWQgc3RhdGUsIHNvIHB1dCB0aGUgY2F0Y2ggYW5kIHJvb3QgYmFjayBvbiBzbyB0aGF0IHRoaW5ncyB3b3JrIGNvcnJlY3RseS4KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IAotCi0JCQlpbnQgdHJ5TnVtYmVyID0gKChJbnRlZ2VyKSBwZWVrKDIpKS5pbnRWYWx1ZSgpOyAvLyBHZXQgdGhlIHRyeSMuIEl0IHNob3VsZCBiZSBpbiB0aGlzIHBsYWNlIG9uIHRoZSBzdGFjay4KLQotCQkJcHVzaFJldGhyb3dUb1Byb3h5KHRyeU51bWJlcik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVRocm93KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5USFJPV19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlRIUk9XX09QRVJBTkQpOyAvLyBUaGUgbmV4dCBleHByZXNzaW9uIG11c3QgYmUgZm9yIHRoZSB0aHJvdyB2YWx1ZS4KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBmaW5hbCBpbnQgbWFyaygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJKytoaWdoZXN0TWFya0lEOwotCQkJY3VycmVudE1hcmtFbnRyeSA9IG5ldyBNYXJrRW50cnkoKTsKLQkJCWN1cnJlbnRNYXJrRW50cnkubWFya0lEID0gaGlnaGVzdE1hcmtJRDsKLQkJCWN1cnJlbnRNYXJrRW50cnkuY29udHJvbFN0YWNrUG9zID0gY29udHJvbFN0YWNrLnNpemUoKSAtIDE7Ci0JCQljdXJyZW50TWFya0VudHJ5Lm5leHRFeHByZXNzaW9uU3RhY2tQb3MgPSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zOwotCQkJY3VycmVudE1hcmtFbnRyeS5leHByZXNzaW9uUHJveGllc1BvcyA9IGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwgPyBleHByZXNzaW9uUHJveGllcy5zaXplKCkgLSAxIDogLTE7Ci0JCQlpZiAobWFya0VudHJpZXMgPT0gbnVsbCkKLQkJCQltYXJrRW50cmllcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCQltYXJrRW50cmllcy5hZGQoY3VycmVudE1hcmtFbnRyeSk7Ci0JCQlwdXNoTWFya1RvUHJveHkoaGlnaGVzdE1hcmtJRCk7Ci0JCQlyZXR1cm4gaGlnaGVzdE1hcmtJRDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbmRNYXJrKGludCBtYXJrTnVtYmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJaWYgKGlzVmFsaWQoKSkgewotCQkJLy8gQ2FuIG9ubHkgZG8gYSB2YWxpZCBlbmQgbWFyayBpZiB3ZSBhcmUgYXQgcm9vdC4gSWYgbm90IGF0IHJvb3QsIHdlIGZhbGwgdGhyb3VnaCBhbmQgdHJlYXQgYXMgaW52YWxpZC4KLQkJCWlmIChwZWVrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKSkgewotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsJLy8gTm93IHJlbW92ZSBpdCBpZiBpdCBzaG91bGQgYmUgcmVtb3ZlZC4gCi0JCQkJLy8gSWYgdGhlIGN1cnJlbnQgbWFyayBudW1iZXIgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBpbmNvbWluZyBtYXJrIG51bWJlciwgd2UgaGF2ZSBpbXByb3BlciBuZXN0aW5nLgotCQkJCWlmIChjdXJyZW50TWFya0VudHJ5ID09IG51bGwgfHwgY3VycmVudE1hcmtFbnRyeS5tYXJrSUQgIT0gbWFya051bWJlcikKLQkJCQkJdGhyb3dJbnZhbGlkTWFya05lc3RpbmcoKTsJLy8gV2UgaGF2ZSBpbXByb3BlciBuZXN0aW5nLgotCQkJCS8vIFdlIGFyZSBwb3BwaW5nIHRoZSBjdXJyZW50IG1hcmsuIFNpbmNlIHdlIGFyZSB2YWxpZCwganVzdCBtb3ZlIHVwIG9uZSBpbiB0aGUgbWFyayBzdGFjay4KLQkJCQlNYXJrRW50cnkgbWUgPSAoTWFya0VudHJ5KSBtYXJrRW50cmllcy5yZW1vdmUobWFya0VudHJpZXMuc2l6ZSgpLTEpOwotCQkJCWlmICghbWFya0VudHJpZXMuaXNFbXB0eSgpKQotCQkJCQljdXJyZW50TWFya0VudHJ5ID0gKE1hcmtFbnRyeSkgbWFya0VudHJpZXMuZ2V0KG1hcmtFbnRyaWVzLnNpemUoKS0xKTsKLQkJCQllbHNlCi0JCQkJCWN1cnJlbnRNYXJrRW50cnkgPSBudWxsOwotCQkJCXB1c2hFbmRtYXJrVG9Qcm94eShtYXJrTnVtYmVyLCBmYWxzZSk7Ci0JCQkJaWYgKG1lLmNvbnRyb2xTdGFja1BvcyAhPSBjb250cm9sU3RhY2suc2l6ZSgpLTEgfHwgbWUubmV4dEV4cHJlc3Npb25TdGFja1BvcyAhPSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zKQotCQkJCQl0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpOwkvLyBUaGUgc3RhY2tzIHNob3VsZCBiZSBiYWNrIHRvIHRoZSBzYW1lIHNpemUgYXQgdGhpcyBwb2ludCBmb3IgYSB2YWxpZCBlbmQgbWFyay4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gCi0JCQotCQkvLyBJdCB3YXMgaW52YWxpZCwgb3IgYmVjYW1lIGludmFsaWQuCi0JCWlmIChtYXJrRW50cmllcyA9PSBudWxsKQotCQkJdGhyb3dJbnZhbGlkTWFya05lc3RpbmcoKTsJLy8gV2UgaGF2ZSBubyBtYXJrcywgc28gdGhpcyBpcyBhbiBpbnZhbGlkIGVuZCBtYXJrLgotCQkKLQkJLy8gV2UgYXJlIGludmFsaWQsIG5lZWQgdG8gcG9wIHRvIHRoZSBnaXZlbiBtYXJrTnVtYmVyLgotCQkvLyBTdGFydGluZyBmcm9tIHRoZSBlbmQgd2Ugc2VhcmNoIGJhY2sgdG8gZmluZCB0aGUgZW50cnkgZm9yIHRoZSBnaXZlbiBtYXJrIG51bWJlci4gV2UgZG8gaXQKLQkJLy8gZnJvbSB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgbW9yZSBsaWtlbHkgdG8gYmUgY2xvc2VyIHRvIHRoZSBlbmQgdGhhbiB0byB0aGUgYmVnaW5uaW5nLgotCQlmb3IgKGludCBpID0gbWFya0VudHJpZXMuc2l6ZSgpLTE7IGkgPj0wOyBpLS0pIHsKLQkJCU1hcmtFbnRyeSBtZSA9IChNYXJrRW50cnkpIG1hcmtFbnRyaWVzLmdldChpKTsKLQkJCWlmIChtZS5tYXJrSUQgPT0gbWFya051bWJlcikgewotCQkJCS8vIEZvdW5kIGl0LgotCQkJCS8vIFRyaW0gdGhlIGNvbnRyb2wgc3RhY2sgZG93biB0byB0aGUgc2l6ZSBhdCB0aW1lIG9mIG1hcmsuIChObyBlYXN5IHdheSB0byBkbyB0aGlzIG90aGVyIHRoYW4gcmVwZWF0ZWQgcmVtb3ZlJ3MuCi0JCQkJLy8gV2UgZG8gaXQgYmFja3dhcmRzIHRvIGVsaW1pbmF0ZSByZXBlYXRlZCBzaHVmZmxpbmcgb2YgZW50cmllcy4KLQkJCQlmb3IgKGludCBqID0gY29udHJvbFN0YWNrLnNpemUoKS0xOyBqID4gbWUuY29udHJvbFN0YWNrUG9zOyBqLS0pIHsKLQkJCQkJY29udHJvbFN0YWNrLnJlbW92ZShqKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gVHJpbSB0aGUgZXhwcmVzc2lvbiBzdGFjay4gVGhpcyBpcyBzaW1wbGUsIGp1c3QgcmVzZXQgdGhlIG5leHQgZW50cnkgcG9pbnRlci4KLQkJCQluZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID0gbWUubmV4dEV4cHJlc3Npb25TdGFja1BvczsKLQkJCQkKLQkJCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCkgewotCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBtYXJrIGFsbCBvZiB0aGUgZXhwcmVzc2lvbiBwcm94aWVzIHRoYXQgb2NjdXJlZCBhZnRlciB0aGUgbWFyayBhcwotCQkJCQkvLyBub3QgcmVzb2x2ZWQgKHNpbmNlIHNvbWVvbmUgbWF5IGJlIGxpc3RlbmluZyksIGFuZCByZW1vdmUgdGhlbSwgYW5kIHJldXNlIHRoZSBwcm94aWVzLgotCQkJCQlmb3IgKGludCBqID0gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpLTE7IGogPiBtZS5leHByZXNzaW9uUHJveGllc1Bvczsgai0tKSB7Ci0JCQkJCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSAoRXhwcmVzc2lvblByb3h5KSBleHByZXNzaW9uUHJveGllcy5yZW1vdmUoaik7Ci0JCQkJCQlpZiAocHJveHkgIT0gbnVsbCAmJiBwcm94eS5oYXNMaXN0ZW5lcnMoKSkKLQkJCQkJCQlmaXJlUHJveHlOb3RSZXNvbHZlZChwcm94eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gTm93IHRoYXQgd2Uga25vdyBpdCBpcyB2YWxpZCwgd2Ugd2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBtYXJrIGVudHJpZXMgYWJvdmUgaXQgaW4gdGhlIHN0YWNrCi0JCQkJLy8gc2luY2UgdGhvc2UgYXJlIG5vdyBpbnZhbGlkLiBXZSBjb3VsZG4ndCByZW1vdmUgdGhlbSBhcyB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IgdGhlIGVudHJ5IGJlY2F1c2UKLQkJCQkvLyBpZiB0aGUgZW50cnkgd2Fzbid0IGZvdW5kIHdlIGRpZG4ndCB3YW50IHRvIHdpcGUgb3V0IHRoZSBwcm9iYWJseSB2YWxpZCBvbmVzLgotCQkJCWZvciAoaW50IGogPSBtYXJrRW50cmllcy5zaXplKCktMTsgaiA+PSBpOyBqLS0pIHsKLQkJCQkJbWFya0VudHJpZXMucmVtb3ZlKGopOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIW1hcmtFbnRyaWVzLmlzRW1wdHkoKSkKLQkJCQkJY3VycmVudE1hcmtFbnRyeSA9IChNYXJrRW50cnkpIG1hcmtFbnRyaWVzLmdldChtYXJrRW50cmllcy5zaXplKCktMSk7Ci0JCQkJZWxzZQotCQkJCQljdXJyZW50TWFya0VudHJ5ID0gbnVsbDsJCQkJCQotCQkJCXB1c2hFbmRtYXJrVG9Qcm94eShtYXJrTnVtYmVyLCB0cnVlKTsKLQkJCQlleHByZXNzaW9uVmFsaWQgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0gCi0JCX0KLQkJdGhyb3dJbnZhbGlkTWFya05lc3RpbmcoKTsJLy8gVGhlIG1hcmsgbnVtYmVyIHdhc24ndCBmb3VuZCwgc28gdGhpcyBpcyBhbiBpbnZhbGlkIGVuZCBtYXJrLgotCX0KLQkKLQkvKioKLQkgKiBCZWdpbiB0aGUgdHJhbnNmZXIgb2YgdGhlIGV4cHJlc3Npb24gdG8gYW5vdGhlciB0aHJlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGV4cHJlc3Npb24gbmVlZHMgdG8gY29udGludWUgdG8gYmUgYnVpbHQgdXAsIGJ1dCBpdCBuZWVkcwotCSAqIHRvIGJlIGRvbmUgb24gYSBkaWZmZXJlbnQgdGhyZWFkLiBUaGUgcmVhc29uIGZvciBkb2luZyBzb21ldGhpbmcgc3BlY2lhbCBvdGhlcgotCSAqIHRoYW4ganVzdCB1c2luZyBpdCBvbiB0aGUgb3RoZXIgdGhyZWFkIGlzIHRoYXQgc29tZSBwcm94eSByZWdpc3RyaWVzIGNvbm5lY3Rpb25zIGFyZQotCSAqIHRpZWQgdGhyb3VnaCB0aGUgdGhyZWFkLiBJZiB5b3Ugc3dpdGNoZWQgdG8gYW5vdGhlciB0aHJlYWQgdGhlIGNvbm5lY3Rpb25zIHdvdWxkIG5vdAotCSAqIGJlIHByb3Blcmx5IHNldCB1cC4KLQkgKiBUaGlzIGlzIG5vdCBvbiB0aGUgSUV4cHJlc3Npb24gaW50ZXJmYWNlIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaXMgQVBJLCBpdCBpcyB0cmlja3kKLQkgKiB0byB1c2UgYW5kIHNvIG5vdCBleHBvc2VkIHRvIGV2ZXJ5b25lLiBVc2VycyBjYW4gbGVnaXRpbWF0ZWx5IGNhc3QgdG8gRXhwcmVzc2lvbiBhbmQgCi0JICogdXNlIHRoaXMgYXMgQVBJIGZvciBhZHZhbmNlZCB1c2UuIAotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCB0byBiZWdpbiB0aGUgdHJhbnNmZXIuIEl0IHB1dHMgaXQgaW50byBhIHN0YXRlIHJlYWR5IGZvciB0aGUgdHJhbnNmZXIuIENhbGxpbmcgdGhpcwotCSAqIG1ldGhvZCB3aWxsIGNhdXNlIGEgc3luY2hyb25pemF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBjdXJyZW50IGxldmVsLiBUaGlzIG1lYW5zCi0JICogdGhhdCBpdCB3aWxsIG5vdCByZXR1cm4gdW50aWwgdGhlIGV4cHJlc3Npb24gaGFzIGJlZW4gY29tcGxldGVseSBwcm9jZXNzZWQgaW4gdGhlIHByb3h5IHJlZ2lzdHJ5Ci0JICogdXAgdG8gdGhpcyBwb2ludC4gVHlwaWNhbGx5IHRoZSBjb25uZWN0aW9uIGlzIGEgcGlwZSB3aGVyZSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBqdXN0IHB1c2hlZCBvbnRvCi0JICogaXQgYW5kIHRoZSBjYWxsZXIgaXMgbm90IGhlbGQgdXAgd2FpdGluZyBmb3IgdGhlIHJlZ2lzdHJ5IHRvIHByb2Nlc3MgaXQuIAotCSAqIDxwPgotCSAqIFRoZW4gd2hlbiB0aGUgb3RoZXIgdGhyZWFkIGlzIGRvbmUsIGl0IHdpbGwgY2FsbCBiZWdpblRyYW5zZmVyVGhyZWFkIGl0c2VsZiB0byBzaWduYWwgdGhhdCBpdCBpcyBkb25lCi0JICogYW5kIHRoYXQgdGhlIG9sZCB0aHJlYWQgY2FuIHBpY2sgaXQgdXAuIFRoZW4gdGhlIG9sZCB0aHJlYWQgd2lsbCBjYWxsIHRyYW5zZmVyVGhyZWFkIHRvIHBpY2sgdXAgcHJvY2Vzc2luZy4KLQkgKiA8cD4KLQkgKiBJdCB3aWxsIGJlOgotCSAqIDxwcmU+PGNvZGU+Ci0JICogICAuLi4gZXhwcmVzc2lvbiBzdHVmZiAuLi4KLQkgKiAgIGV4cHJlc3Npb24uYmVnaW5UcmFuc2ZlclRocmVhZCgpCi0JICogICAuLi4gZG8gd2hhdCBpcyBuZWNlc3NhcnkgdG8gZ2V0IHRvIHRoZSBvdGhlciB0aHJlYWQgLi4uCi0JICogICAuLi4gb24gb3RoZXIgdGhyZWFkOgotCSAqICAgZXhwcmVzc2lvbi50cmFuc2ZlclRocmVhZCgpOwotCSAqICAgdHJ5IHsKLQkgKiAgICAgLi4uIGRvIHlvdXIgZXhwcmVzc2lvbiBzdHVmZiBvbiB0aGlzIHRocmVhZCAuLi4KLQkgKiAgIH0gZmluYWxseSB7Ci0JICogICAgIGV4cHJlc3Npb24uYmVnaW5UcmFuc2ZlclRocmVhZCgpOyAvLyBUaGlzIGlzIHRvIHJldHVybiBpdCB0byBvbGQgdGhyZWFkLgotCSAqICAgfQotCSAqICAgLi4uIHRlbGwgb2xkIHRocmVhZCB0byBwaWNrIHVwIC4uLgotCSAqICAgLi4uIGJhY2sgb24gb2xkIHRocmVhZDoKLQkgKiAgIGV4cHJlc3Npb24udHJhbnNmZXJUaHJlYWQoKTsKLQkgKiAgIC4uLiBkbyBtb3JlIGV4cHJlc3Npb24gc3R1ZmYgLi4uCi0JICogICBleHByZXNzaW9uLmludm9rZUV4cHJlc3Npb24oKTsKLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5IFRocm93biBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHJlbW90ZSB2bSBkdXJpbmcgdGhpcyByZXF1ZXN0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luVHJhbnNmZXJUaHJlYWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSB7Ci0JCXRyeSB7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihUSFJFQURUUkFOU0ZFUl9FWFBSRVNTSU9OKTsKLQkJCXB1c2hCZWdpblRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBUcmFuc2ZlciB0aGUgZXhwcmVzc2lvbiB0byB0aGUgY3VycmVudCB0aHJlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBjYWxsZWQgdG8gYWN0dWFsbHkgdHJhbnNmZXIgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLiBJdCBtdXN0IGJlIHRoZSBuZXh0IGNhbGwgYWdhaW5zdAotCSAqIHRoZSBleHByZXNzaW9uIGFmdGVyIHRoZSBiZWdpblRyYW5zZmVyVGhyZWFkLCBidXQgb24gdGhlIG5ldyB0aHJlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3Qgb24gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGV2ZW4gdGhvdWdoIGl0IGlzIEFQSSwgaXQgaXMgdHJpY2t5Ci0JICogdG8gdXNlIGFuZCBzbyBub3QgZXhwb3NlZCB0byBldmVyeW9uZS4gVXNlcnMgY2FuIGxlZ2l0aW1hdGVseSBjYXN0IHRvIEV4cHJlc3Npb24gYW5kIAotCSAqIHVzZSB0aGlzIGFzIEFQSSBmb3IgYWR2YW5jZWQgdXNlLiAKLQkgKiBAc2VlIEV4cHJlc3Npb24jYmVnaW5UcmFuc2ZlclRocmVhZCgpIGZvciBhIGZ1bGwgZXhwbGFuYXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0cmFuc2ZlclRocmVhZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKFRIUkVBRFRSQU5TRkVSX0VYUFJFU1NJT04pOwotCQkJcHVzaFRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlCZWFuVHlwZSBmb3IgdGhlIHR5cGUgc3RyaW5nIHNlbnQgaW4uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElQcm94eUJlYW5UeXBlIGdldFByb3h5QmVhblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KHRoaXMsIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gcHJveHkgc3ViY2xhc3MgdGhhdCBpcyBhcHBsaWNhYmxlIGZvciB0aGlzIGtpbmQgb2YgcHJvY2Vzc29yLiAKLQkgKiBAcGFyYW0gcHJveHlUeXBlIHR5cGUgb2YgcHJveHkuIHtAbGluayBFeHByZXNzaW9uI05PUk1BTF9FWFBSRVNTSU9OX1BST1hZCi0JICogQHBhcmFtIHByb3h5SUQgdGhlIGlkIG9mIHRoZSBuZXcgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEV4cHJlc3Npb25Qcm94eSBjcmVhdGVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5VHlwZSwgaW50IHByb3h5SUQpOwotCQotCS8qKgotCSAqIFB1c2ggdGhpcyBwcm94eSB0byB0aGUgb3RoZXIgc2lkZS4gSXQgd2lsbCBzaW1wbHkgdGFrZSB0aGUgcHJveHkgYW5kIHB1c2ggaXQgb250bwotCSAqIGl0cyBldmFsdWF0aW9uIHN0YWNrLiBJdCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLiBJdCdzIGp1c3QgCi0JICogdGhhdCB0aGUgZXhwcmVzc2lvbiB3YXMgZXZhbHVhdGFibGUgb24gdGhpcyBzaWRlIChzaW5jZSBpdCBpcyBhbHJlYWR5IGEgcHJveHkpLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hUb1Byb3h5KElQcm94eSBwcm94eSk7Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBvdGhlciBzaWRlIHdlIGFyZSBjb21wbGV0ZS4gVGhpcyB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uLCBvcgotCSAqIGlmIGV4cHJlc3Npb24gd2FzIHByZW1hdHVyZWx5IGNsb3NlZC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhlIGltcGxlbWVudGF0aW9uIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgbXVsdGlwbGUgaW52b2NhdGlvbnMsIHdoZXJlIHRoZSBmaXJzdCBjYWxsIGlzIGEgdmFsaWQgY2xvc2UgYW5kIGFueQotCSAqIHN1YnNlcXVlbnQgY2FsbCBzaG91bGQgYmUgaWdub3JlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xvc2VQcm94eSgpOwotCQotCS8qKgotCSAqIERvIGludm9rZS4gVGhpcyBzaG91bGQgc2ltcGx5IG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGRvbmUgYW5kIHRocm93IGFueSBwZW5kaW5nIGVycm9ycy4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhlIGV4cHJlc3Npb24gcHJveGllcyBNVVNUIGJlIHJlc29sdmVkIChjYWxsYmFja3MgY2FsbGVkKSBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmQgaW4gdGhlIGV4cHJlc3Npb25Qcm94aWVzIGxpc3QuIFRoaXMKLQkgKiBpcyBzbyB0aGF0IHRoZSBjb250cmFjdCBpcyBmb2xsb3dlZCB0aGF0IHJlc29sdXRpb24gbm90aWZpY2F0aW9ucyB3aWxsIG9jY3VyIGluIHRoZSBvcmRlciBvZiBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHljb3VudCBOdW1iZXIgb2YgRXhwcmVzc2lvbiBQcm94aWVzIHRoYXQgbmVlZCBhIGNhbGxiYWNrLgotCSAqIEBwYXJhbSBsaXN0IG9mIGV4cHJlc3Npb24gcHJveGllcy4gSWYgcHJveHljb3VudCA+IDAsIHRoZW4gcHJvY2VzcyB0aGUgbm9uLW51bGwgZW50cmllcyBpbiB0aGUgbGlzdC4gVGhleSB3aWxsIGJlIG9mIHR5cGUgRXhwcmVzc2lvblByb3h5LgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoSW52b2tlKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFB1bGwgdGhlIHRvcCBleHByZXNzaW9uIHZhbHVlIGZyb20gdGhlIGV2YWx1YXRpb24gc3RhY2suIEl0IHdpbGwgYWxzbyB1bmRlcgotCSAqIHRoZSBjb3ZlcnMgY2FsbCBjbG9zZVByb3h5LiAgSXQgYWxzbyBtdXN0IHByb2Nlc3MgdGhlIGV4cHJlc3Npb24gcHJveHkgY2FsbGJhY2tzLiBJdCBtdXN0IGRvIHRoZSBleHByZXNzaW9uIHByb3h5IGNhbGxiYWNrcyBmaXJzdCwgYW5kIHRoZW4KLQkgKiBwcm9jZXNzIHRoZSByZXN1bHQgdmFsdWUuIElmIGFuIGVycm9yIGhhZCBvY2N1cmVkIHNvbWV0aW1lIGR1cmluZyBwcm9jZXNzaW5nLCBpdCBzaG91bGQgc3RpbGwgcHJvY2VzcyB0aGUgcHJveHkgY2FsbGJhY2tzIGJlZm9yZSB0aHJvd2luZwotCSAqIGFuIGV4Y2VwdGlvbi4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhlIGV4cHJlc3Npb24gcHJveGllcyBNVVNUIGJlIHJlc29sdmVkIChjYWxsYmFja3MgY2FsbGVkKSBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmQgaW4gdGhlIGV4cHJlc3Npb25Qcm94aWVzIGxpc3QuIFRoaXMKLQkgKiBpcyBzbyB0aGF0IHRoZSBjb250cmFjdCBpcyBmb2xsb3dlZCB0aGF0IHJlc29sdXRpb24gbm90aWZpY2F0aW9ucyB3aWxsIG9jY3VyIGluIHRoZSBvcmRlciBvZiBjcmVhdGlvbi4gQWxzbyA8Yj5SRVFVSVJFRDwvYj4gaXMgdGhhdAotCSAqIHRoZSBlbnRpcmUgbGlzdCBtdXN0IGJlIHByb2Nlc3NlZCBvZiBwcm94aWVzIG11c3QgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgY2FsbC4gSXQgY2Fubm90IGRvIHNvbWUgb3Igbm9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHljb3VudCBOdW1iZXIgb2YgRXhwcmVzc2lvbiBQcm94aWVzIHRoYXQgbmVlZCBhIGNhbGxiYWNrLgotCSAqIEBwYXJhbSBsaXN0IG9mIGV4cHJlc3Npb24gcHJveGllcy4gSWYgcHJveHljb3VudCA+IDAsIHRoZW4gcHJvY2VzcyB0aGUgbm9uLW51bGwgZW50cmllcyBpbiB0aGUgbGlzdC4gVGhleSB3aWxsIGJlIG9mIHR5cGUgRXhwcmVzc2lvblByb3h5LgotCSAqIEByZXR1cm4gVGhlIHRvcCBsZXZlbCBldmFsdWF0aW9uIHN0YWNrIHZhbHVlLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElCZWFuUHJveHkgcHVsbFByb3h5VmFsdWUoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCB0byBwcm94eSB0aGUgY2FzdCBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiB0byB1c2Ugd2lsbCBiZSBvbiB0aGUgdG9wIG9mIGl0cyBldmFsdWF0aW9uIHN0YWNrLgotCSAqIFRoZSByZXN1bHQgb2YgdGhlIGNhc3QgZXhwcmVzc2lvbiB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqICAKLQkgKiBAcGFyYW0gdHlwZSBDYXN0IHR5cGUuIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hDYXN0VG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gdG8gdXNlIHdpbGwgYmUgb24gdGhlIHRvcCBvZiBpdHMgZXZhbHVhdGlvbiBzdGFjay4KLQkgKiBUaGUgcmVzdWx0IG9mIHRoZSBpbnN0YW5jZW9mIGV4cHJlc3Npb24gd2lsbCBiZSBwbGFjZWQgb250byB0aGUgZXZhbHVhdGlvbiBzdGFjay4KLQkgKiAgCi0JICogQHBhcmFtIHR5cGUgSW5zdGFuY2VvZiB0eXBlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hJbnN0YW5jZW9mVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBpbmZpeCBvcGVyYXRpb24uIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBjb21wbGV0aW9uIG9mIGVhY2ggb3BlcmFuZCBvZiB0aGUgZXhwcmVzc2lvbi4KLQkgKiBTbyBpdCB3aWxsIGJlIGNhbGxlZCBhIG1pbmltdW0gb2YgdHdvIHRpbWVzLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3IuCi0JICogQHBhcmFtIG9wZXJhbmRUeXBlIFRoZSBvcGVyYW5kIHR5cGUuIGxlZnQsIG90aGVyLCBvciBsYXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hJbmZpeFRvUHJveHkoSW5maXhPcGVyYXRvciBvcGVyYXRvciwgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIG9wZXJhbmRUeXBlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBwcmVmaXggZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gdG8gdXNlIHdpbGwgYmUgb24gdG9wIG9mIGl0cyBldmFsdWF0aW9uIHN0YWNrLgotCSAqIFRoZSByZXN1bHQgb2YgdGhlIHByZWZpeCBvcGVyYXRpb24gd2lsbCBiZSBwbGFjZWQgb250byB0aGUgZXZhbHVhdGlvbiBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0b3IgCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbkNvbnN0YW50cyNQUkVfTUlOVVMKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoUHJlZml4VG9Qcm94eShQcmVmaXhPcGVyYXRvciBvcGVyYXRvcik7CQotCi0JCi0JLyoqCi0JICogUHVzaCB0byBwcm94eSB0aGUgYXJyYXkgYWNjZXNzLiBUaGUgcmVzdWx0IHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Q291bnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KGludCBpbmRleENvdW50KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBhcnJheSBjcmVhdGlvbi4gVGhlIHJlc3VsdCB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIEBwYXJhbSB0eXBlIFRoZSBhcnJheSB0eXBlLiAKLQkgKiBAcGFyYW0gZGltZW5zaW9uQ291bnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGRpbWVuc2lvbkNvdW50KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBhcnJheSBpbml0aWFsaXplci4gVGhlIHJlc3VsdGluZyBhcnJheSB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIEBwYXJhbSB0eXBlIFRoZSBhcnJheSB0eXBlLiAobXVzdCBiZSBhbiBhcnJheSB0eXBlKS4KLQkgKiBAcGFyYW0gc3RyaXBEaW1Db3VudCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhhdCBtdXN0IGJlIHN0cmlwcGVkIGZyb20gdGhlIGFycmF5IHR5cGUuIFRoaXMgaXMgbmVlZGVkCi0JICogYmVjYXVzZSB0aGUgZmlyc3QgYXJyYXkgaW5pdGlhbGl6ZXIgbmVlZHMgdG8gYmUgZm9yIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgYXJyYXkgKGFycmF5IG1pbnVzIG9uZSBkaW1lbnNpb24pLCBhbmQKLQkgKiBlYWNoIGluaXRpYWxpemVyIGFmdGVyIHRoYXQgbmVlZHMgb25lIG1vcmUgZGltZW5zaW9uIHN0cmlwcGVkIG9mZi4gQnV0IHNpbmNlIHdlIGFyZSB3b3JraW5nIHdpdGggcG9zc2libGUgZXhwcmVzc2lvbgotCSAqIHByb3hpZXMgZm9yICJ0eXBlIiwgd2UgY2FuJ3QgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQgdHlwZXMgb2YgdGhlIGFycmF5LiBTbyB3ZSBuZWVkIHRvIHRlbGwgdGhlCi0JICogcHJvY2Vzc29yIGhvdyBtYW55IGRpbXMgdG8gc3RyaXAgZnJvbSB0aGUgb3JpZ2luYWwgdHlwZSAod2hpY2ggaXMgd2hhdCBpcyBzZW50IGluIG9uIGV2ZXJ5IGluaXRpYWxpemVyIHB1c2gsIHRoZSBvcmlnaW5hbCB0eXBlKS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbkNvdW50Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEFycmF5SW5pdGlhbGl6ZXJUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBzdHJpcERpbUNvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbi4gVGhlIHJlc3VsdGluZyBjbGFzcyBpbnN0YW5jZSB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIENsYXNzIHR5cGUuIAotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50IFRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSB0eXBlIHJlY2VpdmVyLiBUaGUgcmVzdWx0aW5nIGNsYXNzIHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2ssIGFsb25nIHdpdGggaXQgYWxzbwotCSAqIGJlaW5nIHRoZSBleHByZXNzaW9uIHR5cGUuCi0JICogQHBhcmFtIHR5cGUgQ2xhc3MgdHlwZS4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFR5cGVSZWNlaXZlclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBmaWVsZCBhY2Nlc3MuIFRoZSByZXN1bHQgdmFsdWUgd2lsbCBiZSBwbGFjZWQgb250byB0aGUgZXZhbHVhdGlvbiBzdGFjay4KLQkgKiBAcGFyYW0gZmllbGQgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGlmIHN0cmluZywgb3IgYW4gSUZpZWxkUHJveHkuCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIEhhcyByZWNlaXZlciBmbGFnLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hGaWVsZEFjY2Vzc1RvUHJveHkoT2JqZWN0IGZpZWxkLCBib29sZWFuIGhhc1JlY2VpdmVyKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBtZXRob2QgaW52b2NhdGlvbi4gVGhlIHJlc3VsdCB2YWx1ZSB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2QgU3RyaW5nIGZvciBtZXRob2QgbmFtZSBvciBJUHJveHlNZXRob2QKLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIKLQkgKiBAcGFyYW0gYXJnQ291bnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvblRvUHJveHkoT2JqZWN0IG1ldGhvZCwgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ0NvdW50KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggcGFydCBvZiBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiB0eXBlCi0JICogd2lsbCBiZSB0aGUgY3VycmVudCBwYXJ0IChlLmcuIHRlc3QsIHRydWUsIGZhbHNlKS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblR5cGUgVGhlIGV4cHJlc3Npb24gdHlwZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQ29uZGl0aW9uYWxUb1Byb3h5KEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHByZXNzaW9uVHlwZSk7Ci0JCi0JLyoqCi0JICogUHVzaCB0byB0aGUgcHJveHkgdGhlIGV4cHJlc3Npb24gcHJveHkuIFdoYXRldmVyIHRoZSBsYXN0IGV4cHJlc3Npb24gdmFsdWUgaXMgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgRXhwcmVzc2lvblByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHkpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi4gVGhlIG9wZXJhbmRzIGFyZSBhbHJlYWR5IG9uIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQXNzaWdubWVudFRvUHJveHkoKTsKLQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGJlZ2luIGJsb2NrIGV4cHJlc3Npb24uIAotCSAqIEBwYXJhbSBibG9ja051bWJlciAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQmxvY2tCZWdpblRvUHJveHkoaW50IGJsb2NrTnVtYmVyKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBlbmQgYmxvY2sgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gYmxvY2tOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQmxvY2tFbmRUb1Byb3h5KGludCBibG9ja051bWJlcik7Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBicmVhayBibG9jayBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGludCBibG9ja051bWJlcik7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgYmVnaW4gdHJ5IGV4cHJlc3Npb24uIAotCSAqIEBwYXJhbSB0cnlOdW1iZXIgCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFRyeUJlZ2luVG9Qcm94eShpbnQgdHJ5TnVtYmVyKTsKLQotCS8qKgotCSAqIFB1c2ggdGhlIGNhdGNoIGNsYXVzZSB0byBwcm94eS4KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgCi0JICogQHBhcmFtIGVwIEV4cHJlc3Npb25Qcm94eSB0byBiZSBhc3NpZ25lZCB3aXRoIHRoZSBleGNlcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXhjZXB0aW9uIGlzIG5vdCB0byBiZSBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIsIElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIEV4cHJlc3Npb25Qcm94eSBlcCk7Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBmaW5hbGx5IGNsYXVzZSB0byBwcm94eS4KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIpOwotCi0JLyoqCi0JICogUHVzaCB0cnkgZW5kIHRvIHByb3h5LgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHJ5RW5kVG9Qcm94eShpbnQgdHJ5TnVtYmVyKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSB0aHJvdyBvZiB0aGUgZXhjZXB0aW9uIHRvIHByb3h5LgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVGhyb3dUb1Byb3h5KCk7Ci0JCi0JLyoqCi0JICogUHVzaCBhIHJldGhyb3cgdG8gcHJveHkuCi0JICogQHBhcmFtIHRyeU51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hSZXRocm93VG9Qcm94eShpbnQgdHJ5TnVtYmVyKTsKLQotCS8qKgotCSAqIFB1c2ggdGhlIEJlYW5UeXBlIEV4cHJlc3Npb24gcHJveHkgdG8gYmUgcmVzb2x2ZWQgb24gdGhlIGV4ZWN1dGlvbiBzaWRlLgotCSAqIEBwYXJhbSBwcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hCZWFuVHlwZVRvUHJveHkoSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHByb3h5KTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBNZXRob2QgRXhwcmVzc2lvbiBwcm94eSB0byBiZSByZXNvbHZlZCBvbiB0aGUgZXhlY3V0aW9uIHNpZGUuCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBwYXJhbWV0ZXIgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoTWV0aG9kVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIFB1c2ggdGhlIEZpZWxkIEV4cHJlc3Npb24gUHJveHkgdG8gYmUgcmVzb2x2ZWQgb24gdGhlIGV4ZWN1dGlvbiBzaWRlLgotCSAqIEBwYXJhbSBwcm94eQotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIGZpZWxkTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hGaWVsZFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5LCBJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgZmllbGROYW1lKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBJZiB0ZXN0IGNvbmRpdGlvbiB0byBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoSWZUZXN0VG9Qcm94eSgpOwotCQotCS8qKgotCSAqIFB1c2ggYSB0cnVlIG9yIGVsc2UgY2xhdXNlIHRvIHByb3h5LgotCSAqIEBwYXJhbSBjbGF1c2VUeXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaElmRWxzZVRvUHJveHkoSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBjbGF1c2VUeXBlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IGEgbmV3IGluc3RhbmNlIHVzaW5nIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZy4KLQkgKiBAcGFyYW0gaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkgKiBAcGFyYW0gcmVzdWx0VHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hOZXdJbnN0YW5jZVRvUHJveHkoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBJUHJveHlCZWFuVHlwZSByZXN1bHRUeXBlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBtYXJrIGlkIHRvIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBtYXJrSUQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoTWFya1RvUHJveHkoaW50IG1hcmtJRCk7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgZW5kIG1hcmsgaWQgdG8gcHJveHkuCi0JICogCi0JICogQHBhcmFtIG1hcmtJRAotCSAqIEBwYXJhbSByZXN0b3JlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSByZXN0b3JlIGR1ZSB0byBlcnJvciwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMganVzdCBhIG5vcm1hbCBlbmQgbWFyay4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoRW5kbWFya1RvUHJveHkoaW50IG1hcmtJRCwgYm9vbGVhbiByZXN0b3JlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBiZWdpbiB0cmFuc2ZlciB0aHJlYWQgdG8gcHJveHkuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEJlZ2luVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCQotCS8qKgotCSAqIFB1c2ggdGhlIGFjdHVhbCB0cmFuc2ZlciB0byB0aGUgY3VycmVudCB0aHJlYWQgdG8gcHJveHkuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIHN1YmV4cHJlc3Npb24gYmVnaW4gdG8gcHJveHkuCi0JICogQHBhcmFtIHN1YmV4cHJlc3Npb25OdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkJlZ2luVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcik7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgc3ViZXhwcmVzc2lvbiBlbmQgdG8gcHJveHkuCi0JICogQHBhcmFtIHN1YmV4cHJlc3Npb25OdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkVuZFRvUHJveHkoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRXhwcmVzc2lvblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMmZhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGEgcHJveHkgZm9yIGFuIElFeHByZXNzaW9uIGV2YWx1YXRpb24gdmFsdWUuIEl0IGlzIHVzZWQgYXMgYSBwbGFjZSBob2xkZXIgcHJveHkgdmFsdWUgZm9yIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLCBhbmQKLSAqIHRoZW4gdGhlIHZhbHVlIGNhbiBiZSB1c2VkIGluIGEgbGF0ZXIgZXhwcmVzc2lvbiwgb3IgYXQgdGhlIGVuZCwgaXQgY2FuIGNhbGxiYWNrIGFuZCByZXR1cm4gYSBwcm94eSBpbiB0aGUgSURFIAotICogc2lkZSBpbiBhIGNhbGxiYWNrIGZvciB1c2FnZSBsYXRlciBvbiBvdXRzaWRlIG9mIHRoZSBJRXhwcmVzc2lvbi4KLSAqIDxwPgotICogQWZ0ZXIgcmVjZWl2aW5nIHRoZSByZXNvbHZlZCBldmVudCwgbGlzdGVuZXJzIHNob3VsZCBub3QgaG9sZCBvbnRvIHRoZSBFeHByZXNzaW9uUHJveHkgYmVjYXVzZSBpdCB3b3VsZCB0aGVuIGJlIGludmFsaWQuIEF0IHRoYXQKLSAqIHBvaW50IHRoZXkgc2hvdWxkIGluc3RlYWQgaG9sZCBvbnRvIHRoZSByZXNvbHZlZCBiZWFuIHByb3h5LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2Fzc2lnbkV4cHJlc3Npb25Qcm94eSgpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUV4cHJlc3Npb25Qcm94eUV4cHJlc3Npb24oaW50LCBFeHByZXNzaW9uUHJveHkpCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElQcm94eSB7Ci0KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBnZXRFeHByZXNzaW9uKCkuZ2V0UmVnaXN0cnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGV2ZW50IG9iamVjdCBmb3IgdGhlIHJlc29sdmVkIGV2ZW50IG9mIHRoZSBwcm94eSBsaXN0ZW5lci4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlIHdpbGwgYmUgdGhlIEV4cHJlc3Npb25Qcm94eSB0aGF0IGlzIGJlaW5nIHJlc29sdmVkLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJveHlFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjMwNTc4MTY2MjQ2NTEwNzM3N0w7Ci0JCXByaXZhdGUgZmluYWwgSUJlYW5Qcm94eSBwcm94eTsKLQotCQkvKioKLQkJICogQHBhcmFtIHNvdXJjZSB0aGUgZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGV2ZW50LgotCQkgKiBAcGFyYW0gcHJveHkgdGhlIGJlYW4gcHJveHkgdGhlIGV4cHJlc3Npb24gcHJveHkgKHNvdXJjZSkgcmVzb2x2ZWQgdG8uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBQcm94eUV2ZW50KEV4cHJlc3Npb25Qcm94eSBzb3VyY2UsIElCZWFuUHJveHkgcHJveHkpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3QgdGhlIGV2ZW50IHdpdGggbm8gcHJveHkuIFVzZWQgZm9yIG5vdCByZXNvbHZlZCBhbmQgdm9pZC4KLQkJICogQHBhcmFtIHNvdXJjZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgUHJveHlFdmVudChFeHByZXNzaW9uUHJveHkgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHByb3h5IHZhbHVlIHRoYXQgdGhlIGV4cHJlc3Npb24gcHJveHkgKHNvdXJjZSkgcmVzb2x2ZWQgdG8uCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIElCZWFuUHJveHkgZ2V0UHJveHkoKSB7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTGlzdGVuZXIgZm9yIGV4cHJlc3Npb24gcHJveHkgZXZlbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUHJveHlMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBUaGUgZXhwcmVzc2lvbiBwcm94eSBoYXMgYmVlbiByZXNvbHZlZC4gVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSByZXNvbHZlZCBwcm94eS4KLQkJICogQXQgdGhpcyBwb2ludCwgYW55IGxpc3RlbmVycyBzaG91bGQgbm8gbG9uZ2VyIGhvbGQgb250byB0aGUgRXhwcmVzc2lvblByb3h5Ci0JCSAqIGJlY2F1c2UgaXQgaXMgbm93IGludmFsaWQuIFRoZXkgc2hvdWxkIGhvbGQgb250byB0aGUgcmVzb2x2ZWQgYmVhbiBwcm94eSBpbnN0ZWFkLgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCk7Ci0JCQotCQkvKioKLQkJICogVGhpcyBpcyBjYWxsZWQgZm9yIEV4cHJlc3Npb25Qcm94aWVzIHRoYXQgaGF2ZSBhIGNhbGxiYWNrIGxpc3RlbmVyLCBidXQgdGhlIHByb3h5IAotCQkgKiB3YXMgbmV2ZXIgcmVzb2x2ZWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiB0aGF0IGFzc2lnbnMgdG8gdGhlIHByb3h5IHdhcwotCQkgKiBub3QgZXhlY3V0ZWQuIEluIHRoaXMgY2FzZSB0aGUgZXZlbnQgZG9lcyBub3QgaGF2ZSBhIGJlYW4gcHJveHkgaW4gaXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KTsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgRXhwcmVzc2lvblByb3hpZXMgdGhhdCB3ZXJlIGFzc2lnbmVkIHRvIGFuIGV4cHJlc3Npb24gdGhhdAotCQkgKiBoYWQgYSA8Y29kZT5WT0lEPC9jb2RlPiByZXR1cm4gdHlwZS4gVGhpcyBpcyB1c3VhbGx5IGZvciBtZXRob2QgaW52b2NhdGlvbnMgdGhhdAotCQkgKiBoYXZlIGEgdm9pZCByZXR1cm4gdHlwZS4gSW4gdGhpcyBjYXNlIHRoZSBldmVudCBkb2VzIG5vdCBoYXZlIGEgYmVhbiBwcm94eSBpbiBpdC4KLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQW4gaW1wbGVtZW50YXRpb24gb2YgUHJveHlMaXN0ZW5lciB0aGF0IGRvZXMgbm90aGluZy4gSXQgY2FuIGJlCi0JICogdXNlZCBhcyBhIHN1cGVyY2xhc3MgZm9yIGluZGl2aWR1YWwgbGlzdGVuZXJzIHRoYXQgYXJlIG9ubHkgaW50ZXJlc3RlZAotCSAqIGluIHNvbWUgb2YgdGhlIGV2ZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3h5QWRhcHRlciBpbXBsZW1lbnRzIFByb3h5TGlzdGVuZXIgewotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Tm90UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9Ci0JCi0JZmluYWwgcHJpdmF0ZSBpbnQgcHJveHlJRDsKLQlmaW5hbCBwcml2YXRlIGludCBwcm94eVR5cGU7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCXByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIHRoZSBnaXZlbiBwcm94eSBpZC4KLQkgKiBAcGFyYW0gcHJveHlpZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIGludCBwcm94eVR5cGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQl0aGlzLnByb3h5SUQgPSBwcm94eWlkOwotCQl0aGlzLnByb3h5VHlwZSA9IHByb3h5VHlwZTsKLQkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBleHByZXNzaW9uIHRoaXMgcHJveHkgaXMgZm9yLiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBpbiBleHByZXNzaW9uIHRvIGdldCB0aGUgcHJveHkgdHlwZS4gCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0UHJveHlUeXBlKCkgewotCQlyZXR1cm4gcHJveHlUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3h5IGlkLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldFByb3h5SUQoKSB7Ci0JCXJldHVybiBwcm94eUlEOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lci4gSWYgbGlzdGVuZXIgYWxyZWFkeSBhZGRlZCwgaXQgaGFzIG5vIGVmZmVjdC4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm94eUxpc3RlbmVyKFByb3h5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBudWxsKQotCQkJbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIuIElmIGxpc3RlbmVyIG5vdCBhbHJlYWR5IGFkZGVkLCB0aGVuIG5vIGVycm9yLgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3h5TGlzdGVuZXIoUHJveHlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJMaXN0ICE9IG51bGwpCi0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBieSBpbnRlcm5hbCBzdWJjbGFzc2VzIG9yIEV4cHJlc3Npb24gdG8ga25vdyBpZiBhbnlvbmUgaXMgbGlzdGVuaW5nLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckxpc3QgIT0gbnVsbCAmJiAhbGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHByb3h5IGhhcyBiZWVuIGZpcmVkIChvbmUgb2YgdGhlIGV2ZW50cyBoYXMgb2NjdXJyZWQpLiBTdWJjbGFzc2VzIHNob3VsZCBjbGVhbgotCSAqIHVwIGFuZCBub3QgaG9sZCBvbnRvIGFueXRoaW5nIHRoYXQgd291bGQgYmUgZXhwZW5zaXZlIGluIGNhc2UgdGhlIHByb3h5IGlzIHN0aWxsCi0JICogaGVsZCBvbnRvIGJlIHNvbWVvbmUuIEZvciBleGFtcGxlIHRoZSBkZWZhdWx0IGNsZWFycyB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gU3ViY2xhc3NlcyBtdXN0IGNhbGwgc3VwZXIuZGlzcG9zZSgpLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxpc3RlbmVyTGlzdCA9IG51bGw7Ci0JCWV4cHJlc3Npb24gPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IGludGVybmFsIHN1YmNsYXNzZXMgIG9yIGJ5IEV4cHJlc3Npb24gdG8gZmlyZSB0aGUgcmVzb2x2ZWQgZXZlbnQuIE9uY2UgZmlyZWQgYWxsIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugb25seSBvbmUga2luZCBvZiBmaXJpbmcgY2FuIGJlIGRvbmUgZm9yIGEgZXhwcmVzc2lvbiBwcm94eSBhbmQgdGhlbiB0aGUgcHJveHkgaXMgZGVhZC4gVGhpcwotCSAqIHByZXZlbnRzIGxpc3RlbmVycyBmcm9tIGJlaW5nIGhlbGQgb24gdG8gaWYgYW55IG9uZSBhY2NpZGVudGx5IHN0aWxsIGhvbGRzIHRoZSBwcm94eS4KLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUmVzb2x2ZWQoSUJlYW5Qcm94eSBwcm94eSkgewotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCVByb3h5RXZlbnQgZXZlbnQgPSBuZXcgUHJveHlFdmVudCh0aGlzLCBwcm94eSk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoUHJveHlMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5wcm94eVJlc29sdmVkKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgaW50ZXJuYWwgc3ViY2xhc3NlcyBvciBieSBFeHByZXNzaW9uIHRvIGZpcmUgdGhlIG5vdCByZXNvbHZlZCBldmVudC4gT25jZSBmaXJlZCBhbGwgbGlzdGVuZXJzIGFyZSByZW1vdmVkLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBvbmx5IG9uZSBraW5kIG9mIGZpcmluZyBjYW4gYmUgZG9uZSBmb3IgYSBleHByZXNzaW9uIHByb3h5IGFuZCB0aGVuIHRoZSBwcm94eSBpcyBkZWFkLiBUaGlzCi0JICogcHJldmVudHMgbGlzdGVuZXJzIGZyb20gYmVpbmcgaGVsZCBvbiB0byBpZiBhbnkgb25lIGFjY2lkZW50bHkgc3RpbGwgaG9sZHMgdGhlIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVOb3RSZXNvbHZlZCgpIHsKLQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQlQcm94eUV2ZW50IGV2ZW50ID0gbmV3IFByb3h5RXZlbnQodGhpcyk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoUHJveHlMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5wcm94eU5vdFJlc29sdmVkKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQlkaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgaW50ZXJuYWwgc3ViY2xhc3NlcyBvciBieSBFeHByZXNzaW9uIHRvIGZpcmUgdGhlIHZvaWQgcmVzb2x2ZWQgZXZlbnQuIE9uY2UgZmlyZWQgYWxsIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugb25seSBvbmUga2luZCBvZiBmaXJpbmcgY2FuIGJlIGRvbmUgZm9yIGEgZXhwcmVzc2lvbiBwcm94eSBhbmQgdGhlbiB0aGUgcHJveHkgaXMgZGVhZC4gVGhpcwotCSAqIHByZXZlbnRzIGxpc3RlbmVycyBmcm9tIGJlaW5nIGhlbGQgb24gdG8gaWYgYW55IG9uZSBhY2NpZGVudGx5IHN0aWxsIGhvbGRzIHRoZSBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVm9pZFJlc29sdmVkKCkgewotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCVByb3h5RXZlbnQgZXZlbnQgPSBuZXcgUHJveHlFdmVudCh0aGlzKTsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChQcm94eUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLnByb3h5Vm9pZChldmVudCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJZGlzcG9zZSgpOwotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBJcyB0aGlzIHByb3h5IHZhbGlkIGZvciByZWFzc2lnbm1lbnQuIEJ5IGRlZmF1bHQgb25seSBpZiB0aGUgdHlwZSBpcyBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWS4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhbmQgcmV0dXJuIHRydWUgaW4gdGhlaXIgY2FzZXMuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRGb3JSZWFzc2lnbm1lbnQoKSB7Ci0JCXJldHVybiBnZXRQcm94eVR5cGUoKSA9PSBFeHByZXNzaW9uLk5PUk1BTF9FWFBSRVNTSU9OX1BST1hZOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiOiAiK2dldFByb3h5SUQoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2MzIyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotLyoqCi0gKiBQcm94eSBmb3IgYW4gQWNjZXNzaWJsZU9iamVjdC4KLSAqIAotICogQHNpbmNlIDEuMC4wIAotICovIAotcHVibGljIGludGVyZmFjZSBJQWNjZXNzaWJsZU9iamVjdFByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0JCi0JLyoqCi0JICogSXMgdGhlIHByb3h5IGFjY2Vzc2libGUgb3Igbm90PwotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBhY2Nlc3NpYmxlIGZsYWcgb24gdGhlIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBmbGFnIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFjY2Vzc2libGUuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc2libGUoYm9vbGVhbiBmbGFnKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBcnJheUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZGJhYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIFByb3h5IHdyYXBwZXJpbmcgYW4gYXJyYXkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFycmF5QmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlJQmVhblByb3h5IGdldChpbnQgaW5kZXgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCUlCZWFuUHJveHkgZ2V0Q2F0Y2hUaHJvd2FibGVFeGNlcHRpb24oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotCSAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQsCi0JICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotCSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotCSAqIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHJlYWwgb2JqZWN0LgotCSAqLwotCUlCZWFuUHJveHkgZ2V0KGludCBbXSBpbmRleGVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7IAotCQotCS8qKgotCSAqIEdldCBhIHNuYXBzaG90IG9mIHRoZSBhcnJheS4gSXQgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgcHJveGllcyBvZiB0aGUKLQkgKiBjb21wbGV0ZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZAotCSAqIHRvIGJlIHdvcmtpbmcgd2l0aCBtb3JlIHRoYW4gb25lIGVudHJ5IG9mIHRoZSBhcnJheS4gWW91IGNhbiBzYXZlCi0JICogYWNjZXNzZXMgdG8gdGhlIHZtIGJ5IGRvaW5nIHRoaXMuIAotCSAqIDxwPgotCSAqIE5PVEU6IFRoaXMgaXMgYSBzbmFwc2hvdC4gSXQgd2lsbCBub3Qgc2VlIGNoYW5nZXMgdG8gdGhlIGFycmF5LgotCSAqIElmIGFuIGVudHJ5IGlzIHNldCBpbnRvIHRoZSByZXR1cm5lZCBhcnJheSBvZiBwcm94aWVzLCB0aGlzIHdpbGwKLQkgKiBub3QgYmUgcmVmbGVjdGVkIGludG8gdGhlIHJlYWwgYXJyYXkuIEFsc28gYW55IGNoYW5nZXMgaW4gdGhlCi0JICogY29udGVudHMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgcmVhbCBhcnJheSB3aWxsIG5vdAotCSAqIGJlIHJlZmxlY3RlZCBpbnRvIHRoaXMgcmV0dXJuZWQgYXJyYXkgb2YgcHJveGllcy4gVGhlIHByb3hpZXMKLQkgKiByZXR1cm5lZCBhcmUgcmVhbCBwcm94aWVzLCBzbyBhbnkgY2hhbmdlcyB0byB0aGVtIHdpbGwgYmUgcmVmbGVjdGVkCi0JICogYmFjayBhbmQgZm9ydGguIFRyZWF0IHRoaXMgYXMgYW4gYXJyYXkgY29weSB0byBhIG5ldyBhcnJheS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHByb3hpZXMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlCZWFuUHJveHlbXSBnZXRTbmFwc2hvdCgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXZvaWQgc2V0KElCZWFuUHJveHkgdmFsdWUsIGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCQotCS8qKgotCSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0JICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZCwKLQkgKiBhbmQgZWFjaCBpbmRleCBhbG9uZyB0aGUgd2F5IG11c3QgZXhpc3QuCi0JICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0JICogb2YgZGltZW5zaW9ucyBvZiB0aGUgcmVhbCBvYmplY3QuCi0JICovCi0Jdm9pZCBzZXQoSUJlYW5Qcm94eSB2YWx1ZSwgaW50IFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eTsJIAotCQotCS8qKgotCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGktZGltZW5zaW9ucywgeW91IG11c3QgZ2V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGRpbWVuc2lvbiBmcm9tIHRoZSBnZXQgbWV0aG9kIHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGF0IGRpbWVuc2lvbi4KLQkgKgotCSAqIGUuZy4KLQkgKiAgICBpbnQgWzNdIHJldHVybnMgMwotCSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0JICoKLQkgKiAgICAoKElBcnJheUJlYW5Qcm94eSkgZ2V0KDEpKS5nZXRMZW5ndGgoKSByZXR1cm5zIDIKLQkgKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLQkgKiAgICBiZSBhIGRpZmZlcmVudCBsZW5ndGggYXJyYXkgZm9yIGVhY2ggb2YgdGhlIGFycmF5cyAKLQkgKiAgICByZXR1cm5lZCBmcm9tIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZXR1cm5lZCBsZW5ndGgKLQkgKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotCSAqICAgIGZyb20gZ2V0KDEpLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2VmZjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBcnJheUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQSBQcm94eSBmb3IgYW4gYXJyYXkgdHlwZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcnJheUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJQmVhblR5cGVQcm94eSB7Ci0JLyoqCi0JICogZ2V0Q29tcG9uZW50VHlwZTogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LgotCSAqIGUuZy4gKG5ldyBPYmplY3RbM10pLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpIHdpbGwKLQkgKiByZXR1cm4gImphdmEubGFuZy5PYmplY3QiLgotCSAqIGFuZCAobmV3IE9iamVjdFszXVsyXVsxXSkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkgd2lsbAotCSAqIHJldHVybiAiT2JqZWN0W11bXSI7Ci0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENvbXBvbmVudFR5cGUoKTsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHR5cGUsIGkuZS4gdGhlIGZpbmFsIG5vbi1hcnJheSB0eXBlLgotCSAqIGkuZS4gaW50W11bXSB3aWxsIHJldHVybiBpbnQuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciB0aGlzIHR5cGUuCi0JICogaS5lLiBpbnQgW11bXSB3aWxsIHJldHVybiAyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmM5MmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQmVhbiBQcm94eSBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlCi0gKiByb290IGludGVyZmFjZSBmb3IgYW55IGJlYW4gcHJveHkgaW5zdGFuY2UuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5Qcm94eSBleHRlbmRzIElQcm94eSB7Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KTsKLQotLyoqCi0gKiBUZXN0IGZvciBpZGVudGl0eSBhbW9uZyB0aGlzIGJlYW4gcHJveHkgYW5kIHRoZSBvdGhlciBiZWFuIHByb3h5LgotICogRm9yIHNvbWUgcHJveHkgc3lzdGVtcywgdGhpcyBtYXkgYmUgcmVkdW5kZW50IGFuZCB5b3UgY2FuIGJlIGFzc3VyZWQKLSAqIHRoYXQgaWYgdGhlIG9iamVjdHMgYmVpbmcgcHJveGllZCBhcmUgaWRlbnRpY2FsIHlvdSB3aWxsIHJlY2VpdmUgdGhlCi0gKiBzYW1lIHByb3h5IGZvciBib3RoLiBIb3dldmVyLCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBoYXZlIHRoaXMKLSAqIGNvbmRpdGlvbi4gVGhlcmVmb3IgdGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQuCi0gKiAKLSAqIFRoZXJlIGlzIG9uZSByZXN0cmljdGlvbiwgY29uc3RhbnRzIG1heSBub3QgbmVjZXNzYXJpbHkgYmUgaWRlbnRpY2FsLgotICogRm9yIGluc3RhbmNlLCBpbiBzb21lIGltcGxlbWVudGF0aW9ucywgdGhlIEJvb2xlYW4gcHJveHkgKGkuZS4gYW4gaW5zdGFuY2Ugb2YgY2xhc3MgQm9vbGVhbikgaXMgYSBjb25zdGFudCwgaS5lLiAKLSAqIGl0IGNhbm5vdCBiZSBjaGFuZ2VkLiBJbiB0aG9zZSBjYXNlcyBhIG5ldyBwcm94eSBtYXkgYmUgY3JlYXRlZCBmb3IgZWFjaAotICogYWNjZXNzIGFuZCBzbyB0aGV5IHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaWRlbnRpY2FsLiBJbiB0aG9zZSBjYXNlcyBmYWxzZSB3aWxsIGJlIHJldHVybmVkLgotICogQnV0IGluIG90aGVyIGltcGxlbWVudGF0aW9ucyBhIG5ldyBwcm94eSB3aWxsIG5vdCBiZSBjcmVhdGVkIGFuZCBzbyBzYW1lQXMgd2lsbCByZXR1cm4gdHJ1ZS4gCi0gKiAKLSAqIFByaW1pdGl2ZXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiBqdXN0IGVxdWFsIGJlY2F1c2UgaW4gSmF2YSBwcmltaXRpdmVzIGFyZSBpZGVudGljYWwgaWYgdGhlIHNhbWUgdmFsdWUuCi0gKiAKLSAqIEBwYXJhbSBhQmVhblByb3h5Ci0gKiBAcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgaWRlbnRpY2FsIChpLmUuID09KSBhbmQgbm90IGp1c3QgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KTsKLSAgCi0vKioKLSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBwcm94eSB3YXMgY3JlYXRlZCB3aXRoLgotICovCi1wdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcm94aWVkIGNsYXNzIG9mIHRoZSBiZWFuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKTsKLQotLyoqCi0gKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJlYW4gaXRzZWxmCi0gKiBUaGlzIGNvdWxkIGJlIGRvbmUgYnkgZmluZGluZyB0aGUgdG9TdHJpbmcoKSBtZXRob2QgYnkgYSBmaW5kTWV0aG9kKCkKLSAqIG9uIHRoZSB0eXBlIHByb3h5LCBldGMuLi4gYnV0IHRvU3RyaW5nKCkgaXMgc28gdWJpcXVpdG91cyB0aGF0IGl0IGlzCi0gKiBleHBsaWNpdGx5IGRlY2xhcmVkIG9uIHRoZSBJQmVhblByb3h5IGludGVyZmFjZQotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MDEgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpOwotLyoqCi0gKiBJcyB0aGlzIGJlYW4gc3RpbGwgdmFsaWQ/IEl0IGNvdWxkIGJlIGludmFsaWQgYmVjYXVzZSBpdAotICogd2FzIHNwZWNpZmljYWxseSByZWxlYXNlZCBidXQgc29tZW9uZSBpcyBzdGlsbCBob2xkaW5nIG9udG8gaXQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTBkOGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIEJlYW4gUHJveHkgRmFjdG9yeSBmb3IgY3JlYXRpbmcgYmVhbiBwcm94aWVzLgotICogQ3JlYXRpb24gbWV0aG9kcyBhcmUgYWN0dWFsbHkgcGFja2FnZSBwcm90ZWN0ZWQuCi0gKiBBbGwgY3JlYXRpb24gaXMgZG9uZSB0aHJvdWdoIHRoZSBJQmVhblR5cGVQcm94eS4KLSAqIFNwZWNpZmljIGZhY3RvcmllcyBtYXkgaGF2ZSBoZWxwZXIgbWV0aG9kcyB0aGF0Ci0gKiBhbGxvdyBjcmVhdGlvbiBvZiBzcGVjaWZpYyB0eXBlcywgc3VjaCBhcyB0aGUKLSAqIHN0YW5kYXJkIGZhY3RvcnkgYWxsb3dzIGNyZWF0aW9uIG9mIEJvb2xlYW4sIGludCdzLCBldGMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjowOSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5Qcm94eUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBmYWN0b3J5IGlzIGJlaW5nIHRlcm1pbmF0ZWQuCi0JICogPHA+Ci0JICogSXQgc2hvdWxkIGNsZWFuIHVwIGl0cyByZXNvdXJjZXMuCi0JICogSXQgc2hvdWxkIG5vdCByZWZlcmVuY2UgYW55IG90aGVyIGZhY3RvcnkgYmVjYXVzZSB0aGV5IGNvdWxkIG9mCi0JICogYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWQuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGhvbGRpbmcgb250byBJUkVNQmVhblByb3h5J3MsIGl0IGRvZXNuJ3QKLQkgKiBuZWVkIHRvIGNhbGwgcmVsZWFzZSBvbiB0aGVtIGV4Y2VwdCBpZiB0aGV5IGFyZSBjb25zdGFudHMgYmVjYXVzZQotCSAqIHRoZSBCZWFuUHJveHlGYWN0b3J5IGhhcyBhbGwgbm9uLWNvbnN0YW50IGJlYW4gcHJveGllcyByZWdpc3RlcmVkCi0JICogYW5kIHdpbGwgY2FsbCB0aGUgcmVsZWFzZSBpdHNlbGYuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IHVzZXJzLiBJdCB3aWxsIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwcm94eSByZWdpc3RyeSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gd2FpdCA8Y29kZT50cnVlPC9jb2RlPiBzaG91bGQgd2FpdCBmb3IgY29tcGxldGlvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQuIEZhbHNlIGlzIGp1c3QKLQkgKiBhIHN1Z2dlc3Rpb24uIFRoZSBmYWN0b3J5IG1heSBub3QgcGVybWl0IG5vdCB3YWl0aW5nLiBUcnVlIG11c3QgYmUgaG9ub3VyZWQgYW5kIGl0IG11c3Qgd2FpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCk7IAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVFeHByZXNzaW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2NmFhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVFeHByZXNzaW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBBbiBpbnRlcm5hbCBpbnRlcmZhY2UgZm9yIHRoZSByZWdpc3RyaWVzIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eS4KLSAqIE5vdCB0byBiZSBpbXBsZW1lbnRlZCBvciByZWZlcmVuY2VkIGJ5IGN1c3RvbWVycy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIElQcm94eUJlYW5UeXBlIHsKLQotCS8qKgotCSAqIEFsbG93IHRoZSBleHByZXNzaW9uIHRvIHNldCB0aGUgdHlwZSBuYW1lLgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmNzMzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHByb3h5IGZvciBhIEJlYW5UeXBlIChpLmUuIEphdmEgdHlwZS9jbGFzcykuIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM4OjA2IEFNKQotICogCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuVHlwZVByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSwgSVByb3h5QmVhblR5cGUgewotCQotCS8qKgotCSAqIEZpbmQgdGhlIG1vc3QgY29tcGF0aWJsZSBjb25zdHJ1Y3RvciAob3V0IG9mIHRoZSBkZWNsYXJlZCBjb25zdHJ1Y3RvcnMpLiBUaGlzIG1lYW5zIGl0IHdpbGwKLQkgKiBmaW5kIGVpdGhlciBhbiBleGFjdCBtYXRjaCBvciBhbiBvdmVycmlkZSB0aGF0IGlzIGNvbXBhdGlibGUsIGUuZy4gWChPYmplY3QgaikgaXMgcmV0dXJuZWQgd2hlbiBsb29raW5nIHdpdGggYXJnIHR5cGUgb2YgImphdmEubGFuZy5TdHJpbmciLgotCSAqIEBwYXJhbSBhcmd1bWVudFR5cGVzIGFycmF5IG9mIGFyZyB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiAoSW4gY2FzZSBvZiBudWxsLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGN0b3IsIHNvIGp1c3QgdXNlIHRoYXQpLgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIHB1YmxpYyBtZXRob2QsIGluY2x1ZGluZyBpbmhlcml0aWVkLiBUaGlzIG1lYW5zIGl0IHdpbGwKLQkgKiBmaW5kIGVpdGhlciBhbiBleGFjdCBtYXRjaCBvciBhbiBvdmVycmlkZSB0aGF0IGlzIGNvbXBhdGlibGUsIGUuZy4geHl6KE9iamVjdCBqKSBpcyByZXR1cm5lZCB3aGVuIGxvb2tpbmcgd2l0aCBhcmcgdHlwZSBvZiAiamF2YS5sYW5nLlN0cmluZyIuCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRUeXBlcyBhcnJheSBvZiBhcmcgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gKEluIGNhc2Ugb2YgbnVsbCwganVzdCB1c2UgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSBzaW5jZSBvbmx5IG9uZSBpcyBjb21wYXRpYmxlIHRoZW4uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uCi0JICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgIHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGVzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcHVibGljIGNvbnN0cnVjdG9ycyBmb3IgdGhpcyBjbGFzcy4gCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb25zdHJ1Y3RvciBwcm94aWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFuIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBjb25zdHJ1Y3RvciBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgY29uc3RydWN0b3IgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlcyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBkZWNsYXJlZCBjb25zdHJ1Y3RvcnMgZm9yIHRoaXMgY2xhc3MuIAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29uc3RydWN0b3IgcHJveGllcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBlcnJvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBvZiBmaWVsZCBwcm94aWVzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgb2YgZGVjbGFyZWQgZmllbGQgcHJveGllcy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmllbGRwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgZmllbGRwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGVjbGFyZWRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBubyBhcmd1bWVudHMuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lcyBhcyBzdHJpbmcgYXJndW1lbnRzCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRDbGFzc05hbWVzCi0JICogQHJldHVybiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBvbmUgYXJndW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBhcmd1bWVudENsYXNzTmFtZQotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50Q2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBiZWFuVHlwZXMgYXMgYXJndW1lbnRzCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRUeXBlcwotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgdGhpcyBjbGFzcy4gCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgcHJveGllcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBlcnJvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZCBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGVzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MuIAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIHByb3hpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnZva2FibGUgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBubyBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogVGhlIG1ldGhvZCBwcm94eSBpcyBub3QgcmV0cmlldmVkLiBJbnN0ZWFkIHRoZSBtZXRob2Qgd2lsbCBiZSBsb29rZWQgdXAKLQkgKiBlYWNoIHRpbWUgb24gdGhlIHZtLiBCZWNhdXNlIG9mIHRoaXMgdGhlc2UgYXJlIHN1aXRhYmxlIG9ubHkgZm9yIG9uZS1zaG90IGludm9rYXRpb25zLiBJZiBpdCBpcyB0byBiZSBpbnZva2VkIG9mdGVuLCB0aGVuIGEgbWV0aG9kIHByb3h5IHNob3VsZAotCSAqIGJlIHJldHJpZXZlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRob3VnaCB0eXBpY2FsIGZvciBvbmUtc2hvdCBkZWFsIHRoZSBpbnZva2FibGUgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSBtZXRob2QgaXMgbG9va2VkIHVwIGVhY2ggdGltZS4gU28gYSByZWFzb25hYmxlIGNvbXByb21pc2UKLQkgKiB3b3VsZCBiZSBpZiB1c2luZyBpdCBpbmZyZXF1ZW50bHkgb3IgaXMgdXNlZCBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIEludm9rYWJsZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIHByb3h5LgotCSAqIDxwPgotCSAqIE5vdGUgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUuIFRoaXMgd29uJ3QgYmUga25vd24gdW50aWwgdGhlIGFjdHVhbCBpbnZva2UgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgYXMgc3RyaW5nIGFyZ3VtZW50cwotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgcHJveHkgaXMgbm90IHJldHJpZXZlZC4gSW5zdGVhZCB0aGUgbWV0aG9kIHdpbGwgYmUgbG9va2VkIHVwCi0JICogZWFjaCB0aW1lIG9uIHRoZSB2bS4gQmVjYXVzZSBvZiB0aGlzIHRoZXNlIGFyZSBzdWl0YWJsZSBvbmx5IGZvciBvbmUtc2hvdCBpbnZva2F0aW9ucy4gSWYgaXQgaXMgdG8gYmUgaW52b2tlZCBvZnRlbiwgdGhlbiBhIG1ldGhvZCBwcm94eSBzaG91bGQKLQkgKiBiZSByZXRyaWV2ZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaG91Z2ggdHlwaWNhbCBmb3Igb25lLXNob3QgZGVhbCB0aGUgaW52b2thYmxlIGNhbiBiZSB1c2VkIG92ZXIgYW5kIG92ZXIuIFRoZXJlIGlzIGp1c3Qgb3ZlcmhlYWQgYmVjYXVzZSB0aGUgbWV0aG9kIGlzIGxvb2tlZCB1cCBlYWNoIHRpbWUuIFNvIGEgcmVhc29uYWJsZSBjb21wcm9taXNlCi0JICogd291bGQgYmUgaWYgdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIGlzIHVzZWQgY2xvc2VseSB0b2dldGhlciBvbmNlIG9yIHR3aWNlIGl0IGlzIGJldHRlciB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlLiBUaGlzIHdvbid0IGJlIGtub3duIHVudGlsIHRoZSBhY3R1YWwgaW52b2tlIGlzIGRvbmUuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRDbGFzc05hbWVzCi0JICogQHJldHVybiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIG9uZSBhcmd1bWVudAotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgcHJveHkgaXMgbm90IHJldHJpZXZlZC4gSW5zdGVhZCB0aGUgbWV0aG9kIHdpbGwgYmUgbG9va2VkIHVwCi0JICogZWFjaCB0aW1lIG9uIHRoZSB2bS4gQmVjYXVzZSBvZiB0aGlzIHRoZXNlIGFyZSBzdWl0YWJsZSBvbmx5IGZvciBvbmUtc2hvdCBpbnZva2F0aW9ucy4gSWYgaXQgaXMgdG8gYmUgaW52b2tlZCBvZnRlbiwgdGhlbiBhIG1ldGhvZCBwcm94eSBzaG91bGQKLQkgKiBiZSByZXRyaWV2ZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaG91Z2ggdHlwaWNhbCBmb3Igb25lLXNob3QgZGVhbCB0aGUgaW52b2thYmxlIGNhbiBiZSB1c2VkIG92ZXIgYW5kIG92ZXIuIFRoZXJlIGlzIGp1c3Qgb3ZlcmhlYWQgYmVjYXVzZSB0aGUgbWV0aG9kIGlzIGxvb2tlZCB1cCBlYWNoIHRpbWUuIFNvIGEgcmVhc29uYWJsZSBjb21wcm9taXNlCi0JICogd291bGQgYmUgaWYgdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIGlzIHVzZWQgY2xvc2VseSB0b2dldGhlciBvbmNlIG9yIHR3aWNlIGl0IGlzIGJldHRlciB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlLiBUaGlzIHdvbid0IGJlIGtub3duIHVudGlsIHRoZSBhY3R1YWwgaW52b2tlIGlzIGRvbmUuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50Q2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBiZWFuVHlwZXMgYXMgYXJndW1lbnRzCi0JICogPHA+Ci0JICogVGhlIG1ldGhvZCBwcm94eSBpcyBub3QgcmV0cmlldmVkLiBJbnN0ZWFkIHRoZSBtZXRob2Qgd2lsbCBiZSBsb29rZWQgdXAKLQkgKiBlYWNoIHRpbWUgb24gdGhlIHZtLiBCZWNhdXNlIG9mIHRoaXMgdGhlc2UgYXJlIHN1aXRhYmxlIG9ubHkgZm9yIG9uZS1zaG90IGludm9rYXRpb25zLiBJZiBpdCBpcyB0byBiZSBpbnZva2VkIG9mdGVuLCB0aGVuIGEgbWV0aG9kIHByb3h5IHNob3VsZAotCSAqIGJlIHJldHJpZXZlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRob3VnaCB0eXBpY2FsIGZvciBvbmUtc2hvdCBkZWFsIHRoZSBpbnZva2FibGUgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSBtZXRob2QgaXMgbG9va2VkIHVwIGVhY2ggdGltZS4gU28gYSByZWFzb25hYmxlIGNvbXByb21pc2UKLQkgKiB3b3VsZCBiZSBpZiB1c2luZyBpdCBpbmZyZXF1ZW50bHkgb3IgaXMgdXNlZCBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIEludm9rYWJsZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIHByb3h5LgotCSAqIDxwPgotCSAqIE5vdGUgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUuIFRoaXMgd29uJ3QgYmUga25vd24gdW50aWwgdGhlIGFjdHVhbCBpbnZva2UgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBhcmd1bWVudFR5cGVzCi0JICogQHJldHVybiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCBubyBhcmd1bWVudHMgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKTsKLQotCS8qKgotCSAqIEFuc3dlciB0aGUgdHlwZSBwcm94eSBmb3IgdGhlIHN1cGVyY2xhc3MgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHR5cGUgd2UgYXJlIHByb3h5aW5nIFRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBGb3IgYXJyYXlzIGl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQ6IFtMY2xhc3NuYW1lOyBDcmVhdGlvbiBkYXRlOgotCSAqICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBmb3JtYWwgZm9ybWF0IHR5cGUgbmFtZS4gRm9yIG5vcm1hbCBjbGFzc2VzLCB0aGlzIGp1c3QgdGhlIHNhbWUgYXMgZ2V0VHlwZU5hbWUoKSwgYnV0IGZvciBhcnJheXMsIGl0IGlzIG9mIHRoZSBmb3JtYXQgY2xhc3NuYW1lW10KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgd2UgYXJlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpOwotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHdlIGFyZSBhIHR5cGUgb3IgYW4gaW50ZXJmYWNlIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEFuc3dlciBhIGJvb2xlYW4gYXMgdG8gd2hldGhlciB3ZSBhcmUgYSBwcmltaXRpdmUgb3Igbm90LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgd2UgYXJlIGEga2luZCBvZiB0aGUgYXJndW1lbnQgV2UgY2FuIGVpdGhlciBiZSBpdCwgaW5oZXJpdCBmcm9tIGl0LCBvciBpbXBsZW1lbnQgaXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0tpbmRPZihJQmVhblR5cGVQcm94eSBhQmVhblByb3h5VHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2UgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyB0byBjcmVhdGUgdGhlIHByb3h5LiBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbml0c3RyaW5nIGRvZXNuJ3QKLQkgKiByZXN1bHQgaW4gYW4gb2JqZWN0IGNvbXBhdGlibGUgd2l0aCB0aGlzIHR5cGUuIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBjYW5ub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHRoYXQgaGFwcGVuZWQgd2hlbiB0cnlpbmcgdG8gZmluZCB0aGlzIGJlYW4gdHlwZS4gQ2xhc3Mgbm90IGZvdW5kIGlzIG5vdCBzdWNoIGFuIGV4Y2VwdGlvbi4gSW4gdGhhdCBjYXNlIHRoZSBiZWFuCi0JICogdHlwZSB3aWxsIGJlIHJldHVybmVkIGFzIGEgbnVsbCBpbnN0ZWFkLiBBbiBleGFtcGxlIG9mIHN1Y2ggaXMgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IgZHVyaW5nIGxvYWRpbmcgdGhlIGNsYXNzLCBpLmUuIGl0IHdhcyBmb3VuZCBidXQgc29tZQotCSAqIHN0YXRpYyBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBpbml0aWFsaXphdGlvbiBlcnJvci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTE2NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIEJlYW5UeXBlUHJveHkncy4KLSAqIFRoaXMgaXMgYSBjb21tb24gdGFnIGludGVyZmFjZSBzbyB0aGF0Ci0gKiB0aGUgZmFjdG9yeSBjYW4gYmUgcmVnaXN0ZXJlZC4gQnV0IGVhY2gKLSAqIFZNIHJlcXVpcmVzIGEgZGlmZmVyZW50IGludGVyZmFjZSB0aGF0Ci0gKiBleHRlbmRzIHRoaXMgaW50ZXJmYWNlLiBUaGF0IGV4dGVuZGVkCi0gKiBpbnRlcmZhY2UgaXMgd2hhdCBtdXN0IGJlIGltcGxlbWVudGVkIGluCi0gKiBlYWNoIFZNLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNjowMCBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5UeXBlUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5Qcm94eUZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQm9vbGVhbkJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJvb2xlYW5CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZDgzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQm9vbGVhbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBPcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgQm9vbGVhbiBwcm94aWVzIHRoYXQKLSAqIGFsbG93cyB0aGUgSURFIFZNIHRvIGdldCB0aGUgYm9vbGVhbiB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJvb2xlYW5CZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLS8qKgotICogUmV0dXJuIHRoZSBwcm94aWVkIGJvb2xlYW4gYXMgYSBib29sZWFuIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLWJvb2xlYW4gYm9vbGVhblZhbHVlKCk7Ci1Cb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4YTAyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVXNlcnMgd2lsbCBjcmVhdGUgYSBjYWxsYmFjayBvZiB0aGlzIGludGVyZmFjZQotICogYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIGZhY3RvcnkuIFRoZW4gd2hlbiBldmVyCi0gKiB0aGUgY2FsbGJhY2sgb2NjdXJzLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCi0gKiB3aXRoIGRhdGEgZnJvbSB0aGUgcHJveHkuIEl0IGNhbiByZXR1cm4gYSB2YWx1ZSB0b28uCi0gKgotICogT3IgYW4gSW5wdXRTdHJlYW0gY2FuIGJlIHJldHVybmVkIHRvIHN1cHBseSB0aGUgZGF0YS4KLSAqICAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFjayB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgY2FsbGJhY2suCi0JICogSXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNhbGxiYWNrCi0JICogb2NjdXJyZWQuIEl0IHdpbGwgYmUgb24gaXRzIG93biB0aHJlYWQuCi0JICogQSBwYXJ0aWN1bGFyIHRocmVhZCBjYW5ub3QgYmUgcmVxdWVzdGVkLgotCSAqIDxwPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHJldHVybi4gVGhpcyBpcyAKLQkgKiBiZWNhdXNlIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjb21wbGV0ZWQKLQkgKiB1bnRpbCBpdCBpcyByZXR1cm5lZCwgYW5kIHRoZSBwcm9jZXNzIHdpbGwKLQkgKiBub3QgY29udGludWUgb24gdGhlIHJlbW90ZSB2bSB1bnRpbCBpdCBpcwotCSAqIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBtdXN0IGVpdGhlciBiZSBhbgotCSAqIElCZWFuUHJveHkgb3IgSUJlYW5Qcm94eVtdLiBJdCBpcyB0eXBlZAotCSAqIHRvIE9iamVjdCB0byBhbGxvdyBlaXRoZXIgb25lLCBidXQgaXQKLQkgKiB3aWxsIGJlIGNoZWNrZWQsIGFuZCBpZiBpdCBpc24ndCwgdGhlbgotCSAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIHRvIHRoZQotCSAqIGNhbGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSUQKLQkgKiBAcGFyYW0gcGFybSBUaGUgYmVhbnByb3h5IC0gd2lsbCBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGNhbGxiYWNrLgotCSAqIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjYWxsYmFjawotCSAqIG9jY3VycmVkLiBJdCB3aWxsIGJlIG9uIGl0cyBvd24gdGhyZWFkLgotCSAqIEEgcGFydGljdWxhciB0aHJlYWQgY2Fubm90IGJlIHJlcXVlc3RlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcGFybXMgd2lsbCBiZSBhbiBhcnJheSBvZiBJQmVhblByb3h5cywKLQkgKiBvciBhbiBlbnRyeSBjb3VsZCBiZSBhbm90aGVyIGFycmF5IG9mIElCZWFuUHJveHlzLAotCSAqIG9yIG51bGwgaWYgbnVsbCB3YXMgc2VudCB0byBjYWxsQmFja1dpdGhQYXJtcy4KLQkgKiBUaGUgZmluYWwgY29tcG9uZW50IG9mIGFueSBlbnRyeSB3aWxsIGJlIGFuCi0JICogSUJlYW5Qcm94eS4gSXQgaXMgdXAgdG8gdGhlIGRldmVsb3BlcnMgdG8KLQkgKiBhZ3JlZSBvbiB0aGUgZm9ybWF0IG9mIHRoZSBwYXJtcy4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gTVVTVCByZXR1cm4uIFRoaXMgaXMgCi0JICogYmVjYXVzZSB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY29tcGxldGVkCi0JICogdW50aWwgaXQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgcHJvY2VzcyB3aWxsCi0JICogbm90IGNvbnRpbnVlIG9uIHRoZSByZW1vdGUgdm0gdW50aWwgaXQgaXMKLQkgKiByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgbXVzdCBlaXRoZXIgYmUgYW4KLQkgKiBJQmVhblByb3h5IG9yIElCZWFuUHJveHlbXS4gSXQgaXMgdHlwZWQKLQkgKiB0byBPYmplY3QgdG8gYWxsb3cgZWl0aGVyIG9uZSwgYnV0IGl0Ci0JICogd2lsbCBiZSBjaGVja2VkLCBhbmQgaWYgaXQgaXNuJ3QsIHRoZW4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCB0byB0aGUKLQkgKiBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIHBhcm1zCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2tIYW5kbGVyI2NhbGxiYWNrV2l0aFBhcm1zKGludCwgaW50LCBPYmplY3RbXSkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyk7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGNhbGxiYWNrLgotCSAqIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjYWxsYmFjawotCSAqIG9jY3VycmVkLiBJdCB3aWxsIGJlIG9uIGl0cyBvd24gdGhyZWFkLgotCSAqIEEgcGFydGljdWxhciB0aHJlYWQgY2Fubm90IGJlIHJlcXVlc3RlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcGFybSB3aWxsIGJlIGFuIG9iamVjdC4gVGhpcyBvY2N1cnMKLQkgKiBpZiByZW1vdGUgdm0ganVzdCB3YW50ZWQgdG8gc2VuZCBzb21lIG9iamVjdHMuCi0JICogVGhleSB3aWxsIG5vdCBiZSBwcm94aWVzLiBJdCBpcyByZWNvbW1lbmRlZAotCSAqIHRoYXQgdGhpcyBiZSB1c2VkIG9ubHkgZm9yIHNtYWxsIGl0ZW1zLiBGb3IKLQkgKiBhbnl0aGluZyBsYXJnZSwgdGhlIGNhbGxiYWNrU3RyZWFtIHNob3VsZCBiZQotCSAqIHVzZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gTVVTVCByZXR1cm4uIFRoaXMgaXMgCi0JICogYmVjYXVzZSB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY29tcGxldGVkCi0JICogdW50aWwgaXQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgcHJvY2VzcyB3aWxsCi0JICogbm90IGNvbnRpbnVlIG9uIHRoZSByZW1vdGUgdm0gdW50aWwgaXQgaXMKLQkgKiByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgbXVzdCBlaXRoZXIgYmUgYW4KLQkgKiBJQmVhblByb3h5IG9yIElCZWFuUHJveHlbXS4gSXQgaXMgdHlwZWQKLQkgKiB0byBPYmplY3QgdG8gYWxsb3cgZWl0aGVyIG9uZSwgYnV0IGl0Ci0JICogd2lsbCBiZSBjaGVja2VkLCBhbmQgaWYgaXQgaXNuJ3QsIHRoZW4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCB0byB0aGUKLQkgKiBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIHBhcm0gVGhlIHBhcm0gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCB3YXMgc2VudC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNlZSBJQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdCBwYXJtKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBjYWxsYmFjay4KLQkgKiBJdCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY2FsbGJhY2sgc3RyZWFtCi0JICogb2NjdXJyZWQuIEl0IHdpbGwgYmUgb24gaXRzIG93biB0aHJlYWQuCi0JICogQSBwYXJ0aWN1bGFyIHRocmVhZCBjYW5ub3QgYmUgcmVxdWVzdGVkLgotCSAqIDxwPgotCSAqIFRoZSBjYWxsYmFjayBzaG91bGQgY29udGludWUgdG8gcmVhZCBmcm9tIHRoZSBJbnB1dFN0cmVhbQotCSAqIHVudGlsIGl0IHJldHVybnMgLTEgaW5kaWNhdGluZyBubyBtb3JlIGRhdGEuIFRoZSBzdHJlYW0gY2FuCi0JICogYmUgY2xvc2VkLiBJbiB0aGF0IGNhc2UgdGhlIG5leHQgdGltZSB0aGUgcmVtb3RlIHZtIHdhbnRzIHRvCi0JICogc2VuZCBkYXRhIGl0IHdpbGwgZmlyc3QgY2hlY2sgdGhhdCB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjbG9zZWQuCi0JICogSWYgaXQgaGFzLCBpdCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiB0aGF0IHNpZGUuCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcmV0dXJuLiBUaGlzIGlzIAotCSAqIGJlY2F1c2UgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNvbXBsZXRlZAotCSAqIHVudGlsIGl0IGlzIHJldHVybmVkLCBhbmQgdGhlIHByb2Nlc3Mgd2lsbAotCSAqIG5vdCBjb250aW51ZSBvbiB0aGUgcmVtb3RlIHZtIHVudGlsIGl0IGlzCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIGlzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGlzKTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzYzU2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLS8qKgotICogVGhpcyBpcyB0aGUgcmVnaXN0cnkgZm9yIGhhbmRsaW5nIGNhbGxiYWNrcy4KLSAqIEl0IGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIGRlcmVnaXN0ZXIgY2FsbGJhY2tzLgotICoKLSAqIENhbGxiYWNrcyBhcmUgc3BsaXQgaW50byB0d28gcGFydHM6Ci0gKiAxKSBDYWxsYmFja1Byb3h5LiBUaGlzIGlzIGFueSBwcm94eSB0aGF0IGltcGxlbWVudHMgdGhlCi0gKiAgICBpbnRlcmZhY2UgSUNhbGxiYWNrLiAoT3IgdGhlCi0gKiAgICBlcXVpdmFsZW50IG9uZSBpZiBub3Qgc3RhbmRhcmQgcmVtb3RlIHZtKS4gVGhpcyBpcyB0aGUKLSAqICAgIG9iamVjdCB3aGljaCB3aWxsIGFjdHVhbGx5IHN1Ym1pdCB0aGUgY2FsbGJhY2sgb24gdGhlIHJlbW90ZQotICogICAgdm0uIEZvciBleGFtcGxlLCBhbnkga2luZCBvZiBsaXN0ZW5lci4gSXQgd291bGQgaW1wbGVtZW50Ci0gKiAgICBib3RoIHRoZSBJQ2FsbGJhY2sgYW5kIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBpbnRlcmZhY2UuCi0gKiAgICBUaGVuIHdoZW4gaXQgZ2V0cyBjYWxsZWQgYXMgYSBsaXN0ZW5lciwgaXQgd2lsbCByZWRpcmVjdCB0aGUKLSAqICAgIGNhbGwgdG8gdGhlIHJlbW90ZSB2bSBjYWxsYmFjayBoYW5kbGVyIHRvIHN1Ym1pdCBpdCB0byB0aGUKLSAqICAgIHByb3h5IHNpZGUuCi0gKiAyKSBDYWxsYmFjay4gVGhpcyBpcyBvbiB0aGlzIHNpZGUgYW5kIGlzIHRoZSBvYmplY3QgdGhhdCB3aWxsCi0gKiAgICBiZSBub3RpZmllZCBvZiB0aGUgY2FsbGJhY2sgYW5kIHdpbGwgZXhlY3V0ZSBhdCB0aGF0IHRpbWUuCi0gKgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrUmVnaXN0cnkgewotCQotCS8qKgotCSAqIFJlZ2lzdGVyIHRoaXMgY2FsbGJhY2sgcHJveHkgYW5kIHRoaXMgY2FsbGJhY2suCi0JICoKLQkgKiBUaGUgcHJvY2VzcyBpcyB0bzoKLQkgKiAxKSBDcmVhdGUgdGhlIGNhbGxiYWNrUHJveHkgYW5kIHRoZSBjYWxsYmFjawotCSAqIDIpIHJlZ2lzdGVyIHRoZXNlIHdpdGggcmVnaXN0ZXJDYWxsYmFjawotCSAqIDMpIE5vdyBjb25uZWN0IHRoZSBjYWxsYmFja1Byb3h5IHNvIHRoYXQgaXQgd2lsbCBzdGFydCBub3RpZnlpbmcuCi0JICogICAgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGEgbm9ybWFsIGxpc3RlbmVyLCBhdCB0aGlzIHRpbWUgZG8gdGhlCi0JICogICAgYWRkTGlzdGVuZXIgY2FsbCB0byBhZGQgdGhlIGNhbGxiYWNrUHJveHkgdG8gdGhlIGFwcHJvcHJpYXRlIG9iamVjdC4KLQkgKiAgICBZb3UgZG9uJ3Qgd2FudCBpdCB0byBzdGFydCBub3RpZnlpbmcgYmVmb3JlIHJlZ2lzdGVyaW5nIGl0LgotCSAqICAgIChUaG91Z2ggaXQgd29uJ3QgaHVzdCBpdCwgaXQgd2lsbCBqdXN0IHJldHVybiBudWxsKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckNhbGxiYWNrKElCZWFuUHJveHkgY2FsbGJhY2tQcm94eSwgSUNhbGxiYWNrIGNiKTsKLQkKLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayBJQ2FsbGJhY2tSZWdpc3RyeSNyZWdpc3RlckNhbGxiYWNrKElCZWFuUHJveHksIElDYWxsYmFjaykgcmVnaXN0ZXJDYWxsYmFja30gZXhjZXB0IHRoYXQKLQkgKiBpdCBpcyBkZWZlcnJlZCBvZmYgaW50byBhbiBleHByZXNzaW9uLgotCSAqICAKLQkgKiBAcGFyYW0gY2FsbGJhY2tQcm94eQotCSAqIEBwYXJhbSBjYgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJUHJveHkgY2FsbGJhY2tQcm94eSwgSUNhbGxiYWNrIGNiLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQkKLQkvKioKLQkgKiBEZXJlZ2lzdGVyIHRoZSBjYWxsYmFjayBwcm94eS4gVGhpcyB3aWxsIHJlbW92ZSBpdCBmcm9tIHRoZQotCSAqIHJlZ2lzdHJ5IGFuZCByZWxlYXNlIHRoZSBjYWxsYmFjay4KLQkgKgotCSAqIFRoZSBwcm9jZXNzIGlzIHRvOgotCSAqIDEpIFN0b3AgdGhlIHByb3h5IGZyb20gbGlzdGVuaW5nIHNvIGl0IG5vIG5vdGlmaWVzLiBUaGlzIGlzIHVzdWFsbHkKLQkgKiAgICByZW1vdmVMaXN0ZW5lciBvbiB0aGUgcmVtb3RlIHZtLiBZb3UgZG9uJ3Qgd2FudCBpdCBub3RpZnlpbmcKLQkgKiAgICBhZnRlciBpdCBkZXJlZ2lzdGVyICh0aG91Z2ggaXQgd29uJ3QgaHVydCBpdCwgaXQgd2lsbCBqdXN0IHJldHVybiBudWxsKS4KLQkgKiAyKSBkZXJlZ2lzdGVyIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGNhbGxiYWNrUHJveHkpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmU3YzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDaGFyYWN0ZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogT3B0aW1pemVkIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGNoYXJhY3RlciBwcm94aWVzIHRoYXQKLSAqIGFsbG93cyB0aGUgSURFIFZNIHRvIGdldCB0aGUgY2hhcmFjdGVyIHZhbHVlIGVhc2lseQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjU4OjIyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2hhcmFjdGVyQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSwgSU51bWJlckJlYW5Qcm94eSB7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJveGllZCBjaGFyYWN0ZXIgYXMgYSBjaGFyIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLWNoYXIgY2hhclZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJveGllZCBjaGFyYWN0ZXIgYXMgYSBDaGFyYWN0ZXIgdGhhdCB0aGUgSURFIGNhbiB1c2UKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODozMiBBTSkKLSAqLwotQ2hhcmFjdGVyIGNoYXJhY3RlclZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI2N2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotOwotLyoqCi0gKiBDb250cm9scyBjb250cmlidXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzIHRoZSBjbGFzc3BhdGgKLSAqIHRvIGJlIG1vZGlmaWVkIGluIGFuIGFjY2VwdGFibGUgbWFubmVyLCBzbyB0aGF0IGR1cGxpY2F0ZXMgYXJlbid0IGluCi0gKiB0aGUgcGF0aCwgb3IgYWRkaW5nIGEgcHJvamVjdCB0byB0aGUgcGF0aCBpbiBhbiBhY2NlcHRhYmxlIHdheS4KLSAqIAotICogSWYgb25seSBkZWxldGluZyBvciBtb3ZpbmcgZW50cmllcyBmcm9tIHRoZSBjbGFzc3BhdGgsIHRoYXQgY2FuIGJlIGRvbmUgZGlyZWN0bHkKLSAqIHRvIHRoZSBjbGFzc3BhdGggbGlzdCBwYXNzZWQgaW4uIEFkZGluZyBlbnRyaWVzIG5lZWRzIHRvIGdvIHRocm91Z2ggdGhpcwotICogY29udHJvbGxlci4KLSAqIAotICogVGhpcyBpcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBkZXZlbG9wZXJzIG9mIHByb3h5IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciB7Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRvIHRoZSB1c2VyIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfVVNFUl9DTEFTU1BBVEggPSAwOwotCQotCS8qKgotCSAqIFByZXBlbmQgdG8gdGhlIHVzZXIgY2xhc3NwYXRoLiBUaGlzIHdpbGwgc3RpY2sgaXQgaW4gcG9zaXRpb24gMC4gSWYKLQkgKiBhbm90aGVyIHByZXBlbmQgY29tZXMgYWxvbmcsIGl0IHdpbGwgZ28gaW4gcG9zIDAgYW5kIHRoaXMgb25lIHdpbGwgbW92ZSB0byAxLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVBFTkRfVVNFUl9DTEFTU1BBVEggPSAxOwotCQotCi0JLyoqCi0JICogQXBwZW5kIHRvIHRoZSBib290IGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfQk9PVF9DTEFTU1BBVEggPSAyOwotCi0JLyoqCi0JICogUHJlcGVuZCB0byB0aGUgYm9vdCBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFUEVORF9CT09UX0NMQVNTUEFUSCA9IDM7Ci0JCi0JLyoqCi0JICogQXBwZW5kIGEgZm9sZGVyIHRvIHRoZSBqYXZhLmxpYnJhcnkucGF0aCAoZm9yIHRoaW5ncyBsaWtlCi0JICogZGxsJ3MpLiBUaGlzIHNob3VsZCByZXN1bHQgaW4gYSBmb2xkZXIgb25seS4KLQkgKiBUaGUgbmxzTG9jYWxpemUgZmxhZyBjb250cmlidXRlIHZpYSBwbHVnaW4gd2lsbCBiZQotCSAqIGlnbm9yZWQgZm9yIHRoaXMgdHlwZSBmbGFnLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEggPSA0OwotCQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgd2UgYXJlIGNvbnRyaWJ1dGluZyBmb3IuCi0JICogCi0JICogQHJldHVybiBqYXZhcHJvamVjdCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCQkKLQkvKioKLQkgKiBBZGQgYSBwcm9qZWN0IHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQWRkIGFuIGV4dGVybmFsIGZpbGUvZm9sZGVyIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGgKLQkgKiBAcGFyYW0gdHlwZUZsYWcgT25lIG9mIDxjb2RlPkFQUEVORF9VU0VSX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkFQUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPlBSRVBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCBvciA8Y29kZT5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg8L2NvZGU+LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBjb250cmlidXRlQ2xhc3NwYXRoKFVSTCwgaW50KSBpbnN0ZWFkLgotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMLCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoLCBpbnQgdHlwZUZsYWcpOwotCQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlL2ZvbGRlciB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRoVVJMCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFVSTCBjbGFzc3BhdGhVUkwsIGludCB0eXBlRmxhZyk7CQotCQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlcy9mb2xkZXJzIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhzCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY29udHJpYnV0ZUNsYXNzcGF0aChVUkxbXSwgaW50KSBpbnN0ZWFkLgotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10sIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFN0cmluZ1tdIGNsYXNzcGF0aHMsIGludCB0eXBlRmxhZyk7CQotCi0JLyoqCi0JICogQWRkIGFuIGV4dGVybmFsIGZpbGVzL2ZvbGRlcnMgdG8gdGhlIGNsYXNzcGF0aC4gVGhlIHR5cGUgZmxhZyB0ZWxscyB3aGVyZSB0byBhZGQgaXQuCi0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aFVSTHMKLQkgKiBAcGFyYW0gdHlwZUZsYWcgT25lIG9mIDxjb2RlPkFQUEVORF9VU0VSX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkFQUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPlBSRVBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCBvciA8Y29kZT5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10gY2xhc3NwYXRoVVJMcywgaW50IHR5cGVGbGFnKTsJCi0JCi0JLyoqCi0JICogQWRkIGEgZmlsZS9mb2xkZXIgZnJvbSBhIHBsdWdpbiBpbiB0aGUgcnVubmluZyBFY2xpcHNlIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIEluIGRldmVsb3BtZW50IG1vZGUgaXQgd2lsbCBmaW5kIHRoZSBiaW4gY2xhc3MgZmlsZXMgaW5zdGVhZCBpZiBwcm94eS5qYXJzIGlzIHNldHVwIGNvcnJlY3RseS4KLQkgKiA8cD4KLQkgKiBJZiBubHNMb2NhbGl6ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiBpdCB3aWxsIGFsc28gc2VhcmNoIHRocm91Z2ggdGhlIGZyYWdtZW50cyBpbiB0aGlzIG1hbm5lcjoKLQkgKiAoTm90ZTogaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGl0IHdpbGwgc3RpbGwgc2VhcmNoIGluIHRoZSBmcmFnbWVudHMsIGJ1dCBpdCB3aWxsIG9ubHkgcmV0dXJuIHRoZSBmaXJzdCBmaWxlIGZvdW5kIHRoYXQgbWF0Y2hlcy4KLQkgKiA8cD4KLQkgKiBGaW5kIGluIHRoZSBwbHVnaW4gYW5kIGFsbCBvZiB0aGUgZnJhZ21lbnRzIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG5hbWUgZXhhY3RseQotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBubHMgd2hlcmUgdGhlIG5scyBmb3IgdGhlIGZpbGVuYW1lIHdpbGwgYmUgaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZyYWdtZW50cyBvZiB0aGUgcGx1Z2luLgkgCSAKLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaXQgY2FuIGJlIGZvdW5kIGluLgotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGggUGF0aCB0byBmaWxlL2ZvbGRlciByZWxhdGl2ZSB0byBidW5kbGUgcm9vdC4gT3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdGhlIGJ1bmRsZS9mcmFnbWVudCBpdHNlbGYgKGZvciB3aGVuIHRoZSBidW5kbGUgaGFzIGJlZW4gamFyJ2VkIHVwKS4gCi0JICogICA8Yj5Ob3RlOiA8L2I+SWYgaXQgaXMgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPiwgaXQgc2hvdWxkIGJlIGZvbGRlciBhbmQgbmxzTG9jYWxpemUgd2lsbCBiZSBpZ25vcmVkLgotCSAqICAgSW4gdGhpcyBjYXNlIGJlIGNhcmVmdWwgdGhhdCBpZiBhIGZvbGRlciBhbmQgdGhlIHBsdWdpbiBpcyBqYXJyZWQgdGhhdCB0aGUgZm9sZGVyIDxiPklTIE5PVCBUSEUgUk9PVCBPRiBUSEUgUExVR0lOPC9iPi4gVGhpcyB3aWxsCi0JICogICBjYXVzZSB0aGUgZW50aXJlIHBsdWdpbiB0byBiZSBleHRyYWN0ZWQgaW5zdGVhZCBvZiBqdXN0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGlicmFyaWVzLiBJZiB0aGUgbGlicmFyaWVzIGFyZSBpbiB0aGUgcm9vdAotCSAqICAgb2YgYSBqYXJyZWQgcGx1Z2luIHRoZW4gYSBzZXBhcmF0ZSBjYWNoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGNyZWF0ZWQgaW5zdGVhZCBhbmQgdGhlIGxpYnJhcmllcyBvZiBpbnRlcmVzdCBleHRyYWN0ZWQgdG8gdGhlcmUuIEFuZAotCSAqICAgdGhlbiBwb2ludCB0byB0aGUgY2FjaGUgZGlyZWN0b3J5IGluc3RlYWQuCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiBAcGFyYW0gbmxzTG9jYWxpemUgVGhlIHVzdWFsIHZhbHVlIHNob3VsZCBiZSA8Y29kZT5mYWxzZTwvY29kZT4uIFVzZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBzaG91bGQgbG9vayB0aHJvdWdoIGZyYWdtZW50cyB0byBnYXRoZXIgdGhlbSBhbGwgYXMgZGVzY3JpYmVkIGluIHRoaXMgbWV0aG9kcyBkZXNjcmlwdGlvbi4gVGhpcyB3aWxsIHdvcmsgZm9yIGphcnJlZCBidW5kbGVzL2ZyYWdtZW50cyB0b28uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcmVsYXRpdmVQYXRoLCBpbnQgdHlwZUZsYWcsIGJvb2xlYW4gbmxzTG9jYWxpemUpOwkKLQkKLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayAjY29udHJpYnV0ZUNsYXNzcGF0aChCdW5kbGUsIFN0cmluZywgaW50LCBib29sZWFuKX0gZXhjZXB0IGFuIElQYXRoIGNhbiBiZSB1c2VkIGFzIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIHBhdGggdG8gZmlsZSB3aXRoaW4gYnVuZGxlLiBPciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyB0aGUgYnVuZGxlL2ZyYWdtZW50IGl0c2VsZiAoZm9yIHdoZW4gdGhlIGJ1bmRsZSBoYXMgYmVlbiBqYXInZWQgdXApLgotCSAqIEBwYXJhbSB0eXBlRmxhZwotCSAqIEBwYXJhbSBubHNMb2NhbGl6ZQotCSAqIAotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlLCBTdHJpbmcsIGludCwgYm9vbGVhbikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSBidW5kbGUsIElQYXRoIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKTsJCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI1YTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLSAKLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgaW5pdGlhbGl6ZSBtZXRob2QuIEl0IGhhcyBpbmZvCi0gKiB0aGF0IG1heSBiZSBuZWVkZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLiBJdCBtYXkgYmUgc2F2ZWQgZm9yIGxhdGVyIHVzZSwgYnV0IGlmIGNsYXNzcGF0aHMgaGF2ZSBjaGFuZ2VkLAotICogaXQgd29uJ3QgYmUga2VwdCB1cCB0byBkYXRlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2luaXRpYWxpemUoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIHsKLQkKLQkvKioKLQkgKiBIb2xkIHRoZSB2aXNpYmxlIGFuZCBoaWRkZW4gY29udGFpbmVyIHBhdGhzLiAKLQkgKiBBIHZpc2libGUgY29udGFpbmVyIHBhdGggbWVhbnMgaXQgaGFzIGJlZW4gZXhwb3J0ZWQgdXAgdG8gdGhlIHRvcC1sZXZlbCBwcm9qZWN0LiBBbmQgYWxzbwotCSAqIHRoZSBhcnJheSBvZiB0aG9zZSBub3QgdmlzaWJsZS4gVGhlIHBhdGhzIGFyZSB0aGUgU3RyaW5nIGZvcm0gKGkuZS4gSVBhdGgudG9TdHJpbmcoKSkuCi0JICogPHA+Ci0JICogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHtAbGluayBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0Q29udGFpbmVySWRzKCl9IG1hcC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5lclBhdGhzIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gdmlzaWJsZVBhdGg7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gaGlkZGVuUGF0aHM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRhaW5lcklkOwotCQotCQlDb250YWluZXJQYXRocyhTdHJpbmcgY29udGFpbmVySWQsIFN0cmluZ1tdIHZpc2libGVQYXRoLCBTdHJpbmdbXSBoaWRkZW5QYXRocykgewotCQkJLy8gTm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgb3IgY29uc3RydWN0ZWQgYnkgY2xpZW50cy4KLQkJCXRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJJZDsKLQkJCXRoaXMudmlzaWJsZVBhdGggPSB2aXNpYmxlUGF0aDsKLQkJCXRoaXMuaGlkZGVuUGF0aHMgPSBoaWRkZW5QYXRoczsKLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRhaW5lcklkLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbnRhaW5lcklkKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcklkOwotCQl9Ci0JCQotCQkvKioKLQkJICogQXJyYXkgb2YgdmlzaWJsZSBjb250YWluZXIgcGF0aHMuIEEgcGF0aCBpcyB2aXNpYmxlIGlmIGl0IGlzIGV4cG9ydGVkIHVwIHRvIGFuZCBjYW4KLQkJICogc2VlIGJ5IHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFZpc2libGVDb250YWluZXJQYXRocygpIHsKLQkJCXJldHVybiB2aXNpYmxlUGF0aDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFycmF5IG9mIGhpZGRlbiBjb250YWluZXIgcGF0aHMuIEEgcGF0aCBpcyBoaWRkZW4gaWYgaXQgaXMgbm90IGV4cG9ydGVkIHVwIHRvIGFuZCBjYW5ub3QKLQkJICogc2VlIGJ5IHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldEhpZGRlbkNvbnRhaW5lclBhdGhzKCkgewotCQkJcmV0dXJuIGhpZGRlblBhdGhzOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IGFsbCBvZiB0aGUgcGF0aHMgdG9nZXRoZXIsIGJvdGggdmlzaWJsZSBhbmQgaGlkZGVuLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxQYXRocygpIHsKLQkJCVN0cmluZ1tdIGFsbFBhdGhzID0gbmV3IFN0cmluZ1t2aXNpYmxlUGF0aC5sZW5ndGgraGlkZGVuUGF0aHMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodmlzaWJsZVBhdGgsIDAsIGFsbFBhdGhzLCAwLCB2aXNpYmxlUGF0aC5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShoaWRkZW5QYXRocywgMCwgYWxsUGF0aHMsIHZpc2libGVQYXRoLmxlbmd0aCwgaGlkZGVuUGF0aHMubGVuZ3RoKTsKLQkJCXJldHVybiBhbGxQYXRoczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgd2UgYXJlIGNvbnRyaWJ1dGluZyBmb3IuCi0JICogCi0JICogQHJldHVybiBqYXZhcHJvamVjdCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIGNvbnRhaW5lcnMgKHRoZSBrZXkpIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZwotCSAqIGlmIHRoZSBjb250YWluZXIgaW1wbGltZW50cyBhIGNvbnRyaWJ1dG9yIGludGVyZmFjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSB3aWxsIGJlIHtAbGluayBDb250YWluZXJQYXRoc30KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcCBvZiBjb250YWluZXJzLiBLZXlzIG9mIHR5cGUgU3RyaW5nIGZvciBjb250YWluZXIgaWQgKGUuZy4gIlNXVF9DT05UQUlORVIiIGZvciBhIGNvbnRhaW5lciBjbGFzc3BhdGggb2YgIi9TV1RfQ09OVEFJTkVSL1BERS94eXoiLgotCSAqIAlWYWx1ZXMgd2lsbCBiZSB7QGxpbmsgQ29udGFpbmVyUGF0aHN9IEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVycygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIGNvbnRhaW5lciBpZHMgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiA8cD4KLQkgKiBLZXkgd2lsbCBiZSBTdHJpbmcgYW5kIGl0IGlzIHRoZSBmaXJzdCBzZWdtZW50IG9mIGEgY29udGFpbmVyIHBhdGguIFZhbHVlIHdpbGwge0BsaW5rIENvbnRhaW5lclBhdGhzfS4gVGhpcwotCSAqIHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIHZpc2libGUgYW5kIGhpZGRlbiBwYXRocyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBzZWUuIEFsbCBvZiB0aGUgcGF0aHMgd2lsbCBoYXZlCi0JICogdGhlIGtleSAoY29udGFpbmVyIGlkKSBhcyB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIG1hcCBvZiBjb250YWluZXIgaWRzLiBLZXlzIG9mIHR5cGUgU3RyaW5nLiBWYWx1ZXMgd2lsbCBiZSB7QGxpbmsgQ29udGFpbmVyUGF0aHN9IEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVySWRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAgb2YgcGx1Z2luIGlkcyAodGhlIGtleSkgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSB3aWxsIDxjb2RlPkJvb2xlYW48L2NvZGU+IGFuZCB3aWxsIGJlIHRydWUgaWYgcGx1Z2luIHdhcyB2aXNpYmxlIHRvIHRvcC1sZXZlbCBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gbWFwIG9mIHBsdWdpbiBpZHMuIEtleSBvZiB0eXBlIFN0cmluZy4gRW1wdHkgaWYgbGF1bmNoIG5vdCBpbiBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE1hcCBnZXRQbHVnaW5JZHMoKTsJCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAgb2YgcHJvamVjdCBwYXRocyAodGhlIGtleSkgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4gVGhlIHRvcC1sZXZlbCBwcm9qZWN0Ci0JICogd2lsbCBOT1QgYmUgaW4gdGhpcyBsaXN0IHNpbmNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgdmlzaWJsZSB0byBpdHNlbGYuCi0JICogPHA+Ci0JICogVmFsdWUgd2lsbCA8Y29kZT5Cb29sZWFuPC9jb2RlPiBhbmQgd2lsbCBiZSB0cnVlIGlmIHByb2plY3Qgd2FzIHZpc2libGUgdG8gdG9wLWxldmVsIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBtYXAgb2YgcHJvamVjdCBwYXRocy4gS2V5IG9mIHR5cGUgPGNvZGU+SVBhdGg8L2NvZGU+LiBFbXB0eSBpZiBsYXVuY2ggbm90IGluIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvamVjdFBhdGhzKCk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTZiNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY29udHJpYnV0ZSB0byB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUKLSAqIHVzZWQgdG8gc3RhcnQgYSBwcm94eSByZWdpc3RyeS4gCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgewotCQotCS8qKgotCSAqIENhbGxlZCBmaXJzdCBiZWZvcmUgYW55IG9mIHRoZSBvdGhlciBjYWxscy4gVGhpcyBjYW4gYmUgdXNlZCB0byBkbyBhbnkgaW50ZXJuYWwgaW5pdGlhbGl6YXRpb25zCi0JICogcmVxdWlyZWQgYnkgdGhlIG90aGVyIGNhbGxzLiBUaGF0IHdheSB0aGUgb3RoZXIgY2FsbHMgY2FuIGhhdmUgdGhlIG9yZGVyIGNoYW5nZWQgYXMgdGhlIGltcGxlbWVudGF0aW9uCi0JICogcmVxdWlyZXMuCi0JICogPHA+Ci0JICogTk9URTogRm9yIHRob3NlIHdobyBuZXN0IGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3JzIChpLmUuIHdpdGhpbiBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRyaWJ1dG9yLCBtb3JlCi0JICogY29udHJpYnV0b3JzIGFyZSBkaXNjb3ZlcmVkKSB0aGVuIGl0IGlzIGltcGVyaXRpdmUgdGhhdCB3aGVuIHRob3NlIGNvbnRyaWJ1dG9ycyBhcmUgZGlzY292ZXJlZCB0aGF0IHRoaXMgbWV0aG9kCi0JICogYmUgY2FsbGVkIG9uIHRoZW0gdG9vLiBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGUgY29udHJhY3Qgd2l0aCBjb250cmlidXRvcnMgY2FuIGJlIGZvbGxvd2VkLiBJdCBpcyBiZXN0IGlmIHRoZQotCSAqIGRpc2NvdmVyaWVzIGFyZSBhY3R1YWxseSBkb25lIGluIHRoZSBpbml0aWFsaXplIG1ldGhvZCBpdHNlbGYgc28gdGhhdCBpdCBjYW4gcGFzcyB0aGUgbGF1bmNoIGluZm8gcmlnaHQgdGhlcmUuCi0JICogCi0JICogQHBhcmFtIGluZm8gaW5mbyBjb250YWlucyB0aGluZ3MgbGlrZSBjb250YWluZXJzIHZpc2libGUsIGV0Yy4KLQkgKiAKLQkgKiBAc2VlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pOwotCQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdG8gdGhlIGNsYXNzcGF0aC4gVGhlIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIGNvbnRyaWJ1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbGxlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsYXVuY2ggaGFzIHN0YXJ0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENvbnRyaWJ1dGUgdG8gdGhlIHJlZ2lzdHJ5IChvciBpbnRlcmFjdCB3aXRoIHRoZSByZW1vdGUgdm0pIGFmdGVyIHRoZSByZWdpc3RyeSBoYXMgYmVlbgotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUmVnaXN0cnkoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbnN0cnVjdG9yUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25zdHJ1Y3RvclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzAwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbnN0cnVjdG9yUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IHRoYXQgYWxsb3dzIGEgY29uc3RydWN0b3IgdG8gZXhpc3QgaW4gdGhlIHRhcmdldCBWTQotICogYW5kIGJlIHJlZmVyZW5jZWQgaW4gdGhlIElERSBWTQotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMDAgMToyMTo1MiBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnN0cnVjdG9yUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5IHsKLS8qKgotICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIHdpdGggbm8gY3JlYXRpb24gYXJndW1lbnRzLAotICogaS5lLiBmb3IgYSBudWxsIGNvbnN0cnVjdG9yCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxOjIyOjExIFBNKQotICovCi1JQmVhblByb3h5IG5ld0luc3RhbmNlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNyZWF0aW9uIGFyZ3VtZW50cwotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMDAgMToyMjoxMSBQTSkKLSAqLwotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygpOwotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpOwotCi1JQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lEaW1lbnNpb25CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lEaW1lbnNpb25CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5YzFjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRGltZW5zaW9uQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi0KLS8qKgotICogSW50ZXJmYWNlIHRvIGEgRGltZW5zaW9uIGJlYW4gcHJveHkuCi0gKiA8cD4KLSAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGRpZmZlcmVudCB3aW5kb3dpbmcgc3lzdGVtcywgZS5nLiBBV1QgYW5kIFNXVC4gU28gdGhpcyBoZXJlCi0gKiBpcyBjb21tb24gaW50ZXJmYWNlIGZvciB0aGVtLgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCAzOjQ2OjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaW1lbnNpb25CZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpOwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKTsKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKTsKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGRpbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZmU0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLklFeHByZXNzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb247Ci0gCi0vKioKLSAqIFRoaXMgaXMgYW4gZXhwcmVzc2lvbi4gSXQgd2lsbCBiZSBldmFsdWF0ZWQgb24gdGhlIG90aGVyIHNpZGUuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYW4KLSAqIGV4cHJlc3Npb24gYW5kIHVzaW5nIElNZXRob2RQcm94eSdzLCBJQ29uc3RydWN0b3JQcm94eSdzLCBldGMuIGlzIHRoZSBncmFudWxhcml0eS4gVGhlIHByb3hpZXMKLSAqIGFyZSBvbmUgcm91bmQtdHJpcCB0byB0aGUgb3RoZXIgc2lkZSBmb3IgZWFjaCBhY2Nlc3Mgb3IgZXhlY3V0aW9uLiBUaGUgZXhwcmVzc2lvbiBidWlsZHMgdGhlbSB1cAotICogYW5kIHdpbGwgZXhlY3V0ZSB0aGVtIGFsbCBhdCBvbmNlIG9uIHRoZSBvdGhlciBzaWRlLiBBbm90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgcmVmbGVjdGlvbgotICogd2lsbCBiZSBkb25lIG9uIHRoZSBvdGhlciBzaWRlIHRvby4gRm9yIGluc3RhbmNlIHdoZW4gaW52b2tpbmcgYSBtZXRob2QsIHRoZSBtZXRob2QgbmFtZSBpcwotICogcGFzc2VkIGludG8gdGhlIGV4cHJlc3Npb24gYXMgYSBzdHJpbmcgdGhlbiByZWZsZWN0ZWQgYW5kIHRoZW4gaW52b2tlZCwgd2hpbGUgd2l0aCBtZXRob2QKLSAqIHByb3hpZXMsIHRoZSBzdHJpbmcgaXMgdXNlZCB0byBmaW5kIHRoZSBwcm94eSBvbiB0aGUgb3RoZXIgc2lkZSwgYW5kIHRoZW4gYSBsYXRlciByb3VuZC10cmlwCi0gKiB3aWxsIGJlIHVzZWQgdG8gaW52b2tlIGl0LgotICogPHA+Ci0gKiBBbHNvIGFuIGV4cHJlc3Npb24gaXMgYSBvbmUtdGltZSB1c2Ugb2JqZWN0LiBJdCBjYW4ndCBiZSByZXVzZWQgYSBzZWNvbmQgdGltZS4gQSBuZXcgb25lIG11c3QgYmUKLSAqIGJ1aWx0IHVwIGFnYWluLgotICogPHA+Ci0gKiBXZSBhcmUgbm90IHVzaW5nIHNlcGFyYXRlIGluc3RhbmNlcyBvZiBleHByZXNzaW9ucywgYW5kIHR5cGVzIG9mIGV4cHJlc3Npb25zLCBiZWNhdXNlIHdlIGRvbid0Ci0gKiB3YW50IHRvIGJ1aWxkIHVwIG1hbnkgb2JqZWN0cyAoaW4gYSBmb3JtIG9mIGFuIGV4cHJlc3Npb24gdHJlZSkgdGhhdCB3aWxsIHRoZW4gYmUgdGhyb3duIGF3YXkKLSAqIChvbmUgZm9yIGVhY2ggZXhwcmVzc2lvbiBpbiB0aGUgbmVzdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMpLiBXZSBqdXN0IGJ1aWxkIHRoZSBjb21tYW5kIGxpc3QgYXMKLSAqIHdlIGJ1aWxkIHRoZSBleHByZXNzaW9uLgotICogPHA+Ci0gKiBUbyB1c2UsIHlvdSBjYWxsIHRoZSBJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5J3MgY3JlYXRlRXhwcmVzc2lvbiBtZXRob2QuIEFuIElFeHByZXNzaW9uIGlzCi0gKiByZXR1cm5lZC4gRnJvbSB0aGVyZSB5b3Ugd2lsbCBzdGFydCBjcmVhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGV4cHJlc3Npb24uIEFuZCB0aGVuIHlvdSB3aWxsCi0gKiBmaW5hbGx5IGVpdGhlciBnZXRFeHByZXNzaW9uVmFsdWUoKSB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLCBvciB1c2UKLSAqIGludm9rZUV4cHJlc3Npb24oKSB0byBqdXN0IGV4ZWN1dGUgdGhlIGV4cHJlc3Npb24ocykuIElmIHlvdSB1c2UgZ2V0RXhwcmVzc2lvblZhbHVlKCksIHRoZXJlIGNhbgotICogb25seSBiZSBvbmUgcm9vdCBleHByZXNzaW9uLiBJZiB5b3UgdXNlIGludm9rZUV4cHJlc3Npb24gdGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgcm9vdAotICogZXhwcmVzc2lvbiwgYW5kIHRoZXkgd2lsbCBhbGwgYmUgZXhlY3V0ZWQuCi0gKiA8cD4KLSAqIFNpbmNlIHNlcXVlbmNlIGlzIHNvIGltcG9ydGFudCwgaXQgd2lsbCBiZSB0ZXN0ZWQgYW5kIGlmIGFueXRoaW5nIGlzIGRvbmUgb3V0IG9mIG9yZGVyIGFuCi0gKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gKiA8cD4KLSAqIEVhY2ggdGltZSBhbiBleHByZXNzaW9uIGlzIGNyZWF0ZWQsIG9uZSBhcmd1bWVudCBwYXNzZWQgaW4gd2lsbCBiZSA8Y29kZT5mb3JFeHByZXNzaW9uPC9jb2RlPiBmbGFnLgotICogVGhpcyBpcyBhIHNldCBvZiBjb25zdGFudHMgdXNlZCBhcyBhIGNsdWUgZm9yIHdoYXQgZXhwcmVzc2lvbiB0aGlzIGV4cHJlc3Npb24gaXMgYmVpbmcgY3JlYXRlZC4KLSAqIFRoaXMgaXMgZm9yIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBzdGF0ZS4gRm9yIGV4YW1wbGUsIHdoZW4gY3JlYXRpbmcgdGhlIGFycmF5IGV4cHJlc3Npb24gZm9yIGFuCi0gKiBhcnJheSBhY2Nlc3MsIHRoZSBBUlJBWUFDQ0VTU19BUlJBWSBmbGFnIGlzIHBhc3NlZCBpbi4gVGhpcyB3YXkgaWYgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBvbiB0aGUKLSAqIHN0YWNrIGlzIG5vdCBmb3IgYW4gYXJyYXkgYWNjZXNzIHdhaXRpbmcgZm9yIHRoZSBhcnJheSBleHByZXNzaW9uLCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gKiBXaXRob3V0IHRoaXMgZmxhZywgaXQgd291bGQgYmUgZWFzeSB0byBhY2NpZGVudGx5IGNyZWF0ZSB0aGUgd3JvbmcgZXhwcmVzc2lvbiBhdCB0aGUgd3JvbmcgdGltZS4KLSAqIE9uY2Ugc3VjaCBhbiBlcnJvciBvY2N1cnMsIHRoaXMgSUV4cHJlc3Npb24gd2lsbCBubyBsb25nZXIgYmUgdmFsaWQuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgotICogZm9yIGFueSB0eXBlIG9mIGFjY2Vzcy4KLSAqIDxwPgotICogSXQgaXMgZ3VhcmVudGVlZCB0aGF0IHRoZSBlbnRpcmUgc3RhY2sgb2YgY29tbWFuZHMgd2lsbCBiZSBzZW50IHdpdGhvdXQgc3RvcHBpbmcgZXhjZXB0IGZvciBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAqIGR1ZSB0byBvdXQgb2Ygb3JkZXIgZXhwcmVzc2lvbnMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBub3QgbWVhbnQgdG8gYmUgbmVpdGhlciBpbnN0YW50aWF0ZWQgbm9yIGltcGxlbWVudGVkIGJ5IGN1c3RvbWVycy4KLSAqIEl0IGlzIHRoZSBpbnRlcmZhY2UgaW50byB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLiBJdCBpcyB0byBiZSBpbnN0YW50aWF0ZWQgdGhyb3VnaCB0aGUgY3JlYXRlRXhwcmVzc2lvbiByZXF1ZXN0LgotICogVGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9ufSBjbGFzcyBpcyBhdmFpbGFibGUgYXMgQVBJLiBJdCBpcyBub3QgbWVhbnQgdG8KLSAqIGJlIGluc3RhbnRpYXRlZCBieSBjdXN0b21lcnMsIGJ1dCBjdXN0b21lcnMgY2FuIHRha2UgdGhlIElFeHByZXNzaW9uIGFuZCBjYXN0IHRvIEV4cHJlc3Npb24gZm9yIHNvbWUgYWR2YW5jZWQKLSAqIEFQSS4KLSAqICAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjcmVhdGVFeHByZXNzaW9uKCkKLSAqIEBzZWUgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb24gZXh0ZW5kcyBJRXhwcmVzc2lvbkNvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSB0aGlzIGV4cHJlc3Npb24gaXMgd29ya2luZyBhZ2FpbnN0LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKTsKLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIGV4cHJlc3Npb24ocykuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcm9vdCBleHByZXNzaW9uLCBpdCB3aWxsIGludm9rZSB0aGVtCi0JICogaW4gdGhlIG9yZGVyIGNyZWF0ZWQuIElmIHRoZSBleHByZXNzaW9uIHN0YWNrIGlzIG5vdCBjb21wbGV0ZSwgdGhlbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGludm9rZUV4cHJlc3Npb24oKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gaXMgdmFsaWQuIEl0IHdvdWxkIGJlIGludmFsaWQgaWYgYW55IG9mIHRoZSBjcmVhdGUuLi4gY2FsbHMgaGFkIHRocm93biBhbgotCSAqIGV4Y2VwdGlvbiBvciBpZiB0aGUgZXhwcmVzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZCAoaW52b2tlZCBvciBnZXRFeHByZXNzaW9uVmFsdWUoKSkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBleHByZXNzaW9uIGlzIHZhbGlkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgaGFkIGJlZW4gc29tZSBlcnJvciwgb3IgaWYgdGhlIGV4cHJlc3Npb24gaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCQotCS8qKgotCSAqIENsb3NlIHRoZSBleHByZXNzaW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBmb3Igc29tZSByZWFzb24ge0BsaW5rIElFeHByZXNzaW9uI2ludm9rZUV4cHJlc3Npb24oKX0gb3Ige0BsaW5rIElFeHByZXNzaW9uI2dldEV4cHJlc3Npb25WYWx1ZSgpfQotCSAqIHdlcmUgbm90IGNhbGxlZC4gSXQgaXMgbm90IGFuIGVycm9yIHRvIGFsd2F5cyBjYWxsIHRoaXMgYWZ0ZXIgdGhlc2UgY2FsbHMuIEl0IHdpbGwgbm90IGhhdmUgYW55IHByb2JsZW1zIHdpdGggdGhlIGV4cHJlc3Npb24gYWxyZWFkeQotCSAqIGJlaW5nIGNsb3NlZC4gaW52b2tlIGFuZCBnZXR2YWx1ZSBhdXRvbWF0aWNhbGx5IGNhbGwgY2xvc2UgZm9yIHlvdS4gSWYgeW91IGRvbid0IGNhbGwgY2xvc2UgaW4gY2FzZSBvZiBhbiBlcnJvciwgdGhlIHJlc291cmNlcwotCSAqIGZvciB0aGUgZXhwcmVzc2lvbiB3aWxsIG5vdCBiZSBmcmVlZCB1cC4gCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIHJvb3QgZXhwcmVzc2lvbiBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gSWYgdGhlIGV4cHJlc3Npb24gc3RhY2sKLQkgKiBpcyBub3QgY29tcGxldGUsIG9yIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcm9vdCBleHByZXNzaW9uLCB0aGVuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgcm9vdCBleHByZXNzaW9uLiAKLQkgKiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0RXhwcmVzc2lvblZhbHVlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQkJCi0JLyoqCi0JICogQ3JlYXRlIGFuIEFycmF5IEFjY2VzcyAoZS5nLiB4WzNdKS4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlIGV4cHJlc3Npb25zIGZvcjoKLQkgKiA8cHJlPgotCSAqICA8Y29kZT5BUlJBWUFDQ0VTU19BUlJBWTwvY29kZT4KLQkgKiAgPGNvZGU+QVJSQVlBQ0NFU1NfSU5ERVg8L2NvZGU+IGFuIGluZGV4Q291bnQgdGltZXMuIAotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIFNvIHRoZSBhcnJheSBhY2Nlc3MgbXVzdCBiZSBmb2xsb3dlZCBieSAxK2luZGV4Q291bnQgZXhwcmVzc2lvbnMuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24gVGhpcyBpcyBmb3Igd2hhdCBleHByZXNzaW9uIHRoaXMgZXhwcmVzc2lvbiBpcyBiZWluZyBjcmVhdGVkLgotCSAqIEBwYXJhbSBpbmRleENvdW50IFRoZSBudW1iZXIgb2YgaW5kZXggZXhwcmVzc2lvbnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGludCBpbmRleENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBBcnJheSBDcmVhdGlvbiAoZS5nLiA8Y29kZT5uZXcgaW50WzNdPC9jb2RlPiBvciA8Y29kZT5uZXcgaW50WzNdW108L2NvZGU+IG9yIDxjb2RlPm5ldyBpbnRbXSB7MywgNH08L2NvZGU+KS4KLQkgKiBJZiA8Y29kZT5kaW1lbnNpb25FeHByZXNzaW9uQ291bnQ8L2NvZGU+IGlzIHplcm8sIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiBpbml0aWFsaXplci4gVGhpcyBpcyBiZWNhdXNlCi0JICogaWYgdGhlcmUgYXJlIGFueSBkaW1lbnNpb24gZXhwcmVzc2lvbnMsIHRoZW4gaW5pdGlhbGl6ZXJzIGFyZSBpbnZhbGlkIGFuZCB2aXNhLXZlcnNhLgotCSAqIDxwPgotCSAqIFRoZSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgaXMgZm9yIGhvdyBtYW55IGRpbWVuc2lvbnMgaGF2ZSBhbiBleHByZXNzaW9uIGluIHRoZW0uIEZvciBpbnN0YW5jZSwKLQkgKiA8Y29kZT5uZXcgaW50WzNdPC9jb2RlPiB3aWxsIGhhdmUgYSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgb2YgMS4gV2hpbGUKLQkgKiA8Y29kZT5uZXcgaW50WzNdW108L2NvZGU+IHdpbGwgYWxzbyBoYXZlIGNvdW50IG9mIDEuIEFuZCBmaW5hbGx5Ci0JICogPGNvZGU+bmV3IGludCBbXTwvY29kZT4gd2lsbCBoYXZlIGEgY291bnQgb2YgMC4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlIGV4cHJlc3Npb25zIGZvcjoKLQkgKiA8cHJlPgotCSAqICA8Y29kZT5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTjwvY29kZT4gYSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgdGltZXMsIAotCSAqICBvciBhbiA8Y29kZT5jcmVhdGVBcnJheUluaXRpYWxpemVyKCk8L2NvZGU+IGlmIGRpbWVuc2lvbiBjb3VudCBpcyAwLgotCSAqIDwvcHJlPgotCSAqICAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LiBJdCBtdXN0IGFsc28gaW5jbHVkZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgIDxjb2RlPltdPC9jb2RlPiBhdCB0aGUgZW5kLgotCSAqIEBwYXJhbSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSwgaW50IGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBBcnJheSBDcmVhdGlvbiAoZS5nLiA8Y29kZT5uZXcgaW50WzNdPC9jb2RlPiBvciA8Y29kZT5uZXcgaW50WzNdW108L2NvZGU+IG9yIDxjb2RlPm5ldyBpbnRbXSB7MywgNH08L2NvZGU+KS4KLQkgKiBJZiA8Y29kZT5kaW1lbnNpb25FeHByZXNzaW9uQ291bnQ8L2NvZGU+IGlzIHplcm8sIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiBpbml0aWFsaXplci4gVGhpcyBpcyBiZWNhdXNlCi0JICogaWYgdGhlcmUgYXJlIGFueSBkaW1lbnNpb24gZXhwcmVzc2lvbnMsIHRoZW4gaW5pdGlhbGl6ZXJzIGFyZSBpbnZhbGlkIGFuZCB2aXNhLXZlcnNhLgotCSAqIDxwPgotCSAqIFRoZSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgaXMgZm9yIGhvdyBtYW55IGRpbWVuc2lvbnMgaGF2ZSBhbiBleHByZXNzaW9uIGluIHRoZW0uIEZvciBpbnN0YW5jZSwKLQkgKiA8b2w+Ci0JICogPGxpPjxjb2RlPm5ldyBpbnRbM108L2NvZGU+IHdpbGwgaGF2ZSBhIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBvZiAxLiBXaGlsZQotCSAqIDxsaT48Y29kZT5uZXcgaW50WzNdW108L2NvZGU+IHdpbGwgYWxzbyBoYXZlIGNvdW50IG9mIDEuIEFuZCBmaW5hbGx5Ci0JICogPGxpPjxjb2RlPm5ldyBpbnQgW108L2NvZGU+IHdpbGwgaGF2ZSBhIGNvdW50IG9mIDAuCi0JICogPC9vbD4KLQkgKiBUaGUgZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3cgaWYgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IGlzIG5vdCB6ZXJvIG11c3QgZXZhbHVhdGUgdG8gYmUgY29tcGF0aWJsZSB0byBhbiBpbnQgdHlwZSAoaS5lLiBieXRlLCBjaGFyLCBzaG9ydCwgb3IgaW50KS4KLQkgKiBFYWNoIGV4cHJlc3Npb24gd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhcnJheSBmb3IgdGhhdCBkaW1lbnNpb24gb2YgdGhhdCBzaXplLiBGb3IgZXhhbXBsZSA8Y29kZT5uZXcgaW50WzNdW108L2NvZGU+IHdpbGwgaGF2ZSBhbgotCSAqIGRpbWVuc2lvbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvICIzIiwgYW5kIHNvIGl0IHdpbGwgY3JlYXRlIGFuIGFycmF5IGludFszXVtdLgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGUgZXhwcmVzc2lvbnMgZm9yOgotCSAqIAlkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgdGltZXMgYW46IDxjb2RlPkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OPC9jb2RlPgotCSAqICBvciBhbiBjcmVhdGVBcnJheUluaXRpYWxpemVyIGlmIGRpbWVuc2lvbiBjb3VudCBpcyAwLgotCSAqICAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIFRoaXMgbXVzdCBiZSB0aGUgYWN0dWFsIHR5cGUgd2l0aCB0aGUgY29ycmVjdCB0b3RhbCBudW1iZXIgb2YgZGltZW5zaW9ucyAoZS5nLiAiamF2YS5sYW5nLk9iamVjdFtdW10iKS4KLQkgKiBAcGFyYW0gZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IG51bWJlciBvZiBpbnQgdmFsdWVkIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93IHRoYXQgZ2l2ZSB0aGUgc2l6ZSBmb3IgZWFjaCBkaW1lbnNpb24uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFycmF5IGluaXRpYWxpemVyLiAoZS5nLiA8Y29kZT57MiwzfTwvY29kZT4pLgotCSAqIFRoaXMgb25lIGlzIHVudXN1YWwgaW4gdGhhdCB0aGVyZSBpcyBubyBmb3JFeHByZXNzaW9uLiBUaGF0IGlzIGJlY2F1c2UgYXJyYXkgaW5pdGlhbGl6ZXJzIGFyZSBvbmx5IHZhbGlkIGluCi0JICogY2VydGFpbiBwbGFjZXMuIEFuZCBzbyBpZiBjYWxsZWQgd2hlbiBub3QgZXhwZWN0ZWQsIHRoaXMgaXMgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCWV4cHJlc3Npb25Db3VudCB0aW1lcyBhbjogPGNvZGU+QVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OPC9jb2RlPgotCSAqIAkJZXhjZXB0IGlmIHRoZSBleHByZXNzaW9uIGlzIGFub3RoZXIgYXJyYXkgaW5pdGlhbGl6ZXIuIFRoYXQgaXMgdmFsaWQgYW5kIGRvZXNuJ3QgaGF2ZSBhIGZvckV4cHJlc3Npb24sCi0JICogCQlidXQgaXQgZG9lcyBjb3VudCBhcyBvbmUgb2YgdGhlIGV4cHJlc3Npb25Db3VudHMuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25Db3VudCBOdW1iZXIgb2YgZXhwcmVzc2lvbnMsIG1heSBiZSAwLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQXJyYXlJbml0aWFsaXplcihpbnQgZXhwcmVzc2lvbkNvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjYXN0IGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+KHNob3J0KTEwPC9jb2RlPiBvciA8Y29kZT4oamF2YS5sYW5nLlN0cmluZykgImFzZCI8L2NvZGU+KQotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkNBU1RfRVhQUkVTU0lPTjwvY29kZT4gCi0JICogIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2FzdCBleHByZXNzaW9uIChlLmcuIDxjb2RlPihzaG9ydCkxMDwvY29kZT4gb3IgPGNvZGU+KGphdmEubGFuZy5TdHJpbmcpICJhc2QiPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5DQVNUX0VYUFJFU1NJT048L2NvZGU+IAotCSAqICAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgY2xhc3MgaW5zdGFuY2UgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT5uZXcgamF2YS5sYW5nLkludGVnZXIoNSk8L2NvZGU+KQotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCWFyZ3VtZW50Q291bnQgdGltZXMgYW46IDxjb2RlPkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVDwvY29kZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgY2FuIHRocm93IHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLlVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yfSB3aGlsZSBwcm9jZXNzaW5nCi0JICogYW5kIGNhbiBiZSBjYXVnaHQgYnkgYW4gRXhwcmVzc2lvbiB0cnkvY2F0Y2guIFRoaXMgaXMgbm90IHRocm93biBzdWNoIHRoYXQgaXQgY2FuIGJlIGNhdWdodCBieSBhIHJlYWwgamF2YSB0cnkvY2F0Y2guCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4KLQkgKiBAcGFyYW0gYXJndW1lbnRDb3VudAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+bmV3IGphdmEubGFuZy5JbnRlZ2VyKDUpPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAlhcmd1bWVudENvdW50IHRpbWVzIGFuOiA8Y29kZT5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQ8L2NvZGU+Ci0JICogCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGNhbiB0aHJvdyB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5VbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvcn0gd2hpbGUgcHJvY2Vzc2luZwotCSAqIGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGFuIEV4cHJlc3Npb24gdHJ5L2NhdGNoLiBUaGlzIGlzIG5vdCB0aHJvd24gc3VjaCB0aGF0IGl0IGNhbiBiZSBjYXVnaHQgYnkgYSByZWFsIGphdmEgdHJ5L2NhdGNoLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4KLQkgKiBAcGFyYW0gYXJndW1lbnRDb3VudAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+eCAhPSAzID8gNCA6IDU8L2NvZGU+KQotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkNPTkRJVElPTkFMX0NPTkRJVElPTjwvY29kZT4KLQkgKiAJPGNvZGU+Q09ORElUSU9OQUxfVFJVRTwvY29kZT4KLQkgKiAJPGNvZGU+Q09ORElUSU9OQUxfRkFMU0U8L2NvZGU+CQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpZWxkIGFjY2VzcyAoZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvci5yZWQ8L2NvZGU+KQotCSAqIDxwPgotCSAqIE5vdGU6IEF0IHRoaXMgdGltZSB3ZSByZXF1aXJlIGEgcmVjZWl2ZXIuIEluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIG9uZSwgYnV0Ci0JICogZm9yIHRoYXQgd2UgbmVlZCBhIDxjb2RlPnRoaXM8L2NvZGU+IG9iamVjdCB0byBrbm93IHdobyB0aGUgcmVjZWl2ZXIgaW1wbGljaXRseSBpcy4KLQkgKiBUaGUgcmVjZWl2ZXIgbWF5IGJlIGEgInR5cGUgcmVjZWl2ZXIiIGlmIGl0IGlzIGEgdHlwZSwgZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvcjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+RklFTERfUkVDRUlWRVI8L2NvZGU+IGlmIGhhc1JlY2VpdmVyIGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgSGFzIGEgcmVjZWl2ZXIgZmxhZy4gQ3VycmVudGx5IHRoaXMgbXVzdCBhbHdheXMgYmUgdHJ1ZS4gVGhpcyBpcyBiZWNhdXNlIGNhbid0IHRlbGwgd2hhdCBjbGFzcyB0byBsb29rIGludG8gZm9yIHRoZSBmaWVsZCB3aXRob3V0IGEgcmVjZWl2ZXIuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlVHlwZVJlY2VpdmVyKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpZWxkIGFjY2VzcyAoZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvci5yZWQ8L2NvZGU+KQotCSAqIDxwPgotCSAqIE5vdGU6IEF0IHRoaXMgdGltZSB3ZSByZXF1aXJlIGEgcmVjZWl2ZXIgZm9yIG5vbi1zdGF0aWMgYWNjZXNzLiBJbiB0aGUgZnV0dXJlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBub3QgaGF2ZSBvbmUsIGJ1dAotCSAqIGZvciB0aGF0IHdlIG5lZWQgYSA8Y29kZT50aGlzPC9jb2RlPiBvYmplY3QgdG8ga25vdyB3aG8gdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkgaXMuCi0JICogVGhlIHJlY2VpdmVyIG1heSBiZSBhICJ0eXBlIHJlY2VpdmVyIiBpZiBpdCBpcyBhIHR5cGUsIGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3I8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogPHByZT4KLQkgKiAJPGNvZGU+RklFTERfUkVDRUlWRVI8L2NvZGU+IGlmIGhhc1JlY2VpdmVyIGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGRQcm94eSBUaGUgZmllbGQgcHJveHkgZm9yIHRoZSBmaWVsZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgSGFzIGEgcmVjZWl2ZXIgZmxhZy4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5RmllbGQgZmllbGRQcm94eSwgYm9vbGVhbiBoYXNSZWNlaXZlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGlmL2Vsc2Ugc3RtdC4gU2luY2UgdGhpcyBpcyBhIHN0YXRtZW50LCB0aGVyZSBpcyBubyBGb3JFeHByZXNzaW9uLiBST09UX0VYUFJFU1NJT04gbXVzdCBiZSB0aGUgbmV4dCBleHByZXNzaW9uIHR5cGUuCi0JICogPHA8Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiA8cHJlPgotCSAqICAgPGNvZGU+SUZfQ09ORElUSU9OPC9jb2RlPiBUaGUgaWYgdGVzdCwgbXVzdCByZXR1cm4gYm9vbGVhbi4KLQkgKiAgIDxjb2RlPklGX1RSVUU8L2NvZGU+IFRoZSBpZiBjb25kaXRpb24gaXMgdHJ1ZSBjbGF1c2UuIFRoZSBjbGF1c2UgbWF5IGJlIGFuIGV4cHJlc3Npb24sIG9yIGEgYmxvY2suCi0JICogICA8Y29kZT5JRl9FTFNFPC9jb2RlPiAgaWYgaGFzRWxzZUNsYXVzZSBpcyA8Y29kZT50cnVlPC9jb2RlPi4gVGhlIGVsc2UgY2xhdXNlLiBUaGUgY2xhdXNlIG1heSBiZSBhbiBleHByZXNzaW9uLCBvciBhIGJsb2NrLgotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBoYXNFbHNlQ2xhdXNlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJZkVsc2UoYm9vbGVhbiBoYXNFbHNlQ2xhdXNlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbmZpeCBleHByZXNzaW9uIChlLmcuIDxjb2RlPjMgKyA0PC9jb2RlPiBvciA8Y29kZT4zICsgNCArIDU8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDIgb3BlcmFuZHMgKGFsbCB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yKSB0aGVuIGZvciBjb252aWVuZW5jZSBhbGwgb2YKLQkgKiB0aGUgZXhwcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiB0aGFuIHJlcXVpcmluZyBzZXZlcmFsLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IuCi0JICogSWYgdGhleSBhcmUgZGlmZmVyZW50IG9wZXJhdG9ycywgdGhlbiBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgd2lsbCBiZSByZXF1aXJlZC4KLQkgKiA8cD4KLQkgKiA8cHJlPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPklORklYX0xFRlQ8L2NvZGU+Ci0JICogCTxjb2RlPklORklYX1JJR0hUPC9jb2RlPgotCSAqIAlleHRlbmRlZE9wZXJhbmRDb3VudCB0aW1lcyBhbjogPGNvZGU+SU5GSVhfRVhURU5ERUQ8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yLgotCSAqIEBwYXJhbSBleHRlbmRlZE9wZXJhbmRDb3VudCBUaGUgbnVtYmVyIG9mIGV4dGVuZGVkIG9wZXJhbmRzLiBNYXkgYmUgemVyby4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JRXhwcmVzc2lvbkNvbnN0YW50cyNJTl9BTkQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBpbnQgZXh0ZW5kZWRPcGVyYW5kQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlb2YgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT54IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZzwvY29kZT4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbiBmb3I6Ci0JICogCTxjb2RlPklOU1RBTkNFT0ZfVkFMVUU8L2NvZGU+Ci0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlb2YgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT54IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZzwvY29kZT4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbiBmb3I6Ci0JICogCTxjb2RlPklOU1RBTkNFT0ZfVkFMVUU8L2NvZGU+Ci0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIChlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCk8L2NvZGU+KS4KLQkgKiBXaGVuIHVzaW5nIGEgc3RyaW5nIHRoZSBtZXRob2QgaW52b2tlZCB3aWxsIGJlIHRoZSBvbmUgbW9zdCBjb21wYXRpYmxlIHdpdGggdGhlIGFyZ3VtZW50cyBzZW50LiAKLQkgKiBUaGlzIGFsbG93cyBvdmVybG9hZGluZyBhIG1ldGhvZCB0byBvY2N1ciB3aGVuIGNvbWluZyBpbiBmcm9tIGEgcGFyc2UgdHJlZSwgc2luY2UgdGhlIHBhcnNlIHRyZWUKLQkgKiBkb2Vzbid0IGtub3cgdGhlIGV4YWN0IG1ldGhvZCB0byB1c2UuCi0JICogPHA+Ci0JICogTm90ZTogQXQgdGhpcyB0aW1lIHdlIHJlcXVpcmUgYSByZWNlaXZlci4gSW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgb25lLCBidXQKLQkgKiBmb3IgdGhhdCB3ZSBuZWVkIGEgPGNvZGU+dGhpczwvY29kZT4gb2JqZWN0IHRvIGtub3cgd2hvIHRoZSByZWNlaXZlciBpbXBsaWNpdGx5IGlzLgotCSAqIFRoZSByZWNlaXZlciBtYXkgYmUgYSAidHlwZSByZWNlaXZlciIgaWYgaXQgaXMgYSB0eXBlLCBlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbiBmb3I6Ci0JICogCTxjb2RlPk1FVEhPRF9SRUNFSVZFUjwvY29kZT4KLQkgKiAJYXJndW1lbnRDb3VudHMgdGltZXMgZXhwcmVzc2lvbnMgZm9yOiA8Y29kZT5NRVRIT0RfQVJHVU1FTlQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIEhhcyBhIHJlY2VpdmVyIGZsYWcuIEN1cnJlbnRseSB0aGlzIG11c3QgYWx3YXlzIGJlIHRydWUuCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQgQ291bnQgb2YgbnVtYmVyIG9mIGFyZ3VtZW50cy4gTWF5IGJlIHplcm8uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlVHlwZVJlY2VpdmVyKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIChlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCk8L2NvZGU+KQotCSAqIDxwPgotCSAqIE5vdGU6IEF0IHRoaXMgdGltZSB3ZSByZXF1aXJlIGEgcmVjZWl2ZXIuIEluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIG9uZSwgYnV0Ci0JICogZm9yIHRoYXQgd2UgbmVlZCBhIDxjb2RlPnRoaXM8L2NvZGU+IG9iamVjdCB0byBrbm93IHdobyB0aGUgcmVjZWl2ZXIgaW1wbGljaXRseSBpcy4KLQkgKiBUaGUgcmVjZWl2ZXIgbWF5IGJlIGEgInR5cGUgcmVjZWl2ZXIiIGlmIGl0IGlzIGEgdHlwZSwgZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvcjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb24gZm9yOgotCSAqIAk8Y29kZT5NRVRIT0RfUkVDRUlWRVI8L2NvZGU+Ci0JICogCWFyZ3VtZW50Q291bnRzIHRpbWVzIGV4cHJlc3Npb25zIGZvcjogPGNvZGU+TUVUSE9EX0FSR1VNRU5UPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIG1ldGhvZFByb3h5IFRoZSBwcm94eSBvZiB0aGUgbWV0aG9kCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIEhhcyBhIHJlY2VpdmVyIGZsYWcuIEN1cnJlbnRseSB0aGlzIG11c3QgYWx3YXlzIGJlIHRydWUuCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQgQ291bnQgb2YgbnVtYmVyIG9mIGFyZ3VtZW50cy4gTWF5IGJlIHplcm8uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlVHlwZVJlY2VpdmVyKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5TWV0aG9kIG1ldGhvZFByb3h5LCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZml4IGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+IWZsYWc8L2NvZGU+IG9yIDxjb2RlPi0oMys0KTwvY29kZT4pLgotCSAqIElmIHlvdSBhcmUganVzdCB0cnlpbmcgdG8gY3JlYXRlIGEgc2lnbmVkIG51bWVyaWMgbGl0ZXJhbCwganVzdCB1c2UgdGhlIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwgcGFzc2luZyBpbiBhCi0JICogbmVnYXRpdmUgdmFsdWUuIFlvdSBkb24ndCBuZWVkIHRvIHVzZSBwcmVmaXggZXhwcmVzc2lvbiBmb3IgdGhhdC4KLQkgKiA8cD4KLQkgKiA8cHJlPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPlBSRUZJWF9PUEVSQU5EPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvci4gVGhlIHZhbHVlcyBjb21lIGZyb20gSUV4cHJlc3Npb25Db25zdGFudHMsIHRoZSBwcmVmaXggY29uc3RhbnRzLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklFeHByZXNzaW9uQ29uc3RhbnRzI1BSRV9QTFVTCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdHlwZSBsaXRlcmFsIChlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+KS4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlIHR5cGUgaXMgYmVpbmcgdXNlZCBhcyB2YWx1ZSBpdHNlbGYsIG5vdAotCSAqIGFzIGEgcmVjZWl2ZXIgZm9yIGEgZmllbGQgb3IgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlb2YuIExpa2UgYXMgYW4gYXJndW1lbnQgdG8gYSBtZXRob2QuCi0JICogPHA+Ci0JICogTm90ZTogSWYgeW91IHdhbnQgYSB0eXBlIGxpdGVyYWwgdG8gYmUgYW4gSVByb3h5QmVhblR5cGUsIGp1c3QgdXNlIHtAbGluayBJRXhwcmVzc2lvbiNjcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiwgSVByb3h5KX0gYW5kIHBhc3MgaW4gdGhlCi0JICogSVByb3h5QmVhblR5cGUuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdHlwZSByZWNlaXZlci4gVGhpcyBpcyB3aGVyZSBhIHR5cGUgaXMgdXNlZCBhcyB0aGUgcmVjZWl2ZXIgb2YgYSBmaWVsZCBhY2Nlc3Mgb3IgYSBtZXRob2QgaW52b2NhdGlvbi4KLQkgKiAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApPC9jb2RlPikuIEZvciB0aGlzIHRoZSAiamF2YS5sYW5nLlN0cmluZyIgSUJlYW5UeXBlUHJveHkgaXMgdGhlIHR5cGUgcmVjZWl2ZXIuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1bnVzdWFsIGluIHRoYXQgdGhlcmUgaXMgbm8gZm9yRXhwcmVzc2lvbi4gSXQgaXNuJ3QgbmVlZGVkIGJlY2F1c2UgdGhlc2UgYXJlIG9ubHkgdmFsaWQKLQkgKiBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKG1ldGhvZCBvciBmaWVsZCByZWNlaXZlcikgYW5kIGlmIHVzZWQgYW55d2hlcmUgZWxzZSBpdCBpcyBhbiBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHR5cGUgcmVjZWl2ZXIuIFRoaXMgaXMgd2hlcmUgYSB0eXBlIGlzIHVzZWQgYXMgdGhlIHJlY2VpdmVyIG9mIGEgZmllbGQgYWNjZXNzIG9yIGEgbWV0aG9kIGludm9jYXRpb24uCi0JICogKGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKTwvY29kZT4pLiBGb3IgdGhpcyB0aGUgImphdmEubGFuZy5TdHJpbmciIElQcm94eUJlYW5UeXBlIGlzIHRoZSB0eXBlIHJlY2VpdmVyLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdW51c3VhbCBpbiB0aGF0IHRoZXJlIGlzIG5vIGZvckV4cHJlc3Npb24uIEl0IGlzbid0IG5lZWRlZCBiZWNhdXNlIHRoZXNlIGFyZSBvbmx5IHZhbGlkCi0JICogaW4gY2VydGFpbiBzaXR1YXRpb25zIChtZXRob2Qgb3IgZmllbGQgcmVjZWl2ZXIpIGFuZCBpZiB1c2VkIGFueXdoZXJlIGVsc2UgaXQgaXMgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZSBwcm94eS4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHlwZVJlY2VpdmVyKElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBib29sZWFuIHByaW1pdGl2ZSBsaXRlcmFsIChlLmcuIDxjb2RlPnRydWU8L2NvZGU+KS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjaGFyYWN0ZXIgbGl0ZXJhbCAoZS5nLiA8Y29kZT4nYSc8L2NvZGU+IG9yIDxjb2RlPidcbic8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBjaGFyYWN0ZXIgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBjaGFyIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgYnl0ZSBsaXRlcmFsIChlLmcuIDxjb2RlPihieXRlKTEwPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgYnl0ZSB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGJ5dGUgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBkb3VibGUgbGl0ZXJhbCAoZS5nLiA8Y29kZT4xMGQ8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBkb3VibGUgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBkb3VibGUgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmbG9hdCBsaXRlcmFsIChlLmcuIDxjb2RlPjEwZjwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGZsb2F0IHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgZmxvYXQgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgaW50IGxpdGVyYWwgKGUuZy4gPGNvZGU+MTAwMDAwPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgaW50IHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgaW50IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGxvbmcgbGl0ZXJhbCAoZS5nLiA8Y29kZT4xMGw8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBsb25nIHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgbG9uZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBzaG9ydCBsaXRlcmFsIChlLmcuIDxjb2RlPihzaG9ydCkxMDwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHNob3J0IHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgc2hvcnQgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc3RyaW5nIGxpdGVyYWwgKGUuZy4gPGNvZGU+ImFzZGYiPC9jb2RlPikuIFRoZSB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZywgd2l0aCBlc2NhcGVzIGFscmVhZHkKLQkgKiB0cmFuc2xhdGVkIGludG8gdGhlIHRydWUgY2hhcmFjdGVyIHZhbHVlcy4KLQkgKiAgCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBzdWJleHByZXNzaW9uLgotCSAqIDxwPgotCSAqIEEgc3ViZXhwcmVzc2lvbiBhbGxvd3MsIGF0IGFueSB0aW1lLCB0byBmb3JrIG9mZiB0aGUgZXhwcmVzc2lvbiBzdGFjayBhbmQgZG8gc29tZSBvdGhlciBzZXRzIG9mIGV4cHJlc3Npb25zLgotCSAqIFdoZW4gdGhlIGNvb3Jlc3BvbmRpbmcge0BsaW5rICNjcmVhdGVTdWJleHByZXNzaW9uRW5kKCl9IGlzIGNhbGxlZCwgYWxsIG9mIHRoZSBleHByZXNzaW9uIHJlc3VsdHMgb24gdGhlCi0JICogc3RhY2sgdGhhdCBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIHN1YmV4cHJlc3Npb24gZXZhbHVhdGlvbiB3aWxsIGJlIHRocm93biBhd2F5IGFuZCB0aGUgc3RhY2sgd2lsbCBiZQotCSAqIHdoYXQgaXQgd2FzIGF0IHRoZSBzdGFydCBvZiBzdWJleHByZXNzaW9uLiBBbnkgRXhwcmVzc2lvblByb3hpZXMgdGhhdCB3ZXJlIHJlc29sdmVkIGR1cmluZyB0aGUgZXZhbHVhdGlvbiAKLQkgKiB3aWxsIG5vdCBiZSB0aHJvd24gYXdheSBhbmQgd2lsbCBzdGlsbCBiZSB2YWxpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBpZiBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gKHN1Y2ggYXMgbWV0aG9kIGludm9jYXRpb24gYW5kIGFuIGFyZ3VtZW50IGlzIG5lZWRlZCkgdG8KLQkgKiBnbyBvZmYgYW5kIGdldCB0aGUgbmVjZXNzYXJ5IHZhbHVlLiBUaGlzIHdpbGwgYWxsb3cgZXhwcmVzc2lvbnMgdGhhdCByZXF1aXJlIFJPT1RFWFBSRVNTSU9OIHN0YXRlIGxpa2UgYSAKLQkgKiB0cnkvY2F0Y2guIElmIHlvdSBrbm93IHRoZSBleHByZXNzaW9uIGRvZXNuJ3QgbmVlZCB0aGlzLCB0aGVuIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIG5vdCB1c2Ugc3ViZXhwcmVzc2lvbi4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZToKLQkgKiA8cHJlPjxjb2RlPgotCSAqICAgbmV3IFhZWigKLQkgKiAgICAgeyhzdWJleHByZXNzaW9uKQotCSAqICAgICAgdHJ5IHsKLQkgKiAgICAgICAgIHggPSAzKnkuZ2V0KCk7Ci0JICogICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCSAqICAgICAgICAgeCA9NDsKLQkgKiAgICAgIH0KLQkgKiAgICAgKGVuZCBzdWJleHByZXNzaW9uKX0KLQkgKiAgICAgeCk7Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIAotCSAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB3ZSBuZWVkZWQgdG8gY2FsY3VsYXRlICJ4IiBhcyB0aGUgYXJndW1lbnQgZm9yIFhZWiwgYnV0IGl0IHdhcyB0b28gY29tcGxpY2F0ZWQgYW5kCi0JICogY291bGQgdGhyb3cgZXhjZXB0aW9ucy4gU28gd2UgdXNlZCBhIHN1YmV4cHJlc3Npb24gaW5zdGVhZC4gCi0JICogPHA+Ci0JICogT2YgY291cnNlIHRoZSBmb2xsb3dpbmcgd291bGQgb2YgYmVlbiB0aGUgYmV0dGVyIHdheSB0byBkbyBpdCB3aXRob3V0IHN1YmV4cHJlc3Npb25zLiBCdXQgc29tZXRpbWVzCi0JICogeW91ciBjb2RlIGlzIGluIGEgcG9zaXRpb24gdGhhdCB5b3UgZG9uJ3Qga25vdyB5b3UgbmVlZCB0byBkbyB0aGlzIHVudGlsIGl0IGlzIHRvbyBsYXRlLgotCSAqICA8cHJlPjxjb2RlPgotCSAqICAgdHJ5IHsKLQkgKiAgICAgIHggPSAzKnkuZ2V0KCk7Ci0JICogICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCSAqICAgICAgeCA9NDsKLQkgKiAgIH0KLQkgKiAgIG5ldyBYWVooeCk7Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU3ViZXhwcmVzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlU3ViZXhwcmVzc2lvbkVuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGV4cHJlc3Npb24gdGhhdCBoYXMgYW4gZXhpc3RpbmcgYmVhbiBwcm94eSBhcyBpdHMgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24gVGhpcyBpcyBmb3Igd2hhdCBleHByZXNzaW9uIHRoaXMgZXhwcmVzc2lvbiBpcyBiZWluZyBjcmVhdGVkLgotCSAqIEBwYXJhbSBwcm94eSBUaGUgcHJveHkgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhIHZhbHVlLCBlaXRoZXIgYSBiZWFuIHByb3h5IG9yIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eSBwcm94eSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIGJldHdlZW4gYSBWYXJpYWJsZVJlZmVyZW5jZSBhbmQgYW4gZXhwcmVzc2lvbi4gVGhlIGxlZnQgb3BlcmFuZCBtdXN0IGJlIGEgdmFyaWFibGUgcmVmZXJlbmNlIChlLmcuIEZpZWxkQWNjZXNzIG9yCi0JICogQXJyYXlBY2Nlc3MpLiBUaGUgcmlnaHQgb3BlcmFuZCBtYXkgYmUgYW55IGV4cHJlc3Npb24gdGhhdCByZXN1bHRzIGluIGEgdmFsdWUuCi0JICogPHA+Ci0JICogPHByZT4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqICA8Y29kZT5BU1NJR05NRU5UX0xFRlQ8L2NvZGU+Ci0JICogCTxjb2RlPkFTU0lHTk1FTlRfUklHSFQ8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKGUuZy4geCA9IDMrNCkgd2hlcmUgeCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBFeHByZXNzaW9uUHJveHkuIAotCSAqIEl0IG1heSBiZSB1c2VkIGxhdGVyIG9uIGFzIGEgdmFsdWUgaW4ge0BsaW5rIElFeHByZXNzaW9uI2NyZWF0ZUV4cHJlc3Npb25Qcm94eUV4cHJlc3Npb24oaW50LCBFeHByZXNzaW9uUHJveHkpfS4KLQkgKiBPciBpZiBjYWxsYmFja3Mgd2VyZSBhZGRlZCwgdGhlIGNhbGxiYWNrcyB3b3VsZCBiZSBjYWxsZWQgdG8gcmV0dXJuIHRoZSB0cnVlIElCZWFuUHJveHkgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gcHJveHkgd2hlbiB0aGUgY29tcGxldGUKLQkgKiBJRXhwcmVzc2lvbiBoYXMgYmVlbiBldmFsdWF0ZWQuIFRoZSB2YWx1ZSBvZiB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uIChlLmcuIHgpIHdpbGwgYmUgcGFzc2VkIG9uIGludG8gdGhlIG5leHQgZXhwcmVzc2lvbi4KLQkgKiA8cD4KLQkgKiA8cHJlPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkFTU0lHTk1FTlRfUklHSFQ8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IEl0IGlzIGd1YXJlbnRlZWQgYXMgcGFydCBvZiB0aGUgY29udHJhY3QgdGhhdCBleHByZXNzaW9uIHByb3hpZXMgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZSBsaXN0ZW5lcnMgb2YgdGhlIGZpbmFsIHN0YXRlIGluIHRoZQotCSAqIG9yZGVyIHRoZSBleHByZXNzaW9uIHByb3hpZXMgd2VyZSBjcmVhdGVkLiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbiBUaGlzIGlzIGZvciB3aGF0IGV4cHJlc3Npb24gdGhpcyBleHByZXNzaW9uIGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogQHJldHVybiBhIHByb3h5IHRvIHRoZSBleHByZXNzaW9uIHZhbHVlLiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVhc3NpZ25tZW50IGV4cHJlc3Npb24uIFRoaXMgaXMgbGlrZSB0aGUgb3JpZ2luYWwgcHJveHkgYXNzaWdubWVudCBleGNlcHQgdGhhdCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBwcm94eSwgaXQKLQkgKiByZWFzc2lnbnMgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZXhpc3RpbmcgcHJveHkuIFRoaXMgY2Fubm90IGJlIHVzZWQgb24gSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5J3MuIFRoYXQgaXMgYmVjYXVzZQotCSAqIHRoZXkgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ2lzdHJ5IGFuZCBzZXZlcmUgZXJyb3JzIHdvdWxkIG9jY3VyIGlmIHRoZXkgd2VyZSByZWFzc2lnbmVkLgotCSAqIDxwPgotCSAqIDxwcmU+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+QVNTSUdOTUVOVF9SSUdIVDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gU2luY2Ugd2UgYXJlIG5vdCBjcmVhdGluZyBhIG5ldyBwcm94eSwgdGhlIG5vdGlmaWNhdGlvbiBvbiB0aGUgY2FsbGJhY2tzIHdpbGwgYmUgaW4gdGhlIG9yaWdpbmFsIG9yZGVyIG9mIHByb3hpZXMuIFRoaXMKLQkgKiBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5vdGlmaWNhdGlvbiBwb3NpdGlvbiBvZiB0aGlzIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZXhwcmVzc2lvbiBwcm94eSBpcyBmb3IgYSBCZWFuVHlwZSBpbnN0ZWFkIG9mIGp1c3QgYSBzdGFuZGFyZCBleHByZXNzaW9uIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIEV4cHJlc3Npb25Qcm94eSBwcm94eSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEEgc2ltcGxlIG1ldGhvZCBpbnZvY2F0aW9uLiBUaGlzIGlzIGEgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBhIHNpbXBsZSBtZXRob2QgaW52b2tlLiBJdCB1c2VzIG9ubHkgdGhlIAotCSAqIG1ldGhvZCBwcm94eSAobm90IGEgc3RyaW5nIHRvIGxvb2sgaXQgdXApLCBpdCB1c2VzIGEgSUJlYW5Qcm94eSByZWNlaXZlciAobm90IGEgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbiksIGFuZCB0aGUKLQkgKiBhcmd1bWVudHMgYXJlIGEgbWl4dHVyZSBvZiBJQmVhblByb3hpZXMgYW5kIEV4cHJlc3Npb25Qcm94aWVzLiBBbHNvIGl0IGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBuZXh0Ci0JICogZXhwcmVzc2lvbiBtdXN0IGJlIGEgUm9vdEV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIG1ldGhvZCBtZXRob2Rwcm94eSBvZiB0aGUgbWV0aG9kCi0JICogQHBhcmFtIHJlY2VpdmVyIHRoZSByZWNlaXZlciBwcm94eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhIHN0YXRpYyBtZXRob2QKLQkgKiBAcGFyYW0gYXJndW1lbnRzIGFycmF5IG9mIGFyZ3VtZW50cywgd2hlcmUgZWFjaCBlbGVtZW50IGNhbiBvbmx5IGJlIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBudWxsIGFyZ3VtZW50LCA8Y29kZT5JUHJveHk8L2NvZGU+LiBUaGUgYXJyYXkgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFyZ3VtZW50cy4KLQkgKiBAcGFyYW0gd2FudFJlc3VsdCA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBhbiBFeHByZXNzaW9uUHJveHkgYmFjaywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgb25seSB1c2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHJlYWxseSBuZWVkIHRoZSBleHByZXNzaW9uIHByb3h5LgotCSAqIEByZXR1cm4gZXhwcmVzc2lvbiBwcm94eSBpZiAid2FudFJlc3VsdCIgd2FzIHRydWUsIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKElQcm94eU1ldGhvZCBtZXRob2QsIElQcm94eSByZWNlaXZlciwgSVByb3h5W10gYXJndW1lbnRzLCBib29sZWFuIHdhbnRSZXN1bHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEEgc2ltcGxlIGZpZWxkIGFjY2Vzcy4gVGhpcyBpcyBhIGhlbHBlciB0byBtYWtlIGl0IGVhc2llciBmb3IgYSBzaW1wbGUgZmllbGQgYWNjZXNzLiBJdCB1c2VzIG9ubHkgdGhlIAotCSAqIGZpZWxkIHByb3h5IChub3QgYSBzdHJpbmcgdG8gbG9vayBpdCB1cCksIGFuZCB0aGUgYmVhbiBwcm94eSB0aGF0IGlzIHRoZSByZWNlaXZlci4gQWxzbyBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbmV4dAotCSAqIGV4cHJlc3Npb24gbXVzdCBiZSBhIFJvb3RFeHByZXNzaW9uLiBJdCBkb2Vzbid0IGFsbG93IGNvbXBsaWNhdGVkIGZpZWxkIGFjY2Vzcywgc3VjaCBhcyA8Y29kZT5maWVsZGEuZmllbGRiLmZpZWxkYzwvY29kZT4uCi0JICogU2luY2UgdGhpcyBpcyBhIGZpZWxkIGFjY2VzcywgaXQgd2lsbCBhbHdheXMgcmV0dXJuIGFuIEV4cHJlc3Npb25Qcm94eS4gSXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBzaW1wbGUgZmllbGQgYWNjZXNzCi0JICogdGhhdCBkb2Vzbid0IHJldHVybiBvbmUuCi0JICogCi0JICogQHBhcmFtIGZpZWxkIGZpZWxkIHByb3h5IG9mIHRoZSBmaWVsZC4KLQkgKiBAcGFyYW0gcmVjZWl2ZXIgdGhlIHJlY2VpdmVyIHByb3h5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHN0YXRpYyBmaWVsZHMuCi0JICogQHJldHVybiBleHByZXNzaW9uIHByb3h5IHRvIHRoZSByZXN1bHQgb2YgdGhlIGFjY2Vzcy4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVTaW1wbGVGaWVsZEFjY2VzcyhJUHJveHlGaWVsZCBmaWVsZCwgSVByb3h5IHJlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBIHNpbXBsZSBmaWVsZCBzZXQuIFRoaXMgaXMgYSBoZWxwZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGEgc2ltcGxlIGZpZWxkIGFjY2Vzcy4gSXQgdXNlcyBvbmx5IHRoZSAKLQkgKiBmaWVsZCBwcm94eSAobm90IGEgc3RyaW5nIHRvIGxvb2sgaXQgdXApLCBhbmQgdGhlIGJlYW4gcHJveHkgdGhhdCBpcyB0aGUgcmVjZWl2ZXIuIEFsc28gaXQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG5leHQKLQkgKiBleHByZXNzaW9uIG11c3QgYmUgYSBSb290RXhwcmVzc2lvbi4gSXQgZG9lc24ndCBhbGxvdyBjb21wbGljYXRlZCBmaWVsZCBhY2Nlc3Mgc2V0dGluZywgc3VjaCBhcyA8Y29kZT5maWVsZGEuZmllbGRiLmZpZWxkYyA9IDM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBmaWVsZCBmaWVsZCBwcm94eSBvZiB0aGUgZmllbGQuCi0JICogQHBhcmFtIHJlY2VpdmVyIHRoZSByZWNlaXZlciBwcm94eS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMgYSBzdGF0aWMgZmllbGQuCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBwcm94eSB0byBzZXQgaXQgdG8gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc2V0IHRvIG51bGwgdmFsdWUuCi0JICogQHBhcmFtIHdhbnRSZXN1bHQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgYW4gRXhwcmVzc2lvblByb3h5IGJhY2ssIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9ubHkgdXNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSByZWFsbHkgbmVlZCB0aGUgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gcHJveHkgaWYgIndhbnRSZXN1bHQiIHdhcyB0cnVlLCBlbHNlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVNpbXBsZUZpZWxkU2V0KElQcm94eUZpZWxkIGZpZWxkLCBJUHJveHkgcmVjZWl2ZXIsIElQcm94eSB2YWx1ZSwgYm9vbGVhbiB3YW50UmVzdWx0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBCZWdpbiBhIGJsb2NrLiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiA8cD4KLQkgKiBFdmVudHVhbGx5IHtAbGluayBFeHByZXNzaW9uI2NyZWF0ZUJsb2NrRW5kKCl9IG11c3QgYmUgY2FsbGVkLiBZb3Ugc2hvdWxkIHVzZSB0aGlzIHBhdHRlcm46Ci0JICogPHByZT48Y29kZT4KLQkgKiBleHAuY3JlYXRlQmVnaW5CbG9jaygpOwotCSAqIHRyeSB7Ci0JICogICBleHAuY3JlYXRlIHNvbWV0aGluZyBlbHNlLgotCSAqICAgLi4uCi0JICogfSBmaW5hbGx5IHsKLQkgKiAgIGV4cC5jcmVhdGVFbmRCbG9jaygpOwotCSAqIH0KLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogCi0JICogQHJldHVybiBibG9ja251bWJlciBmb3IgdGhlIGJsb2NrIGp1c3Qgb3BlbmVkLiBDYW4gYmUgdXNlZCBpbiB7QGxpbmsgRXhwcmVzc2lvbiNjcmVhdGVCbG9ja0JyZWFrKGludCl9LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludCBjcmVhdGVCbG9ja0JlZ2luKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBEb2VzIGEgYnJlYWsgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sgbnVtYmVyLiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBAcGFyYW0gYmxvY2tOdW1iZXIKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUJsb2NrQnJlYWsoaW50IGJsb2NrTnVtYmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRW5kIGEgYmxvY2suIEl0IHdpbGwgYWx3YXlzIGVuZCB0aGUgaW5uZXIgbW9zdCBibG9jayB0aGF0IGN1cnJlbnRseSBpcyBvbiB0aGUgc3RhY2suIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBFeHByZXNzaW9uI2NyZWF0ZUJsb2NrQmVnaW4oKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUJsb2NrRW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBjYXRjaCBvciBmaW5hbGx5IGNsYXVzZSBiZWZvcmUgdHJ5IGVuZCBvciB0aGlzIGlzIGludmFsaWQuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgZXhlY3V0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0JICogPHByZT48Y29kZT4KLQkgKiBleHAuY3JlYXRlVHJ5KCk7Ci0JICogdHJ5IHsKLQkgKiAgIC4uLiBjcmVhdGUgb3RoZXIgZXhjZXB0aW9ucyAuLi4KLQkgKiAgIC4uLiBjcmVhdGUgY2F0Y2gvZmluYWxseSBjbGF1c2VzIGFzIG5lZWRlZC4KLQkgKiB9IGZpbmFsbHkgewotCSAqICAgaWYgKGV4cC5pc1ZhbGlkKCkpCi0JICogICAgIGV4cC5jcmVhdGVUcnlFbmQoKTsKLQkgKiB9Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVHJ5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQotCS8qKgotCSAqIENyZWF0ZSBhIGNhdGNoIGNsYXVzZSBmb3IgdGhlIGlubmVyIG1vc3QgdHJ5IHN0YXRlbWVudC4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogPHA+Ci0JICogVXNpbmcgdGhpcyB5b3UgY2FuIGdldCBqdXN0IHRoZSBleGNlcHRpb24gYXMgYSBwcm94eSBhbmQvb3IgZXhlY3V0ZSBzb21lIGV4cHJlc3Npb25zIGFzIHBhcnQgb2YgdGhlIGNhdGNoIGNsYXVzZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGNhbiBiZSBmb2xsb3dlZCBieSBSb290RXhwcmVzc2lvbnMsIG9yIGFub3RoZXIgY2F0Y2gsIG9yIGEgZmluYWxseSwgb3IgYSB0cnkgZW5kLgotCSAqICAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIHRvIGNhdGNoIG9uLgotCSAqIEBwYXJhbSB3YW50RXhjZXB0aW9uUmV0dXJuZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIGV4Y2VwdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJveHkgZm9yIHRoZSBleGNlcHRpb24gaWYgPGNvZGU+d2FudEV4Y2VwdGlvblJldHVybmVkPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVRyeUNhdGNoQ2xhdXNlKElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIGJvb2xlYW4gd2FudEV4Y2VwdGlvblJldHVybmVkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjYXRjaCBjbGF1c2UgZm9yIHRoZSBpbm5lciBtb3N0IHRyeSBzdGF0ZW1lbnQuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIDxwPgotCSAqIFVzaW5nIHRoaXMgeW91IGNhbiBnZXQganVzdCB0aGUgZXhjZXB0aW9uIGFzIGEgcHJveHkgYW5kL29yIGV4ZWN1dGUgc29tZSBleHByZXNzaW9ucyBhcyBwYXJ0IG9mIHRoZSBjYXRjaCBjbGF1c2UuCi0JICogPHA+Ci0JICogVGhpcyBjYW4gYmUgZm9sbG93ZWQgYnkgUm9vdEV4cHJlc3Npb25zLCBvciBhbm90aGVyIGNhdGNoLCBvciBhIGZpbmFsbHksIG9yIGEgdHJ5IGVuZC4KLQkgKiAgCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiB0byBjYXRjaCBvbi4KLQkgKiBAcGFyYW0gd2FudEV4Y2VwdGlvblJldHVybmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGFuIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBleGNlcHRpb24uCi0JICogQHJldHVybiB0aGUgRXhwcmVzc2lvblByb3h5IGZvciB0aGUgZXhjZXB0aW9uIGlmIDxjb2RlPndhbnRFeGNlcHRpb25SZXR1cm5lZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UoU3RyaW5nIGV4Y2VwdGlvblR5cGUsIGJvb2xlYW4gd2FudEV4Y2VwdGlvblJldHVybmVkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbmFsbHkgY2xhdXNlIGZvciB0aGUgaW5uZXIgbW9zdCB0cnkgc3RhdGVtZW50LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBUaGVyZSBtdXN0IGJlIG5vIG1vcmUgY2F0Y2ggY2xhdXNlcyBmb3IgdGhlIHRyeSBzdGF0ZW1lbnQgYWZ0ZXIgdGhpcyBmaW5hbGx5IGNsYXVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOzsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGVuZCBvZiB0aGUgaW5uZXIgbW9zdCB0cnkgc3RhdGVtZW50LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBUaGVyZSBtdXN0IGJlIG5vIG1vcmUgY2F0Y2gvZmluYWxseSBjbGF1c2VzIGFmdGVyIHRoaXMgZXhjZXB0IGlmIGEgbmV3IHRyeSBzdGF0ZW1lbnQgaXMgc3RhcnRlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRyeUVuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHRocm93LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBUaGUgbmV4dCBleHByZXNzaW9uIGlzIHRoZSBleGNlcHRpb24gdG8gYmUgdGhyb3duLgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9uIGZvcjoKLQkgKiAJPGNvZGU+VEhST1dfT1BFUkFORDwvY29kZT4KLQkgKiAgCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgcmV0aHJvdy4gVGhpcyBtdXN0IGJlIHdpdGhpbiBhIGNhdGNoIGNsYXVzZSBvciB0aGVyZSBpcyBhbiBlcnJvci4KLQkgKiA8cD4gCi0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvcjoKLQkgKiA8cHJlPjxjb2RlPgotCSAqIHRyeSB7Ci0JICogICAuLiBkbyBzb21ldGhpbmcgLi4KLQkgKiB9IGNhdGNoIChBbkV4Y2VwdGlvbiBlKSB7Ci0JICogICAuLiBkbyBzb21ldGhpbmcgLi4KLQkgKiAgIHRocm93IGU7Ci0JICogfQotCSAqIDwvY29kZT48L3ByZT4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVJldGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JCi0JLyoqCi0JICogTWFyayB0aGUgZXhwcmVzc2lvbiBzdGFjayBzbyB0aGF0IGlmIHRoZXJlIGFyZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb25zIGVycm9ycyB0aGF0IHdvdWxkIG1ha2UgdGhlCi0JICogZXhwcmVzc2lvbiBpbnZhbGlkLCB5b3UgY2FuIHJlc3RvcmUgYmFjayB0byB0aGlzIG1hcmsgcG9pbnQgYW5kIHRoZSBleHByZXNzaW9uIHdpbGwgbm93IGJlIHZhbGlkCi0JICogYWdhaW4gYW5kIGF0IHRoZSBzdGF0ZSBpdCB3YXMgd2hlbiBtYXJrIHdhcyBjcmVhdGVkLiBBbGwgbWFya3MgbXVzdCBiZSBlbmRlZCwgYW5kIGF0IHRoZSBzYW1lIG5lc3RpbmcKLQkgKiBsZXZlbC4KLQkgKiA8cD4KLQkgKiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiA8cD4KLQkgKiBJdCBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBlbmRNYXJrLiBZb3UgbXVzdCB1c2UgPGNvZGU+bWFyazt0cnkvZmluYWxseXtlbmRNYXJrO308L2NvZGU+IGJlY2F1c2UKLQkgKiB0aGUgbWFyay9lbmRNYXJrIG11c3QgbWF0Y2ggdXAuIAotCSAqIDxwcmU+PGNvZGU+Ci0JICogaW50IG1hcmsgPSBleHByZXNzaW9uLm1hcmsoKTsKLQkgKiB0cnkgewotCSAqICAgZXhwcmVzc2lvbi5jcmVhdGUgLi4uCi0JICogfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkgKiAgIHByb2Nlc3MgdGhlIGVycm9yLgotCSAqIH0gZmluYWxseSB7Ci0JICogICBleHByZXNzaW9uLmVuZE1hcmsobWFyayk7IC8vIEFmdGVyIHRoaXMsIHRoZSBleHByZXNzaW9uIHdpbGwgYmUgdmFsaWQgYWdhaW4uCi0JICogfQotCSAqIDwvY29kZT48L3ByZT4KLQkgKiA8cD4KLQkgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgYmUgaW52YWxpZCBuZXN0aW5nLCBhbmQgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gb24gdGhlIGNyZWF0ZVRyeUVuZC4gVGhpcyBpcyBiZWNhdXNlCi0JICogd2UgdHJpZWQgdG8gZW5kIHRoZSBUcnkgc3RhdGVtZW50IHdpdGhpbiB0aGUgbWFyay4gVGhpcyBpcyBpbnZhbGlkIGJlY2F1c2UgaWYgd2UgbGV0IGl0IGdvIHRocm91Z2ggaXQgd291bGQKLQkgKiBvZiBwb3BwZWQgdGhlIHN0YWNrIGFuZCB3aGVuIHdlIGdvdCB0byB0aGUgZW5kTWFyayB0aGUgc3RhY2sgd291bGQgb2YgYmVlbiBwb3BwZWQgcGFzdCBpdCBhbmQgaXQgY291bGQgbm90Ci0JICogYmUgcmVzdG9yZWQgdG8gdGhlIHNhbWUgc3RhdGUgYXMgaXQgd2FzIGF0IHRoZSB0aW1lIG9mIHRoZSBtYXJrLiBUaGUgdHJ5IHdvdWxkIG9mIGFscmVhZHkgYmVlbiBlbmRlZC4KLQkgKiA8cHJlPjxjb2RlPgotCSAqIGV4cHJlc3Npb24uY3JlYXRlVHJ5KCk7Ci0JICogaW50IG1hcmsgPSBleHByZXNzaW9uLm1hcmsoKTsKLQkgKiB0cnkgewotCSAqICAgZXhwcmVzc2lvbi5jcmVhdGUgLi4uCi0JICogICBleHByZXNzaW9uLmNyZWF0ZVRyeUVuZCgpOwotCSAqIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JICogICBwcm9jZXNzIHRoZSBlcnJvci4gVGhlIGV4cHJlc3Npb24gaXMgbm93IGludmFsaWQuCi0JICogfSBmaW5hbGx5IHsKLQkgKiAgIGV4cHJlc3Npb24uZW5kTWFyayhtYXJrKTsgLy8gQWZ0ZXIgdGhpcywgdGhlIGV4cHJlc3Npb24gd2lsbCBiZSB2YWxpZCBhZ2FpbiwgaWYgaXQgaGFkIGdvbmUgaW52YWxpZC4KLQkgKiB9Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIDxwPgotCSAqIElmIG5vdCBhdCBSb290RXhwcmVzc2lvbiBhdCB0aW1lIG9mIG1hcmsoKSByZXF1ZXN0LCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICogQHJldHVybiBtYXJrIG51bWJlciwgdGhpcyBudW1iZXIgd2lsbCBiZSB1c2VkIGluIHRoZSBjb29yZXNwb25kaW5nIGVuZE1hcmsuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2VuZE1hcmsoaW50KQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgbWFyaygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVGhlIGVuZCBtYXJrIGZvciBhIG1hcmsuIAotCSAqIDxwPgotCSAqIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIEBwYXJhbSBtYXJrTnVtYmVyCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI21hcmsoKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE1hcmsoaW50IG1hcmtOdW1iZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWJlMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4dGVuc2lvblJlZ2lzdHJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIEV4dGVuc2lvbnMgcG9pbnQgKCJleHRlbnNpb25zIiBlbGVtZW50cyBvZiB0aGUgIm9yZy5lY2xpcHNlLmplbS5wcm94eS5jb250cmlidXRvcnMiIGV4dGVuc2lvbiBwb2ludCkuCi0gKiA8cD4KLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgY2FsbGVkIHdoZW4gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdHJ5IHR5cGUgZm9yIGEgZ2l2ZW4gY2xhc3NQYXRoL3BsdWdpbiBpcyBwcmVzZW50LgotICogSXQgaXMgdXNlZCB0byByZWdpc3RlciB0aGUgcmVnaXN0cnkgdHlwZSBzcGVjaWZpYyBleHRlbnNpb25zLgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvblJlZ2lzdHJhdGlvbiB7Ci0JCi0JLyoqCi0JICogVGhpcyB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55IGNvbnRyaWJ1dGVUb1JlZ2lzdHJ5J3MgaGF2ZSBiZWVuIGNhbGxlZC4gVHlwaWNhbGx5IGFsbCB0aGF0Ci0JICogc2hvdWxkIGJlIGRvbmUgaW4gaGVyZSBpcyB0byByZWdpc3RlciBleHRlbnNpb24gZmFjdG9yaWVzIG9yIGNvbnN0YW50cy4gSXQgaXMgYmVzdCBpZiBubwotCSAqIGFjdHVhbCBwcm94eSBjYWxscyBhcmUgbWFkZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSByZWdpc3RyeSBkb2VzIG5vdCB5ZXQgaGF2ZSBhbGwgb2YgdGhlIAotCSAqIGFwcHJvcHJpYXRlIGV4dGVuc2lvbnMgcmVnaXN0ZXJlZCBhbmQgaXQgd291bGQgYmUgcG9zc2libGUgdG8gYWNjaWRlbnRseSByZWZlcmVuY2UgYSBiZWFuIHR5cGUKLQkgKiB0aGF0IGhhcyBub3QgeWV0IGhhZCBpdHMgYXBwcm9wcmlhdGUgZmFjdG9yeSByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgaWYgdXNlZCBpbiBtb3JlIHRoYW4gb25lIGV4dGVuc2lvbiBvciBpZiB1c2VkIGluIGEgcGx1Z2luIGFuZCBhIGNvbnRhaW5lciBwYXRoIGFuZCBib3RoIGFyZSBmb3VuZC4KLQkgKiBTaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudCBhbmQgbm90IHJlZ2lzdGVyIHR3aWNlLgotCSAqIEBwYXJhbSBiYXNlUmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgYmFzZVJlZ2lzdHJ5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUZpZWxkUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lGaWVsZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OWRiMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUZpZWxkUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQSBQcm94eSB0byBhIGZpZWxkIHRoYXQgYWxsb3dzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSByZXRyaWV2ZWQgYW5kIHNldAotICogVGhpcyBhbGxvd3MgdGFyZ2V0IFZNIHByb3h5aW5nIG9mIHRoZSBmaWVsZCBhbmQgaXMgYW5hbGFnb3VzIHRvIHRoZSBqYXZhLmxhbmcuUmVmbGVjdC5GaWVsZAotICogaW4gdGhlIHNhbWUgd2F5IElNZXRob2RQcm94eSBpcyBhbmFsYWdvdXMgdG8gamF2YS5sYW5nLlJlZmxlY3QuTWV0aG9kCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoxNzo1MiBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5LCBJUHJveHlGaWVsZCB7Ci0vKioKLSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0gKi8KLUlCZWFuVHlwZVByb3h5IGdldEZpZWxkVHlwZSgpOwotCi0vKioKLSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdXMgb24gdGhlIHN1YmplY3QgYXJndW1lbnQuCi0gKiBJZiB0aGUgZmllbGQgaXMgYSBwcmltaXRpdmUgdHlwZSwgdGhlIHJldHVybiBwcm94eQotICogd2lsbCBiZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgdG9vLiAgCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoyODo0OCBQTSkKLSAqLwotSUJlYW5Qcm94eSBnZXQoSUJlYW5Qcm94eSBhU3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0vKioKLSAqIFNldCB0aGUgYXJndW1lbnQgYXMgdGhlIGZpZWxkIHZhbHVlIG9uIHRoZSBzdWJqZWN0Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjoyODo0OCBQTSkKLSAqLwotdm9pZCBzZXQoSUJlYW5Qcm94eSBhU3ViamVjdCwgSUJlYW5Qcm94eSBhcmd1bWVudCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW50ZWdlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludGVnZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkZDJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW50ZWdlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYW4gaW50ZWdlciBiZWFuIHByb3h5LgotICogV2Ugb3JpZ2luYWxseSBoYWQgb25seSBhbiBJbnRlZ2VyIHByb3h5LAotICogc28gdGhlIHVzZSBvZiBpdCB3YXMgdGhyb3VnaG91dCB0aGUgc3lzdGVtLgotICogV2UgYXJlIG5vdyBzdXBwb3J0aW5nIE51bWJlciBpbnN0ZWFkLCBidXQKLSAqIGJlY2F1c2UgdGhlcmUgd2VyZSBzbyBtYW55IHBsYWNlcyB1c2luZyBpbnQsCi0gKiB3ZSd2ZSBsZWZ0IGl0IGluLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW50ZWdlckJlYW5Qcm94eSBleHRlbmRzIElOdW1iZXJCZWFuUHJveHkgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludm9rYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludm9rYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTUxNjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnZva2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW52b2tpbmcgbWV0aG9kIGNhbGxzIG9uIHRoZSB2bS4KLSAqIElNZXRob2RQcm94eSBpbXBsZW1lbnRzIGl0IGZvciB3aGVuIHlvdSBoYXZlIGEgbWV0aG9kIHByb3h5IGF2YWlsYWJsZSwKLSAqIGJ1dCB5b3UgY2FuIGFsc28gZ2V0IGEgc3RyYWlnaHQgaW52b2thYmxlIHdoaWNoIHdpbGwgZ2V0IHRoZQotICogcHJveHkgb24gdGhlIHZtIGF0IHRoZSB0aW1lIG9mIGV4ZWN1dGlvbi4KLSAqIDxwPgotICogVGhlIG1ldGhvZCBwcm94eSBmYWN0b3J5IGNhbiBiZSB1c2VkIHRvIHJldHVybiBlaXRoZXIgbWV0aG9kCi0gKiBwcm94aWVzIHdoZW4gdGhlIGludm9rYWJsZSB3aWxsIGJlIHVzZWQgb3ZlciBhbmQgb3ZlciwgYW5kCi0gKiBpdCBjYW4gcmV0dXJuIElJbnZva2FibGUncyB3aGVuIGl0IGlzIG9uZSBzaG90IGRlYWwuIFRob3VnaCBldmVuCi0gKiB3aGVuIG9uZS1zaG90IGRlYWwgaXQgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSAKLSAqIG1ldGhvZCBpcyBsb29rZWQgdXAgZWFjaCB0aW1lLiBTbyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZSB3b3VsZCBiZSBpZgotICogdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIHVzZSBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyCi0gKiB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnZva2FibGUgewotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0Ci0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudAotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0LCBob3dldmVyIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JICogT25seSB0byBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgVGhyb3dhYmxlRXhjZXB0aW9ucy4gVGhpcyBzaG91bGQKLQkgKiBub3QgYmUgdGhlIG5vcm1hbCB3YXkgdG8gaW52b2tlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QpOwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudCwgaG93ZXZlciBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCSAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIHlvdSBkb24ndCB3YW50IFRocm93YWJsZUV4Y2VwdGlvbnMuIFRoaXMgc2hvdWxkCi0JICogbm90IGJlIHRoZSBub3JtYWwgd2F5IHRvIGludm9rZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLCBob3dldmVyIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JICogT25seSB0byBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgVGhyb3dhYmxlRXhjZXB0aW9ucy4gVGhpcyBzaG91bGQKLQkgKiBub3QgYmUgdGhlIG5vcm1hbCB3YXkgdG8gaW52b2tlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQ0NDJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBNZXRob2QgUHJveGllcyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNjoyOSBBTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5LCBJSW52b2thYmxlLCBJUHJveHlNZXRob2QgewotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBjbGFzcyB0aGUgbWV0aG9kIGlzIGRlZmluZWQgaW4uIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblR5cGVQcm94eSBnZXRDbGFzc1R5cGUoKTsKLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIG1ldGhvZCBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiAKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblR5cGVQcm94eSBnZXRSZXR1cm5UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2Y2RjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBtZXRob2QgcHJveGllcy4KLSAqIAotICogVGhlIGZhY3RvcnkgZXhpc3RzIGZvciB1c2UsIGJ1dCBnZW5lcmFsbHkgaXQgaXMgYmV0dGVyIHRvIGdvIHRocm91Z2ggdGhlIGJlYW4gdHlwZSBwcm94eSB0byBnZXQgYSBtZXRob2QgcHJveHkuIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEKLSAqIGJ1bmNoIG9mIG1ldGhvZCBwcm94aWVzIGluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHNvIHlvdSBkb24ndCBuZWVkIHRvIGhhdmUgYSBiZWFuIHR5cGUgcHJveHkgZm9yIGVhY2guCi0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDY6MjE6NTIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFByb3h5RmFjdG9yeSBleHRlbmRzIElCZWFuUHJveHlGYWN0b3J5IHsKLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBwcm94eSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBhcmd1bWVudHMgZnJvbSB0aGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogICAgICAgICAgICBwYXJhbWV0ZXIgdHlwZSBuYW1lcyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFyYW1ldGVyVHlwZXMgbWVhbnMgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHByb3h5IG9yIG51bGwgaWYgY2FuJ3QgYmUgZm91bmQuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBJUHJveHlNZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwgYXJndW1lbnRzIGZyb20gdGhlIGdpdmVuIGNsYXNzLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIElQcm94eUZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGFyZ3VtZW50cyBmcm9tIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaW52b2thYmxlIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGFyZ3VtZW50cyBmcm9tIHRoZSBjbGFzcy4gVGhlIG1ldGhvZCBwcm94eSBpcyBub3QgcmV0cmlldmVkLiBJbnN0ZWFkIHRoZSBtZXRob2Qgd2lsbCBiZSBsb29rZWQgdXAKLQkgKiBlYWNoIHRpbWUgb24gdGhlIHZtLiBCZWNhdXNlIG9mIHRoaXMgdGhlc2UgYXJlIHN1aXRhYmxlIG9ubHkgZm9yIG9uZS1zaG90IGludm9rYXRpb25zLiBJZiBpdCBpcyB0byBiZSBpbnZva2VkIG9mdGVuLCB0aGVuIGEgbWV0aG9kIHByb3h5IHNob3VsZAotCSAqIGJlIHJldHJpZXZlZCBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRob3VnaCB0eXBpY2FsIGZvciBvbmUtc2hvdCBkZWFsIHRoZSBpbnZva2FibGUgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSBtZXRob2QgaXMgbG9va2VkIHVwIGVhY2ggdGltZS4gU28gYSByZWFzb25hYmxlIGNvbXByb21pc2UKLQkgKiB3b3VsZCBiZSBpZiB1c2luZyBpdCBpbmZyZXF1ZW50bHkgb3IgaXMgdXNlZCBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIEludm9rYWJsZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIHByb3h5LgotCSAqIDxwPgotCSAqIE5vdGUgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUuIFRoaXMgd29uJ3QgYmUga25vd24gdW50aWwgdGhlIGFjdHVhbCBpbnZva2UgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciB0eXBlIG5hbWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBwYXJhbWV0ZXJUeXBlcyBtZWFucyBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4gYW4gaW52b2thYmxlIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTnVtYmVyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTdhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSU51bWJlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYW4gaW50ZWdlciBiZWFuIHByb3h5LgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTnVtYmVyQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGJ5dGUgdmFsdWUgb2YgdGhlIHByb3hpZWQgTnVtYmVyCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLWJ5dGUgYnl0ZVZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotZG91YmxlIGRvdWJsZVZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGZsb2F0IHZhbHVlIG9mIHRoZSBwcm94aWVkIE51bWJlcgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjU5IEFNKQotICovCi1mbG9hdCBmbG9hdFZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGludCB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotaW50IGludFZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGxvbmcgdmFsdWUgb2YgdGhlIHByb3hpZWQgTnVtYmVyCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLWxvbmcgbG9uZ1ZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgdmFsdWUgYXMgYSBOdW1iZXIuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLU51bWJlciBudW1iZXJWYWx1ZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBzaG9ydCB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotc2hvcnQgc2hvcnRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQREVDb250cmlidXRlQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTY4NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBDb250cmlidXRlIHRvIGNsYXNzcGF0aCBQREUgZW50cmllcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGEgbGF1bmNoLgotICogPHA+IAotICogVXNlIHRoZSA8Y29kZT5JTlNUQU5DRSgpPC9jb2RlPiB0byBhY2Nlc3MgdGhlIGNvbnRyaWJ1dG9yLiBJZiB0aGUgdmFsdWUKLSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIFBERSBpcyBub3QgYXZhaWxhYmxlLgotICogCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBJTlNUQU5DRSA9IFBERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZS5nZXRJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgdGhlIHBsdWdpbnMgaW4gdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGFkZCBpbiB0aGUgbGlicmFyaWVzIGZyb20gYW55IGZyYWdtZW50cyBvZiBhbnkgcGx1Z2luIHRoYXQgdGhpcwotCSAqIHByb2plY3QgcmVmZXJlbmNlcywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCBvdGhlciBwbHVnaW5zLgotCSAqIDxwPgotCSAqIEl0IGlzIHVzZWQgYnkgbGF1bmNoZXMgdG8gZ2V0IHRoZSBmcmFnbWVudCBsaWJyYXJpZXMgc2luY2UgdGhlc2UgYXJlIG5vdAotCSAqIGFkZGVkIGJ5IGRlZmF1bHQgdG8gdGhlIGNsYXNzcGF0aCBmb3IgYSBwcm9qZWN0IGJ5IFBERS4gVGhhdCBpcyBiZWNhdXNlIHRoZXkKLQkgKiBhcmVuJ3QgbmVlZGVkIGZvciBjb21waWxhdGlvbiBwdXJwb3NlcywgYnV0IHRoZXkgYXJlIG5lZWRlZCBmb3IgcnVubmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbGxlciB0aGUgY29udHJvbGxlciB0byBjb250cmlidXRlIHRvLgotCSAqIEBwYXJhbSBpbmZvIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgdGhlIHByb2plY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRQREVDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUG9pbnRCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQb2ludEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDFhNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQb2ludEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBQb2ludCBiZWFuIHByb3h5LgotICogPHA+Ci0gKiBUaGVzZSBhcmUgY29tbW9uIGZvciBkaWZmZXJlbnQgd2luZG93aW5nIHN5c3RlbXMsIGUuZy4gQVdUIGFuZCBTV1QuIFNvIHRoaXMgaGVyZQotICogaXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlbS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgMzo0NjozOSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldFgoKTsKLQlwdWJsaWMgaW50IGdldFkoKTsKLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KTsKLQlwdWJsaWMgdm9pZCBzZXRZKGludCB5KTsKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBwb2ludCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFmODM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0gCi0KLS8qKgotICogQSBjb21tb24gaW50ZXJmYWNlIGZvciBwcm94aWVzLiBJdCBpcyB1c2VkIGJ5IHRoZSBleHByZXNzaW9uIHByb2Nlc3NvciB0byBlYXNpbHkgZGlzdGlucXVpc2ggYmV0d2VlbgotICogYSBwcm94eSBhbmQgYW4gRXhwcmVzc2lvbiBwcm94eS4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHkgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSB0aGlzIHByb3h5IHdhcyBjcmVhdGVkIHdpdGguCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpOwotCQotCS8qKgotCSAqIElzIHRoaXMgYSBiZWFuIHByb3h5IChpbmNsdWRpbmcgYWxsIG9mIHRoZSBzdWJpbnRlcmZhY2VzIG9mIGl0LCBsaWtlIElNZXRob2RQcm94eSkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgYmVhbiBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JlYW5Qcm94eSgpOwotCi0JLyoqCi0JICogSXMgdGhpcyBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlCZWFuVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5QmVhblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MzVhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlCZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBJQmVhblR5cGVQcm94eSdzIGFuZCBCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSdzIHNvIHRoYXQgd2UgY2FuIGxhemlseQotICogZ2V0IHRoZSBiZWFudHlwZSBwcm94eSBhbmQgaGF2ZSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzIGl0IHdoZW4gbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlCZWFuVHlwZSBleHRlbmRzIElQcm94eSB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHR5cGUgd2UgYXJlIHByb3h5aW5nIFRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBGb3IgYXJyYXlzIGl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQ6IFtMY2xhc3NuYW1lOyAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgSVByb3h5TWV0aG9kIGZvciB0aGUgbWV0aG9kIGZyb20gdGhpcyBiZWFudHlwZS4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlIHdoZXJlIHRoZSBtZXRob2QgaGFzIG5vIGFyZ3VtZW50cy4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBnZXRNZXRob2RQcm94eSgpIHRoYXQgdGFrZXMgYXJndW1lbnRzIG5hbWVzIHdoZXJlIHRoZSBuYW1lcyBoYXZlIGJlZW4gc2VudCBhcyBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlLiBJdCBtYXkgYmUgZWl0aGVyIGEgcmVzb2x2ZWQgbWV0aG9kIHByb3h5IChpZiBhbHJlYWR5IHJlc29sdmVkKSBvcgotCSAqIGl0IG1heSBiZSBhbiBFeHByZXNzaW9uUHJveHkgaWYgbm90IHlldCByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIGFycmF5IG9mIHBhcmFtZXRlciB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHl5RmllbGQgZm9yIHRoZSBmaWVsZCBmcm9tIHRoaXMgYmVhbnR5cGUuIEl0IG1heSBiZSBlaXRoZXIgYSByZXNvbHZlZCBmaWVsZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4MTlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotLyoqCi0gKiBDb25zdGFudHMgdXNlZCB3aXRoIHRoZSBwbHVnaW4geG1sLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlDb25zdGFudHMgewotCQotCS8qKgotCSAqIExhdW5jaCBncm91cCBpZCBmb3IgcHJveHkgbGF1bmNoIGNvbmZpZ3VyYXRpb25zLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QUk9YWV9MQVVOQ0hfR1JPVVAgPSAib3JnLmVjbGlwc2UuamVtLnByb3h5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIExhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgZm9yIGxvY2FsIHByb3h5LiBJdCBpcyBsb2NhbCBpbiB0aGF0IGl0IGlzIG9uIHRoZSBzYW1lIG1hY2hpbmUsIGJ1dCBhIGRpZmZlcmVudAotCSAqIFZNIHRoZW4gdGhlIG9uZSBydW5uaW5nIHRoZSBJREUuIAotCSAqIAotCSAqIEl0IGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBkZWZhdWx0IGNvbmZpZyB0eXBlIHdoZW4gbm8gbGF1bmNoIGNvbmZpZyBzcGVjaWZpZWQgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9MQVVOQ0hfVFlQRSA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTG9jYWxQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEF0dHJpYnV0ZSBvbiBQcm94eSBMYXVuY2ggQ29uZmlndXJhdGlvbjoKLQkgKiAKLQkgKiBLZXkgdXNlZCBpbiBMYXVuY2ggQ29uZmlndXJhdGlvbiBmb3IgYXR0YWNoaW5nIEFXVC9Td2luZyB0byB0aGUgcmVnaXN0cnkuIFRoaXMgbWVhbnMgc2ltcGx5Ci0JICogdGhhdCBBV1QvU3dpbmcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmVpbmcgaW4gdGhlIHJlZ2lzdHJ5IG9yIG5vdC4gSXQgZG9lc24ndCBhY3R1YWxseSBwcmV2ZW50Ci0JICogdGhlbSBmcm9tIGJlaW5nIHRoZXJlLgotCSAqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzICJ0cnVlIiwgc28gaXQgc2hvdWxkIGJlIHNldCBvbmx5IHRvICJmYWxzZSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0FXVF9TV0lORyA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuQVdUL1N3aW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEF0dHJpYnV0ZSBvbiBQcm94eSBMYXVuY2ggQ29uZmlndXJhdGlvbjoKLQkgKiAKLQkgKiBLZXkgdXNlZCBpbiBMYXVuY2ggQ29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRyaWJ1dG9ycyBhbmQgcmV0dXJuaW5nIHRoZSByZWdpc3RyeS4gQWZ0ZXIgcmV0cmlldmluZyBrZXksCi0JICogZ28gYmFjayB0byBQcm94eUxhdW5jaFN1cHBvcnQgdG8gcmV0cmlldmUgdGhlIGNvbnRyaWJ1dG9ycy4gQW5kIGl0IHVzZXMgaXQgdG8gcmV0dXJuIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBOb3QgdG8gYmUgc2V0IGJ5IGNvbnRyaWJ1dG9ycy4gVGhpcyB3aWxsIGJlIHNldCBvbmx5IGJ5IHRoZSBQcm94eUxhdW5jaFN1cHBvcnQgc3RhcnQgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4KLQkgKiBJdCBpcyBoZXJlIG9ubHkgYmVjYXVzZSBleHRlcm5hbCBkZXZlbG9wZXIncyBsYXVuY2ggY29uZmlndXJhdGlvbnMgd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0xBVU5DSF9LRVkgPSAib3JnLmVjbGlwc2UuamVtLnByb3h5LkxhdW5jaEtleSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBdHRyaWJ1dGUgb24gUHJveHkgTGF1bmNoIENvbmZpZ3VyYXRpb246Ci0JICogIAotCSAqIFZNIHRpdGxlIHVzZWQgZm9yIHRoZSBsYXVuY2ggcmVnaXN0cnkuCi0JICogCi0JICogTm90IHRvIGJlIHNldCBieSBjb250cmlidXRvcnMuIFRoaXMgd2lsbCBiZSBzZXQgb25seSBieSB0aGUgUHJveHlMYXVuY2hTdXBwb3J0IHN0YXJ0IGltcGxlbWVudGF0aW9uIG1ldGhvZHMuCi0JICogSXQgaXMgaGVyZSBvbmx5IGJlY2F1c2UgZXh0ZXJuYWwgZGV2ZWxvcGVyJ3MgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WTV9USVRMRSA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkudm10aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5RmllbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmUxZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5RmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgSUZpZWxkUHJveHkncyBhbmQgRmllbGRFeHByZXNzaW9uUHJveHkncyBzbyB0aGF0IHdlIGNhbiBsYXppbHkKLSAqIGdldCB0aGUgZmllbGQgcHJveHkgYW5kIGhhdmUgdGhlIGV4cHJlc3Npb24gcHJvY2VzcyBpdCB3aGVuIG5lZWRlZC4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUZpZWxkIGV4dGVuZHMgSVByb3h5IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5TWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MGEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgSU1ldGhvZFByb3h5J3MgYW5kIE1ldGhvZEV4cHJlc3Npb25Qcm94eSdzIHNvIHRoYXQgd2UgY2FuIGxhemlseQotICogZ2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGhhdmUgdGhlIGV4cHJlc3Npb24gcHJvY2VzcyBpdCB3aGVuIG5lZWRlZC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5TWV0aG9kIGV4dGVuZHMgSVByb3h5IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg2NjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lSZWN0YW5nbGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogSW50ZXJmYWNlIHRvIGEgUmVjdGFuZ2xlIGJlYW4gcHJveHkuCi0gKiA8cD4KLSAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGRpZmZlcmVudCB3aW5kb3dpbmcgc3lzdGVtcywgZS5nLiBBV1QgYW5kIFNXVC4gU28gdGhpcyBoZXJlCi0gKiBpcyBjb21tb24gaW50ZXJmYWNlIGZvciB0aGVtLgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCAzOjQ2OjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWN0YW5nbGVCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldFgoKTsKLQlwdWJsaWMgaW50IGdldFkoKTsKLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KTsKLQlwdWJsaWMgdm9pZCBzZXRZKGludCB5KTsKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBwb2ludCk7Ci0JCi0JcHVibGljIGludCBnZXRIZWlnaHQoKTsKLQlwdWJsaWMgaW50IGdldFdpZHRoKCk7Ci0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpOwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBkaW0pOwotCQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0Qm91bmRzKElSZWN0YW5nbGVCZWFuUHJveHkgcmVjdCk7CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUzZTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi0KLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBUaGUgU3RhbmRhcmQgYmFzZSBiZWFuIHByb3h5IGZhY3RvcnkuCi0gKiBUaGlzIGlzIHRoZSBJbnRlcmZhY2UgdGhhdCB0aGUgZGVza3RvcCB3aWxsIHRhbGsKLSAqIHRvLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MDkgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblByb3h5RmFjdG9yeSB7Ci0JCi0vKioKLSAqIEdldCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNU2VydmVyfSBwcm94eSBmb3IgdGhlCi0gKiB0aGlzIHJlZ2lzdHJ5LiBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIHlvdSBuZWVkIHRvIGdpdmUgdGhlIElWTXNlcnZlciB0byBhIHByb3h5IHNvIHRoYXQKLSAqIGl0IGNhbiBhY2Nlc3MgaXQuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBEb2VzIG5vdCBuZWVkIHRvIGJlIGdpdmVuIHRvIGNhbGxiYWNrIHByb3hpZXMgYmVjYXVzZSB0aGV5IGFyZSBnaXZlbgotICogYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNQ2FsbGJhY2tTZXJ2ZXJ9IG9uIGluaXRpYWxpemF0aW9uLCBhbmQKLSAqIHRoYXQgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlIElWTVNlcnZlciBpbnRlcmZhY2UgdG9vLgotICogCi0gKiBAcmV0dXJuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBnZXRJVk1TZXJ2ZXJQcm94eSgpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBpbnRlZ2VyIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElJbnRlZ2VyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50IGFQcmltaXRpdmVJbnRlZ2VyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwcmltaXRpdmUgY2hhcmFjdGVyIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChjaGFyIGFQcmltaXRpdmVDaGFyYWN0ZXIpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBieXRlIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChieXRlIGFQcmltaXRpdmVCeXRlKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwcmltaXRpdmUgc2hvcnQgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKHNob3J0IGFQcmltaXRpdmVTaG9ydCk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGxvbmcgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGxvbmcgYVByaW1pdGl2ZUxvbmcpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBmbG9hdCBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoZmxvYXQgYVByaW1pdGl2ZUZsb2F0KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwcmltaXRpdmUgZG91YmxlIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChkb3VibGUgYVByaW1pdGl2ZURvdWJsZSk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgQm9vbGVhbiBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEJvb2xlYW4gYUJvb2xlYW4pOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIEludGVnZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJbnRlZ2VyIGFuSW50ZWdlcik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgQ2hhcmFjdGVyIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChDaGFyYWN0ZXIgYUNoYXJhY3Rlcik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgTnVtYmVyIGFyZ3VtZW50LCBjYW4gaGFuZGxlIGFueSBvZiB0aGUgbnVtYmVycy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKE51bWJlciBhTnVtYmVyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBzdHJpbmcgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKFN0cmluZyBhU3RyaW5nKTsKLQotLyoqCi0gKiBDb252ZXJ0IHRoZSBub24tcHJpbWl0aXZlIHByb3h5IHRvIGEgcHJpbWl0aXZlIHByb3h5LCBpZiBpdAotICogb2Ygb25lIG9mIHRoZSB3cmFwcGVyIHR5cGVzLiBJZiBub3QsIHRoZW4ganVzdCByZXR1cm4gdGhlIHByb3h5IGFzIGlzLgotICogPHA+Ci0gKiBJLkUuIEJvb2xlYW5DbGFzc1Byb3h5IHdpbGwgY29udmVydCB0byBCb29sZWFuVHlwZVByb3h5LCBidXQgT2JqZWN0Q2xhc3NQcm94eSB3aWxsIGp1c3QgcmV0dXJuIHVuY2hhbmdlZC4KLSAqIEBwYXJhbSBub25QcmltaXRpdmVQcm94eQotICogQHJldHVybiBlaXRoZXIgdGhlIHByaW1pdGl2ZSBwcm94eSB0aGF0IG5vblByaW1pdGl2ZSB3cmFwcGVycywgb3IgdGhlIG5vbi1wcmltaXRpdmUgaWYgbm90IGEgd3JhcHBlciB0eXBlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIElCZWFuUHJveHkgY29udmVydFRvUHJpbWl0aXZlQmVhblByb3h5KElCZWFuUHJveHkgbm9uUHJpbWl0aXZlUHJveHkpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIGJvb2xlYW4gYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChib29sZWFuIGFCb29sZWFuKTsKLS8qKgotICogQ3JlYXRlIGFuIGFycmF5IGJlYW4gcHJveHkuCi0gKgotICogICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZToKLSAqICAgICAgaW50IFszXSBbNF0KLSAqCi0gKiAgIC0gKGludFtdLCBuZXcgaW50WzFdIHsxfSkKLSAqICAgICAgaW50IFsxXQotICoKLSAqICAgLSAoaW50W10sIG5ldyBpbnRbMl0gezIsM30pCi0gKiAgICAgIGludCBbMl0gWzNdCi0gKiAKLSAqCi0gKiAgIC0gKGludFtdLCBudWxsKSBvciAoaW50W10sIG5ldyBpbnRbMF0pIG9yIChpbnQsIG51bGwpIG9yIChpbnQsIG5ldyBpbnRbMF0pCi0gKiAgICAgIGludCBbMF0uLi4KLSAqICAgICBvcgotICogICAgIChpbnRbXVtdLi4uLCBudWxsKSBvciAoaW50W11bXS4uLiwgbmV3IGludFswXSkKLSAqICAgICAgaW50WzBdW10uLi4KLSAqICAgICBUaGlzIGlzIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2Ugd2l0aCBubyBzcGVjaWZpZWQgZGltZW5zaW9ucyBpcyBub3QgdmFsaWQuIAotICoKLSAqICAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pCi0gKiAgICAgIGludFszXVtdCi0gKi8KLXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgIGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50W10gZGltZW5zaW9ucykgdGhyb3dzIFRocm93YWJsZVByb3h5OwotLyoqCi0gKiBDcmVhdGUgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkuIAotICogVGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIGFzIGNhbGxpbmcgCi0gKiAgIGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgbmV3IGludFsxXSB7eH0pCi0gKiB3aGVyZSAneCcgaXMgdGhlIHZhbHVlIHBhc3NlZCBpbiBhcyB0aGUgZGltZW5zaW9uLgotICovCi1wdWJsaWMgSUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50IGRpbWVuc2lvbikgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0vKioKLSAqIENyZWF0ZSBhIGJlYW4gcHJveHkgZnJvbSBhbiBpbml0aWFsaXphdGlvbiBzdHJpbmcuIAotICogPHA+Ci0gKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBiZSBjb21tb25seSB1c2VkLiBUaGF0IGlzIGJlY2F1c2Ugbm8gdHlwZSBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZAotICogb24gdGhlIHJlc3VsdC4gV2hhdGV2ZXIgaXQgZXZhbHVhdGVzIHRvIGJlIHdpbGwgYmUgd2hhdCBpdCBpcy4gSXQgaXMgdXNlZnVsIGZvciB0aGUgcmFyZSBjYXNlcyB3aGVyZSB0aGUgZGVzaXJlZAotICogcmVzdWx0IHR5cGUgaXMgbm90IGtub3duLgotICogPHA+Ci0gKiBJdCBpcyByZWNvbW1lbmRlZCBpbnN0ZWFkIHRvIHVzZSB0aGUgbmV3SW5zdGFuY2UoaW5pdFN0cmluZykgbWV0aG9kIG9uIHRoZSBhcHByb3ByaWF0ZSBJQmVhblR5cGVQcm94eSBzbyB0aGF0IHRoZQotICogcmVzdWx0IGNhbiBiZSB0eXBlLWNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoZSBzdHJpbmcgZXZhbHVhdGVzIHRvIHNvbWV0aGluZyBvZiB0aGF0IHR5cGUuCi0gKiAKLSAqIEBwYXJhbSBpbml0aWFsaXphdGlvblN0cmluZwotICogQHJldHVybgotICogQHRocm93cyBUaHJvd2FibGVQcm94eQotICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIElCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5RnJvbShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgQ2xhc3NDYXN0RXhjZXB0aW9uOwotCi0vKioKLSAqIFJlbGVhc2UgdGhlIHByb3h5LiBJbiB0aGUgY2FzZSBvZiBSZW1vdGUgVk0sIHRoaXMgbWVhbnMKLSAqIGl0IHdpbGwgcmVtb3ZlIHRoZSBwcm94eSBvbiB0aGUgY2xpZW50IHNpZGUsIGFuZCByZW1vdmUKLSAqIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIgc2lkZS4gT24gdGhlIHNlcnZlcgotICogc2lkZSB0aGUgcmVhbCBvYmplY3QgbWF5IG5vdCBnbyBhd2F5IGJlY2F1c2Ugc29tZXRoaW5nIGVsc2UgY291bGQKLSAqIGJlIGhvbGRpbmcgb250byBpdCwgYnV0IGl0IHdvbid0IGJlIGhlbGQgc2ltcGx5IGJlY2F1c2UgdGhlIGNsaWVudAotICogaXMgaG9sZGluZyBvbnRvIGl0LgotICovCi1wdWJsaWMgdm9pZCByZWxlYXNlUHJveHkoSUJlYW5Qcm94eSBwcm94eSk7Ci0KLS8qKgotICogQ3JlYXRlIGFuIGV4cHJlc3Npb24uCi0gKiBAcmV0dXJuIFRoZSBleHByZXNzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIElFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RmN2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotLyoqCi0gKiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnkuCi0gKiBUaGlzIGlzIHRoZSBJbnRlcmZhY2UgdGhhdCB0aGUgZGVza3RvcCB3aWxsIHRhbGsKLSAqIHRvLCB0aGUgb25lIHRoYXQgaXMgcmV0dXJuZWQgd2hlbiBnZXRDdXJyZW50KCkgaXMgY2FsbGVkLgotICogQ3JlYXRpb24gZGF0ZTogKDMvMTAvMDAgMTE6MDA6NTAgQU0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblByb3h5RmFjdG9yeSB7Ci0JCi0vKioKLSAqIFVzZWQgYnkgb3RoZXIgcmVnaXN0ZXJlZCBiZWFuIHR5cGUgcHJveHkgZmFjdG9yaWVzIHRvCi0gKiByZWdpc3RlciB0aGVpciBiZWFuIHR5cGUgcHJveGllcyB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogVXNlZCBieSBvdGhlciByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3JpZXMgdG8KLSAqIHJlZ2lzdGVyIHRoZWlyIHByb3h5IGJlYW4gdHlwZSB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBiZWFuVHlwZSBwcm94eSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gKiBJdCBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZC4gQW5kIGZvciBhcnJheXMgaXQgY2FuIGhhbmRsZQotICogZWl0aGVyIHRoZSBqbmkgdHlwZSAoW0xqYXZhLmxhbmcuT2JqZWN0Oykgb3IgdGhlIEphdmEgRU1GIE1vZGVsCi0gKiBmb3JtYWwgdHlwZSAoamF2YS5sYW5nLk9iamVjdFtdKS4KLSAqLwotSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlIHByb3h5IHN1aXRhYmxlIGZvciBhbiBleHByZXNzaW9uLgotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIHR5cGVOYW1lCi0gKiBAcmV0dXJuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1JUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSk7Ci0KLS8qKgotICogUmV0dXJuIGFuIEFycmF5IHR5cGUgcHJveHkgZm9yIHRoZSBnaXZlbiBjbGFzcyBuYW1lIG9mCi0gKiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLiBUaGUKLSAqIHNhbWUgcmVzdWx0IGNhbiBiZSBnb3R0b24gZnJvbSBnZXRCZWFuVHlwZVByb3h5LgotICogZS5nLgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgMykKLSAqICAgIGlzIHRoZSBzYW1lIGFzOgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbW1tMamF2YS5sYW5nLk9iamVjdDsiKQotICoKLSAqICAgIFRoZXkgYm90aCByZXN1bHQgaW4gYSB0eXBlIG9mOgotICogICAgICBPYmplY3QgW11bXVtdCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBKTkkgZm9ybWF0IChwcm94eSBmb3JtYXQpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoIltMamF2YS5sYW5nT2JqZWN0OyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXSAKLSAqIAotICogICAgb3IgaWYgdXNpbmcgdGhlIHN0YW5kYXJkIGphdmEgZm9ybWF0IChhcyBpbiBhY3R1YWwgY29kZSkKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nT2JqZWN0W107IiwgMykKLSAqICAgIGJlY29tZXMKLSAqICAgICAgT2JqZWN0IFtdW11bXVtdCi0gKi8KLUlCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFJldHVybiBhbiBBcnJheSB0eXBlIHByb3h5IGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvZgotICogdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZC4gVGhlCi0gKiBzYW1lIHJlc3VsdCBjYW4gYmUgZ290dG9uIGZyb20gZ2V0QmVhblR5cGVQcm94eS4KLSAqIGUuZy4KLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsIDMpCi0gKiAgICBpcyB0aGUgc2FtZSBhczoKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiW1tbTGphdmEubGFuZy5PYmplY3Q7IikKLSAqCi0gKiAgICBUaGV5IGJvdGggcmVzdWx0IGluIGEgdHlwZSBvZjoKLSAqICAgICAgT2JqZWN0IFtdW11bXQotICogCi0gKiAgICBvciBpZiB1c2luZyB0aGUgSk5JIGZvcm1hdCAocHJveHkgZm9ybWF0KQotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZ09iamVjdDsiLCAzKQotICogICAgYmVjb21lcwotICogICAgICBPYmplY3QgW11bXVtdW10gCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBzdGFuZGFyZCBqYXZhIGZvcm1hdCAoYXMgaW4gYWN0dWFsIGNvZGUpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZ09iamVjdFtdOyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXQotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZQotICogQHBhcmFtIGRpbWVuc2lvbnMKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLUlQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFRlc3QgaWYgYSBzcGVjaWZpYyBiZWFuIHR5cGUgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gRG9uJ3QgYWNjZXNzIGFuZCBjcmVhdGUKLSAqIGlmIGl0IGlzbid0IGN1cnJlbnRseSByZWdpc3RlcmVkLgotICovCi1ib29sZWFuIGlzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZyBjbGFzc05hbWUpOwotCi0vKioKLSAqIFJlZ2lzdGVyZWQgdHlwZXMuIFJldHVybiBhIHNldCBvZiBzdHJpbmdzIHRoYXQgYXJlIHRoZSByZWdpc3RlcmVkIGNsYXNzZXMuCi0gKiBUaGlzIFNldCBpc24ndCBzeW5jaHJvbml6ZWQsIHRoZXJlIG1heSBiZSBjaGFuZ2VzIHdoaWxlIGFjY2Vzc2luZyBpdC4KLSAqLwotU2V0IHJlZ2lzdGVyZWRUeXBlcygpOwotCi0vKioKLSAqIE1haW50YWluIGxpc3Qgb2Ygbm90IGZvdW5kIHR5cGVzLiBUaGlzIGxpc3QgaXMgdHlwZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCwKLSAqIGJ1dCBkaWRuJ3QgZXhpc3QuIFRoaXMgbWV0aG9kIHNldHMgd2hldGhlciBsaXN0IHNob3VsZCBiZSBtYWludGFpbmVkIG9yIG5vdC4KLSAqIElmIHNldCB0byBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSBtYWludGFpbgotICovCi12b2lkIHNldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuIG1haW50YWluKTsKLQotLyoqCi0gKiBNYWludGFpbiBsaXN0IG9mIG5vdCBmb3VuZCB0eXBlcy4gVGhpcyBsaXN0IGlzIHR5cGVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQsCi0gKiBidXQgZGlkbid0IGV4aXN0LiBUaGlzIG1ldGhvZCByZXR1cm5zIHdoZXRoZXIgbGlzdCBzaG91bGQgYmUgbWFpbnRhaW5lZCBvciBub3QuCi0gKiBJZiBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEByZXR1cm4gbWFpbnRhaW5pbmcgbm90IGZvdW5kIHR5cGVzLgotICovCi1ib29sZWFuIGlzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCk7Ci0KLS8qKgotICogTWFpbnRhaW4gbGlzdCBvZiBub3QgZm91bmQgdHlwZXMuIFRoaXMgbGlzdCBpcyB0eXBlcyB0aGF0IHdlcmUgcmVxdWVzdGVkLAotICogYnV0IGRpZG4ndCBleGlzdC4gCi0gKgotICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzc25hbWUgdG8gc2VhcmNoIGZvciB0byBzZWUgaWYgZXZlciBub3QgZm91bmQuCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJlYW4gdHlwZSBoYWQgYmVlbiBzZWFyY2hlZCBmb3IgYnV0IHdhcyBub3QgZm91bmQuIElmIG5vdCBtYWludGFpbmluZywgdGhlbiByZXN1bHQgd2lsbCBiZSBmYWxzZS4KLSAqLwotYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3OGZhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RyaW5nQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBzdHJpbmcgcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cmluZ0JlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgc3RyaW5nIGFzIGEgc3RyaW5nIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLVN0cmluZyBzdHJpbmdWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVVJUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NmMyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0gCi0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZG9lc24ndCByZXF1aXJlIFVJLiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbC4gVGhpcyB3aWxsCi0gKiBvbmx5IGJlIHVzZWQgaWYgd2l0aGluIFVJIGVudmlyb25tZW50LgotICogCi0gKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoaW4gaGVyZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWludGVyZmFjZSBJVUlSdW5uZXIgewotCS8qKgotCSAqIEhhbmRsZSB0aGUgYnVpbGQuIElmIG5vdCBpbiBVSSB0aHJlYWQsIGp1c3QgY2FsbCBiYWNrIHRvIFByb3h5TGF1bmNoU3VwcG9ydAotCSAqIHRvIGhhbmRsZSB0aGUgYnVpbGQuIElmIG9uIFVJIHRocmVhZCwgdGhlbiB1c2UgdGhlIElQcm9ncmVzc1NlcnZpY2UgdG8gZG8gaXQuCi0JICogVGhpcyB3aWxsIGtlZXAgdGhlIFVJIGZyb20gImxvY2tpbmciLCB0aG91Z2ggaXQgd2lsbCBiZSBkaXNhYmxlZCBpdCB3b24ndCBkZWFkbG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcG0KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVCdWlsZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0l0ZXJhdG9yQmVhblByb3h5V3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjY0ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkl0ZXJhdG9yIHByb3h5LgotICogSXQgcHJvdmlkZXMgdGhlIGl0ZXJhdG9yIG1ldGhvZHMgdG8gaW50ZXJmYWNlIHRvCi0gKiB0aGUgcHJveHkuCi0gKi8KLQotcHVibGljIGNsYXNzIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIElCZWFuUHJveHkgZkl0ZXJhdG9yOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgZkNvbnN0YW50czsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYW5JdGVyYXRvclByb3h5KSB7Ci0JCWlmICghYW5JdGVyYXRvclByb3h5LmdldFR5cGVQcm94eSgpLmlzS2luZE9mKGFuSXRlcmF0b3JQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkl0ZXJhdG9yIikpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5TWVzc2FnZXMuQ2xhc3NDYXN0X0VYQ19fSW5jb3JyZWN0VHlwZSwgbmV3IE9iamVjdFtdIHthbkl0ZXJhdG9yUHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgImphdmEudXRpbC5JdGVyYXRvciJ9KSk7ICAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWZJdGVyYXRvciA9IGFuSXRlcmF0b3JQcm94eTsKLQkJCQotCQlmQ29uc3RhbnRzID0gSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgaXRlcmF0b3IgcHJveHkgdGhhdCB0aGlzIGlzIHdyYXBwZXJpbmcuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KCkgewotCQlyZXR1cm4gZkl0ZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIGVxdWFscyAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmSXRlcmF0b3IuZXF1YWxzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIGhhc2hDb2RlIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZJdGVyYXRvci5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBJdGVyYXRvciBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0SXRlcmF0b3JIYXNOZXh0KCkuaW52b2tlKGZJdGVyYXRvcikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgbmV4dCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldEl0ZXJhdG9yTmV4dCgpLmludm9rZShmSXRlcmF0b3IpOwotCX0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJZkNvbnN0YW50cy5nZXRJdGVyYXRvclJlbW92ZSgpLmludm9rZShmSXRlcmF0b3IpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9KYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0phdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ2ZjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0phdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogU3RhbmRhcmQgUHJveHkgY29uc3RhbnRzLgotICoKLSAqIFVzZSB0aGUgc3RhdGljIGFjY2Vzc29yIG1ldGhvZCAoZ2V0Q29uc3RhbnRzKCkpIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgCi0gKiBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSByZWdpc3RyeS4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdW50aWwgdGhlCi0gKiB0aGUgY29uc3RhbnRzIGFyZSBuZWVkZWQsIHRoZXkgYXJlbid0IHJlZ2lzdGVyZWQuCi0gKgotICogVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgdXRpbGl0eSBmdW5jdGlvbnMgdG9vLgotICoKLSAqIE5PVEU6IFNpbmNlIGV2ZXJ5dGhpbmcgaW4gaGVyZSBqdXN0IHByb3hpZXMsIHRoZXJlIGlzCi0gKiAgICAgICBubyBuZWVkIHRvIGhhdmUgdGhlbSBzZXBhcmF0ZWQgYnkgVk0uIFRoYXQgaXMgd2h5Ci0gKiAgICAgICB0aGlzIGluIHRoZSBQcm94eSBwYWNrYWdlLgotICoKLSAqIFRoaXMgaXMgZmluYWwgYmVjYXVzZSB0aGlzIGNhbid0IGJlIGV4dGVuZGVkLiBUaGlzIHNwZWNpZmljIG9uZQotICogd2lsbCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoaXMga2V5LiBBbnkgZXh0ZW5zaW9ucwotICogbXVzdCBiZSBkb25lIGluIHRoZWlyIG93biBjb25zdGFudHMgYW5kIHJlZ2lzdHJ5IGtleS4KLSAqCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC83LzAwIDQ6NDc6NDggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR0lTVFJZX0tFWSA9IG5ldyBPYmplY3QoKTsKLQkJCi0JZmluYWwgSUJlYW5UeXBlUHJveHkgZkNvbGxlY3Rpb25UeXBlOwotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZMaXN0VHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmSXRlcmF0b3JUeXBlOwotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZMaXN0SXRlcmF0b3JUeXBlOwotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZFbnVtZXJhdGlvblR5cGU7CQotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZTeXN0ZW1UeXBlOwotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZTdHJpbmdUeXBlOwotCQotCUlNZXRob2RQcm94eSBmQ29sbGVjdGlvbkFkZCwgZkNvbGxlY3Rpb25BZGRBbGwsIGZDb2xsZWN0aW9uQ2xlYXIsIGZDb2xsZWN0aW9uQ29udGFpbnMsCi0JCWZDb2xsZWN0aW9uQ29udGFpbnNBbGwsIGZDb2xsZWN0aW9uSXNFbXB0eSwgZkNvbGxlY3Rpb25JdGVyYXRvciwgZkNvbGxlY3Rpb25SZW1vdmUsCi0JCWZDb2xsZWN0aW9uUmVtb3ZlQWxsLCBmQ29sbGVjdGlvblJldGFpbkFsbCwgZkNvbGxlY3Rpb25TaXplLCBmQ29sbGVjdGlvblRvQXJyYXksCi0JCWZDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheTsKLQkJCi0JSU1ldGhvZFByb3h5IGZMaXN0QWRkV2l0aEludCwgZkxpc3RBZGRBbGxXaXRoSW50LCBmTGlzdEdldCwgZkxpc3RJbmRleE9mLCBmTGlzdExhc3RJbmRleE9mLAotCQlmTGlzdExpc3RJdGVyYXRvciwgZkxpc3RMaXN0SXRlcmF0b3JXaXRoSW50LCBmTGlzdFJlbW92ZUludCwgCi0JCWZMaXN0U2V0LCBmTGlzdFN1Ykxpc3Q7Ci0JCQotCUlNZXRob2RQcm94eSBmSXRlcmF0b3JIYXNOZXh0LCBmSXRlcmF0b3JOZXh0LCBmSXRlcmF0b3JSZW1vdmU7Ci0KLQlJTWV0aG9kUHJveHkgZkxpc3RJdGVyYXRvckFkZCwgZkxpc3RJdGVyYXRvckhhc1ByZXZpb3VzLCBmTGlzdEl0ZXJhdG9yTmV4dEluZGV4LCBmTGlzdEl0ZXJhdG9yUHJldmlvdXMsCi0JCWZMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4LCBmTGlzdEl0ZXJhdG9yUmVtb3ZlLCBmTGlzdEl0ZXJhdG9yU2V0OwotCQkKLQlJTWV0aG9kUHJveHkgZkVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzLCBmRW51bWVyYXRpb25OZXh0RWxlbWVudDsKLQkKLQlJTWV0aG9kUHJveHkgZlN5c3RlbUFycmF5Y29weTsKLQotLyoqCi0gKiBHZXQgdGhlIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3RyeS4KLSAqLwotcHVibGljIHN0YXRpYyBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgZ2V0Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGNvbnN0YW50cyA9IChKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudHMoUkVHSVNUUllfS0VZLCBjb25zdGFudHMgPSBuZXcgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKHJlZ2lzdHJ5KSk7CQotCXJldHVybiBjb25zdGFudHM7Ci19Ci0KLQotLyoqCi0gKiBJREVKYXZhQmVhbkNvbnN0YW50cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wcml2YXRlIEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCXN1cGVyKCk7Ci0JCi0JSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCWZDb2xsZWN0aW9uVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCWZMaXN0VHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQlmSXRlcmF0b3JUeXBlID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlmTGlzdEl0ZXJhdG9yVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0SXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCWZFbnVtZXJhdGlvblR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuRW51bWVyYXRpb24iKTsJIC8vJE5PTi1OTFMtMSQKLQlmU3lzdGVtVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TeXN0ZW0iKTsgLy8kTk9OLU5MUy0xJAotCWZTdHJpbmdUeXBlID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlN0cmluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRTdHJpbmdUeXBlKCkgewotCXJldHVybiBmU3RyaW5nVHlwZTsKLX0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG1ldGhvZCBhY2Nlc3NvcnMKLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQWRkKCkgewotCWlmIChmQ29sbGVjdGlvbkFkZCA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkFkZCA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiYWRkIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQWRkOwotfQotCQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQWRkQWxsKCl7Ci0JaWYgKGZDb2xsZWN0aW9uQWRkQWxsID09IG51bGwpCi0JCWZDb2xsZWN0aW9uQWRkQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJhZGRBbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQWRkQWxsOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25DbGVhcigpIHsKLQlpZiAoZkNvbGxlY3Rpb25DbGVhciA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkNsZWFyID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJjbGVhciIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQ2xlYXI7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkNvbnRhaW5zKCkgewotCWlmIChmQ29sbGVjdGlvbkNvbnRhaW5zID09IG51bGwpCi0JCWZDb2xsZWN0aW9uQ29udGFpbnMgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoImNvbnRhaW5zIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQ29udGFpbnM7Ci19Ci0JCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25Db250YWluc0FsbCgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Db250YWluc0FsbCA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkNvbnRhaW5zQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJjb250YWluc0FsbCIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNvbGxlY3Rpb25Db250YWluc0FsbDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uSXNFbXB0eSgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Jc0VtcHR5ID09IG51bGwpCi0JCWZDb2xsZWN0aW9uSXNFbXB0eSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiaXNFbXB0eSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uSXNFbXB0eTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uSXRlcmF0b3IgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25JdGVyYXRvciA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmQ29sbGVjdGlvbkl0ZXJhdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25SZW1vdmUoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uUmVtb3ZlID09IG51bGwpCi0JCWZDb2xsZWN0aW9uUmVtb3ZlID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJyZW1vdmUiLCAiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNvbGxlY3Rpb25SZW1vdmU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvblJlbW92ZUFsbCgpIHsKLQlpZiAoZkNvbGxlY3Rpb25SZW1vdmVBbGwgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25SZW1vdmVBbGwgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZUFsbCIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNvbGxlY3Rpb25SZW1vdmVBbGw7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvblJldGFpbkFsbCgpIHsKLQlpZiAoZkNvbGxlY3Rpb25SZXRhaW5BbGwgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25SZXRhaW5BbGwgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoInJldGFpbkFsbCIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNvbGxlY3Rpb25SZXRhaW5BbGw7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvblNpemUoKSAgewotCWlmIChmQ29sbGVjdGlvblNpemUgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25TaXplID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJzaXplIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkNvbGxlY3Rpb25TaXplOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25Ub0FycmF5KCkgewotCWlmIChmQ29sbGVjdGlvblRvQXJyYXkgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25Ub0FycmF5ID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJ0b0FycmF5Iik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkNvbGxlY3Rpb25Ub0FycmF5OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5KCkgewotCWlmIChmQ29sbGVjdGlvblRvQXJyYXlXaXRoQXJyYXkgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5ID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJ0b0FycmF5IiwgIltMamF2YS5sYW5nLk9iamVjdDsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheTsKLX0KLQotLyoqCi0gKiBJdGVyYXRvciBhY2Nlc3NvcnMKLSAqLwotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEl0ZXJhdG9ySGFzTmV4dCgpIHsKLQlpZiAoZkl0ZXJhdG9ySGFzTmV4dCA9PSBudWxsKQotCQlmSXRlcmF0b3JIYXNOZXh0ID0gZkl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgiaGFzTmV4dCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZJdGVyYXRvckhhc05leHQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0SXRlcmF0b3JOZXh0KCkgewotCWlmIChmSXRlcmF0b3JOZXh0ID09IG51bGwpCi0JCWZJdGVyYXRvck5leHQgPSBmSXRlcmF0b3JUeXBlLmdldE1ldGhvZFByb3h5KCJuZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkl0ZXJhdG9yTmV4dDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRJdGVyYXRvclJlbW92ZSgpIHsKLQlpZiAoZkl0ZXJhdG9yUmVtb3ZlID09IG51bGwpCi0JCWZJdGVyYXRvclJlbW92ZSA9IGZJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZJdGVyYXRvclJlbW92ZTsKLX0KLQotLyoqCi0gKiBMaXN0YWNjZXNzb3JzCi0gKi8KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0QWRkV2l0aEludCgpIHsKLQlpZiAoZkxpc3RBZGRXaXRoSW50ID09IG51bGwpCi0JCWZMaXN0QWRkV2l0aEludCA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgiYWRkIiwgbmV3IFN0cmluZ1tdIHsiaW50IiwgImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZMaXN0QWRkV2l0aEludDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0QWRkQWxsV2l0aEludCgpIHsKLQlpZiAoZkxpc3RBZGRBbGxXaXRoSW50ID09IG51bGwpCi0JCWZMaXN0QWRkQWxsV2l0aEludCA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgiYWRkQWxsIiwgbmV3IFN0cmluZ1tdIHsiaW50IiwgImphdmEudXRpbC5Db2xsZWN0aW9uIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdEFkZEFsbFdpdGhJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEdldCgpIHsKLQlpZiAoZkxpc3RHZXQgPT0gbnVsbCkKLQkJZkxpc3RHZXQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImdldCIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0R2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJbmRleE9mKCkgewotCWlmIChmTGlzdEluZGV4T2YgPT0gbnVsbCkKLQkJZkxpc3RJbmRleE9mID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJpbmRleE9mIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0SW5kZXhPZjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0TGFzdEluZGV4T2YoKSB7Ci0JaWYgKGZMaXN0TGFzdEluZGV4T2YgPT0gbnVsbCkKLQkJZkxpc3RMYXN0SW5kZXhPZiA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgibGFzdEluZGV4T2YiLCAiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkxpc3RMYXN0SW5kZXhPZjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0TGlzdEl0ZXJhdG9yKCkgewotCWlmIChmTGlzdExpc3RJdGVyYXRvciA9PSBudWxsKQotCQlmTGlzdExpc3RJdGVyYXRvciA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgibGlzdEl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RMaXN0SXRlcmF0b3I7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdExpc3RJdGVyYXRvcldpdGhJbnQoKSB7Ci0JaWYgKGZMaXN0TGlzdEl0ZXJhdG9yV2l0aEludCA9PSBudWxsKQotCQlmTGlzdExpc3RJdGVyYXRvcldpdGhJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImxpc3RJdGVyYXRvciIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0TGlzdEl0ZXJhdG9yV2l0aEludDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0UmVtb3ZlSW50KCkgewotCWlmIChmTGlzdFJlbW92ZUludCA9PSBudWxsKQotCQlmTGlzdFJlbW92ZUludCA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgicmVtb3ZlIiwgImludCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkxpc3RSZW1vdmVJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdFNldCgpIHsKLQlpZiAoZkxpc3RTZXQgPT0gbnVsbCkKLQkJZkxpc3RTZXQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoInNldCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdFNldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0U3ViTGlzdCgpIHsKLQlpZiAoZkxpc3RTdWJMaXN0ID09IG51bGwpCi0JCWZMaXN0U3ViTGlzdCA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgic3ViTGlzdCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZMaXN0U3ViTGlzdDsKLX0KLQotLyoqCi0gKiBMaXN0SXRlcmF0b3IgYWNjZXNzb3JzCi0gKi8KLSAKLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yQWRkKCkgewotCWlmIChmTGlzdEl0ZXJhdG9yQWRkID09IG51bGwpCi0JCWZMaXN0SXRlcmF0b3JBZGQgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgiYWRkIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JBZGQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMoKSB7Ci0JaWYgKGZMaXN0SXRlcmF0b3JIYXNQcmV2aW91cyA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgiaGFzUHJldmlvdXMiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmTGlzdEl0ZXJhdG9ySGFzUHJldmlvdXM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yTmV4dEluZGV4KCkgewotCWlmIChmTGlzdEl0ZXJhdG9yTmV4dEluZGV4ID09IG51bGwpCi0JCWZMaXN0SXRlcmF0b3JOZXh0SW5kZXggPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgibmV4dEluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RJdGVyYXRvck5leHRJbmRleDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0SXRlcmF0b3JQcmV2aW91cygpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclByZXZpb3VzID09IG51bGwpCi0JCWZMaXN0SXRlcmF0b3JQcmV2aW91cyA9IGZMaXN0SXRlcmF0b3JUeXBlLmdldE1ldGhvZFByb3h5KCJwcmV2aW91cyIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JQcmV2aW91czsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4KCkgewotCWlmIChmTGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCA9IGZMaXN0SXRlcmF0b3JUeXBlLmdldE1ldGhvZFByb3h5KCJwcmV2aW91c0luZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RJdGVyYXRvclByZXZpb3VzSW5kZXg7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yU2V0KCkgewotCWlmIChmTGlzdEl0ZXJhdG9yU2V0ID09IG51bGwpCi0JCWZMaXN0SXRlcmF0b3JTZXQgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgic2V0IiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JTZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yUmVtb3ZlKCkgewotCWlmIChmTGlzdEl0ZXJhdG9yUmVtb3ZlID09IG51bGwpCi0JCWZMaXN0SXRlcmF0b3JSZW1vdmUgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgicmVtb3ZlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RJdGVyYXRvclJlbW92ZTsKLX0KLQotcHJvdGVjdGVkIElNZXRob2RQcm94eSBnZXRTeXN0ZW1BcnJheWNvcHkoKSB7Ci0JaWYgKGZTeXN0ZW1BcnJheWNvcHkgPT0gbnVsbCkKLQkJZlN5c3RlbUFycmF5Y29weSA9IGZTeXN0ZW1UeXBlLmdldE1ldGhvZFByb3h5KCJhcnJheWNvcHkiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCIsICJqYXZhLmxhbmcuT2JqZWN0IiwgImludCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JcmV0dXJuIGZTeXN0ZW1BcnJheWNvcHk7Ci19Ci0KLS8qKgotICogRW51bWVyYXRpb24gYWNjZXNzb3JzCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHMoKSB7Ci0JaWYgKGZFbnVtZXJhdGlvbkhhc01vcmVFbGVtZW50cyA9PSBudWxsKQotCQlmRW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHMgPSBmRW51bWVyYXRpb25UeXBlLmdldE1ldGhvZFByb3h5KCJoYXNNb3JlRWxlbWVudHMiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmRW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RW51bWVyYXRpb25OZXh0RWxlbWVudCgpIHsKLQlpZiAoZkVudW1lcmF0aW9uTmV4dEVsZW1lbnQgPT0gbnVsbCkKLQkJZkVudW1lcmF0aW9uTmV4dEVsZW1lbnQgPSBmRW51bWVyYXRpb25UeXBlLmdldE1ldGhvZFByb3h5KCJuZXh0RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZFbnVtZXJhdGlvbk5leHRFbGVtZW50OwotfQotCi0vKioKLSAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29weSBhbiBhcnJheS4KLSAqLwotcHVibGljIHZvaWQgYXJyYXljb3B5KElCZWFuUHJveHkgc3JjLCBpbnQgc3JjUG9zaXRpb24sIElCZWFuUHJveHkgZGVzdCwgaW50IGRlc3RQb3NpdGlvbiwgaW50IGxlbmd0aCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQlJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZhY3RvcnkgPSBzcmMuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JSUJlYW5Qcm94eVtdIGFyZ3MgPSBuZXcgSUJlYW5Qcm94eVtdIHsKLQkJc3JjLAotCQlmYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoc3JjUG9zaXRpb24pLAotCQlkZXN0LAotCQlmYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZGVzdFBvc2l0aW9uKSwKLQkJZmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGxlbmd0aCkJCQotCX07Ci0JCi0JZ2V0U3lzdGVtQXJyYXljb3B5KCkuaW52b2tlKG51bGwsIGFyZ3MpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTGlzdEJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzI3ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTGlzdEJlYW5Qcm94eVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkNvbGxlY3Rpb24gcHJveHkuCi0gKiBJdCBwcm92aWRlcyB0aGUgY29sbGVjdGlvbiBtZXRob2RzIHRvIGludGVyZmFjZSB0bwotICogdGhlIHByb3h5LgotICovCi0KLXB1YmxpYyBjbGFzcyBMaXN0QmVhblByb3h5V3JhcHBlciBleHRlbmRzIENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgTGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEJlYW5Qcm94eVdyYXBwZXIoSUJlYW5Qcm94eSBhTGlzdFByb3h5KSB7Ci0JCXN1cGVyKGFMaXN0UHJveHkpOwotCQkKLQkJaWYgKCFhTGlzdFByb3h5LmdldFR5cGVQcm94eSgpLmlzS2luZE9mKGFMaXN0UHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0IikpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5TWVzc2FnZXMuQ2xhc3NDYXN0X0VYQ19fSW5jb3JyZWN0VHlwZSwgbmV3IE9iamVjdFtdIHthTGlzdFByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksICJqYXZhLnV0aWwuTGlzdCJ9KSk7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCS8qKgotCSAqIExpc3QgYWNjZXNzb3JzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEFkZFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgSUJlYW5Qcm94eSBhQ29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEFkZEFsbFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBhQ29sbGVjdGlvbn0pKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0TGlzdEdldCgpLmludm9rZShmQ29sbGVjdGlvbiwgZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChpbmRleCkpOwotCX0KLQlwdWJsaWMgaW50IGluZGV4T2YoSUJlYW5Qcm94eSBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIGludCBsYXN0SW5kZXhPZihJQmVhblByb3h5IG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUludGVnZXJCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdExhc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgbGlzdEl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJSUJlYW5Qcm94eSBpdHIgPSBmQ29uc3RhbnRzLmdldExpc3RMaXN0SXRlcmF0b3IoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCQkJaWYgKGl0ciAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihpdHIpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCX0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlJQmVhblByb3h5IGl0ciA9IGZDb25zdGFudHMuZ2V0TGlzdExpc3RJdGVyYXRvcldpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQkJCWlmIChpdHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIoaXRyKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgcmVtb3ZlKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RTZXQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgc2V0KGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RSZW1vdmVJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9CQkJCQkJCQkJCQkKLQlwdWJsaWMgTGlzdEJlYW5Qcm94eVdyYXBwZXIgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5Qcm94eSBsaXN0ID0gZkNvbnN0YW50cy5nZXRMaXN0U3ViTGlzdCgpLmludm9rZShmQ29sbGVjdGlvbiwgbmV3IElCZWFuUHJveHlbXSB7ZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChmcm9tSW5kZXgpLCBmQ29sbGVjdGlvbi5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHRvSW5kZXgpfSk7Ci0JCWlmIChsaXN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IExpc3RCZWFuUHJveHlXcmFwcGVyKGxpc3QpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkJCQkJCQkJCQkJCQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5ODAyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkxpc3RJdGVyYXRvciBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBMaXN0SXRlcmF0b3IgbWV0aG9kcyB0byBpbnRlcmZhY2UgdG8KLSAqIHRoZSBwcm94eS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBleHRlbmRzIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgTGlzdEl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYW5JdGVyYXRvclByb3h5KSB7Ci0JCXN1cGVyKGFuSXRlcmF0b3JQcm94eSk7Ci0JCQotCQlpZiAoIWFuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5pc0tpbmRPZihhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0SXRlcmF0b3IiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlLCBuZXcgT2JqZWN0W10ge2FuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCAiamF2YS51dGlsLkxpc3RJdGVyYXRvciJ9KSk7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCS8qKgotCSAqIExpc3RJdGVyYXRvciBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9yQWRkKCkuaW52b2tlKGZJdGVyYXRvciwgb2JqZWN0KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JIYXNQcmV2aW91cygpLmludm9rZShmSXRlcmF0b3IpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkJCi0JfQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUludGVnZXJCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9yTmV4dEluZGV4KCkuaW52b2tlKGZJdGVyYXRvcikpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiAtMTsKLQkJfQkJCQotCX0JCQkKLQlwdWJsaWMgSUJlYW5Qcm94eSBwcmV2aW91cygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvclByZXZpb3VzKCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvclByZXZpb3VzSW5kZXgoKS5pbnZva2UoZkl0ZXJhdG9yKSkuaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9yUmVtb3ZlKCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IG9iamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JTZXQoKS5pbnZva2UoZkl0ZXJhdG9yLCBvYmplY3QpOwotCX0JCQkJCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0ZW5lckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RlbmVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI0N2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RlbmVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgbGlzdGVuZXJzLCBhbmQKLSAqIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIGNsYXNzZXMgd2l0aGluIGplbQotICogd2hpY2ggYWxsb3cgeW91IHRvIHJlZ2lzdGVyIGxpc3RlbmVycyBvZiB2YXJpb3VzIGtpbmRzLgotICogSXQgaXMgYSBmYWlybHkgbGlnaHR3ZWlnaHQgb2JqZWN0LCBvY2N1cHlpbmcgbWluaW1hbCBzcGFjZSB3aGVuCi0gKiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgY2hlY2tzIGZvciBhbmQgZWxpbWluYXRlcyAKLSAqIGR1cGxpY2F0ZXMgYmFzZWQgb24gaWRlbnRpdHkgKG5vdCBlcXVhbGl0eSkuICBMaWtld2lzZSwgdGhlCi0gKiA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZCBjb21wYXJlcyBiYXNlZCBvbiBpZGVudGl0eS4KLSAqIDwvcD4KLSAqIDxwPgotICogVXNlIHRoZSA8Y29kZT5nZXRMaXN0ZW5lcnM8L2NvZGU+IG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMuCi0gKiBOb3RlIHRoYXQgbm8gZ2FyYmFnZSBpcyBjcmVhdGVkIGlmIG5vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4KLSAqIFRoZSByZWNvbW1lbmRlZCBjb2RlIHNlcXVlbmNlIGZvciBub3RpZnlpbmcgYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gKiBvZiBzYXksIDxjb2RlPkZvb0xpc3RlbmVyLmV2ZW50SGFwcGVuZWQ8L2NvZGU+LCBpczoKLSAqIDxwcmU+Ci0gKiBPYmplY3RbXSBsaXN0ZW5lcnMgPSBteUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gKiAgICAoKEZvb0xpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmV2ZW50SGFwcGVuZWQoZXZlbnQpOwotICogfQotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIExpc3RlbmVyTGlzdCB7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbGlzdC4gQWx3YXlzID49IDEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FwYWNpdHk7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IDAgPD0gc2l6ZSA8PSBsaXN0ZW5lcnMubGVuZ3RoLgotCSAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMuICBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4gYnV0IGluaXRpYWxpemVkCi0JICogdG8gYW4gYXJyYXkgb2Ygc2l6ZSBjYXBhY2l0eSB0aGUgZmlyc3QgdGltZSBhIGxpc3RlbmVyIGlzIGFkZGVkLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IGxpc3RlbmVycyAhPSBudWxsIElGRiBzaXplICE9IDAKLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGxpc3RlbmVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZW1wdHkgYXJyYXkgc2luZ2xldG9uIGluc3RhbmNlLCByZXR1cm5lZCBieSBnZXRMaXN0ZW5lcnMoKQotCSAqIHdoZW4gc2l6ZSA9PSAwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVtcHR5QXJyYXkgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCBhbiBpbml0aWFsIGNhcGFjaXR5IG9mIDEuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdCgpIHsKLQkJdGhpcygxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LgotCSAqCi0JICogQHBhcmFtIGNhcGFjaXR5IHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdCAKLQkgKiAgICB3aXRob3V0IGdyb3dpbmcgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uOyBtdXN0IGJlIGF0IGxlYXN0IDEKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KGludCBjYXBhY2l0eSkgewotCQlpZiAoIShjYXBhY2l0eSA+PSAxKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgbGlzdC4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIKLQkgKiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtjYXBhY2l0eV07Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcyB1c2luZyBpZGVudGl0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBncm93IGFycmF5IGlmIG5lY2Vzc2FyeQotCQkJaWYgKHNpemUgPT0gbGlzdGVuZXJzLmxlbmd0aCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCWxpc3RlbmVycywKLQkJCQkJMCwKLQkJCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtzaXplICogMiArIDFdLAotCQkJCQkwLAotCQkJCQlzaXplKTsKLQkJCX0KLQkJfQotCQlsaXN0ZW5lcnNbc2l6ZSsrXSA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc2l6ZSA9IDA7Ci0JCWxpc3RlbmVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsCi0JICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcmVzdWx0aW5nIGFycmF5IGlzIHVuYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBhZGRzIG9yIHJlbW92ZXMuCi0JICogSWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGFycmF5Ci0JICogc2luZ2xldG9uIGluc3RhbmNlIChubyBnYXJiYWdlIGlzIGNyZWF0ZWQpLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMsIHNvIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMKLQkgKiB0byB0aGUgbGlzdGVuZXIgbGlzdCBkdXJpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZQotCSAqIG5vdGlmaWNhdGlvbiBpdHNlbGYuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gRW1wdHlBcnJheTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCBhbmQKLQkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBsaXN0LiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbAotCSAqIGxpc3RlbmVyIHdhcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCQlzaXplID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQkJbGlzdGVuZXJzLAotCQkJCQkJaSArIDEsCi0JCQkJCQlsaXN0ZW5lcnMsCi0JCQkJCQlpLAotCQkJCQkJLS1zaXplIC0gaSk7Ci0JCQkJCWxpc3RlbmVyc1tzaXplXSA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTWFwSk5JVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkOTc1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGEgcHVibGljIGNsYXNzIHRvIG1hcCBiZXR3ZWVuIEpOSSBhbmQgbm9ybWFsIGZvcm1hdCAoZS5nLiAiW0xqYXZhLmxhbmcuU3RyaW5nOyIgdG8gImphdmEubGFuZy5TdHJpbmdbXSIpIGFuZCBiYWNrIGFnYWluLgotICogVGhpcyBpcyBmb3IgYXJyYXlzLCBub24tYXJyYXlzIHdpbGwgYmUgbGVmdCBhbG9uZSBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGNvcnJlY3QuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIE1hcEpOSVR5cGVzIHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGZvcm1hbCB0eXBlIG5hbWUgdG8gdGhlIEpOSSBmb3JtYXQuCi0JICogQHBhcmFtIGZvcm1hbFR5cGVOYW1lCi0JICogQHJldHVybiBKTkkgZm9ybWF0Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sk5JVHlwZU5hbWUoU3RyaW5nIGZvcm1hbFR5cGVOYW1lKSB7Ci0JCXJldHVybiBNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGZvcm1hbFR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgSk5JIGZvcm1hdCB0byB0aGUgZm9ybWFsIHR5cGUgbmFtZS4KLQkgKiBAcGFyYW0gam5pVHlwZU5hbWUKLQkgKiBAcmV0dXJuIGZvcm1hbCB0eXBlIG5hbWUgb3IgIiIgaWYgbm90IHZhbGlkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKFN0cmluZyBqbmlUeXBlTmFtZSkgewotCQlyZXR1cm4gTWFwVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUoam5pVHlwZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZm9ybWFsIHR5cGUgbmFtZSBpcyBmb3IgYSBwcmltaXRpdmUgb3Igbm90LgotCSAqIEBwYXJhbSBmb3JtYWxUeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmb3IgYSBwcmltaXRpdmUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9ybWFsVHlwZVByaW1pdGl2ZShTdHJpbmcgZm9ybWFsVHlwZSkgewotCQlyZXR1cm4gTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChmb3JtYWxUeXBlKSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBmb3JtYWwgdHlwZSBuYW1lLCB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgZGltZW5zaW9ucywKLQkgKiB0byBhbiBhcnJheSBKTkkgdHlwZS4KLQkgKiBAcGFyYW0gZmluYWxDb21wb25lbnQgZmluYWwgY29tcG9uZW50IG5hbWUsIHNob3VsZCBub3QgYmUgYW4gYXJyYXkgdHlwZS4KLQkgKiBAcGFyYW0gZGltZW5zaW9ucyBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgdGhlIGFycmF5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKTklUeXBlTmFtZShTdHJpbmcgZmluYWxDb21wb25lbnQsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBNYXBUeXBlcy5nZXRKTklUeXBlTmFtZShmaW5hbENvbXBvbmVudCwgZGltZW5zaW9ucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTAzMDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uKjsKLQotLyoqCi0gKiBDb250cmlidXRlIHRvIGNsYXNzcGF0aCBQREUgZW50cmllcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGEgbGF1bmNoLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgc3BlY2lhbCBjbGFzcyB0aGF0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSBmcm9tIGNvZGUuIFJlZmVyZW5jZSBpdCB0aHJvdWdoIHRoZSBpbnRlcmZhY2UgdGhhdCBpdCBpbXBsZW1lbnRzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQREVDb250cmlidXRlQ2xhc3NwYXRoCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotY2xhc3MgUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBpbXBsZW1lbnRzIElQREVDb250cmlidXRlQ2xhc3NwYXRoIHsKLQotCXB1YmxpYyB2b2lkIGdldFBERUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCUNvbGxlY3Rpb24gcGx1Z2luSWRzID0gaW5mby5nZXRQbHVnaW5JZHMoKS5rZXlTZXQoKTsKLQotCQkJSVBsdWdpbk1vZGVsQmFzZVtdIGFsbE1vZGVscyA9IFBsdWdpblJlZ2lzdHJ5LmdldEFsbE1vZGVscygpOwotCQkJTGlzdCBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1vZGVscy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhbGxNb2RlbHNbaV0uaXNGcmFnbWVudE1vZGVsKCkpIHsKLQkJCQkJZnJhZ21lbnRzLmFkZChhbGxNb2RlbHNbaV0pOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdHIgPSBmcmFnbWVudHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlJRnJhZ21lbnRNb2RlbCBmcmFnbWVudE1vZGVsID0gKElGcmFnbWVudE1vZGVsKSBpdHIubmV4dCgpOwotCQkJCUlGcmFnbWVudCBmcmFnbWVudCA9IGZyYWdtZW50TW9kZWwuZ2V0RnJhZ21lbnQoKTsKLQkJCQlpZiAocGx1Z2luSWRzLmNvbnRhaW5zKGZyYWdtZW50LmdldFBsdWdpbklkKCkpKSB7Ci0JCQkJCS8vIFdlJ2xsIGRvIGEgY2hlYXQgZm9yIG5vdyBhbmQgYXNzdW1lIGZyYWdtZW50IGlzIGZvciBzYW1lIHZlcnNpb24gb2YgcGx1Z2luLiBQREVDb3JlIGFjdHVhbGx5Ci0JCQkJCS8vIGNoZWNrcyB0aGUgdmVyc2lvbiBvZiB0aGUgZnJhZ21lbnQgYWdhaW5zdCB0aGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHRvIHNlZSB0aGV5IGFyZSBmb3IgZWFjaAotCQkJCQkvLyBvdGhlciwgYnV0IHdlJ2xsIGp1c3QgYXNzdW1lIHRoZXkgYXJlIGZvciBub3cuIENoYW5nZSB0aGlzIGxhdGVyIGlmIHdlIGFjdHVhbGx5IGRvIHJ1biBpbnRvIHRoaXMgY2FzZS4KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZnJhZ21lbnQuZ2V0TW9kZWwoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlQcm9qZWN0IGZyYWdQcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJaWYgKGZyYWdQcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJY29udHJvbGxlci5jb250cmlidXRlUHJvamVjdChmcmFnUHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gZnJhZ21lbnQuZ2V0TGlicmFyaWVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGlicmFyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gbGlicmFyaWVzW2pdOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBsaWJyYXJ5LmdldE5hbWUoKTsKLQkJCQkJCVN0cmluZyBleHBhbmRlZE5hbWUgPSBleHBhbmRMaWJyYXJ5TmFtZShuYW1lKTsKLQotCQkJCQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IGxpYnJhcnkuZ2V0UGx1Z2luTW9kZWwoKTsKLQkJCQkJCVVSTCB1cmwgPSBnZXRQYXRoKG1vZGVsLCBleHBhbmRlZE5hbWUpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aCh1cmwsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgVVJMIGdldFBhdGgoSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCwgU3RyaW5nIGxpYnJhcnlOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIGphckZpbGUgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcihsaWJyYXJ5TmFtZSk7Ci0JCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGphckZpbGUuZ2V0RnVsbFBhdGgoKS50b0ZpbGUoKS50b1VSTCgpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShtb2RlbC5nZXRJbnN0YWxsTG9jYXRpb24oKSwgbGlicmFyeU5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQlyZXR1cm4gZmlsZS50b1VSTCgpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgdXRpbGl0eSBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gbWV0aG9kIG9mIHNhbWUgbmFtZSwgaW4gb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUuQ2xhc3NwYXRoVXRpbENvcmUuIEl0IHdhcyBub3QgQVBJLCBhbmQKLQkgKiBzZWVtcyBzYWZlIGVub3VnaCB0byBjb3B5IGhlcmUuIEJ1dCwgc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODI1NTUgCi0JICogaW4gY2FzZSB0aGVyZSBpcyBldmVyIGFuIEFQSSBtZXRob2QgcHJvdmlkZWQgdG8gY29kaWZ5IHRoZXNlIEVjbGlwc2UgcnVsZXMuIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHBhbmRMaWJyYXJ5TmFtZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc291cmNlLmluZGV4T2YoIiR3cyQiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlID0gc291cmNlLnJlcGxhY2VBbGwoIlxcJHdzXFwkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkid3MiICsgSVBhdGguU0VQQVJBVE9SICsgVGFyZ2V0UGxhdGZvcm0uZ2V0V1MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNvdXJjZS5pbmRleE9mKCIkb3MkIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlQWxsKCJcXCRvc1xcJCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJIm9zIiArIElQYXRoLlNFUEFSQVRPUiArIFRhcmdldFBsYXRmb3JtLmdldE9TKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzb3VyY2UuaW5kZXhPZigiJG5sJCIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UgPSBzb3VyY2UucmVwbGFjZUFsbCgiXFwkbmxcXCQiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJubCIgKyBJUGF0aC5TRVBBUkFUT1IgKyBUYXJnZXRQbGF0Zm9ybS5nZXROTCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc291cmNlLmluZGV4T2YoIiRhcmNoJCIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UgPSBzb3VyY2UucmVwbGFjZUFsbCgiXFwkYXJjaFxcJCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJImFyY2giICsgSVBhdGguU0VQQVJBVE9SICsgVGFyZ2V0UGxhdGZvcm0uZ2V0T1NBcmNoKCkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFQ29udHJpYnV0ZUNsYXNzcGF0aEluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjNzUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLSAKLQotLyoqCi0gKiBBY2Nlc3NvciB0byB0aGUgSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGggaW5zdGFuY2UgdG8gdXNlLgotICogPHBhY2FrZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGggc2hvdWxkIGFjY2VzcyBpdC4KLSAqIAotICogQHNpbmNlIDEuMC4yCi0gKi8KLWNsYXNzIFBERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZSB7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGluc3RhbmNlIHRvIHVzZS4gCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2UgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIFBERSBub3QgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGggZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnBkZS5jb3JlIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCUNsYXNzIHBkZUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUERFQ29udHJpYnV0ZUNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIChJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCkgcGRlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIFBERSBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG9rLgotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0Q2F1c2UoKSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFUHJvY2Vzc0ZvclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUERFUHJvY2Vzc0ZvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdkYzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERVByb2Nlc3NGb3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4uRm91bmRJRHM7Ci0gCi0KLS8qCi0gKiBVc2VkIGZvciBQREUgUHJvY2Vzc2luZyBmb3IgdGhlIFByb3h5IFBsdWdpbiBjbGFzcy4gSXQgd2lsbCBiZSBvcHRpb25hbGx5IGxvYWRlZAotICogaWYgUERFIHBsdWdpbiBpcyBpbnN0YWxsZWQuIFRoaXMgYWxsb3dzIHVzYWdlIGluIGFuIGluc3RhbGxhdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZQotICogUERFIGluc3RhbGxlZC4KLSAqIAotICogQHNpbmNlIDEuMC4yCi0gKi8KLWNsYXNzIFBERVByb2Nlc3NGb3JQbHVnaW4gaW1wbGVtZW50cyBQcm94eVBsdWdpbi5JUERFUHJvY2Vzc0ZvclBsdWdpbiB7Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbi5JUERFUHJvY2Vzc0ZvclBsdWdpbiNwcm9jZXNzUGx1Z2luKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCwgamF2YS51dGlsLk1hcCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5kUGx1Z2lucyhJSmF2YVByb2plY3QgcHJvamVjdCwgRm91bmRJRHMgZm91bmRJZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCkgewotCQlJUGx1Z2luTW9kZWxCYXNlIG0gPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlpZiAobSBpbnN0YW5jZW9mIElQbHVnaW5Nb2RlbCkgewotCQkJLy8gaXQgaXMgYSBwbHVnaW4sIHByb2Nlc3MgaXQuCi0JCQlJUGx1Z2luIHBsdWdpbiA9ICgoSVBsdWdpbk1vZGVsKSBtKS5nZXRQbHVnaW4oKTsKLQkJCWlmIChmb3VuZElkcy5wbHVnaW5JZHMuY29udGFpbnNLZXkocGx1Z2luLmdldElkKCkpKQotCQkJCXJldHVybjsJLy8gYWxyZWFkeSBwcm9jZXNzZWQgaXQKLQkJCWZvdW5kSWRzLnBsdWdpbklkcy5wdXQocGx1Z2luLmdldElkKCksIGZpcnN0IHx8IHZpc2libGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQkKLQkJCWV4cGFuZFBsdWdpbihwbHVnaW4sIGZvdW5kSWRzLCB2aXNpYmxlLCBmaXJzdCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhwYW5kUGx1Z2luKElQbHVnaW5CYXNlIHBsdWdpbiwgRm91bmRJRHMgZm91bmRJZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCkgewotCQlJUGx1Z2luSW1wb3J0W10gaW1wb3J0cyA9IHBsdWdpbi5nZXRJbXBvcnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSVBsdWdpbkltcG9ydCBwaSA9IGltcG9ydHNbaV07Ci0JCQlCb29sZWFuIHBpVmFsdWUgPSAoQm9vbGVhbikgZm91bmRJZHMucGx1Z2luSWRzLmdldChwaS5nZXRJZCgpKTsKLQkJCWJvb2xlYW4gaW1wb3J0VmlzaWJsZSA9IGZpcnN0IHx8ICh2aXNpYmxlICYmIHBpLmlzUmVleHBvcnRlZCgpKTsKLQkJCWlmIChwaVZhbHVlICE9IG51bGwgJiYgKCFpbXBvcnRWaXNpYmxlIHx8IHBpVmFsdWUuYm9vbGVhblZhbHVlKCkpKQotCQkJCWNvbnRpbnVlOwkvLyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCwgdGhpcyB0aW1lIG5vdCB2aXNpYmxlLCBvciB0aGlzIHRpbWUgdmlzaWJsZSBhbmQgd2FzIHByZXZpb3VzbHkgdmlzaWJsZS4KLQkJCS8vIE5vdyBlaXRoZXIgZmlyc3QgdGltZSwgb3IgaXQgd2FzIHRoZXJlIGJlZm9yZSwgYnV0IG5vdyB2aXNpYmxlLCBidXQgdGhpcyB0aW1lIGl0IGlzIHZpc2libGUuCi0JCQkvLyBXZSB3YW50IGl0IHRvIGJlY29tZSB2aXNpYmxlIGluIHRoYXQgY2FzZS4gCi0JCQlmb3VuZElkcy5wbHVnaW5JZHMucHV0KHBpLmdldElkKCksIGltcG9ydFZpc2libGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQkKLQotCQkJLy8gTm90ZTogdGhpcyBzZWFyY2ggZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIElQbHVnaW5JbXBvcnQncyB2ZXJzaW9uIG9yIG1hdGNoIGxldmVsCi0JCQkvLyBidXQgbmVpdGhlciBkaWQgdGhlIHByZXZpb3VzIHZlcnNpb24KLQkJCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocGkuZ2V0SWQoKSk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc0VuYWJsZWQoKSkgewotCQkJCUlQbHVnaW5CYXNlIGZvdW5kUGx1Z2luID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOwotCQkJCWlmIChmb3VuZFBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCWV4cGFuZFBsdWdpbihmb3VuZFBsdWdpbiwgZm91bmRJZHMsIGltcG9ydFZpc2libGUsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZjE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlRpbWVyVGVzdHM7Ci0KLS8qKgotICogUmVnaXN0cnkgb2YgcHJveHkgZmFjdG9yaWVzIG9uIGEgcGVyLVZNIGJhc2lzLgotICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIFZNJ3MsIHRoaXMgd291bGQgYmUgcmVxdWlyZWQgYnkgdGhlCi0gKiBkZXNrdG9wIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSBwcm9qZWN0IGNvdWxkIGJlIG9wZW4sIGFuZCBlYWNoCi0gKiB3b3VsZCByZXF1aXJlIHRoZWlyIG93biBWTSBiZWNhdXNlIHRoZSBjbGFzc3BhdGhzIHdvdWxkIGJlIGRpZmZlcmVudC4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBtb3JlIGZhY3RvcmllcyBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBWTS4gCi0gKiBDcmVhdGlvbiBkYXRlOiAoMy8xMy8wMCAxMDo0ODoxMCBBTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNWYWxpZCA9IHRydWU7CS8vIFRoZSByZWdpc3RyeSBpcyB2YWxpZCB1bnRpbCB0ZXJtaW5hdGVkLgotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgcmVnaXN0cnlMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCi0JLyoqCi0JICogSVJlZ2lzdHJ5TGlzdGVuZXIKLQkgKiBMaXN0ZW4gZm9yIHRoZSByZWdpc3RyeSBiZWluZyB0ZXJtaW5hdGVkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lzdHJ5TGlzdGVuZXIgewotCQkvKioKLQkJICogTWV0aG9kIHJlZ2lzdHJ5VGVybWluYXRlZC4KLQkJICogCi0JCSAqIFRoZSByZWdpc3RyeSBoYXMgYmVlbiB0ZXJtaW5hdGVkLiBXaGVuIHRoaXMgaXMgY2FsbGVkIHRoZSByZWdpc3RyeQotCQkgKiBpcyBubyBsb25nZXIgdmFsaWQuIEl0IHNob3VsZCBub3QgYmUgYXNzdW1lZCBhbnkgY2FsbHMgY2FuIGJlIG1hZGUKLQkJICogdG8gdGhlIHJlZ2lzdHJ5LgotCQkgKiAKLQkJICogQHBhcmFtIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotCX0KLQkJCi0KLQkvLyBGYWN0b3J5IHJlZ2lzdHJhdGlvbiBJUyBOT1QgYSBkeW5hbWljIHJlZ2lzdHJhdGlvbi4gT25jZSByZWdpc3RlcmVkIGZvciBhIFZNIG9yIGFuIGluc3RhbmNlCi0JLy8gdGhleSBzaG91bGQgbm90IGJlIGNoYW5nZWQuIFRoaXMgaXMgYmVjYXVzZSByZWZlcmVuY2VzIGFyZSBjYWNoZWQgaW4gb3RoZXIgb2JqZWN0cy4KLQkvLyBUaGUgVk0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVnaXN0cnkgc2hvdWxkbid0IGV4aXRlZCBhbmQgcmVzdGFydGVkIGJlY2F1c2UKLQkvLyB0aGUgY2FjaGVkIG9iamVjdCB3aWxsIHRoZW4gaGF2ZSBpbnZhbGlkIHJlZmVyZW5jZXMgdG8gbm8gbG9uZ2VyIGV4aXN0aW5nIG9iamVjdHMuCi0JLy8gSWYgdGhlIFZNIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgdGhlbiBhbGwgcHJveGllcyBuZWVkIHRvIGJlIHRvc3NlZC4KLQkKLQkvLwotCS8vIEluZGl2aWR1YWwgUHJveHlGYWN0b3J5UmVnaXN0cnksIGFwcGxpZXMgdG8gYSBwYXJ0aWN1bGFyIFZNLgotCS8vCi0KLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLwotCS8vIElCZWFuUHJveHlGYWN0b3J5IFJlZ2lzdHJ5Ci0JLy8KLQkKLQkvLyBUaGUgc3RhbmRhcmQgYmVhbiAgcHJveHkgZmFjdG9yeSwgdGhlIG9uZSB0aGUgZGVza3RvcCB3aWxsIHVzZSBmb3IgcGFja2FnZXMgdGhhdCBoYXZlIG5vdAotCS8vIGJlZW4gZXh0ZW5kZWQgYW5kIHJlZ2lzdGVyZWQgYnkgY3VzdG9taXphdGlvbiBkZXZlbG9wZXJzLgotCXByb3RlY3RlZCBJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5OwotCi0JLy8gVGhlIGRpcmVjdG9yeSBvZiByZWdpc3RlcmVkIGV4dGVuc2lvbiBmYWN0b3JpZXMsIHR5cGljYWxseSByZWdpc3RlcmVkIGJ5IHBhY2thZ2UuCi0JZmluYWwgcHJvdGVjdGVkIEhhc2h0YWJsZSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3RvcmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS8vCi0JLy8gSUJlYW5UeXBlUHJveHlGYWN0b3J5IFJlZ2lzdHJ5Ci0JLy8KLQkKLQkvLyBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnksIHRoZSBvbmUgdGhlIGRlc2t0b3Agd2lsbCB1c2UgZm9yIHBhY2thZ2VzIHRoYXQgaGF2ZSBub3QKLQkvLyBiZWVuIGV4dGVuZGVkIGFuZCByZWdpc3RlcmVkIGJ5IGN1c3RvbWl6YXRpb24gZGV2ZWxvcGVycy4KLQlwcm90ZWN0ZWQgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5OwotCi0JLy8gVGhlIGRpcmVjdG9yeSBvZiByZWdpc3RlcmVkIGV4dGVuc2lvbiBmYWN0b3JpZXMsIHR5cGljYWxseSByZWdpc3RlcmVkIGJ5IHBhY2thZ2UuCi0JZmluYWwgcHJvdGVjdGVkIEhhc2h0YWJsZSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLwotCS8vIE90aGVyIGZhY3RvcmllcwotCS8vCi0JCQotCXByb3RlY3RlZCBJTWV0aG9kUHJveHlGYWN0b3J5IGZNZXRob2RQcm94eUZhY3RvcnkgPSBudWxsOwkvLyBNZXRob2QgUHJveHkgRmFjdG9yeQotCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8KLQkvLyBDb25zdGFudHMgUmVnaXN0cnkuIERpZmZlcmVudCBleHRlbnNpb25zIGNhbiBzdG9yZQotCS8vIG9iamVjdHMgYnkga2V5IGFzIGEgcmVnaXN0cnkgb2YgY29uc3RhbnRzLgotCS8vIEZvciBleGFtcGxlLCBqYXZhLmF3dCBleHRlbnNpb24gd2lsbCBzdG9yZSBhbiBvYmplY3QKLQkvLyB3aGljaCBoYXMgc29tZSBwcmUtZmV0Y2hlZCBtZXRob2QgcHJveGllcyBzdG9yZWQgaW4gaXQgc28KLQkvLyB0aGF0IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBjb250aW51YWxseSByZWNyZWF0ZWQuCi0JLy8KLQkvLyBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLCBzbyB0aGF0Ci0JLy8gb25seSBwcm94aWVzIHRoYXQgcmVhbGx5IG5lZWQgdG8gYmUgY2FjaGVkIHNob3VsZAotCS8vIGJlIGNhY2hlZC4KLQkvLwotCS8vIERvbid0IHN0b3JlIHByb3hpZXMgdG8gbGl2ZSBiZWFucyBpbiBoZXJlIGJlY2F1c2UKLQkvLyB0aG9zZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBvdmVyIGFuZCBvdmVyLAotCS8vIGFuZCB0aGUgaW5zdGFuY2UgaW4gdGhpcyBjYWNoZSB3aWxsIGdldCBzdGFsZS4KLQkvLyBTaG91bGQgb25seSBzdG9yZSB0aGluZ3MgbGlrZSBvZnRlbiB1c2VkIG1ldGhvZAotCS8vIHByb3hpZXMgdGhhdCBvbmNlIGNyZWF0ZWQgYXJlIHJhcmVseSBjaGFuZ2VkLgotCS8vCi0JLy8gU2luY2UgdGhlIHByb3hpZXMgY2FuIGJlIG9uIGFueSBWTSwgeW91IHNob3VsZCBoYXZlCi0JLy8gYW4gaW50ZXJmYWNlIGRlZmluaW5nIHdoYXQncyBhdmFpbGFibGUgaW4geW91cgotCS8vIGNvbnN0YW50cyBlbnRyeSwgYW5kIGFjY2VzcyBpdCB0aHJvdWdoIHRoYXQuCi0KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIGZSZWdpc3RlcmVkQ29uc3RhbnRzID0gbmV3IEhhc2h0YWJsZSgpOwkJCi0KLQkvKioKLQkgKiBQcm94eUZhY3RvcnlSZWdpc3RyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIGFkZFJlZ2lzdHJ5TGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZWdpc3RyeUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmVtb3ZlUmVnaXN0cnlMaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3RyeUxpc3RlbmVyKElSZWdpc3RyeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlZ2lzdHJ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpcmVSZWdpc3RyeVRlcm1pbmF0ZWQoKSB7Ci0JCWlmICghcmVnaXN0cnlMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBsaXN0ID0gcmVnaXN0cnlMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElSZWdpc3RyeUxpc3RlbmVyKSBsaXN0W2ldKS5yZWdpc3RyeVRlcm1pbmF0ZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JIFJldHVybiB0aGUgY3VycmVudCBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZ2V0QmVhblByb3h5RmFjdG9yeSgpIHsKLQkJaWYgKGZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5TWVzc2FnZXMuUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuUHJveHlGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3Rvcnk7Ci0JfQotCS8qKgotCSBSZXR1cm4gdGhlIGN1cnJlbnQgcmVnaXN0ZXJlZCBiZWFuIHByb3h5IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5Qcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eUZhY3RvcnkgZ2V0QmVhblByb3h5RmFjdG9yeUV4dGVuc2lvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcmV0dXJuIChJQmVhblByb3h5RmFjdG9yeSlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy5nZXQocGFja2FnZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgUmV0dXJuIHRoZSBjdXJyZW50IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5UeXBlUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkgewotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5TWVzc2FnZXMuUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQl9Ci0JLyoqCi0JIFJldHVybiB0aGUgY3VycmVudCByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuVHlwZVByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eUZhY3RvcnkgZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24oU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCXJldHVybiAoSUJlYW5UeXBlUHJveHlGYWN0b3J5KWZSZWdpc3RlcmVkRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3Rvcmllcy5nZXQocGFja2FnZU5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlcXVlc3RlZCBjb25zdGFudHMgZW50cnkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0YW50cyhPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBmUmVnaXN0ZXJlZENvbnN0YW50cy5nZXQoa2V5KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBNZXRob2RQcm94eUZhY3RvcnkgZm9yIHRoaXMgVk0uCi0JICogQ3JlYXRpb24gZGF0ZTogKDMvMTMvMDAgMTA6NTQ6NTkgQU0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5Ci0JICovCi0JcHVibGljIElNZXRob2RQcm94eUZhY3RvcnkgZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkgewotCQlyZXR1cm4gZk1ldGhvZFByb3h5RmFjdG9yeTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU2V0IHRoZSByZXF1ZXN0ZWQgY29uc3RhbnRzIGVudHJ5IGZvciB0aGlzIFZNLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRzKE9iamVjdCBrZXksIE9iamVjdCBjb25zdGFudCkgewotCQlmUmVnaXN0ZXJlZENvbnN0YW50cy5wdXQoa2V5LCBjb25zdGFudCk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgY29uc3RhbnRzIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4xLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ29uc3RhbnRzKE9iamVjdCBrZXkpIHsKLSAgICAgICAgZlJlZ2lzdGVyZWRDb25zdGFudHMucmVtb3ZlKGtleSk7Ci0gICAgfQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIHByb3h5LCBubyBsb25nZXIgbmVlZGVkLgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIGVhc2lseSBhY2Nlc3MgdGhlIHJlbGVhc2UgZnJvbSB0aGUgYmVhbiBwcm94eSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IHByb3h5KSB7Ci0JCS8vIFRvIHNpbXBseSB0aGluZ3MgaWYgcmVsZWFzZSBpcyBjYWxsZWQgd2hlbiB0aGUgZmFjdG9yeSBpcyBkb3duIChpbnZhbGlkKSwgdGhlbiBqdXN0Ci0JCS8vIGdvIG9uIGJlY2F1c2UgdGhlIHByb3h5IGlzIGFscmVhZHkgcmVsZWFzZWQuCi0JCWlmIChmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSAhPSBudWxsKQotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkucmVsZWFzZVByb3h5KHByb3h5KTsKLQl9IAotCi0JLyoqCi0JICogSXMgdGhpcyBhIHZhbGlkIHJlZ2lzdHJ5LCBpLmUuIGlzIGl0IG5vdCB0ZXJtaW5hdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSXNWYWxpZDsKLQl9Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeSB3aXRob3V0IHdhaXRpbmcuCi0JICogPHA+Ci0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeSwgYnV0IGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQgZm9yIGl0LgotCSAqCi0JICogQHNlZSAjdGVybWluYXRlUmVnaXN0cnkoYm9vbGVhbikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXJtaW5hdGVSZWdpc3RyeSgpIHsKLQkJdGVybWluYXRlUmVnaXN0cnkoZmFsc2UpOwotCX0KLQkJCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSByZWdpc3RyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgZ28gdGhyb3VnaCBlYWNoIGZhY3RvcnkgYW5kIHRlcm1pbmF0ZSBpdCwgYW5kCi0JICogbGV0IHRoZSBzdWJjbGFzcyB0ZXJtaW5hdGUuIEl0IHdpbGwgdGhlbiByZW1vdmUgYWxsIG9mIHRoZSBmYWN0b3JpZXMgc28gdGhhdAotCSAqIGlmIHRoZXJlIGFyZSBhbnkgcHJveGllcyBzdGlsbCBoYW5naW5nIGFyb3VuZCB0aGV5IHdvbid0IGhvbGQgb250byBldmVyeXRoaW5nLAotCSAqIGp1c3QgdGhlIHRoaXMgcmVnaXN0cnkgd2lsbCBiZSBoZWxkIG9udG8uCi0JICo8cD4KLQkgKiBOb3RlIGR1cmluZyB0ZXJtaW5hdGlvbiwgdGhlIGZhY3RvcmllcyBzaG91bGQgbm90IHJlZmVyZW5jZSBhbnkgb3RoZXIgZmFjdG9yeS4KLQkgKiBJdCBjYW4gYXNzdW1lIHRoYXQgdGhlIGZhY3RvcmllcyB3aWxsIHRha2UgY2FyZSBvZiB0aGVtc2VsdmVzIGFuZCB0aGV5IHNob3VsZAotCSAqIG9ubHkgcmVsZWFzZSB0aGVpciByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogVGhlIGNvbnN0YW50cyByZWdpc3RyeSB3aWxsIG5vdCBiZSB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhleSBhcmVuJ3QgZmFjdG9yaWVzLgotCSAqIEhvd2V2ZXIsIHRoZXkgd2lsbCBiZSBjbGVhcmVkIChubyBsb25nZXIgcmVmZXJlbmNlZCkgZnJvbSBoZXJlIHNvIHRoYXQgdGhleQotCSAqIGNhbiBiZSBHQydkLgotCSAqIAotCSAqIEBwYXJhbSB3YWl0IDxjb2RlPnRydWU8L2NvZGU+IHRvIHdhaXQgZm9yIGNvbXBsZXRlIHRlcm1pbmF0aW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gdG8ga2ljayBvZmYgdGVybWluYXRpb24gYnV0IHJldHVybiBBU0FQLgotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlcm1pbmF0ZVJlZ2lzdHJ5KGJvb2xlYW4gd2FpdCkgewotCQlpZiAoIWZJc1ZhbGlkKQotCQkJcmV0dXJuOwkvLyBBbHJlYWR5IG9yIGFyZSBhbHJlYWR5IHRlcm1pbmF0aW5nLiBEb24ndCBkbyBpdCBhZ2FpbiBhbmQgZG9uJ3Qgbm90aWZ5IGFnYWluLgotCQlmSXNWYWxpZCA9IGZhbHNlOwotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ICE9IG51bGwpIHsKLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKCJUZXJtaW5hdGUgQmVhbiBUeXBlIEZhY3RvcnkiKTsKLQkJCWZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS50ZXJtaW5hdGVGYWN0b3J5KHdhaXQpOwotLy8JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcCgiVGVybWluYXRlIEJlYW4gVHlwZSBGYWN0b3J5Iik7Ci0JCQlmQ3VycmVudFN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWlmIChmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS50ZXJtaW5hdGVGYWN0b3J5KHdhaXQpOwotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWlmIChmTWV0aG9kUHJveHlGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZNZXRob2RQcm94eUZhY3RvcnkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLQkJCWZNZXRob2RQcm94eUZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdHIgPSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCSgoSUJlYW5Qcm94eUZhY3RvcnkpIGl0ci5uZXh0KCkpLnRlcm1pbmF0ZUZhY3Rvcnkod2FpdCk7Ci0JCX0KLQkJZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yaWVzLmNsZWFyKCk7Ci0JCQotCQlpdHIgPSBmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJKChJQmVhblByb3h5RmFjdG9yeSkgaXRyLm5leHQoKSkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLQkJfQotCQlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5Qcm94eUZhY3Rvcmllcy5jbGVhcigpOwotCQkKLQkJZlJlZ2lzdGVyZWRDb25zdGFudHMuY2xlYXIoKTsKLQkJCi0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcCgiUmVnaXN0cnkgVGVybWluYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdHJ5VGVybWluYXRlZCh3YWl0KTsKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLS8vCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQgTm90aWZpY2F0aW9uIik7Ci0JCWZpcmVSZWdpc3RyeVRlcm1pbmF0ZWQoKTsJLy8gTGV0IGV2ZXJ5b25lIGtub3cgdGhhdCB3ZSBhcmUgZ29uZS4gVGhpcyBpcyBmaXJlZCBldmVuIGlmIHdhaXQgaXMgZmFsc2UgYmVjYXVzZSBhdCB0aGlzIHBvaW50IGluIHRpbWUgdGhlIHJlZ2lzdHJ5IGlzIGludmFsaWQuCi0vLwkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQgTm90aWZpY2F0aW9uIik7Ci0JfQotCQotCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSBSZWdpc3RyeS4gCi0JICogPHA+Ci0JICogSXQgaXMgdXAgdG8gZWFjaCByZWdpc3RyeSB0byBkZXRlcm1pbmUgd2hhdCB0aGlzIG1lYW5zLgotCSAqIDxwPgotCSAqIFRoZSB3YWl0IHBhcm0gaXMgYSBzdWdnZXN0aW9uIGlmIGl0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgYnV0IGl0IG11c3QgYmUgaG9ub3VyZWQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gd2FpdCB3YWl0IGZvciByZWdpc3RyeSB0byB0ZXJtaW5hdGUgZmxhZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoYm9vbGVhbiB3YWl0KTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNhbGxiYWNrIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ2FsbGJhY2tSZWdpc3RyeSBnZXRDYWxsYmFja1JlZ2lzdHJ5KCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZpbmRTdXBwb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZpbmRTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTc3Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlGaW5kU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotIAotCi0vKioKLSAqIFV0aWxpdHkgdG8gaGVscCBmaW5kaW5nIGZpbGVzLiBJdCBpcyB1c2VkIHRvIGZpbmQgdGhlbSB3aXRoaW4gcGx1Z2lucyBvZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBvciB0byBmaW5kIHRoZW0gaW4gdGhlIFBERSB0YXJnZXQgcGxhdGZvcm0uCi0gKiBBbHNvIGlmIGluIHRoZSBjdXJyZW50IHBsYXRmb3JtIGFuZCB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBpbiBkZXZlbG9wbWVudCBtb2RlIGl0IHdpbGwgZmluZCB0aGUgYmluIGRpcmVjdG9yaWVzIGZvciB0aGUgamFycyBpbnN0ZWFkIHNpbmNlCi0gKiB0aGVyZSBhcmUgbm8gamFycyBpbiB0aGF0IGNhc2UuCi0gKiBJdCBjYW4gYWxzbyBleHRyYWN0IG5vbi1sb2NhbCBmaWxlcyAoc3VjaCBhcyBmaWxlcyB3aXRoaW4gYSBqYXIpIGFuZCBtYWtlIGEgY2FjaGUgb2YgdGhlbSBzbyB0aGF0IGFyZSBhIGxvY2FsIGZpbGUgYW5kIG5vdCBleHRyYWN0ZWQgZXZlcnl0aW1lCi0gKiB0aGV5IGFyZSBuZWVkZWQuCi0gKgotICogVE9ETyBJZiB3ZSBldmVyIGdldCBiYWNrIHRvIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQgd2Ugc2hvdWxkIGFkZCB0byB0aGlzIFBERSBUYXJnZXQgc3VwcG9ydC4gQW5kIHRlc3QgdGhlIGNvZGUgaGVyZSAKLSAqIHNpbmNlIGl0IGhhc24ndCBiZWVuIHRlc3RlZCB5ZXQuIEFsc28gbm90ZSB0aGF0IGluIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3IsCi0gKiB3aGVuIHdlIGFkZCB0aGUgbGlicmFyeSBwYXRoIHdlIGV4cGVjdCBpdCB0byBiZSBhIGZvbGRlci4gVGhpcyB3b3VsZCBiZSBhIHByb2JsZW0gd2l0aCBqYXJyZWQgcGx1Z2lucyBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKLSAqIGxpYnJhcmllcyBtYXkgYmUgdGhlIHJvb3Qgb2YgdGhlIHBsdWdpbiBhbmQgbG9jYWxpemluZyBhIGRpcmVjdG9yeSB3b3VsZCBleHRyYWN0IGFuZCBjYWNoZSB0aGUgZW50aXJlIHBsdWdpbi4gTmVlZCB0byBjaGFuZ2UgdG8gZmlndXJlIG91dAotICogaG93IHRvIG9ubHkgZXh0cmFjdCB0aGUgZGxsL3NvIG5lZWRlZCBpbnN0ZWFkLiBBbHNvLCBub25lIG9mIHRoZXNlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVuZGxlIGlzIGFjdHVhbGx5IG5vbi1sb2NhbCAoZS5nLiAiaHR0cDovIikuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3h5RmluZFN1cHBvcnQgewotCi0JCi0JLyoqCi0JICogRmluZCB0aGUgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIHBsYXRmb3JtIGJ1bmRsZS4gSXQgd2lsbCBzZWFyY2ggaW4gdGhlIGJ1bmRsZSBhbmQgaW4gYWxsIGZyYWdtZW50cyBmb3IgdGhlIGZpbGUgbmFtZS4KLQkgKiBJdCB3aWxsIHJldHVybiBhIFVSTCBmb3IgZWFjaCBmb3VuZCBmaWxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBOTFMgcHVycG9zZXMuIEluIE5MUyBzaXR1YXRpb25zIHRoZSBtYWluIGJ1bmRsZSB3b3VsZCBjb250YWluIHRoZSBtYWluIG5vbi1saWJyYXJ5IGphciB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgZmlsZXMuCi0JICogVGhlbiBhIGZyYWdtZW50IGZvciBlYWNoIHNldCBvZiBsYW5ndWFnZXMgd2lsbCBiZSBpbnN0YWxsZWQuIFdpdGhpbiBlYWNoIGZyYWdtZW50IHdpbGwgYmUgYSBqYXIgd2l0aCB0aGUgc2FtZSBmaWxlcGF0aCwgYW5kIGl0IHdpbGwKLQkgKiBjb250YWluIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGZvciB0aGF0IGxhbmd1YWdlLiBUaGlzIHdvdWxkIGJlIGRvbmUgb25seSBmb3IgcGx1Z2luIG5vbi1saWJyYXJ5IGphcnMuIAotCSAqIFRoZSBOTFMgZm9yIGxpYnJhcnkgamFycyBvZiBhIHBsdWdpbiAoaS5lLiB0aG9zZSBqYXJzIHRoYXQgYXJlIHRoZSA8cnVudGltZT4gamFycyBmb3IgdGhlIHBsdWdpbikgYXJlIHVzdWFsbHkgbGlicmFyeSBqYXJzIHRoZW1zZWx2ZXMgaW4KLQkgKiB0aGUgZnJhZ21lbnQsIGFuZCB0aGV5IHVzdWFsbHkgaGF2ZSBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIG1haW4gbGlicmFyeSBqYXIuIFNvIHRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBsaWJyYXJ5IGphcnMuCi0JICogPHA+Ci0JICogSWYgaW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhlbiBpZiB0aGUgamFyIGlzIG5vdCBmb3VuZCBpdCB3aWxsIGxvb2sgaW4gdGhlIHBsdWdpbiBwcm9qZWN0J3MgYnVpbGQucHJvcGVydGllcyB0byBmaW5kIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JICogb2YgdGhlIGphci4gSWYgbm90IGluIHRoZSBidWlsZC5wcm9wZXJ0aWVzIChtZWFuaW5nIGl0IGlzbid0IGJlaW5nIGJ1aWx0IGJ5IFBERSksIGl0IHdpbGwgbG9vayBpbiB0aGUgcHJveHkuamFycyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLgotCSAqIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBqYXJzIHRoYXQgYXJlIGJ1aWx0IGluIGEgc2VwYXJhdGUgcHJvamVjdCBmcm9tIHRoZSBwbHVnaW4gYnV0IHdpbGwgYmUgZm91bmQgaW4gdGhlIHBsdWdpbiBhdCBleGVjdXRpb24uCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBidW5kbGUgYW5kIGl0cyBmcmFnbWVudHMgdG8gbG9vayBpbi4KLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUgcGF0aCB0byBmaWxlbmFtZSB3aXRoaW4gdGhlIGJ1bmRsZSBhbmQgZnJhZ21lbnRzLiA8Yj5UaGlzIG11c3QgYmUgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkuPC9iPiAKLQkgKiAgIEZvciBmaW5kaW5nIHRoZSBidW5kbGUgaXRzZWxmIChvbmx5IHdoZW4gdGhlIGJ1bmRsZSBpcyBwYWNrYWdlZCBhcyBhIGphciksIHVzZSA8QGxpbmsgI3BsYXRmb3JtRmluZChCdW5kbGUpPi4gVGhpcyBkb2VzIG5vdCB1c2UKLQkgKiAgIHRoZSBwbGF0Zm9ybSBzaG9ydGN1dHMgbGlrZSAiJG9zJCIuIEl0IGZpbmRzIHRoZSBmaWxlcyBleGFjdGx5IGFzIHNwZWNpZmllZC4KLQkgKiBAcGFyYW0gYXNMb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXJscyBuZWVkIHRvIHBvaW50IHRvIGxvY2FsIGZpbGVzeXN0ZW0gZmlsZXMuIFRoaXMgbWF5IGNhdXNlIGNhY2hpbmcgb2YgZmlsZXMgbG9jYWxseS4gVGhpcwotCSAqIGNvdWxkIGhhcHBlbiBpZiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBwbHVnaW4gdGhhdCBpcyBqYXJyZWQuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXJsIGNhbiBiZSBhIG5vbi1sb2NhbCBmaWxlc3lzdGVtIHVybC4gCi0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBmb3IgZm91bmQgZmlsZXMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMW10gcGxhdGZvcm1GaW5kQWxsKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJQnVuZGxlW10gZnJhZ21lbnRzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCUFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKTsKLQkJVVJMIHVybCA9IGludGVybmFsRmluZEZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgZmlsZW5hbWUsIGFzTG9jYWwpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlIGZyYWdtZW50ID0gZnJhZ21lbnRzW2ldOwotCQkJCXVybCA9IGludGVybmFsRmluZEZyb21CdW5kbGVPbmx5KGZyYWdtZW50LCBmaWxlbmFtZSwgYXNMb2NhbCk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQl1cmxzLmFkZCh1cmwpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcGFyYW0gYXNMb2NhbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgaW50ZXJuYWxGaW5kRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBhc0xvY2FsID8gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHB2bSkgOiBwdm07Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuaXNEZXZNb2RlKCkpIHsKLQkJCXJldHVybiBmaW5kRGV2KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUsIGFzTG9jYWwpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSBwbGF0Zm9ybSBidW5kbGUuIEl0IHdpbGwgc2VhcmNoIGluIHRoZSBidW5kbGUgYW5kIGluIGFsbCBmcmFnbWVudHMgZm9yIHRoZSBmaWxlIG5hbWUuIEl0IHdpbGwgcmV0dXJuCi0JICogVVJMIGZvciB0aGUgZmlsZSBpZiBmb3VuZC4KLQkgKiA8cD4KLQkgKiBJZiBpbiBkZXZlbG9wbWVudCBtb2RlLCB0aGVuIGlmIHRoZSBqYXIgaXMgbm90IGZvdW5kIGl0IHdpbGwgbG9vayBpbiB0aGUgcGx1Z2luIHByb2plY3QncyBidWlsZC5wcm9wZXJ0aWVzIHRvIGZpbmQgdGhlIG91dHB1dCBkaXJlY3RvcnkKLQkgKiBvZiB0aGUgamFyLiBJZiBub3QgaW4gdGhlIGJ1aWxkLnByb3BlcnRpZXMgKG1lYW5pbmcgaXQgaXNuJ3QgYmVpbmcgYnVpbHQgYnkgUERFKSwgaXQgd2lsbCBsb29rIGluIHRoZSBwcm94eS5qYXJzIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuCi0JICogVGhpcyBmaWxlIGlzIHVzZWQgZm9yIGphcnMgdGhhdCBhcmUgYnVpbHQgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IGZyb20gdGhlIHBsdWdpbiBidXQgd2lsbCBiZSBmb3VuZCBpbiB0aGUgcGx1Z2luIGF0IGV4ZWN1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlIGJ1bmRsZSBhbmQgaXRzIGZyYWdtZW50cyB0byBsb29rIGluLgotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZSBwYXRoIHRvIGZpbGVuYW1lIHdpdGhpbiB0aGUgYnVuZGxlIGFuZCBmcmFnbWVudHMuIDxiPlRoaXMgbXVzdCBiZSBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeS48L2I+IAotCSAqICAgRm9yIGZpbmRpbmcgdGhlIGJ1bmRsZSBpdHNlbGYgKG9ubHkgd2hlbiB0aGUgYnVuZGxlIGlzIHBhY2thZ2VkIGFzIGEgamFyKSwgdXNlIDxAbGluayAjcGxhdGZvcm1GaW5kKEJ1bmRsZSk+LgotCSAqIEBwYXJhbSBhc0xvY2FsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1cmxzIG5lZWQgdG8gcG9pbnQgdG8gbG9jYWwgZmlsZXN5c3RlbSBmaWxlcy4gVGhpcyBtYXkgY2F1c2UgY2FjaGluZyBvZiBmaWxlcyBsb2NhbGx5LiBUaGlzCi0JICogY291bGQgaGFwcGVuIGlmIHRoZSBmaWxlIGlzIHdpdGhpbiBhIHBsdWdpbiB0aGF0IGlzIGphcnJlZC4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1cmwgY2FuIGJlIGEgbm9uLWxvY2FsIGZpbGVzeXN0ZW0gdXJsLiAgCi0JICogQHJldHVybiB0aGUgZm91bmQgdXJsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBwbGF0Zm9ybUZpbmQoQnVuZGxlIGJ1bmRsZSwgSVBhdGggZmlsZW5hbWVXaXRoaW5CdW5kbGUsIGJvb2xlYW4gYXNMb2NhbCkgewotCQl0cnkgewotCQkJVVJMIHB2bSA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSwgbnVsbCk7Ci0JCQlpZiAocHZtICE9IG51bGwpCi0JCQkJcmV0dXJuIGFzTG9jYWwgPyBGaWxlTG9jYXRvci50b0ZpbGVVUkwocHZtKSA6IHB2bTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5pc0Rldk1vZGUoKSkgewotCQkJcmV0dXJuIGZpbmREZXYoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpLCBhc0xvY2FsKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBST1BFUlRJRVMgPSAiYnVpbGQucHJvcGVydGllcyI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlKQVJTID0gInByb3h5LmphcnMiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGZpbmREZXYoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlLCBib29sZWFuIGFzTG9jYWwpIHsKLQkJLy8gR290IHRoaXMgZmFyIGFuZCBpbiBkZXYgbW9kZSBtZWFucyBpdCB3YXNuJ3QgZm91bmQsIHNvIHdlJ2xsIHRyeSBmb3IgZGV2ZWxvcG1lbnQgc3R5bGUuCi0JCS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpbiBkZXYgbW9kZSwgd2UgYXJlIHJ1bm5pbmcgd2l0aCB0aGUgSURFIGFzIGxvY2FsIGFuZCBhbnkgCi0JCS8vIGJ1aWxkIG91dHB1dHMgd2lsbCBiZSBsb2NhbCBzbyBsb2NhbCBmaWxlIHByb3RvY29sIHdpbGwgYmUgcmV0dXJuZWQKLQkJLy8gZnJvbSBQbGF0Zm9ybS5yZXNvbHZlKCkuIFdlIHdvbid0IGJlIHJ1bm5pbmcgaW4gZGV2IG1vZGUgd2l0aCBvdXIgZW50aXJlcGx1Z2luIGJlaW5nIGluIGEgamFyLAotCQkvLyBvciBvbiBhIHNlcGFyYXRlIHN5c3RlbS4KLQkJdHJ5IHsKLQkJCVVSTCBicCA9IGJ1bmRsZS5nZXRFbnRyeShCVUlMRFBST1BFUlRJRVMpOwotCQkJaWYgKGJwICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpb3MgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlvcyA9IGJwLm9wZW5TdHJlYW0oKTsKLQkJCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCXByb3BzLmxvYWQoaW9zKTsKLQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eSgib3V0cHV0LiIrZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJVVJMIHB2bSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKTsKLQkJCQkJCWlmIChwdm0gIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gYXNMb2NhbCA/IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwdm0pIDogcHZtOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlvcyAhPSBudWxsKQotCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQl0cnkgewotCQkJVVJMIHB2bSA9IGJ1bmRsZS5nZXRFbnRyeShQUk9YWUpBUlMpOwotCQkJaWYgKHB2bSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW9zID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpb3MgPSBwdm0ub3BlblN0cmVhbSgpOwotCQkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJcHJvcHMubG9hZChpb3MpOwotCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAocGF0aFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShidW5kbGUuZ2V0RW50cnkoIi8iKSk7CS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBpbiBkZWJ1ZyBtb2RlLCB0aGVuIHRoaXMgcGx1Z2luIGlzIGFuIGltcG9ydGVkIHBsdWdpbiB3aXRoaW4gdGhlIGRldmVsb3BlbWVudCB3b3Jrc3BhY2UuIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpOwkvLyBUaGlzIGdldHMgdXMgdG8gd29ya3NwYWNlIHJvb3Qgb2YgZGV2ZWxvcG1lbnQgd29ya3NwYWNlLgotCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlLCBwYXRoU3RyaW5nKTsKLQkJCQkJCQlyZXR1cm4gZmlsZS50b1VSTCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlvcyAhPSBudWxsKQotCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogRmluZCB0aGUgYnVuZGxlIGFuZCBhbGwgYWN0aXZlIGZyYWdtZW50cyBsaWJyYXJpZXMuIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHVzZWQgb25seSB3aGVuIHRoZSBidW5kbGUgaXMgcGFja2FnZWQgYXMgYSBqYXIgYW5kIG5vdCBhcyBhIGRpcmVjdG9yeS4gSXQgd2lsbAotCSAqIHJldHVybiB0aGUgdXJscyB0byB0aGUgamFycyBvZiB0aGUgYnVuZGxlIGFuZCBmcmFnbWVudHMuIElmIGluIGRldmVsb3BtZW50IG1vZGUgaXQgd2lsbCBmaW5kIHRoZSBidW5kbGUncyAiLiIgb3V0cHV0IGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBmb3IgdGhlIGphcnJlZCBidW5kbGUgYW5kIGZyYWdtZW50cy4gSWYgdGhlIGJ1bmRsZS9mcmFnbWVudHMgYXJlIG5vdCBwYWNrYWdlZCBhcyBqYXJzLCB0aGVuIHRoZSBhcnJheSB3aWxsIGJlIGVtcHR5LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMW10gcGxhdGZvcm1GaW5kKEJ1bmRsZSBidW5kbGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUxhdW5jaFN1cHBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5TGF1bmNoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTE4YWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5TGF1bmNoU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uQ29udGFpbmVyUGF0aHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4uRm91bmRJRHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotCi0gCi0vKioKLSAqIFRoaXMgaXMgdGhlIHVzZWQgdG8gbGF1bmNoIHRoZSBwcm94eSByZWdpc3RyaWVzLgotICogVGhpcyBpcyBhIHN0YXRpYyBoZWxwZXIgY2xhc3MsIGl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUHJveHlMYXVuY2hTdXBwb3J0IHsKLQkKLQkvLyBUaGUga2V5IGZvciB0aGUgcGVyc2lzdGVuIHByb3BlcnR5IGlzIGluIFByb3h5UGx1Z2luIHNvIHRoYXQgaXQgY2FuIHNldCBpdCBvbiBzdGFydHVwIHdpdGhvdXQKLQkvLyBjYXVzaW5nIHRoaXMgY2xhc3MgdG8gYmUgaW5pdGlhbGl6ZWQuIFdlIGRvbid0IHdhbnQgdGhpcyBjbGFzcyBpbml0aWFsaXplZCB1bnRpbCB0aGUgdmVyeSBsYXN0Ci0JLy8gbW9tZW50IHdoZW4gbmVlZGVkLiBUaGlzIGlzIGJlY2F1c2UgaXQgbmVlZHMgVUkgdG8gYmUgYWN0aXZlIHdoZW4gaW5pdGlhbGl6ZWQgdG8gcXVlcnkgc29tZSAKLQkvLyB2YWx1ZXMgYW5kIGlmIFByb3h5UGx1Z2luLnN0YXJ0KCkgY2F1c2VzIHRoaXMgY2xhc3MgdG8gaW5pdGlhbGl6ZSwgaXQgbWF5IGJlIHRvbyBzb29uLgotCS8vCi0JLy8gSWYgYSBwcm9qZWN0J3MgcGVyc2lzdGVudCBwcm9wZXJ0eSBpcyBzZXQgd2l0aCB0aGlzIHZhbHVlLCB0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotCS8vIGxhdW5jaCBjb25maWd1cmF0aW9uIHdpdGggdGhpcyBwcm9qZWN0LCBidXQgbm9uZSBhcmUgc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQuIFRoaXMgaXMgaGVyZQotCS8vIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGluIHRoZSBvYmplY3QgY29udHJpYnV0aW9uIHRoYXQgaWYgbm90IHNldCB0aGVuIGRvbid0IHNob3cgdGhlIG1lbnUKLQkvLyBpdGVtIGF0IGFsbC4gVGhpcyBpcyB0byBjbGVhbiB1cCB0aGUgcG9wdXAgbWVudSBzbyBub3Qgc28gY2x1dHRlcmVkLgotCS8vIElmIHRoZSBwcm9wZXJ0eSBpcyB0cnVsbHkgbm90IHNldCwgdGhlbiB0aGVyZSBpcyBubyBkZWZhdWx0IGFuZCB0aGVyZSBhcmUgbm8gY29uZmlndXJhdGlvbnMgZm9yIGl0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TRVQgPSAiLi4ubm90Li5zZXQuLiI7CSAgLy8kTk9OLU5MUy0xJAotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1RSQUNJTkcgPSAiL2RlYnVnL3RyYWNlZXhwcmVzc2lvbnMiOwkvLyBUcmFjZSBJRXhwcmVzc2lvbnMuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaW1lciB0aHJlc2hvbGQgZm9yIGluZGljYXRpbmcgYW55IGV4cHJlc3Npb25zIHRoYXQgdG9vayBsb25nZXIgdGhhbiB0aGlzLgotCSAqIElmIG5vdCBzZXQsIHRoZW4gdGhyZXNob2xkIHdpbGwgZGVmYXVsdCB0byAxMDBtcy4KLQkgKiBJdCB3aWxsIG9ubHkgYmUgdXNlZCBpZiB0cmFjZWV4cHJlc3Npb25zIGlzIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9UUkFDRUlOR19USU1FUl9USFJFU0hPTEQgPSAiL2RlYnVnL3RyYWNlZXhwcmVzc2lvbnN0aW1ldGhyZXNob2xkIjsJIC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFJlZ2lzdHJ5IG9mIGxhdW5jaCBrZXkgdG8gTGF1bmNoSW5mbyBjbGFzc2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBMQVVOQ0hfSU5GTyA9IG5ldyBIYXNoTWFwKDIpOwotCi0JLyoqCi0JICogUHVibGljIG9ubHkgZm9yIGFjY2VzcyBieSBvdGhlciBsYXVuY2ggZGVsZWdhdGVzIHRvIHNldCB1cCBpZiB0aGV5IGdvIG91dHNpZGUgb2YgUHJveHlMYXVuY2hTdXBwb3J0LAotCSAqIGUuZy4gSURFIHByb3h5LiBNdXN0IG5vdCBiZSB1c2VkIGZvciBhbnkgcHVycG9zZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhdW5jaFN1cHBvcnRJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gewotCQkKLQkJLyoqCi0JCSAqIENvbnN0cnVjdCB3aXRoIG5vIHNldHRpbmdzLiBUaGlzIGlzIHRvIGJlIHVzZWQgYnkgb3RoZXIgbGF1bmNoIGRlbGVnYXRlcyB0aGF0Ci0JCSAqIGRvbid0IGhhdmUgYSB7QGxpbmsgRm91bmRJRHN9IGF2YWlsYWJsZSB0byBmaWxsIGluIHRoZSBmaWVsZHMuIFRob3NlIAotCQkgKiBkZWxlZ2F0ZXMgbXVzdCBmaWxsIHRoZSBmaWVsZHMgdGhlbXNlbHZlcy4gIAotCQkgKiAKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIExhdW5jaFN1cHBvcnRJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMYXVuY2hTdXBwb3J0SUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgRm91bmRJRHMgZm91bmRJRHMpIHsKLQkJCXRoaXMoamF2YVByb2plY3QpOwotCQkJY29udGFpbmVySWRzID0gZm91bmRJRHMuY29udGFpbmVySWRzOwotCQkJY29udGFpbmVycyA9IGZvdW5kSURzLmNvbnRhaW5lcnM7Ci0JCQlwbHVnaW5JZHMgPSBmb3VuZElEcy5wbHVnaW5JZHM7Ci0JCQlwcm9qZWN0UGF0aHMgPSBmb3VuZElEcy5wcm9qZWN0czsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBNYXAgb2YgY29udGFpbmVycyAoSUNsYXNzcGF0aENvbnRhaW5lcikgZm91bmQgaW4gY2xhc3NwYXRoIChpbmNsdWRpbmcgcmVxdWlyZWQgcHJvamVjdHMpLgotCQkgKiBUaGlzIGlzIGZvciBlYWNoIHByb2plY3QgZm91bmQuIElmIHRoZXJlIHdhcyBhIGNvbnRhaW5lciBpbiBtb3JlIHRoYW4gb25lIHByb2plY3Qgd2l0aCB0aGUKLQkJICogaWQsIHRoaXMgc2V0IHdpbGwgY29udGFpbiB0aGUgY29udGFpbmVyIGZyb20gZWFjaCBzdWNoIHByb2plY3QuIFRoZXkgYXJlIG5vdCBjb25zaWRlcmVkIHRoZQotCQkgKiBzYW1lIGJlY2F1c2UgdGhleSBjb21lIGZyb20gYSBkaWZmZXJlbnQgcHJvamVjdC4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgY29udGFpbmVycywgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIDxwPgotCQkgKiBUaGlzIGlzIHVzZWQgZm9yIGRldGVybWluaW5nIGlmIGEgcHJvamVjdCdzIGNvbnRhaW5lciBpbXBsZW1lbnRzIHRoZSBkZXNpcmVkIGNvbnRyaWJ1dG9yLgotCQkgKiAKLQkJICogV2lsbCBiZSBlbXB0eSBpZiBubyBwcm9qZWN0IHNlbnQgaW4gdG8gbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTWFwIGNvbnRhaW5lcnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWFwIG9mIHVuaXF1ZSBjb250YWluZXIgaWQgc3RyaW5ncyBmb3VuZCBpbiBjbGFzc3BhdGggKGluY2x1ZGluZyByZXF1aXJlZCBwcm9qZWN0cykuCi0JCSAqIElmIGEgY29udGFpbmVyIHdpdGggdGhlIHNhbWUgaWQgd2FzIGZvdW5kIGluIG1vcmUgdGhhbiBvbmUgcHJvamVjdCwgb25seSBvbmUgaWQgd2lsbAotCQkgKiBiZSBpbiB0aGlzIHNldCBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZS4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgY29udGFpbmVyIGlkcywgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIENvbnRhaW5lclBhdGhzCi0JCSAqIAotCQkgKiBXaWxsIGJlIGVtcHR5IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTWFwIGNvbnRhaW5lcklkcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogU2V0IG9mIHVuaXF1ZSBwbHVnaW4gaWQgc3RyaW5ncyBmb3VuZCBpbiBjbGFzc3BhdGggKGluY2x1ZGluZyByZXF1aXJlZCBwcm9qZWN0cykuCi0JCSAqIElmIGEgcmVxdWlyZWQgcGx1Z2luIHdpdGggdGhlIHNhbWUgaWQgd2FzIGZvdW5kIGluIG1vcmUgdGhhbiBvbmUgcHJvamVjdCwgb25seSBvbmUgaWQgd2lsbAotCQkgKiBiZSBpbiB0aGlzIHNldCBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZS4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgcGx1Z2luIGlkcywgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIAotCQkgKiBXaWxsIGJlIGVtcHR5IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICovCQkKLQkJcHVibGljIE1hcCBwbHVnaW5JZHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7OwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBNYXAgb2YgdW5pcXVlIHByb2plY3RzIGZvdW5kIGluIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlcXVpcmVkIHByb2plY3RzKSwgYnV0IG5vdCBpbmNsdWRpbmcgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIDxwPgotCQkgKiBUaGUga2V5IHdpbGwgYmUgdGhlIDxjb2RlPklQYXRoPC9jb2RlPiBmb3IgdGhlIHByb2plY3QsIGFuZCB0aGUgdmFsdWUgd2lsbCBiZSBhIDxjb2RlPkJvb2xlYW48L2NvZGU+LCB3aGVyZSB0cnVlIG1lYW5zIGl0Ci0JCSAqIGlzIHZpc2libGUgdG8gdGhlIHRvcC1sZXZlbCBwcm9qZWN0LgotCQkgKiAKLQkJICogV2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9qZWN0IHNlbnQgaW4gdG8gbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JCSAqLwkJCi0JCXB1YmxpYyBNYXAgcHJvamVjdFBhdGhzOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBKYXZhIHByb2plY3QgZm9yIHRoaXMgbGF1bmNoLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm9yIGEgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldENvbnRhaW5lcklkcygpCi0JCSAqLwotCQlwdWJsaWMgTWFwIGdldENvbnRhaW5lcklkcygpIHsKLQkJCXJldHVybiBjb250YWluZXJJZHM7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyNnZXRDb250YWluZXJzKCkKLQkJICovCi0JCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVycygpIHsKLQkJCXJldHVybiBjb250YWluZXJzOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldEphdmFQcm9qZWN0KCkKLQkJICovCi0JCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyNnZXRQbHVnaW5JZHMoKQotCQkgKi8KLQkJcHVibGljIE1hcCBnZXRQbHVnaW5JZHMoKSB7Ci0JCQlyZXR1cm4gcGx1Z2luSWRzOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0UHJvamVjdFBhdGhzKCkKLQkJICovCi0JCXB1YmxpYyBNYXAgZ2V0UHJvamVjdFBhdGhzKCkgewotCQkJcmV0dXJuIHByb2plY3RQYXRoczsKLQkJfQotCQkKLQl9Ci0JCQotCS8qKgotCSAqIExhdW5jaEluZm8gZm9yIGEgbGF1bmNoLiBTdG9yZWQgYnkga2V5IGFuZCByZXRyaWV2YWJsZSBieSB0aGUga2V5LgotCSAqIFRoaXMgaXMgb25seSBwYXNzZWQgdG8gbGF1bmNoIGRlbGVnYXRlcy4gSXQgc2hvdWxkIG5vdCBiZSBwYXNzZWQgb24gdG8KLQkgKiBvdGhlcnMsIHRob3VnaCB0aGUgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIG1heSBiZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgUHJveHlMYXVuY2hTdXBwb3J0I2dldEluZm8oU3RyaW5nKQotCSAqIEBzZWUgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXVuY2hJbmZvIHsKLQkJLyoqCi0JCSAqIENvbnRyaWJ1dG9ycyBmb3IgdGhpcyBsYXVuY2guIEl0IHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uIEl0IG1heSBiZSBlbXB0eS4KLQkJICovCi0JCXB1YmxpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY29udHJpYnV0b3JzOwotCQkKLQkJLyoqCi0JCSAqIFRoZSByZWdpc3RyeSByZXR1cm5lZCBmcm9tIHRoZSBsYXVuY2guIFRoZSBsYXVuY2ggbmVlZHMgdG8gc2V0IHRoaXMgYmVmb3JlIGl0IHJldHVybnMuCi0JCSAqLwotCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVzdWx0UmVnaXN0cnk7Ci0JCQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0SmF2YVByb2plY3QoKQotCQkgKi8KLQkJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCXJldHVybiBjb25maWdJbmZvLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0JCQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGZvciB0aGlzIGxhdW5jaC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGdldENvbmZpZ0luZm8oKSB7Ci0JCQlyZXR1cm4gY29uZmlnSW5mbzsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBjb25maWdJbmZvOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiA8cD4gCi0JICogVGhpcyB3aWxsIHdhaXQgZm9yIGJ1aWxkLiBJZiB5b3UKLQkgKiBrbm93IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgeW91ciB0aHJlYWQsIHRoZW4geW91IG11c3QgdXNlIHRoZSBvdGhlciBtZXRob2QgdGhhdCB0YWtlcyBhIHdhaXRGb3JUaHJlYWQKLQkgKiBib29sZWFuLCBhbmQgeW91IG11c3QgcGFzcyBpbiBmYWxzZS4gT3RoZXJ3aXNlIGl0IHdpbGwgZGVhZGxvY2suCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuIEl0IG11c3QgYmUgYSBqYXZhIHByb2plY3QsIGFuZCBpdCBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZtVGl0bGUgdGl0bGUgZm9yIFZNLiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFDb250cmlicyBUaGUgY29udHJpYnV0aW9ucyBhcnJheS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcmVnaXN0cnkuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBQcm94eUxhdW5jaFN1cHBvcnQjc3RhcnRJbXBsZW1lbnRhdGlvbihJUHJvamVjdCwgU3RyaW5nLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10sIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEltcGxlbWVudGF0aW9uKAotCQkJSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyB2bVRpdGxlLAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywKLQkJCUlQcm9ncmVzc01vbml0b3IgcG0pCi0JCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhcnRJbXBsZW1lbnRhdGlvbihwcm9qZWN0LCB2bVRpdGxlLCBhQ29udHJpYnMsIHRydWUsIHBtKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiA8cD4gCi0JICogSWYgeW91IGtub3cgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB5b3VyIHRocmVhZCwgdGhlbiB5b3UgbXVzdCB1c2UgY2FsbCB0aGlzIHdpdGggZmFsc2UgZm9yIHdhaXRGb3JUaHJlYWQuIE90aGVyd2lzZSBpdCB3aWxsIGRlYWRsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0LiBJdCBtdXN0IGJlIGEgamF2YSBwcm9qZWN0LCBhbmQgaXQgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2bVRpdGxlIHRpdGxlIGZvciBWTS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBhQ29udHJpYnMgVGhlIGNvbnRyaWJ1dGlvbnMgYXJyYXkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gd2FpdEZvckJ1aWxkIHdhaXQgZm9yIHRoZSBidWlsZC4gSWYgY2FsbGVyIGtub3dzIHRoYXQgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB0aGlzIHRocmVhZCwgdGhlbiBpdCBtdXN0IGNhbGwgdGhpcyB3aXRoIGZhbHNlLiBPdGhlcndpc2UgYSBkZWFkbG9jayB3aWxsIG9jY3VyLgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcmVnaXN0cnkuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEltcGxlbWVudGF0aW9uKAotCQkJSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyB2bVRpdGxlLAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywKLQkJCWJvb2xlYW4gd2FpdEZvckJ1aWxkLCAKLQkJCUlQcm9ncmVzc01vbml0b3IgcG0pCi0JCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBGaXJzdCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIHRoaXMgcHJvamVjdC4KLQkJLy8gVGhlIHByb2Nlc3MgaXM6Ci0JCS8vCTEpIFNlZSBpZiB0aGUgcHJvamVjdCdzIHBlcnNpc3RlbnQgcHJvcGVydHkgaGFzIGEgc2V0dGluZyBmb3IgInByb3h5TGF1bmNoQ29uZmlndXJhdGlvbiIsIGlmIGl0IGRvZXMsCi0JCS8vCQlnZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhhdCBuYW1lIGFuZCBjcmVhdGUgYSB3b3JraW5nIGNvcHkgb2YgaXQuCi0JCS8vCTIpIElmIG5vdCwgdGhlbiBnZXQgdGhlICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTG9jYWxQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotCQkvLwkJYW5kIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3b3JraW5nIGNvcHkuCi0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCTAsCi0JCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCQlQcm94eU1lc3NhZ2VzLk5vdF9KYXZhX1Byb2plY3RfV0FSTl8sIAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHJvamVjdC5nZXROYW1lKCl9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQotCQkvLyBGaXJzdCBpZiBzcGVjaWZpYyBzZXQuCi0JCVN0cmluZyBsYXVuY2hOYW1lID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04pOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwkJCi0JCWlmIChsYXVuY2hOYW1lICE9IG51bGwgJiYgIU5PVF9TRVQuZXF1YWxzKGxhdW5jaE5hbWUpKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY29uZmlnc1tpXS5nZXROYW1lKCkuZXF1YWxzKGxhdW5jaE5hbWUpKSB7Ci0JCQkJCWNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb25maWcgPT0gbnVsbCB8fCAhY29uZmlnLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsICIiKS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiwgKFN0cmluZykgbnVsbCk7CS8vIENvbmZpZyBub3QgZm91bmQsIG9yIGZvciBhIGRpZmZlcmVudCBwcm9qZWN0LCBzbyBubyBsb25nZXIgdGhlIGRlZmF1bHQuCi0JCQkJY29uZmlnID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3djID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJUHJveHlDb25zdGFudHMuTE9DQUxfTEFVTkNIX1RZUEUpLm5ld0luc3RhbmNlKG51bGwsIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20oIkxvY2FsUHJveHlfIitwcm9qZWN0LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQljb25maWd3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7IAotCQkJY29uZmlnID0gY29uZmlnd2M7Ci0JCX0KLQkJCi0JCXJldHVybiBzdGFydEltcGxlbWVudGF0aW9uKGNvbmZpZywgdm1UaXRsZSwgYUNvbnRyaWJzLCB3YWl0Rm9yQnVpbGQsIHBtKTsKLQl9Ci0JCi0JLyoqCi0JICogTGF1bmNoIGEgcmVnaXN0cnkgdXNpbmcgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCi0JICogPHA+IAotCSAqIFRoaXMgd2lsbCB3YWl0IGZvciBidWlsZC4gSWYgeW91Ci0JICoga25vdyB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHlvdXIgdGhyZWFkLCB0aGVuIHlvdSBtdXN0IHVzZSB0aGUgb3RoZXIgbWV0aG9kIHRoYXQgdGFrZXMgYSB3YWl0Rm9yVGhyZWFkCi0JICogYm9vbGVhbiwgYW5kIHlvdSBtdXN0IHBhc3MgaW4gZmFsc2UuIE90aGVyd2lzZSBpdCB3aWxsIGRlYWRsb2NrLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZyAKLQkgKiBAcGFyYW0gdm1UaXRsZSB0aXRsZSBmb3IgVk0uIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYUNvbnRyaWJzIFRoZSBjb250cmlidXRpb25zIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBtCi0JICogQHJldHVybiBUaGUgcmVnaXN0cnkgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBQcm94eUxhdW5jaFN1cHBvcnQjc3RhcnRJbXBsZW1lbnRhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbiwgU3RyaW5nLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10sIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEltcGxlbWVudGF0aW9uKAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJU3RyaW5nIHZtVGl0bGUsCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gYUNvbnRyaWJzLAotCQkJSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXJ0SW1wbGVtZW50YXRpb24oY29uZmlnLCB2bVRpdGxlLCBhQ29udHJpYnMsIHRydWUsIHBtKTsKLQl9Ci0KLQkvKioKLQkgKiBMYXVuY2ggYSByZWdpc3RyeSB1c2luZyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4KLQkgKiA8cD4gCi0JICogSWYgeW91IGtub3cgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB5b3VyIHRocmVhZCwgdGhlbiB5b3UgbXVzdCB1c2UgeW91IG11c3QgcGFzcyBpbiBmYWxzZSBmb3Igd2FpdEZvclRocmVhZC4gT3RoZXJ3aXNlIGl0IHdpbGwgZGVhZGxvY2suCi0JICoKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZtVGl0bGUgdGl0bGUgZm9yIFZNLiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFDb250cmlicyBUaGUgY29udHJpYnV0aW9ucyBhcnJheS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB3YWl0Rm9yQnVpbGQgd2FpdCBmb3IgdGhlIGJ1aWxkLiBJZiBjYWxsZXIga25vd3MgdGhhdCB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHRoaXMgdGhyZWFkLCB0aGVuIGl0IG11c3QgY2FsbCB0aGlzIHdpdGggZmFsc2UuIE90aGVyd2lzZSBhIGRlYWRsb2NrIHdpbGwgb2NjdXIuCi0JICogQHBhcmFtIHBtCi0JICogQHJldHVybiBUaGUgcmVnaXN0cnkgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEltcGxlbWVudGF0aW9uKAotCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCQlTdHJpbmcgdm1UaXRsZSwKLQkJCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gYUNvbnRyaWJzLAotCQkJCWJvb2xlYW4gd2FpdEZvckJ1aWxkLAotCQkJCUlQcm9ncmVzc01vbml0b3IgcG0pCi0JCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChwbSA9PSBudWxsKQotCQkJcG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlTdHJpbmcgc3RlcElkID0gIlByZS1sYXVuY2ggVk0gKCAiICsgdm1UaXRsZSArICIgKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydFN0ZXAoc3RlcElkKTsKLQkJaWYgKHZtVGl0bGUuZXF1YWxzKCJCZWFuaW5mbyIpKSAvLyROT04tTkxTLTEkCi0JCQlQZXJmb3JtYW5jZU1vbml0b3JVdGlsLmdldE1vbml0b3IoKS5zbmFwc2hvdCgxMjUpOwotCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3djID0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQotCQlwbS5iZWdpblRhc2soIiIsIDQwMCk7IC8vJE5PTi1OTFMtMSQKLQkJcG0uc3ViVGFzayhQcm94eU1lc3NhZ2VzLlByb3h5TGF1bmNoKTsJCi0JCWlmICh3YWl0Rm9yQnVpbGQpIHsKLQkJCS8vIFNlZSBpZiBidWlsZCBuZWVkZWQgb3Igd2FpdGluZyBvciBpbnByb2dyZXNzLCBpZiBzbywgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuIFdlJ3ZlCi0JCQkvLyBkZWNpZGVkIHRvbyBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lIGlmIGJ1aWxkIHdvdWxkIGFmZmVjdCB1cyBvciBub3QsIHNvIGp1c3Qgd2FpdC4JCQotCQkJaWYgKFVJX1JVTk5FUiAhPSBudWxsKQotCQkJCVVJX1JVTk5FUi5oYW5kbGVCdWlsZChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxMDApKTsKLQkJCWVsc2UKLQkJCQlydW5CdWlsZChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxMDApKTsKLQkJCQotCQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkJCQotCQlpZiAoYUNvbnRyaWJzICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBuZXdDb250cmlicyA9IG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW2FDb250cmlicy5sZW5ndGgrMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFDb250cmlicywgMCwgbmV3Q29udHJpYnMsIDEsIGFDb250cmlicy5sZW5ndGgpOwotCQkJbmV3Q29udHJpYnNbMF0gPSBuZXcgUHJveHlDb250cmlidXRvcigpOwotCQkJYUNvbnRyaWJzID0gbmV3Q29udHJpYnM7Ci0JCX0gZWxzZQotCQkJYUNvbnRyaWJzID0gbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSB7bmV3IFByb3h5Q29udHJpYnV0b3IoKX07Ci0KLQkJU3RyaW5nIGxhdW5jaEtleSA9IFN0cmluZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gbmV3IExhdW5jaEluZm8oKTsKLQkJc3luY2hyb25pemVkIChQcm94eUxhdW5jaFN1cHBvcnQuY2xhc3MpIHsKLQkJCXdoaWxlIChMQVVOQ0hfSU5GTy5jb250YWluc0tleShsYXVuY2hLZXkpKSB7Ci0JCQkJbGF1bmNoS2V5ICs9ICdhJzsgLy8gSnVzdCBhZGQgc29tZXRoaW5nIG9uIHRvIG1ha2UgaXQgdW5pcXVlLgotCQkJfQotCQkJTEFVTkNIX0lORk8ucHV0KGxhdW5jaEtleSwgbGF1bmNoSW5mbyk7Ci0JCX0KLQkJCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGNvbmZpZ3djLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIChTdHJpbmcpIG51bGwpOwotCQlhQ29udHJpYnMgPSBmaWxsSW5MYXVuY2hJbmZvKGFDb250cmlicywgbGF1bmNoSW5mbywgcHJvamVjdE5hbWUpOwotCQkKLQkJdHJ5IHsJCQotCQkJY29uZmlnd2Muc2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfTEFVTkNIX0tFWSwgbGF1bmNoS2V5KTsKLQkJCWlmICh2bVRpdGxlICE9IG51bGwgJiYgdm1UaXRsZS5sZW5ndGgoKT4wKQotCQkJCWNvbmZpZ3djLnNldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX1ZNX1RJVExFLCB2bVRpdGxlKTsKLQkJCQotCQkJaWYgKEFUVFJfUFJJVkFURSAhPSBudWxsKQotCQkJCWNvbmZpZ3djLnNldEF0dHJpYnV0ZShBVFRSX1BSSVZBVEUsIHRydWUpOwkJCQotCQkJCi0JCQkvLyBMZXQgY29udHJpYnV0b3JzIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbi4KLQkJCWZpbmFsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlicyA9IGFDb250cmliczsKLQkJCWZpbmFsIExhdW5jaEluZm8gbGluZm8gPSBsYXVuY2hJbmZvOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlicy5sZW5ndGg7IGkrKykgewotCQkJCS8vIEZpcnN0IHJ1biB0aGUgaW5pdGlhbGl6ZS4KLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCWZpbmFsIGludCBpaSA9IGk7Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWNvbnRyaWJzW2lpXS5pbml0aWFsaXplKGxpbmZvLmdldENvbmZpZ0luZm8oKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCS8vIE5vdyBydW4gdGhlIGNvbnRyaWJ1dGUgdG8gY29uZmlndXJhdGlvbi4KLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQljb250cmlic1tpaV0uY29udHJpYnV0ZVRvQ29uZmlndXJhdGlvbihjb25maWd3Yyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCXBtLndvcmtlZCgxMDApOwotCQkJCi0JCQljb25maWd3Yy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJCi0JCQlmaW5hbCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWcgPSBsYXVuY2hJbmZvLnJlc3VsdFJlZ2lzdHJ5OwotCQkJaWYgKCFwbS5pc0NhbmNlbGVkKCkgJiYgcmVnID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlByb3h5TGF1bmNoU3VwcG9ydF9SZWdpc3RyeUNvdWxkTm90U3RhcnRGb3JTb21lUmVhc29uX1dBUk5fLCBudWxsKSk7IAotCQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQkJcmVnLnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXBlcmZvcm1FeHRlbnNpb25SZWdpc3RyYXRpb25zKChCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkpIHJlZywgbGF1bmNoSW5mbyk7Ci0JCQkKLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKCJjb250cmlidXRlIHRvIHJlZ2lzdHJ5Iik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJCQkJCVN0cmluZyBzdGVwaWQgPSAiY29udHJpYnV0ZSB0byByZWdpc3RyeSBmb3IgIiArIGNvbnRyaWJzW2lpXS5nZXRDbGFzcygpOwotLy8JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydFN0ZXAoc3RlcGlkKTsKLQkJCQkJCWNvbnRyaWJzW2lpXS5jb250cmlidXRlVG9SZWdpc3RyeShyZWcpOwotLy8JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcChzdGVwaWQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0vLwkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BTdGVwKCJjb250cmlidXRlIHRvIHJlZ2lzdHJ5Iik7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBDbGVhbiB1cCBhbmQgcmV0dXJuLgotCQkJTEFVTkNIX0lORk8ucmVtb3ZlKGxhdW5jaEtleSk7Ci0JCX0JCi0JCQotCQlwbS5kb25lKCk7Ci0JCWlmICh2bVRpdGxlLmVxdWFscygiQmVhbmluZm8iKSkgLy8kTk9OLU5MUy0xJAotCQkJUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5nZXRNb25pdG9yKCkuc25hcHNob3QoMTI2KTsKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoc3RlcElkKTsKLQkJcmV0dXJuIGxhdW5jaEluZm8ucmVzdWx0UmVnaXN0cnk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGRlZmF1bHQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4gVGhpcyBpcyB1c2VmdWwgaW5mbyBldmVuIHdoZW4gbm90IGxhdW5jaGluZyBhCi0JICogdm0uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiBuZXcgY29udHJpYiBpbmZvLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxhdW5jaFN1cHBvcnRJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gY29uZmlnSW5mbyA9IG5ldyBMYXVuY2hTdXBwb3J0SUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKGphdmFQcm9qZWN0LAotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldElEc0ZvdW5kKGphdmFQcm9qZWN0KSk7Ci0JCXJldHVybiBjb25maWdJbmZvOwotCi0JfQotCQotCS8qKgotCSAqIFVzZSBpbiBjYWxsaW5nIHtAbGluayBQcm94eUxhdW5jaFN1cHBvcnQjZmlsbEluTGF1bmNoSW5mbyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10sIExhdW5jaEluZm8sIFN0cmluZyl9IGZvciB0aGUgY29uZmlndXJhdGlvbgotCSAqIGNvbnRyaWJ1dG9ycyBhcnJheSBpZiB0aGVyZSBhcmUgbm8gaW5jb21pbmcgY29udHJpYnV0b3JzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIEVNUFRZX0NPTkZJR19DT05UUklCVVRPUlMgPSBuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvclswXTsKLQkvKioKLQkgKiBGaWxsIGluIHRoZSBsYXVuY2ggaW5mbyBjb25maWcgaW5mbyBhbmQgY29udHJpYnMuIFRoZSBjb250cmlicyBzZW50IGluIG1heSBiZSBleHBhbmRlZCBkdWUgdG8gZXh0ZW5zaW9uCi0JICogcG9pbnRzIGFuZCBhIG5ldyBvbmUgY3JlYXRlZC4gRWl0aGVyIHRoZSBleHBhbmRlZCBjb3B5IG9yIHRoZSBvcmlnaW5hbCAoaWYgbm8gY2hhbmdlKSB3aWxsIGJlIHN0b3JlZCBpbgotCSAqIHRoZSBsYXVuY2hpbmZvIGFuZCByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRyaWJzIHRoaXMgc2hvdWxkIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBQYXNzIGluIHtAbGluayBQcm94eUxhdW5jaFN1cHBvcnQjRU1QVFlfQ09ORklHX0NPTlRSSUJVVE9SU30gaW4gdGhhdCBjYXNlLgotCSAqIEBwYXJhbSBsYXVuY2hJbmZvCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHJldHVybiBhIG1vZGlmaWVkIGFDb250cmlicyBpZiBhbnkgY2hhbmdlIHdhcyBtYWRlIHRvIGl0LiAgVGhpcyB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJdCB3aWxsIHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIGFDb250cmlicyB3YXMgbnVsbCBhbmQgbm8gY2hhbmdlcyB3ZXJlIG1hZGUuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBmaWxsSW5MYXVuY2hJbmZvKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBhQ29udHJpYnMsIExhdW5jaEluZm8gbGF1bmNoSW5mbywgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpIHsKLQkJCXByb2plY3ROYW1lID0gcHJvamVjdE5hbWUudHJpbSgpOwotCQkJaWYgKHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCAmJiBqYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlsYXVuY2hJbmZvLmNvbmZpZ0luZm8gPSBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oamF2YVByb2plY3QpOwotCQkJCQlpZiAoIWxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS5pc0VtcHR5KCkgfHwgIWxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJzKCkuaXNFbXB0eSgpIHx8ICFsYXVuY2hJbmZvLmNvbmZpZ0luZm8uZ2V0UGx1Z2luSWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlMaXN0IGNvbXB1dGVkQ29udHJpYnV0b3JzID0gbmV3IEFycmF5TGlzdChsYXVuY2hJbmZvLmNvbmZpZ0luZm8uZ2V0Q29udGFpbmVySWRzKCkuc2l6ZSgpK2xhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJzKCkuc2l6ZSgpK2xhdW5jaEluZm8uY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5zaXplKCkpOwotCQkJCQkJLy8gTm90ZTogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdmlzaWJpbGl0eSBidXNpbmVzcyBoZXJlLiBGb3IgY29udHJpYnV0b3JzIHRvIHByb3h5IGl0IG1lYW5zCi0JCQkJCQkvLyBzb21lIGNsYXNzZXMgaW4gdGhlIHByb2plY3RzL3BsdWdpbnMvZXRjLiBuZWVkIGNvbmZpZ3VyYXRpb24gd2hldGhlciB0aGV5IGFyZSB2aXNpYmxlIG9yIG5vdC4KLQkJCQkJCS8vIFRoaXMgaXMgYmVjYXVzZSBldmVuIHRob3VnaCBub3QgdmlzaWJsZSwgc29tZSBvdGhlciB2aXNpYmxlIGNsYXNzIG1heSBpbnN0YW50aWF0ZSBpdC4gU28gaXQKLQkJCQkJCS8vIG5lZWRzIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJLy8gRmlyc3QgaGFuZGxlIGV4cGxpY2l0IGNsYXNzcGF0aCBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpCi0JCQkJCQkJCWNvbXB1dGVkQ29udHJpYnV0b3JzLmFkZChjb250YWluZXIpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvLyBTZWNvbmQgYWRkIGluIGNvbnRyaWJ1dG9ycyB0aGF0IGV4aXN0IGZvciBhIGNvbnRhaW5lciBpZC4KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlDb250YWluZXJQYXRocyBwYXRocyA9IChDb250YWluZXJQYXRocykgaXRlci5uZXh0KCk7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udHJpYnV0b3JzID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Q29udGFpbmVyQ29uZmlndXJhdGlvbnMocGF0aHMuZ2V0Q29udGFpbmVySWQoKSwgcGF0aHMuZ2V0QWxsUGF0aHMoKSk7Ci0JCQkJCQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJT2JqZWN0IGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUHJveHlQbHVnaW4uUElfQ0xBU1MpOwotCQkJCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJCQljb21wdXRlZENvbnRyaWJ1dG9ycy5hZGQoY29udHJpYnV0b3IpOwotCQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIEZpbmFsbHkgYWRkIGluIGNvbnRyaWJ1dG9ycyB0aGF0IGV4aXN0IGZvciBhIHBsdWdpbiBpZC4KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5Db25maWd1cmF0aW9ucyhwbHVnaW5JZCk7Ci0JCQkJCQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJT2JqZWN0IGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUHJveHlQbHVnaW4uUElfQ0xBU1MpOwotCQkJCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJCQljb21wdXRlZENvbnRyaWJ1dG9ycy5hZGQoY29udHJpYnV0b3IpOwotCQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIE5vdyB0dXJuIGludG8gYXJyYXkKLQkJCQkJCWlmICghY29tcHV0ZWRDb250cmlidXRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIG5ld0NvbnRyaWJzID0gbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbYUNvbnRyaWJzLmxlbmd0aAotCQkJCQkJCQkJKyBjb21wdXRlZENvbnRyaWJ1dG9ycy5zaXplKCldOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYUNvbnRyaWJzLCAwLCBuZXdDb250cmlicywgMCwgYUNvbnRyaWJzLmxlbmd0aCk7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNDb250cmlicyA9IChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10pIGNvbXB1dGVkQ29udHJpYnV0b3JzCi0JCQkJCQkJCQkudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltjb21wdXRlZENvbnRyaWJ1dG9ycy5zaXplKCldKTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNDb250cmlicywgMCwgbmV3Q29udHJpYnMsIGFDb250cmlicy5sZW5ndGgsIGNDb250cmlicy5sZW5ndGgpOwotCQkJCQkJCWFDb250cmlicyA9IG5ld0NvbnRyaWJzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlsYXVuY2hJbmZvLmNvbnRyaWJ1dG9ycyA9IGFDb250cmliczsKLQkJcmV0dXJuIGFDb250cmliczsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgdHlwZSBvZiByZWdpc3RyeSBhbmQgdGhlIGxhdW5jaGluZm8gcGF0aHMuCi0JICogPHA+Ci0JICogVGhpcyBpcyBtZWFudCB0byBiZSBjYWxsZWQgb25seSBieSByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QgbGF1bmNoIHRocm91Z2ggYSBsYXVuY2ggY29uZmlncmF0aW9uIGFmdGVyIHRoZSByZWdpc3RyeSBpcyBjcmVhdGVkIGJ1dAotCSAqIGJlZm9yZSB0aGUge0BsaW5rIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvUmVnaXN0cnkoUHJveHlGYWN0b3J5UmVnaXN0cnkpfSBpcyBjYWxsZWQuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseQotCSAqIGJ5IHJlZ2lzdHJpZXMgdGhhdCB1c2VkIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gbGF1bmNoLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlUmVnaXN0cnkKLQkgKiBAcGFyYW0gbGF1bmNoSW5mbwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybUV4dGVuc2lvblJlZ2lzdHJhdGlvbnMoZmluYWwgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGJhc2VSZWdpc3RyeSwgTGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBjb25maWdJbmZvID0gbGF1bmNoSW5mby5jb25maWdJbmZvOwotCQlpZiAoY29uZmlnSW5mbyAhPSBudWxsICYmICghY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS5pc0VtcHR5KCkgfHwgIWNvbmZpZ0luZm8uZ2V0UGx1Z2luSWRzKCkuaXNFbXB0eSgpKSkgewotCQkJU3RyaW5nIHJlZ2lzdHJ5SUQgPSBiYXNlUmVnaXN0cnkuZ2V0UmVnaXN0cnlUeXBlSUQoKTsKLQkJCS8vIE5vdGU6IFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHZpc2liaWxpdHkgYnVzaW5lc3MgaGVyZS4gRm9yIGNvbnRyaWJ1dG9ycyB0byBwcm94eSBpdCBtZWFucwotCQkJLy8gc29tZSBjbGFzc2VzIGluIHRoZSBwcm9qZWN0cy9wbHVnaW5zL2V0Yy4gbmVlZCBjb25maWd1cmF0aW9uIHdoZXRoZXIgdGhleSBhcmUgdmlzaWJsZSBvciBub3QuCi0JCQkvLyBUaGlzIGlzIGJlY2F1c2UgZXZlbiB0aG91Z2ggbm90IHZpc2libGUsIHNvbWUgb3RoZXIgdmlzaWJsZSBjbGFzcyBtYXkgaW5zdGFudGlhdGUgaXQuIFNvIGl0Ci0JCQkvLyBuZWVkcyB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQotCQkJLy8gRmlyc3QgY2FsbCByZWdpc3RyYXRpb25zIHRoYXQgZXhpc3QgZm9yIGEgY29udGFpbmVyIGlkLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDb250YWluZXJQYXRocyBwYXRocyA9IChDb250YWluZXJQYXRocykgaXRlci5uZXh0KCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udHJpYnV0b3JzID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Q29udGFpbmVyRXh0ZW5zaW9ucyhwYXRocy5nZXRDb250YWluZXJJZCgpLCBwYXRocy5nZXRBbGxQYXRocygpKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAocmVnaXN0cnlJRC5lcXVhbHMoY29udHJpYnV0b3JzW2ldLmdldEF0dHJpYnV0ZShQcm94eVBsdWdpbi5QSV9SRUdJU1RSWV9UWVBFKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uIGNvbnRyaWJ1dG9yID0gKElFeHRlbnNpb25SZWdpc3RyYXRpb24pIGNvbnRyaWJ1dG9yc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFByb3h5UGx1Z2luLlBJX0NMQVNTKTsKLQkJCQkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29udHJpYnV0b3IucmVnaXN0ZXIoYmFzZVJlZ2lzdHJ5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsIFBsYXRmb3JtIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gSWYgbm90IHJpZ2h0IGNsYXNzLCBqdXN0IGlnbm9yZSBpdC4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gRmluYWxseSBhZGQgaW4gY29udHJpYnV0b3JzIHRoYXQgZXhpc3QgZm9yIGEgcGx1Z2luIGlkLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5FeHRlbnNpb25zKHBsdWdpbklkKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAocmVnaXN0cnlJRC5lcXVhbHMoY29udHJpYnV0b3JzW2ldLmdldEF0dHJpYnV0ZShQcm94eVBsdWdpbi5QSV9SRUdJU1RSWV9UWVBFKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uIGNvbnRyaWJ1dG9yID0gKElFeHRlbnNpb25SZWdpc3RyYXRpb24pIGNvbnRyaWJ1dG9yc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFByb3h5UGx1Z2luLlBJX0NMQVNTKTsKLQkJCQkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29udHJpYnV0b3IucmVnaXN0ZXIoYmFzZVJlZ2lzdHJ5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsIFBsYXRmb3JtIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gSWYgbm90IHJpZ2h0IGNsYXNzLCBqdXN0IGlnbm9yZSBpdC4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQl9Ci19Ci0KLQotCS8qCi0JICogUnVuIHRoZSBidWlsZC4gSWYgdGhlIG9yaWdpbmFsIGxhdW5jaCB3YXMgaW4gdGhlIFVJIHRocmVhZCwgdGhpcyB3aWxsCi0JICogYmUgY2FsbGVkIHVuZGVyIGNvbnRyb2wgb2YgYW4gSVByb2dyZXNzU2VydmljZSBzbyB0aGF0IGl0IGlzIGluIGEgc2VwYXJhdGUKLQkgKiB0aHJlYWQgYW5kIHRoZSBVSSB3aWxsIHJlbWFpbiByZXNwb25zaXZlIChpbiB0aGF0IGVpdGhlciBhIGJ1c3kgY3Vyc29yIGNvbWVzCi0JICogdXAgb3IgZXZlbnR1YWxseSBhIHByb2dyZXNzIGRpYWxvZykuCi0JICogSWYgdGhlIHBtIGlzIGNhbmNlbGVkLCB0aGlzIHdpbGwganVzdCByZXR1cm4sIGJ1dCB0aGUgY2FsbGVyIG11c3QgY2hlY2sgaWYgdGhlIHBtIGlzIGNhbmNlbGVkLgotCSAqIAotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gc28gdGhhdCBvbmx5IHRoZSBVSSBoYW5kbGVyIHdpbGwgYWNjZXNzIGl0LgotCSAqLwotCXN0YXRpYyB2b2lkIHJ1bkJ1aWxkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBhdXRvYnVpbGRpbmcgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJaWYgKCFhdXRvYnVpbGRpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgYXJlIG5vdCBhdXRvYnVpbGRpbmcuIFNvIGtpY2sgb2ZmIGEgYnVpbGQgcmlnaHQgaGVyZSBhbmQKLQkJCQkvLyB3YWl0IGZvciBpdC4gKElmIHdlIGFscmVhZHkgd2l0aGluIGEgYnVpbGQgb24gdGhpcyB0aHJlYWQsIHRoZW4gdGhpcwotCQkJCS8vIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgYnVpbGRpbmcuIFdlIHdpbGwgdGFrZSB0aGF0IHJpc2suIElmCi0JCQkJLy8gc29tZSBvdGhlciB0aHJlYWQgaXMgYnVpbGRpbmcsIHdlIHdpbGwgd2FpdCBmb3IgaXQgZmluaXNoIGJlZm9yZSB3ZQotCQkJCS8vIGNhbiBnZXQgaXQgYW5kIGRvIG91ciBidWlsZC4KLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgcG0pOyAKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgcG0gaXMgYWxyZWFkeSBtYXJrZWQgY2FuY2VsZWQsIHNvIGNhbGxlciBjYW4gY2hlY2sgdGhhdCBpbnN0ZWFkLgotCQkJfSAKLQkJfSBlbHNlIHsKLQkJCXBtLmJlZ2luVGFzaygiIiwgMjAwKTsgLy8kTk9OLU5MUy0xJAotCQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IEpvYi5nZXRKb2JNYW5hZ2VyKCk7Ci0JCQlKb2IgY3VycmVudEpvYiA9IGpvYk1hbmFnZXIuY3VycmVudEpvYigpOwotCQkJaWYgKGN1cnJlbnRKb2IgPT0gbnVsbCB8fCAoIWN1cnJlbnRKb2IuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgJiYgIWN1cnJlbnRKb2IuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEKSkpIHsgCi0JCQkJaWYgKGpvYk1hbmFnZXIuZmluZChSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpLmxlbmd0aCA+IDAgfHwgam9iTWFuYWdlci5maW5kKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEKS5sZW5ndGggPjApIHsKLQkJCQkJLy8gV2UgYXJlIG5vdCB3aXRoaW4gYSBidWlsZCBqb2IuIElmIHdlIHdlcmUsIHRoZW4gd2UgZG9uJ3QgZG8gdGhlIGJ1aWxkLiBXZSB3aWxsIHRha2UKLQkJCQkJLy8gdGhhdCByaXNrLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHdpdGhpbiB0aGUgYnVpbGQsIHdlIGNhbid0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBiZWNhdXNlCi0JCQkJCS8vIHdlIHdvdWxkIHN0b3AgdGhlIHRocmVhZCBhbmQgc28gdGhlIGJ1aWxkIHdvdWxkIG5vdCBjb21wbGV0ZS4KLQkJCQkJcG0uc3ViVGFzayhQcm94eU1lc3NhZ2VzLlByb3h5V2FpdEZvckJ1aWxkKTsgCi0JCQkJCXRyeSB7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWpvYk1hbmFnZXIuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJCQkJCQlqb2JNYW5hZ2VyLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCQotCQotCS8qCi0JICogVGhpcyBwcmV2ZW50cyB0aGUgbGF1bmNoIGZyb20gYmVpbmcgc2hvd24uIEhvd2V2ZXIgdGhlc2UgY29uc3RhbnRzIGFyZSBpbiBVSSBjb21wb25lbnQsIGFuZCB3ZSBkb24ndAotCSAqIHdhbnQgdG8gcHJlLXJlcSB0aGF0LiBTbyB3ZSB3aWxsIGdldCB0aGVtIHJlZmxlY3RpdmVseSBpbnN0ZWFkLgotCSAqIHB1YmxpYyBidXQgb25seSBzbyB0aGF0IGxhdW5jaCBkZWxlZ2F0ZSBjYW4gZ2V0IHRvIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfUFJJVkFURTsKLQlwcml2YXRlIHN0YXRpYyBJVUlSdW5uZXIgVUlfUlVOTkVSID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCUFUVFJfUFJJVkFURSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBTZWUgaWYgd2UgaGF2ZSBhIFVJIGJ1bmRsZSBhbmQgaXQgaXMgYWN0aXZlLiBJZiBpdCBleGlzdHMgYnV0IGlzIG5vdCBhY3RpdmUsCi0JCQkvLyB0aGVuIHdlIHdvbid0IGRvIGFueXRoaW5nLiBJZiB3ZSB3ZXJlIHJ1bm5pbmcgYSBVSSBhcHBsaWNhdGlvbiwgaXQgc2hvdWxkIGFscmVhZHkKLQkJCS8vIG9mIGJlZW4gYWN0aXZlIGJlZm9yZSB3ZSBnb3QgaGVyZS4KLQkJCUJ1bmRsZSB1aUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkiKTsJLy8kTk9OLU5MUy0xJAotCQkJaWYgKHVpQnVuZGxlICE9IG51bGwgJiYgdWlCdW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gV2UgaGF2ZSBhIFVJIGJ1bmRsZSwgc28gd2UgY2FuIGxvYWQgb3VyIFVJUnVubmVyIGNsYXNzIGFuZCBpdCB3aWxsIGxvYWQgZmluZS4KLQkJCQkJVUlfUlVOTkVSID0gKElVSVJ1bm5lcikgQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuVUlSdW5uZXIiKS5uZXdJbnN0YW5jZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZTEsIExldmVsLldBUk5JTkcpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBTbyB0aGF0IHdlIGNhbiBydW4gaGVhZGxlc3MgKHcvbyB1aSksIG5lZWQgdG8gZG8gY2xhc3MgZm9yTmFtZSBmb3IgZGVidWd1aSBjb250YW50cwotCQkJCUJ1bmRsZSBkZWJ1Z3VpQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRlYnVndWlCdW5kbGUgIT0gbnVsbCAmJiBkZWJ1Z3VpQnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJCQlDbGFzcyBkZWJ1Z1VJQ29uc3RhbnRzID0gZGVidWd1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQVRUUl9QUklWQVRFID0gKFN0cmluZykgZGVidWdVSUNvbnN0YW50cy5nZXRGaWVsZCgiQVRUUl9QUklWQVRFIikuZ2V0KG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkJCQotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBPbmx5IHJlZmVyZW5jZWQgYnkgbGF1bmNoIGRlbGVnYXRlcy4gcHVibGljIGJlY2F1c2UgdGhleSBhcmUgaW4gb3RoZXIgcGFja2FnZXMsCi0JICogb3IgZXZlbiBleHRlcm5hbCBkZXZlbG9wZXJzIHBhY2thZ2VzLiBOb3QgbWVhbnQgdG8gYmUgZ2VuZXJhbGx5IGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbid0IHBhc3MgdGhlIGdlbmVyaWMgaW5mbyBpbnRvIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBiZWNhdXNlIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gY2FuJ3QgdGFrZSBvYmplY3RzLiBPbmx5IGNhbiB0YWtlIHN0cmluZ3MgYW5kIG51bWJlcnMuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMYXVuY2hJbmZvIGdldEluZm8oU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKExhdW5jaEluZm8pIExBVU5DSF9JTkZPLmdldChrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzdHJpbmcgcGF0aCBpbnRvIGEgdmFsaWQgdXJsLgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiB0aGUgdXJsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBjb252ZXJ0YWJsZSAoaS5lLiBub3Qgd2VsbC1mb3JtZWQpLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGNvbnZlcnRTdHJpbmdQYXRoVG9VUkwoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYXRoICE9IG51bGwgPyBuZXcgRmlsZShwYXRoKS50b1VSTCgpIDogbnVsbDsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3RyaW5nIHBhdGhzIGludG8gYSB2YWxpZCB1cmxzLgotCSAqIAotCSAqIEBwYXJhbSBwYXRocwotCSAqIEByZXR1cm4gdGhlIHVybHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcGF0aHMgaXMgbnVsbC4gQW55IHBhdGggbm90IGNvbnZlcnRhYmxlIChpLmUuIG5vdCB3ZWxsLWZvcm1lZCkgd2lsbCBub3QgYmUgaW4gdGhlIGZpbmFsIGxpc3QuCi0JICogU28gdGhpcyBtZWFucyB0aGUgcmVzdWx0IGxlbmd0aCBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBwYXRocyBsZW5ndGguCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkxbXSBjb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChTdHJpbmdbXSBwYXRocykgewotCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJVVJMW10gcmVzdWx0ID0gbmV3IFVSTFtwYXRocy5sZW5ndGhdOwotCQkJaW50IG5leHRVUkwgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVVSTCB1cmwgPSBjb252ZXJ0U3RyaW5nUGF0aFRvVVJMKHBhdGhzW2ldKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXJlc3VsdFtuZXh0VVJMKytdID0gdXJsOyAgIAotCQkJfQotCQkJaWYgKG5leHRVUkwgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gTm9uZSB3ZXJlIGZvdW5kLgotCQkJCi0JCQlpZiAobmV4dFVSTCAhPSByZXN1bHQubGVuZ3RoKSB7Ci0JCQkJVVJMW10gbnIgPSBuZXcgVVJMW25leHRVUkxdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCBuciwgMCwgbnIubGVuZ3RoKTsKLQkJCQlyZXN1bHQgPSBucjsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgdXJscyB0byBzdHJpbmcgYXJyYXkuIEl0IGlzIGFzc3VtZWQgdGhlIHVybHMgYXJlIGluIGZpbGUgcHJvdG9jb2wuIEl0IGhhbmRsZXMgcGxhdGZvcm0gYW5kIEpESyByZXF0cy4gdG9vLgotCSAqIEBwYXJhbSB1cmxzCi0JICogQHJldHVybiBzdHJpbmcgcGF0aHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdXJscyBpcyA8Y29kZT5udWxsPC9jb2RlPi4gQW55IDxjb2RlPm51bGw8L2NvZGU+IGVudHJ5IG9mIHVybHMgd2lsbCByZXN1bHQgaW4gCi0JICogYSBjb3JyZXNwb25kaW5nIDxjb2RlPm51bGw8L2NvZGU+IGluIHRoZSBzdHJpbmdzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gY29udmVydFVSTHNUb1N0cmluZ3MoVVJMW10gdXJscykgewotCQlpZiAodXJscyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1t1cmxzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBbMTMyMzc4XSBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBJQk0gSkRLJ3MuIFRoZXkgY2FuJ3QgaGFuZGxlIHRoZSBnZXRGaWxlKCkgZnJvbSBhIFVSTCBpbiB0aGUgamF2YSBsaWIgcGF0aCBvbiBXaW5kb3dzLgotCQkJCS8vIFRoYXQgaXMgYmVjYXVzZSB0aGUgbm9ybWFsaXplZCBmb3JtYXQgb2YgYSBmaWxlIHVybCBvbiB3aW5kb3dzIGlzICJmaWxlOi9EOi9hc2RmYXNmIi4gQnV0IElCTSBKREtzIGNhbid0IGhhbmRsZSB0aGUKLQkJCQkvLyBsZWFkaW5nIHNsYXNoLiBTdW4gSkRLcyBkby4KLQkJCQlVUkwgdXJsID0gdXJsc1tpXTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJc3RyaW5nc1tpXSA9IHVybC5nZXRGaWxlKCk7Ci0JCQkJCWlmKHN0cmluZ3NbaV0uc3RhcnRzV2l0aCgiLyIpICYmIFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLk9TX1dJTjMyKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3RyaW5nc1tpXSA9IHN0cmluZ3NbaV0uc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdHJpbmdzOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBMb2NhbCBjb250cmlidXRvciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IGNlcnRhaW4gamFycyBhcmUgaW4gdGhlIHBhdGguCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jc3RhdGljIGNsYXNzIFByb3h5Q29udHJpYnV0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLQkJCS8vIEFkZCB0aGUgcmVxdWlyZWQgamFycyB0byB0aGUgZW5kIG9mIHRoZSBjbGFzc3BhdGguIChXZSB3YW50IHByb3h5Q29tbW9uIGFuZCBpbml0UGFyc2VyICgrIGluaXRQYXJzZXIgTkxTKSwgYnV0IHRoZXkgYXJlIGluIHRoZSBydW50aW1lIG9mIHRoZSBwcm94eSBidW5kbGUgKHdoaWNoIGlzIGphcnJlZCB1cCksIHNvIHdlIGNvbnRyaWJ1dGUgdGhlIGJ1bmRsZSBpbnN0ZWFkLgotCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAoSVBhdGgpIG51bGwsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIHRydWUpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzg2NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFByb3h5TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5TWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5RmFjdG9yeV9FWENfX05vQmVhblByb3h5RmFjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5UeXBlUHJveHlGYWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vdF9KYXZhX1Byb2plY3RfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fVk1fV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fSW1wbGVtZW50YXRpb25fV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlMYXVuY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlXYWl0Rm9yQnVpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9JbkludmFsaWRTdGF0ZUR1ZVRvX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9JbkludmFsaWRTdGF0ZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fVHlwZVNlbnRJbkludmFsaWRPcmRlcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fQXJyYXlUeXBlTm90QW5BcnJheV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fQ2Fubm90SGFuZGxlTm9SZWNlaXZlT25GaWVsZEFjY2Vzc19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fTWV0aG9kc05lZWRSZWNlaXZlcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fSW52YWxpZE1hcmtOZXN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5UGx1Z2luX0NsZWFudXBEZWZhdWx0UHJveHlMYXVuY2hDb25maWd1cmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eUxhdW5jaFN1cHBvcnRfUmVnaXN0cnlDb3VsZE5vdFN0YXJ0Rm9yU29tZVJlYXNvbl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0NyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbl9JbnZhbGlkRm9yUmVhc3NpZ25tZW50X0VYQ187Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm94eU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0ludmFsaWRQcm94eTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkM2ZkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlU3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRWNsaXBzZUxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5Db250YWluZXJQYXRoczsKLQotLyoqCi0gKiBUaGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUgcGx1Z2luLgotICovCi0KLXB1YmxpYyBjbGFzcyBQcm94eVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JCi0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgaXMgZm9yIGEgbGlzdGVuZXIgdGhhdCBuZWVkcyB0byBrbm93IGlmIHRoaXMgcGx1Z2luIChQcm94eVBsdWdpbikgaXMgYmVpbmcgc2h1dGRvd24uIAotCSAqIEl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lIGV4dGVuc2lvbnMgdGhhdCBnZXQgYWRkZWQgZHluYW1pY2FsbHkgdGhhdCBuZWVkIHRvIGtub3cgd2hlbiB0aGUKLQkgKiBwbHVnaW4gaXMgYmVpbmcgc2h1dGRvd24uIENhbid0IHVzZSBuZXcgYnVuZGxlIGxpc3RlbmVyIGZvciB0aGlzIGJlY2F1c2UgaXQgbm90aWZpZXMgQUZURVIgc2h1dGRvd24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJUHJveHlQbHVnaW5TaHV0ZG93bkxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIFByb3h5UGx1Z2luIGlzIGluIHNodXRkb3duLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBQcm94eVBsdWdpbiBQUk9YWV9QTFVHSU4gPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1ZNX05PVkVSSUZZX0tFWSA9ICJKRU1fUFJFRkVSRU5DRVNfVk1fTk9WRVJJRllfS0VZIjsgLy8gS2V5IGZvciBOT1ZFUklGWSBvcHRpb24gb2YgVk0gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBERV9OQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZSIgOyAvLyROT04tTkxTLTEkCi0JCQotCS8vIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZW4gaW4gZGV2ZWxvcG1lbnQgbW9kZSBhbmQgaXQgd2lsbCB0cnkgZm9yIHByb3h5IGphcnMgaW4gZGlyZWN0b3JpZXMuCi0JcHJpdmF0ZSBib29sZWFuIGRldk1vZGU7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Qgc2h1dGRvd25MaXN0ZW5lcnM7Ci0KLQlwdWJsaWMgUHJveHlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCVBST1hZX1BMVUdJTiA9IHRoaXM7Ci0JCWRldk1vZGUgPSBQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpOyAgCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rldk1vZGUoKSB7Ci0JCXJldHVybiBkZXZNb2RlOwotCX0KLQotCS8qKgotCSAqIEFjY2VzcyB0aGUgc2luZ2xldG9uCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIHBsdWdpbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gUFJPWFlfUExVR0lOOwotCX0KLQkKLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkKLQkJCWxvZ2dlciA9IEVjbGlwc2VMb2dnZXIuZ2V0RWNsaXBzZUxvZ2dlcih0aGlzKTsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9CQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHRha2UgdGhlIGJ1bmRsZSBhbmQgZmlsZSBuYW1lIGFuZCBtYWtlIGl0IGxvY2FsIGFuZCByZXR1cm4gdGhhdAotCSAqIGZ1bGx5IHF1YWxpZmllZC4gSXQgd2lsbCBsb29rIGluIGZyYWdtZW50cywgYnV0IG9ubHkgcmV0dXJucyBmaXJzdCBmb3VuZC4gSWYgdGhlcmUgY2FuIGJlIG11bHRpcGxlcyB1c2UKLQkgKiB0aGUgb25lIGZvciBidW5kbGVzIGFuZCBpdCBmcmFnbWVudHMuCi0JICogPHA+Ci0JICogSWYgd2UgYXJlIGluIGRldmVsb3BtZW50IGFuZCBpdCB3aWxsIHBpY2sgaXQgdXAgZnJvbSB0aGUgcGF0aAotCSAqIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBwcm94eS5qYXJzIGZpbGUgbG9jYXRlZCBpbiB0aGUgYnVuZGxlIHBhc3NlZCBpbi4gVGhpcyBhbGxvd3MgZGV2ZWxvcG1lbnQgY29kZSB0byBiZQotCSAqIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGFjdHVhbCBydW50aW1lIGphcnMuIElmIHRoZSBydW50aW1lIGphcnMgYXJlIGZvdW5kLAotCSAqIHRoZXkgd2lsbCBiZSB1c2VkLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlIGlmIGxvb2tpbmcgZm9yIGZpbGUgcnVudGltZS94eXouamFyIGluIGJ1bmRsZSBhYmMsIHRoZW4gaW4gYnVuZGxlIGRpcmVjdG9yeSBmb3IgYWJjLAotCSAqIHRoZXJlIHNob3VsZCBiZSBhIGZpbGUgY2FsbGVkIHByb3h5LmphcnMuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW4gZGV2ZWxvcG1lbnQsIHRoaXMgZmlsZSBzaG91bGQgbm90Ci0JICogYmUgZGlzdHJpYnV0ZWQgZm9yIHByb2R1Y3Rpb24uIEl0IHdvdWxkIGJlIGRpc3RyaWJ1dGVkIGluIHRoZSBTREsgZW52aXJvbm1lbnQgd2hlbiB0ZXN0aW5nIGlzIGRlc2lyZWQuCi0JICogPHA+Ci0JICogVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBpczoKLQkgKiAJcnVudGltZWZpbGU9L3Byb2plY3RuYW1lL2J1aWxkZGlyZWN0b3J5Ci0JICogPHA+Ci0JICogRm9yIHRoaXMgdG8gd29yayB3aGVuIHRoZSBhY3R1YWwgamFyIGlzIG5vdCBmb3VuZCwgdGhlIEVjbGlwc2UgbXVzdCBvZiBiZWVuIHN0YXJ0ZWQgaW4gCi0JICogZGV2IG1vZGUgKGkuZS4gdGhlIGJ1bmRsZSBsb2NhdGlvbiB3aWxsIGJlIGEgcHJvamVjdCB3aXRoaW4gdGhlIGRldmVsb3BlciBFY2xpcHNlLiBUaGF0IHdheQotCSAqIHdlIGNhbiBnbyB1cCBvbmUgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGluc3RhbGwgbG9jYXRpb24gYW5kIGFzc3VtZSB0aGUgYWJvdmUgcHJvamVjdG5hbWUKLQkgKiB3aWxsIGJlIGZvdW5kIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkuCi0JICogPHA+Ci0JICogRm9yIHRoZSBhYm92ZSBleGFtcGxlOgotCSAqIAlydW50aW1lL3h5ei5qYXI9L3h5enByb2plY3QvYmluCi0JICogPHA+Ci0JICogSXQgd2lsbCByZXR1cm4gIi4iIGlmIGZpbGUgY2FuJ3QgYmUgZm91bmQuIEl0IG1lYW5zIG5vdGhpbmcgYnV0IGl0IHdvbid0IGNhdXNlIGp2bSB0byBjcmFzaC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSBvciA8Y29kZT4iLiI8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvY2FsaXplRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCVVSTCB1cmwgPSB1cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQlyZXR1cm4gdXJsICE9IG51bGwgPyBnZXRGaWxlRnJvbVVSTCh1cmwpIDogIi4iOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBTdHJpbmcgbG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlVUkwgdXJsID0gdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQlyZXR1cm4gdXJsICE9IG51bGwgPyBnZXRGaWxlRnJvbVVSTCh1cmwpIDogIi4iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEp1c3QgbGlrZSBsb2NhbGl6ZUZyb21CdW5kbGUgZXhjZXB0IGl0IHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3MuIEl0IHdpbGwgbG9vayBmb3IgdGhlIGZpbGVuYW1lCi0JICogd2l0aGluIHRoZSBidW5kbGUgYW5kIGFueSBmcmFnbWVudHMgb2YgdGhlIGJ1bmRsZS4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogVG8gZmluZCB0aGUgZmlsZXMgaW4gdGhlIGZyYWdtZW50cyB0aGF0IGFyZSBpbiB0aGUgcnVudGltZSBwYXRoIChpLmUuIGxpYnJhcmllcyksIGl0IHdpbGwgbmVlZCB0byB1c2UgYSBzdWZmaXgsCi0JICogVGhpcyBpcyBiZWNhdXNlIHRoZSBKRFQgd2lsbCBnZXQgY29uZnVzZWQgaWYgYSBydW50aW1lIGphciBpbiBhIGZyYWdtZW50IGhhcyB0aGUgc2FtZSBuYW1lCi0JICogYXMgYSBydW50aW1lIGphciBpbiB0aGUgbWFpbiBidW5kbGUuCi0JICogTk9URTogVGhpcyBpcyBvYnNvbGV0ZS4gSkRUIG5vIGxvbmdlciBoYXMgdGhpcyBwcm9ibGVtLiBTbyB3ZSBjYW4gZmluZCBsaWJyYXJpZXMgaW4gZnJhZ21lbnRzIHRoYXQgaGF2ZSB0aGUKLQkgKiBzYW1lIGZpbGUgcGF0aC4gCi0JICogPHA+Ci0JICogU28gd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0dGVybjoKLQkgKiA8b2w+Ci0JICogPGxpPkZpbmQgaW4gYWxsIG9mIHRoZSBmcmFnbWVudHMgdGhvc2UgdGhhdCBtYXRjaCB0aGUgbmFtZSBleGFjdGx5IGluIHRoZSBzYW1lIHBhdGhzIGlmIHBhdGhzIGFyZSBzdXBwbGllZC48L2xpPgotCSAqIDxsaT5GaW5kIGluIGFsbCBvZiB0aGUgZnJhZ21lbnRzLCBpbiB0aGVpciBydW50aW1lIHBhdGggKGxpYnJhcnkgc3RtdCksIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG5hbWUgCi0JICogICAgYnV0IGhhdmUgYSBzdWZmaXggdGhlIHNhbWUgYXMgdGhlIHVuaXF1ZWlkIG9mIHRoZSBmcmFnbWVudCAocHJlY2VlZGVkIGJ5IGEgcGVyaW9kKS4gVGhpcyBpcyBzbyB0aGF0IGl0IGNhbiBiZSBlYXNpbHkKLQkgKiAgICBmb3VuZCBidXQgeWV0IGJlIHVuaXF1ZSBpbiB0aGUgZW50aXJlIGxpc3Qgb2YgZnJhZ21lbnRzLiBGb3IgZXhhbXBsZSBpZiBsb29raW5nIGZvciAicnVudGltZS94eXouamFyIgotCSAqICAgIGFuZCB3ZSBoYXZlIGZyYWdtZW50ICJhLmIuYy5kLmZyYWciLCB0aGVuIGluIHRoZSBydW50aW1lIHBhdGggd2Ugd2lsbCBsb29rIGZvciB0aGUgZmlsZQotCSAqICAgICJydW50aW1lL3h5ei5hLmIuYy5kLmZyYWcuamFyIi4gTm90ZTogVGhpcyBpcyBvYnNvbGV0ZS4gU3RpbGwgaGVyZSBvbmx5IGZvciBwb3NzaWJsZSBvbGQgY29kZS4gV2lsbCBnbyAKLQkgKiAgICBhd2F5IGluIGZ1dHVyZS48L2xpPgotCSAqIDxwPgotCSAqIElmIHRoZSBmaWxlcyBpbiB0aGUgZnJhZ21lbnRzIGFyZSBub3QgaW4gdGhlIGZyYWdtZW50cyBsaWJyYXJ5IHBhdGggdGhlbiBpdCBjYW4gaGF2ZSB0aGUgc2FtZSBuYW1lLiBOT1RFOiBPYnNvbGV0ZSwKLQkgKiBKRFQgY2FuIG5vdyBoYW5kbGUgc2FtZSBuYW1lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBubHMgd2hlcmUgdGhlIG5scyBmb3IgdGhlIGZpbGVuYW1lIHdpbGwgYmUgaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZyYWdtZW50cyBvZiB0aGUgcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGxvY2FsaXplQWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJVVJMW10gdXJscyA9IHVybExvY2FsaXplQWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t1cmxzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gZ2V0RmlsZUZyb21VUkwodXJsc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUZyb21VUkwoVVJMIHVybCkgewotCQkvLyBXZSBuZWVkIHRvIGRvIHRoaXMgaW4gYSBkZXZpY2UgaW5kZXBlbmRlbnQgd2F5LiBUaGUgVVJMIHdpbGwgYWx3YXlzIHB1dCBhIGxlYWRpbmcgJy8nIGluIHRoZQotCQkvLyBmaWxlIHBhcnQgb2YgdGhlIFVSTCwgYnV0IG9uIFdpbmRvd3Mgd2UgbmVlZCB0byBoYXZlIHRoaXMgJy8nIHJlbW92ZWQuIFNvbWUgSlJFJ3MgZG9uJ3QgdW5kZXJzdGFuZCBpdC4KLQkJcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOwotCi0JfQotCi0JcHVibGljIFVSTCB1cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXJldHVybiB1cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBuZXcgUGF0aChmaWxlbmFtZVdpdGhpbkJ1bmRsZSkpOwotCX0KLQlwdWJsaWMgVVJMIHVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBJUGF0aCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQl0cnkgewotCQkJVVJMIHB2bSA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSwgbnVsbCk7Ci0JCQlpZiAocHZtICE9IG51bGwpCi0JCQkJcmV0dXJuIEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwdm0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRldk1vZGUpIHsKLQkJCVVSTFtdIHVybHMgPSBmaW5kRGV2QWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCQkJaWYgKHVybHMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gdXJsc1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTGlrZSA8Y29kZT5sb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHM8L2NvZGU+IGV4Y2VwdCBpdCByZXR1cm5zIFVSTCdzIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2VlIFByb3h5UGx1Z2luI2xvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUsIFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlyZXR1cm4gdXJsTG9jYWxpemVBbGxCdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCX0KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXJldHVybiB1cmxMb2NhbGl6ZUFsbEJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEBwYXJhbSBmcmFnbWVudHMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBVUkxbXSB1cmxMb2NhbGl6ZUFsbEJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBCdW5kbGVbXSBmcmFnbWVudHMsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCi0JCUFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJVVJMIHVybCA9IGludGVybmFsVXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJdXJscy5hZGQodXJsKTsKLQkJaWYgKGZyYWdtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBmcmFnbWVudCA9IGZyYWdtZW50c1tpXTsKLQkJCQl1cmwgPSBpbnRlcm5hbFVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoZnJhZ21lbnQsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXVybHMuYWRkKHVybCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVUkxbXSkgdXJscy50b0FycmF5KG5ldyBVUkxbdXJscy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlKQVJTID0gInByb3h5LmphcnMiOwkvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHNlZSBQcm94eVBsdWdpbiNsb2NhbGl6ZUZyb21CdW5kbGUoQnVuZGxlLCBTdHJpbmcpCi0JICogCi0JICogVGhpcyBpcyBqdXN0IGEgaGVscGVyIHRvIHJldHVybiBhIHVybCBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFVSTCB1cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQkvLyBJZiB0aGUgZmlsZW5hbWVXaXRoaW5CdW5kbGUgYmVnaW5zIHdpdGggb25lIG9mIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycywKLQkJLy8gaXQgbWlnaHQgYmUgaW4gYSBmcmFnbWVudC4KLQkJaWYgKGZpbGVuYW1lV2l0aGluQnVuZGxlLmNoYXJBdCgwKSA9PSAnJCcKLQkJCQkmJiAoZmlsZW5hbWVXaXRoaW5CdW5kbGUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCAiJG5sJCIsIDAsICIkbmwkIi5sZW5ndGgoKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl8fCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsICIkb3MkIiwgMCwgIiRvcyQiLmxlbmd0aCgpKSB8fCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJIiR3cyQiLCAwLCAiJHdzJCIubGVuZ3RoKCkpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQl0cnkgewotCQkJVVJMIHB2bSA9IG5ldyBVUkwoYnVuZGxlLmdldEVudHJ5KCIvIiksIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHZtID0gdmVyaWZ5Rm91bmQoRmlsZUxvY2F0b3IudG9GaWxlVVJMKHB2bSkpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBwdm07Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmluZERldihidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgVVJMIGludGVybmFsVXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJaWYgKHB2bSAhPSBudWxsKQotCQkJCXJldHVybiBGaWxlTG9jYXRvci50b0ZpbGVVUkwocHZtKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmaW5kRGV2KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwkJCi0JCQotCX0JCi0JCi0JcHJpdmF0ZSBVUkwgdmVyaWZ5Rm91bmQoVVJMIHB2bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGRldk1vZGUpIHsKLQkJCS8vIE5lZWQgdG8gdGVzdCBpZiBmb3VuZCBpbiBkZXZtb2RlLiBPdGhlcndpc2Ugd2Ugd2lsbCBqdXN0IGFzc3VtZSBpdCBpcyBmb3VuZC4gSWYgbm90IGZvdW5kIG9uIHJlbW90ZSBhbmQgbW92ZWQgdG8gY2FjaGUsIGFuIElPRXhjZXB0aW9uIHdvdWxkIGJlIHRocm93bi4KLQkJCWlmIChwdm0gIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlvcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW9zID0gcHZtLm9wZW5TdHJlYW0oKTsKLQkJCQkJaWYgKGlvcyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHB2bTsgLy8gRm91bmQgaXQsIHNvIHJldHVybiBpdC4KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoaW9zICE9IG51bGwpCi0JCQkJCQlpb3MuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHB2bTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQcm94eVBsdWdpbiNsb2NhbGl6ZUZyb21CdW5kbGUoYnVuZGxlLCBTdHJpbmcpCi0JICogCi0JICogVGhpcyBpcyBqdXN0IGEgaGVscGVyIHRvIHJldHVybiBhIHVybCBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFVSTCB1cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7CQkJCQkKLQkJcmV0dXJuIHVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkwgZmluZERldihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJaWYgKGRldk1vZGUpIHsKLQkJCS8vIEdvdCB0aGlzIGZhciBhbmQgaW4gZGV2IG1vZGUgbWVhbnMgaXQgd2Fzbid0IGZvdW5kLCBzbyB3ZSdsbCB0cnkgZm9yIGRldmVsb3BtZW50IHN0eWxlLgotCQkJLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGluIGRldiBtb2RlLCB3ZSBhcmUgcnVubmluZyB3aXRoIHRoZSBJREUgYXMgbG9jYWwgYW5kIGFueSAKLQkJCS8vIGJ1aWxkIG91dHB1dHMgd2lsbCBiZSBsb2NhbCBzbyBsb2NhbCBmaWxlIHByb3RvY29sIHdpbGwgYmUgcmV0dXJuZWQKLQkJCS8vIGZyb20gUGxhdGZvcm0ucmVzb2x2ZSgpLiBXZSB3b24ndCBiZSBydW5uaW5nIGluIGRldiBtb2RlIHdpdGggb3VyIGVudGlyZXBsdWdpbiBiZWluZyBpbiBhIGphciwKLQkJCS8vIG9yIG9uIGEgc2VwYXJhdGUgc3lzdGVtLgotCQkJdHJ5IHsKLQkJCQlVUkwgcHZtID0gYnVuZGxlLmdldEVudHJ5KFBST1hZSkFSUyk7Ci0JCQkJaWYgKHB2bSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGlvcyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpb3MgPSBwdm0ub3BlblN0cmVhbSgpOwotCQkJCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQlwcm9wcy5sb2FkKGlvcyk7Ci0JCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGJ1bmRsZS5nZXRFbnRyeSgiLyIpKTsJLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGluIGRlYnVnIG1vZGUsIHRoZW4gdGhpcyBwbHVnaW4gaXMgYW4gaW1wb3J0ZWQgcGx1Z2luIHdpdGhpbiB0aGUgZGV2ZWxvcGVtZW50IHdvcmtzcGFjZS4gLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmdldFBhcmVudEZpbGUoKTsJLy8gVGhpcyBnZXRzIHVzIHRvIHdvcmtzcGFjZSByb290IG9mIGRldmVsb3BtZW50IHdvcmtzcGFjZS4KLQkJCQkJCQkJZmlsZSA9IG5ldyBGaWxlKGZpbGUsIHBhdGhTdHJpbmcpOwotCQkJCQkJCQlyZXR1cm4gZmlsZS50b1VSTCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCQlpb3MuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0JcHJpdmF0ZSBVUkxbXSBmaW5kRGV2QWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJQnVuZGxlIFtdIGZyYWdtZW50cyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQlBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKGZyYWdtZW50cyA9PSBudWxsID8gMCA6IGZyYWdtZW50cy5sZW5ndGgpICsgMSk7Ci0JCVVSTCB1cmwgPSBmaW5kRGV2KGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlIGZyYWdtZW50ID0gZnJhZ21lbnRzW2ldOwotCQkJCXVybCA9IGZpbmREZXYoZnJhZ21lbnQsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXVybHMuYWRkKHVybCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVUkxbXSkgdXJscy50b0FycmF5KG5ldyBVUkxbdXJscy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB1cmxzIGZvciB0aGUgYnVuZGxlIGFuZCBhbGwgZnJhZ21lbnRzLiBUaGlzIGlzIHVzZWQgd2hlbiBidW5kbGVzL2ZyYWdtZW50cyBhcmUgamFycmVkLiBJdCB3b24ndCB3b3JrIGNvcnJlY3RseSBpZiBub3QgCi0JICogYSBqYXJyZWQgYnVuZGxlIGFuZCBmcmFnbWVudHMuIFRoaXMgd291bGQgbW9zdCBsaWtlbHkgYmUgdXNlZCBmb3IgTkxTCi0JICogcHVycG9zZXMgdG8gYnJpbmcgaW4gdGhlIGJ1bmRsZSBhbmQgYWxsIG9mIHRoZSBubHMuIElmIGEgc3BlY2lmaWMgZnJhZ21lbnQgd2FzIHdhbnRlZCB1c2Uge0BsaW5rICN1cmxMb2NhbGl6ZUJ1bmRsZShCdW5kbGUpfSBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcmV0dXJuIHVybHMgZm9yIGJ1bmRsZSBhbmQgYWxsIGZyYWdtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVCdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSkgewotCQlCdW5kbGVbXSBmcmFnbWVudHMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJVVJMW10gYnVybHMgPSB1cmxMb2NhbGl6ZUJ1bmRsZShidW5kbGUpOwotCQlpZiAoYnVybHMgIT0gbnVsbCkgewotCQkJdXJscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChidXJscykpOwotCQl9Ci0JCWlmIChmcmFnbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlidXJscyA9IHVybExvY2FsaXplQnVuZGxlKGZyYWdtZW50c1tpXSk7Ci0JCQkJaWYgKGJ1cmxzICE9IG51bGwpCi0JCQkJCXVybHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYnVybHMpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB1cmxzIGZvciB0aGUgYnVuZGxlIGxpYnJhcmllcyBvbmx5LiBJZiBhIGZyYWdtZW50IGlzIHdhbnRlZCwgdGhlbiBwYXNzIGluIHRoZSBmcmFnbWVudCBpbnN0ZWFkLgotCSAqIElmIGJ1bmRsZSBhbmQgYWxsIGZyYWdtZW50cyBhcmUgd2FudGVkIHVzZSB7QGxpbmsgI3VybExvY2FsaXplQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSl9IGluc3RlYWQuCi0JICogPHA+Ci0JICogSWYgaW4gZGV2IG1vZGUsIGl0IHdpbGwgdXNlIHRoZSBiaW5hcnkgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIHBsdWdpbiBsaWJyYXJpZXMgZnJvbSB0aGUgYnVpbGQucHJvcGVydGllcyBmaWxlLiAKLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybiBVUkwgYXJyYXkgb2YgbG9jYWwgbGlicmFyeSByZWZlcmVuY2VzIGZvciB0aGUgYnVuZGxlIG9yIG51bGwgaWYgY2FuJ3QgcmVzb2x2ZSB0byBsb2NhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVCdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotCQlVUkxbXSBwdm1zOwotCQl0cnkgewotCQkJcHZtcyA9IG5ldyBVUkxbXSB7RmlsZUxvY2F0b3IucmVzb2x2ZShidW5kbGUuZ2V0RW50cnkoIi8iKSl9OyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHZtc1swXS5nZXRQcm90b2NvbCgpLmVxdWFscygiamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFRoZSBidW5kbGUgaXMgYSBqYXIsIHNvIHVzZSBhcyBpcy4gCi0JCQkJcHZtc1swXSA9IGdldEZpbGVQYXRoKHB2bXNbMF0pOwotCQkJCXJldHVybiBwdm1zOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlwdm1zID0gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJLy8gSXQgaXMgYSBkaXJlY3RvcnkuIFdlIGNvdWxkIGJlIGluIGVpdGhlciBkZXZlbG9wbWVudCBtb2RlIG9yIG5vdC4gV2FsayB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoIGFuZCBmaW5kIHRoZSBsaWJyYXJpZXMuCi0JCQlQcm9wZXJ0aWVzIGJ1aWxkUHJvcHMgPSBudWxsOwotCQkJU3RyaW5nIGxpYnJhcmllcyA9IChTdHJpbmcpIGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRIKTsKLQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRILCBsaWJyYXJpZXMpOwotCQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgcHZtID0gYnVuZGxlLmdldEVudHJ5KGVsZW1lbnRzW2ldLmdldFZhbHVlKCkpOwotCQkJCQkJaWYgKHB2bSAhPSBudWxsKSB7Ci0JCQkJCQkJdXJscy5hZGQoRmlsZUxvY2F0b3IudG9GaWxlVVJMKHB2bSkpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0JCQkJCi0JCQkJCWlmIChkZXZNb2RlKSB7Ci0JCQkJCQkvLyBOb3QgZm91bmQgYXMgYSBqYXIsIHNvIHNlZSBpZiBjYW4gYmUgZm91bmQgaW4gZGV2bW9kZS4KLQkJCQkJCWlmIChidWlsZFByb3BzID09IG51bGwpIHsKLQkJCQkJCQlidWlsZFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlVUkwgYnAgPSBidW5kbGUuZ2V0RW50cnkoImJ1aWxkLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAoYnAgIT0gbnVsbCkgewotCQkJCQkJCQkJSW5wdXRTdHJlYW0gaW9zID0gbnVsbDsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW9zID0gYnAub3BlblN0cmVhbSgpOwotCQkJCQkJCQkJCWJ1aWxkUHJvcHMubG9hZChpb3MpOwotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlpZiAoaW9zICE9IG51bGwpCi0JCQkJCQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gYnVpbGRQcm9wcy5nZXRQcm9wZXJ0eSgib3V0cHV0LiIrZWxlbWVudHNbaV0uZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwYXRoU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQl1cmxzLmFkZChGaWxlTG9jYXRvci50b0ZpbGVVUkwoYnVuZGxlLmdldEVudHJ5KHBhdGhTdHJpbmcpKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKFVSTFtdKSB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotCQkJfSBlbHNlIGlmIChkZXZNb2RlKSB7Ci0JCQkJLy8gSWYgZGV2IG1vZGUgdGhlbiB3ZSB3b3VsZCBsb29rIGluIHRoZSBidWlsZC5wcm9wZXJ0aWVzIHRvIGZpbmQgdGhlIG91dHB1dC4uIGVudHJ5LiBUaGlzIHRlbGxzIHdoZXJlIHRoZSBiaW5hcmllcyBhcmUgCi0JCQkJLy8gZm9yIHByb2plY3QuIElmIHRoZXJlIGlzIG5vICJvdXRwdXQuLiIgZW50cnkgdGhlbiBlaXRoZXIgaXQgaXMgbm90IGEgcnVubmFibGUgcGx1Z2luIG9yIHRoZSByYXJlIGNhc2UgaXMgaXQgaXMgb25seQotCQkJCS8vIGNsYXNzZmlsZXMgaW4gYSBmb2xkZXIuIEluIHRoYXQgY2FzZSBzZWUgaWYgdGhlcmUgaXMgYSAic291cmNlLi4iIGVudHJ5IGFuZCB1c2UgdGhhdC4KLQkJCQl0cnkgewotCQkJCQlVUkwgYnAgPSBidW5kbGUuZ2V0RW50cnkoImJ1aWxkLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYnAgIT0gbnVsbCkgewotCQkJCQkJSW5wdXRTdHJlYW0gaW9zID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW9zID0gYnAub3BlblN0cmVhbSgpOwotCQkJCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCQkJCXByb3BzLmxvYWQoaW9zKTsKLQkJCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KCJvdXRwdXQuLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHBhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gbmV3IFVSTFtdIHtGaWxlTG9jYXRvci5yZXNvbHZlKGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKSl9OwotCQkJCQkJCX0gZWxzZSBpZiAoKHBhdGhTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eSgic291cmNlLi4iKSkgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIFByb2JhYmx5IGEgY2xhc3MgZm9sZGVyLCBzbyB1c2UgdGhlIHNvdXJjZSBpbnN0ZWFkLgotCQkJCQkJCQlyZXR1cm4gbmV3IFVSTFtdIHtGaWxlTG9jYXRvci5yZXNvbHZlKGJ1bmRsZS5nZXRFbnRyeShwYXRoU3RyaW5nKSl9OwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQlyZXR1cm4gcHZtczsJLy8gVHJ5IHRoZSByb290IG9mIHRoZSBwbHVnaW4uCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCQkJaW9zLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdXJsIGFzIGZpbGUgdXJsIGlmIGl0IGNhbi4gSWYgaXQgaXMgYWxyZWFkeSBhIGZpbGUgdXJsLCBpdCB3aWxsIGp1c3QgcmV0dXJuIGl0LgotCSAqIElmIGl0IGlzICJqYXI6ZmlsZTouLi4uIiB0eXBlIHByb3RvY29sLCB0aGVuIGl0IHdpbGwgc3RyaXAgaXQgZG93biB0byB0aGUgZmlsZSBwYXJ0LCB3aGljaCBpcwotCSAqIHRoZSBqYXIgaXRzZWxmLCBhbmQgbm90IHRoZSBmaWxlIHdpdGhpbiB0aGUgamFyLiAKLQkgKiBAcGFyYW0gbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRGaWxlUGF0aChVUkwgbCkgewotCQlpZiAobCAhPSBudWxsKSB7Ci0JCQlpZiAobC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkgICAgIHJldHVybiBsOwotCQkJZWxzZSBpZiAobC5nZXRQcm90b2NvbCgpLmVxdWFscygiamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBmID0gbC5nZXRGaWxlKCk7Ci0JCQkJaW50IGlkeCA9IGYubGFzdEluZGV4T2YoJyEnKTsKLQkJCQlpZiAoaWR4Pj0wKQotCQkJCQlmID0gZi5zdWJzdHJpbmcoMCxpZHgpOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlUGF0aChuZXcgVVJMKGYpKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkge30KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgdG8gb3JkZXIgdGhlIHBsdWdpbnMgaW50byBwcmUtcmVxIG9yZGVyLiAKLQkgKiBJZiBBIGV2ZW50dWFsbHkgZGVwZW5kcyBvbiBCLCB0aGVuIEIgd2lsbCBiZSBhaGVhZCBvZiBBIGluIHRoZQotCSAqIGxpc3Qgb2YgcGx1Z2lucy4gKEkuZS4gQiBpcyBhIHByZS1yZXEgc29tZXdoZXJlIG9mIEEpLgotCSAqICAKLQkgKiBAcGFyYW0gYnVuZGxlc1RvT3JkZXIgLSBCdW5kbGVzIG9mIGludGVyZXN0LiBUaGUgcmVzdWx0cyB3aWxsIGhhdmUgdGhlc2UgaW4gdGhpZWUgY29ycmVjdCBvcmRlci4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHRoZSBCdW5kbGVycyBpbiB0aGVyZSBvcmRlciBmcm9tIG5vIHByZXJlcXMgaW4gc2V0IHRvIHRoZSBsZWF2ZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVbXSBvcmRlclBsdWdpbnMoZmluYWwgU2V0IGJ1bmRsZXNUb09yZGVyKSB7Ci0JCU1hcCBwcmVyZXFzTWFwID0gbmV3IEhhc2hNYXAoYnVuZGxlc1RvT3JkZXIuc2l6ZSgpKjMpOwotCQlpbnQgbmR4ID0gYnVuZGxlc1RvT3JkZXIuc2l6ZSgpOwotCQlCdW5kbGVbXSByZXN1bHQgPSBuZXcgQnVuZGxlW25keF07Ci0JCU1hcCBkZXBlbmRlbnRzID0gZ2V0RGVwZW5kZW50Q291bnRzKGZhbHNlLCBidW5kbGVzVG9PcmRlciwgcHJlcmVxc01hcCk7CS8vIFdlIHdhbnQgdGhlIGluYWN0aXZlIG9uZXMgdG9vLiBUaGF0IHdheSBoYXZlIGNvbXBsZXRlIG9yZGVyLiBUaGV5IGNhbiBiZSBpZ25vcmVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4KLQkJLy8ga2VlcCBpdGVyYXRpbmcgdW50aWwgYWxsIGhhdmUgYmVlbiB2aXNpdGVkLiBUaGlzIHdpbGwgYWN0dWFsbHkgZmluZCB0aGVtIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB3aGF0IHdlCi0JCS8vIHdhbnQsIGkuZS4gaXQgd2lsbCBmaW5kIHRoZSBsZWF2ZXMgZmlyc3QuIFNvIHdlIHdpbGwgYnVpbGQgcmVzdWx0IGFycmF5IGluIHJldmVyc2Ugb3JkZXIuCi0JCXdoaWxlICghZGVwZW5kZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGxvb3Agb3ZlciB0aGUgZGVwZW5kZW50cyBsaXN0LiAgRm9yIGVhY2ggZW50cnksIGlmIHRoZXJlIGFyZSBubyBkZXBlbmRlbnRzLCB2aXNpdAotCQkJLy8gdGhlIGJ1bmRsZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuICBNYWtlIGEgY29weSBvZiB0aGUga2V5cyBzbyB3ZSBkb24ndCBlbmQgdXAKLQkJCS8vIHdpdGggY29uY3VycmVudCBhY2Nlc3NlcyAoc2luY2Ugd2UgYXJlIGRlbGV0aW5nIHRoZSB2YWx1ZXMgYXMgd2UgZ28pCi0JCQlJdGVyYXRvciBpYiA9IGRlcGVuZGVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGliLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGliLm5leHQoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSkgZW50cnkuZ2V0S2V5KCkgOwotCQkJCWludFtdIGNvdW50ID0gKGludFtdKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChjb3VudCAhPSBudWxsICYmIGNvdW50WzBdIDw9IDApIHsKLQkJCQkJaWYgKGJ1bmRsZXNUb09yZGVyLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLQkJCQkJCXJlc3VsdFstLW5keF0gPSBidW5kbGU7Ci0JCQkJCQlpZiAobmR4ID09IDApCi0JCQkJCQkJcmV0dXJuIHJlc3VsdDsJLy8gV2UndmUgb3JkZXJlZCBhbGwgdGhhdCB3ZSBjYXJlIGFib3V0LiBBbnl0aGluZyBsZWZ0IG92ZXIgaXMgdW5pbXBvcnRhbnQuCi0JCQkJCX0KLQkJCQkJaWIucmVtb3ZlKCk7Ci0JCQkJCS8vIGRlY3JlbWVudCB0aGUgZGVwZW5kZW50IGNvdW50IGZvciBhbGwgb2YgdGhlIHByZXJlcXVpc2l0ZXMuCi0JCQkJCUJ1bmRsZVtdIHJlcXVpcmVzID0gZ2V0UHJlcmVxcyhidW5kbGUsIHByZXJlcXNNYXApOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXVpcmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlCdW5kbGUgcHJlcmVxID0gcmVxdWlyZXNbal07Ci0JCQkJCQlpbnRbXSBjb3VudFByZXJlcSA9IChpbnRbXSkgZGVwZW5kZW50cy5nZXQocHJlcmVxKTsKLQkJCQkJCWlmIChjb3VudFByZXJlcSAhPSBudWxsKQotCQkJCQkJCS0tY291bnRQcmVyZXFbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBwcmVyZXFzIGZvciB0aGlzIGJ1bmRsZSwgYWxsIG9mIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC4KLQkgKiBUaGV5IHdpbGwgYmUgaW4gdG9wLWRvd24gZGVwdGgtZmlyc3Qgb3JkZXIuIFRoZXJlIHdvbid0IGJlIGR1cGxpY2F0ZXMuIFRoZXkgd2lsbCBzaG93IHVwCi0JICogb25seSBvbmNlIHRoZSBmaXJzdCB0aW1lIHRoZXkgYXJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWxsIHByZS1yZXFzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcmVyZXFzKEJ1bmRsZSBidW5kbGUpIHsKLQkJTGlzdCBwcmVyZXFzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxQcmVyZXFzKGJ1bmRsZSwgcHJlcmVxcywgbmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiBwcmVyZXFzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFByZXJlcXMoQnVuZGxlIGJ1bmRsZSwgTGlzdCBwcmVyZXFzLCBNYXAgcHJlcmVxc01hcCkgewotCQlCdW5kbGVbXSBwcnMgPSBnZXRQcmVyZXFzKGJ1bmRsZSwgcHJlcmVxc01hcCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdW5kbGUgcHJlID0gcHJzW2ldOwotCQkJaWYgKHByZXJlcXNNYXAuY29udGFpbnNLZXkocHJlKSkKLQkJCQljb250aW51ZTsJLy8gQWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBvbmUgb25jZS4KLQkJCXByZXJlcXMuYWRkKHByZSk7CS8vIEFkZCB0byB0aGUgbGlzdCBvZiBwcmUtcmVxcyBhY2N1bXVsYXRlZCBzbyBmYXIuCi0JCQlnZXRBbGxQcmVyZXFzKHByZSwgcHJlcmVxcywgcHJlcmVxc01hcCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlW10gZ2V0UHJlcmVxcyhCdW5kbGUgYnVuZGxlLCBNYXAgcHJlcmVxc01hcCkgewotCQlCdW5kbGVbXSBwcmVyZXFzID0gKEJ1bmRsZVtdKSBwcmVyZXFzTWFwLmdldChidW5kbGUpOwotCQlpZiAocHJlcmVxcyA9PSBudWxsKSB7Ci0JCQlwcmVyZXFzID0gZ2V0UHJlcmVxcyhidW5kbGUpOwotCQkJcHJlcmVxc01hcC5wdXQoYnVuZGxlLCBwcmVyZXFzKTsKLQkJfQotCQlyZXR1cm4gcHJlcmVxczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCdW5kbGVbXSBnZXRQcmVyZXFzKEJ1bmRsZSBidW5kbGUpIHsKLQkJQnVuZGxlW10gbCA9IChCdW5kbGVbXSkgcGx1Z2luUmVxdWlyZWRNYXAuZ2V0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWlmIChsID09IG51bGwpIHsKLQkJCUJ1bmRsZVNwZWNpZmljYXRpb24gc3BlY3NbXSA9IFBsYXRmb3JtLmdldFBsYXRmb3JtQWRtaW4oKS5nZXRTdGF0ZShmYWxzZSkuZ2V0QnVuZGxlKGJ1bmRsZS5nZXRCdW5kbGVJZCgpKS5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJCUFycmF5TGlzdCBidW5kbGVzID0gbmV3IEFycmF5TGlzdChzcGVjcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjcy5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBiID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHNwZWNzW2ldLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGIgIT0gbnVsbCkKLQkJCQkJYnVuZGxlcy5hZGQoYik7Ci0JCQl9Ci0JCQlsID0gKEJ1bmRsZVtdKSBidW5kbGVzLnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVzLnNpemUoKV0pOwotCQkJcGx1Z2luUmVxdWlyZWRNYXAucHV0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgbCk7Ci0JCX0KLQkJcmV0dXJuIGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcCBnZXREZXBlbmRlbnRDb3VudHMoYm9vbGVhbiBhY3RpdmVPbmx5LCBTZXQgc3RhcnRpbmdTZXQsIE1hcCBwcmVyZXFzTWFwKSB7Ci0JCS8vIFRyeSB0byBtYWludGFpbiBpbmRlcGVuZGVudHMgaW4gb3JkZXIgZnJvbSB0aGUgc3RhcnRpbmcgc2V0ICh3aGljaCBoYXBwZW5zIHRvIGJlIG9yZGVyZWQsIGFuZCBob3BlZnVsbHkgcmV2ZXJzZWQuKS4KLQkJLy8gVHJ5aW5nIHRvIGhhdmUgbGVhdmVzIHNob3cgdXAgaW4gc2FtZSBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgRWNsaXBzZSBleHRlbnNpb25zLCBzbyB3ZSBzaG91bGQKLQkJLy8gaGF2ZSB0aGUgc3RhcnRpbmcgc2V0IGJlIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aGF0LiBUaGUgYWN0dWFsIHByb2Nlc3MKLQkJLy8gYnVpbGRzIHRoZW0gaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRoZSBzdGFydGluZyBzZXQsIHNvIHdlIGV4cGVjdCB0aGUgc3RhcnRpbmdTZXQgdG8gYmUgaW4gIHJldmVyc2Ugb3JkZXIgc28gdGhleSB3aWxsIGJlIGluIGZvcndhcmQgb3JkZXIKLQkJLy8gaG9wZWZ1bGx5LiBUaGlzIGlzIGp1c3QgYSBoZXVyaXN0aWMuIFRoZXJlIGlzIG5vIGd1YXJlbnRlZSBpdCB3aWxsIGFjdHVhbGx5IHByb2R1Y2UgdGhlIAotCQkvLyBkZXNpcmVkIG91dHB1dC4KLQkJTWFwIGRlcGVuZGVudHMgPSBuZXcgTGlua2VkSGFzaE1hcChzdGFydGluZ1NldC5zaXplKCkpOwkKLQkJLy8gYnVpbGQgYSB0YWJsZSBvZiBhbGwgZGVwZW5kZW50IGNvdW50cy4gIFRoZSB0YWJsZSBpcyBrZXllZCBieSBkZXNjcmlwdG9yIGFuZAotCQkvLyB0aGUgdmFsdWUgdGhlIGludGVnZXIgbnVtYmVyIG9mIGRlcGVuZGVudCBwbHVnaW5zLgotCQlMaXN0IHByb2Nlc3NOb3cgPSBuZXcgQXJyYXlMaXN0KHN0YXJ0aW5nU2V0KTsKLQkJTGlzdCBwcm9jZXNzTmV4dCA9IG5ldyBBcnJheUxpc3QocHJvY2Vzc05vdy5zaXplKCkpOwotCQlpZiAoIXByb2Nlc3NOb3cuaXNFbXB0eSgpKSB7Ci0JCQkvLyBHbyB0aHJvdWdoIHRoZSBmaXJzdCB0aW1lIGZyb20gdGhlIHN0YXJ0aW5nIHNldCB0byBnZXQgYW4gZW50cnkgaW50byB0aGUgbGlzdC4KLQkJCS8vIElmIHRoZXJlIGlzIGFuIGVudHJ5LCB0aGVuIGl0IHdvbid0IGJlIG1hcmtlZCBmb3IgcHJvY2Vzc05leHQuIE9ubHkgbmV3IGVudHJpZXMKLQkJCS8vIGFyZSBhZGRlZCB0byBwcm9jZXNzTmV4dCBpbiB0aGUgZm9sbG93aW5nIGxvb3AuCi0JCQlpbnQgcG5TaXplID0gcHJvY2Vzc05vdy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBuU2l6ZTsgaSsrKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpIHByb2Nlc3NOb3cuZ2V0KGkpOwotCQkJCWlmIChhY3RpdmVPbmx5ICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIGVuc3VyZSB0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhpcyBkZXNjcmlwdG9yIChvdGhlcndpc2UgaXQgd2lsbCBub3QgYmUgdmlzaXRlZCkKLQkJCQlpbnRbXSBlbnRyeSA9IChpbnRbXSkgZGVwZW5kZW50cy5nZXQoYnVuZGxlKTsKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJZGVwZW5kZW50cy5wdXQoYnVuZGxlLCBuZXcgaW50WzFdKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gTm93IHByb2Nlc3MgdGhlIHByb2Nlc3NOb3cgdG8gZmluZCB0aGUgcmVxdWlyZWRzLCBpbmNyZW1lbnQgdGhlbSwgYW5kIGFkZCB0byBwcm9jZXNzTmV4dCBpZiBuZXZlciBmb3VuZCBiZWZvcmUuCi0JCXdoaWxlICghcHJvY2Vzc05vdy5pc0VtcHR5KCkpIHsKLQkJCXByb2Nlc3NOZXh0LmNsZWFyKCk7Ci0JCQlpbnQgcG5TaXplID0gcHJvY2Vzc05vdy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBuU2l6ZTsgaSsrKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpIHByb2Nlc3NOb3cuZ2V0KGkpOwotCQkJCWlmIChhY3RpdmVPbmx5ICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCWNvbnRpbnVlOwkJCQotCQkJCUJ1bmRsZVtdIHJlcXVpcmVzID0gZ2V0UHJlcmVxcyhidW5kbGUsIHByZXJlcXNNYXApOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVxdWlyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJQnVuZGxlIHByZXJlcSA9IHJlcXVpcmVzW2pdOwotCQkJCQlpZiAocHJlcmVxID09IG51bGwgfHwgYWN0aXZlT25seQotCQkJCQkJCSYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50W10gZW50cnkgPSAoaW50W10pIGRlcGVuZGVudHMuZ2V0KHByZXJlcSk7Ci0JCQkJCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQlkZXBlbmRlbnRzLnB1dChwcmVyZXEsIG5ldyBpbnRbXXsxfSk7Ci0JCQkJCQlwcm9jZXNzTmV4dC5hZGQocHJlcmVxKTsgLy8gTmV2ZXIgcHJvY2Vzc2VkIGJlZm9yZSwgc28gd2UgYWRkIGl0IHRvIHRoZSBuZXh0IHByb2Nlc3MgbG9vcC4KLQkJCQkJfSBlbHNlCi0JCQkJCQkrK2VudHJ5WzBdOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gTm93IHN3YXAgdGhlIGxpc3RzIHNvIHRoYXQgd2UgcHJvY2Vzc05leHQgd2lsbCBiZSBub3cgYW5kIHZpc2EtdmVyc2EuCi0JCQlMaXN0IHQgPSBwcm9jZXNzTmV4dDsKLQkJCXByb2Nlc3NOZXh0ID0gcHJvY2Vzc05vdzsKLQkJCXByb2Nlc3NOb3cgPSB0OwotCQl9Ci0JCXJldHVybiBkZXBlbmRlbnRzOwotCX0KLQkJCi0JLyoqCi0JICogQWRkIGEgc2h1dGRvd24gbGlzdGVuZXIKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm94eVNodXRkb3duTGlzdGVuZXIoSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2h1dGRvd25MaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXNodXRkb3duTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlzaHV0ZG93bkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHNodXRkb3duIGxpc3RlbmVyCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJveHlTaHV0ZG93bkxpc3RlbmVyKElQcm94eVBsdWdpblNodXRkb3duTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNodXRkb3duTGlzdGVuZXJzICE9IG51bGwpCi0JCQlzaHV0ZG93bkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIgbGF1bmNoTGlzdGVuZXIgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGF1bmNoQ29uZmlndXJhdGlvbkFkZGVkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzV29ya2luZ0NvcHkoKSAmJiBJUHJveHlDb25zdGFudHMuSURfUFJPWFlfTEFVTkNIX0dST1VQLmVxdWFscyhjb25maWd1cmF0aW9uLmdldENhdGVnb3J5KCkpKQotCQkJCQlzdGFydENsZWFudXBKb2IoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsYXVuY2hDb25maWd1cmF0aW9uQ2hhbmdlZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCQl0cnkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc1dvcmtpbmdDb3B5KCkgJiYgSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlndXJhdGlvbi5nZXRDYXRlZ29yeSgpKSkKLQkJCQkJc3RhcnRDbGVhbnVwSm9iKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGF1bmNoQ29uZmlndXJhdGlvblJlbW92ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJdHJ5IHsKLQkJCQkvLyBPbiBkZWxldGUgeW91IGNhbid0IHRlbGwgdGhlIGNhdGVnb3J5IG9yIGFueXRoaW5nIGJlY2F1c2UgYWxsIG9mIHRoYXQgaW5mbyBoYXMgYWxyZWFkeSByZW1vdmVkLgotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc1dvcmtpbmdDb3B5KCkpCi0JCQkJCXN0YXJ0Q2xlYW51cEpvYigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBKb2IgY2xlYW51cEpvYiA9IG5ldyBKb2IoUHJveHlNZXNzYWdlcy5Qcm94eVBsdWdpbl9DbGVhbnVwRGVmYXVsdFByb3h5TGF1bmNoQ29uZmlndXJhdGlvbnMpIHsgCi0JCXsKLQkJCXNldFN5c3RlbSh0cnVlKTsJLy8gU28gaXQgZG9lc24ndCBzaG93IHVwIGluIHByb2dyZXNzIG1vbml0b3IuIE5vIG5lZWQgdG8gaW50ZXJydXB0IHVzZXIuCi0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwkvLyBBIHF1aWNrIHJ1bm5pbmcgam9iLgotCQl9Ci0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJLy8gYWxsIHdlIHdhbnQgdG8gZG8gaXMgZmluZCBvdXQgaWYgYW55IGxhdW5jaCBjb25maWd1cmF0aW9ucyAoZnJvbSBwcm94eSBsYXVuY2ggZ3JvdXApIGV4aXN0IGZvcgotCQkJLy8gYSBwcm9qZWN0LiBJZiB0aGV5IGRvbid0LCB0aGVuIHVuc2V0IHRoZSBwcm9qZWN0J3MgcHJvcGVydHkuIElmIHRoZXkgZG8sIGFuZCB0aGUgcHJvcGVydHkgaXMgbm90Ci0JCQkvLyBzZXQsIHRoZW4gc2V0IGl0IHRvIE5PVF9TRVQgdG8gaW5kaWNhdGUgbm90IHNldCwgYnV0IHRoZXJlIGFyZSBzb21lIGNvbmZpZ3MgZm9yIGl0LgotCQkJLy8gV2UganVzdCBnYXRoZXIgdGhlIHByb2plY3QgbmFtZXMgdGhhdCBoYXZlIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLQkJCXRyeSB7Ci0JCQkJU2V0IHByb2plY3ROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlnc1tpXS5nZXRDYXRlZ29yeSgpKQotCQkJCQkJJiYgKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUgPT0gbnVsbCB8fCAhY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoUHJveHlMYXVuY2hTdXBwb3J0LkFUVFJfUFJJVkFURSwgZmFsc2UpKSkKLQkJCQkJCXByb2plY3ROYW1lcy5hZGQoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IG1vZGVsLmdldENoaWxkcmVuKCk7Ci0JCQkJaW50IGNhbmNlbENvdW50ID0gMTA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoY2hpbGRyZW5bal0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJCQlpZiAoLS1jYW5jZWxDb3VudCA8PSAwKQotCQkJCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJCQljYW5jZWxDb3VudCA9IDEwOwkvLyBSZXN0IGZvciBuZXh0IHNldCBvZiB0ZW4uCi0JCQkJCQkJCS8vIENoZWNraW5nIG9uIGV2ZXJ5IDEwIHByb2plY3RzIGJlY2F1c2UgdGhleSBtYXkgYmUgbWFueSBwcm9qZWN0cywgd2hpbGUgb25seSBmZXcgY29uZmlncy4KLQkJCQkJCQkJLy8gVGhpcyB3YXkgaXQgd2lsbCBzdG9wIHNvb25lci4KLQkJCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCUlQcm9qZWN0IHAgPSAoKElKYXZhUHJvamVjdCkgY2hpbGRyZW5bal0pLmdldFByb2plY3QoKTsKLQkJCQkJCWlmIChwcm9qZWN0TmFtZXMuY29udGFpbnMocC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJLy8gVGhpcyBwcm9qZWN0IGhhcyBhIGxhdW5jaCBjb25maWcuIElmIGl0IGhhcyBhIHNldHRpbmcsIHRoZW4gZG8gbm90aGluZywgZWxzZSBuZWVkIHRvIHB1dCBvbiBub3Qgc2V0LiAKLQkJCQkJCQlpZiAocC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04pID09IG51bGwpCi0JCQkJCQkJCXAuZ2V0UHJvamVjdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eSgKLQkJCQkJCQkJCVByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLAotCQkJCQkJCQkJUHJveHlMYXVuY2hTdXBwb3J0Lk5PVF9TRVQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBUaGlzIHByb2plY3QgaGFzIG5vIGxhdW5jaCBjb25maWdzLiBSZW1vdmUgYW55IHNldHRpbmcgaWYgaXQgZXhpc3RzLgotCQkJCQkJCXAuc2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLCAoU3RyaW5nKSBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIHZvaWQgc3RhcnRDbGVhbnVwSm9iKCkgewotCQljbGVhbnVwSm9iLmNhbmNlbCgpOwkvLyBTdG9wIHdoYXQgd2UgYXJlIGRvaW5nLgotCQljbGVhbnVwSm9iLnNjaGVkdWxlKDEwMDBsKTsJLy8gU2NoZWR1bGUgdG8gc3RhcnQgaW4gb25lIHNlY29uZC4KLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmFkZExhdW5jaENvbmZpZ3VyYXRpb25MaXN0ZW5lcihsYXVuY2hMaXN0ZW5lcik7Ci0JCWNvbnRleHQuYWRkQnVuZGxlTGlzdGVuZXIobmV3IEJ1bmRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRCdW5kbGUoKSAhPSBQcm94eVBsdWdpbi50aGlzLmdldEJ1bmRsZSgpKQotCQkJCQlyZXR1cm47CS8vIE5vdCBvZiBpbnRlcmVzdCB0byB1cy4KLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIEJ1bmRsZUV2ZW50LlNUQVJURUQ6Ci0JCQkJCQljb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRoaXMpOwkvLyBTaW5jZSB3ZSBkb24ndCBjYXJlIGFueW1vcmUKLQkJCQkJCXN0YXJ0Q2xlYW51cEpvYigpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQnVuZGxlRXZlbnQuU1RPUFBFRDoKLQkJCQkJY2FzZSBCdW5kbGVFdmVudC5VTklOU1RBTExFRDoKLQkJCQkJY2FzZSBCdW5kbGVFdmVudC5VTlJFU09MVkVEOgotCQkJCQkJY29udGV4dC5yZW1vdmVCdW5kbGVMaXN0ZW5lcih0aGlzKTsJLy8gV2Ugc3RvcHBlZCBiZWZvcmUgd2Ugc3RhcnRlZCwgc28gcmVtb3ZlIG91cnNlbHZlcy4KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChQUkVGRVJFTkNFU19WTV9OT1ZFUklGWV9LRVksIHRydWUpOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlYnVnIHBsdWdpbiBzaHV0cyBkb3duIGJlZm9yZSB3ZSBkbyBzaW5jZSBvcmRlciBub3QgZ3VhcmVudGVlZC4KLQkJaWYgKERlYnVnUGx1Z2luLmdldERlZmF1bHQoKSAhPSBudWxsKQotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIobGF1bmNoTGlzdGVuZXIpOwotCQljbGVhbnVwSm9iLmNhbmNlbCgpOwkvLyBTdG9wIHdoYXQgd2UgYXJlIGRvaW5nLgkJCi0JCWlmIChzaHV0ZG93bkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzaHV0ZG93bkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJUHJveHlQbHVnaW5TaHV0ZG93bkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0JCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05GSUdVUkFUSU9OX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuamVtLnByb3h5LmNvbnRyaWJ1dG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9FWFRFTlNJT05fUkVHSVNUUkFUSU9OX0VYVEVOU0lPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfUkVHSVNUUllfVFlQRSA9ICJyZWdpc3RyeVR5cGUiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgcGx1Z2luUmVxdWlyZWRNYXAgPSBuZXcgSGFzaE1hcCg1MCk7Ci0JCi0JLyoKLQkgKiBQcm9jZXNzZWQgZXh0ZW5zaW9uIHBvaW50IGluZm8gZm9yIGNvbnRyaWJ1dG9ycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8gY29udHJpYnV0aW9uczsKLQkJCi0JLyoKLQkgKiBQcm9jZXNzZWQgZXh0ZW5zaW9uIHBvaW50IGluZm8gZm9yIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIGV4dGVuc2lvbnM7Ci0KLQotCS8qKgotCSAqIFRoZXNlIGFyZSBwdWJsaWMgb25seSBzbyB0aGF0IGplbS51aSBjYW4gYWNjZXNzIHRoaXMgY29uc3RhbnQuIE5vdCBtZWFudCB0byBiZSBhY2Nlc3NlZCBieSBvdGhlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OID0gbmV3IFF1YWxpZmllZE5hbWUoIm9yZy5lY2xpcHNlLmplbS5wcm94eSIsICJwcm94eUxhdW5jaENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gb3JkZXJlZCBhcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY29udHJpYnV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcmlkIHRoZSBmaXJzdCBzZWdtZW50IG9mIGFsbCBvZiB0aGUgY29udGFpbmVyIHBhdGhzIGlzIHRoZSBjb250YWluZXIgaWQuCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGhzIGFycmF5IG9mIGNvbnRhaW5lciBwYXRocyB0byBtYXRjaCBhZ2FpbnN0IGZvciBjb250cmlidXRpb25zLiBUaGUgcGF0aHMgbXVzdCBhbGwgYmUgb2YgdGhlIHNhbWUgY29udGFpbmVyIGlkLgotCSAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cy4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb250YWluZXJDb25maWd1cmF0aW9ucyhTdHJpbmcgY29udGFpbmVyaWQsIFN0cmluZ1tdIGNvbnRhaW5lclBhdGhzKSB7Ci0JCWlmIChjb250cmlidXRpb25zID09IG51bGwpCi0JCQlwcm9jZXNzUHJveHlDb250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBjb250cmlidXRpb25zLmNvbnRhaW5lclBhdGhDb250cmlidXRpb25zLmdldENvbnRyaWJ1dG9ycyhjb250YWluZXJpZCwgY29udGFpbmVyUGF0aHMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIG9yZGVyZWQgYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIHBsdWdpbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnRyaWJ1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5pZAotCSAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHBsdWdpbiBoYXMgbm8gY29udHJpYnV0aW9ucy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldFBsdWdpbkNvbmZpZ3VyYXRpb25zKFN0cmluZyBwbHVnaW5pZCkgewotCQlpZiAoY29udHJpYnV0aW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5Q29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgY29udHJpYnV0aW9ucy5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMuZ2V0KHBsdWdpbmlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbiBvcmRlcmVkIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBjb250cmlidXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyaWQgdGhlIGZpcnN0IHNlZ21lbnQgb2YgYWxsIG9mIHRoZSBjb250YWluZXIgcGF0aHMgaXMgdGhlIGNvbnRhaW5lciBpZC4KLQkgKiBAcGFyYW0gY29udGFpbmVyUGF0aHMgYXJyYXkgb2YgY29udGFpbmVyIHBhdGhzIHRvIG1hdGNoIGFnYWluc3QgZm9yIGNvbnRyaWJ1dGlvbnMuIFRoZSBwYXRocyBtdXN0IGFsbCBiZSBvZiB0aGUgc2FtZSBjb250YWluZXIgaWQuCi0JICogQHJldHVybiBBcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29udGFpbmVyRXh0ZW5zaW9ucyhTdHJpbmcgY29udGFpbmVyaWQsIFN0cmluZ1tdIGNvbnRhaW5lclBhdGhzKSB7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpCi0JCQlwcm9jZXNzUHJveHlFeHRlbnNpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBleHRlbnNpb25zLmNvbnRhaW5lclBhdGhDb250cmlidXRpb25zLmdldENvbnRyaWJ1dG9ycyhjb250YWluZXJpZCwgY29udGFpbmVyUGF0aHMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIG9yZGVyZWQgYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIHBsdWdpbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnRyaWJ1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5pZAotCSAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHBsdWdpbiBoYXMgbm8gY29udHJpYnV0aW9ucy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldFBsdWdpbkV4dGVuc2lvbnMoU3RyaW5nIHBsdWdpbmlkKSB7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpCi0JCQlwcm9jZXNzUHJveHlFeHRlbnNpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBleHRlbnNpb25zLnBsdWdpblRvQ29udHJpYnV0aW9ucy5nZXQocGx1Z2luaWQpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzUHJveHlDb250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpIHsKLQkJY29udHJpYnV0aW9ucyA9IHByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChQSV9DT05GSUdVUkFUSU9OX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJvY2Vzc1Byb3h5RXh0ZW5zaW9uRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCWV4dGVuc2lvbnMgPSBwcm9jZXNzQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoUElfRVhURU5TSU9OX1JFR0lTVFJBVElPTl9FWFRFTlNJT05fUE9JTlQpOwotCX0JCi0JCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGxvb2tpbmcgY29udHJpYnV0b3JzLiBJdCB3aWxsIGZpbmQgZW50cmllcyB0aGF0IGhhdmUgdGhlICJjb250YWluZXIiIG9yICJwbHVnaW4iIGF0dHJpYnV0ZXMKLQkgKiBzZXQgb24gdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQgZnVsbHktcXVhbGlmaWVkIGV4dGVuc2lvbiBwb2ludCBpZCwgaW5jbHVkaW5nIHBsdWdpbiBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dG9yIGluZm8gcmVjb3JkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KFN0cmluZyBleHRlbnNpb25Qb2ludCkgewkKLQkJLy8gV2UgYXJlIHByb2Nlc3NpbmcgdGhpcyBvbmNlIGJlY2F1c2UgaXQgaXMgYWNjZXNzZWQgb2Z0ZW4gKG9uY2UgcGVyIHZtIHBlciBwcm9qZWN0KS4KLQkJLy8gVGhpcyBjYW4gYWRkIHVwIHNvIHdlIGdldCBpdCB0b2dldGhlciBvbmNlIGhlcmUuCi0JCUlFeHRlbnNpb25Qb2ludCBleHRwID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChleHRlbnNpb25Qb2ludCk7Ci0JCUNvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIHJlc3VsdCA9IG5ldyBDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbygpOwotCQlyZXN1bHQuY29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbnMgPSBuZXcgQ29udGFpbmVyUGF0aENvbnRyaWJ1dGlvbk1hcHBpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50LmNsYXNzKTsKLQkJaWYgKGV4dHAgPT0gbnVsbCkgewotCQkJcmVzdWx0LnBsdWdpblRvQ29udHJpYnV0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0cC5nZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHRlbnNpb25zLmxlbmd0aCA+IDApIHsKLQkJCS8vIE5lZWQgdG8gYmUgaW4gcGx1Z2luIG9yZGVyIHNvIHRoYXQgZmlyc3Qgb25lcyBwcm9jZXNzZWQgaGF2ZSBubyBkZXBlbmRlbmNpZXMgb24gb3RoZXJzLgotCQkJLy8gR2F0aGVyIGluIGV4dGVuc2lvbiBvcmRlci4KLQkJCS8vIFdlIHdhbnQgdGhlIGxpc3QgaW4gcmV2ZXJzZSBvcmRlciBvZiBmb3VuZCBleHRlbnNpb25zIGZvciBhIGJ1bmRsZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byB0cnkKLQkJCS8vIHRvIGdldCBsZWF2ZXMgb3JkZXJlZCBpbiB0aGUgb3JkZXIgZm91bmQgZnJvbSB0aGUgZXh0ZW5zaW9uIGxpc3QuIFNpbmNlIHRoZSBvcmRlclBsdWdpbnMgYWN0dWFsbHkKLQkJCS8vIHJldmVyc2VzIHRoZSBsZWFmIG9yZGVyLCBob3BlZnVsbHkgdGhpcyB3aWxsIHNldCBpdCBiYWNrIHRvIHdoYXQgd2Ugd2FudCBhdCB0aGUgZW5kLgotCQkJSGFzaE1hcCBidW5kbGVzVG9FeHRlbnNpb25zID0gbmV3IExpbmtlZEhhc2hNYXAoZXh0ZW5zaW9ucy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IGV4dGVuc2lvbnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShleHRlbnNpb25zW2ldLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ID0gKElFeHRlbnNpb25bXSkgYnVuZGxlc1RvRXh0ZW5zaW9ucy5nZXQoYnVuZGxlKTsKLQkJCQlpZiAoZXh0ID09IG51bGwpCi0JCQkJCWJ1bmRsZXNUb0V4dGVuc2lvbnMucHV0KGJ1bmRsZSwgbmV3IElFeHRlbnNpb25bXSB7IGV4dGVuc2lvbnNbaV19KTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gTW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZGVmaW5lZCBpbiB0aGlzIHBsdWdpbi4KLQkJCQkJSUV4dGVuc2lvbltdIG5ld0V4dCA9IG5ldyBJRXh0ZW5zaW9uW2V4dC5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShleHQsIDAsIG5ld0V4dCwgMCwgZXh0Lmxlbmd0aCk7Ci0JCQkJCW5ld0V4dFtuZXdFeHQubGVuZ3RoIC0gMV0gPSBleHRlbnNpb25zW2ldOwotCQkJCQlidW5kbGVzVG9FeHRlbnNpb25zLnB1dChidW5kbGUsIG5ld0V4dCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBOb3cgb3JkZXIgdGhlbSBzbyB3ZSBwcm9jZXNzIGluIHJlcXVpcmVkIG9yZGVyLgotCQkJQnVuZGxlW10gb3JkZXJlZCA9IFByb3h5UGx1Z2luLm9yZGVyUGx1Z2lucyhidW5kbGVzVG9FeHRlbnNpb25zLmtleVNldCgpKTsKLQkJCU1hcCBwYXR0ZXJuU3RyaW5nVG9JRF9QYXR0ZXJuID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwYXR0ZXJucyB0byB0aGUge2NvbnRhaW5lciBpZCwgY29tcGlsZWQgcGF0dGVybn0uIFRoaXMgc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgY29tcGlsZWQgcGF0dGVybiBldmVyeXdoZXJlLgotCQkJcmVzdWx0LnBsdWdpblRvQ29udHJpYnV0aW9ucyA9IG5ldyBIYXNoTWFwKG9yZGVyZWQubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZC5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb25bXSBleHRzID0gKElFeHRlbnNpb25bXSkgYnVuZGxlc1RvRXh0ZW5zaW9ucy5nZXQob3JkZXJlZFtpXSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3MgPSBleHRzW2pdLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQkvLyBUZWNobmljYWxseSB3ZSBleHBlY3QgdGhlIGNvbmZpZyBlbGVtZW50cyB0byBoYXZlIGEgbmFtZSBvZiAiY29udHJpYnV0b3IiLCBidXQgc2luY2UgdGhhdAotCQkJCQkvLyBpcyBhbGwgdGhhdCBjYW4gYmUgdGhlcmUsIHdlIHdpbGwgaWdub3JlIGl0LiBUaGUgY29udGVudCBpcyB3aGF0IGlzIGltcG9ydGFudC4KLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjb25maWdzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlTdHJpbmcgY29udGFpbmVyUGF0dGVybiA9IGNvbmZpZ3Nba10uZ2V0QXR0cmlidXRlKFBJX0NPTlRBSU5FUik7Ci0JCQkJCQlpZiAoY29udGFpbmVyUGF0dGVybiAhPSBudWxsKSB7Ci0JCQkJCQkJT2JqZWN0W10gaWRfUGF0dGVybiA9IChPYmplY3RbXSkgcGF0dGVyblN0cmluZ1RvSURfUGF0dGVybi5nZXQoY29udGFpbmVyUGF0dGVybik7Ci0JCQkJCQkJaWYgKGlkX1BhdHRlcm4gPT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2xhc2ggPSBjb250YWluZXJQYXR0ZXJuLmluZGV4T2YoJy8nKTsKLQkJCQkJCQkJU3RyaW5nIGNvbnRhaW5lcklEID0gc2xhc2ggIT0gLTEgPyBjb250YWluZXJQYXR0ZXJuLnN1YnN0cmluZygwLCBzbGFzaCkgOiBjb250YWluZXJQYXR0ZXJuOwotCQkJCQkJCQkvLyBUaGUgcGF0dGVybiBiZWNvbWVzIGZvciB0aGUgY29udGFpbmVyUGF0dGVybiAiU1dUX0NPTlRBSU5FUiIgYmVjb21lcyAiU1dUX0NPTlRBSU5FUigvLiopKiIuIFRoaXMKLQkJCQkJCQkJLy8gbWVhbnMgdG8gbWF0Y2ggdGhlIHN0cmluZyBtdXN0IHN0YXJ0IHdpdGggIlNXVF9DT05UQUlORVIiIGFuZCBpdCBtdXN0IGhhdmUgZWl0aGVyIG5vdGhpbmcgYWZ0ZXIgdGhpcwotCQkJCQkJCQkvLyBvciBpdCBtdXN0IGhhdmUgYSAiLyIgYW5kIGFueSBjaGFyYWN0ZXJzIGFmdGVyIHRoYXQuIFNvIHRoaXMgbWVhbnMgaXQgd2lsbCBub3QgbWF0Y2ggIlNXVF9DT05UQUlORVJYWiIKLQkJCQkJCQkJLy8gYnV0IGl0IHdpbGwgbWF0Y2ggIlNXVF9DT05UQUlORVIvWFlaIi4KLQkJCQkJCQkJaWRfUGF0dGVybiA9IG5ldyBPYmplY3RbXSB7IGNvbnRhaW5lcklELCBQYXR0ZXJuLmNvbXBpbGUoY29udGFpbmVyUGF0dGVybiArICIoLy4qKSoiKX07IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJcGF0dGVyblN0cmluZ1RvSURfUGF0dGVybi5wdXQoY29udGFpbmVyUGF0dGVybiwgaWRfUGF0dGVybik7Ci0JCQkJCQkJfQotCQkJCQkJCXJlc3VsdC5jb250YWluZXJQYXRoQ29udHJpYnV0aW9ucy5hZGRDb250cmlidXRpb24oKFN0cmluZykgaWRfUGF0dGVyblswXSwgKFBhdHRlcm4pIGlkX1BhdHRlcm5bMV0sIGNvbmZpZ3Nba10pOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgcGx1Z2luID0gY29uZmlnc1trXS5nZXRBdHRyaWJ1dGUoUElfUExVR0lOKTsKLQkJCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgY29udHJpYnV0aW9ucyA9IChMaXN0KSByZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zLmdldChwbHVnaW4pOwotCQkJCQkJCWlmIChjb250cmlidXRpb25zID09IG51bGwpIHsKLQkJCQkJCQkJY29udHJpYnV0aW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJCQkJCXJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMucHV0KHBsdWdpbiwgY29udHJpYnV0aW9ucyk7Ci0JCQkJCQkJfQotCQkJCQkJCWNvbnRyaWJ1dGlvbnMuYWRkKGNvbmZpZ3Nba10pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBGaW5hbGl6ZSB0aGUgbWFwcGluZ3MgZm9yIGJvdGggY29udGFpbmVyIHBhdGhzIGFuZCBwbHVnaW5zLgotCQkJcmVzdWx0LmNvbnRhaW5lclBhdGhDb250cmlidXRpb25zLmZpbmFsaXplTWFwcGluZygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LnBsdWdpblRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWVudHJ5LnNldFZhbHVlKCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WygoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkuc2l6ZSgpXSkpOwotCQkJfQotCQl9IGVsc2UKLQkJCXJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFRoZSByZXN1bHQgb2YgdGhlIHtAbGluayBQcm94eVBsdWdpbiNnZXRJRHNGb3VuZChJSmF2YVByb2plY3QpfS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZvdW5kSURzIHsKLQkJCi0JCS8qKgotCQkgKiBNYXAgb2YgKGNvbnRhaW5lcklkcyhTdHJpbmcpLT57QGxpbmsgQ29udGFpbmVyUGF0aHN9KSBvZiBjb250YWluZXJzIGNsYXNzcGF0aHMgZm91bmQgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE1hcCBjb250YWluZXJJZHMgPSBuZXcgSGFzaE1hcCgyKTsKLQkJCi0JCS8qKgotCQkgKiBNYXAgb2YgKGNvbnRhaW5lcnMoe0BsaW5rIElDbGFzc3BhdGhDb250YWluZXJ9KS0+Qm9vbGVhbikgb2YgY29udGFpbmVycyBmb3VuZCBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4gVGhlIHZhbHVlIHdpbGwgYmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRhaW5lciBpcyB2aXNpYmxlIHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVycyA9IG5ldyBIYXNoTWFwKDIpOwotCQkKLQkJLyoqCi0JCSAqIE1hcCBvZiAocGx1Z2luSWRzKFN0cmluZyktPkJvb2xlYW4pIG9mIHBsdWdpbiBpZHMgZm91bmQgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGggaWYgdGhlIHByb2plY3QgaXMgYSBwbHVnaW4gcHJvamVjdC4gVGhlIHZhbHVlIHdpbGwgYmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBsdWdpbiBpcyB2aXNpYmxlIHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyBNYXAgcGx1Z2luSWRzOwotCQkKLQkJLyoqCi0JCSAqIE1hcCBvZiAocHJvamVjdHMoe0BsaW5rIElQYXRofS0+Qm9vbGVhbikgb2YgcHJvamVjdCBmb3VuZCBpbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4gVGhlIHZhbHVlIHdpbGwgYmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2plY3QgaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgTWFwIHByb2plY3RzID0gbmV3IEhhc2hNYXAoMik7Ci0JCQotCQlGb3VuZElEcygpIHsKLQkJCS8vIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotCQl9Ci0JfQotCQotCS8qKgotCSAqIEZvciB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LCByZXR1cm4gdGhlIG1hcHMgb2YgZm91bmQgaWRzLgotCSAqCi0JICogQHBhcmFtIGpwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgZm91bmQgaWRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBGb3VuZElEcyBnZXRJRHNGb3VuZChJSmF2YVByb2plY3QganByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewkJCi0JCUlQYXRoIHByb2plY3RQYXRoID0ganByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JCUZvdW5kSURzIGZvdW5kSURzID0gbmV3IEZvdW5kSURzKCk7Ci0JCWZvdW5kSURzLnByb2plY3RzLnB1dChwcm9qZWN0UGF0aCwgQm9vbGVhbi5UUlVFKTsJCQotCQlleHBhbmRQcm9qZWN0KHByb2plY3RQYXRoLCBmb3VuZElEcywgdHJ1ZSwgdHJ1ZSk7Ci0JCQotCQkvLyBUaGUgY29udGFpbmVySWRzIHZhbHVlcyB3aWxsIGFjdHVhbGx5IGJlIGFuIE1hcFtdIHtNYXAodmlzaWJsZUlQYXRoLT5wYXRoU3RyaW5nKSwgTWFwKGhpZGRlbklQYXRoLT5wYXRoU3RyaW5nKX0uIE5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIENvbnRhaW5lclBhdGhzIG5vdwotCQkvLyB0aGF0IHdlIGFyZSBkb25lLgotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGZvdW5kSURzLmNvbnRhaW5lcklkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ci5uZXh0KCk7Ci0JCQlNYXBbXSB2YWx1ZSA9IChNYXBbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWVudHJ5LnNldFZhbHVlKG5ldyBDb250YWluZXJQYXRocygoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSwgKFN0cmluZ1tdKSB2YWx1ZVswXS52YWx1ZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbdmFsdWVbMF0uc2l6ZSgpXSksIChTdHJpbmdbXSkgdmFsdWVbMV0udmFsdWVzKCkudG9BcnJheShuZXcgU3RyaW5nW3ZhbHVlWzFdLnNpemUoKV0pKSk7Ci0JCX0KLQkJCi0JCWlmIChmb3VuZElEcy5wbHVnaW5JZHMgPT0gbnVsbCkKLQkJCWZvdW5kSURzLnBsdWdpbklkcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCi0JCWZvdW5kSURzLnByb2plY3RzLnJlbW92ZShwcm9qZWN0UGF0aCk7CS8vIERvbid0IG5lZWQgdG8gaW5jbHVkZSBpdHNlbGYgbm93LCB3YXMgbmVlZGVkIGZvciB0ZXN0aW5nIHNvIGlmIGNpcnVjbGFyIHdlIGRvbid0IGdldCBpbnRvIGEgbG9vcC4KLQkJaWYgKGZvdW5kSURzLnByb2plY3RzLmlzRW1wdHkoKSkKLQkJCWZvdW5kSURzLnByb2plY3RzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkKLQkJcmV0dXJuIGZvdW5kSURzOwotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIEpSRV9DT05UQUlORVJfUEFUSCA9IG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQotCS8qCi0JICogVGhlIHBhc3NlZCBpbiB2aXNpYmxlIGZsYWcgdGVsbHMgaWYgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUgYW5kIGl0cyBjb250ZW50cyBhcmUgdmlzaWJsZSBpZiB0aGV5IGFyZSBleHBvcnRlZC4KLQkgKiBPbmx5IGV4Y2VwdGlvbiBpcyBpZiBmaXJzdCBpcyB0cnVlLCB0aGVuIGFsbCBjb250ZW50cyBhcmUgdmlzaWJsZSB0byB0aGUgdG9wIGxldmVsIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFByb2plY3QoSVBhdGggcHJvamVjdFBhdGgsIEZvdW5kSURzIGZvdW5kSWRzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHByb2plY3RQYXRoLmxhc3RTZWdtZW50KCkpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm47CS8vIE5vdCBleGlzdCBzbyBkb24ndCBkZWx2ZSBpbnRvIGl0LgotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IChJSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHJlcyk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuZXhpc3RzKCkgfHwgIXByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpKQotCQkJcmV0dXJuOwkvLyBOb3QgZXhpc3QgYXMgYSBqYXZhIHByb2plY3Qgb3Igbm90IG9wZW4sIHNvIGRvbid0IGRlbHZlIGludG8gaXQuCi0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCUJvb2xlYW4gY3VycmVudEZsYWcgPSBudWxsOwkvLyBDdXJyZW50IHNldHRpbmcgdmFsdWUuCi0JCQlib29sZWFuIG5ld0ZsYWc7CS8vIFRoZSBuZXcgc2V0dGluZyB2YWx1ZS4gCi0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJCS8vIEZvcmNlIHRydWUgaWYgYWxyZWFkeSB0cnVlLCBvciB0aGlzIGlzIHRoZSBmaXJzdCBwcm9qZWN0LCBvciB0aGlzIHByb2plY3QgaXMgdmlzaWJsZSBhbmQgdGhlIGVudHJ5IGlzIGV4cG9ydGVkLiBUaGVzZSBvdmVycmlkZSBhIHByZXZpb3VzIGZhbHNlLgotCQkJCQljdXJyZW50RmxhZyA9IChCb29sZWFuKSBmb3VuZElkcy5wcm9qZWN0cy5nZXQoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQlpZiAoY3VycmVudEZsYWcgPT0gbnVsbCB8fCBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSAhPSBuZXdGbGFnKQotCQkJCQkJZm91bmRJZHMucHJvamVjdHMucHV0KGVudHJ5LmdldFBhdGgoKSwgIG5ld0ZsYWcgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFICk7Ci0JCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsKQotCQkJCQkJZXhwYW5kUHJvamVjdChlbnRyeS5nZXRQYXRoKCksIGZvdW5kSWRzLCB2aXNpYmxlICYmIGVudHJ5LmlzRXhwb3J0ZWQoKSwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCQlpZiAoIWZpcnN0ICYmIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIuZXF1YWxzKGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7CS8vIFRoZSBmaXJzdCBwcm9qZWN0IGRldGVybWluZXMgdGhlIEpSRSwgc28gYW55IHN1YnNlcXVlbnQgb25lcyBjYW4gYmUgaWdub3JlZC4KLQkJCQkJTWFwW10gcGF0aHMgPSAoTWFwW10pIGZvdW5kSWRzLmNvbnRhaW5lcklkcy5nZXQoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQlpZiAocGF0aHMgPT0gbnVsbCkgewotCQkJCQkJcGF0aHMgPSBuZXcgTWFwW10ge25ldyBIYXNoTWFwKDIpLCBuZXcgSGFzaE1hcCgyKX07Ci0JCQkJCQlmb3VuZElkcy5jb250YWluZXJJZHMucHV0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApLCBwYXRocyk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudEZsYWcgPSBudWxsOwotCQkJCQlpZiAocGF0aHNbMF0uY29udGFpbnNLZXkoZW50cnkuZ2V0UGF0aCgpKSkKLQkJCQkJCWN1cnJlbnRGbGFnID0gQm9vbGVhbi5UUlVFOwotCQkJCQllbHNlIGlmIChwYXRoc1sxXS5jb250YWluc0tleShlbnRyeS5nZXRQYXRoKCkpKQotCQkJCQkJY3VycmVudEZsYWcgPSBCb29sZWFuLkZBTFNFOwotCQkJCQluZXdGbGFnID0gKGN1cnJlbnRGbGFnICE9IG51bGwgJiYgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkpIHx8IGZpcnN0IHx8ICh2aXNpYmxlICYmIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CQkJCQkKLQkJCQkJaWYgKGN1cnJlbnRGbGFnID09IG51bGwgfHwgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkgIT0gbmV3RmxhZykgewotCQkJCQkJaWYgKG5ld0ZsYWcpIHsKLQkJCQkJCQkvLyBJdCBpcyB2aXNpYmxlLCByZW1vdmUgZnJvbSBoaWRkZW4sIGlmIHRoZXJlLCBhbmQgYWRkIHRvIHZpc2libGUuCi0JCQkJCQkJcGF0aHNbMV0ucmVtb3ZlKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJCQkJcGF0aHNbMF0ucHV0KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBJdCBpcyBoaWRkZW4sIHJlbW92ZSBmcm9tIHZpc2libGUsIGlmIHRoZXJlLCBhbmQgYWRkIHRvIGhpZGRlbi4KLQkJCQkJCQlwYXRoc1swXS5yZW1vdmUoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJCQlwYXRoc1sxXS5wdXQoZW50cnkuZ2V0UGF0aCgpLCBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHByb2plY3QpOwotCQkJCQkvLyBGb3JjZSB0cnVlIGlmIGFscmVhZHkgdHJ1ZSwgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcHJvamVjdCwgb3IgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUgYW5kIHRoZSBlbnRyeSBpcyBleHBvcnRlZC4gVGhlc2Ugb3ZlcnJpZGUgYSBwcmV2aW91cyBmYWxzZS4KLQkJCQkJY3VycmVudEZsYWcgPSAoQm9vbGVhbikgZm91bmRJZHMuY29udGFpbmVycy5nZXQoY29udGFpbmVyKTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQlpZiAoY3VycmVudEZsYWcgPT0gbnVsbCB8fCBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSAhPSBuZXdGbGFnKQkJCQkJCi0JCQkJCQlmb3VuZElkcy5jb250YWluZXJzLnB1dChjb250YWluZXIsICBuZXdGbGFnID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJCS8vIFdlIG9ubHkgY2FyZSBhYm91dCBKUkVfTElCLiBJZiB3ZSBoYXZlIHRoYXQsIHRoZW4gd2Ugd2lsbCB0cmVhdCBpdCBhcyBKUkVfQ09OVEFJTkVSLiBPbmx5Ci0JCQkJCS8vIGNhcmUgYWJvdXQgZmlyc3QgcHJvamVjdCB0b28sIGJlY2F1c2UgdGhlIGZpcnN0IHByb2plY3QgaXMgdGhlIG9uZSB0aGF0IGRldGVybWluZXMgdGhlIEpSRSB0eXBlLgotCQkJCQlpZiAoZmlyc3QgJiYgSmF2YVJ1bnRpbWUuSlJFTElCX1ZBUklBQkxFLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGF0aHMgPSAoTWFwW10pIGZvdW5kSWRzLmNvbnRhaW5lcklkcy5nZXQoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUik7Ci0JCQkJCQlpZiAocGF0aHMgPT0gbnVsbCkgewotCQkJCQkJCXBhdGhzID0gbmV3IE1hcFtdIHtuZXcgSGFzaE1hcCgyKSwgbmV3IEhhc2hNYXAoMil9OwotCQkJCQkJCWZvdW5kSWRzLmNvbnRhaW5lcklkcy5wdXQoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUiwgcGF0aHMpOwotCQkJCQkJfQotCQkJCQkJY3VycmVudEZsYWcgPSBudWxsOwotCQkJCQkJaWYgKHBhdGhzWzBdLmNvbnRhaW5zS2V5KEpSRV9DT05UQUlORVJfUEFUSCkpCi0JCQkJCQkJY3VycmVudEZsYWcgPSBCb29sZWFuLlRSVUU7Ci0JCQkJCQllbHNlIGlmIChwYXRoc1sxXS5jb250YWluc0tleShKUkVfQ09OVEFJTkVSX1BBVEgpKQotCQkJCQkJCWN1cnJlbnRGbGFnID0gQm9vbGVhbi5GQUxTRTsKLQkJCQkJCW5ld0ZsYWcgPSAoY3VycmVudEZsYWcgIT0gbnVsbCAmJiBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSkgfHwgZmlyc3QgfHwgKHZpc2libGUgJiYgZW50cnkuaXNFeHBvcnRlZCgpKTsJCQkJCQotCQkJCQkJaWYgKGN1cnJlbnRGbGFnID09IG51bGwgfHwgY3VycmVudEZsYWcuYm9vbGVhblZhbHVlKCkgIT0gbmV3RmxhZykgewotCQkJCQkJCWlmIChuZXdGbGFnKSB7Ci0JCQkJCQkJCS8vIEl0IGlzIHZpc2libGUsIHJlbW92ZSBmcm9tIGhpZGRlbiwgaWYgdGhlcmUsIGFuZCBhZGQgdG8gdmlzaWJsZS4KLQkJCQkJCQkJcGF0aHNbMV0ucmVtb3ZlKEpSRV9DT05UQUlORVJfUEFUSCk7Ci0JCQkJCQkJCXBhdGhzWzBdLnB1dChKUkVfQ09OVEFJTkVSX1BBVEgsIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGhpZGRlbiwgcmVtb3ZlIGZyb20gdmlzaWJsZSwgaWYgdGhlcmUsIGFuZCBhZGQgdG8gaGlkZGVuLgotCQkJCQkJCQlwYXRoc1swXS5yZW1vdmUoSlJFX0NPTlRBSU5FUl9QQVRIKTsKLQkJCQkJCQkJcGF0aHNbMV0ucHV0KEpSRV9DT05UQUlORVJfUEFUSCwgSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9CQkKLQkJCi0JCWZpbmRQbHVnaW5zKGZvdW5kSWRzLCB2aXNpYmxlLCBmaXJzdCwgcHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmQgdGhlIHBsdWdpbnMgdGhhdCB0aGUgZ2l2ZW4gcHJvamVjdCByZWZlcmVuY2VzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KLQkgKiA8cD4KLQkgKiBUaGUgbWFwIHdpbGwgYmUgb2YgcGx1Z2luIGlkcyB0byBhIEJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPkJvb2xlYW5UUlVFPC9jb2RlPiwKLQkgKiB0aGVuIHRoZSBwbHVnaW4gaXMgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gcHJvamVjdC4gdGhlIHZpc2libGUgYW5kIGZpcnN0IGZsYWdzCi0JICogd2lsbCBtb2RpZnkgdGhpcy4gSWYgZmlyc3QgaXMgdHJ1ZSwgdGhlbiBhbGwgZGlyZWN0IHBsdWdpbnMgd2lsbCBiZSB2aXNpYmxlLAotCSAqIGVsc2Ugb25seSBleHBvcnRlZCBwbHVnaW5zIHdpbGwgYmUgdmlzaWJsZS4gSWYgdmlzaWJsZSBpcyBmYWxzZSBhbmQgZmlyc3QgaXMgZmFsc2UsIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIsIGFsbCBvZiB0aGUKLQkgKiBwbHVnaW5zIHdpbGwgbm90IGJlIHZpc2libGUuIAotCSAqIDxwPgotCSAqIFZpc2libGUgbWVhbnMgdGhhdCBjbGFzc2VzIGluIHRoZSBwbHVnaW4gY2FuIGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSBjb2RlLiBOb3QgdmlzaWJsZQotCSAqIG1lYW5zIHRoYXQgdGhleSBjYW4gb25seSBiZSByZWZlcmVuY2VkIGZyb20gc29tZSBvdGhlciBwbHVnaW4gaW4gdGhlIGxpc3QuIEluIG90aGVyIHdvcmRzLAotCSAqIHZpc2libGUgb25lcyBjYW4gYmUgZGlyZWN0bHkgcmVmZXJlbmNlZCwgYnV0IGludmlzaWJsZSBvbmVzIGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgZnJvbQotCSAqIHBsdWdpbnMgdGhhdCBjYW4gc2VlIGl0LgotCSAqIDxwPgotCSAqIEZvciBtb3N0IHVzZXMsIGZpcnN0IGFuZCB2aXNpYmxlIHNob3VsZCBiZSB0cnVlLiBUaGVuIGl0IHdpbGwgdHJlYXQgdGhlIHByb2plY3QgYXMgdGhlIHRvcGxldmVsCi0JICogcHJvamVjdCBhbmQgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgdGhvc2UgdGhhdCBhcmUgdmlzaWJsZSB0byBpdCwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi0JICogVGhlc2UgZmxhZ3Mgd2VyZSBhZGRlZCBmb3IgbW9yZSBzcGVjaWFsIGNhc2VzIHdoZXJlIG1heSBiZSBjYWxsaW5nIG9uIGEgcHJvamVjdCB0aGF0IGlzIGRlZXBlcgotCSAqIGRvd24gaW4gdGhlIGNsYXNzcGF0aCB3ZXJlIHZpc2liaWx0eSBoYXMgYWxyZWFkeSBiZWVuIGRlY2lkZWQuCi0JICogPHA+Ci0JICogTm90ZTogUERFIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHJldHVybiBhbnl0aGluZywgb3RoZXJ3aXNlIGl0IHdpbGwgbGVhdmUKLQkgKiB0aGUgbWFwIGFsb25lLgotCSAqIAotCSAqIEBwYXJhbSBmb3VuZElkcyBmb3VuZElkcyBzdHJ1Y3R1cmUgdG8gZ2V0IHBsdWdpbiBpbmZvIGZyb20uCi0JICogQHBhcmFtIHZpc2libGUgPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbnMgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUsIHNvIGFueSBwbHVnaW5zIHZpc2libGUgdG8gaXQgd2lsbCBiZSB2aXNpYmxlLCBlbHNlIG5vbmUgd2lsbCBiZSB2aXNpYmxlLgotCSAqIEBwYXJhbSBmaXJzdCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSB0b3AgcHJvamVjdCBvZiBpbnRlcmVzdC4gVGhpcyBtZWFucyB0aGF0IGFsbCBwbHVnaW5zIHdpdGhpbiB0aGUgcHJvamVjdCBhcmUgdmlzaWJsZS4gRWxzZSBvbmx5IGV4cG9ydGVkIHByb2plY3RzIHdpbGwgYmUgdmlzaWJsZS4KLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRvIHN0YXJ0IGxvb2tpbmcgZnJvbQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmRQbHVnaW5zKEZvdW5kSURzIGZvdW5kSWRzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQkvLyBUbyBwcmV2ZW50IHVubmVjZXNzYXJ5IGxvYWRpbmcgb2YgdGhlIFBERSBwbHVnaW4sIGZpbmQgdGhlIHBsdWdpbnMgb25seSBpZiB0aGlzIHByb2plY3QgaXMgYSBQREUgcGx1Z2luIHByb2plY3QuCi0JCQlpZiAoaXNQREVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJSVBERVByb2Nlc3NGb3JQbHVnaW4gcGRlcHJvY2VzcyA9IGdldFBERVByb2Nlc3NGb3JQbHVnaW4oKTsKLQkJCQlpZiAocGRlcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCWlmIChmb3VuZElkcy5wbHVnaW5JZHMgPT0gbnVsbCkKLQkJCQkJCWZvdW5kSWRzLnBsdWdpbklkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCXBkZXByb2Nlc3MuZmluZFBsdWdpbnMocHJvamVjdCwgZm91bmRJZHMsIHZpc2libGUsIGZpcnN0KTsgLy8gZXhwYW5kIHRoZSBwbHVnaW5zIGZvciB0aGlzIHByb2plY3QsIGlmIGFueS4KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFBsdWdpbiBwcm9qZWN0IG9yIGZhbHNlIGlmIG5vdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BERVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2plY3QuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShQREVfTkFUVVJFX0lEKTsKLQl9Ci0KLQotCS8qCi0JICogSW50ZXJmYWNlIGZvciBwcm9jZXNzaW5nIFBsdWdpbnMuIFVzZWQgd2hlbiBQREUgcGx1Z2luIGlzIHByZXNlbnQgaW4gdGhlIGluc3RhbGxhdGlvbi4gCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JaW50ZXJmYWNlIElQREVQcm9jZXNzRm9yUGx1Z2luIHsKLQotCQkvKgotCQkgKiBHbyB0aHJvdWdoIHRoZSBwcm9qZWN0IGFuZCBmaW5kIGFsbCBvZiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaAotCQkgKiB0aGUgcmVmZXJlbmNlZCBwbHVnaW5zLCBhbmQgbWFyayB0aGVtIGFzIHZpc2libGUgb3Igbm90LgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgZmluZFBsdWdpbnMoSUphdmFQcm9qZWN0IHByb2plY3QsIEZvdW5kSURzIGZvdW5kSWRzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QpOwotCX0KLQkKLQkvKgotCSAqIFRyeSB0byBnZXQgdGhlIHBkZSBwcm9jZXNzIGZvciBwbHVnaW4uIElmIGFscmVhZHkgdHJpZWQgb25jZSBhbmQgbm90IGZvdW5kLCB0aGVuIGZvcmdldCBpdC4KLQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2UgUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBuZWVkcyBpdCB0b28uCi0JICovCi0JcHJpdmF0ZSBJUERFUHJvY2Vzc0ZvclBsdWdpbiBwZGVQcm9jZXNzRm9yUGx1Z2luOwotCXByaXZhdGUgYm9vbGVhbiB0cmllZFBERVByb2Nlc3M7Ci0JSVBERVByb2Nlc3NGb3JQbHVnaW4gZ2V0UERFUHJvY2Vzc0ZvclBsdWdpbigpIHsKLQkJaWYgKCF0cmllZFBERVByb2Nlc3MpIHsKLQkJCXRyaWVkUERFUHJvY2VzcyA9IHRydWU7Ci0JCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5wZGUuY29yZSIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCUNsYXNzIGNsYXNzUERFUHJvY2VzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlBERVByb2Nlc3NGb3JQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwZGVQcm9jZXNzRm9yUGx1Z2luID0gKElQREVQcm9jZXNzRm9yUGx1Z2luKSBjbGFzc1BERVByb2Nlc3MubmV3SW5zdGFuY2UoKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gTm90IGZvdW5kLCBkbyBub3RoaW5nLgotCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBkZVByb2Nlc3NGb3JQbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdHJpZXMgdG8gZmluZCBhIGphciBpbiB0aGUgYnVuZGxlIHNwZWNpZmllZCwgYW5kIHRoZSBhdHRhY2hlZCBzb3VyY2UgdXNpbmcgdGhlCi0JICogUERFIHNvdXJjZSBsb2NhdGlvbiBleHRlbnNpb24gcG9pbnQuIFRoZSBqYXIgbXVzdCBleGlzdCBmb3Igc291cmNlIHRvIGJlIGF0dGFjaGFibGUuCi0JICogVGhlIHNvdXJjZSBtdXN0IGJlIGluIHRoZSBzdGFuZGFyZCBQREUgc291cmNlIHBsdWdpbi4gSS5lLiBpdCBtdXN0IGJlIGluIGEgZGlyZWN0b3J5Ci0JICogb2YgdGhlIG5hbWUgImJ1bmRsZW5hbWVfYnVuZGxldmVyc2lvbiIsIGFuZCBpbiB0aGUgc2FtZSBwYXRoIGZyb20gdGhlcmUgYXMgaW4gdGhlCi0JICogamFyLCBwbHVzIHRoZSBuYW1lIG11c3QgYmUgImphcm5hbWVzcmMuemlwIi4KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgVVJMJ3Mgd2lsbCBub3QgYmUgUGxhdGZvcm0ucmVzb2x2ZSgpLiBUaGV5IHdpbGwgYmUgaW4gZm9ybSByZXR1cm5lZCBmcm9tCi0JICogUGxhdGZvcm0uZmluZCgpLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUgYnVuZGxlIHRvIHNlYXJjaCwgd2lsbCBzZWFyY2ggZnJhZ21lbnRzIHRvby4KLQkgKiBAcGFyYW0gZmlsZXBhdGggZmlsZXBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlL2ZyYWdtZW50IHdoZXJlIHRoZSBqYXIgd2lsbCBiZSBmb3VuZC4gCi0JICogQHJldHVybiB0d28gVVJMJ3MuIFswXSBpcyB0aGUgVVJMIHRvIHRoZSBqYXIsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZCwgWzJdIGlzIHRoZSBVUkwgdG8gdGhlIHNvdXJjZSB6aXAsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gZmluZFBsdWdpbkphckFuZEF0dGFjaGVkU291cmNlKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVwYXRoKSB7Ci0JCS8vIFRoaXMgaXMgYSBiaXQga2x1ZGd5LCBidXQgdGhlIGFsZ29yaXRobSBpcyB0byBmaW5kIHRoZSBmaWxlIGZpcnN0LCBhbmQgdGhlbiBnZXQgdGhlIHJvb3QgdXJsIG9mIHRoZSBidW5kbGUvZnJhZ21lbnQKLQkJLy8gdGhhdCBtYXRjaGVzIHRoZSBmb3VuZCBmaWxlLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgc291cmNlLiBGcm9tIHRoZXJlCi0JCS8vIGFsbCBvZiB0aGUgc291cmNlIGV4dGVuc2lvbnMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhlIHNvdXJjZSB6aXAgZmlsZS4KLQkJLy8gVGhpcyBpcyBhc3N1bWluZyB0aGF0IGZpbmQgcmV0dXJucyBhIHVybCB3aGVyZSB0aGUgZmlsZSBwYXJ0IG9mIHRoZSB1cmwgaXMgYSBzdGFuZGFyZCBwYXRoIGFuZCBkb2Vzbid0IGhhdmUKLQkJLy8gdGhpbmdzIGxpa2Ugc3BlY2lhbCBjaGFycyB0byBpbmRpY2F0ZSB3aXRoaW4gYSBqYXIuIFRoYXQgd291bGQgYXBwZWFyIHdoZW4gaXQgaXMgcmVzb2x2ZWQsIGJ1dCBJIHRoaW5rIHRoYXQgdGhlCi0JCS8vIHVucmVzb2x2ZWQgb25lcyBmcm9tIGZpbmQgYXJlIHR5cGljYWxseSAiamFyYnVuZGxlOi8vbm5uL3BhdGgiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuIFRoaXMgaXMgYSBncmF5IGFyZWEuCi0JCVVSTCBqYXJVUkwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgZmlsZXBhdGgsIG51bGwpOwotCQlpZiAoamFyVVJMID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFVSTFsyXTsKLQkJCi0JCS8vIEZvdW5kIGl0LCBzbyBsZXQncyB0cnkgdG8gZmluZCB3aGljaCBidW5kbGUvZnJhZ21lbnQgaXQgd2FzIGZvdW5kIGluLgotCQlTdHJpbmcgamFyU3RyaW5nID0gamFyVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCS8vIEZpcnN0IHRoZSBidW5kbGUgaXRzZWxmLgotCQlTdHJpbmcgaW5zdGFsbExvYyA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpLnRvRXh0ZXJuYWxGb3JtKCk7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIHNvdXJjZVVSTCA9IG51bGw7Ci0JCWlmIChqYXJTdHJpbmcuc3RhcnRzV2l0aChpbnN0YWxsTG9jKSkKLQkJCXNvdXJjZVVSTCA9IGdldFNyY0Zyb20oYnVuZGxlLCBpbnN0YWxsTG9jLCBqYXJTdHJpbmcpOwotCQllbHNlIHsKLQkJCS8vIE5vdyBsb29rIGluIHRoZSBmcmFnbWVudHMuCi0JCQlCdW5kbGVbXSBmcmFncyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKykgewotCQkJCWluc3RhbGxMb2MgPSBmcmFnc1tpXS5nZXRFbnRyeSgiLyIpLnRvRXh0ZXJuYWxGb3JtKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoamFyU3RyaW5nLnN0YXJ0c1dpdGgoaW5zdGFsbExvYykpIHsKLQkJCQkJc291cmNlVVJMID0gZ2V0U3JjRnJvbShmcmFnc1tpXSwgaW5zdGFsbExvYywgamFyU3RyaW5nKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgVVJMW10ge2phclVSTCwgc291cmNlVVJMfTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkwgZ2V0U3JjRnJvbShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaW5zdGFsbExvYywgU3RyaW5nIGphclN0cmluZykgewotCQkvLyBmb3JtYXQgb2YgcGF0aCBpbiBhIFBERSBzb3VyY2UgcGx1Z2luIGlzICh1bmRlciB0aGUgInNyYyIgZGlyZWN0b3J5IGZyb20gdGhlIGV4dGVuc2lvbiBwb2ludCksCi0JCS8vICJidW5kbGVuYW1lX2J1bmRsZXZlcnNpb24vcGF0aE9mSmFyL2phcm5hbWVzcmMuemlwIi4gSG93ZXZlciB0aGVyZSBpcyBubyB3YXkgdG8ga25vdwotCQkvLyB3aGljaCBleHRlbnNpb24gaGFzIHRoZSBzb3VyY2UgaW4gaXQsIHNvIHdlIG5lZWQgdG8gc2VhcmNoIHRoZW0gYWxsLgotCQkKLQkJSVBhdGggc3JjUGF0aCA9IG5ldyBQYXRoKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSsiXyIrIChTdHJpbmcpIGJ1bmRsZS5nZXRIZWFkZXJzKCIiKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAkTk9OLU5MUy0yJAotCQlzcmNQYXRoID0gc3JjUGF0aC5hcHBlbmQobmV3IFBhdGgoamFyU3RyaW5nLnN1YnN0cmluZyhpbnN0YWxsTG9jLmxlbmd0aCgpKSkpOwotCQlpZiAoc3JjUGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlyZXR1cm4gbnVsbDsJLy8gU29tZXRoaW5nIGlzIG5vdCByaWdodC4gTm8gamFyIG5hbWUuCi0JCXNyY1BhdGggPSBzcmNQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsJLy8gUmVtb3ZlIHRoZSAuamFyLgotCQlTdHJpbmcgamFyTmFtZSA9IHNyY1BhdGgubGFzdFNlZ21lbnQoKTsJLy8gVGhpcyBzaG91bGQgYmUgdGhlIGphciBuYW1lLgotCQlzcmNQYXRoID0gc3JjUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKGphck5hbWUrInNyYy56aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gTm93IGxvb2sgdGhyb3VnaCBhbGwgb2YgdGhlIHNyYyBleHRlbnNpb25zLiBDYW4ndCB0ZWxsIGlmIHRoZSBleHRlbnNpb24gaXMgZnJvbSBhIGZyYWdtZW50IG9yIGEgYnVuZGxlLCBzbyB3ZSBuZWVkIHRvCi0JCS8vIHVzZSBQbGF0Zm9ybS5maW5kKCkgdG8gbG9vayBpbiB0aGUgYnVuZGxlIGFuZCBmcmFnbWVudC4gU28gd2UgbWF5IGdldCBhIGR1cCBzZWFyY2ggaWYgdGhlcmUgaXMgYSBmcmFnbWVudCBzb3VyY2UgCi0JCS8vIChmb3IgZXhhbXBsZSBwbGF0Zm9ybSBzb3VyY2UgYW5kIHdpbjMyIHBsYXRmb3JtIHNvdXJjZSAod2hpY2ggaXMgYSBmcmFnbWVudCBvZiBwbGF0Zm9ybSBzb3VyY2UpLgotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZXMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2UucGRlLmNvcmUuc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHNyY3NyY2ggPSBuZXcgUGF0aChjZXNbaV0uZ2V0QXR0cmlidXRlKCJwYXRoIikpLmFwcGVuZChzcmNQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJQnVuZGxlIHNyY0J1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShjZXNbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJVVJMIHNyY1VybCA9IEZpbGVMb2NhdG9yLmZpbmQoc3JjQnVuZGxlLCBzcmNzcmNoLCBudWxsKTsKLQkJCWlmIChzcmNVcmwgIT0gbnVsbCkgewotCQkJCXJldHVybiBzcmNVcmw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVGhyb3dhYmxlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Rocm93YWJsZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODAxNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVGhyb3dhYmxlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IHdyYXBwZXIgZm9yIGFuIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24gb24gdGhlCi0gKiByZW1vdmUgVk0uIFRoZSBzdGFuZGFyZCBleGNlcHRpb24gbWV0aG9kcyByZWZlciB0byB0aGlzIHByb3h5LgotICogVG8gcmVmZXIgdG8gdGhlIHByb3hpZWQgZXhjZXB0aW9uIGl0c2VsZiwgdGhlIG1ldGhvZHMgZGVmaW5lZAotICogaW4gaGVyZSB3b3VsZCBiZSB1c2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGhyb3dhYmxlUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGltcGxlbWVudHMgSUJlYW5Qcm94eSB7Ci0gICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gd2l0aCBubyBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuIAotICAgICovCi0gICBwdWJsaWMgVGhyb3dhYmxlUHJveHkoKSB7Ci0JCXN1cGVyKCk7Ci0gICB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGVQcm94eShTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZVByb3h5KFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLiAKLSAgICAqCi0gICAgKiBAcGFyYW0gICBzICAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgICovCi0gICBwdWJsaWMgVGhyb3dhYmxlUHJveHkoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0gICB9Ci0JCi0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3h5TWVzc2FnZSgpOwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHN0cmVhbSk7Ci0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIlByb3h5OiAiICsgdG9CZWFuU3RyaW5nKCk7CS8vJE5PTi1OTFMxJCAtIHRvU3RyaW5nJ3MgYXJlbid0IG5scydlZC4gLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1VJUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9VSVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZkYmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1VJUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0gCi0KLS8qKgotICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBJVUlSdW5uZXIgdG8gcnVuIHRoZSBidWlsZCB1bmRlcgotICogSVByb2dyZXNzU2VydmljZSBjb250cm9sIGlmIGluIHRoZSBVSSB0aHJlYWQuCi0gKiAKLSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGhpbiBoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotY2xhc3MgVUlSdW5uZXIgaW1wbGVtZW50cyBJVUlSdW5uZXIgewotCQotCS8qCi0JICogU3BlY2lhbCBjbGFzcyB0aGF0IHRha2VzIGEgcHJvZ3Jlc3MgbW9uaXRvciAxIGFuZCBvbmx5IGhhbmRsZXMgaXNDYW5jZWxlZCBmcm9tIGl0LAotCSAqIGJ1dCBldmVyeXRoaW5nIGVsc2UgaXMgZm9yd2FyZGVkIHRvIHByb2dyZXNzIG1vbml0b3IgMi4gVGhpcyBhbGxvd3MgdGhlIHBtIHRoYXQKLQkgKiBpcyBzZW50IGludG8gaGFuZGxlQnVpbGQgdG8gc2lnbmFsIGEgY2FuY2VsIGV2ZW4gdGhvdWdoIHRoZSBwcm9ncmVzcyBzZXJ2aWNlCi0JICogc2VuZHMgaW4gaXRzIG93biBwbS4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVUlSdW5uZXJQcm9ncmVzc01vbml0b3IgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JXcmFwcGVyIHsKLQkJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHBtY2FuY2VsOwotCQkKLQkJcHVibGljIFVJUnVubmVyUHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcG1jYW5jZWwsIElQcm9ncmVzc01vbml0b3IgcG1tYWluKSB7Ci0JCQlzdXBlcihwbW1haW4pOwotCQkJdGhpcy5wbWNhbmNlbCA9IHBtY2FuY2VsOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiBwbWNhbmNlbC5pc0NhbmNlbGVkKCkgfHwgc3VwZXIuaXNDYW5jZWxlZCgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0Q2FuY2VsZWQoYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXN1cGVyLnNldENhbmNlbGVkKHZhbHVlKTsKLQkJCXBtY2FuY2VsLnNldENhbmNlbGVkKHZhbHVlKTsJLy8gQ2FuY2VsIGl0IHRvbyBub3cuCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVVJUnVubmVyI2hhbmRsZUJ1aWxkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUJ1aWxkKGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHx8IERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCVByb3h5TGF1bmNoU3VwcG9ydC5ydW5CdWlsZChwbSk7Ci0JCX0gZWxzZSB7Ci0JCQlwbS5iZWdpblRhc2soIiIsIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5idXN5Q3Vyc29yV2hpbGUobmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJSVByb2dyZXNzTW9uaXRvciB1aXBtID0gbmV3IFVJUnVubmVyUHJvZ3Jlc3NNb25pdG9yKHBtLCBtb25pdG9yKTsgCi0JCQkJCQl0cnkgewotCQkJCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5ydW5CdWlsZCh1aXBtKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQkJaWYgKHVpcG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJcG0uc2V0Q2FuY2VsZWQodHJ1ZSk7CS8vIE1ha2Ugc3VyZSB0aGF0IGNhbmNlbCBnb3QgdGhyb3VnaCAoY291bGQgb2YgY29tZSBmcm9tIG1vbml0b3IgaW5zdGVhZCkuCi0JCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCWlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJCQl0aHJvdyAoQ29yZUV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldENhdXNlKCksIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHdhcyBjYW5jZWxlZCwgbGF1bmNoIHdpbGwgYmUgY2FuY2VsZWQgdG9vLiBwbSBpcyBhbHJlYWR5IG1hcmtlZCBjYW5jZWxlZCBhbmQgY2FsbGVyIGNhbiBjaGVjayB0aGF0Ci0JCQl9Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMDhjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkCi0jCi0KLQotCi0jCi0jIEV4Y2VwdGlvbiBNZXNzYWdlcy4gQWxsIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSB0aGUgdGV4dCBvZiBhbiBqYXZhIGV4Y2VwdGlvbi4KLSMKLVVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjRFIFVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93bi4KLQotIyB7MH0gYW5kIHsxfSBhcmUgamF2YSBjbGFzc2VzIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi1DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY1RSAiezB9IiBpcyBuZWl0aGVyIGEgc3ViY2xhc3Mgb2YsIG5vciBkb2VzIGl0IGltcGxlbWVudCwgY2xhc3MgInsxfSIuCi0KLSMgU3RhbmRhcmQgQmVhbiBQcm94eSBGYWN0b3J5IGFuZCBTdGFuZGFyZCBCZWFuIFR5cGUgUHJveHkgRmFjdG9yeSBhcmUgdGVybXMgaW4gYmVhbmluZm8uIFRoZXkgYXJlIHRoZQotIyBzdGFuZGFyZCAoaS5lLiBiYXNlKSBmYWN0b3JpZXMgZm9yIGJlYW5zIG9yIGJlYW4gdHlwZXMuIEJlYW4gdHlwZXMgYXJlIGphdmEgY2xhc3Nlcy4KLVByb3h5RmFjdG9yeV9FWENfX05vQmVhblByb3h5RmFjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjZFIE5vIFN0YW5kYXJkIEJlYW4gUHJveHkgRmFjdG9yeSBoYXMgYmVlbiBzZXQuCi1Qcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5UeXBlUHJveHlGYWN0b3J5ICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY3RSBObyBTdGFuZGFyZCBCZWFuIFR5cGUgUHJveHkgRmFjdG9yeSBoYXMgYmVlbiBzZXQuCi0KLQotIyB7MH0gaXMgdGhlIHRpdGxlIG9mIGEgcHJvamVjdC4KLU5vdF9KYXZhX1Byb2plY3RfV0FSTl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjhXIFByb2plY3QgInswfSIgaXMgbm90IGEgamF2YSBwcm9qZWN0LgotTm9fVk1fV0FSTl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA2OVcgUHJvamVjdCAiezB9IiBoYXMgbm8gSmF2YSBKUkUgZGVmaW5lZCB0byB1c2UgdG8gcnVuIHByb2dyYW1zIHdpdGhpbiB0aGlzIHByb2plY3QuCi1Ob19JbXBsZW1lbnRhdGlvbl9XQVJOXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDcwVyBDYW5ub3QgZmluZCBhIHByb3h5IGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgcHJvamVjdCAiezB9LiIKLQotUHJveHlMYXVuY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMYXVuY2hpbmcgTG9jYWwgUHJveHkgVk0KLVByb3h5V2FpdEZvckJ1aWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2FpdGluZyBmb3IgYnVpbGQgdG8gY29tcGxldGUKLUV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVEdWVUb19FWENfICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjJFIEV4cHJlc3Npb24gaXMgaW4gaW52YWxpZCBzdGF0ZSBkdWUgdG8gInswfSIKLUV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjNFIEV4cHJlc3Npb24gaXMgaW4gaW52YWxpZCBzdGF0ZQotRXhwcmVzc2lvbl9UeXBlU2VudEluSW52YWxpZE9yZGVyX0VYQ18gICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2NEUgRXhwcmVzc2lvbiB0eXBlIHNlbnQgaW4gaW52YWxpZCBvcmRlciwgcmVjZWl2ZWQ6IHswfSwgZXhwZWN0ZWQgezF9LgotRXhwcmVzc2lvbl9BcnJheVR5cGVOb3RBbkFycmF5X0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2NUUgQXJyYXlUeXBlICJ7MH0iIGlzIG5vdCBhbiBhcnJheS4KLUV4cHJlc3Npb25fQ2Fubm90SGFuZGxlTm9SZWNlaXZlT25GaWVsZEFjY2Vzc19FWENfICAgICAgICAgID0gSVdBVjAxNjZFIEFjY2VzcyBieSBmaWVsZCBuYW1lICh7MH0pIChub3QgYnkgcHJveHkpIHJlcXVpcmVzIGEgcmVjZWl2ZXIuCi1FeHByZXNzaW9uX01ldGhvZHNOZWVkUmVjZWl2ZXJfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTY3RSBBY2Nlc3MgYnkgbWV0aG9kIG5hbWUgKHswfSkgKG5vdCBieSBwcm94eSkgcmVxdWlyZXMgYSByZWNlaXZlci4KLUV4cHJlc3Npb25fSW52YWxpZE1hcmtOZXN0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjhFIEltcHJvcGVyIG5lc3Rpbmcgb2YgbWFyayBzdGF0ZW1lbnRzIGluIEV4cHJlc3Npb24uIFRyaWVkIHRvIHBvcCBvciBlbmRNYXJrIHRvIGJlZm9yZSBjdXJyZW50IG1hcmsuIFRyaWVkIHRvIGdvIHBhc3QgTWFyayMgezB9LgotRXhwcmVzc2lvbl9JbnZhbGlkUHJveHk9RXhwcmVzc2lvbiBQcm94eSBpcyBmb3IgYSBkaWZmZXJlbnQgZXhwcmVzc2lvbgotUHJveHlQbHVnaW5fQ2xlYW51cERlZmF1bHRQcm94eUxhdW5jaENvbmZpZ3VyYXRpb25zICAgICAgICAgPSBDbGVhbiB1cCBkZWZhdWx0IHByb3h5IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLVByb3h5TGF1bmNoU3VwcG9ydF9SZWdpc3RyeUNvdWxkTm90U3RhcnRGb3JTb21lUmVhc29uX1dBUk5fID0gSVdBVjAxNjhXIFJlZ2lzdHJ5IGNvdWxkIG5vdCBiZSBzdGFydGVkIGZvciBzb21lIHJlYXNvbi4KLUV4cHJlc3Npb25fQ3JlYXRlUHJveHlSZWFzc2lnbm1lbnRFeHByZXNzaW9uX0ludmFsaWRGb3JSZWFzc2lnbm1lbnRfRVhDXz1JbnZhbGlkIGV4cHJlc3Npb24gdHlwZSBmb3IgcmVhc3NpZ25tZW50OiB7MH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0FtYmlndW91c01ldGhvZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU2ZWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLSAKLQotLyoqCi0gKiBBbWJpZ3VvdXMgTWV0aG9kIEV4Y2VwdGlvbi4gSS5FLiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIHRoYXQgY291bGQgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzA4NDEzNzYxMjM0NDM3MzM4MUw7Ci0JcHVibGljIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbigpIHsKLQl9Ci0JcHVibGljIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjI1ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotCi0KLSAqLwotLyoqCi0gKiBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY29tbWFuZCBwcm9jZXNzaW5nLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUxOTIzODU3MTE0NTY4MjUxNEw7Ci0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBmRXhjZXB0aW9uRGF0YTsKLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbigpIHsKLQkJZkV4Y2VwdGlvbkRhdGEgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbihPYmplY3QgZGF0YSkgewotCQlmRXhjZXB0aW9uRGF0YSA9IGRhdGE7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JCWZFeGNlcHRpb25EYXRhID0gZGF0YTsKLQl9CQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RXhjZXB0aW9uRGF0YSgpIHsKLQkJcmV0dXJuIGZFeGNlcHRpb25EYXRhOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY292ZXJhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7CS8vIEJ5IGRlZmF1bHQgQ29tbWFuZCBFeGNlcHRpb25zIGFyZSBub3QgcmVjb3ZlcmFibGUuCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vR2VuZXJpY0V2ZW50UXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vR2VuZXJpY0V2ZW50UXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmZDlmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0dlbmVyaWNFdmVudFF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZSQKLSAqICAkUmV2aXNpb24kICAkRGF0ZSQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi0vKioKLSAqIEEgZ2VuZXJpYyBldmVudCBxdWV1ZS4gSXQgcnVucyBvbiBpdHMgb3duIHRocmVhZCBhbmQgd2lsbCBleGVjdXRlIGFueSBxdWV1ZWQgdXAgcnVubmFibGVzLgotICogPHA+Ci0gKiBXaGVuIGEgcnVubmFibGUgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGUgdGhyZWFkIHdpbGwgYmUgbm90aWZpZWQuIElmIHRoZSB0aHJlYWQgaXMgZnJlZSBpdCB3aWxsCi0gKiBydW4gdGhlIHJ1bm5hYmxlLiBJZiBpdCBpcyBub3QgZnJlZSwgdGhlIHJ1bm5hYmxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLiBUaGUgdGhyZWFkIHdpbGwgcHJvY2VzcwotICogYWxsIGludGVydmVuaW5nIHJ1bm5hYmxlcyBhbmQgdGhlbiBleGVjdXRlIHRoZSBydW5uYWJsZSBpbiBzZXF1ZW5jZSB3aXRoIGFsbCBvZiB0aGUgcmVzdC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4geW91IGNhbid0IHVzZSB0aGUgc3lzdGVtIHdpZGdldCAoZS5nLiBBV1QgZXZlbnQgcXVldWUgb3IgU1dUIGFzeW5jRXhlYykgb3Igd2hlbiB0aGUKLSAqIHJ1bm5hYmxlIG11c3QgYmUgZXhlY3V0ZWQgb24gYSBub24tdWkgdGhyZWFkLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gSXQgaXMgcmVxdWlyZWQgdGhhdCB7QGxpbmsgI2Nsb3NlKCl9IGJlIGNhbGxlZCBzbyB0aGF0IHJlc291cmNlcyBhcmUgY2xlYXJlZCB1cC4KLSAqIAotICogQHNpbmNlIDEuMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNFdmVudFF1ZXVlIHsKLQkKLQlwcml2YXRlIExpbmtlZExpc3QgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBFdmVudFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBydW4gPSB0cnVlOwotCQkKLQkJcHVibGljIEV2ZW50VGhyZWFkKFN0cmluZyB0aXRsZSkgewotCQkJc3VwZXIodGl0bGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCXN5bmNocm9uaXplZCAocXVldWUpIHsKLQkJCQlydW4gPSBmYWxzZTsKLQkJCQlxdWV1ZS5jbGVhcigpOwotCQkJCXF1ZXVlLm5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwb3N0RXZlbnQoUnVubmFibGUgcnVuKSB7Ci0JCQlpZiAoIXRoaXMuaXNBbGl2ZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXZlbnQgcXVldWUgdGhyZWFkIGlzIG5vdCBleGVjdXRpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAocXVldWUpIHsKLQkJCQlpZiAocnVuICE9IG51bGwpCi0JCQkJCXF1ZXVlLmFkZExhc3QocnVuKTsKLQkJCQlxdWV1ZS5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZTsKLQkJCQlzeW5jaHJvbml6ZWQgKHF1ZXVlKSB7Ci0JCQkJCXdoaWxlIChydW4gJiYgcXVldWUuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXF1ZXVlLndhaXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJ1bikKLQkJCQkJCXJldHVybjsJLy8gRG9uZS4KLQkJCQkJZWxzZSB7Ci0JCQkJCQlydW5uYWJsZSA9IChSdW5uYWJsZSkgcXVldWUucmVtb3ZlRmlyc3QoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXJ1bm5hYmxlID0gbnVsbDsJLy8gU2V0IHRoaXMgc28gdGhhdCB3ZSBkb24ndCBob2xkIG9udG8gcmVzb3VyY2VzIGluIHRoZSBydW5uYWJsZSB3aGlsZSB3YWl0aW5nIGZvciBuZXh0IHF1eS4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBFdmVudFRocmVhZCBldmVudFRocmVhZDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIHRpdGxlLiAoVGhpcyB0aXRsZSB3aWxsIGJlIHRoZSB0aXRsZSBvbiB0aGUgVGhyZWFkIGZvciB0aGUgcXVldWUpLgotCSAqIFRoZSB0aHJlYWQgd2lsbCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjdXJyZW50IHRocmVhZC4gCi0JICogQHBhcmFtIHF1ZXVlVGl0bGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyBHZW5lcmljRXZlbnRRdWV1ZShTdHJpbmcgcXVldWVUaXRsZSkgewotCQl0aGlzKHF1ZXVlVGl0bGUsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0UHJpb3JpdHkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgdGl0bGUuIChUaGlzIHRpdGxlIHdpbGwgYmUgdGhlIHRpdGxlIG9uIHRoZSBUaHJlYWQgZm9yIHRoZSBxdWV1ZSkuCi0JICogQW5kIGEgcHJpb3JpdHkgZm9yIHRoZSBldmVudCBxdWV1ZSdzIHByb2Nlc3NpbmcgdGhyZWFkLgotCSAqIEBwYXJhbSBxdWV1ZVRpdGxlCi0JICogQHBhcmFtIHByaW9yaXR5IHByaW9yaXR5IHRvIHVzZSBmb3IgZXZlbnQgcXVldWUncyB0aHJlYWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0V2ZW50UXVldWUoU3RyaW5nIHF1ZXVlVGl0bGUsIGludCBwcmlvcml0eSkgewotCQlldmVudFRocmVhZCA9IG5ldyBFdmVudFRocmVhZChxdWV1ZVRpdGxlKTsKLQkJZXZlbnRUaHJlYWQuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCQlzeW5jaHJvbml6ZWQocXVldWUpIHsKLQkJCWV2ZW50VGhyZWFkLnN0YXJ0KCk7Ci0JCQl0cnkgewotCQkJCXF1ZXVlLndhaXQoMTAwKTsJLy8gV2FpdCBmb3IgdGhyZWFkIHRvIHN0YXJ0LgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDbG9zZSB0aGUgZXZlbnQgcXVldWUuIFRoaXMgd2lsbCBjbGVhciBvdXQgYW55IHBlbmRpbmcgZXZlbnRzLiBUaGV5IHdpbGwgbm90Ci0JICogYmUgZXhlY3V0ZWQuIAotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWV2ZW50VGhyZWFkLmNsb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFBvc3QgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBydW5uYWJsZSBydW5uYWJsZSB0byBleGVjdXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBraWNrLXN0YXJ0IHRoZSB0aHJlYWQgaWYgZm9yIHNvbWUgcmVhc29uIGl0IG1heSBiZSB3YWl0aW5nIGFuZCBpdCBzaG91bGRuJ3QgYmUuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBldmVudCBxdWV1ZSB0aHJlYWQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQsIG9yIGVuZGVkIGZvciBzb21lIHNldmVyZSBlcnJvci4KLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RFdmVudChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlldmVudFRocmVhZC5wb3N0RXZlbnQocnVubmFibGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcxOGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFueSBjYWxsYmFjay4KLSAqIFRoZSBjYWxsYmFjayB3aWxsIHVzZSB0aGUgSVZNQ2FsbGJhY2tTZXJ2ZXIgcGFzc2VkIGluIHRvCi0gKiBnZXQgY2FsbGJhY2sgaGFuZGxlcnMsIGFuZCB0aGUgaWQgcGFzc2VkIGluIGlzCi0gKiB0byBiZSBwYXNzZWQgdG8gdGhlc2UgaGFuZGxlcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrIHsKLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjYWxsYmFjawotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlciwgaW50IGNhbGxiYWNrSUQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDJmODI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0KLQotICovCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrIGhhbmRsZXIuCi0gKiBVc2VycyB3aWxsIHRhbGsgdG8gdGhpcyBpbnRlcmZhY2UgdG8gcGVyZm9ybSAKLSAqIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FsbGJhY2tIYW5kbGVyIHsKLQotCS8qKgotCSAqIENhbGxiYWNrLCBidXQgc2VuZCB0aGUgcGFybSBhcyBhbiBvYmplY3QsIGllLiBpdCBtdXN0Ci0JICogYmUgbm90aGluZyBidXQgY29uc3RhbnRzLCBlLmcuIFN0cmluZywgSW50ZWdlciwgb3IgYW4KLQkgKiBhcnJheSBvZiBjb25zdGFudHMuIENvbnN0YW50cyBzaG91bGQgbm90IGJlIHRoaW5ncyBsaWtlCi0JICogcmVndWxhciBvYmplY3RzLiBUaGlzIGlzIGJlY2F1c2Ugb25seSBzdGFuZGFyZCBqYXZhLmxhbmcKLQkgKiB0eXBlIGNvbnN0YW50cyBjYW4gYmUgYXNzdXJlZCB0byBiZSBhdmFpbGFibGUgb24gdGhlIG90aGVyCi0JICogY2xpZW50LiBBbHNvIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYmlnIG9iamVjdHMuIEl0IG11c3QKLQkgKiBiZSBjb25zdGFudHMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIHNlbnQgYmFjayBmb3IgYW55IHJlYXNvbgotCSAqIHNpbmNlIHRoZWlyIGlkZW50aXR5IHdpbGwgYmUgbG9zdCBpbiB0aGUgdHJhbnNmZXIuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgdXNlZCBpZiB0aGVyZSBhcmUgbm8gcGFybXMgKGkuZS4gaXQgaXMgbnVsbCkuCi0JICogPHA+Ci0JICogVG8gc2VuZCBiaWcgb2JqZWN0cywgdXNlIHRoZSBjYWxsYmFjayBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGNhbGxiYWNrSUQKLQkgKiBAcGFyYW0gbXNnSUQKLQkgKiBAcGFyYW0gcGFybQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElWTUNhbGxiYWNrU2VydmVyI3JlcXVlc3RTdHJlYW0oaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsYmFja0FzQ29uc3RhbnRzKGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQsIE9iamVjdCBwYXJtKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxiYWNrIHRvIHJlZ2lzdGVyZWQgY2xpZW50LgotCSAqIDxwPgotCSAqICBUaGUgcGFybXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcm1zLCBvciBpdCBpcyBhbiBhcnJheSBvZiBwYXJtcy4KLQkgKiBUaGUgcGFybXMKLQkgKiAgICB3aWxsIGJlIHR1cm5lZCBpbnRvIHByb3hpZXMgb24gdGhlIGNsaWVudCB2bS4gU28gdGhlIGNhbGxiYWNrCi0JICogICAgd2lsbCByZWNpZXZlIGFuIGFycmF5IG9mIHByb3hpZXMgdG8gdGhlIHZhbHVlcyBpbiB0aGUgcGFybXMuCi0JICogICAgSWYgYW55IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBhcnJheSBpcyBpdHNlbGYgYW4gYXJyYXksIGEKLQkgKiAgICBwcm94eSB0byB0aGUgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBzZW50LiBUaGUgYXJyYXkgaXRzZWxmCi0JICogICAgd2lsbCBub3QgYmUgc2VudC4KLQkgKiA8cD4KLQkgKiAgICBJZiBhbiBhcnJheSBlbnRyeSBzaG91bGQgZ28gYWNyb3NzIGFzIGFuIGFycmF5IG9mIHByb3hpZXMgYW5kCi0JICogICAgbm90IGFzIG9uZSBwcm94eSB0byBhbiBhcnJheSwgdGhlbiB0aGUgZW50cnkgbmVlZHMgdG8gYmUgYW4KLQkgKiAgICBpbnN0YW5jZSBvZiB7QGxpbmsgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSB0cmFuc21pdGFibGVBcnJheX0uIFRoaXMgd2lsbCBmbGFnCi0JICogICAgdGhhdCBpdCBzaG91bGQgdHJhbnNtaXQgdGhlIGVudGlyZSBlbnRyeSBhcyBwcm94aWVzLiBUaGlzIHNob3VsZAotCSAqICAgIGJlIHVzZWQgc3BhcmluZ2x5LCBvbmx5IGlmIHRoZXJlIGlzbid0IG11Y2ggZGF0YSBpbiB0aGUgYXJyYXkgYW5kCi0JICogICAgYWxsIG9mIHRoZSBhcnJheSB3b3VsZCBiZSB1c2VkIG9uIHRoZSBjbGllbnQuIFRoYXQgd2F5IHRyYW5zbWl0dGluZwotCSAqICAgIHRoZSBlbnRpcmUgYXJyYXkgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBjb21wb25lbnRzLgotCSAqIDxwPgotCSAqIElmIHRoZSBhcnJheSBjb250YWlucyBvbmx5IG9uZSBlbnRyeSBvciB0aGUgcGFybSBpdHNlbGYgaXMgbnVsbCwgdGhlbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBJQmVhblByb3h5KX0KLQkgKiB3aWxsIGJlIGNhbGxlZC4gRWxzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBPYmplY3RbXSl9IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIG9mIHRoZSBwYXJtcwotCSAqIHR1cm5lZCBpbnRvIHByb3hpZXMgYXMgbWVudGlvbmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguCi0JICoKLQkgKiBAcGFyYW0gY2FsbGJhY2tJRCBUaGUgaWQgb2YgdGhlIGNhbGxiYWNrLiBUaGlzIHdpbGwgYmUgZ2l2ZW4KLQkgKiAgICB0byB0aGUgY2FsbGJhY2sgd2hlbiBpdCBpcyBjcmVhdGVkLCBhbmQgaXQgbXVzdCBwYXNzCi0JICogICAgb24gdG8gdGhlIGhhbmRsZXIuIFRoYXQgd2F5IGl0IGlzIGtub3cgd2hpY2ggY2FsbGJhY2sKLQkgKiAgICB0byBjYWxsIG9uIHRoZSBjbGllbnQuCi0JICogQHBhcmFtIG1zZ0lEIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlzIGFuCi0JICogICAgYWdyZWVkIHVwb24gaWQgb2YgdGhlIGRldmVsb3BlcnMgb2YgdGhlIGNhbGxiYWNrIG9uIGJvdGgKLQkgKiAgICBzaWRlcy4KLQkgKiBAcGFyYW0gcGFybXMgTnVsbCBpZiBubyBwYXJtcywgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBzZW5kIHRvIHRoZSBjbGllbnQgdm0uIFNlZSB0aGUgY29tbWVudHMgCi0JICogYWJvdmUgZm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrV2l0aFBhcm1zKGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQsIE9iamVjdFtdIHBhcm1zKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFycmF5IHdyYXBwZXIgdGhhdCB0dXJucyBhbiBhcnJheSBmb3IgcGFyYW1ldGVycyBpbnRvIGEgdHJhbnNtaXR0YWJsZSBhcnJheS4KLQkgKiAKLQkgKiBAc2VlIElDYWxsYmFja0hhbmRsZXIjY2FsbGJhY2tXaXRoUGFybXMoaW50LCBpbnQsIE9iamVjdFtdKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNtaXRhYmxlQXJyYXkgewotCQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gZkFycmF5OwotCQlwdWJsaWMgVHJhbnNtaXRhYmxlQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLQkJCWZBcnJheSA9IGFycmF5OwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRBcnJheSgpIHsKLQkJCXJldHVybiBmQXJyYXk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja1J1bm5hYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja1J1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWFlN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ2FsbGJhY2tSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLQotLyoqCi0gKiBVc2VycyB3b3VsZCBpbXBsZW1lbnQgdGhpcyBhcyBhIHJ1bm5hYmxlIHRvIAotICogc2VuZCBhIGNhbGxiYWNrIHJlcXVlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrUnVubmFibGUgewotCQotCS8qKgotCSAqIFRoZSBhY3R1YWwgcnVuIGNvZGUuCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmIwNGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0KLQotICovCi0KLQotcHVibGljIGNsYXNzIElDb21tYW5kRXhjZXB0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1DYWxsYmFja1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1DYWxsYmFja1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzkzNDlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNQ2FsbGJhY2tTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0gKiAgJFJDU2ZpbGUkCi0gKiAgJFJldmlzaW9uJCAgJERhdGUkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgdGhlIAotICogVk0gY2FsbGJhY2sgU2VydmVyLiBJdCB3aWxsIGJlIGdpdmVuIHRvIGFuCi0gKiBJQ2FsbGJhY2sgc28gdGhhdCB0aGUgY2FsbGJhY2sgY2FuIGFjY2VzcwotICogdGhlIHNlcnZlciB0byByZXF1ZXN0IGEgY2FsbGJhY2suCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZNQ2FsbGJhY2tTZXJ2ZXIgewotCQotCS8qKgotCSAqIEdldCB0aGUgSVZNU2VydmVyIGZvciB0aGlzIGNhbGxiYWNrIHNlcnZlci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElWTVNlcnZlciBnZXRJVk1TZXJ2ZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBQcm9jZXNzIGEgY2FsbGJhY2suIFRoZSBydW5uYWJsZSBjb250YWlucyB0aGUKLQkgKiBhY3R1YWwgY29kZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvQ2FsbGJhY2soSUNhbGxiYWNrUnVubmFibGUgcnVubmFibGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlcXVlc3QgYSBzdHJlYW0gZm9yIHdyaXRpbmcgYSBsb3Qgb2YgZGF0YSAoc3VnZ2VzdGVkIGZvciBsYXJnZXIKLQkgKiB0aGFuIHNldmVyYWwgdGhvdXNhbmQgYnl0ZXMpLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGFzc2lnbmVkCi0JICogdG8gdGhpcyBzdHJlYW0gdW50aWwgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSByZXF1ZXN0U3RyZWFtKGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTVNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1TZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlZGIzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLSAKLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBzZXJ2ZXIgZm9yIHRoZSB2bSBvbiB0aGUgdm0gc2lkZSAoaS5lLiBub3QgdGhlIGNsaWVudCBzaWRlKS4KLSAqIDxwPgotICogSXQgY2FuIGJlIHBhc3NlZCB0byBwcm94aWVzIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlIHZtIHNlcnZlci4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWTVNlcnZlciB7Ci0KLQkvKioKLQkgKiBBZGQgYSBydW5uYWJsZSB0aGF0IHdpbGwgYmUgY2FsbGVkIGlmIHNodXRkb3duIGlzIHJlcXVlc3RlZC4gSWYgYWxyZWFkeSBhZGRlZCwKLQkgKiBpdCB3aWxsIG5vdCBiZSBhZGRlZCBhZ2Fpbi4KLQkgKiA8cD4KLQkgKiBUaGUgYm9keSBvZiB0aGUgcnVubmFibGUgbXVzdCBub3QgZG8gYW55IHZtIHNlcnZlciBjYWxscy4gVGhhdCBpcyBiZWNhdXNlCi0JICogdGhlIHNlcnZlciBpcyBzaHV0ZG93biBhdCB0aGlzIHBvaW50LiBUaGUgYm9keSBtdXN0IHNpbXBseSBkbyBjbGVhbiB1cCBjb2RlLgotCSAqIFRoZSBzaHV0ZG93biB3aWxsIG5vdCBjb250aW51ZSB1bnRpbCB0aGUgY2FsbCB0byB0aGUgcnVubmFibGUgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogQ2FsbHMgdG8gdGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgc2h1dGRvd24gaGFzIGFscmVhZHkgc3RhcnRlZC4KLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc2h1dGRvd24gcnVubmFibGUgZnJvbSB0aGUgbGlzdC4gSWYgbm90IGFkZGVkLCB0aGVuIG5vdCBhbiBlcnJvciB0byBjYWxsIHRoaXMuCi0JICogPHA+Ci0JICogQ2FsbHMgdG8gdGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgc2h1dGRvd24gaGFzIGFscmVhZHkgc3RhcnRlZC4KLQkgKiBAcGFyYW0gcnVubmFibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NYXBUeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NYXBUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDJhZmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWFwVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB1c2VkIGZvciBtYXBwaW5nIGJldHdlZW4gSk5JIGZvcm1hdCBhbmQgbm9uLUpOSSBmb3JtYXQuIEl0IGFsc28gaGFzIHRoZQotICogbWFwcyBmb3IgcHJpbWl0aXZlcy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTWFwVHlwZXMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBIYXNoTWFwIE1BUF9TSE9SVFNJR19UT19UWVBFID0gbmV3IEhhc2hNYXAoOCk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBIYXNoTWFwIE1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRyA9IG5ldyBIYXNoTWFwKDgpOwotCXN0YXRpYyB7Ci0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiQiIsIEJ5dGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJDIiwgQ2hhcmFjdGVyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiRCIsIERvdWJsZS5UWVBFKTsJCSAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiRiIsIEZsb2F0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiSSIsIEludGVnZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJKIiwgTG9uZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIlMiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIloiLCBCb29sZWFuLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJieXRlIiwiQiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiY2hhciIsIkMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImRvdWJsZSIsIkQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImZsb2F0IiwiRiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiaW50IiwiSSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgibG9uZyIsIkoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoInNob3J0IiwiUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiYm9vbGVhbiIsIloiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JCi0KLQkvKioKLQkgKiBDb252ZXJ0IGZvcm1hbCB0eXBlIG5hbWUgZm9yIGFuIGFycmF5IChpLmUuIGphdmEubGFuZy5PYmplY3RbXQotCSAqIHRvIHRoZSBqbmkgZm9ybWF0IChpLmUuIFtMamF2YS5sYW5nLk9iamVjdDspCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gYSBuYW1lIGlzIHBhc3NlZCBpbiBmcm9tIHRoZSBJREUgc2lkZS4KLQkgKiBUaGUgVk0gc2lkZSB1c2VzIHRoZSBqbmkgZm9ybWF0LCBhbmQgYWxsIG9mIHByb3h5IHVzZXMgdGhlIGpuaSBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIGNsYXNzbmFtZQotCSAqIEByZXR1cm4gc3RyaW5nIGpuaSBmb3JtIG9mIG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sk5JRm9ybWF0TmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0JCWlmIChjbGFzc25hbWUubGVuZ3RoKCkgPT0gMCB8fCAhY2xhc3NuYW1lLmVuZHNXaXRoKCJdIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjbGFzc25hbWU7CS8vIE5vdCBhbiBhcnJheSxvciBpbnZhbGlkCi0JCQotCQlTdHJpbmdCdWZmZXIgam5pID0gbmV3IFN0cmluZ0J1ZmZlcihjbGFzc25hbWUubGVuZ3RoKCkpOwotCQlpbnQgZmlyc3RPcGVuQnJhY2tldCA9IGNsYXNzbmFtZS5pbmRleE9mKCdbJyk7Ci0JCWludCBvYiA9IGZpcnN0T3BlbkJyYWNrZXQ7Ci0JCXdoaWxlIChvYiA+IC0xKSB7Ci0JCQlpbnQgY2IgPSBjbGFzc25hbWUuaW5kZXhPZignXScsIG9iKTsKLQkJCWlmIChjYiA9PSAtMSkKLQkJCQlicmVhazsKLQkJCWpuaS5hcHBlbmQoJ1snKTsKLQkJCW9iID0gY2xhc3NuYW1lLmluZGV4T2YoJ1snLCBjYik7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaW5hbFR5cGUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsIGZpcnN0T3BlbkJyYWNrZXQpLnRyaW0oKTsKLQkJaWYgKGZpbmFsVHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2hvcnRTaWcgPSAoU3RyaW5nKSBNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcuZ2V0KGZpbmFsVHlwZSk7Ci0JCQlpZiAoc2hvcnRTaWcgPT0gbnVsbCkgewotCQkJCWpuaS5hcHBlbmQoJ0wnKTsKLQkJCQlqbmkuYXBwZW5kKGZpbmFsVHlwZSk7Ci0JCQkJam5pLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIHsKLQkJCQlqbmkuYXBwZW5kKHNob3J0U2lnKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGpuaS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRzIGZyb20gdGhlIEpOSSBmb3JtYXQgdG8gdGhlIGZvcm1hbCB0eXBlbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gam5pTmFtZQotCSAqIEByZXR1cm4gZm9ybWFsIHR5cGVuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoU3RyaW5nIGpuaU5hbWUpIHsKLQkJaWYgKGpuaU5hbWUuY2hhckF0KDApID09ICdbJykgewotCQkJLy8gSXQgaXMgYW4gYXJyYXkKLQkJCWludCBkaW1zID0gam5pTmFtZS5sYXN0SW5kZXhPZignWycpKzE7CS8vIE51bWJlciBvZiBkaW1lbnNpb25zCi0JCQlpbnQgc3RhcnRUeXBlID0gZGltczsKLQkJCVN0cmluZ0J1ZmZlciBmTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoam5pTmFtZS5sZW5ndGgoKSsoMipkaW1zKSk7IAotCQkJaWYgKGpuaU5hbWUuY2hhckF0KHN0YXJ0VHlwZSkgPT0gJ0wnKQotCQkJCWZOYW1lLmFwcGVuZChqbmlOYW1lLnN1YnN0cmluZyhzdGFydFR5cGUrMSwgam5pTmFtZS5sZW5ndGgoKS0xKSk7CS8vIEZvciAiW0xqYXZhLmxhbmcuU3RyaW5nOyIgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIgotCQkJZWxzZSBpZiAoam5pTmFtZS5sZW5ndGgoKSA9PSBzdGFydFR5cGUrMSkgewotCQkJCS8vIFBvc3NpYmxlIHByaW1pdGl2ZQotCQkJCUNsYXNzIHR5cGUgPSAoQ2xhc3MpIE1BUF9TSE9SVFNJR19UT19UWVBFLmdldChqbmlOYW1lLnN1YnN0cmluZyhzdGFydFR5cGUsIHN0YXJ0VHlwZSsxKSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlmTmFtZS5hcHBlbmQodHlwZS5nZXROYW1lKCkpOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gIiI7CS8vIEludmFsaWQgaWYgbm8gJ0wnIGFuZCBub3QgYSBwcmltaXRpdmUuIC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZQotCQkJCXJldHVybiAiIjsJLy8gSW52YWxpZCwgbXVzdCBiZSBlaXRoZXIgYSBwcmltaXRpdmUgb3IgJ0wnIHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlKGRpbXMtLSA+IDApIHsKLQkJCQlmTmFtZS5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmTmFtZS50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKGpuaU5hbWUubGVuZ3RoKCkgPT0gMSkgewotCQkJLy8gUG9zc2libGUgcHJpbWl0aXZlLgotCQkJQ2xhc3MgdHlwZSA9IChDbGFzcykgTUFQX1NIT1JUU0lHX1RPX1RZUEUuZ2V0KGpuaU5hbWUpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiB0eXBlLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gSWYgZ290IGhlcmUgdGhlbiBqdXN0IGEgbmFtZSBhcyBpcy4KLQkJcmV0dXJuIGpuaU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGZvcm1hbCB0eXBlIG5hbWUsIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBkaW1lbnNpb25zLAotCSAqIHRvIGFuIGFycmF5IEpOSSB0eXBlLgotCSAqIEBwYXJhbSBmaW5hbENvbXBvbmVudCBmaW5hbCBjb21wb25lbnQgbmFtZSwgc2hvdWxkIG5vdCBiZSBhbiBhcnJheSB0eXBlLgotCSAqIEBwYXJhbSBkaW1lbnNpb25zIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciB0aGUgYXJyYXkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpOSVR5cGVOYW1lKFN0cmluZyBmaW5hbENvbXBvbmVudCwgaW50IGRpbWVuc2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGpuaSA9IG5ldyBTdHJpbmdCdWZmZXIoZmluYWxDb21wb25lbnQubGVuZ3RoKCkrZGltZW5zaW9ucysyKTsKLQkJd2hpbGUgKGRpbWVuc2lvbnMtLSA+IDApIHsKLQkJCWpuaS5hcHBlbmQoJ1snKTsKLQkJfQotCQkKLQkJU3RyaW5nIHNob3J0U2lnID0gKFN0cmluZykgTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChmaW5hbENvbXBvbmVudCk7Ci0JCWlmIChzaG9ydFNpZyA9PSBudWxsKSB7Ci0JCQlqbmkuYXBwZW5kKCdMJyk7Ci0JCQlqbmkuYXBwZW5kKGZpbmFsQ29tcG9uZW50KTsKLQkJCWpuaS5hcHBlbmQoJzsnKTsKLQkJfSBlbHNlIHsKLQkJCWpuaS5hcHBlbmQoc2hvcnRTaWcpOwotCQl9Ci0JCQotCQlyZXR1cm4gam5pLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQyOTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWV0aG9kSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL01ldGhvZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNlYjY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWV0aG9kSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY2xhc3MgdG8gZG8gbWVzc2FnZS9jb25zdHJ1Y3RvciB3b3JrLiAKLSAqIFNwZWNpZmljYWxseSB0byBmaW5kIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEhlbHBlciB7Ci0JCi0JLyoKLQkgKiBUaGUgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCBOdWxsIGNsYXNzIHR5cGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTlVMTF9DTEFTUyB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgTlVMTF9UWVBFID0gTlVMTF9DTEFTUy5jbGFzczsKLQkKLQlzdGF0aWMgZmluYWwgQXJyYXlMaXN0IHNQcmltaXRpdmVzT3JkZXI7Ci0Jc3RhdGljIGZpbmFsIGludCBzQ2hhclBvczsKLQkKLQlzdGF0aWMgewotCQlzUHJpbWl0aXZlc09yZGVyID0gbmV3IEFycmF5TGlzdCg2KTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoQnl0ZS5UWVBFKTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoU2hvcnQuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKEludGVnZXIuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKExvbmcuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKEZsb2F0LlRZUEUpOwotCQlzUHJpbWl0aXZlc09yZGVyLmFkZChEb3VibGUuVFlQRSk7Ci0KLQkJLy8gY2hhciBjYW4gYmUgdHJlYXRlZCBsaWtlIGEgc2hvcnQgZm9yIHB1cnBvc2VzIG9mIG9yZGVyaW5nLgotCQlzQ2hhclBvcyA9IHNQcmltaXRpdmVzT3JkZXIuaW5kZXhPZihTaG9ydC5UWVBFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUyIGNhbiBiZSBhc3NpZ25lZCB0byB0eXBlMSBpbgotCSAqIG1ldGhvZCBhcmd1bWVudCBjb252ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzIHR5cGUxLCBDbGFzcyB0eXBlMikgewotCQlpZiAodHlwZTEgPT0gdHlwZTIpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gVGhleSdyZSB0aGUgc2FtZSwgc28gYXNzaWduYWJsZS4KLQkJaWYgKHR5cGUxLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmICh0eXBlMi5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJaWYgKHR5cGUxID09IEJvb2xlYW4uVFlQRSB8fCB0eXBlMiA9PSBCb29sZWFuLlRZUEUpCi0JCQkJCXJldHVybiBmYWxzZTsJLy8gU2luY2Ugbm90IGVxdWFsIGFuZCBvbmUgaXMgYm9vbGVhbiBhbmQgdGhlIG90aGVyIGlzbid0LCBub3QgYXNzaWduYWJsZQotCQkJCWludCB0eXBlMVBvcyA9ICh0eXBlMSAhPSBDaGFyYWN0ZXIuVFlQRSkgPyBzUHJpbWl0aXZlc09yZGVyLmluZGV4T2YodHlwZTEpIDogc0NoYXJQb3M7Ci0JCQkJaW50IHR5cGUyUG9zID0gKHR5cGUyICE9IENoYXJhY3Rlci5UWVBFKSA/IHNQcmltaXRpdmVzT3JkZXIuaW5kZXhPZih0eXBlMikgOiBzQ2hhclBvczsKLQkJCQlyZXR1cm4gdHlwZTFQb3MgPiB0eXBlMlBvczsJLy8gSXQgY2FuIGJlIHdpZGVuZWQgaWYgdHlwZTEgaXMgaGlnaGVyIGluIHRoZSBvcmRlcgotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwkvLyBwcmltaXRpdmUgdG8gbm9uLXByaW1pdGl2ZSwgbm90IGFzc2lnbmFibGUuCi0JCX0gZWxzZQotCQkJaWYgKHR5cGUyID09IE5VTExfVFlQRSkKLQkJCQlyZXR1cm4gdHJ1ZTsJLy8gTlVMTF9UWVBFIHJlcHJlc2VudHMgbnVsbCBmb3IgdXMsIGFuZCBudWxsIGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgb2JqZWN0Ci0JCQllbHNlCQkKLQkJCQlyZXR1cm4gdHlwZTEuaXNBc3NpZ25hYmxlRnJvbSh0eXBlMik7CS8vIENhbiB0eXBlMiBiZSBhc3NpZ25lZCB0byB0eXBlMQotCX0KLQkKLQkKLQkvKioKLQkgKiBFdmVyeSBlbnRyeSBpbiBBcnJheTIgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIEFycmF5MS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShDbGFzc1tdIHR5cGVzMSwgQ2xhc3NbXSB0eXBlczIpIHsKLQkJaWYgKHR5cGVzMS5sZW5ndGggIT0gdHlwZXMyLmxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsJLy8gTm90IHRoZSBzYW1lIHNpemUsIHNvIG5vdCBjb21wYXRpYmxlLgotCQlmb3IgKGludCBpPTA7IGk8dHlwZXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWlzQXNzaWduYWJsZUZyb20odHlwZXMxW2ldLCB0eXBlczJbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsJLy8gQWxsIGFyZSBhc3NpZ25hYmxlCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1vc3QgY29tcGF0aWJsZSBtZXRob2QvY29uc3RydWN0b3IgZnJvbSB0aGUgbGlzdHMgcGFzc2VkIGluLgotCSAqIE1ldGhvZHNMaXN0OiBMaXN0IG9mIG1ldGhvZHMgKGlmIG51bGwgdGhlbiB0aGlzIGlzIGZvciBjb25zdHJ1Y3RvcnMpCi0JICogUGFybXNMaXN0OiBMaXN0IG9mIHBhcm1zIGZvciBlYWNoIG1ldGhvZCAoZWFjaCBlbnRyeSB3aWxsIGJlIENsYXNzW10pLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBmaW5kTW9zdENvbXBhdGlibGUoTGlzdCBtZXRob2RzLCBMaXN0IHBhcm1zLCBTdHJpbmcgYW1iaWd1b3VzTmFtZSkgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBhbGdvcml0aG0gdXNlZCBpcyBmcm9tIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gMTUuMTIuMi4yCi0JCS8vIEZpbmQgdGhlIG1heGltYWxseSBzcGVjaWZpYyBvbmVzCi0JCS8vIFRoaXMgaXMgZGVmaW5lZCBhcyB0aGUgb25lIHRoYXQgaXMgbW9yZSBzcGVjaWZpYyB0aGVuIGFsbCBvZiB0aGUgcmVzdC4KLQkJLy8gSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgcGFybXMgdGhhdCBhcmUgbWF4aW1hbGx5IHNwZWNpZmljLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGNob29zZW4KLQkJLy8gYmVjYXVzZSB3aGVuIGludm9rZWQgdGhlIEpWTSB3aWxsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgdGhpbmcgaXMgZG9uZS4KLQkJLy8gCi0JCUNsYXNzW11bXSBwYXJtc0NvcHkgPSAoQ2xhc3NbXVtdKSBwYXJtcy50b0FycmF5KG5ldyBDbGFzc1twYXJtcy5zaXplKCldW10pOwotCQlpbnQgc2l6ZSA9IHBhcm1zQ29weS5sZW5ndGg7Ci0JCS8vIEZvciBlYWNoIGVudHJ5IHNlZSBpZiBpdCBpcyBtYXhpbWFsbHkgc3BlY2lmaWMsIGkuZS4gaXQgaXMgbW9yZSBzcGVjaWZpYyB0aGVuIGFsbCBvZiB0aGUgb3RoZXJzLgotbmV4dE1ldGhvZDoJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotCQkJLy8gRm9yIGN0b3JzIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGUgZGVjbGFyaW5nIGNsYXNzIGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgY2xhc3MuCi0JCQlDbGFzcyBkY2xDbGFzc2kgPSBtZXRob2RzICE9IG51bGwgPyAoKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSkpLmdldERlY2xhcmluZ0NsYXNzKCkgOiBudWxsOwotCQkJQ2xhc3NbXSBwYXJtc2kgPSBwYXJtc0NvcHlbaV07Ci0JCQlmb3IgKGludCBqPTA7IGo8c2l6ZTsgaisrKSB7Ci0JCQkJaWYgKGkgPT0gaikKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gTWV0aG9kaSBpcyBtb3JlIHNwZWNpZmljIGlmCi0JCQkJLy8gICBhKSBNZXRob2RpIGRlY2xhcmluZyBjbGFzcyBpcyBhc3NpZ25hYmxlIHRvIE1ldGhvZGogZGVjbGFyaW5nIGNsYXNzCi0JCQkJLy8gICBiKSBNZXRob2RpIHBhcm1zIGFyZSBhc3NpZ25hYmxlIHRvIE1ldGhvZGogcGFybXMKLQkJCQkvLwotCQkJCS8vIEZpcnN0IHNlZSBpZiBNZXRob2RpIGlzIG1vcmUgc3BlY2lmaWMsIGlmIGl0IGlzCi0JCQkJLy8gdGhlbiB0aHJvdyBvdXQgTWV0aG9kaiBhbmQgY29udGludWUKLQkJCQkvLyBJZiBNZXRob2RpIGlzIG5vdCBjb21wYXRpYmxlIHRvIE1ldGhvZGosIGdvIHRvIHRoZSBuZXh0IG1ldGhvZCBmb3IgaS4gTWV0aG9kaSBpcyBub3QgdGhlIG1vc3Qgc3BlY2lmaWMKLQkJCQkvLyBTb21ldGhpbmcgZWxzZSBpcyBlaXRoZXIgbW9yZSBzcGVjaWZpYyBvciBub25lIGFyZSBtYQotCQkJCWlmIChkY2xDbGFzc2kgIT0gbnVsbCkgewotCQkJCQkvLyBTdGVwIGEKLQkJCQkJaWYgKCFpc0Fzc2lnbmFibGVGcm9tKCgoTWV0aG9kKSBtZXRob2RzLmdldChqKSkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgZGNsQ2xhc3NpKSkKLQkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CS8vIE1ldGhvZGkgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiBNZXRob2RqLCBzbyB0cnkgbmV4dCBpLgotCQkJCX0KLQkJCQkKLQkJCQkvLyBTdGVwIGIKLQkJCQlDbGFzc1tdIHBhcm1zaiA9IHBhcm1zQ29weVtqXTsKLQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20ocGFybXNqLCBwYXJtc2kpKSB7Ci0JCQkJCS8vIE1ldGhvZGkgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiBNZXRob2RqLCBzbyBnbyB0byBuZXh0IGkuCi0JCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGk7CS8vIE1ldGhvZGkgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIGFsbCBvZiB0aGUgb3RoZXIgb25lcy4KLQkJfQotCi0JCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oYW1iaWd1b3VzTmFtZSk7CS8vIFRoZXJlIHdhcyBub3Qgb25lIG1vcmUgc3BlY2lmaWMgdGhhbiBhbGwgb2YgdGhlIG90aGVycy4KLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIG1ldGhvZCBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBmaW5kQ29tcGF0aWJsZU1ldGhvZChDbGFzcyByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIHJlY2VpdmVyLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpOwkvLyBGb3VuZCBleGFjdCBtYXRjaCBpbiBwdWJsaWMKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byBmaW5kIG1vc3QgY29tcGF0aWJsZSBvbmUuIFdlIHdpbGwgdGFrZSBwcm90ZWN0ZWQgaW50byBjb25zaWRlcmF0aW9uIChpLmUuIGluaGVyaXRhbmNlKS4KLQkJCQlBcnJheUxpc3QgcGFybXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAvLyBUaGUgcGFybSBsaXN0IGZyb20gZWFjaCBjb21wYXRpYmxlIG1ldGhvZC4KLQkJCQlBcnJheUxpc3QgbXRoZHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAvLyBUaGUgbGlzdCBvZiBjb21wYXRpYmxlIG1ldGhvZHMsIHNhbWUgb3JkZXIgYXMgdGhlIHBhcm1zIGFib3ZlLgotCQkJCUNsYXNzIGNscyA9IHJlY2VpdmVyOwotCQkJCXdoaWxlIChjbHMgIT0gbnVsbCkgewotCQkJCQlNZXRob2QgbXRoZHNbXSA9IGNscy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtdGhkcy5sZW5ndGg7IGkrKykgewotCQkJCQkJTWV0aG9kIG10aGQgPSBtdGhkc1tpXTsKLQkJCQkJCWlmICghbXRoZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKQotCQkJCQkJCWNvbnRpbnVlOyAvLyBOb3QgY29tcGF0aWJsZSwgbm90IHNhbWUgbmFtZQotCQkJCQkJaW50IG1vZGlmaWVycyA9IG10aGQuZ2V0TW9kaWZpZXJzKCk7Ci0JCQkJCQlpZiAoIShNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpIHx8IE1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpKQotCQkJCQkJCWNvbnRpbnVlOwkgLy8gV2lsbCBub3QgY2FsbCBwcml2YXRlIG9yIHBhY2thZ2UtcHJvdGVjdGVkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGV4dC4KLQkJCQkJCUNsYXNzW10gcGFybXMgPSBtdGhkLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCQkvLyBJZiBleGFjdCBtYXRjaCB3ZSBmb3VuZCBhIG5vbi1wdWJsaWMgZXhhY3QgbWF0Y2gsIHdoaWNoIGlzIGdvb2QuCi0JCQkJCQlpZiAoQXJyYXlzLmVxdWFscyhhcmd1bWVudHMsIHBhcm1zKSkKLQkJCQkJCQlyZXR1cm4gbWFrZU1ldGhvZEFjY2Vzc2FibGUobXRoZCk7Ci0JCQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20ocGFybXMsIGFyZ3VtZW50cykpCi0JCQkJCQkJY29udGludWU7IC8vIE5vdCBjb21wYXRpYmxlLCBwYXJtcwotCQkJCQkJLy8gSXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIC0gbm93IHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gZXhhY3QgbWF0Y2ggZnJvbSBhIHN1YmNsYXNzLiBEb24ndCB3YW50IHRvIGFkZCBpdCB0d2ljZS4KLQkJCQkJCS8vIFdlIGFyZSBhc3N1bWluZyB0aGUgYWN0dWFsIG51bWJlciBvZiBjb21wYXRpYmxlIG1ldGhvZHMgaXMgc21hbGwsIHNvIHRoaXMgTyhuLXNxdWFyZWQpIHNlYXJjaCBpcyBlZmZpY2llbnQgZW5vdWdoLgotCQkJCQkJaW50IHNpemUgPSBwYXJtc0xpc3Quc2l6ZSgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCQlpZiAoQXJyYXlzLmVxdWFscyhwYXJtcywgKE9iamVjdFtdKSBwYXJtc0xpc3QuZ2V0KGopKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJtc0xpc3QuYWRkKHBhcm1zKTsKLQkJCQkJCW10aGRzTGlzdC5hZGQobXRoZCk7Ci0JCQkJCX0KLQkJCQkJY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLQkJCQl9CQkJCQotCQkJCS8vIE5vdyBoYXZlIGxpc3Qgb2YgY29tcGF0aWJsZSBtZXRob2RzLgotCQkJCWlmIChwYXJtc0xpc3Quc2l6ZSgpID09IDApCi0JCQkJCXRocm93IHRocm93Rml4ZWROb1N1Y2hNZXRob2QoZXhjLCByZWNlaXZlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsgLy8gTm9uZSBmb3VuZCwgc28gcmV0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCQkJaWYgKHBhcm1zTGlzdC5zaXplKCkgPT0gMSkKLQkJCQkJcmV0dXJuIG1ha2VNZXRob2RBY2Nlc3NhYmxlKChNZXRob2QpIG10aGRzTGlzdC5nZXQoMCkpOyAvLyBPbmx5IG9uZSwgc28gcmV0dXJuIGl0Ci0KLQkJCQkvLyBOb3cgZmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIG1ldGhvZAotCQkJCWludCBtb3N0Q29tcGF0aWJsZSA9IGZpbmRNb3N0Q29tcGF0aWJsZShtdGhkc0xpc3QsIHBhcm1zTGlzdCwgbWV0aG9kTmFtZSk7Ci0JCQkJcmV0dXJuIG1ha2VNZXRob2RBY2Nlc3NhYmxlKChNZXRob2QpIG10aGRzTGlzdC5nZXQobW9zdENvbXBhdGlibGUpKTsKLQkJCX0gZWxzZQotCQkJCXRocm93IHRocm93Rml4ZWROb1N1Y2hNZXRob2QoZXhjLCByZWNlaXZlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsgLy8gTm9uZSBmb3VuZCwgc28gcmV0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIG1ha2VNZXRob2RBY2Nlc3NhYmxlKE1ldGhvZCBtKSB7Ci0JCW0uc2V0QWNjZXNzaWJsZSh0cnVlKTsJLy8gV2UgYWxsb3cgYWxsIGFjY2VzcywgbGV0IGlkZSBhbmQgY29tcGlsZXIgaGFuZGxlIHNlY3VyaXR5LgotCQlyZXR1cm4gbTsKLQl9Ci0JCi0JLyoKLQkgKiBOb1N1Y2hNRXRob2RFeGVjZXB0aW9uIGRvZXNuJ3QgaW5jbHVkZSB0aGUgc2lnbmF0dXJlLiBTaW5jZSB0aGVzZSBhcmUgZHluYW1pYyBzZWFyY2hlcywgdGhlIGV4Y2VwdGlvbiBpdHNlbGYgaXMgdXNlbGVzcyB3aXRob3V0Ci0JICogdGhlIHNpZ25hdHVyZS4gU28gd2UgYWRkIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB0aHJvd0ZpeGVkTm9TdWNoTWV0aG9kKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlLCBDbGFzcyBkZWNsYXJlQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ0NsYXNzZXMpIHsKLQotCQkvLyBUaGUgZGVmYXVsdCB0cmFjZSBkb2Vzbid0IHNob3cgd2hhdCBtZXRob2Qgd2FzIGJlaW5nIHNlYXJjaGVkIGZvciwgc28gcmVjcmVhdGUgd2l0aCB0aGF0LgotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcy5hcHBlbmQoZGVjbGFyZUNsYXNzLmdldE5hbWUoKSk7Ci0JCXMuYXBwZW5kKCcuJyk7Ci0JCXMuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlzLmFwcGVuZCgnKCcpOwotCQlpZiAoYXJnQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXMuYXBwZW5kKCcsJyk7Ci0JCQkJcy5hcHBlbmQoYXJnQ2xhc3Nlc1tpXS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXMuYXBwZW5kKCcpJyk7Ci0JCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuZSA9IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24ocy50b1N0cmluZygpKTsKLQkJbmUuc2V0U3RhY2tUcmFjZShlLmdldFN0YWNrVHJhY2UoKSk7Ci0JCXJldHVybiBuZTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBGaW5kIHRoZSBtb3N0IGNvbXBhdGlibGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0JICogQHBhcmFtIHJlY2VpdmVyIGNsYXNzIHRvIGdldCB0aGUgY29uc3RydWN0b3IgZm9yCi0JICogQHBhcmFtIGFyZ3VtZW50cyBhcnJheSBvZiBhcmd1bWVudCB0eXBlcwotCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yCi0JICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm8gY29tcGF0aWJsZSBjb25zdHJ1Y3RvciBjYW4gYmUgZm91bmQKLQkgKiBAdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbXBhdGlibGUgY29uc3RydWN0b3IKLQkgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaXQgY2FuJ3QgYmUgYWNjZXNzZWQuIFN1Y2ggYXMgaXQgaXMgYSBub24tc3RhdGljIGlubmVyIGNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcihDbGFzcyByZWNlaXZlciwgQ2xhc3NbXSBhcmd1bWVudHMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCWlmIChyZWNlaXZlci5nZXREZWNsYXJpbmdDbGFzcygpICE9IG51bGwgJiYgIU1vZGlmaWVyLmlzU3RhdGljKHJlY2VpdmVyLmdldE1vZGlmaWVycygpKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzLmdldFN0cmluZygiTWV0aG9kSGVscGVyLk5PTlNUQVRJQ0lOTkVSQ0xBU1NfV0FSTklORyIpLCBuZXcgT2JqZWN0W10ge3JlY2VpdmVyLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvciA9IHJlY2VpdmVyLmdldERlY2xhcmVkQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKLQkJCWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsJLy8gV2UgYWxsb3cgYWxsIGFjY2VzcywgbGV0IGlkZSBhbmQgY29tcGlsZXIgaGFuZGxlIHNlY3VyaXR5LgotCQkJcmV0dXJuIGN0b3I7CS8vIEZvdW5kIGV4YWN0IG1hdGNoCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCS8vIE5lZWQgdG8gZmluZCBtb3N0IGNvbXBhdGlibGUgb25lLgotCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3JzW10gPSByZWNlaXZlci5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQkJCUFycmF5TGlzdCBwYXJtc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGN0b3JzLmxlbmd0aCk7IC8vIFRoZSBwYXJtIGxpc3QgZnJvbSBlYWNoIGNvbXBhdGlibGUgbWV0aG9kLgotCQkJCUFycmF5TGlzdCBjdG9yc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGN0b3JzLmxlbmd0aCk7IC8vIFRoZSBsaXN0IG9mIGNvbXBhdGlibGUgbWV0aG9kcywgc2FtZSBvcmRlciBhcyB0aGUgcGFybXMgYWJvdmUuCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yID0gY3RvcnNbaV07Ci0JCQkJCUNsYXNzW10gcGFybXMgPSBjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCWlmICghaXNBc3NpZ25hYmxlRnJvbShwYXJtcywgYXJndW1lbnRzKSkKLQkJCQkJCWNvbnRpbnVlOyAvLyBOb3QgY29tcGF0aWJsZSwgcGFybXMKLQkJCQkJLy8gSXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgbWV0aG9kCi0JCQkJCXBhcm1zTGlzdC5hZGQocGFybXMpOwotCQkJCQljdG9yc0xpc3QuYWRkKGN0b3IpOwotCQkJCX0KLQotCQkJCS8vIE5vdyBoYXZlIGxpc3Qgb2YgY29tcGF0aWJsZSBtZXRob2RzLgotCQkJCWlmIChwYXJtc0xpc3Quc2l6ZSgpID09IDApCi0JCQkJCXRocm93IGV4YzsgLy8gTm9uZSBmb3VuZCwgc28gcmV0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCQkJaWYgKHBhcm1zTGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yID0gKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBjdG9yc0xpc3QuZ2V0KDApOyAvLyBPbmx5IG9uZSwgc28gcmV0dXJuIGl0Ci0JCQkJCWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsgLy8gV2UgYWxsb3cgYWxsIGFjY2VzcywgbGV0IGlkZSBhbmQgY29tcGlsb3IgaGFuZGxlIHNlY3VyaXR5LgotCQkJCQlyZXR1cm4gY3RvcjsKLQkJCQl9Ci0KLQkJCQkvLyBOb3cgZmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIGN0b3IKLQkJCQlpbnQgbW9zdENvbXBhdGlibGUgPSBmaW5kTW9zdENvbXBhdGlibGUobnVsbCwgcGFybXNMaXN0LCByZWNlaXZlci5nZXROYW1lKCkpOwotCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3IgPSAoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGN0b3JzTGlzdC5nZXQobW9zdENvbXBhdGlibGUpOwotCQkJCWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsgLy8gV2UgYWxsb3cgYWxsIGFjY2VzcywgbGV0IGlkZSBhbmQgY29tcGlsb3IgaGFuZGxlIHNlY3VyaXR5LgotCQkJCXJldHVybiBjdG9yOwotCQkJfSBlbHNlCi0JCQkJdGhyb3cgZXhjOyAvLyBOb25lIGZvdW5kLCBzbyByZXRocm93IHRoZSBleGNlcHRpb24KLQkJfQotCX0JCi0JCQkJCi0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9VbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9VbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODdkZDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGUkCi0gKiAgJFJldmlzaW9uJCAgJERhdGUkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0gCi0vKioKLSAqIFVzZWQgYnkgdGhlIHRoZSByZWdpc3RyaWVzIHRvIGluZGljYXRlICJVbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvciIuIFRoaXMgaXMgYmVjYXVzZSB0aGUKLSAqIG5vcm1hbCBqYXZhIHRocm93cyBqdXN0IGFuIEVycm9yIHdpdGggYSBtZXNzYWdlLiBUbyBtYWtlIGl0IGVhc2llciBpbiBwcm9jZXNzaW5nLCBpdCB3aWxsCi0gKiBiZSB0dXJuZWQgaW50byB0aGlzIGVycm9yIGluc3RlYWQgc28gdGhhdCBpdCBjYW4gYmUgZXhwbGljaXRseSBjYXVnaHQuCi0gKiA8cD4KLSAqIFRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgaW4gY2VydGFpbiBleHBsaWNpdCBwYXJ0cyBvZiB0aGUgY29kZS4gSXQgd2lsbCBiZSBkZXRhaWxlZCB3aGVyZQotICogaXQgY2FuIGJlIHRocm93bi4KLSAqIAotICogQHNpbmNlIDEuMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIFVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc3Nzg4NDIyMTEwNzM1OTI3OTBMOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCBmcm9tIGFuIEVycm9yLgotCSAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgdGhhdCBpcyB0aGUgYWN0dWFsIG9uZS4gPGI+VGhpcyB3aWxsIG5vdCBiZSB0aGUgY2F1c2UsIHRoZSBtZXNzYWdlIGFuZCBzdGFja3RyYWNlIHdpbGwgYmUgY29waWVkIGludG8gdGhpcyBuZXcgZXJyb3IuPC9iPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIFVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yKEVycm9yIGVycm9yKSB7Ci0JCXN1cGVyKGVycm9yLmdldE1lc3NhZ2UoKSk7Ci0JCXNldFN0YWNrVHJhY2UoZXJyb3IuZ2V0U3RhY2tUcmFjZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3ZWVhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTWV0aG9kSGVscGVyLk5PTlNUQVRJQ0lOTkVSQ0xBU1NfV0FSTklORz1DbGFzcyB7MH0gaXMgYSBub24tc3RhdGljIGlubmVyIGNsYXNzLiBUaGVzZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGF0IHRoaXMgdGltZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvQmVhblByb3h5VmFsdWVTZW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvQmVhblByb3h5VmFsdWVTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2NTAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0JlYW5Qcm94eVZhbHVlU2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuVGhyb3dhYmxlUHJveHk7Ci0gCi0vKioKLSAqIFVzZWZ1bCBpbiBSRU0gdG8gZ2V0IHRoZSBhcnJheSBvZiBCZWFuUHJveHlWYWx1ZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhblByb3h5VmFsdWVTZW5kZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVNlbmRlciB7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IDA7Ci0JcHJvdGVjdGVkIE9iamVjdFtdIGFycmF5OwotCXByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQlwcml2YXRlIGZpbmFsIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5OwotCQotCS8qKgotCSAqIFNlZSBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIHRocm93biBkdXJpbmcgcmVhZGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBleGNlcHRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBleGNlcHRpb247Ci0JfQotCQkKLQlwdWJsaWMgQmVhblByb3h5VmFsdWVTZW5kZXIoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0JcHVibGljIEJlYW5Qcm94eVZhbHVlU2VuZGVyKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5LCBDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQl0aGlzKGZhY3RvcnkpOwotCQlpbml0aWFsaXplKGFycmF5SGVhZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQlpbmRleCA9IDA7Ci0JCS8vIFRoZSBhcnJheSB0eXBlIGRvZXNuJ3QgbWF0dGVyLCBpdCB3aWxsIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuCi0JCS8vIFRoZSB2YWx1ZXMgd2lsbCBlaXRoZXIgYmUgSUJlYW5Qcm94aWVzIG9yIGFuIGFycmF5LCBvciBjb25zdGFudHMuCi0JCWFycmF5ID0gbmV3IE9iamVjdFthcnJheUhlYWRlci5hbkludF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhcnJheSA9IG51bGw7Ci0JCWluZGV4ID0gMDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEFycmF5KCkgewotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCQkJCQotCS8vIEEgbmV3IHZhbHVlIGlzIGJlaW5nIHNlbnQgdG8gdGhlIGFycmF5Ci0JLy8gTk9URTogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBoYXMgYmVlbiBjYWxsZWQgd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JcHVibGljIHZvaWQgc2VuZFZhbHVlKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhcnJheVtpbmRleCsrXSA9IGZhY3RvcnkuZ2V0QmVhblByb3h5KHZhbHVlKTsJLy8gQWRkIGl0IHRvIHRoZSBhcnJheQotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBXZSBjYW4ndCBzdG9wIGl0IHJpZ2h0IGF3YXkgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGV4Y2VwdGlvbiBvbiwgaG93ZXZlciwKLQkJCS8vIHdlIGNhbiBsb2cgaXQgYW5kIHNhdmUgdGhlIGV4Y2VwdGlvbi4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlleGNlcHRpb24gPSBlOwkJCQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbid0IHN0b3AgaXQgcmlnaHQgYXdheSBiZWNhdXNlIHdlIGNhbid0IHNlbmQgZXhjZXB0aW9uIG9uLCBob3dldmVyLAotCQkJLy8gd2UgY2FuIGxvZyBpdCBhbmQgc2F2ZSB0aGUgZXhjZXB0aW9uLgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQl9Ci0JCQkJCi0JLy8gVGhlIG5leHQgZW50cnkgaXMgYW4gYXJyYXkgdG9vIQotCXB1YmxpYyBDb21tYW5kcy5WYWx1ZVNlbmRlciBuZXN0ZWRBcnJheShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQlCZWFuUHJveHlWYWx1ZVNlbmRlciBzZW5kZXIgPSBuZXcgQmVhblByb3h5VmFsdWVTZW5kZXIoZmFjdG9yeSwgYXJyYXlIZWFkZXIpOwotCQkvLyBUYWtlIHRoZSBuZXdseSBjcmVhdGVkIGFycmF5IGFuZCBwdXQgaXQgaW50byB0aGUgY3VycmVudCBhcnJheS4KLQkJYXJyYXlbaW5kZXgrK10gPSBzZW5kZXIuZ2V0QXJyYXkoKTsKLQkJcmV0dXJuIHNlbmRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9EZWJ1Z01vZGVIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvRGVidWdNb2RlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWI2NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9EZWJ1Z01vZGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLS8qKgotICogVGhpcyBpcyBhIGhlbHBlciBmb3IgZGVidWcgbW9kZS4gSXQgYWxsb3dzIGFjY2VzcyB0bwotICogdGhlIHdvcmtiZW5jaCwgaWYgYXZhaWxhYmxlLCBvciBBV1QsIGlmIGF2YWlsYWJsZSwgZm9yCi0gKiB0aGUgZGVidWcgcHJvbXB0cy4gSXQgdXNlcyByZWZsZWN0aW9uIHNvIHRoYXQgbm90aGluZyBpcwotICogZm9yY2VkIHRvIGJlIGxvYWRlZCBvciBwcmUtcmVxZC4gVGhhdCB3YXkgaXQgY2FuIHJ1biBoZWFkbGVzcy4KLSAqLwotCi1jbGFzcyBEZWJ1Z01vZGVIZWxwZXIgewotCWJvb2xlYW4gYXd0ID0gZmFsc2U7Ci0JYm9vbGVhbiBjb25zb2xlID0gZmFsc2U7Ci0JYm9vbGVhbiBzZXR1cCA9IGZhbHNlOwotCWphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIgaW5SZWFkZXIgPSBudWxsOwotCQotCS8vIFdvcmtiZW5jaCByZWZsZWN0aW9ucwotCU9iamVjdCBkaXNwbGF5ID0gbnVsbDsJCi0JQ29uc3RydWN0b3IgY01CID0gbnVsbDsKLQlGaWVsZCBmUHJpbWFyeU1vZGVsID0gbnVsbDsKLQlNZXRob2QgZmFzeW5jID0gbnVsbDsKLQlNZXRob2QgZnN5bmMgPSBudWxsOwkKLQlNZXRob2QgZlNldFRleHQgPSBudWxsOwotCU1ldGhvZCBmU2V0TWVzc2FnZSA9IG51bGw7Ci0JTWV0aG9kIGZPcGVuID0gbnVsbDsKLQlNZXRob2QgZkdldFdvcmtiZW5jaCA9IG51bGw7Ci0JQ2xhc3MgY1NXVCA9IG51bGw7Ci0JCQotCQotCS8vIEFXVCBSZWZsZWN0aW9ucwotCUNsYXNzIGNNZXNzYWdlRGlhbG9nID0gbnVsbDsKLQlNZXRob2QgZkRvaXQgPSBudWxsOwotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwVHlwZSgpIHsKLQkJaWYgKHNldHVwKQotCQkJcmV0dXJuOwotCQkJCi0JCXNldHVwID0gdHJ1ZTsKLQkJCi0JCS8vIFNlZSBpZiB1c2Ugc3lzdGVtIGNvbnNvbGUgaW5zdGVhZC4gSWYgZmFsc2Ugb3Igbm90IHNldCwgdGhlbiB0cnkgdG8gcXVlcnkgdXNhZ2UuCSAJCQotCSAJY29uc29sZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpK1Byb3h5UmVtb3RlVXRpbC5JT19DT05TT0xFKSk7IC8vJE5PTi1OTFMtMSQKLQkgCWlmIChjb25zb2xlKQotCSAJCXJldHVybjsKLQkJCi0JCXRyeSB7CQkgCQkKLQkJIAkvLyBTZWUgaWYgUGxhdGZvcm1VSSBwbHVnaW4gYXZhaWxhYmxlLgotCQkgCUJ1bmRsZSB1aUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkiKTsgLy8kTk9OLU5MUy0xJAotCQkgCWlmICh1aUJ1bmRsZSA9PSBudWxsKSB7Ci0JCSAJCXNldHVwQVdUKCk7CS8vIFVJIG5vdCBhdmFpbGFibGUsIHRyeSB0aHJvdWdoIEFXVC4KLQkJIAkJcmV0dXJuOwotCQkgCX0KLQkKLQkgCQkvLyBTZXR1cCBFY2xpcHNlCi0JCSAJQ2xhc3MgY1BsYXRmb3JtVUkgPSB1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUkiKTsgLy8kTk9OLU5MUy0xJAotCQkgCU1ldGhvZCBpc1dCUnVubmluZyA9IGNQbGF0Zm9ybVVJLmdldE1ldGhvZCgiaXNXb3JrYmVuY2hSdW5uaW5nIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJIAlpZiAoISgoQm9vbGVhbikgaXNXQlJ1bm5pbmcuaW52b2tlKG51bGwsIG51bGwpKS5ib29sZWFuVmFsdWUoKSkgewotCQkgCQlzZXR1cEFXVCgpOwkvLyBVSSBub3QgYXZhaWxhYmxlLCB0cnkgdGhyb3VnaCBBV1QuCi0JCSAJCXJldHVybjsKLQkJIAl9Ci0JCSAJCi0JCSAJZkdldFdvcmtiZW5jaCA9IGNQbGF0Zm9ybVVJLmdldE1ldGhvZCgiZ2V0V29ya2JlbmNoIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJIAlPYmplY3QgdyA9IGZHZXRXb3JrYmVuY2guaW52b2tlKG51bGwsIG51bGwpOwotCi0JCQlpZiAodyAhPSBudWxsKSB7Ci0JIAkJCUNsYXNzIGNEaXNwbGF5ID0gdWlCdW5kbGUubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Iik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJTWV0aG9kIGZHZXRDdXJyZW50ID0gY0Rpc3BsYXkuZ2V0TWV0aG9kKCJnZXRDdXJyZW50IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgCQkJTWV0aG9kIGZHZXREZWZhdWx0ID0gY0Rpc3BsYXkuZ2V0TWV0aG9kKCJnZXREZWZhdWx0IiwgbnVsbCk7CSAJCQkgLy8kTk9OLU5MUy0xJAotCSAJCQlmYXN5bmMgPSBjRGlzcGxheS5nZXRNZXRob2QoImFzeW5jRXhlYyIsIG5ldyBDbGFzc1tdIHtSdW5uYWJsZS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JIAkJCWZzeW5jID0gY0Rpc3BsYXkuZ2V0TWV0aG9kKCJzeW5jRXhlYyIsIG5ldyBDbGFzc1tdIHtSdW5uYWJsZS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JIAkJCQotCSAJCQkvLyBHZXQgdGhlIGRpc3BsYXkKLQkgCQkJZGlzcGxheSA9IGZHZXRDdXJyZW50Lmludm9rZShudWxsLCBudWxsKTsKLQkgCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkgCQkJCWRpc3BsYXkgPSBmR2V0RGVmYXVsdC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChkaXNwbGF5ICE9IG51bGwpIHsgCQotCSAJCQlDbGFzcyBjU2hlbGwgPSB1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJQ2xhc3MgY01lc3NhZ2VCb3ggPSB1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3giKTsgLy8kTk9OLU5MUy0xJAotCSAJCQljTUIgPSBjTWVzc2FnZUJveC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7Y1NoZWxsLCBJbnRlZ2VyLlRZUEV9KTsKLQotCQkJCWZTZXRUZXh0ID0gY01lc3NhZ2VCb3guZ2V0TWV0aG9kKCJzZXRUZXh0IiwgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkJZlNldE1lc3NhZ2UgPSBjTWVzc2FnZUJveC5nZXRNZXRob2QoInNldE1lc3NhZ2UiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCQkJZk9wZW4gPSBjTWVzc2FnZUJveC5nZXRNZXRob2QoIm9wZW4iLCBudWxsKTsJCSAJCSAvLyROT04tTkxTLTEkCQkJCQotCQkgCQkJCi0JIAkJCWNTV1QgPSB1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC5TV1QiKTsgLy8kTk9OLU5MUy0xJAotCSAJCQlmUHJpbWFyeU1vZGVsID0gY1NXVC5nZXRGaWVsZCgiUFJJTUFSWV9NT0RBTCIpOyAvLyROT04tTkxTLTEkCi0JCSAJfSBlbHNlIHsKLQkJIAkJc2V0dXBBV1QoKTsJLy8gVUkgbm90IGF2YWlsYWJsZSwgdHJ5IHRocm91Z2ggQVdULgotCQkgCX0KLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlyZXR1cm47CQkgCQkJIAkJCi0JCSAJCQkKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBBV1QoKSB7Ci0JIAkJCi0JIAkvLyBTZWUgaWYgQVdUIGlzIGF2YWlsYWJsZS4KLQkgCXRyeSB7Ci0JCSAJY01lc3NhZ2VEaWFsb2cgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLk1lc3NhZ2VEaWFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQkgCWZEb2l0ID0gY01lc3NhZ2VEaWFsb2cuZ2V0TWV0aG9kKCJkb2l0IiwgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCSAJYXd0ID0gdHJ1ZTsKLQkJIAlyZXR1cm47Ci0JIAl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkgCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JIAl9Ci0gCQljb25zb2xlID0gdHJ1ZTsJLy8gTm8gQVdUIGVpdGhlciwgaS5lLiB0cnVlIGhlYWRsZXNzIGVudmlyb25tZW50Ci0JfSAJCi0JCi0JcHVibGljIGJvb2xlYW4gZGVidWdNb2RlKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JIAlib29sZWFuIGRlYnVnTW9kZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpK1Byb3h5UmVtb3RlVXRpbC5ERUJVR19WTSkpOyAvLyROT04tTkxTLTEkCi0JIAlpZiAoIWRlYnVnTW9kZSkKLQkgCQlyZXR1cm4gZGVidWdNb2RlOwotCSAJCQotCSAJc2V0dXBUeXBlKCk7Ci0KLQkJLy8gU2VlIGlmIHVzZSBzeXN0ZW0gY29uc29sZSBpbnN0ZWFkLiBJZiBmYWxzZSBvciBub3Qgc2V0LCB0aGVuIHRyeSB0byBxdWVyeSB1c2FnZS4JIAkJCi0JIAlpZiAoY29uc29sZSkKLQkgCQlyZXR1cm4gZGVidWdNb2RlQ29uc29sZShuYW1lKTsKLQkgCQkKLQkgCWlmIChhd3QpCi0JIAkJcmV0dXJuIGRlYnVnTW9kZUFXVChuYW1lKTsKLQkJCi0JCXRyeSB7CQkgCQkKLSAJCQlmaW5hbCBGaWVsZCBmWWVzID0gY1NXVC5nZXRGaWVsZCgiWUVTIik7IC8vJE5PTi1OTFMtMSQKLSAJCQlGaWVsZCBmTm8gPSBjU1dULmdldEZpZWxkKCJOTyIpOyAvLyROT04tTkxTLTEkCi0gCQkJRmllbGQgZkljb24gPSBjU1dULmdldEZpZWxkKCJJQ09OX1FVRVNUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJCi0gCQkJZmluYWwgaW50IHN0eWxlID0gZlllcy5nZXRJbnQobnVsbCkgfCBmTm8uZ2V0SW50KG51bGwpIHwgZkljb24uZ2V0SW50KG51bGwpIHwgZlByaW1hcnlNb2RlbC5nZXRJbnQobnVsbCk7CSAJCQkKLSAJCQlmaW5hbCBib29sZWFuW10gZGIgPSBuZXcgYm9vbGVhblsxXTsKLQotCQkJZnN5bmMuaW52b2tlKGRpc3BsYXksIG5ldyBPYmplY3RbXSB7IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBzaGVsbCA9IGdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQlPYmplY3QgbWIgPSBjTUIubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtzaGVsbCwgbmV3IEludGVnZXIoc3R5bGUpfSk7CQkJCQkKLQkJCQkJCWZTZXRUZXh0Lmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiRGVidWcgUmVtb3RlVk0/In0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmU2V0TWVzc2FnZS5pbnZva2UobWIsIG5ldyBPYmplY3RbXSB7IkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyJ9KTsJLy8gTm90IE5MUydkIGJlY2F1c2UgdGhpcyBpcyBmb3IgaW50ZXJuYWwgZGV2ZWxvcGVycyBvbmx5IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQotCQkJCQkJZGJbMF0gPSBmWWVzLmdldChudWxsKS5lcXVhbHMoZk9wZW4uaW52b2tlKG1iLCBudWxsKSk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9fSk7Ci0JCSAJcmV0dXJuIGRiWzBdOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIGRlYnVnTW9kZUFXVChuYW1lKTsKLSAJfQotIAkKLQotCS8qCi0JICogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRBY3RpdmVTaGVsbCgpIHsKLQkgCU9iamVjdCBzaGVsbCA9IG51bGw7CQkKLQkJdHJ5IHsKLQkJCU9iamVjdCB3ID0gZkdldFdvcmtiZW5jaC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JCQlPYmplY3Qgd3cgPSBudWxsOwotCQkJaWYgKHcgIT0gbnVsbCkgewotCQkJIAlDbGFzcyBjV29ya2JlbmNoID0gdy5nZXRDbGFzcygpOwotCQkJIAlNZXRob2QgZ2V0V29ya2JlbmNoV2luZG93ID0gY1dvcmtiZW5jaC5nZXRNZXRob2QoImdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJd3cgPSBnZXRXb3JrYmVuY2hXaW5kb3cuaW52b2tlKHcsIG51bGwpOwotCQkJfQotCQkJaWYgKHd3ICE9IG51bGwpIHsKLQkJCQlDbGFzcyBjV29ya2JlbmNoV2luZG93ID0gd3cuZ2V0Q2xhc3MoKTsKLQkJCQlNZXRob2QgZ2V0U2hlbGwgPSBjV29ya2JlbmNoV2luZG93LmdldE1ldGhvZCgiZ2V0U2hlbGwiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoZWxsID0gZ2V0U2hlbGwuaW52b2tlKHd3LCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JIAkKLQkgCXJldHVybiBzaGVsbDsKLQl9CQotCQkgCQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnTW9kZUFXVChTdHJpbmcgbmFtZSkgewotCSAJCQotCSAJLy8gU2VlIGlmIEFXVCBpcyBhdmFpbGFibGUuCi0JIAl0cnkgewotCQkgCUludGVnZXIgciA9IChJbnRlZ2VyKSBmRG9pdC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsiRGVidWcgUmVtb3RlVk0/IiwgIkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyIsICJZZXMiLCAiTm8ifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkgCXJldHVybiByLmludFZhbHVlKCkgPT0gMTsJLy8gaS5lLiBidXR0b24xIG9yICJ5ZXMiIHdhcyBoaXQuCi0JIAl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkgCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCSAJfQotCSAJCi0gCQlyZXR1cm4gZmFsc2U7CS8vIE5vIEFXVCBlaXRoZXIsIGkuZS4gaGVhZGxlc3MgZW52aXJvbm1lbnQsIHNob3VsZG4ndCBvZiBnb3R0b24gaGVyZS4KLQl9IAkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1Z01vZGVDb25zb2xlKFN0cmluZyBuYW1lKSB7Ci0JIAkJCi0JIAkvLyBEZWJ1ZyB0aHJvdWdoIHRoZSBjb25zb2xlCi0gCQlpblJlYWRlciA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbik7Ci0gCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvIHlvdSB3YW50IHRvIHN0YXJ0IHRoZSByZW1vdGUgdm0gKCIrbmFtZSsiKSBpbiBkZWJ1ZyBtb2RlPyAoRW50ZXIgWSBvciBOKToiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gCQljaGFyIHIgPSAnICc7Ci0gCQl0cnkgewotIAkJCXIgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGluUmVhZGVyLnJlYWQoKSk7Ci0gCQkJLy8gTmVlZCB0byBmbHVzaCB0aGUgaW5wdXQgcmVhZGVyIG5vdy4KLSAJCQl3aGlsZSAoaW5SZWFkZXIucmVhZHkoKSkKLSAJCQkJaW5SZWFkZXIucmVhZCgpOwotCQkgCXJldHVybiByID09ICd5JzsJLy8gaS5lLiAieSIgd2FzIGVudGVyZWQuCSAJCQkKLSAJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotIAkJfQotCSAJCi0gCQlyZXR1cm4gZmFsc2U7CS8vIEVycm9yIHJlYWRpbmcsIHNvIG5vIGRlYnVnZ2luZy4KLQl9IAotIAkKLSAJLyoqCi0gCSAqIFJldHVybiB0cnVlIGlmIGNvbnRpbnVlIGRlYnVnZ2luZy4KLSAJICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0UG9ydChmaW5hbCBpbnQgZHBvcnQpIHsKLSAJCWlmIChhd3QpCi0gCQkJcmV0dXJuIHByb21wdFBvcnRBV1QoZHBvcnQpOwotIAkJZWxzZSBpZiAoY29uc29sZSkKLSAJCQlyZXR1cm4gcHJvbXB0UG9ydENvbnNvbGUoZHBvcnQpOwotIAkJCQotIAkJdHJ5IHsJCi0JCQlmaW5hbCBGaWVsZCBmT0sgPSBjU1dULmdldEZpZWxkKCJPSyIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWVsZCBmQ2FuY2VsID0gY1NXVC5nZXRGaWVsZCgiQ0FOQ0VMIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGZJY29uID0gY1NXVC5nZXRGaWVsZCgiSUNPTl9XT1JLSU5HIik7IC8vJE5PTi1OTFMtMSQKLQkgCQkJCi0JCQlmaW5hbCBpbnQgc3R5bGUgPSBmT0suZ2V0SW50KG51bGwpIHwgZkNhbmNlbC5nZXRJbnQobnVsbCkgfCBmSWNvbi5nZXRJbnQobnVsbCkgfCBmUHJpbWFyeU1vZGVsLmdldEludChudWxsKTsKLQotCQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCQlmc3luYy5pbnZva2UoZGlzcGxheSwgbmV3IE9iamVjdFtdIHsgbmV3IFJ1bm5hYmxlKCkgewkKLQkJCQkvKioKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBzaGVsbCA9IGdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQlPYmplY3QgbWIgPSBjTUIubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtzaGVsbCwgbmV3IEludGVnZXIoc3R5bGUpfSk7CQkJCQkKLQkJCQkJCWZTZXRUZXh0Lmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiQ29ubmVjdCBEZWJ1Z2dlciB0byBSZW1vdGVWTSEifSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZTZXRNZXNzYWdlLmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiWW91IG11c3Qgbm93IGF0dGFjaCB0aGUgZGVidWdnZXIgdG8gcG9ydCBudW1iZXIgIitkcG9ydCsiLiBQcmVzcyBPSyB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhlIHByb2dyYW0gd2lsbCBub3QgY29udGludWUgcHJvcGVybHkgd2l0aG91dCB0aGUgZGVidWdnZXIgYmVpbmcgYXR0YWNoZWQuIFByZXNzIENhbmNlbCBpZiB5b3UgY291bGQgbm90IGNvbm5lY3QgdGhlIGRlYnVnZ2VyLiBUaGlzIHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IsIGJ1dCBpdCB3aWxsIGNsZWFuIHVwIGJldHRlci4ifSk7CS8vIE5vdCBOTFMnZCBiZWNhdXNlIHRoaXMgaXMgZm9yIGludGVybmFsIGRldmVsb3BlcnMgb25seSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW9rWzBdID0gZk9LLmdldChudWxsKS5lcXVhbHMoZk9wZW4uaW52b2tlKG1iLCBudWxsKSk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9fSk7CQkJCi0JCQlyZXR1cm4gb2tbMF07Ci0gCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotIAkJfQotIAkJcmV0dXJuIGZhbHNlOwotCX0JIAkKLSAJCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UG9ydEFXVChpbnQgZHBvcnQpIHsKLQkJdHJ5IHsKLQkJIAlJbnRlZ2VyIHIgPSAoSW50ZWdlcikgZkRvaXQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IkNvbm5lY3QgRGVidWdnZXIgdG8gUmVtb3RlVk0hIiwgIllvdSBtdXN0IG5vdyBhdHRhY2ggdGhlIGRlYnVnZ2VyIHRvIHBvcnQgbnVtYmVyICIrZHBvcnQrIi4gUHJlc3MgT0sgd2hlbiB0aGUgZGVidWdnZXIgaXMgYXR0YWNoZWQuIFRoZSBwcm9ncmFtIHdpbGwgbm90IGNvbnRpbnVlIHByb3Blcmx5IHdpdGhvdXQgdGhlIGRlYnVnZ2VyIGJlaW5nIGF0dGFjaGVkLiBQcmVzcyBDYW5jZWwgaWYgeW91IGNvdWxkIG5vdCBjb25uZWN0IHRoZSBkZWJ1Z2dlci4gVGhpcyB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yLCBidXQgaXQgd2lsbCBjbGVhbiB1cCBiZXR0ZXIuIiwgIk9LIiwgIkNhbmNlbCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCSAJcmV0dXJuIHIuaW50VmFsdWUoKSA9PSAxOwkvLyBpLmUuIGJ1dHRvbjEgb3IgIk9LIiB3YXMgaGl0LgotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLSAJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkgCQotIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRQb3J0Q29uc29sZShpbnQgZHBvcnQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJZb3UgbXVzdCBub3cgYXR0YWNoIHRoZSBkZWJ1Z2dlciB0byBwb3J0IG51bWJlciAiK2Rwb3J0KyIuIEVudGVyICd5JyB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhlIHByb2dyYW0gd2lsbCBub3QgY29udGludWUgcHJvcGVybHkgd2l0aG91dCB0aGUgZGVidWdnZXIgYmVpbmcgYXR0YWNoZWQuIFByZXNzICduJyBpZiB5b3UgY291bGQgbm90IGNvbm5lY3QgdGhlIGRlYnVnZ2VyLiBUaGlzIHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IsIGJ1dCBpdCB3aWxsIGNsZWFuIHVwIGJldHRlci4gRW50ZXIgJ3knIG9yICduJzoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoYXIgciA9ICcgJzsKLQkJdHJ5IHsKLQkJCXIgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGluUmVhZGVyLnJlYWQoKSk7Ci0gCQkJd2hpbGUgKGluUmVhZGVyLnJlYWR5KCkpCi0gCQkJCWluUmVhZGVyLnJlYWQoKTsKLQkJCXJldHVybiByID09ICd5JzsJLy8gaS5lLiAieSIgd2FzIGVudGVyZWQsIGdvIG9uCi0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQl9Ci0gCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5IGFuIGVycm9yIG1zZy4gVGhlcmUgd2lsbCBvbmx5IGJlIGFuIE9LIGJ1dHRvbi4KLQkgKiBUaGlzIHdpbGwgYWx3YXlzIGRpc3BsYXksIGRlYnVnIG1vZGUgd29uJ3QgYmUgbG9va2VkIGF0LgotCSAqIFRoaXMgaXMgZm9yIGVycm9ycy4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBhc3luYywgc28gdGhpcwotCSAqIG1heSByZXR1cm4gYmVmb3JlIHRoZSBtc2cgaGFzIGJlZW4gZGlzcGxheWVkIGFuZCBhbnN3ZXJlZCwKLQkgKiBidXQgc2luY2UgdGhlIG9ubHkgcmVzcG9uc2UgaXMgT0ssIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQlzZXR1cFR5cGUoKTsKLQkJaWYgKGNvbnNvbGUpCi0JCQlkaXNwbGF5RXJyb3JNZXNzYWdlQ29uc29sZSh0aXRsZSwgbXNnKTsKLQkJZWxzZSBpZiAoYXd0KQotCQkJZGlzcGxheUVycm9yTWVzc2FnZUFXVCh0aXRsZSwgbXNnKTsKLQkJZWxzZSB7Ci0JCQl0cnkgeyAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gZGlzcGxheSB0aHJlYWQuCi0JCQkJRmllbGQgZk9LID0gY1NXVC5nZXRGaWVsZCgiT0siKTsgLy8kTk9OLU5MUy0xJAotCQkJCUZpZWxkIGZJY29uID0gY1NXVC5nZXRGaWVsZCgiSUNPTl9FUlJPUiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlmaW5hbCBpbnQgc3R5bGUgPSBmT0suZ2V0SW50KG51bGwpIHwgZkljb24uZ2V0SW50KG51bGwpIHwgZlByaW1hcnlNb2RlbC5nZXRJbnQobnVsbCk7Ci0JCQkJZmFzeW5jLmludm9rZShkaXNwbGF5LCBuZXcgT2JqZWN0W10geyBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkvKioKLQkJCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsgdHJ5IHsgT2JqZWN0IHNoZWxsID0gZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCQkJCQkJT2JqZWN0IG1iID0gY01CLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHNoZWxsLCBuZXcgSW50ZWdlcihzdHlsZSl9KTsKLQotCQkJCQkJCQlmU2V0VGV4dC5pbnZva2UobWIsIG5ldyBPYmplY3RbXSB7IHRpdGxlIH0pOwotCQkJCQkJCQlmU2V0TWVzc2FnZS5pbnZva2UobWIsIG5ldyBPYmplY3RbXSB7IG1zZyB9KTsKLQkJCQkJCQkJZk9wZW4uaW52b2tlKG1iLCBudWxsKTsKLQkJCQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9CQotCQotIAlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlQ29uc29sZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlQVdUKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQl0cnkgewotCQkgCWZEb2l0Lmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge3RpdGxlLCBtc2csIFByb3h5UmVtb3RlTWVzc2FnZXMuT0tfNywgbnVsbH0pOyAKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9Ci0JfQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA0Mjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQSBSZW1vdGUgVk0gcHJveHkuIEFsbCBJQmVhblByb3h5IGltcGxlbWVudGF0aW9ucwotICogZm9yIHRoZSBSZW1vdGUgVk0gbXVzdCBhbHNvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcuCi0gKgotICogTk9URTogVGhpcyBpcyBhbiBpbnRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIFJlbW90ZSBWTSBQcm94eS4KLSAqIEl0IE1VU1Qgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgcHJveHkgZmFjdG9yeSBmYW1pbHkuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUkVNQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBJRCBvZiB0aGlzIHByb3h5Ci0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SUQoKTsKLQkKLQkvKioKLQkgKiBQcm94eSBpcyBhYm91dCB0byBiZSByZWxlYXNlZCwgTVVTVCBtYXJrIGl0IGludmFsaWQuCi0JICogVGhpcyBpcyByZXF1aXJlZC4gUmVzb3VyY2VzIGNhbiBhbHNvIGJlIGNsZWFuZWQgdXAKLQkgKiBpZiB0aGV5IGFyZSBiZWluZyBoZWxkIGFuZCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAuCi0JICoKLQkgKiBOT1RFOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIHByb3h5Ci0JICogaXMgZXhwbGljaXRseSByZWxlYXNlZC4gSWYgaXQgaXMgc2ltcGx5IGdhcmJhZ2UgY29sbGVjdGVkLAotCSAqIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkLiBTaW1wbGUgZ2FyYmFnZSBjb2xsZWN0aW9uCi0JICogbWVhbnMgdGhhdCBubyBvbmUgaXMgcmVmZXJlbmNpbmcgdGhpcyBwcm94eS4gVGhlIHByb3h5IGZhY3RvcnkKLQkgKiB3aWxsIGtub3cgd2hhdCBpZCB0aGlzIHByb3h5IHdhcyByZWZlcmVuY2luZyBhbmQgd2lsbCByZWxlYXNlIGl0Ci0JICogb24gdGhlIHNlcnZlciBhdCBHQyB0aW1lLgotCSAqCi0JICogSWYgdGhlcmUgYXJlIHJlc291cmNlcwotCSAqIHRoYXQgYWJzb2x1dGVseSBtdXN0IGJlIHJlbGVhc2VkLCB0aGVuIHRoZSBmaW5hbGl6ZSBtZXRob2QKLQkgKiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gZG8gdGhlIGNsZWFuIHVwLiBIb3dldmVyLCB0cnkgbm90Ci0JICogdG8gaGF2ZSB0aGlzIGJlIHRoZSBjYXNlLiBGaW5hbGl6ZSBtZXRob2RzIGFkZCBvdmVyaGVhZCB0aGF0IGlzCi0JICogdXN1YWxseSBiZXR0ZXIgbm90IHRvIGhhdmUuIFRoZSBiZXR0ZXIgd2F5IGlzIGZvciBhbnkgdXNlcnMKLQkgKiB0aGF0IGdldCB0aGlzIGtpbmQgb2YgcHJveHkgb2JqZWN0IGtub3cgdG8gY2FsbCByZWxlYXNlIG9uCi0JICogUHJveHlGYWN0b3J5UmVnaXN0cnkgdG8gcmVsZWFzZSBpdCBiZWZvcmUgZ2FyYmFnZSBjb2xsZWN0aW9uLgkgCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCQotCS8qKgotCSAqIFJlbmRlciB0aGlzIGJlYW4gZm9yIHRyYW5zcG9ydCB0byB0aGUgc2VydmVyIGludG8gYSBDb21tYW5kcy5WYWx1ZU9iamVjdC4KLQkgKiBGb3IgZXhhbXBsZSwgYSBzdHJpbmcgbWF5IHB1dCBhIHN0cmluZy4gQW4gaWQgdHlwZSBtYXkgcHV0IG91dCB0aGUgaWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCByZW5kZXJJbnRvKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxYWQzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBBbGwgYmVhbiB0eXBlIHByb3hpZXMgaW4gcmVtb3RlIHZtIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICoKLSAqIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBSZW1vdGUgVk0gUHJveHkuCi0gKiBJdCBNVVNUIG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHByb3h5IGZhY3RvcnkgZmFtaWx5LiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUkVNQmVhblR5cGVQcm94eSBleHRlbmRzIElCZWFuVHlwZVByb3h5LCBJUkVNQmVhblByb3h5IHsKLQkKLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKTsKLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGY4YjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIFJlbW90ZSBWTSBCZWFuIFR5cGUgUHJveHkgRmFjdG9yaWVzLgotICogQWxsIGV4dGVuc2lvbiBmYWN0b3JpZXMgZm9yIFJlbW90ZSBWTSBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBleHRlbmRzIElCZWFuVHlwZVByb3h5RmFjdG9yeSB7Ci0vKioKLSAqIFJldHVybiBhIGJlYW4gdHlwZSBwcm94eSBmb3IgdGhlIGNsYXNzIG5hbWUuCi0gKiBSZXR1cm4gbnVsbCBpZiB0aGUgZXh0ZW5zaW9uIGZhY3RvcnkgZG9lc24ndCBoYW5kbGUgdGhpcyBjbGFzcy4KLSAqIERvbid0IHJlZ2lzdGVyIGFueSBwcm94aWVzIHJldHVybmVkLCB0aGV5IHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkLgotICogVGhpcyBzaG91bGQgb25seSByZXR1cm4gYmVhbiB0eXBlIHByb3hpZXMgd2hlcmUgdGhlIGZhY3RvcnkgY2FuIGRldGVybWluZQotICogZXZlcnl0aGluZyBpdCBuZWVkcywgc3VjaCBhcyBzdXBlcnR5cGUgYW5kIGNsYXNzSUQuCi0gKiBOT1RFOiBUaGlzIGlzIGltcGxlbWVudGVkIGZvciB0aGUgdXNhZ2Ugb2YgdGhlCi0gKiAgICAgICBzdGFuZGFyZCBCZWFuVHlwZSBwcm94eSBmYWN0b3J5LiBJdCBzaG91bGQKLSAqICAgICAgIE5PVCBiZSBjYWxsZWQgYnkgYW55b25lIGVsc2UuIFRoZXkgc2hvdWxkCi0gKiAgICAgICBnbyB0aHJvdWdoIHRoZSBJU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkKLSAqICAgICAgIGluc3RlYWQuIFRoZSBzdGFuZGFyZCBiZWFuIHR5cGUgZmFjdG9yeQotICogICAgICAgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgZXh0ZW5zaW9uIHdoZW4gaXQgbmVlZHMgdG8uCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNjoxMiBQTSkKLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lKTsJCi0KLS8qKgotICogUmV0dXJuIGEgYmVhbiB0eXBlIHByb3h5IGZvciB0aGUgY2xhc3MgbmFtZS4KLSAqIFJldHVybiBudWxsIGlmIHRoZSBleHRlbnNpb24gZmFjdG9yeSBkb2Vzbid0IGhhbmRsZSB0aGlzIGNsYXNzLgotICogRG9uJ3QgcmVnaXN0ZXIgYW55IHByb3hpZXMgcmV0dXJuZWQsIHRoZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlZ2lzdGVyZWQuCi0gKiBUaGlzIHNob3VsZCBvbmx5IHJldHVybiBiZWFuIHR5cGUgcHJveGllcyB3aGVyZSB0aGUgZmFjdG9yeSBjYW4gZGV0ZXJtaW5lCi0gKiBldmVyeXRoaW5nIGl0IG5lZWRzLCBzdWNoIGFzIHN1cGVydHlwZSBhbmQgY2xhc3NJRC4KLSAqIE5PVEU6IFRoaXMgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZSB1c2FnZSBvZiB0aGUKLSAqICAgICAgIHN0YW5kYXJkIEJlYW5UeXBlIHByb3h5IGZhY3RvcnkuIEl0IHNob3VsZAotICogICAgICAgTk9UIGJlIGNhbGxlZCBieSBhbnlvbmUgZWxzZS4gVGhleSBzaG91bGQKLSAqICAgICAgIGdvIHRocm91Z2ggdGhlIElTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeQotICogICAgICAgaW5zdGVhZC4gVGhlIHN0YW5kYXJkIGJlYW4gdHlwZSBmYWN0b3J5Ci0gKiAgICAgICB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICBleHRlbnNpb24gd2hlbiBpdCBuZWVkcyB0by4KLSAKLSAqIEBwYXJhbSB0eXBlTmFtZQotICogQHBhcmFtIGV4cHJlc3Npb24KLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLS8qKgotICogUmV0dXJuIGEgYmVhbiB0eXBlIHByb3h5IGZvciB0aGUgY2xhc3MgaWQgYW5kIGNsYXNzIG5hbWUuCi0gKiBSZXR1cm4gbnVsbCBpZiB0aGUgZXh0ZW5zaW9uIGZhY3RvcnkgZG9lc24ndCBoYW5kbGUgdGhpcyBjbGFzcy4gCi0gKiBEb24ndCByZWdpc3RlciBhbnkgcHJveGllcyByZXR1cm5lZCwgdGhleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVnaXN0ZXJlZC4gCi0gKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjYXNlIHRoYXQgYSBuZXcgY2xhc3MgaWQgd2FzIHJldHVybmVkCi0gKiBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBkb24ndCBoYXZlIHJlZ2lzdGVyZWQgeWV0LiBJbXBsZW1lbnRlcnMgd2lsbAotICogY3JlYXRlZCBhIHByb3h5IG91dCBvZiB0aGUgbmFtZSBhbmQgdGhlIGlkIGFuZCByZXR1cm4gaXQuCi0gKiBUaGUgc3VwZXJ0eXBlIHdpbGwgYmUgcGFzc2VkIGluIHNvIHRoYXQgdGhlIGV4dGVuc2lvbiBmYWN0b3J5IGRvZXNuJ3QgbmVlZCB0bwotICogdHJ5IHRvIGZpbmQgaXQuCi0gKiBOT1RFOiBUaGlzIGlzIGltcGxlbWVudGVkIGZvciB0aGUgdXNhZ2Ugb2YgdGhlCi0gKiAgICAgICBzdGFuZGFyZCBCZWFuVHlwZSBwcm94eSBmYWN0b3J5LiBJdCBzaG91bGQKLSAqICAgICAgIE5PVCBiZSBjYWxsZWQgYnkgYW55b25lIGVsc2UuIFRoZXkgc2hvdWxkCi0gKiAgICAgICBnbyB0aHJvdWdoIHRoZSBJU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkKLSAqICAgICAgIGluc3RlYWQuIFRoZSBzdGFuZGFyZCBiZWFuIHR5cGUgZmFjdG9yeQotICogICAgICAgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgZXh0ZW5zaW9uIHdoZW4gaXQgbmVlZHMgdG8uCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNjoxMiBQTSkKLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJbnRlZ2VyIGNsYXNzSUQsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSk7CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdlNDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEludGVyZmFjZSBmb3IgdGhlIFJlbW90ZSBWTSBDb25uZWN0aW9uIG9iamVjdC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1Db25uZWN0aW9uIHsKLQkKLQkvKioKLQkgKiBEaWQgdGhpcyBjb25zdHJ1Y3QgY29ycmVjdGx5LgotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGNvdWxkIGJlIHRocm93biBpbiB0aGUgY3RvciBhbmQKLQkgKiB0aGF0J3Mgbm90IGEgZ29vZCB0aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgc2VydmVyLgotCSAqIFdBUk5JTkc6IFRoaXMgaXMgb25seSBoZXJlIHNvIHRoYXQgZmFjdG9yeSBjYW4gdG8gaXQuIFRlcm1pbmF0aW9uIHNob3VsZCBPTkxZCi0JICogYmUgZG9uZSBieSB0aGUgRmFjdG9yeSBub3QgYW55IG9uZSBlbHNlLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVTZXJ2ZXIoKTsKLQkJCQotCS8qKgotCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBpbmZvcm1hdGlvbi4gTnVsbCByZXR1cm4gaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kcy5HZXRDbGFzc1JldHVybiBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCB0aGUgY2xhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgaWQuIAotCSAqLwotCSBwdWJsaWMgQ29tbWFuZHMuR2V0Q2xhc3NJRFJldHVybiBnZXRDbGFzc0Zyb21JRChpbnQgY2xhc3NJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLQkKLQotCS8qKgotCSAqIEdldCBvYmplY3QgZGF0YSBmcm9tIGFuIGlkLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBnZXRPYmplY3REYXRhKGludCBvYmplY3RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBHZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROZXdJbnN0YW5jZShpbnQgY2xhc3NJRCwgU3RyaW5nIGluaXRTdHJpbmcsIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogSW52b2tlIHRoZSBnZXQgYXJyYXkgY29udGVudHMgY29tbWFuZC4KLQkgKiBAcGFyYW0gYXJyYXlJRAotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZQotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEFycmF5Q29udGVudHMoaW50IGFycmF5SUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBjYWxsLgotCSAqIFRoZSBwYXJtcyB2YWx1ZU9iamVjdCBtdXN0IHJlcHJlc2VudCBhbiBPYmplY3RbXSAoZWl0aGVyIHRocm91Z2ggQVJSQVlfSURTIG9yIE9CSkVDVCkKLQkgKi8JCi0JcHVibGljIHZvaWQgaW52b2tlTWV0aG9kKGludCBtZXRob2RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW52b2tlT24sIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBjYWxsIHdpdGggbWV0aG9kIHBhc3NlZC4KLQkgKiBUaGUgcGFybXMgdmFsdWVPYmplY3QgbXVzdCByZXByZXNlbnQgYW4gT2JqZWN0W10gKGVpdGhlciB0aHJvdWdoIEFSUkFZX0lEUyBvciBPQkpFQ1QpCi0JICovCQotCXB1YmxpYyB2b2lkIGludm9rZU1ldGhvZChDb21tYW5kcy5WYWx1ZU9iamVjdCBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtVHlwZXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGludm9rZU9uLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgaWQuIEl0IGlzIG5vIGxvbmdlciBuZWVkZWQgb24gdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlSUQoaW50IGlkKTsKLQkKLQkvKioKLQkgKiBSZWFkIGFycmF5IHZhbHVlcyBhcyBCZWFuUHJveGllcyBpbnRvIHZhbHVlU2VuZGVyLgotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZVNlbmRlcgotCSAqIEBwYXJhbSBhbGxvd0ZsYWcgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgRkxBRyB2YWx1ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QgYWxsb3cgZmxhZyB2YWx1ZXMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFByb3h5QXJyYXlWYWx1ZXMoQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUsIENvbW1hbmRzLlZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyLCBib29sZWFuIGFsbG93RmxhZykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29uc3RhbnRCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYjlkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIFRhZyBpbnRlcmZhY2UgdG8gaW5kaWNhdGUgdGhpcyBwcm94eSBpcyBhIGNvbnN0YW50IHByb3h5LCBpLmUuIHRoZXJlCi0gKiBpcyBubyBiZWFuIG9uIHRoZSBzZXJ2ZXIgcmVwcmVzZW50aW5nIHRoaXMgKGUuZy4gU3RyaW5ncyBhbmQgSW50ZWdlcnMpLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUNvbnN0YW50QmVhblByb3h5IGV4dGVuZHMgSVJFTUJlYW5Qcm94eSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjM2Y5ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBhbnkgQmVhblR5cGUgdGhhdCByZXByZXNlbnRzIGEgY29uc3RhbnQgdHlwZSBiZWFuLgotICogVGhlc2UgYXJlIHR5cGVzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgYSBjb3B5IG9mIHRoZSBhY3R1YWwgdmFsdWUgaXMga2VwdCBoZXJlCi0gKiBpbiB0aGUgY2xpZW50IGFuZCBub3Qgc3RvcmVkIGFzIGFuIG9iamVjdCBpZC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJQmVhblR5cGVQcm94eSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWZiNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLSAKLS8qKgotICogQWRkaXRpb25hbCBmdW5jdGlvbiBvbiBhIGNvbm5lY3Rpb24gZm9yIGV4cHJlc3Npb24gdHJlZSBwcm9jZXNzaW5nLgotICogQ29ubmVjdGlvbnMgcmV0dXJuZWQgKElSRU1Db25uZWN0aW9ucykgd2lsbCBhbHdheXMgYWxzbyBpbXBsZW1lbnQgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLAotICogYnV0IHRoZXkgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IGV4cHJlc3Npb24gZnVuY3Rpb25zIGRvbid0IHBvbGx1dGUgdGhlIHJlZ3VsYXIKLSAqIGNvbm5lY3Rpb24gaW50ZXJmYWNlIHdpdGggYWRkZWQgY29tbWFuZHMgdGhhdCBzaG91bGRuJ3QgYmUgY2FsbGVkIGV4Y2VwdAotICogd2hlbiBwcm9jZXNzaW5nIGFuIGV4cHJlc3Npb24uIElmIHRoZXkgd2VyZSBjYWxsZWQgb3V0IG9mIG9yZGVyLCBiaWcgcHJvYmxlbXMKLSAqIGNhbiBvY2N1ci4KLSAqIDxwPgotICogVG8gdXNlLCBzaW1wbHkgY2FzdCB0aGUgSVJFTUNvbm5lY3Rpb24gdG8gYmUgYW4gSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gZXh0ZW5kcyBJUkVNQ29ubmVjdGlvbiB7Ci0JCi0JLyoqCi0JICogU3RhcnQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIHRyYWNlIFRPRE8KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklELCBieXRlIHRyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVHJhbnNmZXIgdGhlIGV4cHJlc3Npb24uIFRoaXMgdGVsbHMgdGhlIHJlbW90ZSB2bSB0byBzdG9wIHByb2Nlc3Npbmcgb24gdGhlCi0JICogZ2l2ZW4gY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29udHJvbGxlciBmb3IgdGhlIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBleHBDb250cm9sbGVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zZmVyRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBSZXN1bWUgdGhlIGV4cHJlc3Npb24gb24gdGhpcyBjb25uZWN0aW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gZXhwQ29udHJvbGxlciBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyIHRvIHVzZSBmb3IgdGhlIGV4cHJlc3Npb24gb24gdGhpcyBuZXcgY29ubmVjdGlvbi4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBQdXNoIGFuIGV4cHJlc3Npb24gY29tbWFuZC4gVGhpcyBpcyB0aGUgY29tbW9uIHBvcnRpb24gb2YgdGhlCi0JICogc3ViY29tbWFuZC4gVGhlIGFjdHVhbCBkYXRhIG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgc2VwYXJhdGVseSBkb25lLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIHN1YmNvbW1hbmQgVGhlIHN1YmNvbW1hbmQgYmVpbmcgc2VudC4gRnJvbSBJSW50ZXJuYWxFeHByZXNzaW9uQ29uc3RhbnRzLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSUludGVybmFsRXhwcmVzc2lvbkNvbnN0YW50cyNQVVNIX1RPX1BST1hZX0VYUFJFU1NJT04KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRXhwcmVzc2lvbkNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSBzdWJjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgdmFsdWUgb2JqZWN0IHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVPYmplY3QKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoVmFsdWVPYmplY3QoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHVzaCBqdXN0IHRoZSBzaW5nbGUgYnl0ZSB0byB0aGUgcmVtb3RlIHNpZGUuCi0JICogQHBhcmFtIGFieXRlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hCeXRlKGJ5dGUgYWJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBQdXNoIGp1c3QgdGhlIHNpbmdsZSBpbnQgdG8gdGhlIHJlbW90ZSBzaWRlLgotCSAqIAotCSAqIEBwYXJhbSBhbkludAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoSW50KGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCQotCS8qKgotCSAqIFB1c2gganVzdCB0aGUgc2luZ2Ugc3RyaW5nIHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoU3RyaW5nKFN0cmluZyBhU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCBqdXN0IHRoZSBib29sIHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiBAcGFyYW0gYUJvb2wKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJvb2xlYW4oYm9vbGVhbiBhQm9vbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEdldCB0aGUgZmluYWwgdmFsdWUuIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHByb3h5IGlkIHJlc29sdXRpb25zIGV2ZW4gZm9yIHN5bmMgKHNvIHRoYXQgd2UgY2FuIGdldAotCSAqIGFueSB0aHJvd24gZXJyb3JzKS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RmluYWxWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCByZXN1bHQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNlbmQgdGhlIHB1bGwgdmFsdWUgY29tbWFuZCwgd2l0aCB0aGUgcHJveHlpZHMgb2YgaW50ZXJlc2V0LiBJZiBhbiBlcnJvcgotCSAqIG9jY3VycywgY29tbWFuZCBleGNlcHRpb24gaXMgdGhyb3duLiAKLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgcHVsbCB2YWx1ZSBjYWxsLCBpZiBubyBlcnJvcnMsIHRoZSBwcm94eWlkcyBtdXN0IGJlIHJlYWQsIGFuZCB0aGVuIGdldEZpbmFsVmFsdWUgY2FsbCBtdXN0IGJlIHNlbnQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBwcm94eWlkcyBleHByZXNzaW9uIHByb3h5aWRzIHRoYXQgcmVxdWVzdCBmZWVkYmFjayBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm94eSBpZHMuCi0JICogQHBhcmFtIHNlbmRlciBzZW5kZXIgdG8gdXNlIHRvIHByb2Nlc3MgdGhlIHJldHVybmVkIHByb3h5IGlkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXhwZWN0aW5nIG5vIHByb3h5IHJlc29sdXRpb25zLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHB1bGxWYWx1ZShpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBzeW5jIGNvbW1hbmQsIHdpdGggdGhlIHByb3h5aWRzIG9mIGludGVyZXNldC4gSWYgYW4gZXJyb3IKLQkgKiBvY2N1cnMsIGNvbW1hbmQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgc3luYyBjYWxsLCBpZiBubyBlcnJvcnMsIHRoZSByZXR1cm5lZCBwcm94eWlkcyBtdXN0IGJlIHByb2Nlc3NlZCBhbmQgdGhlbiB0aGUgZmluYWwgZW5kVmFsdWUgY2FsbCBtdXN0IGJlIHNlbnQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gcHJveHlpZHMgZXhwcmVzc2lvbiBwcm94eWlkcyB0aGF0IHJlcXVlc3QgZmVlZGJhY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIEBwYXJhbSBzZW5kZXIgc2VuZGVyIHRvIHVzZSB0byBwcm9jZXNzIHRoZSBwcm94eSBpZCByZXNvbHV0aW9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZXhwZWN0aW5nIG5vIHByb3h5IGlkcy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jKGludCBleHByZXNzaW9uSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzLCBDb21tYW5kcy5WYWx1ZVNlbmRlciBzZW5kZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwkKLQkKLQkvKioKLQkgKiBTdG9wIGV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoaW50IGV4cHJlc3Npb25JRCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1NZXRob2RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NTU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1NZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZm9yIFJFTU1ldGhvZFByb3h5IGFsbG93cyB0aGUgaW52b2thdGlvbiB3aGVyZQotICogdGhlIHBhcm1zIGFyZSBhIG1peHR1cmUgb2YgY29uc3RhbnQgb2JqZWN0cyAoaS5lLiBjYW4gYmUgc2VudAotICogYXMgdmFsdWVzIHRvIHRoZSBjbGllbnQpIGFuZCBJQmVhblByb3hpZXMuIEl0IGlzIG9ubHkgdG8gYmUKLSAqIHVzZWQgYnkgb3RoZXIgZmFjdG9yaWVzIHRoYXQgd2FudCB0byBpbnZva2UgbWV0aG9kcyB3aGVyZQotICogc29tZSBvZiB0aGUgcGFybXMgYXJlIGNvbnN0YW50cyBzbyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQKLSAqIGNyZWF0ZSBJQmVhblByb3hpZXMgZm9yIHRoZW0sIGUuZy4gU3RyaW5nLiBUaGlzIHNob3VsZCBiZQotICogdXNlZCB3aXRoIGV4dHJlbWUgY2FyZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1NZXRob2RQcm94eSBleHRlbmRzIElNZXRob2RQcm94eSwgSVJFTUJlYW5Qcm94eSB7Ci0JcHVibGljIElCZWFuUHJveHkgaW52b2tlV2l0aFBhcm1zKElCZWFuUHJveHkgc3ViamVjdCwgT2JqZWN0W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQkKLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1TcGVjaWFsQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdhNGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci0vKioKLSAqIFRoaXMgaXMgYSBzcGVjaWFsIGludGVyZmFjZSBmb3IgYWxsb3dpbmcgYWJzdHJhY3QKLSAqIHR5cGVzIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBzdWJjbGFzcyB0eXBlcy4KLSAqIE9ubHkgb25lcyB0aGF0IHVzZSBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eQotICogc2hvdWxkIGltcGxlbWVudCB0aGlzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSB7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJ5IFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGNyZWF0ZSBhIHN1YmNsYXNzIG9mIGl0LgotCSAqIFRoaXMgYWxsb3dzIGNvcnJlY3QgdHlwZXMgdG8gYmUgY3JlYXRlZCBkZXBlbmRpbmcgdXBvbiB0aGUKLQkgKiBtYWluIHN1cGVyIHR5cGUuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Mb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0xvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4OTM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0xvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogVGhpcyB2ZXJzaW9uIHdvcmtzIHdpdGggbG9jYWwgZmlsZXMgYmVpbmcgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aCwgYW5kIHRoZSBjbGFzc3BhdGggaXMgc3RyaW5ncy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIHsKLQotCXByaXZhdGUgVVJMW10gY2xhc3NwYXRoSW5mbzsKLQotCXByaXZhdGUgVVJMW11bXSBib290cGF0aEluZm87Ci0KLQlwcml2YXRlIExpc3QgY2xhc3NwYXRoOwotCi0JcHJpdmF0ZSBMaXN0IHByZXBlbmRCb290cGF0aDsKLQotCXByaXZhdGUgTGlzdCBhcHBlbmRCb290cGF0aDsKLQotCXByaXZhdGUgTGlzdCBqYXZhTGlicmFyeVBhdGg7Ci0KLQlwcml2YXRlIFByb3h5TGF1bmNoU3VwcG9ydC5MYXVuY2hJbmZvIGxhdW5jaEluZm87Ci0KLQlwdWJsaWMgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlcihVUkxbXSBjbGFzc3BhdGhJbmZvLCBVUkxbXVtdIGJvb3RwYXRoSW5mbywgUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbykgewotCQl0aGlzLmNsYXNzcGF0aEluZm8gPSBjbGFzc3BhdGhJbmZvOwotCQl0aGlzLmJvb3RwYXRoSW5mbyA9IGJvb3RwYXRoSW5mbzsKLQkJdGhpcy5sYXVuY2hJbmZvID0gbGF1bmNoSW5mbzsKLQl9Ci0KLQlwdWJsaWMgVVJMW10gZ2V0RmluYWxDbGFzc3BhdGgoKSB7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBjbGFzc3BhdGhJbmZvOwotCQllbHNlCi0JCQlyZXR1cm4gKFVSTFtdKSBjbGFzc3BhdGgudG9BcnJheShuZXcgVVJMW2NsYXNzcGF0aC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgVVJMW10gZ2V0RmluYWxQcmVwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChwcmVwZW5kQm9vdHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBib290cGF0aEluZm9bMF07Ci0JCWVsc2UKLQkJCXJldHVybiAoVVJMW10pIHByZXBlbmRCb290cGF0aC50b0FycmF5KG5ldyBVUkxbcHJlcGVuZEJvb3RwYXRoLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBVUkxbXSBnZXRGaW5hbEFwcGVuZEJvb3RwYXRoKCkgewotCQlpZiAoYXBwZW5kQm9vdHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBib290cGF0aEluZm9bMl07Ci0JCWVsc2UKLQkJCXJldHVybiAoVVJMW10pIGFwcGVuZEJvb3RwYXRoLnRvQXJyYXkobmV3IFVSTFthcHBlbmRCb290cGF0aC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaW5hbEphdmFMaWJyYXJ5UGF0aCgpIHsKLQkJaWYgKGphdmFMaWJyYXJ5UGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWVsc2UKLQkJCXJldHVybiBqYXZhTGlicmFyeVBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2xhc3NwYXRoKCkgewotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLQkJCWNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoSW5mby5sZW5ndGgpOwotCQkJYWRkQWxsKGNsYXNzcGF0aCwgY2xhc3NwYXRoSW5mbywgLTEpOwotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJlcGVuZEJvb3RwYXRoKCkgewotCQlpZiAocHJlcGVuZEJvb3RwYXRoID09IG51bGwpIHsKLQkJCWlmIChib290cGF0aEluZm9bMF0gIT0gbnVsbCkgewotCQkJCXByZXBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoYm9vdHBhdGhJbmZvWzBdLmxlbmd0aCk7Ci0JCQkJYWRkQWxsKHByZXBlbmRCb290cGF0aCwgYm9vdHBhdGhJbmZvWzBdLCAtMSk7Ci0JCQl9IGVsc2UKLQkJCQlwcmVwZW5kQm9vdHBhdGggPSBuZXcgQXJyYXlMaXN0KDEpOwotCQl9Ci0JCXJldHVybiBwcmVwZW5kQm9vdHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXBwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChhcHBlbmRCb290cGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAoYm9vdHBhdGhJbmZvWzJdICE9IG51bGwpIHsKLQkJCQlhcHBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoYm9vdHBhdGhJbmZvWzJdLmxlbmd0aCk7Ci0JCQkJYWRkQWxsKGFwcGVuZEJvb3RwYXRoLCBib290cGF0aEluZm9bMl0sIC0xKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZEJvb3RwYXRoID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJfQotCQlyZXR1cm4gYXBwZW5kQm9vdHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0SmF2YUxpYnJhcnlQYXRoKCkgewotCQlpZiAoamF2YUxpYnJhcnlQYXRoID09IG51bGwpIHsKLQkJCWphdmFMaWJyYXJ5UGF0aCA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCX0KLQkJcmV0dXJuIGphdmFMaWJyYXJ5UGF0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGwoTGlzdCB0b0xpc3QsIE9iamVjdFtdIGFycmF5LCBpbnQgbG9jKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCS8vIE5lZWQgYSBkdXAgY2hlY2ssIHNvbWV0aW1lcyBkdXBzIGNvbWUgaW4gZXNwZWNpYWxseSBkdXJpbmcgZGV2ZWxvcG1lbnQKLQkJCWlmICh0b0xpc3QuY29udGFpbnMoYXJyYXlbaV0pKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxvYyA9PSAtMSkKLQkJCQl0b0xpc3QuYWRkKGFycmF5W2ldKTsKLQkJCWVsc2UKLQkJCQl0b0xpc3QuYWRkKGxvYysrLCBhcnJheVtpXSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb2NhdGlvbnMoTGlzdCB0b0xpc3QsIElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlVUkwgbG9jYXRpb24gPSBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhUb1VSTChlbnRyeS5nZXRMb2NhdGlvbigpKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICF0b0xpc3QuY29udGFpbnMobG9jYXRpb24pKQotCQkJCXRvTGlzdC5hZGQobG9jYXRpb24pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBsYXVuY2hJbmZvLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZVByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBwcm9qUGF0aCA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aChqcHJvamVjdCk7Ci0JCWJvb2xlYW4ganJlQ29udGFpbmVyRm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qUGF0aC5sZW5ndGg7IGkrKykgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHByb2pQYXRoW2ldOwotCQkJaWYgKGVudHJ5LmdldENsYXNzcGF0aFByb3BlcnR5KCkgPT0gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUwotCQkJCQl8fCBlbnRyeS5nZXRDbGFzc3BhdGhQcm9wZXJ0eSgpID09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuU1RBTkRBUkRfQ0xBU1NFUykgewotCQkJCWludCBlbnRyeUtpbmQgPSBlbnRyeS5nZXRDbGFzc3BhdGhFbnRyeSgpLmdldEVudHJ5S2luZCgpOwotCQkJCVN0cmluZyBzZWdtZW50MCA9IGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApOwotCQkJCWlmIChlbnRyeUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUi5lcXVhbHMoc2VnbWVudDApCi0JCQkJCQl8fCBlbnRyeUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAmJiBKYXZhUnVudGltZS5KUkVMSUJfVkFSSUFCTEUuZXF1YWxzKHNlZ21lbnQwKSkgewotCQkJCQlqcmVDb250YWluZXJGb3VuZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGpyZUNvbnRhaW5lckZvdW5kKQotCQkJCQkJYWRkTG9jYXRpb25zKGdldEFwcGVuZEJvb3RwYXRoKCksIEphdmFSdW50aW1lLnJlc29sdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnksIGpwcm9qZWN0KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWFkZExvY2F0aW9ucyhnZXRQcmVwZW5kQm9vdHBhdGgoKSwgSmF2YVJ1bnRpbWUucmVzb2x2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSwganByb2plY3QpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWFkZExvY2F0aW9ucyhnZXRDbGFzc3BhdGgoKSwgSmF2YVJ1bnRpbWUucmVzb2x2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSwganByb2plY3QpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoU3RyaW5nIGNsYXNzcGF0aCwgaW50IHR5cGVGbGFnKSB7Ci0JCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoVG9VUkwoY2xhc3NwYXRoKSwgdHlwZUZsYWcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgoamF2YS5uZXQuVVJMLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChVUkwgY2xhc3NwYXRoVVJMLCBpbnQgdHlwZUZsYWcpIHsKLQkJaWYgKGNsYXNzcGF0aFVSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzd2l0Y2ggKHR5cGVGbGFnKSB7Ci0JCQljYXNlIFBSRVBFTkRfQk9PVF9DTEFTU1BBVEg6Ci0JCQkJaWYgKCFnZXRQcmVwZW5kQm9vdHBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRQcmVwZW5kQm9vdHBhdGgoKS5hZGQoY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJFUEVORF9VU0VSX0NMQVNTUEFUSDoKLQkJCQlpZiAoIWdldENsYXNzcGF0aCgpLmNvbnRhaW5zKGNsYXNzcGF0aFVSTCkpCi0JCQkJCWdldENsYXNzcGF0aCgpLmFkZCgwLCBjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfVVNFUl9DTEFTU1BBVEg6Ci0JCQkJaWYgKCFnZXRDbGFzc3BhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRDbGFzc3BhdGgoKS5hZGQoY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQRU5EX0JPT1RfQ0xBU1NQQVRIOgotCQkJCWlmICghZ2V0QXBwZW5kQm9vdHBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRBcHBlbmRCb290cGF0aCgpLmFkZChjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg6Ci0JCQkJaWYgKCFnZXRKYXZhTGlicmFyeVBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRKYXZhTGlicmFyeVBhdGgoKS5hZGQoY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZSwgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSBidW5kbGUsIFN0cmluZyByZWxhdGl2ZVBhdGgsIGludCB0eXBlRmxhZywgYm9vbGVhbiBubHNMb2NhbGl6ZSkgewotCQkvLyBJZiBub3QgbmxzIGxvY2FsaXplLCBvciBpZiBpdCBpcyBqYXZhIGxpYnJhcnkgcGF0aCwgdGhlbiBqdXN0IGZpbmQgdGhlIG9uZSBpbiB0aGUgcGx1Z2luL2ZyYWdtZW50IGFuZCBhZGQgaXQuCi0JCWlmIChubHNMb2NhbGl6ZSkKLQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgcmVsYXRpdmVQYXRoKSwgdHlwZUZsYWcpOwotCQllbHNlIGlmICh0eXBlRmxhZyA9PSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIKSB7Ci0JCQlpZiAocmVsYXRpdmVQYXRoID09IG51bGwgfHwgcmVsYXRpdmVQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBQREUgaXMgbm90IGhlcmUgdG8gaGVscCB1cyBleHRyYWN0IHRoYXQgQCMkIGRsbAotCQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nKCJDYW4ndCBleHRyYWN0IGEgZGlyZWN0b3J5IGZyb20gdGhlIHJvb3Qgb2YgYSBwbHVnaW4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlVUkwgY29udHJpYnV0aW9uID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgcmVsYXRpdmVQYXRoKTsKLQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoY29udHJpYnV0aW9uLCB0eXBlRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmVsYXRpdmVQYXRoICE9IG51bGwpCi0JCQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KGJ1bmRsZSwgcmVsYXRpdmVQYXRoKSwgdHlwZUZsYWcpOwotCQkJZWxzZQotCQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVCdW5kbGUoYnVuZGxlKSwgdHlwZUZsYWcpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZUNsYXNzcGF0aChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChCdW5kbGUgYnVuZGxlLCBJUGF0aCByZWxhdGl2ZVBhdGgsIGludCB0eXBlRmxhZywgYm9vbGVhbiBubHNMb2NhbGl6ZSkgewotCQlpZiAobmxzTG9jYWxpemUpCi0JCQlpZiAocmVsYXRpdmVQYXRoICE9IG51bGwpCi0JCQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCByZWxhdGl2ZVBhdGgpLCB0eXBlRmxhZyk7Ci0JCQllbHNlCi0JCQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUpLCB0eXBlRmxhZyk7Ci0JCWVsc2UgaWYgKHR5cGVGbGFnID09IElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEgpIHsKLQkJCWlmIChyZWxhdGl2ZVBhdGggPT0gbnVsbCB8fCByZWxhdGl2ZVBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJCS8vIFBERSBpcyBub3QgaGVyZSB0byBoZWxwIHVzIGV4dHJhY3QgdGhhdCBAIyQgZGxsCi0JCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2coIkNhbid0IGV4dHJhY3QgYSBkaXJlY3RvcnkgZnJvbSB0aGUgcm9vdCBvZiBhIHBsdWdpbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCVVSTCBjb250cmlidXRpb24gPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCByZWxhdGl2ZVBhdGgpOwotCQkJY29udHJpYnV0ZUNsYXNzcGF0aChjb250cmlidXRpb24sIHR5cGVGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWxhdGl2ZVBhdGggIT0gbnVsbCkKLQkJCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoYnVuZGxlLCByZWxhdGl2ZVBhdGgpLCB0eXBlRmxhZyk7Ci0JCQllbHNlCi0JCQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUJ1bmRsZShidW5kbGUpLCB0eXBlRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmdbXSwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoU3RyaW5nW10gY2xhc3NwYXRocywgaW50IHR5cGVGbGFnKSB7Ci0JCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKGNsYXNzcGF0aHMpLCB0eXBlRmxhZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZUNsYXNzcGF0aChqYXZhLm5ldC5VUkxbXSwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10gY2xhc3NwYXRoVVJMcywgaW50IHR5cGVGbGFnKSB7Ci0JCWlmIChjbGFzc3BhdGhVUkxzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN3aXRjaCAodHlwZUZsYWcpIHsKLQkJCWNhc2UgUFJFUEVORF9CT09UX0NMQVNTUEFUSDoKLQkJCQlhZGRBbGwoZ2V0UHJlcGVuZEJvb3RwYXRoKCksIGNsYXNzcGF0aFVSTHMsIC0xKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJFUEVORF9VU0VSX0NMQVNTUEFUSDoKLQkJCQlhZGRBbGwoZ2V0Q2xhc3NwYXRoKCksIGNsYXNzcGF0aFVSTHMsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfVVNFUl9DTEFTU1BBVEg6Ci0JCQkJYWRkQWxsKGdldENsYXNzcGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAtMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUEVORF9CT09UX0NMQVNTUEFUSDoKLQkJCQlhZGRBbGwoZ2V0QXBwZW5kQm9vdHBhdGgoKSwgY2xhc3NwYXRoVVJMcywgLTEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg6Ci0JCQkJYWRkQWxsKGdldEphdmFMaWJyYXJ5UGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAtMSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0xvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTk3NzJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogJFJDU2ZpbGU6IExvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMzUgJCAkRGF0ZTogMjAwNi8wNS8yMyAxNTo0MzowMyAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuRXhwcmVzc2lvbkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3QuUkVNUmVnaXN0ZXJBV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogTGF1bmNoIERlbGVnYXRlIGZvciBsYXVuY2hpbmcgTG9jYWwgKGkuZS4gcmVtb3RlIHZtIGlzIG9uIGxvY2FsIHN5c3RlbSkuIEhlcmUgInJlbW90ZSIgbWVhbnMgdGhlCi0gKiByZWdpc3RyeSBpcyBub3QgaW4gdGhlIElERSBidXQgaW4gYSBzZXBhcmF0ZSBWTSwgYW5kICJsb2NhbCIgbWVhbnMgdGhhdCBpcyBpbiBvbiB0aGUgbG9jYWwKLSAqIHBoeXNpY2FsIG1hY2hpbmUgYW5kIG5vdCBvbiBhIHNlcGFyYXRlIG1hY2hpbmUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2xhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBsYXVuY2hLZXkgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX0xBVU5DSF9LRVksIChTdHJpbmcpIG51bGwpOwotCQlpZiAobGF1bmNoS2V5ID09IG51bGwpCi0JCQlhYm9ydChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5UmVtb3RlTm9MYXVuY2hLZXksIG51bGwsIDApOyAKLQotCQkvLyBJbiBFY2xpcHNlLCBldmVuIGlmIHByaXZhdGUsIGEgbGF1bmNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgZGVidWcgcHJvY2VzcyB0cmVlIGFuZCBpbiB0aGUgY29uc29sZSB2aWV3ZXIuCi0JCS8vIFRvIGJlIGFic29sdXRlbHkgcHJpdmF0ZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGxhdW5jaCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLgotCQlpZiAoUHJveHlMYXVuY2hTdXBwb3J0LkFUVFJfUFJJVkFURSAhPSBudWxsICYmIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUsIGZhbHNlKSkgCi0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLnJlbW92ZUxhdW5jaChsYXVuY2gpOwkJCi0JCWlmIChwbSA9PSBudWxsKSB7Ci0JCQlwbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfVk1fVElUTEUsIChTdHJpbmcpIG51bGwpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlSZW1vdGVWTU5hbWUsIG5ldyBPYmplY3RbXSB7IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6ICIiIH0pOyAgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eVJlbW90ZVZNTmFtZVdpdGhDb21tZW50LCBuZXcgT2JqZWN0W10geyBwcm9qZWN0ICE9IG51bGwgPyBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgOiAiIiwgbmFtZSB9KTsgIC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgc3RlcElkID0gIkxhdW5jaCBWTSAoICIgKyBuYW1lICsgIiApIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcChzdGVwSWQpOwotCQkvLyBQcm9ibGVtIHdpdGggbGF1bmNoLCBjYW4ndCBoYXZlIGRvdWJsZS1xdW90ZXMgaW4gdm1OYW1lLgotCQlpZiAobmFtZS5pbmRleE9mKCciJykgIT0gLTEpCi0JCQluYW1lID0gbmFtZS5yZXBsYWNlKCciJywgJ1wnJyk7Ci0KLQkJcG0uYmVnaW5UYXNrKCIiLCA1MDApOyAvLyROT04tTkxTLTEkCi0JCXBtLnN1YlRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eVJlbW90ZUxhdW5jaFZNLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pKTsgCi0JCS8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJVk1JbnN0YWxsIHZtID0gdmVyaWZ5Vk1JbnN0YWxsKGNvbmZpZ3VyYXRpb24pOwotCi0JCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJaWYgKHJ1bm5lciA9PSBudWxsKSB7Ci0JCQlhYm9ydChNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X05vUnVubmVyX0VSUk9SXywgbmV3IE9iamVjdFtdIHsgbmFtZSB9KSwgbnVsbCwgMCk7IAotCQl9Ci0KLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkgewotCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzCi0JCVN0cmluZ1tdIGVudnAgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldEVudmlyb25tZW50KGNvbmZpZ3VyYXRpb24pOwotCi0JCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCVN0cmluZyBwZ21BcmdzID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0KLQkJLy8gVk0tc3BlY2lmaWMgYXR0cmlidXRlcwotCQlNYXAgdm1BdHRyaWJ1dGVzTWFwID0gZ2V0Vk1TcGVjaWZpY0F0dHJpYnV0ZXNNYXAoY29uZmlndXJhdGlvbik7Ci0KLQkJcG0ud29ya2VkKDEwMCk7Ci0JCQotCQkvLyBOb3cgbGV0J3MgZ2V0IHRoZSBjbGFzc3BhdGhzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgY29udHJpYnV0b3JzLgotCQlVUkxbXSBjbGFzc3BhdGggPSBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoZ2V0Q2xhc3NwYXRoKGNvbmZpZ3VyYXRpb24pKTsKLQkJU3RyaW5nW11bXSBib290cGF0aEluZm9TdHJpbmdzID0gZ2V0Qm9vdHBhdGhFeHQodm1BdHRyaWJ1dGVzTWFwKTsKLQkJVVJMW11bXSBib290cGF0aEluZm8gPSBuZXcgVVJMW11bXXsKLQkJCQlQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoYm9vdHBhdGhJbmZvU3RyaW5nc1swXSksCi0JCQkJUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKGJvb3RwYXRoSW5mb1N0cmluZ3NbMV0pLAotCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChib290cGF0aEluZm9TdHJpbmdzWzJdKSwKLQkJfTsKLQkJUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IFByb3h5TGF1bmNoU3VwcG9ydC5nZXRJbmZvKGxhdW5jaEtleSk7Ci0JCWZpbmFsIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlidXRvcnMgPSBsYXVuY2hJbmZvLmNvbnRyaWJ1dG9yczsKLQkJZmluYWwgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlciBjb250cm9sbGVyID0KLQkJCW5ldyBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyKGNsYXNzcGF0aCwgYm9vdHBhdGhJbmZvLCBsYXVuY2hJbmZvKTsKLQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKSB7CQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQljb250cmlidXRvcnNbaWldLmNvbnRyaWJ1dGVDbGFzc3BhdGhzKGNvbnRyb2xsZXIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgaW4gdGhlIHJlcXVpcmVkIG9uZXMgYnkgdGhlIFByb3h5IHN1cHBvcnQuIFRoZXNlIGFyZSBoYXJkLWNvZGVkIHNpbmNlIHRoZXkgYXJlCi0JCS8vIHJlcXVpcmVkLgotCQlQcm94eVJlbW90ZVV0aWwudXBkYXRlQ2xhc3NQYXRocyhjb250cm9sbGVyKTsKLQkJYWRkSW5GcmFnbWVudExpYnJhcmllcyhjb250cm9sbGVyLCBsYXVuY2hJbmZvLmdldENvbmZpZ0luZm8oKSk7Ci0KLQkJY2xhc3NwYXRoID0gY29udHJvbGxlci5nZXRGaW5hbENsYXNzcGF0aCgpOwotCQlpZiAoYm9vdHBhdGhJbmZvWzBdICE9IGNvbnRyb2xsZXIuZ2V0RmluYWxQcmVwZW5kQm9vdHBhdGgoKSkgewotCQkgICAgaWYgKHZtQXR0cmlidXRlc01hcCA9PSBudWxsKQotCQkgICAgICAgIHZtQXR0cmlidXRlc01hcCA9IG5ldyBIYXNoTWFwKDIpOwotCQkgICAgdm1BdHRyaWJ1dGVzTWFwLnB1dChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSF9QUkVQRU5ELCBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFVSTHNUb1N0cmluZ3MoYm9vdHBhdGhJbmZvWzBdKSk7Ci0JCX0KLQkJaWYgKGJvb3RwYXRoSW5mb1syXSAhPSBjb250cm9sbGVyLmdldEZpbmFsQXBwZW5kQm9vdHBhdGgoKSkgewotCQkgICAgaWYgKHZtQXR0cmlidXRlc01hcCA9PSBudWxsKQotCQkgICAgICAgIHZtQXR0cmlidXRlc01hcCA9IG5ldyBIYXNoTWFwKDIpOwotCQkgICAgdm1BdHRyaWJ1dGVzTWFwLnB1dChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSF9BUFBFTkQsIFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0VVJMc1RvU3RyaW5ncyhib290cGF0aEluZm9bMl0pKTsKLQkJfQotCi0JCS8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJcG0ud29ya2VkKDEwMCk7Ci0KLQkJLy8gQ3JlYXRlIFZNIGNvbmZpZwotCQlWTVJ1bm5lckNvbmZpZ3VyYXRpb24gcnVuQ29uZmlnID0KLQkJCW5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuUmVtb3RlVk1BcHBsaWNhdGlvbiIsIFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0VVJMc1RvU3RyaW5ncyhjbGFzc3BhdGgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KFByb3h5UmVtb3RlVXRpbC5nZXRSZWdpc3RyeUNvbnRyb2xsZXIoKSwgbmFtZSk7Ci0JCUludGVnZXIgcmVnaXN0cnlLZXkgPSByZWdpc3RyeS5nZXRSZWdpc3RyeUtleSgpOwotCi0JCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJ1ZlNpemUgPT0gbnVsbCkKLQkJCWJ1ZlNpemUgPSBuZXcgSW50ZWdlcigxNjAwMCk7Ci0KLQkJaW50IG1hc3RlclNlcnZlclBvcnQgPSBQcm94eVJlbW90ZVV0aWwuZ2V0UmVnaXN0cnlDb250cm9sbGVyKCkuZ2V0TWFzdGVyU29ja2V0UG9ydCgpOwotCi0JCS8vIFNlZSBpZiBkZWJ1ZyBtb2RlIGlzIHJlcXVlc3RlZC4KLQkJRGVidWdNb2RlSGVscGVyIGRoID0gbmV3IERlYnVnTW9kZUhlbHBlcigpOwotCQlib29sZWFuIGRlYnVnTW9kZSA9IGRoLmRlYnVnTW9kZShuYW1lKTsKLQkJYm9vbGVhbiB1c2VOb3ZlcmlmeSA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcm94eVBsdWdpbi5QUkVGRVJFTkNFU19WTV9OT1ZFUklGWV9LRVkpOwotCi0JCVN0cmluZ1tdIGV2bUFyZ3MgPSBleGVjQXJncy5nZXRWTUFyZ3VtZW50c0FycmF5KCk7Ci0JCQotCQlpbnQgZXh0cmFBcmdzID0gNDsJLy8gTnVtYmVyIG9mIGV4dHJhIHN0YW5kYXJkIGFyZ3MgYWRkZWQgKGlmIG51bWJlciBjaGFuZ2VzIGJlbG93LCB0aGlzIG11c3QgY2hhbmdlKQotCQlpZiAoZGVidWdNb2RlKQotCQkJZXh0cmFBcmdzKz00OwkvLyBOdW1iZXIgb2YgZXh0cmEgYXJncyBhZGRlZCBmb3IgZGVidWcgbW9kZSAoaWYgbnVtYmVyIGNoYW5nZXMgYmVsb3csIHRoaXMgbXVzdCBjaGFuZ2UpLgotCQlpZih1c2VOb3ZlcmlmeSkKLQkJCWV4dHJhQXJncysrOyAvLyBBbiBleHRyYSBhcmcgYWRkZWQgZm9yICctbm92ZXJpZnknIGZsYWcgKGlmIG51bWJlciBjaGFuZ2VzIGJlbG93LCB0aGlzIG11c3QgY2hhbmdlKS4KLQkJCi0JCWJvb2xlYW4gdXNlRXhwcmVzc2lvblRyYWNpbmcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIFByb3h5TGF1bmNoU3VwcG9ydC5FWFBSRVNTSU9OX1RSQUNJTkcpKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIGV4cHJlc3Npb25UcmFjaW5nVGhyZXNob2xkID0gLTE7Ci0JCWlmICh1c2VFeHByZXNzaW9uVHJhY2luZykgewotCQkJZXh0cmFBcmdzKys7Ci0JCQlTdHJpbmcgdGhyZXNob2xkU3RyaW5nID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eUxhdW5jaFN1cHBvcnQuRVhQUkVTU0lPTl9UUkFDRUlOR19USU1FUl9USFJFU0hPTEQpOwotCQkJaWYgKHRocmVzaG9sZFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXhwcmVzc2lvblRyYWNpbmdUaHJlc2hvbGQgPSBMb25nLnZhbHVlT2YodGhyZXNob2xkU3RyaW5nKS5sb25nVmFsdWUoKTsKLQkJCQkJZXh0cmFBcmdzKys7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpc3QgamF2YUxpYlBhdGhzID0gY29udHJvbGxlci5nZXRGaW5hbEphdmFMaWJyYXJ5UGF0aCgpOwotCQlpbnQgZXhpc3RpbmdMaWJwYXRocyA9IC0xOwotCQlpZiAoIWphdmFMaWJQYXRocy5pc0VtcHR5KCkpIHsKLQkJCS8vIGZpcnN0IG5lZWQgdG8gc2VlIGlmIGphdmEgbGliIHBhdGggYWxzbyBzcGVjaWZpZWQgaW4gc3RhbmRhcmQgYXJncyBieSBzb21lb25lIGNvbmZpZ3VyaW5nIHRoZSBjb25maWd1cmF0aW9uIGJ5IGhhbmQuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2bUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXZtQXJnc1tpXS5zdGFydHNXaXRoKCItRGphdmEubGlicmFyeS5wYXRoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBXZSBmb3VuZCBvbmUgYWxyZWFkeSBoZXJlLCBzYXZlIHRoZSBzcG90IHNvIHdlIHVwZGF0ZSBpdCBsYXRlci4KLQkJCQkJZXhpc3RpbmdMaWJwYXRocyA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChleGlzdGluZ0xpYnBhdGhzID09IC0xKQotCQkJCSsrZXh0cmFBcmdzOwkvLyBOZWVkIHRvIGhhdmUgcm9vbSBmb3Igb25lIG1vcmUuCi0JCX0KLQkJCi0JCVN0cmluZ1tdIGN2bUFyZ3MgPSBuZXcgU3RyaW5nW2V2bUFyZ3MubGVuZ3RoICsgZXh0cmFBcmdzXTsKLQkJU3lzdGVtLmFycmF5Y29weShldm1BcmdzLCAwLCBjdm1BcmdzLCBleHRyYUFyZ3MsIGV2bUFyZ3MubGVuZ3RoKTsJLy8gUHV0IGV4aXN0aW5nIGludG8gbmV3IGxpc3QgYXQgdGhlIGVuZC4JCQotCQkKLQkJaW50IGN2bUFyZ3NDb3VudD0wOwotCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRHByb3h5dm0ucmVnaXN0cnlLZXk9IiArIHJlZ2lzdHJ5S2V5OyAvLyROT04tTkxTLTEkCi0JCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EcHJveHl2bS5tYXN0ZXJQb3J0PSIgKyBTdHJpbmcudmFsdWVPZihtYXN0ZXJTZXJ2ZXJQb3J0KTsgLy8kTk9OLU5MUy0xJAotCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRHByb3h5dm0uYnVmc2l6ZT0iICsgYnVmU2l6ZTsgLy8kTk9OLU5MUy0xJAotCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRHByb3h5dm0uc2VydmVybmFtZT0iICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYodXNlTm92ZXJpZnkpCi0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItbm92ZXJpZnkiOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAodXNlRXhwcmVzc2lvblRyYWNpbmcpIHsKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EIitFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlRSQUNFKyI9dHJ1ZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4cHJlc3Npb25UcmFjaW5nVGhyZXNob2xkICE9IC0xKQotCQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EIitFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlRSQUNFX1RJTUVSX1RIUkVTSE9MRCsnPScrU3RyaW5nLnZhbHVlT2YoZXhwcmVzc2lvblRyYWNpbmdUaHJlc2hvbGQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJZiBpbiBkZWJ1ZyBtb2RlLCB3ZSBuZWVkIHRvIGZpbmQgYSBwb3J0IGZvciBpdCB0byB1c2UuCi0JCWludCBkcG9ydCA9IC0xOwotCQlpZiAoZGVidWdNb2RlKSB7Ci0JCQlkcG9ydCA9IGZpbmRVbnVzZWRMb2NhbFBvcnQoImxvY2FsaG9zdCIsIDUwMDAsIDE1MDAwLCBuZXcgaW50WzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLURqYXZhLmNvbXBpbGVyPU5PTkUiOyAvLyROT04tTkxTLTEkCi0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItWGRlYnVnIjsgLy8kTk9OLU5MUy0xJAotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLVhub2FnZW50IjsgLy8kTk9OLU5MUy0xJAotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksYWRkcmVzcz0iICsgZHBvcnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKCFqYXZhTGliUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYXBwZW5kVG8gPSBudWxsOwotCQkJaWYgKGV4aXN0aW5nTGlicGF0aHMgIT0gLTEpIHsKLQkJCQlhcHBlbmRUbyA9IG5ldyBTdHJpbmdCdWZmZXIoZXZtQXJnc1tleGlzdGluZ0xpYnBhdGhzXSk7IAotCQkJCWFwcGVuZFRvLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsJLy8gUGx1cyBhIHNlcGFyYXRvciBzbyB3ZSBjYW4gYXBwZW5kCi0JCQl9IGVsc2UgCi0JCQkJYXBwZW5kVG8gPSBuZXcgU3RyaW5nQnVmZmVyKCItRGphdmEubGlicmFyeS5wYXRoPSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgW10gbGliUGF0aHMgPSBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFVSTHNUb1N0cmluZ3MoKFVSTFtdKSBqYXZhTGliUGF0aHMudG9BcnJheShuZXcgVVJMW2phdmFMaWJQYXRocy5zaXplKCldKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYlBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVG8uYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcik7Ci0JCQkJYXBwZW5kVG8uYXBwZW5kKGxpYlBhdGhzW2ldKTsKLQkJCX0KLQkJCWlmIChleGlzdGluZ0xpYnBhdGhzICE9IC0xKQotCQkJCWN2bUFyZ3NbZXh0cmFBcmdzK2V4aXN0aW5nTGlicGF0aHNdID0gYXBwZW5kVG8udG9TdHJpbmcoKTsKLQkJCWVsc2UKLQkJCQljdm1BcmdzW2V4dHJhQXJncy0xXSA9IGFwcGVuZFRvLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlydW5Db25maWcuc2V0UHJvZ3JhbUFyZ3VtZW50cyhleGVjQXJncy5nZXRQcm9ncmFtQXJndW1lbnRzQXJyYXkoKSk7Ci0JCXJ1bkNvbmZpZy5zZXRFbnZpcm9ubWVudChlbnZwKTsKLQkJcnVuQ29uZmlnLnNldFZNQXJndW1lbnRzKGN2bUFyZ3MpOwotCQlydW5Db25maWcuc2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyTmFtZSk7Ci0JCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCi0JCS8vIEJvb3RwYXRoCi0JCXJ1bkNvbmZpZy5zZXRCb290Q2xhc3NQYXRoKGdldEJvb3RwYXRoKGNvbmZpZ3VyYXRpb24pKTsKLQotCQkvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0JCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXBtLndvcmtlZCgxMDApOwotCi0JCS8vIHNldCB0aGUgZGVmYXVsdCBzb3VyY2UgbG9jYXRvciBpZiByZXF1aXJlZAotCQlzZXREZWZhdWx0U291cmNlTG9jYXRvcihsYXVuY2gsIGNvbmZpZ3VyYXRpb24pOwotCi0JCS8vIExhdW5jaCB0aGUgY29uZmlndXJhdGlvbiAtIDEgdW5pdCBvZiB3b3JrCi0JCXJ1bm5lci5ydW4ocnVuQ29uZmlnLCBsYXVuY2gsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCi0JCS8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJUHJvY2Vzc1tdIHByb2Nlc3NlcyA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKTsKLQkJSVByb2Nlc3MgcHJvY2VzcyA9IHByb2Nlc3Nlc1swXTsgLy8gVGhlcmUgaXMgb25seSBvbmUuCi0JCS8vIENoZWNrIGlmIGl0IGlzIGFscmVhZHkgdGVybWluYXRlZC4gSWYgaXQgaXMsIHRoZW4gdGhlcmUgd2FzIGEgYmFkIGVycm9yLCBzbyBqdXN0Ci0JCS8vIHByaW50IG91dCB0aGUgcmVzdWx0cyBmcm9tIGl0LgotCQlpZiAocHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJSVN0cmVhbXNQcm94eSBzdFByb3h5ID0gcHJvY2Vzcy5nZXRTdHJlYW1zUHJveHkoKTsKLQkJCS8vIFVzaW5nIGEgcHJpbnRXcml0ZXIgZm9yIHByaW50bG4gY2FwYWJpbGl0eSwgYnV0IGl0IG5lZWRzIHRvIGJlIG9uIGFub3RoZXIKLQkJCS8vIHdyaXRlciwgd2hpY2ggd2lsbCBiZSBzdHJpbmcKLQkJCWphdmEuaW8uU3RyaW5nV3JpdGVyIHMgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKHMpOwotCi0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0lORk9fKTsgCi0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9DT01NQU5EX0xJTkUpOwotCQkJdy5wcmludGxuKHByb2Nlc3MuZ2V0QXR0cmlidXRlKElQcm9jZXNzLkFUVFJfQ01ETElORSkpOwotCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMSk7IAotCQkJdy5wcmludGxuKHN0UHJveHkuZ2V0RXJyb3JTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUyKTsgCi0JCQl3LnByaW50bG4oc3RQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUzKTsgCi0JCQl3LmNsb3NlKCk7Ci0KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X1Rlcm1pbmF0ZWRfdG9vX3Nvb25fRVJST1JfLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pOyAKLQkJCWRoLmRpc3BsYXlFcnJvck1lc3NhZ2UoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9FcnJvcl9UaXRsZSwgbXNnKTsgCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIHMudG9TdHJpbmcoKSwgbnVsbCkpOwotCQl9IGVsc2UgewotCQkJZmluYWwgU3RyaW5nIHRyYWNlTmFtZSA9IG5hbWU7Ci0JCQlJU3RyZWFtc1Byb3h5IGZTdHJlYW1zUHJveHkgPSBwcm9jZXNzLmdldFN0cmVhbXNQcm94eSgpOwotCi0JCQkvKioKLQkJCSAqIFN0cmVhbUxpc3RlbmVyLiBTaG91bGQgbm90IGJlIGNyZWF0ZWQgaWYgUHJveHlQbHVnaW4gbG9nZ2VyIGlzIG5vdCBsb2dnaW5nIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuCi0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQljbGFzcyBTdHJlYW1MaXN0ZW5lciBpbXBsZW1lbnRzIElTdHJlYW1MaXN0ZW5lciB7Ci0JCQkJU3RyaW5nIHRyYWNlUHJlZml4OwotCQkJCUxldmVsIGxldmVsOwotCQkJCUpvYiBwcmludEpvYjsJLy8gSm9iIHRvIHRyeSB0byBnYXRoZXIgcHJpbnRpbmcgdG9nZXRoZXIuCi0JCQkJTG9nZ2VyIGxvZ2dlcjsKLQkJCQlTdHJpbmdCdWZmZXIgZ2F0aGVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQkJCXsKLQkJCQkJbG9nZ2VyID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCk7Ci0JCQkJCXByaW50Sm9iID0gbmV3IEpvYigiIikgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQltb25pdG9yLmJlZ2luVGFzayhQcm94eVJlbW90ZU1lc3NhZ2VzLkxvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZV9Nb25pdG9yX1ByaW50UmVtb3RlVHJhY2VfVGV4dCwgMSk7IAotCQkJCQkJCXdoaWxlKHRydWUpIHsKLQkJCQkJCQkJU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0JCQkJCQkJCXN5bmNocm9uaXplZCAoZ2F0aGVyZWRUZXh0KSB7Ci0JCQkJCQkJCQlpZiAoZ2F0aGVyZWRUZXh0Lmxlbmd0aCgpIDw9IHRyYWNlUHJlZml4Lmxlbmd0aCgpKQotCQkJCQkJCQkJCWJyZWFrOwkvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIG5vIG1vcmUgdG8gcHJpbnQuCi0JCQkJCQkJCQlvdXRwdXQgPSBnYXRoZXJlZFRleHQudG9TdHJpbmcoKTsKLQkJCQkJCQkJCWdhdGhlcmVkVGV4dC5zZXRMZW5ndGgodHJhY2VQcmVmaXgubGVuZ3RoKCkpOwkvLyBSZXNldCB0aGUgbGVuZ3RoIHRvIHRoZSBwcmVmaXguCi0JCQkJCQkJCX0KLQkJCQkJCQkJbG9nZ2VyLmxvZyhvdXRwdXQsIGxldmVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXByaW50Sm9iLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXByaW50Sm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIFN0cmVhbUxpc3RlbmVyKFN0cmluZyB0eXBlLCBMZXZlbCBsZXZlbCwgTG9nZ2VyIGxvZ2dlcikgewotCQkJCQl0cmFjZVByZWZpeCA9IHRyYWNlTmFtZSArICc6JyArIHR5cGUgKyAnPicgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2F0aGVyZWRUZXh0LmFwcGVuZCh0cmFjZVByZWZpeCk7Ci0JCQkJCXRoaXMubGV2ZWwgPSBsZXZlbDsKLQkJCQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc3RyZWFtQXBwZW5kZWQoU3RyaW5nIG5ld1RleHQsIElTdHJlYW1Nb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJc3luY2hyb25pemVkKGdhdGhlcmVkVGV4dCkgewotCQkJCQkJZ2F0aGVyZWRUZXh0LmFwcGVuZChuZXdUZXh0KTsKLQkJCQkJfQotCQkJCQlwcmludEpvYi5zY2hlZHVsZSgxMDBMKTsJLy8gV2FpdCB0ZW50aCBvZiBzZWNvbmQgdG8gZ2F0aGVyIGFzIG11Y2ggYXMgY2FuIHRvZ2V0aGVyLgotCQkJCX0KLQkJCX07Ci0KLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkvLyBBbHdheXMgbGlzdGVuIHRvIFN5c3RlbS5lcnIgb3V0cHV0IGlmIHdlIGFyZSBhdCBsZWFzdCBsb2dnaW5nIHdhcm5pbmdzLgotCQkJCUlTdHJlYW1Nb25pdG9yIG1vbml0b3IgPSBmU3RyZWFtc1Byb3h5LmdldEVycm9yU3RyZWFtTW9uaXRvcigpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3IuYWRkTGlzdGVuZXIobmV3IFN0cmVhbUxpc3RlbmVyKCJlcnIiLCBMZXZlbC5XQVJOSU5HLCBsb2dnZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBJZiBkZWJ1ZyB0cmFjZSBpcyByZXF1ZXN0ZWQsIHRoZW4gYXR0YWNoIHRyYWNlIGxpc3RlbmVyIGZvciBTeXN0ZW0ub3V0Ci0JCQkvLyBFeHByZXNzaW9uIHRyYWNpbmcgcmVxdWlyZXMgZGVidWcgdHJhY2UgdG9vIGJlY2F1c2UgaXQgcHJpbnRzIHRvIHN5c291dC4gSG93ZXZlciwgaXQgcmVxdWVzdGluZyBleHByZXNzaW9uVHJhY2luZywgY2hhbmdlIGxvZ2dpbmcgbGV2ZWwgdG8gSU5GTywKLQkJCS8vIHdlIHdhbnQgdGhlbSB0byBzaG93IGlmIHRoaXMgdHJ1ZS4gSXQgaXMgY29uZnVzaW5nIHRvIGFsc28gaGF2ZSB0byBjaGFuZ2UgbG9nZ2luZyBsZXZlbCBpbiAub3B0aW9ucyBmaWxlLgotCQkJaWYgKHVzZUV4cHJlc3Npb25UcmFjaW5nKQotCQkJCWlmICghbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLklORk8pKQotCQkJCQlsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7Ci0JCQlpZiAodXNlRXhwcmVzc2lvblRyYWNpbmcgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eVJlbW90ZVV0aWwuREVCVUdfVk1fVFJBQ0VPVVQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gV2FudCB0byB0cmFjZSB0aGUgb3V0cHV0IG9mIHRoZSByZW1vdGUgdm0ncy4gQW5kIHdlIGFyZSBsb2dnaW5nIGF0IGxlYXN0IGxldmVsIGluZm8uCi0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5JTkZPKSkgewotCQkJCQlJU3RyZWFtTW9uaXRvciBtb25pdG9yID0gZlN0cmVhbXNQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCQltb25pdG9yLmFkZExpc3RlbmVyKG5ldyBTdHJlYW1MaXN0ZW5lcigib3V0IiwgTGV2ZWwuSU5GTywgbG9nZ2VyKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCi0JCQkJfQkJCQkJCQkKLQkJCX0KLQkJfQotCi0JCS8vIElmIGluIGRlYnVnIG1vZGUsIHRlc3RlciBtdXN0IHN0YXJ0IGRlYnVnZ2VyIGJlZm9yZSBnb2luZyBvbi4KLQkJaWYgKGRlYnVnTW9kZSkgewotCQkJaWYgKCFkaC5wcm9tcHRQb3J0KGRwb3J0KSkgewotCQkJCXByb2Nlc3MudGVybWluYXRlKCk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQkiRGVidWdnZXIgYXR0YWNoIGNhbmNlbGVkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbnVsbCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHNldCB1cCB0aGUgcmVnaXN0cnkuCi0JCXJlZ2lzdHJ5LmluaXRpYWxpemVSZWdpc3RyeShwcm9jZXNzKTsKLQkJbmV3IFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQluZXcgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IFJFTU1ldGhvZFByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0KLQkJaWYgKGRlYnVnTW9kZSB8fCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5mR2xvYmFsTm9UaW1lb3V0cykKLQkJCXJlZ2lzdHJ5LmZOb1RpbWVvdXRzID0gdHJ1ZTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfQVdUX1NXSU5HLCB0cnVlKSkKLQkJCVJFTVJlZ2lzdGVyQVdULnJlZ2lzdGVyQVdUKHJlZ2lzdHJ5KTsKLQotCQlsYXVuY2hJbmZvLnJlc3VsdFJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0KLQkJcG0uZG9uZSgpOwotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcChzdGVwSWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sbGVyCi0JICogQHBhcmFtIGluZm8gCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEluRnJhZ21lbnRMaWJyYXJpZXMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQREVDb250cmlidXRlQ2xhc3NwYXRoIGluc3RhbmNlID0gSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguSU5TVEFOQ0U7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpbnN0YW5jZS5nZXRQREVDb250cmlidXRpb25zKGNvbnRyb2xsZXIsIGluZm8pOwotCQl9Ci0JfQotCi0JLy8gVXRpbGl0aWVzIHRvIGZpbmQgdGhlIGZyZWUgcG9ydAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBmZ1JhbmRvbSA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRVbnVzZWRMb2NhbFBvcnQoU3RyaW5nIGhvc3QsIGludCBzZWFyY2hGcm9tLCBpbnQgc2VhcmNoVG8sIGludFtdIGV4Y2x1ZGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpbnQgcG9ydCA9IDA7Ci0JCQluZXdwb3J0IDogd2hpbGUgKHRydWUpIHsKLQkJCQlwb3J0ID0gZ2V0UmFuZG9tUG9ydChzZWFyY2hGcm9tLCBzZWFyY2hUbyk7Ci0JCQkJaWYgKGV4Y2x1ZGUgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgZSA9IDA7IGUgPCBleGNsdWRlLmxlbmd0aDsgZSsrKQotCQkJCQkJaWYgKHBvcnQgPT0gZXhjbHVkZVtlXSkKLQkJCQkJCQljb250aW51ZSBuZXdwb3J0OwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotCQkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHBvcnQ7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRSYW5kb21Qb3J0KGludCBsb3csIGludCBoaWdoKSB7Ci0JCXJldHVybiAoaW50KSAoZmdSYW5kb20ubmV4dEZsb2F0KCkgKiAoaGlnaCAtIGxvdykpICsgbG93OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdW10gZ2V0Qm9vdHBhdGhFeHQoTWFwIHZtTWFwKSB7Ci0JICAgIFN0cmluZ1tdW10gZXh0ID0gbmV3IFN0cmluZ1szXVtdOwotCSAgICBpZiAodm1NYXAgIT0gbnVsbCkgewotCQkgICAgZXh0WzBdID0gKFN0cmluZ1tdKSB2bU1hcC5nZXQoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQk9PVFBBVEhfUFJFUEVORCk7Ci0JCSAgICBleHRbMV0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSCk7Ci0JCSAgICBleHRbMl0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSF9BUFBFTkQpOwotCSAgICB9Ci0JICAgIHJldHVybiBleHQ7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL01lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDYwZTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmF3dC4qOwotLyoqCi0gKiBUaGlzIGlzIGFuIEFXVCBtZXNzYWdlIGRpYWxvZy4gSXQgd2lsbCBvbmx5IGJlIHVzZWQKLSAqIGlmIG5vdCBydW5uaW5nIGluIHRoZSB3b3JrYmVuY2ggYnkgdGhlIGRlYnVnIG1vZGUgaGVscGVyLgotICogSXQgd29uJ3QgYmUgbG9hZGVkIHVubGVzcyBBV1QgaXMgYXZhaWxhYmxlLCBzbyBpdCBjYW4gYmUKLSAqIGRpc3RyaWJ1dGVkIHdpdGhvdXQgY2F1c2luZyBwcm9ibGVtcyBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IGhhdmUgQVdUIGJlY2F1c2UgaXQgd29uJ3QgYmUgbG9hZGVkIGluIHRoYXQgY2FzZS4KLSAqLwotY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTQ3NjcwMzQ5MzcyMDY3MzQ1TDsKLQlwcml2YXRlIGphdmEuYXd0LlBhbmVsIGl2akNvbnRlbnRzUGFuZSA9IG51bGw7Ci0JSXZqRXZlbnRIYW5kbGVyIGl2akV2ZW50SGFuZGxlciA9IG5ldyBJdmpFdmVudEhhbmRsZXIoKTsKLQlwcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGl2alRleHRBcmVhMSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLmF3dC5CdXR0b24gaXZqQnV0dG9uMSA9IG51bGw7Ci0JcHVibGljIGludCByZXN1bHQgPSAyOwkvLyBOb3RoaW5nIGhpdCBpcyB0aGUgc2FtZSBhcyBidXR0b24gMi4KLQlwcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBpdmpCdXR0b24yID0gbnVsbDsKLQotY2xhc3MgSXZqRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIsIGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24xKCkpIAotCQkJCWNvbm5FdG9DMihlKTsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24yKCkpIAotCQkJCWNvbm5FdG9DMyhlKTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gTWVzc2FnZURpYWxvZy50aGlzKSAKLQkJCQljb25uRXRvQzEoZSk7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWljb25pZmllZChqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93SWNvbmlmaWVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JfTsKLS8qKgotICogTWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG93bmVyIGphdmEuYXd0LkZyYW1lCi0gKiBAcGFyYW0gdGl0bGUgamF2YS5sYW5nLlN0cmluZwotICogQHBhcmFtIG1vZGFsIGJvb2xlYW4KLSAqLwotcHVibGljIE1lc3NhZ2VEaWFsb2coRnJhbWUgb3duZXIsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgU3RyaW5nIG1zZywgU3RyaW5nIGJ1dHRvbjEsIFN0cmluZyBidXR0b24yKSB7Ci0Jc3VwZXIob3duZXIsIHRpdGxlLCBtb2RhbCk7Ci0KLQlpbml0aWFsaXplKCk7Ci0JZ2V0VGV4dEFyZWExKCkuc2V0VGV4dChtc2cpOwotCWdldEJ1dHRvbjEoKS5zZXRMYWJlbChidXR0b24xKTsKLQlpZiAoYnV0dG9uMiAhPSBudWxsKQotCQlnZXRCdXR0b24yKCkuc2V0TGFiZWwoYnV0dG9uMik7Ci0JZWxzZSB7Ci0JCS8vIFdlIG9ubHkgd2FudCBvbmUgYnV0dG9uLCBzbyByZW1vdmUgYnV0dG9uMgotCQlnZXRDb250ZW50c1BhbmUoKS5yZW1vdmUoZ2V0QnV0dG9uMigpKTsKLQl9Ci0JCi19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMTsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMjsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIGNvbm5FdG9DMTogIChNZXNzYWdlRGlhbG9nLndpbmRvdy53aW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50KSAtLT4gTWVzc2FnZURpYWxvZy5kaXNwb3NlKClWKQotICogQHBhcmFtIGFyZzEgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgdm9pZCBjb25uRXRvQzEoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgYXJnMSkgewotCXRyeSB7Ci0JCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJLy8gdXNlciBjb2RlIGVuZAotCQl0aGlzLmRpc3Bvc2UoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MyOiAgKEJ1dHRvbjEuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMihqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MzOiAgKEJ1dHRvbjIuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMyhqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogRGlzcGxheSBkaWFsb2cuCi0gKiBAcGFyYW0gYXJncyBqYXZhLmxhbmcuU3RyaW5nW10KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZG9pdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgYnV0dG9uMSwgU3RyaW5nIGJ1dHRvbjIpIHsKLQl0cnkgewotCQlGcmFtZSBmID0gbmV3IGphdmEuYXd0LkZyYW1lKHRpdGxlKTsKLQkJZi5zZXRWaXNpYmxlKHRydWUpOwotCQkvLyBOZWVkIHRvIG1hc3NhZ2UgdGhlIG1ldGhvZCBzaW5jZSBBV1QgZG9lc24ndCBoYXZlIHdvcmR3cmFwLiBUaGlzIGlzIGZvciBsZWZ0IHRvIHJpZ2h0IG9ubHkuCi0JCVN0cmluZyBtc2cgPSBtZXNzYWdlOwotCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA+IDk1KSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotbmV4dFNlZzoJd2hpbGUgKG1lc3NhZ2UubGVuZ3RoKCkgPiA5NSkgewotCQkJCS8vIFRvbyB3aWRlLCB3cmFwcGluZyBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MuCi0JCQkJZm9yIChpbnQgaT05NTsgMDw9aTsgaS0tKSB7Ci0JCQkJCWlmIChtZXNzYWdlLmNoYXJBdChpKSA9PSAnICcpIHsKLQkJCQkJCS8vIEJyZWFrIGhlcmUuCi0JCQkJCQltc2cgPSBtc2cgKyBtZXNzYWdlLnN1YnN0cmluZygwLCBpKSArICdcbic7Ci0JCQkJCQlpZiAoaSsxIDwgbWVzc2FnZS5sZW5ndGgoKSkKLQkJCQkJCQltZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoaSsxKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQltZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlIG5leHRTZWc7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgd2UgZ290IGhlcmUsIHRoZW4gdGhlcmUgd2VyZW4ndCBhbnkgc3BhY2VzIGluIHRoZSBmaXJzdCA4MCwgc28gbG9vayByaWdodCBmb3IgZmlyc3Qgc3BhY2UuCi0JCQkJZm9yIChpbnQgaT05NjsgaTxtZXNzYWdlLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKG1lc3NhZ2UuY2hhckF0KGkpID09ICcgJykgewotCQkJCQkJLy8gQnJlYWsgaGVyZQotCQkJCQkJbXNnID0gbXNnICsgbWVzc2FnZS5zdWJzdHJpbmcoMCwgaSkgKyAnXG4nOwotCQkJCQkJaWYgKGkrMSA8IG1lc3NhZ2UubGVuZ3RoKCkpCi0JCQkJCQkJbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGkrMSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZSBuZXh0U2VnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbXNnICs9IG1lc3NhZ2U7CS8vIE5vdyBwdXQgb24gd2hhdGV2ZXIgaXMgbGVmdC4KLQkJfQotCQlNZXNzYWdlRGlhbG9nIGFNZXNzYWdlRGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZix0aXRsZSx0cnVlLCBtc2csIGJ1dHRvbjEsIGJ1dHRvbjIpOwotCQlhTWVzc2FnZURpYWxvZy5wYWNrKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLmdldFRvb2xraXQoKS5iZWVwKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7Ci0JCWYuZGlzcG9zZSgpOwotCQlhTWVzc2FnZURpYWxvZy5kaXNwb3NlKCk7Ci0KLQkJcmV0dXJuIGFNZXNzYWdlRGlhbG9nLnJlc3VsdDsKLQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JfQotCi0JcmV0dXJuIDI7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgQnV0dG9uMSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBnZXRCdXR0b24xKCkgewotCWlmIChpdmpCdXR0b24xID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2akJ1dHRvbjEgPSBuZXcgamF2YS5hd3QuQnV0dG9uKCk7Ci0JCQlpdmpCdXR0b24xLnNldE5hbWUoIkJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaXZqQnV0dG9uMS5zZXRMYWJlbCgiQnV0dG9uMSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCX0gY2F0Y2ggKGphdmEubGFuZy5UaHJvd2FibGUgaXZqRXhjKSB7Ci0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezJ9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCQloYW5kbGVFeGNlcHRpb24oaXZqRXhjKTsKLQkJfQotCX0KLQlyZXR1cm4gaXZqQnV0dG9uMTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBCdXR0b24yIHByb3BlcnR5IHZhbHVlLgotICogQHJldHVybiBqYXZhLmF3dC5CdXR0b24KLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuQnV0dG9uIGdldEJ1dHRvbjIoKSB7Ci0JaWYgKGl2akJ1dHRvbjIgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQnV0dG9uMiA9IG5ldyBqYXZhLmF3dC5CdXR0b24oKTsKLQkJCWl2akJ1dHRvbjIuc2V0TmFtZSgiQnV0dG9uMiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpCdXR0b24yLnNldExhYmVsKCJCdXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCQl9Ci0JfQotCXJldHVybiBpdmpCdXR0b24yOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIENvbnRlbnRzUGFuZSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuUGFuZWwKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuUGFuZWwgZ2V0Q29udGVudHNQYW5lKCkgewotCWlmIChpdmpDb250ZW50c1BhbmUgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQ29udGVudHNQYW5lID0gbmV3IGphdmEuYXd0LlBhbmVsKCk7Ci0JCQlpdmpDb250ZW50c1BhbmUuc2V0TmFtZSgiQ29udGVudHNQYW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2akNvbnRlbnRzUGFuZS5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0VGV4dEFyZWExKCksIGdldFRleHRBcmVhMSgpLmdldE5hbWUoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0QnV0dG9uMSgpLCBnZXRCdXR0b24xKCkuZ2V0TmFtZSgpKTsKLQkJCWdldENvbnRlbnRzUGFuZSgpLmFkZChnZXRCdXR0b24yKCksIGdldEJ1dHRvbjIoKS5nZXROYW1lKCkpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2akNvbnRlbnRzUGFuZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBUZXh0QXJlYTEgcHJvcGVydHkgdmFsdWUuCi0gKiBAcmV0dXJuIGphdmEuYXd0LlRleHRBcmVhCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGdldFRleHRBcmVhMSgpIHsKLQlpZiAoaXZqVGV4dEFyZWExID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2alRleHRBcmVhMSA9IG5ldyBUZXh0QXJlYSgpOwotCQkJaXZqVGV4dEFyZWExLnNldE5hbWUoIlRleHRBcmVhMSIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpUZXh0QXJlYTEuc2V0VGV4dCgiVGV4dEFyZWExIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2alRleHRBcmVhMS5zZXRSb3dzKDIwKTsKLQkJCWl2alRleHRBcmVhMS5zZXRDb2x1bW5zKDEwMCk7Ci0JCQlpdmpUZXh0QXJlYTEuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2alRleHRBcmVhMTsKLX0KLS8qKgotICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBwYXJ0IHRocm93cyBhbiBleGNlcHRpb24uCi0gKiBAcGFyYW0gZXhjZXB0aW9uIGphdmEubGFuZy5UaHJvd2FibGUKLSAqLwotcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCi0JLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gcHJpbnQgdW5jYXVnaHQgZXhjZXB0aW9ucyB0byBzdGRvdXQgKi8KLQkvLyBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShMZXZlbC5XQVJOSU5HLCItLS0tLS0tLS0gVU5DQVVHSFQgRVhDRVBUSU9OIC0tLS0tLS0tLSIpOwotCS8vIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKExldmVsLldBUk5JTkcsZXhjZXB0aW9uKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZXMgY29ubmVjdGlvbnMKLSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGluaXRDb25uZWN0aW9ucygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JLy8gdXNlciBjb2RlIGVuZAotCXRoaXMuYWRkV2luZG93TGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24xKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24yKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgY2xhc3MuCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQl0cnkgewotCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCS8vIHVzZXIgY29kZSBlbmQKLQkJc2V0TmFtZSgiTWVzc2FnZURpYWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCXNldExheW91dChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlzZXRTaXplKDQyNiwgMjQwKTsKLQkJYWRkKGdldENvbnRlbnRzUGFuZSgpLCAiQ2VudGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdENvbm5lY3Rpb25zKCk7Ci0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JfQotCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkvLyB1c2VyIGNvZGUgZW5kCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGRkYjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJveHlSZW1vdGVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eVJlbW90ZU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19PVVRQVVRfRk9MREVSX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fQ09NTUFORF9MSU5FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZNX1RFUk1JTkFURURfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fVEVSTUlOQVRFRF9MSU5FMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWTV9URVJNSU5BVEVEX0xJTkUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZNX1RFUk1JTkFURURfTElORTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1RFX1ZNX1RSQUNFX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2Nhc3RfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YW50aWF0ZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZUNtZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4Y2VwdGlvbkVycm9yTXNnX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT0tfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eV9Ob1J1bm5lcl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlfRXJyb3JfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlfVGVybWluYXRlZF90b29fc29vbl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlSZW1vdGVWTU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlSZW1vdGVWTU5hbWVXaXRoQ29tbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVJlbW90ZU5vTGF1bmNoS2V5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5UmVtb3RlTGF1bmNoVk07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cEpvYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9DYWxsYmFja0Nvbm5lY3Rpb25Ob3RXb3JraW5nX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ29ubmVjdGlvbkNyZWF0aW9uRmFpbGVkX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0pvYl9UZXJtaW5hdGVQcm9jZXNzX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NvdWxkTm90Q3JlYXRlU29ja2V0Q29ubmVjdGlvblRvUmVtb3RlVk1fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1FeHByZXNzaW9uX0lPRXhjZXB0aW9uU2VlTG9nX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTUV4cHJlc3Npb25fQ29tbWFuZEV4Y2VwdGlvblNlZUxvZ19JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFByb3h5TGF1bmNoRGVsZWdhdGVfTW9uaXRvcl9QcmludFJlbW90ZVRyYWNlX1RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm94eVJlbW90ZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWVkOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eVJlbW90ZVV0aWwgewotCi0JLy8gRGVidWcgb3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1ZNID0gIi9yZW1vdGUvZGVidWcvZGVidWd2bSIsIC8vIEJyaW5nIHVwIGRlYnVnZ2VyIG9uIHJlbW90ZSB2bSdzLiAvLyROT04tTkxTLTEkCi0JCUlPX0NPTlNPTEUgPSAiL3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGUiLCAvLyBJTyBUaHJvdWdoIGNvbnNvbGUgKHN5c3RlbSBpbiBhbmQgb3V0KSBmb3IgYXNraW5nIHF1ZXN0aW9ucy4gLy8kTk9OLU5MUy0xJAotCQlERUJVR19WTV9UUkFDRU9VVCA9ICIvcmVtb3RlL2RlYnVnL3ZtdHJhY2VvdXQiLCAvLyBUcmFjZSB0aGUgb3V0cHV0IGZyb20gdGhlIHJlbW90ZSB2bSdzLiAvLyROT04tTkxTLTEkCi0JCU5PX1RJTUVPVVRTID0gIi9yZW1vdGUvZGVidWcvbm90aW1lb3V0cyI7CS8vIE5vIHNvY2tldCB0aW1lb3V0cyB3aGVuIHRhbGtpbmcgdG8gcmVtb3RlIHZtLiBUdXJuIHRoaXMgb24gd2hlbiBkb2luZyBjYWxsYmFjayB0ZXN0aW5nLiBOb3QgbmVlZGVkIG90aGVyd2lzZS4gLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIFJFTVJlZ2lzdHJ5Q29udHJvbGxlciBwbHVnaW5SZWdpc3RyeUNvbnRyb2xsZXI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSBjb250cm9sbGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJFTVJlZ2lzdHJ5Q29udHJvbGxlciBnZXRSZWdpc3RyeUNvbnRyb2xsZXIoKSB7Ci0JCXJldHVybiBwbHVnaW5SZWdpc3RyeUNvbnRyb2xsZXIgIT0gbnVsbCA/IHBsdWdpblJlZ2lzdHJ5Q29udHJvbGxlciA6IChwbHVnaW5SZWdpc3RyeUNvbnRyb2xsZXIgPSBuZXcgUkVNUmVnaXN0cnlDb250cm9sbGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gdXBkYXRlIGFueSBjbGFzcyBwYXRocyB3aXRoIGFueQotCSAqIHBhdGhzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byBhIFZNLiBJbiB0aGlzIGNhc2UsIGl0IGlzCi0JICogdGhlIHJlbW90ZXZtLmphciBhbmQgdGhlIHJlbW90ZWNvbW1vbi5qYXIgdGhhdCBuZWVkIHRvIGJlIGFkZGVkLiBUaGUgZmlyc3QgamFyIGNvbnRhaW5zCi0JICogdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgcmVtb3RlIHZtIGFuZCBsaXN0ZW4gZm9yIGNvbW1hbmRzLiBUaGUgc2Vjb25kIGphciBjb250YWlucwotCSAqIHRoZSBjb21tb24gY29kZSB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIHNoYXJlZCBvbiBib3RoIHRoZSBJREUgc2lkZSBhbmQgcmVtb3RlIHNpZGUuIEl0Ci0JICogaXMgdGhlIGludGVyZmFjZSBjb2RlIHNvIHRoYXQgdGhleSBib3RoIHRhbGsgdGhlIHNhbWUgbGFuZ3VhZ2UuCi0JICogc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NQYXRocyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgewotCQlCdW5kbGUgcHJveHlCdW5kbGUgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKTsKLQkJLy8gTmVlZCB0byBoYXZlIG91ciBqYXJzIGF0IHRoZSBiZWdpbm5pbmcuIChTdHJ1dHMgY2F1c2VzIGEgcHJvYmxlbSBiZWNhdXNlIAotCQkvLyB0aGV5IGhhdmUgYSBqYXIgKGNvbW1vbnMtZmlsZXVwbG9hZC5qYXIpIHRoYXQgaWYgd2hlbiBzZWFyY2hpbmcgZm9yIGEgY2xhc3MgYW5kCi0JCS8vIHRoaXMgamFyIGlzIHJlYWNoZWQsIGl0IGNhdXNlcyB0aGUgY2xhc3MgbG9hZGVyIHRvIGJhcmYuIE91ciBqYXJzIHVzZWQgdG8gYmUgYXQKLQkJLy8gdGhlIGVuZCwgYW5kIHNvIGl0IGZvdW5kIHRoZSBmaWxldXBsb2FkIGphciBmaXJzdCBhbmQgbm8gcmVtb3RlIHZtIGNvdWxkIGJlIHN0YXJ0ZWQKLQkJLy8gYmVjYXVzZSBvZiB0aGlzLgotCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgocHJveHlCdW5kbGUsIChJUGF0aCkgbnVsbCwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLlBSRVBFTkRfVVNFUl9DTEFTU1BBVEgsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgocHJveHlCdW5kbGUsICJ2bS9yZW1vdGV2bS5qYXIiLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuUFJFUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGE1MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBJUkVNQmVhblByb3h5IHRoYXQgZG9lc24ndAotICogaGF2ZSB0aGUgYmVhbiB0eXBlIHN0b3JlZCBpbiBpdC4gVGhlIHN1YmNsYXNzZXMgd2lsbAotICogc3VwcGx5IGl0LiBJdCBkb2VzIGhvd2V2ZXIgaGF2ZSBhbiBJRCBiZWNhdXNlIGl0IGRvZXMKLSAqIGV4aXN0IG92ZXIgb24gdGhlIHJlbW90ZSBWTS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUFic3RyYWN0QmVhblByb3h5IGltcGxlbWVudHMgSVJFTUJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5OwotCXByaXZhdGUgSW50ZWdlciBmSUQ7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBiZWFuIHdlIGFyZSBwcm94eWluZy4gIFdlIGFyZSBhIHByb3h5IGZvciBhIGJlYW4gcnVubmluZyBvbiB0aGUgcmVtb3RlIFZNLiAKLQkgKi8KLQlwcm90ZWN0ZWQgUkVNQWJzdHJhY3RCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpewotCQlmRmFjdG9yeSA9IGFSZWdpc3RyeTsKLQkJZklEID0gYW5JRDsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjoKLQkgKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0JICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotCSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0JICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotCSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHN1cGVyLmVxdWFscyhhbk9iamVjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSUJlYW5Qcm94eSAmJiAhKGFuT2JqZWN0IGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblByb3h5KSAmJiBmRmFjdG9yeS5pc1ZhbGlkKCkgJiYgKChJQmVhblByb3h5KSBhbk9iamVjdCkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSA9PSBmRmFjdG9yeSkKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlIG90aGVyIGlzIGEgYmVhbiBwcm94eSBhbmQgaXMgbm90IGEgY29uc3RhbnQgb25lLCBsZXQgdGhlIHNlcnZlciBkbyB0aGUgY2hlY2suCi0JCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0RXF1YWxzKCkuaW52b2tlKHRoaXMsIChJQmVhblByb3h5KSBhbk9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJcmV0dXJuIHRoaXMgPT0gYUJlYW5Qcm94eTsJLy8gV2UgY2FuIGJlIGFzc3VyZWQgaW4gUmVtb3RlIFByb3h5IHRoYXQgaWRlbnRpdHkgb2YgcHJveHkgYW5kIGlkZW50aXR5IG9mIG9iamVjdCBhcmUgdGhlIHNhbWUuCi0JfQotCQkKLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmRmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IElELiBBbiBpbnRlcm5hbCBtZXRob2QgdG8gYmUgdXNlZCBvbmx5IHdpdGhpbiB0aGUgUHJveHlGYWN0b3J5IGZhbWlseS4KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0JCi0JLyoqCi0JICogaXNWYWxpZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZklEICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFByb3h5IGlzIGFib3V0IHRvIGJlIHJlbGVhc2VkLCBNVVNUIG1hcmsgaXQgaW52YWxpZC4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkLiBSZXNvdXJjZXMgY2FuIGFsc28gYmUgY2xlYW5lZCB1cAotCSAqIGlmIHRoZXkgYXJlIGJlaW5nIGhlbGQgYW5kIG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KLQkgKgotCSAqIE5PVEU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgcHJveHkKLQkgKiBpcyBleHBsaWNpdGx5IHJlbGVhc2VkLiBJZiBpdCBpcyBzaW1wbHkgZ2FyYmFnZSBjb2xsZWN0ZWQsCi0JICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuIFNpbXBsZSBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKiBtZWFucyB0aGF0IG5vIG9uZSBpcyByZWZlcmVuY2luZyB0aGlzIHByb3h5LiBUaGUgcHJveHkgZmFjdG9yeQotCSAqIHdpbGwga25vdyB3aGF0IGlkIHRoaXMgcHJveHkgd2FzIHJlZmVyZW5jaW5nIGFuZCB3aWxsIHJlbGVhc2UgaXQKLQkgKiBvbiB0aGUgc2VydmVyIGF0IEdDIHRpbWUuCi0JICoKLQkgKiBJZiB0aGVyZSBhcmUgcmVzb3VyY2VzCi0JICogdGhhdCBhYnNvbHV0ZWx5IG11c3QgYmUgcmVsZWFzZWQsIHRoZW4gdGhlIGZpbmFsaXplIG1ldGhvZAotCSAqIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBkbyB0aGUgY2xlYW4gdXAuIEhvd2V2ZXIsIHRyeSBub3QKLQkgKiB0byBoYXZlIHRoaXMgYmUgdGhlIGNhc2UuIEZpbmFsaXplIG1ldGhvZHMgYWRkIG92ZXJoZWFkIHRoYXQgaXMKLQkgKiB1c3VhbGx5IGJldHRlciBub3QgdG8gaGF2ZS4gVGhlIGJldHRlciB3YXkgaXMgZm9yIGFueSB1c2VycwotCSAqIHRoYXQgZ2V0IHRoaXMga2luZCBvZiBwcm94eSBvYmplY3Qga25vdyB0byBjYWxsIHJlbGVhc2Ugb24KLQkgKiBQcm94eUZhY3RvcnlSZWdpc3RyeSB0byByZWxlYXNlIGl0IGJlZm9yZSBnYXJiYWdlIGNvbGxlY3Rpb24uCSAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmSUQgPSBudWxsOwotCX0KLQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9TdHJpbmcgb2YgdGhlIGFjdHVhbCBiZWFuIG9uIHRoZSByZW1vdGUgc2lkZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJSVN0cmluZ0JlYW5Qcm94eSBzdHJpbmcgPSAoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRPYmplY3RUb1N0cmluZygpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzKTsKLQkJcmV0dXJuIChzdHJpbmcgIT0gbnVsbCkgPyBzdHJpbmcuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbmRlciB0aGUgYmVhbiBwcm94eSBpbnRvIHRoZSB2YWx1ZSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlLnNldE9iamVjdElEKGlzVmFsaWQoKSA/IGdldElEKCkuaW50VmFsdWUoKSA6IENvbW1hbmRzLlZPSUQpOwkvLyBObyBsb25nZXIgZXhpc3RzLCBzbyBzZW5kIG92ZXIgbnVsbC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA5MzY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlRyYW5zbWl0YWJsZUFycmF5OwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgaXMgZm9yIHdoZXJlIHRoZSBCZWFuIGlzIG9uIGEgZGlmZmVyZW50IFZNIHRoZW4gdGhlIElERQotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMjoyOToyNiBQTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1CZWFuVHlwZVByb3h5IHsKLQotCXByaXZhdGUgSW50ZWdlciBmSUQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBmQ2xhc3NuYW1lOyAvLyBUaGlzIGlzIGNhY2hlZCBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBnbyBvdmVyIHRoZSBsaW5lIHRvIGdldCBpdC4KLQotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZlN1cGVyVHlwZTsgLy8gVGhpcyBpcyBjYWNoZWQgc28gYXMgbm90IHRvIGhhdmUgdG8gZ28gb3ZlciB0aGUgbGluZSBmb3IgaXQuCi0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHN1YmNsYXNzZXMgYW5kIHRoZSBmYWN0b3J5IHdpdGggdGhpcyBSRU0gcGFja2FnZSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZJRCA9IGFuSUQ7Ci0JCWZDbGFzc25hbWUgPSBhQ2xhc3NuYW1lOwotCQlmU3VwZXJUeXBlID0gYVN1cGVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCBUaGlzIGlzIGFsbCB0aGF0IGlzIG5lZWRlZCBmb3IgQmVhblR5cGVzIGJlY2F1c2Ugd2Uga25vdyB0aGVzZSBhcmUgY2xhc3NlcywKLQkgKiB0aGVyZSBpcyBvbmx5IG9uZSBwZXIgY2xhc3MsIGFuZCBDbGFzcyBlcXVhbHMgaXMgdHJ1ZSBvbmx5IGZvciBpZGVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5lcXVhbHMoYW5PYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7IC8vIFdlIGNhbiBiZSBhc3N1cmVkIGluIFJlbW90ZSBQcm94eSB0aGF0IGlkZW50aXR5IG9mIHByb3h5IGFuZCBpZGVudGl0eSBvZiBvYmplY3QgYXJlIHRoZSBzYW1lLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZJRCAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIENsZWFyIHRoZSBpZCBhbmQgc3VwZXJ0eXBlIChzdXBlcnR5cGUgaXMgY2xlYXJlZCBzbyB0aGF0Ci0JCS8vIGl0IHdvbid0IGhvbGQgb250byBpdCBhbmQgd2lsbCBsZXQgdGhlIHN1cGVydHlwZSBiZSBHQydkCi0JCS8vIGlmIG5lY2Vzc2FyeS4KLQotCQlmSUQgPSBudWxsOwotCQlmU3VwZXJUeXBlID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCS8vIFR1cm4gY2xhc3MgbmFtZXMgaW50byBhcnJheSBvZiBCZWFuVHlwZXMuCi0JCUlCZWFuVHlwZVByb3h5W10gYXJnVHlwZXMgPSBudWxsOwotCQlpZiAoYXJndW1lbnRDbGFzc05hbWVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQlhcmdUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IGFyZ1R5cGVzW2ldID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmd1bWVudENsYXNzTmFtZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBDb3VsZG4ndCBmaW5kIHRoZSB0eXBlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkoYXJnVHlwZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NDb25zdHJ1Y3RvcigpOwotCi0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogLy8gR2V0IEN0b3IgaGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIG9ubHkgb25lIHBhcm0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHRoZSBhcnJheSBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBwYXJtIHR5cGVzLgotCQkJCW51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoSUNvbnN0cnVjdG9yUHJveHkpIGdldEN0b3JNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCi0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJSVJFTU1ldGhvZFByb3h5IGdldEN0b3JNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0NvbnN0cnVjdG9ycygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgY3RvcnMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRDdG9yTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gY3RvcnMuZ2V0U25hcHNob3QoKTsKLQkJCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvcnByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBjdG9ycHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIGN0b3Jwcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJLy8gVHVybiBjbGFzcyBuYW1lcyBpbnRvIGFycmF5IG9mIEJlYW5UeXBlcy4KLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdUeXBlcyA9IG51bGw7Ci0JCWlmIChhcmd1bWVudENsYXNzTmFtZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCWFyZ1R5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ3VtZW50Q2xhc3NOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gYXJnVHlwZXNbaV0gPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ3VtZW50Q2xhc3NOYW1lc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIENvdWxkbid0IGZpbmQgdGhlIHR5cGUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KGFyZ1R5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9yKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBhcnJheQotCQlPYmplY3RbXSBnZXRQYXJtcyA9IChhcmd1bWVudFR5cGVzICE9IG51bGwpID8gbmV3IE9iamVjdFtdIHsgbmV3IFRyYW5zbWl0YWJsZUFycmF5KENvbW1hbmRzLkNMQVNTX0NMQVNTLCBhcmd1bWVudFR5cGVzKX0gOiAvLyBHZXQgQ3RvciBoYXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gb25seSBvbmUgcGFybSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gdGhlIGFycmF5IG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHBhcm0gdHlwZXMuCi0JCQkJbnVsbDsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJQ29uc3RydWN0b3JQcm94eSkgZ2V0Q3Rvck1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgZ2V0UGFybXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9ycygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgY3RvcnMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRDdG9yTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gY3RvcnMuZ2V0U25hcHNob3QoKTsKLQkJCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvcnByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBjdG9ycHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIGN0b3Jwcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldEZpZWxkcygpIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0RmllbGRzTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NHZXRGaWVsZHMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IGZpZWxkcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldEZpZWxkc01ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgbnVsbCk7Ci0JCQlJQmVhblByb3h5W10gcHJveGllcyA9IGZpZWxkcy5nZXRTbmFwc2hvdCgpOwotCQkJSUZpZWxkUHJveHlbXSBmaWVsZFByb3hpZXMgPSBuZXcgSUZpZWxkUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBmaWVsZFByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBmaWVsZFByb3hpZXM7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkRmllbGRzTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NHZXREZWNsYXJlZEZpZWxkcygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgZmllbGRzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0RGVjbGFyZWRGaWVsZHNNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIG51bGwpOwotCQkJSUJlYW5Qcm94eVtdIHByb3hpZXMgPSBmaWVsZHMuZ2V0U25hcHNob3QoKTsKLQkJCUlGaWVsZFByb3h5W10gZmllbGRQcm94aWVzID0gbmV3IElGaWVsZFByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgZmllbGRQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gZmllbGRQcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldERlY2xhcmVkRmllbGRQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXREZWNsYXJlZEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gKElGaWVsZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0dldERlY2xhcmVkRmllbGQoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywKLQkJCQlmUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmllbGROYW1lKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRGaWVsZFByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0RmllbGRQcm94eSh0aGlzLGZpZWxkTmFtZSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0TWV0aG9kc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzTWV0aG9kcygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgbWV0aG9kcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldE1ldGhvZHNNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIG51bGwpOwotCQkJSUJlYW5Qcm94eVtdIHByb3hpZXMgPSBtZXRob2RzLmdldFNuYXBzaG90KCk7Ci0JCQlJTWV0aG9kUHJveHlbXSBtZXRob2RQcm94aWVzID0gbmV3IElNZXRob2RQcm94eVtwcm94aWVzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb3hpZXMsIDAsIG1ldGhvZFByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBtZXRob2RQcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzRGVjbGFyZWRNZXRob2RzKCk7Ci0KLQkJdHJ5IHsKLQkJCUlBcnJheUJlYW5Qcm94eSBtZXRob2RzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0RGVjbGFyZWRNZXRob2RzTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gbWV0aG9kcy5nZXRTbmFwc2hvdCgpOwotCQkJSU1ldGhvZFByb3h5W10gbWV0aG9kUHJveGllcyA9IG5ldyBJTWV0aG9kUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBtZXRob2RQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gbWV0aG9kUHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldE1ldGhvZFByb3h5KHRoaXMsbWV0aG9kTmFtZSwoU3RyaW5nW10pbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eSh0aGlzLG1ldGhvZE5hbWUsYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIChJUHJveHlCZWFuVHlwZVtdKSBudWxsKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eSh0aGlzLG1ldGhvZE5hbWUsbmV3IFN0cmluZ1tdIHthcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0TWV0aG9kUHJveHkodGhpcyxtZXRob2ROYW1lLGFyZ3VtZW50VHlwZXMpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0KLQkJLy8gVHVybiBjbGFzcyBuYW1lcyBpbnRvIGFycmF5IG9mIEJlYW5UeXBlcy4KLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdUeXBlcyA9IG51bGw7Ci0JCWlmIChhcmd1bWVudENsYXNzTmFtZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCWFyZ1R5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ3VtZW50Q2xhc3NOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gYXJnVHlwZXNbaV0gPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ3VtZW50Q2xhc3NOYW1lc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIENvdWxkbid0IGZpbmQgdGhlIHR5cGUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVjbGFyZWRNZXRob2RQcm94eShtZXRob2ROYW1lLCBhcmdUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NEZWNsYXJlZE1ldGhvZCgpOwotCQlJQmVhblByb3h5IG5hbWVQcm94eSA9IGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChtZXRob2ROYW1lKTsKLQkJLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBhcnJheQotCQlPYmplY3RbXSBnZXRQYXJtcyA9IChhcmd1bWVudFR5cGVzICE9IG51bGwpID8gbmV3IE9iamVjdFtdIHsgbmFtZVByb3h5LCBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIGFyZ3VtZW50VHlwZXMpfSA6IG5ldyBPYmplY3RbXSB7bmFtZVByb3h5LCBudWxsfTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJTWV0aG9kUHJveHkpIGdldERlY2xhcmVkTWV0aG9kTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBnZXRQYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRJbnZva2FibGUodGhpcyxtZXRob2ROYW1lLChTdHJpbmdbXSludWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldEludm9rYWJsZSh0aGlzLG1ldGhvZE5hbWUsYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGdldEludm9rYWJsZShtZXRob2ROYW1lLCBuZXcgU3RyaW5nW10geyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0SW52b2thYmxlKHRoaXMsbWV0aG9kTmFtZSxhcmd1bWVudFR5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE51bGxDb25zdHJ1Y3RvclByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KChJQmVhblR5cGVQcm94eVtdKSBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZSZWdpc3RyeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFN1cGVyQmVhblR5cGVQcm94eSgpCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZTdXBlclR5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc25hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0ludGVyZmFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzUHJpbWl0aXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNLaW5kT2Yob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkgYUJlYW5Qcm94eVR5cGUpIHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzSXNBc3NpZ25hYmxlRnJvbSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQlhQmVhblByb3h5VHlwZSwgdGhpcykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMsIGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiKCIgKyBnZXRUeXBlTmFtZSgpICsgIikiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jbGFzc0NsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSN0b0JlYW5TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I3JlbmRlckJlYW4ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXRPYmplY3RJRChnZXRJRCgpLmludFZhbHVlKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gQnkgZGVmYXVsdCBub25lIGhhdmUgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IuIFRoZXJlIGlzIGEgc3BlY2lhbCBpbnN0YW5jZSBmb3IgaW5pdCBlcnJvcnMuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJSVJFTU1ldGhvZFByb3h5IGZpbmRDb21wYXRpYmxlTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RmluZENvbXBhdGlibGVDb25zdHJ1Y3Rvck1ldGhvZCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IHRoaXMsIG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogbmV3IE9iamVjdFtdIHt0aGlzLCBudWxsfTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJQ29uc3RydWN0b3JQcm94eSkgZmluZENvbXBhdGlibGVNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRUeXBlUHJveHkoKS5lcXVhbHMoZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCWVsc2UgaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJZWxzZSBpZiAoZS5nZXRUeXBlUHJveHkoKS5lcXVhbHMoZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24oZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJfQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZmluZENvbXBhdGlibGVNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRGaW5kQ29tcGF0aWJsZU1ldGhvZE1ldGhvZCgpOwotCQlJQmVhblByb3h5IG1ldGhvZE5hbWVQcm94eSA9IGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChtZXRob2ROYW1lKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGFycmF5Ci0JCU9iamVjdFtdIGdldFBhcm1zID0gKGFyZ3VtZW50VHlwZXMgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyB0aGlzLCBtZXRob2ROYW1lUHJveHksIG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogbmV3IE9iamVjdFtdIHt0aGlzLCBtZXRob2ROYW1lUHJveHksIG51bGx9OwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKElNZXRob2RQcm94eSkgZmluZENvbXBhdGlibGVNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRUeXBlUHJveHkoKS5lcXVhbHMoZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCWVsc2UgaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJfQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTMxOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGFueSBvZiB0aGUgbnVtYmVyIGJlYW4gdHlwZSBzdWJjbGFzc2VzLgotICogTk9URTogVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgdGhlIGJlYW50eXBlIE51bWJlci4gSXQgaXMgYQotICogY2xhc3MgdGhhdCBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIE51bWJlciBzdWJjbGFzcyBiZWFudHlwZXMuCi0gKiBUaGUgTnVtYmVyIGJlYW50eXBlIGl0c2VsZiBpcyBzaW1wbHkgYSBSRU1CZWFuVHlwZVByb3h5IHNpbmNlCi0gKiBOdW1iZXIgaXMgYWJzdHJhY3QgYW5kIGhhcyBubyBuZWNlc3NhcnkgZXh0cmEgZnVuY3Rpb24uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDgvMzEvMDAgMTE6NDk6MTIgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotcHJvdGVjdGVkIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotfQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpOwotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBOdW1iZXIgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgTnVtYmVyIHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBFYWNoIGJlYW50eXBlIHdpbGwgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSAodXN1YWxseSBhIHZhbHVlIG9mIDApLgotICovCi1wdWJsaWMgYWJzdHJhY3QgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyZWIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFjY2Vzc2libGVPYmplY3RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5UaHJvd2FibGVQcm94eTsKLSAKLS8qKgotICogQWNjZXNzaWJsZU9iamVjdCBQcm94eS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElBY2Nlc3NpYmxlT2JqZWN0UHJveHkgewotCi0JcHJvdGVjdGVkIFJFTUFjY2Vzc2libGVPYmplY3RQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklBY2Nlc3NpYmxlT2JqZWN0UHJveHkjaXNBY2Nlc3NpYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBY2Nlc3NpYmxlSXNBY2Nlc3NpYmxlKCkuaW52b2tlKHRoaXMpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I3NldEFjY2Vzc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmxlKGJvb2xlYW4gZmxhZykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSgpLmludm9rZSh0aGlzLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChmbGFnKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmFjY2Vzc2libGVUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdmYWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IGZvciBhbiBhYnN0cmFjdCBiZWFuIHR5cGUuIEkuZS4geW91IGNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBpdC4KLSAqIEl0IGNhbiBiZSB1c2VkIGFzIGEgZ2VuZXJhbCBhYnN0cmFjdCB0eXBlLiBJdCB3aWxsIHBhc3MgbmV3QmVhblR5cGVGb3JDbGFzcyB1bnRvCi0gKiB0aGUgbWFpbiBzdXBlciB0eXBlIHBhc3NlZCBpbi4KLSAqLwotIAotcHVibGljIGNsYXNzIFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotCXByb3RlY3RlZCBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgZk1haW5TdXBlclR5cGU7CS8vIFRoZSB0eXBlIHRoYXQgdGhpcyB3YXMgY3JlYXRlZCBmcm9tIHNvIHRoYXQKLQkJCQkJCQkvLyBhbnkgbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMgY2FuIGNyZWF0ZSB0aGUgY29ycmVjdAotCQkJCQkJCS8vIHR5cGUgb2YgYmVhbnR5cGUgcHJveHkuCi0JCQkJCQotCXB1YmxpYyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUsIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSBhVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCQlmTWFpblN1cGVyVHlwZSA9IGFUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBhYnN0cmFjdCB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCS8qKgotCSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgYWJzdHJhY3QgY2xhc3NlcyBjYW4gbmV2ZXIgYmUgZG9uZSwKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBmTWFpblN1cGVyVHlwZS5uZXdCZWFuVHlwZUZvckNsYXNzKGFuSUQsIGFDbGFzc25hbWUsIGFuQWJzdHJhY3QsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiByZWxlYXNlIC0gQmVhblR5cGUgaXMgYWJvdXQgdG8gYmUgcmVsZWFzZWQuCi0JICogQ2xlYXIgdGhlIGZNYWluU3VwZXJ0eXBlIChzdXBlcnR5cGUgaXMgY2xlYXJlZCBzbyB0aGF0Ci0JICogaXQgd29uJ3QgaG9sZCBvbnRvIGl0IGFuZCB3aWxsIGxldCB0aGUgc3VwZXJ0eXBlIGJlIEdDJ2QKLQkgKiBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZk1haW5TdXBlclR5cGUgPSBudWxsOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQkJCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDFkOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBWTSB2ZXJzaW9uIG9mIHRoZSBBcnJheSBwcm94eQotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1BcnJheUJlYW5Qcm94eSBleHRlbmRzIFJFTUJlYW5Qcm94eSBpbXBsZW1lbnRzIElBcnJheUJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aCA9IC0xOwotCQotCVJFTUFycmF5QmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBJQmVhblR5cGVQcm94eSBhVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmICghKGFuT2JqZWN0IGluc3RhbmNlb2YgSUFycmF5QmVhblByb3h5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHNhbWVBcygoSUJlYW5Qcm94eSkgYW5PYmplY3QpKQotCQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JCWlmICgoKElCZWFuUHJveHkpIGFuT2JqZWN0KS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpID09IGZGYWN0b3J5KQotCQkJdHJ5IHsKLQkJCQkvLyBUaGUgb3RoZXIgaXMgYW4gYXJyYXkgYWxzbywgbGV0IHRoZSBzZXJ2ZXIgZG8gdGhlIGNoZWNrLiBXZSB3aWxsIHVzZSBBcnJheXMuZXF1YWxzLgotCQkJCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyRXF1YWxzKCkuaW52b2tlKG51bGwsIG5ldyBJQmVhblByb3h5W10ge3RoaXMsIChJQmVhblByb3h5KSBhbk9iamVjdH0pKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gRm9ybWF0IG9mIGdldHRlciBwYXJtcyBpczogKE9iamVjdCAoYXJyYXkpLCBpbnQgKGluZGV4KSkuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHt0aGlzLCBuZXcgSW50ZWdlcihpbmRleCl9OwotCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJSUJlYW5UeXBlUHJveHkgY29tcFR5cGUgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWlmICghY29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCQlpbnQgaWQgPSAoKElSRU1CZWFuUHJveHkpIGNvbXBUeXBlKS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSBDb21tYW5kcy5CWVRFX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEJ5dGUoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5R2V0Qm9vbGVhbigpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldENoYXIoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkRPVUJMRV9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXREb3VibGUoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkZMT0FUX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEZsb2F0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEludCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuTE9OR19UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRMb25nKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5TSE9SVF9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRTaG9ydCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotCSAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQsCi0JICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotCSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotCSAqIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHJlYWwgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChpbnQgW10gaW5kZXhlcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gRm9ybWF0IG9mIGdldHRlciBwYXJtcyBpczogKE9iamVjdCAoYXJyYXkpLCBpbnRbXSAoaW5kZXhlcykpLgotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7dGhpcywgaW5kZXhlc307Ci0JCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBhdCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbiBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCQlpbnQgZGltcyA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldERpbWVuc2lvbnMoKTsKLQkJaWYgKGRpbXMgPCBpbmRleGVzLmxlbmd0aCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsJLy8gVG9vIG1hbnkgZGltZW5zaW9ucwotCQlJQmVhblR5cGVQcm94eSBmaW5hbENvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7CQkJCi0JCWlmIChkaW1zID09IGluZGV4ZXMubGVuZ3RoICYmIGZpbmFsQ29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIgYmVjYXVzZSB3ZSBhcmUgYWNjZXNzaW5nIHRoZSBmaW5hbCBjb21wb25lbnQgYW5kIGl0IGlzIHByaW1pdGl2ZS4KLQkJCWludCBpZCA9ICgoSVJFTUJlYW5Qcm94eSkgZmluYWxDb21wVHlwZSkuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRCeXRlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldEJvb2xlYW4oKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRDaGFyKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0RG91YmxlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRGbG9hdCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRJbnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0TG9uZygpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuU0hPUlRfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0U2hvcnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIG5vdCB0aGUgZmluYWwgY29tcG9uZW50LCBvciBpdCBpcyBub3QgcHJpbWl0aXZlLCB1c2UgdGhlIHN0YW5kYXJkIGFjY2Vzc29yLgotCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlLCBpbnQgaW5kZXgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBzZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50IChpbmRleCksIE9iamVjdCAodmFsdWUpKS4KLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0W10ge3RoaXMsIG5ldyBJbnRlZ2VyKGluZGV4KSwgdmFsdWV9OwotCQkoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheVNldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCX0KLQkJCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBtdWx0aS1kaW1lbnNpb25hbCBpbmRleC4KLQkgKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotCSAqIGFuZCBlYWNoIGluZGV4IGFsb25nIHRoZSB3YXkgbXVzdCBleGlzdC4KLQkgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKLQkgKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSB2YWx1ZSwgaW50IFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBzZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50W10gKGluZGV4ZXMpLCBPYmplY3QgKHZhbHVlKSkuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHt0aGlzLCBpbmRleGVzLCB2YWx1ZX07Ci0JCSgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyU2V0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGktZGltZW5zaW9ucywgeW91IG11c3QgZ2V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGRpbWVuc2lvbiBmcm9tIHRoZSBnZXQgbWV0aG9kIHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGF0IGRpbWVuc2lvbi4KLQkgKgotCSAqIGUuZy4KLQkgKiAgICBpbnQgWzNdIHJldHVybnMgMwotCSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0JICoKLQkgKiAgICAoKElBcnJheUJlYW5Qcm94eSkgZ2V0KDEpKS5nZXRMZW5ndGgoKSByZXR1cm5zIDIKLQkgKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLQkgKiAgICBiZSBhIGRpZmZlcmVudCBsZW5ndGggYXJyYXkgZm9yIGVhY2ggb2YgdGhlIGFycmF5cyAKLQkgKiAgICByZXR1cm5lZCBmcm9tIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZXR1cm5lZCBsZW5ndGgKLQkgKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotCSAqICAgIGZyb20gZ2V0KDEpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkxlbmd0aCA9PSAtMSkgewotCQkJLy8gSXQgaGFzbid0IHlldCBiZWVuIHF1aWVyZWQuCi0JCQlmTGVuZ3RoID0gKChJSW50ZWdlckJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldExlbmd0aCgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsLCB0aGlzKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZkxlbmd0aDsKLQl9CQotCQotCXB1YmxpYyBJQmVhblByb3h5IGdldENhdGNoVGhyb3dhYmxlRXhjZXB0aW9uKGludCBpbmRleCl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KGluZGV4KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJCSAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7CS8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQXJyYXlCZWFuUHJveHkjZ2V0U25hcHNob3QoKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5W10gZ2V0U25hcHNob3QoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZkZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJcHJveHlGYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsgLy8gVGhpcyBpcyBkZWZpbmF0ZWx5IGEgdHJhbnNhY3Rpb24sIHNvIHN0YXJ0IGl0LgotCQl0cnkgewotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29ubmVjdC5nZXRBcnJheUNvbnRlbnRzKGdldElEKCkuaW50VmFsdWUoKSwgcmV0dXJuVmFsdWUpOwotCQkJCQlyZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKGNvbm5lY3QsIHJldHVyblZhbHVlKTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCQlwcm94eUZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4KLQkJCQkJZkZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJY29ubmVjdCA9IGZGYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb25uZWN0LmdldEFycmF5Q29udGVudHMoZ2V0SUQoKS5pbnRWYWx1ZSgpLCByZXR1cm5WYWx1ZSk7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKGNvbm5lY3QsIHJldHVyblZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gSnVzdCBjbG9zZSBhbmQgcHJpbnQgdHJhY2UuCi0JCQkJCQlmRmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlQWdhaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBIHJlY292ZXJhYmxlIGVycm9yLCBwcmludCB0cmFjZSBhbmQgcmV0dXJuCi0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJveHlGYWN0b3J5LnN0b3BUcmFuc2FjdGlvbigpOwotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmRmFjdG9yeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBJQmVhblByb3h5W10gcHJvY2Vzc1JldHVyblZhbHVlKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIFZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCS8vIEhvd2V2ZXIgaXQgd2lsbCBiZWNvbWUgSUJlYW5Qcm94eVtdLiBUaGF0IGlzIGJlY2F1c2UgaWYgSUQncwotCQkvLyB0aGV5IG11c3QgYmUgcHJveGllcyBvdmVyIGhlcmUuCi0JCUJlYW5Qcm94eVZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyID0gbmV3IEJlYW5Qcm94eVZhbHVlU2VuZGVyKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSwgcmV0dXJuVmFsdWUpOwotCQljb25uZWN0aW9uLnJlYWRQcm94eUFycmF5VmFsdWVzKHJldHVyblZhbHVlLCB2YWx1ZVNlbmRlciwgZmFsc2UpOwotCQlFeGNlcHRpb24gZSA9IHZhbHVlU2VuZGVyLmdldEV4Y2VwdGlvbigpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFRocm93YWJsZVByb3h5KQotCQkJCXRocm93IChUaHJvd2FibGVQcm94eSkgZTsKLQkJCWVsc2UKLQkJCQl0aHJvdyAoQ29tbWFuZEV4Y2VwdGlvbikgZTsKLQkJfQotCQlPYmplY3QgdmFscyA9IHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCUlCZWFuUHJveHlbXSBwcm94eUFycmF5ID0gbmV3IElCZWFuUHJveHlbQXJyYXkuZ2V0TGVuZ3RoKHZhbHMpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh2YWxzLCAwLCBwcm94eUFycmF5LCAwLCBwcm94eUFycmF5Lmxlbmd0aCk7Ci0JCXJldHVybiBwcm94eUFycmF5OwotCX0KLQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0ZjNhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBBcnJheSBUeXBlIFByb3h5IGZvciB0aGUgSURFIFZNLgotICoKLSAqIFRoZSBjbGFzcyBpcyBmaW5hbCBiZWNhdXNlIGFycmF5J3MgYXJlIHNwZWNpYWwgYW5kIHNob3VsZG4ndCBoYXZlCi0gKiBhbnkgc3ViY2xhc3NlcyBzaW5jZSB0aGUgZmFjdG9yeSB3b3VsZCBuZXZlciBjYWxsIGl0LgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1BcnJheUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJQXJyYXlCZWFuVHlwZVByb3h5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwYWNrYWdlIHNvIHRoYXQgb25seSAKLQkgKiB0aGUgZmFjdG9yeSB3aXRoIHRoaXMgSURFIHBhY2thZ2UgY2FuIGNhbGwgaXQuCi0JICovCi0JcHJvdGVjdGVkIFJFTUFycmF5QmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBvYmplY3RUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBpcyBhbiBhcnJheSB0eXBlIQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKSB7Ci0JCS8vIENvbXBvbmVudCB0eXBlIGlzIHN0cmlwIG9mZiBhbGwgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQlpbnQgdHlwZVN0YXJ0ID0gZ2V0VHlwZU5hbWUoKS5sYXN0SW5kZXhPZignWycpKzE7Ci0JCWlmIChnZXRUeXBlTmFtZSgpLmNoYXJBdCh0eXBlU3RhcnQpID09ICdMJykgewotCQkJLy8gSXQgaXMgYSBjbGFzcy4KLQkJCS8vIFN0cmlwIG9mZiB1cCB0byB0aGUgJ0wnLCBhbmQgdGhlIHRyYWlsaW5nICc7Jy4gVGhhdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCsxLCBnZXRUeXBlTmFtZSgpLmxlbmd0aCgpLTEpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIGEgdHlwZS4gTmVlZCB0byBtYXAgaXQuCi0JCQlDbGFzcyBhVHlwZSA9IChDbGFzcykgTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUuZ2V0KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKHR5cGVTdGFydCwgdHlwZVN0YXJ0KzEpKTsKLQkJCXJldHVybiBhVHlwZSAhPSBudWxsID8gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShhVHlwZS5nZXROYW1lKCkpIDogbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRDb21wb25lbnRUeXBlKCkgewotCQkvLyBDb21wb25lbnQgdHlwZSBpcyBzdHJpcCBvZmYgZmlyc3QgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQlpZiAoZ2V0VHlwZU5hbWUoKS5jaGFyQXQoMSkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBhIG9uZSBkaW1lbnNpb25hbCBhcnJheSwganVzdCBzZW5kIHRvIGdldEZpbmFsQ29tcG9uZW50VHlwZSB0byBmaWd1cmUgb3V0IHRoZSB0eXBlLgotCQkJcmV0dXJuIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQl9IGVsc2UgewotCQkJLy8gSXQgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheS4gSnVzdCBzdHJpcCBvZmYgb25lICdbJyBhbmQgc2VuZCB0aGF0IHRvIHRoZSBiZWFuIHR5cGUgZmFjdG9yeS4KLQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCkubGFzdEluZGV4T2YoJ1snKSsxOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogVXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyB0aGUgdHlwZSBwcm94eSB0byBiZSBzZXQgYXMgd2VsbCBhcyB0aGUgYmVhbgotCSAqIGJlY2F1c2Ugd2UgYXJlIHRoZSB0eXBlIGFuZCBieSBzZXR0aW5nIGl0IG5vdyB3ZSBtaWdodCBhdm9pZCBpdCBiZWluZyBsb29rdXAgZm9yIGluIHRoZQotCSAqIGZhY3RvcnkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQgZm9yLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQkJcmV0dXJuIG5ldyBSRU1BcnJheUJlYW5Qcm94eShmUmVnaXN0cnksIGFuSUQsIHRoaXMpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIEFycmF5cyBjYW4ndCBiZSBzdWJjbGFzc2VkLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bGwgY3RvciBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgZmllbGQgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkKLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRRdWFsaWZpZWRUeXBlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXJyYXkgYmVhbiBwcm94eS4KLQkgKgotCSAqICAgLSAoaW50LCBuZXcgaW50WzJdIHszLCA0fSkgd2lsbCBjcmVhdGU6Ci0JICogICAgICBpbnQgWzNdIFs0XQotCSAqCi0JICogICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pCi0JICogICAgICBpbnQgWzFdCi0JICoKLQkgKiAgIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KQotCSAqICAgICAgaW50IFsyXSBbM10KLQkgKiAKLQkgKgotCSAqICAgLSAoaW50W10sIG51bGwpIG9yIChpbnRbXSwgbmV3IGludFswXSkgb3IgKGludCwgbnVsbCkgb3IgKGludCwgbmV3IGludFswXSkKLQkgKiAgICAgIGludCBbMF0KLQkgKiAgICAgKGludFtdW10sIG51bGwpIG9yIChpbnRbXVtdLCBuZXcgaW50WzBdKQotCSAqICAgICAgaW50WzBdW10KLQkgKiAgICAgVGhpcyBpcyBiZWNhdXNlIGFuIGFycmF5IGluc3RhbmNlIHdpdGggbm8gZGltZW5zaW9ucyBzcGVjaWZpZWQgaXMgbm90IHZhbGlkLiAKLQkgKgotCSAqICAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pCi0JICogICAgICBpbnRbM11bXQotCSAqCi0JICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHRoZSBSRU0gRmFjdG9yeSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlSRU1BcnJheUJlYW5Qcm94eSAgY3JlYXRlQmVhblByb3h5V2l0aChpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJZiB0aGUgZGltZW5zaW9ucyBpcyBudWxsIG9yIHplcm8gbGVuZ3RoLCB0aGVuIGNyZWF0ZSB0aGUKLQkJLy8gYXJyYXkgYXMgYSAwIHNpemVkIGFycmF5IG9uZSBkaW1lbnNpb25hbCBhcnJheS4KLQkJaWYgKGRpbWVuc2lvbnMgPT0gbnVsbCB8fCBkaW1lbnNpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IGludFtdIHswfSk7Ci0JCQkKLQkJLy8gUmVtb3ZlIGZyb20gdGhpcyB0eXBlIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQKLQkJLy8gY29taW5nIGluLCB1cCB0byBidXQgbm8gZnVydGhlciB0aGFuIHRoZSBmaW5hbCBjb21wb25lbnQuCi0JCS8vIEZyb20gaGVyZSB3ZSBjYW4gdGhlbiB1c2UgdGhlIGFwcHJvcHJpYXRlIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ci0JCS8vIG1ldGhvZCB0byBjcmVhdGUgdGhlIGFycmF5LgotCQlJQmVhblR5cGVQcm94eSBjb21wVHlwZSA9IG51bGw7CS8vIFRoZSB0eXBlIG9mIGFycmF5IHRvIGNyZWF0ZSAoaXQgbWF5IGJlIGRpZmZlcmVudCBudW1iZXIgb2YgZGltZW5zaW9ucykuCi0JCWludCBudW1EaW1zID0gZ2V0RGltZW5zaW9ucygpOwotCQlpZiAobnVtRGltcyA8PSBkaW1lbnNpb25zLmxlbmd0aCkKLQkJCWNvbXBUeXBlID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7CS8vIFRoZXJlIGFyZSB0aGUgc2FtZSBvciBtb3JlIHJlcXVlc3RlZCBkaW1lbnNpb25zLCBzbyB1c2UgZmluYWwgY29tcG9uZW50IHR5cGUKLQkJZWxzZSB7Ci0JCQkvLyBUaGVyZSBhcmUgZmV3ZXIgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIHNvIHN0cmlwIG9mZiB0aGF0IG1hbnkKLQkJCVN0cmluZyBjb21wQ2xhc3MgPSBnZXRUeXBlTmFtZSgpLnN1YnN0cmluZyhkaW1lbnNpb25zLmxlbmd0aCk7Ci0JCQljb21wVHlwZSA9IGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoY29tcENsYXNzKTsKLQkJfQotCQkKLQkJaWYgKGRpbWVuc2lvbnMubGVuZ3RoID09IDEpIHsKLQkJCS8vIFVzZSB0aGUgb25lIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7Y29tcFR5cGUsIG5ldyBJbnRlZ2VyKGRpbWVuc2lvbnNbMF0pfTsKLQkJCXJldHVybiAoUkVNQXJyYXlCZWFuUHJveHkpICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBVc2UgdGhlIG11bHRpIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7Y29tcFR5cGUsIGRpbWVuc2lvbnN9OwotCQkJcmV0dXJuIChSRU1BcnJheUJlYW5Qcm94eSkgKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldEFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbigpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIElCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldFR5cGVOYW1lKCk7Ci0JCWludCBkaW1zID0gbmFtZS5sYXN0SW5kZXhPZignWycpICsgMTsKLQkJU3RyaW5nIHR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKS5nZXRUeXBlTmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWFsVHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIodHlwZS5sZW5ndGgoKSsoIltdIi5sZW5ndGgoKSpkaW1zKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9ybWFsVHlwZS5hcHBlbmQodHlwZSk7Ci0JCWZvciAoaW50IGk9MDsgaTxkaW1zOyBpKyspCi0JCQlmb3JtYWxUeXBlLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZm9ybWFsVHlwZS50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUwNTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBJUkVNQmVhblByb3h5Ci0gKi8KLQotcHVibGljIGNsYXNzIFJFTUJlYW5Qcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblByb3h5IHsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZUeXBlOwotCi0JcHJvdGVjdGVkIFJFTUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQpOwotCQlmVHlwZSA9IGFUeXBlOwotCX0KLQkKLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZUeXBlID0gbnVsbDsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTBhZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBCZWFuVHlwZVByb3h5LiBUaGlzIGlzIHdoYXQgaXMgdXNlZAotICogZm9yIHJlZ3VsYXIgZGVmYXVsdCBiZWFucyBhbmQgYmVhbnR5cGVzIHdoZW4gbm8gc3BlY2lhbCBiZWFucyBvciBiZWFuIHR5cGVzIGFyZSBuZWVkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1CZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIGEgcmVnaXN0cnkgYW5kIGEgY2xhc3MuIEl0IGlzIHByb3RlY3RlZCBzbyB0aGF0IG9ubHkgc3ViY2xhc3NlcwotCSAqIGFuZCB0aGUgZmFjdG9yeSB3aXRoIHRoaXMgUkVNIHBhY2thZ2UgY2FuIGNhbGwgaXQuCi0JICovCi0JcHVibGljIFJFTUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBJQmVhblR5cGVQcm94eSBhU3VwZXJUeXBlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgYVN1cGVyVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSkgewotCQlpZiAoIWFuQWJzdHJhY3QpIAotCQkJcmV0dXJuIG5ldyBSRU1CZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKXsKLQkKLQkJcmV0dXJuIG5ldyBSRU1CZWFuUHJveHkoZlJlZ2lzdHJ5LCBhbklELCB0aGlzKTsKLQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNDI3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgQmlnRGVjaW1hbHMuCi0gKi8KLWNsYXNzIFJFTUJpZ0RlY2ltYWxCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgewotCi1SRU1CaWdEZWNpbWFsQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQmlnRGVjaW1hbCBhQmlnRGVjaW1hbCkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJpZ0RlY2ltYWwpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5iaWdEZWNpbWFsQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KG51bWJlclZhbHVlKCksICgoSVJFTUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRJRCgpLmludFZhbHVlKCkpOwotfQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGZjZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBCaWdEZWNpbWFsLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCaWdEZWNpbWFsIHplcm9WYWx1ZSA9IG5ldyBCaWdEZWNpbWFsKDBEKTsKLQotUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUyksIEJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNQmlnRGVjaW1hbEJlYW5Qcm94eShhUmVnaXN0cnksIHplcm9WYWx1ZSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCaWdEZWNpbWFsQmVhblByb3h5KEJpZ0RlY2ltYWwgYUJpZ0RlY2ltYWwpIHsKLQlyZXR1cm4gKCF6ZXJvVmFsdWUuZXF1YWxzKGFCaWdEZWNpbWFsKSkgPwotCQluZXcgUkVNQmlnRGVjaW1hbEJlYW5Qcm94eShmUmVnaXN0cnksIGFCaWdEZWNpbWFsKSA6IHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYW4gQmlnRGVjaW1hbCBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgQmlnRGVjaW1hbC4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUJpZ0RlY2ltYWxCZWFuUHJveHkoKEJpZ0RlY2ltYWwpIGFOdW1iZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQmlnRGVjaW1hbEJlYW5Qcm94eSgoQmlnRGVjaW1hbCkgdmFsdWUuYW5PYmplY3QpOwotfQkKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnSW50ZWdlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDRkYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIEJpZ0ludGVnZXJzLgotICovCi1jbGFzcyBSRU1CaWdJbnRlZ2VyQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNQmlnSW50ZWdlckJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEJpZ0ludGVnZXIgYUJpZ0ludGVnZXIpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCaWdJbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYmlnSW50ZWdlckNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChudW1iZXJWYWx1ZSgpLCAoKElSRU1CZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjFmMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBCaWdJbnRlZ2VyLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCaWdJbnRlZ2VyIHplcm9WYWx1ZSA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7IC8vJE5PTi1OTFMtMSQKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1MpLCBCaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUJpZ0ludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCB6ZXJvVmFsdWUpOwkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eShCaWdJbnRlZ2VyIGFCaWdJbnRlZ2VyKSB7Ci0JcmV0dXJuICghemVyb1ZhbHVlLmVxdWFscyhhQmlnSW50ZWdlcikpID8KLQkJbmV3IFJFTUJpZ0ludGVnZXJCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhQmlnSW50ZWdlcikgOiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGFuIEJpZ0ludGVnZXIgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIEJpZ0ludGVnZXIuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVCaWdJbnRlZ2VyQmVhblByb3h5KChCaWdJbnRlZ2VyKSBhTnVtYmVyKTsKLX0JCi0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCaWdJbnRlZ2VyQmVhblByb3h5KChCaWdJbnRlZ2VyKSB2YWx1ZS5hbk9iamVjdCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWMzYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQm9vbGVhbkJlYW5Qcm94eSBmb3IgQm9vbGVhbi5jbGFzcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgQm9vbGVhbiBmQm9vbGVhblZhbHVlOwotCi0vKioKLSAqIFN0b3JlIHRoZSBib29sZWFuIHZhbHVlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgYm9vbGVhblZhbHVlIGZhc3RlcgotICogd2l0aG91dCB0aGUgbmVlZCBmb3IgZ29pbmcgYWNyb3NzIHRoZSBsaW5lLiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQgaW4KLSAqIHNwZWNpYWwgd2F5LCBzbyBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZXNlLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQm9vbGVhbiB2YWx1ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJvb2xlYW5WYWx1ZSA9IHZhbHVlOwotfQotCi0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KQotCQlyZXR1cm4gZkJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSA9PSAoKFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSkgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCXJldHVybiBmQm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpID09ICgoQm9vbGVhbikgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUKLSAqLwotcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCXJldHVybiBmQm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGphdmEubGFuZy5Cb29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIHRvU3RyaW5nIG9mIHRoZSBiZWFuIGl0c2VsZi4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZCb29sZWFuVmFsdWUudG9TdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYm9vbGVhbkNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmQm9vbGVhblZhbHVlKTsKLX0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTYwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCb29sZWFuIEJlYW5UeXBlIFByb3h5IGZvciBCb29sZWFuLmNsYXNzLiAKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzIzLzAwIDE6NTk6MDIgUE0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElCb29sZWFuQmVhblByb3h5IHRydWVQcm94eTsKLQlwcm90ZWN0ZWQgZmluYWwgSUJvb2xlYW5CZWFuUHJveHkgZmFsc2VQcm94eTsKLS8qKgotICogUkVNQm9vbGVhbkJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBvYmplY3RUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX0NMQVNTKSwgQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIG9iamVjdFR5cGUpOwotCQotCXRydWVQcm94eSA9IG5ldyBSRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkoIGZSZWdpc3RyeSwgQm9vbGVhbi5UUlVFKTsKLQlmYWxzZVByb3h5ID0gbmV3IFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSggZlJlZ2lzdHJ5LCBCb29sZWFuLkZBTFNFKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICogVXNlIHRoZSBjYWNoZS4KLSAqLwotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShCb29sZWFuIGFCb29sZWFuKSB7Ci0JcmV0dXJuIGFCb29sZWFuLmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZVByb3h5IDogZmFsc2VQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoZXkgYXJlIGZpbmFsIGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLSAqIGZvciBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIEJvb2xlYW4gZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIGZhbHNlUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiBmYWxzZVByb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUJvb2xlYW5CZWFuUHJveHkodmFsdWUuYUJvb2wgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkNGMwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5UeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCb29sZWFuQmVhblByb3h5IGZvciBCb29sZWFuLlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmQm9vbGVhbjsKLQotLyoqCi0gKiBTdG9yZSB0aGUgYm9vbGVhbiB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGJvb2xlYW5WYWx1ZSBmYXN0ZXIKLSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGdvaW5nIGFjcm9zcyB0aGUgbGluZS4gSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBpcyBjcmVhdGVkIGluCi0gKiBzcGVjaWFsIHdheSwgc28gbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVzZS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUJvb2xlYW5UeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgYm9vbGVhbiB2YWx1ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJvb2xlYW4gPSB2YWx1ZTsKLX0KLQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkJvb2xlYW4gPT0gKChSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCXJldHVybiBmQm9vbGVhbiA9PSAoKEJvb2xlYW4pIGFuT2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQm9vbGVhblR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmQm9vbGVhbiA9PSAoKFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBib29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW47Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgamF2YS5sYW5nLkJvb2xlYW4gdmFsdWUKLSAqLwotcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkgewotCXJldHVybiBmQm9vbGVhbiA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0b1N0cmluZyBvZiB0aGUgYmVhbiBpdHNlbGYuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmQm9vbGVhbiA/IEJvb2xlYW4uVFJVRS50b1N0cmluZygpIDogQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5ib29sZWFuVHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZkJvb2xlYW4pOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWFiMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJvb2xlYW4gQmVhblR5cGUgUHJveHkgZm9yIEJvb2xlYW4uVFlQRQotICogQ3JlYXRpb24gZGF0ZTogKDIvMjMvMDAgMTo1OTowMiBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0KLQkvLyBDYWNoZSB0aGVzZSBpbnN0YW5jZXMuIFNpbmNlIHRoZSBCZWFuVHlwZSBwcm94aWVzIGFyZSBjYWNoZWQgYWxzbywgb25seSBvbmUgaW5zdGFuY2UKLQkvLyBvZiB0cnVlL2ZhbHNlIHdpbGwgYmUgaW4gc3lzdGVtLgotCXByb3RlY3RlZCBmaW5hbCBJQm9vbGVhbkJlYW5Qcm94eSB0cnVlUHJveHk7Ci0JcHJvdGVjdGVkIGZpbmFsIElCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0vKioKLSAqIFJFTUJvb2xlYW5CZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXByb3RlY3RlZCBSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX1RZUEUpLCBCb29sZWFuLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQl0cnVlUHJveHkgPSBuZXcgUkVNQm9vbGVhblR5cGVCZWFuUHJveHkoIGZSZWdpc3RyeSwgdHJ1ZSk7Ci0JZmFsc2VQcm94eSA9IG5ldyBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSggZlJlZ2lzdHJ5LCBmYWxzZSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUuCi0gKi8KLUlCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYm9vbGVhbiBhQm9vbGVhbikgewotCXJldHVybiBhQm9vbGVhbiA/IHRydWVQcm94eSA6IGZhbHNlUHJveHk7Ci19Ci0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGJvb2xlYW4gaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgZmFsc2VQcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIGZhbHNlUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQm9vbGVhbkJlYW5Qcm94eSh2YWx1ZS5hQm9vbCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZUNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTQ0NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBCeXRlLmNsYXNzLgotICovCi1jbGFzcyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgewotCi1SRU1CeXRlQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBCeXRlIGFCeXRlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQnl0ZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmJ5dGVDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoKEJ5dGUpIG51bWJlclZhbHVlKCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmYxYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCZWFuVHlwZSBQcm94eSBmb3IgQnl0ZS5jbGFzcy4gCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5CWVRFX0NMQVNTKSwgQnl0ZS5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgQnl0ZSgoYnl0ZSkwKSk7CQotCW9uZVByb3h5ID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBCeXRlKChieXRlKTEpKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgQnl0ZSgoYnl0ZSkyKSk7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgQnl0ZSgoYnl0ZSkzKSk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQnl0ZUJlYW5Qcm94eShCeXRlIGFCeXRlKSB7Ci0Jc3dpdGNoKGFCeXRlLmJ5dGVWYWx1ZSgpKSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTUJ5dGVDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFCeXRlKTsKLQl9Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGFuIEludGVnZXIgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhbiBJbnRlZ2VyLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlQnl0ZUJlYW5Qcm94eSgoQnl0ZSkgYU51bWJlcik7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCeXRlQmVhblByb3h5KG5ldyBCeXRlKHZhbHVlLmFCeXRlKSk7Ci19CQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzYyYjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZVR5cGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgQnl0ZS5UWVBFLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNQnl0ZVR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgYnl0ZSBmQnl0ZTsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUJ5dGVUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgYnl0ZSBhQnl0ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJ5dGUgPSBhQnl0ZTsKLX0KLQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUJ5dGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkJ5dGUgPT0gKChSRU1CeXRlVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmJ5dGVWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJ5dGUpCi0JCXJldHVybiBmQnl0ZSA9PSAoKEJ5dGUpIGFuT2JqZWN0KS5ieXRlVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQnl0ZVR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmQnl0ZSA9PSAoKFJFTUJ5dGVUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5ieXRlVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBCeXRlKGZCeXRlKTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmQnl0ZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmJ5dGVUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmQnl0ZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDE5MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIEJ5dGUuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNQnl0ZVR5cGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9UWVBFKSwgQnl0ZS5UWVBFLmdldE5hbWUoKSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUJ5dGVUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKGJ5dGUpMCk7CQotCW9uZVByb3h5ID0gbmV3IFJFTUJ5dGVUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKGJ5dGUpMSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNQnl0ZVR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoYnl0ZSkyKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTUJ5dGVUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKGJ5dGUpMyk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQnl0ZUJlYW5Qcm94eShieXRlIGFCeXRlKSB7Ci0Jc3dpdGNoKGFCeXRlKSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTUJ5dGVUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYUJ5dGUpOwotCX0KLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGJ5dGUgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQkKLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCeXRlQmVhblByb3h5KHZhbHVlLmFCeXRlKTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoYnl0ZSkgdmFsaWROdW1iZXIgLSBudW1iZXIgY2FuIGJlIGFueSBudW1iZXIgYmVjYXVzZSAoYnl0ZSkgZXhwbGljaXRseSBjYXN0cyBpdCBkb3duLgotICoJMikgdmFsaWROdW1iZXIKLSAqIEl0IHdpbGwgdXNlIHRoZSBkZWNvZGUgZnVuY3Rpb24gb2YgYnl0ZSB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0JYnl0ZSBhQnl0ZTsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoYnl0ZSkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihieXRlKSIubGVuZ3RoKCkpLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHYgIT0gbnVsbCkKLQkJCWFCeXRlID0gdi5ieXRlVmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhQnl0ZSA9IEJ5dGUuZGVjb2RlKHRyaW0pLmJ5dGVWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgYnl0ZSBmb3JtYXQuCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JCX0KLQl9Ci0KLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChhQnl0ZSk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrSW5wdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTIwNzViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5JT0NvbW1hbmRFeGNlcHRpb247Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGlucHV0c3RyZWFtIHVzZWQgdG8gcmV0dXJuIGEgbG90IG9mIGRhdGEgZnJvbQotICogdGhlIHNlcnZlci4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQkKLQlwcm90ZWN0ZWQgRGF0YUlucHV0U3RyZWFtIGZJbjsKLQlwcm90ZWN0ZWQgRGF0YU91dHB1dFN0cmVhbSBmT3V0OwotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQlwcm90ZWN0ZWQgaW50IGZOZXh0Qnl0ZSA9IDA7Ci0JcHJvdGVjdGVkIGludCBmTGFzdEJ5dGUgPSAwOwotCQotCXB1YmxpYyBSRU1DYWxsYmFja0lucHV0U3RyZWFtKERhdGFJbnB1dFN0cmVhbSBpbiwgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHsKLQkJZkluID0gaW47Ci0JCWZPdXQgPSBvdXQ7Ci0JCQotCQlJbnRlZ2VyIGJ1ZlNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0uYnVmc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidWZTaXplID09IG51bGwpCi0JCQlidWZTaXplID0gbmV3IEludGVnZXIoMTYwMDApOwkJCi0JCWZCdWZmZXIgPSBuZXcgYnl0ZVtidWZTaXplLmludFZhbHVlKCldOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclN0cmVhbSgpIHsKLQkJZkluID0gbnVsbDsKLQkJZk91dCA9IG51bGw7Ci0JCWZCdWZmZXIgPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZJbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmIChmTGFzdEJ5dGUgIT0gLTEpIHsKLQkJCQlmTGFzdEJ5dGUgPSBDb21tYW5kcy5yZWFkQnl0ZXMoZkluLCBmQnVmZmVyKTsKLQkJCQlpZiAoZkxhc3RCeXRlICE9IC0xKQotCQkJCQlmTmV4dEJ5dGUgPSAwOwotCQkJCWVsc2UgewotCQkJCQlmTmV4dEJ5dGUgPSAtMTsKLQkJCQl9Ci0JCQl9CQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJY2xvc2UoZmFsc2UpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZTEpKTsJLy8gRXJyb3IgZHVyaW5nIGNsb3NlLCBqdXN0IGxvZyBpdC4gLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgbmV3IElPQ29tbWFuZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkJCQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmTmV4dEJ5dGUgPj0gZkxhc3RCeXRlKSB7Ci0JCQlmaWxsQnVmZmVyKCk7Ci0JCX0KLQkJaWYgKGZMYXN0Qnl0ZSA9PSAtMSkKLQkJCXJldHVybiAtMTsJLy8gV2UndmUgcHJldmlvdXNseSByZWFjaGVkIHRoZSBlbmQuCQkKLQkJCi0JCXJldHVybiBmQnVmZmVyW2ZOZXh0Qnl0ZSsrXSAmIDB4RkY7CS8vIFNvIHRoYXQgaXQgaXMgaW4gcmFuZ2UgMCB0byAyNTUuCi0JfQotCQotCXB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8Ci0JCQkoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAobGVuID09IDApIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCQotCQlpbnQgcmVhZCA9IDA7Ci0JCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQlpZiAoZk5leHRCeXRlID49IGZMYXN0Qnl0ZSkKLQkJCQlmaWxsQnVmZmVyKCk7Ci0JCQlpZiAoZkxhc3RCeXRlID09IC0xKQotCQkJCXJldHVybiByZWFkICE9IDAgPyByZWFkIDogLTE7CS8vIE5vIG1vcmUsIHJldHVybiBhbW91bnQgcmVhZCwgb3IgaWYgbm9uZSByZWFkLCB0aGVuIC0xCi0JCQlpbnQgbW92ZSA9IGZMYXN0Qnl0ZSAtIGZOZXh0Qnl0ZTsKLQkJCWlmIChtb3ZlID4gbGVuKQotCQkJCW1vdmUgPSBsZW47Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZCdWZmZXIsIGZOZXh0Qnl0ZSwgYiwgb2ZmLCBtb3ZlKTsKLQkJCXJlYWQgKz0gbW92ZTsKLQkJCWZOZXh0Qnl0ZSArPSBtb3ZlOwotCQkJb2ZmICs9IG1vdmU7Ci0JCQlsZW4gLT0gbW92ZTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlYWQ7Ci0JfQotCQkJCi0JcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZkxhc3RCeXRlICE9IC0xID8gZkxhc3RCeXRlIC0gZk5leHRCeXRlIDogMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljbG9zZSh0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoYm9vbGVhbiB3YWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZk91dCA9PSBudWxsKQotCQkJcmV0dXJuOwkvLyBBbHJlYWR5IGNsb3NlZC4KLQkJdHJ5IHsKLQkJCWZPdXQud3JpdGVCeXRlKENvbW1hbmRzLkNBTExCQUNLX1NUUkVBTV9URVJNSU5BVEUpOwotCQkJZk91dC5mbHVzaCgpOwotCQkJZk91dCA9IG51bGw7CS8vIFNvIHRoYXQgd2Uga25vdyB3ZSBjbG9zZWQgYWxyZWFkeSBpZiBlcnJvciBvY2N1cnMgZHVyaW5nIGluIHJlYWQoKSBiZWxvdy4KLQkJCWlmICh3YWl0KSB7Ci0JCQkJLy8gTmVlZCB0byByZWFkIHVudGlsIEVuZCBvZiBzdHJlYW0gYmVjYXVzZSB3ZSBuZWVkIHRvIGZsdXNoIG91dCB0aGUKLQkJCQkvLyBzdHJlYW0gc28gdGhhdCBuZXh0IHRpbWUgd2UgdXNlIHRoaXMgY29ubmVjdGlvbiB3ZSBzdGFydCBmcmVzaC4KLQkJCQkvLyBJZiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IGZpbmlzaGVkIHdyaXRpbmcsIHdlIHdpbGwgcmVhZCB1bnRpbCB0aGVuLgotCQkJCS8vIElmIHRoZSBzZXJ2ZXIgaGFzIG5vdCB5ZXQgZmluaXNoZWQgd3JpdGluZywgd2hlbiBpdCByZWFkcyB0aGUgdGVybWluYXRlCi0JCQkJLy8gcmVxdWVzdCBpdCB3aWxsIHNlbmQgYW4gZW5kIG9mIHN0cmVhbSBtYXJrZXIgZm9yIHVzIHRvIHJlYWQuIEJ1dCBlaXRoZXIKLQkJCQkvLyB3YXkgd2UgY2FuJ3QgbGVhdmUgdW50aWwgd2UndmUgcmVhZCBldmVyeXRoaW5nIGZyb20gdGhlIHN0cmVhbS4KLQkJCQkKLQkJCQkvLyBJZiBjYWxsZWQgd2l0aCBubyB3YWl0LCB0aGVuIHdlIGFyZSBjbG9zaW5nIGhhcmQgYW5kIHdpbGwgYmUgY2xvc2luZyB0aGUgc29ja2V0IHRvby4KLQkJCQl3aGlsZSAocmVhZCgpICE9IC0xKSB7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY2xlYXJTdHJlYW0oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmM0MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci0KLS8qKgotICogVGhpcyByZWdpc3RyeSB3aWxsIGhhbmRsZSBjYWxsYmFja3MuCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG5vIG9uZQotICogc2hvdWxkIGFjY2VzcyBpdCBvdXRzaWRlLgotICovCi1jbGFzcyBSRU1DYWxsYmFja1JlZ2lzdHJ5IGltcGxlbWVudHMgSUNhbGxiYWNrUmVnaXN0cnkgewotCWZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5OwotCWZpbmFsIFN0cmluZyBmTmFtZVBvc3RmaXg7Ci0JTGlzdCBmVGhyZWFkcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IExpbmtlZExpc3QoKSk7CS8vIExpc3Qgb2YgYWN0aXZlIGNhbGxiYWNrIHRocmVhZHMuCQotCQotCU1hcCBmSWRUb0NhbGxiYWNrID0gbmV3IEhhc2hNYXAoNSk7CS8vIElEIHRvIENhbGxiYWNrIG1hcC4KLQlNYXAgZkNhbGxiYWNrUHJveHlUb0lkID0gbmV3IEhhc2hNYXAoNSk7CS8vIENhbGxiYWNrIHRvIElEIG1hcC4gVGhpcyB3aWxsIGFsc28gaG9sZCBvbnRvIHRoZSBjYWxsYmFjayBwcm94aWVzIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgR0MnZCB3aGlsZSB0aGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KLQkJCi0JSVJFTU1ldGhvZFByb3h5IGZJbml0aWFsaXplQ2FsbGJhY2s7Ci0JSUJlYW5Qcm94eSBmUmVtb3RlU2VydmVyOwotCQotCWJvb2xlYW4gcmVnaXN0cnlPcGVuID0gdHJ1ZTsKLQkKLQlwdWJsaWMgUkVNQ2FsbGJhY2tSZWdpc3RyeShTdHJpbmcgbmFtZSwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYUZhY3RvcnkpIHsKLQkKLQkJZkZhY3RvcnkgPSBhRmFjdG9yeTsKLQkJZk5hbWVQb3N0Zml4ID0gbmFtZTsKLQkJCi0JCS8vIE5vdyByZWdpc3RlciBjb21tb24gcHJveGllcy4KLQkJSVJFTUJlYW5UeXBlUHJveHkgY2FsbGJhY2tUeXBlID0gbmV3IFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkoZkZhY3RvcnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklDQUxMQkFDS19DTEFTUyksICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLklDYWxsYmFjayIpOyAvLyROT04tTkxTLTEkCi0JCi0JCWZJbml0aWFsaXplQ2FsbGJhY2sgPSAoSVJFTU1ldGhvZFByb3h5KSAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLm1ldGhvZFR5cGUubmV3QmVhblByb3h5KG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOSVRJQUxJWkVDQUxMQkFDS19NRVRIT0RfSUQpKTsKLQkJCi0JCWZSZW1vdGVTZXJ2ZXIgPSBhRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuZ2V0SVZNU2VydmVyUHJveHkoKTsJLy8gRm9yIHVzLCB0aGUgSVZNU2VydmVyIG9uIHRoZSByZW1vdGUgdm0gQUxTTyBpbXBsZW1lbnRzIElWTUNhbGxiYWNrU2VydmVyLgotCi0JCSgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGNhbGxiYWNrVHlwZSwgdHJ1ZSk7Ci0JCSgoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLnJlZ2lzdGVyUHJveHkoZkluaXRpYWxpemVDYWxsYmFjayk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVDYWxsYmFjayhTb2NrZXQgaW5jb21pbmcpIHsKLQkJaWYgKHJlZ2lzdHJ5T3BlbikgewotCQkJVGhyZWFkIHN0ID0gbmV3IFJFTUNhbGxiYWNrVGhyZWFkKGluY29taW5nLCB0aGlzLCAiQ2FsbGJhY2sgVGhyZWFkLSIrZk5hbWVQb3N0Zml4LCBmRmFjdG9yeSwgZkZhY3RvcnkuZk5vVGltZW91dHMpOyAvLyROT04tTkxTLTEkCi0JCQlmVGhyZWFkcy5hZGQoc3QpOwotCQkJc3Quc3RhcnQoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gcmVxdWVzdCBhIHNodXRkb3duLiBJZiB0aGUgc2VydmVyIGlzIGFscmVhZHkgc2h1dGRvd24sIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWVzdFNodXRkb3duKCkgewkJCi0JCWlmIChyZWdpc3RyeU9wZW4pCi0JCQlzaHV0ZG93bigpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYSB0aHJlYWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFja1RocmVhZChSRU1DYWxsYmFja1RocmVhZCB0aHJlYWQpIHsKLQkJZlRocmVhZHMucmVtb3ZlKHRocmVhZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaHV0ZG93bigpIHsKLQkJCi0JCS8vIEdvIHRocm91Z2ggZWFjaCB0aHJlYWQgYW5kIGFzayBpdCB0byBjbG9zZS4gTWFrZSBhIGNvcHkgb2YgdGhlIGxpc3Qgc28gdGhhdCB3ZQotCQkvLyB3b24ndCBnZXQgaW50byBkZWFkbG9ja3MuCi0JCVJFTUNhbGxiYWNrVGhyZWFkW10gdGhyZWFkc0FycmF5ID0gKFJFTUNhbGxiYWNrVGhyZWFkW10pIGZUaHJlYWRzLnRvQXJyYXkobmV3IFJFTUNhbGxiYWNrVGhyZWFkW2ZUaHJlYWRzLnNpemUoKV0pOwotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBUaGlzIGlzIGEgaGFyc2ggd2F5IHRvIHNodXQgYSBjb25uZWN0aW9uIGRvd24sIGJ1dCB0aGVyZSdzIG5vCi0JCQkvLyBvdGhlciB3YXkgSSBrbm93IG9mIHRvIGludGVycnVwdCB0aGUgcmVhZCBvbiBhIHNvY2tldC4KLQkJCXRocmVhZHNBcnJheVtpXS5jbG9zZSgpOwotCQl9Ci0JCQkKLQkJLy8gTm93IHRoYXQgdGhleSd2ZSBiZWVuIHRvbGQgdG8gY2xvc2UsIHdhaXQgb24gZWFjaCBvbmUgdG8gZmluaXNoLgotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKQotCQkJdHJ5IHsKLQkJCQl0aHJlYWRzQXJyYXlbaV0uam9pbigxMDAwMCk7CS8vIFdhaXQgdGVuIHNlY29uZHMsIGlmIGxvbmdlciwganVzdCBnbyBvbiB0byBuZXh0IG9uZS4KLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCQotCQlmVGhyZWFkcy5jbGVhcigpOwotCQlmSWRUb0NhbGxiYWNrLmNsZWFyKCk7Ci0JCWZDYWxsYmFja1Byb3h5VG9JZC5jbGVhcigpOwotCQlmSW5pdGlhbGl6ZUNhbGxiYWNrID0gbnVsbDsKLQkJZlJlbW90ZVNlcnZlciA9IG51bGw7Ci0JCQkKLQl9CQkKLQkKLQlwdWJsaWMgSUNhbGxiYWNrIGdldFJlZ2lzdGVyZWRDYWxsYmFjayhpbnQgaWQpIHsKLQkJc3luY2hyb25pemVkKGZJZFRvQ2FsbGJhY2spCXsJCi0JCQlyZXR1cm4gKElDYWxsYmFjaykgZklkVG9DYWxsYmFjay5nZXQobmV3IEludGVnZXIoaWQpKTsKLQkJfQotCX0KLQkJCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2spCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGNhbGxiYWNrUHJveHksIElDYWxsYmFjayBjYikgewotCQlzeW5jaHJvbml6ZWQoZklkVG9DYWxsYmFjaykgewotCQkJZklkVG9DYWxsYmFjay5wdXQoKChJUkVNQmVhblByb3h5KSBjYWxsYmFja1Byb3h5KS5nZXRJRCgpLCBjYik7Ci0JCQlmQ2FsbGJhY2tQcm94eVRvSWQucHV0KGNhbGxiYWNrUHJveHksICgoSVJFTUJlYW5Qcm94eSkgY2FsbGJhY2tQcm94eSkuZ2V0SUQoKSk7Ci0JCQlmSW5pdGlhbGl6ZUNhbGxiYWNrLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5LCBuZXcgSUJlYW5Qcm94eVtdIHtmUmVtb3RlU2VydmVyLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgoKElSRU1CZWFuUHJveHkpIGNhbGxiYWNrUHJveHkpLmdldElEKCkuaW50VmFsdWUoKSl9KTsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2tSZWdpc3RyeSNyZWdpc3RlckNhbGxiYWNrKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckNhbGxiYWNrKElQcm94eSBjYWxsYmFja1Byb3h5LCBmaW5hbCBJQ2FsbGJhY2sgY2IsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJZmluYWwgSW50ZWdlciBpZDsKLQkJaWYgKGNhbGxiYWNrUHJveHkuaXNCZWFuUHJveHkoKSkgewotCQkJaWQgPSAoKElSRU1CZWFuUHJveHkpIGNhbGxiYWNrUHJveHkpLmdldElEKCk7Ci0JCQlzeW5jaHJvbml6ZWQoZklkVG9DYWxsYmFjaykgewotCQkJCWZJZFRvQ2FsbGJhY2sucHV0KGlkLCBjYik7Ci0JCQkJZkNhbGxiYWNrUHJveHlUb0lkLnB1dChjYWxsYmFja1Byb3h5LCBpZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZCA9IG5ldyBJbnRlZ2VyKGNhbGxiYWNrUHJveHkuaGFzaENvZGUoKSk7Ci0JCQlzeW5jaHJvbml6ZWQgKGZJZFRvQ2FsbGJhY2spIHsKLQkJCQlmSWRUb0NhbGxiYWNrLnB1dChpZCwgY2IpOwkvLyBUaGlzIGlzIHNvIHRoYXQgaXQgaXMgcmVnaXN0ZXJlZCBpbiBjYXNlIGNhbGxiYWNrIGlzIGludm9rZWQgZnJvbSByZW1vdGUgdm0gZHVyaW5nIGV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLQkJCX0KLQkJCSgoRXhwcmVzc2lvblByb3h5KSBjYWxsYmFja1Byb3h5KS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJc3luY2hyb25pemVkKGZJZFRvQ2FsbGJhY2spIHsKLQkJCQkJCWZDYWxsYmFja1Byb3h5VG9JZC5wdXQoZXZlbnQuZ2V0UHJveHkoKSwgaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQkvLyBGYWlsZWQsIHNvIHJlbW92ZSByZWdpc3RyYXRpb24gY29tcGxldGVseS4KLQkJCQkJc3luY2hyb25pemVkIChmSWRUb0NhbGxiYWNrKSB7Ci0JCQkJCQlmSWRUb0NhbGxiYWNrLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlWb2lkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gRmFpbGVkLCBzbyByZW1vdmUgcmVnaXN0cmF0aW9uIGNvbXBsZXRlbHkuCi0JCQkJCXN5bmNocm9uaXplZCAoZklkVG9DYWxsYmFjaykgewotCQkJCQkJZklkVG9DYWxsYmFjay5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQkJZXhwcmVzc2lvbi5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UoZkluaXRpYWxpemVDYWxsYmFjaywgY2FsbGJhY2tQcm94eSwgbmV3IElQcm94eVtdIHtmUmVtb3RlU2VydmVyLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChpZC5pbnRWYWx1ZSgpKX0sIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIGRlcmVnaXN0ZXJpbmcgY2FsbGJhY2tzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGNhbGxiYWNrUHJveHkpIHsKLQkJc3luY2hyb25pemVkKGZJZFRvQ2FsbGJhY2spCXsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgZkNhbGxiYWNrUHJveHlUb0lkLnJlbW92ZShjYWxsYmFja1Byb3h5KTsKLQkJCWZJZFRvQ2FsbGJhY2sucmVtb3ZlKGlkKTsKLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja1RocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI1ZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5UcmFuc21pdGFibGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgdGhyZWFkIGhhbmRsZXMgdGhlIGFjdHVhbCBjYWxsYmFjay4KLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lIGVsc2Ugc2hvdWxkIGFjY2VzcyBpdC4KLSAqLwotY2xhc3MgUkVNQ2FsbGJhY2tUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCWZpbmFsIFJFTUNvbm5lY3Rpb24gZkNvbm5lY3Rpb247CS8vIEEgY29ubmVjdGlvbiB0byB1c2UKLQlmaW5hbCBSRU1DYWxsYmFja1JlZ2lzdHJ5IGZTZXJ2ZXI7Ci0JZmluYWwgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZGYWN0b3J5OwotCWZpbmFsIFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZlR5cGVGYWN0b3J5OwotCWZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCXByb3RlY3RlZCBib29sZWFuIHNodXR0aW5nRG93bjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpblRyYW5zYWN0aW9uOwkvLyBJcyB0aGlzIHRocmVhZCBjdXJyZW50bHkgcGFydGljaXBhdGluZyBpbiBhIHRyYW5zYWN0aW9uLCAoaS5lLiByZWFkaW5nL3dyaXRpbmcpLCBpZiBzbyB0aGVuIHdlIGNhbid0IHVzZSBpdCBmb3IgYW5vdGhlciB0cmFuc2FjdGlvbi4KLQkKLQotCS8qKgotCSAqIElzIHRoaXMgY2FsbGJhY2sgdGhyZWFkIGN1cnJlbnRseSBwYXJ0aWNpcGF0aW5nIGluIGEgdHJhbnNhY3Rpb24gKHJlYWRpbmcvd3JpdGluZykuIElmIHNvIHRoZW4gaXQgY2FuJ3QgYmUgdXNlZCBmb3IgYW4KLQkgKiBpbmRlcGVuZGVudCBuZXcgdHJhbnNhY3Rpb24uIEluIG90aGVyIHdvcmRzIHlvdSBjYW4ndCB3cml0ZS9yZWFkIGRhdGEgdXNpbmcgdGhpcyBjYWxsYmFjayB0aHJlYWQncwotCSAqIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZSBleHBlY3RpbmcgdG8gaGF2ZSBleGNsdXNpdmUgcmVhZC93cml0ZSBvbiB0aGlzIGNvbm5lY3Rpb24uCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0JCXJldHVybiBpblRyYW5zYWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGlzIGNhbGxiYWNrIHRocmVhZCBpcyBpbiBhIHRyYW5zYWN0aW9uIG9yIG5vdC4gSWYgaXQgaXMgaW4gYSB0cmFuc2FjdGlvbiBpdCBjYW5ub3QgYmUgdXNlZAotCSAqIGZvciBhbiBpbmRlcGVuZGVudCBuZXcgdHJhbnNhY3Rpb24uIEluIG90aGVyIHdvcmRzIHlvdSBjYW4ndCB3cml0ZS9yZWFkIGRhdGEgdXNpbmcgdGhpcyBjYWxsYmFjayB0aHJlYWQncwotCSAqIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZSBleHBlY3RpbmcgdG8gaGF2ZSBleGNsdXNpdmUgcmVhZC93cml0ZSBvbiB0aGlzIGNvbm5lY3Rpb24uCi0JICogQHBhcmFtIGluVHJhbnNhY3Rpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRyYW5zYWN0aW9uKGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgewotCQl0aGlzLmluVHJhbnNhY3Rpb24gPSBpblRyYW5zYWN0aW9uOwotCX0KLQkKLQkvLyBLbHVkZ2U6IEJ1ZyBpbiBMaW51eCAxLjMueHh4IG9mIEpWTS4gQ2xvc2luZyBhIHNvY2tldCB3aGlsZSB0aGUgc29ja2V0IGlzIGJlaW5nIHJlYWQvYWNjZXB0IHdpbGwgbm90IGludGVycnVwdCB0aGUKLQkvLyB3YWl0LiBOZWVkIHRvIHRpbWVvdXQgdG8gdGhlIHNvY2tldCByZWFkL2FjY2VwdCBiZWZvcmUgdGhlIHNvY2tldCBjbG9zZSB3aWxsIGJlIG5vdGljZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQKLQkvLyBpbiBMaW51eCAxLjQuIFNvIG9uIExpbnV4IDEuMyBuZWVkIHRvIHB1dCB0aW1lb3V0cyBpbiBvbiB0aG9zZSBzb2NrZXRzIHRoYXQgY2FuIGJlIHNlcGFyYXRlbHkgY2xvc2VkIHdoaWxlIHJlYWRpbmcvYWNjZXB0aW5nLgotCXN0YXRpYyBib29sZWFuIExJTlVYXzFfMyA9ICJsaW51eCIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjMiKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQotCXB1YmxpYyBSRU1DYWxsYmFja1RocmVhZChTb2NrZXQgc29ja2V0LCBSRU1DYWxsYmFja1JlZ2lzdHJ5IHNlcnZlciwgU3RyaW5nIG5hbWUsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBib29sZWFuIG5vVGltZW91dHMpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCQlmQ29ubmVjdGlvbiA9IG5ldyBSRU1Db25uZWN0aW9uKHNvY2tldCwgdHJ1ZSk7CS8vIE5vIHRpbWVvdXRzIHNpbmNlIHRoaXMgaXMgYSBzZXJ2ZXIgdGhyZWFkLgotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCWZTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWZGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQlmVHlwZUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gY2xvc2UgZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCXNodXR0aW5nRG93biA9IHRydWU7CS8vIFNvIHRoYXQgaWYgdGhpcyBpcyBhIGZvcmNlZCBjbG9zZSB0aGVuIGl0IHdpbGwga25vdyBub3QgdG8gcHJpbnQgZXJyb3IgbXNncy4KLQkJCWlmIChmQ29ubmVjdGlvbi5mU29ja2V0ICE9IG51bGwpCi0JCQkJZkNvbm5lY3Rpb24uZlNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBJUkVNQ29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsYmFjay4gVXNlZCBieQotCSAqIHRoZSBjb25uZWN0aW9uIHNlcnZlciB0byByZXR1cm4gdGhpcyBjb25uZWN0aW9uIGZvciBhbnkgcmVxdWVzdHMgCi0JICogbWFkZSBvbiB0aGlzIHRocmVhZC4KLQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IHNvIHRoYXQgb25seSByZW1vdGUgcHJveHkgY2FuIGFjY2Vzcy4KLQkgKi8KLQlJUkVNQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gZkNvbm5lY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBmQ29ubmVjdGlvbi5pbjsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBmQ29ubmVjdGlvbi5vdXQ7CQotCQlJbnB1dFN0cmVhbSBpbnMgPSBudWxsOwkKLQkJYm9vbGVhbiBzaHV0ZG93biA9IGZhbHNlOwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwkvLyBXb3JraW5nIHZhbHVlIG9iamVjdCBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLgotCQlCZWFuUHJveHlWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlciA9IG5ldyBCZWFuUHJveHlWYWx1ZVNlbmRlcih0aGlzLmZGYWN0b3J5KTsJLy8gV29ya2luZyB2YWx1ZXNlbmRlciBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLiAKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gZG9Mb29wID0gdHJ1ZTsKLQotCQkJLyoqCi0JCQkgKiBOb3RlOiBJbiB0aGUgY2FzZXMgYmVsb3cgeW91IHdpbGwgc2VlIGEgbG90IG9mIGZpbmFsbHkgY2xhdXNlcyB0aGF0IG51bGwgdmFyaWFibGVzIG91dC4KLQkJCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGxvb3AsIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgd2l0aGluIGJsb2NrcyBhcmUgbm90Ci0JCQkgKiBnYXJiYWdlIGNvbGxlY3RlZCB1bnRpbCB0aGUgbWV0aG9kIGlzIHRlcm1pbmF0ZWQsIHNvIHRoZXNlIHZhcmlhYmxlcyBvbmNlIHNldCB3b3VsZCBuZXZlcgotCQkJICogYmUgR0MnZC4gVGhlIG51bGxpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY2FzZSBtYWtlcyBzdXJlIHRoYXQgYW55IG9mIHRob3NlIG9iamVjdHMgc2V0IGFyZQotCQkJICogbm93IGF2YWlsYWJsZSBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gbmVjZXNzYXJ5LgotCQkJICovCQkKLQkJCXdoaWxlKGRvTG9vcCkgewotCQkJCWJ5dGUgY21kID0gMDsKLQkJCQl0cnkgewotCQkJCQlpZiAoTElOVVhfMV8zKQotCQkJCQkJZkNvbm5lY3Rpb24uZlNvY2tldC5zZXRTb1RpbWVvdXQoMTAwMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBzdGF0aWMgTElOVVhfMV8zIGFib3ZlCi0JCQkJCWNtZCA9IGluLnJlYWRCeXRlKCk7Ci0JCQkJCWlmIChMSU5VWF8xXzMpCi0JCQkJCQlmQ29ubmVjdGlvbi5mU29ja2V0LnNldFNvVGltZW91dCgwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIHN0YXRpYyBMSU5VWF8xXzMgYWJvdmUKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7CS8vIFRpbWVkIG91dCwgdHJ5IGFnYWluCi0JCQkJfQotCQkJCQkKLQkJCQlzd2l0Y2ggKGNtZCkgewotCQkJCQljYXNlIENvbW1hbmRzLlFVSVRfQ09OTkVDVElPTjoJCQkJCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCi0JCQkJCQlicmVhazsJLy8gQ2xvc2UgdGhpcyBjb25uZWN0aW9uCi0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5URVJNSU5BVEVfU0VSVkVSOgotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQkKLQkJCQkJCXNodXRkb3duID0gdHJ1ZTsJLy8gU2h1dGRvd24gZXZlcnl0aGluZwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5DQUxMQkFDSzoKLQkJCQkJCWludCBjYWxsSUQgPSBpbi5yZWFkSW50KCk7CS8vIFRoZSBpZCBvZiB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB0byBjYWxsLgotCQkJCQkJaW50IG1zZ0lEID0gaW4ucmVhZEludCgpOwkvLyBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gY2FsbC4KLQkJCQkJCU9iamVjdCBwYXJtID0gbnVsbDsKLQkJCQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJCQkJSUNhbGxiYWNrIGNiID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gVGhlIHJlZ2lzdGVyIGNhbGxiYWNrIGhhbmRsZXIgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIHBhcm0sCi0JCQkJCQkJLy8gaXQgd2lsbCBrbm93IGlmIGl0IGlzIGFuIGFycmF5IG9mIHByb3hpZXMsIG9yIGFuIG9iamVjdCBvZiBzb21lIGtpbmQuCi0JCQkJCQkJZkZhY3Rvcnkuc3RhcnRUcmFuc2FjdGlvbigpOwkvLyBTdGFydCBhIHRyYW5zYWN0aW9uLgotCQkJCQkJCXNldEludHJhbnNhY3Rpb24odHJ1ZSk7CS8vIEFsc28gdGVsbCBvdXJzZWx2ZXMgdGhhdCB3ZSBhcmUgaW4gYSB0cmFuc2FjdGlvbi4KLQkJCQkJCQlib29sZWFuIGlzUHJveGllcyA9IHRydWU7CQkJCQkJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJCS8vIEhvd2V2ZXIgaXQgd2lsbCBiZWNvbWUgSUJlYW5Qcm94eVtdLiBUaGF0IGlzIGJlY2F1c2UgaWYgSUQncwotCQkJCQkJCQkJLy8gdGhleSBtdXN0IGJlIHByb3hpZXMgb3ZlciBoZXJlLgotCQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJCWlmICh2YWx1ZVNlbmRlci5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY2xvc2UoKTsJLy8gU29tZXRoaW5nIHdyb25nLCBjbG9zZSB0aGUgdGhyZWFkIHNvIG5leHQgdGltZSB3ZSBnZXQgYSBuZXcgb25lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkJcGFybSA9IHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBJdCBpcyBvYmplY3Qgb3IgbnVsbC4gSXQgY291bGQgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cywgb3Igb25lIG9iamVjdC4KLQkJCQkJCQkJCWlzUHJveGllcyA9IGZhbHNlOwotCQkJCQkJCQkJcGFybSA9IHZhbHVlT2JqZWN0LmdldEFzT2JqZWN0KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlzZXRJbnRyYW5zYWN0aW9uKGZhbHNlKTsKLQkJCQkJCQkJZkZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIE5vdyBwZXJmb3JtIHRoZSBjYWxsYmFjay4KLQkJCQkJCQljYiA9IGZTZXJ2ZXIuZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKGNhbGxJRCk7Ci0JCQkJCQkJaWYgKGNiICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gQ2FsbGJhY2sgc3RpbGwgcmVnaXN0ZXJlZC4gSWYgcHJveGllcywgdGhlbiBpZiBmaXJzdCBlbnRyeSBpcyBqdXN0IGEgcHJveHksCi0JCQkJCQkJCS8vIHRoZW4gd2UgYXJlIHNlbmRpbmcgb25seSBvbmUuIEEgY29udmllbmVuY2UgZmFjdG9yIGZvciBjYWxsYmFja3MuCi0JCQkJCQkJCS8vIElmIG5vdCBhIHNpbmdsZSBlbnRyeSBvZiBJQmVhblByb3h5LCB0aGVuIHNlbmQgd2hvbGUgYXJyYXkuCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoaXNQcm94aWVzKQotCQkJCQkJCQkJCWlmICgoKE9iamVjdFtdKSBwYXJtKS5sZW5ndGggPT0gMSAmJiAoKChPYmplY3RbXSkgcGFybSlbMF0gPT0gbnVsbCB8fCAoKE9iamVjdFtdKSBwYXJtKVswXSBpbnN0YW5jZW9mIElCZWFuUHJveHkpKQotCQkJCQkJCQkJCQlyZXN1bHQgPSBjYi5jYWxsZWRCYWNrKG1zZ0lELCAoSUJlYW5Qcm94eSkgKChPYmplY3RbXSkgcGFybSlbMF0pOwotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJcmVzdWx0ID0gY2IuY2FsbGVkQmFjayhtc2dJRCwgKE9iamVjdFtdKSBwYXJtKTsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQlyZXN1bHQgPSBjYi5jYWxsZWRCYWNrKG1zZ0lELCBwYXJtKTsKLQkJCQkJCQkJCS8vIFdlIG9ubHkgYWNjZXB0IG51bGwsIElSRU1CZWFuUHJveGllcywgYW5kIE9iamVjdFtdLCB3aGVyZQotCQkJCQkJCQkJLy8gY29udGVudHMgb2YgT2JqZWN0W10gYXJlIGJlYW4gcHJveGllcy4KLQkJCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJCQkJICgoSVJFTUJlYW5Qcm94eSkgcmVzdWx0KS5yZW5kZXJCZWFuKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQkJCQkJCQkJY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQkJCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJCQkJCU9iamVjdFtdIGFycmF5OwotCQkJCQkJCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJCQkJCQkJCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCQkJCQkJCQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJCQkJCQkJCQlPYmplY3QgcmV0UGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJCQkJCQkJCQkJaWYgKHJldFBhcm0gIT0gbnVsbCkKLQkJCQkJCQkJCQkJCQlpZiAocmV0UGFybSBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJCQkJCQkJCSAoKElSRU1CZWFuUHJveHkpIHJldFBhcm0pLnJlbmRlckJlYW4od29ya2VyKTsKLQkJCQkJCQkJCQkJCQllbHNlIGlmIChyZXRQYXJtIGluc3RhbmNlb2YgVHJhbnNtaXRhYmxlQXJyYXkpIHsKLQkJCQkJCQkJCQkJCQkJLy8gSXQgaXMgYW5vdGhlciBhcnJheSwgY3JlYXRlIGEgbmV3Ci0JCQkJCQkJCQkJCQkJCS8vIHJldHJpZXZlci4KLQkJCQkJCQkJCQkJCQkJd29ya2VyLnNldEFycmF5SURTKAotCQkJCQkJCQkJCQkJCQkJbmV3IFJldHJpZXZlcigoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5hcnJheSksCi0JCQkJCQkJCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5hcnJheS5sZW5ndGgsCi0JCQkJCQkJCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5jb21wb25lbnRUeXBlSUQpOwotCQkJCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkJCS8vIEl0J3MgYW4gb2JqZWN0LiBOZWVkIHRvIGdldCBiZWFuCi0JCQkJCQkJCQkJCQkJCS8vIHR5cGUgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdC4KLQkJCQkJCQkJCQkJCQkJSVJFTUJlYW5Qcm94eSB0eXBlID0KLQkJCQkJCQkJCQkJCQkJCShJUkVNQmVhblByb3h5KSBmVHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShyZXRQYXJtLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJCQkJCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJCQkJCQkJCQkJaW50IGNsYXNzSUQgPSB0eXBlLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCQkJCQkJCQkJCQkJd29ya2VyLnNldEFzT2JqZWN0KHJldFBhcm0sIGNsYXNzSUQpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJCQl3b3JrZXIuc2V0KCk7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gd29ya2VyOyAKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX07Ci0KLQkJCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXRBcnJheUlEUygKLQkJCQkJCQkJCQkJbmV3IFJldHJpZXZlcigoT2JqZWN0W10pIHJlc3VsdCksCi0JCQkJCQkJCQkJCSgoT2JqZWN0W10pIHJlc3VsdCkubGVuZ3RoLAotCQkJCQkJCQkJCQlDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5OT19FUlJPUik7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gU29tZXRoaW5nIGhhcHBlbmVkLCB0dXJuIGl0IGludG8gYW4gZXJyb3Igb2JqZWN0Ci0JCQkJCQkJCQkvLyB0byBzZW5kIGJhY2suCi0JCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICc6JyArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRDYWxsYmFja0RvbmVDb21tYW5kKG91dCwgdmFsdWVPYmplY3QsIENvbW1hbmRzLkNBTExCQUNLX1JVTlRJTUVfRVhDRVBUSU9OKTsKLQkJCQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsJLy8gSnVzdCBsb2cgaXQsIGJ1dCBhc3N1bWUgc2FmZSBlbm91Z2ggdG8ganVzdCBnbyBiYWNrIGFuZCB3YWl0IGZvciBuZXh0IGNhbGxiYWNrIHJlcXVlc3QuCi0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQob3V0LCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuQ0FMTEJBQ0tfTk9UX1JFR0lTVEVSRUQpOwkvLyBTZW5kIGVycm9yIG1zZyBiYWNrIHRvIGluZGljYXRlIHdlIHdlcmVuJ3QgcmVnaXN0ZXJlZC4JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJcGFybSA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkJCQkJY2IgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCXZhbHVlU2VuZGVyLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkNBTExCQUNLX1NUUkVBTToKLQkJCQkJCS8vIEEgcmVxdWVzdCBmb3IgYSBzdHJlYW0KLQkJCQkJCWNhbGxJRCA9IGluLnJlYWRJbnQoKTsJLy8gVGhlIGlkIG9mIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHRvIGNhbGwuCi0JCQkJCQltc2dJRCA9IGluLnJlYWRJbnQoKTsJLy8gVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIGNhbGwuCi0JCQkJCQljYiA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIE5vdyBwZXJmb3JtIHRoZSBjYWxsYmFjay4KLQkJCQkJCQljYiA9IGZTZXJ2ZXIuZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKGNhbGxJRCk7Ci0JCQkJCQkJaWYgKGNiICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gQ2FsbGJhY2sgc3RpbGwgcmVnaXN0ZXJlZAotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsJCQkJCQkJCQotCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5OT19FUlJPUik7CS8vIFNlbmQgbnVsbCB0byBsZXQgaXQga25vdyB3ZSd2ZSBhY2NlcHRlZCB0aGUgc3RyZWFtCi0JCQkJCQkJCWlucyA9IG5ldyBSRU1DYWxsYmFja0lucHV0U3RyZWFtKGluLCBvdXQpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJY2IuY2FsbGVkQmFja1N0cmVhbShtc2dJRCwgaW5zKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW5zLmNsb3NlKCk7CS8vIE1ha2Ugc3VyZSBpdCdzIGNsb3NlZC4KLQkJCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBFeGNlcHRpb24gd2hpbGUgY2xvc2luZywganVzdCBsb2cgaXQgYW5kIHRoZW4gbWFyayB0byBlbmQgdGhlIGxvb3Agc28gd2UgY2xvc2UgY29ubmVjdGlvbiB0b28uCi0JCQkJCQkJCQkJZG9Mb29wID0gZmFsc2U7Ci0JCQkJCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJJbiBSRU1DYWxsYmFja1RocmVhZCIsIGUpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5DQUxMQkFDS19OT1RfUkVHSVNURVJFRCk7CS8vIFNlbmQgZXJyb3IgbXNnIGJhY2sgdG8gaW5kaWNhdGUgd2Ugd2VyZW4ndCByZWdpc3RlcmVkLgkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQljYiA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCWlucyA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQotCQkJCQlkZWZhdWx0OgotCQkJCQkJLy8gVW5rbm93biBjb21tYW5kLiBXZSBkb24ndCBrbm93IGhvdyBsb25nIHRoZSBjb21tYW5kIGlzLCBzbyB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJSRU1DYWxsYmFjazogSW52YWxpZCBjbWQgc2VudD0iK2NtZCwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCQkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gb24gdGhlIG90aGVyIHNpZGUgd2FzIHRlcm1pbmF0ZWQuCi0JCQkvLyBTbyBqdXN0IGFjY2VwdCB0aGlzIGFuZCBnbyBkb3duLgotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKCFzaHV0dGluZ0Rvd24pCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJJbiBSRU1DYWxsYmFja1RocmVhZCIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCWNsb3NlKCk7Ci0JCX0JCQotCQlmU2VydmVyLnJlbW92ZUNhbGxiYWNrVGhyZWFkKHRoaXMpOwotCQlpZiAoc2h1dGRvd24pCi0JCQlmU2VydmVyLnJlcXVlc3RTaHV0ZG93bigpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzVjZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAkUkNTZmlsZTogUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJQ2hhcmFjdGVyQmVhblByb3h5IGZvciB0aGUgQ2hhcmFjdGVyIGNsYXNzLiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwCi0gKiA5OjAyOjU0IEFNKSBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUNoYXJhY3RlckJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIENoYXJhY3RlciBmQ2hhclZhbHVlOwotCi0JLyoqCi0JICogQXMgd2VsbCBhcyBzdG9yaW5nIHRoZSBiZWFuIHN0b3JlIHRoZSBjaGFyIHZhbHVlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgY2hhclZhbHVlIGZhc3RlcgotCSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIHJlLWNhc3RpbmcuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotCSAqIHNwZWNpYWwgd2F5LCBzbyBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZXNlLgotCSAqIAotCSAqIEBwYXJhbSBhQmVhbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCVJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2hhcmFjdGVyIHZhbHVlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSk7Ci0JCWZDaGFyVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCAyKSBFbHNlIGlmIG90aGVyIGlzIGFuCi0JICogSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmIGVxdWFscyBvbiB0aGUgc2VydmVyLiAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQKLQkgKiBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50IHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksCi0JICogdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkpCi0JCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKSA9PSAoKFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpID09ICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdmFsdWUKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEubGFuZy5DaGFyYWN0ZXIgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ2hhcmFjdGVyIGNoYXJhY3RlclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHRvU3RyaW5nKCkgb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnR5cGUKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jaGFyYWN0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXQoZkNoYXJWYWx1ZSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNieXRlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIChieXRlKSBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNkb3VibGVWYWx1ZSgpCi0JICovCi0JcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2Zsb2F0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjaW50VmFsdWUoKQotCSAqLwotCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNsb25nVmFsdWUoKQotCSAqLwotCXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I251bWJlclZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCQlyZXR1cm4gbmV3IEludGVnZXIoY2hhclZhbHVlKCkpOyAvLyBLbHVkZ2UuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I3Nob3J0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCQlyZXR1cm4gKHNob3J0KSBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDlmZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogQ2hhcmFjdGVyIEJlYW5UeXBlIFByb3h5IGZvciBDaGFyYWN0ZXIuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi8yMy8wMCAxOjU5OjAyIFBNKQotICogQGF1dGhvcjogUmljaGFyZCBMZWUgS3VscAotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQlmaW5hbCBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eSBuaWxQcm94eTsJLy8gVmFsdWUgb2YgJ1wwJwotCi1SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBvYmplY3RUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfQ0xBU1MpLCBDaGFyYWN0ZXIuY2xhc3MuZ2V0TmFtZSgpLCBvYmplY3RUeXBlKTsKLQkKLQluaWxQcm94eSA9IG5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBDaGFyYWN0ZXIoJ1wwJykpOwotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUNoYXJhY3RlckJlYW5Qcm94eShDaGFyYWN0ZXIgYUNoYXJhY3RlcikgewotCXJldHVybiAoYUNoYXJhY3Rlci5jaGFyVmFsdWUoKSAhPSAnXDAnKSA/Ci0JCW5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFDaGFyYWN0ZXIpIDogbmlsUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLiBUaGV5IGFyZSBjcmVhdGVkCi0gKiBleHBsaWNpdGx5IHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBDaGFyYWN0ZXIgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIG5pbFByb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmlsUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KG5ldyBDaGFyYWN0ZXIodmFsdWUuYUNoYXIpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5NjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAkUkNTZmlsZTogUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhLHYgJCAkUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIGltcGxlbWVudGF0aW9uIG9mIElDaGFyYWN0ZXJCZWFuUHJveHkuIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkgQGF1dGhvcjogSm9lCi0gKiBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElDaGFyYWN0ZXJCZWFuUHJveHkgewotCXByb3RlY3RlZCBjaGFyIGZDaGFyOwotCi0JUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGNoYXIgdmFsdWUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5KTsKLQkJZkNoYXIgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCAyKSBFbHNlIGlmIG90aGVyIGlzIGFuCi0JICogSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmIGVxdWFscyBvbiB0aGUgc2VydmVyLiAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQKLQkgKiBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50IHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksCi0JICogdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkKLQkJCXJldHVybiBmQ2hhciA9PSAoKFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKTsKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJcmV0dXJuIGZDaGFyID09ICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQkJcmV0dXJuIHRydWU7IC8vIElkZW50aXR5Ci0JCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkKLQkJCXJldHVybiBmQ2hhciA9PSAoKFJFTUNoYXJhY3RlclR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmNoYXJWYWx1ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyIHZhbHVlCi0JICovCi0JcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YS5sYW5nLkNoYXJhY3RlciB2YWx1ZQotCSAqLwotCXB1YmxpYyBDaGFyYWN0ZXIgY2hhcmFjdGVyVmFsdWUoKSB7Ci0JCXJldHVybiBuZXcgQ2hhcmFjdGVyKGZDaGFyKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHRvU3RyaW5nKCkgb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkNoYXIpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnR5cGUKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jaGFyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXQoZkNoYXIpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjYnl0ZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2RvdWJsZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2Zsb2F0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2ludFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2xvbmdWYWx1ZSgpCi0JICovCi0JcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I251bWJlclZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCQlyZXR1cm4gbmV3IEludGVnZXIoZkNoYXIpOyAvLyBLbHVkZ2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjc2hvcnRWYWx1ZSgpCi0JICovCi0JcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JCXJldHVybiAoc2hvcnQpIGZDaGFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzlmMzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogQ2hhcmFjdGVyLlRZUEUgQmVhblR5cGUgUHJveHkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi8yMy8wMCAxOjU5OjAyIFBNKQotICogQGF1dGhvcjogUmljaGFyZCBMZWUgS3VscAotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotCi0JZmluYWwgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSBuaWxQcm94eTsJLy8gVmFsdWUgb2YgJ1wwJwotLyoqCi0gKiBSRU1DaGFyYWN0ZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFKSwgQ2hhcmFjdGVyLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQluaWxQcm94eSA9IG5ldyBSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgJ1wwJyk7Ci19Ci0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUuCi0gKi8KLUlDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGNoYXIgYUNoYXJhY3RlcikgewotCXJldHVybiBuZXcgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFDaGFyYWN0ZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gQ2hhcmFjdGVyIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSBuaWxQcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIG5pbFByb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUNoYXJhY3RlckJlYW5Qcm94eSh2YWx1ZS5hQ2hhcik7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGRhMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFRoaXMgaXMgYSBiZWFuIHR5cGUgZm9yIHRoZSBDbGFzcyBvYmplY3QuIEl0IGlzIG5lZWRlZCBzbyB0aGF0Ci0gKiB3aGVuIGEgbmV3IG9iamVjdCBpZCBjb21lcyBpbiB0aGF0IHJlcHJlc2VudHMgYSBjbGFzcywgaXQgd2lsbAotICogZ28gdGhyb3VnaCB0aGlzIGJlYW4gdHlwZSB0byBjcmVhdGUgaXQuIFdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCi0gKiBzcGVjaWFsIHNvIHRoYXQgdGhlIGNvcnJlY3QgYmVhbiB0eXBlIG9iamVjdCBpcyBjcmVhdGVkLgotICovCi0KLWZpbmFsIGNsYXNzIFJFTUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB7Ci0KLQotUkVNQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpLCBDbGFzcy5jbGFzcy5nZXROYW1lKCksIG9iamVjdFR5cGUpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ2xhc3MgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGRlZmF1bHQgY3RvciwKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ2xhc3MgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGluaXRpYWxpemF0aW9uIHN0cmluZ3MsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQkJCi0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBOT1RFOiBTaW5jZSB0aGUgQ2xhc3MgdHlwZSBpcyBmaW5hbCwgdGhpcyBmdW5jdGlvbiBpc24ndCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBJbiB0aGlzIGNhc2UgaXQgbWVhbnMgd2UgbmVlZCBhIG5ldyBJQmVhblByb3h5VHlwZS4gV2Ugd2lsbCBsZXQgdGhlIAotICogQmVhbnR5cGUgZmFjdG9yeSBoYW5kbGUgdGhpcyBzaW5jZSBpdCBrbm93cyBob3cgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbgotICogZm9yIGEgc3BlY2lmaWMgaWQuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblR5cGVQcm94eShhbklEKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdlODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJdCB1c2VzIHRoZSBwcm9wZXJ0eSAicHJveHl2bS5idWZzaXplIiB0byBkZXRlcm1pbmUgdGhlIGJ1ZmZlciBzaXplIHRvIHVzZS4gSWYgbm90IHNwZWNpZmllZCwgaXQgdXNlcyB0aGUgc3lzdGVtIGRlZmF1bHQKLSAqLwotcHVibGljIGNsYXNzIFJFTUNvbm5lY3Rpb24gaW1wbGVtZW50cyBJUkVNQ29ubmVjdGlvbiwgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlZPS0VfU1RFUCA9ICJJbnZva2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5WT0tFX01FVEhPRF9TVEVQID0gIkludm9rZSBNZXRob2QiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFNvY2tldCBmU29ja2V0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQlwcm90ZWN0ZWQgRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX09VVCA9IDEwMDAgKiA2MDsJLy8gV2FpdCB1cCB0byBhIG1pbnV0ZSBiZWZvcmUgdGltZW91dC4KLQkKLQlwdWJsaWMgUkVNQ29ubmVjdGlvbihTb2NrZXQgc29ja2V0LCBib29sZWFuIG5vVGltZW91dHMpIHsKLQkJdHJ5IHsKLQkJCWZTb2NrZXQgPSBzb2NrZXQ7Ci0JCQlmU29ja2V0LnNldFNvTGluZ2VyKHRydWUsIDMwKTsJLy8gV2FpdCAzMCBzZWNvbmRzIGlmIG5lY2Vzc2FyeSBmb3IgdGhlIGZpbmFsIHN0dWZmIHRvIGdvIG91dCBhZnRlciBjbG9zaW5nLgotCQkJaWYgKCFub1RpbWVvdXRzKQotCQkJCWZTb2NrZXQuc2V0U29UaW1lb3V0KFRJTUVfT1VUKTsJLy8gVGltZW91dCBwZXJpb2QKLQkJCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChidWZTaXplID09IG51bGwpCi0JCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDE2MDAwKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmU29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCBidWZTaXplLmludFZhbHVlKCkpKTsJLy8gSXQgZGlkbid0IHRha2UgdGhlIGhpbnQsIHNvIHdlIHdpbGwgYnVmZmVyIGl0LgotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwgYnVmU2l6ZS5pbnRWYWx1ZSgpKSk7CS8vIEl0IGRpZG4ndCB0YWtlIHRoZSBoaW50LCBzbyB3ZSB3aWxsIGJ1ZmZlciBpdC4KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMykgewotCQkJCX0KLQkJCXRyeSB7Ci0JCQkJZlNvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTQpIHsKLQkJCX0KLQkJCWZTb2NrZXQgPSBudWxsOwotCQkJaW4gPSBudWxsOwotCQkJb3V0ID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEaWQgdGhpcyBjb25zdHJ1Y3QgY29ycmVjdGx5LgotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGNvdWxkIGJlIHRocm93biBpbiB0aGUgY3RvciBhbmQKLQkgKiB0aGF0J3Mgbm90IGEgZ29vZCB0aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZTb2NrZXQgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSBzZXJ2ZXIuIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZVNlcnZlcigpIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZHMuc2VuZFRlcm1pbmF0ZUNvbW1hbmQob3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0cnkgewotCQkJCUNvbW1hbmRzLnNlbmRRdWl0Q29tbWFuZChvdXQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUzKSB7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWZTb2NrZXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlNCkgewotCQkJCX0KLQkJCX0KLQkJCWZTb2NrZXQgPSBudWxsOwotCQkJaW4gPSBudWxsOwotCQkJb3V0ID0gbnVsbDsKLQkJfQotCX0KLQkJCi0JCQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIEdldENsYXNzUmV0dXJuIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQl0cnkgewotCQkJCS8vIEl0J3Mgc2ltcGxlLCBqdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCQlyZXR1cm4gQ29tbWFuZHMuc2VuZEdldENsYXNzQ29tbWFuZChvdXQsIGluLCBjbGFzc05hbWUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRFcnJvckNvZGUoKSAhPSBDb21tYW5kcy5HRVRfQ0xBU1NfTk9UX0ZPVU5EKQotCQkJCQl0aHJvdyBlOwkvLyBOb3QgY2xhc3Mgbm90IGZvdW5kLCBzZW5kIGl0IG9uCi0JCQl9CQkJCi0JCXJldHVybiBudWxsOwkvLyBOb3QgZm91bmQsIHNvIHJldHVybiBudWxsCQkJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGluZm9ybWF0aW9uIGdpdmVuIGFuIElELgotCSAqLwotCXB1YmxpYyBHZXRDbGFzc0lEUmV0dXJuIGdldENsYXNzRnJvbUlEKGludCBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlyZXR1cm4gQ29tbWFuZHMuc2VuZEdldENsYXNzRnJvbUlEQ29tbWFuZChvdXQsIGluLCBjbGFzc0lEKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJLy8gTm90IGZvdW5kLCBzbyByZXR1cm4gbnVsbAkJCi0JfQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBkYXRhIGZyb20gYW4gaWQuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0T2JqZWN0RGF0YShpbnQgY2xhc3NJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCS8vIEp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJQ29tbWFuZHMuc2VuZEdldE9iamVjdERhdGEob3V0LCBpbiwgY2xhc3NJRCwgdmFsdWVSZXR1cm4pOwotCQl9IGVsc2UKLQkJCXZhbHVlUmV0dXJuLnNldCgpOwkvLyBTZXQgaXQgdG8gbnVsbCBzaW5jZSB3ZSBhcmVuJ3QgY29ubmVjdGVkLgotCX0JCi0KLQkvKioKLQkgKiBHZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgYW4gaW5pdCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROZXdJbnN0YW5jZShpbnQgY2xhc3NJRCwgU3RyaW5nIGluaXRTdHJpbmcsIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBKdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCUNvbW1hbmRzLnNlbmROZXdJbnN0YW5jZShvdXQsIGluLCBjbGFzc0lELCBpbml0U3RyaW5nLCBuZXdJbnN0YW5jZSk7Ci0JCX0gZWxzZQotCQkJbmV3SW5zdGFuY2Uuc2V0KCk7CS8vIFNldCBpdCB0byBudWxsIHNpbmNlIHdlIGFyZW4ndCBjb25uZWN0ZWQuCi0JfQotCQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VJRChpbnQgaWQpewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCXRyeSB7Ci0JCQkJLy8gSnVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQkJQ29tbWFuZHMucmVsZWFzZU9iamVjdENvbW1hbmQob3V0LCBpZCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG9uJ3QgY2FyZSBpdCBkaWRuJ3Qgd29yawotCQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUNvbm5lY3Rpb24jZ2V0QXJyYXlDb250ZW50cyhpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEFycmF5Q29udGVudHMoaW50IGFycmF5SUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlDb21tYW5kcy5zZW5kR2V0QXJyYXlDb250ZW50c0NvbW1hbmQob3V0LCBpbiwgYXJyYXlJRCwgcmV0dXJuVmFsdWUpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIEludm9rZSB0aGUgbWV0aG9kIGNhbGwKLQkgKi8JCi0JcHVibGljIHZvaWQgaW52b2tlTWV0aG9kKGludCBtZXRob2RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW52b2tlT24sIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSXQncyBzaW1wbGUsIGp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChJTlZPS0VfTUVUSE9EX1NURVApOwotCQkJQ29tbWFuZHMuc2VuZEludm9rZU1ldGhvZENvbW1hbmQob3V0LCBpbiwgbWV0aG9kSUQsIGludm9rZU9uLCBwYXJtcywgcmV0dXJuVmFsdWUpOwotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKElOVk9LRV9NRVRIT0RfU1RFUCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQ29ubmVjdGlvbiNpbnZva2VNZXRob2Qob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGludm9rZU1ldGhvZChWYWx1ZU9iamVjdCBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBWYWx1ZU9iamVjdCBwYXJtVHlwZXMsIFZhbHVlT2JqZWN0IGludm9rZU9uLCBWYWx1ZU9iamVjdCBwYXJtcywKLQkJCVZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKElOVk9LRV9TVEVQKTsKLQkJCUNvbW1hbmRzLnNlbmRJbnZva2VNZXRob2RDb21tYW5kKG91dCwgaW4sIGNsYXNzVHlwZSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzLCBpbnZva2VPbiwgcGFybXMsIHJldHVyblZhbHVlKTsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChJTlZPS0VfU1RFUCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogUHV0IHRoZSBFeHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZHMgaGVyZS4KLQkgKiAKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklELCBieXRlIHRyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kU3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZ0NvbW1hbmQoZXhwcmVzc2lvbklELCB0cmFjZSwgb3V0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoRXhwcmVzc2lvbkNvbW1hbmQoYnl0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRXhwcmVzc2lvbkNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSBzdWJjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kRXhwcmVzc2lvbkNvbW1hbmQoZXhwcmVzc2lvbklELCBvdXQsIHN1YmNvbW1hbmQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNzdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklEKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kRW5kRXhwcmVzc2lvblByb2Nlc3NpbmdDb21tYW5kKGV4cHJlc3Npb25JRCwgb3V0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoVmFsdWVPYmplY3Qob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFZhbHVlT2JqZWN0KFZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaEJ5dGUoYnl0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoQnl0ZShieXRlIGFieXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kQnl0ZShvdXQsIGFieXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoSW50KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoSW50KGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEludChvdXQsIGFuSW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFN0cmluZyhTdHJpbmcgYVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZFN0cmluZyhvdXQsIGFTdHJpbmcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3B1c2hCb29sZWFuKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJvb2xlYW4oYm9vbGVhbiBhQm9vbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEJvb2xlYW4ob3V0LCBhQm9vbCk7Ci0JfQotCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jZ2V0RmluYWxWYWx1ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRGaW5hbFZhbHVlKFZhbHVlT2JqZWN0IHJlc3VsdCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaW4sIHJlc3VsdCwgQ29tbWFuZHMuTk9fVFlQRV9DSEVDSyk7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3B1bGxWYWx1ZShpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHB1bGxWYWx1ZShpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBwcm94eWlkcywgVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRQdWxsVmFsdWVDb21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBpbiwgcHJveHlpZHMsIHNlbmRlcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jc3luYyhpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmMoaW50IGV4cHJlc3Npb25JRCwgVmFsdWVPYmplY3QgcHJveHlpZHMsIFZhbHVlU2VuZGVyIHNlbmRlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kU3luY0NvbW1hbmQoZXhwcmVzc2lvbklELCBvdXQsIGluLCBwcm94eWlkcywgc2VuZGVyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1Db25uZWN0aW9uI3JlYWRQcm94eUFycmF5VmFsdWVzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZVNlbmRlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUHJveHlBcnJheVZhbHVlcyhDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSwgQ29tbWFuZHMuVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIsIGJvb2xlYW4gYWxsb3dGbGFnKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCByZXR1cm5WYWx1ZS5hbkludCwgdmFsdWVTZW5kZXIsIHJldHVyblZhbHVlLCBhbGxvd0ZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyYW5zZmVyRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRUcmFuc2ZlckV4cHJlc3Npb25Db21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBpbiwgZXhwQ29udHJvbGxlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRSZXN1bWVFeHByZXNzaW9uQ29tbWFuZChleHByZXNzaW9uSUQsIG91dCwgZXhwQ29udHJvbGxlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0YW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0YW50QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDJiNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0vKioKLSAqIFRoaXMgaXMgYSBiYXNlIGZvciBiZWFuIHByb3hpZXMgdGhhdCBhcmUgY29uc3RhbnRzIGFuZAotICogZG8gbm90IGhhdmUgYW4gb2JqZWN0IG9uIHRoZSByZW1vdGUgVk0gc2lkZS4gVGhleSBhcmUKLSAqIHNoaXBwZWQgYmFjayBhbmQgZm9ydGggYnkgdmFsdWUuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3Rvcnk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlciBJRCA9IG5ldyBJbnRlZ2VyKENvbW1hbmRzLk5PVF9BTl9JRCk7Ci0JCi0JcHJvdGVjdGVkIFJFTUNvbnN0YW50QmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFGYWN0b3J5KSB7Ci0JCWZGYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBwcm94eSB3YXMgY3JlYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOgotCSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLQkgKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0JICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLQkgKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0JICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0JICogVGhpcyBpcyBhYnN0cmFjdCBiZWNhdXNlIGVhY2ggdHlwZSBuZWVkcyB0byBkbyBhIHVuaXF1ZSB0ZXN0IGZvciBlcXVhbGl0eS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJLy8gV2UgY2FuJ3QgYmUgYXNzdXJlZCB0aGF0IHRoZXJlIGFyZSBub3Qgbm9uLWlkZW50aWNhbCBjb25zdGFudHMgdGhhdCBhcmUgYWN0dWFsbHkgaWRlbnRpY2FsLgotCQkvLyBUaGlzIGlzIGJlY2F1c2UgZm9yIGNvbnN0YW50cyB3ZSBkbyBub3Qga25vdyB0aGUgaWQgb2YgdGhlIG9yaWdpbmFsLiBUaGF0IGlzIG5vdCBzZW50IGFjcm9zcyBmcm9tIHRoZSB2bS4JCQotCQlyZXR1cm4gdGhpcyA9PSBhQmVhblByb3h5OwkKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhpcyBwcm94eS4KLQkgKiBDb25zdGFudHMgaGF2ZSBubyBpZCdzLCBzbyB3ZSByZXR1cm4gLTEuCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JLyoqCi0JICogaXNWYWxpZC4gQ29uc3RhbnQgb25lcyBhcmUgYWx3YXlzIHZhbGlkIHVubGVzcyB0aGUgcmVnaXN0cnkgaXMgdGVybWluYXRlZCwgZXhjZXB0IGlmIGFuCi0JICogb3ZlcnJpZGUgcmVsZWFzZXMgcmVzb3VyY2VzLiBJbiB0aGF0IGNhc2UgdGhlIG92ZXJyaWRpbmcKLQkgKiBzdWJjbGFzcyBzaG91bGQgYWxzbyBvdmVycmlkZSBpc1ZhbGlkKCkgdG8gcmV0dXJuIGZhbHNlCi0JICogaWYgcmVsZWFzZSgpIHdhcyBjYWxsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZGYWN0b3J5LmlzVmFsaWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVsZWFzZS4gQ29uc3RhbnQgb25lcyBkb24ndCBuZWVkIHRvIHR5cGljYWxseSBiZSByZWxlYXNlZCwgaG93ZXZlcgotCSAqIGlmIGFuIG92ZXJyaWRlIGRvZXMgZG8gc29tZXRoaW5nIHRvIHJlbGVhc2UsIHRoZW4gaXQgTVVTVCBhbHNvCi0JICogb3ZlcnJpZGUgaXNWYWxpZCgpIHRvIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU2NzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuVHJhbnNtaXRhYmxlQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUHJveHkgZm9yIGEgY29uc3RydWN0b3IuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNQ29uc3RydWN0b3JQcm94eSBleHRlbmRzIFJFTUFjY2Vzc2libGVPYmplY3RQcm94eSBpbXBsZW1lbnRzIElDb25zdHJ1Y3RvclByb3h5IHsKLQotCVJFTUNvbnN0cnVjdG9yUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklEKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yIChhc3N1bWluZyBpdCB0YWtlcyBubyBhcmd1bWVudHMpIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS4KLQkgKiBFeGNlcHRpb24gd2lsbCBiZSByYWlzZWQgaWYgdGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhcmd1bWVudHMuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5jdG9yVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHRoZSBhcmd1bWVudHMpIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS4KLQkgKiBFeGNlcHRpb24gd2lsbCBiZSByYWlzZWQgaWYgYXJndW1lbnRzIGRvbid0IG1hdGNoIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlSRU1NZXRob2RQcm94eSBuZXdJbnN0YW5jZU1ldGhvZCA9Ci0JCQkoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldENvbnN0cnVjdG9yTmV3SW5zdGFuY2UoKTsKLQotCQkvLyBDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSB0YWtlcyBvbmUgcGFybSAoT2JqZWN0W10pIHdoZXJlIFswXSBpcyBhbiBPYmplY3RbXSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLQkJT2JqZWN0W10gcGFybXMgPSBudWxsOwotCQlpZiAoY3JlYXRpb25Bcmd1bWVudHMgIT0gbnVsbCkKLQkJCXBhcm1zID0gbmV3IE9iamVjdFtdIHsgbmV3IFRyYW5zbWl0YWJsZUFycmF5KENvbW1hbmRzLk9CSkVDVF9DTEFTUywgY3JlYXRpb25Bcmd1bWVudHMpfTsKLQotCQlyZXR1cm4gbmV3SW5zdGFuY2VNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIHBhcm1zKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHlbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3SW5zdGFuY2UoYXJncyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5W10gZlBhcmFtZXRlclR5cGVzOwotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25zdHJ1Y3RvclByb3h5I2dldFBhcmFtZXRlclR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElCZWFuVHlwZVByb3h5W10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCWlmIChmUGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgewotCQkJSUFycmF5QmVhblByb3h5IHBhcm1UeXBlcyA9IChJQXJyYXlCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkKLQkJCQkJLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXNNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQkJaWYgKHBhcm1UeXBlcyA9PSBudWxsKQotCQkJCWZQYXJhbWV0ZXJUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVswXTsgLy8gVGhlcmUgd2FzIHNvbWUgZXJyb3IsIG9ubHkgd2F5IG51bGwgaXMgcmV0dXJuZWQKLQkJCWVsc2UgewotCQkJCWludCBsZW4gPSBwYXJtVHlwZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZlBhcmFtZXRlclR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2xlbl07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQkJdHJ5IHsKLQkJCQkJCWZQYXJhbWV0ZXJUeXBlc1tpXSA9IChJQmVhblR5cGVQcm94eSkgcGFybVR5cGVzLmdldChpKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQl9Ci0JCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KHBhcm1UeXBlcyk7IC8vIERvbid0IG5lZWQgdGhlIGFycmF5IG9uIHRoZSBzZXJ2ZXIgYW55bW9yZS4KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFhYjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJlYW5UeXBlIFByb3h5IGZvciBNZXRob2QgY2xhc3MuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNQ29uc3RydWN0b3JUeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi1SRU1Db25zdHJ1Y3RvclR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IGFjY2Vzc2libGVUeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNPTlNUUlVDVE9SX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBhY2Nlc3NpYmxlVHlwZVByb3h5KTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIENvbnN0cnVjdG9yIHByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCXJldHVybiBuZXcgUkVNQ29uc3RydWN0b3JQcm94eShmUmVnaXN0cnksIG9iamVjdElEKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYSBkZWZhdWx0IGN0b3IsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgeyAKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTI0ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBEb3VibGUuY2xhc3MuCi0gKi8KLWNsYXNzIFJFTURvdWJsZUNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNRG91YmxlQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBEb3VibGUgYURvdWJsZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYURvdWJsZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmRvdWJsZUNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoRG91YmxlKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzMTZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBEb3VibGUuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9DTEFTUyksIERvdWJsZS5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBEb3VibGUoMEQpKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZURvdWJsZUJlYW5Qcm94eShEb3VibGUgYURvdWJsZSkgewotCXJldHVybiAoYURvdWJsZS5kb3VibGVWYWx1ZSgpICE9IDBEKSA/Ci0JCW5ldyBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFEb3VibGUpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBEb3VibGUgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIERvdWJsZS4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZURvdWJsZUJlYW5Qcm94eSgoRG91YmxlKSBhTnVtYmVyKTsKLX0JCi0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVEb3VibGVCZWFuUHJveHkobmV3IERvdWJsZSh2YWx1ZS5hRG91YmxlKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmMDc1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlclByb3h5IGZvciB0aGUgcHJpbWl0aXZlICJkb3VibGUiLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNRG91YmxlVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBkb3VibGUgZkRvdWJsZTsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTURvdWJsZVR5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBkb3VibGUgYURvdWJsZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkRvdWJsZSA9IGFEb3VibGU7Ci19Ci0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1Eb3VibGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkRvdWJsZSA9PSAoKFJFTURvdWJsZVR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIERvdWJsZSkKLQkJcmV0dXJuIGZEb3VibGUgPT0gKChEb3VibGUpIGFuT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1Eb3VibGVUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkRvdWJsZSA9PSAoKFJFTURvdWJsZVR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmRvdWJsZVZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIGJ5dGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCXJldHVybiAoYnl0ZSkgZkRvdWJsZTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZEb3VibGU7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiAoZmxvYXQpIGZEb3VibGU7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIChpbnQpIGZEb3VibGU7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiAobG9uZykgZkRvdWJsZTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBEb3VibGUoZkRvdWJsZSk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiAoc2hvcnQpIGZEb3VibGU7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZEb3VibGUpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5kb3VibGVUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmRG91YmxlKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTdmN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBEb3VibGUuVFlQRQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9UWVBFKSwgRG91YmxlLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNRG91YmxlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDBEKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVEb3VibGVCZWFuUHJveHkoZG91YmxlIGFEb3VibGUpIHsKLQlyZXR1cm4gKGFEb3VibGUgIT0gMEQpID8KLQkJbmV3IFJFTURvdWJsZVR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRG91YmxlKSA6IHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGRvdWJsZSBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0JCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZURvdWJsZUJlYW5Qcm94eSh2YWx1ZS5hRG91YmxlKTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoZG91YmxlKSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChkb3VibGUpIGV4cGxpY2l0bHkgY2FzdHMgaXQgZG93bi4KLSAqCTIpIHZhbGlkTnVtYmVyCi0gKiBJdCB3aWxsIHVzZSB0aGUgZGVjb2RlIGZ1bmN0aW9uIG9mIGRvdWJsZSB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0JZG91YmxlIGFEb3VibGU7Ci0JaWYgKHRyaW0uc3RhcnRzV2l0aCgiKGRvdWJsZSkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihkb3VibGUpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYURvdWJsZSA9IHYuZG91YmxlVmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhRG91YmxlID0gRG91YmxlLnZhbHVlT2YoaW5pdGlhbGl6YXRpb25TdHJpbmcpLmRvdWJsZVZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBkb3VibGUgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYURvdWJsZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1FeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZjQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotIAotLyoqCi0gKiBUaGUgUmVtb3RlIHByb3h5IHZlcnNpb24gb2YgRXhwcmVzc2lvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1FeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0KLQlwcml2YXRlIElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CS8vIEFyZSB3ZSBjbG9zZWQuCi0JCi0JcHJvdGVjdGVkIENvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlclZhbHVlOwkvLyBBIHdvcmtlciBvYmplY3Qgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgY3JlYXRpbmcgb25lIGFuZCB0aHJvd2luZyBpdCBhd2F5LgotCQotCXByb3RlY3RlZCBNYXAgYmVhblR5cGVDYWNoZTsJLy8gVXNlIHRvIGNhY2hlIHBlbmRpbmcgQmVhblR5cGVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkVNU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0JcHJvdGVjdGVkIE1hcCBtZXRob2RzQ2FjaGU7CS8vIFVzZSB0byBjYWNoZSBwZW5kaW5nIGV4cHJlc3Npb24gbWV0aG9kIHByb3hpZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1Qcm94eUNvbnNhbnRzLgotCXByb3RlY3RlZCBNYXAgZmllbGRzQ2FjaGU7CS8vIFVzZSB0byBjYWNoZSBwZW5kaW5nIGV4cHJlc3Npb24gZmllbGQgcHJveGllcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVByb3h5Q29uc2FudHMuCi0JCi0JLyoKLQkgKiBUaGlzIGlzIHZlcnkgc3BlY2lhbCBsaXN0LiBJdCB0cmllcyB0byBlbGltaW5hdGUgdW5uZWVkZWQgdHJhZmZpYy4gRm9yIGV4YW1wbGUgYSBtYXJrIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGVuZG1hcmsgZG9lcwotCSAqIG5vdCBuZWVkIHRvIGJlIHNlbnQuIE1hbnkgZXhwcmVzc2lvbnMgY2FuIGxvb2sgbGlrZTogbWFyaywgZW5kbWFyaywgZW5kdHJhbnNhY3Rpb24uIFRoaXMgaXMgYSBkbyBub3RoaW5nIGFuZCB3ZSBkb24ndCB3YW50Ci0JICogdG8gY3JlYXRlIGEgY29ubmVjdGlvbiB0byBqdXN0IHNlbmQgdGhpcy4gU28gdGhpcyBsaXN0IGlzIHVzZWQgdG8gcXVldWUgdXAgdGhlc2UgYW5kIHJlbW92ZSB0aGVtIHRvbyB3aGVuIGZvdW5kIGFzIG5vdCBuZWVkZWQuCi0JICogCi0JICogIEhvd2V2ZXIsIHRoaXMgaXMgdmVyeSB0cmlja3kgYmVjYXVzZSBhbGwgcHVzaFRvUHJveHkgdHJhbnNhY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gc29tZXRoaW5nIE1VU1QgY2FsbCB0aGUgcHJvY2Vzc1BlbmRpbmcoKSBtZXRob2QgCi0JICogIGZpcnN0IHRvIG1ha2Ugc3VyZSBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXJlIHN1Ym1pdHRlZC4gQmVjYXVzZSBvbmNlIGEgcmVhbCB0eXBlIHRyYW5zYWN0aW9uLCBzdWNoIGFzIGFzc2lnbm1lbnQgb2NjdXJzLCBhbnkKLQkgKiAgcGVuZGluZyB0cmFuc2FjdGlvbiBpcyBhIHZhbGlkIHRyYW5zYWN0aW9uLCBhbmQgbm8gbG9uZ2VyIGEgZG8tbm90aGluZyB0cmFuc2FjdGlvbi4KLQkgKiAgCi0JICogIEVhY2ggdHJhbnNhY3Rpb24gdHlwZSB1c2VzIGEgc3ViY2xhc3Mgb2YgUGVuZGluZ1RyYW5zYWN0aW9uIHRvIGJlIGFuIGVudHJ5IG9uIHRoZSBsaXN0LgotCSAqICAKLQkgKiAgVGhlIHBlbmRpbmdzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOgotCSAqICBtYXJrL2VuZG1hcmsKLQkgKiAgdHJ5L2NhdGNoL2VuZHRyeQotCSAqICBibG9jay9lbmRibG9jawotCSAqICAKLQkgKiAgU2VlIGVhY2ggaW5kaXZpZHVhbCB0cmFuc2FjdGlvbiB0eXBlIHRvIHNlZSBob3cgaXQgaXMgaGFuZGxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBwZW5kaW5nVHJhbnNhY3Rpb25zOwotCQotCS8qKgotCSAqIFBlbmRpbmdUcmFuc2FjdGlvbiBlbnRyeS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCQotCQkvKioKLQkJICogVGhlIHRyYW5zYWN0aW9uIGlzIG5vdyBiZWluZyBwdXNoZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQKLQkJICogYWN0dWFsbHkgZG8gdGhlIHB1c2guCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVtRXhwcmVzc2lvbiBUaGUgUkVNRXhwcmVzc2lvbiBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSRU1FeHByZXNzaW9uKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIGlkIGZvciB0aGlzIFJFTUV4cHJlc3Npb24uIFRoaXMgaWQgaXMgdXNlZCBvbiB0aGUgcmVtb3RlIHZtIHRvCi0JICogaWRlbnRpZnkgd2hvIHRoZSByZXF1ZXN0IGlzIGZvci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRSRU1FeHByZXNzaW9uSUQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc2hDb2RlKCk7Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbnMgbGlzdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UGVuZGluZ1RyYW5zYWN0aW9ucygpIHsKLQkJaWYgKHBlbmRpbmdUcmFuc2FjdGlvbnMgPT0gbnVsbCkKLQkJCXBlbmRpbmdUcmFuc2FjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBwZW5kaW5nVHJhbnNhY3Rpb25zOwotCX0KLQkKLQkvLyBVc2UgdGhpcyBmbGFnIHdoZW4gZGVidWdnaW5nIHRvIHRlc3QgaWYgZXJyb3JzIGFyZSBkdWUgdG8gaW1wcm9wZXIgcGVuZGluZyBwcm9jZXNzaW5nLgotCS8vIElmIHRydWUgdGhleSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgbm90IHBlbmRpbmcgYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWEVDVVRFX1BFTkRJTkdfSU1NRURJQVRFTFkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZW5kaW5nVHJhbnNhY3Rpb24oUGVuZGluZ1RyYW5zYWN0aW9uIHBlbmRpbmcpIHsKLQkJaWYgKCFFWEVDVVRFX1BFTkRJTkdfSU1NRURJQVRFTFkpCi0JCQlnZXRQZW5kaW5nVHJhbnNhY3Rpb25zKCkuYWRkKHBlbmRpbmcpOwotCQllbHNlCi0JCQlwZW5kaW5nLnB1c2hUcmFuc2FjdGlvbih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2VudERhdGE7CS8vIEZsYWcgdG8gaW5kaWNhdGUgaWYgd2UgaGF2ZSBzZW50IGFueXRoaW5nIHlldCB0byB0aGUgcmVtb3RlIHZtLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBwZW5kaW5nIG9wdGltaXphdGlvbnMuCi0JCi0JLyoqCi0JICogSGF2ZSB3ZSBzZW50IGFueSBkYXRhIGluIHRoaXMgdHJhbnNhY3Rpb24geWV0LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXZlU2VudERhdGEoKSB7Ci0JCXJldHVybiBzZW50RGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkgewotCQkJaWYgKCFzZW50RGF0YSkKLQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuc3RhcnRUcmFuc2FjdGlvbigpOwkvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIHNlbmQgZGF0YSwgc28gc3RhcnQgdHJhbnNhY3Rpb24uCi0JCQkKLQkJCXNlbnREYXRhID0gdHJ1ZTsJLy8gSWYgd2UgYXJlIGdldHRpbmcgYSB0cmFuc2FjdGlvbiwgdGhhdCBtZWFucyB3ZSBhcmUgc2VuZGluZyBkYXRhLgotCQkJY29ubmVjdGlvbiA9IChJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24pIGdldFJFTVJlZ2lzdHJ5KCkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCS8vIFRoaXMgd2lsbCBhY3R1YWxseSBub3QgYmUgc3RvcHBlZCB1bnRpbCBjbG9zZXByb3h5LiBUaGVyZSBjb3VsZCBiZSBhIHNsaWdodCBwcm9ibGVtIGlmIHRoZSBleHByZXNzaW9uIGlzIG5ldmVyIGNsb3NlZC4KLQkJCS8vIEJ1dCB0aGF0IHNob3VsZG4ndCBoYXBwZW4uIFRoaXMgaXMgdG8gcHJldmVudCBhbnkgcHJveHkgdGhhdCB3YXMgcmVsZWFzZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gYnV0IHdhcyB1c2VkIGJ5Ci0JCQkvLyB0aGUgZXhwcmVzc2lvbiBmcm9tIGJlaW5nIHJlbGVhc2VkIG9uIHRoZSByZW1vdGUgdm0gdW50aWwgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQuCi0JCQl0cnkgewotCQkJCWlmICh3b3JrZXJWYWx1ZSA9PSBudWxsKQotCQkJCQl3b3JrZXJWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJCWlmIChleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciA9PSBudWxsKSB7Ci0JCQkJCWJ5dGUgdHJhY2UgPSAhaXNUcmFjZVNldCgpID8gRXhwcmVzc2lvbkNvbW1hbmRzLlRSQUNFX0RFRkFVTFQgOiAoaXNUcmFjZSgpID8gRXhwcmVzc2lvbkNvbW1hbmRzLlRSQUNFX09OIDogRXhwcmVzc2lvbkNvbW1hbmRzLlRSQUNFX09GRik7IAotCQkJCQljb25uZWN0aW9uLnN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmcoZ2V0UkVNRXhwcmVzc2lvbklEKCksIHRyYWNlKTsJLy8gSXQgaXMgYSBuZXcgZXhwcmVzc2lvbi4KLQkJCQl9IGVsc2UgewotCQkJCQlmaWxsUHJveHkoZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIsIHdvcmtlclZhbHVlKTsKLQkJCQkJY29ubmVjdGlvbi5yZXN1bWVFeHByZXNzaW9uKGdldFJFTUV4cHJlc3Npb25JRCgpLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJY29ubmVjdGlvbiA9IG51bGw7Ci0JCQkJfQotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQotCQl9Ci0JCXJldHVybiBjb25uZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgSU9FeGNlcHRpb24gb2NjdXJyZWQgbXNnLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElPX0VYQ0VQVElPTl9NU0cgPSBQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTUV4cHJlc3Npb25fSU9FeGNlcHRpb25TZWVMb2dfSU5GT187IAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfRVhDRVBUSU9OX01TRyA9IFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNRXhwcmVzc2lvbl9Db21tYW5kRXhjZXB0aW9uU2VlTG9nX0lORk9fOyAKLQkKLQkvKioKLQkgKiBUaHJvdyBhbiBhbiBpbGxlZ2FsIHN0YXRlIGV4Y2VwdGlvbiBpZiBzb21lIGdlbmVyYWwgZXJyb3IsIGluIHBhcnRpY3VsYXIgYW4gSS9PIG9yIENvbW1hbmQgRXhjZXB0aW9uCi0JICogb2NjdXJyZWQgc28gdGhhdCBjYWxsZXJzIGtub3cgdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1zZyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgYXMgYSBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UkVNUmVnaXN0cnkoKSB7Ci0JCXJldHVybiAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIHJlZ2lzdHJ5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGJlYW4gcHJveHkgZmFjdG9yeSBhcyBhIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkgewotCQlyZXR1cm4gKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgYmVhblByb3h5RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucy4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOiA8L2I+SXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwgbm9uLXBlbmRpbmctcGFydGljaXBhdGluZyB0cmFuc2FjdGlvbnMgbXVzdAotCSAqIGNhbGwgdGhpcyBtZXRob2QgZmlyc3QgdG8gbWFrZSBzdXJlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGFyZSBzZW50LiBJZiB0aGlzIGlzCi0JICogbm90IGRvbmUsIHRoZXJlIHdpbGwgYmUgZXJyb3JzIGluIHRoZSBleHByZXNzaW9uLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCkgewotCQlpZiAocGVuZGluZ1RyYW5zYWN0aW9ucyAhPSBudWxsICYmICFwZW5kaW5nVHJhbnNhY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlbmRpbmdUcmFuc2FjdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJKChQZW5kaW5nVHJhbnNhY3Rpb24pIHBlbmRpbmdUcmFuc2FjdGlvbnMuZ2V0KGkpKS5wdXNoVHJhbnNhY3Rpb24odGhpcyk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlwZW5kaW5nVHJhbnNhY3Rpb25zLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwZW5kaW5nIGVudHJ5IGZyb20gdG9wLiBJZiB0b3AgaXMgMSwgdGhlbiBnZXQgdG9wIGVudHJ5IChpLmUuIGxhc3Qgb25lIGFkZGVkKSwgMiBpcyBuZXh0IG9uZS4gCi0JICogQHBhcmFtIGZyb21Ub3AKLQkgKiBAcmV0dXJuIGVudHJ5IHJlcXVlc3RlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBlbnRyeS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUGVuZGluZ1RyYW5zYWN0aW9uIGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoaW50IGZyb21Ub3ApIHsKLQkJaWYgKHBlbmRpbmdUcmFuc2FjdGlvbnMgIT0gbnVsbCAmJiBwZW5kaW5nVHJhbnNhY3Rpb25zLnNpemUoKSA+PSBmcm9tVG9wKSB7Ci0JCQlyZXR1cm4gKFBlbmRpbmdUcmFuc2FjdGlvbikgcGVuZGluZ1RyYW5zYWN0aW9ucy5nZXQocGVuZGluZ1RyYW5zYWN0aW9ucy5zaXplKCktZnJvbVRvcCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFBvcCB1cCB0aGUgdG9wIGVudHJ5IGZyb20gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHF1ZXVlLgotCSAqIEBwYXJhbSBmcm9tVG9wIGhvdyBtYW55IGVudHJpZXMgdG8gcG9wIGZyb20gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gbGlzdC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3BQZW5kaW5nRW50cnkoaW50IGZyb21Ub3ApIHsKLQkJaWYgKHBlbmRpbmdUcmFuc2FjdGlvbnMgIT0gbnVsbCkKLQkJCWlmIChwZW5kaW5nVHJhbnNhY3Rpb25zLnNpemUoKSA+IGZyb21Ub3ApIHsKLQkJCQl3aGlsZShmcm9tVG9wLS0gPjApCi0JCQkJCXBlbmRpbmdUcmFuc2FjdGlvbnMucmVtb3ZlKHBlbmRpbmdUcmFuc2FjdGlvbnMuc2l6ZSgpLTEpOwotCQkJfSBlbHNlCi0JCQkJcGVuZGluZ1RyYW5zYWN0aW9ucy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVG9Qcm94eShJUHJveHkgcHJveHkpIHsKLQkJaWYgKHByb3h5ID09IG51bGwgfHwgcHJveHkuaXNCZWFuUHJveHkoKSkKLQkJCXB1c2hUb1Byb3h5KChJQmVhblByb3h5KSBwcm94eSk7Ci0JCWVsc2UKLQkJCXB1c2hUb0V4cHJlc3Npb25Qcm94eSgoRXhwcmVzc2lvblByb3h5KSBwcm94eSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwdXNoVG9Qcm94eShJQmVhblByb3h5IHByb3h5KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBwcm94eS4KLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX1RPX1BST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJaWYgKHByb3h5ID09IG51bGwpCi0JCQkJd29ya2VyVmFsdWUuc2V0KCk7Ci0JCQllbHNlCi0JCQkJKChJUkVNQmVhblByb3h5KSBwcm94eSkucmVuZGVyQmVhbih3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jY2xvc2VQcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VQcm94eSgpIHsKLQkJaWYgKCFjbG9zZWQpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCAmJiBjb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCQljb25uZWN0aW9uLnN0b3BFeHByZXNzaW9uUHJvY2Vzc2luZyhnZXRSRU1FeHByZXNzaW9uSUQoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsKLQkJCQkJCS8vIE5vdCB0aHJvd2luZyBhbiBpbGxlZ2FsIHN0YXRlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCBjYXJlLCBvdGhlciB0aGFuIGxvZ2dpbmcgYW5kIG5vdCAKLQkJCQkJCS8vIHJldHVybmluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVnaXN0cnkgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3Igb24gY2xvc2UuCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlnZXRSRU1SZWdpc3RyeSgpLnJldHVybkNvbm5lY3Rpb24oY29ubmVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCQkJaWYgKHNlbnREYXRhKQotCQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuc3RvcFRyYW5zYWN0aW9uKCk7CS8vIFJlc3VtZSBwcm94eSByZWxlYXNlcy4gV2UndmUgc2VudCBkYXRhIGF0IGxlYXN0IG9uY2UuCi0JCQl9Ci0JCX0KLQkJbWV0aG9kc0NhY2hlID0gbnVsbDsKLQkJZmllbGRzQ2FjaGUgPSBudWxsOwotCQliZWFuVHlwZUNhY2hlID0gbnVsbDsKLQkJcGVuZGluZ1RyYW5zYWN0aW9ucyA9IG51bGw7Ci0JCWNvbm5lY3Rpb24gPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgVk9JRFRZUEUgPSBuZXcgT2JqZWN0KCk7CS8vIEEgdm9pZCB0eXBlIHdhcyBzZW50IGluIGV4cHJlc3Npb24gcHJveHkgcmVzb2x1dGlvbi4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9UUkVTT0xWRUQgPSBuZXcgT2JqZWN0KCk7CS8vIEEgbm90IHJlc29sdmVkIHR5cGUgd2FzIHNlbnQgaW4gZXhwcmVzc2lvbiBwcm94eSByZXNvbHV0aW9uLgotCQotCS8qCi0JICogR2V0IHRoZSBzZW5kZXIgdG8gdXNlIGZvciBwdWxsaW5nIHRoZSBleHByZXNzaW9uIHByb3h5IHJlc29sdXRpb25zLgotCSAqLwotCXByaXZhdGUgQmVhblByb3h5VmFsdWVTZW5kZXIgZ2V0RXhwcmVzc2lvblByb3hpZXNTZW5kZXIoKSB7Ci0JCXJldHVybiBuZXcgQmVhblByb3h5VmFsdWVTZW5kZXIoZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5CZWFuUHJveHlWYWx1ZVNlbmRlciNzZW5kVmFsdWUob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNlbmRWYWx1ZShWYWx1ZU9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5nZXRUeXBlKCkgPT0gQ29tbWFuZHMuRkxBRykgewotCQkJCQlzd2l0Y2ggKHZhbHVlLmFuSW50KSB7Ci0JCQkJCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OUFJPWFlfTk9UUkVTT0xWRUQ6Ci0JCQkJCQkJYXJyYXlbaW5kZXgrK10gPSBOT1RSRVNPTFZFRDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05QUk9YWV9WT0lEVFlQRToKLQkJCQkJCQlhcnJheVtpbmRleCsrXSA9IFZPSURUWVBFOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkvLyBTaG91bGRuJ3QgaGFwcGVuLgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXN1cGVyLnNlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQkKLQkvKgotCSAqIFByb2Nlc3MgdGhlIHB1bGxlZCBleHByZXNzaW9uIHByb3h5IHJlc29sdXRpb25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzcHVsbGVkRXhwcmVzc2lvblByb3hpZXMoTGlzdCBleHByZXNzaW9uUHJveGllcywgQmVhblByb3h5VmFsdWVTZW5kZXIgc2VuZGVyKSB7Ci0KLQkJLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBlYWNoIGVudHJ5IHdpbGwgY29vcmVzcG9uZCB0byB0aGUgbmV4dCBub24tbnVsbCBleHByZXNzaW9uIHByb3h5IGFuZCB3aWxsIGJlIHRoZSBiZWFuIHByb3h5IG9yIG9uZSBvZiB0aGUgc3BlY2lhbAotCQkvLyB0eXBlcy4KLQkJaW50IGxlbiA9IGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKTsKLQkJaW50IGogPSAwOwotCQlPYmplY3RbXSByZXNvbHZlZHMgPSBzZW5kZXIuZ2V0QXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJRXhwcmVzc2lvblByb3h5IGVwID0gKEV4cHJlc3Npb25Qcm94eSkgZXhwcmVzc2lvblByb3hpZXMuZ2V0KGkpOwotCQkJaWYgKGVwICE9IG51bGwpIHsKLQkJCQlPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlZHNbaisrXTsKLQkJCQlpZiAocmVzb2x2ZWQgPT0gTk9UUkVTT0xWRUQpCi0JCQkJCWZpcmVQcm94eU5vdFJlc29sdmVkKGVwKTsKLQkJCQllbHNlIGlmIChyZXNvbHZlZCA9PSBWT0lEVFlQRSkKLQkJCQkJZmlyZVByb3h5Vm9pZChlcCk7Ci0JCQkJZWxzZQotCQkJCQlmaXJlUHJveHlSZXNvbHZlZChlcCwgKElCZWFuUHJveHkpIHJlc29sdmVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdWxsUHJveHlWYWx1ZShpbnQsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBJQmVhblByb3h5IHB1bGxQcm94eVZhbHVlKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKCFoYXZlU2VudERhdGEoKSkgewotCQkJbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChleHByZXNzaW9uUHJveGllcyk7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gV2UgaGF2ZW4ndCBwdXNoZWQgYW55IGNvbW1hbmRzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiBEb24ndCBjcmVhdGUgYSBjb25uZWN0aW9uIGZvciB0aGlzLgotCQl9Ci0JCS8vIElmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXQgdGhpcyBwb2ludCBpbiB0aW1lLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhlbS4gVGhleSB3b3VsZCBiZSBkbyBub3RoaW5ncyBhbnl3YXkuCi0JCQotCQlib29sZWFuIHByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzID0gZmFsc2U7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBsY2xDb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQltYXJrSW5UcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJdHJ5IHsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzID0gbnVsbDsKLQkJCUJlYW5Qcm94eVZhbHVlU2VuZGVyIHNlbmRlciA9IG51bGw7Ci0JCQlpZiAocHJveHljb3VudCA+IDApIHsKLQkJCQlwcm94eWlkcyA9IGNyZWF0ZUV4cHJlc3Npb25Qcm94aWVzVmFsdWVPYmplY3QocHJveHljb3VudCwgZXhwcmVzc2lvblByb3hpZXMpOwotCQkJCXNlbmRlciA9IGdldEV4cHJlc3Npb25Qcm94aWVzU2VuZGVyKCk7Ci0JCQl9Ci0JCQkKLQkJCWxjbENvbm5lY3Rpb24ucHVsbFZhbHVlKGdldFJFTUV4cHJlc3Npb25JRCgpLCBwcm94eWlkcywgc2VuZGVyKTsKLQkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciwgdGhlbiBpZiB0aGVyZSBhcmUgcHJveGllcywgd2UgbmVlZCB0byBwcm9jZXNzIHRoZXNlIHRvby4KLQkJCWlmIChwcm94eWNvdW50ID4gMCkKLQkJCQlwcm9jZXNzcHVsbGVkRXhwcmVzc2lvblByb3hpZXMoZXhwcmVzc2lvblByb3hpZXMsIHNlbmRlcik7Ci0JCQlwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcyA9dHJ1ZTsKLQkJCWxjbENvbm5lY3Rpb24uZ2V0RmluYWxWYWx1ZSh3b3JrZXJWYWx1ZSk7CS8vIEdldCB0aGUgcmV0dXJuZWQgdmFsdWUuCi0JCQlyZXR1cm4gZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLmdldEJlYW5Qcm94eSh3b3JrZXJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChlLmdldEVycm9yQ29kZSgpID09IEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OX05PRVhQUkVTU0lPTlZBTFVFX0VYQ0VQVElPTikgewotCQkJCQkvLyBOZWVkIHRvIHR1cm4gaXQgaW50byBhIFRocm93YWJsZS4KLQkJCQkJVGhyb3dhYmxlUHJveHkgdCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuZ2V0QmVhblByb3h5KGUuZ2V0VmFsdWUoKSk7CS8vIFRoaXMgd2lsbCBjYXVzZSBhIHRocm93IHRvIG9jY3VyLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCBnb2luZyBvdXQsIHdlIHdhbnQgdG8gY2FwdHVyZSBpdC4KLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZTEpIHsKLQkJCQkJCXQgPSBlMTsKLQkJCQkJfQotCQkJCQl0aHJvdyBuZXcgUkVNTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24odCk7Ci0JCQkJfQotCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJbGNsQ29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJCX0JCQkKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJbGNsQ29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0gZmluYWxseSB7Ci0JCQltYXJrRW5kVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCQlpZiAoIXByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzKQotCQkJCW1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoZXhwcmVzc2lvblByb3hpZXMpOwkvLyBXZSBmYWlsZWQgYmVmb3JlIHdlIGNvdWxkIHByb2Nlc3MgdGhlIGV4cHJlc3Npb24gcHJveGllcy4gU28gbWFyayBhbGwgYXMgbm90IHJlc29sdmVkLgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSBjb21tYW5kcyB0aGF0IHdyaXRlIHNvbWUgZGF0YSBhbmQgd2lsbCBiZSByZWFkaW5nIGRhdGEgYmFjayBpbW1lZGlhdGVseSAKLQkgKiAoaS5lLiBwdWxsIHZhbHVlIGFuZCBpbnZva2UgZXhwcmVzc2lvbikuIElmIHdlIGFyZSBvbiBhIGNhbGxiYWNrIHRocmVhZCBhbmQgaGF2ZSB0aGUgCi0JICogdXNlZCB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBjYWxsYmFjayB0aHJlYWQsIHdlIG5lZWQgdG8gdGVsbCB0aGUgY2FsbGJhY2sgdGhyZWFkIHRoYXQKLQkgKiBpdCBpcyBpbiBhIHRyYW5zYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdoaWxlIHJlYWRpbmcgZGF0YSBiYWNrIHRoZXJlIGFyZQotCSAqIHNvbWV0aW1lcyBjYWxscyBiYWNrIHRvIHRoZSB2bSB0byBnZXQgYmVhbnR5cGUgZGF0YSBmb3IgbmV3IGNsYXNzZXMuIFRoaXMgd291bGQgCi0JICogbm9ybWFsbHkgYmUgdGhyb3VnaCBhIG5ldyBjb25uZWN0aW9uIHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgc3R1Y2sgaW4gdGhlIG1pZGRsZSBvZiB0aGUKLQkgKiBkYXRhIGJlaW5nIHNlbnQgYmFjay4gQnV0IHdoZW4gcnVubmluZyBvbiBhIGNhbGxiYWNrIHRoZSBzYW1lIGNvbm5lY3Rpb24gaXMgdXNlZC4gU28gaXQKLQkgKiB3b3VsZCBzdGljayBkYXRhIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJldHVybiBzdHJlYW0gb2YgZGF0YS4gVG8gcHJldmVudCB0aGlzIHdlIG5lZWQKLQkgKiB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdCBpdCBpcyBpbiBhIHRyYW5zYWN0aW9uIGR1cmluZyB0aGlzIGNhbGwgc28gdGhhdCBhbnkKLQkgKiBzdWNoIG5ldyBjb25uZWN0aW9uIHJlcXVlc3RzIHdpbGwgZ2V0IGEgbmV3IGNvbm5lY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbmVzdGFibGUgKGkuZS4gdGhlIGZpcnN0IG1hcmtFbmRUcmFuc2FjdGlvbiB3aWxsIHNldCBpdCBmYWxzZSwgZXZlbiBpZiBzZXZlcmFsIG5lc3RlZAotCSAqIG1hcmtJblRyYW5zYWN0aW9ucyBhcmUgY2FsbGVkKS4KLQkgKiA8cD4KLQkgKiBtYXJrRW5kVHJhbnNhY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gQUxMIGNhc2VzLCBzdWNoIHVzZSB0cnkvZmluYWxseS4KLQkgKiBAcGFyYW0gcmVtQ29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB0byBzZWUgY2hlY2sgYWdhaW5zdCBhbmQgbWFyayBpbiB0cmFuc2FjdGlvbiBmb3IuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFya0luVHJhbnNhY3Rpb24oSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIHJlbUNvbm5lY3Rpb24pIHsKLQkJVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCWlmICh0aHJlYWQgaW5zdGFuY2VvZiBSRU1DYWxsYmFja1RocmVhZCkgewotCQkJLy8gV2UgYXJlIGluIGEgY2FsbGJhY2ssIGFuZCB0aGUgY2FsbGJhY2sgY29ubmVjdGlvbiBpcyBvdXIgY29ubmVjdGlvbiwgdGVsbCB0aGUgY2FsbGJhY2sgdGhhdCBpdCBpcyBpbiB0cmFuc2FjdGlvbi4KLQkJCVJFTUNhbGxiYWNrVGhyZWFkIGNhbGxiYWNrVGhyZWFkID0gKFJFTUNhbGxiYWNrVGhyZWFkKSB0aHJlYWQ7Ci0JCQlpZiAoY2FsbGJhY2tUaHJlYWQuZ2V0Q29ubmVjdGlvbigpID09IHJlbUNvbm5lY3Rpb24pIHsKLQkJCQljYWxsYmFja1RocmVhZC5zZXRJbnRyYW5zYWN0aW9uKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1hcmsgZW5kIG9mIHRyYW5zYWN0aW9uLgotCSAqIEBwYXJhbSByZW1Db25uIFJFTUNvbm5lY3Rpb24gdG8gdGVzdCBhbmQgbWFyayBub3QgaW4gY29ubmVjdGlvbiBmb3IuCi0JICogCi0JICogQHNlZSBSRU1FeHByZXNzaW9uI21hcmtJblRyYW5zYWN0aW9uKElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbikKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrRW5kVHJhbnNhY3Rpb24oSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIHJlbUNvbm4pIHsKLQkJVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCWlmICh0aHJlYWQgaW5zdGFuY2VvZiBSRU1DYWxsYmFja1RocmVhZCkgewotCQkJLy8gV2UgYXJlIGluIGEgY2FsbGJhY2ssIGFuZCB0aGUgY2FsbGJhY2sgY29ubmVjdGlvbiBpcyBvdXIgY29ubmVjdGlvbiwgdGVsbCB0aGUgY2FsbGJhY2sgdGhhdCBpdCBpcyBpbiB0cmFuc2FjdGlvbi4KLQkJCVJFTUNhbGxiYWNrVGhyZWFkIGNhbGxiYWNrVGhyZWFkID0gKFJFTUNhbGxiYWNrVGhyZWFkKSB0aHJlYWQ7Ci0JCQlpZiAoY2FsbGJhY2tUaHJlYWQuZ2V0Q29ubmVjdGlvbigpID09IHJlbUNvbm4pIHsKLQkJCQljYWxsYmFja1RocmVhZC5zZXRJbnRyYW5zYWN0aW9uKGZhbHNlKTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4cHJlc3Npb25Qcm94aWVzCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kcy5WYWx1ZU9iamVjdCBjcmVhdGVFeHByZXNzaW9uUHJveGllc1ZhbHVlT2JqZWN0KGludCBhY3R1YWxDb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgewotCQljbGFzcyBFeHByZXNzaW9uUHJveHlSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJCUl0ZXJhdG9yIGV4cHJlc3Npb25Qcm94aWVzSXRyOwotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCXB1YmxpYyBFeHByZXNzaW9uUHJveHlSZXRyaWV2ZXIoTGlzdCBleHByZXNzaW9uUHJveGllcykgewotCQkJCXRoaXMuZXhwcmVzc2lvblByb3hpZXNJdHIgPSBleHByZXNzaW9uUHJveGllcy5pdGVyYXRvcigpOwotCQkJfQotCi0JCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJCXdvcmtlci5zZXQoLTEpOwotCQkJCXdoaWxlIChleHByZXNzaW9uUHJveGllc0l0ci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHBhcm0gPSBleHByZXNzaW9uUHJveGllc0l0ci5uZXh0KCk7Ci0JCQkJCWlmIChwYXJtICE9IG51bGwpIHsKLQkJCQkJCXdvcmtlci5zZXQoKChFeHByZXNzaW9uUHJveHkpIHBhcm0pLmdldFByb3h5SUQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gCi0JCQkJcmV0dXJuIHdvcmtlcjsKLQkJCX0KLQkJfTsKLQotCQl3b3JrZXJWYWx1ZS5zZXRBcnJheUlEUyhuZXcgRXhwcmVzc2lvblByb3h5UmV0cmlldmVyKGV4cHJlc3Npb25Qcm94aWVzKSwgYWN0dWFsQ291bnQsIENvbW1hbmRzLklOVCk7Ci0JCXJldHVybiB3b3JrZXJWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDYXN0VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2FzdFRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGNhc3QgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGNhc3QgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkNBU1RfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7CQkJCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBwcm94eSBiZWFuIHR5cGUgaW4gdGhlIGZvcm1hdCBkZXBlbmRpbmcgb24gZXhwcmVzc2lvbiBwcm94eSBvciBiZWFudHlwZSBwcm94eS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsUHJveHkoSVByb3h5IHR5cGUsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IGlmIElCZWFuVHlwZVByb3h5IG9yIGludCAoZm9yIGV4cHJlc3Npb24gcHJveHkgaWQpIGlmIGV4cHJlc3Npb24gcHJveHkuCi0JCWlmICh0eXBlLmlzQmVhblByb3h5KCkpIHsKLQkJCSgoSVJFTUJlYW5Qcm94eSkgdHlwZSkucmVuZGVyQmVhbih2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgZXAgPSAoRXhwcmVzc2lvblByb3h5KSB0eXBlOwotCQkJdmFsdWUuc2V0KGVwLmdldFByb3h5SUQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW5zdGFuY2VvZlRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEluc3RhbmNlb2ZUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBpbnN0YW5jZW9mIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBpbnN0YW5jZW9mIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgY2xhc3MuCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSU5TVEFOQ0VPRl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEluZml4VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkluZml4T3BlcmF0b3IsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW5maXhUb1Byb3h5KEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBvcGVyYW5kVHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGluZml4IHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBpbmZpeCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJYnl0ZTogb3BlcmF0b3IKLQkJCS8vCQlieXRlOiBvcGVyYW5kVHlwZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLklORklYX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoQnl0ZSgoYnl0ZSkgb3BlcmF0b3IuZ2V0VmFsdWUoKSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCeXRlKChieXRlKSBvcGVyYW5kVHlwZS5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0JCQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFByZWZpeFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5QcmVmaXhPcGVyYXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoUHJlZml4VG9Qcm94eShQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHByZWZpeCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggcHJlZml4IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlieXRlOiBvcGVyYXRvcgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJ5dGUoKGJ5dGUpIG9wZXJhdG9yLmdldFZhbHVlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFycmF5QWNjZXNzVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5QWNjZXNzVG9Qcm94eShpbnQgaW5kZXhDb3VudCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGFycmF5IGFjY2VzcyB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYXJyYXkgYWNjZXMgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogaW5kZXhDb3VudAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChpbmRleENvdW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBcnJheUNyZWF0aW9uVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUNyZWF0aW9uVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uQ291bnQpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBhcnJheSBjcmVhdGlvbiB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYXJyYXkgY3JlYXRpb24gdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eS4KLQkJCS8vCQlpbnQ6IGRpbWVuc2lvbiBjb3VudAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0NSRUFUSU9OX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChkaW1lbnNpb25Db3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUluaXRpYWxpemVyVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgc3RyaXBDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGFycmF5IGluaXRpYWxpemVyIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBhcnJheSBpbml0aWFsaXplciB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIGV4cHJlc3Npb24gcHJveHkuCi0JCQkvLwkJaW50OiBzdHJpcCBjb3VudAotCQkJLy8JCWludDogZXhwcmVzc2lvbiBjb3VudAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChzdHJpcENvdW50KTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChleHByZXNzaW9uQ291bnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eQotCQkJLy8JCWludDogYXJndW1lbnQgY291bnQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoYXJndW1lbnRDb3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFR5cGVSZWNlaXZlclRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovIAotCXByb3RlY3RlZCB2b2lkIHB1c2hUeXBlUmVjZWl2ZXJUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0eXBlIHJlY2VpdmVyIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0eXBlIHJlY2VpdmVyIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkuCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoRmllbGRBY2Nlc3NUb1Byb3h5KGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEZpZWxkQWNjZXNzVG9Qcm94eShPYmplY3QgZmllbGQsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBmaWVsZCBhY2Nlc3MgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGZpZWxkIGFjY2VzcyB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJQ29tbWFuZHMuVmFsdWU6IGZpZWxkTmFtZSBvciBJUHJveHlGaWVsZAotCQkJLy8JCWJvb2xlYW46IGhhc1JlY2VpdmVyCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRklFTERfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJaWYgKGZpZWxkIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJd29ya2VyVmFsdWUuc2V0KChTdHJpbmcpIGZpZWxkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsbFByb3h5KChJUHJveHkpIGZpZWxkLCB3b3JrZXJWYWx1ZSk7Ci0JCQl9Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCb29sZWFuKGhhc1JlY2VpdmVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTWV0aG9kSW52b2NhdGlvblRvUHJveHkoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShPYmplY3QgbWV0aG9kLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJnQ291bnQpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBtZXRob2QgaW52b2NhdGlvbiB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggbWV0aG9kIGludm9jYXRpb24gdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCUNvbW1hbmRzLlZhbHVlT2JqZWN0OiBtZXRob2ROYW1lIG9yIElNZXRob2RQcm94eQotCQkJLy8JCWJvb2xlYW46IGhhc1JlY2VpdmVyCi0JCQkvLwkJaW50OiBhcmdDb3VudAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLk1FVEhPRF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWlmIChtZXRob2QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQl3b3JrZXJWYWx1ZS5zZXQoKFN0cmluZykgbWV0aG9kKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsbFByb3h5KChJUHJveHkpIG1ldGhvZCwgd29ya2VyVmFsdWUpOwotCQkJfQotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoQm9vbGVhbihoYXNSZWNlaXZlcik7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoYXJnQ291bnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDb25kaXRpb25hbFRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDb25kaXRpb25hbFRvUHJveHkoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4cHJlc3Npb25UeXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggY29uZGl0aW9uYWwgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGNvbmRpdGlvbmFsIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlieXRlOiBleHByZXNzaW9uIHR5cGUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DT05ESVRJT05BTF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJ5dGUoKGJ5dGUpIGV4cHJlc3Npb25UeXBlLmdldFZhbHVlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qCi0JICogQSBzcGVjaWFsIG9uZSB0aGF0IHRha2VzIHRoZSBUaHJvd2FibGVQcm94eSBmb3Igbm8gZXhwcmVzc2lvbiB2YWx1ZSBhbmQgCi0JICogd3JhcHBlcnMgaXQgcHJpbnRzIGl0cyBzdGFjayB0cmFjZSBpbnN0ZWFkLCBidXQgc3RpbGwgbWFrZXMgaXQgYSBzdWJjbGFzcwotCSAqIG9mIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJFTU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGV4dGVuZHMgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTY5MjQwNjc3NzM5MTgxMjY5NEw7Ci0KLQotCQlwdWJsaWMgUkVNTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oVGhyb3dhYmxlUHJveHkgZSkgewotCQkJc3VwZXIoZSk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNnZXRMb2NhbGl6ZWRNZXNzYWdlKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJCXJldHVybiAoKFRocm93YWJsZVByb3h5KSBnZXRDYXVzZSgpKS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI2dldE1lc3NhZ2UoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJcmV0dXJuICgoVGhyb3dhYmxlUHJveHkpIGdldENhdXNlKCkpLmdldFByb3h5TWVzc2FnZSgpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJCWdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7Ci0JCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHMpIHsKLQkJCWdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEludm9rZShpbnQsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbnZva2UoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlpZiAoIWhhdmVTZW50RGF0YSgpKSB7Ci0JCQltYXJrQWxsUHJveGllc05vdFJlc29sdmVkKGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJCXJldHVybjsJLy8gV2UgaGF2ZW4ndCBwdXNoZWQgYW55IGNvbW1hbmRzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiBEb24ndCBjcmVhdGUgYSBjb25uZWN0aW9uIGZvciB0aGlzLgotCQl9Ci0JCS8vIElmIGF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhlbSBiZWNhdXNlIHRoZXkgd291bGQgYWxsIGJlIGRvLW5vdGhpbmdzLgotCQkKLQkJYm9vbGVhbiBwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcyA9IGZhbHNlOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gbGNsQ29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJbWFya0luVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcyA9IG51bGw7Ci0JCQlCZWFuUHJveHlWYWx1ZVNlbmRlciBzZW5kZXIgPSBudWxsOwotCQkJaWYgKHByb3h5Y291bnQgPiAwKSB7Ci0JCQkJcHJveHlpZHMgPSBjcmVhdGVFeHByZXNzaW9uUHJveGllc1ZhbHVlT2JqZWN0KHByb3h5Y291bnQsIGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJCQlzZW5kZXIgPSBnZXRFeHByZXNzaW9uUHJveGllc1NlbmRlcigpOwotCQkJfQotCi0JCQlsY2xDb25uZWN0aW9uLnN5bmMoZ2V0UkVNRXhwcmVzc2lvbklEKCksIHByb3h5aWRzLCBzZW5kZXIpOwotCQkJCi0JCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZW4gaWYgdGhlcmUgYXJlIHByb3hpZXMsIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGVzZSB0b28uCi0JCQlpZiAocHJveHljb3VudCA+IDApCi0JCQkJcHJvY2Vzc3B1bGxlZEV4cHJlc3Npb25Qcm94aWVzKGV4cHJlc3Npb25Qcm94aWVzLCBzZW5kZXIpOwotCQkJcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMgPSB0cnVlOwotCQkJbGNsQ29ubmVjdGlvbi5nZXRGaW5hbFZhbHVlKHdvcmtlclZhbHVlKTsJLy8gV2UgZG9uJ3QgY2FyZSB3aGF0IGl0IGlzLCB3ZSBqdXN0IG5lZWQgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRFcnJvckNvZGUoKSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04pIHsKLQkJCQkJLy8gTmVlZCB0byB0dXJuIGl0IGludG8gYSBUaHJvd2FibGUuCi0JCQkJCVRocm93YWJsZVByb3h5IHQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLmdldEJlYW5Qcm94eShlLmdldFZhbHVlKCkpOwkvLyBUaGlzIHdpbGwgY2F1c2UgYSB0aHJvdyB0byBvY2N1ciwgYnV0IHdlIGRvbid0IHdhbnQgaXQgZ29pbmcgb3V0LCB3ZSB3YW50IHRvIGNhcHR1cmUgaXQuCi0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUxKSB7Ci0JCQkJCQl0ID0gZTE7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgbmV3IFJFTU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKHQpOwotCQkJCX0KLQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlMSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCWxjbENvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCQl9CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWxjbENvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9IGZpbmFsbHkgewotCQkJbWFya0VuZFRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQkJaWYgKCFwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcykKLQkJCQltYXJrQWxsUHJveGllc05vdFJlc29sdmVkKGV4cHJlc3Npb25Qcm94aWVzKTsJLy8gV2UgZmFpbGVkIGJlZm9yZSB3ZSBjb3VsZCBwcm9jZXNzIHRoZSBleHByZXNzaW9uIHByb3hpZXMuIFNvIG1hcmsgYWxsIGFzIG5vdCByZXNvbHZlZC4KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJFTUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgUkVNQmVhblR5cGVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHR5cGVOYW1lOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIiAtICIrZ2V0VHlwZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCQkgKi8KLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCQkgKi8KLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCAoSVByb3h5QmVhblR5cGVbXSkgbnVsbCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0RmllbGRQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIGZpZWxkTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUkVNTWV0aG9kRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSVByb3h5TWV0aG9kIHsKLQkJCi0JCQkvKioKLQkJICogQHBhcmFtIHByb3h5aWQKLQkJICogQHBhcmFtIHByb3h5VHlwZQotCQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIFJFTU1ldGhvZEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBNRVRIT0RfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUkVNRmllbGRFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJUHJveHlGaWVsZCB7Ci0JCQotCQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIEBwYXJhbSBwcm94eVR5cGUKLQkJICogQHBhcmFtIGV4cHJlc3Npb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBSRU1GaWVsZEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBGSUVMRF9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI2NyZWF0ZUV4cHJlc3Npb25Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5VHlwZSwgaW50IHByb3h5SUQpIHsKLQkJc3dpdGNoIChwcm94eVR5cGUpIHsKLQkJCWNhc2UgTk9STUFMX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBuZXcgRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIE5PUk1BTF9FWFBSRVNTSU9OX1BST1hZLCB0aGlzKTsKLQkJCQotCQkJY2FzZSBCRUFOVFlQRV9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgUkVNQmVhblR5cGVFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCQkJCi0JCQljYXNlIE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgUkVNTWV0aG9kRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQkJCQotCQkJY2FzZSBGSUVMRF9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgUkVNRmllbGRFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXNzaWdubWVudFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBhc3NpZ25tZW50IHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBhc3NpZ25tZW50IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IHByb3h5IGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChwcm94eS5nZXRQcm94eUlEKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBc3NpZ25tZW50VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFzc2lnbm1lbnRUb1Byb3h5KCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiB0aGUgcHVzaCBhc3NpZ25tZW50IGNvbW1hbmQgaXM6Ci0JCQkvLyAgIFB1c2hBc3NpZ25tZW50Q29tbWFuZC4KLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSkgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgcHVzaFRvRXhwcmVzc2lvblByb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGV4cHJlc3Npb24gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGV4cHJlc3Npb24gcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogcHJveHkgaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX1RPX0VYUFJFU1NJT05fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQocHJveHkuZ2V0UHJveHlJRCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBCbG9ja0JlZ2luIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJcHVibGljIGludCBibG9ja051bWJlcjsKLQkJCi0JCXB1YmxpYyBCbG9ja0JlZ2luKGludCBibG9ja051bWJlcikgewotCQkJdGhpcy5ibG9ja051bWJlciA9IGJsb2NrTnVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBibG9jayBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGJsb2NrIGJlZ2luIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiBibG9jayBpZAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkJMT0NLX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludChibG9ja051bWJlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0JlZ2luVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrQmVnaW5Ub1Byb3h5KGludCBibG9ja051bWJlcikgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IEJsb2NrQmVnaW4oYmxvY2tOdW1iZXIpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tFbmRUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tFbmRUb1Byb3h5KGludCBibG9ja051bWJlcikgewotCQkvLyBTZWUgaWYgdGhlIHRvcCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBpcyBCcmVha0Jsb2NrKGJsb2NrTnVtYmVyKS4gSWYgaXQgaXMgdGhlbiB0aGUgQnJlYWtCbG9jayBjYW4gYmUgdGhyb3duIGF3YXkuCi0JCVBlbmRpbmdUcmFuc2FjdGlvbiB0b3BFbnRyeSA9IGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoMSk7Ci0JCWlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIEJsb2NrQnJlYWsgJiYgKChCbG9ja0JyZWFrKSB0b3BFbnRyeSkuYmxvY2tOdW1iZXIgPT0gYmxvY2tOdW1iZXIpIHsKLQkJCXBvcFBlbmRpbmdFbnRyeSgxKTsKLQkJCXRvcEVudHJ5ID0gZ2V0UGVuZGluZ0VudHJ5RnJvbVRvcCgxKTsKLQkJfQotCQkvLyBTZWUgaWYgdGhlIHRvcCBwZW5kaW5nIHRyYW5zYWN0aW9uIGlzIG5vdyBCZWdpbkJsb2NrKGJsb2NrTnVtYmVyKS4gSWYgaXQgaXMsIHRoZW4gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlIGJsb2NrIGJlZ2luCi0JCS8vIGNhbiBiZSB0aHJvd24gYXdheSBiZWNhdXNlIHRoZXkgYXJlIGFuIGVtcHR5IGJsb2NrLgotCQlpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBCbG9ja0JlZ2luICYmICgoQmxvY2tCZWdpbikgdG9wRW50cnkpLmJsb2NrTnVtYmVyID09IGJsb2NrTnVtYmVyKSB7Ci0JCQlwb3BQZW5kaW5nRW50cnkoMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBibG9jayBlbmQgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGJsb2NrIGVuZCBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBibG9jayBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkJMT0NLX0VORF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChibG9ja051bWJlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEJsb2NrQnJlYWsgZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQlwdWJsaWMgaW50IGJsb2NrTnVtYmVyOwotCQkKLQkJcHVibGljIEJsb2NrQnJlYWsoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCQl0aGlzLmJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGJsb2NrIGJyZWFrIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYmxvY2sgYnJlYWsgcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IGJsb2NrIGlkCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQlJFQUtfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KGJsb2NrTnVtYmVyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tCcmVha1RvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCS8vIEV2ZW4gaWYgdGhlcmUgaXMgbm8gcGVuZGluZyBibG9jayBiZWdpbiBmb3IgdGhpcyBibG9jaywgd2Ugd2lsbCBwZW5kIHRoZSBicmVhay4KLQkJLy8gVGhpcyBpcyBzbyB0aGF0IGlmIHRoZSBicmVhayBvY2N1cnJlZCBqdXN0IGJlZm9yZSB0aGUgYmxvY2sgZW5kLCB0aGVuIGl0IGNhbiBiZSBpZ25vcmVkLgotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IEJsb2NrQnJlYWsoYmxvY2tOdW1iZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUcnlCZWdpbiBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0KLQkJcHVibGljIGZpbmFsIGludCB0cnlOdW1iZXI7Ci0JCQotCQlwdWJsaWMgVHJ5QmVnaW4oaW50IHRyeU51bWJlcikgewotCQkJdGhpcy50cnlOdW1iZXIgPSB0cnlOdW1iZXI7Ci0JCQkKLQkJfQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byB0cnkgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0cnkgYmVnaW4gdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IHRyeSBpZAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQodHJ5TnVtYmVyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUJlZ2luVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUJlZ2luVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgVHJ5QmVnaW4odHJ5TnVtYmVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJ5Q2F0Y2ggZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCi0JCXB1YmxpYyBmaW5hbCBpbnQgdHJ5TnVtYmVyOwotCQlwcml2YXRlIGZpbmFsIElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGU7Ci0JCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvblByb3h5IGVwOwotCi0JCXB1YmxpYyBUcnlDYXRjaChpbnQgdHJ5TnVtYmVyLCBJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlLCBFeHByZXNzaW9uUHJveHkgZXApIHsKLQkJCXRoaXMudHJ5TnVtYmVyID0gdHJ5TnVtYmVyOwotCQkJdGhpcy5leGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLQkJCXRoaXMuZXAgPSBlcDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gdHJ5IGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdHJ5IGJlZ2luIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiB0cnkgaWQKLQkJCQkvLwkJb2JqZWN0OiBleHByZXNzaW9uIHR5cGUgKGFzIGJlYW50eXBlIG9yIGFzIGV4cHJlc3Npb24gcHJveHkpCi0JCQkJLy8JCWludDogcHJveHkgaWQgb3IgKC0xIGlmIG51bGwpLgotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQodHJ5TnVtYmVyKTsKLQkJCQlyZW1FeHByZXNzaW9uLmZpbGxQcm94eShleGNlcHRpb25UeXBlLCByZW1FeHByZXNzaW9uLndvcmtlclZhbHVlKTsKLQkJCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdChyZW1FeHByZXNzaW9uLndvcmtlclZhbHVlKTsKLQkJCQlpZiAoZXAgIT0gbnVsbCkKLQkJCQkJY29ubmVjdGlvbi5wdXNoSW50KGVwLmdldFByb3h5SUQoKSk7Ci0JCQkJZWxzZQotCQkJCQljb25uZWN0aW9uLnB1c2hJbnQoLTEpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJCX0JCQkKLQkJCX0KLQkJfQotCQkKLQl9Ci0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KGludCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIsIElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIEV4cHJlc3Npb25Qcm94eSBlcCkgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IFRyeUNhdGNoKHRyeU51bWJlciwgZXhjZXB0aW9uVHlwZSwgZXApKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUcnlGaW5hbGx5IGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJCi0JCXB1YmxpYyBmaW5hbCBpbnQgdHJ5TnVtYmVyOwotCi0JCXB1YmxpYyBUcnlGaW5hbGx5KGludCB0cnlOdW1iZXIpIHsKLQkJCXRoaXMudHJ5TnVtYmVyID0gdHJ5TnVtYmVyOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byB0cnkgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0cnkgZmluYWxseSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogdHJ5IGlkCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0ZJTkFMTFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KHRyeU51bWJlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlGaW5hbGx5Q2xhdXNlVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBUcnlGaW5hbGx5KHRyeU51bWJlcikpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUVuZFRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlFbmRUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJLy8gVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kuIFdlIG5lZWQgdG8gZmluZCBpZiB0aGVyZSBpcyBub3RoaW5nIGJ1dCB0cnkvY2F0Y2gvZmluYWxseSBmb3IgdGhpcyB0cnlOdW1iZXIgb24gdGhlIHBlbmRpbmcKLQkJLy8gdHJhbnNhY3Rpb25zIHVwIHRvIHRoZSB0cnkgYmVnaW4sIGlmIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSwgdGhlbiB3ZSBjYW4gdGhyb3cgdGhlIGVudGlyZSB0cnkgYXdheS4gVGhhdAotCQkvLyBtZWFucyB0aGVyZSB3YXMgbm8gY29kZSBhdCBhbGwgaW4gYW55IG9mIHRoZSB0cnkvY2F0Y2gvZmluYWxseSBibG9ja3MuCi0JCWludCBmcm9tVG9wID0gMDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVBlbmRpbmdUcmFuc2FjdGlvbiB0b3BFbnRyeSA9IGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoKytmcm9tVG9wKTsKLQkJCWlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIFRyeUZpbmFsbHkpIHsKLQkJCQlpZiAoKChUcnlGaW5hbGx5KSB0b3BFbnRyeSkudHJ5TnVtYmVyICE9IHRyeU51bWJlcikKLQkJCQkJYnJlYWs7CS8vIFdlIG1ldCBhIGZpbmFsbHkgdGhhdCB3YXNuJ3Qgb3Vycywgc28gZW50aXJlIHRyeSBncm91cCBtdXN0IGJlIHNlbnQuCi0JCQl9IGVsc2UgaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgVHJ5Q2F0Y2gpIHsKLQkJCQlpZiAoKChUcnlDYXRjaCkgdG9wRW50cnkpLnRyeU51bWJlciAhPSB0cnlOdW1iZXIpCi0JCQkJCWJyZWFrOwkvLyBXZSBtZXQgYSBjYXRjaCB0aGF0IHdhc24ndCBvdXJzLCBzbyBlbnRpcmUgdHJ5IGdyb3VwIG11c3QgYmUgc2VudC4KLQkJCX0gZWxzZSBpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBUcnlCZWdpbikgewotCQkJCWlmICgoKFRyeUJlZ2luKSB0b3BFbnRyeSkudHJ5TnVtYmVyID09IHRyeU51bWJlcikgewotCQkJCQkvLyBXZSd2ZSBtZXQgb3VyIHRyeSBiZWdpbiwgYW5kIG5vdGhpbmcgYnV0IGVtcHR5IGNhdGNoL2ZpbmFsbHkgaW4gYmV0d2Vlbiwgc28gdGhlIGVudGlyZSBncm91cCBjYW4gYmUgdGhyb3duIGF3YXkKLQkJCQkJcG9wUGVuZGluZ0VudHJ5KGZyb21Ub3ApOwotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlCi0JCQkJCWJyZWFrOwkvLyBXZSd2ZSBoaXQgYSB0cnkgYmVnaW4gdGhhdCB3YXNuJ3Qgb3Vycywgc28gdGhlIGVudGlyZSB0cnkgZ3JvdXAgbXVzdCBiZSBzZW50LgkKLQkJCX0gZWxzZQotCQkJCWJyZWFrOwkvLyBXZSd2ZSBoaXQgc29tZXRoaW5nIG90aGVyIHRoYW4gb3VyIHRyeSBncm91cCwgc28gcHJvY2VzcyBldmVyeXRoaW5nLgotCQl9Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gdHJ5IGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0cnkgZW5kIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IHRyeSBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9FTkRfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQodHJ5TnVtYmVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUaHJvd1RvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUaHJvd1RvUHJveHkoKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gdHJ5IGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0aHJvdyB0byBwcm94eSkKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5USFJPV19FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hSZXRocm93VG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFJldGhyb3dUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byByZXRob3cgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHJldGhyb3cgdG8gcHJveHkpCi0JCQkvLwkJaW50OiB0cnkgaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5SRVRIUk9XX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHRyeU51bWJlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmVhblR5cGVUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmVhblR5cGVUb1Byb3h5KElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQkvLyBQdXNoIGJlYW50eXBlIHRvIHByb3h5IGlzIHNlbnQgb3V0IG9mIHNlcXVlbmNlIHdpdGhvdXQgcmVzcGVjdCB0byB3aGVyZSBpbiBleHByZXNzaW9uIHdlIGFyZSwKLQkJLy8gc28gbm8gbmVlZCB0byBoYW5kbGUgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXQgdGhpcyBwb2ludC4gVGhleSB3b3VsZCBub3QgYWZmZWN0IHRoZSByZXN1bHQKLQkJLy8gb2YgdGhpcyBjYWxsLgotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGJlYW5UeXBlIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBiZWFuIHR5cGUgZXhwcmVzc2lvbiBwcm94eSkKLQkJCS8vCQlpbnQ6IHByb3h5IGlkCi0JCQkvLwkJc3RyaW5nOiB0eXBlbmFtZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfQkVBTlRZUEVfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJUkVNQmVhblR5cGVFeHByZXNzaW9uUHJveHkgZXAgPSAoUkVNQmVhblR5cGVFeHByZXNzaW9uUHJveHkpIHByb3h5OwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGVwLmdldFByb3h5SUQoKSk7Ci0JCQljb25uZWN0aW9uLnB1c2hTdHJpbmcoZXAuZ2V0VHlwZU5hbWUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTWV0aG9kVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hNZXRob2RUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSwgSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gUHVzaCBtZXRob2QgdG8gcHJveHkgaXMgc2VudCBvdXQgb2Ygc2VxdWVuY2Ugd2l0aG91dCByZXNwZWN0IHRvIHdoZXJlIGluIGV4cHJlc3Npb24gd2UgYXJlLAotCQkvLyBzbyBubyBuZWVkIHRvIGhhbmRsZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhdCB0aGlzIHBvaW50LiBUaGV5IHdvdWxkIG5vdCBhZmZlY3QgdGhlIHJlc3VsdAotCQkvLyBvZiB0aGlzIGNhbGwuCi0KLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBtZXRob2QgcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIG1ldGhvZCB0eXBlIGV4cHJlc3Npb24gcHJveHkpCi0JCQkvLwkJaW50OiBwcm94eSBpZAotCQkJLy8JCVZhbHVlT2JqZWN0OiBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBkZWNsYXJpbmcgdHlwZQotCQkJLy8JCXN0cmluZzogbWV0aG9kIG5hbWUKLQkJCS8vCQlpbnQ6IG51bWJlciBvZiBwYXJhbWV0ZXIgdHlwZXMKLQkJCS8vCQlWYWx1ZU9iamVjdChzKTogY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgcGFyYW1ldGVyIHR5cGVzLgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChwcm94eS5nZXRQcm94eUlEKCkpOwotCQkJZmlsbFByb3h5KGRlY2xhcmluZ1R5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFN0cmluZyhtZXRob2ROYW1lKTsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKQotCQkJCWNvbm5lY3Rpb24ucHVzaEludCgwKTsKLQkJCWVsc2UgewotCQkJCWNvbm5lY3Rpb24ucHVzaEludChwYXJhbWV0ZXJUeXBlcy5sZW5ndGgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmlsbFByb3h5KHBhcmFtZXRlclR5cGVzW2ldLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoRmllbGRUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEZpZWxkVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJLy8gUHVzaCBmaWVsZCB0byBwcm94eSBpcyBzZW50IG91dCBvZiBzZXF1ZW5jZSB3aXRob3V0IHJlc3BlY3QgdG8gd2hlcmUgaW4gZXhwcmVzc2lvbiB3ZSBhcmUsCi0JCS8vIHNvIG5vIG5lZWQgdG8gaGFuZGxlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGF0IHRoaXMgcG9pbnQuIFRoZXkgd291bGQgbm90IGFmZmVjdCB0aGUgcmVzdWx0Ci0JCS8vIG9mIHRoaXMgY2FsbC4KLQotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGZpZWxkIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBmaWVsZCB0eXBlIGV4cHJlc3Npb24gcHJveHkpCi0JCQkvLwkJaW50OiBwcm94eSBpZAotCQkJLy8JCVZhbHVlT2JqZWN0OiBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBkZWNsYXJpbmcgdHlwZQotCQkJLy8JCXN0cmluZzogZmllbGQgbmFtZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfRklFTERfRVhQUkVTU0lPTlBST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHByb3h5LmdldFByb3h5SUQoKSk7Ci0JCQlmaWxsUHJveHkoZGVjbGFyaW5nVHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoU3RyaW5nKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiBJUHJveHlNZXRob2RzIGZvciBhIGJlYW50eXBlLiBNZWFudCB0byBiZSB1c2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1Qcm94eUNvbnN0YW50cy4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBSRU1Qcm94eUNvbnN0YW50cyBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldE1ldGhvZHMoSVByb3h5QmVhblR5cGUgYmVhblR5cGUpIHsKLQkJaWYgKG1ldGhvZHNDYWNoZSA9PSBudWxsKQotCQkJbWV0aG9kc0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIG1ldGhvZHMgPSAoTWFwKSBtZXRob2RzQ2FjaGUuZ2V0KGJlYW5UeXBlLmdldFR5cGVOYW1lKCkpOwotCQlpZihtZXRob2RzID09IG51bGwpewotCQkJbWV0aG9kcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJCW1ldGhvZHNDYWNoZS5wdXQoYmVhblR5cGUuZ2V0VHlwZU5hbWUoKSxtZXRob2RzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsJCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWFwIG9mIElQcm94eUZpZWxkcyBmb3IgYSBiZWFudHlwZS4gTWVhbnQgdG8gYmUgdXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggUkVNUHJveHlDb25zdGFudHMuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgUkVNUHJveHlDb25zdGFudHMgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE1hcCBnZXRGaWVsZHMoSVByb3h5QmVhblR5cGUgYmVhblR5cGUpIHsKLQkJaWYgKGZpZWxkc0NhY2hlID09IG51bGwpCi0JCQlmaWVsZHNDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBmaWVsZHMgPSAoTWFwKSBmaWVsZHNDYWNoZS5nZXQoYmVhblR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWlmKGZpZWxkcyA9PSBudWxsKXsKLQkJCWZpZWxkcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJCWZpZWxkc0NhY2hlLnB1dChiZWFuVHlwZS5nZXRUeXBlTmFtZSgpLGZpZWxkcyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsJCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWFwIG9mIElQcm94eUJlYW5UeXBlcyBmb3IgYSBiZWFudHlwZSBuYW1lLiBNZWFudCB0byBiZSB1c2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1TZ3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgUkVNU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUpIHsKLQkJaWYgKGJlYW5UeXBlQ2FjaGUgPT0gbnVsbCkKLQkJCWJlYW5UeXBlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gKElQcm94eUJlYW5UeXBlKSBiZWFuVHlwZUNhY2hlLmdldChiZWFuVHlwZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIGJlYW50eXBlIGV4cHJlc3Npb24gcHJveHkgdG8gdGhlIG1hcCBvZiBiZWFuIHR5cGUgZXhwcmVzc2lvbiBwcm94aWVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkVNU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgUkVNU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gYmVhblR5cGVOYW1lCi0JICogQHBhcmFtIGJlYW50eXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkQmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSwgSVByb3h5QmVhblR5cGUgYmVhbnR5cGUpIHsKLQkJYmVhblR5cGVDYWNoZS5wdXQoYmVhblR5cGVOYW1lLCBiZWFudHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eSBmcm9tIHRoZSBtYXAuIFRoaXMgaXMgY2FsbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGEgcm9sbGJhY2sgZHVlIHRvIGFuIGVuZG1hcmsuCi0JICogQHBhcmFtIGJlYW5UeXBlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUpIHsKLQkJYmVhblR5cGVDYWNoZS5yZW1vdmUoYmVhblR5cGVOYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJZlRlc3RUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSWZUZXN0VG9Qcm94eSgpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBpZiB0ZXN0IHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBpZiB0ZXN0IHRvIHByb3h5KQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX1RFU1RfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSWZFbHNlVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaElmRWxzZVRvUHJveHkoSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBjbGF1c2VUeXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggY29uZGl0aW9uYWwgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGlmL2Vsc2UgY2xhdXNlIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlieXRlOiBjbGF1c2UgdHlwZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX0VMU0VfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCeXRlKChieXRlKSBjbGF1c2VUeXBlLmdldFZhbHVlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE5ld0luc3RhbmNlVG9Qcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTmV3SW5zdGFuY2VUb1Byb3h5KFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgSVByb3h5QmVhblR5cGUgcmVzdWx0VHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIG5ldyBpbnN0YW5jZSBmcm9tIGluaXRzdHJpbmcgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIG5ldyBpbnN0YW5jZSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJc3RyaW5nOiBpbml0IHN0cmluZwotCQkJLy8JCVZhbHVlT2JqZWN0OiBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBkZWNsYXJpbmcgdHlwZQotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLk5FV19JTlNUQU5DRV9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hTdHJpbmcoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCQkJZmlsbFByb3h5KHJlc3VsdFR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsJCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFyayBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCXB1YmxpYyBpbnQgbWFya0lEOwotCQkKLQkJcHVibGljIE1hcmsoaW50IG1hcmtJRCkgewotCQkJdGhpcy5tYXJrSUQgPSBtYXJrSUQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIG1hcmsgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBtYXJrIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiBtYXJrSUQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NQVJLX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQobWFya0lEKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHB1c2hNYXJrVG9Qcm94eShpbnQgbWFya0lEKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgTWFyayhtYXJrSUQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRW5kbWFya1RvUHJveHkoaW50IG1hcmtJRCwgYm9vbGVhbiByZXN0b3JlKSB7Ci0JCS8vIFNlZSBpZiB0aGUgdG9wIHBlbmRpbmcgdHJhbnNhY3Rpb24gaXMgbm93IE1hcmsobWFya0lEKS4gSWYgaXQgaXMsIHRoZW4gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlIG1hcmsgYmVnaW4KLQkJLy8gY2FuIGJlIHRocm93biBhd2F5IGJlY2F1c2UgdGhleSBhcmUgYW4gZW1wdHkgYmxvY2suCi0JCVBlbmRpbmdUcmFuc2FjdGlvbiB0b3BFbnRyeSA9IGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoMSk7Ci0JCWlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIE1hcmsgJiYgKChNYXJrKSB0b3BFbnRyeSkubWFya0lEID09IG1hcmtJRCkgewotCQkJcG9wUGVuZGluZ0VudHJ5KDEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggZW5kIG1hcmsgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGVuZCBtYXJrIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IG1hcmtJRAotCQkJLy8JCWJvb2xlYW46IHJlc3RvcmUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5FTkRNQVJLX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChtYXJrSUQpOwotCQkJY29ubmVjdGlvbi5wdXNoQm9vbGVhbihyZXN0b3JlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvLyBUaGlzIGlzIHRoZSBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyIHVzZWQgdG8gdHJhbnNmZXIuCi0JLy8gVGhpcyBpcyB0aGUgZ3V5IHRoYXQgbWFpbnRhaW5zIGNvbnRpbnVpdHkgb2YgdGhlIHRyYW5zYWN0aW9uIGFzCi0JLy8gaXQgaXMgcGFzc2VkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlci4KLQlwcm90ZWN0ZWQgSUJlYW5Qcm94eSBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcjsJCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJlZ2luVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gSWYgdGhlIGNvbnRyb2xsZXIgaXMgbm90IG51bGwsIHRoYXQgbWVhbnMgd2UgaGFkIGFscmVhZHkgcmVxdWVzdGVkIGEgdHJhbnNmZXIKLQkJLy8gYnV0IGhhZCBub3QgdXNlZCBpdCBpbiB0aGlzIHRocmVhZCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLiBJdAotCQkvLyB3aWxsIGJlIGhhbmRsZWQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgb3RoZXIgdGhyZWFkLgotCQkvLyBJZiB0aGUgY29ubmVjdGlvbiBpcyBudWxsLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nIHNpbmNlIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24KLQkJLy8gdG8gdHJhbnNmZXIuCi0JCWlmIChjb25uZWN0aW9uICE9IG51bGwgJiYgZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgPT0gbnVsbCkgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGxjbENvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCQltYXJrSW5UcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJd29ya2VyVmFsdWUuc2V0KCk7Ci0JCQkJbGNsQ29ubmVjdGlvbi50cmFuc2ZlckV4cHJlc3Npb24oZ2V0UkVNRXhwcmVzc2lvbklEKCksIHdvcmtlclZhbHVlKTsKLQkJCQlleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciA9IGdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5nZXRCZWFuUHJveHkod29ya2VyVmFsdWUpOwotCQkJCWdldFJFTVJlZ2lzdHJ5KCkucmV0dXJuQ29ubmVjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJCQl0aGlzLmNvbm5lY3Rpb24gPSBudWxsOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJbGNsQ29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJCX0JCQkKLQkJCX0gZmluYWxseSB7Ci0JCQkJbWFya0VuZFRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpIHsKLQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gVGhlIG5leHQgdGltZSB3ZSBuZWVkIHRvIHB1c2ggZGF0YSBhY3Jvc3MsIHdlIHdpbGwgZ2V0IGEgY29ubmVjdGlvbiBhbmQgdGhlIGdldENvbm5lY3Rpb24oKQotCQkvLyB3aWxsIGhvb2sgdXAgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIGNvbnRyb2xsZXIgZm9yIHVzLiBUaGlzIHdheSBpZiBub3RoaW5nIGhhcHBlbnMgaW4gdGhpcyB0aHJlYWQgdGhlbiB3ZSB3b24ndAotCQkvLyB3YXN0ZSBjb21tdW5pY2F0aW9uIHRpbWUgb24gaXQuCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViZXhwcmVzc2lvbkJlZ2luIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJcHVibGljIGludCBzdWJleHByZXNzaW9uTnVtYmVyOwotCQkKLQkJcHVibGljIFN1YmV4cHJlc3Npb25CZWdpbihpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQkJdGhpcy5zdWJleHByZXNzaW9uTnVtYmVyID0gc3ViZXhwcmVzc2lvbk51bWJlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gc3ViZXhwcmVzc2lvbiBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHN1YmV4cHJlc3Npb24gYmVnaW4gcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IHN1YmV4cHJlc3Npb24gaWQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5TVUJFWFBSRVNTSU9OX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludChzdWJleHByZXNzaW9uTnVtYmVyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25CZWdpblRvUHJveHkoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBTdWJleHByZXNzaW9uQmVnaW4oc3ViZXhwcmVzc2lvbk51bWJlcikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hTdWJleHByZXNzaW9uRW5kVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQkvLyBTZWUgaWYgdGhlIHRvcCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBpcyBTdWJleHByZXNzaW9uQmVnaW4oc3ViZXhwcmVzc2lvbk51bWJlcikuIElmIGl0IGlzIHRoZW4gdGhlIFN1YmV4cHJlc3Npb25CZWdpbiBjYW4gYmUgdGhyb3duIGF3YXkuCi0JCVBlbmRpbmdUcmFuc2FjdGlvbiB0b3BFbnRyeSA9IGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoMSk7Ci0JCWlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIFN1YmV4cHJlc3Npb25CZWdpbiAmJiAoKFN1YmV4cHJlc3Npb25CZWdpbikgdG9wRW50cnkpLnN1YmV4cHJlc3Npb25OdW1iZXIgPT0gc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQkJcG9wUGVuZGluZ0VudHJ5KDEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gYmxvY2sgZW5kIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBzdWJleHByZXNzaW9uIGVuZCBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBzdWJleHByZXNzaW9uIGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoc3ViZXhwcmVzc2lvbk51bWJlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWE1OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLWZpbmFsIGNsYXNzIFJFTUZpZWxkUHJveHkgZXh0ZW5kcyBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJRmllbGRQcm94eSB7Ci0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eSBmRmllbGRUeXBlOwotCi0JUkVNRmllbGRQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpZWxkVHlwZSgpIHsKLQkJaWYgKGZGaWVsZFR5cGUgPT0gbnVsbCkKLQkJCWZGaWVsZFR5cGUgPQotCQkJCShJQmVhblR5cGVQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldFR5cGUoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQkJCXRoaXMpOwotCi0JCXJldHVybiBmRmllbGRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIHByb3h5LCBpLmUuIG1hcmsgaXQgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmRmllbGRUeXBlID0gbnVsbDsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBmcm9tIHRoZSBzdWJqZWN0Ci0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0KElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gRm9ybWF0IG9mIGdldHRlciBwYXJtcyBpczogKE9iamVjdCAoc3ViamVjdCkpLgotCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJSUJlYW5UeXBlUHJveHkgZmllbGRUeXBlID0gZ2V0RmllbGRUeXBlKCk7Ci0JCWlmICghZmllbGRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIFVzZSBzdGFuZGFyZCBnZXR0ZXIuCi0JCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXQoKSkuaW52b2tlKHRoaXMsIHN1YmplY3QpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCQlpbnQgaWQgPSAoKElSRU1CZWFuUHJveHkpIGZpZWxkVHlwZSkuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0Qnl0ZSgpKS5pbnZva2UodGhpcywgc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRCb29sZWFuKCkpLmludm9rZSgKLQkJCQkJCXRoaXMsCi0JCQkJCQlzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0Q2hhcigpKS5pbnZva2UodGhpcywgc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldERvdWJsZSgpKS5pbnZva2UoCi0JCQkJCQl0aGlzLAotCQkJCQkJc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0RmxvYXQoKSkuaW52b2tlKAotCQkJCQkJdGhpcywKLQkJCQkJCXN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0SW50KCkpLmludm9rZSh0aGlzLCBzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldExvbmcoKSkuaW52b2tlKHRoaXMsIHN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuU0hPUlRfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldFNob3J0KCkpLmludm9rZSgKLQkJCQkJCXRoaXMsCi0JCQkJCQlzdWJqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpbiB0aGlzIHN1YmplY3QgdG8gdGhpcyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkU2V0KCkuaW52b2tlKHRoaXMsIG5ldyBJQmVhblByb3h5W10geyBzdWJqZWN0LCB2YWx1ZSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBwcm94eSBpcyBjb25zdGFudCBwcm94eSBvdXQgb2YgdGhlIG1ldGhvZCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmZpZWxkVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmNjY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCZWFuVHlwZSBQcm94eSBmb3IgTWV0aG9kIGNsYXNzLgotICovCi0KLWZpbmFsIGNsYXNzIFJFTUZpZWxkVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotUkVNRmllbGRUeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5GSUVMRF9DTEFTUyksIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLmdldE5hbWUoKSwgYWNjZXNzaWJsZVR5cGVQcm94eSk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBhY2Nlc3NpYmxlIG9iamVjdCB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBDb25zdHJ1Y3RvciBwcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQlyZXR1cm4gbmV3IFJFTUZpZWxkUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgZGVmYXVsdCBjdG9yLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZywKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdENsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMjVlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBwcm94eSBpbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBGbG9hdC5jbGFzcwotICovCi1jbGFzcyBSRU1GbG9hdENsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNRmxvYXRDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEZsb2F0IGFGbG9hdCkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUZsb2F0KTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZmxvYXRDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoKEZsb2F0KSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjcxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVBSb3h5IGZvciBGbG9hdC5jbGFzcwotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfQ0xBU1MpLCBGbG9hdC5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1GbG9hdENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEZsb2F0KDBGKSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVGbG9hdEJlYW5Qcm94eShGbG9hdCBhRmxvYXQpIHsKLQlyZXR1cm4gKGFGbG9hdC5mbG9hdFZhbHVlKCkgIT0gMEYpID8KLQkJbmV3IFJFTUZsb2F0Q2xhc3NCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRmxvYXQpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBGbG9hdCBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgRmxvYXQuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVGbG9hdEJlYW5Qcm94eSgoRmxvYXQpIGFOdW1iZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlRmxvYXRCZWFuUHJveHkobmV3IEZsb2F0KHZhbHVlLmFGbG9hdCkpOwotfQkKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZhYjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIHRoZSBwcmltaXRpdmUgImZsb2F0Ii4KLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWNsYXNzIFJFTUZsb2F0VHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBmRmxvYXQ7Ci0KLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1GbG9hdFR5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBmbG9hdCBhRmxvYXQpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZGbG9hdCA9IGFGbG9hdDsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1GbG9hdFR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmRmxvYXQgPT0gKChSRU1GbG9hdFR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5mbG9hdFZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgRG91YmxlKQotCQlyZXR1cm4gZkZsb2F0ID09ICgoRmxvYXQpIGFuT2JqZWN0KS5mbG9hdFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZGbG9hdCA9PSAoKFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuZmxvYXRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmRmxvYXQ7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmRmxvYXQ7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmRmxvYXQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIChpbnQpIGZGbG9hdDsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIChsb25nKSBmRmxvYXQ7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBuZXcgRmxvYXQoZkZsb2F0KTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkZsb2F0OwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmRmxvYXQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5mbG9hdFR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZGbG9hdCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjN2ViMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgRmxvYXQuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1GbG9hdFR5cGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfVFlQRSksIEZsb2F0LlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNRmxvYXRUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMEYpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUZsb2F0QmVhblByb3h5KGZsb2F0IGFGbG9hdCkgewotCXJldHVybiAoYUZsb2F0ICE9IDBGKSA/Ci0JCW5ldyBSRU1GbG9hdFR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRmxvYXQpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gZmxvYXQgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUZsb2F0QmVhblByb3h5KHZhbHVlLmFGbG9hdCk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKGZsb2F0KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChmbG9hdCkgZXhwbGljaXRseSBjYXN0cyBpdCBkb3duLgotICoJMikgdmFsaWROdW1iZXIKLSAqIEl0IHdpbGwgdXNlIHRoZSBkZWNvZGUgZnVuY3Rpb24gb2YgZmxvYXQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWZsb2F0IGFGbG9hdDsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoZmxvYXQpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoZmxvYXQpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYUZsb2F0ID0gdi5mbG9hdFZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQl0cnkgewotCQkJYUZsb2F0ID0gRmxvYXQudmFsdWVPZihpbml0aWFsaXphdGlvblN0cmluZykuZmxvYXRWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgZmxvYXQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYUZsb2F0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBlZmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBBIHNwZWNpYWwgYmVhbiB0eXBlIHByb3h5LiBJdCBpcyBmb3IgdGhvc2UgYmVhbiB0eXBlcyB0aGF0IGhhZCBhbiBpbnN0YW50aWF0aW9uIGVycm9yIHdoaWxlIGJlaW5nIGluaXRpYWxpemVkLiBJdCBpcyBzbyB3ZSBoYXZlIHRoZSBtZXNzYWdlLiBBbGwKLSAqIG90aGVyIGFjdGlvbnMgYWdhaW5zdCBpdCB3aWxsIGZhaWwuCi0gKiAKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqLwotcHVibGljIGNsYXNzIFJFTUluaXRFcnJvckJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQmVhblR5cGVQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGluaXRpYWxpemF0aW9uRXJyb3I7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNsYXNzbmFtZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25FcnJvciwgU3RyaW5nIGNsYXNzbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXRoaXMuaW5pdGlhbGl6YXRpb25FcnJvciA9IGluaXRpYWxpemF0aW9uRXJyb3I7Ci0JCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoamF2YS5sYW5nLkludGVnZXIpCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0RmllbGRQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXREZWNsYXJlZEZpZWxkUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGVjbGFyZWRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNBcnJheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNJbnRlcmZhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzS2luZE9mKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzS2luZE9mKElCZWFuVHlwZVByb3h5IGFCZWFuUHJveHlUeXBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbml0aWFsaXphdGlvbkVycm9yKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3IoKSB7Ci0JCXJldHVybiBpbml0aWFsaXphdGlvbkVycm9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuUHJveHkjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNyZW5kZXJCZWFuKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgcmVuZGVySW50bykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSN0b0JlYW5TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7IC8vIFRoaXMgaXMgcGxhY2UgaG9sZGVyIGFueXdheS4gU28gb25seSBpZGVudGljYWwgaWYgc2FtZSBwcm94eS4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRDbGFzc05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIG51bGw7CS8vIFNpbmNlIHRoaXMgZ3V5IGlzIGludmFsaWQsIHdlIGNhbid0IHJldHVybiBhIG1ldGhvZC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNTk2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBJbnRlZ2Vycy4gU2luY2UgSW50ZWdlcnMgd2VyZSBmaXJzdCBpbXBsZW1lbnRlZAotICogaW4gdGhlIFZDRSwgYW5kIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gcmVmZXJlbmNlZCwgd2UndmUgY3JlYXRlZAotICogYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlbS4gVGhhdCB3YXkgd2Ugd291bGRuJ3QgbmVlZCB0byBjaGFuZ2UKLSAqIGV2ZXJ5b25lIHRoYXQgd2FzIHVzaW5nIHRoZSBJSW50ZWdlclByb3h5IGludGVyZmFjZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwOC8zMS8wMCAxMToyODo0OCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotY2xhc3MgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IGltcGxlbWVudHMgSUludGVnZXJCZWFuUHJveHkgewotCi1SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSW50ZWdlcikgewotCXN1cGVyKGFSZWdpc3RyeSwgYW5JbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuaW50ZWdlckNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoSW50ZWdlcikgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1ZDZjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBJbnRlZ2VyLmNsYXNzLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOVEVHRVJfQ0xBU1MpLCBJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDApKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMSkpOwotCXR3b1Byb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDIpKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0Jc3dpdGNoKGFuSW50ZWdlci5pbnRWYWx1ZSgpKSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFuSW50ZWdlcik7Ci0JfQotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBJbnRlZ2VyIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYW4gSW50ZWdlci4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUludGVnZXJCZWFuUHJveHkoKEludGVnZXIpIGFOdW1iZXIpOwotfQkKLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUludGVnZXJCZWFuUHJveHkobmV3IEludGVnZXIodmFsdWUuYW5JbnQpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGRjYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJSW50ZWdlckJlYW5Qcm94eSBmb3IgdGhlIHByaW1pdGl2ZSAiaW50Ii4KLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWNsYXNzIFJFTUludGVnZXJUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJSW50ZWdlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgZkludDsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUludGVnZXJUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgaW50IGFuSW50KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmSW50ID0gYW5JbnQ7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmSW50ID09ICgoUkVNSW50ZWdlclR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5pbnRWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCXJldHVybiBmSW50ID09ICgoSW50ZWdlcikgYW5PYmplY3QpLmludFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUludGVnZXJUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkludCA9PSAoKFJFTUludGVnZXJUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5pbnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZJbnQ7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmSW50OwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZkludDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkludDsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZJbnQ7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBuZXcgSW50ZWdlcihmSW50KTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkludDsKLX0KLQotLyoqCi0gKiBUaGUgYmVhbidzIHRvU3RyaW5nLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkludCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmludFR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZJbnQpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM1ZTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBJbnRlZ2VyLlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1JbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1JbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX1RZUEUpLCBJbnRlZ2VyLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAzKTsKLQkJCi19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUgdG8gc2VlIGlmIHRoZSB2YWx1ZSBpcyBiZWluZyBoZWxkIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUKLSAqLwotSUludGVnZXJCZWFuUHJveHkgY3JlYXRlSW50ZWdlckJlYW5Qcm94eShpbnQgYW5JbnQpIHsKLQotCXN3aXRjaChhbkludCkgewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFuSW50KTsKLQl9Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm9Qcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KHZhbHVlLmFuSW50KTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoaW50KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBpbnQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWludCBhbkludDsKLQlpZiAodHJpbS5zdGFydHNXaXRoKCIoaW50KSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyIHYgPSBwYXJzZVN0cmluZyh0cmltLnN1YnN0cmluZygiKGludCkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhbkludCA9IHYuaW50VmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhbkludCA9IEludGVnZXIuZGVjb2RlKHRyaW0pLmludFZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBpbnQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYW5JbnQpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOGVkNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBEZWZhdWx0IGJlYW50eXBlIHByb3h5IGZvciBhbiBpbnRlcmZhY2UuCi0gKi8KLQotcHVibGljIGNsYXNzIFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIG51bGwpOwotCX0KLQkKLQkvKiogCi0JICogSW50ZXJmYWNlcyBhcmUgaW50ZXJmYWNlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIGludGVyZmFjZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBpbnRlcmZhY2UgdHlwZXMsIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSBmb3Igc3ViY2xhc3NlcyBzaW5jZQotCSAqIGludGVyZmFjZSBhcmVuJ3Qgc3ViY2xhc3NhYmxlLCBvbmx5IGV4dGVuZGFibGUuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RhY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgaW50ZXJmYWNlcyBjYW4gbmV2ZXIgYmUgZG9uZSwKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpIGlzIHZhbGlkIGJlY2F1c2UgaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlCi0JICogYW4gaW5zdGFuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS4KLQkgKi8KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnZva2FibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW52b2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDUxNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnZva2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUludm9rYWJsZTsKLSAKLQotLyoqCi0gKiBSZW1vdGUgSW52b2thYmxlLiBUaGlzIGludm9rZXMgb24gdGhlIHJlbW90ZSB2bSwgYnV0IGl0IGRvZXNuJ3QgdXNlIGEgbWV0aG9kIHByb3h5LiBJbnN0ZWFkCi0gKiBpdCBzZW5kcyB0aGUgaW5mb3JtYXRpb24gdG8gZ2V0IHRoZSBtZXRob2QgdG8gdGhlIHJlbW90ZSB2bSBhbG9uZyB3aXRoIHRoZSBwYXJtcy4gVGhhdCB3YXkKLSAqIGl0IHdpbGwgZG8gdGhlIGxvb2t1cCBvbiB0aGUgcmVtb3RlIHZtIGFuZCB3ZSBkb24ndCBoYXZlIHRoZSBvdmVyaGVhZCBvZiB0d28gY2FsbHMsIG9uZSB0bwotICogZ2V0IHRoZSBtZXRob2Rwcm94eSBhbmQgdGhlIG90aGVyIHRvIGFjdHVhbGx5IGRvIHRoZSBpbnZva2UuIFRoaXMgc2hvdWxkIHR5cGljYWxseSBiZSB1c2VkCi0gKiBvbmx5IGZvciBpbmZyZXF1ZW50IGNhbGxzIHNvIHRoYXQgY2FjaGUgb2YgdGhlIG1ldGhvZCBwcm94eSBpcyBub3QgbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotY2xhc3MgUkVNSW52b2thYmxlIGltcGxlbWVudHMgSUludm9rYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGU7CS8vIEJlYW50eXBlIHRvIGdldCBtZXRob2QgZnJvbS4KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CS8vIE1ldGhvZCBuYW1lCi0JcHJvdGVjdGVkIGZpbmFsIElCZWFuVHlwZVByb3h5W10gbWV0aG9kQXJnVHlwZXM7CS8vIEFyZ3VtZW50IHR5cGVzIChvciBudWxsIGlmIG5vIGFyZ3VtZW50cykuCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3Rvcnk7CS8vIEZhY3RvcnkgZm9yIHRoaXMgaW52b2thYmxlCi0JCi0JCi0JUkVNSW52b2thYmxlKElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBtZXRob2RBcmdUeXBlcykgewotCQl0aGlzLmJlYW5UeXBlID0gYmVhblR5cGU7Ci0JCXRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCXRoaXMubWV0aG9kQXJnVHlwZXMgPSBtZXRob2RBcmdUeXBlczsKLQkJdGhpcy5mYWN0b3J5ID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBiZWFuVHlwZS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpOwotCX0KLQkKLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIChJQmVhblByb3h5W10pIG51bGwpOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBwYXJtcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZVdpdGhQYXJtcyhzdWJqZWN0LCBwYXJtcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGludGVybmFsIG1ldGhvZCB0aGF0IGFsbG93cyBtaXh0dXJlIG9mIGNvbnN0YW50cyAoZS5nLiBTdHJpbmcpIHdpdGggYmVhbiBwcm94aWVzLgotCSAqIEEgcGFybSB2YWx1ZSBjYW4gYmUgYSBSRU1NZXRob2RQcm94eS5QYXJtQXJyYXkuIFRoaXMgbWVhbnMgdGhpcyBwYXJtIGlzIGFuIGFycmF5IHRoYXQKLQkgKiBuZWVkcyB0byBoYXZlIGEgVmFsdWVSZXRyaWV2ZXIgY3JlYXRlZCBmb3IgaXQuIFRoaXMgaXMgdXNlZCBpZiB0aGUgYXJyYXkgaGFzIElEJ3MgaW4KLQkgKiBpdCBhbmQgaXMgbm90IGFuIGV4aXN0aW5nIGFycmF5IG9uIHRoZSBzZXJ2ZXIgb3IgYWxsIGNvbnN0YW50IHZhbHVlcy4KLQkgKgotCSAqIE5PVEU6IEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgSUJlYW5UeXBlUHJveGllcyBvZiB0aGUgcGFybXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqICAgICAgIEl0IHNob3VsZCBzdGlsbCB3b3JrLCBidXQgaXQgY291bGQgYmUgYXNraW5nIGZvciB0aGVtIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlcXVlc3QKLQkgKiAgICAgICBpZiB0aGV5IGFyZSBub3QgZmlyc3QgZ290dG9uLgotCSAqCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlV2l0aFBhcm1zKElCZWFuUHJveHkgc3ViamVjdCwgZmluYWwgT2JqZWN0W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJcHJveHlGYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsgLy8gVGhpcyBpcyBkZWZpbmF0ZWx5IGEgdHJhbnNhY3Rpb24sIHNvIHN0YXJ0IGl0LgotCQl0cnkgewotCQkJLy8gRmlyc3QgbmVlZCB0byBzZW5kIHRoZSBtZXRob2QgaW5mby4KLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IGNsYXNzVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCWJlYW5UeXBlLnJlbmRlckJlYW4oY2xhc3NWYWx1ZSk7Ci0JCQkKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1UeXBlc1ZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQlpZiAobWV0aG9kQXJnVHlwZXMgIT0gbnVsbCkgewotCQkJCWNsYXNzIFJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlPYmplY3RbXSBhcnJheTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQkJCQlhcnJheSA9IGFuQXJyYXk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJCQkJT2JqZWN0IHBhcm0gPSBhcnJheVtpbmRleCsrXTsKLQkJCQkJCSgoSVJFTUJlYW5UeXBlUHJveHkpIHBhcm0pLnJlbmRlckJlYW4od29ya2VyKTsKLQkJCQkJCXJldHVybiB3b3JrZXI7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJcGFybVR5cGVzVmFsdWUuc2V0QXJyYXlJRFMobmV3IFJldHJpZXZlcihtZXRob2RBcmdUeXBlcyksIG1ldGhvZEFyZ1R5cGVzLmxlbmd0aCwgQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpOyAvLyBDcmVhdGUgQ2xhc3NbXS4KLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBOb3cgd2Ugc3RhcnQgYnVpbGRpbmcgdGhlIGFjdHVhbCBpbnZvY2F0aW9uLgotCQkJCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBzdWJqZWN0VmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCWlmIChzdWJqZWN0ICE9IG51bGwpCi0JCQkJICgoSVJFTUJlYW5Qcm94eSkgc3ViamVjdCkucmVuZGVyQmVhbihzdWJqZWN0VmFsdWUpOwotCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtc1ZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCWlmIChwYXJtcyAhPSBudWxsKSB7Ci0JCQkJLy8gSGF2ZSBhIGxvY2FsIGRlZmluaXRpb24gb2YgdGhlIHJldHJpZXZlciBzbyB0aGF0IHRoZSByZXRyaWV2ZXIgY2FuIGNyZWF0ZQotCQkJCS8vIGFub3RoZXIgb25lIG9mIGl0c2VsZiBpZiBuZWNlc3NhcnkuCi0JCQkJZmluYWwgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0KLQkJCQljbGFzcyBSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJT2JqZWN0W10gYXJyYXk7Ci0JCQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlciA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCi0JCQkJCXB1YmxpYyBSZXRyaWV2ZXIoT2JqZWN0W10gYW5BcnJheSkgewotCQkJCQkJYXJyYXkgPSBhbkFycmF5OwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQkJCU9iamVjdCBwYXJtID0gYXJyYXlbaW5kZXgrK107Ci0JCQkJCQlpZiAocGFybSAhPSBudWxsKQotCQkJCQkJCWlmIChwYXJtIGluc3RhbmNlb2YgSVJFTUJlYW5Qcm94eSkKLQkJCQkJCQkJICgoSVJFTUJlYW5Qcm94eSkgcGFybSkucmVuZGVyQmVhbih3b3JrZXIpOwotCQkJCQkJCWVsc2UgaWYgKHBhcm0gaW5zdGFuY2VvZiBUcmFuc21pdGFibGVBcnJheSkgewotCQkJCQkJCQkvLyBJdCBpcyBhbm90aGVyIGFycmF5LCBjcmVhdGUgYSBuZXcgcmV0cmlldmVyLgotCQkJCQkJCQl3b3JrZXIuc2V0QXJyYXlJRFMoCi0JCQkJCQkJCQluZXcgUmV0cmlldmVyKCgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmFycmF5KSwKLQkJCQkJCQkJCSgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmFycmF5Lmxlbmd0aCwKLQkJCQkJCQkJCSgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmNvbXBvbmVudFR5cGVJRCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSXQncyBhbiBvYmplY3QuIE5lZWQgdG8gZ2V0IGJlYW4gdHlwZSBzbyB0aGF0IHdlIGNhbiBzZW5kIGl0LgotCQkJCQkJCQlJUkVNQmVhblByb3h5IHR5cGUgPSAoSVJFTUJlYW5Qcm94eSkgdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJtLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJCQkJaW50IGNsYXNzSUQgPSB0eXBlLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCQkJCQkJd29ya2VyLnNldEFzT2JqZWN0KHBhcm0sIGNsYXNzSUQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQl3b3JrZXIuc2V0KCk7Ci0JCQkJCQlyZXR1cm4gd29ya2VyOyAKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlwYXJtc1ZhbHVlLnNldEFycmF5SURTKG5ldyBSZXRyaWV2ZXIocGFybXMpLCBwYXJtcy5sZW5ndGgsIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7IC8vIENyZWF0ZSBPYmplY3RbXS4KLQkJCX0KLQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXRyeSB7Ci0JCQkJaW52b2tlKGNvbm5lY3QsIHByb3h5RmFjdG9yeSwgY2xhc3NWYWx1ZSwgcGFybVR5cGVzVmFsdWUsIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQkJCXJldHVybiBwcm94eUZhY3RvcnkuZ2V0QmVhblByb3h5KHJldHVyblZhbHVlKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4KLQkJCQkJZmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCQljb25uZWN0ID0gZmFjdG9yeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJaW52b2tlKGNvbm5lY3QsIHByb3h5RmFjdG9yeSwgY2xhc3NWYWx1ZSwgcGFybVR5cGVzVmFsdWUsIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQkJCQkJcmV0dXJuIHByb3h5RmFjdG9yeS5nZXRCZWFuUHJveHkocmV0dXJuVmFsdWUpOwotCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCQkJLy8gRmFpbGVkIGFnYWluLiBKdXN0IGNsb3NlIGFuZCBwcmludCB0cmFjZS4KLQkJCQkJCWZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZUFnYWluKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQSByZWNvdmVyYWJsZSBlcnJvciwgcHJpbnQgdHJhY2UgYW5kIHJldHVybgotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3h5RmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZmFjdG9yeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JfQotCi1wcml2YXRlIHZvaWQgaW52b2tlKAotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0LAotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5LAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBjbGFzc1R5cGVWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybVR5cGVzVmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHN1YmplY3RWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybXNWYWx1ZSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpCi0JCXRocm93cyBUaHJvd2FibGVQcm94eSwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljb25uZWN0Lmludm9rZU1ldGhvZChjbGFzc1R5cGVWYWx1ZSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzVmFsdWUsIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJcHJveHlGYWN0b3J5LnByb2Nlc3NFcnJvclJldHVybihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgcGFybSkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBuZXcgSUJlYW5Qcm94eVtdIHsgcGFybSB9KTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBwYXJtcykgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSBwYXJtKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIHBhcm0pOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjQxYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgTG9uZy5jbGFzcy4KLSAqLwotY2xhc3MgUkVNTG9uZ0NsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNTG9uZ0NsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTG9uZyBhTG9uZykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUxvbmcpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5sb25nQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChMb25nKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTU1NmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IExvbmcuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Mb25nQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSwgTG9uZy5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygwKSk7CQotCW9uZVByb3h5ID0gbmV3IFJFTUxvbmdDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBMb25nKDEpKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygyKSk7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygzKSk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlTG9uZ0JlYW5Qcm94eShMb25nIGFMb25nKSB7Ci0JaWYgKGFMb25nLmxvbmdWYWx1ZSgpID49IDAgJiYgYUxvbmcubG9uZ1ZhbHVlKCkgPCA0KSB7Ci0JCS8vIFN3aXRjaCBzdGF0ZW1lbnRzIGRvbid0IHdvcmsgd2l0aCBsb25ncy4KLQkJc3dpdGNoKGFMb25nLmludFZhbHVlKCkpIHsKLQkJCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQl9Ci0JfSAKLQlyZXR1cm4gbmV3IFJFTUxvbmdDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFMb25nKTsKLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYSBMb25nIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYSBMb25nLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlTG9uZ0JlYW5Qcm94eSgoTG9uZykgYU51bWJlcik7Ci19CQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlTG9uZ0JlYW5Qcm94eShuZXcgTG9uZyh2YWx1ZS5hTG9uZykpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZDgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIHRoZSBwcmltaXRpdmUgImxvbmciLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNTG9uZ1R5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgbG9uZyBmTG9uZzsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUxvbmdUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgbG9uZyBhTG9uZykgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkxvbmcgPSBhTG9uZzsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1Mb25nVHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZMb25nID09ICgoUkVNTG9uZ1R5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5sb25nVmFsdWUoKTsKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBMb25nKQotCQlyZXR1cm4gZkxvbmcgPT0gKChMb25nKSBhbk9iamVjdCkubG9uZ1ZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUxvbmdUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkxvbmcgPT0gKChSRU1Mb25nVHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkubG9uZ1ZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZMb25nOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkxvbmc7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmTG9uZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gKGludCkgZkxvbmc7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmTG9uZzsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBMb25nKGZMb25nKTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkxvbmc7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZMb25nKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkubG9uZ1R5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZMb25nKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1NzQwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgTG9uZy5UWVBFLwotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX1RZUEUpLCBMb25nLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1Mb25nVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAzKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVMb25nQmVhblByb3h5KGxvbmcgYUxvbmcpIHsKLQlpZiAoYUxvbmcgPj0gMCAmJiBhTG9uZyA8IDQpIHsKLQkJLy8gU3dpdGNoIHN0YXRlbWVudHMgZG9uJ3Qgd29yayB3aXRoIGxvbmdzLgotCQlzd2l0Y2goKGludCkgYUxvbmcpIHsKLQkJCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQl9Ci0JfSAKLQlyZXR1cm4gbmV3IFJFTUxvbmdUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYUxvbmcpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gbG9uZyBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19CQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUxvbmdCZWFuUHJveHkodmFsdWUuYUxvbmcpOwotfQotCi0vKioKLSAqIFNob3J0IGN1dCBmb3IgbmV3SW5zdGFuY2Ugd2hlcmUgdGhlIHN0cmluZyBmb2xsb3dzIHRoZQotICogc3BlY2lmaWMgcGF0dGVybiB3ZSBleHBlY3QuIFRoYXQgd2F5IGl0IHdvbid0IGJlIG5lY2Vzc2FyeSB0byBzaGlwIG92ZXIgdG8gdGhlIHZtIAotICogdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGUgcGF0dGVybiBpdCBjYW4gYWNjZXB0IGlzOgotICogCTEpIChsb25nKSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBsb25nIHRvIGRldGVybWluZSB0aGUgdmFsaWQgbnVtYmVyLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQlTdHJpbmcgdHJpbSA9IGluaXRpYWxpemF0aW9uU3RyaW5nLnRyaW0oKTsKLQlpZiAodHJpbS5sZW5ndGgoKSA9PSAwKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCWxvbmcgYUxvbmc7Ci0JaWYgKHRyaW0uc3RhcnRzV2l0aCgiKGxvbmcpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIobG9uZykiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhTG9uZyA9IHYubG9uZ1ZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQlpZiAodHJpbS5jaGFyQXQodHJpbS5sZW5ndGgoKS0xKSA9PSAnTCcgfHwgdHJpbS5jaGFyQXQodHJpbS5sZW5ndGgoKS0xKSA9PSAnbCcpCi0JCQl0cmltID0gdHJpbS5zdWJzdHJpbmcoMCwgdHJpbS5sZW5ndGgoKS0xKTsKLQkJdHJ5IHsKLQkJCWFMb25nID0gTG9uZy5kZWNvZGUodHJpbSkubG9uZ1ZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBsb25nIGZvcm1hdC4KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGFMb25nKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWFzdGVyU2VydmVyVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1hc3RlclNlcnZlclRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTcwMzg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWFzdGVyU2VydmVyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBNYXN0ZXIgU2VydmVyIHRocmVhZCBmb3IgdGhlIFJlbW90ZSBWTXMuCi0gKiAKLSAqIEl0IHJlc3BvbmRzIHRvIHRoZSByZW1vdGUgdm0gcmVxdWVzdHMgdG8gdGhpcyBJREUuCi0gKiAKLSAqIEl0IGlzIHBhY2thZ2UtcHJvdGVjdGVkIGJlY2F1c2Ugb25seSBQcm94eVJlbW90ZVBsdWd1aW4gc2hvdWxkIGFjY2VzcyBpdC4KLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqLwotY2xhc3MgUkVNTWFzdGVyU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkKLQlwcm90ZWN0ZWQgU2VydmVyU29ja2V0IG1hc3RlclNlcnZlclNvY2tldDsKLQlwcm90ZWN0ZWQgUkVNUmVnaXN0cnlDb250cm9sbGVyIHJlZ2lzdHJ5Q29udHJvbGxlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBmYWxzZTsKLQkKLQkvLyBLbHVkZ2U6IEJ1ZyBpbiBMaW51eCAxLjMueHh4IG9mIEpWTS4gQ2xvc2luZyBhIHNvY2tldCB3aGlsZSB0aGUgc29ja2V0IGlzIGJlaW5nIHJlYWQvYWNjZXB0IHdpbGwgbm90IGludGVycnVwdCB0aGUKLQkvLyB3YWl0LiBOZWVkIHRvIHRpbWVvdXQgdG8gdGhlIHNvY2tldCByZWFkL2FjY2VwdCBiZWZvcmUgdGhlIHNvY2tldCBjbG9zZSB3aWxsIGJlIG5vdGljZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQKLQkvLyBpbiBMaW51eCAxLjQuIFNvIG9uIExpbnV4IDEuMyBuZWVkIHRvIHB1dCB0aW1lb3V0cyBpbiBvbiB0aG9zZSBzb2NrZXRzIHRoYXQgY2FuIGJlIHNlcGFyYXRlbHkgY2xvc2VkIHdoaWxlIHJlYWRpbmcvYWNjZXB0aW5nLgotCXN0YXRpYyBib29sZWFuIExJTlVYXzFfMyA9ICJsaW51eCIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjMiKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQotCQotCXB1YmxpYyBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQoUkVNUmVnaXN0cnlDb250cm9sbGVyIHJlZ2lzdHJ5Q29udHJvbGxlcikgewotCQlzdXBlcigiUmVtb3RlIFByb3h5IE1hc3RlciBTZXJ2ZXIgVGhyZWFkIik7CS8vJE5PTi1OTFMtMSQKLQkJdGhpcy5yZWdpc3RyeUNvbnRyb2xsZXIgPSByZWdpc3RyeUNvbnRyb2xsZXI7Ci0JCQotCQl0cnkgewotCQkJbWFzdGVyU2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCA1MCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKSk7CS8vIEFueSBhdmFpbGFibGUgcG9ydCAvLyROT04tTkxTLTEkCi0JCQlpZiAoTElOVVhfMV8zKQotCQkJCW1hc3RlclNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQoMTAwMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBjb21tZW50IG9uIExJTlVYXzFfMwotCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7CS8vIFRoaXMgaXMgYmFkLiBTaG91bGQgYmUgbm8gZXhjZXB0aW9ucyBjcmVhdGluZyBhIHNvY2tldC4gLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CQkJCQotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7CS8vIFRoaXMgaXMgYmFkLiBTaG91bGQgYmUgbm8gZXhjZXB0aW9ucyBjcmVhdGluZyBhIHNvY2tldC4gLy8kTk9OLU5MUy0xJAotCQl9CQkJCi0JfQotCi0JcHVibGljIFNlcnZlclNvY2tldCBnZXRNYXN0ZXJTb2NrZXQoKSB7Ci0JCXJldHVybiBtYXN0ZXJTZXJ2ZXJTb2NrZXQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCXdoaWxlIChtYXN0ZXJTZXJ2ZXJTb2NrZXQgIT0gbnVsbCkgewotCQkJCVNvY2tldCBpbmNvbWluZyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5jb21pbmcgPSBtYXN0ZXJTZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOyAvLyBUaW1lb3V0LCB0cnkgYWdhaW4KLQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwkvLyBJbiBMaW51eCAxLjMgY2FzZSBtYXN0ZXJTZXJ2ZXJTb2NrZXQgY291bGQgb2YgZ29uZSBudWxsIGJldHdlZW4gbG9vcCB0ZXN0IGFuZCB0cnkgYmxvY2suCi0JCQkJfQotCQkJCWJvb2xlYW4gY2xvc2UgPSBmYWxzZTsJLy8gcHJvY2VzcyByZXF1ZXN0IHdpbGwgdGVsbCBpZiBzb2NrZXQgc2hvdWxkIGJlIGNsb3NlZC4gaXQgbWF5IGJlIHBhc3NlZCBvbnRvIGNhbGxiYWNrIHRocmVhZCBpbnN0ZWFkLgotCQkJCXRyeSB7Ci0JCQkJCWNsb3NlID0gcHJvY2Vzc1JlcXVlc3QoaW5jb21pbmcpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChjbG9zZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCWluY29taW5nLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLX0KLQkJCQlpbmNvbWluZyA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIXNodXR0aW5nRG93bikKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlzaHV0ZG93bigpOwkvLyBFaXRoZXIgYSBiYWQgZXhjZXB0aW9uIG9yIHdlIHdlcmUgY2xvc2VkLiBFaXRoZXIgd2F5IGlzIHNodXRkb3duLgotCX0KLQkKLQkvKioKLQkgKiBVc2UgdGhpcyB0byByZXF1ZXN0IGEgc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdFNodXRkb3duKCkgewkJCi0JCWlmIChtYXN0ZXJTZXJ2ZXJTb2NrZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gQ2xvc2luZyB0aGUgc2VydmVyIHNvY2tldCBzaG91bGQgY2F1c2UgYSBicmVhay4KLQkJdHJ5IHsKLQkJCXNodXR0aW5nRG93biA9IHRydWU7Ci0JCQltYXN0ZXJTZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm47Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdChTb2NrZXQgcmVtb3RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhSW5wdXRTdHJlYW0JaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJlbW90ZS5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShyZW1vdGUuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQlib29sZWFuICBjbG9zZSA9IHRydWU7CS8vIGZsYWcgaW5kaWNhdGluZyBzb2NrZXQgbm90IGdpdmVuIG92ZXIgdG8gY2FsbGJhY2suIERvbid0IGNsb3NlIHRoZSBzb2NrZXQgd2hlbiBkb25lIGJlY2F1c2UgY2FsbGJhY2sgaGFzIGl0LgotCQl0cnkgewotCQkJYnl0ZSBjbWQgPSBpbi5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoIChjbWQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkFMSVZFOgotCQkJCQlpbnQgcmVnaXN0cnlJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJb3V0LndyaXRlQm9vbGVhbihyZWdpc3RyeUNvbnRyb2xsZXIuZ2V0UmVnaXN0cnkobmV3IEludGVnZXIocmVnaXN0cnlJRCkpICE9IG51bGwpOwkvLyBSZXR1cm4gaWYgcmVnaXN0cnkgc3RpbGwgYWxpdmUKLQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIENvbW1hbmRzLlJFTU9URV9TVEFSVEVEOgotCQkJCQlyZWdpc3RyeUlEID0gaW4ucmVhZEludCgpOwotCQkJCQlpbnQgcmVtb3RlU2VydmVyUG9ydCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSByZWdpc3RyeUNvbnRyb2xsZXIuZ2V0UmVnaXN0cnkobmV3IEludGVnZXIocmVnaXN0cnlJRCkpOwotCQkJCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0cnkuc2V0U2VydmVyUG9ydChyZW1vdGVTZXJ2ZXJQb3J0KTsKLQkJCQkJCW91dC53cml0ZUJvb2xlYW4odHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7CS8vIE5vIHJlZ2lzdHJ5Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBDb21tYW5kcy5BVFRBQ0hfQ0FMTEJBQ0s6Ci0JCQkJCXJlZ2lzdHJ5SUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXJlZ2lzdHJ5ID0gcmVnaXN0cnlDb250cm9sbGVyLmdldFJlZ2lzdHJ5KG5ldyBJbnRlZ2VyKHJlZ2lzdHJ5SUQpKTsKLQkJCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQkJCWNsb3NlID0gISgoUkVNQ2FsbGJhY2tSZWdpc3RyeSkgcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpKS5jcmVhdGVDYWxsYmFjayhyZW1vdGUpOwkvLyBjbG9zZSBpZiBmYWlsZWQsIGRvbid0IGNsb3NlIGlmIGdvb2QuCi0JCQkJCQlvdXQud3JpdGVCb29sZWFuKCFjbG9zZSk7CS8vIGlmIG5vdCBjbG9zZSwgdGhlbiByZXR1cm4gaXQgd29ya2VkLgotCQkJCQl9IGVsc2UKLQkJCQkJCW91dC53cml0ZUJvb2xlYW4oZmFsc2UpOwotCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJIC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbG9zZSkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9zZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNodXRkb3duKCkgewotCQlyZXF1ZXN0U2h1dGRvd24oKTsKLQkJbWFzdGVyU2VydmVyU29ja2V0ID0gbnVsbDsJCQotCX0JCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFhOTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBWTSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0aG9kUHJveHkKLSAqLwotCi1maW5hbCBjbGFzcyBSRU1NZXRob2RQcm94eSBleHRlbmRzIFJFTUFjY2Vzc2libGVPYmplY3RQcm94eSBpbXBsZW1lbnRzIElSRU1NZXRob2RQcm94eSB7Ci0KLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZEZWNsYXJpbmdUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZNZXRob2ROYW1lOwotCXByaXZhdGUgSUJlYW5UeXBlUHJveHlbXSBmUGFyYW1ldGVyVHlwZXM7Ci0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eSBmUmV0dXJuVHlwZTsKLQotCVJFTU1ldGhvZFByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklEKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCk7Ci0JfQotCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENsYXNzVHlwZSgpIHsKLQkJaWYgKGZEZWNsYXJpbmdUeXBlID09IG51bGwpCi0JCQlmRGVjbGFyaW5nVHlwZSA9Ci0JCQkJKElCZWFuVHlwZVByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cwotCQkJCQkuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KQotCQkJCQkuZ2V0TWV0aG9kRGVjbGFyaW5nQ2xhc3NNZXNzYWdlKCkKLQkJCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQkJdGhpcyk7Ci0JCXJldHVybiBmRGVjbGFyaW5nVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChmTWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0JCQlJU3RyaW5nQmVhblByb3h5IHByb3h5ID0KLQkJCQkoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMKLQkJCQkJLmdldENvbnN0YW50cyhmRmFjdG9yeSkKLQkJCQkJLmdldE1ldGhvZE1ldGhvZE5hbWVNZXNzYWdlKCkKLQkJCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQkJdGhpcyk7Ci0JCQlpZiAocHJveHkgIT0gbnVsbCkKLQkJCQlmTWV0aG9kTmFtZSA9IHByb3h5LnN0cmluZ1ZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJZk1ldGhvZE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmTWV0aG9kTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElCZWFuVHlwZVByb3h5W10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCWlmIChmUGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgewotCQkJSUFycmF5QmVhblByb3h5IHBhcm1UeXBlcyA9IChJQXJyYXlCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkKLQkJCQkJLmdldE1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzKTsKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCkKLQkJCQlmUGFyYW1ldGVyVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbMF07IC8vIFRoZXJlIHdhcyBzb21lIGVycm9yLCBvbmx5IHdheSBudWxsIGlzIHJldHVybmVkCi0JCQllbHNlIHsKLQkJCQlpbnQgbGVuID0gcGFybVR5cGVzLmdldExlbmd0aCgpOwotCQkJCWZQYXJhbWV0ZXJUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtsZW5dOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJCXRyeSB7Ci0JCQkJCQlmUGFyYW1ldGVyVHlwZXNbaV0gPSAoSUJlYW5UeXBlUHJveHkpIHBhcm1UeXBlcy5nZXQoaSk7Ci0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCQkJfQotCQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShwYXJtVHlwZXMpOyAvLyBEb24ndCBuZWVkIHRoZSBhcnJheSBvbiB0aGUgc2VydmVyIGFueW1vcmUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlBhcmFtZXRlclR5cGVzOwotCX0KLQotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRSZXR1cm5UeXBlKCkgewotCQlpZiAoZlJldHVyblR5cGUgPT0gbnVsbCkKLQkJCWZSZXR1cm5UeXBlID0KLQkJCQkoSUJlYW5UeXBlUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzCi0JCQkJCS5nZXRDb25zdGFudHMoZkZhY3RvcnkpCi0JCQkJCS5nZXRNZXRob2RSZXR1cm5UeXBlTWVzc2FnZSgpCi0JCQkJCS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQkJCXRoaXMpOwotCQlyZXR1cm4gZlJldHVyblR5cGU7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCAoSUJlYW5Qcm94eVtdKSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2VXaXRoUGFybXMoc3ViamVjdCwgcGFybXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnRlcm5hbCBtZXRob2QgdGhhdCBhbGxvd3MgbWl4dHVyZSBvZiBjb25zdGFudHMgKGUuZy4gU3RyaW5nKSB3aXRoIGJlYW4gcHJveGllcy4KLQkgKiBBIHBhcm0gdmFsdWUgY2FuIGJlIGEgUkVNTWV0aG9kUHJveHkuUGFybUFycmF5LiBUaGlzIG1lYW5zIHRoaXMgcGFybSBpcyBhbiBhcnJheSB0aGF0Ci0JICogbmVlZHMgdG8gaGF2ZSBhIFZhbHVlUmV0cmlldmVyIGNyZWF0ZWQgZm9yIGl0LiBUaGlzIGlzIHVzZWQgaWYgdGhlIGFycmF5IGhhcyBJRCdzIGluCi0JICogaXQgYW5kIGlzIG5vdCBhbiBleGlzdGluZyBhcnJheSBvbiB0aGUgc2VydmVyIG9yIGFsbCBjb25zdGFudCB2YWx1ZXMuCi0JICoKLQkgKiBOT1RFOiBJdCBpcyBhc3N1bWVkIHRoYXQgYWxsIElCZWFuVHlwZVByb3hpZXMgb2YgdGhlIHBhcm1zIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKiAgICAgICBJdCBzaG91bGQgc3RpbGwgd29yaywgYnV0IGl0IGNvdWxkIGJlIGFza2luZyBmb3IgdGhlbSBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXF1ZXN0Ci0JICogICAgICAgaWYgdGhleSBhcmUgbm90IGZpcnN0IGdvdHRvbi4KLQkgKgotCSAqIE5PVEU6IFRoaXMgaXMgaW4gSVJFTU1ldGhvZFByb3h5IG9ubHkgc28gdGhhdCBvdGhlciBSRU0gcHJveHkgaW1wbGVtZW50YXRpb25zIGNhbiBhY2Nlc3MgaXQuCi0JICovCi0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VXaXRoUGFybXMoSUJlYW5Qcm94eSBzdWJqZWN0LCBmaW5hbCBPYmplY3RbXSBwYXJtcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCA9IGZGYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCXByb3h5RmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7IC8vIFRoaXMgaXMgZGVmaW5hdGVseSBhIHRyYW5zYWN0aW9uLCBzbyBzdGFydCBpdC4KLQkJdHJ5IHsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHN1YmplY3RWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkKLQkJCQkgKChJUkVNQmVhblByb3h5KSBzdWJqZWN0KS5yZW5kZXJCZWFuKHN1YmplY3RWYWx1ZSk7Ci0KLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlPYmplY3RbXSBhcnJheTsKLQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0KLQkJCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCQkJYXJyYXkgPSBhbkFycmF5OwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJCQkJaW5kZXggPSAwOwotCQkJCX0KLQotCQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJCU9iamVjdCBwYXJtID0gYXJyYXlbaW5kZXgrK107Ci0JCQkJCWlmIChwYXJtICE9IG51bGwpCi0JCQkJCQlpZiAocGFybSBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJICgoSVJFTUJlYW5Qcm94eSkgcGFybSkucmVuZGVyQmVhbih3b3JrZXIpOwotCQkJCQkJZWxzZSBpZiAocGFybSBpbnN0YW5jZW9mIFRyYW5zbWl0YWJsZUFycmF5KSB7Ci0JCQkJCQkJLy8gSXQgaXMgYW5vdGhlciBhcnJheSwgY3JlYXRlIGEgbmV3IHJldHJpZXZlci4KLQkJCQkJCQl3b3JrZXIuc2V0QXJyYXlJRFMoCi0JCQkJCQkJCW5ldyBSZXRyaWV2ZXIoKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuYXJyYXkpLAotCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5hcnJheS5sZW5ndGgsCi0JCQkJCQkJCSgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmNvbXBvbmVudFR5cGVJRCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEl0J3MgYW4gb2JqZWN0LiBOZWVkIHRvIGdldCBiZWFuIHR5cGUgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdC4KLQkJCQkJCQlJUkVNQmVhblByb3h5IHR5cGUgPSAoSVJFTUJlYW5Qcm94eSkgdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJtLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQkJaW50IGNsYXNzSUQgPSB0eXBlLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCQkJCQl3b3JrZXIuc2V0QXNPYmplY3QocGFybSwgY2xhc3NJRCk7Ci0JCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXdvcmtlci5zZXQoKTsKLQkJCQkJcmV0dXJuIHdvcmtlcjsgCi0JCQkJfQotCQkJfTsKLQkJCQotCQkJUmV0cmlldmVyIHJldHJpZXZlciA9IG51bGw7Ci0KLQkJCWlmIChwYXJtcyAhPSBudWxsKSB7Ci0JCQkJLy8gSGF2ZSBhIGxvY2FsIGRlZmluaXRpb24gb2YgdGhlIHJldHJpZXZlciBzbyB0aGF0IHRoZSByZXRyaWV2ZXIgY2FuIGNyZWF0ZQotCQkJCS8vIGFub3RoZXIgb25lIG9mIGl0c2VsZiBpZiBuZWNlc3NhcnkuCi0JCQkJcGFybXNWYWx1ZS5zZXRBcnJheUlEUyhyZXRyaWV2ZXIgPSBuZXcgUmV0cmlldmVyKHBhcm1zKSwgcGFybXMubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOyAvLyBDcmVhdGUgT2JqZWN0W10uCi0JCQl9Ci0KLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQl0cnkgewotCQkJCWludm9rZShjb25uZWN0LCBwcm94eUZhY3RvcnksIHN1YmplY3RWYWx1ZSwgcGFybXNWYWx1ZSwgcmV0dXJuVmFsdWUpOwotCQkJCXJldHVybiBwcm94eUZhY3RvcnkuZ2V0QmVhblByb3h5KHJldHVyblZhbHVlKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4KLQkJCQkJZkZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJY29ubmVjdCA9IGZGYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocmV0cmlldmVyICE9IG51bGwpCi0JCQkJCQkJcmV0cmlldmVyLnJlc2V0KCk7Ci0JCQkJCQlpbnZva2UoY29ubmVjdCwgcHJveHlGYWN0b3J5LCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJCQkJCXJldHVybiBwcm94eUZhY3RvcnkuZ2V0QmVhblByb3h5KHJldHVyblZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gSnVzdCBjbG9zZSBhbmQgcHJpbnQgdHJhY2UuCi0JCQkJCQlmRmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlQWdhaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBIHJlY292ZXJhYmxlIGVycm9yLCBwcmludCB0cmFjZSBhbmQgcmV0dXJuCi0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJveHlGYWN0b3J5LnN0b3BUcmFuc2FjdGlvbigpOwotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmRmFjdG9yeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JfQotCi1wcml2YXRlIHZvaWQgaW52b2tlKAotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0LAotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5LAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBzdWJqZWN0VmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zVmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKQotCQl0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY29ubmVjdC5pbnZva2VNZXRob2QoZ2V0SUQoKS5pbnRWYWx1ZSgpLCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCXByb3h5RmFjdG9yeS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IHBhcm0pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2Uoc3ViamVjdCwgbmV3IElCZWFuUHJveHlbXSB7IHBhcm0gfSk7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIHBhcm1zKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIHBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSBwYXJtKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIHBhcm0pOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBwcm94eSBpcyBjb25zdGFudCBwcm94eSBvdXQgb2YgdGhlIG1ldGhvZCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLm1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJlYW4gaXMgYmVpbmcgcmVsZWFzZWQsIGNsZWFyIG91dCB0aGUgZmllbGRzIHNvIHRoZXkgY2FuIGJlIEdDJ2QgaWYgbmVjZXNzYXJ5LgotCSAqIFVzdWFsbHkgb25seSBiaWcgb2JqZWN0cyBhbmQgcHJveHkgZmllbGRzIG5lZWQgdG8gYmUgY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmRGVjbGFyaW5nVHlwZSA9IG51bGw7Ci0JCWZQYXJhbWV0ZXJUeXBlcyA9IG51bGw7Ci0JCWZSZXR1cm5UeXBlID0gbnVsbDsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjYwYzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuVHJhbnNtaXRhYmxlQXJyYXk7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgbWV0aG9kIHByb3hpZXMuIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDY6Mjk6NDAgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1NZXRob2RQcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJTWV0aG9kUHJveHlGYWN0b3J5IHsKLQotCWZpbmFsIHByb3RlY3RlZCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBtZXRob2QgdHlwZSBwcm94aWVzLgotCUlSRU1CZWFuVHlwZVByb3h5IGFjY2Vzc2libGVUeXBlOwotCi0JUkVNTWV0aG9kVHlwZVByb3h5IG1ldGhvZFR5cGU7Ci0KLQlSRU1GaWVsZFR5cGVQcm94eSBmaWVsZFR5cGU7Ci0KLQlSRU1Db25zdHJ1Y3RvclR5cGVQcm94eSBjdG9yVHlwZTsKLQotCVJFTU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5OwotCi0JUkVNTWV0aG9kUHJveHlGYWN0b3J5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmRmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlhUmVnaXN0cnkucmVnaXN0ZXJNZXRob2RQcm94eUZhY3RvcnkodGhpcyk7Ci0JCVJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0KLQkJYWNjZXNzaWJsZVR5cGUgPSB0eXBlRmFjdG9yeS5vYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLkFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MpLCBBY2Nlc3NpYmxlT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwKLQkJCQlmYWxzZSk7Ci0JCW1ldGhvZFR5cGUgPSBuZXcgUkVNTWV0aG9kVHlwZVByb3h5KGFSZWdpc3RyeSwgYWNjZXNzaWJsZVR5cGUpOwotCQlmaWVsZFR5cGUgPSBuZXcgUkVNRmllbGRUeXBlUHJveHkoYVJlZ2lzdHJ5LCBhY2Nlc3NpYmxlVHlwZSk7Ci0JCWN0b3JUeXBlID0gbmV3IFJFTUNvbnN0cnVjdG9yVHlwZVByb3h5KGFSZWdpc3RyeSwgYWNjZXNzaWJsZVR5cGUpOwotCQlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoYWNjZXNzaWJsZVR5cGUsIHRydWUpOwotCQlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkobWV0aG9kVHlwZSwgdHJ1ZSk7Ci0JCWFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShmaWVsZFR5cGUsIHRydWUpOwotCQlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoY3RvclR5cGUsIHRydWUpOwotCi0JCWdldE1ldGhvZFByb3h5ID0gKFJFTU1ldGhvZFByb3h5KSBtZXRob2RUeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcihDb21tYW5kcy5HRVRfTUVUSE9EX0lEKSk7Ci0JCSgoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5yZWdpc3RlclByb3h5KGdldE1ldGhvZFByb3h5KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlCZWFuVHlwZVByb3h5IGNsc1Byb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShjbGFzc05hbWUpOwotCQlpZiAoY2xzUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBUaGlzIHdpbGwgcmVkaXJlY3QgdG8gdGhlIGJlYW50eXBlLCB3aGljaCB3aWxsIGdvIHRocm91Z2ggdGhlIG1ldGhvZCBjYWNoZS4KLQkJcmV0dXJuIGNsc1Byb3h5LmdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGUgZXhwcmVzc2lvbi4gVGhpcyBpcyB1c2VkIGJ5IHJlZ2lzdHJpZXMgYW5kIGJlYW50eXBlIHByb3hpZXMuIEl0IHdpbGwgZ28gdGhyb3VnaAotCSAqIHRoZSBtZXRob2QgY2FjaGUgdG8gbWFrZSBzdXJlIHdlIGdldCBvbmx5IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcm1UeXBlcwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMpewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIGFCZWFuVHlwZVByb3h5LCBtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBBIGhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBmaWVsZCBwcm94eSBmb3IgdGhlIGV4cHJlc3Npb24uIFRoaXMgaXMgdXNlZCBieSByZWdpc3RyaWVzIGFuZCBiZWFudHlwZSBwcm94aWVzLiBJdCB3aWxsIGdvIHRocm91Z2gKLQkgKiB0aGUgbWV0aG9kIGNhY2hlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgb25seSBvbmUuCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgZmllbGROYW1lKXsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIGFCZWFuVHlwZVByb3h5LCBmaWVsZE5hbWUpOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0RmllbGRQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBjbGFzcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgaXQgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgaXQgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgY2xhc3NOYW1lKTsKLQkJcmV0dXJuIGJlYW5UeXBlLmdldEZpZWxkUHJveHkoZXhwcmVzc2lvbiwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBjbGFzcyBhbmQgcGFybXR5cGVzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSB0aGV5IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIHRoZXkgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgY2xhc3NOYW1lKTsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMgPSBnZXRQYXJhbWV0ZXJUeXBlcyhleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlcywgYmVhblR5cGVQcm94eUZhY3RvcnkpOwotCQlyZXR1cm4gYmVhblR5cGUuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCBmb3IgQmVhblR5cGVzIGFuZCBwcm94eSBCZWFudHlwZXMuIFNvIHRoZXkgZG9uJ3QgbmVlZCB0byBoYXZlIGNvbW1vbiBjb2RlIHRvIGNvbnZlcnQgc3RyaW5nIHRvIHByb3h5IGJlYW4gdHlwZS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBjbGFzc1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGNsYXNzVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBjbGFzcyBhbmQgcGFybXR5cGVzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSB0aGV5IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIHRoZXkgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyA9IGdldFBhcmFtZXRlclR5cGVzKGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzLCBiZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCXJldHVybiBjbGFzc1R5cGUuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEBwYXJhbSBiZWFuVHlwZVByb3h5RmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb3h5QmVhblR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcyhJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcywgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkpIHsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXM7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKQotCQkJcGFybVR5cGVzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQlwYXJtVHlwZXMgPSBuZXcgSVByb3h5QmVhblR5cGVbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJtVHlwZXNbaV0gPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFybVR5cGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlCZWFuVHlwZVByb3h5IGNsc1Byb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShjbGFzc05hbWUpOwotCQlpZiAoY2xzUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2xzUHJveHkuZ2V0SW52b2thYmxlKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBpZCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBwcm94eS4KLQkgKiAKLQkgKiBOT1RFOiBJdCBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IElCZWFuVHlwZVByb3h5IGltcGxlbWVudGF0aW9ucyBjYW4gY2FsbCBpdC4gSXQgbXVzdCBub3QgYmUgdXNlZCBieSBhbnlvbmUgZWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBGaXJzdCBjb252ZXJ0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgaW50byBJQmVhblR5cGVQcm94eVtdLgotCQlJUkVNQmVhblR5cGVQcm94eVtdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQkJdHlwZXMgPSBuZXcgSVJFTUJlYW5UeXBlUHJveHlbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gdHlwZXNbaV0gPSAoSVJFTUJlYW5UeXBlUHJveHkpIHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBPbmUgb2YgdGhlIHBhcm0gdHlwZXMgZG9lc24ndCBleGlzdC4KLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZXRJbnZva2FibGUoYmVhblR5cGUsIG1ldGhvZE5hbWUsIHR5cGVzKTsJCQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBpZCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBwcm94eS4KLQkgKiBUaGlzIGRvZXMgbm90IGdvIHRocm91Z2ggdGhlIG1ldGhvZCBjYWNoZS4gSXQgZ29lcyBkaXJlY3QgdG8gdGhlIHJlbW90ZSB2bS4KLQkgKiAKLQkgKiBOT1RFOiBJdCBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IElCZWFuVHlwZVByb3h5IGltcGxlbWVudGF0aW9ucyBjYW4gY2FsbCBpdC4gSXQgbXVzdCBub3QgYmUgdXNlZCBieSBhbnlvbmUgZWxzZS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gRmlyc3QgY29udmVydCB0aGUgcGFyYW1ldGVyIHR5cGVzIGludG8gSUJlYW5UeXBlUHJveHlbXS4KLQkJSUJlYW5UeXBlUHJveHlbXSB0eXBlcyA9IG51bGw7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCXR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IHR5cGVzW2ldID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIE9uZSBvZiB0aGUgcGFybSB0eXBlcyBkb2Vzbid0IGV4aXN0LgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGJlYW5UeXBlLCBtZXRob2ROYW1lLCB0eXBlcyk7Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0IHRoZSBpbnZva2FibGUuIAotCSAqIAotCSAqIE5PVEU6IEl0IGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgSUJlYW5UeXBlUHJveHkgaW1wbGVtZW50YXRpb25zIGNhbiBjYWxsIGl0LiBJdCBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFueW9uZSBlbHNlLgotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIG5ldyBSRU1JbnZva2FibGUoYmVhblR5cGUsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2QgaWQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSBhbmQgY3JlYXRlIHRoZSBtZXRob2QgcHJveHkuCi0JICogPHA+Ci0JICogVGhpcyBkb2VzIG5vdCBnbyB0aHJvdWdoIHRoZSBtZXRob2QgY2FjaGUuIEl0IGdvZXMgZGlyZWN0IHRvIHRoZSByZW1vdGUgdm0uCi0JICogCi0JICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBJQmVhblR5cGVQcm94eSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGwgaXQuIEl0IG11c3Qgbm90IGJlIHVzZWQgYnkgYW55b25lIGVsc2UuCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gVGhlIHBhcm1zIHRvIGdldE1ldGhvZCBhcmU6Ci0JCS8vIHBhcm1bMF0gPSBTdHJpbmcgLSBtZXRob2QgbmFtZQotCQkvLyBwYXJtWzFdID0gQ2xhc3NbXSAtIFBhcmFtZXRlciBDbGFzc2VzLgotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7IG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzICE9IG51bGwgPyAobmV3IFRyYW5zbWl0YWJsZUFycmF5KENvbW1hbmRzLkNMQVNTX0NMQVNTLCBwYXJhbWV0ZXJUeXBlcykpIDogbnVsbH07Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldE1ldGhvZFByb3h5Lmludm9rZVdpdGhQYXJtcyhiZWFuVHlwZSwgcGFybXMpOwotCQkJcmV0dXJuIChJTWV0aG9kUHJveHkpIHJlc3VsdDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZkZhY3RvcnlSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm90IG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTb21lIHRyYWNlIG1zZ3MgYmVjYXVzZSB3ZSBrZWVwIGdldHRpbmcgaW50byBhIG1vZGUgYWZ0ZXIgYXdoaWxlICh0aG91Z2ggbm90IHJlcHJvZHVjaWJsZSkgdGhhdCByZXR1cm5zIG5vbi1tZXRob2QgcHJveGllcyBhbmQgd2UgbmVlZAotCQkJLy8gbW9yZSBpbmZvLgotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1ldGhvZCByZXF1ZXN0ZWQgaXMgXCIiICsgbWV0aG9kTmFtZSArICIoIik7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJYnVmLmFwcGVuZCgnLCcpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoIilcIiIpOyAvLyROT04tTkxTLTEkCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIGJ1Zi50b1N0cmluZygpLCBudWxsKSk7Ci0JCQl0cnkgewotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCQkJCSJDbGFzc0Nhc3RFeGNlcHRpb24gb2YgcmVzdWx0LiBSZXR1cm4gdHlwZSBpcyBcIiIgKyByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSArICJcIlxuIiArIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiUmV0dXJuIHR5cGUgYmVhbiB0eXBlIHByb3h5IGNsYXNzPVwiIiArIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcIlxuIiArIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiR2V0TWV0aG9kUHJveHkgdmFsaWQ9IiArIGdldE1ldGhvZFByb3h5LmlzVmFsaWQoKSArICJcbiIgKyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJIkdldE1ldGhvZFByb3h5IHJlYWwgbmFtZSBpcyBcIiIgKyBnZXRNZXRob2RQcm94eS5nZXROYW1lKCkgKyAiXCJcbiIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlMikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBlOyAvLyBSZXRocm93IGl0LgotCQl9Ci0JfQotCi0JLyoKLQkgKiBUZXJtaW5hdGUgdGhlIGZhY3RvcnkuIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYmVjYXVzZSBvZiB0aGUgcHJveGllcyBiZWluZyBoZWxkIG9udG8gYXJlIHJlZ2lzdGVyZWQgYW55IHdpbGwgYmUgY2xlYW5lZCB1cCB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwMTliOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQmVhblR5cGUgUHJveHkgZm9yIE1ldGhvZCBjbGFzcy4KLSAqLwotCi1maW5hbCBjbGFzcyBSRU1NZXRob2RUeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi1SRU1NZXRob2RUeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5NRVRIT0RfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MuZ2V0TmFtZSgpLCBhY2Nlc3NpYmxlVHlwZVByb3h5KTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIENvbnN0cnVjdG9yIHByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCXJldHVybiBuZXcgUkVNTWV0aG9kUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgZGVmYXVsdCBjdG9yLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZywKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1OdW1iZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTZlN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1OdW1iZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBhbnkgTnVtYmVyIChpLmUuIHRoZSBub24tcHJpbWl0aXZlcykKLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJFTU51bWJlckJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZk51bWJlclZhbHVlOwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNTnVtYmVyQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTnVtYmVyIGFOdW1iZXIpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZOdW1iZXJWYWx1ZSA9IGFOdW1iZXI7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNTnVtYmVyQmVhblByb3h5KQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscygoKFJFTU51bWJlckJlYW5Qcm94eSkgYW5PYmplY3QpLm51bWJlclZhbHVlKCkpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikKLQkJcmV0dXJuIGZOdW1iZXJWYWx1ZS5lcXVhbHMoYW5PYmplY3QpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5ieXRlVmFsdWUoKTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5kb3VibGVWYWx1ZSgpOwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmZsb2F0VmFsdWUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmludFZhbHVlKCk7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUubG9uZ1ZhbHVlKCk7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWU7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuc2hvcnRWYWx1ZSgpOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUudG9TdHJpbmcoKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM2Zjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFByaW1pdGl2ZSBCZWFuVHlwZSBQcm94aWVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSAgewotCQotCXByb3RlY3RlZCBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIHRoZSBwcmltaXRpdmUgQnl0ZS5UWVBFIG9yIEJ5dGUuY2xhc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVsbCBjdG9yIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQkKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGZpZWxkIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCQotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLQkgKiBleHBsaWNpdGx5IHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBtZXRob2QuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoZXkgYXJlbid0IGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLQkgKiBmb3Igc3ViY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIHJlbGVhc2UgLSBCZWFuVHlwZSBpcyBhYm91dCB0byBiZSByZWxlYXNlZC4KLQkgKiBwcmltaXRpdmVzIGRvbid0IG5lZWQgdG8gYmUgcmVsZWFzZWQsIHRoZXkgZG9uJ3QgaG9sZCBvbnRvIGFueSBpZHMgb3IgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCQotCS8qKgotCSAqIEhhdmUgYSBzdHJpbmcgdGhhdCBzaG91bGQgcmVwcmVzZW50IGEgbnVtYmVyLgotCSAqIFNlZSBpZiBpdCBlbmRzIGluIGEgdHlwZSBsZXR0ZXIsIGlmIHNvIHBhcnNlIGFzIHN1Y2guCi0JICogU2VlIGlmIHRoZXJlIGlzIGFuICdFJyBpbiBpdCwgdGhlbiBwYXJzZSBhcyBhIGRvdWJsZS4KLQkgKiBJZiBuZWl0aGVyIGNvbmRpdGlvbiwgdGhlbiB0cnkgcGFyc2UgYXMgbG9uZywgaWYgdGhhdCAKLQkgKiBmYWlscyB0cnkgYXMgZG91YmxlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTnVtYmVyIHBhcnNlU3RyaW5nKFN0cmluZyB2KSB7Ci0JCWlmICh2Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJY2hhciBsYXN0ID0gdi5jaGFyQXQodi5sZW5ndGgoKS0xKTsKLQkJdHJ5IHsKLQkJCXN3aXRjaCAobGFzdCkgewotCQkJCWNhc2UgJ2QnOgotCQkJCWNhc2UgJ0QnOgotCQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2Yodik7Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnRic6Ci0JCQkJCXJldHVybiBGbG9hdC52YWx1ZU9mKHYpOwotCQkJCWNhc2UgJ2wnOgotCQkJCWNhc2UgJ0wnOgotCQkJCQlyZXR1cm4gTG9uZy5kZWNvZGUodi5zdWJzdHJpbmcoMCwgdi5sZW5ndGgoKS0xKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJldHVybiBMb25nLmRlY29kZSh2KTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKHYpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTlkM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpICAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotCi0KLQotCi0vKioKLSAqIE1ldGhvZFByb3h5Q29uc3RhbnRzIGlzIGEgY2FjaGUgb2YgSU1ldGhvZFByb3hpZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3VwCi0gKiBhbmQgdGhlcmVieSBhdm9pZCB0aGUgcmVsYXRpdmVseSBleHBlbnNpdmUgamF2YS5sYW5nLnJlZmxlY3QgY2FsbHMgdG8gcmVwZWF0ZWRseQotICogbG9va3VwIG1ldGhvZCBieSBuYW1lCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUkVNUHJveHlDb25zdGFudHMgewotCi0JcHJpdmF0ZSBNYXAgbWV0aG9kc0NhY2hlID0gbmV3IEhhc2hNYXAoODApOwotCXByaXZhdGUgTWFwIGludm9rYWJsZXNDYWNoZSA9IG5ldyBIYXNoTWFwKDgwKTsJCi0JcHJpdmF0ZSBNYXAgZmllbGRzQ2FjaGUgPSBuZXcgSGFzaE1hcCg4MCk7Ci0JCi0JcHJpdmF0ZSBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQkKLQlwdWJsaWMgUkVNUHJveHlDb25zdGFudHMoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQkKLQkvKgotCSAqIFVzZWQgYXMgdGhlIGtleSB0byB0aGUgbWV0aG9kQ2FjaGUgYW5kIGludm9rYWJsZXNDYWNoZSB3aGVuIHRoZXJlIGFyZSBwYXJtcy4KLQkgKiBJdCBhbGxvd3MgdGhlIHBhcm1zIHRvIGJlIGVpdGhlciBzdHJpbmdzIG9yIElCZWFuVHlwZVByb3hpZXMgd2l0aG91dCB0aGUKLQkgKiBvdmVyaGVhZCBvZiBjcmVhdGluZyBjb21wbGljYXRlZCBzdHJpbmdzLgotCSAqIAotCSAqIEl0IHdpbGwgY29tcGFyZSBtZXRob2QgbmFtZSBhbmQgZWFjaCBpbmRpdmlkdWFsIHBhcm0gbmFtZSB3aXRob3V0IGZsdWZmaW5nCi0JICogdXAgYSBzdHJpbmcgYW5kIGJ1aWxkaW5nIGl0IHVwLgotCSAqIAotCSAqIEZvciBubyBwYXJtIG1ldGhvZHMsIGp1c3QgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBhcyBhIHN0cmluZyB3aWxsIGJlIHRoZSBrZXkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5IHsKLQkJcHVibGljIFN0cmluZyBtZXRob2ROYW1lOwotCQlwdWJsaWMgTWV0aG9kS2V5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQl9Ci0JCQkJCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKTsKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZVBhcm1zKFN0cmluZ1tdIHBhcm1zKTsKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIG1ldGhvZE5hbWUuaGFzaENvZGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRob2RLZXlTdHJpbmdQYXJtcyBleHRlbmRzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwYXJtTmFtZXM7Ci0JCQotCQlwdWJsaWMgTWV0aG9kS2V5U3RyaW5nUGFybXMoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1OYW1lcykgewotCQkJc3VwZXIobWV0aG9kTmFtZSk7Ci0JCQl0aGlzLnBhcm1OYW1lcyA9IHBhcm1OYW1lczsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChNZXRob2RLZXkpIG9iaikuY29tcGFyZVBhcm1zKHBhcm1OYW1lcyk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGggPSBzdXBlci5oYXNoQ29kZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQloICs9IHBhcm1OYW1lc1tpXS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIGg7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNjb21wYXJlUGFybXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1OYW1lcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybXNbaV0uZ2V0VHlwZU5hbWUoKS5lcXVhbHMocGFybU5hbWVzW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhTdHJpbmdbXSBwYXJtcykgewotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMocGFybXMsIHBhcm1OYW1lcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5UHJveHlQYXJtcyBleHRlbmRzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlczsKLQkJCi0JCXB1YmxpYyBNZXRob2RLZXlQcm94eVBhcm1zKFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcykgewotCQkJc3VwZXIobWV0aG9kTmFtZSk7Ci0JCQl0aGlzLnBhcm1UeXBlcyA9IHBhcm1UeXBlczsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCB0b01ldGhvZEtleVN0cmluZ1Bhcm1zKCkgewotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJtc1tpXSA9IHBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBNZXRob2RLZXlTdHJpbmdQYXJtcyhtZXRob2ROYW1lLCBwYXJtcyk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kS2V5KSBvYmopLmNvbXBhcmVQYXJtcyhwYXJtVHlwZXMpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGggPSBzdXBlci5oYXNoQ29kZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQloICs9IHBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2NvbXBhcmVQYXJtcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZVBhcm1zKFN0cmluZ1tdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1UeXBlcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1zW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1UeXBlcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1zW2ldLmdldFR5cGVOYW1lKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JfQotCQkKLQlzdGF0aWMgaW50IFJFTU1FVEhPRENPVU5UID0gMDsKLQlzdGF0aWMgaW50IFVOSVFVRU1FVEhPRENPVU5UID0gMDsJCi0Jc3RhdGljIGludCBSRU1JTlZPS0FCTEVDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBVTklRVUVJTlZPS0FCTEVDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBJTlZPS0VJTlZPS0VDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBNRVRIT0RQUk9YWUlOVk9LRUNPVU5UID0gMDsKLQlzdGF0aWMgaW50IFJFTUZJRUxEQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgVU5JUVVFRklFTERDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBSRU1DT05TVFJVQ1RPUkNBTExFRCA9IDA7Ci0Jc3RhdGljIEhhc2hNYXAgTUVUSE9EQ09VTlRNQVA7Ci0Jc3RhdGljIEhhc2hNYXAgRklFTERDT1VOVE1BUDsJIAotCXN0YXRpYyBIYXNoTWFwIEZJRUxEU0VUQ09VTlRNQVA7Ci0Jc3RhdGljIGJvb2xlYW4gR0FUSEVSX0NPVU5UUzsKLQkKLQkvKioKLQkgKiBTZXQgaWYgY291bnRzIHNob3VsZCBiZSBnYXRoZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZ2F0aGVyQ291bnRzCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEdhdGhlckNvdW50cyhib29sZWFuIGdhdGhlckNvdW50cykgewotCQlpZiAoZ2F0aGVyQ291bnRzICE9IEdBVEhFUl9DT1VOVFMpIHsKLQkJCXJlc2V0KCk7Ci0JCQlpZiAoZ2F0aGVyQ291bnRzKSB7Ci0JCQkJaWYgKE1FVEhPRENPVU5UTUFQID09IG51bGwpIHsKLQkJCQkJTUVUSE9EQ09VTlRNQVAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlGSUVMRENPVU5UTUFQID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJRklFTERTRVRDT1VOVE1BUCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJfQotCQkJfQotCQkJR0FUSEVSX0NPVU5UUyA9IGdhdGhlckNvdW50czsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKXsKLQkJUkVNTUVUSE9EQ09VTlQgPSBVTklRVUVNRVRIT0RDT1VOVCA9IFJFTUlOVk9LQUJMRUNPVU5UID0gVU5JUVVFSU5WT0tBQkxFQ09VTlQgPSBSRU1DT05TVFJVQ1RPUkNBTExFRCA9IE1FVEhPRFBST1hZSU5WT0tFQ09VTlQgPSBJTlZPS0VJTlZPS0VDT1VOVCA9IFJFTUZJRUxEQ09VTlQgPSBVTklRVUVGSUVMRENPVU5UID0gMDsKLQkJaWYgKEdBVEhFUl9DT1VOVFMpIHsKLQkJCU1FVEhPRENPVU5UTUFQLmNsZWFyKCk7Ci0JCQlGSUVMRENPVU5UTUFQLmNsZWFyKCk7Ci0JCQlGSUVMRFNFVENPVU5UTUFQLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oKXsKLQkJCi0JCWlmIChHQVRIRVJfQ09VTlRTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kIHByb3hpZXMgaW52b2tlcyA9ICIgKyBNRVRIT0RQUk9YWUlOVk9LRUNPVU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnZva2UgaW52b2tlcyA9ICIgKyBJTlZPS0VJTlZPS0VDT1VOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RzIHJldHJpZXZlZCA9ICIgKyBSRU1NRVRIT0RDT1VOVCArICIoIiArIFVOSVFVRU1FVEhPRENPVU5UICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52b2tlcyByZXRyaWV2ZWQgPSAiICsgUkVNSU5WT0tBQkxFQ09VTlQgKyAiKCIgKyBVTklRVUVJTlZPS0FCTEVDT1VOVCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkcyByZXRyaWV2ZWQgPSAiICsgUkVNRklFTERDT1VOVCArICIoIiArIFVOSVFVRUZJRUxEQ09VTlQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvciBjYWxscyA9ICIgKyBSRU1DT05TVFJVQ1RPUkNBTExFRCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItQ291bnQgb2YgbWV0aG9kcyBpbnZva2VkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQ29sbGF0ZSB0aGUgbWV0aG9kcyBjYWxsZWQKLQkJCUl0ZXJhdG9yIGVudHJpZXMgPSBNRVRIT0RDT1VOVE1BUC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJCVJFTU1ldGhvZFByb3h5IG1ldGhvZFByb3h5ID0gKFJFTU1ldGhvZFByb3h5KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obWV0aG9kUHJveHkuZ2V0Q2xhc3NUeXBlKCkuZ2V0VHlwZU5hbWUoKSArICIsIiArIG1ldGhvZFByb3h5LmdldE5hbWUoKSArICIsIiArIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1Db3VudCBvZiBmaWVsZHMgZ2V0IGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBDb2xsYXRlIHRoZSBmaWVsZHMgYWNjZXNzZWQKLQkJCWVudHJpZXMgPSBGSUVMRENPVU5UTUFQLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgZW50cmllcy5uZXh0KCk7Ci0JCQkJUkVNRmllbGRQcm94eSBmaWVsZFByb3h5ID0gKFJFTUZpZWxkUHJveHkpIGVudHJ5LmdldEtleSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihmaWVsZFByb3h5LnRvQmVhblN0cmluZygpICsgIiwiICsgZW50cnkuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1Db3VudCBvZiBmaWVsZHMgc2V0IGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBDb2xsYXRlIHRoZSBmaWVsZHMgc2V0Ci0JCQllbnRyaWVzID0gRklFTERTRVRDT1VOVE1BUC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJCVJFTUZpZWxkUHJveHkgZmllbGRQcm94eSA9IChSRU1GaWVsZFByb3h5KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmllbGRQcm94eS50b0JlYW5TdHJpbmcoKSArICIsIiArIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQl9Ci0JCQotCX0KLQkKLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5ID0gQmVhblR5cGVQcm94eSBmb3IgdGhlIG1ldGhvZAotICogQHBhcmFtIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lIHRvIGJlIGxvb2tlZCBmb3IKLSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBxdWFsaWZpZWQgdHlwZSBuYW1lcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gbWV0aG9kcwotICovIAotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtVHlwZXMpewotCQlpZiAoIXJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVJFTU1FVEhPRENPVU5UKys7Ci0JCU1hcCBtZXRob2RzOwotCQlPYmplY3Qga2V5OwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoZSBjbGFzc0NhY2hlIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBhbmQgaG9sZHMgYSBmdXJ0aGVyIG1hcCBvZiBjYWNoZSdkIG1ldGhvZHMKLQkJCW1ldGhvZHMgPSBnZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQotCQkJLy8gVGhlIHN5bnRheCBvZiB0aGUga2V5IGlzIG1ldGhvZE5hbWUocGFybVR5cGUxLHBhcm1UeXBlMikKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5U3RyaW5nUGFybXMobWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQkJCX0KLQotCQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IChJTWV0aG9kUHJveHkpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFTUVUSE9EQ09VTlQrKzsKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCVJFTU1ldGhvZFByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRNZXRob2RQcm94eSgoSVJFTUJlYW5UeXBlUHJveHkpYUJlYW5UeXBlUHJveHksbWV0aG9kTmFtZSxwYXJtVHlwZXMpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIEdldCBpdCBhZ2FpbiB0byBtYWtlIHN1cmUgaXQgaGFzbid0IGNoYW5nZWQgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uIFdlIGRvbid0IHN5bmMgZm9yIHRoZSBnZXRNZXRob2RQcm94eSBiZWNhdXNlIHRoYXQgZ29lcyB0byB0aGUgcmVtb3RlIHZtIGFuZCBjb3VsZCBkZWFkbG9jay4KLQkJCUlNZXRob2RQcm94eSBtVmFsdWUgPSAoSU1ldGhvZFByb3h5KSBtZXRob2RzLmdldChrZXkpOwotCQkJaWYgKG1WYWx1ZSAhPSBudWxsICYmIG1WYWx1ZSAhPSByZXN1bHQpIHsKLQkJCQlyZWdpc3RyeS5yZWxlYXNlUHJveHkocmVzdWx0KTsgLy8gRG9uJ3QgbmVlZCB0aGUgcmVzdWx0IG5vdywgZ290IGl0IHRocm91Z2ggYSByYWNlIGNvbmRpdGlvbi4KLQkJCQlyZXR1cm4gbVZhbHVlOyAvLyBXZSBoYXZlIGEgcmVhbCB2YWx1ZSBub3cuCi0JCQl9Ci0JCQltZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCX0JCQotCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQl9Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotICogQHJldHVybiBNYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0gKi8KLXByaXZhdGUgTWFwIGdldE1ldGhvZHMoSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHkpIHsKLQlNYXAgbWV0aG9kcyA9IChNYXApIG1ldGhvZHNDYWNoZS5nZXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSk7Ci0JaWYobWV0aG9kcyA9PSBudWxsKXsKLQkJbWV0aG9kcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJbWV0aG9kc0NhY2hlLnB1dChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpLG1ldGhvZHMpOwotCX0KLQlyZXR1cm4gbWV0aG9kczsKLX0KLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0gKiBAcmV0dXJuIE1hcCBvZiBjYWNoZSdkIGludm9rYWJsZXMKLSAqLwotcHJpdmF0ZSBNYXAgZ2V0SW52b2thYmxlcyhJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCU1hcCBpbnZva2FibGVzID0gKE1hcCkgaW52b2thYmxlc0NhY2hlLmdldChhQmVhblR5cGVQcm94eSk7Ci0JaWYoaW52b2thYmxlcyA9PSBudWxsKXsKLQkJaW52b2thYmxlcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJaW52b2thYmxlc0NhY2hlLnB1dChhQmVhblR5cGVQcm94eSxpbnZva2FibGVzKTsKLQl9Ci0JcmV0dXJuIGludm9rYWJsZXM7Ci19Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotICogQHJldHVybiBNYXAgb2YgY2FjaGUnZCBmaWVsZHMKLSAqLwotcHJpdmF0ZSBNYXAgZ2V0RmllbGRzKElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5KSB7Ci0JTWFwIGZpZWxkcyA9IChNYXApIGZpZWxkc0NhY2hlLmdldChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpKTsKLQlpZihmaWVsZHMgPT0gbnVsbCl7Ci0JCWZpZWxkcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJZmllbGRzQ2FjaGUucHV0KGFCZWFuVHlwZVByb3h5LmdldFR5cGVOYW1lKCksZmllbGRzKTsKLQl9Ci0JcmV0dXJuIGZpZWxkczsKLX0KLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5ID0gQmVhblR5cGVQcm94eSBmb3IgdGhlIG1ldGhvZAotICogQHBhcmFtIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lIHRvIGJlIGxvb2tlZCBmb3IKLSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBxdWFsaWZpZWQgdHlwZSBuYW1lcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gYXJndW1lbnRzCi0gKi8gCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgaW52b2thYmxlTmFtZSwgU3RyaW5nW10gcGFybVR5cGVOYW1lcyl7Ci0JCQotCQlSRU1JTlZPS0FCTEVDT1VOVCsrOwotCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCU1hcCBpbnZva2FibGVzID0gZ2V0SW52b2thYmxlcyhhQmVhblR5cGVQcm94eSk7CQotCQkKLQkJT2JqZWN0IGtleSA9IG51bGw7IAotCQlpZihwYXJtVHlwZU5hbWVzID09IG51bGwgfHwgcGFybVR5cGVOYW1lcy5sZW5ndGggPT0gMCl7Ci0JCQlrZXkgPSBpbnZva2FibGVOYW1lOwotCQl9IGVsc2UgewotCQkJa2V5ID0gbmV3IE1ldGhvZEtleVN0cmluZ1Bhcm1zKGludm9rYWJsZU5hbWUsIHBhcm1UeXBlTmFtZXMpOwotCQl9CQkJCi0JCQotCQlJSW52b2thYmxlIHJlc3VsdCA9IChJSW52b2thYmxlKSBpbnZva2FibGVzLmdldChrZXkpOwotCQlpZihyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKLQkJCi0JCVVOSVFVRUlOVk9LQUJMRUNPVU5UKys7Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQlSRU1NZXRob2RQcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgYUJlYW5UeXBlUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJcmVzdWx0ID0gcHJveHlGYWN0b3J5LmdldEludm9rYWJsZSgoSVJFTUJlYW5UeXBlUHJveHkpYUJlYW5UeXBlUHJveHksaW52b2thYmxlTmFtZSxwYXJtVHlwZU5hbWVzKTsKLQkJaW52b2thYmxlcy5wdXQoa2V5LHJlc3VsdCk7CQkKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JCQkJCi0JfQotCS8qKgotCSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUgdG8gYmUgbG9va2VkIGZvcgotCSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBJQmVhblR5cGVQcm94eSB0eXBlcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gYXJndW1lbnRzCi0JICovIAotCQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBpbnZva2FibGVOYW1lLCBJQmVhblR5cGVQcm94eVtdIHBhcm1UeXBlcyl7Ci0JCQkKLQkJCVJFTUlOVk9LQUJMRUNPVU5UKys7Ci0JCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCQlNYXAgaW52b2thYmxlcyA9IGdldEludm9rYWJsZXMoYUJlYW5UeXBlUHJveHkpOwkKLQkJCQotCQkJT2JqZWN0IGtleSA9IG51bGw7IAotCQkJaWYocGFybVR5cGVzID09IG51bGwgfHwgcGFybVR5cGVzLmxlbmd0aCA9PSAwKXsKLQkJCQlrZXkgPSBpbnZva2FibGVOYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5UHJveHlQYXJtcyhpbnZva2FibGVOYW1lLCBwYXJtVHlwZXMpOwotCQkJfQkJCQotCQkJCi0JCQlJSW52b2thYmxlIHJlc3VsdCA9IChJSW52b2thYmxlKSBpbnZva2FibGVzLmdldChrZXkpOwotCQkJaWYocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQkKLQkJCVVOSVFVRUlOVk9LQUJMRUNPVU5UKys7Ci0JCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCQlSRU1NZXRob2RQcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgYUJlYW5UeXBlUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJCXJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRJbnZva2FibGUoKElSRU1CZWFuVHlwZVByb3h5KWFCZWFuVHlwZVByb3h5LGludm9rYWJsZU5hbWUscGFybVR5cGVzKTsKLQkJCWludm9rYWJsZXMucHV0KGtleSxyZXN1bHQpOwkJCi0JCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQkJCQkJCi0JCX0JCi0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLSAqIEBwYXJhbSBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSB0byBiZSBsb29rZWQgZm9yCi0gKiBAcGFyYW0gcGFybVR5cGVzID0gYXJyYXkgb2YgcXVhbGlmaWVkIHR5cGUgbmFtZXMgZm9yIHRoZSBtZXRob2QgYXJndW1lbnRzLCBudWxsIGlmIG5vIG1ldGhvZHMKLSAqLyAKLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBwYXJtVHlwZXMpewotCQlpZiAoIXJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJUkVNTUVUSE9EQ09VTlQrKzsJCQotCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCU1hcCBtZXRob2RzOwotCQlPYmplY3Qga2V5OwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCW1ldGhvZHMgPSBnZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQotCQkJa2V5ID0gbnVsbDsKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5UHJveHlQYXJtcyhtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCQkJfQotCi0JCQlJTWV0aG9kUHJveHkgcmVzdWx0ID0gKElNZXRob2RQcm94eSkgbWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlVTklRVUVNRVRIT0RDT1VOVCsrOwotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJUkVNTWV0aG9kUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpOwotCQlJTWV0aG9kUHJveHkgcmVzdWx0ID0gcHJveHlGYWN0b3J5LmdldE1ldGhvZFByb3h5KChJUkVNQmVhblR5cGVQcm94eSlhQmVhblR5cGVQcm94eSxtZXRob2ROYW1lLHBhcm1UeXBlcyk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gR2V0IGl0IGFnYWluIHRvIG1ha2Ugc3VyZSBpdCBoYXNuJ3QgY2hhbmdlZCBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gV2UgZG9uJ3Qgc3luYyBmb3IgdGhlIGdldE1ldGhvZFByb3h5IGJlY2F1c2UgdGhhdCBnb2VzIHRvIHRoZSByZW1vdGUgdm0gYW5kIGNvdWxkIGRlYWRsb2NrLgotCQkJSU1ldGhvZFByb3h5IG1WYWx1ZSA9IChJTWV0aG9kUHJveHkpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAobVZhbHVlICE9IG51bGwgJiYgbVZhbHVlICE9IHJlc3VsdCkgewotCQkJCXJlZ2lzdHJ5LnJlbGVhc2VQcm94eShyZXN1bHQpOyAvLyBEb24ndCBuZWVkIHJlc3VsdCBub3csIGdvdCBpdCBhbHJlYWR5IHRocm91Z2ggYSByYWNlIGNvbmRpdGlvbi4KLQkJCQlyZXR1cm4gbVZhbHVlOyAvLyBXZSBoYXZlIGEgcmVhbCB2YWx1ZSBub3cuCi0JCQl9Ci0JCQltZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCX0JCQotCi0JCXJldHVybiByZXN1bHQ7CQkJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJveHkgbWV0aG9kIGZvciB0aGUgbWV0aG9kIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFybVR5cGVzCi0JICogQHJldHVybiBlaXRoZXIgdGhlIElNZXRob2RQcm94eSBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIGFuIEV4cHJlc3Npb25Qcm94eSBpZiBub3QgeWV0IHJlc29sdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyl7Ci0JCWlmICghcmVnaXN0cnkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSRU1NRVRIT0RDT1VOVCsrOwkKLQkJTWFwIG1ldGhvZHM7Ci0JCU1hcCBlcE1ldGhvZHM7Ci0JCU9iamVjdCBrZXk7Ci0JCWJvb2xlYW4gaXNLZXk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gVGhlIGNsYXNzQ2FjaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IG5hbWUgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCQltZXRob2RzID0gZ2V0TWV0aG9kcyhhQmVhblR5cGVQcm94eSk7Ci0KLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJCWlzS2V5ID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWtleSA9IG5ldyBNZXRob2RLZXlQcm94eVBhcm1zKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCQkJaXNLZXkgPSB0cnVlOwotCQkJfQotCi0JCQlJUHJveHlNZXRob2QgcmVzdWx0ID0gKElQcm94eU1ldGhvZCkgbWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCi0JCQkvLyBTZWUgaWYgc3RvcmVkIGluIHRoZSBleHByZXNzaW9uLgotCQkJZXBNZXRob2RzID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQkJCXJlc3VsdCA9IChJUHJveHlNZXRob2QpIGVwTWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlVTklRVUVNRVRIT0RDT1VOVCsrOwotCQkvLyBHZXQgdGhlIG1ldGhvZCBleHByZXNzaW9uIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJSVByb3h5TWV0aG9kIHJlc3VsdCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlTWV0aG9kRXhwcmVzc2lvblByb3h5KGFCZWFuVHlwZVByb3h5LG1ldGhvZE5hbWUscGFybVR5cGVzKTsKLQkJZXBNZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCWZpbmFsIE9iamVjdCBlcEtleSA9IGtleTsKLQkJZmluYWwgTWFwIHJNZXRob2RzID0gbWV0aG9kczsgCi0JCWZpbmFsIE1hcCBmZXBNZXRob2RzID0gZXBNZXRob2RzOwotCQlmaW5hbCBib29sZWFuIGlzS2V5VHlwZSA9IGlzS2V5OwotCQkoKEV4cHJlc3Npb25Qcm94eSkgcmVzdWx0KS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3luY2hyb25pemVkIChSRU1Qcm94eUNvbnN0YW50cy50aGlzKSB7Ci0JCQkJCWlmIChyTWV0aG9kcy5jb250YWluc0tleShlcEtleSkpCi0JCQkJCQlyZXR1cm47CS8vIFdlIGFscmVhZHkgaGF2ZSBhIHRydWUgbWV0aG9kIHByb3h5IGluIHRoZXJlLiBBIHJhY2UgY29uZGl0aW9uIG9jY3VycmVkLgotCQkJCQkKLQkJCQkJLy8gTm93IHB1dCB0aGlzIHJlc29sdmVkIGd1eSBpbnRvIHRoZSBtZXRob2RzLgotCQkJCQkvLyBXZSBkb24ndCB3YW50IHRoZSBrZXkgdG8gY29udGFpbiBleHByZXNzaW9uIHByb3hpZXMgaW4gdGhlIGZpbmFsIG1hcCwgc28gaWYgaXQgaXMgYSBrZXkgdHlwZQotCQkJCQkvLyB3ZSB3aWxsIHR1cm4gaXQgaW50byBhIHN0cmluZyB0eXBlIGtleS4KLQkJCQkJT2JqZWN0IGtleTsKLQkJCQkJaWYgKGlzS2V5VHlwZSkgewotCQkJCQkJa2V5ID0gKChNZXRob2RLZXlQcm94eVBhcm1zKSBlcEtleSkudG9NZXRob2RLZXlTdHJpbmdQYXJtcygpOwkvLyBTbyB0aGF0IHdlIGRvbid0IHB1dCBhIGtldCB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gcHJveHkgcGFybSB0eXBlcyBpbnRvIHRoZSBtYWluIG1hcC4KLQkJCQkJfSBlbHNlCi0JCQkJCQlrZXkgPSBlcEtleTsKLQkJCQkJCi0JCQkJCXJNZXRob2RzLnB1dChrZXksIGV2ZW50LmdldFByb3h5KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCXN5bmNocm9uaXplZCAoUkVNUHJveHlDb25zdGFudHMudGhpcykgewotCQkJCQlmZXBNZXRob2RzLnJlbW92ZShlcEtleSk7Ci0JCQkJfQotCQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5Ci0JICovCi0Jc3RhdGljIHZvaWQgbWV0aG9kSW52b2tlZChSRU1NZXRob2RQcm94eSBwcm94eSkgewotCQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBNRVRIT0RDT1VOVE1BUC5nZXQocHJveHkpOwotCQkJaWYgKGNvdW50ID09IG51bGwpIHsKLQkJCQlNRVRIT0RDT1VOVE1BUC5wdXQocHJveHksIG5ldyBJbnRlZ2VyKDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTUVUSE9EQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmllbGRHZXRJbnZva2VkKElCZWFuUHJveHkgcHJveHkpIHsKLQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBGSUVMRENPVU5UTUFQLmdldChwcm94eSk7Ci0JCQlpZiAoY291bnQgPT0gbnVsbCkgewotCQkJCUZJRUxEQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcigxKSk7Ci0JCQl9IGVsc2UgewotCQkJCUZJRUxEQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfSAKLQkJfQkJCi0JfQotCi0Jc3RhdGljIHZvaWQgZmllbGRTZXRJbnZva2VkKElCZWFuUHJveHkgcHJveHksIElCZWFuUHJveHkgdmFsdWUpIHsKLQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBGSUVMRFNFVENPVU5UTUFQLmdldChwcm94eSk7Ci0JCQlpZiAoY291bnQgPT0gbnVsbCkgewotCQkJCUZJRUxEU0VUQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcigxKSk7Ci0JCQl9IGVsc2UgewotCQkJCUZJRUxEU0VUQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfSAKLQkJfQkJCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJveHkgZm9yIHRoZSBCZWFuVHlwZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZmllbGROYW1lIG9mIHRoZSBmaWVsZCwgZS5nLiAoamF2YS5hd3QuRGltZW5zaW9uLCB3aWR0aCkgZm9yIHRoZSAid2lkdGgiIGZpZWxkIG9uIERpbWVuc2lvbgotCSAqIEByZXR1cm4gVGhlIGZpZWxkIHByb3h5IHRoYXQgaXMgY2FjaGUnZCBmb3IgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJFTUZJRUxEQ09VTlQrKzsKLQkJTWFwIGZpZWxkczsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBUaGUgZmllbGQgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgZmllbGRzCi0JCQlmaWVsZHMgPSBnZXRGaWVsZHMoYUJlYW5UeXBlUHJveHkpOwkKLQkJCQkKLQkJCS8vIExvb2t1cCB0aGUgY2FjaGUnZCBGaWVsZCBwcm94eQotCQkJSUZpZWxkUHJveHkgcmVzdWx0ID0gKElGaWVsZFByb3h5KSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFRklFTERDT1VOVCsrOwotCQlJRmllbGRQcm94eSByZXN1bHQgPSAoSUZpZWxkUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhhQmVhblR5cGVQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKS5nZXRDbGFzc0dldEZpZWxkKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCWFCZWFuVHlwZVByb3h5LAotCQkJCXJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGZpZWxkTmFtZSkpOwkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlJRmllbGRQcm94eSBmVmFsdWUgPSAoSUZpZWxkUHJveHkpIGZpZWxkcy5nZXQoZmllbGROYW1lKTsKLQkJCWlmIChmVmFsdWUgIT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5LnJlbGVhc2VQcm94eShyZXN1bHQpOwkvLyBEb24ndCBuZWVkIGl0IG5vdy4gQSByYWNlIGhhZCBwdXQgYW5vdGhlciBvbmUgaW4uCi0JCQkJcmV0dXJuIGZWYWx1ZTsKLQkJCX0KLQkJCWZpZWxkcy5wdXQoZmllbGROYW1lLHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotCQotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKXsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJFTUZJRUxEQ09VTlQrKzsKLQkJTWFwIGZpZWxkczsKLQkJTWFwIGVwRmllbGRzOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoZSBjbGFzc0NhY2hlIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBuYW1lIGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQkJZmllbGRzID0gZ2V0RmllbGRzKGFCZWFuVHlwZVByb3h5KTsJCi0JCQotCQkJSVByb3h5RmllbGQgcmVzdWx0ID0gKElQcm94eUZpZWxkKSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQotCQkJLy8gU2VlIGlmIHN0b3JlZCBpbiB0aGUgZXhwcmVzc2lvbi4KLQkJCWVwRmllbGRzID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRGaWVsZHMoYUJlYW5UeXBlUHJveHkpOwotCQkJcmVzdWx0ID0gKElQcm94eUZpZWxkKSBlcEZpZWxkcy5nZXQoZmllbGROYW1lKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwkJCQotCQl9Ci0JCQotCQlVTklRVUVGSUVMRENPVU5UKys7Ci0JCS8vIEdldCB0aGUgZmllbGQgZXhwcmVzc2lvbiBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCUlQcm94eUZpZWxkIHJlc3VsdCA9ICgoUkVNRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlRmllbGRFeHByZXNzaW9uUHJveHkoYUJlYW5UeXBlUHJveHksIGZpZWxkTmFtZSk7Ci0JCWVwRmllbGRzLnB1dChmaWVsZE5hbWUsIHJlc3VsdCk7Ci0JCWZpbmFsIE1hcCBmcEZpZWxkcyA9IGZpZWxkczsKLQkJZmluYWwgTWFwIGZlcEZpZWxkcyA9IGVwRmllbGRzOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgcmVzdWx0KS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJFTVByb3h5Q29uc3RhbnRzLnRoaXMpIHsKLQkJCQkJaWYgKGZwRmllbGRzLmNvbnRhaW5zS2V5KGZpZWxkTmFtZSkpCi0JCQkJCQlyZXR1cm47CS8vIEFscmVhZHkgc2V0IHRvIHJlc29sdmVkIHZhbHVlIGJ5IHNvbWVvbmUgZWxzZS4KLQkJCQkJZnBGaWVsZHMucHV0KGZpZWxkTmFtZSwgZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJfQotCQkJfQotCQkJIHB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkgc3luY2hyb25pemVkIChSRU1Qcm94eUNvbnN0YW50cy50aGlzKSB7Ci0JCQkJCSBmZXBGaWVsZHMucmVtb3ZlKGZpZWxkTmFtZSk7Ci0JCQkJfQotCQkJIH0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWUzMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSByZWdpc3RyeSB0byB1c2UgZm9yIFJlbW90ZSBWTS4KLSAqIEl0IGFkZHMgdG8gdGhlIHN0YW5kYXJkIHJlZ2lzdHJ5LCBjb25uZWN0aW9uIHNwZWNpZmljIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgd2lsbCBhbHdheXMgaG9sZCBvbnRvIG9uZSBjb25uZWN0aW9uIG9wZW4gdW50aWwgdGVybWluYXRpb24gaXMgcmVxdWVzdGVkLgotICogVGhhdCB3YXkgd2hpbGUgdGhlIElERSBpcyB1cCwgdGhlIHJlbW92ZSB2bSB3b24ndCB0aW1lIG91dC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9SRUdJU1RSWV9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmplbS5SRU1PVEUiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIGludCBmU2VydmVyUG9ydCA9IDA7CS8vIFRoZSBzZXJ2ZXIgcG9ydCB0byB1c2Ugd2hlbiBtYWtpbmcgY29ubmVjdGlvbnMuCi0JcHJvdGVjdGVkIFJFTUNhbGxiYWNrUmVnaXN0cnkgZkNhbGxiYWNrU2VydmVyOwkvLyBUaGUgY2FsbGJhY2sgc2VydmVyIHRocmVhZCBmb3IgdGhpcyByZW1vdGUgdm0uCi0JcHJvdGVjdGVkIFN0YWNrIGZDb25uZWN0aW9uUG9vbCA9IG5ldyBTdGFjaygpOwkvLyBTdGFjayBvZiBmcmVlIGNvbm5lY3Rpb25zLgotCXByb3RlY3RlZCBzdGF0aWMgaW50IE5VTUJFUl9GUkVFX0NPTk5FQ1RJT05TID0gNTsJLy8gTnVtYmVyIG9mIGZyZWUgY29ubmVjdGlvbnMgdG8ga2VlcCBvcGVuLgotCXByb3RlY3RlZCBJUHJvY2VzcyBmUHJvY2VzczsJLy8gVGhlIHByb2Nlc3MgdGhhdCBpcyB0aGUgc2VydmVyLiBJZiBudWxsIGFuZCBmU2VydmVyUG9ydCBpcyBub3QgemVybywgCi0JCQkJCQkJCQkvLyB0aGVuIHRoaXMgcmVnaXN0cnkgaXMgaW4gdGVzdCBtb2RlCi0JCQkJCQkJCQkvLyBhbmQgdGhlIHNlcnZlciBpcyBpbiBzYW1lIHRoZSBwcm9jZXNzLgotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7Ci0JcHJvdGVjdGVkIGludCBmQ2FsbGJhY2tTZXJ2ZXJQb3J0OwotCXByb3RlY3RlZCBJbnRlZ2VyIGZSZWdpc3RyeUtleTsKLQlwcm90ZWN0ZWQgUkVNUmVnaXN0cnlDb250cm9sbGVyIGZSZWdpc3RyeUNvbnRyb2xsZXI7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3QgVEVSTUlOQVRFX0pPQl9GQU1JTFkgPSBuZXcgT2JqZWN0KCk7Ci0JCi0JLy8gUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBvbmx5IHRoZSBQcm94eVZNU3RhcnRlciBzaG91bGQgc2V0IHRoaXMgZmxhZy4gSXQgd291bGQgc2V0IGl0IGlmCi0JLy8gd29ya2luZyB3aXRoIGEgZGVidWdnZXIgYmVjYXVzZSB3ZSBkb24ndCBob3cgbG9uZyBpdCB3aWxsIGJlIHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgd2hlbiAKLQkvLyBzb21lb25lIGlzIHdvcmtpbmcgd2l0aCBhIGRlYnVnZ2VyLgotCWJvb2xlYW4gZk5vVGltZW91dHMgPSBmYWxzZTsKLQkKLQkvLyBUaGlzIGlzIHNldCB2aWEgdGhlIHN0YXRpYyBzZXRHbG9iYWxOb1RpbWVvdXRzKCkgbWV0aG9kLCBvciB2aWEgZGVidWcgb3B0aW9ucyBmbGFnLiBJdCBpcyBoZXJlIHNvIHRoYXQKLQkvLyB3aGVuIGRlYnVnZ2luZyBjYWxsYmFja3MsIGJ1dCBub3QgZGVidWdnaW5nIHJlbW90ZSB2bSwgdGhhdCBubyB0aW1lb3V0cyBmb3IgYW55IHJlZ2lzdHJ5IHdpbGwgb2NjdXIuCi0JLy8gT3IgaXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkZWJ1ZyAub3B0aW9ucyBmbGFnLgotCXN0YXRpYyBib29sZWFuIGZHbG9iYWxOb1RpbWVvdXRzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkrUHJveHlSZW1vdGVVdGlsLk5PX1RJTUVPVVRTKSk7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JLyoqCi0JICogVHlwaWNhbGwgc2V0IHRocm91Z2ggdGhlICJleHByZXNzaW9uIiBldmFsdWF0aW9uIG9mIHRoZSBkZWJ1Z2dlci4KLQkgKiBAcGFyYW0gbm9UaW1lb3V0cwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHbG9iYWxOb1RpbWVvdXRzKGJvb2xlYW4gbm9UaW1lb3V0cykgewotCQlmR2xvYmFsTm9UaW1lb3V0cyA9IG5vVGltZW91dHM7Ci0JfQotCQotCS8vIEFuIGludGVybmFsIHRocmVhZCB0aGF0IGxvY2tzIGFuZCB3YWl0cyBmb3IgdGhlIHJlbW90ZSB2bSB0byByZWdpc3RlciBpdHNlbGYuIAotCXByaXZhdGUgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkOwotCQotCXByaXZhdGUgY2xhc3MgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXB1YmxpYyBXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkKCkgewotCQkJc3VwZXIoIldhaXQgZm9yIHJlbW90ZSB2bSByZWdpc3RyYXRpb24gdGhyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocmVhZCNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gV2FpdCBmb3IgcmVnaXN0cmF0aW9uLiBQdXQgaXQgaW50byBhIHRocmVhZCBzbyB0aGlzCi0JCQkvLyBjYW4gb2NjdXIgd2hpbGUgb3RoZXIgc3R1ZmYgZ29lcyBvbi4gSXQgbG9ja3MgdGhlIGZDb25uZWN0aW9uUG9vbAotCQkJLy8gdW50aWwgZG9uZSBzbyB0aGF0IHRoZSBmaXJzdCByZXF1ZXN0IGZvciBhIGNvbm5lY3Rpb24gYnkgYW55b25lCi0JCQkvLyBlbHNlIHdpbGwgd2FpdCB1bnRpbCB0aGlzIHRocmVhZCBpcyBmaW5pc2hlZC4gCi0JCQkKLQkJCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCQlzeW5jaHJvbml6ZWQoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkudGhpcykgewotCQkJCQkvLyBOb3RpZnkgdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UgaGF2ZSB0aGUgCi0JCQkJCS8vIGNvbm5lY3Rpb24gcG9vbCBsb2NrZWQuCi0JCQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LnRoaXMubm90aWZ5QWxsKCk7Ci0JCQkJfQotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkvLyBzeW5jIG9uIHNlbGYgc28gdGhhdCBpdCBjYW4gYmUgbm90aWZpZWQgd2hlbiBmaW5hbGx5IHJlY2VpdmUgdGhlIHJlZ2lzdHJhdGlvbgotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkrNjAwMDA7Ci0JCQkJCXdoaWxlICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkICE9IG51bGwgJiYgKGZOb1RpbWVvdXRzIHx8IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RvcFRpbWUpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkud2FpdCg2MDAwMCk7Ci0JCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXdhaXRSZWdpc3RyYXRpb25UaHJlYWQgPSBudWxsOwkvLyBObyBsb25nZXIgZXhpc3RzLgkJCQkKLQkJfQotCX0KLQotCQotCXB1YmxpYyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeShSRU1SZWdpc3RyeUNvbnRyb2xsZXIgcmVnaXN0cnlDb250cm9sbGVyLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihSRU1PVEVfUkVHSVNUUllfVFlQRV9JRCk7Ci0JCWZSZWdpc3RyeUNvbnRyb2xsZXIgPSByZWdpc3RyeUNvbnRyb2xsZXI7CQkKLQkJZlJlZ2lzdHJ5S2V5ID0gZlJlZ2lzdHJ5Q29udHJvbGxlci5yZWdpc3RlclJlZ2lzdHJ5KHRoaXMpOwkvLyBSZWdpc3RlciB0aGUgcmVnaXN0cnkgd2l0aCB0aGUgcGx1Z2luLgkJCi0JCWZOYW1lID0gbmFtZTsJCQotCQkKLQkJLy8gR2V0IHRoZSB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkIHN0YXJ0ZWQgYmVmb3JlIHdlIGFjdHVhbGx5IGxhdW5jaCByZW1vdGUgdm0gc28KLQkJLy8gdGhhdCBpdCBpcyB3YWl0aW5nIHdoZW4gdGhlIGNhbGxiYWNrIGNvbWVzIGluLgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXdhaXRSZWdpc3RyYXRpb25UaHJlYWQgPSBuZXcgV2FpdEZvclJlZ2lzdHJhdGlvblRocmVhZCgpOwotCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZC5zdGFydCgpOwotCQkJCi0JCQkvLyBOb3cgd2Ugd2lsbCB3YWl0IHVudGlsIHRoZSByZWdpc3RyYXRpb24gY2FsbGJhY2sgaGFzIGJlZW4gZG9uZS4gVGhlIHRocmVhZCB3aWxsCi0JCQkvLyBzaWduYWwgdXMgd2hlbiB0aGF0IGlzIGRvbmUuIFRoaXMgaXMgc28gdGhhdCB3ZSBkb24ndCBjb250aW51ZSBvbiBhbmQgbGV0Ci0JCQkvLyBhIHdvcmsgY29ubmVjdGlvbiBiZSByZXF1ZXN0ZWQgYmVmb3JlIHdlIGV2ZW4gZ290IGEgY2hhbmNlIHRvIHN0YXJ0IHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgcmVnaXN0cmF0aW9uLgotCQkJd2hpbGUodHJ1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCXdhaXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX07CQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFJlZ2lzdHJ5S2V5KCkgewotCQlyZXR1cm4gZlJlZ2lzdHJ5S2V5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUmVnaXN0cnkoSVByb2Nlc3MgcHJvY2VzcykgewotCQlmUHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJRGVidWdFdmVudFNldExpc3RlbmVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lciNoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlEZWJ1Z0V2ZW50IGUgPSBldmVudHNbaV07Ci0JCQkJCWlmIChlLmdldFNvdXJjZSgpID09IGZQcm9jZXNzICYmIGUuZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0JCQkJCQkvLyBXZSB0ZXJtaW5hdGluZyB0b28gc29vbi4gUG9wIHVwIGEgbXNnLgotCQkJCQkJSVN0cmVhbXNQcm94eSBzdFByb3h5ID0gZlByb2Nlc3MuZ2V0U3RyZWFtc1Byb3h5KCk7Ci0JCQkJCQlqYXZhLmlvLlN0cmluZ1dyaXRlciBzID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQlqYXZhLmlvLlByaW50V3JpdGVyIHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihzKTsKLQkJCi0JCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXywgbmV3IE9iamVjdFtdIHtmTmFtZX0pOyAKLQkJCQkJCXcucHJpbnRsbihtc2cpOwkJCQkJCQotCQkJCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9JTkZPXyk7Ci0JCQkJCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9DT01NQU5EX0xJTkUpOwotCQkJCQkJdy5wcmludGxuKGZQcm9jZXNzLmdldEF0dHJpYnV0ZShJUHJvY2Vzcy5BVFRSX0NNRExJTkUpKTsJCQkJCQkKLQkJCQkJCXcucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlZNX1RFUk1JTkFURURfTElORTEpOyAKLQkJCQkJCXcucHJpbnRsbihzdFByb3h5LmdldEVycm9yU3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCkpOwotCQkJCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMik7IAotCQkJCQkJdy5wcmludGxuKHN0UHJveHkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCkpOwotCQkJCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMyk7IAotCQkJCQkJdy5jbG9zZSgpOwotCQkKLQkJCQkJCURlYnVnTW9kZUhlbHBlciBkaCA9IG5ldyBEZWJ1Z01vZGVIZWxwZXIoKTsKLQkJCQkJCWRoLmRpc3BsYXlFcnJvck1lc3NhZ2UoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9FcnJvcl9UaXRsZSwgbXNnKTsgCi0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBzLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJCQkJCXByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwkJCQkJCQotCQkJCQkJdGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIENhbGxiYWNrUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgSUNhbGxiYWNrUmVnaXN0cnkgZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpIHsKLQkJaWYgKGZDYWxsYmFja1NlcnZlciA9PSBudWxsKQotCQkJZkNhbGxiYWNrU2VydmVyID0gbmV3IFJFTUNhbGxiYWNrUmVnaXN0cnkoZk5hbWUsIHRoaXMpOwotCQlyZXR1cm4gZkNhbGxiYWNrU2VydmVyOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgcmVnaXN0cnkgY29udHJvbGxlciB0byB0ZWxsCi0JICogdGhlIHJlZ2lzdHJ5IHRvIHRlcm1pbmF0ZSB3aXRoIHByZWp1ZGljZSBhbGwgCi0JICogcGVuZGluZyBUZXJtaW5hdGVKb2JzLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYW5jZWxBbGxUZXJtaW5hdGVKb2JzKCkgewotCQlJSm9iTWFuYWdlciBqb2JNYW5hZ2VyID0gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQkJam9iTWFuYWdlci5jYW5jZWwoVEVSTUlOQVRFX0pPQl9GQU1JTFkpOwotCQl0cnkgewotCQkJam9iTWFuYWdlci5qb2luKFRFUk1JTkFURV9KT0JfRkFNSUxZLCBudWxsKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVybWluYXRlUHJvY2VzcyBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgSVByb2Nlc3MgcHJvY2VzczsKLQkJCi0JCXB1YmxpYyBUZXJtaW5hdGVQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKLQkJCXN1cGVyKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfSm9iX1Rlcm1pbmF0ZVByb2Nlc3NfVGl0bGUpOwkgCi0JCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIGZhbWlseSA9PSBURVJNSU5BVEVfSk9CX0ZBTUlMWSB8fCBzdXBlci5iZWxvbmdzVG8oZmFtaWx5KTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb24pIHsKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlcmUgaXMgbm8gam9pbiBvbiBhIHByb2Nlc3MgYXZhaWxhYmxlLCBzbyB3ZSB3aWxsIGhhdmUgdG8KLQkJCQkvLyBidXN5IHdhaXQuIEdpdmUgaXQgMTAgc2Vjb25kcyBpbiAxLzEwIHNlY29uZCBpbnRlcnZhbHMuCi0JCQkJZm9yIChpbnQgaT0wOyAhcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSAmJiBpPDEwMDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsJCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXByb2Nlc3MuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQkJcHJvY2Vzcy50ZXJtaW5hdGUoKTsKLQkJCQl9IAotCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0cnlUZXJtaW5hdGVkKGJvb2xlYW4gd2FpdCkgewotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCS8vIFJlbW92ZSBsaXN0ZW5lciBjYXVzZSB3ZSBhcmUgbm93IGdvaW5nIHRvIHRlcm1pbmF0ZSBwcm9jZXNzIGFuZCBkb24ndCB3YW50IHByZW1hdHVyZSB0ZXJtaW5hdGUgbm90aWNlLgotCQkJLy8gU29tZXRpbWVzIGluIHNodXRkb3duIHdlIGFyZSBjYWxsZWQgYW5kIHRoZSBkZWJ1ZyBwbHVnaW4gbWF5IG9mIGFscmVhZHkgYmVlbiBzaHV0ZG93bi4gSW4gdGhhdCBjYXNlIHRoZSBkYgotCQkJLy8gd2lsbCBiZSBudWxsIGFuZCB0aGVyZSBpcyBub3RoaW5nIHJlbW92ZSBsaXN0ZW5lciBmcm9tLgotCQkJRGVidWdQbHVnaW4gZGIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoZGIgIT0gbnVsbCkKLQkJCQlkYi5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQkJCXByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJCi0JCUpvYiB0am9iID0gbnVsbDsKLQkJaWYgKHdhaXRSZWdpc3RyYXRpb25UaHJlYWQgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkKSB7Ci0JCQkJLy8gU3RpbGwgd2FpdGluZy4gY2xvc2UgaXQgb3V0LgotCQkJCVdhaXRGb3JSZWdpc3RyYXRpb25UaHJlYWQgd1RocmVhZCA9IHdhaXRSZWdpc3RyYXRpb25UaHJlYWQ7Ci0JCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZCA9IG51bGw7Ci0JCQkJd1RocmVhZC5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfQkJCi0JCWlmIChmU2VydmVyUG9ydCAhPSAwKSB7CQkJCQkKLQkJCUlSRU1Db25uZWN0aW9uIGNsb3NlQ29uID0gbnVsbDsJLy8gVGhlIGNvbm5lY3Rpb24gd2Ugd2lsbCB1c2UgdG8gY2xvc2UgdGhlIHJlbW90ZSB2bS4KLQkJCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCQkvLyBOb3cgd2Ugd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgZnJlZSBjb25uZWN0aW9ucyBhbmQgY2xvc2UgdGhlbSBwcm9wZXJseS4KLQkJCQlJdGVyYXRvciBpdHIgPSBmQ29ubmVjdGlvblBvb2wuaXRlcmF0b3IoKTsKLQkJCQlpZiAoaXRyLmhhc05leHQoKSkKLQkJCQkJY2xvc2VDb24gPSAoSVJFTUNvbm5lY3Rpb24pIGl0ci5uZXh0KCk7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJSVJFTUNvbm5lY3Rpb24gY29uID0gKElSRU1Db25uZWN0aW9uKSBpdHIubmV4dCgpOwotCQkJCQljb24uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCi0JCQkvLyBOb3cgd2UgdGVybWluYXRlIHRoZSBzZXJ2ZXIuCi0JCQlpZiAoY2xvc2VDb24gPT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQljbG9zZUNvbiA9IGdldEZyZWVDb25uZWN0aW9uKCk7CS8vIFRoZXJlIHdlcmVuJ3QgYW55IGZyZWUgY29ubmVjdGlvbnMsIHNvIGdldCBhIG5ldyBvbmUgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQuCi0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gRG8gbm90aGluZywgZG9uJ3Qgd2FudCB0byBzdG9wIHRlcm1pbmF0aW9uIGp1c3QgYmVjYXVzZSB3ZSBjYW4ndCBnZXQgYSBjb25uZWN0aW9uLgotCQkJCX0KLQkJCWlmIChjbG9zZUNvbiAhPSBudWxsKSB7Ci0JCQkJY2xvc2VDb24udGVybWluYXRlU2VydmVyKCk7CS8vIFdlIGdvdCBhIGNvbm5lY3Rpb24gdG8gdGVybWluYXRlIChwcm9jZXNzIG1heSBvZiB0ZXJtaW5hdGVkIGVhcmx5LCBzbyB3ZSB3b3VsZCBub3QgaGF2ZSBhIGNvbm4gdGhlbikuCi0JCQl9Ci0JCQlmQ29ubmVjdGlvblBvb2wuY2xlYXIoKTsKLQkJCWZTZXJ2ZXJQb3J0ID0gMDsKLQkJCQotCQkJaWYgKGZQcm9jZXNzICE9IG51bGwgJiYgIWZSZWdpc3RyeUNvbnRyb2xsZXIuaW5TaHV0RG93bigpKSB7Ci0JCQkJdGpvYiA9IG5ldyBUZXJtaW5hdGVQcm9jZXNzKGZQcm9jZXNzKTsKLQkJCQl0am9iLnNldFN5c3RlbSh0cnVlKTsKLQkJCQl0am9iLnNjaGVkdWxlKCk7Ci0JCQkJZlByb2Nlc3MgPSBudWxsOwotCQkJfQotCQl9Ci0JCi0JCWlmIChmQ2FsbGJhY2tTZXJ2ZXIgIT0gbnVsbCkgewotCQkJZkNhbGxiYWNrU2VydmVyLnJlcXVlc3RTaHV0ZG93bigpOwotCQkJZkNhbGxiYWNrU2VydmVyID0gbnVsbDsJCQkJCi0JCX0KLQkJCi0JCWZDb25uZWN0aW9uUG9vbC5jbGVhcigpOwotCQlmUmVnaXN0cnlDb250cm9sbGVyLmRlcmVnaXN0ZXJSZWdpc3RyeShmUmVnaXN0cnlLZXkpOwkvLyBEZS1yZWdpc3RlciB0aGlzIHJlZ2lzdHJ5LgotCQkKLQkJaWYgKHdhaXQgJiYgdGpvYiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRqb2Iuam9pbigpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHRpbWVkIG91dCwgc28gd2UnbGwganVzdCBnbyBvbi4KLQkJCX0KLQkJfQotCX0KLQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyIHBvcnQgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKLQkJcmV0dXJuIGZTZXJ2ZXJQb3J0OwotCX0KLQkKLQkvKgotCSAqIHNldCB0aGUgc2VydmVyIHBvcnQuCi0JICovCi0Jdm9pZCBzZXRTZXJ2ZXJQb3J0KGludCBzZXJ2ZXJwb3J0KSB7Ci0JCWZTZXJ2ZXJQb3J0ID0gc2VydmVycG9ydDsKLQkJaWYgKHdhaXRSZWdpc3RyYXRpb25UaHJlYWQgIT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAod2FpdFJlZ2lzdHJhdGlvblRocmVhZCkgewotCQkJCQkvLyBDbG9zZSBpdCBvdXQsIHdlIGFyZSBub3cgcmVnaXN0ZXJlZAotCQkJCQlXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkIHdUaHJlYWQgPSB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkOwotCQkJCQl3YWl0UmVnaXN0cmF0aW9uVGhyZWFkID0gbnVsbDsKLQkJCQkJd1RocmVhZC5ub3RpZnlBbGwoKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZnJlZSBjb25uZWN0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gVGhyb3duIGlmIGEgY29ubmVjdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSVJFTUNvbm5lY3Rpb24gZ2V0RnJlZUNvbm5lY3Rpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCWlmICh0aHJlYWQgaW5zdGFuY2VvZiBSRU1DYWxsYmFja1RocmVhZCkgewotCQkJLy8gVGhlIGN1cnJlbnQgdGhyZWFkIGlzIGEgY2FsbCBiYWNrIHRocmVhZCwgc28ganVzdCByZXVzZSB0aGUgY29ubmVjdGlvbi4KLQkJCS8vIEJ1dCB0aGlzIHRocmVhZCBjb3VsZCBhY3R1YWxseSBiZSB0cnlpbmcgdG8gYWNjZXNzIGFub3RoZXIgcmVnaXN0cnkuCi0JCQkvLyBTbyBpZiB0aGlzIHRocmVhZCBpcyBmb3IgdGhpcyByZWdpc3RyeSwgdXNlIGl0LCBpZiBub3QgZm9yIHRoaXMgcmVnaXN0cnksIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLgotCQkJLy8gQnV0IGlmIGZvciB0aGlzIHJlZ2lzdHJ5IEFORCBpcyBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIHdlIG5lZWQgYSBmcmVzaCBjb25uZWN0aW9uLgotCQkJUkVNQ2FsbGJhY2tUaHJlYWQgY2FsbGJhY2tUaHJlYWQgPSAoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZDsKLQkJCWlmIChjYWxsYmFja1RocmVhZC5yZWdpc3RyeSA9PSB0aGlzICYmICFjYWxsYmFja1RocmVhZC5pblRyYW5zYWN0aW9uKCkpIHsKLQkJCQkvLyBUaGlzIHdheSBhbnkgY2FsbHMgb3V0IHRvIHRoZSByZW1vdGUgdm0gd2lsbCBiZSBvbiBzYW1lIHRocmVhZCBhcyBjYWxsYmFjayBjYWxsZXIKLQkJCQkvLyBvbiByZW1vdGUgdm0gYmVjYXVzZSB0aGF0IHRocmVhZCBpcyB3YWl0aW5nIG9uIHRoaXMgY29ubmVjdGlvbiBmb3IgY29tbWFuZHMuCi0JCQkJSVJFTUNvbm5lY3Rpb24gYyA9IChjYWxsYmFja1RocmVhZCkuZ2V0Q29ubmVjdGlvbigpOwotCQkJCWlmIChjLmlzQ29ubmVjdGVkKCkpCi0JCQkJCXJldHVybiBjOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NhbGxiYWNrQ29ubmVjdGlvbk5vdFdvcmtpbmdfRVhDXyk7IAotCQkJfQotCQl9Ci0JCXN5bmNocm9uaXplZChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCWlmICghZkNvbm5lY3Rpb25Qb29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gKElSRU1Db25uZWN0aW9uKSBmQ29ubmVjdGlvblBvb2wucG9wKCk7Ci0JCQkvLyBlbHNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25lLgkJCQotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb24oKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIE1ha2UgYSBuZXcgY29ubmVjdGlvbi4KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSBUaHJvd24gaWYgY29ubmVjdGlvbiBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVJFTUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQkvLyBJZiB3ZSBoYXZlIGEgc2VydmVyIHBvcnQsIHRoZW4gdGhlIHNlcnZlciBpcyBwcm9iYWJseSBvcGVuLiBJZiB3ZSBkb24ndCB0aGVuIHRoZXJlIGlzIG5vIHNlcnZlci4KLQkJaWYgKGZTZXJ2ZXJQb3J0ICE9IDApIHsKLQkJCS8vIFdlIGFyZSBwdXR0aW5nIGl0IG9mZiBpbnRvIGEgdGhyZWFkIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRpbWVvdXQgY2FwYWJpbGl0aWVzIG9uIGdldHRpbmcgYSBzb2NrZXQuCi0JCQkvLyBTbyB3ZSBuZWVkIHRvIGFsbG93IGZvciB0aGF0LgotCQkJZmluYWwgU29ja2V0W10gc2NBcnJheSA9IG5ldyBTb2NrZXRbMV07Ci0JCQlmaW5hbCBib29sZWFuW10gd2FpdGluZyA9IG5ldyBib29sZWFuW10ge3RydWV9OwotCQkJVGhyZWFkIGRvSXQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTb2NrZXQgc2MgPSBuZXcgU29ja2V0KCJsb2NhbGhvc3QiLCBmU2VydmVyUG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJCWlmICh3YWl0aW5nWzBdKQotCQkJCQkJCQlzY0FycmF5WzBdID0gc2M7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzYy5jbG9zZSgpOwkvLyBXZSBhcmUgbm8gbG9uZ2VyIHdhaXRpbmcgb24gdGhpcyB0aHJlYWQgc28gY2xvc2UgdGhlIHNvY2tldCBzaW5jZSBubyBvbmUgd2lsbCB1c2UgaXQuCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlkb0l0LnN0YXJ0KCk7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCWRvSXQuam9pbighZk5vVGltZW91dHMgPyA2MDAwMCA6IDApOwotCQkJCQlzeW5jaHJvbml6ZWQgKGRvSXQpIHsKLQkJCQkJCXdhaXRpbmdbMF0gPSBmYWxzZTsJLy8gVG8gbGV0IGl0IGtub3cgd2UgYXJlIG5vIGxvbmdlciB3YWl0aW5nCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHNjQXJyYXlbMF0gPT0gbnVsbCkgIHsKLQkJCQkvLyBMb2cgd2hlcmUgd2UgYXJlIGF0IHNvIHdlIGNhbiBrbm93IHdoZXJlIGl0IHdhcyB3ZSBkb3duLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ29ubmVjdGlvbkNyZWF0aW9uRmFpbGVkX0lORk9fKSkpOwkgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db3VsZE5vdENyZWF0ZVNvY2tldENvbm5lY3Rpb25Ub1JlbW90ZVZNX0VYQ18pOwkvLyBDb3VsZG4ndCBnZXQgb25lLCBwcm9iYWJseSBzZXJ2ZXIgaXMgZG93bi4gLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgUkVNQ29ubmVjdGlvbihzY0FycmF5WzBdLCBmTm9UaW1lb3V0cyk7Ci0JCQlpZiAoY29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKQotCQkJCXJldHVybiBjb25uZWN0aW9uOwotCQkJCQotCQkJLy8gRmFpbGVkLCBjbG9zZSB0aGUgc29ja2V0LiAKLQkJCXRyeSB7Ci0JCQkJc2NBcnJheVswXS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9IGVsc2UKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJObyBTZXJ2ZXIgdG8gcmV0cmlldmUgYSBjb25uZWN0aW9uLiIsIG51bGwpKTsJLy8vJE5PTi1OTFMtMSQKLQkJCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db3VsZE5vdENyZWF0ZVNvY2tldENvbm5lY3Rpb25Ub1JlbW90ZVZNX0VYQ18pOyAKLQl9Ci0JCSAKLQkvKioKLQkgKiBGcmVlIHRoZSBjb25uZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmV0dXJuQ29ubmVjdGlvbihJUkVNQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCWlmIChjb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKLQkJCVRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJaWYgKCEodGhyZWFkIGluc3RhbmNlb2YgUkVNQ2FsbGJhY2tUaHJlYWQpIHx8ICgoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZCkuZ2V0Q29ubmVjdGlvbigpICE9IGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBXZSBhcmUgbm90IGEgY2FsbGJhY2sgdGhyZWFkLCBvciB3ZSBhcmUgYnV0IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBmb3IgdGhlIHRocmVhZCwgdGhlbiB0aGUgY29ubmVjdGlvbgotCQkJCS8vIGNhbiBiZSByZXR1cm5lZC4KLQkJCQlzeW5jaHJvbml6ZWQgKGZDb25uZWN0aW9uUG9vbCkgewotCQkJCQlpZiAoZkNvbm5lY3Rpb25Qb29sLnNpemUoKSA8IE5VTUJFUl9GUkVFX0NPTk5FQ1RJT05TKQotCQkJCQkJZkNvbm5lY3Rpb25Qb29sLnB1c2goY29ubmVjdGlvbik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsJLy8gV2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBtb3JlIHRoYW4gZml2ZSBmcmVlIGNvbm5lY3Rpb25zLgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWxlYXNlIHRoaXMgY29ubmVjdGlvbi4gVGhpcyBtZWFucyBjbG9zZSBpdCBvdXQuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDb25uZWN0aW9uKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGNvbm5lY3Rpb25Db3VudCgpIHsKLQkJc3luY2hyb25pemVkIChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCXJldHVybiBmQ29ubmVjdGlvblBvb2wuc2l6ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1SZWdpc3RyeUNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUmVnaXN0cnlDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDVkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1SZWdpc3RyeUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb250cm9sbGVyIGZvciBhbGwgb2YgdGhlIHJlZ2lzdHJpZXMuCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgewotCQotCXByaXZhdGUgTWFwIGZBY3RpdmVSZWdpc3RyaWVzID0gbmV3IEhhc2hNYXAoKTsJLy8gQWNjZXNzIHRvIHRoaXMgbXVzdCBiZSBzeW5jKFJFTVJlZ2lzdHJ5Q29udHJvbGxlcikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENMRUFOVVBfSU5URVJWQUwgPSA2MDAwMGw7CS8vIFRoZSBpbnRlcnZhbCBiZXR3ZWVuIGNsZWFuIHVwIGpvYiBleGVjdXRpb24uCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5TaHV0ZG93bjsJLy8gQXJlIHdlIGluIHNodXRkb3duIG1vZGUuIFRlcm1pbmF0ZSByZWdpc3RyaWVzIHJ1bnMgZGlmZmVyZW50bHkgaW4gc2h1dGRvd24gbW9kZS4KLQkKLQkvLyBUaHJlYWQgdG8gY2xlYW4gdXAgR0MnZCBwcm94aWVzLiBSdW5zIGFzIGEgZGFlbW9uIGF0IHRoZSBsb3dlc3QgcHJpb3JpdHkKLQlwcml2YXRlIEpvYiBwcm9jZXNzUXVldWVKb2I9IG5ldyBKb2IoUHJveHlSZW1vdGVNZXNzYWdlcy5DbGVhbnVwSm9iX3RpdGxlKSB7IAotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtKSB7Ci0JCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSByZWdpc3RyaWVzID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKFJFTVJlZ2lzdHJ5Q29udHJvbGxlci50aGlzKSB7Ci0JCQkJCS8vIFRoaXMgbGlzdCBtYXkgYmUgdXBkYXRlZCBieSBvdGhlcnMsIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkKLQkJCQkJLy8gb3IgZWxzZSB3ZSBjb3VsZCBnZXQgYSBmYWlsdXJlLgotCQkJCQlyZWdpc3RyaWVzID0gCi0JCQkJCQkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSkgZkFjdGl2ZVJlZ2lzdHJpZXMudmFsdWVzKCkudG9BcnJheSgKLQkJCQkJCQluZXcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbZkFjdGl2ZVJlZ2lzdHJpZXMuc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIHJlZ2lzdHJpZXNbaV0uZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5wcm9jZXNzUXVldWUoKTsJCQkJCQotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFdoZW4gZGVidWdnaW5nLCBnZXRCZWFuUHJveHlGYWN0b3J5IGNhbiB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZAotCQkJCQkJLy8geWV0IHdoZW4gdGhlIHRocmVhZCB3YWtlcyB1cCwgdGhvdWdoIHRoZSByZWdpc3RyeSBoYXMgYmVlbiByZWdpc3RlcmVkLiBJdCBoYXMgdG8gZG8gd2l0aCBpdCAKLQkJCQkJCS8vIGNhbiB0YWtlIHNpZ25pZmljYW50IHRpbWUgZm9yIHRoZSB1c2VyIHRvIHN0YXJ0IHVwIHRoZSBkZWJ1Z2dlciwgYW5kIGR1cmluZyB0aGF0IHRpbWUgdGhpcwotCQkJCQkJLy8gdGhyZWFkIGNvdWxkIGtpY2sgaW4uCi0JCQkJCX0KLQkJCQl9Ci0JCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCWlmICghbS5pc0NhbmNlbGVkKCkpCi0JCQkJCXRoaXMuc2NoZWR1bGUoQ0xFQU5VUF9JTlRFUlZBTCk7CS8vIFNjaGVkdWxlIHRvIHN0YXJ0IGFnYWluIGluIG9uZSBtaW51dGUuCi0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JfTsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgUkVNUmVnaXN0cnlDb250cm9sbGVyKCkgewotCi0JCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmFkZFByb3h5U2h1dGRvd25MaXN0ZW5lcihuZXcgUHJveHlQbHVnaW4uSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4uSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciNzaHV0ZG93bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQkJCVJFTVJlZ2lzdHJ5Q29udHJvbGxlci50aGlzLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW1hc3RlclRocmVhZCA9IG5ldyBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQodGhpcyk7Ci0JCW1hc3RlclRocmVhZC5zdGFydCgpOwotCi0JCXByb2Nlc3NRdWV1ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7CS8vIFNvIHRoYXQgaXQgd29uJ3Qgc2hvdyBwcm9jZXNzaW5nIGluIHByb2Nlc3Mgdmlldy4gTm90IG9mIGludGVyZXN0IHRvIGdlbmVyYWwgdXNlcnMuCi0JCXByb2Nlc3NRdWV1ZUpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlwcm9jZXNzUXVldWVKb2Iuc2NoZWR1bGUoQ0xFQU5VUF9JTlRFUlZBTCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgd2UgYXJlIHNodXR0aW5nIGRvd24gb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpblNodXREb3duKCkgewotCQlyZXR1cm4gaW5TaHV0ZG93bjsKLQl9Ci0JCi0JLyoKLQkgKiBBZGQgcmVnaXN0cnkgdG8gbGlzdCBvZiBhY3RpdmUuIFJldHVybiBhIHVuaXF1ZSBudW1iZXIgdG8gYmUgdGhlIGtleS4KLQkgKiBQYWNrYWdlLXByb3RlY3RlZCBzbyB0aGF0IG9ubHkgbG9jYWxzIGNhbiBhY2Nlc3MgaXQuCi0JICovCi0Jc3luY2hyb25pemVkIEludGVnZXIgcmVnaXN0ZXJSZWdpc3RyeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJCi0JCUludGVnZXIgaGFzaGNvZGUgPSBuZXcgSW50ZWdlcihyZWdpc3RyeS5oYXNoQ29kZSgpKTsJCQotCQl3aGlsZSAodHJ1ZSkgewotCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZXhpc3RpbmcgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGZBY3RpdmVSZWdpc3RyaWVzLmdldChoYXNoY29kZSk7Ci0JCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkKLQkJCQlicmVhazsJLy8gTm90IHlldCByZWdpc3RlcmVkLCB1c2UgdXNlIHRoZSBoYXNoY29kZQotCQkJZWxzZSBpZiAoZXhpc3RpbmcgIT0gcmVnaXN0cnkpCi0JCQkJaGFzaGNvZGUgPSBuZXcgSW50ZWdlcihoYXNoY29kZS5pbnRWYWx1ZSgpKzEpOwkJCQkJCQotCQkJZWxzZQotCQkJCXJldHVybiBoYXNoY29kZTsJLy8gU2FtZSBndXksIHVzZSB0aGUgaGFzaGNvZGUuCi0JCX0KLQkJCi0JCWZBY3RpdmVSZWdpc3RyaWVzLnB1dChoYXNoY29kZSwgcmVnaXN0cnkpOwotCQlyZXR1cm4gaGFzaGNvZGU7Ci0JfQotCQotCS8qCi0JICogZGVyZWdpc3RlciB0aGUgcmVnaXN0cnkuCi0JICovCi0Jc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlclJlZ2lzdHJ5KEludGVnZXIga2V5KSB7Ci0JCWZBY3RpdmVSZWdpc3RyaWVzLnJlbW92ZShrZXkpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBrZXkKLQkgKi8KLQlzeW5jaHJvbml6ZWQgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZkFjdGl2ZVJlZ2lzdHJpZXMuZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIE1hc3RlciBzZXJ2ZXIgdGhyZWFkLiBIYW5kbGVzIGtlZXAtYWxpdmUgcmVxdWVzdHMgYW5kIHJlZ2lzdGVyIHJlbW90ZSBzZXJ2ZXIgdGhyZWFkcy4KLQkgKiBJdCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBuZWVkZWQuCi0JICovCi0JcHJvdGVjdGVkIFJFTU1hc3RlclNlcnZlclRocmVhZCBtYXN0ZXJUaHJlYWQ7Ci0KLQkvKgotCSAqIFNodXRzIGRvd24gdGhpcyBwbHVnLWluIGFuZCBkaXNjYXJkcyBhbGwgcGx1Zy1pbiBzdGF0ZS4KLQkgKgotCSAqIEluIHRoaXMgY2FzZSwgdGVybWluYXRlIGFsbCBvZiB0aGUgYWN0aXZlIHJlZ2lzdHJpZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaHV0ZG93bi4KLQkgKiBEb24ndCB3YW50IHRoZW0gaGFuZ2luZyBhcm91bmQgYWZ0ZXIgdGVybWluYXRpb24gb2YgdGhlIGRlc2t0b3AuCi0JICovCi0Jdm9pZCBzaHV0ZG93bigpIHsKLQkJCi0JCXN5bmNocm9uaXplZChwcm9jZXNzUXVldWVKb2IpIHsKLQkJCXByb2Nlc3NRdWV1ZUpvYi5jYW5jZWwoKTsKLQkJfQotCQkJCi0JCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W10gcmVnaXN0cmllcyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gVGhpcyBsaXN0IHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgdGVybWluYXRlUmVnaXN0cnksIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkKLQkJCS8vIG9yIGVsc2Ugd2UgZ2V0IGEgZmFpbHVyZS4KLQkJCXJlZ2lzdHJpZXMgPSAKLQkJCQkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSkgZkFjdGl2ZVJlZ2lzdHJpZXMudmFsdWVzKCkudG9BcnJheSgKLQkJCQkJbmV3IFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W2ZBY3RpdmVSZWdpc3RyaWVzLnNpemUoKV0pOwotCQl9Ci0JCQotCQlpblNodXRkb3duID0gdHJ1ZTsJLy8gV2UgYXJlIG5vdyBpbiBzaHV0ZG93biBtb2RlLgotCQkvLyBJbiBzaHV0ZG93biBtb2RlIHRoZSByZWdpc3RyaWVzIHdpbGwgbm90IGNyZWF0ZSB0aGUgam9iIHRoYXQgd2FpdHMgZm9yIHRoZSBwcm9jZXNzCi0JCS8vIHRvIHRlcm1pbmF0ZSwgYW5kIGlmIGl0IGRvZXNuJ3QgaW4gMS41IHNlY3MgaXQgZG9lcyBhIGZvcmNlLgotCQkvLyBJbnN0ZWFkIHdoYXQgd2Ugd2lsbCBkbyBpcyBzaHV0ZG93biBhbGwgb2YgdGhlIHJlZ2lzdHJpZXMuIElmIHRoZXkgZG9uJ3QKLQkJLy8gc2h1dGRvd24gb24gdGhlaXIgb3duIHRoZW4gdGhleSBzdGF5IG91dCB0aGVyZS4gQnV0IHRoZXkgZG8gaGF2ZSBhbgotCQkvLyBpbnRlcm5hbCB0aW1lciB0aGF0IGNoZWNrcyBldmVyeSBmaXZlIG1pbnV0ZXMgdG8gc2VlIGlmIHRoZSBob3N0IGlzIAotCQkvLyBzdGlsbCB0aGVyZSwgYW5kIGlmIGl0IGlzbid0IHRoZXkgd2lsbCBzaHV0IHRoZW1zZWx2ZXMgZG93bi4gVGhleQotCQkvLyB3b3VsZCBoYXZlIHRvIGJlIHJlYWxseSBob3NlZCBpZiB0aGUgc3VpY2lkZSB0aW1lciB3YXNuJ3Qgd29ya2luZy4KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykKLQkJCXJlZ2lzdHJpZXNbaV0udGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCQotCQlpZiAobWFzdGVyVGhyZWFkICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbWFzdGVyVGhyZWFkLnJlcXVlc3RTaHV0ZG93bigpOwotCQkJCW1hc3RlclRocmVhZC5qb2luKDIwMDAwKTsJLy8gV2FpdCAyMCBzZWNvbmRzIGZvciBldmVyeXRoaW5nIHRvIGdvIGRvd24uCi0JCQkJbWFzdGVyVGhyZWFkID0gbnVsbDsJCQkJCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlwcm9jZXNzUXVldWVKb2Iuam9pbigpOwotCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkuY2FuY2VsQWxsVGVybWluYXRlSm9icygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hc3RlciBzb2NrZXQgcG9ydCBudW1iZXIuCi0JICovCi0JcHVibGljIGludCBnZXRNYXN0ZXJTb2NrZXRQb3J0KCkgewotCQlyZXR1cm4gbWFzdGVyVGhyZWFkICE9IG51bGwgPyBtYXN0ZXJUaHJlYWQuZ2V0TWFzdGVyU29ja2V0KCkuZ2V0TG9jYWxQb3J0KCkgOiAtMTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0Q2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2VhNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBTaG9ydC5jbGFzcy4KLSAqLwotY2xhc3MgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTVNob3J0Q2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBTaG9ydCBhU2hvcnQpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFTaG9ydCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnNob3J0Q2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChTaG9ydCkgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNlNjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgU2hvcnQuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlNIT1JUX0NMQVNTKSwgU2hvcnQuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBTaG9ydCgoc2hvcnQpMCkpOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IFNob3J0KChzaG9ydCkxKSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBTaG9ydCgoc2hvcnQpMikpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBTaG9ydCgoc2hvcnQpMykpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZVNob3J0QmVhblByb3h5KFNob3J0IGFTaG9ydCkgewotCXN3aXRjaChhU2hvcnQuc2hvcnRWYWx1ZSgpKSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhU2hvcnQpOwotCX0KLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYSBTaG9ydCBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgU2hvcnQuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVTaG9ydEJlYW5Qcm94eSgoU2hvcnQpIGFOdW1iZXIpOwotfQkKLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZVNob3J0QmVhblByb3h5KG5ldyBTaG9ydCh2YWx1ZS5hU2hvcnQpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydFR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiYzFlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciB0aGUgcHJpbWl0aXZlICJzaG9ydCIuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1TaG9ydFR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgc2hvcnQgZlNob3J0OwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNU2hvcnRUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgc2hvcnQgYVNob3J0KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmU2hvcnQgPSBhU2hvcnQ7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNU2hvcnRUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZlNob3J0ID09ICgoUkVNU2hvcnRUeXBlQmVhblByb3h5KSBhbk9iamVjdCkuc2hvcnRWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFNob3J0KQotCQlyZXR1cm4gZlNob3J0ID09ICgoU2hvcnQpIGFuT2JqZWN0KS5zaG9ydFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTVNob3J0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZTaG9ydCA9PSAoKFJFTVNob3J0VHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuc2hvcnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZTaG9ydDsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZlNob3J0OwotfQotLyoqCi0gKiBsb25nVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gZlNob3J0OwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IFNob3J0KGZTaG9ydCk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmU2hvcnQ7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZTaG9ydCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnNob3J0VHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZlNob3J0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJiZDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgU2hvcnQuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSwgU2hvcnQuVFlQRS5nZXROYW1lKCkpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDApOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDEpOwotCXR3b1Byb3h5ID0gbmV3IFJFTVNob3J0VHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChzaG9ydCkgMik7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDMpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZVNob3J0QmVhblByb3h5KHNob3J0IGFTaG9ydCkgewotCXN3aXRjaChhU2hvcnQpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNU2hvcnRUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYVNob3J0KTsKLQl9Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBzaG9ydCBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19CQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZVNob3J0QmVhblByb3h5KHZhbHVlLmFTaG9ydCk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKHNob3J0KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBzaG9ydCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0Jc2hvcnQgYVNob3J0OwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihzaG9ydCkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihzaG9ydCkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhU2hvcnQgPSB2LnNob3J0VmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhU2hvcnQgPSBTaG9ydC5kZWNvZGUodHJpbSkuc2hvcnRWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgc2hvcnQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYVNob3J0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZmFhOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogUkVNIFN0YW5kYXJkIFByb3h5IGNvbnN0YW50cy4KLSAqCi0gKiBVc2UgdGhlIHN0YXRpYyBhY2Nlc3NvciBtZXRob2QgKGdldENvbnN0YW50cygpKSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIAotICogY29uc3RhbnRzIGluc3RhbmNlIGZvciB0aGUgcmVnaXN0cnkuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHVudGlsIHRoZQotICogdGhlIGNvbnN0YW50cyBhcmUgbmVlZGVkLCB0aGV5IGFyZW4ndCByZWdpc3RlcmVkLgotICoKLSAqIFRoZXJlIGFyZSBzb21lIHN0YW5kYXJkIHV0aWxpdHkgZnVuY3Rpb25zIHRvby4KLSAqCi0gKiBUaGlzIGlzIGZpbmFsIGJlY2F1c2UgdGhpcyBjYW4ndCBiZSBleHRlbmRlZC4gVGhpcyBzcGVjaWZpYyBvbmUKLSAqIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGlzIGtleS4gQW55IGV4dGVuc2lvbnMKLSAqIG11c3QgYmUgZG9uZSBpbiB0aGVpciBvd24gY29uc3RhbnRzIGFuZCByZWdpc3RyeSBrZXkuCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCA0OjQ3OjQ4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR0lTVFJZX0tFWSA9IG5ldyBPYmplY3QoKTsKLQkJCi0JcHJpdmF0ZSBmaW5hbCBQcm94eUZhY3RvcnlSZWdpc3RyeSBmUmVnaXN0cnk7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzTmV3SW5zdGFuY2U7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RmllbGQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRGaWVsZDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZEZpZWxkczsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RmllbGRzOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXRDb25zdHJ1Y3RvcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXRDb25zdHJ1Y3RvcnM7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yczsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXRNZXRob2RzOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkTWV0aG9kczsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZDsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVNZXRob2Q7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzSXNBc3NpZ25hYmxlRnJvbTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmT2JqZWN0VG9TdHJpbmc7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk9iamVjdEVxdWFsczsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmVGhyb3dhYmxlTG9jYWxpemVkTWVzc2FnZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmVGhyb3dhYmxlTWVzc2FnZTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kRGVjbGFyaW5nQ2xhc3NNZXNzYWdlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2RNZXRob2ROYW1lTWVzc2FnZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kUGFyYW1ldGVyVHlwZXNNZXNzYWdlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZNZXRob2RSZXR1cm5UeXBlTWVzc2FnZTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQWNjZXNzaWJsZUlzQWNjZXNzaWJsZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQWNjZXNzaWJsZVNldEFjY2Vzc2libGU7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldFR5cGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0Qnl0ZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRCb29sZWFuOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldENoYXI7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0RG91YmxlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldEZsb2F0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldEludDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRTaG9ydDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRMb25nOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRTZXQ7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNvbnN0cnVjdG9yTmV3SW5zdGFuY2U7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZTsKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlOZXdJbnN0YW5jZU11bHRpRGltZW5zaW9uczsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRMZW5ndGg7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldEJ5dGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0Qm9vbGVhbjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRDaGFyOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldERvdWJsZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRGbG9hdDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRJbnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0U2hvcnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0TG9uZzsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5U2V0OwkKLQkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0Qnl0ZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRCb29sZWFuOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldENoYXI7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0RG91YmxlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldEZsb2F0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldEludDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRTaG9ydDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRMb25nOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJTZXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyRXF1YWxzOwotCQotLyoqCi0gKiBHZXQgdGhlIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3RyeS4KLSAqLwotcHVibGljIHN0YXRpYyBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBnZXRDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSAoUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudHMoUkVHSVNUUllfS0VZLCBjb25zdGFudHMgPSBuZXcgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMocmVnaXN0cnkpKTsJCi0JcmV0dXJuIGNvbnN0YW50czsKLX0KLQotCi1wcml2YXRlIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoKTsKLQlmUmVnaXN0cnkgPSByZWdpc3RyeTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc05ld0luc3RhbmNlKCkgewotCS8vIFdlIGFjdHVhbGx5IG5lZWQgYSBzcGVjaWFsIG5ldyBpbnN0YW5jZSBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhY2Nlc3Mgb3V0c2lkZSBvZiBzZWN1cml0eS4gRm9yIG91ciBwdXJwb3NlcyBzZWN1cml0eSBkb2Vzbid0IG1hdHRlciBmb3IgY29uc3RydWN0aW9uLgotCWlmIChmQ2xhc3NOZXdJbnN0YW5jZSA9PSBudWxsKQotCQlmQ2xhc3NOZXdJbnN0YW5jZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5DbGFzc0hlbHBlciIsICJuZXdJbnN0YW5jZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzTmV3SW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NHZXRGaWVsZCgpIHsKLQlpZiAoZkNsYXNzR2V0RmllbGQgPT0gbnVsbCkKLQkJZkNsYXNzR2V0RmllbGQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXRGaWVsZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc0dldEZpZWxkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzQ29uc3RydWN0b3IoKSB7Ci0JaWYgKGZDbGFzc0dldENvbnN0cnVjdG9yID09IG51bGwpCi0JCWZDbGFzc0dldENvbnN0cnVjdG9yID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0Q29uc3RydWN0b3IiLCBuZXcgU3RyaW5nW10geyJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc0dldENvbnN0cnVjdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzQ29uc3RydWN0b3JzKCkgewotCWlmIChmQ2xhc3NHZXRDb25zdHJ1Y3RvcnMgPT0gbnVsbCkKLQkJZkNsYXNzR2V0Q29uc3RydWN0b3JzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0Q29uc3RydWN0b3JzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ2xhc3NHZXRDb25zdHJ1Y3RvcnM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9yKCkgewotCWlmIChmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3IgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXREZWNsYXJlZENvbnN0cnVjdG9yIiwgbmV3IFN0cmluZ1tdIHsiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkQ2xhc3NDb25zdHJ1Y3RvcnMoKSB7Ci0JaWYgKGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzSXNBc3NpZ25hYmxlRnJvbSgpIHsKLQlpZiAoZkNsYXNzSXNBc3NpZ25hYmxlRnJvbSA9PSBudWxsKQotCQlmQ2xhc3NJc0Fzc2lnbmFibGVGcm9tID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiaXNBc3NpZ25hYmxlRnJvbSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzSXNBc3NpZ25hYmxlRnJvbTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRPYmplY3RUb1N0cmluZygpIHsKLQlpZiAoZk9iamVjdFRvU3RyaW5nID09IG51bGwpCi0JCWZPYmplY3RUb1N0cmluZyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsICJ0b1N0cmluZyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZk9iamVjdFRvU3RyaW5nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE9iamVjdEVxdWFscygpIHsKLQlpZiAoZk9iamVjdEVxdWFscyA9PSBudWxsKQotCQlmT2JqZWN0RXF1YWxzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgImVxdWFscyIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZPYmplY3RFcXVhbHM7Ci19Ci1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFRocm93YWJsZUxvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JaWYgKGZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlID09IG51bGwpCi0JCWZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuVGhyb3dhYmxlIiwgImdldExvY2FsaXplZE1lc3NhZ2UiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFRocm93YWJsZU1lc3NhZ2UoKSB7Ci0JaWYgKGZUaHJvd2FibGVNZXNzYWdlID09IG51bGwpCi0JCWZUaHJvd2FibGVNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuVGhyb3dhYmxlIiwgImdldE1lc3NhZ2UiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZUaHJvd2FibGVNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSgpIHsKLQlpZiAoZk1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kRGVjbGFyaW5nQ2xhc3NNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0RGVjbGFyaW5nQ2xhc3MiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2RNZXRob2ROYW1lTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIsICJnZXROYW1lIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2U7Ci19CQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSgpIHsKLQlpZiAoZk1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kUGFyYW1ldGVyVHlwZXNNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0UGFyYW1ldGVyVHlwZXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2RSZXR1cm5UeXBlTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIsICJnZXRSZXR1cm5UeXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QWNjZXNzaWJsZUlzQWNjZXNzaWJsZSgpIHsKLQlpZiAoZkFjY2Vzc2libGVJc0FjY2Vzc2libGUgPT0gbnVsbCkKLQkJZkFjY2Vzc2libGVJc0FjY2Vzc2libGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QiLCAiaXNBY2Nlc3NpYmxlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQWNjZXNzaWJsZUlzQWNjZXNzaWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSgpIHsKLQlpZiAoZkFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlID09IG51bGwpCi0JCWZBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCIsICJzZXRBY2Nlc3NpYmxlIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0VHlwZSgpIHsKLQlpZiAoZkZpZWxkR2V0VHlwZSA9PSBudWxsKQotCQlmRmllbGRHZXRUeXBlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRUeXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmRmllbGRHZXRUeXBlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0KCkgewotCWlmIChmRmllbGRHZXQgPT0gbnVsbCkKLQkJZkZpZWxkR2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRCeXRlKCkgewotCWlmIChmRmllbGRHZXRCeXRlID09IG51bGwpCi0JCWZGaWVsZEdldEJ5dGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldEJ5dGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRCeXRlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0Qm9vbGVhbigpIHsKLQlpZiAoZkZpZWxkR2V0Qm9vbGVhbiA9PSBudWxsKQotCQlmRmllbGRHZXRCb29sZWFuID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRCb29sZWFuIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0Qm9vbGVhbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldENoYXIoKSB7Ci0JaWYgKGZGaWVsZEdldENoYXIgPT0gbnVsbCkKLQkJZkZpZWxkR2V0Q2hhciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0Q2hhciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldENoYXI7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXREb3VibGUoKSB7Ci0JaWYgKGZGaWVsZEdldERvdWJsZSA9PSBudWxsKQotCQlmRmllbGRHZXREb3VibGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldERvdWJsZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldERvdWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldEZsb2F0KCkgewotCWlmIChmRmllbGRHZXRGbG9hdCA9PSBudWxsKQotCQlmRmllbGRHZXRGbG9hdCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0RmxvYXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRGbG9hdDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldEludCgpIHsKLQlpZiAoZkZpZWxkR2V0SW50ID09IG51bGwpCi0JCWZGaWVsZEdldEludCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0SW50IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0SW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0TG9uZygpIHsKLQlpZiAoZkZpZWxkR2V0TG9uZyA9PSBudWxsKQotCQlmRmllbGRHZXRMb25nID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRMb25nIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0TG9uZzsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldFNob3J0KCkgewotCWlmIChmRmllbGRHZXRTaG9ydCA9PSBudWxsKQotCQlmRmllbGRHZXRTaG9ydCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0U2hvcnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRTaG9ydDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZFNldCgpIHsKLQlpZiAoZkZpZWxkU2V0ID09IG51bGwpCi0JCWZGaWVsZFNldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAic2V0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZGaWVsZFNldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb25zdHJ1Y3Rvck5ld0luc3RhbmNlKCkgewotCWlmIChmQ29uc3RydWN0b3JOZXdJbnN0YW5jZSA9PSBudWxsKQotCQlmQ29uc3RydWN0b3JOZXdJbnN0YW5jZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IiLCAibmV3SW5zdGFuY2UiLCBuZXcgU3RyaW5nW10geyJbTGphdmEubGFuZy5PYmplY3Q7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ29uc3RydWN0b3JOZXdJbnN0YW5jZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSgpIHsKLQlpZiAoZkNvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXNNZXNzYWdlID09IG51bGwpCi0JCWZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IiLCAiZ2V0UGFyYW1ldGVyVHlwZXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uKCkgewotCWlmIChmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbiA9PSBudWxsKQotCQlmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbiA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAibmV3SW5zdGFuY2UiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuQ2xhc3MiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbigpIHsKLQlpZiAoZkFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbnMgPT0gbnVsbCkKLQkJZkFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbnMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgIm5ld0luc3RhbmNlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLkNsYXNzIiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb25zOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0TGVuZ3RoKCkgewotCWlmIChmQXJyYXlHZXRMZW5ndGggPT0gbnVsbCkKLQkJZkFycmF5R2V0TGVuZ3RoID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRMZW5ndGgiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQXJyYXlHZXRMZW5ndGg7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXQoKSB7Ci0JaWYgKGZBcnJheUdldCA9PSBudWxsKQotCQlmQXJyYXlHZXQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldEJ5dGUoKSB7Ci0JaWYgKGZBcnJheUdldEJ5dGUgPT0gbnVsbCkKLQkJZkFycmF5R2V0Qnl0ZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0Qnl0ZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldEJ5dGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXRCb29sZWFuKCkgewotCWlmIChmQXJyYXlHZXRCb29sZWFuID09IG51bGwpCi0JCWZBcnJheUdldEJvb2xlYW4gPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldEJvb2xlYW4iLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRCb29sZWFuOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0Q2hhcigpIHsKLQlpZiAoZkFycmF5R2V0Q2hhciA9PSBudWxsKQotCQlmQXJyYXlHZXRDaGFyID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRDaGFyIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0Q2hhcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldERvdWJsZSgpIHsKLQlpZiAoZkFycmF5R2V0RG91YmxlID09IG51bGwpCi0JCWZBcnJheUdldERvdWJsZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0RG91YmxlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0RG91YmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0RmxvYXQoKSB7Ci0JaWYgKGZBcnJheUdldEZsb2F0ID09IG51bGwpCi0JCWZBcnJheUdldEZsb2F0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRGbG9hdCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldEZsb2F0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0SW50KCkgewotCWlmIChmQXJyYXlHZXRJbnQgPT0gbnVsbCkKLQkJZkFycmF5R2V0SW50ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRJbnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXRMb25nKCkgewotCWlmIChmQXJyYXlHZXRMb25nID09IG51bGwpCi0JCWZBcnJheUdldExvbmcgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldExvbmciLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRMb25nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0U2hvcnQoKSB7Ci0JaWYgKGZBcnJheUdldFNob3J0ID09IG51bGwpCi0JCWZBcnJheUdldFNob3J0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRTaG9ydCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldFNob3J0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5U2V0KCkgewotCWlmIChmQXJyYXlTZXQgPT0gbnVsbCkKLQkJZkFycmF5U2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJzZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQlyZXR1cm4gZkFycmF5U2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0KCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXQgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0Qnl0ZSgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0Qnl0ZSA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRCeXRlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldEJ5dGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldEJ5dGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJHZXRCb29sZWFuKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRCb29sZWFuID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEJvb2xlYW4gPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZ2V0Qm9vbGVhbiIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0Qm9vbGVhbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldENoYXIoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldENoYXIgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0Q2hhciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRDaGFyIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRDaGFyOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0RG91YmxlKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXREb3VibGUgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0RG91YmxlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldERvdWJsZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0RG91YmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0RmxvYXQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldEZsb2F0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEZsb2F0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldEZsb2F0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRGbG9hdDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldEludCgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0SW50ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEludCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRJbnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldEludDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldExvbmcoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldExvbmcgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0TG9uZyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRMb25nIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRMb25nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0U2hvcnQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldFNob3J0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldFNob3J0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldFNob3J0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRTaG9ydDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlclNldCgpIHsKLQlpZiAoZkFycmF5SGVscGVyU2V0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlclNldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJzZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIiwgImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCXJldHVybiBmQXJyYXlIZWxwZXJTZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJFcXVhbHMoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckVxdWFscyA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJFcXVhbHMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZXF1YWxzIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckVxdWFsczsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0dldERlY2xhcmVkRmllbGQoKSB7Ci0KLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRGaWVsZCA9PSBudWxsKQotCQkJZkNsYXNzR2V0RGVjbGFyZWRGaWVsZCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkRmllbGQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZEZpZWxkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzR2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0KLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRGaWVsZHMgPT0gbnVsbCkKLQkJCWZDbGFzc0dldERlY2xhcmVkRmllbGRzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRGaWVsZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldERlY2xhcmVkRmllbGRzOwotfQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0dldEZpZWxkcygpIHsKLQotCWlmIChmQ2xhc3NHZXRGaWVsZHMgPT0gbnVsbCkKLQkJCWZDbGFzc0dldEZpZWxkcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldEZpZWxkcyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNsYXNzR2V0RmllbGRzOwotfQotCi0KLS8qKgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc01ldGhvZHMoKSB7Ci0JaWYgKGZDbGFzc0dldE1ldGhvZHMgPT0gbnVsbCkKLQkJZkNsYXNzR2V0TWV0aG9kcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldE1ldGhvZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldE1ldGhvZHM7Ci19Ci0KLS8qKgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0RlY2xhcmVkTWV0aG9kcygpIHsKLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRNZXRob2RzID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkTWV0aG9kcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkTWV0aG9kcyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNsYXNzR2V0RGVjbGFyZWRNZXRob2RzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzRGVjbGFyZWRNZXRob2QoKSB7Ci0JaWYgKGZDbGFzc0dldERlY2xhcmVkTWV0aG9kID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkTWV0aG9kID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIiwgIltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yTWV0aG9kKCkgewotCWlmIChmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciA9PSBudWxsKQotCQlmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXIiLCAiZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyIsICJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3I7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmluZENvbXBhdGlibGVNZXRob2RNZXRob2QoKSB7Ci0JaWYgKGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZU1ldGhvZCA9PSBudWxsKQotCQlmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVNZXRob2QgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyIiwgImZpbmRDb21wYXRpYmxlTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLkNsYXNzIiwgImphdmEubGFuZy5TdHJpbmciLCAiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQlyZXR1cm4gZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlTWV0aG9kOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDRkN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFRoZSBSZW1vdGUgVk0gU3RhbmRhcmQgQmVhbiBQcm94eSBGYWN0b3J5LgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTI6MDE6NDUgUE0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQlwcm90ZWN0ZWQgZmluYWwgUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmQmVhblR5cGVQcm94eUZhY3Rvcnk7CS8vIENvbnZlbmllbmNlIGZpZWxkLgotCXByb3RlY3RlZCBmaW5hbCBJUkVNQmVhblByb3h5IHZtU2VydmVyUHJveHk7Ci0KLQkKLQkvLyBXZSBuZWVkIGEgbWFwIGZvciBtYXBwaW5nIG9iamVjdCBpZCdzIHRvIHRoZSBwcm94eS4gVGhlIGVudHJ5IHdpbGwgYWN0dWFsbHkgYmUKLQkvLyBhIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5XZWFrUHJveHlSZWZlcmVuY2UuIFRoaXMgaXMgc28gdGhhdCB0aGUKLQkvLyBwcm94eSB3aWxsIG5vdCBiZSBoZWxkIHRpZ2h0bHkgYnkgdGhpcyBtYXAgYW5kIGNhbiBiZSBHQydkIGlmIG5vdCByZWZlcmVuY2VkLgotCS8vIFBlcmlvZGljYWxseSwgdGhlIHJlZmVyZW5jZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCB0byByZW1vdmUgYW55IG9mIHRoZQotCS8vIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gR0MnZCBhbmQgdGhlIHNlcnZlciB3aWxsIGJlIHRvbGQgdGhhdCBpdCBjYW4gcmVsZWFzZQotCS8vIHRoZSBJRCBvbiBpdHMgc2lkZS4KLQkvLwotCS8vIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCBhcyBzeW5jaHJvbml6ZSBvYmplY3QgYWxzbyBmb3IgYWNjZXNzIHRvIGl0LgotCS8vCi0JLy8gVGhlcmUgd2lsbCBiZSBhIGxvdyBwcmlvcml0eSBqb2IgdGhhdCB3aWxsIG9jY2FzaW9uYWxseSBwcm9jZXNzIHRoZSBHQydkIG9iamVjdHMKLQkvLyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcXVldWUgYW5kIHRoZSByZW1vdGUgdm0uIEl0IHdpbGwgbm90IHJlbW92ZSBkdXJpbmcgbG9ja2VkVHJhbnNhY3Rpb25zLgotCS8vCi0JLy8gTk9URTogQ2VydGFpbiBwcm94aWVzIG5ldmVyIGdldCBhZGRlZCB0byB0aGUgbWFwLiBUaGV5IGFyZSB0aGUKLQkvLyBzdGFuZGFyZCB0eXBlcy9jbGFzcyAoaS5lLiBudWxsLCBieXRlLCBpbnQsIGxvbmcsIHNob3J0LCBkb3VibGUsIGZsb2F0LCBieXRlLCBzdHJpbmcpLiBUaGVzZQotCS8vIGFsd2F5cyBoYXZlIHRoZSB2YWx1ZSBzYXZlZCBpbiB0aGUgcHJveHkgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIHdpdGhvdXQgZ29pbmcgYmFjawotCS8vIHRvIHRoZSBzZXJ2ZXIuIAotCXByaXZhdGUgZmluYWwgSGFzaE1hcCBmSURUb1Byb3hpZXNNYXAgPSBuZXcgSGFzaE1hcCgxMDAwKTsJLy8gTWFwIElEJ3MgdG8gcHJveGllcy4gVGhlIHByb3hpZXMgaGF2ZSB0aGVpciBpZCdzIHNvIHdlIGRvbid0IG5lZWQgYSByZXZlcnNlIG1hcAotCXByaXZhdGUgaW50IHRyYW5zYWN0aW9uTG9ja0NvdW50ID0gMDsJLy8gQ291bnQgb2YgdHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBsb2NrZWQgYWNjZXNzLiBJdCBpcyBjaGFuZ2VkIHVuZGVyIHN5bmMgY29udHJvbCBvZiBmSURUb1Byb3hpZXMgbWFwLgotCQotCS8qKgotCSAqIFRoZSBXZWFrIHJlZmVyZW5jZSB1c2VkIGZvciB0aGUgaWQgdG8gcHJveGllcyBtYXAgZm9yIHRoZSBwcm94eQotCSAqIHNvIHRoYXQgd2UgY2FuIGNsZWFuIGl0IHVwIHdoZW4gdGhlIHByb3h5IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgotCSAqCi0JICogSXQgaXMgaW1wb3J0YW50IHRoYXQgYWxsIGNoYW5nZXMgdG8gdGhlIFByb3h5UmVmIGFyZSBkb25lIHRocm91Z2ggc3luYyBvbiBmSURUb1Byb3hpZXNNYXAuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHlSZWYgZXh0ZW5kcyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgewotCQlwcml2YXRlIEludGVnZXIgaWQ7CS8vIFdlIG5lZWQgdGhlIGlkIGJlY2F1c2UgdGhpcyByZWZlcmVuY2Ugd2lsbCBiZSBvbiB0aGUgdmFsdWUgc2lkZQotCQkJCQkvLyBhbmQgbm90IHRoZSBrZXkgc2lkZSBvZiB0aGUgbWFwLCBzbyB3ZSBuZWVkIHRvIGtub3cgdGhlIGtleQotCQkJCQkvLyBzbyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCQkJCQkvLwotCQkJCQkvLyBJZiB0aGUgSUQgaXMgbnVsbCwgdGhlbiB0aGlzIG1lYW5zIHRoaXMgZW50cnkgaGFzIGJlZW4gcHJvY2Vzc2VkCi0JCQkJCS8vIGluIHNvbWUgd2F5IGFuZCBzaG91bGQgbm90IGJlIHJlbGVhc2VkIG9yIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuCi0JCXByaXZhdGUgaW50IHVzZUNudCA9IDE7CS8vIFVzYWdlL1JlZiBjb3VudC4gTmVlZGVkIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHJpZCBvZiB0b28gc29vbi4gU2luY2Ugd2UgZG9uJ3QKLQkJCQkJLy8gY3JlYXRlIGEgUHJveHlSZWYgd2l0aG91dCBhIHVzYWdlLCB3ZSBzdGFydCBpdCBvZmYgd2l0aCBvbmUuIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQKLQkJCQkJLy8gdGhlbiBvbiByZXRyaWV2YWxzIHdoZW4gbmVlZGVkIGJ5IHVzZXJzIG91dHNpZGUgb2YgdGhlIHJlbW90ZSBmYWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkJCQkJLy8gSXQgd29uJ3QgYmUgcGh5c2ljYWxseSByZWxlYXNlZCB1bnRpbCBlaXRoZXIgR0MgZ290IHJpZCBvZiBpdCwgb3IgaXQgZ29lcyB0byAwIG9yIGxlc3MKLQkJCQkJLy8gb24gYSByZWxlYXNlIHJlcXVlc3QuCi0JCQkJCQotCQlwdWJsaWMgUHJveHlSZWYoSW50ZWdlciBhbklELCBPYmplY3QgcHJveHksIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcSkgewotCQkJc3VwZXIocHJveHksIHEpOwotCQkJaWQgPSBhbklEOwotCQl9Ci0JCQotCQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQlzdXBlci5jbGVhcigpOwotCQkJaWQgPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIGludCB1c2VDbnQoKSB7Ci0JCQlyZXR1cm4gdXNlQ250OwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5jclVzZUNudCgpIHsKLQkJCXVzZUNudCsrOwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkZWNyVXNlQ250KCkgewotCQkJaWYgKC0tdXNlQ250IDwgMCkKLQkJCQl1c2VDbnQgPSAwOwotCQkJcmV0dXJuIHVzZUNudDsKLQkJfQotCX0KLQkKLQkvKiBSZWZlcmVuY2UgcXVldWUgZm9yIGNsZWFyZWQgUHJveGllcyAqLwotCXByaXZhdGUgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKCk7CQotCQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGVudHJpZXMgb24gdGhlIGlkIHRvIHByb3hpZXMgbWFwIHRoYXQgaGF2ZSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgotCSAqIEl0IGlzIHBhY2thZ2UtcHJvdGVjdGVkIGJlY2F1c2Ugb25seSBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgc2hvdWxkIGNhbGwgaXQuCi0JICovCi0Jdm9pZCBwcm9jZXNzUXVldWUoKSB7Ci0JCVByb3h5UmVmIHByOwkKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkKLQkJCQlyZXR1cm47CS8vIE1heWJlIGdvaW5nIGRvd24uCShUaGlzIGFjdHVhbGx5IGEga2x1ZGdlIGJlY2F1c2UgdGhlIHRocmVhZCBoYXBwZW5zIHRvIGJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZyb20gdGhlIHJlZ2lzdHJ5IGNvbnRyb2xsZXIpLgotCQkJCQotCQkJc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJCQlpZiAocXVldWUgPT0gbnVsbCB8fCB0cmFuc2FjdGlvbkxvY2tDb3VudCA+IDApCi0JCQkJCWJyZWFrOwkvLyBFaXRoZXIgbm8gcXVldWUgKHdlIGFyZSBjbGVhbmluZyB1cCkgb3IgaW4gYSB0cmFuc2FjdGlvbiwgc3RvcCBwcm9jZXNzaW5nIGFuZCByZXRyeSBvbiBuZXh0IHRpbWUgc2xpY2UuCi0JCQkJaWYgKChwciA9IChQcm94eVJlZikgcXVldWUucG9sbCgpKSAhPSBudWxsKSB7CQkJCQotCQkJCQlpZiAocHIuZ2V0SUQoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgYnkgc29tZSBvdGhlciBtZWFucy4JCQkJCi0JCQkJCQlmSURUb1Byb3hpZXNNYXAucmVtb3ZlKHByLmdldElEKCkpOwkJCQkJCQotCQkJCQkJcmVsZWFzZUlEKHByLmdldElEKCkuaW50VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJYnJlYWs7CS8vIFRoZXJlIGFyZSBubyBtb3JlIHdhaXRpbmcsIHNvIGxlYXZlLgotCQkJfQotCQl9Ci0JfQotCQotCQotLyoqCi0gKiBSRU1CZWFuUHJveHlGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKgotICogTm90ZTogSXQgYXNzdW1lcyB0aGUgYmVhbnR5cGUgZmFjdG9yeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuCi0gKi8KLVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JYVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeSh0aGlzKTsKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JZkJlYW5UeXBlUHJveHlGYWN0b3J5LmluaXRpYWxpemUodGhpcyk7CS8vIE5vdyB3ZSdyZSByZWFkeSBmb3IgdGhlIGJlYW50eXBlIGZhY3RvcnkgdG8gYmUgaW5pdGlhbGl6ZWQuCi0JCi0JSVJFTUJlYW5UeXBlUHJveHkgc2VydmVyVHlwZSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5vYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLlJFTU9URVZNU0VSVkVSX0NMQVNTKSwgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuUmVtb3RlVk1TZXJ2ZXJUaHJlYWQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KHNlcnZlclR5cGUsIHRydWUpOwotCXZtU2VydmVyUHJveHkgPSBzZXJ2ZXJUeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVTRVJWRVJfSUQpKTsKLQlyZWdpc3RlclByb3h5KHZtU2VydmVyUHJveHkpOwotfQotCi0KLS8qKgotICogUmVnaXN0ZXIgYSBjb2xsZWN0aW9uIG9mIFByb3hpZXMKLSAqLwotcHVibGljIHZvaWQgcmVnaXN0ZXJQcm94aWVzKENvbGxlY3Rpb24gcHJveGllcykgewotCXN5bmNocm9uaXplZChmSURUb1Byb3hpZXNNYXApIHsKLQkJSXRlcmF0b3IgaXRyID0gcHJveGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSVJFTUJlYW5Qcm94eSBwcm94eSA9IChJUkVNQmVhblByb3h5KSBpdHIubmV4dCgpOwotCQkJaWYgKHByb3h5IGluc3RhbmNlb2YgSUJlYW5UeXBlUHJveHkgfHwgIShwcm94eS5nZXRUeXBlUHJveHkoKSBpbnN0YW5jZW9mIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpKSB7Ci0JCQkJUHJveHlSZWYgb2xkUmVmID0gKFByb3h5UmVmKSBmSURUb1Byb3hpZXNNYXAucHV0KHByb3h5LmdldElEKCksIG5ldyBQcm94eVJlZihwcm94eS5nZXRJRCgpLCBwcm94eSwgcXVldWUpKTsKLQkJCQlpZiAob2xkUmVmICE9IG51bGwpIHsKLQkJCQkJLy8gV2UndmUgcmVwbGFjZWQgaXQgd2l0aCBhIG5ldyBvbmUsIHNvIHdlIHdpbGwgY2xlYXIgb3V0IHRoZSByZWYgc28gdGhhdCBpdCB3b24ndCBsYXRlciB0cnkgdG8gcmVtb3ZlIGl0c2VsZgotCQkJCQlvbGRSZWYuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLX0KLQotLyoqCi0gKiBSZWdpc3RlciBhIHNpbmdsZSBwcm94eQotICovCi1wdWJsaWMgdm9pZCByZWdpc3RlclByb3h5KElSRU1CZWFuUHJveHkgcHJveHkpIHsKLQlpZiAocHJveHkgaW5zdGFuY2VvZiBJQmVhblR5cGVQcm94eSB8fCAhKHByb3h5LmdldFR5cGVQcm94eSgpIGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSkpCi0JCXN5bmNocm9uaXplZChmSURUb1Byb3hpZXNNYXApIHsKLQkJCVByb3h5UmVmIG9sZFJlZiA9IChQcm94eVJlZikgZklEVG9Qcm94aWVzTWFwLnB1dChwcm94eS5nZXRJRCgpLCBuZXcgUHJveHlSZWYocHJveHkuZ2V0SUQoKSwgcHJveHksIHF1ZXVlKSk7Ci0JCQlpZiAob2xkUmVmICE9IG51bGwpIHsKLQkJCQkvLyBXZSd2ZSByZXBsYWNlZCBpdCB3aXRoIGEgbmV3IG9uZSwgc28gd2Ugd2lsbCBjbGVhciBvdXQgdGhlIHJlZiBzbyB0aGF0IGl0IHdvbid0IGxhdGVyIHRyeSB0byByZW1vdmUgaXRzZWxmCi0JCQkJb2xkUmVmLmNsZWFyKCk7Ci0JCQl9CQkJCQkJCQotCQl9Ci19Ci0KLS8qKgotICogUmVsZWFzZSBhIHByb3h5IGJlY2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZC4KLSAqLwotcHVibGljIHZvaWQgcmVsZWFzZVByb3h5KElCZWFuUHJveHkgcHJveHkpIHsKLQlpZiAoIXByb3h5LmlzVmFsaWQoKSkKLQkJcmV0dXJuOwotCWlmIChwcm94eSBpbnN0YW5jZW9mIElCZWFuVHlwZVByb3h5ICYmICFmQmVhblR5cGVQcm94eUZhY3RvcnkucmVsZWFzZVByb3h5KChJQmVhblR5cGVQcm94eSkgcHJveHkpKQotCQlyZXR1cm47CS8vIEJlYW5UeXBlIGFuZCB0eXBlIGZhY3Rvcnkgd29uJ3QgYWxsb3cgcmVsZWFzZSBvZiBpdC4KLQlJbnRlZ2VyIGlkID0gKChJUkVNQmVhblByb3h5KSBwcm94eSkuZ2V0SUQoKTsKLQlzeW5jaHJvbml6ZWQoZklEVG9Qcm94aWVzTWFwKSB7CQkJCi0JCS8vIFN5bmNlZCBpbiBoZXJlIHNvIHRoYXQgd2Ugd2lsbCByZW1vdmUgaXQgYmVmb3JlIHNvbWUgb25lIGVsc2UgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgbWF5IHRyeQotCQkvLyB0byBhY2Nlc3MgaXQgYWdhaW4uCi0JCWlmIChpZC5pbnRWYWx1ZSgpICE9IENvbW1hbmRzLk5PVF9BTl9JRCkgewotCQkJUHJveHlSZWYgcmVmID0gKFByb3h5UmVmKSBmSURUb1Byb3hpZXNNYXAuZ2V0KGlkKTsKLQkJCWlmIChyZWYgPT0gbnVsbCB8fCByZWYuZGVjclVzZUNudCgpIDw9IDApIHsKLQkJCQkvLyBObyB1c2FnZSwgc28gZG8gYWN0dWFsIHJlbGVhc2UuCi0JCQkJZklEVG9Qcm94aWVzTWFwLnJlbW92ZShpZCk7Ci0JCQkJKChJUkVNQmVhblByb3h5KSBwcm94eSkucmVsZWFzZSgpOwotCQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQkJcmVmLmVucXVldWUoKTsJLy8gUXVldWUgaXQgdXAgc28gdGhhdCBvbiBuZXh0IHJlbGVhc2UgY3ljbGUgaXQgd2lsbCBnbyBhd2F5LgotCQkJfSAKLQkJfSBlbHNlIHsKLQkJCSgoSVJFTUJlYW5Qcm94eSkgcHJveHkpLnJlbGVhc2UoKTsJCQkKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBSZWxlYXNlIGEgc3BlY2lmaWMgSUQuIFRoaXMgaXMgdXNlZCBpbiBjYXNlIGFuIElEIGhhcyBiZWVuIHNlbnQKLSAqIGJ1dCB3ZSBjb3VsZG4ndCBwcm94eSBpdC4gSW4gdGhhdCBjYXNlIHdlIG9ubHkgaGF2ZSBhbiBJRC4gSXQgaXMKLSAqIGFsc28gdXNlZCB3aGVuIGEgcHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgZXhwbGljaXRseSBvciB0aHJvdWdoIEdDLgotICogSW4gdGhhdCBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gZGUtcmVnaXN0ZXJlZC4KLSAqLwotcHJpdmF0ZSB2b2lkIHJlbGVhc2VJRChpbnQgYW5JRCkgewotCXRyeSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCWNvbm5lY3QucmVsZWFzZUlEKGFuSUQpOwotCQl9IGZpbmFsbHkgewotCQkJZlJlZ2lzdHJ5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCX0KLQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkvLyBDb3VsZG4ndCBnZXQgY29ubmVjdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGggYSByZWxlYXNlLgotCX0KLX0KLQotLyoqCi0gKiBGb3IgdGhlIFJlbW90ZSBGYWN0b3J5IHdlIHdpbGwgY3JlYXRlIGFuIFJFTUJlYW5Qcm94eSB1c2luZyB0aGUgbnVsbCBjb25zdHJ1Y3RvcgotICogUGFja2FnZSBwcm90ZWN0ZWQgc28gb25seSBSRU1CZWFuVHlwZVByb3hpZXMgY2FuIGNyZWF0ZSBpbnN0YW5jZXMuCi0gKi8KLSAKLUlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHkpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JcmV0dXJuIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzTmV3SW5zdGFuY2UoKS5pbnZva2UobnVsbCwgYVR5cGVQcm94eSk7Ci19Ci0KLS8qKgotICogRm9yIHRoZSBSZW1vdGUgRmFjdG9yeSB3ZSB3aWxsIGNyZWF0ZSBhIFJFTUJlYW5Qcm94eSB1c2luZyB0aGUgaW5pdGlhbGl6YXRpb25TdHJpbmcuCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBzbyBvbmx5IFJFTUJlYW5UeXBlUHJveGllcyBjYW4gY3JlYXRlIGluc3RhbmNlcy4gCi0gKi8KLUlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykKLQl0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24sIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0Jc3RhcnRUcmFuc2FjdGlvbigpOwotCS8vIFN0YXJ0aW5nIGEgdHJhbnNhY3Rpb24sIHdlIHdpbGwgYmUgZ2V0dGluZyBpZCdzIGJhY2sgYW5kIG5lZWQgdG8gZ2V0IGRhdGEgaW4gYSBzZXBhcmF0ZSBzdGVwLCBzbyB3ZSBuZWVkIHRvIGdyb3VwIGl0IGluIGEgdHJhbnNhY3Rpb24uCi0JdHJ5IHsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV3SW5zdGFuY2VEYXRhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5ld0luc3RhbmNlRGF0YSA9IGdldE5ld0luc3RhbmNlRGF0YShhVHlwZVByb3h5LCBpbml0aWFsaXphdGlvblN0cmluZywgY29ubmVjdCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlzd2l0Y2ggKGUuZ2V0RXJyb3JDb2RlKCkpIHsKLQkJCQljYXNlIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OOgotCQkJCQkvLyBUaGUgcmVzdWx0IHdhcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KLQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuQ2xhc3NjYXN0X0VYQ18sIG5ldyBPYmplY3RbXSB7ZXh0cmFjdEZpcnN0TGluZShpbml0aWFsaXphdGlvblN0cmluZyksIGFUeXBlUHJveHkuZ2V0VHlwZU5hbWUoKX0pKTsgCi0JCQkJY2FzZSBDb21tYW5kcy5DQU5OT1RfRVZBTFVBVEVfU1RSSU5HOgotCQkJCQkvLyBXYW50IHRvIGxvZyB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIG5vdCBldmFsdWF0ZS4KLQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBsb2cgdGhpcyBzaWRlLCBqdXN0IGxvZyB0aGUgUmVtb3RlVk0gc2lkZSBvZiB0aGUgdHJhY2UuCi0JCQkJCWphdmEuaW8uU3RyaW5nV3JpdGVyIHMgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQkJCQkJamF2YS5pby5QcmludFdyaXRlciB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIocyk7Ci0JCQkJCSgoVGhyb3dhYmxlUHJveHkpIGUuZ2V0RXJyb3JPYmplY3QoKSkucHJpbnRQcm94eVN0YWNrVHJhY2Uodyk7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIHMudG9TdHJpbmcoKSwgbnVsbCkpOwotCQkJCQl0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuSW5zdGFudGlhdGVfRVhDXywgbmV3IE9iamVjdFtdIHtleHRyYWN0Rmlyc3RMaW5lKGluaXRpYWxpemF0aW9uU3RyaW5nKX0pKTsgCi0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyggCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQkiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZSkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBmYWlsZWQgaW4gdGhlIGNvbW1hbmQsIHRyeSBhZ2Fpbi4KLQkJCQlmUmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCWNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQl0cnkgewotCQkJCQluZXdJbnN0YW5jZURhdGEgPSBnZXROZXdJbnN0YW5jZURhdGEoYVR5cGVQcm94eSwgaW5pdGlhbGl6YXRpb25TdHJpbmcsIGNvbm5lY3QpOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCS8vIEl0IGZhaWxlZCBhZ2Fpbi4gQ2xvc2UgdGhpcyBjb25uZWN0aW9uIGFuZCBkb24ndCBsZXQgaXQgYmUgcmV0dXJuZWQuCi0JCQkJCWZSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOyAvLyBUaGlzIGlzIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmV0dXJuZWQuCi0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmUmVnaXN0cnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCi0JCWlmIChuZXdJbnN0YW5jZURhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRCZWFuUHJveHkobmV3SW5zdGFuY2VEYXRhKTsgLy8gVHVybiBpdCBpbnRvIGEgcHJveHkKLQl9IGZpbmFsbHkgewotCQlzdG9wVHJhbnNhY3Rpb24oKTsJLy8gTm93IHdlIGNhbiByZWxlYXNlIHRoZSB0cmFuc2FjdGlvbi4KLQl9Ci0KLXJldHVybiBudWxsOwotfQotCi1wcml2YXRlIFN0cmluZyBleHRyYWN0Rmlyc3RMaW5lKFN0cmluZyBpbml0U3RyaW5nKSB7Ci0JLy8gTmVlZCB0byBleHRyYWN0IHRoZSBmaXJzdCBsaW5lIGZvciB0aGUgbWVzc2FnZUZvcm1hdCBub3QgdG8gYmFyZi4KLQlpbnQgY3IgPSBpbml0U3RyaW5nLmluZGV4T2YoJ1xyJyk7Ci0JaW50IGxmID0gaW5pdFN0cmluZy5pbmRleE9mKCdcbicpOwkKLQlpZiAoY3IgIT0gLTEgfHwgbGYgIT0gLTEpIHsKLQkJaWYgKGNyID09IC0xIHx8IChsZiAhPSAtMSAmJiBsZiA8IGNyKSkKLQkJCXJldHVybiBpbml0U3RyaW5nLnN1YnN0cmluZygwLCBsZik7Ci0JCWVsc2UKLQkJCXJldHVybiBpbml0U3RyaW5nLnN1YnN0cmluZygwLCBjcik7Ci0JfSBlbHNlCi0JCXJldHVybiBpbml0U3RyaW5nOwotfQotCQotCQotLyoqCi0gKiBhY3R1YWxseSBjcmVhdGUgaXQgdXNpbmcgYSBwYXNzZWQgaW4gY29ubmVjdGlvbi4gVGhpcyBhbGxvd3MgcmV0cnkgY2FwYWJpbGl0eS4KLSAqCi0gKiBUaGlzIHdpbGwgc2VuZCB0aGUgcmVxdWVzdCBvdmVyIHRvIHRoZSBjb25uZWN0aW9uLgotICoKLSAqIElmIHdlIGdldCBhbiBPQkpFQ1QgYmFjaywgdGhlbiB0aGUgYmVhbnR5cGVwcm94eSB0aGF0IHRoZSBjbGFzc0lEIGluIHRoZQotICogdmFsdWUgcG9pbnRzIHRvIG11c3QgYmUgb2YgdHlwZSBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHNvIHRoYXQgd2UgY2FuCi0gKiBzZW5kIHRoaXMgbmV3IG9iamVjdCB0byB0aGUgY29ycmVjdCBiZWFudHlwZSB0byBjcmVhdGUgdGhlIGNvcnJlY3QgcHJveHkuCi0gKgotICogSWYgd2UgZ2V0IGFuIE9CSkVDVF9JRCBiYWNrLCB0aGVuIHRoZSBiZWFudHlwZXByb3h5IHRoYXQgdGhlIGNsYXNzSUQgaW4KLSAqIHRoZSB2YWx1ZSBwb2ludHMgdG8gbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBjcmVhdGluZyBhIHByb3h5IG9mIHRoYXQgdHlwZS4gCi0gKi8KLXByaXZhdGUgQ29tbWFuZHMuVmFsdWVPYmplY3QgZ2V0TmV3SW5zdGFuY2VEYXRhKElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgSVJFTUNvbm5lY3Rpb24gY29ubmVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uIHsJCi0JdHJ5IHsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV3SW5zdGFuY2VEYXRhID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCWNvbm5lY3QuZ2V0TmV3SW5zdGFuY2UoYVR5cGVQcm94eS5nZXRJRCgpLmludFZhbHVlKCksIGluaXRpYWxpemF0aW9uU3RyaW5nLCBuZXdJbnN0YW5jZURhdGEpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2VEYXRhOwotCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRCRCAtIE5lZWRzIHRvIGhhbmRsZSBlcnJvciBvZiBub3QgZXZhbHVhdGFibGUgYW5kIHNlbmQgb3ZlciB0byB0aGUgY29tcGlsb3IuCi0JCXByb2Nlc3NFcnJvclJldHVybihlKTsJLy8gUHJvY2VzcyB0aGlzCi0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIGFjdHVhbGx5IGNyZWF0ZSBpdCB1c2luZyBhIHBhc3NlZCBpbiBjb25uZWN0aW9uLiBUaGlzIGFsbG93cyByZXRyeSBjYXBhYmlsaXR5LgotICovCi1wcml2YXRlIHZvaWQgZ2V0T2JqZWN0SW5zdGFuY2VEYXRhKElSRU1Db25uZWN0aW9uIGNvbm5lY3QsIGludCBvYmplY3RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ29tbWFuZEV4Y2VwdGlvbiB7CQotCXRyeSB7Ci0JCWNvbm5lY3QuZ2V0T2JqZWN0RGF0YShvYmplY3RJRCwgdmFsdWVSZXR1cm4pOwotCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCXByb2Nlc3NFcnJvclJldHVybihlKTsJLy8gUHJvY2VzcyB0aGlzCi0JfQotfQotCi0vKioKLSAqIEdldCBhIGJlYW4gcHJveHkgZnJvbSB0aGUgdmFsdWUgb2JqZWN0IHBhc3NlZCBpbi4gSWYgbm90IHlldCBjcmVhdGVkLCBjcmVhdGUgb25lLgotICogTk9URTogTlVMTCB0eXBlIGFjdHVhbGx5IHJldHVybnMgYSB0cnVlIG51bGwuIFRoaXMgaXMgc28gdGhhdCBpZiBwZW9wbGUgYXJlIGNhc3RpbmcKLSAqIHRoZSByZXR1cm5lZCBwcm94eSB0byBhIHNwZWNpZmljIHR5cGUgKGUuZyBJSW50ZWdlckJlYW5Qcm94eSksIHRoZW4gdGhleSB3b24ndCBnZXQKLSAqIGEgQ2xhc3NDYXN0RXhjZXB0aW9uLCB0aGV5IHdpbGwgZ2V0IGEgbnVsbC4gVGhpcyBpcyBlYXNpZXIgZm9yIHRoZW0gdG8gaGFuZGxlLgotICogCi0gKiBOT1RFOiBUaGlzIGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgZXh0ZW5zaW9uIGZhY3RvcmllcyBjYW4gY3JlYXRlIGNvcnJlY3QgdHlwZXMgb2YKLSAqIHByb3hpZXMgaW4gY29uc2lzdGVudCBtYW5uZXIgZnJvbSBhIHZhbHVlIG9iamVjdC4gCi0gKiAKLSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaXMgY2FsbGVkCi0gKiBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uIG9ubHkgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHZhbHVlIGNvdWxkIGhhdmUgaW52YWxpZCBkYXRhCi0gKiBieSB0aGUgdGltZSB3ZSB0cnkgdG8gZ2V0IHRoZSBkYXRhIG91dCBvZiBpdC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24gewotCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkvLyBOdWxsIHJlc3VsdC4KLQkJY2FzZSAoYnl0ZSkgQ29tbWFuZHMuVk9JRF9UWVBFOgotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIEEgY29uc3RhbnQgb2JqZWN0IHdhcyByZWNlaXZlZC4KLQkJY2FzZSBDb21tYW5kcy5PQkpFQ1Q6Ci0JCQlJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IGNvbnN0YW50QmVhblR5cGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb25zdGFudEJlYW5UeXBlID0gKElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpIGdldEJlYW5UeXBlKHZhbHVlLmNsYXNzSUQpOwotCQkJCWlmIChjb25zdGFudEJlYW5UeXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwkvLyBDYW5ub3QgZmluZCB0aGUgdHlwZSB0byBjcmVhdGUgaXQuCi0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHdhc24ndCBhIGNvbnN0YW50IHR5cGUsIHNvIHdlIGNhbid0IGNyZWF0ZSBpdC4gUmV0dXJuIG51bGwuCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY29uc3RhbnRCZWFuVHlwZS5uZXdCZWFuUHJveHkodmFsdWUpOwotCQkKLQkJLy8gQW4gZXhpc3Rpbmcgb2JqZWN0X2lkIHdhcyByZXR1cm5lZCwgdGhlIG9iamVjdCBzaG91bGQgZXhpc3QuIElmIGl0IGRvZXNuJ3QKLQkJLy8gdGhlbiBzdWJtaXQgdGhlIGluZm8gY29tbWFuZCB0byB0cnkgdG8gcmVjcmVhdGUgaXQgY29ycmVjdGx5LgotCQljYXNlIENvbW1hbmRzLk9CSkVDVF9JRDoKLQkJCUludGVnZXIgb2JqZWN0SUQgPSBuZXcgSW50ZWdlcih2YWx1ZS5vYmplY3RJRCk7Ci0JCQlJQmVhblByb3h5IHByb3h5ID0gcmV0cmlldmVQcm94eShvYmplY3RJRCwgdHJ1ZSk7Ci0JCQlpZiAocHJveHkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJveHk7Ci0KLQkJCS8vIE5vdCBmb3VuZCwgbmVlZCB0byB0cnkgdG8gcmVjcmVhdGUgaXQuCi0JCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWdldE9iamVjdEluc3RhbmNlRGF0YShjb25uZWN0LCB2YWx1ZS5vYmplY3RJRCwgdmFsdWUpOyAvLyBHbyBhbmQgZ2V0IHRoZSBkYXRhCi0JCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCWlmIChlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkwLAotCQkJCQkJCSIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSkpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUcnkgb25lIG1vcmUgdGltZS4KLQkJCQkJZlJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCWNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWdldE9iamVjdEluc3RhbmNlRGF0YShjb25uZWN0LCB2YWx1ZS5vYmplY3RJRCwgdmFsdWUpOyAvLyBHbyBhbmQgZ2V0IHRoZSBkYXRhCi0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCWZSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCXRocm93IGVBZ2FpbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQkJZlJlZ2lzdHJ5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRCZWFuUHJveHkodmFsdWUpOyAvLyBOb3cgcHJvY2VzcyBpdCB0byBjcmVhdGUgdGhlIG5ldyBkYXRhLgotCQkJCi0JCS8vIEFuIG5ldyBvYmplY3QgaWQuIE5lZWQgdG8gZ2V0IHRoZSBjbGFzcyB0eXBlIGFuZCBsZXQgaXQgY3JlYXRlIGl0LgotCQljYXNlIENvbW1hbmRzLk5FV19PQkpFQ1RfSUQ6Ci0JCQl0cnkgewotCQkJCUlSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlID0gZ2V0QmVhblR5cGUodmFsdWUuY2xhc3NJRCk7Ci0JCQkJSVJFTUJlYW5Qcm94eSBuZXdQcm94eSA9IG5ld0JlYW5UeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcih2YWx1ZS5vYmplY3RJRCkpOwotCQkJCWlmIChuZXdQcm94eSAhPSBudWxsKQotCQkJCQlyZWdpc3RlclByb3h5KG5ld1Byb3h5KTsKLQkJCQlyZXR1cm4gbmV3UHJveHk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwkJCQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRoZSBzZXJ2ZXIgaGFzIGNyZWF0ZWQgYSBuZXcgb2JqZWN0LCBidXQgd2UgY291bGRuJ3QgY3JlYXRlL3JlZ2lzdGVyIGEgcHJveHkgZm9yIGl0LgotCQkJCS8vIFdlIG5lZWQgdG8gcmVsZWFzZSBpdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIGdldCByaWQgb2YgaXQuIE90aGVyd2lzZSBpdCB3b3VsZCBoYW5nCi0JCQkJLy8gYXJvdW5kIG92ZXIgdGhlcmUgZm9yZXZlci4KLQkJCQlyZWxlYXNlSUQodmFsdWUub2JqZWN0SUQpOwotCQkJCXRocm93IGU7Ci0JCQl9CQkJCi0JCQkKLQkJLy8gQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24sIGNyZWF0ZSB0aGUgVGhyb3dhYmxlUHJveHkgYW5kIHRoZW4gdGhyb3cgaXQuCi0JCWNhc2UgQ29tbWFuZHMuVEhST1c6Ci0JCQlJUkVNQmVhblByb3h5IG5ld1Rocm93UHJveHkJPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJUkVNQmVhblR5cGVQcm94eSBuZXdUaHJvd1R5cGUgPSAgZ2V0QmVhblR5cGUodmFsdWUuY2xhc3NJRCk7Ci0JCQkJbmV3VGhyb3dQcm94eSA9IG5ld1Rocm93VHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIodmFsdWUub2JqZWN0SUQpKTsKLQkJCQlpZiAobmV3VGhyb3dQcm94eSAhPSBudWxsKQotCQkJCQlyZWdpc3RlclByb3h5KG5ld1Rocm93UHJveHkpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhlIHNlcnZlciBoYXMgY3JlYXRlZCBhIG5ldyBvYmplY3QsIGJ1dCB3ZSBjb3VsZG4ndCBjcmVhdGUvcmVnaXN0ZXIgYSBwcm94eSBmb3IgaXQuCi0JCQkJLy8gV2UgbmVlZCB0byByZWxlYXNlIGl0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gZ2V0IHJpZCBvZiBpdC4gT3RoZXJ3aXNlIGl0IHdvdWxkIGhhbmcKLQkJCQkvLyBhcm91bmQgb3ZlciB0aGVyZSBmb3JldmVyLgotCQkJCXJlbGVhc2VJRCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJdGhyb3cgZTsJCQkJCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwotCQkJfQkJCQkKLQkJCS8vIEl0IHJlYWxseSBzaG91bGQgYmUgYSB0aHJvd2FibGUsIGJ1dCBpZiBub3QsIGp1c3QgcmV0dXJuIGl0LgotCQkJaWYgKG5ld1Rocm93UHJveHkgaW5zdGFuY2VvZiBUaHJvd2FibGVQcm94eSkKLQkJCQl0aHJvdyAoVGhyb3dhYmxlUHJveHkpIG5ld1Rocm93UHJveHk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ld1Rocm93UHJveHk7CQkKLQkJCi0JCS8vIEl0IGlzIG9uZSBvZiB0aGUgc3RhbmRhcmQga2luZHMsIHdoaWNoIGFyZSBDb25zdGFudCB0eXBlcwotCQlkZWZhdWx0OgotCQkJSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSBzdGFuZGFyZEJlYW5UeXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3RhbmRhcmRCZWFuVHlwZSA9IChJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZSh2YWx1ZS50eXBlKTsKLQkJCQlpZiAoc3RhbmRhcmRCZWFuVHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsJLy8gQ2Fubm90IGZpbmQgdGhlIHR5cGUgdG8gY3JlYXRlIGl0LgotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJdCB3YXNuJ3QgYSBzdGFuZGFyZCB0eXBlLCBzbyB3ZSBjYW4ndCBjcmVhdGUgaXQuIFJldHVybiBudWxsLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBzdGFuZGFyZEJlYW5UeXBlLm5ld0JlYW5Qcm94eSh2YWx1ZSk7Ci0JfQkJCQkJCQotfQotCi0vKioKLSAqIFByb2Nlc3MgdGhlIGVycm9yIGV4Y2VwdGlvbi4gR2V0IHRoZSBkYXRhIGZyb20gaXQgYW5kIHR1cm4gaXQgaW50byBwcm94eSBkYXRhLgotICogSWYgaXQgaXMgYSBUSFJPVywgdGhlbiBpdCB3aWxsIHRocm93IHRoZSBUaHJvd2FibGUgaW5zdGVhZC4gCi0gKgotICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBleHRlbnNpb24gZmFjdG9yaWVzIGNhbiBwcm9jZXNzIGVycm9ycyBpbgotICogYW4gY29uc2lzdGVudCBtYW5uZXIuIAotICogCi0gKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotICovCi1wdWJsaWMgdm9pZCBwcm9jZXNzRXJyb3JSZXR1cm4oQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSB7Ci0JaW50IGNvZGUgPSBlLmdldEVycm9yQ29kZSgpOwotCU9iamVjdCBkYXRhID0gbnVsbDsKLQlpZiAoY29kZSA9PSBDb21tYW5kcy5USFJPV0FCTEVfU0VOVCkKLQkJZGF0YSA9IGdldEJlYW5Qcm94eShlLmdldFZhbHVlKCkpOwkvLyBJdCBpcyBUaHJvdyBzZW50LCBzbyBsZXQgdGhlIHRocm93IGZyb20gZ2V0QmVhblByb3h5IGNvbnRpbnVlIG9uIG91dC4gKEJ1dCBhcyBhIHNhZmV0eSwgd2Ugc3RpbGwgdHJ5IHRvIGdldCB0aGUgZGF0YS4KLQllbHNlIHsKLQkJdHJ5IHsKLQkJCWRhdGEgPSBnZXRCZWFuUHJveHkoZS5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgdCkgewotCQkJLy8gQnV0IHdlIHdhbnQgdG8ga2VlcCB0aHJvd2FibGVzIGluIHRoaXMgY2FzZS4gVGhleSBhcmUganVzdCBkYXRhIGZvciB0aGUgY29tbWFuZCBlcnJvci4KLQkJCWRhdGEgPSB0OwotCQl9Ci0JfQotCXRocm93IG5ldyBDb21tYW5kRXJyb3JFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5SZW1vdGVDbWRfRVhDXywgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihjb2RlKX0pLCBjb2RlLCBlLmdldFZhbHVlKCksIGRhdGEpOwkvLyBDcmVhdGUgYSBuZXcgb25lIGFuZCB0aHJvdyBpdCBjb250YWluaW5nIHRoZSBwcm94aWVkIGRhdGEuIC8vJE5PTi1OTFMtMSQKLX0KLQkgCi0KLS8qKgotICogR2V0IGEgYmVhbnR5cGUgd2hlcmUgdGhlIGlkIHBhc3NlZCBpbiBpcyB0aGUgY2xhc3NJRCBvZiB0aGUgYmVhbnR5cGUuCi0gKiBJZiBub3QgZm91bmQsIHRoZW4gZ28gZ2V0IGl0IGxvYWRlZC4gSWYgaXQgY2FuJ3QgYmUgZm91bmQsIHRoZW4gd2Ugd2lsbAotICogcmVsZWFzZSB0aGUgaWQgYmVjYXVzZSBpdCBtZWFucyB3ZSBoYXZlIGFuIGlkIGZyb20gdGhlIHNlcnZlciwgYnV0IHdlCi0gKiBjYW4ndCBjcmVhdGUgYSBwcm94eSBmb3IgaXQsIHNvIGRvbid0IGtlZXAgdGhlIHNlcnZlciBob2xkaW5nIGl0LgotICogTk9URTogVGhpcyBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IGV4dGVuc2lvbiBmYWN0b3JpZXMgY2FuIGNyZWF0ZSBjb3JyZWN0IHR5cGVzCi0gKiBpbiBhIGNvbnNpc3RlbnQgbWFubmVyIGZyb20gdGhlIGlkLgotICogCi0gKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uIAotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGUoaW50IGlkKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUgPSBudWxsOwotCXRyeSB7Ci0JCUludGVnZXIgY2xhc3NJRCA9IG5ldyBJbnRlZ2VyKGlkKTsKLQkJYmVhblR5cGUgPSAoSVJFTUJlYW5UeXBlUHJveHkpIHJldHJpZXZlUHJveHkoY2xhc3NJRCwgZmFsc2UpOwotCQlpZiAoYmVhblR5cGUgPT0gbnVsbCkKLQkJCWJlYW5UeXBlID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5UeXBlUHJveHkoY2xhc3NJRCk7CS8vIFdlIGRvbid0IGhhdmUgaXQsIG5lZWQgdG8gZ28gdG8gdGhlIGZhY3Rvcnkgc28gdGhhdCBpdCBjYW4gZ28gcXVlcnkgd2hhdCBpdCBuZWVkcwotCQlpZiAoYmVhblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBDYW5ub3QgZmluZCB0aGUgdHlwZSB0byBjcmVhdGUgaXQuCi0JfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJLy8gSXQgd2Fzbid0IGEgYmVhbiB0eXBlLCBzbyB3ZSBjYW4ndCBjcmVhdGUgaXQuIFJldHVybiBudWxsLgotCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfSBmaW5hbGx5IHsKLQkJaWYgKGJlYW5UeXBlID09IG51bGwpCi0JCQlyZWxlYXNlSUQoaWQpOwkvLyBDb3VsZG4ndCBjcmVhdGUgYSBwcm94eSwgc28gcmVsZWFzZSB0aGUgaWQuCi0JfQotCXJldHVybiBiZWFuVHlwZTsKLX0KLQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlcgotICovCi1wdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYVByaW1pdGl2ZUludGVnZXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFQcmltaXRpdmVJbnRlZ2VyKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB3cmFwcGluZyB0aGUgcHJpbWl0aXZlIGJ5dGUKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChieXRlIGFQcmltaXRpdmVCeXRlKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoYVByaW1pdGl2ZUJ5dGUpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgY2hhcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGNoYXIgYVByaW1pdGl2ZUNoYXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFQcmltaXRpdmVDaGFyKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB3cmFwcGluZyB0aGUgcHJpbWl0aXZlIHNob3J0Ci0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoc2hvcnQgYVByaW1pdGl2ZVNob3J0KSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShhUHJpbWl0aXZlU2hvcnQpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgbG9uZwotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGxvbmcgYVByaW1pdGl2ZUxvbmcpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShhUHJpbWl0aXZlTG9uZyk7Ci19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgZG91YmxlCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoZG91YmxlIGFQcmltaXRpdmVEb3VibGUpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoYVByaW1pdGl2ZURvdWJsZSk7Ci19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgZmxvYXQKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhUHJpbWl0aXZlRmxvYXQpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZmxvYXRUeXBlLmNyZWF0ZUZsb2F0QmVhblByb3h5KGFQcmltaXRpdmVGbG9hdCk7Ci19Ci0KLS8qKgotICogY3JlYXRlQmVhblByb3h5V2l0aCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQm9vbGVhbiBhQm9vbGVhbikgewotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhbkNsYXNzLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYUJvb2xlYW4pOwotfQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSB0aGF0IHdyYXBzIHRoZSBJbnRlZ2VyIGFyZ3VtZW50Ci0gKi8KLXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludGVnZXJDbGFzcy5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFuSW50ZWdlcik7Ci19Ci0vKioKLSAqIGNyZWF0ZUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoTnVtYmVyIGFOdW1iZXIpIHsKLQlSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgdHlwZSA9IChSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFOdW1iZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCXJldHVybiB0eXBlLmNyZWF0ZU51bWJlckJlYW5Qcm94eShhTnVtYmVyKTsKLX0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgZm9yIHRoZSBhcmd1bWVudAotICovCi1wdWJsaWMgSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKFN0cmluZyBhU3RyaW5nKSB7Ci0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnN0cmluZ0NsYXNzLmNyZWF0ZVN0cmluZ0JlYW5Qcm94eShhU3RyaW5nKTsKLQotfQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSBmb3IgdGhlIGFyZ3VtZW50Ci0gKi8KLXB1YmxpYyBJQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQ2hhcmFjdGVyIGFDaGFyYWN0ZXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhcmFjdGVyQ2xhc3MuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFDaGFyYWN0ZXIpOwotCi19Ci0vKioKLSAqIGNyZWF0ZUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJvb2xlYW4gYVByaW1pdGl2ZUJvb2xlYW4pIHsKLQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoYVByaW1pdGl2ZUJvb2xlYW4pOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotICoKLSAqICAgLSAoaW50LCBuZXcgaW50WzJdIHszLCA0fSkgd2lsbCBjcmVhdGU6Ci0gKiAgICAgIGludCBbM10gWzRdCi0gKgotICogICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pCi0gKiAgICAgIGludCBbMV0KLSAqCi0gKiAgIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KQotICogICAgICBpbnQgWzJdIFszXQotICogCi0gKgotICogICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKQotICogICAgICBpbnQgWzBdLi4uCi0gKiAgICAgb3IKLSAqICAgICAoaW50W11bXS4uLiwgbnVsbCkgb3IgKGludFtdW10uLi4sIG5ldyBpbnRbMF0pCi0gKiAgICAgIGludFswXVtdLi4uCi0gKiAgICAgVGhpcyBpcyBiZWNhdXNlIGFuIGFycmF5IGluc3RhbmNlIHdpdGggbm8gc3BlY2lmaWVkIGRpbWVuc2lvbnMgaXMgbm90IHZhbGlkLiAKLSAqCi0gKiAgIC0gKGludFtdW10sIG5ldyBpbnRbMV0gezN9KQotICogICAgICBpbnRbM11bXQotICovCi1wdWJsaWMgSUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50W10gZGltZW5zaW9ucykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQlpZiAodHlwZS5pc0FycmF5KCkpCi0JCXJldHVybiAoKFJFTUFycmF5QmVhblR5cGVQcm94eSkgdHlwZSkuY3JlYXRlQmVhblByb3h5V2l0aChkaW1lbnNpb25zKTsJLy8gQWxyZWFkeSBhbiBhcnJheSB0eXBlLCBqdXN0IHBhc3MgaXQgb24uCi0JZWxzZSB7Ci0JCS8vIEl0IGlzIG5vdCBhbiBhcnJheSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGdldCBhbiBhcnJheSBvZiB0aGlzIHR5cGUgYW5kIGRpbWVuc2lvbnMuCi0JCVJFTUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoUkVNQXJyYXlCZWFuVHlwZVByb3h5KSBmQmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSh0eXBlLmdldFR5cGVOYW1lKCksIGRpbWVuc2lvbnMubGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5VHlwZS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOwotCX0KLX0KLS8qKgotICogQ3JlYXRlIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5LiAKLSAqIFRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBhcyBjYWxsaW5nIAotICogICBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIG5ldyBpbnRbMV0ge3h9KQotICogd2hlcmUgJ3gnIGlzIHRoZSB2YWx1ZSBwYXNzZWQgaW4gYXMgdGhlIGRpbWVuc2lvbi4KLSAqLwotcHVibGljIElBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIGludCBkaW1lbnNpb24pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eVdpdGgodHlwZSwgbmV3IGludFtdIHtkaW1lbnNpb259KTsKLX0KLQotLyoqCi0gKiBSZXRyaWV2ZSB0aGUgcHJveHkgZnJvbSB0aGUgbWFwcGluZyB0YWJsZS4gSGFuZGxlIGFscmVhZHkgR0MnZC4KLSAqIElmIHRoaXMgcmV0dXJucyBudWxsLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgY2FsbGVyIHRyaWVzIHRvIHJlY3JlYXRlCi0gKiBpdCBzaW5jZSB0aGUgaWQgaXMgc3RpbGwgdmFsaWQgb24gdGhlIHNlcnZlci4KLSAqLwotcHJpdmF0ZSBJQmVhblByb3h5IHJldHJpZXZlUHJveHkoSW50ZWdlciBvYmplY3RJRCwgYm9vbGVhbiBpbmNyZW1lbnRVc2VDbnQpIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQlQcm94eVJlZiByZWYgPSAoUHJveHlSZWYpIGZJRFRvUHJveGllc01hcC5nZXQob2JqZWN0SUQpOwotCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCU9iamVjdCBicCA9IHJlZi5nZXQoKTsJCQkKLQkJCWlmIChyZWYuaXNFbnF1ZXVlZCgpIHx8IGJwID09IG51bGwpIHsKLQkJCQkvLyBJdCdzIHdhaXRpbmcgdG8gYmUgcmVtb3ZlZCwgb3IgaGFzIGJlZW4gcmVtb3ZlZC4gaS5lLiBHQydkLCBzbyBqdXN0IHJlbW92ZSBpdCBmcm9tIHRoZSBtYXAsIG5leHQgcHJvY2Vzc1F1ZXVlIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlLgotCQkJCWZJRFRvUHJveGllc01hcC5yZW1vdmUob2JqZWN0SUQpOwotCQkJCXJlZi5jbGVhcigpOwkJLy8gVGhpcyBpcyBzbyB0aGF0IHdoZW4gdGhlIHByb2Nlc3NRdWV1ZSBzZWUncyBpdCwgCi0JCQkJCQkJLy8gaXQgd29uJ3Qgc2VuZCBhIHJlbGVhc2UgcmVxdWVzdCB0byB0aGUgc2VydmVyIAotCQkJCQkJCS8vIHNpbmNlIGl0IHdpbGwgYmUgcmVjcmVhdGVkIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucy4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGluY3JlbWVudFVzZUNudCkKLQkJCQkJcmVmLmluY3JVc2VDbnQoKTsKLQkJCQlyZXR1cm4gKElCZWFuUHJveHkpIGJwOwotCQkJfQkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogU3RhcnQgVHJhbnNhY3Rpb246IER1cmluZyB0aGUgdGltZSBiZXR3ZWVuIHN0YXJ0L3N0b3AgdHJhbnNhY3Rpb24sCi0gKiBwcm94aWVzIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAuIFRoaXMgcHJldmVudHMgdGhlIGNhc2Ugb2YgYSB0d28gc3RlcAotICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHJldHVybmVkIElEIGZyb20gdGhlIHJlbW90ZSB2bSBpcyBmb3IgYSBwcm94eQotICogdGhhdCBpcyBhYm91dCB0byBiZSBjbGVhbmVkIHVwLCBhbmQgdGhlbiBoYXZpbmcgdGhhdCBwcm94eSBkaXNhcHBlYXIKLSAqIHdoZW4gZ29pbmcgZm9yIHRoZSBkYXRhIGZvciBpdC4KLSAqIAotICogTm90ZTogSXQgaXMgSU1QRVJJVElWRSB0aGF0IHRoZSBzdGFydC9zdG9wIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0gKiAgICAgZmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgICAgZG8geW91ciBzdHVmZi4uLgotICogICAgIH0gZmluYWxseSB7Ci0gKiAgICAgICAgIGZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgfQotICogCi0gKiBUaGlzIHdheSBpdCBjYW4gbmV2ZXIgYWNjaWRlbnRseSBsZWF2ZSBpdCBpbiBhIGxvY2tlZCBzdGF0ZS4KLSAqLwotcHVibGljCXZvaWQgc3RhcnRUcmFuc2FjdGlvbigpICB7Ci0Jc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJdHJhbnNhY3Rpb25Mb2NrQ291bnQrKzsKLQl9Ci19Ci0KLXB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0Jc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uTG9ja0NvdW50ICE9IDA7Ci0JfQotfQotCi0vKioKLSAqIFN0b3AgVHJhbnNhY3Rpb246IER1cmluZyB0aGUgdGltZSBiZXR3ZWVuIHN0YXJ0L3N0b3AgdHJhbnNhY3Rpb24sCi0gKiBwcm94aWVzIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAuIFRoaXMgcHJldmVudHMgdGhlIGNhc2Ugb2YgYSB0d28gc3RlcAotICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHJldHVybmVkIElEIGZyb20gdGhlIHJlbW90ZSB2bSBpcyBmb3IgYSBwcm94eQotICogdGhhdCBpcyBhYm91dCB0byBiZSBjbGVhbmVkIHVwLCBhbmQgdGhlbiBoYXZpbmcgdGhhdCBwcm94eSBkaXNhcHBlYXIKLSAqIHdoZW4gZ29pbmcgZm9yIHRoZSBkYXRhIGZvciBpdC4KLSAqIAotICogTm90ZTogSXQgaXMgSU1QRVJJVElWRSB0aGF0IHRoZSBzdGFydC9zdG9wIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0gKiAgICAgZmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgICAgZG8geW91ciBzdHVmZi4uLgotICogICAgIH0gZmluYWxseSB7Ci0gKiAgICAgICAgIGZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0gKiAgICAgfQotICogCi0gKiBUaGlzIHdheSBpdCBjYW4gbmV2ZXIgYWNjaWRlbnRseSBsZWF2ZSBpdCBpbiBhIGxvY2tlZCBzdGF0ZS4KLSAqLwotcHVibGljCXZvaWQgc3RvcFRyYW5zYWN0aW9uKCkgIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQlpZiAoLS10cmFuc2FjdGlvbkxvY2tDb3VudCA8IDApCi0JCQl0cmFuc2FjdGlvbkxvY2tDb3VudCA9IDA7CS8vIFNob3VsZG4ndCBvY2N1ciwgYnV0IGp1c3QgaW4gY2FzZS4KLQl9Ci19Ci0KLS8qKgotICogVGVybWluYXRlIHRoZSBmYWN0b3J5LiBJZiB0aGlzIGlzIGJlaW5nIHRlcm1pbmF0ZWQsIHRoZW4gdGhlIHNlcnZlciBpcyBiZWluZyB0ZXJtaW5hdGVkIHRvby4KLSAqIFNvIGp1c3QgZ28gdGhyb3VnaCBhbGwgb2YgdGhlIHByb3hpZXMgYW5kIHJlbGVhc2UgdGhlbSwgYnV0IGRvbid0IHNlbmQgYW55IG5vdGlmaWNhdGlvbiB0bwotICogdGhlIHNlcnZlciBzaW5jZSB0aGUgc2VydmVyIGlzIHN1YnNlcXVlbnRseSBqdXN0IGdvaW5nIHRvIHRocm93IHRoZW0gYXdheSB3aGVuIGl0IHRlcm1pbmF0ZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2FuJ3QgcnVuIGFzeW5jLCBzbyB3YWl0IGlzIGEgc3VnZ2VzdGlvbiBoZXJlLgotICovCi1wdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCXN5bmNocm9uaXplZCAoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IGZJRFRvUHJveGllc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJveHlSZWYgcmVmID0gKFByb3h5UmVmKSBpdHIubmV4dCgpOwotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGJwID0gcmVmLmdldCgpOwotCQkJCS8vIElmIG5vdCBjbGVhbmVkIHVwIGFuZCBub3QgZW5xdWV1ZWQsIHJlbGVhc2UgaXQuCi0JCQkJaWYgKGJwICE9IG51bGwgJiYgIXJlZi5pc0VucXVldWVkKCkpCi0JCQkJCSgoSVJFTUJlYW5Qcm94eSkgYnApLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJZklEVG9Qcm94aWVzTWFwLmNsZWFyKCk7Ci0JCXF1ZXVlID0gbnVsbDsJLy8gRG9uJ3QgYm90aGVyIHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBkb24ndCBuZWVkIHRvIG5vdy4KLQl9Ci19Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjcmVhdGVFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBSRU1FeHByZXNzaW9uKHRoaXMuZlJlZ2lzdHJ5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUJlYW5Qcm94eUZyb20oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eShmQmVhblR5cGVQcm94eUZhY3Rvcnkudm9pZFR5cGUsIGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSkgewotCQlpZiAobm9uUHJpbWl0aXZlUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIW5vblByaW1pdGl2ZVByb3h5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQkJSVJFTUJlYW5UeXBlUHJveHkgdHlwZSA9IChJUkVNQmVhblR5cGVQcm94eSkgbm9uUHJpbWl0aXZlUHJveHkuZ2V0VHlwZVByb3h5KCk7Ci0JCS8vIFN0ZXAgaW50byB0aGUgaW50ZXJuYWxzLiBUaGUgSUQgaXMgYSBjb25zdGFudCBpbnQsIHNvIHdlIGNhbiB1c2UgYSBzd2l0Y2ggc3RtdC4KLQkJc3dpdGNoICh0eXBlLmdldElEKCkuaW50VmFsdWUoKSkgewotCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQm9vbGVhbkJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuQllURV9DTEFTUzoKLQkJCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJ5dGVWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQ2hhcmFjdGVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuY2hhclZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5kb3VibGVWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5mbG9hdFZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuaW50VmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLkxPTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5sb25nVmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLlNIT1JUX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuc2hvcnRWYWx1ZSgpKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5vblByaW1pdGl2ZVByb3h5OwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRJVk1TZXJ2ZXJQcm94eSgpIHsKLQkJcmV0dXJuIHZtU2VydmVyUHJveHk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTUyNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWFwVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFdlIGFyZSBhIGJlYW5UeXBlUHJveHlGYWN0b3J5IGZvciBjcmVhdGluZyBSRU1CZWFuVHlwZVByb3h5IG9iamVjdHMgUHJpbWl0aXZlIHR5cGVzIGFzIHdlbGwgYXMgY29tbW9uIHR5cGVzIGxpa2UgU3RyaW5nIGFyZSBjYWNoZWQgZm9yIHNwZWVkIG9mCi0gKiBsb29rdXAuIFdlIGFyZSB0aGUgc3RhbmRhcmQgb25lIHRoYXQgdGhlIFZDRSB1c2VzLiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjMyOjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmQmVhbkZhY3Rvcnk7Ci0KLQkvLyBIYXNodGFibGUgdG8gY2FjaGUgcHJveGllcyBmb3IgY2xhc3NlcyBzbyB0aGV5IGFyZSBmb3VuZCBvbiBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbG9va3VwcwotCXByb3RlY3RlZCBNYXAgZkJlYW5Qcm94aWVzID0gbmV3IEhhc2hNYXAoMTAwMCk7Ci0KLQkvLyBBIENhY2hlIG9mIGJlYW4gdHlwZSBwcm94aWVzIHRoYXQgc2hvdWxkIG5vdCBldmVyIGJlIHJlbGVhc2VkLiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIG9uZXMKLQkvLyB0aGF0IHdlIGNyZWF0ZSBoZXJlLiBUaGV5IGFyZSBuZXZlciByZWxlYXNlZCBiZWNhdXNlIHRoZXkgd291bGRuJ3QgYmUgY29ycmVjdGx5IHJlLWNyZWF0ZWQKLQkvLyBpZiB0aGV5IHdlcmUuIEFsc28gdGhleSBhcmUgc3RhbmRhcmQgb25lcyB3aXRoIHN0YW5kYXJkIElEJ3MgdGhhdCBkb24ndCBjaGFuZ2Ugc28gdGhleQotCS8vIGRvbid0IG5lZWQgdG8gYmUgcmUtY3JlYXRlZCBsYXRlci4KLQlwcm90ZWN0ZWQgU2V0IGZQZXJtYW5lbnRQcm94aWVzID0gbmV3IEhhc2hTZXQoMzApOwotCi0JLy8gQ2FjaGUgb2YgcmVxdWVzdGVkIGJ1dCBub3QgZm91bmQgYmVhbiB0eXBlcy4gSWYgbm90IG1haW50YWluaW5nIHRoZSBsaXN0LCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgbnVsbC4KLQkvLyBUaGUgdmFsdWVzIGFyZSBzdHJpbmdzIChjbGFzc25hbWVzIGluIEpOSSBmb3JtYXQpLgotCXByb3RlY3RlZCBTZXQgZk5vdEZvdW5kVHlwZXMgPSBudWxsOwotCi0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBiZWFuIHR5cGUgcHJveGllcy4KLQlSRU1CZWFuVHlwZVByb3h5IG9iamVjdENsYXNzOwotCi0JUkVNQ2xhc3NCZWFuVHlwZVByb3h5IGNsYXNzQ2xhc3M7Ci0KLQlSRU1Wb2lkQmVhblR5cGVQcm94eSB2b2lkVHlwZTsKLQotCVJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eSBib29sZWFuVHlwZTsKLQotCVJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgYm9vbGVhbkNsYXNzOwotCi0JUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5IGludFR5cGU7Ci0KLQlSRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5IGludGVnZXJDbGFzczsKLQotCVJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eSBieXRlVHlwZTsKLQotCVJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgYnl0ZUNsYXNzOwotCi0JUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkgc2hvcnRDbGFzczsKLQotCVJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkgc2hvcnRUeXBlOwotCi0JUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eSBsb25nQ2xhc3M7Ci0KLQlSRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkgbG9uZ1R5cGU7Ci0KLQlSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZG91YmxlQ2xhc3M7Ci0KLQlSRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eSBkb3VibGVUeXBlOwotCi0JUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkgZmxvYXRDbGFzczsKLQotCVJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkgZmxvYXRUeXBlOwotCi0JUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkgYmlnRGVjaW1hbENsYXNzOwotCi0JUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkgYmlnSW50ZWdlckNsYXNzOwotCi0JUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkgY2hhclR5cGU7Ci0KLQlSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkgY2hhcmFjdGVyQ2xhc3M7Ci0KLQlSRU1TdHJpbmdCZWFuVHlwZVByb3h5IHN0cmluZ0NsYXNzOwotCi0JLyoqCi0JICogQXZhaWxhYmxlIHRvIGFsbCBSRU0gYmVhbnR5cGVzLgotCSAqLwotCXB1YmxpYyBSRU1Qcm94eUNvbnN0YW50cyBwcm94eUNvbnN0YW50czsKLQotCS8qKgotCSAqIElERUJlYW5UeXBlUHJveHlGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZkZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkodGhpcyk7Ci0KLQkJcHJveHlDb25zdGFudHMgPSBuZXcgUkVNUHJveHlDb25zdGFudHMoYVJlZ2lzdHJ5KTsKLQotCQkvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgY2FjaGUuCi0JCW9iamVjdENsYXNzID0gbmV3IFJFTUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuT0JKRUNUX0NMQVNTKSwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWNsYXNzQ2xhc3MgPSBuZXcgUkVNQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJdm9pZFR5cGUgPSBuZXcgUkVNVm9pZEJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWJvb2xlYW5UeXBlID0gbmV3IFJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJYm9vbGVhbkNsYXNzID0gbmV3IFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgb2JqZWN0Q2xhc3MpOwotCQlJQmVhblR5cGVQcm94eSBudW1iZXJDbGFzcyA9IG9iamVjdENsYXNzLm5ld0JlYW5UeXBlRm9yQ2xhc3MobmV3IEludGVnZXIoQ29tbWFuZHMuTlVNQkVSX0NMQVNTKSwgTnVtYmVyLmNsYXNzLmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCWludFR5cGUgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlpbnRlZ2VyQ2xhc3MgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJ5dGVUeXBlID0gbmV3IFJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJYnl0ZUNsYXNzID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlzaG9ydFR5cGUgPSBuZXcgUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJc2hvcnRDbGFzcyA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWxvbmdUeXBlID0gbmV3IFJFTUxvbmdUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJbG9uZ0NsYXNzID0gbmV3IFJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlkb3VibGVUeXBlID0gbmV3IFJFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlkb3VibGVDbGFzcyA9IG5ldyBSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlmbG9hdFR5cGUgPSBuZXcgUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJZmxvYXRDbGFzcyA9IG5ldyBSRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJpZ0RlY2ltYWxDbGFzcyA9IG5ldyBSRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJpZ0ludGVnZXJDbGFzcyA9IG5ldyBSRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWNoYXJUeXBlID0gbmV3IFJFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQljaGFyYWN0ZXJDbGFzcyA9IG5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgb2JqZWN0Q2xhc3MpOwotCQlzdHJpbmdDbGFzcyA9IG5ldyBSRU1TdHJpbmdCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJSUJlYW5UeXBlUHJveHkgdGhyb3dhYmxlQ2xhc3MgPSBuZXcgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5USFJPV0FCTEVfQ0xBU1MpLCBUaHJvd2FibGUuY2xhc3MKLQkJCQkuZ2V0TmFtZSgpLCBvYmplY3RDbGFzcyk7Ci0JCUlCZWFuVHlwZVByb3h5IHRocmVhZENsYXNzID0gb2JqZWN0Q2xhc3MubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihDb21tYW5kcy5USFJFQURfQ0xBU1MpLCBUaHJlYWQuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0JCUlCZWFuVHlwZVByb3h5IGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyQ2xhc3MgPSBvYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLkVYUFJFU1NJT05QUk9DRVNTRVJDT05UUk9MTEVSX0NMQVNTKSwgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIHRoZSBoYXNodGFibGUgd2l0aCB0aGUgcHJpbWl0aXZlcywgdGhlaXIgbGFuZyBlcXVpdmFsZW50cywgYW5kIGFsc28gY29tbW9uIGNsYXNzZXMgbGlrZSBTdHJpbmcKLQotCQkvLyBQcmltaXRpdmVzCi0JCWZCZWFuUHJveGllcy5wdXQodm9pZFR5cGUuZ2V0VHlwZU5hbWUoKSwgdm9pZFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGludFR5cGUuZ2V0VHlwZU5hbWUoKSwgaW50VHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYm9vbGVhblR5cGUuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhblR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGNoYXJUeXBlLmdldFR5cGVOYW1lKCksIGNoYXJUeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChieXRlVHlwZS5nZXRUeXBlTmFtZSgpLCBieXRlVHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQoc2hvcnRUeXBlLmdldFR5cGVOYW1lKCksIHNob3J0VHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQobG9uZ1R5cGUuZ2V0VHlwZU5hbWUoKSwgbG9uZ1R5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGZsb2F0VHlwZS5nZXRUeXBlTmFtZSgpLCBmbG9hdFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGRvdWJsZVR5cGUuZ2V0VHlwZU5hbWUoKSwgZG91YmxlVHlwZSk7Ci0KLQkJLy8gamF2YS5sYW5nIHByaW1pdGl2ZSBwZWVycwotCQkvLyBOb3RlIHRoYXQgc3BlY2lhbCBjbGFzc2VzIGFyZSB1c2VkIGZvciBzb21lIG9mIHRoZXNlIHdoaWNoIGFsbG93IHRoZSBJREUgdG8gZ2V0IHRoZQotCQkvLyBsYW5nIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0cyB0aGF0IGFyZSBob2xkaW5nIHByb3hpZXMKLQkJZkJlYW5Qcm94aWVzLnB1dChpbnRlZ2VyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgaW50ZWdlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChib29sZWFuQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhbkNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChjaGFyYWN0ZXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBjaGFyYWN0ZXJDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYnl0ZUNsYXNzLmdldFR5cGVOYW1lKCksIGJ5dGVDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoc2hvcnRDbGFzcy5nZXRUeXBlTmFtZSgpLCBzaG9ydENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChsb25nQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgbG9uZ0NsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChmbG9hdENsYXNzLmdldFR5cGVOYW1lKCksIGZsb2F0Q2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KGRvdWJsZUNsYXNzLmdldFR5cGVOYW1lKCksIGRvdWJsZUNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChiaWdEZWNpbWFsQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYmlnRGVjaW1hbENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChiaWdJbnRlZ2VyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYmlnSW50ZWdlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChzdHJpbmdDbGFzcy5nZXRUeXBlTmFtZSgpLCBzdHJpbmdDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQodGhyb3dhYmxlQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgdGhyb3dhYmxlQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KG9iamVjdENsYXNzLmdldFR5cGVOYW1lKCksIG9iamVjdENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChjbGFzc0NsYXNzLmdldFR5cGVOYW1lKCksIGNsYXNzQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KG51bWJlckNsYXNzLmdldFR5cGVOYW1lKCksIG51bWJlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dCh0aHJlYWRDbGFzcy5nZXRUeXBlTmFtZSgpLCB0aHJlYWRDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoZXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBleHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlckNsYXNzKTsKLQotCQkvLyBNYXJrIHRoZXNlIGFzIHBlcm1hbmVudC4KLQkJZlBlcm1hbmVudFByb3hpZXMuYWRkQWxsKGZCZWFuUHJveGllcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBBRlRFUiBCZWFuUHJveHlGYWN0b3J5IGhhcyBiZWVuIGNyZWF0ZWQuIFRoaXMgaXMgUkVRVUlSRUQhIE5PVEU6IEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIHRoYXQgb25seSBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkKLQkgKiBjYW4gY2FsbCBpdCB3aGVuIHJlYWR5LgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSkgewotCQlmQmVhbkZhY3RvcnkgPSBwcm94eUZhY3Rvcnk7Ci0JCWZCZWFuRmFjdG9yeS5yZWdpc3RlclByb3hpZXMoZkJlYW5Qcm94aWVzLnZhbHVlcygpKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Uga25vdyB3ZSBkb24ndCBoYXZlIHRoZSBjbGFzcyByZWdpc3RlcmVkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgcHJveHkuIFdlIGhhdmUgYSBjb25uZWN0aW9uIHBhc3NlZCBpbiBhbmQgd2lsbCByZXVzZQotCSAqIGl0IGFzIG5lY2Vzc2FyeQotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJUkVNQmVhblR5cGVQcm94eSBjcmVhdGVCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCi0JCS8vIFdlIGRvbid0IGhhdmUgdGhlIGJlYW50eXBlIHByb3h5LCBzbyBjcmVhdGUgaXQuCi0JCUlSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkgPSBudWxsOwotCQlDb21tYW5kcy5HZXRDbGFzc1JldHVybiByZXQgPSBudWxsOwotCQl0cnkgewotCQkJcmV0ID0gZ2V0Q2xhc3NSZXR1cm4oY29ubmVjdGlvbiwgdHlwZU5hbWUpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlcCkgewotCQkJLy8gUHJpbnQgb3V0IHRoZSB0cmFjZSBhbmQgcmV0dXJuIHByb3h5IHdpdGggaW5pdCBlcnJvci4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlcCkpOyAvLyROT04tTkxTLTEkCi0JCQlJUkVNQmVhblR5cGVQcm94eSBwcm94eSA9IG5ldyBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuRXhjZXB0aW9uRXJyb3JNc2dfRVhDXywgbmV3IE9iamVjdFtdIHsgZXAuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgZXAuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgdHlwZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkocHJveHksIGZhbHNlKTsKLQkJCXJldHVybiBwcm94eTsKLQkJfQotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCWlmIChmTm90Rm91bmRUeXBlcyAhPSBudWxsKQotCQkJCWZOb3RGb3VuZFR5cGVzLmFkZCh0eXBlTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gVGhlIGNsYXNzIGRvZXNuJ3QgZXZlbiBleGlzdCBvbiB0aGUgc2VydmVyLgotCQl9Ci0KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheS4KLQkJCUlSRU1CZWFuVHlwZVByb3h5IHN1cGVyVHlwZVByb3h5ID0gbnVsbDsKLQkJCWlmICghcmV0LmlzSW50ZXJmYWNlICYmIHJldC5zdXBlckNsYXNzbmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJLy8gR2V0IHRoZSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc3VwZXJjbGFzcy4KLQkJCQlzdXBlclR5cGVQcm94eSA9IGdldEJlYW5UeXBlUHJveHkocmV0LnN1cGVyQ2xhc3NuYW1lLCBjb25uZWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4gVGhpcyBjaGVjayBpcyBoZXJlIGluIGNhc2UgdGhlCi0JCQkvLyBleHRlbnNpb24gZmFjdG9yeSBjYW4gaGFuZGxlIHRoaXMgY2xhc3MgYnV0IG5lZWRzIHRoZSBpZCBmcm9tIHRoZSBzZXJ2ZXIgdG8KLQkJCS8vIGNyZWF0ZSBpdC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBuZXcgSW50ZWdlcihyZXQuY2xhc3NJRCksIHN1cGVyVHlwZVByb3h5KTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmV0LmlzSW50ZXJmYWNlKSB7Ci0JCQkJLy8gSW50ZXJmYWNlIG5ldmVyIGhhdmUgYSBzdXBlciB0eXBlLCBzbyB3ZSB3aWxsIGNyZWF0ZSBhIHNwZWNpZmljIHR5cGUuCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG5ldyBJbnRlZ2VyKHJldC5jbGFzc0lEKSwgdHlwZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBc2sgdGhlIHN1cGVydHlwZQotCQkJCS8vIHRvIGNyZWF0ZSBhIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzYW1lIGJlYW50eXBlIHByb3h5IGNsYXNzLgotCQkJCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgc3ViY2xhc3NlcyB3aWxsIGdldCB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcwotCQkJCS8vIGZvciBpdCBpZiBpdCBpcyBzcGVjaWFsLgotCQkJCWlmIChzdXBlclR5cGVQcm94eSAhPSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gc3VwZXJUeXBlUHJveHkubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihyZXQuY2xhc3NJRCksIHR5cGVOYW1lLCByZXQuaXNBYnN0cmFjdCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1BcnJheUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbmV3IEludGVnZXIocmV0LmNsYXNzSUQpLCB0eXBlTmFtZSwgb2JqZWN0Q2xhc3MpOwotCi0JCS8vIENhY2hlIHRoZSBpbnN0YW5jZSBzbyB3ZSBjYW4gcmUtdXNlIGl0IGFnYWluCi0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGUgaGVscGVyIGNsYXNzIHRvIGZpbmQgYSBjbGFzcyBieSBuYW1lLCB0aGVuIGNyZWF0ZSB0aGUgcHJveHkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKHR5cGVOYW1lKSwgKElSRU1Db25uZWN0aW9uKSBudWxsKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUcnkgb25jZSBtb3JlICh3ZSB3b24ndCBoYXZlIHJlY2VpdmVkIHJlY292ZXJhYmxlIGV4Y2VwdGlvbnMgaGVyZSwgdGhleSB3ZXJlIGFscmVhZHkgY2F1Z2h0IGFuZCBoYW5kbGVkKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eSh0eXBlTmFtZSwgKElSRU1Db25uZWN0aW9uKSBudWxsKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJLy8gRmFpbGVkIGFnYWluLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGVBZ2FpbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXR5cGVOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZSh0eXBlTmFtZSk7Ci0JCS8vIFNlZSB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJveHkgZm9yIHRoZSBhcmd1bWVudCBuYW1lCi0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSAoSVByb3h5QmVhblR5cGUpIGZCZWFuUHJveGllcy5nZXQodHlwZU5hbWUpOwotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JCQotCQkvLyBOb3cgc2VlIGlmIGFuIGV4cHJlc3Npb24gcHJveHkgY2FjaGVkLgotCQliZWFuVHlwZVByb3h5ID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRCZWFuVHlwZSh0eXBlTmFtZSk7Ci0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpCi0JCQlyZXR1cm4gYmVhblR5cGVQcm94eTsJCQotCi0JCS8vIElmIG5vdCBhbiBhcnJheSwgdGhlbiBzZWUgaWYgdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIG1lY2hhbmlzbSBjYW4gZmluZCBpdC4KLQkJLy8gRG8gdGhpcyBoZXJlIHNvIHRoYXQgaWYgaXQgaXMgZm91bmQgaW4gdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIHdlIHdvbid0IG5lY2Vzc2FyaWx5IGNyZWF0ZSBhbgotCQkvLyBleHRyYSBjb25uZWN0aW9uIHdoZW4gbm90IG5lZWRlZC4KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBleHByZXNzaW9uKTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gTmVlZCB0byBjcmVhdGUgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIGl0LgotCQliZWFuVHlwZVByb3h5ID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSh0eXBlTmFtZSk7Ci0JCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCXJldHVybiBiZWFuVHlwZVByb3h5OwotCi0JfQotCi0JLyoqCi0JICogT25lIHRoYXQgaW50ZXJuYWxseSBhbGxvd3MgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uIHRvIHdvcmsgd2l0aC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbnVsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBudWxsLCB0aGVuIHdlIGFyZSBpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIElSRU1CZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJUkVNQ29ubmVjdGlvbiBpbkNvbm5lY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQkvLyBTZWUgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3h5IGZvciB0aGUgYXJndW1lbnQgbmFtZQotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gKElQcm94eUJlYW5UeXBlKSBmQmVhblByb3hpZXMuZ2V0KHR5cGVOYW1lKTsKLQkJLy8gU2VlIGlmIHRoZXJlIGFuZCByZXNvbHZlZCwgaWYgc28sIHJldHVybiBpdC4gSWYgbm90IHJlc29sdmVkLCB0aGF0IG1lYW5zIHdlIG5lZWQgaXQgTk9XCi0JCS8vIHNvIHdlIG11c3QgZ28gZm9yIGl0LiBXaGVuIGZpbmFsbHkgcmVzb2x2ZWQgdGhlIG9yaWdpbmFsIEV4cHJlc3Npb25Qcm94eSB3aWxsIGJlIGRlcmVnaXN0ZXJlZCBhbmQKLQkJLy8gdGhlIHJlc29sdmVkIGJlYW50eXBlcHJveHkgd2lsbCBiZSBpbiBpdHMgcGxhY2UuCi0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwgJiYgYmVhblR5cGVQcm94eS5pc0JlYW5Qcm94eSgpKSB7IHJldHVybiAoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7IH0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgcGFja2FnZUZhY3RvcnkgPSAoSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiAoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gaW5Db25uZWN0ICE9IG51bGwgPyBpbkNvbm5lY3QgOiBmRmFjdG9yeVJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCWlmIChpbkNvbm5lY3QgPT0gbnVsbCkKLQkJCWZCZWFuRmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7IC8vIFN0YXJ0IGEgdHJhbnNhdGlvbi4KLQkJdHJ5IHsKLQkJCXJldHVybiBjcmVhdGVCZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBjb25uZWN0KTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoaW5Db25uZWN0ID09IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLCBub3QgcmV0dXJuIGl0LgotCQkJCWZGYWN0b3J5UmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCWNvbm5lY3QgPSBudWxsOyAvLyBTbyB0aGF0IGl0IHdvbid0IGJlIHJldHVybmVkLgotCQkJfQotCQkJdGhyb3cgZTsgLy8gUGFzcyBpdCBvbiB1cAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluQ29ubmVjdCA9PSBudWxsKQotCQkJCWZCZWFuRmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLQkJCWlmIChpbkNvbm5lY3QgPT0gbnVsbCAmJiBjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnlSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhpcyBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgQ29tbWFuZHMuR2V0Q2xhc3NSZXR1cm4gZ2V0Q2xhc3NSZXR1cm4oSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25uZWN0aW9uLmdldENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlmQmVhbkZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOyAvLyBMZXQgcHJveHkgZmFjdG9yeSBoYW5kbGUgdGhlIGVycm9yIHJldHVybgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBBcnJheSB0eXBlIHByb3h5IGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLiBUaGUgc2FtZSByZXN1bHQgY2FuIGJlIGdvdHRvbiBmcm9tCi0JICogZ2V0QmVhblR5cGVQcm94eS4gZS5nLiBnZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgMykgaXMgdGhlIHNhbWUgYXM6IGdldEJlYW5UeXBlUHJveHkoIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIpCi0JICogCi0JICogVGhleSBib3RoIHJlc3VsdCBpbiBhIHR5cGUgb2Y6IE9iamVjdCBbXVtdW10KLQkgKiAKLQkgKiBvciBnZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZ09iamVjdDsiLCAzKSBiZWNvbWVzIE9iamVjdCBbXVtdW11bXQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyBjb21wb25lbnRDbGFzc05hbWUsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGdldEFycmF5Q2xhc3NOYW1lKGNvbXBvbmVudENsYXNzTmFtZSwgZGltZW5zaW9ucykpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnRDbGFzc05hbWUKLQkgKiBAcGFyYW0gZGltZW5zaW9ucwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcnJheUNsYXNzTmFtZShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlTdHJpbmcgam5pQ29tcG9uZW50Q2xhc3NOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjb21wb25lbnRDbGFzc05hbWUpOwotCQlTdHJpbmcgY29tcFR5cGUgPSBqbmlDb21wb25lbnRDbGFzc05hbWU7Ci0JCWlmIChqbmlDb21wb25lbnRDbGFzc05hbWUuY2hhckF0KDApICE9ICdbJykgewotCQkJLy8gV2UncmUgbm90IGFscmVhZHkgYW4gYXJyYXksIHNvIGNyZWF0ZSBjb3JyZWN0IHRlbXBsYXRlLgotCQkJY29tcFR5cGUgPSAoU3RyaW5nKSBNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcuZ2V0KGpuaUNvbXBvbmVudENsYXNzTmFtZSk7Ci0JCQlpZiAoY29tcFR5cGUgPT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGEgY2xhc3MsIGFuZCBub3QgYSB0eXBlLgotCQkJCWNvbXBUeXBlID0gIkwiICsgam5pQ29tcG9uZW50Q2xhc3NOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBjcmVhdGUgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mICdbJyBpbiBmcm9udC4KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZGltZW5zaW9ucyArIGNvbXBUeXBlLmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspCi0JCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29tcFR5cGUpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjb21wb25lbnRDbGFzc05hbWUsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGdldEFycmF5Q2xhc3NOYW1lKGNvbXBvbmVudENsYXNzTmFtZSwgZGltZW5zaW9ucykpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbiB0eXBlIHByb3h5IGZyb20gYSBjbGFzcyBpZC4gVGhpcyBtZWFucyB0aGF0IGEgbmV3IGNsYXNzIGlkIHdhcyBzZW50IGJhY2sgZnJvbSB0aGUgc2VydmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSB5ZXQuIFdlIG5lZWQgdG8gZ28gYXNrCi0JICogdGhlIHNlcnZlciBmb3IgaW5mb3JtYXRpb24gb24gdGhpcyB0eXBlIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBpdC4KLQkgKiAKLQkgKiBOT1RFOiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIHRoYXQgb25seSB0aGUgc3RhbmRhcmQgYmVhbiBwcm94eSBmYWN0b3J5IGNhbiBjYWxsIGl0LgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaGFzIGJlZW4gY2FsbGVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCUlSRU1CZWFuVHlwZVByb3h5IGNyZWF0ZUJlYW5UeXBlUHJveHkoSW50ZWdlciBjbGFzc0lEKSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY3JlYXRlQmVhblR5cGVQcm94eShjbGFzc0lELCBjb25uZWN0KTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkvLyBJdCBpcyByZWNvdmVyYWJsZSwgcHJpbnQgbWVzc2FnZSwga2VlcCBjb25uZWN0aW9uIGxpdmUgYW5kIHJldHVybiBpdC4KLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCS8vIFRyeSBhZ2FpbiwgY2xvc2UgY29ubmVjdGlvbiwgZ2V0IGEgbmV3IG9uZS4KLQkJCQlmRmFjdG9yeVJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQljb25uZWN0ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBjcmVhdGVCZWFuVHlwZVByb3h5KGNsYXNzSUQsIGNvbm5lY3QpOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gQ2xvc2UgY29ubmVjdGlvbiwgZG9uJ3QgcmV0dXJuIGl0LgotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZUFnYWluKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkZhY3RvcnlSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnlSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogT25lIHRoYXQgaW50ZXJuYWxseSBhbGxvd3MgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uIHRvIHdvcmsgd2l0aC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbnVsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVJFTUJlYW5UeXBlUHJveHkgY3JlYXRlQmVhblR5cGVQcm94eShJbnRlZ2VyIGNsYXNzSUQsIElSRU1Db25uZWN0aW9uIGNvbm5lY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJLy8gV2UgZG9uJ3QgaGF2ZSB0aGUgYmVhbnR5cGUgcHJveHksIHNvIGNyZWF0ZSBpdC4KLQkJSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGVQcm94eSA9IG51bGw7Ci0KLQkJQ29tbWFuZHMuR2V0Q2xhc3NJRFJldHVybiByZXQgPSBudWxsOwotCQl0cnkgewotCQkJcmV0ID0gZ2V0Q2xhc3NJRFJldHVybihjb25uZWN0LCBjbGFzc0lEKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXApIHsKLQkJCS8vIEp1c3QgcHJpbnQgb3V0IHRoZSB0cmFjZSBhbmQgcmV0dXJuIHByb3h5IG5vdCBmb3VuZC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlcCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIElmIHRoZSBzaWduYXR1cmUgaXMgdGhhdCBvZiBhIGNsYXNzLgotCQlpZiAocmV0LmNsYXNzTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkuCi0JCQlJUkVNQmVhblR5cGVQcm94eSBzdXBlclR5cGVQcm94eSA9IG51bGw7Ci0JCQlpZiAoIXJldC5pc0ludGVyZmFjZSAmJiByZXQuc3VwZXJDbGFzc25hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCS8vIEdldCB0aGUgYmVhbnR5cGUgcHJveHkgb2YgdGhlIHN1cGVyY2xhc3MuCi0JCQkJc3VwZXJUeXBlUHJveHkgPSBnZXRCZWFuVHlwZVByb3h5KHJldC5zdXBlckNsYXNzbmFtZSwgY29ubmVjdCk7Ci0JCQl9Ci0KLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gcmV0LmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHJldC5jbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VJbmRleCk7Ci0JCQkJSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5IHBhY2thZ2VGYWN0b3J5ID0gKElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeUV4dGVuc2lvbihwYWNrYWdlTmFtZSk7Ci0JCQkJaWYgKHBhY2thZ2VGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJYmVhblR5cGVQcm94eSA9IHBhY2thZ2VGYWN0b3J5LmdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkocmV0LmNsYXNzTmFtZSwgY2xhc3NJRCwgc3VwZXJUeXBlUHJveHkpOwotCQkJCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKSB7Ci0JCQkJCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQkJCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXQuaXNJbnRlcmZhY2UpIHsKLQkJCQkvLyBJbnRlcmZhY2UgbmV2ZXIgaGF2ZSBhIHN1cGVyIHR5cGUsIHNvIHdlIHdpbGwgbGV0IHRoZSBvYmplY3QgY2xhc3MgZG8gaXQgZm9yIHVzLgotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBjbGFzc0lELCByZXQuY2xhc3NOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQXNrIHRoZSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc3VwZXJjbGFzcwotCQkJCS8vIHRvIGNyZWF0ZSBhIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzYW1lIGJlYW50eXBlIHByb3h5IGNsYXNzLgotCQkJCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgc3ViY2xhc3NlcyB3aWxsIGdldCB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcwotCQkJCS8vIGZvciBpdCBpZiBpdCBpcyBzcGVjaWFsLgotCQkJCWlmIChzdXBlclR5cGVQcm94eSAhPSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gc3VwZXJUeXBlUHJveHkubmV3QmVhblR5cGVGb3JDbGFzcyhjbGFzc0lELCByZXQuY2xhc3NOYW1lLCByZXQuaXNBYnN0cmFjdCk7Ci0JCQl9Ci0KLQkJCS8vIENhY2hlIHRoZSBpbnN0YW5jZSBzbyB3ZSBjYW4gcmUtdXNlIGl0IGFnYWluCi0JCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIGFuIGFycmF5LgotCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1BcnJheUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgcmV0LmNsYXNzTmFtZSwgb2JqZWN0Q2xhc3MpOwotCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kcy5HZXRDbGFzc0lEUmV0dXJuIGdldENsYXNzSURSZXR1cm4oSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q2xhc3NGcm9tSUQoY2xhc3NJRC5pbnRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCWZCZWFuRmFjdG9yeS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7IC8vIExldCBwcm94eSBmYWN0b3J5IGhhbmRsZSB0aGUgZXJyb3IgcmV0dXJuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCWZCZWFuUHJveGllcy5wdXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSwgYUJlYW5UeXBlUHJveHkpOwotCQlmQmVhbkZhY3RvcnkucmVnaXN0ZXJQcm94eSgoSVJFTUJlYW5Qcm94eSkgYUJlYW5UeXBlUHJveHkpOwotCQlpZiAocGVybWFuZW50KQotCQkJZlBlcm1hbmVudFByb3hpZXMuYWRkKGFCZWFuVHlwZVByb3h5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyQmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFQcm94eUJlYW5UeXBlLCBmaW5hbCBib29sZWFuIHBlcm1hbmVudCkgewotCQlpZiAoYVByb3h5QmVhblR5cGUuaXNCZWFuUHJveHkoKSkKLQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSUJlYW5UeXBlUHJveHkpIGFQcm94eUJlYW5UeXBlLCBwZXJtYW5lbnQpOyAvLyBBIHJlZ3VsYXIga2luZCwgZG8gcmVndWxhciByZWdpc3RyYXRpb24uCi0JCWVsc2UgewotCQkJRXhwcmVzc2lvblByb3h5IGJlYW5FeHByZXNzaW9uUHJveHkgPSAoKEV4cHJlc3Npb25Qcm94eSkgYVByb3h5QmVhblR5cGUpOwotCQkJZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gYVByb3h5QmVhblR5cGUuZ2V0VHlwZU5hbWUoKTsKLQkJCSgoUkVNRXhwcmVzc2lvbikgYmVhbkV4cHJlc3Npb25Qcm94eS5nZXRFeHByZXNzaW9uKCkpLmFkZEJlYW5UeXBlKHR5cGVOYW1lLCBhUHJveHlCZWFuVHlwZSk7Ci0JCQliZWFuRXhwcmVzc2lvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gKChJUHJveHlCZWFuVHlwZSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldFR5cGVOYW1lKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS50aGlzKSB7Ci0JCQkJCQlpZiAoIWZCZWFuUHJveGllcy5jb250YWluc0tleSh0eXBlTmFtZSkpIHsKLQkJCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiByZXNvbHZlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuIFNvIHRoaXMgaXMgZ29vZC4gQWN0dWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIKLQkJCQkJCQkvLyBvY2N1ciBiZWNhdXNlIHVwb24gcmVzb2x1dGlvbiB3ZSd2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlIGJlYW4gdHlwZSBwcm94eSB0aHJvdWdoIHRoZQotCQkJCQkJCS8vIG5vcm1hbCBtZWNoYW5pc21zLiBCdXQgdG8gYmUgc2FmZSwgd2UnbGwgZG8gaXQgaGVyZS4KLQkJCQkJCQlmQmVhblByb3hpZXMucHV0KHR5cGVOYW1lLCBldmVudC5nZXRQcm94eSgpKTsKLQkJCQkJCQlpZiAocGVybWFuZW50KQotCQkJCQkJCQlmUGVybWFuZW50UHJveGllcy5hZGQoZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCQkoKFJFTUV4cHJlc3Npb24pICgoRXhwcmVzc2lvblByb3h5KSBldmVudC5nZXRTb3VyY2UoKSkuZ2V0RXhwcmVzc2lvbigpKS5yZW1vdmVCZWFuVHlwZSh0eXBlTmFtZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEEgYmVhbnR5cGUgcHJveHkgaXMgYXNrZWQgdG8gYmUgcmVsZWFzZWQuIFdlIGNhbiBvbmx5IHJlbGVhc2Ugb25lcyB0aGF0IHdlcmUgbm90IGluIHRoZSBwZXJtYW5lbnQgc2V0IHRoYXQgd2UgaW5pdGlhbGl6ZWQgd2l0aC4gVGhvc2UgaW4gdGhlCi0JICogcGVybWFuZW50IHNldCBjYW4ndCBiZSBjaGFuZ2VkIHNvIHdlIGNhbid0IHJlbGVhc2UgdGhlbS4KLQkgKiAKLQkgKiBBbnN3ZXIgd2hldGhlciBpdCBjYW4gYmUgcmVsZWFzZWQgZnJvbSB0aGUgc2VydmVyIHRvby4KLQkgKiAKLQkgKiBOT1RFOiBQYWNrYWdlIHByb3RlY3RlZCBzaW5jZSBvbmx5IFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBzaG91bGQgY2FsbCBpdC4KLQkgKi8KLQlib29sZWFuIHJlbGVhc2VQcm94eShJQmVhblR5cGVQcm94eSBwcm94eSkgewotCQkvKioKLQkJICogQ3VycmVudGx5IHdlIHdvbid0IGFsbG93IGFueSBiZWFuIHR5cGUgcHJveGllcyB0byBiZSByZWxlYXNlZC4gV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIHRoYXQgdGhlcmUgbWF5IGJlIGhhcmQgcmVmcyBmcm9tCi0JCSAqIHN1YnR5cGVzLiBPbmUgdGhvdWdodCBpcyB0aGF0IGJlYW5wcm94aWVzIHRhYmxlIHNob3VsZCBzdG9yZSBTb2Z0UmVmZXJlbmNlcyBzbyB0aGF0IG9ubHkgd2hlbiBzcGFjZSBpcyBuZWVkZWQsIHRoYXQgYW55IGJlYW50eXBlIHRoYXQKLQkJICogZG9lc24ndCBoYXZlIGEgc3VidHlwZSAoc2luY2Ugc3VidHlwZXMgaG9sZCBhIHN0cm9uZyByZWYpIG9yLCBpcyBpbiB0aGUgcGVybWFuZW50IHRhYmxlIChzaW5jZSB0aGF0IGlzIGhhcmRyZWYpIGNvdWxkIGJlIEdDJ2QuIFRoZW4gd2hhdAotCQkgKiB3b3VsZCBoYXBwZW4gaXMgb24gcmVsZWFzZVByb3h5IHdlIGRvbid0IGFjdHVhbGx5IHJlbGVhc2UsIHdlIGNoYW5nZSBpdCB0byBhIFdlYWtSZWYgc28gdGhhdCBpdCB3b3VsZCBkZWZpbml0ZWx5IGJlIHJlbGVhc2VkIG9uIGEgR0MuIFRoZXNlCi0JCSAqIGFyZSBjb21wbGljYXRlZCBhcmNoLiBhbmQgd2UncmUgbm90IHN1cmUgaWYgaXQgc2hvdWxkIGJlIGFsbG93ZWQgb3Igbm90LiBTbyBmb3Igbm93LCB3ZSBkb24ndCBhbGxvdyB0aGVtIHRvIGJlIHJlbGVhc2VkLiBpZgotCQkgKiAoIWZQZXJtYW5lbnRQcm94aWVzLmNvbnRhaW5zKHByb3h5KSkgeyAvLyBXZSBjYW4gcmVsZWFzZSBpdC4gSXQgaXMgbm90IG9uZSBvZiB0aGUgcGVybWFuZW50IG9uZXMuIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCSAqIGZCZWFuUHJveGllcy5yZW1vdmUocHJveHkuZ2V0VHlwZU5hbWUoKSk7IHJldHVybiB0cnVlOyB9IH0KLQkJICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFRlcm1pbmF0ZSB0aGlzIGZhY3RvcnkuIFNpbmNlIGFsbCBvZiB0aGUgcHJveGllcyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcHJveHkgZmFjdG9yeSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZWxlYXNlIHRoZW0gaGVyZS4gVGhlcmUgaXMgbm8gbmVlZAotCSAqIHRvIGNsZWFyIG91dCBhbnkgZmllbGRzIHNpbmNlIHRoaXMgZmFjdG9yeSB3aWxsIG5vdCBiZSBoZWxkIG9udG8gYnkgYW55dGhpbmcgYW5kIHNvIGl0IHdpbGwgYmUgR0MnZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0JlYW5UeXBlUmVnaXN0ZXJlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBmQmVhblByb3hpZXMuY29udGFpbnNLZXkoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyZWRUeXBlcygpCi0JICovCi0JcHVibGljIFNldCByZWdpc3RlcmVkVHlwZXMoKSB7Ci0JCXJldHVybiBmQmVhblByb3hpZXMua2V5U2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gZk5vdEZvdW5kVHlwZXMgIT0gbnVsbCAmJiBmTm90Rm91bmRUeXBlcy5jb250YWlucyhNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc01haW50YWluTm90Rm91bmRUeXBlcygpIHsKLQkJcmV0dXJuIGZOb3RGb3VuZFR5cGVzICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TWFpbnRhaW5Ob3RGb3VuZFR5cGVzKGJvb2xlYW4gbWFpbnRhaW4pIHsKLQkJaWYgKG1haW50YWluKSB7Ci0JCQlpZiAoZk5vdEZvdW5kVHlwZXMgPT0gbnVsbCkKLQkJCQlmTm90Rm91bmRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0gZWxzZQotCQkJZk5vdEZvdW5kVHlwZXMgPSBudWxsOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzOTZkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBSZW1vdGUgVk0gSW1wbGVtZW50YXRpb24gb2YgSVN0cmluZ0JlYW5Qcm94eQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNU3RyaW5nQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJU3RyaW5nQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmU3RyaW5nOwotCi0vKioKLSAqIFN0b3JlIHRoZSBiZWFuIGluIHRoZSBzdHJpbmcgZmllbGQgdG8gc2F2ZSByZS1jYXN0aW5nIGVhY2ggdGltZSBpdCBpcyBhc2tlZCBmb3IuCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqLwotUkVNU3RyaW5nQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgU3RyaW5nIHZhbHVlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmU3RyaW5nID0gdmFsdWU7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSVN0cmluZ0JlYW5Qcm94eSkKLQkJcmV0dXJuIGZTdHJpbmcuZXF1YWxzKCgoSVN0cmluZ0JlYW5Qcm94eSkgYW5PYmplY3QpLnN0cmluZ1ZhbHVlKCkpOwotCWVsc2UKLQkJcmV0dXJuIGZTdHJpbmcuZXF1YWxzKGFuT2JqZWN0KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBjYWNoZSdkIHN0cmluZyB0aGF0IGlzIGEgamF2YS5sYW5nLlN0cmluZyB0aGF0IHRoZSBJREUgY2FuIHVzZQotICovCi1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCXJldHVybiBmU3RyaW5nOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdG9TdHJpbmcgdmFsdWUgZnJvbSB0aGUgYmVhbi4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZTdHJpbmcudG9TdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuc3RyaW5nQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZTdHJpbmcpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGMyOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgdGhlIEJlYW5UeXBlIHByb3h5IGZvciBqYXZhLmxhbmcuU3RyaW5nCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6MjMgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1TdHJpbmdCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSB7Ci0JLy8gQ2FjaGUgYSBwcm94eSB0byBhbiBlbXB0eSBzdHJpbmcgZm9yIHNwZWVkCi0JcHJvdGVjdGVkIGZpbmFsIElTdHJpbmdCZWFuUHJveHkgZW1wdHlTdHJpbmdQcm94eTsKLS8qKgotICogSURFU3RyaW5nQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNU3RyaW5nQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuU1RSSU5HX0NMQVNTKSwgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgb2JqZWN0VHlwZVByb3h5KTsKLQotCS8vIENhY2hlIGEgcHJveHkgdG8gYW4gZW1wdHkgc3RyaW5nIGZvciBzcGVlZAotCWVtcHR5U3RyaW5nUHJveHkgPSBuZXcgUkVNU3RyaW5nQmVhblByb3h5KGFSZWdpc3RyeSwgIiIpOwkvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgc3RyaW5nIGJlYW5zCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG5vLW9uZSBlbHNlIG91dHNpZGUgdGhlIHBhY2thZ2Ugc2hvdWxkIHVzZSB0aGlzLCB0aGV5Ci0gKiBtdXN0IGdvIHRocm91Z2ggdGhlIEFQSSB3aGVyZSB5b3UgbG9vayB1cCBhIGZhY3RvcnkgZmlyc3QuCi0gKi8KLUlTdHJpbmdCZWFuUHJveHkgY3JlYXRlU3RyaW5nQmVhblByb3h5KFN0cmluZyBhU3RyaW5nKXsKLQlpZiAoIGFTdHJpbmcuZXF1YWxzKCIiKSApIHsvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbXB0eVN0cmluZ1Byb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgUkVNU3RyaW5nQmVhblByb3h5KGZSZWdpc3RyeSwgYVN0cmluZyk7Ci0JfQotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gU3RyaW5nIGhhcyBhIGRlZmF1bHQgY3RvciwgYnV0IGl0IHJlc3VsdHMgaW4gdGhlIGVtcHR5U3RyaW5nUHJveHksCi0gKiBzbyByZXR1cm4gdGhlIHplcm9Qcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIGVtcHR5U3RyaW5nUHJveHk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kIGNvbW1lbnQuIFB1dCBhIHNob3J0IGN1dCBpbiBmb3Igc3RyaW5ncyBzbyB3ZSBkb24ndCBuZWVkIHRvIGdvIHRvIHRoZSByZW1vdGUKLSAqIHZtIGp1c3QgdG8gY3JlYXRlIGEgc3RyaW5nLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQlpZiAoaW5pdGlhbGl6YXRpb25TdHJpbmcubGVuZ3RoKCkgPD0gMSkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gTm90IGxhcmdlIGVub3VnaCBmb3IgdHdvIHF1b3Rlcywgc28gbGV0IGRlZmF1bHQgaGFuZGxlIGl0LgotCS8vIE5lZWQgYSBxdWljayBjaGVjayB0aGF0IGl0IGlzIG9ubHkgb25lIHF1b3RlZCBzdHJpbmcuIEFueXRoaW5nIGVsc2UgbmVlZHMgdG8gYmUgcGFzc2VkIG9uIHVwLgotCVN0cmluZyBzID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWludCBzbCA9IHMubGVuZ3RoKCktMTsJCi0JaWYgKHMuY2hhckF0KDApICE9ICciJyB8fCBzLmNoYXJBdChzbCkgIT0gJyInKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBObyBsZWFkaW5nIGFuZCB0cmFpbGluZyBxdW90ZS4KLQotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc2wpOwotCWJvb2xlYW4gZXNjYXBlID0gZmFsc2U7CQkKLQlmb3IgKGludCBpPTE7IGk8c2w7IGkrKykgewotCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJaWYgKGMgPT0gJ1xcJykgewotCQkJZXNjYXBlID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghZXNjYXBlICYmIGMgPT0gJyInKQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gSGFkIGEgcXVvdGUgaW4gdGhlIG1pZGRsZSB3aXRob3V0IGFuIGVzY2FwZS4gVGhpcyBtZWFucyBhbiBleHByZXNzaW9uLCBzZW5kIG9uIHVwLgotCQllc2NhcGUgPSBmYWxzZTsKLQkJc2IuYXBwZW5kKGMpOwotCX0KLQkKLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChzYi50b1N0cmluZygpKTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVTdHJpbmdCZWFuUHJveHkoKFN0cmluZykgdmFsdWUuYW5PYmplY3QpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDU1OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci0vKioKLSAqIEV4Y2VwdGlvbiBQcm94eSBmb3IgZXhjZXB0aW9uIG9uIFJlbW90ZS4KLSAqIE5PVEU6IFRoaXMgb25lIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBkb2Vzbid0IGluaGVyaXQgZnJvbQotICogICAgICAgSURFQmVhblByb3h5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgYW4gZXhjZXB0aW9uLCBhbmQKLSAqICAgICAgIGV4Y2VwdGlvbnMgYXJlIG5vdCBhbiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1UaHJvd2FibGVCZWFuUHJveHkgZXh0ZW5kcyBUaHJvd2FibGVQcm94eSBpbXBsZW1lbnRzIElSRU1CZWFuUHJveHkgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDc2Nzc3MzM2ODEwMjE1MjA2TDsKLQlwcml2YXRlIEludGVnZXIgZklEOwotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeTsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5IGZUeXBlUHJveHk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJlYW4gd2UgYXJlIHByb3h5aW5nLiAgV2UgYXJlIGEgcHJveHkgZm9yIGEgYmVhbiBydW5uaW5nIG9uIHRoZSByZW1vdGUgVk0uIAotCSAqLwotCXByb3RlY3RlZCBSRU1UaHJvd2FibGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKXsKLQkJZkZhY3RvcnkgPSBhUmVnaXN0cnk7Ci0JCWZJRCA9IGFuSUQ7Ci0JCWZUeXBlUHJveHkgPSBhVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjoKLQkgKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0JICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotCSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0JICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotCSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHN1cGVyLmVxdWFscyhhbk9iamVjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSUJlYW5Qcm94eSAmJiAhKGFuT2JqZWN0IGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblByb3h5KSAmJiBmRmFjdG9yeS5pc1ZhbGlkKCkgJiYgKChJQmVhblByb3h5KSBhbk9iamVjdCkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSA9PSBmRmFjdG9yeSkKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlIG90aGVyIGlzIGEgYmVhbiBwcm94eSBhbmQgaXMgbm90IGEgY29uc3RhbnQgb25lLCBsZXQgdGhlIHNlcnZlciBkbyB0aGUgY2hlY2suCi0JCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0RXF1YWxzKCkuaW52b2tlKHRoaXMsIChJQmVhblByb3h5KSBhbk9iamVjdCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7CS8vIFdlIGNhbiBiZSBhc3N1cmVkIGluIFJlbW90ZSBQcm94eSB0aGF0IGlkZW50aXR5IG9mIHByb3h5IGFuZCBpZGVudGl0eSBvZiBvYmplY3QgYXJlIHRoZSBzYW1lLgotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgSUQuIEFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIG9ubHkgd2l0aGluIHRoZSBQcm94eUZhY3RvcnkgZmFtaWx5LgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQkKLQkvKioKLQkgKiBpc1ZhbGlkIC0gaGFzIHRoaXMgYmVhbiBiZWVuIHJlbGVhc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSUQgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmVsZWFzZSAtIFRoZSBiZWFuIGlzIGJlaW5nIHJlbGVhc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZJRCA9IG51bGw7Ci0JCWZUeXBlUHJveHkgPSBudWxsOwotCX0gCi0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBwcm94eSB3YXMgY3JlYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3hpZWQgY2xhc3Mgb2YgdGhlIGJlYW4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLQkgKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiBmVHlwZVByb3h5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvU3RyaW5nIG9mIHRoZSBhY3R1YWwgYmVhbiBvbiB0aGUgcmVtb3RlIHNpZGUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCUlTdHJpbmdCZWFuUHJveHkgc3RyaW5nID0gKElTdHJpbmdCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0T2JqZWN0VG9TdHJpbmcoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nLnN0cmluZ1ZhbHVlKCkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJSVN0cmluZ0JlYW5Qcm94eSBtc2cgPSAoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQlyZXR1cm4gbXNnICE9IG51bGwgPyBtc2cuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlNZXNzYWdlKCkgewotCQlJU3RyaW5nQmVhblByb3h5IG1zZyA9IChJU3RyaW5nQmVhblByb3h5KSAgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRUaHJvd2FibGVNZXNzYWdlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQlyZXR1cm4gbXNnICE9IG51bGwgPyBtc2cuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRlbXBvcmFyeSB3YXkgdG8gZ2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHN0YWNrdHJhY2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJveHlTdGFja1RyYWNlKCkgewotCQlJTWV0aG9kUHJveHkgdGVtcEdldFN0YWNrVHJhY2UgPSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5TdGFja1RyYWNlVXRpbGl0eSIsICJwcmludFN0YWNrVHJhY2UiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuVGhyb3dhYmxlIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlJU3RyaW5nQmVhblByb3h5IHRyYWNlID0gKElTdHJpbmdCZWFuUHJveHkpIHRlbXBHZXRTdGFja1RyYWNlLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsLCB0aGlzKTsKLQkJcmV0dXJuIHRyYWNlICE9IG51bGwgPyB0cmFjZS5zdHJpbmdWYWx1ZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQod3JpdGVyKSB7Ci0JCQl3cml0ZXIucHJpbnQodHJhY2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gc3RyZWFtKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQoc3RyZWFtKSB7Ci0JCQlzdHJlYW0ucHJpbnQodHJhY2UpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoKSB7Ci0JCVN0cmluZyB0cmFjZSA9IGdldFByb3h5U3RhY2tUcmFjZSgpOwotCQlzeW5jaHJvbml6ZWQoU3lzdGVtLmVycikgewotCQkJU3lzdGVtLmVyci5wcmludCh0cmFjZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEJlbG93IGFyZSB0aGUgYWN0dWFsIHByaW50U3RhY2tUcmFjZS4gVGhleSBhcmUgc2V0IHVwIHRvIGZpcnN0IGNhbGwKLQkgKiB0aGUgcHJveHkgdHJhY2Ugc28gdGhhdCBpdCBjYW4gc2hvdyB3aGVyZSBpdCBvY2N1cnJlZCBvbiB0aGUgc2VydmVyLAotCSAqIGFuZCB0aGVuIGl0IHdpbGwgZG8gYSBzdXBlciB0byBzaG93IHdoZXJlIGl0IG9jY3VycmVkIG9uIHRoaXMgc2lkZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7IAotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5lcnIpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9UUkFDRV9JTkZPXyk7IAotCQkJcHJpbnRQcm94eVN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyk7IAotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7IAotCQlzeW5jaHJvbml6ZWQgKHMpIHsKLQkJCXMucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9UUkFDRV9JTkZPXyk7IAotCQkJcHJpbnRQcm94eVN0YWNrVHJhY2Uocyk7Ci0JCQlzLnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1PVEVfVk1fTE9DQUxfVFJBQ0VfSU5GT18pOyAKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsgCi0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX1RSQUNFX0lORk9fKTsgCi0JCQlwcmludFByb3h5U3RhY2tUcmFjZShzKTsKLQkJCXMucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyk7IAotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUuc2V0T2JqZWN0SUQoZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVRocm93YWJsZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdiZGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhlIFJlbW90ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocm93YWJsZSBiZWFuIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9CQotCQotCS8qKgotCSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0JICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLQkgKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotCSAqLwotCVJFTVRocm93YWJsZUJlYW5Qcm94eSBjcmVhdGVUaHJvd2FibGVCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTVRocm93YWJsZUJlYW5Qcm94eShmUmVnaXN0cnksIG9iamVjdElELCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8JCQotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCS8vIFdlIGNhbiBuZXZlciBoYXZlIGFuIGludGVyZmFjZSBvZiB0eXBlIFRocm93YWJsZSBzaW5jZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCi0JCWlmICghYW5BYnN0cmFjdCkKLQkJCXJldHVybiBuZXcgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVUaHJvd2FibGVCZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVm9pZEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVm9pZEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiNmMyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVZvaWRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCZWFuVHlwZVByb3h5IGZvciByZXByZXNlbnRpbmcgdGhlICJ2b2lkIiB0eXBlIHZhbHVlLCBhbmQgYSB2YWx1ZSBvZiB0aGlzIHR5cGUgaXMgIm51bGwiLgotICogQ3JlYXRpb24gZGF0ZTogKDIvMTEvMDAgMjoyNjo0NyBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNVm9pZEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotCQotcHJvdGVjdGVkIFJFTVZvaWRCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuVk9JRF9UWVBFKSwgVm9pZC5UWVBFLmdldE5hbWUoKSwgbnVsbCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBzdXBlcnR5cGUgZm9yIHVzCi0gKiBudWxsL3ZvaWQgaGFzIG5vIHN1cGVyY2xhc3MuCi0gKiBUaGlzIGlzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGludGVyZmFjZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3Igdm9pZCwgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3Igdm9pZCBpcyBhIGZpbmFsIGNsYXNzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiB2b2lkIHJlcHJlc2VudHMgIm51bGwiLAotICogc28gcmV0dXJuIHRoZSBudWxsIGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBuZXdJbnN0YW5jZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkMzUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGUgUkVNIEJlYW4gUHJveHkgZm9yIGphdmEuYXd0LkRpbWVuc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFJFTURpbWVuc2lvbkJlYW5Qcm94eSBleHRlbmRzIFJFTUJlYW5Qcm94eSBpbXBsZW1lbnRzIElEaW1lbnNpb25CZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1EaW1lbnNpb25CZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKSB7CQotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uSGVpZ2h0RmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uV2lkdGhGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25IZWlnaHRGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uV2lkdGhGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHdpZHRoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uU2V0U2l6ZUhXUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChoZWlnaHQpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBmcm9tRGltZW5zaW9uUHJveHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldERpbWVuc2lvblNldFNpemVEUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgZnJvbURpbWVuc2lvblByb3h5KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE5M2RlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBCZWFudHlwZSBwcm94eSBmb3IgamF2YS5hd3QuRGltZW5zaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9Ci0JCQotCS8qKgotCSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0JICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLQkgKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotCSAqLwotCVJFTURpbWVuc2lvbkJlYW5Qcm94eSBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTURpbWVuc2lvbkJlYW5Qcm94eShmUmVnaXN0cnksIG9iamVjdElELCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8JCQotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCWlmICghYW5BYnN0cmFjdCkKLQkJCXJldHVybiBuZXcgUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1Qb2ludEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODE3NzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGUgUkVNIEJlYW4gUHJveHkgZm9yIGphdmEuYXd0LlBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgUkVNUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBSRU1CZWFuUHJveHkgaW1wbGVtZW50cyBJUG9pbnRCZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1Qb2ludEJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpIHsJCi0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UG9pbnRYRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WSgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFlGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WChpbnQgeCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFBvaW50WEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WShpbnQgeSkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFBvaW50WUZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFNldExvY2F0aW9uWFlQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh4KSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGZyb21Qb2ludFByb3h5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFNldExvY2F0aW9uUFByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIGZyb21Qb2ludFByb3h5KTsKLQl9CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzY4ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLS8qKgotICogQmVhbnR5cGUgcHJveHkgZm9yIGphdmEuYXd0LkRpbWVuc2lvbgotICovCi1wdWJsaWMgY2xhc3MgUkVNUG9pbnRCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNUG9pbnRCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0KLQkJCi0JLyoqCi0JICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotCSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0JICovCi0JUkVNUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTVBvaW50QmVhblByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwkJCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJaWYgKCFhbkFic3RyYWN0KQotCQkJcmV0dXJuIG5ldyBSRU1Qb2ludEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIEV4Y2VwdGlvbkJlYW5Qcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gY3JlYXRlUG9pbnRCZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZWUyZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhlIFJFTSBCZWFuIFByb3h5IGZvciBqYXZhLmF3dC5SZWN0YW5nbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1SZWN0YW5nbGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1CZWFuUHJveHkgaW1wbGVtZW50cyBJUmVjdGFuZ2xlQmVhblByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNUmVjdGFuZ2xlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBJQmVhblR5cGVQcm94eSBhVHlwZSkgewkKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WCgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVYRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WSgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVZRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFgoaW50IHgpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVYRmllbGRQcm94eSgpLnNldCh0aGlzLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh4KSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRZKGludCB5KSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlWUZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRMb2NhdGlvblhZUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHkpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBmcm9tUG9pbnRQcm94eSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25QUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgZnJvbVBvaW50UHJveHkpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVIZWlnaHRGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVXaWR0aEZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZUhlaWdodEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaGVpZ2h0KSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVXaWR0aEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRTaXplSFdQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh3aWR0aCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGZyb21EaW1lbnNpb25Qcm94eSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0U2l6ZURQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBmcm9tRGltZW5zaW9uUHJveHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldEJvdW5kc1hZSFdQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh4KSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHdpZHRoKSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaGVpZ2h0KX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoSVJlY3RhbmdsZUJlYW5Qcm94eSBmcm9tUmVjdGFuZ2xlUHJveHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldEJvdW5kc1JQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBmcm9tUmVjdGFuZ2xlUHJveHkpOwotCX0JCQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzJmNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci0vKioKLSAqIEJlYW50eXBlIHByb3h5IGZvciBqYXZhLmF3dC5EaW1lbnNpb24KLSAqLwotcHVibGljIGNsYXNzIFJFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0KLQkJCi0JLyoqCi0JICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotCSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0JICovCi0JUkVNUmVjdGFuZ2xlQmVhblByb3h5IGNyZWF0ZVJlY3RhbmdsZUJlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBuZXcgUkVNUmVjdGFuZ2xlQmVhblByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwkJCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJaWYgKCFhbkFic3RyYWN0KQotCQkJcmV0dXJuIG5ldyBSRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBFeGNlcHRpb25CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlY3RhbmdsZUJlYW5Qcm94eShvYmplY3RJRCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVnaXN0ZXJBV1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlZ2lzdGVyQVdULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzQ1NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVnaXN0ZXJBV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWdpc3RlciB0aGUgQVdUIGZhY3Rvcmllcy4gSXQgaXMgbm90Ci0gKiBtZWFudCB0byBiZSBjYWxsZWQgYnkgYW55b25lIG90aGVyIHRoYW4gUHJveHlWTVN0YXJ0ZXIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1SZWdpc3RlckFXVCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQVdUKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCW5ldyBSRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IFJFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCQotCQkvLyBJZiB3ZSBhcmUgZG9pbmcgQVdULCBnZXQgdGhlIEFXVCBldmVudCBxdWV1ZSBnb2luZy4gVGhpcyBpcyB0cnlpbmcgdG8gYmUgYSB0aW1lLXNhdmVyCi0JCS8vIGJ5IGhhdmluZyBpdCB1cCByaWdodCBhd2F5LgotCQlJQmVhblR5cGVQcm94eSBzdGFydGVyQmVhblR5cGUgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQVdUU3RhcnRlciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdGFydGVyQmVhblR5cGUgIT0gbnVsbCkgewotCQkJSU1ldGhvZFByb3h5IHN0YXJ0ZXIgPSBzdGFydGVyQmVhblR5cGUuZ2V0TWV0aG9kUHJveHkoInN0YXJ0QVdUIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdGFydGVyICE9IG51bGwpCi0JCQkJc3RhcnRlci5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1TdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTkzOGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi0vKioKLSAqIFN0YW5kYXJkIEFXVCBCZWFuIFByb3h5IEZhY3RvcnkuCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IHNob3VsZCBub3QgcmVmZXJlbmNlZAotICogb3V0c2lkZSBvZiB0aGUgcGFja2FnZSBvdGhlciB0aGFuIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLSAqLwotY2xhc3MgUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeSB7Ci0KLQlmaW5hbCBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmQmVhblR5cGVGYWN0b3J5OwotCQotCXB1YmxpYyBSRU1TdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeSkgewotCQlmYWN0b3J5LnJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeShJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LlJFR0lTVFJZX0tFWSwgdGhpcyk7Ci0JCWZCZWFuVHlwZUZhY3RvcnkgPSBmYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJRGltZW5zaW9uQmVhblByb3h5IGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eVdpdGgoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSURpbWVuc2lvbkJlYW5Qcm94eSkgZkJlYW5UeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5EaW1lbnNpb24iKS5uZXdJbnN0YW5jZSgibmV3IGphdmEuYXd0LkRpbWVuc2lvbigiK3dpZHRoKyIsIitoZWlnaHQrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gU2hvdWxkbid0IG9jY3VyCi0JCX0KLQl9Ci0JCi0JcHVibGljIElQb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eVdpdGgoaW50IHgsIGludCB5KXsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVBvaW50QmVhblByb3h5KSBmQmVhblR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50IikubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5Qb2ludCgiK3grIiwiK3krIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gU2hvdWxkbid0IG9jY3VyCi0JCX0KLQotCX0KLQkKLQlwdWJsaWMgSVJlY3RhbmdsZUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVJlY3RhbmdsZUJlYW5Qcm94eSkgZkJlYW5UeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5SZWN0YW5nbGUiKS5uZXdJbnN0YW5jZSgibmV3IGphdmEuYXd0LlJlY3RhbmdsZSgiK3grIiwiK3krIiwiK3dpZHRoKyIsIitoZWlnaHQrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7CS8vIFNob3VsZG4ndCBvY2N1cgotCQl9Ci0KLQl9Ci0JCi0JLyoKLQkgKiBUZXJtaW5hdGUgdGhpcyBmYWN0b3J5LiBTaW5jZSBpdCBkb2Vzbid0IGhvbGQgb250byBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBiZWFudHlwZSBmYWN0b3J5LAotCSAqIGFuZCBub3RoaW5nIHdpbGwgYmUgaG9sZGluZyBvbnRvIHRoaXMgZmFjdG9yeSwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lLiBJdCB3aWxsIGJlIEdDJ2QuCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2ZDUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci0KLS8qKgotICogQmVhblR5cGUgZmFjdG9yeSBzdGFuZGFyZCBBV1QgYmVhbiB0eXBlcy4gVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IHNob3VsZG4ndCBiZSByZWZlcmVuY2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIEl0IHNob3VsZCBvbmx5IGJlCi0gKiBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0gKi8KLWNsYXNzIFJFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1RZUEVfRkFDVE9SWV9LRVkgPSAiamF2YS5hd3QiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3RvcnlSZWdpc3RyeTsKLQotCVJFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZGYWN0b3J5UmVnaXN0cnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeShCRUFOX1RZUEVfRkFDVE9SWV9LRVksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkpCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIGNsYXNzTmFtZSwgSW50ZWdlciBjbGFzc0lELCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQotCQlpZiAoImphdmEuYXd0LkRpbWVuc2lvbiIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBjbGFzc0lELCBjbGFzc05hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UgaWYgKCJqYXZhLmF3dC5Qb2ludCIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgUkVNUG9pbnRCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGNsYXNzSUQsIGNsYXNzTmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZSBpZiAoImphdmEuYXd0LlJlY3RhbmdsZSIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBjbGFzc0lELCBjbGFzc05hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHlGYWN0b3J5I3Rlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E1ZjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4xNyAkICAkRGF0ZTogMjAwNi8wOS8xNCAxODoyOTozNSAkCi0jCi0KLQotCi0jIEV4Y2VwdGlvbiBtZXNzYWdlIC0gezB9IGlzIHRoZSBuYW1lIG9mIGEgcHJvamVjdCB3aXRoaW4gRWNsaXBzZS4KLU5PX09VVFBVVF9GT0xERVJfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDcxRSBObyBvdXRwdXQgZm9sZGVyIGZvciBwcm9qZWN0ICJ7MH0uIgotCi0jIFRoZXNlIGFyZSBsaW5lcyB0aGF0IGFyZSBwbGFjZWQgaW50byBhIGxvZyBmaWxlIGxpc3RpbmcgdGhlIG91dHB1dHMgZnJvbSB0aGUgdHdvIGRpZmZlcmVudCBzdHJlYW1zLgotVk1fVEVSTUlOQVRFRF9JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNzJJIFJlbW90ZSBWTSB0ZXJtaW5hdGVkIGJlZm9yZSBhbnkgY29tbWFuZHMgY2FuIGJlIHNlbnQuIEZvbGxvd2luZyBhcmUgdGhlIGVycm9yIGFuZCBvdXRwdXQgc3RyZWFtcy4KLVZNX1RFUk1JTkFURURfTElORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0tIEVycm9yIFN0cmVhbSAtLQotVk1fVEVSTUlOQVRFRF9MSU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLS0gT3V0cHV0IFN0cmVhbSAtLQotVk1fVEVSTUlOQVRFRF9MSU5FMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLS0gRW5kIG9mIFN0cmVhbSBPdXRwdXQgLS0KLQotIyBUaGVzZSBhcmUgdGhlIGhlYWRlcnMgZm9yIHR3byBwYXJ0cyBvZiBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgdHJhY2UgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbS4KLSMgVGhlIHNlY29uZCBpcyB0aGUgdHJhY2UgZnJvbSB0aGUgbG9jYWwgc3lzdGVtLgotUkVNT1RFX1ZNX1RSQUNFX0lORk9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNzNJICoqKiBSZW1vdGVWTSBFeGNlcHRpb24gLSBUcmFjZSBmcm9tIFJlbW90ZSBWTToKLVJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDc0SSAqKiogTG9jYWwgU3RhY2tUcmFjZToKLQotIyBJbiB0aGUgdHdvIGJlbG93LCB7MH0gaXMgYSBzdHJpbmcgdGhhdCBpcyBhIGphdmEgY3JlYXRpb24gc3RyaW5nLCBlLmcuICJuZXcgSW50ZWdlcigzKSIsIHNvIHRoZXkgZG9uJ3QgcGFydGljaXBhdGUgaW4gdHJhbnNsYXRpb24uCi0jIEluIENsYXNzY2FzdCwgezF9IGlzIGEgamF2YSB0eXBlIG5hbWUsIGUuZy4gamF2YS5sYW5nLkludGVnZXIuCi1DbGFzc2Nhc3RfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEyNEUgInswfSIgZG9lcyBub3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIHR5cGUgezF9Ci1JbnN0YW50aWF0ZV9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEyNUUgInswfSIgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIGJlIGV2YWx1YXRlZAotCi0jIHswfSBpcyBhIG51bWJlciwgZS5nLiAxLCAyLCAuLi4KLVJlbW90ZUNtZF9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTI2RSBSZW1vdGUgY29tbWFuZCBlcnJvciB7MH0KLQotIyBUaGUgZm9sbG93aW5nIGlzIGFuIGV4Y2VwdGlvbiBlcnJvciB3aGVyZSB7MH0gaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24gYW5kIHsxfSBpcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBleGNlcHRpb24KLSMgVGhlIG1lc3NhZ2UgezF9IGhhcyBhbHJlYWR5IGJlZW4gbG9jYWxpemVkIChpZiBpdCBzdXBwbGllZCBpdCBsb2NhbGl6ZWQpLiBJdCBjb21lcyBmcm9tIHNvbWV3aGVyZSBvdXRzaWRlIG9mIG91ciBwcm9qZWN0LgotRXhjZXB0aW9uRXJyb3JNc2dfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMzVFIHswfSh7MX0pCi1PS183ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBPSwotUHJveHlfTm9SdW5uZXJfRVJST1JfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMzdFIENvdWxkIG5vdCBmaW5kIGEgUnVuIHR5cGUgcnVubmVyIHRvIGxhdW5jaCBmb3IgXCJ7MH1cIi4KLVByb3h5X0Vycm9yX1RpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yOgotUHJveHlfVGVybWluYXRlZF90b29fc29vbl9FUlJPUl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMzhFIFJlbW90ZSBWTSB0ZXJtaW5hdGVkIHRvbyBzb29uLiBTZWUgLmxvZyBmaWxlIGZvciB0cmFjZSBvZiBvdXRwdXQuIEZvciBWTSBcInswfVwiLgotIyBUaGlzIGlzIGEgbGF1bmNoIG5hbWUgZm9yIGEgZ2l2ZW4gcHJvamVjdCBuYW1lICh7MH0pLgotIyBXQVJOSU5HIGZvciB0aGUgUHJveHlSZW1vdGVWTU5hbWUgYW5kIFByb3h5UmVtb3RlVk1OYW1lV2l0aENvbW1lbnQgZG8gbm90IHVzZSBkb3VibGUtcXVvdGUgKCIpLiBJdCB3aWxsIGNhdXNlIHByb2JsZW1zLgotUHJveHlSZW1vdGVWTU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUHJvamVjdCAoezB9KQotIyBUaGlzIGlzIGEgbGF1bmNoIG5hbWUgdGhhdCBoYXMgYSBjb21tZW50ICh7MH0gaXMgcHJvamVjdCBuYW1lLCB7MX0gaXMgdGhlIGNvbW1lbnQgZm9yIHRoaXMgcHJvamVjdCBsYXVuY2gpCi1Qcm94eVJlbW90ZVZNTmFtZVdpdGhDb21tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQcm9qZWN0ICh7MH0pLXsxfQotCi1Qcm94eVJlbW90ZU5vTGF1bmNoS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYW5ub3QgbGF1bmNoIGxvY2FsIHByb3h5IHJlZ2lzdHJ5LiBOb3QgbGF1bmNoZWQgZnJvbSB2YWxpZCBsYXVuY2hlci4KLQotIyB7MH0gaXMgdGhlIGFwcHJvcHJpYXRlIFZNTmFtZSBmcm9tIHRoZSBhYm92ZSB0d28gZW50cmllcy4KLVByb3h5UmVtb3RlTGF1bmNoVk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExhdW5jaGluZyByZW1vdGUgdm0gInswfSIKLQotQ2xlYW51cEpvYl90aXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUmVtb3RlIFZNIENsZWFudXAgR0MnZCBQcm94aWVzIEpvYgotCi1SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9DYWxsYmFja0Nvbm5lY3Rpb25Ob3RXb3JraW5nX0VYQ18gICAgICAgICAgICAgPSBJV0FWMDE2OUUgQ2FsbGJhY2sgY29ubmVjdGlvbiBpcyBub3Qgd29ya2luZy4KLVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0Nvbm5lY3Rpb25DcmVhdGlvbkZhaWxlZF9JTkZPXyAgICAgICAgICAgICAgICA9IElXQVYwMTcwSSBDb25uZWN0aW9uIGNyZWF0aW9uIGZhaWxlZC4KLVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0pvYl9UZXJtaW5hdGVQcm9jZXNzX1RpdGxlPVRlcm1pbmF0ZSB0aGUgcmVtb3RlIHZtIHByb2Nlc3MuCi1SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db3VsZE5vdENyZWF0ZVNvY2tldENvbm5lY3Rpb25Ub1JlbW90ZVZNX0VYQ18gPSBJV0FWMDE3MUUgQ291bGQgbm90IGNyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHJlbW90ZSB2bS4gVGhpcyBpcyBvZnRlbiBkdWUgdG8geW91ciBmaXJld2FsbCBibG9ja2luZyBhY2Nlc3MgZnJvbSB5b3VyIGphdmEgdG8gZG8gbG9jYWwgYWNjZXNzLgotUkVNRXhwcmVzc2lvbl9JT0V4Y2VwdGlvblNlZUxvZ19JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNzJJIEkvTyBFeGNlcHRpb24gb2NjdXJyZWQuIFNlZSAubG9nIGZpbGUgZm9yIGRldGFpbHMuCi1SRU1FeHByZXNzaW9uX0NvbW1hbmRFeGNlcHRpb25TZWVMb2dfSU5GT18gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE3M0kgQ29tbWFuZCBFeGNlcHRpb24gb2NjdXJyZWQuIFNlZSAubG9nIGZpbGUgZm9yIGRldGFpbHMuCi1Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGVfTW9uaXRvcl9QcmludFJlbW90ZVRyYWNlX1RleHQ9UHJpbnQgcmVtb3RlIHZtIHRyYWNlIG91dHB1dAotVk1fQ09NTUFORF9MSU5FPVJlbW90ZSBWTSBDb21tYW5kbGluZToKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmZkZmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgZXh0ZW5kcyBJREVCZWFuUHJveHkgaW1wbGVtZW50cyBJQWNjZXNzaWJsZU9iamVjdFByb3h5IHsKLQotCXByb3RlY3RlZCBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKGFQcm94eUZhY3RvcnlSZWdpc3RyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIElERUFjY2Vzc2libGVPYmplY3RQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUHJveHlGYWN0b3J5UmVnaXN0cnksIE9iamVjdCBhbk9iamVjdCkgewotCQlzdXBlcihhUHJveHlGYWN0b3J5UmVnaXN0cnksIGFuT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I2lzQWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoQWNjZXNzaWJsZU9iamVjdCkgZ2V0QmVhbigpKS5pc0FjY2Vzc2libGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I3NldEFjY2Vzc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmxlKGJvb2xlYW4gZmxhZykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJKChBY2Nlc3NpYmxlT2JqZWN0KSBnZXRCZWFuKCkpLnNldEFjY2Vzc2libGUoZmxhZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5hY2Nlc3NpYmxlVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzMjQ0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSURFIFZNIHZlcnNpb24gb2YgdGhlIEFycmF5IHByb3h5Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIElERUFycmF5QmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSUFycmF5QmVhblByb3h5IHsKLQotCXByaXZhdGUgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmQmVhblR5cGVQcm94eUZhY3Rvcnk7Ci0JCi1JREVBcnJheUJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhcnJheSxJQmVhblR5cGVQcm94eSBhVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYXJyYXkgLGFUeXBlKTsKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUJlYW5Qcm94eSNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQlpZiAoc3VwZXIuZXF1YWxzKG9iaikpCi0JCXJldHVybiB0cnVlOwotCWlmICghKG9iaiBpbnN0YW5jZW9mIElERUFycmF5QmVhblByb3h5KSkKLQkJcmV0dXJuIGZhbHNlOwotCU9iamVjdCBhcnJheUJlYW4gPSAoKElERUFycmF5QmVhblByb3h5KSBvYmopLmdldEJlYW4oKTsKLQotCWlmIChnZXRCZWFuKCkgPT0gbnVsbCB8fCBhcnJheUJlYW4gPT0gbnVsbCkKLQkJcmV0dXJuIGZhbHNlOwotCU9iamVjdCB0aGlzQXJyYXlCZWFuID0gZ2V0QmVhbigpOwotCUNsYXNzIGFjbGFzcyA9IHRoaXNBcnJheUJlYW4uZ2V0Q2xhc3MoKTsKLQlDbGFzcyBiY2xhc3MgPSBhcnJheUJlYW4uZ2V0Q2xhc3MoKTsKLQlDbGFzcyBhY29tcCA9IGFjbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JQ2xhc3MgYmNvbXAgPSBiY2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCWlmIChhY29tcC5pc1ByaW1pdGl2ZSgpIHx8IGJjb21wLmlzUHJpbWl0aXZlKCkpIHsKLQkJaWYgKGFjb21wICE9IGJjb21wKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYWNvbXAgPT0gSW50ZWdlci5UWVBFKQotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGludFtdKSB0aGlzQXJyYXlCZWFuLCAoaW50W10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IEJvb2xlYW4uVFlQRSkKLQkJCXJldHVybiBBcnJheXMuZXF1YWxzKChib29sZWFuW10pIHRoaXNBcnJheUJlYW4sIChib29sZWFuW10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IExvbmcuVFlQRSkKLQkJCXJldHVybiBBcnJheXMuZXF1YWxzKChsb25nW10pIHRoaXNBcnJheUJlYW4sIChsb25nW10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IFNob3J0LlRZUEUpCi0JCQlyZXR1cm4gQXJyYXlzLmVxdWFscygoc2hvcnRbXSkgdGhpc0FycmF5QmVhbiwgKHNob3J0W10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IERvdWJsZS5UWVBFKQotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGRvdWJsZVtdKSB0aGlzQXJyYXlCZWFuLCAoZG91YmxlW10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IEZsb2F0LlRZUEUpCi0JCQlyZXR1cm4gQXJyYXlzLmVxdWFscygoZmxvYXRbXSkgdGhpc0FycmF5QmVhbiwgKGZsb2F0W10pIGFycmF5QmVhbik7Ci0JCWVsc2UgaWYgKGFjb21wID09IENoYXJhY3Rlci5UWVBFKQotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGNoYXJbXSkgdGhpc0FycmF5QmVhbiwgKGNoYXJbXSkgYXJyYXlCZWFuKTsKLQkJZWxzZSBpZiAoYWNvbXAgPT0gQnl0ZS5UWVBFKQotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGJ5dGVbXSkgdGhpc0FycmF5QmVhbiwgKGJ5dGVbXSkgYXJyYXlCZWFuKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZQotCQlyZXR1cm4gQXJyYXlzLmVxdWFscygoT2JqZWN0W10pIHRoaXNBcnJheUJlYW4sIChPYmplY3RbXSkgYXJyYXlCZWFuKTsKLX0KLS8qKgotICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCWlmICghY29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQlPYmplY3QgcmVzdWx0ID0gQXJyYXkuZ2V0KGZCZWFuLGluZGV4KTsKLQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKChJREVCZWFuVHlwZVByb3h5KWZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHJlc3VsdC5nZXRDbGFzcygpKSkubmV3QmVhblByb3h5KHJlc3VsdCk7Ci0JfSBlbHNlIHsKLQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCWludCBpZCA9ICgoSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSljb21wVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURToKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoQXJyYXkuZ2V0Qnl0ZShmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkJPT0xFQU46Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5jcmVhdGVCb29sZWFuQmVhblByb3h5KEFycmF5LmdldEJvb2xlYW4oZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5DSEFSOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShBcnJheS5nZXRDaGFyKGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoQXJyYXkuZ2V0RG91YmxlKGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRkxPQVQ6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoQXJyYXkuZ2V0RmxvYXQoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5JTlRFR0VSOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KEFycmF5LmdldEludChmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkc6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5sb25nVHlwZS5jcmVhdGVMb25nQmVhblByb3h5KEFycmF5LmdldExvbmcoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5TSE9SVDoKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShBcnJheS5nZXRTaG9ydChmQmVhbixpbmRleCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7IC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgc2FpZCBpdCB3YXMgcHJpbWl0aXZlLCBidXQgbm90IG9uZSB3ZSB1bmRlcnN0YW5kCQkJCQotCQl9Ci0JfQkJCi19Ci0vKioKLSAqIEdldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0gKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0gKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0KGludFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JaWYgKGluZGV4ZXMubGVuZ3RoID09IDEpCi0JCXJldHVybiBnZXQoaW5kZXhlc1swXSk7Ci0JaW50IGRpbXMgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXREaW1lbnNpb25zKCk7Ci0JaWYgKGRpbXMgPCBpbmRleGVzLmxlbmd0aCkKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBUb28gbWFueSBkaW1lbnNpb25zCi0JLy8gR2V0IHVwIHRvIHRoZSBuZXh0IHRvIGxhc3QgZGltZW5zaW9uIHNvIHRoYXQgd2UgY2FuIGRvIHRoZSBhcHByb3ByaWF0ZSBmaW5hbCBnZXQgZGVwZW5kaW5nIHVwb24gcHJpbWl0aXZlIG9yIG5vdC4KLQlPYmplY3QgYXJyYXkgPSBmQmVhbjsKLQlpbnQgbGFzdEFycmF5RGltID0gaW5kZXhlcy5sZW5ndGggLSAxOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdEFycmF5RGltOyBpKyspCi0JCWFycmF5ID0gQXJyYXkuZ2V0KGFycmF5LCBpbmRleGVzW2ldKTsKLQotCWludCBpbmRleCA9IGluZGV4ZXNbbGFzdEFycmF5RGltXTsJLy8gRmluYWwgYXJyYXkgZGltIHRvIHJldHJpZXZlCi0JCi0JaWYgKGRpbXMgPT0gaW5kZXhlcy5sZW5ndGgpIHsKLQkJSUJlYW5UeXBlUHJveHkgZmluYWxDb21wVHlwZSA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoZmluYWxDb21wVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgYXQgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCQlpbnQgaWQgPSAoKElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkpIGZpbmFsQ29tcFR5cGUpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURSA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYnl0ZVR5cGUuY3JlYXRlQnl0ZUJlYW5Qcm94eShBcnJheS5nZXRCeXRlKGFycmF5LCBpbmRleCkpOwotCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CT09MRUFOIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5jcmVhdGVCb29sZWFuQmVhblByb3h5KEFycmF5LmdldEJvb2xlYW4oYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkNIQVIgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmNoYXJUeXBlLmNyZWF0ZUNoYXJCZWFuUHJveHkoQXJyYXkuZ2V0Q2hhcihhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5kb3VibGVUeXBlLmNyZWF0ZURvdWJsZUJlYW5Qcm94eShBcnJheS5nZXREb3VibGUoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkZMT0FUIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoQXJyYXkuZ2V0RmxvYXQoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LklOVEVHRVIgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludFR5cGUuY3JlYXRlSW50ZWdlckJlYW5Qcm94eShBcnJheS5nZXRJbnQoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkcgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmxvbmdUeXBlLmNyZWF0ZUxvbmdCZWFuUHJveHkoQXJyYXkuZ2V0TG9uZyhhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuU0hPUlQgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShBcnJheS5nZXRTaG9ydChhcnJheSwgaW5kZXgpKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIG51bGw7IC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgc2FpZCBpdCB3YXMgcHJpbWl0aXZlLCBidXQgbm90IG9uZSB3ZSB1bmRlcnN0YW5kCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBXb24ndCBiZSByZXR1cm5pbmcgYSBwcmltaXRpdmUsIHNvIHVzZSBzdGFuZGFyZCBhY2Nlc3NvcgotCU9iamVjdCByZXN1bHQgPSBBcnJheS5nZXQoYXJyYXksIGluZGV4KTsKLQlpZiAocmVzdWx0ID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHJlc3VsdC5nZXRDbGFzcygpKSkubmV3QmVhblByb3h5KAotCQlyZXN1bHQpOwotfQotCi0vKioKLSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gKi8KLXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlUHJveHksIGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCU9iamVjdCB2YWx1ZSA9ICgoSUlERUJlYW5Qcm94eSl2YWx1ZVByb3h5KS5nZXRCZWFuKCk7Ci0JQ2xhc3MgdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JaWYgKCF2YWx1ZUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJQXJyYXkuc2V0KGZCZWFuLGluZGV4LHZhbHVlKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQnl0ZS5UWVBFICkgewotCQlBcnJheS5zZXRCeXRlKGZCZWFuLGluZGV4LCgoQnl0ZSl2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCb29sZWFuLlRZUEUgKXsKLQkJQXJyYXkuc2V0Qm9vbGVhbihmQmVhbixpbmRleCwoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsJCQkKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKLQkJQXJyYXkuc2V0Q2hhcihmQmVhbixpbmRleCwoKENoYXJhY3Rlcil2YWx1ZSkuY2hhclZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBEb3VibGUuVFlQRSkgewotCQlBcnJheS5zZXREb3VibGUoZkJlYW4saW5kZXgsKChEb3VibGUpdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBGbG9hdC5UWVBFKSB7Ci0JCUFycmF5LnNldEZsb2F0KGZCZWFuLGluZGV4LCgoRmxvYXQpdmFsdWUpLmZsb2F0VmFsdWUoKSk7CQkKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gSW50ZWdlci5UWVBFKSB7Ci0JCUFycmF5LnNldEludChmQmVhbixpbmRleCwoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCkpOwkJCi0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IExvbmcuVFlQRSApIHsKLQkJQXJyYXkuc2V0TG9uZyhmQmVhbixpbmRleCwoKExvbmcpdmFsdWUpLmxvbmdWYWx1ZSgpKTsJCQotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBTaG9ydC5UWVBFICkgewotCQlBcnJheS5zZXRTaG9ydChmQmVhbixpbmRleCwoKFNob3J0KXZhbHVlKS5zaG9ydFZhbHVlKCkpOwkJCi0JfQotfQotLyoqCi0gKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZCwKLSAqIGFuZCBlYWNoIGluZGV4IGFsb25nIHRoZSB3YXkgbXVzdCBleGlzdC4KLSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotICogb2YgZGltZW5zaW9ucyBvZiB0aGUgcmVhbCBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlUHJveHksIGludFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0KLQlPYmplY3Qgc3ViQXJyYXkgPSBmQmVhbjsKLQlpbnQgdXBUbyA9IGluZGV4ZXMubGVuZ3RoIC0gMTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHVwVG87IGkrKykKLQkJc3ViQXJyYXkgPSBBcnJheS5nZXQoc3ViQXJyYXksIGluZGV4ZXNbaV0pOwotCWludCBpbmRleCA9IGluZGV4ZXNbdXBUb107Ci0KLQkvLyBOb3cgc2V0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbgotCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JT2JqZWN0IHZhbHVlID0gKChJSURFQmVhblByb3h5KSB2YWx1ZVByb3h5KS5nZXRCZWFuKCk7Ci0JQ2xhc3MgdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JaWYgKCF2YWx1ZUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJQXJyYXkuc2V0KHN1YkFycmF5LCBpbmRleCwgdmFsdWUpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCeXRlLlRZUEUpIHsKLQkJQXJyYXkuc2V0Qnl0ZShzdWJBcnJheSwgaW5kZXgsICgoQnl0ZSkgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQm9vbGVhbi5UWVBFKSB7Ci0JCUFycmF5LnNldEJvb2xlYW4oc3ViQXJyYXksIGluZGV4LCAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCUFycmF5LnNldENoYXIoc3ViQXJyYXksIGluZGV4LCAoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gRG91YmxlLlRZUEUpIHsKLQkJQXJyYXkuc2V0RG91YmxlKHN1YkFycmF5LCBpbmRleCwgKChEb3VibGUpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gRmxvYXQuVFlQRSkgewotCQlBcnJheS5zZXRGbG9hdChzdWJBcnJheSwgaW5kZXgsICgoRmxvYXQpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBJbnRlZ2VyLlRZUEUpIHsKLQkJQXJyYXkuc2V0SW50KHN1YkFycmF5LCBpbmRleCwgKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IExvbmcuVFlQRSkgewotCQlBcnJheS5zZXRMb25nKHN1YkFycmF5LCBpbmRleCwgKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBTaG9ydC5UWVBFKSB7Ci0JCUFycmF5LnNldFNob3J0KHN1YkFycmF5LCBpbmRleCwgKChTaG9ydCkgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JfQotCi19Ci0vKioKLSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLSAqIElmIHRoZXJlIGFyZSBtdWx0aS1kaW1lbnNpb25zLCB5b3UgbXVzdCBnZXQgdGhlIGFwcHJvcHJpYXRlCi0gKiBkaW1lbnNpb24gZnJvbSB0aGUgZ2V0IG1ldGhvZCB0byBzZWUgdGhlIHNpemUgb2YgdGhhdCBkaW1lbnNpb24uCi0gKgotICogZS5nLgotICogICAgaW50IFszXSByZXR1cm5zIDMKLSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0gKgotICogICAgKChJQXJyYXlCZWFuUHJveHkpIGdldCgxKSkuZ2V0TGVuZ3RoKCkgcmV0dXJucyAyCi0gKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLSAqICAgIGJlIGEgZGlmZmVyZW50IGxlbmd0aCBhcnJheSBmb3IgZWFjaCBvZiB0aGUgYXJyYXlzIAotICogICAgcmV0dXJuZWQgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLCB0aGUgcmV0dXJuZWQgbGVuZ3RoCi0gKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotICogICAgZnJvbSBnZXQoMSkuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCXJldHVybiBBcnJheS5nZXRMZW5ndGgoZkJlYW4pOwotfQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklBcnJheUJlYW5Qcm94eSNnZXRDYXRjaFRocm93YWJsZUV4Y2VwdGlvbihpbnQpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0Q2F0Y2hUaHJvd2FibGVFeGNlcHRpb24oaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KGluZGV4KTsKLQkJfSBjYXRjaCAoIFRocm93YWJsZVByb3h5IGV4YyApIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsJCQkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgSUJlYW5Qcm94eVtdIGdldFNuYXBzaG90KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gSWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHByaW1pdGl2ZSwgd2UgbmVlZCB0byB1c2UgdGhlIGNvcnJlY3QgZ2V0dGVyIHNvIHRoYXQgYSB2YWxpZCB2YWx1ZSBpcyByZXR1cm5lZCwKLQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlpbnQgaWQgPSBjb21wVHlwZS5pc1ByaW1pdGl2ZSgpID8gKChJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5KWNvbXBUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkgOiAtMTsKLQkJSUJlYW5Qcm94eVtdIHJlc3VsdCA9IG5ldyBJQmVhblByb3h5W0FycmF5LmdldExlbmd0aChmQmVhbildOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlkID09IC0xKSB7Ci0JCQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJCQlPYmplY3QgdmFsID0gQXJyYXkuZ2V0KGZCZWFuLGkpOwotCQkJCWlmICggdmFsICE9IG51bGwgKQotCQkJCQlyZXN1bHRbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkodmFsLmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkodmFsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCQkJc3dpdGNoIChpZCkgewotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQllURToKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ieXRlVHlwZS5jcmVhdGVCeXRlQmVhblByb3h5KEFycmF5LmdldEJ5dGUoZkJlYW4saSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CT09MRUFOOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoQXJyYXkuZ2V0Qm9vbGVhbihmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkNIQVI6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShBcnJheS5nZXRDaGFyKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRE9VQkxFOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmRvdWJsZVR5cGUuY3JlYXRlRG91YmxlQmVhblByb3h5KEFycmF5LmdldERvdWJsZShmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkZMT0FUOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmZsb2F0VHlwZS5jcmVhdGVGbG9hdEJlYW5Qcm94eShBcnJheS5nZXRGbG9hdChmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LklOVEVHRVI6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KEFycmF5LmdldEludChmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkxPTkc6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShBcnJheS5nZXRMb25nKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuU0hPUlQ6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc2hvcnRUeXBlLmNyZWF0ZVNob3J0QmVhblByb3h5KEFycmF5LmdldFNob3J0KGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWJyZWFrOyAvLyBTaG91bGRuJ3QgZ2V0IGhlcmUsIHNhaWQgaXQgd2FzIHByaW1pdGl2ZSwgYnV0IG5vdCBvbmUgd2UgdW5kZXJzdGFuZAkJCQkKLQkJCQl9Ci0JCQl9CQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDdjZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBBcnJheSBUeXBlIFByb3h5IGZvciB0aGUgSURFIFZNLgotICogCi0gKiBUaGUgY2xhc3MgaXMgZmluYWwgYmVjYXVzZSBhcnJheSdzIGFyZSBzcGVjaWFsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhbnkgc3ViY2xhc3NlcyBzaW5jZSB0aGUgZmFjdG9yeSB3b3VsZCBuZXZlciBjYWxsIGl0LgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJREVBcnJheUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSUFycmF5QmVhblR5cGVQcm94eSB7Ci0KLQlJQmVhblR5cGVQcm94eSBmRmluYWxDb21wb25lbnRUeXBlOwotCi0JSUJlYW5UeXBlUHJveHkgZkNvbXBvbmVudFR5cGU7Ci0KLQlTdHJpbmcgZlR5cGVOYW1lOwotCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggYSByZWdpc3RyeSBhbmQgYSBjbGFzcy4gSXQgaXMgcGFja2FnZSBzbyB0aGF0IG9ubHkgdGhlIGZhY3Rvcnkgd2l0aCB0aGlzIElERSBwYWNrYWdlIGNhbiBjYWxsIGl0LgotCSAqLwotCUlERUFycmF5QmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIFN0cmluZyBhVHlwZU5hbWUsIENsYXNzIGFDbGFzcykgewotCQkvLyBUaGUgY2xhc3Mgb2YgYW4gQXJyYXkgaXMgYWx3YXlzIE9iamVjdAotCQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JCWZUeXBlTmFtZSA9IGFUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGFycmF5IHR5cGUhCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKSB7Ci0JCWlmIChmRmluYWxDb21wb25lbnRUeXBlID09IG51bGwpIHsKLQkJCS8vIENvbXBvbmVudCB0eXBlIGlzIHN0cmlwIG9mZiBhbGwgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJCS8vIEhvd2V2ZXIsIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgY2hhbmdlIHRhYmxlKS4KLQkJCWludCB0eXBlU3RhcnQgPSBnZXRUeXBlTmFtZSgpLmxhc3RJbmRleE9mKCdbJykgKyAxOwotCQkJaWYgKGdldFR5cGVOYW1lKCkuY2hhckF0KHR5cGVTdGFydCkgPT0gJ0wnKSB7Ci0JCQkJLy8gSXQgaXMgYSBjbGFzcy4KLQkJCQkvLyBTdHJpcCBvZmYgdXAgdG8gdGhlICdMJywgYW5kIHRoZSB0cmFpbGluZyAnOycuIFRoYXQgaXMgdGhlIGNsYXNzIG5hbWUuCi0JCQkJZkZpbmFsQ29tcG9uZW50VHlwZSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkJCQlnZXRUeXBlTmFtZSgpLnN1YnN0cmluZyh0eXBlU3RhcnQgKyAxLCBnZXRUeXBlTmFtZSgpLmxlbmd0aCgpIC0gMSkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIHR5cGUuIE5lZWQgdG8gbWFwIGl0LgotCQkJCUNsYXNzIGFUeXBlID0gKENsYXNzKSBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5Lk1BUF9TSE9SVFNJR19UT19UWVBFLmdldChnZXRUeXBlTmFtZSgpLnN1YnN0cmluZyh0eXBlU3RhcnQsIHR5cGVTdGFydCArIDEpKTsKLQkJCQlmRmluYWxDb21wb25lbnRUeXBlID0gYVR5cGUgIT0gbnVsbCA/IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoYVR5cGUuZ2V0TmFtZSgpKSA6IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZGaW5hbENvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJaWYgKGZDb21wb25lbnRUeXBlID09IG51bGwpIHsKLQkJCS8vIENvbXBvbmVudCB0eXBlIGlzIHN0cmlwIG9mZiBmaXJzdCAnWycgYW5kIHJldHVybiBjbGFzcyBuYW1lIChpZiB3ZSBldmVyIGFkZCBjbGFzc0xvYWRlciBzdXBwb3J0LCB0aGlzIHdvbid0IHdvcmspLgotCQkJLy8gSG93ZXZlciwgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBjaGFuZ2UgdGFibGUpLgotCQkJaWYgKGdldFR5cGVOYW1lKCkuY2hhckF0KDEpICE9ICdbJykgewotCQkJCS8vIEl0IGlzIGEgb25lIGRpbWVuc2lvbmFsIGFycmF5LCBqdXN0IHNlbmQgdG8gZ2V0RmluYWxDb21wb25lbnRUeXBlIHRvIGZpZ3VyZSBvdXQgdGhlIHR5cGUuCi0JCQkJZkNvbXBvbmVudFR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheS4gSnVzdCBzdHJpcCBvZmYgb25lICdbJyBhbmQgc2VuZCB0aGF0IHRvIHRoZSBiZWFuIHR5cGUgZmFjdG9yeS4KLQkJCQlmQ29tcG9uZW50VHlwZSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCkubGFzdEluZGV4T2YoJ1snKSArIDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudWxsIGN0b3IgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgZmllbGQgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotCSAqICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZTogaW50IFszXSBbNF0KLQkgKiAgLSAoaW50W10sIG5ldyBpbnRbMV0gezF9KSBpbnQgWzFdCi0JICogIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KSBpbnQgWzJdIFszXQotCSAqIAotCSAqICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKSBpbnQgWzBdIChpbnRbXVtdLCBudWxsKSBvciAoaW50W11bXSwgbmV3IGludFswXSkgaW50WzBdW10gVGhpcyBpcwotCSAqIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2Ugd2l0aCBubyBkaW1lbnNpb25zIHNwZWNpZmllZCBpcyBub3QgdmFsaWQuCi0JICogIC0gKGludFtdW10sIG5ldyBpbnRbMV0gezN9KSBpbnRbM11bXQotCSAqIAotCSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIHRoYXQgb25seSB0aGUgUkVNIEZhY3RvcnkgY2FuIGNhbGwgaXQuCi0JICovCi0JSURFQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJZiB0aGUgZGltZW5zaW9ucyBpcyBudWxsIG9yIHplcm8gbGVuZ3RoLCB0aGVuIGNyZWF0ZSB0aGUKLQkJLy8gYXJyYXkgYXMgYSAwIHNpemVkIGFycmF5IG9uZSBkaW1lbnNpb25hbCBhcnJheS4KLQkJaWYgKGRpbWVuc2lvbnMgPT0gbnVsbCB8fCBkaW1lbnNpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IGludFtdIHsgMH0pOwotCi0JCS8vIFJlbW92ZSBmcm9tIHRoaXMgdHlwZSB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkCi0JCS8vIGNvbWluZyBpbiwgdXAgdG8gYnV0IG5vIGZ1cnRoZXIgdGhhbiB0aGUgZmluYWwgY29tcG9uZW50LgotCQkvLyBGcm9tIGhlcmUgd2UgY2FuIHRoZW4gdXNlIHRoZSBhcHByb3ByaWF0ZSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheQotCQkvLyBtZXRob2QgdG8gY3JlYXRlIHRoZSBhcnJheS4KLQkJSUJlYW5UeXBlUHJveHkgY29tcFR5cGUgPSBudWxsOyAvLyBUaGUgdHlwZSBvZiBhcnJheSB0byBjcmVhdGUgKGl0IG1heSBiZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGRpbWVuc2lvbnMpLgotCQlpbnQgbnVtRGltcyA9IGdldERpbWVuc2lvbnMoKTsKLQkJaWYgKG51bURpbXMgPD0gZGltZW5zaW9ucy5sZW5ndGgpCi0JCQljb21wVHlwZSA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOyAvLyBUaGVyZSBhcmUgdGhlIHNhbWUgb3IgbW9yZSByZXF1ZXN0ZWQgZGltZW5zaW9ucywgc28gdXNlIGZpbmFsIGNvbXBvbmVudCB0eXBlCi0JCWVsc2UgewotCQkJLy8gVGhlcmUgYXJlIGZld2VyIHJlcXVlc3RlZCBkaW1lbnNpb25zLCBzbyBzdHJpcCBvZmYgdGhhdCBtYW55Ci0JCQlTdHJpbmcgY29tcENsYXNzID0gZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcoZGltZW5zaW9ucy5sZW5ndGgpOwotCQkJY29tcFR5cGUgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGNvbXBDbGFzcyk7Ci0JCX0KLQotCQlpZiAoZGltZW5zaW9ucy5sZW5ndGggPT0gMSkgewotCQkJLy8gVXNlIHRoZSBvbmUgZGltZW5zaW9uIGNhbGwKLQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKCgoSURFQmVhblR5cGVQcm94eSkgY29tcFR5cGUpLmZDbGFzcywgZGltZW5zaW9uc1swXSk7Ci0JCQlyZXR1cm4gbmV3IElERUFycmF5QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYXJyYXksIG51bGwpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSBtdWx0aSBkaW1lbnNpb24gY2FsbAotCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoKChJREVCZWFuVHlwZVByb3h5KSBjb21wVHlwZSkuZkNsYXNzLCBkaW1lbnNpb25zKTsKLQkJCXJldHVybiBuZXcgSURFQXJyYXlCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhcnJheSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCkgewotCi0JCXJldHVybiBuZXcgSURFQXJyYXlCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCwgdGhpcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldFR5cGVOYW1lKCk7Ci0JCWludCBkaW1zID0gbmFtZS5sYXN0SW5kZXhPZignWycpICsgMTsKLQkJU3RyaW5nIHR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKS5nZXRUeXBlTmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWFsVHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIodHlwZS5sZW5ndGgoKSArICgiW10iLmxlbmd0aCgpICogZGltcykpOyAvLyROT04tTkxTLTEkCi0JCWZvcm1hbFR5cGUuYXBwZW5kKHR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbXM7IGkrKykKLQkJCWZvcm1hbFR5cGUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmb3JtYWxUeXBlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZDE4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSURFQmVhblByb3h5IGltcGxlbWVudHMgSUJlYW5Qcm94eSwgSUlERUJlYW5Qcm94eSB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGZCZWFuOwotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLQlwcm90ZWN0ZWQgSURFQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFQcm94eUZhY3RvcnlSZWdpc3RyeSkgewotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkgPSBhUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0JfQotCXByb3RlY3RlZCBJREVCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBPYmplY3QgYW5PYmplY3QpIHsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCQlmQmVhbiA9IGFuT2JqZWN0OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQkvKioKLQkgKiBVU0Ugd2l0aCBleHRyZW1lIGNhcmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldEJlYW4oKSB7Ci0JCXJldHVybiBmQmVhbjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0b1N0cmluZygpIG9mIHRoZSBiZWFuCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCXJldHVybiAoZkJlYW4gIT0gbnVsbCA/IGZCZWFuLnRvU3RyaW5nKCkgOiAibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSBBcHBlbmQgdGhlIGJlYW4ncyB0byBzdHJpbmcgdG8gb3VyIG93biBuYW1lIGlmIHdlIGhhdmUgb25lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotCQlpZiAoZkJlYW4gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIoIiArIGZCZWFuLnRvU3RyaW5nKCkgKyAiKSI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQl9Ci0JLyoqCi0JICogZXF1YWxzOiBJZiB0aGVyZSBhcmUgaWRlbnRpY2FsIG9yIGlmIHRoZXkgd3JhcHBlciB0aGUgc2FtZSBiZWFuLiBJbiB0aGUgSURFIFZNIHRoaXMKLQkgKiBjYW4gaGFwcGVuIGlmIGJlYW4gcHJveGllcyBhcmUgY3JlYXRlZCBmcm9tIGEgQmVhbiwgc2luY2UgcHJveGllcyBhcmVuJ3QgY2FjaGVkIGluCi0JICogdGhlIGJlYW5wcm94eSBmYWN0b3J5LCBtb3JlIHRoYW4gb25lIHByb3h5IGNhbiBiZSBjcmVhdGVkIGZvciB0aGUgc2FtZSBiZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSUlERUJlYW5Qcm94eSkgewotCQkJcmV0dXJuIGZCZWFuLmVxdWFscygoKElJREVCZWFuUHJveHkpIG9iaikuZ2V0QmVhbigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAxMjM0NSArIChnZXRCZWFuKCkgIT0gbnVsbCA/IGdldEJlYW4oKS5oYXNoQ29kZSgpIDogMCk7IAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpCi0JCQlyZXR1cm4gZ2V0QmVhbigpID09ICgoSUlERUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuZ2V0QmVhbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDAxYjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICRSQ1NmaWxlOiBJREVCZWFuVHlwZVByb3h5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xNiAkICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjA1ICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgSURFQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5Qcm94eSBpbXBsZW1lbnRzIElCZWFuVHlwZVByb3h5IHsKLQotCXByb3RlY3RlZCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLQlDbGFzcyBmQ2xhc3M7Ci0KLQlwcm90ZWN0ZWQgSURFQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJZkNsYXNzID0gYUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldCBUeXBlIFByb3h5LiBUaGUgdHlwZSBwcm94eSBvZiBhIEJlYW5UeXBlIGlzIENsYXNzLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jbGFzc0NsYXNzOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB7Ci0JCXJldHVybiBmQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCXJldHVybiBmQ2xhc3MudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzcy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQkJcmV0dXJuICgoSURFQmVhblR5cGVQcm94eSkgYUJlYW5UeXBlUHJveHkpLmZDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZDbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBmQ2xhc3MuaXNJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGZDbGFzcy5pc1ByaW1pdGl2ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmQ2xhc3MuaXNBcnJheSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZHMoZkNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkTWV0aG9kcyhmQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbiB1c2UgcmVmbGVjdGlvbiBvbiBvdXIgY2xhc3MgdG8gZmluZCB0aGUgamF2YS5yZWZsZWN0Lk1ldGhvZCBpbnN0YW5jZSBhbmQgY3JlYXRlIHRoZSBJREVNZXRob2RQcm94eSBkaXJlY3RseQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQotCQl0cnkgewotCQkJTWV0aG9kIGFNZXRob2QgPSBmQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzc1swXSk7Ci0JCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoYU1ldGhvZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eSh0aGlzLCBtZXRob2ROYW1lLCBhcmd1bWVudENsYXNzTmFtZXMpOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBmaXJzdEFyZ0NsYXNzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2ROYW1lLCBuZXcgU3RyaW5nW10geyBmaXJzdEFyZ0NsYXNzfSk7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmdzKSB7Ci0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJnc1tpXSkuZkNsYXNzOwotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShmQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZE1ldGhvZFByb3h5KGZDbGFzcywgbWV0aG9kTmFtZSwgYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJncykgewotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBudWxsOwotCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQlhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3MubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3NbaV0pLmZDbGFzczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRNZXRob2RQcm94eShmQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUsIGFyZ3VtZW50VHlwZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUsIGFyZ3VtZW50Q2xhc3NOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUsIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZE5hbWUpOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ1R5cGVOYW1lcykgewotCQlJQmVhblR5cGVQcm94eVtdIGFyZ0NsYXNzZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbYXJnVHlwZU5hbWVzLmxlbmd0aF07Ci0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJ0RmFjdG9yeSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9IGJ0RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ1R5cGVOYW1lc1tpXSk7Ci0JCQlpZiAoYXJnQ2xhc3Nlc1tpXSA9PSBudWxsKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiQ29uc3RydWN0b3Igbm90IGZvdW5kIC0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgZkNsYXNzLmdldE5hbWUoKSArICIgYXJncz0iICsgYXJnVHlwZU5hbWVzLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JQcm94eShhcmdDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3MpIHsKLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3MubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmdzW2ldKS5mQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbnN0cnVjdG9yUHJveHkoZkNsYXNzLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29uc3RydWN0b3JzKGZDbGFzcyk7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmdUeXBlTmFtZXMpIHsKLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdDbGFzc2VzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ1R5cGVOYW1lcy5sZW5ndGhdOwotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBidEZhY3RvcnkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSBidEZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmdUeXBlTmFtZXNbaV0pOwotCQkJaWYgKGFyZ0NsYXNzZXNbaV0gPT0gbnVsbCkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIkNvbnN0cnVjdG9yIG5vdCBmb3VuZCAtICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZDbGFzcy5nZXROYW1lKCkgKyAiIGFyZ3M9IiArIGFyZ1R5cGVOYW1lcywgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShhcmdDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJncykgewotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3NbaV0pLmZDbGFzczsKLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KGZDbGFzcywgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoZkNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN1cGVydHlwZSBmb3IgdXMgVXNlIHRoZSBmYWN0b3J5IHRvIGdldCBpdCByYXRoZXIgdGhhbiBjcmVhdGUgaXQgZGlyZWN0bHkgc28gdGhhdCB0aGUgZmFjdG9yeSBoYXMgdGhlIGNoYW5jZSB0byBjYWNoZSBjbGFzc2VzIGlmCi0JICogcmVxdWlyZWQgVGhpcyBpcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCi0JCWlmIChmQ2xhc3MuaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlCi0JCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShmQ2xhc3MuZ2V0U3VwZXJjbGFzcygpLmdldE5hbWUoKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RmllbGRzKGZDbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRGaWVsZHMoZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZDbGFzcy5nZXRGaWVsZChmaWVsZE5hbWUpOwotCQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldEZpZWxkUHJveHkoZmllbGQpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiRmllbGQgbm90IGZvdW5kICIgKyBmQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICIgLSAiICsgZmllbGROYW1lLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGVjbGFyZWRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUZpZWxkIGZpZWxkID0gZkNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZFByb3h5KGZpZWxkKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIkZpZWxkIG5vdCBmb3VuZCAiICsgZkNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiIC0gIiArIGZpZWxkTmFtZSwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBJREUgV2UgY2FuIHVzZSB0aGUgcGFja2FnZSBwcm90ZWN0ZWQgY29udHN0cnVjdG9yIG9uCi0JICogSURFQ29uc3RydWN0b3JQcm94eQotCSAqLwotCUlDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcykgewotCi0JCUNvbnN0cnVjdG9yIGFDb25zdHJ1Y3RvciA9IG51bGw7Ci0KLQkJLy8gVXNlIHJlZmxlY3Rpb24gdG8gdHJ5IGFuZCBmaW5kIGEgY29uc3RydWN0b3IuIFRoZSBhcmd1bWVudENsYXNzTmFtZXMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gY2xhc3NlcwotCQl0cnkgewotCQkJYUNvbnN0cnVjdG9yID0gZkNsYXNzLmdldENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBJZiB3ZSBoYXZlIGEgY29uc3RydWN0b3IgcmV0dXJuIGl0Ci0JCWlmIChhQ29uc3RydWN0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE5ld0NvbnN0cnVjdG9yUHJveHkoYUNvbnN0cnVjdG9yKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3JlZCBpbnRvIGl0cyBvd24gbWV0aG9kIHNvIHN1YmNsYXNzIGNhbiBvdmVycmlkZQotCSAqLwotCXByb3RlY3RlZCBJQ29uc3RydWN0b3JQcm94eSBnZXROZXdDb25zdHJ1Y3RvclByb3h5KENvbnN0cnVjdG9yIGFDb25zdHJ1Y3RvcikgewotCi0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb25zdHJ1Y3RvclByb3h5KGFDb25zdHJ1Y3Rvcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgbnVsbCBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgSURFIFdlIGNhbiB1c2UgdGhlIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnRzdHJ1Y3RvciBvbgotCSAqIElERUNvbnN0cnVjdG9yUHJveHkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKSB7Ci0KLQkJQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yID0gbnVsbDsKLQotCQkvLyBVc2UgcmVmbGVjdGlvbiB0byB0cnkgYW5kIGZpbmQgYSBjb25zdHJ1Y3Rvci4gVGhlIGFyZ3VtZW50Q2xhc3NOYW1lcyBtdXN0IGJlIGNvbnZlcnRlZCB0byBjbGFzc2VzCi0JCXRyeSB7Ci0JCQlhQ29uc3RydWN0b3IgPSBmQ2xhc3MuZ2V0Q29uc3RydWN0b3IobnVsbCk7Ci0JCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29uc3RydWN0b3JQcm94eShhQ29uc3RydWN0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLmNyZWF0ZUJlYW5Qcm94eSh0aGlzLCBpbml0aWFsaXphdGlvblN0cmluZyk7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiAoKElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgVXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyB0aGUgdHlwZSBwcm94eSB0byBiZSBzZXQgYXMgd2VsbCBhcyB0aGUgYmVhbiBiZWNhdXNlIHdlIGFyZQotCSAqIHRoZSB0eXBlIGFuZCBieSBzZXR0aW5nIGl0IG5vdyB3ZSBtaWdodCBhdm9pZCBpdCBiZWluZyBsb29rdXAgZm9yIGluIHRoZSBmYWN0b3J5IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGFza2VkIGZvcgotCSAqIAotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIElERUJlYW5Qcm94eS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0KLQkJcmV0dXJuIG5ldyBJREVPYmplY3RCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCwgdGhpcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdWJjbGFzcyBiZWFudHlwZSBwcm94eS4KLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzIHR5cGUpIHsKLQkJLy8gRGVmYXVsdCBpcyBqdXN0IGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhpcyBzYW1lIGNsYXNzLgotCQlyZXR1cm4gbmV3IElERUJlYW5UeXBlUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEluaXRpYWxpemF0aW9uRXJyb3IoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpIHsKLQkJcmV0dXJuIG51bGw7IC8vIEJ5IGRlZmF1bHQgbm9uZSBoYXZlIGFuIGluaXRpYWxpemF0aW9uIGVycm9yLiBUaGVyZSBpcyBhIHNwZWNpYWwgaW5zdGFuY2UgZm9yIGluaXQgZXJyb3JzLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0KLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3VtZW50VHlwZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmd1bWVudFR5cGVzW2ldKS5mQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihmQ2xhc3MsIGFyZ0NsYXNzZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3VtZW50VHlwZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmd1bWVudFR5cGVzW2ldKS5mQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbXBhdGlibGVNZXRob2QoZkNsYXNzLCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCUlQcm94eU1ldGhvZCBtZXRob2QgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldE1ldGhvZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJLy8gTmVlZCB0byBnbyB0byB0aGUgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGl0LgotCQkJbWV0aG9kID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVNZXRob2RFeHByZXNzaW9uUHJveHkodGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgKElQcm94eUJlYW5UeXBlW10pIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlJUHJveHlGaWVsZCBmaWVsZCA9ICgoSURFRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0RmllbGRFeHByZXNzaW9uUHJveHkodGhpcywgZmllbGROYW1lKTsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCS8vIE5lZWQgdG8gZ28gdG8gdGhlIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBpdC4KLQkJCWZpZWxkID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVGaWVsZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTkyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgamF2YS5tYXRoLio7Ci0KLWZpbmFsIGNsYXNzIElERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLUlERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsbmV3IEJpZ0RlY2ltYWwoMCkpOwotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJpZ0RlY2ltYWxCZWFuUHJveHkoQmlnRGVjaW1hbCBhQmlnRGVjaW1hbCkgewotCWlmICggYUJpZ0RlY2ltYWwgPT0gbnVsbCB8fCBhQmlnRGVjaW1hbC5pbnRWYWx1ZSgpID09IDAgKSB7Ci0JCXJldHVybiB6ZXJvUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFCaWdEZWNpbWFsLHRoaXMpOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UzY2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEubWF0aC4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuVHlwZVByb3h5Ci0gKi8KLWZpbmFsIGNsYXNzIElERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLUlERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBCaWdJbnRlZ2VyKCIwIikpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eShCaWdJbnRlZ2VyIGFCaWdJbnRlZ2VyKSB7Ci0JaWYgKCBhQmlnSW50ZWdlciA9PSBudWxsIHx8IGFCaWdJbnRlZ2VyLmludFZhbHVlKCkgPT0gMCApIHsKLQkJcmV0dXJuIHplcm9Qcm94eTsKLQl9IGVsc2UgewotCQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUJpZ0ludGVnZXIsdGhpcyk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDdkNzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJQm9vbGVhbkJlYW5Qcm94eS4uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBJREVCb29sZWFuQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByb3RlY3RlZCBCb29sZWFuIGZCb29sZWFuVmFsdWU7Ci0vKioKLSAqIEFzIHdlbGwgYXMgc3RvcmluZyB0aGUgYmVhbiBzdG9yZSB0aGUgYm9vbGVhbiB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGJvb2xlYW5WYWx1ZSBmYXN0ZXIKLSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIHJlLWNhc3RpbmcuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotICogc3BlY2lhbCB3YXksIHNvIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlc2UuCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1JREVCb29sZWFuQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sYUJlYW5UeXBlUHJveHkpOwotCWZCb29sZWFuVmFsdWUgPSAoQm9vbGVhbilhQmVhbjsKLX0KLXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKTsKLX0KLXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZTsKLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZmOTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCb29sZWFuQmVhblByb3h5IHsKLQotCS8qKgotCSAqIEBwYXJhbSBhUmVnaXN0cnkKLQkgKiBAcGFyYW0gYUJlYW4KLQkgKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLQkgKi8KLQlwdWJsaWMgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4sIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sIGFCZWFuVHlwZVByb3h5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJcmV0dXJuIChhQmVhblByb3h5IGluc3RhbmNlb2YgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkpID8gZ2V0Qm9vbGVhblZhbHVlKCkgPT0gKChJREVCb29sZWFuQmVhblR5cGVQcm94eSkgYUJlYW5Qcm94eSkuZ2V0Qm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzgzOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotZmluYWwgcHVibGljIGNsYXNzIElERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElERUJvb2xlYW5CZWFuUHJveHkgdHJ1ZVByb3h5OwotCXByb3RlY3RlZCBmaW5hbCBJREVCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0KLUlERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQl0cnVlUHJveHkgPSBuZXcgSURFQm9vbGVhbkJlYW5Qcm94eSggZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBCb29sZWFuLlRSVUUsIHRoaXMgKTsKLQlmYWxzZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuUHJveHkoIGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5GQUxTRSwgdGhpcyk7CQotfQotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShCb29sZWFuIGFCb29sZWFuKSB7Ci0JaWYgKCBhQm9vbGVhbi5ib29sZWFuVmFsdWUoKSApewotCQlyZXR1cm4gdHJ1ZVByb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZVByb3h5OwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUJvb2xlYW5CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlpZiAoIGFuT2JqZWN0ID09IG51bGwgfHwgYW5PYmplY3QgPT0gQm9vbGVhbi5GQUxTRSApIHsKLQkJcmV0dXJuIGZhbHNlUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRydWVQcm94eTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1NDhmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLWZpbmFsIHB1YmxpYyBjbGFzcyBJREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElERUJvb2xlYW5CZWFuUHJveHkgdHJ1ZVByb3h5OwotCXByb3RlY3RlZCBmaW5hbCBJREVCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0KLUlERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCi0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCXRydWVQcm94eSA9IG5ldyBJREVCb29sZWFuQmVhblR5cGVQcm94eSggZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBCb29sZWFuLlRSVUUsIHRoaXMgKTsKLQlmYWxzZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuVHlwZVByb3h5KCBmUHJveHlGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uRkFMU0UsIHRoaXMgKTsKLQkKLQkvLyBUT0RPIE5lZWQgdG8gZ28gdGhyb3VnaCBhbGwgb2YgdGhlIHByaW1pdGl2ZXMsIHNlcGFyYXRlIHRoZW0gb3V0IGludG8gYSBzZXBhcmF0ZSBjbGFzc2VzIHNvCi0JLy8gdGhhdCBzYW1lQXMgY2FuIHdvcmsgd2l0aCB0aGVtIGNvcnJlY3RseS4gQ3VycmVudGx5IG9ubHkgYm9vbGVhbiB0eXBlIHdpbGwgZG8gc2FtZUFzIGNvcnJlY3RseS4KLQkvLyBTaG91bGQgYWxzbyBsb29rIGludG8gc3RvcmluZyB0aGUgcHJpbWl0aXZlIGluIHRoZSBwcm94eSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IHdyYXBwZXIgb2JqZWN0Ci0JLy8gZm9yIGVhY2ggZm9yIHRoZSBub24tYm9vbGVhbiBwcmltaXRpdmVzLgkKLX0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShib29sZWFuIGFCb29sZWFuKSB7Ci0JaWYgKCBhQm9vbGVhbiApewotCQlyZXR1cm4gdHJ1ZVByb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZVByb3h5OwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUJvb2xlYW5CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gKElJREVCZWFuUHJveHkpY3JlYXRlQm9vbGVhbkJlYW5Qcm94eSggYW5PYmplY3QgIT0gbnVsbCA/ICgoQm9vbGVhbilhbk9iamVjdCkuYm9vbGVhblZhbHVlKCkgOiBmYWxzZSApOwotCi19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBCT09MRUFOOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlM2U2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEJ5dGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQkJCi1wcm90ZWN0ZWQgSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgQnl0ZSgoYnl0ZSkwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJ5dGVCZWFuUHJveHkoQnl0ZSBhQnl0ZSl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFCeXRlLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE3MTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogQnl0ZSBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci1wcm90ZWN0ZWQgSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCeXRlQmVhblByb3h5KGJ5dGUgYUJ5dGUpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgQnl0ZShhQnl0ZSksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBCWVRFOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBCeXRlKChieXRlKSgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBuLCB0aGlzKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDYWxsYmFja1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNhbGxiYWNrUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1Zjc2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNhbGxiYWNrUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJREVDYWxsYmFja1JlZ2lzdHJ5IGltcGxlbWVudHMgSUNhbGxiYWNrUmVnaXN0cnkgewotCQotCUlERVZNU2VydmVyIGZWTVNlcnZlcjsKLQlpbnQgZk5leHRDYWxsYmFja0lEOwotCUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQlNYXAgZkNhbGxiYWNrSURUb0NhbGxiYWNrID0gbmV3IEhhc2hNYXAoMjUpOwotCU1hcCBmQmVhblByb3h5VG9DYWxsYmFja0lEID0gbmV3IEhhc2hNYXAoMjUpOwotCU1hcCBmQ2FsbGJhY2tJRFRvU3RyZWFtID0gbmV3IEhhc2hNYXAoMjUpOwotCXByaXZhdGUgSVByb3h5TWV0aG9kIGluaXRpYWxpemVDYWxsYmFja01ldGhvZFByb3h5OwotCXByaXZhdGUgSUJlYW5Qcm94eSB2bVNlcnZlclByb3h5OwotCQotSURFQ2FsbGJhY2tSZWdpc3RyeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCWZQcm94eUZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQlmVk1TZXJ2ZXIgPSBuZXcgSURFVk1TZXJ2ZXIodGhpcyk7Ci0JCi0Jdm1TZXJ2ZXJQcm94eSA9IGFSZWdpc3RyeS5nZXRCZWFuUHJveHkoZlZNU2VydmVyLmdldENsYXNzKCksIGZWTVNlcnZlcik7Ci0JCi0JdHJ5IHsKLQkJTWV0aG9kIGluaXRpYWxpemVDYWxsYmFja01ldGhvZCA9IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrLmNsYXNzLmdldE1ldGhvZCgiaW5pdGlhbGl6ZUNhbGxiYWNrIiwgbmV3IENsYXNzW10ge29yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNQ2FsbGJhY2tTZXJ2ZXIuY2xhc3MsIEludGVnZXIuVFlQRX0pOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVDYWxsYmFja01ldGhvZFByb3h5ID0gKElQcm94eU1ldGhvZCkgYVJlZ2lzdHJ5LmdldEJlYW5Qcm94eShNZXRob2QuY2xhc3MsIGluaXRpYWxpemVDYWxsYmFja01ldGhvZCk7Ci0JfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCQotfQotCi0KLS8qKgotICogQWRkIGEgY2FsbGJhY2suICBhQmVhblByb3h5IGlzIHJ1bm5pbmcgb24gdGhlIHRhcmdldCBWTSBhbmQgSUNhbGxiYWNrIHJ1bnMgb24gb3VyIFZNCi0gKiBhQmVhblByb3h5IHdpbGwgaW1wbGVtZW50IElDYWxsYmFjayBvbiB0aGUgdGFyZ2V0IHNpZGUKLSAqLwkKLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBhQmVhblByb3h5LCBJQ2FsbGJhY2sgYUNhbGxiYWNrKXsKLQotCS8vIEdldCBhIGhhbmRsZSB0byB0aGUgcmVtb3RlIFZNIGNhbGxiYWNrCQotCW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrIHZtQ2FsbGJhY2sgPSAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2spICgoSUlERUJlYW5Qcm94eSlhQmVhblByb3h5KS5nZXRCZWFuKCk7IAotCWZOZXh0Q2FsbGJhY2tJRCA9IGZOZXh0Q2FsbGJhY2tJRCArIDE7Ci0JaW50IGNhbGxiYWNrSUQgPSBmTmV4dENhbGxiYWNrSUQ7Ci0Jdm1DYWxsYmFjay5pbml0aWFsaXplQ2FsbGJhY2soCi0JCWZWTVNlcnZlciwKLQkJY2FsbGJhY2tJRCk7Ci0JSW50ZWdlciBjYWxsYmFja0ludGVnZXJJRCA9IG5ldyBJbnRlZ2VyKGNhbGxiYWNrSUQpOwotCWZDYWxsYmFja0lEVG9DYWxsYmFjay5wdXQoY2FsbGJhY2tJbnRlZ2VySUQsYUNhbGxiYWNrKTsKLQlmQmVhblByb3h5VG9DYWxsYmFja0lELnB1dChhQmVhblByb3h5LGNhbGxiYWNrSW50ZWdlcklEKTsKLQotfQotCi0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjaywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24pCi0gKi8KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSVByb3h5IGNhbGxiYWNrUHJveHksIGZpbmFsIElDYWxsYmFjayBjYiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCWZpbmFsIEludGVnZXIgY2FsbGJhY2tJRCA9IG5ldyBJbnRlZ2VyKCsrZk5leHRDYWxsYmFja0lEKTsKLQlmQ2FsbGJhY2tJRFRvQ2FsbGJhY2sucHV0KGNhbGxiYWNrSUQsIGNiKTsKLQlpZiAoY2FsbGJhY2tQcm94eS5pc0JlYW5Qcm94eSgpKSB7Ci0JCWZCZWFuUHJveHlUb0NhbGxiYWNrSUQucHV0KGNhbGxiYWNrUHJveHksIGNhbGxiYWNrSUQpOwkJCi0JfSBlbHNlIHsKLQkJKChFeHByZXNzaW9uUHJveHkpIGNhbGxiYWNrUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlmQmVhblByb3h5VG9DYWxsYmFja0lELnB1dChldmVudC5nZXRQcm94eSgpLCBjYWxsYmFja0lEKTsJCQotCQkJfQotCQl9KTsKLQl9Ci0JZXhwcmVzc2lvbi5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UoaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kUHJveHksIGNhbGxiYWNrUHJveHksIG5ldyBJUHJveHlbXSB7dm1TZXJ2ZXJQcm94eSwgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGNhbGxiYWNrSUQuaW50VmFsdWUoKSl9LCBmYWxzZSk7Ci0JCi19Ci0KLU91dHB1dFN0cmVhbSByZXF1ZXN0U3RyZWFtKGZpbmFsIGludCBhQ2FsbGJhY2tJRCwgZmluYWwgaW50IGFNc2dJRCl7Ci0JZmluYWwgUGlwZWRPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7Ci0JUGlwZWRJbnB1dFN0cmVhbSB0ZW1wU3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0ZW1wU3RyZWFtID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0ocmVzdWx0KTsJCi0JfSBjYXRjaCAoIElPRXhjZXB0aW9uIGV4YyApIHsKLQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBudWxsOwotCX0KLQlmaW5hbCBQaXBlZElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdGVtcFN0cmVhbTsKLQlUaHJlYWQgc3RyZWFtUHJvY2Vzc29yID0gbmV3IFRocmVhZCgpewotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCUlDYWxsYmFjayBpZGVDYWxsYmFjayA9IChJQ2FsbGJhY2spZkNhbGxiYWNrSURUb0NhbGxiYWNrLmdldChuZXcgSW50ZWdlcihhQ2FsbGJhY2tJRCkpOwotCQkJaWYgKGlkZUNhbGxiYWNrICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZGVDYWxsYmFjay5jYWxsZWRCYWNrU3RyZWFtKGFNc2dJRCwgaW5wdXRTdHJlYW0pOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwkvLyBNYWtlIHN1cmUgaXQncyBjbG9zZWQuCi0JCQkJCX0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiAgZXhjICl7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0JCQkKLQkJCX0KLQkJfQotCX07Ci0Jc3RyZWFtUHJvY2Vzc29yLnN0YXJ0KCk7Ci0JcmV0dXJuIHJlc3VsdDsJCi19Ci0KLU9iamVjdCB2bUNhbGxiYWNrKGludCBhQ2FsbGJhY2tJRCAsaW50IGFNc2dJRCwgT2JqZWN0W10gcGFybXMpewotCS8vIEZpbmQgdGhlIGJlYW4gcHJveHkgdGhhdCByZWdpc3RlcmVkIHdpdGggdGhlIElECi0JSUNhbGxiYWNrIGlkZUNhbGxiYWNrID0gKElDYWxsYmFjaykgZkNhbGxiYWNrSURUb0NhbGxiYWNrLmdldChuZXcgSW50ZWdlcihhQ2FsbGJhY2tJRCkpOwotCU9iamVjdCBjYWxsYmFja1Jlc3VsdCA9IG51bGw7Ci0JaWYgKCBwYXJtcy5sZW5ndGggPT0gMSApIHsKLQkJY2FsbGJhY2tSZXN1bHQgPSBpZGVDYWxsYmFjay5jYWxsZWRCYWNrKGFNc2dJRCwoSUJlYW5Qcm94eSlwYXJtc1swXSk7Ci0JfSBlbHNlIHsKLQkJY2FsbGJhY2tSZXN1bHQgPSBpZGVDYWxsYmFjay5jYWxsZWRCYWNrKGFNc2dJRCxwYXJtcyk7Ci0JfQotCXJldHVybiBjYWxsYmFja1Jlc3VsdDsKLX0KLQotT2JqZWN0IHZtQ2FsbGJhY2soaW50IGFDYWxsYmFja0lEICxpbnQgYU1zZ0lELCBPYmplY3QgcGFybSl7Ci0JLy8gRmluZCB0aGUgYmVhbiBwcm94eSB0aGF0IHJlZ2lzdGVyZWQgd2l0aCB0aGUgSUQKLQlJQ2FsbGJhY2sgaWRlQ2FsbGJhY2sgPSAoSUNhbGxiYWNrKSBmQ2FsbGJhY2tJRFRvQ2FsbGJhY2suZ2V0KG5ldyBJbnRlZ2VyKGFDYWxsYmFja0lEKSk7Ci0JcmV0dXJuIGlkZUNhbGxiYWNrLmNhbGxlZEJhY2soYU1zZ0lELHBhcm0pOwotfQotCi1wdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQkvLyBSZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gYm90aCBtYXBzLiAgVGhlIGFjdHVhbCB1bnJlZ2lzdGVyaW5nIG9mIHRoZSBjYWxsYmFjawotCS8vIG9uIHRoZSB0YXJnZXQgVk0gaXMgZG9uZSBzZXBhcmF0ZWx5IGJ5IHRoZSBvYmplY3QgdGhhdCBhZGRlZCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgdGFyZ2V0IFZNCi0JSW50ZWdlciBjYWxsYmFja0lEID0gKEludGVnZXIpIGZCZWFuUHJveHlUb0NhbGxiYWNrSUQucmVtb3ZlKGFCZWFuUHJveHkpOwotCWZDYWxsYmFja0lEVG9DYWxsYmFjay5yZW1vdmUoY2FsbGJhY2tJRCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwZDdmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogY2hhciBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci1wcm90ZWN0ZWQgSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVDaGFyQmVhblByb3h5KGNoYXIgYUNoYXIpewotCXJldHVybiBuZXcgSURFQ2hhcmFjdGVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgQ2hhcmFjdGVyKGFDaGFyKSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIENIQVI7Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlDaGFyYWN0ZXIgYyA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gKENoYXJhY3RlcikgYW5PYmplY3QgOiBuZXcgQ2hhcmFjdGVyKChjaGFyKSgoTnVtYmVyKSBhbk9iamVjdCkuaW50VmFsdWUoKSk7Ci0JcmV0dXJuIG5ldyBJREVDaGFyYWN0ZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBjLCB0aGlzKTsKLQkKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1YjY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICRSQ1NmaWxlOiBJREVDaGFyYWN0ZXJCZWFuUHJveHkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJQ2hhcmFjdGVyQmVhbkJlYW5Qcm94eS4uCi0gKi8KLWNsYXNzIElERUNoYXJhY3RlckJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElDaGFyYWN0ZXJCZWFuUHJveHkgewotCXByb3RlY3RlZCBDaGFyYWN0ZXIgZkNoYXJhY3RlclZhbHVlOwotCUlERUNoYXJhY3RlckJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhQmVhbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhQmVhbiwgYUJlYW5UeXBlUHJveHkpOwotCQlmQ2hhcmFjdGVyVmFsdWUgPSAoQ2hhcmFjdGVyKSBhQmVhbjsKLQl9Ci0JcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJhY3RlclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQlwdWJsaWMgQ2hhcmFjdGVyIGNoYXJhY3RlclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJhY3RlclZhbHVlOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklJbnRlZ2VyQmVhblByb3h5I2ludFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gY2hhclZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNieXRlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIChieXRlKSBjaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2RvdWJsZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCQlyZXR1cm4gY2hhclZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNmbG9hdFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjbG9uZ1ZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCXJldHVybiBjaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I251bWJlclZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCQkvLyBUaGlzIGlzIGEga2x1ZGdlLiBOZWVkIHRvIG5ldyBvbmUgdXAuCi0JCXJldHVybiBuZXcgSW50ZWdlcihjaGFyVmFsdWUoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNzaG9ydFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChzaG9ydCkgY2hhclZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5ODc1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQ2hhciBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi1wcm90ZWN0ZWQgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkoQ2hhcmFjdGVyIGFDaGFyKXsKLQlyZXR1cm4gbmV3IElERUNoYXJhY3RlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUNoYXIsdGhpcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1YTZjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHk7Ci0gCi0vKioKLSAqIEZvciBqYXZhLmxhbmcuQ2xhc3MgdHlwZS4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSURFQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlZ2lzdHJ5Ci0JICogQHBhcmFtIGFDbGFzcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJREVDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiAoSUlERUJlYW5Qcm94eSkgKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgoQ2xhc3MpIGFuT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTI3MjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbnN0cnVjdG9yUHJveHkgd2hlcmUgdGhlIHRhcmdldCBWTSBpcyB0aGUgc2FtZSBhcwotICogdGhlIElERS4gIFRoZSBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBpbnN0YW5jZSBpcyBoZWxkIGluIGEgZmllbGQKLSAqLwotY2xhc3MgSURFQ29uc3RydWN0b3JQcm94eSBleHRlbmRzIElERUFjY2Vzc2libGVPYmplY3RQcm94eSBpbXBsZW1lbnRzIElDb25zdHJ1Y3RvclByb3h5IHsKLQotCS8qKgotCSAqIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHdoZXJlIHRoZSBpbnN0YW5jZSBvZiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcgotCSAqIGNhbiBiZSBwYXNzZWQgaW4gZGlyZWN0bHkKLQkgKi8KLQlJREVDb25zdHJ1Y3RvclByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUNvbnN0cnVjdG9yKTsKLQl9Ci0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuY29uc3RydWN0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgZmFjdG9yZWQgaW50byBhIHNwZWNpYWwgbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLQkgKiBpZiB0aGV5IHdpc2guCi0JICovCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgZ2V0TmV3SURFQmVhblByb3h5KE9iamVjdCBhQmVhbikgewotCi0JCXJldHVybiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYUJlYW4pOyAvLyBVc2UgbG9jYWwgaGVscGVyIG1ldGhvZCB0byBkbyB0aGlzLgotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIGNvbnN0cnVjdG9yIGFuZCByZXR1cm4gYW4gSURFQmVhblByb3h5IHdpdGggdGhlIHJlc3VsdAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCi0JCS8vIEludm9rZSB0aGUgY29uc3RydWN0b3IKLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKENvbnN0cnVjdG9yKSBnZXRCZWFuKCkpLm5ld0luc3RhbmNlKG51bGwpOwotCQkJcmV0dXJuIGdldE5ld0lERUJlYW5Qcm94eShyZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKCk7Ci0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHlbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShhcmdzKTsKLQl9Ci0JLyoqCi0JICogSW52b2tlIHRoZSBjb25zdHJ1Y3RvciBhbmQgcmV0dXJuIGFuIElERUJlYW5Qcm94eSB3aXRoIHRoZSByZXN1bHQKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpIHsKLQotCQkvLyBHZXQgYW4gYXJyYXkgb2YgYmVhbiBvYmplY3RzIGZyb20gdGhlIGJlYW4gcHJveHkgYXJndW1lbnRzCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlPYmplY3RbXSBjcmVhdGlvbk9iamVjdHMgPSBuZXcgT2JqZWN0W2NyZWF0aW9uQXJndW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlYXRpb25Bcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBhcmd1bWVudHMgYXJlIG51bGwgd2hpY2ggaXMgcGVyZmVjdGx5IHZhbGlkCi0JCQlpZiAoY3JlYXRpb25Bcmd1bWVudHNbaV0gIT0gbnVsbCkKLQkJCQljcmVhdGlvbk9iamVjdHNbaV0gPSAoKElJREVCZWFuUHJveHkpIGNyZWF0aW9uQXJndW1lbnRzW2ldKS5nZXRCZWFuKCk7Ci0JCX0KLQotCQkvLyBJbnZva2UgdGhlIGNvbnN0cnVjdG9yCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoKENvbnN0cnVjdG9yKSBnZXRCZWFuKCkpLm5ld0luc3RhbmNlKGNyZWF0aW9uT2JqZWN0cyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJZiB3ZSBoYXZlIGEgbm9uLW51bGwgcmVzdWx0IGNyZWF0ZSBhbiBJREVCZWFuUHJveHkgYW5kIHJldHVybiBpdAotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXROZXdJREVCZWFuUHJveHkocmVzdWx0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbnN0cnVjdG9yUHJveHkjZ2V0UGFyYW1ldGVyVHlwZXMoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlDbGFzc1tdIHBhcm1DbGFzc2VzID0gKChDb25zdHJ1Y3RvcikgZ2V0QmVhbigpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlJQmVhblR5cGVQcm94eVtdIHBhcm1UeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtwYXJtQ2xhc3Nlcy5sZW5ndGhdOwotCQlJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1UeXBlc1tpXSA9IGZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJtQ2xhc3Nlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcm1UeXBlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlYjc1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgSURFQ29uc3RydWN0b3JUeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQkKLQlJREVDb25zdHJ1Y3RvclR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlzdXBlcihyZWdpc3RyeSwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuY2xhc3MpOwotCX0KLQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5Qcm94eShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gbmV3IElERUNvbnN0cnVjdG9yUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCAoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGFuT2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmNiNzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBEb3VibGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotCi1wcm90ZWN0ZWQgSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBEb3VibGUoMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVEb3VibGVCZWFuUHJveHkoRG91YmxlIGFEb3VibGUpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhRG91YmxlLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0NWRmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBkb3VibGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci1wcm90ZWN0ZWQgSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZURvdWJsZUJlYW5Qcm94eShkb3VibGUgYURvdWJsZSl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBEb3VibGUoYURvdWJsZSksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBET1VCTEU7Ci19Ci0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCU51bWJlciBuID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyBuZXcgRG91YmxlKCgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBuLCB0aGlzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODg3NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAkUkNTZmlsZTogSURFRXhwcmVzc2lvbi5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTIgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLio7Ci0KLS8qKgotICogSURFIGV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0KLQlwcml2YXRlIGZpbmFsIElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhbnR5cGVmYWN0b3J5OwotCXByb3RlY3RlZCBmaW5hbCBFeHByZXNzaW9uUHJvY2Vzc2VyIGVwcm9jOwotCXsKLQkJYm9vbGVhbiB1c2VUcmFjaW5nID0gIWlzVHJhY2VTZXQoKSA/IAotCQkJInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBQcm94eUxhdW5jaFN1cHBvcnQuRVhQUkVTU0lPTl9UUkFDSU5HKSkgOiAvLyROT04tTkxTLTEkCi0JCQlpc1RyYWNlKCk7Ci0JCWxvbmcgdGhyZXNob2xkID0gTG9uZy5nZXRMb25nKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgUHJveHlMYXVuY2hTdXBwb3J0LkVYUFJFU1NJT05fVFJBQ0VJTkdfVElNRVJfVEhSRVNIT0xEKSwgLTFMKS5sb25nVmFsdWUoKTsKLQkJZXByb2MgPSBuZXcgRXhwcmVzc2lvblByb2Nlc3Nlcih1c2VUcmFjaW5nLCB0aHJlc2hvbGQpOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXhwcmVzc2lvbkVycm9yKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICghZXByb2Mubm9FcnJvcnMoKSkKLQkJCWlmIChlcHJvYy5pc05vRXhwcmVzc2lvblZhbHVlKCkpCi0JCQkJdGhyb3cgKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKSBlcHJvYy5nZXRFcnJvclRocm93YWJsZSgpOwotCQkJZWxzZSB7Ci0JCQkJVGhyb3dhYmxlIHQgPSBlcHJvYy5nZXRFcnJvclRocm93YWJsZSgpOwotCQkJCWlmICh0IGluc3RhbmNlb2YgVGhyb3dhYmxlUHJveHkpCi0JCQkJCXRocm93IChUaHJvd2FibGVQcm94eSkgdDsKLQkJCQllbHNlCi0JCQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShlcHJvYy5nZXRFcnJvclRocm93YWJsZSgpLCBiZWFudHlwZWZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSh0LmdldENsYXNzKCkpKTsKLQkJCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBJREVFeHByZXNzaW9uCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElERUV4cHJlc3Npb24oUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJc3VwZXIocmVnaXN0cnkpOwotCQliZWFudHlwZWZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0SURFUmVnaXN0cnkoKSB7Ci0JCXJldHVybiAoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkpIHJlZ2lzdHJ5OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGdldElERUJlYW5UeXBlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGJlYW50eXBlZmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVG9Qcm94eShJUHJveHkgcHJveHkpIHsKLQkJaWYgKHByb3h5ID09IG51bGwpCi0JCQllcHJvYy5wdXNoRXhwcmVzc2lvbihudWxsLCBNZXRob2RIZWxwZXIuTlVMTF9UWVBFKTsKLQkJZWxzZSBpZiAocHJveHkuaXNCZWFuUHJveHkoKSkKLQkJCWVwcm9jLnB1c2hFeHByZXNzaW9uKCgoSURFQmVhblByb3h5KSBwcm94eSkuZ2V0QmVhbigpLCAoKElERUJlYW5UeXBlUHJveHkpICgoSUJlYW5Qcm94eSkgcHJveHkpLmdldFR5cGVQcm94eSgpKS5nZXRUeXBlQ2xhc3MoKSk7Ci0JCWVsc2UKLQkJCWVwcm9jLnB1c2hFeHByZXNzaW9uUHJveHkoKChFeHByZXNzaW9uUHJveHkpIHByb3h5KS5nZXRQcm94eUlEKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNjbG9zZVByb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVByb3h5KCkgewotCQltZXRob2RFeHByZXNzaW9uUHJveGllcyA9IGZpZWxkRXhwcmVzc2lvblByb3hpZXMgPSBudWxsOwotCQllcHJvYy5jbG9zZSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVsbFByb3h5VmFsdWUoaW50LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUJlYW5Qcm94eSBwdWxsUHJveHlWYWx1ZShpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3NFeHRlbnNpb25Qcm94aWVzKHByb3h5Y291bnQsIGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJcHJvY2Vzc0V4cHJlc3Npb25FcnJvcigpOwotCQlPYmplY3QgcmVzdWx0W10gPSBuZXcgT2JqZWN0WzJdOwotCQllcHJvYy5wdWxsVmFsdWUocmVzdWx0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHRQcm94eSA9IGdldElERVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5KChDbGFzcykgcmVzdWx0WzFdLCByZXN1bHRbMF0pOwotCQlyZXR1cm4gcmVzdWx0UHJveHk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5zaW9uUHJveGllcyhpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgewotCQlpZiAocHJveHljb3VudCA+IDApIHsKLQkJCWludCBsZW4gPSBleHByZXNzaW9uUHJveGllcy5zaXplKCk7Ci0JCQlPYmplY3RbXSBwcm94eVJlc29sdXRpb24gPSBuZXcgT2JqZWN0WzJdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCUV4cHJlc3Npb25Qcm94eSBlcCA9IChFeHByZXNzaW9uUHJveHkpIGV4cHJlc3Npb25Qcm94aWVzLmdldChpKTsKLQkJCQlpZiAoZXAgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZXByb2MucHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKGVwLmdldFByb3h5SUQoKSwgcHJveHlSZXNvbHV0aW9uKTsKLQkJCQkJCWlmIChwcm94eVJlc29sdXRpb25bMV0gIT0gVm9pZC5UWVBFKQotCQkJCQkJCWZpcmVQcm94eVJlc29sdmVkKGVwLCBnZXRJREVSZWdpc3RyeSgpLmdldEJlYW5Qcm94eSgoQ2xhc3MpIHByb3h5UmVzb2x1dGlvblsxXSwgcHJveHlSZXNvbHV0aW9uWzBdKSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZmlyZVByb3h5Vm9pZChlcCk7Ci0JCQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZpcmVQcm94eU5vdFJlc29sdmVkKGVwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENhc3RUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDYXN0VG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoQ2FzdChnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEluc3RhbmNlb2ZUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbnN0YW5jZW9mVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoSW5zdGFuY2VvZihnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIEJlYW5UeXBlIHByb3h5IGFuZCB0ZXN0IGlmIHZhbGlkLiBUaHJvdyBUaHJvd2FibGVQcm94eSBpZiBub3QgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgCi0JICogQHJldHVybiAKLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIElERUJlYW5UeXBlUHJveHkgZ2V0SURFQmVhblR5cGVQcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJREVCZWFuVHlwZVByb3h5IHR5cGVQcm94eTsKLQkJaWYgKHR5cGUuaXNFeHByZXNzaW9uUHJveHkoKSkgewotCQkJLy8gSXQgc2hvdWxkIGFscmVhZHkgYmUgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludC4KLQkJCXR5cGVQcm94eSA9ICgoSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkpIHR5cGUpLmdldEJlYW5UeXBlUHJveHkoKTsKLQkJfSBlbHNlCi0JCQl0eXBlUHJveHkgPSAoSURFQmVhblR5cGVQcm94eSkgdHlwZTsKLQkJaWYgKCF0eXBlUHJveHkuaXNWYWxpZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoCi0JCQkJCW5ldyBFeGNlcHRpb24odHlwZVByb3h5LmdldEluaXRpYWxpemF0aW9uRXJyb3IoKSksCi0JCQkJCWdldElERUJlYW5UeXBlRmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoRXhjZXB0aW9uLmNsYXNzKSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHR5cGVQcm94eTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIEJlYW5UeXBlIHByb3h5IGFuZCB0ZXN0IGlmIHZhbGlkLiBUaHJvdyBUaHJvd2FibGVQcm94eSBpZiBub3QgdmFsaWQuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJREVCZWFuVHlwZVByb3h5IGdldElERUJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGUpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoSURFQmVhblR5cGVQcm94eSkgcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KHR5cGUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFByZWZpeFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5QcmVmaXhPcGVyYXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoUHJlZml4VG9Qcm94eShQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgewotCQllcHJvYy5wdXNoUHJlZml4KG9wZXJhdG9yKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbmZpeFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbmZpeE9wZXJhdG9yLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsSW5maXhPcGVyYW5kVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW5maXhUb1Byb3h5KEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBvcGVyYW5kVHlwZSkgewotCQllcHJvYy5wdXNoSW5maXgob3BlcmF0b3IsIG9wZXJhbmRUeXBlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBcnJheUFjY2Vzc1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUFjY2Vzc1RvUHJveHkoaW50IGluZGV4Q291bnQpIHsKLQkJZXByb2MucHVzaEFycmF5QWNjZXNzKGluZGV4Q291bnQpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFycmF5Q3JlYXRpb25Ub1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5Q3JlYXRpb25Ub1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBkaW1lbnNpb25Db3VudCkgewotCQl0cnkgewotCQkJZXByb2MucHVzaEFycmF5Q3JlYXRpb24oZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKSwgZGltZW5zaW9uQ291bnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFycmF5SW5pdGlhbGl6ZXJUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBzdHJpcENvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50KSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoQXJyYXlJbml0aWFsaXplcihnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpLCBzdHJpcENvdW50LCBleHByZXNzaW9uQ291bnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCksIGFyZ3VtZW50Q291bnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHlwZVJlY2VpdmVyVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHlwZVJlY2VpdmVyVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjID0gZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKTsKLQkJCWVwcm9jLnB1c2hFeHByZXNzaW9uKGMsIGMpOwkvLyBXaGVuIGFzIGEgcmVjZWl2ZXIsIHRoZSB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlaXZlci4gCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEZpZWxkQWNjZXNzVG9Qcm94eShqYXZhLmxhbmcuT2JqZWN0LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hGaWVsZEFjY2Vzc1RvUHJveHkoT2JqZWN0IGZpZWxkLCBib29sZWFuIGhhc1JlY2VpdmVyKSB7Ci0JCWJvb2xlYW4gaXNTdHJpbmcgPSBmaWVsZCBpbnN0YW5jZW9mIFN0cmluZzsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hGaWVsZEFjY2Vzcyhpc1N0cmluZyA/IGZpZWxkIDogZ2V0SURFRmllbGRQcm94eSgoSVByb3h5RmllbGQpIGZpZWxkKS5nZXRCZWFuKCksIGlzU3RyaW5nLCBoYXNSZWNlaXZlcik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE1ldGhvZEludm9jYXRpb25Ub1Byb3h5KGphdmEubGFuZy5PYmplY3QsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvblRvUHJveHkoT2JqZWN0IG1ldGhvZCwgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ0NvdW50KSB7Ci0JCWJvb2xlYW4gaXNTdHJpbmcgPSBtZXRob2QgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoTWV0aG9kSW52b2NhdGlvbihpc1N0cmluZyA/IG1ldGhvZCA6IGdldElERU1ldGhvZFByb3h5KChJUHJveHlNZXRob2QpIG1ldGhvZCkuZ2V0QmVhbigpLCBpc1N0cmluZywgaGFzUmVjZWl2ZXIsIGFyZ0NvdW50KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENvbmRpdGlvbmFsVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ29uZGl0aW9uYWxUb1Byb3h5KEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHByZXNzaW9uVHlwZSkgewotCQllcHJvYy5wdXNoQ29uZGl0aW9uYWwoZXhwcmVzc2lvblR5cGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEludm9rZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEludm9rZShpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIEluIHRoZSBJREUgY2FzZSBkbyBub3RoaW5nLiBOb3RoaW5nIGlzIHBlbmRpbmcuIEJ1dCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBwcm94eSByZXNvbHV0aW9uLgotCQlwcm9jZXNzRXh0ZW5zaW9uUHJveGllcyhwcm94eWNvdW50LCBleHByZXNzaW9uUHJveGllcyk7Ci0JCXByb2Nlc3NFeHByZXNzaW9uRXJyb3IoKTsgCi0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBhcyBib3RoIGFuIEV4cHJlc3Npb25Qcm94eSAoaS5lLiBJREUgc2lkZSkgYW5kIHRoZSBFeHByZXNzaW9ucyBleHByZXNzaW9uIHByb3h5IHJlc3VsdCBvbiB0aGUgb3RoZXIgc2lkZS4KLQkgKiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBqdXN0IHVzZSBzYW1lIGluc3RhbmNlIG9uIGJvdGggc2lkZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJREVFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSB7Ci0JCQotCQlwcm90ZWN0ZWQgSURFRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBpbnQgcHJveHlUeXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIHByb3h5VHlwZSwgZXhwcmVzc2lvbik7Ci0JCX0KLQkJCi0JCXByaXZhdGUgT2JqZWN0IHZhbHVlOwotCQlwcml2YXRlIENsYXNzIHR5cGU7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXQ7Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSNkaXNwb3NlKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCQl0eXBlID0gbnVsbDsKLQkJCXNldCA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRUeXBlKCkKLQkJICovCi0JCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFZhbHVlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjc2V0UHJveHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJc2V0ID0gdHJ1ZTsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNpc1NldCgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1NldCgpIHsKLQkJCXJldHVybiBzZXQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIEV4cHJlc3Npb24gcHJveHkgZm9yIElERSBCZWFuVHlwZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIElERUV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkJcHJpdmF0ZSBJREVCZWFuVHlwZVByb3h5IHJlc29sdmVkUHJveHk7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBCRUFOVFlQRV9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCQkKLQkJLyoKLQkJICogIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVFeHByZXNzaW9uUHJveHkjc2V0VHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl9Ci0JCQotCQkvKgotCQkgKiAgKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldFR5cGVOYW1lKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpKyIgLSAiK2dldFR5cGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byByZXNvbHZlIHRoZSBiZWFudHlwZS4KLQkJICogQHBhcmFtIGJlYW50eXBlUHJveHkKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRQcm94eShJREVCZWFuVHlwZVByb3h5IGJlYW50eXBlUHJveHkpIHsKLQkJCXRoaXMucmVzb2x2ZWRQcm94eSA9IGJlYW50eXBlUHJveHk7Ci0JCQlzZXRQcm94eShyZXNvbHZlZFByb3h5LmdldFR5cGVDbGFzcygpLCBDbGFzcy5jbGFzcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byBnZXQgdGhlIHJlc29sdmVkIGJlYW50eXBlIHByb3h5LgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCUlERUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eSgpIHsKLQkJCXJldHVybiByZXNvbHZlZFByb3h5OwotCQl9Ci0KLQkJLyoKLQkJICogIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkJICovCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJCUlQcm94eU1ldGhvZCBtZXRob2QgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldE1ldGhvZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGdvIHRvIHRoZSBleHByZXNzaW9uIGFuZCBjcmVhdGUgaXQuCi0JCQkJbWV0aG9kID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVNZXRob2RFeHByZXNzaW9uUHJveHkodGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQkJfQotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkKLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIChJUHJveHlCZWFuVHlwZVtdKSBudWxsKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQkJSVByb3h5RmllbGQgZmllbGQgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEZpZWxkRXhwcmVzc2lvblByb3h5KHRoaXMsIGZpZWxkTmFtZSk7Ci0JCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCS8vIE5lZWQgdG8gZ28gdG8gdGhlIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBpdC4KLQkJCQlmaWVsZCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlRmllbGRFeHByZXNzaW9uUHJveHkodGhpcywgZmllbGROYW1lKTsKLQkJCX0KLQkJCXJldHVybiBmaWVsZDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgRXhwcmVzc2lvbiBwcm94eSBmb3IgSURFIEJlYW5UeXBlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElERU1ldGhvZEV4cHJlc3Npb25Qcm94eSBleHRlbmRzIElERUV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElQcm94eU1ldGhvZCB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotCQlwcml2YXRlIElERU1ldGhvZFByb3h5IHJlc29sdmVkUHJveHk7Ci0JCXByaXZhdGUgVGhyb3dhYmxlUHJveHkgZXJyb3JUaHJvd2FibGU7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBJREVNZXRob2RFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgTUVUSE9EX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0IGJ5IElERUV4cHJlc3Npb24gd2l0aCB0aGUgbWV0aG9kIG5hbWUuCi0JCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJfQotCQkJCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiIC0gIittZXRob2ROYW1lOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gcmVzb2x2ZSB0aGUgYmVhbnR5cGUuCi0JCSAqIEBwYXJhbSBtZXRob2RQcm94eQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldFByb3h5KElERU1ldGhvZFByb3h5IG1ldGhvZFByb3h5KSB7Ci0JCQl0aGlzLnJlc29sdmVkUHJveHkgPSBtZXRob2RQcm94eTsKLQkJCXNldFByb3h5KHJlc29sdmVkUHJveHkuZ2V0QmVhbigpLCBDbGFzcy5jbGFzcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byBzYXkgdGhlcmUgd2FzIGVycm9yIGluIGNyZWF0aW5nIHRoZSBwcm94eS4KLQkJICogQHBhcmFtIGVycm9yVGhyb3dhYmxlCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0VGhyb3dhYmxlKFRocm93YWJsZVByb3h5IGVycm9yVGhyb3dhYmxlKSB7Ci0JCQl0aGlzLmVycm9yVGhyb3dhYmxlID0gZXJyb3JUaHJvd2FibGU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byBnZXQgdGhlIHJlc29sdmVkIG1ldGhvZCBwcm94eS4KLQkJICogQHJldHVybgotCQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCUlERU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJCWlmIChlcnJvclRocm93YWJsZSAhPSBudWxsKQotCQkJCXRocm93IGVycm9yVGhyb3dhYmxlOwotCQkJcmV0dXJuIHJlc29sdmVkUHJveHk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJREVGaWVsZEV4cHJlc3Npb25Qcm94eSBleHRlbmRzIElERUV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElQcm94eUZpZWxkIHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZTsKLQkJcHJpdmF0ZSBJREVGaWVsZFByb3h5IHJlc29sdmVkUHJveHk7Ci0JCXByaXZhdGUgVGhyb3dhYmxlUHJveHkgZXJyb3JUaHJvd2FibGU7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBJREVGaWVsZEV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBGSUVMRF9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldCBieSBJREVFeHByZXNzaW9uIHdpdGggdGhlIG1ldGhvZCBuYW1lLgotCQkgKiBAcGFyYW0gZmllbGROYW1lCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQkJdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCX0KLQkJCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIiAtICIrZmllbGROYW1lOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gcmVzb2x2ZSB0aGUgYmVhbnR5cGUuCi0JCSAqIEBwYXJhbSBmaWVsZFByb3h5Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0UHJveHkoSURFRmllbGRQcm94eSBmaWVsZFByb3h5KSB7Ci0JCQl0aGlzLnJlc29sdmVkUHJveHkgPSBmaWVsZFByb3h5OwotCQkJc2V0UHJveHkocmVzb2x2ZWRQcm94eS5nZXRCZWFuKCksIENsYXNzLmNsYXNzKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIHNheSB0aGVyZSB3YXMgZXJyb3IgaW4gY3JlYXRpbmcgdGhlIHByb3h5LgotCQkgKiBAcGFyYW0gZXJyb3JUaHJvd2FibGUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRUaHJvd2FibGUoVGhyb3dhYmxlUHJveHkgZXJyb3JUaHJvd2FibGUpIHsKLQkJCXRoaXMuZXJyb3JUaHJvd2FibGUgPSBlcnJvclRocm93YWJsZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIGdldCB0aGUgcmVzb2x2ZWQgZmllbGQgcHJveHkuCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlJREVGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkJaWYgKGVycm9yVGhyb3dhYmxlICE9IG51bGwpCi0JCQkJdGhyb3cgZXJyb3JUaHJvd2FibGU7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRQcm94eTsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI2NyZWF0ZUV4cHJlc3Npb25Qcm94eShpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvblByb3h5IGNyZWF0ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlUeXBlLCBpbnQgcHJveHlJRCkgewotCQlzd2l0Y2ggKHByb3h5VHlwZSkgewotCQkJY2FzZSBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5ldyBJREVFeHByZXNzaW9uUHJveHkocHJveHlJRCwgTk9STUFMX0VYUFJFU1NJT05fUFJPWFksIHRoaXMpOwotCQkJCi0JCQljYXNlIEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJCQkKLQkJCWNhc2UgTUVUSE9EX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBJREVNZXRob2RFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCQkJCi0JCQljYXNlIEZJRUxEX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQkJcmV0dXJuIG5ldyBJREVGaWVsZEV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJfQotCQkKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXNzaWdubWVudFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJZXByb2MucHVzaEFzc2lnbm1lbnQoKEludGVybmFsRXhwcmVzc2lvblByb3h5KSBwcm94eSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFzc2lnbm1lbnRUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXNzaWdubWVudFRvUHJveHkoKSB7Ci0JCWVwcm9jLnB1c2hBc3NpZ25tZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tCZWdpblRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0JlZ2luVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJZXByb2MucHVzaEJsb2NrQmVnaW4oYmxvY2tOdW1iZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0VuZFRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0VuZFRvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hCbG9ja0VuZChibG9ja051bWJlcik7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tCcmVha1RvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hCbG9ja0JyZWFrKGJsb2NrTnVtYmVyKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5QmVnaW5Ub1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5QmVnaW5Ub1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJZXByb2MucHVzaFRyeUJlZ2luKHRyeU51bWJlcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KGludCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KGludCB0cnlOdW1iZXIsIElQcm94eUJlYW5UeXBlIGV4Y2VwdGlvblR5cGUsIEV4cHJlc3Npb25Qcm94eSBlcCkgewotCQl0cnkgewotCQkJZXByb2MucHVzaFRyeUNhdGNoQ2xhdXNlKHRyeU51bWJlciwgZ2V0SURFQmVhblR5cGVQcm94eShleGNlcHRpb25UeXBlKS5nZXRUeXBlQ2xhc3MoKSwgKEludGVybmFsRXhwcmVzc2lvblByb3h5KSBlcCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5RmluYWxseUNsYXVzZVRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlGaW5hbGx5Q2xhdXNlVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hUcnlGaW5hbGx5Q2xhdXNlKHRyeU51bWJlcik7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUVuZFRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlFbmRUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJZXByb2MucHVzaFRyeUVuZCh0cnlOdW1iZXIpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUaHJvd1RvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUaHJvd1RvUHJveHkoKSB7Ci0JCWVwcm9jLnB1c2hUaHJvd0V4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFJldGhyb3dUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoUmV0aHJvd1RvUHJveHkoaW50IHRyeU51bWJlcikgewotCQllcHJvYy5wdXNoVHJ5UmV0aHJvdyh0cnlOdW1iZXIpOwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCZWFuVHlwZVRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCZWFuVHlwZVRvUHJveHkoSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCXRyeSB7Ci0JCQlJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBlcCA9IChJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkgcHJveHk7Ci0JCQlJREVCZWFuVHlwZVByb3h5IHR5cGVQcm94eSA9IGdldElERUJlYW5UeXBlUHJveHkocHJveHkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQllcC5zZXRQcm94eSh0eXBlUHJveHkpOwotCQkJZXByb2MuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoZXApOwotCQkJaWYgKCF0eXBlUHJveHkuaXNWYWxpZCgpKSB7Ci0JCQkJVGhyb3dhYmxlIGNhdXNlID0gKChJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KSB0eXBlUHJveHkpLmdldENhdXNlKCk7Ci0JCQkJaWYgKGNhdXNlID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eSgKLQkJCQkJCQluZXcgRXhjZXB0aW9uKHR5cGVQcm94eS5nZXRJbml0aWFsaXphdGlvbkVycm9yKCkpLAotCQkJCQkJCWdldElERUJlYW5UeXBlRmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoRXhjZXB0aW9uLmNsYXNzKSk7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoCi0JCQkJCQkJY2F1c2UsCi0JCQkJCQkJZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShjYXVzZS5nZXRDbGFzcygpKSk7Ci0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiBJUHJveHlCZWFuVHlwZXMgZm9yIGEgYmVhbnR5cGUgbmFtZS4gTWVhbnQgdG8gYmUgdXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggSURFU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgSURERVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5IGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lKSB7Ci0JCWlmIChiZWFuVHlwZUNhY2hlID09IG51bGwpCi0JCQliZWFuVHlwZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIChJUHJveHlCZWFuVHlwZSkgYmVhblR5cGVDYWNoZS5nZXQoYmVhblR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IHRvIHRoZSBtYXAgb2YgYmVhbiB0eXBlIGV4cHJlc3Npb24gcHJveGllcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIElERVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIElERVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5IGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGJlYW5UeXBlTmFtZQotCSAqIEBwYXJhbSBiZWFudHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUsIElQcm94eUJlYW5UeXBlIGJlYW50eXBlKSB7Ci0JCWJlYW5UeXBlQ2FjaGUucHV0KGJlYW5UeXBlTmFtZSwgYmVhbnR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGJlYW50eXBlIGV4cHJlc3Npb24gcHJveHkgZnJvbSB0aGUgbWFwLiBUaGlzIGlzIGNhbGxlZCBiZWNhdXNlIHRoZXJlIHdhcyBhIHJvbGxiYWNrIGR1ZSB0byBhbiBlbmRtYXJrLgotCSAqIEBwYXJhbSBiZWFuVHlwZU5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lKSB7Ci0JCWJlYW5UeXBlQ2FjaGUucmVtb3ZlKGJlYW5UeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogS2VlcGluZyBhIGxvY2FsIG1hcCBvZiBNZXRob2QgRXhwcmVzc2lvbiBQcm94aWVzIHNvIHRoYXQgd2UgZG9uJ3Qga2VlcCByZWNyZWF0aW5nIHRoZW0gZm9yIGVhY2ggcmVxdWVzdCBmcm9tIHdpdGhpbiB0aGlzIGV4cHJlc3Npb24uCi0JICogVGhlIG1hcCB3aWxsIGJlOiAgZGVjbGFyaW5nVHlwZU5hbWUtPihNYXApIG1ldGhvZE5hbWUgb3IgSURFTWV0aG9kS2V5IC0+IG1ldGhvZCBleHByZXNzaW9uIHByb3h5LiAKLQkgKiBAc2VlIElERUV4cHJlc3Npb24jcHVzaE1ldGhvZFRvUHJveHkoRXhwcmVzc2lvblByb3h5LCBJUHJveHlCZWFuVHlwZSwgU3RyaW5nLCBJUHJveHlCZWFuVHlwZVtdKSBmb3IgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gCi0JICovCi0JcHJvdGVjdGVkIE1hcCBtZXRob2RFeHByZXNzaW9uUHJveGllczsKLQkKLQkvKioKLQkgKiBLZWVwaW5nIGEgbG9jYWwgbWFwIG9mIEZpZWxkIEV4cHJlc3Npb24gUHJveGllcyBzbyB0aGF0IHdlIGRvbid0IGtlZXAgcmVjcmVhdGluZyB0aGVtIGZvciBlYWNoIHJlcXVlc3QgZnJvbSB3aXRoaW4gdGhpcyBleHByZXNzaW9uLgotCSAqIFRoZSBtYXAgd2lsbCBiZTogIGRlY2xhcmluZ1R5cGVOYW1lLT4oTWFwKSBmaWVsZG5hbWUgLT4gZmllbGQgZXhwcmVzc2lvbiBwcm94eS4gCi0JICogQHNlZSBJREVFeHByZXNzaW9uI3B1c2hGaWVsZFRvUHJveHkoRXhwcmVzc2lvblByb3h5LCBJUHJveHlCZWFuVHlwZSwgU3RyaW5nKSAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGZpZWxkRXhwcmVzc2lvblByb3hpZXM7Ci0JCi0JLyoqCi0JICogS2VlcGluZyBhIGxvY2FsIG1hcCBvZiBCZWFuVHlwZSBleHByZXNzaW9uIHByb3hpZXMgc28gdGhhdCB3ZSBkb24ndCBrZWVwIHJlY3JlYXRpbmcgdGhlbSBmb3IgZWFjaCByZXF1ZXN0IGZyb20gd2l0aGluIHRoaXMgZXhwcmVzc2lvbi4KLQkgKiBUaGUgbWFwIHdpbGwgYmU6IHR5cGVuYW1lLT5iZWFuVHlwZUV4cHJlc3Npb25Qcm94eQotCSAqLwotCXByb3RlY3RlZCBNYXAgYmVhblR5cGVDYWNoZTsJLy8gVXNlIHRvIGNhY2hlIHBlbmRpbmcgQmVhblR5cGVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggSURFU3RhbmRhcmRCZWFuVHlwZUZhY3RvcnkuCi0KLQkvKgotCSAqIFVzZWQgYXMgdGhlIGtleSB0byB0aGUgbWV0aG9kQ2FjaGUgd2hlbiB0aGVyZSBhcmUgcGFybXMuCi0JICogSXQgYWxsb3dzIHRoZSBwYXJtcyB0byBiZSBlaXRoZXIgSVByb3h5QmVhblR5cGUgd2l0aG91dCB0aGUKLQkgKiBvdmVyaGVhZCBvZiBjcmVhdGluZyBjb21wbGljYXRlZCBzdHJpbmdzLgotCSAqIAotCSAqIEl0IHdpbGwgY29tcGFyZSBtZXRob2QgbmFtZSBhbmQgZWFjaCBpbmRpdmlkdWFsIHBhcm0gbmFtZSB3aXRob3V0IGZsdWZmaW5nCi0JICogdXAgYSBzdHJpbmcgYW5kIGJ1aWxkaW5nIGl0IHVwLgotCSAqIAotCSAqIEZvciBubyBwYXJtIG1ldGhvZHMsIGp1c3QgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBhcyBhIHN0cmluZyB3aWxsIGJlIHRoZSBrZXkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5IHsKLQkJcHVibGljIFN0cmluZyBtZXRob2ROYW1lOwotCQlwdWJsaWMgSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXM7Ci0JCXB1YmxpYyBNZXRob2RLZXkoU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzKSB7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQkJdGhpcy5wYXJtVHlwZXMgPSBwYXJtVHlwZXM7Ci0JCX0KLQkJCQkKLQkJCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChNZXRob2RLZXkpIG9iaikuY29tcGFyZVBhcm1zKHBhcm1UeXBlcyk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2hhc2hDb2RlKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpbnQgaCA9IG1ldGhvZE5hbWUuaGFzaENvZGUoKTs7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWggKz0gcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBoOwotCQl9Ci0JCQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNjb21wYXJlUGFybXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZVBhcm1zKElQcm94eUJlYW5UeXBlW10gcGFybXMpIHsKLQkJCWlmIChwYXJtcy5sZW5ndGggIT0gcGFybVR5cGVzLmxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFwYXJtVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKS5lcXVhbHMocGFybXNbaV0uZ2V0VHlwZU5hbWUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9CQkKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hNZXRob2RUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1ldGhvZFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5LCBJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJZmluYWwgTWFwIG1ldGhvZHMgPSBnZXRNZXRob2RzKGRlY2xhcmluZ1R5cGUpOwotCQkJZmluYWwgT2JqZWN0IGtleSA9IGdldE1ldGhvZEtleShtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7IAotCQkJbWV0aG9kcy5wdXQoa2V5LCBwcm94eSk7Ci0JCQlwcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW1ldGhvZHMucmVtb3ZlKGtleSk7CS8vIEJhY2sgaXQgb3V0LiB0aXMgY291bGQgaGFwcGVuIGR1ZSB0byBlbmRtYXJrIHJvbGxiYWNrLgotCQkJCX0KLQkJCQotCQkJfSk7Ci0JCQkKLQkJCUlERU1ldGhvZEV4cHJlc3Npb25Qcm94eSBlcCA9IChJREVNZXRob2RFeHByZXNzaW9uUHJveHkpIHByb3h5OwotCQkJZXAuc2V0TWV0aG9kTmFtZShtZXRob2ROYW1lKTsKLQkJCS8vIFdlIHJlc29sdmUgaW1tZWRpYXRlbHkuIEFueSBleHByZXNzaW9uIHByb3hpZXMgc2hvdWxkIGFsc28gYmUgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludCB0b28uCi0JCQlDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IGdldElERUJlYW5UeXBlUHJveHkoZGVjbGFyaW5nVHlwZSkuZ2V0VHlwZUNsYXNzKCk7Ci0JCQlDbGFzc1tdIHBhcmFtZXRlckNsYXNzZXM7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkKLQkJCQlwYXJhbWV0ZXJDbGFzc2VzID0gbnVsbDsKLQkJCWVsc2UgewotCQkJCXBhcmFtZXRlckNsYXNzZXMgPSBuZXcgQ2xhc3NbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcGFyYW1ldGVyQ2xhc3Nlc1tpXSA9IGdldElERUJlYW5UeXBlUHJveHkocGFyYW1ldGVyVHlwZXNbaV0pLmdldFR5cGVDbGFzcygpOwotCQkJCX0KLQkJCX0KLQkJCUlERU1ldGhvZFByb3h5IG1ldGhvZFByb3h5ID0gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShkZWNsYXJpbmdDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyQ2xhc3Nlcyk7Ci0JCQlpZiAobWV0aG9kUHJveHkgPT0gbnVsbCkgewotCQkJCVN0cmluZyBwYXJtcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwgJiYgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID4gMCkgewotCQkJCQlTdHJpbmdCdWZmZXIgc3QgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCXN0LmFwcGVuZCgnLCcpOwotCQkJCQkJc3QuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldFR5cGVOYW1lKCkpOwotCQkJCQl9Ci0JCQkJCXBhcm1zID0gc3QudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oIk5vIG1ldGhvZDogIitkZWNsYXJpbmdUeXBlKycuJyttZXRob2ROYW1lKyIoIitwYXJtcysnKScpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpKTsKLQkJCX0KLQkJCQotCQkJZXAuc2V0UHJveHkobWV0aG9kUHJveHkpOwotCQkJZXByb2MuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoZXApOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkoKElERU1ldGhvZEV4cHJlc3Npb25Qcm94eSkgcHJveHkpLnNldFRocm93YWJsZShlKTsJLy8gU28gd2UgZG9uJ3QgcmVjcmVhdGUgdGhyb3dhYmxlIGFsbCBvZiB0aGUgdGltZS4KLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIE1hcCBnZXRNZXRob2RzKElQcm94eUJlYW5UeXBlIGNsYXNzdHlwZSkgewotCQlpZiAobWV0aG9kRXhwcmVzc2lvblByb3hpZXMgPT0gbnVsbCkKLQkJCW1ldGhvZEV4cHJlc3Npb25Qcm94aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIG1ldGhvZHMgPSAoTWFwKSBtZXRob2RFeHByZXNzaW9uUHJveGllcy5nZXQoY2xhc3N0eXBlLmdldFR5cGVOYW1lKCkpOwotCQlpZiAobWV0aG9kcyA9PSBudWxsKQotCQkJbWV0aG9kRXhwcmVzc2lvblByb3hpZXMucHV0KGNsYXNzdHlwZS5nZXRUeXBlTmFtZSgpLCBtZXRob2RzID0gbmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRNZXRob2RLZXkoU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbWV0aG9kTmFtZTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBNZXRob2RLZXkobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQlwcml2YXRlIE1hcCBnZXRGaWVsZHMoSVByb3h5QmVhblR5cGUgY2xhc3N0eXBlKSB7Ci0JCWlmIChmaWVsZEV4cHJlc3Npb25Qcm94aWVzID09IG51bGwpCi0JCQlmaWVsZEV4cHJlc3Npb25Qcm94aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGZpZWxkcyA9IChNYXApIGZpZWxkRXhwcmVzc2lvblByb3hpZXMuZ2V0KGNsYXNzdHlwZS5nZXRUeXBlTmFtZSgpKTsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKQotCQkJZmllbGRFeHByZXNzaW9uUHJveGllcy5wdXQoY2xhc3N0eXBlLmdldFR5cGVOYW1lKCksIGZpZWxkcyA9IG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gZmllbGRzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgYnkgSURFQmVhblR5cGVzIGFuZCBJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSB0byBhY2Nlc3MgYW55IGFscmVhZHkgY3JlYXRlZCBNZXRob2QgRXhwcmVzc2lvbiBQcm94aWVzLgotCSAqIAotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuIElQcm94eU1ldGhvZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgeWV0IGNyZWF0ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JSVByb3h5TWV0aG9kIGdldE1ldGhvZEV4cHJlc3Npb25Qcm94eShJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlNYXAgbWV0aG9kcyA9IGdldE1ldGhvZHMoZGVjbGFyaW5nVHlwZSk7Ci0JCU9iamVjdCBrZXkgPSBnZXRNZXRob2RLZXkobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOyAKLQkJcmV0dXJuIChJUHJveHlNZXRob2QpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSBJREVCZWFuVHlwZXMgYW5kIElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHRvIGFjY2VzcyBhbnkgYWxyZWFkeSBjcmVhdGVkIEZpZWxkIEV4cHJlc3Npb24gUHJveGllcy4KLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JSVByb3h5RmllbGQgZ2V0RmllbGRFeHByZXNzaW9uUHJveHkoSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlNYXAgZmllbGRzID0gZ2V0RmllbGRzKGRlY2xhcmluZ1R5cGUpOwotCQlyZXR1cm4gKElQcm94eUZpZWxkKSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgSURFTWV0aG9kUHJveHkgb3V0IG9mIHRoZSBhbHJlYWR5IHJlc29sdmVkIEV4cHJlc3Npb24gUHJveHkgb3IgSURFTWV0aG9kUHJveHkgaXRzZWxmLgotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJREVNZXRob2RQcm94eSBnZXRJREVNZXRob2RQcm94eShJUHJveHlNZXRob2QgbWV0aG9kKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJREVNZXRob2RQcm94eSBtZXRob2RQcm94eTsKLQkJaWYgKG1ldGhvZC5pc0V4cHJlc3Npb25Qcm94eSgpKSB7Ci0JCQkvLyBJdCBzaG91bGQgYWxyZWFkeSBiZSByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgotCQkJbWV0aG9kUHJveHkgPSAoKElERU1ldGhvZEV4cHJlc3Npb25Qcm94eSkgbWV0aG9kKS5nZXRNZXRob2RQcm94eSgpOwotCQl9IGVsc2UKLQkJCW1ldGhvZFByb3h5ID0gKElERU1ldGhvZFByb3h5KSBtZXRob2Q7Ci0JCXJldHVybiBtZXRob2RQcm94eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hGaWVsZFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRmllbGRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSwgSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgewotCi0JCXRyeSB7Ci0JCQlmaW5hbCBNYXAgZmllbGRzID0gZ2V0RmllbGRzKGRlY2xhcmluZ1R5cGUpOwotCQkJZmllbGRzLnB1dChmaWVsZE5hbWUsIHByb3h5KTsKLQkJCXByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKXsKLQkJCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKEV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWZpZWxkcy5yZW1vdmUoZmllbGROYW1lKTsJLy8gdGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBhbiBlbmRtYXJrLiBJdCBjb3VsZCBiZSBvbmUgb2YgdGhlIG9uZXMgdGhhdCBhcmUgcm9sbGVkIGJhY2suCi0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCQotCQkJSURFRmllbGRFeHByZXNzaW9uUHJveHkgZXAgPSAoSURFRmllbGRFeHByZXNzaW9uUHJveHkpIHByb3h5OwotCQkJLy8gV2UgcmVzb2x2ZSBpbW1lZGlhdGVseS4gQW55IGV4cHJlc3Npb24gcHJveGllcyBzaG91bGQgYWxzbyBiZSByZXNvbHZlZCBhdCB0aGlzIHBvaW50IHRvby4KLQkJCUlERUZpZWxkUHJveHkgZmllbGRQcm94eSA9IChJREVGaWVsZFByb3h5KSBnZXRJREVCZWFuVHlwZVByb3h5KGRlY2xhcmluZ1R5cGUpLmdldEZpZWxkUHJveHkoZmllbGROYW1lKTsKLQkJCWlmIChmaWVsZFByb3h5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShuZXcgTm9TdWNoRmllbGRFeGNlcHRpb24oIk5vIGZpZWxkOiAiK2RlY2xhcmluZ1R5cGUrJy4nK2ZpZWxkTmFtZSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0SURFQmVhblR5cGVGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShOb1N1Y2hGaWVsZEV4Y2VwdGlvbi5jbGFzcykpOwotCQkJfQotCQkJCi0JCQllcC5zZXRQcm94eShmaWVsZFByb3h5KTsKLQkJCWVwcm9jLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KGVwKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJKChJREVGaWVsZEV4cHJlc3Npb25Qcm94eSkgcHJveHkpLnNldFRocm93YWJsZShlKTsJLy8gU28gd2UgZG9uJ3QgcmVjcmVhdGUgdGhyb3dhYmxlIGFsbCBvZiB0aGUgdGltZS4KLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0JCQotCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgSURFRmllbGRQcm94eSBvdXQgb2YgdGhlIGFscmVhZHkgcmVzb2x2ZWQgRXhwcmVzc2lvbiBQcm94eSBvciBJREVGaWVsZFByb3h5IGl0c2VsZi4KLQkgKiBAcGFyYW0gZmllbGQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBJREVGaWVsZFByb3h5IGdldElERUZpZWxkUHJveHkoSVByb3h5RmllbGQgZmllbGQpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlERUZpZWxkUHJveHkgZmllbGRQcm94eTsKLQkJaWYgKGZpZWxkLmlzRXhwcmVzc2lvblByb3h5KCkpIHsKLQkJCS8vIEl0IHNob3VsZCBhbHJlYWR5IGJlIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCi0JCQlmaWVsZFByb3h5ID0gKChJREVGaWVsZEV4cHJlc3Npb25Qcm94eSkgZmllbGQpLmdldEZpZWxkUHJveHkoKTsKLQkJfSBlbHNlCi0JCQlmaWVsZFByb3h5ID0gKElERUZpZWxkUHJveHkpIGZpZWxkOwotCQlyZXR1cm4gZmllbGRQcm94eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJZlRlc3RUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSWZUZXN0VG9Qcm94eSgpIHsKLQkJZXByb2MucHVzaElmRWxzZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaElmRWxzZVRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJZkVsc2VUb1Byb3h5KEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUgY2xhdXNlVHlwZSkgewotCQllcHJvYy5wdXNoSWZFbHNlKGNsYXVzZVR5cGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE5ld0luc3RhbmNlVG9Qcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTmV3SW5zdGFuY2VUb1Byb3h5KFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgSVByb3h5QmVhblR5cGUgcmVzdWx0VHlwZSkgewotCQl0cnkgewotCQkJZXByb2MucHVzaE5ld0luc3RhbmNlRnJvbVN0cmluZyhpbml0aWFsaXphdGlvblN0cmluZywgZ2V0SURFQmVhblR5cGVQcm94eShyZXN1bHRUeXBlKS5nZXRUeXBlQ2xhc3MoKSwgZ2V0SURFUmVnaXN0cnkoKS5mQ2xhc3NMb2FkZXIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1hcmtUb1Byb3h5KGludCBtYXJrSUQpIHsKLQkJZXByb2MucHVzaE1hcmsobWFya0lEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRW5kbWFya1RvUHJveHkoaW50IG1hcmtJRCwgYm9vbGVhbiByZXN0b3JlKSB7Ci0JCWVwcm9jLnB1c2hFbmRtYXJrKG1hcmtJRCwgcmVzdG9yZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJlZ2luVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCkgewotCQkvLyBGb3IgSURFIGl0IGRvZXNuJ3QgbWF0dGVyLiBKdXN0IGdvIGFoZWFkIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nLgotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hUcmFuc2ZlclRocmVhZFRvUHJveHkoKSB7Ci0JCS8vIEZvciBJREUgaXQgZG9lc24ndCBtYXR0ZXIuIEp1c3QgZ28gYWhlYWQgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25CZWdpblRvUHJveHkoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJZXByb2MucHVzaFN1YmV4cHJlc3Npb25CZWdpbihzdWJleHByZXNzaW9uTnVtYmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkVuZFRvUHJveHkoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJZXByb2MucHVzaFN1YmV4cHJlc3Npb25FbmQoc3ViZXhwcmVzc2lvbk51bWJlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiMjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKTsKLQotcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSk7CQotCi1wdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIElFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA4MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBJRmllbGRQcm94eSB3aGVyZSB0aGUgYmVhbiB2bSBpcyB0aGUgc2FtZSBhcyB0aGUgSURFCi0gKiBUaGVyZWZvcmUgd2UgaG9sZCB0aGUgaW5zdGFuY2Ugb2YgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBpbiBhIGZpZWxkCi0gKiBkaXJlY3RseSBhbmQgaGF2ZSBhIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRvIHNldCB0aGlzCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxMjozMjoyNCBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVGaWVsZFByb3h5IGV4dGVuZHMgSURFQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSUZpZWxkUHJveHkgewotCXByb3RlY3RlZCBJQmVhblR5cGVQcm94eSBmRmllbGRUeXBlOwotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIGZpZWxkIGRpcmVjdGx5Ci0JICogVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG9ubHkgY2xhc3NlcyBpbiB0aGUgSURFIHBhY2thZ2UgY2FuIGNvbnN0cnVjdAotCSAqIHRoaXMuICBFdmVyeW9uZSBlbHNlIG11c3QgZ28gdmlhIHRoZSB0eXBlUHJveHkKLQkgKi8KLQlJREVGaWVsZFByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgRmllbGQgYUZpZWxkKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUZpZWxkKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYW5kIHJldHVybiBpdCB3cmFwcGVkIGluIGEgYmVhbiBwcm94eQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChJQmVhblByb3h5IGFTdWJqZWN0KSB7Ci0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCS8vIEdldCB0aGUgZmllbGQgdmFsdWUgYW5kIGNhdGNoIGFueSBlcnJvcnMJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoKEZpZWxkKSBnZXRCZWFuKCkpLmdldChhU3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBhU3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJZiB3ZSBoYXZlIGEgbm9uIG51bGwgcmVzdWx0IHdyYXAgaXQgaW4gYW4gSUJlYW5Qcm94eSBhbmQgcmV0dXJuIGl0Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHkoKChGaWVsZCkgZ2V0QmVhbigpKS5nZXRUeXBlKCksIHJlc3VsdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnMgZnJvbSBib3RoIG9mIHRoZSBwcm94aWVzIGFuZCBpbnZva2UgdGhlIGZpZWxkIHNldCBtZXRob2QKLQkgKiBDYXN0IHRvIElERUJlYW5Qcm94eSBhbmQgdXNlIHBhY2thZ2UgcHJvdGVjdGVkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IGFTdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB7Ci0KLQkJLy8gU2V0IHRoZSBmaWVsZCB2YWx1ZSBhbmQgY2F0Y2ggYW55IGVycm9ycwkKLQkJdHJ5IHsKLQkJCSgoRmllbGQpIGdldEJlYW4oKSkuc2V0KAotCQkJCWFTdWJqZWN0ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFTdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLAotCQkJCWFyZ3VtZW50ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFyZ3VtZW50KS5nZXRCZWFuKCkgOiBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKioKLQkgKiBUaGUgdHlwZSBwcm94eSBpcyBjb25zdGFudCBwcm94eSBvdXQgb2YgdGhlIG1ldGhvZCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5maWVsZFR5cGU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpZWxkVHlwZSgpIHsKLQkJaWYgKGZGaWVsZFR5cGUgPT0gbnVsbCkgewotCQkJZkZpZWxkVHlwZSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCQkJKChGaWVsZCkgZ2V0QmVhbigpKS5nZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBmRmllbGRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MmYxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZpZWxkVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIElERUZpZWxkVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0JSURFRmllbGRUeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJc3VwZXIocmVnaXN0cnksIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBJREVGaWVsZFByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKSBhbk9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRlNThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBGbG9hdCBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQotcHJvdGVjdGVkIElERUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBGbG9hdCgwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUZsb2F0QmVhblByb3h5KEZsb2F0IGFGbG9hdCl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFGbG9hdCx0aGlzKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkYmUzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEZsb2F0IEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci1wcm90ZWN0ZWQgSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRmxvYXRCZWFuUHJveHkoZmxvYXQgYUZsb2F0KXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IEZsb2F0KGFGbG9hdCksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBGTE9BVDsKLX0KLQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBGbG9hdCgoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpKSA6IChOdW1iZXIpIGFuT2JqZWN0OwotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci0KLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEzMzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YKLSAqIHR5cGUgY29tbWVudHMgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc25hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxpemF0aW9uRXJyb3I7Ci0JCi0JcHJvdGVjdGVkIFRocm93YWJsZSBjYXVzZTsKLQotCXByb3RlY3RlZCBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgY2xhc3NuYW1lLCBTdHJpbmcgaW5pdGlhbGl6YXRpb25FcnJvciwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCBudWxsKTsKLQkJdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0JCXRoaXMuaW5pdGlhbGl6YXRpb25FcnJvciA9IGluaXRpYWxpemF0aW9uRXJyb3I7Ci0JCXRoaXMuY2F1c2UgPSBjYXVzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRocm93YWJsZSAoY2F1c2UpIHRoYXQgbWFkZSB0aGlzIGJlYW4gdHlwZSBiYWQuIAotCSAqIEByZXR1cm4gdGhlIFRocm93YWJsZSB0aGF0IHdhcyB0aGUgY2F1c2UsIG9yIG51bGwgaWYgbm90IGNhdXNlZCBieSBhbiB0aHJvd2FibGUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRDYXVzZSgpIHsKLQkJcmV0dXJuIGNhdXNlOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRGaWVsZFByb3h5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXRNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nLCBTdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRDbGFzc05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcsIElCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nLCBTdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZywgSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE51bGxDb25zdHJ1Y3RvclByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNBcnJheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNJbnRlcmZhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzS2luZE9mKElCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzS2luZE9mKElCZWFuVHlwZVByb3h5IGFCZWFuUHJveHlUeXBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNuZXdJbnN0YW5jZShTdHJpbmcpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6YXRpb25FcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjdG9CZWFuU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTNhNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBJREUgUHJveHkgZm9yIEludGVnZXJzLiBTaW5jZSBJbnRlZ2VycyB3ZXJlIGZpcnN0IGltcGxlbWVudGVkCi0gKiBpbiB0aGUgVkNFLCBhbmQgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiByZWZlcmVuY2VkLCB3ZSd2ZSBjcmVhdGVkCi0gKiBhIHN1YmNsYXNzIHRvIGhhbmRsZSB0aGVtLiBUaGF0IHdheSB3ZSB3b3VsZG4ndCBuZWVkIHRvIGNoYW5nZQotICogZXZlcnlvbmUgdGhhdCB3YXMgdXNpbmcgdGhlIElJbnRlZ2VyUHJveHkgaW50ZXJmYWNlIGFuZCB3ZQotICogY2FuIHN0b3JlIHRoZSBpbnQgdmFsdWUgdG8gc3BlZWQgdXAgYWNjZXNzLgotICovCi1wdWJsaWMgY2xhc3MgSURFSW50ZWdlckJlYW5Qcm94eSBleHRlbmRzIElERU51bWJlckJlYW5Qcm94eSBpbXBsZW1lbnRzIElJbnRlZ2VyQmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgaW50IGZJbnRWYWx1ZTsKLUlERUludGVnZXJCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBOdW1iZXIgYW5JbnRlZ2VyLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYW5JbnRlZ2VyICwgYUJlYW5UeXBlUHJveHkpOwotCWZJbnRWYWx1ZSA9IGFuSW50ZWdlci5pbnRWYWx1ZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGludCB2YWx1ZQotICovCi1wdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiBmSW50VmFsdWU7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUxOGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklJbnRlZ2VyQmVhblByb3h5OwotCi0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJSW50ZWdlckJlYW5UeXBlUHJveHkKLSAqLwotZmluYWwgY2xhc3MgSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHplcm9JbnRQcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgb25lSW50UHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHR3b0ludFByb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB0aHJlZUludFByb3h5OwotSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgSW50ZWdlcigwKSk7Ci0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb0ludFByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigwKSwgdGhpcyApOwkKLQlvbmVJbnRQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMSksIHRoaXMgKTsKLQl0d29JbnRQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMiksIHRoaXMgKTsKLQl0aHJlZUludFByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigzKSwgdGhpcyApOwotCQkKLX0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSUludGVnZXJCZWFuUHJveHkgY3JlYXRlSW50ZWdlckJlYW5Qcm94eShJbnRlZ2VyIGFuSW50ZWdlcikgewotCXN3aXRjaChhbkludGVnZXIuaW50VmFsdWUoKSl7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9JbnRQcm94eSA7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZUludFByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvSW50UHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZUludFByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhbkludGVnZXIsdGhpcyk7Ci0JfQotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gKElJREVCZWFuUHJveHkpY3JlYXRlSW50ZWdlckJlYW5Qcm94eSgoSW50ZWdlcilhbk9iamVjdCk7Ci0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTNkZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JSW50ZWdlckJlYW5Qcm94eTsKLQotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuVHlwZVByb3h5Ci0gKi8KLWZpbmFsIGNsYXNzIElERUludGVnZXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMCksIHRoaXMgKTsKLQlvbmVQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMSksIHRoaXMgKTsKLQl0d29Qcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMiksIHRoaXMgKTsKLQl0aHJlZVByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigzKSwgdGhpcyApOwotCQkKLX0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSUludGVnZXJCZWFuUHJveHkgY3JlYXRlSW50ZWdlckJlYW5Qcm94eShpbnQgYW5JbnQpIHsKLQlzd2l0Y2goYW5JbnQpewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHkgOwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IEludGVnZXIoYW5JbnQpLHRoaXMpOwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUludGVnZXJCZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0Jc3dpdGNoKG4uaW50VmFsdWUoKSl7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eSA7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci0JfQotCQotCQotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gSU5URUdFUjsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlZjEyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIExvbmcgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQkJCi1wcm90ZWN0ZWQgSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgTG9uZygwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUxvbmdCZWFuUHJveHkoTG9uZyBhTG9uZyl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFMb25nLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFkMTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogTG9uZyBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0JCi1wcm90ZWN0ZWQgSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVMb25nQmVhblByb3h5KGxvbmcgYUxvbmcpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgTG9uZyhhTG9uZyksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBMT05HOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IExvbmcoKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWQzMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFTWV0aG9kUHJveHkgZXh0ZW5kcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJTWV0aG9kUHJveHkgewotCi0JcHJvdGVjdGVkIElERU1ldGhvZFByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTWV0aG9kIGFNZXRob2QpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhTWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0Q2xhc3NUeXBlKCkgewotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCSgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCX0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0UmV0dXJuVHlwZSgpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXRSZXR1cm5UeXBlKCkpOwotCX0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJQ2xhc3NbXSBwYXJtQ2xhc3NlcyA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCUlCZWFuVHlwZVByb3h5W10gcGFybVR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W3Bhcm1DbGFzc2VzLmxlbmd0aF07Ci0JCUlERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJcGFybVR5cGVzW2ldID0gZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcm1DbGFzc2VzW2ldKTsKLQkJfQotCQlyZXR1cm4gcGFybVR5cGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkubWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBkaXJlY3RseS4gIEJlY2F1c2Ugd2UgYXJlIGFuIElERU1ldGhvZFByb3h5IHdlIGNhbiBhc3N1bWUgdGhhdCBJQmVhblByb3h5Ci0JICogaXMgYW4gSURFQmVhblByb3h5IGFuZCB3ZSBjYW4gZ2V0IGl0cyBiZWFuIGRpcmVjdGx5Ci0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2Uoc3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBzdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLCBuZXcgT2JqZWN0WzBdKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcmVzdWx0IG1heSBiZSBhIGphdmEubGFuZy5JbnRlZ2VyIHdoZW4gd2UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIGFuIGludAotCQkJCS8vIFJlZmxlY3Rpb24gYWx3YXlzIGdpdmUgeW91IHRoZSBiaWcgb2JqZWN0Ci0JCQkJQ2xhc3MgcmV0dXJuVHlwZSA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0QmVhblByb3h5KHJldHVyblR5cGUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLgotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eShleGMuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXhjLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9Ci0JfQotCS8qKgotCSAqIERvIG5vdCB0aHJvdyBhbiBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCB3aXRoIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50IHdpbGwgYmUgYW4gSURFQmVhblByb3h5IAotCSAqICggYmVjYXVzZSB3ZSBhcmUgYW4gSURFTWV0aG9kUHJveHkgKSBzbyB3ZSBjYW4gY2FzdCB0byBpdCBhbmQgZ2V0IHRoZSBhY3R1YWwgYmVhbgotCSAqIGl0c2VsZiBhbmQgdXNlIHRoaXMgdG8gaW52b2tlIGFnYWluc3QgbWV0aG9kIHdoaWNoIGlzIHRoZSBhY3R1YWwKLQkgKiBqYXZhLmxhbmcuUmVmbGVjdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0KLQkJCQkoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2UoCi0JCQkJCXN1YmplY3QgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgc3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXJndW1lbnQgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgYXJndW1lbnQpLmdldEJlYW4oKSA6IG51bGwgfSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJQ2xhc3MgcmV0dXJuVHlwZSA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0QmVhblByb3h5KHJldHVyblR5cGUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLgotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eShleGMuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXhjLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9Ci0JfQotCS8qKgotCSAqIEludm9rZSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgYXJndW1lbnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCB3aXRoIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgd2lsbCBiZSBJREVCZWFuUHJveHkgb2JqZWN0cwotCSAqICggYmVjYXVzZSB3ZSBhcmUgYW4gSURFTWV0aG9kUHJveHkgKSBzbyB3ZSBjYW4gY2FzdCB0byB0aGVtIGFuZCBnZXQgdGhlIGFjdHVhbCBiZWFuCi0JICogb2JqZWN0cyB0aGVtc2VsdmVzIGFuZCB1c2UgdGhlc2UgdG8gaW52b2tlIGFnYWluc3QgbWV0aG9kIHdoaWNoIGlzIHRoZSBhY3R1YWwKLQkgKiBqYXZhLmxhbmcuUmVmbGVjdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCU9iamVjdFtdIGJlYW5Bcmd1bWVudHMgPSBuZXcgT2JqZWN0W2FyZ3VtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3VtZW50c1tpXSAhPSBudWxsKSB7Ci0JCQkJYmVhbkFyZ3VtZW50c1tpXSA9ICgoSUlERUJlYW5Qcm94eSkgYXJndW1lbnRzW2ldKS5nZXRCZWFuKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2Uoc3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBzdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLCBiZWFuQXJndW1lbnRzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlDbGFzcyByZXR1cm5UeXBlID0gKChNZXRob2QpIGdldEJlYW4oKSkuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCXJldHVybiBnZXRCZWFuUHJveHkocmV0dXJuVHlwZSwgcmVzdWx0KTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd3JhcHBlcmVkIGV4Y2VwdGlvbi4gUmV0dXJuIHRoZSB3cmFwcGVyZWQgb25lIHNvIGl0IGxvb2tzIGxpa2UKLQkJCS8vIGl0IHdhcyB0aGUgcmVhbCBvbmUuCi0JCQlJQmVhblR5cGVQcm94eSBleGNlcHRpb25UeXBlUHJveHkgPQotCQkJCSgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkJCWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXhjZXB0aW9uVHlwZVByb3h5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KGV4Yy5nZXRDbGFzcygpKTsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShleGMsIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSW52b2tlIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIGFyZ3VtZW50cykgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlJQmVhblByb3h5IGdldEJlYW5Qcm94eShDbGFzcyByZXR1cm5UeXBlLCBPYmplY3QgYmVhbikgewotCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eShyZXR1cm5UeXBlLCBiZWFuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyMmI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICRSQ1NmaWxlOiBJREVNZXRob2RQcm94eUZhY3RvcnkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjE0ICQgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6MDUgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotcHVibGljIGNsYXNzIElERU1ldGhvZFByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElNZXRob2RQcm94eUZhY3RvcnkgewotCi0JZmluYWwgcHJvdGVjdGVkIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgTWFwIHByaW1Mb29rdXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JSURFQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZSwgZmllbGRUeXBlLCBtZXRob2RUeXBlLCBjb25zdHJ1Y3RvclR5cGU7Ci0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBtZXRob2QgdHlwZSBwcm94aWVzLgotCXN0YXRpYyB7Ci0JCXByaW1Mb29rdXAucHV0KCJpbnQiLCBJbnRlZ2VyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJjaGFyIiwgQ2hhcmFjdGVyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJsb25nIiwgTG9uZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgic2hvcnQiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgiZG91YmxlIiwgRG91YmxlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJib29sZWFuIiwgQm9vbGVhbi5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgiYnl0ZSIsIEJ5dGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImZsb2F0IiwgRmxvYXQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlJREVNZXRob2RQcm94eUZhY3RvcnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyTWV0aG9kUHJveHlGYWN0b3J5KHRoaXMpOwotCQlhY2Nlc3NpYmxlVHlwZSA9IG5ldyBJREVCZWFuVHlwZVByb3h5KGFSZWdpc3RyeSwgQWNjZXNzaWJsZU9iamVjdC5jbGFzcyk7Ci0JCWZpZWxkVHlwZSA9IG5ldyBJREVGaWVsZFR5cGVQcm94eShhUmVnaXN0cnkpOwotCQltZXRob2RUeXBlID0gbmV3IElERU1ldGhvZFR5cGVQcm94eShhUmVnaXN0cnkpOwotCQljb25zdHJ1Y3RvclR5cGUgPSBuZXcgSURFQ29uc3RydWN0b3JUeXBlUHJveHkoYVJlZ2lzdHJ5KTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGFjY2Vzc2libGVUeXBlLCB0cnVlKTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGZpZWxkVHlwZSwgdHJ1ZSk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShtZXRob2RUeXBlLCB0cnVlKTsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGNvbnN0cnVjdG9yVHlwZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGFuIElERUNvbnN0cnVjdG9yUHJveHkgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZSBvbmx5IHBlb3BsZSB3aG8gY2FuIHVzZSB0aGlzIGFyZSBwcml2ZWxlZGdlIG9iamVjdHMgdGhhdAotCSAqIGhhdmUgdGhlIGFNZXRob2QgaW5zdGFuY2UuIFRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBpZGV2bSBwYWNrYWdlIG9ubHkuIElmIHlvdSBoYXZlIHRvIG1ha2UgdGhpcyBtZXRob2QgcHVibGljIHlvdSBhcmUgZG9pbmcgdGhpbmdzIGluY29ycmVjdGx5LgotCSAqIFRvIGdldCBhIG1ldGhvZCBwcm94eSB5b3UgbXVzdCB1c2UgdGhlIGludGVyZmFjZSBtZXRob2RzIG9uIElNZXRob2RQcm94eUZhY3RvcnkgdG8gZG8gbG9va3VwIGJ5IHN0cmluZyBvciBlbHNlIG9uIElCZWFuVHlwZVByb3h5IHRoYXQgaGFzCi0JICogZ2V0TWV0aG9kKFN0cmluZykgYXMgd2VsbAotCSAqLwotCUlDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yKSB7Ci0KLQkJcmV0dXJuIChJQ29uc3RydWN0b3JQcm94eSkgY29uc3RydWN0b3JUeXBlLm5ld0JlYW5Qcm94eShhQ29uc3RydWN0b3IpOwotCi0JfQotCQotCUlDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKENsYXNzIGFDbGFzcykgewotCQlDb25zdHJ1Y3RvcltdIGN0b3JzID0gYUNsYXNzLmdldENvbnN0cnVjdG9ycygpOwotCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3JQcm94aWVzID0gbmV3IElDb25zdHJ1Y3RvclByb3h5W2N0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWN0b3JQcm94aWVzW2ldID0gZ2V0Q29uc3RydWN0b3JQcm94eShjdG9yc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGN0b3JQcm94aWVzOwotCX0KLQotCUlDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoQ2xhc3MgYUNsYXNzKSB7Ci0JCUNvbnN0cnVjdG9yW10gY3RvcnMgPSBhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJSUNvbnN0cnVjdG9yUHJveHlbXSBjdG9yUHJveGllcyA9IG5ldyBJQ29uc3RydWN0b3JQcm94eVtjdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljdG9yUHJveGllc1tpXSA9IGdldENvbnN0cnVjdG9yUHJveHkoY3RvcnNbaV0pOwotCQl9Ci0JCXJldHVybiBjdG9yUHJveGllczsKLQl9Ci0KLQlJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KENsYXNzIGFDbGFzcywgQ2xhc3NbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCUNvbnN0cnVjdG9yIGN0b3IgPSBhQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJncyk7Ci0JCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JQcm94eShjdG9yKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoQ2xhc3MgYUNsYXNzLCBDbGFzc1tdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJQ29uc3RydWN0b3IgY3RvciA9IGFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKGFyZ3MpOwotCQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkoY3Rvcik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoQ2xhc3MgYUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gYUNsYXNzLmdldEZpZWxkcygpOwotCQlJRmllbGRQcm94eVtdIGZpZWxkUHJveGllcyA9IG5ldyBJRmllbGRQcm94eVtmaWVsZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCWZpZWxkUHJveGllc1tpXSA9IGdldEZpZWxkUHJveHkoZmllbGRzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmllbGRQcm94aWVzOwotCX0KLQotCUlGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoQ2xhc3MgYUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gYUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCUlGaWVsZFByb3h5W10gZmllbGRQcm94aWVzID0gbmV3IElGaWVsZFByb3h5W2ZpZWxkcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJZmllbGRQcm94aWVzW2ldID0gZ2V0RmllbGRQcm94eShmaWVsZHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWVsZFByb3hpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGFuIElERUZpZWxkUHJveHkgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZSBvbmx5IHBlb3BsZSB3aG8gY2FuIHVzZSB0aGlzIGFyZSBwcml2ZWxlZGdlIG9iamVjdHMgdGhhdCBoYXZlIHRoZQotCSAqIGFGaWVsZCBpbnN0YW5jZS4gVGhlc2UgYXJlIHBhcnQgb2YgdGhlIGlkZXZtIHBhY2thZ2Ugb25seS4gSWYgeW91IGhhdmUgdG8gbWFrZSB0aGlzIG1ldGhvZCBwdWJsaWMgeW91IGFyZSBkb2luZyB0aGluZ3MgaW5jb3JyZWN0bHkuIFRvIGdldCBhCi0JICogZmllbGQgcHJveHkgeW91IG11c3QgdXNlIHRoZSBpbnRlcmZhY2UgbWV0aG9kcyBvbiBJQmVhblR5cGVQcm94eSB0aGF0IGhhcyBnZXRGaWVsZChTdHJpbmcpIGFzIHdlbGwKLQkgKi8KLQlJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KEZpZWxkIGFGaWVsZCkgewotCi0JCXJldHVybiAoSUZpZWxkUHJveHkpIGZpZWxkVHlwZS5uZXdCZWFuUHJveHkoYUZpZWxkKTsKLQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgY2xhc3MgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIGl0IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIHRoZXkgd2lsbCBiZSByZXNvbHZlZCBmb3IgbGF0ZXIgdXNhZ2UuCi0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBjbGFzc05hbWUpOwotCQlyZXR1cm4gYmVhblR5cGUuZ2V0RmllbGRQcm94eShleHByZXNzaW9uLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBhbiBJREVNZXRob2RQcm94eSBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyBjYW4gdXNlIHRoaXMgYXJlIHByaXZlbGVkZ2Ugb2JqZWN0cyB0aGF0IGhhdmUgdGhlCi0JICogYU1ldGhvZCBpbnN0YW5jZS4gVGhlc2UgYXJlIHBhcnQgb2YgdGhlIGlkZXZtIHBhY2thZ2Ugb25seS4gSWYgeW91IGhhdmUgdG8gbWFrZSB0aGlzIG1ldGhvZCBwdWJsaWMgeW91IGFyZSBkb2luZyB0aGluZ3MgaW5jb3JyZWN0bHkuIFRvIGdldCBhCi0JICogbWV0aG9kIHByb3h5IHlvdSBtdXN0IHVzZSB0aGUgaW50ZXJmYWNlIG1ldGhvZHMgb24gSU1ldGhvZFByb3h5RmFjdG9yeSB0byBkbyBsb29rdXAgYnkgc3RyaW5nIG9yIGVsc2Ugb24gSUJlYW5UeXBlUHJveHkgdGhhdCBoYXMKLQkgKiBnZXRNZXRob2QoU3RyaW5nKSBhcyB3ZWxsCi0JICovCi0JSURFTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoTWV0aG9kIGFNZXRob2QpIHsKLQotCQlyZXR1cm4gKElERU1ldGhvZFByb3h5KSBtZXRob2RUeXBlLm5ld0JlYW5Qcm94eShhTWV0aG9kKTsKLQotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBhQ2xhc3MgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoYUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgY2xhc3MgYW5kIHBhcm10eXBlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgdGhleSBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgY2xhc3NOYW1lKTsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMgPSBnZXRQYXJhbWV0ZXJUeXBlcyhleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlcywgYmVhblR5cGVQcm94eUZhY3RvcnkpOwotCQlyZXR1cm4gYmVhblR5cGUuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQl9CQotCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgZm9yIEJlYW50eXBlcyBhbmQgUHJveHkgYmVhbiB0eXBlcyB0byBnZXQgdGhlIHByb3h5LgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGNsYXNzVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgY2xhc3NUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIHBhcm10eXBlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgdGhleSBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyA9IGdldFBhcmFtZXRlclR5cGVzKGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzLCBiZWFuVHlwZVByb3h5RmFjdG9yeSk7Ci0JCXJldHVybiBjbGFzc1R5cGUuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEBwYXJhbSBiZWFuVHlwZVByb3h5RmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb3h5QmVhblR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcyhJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcywgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkpIHsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXM7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKQotCQkJcGFybVR5cGVzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQlwYXJtVHlwZXMgPSBuZXcgSVByb3h5QmVhblR5cGVbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJtVHlwZXNbaV0gPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFybVR5cGVzOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoQ2xhc3MgY2xzLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzW10gcGFybUNsYXNzZXMgPSBudWxsOwotCQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKLQkJCQlwYXJtQ2xhc3NlcyA9IG5ldyBDbGFzc1twYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ2xhc3MgdGVtcCA9IChDbGFzcykgcHJpbUxvb2t1cC5nZXQocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCQlpZiAodGVtcCA9PSBudWxsKQotCQkJCQkJdGVtcCA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5sb2FkQ2xhc3MocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCQlwYXJtQ2xhc3Nlc1tpXSA9IHRlbXA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFybUNsYXNzZXMpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUlNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KENsYXNzIGNscywgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzc1tdIHBhcm1DbGFzc2VzID0gbnVsbDsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQkJcGFybUNsYXNzZXMgPSBuZXcgQ2xhc3NbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNsYXNzIHRlbXAgPSAoQ2xhc3MpIHByaW1Mb29rdXAuZ2V0KHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkKLQkJCQkJCXRlbXAgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkubG9hZENsYXNzKHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQkJcGFybUNsYXNzZXNbaV0gPSB0ZW1wOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShjbHMuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFybUNsYXNzZXMpKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQotCUlERU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KENsYXNzIGFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJncykgewotCQl0cnkgewotCQkJTWV0aG9kIG1ldGhvZCA9IGFDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiArIGFDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgIjoiICsgbWV0aG9kTmFtZSArICIgYXJncz0iICsgYXJncywgZXhjKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoQ2xhc3MgYUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gYUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOwotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiVW5hYmxlIHRvIGZpbmQgbWV0aG9kICIgKyBhQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICI6IiArIG1ldGhvZE5hbWUgKyAiIGFyZ3M9IiArIGFyZ3MsIGV4YykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQkKLQotCUlNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShJREVCZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoYVR5cGVQcm94eS5mQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcyhDbGFzcyBhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCUlNZXRob2RQcm94eVtdIG1ldGhvZFByb3hpZXMgPSBuZXcgSU1ldGhvZFByb3h5W21ldGhvZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQltZXRob2RQcm94aWVzW2ldID0gZ2V0TWV0aG9kUHJveHkobWV0aG9kc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFByb3hpZXM7Ci0JfQotCQotCUlNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKENsYXNzIGFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFybVR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlTWV0aG9kKGFDbGFzcywgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZCk7Ci0JfQotCQotCUlDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihDbGFzcyBhQ2xhc3MsIENsYXNzW10gcGFybVR5cGVzKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlDb25zdHJ1Y3RvciBtZXRob2QgPSBNZXRob2RIZWxwZXIuZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcihhQ2xhc3MsIHBhcm1UeXBlcyk7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KG1ldGhvZCk7Ci0JfQotCQotCi0JSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKENsYXNzIGFDbGFzcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gYUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlJTWV0aG9kUHJveHlbXSBtZXRob2RQcm94aWVzID0gbmV3IElNZXRob2RQcm94eVttZXRob2RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJbWV0aG9kUHJveGllc1tpXSA9IGdldE1ldGhvZFByb3h5KG1ldGhvZHNbaV0pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQcm94aWVzOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShjbGFzc05hbWUsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFkYWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgSURFTWV0aG9kVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0JSURFTWV0aG9kVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MpOwotCX0KLQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5Qcm94eShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gbmV3IElERU1ldGhvZFByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgYW5PYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDY5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIGFueSBOdW1iZXIgKGkuZS4gdGhlIG5vbi1wcmltaXRpdmVzKQotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIElERU51bWJlckJlYW5Qcm94eSBleHRlbmRzIElERUJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgTnVtYmVyIGZOdW1iZXJWYWx1ZTsKLQlwcm90ZWN0ZWQgSUJlYW5UeXBlUHJveHkgZkJlYW5UeXBlUHJveHk7Ci0JCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotSURFTnVtYmVyQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTnVtYmVyIGFOdW1iZXIgLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSxhTnVtYmVyKTsKLQlmTnVtYmVyVmFsdWUgPSBhTnVtYmVyOwotCWZCZWFuVHlwZVByb3h5ID0gYUJlYW5UeXBlUHJveHk7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSURFTnVtYmVyQmVhblByb3h5KQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscygoKElERU51bWJlckJlYW5Qcm94eSkgYW5PYmplY3QpLm51bWJlclZhbHVlKCkpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikKLQkJcmV0dXJuIGZOdW1iZXJWYWx1ZS5lcXVhbHMoYW5PYmplY3QpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5ieXRlVmFsdWUoKTsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5kb3VibGVWYWx1ZSgpOwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmZsb2F0VmFsdWUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmludFZhbHVlKCk7Ci19Ci0vKioKLSAqIGxvbmdWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUubG9uZ1ZhbHVlKCk7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWU7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuc2hvcnRWYWx1ZSgpOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKXsKLQlyZXR1cm4gZkJlYW5UeXBlUHJveHk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU51bWJlckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk2OTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIE51bWJlciBCZWFuVHlwZSBQcm94eS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIElERU51bWJlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQlwcm90ZWN0ZWQgZmluYWwgSURFTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogSURFTnVtYmVyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFSZWdpc3RyeSBjb20uaWJtLmV0b29scy52Y2UucHJveHkuUHJveHlGYWN0b3J5UmVnaXN0cnkKLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLXByb3RlY3RlZCBJREVOdW1iZXJCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzLCBOdW1iZXIgemVyb051bWJlcikgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkvLyBDYWNoZSBhIHplcm8gcHJveHkgb2YgdGhpcyB0eXBlICh0aG91Z2ggdGhlIG51bWJlciB3aWxsIGJlIExvbmcpLgotCXplcm9Qcm94eSA9IG5ldyBJREVOdW1iZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCB6ZXJvTnVtYmVyICwgdGhpcyk7Ci19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlpZiAoYU51bWJlciA9PSBudWxsIHx8IHplcm9Qcm94eS5mQmVhbi5lcXVhbHMoYU51bWJlcikpCi0JCXJldHVybiB6ZXJvUHJveHk7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhTnVtYmVyLCB0aGlzKTsKLX0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBJREVCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBJTnVtYmVyQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiAoSUlERUJlYW5Qcm94eSljcmVhdGVOdW1iZXJCZWFuUHJveHkoKE51bWJlcikgYW5PYmplY3QpOwotCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU9iamVjdEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVPYmplY3RCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMTVlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU9iamVjdEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVPYmplY3RCZWFuUHJveHkgZXh0ZW5kcyBJREVCZWFuUHJveHkgewotCi0JcHJvdGVjdGVkIElCZWFuVHlwZVByb3h5IGZCZWFuVHlwZVByb3h5OyAvLyBDYWNoZSB0aGUgdHlwZSBwcm94eSBmb3Igc3BlZWQKLQkKLXByb3RlY3RlZCBJREVPYmplY3RCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KXsKLQlzdXBlcihhUmVnaXN0cnkpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RvciB0aGF0IGxldHMgdGhlIGJlYW4gdHlwZSBiZSBzZXQgb24gY3JlYXRpb24uCi0gKiBUaGlzIHNhdmVzIHRoZSBvdmVyaGVhZCBvZiBpdCBiZWluZyBsb29rZWQgdXAgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQgZm9yLgotICoKLSAqIFRoaXMgaXMgcHJvdGVjdGVkIGJlY2F1c2UgdGhlIG9ubHkgcGVyc29uCi0gKiB3aG8gc2hvdWxkIHVzZSBpdCBpcyB0aGUgSURFQmVhblR5cGVQcm94eSBvciBhIHN1YmNsYXNzLiAgTWFraW5nIGl0IHBhY2thZ2UgcHJvdGVjdGVkIHN0b3BzIHBlb3BsZSBmcm9tCi0gKiB3cml0aW5nIGJvZ3VzIGNvZGUgYW5kIGRvaW5nIGNhc3RzIGFuZCBzbGFtbWluZyBuZXcgYmVhbnMgaW4gd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBwcm9wZXIgQVBJCi0gKiB0aGF0IGlzIGJhc2VkIGFyb3VuZCBhbnkga2luZCBvZiBWTSBhcnRpZmFjdCBiZWluZyBwcm94aWVkIHRvIHN1cHBvcnQgdGFyZ2V0IFZNcyBhbmQgcGx1Z2dhYmxlIEpESwotICogbGV2ZWxzIAotICovCi1wcm90ZWN0ZWQgSURFT2JqZWN0QmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSl7Ci0JCi0JdGhpcyhhUmVnaXN0cnksIGFCZWFuKTsKLQlmQmVhblR5cGVQcm94eSA9IGFCZWFuVHlwZVByb3h5OwotCQotfQotLyoqCi0gKiBTZXQgdGhlIGJlYW4gd2UgYXJlIHByb3h5aW5nLiAgV2UgYXJlIGEgcHJveHkgZm9yIGEgYmVhbiBydW5uaW5nIG9uIHRoZSBzYW1lIElERQotICogc28gd2UgaG9sZCB0aGUgYmVhbiBkaXJlY3RseSBhbmQgY2FuIHJldHVybiBpdC4gCi0gKi8KLXByb3RlY3RlZCBJREVPYmplY3RCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4pewotCXRoaXMoYVJlZ2lzdHJ5KTsKLQkKLQlmQmVhbiA9IGFCZWFuOwotCQotfQotLyoqCi0gKiBUaGUgdHlwZSBwcm94eSBpcyBnb3QgZnJvbSBvdXIgY2xhc3MgbmFtZQotICogSWYgd2UgaGF2ZSB0aGUgdHlwZSByZXR1cm4gaXQsIG90aGVyd2lzZSBnbyB0aGUgZmFjdG9yeSBmb3IgaXQKLSAqIERvbid0IG5ldyBpdCB1cCBiZWNhdXNlIHRoZSBmYWN0b3J5IG11c3QgYmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHR5cGUgcHJveGllcyBhcyBpdAotICogaGFzIHRvIHBlcmZvcm0gaW5zdGFuY2UgbWFuYWdlbWVudCBvbiB0aGVtCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0KLQlpZiAoIGZCZWFuVHlwZVByb3h5ID09IG51bGwgKSB7CQotCQlmQmVhblR5cGVQcm94eSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIGZCZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0JfQotCXJldHVybiBmQmVhblR5cGVQcm94eTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTk3MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBCT09MRUFOID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IEJZVEUgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBET1VCTEUgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgRkxPQVQgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUiA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBMT05HID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IFNIT1JUID0gODsKLQkKLXB1YmxpYyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSxDbGFzcyBhQ2xhc3MpewotCXN1cGVyKGFSZWdpc3RyeSxhQ2xhc3MpOwotfQotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci1hYnN0cmFjdCBpbnQgZ2V0UHJpbWl0aXZlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI3MjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcnVucyB0aGUgQmVhbnMgaW5zaWRlIHRoZSBFY2xpcHNlIElERQotICogSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwbHVnaW5zIHRoYXQgY2FuIGd1YXJhbnRlZSB0aGVpciB0aGVpciBiZWFucyBkbwotICogbm90IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBJREUgYW5kIGNhbiBydW4gYXQgdGhlIHNhbWUgSkRLIGxldmVsCi0gKiB0aGF0IHRoZSBFY2xpcHNlIElERSBpcyBydW5uaW5nCi0gKi8KLQotcHVibGljIGNsYXNzIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGltcGxlbWVudHMgSVZNU2VydmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERV9SRUdJU1RSWV9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmplbS5JREUiOwkvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmTmFtZTsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyOwotCXByb3RlY3RlZCBJREVDYWxsYmFja1JlZ2lzdHJ5IGZDYWxsYmFja1JlZ2lzdHJ5OwotCQotCS8qCi0JICogU3BlY2lhbCBjbGFzc2xvYWRlciB0aGF0IGZpcnN0cyB0cmllcyB0byBsb2FkIGZyb20gYnVuZGxlIHRoZW4gdHJpZXMgZnJvbSB1cmwgcGF0aHMgc28KLQkgKiB0aGF0IGJ1bmRsZSBpcyB0cmVhdGVkIGFzIGJlaW5nIGF0IHRoZSBoZWFkIG9mIHRoZSB1cmwgcGF0aHMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSURFU3BlY2lhbENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotCQkKLQkJcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCQkvLyBUaGlzIGlzIHRoZSBidW5kbGUgdGhhdCBjb250YWlucyB0aGUgSURFIEVjbGlwc2UgY29kZS4KLQkJLy8gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZmlyc3QgYmVjYXVzZSB0aGVyZSBhcmUgSURFIHNwZWNpZmljIHN0dWZmIHRoYXQgaXMgdXNlZCBvbiB0aGUgInJlbW90ZSB2bSIgdG9vIGFuZAotCQkvLyBzbyBtdXN0IGJlIGNvbW1vbi4KLQkJcHJpdmF0ZSBCdW5kbGUgaWRlQnVuZGxlOwkgCi0KLQkJcHVibGljIElERVNwZWNpYWxDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBCdW5kbGUgYnVuZGxlKSB7Ci0JCQlzdXBlcih1cmxzLCBudWxsKTsKLQkJCWlkZUJ1bmRsZSA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIoVVJMW10gdXJscykgewotCQkJdGhpcyh1cmxzLCBudWxsKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5DbGFzc0xvYWRlciNmaW5kQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGlkZUJ1bmRsZS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBidW5kbGUubG9hZENsYXNzKG5hbWUpOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIjZmluZFJlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotCQkJVVJMIHIgPSBpZGVCdW5kbGUuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlpZiAociA9PSBudWxsICYmIGJ1bmRsZSAhPSBudWxsKQotCQkJCXIgPSBidW5kbGUuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlyZXR1cm4gciAhPSBudWxsID8gciA6IHN1cGVyLmZpbmRSZXNvdXJjZShuYW1lKTsKLQkJfQotfQotCi0vKioKLSAqIENyZWF0ZSBhIHNwZWNpYWwgbG9hZGVyIHRoYXQgaGFzIHRoZSBwbHVnaW4gY2xhc3Nsb2FkZXIgb2YgdGhlIHBhc3NlZCBpbiBwbHVnaW4KLSAqIGFzIHRoZSBwYXJlbnQgbG9hZGVyLCBwbHVzIGFsbCBvZiB0aGUgdXJscywgcGx1cyB0aGUgcmVtb3Rldm0uamFyIGZpbGUgdGhhdCBpcwotICogbmVlZGVkIGJ5IElERSBQcm94eSB0byB3b3JrLgotICovCQotcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVTcGVjaWFsTG9hZGVyKFN0cmluZyBwbHVnaW5OYW1lLCBVUkxbXSBvdGhlclVSTHMpIHsKLQlCdW5kbGUgYnVuZGxlID0gcGx1Z2luTmFtZSAhPSBudWxsID8gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbk5hbWUpIDogbnVsbDsKLQkKLQlVUkxbXSBtdXN0SGF2ZVVybHMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICJ2bS9yZW1vdGV2bS5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQotCVVSTFtdIHVybHMgPSBudWxsOwotCWlmIChvdGhlclVSTHMgIT0gbnVsbCkgewotCQl1cmxzID0gbmV3IFVSTFtvdGhlclVSTHMubGVuZ3RoK211c3RIYXZlVXJscy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG11c3RIYXZlVXJscywgMCwgdXJscywgMCwgbXVzdEhhdmVVcmxzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkob3RoZXJVUkxzLCAwLCB1cmxzLCBtdXN0SGF2ZVVybHMubGVuZ3RoLCBvdGhlclVSTHMubGVuZ3RoKTsKLQl9IGVsc2UgCi0JCXVybHMgPSBtdXN0SGF2ZVVybHM7Ci0JCQotCXJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIodXJscywgYnVuZGxlKSA6IG5ldyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIodXJscyk7Ci19Ci0KLXB1YmxpYyBJREVQcm94eUZhY3RvcnlSZWdpc3RyeShTdHJpbmcgYU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCXN1cGVyKElERV9SRUdJU1RSWV9UWVBFX0lEKTsKLQlmTmFtZSA9IGFOYW1lOwotCWZDbGFzc0xvYWRlciA9IGxvYWRlcjsKLX0KLQotQ2xhc3NMb2FkZXIgZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKXsKLQlyZXR1cm4gZkNsYXNzTG9hZGVyOwotfQotCi1wcm90ZWN0ZWQgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoYm9vbGVhbiB3YWl0KXsKLQlMaXN0IHJ1bm5hYmxlcyA9IG51bGw7Ci0Jc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCXJ1bm5hYmxlcyA9IHNodXRkb3duUnVubmFibGVzOwotCQlzaHV0ZG93blJ1bm5hYmxlcyA9IG51bGw7Ci0JfQotCWlmIChydW5uYWJsZXMgIT0gbnVsbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJ1bm5hYmxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQkoKFJ1bm5hYmxlKSBpdHIubmV4dCgpKS5ydW4oKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLUNsYXNzIGxvYWRDbGFzcyhTdHJpbmcgYUNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciwgTGlua2FnZUVycm9yIHsKLQlyZXR1cm4gZkNsYXNzTG9hZGVyLmxvYWRDbGFzcyhhQ2xhc3NOYW1lKTsKLX0KLQotcHVibGljIElDYWxsYmFja1JlZ2lzdHJ5IGdldENhbGxiYWNrUmVnaXN0cnkoKXsKLQlpZiAoIGZDYWxsYmFja1JlZ2lzdHJ5ID09IG51bGwgKXsKLQkJZkNhbGxiYWNrUmVnaXN0cnkgPSBuZXcgSURFQ2FsbGJhY2tSZWdpc3RyeSh0aGlzKTsKLQl9Ci0JcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5OwotfQotCi0KLS8qKgotICogR2V0IGEgYmVhbiBwcm94eSBmcm9tIHRoZSBiZWFuIG9mIHRoZSBjb3JyZWN0IHR5cGUuCi0gKiAKLSAqIEBwYXJhbSByZXR1cm5UeXBlCi0gKiBAcGFyYW0gYmVhbgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoQ2xhc3MgcmV0dXJuVHlwZSwgT2JqZWN0IGJlYW4pIHsKLQlJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSB0aGlzLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JaWYgKCFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJcmV0dXJuIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHkodGhpcywgYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IEludGVnZXIuVFlQRSkgewotCQlyZXR1cm4gcHJveHlGYWN0b3J5LmludFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCb29sZWFuLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5mbG9hdFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5sb25nVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IFNob3J0LlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5zaG9ydFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQlyZXR1cm4gcHJveHlGYWN0b3J5LmRvdWJsZVR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCeXRlLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5ieXRlVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkuY2hhclR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByaW1pdGl2ZSB0eXBlICIgKyByZXR1cm5UeXBlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0KLUxpc3Qgc2h1dGRvd25SdW5uYWJsZXM7Ci0KLXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JaWYgKHNodXRkb3duUnVubmFibGVzID09IG51bGwpIHsKLQkJc2h1dGRvd25SdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfSBlbHNlIGlmIChzaHV0ZG93blJ1bm5hYmxlcy5jb250YWlucyhydW5uYWJsZSkpCi0JCXJldHVybjsKLQlzaHV0ZG93blJ1bm5hYmxlcy5hZGQocnVubmFibGUpOwotfQotCi1wdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSkgewotCWlmIChzaHV0ZG93blJ1bm5hYmxlcyAhPSBudWxsKQotCQlzaHV0ZG93blJ1bm5hYmxlcy5yZW1vdmUocnVubmFibGUpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVJlZ2lzdHJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVSZWdpc3RyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNjg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVJlZ2lzdHJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dC5JREVSZWdpc3RlckFXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLkxvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXI7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIHJlZ2lzdHJhdGlvbiBjbGFzcyBmb3Igc3RhcnRpbmcgYW4gSURFUmVtb3RlIFZNLgotICovCi0KLXB1YmxpYyBjbGFzcyBJREVSZWdpc3RyYXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRBbkltcGxlbWVudGF0aW9uKAotCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY29udHJpYnV0b3JzLAotCQlib29sZWFuIGF0dGFjaEFXVCwKLQkJSVByb2plY3QgcHJvamVjdCwKLQkJU3RyaW5nIHZtTmFtZSwKLQkJU3RyaW5nIHBsdWdpbk5hbWUsCi0JCUlQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlERVJlZ2lzdHJhdGlvbiBpZGVyZWcgPSBuZXcgSURFUmVnaXN0cmF0aW9uKHBsdWdpbk5hbWUpOwotCQkJcmV0dXJuIGlkZXJlZy5zdGFydEltcGxlbWVudGF0aW9uKGNvbnRyaWJ1dG9ycywgYXR0YWNoQVdULCBwcm9qZWN0LCB2bU5hbWUsIHBtKTsgCi0JCX0KLQkKLQlwdWJsaWMgSURFUmVnaXN0cmF0aW9uKCkgewotCX0KLQkKLQlwcml2YXRlIElERVJlZ2lzdHJhdGlvbihTdHJpbmcgcGx1Z2luTmFtZSkgewotCQl0aGlzLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lOwotCX0KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5OYW1lOwkKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjcmVhdGUgYSByZW1vdGUgVk0gYW5kIHJldHVybiBhbiBpbml0aWFsaXplZCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS4KLQkgKiBQYXNzZWQgaW4gYXJlOgotCSAqICAgICAgcHJvamVjdDogVGhlIHByb2plY3QgdGhpcyBpcyBiZWluZyBzdGFydGVkIG9uLiBNdXN0IG5vdCBiZSBudWxsIGFuZCBtdXN0IGJlIGEgSmF2YVByb2plY3QuIChDdXJyZW50bHkgaWdub3JlZCBmb3IgSURFKS4KLQkgKiAgICAgIGF0dGFjaEFXVDogU2hvdWxkIEFXVCBiZSBhdHRhY2hlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgotCSAqICAgICAgY29udHJpYnV0b3JzOiBDb250cmlidXRvcnMgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIENhbiBiZSBudWxsLgotCSAqICAgICAgcG06IFByb2dyZXNzTW9uaXRvciB0byB1c2UuIE11c3Qgbm90IGJlIG51bGwuCi0JICogICAgICB2bU5hbWU6IE5hbWUgZm9yIHRoZSB2bS4gQ2FuIGJlIG51bGwuCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBjb250cmlidXRvcnMsCi0JCWJvb2xlYW4gYXR0YWNoQVdULAotCQlJUHJvamVjdCBwcm9qZWN0LAotCQlTdHJpbmcgdm1OYW1lLAotCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJVVJMW10gY2xhc3NQYXRocyA9IG51bGw7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJLy8gQWRkIGluIHRoZSBwYXRocyBmb3IgdGhlIHByb2plY3QJIAkKLQkJCWNsYXNzUGF0aHMgPSBQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoSmF2YVJ1bnRpbWUuY29tcHV0ZURlZmF1bHRSdW50aW1lQ2xhc3NQYXRoKGphdmFQcm9qZWN0KSk7Ci0JCX0gZWxzZQotCQkJY2xhc3NQYXRocyA9IG5ldyBVUkxbMF07Ci0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGpwID0gamF2YVByb2plY3Q7Ci0KLQkJZmluYWwgUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IG5ldyBQcm94eUxhdW5jaFN1cHBvcnQuTGF1bmNoSW5mbygpOwotCQljb250cmlidXRvcnMgPSBQcm94eUxhdW5jaFN1cHBvcnQuZmlsbEluTGF1bmNoSW5mbyhjb250cmlidXRvcnMgPT0gbnVsbCA/IFByb3h5TGF1bmNoU3VwcG9ydC5FTVBUWV9DT05GSUdfQ09OVFJJQlVUT1JTIDogY29udHJpYnV0b3JzLCBsYXVuY2hJbmZvLCBqcCAhPSBudWxsID8ganAuZ2V0RWxlbWVudE5hbWUoKSA6IG51bGwpOwotCQlmaW5hbCBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlcihjbGFzc1BhdGhzLCBuZXcgVVJMWzNdW10sIGxhdW5jaEluZm8pOwotCQlmaW5hbCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY29udHJpYnMgPSBjb250cmlidXRvcnM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJY29udHJpYnNbaWldLmluaXRpYWxpemUobGF1bmNoSW5mby5nZXRDb25maWdJbmZvKCkpOwotCQkJCX0KLQkJCX0pOwkJCQkKLQkJfQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWNvbnRyaWJzW2lpXS5jb250cmlidXRlQ2xhc3NwYXRocyhjb250cm9sbGVyKTsKLQkJCQl9Ci0JCQl9KTsJCQkJCi0JCX0KLQkJY2xhc3NQYXRocyA9IGNvbnRyb2xsZXIuZ2V0RmluYWxDbGFzc3BhdGgoKTsKLQotCQlmaW5hbCBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBjcmVhdGVJREVQcm94eUZhY3RvcnlSZWdpc3RyeSh2bU5hbWUsIHBsdWdpbk5hbWUsIGNsYXNzUGF0aHMpOwotCQlQcm94eUxhdW5jaFN1cHBvcnQucGVyZm9ybUV4dGVuc2lvblJlZ2lzdHJhdGlvbnMocmVnaXN0cnksIGxhdW5jaEluZm8pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJY29udHJpYnNbaWldLmNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJCQl9Ci0JCQl9KTsJCi0JCX0KLQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBjcmVhdGVJREVQcm94eUZhY3RvcnlSZWdpc3RyeShTdHJpbmcgYU5hbWUsIFN0cmluZyBhUGx1Z2luTmFtZSwgVVJMW10gb3RoZXJVUkxzKSB7Ci0JCS8vIENyZWF0ZSB0aGUgcmVnaXN0cnkuCi0JCUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLQkJCW5ldyBJREVQcm94eUZhY3RvcnlSZWdpc3RyeShhTmFtZSwgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkuY3JlYXRlU3BlY2lhbExvYWRlcihhUGx1Z2luTmFtZSwgb3RoZXJVUkxzKSk7Ci0JCWluaXRSZWdpc3RyeShyZWdpc3RyeSk7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGNyZWF0ZUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5KFN0cmluZyBhTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0JCS8vIENyZWF0ZSB0aGUgcmVnaXN0cnkuCi0JCUlERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5KGFOYW1lLCBsb2FkZXIpOwotCQlpbml0UmVnaXN0cnkocmVnaXN0cnkpOwotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0UmVnaXN0cnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJbmV3IElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQluZXcgSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IElERU1ldGhvZFByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCS8vIEFsd2F5cyBzdXBwb3J0IEFXVCBmb3Igbm93Ci0JCUlERVJlZ2lzdGVyQVdULnJlZ2lzdGVyQVdUKHJlZ2lzdHJ5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWM1NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFNob3J0IEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVTaG9ydENsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBTaG9ydCgoc2hvcnQpMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShTaG9ydCBhU2hvcnQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhU2hvcnQsdGhpcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU2ZGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogU2hvcnQgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERVNob3J0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLXByb3RlY3RlZCBJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShzaG9ydCBhU2hvcnQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgU2hvcnQoYVNob3J0KSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIFNIT1JUOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBTaG9ydCgoc2hvcnQpICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBuLCB0aGlzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE4NTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICRSQ1NmaWxlOiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcjsKLQotcHVibGljIGNsYXNzIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgewotCi0KLQlwcm90ZWN0ZWQgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByb3RlY3RlZCBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQlwcml2YXRlIElCZWFuUHJveHkgaXZtU2VydmVyUHJveHk7Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBiZWFuIHByb3h5IGZvciB0aGUgYXJndW1lbnQuIFRvIGRvIHRoaXMgY3JlYXRlIHRocm91Z2ggdGhlIGNvcnJlY3QgQmVhblR5cGVQcm94eQotCSAqIFdoaWNoIGVuc3VyZXMgdGhhdCBzcGVjaWFsIHN1YmNsYXNzZXMgb2YgSURFQmVhblByb3h5IGFyZSBjcmVhdGVkLiBUaGlzIGlzIGp1c3QgYSBsb2NhbAotCSAqIGhlbHBlciBtZXRob2QuCi0JICovCi0Jc3RhdGljIElJREVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFuT2JqZWN0KSB7Ci0KLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5jcmVhdGVJREVCZWFuUHJveHlXaXRoKGFuT2JqZWN0KTsKLQl9Ci0JCi0JSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZSZWdpc3RyeS5yZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkodGhpcyk7Ci0JCWZCZWFuVHlwZVByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJaXZtU2VydmVyUHJveHkgPSBmUmVnaXN0cnkuZ2V0QmVhblByb3h5KElWTVNlcnZlci5jbGFzcywgZlJlZ2lzdHJ5KTsKLQl9Ci0JCi0JcHVibGljIElTdHJpbmdCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnN0cmluZ0NsYXNzLmNyZWF0ZVN0cmluZ0JlYW5Qcm94eShhU3RyaW5nKTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhRmxvYXQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoYUZsb2F0KTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChzaG9ydCBhU2hvcnQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5zaG9ydFR5cGUuY3JlYXRlU2hvcnRCZWFuUHJveHkoYVNob3J0KTsKLQl9Ci0JCi0JcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChjaGFyIGFDaGFyKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShhQ2hhcik7Ci0JfQotCQotCXB1YmxpYyBJQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQ2hhcmFjdGVyIGFDaGFyYWN0ZXIpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyQ2xhc3MuY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGFDaGFyYWN0ZXIpOwotCX0KLQkKLQlwdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYW5JbnQpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbnRUeXBlLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoYW5JbnQpOwotCX0KLQkKLQlwdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJbnRlZ2VyIGFuSW50ZWdlcikgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludGVnZXJDbGFzcy5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KGFuSW50ZWdlcik7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgobG9uZyBhTG9uZykgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmxvbmdUeXBlLmNyZWF0ZUxvbmdCZWFuUHJveHkoYUxvbmcpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKE51bWJlciBhTnVtYmVyKSB7Ci0JCUlERU51bWJlckJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZVByb3h5ID0gKElERU51bWJlckJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFOdW1iZXIuZ2V0Q2xhc3MoKSk7Ci0JCXJldHVybiBudW1iZXJUeXBlUHJveHkuY3JlYXRlTnVtYmVyQmVhblByb3h5KGFOdW1iZXIpOwotCX0KLQkKLQlwdWJsaWMgSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChib29sZWFuIGFCb29sZWFuKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhblR5cGUuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhQm9vbGVhbik7Ci0JfQotCQotCXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuQ2xhc3MuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhQm9vbGVhbik7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoYnl0ZSBhQnl0ZSkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoYUJ5dGUpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGRvdWJsZSBhRG91YmxlKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoYURvdWJsZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSkgewotCQlpZiAobm9uUHJpbWl0aXZlUHJveHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIW5vblByaW1pdGl2ZVByb3h5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQkJSURFQmVhblR5cGVQcm94eSB0eXBlID0gKElERUJlYW5UeXBlUHJveHkpIG5vblByaW1pdGl2ZVByb3h5LmdldFR5cGVQcm94eSgpOwotCQlpZiAodHlwZS5nZXRDbGFzcygpID09IEJvb2xlYW4uY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSUJvb2xlYW5CZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5ib29sZWFuVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBCeXRlLmNsYXNzKQotCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5ieXRlVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBDaGFyYWN0ZXIuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSUNoYXJhY3RlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmNoYXJWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IERvdWJsZS5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuZG91YmxlVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBGbG9hdC5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuZmxvYXRWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IEludGVnZXIuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmludFZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gTG9uZy5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkubG9uZ1ZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gU2hvcnQuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLnNob3J0VmFsdWUoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBub25QcmltaXRpdmVQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkuIFRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBhcyBjYWxsaW5nCi0JICogY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBuZXcgaW50WzFdIHt4fSkgd2hlcmUgJ3gnIGlzIHRoZSB2YWx1ZSBwYXNzZWQgaW4gYXMKLQkgKiB0aGUgZGltZW5zaW9uLgotCSAqLwotCXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnQgZGltZW5zaW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gY3JlYXRlQmVhblByb3h5V2l0aCh0eXBlLCBuZXcgaW50W10geyBkaW1lbnNpb24gfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotCSAqICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZTogaW50IFszXSBbNF0KLQkgKiAgLSAoaW50W10sIG5ldyBpbnRbMV0gezF9KSBpbnQgWzFdCi0JICogIC0gKGludFtdLCBuZXcgaW50WzJdIHsyLDN9KSBpbnQgWzJdIFszXQotCSAqIAotCSAqICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKSBpbnQgWzBdLi4uIG9yCi0JICogKGludFtdW10uLi4sIG51bGwpIG9yIChpbnRbXVtdLi4uLCBuZXcgaW50WzBdKSBpbnRbMF1bXS4uLiBUaGlzIGlzIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2UKLQkgKiB3aXRoIG5vIHNwZWNpZmllZCBkaW1lbnNpb25zIGlzIG5vdCB2YWxpZC4KLQkgKiAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pIGludFszXVtdCi0JICovCi0JcHVibGljIElBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIGludFtdIGRpbWVuc2lvbnMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWlmICh0eXBlLmlzQXJyYXkoKSkKLQkJCXJldHVybiAoKElERUFycmF5QmVhblR5cGVQcm94eSkgdHlwZSkuY3JlYXRlQmVhblByb3h5V2l0aChkaW1lbnNpb25zKTsgLy8gQWxyZWFkeSBhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBhcnJheSB0eXBlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBqdXN0IHBhc3MgaXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gb24uCi0JCWVsc2UgewotCQkJLy8gSXQgaXMgbm90IGFuIGFycmF5IHR5cGUsIHNvIHdlIG5lZWQgdG8gZ2V0IGFuIGFycmF5IG9mIHRoaXMgdHlwZSBhbmQgZGltZW5zaW9ucy4KLQkJCUlERUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPQotCQkJCShJREVBcnJheUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHR5cGUuZ2V0VHlwZU5hbWUoKSwgZGltZW5zaW9ucy5sZW5ndGgpOwotCQkJcmV0dXJuIGFycmF5VHlwZS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IGFQcm94eSkgewotCQkvLyBEbyBub3RoaW5nLiBUaGlzIGlzIG1vcmUgZm9yIHJlbW90ZSBwcm94aWVzCi0JfQotCQotCS8qKgotCSAqIGNyZWF0ZUlERUJlYW5Qcm94eVdpdGggbWV0aG9kIGNvbW1lbnQuIFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkKLQkgKiBpbnRlcmZhY2UuIEl0IGlzIGF2YWlsYWJsZSBvbmx5IGZyb20gSURFQmVhblByb3h5RmFjdG9yeSBzbyB0aGF0IElERSByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLQkgKiBjYW4gd3JhcHBlciBhIGJlYW4uIFRoZXkgd2lsbCBuZWVkIHRvIGdldCBjdXJyZW50IGFuZCBleHBsaWNpdGx5IGNhc3QgdG8KLQkgKiBJREVCZWFuUHJveHlGYWN0b3J5LCBzbyB0aGV5IHNob3VsZCBvbmx5IGJlIElERSB0eXBlcyB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyBJSURFQmVhblByb3h5IGNyZWF0ZUlERUJlYW5Qcm94eVdpdGgoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFuT2JqZWN0LmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkoYW5PYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIElERSBGYWN0b3J5IHdlIHdpbGwgY3JlYXRlIGFuIElERUJlYW5Qcm94eSB1c2luZyB0aGUgaW5pdGlhbGl6YXRpb25TdHJpbmcuIElmIHRoZQotCSAqIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCBvbmUgd2UgdW5kZXJzdGFuZCwgcGFzcyBpdCBvbnRvIHRoZSBldmFsdWF0b3IuIFRoZQotCSAqIGluaXRTdHJpbmdQYXJzZXIgaXMgcGFzc2VkIHRvIGFsbG93IHNob3J0Y3V0IGV2YWx1YXRpb24uIFBhY2thZ2UgcHJvdGVjdGVkIHNvIG9ubHkKLQkgKiBJREVCZWFuVHlwZVByb3hpZXMgY2FuIGNyZWF0ZSBpbnN0YW5jZXMuCi0JICovCi0JSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHkoSURFQmVhblR5cGVQcm94eSBhVHlwZVByb3h5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJaWYgKGluaXRpYWxpemF0aW9uU3RyaW5nLmVxdWFscygibnVsbCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsgLy8gVmFsdWUgaXMgaW5pdGlhbGl6ZWQgYXMgbnVsbC4KLQkJLy8gV2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgcmVzdWx0IG9mIHRoZSBpbml0aWFsaXphdGlvblN0cmluZwotCQl0cnkgewotCQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBmUmVnaXN0cnkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmV2YWx1YXRlKGluaXRpYWxpemF0aW9uU3RyaW5nLCBwbHVnaW5DbGFzc0xvYWRlcik7Ci0JCQlyZXR1cm4gbmV3VmFsdWUgIT0gbnVsbCA/IGFUeXBlUHJveHkubmV3QmVhblByb3h5KG5ld1ZhbHVlKSA6IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBJREUgRmFjdG9yeSB3ZSB3aWxsIGNyZWF0ZSBhbiBJREVCZWFuUHJveHkgdXNpbmcgdGhlIG51bGwgY29uc3RydWN0b3IgUGFja2FnZQotCSAqIHByb3RlY3RlZCBzbyBvbmx5IElERUJlYW5UeXBlUHJveGllcyBjYW4gY3JlYXRlIGluc3RhbmNlcy4KLQkgKi8KLQlJQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eShJREVCZWFuVHlwZVByb3h5IGFUeXBlUHJveHkpIHsKLQotCQlDbGFzcyBiZWFuVHlwZSA9IGFUeXBlUHJveHkuZkNsYXNzOwotCi0JCS8vIElmIHRoZSBiZWFuVHlwZSBpcyBhIHByaW1pdGl2ZSwgdGhlIGNyZWF0aW9uIHdpbGwgZmFpbCBiZWNhdXNlIHlvdSBjYW4ndAotCQkvLyBjcmVhdGUgYSBwcmltaXRpdmUgd2l0aG91dCBhIHZhbHVlLgotCQl0cnkgewotCQkJcmV0dXJuIGFUeXBlUHJveHkubmV3QmVhblByb3h5KCEoYVR5cGVQcm94eS5pc1ByaW1pdGl2ZSgpKSA/IGJlYW5UeXBlLm5ld0luc3RhbmNlKCkgOiBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQkJLy8gTm90aGluZyByZWFsbHkgdG8gZG8gaGVyZSAtIG1vcmUgYXBwbGljYWJsZSB0byByZW1vdGUgcHJveHkgZmFjdG9yaWVzCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSNjcmVhdGVFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBJREVFeHByZXNzaW9uKHRoaXMuZlJlZ2lzdHJ5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUJlYW5Qcm94eUZyb20oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJaWYgKGluaXRpYWxpemF0aW9uU3RyaW5nLmVxdWFscygibnVsbCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsgLy8gVmFsdWUgaXMgaW5pdGlhbGl6ZWQgYXMgbnVsbC4KLQkJLy8gV2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgcmVzdWx0IG9mIHRoZSBpbml0aWFsaXphdGlvblN0cmluZwotCQl0cnkgewotCQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBmUmVnaXN0cnkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNyZWF0ZVBhcnNlcihpbml0aWFsaXphdGlvblN0cmluZywgcGx1Z2luQ2xhc3NMb2FkZXIpOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gcGFyc2VyLmV2YWx1YXRlKCk7Ci0JCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmUmVnaXN0cnkuZ2V0QmVhblByb3h5KHBhcnNlci5nZXRFeHBlY3RlZFR5cGUoKSwgbmV3VmFsdWUpOwotCQkJfSBlbHNlIAotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGdldElWTVNlcnZlclByb3h5KCkgewotCQlyZXR1cm4gaXZtU2VydmVyUHJveHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZkN2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotLyoKLSAqICRSQ1NmaWxlOiBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xMiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NYXBUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JLy8gSGFzaHRhYmxlIHRvIGNhY2hlIHByb3hpZXMgZm9yIGNsYXNzZXMgc28gdGhleSBhcmUgZm91bmQgb24gc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxvb2t1cHMKLQlwcm90ZWN0ZWQgTWFwIGJlYW5Qcm94aWVzOwotCi0JcHVibGljIHN0YXRpYyBNYXAgTUFQX1NIT1JUU0lHX1RPX1RZUEUgPSBuZXcgSGFzaE1hcCg4KTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwIE1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRyA9IG5ldyBIYXNoTWFwKDgpOwotCi0Jc3RhdGljIHsKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJCIiwgQnl0ZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkMiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJEIiwgRG91YmxlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiRiIsIEZsb2F0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiSSIsIEludGVnZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJKIiwgTG9uZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIlMiLCBTaG9ydC5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIloiLCBCb29sZWFuLlRZUEUpOyAvLyROT04tTkxTLTEkCi0KLQkJTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiYnl0ZSIsICJCIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJjaGFyIiwgIkMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImRvdWJsZSIsICJEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJmbG9hdCIsICJGIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJpbnQiLCAiSSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgibG9uZyIsICJKIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJzaG9ydCIsICJTIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJib29sZWFuIiwgIloiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBiZWFuIHR5cGUgcHJveGllcy4KLQlJREVCZWFuVHlwZVByb3h5IG9iamVjdENsYXNzOwotCi0JSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5IGJvb2xlYW5UeXBlOwotCi0JSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eSBib29sZWFuQ2xhc3M7Ci0KLQlJREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkgaW50VHlwZTsKLQotCUlERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkgaW50ZWdlckNsYXNzOwotCi0JSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eSBmbG9hdFR5cGU7Ci0KLQlJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eSBmbG9hdENsYXNzOwotCi0JSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGxvbmdUeXBlOwotCi0JSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eSBsb25nQ2xhc3M7Ci0KLQlJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5IHNob3J0VHlwZTsKLQotCUlERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5IHNob3J0Q2xhc3M7Ci0KLQlJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkgYnl0ZVR5cGU7Ci0KLQlJREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5IGJ5dGVDbGFzczsKLQotCUlERUNoYXJUeXBlQmVhblR5cGVQcm94eSBjaGFyVHlwZTsKLQotCUlERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eSBjaGFyQ2xhc3M7Ci0KLQlJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eSBkb3VibGVUeXBlOwotCi0JSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5IGRvdWJsZUNsYXNzOwotCi0JSURFU3RyaW5nQmVhblR5cGVQcm94eSBzdHJpbmdDbGFzczsKLQotCUlERUNsYXNzQmVhblR5cGVQcm94eSBjbGFzc0NsYXNzOwotCi0JSURFQmVhblR5cGVQcm94eSB2b2lkVHlwZTsKLQotCXB1YmxpYyBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmRmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlhUmVnaXN0cnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeSh0aGlzKTsKLQotCQkvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgY2FjaGUuCi0JCW9iamVjdENsYXNzID0gbmV3IElERUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgT2JqZWN0LmNsYXNzKTsKLQkJYm9vbGVhblR5cGUgPSBuZXcgSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uVFlQRSk7Ci0JCWJvb2xlYW5DbGFzcyA9IG5ldyBJREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uY2xhc3MpOwotCQlpbnRUeXBlID0gbmV3IElERUludGVnZXJUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBJbnRlZ2VyLlRZUEUpOwotCQlpbnRlZ2VyQ2xhc3MgPSBuZXcgSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBJbnRlZ2VyLmNsYXNzKTsKLQkJZmxvYXRUeXBlID0gbmV3IElERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRmxvYXQuVFlQRSk7Ci0JCWZsb2F0Q2xhc3MgPSBuZXcgSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRmxvYXQuY2xhc3MpOwotCQlsb25nVHlwZSA9IG5ldyBJREVMb25nVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgTG9uZy5UWVBFKTsKLQkJbG9uZ0NsYXNzID0gbmV3IElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgTG9uZy5jbGFzcyk7Ci0JCXNob3J0VHlwZSA9IG5ldyBJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFNob3J0LlRZUEUpOwotCQlzaG9ydENsYXNzID0gbmV3IElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFNob3J0LmNsYXNzKTsKLQkJYnl0ZVR5cGUgPSBuZXcgSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJ5dGUuVFlQRSk7Ci0JCWJ5dGVDbGFzcyA9IG5ldyBJREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJ5dGUuY2xhc3MpOwotCQljaGFyVHlwZSA9IG5ldyBJREVDaGFyVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQ2hhcmFjdGVyLlRZUEUpOwotCQljaGFyQ2xhc3MgPSBuZXcgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIENoYXJhY3Rlci5jbGFzcyk7Ci0JCWRvdWJsZVR5cGUgPSBuZXcgSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRG91YmxlLlRZUEUpOwotCQlkb3VibGVDbGFzcyA9IG5ldyBJREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgRG91YmxlLmNsYXNzKTsKLQkJc3RyaW5nQ2xhc3MgPSBuZXcgSURFU3RyaW5nQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBTdHJpbmcuY2xhc3MpOwotCQljbGFzc0NsYXNzID0gbmV3IElERUNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBqYXZhLmxhbmcuQ2xhc3MuY2xhc3MpOwotCQl2b2lkVHlwZSA9IG5ldyBJREVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFZvaWQuVFlQRSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaHRhYmxlIHdpdGggdGhlIHByaW1pdGl2ZXMsIHRoZWlyIGxhbmcgZXF1aXZhbGVudHMsIGFuZCBhbHNvIGNvbW1vbiBjbGFzc2VzIGxpa2UgU3RyaW5nCi0JCWJlYW5Qcm94aWVzID0gbmV3IEhhc2hNYXAoMjApOwotCi0JCS8vIFByaW1pdGl2ZXMKLQkJYmVhblByb3hpZXMucHV0KGludFR5cGUuZ2V0VHlwZU5hbWUoKSwgaW50VHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChib29sZWFuVHlwZS5nZXRUeXBlTmFtZSgpLCBib29sZWFuVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChjaGFyVHlwZS5nZXRUeXBlTmFtZSgpLCBjaGFyVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChieXRlVHlwZS5nZXRUeXBlTmFtZSgpLCBieXRlVHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChzaG9ydFR5cGUuZ2V0VHlwZU5hbWUoKSwgc2hvcnRUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGxvbmdUeXBlLmdldFR5cGVOYW1lKCksIGxvbmdUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGZsb2F0VHlwZS5nZXRUeXBlTmFtZSgpLCBmbG9hdFR5cGUpOwotCQliZWFuUHJveGllcy5wdXQoZG91YmxlVHlwZS5nZXRUeXBlTmFtZSgpLCBkb3VibGVUeXBlKTsKLQotCQkvLyBqYXZhLmxhbmcgcHJpbWl0aXZlIHBlZXJzCi0JCS8vIE5vdGUgdGhhdCBzcGVjaWFsIGNsYXNzZXMgYXJlIHVzZWQgZm9yIHNvbWUgb2YgdGhlc2Ugd2hpY2ggYWxsb3cgdGhlIElERSB0byBnZXQgdGhlCi0JCS8vIGxhbmcgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3RzIHRoYXQgYXJlIGhvbGRpbmcgcHJveGllcwotCQliZWFuUHJveGllcy5wdXQoaW50ZWdlckNsYXNzLmdldFR5cGVOYW1lKCksIGludGVnZXJDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChib29sZWFuQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhbkNsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KGNoYXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBjaGFyQ2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoYnl0ZUNsYXNzLmdldFR5cGVOYW1lKCksIGJ5dGVDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChzaG9ydENsYXNzLmdldFR5cGVOYW1lKCksIHNob3J0Q2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQobG9uZ0NsYXNzLmdldFR5cGVOYW1lKCksIGxvbmdDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChmbG9hdENsYXNzLmdldFR5cGVOYW1lKCksIGZsb2F0Q2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoZG91YmxlQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgZG91YmxlQ2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksIG5ldyBJREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBCaWdEZWNpbWFsLmNsYXNzKSk7Ly8kTk9OLU5MUy0xJAotCQliZWFuUHJveGllcy5wdXQoQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIG5ldyBJREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBCaWdJbnRlZ2VyLmNsYXNzKSk7Ly8kTk9OLU5MUy0xJAkJCi0JCWJlYW5Qcm94aWVzLnB1dChzdHJpbmdDbGFzcy5nZXRUeXBlTmFtZSgpLCBzdHJpbmdDbGFzcyk7Ci0KLQkJYmVhblByb3hpZXMucHV0KGNsYXNzQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgY2xhc3NDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dCh2b2lkVHlwZS5nZXRUeXBlTmFtZSgpLCB2b2lkVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogV2UgYXJlIGFuIElERSBwcm94eSBhbmQga25vdyB0aGF0IHRoZSB0eXBlIGlzIGluIHRoZSBzYW1lIFZNIGFzIHRoZSBJREUuIHRoZSBJREVCZWFuVHlwZVByb3h5IG9iamVjdCBOT1RFIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUKLQkgKiBvbmx5IHBlcnNvbiB3aG8gY2FuIGNhbGwgaXQgYXJlIHByaXZlbGVkZ2VkIGNsYXNzZXMgdGhhdCBhcmUgYWxzbyBjcmVhdGluZyB0aGluZ3MgaW4gYW4gSURFUHJveHkgZW52aXJvbm1lbnQuIElmIGFueW9uZSBuZWVkcyB0byBtYWtlIHRoaXMKLQkgKiBtZXRob2QgcHVibGljIHRoZXkgYXJlIGRvaW5nIHRoZSB3cm9uZyB0aGluZyBhcyB0aGV5IHNob3VsZCB1c2UgdGhlIHB1YmxpYyBtZXRob2QgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcpIHRoYXQgaXMgb24gdGhlIGludGVyZmFjZS4gVGhlIG9ubHkKLQkgKiBvdGhlciBvYmplY3QgdGhhdCBjYW4gZ3VhcmFudGVlIHRoYXQgdGhleSBoYXZlIHRoZSBjbGFzcyBmb3IgdGhlIGFyZ3VtZW50IGFyZSB0aG9zZSB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBpZGV2bSBwYWNrYWdlCi0JICovCi0JSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShDbGFzcyBhbklERUNsYXNzKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGFuSURFQ2xhc3MuZ2V0TmFtZSgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdHlwZU5hbWUgPSBNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKHR5cGVOYW1lKTsKLQotCQkvLyBTZWUgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3h5IGZvciB0aGUgYXJndW1lbnQgbmFtZQotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gKElQcm94eUJlYW5UeXBlKSBiZWFuUHJveGllcy5nZXQodHlwZU5hbWUpOwotCQkvLyBTZWUgaWYgdGhlcmUgYW5kIHJlc29sdmVkLCBpZiBzbywgcmV0dXJuIGl0LiBJZiBub3QgcmVzb2x2ZWQsIHRoYXQgbWVhbnMgd2UgbmVlZCBpdCBOT1cKLQkJLy8gc28gd2UgbXVzdCBnbyBmb3IgaXQuIFdoZW4gZmluYWxseSByZXNvbHZlZCB0aGUgb3JpZ2luYWwgRXhwcmVzc2lvblByb3h5IHdpbGwgYmUgZGVyZWdpc3RlcmVkIGFuZAotCQkvLyB0aGUgcmVzb2x2ZWQgYmVhbnR5cGVwcm94eSB3aWxsIGJlIGluIGl0cyBwbGFjZS4KLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCAmJiBiZWFuVHlwZVByb3h5LmlzQmVhblByb3h5KCkpIHsKLQkJCXJldHVybiAoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCX0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeQotCQkJCQkJLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiAoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUaGVyZSB3YXMgbm90IGEgcmVnaXN0ZXJlZCBmYWN0b3J5IHRoYXQgZGVhbHQgd2l0aCB0aGUgY2xhc3MuIExvYWQgaXQgdXNpbmcgdGhlIGZhY3RvcnkKLQkJCS8vIHJlZ2lzdHJ5IHdoaWNoIGhhcyB0aGUgcGx1Z2luJ3MgY2xhc3MgbG9hZGVyCi0JCQl0cnkgewotCQkJCUNsYXNzIGlkZUNsYXNzID0gZkZhY3RvcnlSZWdpc3RyeS5sb2FkQ2xhc3ModHlwZU5hbWUpOwotCQkJCUlERUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlUHJveHkgPSBudWxsOwotCQkJCWlmIChpZGVDbGFzcy5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQkvLyBHZXQgdGhlIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzdXBlcmNsYXNzLgotCQkJCQlzdXBlclR5cGVQcm94eSA9IChJREVCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZVByb3h5KGlkZUNsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0JCQkJfQotCi0JCQkJLy8gQXNrIHRoZSBzdXBlcnR5cGUKLQkJCQkvLyB0byBjcmVhdGUgYSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcy4KLQkJCQkvLyBUaGlzIGlzIHNvIHRoYXQgYW55IHN1YmNsYXNzZXMgd2lsbCBnZXQgdGhlIHNhbWUgYmVhbnR5cGUgcHJveHkgY2xhc3MKLQkJCQkvLyBmb3IgaXQgaWYgaXQgaXMgc3BlY2lhbC4KLQkJCQlpZiAoc3VwZXJUeXBlUHJveHkgIT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IHN1cGVyVHlwZVByb3h5Lm5ld0JlYW5UeXBlRm9yQ2xhc3MoaWRlQ2xhc3MpOwotCi0JCQkJaWYgKGJlYW5UeXBlUHJveHkgPT0gbnVsbCkKLQkJCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGlkZUNsYXNzKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSh7MX0pIiwgbmV3IE9iamVjdFtdIHsgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIHR5cGVOYW1lLCBtc2csIGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0oezF9KSIsIG5ldyBPYmplY3RbXSB7IGUuZ2V0Q2xhc3MoKSwgZS5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgbXNnLCBlLmdldENhdXNlKCkpOwotCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0oezF9KSIsIG5ldyBPYmplY3RbXSB7IGUuZ2V0Q2xhc3MoKSwgZS5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgbXNnLCBlKTsKLQkJCX0KLQotCQkJLy8gQ2FjaGUgdGhlIGluc3RhbmNlIHNvIHdlIGNhbiByZS11c2UgaXQgYWdhaW4KLQkJCWJlYW5Qcm94aWVzLnB1dCh0eXBlTmFtZSwgYmVhblR5cGVQcm94eSk7Ci0JCQlyZXR1cm4gKElCZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5OwotCQl9IGVsc2UgewotCQkJLy8gbmVlZCB0byBjcmVhdGUgYSBhcnJheSBvZiB0aGlzIG1hbnkgZGltZW5zaW9ucyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBpdC4KLQkJCWludCBkaW1zID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJ1snKSArIDE7Ci0JCQlDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCQkJaWYgKHR5cGVOYW1lLmNoYXJBdChkaW1zKSA9PSAnTCcpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLgotCQkJCS8vIFN0cmlwIG9mZiB1cCB0byB0aGUgJ0wnLCBhbmQgdGhlIHRyYWlsaW5nICc7Jy4gVGhhdCBpcyB0aGUgY2xhc3MgbmFtZS4KLQkJCQlJREVCZWFuVHlwZVByb3h5IGZpbmFsVHlwZSA9IChJREVCZWFuVHlwZVByb3h5KSBnZXRCZWFuVHlwZVByb3h5KHR5cGVOYW1lLnN1YnN0cmluZyhkaW1zICsgMSwgdHlwZU5hbWUubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJaWYgKGZpbmFsVHlwZSAhPSBudWxsKQotCQkJCQlmaW5hbENvbXBvbmVudFR5cGUgPSBmaW5hbFR5cGUuZkNsYXNzOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIHR5cGUuIE5lZWQgdG8gbWFwIGl0LgotCQkJCWZpbmFsQ29tcG9uZW50VHlwZSA9IChDbGFzcykgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5NQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQodHlwZU5hbWUuc3Vic3RyaW5nKGRpbXMsIGRpbXMgKyAxKSk7Ci0JCQl9Ci0KLQkJCWlmIChmaW5hbENvbXBvbmVudFR5cGUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBkdW1teUFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZmluYWxDb21wb25lbnRUeXBlLCBuZXcgaW50W2RpbXNdKTsKLQkJCQliZWFuVHlwZVByb3h5ID0gbmV3IElERUFycmF5QmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCB0eXBlTmFtZSwgZHVtbXlBcnJheS5nZXRDbGFzcygpKTsKLQkJCQliZWFuUHJveGllcy5wdXQodHlwZU5hbWUsIGJlYW5UeXBlUHJveHkpOwotCQkJfQotCQkJcmV0dXJuIChJQmVhblR5cGVQcm94eSkgYmVhblR5cGVQcm94eTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSkgewotCQl0eXBlTmFtZSA9IE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUodHlwZU5hbWUpOwotCi0JCS8vIFNlZSB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJveHkgZm9yIHRoZSBhcmd1bWVudCBuYW1lCi0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSAoSVByb3h5QmVhblR5cGUpIGJlYW5Qcm94aWVzLmdldCh0eXBlTmFtZSk7Ci0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsgcmV0dXJuIGJlYW5UeXBlUHJveHk7IH0KLQkJCi0JCS8vIE5vdyBzZWUgaWYgYW4gZXhwcmVzc2lvbiBwcm94eSBjYWNoZWQuCi0JCWJlYW5UeXBlUHJveHkgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEJlYW5UeXBlKHR5cGVOYW1lKTsKLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkKLQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwkJCi0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeQotCQkJCQkJLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSwgZXhwcmVzc2lvbik7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQkJCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFRoZXJlIHdhcyBub3QgYSByZWdpc3RlcmVkIGZhY3RvcnkgdGhhdCBkZWFsdCB3aXRoIHRoZSBjbGFzcy4gU28gY3JlYXRlIHRoZSBleHByZXNzaW9uIHByb3h5LgotCQliZWFuVHlwZVByb3h5ID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSh0eXBlTmFtZSk7Ci0JCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCXJldHVybiBiZWFuVHlwZVByb3h5OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShnZXRBcnJheUNsYXNzbmFtZShjb21wb25lbnRDbGFzc05hbWUsIGRpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJcmV0dXJuIGdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgZ2V0QXJyYXlDbGFzc25hbWUoY29tcG9uZW50Q2xhc3NOYW1lLCBkaW1lbnNpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZQotCSAqIEBwYXJhbSBkaW1lbnNpb25zCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJyYXlDbGFzc25hbWUoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJU3RyaW5nIGpuaUNvbXBvbmVudFR5cGVOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjb21wb25lbnRDbGFzc05hbWUpOwotCQlTdHJpbmcgY29tcFR5cGUgPSBqbmlDb21wb25lbnRUeXBlTmFtZTsKLQkJaWYgKGpuaUNvbXBvbmVudFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIFdlJ3JlIG5vdCBhbHJlYWR5IGFuIGFycmF5LCBzbyBjcmVhdGUgY29ycmVjdCB0ZW1wbGF0ZS4KLQkJCWNvbXBUeXBlID0gKFN0cmluZykgTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLmdldChjb21wb25lbnRDbGFzc05hbWUpOwotCQkJaWYgKGNvbXBUeXBlID09IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhIGNsYXNzLCBhbmQgbm90IGEgdHlwZS4KLQkJCQljb21wVHlwZSA9ICJMIiArIGpuaUNvbXBvbmVudFR5cGVOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQkvLyBOb3cgY3JlYXRlIGl0IHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAnWycgaW4gZnJvbnQuCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGRpbWVuc2lvbnMgKyBjb21wVHlwZS5sZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQlidWZmZXIuYXBwZW5kKGNvbXBUeXBlKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3RvcnkjdGVybWluYXRlRmFjdG9yeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCWJlYW5Qcm94aWVzLnB1dChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpLCBhQmVhblR5cGVQcm94eSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eShJUHJveHlCZWFuVHlwZSBhUHJveHlCZWFuVHlwZSwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJaWYgKGFQcm94eUJlYW5UeXBlLmlzQmVhblByb3h5KCkpCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoKElCZWFuVHlwZVByb3h5KSBhUHJveHlCZWFuVHlwZSwgcGVybWFuZW50KTsgLy8gQSByZWd1bGFyIGtpbmQsIGRvIHJlZ3VsYXIgcmVnaXN0cmF0aW9uLgotCQllbHNlIHsKLQkJCUV4cHJlc3Npb25Qcm94eSBiZWFuRXhwcmVzc2lvblByb3h5ID0gKChFeHByZXNzaW9uUHJveHkpIGFQcm94eUJlYW5UeXBlKTsKLQkJCWZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IGFQcm94eUJlYW5UeXBlLmdldFR5cGVOYW1lKCk7Ci0JCQkoKElERUV4cHJlc3Npb24pIGJlYW5FeHByZXNzaW9uUHJveHkuZ2V0RXhwcmVzc2lvbigpKS5hZGRCZWFuVHlwZSh0eXBlTmFtZSwgYVByb3h5QmVhblR5cGUpOwotCQkJYmVhbkV4cHJlc3Npb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoSVByb3h5QmVhblR5cGUpIGV2ZW50LmdldFNvdXJjZSgpKS5nZXRUeXBlTmFtZSgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkudGhpcykgewotCQkJCQkJaWYgKCFiZWFuUHJveGllcy5jb250YWluc0tleSh0eXBlTmFtZSkpIHsKLQkJCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiByZXNvbHZlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuIFNvIHRoaXMgaXMgZ29vZC4gQWN0dWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIKLQkJCQkJCQkvLyBvY2N1ciBiZWNhdXNlIHVwb24gcmVzb2x1dGlvbiB3ZSd2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlIGJlYW4gdHlwZSBwcm94eSB0aHJvdWdoIHRoZQotCQkJCQkJCS8vIG5vcm1hbCBtZWNoYW5pc21zLiBCdXQgdG8gYmUgc2FmZSwgd2UnbGwgZG8gaXQgaGVyZS4KLQkJCQkJCQliZWFuUHJveGllcy5wdXQodHlwZU5hbWUsIGV2ZW50LmdldFByb3h5KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJKChJREVFeHByZXNzaW9uKSAoKEV4cHJlc3Npb25Qcm94eSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldEV4cHJlc3Npb24oKSkucmVtb3ZlQmVhblR5cGUodHlwZU5hbWUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gYmVhblByb3hpZXMuY29udGFpbnNLZXkoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyZWRUeXBlcygpCi0JICovCi0JcHVibGljIFNldCByZWdpc3RlcmVkVHlwZXMoKSB7Ci0JCXJldHVybiBiZWFuUHJveGllcy5rZXlTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2lzQmVhblR5cGVOb3RGb3VuZChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuVHlwZU5vdEZvdW5kKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJLy8gRG8gbm90aGluZy4gTm8gbmVlZCBmb3IgaXQgaW4gSURFIHN5c3RlbSBiZWNhdXNlIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgcHJveHksIGV2ZW4gd2hlbiBub3QgZm91bmQuCi0JCS8vIEluIHRoYXQgY2FzZSBhbiBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5IHdpbGwgYmUgY3JlYXRlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCkgewotCQkvLyBEbyBub3RoaW5nLiBObyBuZWVkIGZvciBpdCBpbiBJREUgc3lzdGVtIGJlY2F1c2UgdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBwcm94eSwgZXZlbiB3aGVuIG5vdCBmb3VuZC4KLQkJLy8gSW4gdGhhdCBjYXNlIGFuIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgd2lsbCBiZSBjcmVhdGVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbiBtYWludGFpbikgewotCQkvLyBEbyBub3RoaW5nLiBObyBuZWVkIGZvciBpdCBpbiBJREUgc3lzdGVtIGJlY2F1c2UgdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBwcm94eSwgZXZlbiB3aGVuIG5vdCBmb3VuZC4KLQkJLy8gSW4gdGhhdCBjYXNlIGFuIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgd2lsbCBiZSBjcmVhdGVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0cmluZ0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZhYTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIElTdHJpbmdCZWFuUHJveHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo0MiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIElERVN0cmluZ0JlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElTdHJpbmdCZWFuUHJveHkgewotCXByb3RlY3RlZCBTdHJpbmcgZlN0cmluZzsKLS8qKgotICogU3RvcmUgdGhlIGJlYW4gaW4gdGhlIHN0cmluZyBmaWVsZCB0byBzYXZlIHJlLWNhc3RpbmcgZWFjaCB0aW1lIGl0IGlzIGFza2VkIGZvci4KLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICovCi1JREVTdHJpbmdCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4sIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQmVhbixhQmVhblR5cGVQcm94eSk7Ci0JZlN0cmluZyA9IChTdHJpbmcpYUJlYW47Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgY2FjaGUnZCBzdHJpbmcgdGhhdCBpcyBhIGphdmEubGFuZy5TdHJpbmcgdGhhdCB0aGUgSURFIGNhbiB1c2UKLSAqLwotcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKLQlyZXR1cm4gZlN0cmluZzsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjM3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdHJpbmdCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0cmluZ0JlYW5Qcm94eTsKLS8qKgotICogSURFIEltcGxlbWVudGF0aW9uIG9mIHRoZSBCZWFuVHlwZSBwcm94eSBmb3IgamF2YS5sYW5nLlN0cmluZwotICovCi1maW5hbCBjbGFzcyBJREVTdHJpbmdCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JLy8gQ2FjaGUgYSBwcm94eSB0byBhbiBlbXB0eSBzdHJpbmcgZm9yIHNwZWVkCi0JcHJvdGVjdGVkIGZpbmFsIElERVN0cmluZ0JlYW5Qcm94eSBlbXB0eVN0cmluZ1Byb3h5OwotCi1JREVTdHJpbmdCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCS8vIENhY2hlIGEgcHJveHkgdG8gYW4gZW1wdHkgc3RyaW5nIGZvciBzcGVlZAotCWVtcHR5U3RyaW5nUHJveHkgPSBuZXcgSURFU3RyaW5nQmVhblByb3h5KGFSZWdpc3RyeSwgIiIsdGhpcyk7CS8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBzdHJpbmcgYmVhbnMKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8tb25lIGVsc2Ugb3V0c2lkZSB0aGUgcGFja2FnZSBzaG91bGQgdXNlIHRoaXMsIHRoZXkKLSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgQVBJIHdoZXJlIHlvdSBsb29rIHVwIGEgZmFjdG9yeSBmaXJzdC4KLSAqLwotSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVTdHJpbmdCZWFuUHJveHkoU3RyaW5nIGFTdHJpbmcpewotCWlmICggYVN0cmluZy5lcXVhbHMoIiIpICkgey8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVtcHR5U3RyaW5nUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBJREVTdHJpbmdCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFTdHJpbmcsdGhpcyk7Ci0JfQotfQotLyogU3BlY2lhbGl6ZWQgZnJvbSBJREVCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBJU3RyaW5nQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5Ci0gKi8KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JcmV0dXJuIChJSURFQmVhblByb3h5KWNyZWF0ZVN0cmluZ0JlYW5Qcm94eSggKFN0cmluZylhbk9iamVjdCApOwotCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVRocm93YWJsZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVRocm93YWJsZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDBlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVUaHJvd2FibGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFVGhyb3dhYmxlUHJveHkgZXh0ZW5kcyBUaHJvd2FibGVQcm94eSBpbXBsZW1lbnRzIElJREVCZWFuUHJveHkgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTYyNzU3OTYxMTc1OTc4MzM4TDsKLQlwcm90ZWN0ZWQgSUJlYW5UeXBlUHJveHkgZkJlYW5UeXBlUHJveHk7Ci0KLQlwcm90ZWN0ZWQgSURFVGhyb3dhYmxlUHJveHkoVGhyb3dhYmxlIGV4YywgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQkJc3VwZXIoZXhjKTsKLQkJZkJlYW5UeXBlUHJveHkgPSBhQmVhblR5cGVQcm94eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpIHsKLQkJCXJldHVybiBnZXRDYXVzZSgpLmVxdWFscygoKElJREVCZWFuUHJveHkpIG9iaikuZ2V0QmVhbigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBJSURFQmVhblByb3h5KQotCQkJcmV0dXJuIGdldENhdXNlKCkgPT0gKChJSURFQmVhblByb3h5KSBhQmVhblByb3h5KS5nZXRCZWFuKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkuZ2V0TWVzc2FnZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHdyaXRlcikgewotCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHN0cmVhbSkgewotCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZShzdHJlYW0pOwotCX0KLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZSgpIHsKLQkJZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5OwotCX0KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJcmV0dXJuIGdldENhdXNlKCkudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhjZXB0aW9uIHdoaWNoIGlzIHRoZSBsaXZlIGJlYW4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0JCXJldHVybiBnZXRDYXVzZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVWTVNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVWTVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGVkMjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFVk1TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLQotcHVibGljIGNsYXNzIElERVZNU2VydmVyIGltcGxlbWVudHMgSVZNQ2FsbGJhY2tTZXJ2ZXIgewotCQotCUlERUNhbGxiYWNrUmVnaXN0cnkgZkNhbGxiYWNrUmVnaXN0cnk7Ci0JSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZCZWFuUHJveHlGYWN0b3J5OwotCQotSURFVk1TZXJ2ZXIoSURFQ2FsbGJhY2tSZWdpc3RyeSBhQ2FsbGJhY2tSZWdpc3RyeSl7Ci0JZkNhbGxiYWNrUmVnaXN0cnkgPSBhQ2FsbGJhY2tSZWdpc3RyeTsKLQlmQmVhblByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpZkNhbGxiYWNrUmVnaXN0cnkuZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkKLX0JCi1wdWJsaWMgT2JqZWN0IGRvQ2FsbGJhY2soSUNhbGxiYWNrUnVubmFibGUgYVJ1bm5hYmxlKXsKLQl0cnkgewotCQlyZXR1cm4gYVJ1bm5hYmxlLnJ1bihuZXcgSUNhbGxiYWNrSGFuZGxlcigpewotCQkJcHVibGljIE9iamVjdCBjYWxsYmFja1dpdGhQYXJtcyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCQkJLy8gV2UgYXJlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgSURFIHNvIGp1c3QgY2FsbCB0aGUgcmVnaXN0cnkgZGlyZWN0bHkKLQkJCQkvLyBhbHRob3VnaCB3ZSBtdXN0IGNvbnZlcnQgdGhlIHBhcm1zIHRvIGJlYW4gcHJveGllcwotCQkJCU9iamVjdFtdIHByb3h5UGFybXMgPSBudWxsOwotCQkJCS8vIElmIHdlIGhhdmUgYW55IHBhcm1zIHRoZW4gY29udmVydCB0aGVtIHRvIGJlYW4gcHJveGllcwotCQkJCWlmICggcGFybXMgIT0gbnVsbCApIHsKLQkJCQkJcHJveHlQYXJtcyA9IG5ldyBPYmplY3RbcGFybXMubGVuZ3RoXTsKLQkJCQkJZm9yICggaW50IGk9MDtpPHBhcm1zLmxlbmd0aDtpKyspewotCQkJCQkJT2JqZWN0IHAgPSBwYXJtc1tpXTsKLQkJCQkJCXByb3h5UGFybXNbaV0gPSBjcmVhdGVOZXh0UGFybShwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZkNhbGxiYWNrUmVnaXN0cnkudm1DYWxsYmFjayhjYWxsYmFja0lELG1zZ0lELHByb3h5UGFybXMpOwotCQkJfQotCi0JCQlwcml2YXRlIE9iamVjdCBjcmVhdGVOZXh0UGFybShPYmplY3QgcCkgewotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBJQ2FsbGJhY2tIYW5kbGVyLlRyYW5zbWl0YWJsZUFycmF5KSkgewotCQkJCQlyZXR1cm4gZkJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlSURFQmVhblByb3h5V2l0aChwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3RbXSBhcnJheSA9ICgoSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgcCkuZ2V0QXJyYXkoKTsKLQkJCQkJT2JqZWN0W10gcGFybSA9IG5ldyBPYmplY3RbYXJyYXkubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQkJcGFybVtpXSA9IGNyZWF0ZU5leHRQYXJtKGFycmF5W2ldKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcGFybTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2tIYW5kbGVyI2NhbGxiYWNrQXNDb25zdGFudHMoaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tBc0NvbnN0YW50cyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3QgcGFybSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkJCXJldHVybiBmQ2FsbGJhY2tSZWdpc3RyeS52bUNhbGxiYWNrKGNhbGxiYWNrSUQsbXNnSUQscGFybSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9IGNhdGNoICggQ29tbWFuZEV4Y2VwdGlvbiBleGMgKSB7Ci0JCXJldHVybiBudWxsOwkKLQl9Ci19Ci0KLXB1YmxpYyBPdXRwdXRTdHJlYW0gcmVxdWVzdFN0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5LnJlcXVlc3RTdHJlYW0oY2FsbGJhY2tJRCxtc2dJRCk7Ci19Ci1wdWJsaWMgSVZNU2VydmVyIGdldElWTVNlcnZlcigpIHsKLQlyZXR1cm4gZkNhbGxiYWNrUmVnaXN0cnkuZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSUlERUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JSURFQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZmM0MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JSURFQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLQotCi0vKioKLSAqIEludGVyZmFjZSB0aGF0IGFsbG93cyB0aGUgSURFIFZNIHRvIGdldCB0aGUgYWN0dWFsIGJlYW4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUlERUJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotLyoqCi0gKiBHZXQgdGhlIGFjdHVhbCBsaXZlIGJlYW4uIAotICogVVNFIHdpdGggZXh0cmVtZSBjYXJlLgotICovCi1wdWJsaWMgT2JqZWN0IGdldEJlYW4oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjQ0MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklEaW1lbnNpb25CZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVPYmplY3RCZWFuUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIElERURpbWVuc2lvbkJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElEaW1lbnNpb25CZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBEaW1lbnNpb24gZkRpbWVuc2lvbjsKLQotSURFRGltZW5zaW9uQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSxPYmplY3QgYURpbWVuc2lvbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpewotCXN1cGVyKGFSZWdpc3RyeSxhRGltZW5zaW9uLGFCZWFuVHlwZVByb3h5KTsKLQlmRGltZW5zaW9uID0gKERpbWVuc2lvbilhRGltZW5zaW9uOwotfQotcHVibGljIGludCBnZXRXaWR0aCgpewotCXJldHVybiBmRGltZW5zaW9uLndpZHRoOwotfQotcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IGFXaWR0aCl7Ci0JZkRpbWVuc2lvbi53aWR0aCA9IGFXaWR0aDsKLX0KLXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCl7Ci0JcmV0dXJuIGZEaW1lbnNpb24uaGVpZ2h0OwotfQotcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBhSGVpZ2h0KXsKLQlmRGltZW5zaW9uLmhlaWdodCA9IGFIZWlnaHQ7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTaXplKElEaW1lbnNpb25CZWFuUHJveHkgYUJlYW5Qcm94eSl7Ci0JZkRpbWVuc2lvbi5zZXRTaXplKG5ldyBEaW1lbnNpb24oYUJlYW5Qcm94eS5nZXRXaWR0aCgpLGFCZWFuUHJveHkuZ2V0SGVpZ2h0KCkpKTsKLX0KLXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlmRGltZW5zaW9uLndpZHRoID0gd2lkdGg7Ci0JZkRpbWVuc2lvbi5oZWlnaHQgPSBoZWlnaHQ7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2E3ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVEaW1lbnNpb25CZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLUlERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KXsKLQl0aGlzKGFSZWdpc3RyeSxEaW1lbnNpb24uY2xhc3MpOwotfQotCi1wcml2YXRlIElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyB0eXBlKXsKLQlzdXBlcihhUmVnaXN0cnksIHR5cGUpOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiBuZXcgSURFRGltZW5zaW9uQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi19Ci1JREVEaW1lbnNpb25CZWFuUHJveHkgY3JlYXRlRGltZW5zaW9uQmVhblByb3h5KGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JcmV0dXJuIG5ldyBJREVEaW1lbnNpb25CZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBEaW1lbnNpb24od2lkdGgsaGVpZ2h0KSx0aGlzKTsKLX0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzKQotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gbmV3IElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCB0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVQb2ludEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdhZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVBvaW50QmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFT2JqZWN0QmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBJREVQb2ludEJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElQb2ludEJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFBvaW50IGZQb2ludDsKLQotSURFUG9pbnRCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LE9iamVjdCBhUG9pbnQsIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KXsKLQlzdXBlcihhUmVnaXN0cnksYVBvaW50LGFCZWFuVHlwZVByb3h5KTsKLQlmUG9pbnQgPSAoUG9pbnQpYVBvaW50OwotfQotcHVibGljIGludCBnZXRYKCl7Ci0JcmV0dXJuIGZQb2ludC54OwotfQotcHVibGljIHZvaWQgc2V0WChpbnQgYW5YKXsKLQlmUG9pbnQueCA9IGFuWDsKLX0KLXB1YmxpYyBpbnQgZ2V0WSgpewotCXJldHVybiBmUG9pbnQueTsKLX0KLXB1YmxpYyB2b2lkIHNldFkoaW50IGFZKXsKLQlmUG9pbnQueSA9IGFZOwotfQotcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGFCZWFuUHJveHkpewotCWZQb2ludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoYUJlYW5Qcm94eS5nZXRYKCksYUJlYW5Qcm94eS5nZXRZKCkpKTsKLX0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCBhblgsIGludCBhWSl7Ci0JZlBvaW50LnggPSBhblg7Ci0JZlBvaW50LnkgPSBhWTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNGZiOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFUG9pbnRCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLUlERVBvaW50QmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCXRoaXMoYVJlZ2lzdHJ5LFBvaW50LmNsYXNzKTsKLX0KLXByaXZhdGUgSURFUG9pbnRCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgdHlwZSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LHR5cGUpOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gbmV3IElERVBvaW50QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi19Ci1JREVQb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eShpbnQgeCwgaW50IHkpewotCXJldHVybiBuZXcgSURFUG9pbnRCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBQb2ludCh4LHkpLHRoaXMpOwotfQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgSURFUG9pbnRCZWFuVHlwZVByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgdHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWN0YW5nbGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWEyZjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFT2JqZWN0QmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBJREVSZWN0YW5nbGVCZWFuUHJveHkgZXh0ZW5kcyBJREVPYmplY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJUmVjdGFuZ2xlQmVhblByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGZSZWN0YW5nbGU7Ci0KLUlERVJlY3RhbmdsZUJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksT2JqZWN0IGFSZWN0YW5nbGUsIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KXsKLQlzdXBlcihhUmVnaXN0cnksYVJlY3RhbmdsZSxhQmVhblR5cGVQcm94eSk7Ci0JZlJlY3RhbmdsZSA9IChSZWN0YW5nbGUpYVJlY3RhbmdsZTsKLX0KLXB1YmxpYyBpbnQgZ2V0WCgpewotCXJldHVybiBmUmVjdGFuZ2xlLng7Ci19Ci1wdWJsaWMgdm9pZCBzZXRYKGludCBhblgpewotCWZSZWN0YW5nbGUueCA9IGFuWDsKLX0KLXB1YmxpYyBpbnQgZ2V0WSgpewotCXJldHVybiBmUmVjdGFuZ2xlLnk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRZKGludCBhWSl7Ci0JZlJlY3RhbmdsZS55ID0gYVk7Ci19Ci1wdWJsaWMgaW50IGdldEhlaWdodCgpewotCXJldHVybiBmUmVjdGFuZ2xlLmhlaWdodDsKLX0KLXB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgYUhlaWdodCl7Ci0JZlJlY3RhbmdsZS5oZWlnaHQgPSBhSGVpZ2h0OwotfQotcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IGFXaWR0aCl7Ci0JZlJlY3RhbmdsZS53aWR0aCA9IGFXaWR0aDsKLX0KLXB1YmxpYyBpbnQgZ2V0V2lkdGgoKXsKLQlyZXR1cm4gZlJlY3RhbmdsZS53aWR0aDsKLX0KLXB1YmxpYyB2b2lkIHNldEJvdW5kcyhJUmVjdGFuZ2xlQmVhblByb3h5IGFCZWFuUHJveHkpewotCWZSZWN0YW5nbGUuc2V0Qm91bmRzKGFCZWFuUHJveHkuZ2V0WCgpLGFCZWFuUHJveHkuZ2V0WSgpLGFCZWFuUHJveHkuZ2V0V2lkdGgoKSxhQmVhblByb3h5LmdldEhlaWdodCgpKTsKLX0KLXB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JZlJlY3RhbmdsZS5zZXRCb3VuZHMoeCx5LHdpZHRoLGhlaWdodCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTaXplKElEaW1lbnNpb25CZWFuUHJveHkgYUJlYW5Qcm94eSl7Ci0JZlJlY3RhbmdsZS5zZXRTaXplKGFCZWFuUHJveHkuZ2V0V2lkdGgoKSxhQmVhblByb3h5LmdldFdpZHRoKCkpOwotfQotcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGFCZWFuUHJveHkpewotCWZSZWN0YW5nbGUuc2V0TG9jYXRpb24oYUJlYW5Qcm94eS5nZXRYKCksYUJlYW5Qcm94eS5nZXRZKCkpOwotfQotcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KXsKLQlmUmVjdGFuZ2xlLnNldExvY2F0aW9uKHgseSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JZlJlY3RhbmdsZS5zZXRTaXplKHdpZHRoLGhlaWdodCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTMzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0KLUlERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KXsKLQl0aGlzKGFSZWdpc3RyeSxSZWN0YW5nbGUuY2xhc3MpOwotfQotCi1wcml2YXRlIElERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyB0eXBlKXsKLQlzdXBlcihhUmVnaXN0cnksdHlwZSk7Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiBuZXcgSURFUmVjdGFuZ2xlQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi19Ci1JREVSZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlUmVjdGFuZ2xlQmVhblByb3h5KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlyZXR1cm4gbmV3IElERVJlY3RhbmdsZUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IFJlY3RhbmdsZSh4LHksd2lkdGgsaGVpZ2h0KSx0aGlzKTsKLX0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzKQotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gbmV3IElERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCB0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlZ2lzdGVyQVdULmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWdpc3RlckFXVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc0ODdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlZ2lzdGVyQVdULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVQcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBBV1QgZmFjdG9yaWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFUmVnaXN0ZXJBV1QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFXVChJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQluZXcgSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCW5ldyBJREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVTdGFuZGFyZEFXVEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MzNmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0KLQotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0vKioKLSAqIFN0YW5kYXJkIEFXVCBCZWFuIFByb3h5IEZhY3RvcnkuCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGl0IHNob3VsZCBub3QgcmVmZXJlbmNlZAotICogb3V0c2lkZSBvZiB0aGUgcGFja2FnZSBvdGhlciB0aGFuIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLSAqLwotY2xhc3MgSURFU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeSB7Ci0KLQlmaW5hbCBJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5IGZBV1RCZWFuVHlwZUZhY3Rvcnk7Ci0JCi1wdWJsaWMgSURFU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnkpIHsKLQlmYWN0b3J5LnJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeShJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LlJFR0lTVFJZX0tFWSwgdGhpcyk7Ci0JZkFXVEJlYW5UeXBlRmFjdG9yeSA9IChJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KWZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24oSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5CRUFOX1RZUEVfRkFDVE9SWV9LRVkpOwotfQotcHVibGljIElEaW1lbnNpb25CZWFuUHJveHkgY3JlYXRlRGltZW5zaW9uQmVhblByb3h5V2l0aChpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCXJldHVybiBmQVdUQmVhblR5cGVGYWN0b3J5LmRpbWVuc2lvblR5cGUuY3JlYXRlRGltZW5zaW9uQmVhblByb3h5KHdpZHRoLGhlaWdodCk7Ci19Ci0KLXB1YmxpYyBJUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSl7Ci0JcmV0dXJuIGZBV1RCZWFuVHlwZUZhY3RvcnkucG9pbnRUeXBlLmNyZWF0ZVBvaW50QmVhblByb3h5KHgseSk7Ci19Ci1wdWJsaWMgSVJlY3RhbmdsZUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlyZXR1cm4gZkFXVEJlYW5UeXBlRmFjdG9yeS5yZWN0YW5nbGVUeXBlLmNyZWF0ZVJlY3RhbmdsZUJlYW5Qcm94eSh4LHksd2lkdGgsaGVpZ2h0KTsKLX0KLXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YTYyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS4qOwotCi0vKioKLSAqIEJlYW5UeXBlIGZhY3Rvcnkgc3RhbmRhcmQgQVdUIGJlYW4gdHlwZXMuIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBzaG91bGRuJ3QgYmUgcmVmZXJlbmNlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBJdCBzaG91bGQgb25seSBiZQotICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotICovCi1jbGFzcyBJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1RZUEVfRkFDVE9SWV9LRVkgPSAiamF2YS5hd3QiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3RvcnlSZWdpc3RyeTsKLQotCXByb3RlY3RlZCBmaW5hbCBJREVEaW1lbnNpb25CZWFuVHlwZVByb3h5IGRpbWVuc2lvblR5cGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSURFUG9pbnRCZWFuVHlwZVByb3h5IHBvaW50VHlwZTsKLQotCXByb3RlY3RlZCBmaW5hbCBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5IHJlY3RhbmdsZVR5cGU7Ci0KLQlJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmRmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlmRmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoQkVBTl9UWVBFX0ZBQ1RPUllfS0VZLCB0aGlzKTsKLQkJZGltZW5zaW9uVHlwZSA9IG5ldyBJREVEaW1lbnNpb25CZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlwb2ludFR5cGUgPSBuZXcgSURFUG9pbnRCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlyZWN0YW5nbGVUeXBlID0gbmV3IElERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0KLQkJaWYgKCJqYXZhLmF3dC5EaW1lbnNpb24iLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZGltZW5zaW9uVHlwZTsKLQkJZWxzZSBpZiAoImphdmEuYXd0LlBvaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBvaW50VHlwZTsKLQkJZWxzZSBpZiAoImphdmEuYXd0LlJlY3RhbmdsZSIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZWN0YW5nbGVUeXBlOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lLCBJQmVhblR5cGVQcm94eSBiZWFuVHlwZVByb3h5KSB7Ci0KLQkJcmV0dXJuIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIElQcm94eUJlYW5UeXBlIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZEVycm9yRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZEVycm9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTc5YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0NvbW1hbmRFcnJvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0vKioKLSAqIEFuIGVycm9yIHJldHVybiBmcm9tIGEgY29tbWFuZC4gVGhpcyBpcyBjbGVhbiByZXR1cm4gaW4gdGhhdAotICogdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgdmFsaWQgYW5kIGFsaXZlLgotICogQWZ0ZXIgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkIHRoZSBkYXRhIHdpbGwgYmUgdGhlIHZhbHVlIHJldHJpZXZlZAotICogb3V0IG9mIHRoZSB2YWx1ZW9iamVjdCBhbmQgbWFkZSBpbnRvIGEgcHJveHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE3MDE3NTIwMzU2MDY1OTMzMDVMOwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGZFcnJvck9iamVjdDsKLQlwcml2YXRlIGZpbmFsIGludCBmRXJyb3JDb2RlOwotCQotCXB1YmxpYyBDb21tYW5kRXJyb3JFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgZXJyb3JEYXRhKSB7Ci0JCXN1cGVyKGVycm9yRGF0YS5jbG9uZSgpKTsJLy8gQ2xvbmUgaXQgYmVjYXVzZSB0eXBpY2FsbHkgdGhlc2UgZ2V0IHJldXNlZCBhbmQgY2xlYXJlZCBvdXQuIFRoaXMgd2F5IHdlIGhhdmUgb3VyIG93bi4KLQkJZkVycm9yT2JqZWN0ID0gbnVsbDsKLQkJZkVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRFcnJvckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBpbnQgZXJyb3JDb2RlLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBlcnJvckRhdGEsIE9iamVjdCBlcnJvck9iamVjdCkgewotCQlzdXBlcihtc2csIGVycm9yRGF0YS5jbG9uZSgpKTsKLQkJZkVycm9yT2JqZWN0ID0gZXJyb3JPYmplY3Q7Ci0JCWZFcnJvckNvZGUgPSBlcnJvckNvZGU7CQkKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKENvbW1hbmRzLlZhbHVlT2JqZWN0KSBnZXRFeGNlcHRpb25EYXRhKCk7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY292ZXJhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsJLy8gQ29tbWFuZCBlcnJvcnMgYXJlIHJlY292ZXJhYmxlLgotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUuCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7Ci0JCXJldHVybiBmRXJyb3JDb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIG9iamVjdCBhZnRlciBjb252ZXJzaW9uIHRvIHByb3h5IGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVycm9yT2JqZWN0KCkgewotCQlyZXR1cm4gZkVycm9yT2JqZWN0OwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICItLSBFcnJvciBjb2RlOiIrZ2V0RXJyb3JDb2RlKCkgKyAoZ2V0VmFsdWUoKSAhPSBudWxsID8gIiBWYWx1ZSBkYXRhOlwiIiArIGdldFZhbHVlKCkuZ2V0QXNPYmplY3QoKSArICJcIiIgOiAiICIpICsgKGZFcnJvck9iamVjdCAhPSBudWxsID8gIiBFcnJvciBvYmplY3Q6XCIiK2ZFcnJvck9iamVjdC50b1N0cmluZygpKyJcIiIgOiAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ2OTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhlIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHBhc3NlZCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuCi0gKiBjbGllbnQgYW5kIHNlcnZlci4gQW5kIG90aGVyIGNvbnN0YW50cy4KLSAqCi0gKiAtIENvbnRhaW5zIGhlbHBlciBtZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgY29tbWFuZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kcyB7Ci0JLy8gVGhlIGNvbW1hbmRzIHdpbGwgYmUgd3JpdHRlbiBpbiB3cml0ZUJ5dGUgZm9ybWF0IC4KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJ5dGUKLQkJR0VUX0NMQVNTID0gMSwJCS8vIEdldCB0aGUgY2xhc3Mgb2JqZWN0LAotCQlWQUxVRSA9IDIsCQkvLyBSZXR1cm5pbmcgYSB2YWx1ZQotCQlRVUlUX0NPTk5FQ1RJT04gPSA0LAkvLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24KLQkJVEVSTUlOQVRFX1NFUlZFUiA9IDUsCS8vIFRlcm1pbmF0ZSB0aGUgZW50aXJlIHNlcnZlci4KLQkJRVJST1IgPSA2LAkJLy8gUmV0dXJuaW5nIGFuIGVycm9yCi0JCVJFTEVBU0VfT0JKRUNUID0gNywJLy8gQW4gb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQgb24gdGhlIGNsaWVudCBzaWRlLCBzbwotCQkJCQkvLyBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIgaWQgdGFibGUgYW5kIHJlbGVhc2VkLgotCQlHRVRfQ0xBU1NfUkVUVVJOID0gOCwJLy8gVGhlIHJldHVybiBjb21tYW5kIGZyb20gR0VUX0NMQVNTCi0JCS8vIE9ic29sZXRlLCBub3QgdXNlZCBhbnltb3JlIEdFVF9NRVRIT0QgPSA5LAkvLyBSZXR1cm4gdGhlIGlkIGZvciBhIG1ldGhvZAotCQkvLyBPYnNvbGV0ZSwgbm90IHVzZWQgYW55bW9yZSBHRVRfQ1RPUiA9IDEwLAkJLy8gUmV0dXJuIHRoZSBpZCBmb3IgYSBjb25zdHJ1Y3RvcgkJCi0JCU5FV19JTklUX1NUUklORyA9IDExLAkvLyBDcmVhdGUgYSBuZXcgYmVhbiB1c2luZyB0aGUgaW5pdCBzdHJpbmcKLQkJR0VUX0NMQVNTX0ZST01fSUQgPSAxMiwJLy8gV2UgaGF2ZSBhbiBJRCwgcmV0dXJuIHRoZSBjbGFzcyBpbmZvIGZvciB0aGlzIGlkLgotCQlHRVRfQ0xBU1NfSURfUkVUVVJOID0gMTMsCS8vIFRoZSByZXR1cm4gY29tbWFuZCBmcm9tIEdFVF9DTEFTU19GUk9NX0lECi0JCUdFVF9PQkpFQ1RfREFUQSA9IDE0LAkvLyBXZSBoYXZlIGFuIElELCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgaW5mbywgcmV0dXJuIGl0LiBUaGlzIGlzIGEgCi0JCQkJCS8vIGNvcnJlY3RpdmUgY29tbWFuZCBvbmx5LiBUaGlzIHdvdWxkIGhhcHBlbiBpZiBmb3Igc29tZSBzdHJhbmdlCi0JCQkJCS8vIHJlYXNvbiB0aGUgcHJveHkgaGFzIGJlZW4gcmVtb3ZlZCBidXQgaGFzIG5vdCBiZWVuIHJlbGVhc2VkLiBUaGlzCi0JCQkJCS8vIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuIGV4Y2VwdCBhcyBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4KLQkJCQkJLy8gR0MgYW5kIHJldHVybmluZyBpZCBmcm9tIHRoZSBzZXJ2ZXIuCi0JCUlOVk9LRSA9IDE1LAkJLy8gSW52b2tlIGEgbWV0aG9kLgotCQotCQotCQkvLyBUaGVzZSBjb21tYW5kcyBhcmUgdG8gdGhlIE1hc3RlciBTZXJ2ZXIgdGhyZWFkIGluIHRoZSBJREUuCi0JCUFMSVZFID0gMTYsCS8vIEFyZSB5b3UgYWxpdmU/Ci0JCVJFTU9URV9TVEFSVEVEID0gMTcsCS8vIFJlbW90ZSBWTSBoYXMgc3RhcnRlZC4KLQkJQVRUQUNIX0NBTExCQUNLID0gMTgsCS8vIEF0dGFjaCB0byBhIGNhbGxiYWNrIHRocmVhZCBvbiB0aGUgSURFIHNpZGUuIFRoZSByZW1vdGUgdm0gd2lsbCB1c2UgaXRzIHNvY2tldCBhcyB0aGUgY2FsbGJhY2sgc29ja2V0LgotCQkJCQkJCQkvLyBpdCB3aWxsIHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0dGFjaCB3b3JrZWQgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGZhaWxlZC4KLQotCQkvLyBUaGVzZSBhcmUgbW9yZSByZWd1bGFyIGNvbW1hbmRzLiBUaGV5IHdlcmUgaGlzdG9yaWNhbGx5IGFkZGVkIGFmdGVyIHRoZSBtYXN0ZXIgc2VydmVyIHRocmVhZCBjb21tYW5kcywgc28KLQkJLy8gdGhleSBhcmUgc2hvd24gaGVyZSBhZnRlciB0aGVtIGFuZCB3aXRoIG51bWJlcnMgZ3JlYXRlciB0aGFuIHRoZW0uCi0JCUVYUFJFU1NJT05fVFJFRV9DT01NQU5EID0gMTksCS8vIEFuIGV4cHJlc3Npb24gdHJlZSBzdWJjb21tYW5kIGhhcyBjb21lIGluLgotCQlJTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEID0gMjAsCS8vIEludm9rZSB3aGVyZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgY29tbWFuZC4KLQkJR0VUX0FSUkFZX0NPTlRFTlRTID0gMjE7CS8vIEdldCB0aGUgZmlyc3QgZGltZW5zaW9uIGNvbnRlbnRzIGFzIGFuIGFycmF5IG9mIGlkcyBhbmQgc2VuZCB0aGVtIGJhY2suCi0JCi0JCQotCS8vIENhbGxiYWNrIGNvbW1hbmRzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBieXRlCi0JCUNBTExCQUNLID0gKGJ5dGUpIDI1NSwJLy8gQSBjYWxsYmFjayBoYXMgY29tZSBpbi4KLQkJQ0FMTEJBQ0tfRE9ORSA9IChieXRlKSAyNTQsCS8vIEEgY2FsbGJhY2sgZG9uZSBjb21tYW5kLCBzZW50IHRvIHRoZSByZW1vdGUgdm0gdXBvbiBjYWxsYmFjayBjb21wbGV0aW9uLgotCQlDQUxMQkFDS19TVFJFQU0gPSAoYnl0ZSkgMjUzLAkvLyBBIGNhbGxiYWNrIGZvciBhIGJ5dGUgc3RyZWFtIGhhcyBjb21lIGluLgotCQkJCQkJCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYWxsYmFjay4gV2hlbiB0aGlzIGNvbWVzIGluIGEgc3BlY2lhbAotCQkJCQkJCQkvLyBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjcmVhdGVkIHRoYXQgd2lsbCB0YWtlIG92ZXIgY29udHJvbCBvZgotCQkJCQkJCQkvLyB0aGUgY29ubmVjdGlvbiB1bnRpbCB0aGUgc3RyZWFtIGlzIHRlcm1pbmF0ZWQgb24gdGhlIHJlbW90ZQotCQkJCQkJCQkvLyBzaWRlLiBBdCB0aGlzIHRpbWUgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSByZXR1cm5lZC4KLQkJQ0FMTEJBQ0tfU1RSRUFNX1RFUk1JTkFURSA9IChieXRlKSAyNTI7CS8vIEEgY2FsbGJhY2sgc3RyZWFtIGlzIGFza2VkIHRvIHRlcm1pbmF0ZSBlYXJseS4KLQkJCi0JLy8gVGhlIGVycm9yIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIG9uIHRoZSBzZXJ2ZXIuCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQKLQkJTk9fRVJST1IgPSAwLAkJCQkvLyBObyBlcnJvciBzdGF0dXMuCi0JCVVOS05PV05fQ09NTUFORF9TRU5UID0gMSwJLy8gQW4gdW5rbm93biBjb21tYW5kIHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIuIFZhbHVlIGlzIHZvaWQuCi0JCUdFVF9DTEFTU19OT1RfRk9VTkQgPSAyLAkvLyBUaGUgY2xhc3Mgd2FzIG5vdCBmb3VuZCBpbiBHZXRDbGFzcy4gVmFsdWUgaXMgdm9pZC4KLQkJQ0FOTk9UX0VWQUxVQVRFX1NUUklORyA9IDMsCS8vIEV2YWx1YXRvciBjb3VsZG4ndCBldmFsdWF0ZSB0aGUgaW5pdCBzdHJpbmcuIFRvbyBjb21wbGljYXRlZC4gVmFsdWUgaXMgYSB0aHJvd2FibGUgb2YgdGhlIHdyYXBwZXJlZCBJbml0IHN0cmluZyBlcnJvci4KLQkJQ0xBU1NfQ0FTVF9FWENFUFRJT04gPSA0LAkvLyBUaGUgcmVzdWx0IGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSBleHBlY3RlZCB0eXBlLiBWYWx1ZSBpcyB2b2lkLgotCQlHRVRfTUVUSE9EX05PVF9GT1VORCA9IDUsCS8vIE1ldGhvZCByZXF1ZXN0ZWQgd2Fzbid0IGZvdW5kLiBWYWx1ZSBpcyB2b2lkLgotCQlUSFJPV0FCTEVfU0VOVCA9IDYsCQkJLy8gQSBUaHJvd2FibGUgaXMgYmVpbmcgc2VudCBiYWNrIGFzIHRoZSBlcnJvciwgbm90IGFzIGp1c3QgZGF0YSBmb3IgdGhlIGVycm9yLiBWYWx1ZSBpcyB0aGUgVGhyb3dhYmxlLgotCQlDQUxMQkFDS19SVU5USU1FX0VYQ0VQVElPTiA9IDcsCS8vIEEgcnVudGltZSBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGEgY2FsbGJhY2suIFRoZSBkYXRhIGlzIHRoZSBtZXNzYWdlLgotCQlDQUxMQkFDS19OT1RfUkVHSVNURVJFRCA9IDgsCi0JCU1BWF9FUlJPUl9DT0RFID0gQ0FMTEJBQ0tfTk9UX1JFR0lTVEVSRUQ7CS8vIFRoaXMgaXMganVzdCB0aGUgbWF4IGNvZGUuIE5vdCBhY3R1YWxseSBzZW50LiBVc2VkIGFzIGEgZmxhZy4KLQkJCi0JLy8gUHJlZGVmaW5lZCBzdGFuZGFyZCBpZCdzIGZvciBzdGFuZGFyZCBjbGFzc2VzL29iamVjdHMuIEJvdGggc2lkZXMgd2lsbCBhc3N1bWUgdGhlc2UgaWQncyBoYXZlIGJlZW4gYXNzaWduZWQKLQkvLyB0byB0aGVzZSBjbGFzc2VzL3R5cGVzL29iamVjdHMKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludAotCQlOT1RfQU5fSUQgPSAtMSwJLy8gVGhpcyB2YWx1ZSBtZWFucyBpdCBpcyBub3QgYW4gaWQuIEl0IGlzIG5ldmVyIGEgdmFsaWQgaWQuCi0JCVZPSURfVFlQRSA9IDAsCi0JCUJPT0xFQU5fVFlQRSA9IDEsCi0JCUJPT0xFQU5fQ0xBU1MgPSAyLAotCQlJTlRFR0VSX1RZUEUgPSAzLAotCQlJTlRFR0VSX0NMQVNTID0gNCwKLQkJQllURV9UWVBFID0gNSwKLQkJQllURV9DTEFTUyA9IDYsCi0JCUNIQVJBQ1RFUl9UWVBFID0gNywKLQkJQ0hBUkFDVEVSX0NMQVNTID0gOCwKLQkJRE9VQkxFX1RZUEUgPSA5LAotCQlET1VCTEVfQ0xBU1MgPSAxMCwKLQkJRkxPQVRfVFlQRSA9IDExLAotCQlGTE9BVF9DTEFTUyA9IDEyLAotCQlTSE9SVF9UWVBFID0gMTMsCi0JCVNIT1JUX0NMQVNTID0gMTQsCi0JCUxPTkdfVFlQRSA9IDE1LAotCQlMT05HX0NMQVNTID0gMTYsCi0JCVNUUklOR19DTEFTUyA9IDE3LAotCQlCSUdfREVDSU1BTF9DTEFTUyA9IDE4LAotCQlCSUdfSU5URUdFUl9DTEFTUyA9IDE5LAotCQlOVU1CRVJfQ0xBU1MgPSAyMCwKLQkJVEhST1dBQkxFX0NMQVNTID0gMjEsCi0JCUNMQVNTX0NMQVNTID0gMjIsCi0JCU9CSkVDVF9DTEFTUyA9IDIzLAotCQlBQ0NFU1NJQkxFT0JKRUNUX0NMQVNTID0gMjQsCi0JCU1FVEhPRF9DTEFTUyA9IDI1LAotCQlGSUVMRF9DTEFTUyA9IDI2LAotCQlDT05TVFJVQ1RPUl9DTEFTUyA9IDI3LAotCQlHRVRfTUVUSE9EX0lEID0gMjgsCS8vIENsYXNzLmdldE1ldGhvZCguLi4pIHByZWRlZmluZWQgaWQuCi0JCUlWTVNFUlZFUl9DTEFTUyA9IDI5LAkvLyBJVk1TZXJ2ZXIuY2xhc3MKLQkJSUNBTExCQUNLX0NMQVNTID0gMzAsCS8vIElDYWxsYmFjay5jbGFzcwotCQlSRU1PVEVTRVJWRVJfSUQgPSAzMSwJLy8gaWQgb2YgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgaW5zdGFuY2UuCi0JCVJFTU9URVZNU0VSVkVSX0NMQVNTID0gMzIsCS8vIFJlbW90ZVZNU2VydmVyLmNsYXNzCi0JCUlOSVRJQUxJWkVDQUxMQkFDS19NRVRIT0RfSUQgPSAzMywJLy8gSUNhbGxiYWNrLmluaXRpYWxpemVDYWxsYmFjayBtZXRob2QuCi0JCVRIUkVBRF9DTEFTUyA9IDM0LAotCQlFWFBSRVNTSU9OUFJPQ0VTU0VSQ09OVFJPTExFUl9DTEFTUyA9IDM1LAotCQlGSVJTVF9GUkVFX0lEID0gMzY7Ci0JCQkJCi0JLy8gVGhlIHR5cGUgZmxhZ3Mgd3JpdHRlbiBpbiB3cml0ZUJ5dGUgZm9ybWF0Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBieXRlCi0JCVZPSUQgPSBWT0lEX1RZUEUsCS8vIG51bGwgLSBub3RoaW5nIGZvbGxvd3MKLQkJQllURSA9IEJZVEVfVFlQRSwJLy8gYnl0ZSAtIHdyaXRlQnl0ZQotCQlMX0JZVEUgPSBCWVRFX0NMQVNTLAkvLyBqYXZhLmxhbmcuQnl0ZSAtIHdyaXRlQnl0ZQotCQlDSEFSID0gQ0hBUkFDVEVSX1RZUEUsCS8vIGNoYXIgLSB3cml0ZUNoYXIKLQkJTF9DSEFSID0gQ0hBUkFDVEVSX0NMQVNTLAkvLyBqYXZhLmxhbmcuQ2hhcmFjdGVyIC0gd3JpdGVDaGFyCi0JCURPVUJMRSA9IERPVUJMRV9UWVBFLAkvLyBkb3VibGUgLSB3cml0ZURvdWJsZQotCQlMX0RPVUJMRSA9IERPVUJMRV9DTEFTUywJLy8gamF2YS5sYW5nLkRvdWJsZSAtIHdyaXRlRG91YmxlCi0JCUZMT0FUID0gRkxPQVRfVFlQRSwJLy8gZmxvYXQgLSB3cml0ZUZsb2F0Ci0JCUxfRkxPQVQgPSBGTE9BVF9DTEFTUywJLy8gamF2YS5sYW5nLkZsb2F0IC0gd3JpdGVGbG9hdAotCQlJTlQgPSBJTlRFR0VSX1RZUEUsCS8vIGludCAtIHdyaXRlSW50Ci0JCUxfSU5UID0gSU5URUdFUl9DTEFTUywJLy8gamF2YS5sYW5nLkludGVnZXIgLSB3cml0ZUludAotCQlMT05HID0gTE9OR19UWVBFLAkvLyBsb25nIC0gd3JpdGVMb25nCi0JCUxfTE9ORyA9IExPTkdfQ0xBU1MsCS8vIGphdmEubGFuZy5Mb25nIC0gd3JpdGVMb25nCi0JCVNIT1JUID0gU0hPUlRfVFlQRSwJLy8gc2hvcnQgLSB3cml0ZVNob3J0Ci0JCUxfU0hPUlQgPSBTSE9SVF9DTEFTUywJLy8gamF2YS5sYW5nLlNob3J0IC0gd3JpdGVTaG9ydAotCQlCT09MID0gQk9PTEVBTl9UWVBFLAkvLyBib29sZWFuIC0gd3JpdGVCb29sZWFuCi0JCUxfQk9PTCA9IEJPT0xFQU5fQ0xBU1MsCS8vIGphdmEubGFuZy5Cb29sZWFuIC0gd3JpdGVCb29sZWFuCi0JCVNUUklORyA9IFNUUklOR19DTEFTUywJLy8gamF2YS5sYW5nLlN0cmluZyAtIHdyaXRlVVRGCi0JCU9CSkVDVCA9IE9CSkVDVF9DTEFTUywJLy8gT2JqZWN0IC0gc3BlY2lhbCwgc2VlIGJlbG93IChPYmplY3QgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGFuIGFycmF5IChleGNlcHQgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFueSBvYmplY3RfaWRzLCB0aGF0IGhhcyBhIHNwZWNpYWwgdHlwZSkKLQkJT0JKRUNUX0lEID0gNTAsCS8vIE9iamVjdCBpZGVudGl0eSBrZXkgLSB3cml0ZUludAotCQlORVdfT0JKRUNUX0lEID0gNTEsCS8vIE5ldyBPYmplY3QgaWRlbnRpdHkgKHRoaXMgaXMgYSBuZXcgb2JqZWN0IHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZSkKLQkJVEhST1cgPSA1MiwJLy8gQW4gZXhjZXB0aW9uIG9jY3VyZWQuIFRoZSB2YWx1ZSBpcyBhIHRocm93YWJsZSwgaXQgaXMgb2YgdGhlIHNhbWUgZm9ybWF0IGFzIE5FV19PQkpFQ1RfSUQuCi0JCUFSUkFZX0lEUyA9IDUzLAkvLyBBbiBhcnJheSBvZiB2YWx1ZXMsIHdoZXJlIHRoZXJlIGFyZSBhdCBsZWFzdCBvbmUgSUQgaW4gdGhlIGFycmF5LiBJZiB0aGVyZSB3ZXJlIG5vCi0JCQkJCQkvLyBJRCdzIChpLmUuIGFsbCBqdXN0IHZhbHVlcyksIHRoZW4gdXNlIE9CSkVDVCB0eXBlIGludGVhZCBhbmQgaGF2ZSBpdCB3cml0dGVuIGFzCi0JCQkJCQkvLyB3cml0ZU9iamVjdC4KLQkJRkxBRyA9IDU0OwkvLyBUaGUgdmFsdWUgaXMgYSBmbGFnIGludC4gSWYgdGhpcyBpcyBhbGxvd2VkIG9uIGEgcmVhZCwgdGhlIGFuSW50IGZpZWxkIHdpbGwgY29udGFpbiB0aGUgZmxhZyB2YWx1ZS4KLQkJCQkKLQkJCi0JCQotCS8vIFVubGVzcyBzcGVjaWZpZWQgYmVsb3csIHRoZSBjb21tYW5kcyBhcmUgb25lIGJ5dGUgbG9uZy4KLQkvLyBBbHNvLCB1bmxlc3Mgc3BlY2lmaWVkIGJlbG93LCB0aGUgY29tbWFuZHMgZG8gbm90IHJldHVybiBhIGNvbmZpcm1hdGlvbiByZXNwb25zZS4KLQkvLwotCS8vIE5PVEU6IFZFUlkgSU1QT1JUQU5ULCBhZnRlciBldmVyeSBjb21tYW5kLCBmbHVzaCgpIHNob3VsZCBiZSB1c2VkIHNvIHRoYXQgdGhlCi0JLy8gdGhlIGRhdGEgaXMgaW1tZWRpYXRlbHkgc2VudCB0byB0aGUgc2VydmVyLiAJCi0JLy8KLQkvLyBuIG1lYW5zIGludCAoZS5nLiAxKQotCS8vIG5iIG1lYW5zIGJ5dGUgKGUuZy4gMWIpCi0JLy8gJ3gnIG1lYW5zIFVuaWNvZGUgY2hhciAoaS5lLiB3cml0ZUNoYXIoKSkKLQkvLyAieHh4IiBtZWFucyBVVEY4IHN0cmluZyAoaS5lLiB3cml0ZVVURikKLQkvLyBib29sIG1lYW5zIGEgb25lIGJ5dGUgYm9vbGVhbiB2YWx1ZQotCS8vCi0JLy8gVGhlIGNvbW1hcyBhcmVuJ3QgYWN0dWFsbHkgd3JpdHRlbiwgdGhleSBhcmUgdXNlZCBhcyBzZXBhcmF0ZXJzIGluIHRoZSBjb21tZW50cyBiZWxvdwotCS8vCi0JLy8gR0VUX0NMQVNTOiAxYiwgImNsYXNzbmFtZSIKLQkvLwkJV2lsbCByZXR1cm4gb24gdGhlIG91dHB1dCBzdHJlYW0gR0VUX0NMQVNTX1JFVFVSTiBjb21tYW5kOgotCS8vCQk4YiwgbjEsIGJvb2wxLCBib29sMiwgInN1cGVyY2xhc3NuYW1lIgotCS8vCQlUaGUgIm4xIiBpcyB0aGUgY2xhc3MgaWQuCi0JLy8JCVRoZSBib29sMSBpcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgYW4gaW50ZXJmYWNlICh0cnVlIGlmIGl0IGlzKS4KLQkvLwkJVGhlIGJvb2wyIGlzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhYnN0cmFjdCAodHJ1ZSBpZiBpdCBpcykuCQotCS8vCQlUaGUgInN1cGVyY2xhc3NuYW1lIiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgKDAgbGVuZ3RoIGlmIG5vIHN1cGVyY2xhc3MpCi0JLy8JCUlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQsIHRoZW4gaXQgd2lsbCByZXR1cm4gYW4gZXJyb3Igd2l0aCBhIHZhbHVlIGZvciB0aGUgZXJyb3IuCi0JLy8KLQkvLyBHRVRfQ0xBU1NfRlJPTV9JRDogMTJiLCBuCi0JLy8JCVdoZXJlICJuIiBpcyB0aGUgY2xhc3MgaWQuCi0JLy8JCVdpbGwgcmV0dXJuIG9uIHRoZSBvdXRwdXQgc3RyZWFtIEdFVF9DTEFTU19JRF9SRVRVUk4gY29tbWFuZDoJCi0JLy8JCTEzYiwgImNsYXNzbmFtZSIsIGJvb2wxLCBib29sMiwgInN1cGVyY2xhc3NuYW1lIgotCS8vCQlUaGUgYm9vbDEgaXMgd2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIGludGVyZmFjZSAodHJ1ZSBpZiBpdCBpcykuCi0JLy8JCVRoZSBib29sMiBpcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgYWJzdHJhY3QgKHRydWUgaWYgaXQgaXMpLgkKLQkvLwotCS8vIFZBTFVFOiAyYiwgdGIsIHZhbHVlCi0JLy8JCVdoZXJlIHRiIGlzIHRoZSB0eXBlIGluIGJ5dGUsIGFuZCB2YWx1ZSBpcyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgc2hvd24gaW4KLQkvLwkJdGFibGUgYWJvdmUuCi0JLy8JCU9CSkVDVF9JRDogNTBiLCBuCi0JLy8JCQlXaGVyZSAibiIgaXMgdGhlIG9iamVjdCBpZC4KLQkvLwkJTkVXX09CSkVDVF9JRDogNTFiLCBuMSwgbjIKLQkvLwkJCVdoZXJlICJuMSIgaXMgY2xhc3MgT2JqZWN0SUQgb2YgdGhlIG9iamVjdCB0aGF0IHRoZSBvYmplY3RfaWQgKCJuMiIpIGlzIG1hZGUgb2YuCi0JLy8JCU9CSkVDVDogMTliLCBuLCB3cml0ZU9iamVjdAotCS8vCQkJV2hlcmUgIm4iIGlzIHRoZSBjbGFzc09iamVjdElEIG9mIHRoZSBjbGFzcyBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCS8vCQkJTk9URTogT2JqZWN0IHNob3VsZCBiZSB1c2VkIG9ubHkgdmVyeSByYXJlbHkuIElkZW50aXR5IGlzIGxvc3QsIGkuZS4KLQkvLwkJCWEgY29weSBpcyBtYWRlIGVhY2ggdGltZSBhbmQgaXQgY2FuJ3QgYmUgcmVmZXJlbmNlZCBiYWNrIG9uIHRoZSByZW1vdGUKLQkvLwkJCVZNLgotCS8vCQlBUlJBWV9JRFM6IDUyYiwgaWQsIG4sIFt0YiwgdmFsdWUsIC4uLl0KLQkvLwkJCVRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgYXJyYXkuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBJRC4gVGhlcmVmb3IgYWxsIG9mIHRoZSAKLQkvLwkJCUZpcnN0IGxldmVsIGVudHJpZXMgYXJlIHZhbHVlIG9iamVjdHMuIAotCS8vCQkJImlkIiBpcyB0aGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheShlLmcuIGlkIGZvciBPYmplY3QsIG9yIGlmIG11bHRpLWRpbWVuc2lvbmFsIFN0cmluZ1tdICh0aGlzIHdpbGwgcHJvZHVjZSBTdHJpbmdbXVtdKS4KLQkvLwkJCSJuIiBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFycmF5LiBGb2xsb3dlZCBieSB0aGUgdmFsdWVzLCBvbmUgb2YgdGhlCi0JLy8JCQl2YWx1ZXMgY291bGQgYmUgYW4gQVJSQVlfSURTIHRvby4gVGhlIHJlYWRpbmcvd3JpdGluZyBvZiB0aGVzZSBhcmUgc3BlY2lhbCBiZWNhdXNlCi0JLy8JCQl0aGVyZSBpcyBhIGNhbGxiYWNrIG1lY2hhbmlzbSB0byBwcm9jZXNzIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMuIFRoaXMgaXMgc28gdGhhdAotCS8vCQkJdGVtcCBhcnJheXMgb2YgVmFsdWVPYmplY3RzIHdvbid0IG5lZWQgdG8gYmUgY3JlYXRlZCB0byBoYW5kbGUgdGhpcywgc28gaXQgY2FuCi0JLy8JCQlnbyBkaXJlY3RseSBmcm9tIHRoZSBhcnJheSB0by9mcm9tIHRoZSBzdHJlYW0uCi0JLy8JCQotCS8vIFJFTEVBU0VfT0JKRUNUOiA3YiwgbgotCS8vCQlXaGVyZSB0aGUgbiBpcyB0aGUgb2JqZWN0IGlkIHRvIHJlbGVhc2UuIFRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbiB0byByZWFkIGJhY2suCi0JLy8KLQkvLyBFUlJPUjogNmIsIG4sIHRiLCAuLi4KLQkvLyAgICAgIG4gaXMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXJyb3IuCi0JLy8JCXRiIGlzIGEgdHlwZSBmbGFnLCBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBpcyBkZXBlbmRlbnQgdXBvbgotCS8vCQl0aGUgY29tbWFuZCB0aGF0IHRoaXMgaXMgZXJyb3IgaXMgZnJvbS4gSWYgYSBUSFJPVywgdGhlbiB0aGUgVEhST1cgaXMgQUxXQVlTIGEgbmV3Ci0JLy8JCUlELCBpdCBjYW4gbmV2ZXIgYmUgYW4gZXhpc3RpbmcgaWQuCi0JLy8gICAgICAKLQkvLwotCS8vIFRPX0JFQU5fU1RSSU5HOiA5YiwgbgotCS8vCQlXaGVyZSBuIGlzIHRoZSBvYmplY3QgaWQgdG8gcHJvZHVjZSB0aGUgYmVhbiBzdHJpbmcgZm9yLgotCS8vCQlJdCB3aWxsIHJldHVybiBhIFZBTFVFIGNvbW1hbmQgd2hlcmUgdGhlIHR5cGUgaXMgU3RyaW5nLgotCS8vCi0JLy8gTkVXX0lOU1RBTkNFOiAxMGIsIG4KLQkvLwkJV2hlcmUgbiBpcyB0aGUgY2xhc3Mgb2JqZWN0IGlkIG9mIHRoZSBjbGFzcyB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdXNpbmcgdGhlIGRlZmF1bHQgY3Rvci4KLQkvLwkJSXQgd2lsbCByZXR1cm4gZWl0aGVyIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSBuZXcgdmFsdWUgKG9mIHR5cGUgT0JKRUNUX0lEL05FV19PQkpFQ1RfSUQgaWYgbm90Ci0JLy8JCW9uZSBvZiB0aGUgY29uc3RhbnQgdHlwZXMgd2l0aCB0aGUgdHJ1ZSBjbGFzc0lEIGluIGl0KSBvciBhbiBFUlJPUiBjb21tYW5kLiAoVGhlIEVSUk9SIGNvdWxkCi0JLy8JCWJlIGEgVEhST1cgdHlwZSkuIElmIHRoZSBvYmplY3QgY3JlYXRlZCBpcyBub3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSBwYXNzZWQgaW4sIHRoZW4KLQkvLwkJYW4gRVJST1IgaXMgcmV0dXJuZWQgd2l0aCBDTEFTU19DQVNUX0VYQ0VQVElPTiBmbGFnLgotCS8vCi0JLy8gTkVXX0lOSVRfU1RSSU5HOiAxMWIsIG4sICJpbml0c3RyaW5nIgotCS8vCQlXaGVyZSBuIGlzIHRoZSBjbGFzcyBvYmplY3QgaWQgb2YgdGhlIGNsYXNzIHRoaXMgaW5pdHN0cmluZyBpcyBzdXBwb3NlZCB0byBjcmVhdGUgZm9yLgotCS8vCQlJdCB3aWxsIHJldHVybiBlaXRoZXIgYSBWQUxVRSBjb21tYW5kIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZSAob2YgdHlwZSBPQkpFQ1RfSUQvTkVXX09CSkVDVF9JRCBpZiBub3QKLQkvLwkJb25lIG9mIHRoZSBjb25zdGFudCB0eXBlcyB3aXRoIHRoZSB0cnVlIGNsYXNzSUQgaW4gaXQpIG9yIGFuIEVSUk9SIGNvbW1hbmQuIChUaGUgRVJST1IgY291bGQKLQkvLwkJYmUgYSBUSFJPVyB0eXBlKS4gVGhlIGVycm9yIGNvdWxkIGFsc28gYmUgQ0FOTk9UX0VWQUxVQVRFX1NUUklORy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzdHJpbmcgd2FzIHRvbwotCS8vCQljb21wbGljYXRlZCBmb3IgdGhlIGV2YWx1YXRvciBhbmQgbmVlZHMgdG8gYmUgY29tcGlsZWQgYW5kIHRyaWVkIGFnYWluLiAoVEJEKQotIAkvLwkJSWYgdGhlIG9iamVjdCBjcmVhdGVkIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIHBhc3NlZCBpbiwgdGhlbgotCS8vCQlhbiBFUlJPUiBpcyByZXR1cm5lZCB3aXRoIENMQVNTX0NBU1RfRVhDRVBUSU9OIGZsYWcuCi0JLy8KLQkvLyBHRVRfT0JKRUNUX0RBVEE6IDE0YiwgbgotCS8vCQlXaGVyZSBuIGlzIHRoZSBpZCBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlcXVlc3RlZC4gSXQgd2lsbCByZXR1cm4gYSBORVdfT0JKRUNUX0lEIHZhbHVlIHdpdGggdGhlIGluZm8uCi0JLy8KLQkvLyBHRVRfTUVUSE9EOiA5YiwgY2xhc3NJZCwgIm1ldGhvZE5hbWUiLCBuMSwgW24yXS4uLgotCS8vCQlXaGVyZSBjbGFzc0lEIGlzIHRoZSBpZCBvZiB0aGUgY2xhc3MgdGhlIG1ldGhvZCBzaG91bGQgYmUgZm91bmQgaW4uCi0JLy8JCVdoZXJlIG4xIGlzIHRoZSBudW1iZXIgb2YgcGFybSB0eXBlcyBmb2xsb3dpbmcsIGFuZCBuMiBpcyByZXBsaWNhdGVkIHRoYXQgbWFueSB0aW1lcywKLQkvLwkJZWFjaCBlbnRyeSBpcyB0aGUgaWQgb2YgY2xhc3MgZm9yIHRoZSBwYXJtIHR5cGUuICgwIGlzIHZhbGlkIHdoaWNoIG1lYW5zIHRoZXJlIGFyZSBubyBwYXJtcykuCi0JLy8JCVRoZSByZXR1cm4gd2lsbCBiZSBhIFZBTFVFIGNvbW1hbmQgY29udGFpbmluZyB0aGUgT0JKRUNUX0lEIG9mIHRoZSBtZXRob2QuCi0JLy8KLQkvLyBHRVRfQ1RPUjogMTBiLCBjbGFzc0lkLCBuMSwgW24yXS4uLgotCS8vCQlXaGVyZSBjbGFzc0lEIGlzIHRoZSBpZCBvZiB0aGUgY2xhc3MgdGhlIG1ldGhvZCBzaG91bGQgYmUgZm91bmQgaW4uCi0JLy8JCVdoZXJlIG4xIGlzIHRoZSBudW1iZXIgb2YgcGFybSB0eXBlcyBmb2xsb3dpbmcsIGFuZCBuMiBpcyByZXBsaWNhdGVkIHRoYXQgbWFueSB0aW1lcywKLQkvLwkJZWFjaCBlbnRyeSBpcyB0aGUgaWQgb2YgY2xhc3MgZm9yIHRoZSBwYXJtIHR5cGUuICgwIGlzIHZhbGlkIHdoaWNoIG1lYW5zIHRoZXJlIGFyZSBubyBwYXJtcykuCi0JLy8JCVRoZSByZXR1cm4gd2lsbCBiZSBhIFZBTFVFIGNvbW1hbmQgY29udGFpbmluZyB0aGUgT0JKRUNUX0lEIG9mIHRoZSBtZXRob2QuCi0JLy8JCi0JLy8gR0VUX0ZJRUxEOgotCS8vCi0JLy8gR0VUX0NUT1I6Ci0JLy8KLQkvLyBJTlZPS0U6IDE1YiwgbjEsIHRiLCB2YWx1ZTEsIHZhbHVlMgotCS8vCQlXaGVyZSAibjEiIGlzIHRoZSBpZCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KLQkvLwkJdGIsIHZhbHVlMSBpcyB0aGUgdmFsdWUgb2Ygd2hvIHRvIGludm9rZSBhZ2FpbnN0IChpdCBpcyB1c3VhbGx5IGFuIE9CSkVDVF9JRCBmb3IgdGIpCi0JLy8gICAgICB2YWx1ZTIgaXMgYW4gQVJSQVlfSURTIHR5cGUgb3IgYW4gT0JKRUNUIGFycmF5IG9mIHZhbHVlcyBpZiBhbGwgY29uc3RhbnRzLgotCS8vCQlXaGF0IGlzIHJldHVybmVkIGlzIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSByZXR1cm4gdmFsdWUsICh0aGUgdmFsdWUgd2lsbCBiZSBudWxsIChWT0lEKSBpZgotCS8vCQl0aGVyZSBpcyBubyByZXR1cm4gdHlwZSAoaS5lLiB0aGUgbWV0aG9kIHdhcyB2b2lkKS4gU28gbnVsbCBjYW4gYmUgcmV0dXJuZWQgZWl0aGVyIGlmIHRoZSB2YWx1ZQotCS8vCQl3YXMgbnVsbCBvciBpZiB0aGUgcmV0dXJuIHR5cGUgd2FzIHZvaWQuCi0JLy8KLQkvLyBFWFBSRVNTSU9OX1RSRUVfQ09NTUFORDogMjBiLCBuLCBiCi0JLy8JCVJlY2VpdmluZyBhbiBleHByZXNzaW9uIHRyZWUgc3ViY29tbWFuZC4gV2hlcmUgIm4iIGlzIGEgdW5pcXVlIGlkIG51bWJlciBvZiB0aGUKLQkvLwkJZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQuIFdoZXJlICJiIiBpcyBieXRlIGNvZGUsIGRlZmluZWQgaW4gRXhwcmVzc2lvbkNvbW1hbmRzLCB0aGF0Ci0JLy8JCWRldGVybWluZXMgdGhlIHR5cGUgb2YgZXhwcmVzc2lvbiB0cmVlIGNvbW1hbmRzLgotCS8vCQlUaGVyZSBjYW4gYmUgbW9yZSBkYXRhIGZvbGxvd2luZywgYnV0IGl0IGlzIHJlYWQgYnkgdGhlIAotCS8vCQlFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciwgbm90IGJ5IHRoZSBjb25uZWN0aW9uLiBTZWUgdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJjb21tYW5kcy4KLQkvLwotCS8vCQlUaGUgaWQgbnVtYmVyIGlzIHRoZSBpZCBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBwcm9jZXNzZWQuIFRoaXMgYWxsb3dzIG1vcmUgdGhhbiBvbmUgZXhwcmVzc2lvbgotCS8vCQl0byBiZSBwcm9jZXNzZWQgYXQgYSB0aW1lIGZyb20gdGhpcyBjb25uZWN0aW9uLgotCS8vCi0JLy8JCUBzZWUgRXhwcmVzc2lvbkNvbW1hbmRzCi0JLy8JCUBzZWUgRXhwcmVzc2lvblByb2Nlc3NDb250cm9sbGVyCi0JLy8KLQkvLyBJTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEOiAyMGIsICBjbGFzc0lkLCAibWV0aG9kTmFtZSIsIHZhbHVlMCwgdGIsIHZhbHVlMSwgdmFsdWUyCi0JLy8JCVdoZXJlIGNsYXNzSUQgaXMgdGhlIGlkIG9mIHRoZSBjbGFzcyB0aGUgbWV0aG9kIHNob3VsZCBiZSBmb3VuZCBpbi4KLQkvLwkJdmFsdWUwIGlzIGFuIEFSUkFZX0lEUyB0eXBlIGZvciB0aGUgdHlwZSBvZiB0aGUgcGFybXMsIG9yIG51bGwgdHlwZSBmb3Igbm8gcGFybXMuICAKLQkvLwkJdGIsIHZhbHVlMSBpcyB0aGUgdmFsdWUgb2Ygd2hvIHRvIGludm9rZSBhZ2FpbnN0IChpdCBpcyB1c3VhbGx5IGFuIE9CSkVDVF9JRCBmb3IgdGIpCi0JLy8gICAgICB2YWx1ZTIgaXMgYW4gQVJSQVlfSURTIHR5cGUgb3IgYW4gT0JKRUNUIGFycmF5IG9mIHZhbHVlcyBpZiBhbGwgY29uc3RhbnRzLgotCS8vCQlXaGF0IGlzIHJldHVybmVkIGlzIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSByZXR1cm4gdmFsdWUsICh0aGUgdmFsdWUgd2lsbCBiZSBudWxsIChWT0lEKSBpZgotCS8vCQl0aGVyZSBpcyBubyByZXR1cm4gdHlwZSAoaS5lLiB0aGUgbWV0aG9kIHdhcyB2b2lkKS4gU28gbnVsbCBjYW4gYmUgcmV0dXJuZWQgZWl0aGVyIGlmIHRoZSB2YWx1ZQotCS8vCQl3YXMgbnVsbCBvciBpZiB0aGUgcmV0dXJuIHR5cGUgd2FzIHZvaWQuCi0JLy8KLQkvLyBHRVRfQVJSQVlfQ09OVEVOVFM6IDIxYiwgYXJyYXlJZAotCS8vCQlXaGVyZSBhcnJheUlEIGlzIHRoZSBpZCBvZiB0aGUgYXJyYXkgdG8gZ2V0IHRoZSBjb250ZW50cyBvZi4gV2hhdCBpcyByZXR1cm5lZCBpcyBhIHZhbHVlIGNvbW1hbmQKLQkvLwkJY29udGFpbmluZyBhbiBhcnJheSBvZiBpZHMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBjb250ZW50cy4KLQkvLwotCS8vIENhbGxiYWNrIGNvbW1hbmRzOgotCS8vCi0JLy8gQ0FMTEJBQ0s6IDI1NWIsIG4xLCBuMiwgdmFsdWUxCi0JLy8gICAgICBXaGVyZQotCS8vICAgICAgICAibjEiIGlzIHRoZSBpZCBvZiBjYWxsYmFjayB0eXBlICh0aGVzZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjayBzZXJ2ZXIpCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIG1zZ0lkIGZvciB0aGUgY2FsbGJhY2sgKFRoZXNlIGFyZSBlbnRpcmVseSBjYWxsYmFjayBkZXBlbmRlbnQgYW5kIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsYmFjayBkZXZlbG9wZXIpCi0JLy8gICAgICAgIHZhbHVlMSBpcyBhbiBBUlJBWV9JRFMgdHlwZSBvciBhbiBPQkpFQ1QgYXJyYXkgb2YgdmFsdWVzIGlmIGFsbCBjb25zdGFudHMuIFRoZXNlIGFyZQotCS8vICAgICAgICAgIHBhcm1zIHRvIHNlbmQgdG8gdGhlIGNhbGxiYWNrIG1zZy4KLQkvLyAgICAgIEl0IHdpbGwgcmV0dXJuIGEgQ0FMTEJBQ0tfRE9ORS4KLQkvLwotCS8vIENBTExCQUNLX0RPTkU6IDI1NGIsIHZhbHVlIGNvbW1hbmQuCi0JLy8JCVdoYXQgY29tZXMgYmFjayBpcyBhIHZhbHVlIGNvbW1hbmQgKGkuZS4gQ29tbWFuZHMuVkFMVUUgZm9sbG93ZWQgYnkgdmFsdWUpLiBUaGlzIGFsbG93cwotCS8vCQlFUlJPUlMgdG8gYmUgc2VudCBiYWNrIHRvby4KLQkvLwotCS8vIENBTExCQUNLX1NUUkVBTTogMjUzYiwgbjEsIG4yCi0JLy8gICAgICBXaGVyZQotCS8vICAgICAgICAibjEiIGlzIHRoZSBpZCBvZiBjYWxsYmFjayB0eXBlICh0aGVzZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjayBzZXJ2ZXIpCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIG1zZ0lkIGZvciB0aGUgY2FsbGJhY2sgKFRoZXNlIGFyZSBlbnRpcmVseSBjYWxsYmFjayBkZXBlbmRlbnQgYW5kIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsYmFjayBkZXZlbG9wZXIpCi0JLy8JCUl0IHdpbGwgY3JlYXRlIGEgQ2FsbGJhY2tJbnB1dFN0cmVhbSBhbmQgbm90aWZ5IHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHRoYXQgdGhlCi0JLy8JCXN0cmVhbSBpcyBhdmFpbGFibGUuIEl0IHdpbGwgc2VuZCBhIGNhbGxiYWNrX2RvbmUgd2hlbiBpdCBoYXMgYWNjZXB0ZWQgdGhlIHJlcXVlc3QKLQkvLwkJYnV0IGJlZm9yZSBpdCBub3RpZmllcyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBzdHJlYW0uIFRoaXMgbGV0cyB0aGUgcmVtb3RlCi0JLy8JCXZtIGtub3cgdGhhdCBpdCBjYW4gc3RhcnQgc2VuZGluZyBkYXRhLgotCQotCi0JLy8gVG8gdGhlIE1hc3RlclNlcnZlciBzb2NrZXQ6Ci0JLy8gVGhlIE1hc3RlclNlcnZlciBzb2NrZXQgd2lsbCBleHBlY3QgaW5wdXQgaW4gRGF0YUlucHV0U3RyZWFtIGZvcm1hdCwgYW5kIERhdGFPdXRwdXRTdHJlYW0gZm9yIHJldHVybi4KLQkvLyBUaGUgc29ja2V0IHdpbGwgYmUgc2hvcnQtbGl2ZWQuIEl0IHdpbGwgYmUgZm9yIG9uZSB0cmFuc2FjdGlvbiBvbmx5LiBFYWNoIHJlcXVlc3Qgd2lsbCByZXR1cm4gYSBuZXcgc29ja2V0LgotCS8vCi0JLy8gQUxJVkU6IDE2YiwgbjEKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIGFza2luZyB0byB0ZXN0IGZvciBhbGl2ZW5lc3MKLQkvLyAgICAgIFdpbGwgcmV0dXJuIGJvb2wsIHdoZXJlIGZhbHNlIGlmIHJlZ2lzdHJ5IGlzIG5vdCBhbGl2ZSwgdHJ1ZSBpZiBpdCBpcyBhbGl2ZS4KLQkvLyBSRU1PVEVfU1RBUlRFRDogMTdiLCBuMSwgbjIKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIHRlbGxpbmcgdGhhdCBpdCBpcyBzdGFydGVkCi0JLy8gICAgICAgICJuMiIgaXMgdGhlIHNlcnZlcnNvY2tldCBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIHNvY2tldCBpbiB0aGlzIHJlbW90ZSB2bS4KLQkvLyAgICAgIFdpbGwgcmV0dXJuIGJvb2wsIHdoZXJlIGZhbHNlIGlmIHJlZ2lzdHJ5IGlzIG5vdCBhbGl2ZSwgdHJ1ZSBpZiBpdCBpcyBhbGl2ZS4gSWYgZmFsc2UsIHRoZW4gdGVybWluYXRlIHRoZSBzZXJ2ZXIgYmVjYXVzZSBub3RoaW5nIHRvIHRhbGsgdG8uCi0JLy8gR0VUX0NBTExCQUNLX1BPUlQ6IDE4YiwgbjEKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIHRoZSByZWdpc3RyeSB0aGlzIGlzIGFza2luZyBmb3IgdGhlIGNhbGxiYWNrIHNlcnZlciBwb3J0LgotCS8vICAgICAgV2lsbCByZXR1cm4gaW50LCB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIGNhbGxiYWNrIHNlcnZlciBwb3J0IG51bWJlci4gLTEgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgc2VydmVyIHBvcnQuCQkKLQkKLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHRoZSByZXR1cm4gZnJvbSBhIHJlYWQgdmFsdWUuIEl0IGNvbnRhaW5zIHRoZQotCSAqIHR5cGUgb2YgdGhlIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXRzZWxmLiBTaW5jZSBwcmltaXRpdmVzIGNhbiBiZQotCSAqIHJldHVybmVkIGFsc28sIHRoZXJlIGlzIGEgc2xvdCBmb3IgZWFjaCBvbmUgYW5kIHRoZSB0eXBlIHNob3VsZAotCSAqIGJlIGNoZWNrZWQgdG8gc2VlIHdoaWNoIG9uZSBpcyBzZXQuCi0JICoKLQkgKiBBbHNvLCBpZiB0aGUgdHlwZSBpcyBPQkpFQ1QsIHRoZW4gdGhlIGFuT2JqZWN0IGhhcyB0aGUgb2JqZWN0IGluIGl0LCBBTkQKLQkgKiB0aGUgY2xhc3NJRCBmaWVsZCBoYXMgdGhlIG9iamVjdF9pZCBvZiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBzbyB0aGF0IHRoZQotCSAqIGFwcHJvcHJpYXRlIGJlYW50eXBlcHJveHkgY2FuIGJlIGZvdW5kIHRvIHVzZSB0aGF0IG9iamVjdC4gQWxzbywgb25seQotCSAqIElSRU1Db25zdGFudEJlYW5UeXBlUHJveGllcyBjYW4gYmUgb2YgdHlwZSBPQkpFQ1QuIFRoYXQgaXMgYmVjYXVzZSB0aG9zZQotCSAqIGFyZSB0aGUgb25seSBvbmVzIHRoYXQga25vdyBob3cgdG8gdGFrZSB0aGUgdmFsdWUgb2JqZWN0IGFuZCBpbnRlcnByZXQgaXQuCi0JICoKLQkgKiBJZiB0aGUgdHlwZSBpcyBPQkpFQ1RfSUQgb3IgTkVXX09CSkVDVF9JRCwgdGhlbiB0aGUgb2JqZWN0SUQgZmllbGQgd2lsbCBiZSBzZXQgd2l0aAotCSAqIHRoZSBpZC4KLQkgKiBJZiB0aGUgdHlwZSBpcyBORVdfT0JKRUNUX0lELCB0aGVuIHRoZSBjbGFzc0lEIGZpZWxkIHdpbGwKLQkgKiBoYXZlIHRoZSBjbGFzcyBvYmplY3RJRCBvZiB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBmb3Igd2hpY2ggb2JqZWN0X2lkIHByb3hpZXMuCi0JICoKLQkgKiBUSFJPVyBpcyB0cmVhdGVkIGxpa2UgTkVXX09CSkVDVF9JRCBpbiB3aGF0IGZpZWxkcyBhcmUgc2V0IHNpbmNlIGl0IGlzIGEgbmV3IG9iamVjdC4KLQkgKgotCSAqIE5vdGU6IHNvIGFzIG5vdCB0byBjcmVhdGUgdW5uZWNlc3Nhcnkgb2JqZWN0cywgaWYgdGhlIE9iamVjdCB0eXBlIG9mIHRoZSBwcmltaXRpdmUgaXMgYmVpbmcKLQkgKiBzZW50LCB0aGVuIHRoZSBwcmltaXRpdmUgZmllbGQgd2lsbCBiZSBzZXQgaW5zdGVhZCwgdGhvdWdoIHRoZSB0eXBlCi0JICogd2lsbCBzdGlsbCBiZSB0aGUgT2JqZWN0IHR5cGUgKGkuZS4gaWYgdHlwZSA9IExfQllURSwgdGhlIGFCeXRlIHdpbGwKLQkgKiBoYXZlIHRoZSB2YWx1ZSBpbiBpdCkuCi0JICogCi0JICogTm90ZTogQWxzbyBmbGFncyBjYW4gYmUgc2VuZCBiYWNrLiBUaGUgdHlwZSB3aWxsIGJlIEZMQUcgYW5kIHRoZSBhbkludCBmaWVsZCB3aWxsIGJlIHRoZQotCSAqIGZsYWcgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSBzcGVjaWFsIHRoaW5ncyB0aGF0IGFyZW4ndCB2YWx1ZXMuIE1vc3QgdXNlZnVsIGluCi0JICogYXJyYXlzIHdoZXJlIG9uZSBvZiB0aGUgZW50cmllcyBpcyBub3QgYSB2YWx1ZS4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIHJlYWRWYWx1ZQotCSAqIGlzIHBhc3NlZCBhIGZsYWcgaW5kaWNhdGluZyBmbGFncyBhcmUgdmFsaWQsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgbm90IHZhbGllLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsdWVPYmplY3QgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCQlwdWJsaWMgYnl0ZSB0eXBlOwkvLyBTYW1lIGFzIHRoZSB0eXBlcyBhYm92ZQotCQlwdWJsaWMgYnl0ZSBhQnl0ZTsKLQkJcHVibGljIGNoYXIgYUNoYXI7Ci0JCXB1YmxpYyBkb3VibGUgYURvdWJsZTsKLQkJcHVibGljIGZsb2F0IGFGbG9hdDsKLQkJcHVibGljIGludCBhbkludDsKLQkJcHVibGljIHNob3J0IGFTaG9ydDsKLQkJcHVibGljIGxvbmcgYUxvbmc7Ci0JCXB1YmxpYyBib29sZWFuIGFCb29sOwotCQlwdWJsaWMgaW50IG9iamVjdElEOwkvLyBUaGUgb2JqZWN0IGlkIGZvciBlaXRoZXIgT0JKRUNUX0lEIG9yIE5FV19PQkpFQ1RfSUQuCi0JCXB1YmxpYyBpbnQgY2xhc3NJRDsJCS8vIFRoZSBjbGFzcyBvYmplY3QgaWQgb2YgdGhlIHZhbHVlIGluIE9iamVjdCBpZiB0aGUgdHlwZSBpcyBPYmplY3QKLQkJcHVibGljIE9iamVjdCBhbk9iamVjdDsJLy8gU3RyaW5nIGFsc28gd2lsbCBiZSBpbiBoZXJlCi0JCQotCQlwdWJsaWMgVmFsdWVPYmplY3QoKSB7Ci0JCQl0eXBlID0gVk9JRDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgc3RvcmVkIGhlcmUgaXMgYSBwcmltaXRpdmUuCi0JCSAqIAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHR5cGUuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQkJcmV0dXJuIGdldFByaW1pdGl2ZVR5cGUoKS5pc1ByaW1pdGl2ZSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBwcmltaXRpdmUgdHlwZSBvZiB0aGUgdmFsdWUuIAotCQkgKiBAcmV0dXJuIFRoZSBwcmltaXRpdmUgdHlwZSwgb3IgaWYgbm90IHByaW1pdGl2ZSwgaXQgcmV0dXJucyBzaW1wbHkgPGNvZGU+T2JqZWN0LmNsYXNzPC9jb2RlPi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIENsYXNzIGdldFByaW1pdGl2ZVR5cGUoKSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIEJZVEU6Ci0JCQkJCXJldHVybiBCeXRlLlRZUEU7Ci0JCQkJY2FzZSBDSEFSOgotCQkJCQlyZXR1cm4gQ2hhcmFjdGVyLlRZUEU7Ci0JCQkJY2FzZSBET1VCTEU6Ci0JCQkJCXJldHVybiBEb3VibGUuVFlQRTsKLQkJCQljYXNlIEZMT0FUOgotCQkJCQlyZXR1cm4gRmxvYXQuVFlQRTsKLQkJCQljYXNlIElOVDoKLQkJCQkJcmV0dXJuIEludGVnZXIuVFlQRTsKLQkJCQljYXNlIFNIT1JUOgotCQkJCQlyZXR1cm4gU2hvcnQuVFlQRTsKLQkJCQljYXNlIExPTkc6Ci0JCQkJCXJldHVybiBMb25nLlRZUEU7Ci0JCQkJY2FzZSBCT09MOgotCQkJCQlyZXR1cm4gQm9vbGVhbi5UWVBFOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQl9CQotCQkJCi0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHR5cGUgYXMgb25lIG9mIHRoZSB2YWxpZCBDb21tYW5kcy5UeXBlcy4gVk9JRCwgQllURSwgTF9CWVRFLCBldGMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTcGVjaWFsIGdldHRlciB0byBnZXQgdGhlIHR5cGUgYXMgYW4gT2JqZWN0LCB0aGlzIGlzIHVzZWQgYnkgaW52b2tlIGZvciBleGFtcGxlLgotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRBc09iamVjdCgpIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgVk9JRDoKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJY2FzZSBCWVRFOgotCQkJCWNhc2UgTF9CWVRFOgotCQkJCQlyZXR1cm4gbmV3IEJ5dGUoYUJ5dGUpOwotCQkJCWNhc2UgQ0hBUjoKLQkJCQljYXNlIExfQ0hBUjoKLQkJCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoYUNoYXIpOwotCQkJCWNhc2UgRE9VQkxFOgotCQkJCWNhc2UgTF9ET1VCTEU6Ci0JCQkJCXJldHVybiBuZXcgRG91YmxlKGFEb3VibGUpOwotCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJY2FzZSBMX0ZMT0FUOgotCQkJCQlyZXR1cm4gbmV3IEZsb2F0KGFGbG9hdCk7Ci0JCQkJY2FzZSBJTlQ6Ci0JCQkJY2FzZSBMX0lOVDoKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGFuSW50KTsKLQkJCQljYXNlIFNIT1JUOgotCQkJCWNhc2UgTF9TSE9SVDoKLQkJCQkJcmV0dXJuIG5ldyBTaG9ydChhU2hvcnQpOwotCQkJCWNhc2UgTE9ORzoKLQkJCQljYXNlIExfTE9ORzoKLQkJCQkJcmV0dXJuIG5ldyBMb25nKGFMb25nKTsKLQkJCQljYXNlIEJPT0w6Ci0JCQkJY2FzZSBMX0JPT0w6Ci0JCQkJCXJldHVybiBhQm9vbCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJY2FzZSBTVFJJTkc6Ci0JCQkJCXJldHVybiBhbk9iamVjdDsKLQkJCQljYXNlIE9CSkVDVDoKLQkJCQkJcmV0dXJuIGFuT2JqZWN0OwotCQkJCQotCQkJCWRlZmF1bHQ6IAotCQkJCQlyZXR1cm4gbnVsbDsJLy8gQ2FuJ3QgaGFuZGxlIG90aGVycy4gVGhvc2UgbmVlZCB0byBiZSBjaGVja2VkIGJlZm9yZSBjYWxsaW5nLgotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogU3BlY2lhbCBzZXR0ZXIgdG8gc2V0IHRoZSB2YWx1ZSBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFzT2JqZWN0KE9iamVjdCB2YWx1ZSwgaW50IHZhbHVlQ2xhc3NJRCkgewotCQkJc3dpdGNoICh2YWx1ZUNsYXNzSUQpIHsKLQkJCQljYXNlIFZPSUQ6Ci0JCQkJCXNldCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJZVEVfQ0xBU1M6Ci0JCQkJCXNldCgoQnl0ZSkgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENIQVJBQ1RFUl9DTEFTUzoKLQkJCQkJc2V0KChDaGFyYWN0ZXIpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBET1VCTEVfQ0xBU1M6Ci0JCQkJCXNldCgoRG91YmxlKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxPQVRfQ0xBU1M6Ci0JCQkJCXNldCgoRmxvYXQpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTlRFR0VSX0NMQVNTOgotCQkJCQlzZXQoKEludGVnZXIpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTSE9SVF9DTEFTUzoKLQkJCQkJc2V0KChTaG9ydCkgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExPTkdfQ0xBU1M6Ci0JCQkJCXNldCgoTG9uZykgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJPT0xFQU5fQ0xBU1M6Ci0JCQkJCXNldCgoQm9vbGVhbikgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNUUklOR19DTEFTUzoKLQkJCQkJc2V0KChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2V0KHZhbHVlLCB2YWx1ZUNsYXNzSUQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkJCi0JCXB1YmxpYyB2b2lkIHNldCgpIHsKLQkJCXR5cGUgPSBWT0lEOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnKGludCBmbGFnKSB7Ci0JCQl0eXBlID0gRkxBRzsKLQkJCWFuSW50ID0gZmxhZzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0KGJ5dGUgdmFsdWUpIHsKLQkJCXR5cGUgPSBCWVRFOwotCQkJYUJ5dGUgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoQnl0ZSB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9CWVRFOwotCQkJCWFCeXRlID0gdmFsdWUuYnl0ZVZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGNoYXIgdmFsdWUpIHsKLQkJCXR5cGUgPSBDSEFSOwotCQkJYUNoYXIgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoQ2hhcmFjdGVyIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0NIQVI7Ci0JCQkJYUNoYXIgPSB2YWx1ZS5jaGFyVmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoZG91YmxlIHZhbHVlKSB7Ci0JCQl0eXBlID0gRE9VQkxFOwotCQkJYURvdWJsZSA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChEb3VibGUgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfRE9VQkxFOwotCQkJCWFEb3VibGUgPSB2YWx1ZS5kb3VibGVWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChmbG9hdCB2YWx1ZSkgewotCQkJdHlwZSA9IEZMT0FUOwotCQkJYUZsb2F0ID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KEZsb2F0IHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0ZMT0FUOwotCQkJCWFGbG9hdCA9IHZhbHVlLmZsb2F0VmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoaW50IHZhbHVlKSB7Ci0JCQl0eXBlID0gSU5UOwotCQkJYW5JbnQgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoSW50ZWdlciB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9JTlQ7Ci0JCQkJYW5JbnQgPSB2YWx1ZS5pbnRWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChzaG9ydCB2YWx1ZSkgewotCQkJdHlwZSA9IFNIT1JUOwotCQkJYVNob3J0ID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KFNob3J0IHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX1NIT1JUOwotCQkJCWFTaG9ydCA9IHZhbHVlLnNob3J0VmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQobG9uZyB2YWx1ZSkgewotCQkJdHlwZSA9IExPTkc7Ci0JCQlhTG9uZyA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChMb25nIHZhbHVlKSB7Ci0JCQl0eXBlID0gTF9MT05HOwotCQkJYUxvbmcgPSB2YWx1ZS5sb25nVmFsdWUoKTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoYm9vbGVhbiB2YWx1ZSkgewotCQkJdHlwZSA9IEJPT0w7Ci0JCQlhQm9vbCA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChCb29sZWFuIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0JPT0w7Ci0JCQkJYUJvb2wgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBTVFJJTkc7Ci0JCQkJYW5PYmplY3QgPSB2YWx1ZTsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9CQkJCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHZhbHVlLCBpbnQgY2xhc3NPYmplY3RJRCkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gT0JKRUNUOwotCQkJCWNsYXNzSUQgPSBjbGFzc09iamVjdElEOwotCQkJCWFuT2JqZWN0ID0gdmFsdWU7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJRChpbnQgdmFsdWUpIHsKLQkJCXR5cGUgPSBPQkpFQ1RfSUQ7Ci0JCQlvYmplY3RJRCA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCQotCQkvLyBVc2UgdGhpcyBpZiB0aGUgb2JqZWN0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLiBUaGUgcmV0cmlldmVyCi0JCS8vIHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIG5leHQgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHN0cmVhbS4KLQkJcHVibGljIHZvaWQgc2V0QXJyYXlJRFMoVmFsdWVSZXRyaWV2ZSByZXRyaWV2ZXIsIGludCBhcnJheVNpemUsIGludCBjb21wb25lbnRUeXBlKSB7Ci0JCQl0eXBlID0gQVJSQVlfSURTOwotCQkJY2xhc3NJRCA9IGNvbXBvbmVudFR5cGU7Ci0JCQlhbkludCA9IGFycmF5U2l6ZTsKLQkJCWFuT2JqZWN0ID0gcmV0cmlldmVyOwotCQl9Ci0JCQotCQkKLQkJLy8gVXNlIHRoaXMgaWYgdGhpcyBpcyBhIG5ldyBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IGNsYXNzIHR5cGUuCi0JCXB1YmxpYyB2b2lkIHNldE9iamVjdElEKGludCB2YWx1ZSwgaW50IGNsYXNzT2JqZWN0SUQpIHsKLQkJCXR5cGUgPSBORVdfT0JKRUNUX0lEOwotCQkJb2JqZWN0SUQgPSB2YWx1ZTsKLQkJCWNsYXNzSUQgPSBjbGFzc09iamVjdElEOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9CQkJCQkJCQkJCi0JCQotCQkvLyBVc2UgdGhpcyB0byBpbmRpY2F0ZSBhbiBleGNlcHRpb24gb2NjdXJlZC4KLQkJcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uKGludCB0aHJvd0lELCBpbnQgdGhyb3dDbGFzc0lEKSB7Ci0JCQl0eXBlID0gVEhST1c7Ci0JCQlvYmplY3RJRCA9IHRocm93SUQ7Ci0JCQljbGFzc0lEID0gdGhyb3dDbGFzc0lEOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBIZWxwZnVsIGNvbW1hbmRzLgotCSAqIC0gSWYgYSBjb21tYW5kIHRocm93cyBhbnkgZXhjZXB0aW9uIGV4Y2VwdCBDb21tYW5kRXJyb3JFeGNlcHRpb24sIG9yCi0JICogICBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbiB3aXRoIHJlY292ZXJhYmxlIHRydWUsIHRoZW4gdGhlIGNvbm5lY3Rpb24gaXMgaW4gYSBiYWQgc3RhdGUKLQkgKiAgIGFuZCBuZWVkcyB0byBiZSBjbG9zZWQuCi0JICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQkKLQkvKioKLQkgKiBVc2UgdGhpcyB0byByZWFkIGEgdmFsdWUgKGlucHV0c3RyZWFtIHNob3VsZCBiZSBwb2ludGluZyB0byB0aGUgdHlwZSBieXRlIGFzIHRoZSBuZXh0IGJ5dGUgdG8gcmVhZCkuCi0JICogVGhlIHByaW1pdGl2ZSBmaWVsZHMgb2YgInZhbHVlIiB3aWxsIG5vdCBiZSBjaGFuZ2VkIGlmIHRoZXkgYXJlIG5vdCB0aGUKLQkgKiB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyByZWFkLiBIb3dldmVyLCBhbk9iamVjdCB3aWxsIGJlIHNldCB0byBudWxsLgotCSAqLwotCSAKLQkvKioKLQkgKiBFcnJvciBmbGFncyBmb3IgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb25zIHRoYXQgY2FuIGJlIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVTktOT1dOX1JFQURfVFlQRSA9ICJVTktOT1dOX1JFQURfVFlQRSI7CQkvLyBUaGUgcmVhZCB0eXBlIGJ5dGUgd2FzIG5vdCBhIHZhbGlkIHR5cGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVOS05PV05fV1JJVEVfVFlQRSA9ICJVTktOT1dOX1dSSVRFX1RZUEUiOwkJLy8gVGhlIHdyaXRlIHR5cGUgYnl0ZSB3YXMgbm90IGEgdmFsaWQgdHlwZQkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRZUEVfSU5WQUxJRF9GT1JfQ09NTUFORCA9ICJUWVBFX0lOVkFMSURfRk9SX0NPTU1BTkQiOwkJLy8gVGhlIGRhdGEgdHlwZSByZWFkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyBjb21tYW5kIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVTktOT1dOX0NPTU1BTkQgPSAiVU5LTk9XTl9DT01NQU5EIjsJCQkvLyBUaGUgY29tbWFuZCBmbGFnIGlzIHVua25vd24gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNPTUVfVU5FWFBFQ1RFRF9FWENFUFRJT04gPSAiU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiI7CS8vIFRoZXJlIHdhcyBzb21lIGtpbmQgb2YgZXhjZXB0aW9uIHRoYXQgd2Fzbid0IGV4cGVjdGVkLiBUaGUgZGF0YSB3aWxsIGJlIHRoZSBleGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT09fTUFOWV9CWVRFUyA9ICJUT09fTUFOWV9CWVRFUyI7CQkJLy8gVG9vIG1hbnkgYnl0ZXMgd2VyZSBzZW50IG9uIGEgd3JpdGVCeXRlcy4gSXQgd2FzIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1vcmUgdGhhbiBjb3VsZCBiZSByZWFkIGludG8gdGhlIGJ1ZmZlci4gVGhlIGRhdGEgd2lsbCBiZSB0aGUgc2l6ZSBzZW50LgotCi0JLyoqCi0JICogUmVhZCBhIHZhbHVlIGZyb20gdGhlIHN0cmVhbSBpbnRvIHRoZSB2YWx1ZSBvYmplY3QuIEl0IHdpbGwgbm90IGFsbG93IHZhbHVlcyBvZiB0eXBlIEZMQUcuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIGFsbG93RmxhZwotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9iamVjdCBzZW50IGluLiBUaGlzIGFsbG93cyA8Y29kZT52YWx1ZSA9IENvbW1hbmRzLnJlYWRWYWx1ZShpcywgbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCkpOzwvY29kZT4gCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWx1ZU9iamVjdCByZWFkVmFsdWUoRGF0YUlucHV0U3RyZWFtIGlzLCBWYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlyZWFkVmFsdWUoaXMsIHZhbHVlLCBmYWxzZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGEgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGludG8gdGhlIHZhbHVlIG9iamVjdC4gSXQgd2lsbCBhbGxvdyB2YWx1ZXMgb2YgdHlwZSBGTEFHIGlmIGFsbG93RmxhZyBpcyB0cnVlLgotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBhbGxvd0ZsYWcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdmFsdWVzIG9mIHR5cGUgZmxhZyBhcmUgYWxsb3cuCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlYWRWYWx1ZShEYXRhSW5wdXRTdHJlYW0gaXMsIFZhbHVlT2JqZWN0IHZhbHVlLCBib29sZWFuIGFsbG93RmxhZykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJdmFsdWUuYW5PYmplY3QgPSBudWxsOwotCQkJdmFsdWUudHlwZSA9IGlzLnJlYWRCeXRlKCk7Ci0JCQlzd2l0Y2ggKHZhbHVlLnR5cGUpIHsKLQkJCQljYXNlIEJZVEU6Ci0JCQkJY2FzZSBMX0JZVEU6Ci0JCQkJCXZhbHVlLmFCeXRlID0gaXMucmVhZEJ5dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDSEFSOgotCQkJCWNhc2UgTF9DSEFSOgotCQkJCQl2YWx1ZS5hQ2hhciA9IGlzLnJlYWRDaGFyKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRE9VQkxFOgotCQkJCWNhc2UgTF9ET1VCTEU6Ci0JCQkJCXZhbHVlLmFEb3VibGUgPSBpcy5yZWFkRG91YmxlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJY2FzZSBMX0ZMT0FUOgotCQkJCQl2YWx1ZS5hRmxvYXQgPSBpcy5yZWFkRmxvYXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTlQ6Ci0JCQkJY2FzZSBMX0lOVDoKLQkJCQkJdmFsdWUuYW5JbnQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT0JKRUNUX0lEOgotCQkJCQl2YWx1ZS5vYmplY3RJRCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIE5FV19PQkpFQ1RfSUQ6Ci0JCQkJCXZhbHVlLmNsYXNzSUQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCXZhbHVlLm9iamVjdElEID0gaXMucmVhZEludCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRIUk9XOgotCQkJCQl2YWx1ZS5jbGFzc0lEID0gaXMucmVhZEludCgpOwotCQkJCQl2YWx1ZS5vYmplY3RJRCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJYnJlYWs7CQkJCQotCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJY2FzZSBMX1NIT1JUOgotCQkJCQl2YWx1ZS5hU2hvcnQgPSBpcy5yZWFkU2hvcnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMT05HOgotCQkJCWNhc2UgTF9MT05HOgotCQkJCQl2YWx1ZS5hTG9uZyA9IGlzLnJlYWRMb25nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQk9PTDoKLQkJCQljYXNlIExfQk9PTDoKLQkJCQkJdmFsdWUuYUJvb2wgPSBpcy5yZWFkQm9vbGVhbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNUUklORzoKLQkJCQkJdmFsdWUuYW5PYmplY3QgPSByZWFkU3RyaW5nRGF0YShpcyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT0JKRUNUOgotCQkJCQl2YWx1ZS5jbGFzc0lEID0gaXMucmVhZEludCgpOwkvLyBSZWFkIHRoZSBjbGFzcyBpZAotCQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvaSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpcyk7Ci0JCQkJCXZhbHVlLmFuT2JqZWN0ID0gb2kucmVhZE9iamVjdCgpOwkvLyBSZWFkIHRoZSBvYmplY3QgaXRzZWxmCi0JCQkJCW9pID0gbnVsbDsJLy8gRG9uJ3QgY2xvc2UgaXQsIHRoYXQgd291bGQgY2xvc2UgdGhlIHN0cmVhbSBpdHNlbGYuCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVJSQVlfSURTOgotCQkJCQkvLyBUaGUgaGVhZGVyIGZvciBhbiBhcnJheSBvZiBpZHMuCi0JCQkJCXZhbHVlLmNsYXNzSUQgPSBpcy5yZWFkSW50KCk7CS8vIFRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgYXJyYXkKLQkJCQkJdmFsdWUuYW5JbnQgPSBpcy5yZWFkSW50KCk7CS8vIFRoZSBzaXplIG9mIHRoZSBhcnJheS4KLQkJCQkJLy8gQXQgdGhpcyBwb2ludCwgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gdXNlIHJlYWRBcnJheSB0byByZWFkIGluIHRoZSBhcnJheS4KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWT0lEOgotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMQUc6Ci0JCQkJCWlmIChhbGxvd0ZsYWcpIHsKLQkJCQkJCXZhbHVlLmFuSW50ID0gaXMucmVhZEludCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gRmxhZ3Mgbm90IGFsbG93ZWQsIHNvIGRyb3AgaW50byBkZWZhdWx0LgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihVTktOT1dOX1JFQURfVFlQRSwgZmFsc2UsIG5ldyBCeXRlKHZhbHVlLnR5cGUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNwZWNpYWwgaW50ZXJmYWNlIHVzZWQgdG8gcmVhZCBiYWNrIGFycmF5cy4gSXQgd2lsbCBiZSBjYWxsZWQgd2hlbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWx1ZVNlbmRlciB7Ci0JCS8qKgotCQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBlbnRyeSBmcm9tIHRoZSBhcnJheS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBWYWx1ZVNlbmRlciBoYXMKLQkJICogdGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgYnVpbHQuCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZW5kVmFsdWUoVmFsdWVPYmplY3QgdmFsdWUpOwotCi0JCS8qKgotCQkgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIEFSUkFZX0lEUyBpcyBmb3VuZCB3aXRoaW4gdGhlIHJlYWRpbmcgb2YgdGhlIGFycmF5IChpLmUuIG5lc3RlZCBhcnJheXMpCi0JCSAqIEl0IGlzIGFza2luZyBmb3IgYSBuZXcgVmFsdWVTZW5kZXIgdG8gdXNlIHdoaWxlIHRoaXMgbmVzdGVkIGFycmF5LiBUaGUgYXJyYXlWYWx1ZSBjb250YWlucwotCQkgKiB0aGUgdmFsdWVvYmplY3QgZm9yIHRoZSBhcnJheSBoZWFkZXIgKGkuZS4gdGhlIGNsYXNzIGlkIG9mIHRoZSBhcnJheSBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cykuCi0JCSAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgVmFsdWVTZW5kZXIgdG8gc3RvcmUgdGhpcyBhcnJheSBpbiB0aGUgYXJyYXkgdGhhdCBpcyBiZWluZyBidWlsdC4KLQkJICogQHBhcmFtIGFycmF5VmFsdWUKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgVmFsdWVTZW5kZXIgbmVzdGVkQXJyYXkoVmFsdWVPYmplY3QgYXJyYXlWYWx1ZSk7Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHNlbmRlciB3aXRoIHRoZSBnaXZlbiBhcnJheSBoZWFkZXIuIFRoaXMgaXMgbm90IGFsd2F5cyBjYWxsZWQsIGVhY2ggdXNhZ2UKLQkJICoga25vd3Mgd2hldGhlciBpdCBjYW4gYmUgY2FsbGVkIG9yIG5vdC4gRm9yIGV4YW1wbGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIG5lc3RlZEFycmF5IG1heSBub3QgbmVlZCB0byBjYWxsIGluaXRpYWxpemUuCi0JCSAqIEBwYXJhbSBhcnJheUhlYWRlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKTsKLQkJCi0JfQkKLQkKLQkvKgotCSAqIE5PVEU6IEl0IGlzIGltcG9ydGFudCB0aGF0IG9uIHRoZSBJREUgc2lkZSB0aGF0IHRoaXMgaXMgY2FsbGVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLiAKLQkgKiBJZiBub3QsIHRoZXJlIGNvdWxkIGJlIHNvbWUgY29ycnVwdGlvbiBpZiBwcm94eSBjbGVhbnVwIG9jY3VycyBpbiB0aGUgbWlkZGxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWFkQXJyYXkoRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgYXJyYXlTaXplLCBWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlciwgVmFsdWVPYmplY3QgdmFsdWUsIGJvb2xlYW4gYWxsb3dGbGFnKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCS8vIEFueXRoaW5nIGV4Y2VwdGlvbiBvdGhlciB0aGFuIGEgQ29tbWFuZEV4Y2VwdGlvbiwgd2Ugd2lsbCB0cnkgdG8gZmx1c2ggdGhlIGlucHV0IHNvIHRoYXQKLQkJLy8gaXQgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY29tbWFuZCBhbmQgbm90IGNsb3NlIHRoZSBjb25uZWN0aW9uLgotCQlSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCWZvciAoaW50IGk9MDsgaTxhcnJheVNpemU7IGkrKykgewotCQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSwgYWxsb3dGbGFnKTsKLQkJCWlmIChleGNlcHRpb24gPT0gbnVsbCkgCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHZhbHVlLnR5cGUgIT0gQVJSQVlfSURTKQotCQkJCQkJdmFsdWVTZW5kZXIuc2VuZFZhbHVlKHZhbHVlKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBXZSBoYXZlIGEgbmVzdGVkIGFycmF5LgotCQkJCQkJVmFsdWVTZW5kZXIgbmVzdGVkU2VuZGVyID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmVzdGVkU2VuZGVyID0gdmFsdWVTZW5kZXIubmVzdGVkQXJyYXkodmFsdWUpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gV2Ugc3RpbGwgbmVlZCB0byByZWFkIGluIHRoZSBhcnJheSB0byBmbHVzaC4gQ3JlYXRlCi0JCQkJCQkJLy8gYSBkdW1teSBzZW5kZXIgdGhhdCBhY2NlcHRzIGV2ZXJ5dGhpbmcgc2VudCB0byBpdC4KLQkJCQkJCQlleGNlcHRpb24gPSBlOwotCQkJCQkJCW5lc3RlZFNlbmRlciA9IG5ldyBWYWx1ZVNlbmRlcigpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgc2VuZFZhbHVlKFZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcHVibGljIFZhbHVlU2VuZGVyIG5lc3RlZEFycmF5KFZhbHVlT2JqZWN0IGFycmF5VmFsdWUpIHsKLQkJCQkJCQkJCXJldHVybiB0aGlzOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVmFsdWVPYmplY3QgYXJyYXlIZWFkZXIpIHsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQl9Ci0JCQkJCQlyZWFkQXJyYXkoaXMsIHZhbHVlLmFuSW50LCBuZXN0ZWRTZW5kZXIsIHZhbHVlLCBhbGxvd0ZsYWcpOwotCQkJCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJCQkJCXRocm93IGV4Y2VwdGlvbjsJLy8gQW4gZXhjZXB0aW9uIG9jdXJyZWQgaW4gbmV3IHNlbmRlciByZXF1ZXN0LgotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFdlIHdhbnQgdG8gZmx1c2ggdGhlIHF1ZXVlLCBzbyBzYXZlIHRoZSBleGNlcHRpb24gZm9yIGxhdGVyLgotCQkJCQlleGNlcHRpb24gPSBlOwotCQkJCX0KLQkJfQotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpCi0JCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCQkJCQotCi0JLyoqCi0JICogU3BlY2lhbCBpbnRlcmZhY2UgdG8gaGFuZGxlIHdyaXRpbmcgdGhlIEFSUkFZX0lEUyB0eXBlLgotCSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0IHdpbGwgYmUgaW4gdGhlIHZhbHVlT2JqZWN0IHNlbnQgdG8gd3JpdGVWYWx1ZSB3aGVuIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQotCSAqIGlzIEFSUkFZX0lEUy4gVGhlbiB3cml0ZSB2YWx1ZSB3aWxsIGtub3cgdG8gY2FsbCB0aGlzIGludGVyZmFjZSB0byB3cml0ZSBvdXQgdGhlIHZhbHVlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWx1ZVJldHJpZXZlIHsKLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgb2JqZWN0IHRvIHNlbmQuIEl0IHdpbGwgYmUgY2FsbGVkIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgc2l6ZSBvZiAKLQkJICogdGhlIGFycmF5IHdhcyBzZXQgdG8gYmUgc2VuZC4gCi0JCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9iamVjdCB0byBzZW5kLgotCQkgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgdGhyb3dzIEVPRkV4Y2VwdGlvbjsKLQl9CQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVmFsdWUoRGF0YU91dHB1dFN0cmVhbSBvcywgVmFsdWVPYmplY3QgdmFsdWUsIGJvb2xlYW4gYXNWYWx1ZUNvbW1hbmQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uICB7Ci0JCXdyaXRlVmFsdWUob3MsIHZhbHVlLCBhc1ZhbHVlQ29tbWFuZCwgYXNWYWx1ZUNvbW1hbmQgPyB0cnVlIDogZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWYWx1ZShEYXRhT3V0cHV0U3RyZWFtIG9zLCBWYWx1ZU9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhc1ZhbHVlQ29tbWFuZCwgYm9vbGVhbiBmbHVzaCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gIHsKLQkJdHJ5IHsKLQkJCWlmIChhc1ZhbHVlQ29tbWFuZCkKLQkJCQlvcy53cml0ZUJ5dGUoVkFMVUUpOwotCQkJc3dpdGNoICh2YWx1ZS50eXBlKSB7Ci0JCQkJY2FzZSBCWVRFOgotCQkJCWNhc2UgTF9CWVRFOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS5hQnl0ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ0hBUjoKLQkJCQljYXNlIExfQ0hBUjoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZUNoYXIodmFsdWUuYUNoYXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERPVUJMRToKLQkJCQljYXNlIExfRE9VQkxFOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlRG91YmxlKHZhbHVlLmFEb3VibGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMT0FUOgotCQkJCWNhc2UgTF9GTE9BVDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZUZsb2F0KHZhbHVlLmFGbG9hdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5UOgotCQkJCWNhc2UgTF9JTlQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuYW5JbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9CSkVDVF9JRDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSBORVdfT0JKRUNUX0lEOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmNsYXNzSUQpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVEhST1c6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuY2xhc3NJRCk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLm9iamVjdElEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTSE9SVDoKLQkJCQljYXNlIExfU0hPUlQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVTaG9ydCh2YWx1ZS5hU2hvcnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExPTkc6Ci0JCQkJY2FzZSBMX0xPTkc6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVMb25nKHZhbHVlLmFMb25nKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCT09MOgotCQkJCWNhc2UgTF9CT09MOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlQm9vbGVhbih2YWx1ZS5hQm9vbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1RSSU5HOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCXNlbmRTdHJpbmdEYXRhKG9zLCAoU3RyaW5nKSB2YWx1ZS5hbk9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT0JKRUNUOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmNsYXNzSUQpOwkvLyBXcml0ZSB0aGUgY2xhc3MgSUQuCi0JCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG9zKTsKLQkJCQkJb29zLndyaXRlT2JqZWN0KHZhbHVlLmFuT2JqZWN0KTsKLQkJCQkJb29zLmZsdXNoKCk7Ci0JCQkJCW9vcyA9IG51bGw7CS8vIERvbid0IGNsb3NlIGl0LCB0aGF0IHdvdWxkIGNsb3NlIHRoZSBzdHJlYW0gaXRzZWxmLgotCQkJCQlicmVhazsJCQkJCQotCQkJCWNhc2UgQVJSQVlfSURTOgotCQkJCQkvLyBXZSBhcmUgd3JpdGluZyBvdXQgYW4gYXJyYXkgd2l0aCBJRCdzIGluIGl0LiBUaGUgZmllbGRzIG9mIHRoZSB2YWxlIG9iamVjdCB3aWxsIGJlOgotCQkJCQkvLyAJY2xhc3NJRDogVGhlIGNsYXNzIGlkIG9mIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgYXJyYXkuCi0JCQkJCS8vICBhbk9iamVjdDogQ29udGFpbnMgdGhlIFZhbHVlUmV0cmlldmVyIHRvIGdldCB0aGUgbmV4dCB2YWx1ZS4KLQkJCQkJb3Mud3JpdGVCeXRlKEFSUkFZX0lEUyk7CQotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5jbGFzc0lEKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuYW5JbnQpOwkvLyBUaGUgc2l6ZSBvZiB0aGUgYXJyYXkuCi0JCQkJCS8vIE5vdyBjb21lcyB0aGUga2x1ZGd5IHBhcnQsIHdyaXRpbmcgdGhlIHZhbHVlcy4KLQkJCQkJVmFsdWVSZXRyaWV2ZSByZXRyaWV2ZXIgPSAoVmFsdWVSZXRyaWV2ZSkgdmFsdWUuYW5PYmplY3Q7Ci0JCQkJCWludCBsZW4gPSB2YWx1ZS5hbkludDsKLQkJCQkJd2hpbGUgKGxlbi0tID4gMCkKLQkJCQkJCXdyaXRlVmFsdWUob3MsIHJldHJpZXZlci5uZXh0VmFsdWUoKSwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFZPSUQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTEFHOgotCQkJCQlvcy53cml0ZUJ5dGUoRkxBRyk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmFuSW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJb3Mud3JpdGVCeXRlKFZPSUQpOwotCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVU5LTk9XTl9XUklURV9UWVBFLCB0cnVlLCB2YWx1ZSk7CQkJCQkKLQkJCX0KLQkJCWlmIChmbHVzaCkKLQkJCQlvcy5mbHVzaCgpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCi0JCi0JLyoqCi0JICogRm9yIHJlYWRpbmcgYSBsYXJnZSBudW1iZXIgb2YgYnl0ZXMuIFRoaXMgaXMgYSB2YWx1ZSB0eXBlLCBub3QgYSBjb21tYW5kLiBUaGUgY29tbWFuZCAKLQkgKiBuZWVkcyB0byBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAtMSBpZiB0aGVyZQotCSAqIGlzIG5vIG1vcmUgZGF0YSB0byBzZW5kIGFuZCB0aGUgc3RyZWFtIHNob3VsZCBjbG9zZWQuIElmIHJlYWQgc29tZXRoaW5nIGJ1dCBub3QgYWxsLAotCSAqIHRoZW4ganVzdCB3aGF0IGl0IGNvdWxkIHJlYWQgd2lsbCBiZSByZXR1cm5lZC4gVGhlIG5leHQgcmVhZCB3aWxsIHJldHVybiAtMSBmb3IgRU9GLgotCSAqCi0JICogSXQgd2lsbCByZWFkIGZyb20gdGhlIGZvcm1hdDoKLQkgKiAgIGludCAtIG51bWJlciBvZiBieXRlcyB0byByZWFkIChyZXRyaWV2ZWQgZnJvbSB0aGUgc3RyZWFtKS4KLQkgKiAgIGJ5dGVzIC0gdGhlIGFjdHVhbCBieXRlcy4KLQkgKgotCSAqIE5vdGU6IEEgY29tbWFuZCBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0JICogICAgICAgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGJ5dGUgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcmVhZEJ5dGVzKERhdGFJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiAgewotCQl0cnkgewotCQkJaW50IGJ5dGVzVG9SZWFkID0gLTE7Ci0JCQl0cnkgewotCQkJCWJ5dGVzVG9SZWFkID0gaXMucmVhZEludCgpOwotCQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChieXRlc1RvUmVhZCA9PSAtMSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoYnl0ZXNUb1JlYWQgPiBieXRlcy5sZW5ndGgpCi0JCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFRPT19NQU5ZX0JZVEVTLCBmYWxzZSwgbmV3IEludGVnZXIoYnl0ZXNUb1JlYWQpKTsKLQkJCWludCBzdGFydCA9IDA7Ci0JCQlpbnQgdG9SZWFkID0gYnl0ZXNUb1JlYWQ7Ci0JCQl3aGlsZSAodG9SZWFkID4gMCkgewotCQkJCWludCBieXRlc1JlYWQgPSBpcy5yZWFkKGJ5dGVzLCBzdGFydCwgdG9SZWFkKTsKLQkJCQlpZiAoYnl0ZXNSZWFkID09IC0xKQotCQkJCQlyZXR1cm4gYnl0ZXNUb1JlYWQgIT0gdG9SZWFkID8gYnl0ZXNUb1JlYWQtdG9SZWFkIDogLTE7CS8vIEFjdHVhbCBudW1iZXIgcmVhZCwgb3IgaWYgbm9uZSByZWFkLCB0aGVuIEVPRgotCQkJCXN0YXJ0Kz1ieXRlc1JlYWQ7Ci0JCQkJdG9SZWFkLT1ieXRlc1JlYWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gYnl0ZXNUb1JlYWQ7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQkKLQkvKioKLQkgKiBGb3Igd3JpdGluZyBhIGxhcmdlIG51bWJlciBvZiBieXRlcy4gVGhpcyBpcyBhIHZhbHVlIHR5cGUsIG5vdCBhIGNvbW1hbmQuIFRoZSBjb21tYW5kIAotCSAqIG5lZWRzIHRvIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqIEl0IHdpbGwgd3JpdGUgaXQgaW4gdGhlIGZvcm1hdDoKLQkgKiAgIGludCAtIG51bWJlciBvZiBieXRlcwotCSAqICAgYnl0ZXMgLSB0aGUgYWN0dWFsIGJ5dGVzLgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQnl0ZXMoRGF0YU91dHB1dFN0cmVhbSBvcywgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZXNUb1dyaXRlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiAgewotCQl0cnkgewotCQkJb3Mud3JpdGVJbnQoYnl0ZXNUb1dyaXRlKTsKLQkJCW9zLndyaXRlKGJ5dGVzLCAwLCBieXRlc1RvV3JpdGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCi0JCQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBTZW5kIGNvbW1hbmQgaGVscGVycwotCSAqKioqKioqKioqKioqKioqKioqKioqKiovCi0JIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kUXVpdENvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKFFVSVRfQ09OTkVDVElPTik7Ci0JCW9zLmZsdXNoKCk7Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRUZXJtaW5hdGVDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShURVJNSU5BVEVfU0VSVkVSKTsKLQkJb3MuZmx1c2goKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VPYmplY3RDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLlJFTEVBU0VfT0JKRUNUKTsKLQkJb3Mud3JpdGVJbnQoaWQpOwotCQlvcy5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIFNlbmQgYSBjYWxsYmFjayByZXF1ZXN0LiBUaGUgdmFsdWUgaXMgdG8gYmUgc2VuZCBzZXBhcmF0ZWx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kQ2FsbGJhY2tDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShDQUxMQkFDSyk7Ci0JCQlvcy53cml0ZUludChjYWxsYmFja0lEKTsKLQkJCW9zLndyaXRlSW50KG1zZ0lEKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBWYWx1ZU9iamVjdCB2YWx1ZSwgaW50IGVycm9yQ29kZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKENBTExCQUNLX0RPTkUpOwotCQkJaWYgKGVycm9yQ29kZSA9PSBOT19FUlJPUikgewotCQkJCXdyaXRlVmFsdWUob3MsIHZhbHVlLCB0cnVlKTsKLQkJCQlvcy5mbHVzaCgpOwotCQkJfSBlbHNlCi0JCQkJc2VuZEVycm9yQ29tbWFuZChvcywgZXJyb3JDb2RlLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFNlbmQgYSBzdGFydCBjYWxsYmFjayBzdHJlYW0gcmVxdWVzdC4gVGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHNlcGFyYXRlbHkuCi0JICogVGhlcmUgd2lsbCBub3QgYmUgYSBjYWxsYmFjayBkb25lIGNvbW1hbmQuIEl0IHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgdGhlIGNvbW1hbmQKLQkgKiBpcyBzZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kQ2FsbGJhY2tTdHJlYW1Db21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShDQUxMQkFDS19TVFJFQU0pOwotCQkJb3Mud3JpdGVJbnQoY2FsbGJhY2tJRCk7Ci0JCQlvcy53cml0ZUludChtc2dJRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBTVFJJTkdfTk9UX0NIVU5LRUQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBTVFJJTkdfQ0hVTktFRCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PUkVfQ0hVTktTID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTEFTVF9DSFVOSyA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfU0laRSA9IDY1MDAwLzM7IAotCQotCS8qKgotCSAqIFNlbmQgc3RyaW5nIGRhdGEuIFRoaXMgaXMgZm9yIGdlbmVyYWwgc3RyaW5nIGRhdGEuIEl0IG1ha2VzIHN1cmUgdGhhdCBpZiB0aGUgc3RyaW5nIGlzIHRvbyBiaWcgKHRoZXJlIGlzIGEgVVRGLTggbGltaXQpCi0JICogdGhhdCBpdCB3aWxsIHNlbmQgaXQgaW4gY2h1bmtzLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+cmVhZFN0cmluZ0RhdGE8L2NvZGU+IHRvIHJlYWQgc3VjaCBkYXRhIGluLgotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRTdHJpbmdEYXRhKERhdGFPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFVURi04IGNhbiB0YWtlIHVwIHRvIHRocmVlIGJ5dGVzIGZvciBlYWNoIGNoYXIuIFRvIGJlIG9uIHNhZmUgc2lkZSB3ZSB3aWxsCi0JCS8vIG5vdCBzZW5kIGEgc3RyaW5nIGxhcmdlciB0aGFuIDY1Sy8zIGFzIG9uZSBjaHVuay4KLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA8PSBDSFVOS19TSVpFKSB7Ci0JCQkvLyBMZXNzIHRoYW4gdGhlIGxpbWl0LCBzZW5kIGJ5dGUgdG8gaW5kaWNhdGUgbm90IGNodW5rZWQuCi0JCQlvcy53cml0ZUJ5dGUoU1RSSU5HX05PVF9DSFVOS0VEKTsKLQkJCW9zLndyaXRlVVRGKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdmVyIGxpbWl0LCBuZWVkIHRvIGNodW5rIGl0LgotCQkJLy8gc2VuZCBieXRlIHRvIGluZGljYXRlIGNodW5rZWQsIHRoZW4gc2VuZCB0cnVlIGxlbmd0aCBzbyB0aGF0IG90aGVyIHNpZGUga25vd3MgaG93IGJpZyB0byBjcmVhdGUuCi0JCQlvcy53cml0ZUJ5dGUoU1RSSU5HX0NIVU5LRUQpOwotCQkJb3Mud3JpdGVJbnQoc3RyaW5nLmxlbmd0aCgpKTsKLQkJCS8vIE5vdyBzZW5kIGZpcnN0IGNodW5rCi0JCQlmb3IoaW50IGk9MDsgaTxzdHJpbmcubGVuZ3RoKCk7IGkrPUNIVU5LX1NJWkUpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBpK0NIVU5LX1NJWkU7Ci0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQkvLyBUaGUgZmlyc3QgY2h1bmsgaXMganVzdCB3cml0dGVuIGFzIGlzLiBXZSBrbm93IGVuZEluZGV4IHdpbGwgYmUgb2sgYmVjYXVzZSB3ZSB3b3VsZG4ndCBnZXQgaGVyZSB1bmxlc3MgTEFSR0VSIHRoYW4gY2h1bmtzaXplLgotCQkJCQlvcy53cml0ZVVURihzdHJpbmcuc3Vic3RyaW5nKGksIGVuZEluZGV4KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gRm9sbG93aW5nIGNodW5rcyBoYXZlIGVpdGhlciBieXRlIE1PUkVfQ0hVTktTIG9yIExBU1RfQ0hVTksKLQkJCQkJaWYgKGVuZEluZGV4ID49IHN0cmluZy5sZW5ndGgoKSkgewotCQkJCQkJLy8gVGhpcyBpcyBsYXN0IGNodW5rLgotCQkJCQkJb3Mud3JpdGVCeXRlKExBU1RfQ0hVTkspOwotCQkJCQkJb3Mud3JpdGVVVEYoc3RyaW5nLnN1YnN0cmluZyhpKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBUaGlzIGlzIGFuIGludGVybWVkaWF0ZSBjaHVuay4KLQkJCQkJCW9zLndyaXRlQnl0ZShNT1JFX0NIVU5LUyk7Ci0JCQkJCQlvcy53cml0ZVVURihzdHJpbmcuc3Vic3RyaW5nKGksIGVuZEluZGV4KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVhZCBhIHN0cmluZyB0aGF0IHdhcyBzZW50IHVzaW5nIHRoZSBzZW5kU3RyaW5nRGF0YSBjb21tYW5kLgotCSAqIEBwYXJhbSBpbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFN0cmluZ0RhdGEoRGF0YUlucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlIGNodW5rZWQgPSBpcy5yZWFkQnl0ZSgpOwotCQlpZiAoY2h1bmtlZCA9PSBTVFJJTkdfTk9UX0NIVU5LRUQpCi0JCQlyZXR1cm4gaXMucmVhZFVURigpOwkvLyBOb3QgY2h1bmssIGp1c3QgcmVhZCBpdC4KLQkJZWxzZSB7Ci0JCQkvLyBJdCBpcyBjaHVua2VkLgotCQkJaW50IHRvdGFsTGVuZ3RoID0gaXMucmVhZEludCgpOwkvLyBHZXQgdGhlIHRvdGFsIGxlbmd0aC4KLQkJCVN0cmluZ0J1ZmZlciBzYnIgPSBuZXcgU3RyaW5nQnVmZmVyKHRvdGFsTGVuZ3RoKTsKLQkJCXdoaWxlKHRydWUpIHsKLQkJCQlzYnIuYXBwZW5kKGlzLnJlYWRVVEYoKSk7Ci0JCQkJaWYgKGNodW5rZWQgIT0gTEFTVF9DSFVOSykKLQkJCQkJY2h1bmtlZCA9IGlzLnJlYWRCeXRlKCk7Ci0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBzYnIudG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWFkIGJhY2sgY29tbWFuZCwgZXhwZWN0aW5nIGVpdGhlciBhIFZBTFVFIG9yIGFuIEVSUk9SLiBZb3UgY2FuIHJlcXVlc3QgdGhhdAotCSAqIGl0IGJlIG9mIGEgc3BlY2lmaWMgdHlwZSAoaWYgYW55IHR5cGUgY2FuIGJlIGFjY2VwdGVkIHRoZW4gZW50ZXIgLTEgZm9yIHRoZSB0eXBlKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTk9fVFlQRV9DSEVDSyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWFkQmFja1ZhbHVlKERhdGFJbnB1dFN0cmVhbSBpcywgVmFsdWVPYmplY3QgdmFsdWUsIGJ5dGUgZXhwZWN0ZWRUeXBlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7CQkKLQkJCWJ5dGUgdiA9IGlzLnJlYWRCeXRlKCk7Ci0JCQlzd2l0Y2ggKHYpIHsKLQkJCQljYXNlIFZBTFVFOgotCQkJCQlyZWFkVmFsdWUoaXMsIHZhbHVlKTsKLQkJCQkJaWYgKGV4cGVjdGVkVHlwZSAhPSBOT19UWVBFX0NIRUNLICYmIAotCQkJCQkJCSEoZXhwZWN0ZWRUeXBlID09IHZhbHVlLnR5cGUgfHwgKGV4cGVjdGVkVHlwZSA9PSBDb21tYW5kcy5PQkpFQ1RfSUQgJiYgdmFsdWUudHlwZSA9PSBORVdfT0JKRUNUX0lEKSkpCi0JCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVFlQRV9JTlZBTElEX0ZPUl9DT01NQU5ELCB0cnVlLCB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRVJST1I6Ci0JCQkJCWludCBjb2RlID0gaXMucmVhZEludCgpOwotCQkJCQlyZWFkVmFsdWUoaXMsIHZhbHVlKTsKLQkJCQkJdGhyb3cgbmV3IENvbW1hbmRFcnJvckV4Y2VwdGlvbihjb2RlLCB2YWx1ZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFVOS05PV05fQ09NTUFORCwgZmFsc2UsIG5ldyBCeXRlKHYpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkJCQotCX0KLQkJCi0JCi0JLyoqCi0JICogR2V0Q2xhc3MgY29tbWFuZCByZXR1cm5zIGEgR2V0Q2xhc3NSZXR1cm4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0Q2xhc3NSZXR1cm4gewotCQlwdWJsaWMgaW50IGNsYXNzSUQ7Ci0JCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlOwotCQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0OwotCQlwdWJsaWMgU3RyaW5nIHN1cGVyQ2xhc3NuYW1lOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEdldENsYXNzUmV0dXJuIHNlbmRHZXRDbGFzc0NvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoR0VUX0NMQVNTKTsKLQkJCW9zLndyaXRlVVRGKGNsYXNzTmFtZSk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJCi0JCQlHZXRDbGFzc1JldHVybiByZXQgPSBuZXcgR2V0Q2xhc3NSZXR1cm4oKTsKLQkJCWJ5dGUgdiA9IGlzLnJlYWRCeXRlKCk7Ci0JCQlzd2l0Y2ggKHYpIHsKLQkJCQljYXNlIEdFVF9DTEFTU19SRVRVUk46Ci0JCQkJCXJldC5jbGFzc0lEID0gaXMucmVhZEludCgpOwkvLyBHZXQgdGhlIG5ldyBjbGFzcyBpZC4KLQkJCQkJcmV0LmlzSW50ZXJmYWNlID0gaXMucmVhZEJvb2xlYW4oKTsJLy8gR2V0IHRoZSBpc0ludGVyZmFjZSBmbGFnCi0JCQkJCXJldC5pc0Fic3RyYWN0ID0gaXMucmVhZEJvb2xlYW4oKTsJLy8gR2V0IHRoZSBpc0Fic3RyYWN0IGZsYWcuCQkJCQkKLQkJCQkJcmV0LnN1cGVyQ2xhc3NuYW1lID0gaXMucmVhZFVURigpOwkvLyBHZXQgdGhlIHN1cGVyIGNsYXNzIG5hbWUuCi0JCQkJCXJldHVybiByZXQ7Ci0JCQkJY2FzZSBFUlJPUjoKLQkJCQkJaW50IGNvZGUgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCVZhbHVlT2JqZWN0IHZhbHVlID0gbmV3IFZhbHVlT2JqZWN0KCk7Ci0JCQkJCXJlYWRWYWx1ZShpcywgdmFsdWUpOwotCQkJCQl0aHJvdyBuZXcgQ29tbWFuZEVycm9yRXhjZXB0aW9uKGNvZGUsIHZhbHVlKTsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVU5LTk9XTl9DT01NQU5ELCBmYWxzZSwgbmV3IEJ5dGUodikpOwotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBHZXRDbGFzc0Zyb21JRCBjb21tYW5kIHJldHVybnMgYSBHZXRDbGFzc0lEUmV0dXJuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdldENsYXNzSURSZXR1cm4gewotCQlwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKLQkJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2U7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3Q7Ci0JCXB1YmxpYyBTdHJpbmcgc3VwZXJDbGFzc25hbWU7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEdldENsYXNzSURSZXR1cm4gc2VuZEdldENsYXNzRnJvbUlEQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoR0VUX0NMQVNTX0ZST01fSUQpOwotCQkJb3Mud3JpdGVJbnQoY2xhc3NJRCk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJCi0JCQlHZXRDbGFzc0lEUmV0dXJuIHJldCA9IG5ldyBHZXRDbGFzc0lEUmV0dXJuKCk7Ci0JCQlieXRlIHYgPSBpcy5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoICh2KSB7Ci0JCQkJY2FzZSBHRVRfQ0xBU1NfSURfUkVUVVJOOgotCQkJCQlyZXQuY2xhc3NOYW1lID0gaXMucmVhZFVURigpOwkvLyBHZXQgdGhlIG5ldyBjbGFzcyBuYW1lLgotCQkJCQlyZXQuaXNJbnRlcmZhY2UgPSBpcy5yZWFkQm9vbGVhbigpOwkvLyBHZXQgdGhlIGlzSW50ZXJmYWNlIGZsYWcKLQkJCQkJcmV0LmlzQWJzdHJhY3QgPSBpcy5yZWFkQm9vbGVhbigpOwkvLyBHZXQgdGhlIGlzQWJzdHJhY3QgZmxhZy4KLQkJCQkJcmV0LnN1cGVyQ2xhc3NuYW1lID0gaXMucmVhZFVURigpOwkvLyBHZXQgdGhlIHN1cGVyIGNsYXNzIG5hbWUuCi0JCQkJCXJldHVybiByZXQ7Ci0JCQkJY2FzZSBFUlJPUjoKLQkJCQkJaW50IGNvZGUgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCVZhbHVlT2JqZWN0IHZhbHVlID0gbmV3IFZhbHVlT2JqZWN0KCk7Ci0JCQkJCXJlYWRWYWx1ZShpcywgdmFsdWUpOwotCQkJCQl0aHJvdyBuZXcgQ29tbWFuZEVycm9yRXhjZXB0aW9uKGNvZGUsIHZhbHVlKTsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVU5LTk9XTl9DT01NQU5ELCBmYWxzZSwgbmV3IEJ5dGUodikpOwotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRHZXRPYmplY3REYXRhKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgaW50IG9iamVjdElELCBWYWx1ZU9iamVjdCB2YWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKEdFVF9PQkpFQ1RfREFUQSk7Ci0JCQlvcy53cml0ZUludChvYmplY3RJRCk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJcmVhZEJhY2tWYWx1ZShpcywgdmFsdWVSZXR1cm4sIE5FV19PQkpFQ1RfSUQpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3JDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBjb2RlLCBWYWx1ZU9iamVjdCBlcnJvclZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoRVJST1IpOwotCQkJb3Mud3JpdGVJbnQoY29kZSk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBlcnJvclZhbHVlLCBmYWxzZSk7Ci0JCQlvcy5mbHVzaCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kTmV3SW5zdGFuY2UoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgY2xhc3NJZCwgU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBWYWx1ZU9iamVjdCBuZXdWYWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKE5FV19JTklUX1NUUklORyk7Ci0JCQlvcy53cml0ZUludChjbGFzc0lkKTsKLQkJCW9zLndyaXRlVVRGKGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlyZWFkQmFja1ZhbHVlKGlzLCBuZXdWYWx1ZVJldHVybiwgTk9fVFlQRV9DSEVDSyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEludm9rZU1ldGhvZENvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgbWV0aG9kSUQsIFZhbHVlT2JqZWN0IGludm9rZU9uLCBWYWx1ZU9iamVjdCBwYXJtcywgVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShJTlZPS0UpOwotCQkJb3Mud3JpdGVJbnQobWV0aG9kSUQpOwotCQkJd3JpdGVWYWx1ZShvcywgaW52b2tlT24sIGZhbHNlKTsKLQkJCXdyaXRlVmFsdWUob3MsIHBhcm1zLCBmYWxzZSk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJcmVhZEJhY2tWYWx1ZShpcywgdmFsdWVSZXR1cm4sIE5PX1RZUEVfQ0hFQ0spOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSW52b2tlTWV0aG9kQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIFZhbHVlT2JqZWN0IGNsYXNzVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFZhbHVlT2JqZWN0IHBhcm1UeXBlcywgVmFsdWVPYmplY3QgaW52b2tlT24sIFZhbHVlT2JqZWN0IHBhcm1zLCBWYWx1ZU9iamVjdCB2YWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKElOVk9LRV9XSVRIX01FVEhPRF9QQVNTRUQpOwotCQkJd3JpdGVWYWx1ZShvcywgY2xhc3NUeXBlLCBmYWxzZSk7Ci0JCQlvcy53cml0ZVVURihtZXRob2ROYW1lKTsKLQkJCXdyaXRlVmFsdWUob3MsIHBhcm1UeXBlcywgZmFsc2UpOwotCQkJd3JpdGVWYWx1ZShvcywgaW52b2tlT24sIGZhbHNlKTsKLQkJCXdyaXRlVmFsdWUob3MsIHBhcm1zLCBmYWxzZSk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJcmVhZEJhY2tWYWx1ZShpcywgdmFsdWVSZXR1cm4sIE5PX1RZUEVfQ0hFQ0spOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEdldEFycmF5Q29udGVudHNDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgaW50IGFycmF5SUQsIFZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoR0VUX0FSUkFZX0NPTlRFTlRTKTsKLQkJCW9zLndyaXRlSW50KGFycmF5SUQpOwotCQkJb3MuZmx1c2goKTsKLQkJCXJlYWRCYWNrVmFsdWUoaXMsIHZhbHVlUmV0dXJuLCBOT19UWVBFX0NIRUNLKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBDb21tYW5kcygpIHsKLQkJLy8gTmV2ZXIgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9FeHByZXNzaW9uQ29tbWFuZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9FeHByZXNzaW9uQ29tbWFuZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzNzA4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvRXhwcmVzc2lvbkNvbW1hbmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0KLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Db21tYW5kcyB7Ci0KLQkvLyBUaGVzZSBhcmUgdGhlIHN1Yi1jb21tYW5kcyB1bmRlciBFWFBSRVNTSU9OX1RSRUVfQ09NTUFORFMgdGhhdCBjYW4gYmUgc2VuZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUKLQkJU1RBUlRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkcgPSAwLAotCQlQVVNIX0VYUFJFU1NJT04gPSAxLAotCQlFTkRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkcgPSAyLAotCQlTWU5DX1JFUVVFU1QgPSAzLAotCQlQVUxMX1ZBTFVFX1JFUVVFU1QgPSA0LAotCQlUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1QgPSA1LAotCQlSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUID0gNjsKLQkJCi0JLy8gVGhlc2UgYXJlIHRoZSBleHByZXNzaW9uIHNwZWNpZmljIGVycm9yIGNvZGVzIChpdCBjYW4gYWxzbyBzZW5kIGJhY2sgZ2VuZXJhbCBvbmVzLiBTZWUgU1lOQ19SRVFVRVNUIGRvY3MgbG93ZXIgZG93bikuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQKLQkJRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04gPSBDb21tYW5kcy5NQVhfRVJST1JfQ09ERSsxOwkvLyBObyBleHByZXNzaW9uIHZhbHVlIG9jY3VycmVkLgotCQotCS8vIFRoZXNlIGFyZSB0aGUgZmxhZyB2YWx1ZXMgc2VudCBpbiBwcm94eSByZXNvbHV0aW9uIHdoZW4gZG9lc24ndCByZXNvbHZlIHRvIHByb3h5LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50Ci0JCUVYUFJFU1NJT05QUk9YWV9WT0lEVFlQRSA9IDAsCS8vIEV4cHJlc3Npb24gcHJveHkgcmVzb2x2ZXMgdG8gdm9pZCB0eXBlLgotCQlFWFBSRVNTSU9OUFJPWFlfTk9UUkVTT0xWRUQgPSAxOwkvLyBFeHByZXNzaW9uIHByb3h5IG5vdCByZXNvbHZlZC4KLQkKLQkvLyBUaGVzZSBhcmUgdGhlIHRyYWNlIHZhbHVlcyBzZW50IGluIFNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlCi0JCVRSQUNFX0RFRkFVTFQgPSAtMSwKLQkJVFJBQ0VfT0ZGID0gMCwKLQkJVFJBQ0VfT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTlRSQUNFID0gInByb3h5dm0uZXhwcmVzc2lvblRyYWNlIjsJLy8gVGhlIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdHVybmluZyBvbiBleHByZXNzaW9uIHRyYWNpbmcuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xEID0gInByb3h5dm0uZXhwcmVzc2lvblRyYWNlVGltZXJUaHJlc2hvbGQiOwkvLyBUaGUgc3lzdGVtIHByb3BlcnR5IGZvciB0aW1lciB0aHJlc2hvbGQuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFRoZSBmb3JtYXQgb2YgdGhlIGNvbW1hbmRzIGFyZToKLQkgKiAJCU5vdGU6IE1vc3Qgb2YgdGhlIGNvbW1hbmRzIHdpbGwgbm90IGJlaW5nIGRvaW5nIGEgb3MuZmx1c2goKSBhdCB0aGUgZW5kLiBXZSBhcmUganVzdCBnb2luZyB0bwotCSAqIAkJYmUgc3RyZWFtaW5nIHRoZSBkYXRhIG92ZXIgdGhlIGxpbmUuIEF0IHRoZSBlbmQgd2Ugd2lsbCBmbHVzaCBhbmQgdGhlbiBjYXRjaCB1cC4gVGhhdCB3YXkKLQkgKiAJCXdlIGFyZW4ndCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgc2lkZSBhcyB3ZSBzZW5kIHRoZSBkYXRhLgotCSAqIAotCSAqIFNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOiAwYiwgdHJhY2UKLQkgKiAJU3RhcnQgcHJvY2Vzc2luZy4KLQkgKiAgYnl0ZSh0cmFjZSk6IC0xIDogZG8gZGVmYXVsdAotCSAqICAgICAgICAgICAgICAgIDAgOiBubyB0cmFjZQotCSAqICAgICAgICAgICAgICAgIDEgOiBkbyB0cmFjZQotCSAqIAotCSAqIFBVU0hfRVhQUkVTU0lPTjogMWIsIGIKLQkgKiAJUHVzaCBhbiBleHByZXNzaW9uLiBXaGVyZSAiYiIgaXMgdGhlIGV4cHJlc3Npb24gdHlwZSBmcm9tIElJbnRlcm5hbEV4cHJlc3Npb25Db25zdGFudHMuIAotCSAqIAlUaGUgYWN0dWFsIGRhdGEgdGhhdCBmb2xsb3dzIGlzIGV4cHJlc3Npb24gdHlwZSBkZXBlbmRlbnQgYW5kIHdpbGwgYmUKLQkgKiAJc2VudCBpbiBhIGZvbGxvd2luZyBjYWxsIHRvIEV4cHJlc3Npb25Db21tYW5kcyBhcyBpdCBidWlsZHMgdXAgdGhlIGFjdHVhbCBjb21tYW5kLgotCSAqIAlTZWUgUkVNRXhwcmVzc2lvbiBhbmQgZWFjaCB0eXBlIG9mIHB1c2ggY2FsbCBtZXRob2Qgd2l0aGluIGl0IHRvIHNlZSB0aGUgYWN0dWFsCi0JICogCXNlbnQgZGF0YS4KLQkgKiAKLQkgKiBFTkRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkc6IDJiCi0JICogCUVuZCB0aGUgcHJvY2Vzc2luZyBhbmQgY2xlYW4gdXAuCi0JICogCi0JICogU1lOQ19SRVFVRVNUOiAzYgotCSAqIAlUaGlzIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cy4gVGhlIHJlYXNvbiBpdCBpcyBjYWxsZWQgc3luYyBpcyBiZWNhdXNlIHRoZQotCSAqIAlJREUgd2lsbCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSBhbmQgcmVhZCBiYWNrIHRoZSB2YWx1ZS4gSXQgd2lsbCBzZW5kIGJhY2s6Ci0JICogCQkxOiBWQUxVRSBjb21tYW5kIHdpdGggYm9vbGVhbiB0cnVlIGFzIHRoZSB2YWx1ZS4KLQkgKiAJCTI6IEVSUk9SIGNvbW1hbmQgd2l0aCBjb2RlIG9mIEV4cHJlc3Npb25DbGFzc05vdEZvdW5kLCB3aXRoIHZhbHVlIG9mIFN0cmluZyB3aXRoIG1lc3NhZ2UgZnJvbSBleGNlcHRpb24uCi0JICogCQkzOiBFUlJPUiBjb21tYW5kIHdpdGggY29kZSBvZiBFWFBSRVNTSU9OX05PRVhQUkVTU0lPTlZBTFVFX0VYQ0VQVElPTiwgd2l0aCB2YWx1ZSBvZiBTdHJpbmcgd2l0aCBtZXNzYWdlIGZyb20gZXhjZXB0aW9uLgotCSAqIAkJNDogVEhST1dBQkxFIGNvbW1hbmQgd2l0aCB0aGUgYWN0dWFsIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLgotCSAqIAotCSAqCi0JICogUFVMTF9WQUxVRV9SRVFVRVNUOiA0YgotCSAqIAlUaGlzIHdpbGwgZG8gYSBzeW5jIHVwIGFuZCByZXR1cm4gdGhlIHZhbHVlIGZyb20gdGhlIGV4cHJlc3Npb24uCi0JICogCUlERSB3aWxsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZWF0ZSBhbmQgcmVhZCBiYWNrIHRoZSB2YWx1ZS4gSXQgd2lsbCBzZW5kIGJhY2s6Ci0JICogCQkxOiBWQUxVRSBjb21tYW5kIHdpdGggdGhlIHJlc3VsdCBhcyB0aGUgdmFsdWUuCi0JICogCQkyOiBFUlJPUiBvciBFWENFUFRJT04gaWYgdGhlcmUgd2VyZSBlcnJvcnMsIHNlZSBTWU5DX1JFUVVFU1Qgd2l0aCB0aGUgZm9ybWF0IHRoZXkgYXJlIHNlbnQgYmFjay4KLQkgKiAKLQkgKiBUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1Q6IDViCi0JICogIFRoaXMgd2lsbCBkbyBhIHN5bmMgdXAsIGFuZCByZXR1cm4gdGhlIEV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyIHRoYXQgdGhlIHJlcXVlc3QgaXMgZm9yLiBBbmQgcmVtb3ZlCi0JICogIHRoZSBjb250cm9sbGVyIGZyb20gaXRzIGxpc3Qgb2YgYWN0aXZlIGV4cHJlc3Npb24gY29udHJvbGxlcnMuIAotCSAqICAKLQkgKiBSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUOiA2YiwgYW5FeHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlcgotCSAqICBUaGlzIHdpbGwgdGFrZSB0aGUgZ2l2ZW4gY29udHJvbGxlciBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGNvbnRyb2xsZXJzIHRoaXMgY29ubmVjdGlvbiBpcyBoYW5kbGluZy4gSXQgcmV0dXJucyBub3RoaW5nLiAgCi0JICogIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JSW50ZXJuYWxFeHByZXNzaW9uQ29uc3RhbnRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTUV4cHJlc3Npb24KLQkgKiAKLQkgKi8KLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBzdGFydCBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklECi0JICogQHBhcmFtIHRyYWNlIAotCSAqIEBwYXJhbSBvcwotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmdDb21tYW5kKGludCBleHByZXNzaW9uSUQsIGJ5dGUgdHJhY2UsIERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShDb21tYW5kcy5FWFBSRVNTSU9OX1RSRUVfQ09NTUFORCk7Ci0JCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCW9zLndyaXRlQnl0ZShTVEFSVF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORyk7Ci0JCW9zLndyaXRlQnl0ZSh0cmFjZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgdGhlIGVuZCBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBvcwotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEVuZEV4cHJlc3Npb25Qcm9jZXNzaW5nQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQlvcy53cml0ZUludChleHByZXNzaW9uSUQpOwotCQlvcy53cml0ZUJ5dGUoRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HKTsKLQkJb3MuZmx1c2goKTsJLy8gRmx1c2hpbmcgYmVjYXVzZSB3ZSBhcmUgZG9uZSBhbmQgd2FudCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnb2VzIG91dC4KLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBhbiBleHByZXNzaW9uIHN1YmNvbW1hbmQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gc3ViY29tbWFuZAotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIERhdGFPdXRwdXRTdHJlYW0gb3MsIGJ5dGUgc3ViY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJb3Mud3JpdGVCeXRlKFBVU0hfRVhQUkVTU0lPTik7Ci0JCW9zLndyaXRlQnl0ZShzdWJjb21tYW5kKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBqdXN0IGEgYnl0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gYUJ5dGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRCeXRlKERhdGFPdXRwdXRTdHJlYW0gb3MsIGJ5dGUgYUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShhQnl0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQganVzdCBhbiBpbnQuCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFuSW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSW50KERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVJbnQoYW5JbnQpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGp1c3QgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRTdHJpbmcoRGF0YU91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGFTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRzLnNlbmRTdHJpbmdEYXRhKG9zLCBhU3RyaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBqdXN0IGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gYUJvb2wKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRCb29sZWFuKERhdGFPdXRwdXRTdHJlYW0gb3MsIGJvb2xlYW4gYUJvb2wpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQm9vbGVhbihhQm9vbCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgdGhlIHB1bGwgdmFsdWUgY29tbWFuZC4gQWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcHJveGllcywgY2FsbGVyIHNob3VsZCBjYWxsIGdldEZpbmFsVmFsdWUoKSB0byBnZXQgdGhlIHZhbHVlLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGlzCi0JICogQHBhcmFtIHByb3h5aWRzIGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGlzIGlzIHRoZSBsaXN0IG9mIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXR1cm5lZCBhcyByZW5kZXJlZC4KLQkgKiBAcGFyYW0gc2VuZGVyIHNlbmRlciB1c2VkIHRvIHByb2Nlc3MgdGhlIHJlc29sdmVkIHByb3h5IGlkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kUHVsbFZhbHVlQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzLCBDb21tYW5kcy5WYWx1ZVNlbmRlciBzZW5kZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShDb21tYW5kcy5FWFBSRVNTSU9OX1RSRUVfQ09NTUFORCk7Ci0JCQlvcy53cml0ZUludChleHByZXNzaW9uSUQpOwotCQkJb3Mud3JpdGVCeXRlKFBVTExfVkFMVUVfUkVRVUVTVCk7Ci0JCQlzZW5kUHJveHlJRHMob3MsIHByb3h5aWRzKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlpZiAocHJveHlpZHMgIT0gbnVsbCkgewotCQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaXMsIHByb3h5aWRzLCBDb21tYW5kcy5BUlJBWV9JRFMpOwkvLyBSZWFkIHRoZSBhcnJheSBoZWFkZXIuCi0JCQkJc2VuZGVyLmluaXRpYWxpemUocHJveHlpZHMpOwotCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpcywgcHJveHlpZHMuYW5JbnQsIHNlbmRlciwgcHJveHlpZHMsIHRydWUpOwkvLyBSZWFkIHRoZSBhcnJheS4KLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGEgc3luYyBjb21tYW5kLiBUaGlzIGRvZXMgYSBzeW5jaHJvbml6ZSB3aXRoIHRoZSByZW1vdGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IuIEl0IG1ha2VzIHN1cmUgdGhhdCB0aGUKLQkgKiBzdHJlYW0gaXMgY2F1Z2h0IGFuZCBkb2Vzbid0IHJldHVybiB1bnRpbCBldmVyeXRoaW5nIG9uIHRoZSBzdHJlYW0gaGFzIGJlZW4gcHJvY2Vzc2VkLiBTaG91bGQgdGhlbiBjYWxsCi0JICogZ2V0RmluYWxWYWx1ZSgpIHRvIHZlcmlmeSB0aGUgZXhwcmVzc2lvbiBpcyB2YWxpZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBwcm94eWlkcyBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcyBpcyB0aGUgbGlzdCBvZiBleHByZXNzaW9uIHByb3h5IGlkcyB0aGF0IG5lZWQgdG8gYmUgcmV0dXJuZWQgYXMgcmVuZGVyZWQuCi0JICogQHBhcmFtIHNlbmRlciB0aGUgc2VuZGVyIHVzZWQgZm9yIHJlYWRpbmcgYmFjayB0aGUgcHJveHlpZCByZXNvbHV0aW9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kU3luY0NvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShTWU5DX1JFUVVFU1QpOwotCQkJc2VuZFByb3h5SURzKG9zLCBwcm94eWlkcyk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJaWYgKHByb3h5aWRzICE9IG51bGwpIHsKLQkJCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGlzLCBwcm94eWlkcywgQ29tbWFuZHMuQVJSQVlfSURTKTsJLy8gUmVhZCB0aGUgYXJyYXkgaGVhZGVyLgotCQkJCXNlbmRlci5pbml0aWFsaXplKHByb3h5aWRzKTsKLQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaXMsIHByb3h5aWRzLmFuSW50LCBzZW5kZXIsIHByb3h5aWRzLCB0cnVlKTsJLy8gUmVhZCB0aGUgYXJyYXkuCi0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkKLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBwcm94eWlkcyAoaWYgbm90IG51bGwpIGFzIHBhcnQgb2YgYSBjb21tYW5kLiBVc2VkIGJ5IHN5bmMgYW5kIHB1bGxWYWx1ZS4KLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gcHJveHlpZHMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVlc3RpbmcgcHJveHkgaWRzLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRQcm94eUlEcyhEYXRhT3V0cHV0U3RyZWFtIG9zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKHByb3h5aWRzICE9IG51bGwpIHsKLQkJCW9zLndyaXRlQm9vbGVhbih0cnVlKTsJLy8gSW5kaWNhdGVzIHByb3h5IGlkcyBiZWluZyBzZW50LgotCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvcywgcHJveHlpZHMsIGZhbHNlLCBmYWxzZSk7Ci0JCX0gZWxzZQotCQkJb3Mud3JpdGVCb29sZWFuKGZhbHNlKTsJLy8gTm8gcHJveHlpZHMgYmVpbmcgc2VudC4KLQl9Ci0JCi0JLyoqCi0JICogU2VuZCB0aGUgdHJhbnNmZXIgZXhwcmVzc2lvbiBjb21tYW5kIGFuZCByZWNlaXZlIGJhY2sgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIGNvbnRyb2xsZXIuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kVHJhbnNmZXJFeHByZXNzaW9uQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1QpOwotCQkJb3MuZmx1c2goKTsKLQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaXMsIGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLCBDb21tYW5kcy5OT19UWVBFX0NIRUNLKTsgLy8gUmVhZCB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlcgotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgdGhlIHJlc3VtZSBleHByZXNzaW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXIKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlc3VtZUV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIERhdGFPdXRwdXRTdHJlYW0gb3MsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUKTsKLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3MsIGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyLCBmYWxzZSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIEV4cHJlc3Npb25Db21tYW5kcygpIHsKLQkJLy8gTmV2ZXIgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLgotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9JT0NvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9JT0NvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1MWE3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvSU9Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY29tbWFuZCBleGNlcHRpb24gb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGlvIHJlcXVlc3QKLSAqIGluIGEgY2FsbGJhY2sgc3RyZWFtLiBUaGlzIGV4Y2VwdGlvbiB3cmFwcGVycyB0aGUgY29tbWFuZCBleGNlcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIElPQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzA4OTQ3MTk1MTY0MzgyNzc5TDsKLQlwcm90ZWN0ZWQgQ29tbWFuZEV4Y2VwdGlvbiBmRXhjZXB0aW9uOwotCQotCXB1YmxpYyBJT0NvbW1hbmRFeGNlcHRpb24oQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCWZFeGNlcHRpb24gPSBlOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBmRXhjZXB0aW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQlmRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBwKSB7Ci0JCWZFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHApIHsKLQkJZkV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocCk7Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1RyYW5zbWl0YWJsZUFycmF5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVHJhbnNtaXRhYmxlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNDI3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVHJhbnNtaXRhYmxlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQSB2YWx1ZSBjYW4gYmUgYSBUcmFuc21pdGFibGVBcnJheS4gVGhpcyBtZWFucyB0aGlzIHZhbHVlIGlzIGFuIGFycmF5IHRoYXQKLSAqIG5lZWRzIHRvIGhhdmUgYSBWYWx1ZVJldHJpZXZlciBjcmVhdGVkIGZvciBpdC4gVGhpcyBpcyB1c2VkIGlmIHRoZSBhcnJheSBoYXMgSUQncyBpbgotICogaXQgYW5kIGlzIG5vdCBhbiBleGlzdGluZyBhcnJheSBvbiB0aGUgc2VydmVyIG9yIGFsbCBjb25zdGFudCB2YWx1ZXMuCi0gKgotICogTk9URTogSXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBJQmVhblR5cGVQcm94aWVzIG9mIHRoZSBwYXJtcyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0gKiAgICAgICBJdCBzaG91bGQgc3RpbGwgd29yaywgYnV0IGl0IGNvdWxkIGJlIGFza2luZyBmb3IgdGhlbSBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXF1ZXN0Ci0gKiAgICAgICBpZiB0aGV5IGFyZSBub3QgZmlyc3QgZ290dG9uLiBBbmQgdGhpcyBjb3VsZCB0aHJvdyBhIG5vbi1yZWNvdmVyYWJsZSBleGNlcHRpb24gaWYgbm90IGZvdW5kLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNtaXRhYmxlQXJyYXkgewotCXB1YmxpYyBpbnQgY29tcG9uZW50VHlwZUlEOwkvLyBUaGUgaWQgb2YgdGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheS4KLQlwdWJsaWMgT2JqZWN0W10gYXJyYXk7CS8vIFRoZSBhcnJheSBpdCBzZWxmLgotCXB1YmxpYyBUcmFuc21pdGFibGVBcnJheShpbnQgdHlwZUlELCBPYmplY3RbXSBhbkFycmF5KSB7Ci0JCWNvbXBvbmVudFR5cGVJRCA9IHR5cGVJRDsKLQkJYXJyYXkgPSBhbkFycmF5OwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZkNDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0vKioKLSAqIFRoaXMgaXMgYW4gZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlIHByb2Nlc3NpbmcKLSAqIG9mIGRhdGEgd2FzIGludmFsaWQgZm9yIHRoZSBjb21tYW5kLiAKLSAqIFRoZXJlIHdpbGwgYmUgYSBmbGFnIGluZGljdGluZyBlcnJvciB0eXBlLCBhbmQgYSBmbGFnCi0gKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgcmVjb3ZlcmFibGUgb3Igbm90LgotICogSWYgbm90IHJlY292ZXJhYmxlLCB0aGVuIHRoZSBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIGNsb3NlZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIENvbW1hbmRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzA5NzY5MzM4NDQ1MzI0MzExM0w7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkVycm9yVHlwZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZlJlY292ZXJhYmxlOwotCQotCXB1YmxpYyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihPYmplY3QgZXJyb3JUeXBlLCBib29sZWFuIHJlY292ZXJhYmxlKSB7Ci0JCWZFcnJvclR5cGUgPSBlcnJvclR5cGU7Ci0JCWZSZWNvdmVyYWJsZSA9IHJlY292ZXJhYmxlOwotCX0JCQotCQotCXB1YmxpYyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihPYmplY3QgZXJyb3JUeXBlLCBib29sZWFuIHJlY292ZXJhYmxlLCBPYmplY3QgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQkJZkVycm9yVHlwZSA9IGVycm9yVHlwZTsKLQkJZlJlY292ZXJhYmxlID0gcmVjb3ZlcmFibGU7Ci0JfQotCQotCXB1YmxpYyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihPYmplY3QgZXJyb3JUeXBlLCBib29sZWFuIHJlY292ZXJhYmxlLCBTdHJpbmcgbXNnLCBPYmplY3QgZGF0YSkgewotCQlzdXBlcihtc2csIGRhdGEpOwotCQlmRXJyb3JUeXBlID0gZXJyb3JUeXBlOwotCQlmUmVjb3ZlcmFibGUgPSByZWNvdmVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVycm9yVHlwZSgpIHsKLQkJcmV0dXJuIGZFcnJvclR5cGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVjb3ZlcmFibGUoKSB7Ci0JCXJldHVybiBmUmVjb3ZlcmFibGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJU3RyaW5nIG0gPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0JCWlmIChmRXJyb3JUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBkYXRhTXNnID0gZ2V0RXhjZXB0aW9uRGF0YSgpICE9IG51bGwgPyAiIEVycm9yZGF0YT0iK2dldEV4Y2VwdGlvbkRhdGEoKS50b1N0cmluZygpIDogIiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKG0gPT0gbnVsbCkKLQkJCQlyZXR1cm4gIkVycm9ydHlwZT0iK2ZFcnJvclR5cGUudG9TdHJpbmcoKSArIGRhdGFNc2c7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbSArICc6JyArICJFcnJvcnR5cGU9IitmRXJyb3JUeXBlLnRvU3RyaW5nKCkgKyBkYXRhTXNnOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJcmV0dXJuIG07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1VuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwMzE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqIFdyYXBwZXIgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaW4gYSBDb21tYW5kIEV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTY1NDEzNDM3MDExNTY1MDk2OUw7Ci0KLQlwdWJsaWMgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oYm9vbGVhbiByZWNvdmVyYWJsZSwgVGhyb3dhYmxlIGRhdGEpIHsKLQkJc3VwZXIoQ29tbWFuZHMuU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiwgcmVjb3ZlcmFibGUsIGRhdGEpOwotCX0KLQkKLQlwdWJsaWMgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oYm9vbGVhbiByZWNvdmVyYWJsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGRhdGEpIHsKLQkJc3VwZXIoQ29tbWFuZHMuU09NRV9VTkVYUEVDVEVEX0VYQ0VQVElPTiwgcmVjb3ZlcmFibGUsIG1zZywgZGF0YSk7Ci0JfQotCQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gKFRocm93YWJsZSkgZ2V0RXhjZXB0aW9uRGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBsb2NhbE1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQkJaWYgKGdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQlpZiAobG9jYWxNc2cgPT0gbnVsbCB8fCBsb2NhbE1zZy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBnZXRFeGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGxvY2FsTXNnICsgIjogIiArIGdldEV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4KLQkJCWxvY2FsTXNnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludEV4Y2VwdGlvblN0YWNrVHJhY2UoKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50RXhjZXB0aW9uU3RhY2tUcmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBwKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBwKSB7Ci0JCWdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShwKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzJhNTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3NjaGVtYS9jb250cmlidXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS5wcm94eSIgaWQ9ImNvbnRyaWJ1dG9ycyIgbmFtZT0iUHJveHkgQ29uZmlndXJhdGlvbiBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBzdXBwbHkgY29uZmlndXJhdGlvbiBjb250cmlidXRvcnMgZm9yIHByb3h5IHN1cHBvcnQuIFlvdSBjYW4gc3VwcGx5IGEgY29udHJpYnV0b3IgZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGNvbnRhaW5lciBvciBmb3IgYSBwbHVnaW4uCi0mbHQ7cCZndDsKLVRoZSB3YXkgY29uZmlndXJhdGlvbiBjb250cmlidXRvcnMgd29yayBpcyB0aGF0IHdoZW4gYSBwcm94eSB2bSBpcyBzdGFydGVkLCBpdCBmaXJzdCBydW5zIHRocm91Z2ggYWxsIG9mIHRoZSBleHBsaWNpdCBjb250cmlidXRvcnMgdGhhdCB3ZXJlIGdpdmVuIHRvIGl0LiBJdCB0aGVuIGdvZXMgdGhyb3VnaCB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0IGFuZCBmaW5kcyB0aGUgY29udGFpbmVycy4gSWYgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IsIGl0IHdpbGwgYmUgY2FsbGVkIGFzIGEgY29udHJpYnV0b3IuIFRoZW4gYWxsIG9mIHRoZSBleHRlbnNpb25zIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHdpbGwgYmUgc2VhcmNoZWQgZm9yIHRob3NlIGhhdmUgdGhlIHNhbWUgY29udGFpbmVyIGlkLCBhbmQgaWYgc28gdGhleSB3aWxsIGJlIGNhbGxlZCBhcyBhIGNvbnRyaWJ1dG9yLgotJmx0O3AmZ3Q7Ci1UaGUgZXh0ZW5zaW9ucyB3aWxsIGJlIGNhbGxlZCBpbiBwbHVnaW4gb3JkZXIuIEluIG90aGVyIHdvcmRzIGlmIHBsdWdpbiBBIGRlcGVuZHMgb24gcGx1Z2luIEIsIHRoZSBjb250cmlidXRpb24gaW4gcGx1Z2luIEEgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJpYnV0aW9uIGluIHBsdWdpbiBCLgotJmx0O3AmZ3Q7Ci1JZiBhIHBsdWdpbiBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0IChpbiBvdGhlciB3b3JkcyB0aGUgcHJvamVjdCBpcyBQREUgcGx1Z2luIGRldmVsb3BtZW50IHByb2plY3QgYW5kIHJlcXVpcmVzIGEgcGx1Z2luKSB0aGVuIHRoZSBjb250cmlidXRvciB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaWQgd2lsbCBiZSBjYWxsZWQuCi0mbHQ7cCZndDsKLUJvdGggY29udGFpbmVyIGFuZCBwbHVnaW4gY2FuIGJlIHNwZWNpZmllZCwgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGVtIG11c3QgYmUgc3BlY2lmaWVkLiBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhpcyBlbnRyeSB3aWxsIGJlIHVzZWQgaWYgZWl0aGVyIHRoZSBjb250YWluZXIgb3IgdGhlIHBsdWdpbiBpcyBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250cmlidXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRyaWJ1dG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGNvbnRyaWJ1dG9yLiBFaXRoZXIgdGhlIGNvbnRhaW5lciBhbmQvb3IgdGhlIHBsdWdpbiBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgY29udHJpYnV0b3IgaXMgZm9yIGEgY29udGFpbmVyLiBUaGUgdmFsdWUgaXMgdGhlIGNvbnRhaW5lciBpZCAoZS5nLiAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSJnF1b3Q7Jmx0Oy9iJmd0OykuIFRoaXMgd2lsbCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUiZxdW90OyBvciAmcXVvdDsvSlJFX0NPTlRBSU5FUi8uLi4mcXVvdDsuIE9yICZsdDtiJmd0OyZxdW90O0pSRV9DT05UQUlORVIvWFlaJnF1b3Q7Jmx0Oy9iJmd0OyB3b3VsZCBtYXRjaCAmcXVvdDsvSlJFX0NPTlRBSU5FUi9YWVovLi4uJnF1b3Q7LgotJmx0O3AmZ3Q7Ci1Zb3UgY2FuIGFsc28gdXNlIGEgcmVndWxhciBleHByZXNzaW9uLiBBbiBleHByZXNzaW9uIHN1Y2ggYXMgJmx0O2ImZ3Q7JnF1b3Q7U1dUX0NPTlRBSU5FUi8oLiovKSpQREUmcXVvdDsmbHQ7L2ImZ3Q7IHdpbGwgbWF0Y2ggJnF1b3Q7L1NXVF9DT05UQUlORVIvSkZBQ0UvUERFJnF1b3Q7IGFuZCAmcXVvdDsvU1dUX0NPTlRBSU5FUi9QREUmcXVvdDsgYnV0IHdpbGwgbm90IG1hdGNoICZxdW90Oy9TV1RfQ09OVEFJTkVSJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyaWJ1dG9yLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY29udHJpYnV0b3I6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0ucHJveHkuY29udHJpYnV0b3JzJnF1b3Q7Jmd0OwotICAmbHQ7Y29udHJpYnV0b3IKLSAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkNvbnRyaWJ1dG9ySW1wbGVtZW50YXRpb24mcXVvdDsKLSAgIGNvbnRhaW5lcj0mcXVvdDtNWV9DT05UQUlORVImcXVvdDsmZ3Q7Ci0gICZsdDsvY29udHJpYnV0b3ImZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciZsdDsvc2FtcCZndDsgaW50ZXJmYWNlIGZvciBjb250cmlidXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlcmUgaXMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlciZsdDsvc2FtcCZndDsgYXZhaWxhYmxlIHRvIHN1YmNsYXNzIHRvIHByb3ZpZGUgc3BlY2lmaWMgb3ZlcnJpZGVzLiBUaGUgZGVmYXVsdCBmb3IgdGhlIGFkYXB0ZXIgaXMgdGhhdCBpdCBkb2VzbiZhcG9zO3QgZG8gYW55dGhpbmcuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2V4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkYzhkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5wcm94eSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnByb3h5IiBpZD0iZXh0ZW5zaW9ucyIgbmFtZT0iUHJveHkgRXh0ZW5zaW9uIFJlZ2lzdHJhdGlvbiBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBzdXBwbHkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgZm9yIHByb3h5IHN1cHBvcnQuIFlvdSBjYW4gc3VwcGx5IGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGNvbnRhaW5lciBvciBmb3IgYSBwbHVnaW4uCi0mbHQ7cCZndDsKLUp1c3QgYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGJlZm9yZSBhbnkgY29udHJpYnV0aW9ucyB0byB0aGUgcmVnaXN0cnkgY2FuIGJlIG1hZGUsIHRoZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyBmb3IgdGhlIGdpdmVuIHJlZ2lzdHJ5IHR5cGUgKHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OykgZm9yIGFueSBwYXRocy9wbHVnaW5zL2NvbnRhaW5lcnMgdGhhdCBoYXZlIHRoYXQgbWF0Y2ggd2lsbCBiZSBleGVjdXRlZC4gVGhlc2UgYXJlIHVzZWQgdG8gZG8gZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgKHN1Y2ggYXMgQmFzZVByb3h5RmFjdHJveVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJQmVhblR5cGVQcm94eUZhY3RvcnkgYUZhY3RvcnkpKS4gVGhlc2UgcmVnaXN0cmF0aW9ucyBzaG91bGRuJmFwb3M7dCBkbyBhbnkgYWN0dWFsIHByb3h5IGNhbGxzIGJlY2F1c2UgYXQgdGhpcyB0aW1lIG5vdCBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaGFkIGJlZW4gcnVuIHlldCBhbmQgaXQgbWF5IGFjY2lkZW50bHkgcmVmZXJlbmNlIGEgcGFja2FnZSB0aGF0IHNob3VsZCBoYXZlIGFuIGV4dGVuc2lvbiBmYWN0b3J5IG9uIGl0LCBidXQgdGhhdCBmYWN0b3J5IGhhcyBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZC4gSW5zdGVhZCB0aGUgY29udHJpYnV0b3IgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBiZSB1c2VkIGZvciB0aGF0IGJlY2F1c2UgYXQgdGhhdCB0aW1lIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0mbHQ7cCZndDsKLVRoZSB3YXkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgd29yayBpcyB0aGF0IHdoZW4gYSBwcm94eSB2bSBpcyBzdGFydGVkLCBpdCBmaW5kcyBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhvc2UgaGF2ZSB0aGUgc2FtZSBjb250YWluZXIgaWQgYW5kIHJlZ2lzdHJ5IHR5cGUgaWQsIGFuZCBpZiBzbyB0aGV5IHdpbGwgYmUgY2FsbGVkIGFzIGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uCi0mbHQ7cCZndDsKLUlmIGEgcGx1Z2luIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QgKGluIG90aGVyIHdvcmRzIHRoZSBwcm9qZWN0IGlzIFBERSBwbHVnaW4gZGV2ZWxvcG1lbnQgcHJvamVjdCBhbmQgcmVxdWlyZXMgYSBwbHVnaW4pIHRoZW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGlkIHdpbGwgYmUgY2FsbGVkLgotJmx0O3AmZ3Q7Ci1Cb3RoIGNvbnRhaW5lciBhbmQgcGx1Z2luIGNhbiBiZSBzcGVjaWZpZWQsIGJ1dCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIHNwZWNpZmllZC4gSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoaXMgZW50cnkgd2lsbCBiZSB1c2VkIGlmIGVpdGhlciB0aGUgY29udGFpbmVyIG9yIHRoZSBwbHVnaW4gaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVnaXN0cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVnaXN0cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQcm94eSBFeHRlbnNpb24gZmFjdG9yaWVzIHJlZ2lzdHJhdGlvbiBjb250cmlidXRvci4gVXNlZCB0byBjb250cmlidXRlIHRoZSBmYWN0b3J5IGV4dGVuc2lvbnMgYmFzZWQgdXBvbiB0aGUgcmVnaXN0cnkgdHlwZSAoZS5nLiAmcXVvdDtvcmcuZWNsaXBzZS5qZW0uUkVNT1RFJnF1b3Q7IGZvciByZW1vdGUgdm0gcmVnaXN0cmllcykgZGVwZW5kaW5nIHVwb24gdGhlIGNvbnRhaW5lciBvciBwbHVnaW4gcGF0aC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVnaXN0cnlUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSByZWdpc3RyeSB0aGlzIGV4dGVuc2lvblJlZ2lzdHJhdGlvbiBpcyBmb3IsIHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OyBmb3IgdGhlIHJlbW90ZSB2bSByZWdpc3RyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBleHRlbnNpb24gcmVnaXN0cmF0aW9uIGlzIGZvciBhIGNvbnRhaW5lci4gVGhlIHZhbHVlIGlzIHRoZSBjb250YWluZXIgaWQgKGUuZy4gJmx0O2ImZ3Q7JnF1b3Q7SlJFX0NPTlRBSU5FUiZxdW90OyZsdDsvYiZndDspLiBUaGlzIHdpbGwgbWF0Y2ggJnF1b3Q7L0pSRV9DT05UQUlORVImcXVvdDsgb3IgJnF1b3Q7L0pSRV9DT05UQUlORVIvLi4uJnF1b3Q7LiBPciAmbHQ7YiZndDsmcXVvdDtKUkVfQ09OVEFJTkVSL1hZWiZxdW90OyZsdDsvYiZndDsgd291bGQgbWF0Y2ggJnF1b3Q7L0pSRV9DT05UQUlORVIvWFlaLy4uLiZxdW90Oy4KLSZsdDtwJmd0OwotWW91IGNhbiBhbHNvIHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQW4gZXhwcmVzc2lvbiBzdWNoIGFzICZsdDtiJmd0OyZxdW90O1NXVF9DT05UQUlORVIvLiovSkZBQ0UmcXVvdDsmbHQ7L2ImZ3Q7IHdpbGwgbWF0Y2ggJnF1b3Q7L1NXVF9DT05UQUlORVIvUERFL0pGQUNFJnF1b3Q7IGJ1dCB3aWxsIG5vdCBtYXRjaCAmcXVvdDsvU1dUX0NPTlRBSU5FUiZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwbHVnaW4iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbiBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4dGVuc2lvblJlZ2lzdHJhdGlvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250cmlidXRvcjogCi0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS5wcm94eS5leHRlbnNpb25zJnF1b3Q7Jmd0OwotICAmbHQ7Y29udHJpYnV0b3IKLSAgIHJlZ2lzdHJ5VHlwZT0mcXVvdDtvcmcuZWNsaXBzZS5qZW0uUkVNT1RFJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeHRlbnNpb25SZWdpc3RyYXRpb25JbXBsZW1lbnRhdGlvbiZxdW90OwotICAgY29udGFpbmVyPSZxdW90O01ZX0NPTlRBSU5FUiZxdW90OyZndDsKLSAgJmx0Oy9jb250cmlidXRvciZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXh0ZW5zaW9uUmVnaXN0cmF0aW9uJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UgZm9yIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9BV1RTdGFydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FXVFN0YXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlYmYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FXVFN0YXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotCi1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLSAKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZG8gc3RhcnQgdGhlIEFXVCBldmVudHF1ZXVlIGFoZWFkIG9mIHRpbWUgdG8gdHJ5IHRvIHBhcmFsbGVsIHByb2Nlc3MgaXQuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEFXVFN0YXJ0ZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0QVdUKCkgewotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGhyZWFkLnlpZWxkKCk7CS8vIFNvIGFzIG5vdCB0byBwb3NzaWJseSBob2xkIHVwIHRoZSBndXkgZG9pbmcgdGhlIHN0YXJ0aW5nLgotCQkJCVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKLQkJCX0KLQkJfTsKLQkJdC5zdGFydCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQXJyYXlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQXJyYXlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ODNjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FycmF5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNpbWlsaWFyIGZ1bmN0aW9uIGFzIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSBjbGFzcyBidXQKLSAqIGl0IGhhbmRsZXMgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiBXaXRob3V0IHRoaXMgaGVscGVyLCB0aGUgY2xpZW50IHdvdWxkIGhhdmUKLSAqIHRvIHdhbGsgZG93biB0aHJvdWdoIGVhY2ggZGltZW5zaW9uIGV4ZWN1dGluZyBhIGdldCBjb21tYW5kLiBUaGlzIHdvdWxkIG1lYW4KLSAqIG1hbnkgdHJhbnNhY3Rpb25zIGluc3RlYWQgb2Ygb25lIHByb3ZpZGVkIGJ5IHRoaXMgaGVscGVyLgotICoKLSAqIEl0IGFsc28gcHJvdmlkZXMgc29tZSBvdGhlciBoZWxwZXIgZnVuY3Rpb25zIGZvciBhcnJheXMgdGhhdCBBcnJheSBkb2Vzbid0IHByb3ZpZGUuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEFycmF5SGVscGVyIHsKLQkvLyBJdCBjYW4gbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgotCXByaXZhdGUgQXJyYXlIZWxwZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJT2JqZWN0IGFuc3dlciA9IGFycmF5OwotCQlmb3IgKGludCBpPTA7IGk8aW5kZXhlcy5sZW5ndGg7IGkrKykKLQkJCWFuc3dlciA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldChhbnN3ZXIsIGluZGV4ZXNbaV0pOwotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0Qnl0ZShPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoQnl0ZSkgZ2V0KGFycmF5LCBpbmRleGVzKSkuYnl0ZVZhbHVlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChCb29sZWFuKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXIoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKENoYXJhY3RlcikgZ2V0KGFycmF5LCBpbmRleGVzKSkuY2hhclZhbHVlKCk7Ci0JfQkKLQlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKERvdWJsZSkgZ2V0KGFycmF5LCBpbmRleGVzKSkuZG91YmxlVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBmbG9hdCBnZXRGbG9hdChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoRmxvYXQpIGdldChhcnJheSwgaW5kZXhlcykpLmZsb2F0VmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChJbnRlZ2VyKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5pbnRWYWx1ZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TG9uZyhPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoTG9uZykgZ2V0KGFycmF5LCBpbmRleGVzKSkubG9uZ1ZhbHVlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgZ2V0U2hvcnQoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKFNob3J0KSBnZXQoYXJyYXksIGluZGV4ZXMpKS5zaG9ydFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzLCBPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IHN1YkFycmF5ID0gYXJyYXk7Ci0JCWludCB1cFRvID0gaW5kZXhlcy5sZW5ndGgtMTsKLQkJZm9yIChpbnQgaT0wOyBpPHVwVG87IGkrKykKLQkJCXN1YkFycmF5ID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0KHN1YkFycmF5LCBpbmRleGVzW2ldKTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0KHN1YkFycmF5LCBpbmRleGVzW3VwVG9dLCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgImVxdWFsIiAobm90IGlkZW50aWR5LCBidXQgdGhhdCB0aGUgY29udGVudHMgYXJlIGVxdWFsKS4KLQkgKiBAcGFyYW0gYXJyYXkxIG11c3QgYmUgYW4gYXJyYXkKLQkgKiBAcGFyYW0gYXJyYXkyIG11c3QgYmUgYW4gYXJyYXkKLQkgKiBAcmV0dXJuIHRydWUgaWYgc2VtYW50aWNhbGx5IGVxdWFsIHVzaW5nIHtAbGluayBBcnJheXMjZXF1YWxzKE9iamVjdFtdLCBPYmplY3RbXSl9OwotCSAqIAotCSAqIEBzZWUgQXJyYXlzI2VxdWFscyhPYmplY3RbXSwgT2JqZWN0W10pOwotCSAqIEBzaW5jZSAxLjIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFycmF5MSwgT2JqZWN0IGFycmF5MikgewotCQlpZiAoYXJyYXkxID09IGFycmF5MikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYXJyYXkxID09IG51bGwgfHwgYXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNsYXNzIGFjbGFzcyA9IGFycmF5MS5nZXRDbGFzcygpOwotCQlDbGFzcyBiY2xhc3MgPSBhcnJheTIuZ2V0Q2xhc3MoKTsKLQkJaWYgKCFhY2xhc3MuaXNBcnJheSgpIHx8ICFiY2xhc3MuaXNBcnJheSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDbGFzcyBhY29tcCA9IGFjbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCUNsYXNzIGJjb21wID0gYmNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKGFjb21wLmlzUHJpbWl0aXZlKCkgfHwgYmNvbXAuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKGFjb21wICE9IGJjb21wKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChhY29tcCA9PSBJbnRlZ2VyLlRZUEUpCi0JCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGludFtdKSBhcnJheTEsIChpbnRbXSkgYXJyYXkyKTsKLQkJCWVsc2UgaWYgKGFjb21wID09IEJvb2xlYW4uVFlQRSkKLQkJCQlyZXR1cm4gQXJyYXlzLmVxdWFscygoYm9vbGVhbltdKSBhcnJheTEsIChib29sZWFuW10pIGFycmF5Mik7Ci0JCQllbHNlIGlmIChhY29tcCA9PSBMb25nLlRZUEUpCi0JCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGxvbmdbXSkgYXJyYXkxLCAobG9uZ1tdKSBhcnJheTIpOwotCQkJZWxzZSBpZiAoYWNvbXAgPT0gU2hvcnQuVFlQRSkKLQkJCQlyZXR1cm4gQXJyYXlzLmVxdWFscygoc2hvcnRbXSkgYXJyYXkxLCAoc2hvcnRbXSkgYXJyYXkyKTsKLQkJCWVsc2UgaWYgKGFjb21wID09IERvdWJsZS5UWVBFKQotCQkJCXJldHVybiBBcnJheXMuZXF1YWxzKChkb3VibGVbXSkgYXJyYXkxLCAoZG91YmxlW10pIGFycmF5Mik7Ci0JCQllbHNlIGlmIChhY29tcCA9PSBGbG9hdC5UWVBFKQotCQkJCXJldHVybiBBcnJheXMuZXF1YWxzKChmbG9hdFtdKSBhcnJheTEsIChmbG9hdFtdKSBhcnJheTIpOwotCQkJZWxzZSBpZiAoYWNvbXAgPT0gQ2hhcmFjdGVyLlRZUEUpCi0JCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKGNoYXJbXSkgYXJyYXkxLCAoY2hhcltdKSBhcnJheTIpOwotCQkJZWxzZSBpZiAoYWNvbXAgPT0gQnl0ZS5UWVBFKQotCQkJCXJldHVybiBBcnJheXMuZXF1YWxzKChieXRlW10pIGFycmF5MSwgKGJ5dGVbXSkgYXJyYXkyKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoKE9iamVjdFtdKSBhcnJheTEsIChPYmplY3RbXSkgYXJyYXkyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1NzM1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogVGhpcyBpcyBhIGhhbmRsZXIgZm9yIGRvaW5nIGNhbGxiYWNrcyB0byB0aGUKLSAqIGNsaWVudC4KLSAqCi0gKiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lIHNob3VsZAotICogdXNlIGl0IGZyb20gdGhlIG91dHNpZGUuIEl0IGlzIHRvbyBjcml0aWNhbCB0aGF0Ci0gKiBjYWxsYmFjaydzIHdvcmsgb25seSBpbiB0aGlzIHNwZWNpZmllZCB3YXkuCi0gKi8KLWNsYXNzIENhbGxiYWNrSGFuZGxlciBleHRlbmRzIENvbm5lY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSUNhbGxiYWNrSGFuZGxlciB7Ci0JcHVibGljIENhbGxiYWNrSGFuZGxlcihTb2NrZXQgc2MsIFJlbW90ZVZNU2VydmVyVGhyZWFkIHN2cikgewotCQlzdXBlcihzYywgc3ZyLCBudWxsKTsKLQl9CQkKLQkKLQkvKioKLQkgKiBJbml0aWF0ZSBhIHN0cmVhbSBjYWxsYmFjayByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYXRlQ2FsbGJhY2tTdHJlYW0oaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrU3RyZWFtQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCW91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JCXJ1bigpOwkvLyBOb3cgcnVuIGFuZCB3YWl0IGZvciByZXR1cm4uIElmIG5vIGNvbW1hbmQgZXhlY2VwdGlvbiB0aHJvd24sIHRoZW4gaXQgc2lnbmFscyB0byBjb250aW51ZS4KLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgYnl0ZXMgdG8gdGhlIGNsaWVudC4gSWYgYnl0ZXNUb1dyaXRlIGlzIC0xLCB0aGVuIHRoaXMgaXMgZW5kIGFuZAotCSAqIG5vIGJ5dGVzIGFyZSBiZWluZyB3cml0dGVuLiBKdXN0IHdyaXRlIHRoZSAtMSB0aGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZXNUb1dyaXRlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoYnl0ZXNUb1dyaXRlICE9IC0xKQotCQkJCUNvbW1hbmRzLndyaXRlQnl0ZXMob3V0LCBieXRlcywgYnl0ZXNUb1dyaXRlKTsKLQkJCWVsc2UKLQkJCQlvdXQud3JpdGVJbnQoLTEpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JfQotCi0JCQotCS8qKgotCSAqIENhbGxiYWNrLCBidXQgc2VuZCB0aGUgcGFybSBhcyBhbiBvYmplY3QsIGllLiBpdCBtdXN0Ci0JICogYmUgbm90aGluZyBidXQgY29uc3RhbnRzLCBlLmcuIFN0cmluZywgSW50ZWdlciwgb3IgYW4KLQkgKiBhcnJheSBvZiBjb25zdGFudHMuIENvbnN0YW50cyBzaG91bGQgbm90IGJlIHRoaW5ncyBsaWtlCi0JICogcmVndWxhciBvYmplY3RzLiBUaGlzIGlzIGJlY2F1c2Ugb25seSBzdGFuZGFyZCBqYXZhLmxhbmcKLQkgKiB0eXBlIGNvbnN0YW50cyBjYW4gYmUgYXNzdXJlZCB0byBiZSBhdmFpbGFibGUgb24gdGhlIG90aGVyCi0JICogY2xpZW50LiBBbHNvIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYmlnIG9iamVjdHMsIGV4Y2VwdAotCSAqIG1heWJlIHNvbWV0aGluZyBsaWtlIGFuIGFycmF5IG9mIGJ5dGVzIG9yIHN0cmluZ3MuIEl0IG11c3QKLQkgKiBiZSBjb25zdGFudHMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIHNlbnQgYmFjayBmb3IgYW55IHJlYXNvbgotCSAqIHNpbmNlIHRoZWlyIGlkZW50aXR5IHdpbGwgYmUgbG9zdCBpbiB0aGUgdHJhbnNmZXIuCi0JICoKLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZXJlIGFyZSBubyBwYXJtcyAoaS5lLiBpdCBpcyBudWxsKS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrQXNDb25zdGFudHMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHYgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXNlbmRPYmplY3QocGFybSwgU0VORF9BU19JUywgdiwgb3V0LCBmYWxzZSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCQlyZXR1cm4gcnVuKCk7CS8vIE5vdyBydW4gYW5kIHdhaXQgZm9yIHJldHVybi4KLQl9Ci0JCi0JCi0JLy8gQSByZXRyaWV2ZXIgaXMgd2hhdCBoYW5kbGVzIHRoZSBhcnJheSBwYXJ0LgotCXByaXZhdGUgY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCWludCBpbmRleD0wOwotCQlPYmplY3RbXSBhcnJheTsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQotCQkKLQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQlhcnJheSA9IGFuQXJyYXk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQlPYmplY3QgcGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJaWYgKHBhcm0gIT0gbnVsbCkgewotCQkJCWlmIChwYXJtIGluc3RhbmNlb2YgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgewotCQkJCQkvLyBJdCBpcyBhbm90aGVyIGFycmF5LCBjcmVhdGUgYSBuZXcgcmV0cmlldmVyLgotCQkJCQl3b3JrZXIuc2V0QXJyYXlJRFMobmV3IFJldHJpZXZlcigoKElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmdldEFycmF5KCkpLCAoKElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmdldEFycmF5KCkubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZXkgbWF5IGFkZCBzb21lIG5ldyBJRCdzIGFuZCBpZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhleQotCQkJCQkvLyB3b24ndCBnZXQgcmVsZWFzZWQsIGJ1dCB0aGF0IGlzIGEgc2xpZ2h0IGNoYW5jZSB3ZSB3aWxsIGhhdmUKLQkJCQkJLy8gdG8gdGFrZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hpY2ggb25lcyB3ZXJlIG5ldyBhbmQgd2hpY2gKLQkJCQkJLy8gb25lcyB3ZXJlbid0LgotCQkJCQlmaWxsSW5WYWx1ZShwYXJtLCBOT1RfQV9QUklNSVRJVkUsIHdvcmtlcik7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJd29ya2VyLnNldCgpOwotCQkJcmV0dXJuIHdvcmtlcjsKLQkJfQotCX07Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5VTExfU0VOVCA9IG5ldyBPYmplY3RbMV07Ci0JLyoqCi0JICogQ2FsbGJhY2ssIGJ1dCBzZW5kIHRoZSBwYXJtIGFzIElEcyBzbyB0aGF0IHByb3hpZXMKLQkgKiB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBvYmplY3RzIGFuZCBjYW4gYmUgcmVmZXJlbmNlZC4KLQkgKgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJtLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tXaXRoUGFybXMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChwYXJtcyA9PSBudWxsKQotCQkJCXBhcm1zID0gTlVMTF9TRU5UOwotCQkJCQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgdiA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJCQkJCQotCQkJdi5zZXRBcnJheUlEUyhuZXcgUmV0cmlldmVyKHBhcm1zKSwgcGFybXMubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2LCBmYWxzZSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCQlyZXR1cm4gcnVuKCk7CS8vIE5vdyBydW4gYW5kIHdhaXQgZm9yIHJldHVybi4KLQl9CQotCQotCS8qKgotCSAqIEEgY2xvc2VIYW5kbGVyIGhhcyBiZWVuIHJlcXVlc3RlZC4gVGhpcyBpcyBjYWxsZWQgd2hlbgotCSAqIG5vdCB3YWl0aW5nIHdpdGhpbiBhIGxvb3AsIHNvIHdlIG5lZWQgdG8gZG8gdGhlIGNsZWFudXAgb3Vyc2VsdmVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlSGFuZGxlcigpIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZHMuc2VuZFF1aXRDb21tYW5kKG91dCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJY2xvc2UoKTsKLQkJCQlpbiA9IG51bGw7Ci0JCQkJb3V0ID0gbnVsbDsKLQkJCQlzb2NrZXQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrT3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDdlZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja091dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuSU9Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBzcGVjaWFsIHN0cmVhbSB1c2VkIHRvIGJ1ZmZlciBhbmQgd3JpdGUgYSBsb3QKLSAqIG9mIGJ5dGVzIHRvIGNhbGxiYWNrIGludG8gdGhlIGNsaWVudC4KLSAqCi0gKiBCZWZvcmUgd3JpdGluZyBhbnkgYnl0ZXMgdG8gdGhlIGNsaWVudCwgaXQgd2lsbCBzZWUgaWYgdGhlCi0gKiBjbGllbnQgaGFzIHNlbnQgYW55dGhpbmcgYmFjay4gSWYgaXQgaGFzLCB0aGlzIGlzIGFuIGluZGljYXRpb24KLSAqIHRoYXQgdGhhdCBjbGllbnQgaGFzIHJlcXVlc3RlZCB0aGF0IHRoZSBzdHJlYW0gYmUgY2xvc2VkLiBJbiB0aGF0Ci0gKiBjYXNlIGFuIEludGVycnVwdGVkSU9FeGNlcHRpb24gaXMgcmFpc2VkIHRvIGluZGljYXRlIHRoYXQKLSAqIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYW5kIG5vIG1vcmUgZGF0YSB3aWxsIGJlIHNlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0JCi0JcHJvdGVjdGVkIENhbGxiYWNrSGFuZGxlciBmSGFuZGxlcjsKLQlwcm90ZWN0ZWQgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgZlN2cjsKLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0JcHJvdGVjdGVkIGludCBmTmV4dEJ5dGUgPSAwOwotCQotCXB1YmxpYyBDYWxsYmFja091dHB1dFN0cmVhbShDYWxsYmFja0hhbmRsZXIgaGFuZGxlciwgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc3ZyKSB7Ci0JCWZIYW5kbGVyID0gaGFuZGxlcjsKLQkJZlN2ciA9IHN2cjsKLQkJCi0JCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJ1ZlNpemUgPT0gbnVsbCkKLQkJCWJ1ZlNpemUgPSBuZXcgSW50ZWdlcig1MDAwKTsKLQkJZkJ1ZmZlciA9IG5ldyBieXRlW2J1ZlNpemUuaW50VmFsdWUoKV07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU3RyZWFtKCkgewotCQlmU3ZyLnJldHVybkNhbGxiYWNrSGFuZGxlcihmSGFuZGxlcik7Ci0JCWZTdnIgPSBudWxsOwotCQlmSGFuZGxlciA9IG51bGw7Ci0JCWZCdWZmZXIgPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRXhjZXB0aW9uKENvbW1hbmRFeGNlcHRpb24gZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xlYXJTdHJlYW0oKTsKLQkJdGhyb3cgbmV3IElPQ29tbWFuZEV4Y2VwdGlvbihlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmbHVzaEJ1ZmZlcigpOwotCQlmSGFuZGxlci5vdXQuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmSGFuZGxlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkLiBObyBtb3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmTmV4dEJ5dGUgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmSGFuZGxlci5pbi5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQkJLy8gVGhlcmUgd2FzIHNvbWV0aGluZyB3YWl0aW5nLiBUaGlzIG1lYW5zIGEgY2FuY2VsIGhhcyBiZWVuIHJlcXVlc3RlZC4KLQkJCQkJZkhhbmRsZXIuaW4uc2tpcChmSGFuZGxlci5pbi5hdmFpbGFibGUoKSk7Ci0JCQkJCWNsb3NlKGZhbHNlKTsJLy8gTm93IGNsb3NlIHRoZSBzdHJlYW0uIFdlIG5lZWQgdG8gaGF2ZSB0aGUgY2xvc2UgaW5kaWNhdG9yIHNlbnQgc28gdGhhdCB0aGUgcmVtb3RlIHNpZGUsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHdhaXQgYmVjYXVzZSB0aGUgdGVybWluYXRlIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4KLQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJZkhhbmRsZXIud3JpdGVCeXRlcyhmQnVmZmVyLCBmTmV4dEJ5dGUpOwotCQkJCWZOZXh0Qnl0ZSA9IDA7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlcyB0aGlzIG91dHB1dCBzdHJlYW0gYW5kIHJlbGVhc2VzIGFueSBzeXN0ZW0gcmVzb3VyY2VzIAotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4gVGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgPGNvZGU+Y2xvc2U8L2NvZGU+IAotCSAqIGlzIHRoYXQgaXQgY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtLiBBIGNsb3NlZCBzdHJlYW0gY2Fubm90IHBlcmZvcm0gCi0JICogb3V0cHV0IG9wZXJhdGlvbnMgYW5kIGNhbm5vdCBiZSByZW9wZW5lZC4KLQkgKiA8cD4KLQkgKiBDbG9zZSB3aWxsIHNlbmQgYSAtMSB0byB0aGUgY2xpZW50IGFuZCBzZXQgdG8gaW5kaWNhdGUgaXQgaXMgY2xvc2VkLgotCSAqCi0JICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljbG9zZSh0cnVlKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZShib29sZWFuIHdhaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmSGFuZGxlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZsdXNoQnVmZmVyKCk7Ci0JCQkJdHJ5IHsJCQkJCi0JCQkJCWZIYW5kbGVyLndyaXRlQnl0ZXMobnVsbCwgLTEpOwotCQkJCQlmSGFuZGxlci5vdXQuZmx1c2goKTsKLQkJCQkJaWYgKHdhaXQpIHsKLQkJCQkJCS8vIFdhaXQgbWVhbnMgd2FpdCBmb3IgdGhlIHJlbW90ZSBzaWRlIHRvIHNlbmQgdGhlIHRlcm1pbmF0ZWQgcmVzcG9uc2UuCi0JCQkJCQkvLyBBIG5vcm1hbCBjbG9zZSB3aWxsIGRvIHRoaXMuIElmIHRoZSByZW1vdGUgc2lkZSBzZW50IGEgY2FuY2VsIHJlcXVlc3QsIHRoZW4gaXQgaGFzIGFscmVhZHkKLQkJCQkJCS8vIHNlbnQgdGhlIHRlcm1pbmF0ZWQgcmVzcG9uc2UgYW5kIGl0IGlzIHdhaXRpbmcgZm9yIHVzIHRvIHNlbmQgdGhlIGVuZC1vZi1maWxlIGNvbW1hbmQuCi0JCQkJCQkKLQkJCQkJCWZIYW5kbGVyLmluLnJlYWRCeXRlKCk7CS8vIEJsb2NrIGFuZCB3YWl0IHVudGlsIHRoZSB0ZXJtaW5hdGUgcmVxdWVzdC4gVGhlcmUgc2hvdWxkbid0IGJlIGFueXRoaW5nIGVsc2UgaW4gdGhlIHBpcGVsaW5lLgotCQkJCQkJaWYgKGZIYW5kbGVyLmluLmF2YWlsYWJsZSgpID4gMCkKLQkJCQkJCQkvLyBUaGVyZSB3YXMgc29tZXRoaW5nIGVsc2Ugd2FpdGluZy4gTGV0J3MganVzdCBjbGVhciBpdCBvdXQgdG8gYmUgc2FmZS4KLQkJCQkJCQlmSGFuZGxlci5pbi5za2lwKGZIYW5kbGVyLmluLmF2YWlsYWJsZSgpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJY2xlYXJTdHJlYW0oKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkJ1ZmZlcltmTmV4dEJ5dGUrK10gPSAoYnl0ZSkgYjsKLQkJaWYgKGZOZXh0Qnl0ZSA+PSBmQnVmZmVyLmxlbmd0aCkKLQkJCWZsdXNoQnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYiA9PSBudWxsKSB7Ci0JCSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGIubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwKLQkJCSAgICgob2ZmICsgbGVuKSA+IGIubGVuZ3RoKSB8fCAoKG9mZiArIGxlbikgPCAwKSkgewotCQkgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmIChsZW4gPT0gMCkgewotCQkgICAgcmV0dXJuOwotCQl9Ci0JCQotCQl3aGlsZSAobGVuID4gMCkgewotCQkJaW50IG1vdmUgPSBmQnVmZmVyLmxlbmd0aC1mTmV4dEJ5dGU7Ci0JCQlpZiAobGVuIDwgbW92ZSkKLQkJCQltb3ZlID0gbGVuOwotCQkJU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGZCdWZmZXIsIGZOZXh0Qnl0ZSwgbW92ZSk7Ci0JCQlsZW4gLT0gbW92ZTsKLQkJCW9mZiArPSBtb3ZlOwotCQkJZk5leHRCeXRlICs9IG1vdmU7Ci0JCQlpZiAoZk5leHRCeXRlID49IGZCdWZmZXIubGVuZ3RoKQotCQkJCWZsdXNoQnVmZmVyKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2xhc3NIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2xhc3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYmM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NsYXNzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgaGVscGVyIGZvciBDbGFzcyBhY2Nlc3NpbmcgZnVuY3Rpb25zLgotICogSXRzIG1haW4gZnVuY3Rpb24gaXMgdG8gYnlwYXNzIHNlY3VyaXR5LiBUaGlzIGlzIGJlY2F1c2UKLSAqIHdlIGRvbid0IGNhcmUgYWJvdXQgc2VjdXJpdHkgZm9yIHJlbW90ZSB2bS4gU2VjdXJpdHkgaXMKLSAqIGhhbmRsZWQgYnkgdGhlIElERSBhbmQgY29tcGlsb3Igb3ZlciB0aGVyZS4gV2UgZG8gd2hhdAotICogd2UncmUgdG9sZC4KLSAqIAotICogQGF1dGhvciByaWNoa3VscAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NIZWxwZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENsYXNzSGVscGVyLgotCSAqLwotCXByaXZhdGUgQ2xhc3NIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsJCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQkvLyBXZSB3YW50IHRvIGdldCB0aGUgZGVmYXVsdCBjdG9yLCB3aGljaCBpcyBpbiB0aGUgZGVjbGFyZWQgbGlzdC4gTm8gbmVlZAotCQkvLyB0byB3b3JyeSBhYm91dCBpbmhlcml0YW5jZSBiZWNhdXNlIGN0b3JzIGFyZSBuZXZlciB2aXJ0dWFsLgotCQlDb25zdHJ1Y3RvciBjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihFTVBUWV9DTEFTU19BUlJBWSk7Ci0JCWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGN0b3IubmV3SW5zdGFuY2UoRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzMyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBoYW5kbGVzIG9uZSBjb25uZWN0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uSGFuZGxlciB7CQotCQkKLQlwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKLQlmaW5hbCBwcm90ZWN0ZWQgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc2VydmVyOwotCWZpbmFsIHByb3RlY3RlZCBUaHJlYWQgY29ubmVjdGlvblRocmVhZDsKLQlwcm90ZWN0ZWQgRGF0YUlucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBEYXRhT3V0cHV0U3RyZWFtIG91dDsKLQkKLQkvLyBLbHVkZ2U6IEJ1ZyBpbiBMaW51eCAxLjMueHh4IG9mIEpWTS4gQ2xvc2luZyBhIHNvY2tldCB3aGlsZSB0aGUgc29ja2V0IGlzIGJlaW5nIHJlYWQvYWNjZXB0IHdpbGwgbm90IGludGVycnVwdCB0aGUKLQkvLyB3YWl0LiBOZWVkIHRvIHRpbWVvdXQgdG8gdGhlIHNvY2tldCByZWFkL2FjY2VwdCBiZWZvcmUgdGhlIHNvY2tldCBjbG9zZSB3aWxsIGJlIG5vdGljZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQKLQkvLyBpbiBMaW51eCAxLjQuIFNvIG9uIExpbnV4IDEuMyBuZWVkIHRvIHB1dCB0aW1lb3V0cyBpbiBvbiB0aG9zZSBzb2NrZXRzIHRoYXQgY2FuIGJlIHNlcGFyYXRlbHkgY2xvc2VkIHdoaWxlIHJlYWRpbmcvYWNjZXB0aW5nLgotCXN0YXRpYyBib29sZWFuIExJTlVYXzFfMyA9ICJsaW51eCIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjMiKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQotCS8qKgotCSAqIFRoaXMgbWF5IGJlIHJ1bm5pbmcgYXMgYSBjYWxsYmFjaywgaW4gdGhhdCBjYXNlIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb25UaHJlYWQuCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25IYW5kbGVyKFNvY2tldCBzYywgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc3ZyLCBUaHJlYWQgY29ubmVjdGlvblRocmVhZCkgewotCQlzb2NrZXQgPSBzYzsKLQkJc2VydmVyID0gc3ZyOwotCQl0aGlzLmNvbm5lY3Rpb25UaHJlYWQgPSBjb25uZWN0aW9uVGhyZWFkOwotCQkKLQkJSW50ZWdlciBidWZTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLmJ1ZnNpemUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYnVmU2l6ZSA9PSBudWxsKQotCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDUwMDApOwotCQkJCi0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCBidWZTaXplLmludFZhbHVlKCkpKTsKLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwgYnVmU2l6ZS5pbnRWYWx1ZSgpKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkJCi0JfQotCQotCS8qKgotCSAqIERpZCB0aGlzIGNvbnN0cnVjdCBjb3JyZWN0bHkuCi0JICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhbiBleGNlcHRpb24gY291bGQgYmUgdGhyb3duIGluIHRoZSBjdG9yIGFuZAotCSAqIHRoYXQncyBub3QgYSBnb29kIHRoaW5nIHRvIGRvLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotCQlyZXR1cm4gc29ja2V0ICE9IG51bGw7Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gY2xvc2UgZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVNvY2tldCBzID0gc29ja2V0OwotCQkJCXNvY2tldCA9IG51bGw7Ci0JCQkJcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBNYXAgb2YgSUQgdG8gZXhwcmVzc2lvbiBwcm9jZXNzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCi0JcHJpdmF0ZSBNYXAgZXhwcmVzc2lvblByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIFByb2Nlc3MgYW5kIGxvb3AgdW50aWwgdG9sZCB0byBzdG9wLiBBIGNhbGxiYWNrX2RvbmUgd2lsbCBzdG9wCi0JICogdGhlIGxvb3AgYW5kIHdpbGwgcmV0dXJuIGEgcmVzdWx0LiBPdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7CQkKLQkJYm9vbGVhbiBzaHV0ZG93biA9IGZhbHNlOwotCQlib29sZWFuIGNsb3NlV2hlbkRvbmUgPSB0cnVlOwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwkvLyBXb3JraW5nIHZhbHVlIG9iamVjdCBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLgotCQlJbnZva2FibGVWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlciA9IG5ldyBJbnZva2FibGVWYWx1ZVNlbmRlcigpOwkvLyBXb3JraW5nIHZhbHVlc2VuZGVyIHNvIG5vdCBjb250aW51YWxseSByZWNyZWF0ZWQuIAotCQl0cnkgewotCQkJYm9vbGVhbiBkb0xvb3AgPSB0cnVlOwotCi0JCQkvKioKLQkJCSAqIE5vdGU6IEluIHRoZSBjYXNlcyBiZWxvdyB5b3Ugd2lsbCBzZWUgYSBsb3Qgb2YgZmluYWxseSBjbGF1c2VzIHRoYXQgbnVsbCB2YXJpYWJsZXMgb3V0LgotCQkJICogVGhpcyBpcyBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgbG9vcCwgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoaW4gYmxvY2tzIGFyZSBub3QKLQkJCSAqIGdhcmJhZ2UgY29sbGVjdGVkIHVudGlsIHRoZSBtZXRob2QgaXMgdGVybWluYXRlZCwgc28gdGhlc2UgdmFyaWFibGVzIG9uY2Ugc2V0IHdvdWxkIG5ldmVyCi0JCQkgKiBiZSBHQydkLiBUaGUgbnVsbGluZyBhdCB0aGUgZW5kIG9mIHRoZSBjYXNlIG1ha2VzIHN1cmUgdGhhdCBhbnkgb2YgdGhvc2Ugb2JqZWN0cyBzZXQgYXJlCi0JCQkgKiBub3cgYXZhaWxhYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiBuZWNlc3NhcnkuCi0JCQkgKi8JCQotCQkJd2hpbGUoZG9Mb29wICYmIGlzQ29ubmVjdGVkKCkpIHsKLQkJCQlieXRlIGNtZCA9IDA7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKExJTlVYXzFfMykKLQkJCQkJCXNvY2tldC5zZXRTb1RpbWVvdXQoMTAwMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBjb21tZW50IG9uIExJTlVYXzFfMwotCQkJCQljbWQgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlpZiAoTElOVVhfMV8zICYmIGlzQ29ubmVjdGVkKCkpCi0JCQkJCQlzb2NrZXQuc2V0U29UaW1lb3V0KDApOwkvLyBMaW51eCAxLjMgYnVnLCBzZWUgY29tbWVudCBvbiBMSU5VWF8xXzMKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7CS8vIFRpbWVvdXQsIHRyeSBhZ2FpbgotCQkJCX0KLQkJCQlzd2l0Y2ggKGNtZCkgewotCQkJCQljYXNlIENvbW1hbmRzLlFVSVRfQ09OTkVDVElPTjoJCQkJCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCi0JCQkJCQlicmVhazsJLy8gQ2xvc2UgdGhpcyBjb25uZWN0aW9uCi0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5URVJNSU5BVEVfU0VSVkVSOgotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQkKLQkJCQkJCXNodXRkb3duID0gdHJ1ZTsJLy8gU2h1dGRvd24gZXZlcnl0aGluZwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5HRVRfQ0xBU1M6Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gaW4ucmVhZFVURigpOwotCQkJCQkJQ2xhc3MgYUNsYXNzID0gbnVsbDsKLQkJCQkJCUNsYXNzIHN1cGVyQ2xhc3MgPSBudWxsOwotCQkJCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gbnVsbDsKLQkJCQkJCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwkvLyBUdXJucyBvdXQgdXNpbmcgSk5JIGZvcm1hdCBmb3IgYXJyYXkgdHlwZSB3aWxsIHdvcmsgZmluZS4KLQkJCQkJCQkJCi0JCQkJCQkJYWRkZWQgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChhQ2xhc3MsIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlib29sZWFuIGlzSW50ZXJmYWNlID0gYUNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0JCQkJCQkJYm9vbGVhbiBpc0Fic3RyYWN0ID0gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChhQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpOwotCQkJCQkJCXN1cGVyQ2xhc3MgPSBhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJCQkJCXN1cGVyQ2xhc3NOYW1lID0gKHN1cGVyQ2xhc3MgIT0gbnVsbCkgPyBzdXBlckNsYXNzLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5HRVRfQ0xBU1NfUkVUVVJOKTsKLQkJCQkJCQlvdXQud3JpdGVJbnQodmFsdWVPYmplY3Qub2JqZWN0SUQpOwotCQkJCQkJCW91dC53cml0ZUJvb2xlYW4oaXNJbnRlcmZhY2UpOwotCQkJCQkJCW91dC53cml0ZUJvb2xlYW4oaXNBYnN0cmFjdCk7Ci0JCQkJCQkJb3V0LndyaXRlVVRGKHN1cGVyQ2xhc3NOYW1lKTsKLQkJCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5HRVRfQ0xBU1NfTk9UX0ZPVU5ELCB2YWx1ZU9iamVjdCk7CQkJCQkJCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZSkgewotCQkJCQkJCXNlbmRFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSwgdmFsdWVPYmplY3QsIG91dCk7CQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSB7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbihlLCB2YWx1ZU9iamVjdCwgb3V0KTsJCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCQkvLyBTb21ldGhpbmcgYmFkLCBkaWQgd2UgYWRkIGEgY2xhc3M/IElmIHdlIGRpZCByZW1vdmUgaXQgZnJvbSB0aGUgdGFibGUuCi0JCQkJCQkJaWYgKGFkZGVkKQotCQkJCQkJCQlzZXJ2ZXIucmVtb3ZlT2JqZWN0KHNlcnZlci5nZXRPYmplY3QodmFsdWVPYmplY3Qub2JqZWN0SUQpKTsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkvLyBjbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsuCi0JCQkJCQkJY2xhc3NOYW1lID0gbnVsbDsKLQkJCQkJCQlhQ2xhc3MgPSBudWxsOwotCQkJCQkJCXN1cGVyQ2xhc3MgPSBudWxsOwotCQkJCQkJCXN1cGVyQ2xhc3NOYW1lID0gbnVsbDsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuR0VUX0NMQVNTX0ZST01fSUQ6Ci0JCQkJCQlpbnQgY2xhc3NJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYUNsYXNzID0gKENsYXNzKSBzZXJ2ZXIuZ2V0T2JqZWN0KGNsYXNzSUQpOwotCQkJCQkJCWJvb2xlYW4gaXNJbnRlcmZhY2UgPSBhQ2xhc3MuaXNJbnRlcmZhY2UoKTsKLQkJCQkJCQlib29sZWFuIGlzQWJzdHJhY3QgPSBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KGFDbGFzcy5nZXRNb2RpZmllcnMoKSk7CQkJCQkJCQotCQkJCQkJCXN1cGVyQ2xhc3MgPSBhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJCQkJCXN1cGVyQ2xhc3NOYW1lID0gKHN1cGVyQ2xhc3MgIT0gbnVsbCkgPyBzdXBlckNsYXNzLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5HRVRfQ0xBU1NfSURfUkVUVVJOKTsKLQkJCQkJCQlvdXQud3JpdGVVVEYoYUNsYXNzLmdldE5hbWUoKSk7Ci0JCQkJCQkJb3V0LndyaXRlQm9vbGVhbihpc0ludGVyZmFjZSk7Ci0JCQkJCQkJb3V0LndyaXRlQm9vbGVhbihpc0Fic3RyYWN0KTsKLQkJCQkJCQlvdXQud3JpdGVVVEYoc3VwZXJDbGFzc05hbWUpOwotCQkJCQkJCW91dC5mbHVzaCgpOwotCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0xBU1NfQ0FTVF9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCX0gZmluYWxseSB7CQotCQkJCQkJCS8vIGNsZWFyIG91dCBmb3IgR0MgdG8gd29yay4KLQkJCQkJCQlhQ2xhc3MgPSBudWxsOwotCQkJCQkJCXN1cGVyQ2xhc3MgPSBudWxsOwotCQkJCQkJCXN1cGVyQ2xhc3NOYW1lID0gbnVsbDsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIENvbW1hbmRzLkdFVF9PQkpFQ1RfREFUQToKLQkJCQkJCWludCBvYmplY3RJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJCU9iamVjdCBhbk9iamVjdCA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFuT2JqZWN0ID0gc2VydmVyLmdldE9iamVjdChvYmplY3RJRCk7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0T2JqZWN0SUQob2JqZWN0SUQsIHNlcnZlci5nZXRJZGVudGl0eUlEKGFuT2JqZWN0LmdldENsYXNzKCkpKTsKLQkJCQkJCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHRydWUpOwotCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0xBU1NfQ0FTVF9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJYW5PYmplY3QgPSBudWxsOwkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsJCQkJCQkJCQkJCQkKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLlJFTEVBU0VfT0JKRUNUOgotCQkJCQkJaW50IGlkID0gaW4ucmVhZEludCgpOwotCQkJCQkJc2VydmVyLnJlbW92ZU9iamVjdChzZXJ2ZXIuZ2V0T2JqZWN0KGlkKSk7Ci0JCQkJCQlicmVhazsJCQkJCQkKLQotCQkJCQljYXNlIENvbW1hbmRzLk5FV19JTklUX1NUUklORzoKLQkJCQkJCWNsYXNzSUQgPSBpbi5yZWFkSW50KCk7CS8vIElEIE9mIGNsYXNzIHRvIGRvIG5ldyB1cG9uLgotCQkJCQkJU3RyaW5nIGluaXRTdHJpbmcgPSBpbi5yZWFkVVRGKCk7CS8vIFRoZSBpbml0IHN0cmluZy4KLQkJCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0JCQkJCQlDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXRoZUNsYXNzID0gKENsYXNzKSBzZXJ2ZXIuZ2V0T2JqZWN0KGNsYXNzSUQpOwotCQkJCQkJCWlmICh0aGVDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIFRoZSBjbGFzcyB3YXNuJ3QgZm91bmQuIFNvIGltcGx5IENsYXNzTm90Rm91bmQgZXhjZXB0aW9uLgotCQkJCQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBwYXJzZXIgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBhcnNlciA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNyZWF0ZVBhcnNlcihpbml0U3RyaW5nKTsKLQkJCQkJCQkJbmV3VmFsdWUgPSBwYXJzZXIuZXZhbHVhdGUoKTsJCQkJCQkJCQotCQkJCQkJCQlib29sZWFuIHByaW1pdGl2ZSA9IHBhcnNlci5pc1ByaW1pdGl2ZSgpOwotCQkJCQkJCQkvLyBJZiBleHBlY3RlZCBjbGFzcyBpcyBWb2lkLlRZUEUsIHRoYXQgbWVhbnMgZG9uJ3QgdGVzdCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0Ci0JCQkJCQkJCS8vIHRvIHZlcmlmeSBpZiBjb3JyZWN0IHR5cGUsIGp1c3QgcmV0dXJuIHdoYXQgaXQgcmVhbGx5IGlzLgotCQkJCQkJCQlpZiAodGhlQ2xhc3MgIT0gVm9pZC5UWVBFICYmIHByaW1pdGl2ZSAhPSB0aGVDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQkJY29udGludWU7CS8vIEdvdG8gbmV4dCBjb21tYW5kLgotCQkJCQkJCQl9IAotCQkJCQkJCQlpZiAocHJpbWl0aXZlKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCS8vIE5lZWQgdG8gZG8gc3BlY2lhbCB0ZXN0cyBmb3IgY29tcGF0aWJpbGl0eSBhbmQgYXNzaWdubWVudC4KLQkJCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCBjbGFzc0lEICE9IENvbW1hbmRzLlZPSURfVFlQRSA/IGNsYXNzSUQgOiBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChwYXJzZXIuZ2V0RXhwZWN0ZWRUeXBlKCkpLCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsJLy8gVGhpcyB3aWxsIG1ha2Ugc3VyZSBpdCBnb2VzIG91dCBhcyB0aGUgY29ycmVjdCBwcmltaXRpdmUgdHlwZQotCQkJCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBUaGUgcmV0dXJuZWQgdHlwZSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3Igd2hhdCBpcyBleHBlY3RlZC4KLQkJCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0xBU1NfQ0FTVF9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCQljb250aW51ZTsJLy8gR290byBuZXh0IGNvbW1hbmQKLQkJCQkJCQkJCX0JCQkJCQkJCQkKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gVGVzdCB0byBzZWUgaWYgdGhleSBhcmUgY29tcGF0aWJsZS4gKE51bGwgY2FuIGJlIGFzc2lnbmVkIHRvIGFueSBvYmplY3QsCi0JCQkJCQkJCQkJLy8gc28gdGhhdCBpcyB3aHkgaXQgd2FzIHRlc3RlZCBvdXQgYWJvdmUpLgotCQkJCQkJCQkJCS8vIElmIGV4cGVjdGVkIGNsYXNzIGlzIFZvaWQuVFlQRSwgdGhhdCBtZWFucyBkb24ndCB0ZXN0IHRoZSB0eXBlIG9mIHRoZSByZXN1bHQKLQkJCQkJCQkJCQkvLyB0byB2ZXJpZnkgaWYgY29ycmVjdCB0eXBlLCBqdXN0IHJldHVybiB3aGF0IGl0IHJlYWxseSBpcy4KLQkJCQkJCQkJCQlpZiAodGhlQ2xhc3MgIT0gVm9pZC5UWVBFICYmICF0aGVDbGFzcy5pc0luc3RhbmNlKG5ld1ZhbHVlKSkgewotCQkJCQkJCQkJCQkvLyBUaGUgcmV0dXJuZWQgdHlwZSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3Igd2hhdCBpcyBleHBlY3RlZC4KLQkJCQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQkJCQljb250aW51ZTsJLy8gR290byBuZXh0IGNvbW1hbmQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCBOT1RfQV9QUklNSVRJVkUsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwkvLyBTZW5kIG91dCBhcyBhbiBvYmplY3QuCi0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEV2YWx1YXRpb25FeGNlcHRpb24pIHsKLQkJCQkJCQkJCS8vIFdhbnQgdG8gcmV0dXJuIHRoZSByZWFsIGV4Y2VwdGlvbi4KLQkJCQkJCQkJCXNlbmRFeGNlcHRpb24oZS5nZXRPcmlnaW5hbEV4Y2VwdGlvbigpLCB2YWx1ZU9iamVjdCwgb3V0KTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIENvdWxkbid0IGJlIGV2YWx1YXRlZCwgcmV0dXJuIGFuIGVycm9yIGZvciB0aGlzLgotCQkJCQkJCQkJc2V0RXhjZXB0aW9uSW50b1ZhbHVlKGUuZ2V0T3JpZ2luYWxFeGNlcHRpb24oKSwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNBTk5PVF9FVkFMVUFURV9TVFJJTkcsIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCXBhcnNlciA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCX0JCQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbihlLCB2YWx1ZU9iamVjdCwgb3V0KTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJLy8gQ2xlYXIgb3V0IGZvciBHQyB0byB3b3JrCi0JCQkJCQkJaW5pdFN0cmluZyA9IG51bGw7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBudWxsOwotCQkJCQkJCW5ld1ZhbHVlID0gbnVsbDsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsJCQkJCQkJCi0JCQkJCQl9CQotCQkJCQkJYnJlYWs7CQkJCQkJCi0JCQkJCQkJCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5JTlZPS0U6Ci0JCQkJCQlPYmplY3QgdGFyZ2V0ID0gbnVsbDsKLQkJCQkJCU9iamVjdFtdIHBhcm1zID0gbnVsbDsJCQkJCQkKLQkJCQkJCUNsYXNzIHJldHVyblR5cGUgPSBudWxsOwotCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGFNZXRob2QgPSBudWxsOwkJCQkJCQotCQkJCQkJdHJ5IHsJCQkJCQotCQkJCQkJCWludCBtZXRob2RJRCA9IGluLnJlYWRJbnQoKTsJLy8gSUQgb2YgbWV0aG9kIHRvIGludm9rZQotCQkJCQkJCWFNZXRob2QgPSAoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBzZXJ2ZXIuZ2V0T2JqZWN0KG1ldGhvZElEKTsJLy8gTWV0aG9kIHRvIGludm9rZQotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCXRhcmdldCA9IGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7CQotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCWlmICh2YWx1ZU9iamVjdC50eXBlID09IENvbW1hbmRzLkFSUkFZX0lEUykgewotCQkJCQkJCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCQkJCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJcGFybXMgPSAoT2JqZWN0W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSXQgaXMgYWxsIG9iamVjdHMgb3IgbnVsbCwgc28gaXQgc2hvdWxkIGJlIGFuIE9iamVjdFtdIG9yIG51bGwuIElmIG5vdCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLgotCQkJCQkJCQlwYXJtcyA9IChPYmplY3RbXSkgdmFsdWVPYmplY3QuYW5PYmplY3Q7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmICghYU1ldGhvZC5pc0FjY2Vzc2libGUoKSkKLQkJCQkJCQkJYU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwkvLyBXZSB3aWxsIGFsbG93IGFsbCB0byBvY2N1ci4gTGV0IGFjY2VzcyBjb250cm9sIGJlIGhhbmRsZWQgYnkgSURFIGFuZCBjb21waWxlci4KLQkJCQkJCQluZXdWYWx1ZSA9IGFNZXRob2QuaW52b2tlKHRhcmdldCwgcGFybXMpOwotCQkJCQkJCXJldHVyblR5cGUgPSBhTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJCQlpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJCWludCByZXR1cm5UeXBlSUQgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChyZXR1cm5UeXBlKTsKLQkJCQkJCQkJLy8gTmVlZCB0byB0ZWxsIHNlbmRPYmplY3QgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIHR5cGUuCi0JCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIHJldHVyblR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgTk9UX0FfUFJJTUlUSVZFLCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsJLy8gSnVzdCBzZW5kIHRoZSBvYmplY3QgYmFjay4gc2VuZE9iamVjdCBrbm93cyBob3cgdG8gaXRlcnByZXQgdGhlIHR5cGUKLQkJCQkJCQl9CQkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBlOwkvLyBUaHJvdyBpdCBhZ2Fpbi4gVGhlc2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21lIHVwIGFzIGFuIGV4Y2VwdGlvbiBwcm94eS4gVGhlc2Ugc2hvdWxkIGVuZCB0aGUgdGhyZWFkLgotCQkJCQkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkJCQkJLy8gaXQgd2FzIHRoZSByZWFsIG9uZS4gKFNvbWV0aW1lcyB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQgaXMgb24gYSBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSwKLQkJCQkJCQkvLyB3aGljaCBpbiB0dXJuIGlzIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIHNvIHdlIHdpbGwgZ28gdW50aWwgd2UgZG9uJ3QgaGF2ZSBhbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLgotCQkJCQkJCVRocm93YWJsZSB0ID0gZTsKLQkJCQkJCQlkbyB7Ci0JCQkJCQkJCXQgPSAoKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQkJCX0gd2hpbGUgKHQgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKTsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKHQsIHZhbHVlT2JqZWN0LCBvdXQpOwotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUsIHZhbHVlT2JqZWN0LCBvdXQpOwkvLyBUdXJuIGl0IGludG8gYSBleGNlcHRpb24gcHJveHkgb24gdGhlIGNsaWVudC4KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJLy8gQ2xlYXIgb3V0IGZvciBHQyB0byB3b3JrCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJcGFybXMgPSBudWxsOwotCQkJCQkJCXRhcmdldCA9IG51bGw7Ci0JCQkJCQkJYU1ldGhvZCA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuVHlwZSA9IG51bGw7Ci0JCQkJCQkJbmV3VmFsdWUgPSBudWxsOwotCQkJCQkJCXZhbHVlU2VuZGVyLmNsZWFyKCk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuSU5WT0tFX1dJVEhfTUVUSE9EX1BBU1NFRDoKLQkJCQkJCWFDbGFzcyA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7Ci0JCQkJCQlDbGFzc1tdIHBhcm1UeXBlcyA9IG51bGw7Ci0JCQkJCQl0YXJnZXQgPSBudWxsOwotCQkJCQkJcGFybXMgPSBudWxsOwkJCQkJCQotCQkJCQkJcmV0dXJuVHlwZSA9IG51bGw7Ci0JCQkJCQlhTWV0aG9kID0gbnVsbDsJCQkJCQkKLQkJCQkJCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlhQ2xhc3MgPSAoQ2xhc3MpIGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7IC8vIFRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgbWV0aG9kLgotCQkJCQkJCW1ldGhvZE5hbWUgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJaWYgKHZhbHVlT2JqZWN0LnR5cGUgPT0gQ29tbWFuZHMuQVJSQVlfSURTKSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCQkJCQlwYXJtVHlwZXMgPSAoQ2xhc3NbXSkgdmFsdWVTZW5kZXIuZ2V0QXJyYXkoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBudWxsLCBzbyBpdCBzaG91bGQgYmUgYW4gbnVsbC4gSWYgbm90LCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuCi0JCQkJCQkJCXBhcm1UeXBlcyA9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJCWFNZXRob2QgPSBhQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0KLQkJCQkJCQkvLyBOb3cgd2UgZ2V0IHRoZSBpbmZvIGZvciB0aGUgaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kIGFuZCBleGVjdXRlIGl0LgotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCXRhcmdldCA9IGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7CQotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCWlmICh2YWx1ZU9iamVjdC50eXBlID09IENvbW1hbmRzLkFSUkFZX0lEUykgewotCQkJCQkJCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCQkJCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJcGFybXMgPSAoT2JqZWN0W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSXQgaXMgYWxsIG9iamVjdHMgb3IgbnVsbCwgc28gaXQgc2hvdWxkIGJlIGFuIE9iamVjdFtdIG9yIG51bGwuIElmIG5vdCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLgotCQkJCQkJCQlwYXJtcyA9IChPYmplY3RbXSkgdmFsdWVPYmplY3QuYW5PYmplY3Q7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmICghYU1ldGhvZC5pc0FjY2Vzc2libGUoKSkKLQkJCQkJCQkJYU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwkvLyBXZSB3aWxsIGFsbG93IGFsbCB0byBvY2N1ci4gTGV0IGFjY2VzcyBjb250cm9sIGJlIGhhbmRsZWQgYnkgSURFIGFuZCBjb21waWxlci4KLQkJCQkJCQluZXdWYWx1ZSA9IGFNZXRob2QuaW52b2tlKHRhcmdldCwgcGFybXMpOwotCQkJCQkJCXJldHVyblR5cGUgPSBhTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJCQlpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJCWludCByZXR1cm5UeXBlSUQgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChyZXR1cm5UeXBlKTsKLQkJCQkJCQkJLy8gTmVlZCB0byB0ZWxsIHNlbmRPYmplY3QgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIHR5cGUuCi0JCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIHJldHVyblR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgTk9UX0FfUFJJTUlUSVZFLCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsJLy8gSnVzdCBzZW5kIHRoZSBvYmplY3QgYmFjay4gc2VuZE9iamVjdCBrbm93cyBob3cgdG8gaXRlcnByZXQgdGhlIHR5cGUKLQkJCQkJCQl9CQkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBlOwkvLyBUaHJvdyBpdCBhZ2Fpbi4gVGhlc2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21lIHVwIGFzIGFuIGV4Y2VwdGlvbiBwcm94eS4gVGhlc2Ugc2hvdWxkIGVuZCB0aGUgdGhyZWFkLgotCQkJCQkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkJCQkJLy8gaXQgd2FzIHRoZSByZWFsIG9uZS4gKFNvbWV0aW1lcyB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQgaXMgb24gYSBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSwKLQkJCQkJCQkvLyB3aGljaCBpbiB0dXJuIGlzIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIHNvIHdlIHdpbGwgZ28gdW50aWwgd2UgZG9uJ3QgaGF2ZSBhbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLgotCQkJCQkJCVRocm93YWJsZSB0ID0gZTsKLQkJCQkJCQlkbyB7Ci0JCQkJCQkJCXQgPSAoKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQkJCX0gd2hpbGUgKHQgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKTsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKHQsIHZhbHVlT2JqZWN0LCBvdXQpOwotCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUsIHZhbHVlT2JqZWN0LCBvdXQpOwkvLyBUdXJuIGl0IGludG8gYSBleGNlcHRpb24gcHJveHkgb24gdGhlIGNsaWVudC4KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJYUNsYXNzID0gbnVsbDsKLQkJCQkJCQltZXRob2ROYW1lID0gbnVsbDsKLQkJCQkJCQlwYXJtVHlwZXMgPSBudWxsOwotCQkJCQkJCS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCXBhcm1zID0gbnVsbDsKLQkJCQkJCQl0YXJnZXQgPSBudWxsOwotCQkJCQkJCWFNZXRob2QgPSBudWxsOwotCQkJCQkJCXJldHVyblR5cGUgPSBudWxsOwotCQkJCQkJCW5ld1ZhbHVlID0gbnVsbDsKLQkJCQkJCQl2YWx1ZVNlbmRlci5jbGVhcigpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuR0VUX0FSUkFZX0NPTlRFTlRTOgotCQkJCQkJdHJ5IHsKLQkJCQkJCQl0YXJnZXQgPSBzZXJ2ZXIuZ2V0T2JqZWN0KGluLnJlYWRJbnQoKSk7CS8vIEFycmF5IHRvIGdldCB0aGUgaWRzIGZvci4KLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXRBcnJheUlEUyhuZXcgQXJyYXlDb250ZW50c1JldHJpZXZlcih0YXJnZXQpLCBBcnJheS5nZXRMZW5ndGgodGFyZ2V0KSwgQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsKLQkJCQkJCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHRydWUpOwkvLyBXcml0ZSBpdCBiYWNrIGFzIGEgdmFsdWUgY29tbWFuZC4KLQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7CS8vIFRocm93IGl0IGFnYWluLiBUaGVzZSB3ZSBkb24ndCB3YW50IHRvIGNvbWUgdXAgYXMgYW4gZXhjZXB0aW9uIHByb3h5LiBUaGVzZSBzaG91bGQgZW5kIHRoZSB0aHJlYWQuCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCXNlbmRFeGNlcHRpb24oZSwgdmFsdWVPYmplY3QsIG91dCk7CS8vIFR1cm4gaXQgaW50byBhIGV4Y2VwdGlvbiBwcm94eSBvbiB0aGUgY2xpZW50LgotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl0YXJnZXQgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5DQUxMQkFDS19ET05FOgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAoY29ubmVjdGlvblRocmVhZCAhPSBudWxsKSB7Ci0JCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuVU5LTk9XTl9DT01NQU5EX1NFTlQsIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJQ29tbWFuZHMucmVhZEJhY2tWYWx1ZShpbiwgdmFsdWVPYmplY3QsIENvbW1hbmRzLk5PX1RZUEVfQ0hFQ0spOwotCQkJCQkJCQkJaWYgKHZhbHVlT2JqZWN0LnR5cGUgPT0gQ29tbWFuZHMuQVJSQVlfSURTKSB7Ci0JCQkJCQkJCQkJLy8gSXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMsIGFzIGl0IG5vcm1hbGx5IHdvdWxkIGJlLgotCQkJCQkJCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQkJCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCQkJCQkJCXJlc3VsdCA9IHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXJlc3VsdCA9IGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlkb0xvb3AgPSBmYWxzZTsgLy8gV2UgbmVlZCB0byB0ZXJtaW5hdGUgYW5kIHJldHVybiByZXN1bHQKLQkJCQkJCQkJCWNsb3NlV2hlbkRvbmUgPSBmYWxzZTsgLy8gRG9uJ3QgY2xvc2UsIHdlIHdpbGwgY29udGludWUuCi0JCQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkvLyBUaGVyZSB3YXMgYW4gY29tbWFuZCBlcnJvciBvbiB0aGUgb3RoZXIgc2lkZS4gVGhpcyBtZWFucyAKLQkJCQkJCQkJCS8vIGNvbm5lY3Rpb24gc3RpbGwgZ29vZCwgYnV0IGRvbid0IGNvbnRpbnVlIHRoZSBjYWxsYmFjayBwcm9jZXNzaW5nLgotCQkJCQkJCQkJZG9Mb29wID0gZmFsc2U7IC8vIFdlIG5lZWQgdG8gdGVybWluYXRlIGFuZCByZXR1cm4gcmVzdWx0Ci0JCQkJCQkJCQljbG9zZVdoZW5Eb25lID0gZmFsc2U7IC8vIERvbid0IGNsb3NlLCB3ZSB3aWxsIGNvbnRpbnVlLgotCQkJCQkJCQkJdGhyb3cgZTsJLy8gTGV0IGl0IGdvIG9uIG91dC4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJdmFsdWVTZW5kZXIuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuRVJST1I6Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIEdvdCBhbiBlcnJvciBjb21tYW5kLiBEb24ndCBrbm93IHdoYXQgdG8gZG8gYnV0IHJlYWQgdGhlCi0JCQkJCQkJLy8gdmFsdWUgYW5kIHNpbXBseSBwcmludCBpdCBvdXQuCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJcmVzdWx0ID0gZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHNlbnQgdG8gc2VydmVyOiBSZXN1bHQ9IiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQ6Ci0JCQkJCQl0cnkgewotCQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uQ29tbWFuZCh2YWx1ZU9iamVjdCwgdmFsdWVTZW5kZXIpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQl2YWx1ZVNlbmRlci5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8vIFVua25vd24gY29tbWFuZC4gV2UgZG9uJ3Qga25vdyBob3cgbG9uZyBpdCBpcywgc28gd2UgbmVlZCB0byBzaHV0IHRoZSBjb25uZWN0aW9uIGRvd24uCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBJbnZhbGlkIGNtZCBzZW5kIHRvIHNlcnZlcjogQ21kPSIgKyBjbWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsKLQkJCQkJCWNsb3NlV2hlbkRvbmUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBvay4gSXQgbWVhbnMgdGhhdCB0aGUgY29ubmVjdGlvbiBvbiB0aGUgb3RoZXIgc2lkZSB3YXMgdGVybWluYXRlZC4KLQkJCS8vIFNvIGp1c3QgYWNjZXB0IHRoaXMgYW5kIGdvIGRvd24uCi0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwkvLyBzb2NrZXQgbnVsbCBtZWFucyBhIHZhbGlkIGNsb3NlIHJlcXVlc3QKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY2xvc2VXaGVuRG9uZSkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gZXhwcmVzc2lvblByb2Nlc3NvcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQkJCUV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgaXRyLm5leHQoKTsKLQkJCQkJCWV4cC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZXhwcmVzc2lvblByb2Nlc3NvcnMuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQlpbiA9IG51bGw7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQlvdXQgPSBudWxsOwotCQkJCWNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjbG9zZVdoZW5Eb25lICYmIGNvbm5lY3Rpb25UaHJlYWQgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVDb25uZWN0aW9uVGhyZWFkKGNvbm5lY3Rpb25UaHJlYWQpOwotCQlpZiAoc2h1dGRvd24pCi0JCQlzZXJ2ZXIucmVxdWVzdFNodXRkb3duKCk7Ci0JCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gQSByZXRyaWV2ZXIgaXMgd2hhdCBoYW5kbGVzIHRoZSBhcnJheSBnZXQgY29udGVudHMuCi0JcHJpdmF0ZSBjbGFzcyBBcnJheUNvbnRlbnRzUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCWludCBpbmRleD0wOwotCQlPYmplY3QgYXJyYXk7Ci0JCWludCBsZW5ndGg7Ci0JCWludCBjb21wb25lbnRUeXBlOwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCi0JCQotCQlwdWJsaWMgQXJyYXlDb250ZW50c1JldHJpZXZlcihPYmplY3QgYW5BcnJheSkgewotCQkJYXJyYXkgPSBhbkFycmF5OwotCQkJbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFuQXJyYXkpOwotCQkJaWYgKGFuQXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCQkJCWNvbXBvbmVudFR5cGUgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChhbkFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJCX0gZWxzZQotCQkJCWNvbXBvbmVudFR5cGUgPSBOT1RfQV9QUklNSVRJVkU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQlmaWxsSW5WYWx1ZShBcnJheS5nZXQoYXJyYXksIGluZGV4KyspLCBjb21wb25lbnRUeXBlLCB3b3JrZXIpOwotCQkJcmV0dXJuIHdvcmtlcjsKLQkJfQotCX07Ci0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb25Db21tYW5kKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBJbnZva2FibGVWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJSW50ZWdlciBleHByZXNzaW9uSUQgPSBuZXcgSW50ZWdlcihpbi5yZWFkSW50KCkpOwotCQlieXRlIGNtZFR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotCQlFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciBleHAgPSBudWxsOwotCQlzd2l0Y2ggKGNtZFR5cGUpIHsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOgotCQkJCWJ5dGUgdHJhY2UgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCWlmICh0cmFjZSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfREVGQVVMVCkKLQkJCQkJZXhwID0gbmV3IEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKHNlcnZlciwgdGhpcyk7Ci0JCQkJZWxzZQotCQkJCQlleHAgPSBuZXcgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoc2VydmVyLCB0aGlzLCB0cmFjZSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuVFJBQ0VfT04pOwotCQkJCWV4cHJlc3Npb25Qcm9jZXNzb3JzLnB1dChleHByZXNzaW9uSUQsIGV4cCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5UUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1Q6Ci0JCQkJZXhwID0gKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSBleHByZXNzaW9uUHJvY2Vzc29ycy5yZW1vdmUoZXhwcmVzc2lvbklEKTsgCi0JCQkJc2VuZE9iamVjdChleHAsIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5SRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUOgotCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsgCi0JCQkJZXhwcmVzc2lvblByb2Nlc3NvcnMucHV0KGV4cHJlc3Npb25JRCwgZXhwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlBVU0hfRVhQUkVTU0lPTjoKLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLmdldChleHByZXNzaW9uSUQpOwotCQkJCWV4cC5wcm9jZXNzKGluKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlNZTkNfUkVRVUVTVDoKLQkJCQlib29sZWFuIGhhdmVQcm94aWVzID0gaW4ucmVhZEJvb2xlYW4oKTsJLy8gU2VlIGlmIHdlIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCAKLQkJCQlpZiAoaGF2ZVByb3hpZXMpIHsKLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLmdldChleHByZXNzaW9uSUQpOwotCQkJCWlmIChoYXZlUHJveGllcykKLQkJCQkJc2VuZEV4cHJlc3Npb25Qcm94eVJlc29sdXRpb25zKHZhbHVlT2JqZWN0LCAoaW50W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCksIGV4cCk7Ci0JCQkJaWYgKGV4cC5ub0Vycm9ycygpKSB7Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCh0cnVlKTsgLy8gTWFyayB0aGF0IGFsbCBpcyBnb29kLgotCQkJCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHRydWUsIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NFeHByZXNzaW9uRXJyb3IoZXhwLCB2YWx1ZU9iamVjdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuUFVMTF9WQUxVRV9SRVFVRVNUOgotCQkJCWhhdmVQcm94aWVzID0gaW4ucmVhZEJvb2xlYW4oKTsJLy8gU2VlIGlmIHdlIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZAotCQkJCWlmIChoYXZlUHJveGllcykgewotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCX0KLQotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZXhwcmVzc2lvblByb2Nlc3NvcnMuZ2V0KGV4cHJlc3Npb25JRCk7Ci0JCQkJaWYgKGhhdmVQcm94aWVzKQotCQkJCQlzZW5kRXhwcmVzc2lvblByb3h5UmVzb2x1dGlvbnModmFsdWVPYmplY3QsIChpbnRbXSkgdmFsdWVTZW5kZXIuZ2V0QXJyYXkoKSwgZXhwKTsKLQkJCQlpZiAoZXhwLm5vRXJyb3JzKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdFtdIHB1bGxlZFZhbHVlID0gZXhwLnB1bGxWYWx1ZSgpOwotCQkJCQkJLy8gU2VuZCBiYWNrIHRoZSBjb21tYW5kIGNvZGUgZm9yIHB1bGwgdmFsdWUuIERvbid0IGZsdXNoLiBXZSB3aWxsIGZsdXNoIHdoZW4gYWxsIGRvbmUuCi0JCQkJCQlpZiAoKChDbGFzcykgcHVsbGVkVmFsdWVbMV0pLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocHVsbGVkVmFsdWVbMV0pOwotCQkJCQkJCS8vIE5lZWQgdG8gdGVsbCBzZW5kT2JqZWN0IHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCXNlbmRPYmplY3QocHVsbGVkVmFsdWVbMF0sIHJldHVyblR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNlbmRPYmplY3QocHVsbGVkVmFsdWVbMF0sIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSwgdHJ1ZSk7CS8vIEp1c3Qgc2VuZCB0aGUgb2JqZWN0IGJhY2suIHNlbmRPYmplY3Qga25vd3MgaG93IHRvIGl0ZXJwcmV0IHRoZSB0eXBlCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXNlbmROb1ZhbHVlRXJyb3JDb21tYW5kKGV4cCwgdmFsdWVPYmplY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIAotCQkJCQlwcm9jZXNzRXhwcmVzc2lvbkVycm9yKGV4cCwgdmFsdWVPYmplY3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOgotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZXhwcmVzc2lvblByb2Nlc3NvcnMucmVtb3ZlKGV4cHJlc3Npb25JRCk7Ci0JCQkJZXhwLmNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBleHAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VuZEV4cHJlc3Npb25Qcm94eVJlc29sdXRpb25zKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBmaW5hbCBpbnRbXSBwcm94eUlEcywgZmluYWwgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgZXhwKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWNsYXNzIEV4cHJlc3Npb25Qcm94eVJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJaW50IGluZGV4ID0gMDsKLQkJCU9iamVjdFtdIHByb3h5UmVzb2x1dGlvbiA9IG5ldyBPYmplY3RbMl07Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQlpbnQgcHJveHlJRCA9IHByb3h5SURzW2luZGV4KytdOwotCQkJCWlmIChleHAucHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5SUQsIHByb3h5UmVzb2x1dGlvbikpIHsKLQkJCQkJaWYgKHByb3h5UmVzb2x1dGlvblsxXSAhPSBWb2lkLlRZUEUpIHsKLQkJCQkJCWlmICgoKENsYXNzKSBwcm94eVJlc29sdXRpb25bMV0pLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQlpbnQgcmV0dXJuVHlwZUlEID0gc2VydmVyLmdldElkZW50aXR5SUQocHJveHlSZXNvbHV0aW9uWzFdKTsKLQkJCQkJCQkvLyBOZWVkIHRvIHRlbGwgd29ya2VyIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlLgotCQkJCQkJCWZpbGxJblZhbHVlKHByb3h5UmVzb2x1dGlvblswXSwgcmV0dXJuVHlwZUlELCB3b3JrZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaWxsSW5WYWx1ZShwcm94eVJlc29sdXRpb25bMF0sIE5PVF9BX1BSSU1JVElWRSwgd29ya2VyKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQl3b3JrZXIuc2V0RmxhZyhFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlBST1hZX1ZPSURUWVBFKTsJLy8gSXQgd2FzIHJlc29sdmVkLCBidXQgdG8gbm90IHNldCBkdWUgdG8gdm9pZCB0eXBlIG9mIGV4cHJlc3Npb24uCi0JCQkJfSBlbHNlCi0JCQkJCXdvcmtlci5zZXRGbGFnKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OUFJPWFlfTk9UUkVTT0xWRUQpOwkvLyBJdCB3YXNuJ3QgcmVzb2x2ZWQuCi0JCQkJCi0JCQkJcmV0dXJuIHdvcmtlcjsKLQkJCX0KLQkJfTsKLQotCQl2YWx1ZU9iamVjdC5zZXRBcnJheUlEUyhuZXcgRXhwcmVzc2lvblByb3h5UmV0cmlldmVyKCksIHByb3h5SURzLmxlbmd0aCwgQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsKLQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB0cnVlLCBmYWxzZSk7CS8vIFdyaXRlIGl0IGJhY2sgYXMgYSB2YWx1ZSBjb21tYW5kLgotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHByZXNzaW9uRXJyb3IoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgZXhwLCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoZXhwLmlzTm9FeHByZXNzaW9uVmFsdWUoKSkgewotCQkJc2VuZE5vVmFsdWVFcnJvckNvbW1hbmQoZXhwLCB2YWx1ZU9iamVjdCk7Ci0JCX0gZWxzZQotCQkJc2VuZEV4Y2VwdGlvbihleHAuZ2V0RXJyb3JUaHJvd2FibGUoKSwgdmFsdWVPYmplY3QsIG91dCk7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZXhwCi0JICogQHBhcmFtIHZhbHVlT2JqZWN0Ci0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbmROb1ZhbHVlRXJyb3JDb21tYW5kKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJc2V0RXhjZXB0aW9uSW50b1ZhbHVlKGV4cC5nZXRFcnJvclRocm93YWJsZSgpLCB2YWx1ZU9iamVjdCk7Ci0JCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04sIHZhbHVlT2JqZWN0KTsKLQl9Ci0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PVF9BX1BSSU1JVElWRSA9IENvbW1hbmRzLk5PVF9BTl9JRDsKLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFTkRfQVNfSVMgPSAtMjsJLy8gVGhpcyBtZWFucyBzZW5kcyBhcyBhbiBvYmplY3Qgbm90IGFzIGFuIGlkLgotCQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQURERUQgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FEREVEID0gMjsKLXB1YmxpYyBpbnQgZmlsbEluVmFsdWUoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHsKLQlpbnQgYWRkZWQgPSAwOwotCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQl9IGVsc2UgewotCQlpbnQgY2xhc3NJRCA9IDA7Ci0JCWlmIChwcmltaXRpdmVUeXBlSUQgIT0gTk9UX0FfUFJJTUlUSVZFICYmIHByaW1pdGl2ZVR5cGVJRCAhPSBTRU5EX0FTX0lTKSB7Ci0JCQljbGFzc0lEID0gcHJpbWl0aXZlVHlwZUlEOwkvLyBUaGUgb2JqZWN0IGlzIHJlYWxseSBzdXBwb3NlZCB0byBiZSBhIHByaW1pdGl2ZSBvZiB0aGlzIHR5cGUKLQkJCXN3aXRjaCAoY2xhc3NJRCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQk9PTEVBTl9UWVBFOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChCb29sZWFuKSBvYmplY3QpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX1RZUEU6Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKGludCkgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYW4gaW50Ci0JCQkJCWVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5pbnRWYWx1ZSgpKTsJCQkJCQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJZVEVfVFlQRToKLQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoTnVtYmVyKSBvYmplY3QpLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfVFlQRToKLQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRToKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoZG91YmxlKSAoKENoYXJhY3Rlcikgb2JqZWN0KS5jaGFyVmFsdWUoKSk7CS8vIEJlY2F1c2UgY2hhciBjYW4gYmUgd2lkZW5lZCB0byBhIGRvdWJsZQotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuZG91YmxlVmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFOgotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQkJdmFsdWVPYmplY3Quc2V0KChmbG9hdCkgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYSBmbG9hdAotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuZmxvYXRWYWx1ZSgpKTsJCQkJCQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX1RZUEU6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5zaG9ydFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRToKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgobG9uZykgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYSBsb25nCi0JCQkJCWVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5sb25nVmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCdzIG5vdCBhIHByaW1pdGl2ZS4KLQkJCWJvb2xlYW4gYWRkT2JqZWN0ID0gZmFsc2UsIGFkZENsYXNzID0gZmFsc2U7CQkJCi0JCQlDbGFzcyBvYmpDbGFzcyA9IG9iamVjdC5nZXRDbGFzcygpOwotCQkJY2xhc3NJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKG9iakNsYXNzKTsKLQkJCWlmIChjbGFzc0lEID09IFJlbW90ZVZNU2VydmVyVGhyZWFkLklEX05PVF9GT1VORCkgewotCQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IGNsYXNzVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCQlhZGRDbGFzcyA9IHNlcnZlci5nZXRJZGVudGl0eUlEKG9iakNsYXNzLCBjbGFzc1ZhbHVlKTsKLQkJCQlpZiAoYWRkQ2xhc3MpCi0JCQkJCWFkZGVkIHw9IENMQVNTX0FEREVEOwotCQkJCWNsYXNzSUQgPSBjbGFzc1ZhbHVlLm9iamVjdElEOwotCQkJfQotCQkKLQkJCXN3aXRjaCAoY2xhc3NJRCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChCeXRlKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChDaGFyYWN0ZXIpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuRE9VQkxFX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKERvdWJsZSkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChGbG9hdCkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKEludGVnZXIpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuTE9OR19DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChMb25nKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKFNob3J0KSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoQm9vbGVhbikgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5TVFJJTkdfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoU3RyaW5nKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQob2JqZWN0LCBDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldChvYmplY3QsIENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKHByaW1pdGl2ZVR5cGVJRCAhPSBTRU5EX0FTX0lTKSB7Ci0JCQkJCQlhZGRPYmplY3QgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChvYmplY3QsIHZhbHVlT2JqZWN0KTsKLQkJCQkJCWlmIChhZGRPYmplY3QpIHsKLQkJCQkJCQlhZGRlZCB8PSBPQkpFQ1RfQURERUQ7CQkJCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0T2JqZWN0SUQodmFsdWVPYmplY3Qub2JqZWN0SUQsIGNsYXNzSUQpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0T2JqZWN0SUQodmFsdWVPYmplY3Qub2JqZWN0SUQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXZhbHVlT2JqZWN0LnNldChvYmplY3QsIGNsYXNzSUQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlyZXR1cm4gYWRkZWQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNlbmRPYmplY3QoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QsIERhdGFPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIHdyaXRlQXNDb21tYW5kKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0Jc2VuZE9iamVjdChvYmplY3QsIHByaW1pdGl2ZVR5cGVJRCwgdmFsdWVPYmplY3QsIG91dCwgd3JpdGVBc0NvbW1hbmQsIHdyaXRlQXNDb21tYW5kKTsKLX0KLXB1YmxpYyB2b2lkIHNlbmRPYmplY3QoT2JqZWN0IG9iamVjdCwgaW50IHByaW1pdGl2ZVR5cGVJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QsIERhdGFPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIHdyaXRlQXNDb21tYW5kLCBib29sZWFuIGZsdXNoKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7CQkJCi0JaW50IGFkZGVkID0gZmlsbEluVmFsdWUob2JqZWN0LCBwcmltaXRpdmVUeXBlSUQsIHZhbHVlT2JqZWN0KTsKLQlib29sZWFuIHNlbnQgPSBmYWxzZTsKLQl0cnkgewotCQlDb21tYW5kcy53cml0ZVZhbHVlKG91dCwgdmFsdWVPYmplY3QsIHdyaXRlQXNDb21tYW5kLCBmbHVzaCk7CS8vIFdyaXRlIGl0IGJhY2sgYXMgYSB2YWx1ZSBjb21tYW5kLgotCQlzZW50ID0gdHJ1ZTsKLQl9IGZpbmFsbHkgewotCQlpZiAoIXNlbnQpIHsKLQkJCS8vIEVuZGluZyBkdWUgdG8gc29tZSBwcm9ibGVtLCBzbyBjbGVhbiB1cCBhbnkgYWRkZWQgb2JqZWN0cyBmcm9tIHRoZSBpZCB0YWJsZS4KLQkJCWlmICgoYWRkZWQgJiBPQkpFQ1RfQURERUQpICE9IDApCi0JCQkJc2VydmVyLnJlbW92ZU9iamVjdCh2YWx1ZU9iamVjdC5vYmplY3RJRCk7Ci0JCQlpZiAoKGFkZGVkICYgQ0xBU1NfQURERUQpICE9IDApCi0JCQkJc2VydmVyLnJlbW92ZU9iamVjdCh2YWx1ZU9iamVjdC5jbGFzc0lEKTsKLQkJfQotCX0KLX0KLQkJCi0JCi0JcHVibGljIHZvaWQgc2VuZEV4Y2VwdGlvbihUaHJvd2FibGUgZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCS8vIEV4Y2VwdGlvbiBvY3VycmVkLCByZXR1cm4gYSB2YWx1ZSBjb21tYW5kIHdpdGggdGhlIGV4Y2VwdGlvbiB3aXRoaW4gaXQuCi0JCXNldEV4Y2VwdGlvbkludG9WYWx1ZShlLCB2YWx1ZSk7Ci0JCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5USFJPV0FCTEVfU0VOVCwgdmFsdWUpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uSW50b1ZhbHVlKFRocm93YWJsZSBlLCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewkJCi0JCXNlcnZlci5nZXRJZGVudGl0eUlEKGUsIHZhbHVlKTsJLy8gSXQgc2hvdWxkIGFsd2F5cyBjcmVhdGUgaXQgc28gd2UgZG9uJ3QgbmVlZCB0byBrbm93LgotCQlpbnQgZUlEID0gdmFsdWUub2JqZWN0SUQ7Ci0JCUNsYXNzIGVDbGFzcyA9IGUuZ2V0Q2xhc3MoKTsJCQkJCQkJCi0JCXNlcnZlci5nZXRJZGVudGl0eUlEKGVDbGFzcywgdmFsdWUpOwotCQlpbnQgZUNsYXNzSUQgPSB2YWx1ZS5vYmplY3RJRDsKLQkJdmFsdWUuc2V0RXhjZXB0aW9uKGVJRCwgZUNsYXNzSUQpOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIHRoZSB2YWx1ZU9iamVjdCwgZ2V0IGFuIE9iamVjdCB0aGF0IGlzIGludm9rYWJsZSAoaS5lLiBjYW4gYmUgdGhlIHRhcmdldCBvZiBhbiBpbnZva2UsIG9yIG9uZSBvZiBpdHMgcGFybXMpLgotCSAqIElmIGl0IGlzIGFuIGFycmF5IHR5cGUsIHRoZSBhIFZhbHVlU2VuZGVyIGlzIHJldHVybmVkLiBUaGUgaW52b2tlciBuZWVkcyB0byB0aGVuIGNhc3QgdGhpcwotCSAqIHRvIGEgVmFsdWVTZW5kZXIgYW5kIGNhbGwgdGhlIHJlYWRBcnJheSByb3V0aW5lLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW52b2thYmxlT2JqZWN0KGZpbmFsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkJY2FzZSBDb21tYW5kcy5ORVdfT0JKRUNUX0lEOgotCQkJY2FzZSBDb21tYW5kcy5PQkpFQ1RfSUQ6Ci0JCQkJLy8gVGhlc2UgbmVlZCB0byBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmVyIHRvIGdldCB0aGUgcmVhbCBvYmplY3QKLQkJCQlyZXR1cm4gc2VydmVyLmdldE9iamVjdCh2YWx1ZS5vYmplY3RJRCk7CQkJCQkJCi0JCQlkZWZhdWx0OgotCQkJCS8vIFRoZXNlIGhhdmUgYWxsIHRoZSBpbmZvIG5lZWRlZCB3aXRoaW4gdGhlIHZhbHVlIG9iamVjdCBpdHNlbGYsIHNvIGFzayBpdC4KLQkJCQlyZXR1cm4gdmFsdWUuZ2V0QXNPYmplY3QoKTsKLQkJfQotCX0KLQkKLQkvLyBIZWxwZXIgY2xhc3MgZm9yIGdldHRpbmcgYW4gYXJyYXkuCi0JcHJpdmF0ZSBjbGFzcyBJbnZva2FibGVWYWx1ZVNlbmRlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlU2VuZGVyIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJT2JqZWN0IGFycmF5OwotCi0JCXB1YmxpYyBJbnZva2FibGVWYWx1ZVNlbmRlcigpIHsKLQkJfQotCQkJCQotCQlwdWJsaWMgSW52b2thYmxlVmFsdWVTZW5kZXIoQ29tbWFuZHMuVmFsdWVPYmplY3QgYXJyYXlIZWFkZXIpIHsKLQkJCWluaXRpYWxpemUoYXJyYXlIZWFkZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQlpbmRleCA9IDA7Ci0JCQlDbGFzcyBhcnJheVR5cGUgPSAoQ2xhc3MpIHNlcnZlci5nZXRPYmplY3QoYXJyYXlIZWFkZXIuY2xhc3NJRCk7Ci0JCQlhcnJheSA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgYXJyYXlIZWFkZXIuYW5JbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWFycmF5ID0gbnVsbDsKLQkJCWluZGV4ID0gMDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRBcnJheSgpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQkJCQkKLQkJLy8gQSBuZXcgdmFsdWUgaXMgYmVpbmcgc2VudCB0byB0aGUgYXJyYXkKLQkJcHVibGljIHZvaWQgc2VuZFZhbHVlKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5zZXQoYXJyYXksIGluZGV4KyssIGdldEludm9rYWJsZU9iamVjdCh2YWx1ZSkpOwkvLyBhZGQgaXQgdG8gdGhlIGFycmF5Ci0JCX0KLQkJCQkJCi0JCS8vIFRoZSBuZXh0IGVudHJ5IGlzIGFuIGFycmF5IHRvbyEKLQkJcHVibGljIENvbW1hbmRzLlZhbHVlU2VuZGVyIG5lc3RlZEFycmF5KENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQlJbnZva2FibGVWYWx1ZVNlbmRlciBzZW5kZXIgPSBuZXcgSW52b2thYmxlVmFsdWVTZW5kZXIoYXJyYXlIZWFkZXIpOwotCQkJLy8gVGFrZSB0aGUgbmV3bHkgY3JlYXRlZCBhcnJheSBhbmQgcHV0IGl0IGludG8gdGhlIGN1cnJlbnQgYXJyYXkuCi0JCQlqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5zZXQoYXJyYXksIGluZGV4KyssIHNlbmRlci5nZXRBcnJheSgpKTsKLQkJCXJldHVybiBzZW5kZXI7Ci0JCX0KLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25UaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvblRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMyNzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvblRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGlzIGEgdGhyZWFkIHRvIGhhbmRsZSBvbmUgY29ubmVjdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7CQotCQkKLQlmaW5hbCBwcm90ZWN0ZWQgQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXI7Ci0JCi0JcHVibGljIENvbm5lY3Rpb25UaHJlYWQoU29ja2V0IHNjLCBSZW1vdGVWTVNlcnZlclRocmVhZCBzdnIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCi0JCWNvbm5lY3Rpb25IYW5kbGVyID0gbmV3IENvbm5lY3Rpb25IYW5kbGVyKHNjLCBzdnIsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gY2xvc2UgZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWNvbm5lY3Rpb25IYW5kbGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJY29ubmVjdGlvbkhhbmRsZXIucnVuKCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0OGI0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0V4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuRXhwcmVzc2lvbkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLQotIAotLyoqCi0gKiBUaGlzIHByb2Nlc3NlcyB0aGUgY29tbWFuZHMgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBhbmQgc2VuZHMgdGhlbSBvdmVyCi0gKiB0byB0aGUgY29tbW9uIGV4cHJlc3Npb24gcHJvY2Vzc2VyLgotICogCi0gKiBUaGlzIHdpbGwgYmUgaW5zdGFudGlhdGVkIG9uIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLiBBbmQgdGhlbgotICogZWFjaCBleHByZXNzaW9uIHJlcXVlc3QgZnJvbSB0aGUgSURFIHdpbGwgYmUgc2VudCBpbnRvIGhlcmUuIFRoZQotICogcmVhc29uIHRoaXMgZ3V5IGRvZXNuJ3QgaG9sZCBvbnRvIHRoZSBjb25uZWN0aW9uIGFuZCBwcm9jZXNzIHRoZQotICogZW50aXJlIGV4cHJlc3Npb24gaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiB0byB0aGUgY29ubmVjdGlvbgotICogaGFuZGxlciB0byBrZWVwIHRoZSBjb25uZWN0aW9uIGxpdmUgKHRoZXJlIGlzIHRpbWVvdXRzIGFuZCBzdHVmZgotICogaW4gdGhlcmUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSBoZXJlKS4KLSAqIDxwPgotICogSWYgdGhlcmUgYXJlIGFueSBleHByZXNzaW9uIHByb2Nlc3NpbmcgZXJyb3JzICh2ZXJzdXMgaGFyZCBpbyBlcnJvcnMpIHdlCi0gKiB3aWxsIHNhdmUgdXAgdGhlIGVycm9yIGJ1dCBkb24ndCBkbyBhbnkgbW9yZSBwcm9jZXNzaW5nIG90aGVyIHRoYW4gdG8gbWFrZQotICogc3VyZSB3ZSByZWFkIHRoZSBjb21wbGV0ZSBzdWJjb21tYW5kLiBUaGlzIGlzIHNvIHRoYXQgdGhlIGlucHV0c3RyZWFtIGlzIGxlZnQKLSAqIGluIGEgdmFsaWQgc3RhdGUgd2l0aG91dCBzdGFuZGVkIGRhdGEuCi0gKiA8cD4KLSAqIFRoZSBhdCB0aGUgc3luYyBwb2ludCAoZWl0aGVyIGdldCB2YWx1ZSBvciBzeW5jIHN1YmNvbW1hbmQpIHdlIHdpbGwgc2VuZCBiYWNrCi0gKiB0aGUgZXJyb3IuCi0gKiAgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIHsKLQotCQotCXByb3RlY3RlZCBmaW5hbCBSZW1vdGVWTVNlcnZlclRocmVhZCBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5IYW5kbGVyOwkKLQlwcm90ZWN0ZWQgZmluYWwgRXhwcmVzc2lvblByb2Nlc3NlciBleHA7Ci0JcHJvdGVjdGVkIENvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlclZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7CS8vIEEgd29ya2VyIHZhbHVlIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgY3JlYXRpbmcgdGhlbSBhbmQgcmVsZWFzaW5nIHRoZW0uCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIGRlZmF1bHQgZXhwcmVzc2lvbiBwcm9jZXNzZXIgYW5kIHVzZSBkZWZhdWx0IGZsYWcgZm9yIHRyYWNlLgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc2VydmVyLCBDb25uZWN0aW9uSGFuZGxlciBjb25uSGFuZGxlcikgewotCQl0aGlzKHNlcnZlciwgY29ubkhhbmRsZXIsIG5ldyBFeHByZXNzaW9uUHJvY2Vzc2VyKEJvb2xlYW4uZ2V0Qm9vbGVhbihFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlRSQUNFKSwgTG9uZy5nZXRMb25nKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xELCAtMUwpLmxvbmdWYWx1ZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgZGVmYXVsdCBleHByZXNzaW9uIHByb2Nlc3Nlci4KLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIGNvbm5IYW5kbGVyCi0JICogQHBhcmFtIHRyYWNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlciwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubkhhbmRsZXIsIGJvb2xlYW4gdHJhY2UpIHsKLQkJdGhpcyhzZXJ2ZXIsIGNvbm5IYW5kbGVyLCBuZXcgRXhwcmVzc2lvblByb2Nlc3Nlcih0cmFjZSwgTG9uZy5nZXRMb25nKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xELCAtMUwpLmxvbmdWYWx1ZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBmcm9tIGEgc3ViY2xhc3Mgd2l0aCBhIGdpdmVuIGV4cHJlc3Npb24gcHJvY2Vzc2VyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gZXhwCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlciwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubkhhbmRsZXIsIEV4cHJlc3Npb25Qcm9jZXNzZXIgZXhwKSB7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLmNvbm5IYW5kbGVyID0gY29ubkhhbmRsZXI7Ci0JCXRoaXMuZXhwID0gZXhwOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGNsYXNzIGxvYWRlciB0byB1c2UgZm9yIGZpbmRpbmcgY2xhc3Nlcy4gSWYgbmV2ZXIgc2V0LCBvciBpZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgotCSAqIDxjb2RlPkNsYXNzLmZvck5hbWU8L2NvZGU+IHdpbGwgYmUgdXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0JfQotCQotCS8qCi0JICogQXJyYXkgb2YgcHJpbWl0aXZlIHR5cGUgbmFtZXMuIFVzZWQgdG8gbG9vayB1cCBwcmltdGl2ZSB0eXBlcyBpbiBwcmltaXRpdmUgdHlwZXMgYXJyYXkuIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJJTUlUSVZFX05BTUVTID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJieXRlIiwgImNoYXIiLCAic2hvcnQiLCAiaW50IiwgImxvbmciLCAiZmxvYXQiLCAiZG91YmxlIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQUklNSVRJVkVfVFlQRVMgPSBuZXcgQ2xhc3NbXSB7Qnl0ZS5UWVBFLCBDaGFyYWN0ZXIuVFlQRSwgU2hvcnQuVFlQRSwgSW50ZWdlci5UWVBFLCBMb25nLlRZUEUsIEZsb2F0LlRZUEUsIERvdWJsZS5UWVBFfTsKLQkvKioKLQkgKiBMb2FkIHRoZSBjbGFzcyBnaXZlbiB0aGUgbmFtZS4gSWYgbm90IGZvdW5kLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCJbXSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFdlIGhhdmUgYW4gYXJyYXkgcmVxdWVzdCBpbnN0ZWFkLiBUaGlzIGlzIHRyaWNraWVyLgotCQkJcmV0dXJuIGxvYWRDbGFzcyhNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNsYXNzTmFtZSkpOwotCQl9IGVsc2UgewotCQkJaW50IHByaW1JbmRleCA9IFBSSU1JVElWRV9OQU1FUy5pbmRleE9mKGNsYXNzTmFtZSk7Ci0JCQlpZiAocHJpbUluZGV4ID49IDApCi0JCQkJcmV0dXJuIFBSSU1JVElWRV9UWVBFU1twcmltSW5kZXhdOwotCQkJZWxzZSBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdyBwcm9jZXNzIHRoZSBpbnB1dCBzdHJlYW0uIElmIGVpdGhlciB0aHJvd3Mgb2NjdXJzLCB0aGlzIGlzIGEgaGFyZCBlcnJvciBhbmQgd2UgbXVzdCB0ZXJtaW5hdGUKLQkgKiB0aGUgZW50aXJlIGNvbm5lY3Rpb24uIFRoZSBpbnB1dCBzdHJlYW0gaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW4gVGhlIGlucHV0IHN0cmVhbSB0byBnZXQgdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHN1Yi1jb21tYW5kLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gSW4gdGhlIGZvbGxvd2luZyBzdWJjb21tYW5kIHByb2Nlc3NpbmcsIHdlIGFsd2F5cyByZWFkIHRoZSBlbnRpcmUgc3ViY29tbWFuZCBmcm9tIHRoZSBzdHJlYW0uCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgZXJyb3JzIGR1cmluZyBwcm9jZXNzaW5nIHdpbGwgbm90IG1lc3MgdXAgdGhlIHN0cmVhbSB3aXRoIHVucmVhZCBkYXRhLgotCQkvLwotCQkvLyBUaGVuIHdlIGNoZWNrIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBpbiB0aGUgcGFzdC4gSWYgaXQgaGFzLCB3ZSBzaW1wbHkgYnJlYWsuIFRoaXMgaXMgYmVjYXVzZQotCQkvLyBvbmNlIGFuIGVycm9yIG9jY3VycmVkIHdlIGRvbid0IHdhbnQgdG8gY29udGludWUgd2FzdGluZyB0aW1lIGV2YWx1YXRpbmcsIGhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlCi0JCS8vIHN1cmUgdGhhdCB0aGUgc3RyZWFtIGlzIHJlYWQgY29tcGxldGVseSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBjb3JydXB0ZWQgaW5wdXQgc3RyZWFtLiBUaGF0IHdheQotCQkvLyB3aGVuIGFsbCBpcyBkb25lIHdlIGNhbiByZXR1cm4gdGhlIGVycm9yIGFuZCBzdGlsbCBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbiBzb2NrZXQuCi0JCWJ5dGUgc3ViY29tbWFuZCA9IGluLnJlYWRCeXRlKCk7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKHN1YmNvbW1hbmQpIHsKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0dGluZyBhIHByb3h5IHB1c2guIFRoZSB2YWx1ZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LCBzbyB1c2UgdGhhdCB0byByZWFkIGl0IGluLgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJT2JqZWN0IHZhbHVlID0gY29ubkhhbmRsZXIuZ2V0SW52b2thYmxlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24obnVsbCwgTWV0aG9kSGVscGVyLk5VTExfVFlQRSk7Ci0JCQkJCWVsc2UgaWYgKHdvcmtlclZhbHVlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24odmFsdWUsIHdvcmtlclZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWV4cC5wdXNoRXhwcmVzc2lvbih2YWx1ZSwgdmFsdWUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DQVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGNhc3QgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaENhc3QoY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGluc3RhbmNlb2YgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEluc3RhbmNlb2YoY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYW4gaW5maXggcmVxdWVzdC4gVGhlIG9wZXJhdG9yIGFuZCBvcGVyYW5kIHR5cGUgYXJlIHNlbnQgYXMgYnl0ZXMuCi0JCQkJCWJ5dGUgaW5maXhfb3BlcmF0b3IgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlieXRlIGluZml4X29wZXJhbmRUeXBlID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQkJZXhwLnB1c2hJbmZpeChJbmZpeE9wZXJhdG9yLmdldChpbmZpeF9vcGVyYXRvciksIEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5nZXQoaW5maXhfb3BlcmFuZFR5cGUpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBwcmVmaXggcmVxdWVzdC4gVGhlIG9wZXJhdG9yIGlzIHNlbnQgYXMgYnl0ZS4KLQkJCQkJYnl0ZSBwcmVmaXhfb3BlcmFuZFR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlleHAucHVzaFByZWZpeChQcmVmaXhPcGVyYXRvci5nZXQocHJlZml4X29wZXJhbmRUeXBlKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFycmF5IGFjY2VzcyByZXF1ZXN0LiBUaGUgaW5kZXggY291bmQgaXMgc2VudCBhcyBpbnQuCi0JCQkJCWludCBhcnJheUFjY2Vzc19JbmRleGNvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQlleHAucHVzaEFycmF5QWNjZXNzKGFycmF5QWNjZXNzX0luZGV4Y291bnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFycmF5IGNyZWF0aW9uIHJlcXVlc3QuIFRoZSB0eXBlIGlzIHNlbnQgYXMgdmFsdWVPYmplY3QsIGZvbGxvd2VkIGJ5IGludCBkaW1lbnNpb24gY291bnQuCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlpbnQgYXJyYXlDcmVhdGlvbl9kaW1Db3VudCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoQXJyYXlDcmVhdGlvbihjbGFzc1ZhbHVlLCBhcnJheUNyZWF0aW9uX2RpbUNvdW50KTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhcnJheSBpbml0aWFsaXplciByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LCBmb2xsb3dlZCBieSBpbnQgZXhwcmVzc2lvbiBjb3VudC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWludCBzdHJpcENvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQlpbnQgYXJyYXlJbml0aWFsaXplcl9leHByZXNzaW9uQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEFycmF5SW5pdGlhbGl6ZXIoY2xhc3NWYWx1ZSwgc3RyaXBDb3VudCwgYXJyYXlJbml0aWFsaXplcl9leHByZXNzaW9uQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaW50IGFyZ3VtZW50IGNvdW50LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJaW50IG5ld0luc3RhbmNlX2FyZ0NvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY2xhc3NWYWx1ZSA9IGdldEJlYW5UeXBlVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb24oY2xhc3NWYWx1ZSwgbmV3SW5zdGFuY2VfYXJnQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHR5cGUgcmVjZWl2ZXIgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24oY2xhc3NWYWx1ZSwgY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5GSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgZmllbGQgYWNjZXNzIHJlcXVlc3QuIENvbW1hbmQuVmFsdWVPYmplY3QsIGZvbGxvd2VkIGJ5IGhhc1JlY2VpdmVyIGFzIGJvb2xlYW4uCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlib29sZWFuIGhhc19maWVsZEFjY2Vzc19yZWNlaXZlciA9IGluLnJlYWRCb29sZWFuKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgZmllbGRBY2Nlc3MgPSBnZXRGaWVsZFZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoRmllbGRBY2Nlc3MoZmllbGRBY2Nlc3MsIHdvcmtlclZhbHVlLmdldFR5cGUoKSA9PSBDb21tYW5kcy5TVFJJTkcsIGhhc19maWVsZEFjY2Vzc19yZWNlaXZlcik7Ci0JCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NRVRIT0RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgbWV0aG9kIGludm9jYXRpb24gcmVxdWVzdC4gU2VudCBhcyBDb21tYW5kcy5WYWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaGFzUmVjZWl2ZXIgYXMgYm9vbGVhbi4sIGFuZCBhcmdDb3VudCBhcyBpbnQuCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlib29sZWFuIGhhc19tZXRob2RfcmVjZWl2ZXIgPSBpbi5yZWFkQm9vbGVhbigpOwotCQkJCQlpbnQgbWV0aG9kX2FyZ0NvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZFZhbHVlKHdvcmtlclZhbHVlKTsJCQkJCQotCQkJCQkJZXhwLnB1c2hNZXRob2RJbnZvY2F0aW9uKG1ldGhvZCwgd29ya2VyVmFsdWUuZ2V0VHlwZSgpID09IENvbW1hbmRzLlNUUklORywgaGFzX21ldGhvZF9yZWNlaXZlciwgbWV0aG9kX2FyZ0NvdW50KTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gcmVxdWVzdC4gVGhlIGV4cHJlc3Npb24gdHlwZSAoaWUuIGNvbmRpdGlvbi90cnVlL2ZhbHNlKSBpcyBzZW50IGFzIGEgYnl0ZQotCQkJCQlleHAucHVzaENvbmRpdGlvbmFsKEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5nZXQoaW4ucmVhZEJ5dGUoKSkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcmVxdWVzdC4gVGhlIHByb3h5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlpbnQgcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJZXhwLnB1c2hBc3NpZ25tZW50KG5ldyBSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcmVxdWVzdC4gTm90aGluZyBlbHNlIHRvIHJlYWQgZnJvbSBzdHJlYW0uCi0JCQkJCWV4cC5wdXNoQXNzaWdubWVudCgpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX1RPX0VYUFJFU1NJT05fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgcHVzaCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uIFRoZSBwcm94eSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJLy8gRmlyc3QgdGVzdCBpZiBhIHBvc3NpYmxlIEZhaWxlZEV4cHJlc3Npb25Qcm94eSBiZWNhdXNlIHdlIGNvdWxkIG9mIGJlZW4gcHVzaGluZwotCQkJCQkvLyBhIGZhaWxlZCByZWZsZWN0aW9uIHByb3h5LgotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJZXhwLmdldEV4cHJlc3Npb25Qcm94eShwcm94eWlkLCBuZXcgT2JqZWN0W10ge251bGwsIG51bGx9KTsKLQkJCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZTEpIHsJCQkJCQkKLQkJCQkJCWlmIChlMS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUxLmdldFByb3h5KCk7Ci0JCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oKFRocm93YWJsZSkgZmFpbHVyZS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQlicmVhazsJLy8gRG9uJ3QgZ28gb24sIHdlIHByb2Nlc3NlZCBpdC4gQSBzdGFuZGFyZCBubyBleHByZXNzaW9uIHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgb24gYW5kIGxldCBmb2xsb3dpbmcgY29kZSBoYW5kbGUgaXQuCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZXhwLnB1c2hFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCWJyZWFrOwotCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYmVnaW4gYmxvY2sgcHJveHkgZXhwcmVzc2lvbi4gVGhlIGJsb2NrIGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaEJsb2NrQmVnaW4oaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQlJFQUtfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYnJlYWsgYmxvY2sgcHJveHkgZXhwcmVzc2lvbi4gVGhlIGJsb2NrIGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaEJsb2NrQnJlYWsoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGVuZCBibG9jayBwcm94eSBleHByZXNzaW9uLiBUaGUgYmxvY2sgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoQmxvY2tFbmQoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHRyeSBiZWdpbiBwcm94eSBleHByZXNzaW9uLiBUaGUgdHJ5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaFRyeUJlZ2luKGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQlpbnQgdHJ5TnVtYmVyID0gaW4ucmVhZEludCgpOwotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoVHJ5Q2F0Y2hDbGF1c2UodHJ5TnVtYmVyLCBjbGFzc1ZhbHVlLCBwcm94eWlkICE9IC0xID8gbmV3IFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKSA6IG51bGwpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0ZJTkFMTFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgdHJ5IGZpbmFsbHkgcHJveHkgZXhwcmVzc2lvbi4gVGhlIHRyeSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hUcnlGaW5hbGx5Q2xhdXNlKGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHRyeSBlbmQgcHJveHkgZXhwcmVzc2lvbi4gVGhlIHRyeSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hUcnlFbmQoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVEhST1dfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJZXhwLnB1c2hUaHJvd0V4Y2VwdGlvbigpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUkVUSFJPV19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSByZXRocm93IHByb3h5IGV4cHJlc3Npb24uIFRoZSB0cnkgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoVHJ5UmV0aHJvdyhpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9CRUFOVFlQRV9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IGFuZCByZXNvbHZlIGl0LgotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gbG9hZENsYXNzKHR5cGVOYW1lKTsKLQkJCQkJCVJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGNsYXNzVmFsdWUsIENsYXNzLmNsYXNzKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUsIGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUsIGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX01FVEhPRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBNZXRob2QgZXhwcmVzc2lvbiBwcm94eSBhbmQgcmVzb2x2ZSBpdC4KLQkJCQkJLy8gQ29tZXMgb3ZlciBhczoKLQkJCQkJLy8gICBpbnQgZm9yIHByb3h5IGlkIGZvciB0aGUgbWV0aG9kCi0JCQkJCS8vICAgYmVhblR5cGVWYWx1ZSBmb3IgZGVjbGFyaW5nIGNsYXNzIChlaXRoZXIgYmVhbnR5cGUgb3IgZXhwcmVzc2lvbiBwcm94eSkKLQkJCQkJLy8gICBzdHJpbmcgZm9yIG1ldGhvZCBuYW1lCi0JCQkJCS8vICAgaW50IGZvciBhcmcgY291bnQKLQkJCQkJLy8gICBiZWFuVHlwZVZhbHVlKHMpIGZvciBhcmcgdHlwZXMgKGFzIG1hbnkgYXMgYXJnIGNvdW50KS4KLQkJCQkJcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgZGVjQ2xhc3NWYWx1ZSA9ICBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCWludCBhcmdDb3VudCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3RbXSBhcmdzID0gbnVsbDsKLQkJCQkJaWYgKGFyZ0NvdW50ID4gMCkgewotCQkJCQkJYXJncyA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdFthcmdDb3VudF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHsKLQkJCQkJCQlhcmdzW2ldID0gQ29tbWFuZHMucmVhZFZhbHVlKGluLCBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgZGVjQ2xhc3MgPSBudWxsOwotCQkJCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZGVjQ2xhc3MgPSBnZXRCZWFuVHlwZVZhbHVlKGRlY0NsYXNzVmFsdWUpOwotCQkJCQkJYXJnQ2xhc3NlcyA9IG51bGw7Ci0JCQkJCQlpZiAoYXJnQ291bnQ+MCkgewotCQkJCQkJCWFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJnQ291bnRdOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgewotCQkJCQkJCQlhcmdDbGFzc2VzW2ldID0gZ2V0QmVhblR5cGVWYWx1ZShhcmdzW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBOb3cgZ2V0IHRoZSBtZXRob2QgaXRzZWxmLgotCQkJCQkJTWV0aG9kIG0gPSBkZWNDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7Ci0JCQkJCQlSZW1vdGVFeHByZXNzaW9uUHJveHkgcmVwID0gbmV3IFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKTsKLQkJCQkJCXJlcC5zZXRQcm94eShtLCBNZXRob2QuY2xhc3MpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUuZ2V0Q2F1c2UoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGUgZGVmYXVsdCB0cmFjZSBkb2Vzbid0IHNob3cgd2hhdCBtZXRob2Qgd2FzIGJlaW5nIHNlYXJjaGVkIGZvciwgc28gcmVjcmVhdGUgd2l0aCB0aGF0LgotCQkJCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzLmFwcGVuZChkZWNDbGFzcy5nZXROYW1lKCkpOwotCQkJCQkJcy5hcHBlbmQoJy4nKTsKLQkJCQkJCXMuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQkJCQkJcy5hcHBlbmQoJygnKTsKLQkJCQkJCWlmIChhcmdDbGFzc2VzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCQkJcy5hcHBlbmQoJywnKTsKLQkJCQkJCQkJcy5hcHBlbmQoYXJnQ2xhc3Nlc1tpXS5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXMuYXBwZW5kKCcpJyk7Ci0JCQkJCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24gbmUgPSBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKHMudG9TdHJpbmcoKSk7Ci0JCQkJCQluZS5zZXRTdGFja1RyYWNlKGUuZ2V0U3RhY2tUcmFjZSgpKTsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KG5lLCBuZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9GSUVMRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBGaWxlZCBleHByZXNzaW9uIHByb3h5IGFuZCByZXNvbHZlIGl0LgotCQkJCQkvLyBDb21lcyBvdmVyIGFzOgotCQkJCQkvLyAgIGludCBmb3IgcHJveHkgaWQgZm9yIHRoZSBmaWVsZAotCQkJCQkvLyAgIGJlYW5UeXBlVmFsdWUgZm9yIGRlY2xhcmluZyBjbGFzcyAoZWl0aGVyIGJlYW50eXBlIG9yIGV4cHJlc3Npb24gcHJveHkpCi0JCQkJCS8vICAgc3RyaW5nIGZvciBmaWVsZCBuYW1lCi0JCQkJCXByb3h5aWQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWRlY0NsYXNzVmFsdWUgPSAgQ29tbWFuZHMucmVhZFZhbHVlKGluLCBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKSk7Ci0JCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZWNDbGFzcyA9IGdldEJlYW5UeXBlVmFsdWUoZGVjQ2xhc3NWYWx1ZSk7Ci0JCQkJCQkvLyBOb3cgZ2V0IHRoZSBmaWVsZCBpdHNlbGYuCi0JCQkJCQlGaWVsZCBmID0gZGVjQ2xhc3MuZ2V0RmllbGQoZmllbGROYW1lKTsKLQkJCQkJCVJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGYsIE1ldGhvZC5jbGFzcyk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZS5nZXRDYXVzZSgpLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZSwgZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9URVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGlmIHRlc3QgZXhwcmVzc2lvbiByZXF1ZXN0LiAKLQkJCQkJZXhwLnB1c2hJZkVsc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBpZi9lbHNlIGV4cHJlc3Npb24gY2xhdXNlIHJlcXVlc3QuIFRoZSBjbGF1c2UgdHlwZSAoaWUuIHRydWUvZmFsc2UpIGlzIHNlbnQgYXMgYSBieXRlCi0JCQkJCWV4cC5wdXNoSWZFbHNlKEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuZ2V0KGluLnJlYWRCeXRlKCkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTkVXX0lOU1RBTkNFX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBuZXcgaW5zdGFuY2UgZnJvbSBzdHJpbmcuCi0JCQkJCVN0cmluZyBpbml0U3RyaW5nID0gQ29tbWFuZHMucmVhZFN0cmluZ0RhdGEoaW4pOwotCQkJCQl3b3JrZXJWYWx1ZSA9ICBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoTmV3SW5zdGFuY2VGcm9tU3RyaW5nKGluaXRTdHJpbmcsIGNsYXNzVmFsdWUsIGNsYXNzTG9hZGVyKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTUFSS19WQUxVRToKLQkJCQkJLy8gRG8gYSBtYXJrLgotCQkJCQlpbnQgbWFya0lEID0gaW4ucmVhZEludCgpOwotCQkJCQlleHAucHVzaE1hcmsobWFya0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRU5ETUFSS19WQUxVRToKLQkJCQkJLy8gRG8gYW4gZW5kIG1hcmsuCi0JCQkJCW1hcmtJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJYm9vbGVhbiByZXN0b3JlID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJZXhwLnB1c2hFbmRtYXJrKG1hcmtJRCwgcmVzdG9yZSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlNVQkVYUFJFU1NJT05fQkVHSU5fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYmVnaW4gc3ViZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLiBUaGUgc3ViZXhwcmVzc2lvbiBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hTdWJleHByZXNzaW9uQmVnaW4oaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgZW5kIHN1YmV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4gVGhlIHN1YmV4cHJlc3Npb24gaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoU3ViZXhwcmVzc2lvbkVuZChpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJd29ya2VyVmFsdWUuc2V0KCk7CS8vIENsZWFyIGl0IG91dCBzbyBub3RoaW5nIGJlaW5nIGhlbGQgb250by4KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gZnJvbSB0aGUgZ2V0QmVhblR5cGUsIGZpZWxkLCBtZXRob2QgKHJlZmxlY3QgdHlwZSBzdHVmZikKLQkgKiB0aGF0IHdyYXBwZXJzIHRoZSByZWFsIHRocm93YWJsZSB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVmbGVjdGlvbi4gVGhpcyBpcwotCSAqIGJlY2F1c2UgcmVmbGVjdGlvbiBpcyBkb25lIG91dCBvZiBzZXF1ZW5jZSB3aXRoIHRoZSB1c2Ugb2YgdGhlIHJlZmxlY3QgdmFsdWUuIFNvIHdlIG5lZWQKLQkgKiB0byBzdG9yZSB0aGUgcmVmbGVjdGlvbiBleGNlcHRpb24gaW4gdGhpcyBleGNlcHRpb24gYW5kIHRoZW4gc3RvcmUgdGhpcyBleGNlcHRpb24gaW4KLQkgKiBhIHtAbGluayBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHl9LiBUaGlzIHdpbGwgdGhlbiBiZSBwaWNrZWQgdXAgd2hlbiB0cnlpbmcgdG8gYmUKLQkgKiB1c2VkIGFuZCBpdCB3aWxsIGdldCB0aGUgdHJ1ZSBleGNlcHRpb24gb3V0IG9mIHRoZSB7QGxpbmsgVGhyb3dhYmxlI2dldENhdXNlKCl9LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZhaWxlZFByb3h5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI4NzIzMjU2NzIxNjYzNDg5MjNMOwotCi0JCXB1YmxpYyBGYWlsZWRQcm94eUV4Y2VwdGlvbihUaHJvd2FibGUgcmVhbFRocm93YWJsZSkgewotCQkJc3VwZXIocmVhbFRocm93YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBiZWFudHlwZSAoY2xhc3MpIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIGJlYW50eXBlIHNlbnQgb3IKLQkgKiBhcyBhbiBleHByZXNzaW9uIHByb3h5IHRvIGEgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiBXcmFwcGVycyB0aGUgcmVhbCB0aHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGJlYW4gdHlwZSB0byBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEJlYW5UeXBlVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBiZWFudHlwZSA9IGNvbm5IYW5kbGVyLmdldEludm9rYWJsZU9iamVjdCh2YWx1ZSk7Ci0JCS8vIEl0IGlzIGVpdGhlciBhIHR5cGUgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBiZWFudHlwZSkuaW50VmFsdWUoKSwgZXhwdmFsdWUpOwotCQkJCWJlYW50eXBlID0gZXhwdmFsdWVbMF07IAotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNlZSBpZiB0aGVyZSBpcyBhIGZhaWxlZCBwcm94eS4KLQkJCQlpZiAoZS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IGZhaWx1cmUgPSAoRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KSBlLmdldFByb3h5KCk7Ci0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbigoVGhyb3dhYmxlKSBmYWlsdXJlLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgRmFpbGVkUHJveHlFeGNlcHRpb24obmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKSk7CS8vIFRoaXMgc2hvdWxkbid0IG9mIG9jY3VycmVkLgotCQkJfSAKLQkJfQotCQlyZXR1cm4gKENsYXNzKSBiZWFudHlwZTsKLQl9Ci0JCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIG1ldGhvZCBzZW50IG9yCi0JICogYXMgYW4gZXhwcmVzc2lvbiBwcm94eSB0byBhIG1ldGhvZCBleHByZXNzaW9uIHByb3h5LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gbWV0aG9kIGlmIGEgbWV0aG9kIG9yIHN0cmluZyBpZiBhIHN0cmluZyBvciBnZXQgdGhlIG1ldGhvZCBpZiBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIEB0aHJvd3MgRmFpbGVkUHJveHlFeGNlcHRpb24gV3JhcHBlcnMgdGhlIHJlYWwgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBtZXRob2QgdG8gbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtZXRob2QgPSBjb25uSGFuZGxlci5nZXRJbnZva2FibGVPYmplY3QodmFsdWUpOwotCQkvLyBJdCBpcyBlaXRoZXIgYSBtZXRob2QgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBtZXRob2QpLmludFZhbHVlKCksIGV4cHZhbHVlKTsKLQkJCQltZXRob2QgPSBleHB2YWx1ZVswXTsgCi0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2VlIGlmIHRoZXJlIGlzIGEgZmFpbGVkIHByb3h5LgotCQkJCWlmIChlLmdldFByb3h5KCkgIT0gbnVsbCkgewotCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUuZ2V0UHJveHkoKTsKLQkJCQkJdGhyb3cgbmV3IEZhaWxlZFByb3h5RXhjZXB0aW9uKChUaHJvd2FibGUpIGZhaWx1cmUuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbihuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCkpOwkvLyBUaGlzIHNob3VsZG4ndCBvZiBvY2N1cnJlZC4KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kOwotCX0JCi0KLQkvKioKLQkgKiBHZXQgdGhlIGZpZWxkIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIGZpZWxkIHNlbnQgb3IKLQkgKiBhcyBhbiBleHByZXNzaW9uIHByb3h5IHRvIGEgZmllbGQgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZpZWxkIGlmIGEgZmllbGQgb3Igc3RyaW5nIGlmIGEgc3RyaW5nIG9yIGdldCB0aGUgZmllbGQgaWYgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIFdyYXBwZXJzIHRoZSByZWFsIHRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZmllbGQgdG8gbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmllbGRWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIHsKLQkJT2JqZWN0IGZpZWxkID0gY29ubkhhbmRsZXIuZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlKTsKLQkJLy8gSXQgaXMgZWl0aGVyIGEgZmllbGQgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBmaWVsZCkuaW50VmFsdWUoKSwgZXhwdmFsdWUpOwotCQkJCWZpZWxkID0gZXhwdmFsdWVbMF07IAotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNlZSBpZiB0aGVyZSBpcyBhIGZhaWxlZCBwcm94eS4KLQkJCQlpZiAoZS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IGZhaWx1cmUgPSAoRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KSBlLmdldFByb3h5KCk7Ci0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbigoVGhyb3dhYmxlKSBmYWlsdXJlLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgRmFpbGVkUHJveHlFeGNlcHRpb24obmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKCkpOwkvLyBUaGlzIHNob3VsZG4ndCBvZiBvY2N1cnJlZC4KLQotCQkJfSAKLQkJfQotCQlyZXR1cm4gZmllbGQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBQdWxsIHRoZSBFeHByZXNzaW9uIFByb3h5IHZhbHVlIGludG8gdGhlIHJlc3VsdCBvYmplY3QuCi0JICogQHBhcmFtIHByb3h5SUQKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB2YWx1ZSBjb3VsZCBiZSByZXR1cm5lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBubyBleHByZXNzaW9uIHZhbHVlIGFzc2lnbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHB1bGxFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQgcHJveHlJRCwgT2JqZWN0W10gcmVzdWx0KSB7Ci0JCXRyeSB7Ci0JCQlleHAucHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5SUQsIHJlc3VsdCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVtb3RlRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgewotCi0JCQotCQlwcml2YXRlIGZpbmFsIGludCBwcm94eUlEOwotCQlwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQkJcHJpdmF0ZSBDbGFzcyB0eXBlOwotCQlwcml2YXRlIGJvb2xlYW4gc2V0OwotCQkKLQkJcHVibGljIFJlbW90ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlJRCkgewotCQkJdGhpcy5wcm94eUlEID0gcHJveHlJRDsKLQkJCQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRQcm94eUlEKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UHJveHlJRCgpIHsKLQkJCXJldHVybiBwcm94eUlEOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRUeXBlKCkKLQkJICovCi0JCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFZhbHVlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2lzU2V0KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIHNldDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjc2V0UHJveHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJc2V0ID0gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNGYWlsZWRFeHByZXNzaW9uKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgZm9yIHRoZSBqYXZhLmxhbmcucmVmbGVjdCB0aGluZ3MgKGNsYXNzLCBmaWVsZCwgbWV0aG9kKSB0byBpbmRpY2F0ZQotCSAqIHdoeSB0aGV5IGFyZW4ndCBmb3VuZC4KLQkgKiA8cD4KLQkgKiBUaGUgZXhjZXB0aW9uIHdpbGwgYmUgcGxhY2VkIGludG8gdmFsdWUsIEJVVCB0aGlzIHNob3VsZCBuZXZlciBiZSBzZW50Ci0JICogYmFjayB0byB0aGUgY2FsbGVyLiBJdCBpcyBpbnRlbmRlZCBvbmx5IGFzIGEgcGxhY2UtaG9sZGVyIGZvciBzdWJzZXF1ZW50Ci0JICogdXNhZ2UuIFVzZSB0aGUge0BsaW5rIFJlbW90ZUV4cHJlc3Npb25Qcm94eSNpc0ZhaWxlZEV4cHJlc3Npb24oKX0gbWV0aG9kCi0JICogdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgZmFpbGVkIG9uZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgYmVjYXVzZSB0aGUgcmVmbGVjdCBjYWxscyBhcmUgZG9uZSBvdXQgb2Ygc2VxdWVuY2UgZnJvbSB3aGVyZQotCSAqIHRoZXkgYXJlIHVzZWQgYW5kIHNvIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgdGhlIGVycm9yIGlzIHJlcG9ydGVkIGluIHRoZQotCSAqIHdyb25nIHBsYWNlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIFJlbW90ZUV4cHJlc3Npb25Qcm94eSB7Ci0KLQkJcHVibGljIEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlJRCkgewotCQkJc3VwZXIocHJveHlJRCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzRmFpbGVkRXhwcmVzc2lvbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1NldCgpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzZXQuIEl0IGlzIGhvbGRlciBvZiBpbmZvIG9ubHkuCi0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogUHVsbCB0aGUgdmFsdWUuIAotCSAqIAotCSAqIEByZXR1cm4gclswXSBpcyB0aGUgdmFsdWUsIHJbMV0gaXMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gcHVsbFZhbHVlKCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsyXTsKLQkJZXhwLnB1bGxWYWx1ZShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCQkKLQkvKioKLQkgKiBDbG9zZSBvdXQgdGhpbmdzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlleHAuY2xvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0aHJvd2FibGUgZXJyb3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3JUaHJvd2FibGUoKSB7Ci0JCXJldHVybiBleHAuZ2V0RXJyb3JUaHJvd2FibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgd2VyZSBubyBlcnJvcnMgb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBub0Vycm9ycygpIHsKLQkJcmV0dXJuIGV4cC5ub0Vycm9ycygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIG5vIGV4cHJlc3Npb24gdmFsdWUgZXhjZXB0aW9uIG9yIG5vdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb0V4cHJlc3Npb25WYWx1ZSgpIHsKLQkJcmV0dXJuIGV4cC5pc05vRXhwcmVzc2lvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0lkZW50aXR5TWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0lkZW50aXR5TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzhkOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9JZGVudGl0eU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEEgSGFzaE1hcCB3aGVyZSB0aGUga2V5IGlzCi0gKiBkb25lIGFzIGFuIGlkZW50aXR5IChpLmUuIGZvdW5kIGJ5ICc9PScgbm90IGVxdWFscygpKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlNYXAgZXh0ZW5kcyBIYXNoTWFwewotCQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4MTcyNzQ4MzMyMjEzODM2ODNMOwotCi0JLyoqCi0JICogS2V5IHRoYXQgcmV0dXJucyB0cnVlIG9uIGVxdWFscygpIG9ubHkKLQkgKiBpZiB0aGUgaXRlbSBpdCBpcyB3cmFwcGVyaW5nIGlzICc9PScKLQkgKiBub3QgZXF1YWxzKCkKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSWRlbnRpdHlLZXkgewotCQkKLQkJcHVibGljIHN0YXRpYyBJZGVudGl0eUtleSBjcmVhdGVLZXkoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiAhPSBudWxsID8gbmV3IElkZW50aXR5S2V5KG9iaikgOiBudWxsOwotCQl9Ci0JCQotCQlmaW5hbCBPYmplY3QgbzsKLQkJCi0JCXB1YmxpYyBJZGVudGl0eUtleShPYmplY3Qgb2JqKSB7Ci0JCQlvID0gb2JqOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElkZW50aXR5S2V5KSkgcmV0dXJuIGZhbHNlOwotCQkJaWYgKHRoaXMubyA9PSAoKChJZGVudGl0eUtleSkgb2JqKS5vKSkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gby5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJZGVudGl0eU1hcCgpIHsKLQl9Ci0JCi0JcHVibGljIElkZW50aXR5TWFwKGludCBjYXBhY2l0eSkgewotCQlzdXBlcihjYXBhY2l0eSk7Ci0JfQotCQotCXB1YmxpYyBJZGVudGl0eU1hcChpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLQkJc3VwZXIoY2FwYWNpdHksIGxvYWRGYWN0b3IpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBzdXBlci5jb250YWluc0tleShJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHN1cGVyLmdldChJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gc3VwZXIucHV0KElkZW50aXR5S2V5LmNyZWF0ZUtleShrZXkpLCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHN1cGVyLnJlbW92ZShJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSk7Ci0JfQotCQotCS8qKgotCSAqIE5PVEU6IERpZG4ndCBib3RoZXIgaW1wbGVtZW50aW5nIGVudHJ5U2V0KCkuIElmIHRoYXQgYmVjb21lcwotCSAqIG5lZWRlZCwgdGhlbiBpdCB3aWxsIGJlIGltcGxlbWVudGVkLgotCSAqLwotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXRocm93ICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMwYjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiB0byBydW4gdG8ga2ljayBvZmYgdGhlIHJlbW90ZSBWTSBzZXJ2ZXIgc2lkZS4KLSAqCi0gKgotICogQWxsIHRoaXMgZG9lcyBpcyBzdGFydCB0aGUgU2VydmVyIFRocmVhZCBhbmQgd2FpdHMgZm9yIGl0IHRvIGZpbmlzaC4KLSAqIFRoaXMgYWxsb3dzIG90aGVyIG1haW5zIHRvIGhhdmUgYSBzZXJ2ZXIgdGhyZWFkLCBhbmQgc29tZSBvdGhlcgotICogdGhyZWFkcyBpZiB0aGV5IHdpc2hlZC4gVGhleSBjb3VsZCBzdGFydCB0aGUgc2VydmVyIHRocmVhZCB0b28KLSAqIGFuZCBzb21lIG90aGVyIHRocmVhZCwgYW5kIHRoZW4gd2FpdCBmb3IgYm90aCB0byBmaW5pc2guCi0gKi8KLQotcHVibGljIGNsYXNzIFJlbW90ZVZNQXBwbGljYXRpb24gewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZyBzZXJ2ZXJOYW1lID0gIlNlcnZlciBUaHJlYWQiOyAvLyROT04tTkxTLTEkCi0JaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgicHJveHl2bS5zZXJ2ZXJuYW1lIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJOYW1lID0gc2VydmVyTmFtZSArICItIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgicHJveHl2bS5zZXJ2ZXJuYW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCVRocmVhZCB0ID0gbmV3IFJlbW90ZVZNU2VydmVyVGhyZWFkKHNlcnZlck5hbWUpOwotCXQuc3RhcnQoKTsKLQl0cnkgewotCQl0LmpvaW4oKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQlTeXN0ZW0uZXhpdCgwKTsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMmViNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNU2VydmVyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogUmVtb3RlVk0gU2VydmVyIFRocmVhZC4gVGhpcyB0aHJlYWQgaXMgdGhlIG9uZQotICogdGhhdCB3YWl0cyBmb3IgY29ubmVjdGlvbnMgYW5kIHNwaW5zIG9mZiAKLSAqIHNlcnZlciBjb25uZWN0aW9uIHRocmVhZHMuIEl0IG1hbmFnZXMgdGhlCi0gKiBjb25uZWN0aW9uIHRocmVhZHMgYW5kIGhhbmRsZXMgc2h1dHRpbmcgdGhlbQotICogZG93bi4KLSAqCi0gKiBTeXN0ZW0gUHJvcGVydGllczoKLSAqICAgcHJveHl2bS5wb3J0IC0gUG9ydCBudW1iZXIgdG8gdXNlIGZvciB0aGUgU2VydmVyU29ja2V0IChkZWZhdWx0IGlzIDg4ODgpCi0gKiAgIHByb3h5dm0uYnVmc2l6ZSAtIEJ1ZmZlciBzaXplIHRvIHVzZSBmb3IgVENQL0lQIGJ1ZmZlcnMgKGRlZmF1bHQgaXMgc3lzdGVtIGRlZmF1bHQpCi0gKi8KLQotcHVibGljIGNsYXNzIFJlbW90ZVZNU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIGltcGxlbWVudHMgSVZNU2VydmVyLCBJVk1DYWxsYmFja1NlcnZlciB7Ci0JcHJvdGVjdGVkIExpc3QgdGhyZWFkcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IExpbmtlZExpc3QoKSk7CS8vIExpc3Qgb2YgYWN0aXZlIHRocmVhZHMuCi0JcHJvdGVjdGVkIFNlcnZlclNvY2tldCBzZXJ2ZXI7CS8vIFNlcnZlciBTb2NrZXQgZm9yIHRoaXMgYXBwbGljYXRpb24KLQlwcml2YXRlIGludCBoaWdoZXN0SWRlbnRpdHlJRCA9IDA7CS8vIElkZW50aXR5IGNvZGVzIHRvIGlkZW50aWZ5IG9iamVjdHMgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudC4KLQlwcml2YXRlIE1hcCBvYmplY3RUb0lETWFwOwotCXByaXZhdGUgSGFzaE1hcCBpZFRvT2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoMTAwKTsJLy8gTWFwIGZyb20gaWRlbnRpdHkgaWQgdG8gb2JqZWN0Ci0JCi0JcHJvdGVjdGVkIFN0YWNrIGZDYWxsYmFja0hhbmRsZXJQb29sID0gbmV3IFN0YWNrKCk7CS8vIFN0YWNrIG9mIGZyZWUgY2FsbGJhY2sgaGFuZGxlcnMKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBOVU1CRVJfRlJFRV9DQUxMQkFDS1MgPSA1OwkvLyBOdW1iZXIgb2YgZnJlZSBjYWxsYmFjayBoYW5kbGVycyB0byBrZWVwIG9wZW4uCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgSURfTk9UX0ZPVU5EID0gQ29tbWFuZHMuTk9UX0FOX0lEOwkvLyBUaGUgaWQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUuCi0JCi0JcHJvdGVjdGVkIGludCBtYXN0ZXJJREVTb2NrZXRQb3J0ID0gLTE7CS8vIFBvcnQgb2YgbWFzdGVyIHNlcnZlciBzb2NrZXQgb24gSURFLiBVc2VkIGZvciBzcGVjaWFsIGdsb2JhbCByZXF1ZXN0cy4KLQlwcm90ZWN0ZWQgaW50IHJlZ2lzdHJ5S2V5ID0gLTE7CS8vIEtleSBvZiByZWdpc3RyeSBvbiB0aGUgSURFLgotCQotCS8vIEtsdWRnZTogQnVnIGluIExpbnV4IDEuMy54eHggb2YgSlZNLiBDbG9zaW5nIGEgc29ja2V0IHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgcmVhZC9hY2NlcHQgd2lsbCBub3QgaW50ZXJydXB0IHRoZQotCS8vIHdhaXQuIE5lZWQgdG8gdGltZW91dCB0byB0aGUgc29ja2V0IHJlYWQvYWNjZXB0IGJlZm9yZSB0aGUgc29ja2V0IGNsb3NlIHdpbGwgYmUgbm90aWNlZC4gVGhpcyBoYXMgYmVlbiBmaXhlZAotCS8vIGluIExpbnV4IDEuNC4gU28gb24gTGludXggMS4zIG5lZWQgdG8gcHV0IHRpbWVvdXRzIGluIG9uIHRob3NlIHNvY2tldHMgdGhhdCBjYW4gYmUgc2VwYXJhdGVseSBjbG9zZWQgd2hpbGUgcmVhZGluZy9hY2NlcHRpbmcuCi0Jc3RhdGljIGJvb2xlYW4gTElOVVhfMV8zID0gImxpbnV4Ii5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsIiIpLnN0YXJ0c1dpdGgoIjEuMyIpOwkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCi0JLy8gSWYgdmVyc2lvbiAxLjMueCwgd2UgbmVlZCB0byB1c2Ugb3VyIElkZW50aWR5TWFwLCBpZiAxLjQgb3IgZ3JlYXRlciB0aGVuIHdlIGNhbiB1c2UgSmF2YSdzIElkZW50aWR5SGFzaE1hcCwgd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBvdXJzLgotCXN0YXRpYyBDb25zdHJ1Y3RvciBJREVOVElEWU1BUF9DTEFTU19DVE9SOwotCXN0YXRpYyB7Ci0JCUNsYXNzIGlkQ2xhc3M7Ci0JCXRyeSB7Ci0JCQlpZENsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJaWRDbGFzcyA9IElkZW50aXR5TWFwLmNsYXNzOwotCQl9Ci0JCXRyeSB7Ci0JCQlJREVOVElEWU1BUF9DTEFTU19DVE9SID0gaWRDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBSZW1vdGVWTVNlcnZlclRocmVhZChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJdHJ5IHsKLQkJCW9iamVjdFRvSURNYXAgPSAoTWFwKSBJREVOVElEWU1BUF9DTEFTU19DVE9SLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoMTAwKX0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvLyBUaGUgcHVycG9zZSBvZiB0aGlzIHRocmVhZCBpcyB0byB3YWl0IDUgbWludXRlcywgdGhlbiBzZWUgaWYgdGhlIElERSBpcyBzdGlsbAotCS8vIHVwLiBJZiBpdCBpc24ndCBpdCB3aWxsIGdvIGRvd24uIFRoaXMgaXMgc2FmZXR5IG1lY2hhbmlzbQotCS8vIGluIGNhc2UgdGhlIGNsaWVudCB3ZW50IGRvd24gd2l0aG91dCBjbGVhbmluZyB1cCBhbmQgdGVsbGluZyB0aGUgc2VydmVyIHRvIGdvIGRvd24uCi0JLy8gVGhhdCB3YXkgaXQgd29uJ3QgaGFuZyBhcm91bmQgZm9yZXZlci4KLQlwcml2YXRlIGJvb2xlYW4gZ29pbmdEb3duID0gZmFsc2U7Ci0JcHJpdmF0ZSBUaHJlYWQgc2FmZUNsZWFuID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICghZ29pbmdEb3duKSB7Ci0JCQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKQotCQkJCQljb250aW51ZTsJLy8gR2V0IHRvIGNsZWFuIHVuaW50ZXJydXB0ZWQgc3RhdGUuCi0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDUgKiA2MCAqIDEwMDApOwkvLyBTbGVlcCBmaXZlIG1pbnV0ZXMKLQkJCQkJLy8gVGVzdCBpZiBJREUgc3RpbGwgdXAuCi0JCQkJCWlmICghaXNBbGl2ZSgpKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHJlZ2lzdHJ5IGF2YWlsYWJsZSB0byBjb25uZWN0IHdpdGggYWZ0ZXIgZml2ZSBtaW51dGVzLiBTaHV0dGluZyBkb3duLiIpOwkvLyROT04tTkxTLTEkCi0JCQkJCQlyZXF1ZXN0U2h1dGRvd24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFNlZSBpZiBzdGlsbCBhbGl2ZQotCQkgKi8JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLQkJCVNvY2tldCBzb2NrZXQgPSBnZXRTb2NrZXQoKTsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5BTElWRSk7Ci0JCQkJCQlvdXQud3JpdGVJbnQocmVnaXN0cnlLZXkpOwotCQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCQlyZXR1cm4gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJCS8vIE5vdyBnZXQgdGhlIHJlc3VsdC4KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkvLyBUaGV5IHNob3VsZCBiZSBjbG9zaW5nLiBJZiB0aGV5IGFyZW4ndCwgdGhlbiB0aGV5IGFjY3VtdWxhdGUgYW5kIG1hc3RlciBzZXJ2ZXIgd2lsbCBzdGFydCByZWplY3RpbmcgbmV3IG9uZXMuCi0JCQkJCX0KLQkJCQl9CQkJCQkKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQotCQkKLQl9LCAiVGltZW91dCBUZXJtaW5hdGlvbiBUaHJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCS8vIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgdGFibGUgd2l0aCBjZXJ0YWluIHByZS1kZWZpbmVkIGlkcy4KLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCW9iamVjdFRvSURNYXAucHV0KFZvaWQuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuVk9JRF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5WT0lEX1RZUEUpLCBWb2lkLlRZUEUpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChCb29sZWFuLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQk9PTEVBTl9UWVBFKSwgQm9vbGVhbi5UWVBFKTsKLQkJCW9iamVjdFRvSURNYXAucHV0KEJvb2xlYW4uY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fQ0xBU1MpLCBCb29sZWFuLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoSW50ZWdlci5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOVEVHRVJfVFlQRSksIEludGVnZXIuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChJbnRlZ2VyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX0NMQVNTKSwgSW50ZWdlci5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KEJ5dGUuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5CWVRFX1RZUEUpLCBCeXRlLlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoQnl0ZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9DTEFTUyksIEJ5dGUuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChTaG9ydC5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSwgU2hvcnQuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChTaG9ydC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLlNIT1JUX0NMQVNTKSwgU2hvcnQuY2xhc3MpOwkKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoTG9uZy5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkxPTkdfVFlQRSksIExvbmcuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChMb25nLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSwgTG9uZy5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KENoYXJhY3Rlci5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEUpLCBDaGFyYWN0ZXIuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChDaGFyYWN0ZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0hBUkFDVEVSX0NMQVNTKSwgQ2hhcmFjdGVyLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoRG91YmxlLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfVFlQRSksIERvdWJsZS5UWVBFKTsKLQkJCW9iamVjdFRvSURNYXAucHV0KERvdWJsZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRE9VQkxFX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfQ0xBU1MpLCBEb3VibGUuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChGbG9hdC5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9UWVBFKSwgRmxvYXQuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChGbG9hdC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZMT0FUX0NMQVNTKSwgRmxvYXQuY2xhc3MpOwkJCQkJCQkJCQkJCQkJCi0JCQkJCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KFN0cmluZy5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuU1RSSU5HX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5TVFJJTkdfQ0xBU1MpLCBTdHJpbmcuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0RFQ0lNQUxfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTKSwgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKSwgamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChOdW1iZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk5VTUJFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuTlVNQkVSX0NMQVNTKSwgTnVtYmVyLmNsYXNzKTsJCQkJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KFRocm93YWJsZS5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuVEhST1dBQkxFX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5USFJPV0FCTEVfQ0xBU1MpLCBUaHJvd2FibGUuY2xhc3MpOwkKLQkJCQotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChPYmplY3QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk9CSkVDVF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuT0JKRUNUX0NMQVNTKSwgT2JqZWN0LmNsYXNzKTsJCi0JCQkJCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KENsYXNzLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DTEFTU19DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpLCBDbGFzcy5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LmNsYXNzKTsJCQkJCQkJCQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLk1FVEhPRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuTUVUSE9EX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNPTlNUUlVDVE9SX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5DT05TVFJVQ1RPUl9DTEFTUyksIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmNsYXNzKTsJCQkJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5GSUVMRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRklFTERfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChJVk1TZXJ2ZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklWTVNFUlZFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSVZNU0VSVkVSX0NMQVNTKSwgSVZNU2VydmVyLmNsYXNzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KElDYWxsYmFjay5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuSUNBTExCQUNLX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5JQ0FMTEJBQ0tfQ0xBU1MpLCBJQ2FsbGJhY2suY2xhc3MpOwkKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQodGhpcywgbmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFU0VSVkVSX0lEKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVTRVJWRVJfSUQpLCB0aGlzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KFJlbW90ZVZNU2VydmVyVGhyZWFkLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVWTVNFUlZFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFVk1TRVJWRVJfQ0xBU1MpLCBSZW1vdGVWTVNlcnZlclRocmVhZC5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChUaHJlYWQuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlRIUkVBRF9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuVEhSRUFEX0NMQVNTKSwgVGhyZWFkLmNsYXNzKTsJCi0KLQkJCW9iamVjdFRvSURNYXAucHV0KEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5FWFBSRVNTSU9OUFJPQ0VTU0VSQ09OVFJPTExFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRVhQUkVTU0lPTlBST0NFU1NFUkNPTlRST0xMRVJfQ0xBU1MpLCBFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlci5jbGFzcyk7CQotCi0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBnZXRNZXRob2QgPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImdldE1ldGhvZCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3MsIChuZXcgQ2xhc3NbMF0pLmdldENsYXNzKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCW9iamVjdFRvSURNYXAucHV0KGdldE1ldGhvZCwgbmV3IEludGVnZXIoQ29tbWFuZHMuR0VUX01FVEhPRF9JRCkpOwotCQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkdFVF9NRVRIT0RfSUQpLCBnZXRNZXRob2QpOwkKLQkJCQkKLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgaW5pdE1ldGhvZCA9IElDYWxsYmFjay5jbGFzcy5nZXRNZXRob2QoImluaXRpYWxpemVDYWxsYmFjayIsIG5ldyBDbGFzc1tdIHtJVk1DYWxsYmFja1NlcnZlci5jbGFzcywgSW50ZWdlci5UWVBFfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvYmplY3RUb0lETWFwLnB1dChpbml0TWV0aG9kLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JTklUSUFMSVpFQ0FMTEJBQ0tfTUVUSE9EX0lEKSk7Ci0JCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSU5JVElBTElaRUNBTExCQUNLX01FVEhPRF9JRCksIGluaXRNZXRob2QpOwkKLQkJCQkKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2hvdWxkbid0IHJlYWxseSBldmVyIG9jY3VyLgotCQkJfQkJCQkKLQotCQkJaGlnaGVzdElkZW50aXR5SUQgPSBDb21tYW5kcy5GSVJTVF9GUkVFX0lEOwkJCi0JCX0KLQotCQltYXN0ZXJJREVTb2NrZXRQb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLm1hc3RlclBvcnQiLCAtMSkuaW50VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFzdGVySURFU29ja2V0UG9ydCA9PSAtMSkgewotCQkJLy8gTm8gcG9ydHMgc3BlY2lmaWVkLCBuZWVkIHRvIGp1c3Qgc2h1dGRvd24uCi0JCQlzaHV0ZG93bigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlyZWdpc3RyeUtleSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5yZWdpc3RyeUtleSIsIC0xKS5pbnRWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZWdpc3RyeUtleSA9PSAtMSkgewotCQkJLy8gTm8gcmVnaXN0cnkgc3BlY2lmaWVkLCBuZWVkIHRvIGp1c3Qgc2h1dGRvd24uCi0JCQlzaHV0ZG93bigpOwotCQkJcmV0dXJuOwotCQl9CQkKLQkJCi0JCXNhZmVDbGVhbi5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJc2FmZUNsZWFuLnN0YXJ0KCk7CQotCQlib29sZWFuIHRyeWluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIgPSBuZXcgU2VydmVyU29ja2V0KDAsIDUwICwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeWluZyA9IGZhbHNlOwotCQkJaWYgKExJTlVYXzFfMykKLQkJCQlzZXJ2ZXIuc2V0U29UaW1lb3V0KDEwMDApOwkvLyBMaW51eCAxLjMgYnVnLCBzZWUgY29tbWVudCBvbiBMSU5VWF8xXzMKLQkJCWlmIChyZWdpc3RlclNlcnZlcihzZXJ2ZXIuZ2V0TG9jYWxQb3J0KCkpKSB7Ci0JCQkJd2hpbGUoc2VydmVyICE9IG51bGwpIHsKLQkJCQkJU29ja2V0IGluY29taW5nID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluY29taW5nID0gc2VydmVyLmFjY2VwdCgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbnRpbnVlOwkvLyBUaW1lb3V0LCB0cnkgYWdhaW4KLQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQkJY29udGludWU7CS8vIFNlcnZlciBjb3VsZCBvZiBnb25lIG51bGwgYWZ0ZXIgdGVzdCBpbiB3aGlsZSwgbWVhbnMgc2h1dHRpbmcgZG93bi4gVGhpcyBwcm9iYWJseSB3b3VsZCBvbmx5IGhhcHBlbiBMaW51eCAxLjMuCi0JCQkJCX0KLQkJCQkJVGhyZWFkIHN0ID0gbmV3IENvbm5lY3Rpb25UaHJlYWQoaW5jb21pbmcsIHRoaXMsICJDb25uZWN0aW9uIFRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRocmVhZHMuYWRkKHN0KTsKLQkJCQkJc2FmZUNsZWFuLmludGVycnVwdCgpOwkvLyBMZXQgc2FmZUNsZWFuIGtub3cgdGhlcmUgaXMgYSBjaGFuZ2UKLQkJCQkJc3Quc3RhcnQoKTsKLQkJCQkJLy8gTnVsbCBvdXQgbG9jYWxzIHNvIHRoZXkgY2FuIGJlIEdDJ2Qgc2luY2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBsb29wLgotCQkJCQlzdCA9IG51bGw7Ci0JCQkJCWluY29taW5nID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodHJ5aW5nIHx8IHNlcnZlciAhPSBudWxsKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CS8vIEV4Y2VwdGlvbiBhbmQgbm90IHNodXRkb3duIHJlcXVlc3QsIHNvIHByaW50IHN0YWNrIHRyYWNlLgotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJLy8gV2UndmUgaGFkIGFuIGV4Y2VwdGlvbiwgZWl0aGVyIHNvbWV0aGluZyByZWFsbHkgYmFkLCBvciB3ZSB3ZXJlIGNsb3NlZCwKLQkJLy8gc28gZ28gdGhyb3VnaCBzaHV0ZG93bnMuCi0JCXNodXRkb3duKCk7CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGFuIGlkZW50aXR5SUQsIHJldHVybiAtMSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIGludCBnZXRJZGVudGl0eUlEKE9iamVjdCBhbk9iamVjdCkgewotCQlzeW5jaHJvbml6ZWQob2JqZWN0VG9JRE1hcCkgewotCQkJSW50ZWdlciBpZCA9IChJbnRlZ2VyKSBvYmplY3RUb0lETWFwLmdldChhbk9iamVjdCk7Ci0JCQlyZXR1cm4gaWQgIT0gbnVsbCA/IGlkLmludFZhbHVlKCkgOiBJRF9OT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGFuIGlkZW50aXR5SUQgYW5kIGFkZCBpdCBpZiBub3QgZm91bmQuIFBsYWNlIHRoZSBpZCBpbiB0aGUKLQkgKiBWYWx1ZU9iamVjdCBwYXNzZWQgaW4gYW5kIHJldHVybiB3aGV0aGVyIGl0IHdhcyBhZGRlZCAodHJ1ZSkgb3Igd2FzIGFscmVhZHkgaW4gdGFibGUgKGZhbHNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldElkZW50aXR5SUQoT2JqZWN0IGFuT2JqZWN0LCBDb21tYW5kcy5WYWx1ZU9iamVjdCBpbnRvVmFsdWUgKSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgb2JqZWN0VG9JRE1hcC5nZXQoYW5PYmplY3QpOwotCQkJaWYgKGlkID09IG51bGwpIHsKLQkJCQlkbyB7Ci0JCQkJCWlmICgrK2hpZ2hlc3RJZGVudGl0eUlEID09IENvbW1hbmRzLk5PVF9BTl9JRCkKLQkJCQkJCSsraGlnaGVzdElkZW50aXR5SUQ7CS8vIERvbid0IGxldCAtMSBiZSBhIHZhbGlkIGlkLgotCQkJCQlpZCA9IG5ldyBJbnRlZ2VyKGhpZ2hlc3RJZGVudGl0eUlEKTsKLQkJCQl9IHdoaWxlIChpZFRvT2JqZWN0TWFwLmNvbnRhaW5zS2V5KGlkKSk7IC8vIE1ha2Ugc3VyZSBub3QgaW4gdXNlLCByZWFsbHkgc2hvdWxkbid0IGV2ZXIgaGFwcGVuIGJlY2F1c2Ugd2UgaGF2ZSBvdmVyIDQgYmlsbGlvbiBiZWZvcmUgaXQgd3JhcHMgYmFjawotCQkJCW9iamVjdFRvSURNYXAucHV0KGFuT2JqZWN0LCBpZCk7Ci0JCQkJaWRUb09iamVjdE1hcC5wdXQoaWQsIGFuT2JqZWN0KTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9IAotCQkJaW50b1ZhbHVlLnNldE9iamVjdElEKGlkLmludFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFuIGlkZW50aXR5IG9iamVjdCBmcm9tIHRoZSBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdChPYmplY3QgYW5PYmplY3QpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgb2JqZWN0VG9JRE1hcC5yZW1vdmUoYW5PYmplY3QpOwotCQkJaWRUb09iamVjdE1hcC5yZW1vdmUoaWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbiBpZGVudGl0eSBvYmplY3QgZnJvbSB0aGUgbWFwcGluZywgZ2l2ZW4gdGhlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdChpbnQgaWQpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCU9iamVjdCBvID0gaWRUb09iamVjdE1hcC5yZW1vdmUobmV3IEludGVnZXIoaWQpKTsKLQkJCW9iamVjdFRvSURNYXAucmVtb3ZlKG8pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGZvciBhbiBpZGVudGl0eSBpZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KGludCBpZCkgewotCQlzeW5jaHJvbml6ZWQob2JqZWN0VG9JRE1hcCkgewotCQkJcmV0dXJuIGlkVG9PYmplY3RNYXAuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCX0KLQl9IAotCQotCS8qKgotCSAqIFJlbW92ZSBhIHRocmVhZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25UaHJlYWQoVGhyZWFkIHRocmVhZCkgewotCQl0aHJlYWRzLnJlbW92ZSh0aHJlYWQpOwotCQlzYWZlQ2xlYW4uaW50ZXJydXB0KCk7CS8vIExldCBzYWZlIGNsZWFuIGtub3cgdGhlcmUgaXMgYSBjaGFuZ2UuCi0JfQotCQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzaHV0ZG93bi4gSWYgdGhlIHNlcnZlciBoYXNuJ3QgZXZlbiBiZWVuCi0JICogY3JlYXRlZCB5ZXQsIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWVzdFNodXRkb3duKCkgewkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gQ2xvc2luZyB0aGUgc2VydmVyIHNvY2tldCBzaG91bGQgY2F1c2UgYSBicmVhay4KLQkJdHJ5IHsKLQkJCVNlcnZlclNvY2tldCBzcnYgPSBzZXJ2ZXI7Ci0JCQlzZXJ2ZXIgPSBudWxsOwkvLyBTbyB0aGF0IHNlcnZlciBrbm93cyBpdCBpcyBiZWluZyBzaHV0ZG93biBhbmQgbm90IHByaW50IGV4Y2VwdGlvbiBtc2cuCi0JCQlzcnYuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVxdWVzdCBhIGNhbGxiYWNrIHN0cmVhbSB0byB3cml0ZSB0by4KLQkgKiBXaGVuIGRvbmUsIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGNsb3NlZCB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gcmVxdWVzdFN0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSAgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlDYWxsYmFja0hhbmRsZXIgaCA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJaWYgKGggPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb21tYW5kRXhjZXB0aW9uKCJObyBjYWxsYmFjayBoYW5kbGVyIHJldHJpZXZlZC4iLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQloLmluaXRpYXRlQ2FsbGJhY2tTdHJlYW0oY2FsbGJhY2tJRCwgbXNnSUQpOwotCQlyZXR1cm4gbmV3IENhbGxiYWNrT3V0cHV0U3RyZWFtKGgsIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bigpIHsKLQkJZ29pbmdEb3duID0gdHJ1ZTsKLQkJc2FmZUNsZWFuLmludGVycnVwdCgpOwkvLyBMZXQgc2FmZUNsZWFuIGtub3cgdG8gY29tZSBkb3duLgotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXIuY2xvc2UoKTsJLy8gQ2xvc2UgaXQgc28gdGhhdCBubyBtb3JlIHJlcXVlc3RzIGNhbiBiZSBtYWRlLgotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCi0JCS8vIEdvIHRocm91Z2ggZWFjaCB0aHJlYWQgYW5kIGFzayBpdCB0byBjbG9zZS4gTWFrZSBhIGNvcHkgb2YgdGhlIGxpc3Qgc28gdGhhdCB3ZQotCQkvLyB3b24ndCBnZXQgaW50byBkZWFkbG9ja3MuCi0JCUNvbm5lY3Rpb25UaHJlYWRbXSB0aHJlYWRzQXJyYXkgPSAoQ29ubmVjdGlvblRocmVhZFtdKSB0aHJlYWRzLnRvQXJyYXkobmV3IENvbm5lY3Rpb25UaHJlYWRbMF0pOwotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBUaGlzIGlzIGEgaGFyc2ggd2F5IHRvIHNodXQgYSBjb25uZWN0aW9uIGRvd24sIGJ1dCB0aGVyZSdzIG5vCi0JCQkvLyBvdGhlciB3YXkgSSBrbm93IG9mIHRvIGludGVycnVwdCB0aGUgcmVhZCBvbiBhIHNvY2tldC4KLQkJCXRocmVhZHNBcnJheVtpXS5jbG9zZSgpOwotCQl9Ci0JCQkKLQkJLy8gTm93IHRoYXQgdGhleSd2ZSBiZWVuIHRvbGQgdG8gY2xvc2UsIHdhaXQgb24gZWFjaCBvbmUgdG8gZmluaXNoLgotCQlmb3IgKGludCBpPTA7IGk8dGhyZWFkc0FycmF5Lmxlbmd0aDsgaSsrKQotCQkJdHJ5IHsKLQkJCQl0aHJlYWRzQXJyYXlbaV0uam9pbigxMDAwMCk7CS8vIFdhaXQgdGVuIHNlY29uZHMsIGlmIGxvbmdlciwganVzdCBnbyBvbiB0byBuZXh0IG9uZS4KLQkJCQlpZiAodGhyZWFkc0FycmF5W2ldLmlzQWxpdmUoKSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogQ29ubmVjdGlvbiAiK2krIiBkaWQgbm90IGRpZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCi0JCWlmIChzYWZlQ2xlYW4uaXNBbGl2ZSgpKSB7Ci0JCQl0cnkgewkKLQkJCQlzYWZlQ2xlYW4uam9pbigxMDAwMCk7Ci0JCQkJaWYgKHNhZmVDbGVhbi5pc0FsaXZlKCkpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIENsZWFudXAgdGhyZWFkIGRpZCBub3QgZGllLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE5vdyBjbG9zZSB0aGUgY2FsbGJhY2tzLgotCQlzeW5jaHJvbml6ZWQoZkNhbGxiYWNrSGFuZGxlclBvb2wpIHsKLQkJCS8vIE5vdyB3ZSB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBmcmVlIGhhbmRsZXJzIGFuZCBjbG9zZSB0aGVtIHByb3Blcmx5LgotCQkJSXRlcmF0b3IgaXRyID0gZkNhbGxiYWNrSGFuZGxlclBvb2wuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJKChDYWxsYmFja0hhbmRsZXIpIGl0ci5uZXh0KCkpLmNsb3NlSGFuZGxlcigpOwotCQkJfQotCQkJCi0JCQlmQ2FsbGJhY2tIYW5kbGVyUG9vbC5jbGVhcigpOwotCQl9CQotCQkKLQkJTGlzdCBydW5uYWJsZXMgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXJ1bm5hYmxlcyA9IHNodXRkb3duUnVubmFibGVzOwotCQkJc2h1dGRvd25SdW5uYWJsZXMgPSBudWxsOwotCQl9Ci0JCWlmIChydW5uYWJsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdHIgPSBydW5uYWJsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQl0cnkgewotCQkJCQkoKFJ1bm5hYmxlKSBpdHIubmV4dCgpKS5ydW4oKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZnJlZSBjYWxsYmFjayBoYW5kbGVyCi0JICovCi0JcHVibGljIElDYWxsYmFja0hhbmRsZXIgZ2V0RnJlZUNhbGxiYWNrSGFuZGxlcigpIHsKLQkJc3luY2hyb25pemVkKGZDYWxsYmFja0hhbmRsZXJQb29sKSB7Ci0JCQlpZiAoIWZDYWxsYmFja0hhbmRsZXJQb29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gKElDYWxsYmFja0hhbmRsZXIpIGZDYWxsYmFja0hhbmRsZXJQb29sLnBvcCgpOwotCQkJLy8gZWxzZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9uZS4JCQkKLQkJCXJldHVybiBjcmVhdGVDYWxsYmFja0hhbmRsZXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYWtlIGEgbmV3IGNhbGxiYWNrIGhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUNhbGxiYWNrSGFuZGxlciBjcmVhdGVDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCVNvY2tldCBjYWxsYmFja1NvY2tldCA9IHJlcXVlc3RDYWxsYmFja1NvY2tldCgpOwotCQlpZiAoY2FsbGJhY2tTb2NrZXQgIT0gbnVsbCkgewotCQkJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKGNhbGxiYWNrU29ja2V0LCB0aGlzKTsKLQkJCWlmIChoYW5kbGVyLmlzQ29ubmVjdGVkKCkpCi0JCQkJcmV0dXJuIGhhbmRsZXI7Ci0JCQkJCi0JCQkvLyBGYWlsZWQsIGNsb3NlIHRoZSBzb2NrZXQuCi0JCQl0cnkgewotCQkJCWNhbGxiYWNrU29ja2V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQkvKioKLQkgKiBGcmVlIHRoZSBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgcmV0dXJuQ2FsbGJhY2tIYW5kbGVyKElDYWxsYmFja0hhbmRsZXIgYUhhbmRsZXIpIHsKLQkJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSAoQ2FsbGJhY2tIYW5kbGVyKSBhSGFuZGxlcjsKLQkJaWYgKGhhbmRsZXIuaXNDb25uZWN0ZWQoKSkKLQkJCXN5bmNocm9uaXplZCAoZkNhbGxiYWNrSGFuZGxlclBvb2wpIHsKLQkJCQlpZiAoZkNhbGxiYWNrSGFuZGxlclBvb2wuc2l6ZSgpIDwgTlVNQkVSX0ZSRUVfQ0FMTEJBQ0tTKQotCQkJCQlmQ2FsbGJhY2tIYW5kbGVyUG9vbC5wdXNoKGhhbmRsZXIpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlci5jbG9zZUhhbmRsZXIoKTsJLy8gV2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBtb3JlIHRoYW4gZml2ZSBmcmVlIGNvbm5lY3Rpb25zLgotCQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcm9jZXNzIGEgY2FsbGJhY2suCi0JICovCi0JcHVibGljIE9iamVjdCBkb0NhbGxiYWNrKElDYWxsYmFja1J1bm5hYmxlIHJ1bikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcnVuLnJ1bihoYW5kbGVyKTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUaGlzIGlzIGNvbW1hbmQgZXJyb3IsIGNvbm5lY3Rpb24gc3RpbGwgZ29vZCwgZG9uJ3QgcmV0cnksIGp1c3QgcGFzcyBpdCBvbi4KLQkJCQkJLy8gSXQgbWVhbnMgdGhlIG90aGVyIHNpZGUgc2FpZCBJIHByb2Nlc3NlZCBpdCwgYnV0IHRoZXJlIGlzIGFuIGVycm9yLgotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCQkvLyBDbG9zZSB0aGlzIGhhbmRsZXIgYW5kIHRyeSBhIG5ldyBvbmUsIG9uZSBtb3JlIHRpbWUuCi0JCQkJCQloYW5kbGVyLmNsb3NlSGFuZGxlcigpOwotCQkJCQkJaGFuZGxlciA9IChDYWxsYmFja0hhbmRsZXIpIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmV0dXJuIHJ1bi5ydW4oaGFuZGxlcik7CQkJCQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQkJLy8gSXQgZmFpbGVkIGFnYWluLCBqdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCByZXRocm93IHRoZSBleGNlcHRpb24uCi0JCQkJCQkJaGFuZGxlci5jbG9zZUhhbmRsZXIoKTsKLQkJCQkJCQl0aHJvdyBlQWdhaW47Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJdGhyb3cgZTsJLy8gUmVjb3ZlcmFibGUsIHJldGhyb3cgZXhjZXB0aW9uLgotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmV0dXJuQ2FsbGJhY2tIYW5kbGVyKGhhbmRsZXIpOwotCQkJfQotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBDb21tYW5kRXhjZXB0aW9uKCJObyBjYWxsYmFjayBoYW5kbGVyIHJldHJpZXZlZC4iLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci0JCi0JLyoKLQkgKiBSZWdpc3RlciB0aGUgc2VydmVyLiBSZXR1cm4gaWYgaWRlIHN0aWxsIGFjdGl2ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpc3RlclNlcnZlcihpbnQgdm1zZXJ2ZXJQb3J0KSB7Ci0JCVNvY2tldCBzb2NrZXQgPSBnZXRTb2NrZXQoKTsKLQkJaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLlJFTU9URV9TVEFSVEVEKTsKLQkJCQkJb3V0LndyaXRlSW50KHJlZ2lzdHJ5S2V5KTsKLQkJCQkJb3V0LndyaXRlSW50KHZtc2VydmVyUG9ydCk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlyZXR1cm4gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9CQkJCQkKLQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogUmVxdWVzdCB0aGUgY2FsbGJhY2sgc29ja2V0LiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpc24ndCBvbmUuCi0JICovCi0JcHJpdmF0ZSBTb2NrZXQgcmVxdWVzdENhbGxiYWNrU29ja2V0KCkgewotCQlTb2NrZXQgc29ja2V0ID0gZ2V0U29ja2V0KCk7Ci0JCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBjbG9zZVNvY2tldCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLkFUVEFDSF9DQUxMQkFDSyk7Ci0JCQkJCW91dC53cml0ZUludChyZWdpc3RyeUtleSk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQljbG9zZVNvY2tldCA9ICFpbi5yZWFkQm9vbGVhbigpOwotCQkJCQlyZXR1cm4gIWNsb3NlU29ja2V0ID8gc29ja2V0IDogbnVsbDsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoY2xvc2VTb2NrZXQpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNsb3NlU29ja2V0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCi0KLQlwcm90ZWN0ZWQgU29ja2V0IGdldFNvY2tldCgpIHsKLQkJLy8gV2UgYXJlIHB1dHRpbmcgaXQgb2ZmIGludG8gYSB0aHJlYWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdGltZW91dCBjYXBhYmlsaXRpZXMgb24gZ2V0dGluZyBhIHNvY2tldC4KLQkJLy8gU28gd2UgbmVlZCB0byBhbGxvdyBmb3IgdGhhdC4JCQotCQlmaW5hbCBTb2NrZXRbXSBzY0FycmF5ID0gbmV3IFNvY2tldFsxXTsKLQkJZmluYWwgYm9vbGVhbltdIHdhaXRpbmcgPSBuZXcgYm9vbGVhbltdIHt0cnVlfTsJCQotCQlUaHJlYWQgZG9JdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVNvY2tldCBzYyA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIG1hc3RlcklERVNvY2tldFBvcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJaWYgKHdhaXRpbmdbMF0pCi0JCQkJCQkJc2NBcnJheVswXSA9IHNjOwotCQkJCQkJZWxzZQotCQkJCQkJCXNjLmNsb3NlKCk7CS8vIFdlIGFyZSBubyBsb25nZXIgd2FpdGluZyBvbiB0aGlzIHRocmVhZCBzbyBjbG9zZSB0aGUgc29ja2V0IHNpbmNlIG5vIG9uZSB3aWxsIHVzZSBpdC4KLQkJCQkJfQkJCQkJCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlkb0l0LnN0YXJ0KCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQl0cnkgewotCQkJCWRvSXQuam9pbig2MDAwMCk7Ci0JCQkJc3luY2hyb25pemVkIChkb0l0KSB7Ci0JCQkJCXdhaXRpbmdbMF0gPSBmYWxzZTsJLy8gVG8gbGV0IGl0IGtub3cgd2UgYXJlIG5vIGxvbmdlciB3YWl0aW5nCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2NBcnJheVswXSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkbid0IHJldHJpZXZlIGEgc29ja2V0IGZyb20gbWFzdGVyIHNlcnZlciBpbiA2MCBzZWNvbmRzLiIpOwkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsJLy8gQ291bGRuJ3QgZ2V0IG9uZSwgcHJvYmFibHkgc2VydmVyIGlzIGRvd24uCi0JCX0KLQkJCQotCQlyZXR1cm4gc2NBcnJheVswXTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHNodXRkb3duUnVubmFibGVzOwotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWlmIChzaHV0ZG93blJ1bm5hYmxlcyA9PSBudWxsKSB7Ci0JCQlzaHV0ZG93blJ1bm5hYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIGlmIChzaHV0ZG93blJ1bm5hYmxlcy5jb250YWlucyhydW5uYWJsZSkpCi0JCQlyZXR1cm47Ci0JCXNodXRkb3duUnVubmFibGVzLmFkZChydW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWlmIChzaHV0ZG93blJ1bm5hYmxlcyAhPSBudWxsKQotCQkJc2h1dGRvd25SdW5uYWJsZXMucmVtb3ZlKHJ1bm5hYmxlKTsKLQl9Ci0KLQotCXB1YmxpYyBJVk1TZXJ2ZXIgZ2V0SVZNU2VydmVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1N0YWNrVHJhY2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1N0YWNrVHJhY2VVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjBhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9TdGFja1RyYWNlVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLQotCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby4qOwotLyoqCi0gKiBBIHV0aWxpdHkgdG8gZ2V0IHRoZSBzdGFjayB0cmFjZSBmcm9tIGFuIGV4Y2VwdGlvbgotICogYmFjayB0byB0aGUgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgU3RhY2tUcmFjZVV0aWxpdHkgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50U3RhY2tUcmFjZShUaHJvd2FibGUgdCkgewotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIod3JpdGVyKSk7Ci0JCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRhY2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+b3JnLmVjbGlwc2UuamVtLnVpPC9uYW1lPgotICAgIDxjb21tZW50PkFyY2hpdmVkIHByb2plY3QuIFdlIGhhZCB0aGlzIGluIFdUUCBidWlsZHMgZm9yIGEKLSAgICAgICAgbG9uZyB0aW1lLCBhbmQgdGhlbiBkaXNjb3ZlcmVkIG5vIG9uZSB1c2VkIGl0LiBBcHBhcmVudGx5IGFuCi0gICAgICAgIGVhcmxpZXIgdGVzdCBwbHVnaW4uIFRvIG1ha2Ugb2J2aW91cyB0aGlzIGlzIG5vdCBhbiBhY3RpdmUKLSAgICAgICAgcGx1Z2luLCBJJ3ZlICJudWxsZWQgb3V0IiBoZWFkLiBJIHRhZ2dlZCB0aGUgImxhc3QgdXNlZCIgSEVBRAotICAgICAgICB2ZXJzaW9uIHdpdGggdjIwMDgxMjEwRmluYWwgaW4gY2FzZSBpdCBldmVyIG5lZWRzIHRvIGJlCi0gICAgICAgIHJlc3RvcmVkLjwvY29tbWVudD4KLSAgICA8cHJvamVjdHM+Ci0gICAgPC9wcm9qZWN0cz4KLSAgICA8YnVpbGRTcGVjPgotICAgIDwvYnVpbGRTcGVjPgotICAgIDxuYXR1cmVzPgotICAgIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDNhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndvcmtiZW5jaC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWJhOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoXzIuMC4xMDAuMjAwODA2MDMxMzA0LmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY3MzU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjY2NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTUgMjE6MTU6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmFlYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0jU2F0IE1hciAzMSAyMjo1NToyMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhlMWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEZlYiAyMSAxMDowOToxOSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9qdmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5YmM4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZWE1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU0ODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCi1zb3VyY2UuLiA9IHdvcmtiZW5jaC8KLW91dHB1dC4uID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTMyMjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFdvcmtiZW5jaCBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1KYXZhRU1GTmF0dXJlTmFtZT1KYXZhRU1GTmF0dXJlIFByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDg5MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSmF2YUVNRk5hdHVyZSIKLSAgICAgICAgIG5hbWU9IiVKYXZhRU1GTmF0dXJlTmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4KLSAgICAgIDxydW50aW1lPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvcnVudGltZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwubmF0dXJlX3JlZ2lzdHJhdGlvbiI+Ci0gICAgICA8bmF0dXJlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIj4KLSAgICAgIDwvbmF0dXJlPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmVkZjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpET01BZGFwdG9yIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgSkFWQV9QQUNLID0gSmF2YVJlZkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKTsKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IHNvdXJjZVByb2plY3Q7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgSU5WQUxJRF9MSU5FTk8gPSAtMTsKLQlmaW5hbCBwcm90ZWN0ZWQgSW50ZWdlciBmTElORU5PTG9jayA9IG5ldyBJbnRlZ2VyKElOVkFMSURfTElORU5PKTsKLQkvLyBUaGlzIG9iamVjdCBpcyBub3Qgc3RhdGljLCBhcyBpdCBpcyB1c2VkIGFzIHN5bmNocm9uaXphdGlvbiBlbGVtZW50LgotCXByaXZhdGUgaW50IGZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POyAvLyBMaW5lIG9mZnNldCBpbiBzb3VyY2UgZmlsZQotCXByaXZhdGUgaW50IGZSZXNvbHZlZENvbE5vID0gSU5WQUxJRF9MSU5FTk87IC8vIENvbHVtbiBvZmZzZXQgaW4gc291cmNlIGZpbGUKLQlwdWJsaWMgSkRPTUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBJSmF2YVByb2plY3Qgd29ya2luZ1Byb2plY3QpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJc2V0U291cmNlUHJvamVjdCh3b3JraW5nUHJvamVjdCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQkvLyBUbyBiZSBvdmVyaWRkZW4gaWYgbmVlZGVkLgotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyBpbiBjYW5SZWZsZWN0KCkuIElmIHRoZSB0YXJnZXQgaXMgbm90IGluIGEgcmVzb3VyY2UsIG9yIHRoZQotCSAqIHJlc291cmNlIGlzIG5vdCBsb2FkZWQsIHRoZW4gaXQgY2FuJ3QgcmVmbGVjdC4gTXVzdG4ndCByZWZsZWN0IGlmIHRoZSB0YXJnZXQKLQkgKiBoYXMgYmVlbiB1bmxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZUxvYWRlZCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBnZXRUYXJnZXQoKSkuZVJlc291cmNlKCk7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2NhbiBmb3IgQ1JzIGFuZCBMRnMgd2l0aGluIGEgY2hhcmFjdGVyIGJ1ZmZlcgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMjoxNDoxMyBQTSkKLQkgKiBAcmV0dXJuIGludCAgTGluZU5vIGF0IGNoYXJPZmZzZXQKLQkgKiBAcGFyYW0gY2hhck9mZnNldCBpbnQKLQkgKiBAcGFyYW0gYnVmZmVyIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUxpbmVPZmZzZXQoaW50IGNoYXJPZmZzZXQsIElCdWZmZXIgYnVmZmVyKSB7Ci0KLQkJZlJlc29sdmVkQ29sTm8gPSBmUmVzb2x2ZWRMaW5lTm8gPSBJTlZBTElEX0xJTkVOTzsKLQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY2hhcltdIGNoYXJCdWZmID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQotCQlpZiAoY2hhckJ1ZmYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgTGluZUNvdW50ID0gMDsKLQkJaW50IENvbE5vID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gY2hhck9mZnNldDsgaSsrKSB7Ci0JCQlDb2xObysrOwotCQkJaWYgKGNoYXJCdWZmW2ldID09ICdccicpIHsKLQkJCQlMaW5lQ291bnQrKzsKLQkJCQlDb2xObyA9IDA7Ci0JCQkJaWYgKGNoYXJCdWZmW2kgKyAxXSA9PSAnXG4nKQotCQkJCQlpKys7IC8vIHNraXAgTGluZUZlZWQgZm9sbG93ZWQgIGEgQ1IKLQkJCX0gZWxzZSBpZiAoY2hhckJ1ZmZbaV0gPT0gJ1xuJykgewotCQkJCUxpbmVDb3VudCsrOwotCQkJCUNvbE5vID0gMDsKLQkJCX0KLQotCQl9Ci0JCWZSZXNvbHZlZENvbE5vID0gQ29sTm87Ci0JCWZSZXNvbHZlZExpbmVObyA9IExpbmVDb3VudDsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJc2ltcGxlVHlwZU5hbWUubWV0aG9kTmFtZShteS5wYWNrYWdlLlBhcm1fVHlwZTEscGFybVR5cGUyCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoSU1ldGhvZCBqZG9tTWV0aG9kKSB7Ci0JCXJldHVybiBjb21wdXRlTWV0aG9kSUQoamRvbU1ldGhvZCwgamRvbU1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksIG51bGwpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVUeXBlTmFtZS5tZXRob2ROYW1lKG15LnBhY2thZ2UuUGFybV9UeXBlMSxwYXJtVHlwZTIKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChJTWV0aG9kIGpkb21NZXRob2QsIElUeXBlIHR5cGUsIE1hcCB0eXBlQ2FjaGUpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJb3V0LmFwcGVuZCh0eXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCkpOwotCQlvdXQuYXBwZW5kKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQoamRvbU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJb3V0LmFwcGVuZChDX01FVEhPRF9QQVJNX0RFTElNSVRFUik7Ci0JCVN0cmluZ1tdIHBhcm1UeXBlTmFtZXMgPSBqZG9tTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCVN0cmluZyBwYXJtTmFtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJtTmFtZSA9IGNvbnZlcnRKRE9NdHlwZU5hbWUocGFybVR5cGVOYW1lc1tpXSk7Ci0JCQlwYXJtTmFtZSA9IEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShwYXJtTmFtZSwgdHlwZSwgdHlwZUNhY2hlKTsKLQkJCW91dC5hcHBlbmQocGFybU5hbWUpOwotCQkJaWYgKGkgPCAocGFybVR5cGVOYW1lcy5sZW5ndGggLSAxKSkKLQkJCQlvdXQuYXBwZW5kKENfUEFSTV9QQVJNX0RFTElNSVRFUik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChqZG9tTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkKLQkJCQlvdXQuYXBwZW5kKFNfQ09OU1RSVUNUT1JfVE9LRU4pOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZE5hbWUgLSBnZW5lcmF0ZSB0aGUgbmFtZSB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIEZvciB0aGUgbW9tZW50LCBuYW1lcyBhcmUgc2ltcGxlLCBhbmQgVVVJRCdzIGFyZSBjb21wbGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2ROYW1lKElNZXRob2QgamRvbU1ldGhvZCkgewotCQlyZXR1cm4gamRvbU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkvKioKLQkgKiBKYXZhIGNvbnRlbnQgaGFzIGNoYW5nZWQsIGJ1dCBubyBzdHJ1Y3R1cmFsIGNoYW5nZXMgdGhhdCByZXF1aXJlCi0JICogdG8gcmVmbGVjdFZhbHVlcygpOyAgZS5nLiwgdGhlIGJvZHkgb2YgYSBtZXRob2QgaGFzIGNoYW5nZWQuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxMDo0Nzo1OCBBTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsKLQkJc3luY2hyb25pemVkIChmTElORU5PTG9jaykgewotCQkJZlJlc29sdmVkTGluZU5vID0gSU5WQUxJRF9MSU5FTk87Ci0JCQlmUmVzb2x2ZWRDb2xObyA9IElOVkFMSURfTElORU5POwotCQl9Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCW1ldGhvZE5hbWVfcGFybVR5cGUxX3Bhcm1UeXBlMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRKRE9NdHlwZU5hbWUoU3RyaW5nIGpkb21UeXBlTmFtZSkgewotCQlyZXR1cm4gc2lnbmF0dXJlVG9TdHJpbmcoamRvbVR5cGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YUZpZWxkIC0gaW5zdGFudGlhdGUgYSBKYXZhIEZpZWxkIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBNb2RlbCBJRmllbGQKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIGZpZWxkIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVKYXZhRmllbGQoSUZpZWxkIGpkb21GaWVsZCwgWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIG5hbWUgPSBqZG9tRmllbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJRmllbGQgbmV3RmllbGQgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0JCW5ld0ZpZWxkLnNldE5hbWUobmFtZSk7Ci0JCXJlc291cmNlLnNldElEKG5ld0ZpZWxkLCAoKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSArIENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiArIG5hbWUpOwotCQlyZXR1cm4gbmV3RmllbGQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFNZXRob2QgLSBpbnN0YW50aWF0ZSBhIEphdmEgTWV0aG9kIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBNb2RlbCBJTWV0aG9kCi0JICogV2UgYXJlIGRlZmVycmluZyBtZXRob2QgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICogV2UgbmVlZCB0byBzdG9yZSBlbm91Z2ggaW5mbyBpbiB0aGUgZW1wdHkgTWV0aG9kIHRvIGZpbmQgaXRzIEphdmEgc291cmNlLgotCSAqIFRoZSBVVUlEIHdpbGwgZXZlbnR1YWxseSBob2xkIGVub3VnaCBpbmZvIHRvIGlkZW50aWZ5IHRoZSBzb3VyY2UsIHNvIHdlIHVzZSBpdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoSU1ldGhvZCBqZG9tTWV0aG9kLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2QgbmV3TWV0aG9kID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLQkJLy8gV2UgdXNlIGEgc2ltcGxlIG5hbWUsIGJ1dCBhIGNvbXBsZXggSUQgCi0JCW5ld01ldGhvZC5zZXROYW1lKGNvbXB1dGVNZXRob2ROYW1lKGpkb21NZXRob2QpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3TWV0aG9kLCBjb21wdXRlTWV0aG9kSUQoamRvbU1ldGhvZCwgZ2V0VHlwZSgpLCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpKTsKLQkJcmV0dXJuIG5ld01ldGhvZDsKLQl9Ci0JcHJvdGVjdGVkIElQYXRoIGdldEJpbmFyeVBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgSVR5cGUgZ2V0QmluYXJ5VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQl0cnkgewotCQkJaWYgKGdldFNvdXJjZVByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQkJSUphdmFFbGVtZW50IGZvdW5kID0gZ2V0U291cmNlUHJvamVjdCgpLmZpbmRFbGVtZW50KGdldEJpbmFyeVBhdGhGcm9tUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lKSk7Ci0JCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7IHF1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBDb21wdXRlIGEgY29sdW1uIG51bWJlciBmcm9tIHRoZSBJU291cmNlUmFuZ2Ugb2Zmc2V0Ci0JICogQ2FjaGUgdGhlIGxpbmUgbnVtYmVyIHRoZXJlYWZ0ZXIuICBTb3VyY2UgY2hhbmdlIHdpbGwKLQkgKiBJbnZva2UgdGhlIGNvbnRlbnRDaGFuZ2VkKCkgbWV0aG9kLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMTE6MTY6NTEgQU0pCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbE5vKCkgewotCi0JCXN5bmNocm9uaXplZCAoZkxJTkVOT0xvY2spIHsKLQkJCWlmIChmUmVzb2x2ZWRDb2xObyA9PSBJTlZBTElEX0xJTkVOTykKLQkJCQlyZXNvbHZlTGluZUNvbE5vKCk7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvbHZlZENvbE5vOwotCX0KLQkvKioKLQkgKiBDb21wdXRlIGEgbGluZSBudW1iZXIgZnJvbSB0aGUgSVNvdXJjZVJhbmdlIG9mZnNldAotCSAqIENhY2hlIHRoZSBsaW5lIG51bWJlciB0aGVyZWFmdGVyLiAgU291cmNlIGNoYW5nZSB3aWxsCi0JICogSW52b2tlIHRoZSBjb250ZW50Q2hhbmdlZCgpIG1ldGhvZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDExOjE2OjUxIEFNKQotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oKSB7Ci0KLQkJc3luY2hyb25pemVkIChmTElORU5PTG9jaykgewotCQkJaWYgKGZSZXNvbHZlZExpbmVObyA9PSBJTlZBTElEX0xJTkVOTykKLQkJCQlyZXNvbHZlTGluZUNvbE5vKCk7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvbHZlZExpbmVObzsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMToxODoyOSBQTSkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkvKiAKLQkgKiBSZXNvbHZlIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGEgVHlwZS4KLQkgKiAoQm9ycm93ZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuY29kZW1hbmlwdWxhdGlvbi5TdHViVXRpbGl0eS5nZXRSZXNvbHZlZFR5cGVOYW1lKCkpCi0JICogVGhlIGlucHV0IGlzIGEgc2ltcGxlIG9yIHF1YWxpZmllZCBuYW1lLCBOT1QgYSBzaWduYXR1cmUKLQkgKiBUaGUgb3V0cHV0IHdpbGwgYmUgYSBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb2x2ZWRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHsKLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZTsKLQkJdHJ5IHsKLQkJCW5hbWUgPSBKRE9NU2VhcmNoSGVscGVyLnJlc29sdmVTaW1wbGVUeXBlTmFtZShkZWNsYXJpbmdUeXBlLCB0eXBlTmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldFNvdXJjZVByb2plY3QoKSB7Ci0JCXJldHVybiBzb3VyY2VQcm9qZWN0OwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVR5cGUgZ2V0VHlwZSgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZVNvdXJjZVR5cGUoKSB7Ci0JCWZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkodHJ1ZSk7IC8vIGluZHVjZSBjbGllbnRzIHRvIGdldCBOb3RpZmllZC4KLQl9Ci0KLQlwdWJsaWMgTm90aWZpY2F0aW9uIHJlbGVhc2VTb3VyY2VUeXBlTm9Ob3RpZmljYXRpb24oKSB7Ci0JCXJldHVybiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7IC8vIGluZHVjZSBjbGllbnRzIHRvIGdldCBOb3RpZmllZC4KLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIxLzIwMDEgODowOTozNCBBTSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZUxpbmVDb2xObygpIHsKLQotCQlJTWVtYmVyIHJzID0gKElNZW1iZXIpIGdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJaWYgKHJzICE9IG51bGwpIHsKLQkJCWludCBvZmZzZXQgPSBJTlZBTElEX0xJTkVOTzsKLQkJCXRyeSB7Ci0JCQkJSVNvdXJjZVJhbmdlIHNyID0gcnMuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJaWYgKHNyLmdldExlbmd0aCgpIDw9IDApCi0JCQkJCXJldHVybjsKLQkJCQlvZmZzZXQgPSBzci5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBycy5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUJ1ZmZlciBidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKLQkJCQkJY29tcHV0ZUxpbmVPZmZzZXQob2Zmc2V0LCBidWZmZXIpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VQcm9qZWN0KElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzb3VyY2VQcm9qZWN0ID0gd29ya2luZ1Byb2plY3Q7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgdHlwZSBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBzdHJpbmcuCi0JICoKLQkgKiBVc2VzIFNpZ25hdHVyZS50b1N0cmluZygpLCB0aGVuIHRyaWVzIHRvIHVuZG8gYmFkIHJlcGxhY2VtZW50IGZvciBpbm5lciBjbGFzc2VzLgotCSAqIAotCSAqIEJ1ZzogMTY2MjI2IFtodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2MjI2XQotCSAqIFVwZGF0ZSB0byB1c2UgdGhlIGVyYXN1cmUgdHlwZSBmcm9tIHRoZSBzaWduYXR1cmUgaW4gb3JkZXIgdG8gCi0JICogdG9sZXJhdGUgSkRLIDUgZ2VuZXJpY3MuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaWduYXR1cmVUb1N0cmluZyhTdHJpbmcgc2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNEb2xsYXIgPSAoc2lnbmF0dXJlLmluZGV4T2YoU2lnbmF0dXJlLkNfRE9MTEFSKSAhPSAtMSk7Ci0JCS8vYmVnaW4gMTY2MjI2IGZpeAotCQlTdHJpbmcgcmVzdWx0ID0gU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKHNpZ25hdHVyZSk7Ci0JCXJlc3VsdCA9IFNpZ25hdHVyZS50b1N0cmluZyhyZXN1bHQpOwotCQkvL2VuZCAxNjYyMjYgZml4Ci0JCWlmIChoYXNEb2xsYXIpIHsKLQkJCWludCBuZXdQb3MgPSByZXN1bHQubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5ld1BvcyAhPSAtMSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgbmV3UG9zKSArICIkIiArIHJlc3VsdC5zdWJzdHJpbmcobmV3UG9zICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShTdHJpbmcgc2lnKSB7Ci0JCXJldHVybiB0eXBlTmFtZUZyb21TaWduYXR1cmUoc2lnLCBnZXRUeXBlKCkpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShTdHJpbmcgc2lnLCBJVHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWcsIHBhcmVudCwgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcsIElUeXBlIHBhcmVudCwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmcgcmVzdWx0OwotCQlTdHJpbmcgY29tcG9uZW50U2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZyk7Ci0JCWludCBhcnJheURpbWVuc2lvbnMgPSBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChzaWcpOwotCQlyZXN1bHQgPSBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUoc2lnbmF0dXJlVG9TdHJpbmcoY29tcG9uZW50U2lnbmF0dXJlKSwgcGFyZW50LCB0eXBlQ2FjaGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5RGltZW5zaW9uczsgaSsrKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQgKyAiW10iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkpET01TZWFyY2hIZWxwZXIjZmluZFR5cGUoU3RyaW5nLCBib29sZWFuLCBJSmF2YVByb2plY3QsIEpET01BZGFwdG9yKQotCSAqLwotCXB1YmxpYyBJVHlwZSBnZXRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBKRE9NU2VhcmNoSGVscGVyLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUsIGZhbHNlLCBnZXRTb3VyY2VQcm9qZWN0KCksIHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUNsYXNzRmluZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01DbGFzc0ZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM2OTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUNsYXNzRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNi8yMDAwIDExOjA2OjQ2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTUNsYXNzRmluZGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBKRE9NQ2xhc3NGaW5kZXIgaW5zdGFuY2U7Ci0vKioKLSAqIEpET01DbGFzc0ZpbmRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSkRPTUNsYXNzRmluZGVyKCkgewotCXN1cGVyKCk7Ci19Ci1wcm90ZWN0ZWQgSVBhdGggZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JcmV0dXJuIG5ldyBQYXRoKHF1YWxpZmllZE5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIik7Ly8kTk9OLU5MUy0xJAotfQotcHVibGljIElUeXBlIGdldEJpbmFyeVR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkKLQlJSmF2YUVsZW1lbnQgZm91bmQgPSBnZXRKYXZhRWxlbWVudChxdWFsaWZpZWROYW1lKTsKLQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQl0cnkgewotCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U291cmNlUHJvamVjdCgpLmZpbmRFbGVtZW50KGdldFBhdGhGcm9tUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lKSk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10ge3F1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBJUGF0aCBnZXRQYXRoRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSIpOy8vJE5PTi1OTFMtMSQKLX0KLXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkvL3JldHVybiAoSUphdmFQcm9qZWN0KSAoKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpLmdldEphdmFDb250ZXh0KCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBnZXRKYXZhRWxlbWVudChxdWFsaWZpZWROYW1lKTsKLQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQlpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKQotCQkJCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JCQllbHNlCi0JCQkJaWYgKGZvdW5kIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGZvdW5kQ1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZm91bmQ7Ci0JCQkJCS8vIHN0cmlwIHRoZSAiLmphdmEiLCBsaWZ0ZWQgZnJvbSBDb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCkKLQkJCQkJU3RyaW5nIGN1TWFpblR5cGVOYW1lID0gZm91bmRDVS5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQljdU1haW5UeXBlTmFtZSA9IGN1TWFpblR5cGVOYW1lLnN1YnN0cmluZygwLCBjdU1haW5UeXBlTmFtZS5sZW5ndGgoKSAtIDUpOwotCQkJCQlyZXR1cm4gZm91bmRDVS5nZXRUeXBlKGN1TWFpblR5cGVOYW1lKTsKLQkJCQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzE2LzIwMDAgMTE6MTk6NDggUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmphdmEuYWRhcHRlcnMuSkRPTUNsYXNzRmluZGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgSkRPTUNsYXNzRmluZGVyIGluc3RhbmNlKCkgewotCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQlpbnN0YW5jZSA9IG5ldyBKRE9NQ2xhc3NGaW5kZXIoKTsKLQlyZXR1cm4gaW5zdGFuY2U7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTVNlYXJjaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhiZTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTVNlYXJjaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOS8yNi8yMDAxIDExOjA5OjMwIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTVNlYXJjaEhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVEX05BTUUgPSAiIDo6IFJFU09MVkVEX05BTUUgOjogIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJJT0QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFID0gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVIgPSAiY2hhciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlQgPSAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkcgPSAibG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSUQgPSAidm9pZCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKRE9NU2VhcmNoSGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpET01TZWFyY2hIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIElmIHRoZSBAc2ltcGxlTmFtZSBpcyBhbiBpbm5lciBjbGFzcywgd2UgbmVlZCB0byByZXNvbHZlIG9ubHkgdGhlIGRlY2xhcmluZyBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGdldFR5cGVOYW1lSW5mbyhJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdbXVtdIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBkZWNsYXJpbmdOYW1lLCB0eXBlTmFtZTsKLQkJdHlwZU5hbWUgPSBzaW1wbGVOYW1lOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCXR5cGVOYW1lID0gdHlwZU5hbWUucmVwbGFjZSgnLicsICckJyk7Ci0JCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCIkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQlkZWNsYXJpbmdOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlyZXN1bHQgPSB0eXBlLnJlc29sdmVUeXBlKGRlY2xhcmluZ05hbWUpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCQkJcmVzdWx0WzBdWzFdID0gcmVzdWx0WzBdWzFdLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQlyZXN1bHRbMF1bMV0gKz0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4LCB0eXBlTmFtZS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoIlsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJZGVjbGFyaW5nTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUoZGVjbGFyaW5nTmFtZSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdFswXVsxXSA9IHJlc3VsdFswXVsxXSArIHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUodHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIChCT09MRUFOLmVxdWFscyh0eXBlKSB8fCBJTlQuZXF1YWxzKHR5cGUpIHx8IENIQVIuZXF1YWxzKHR5cGUpIHx8IFNIT1JULmVxdWFscyh0eXBlKSB8fCBMT05HLmVxdWFscyh0eXBlKSB8fCBGTE9BVC5lcXVhbHModHlwZSkgfHwgRE9VQkxFLmVxdWFscyh0eXBlKSB8fCBCWVRFLmVxdWFscyh0eXBlKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVPclZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGlzUHJpbWl0aXZlKHR5cGUpIHx8IGlzVm9pZCh0eXBlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1ZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIFZPSUQuZXF1YWxzKHR5cGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHNpZ25hdHVyZTEsIHNpZ25hdHVyZTIsIG51bGwpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMiwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHNpZzEgPSBzaWduYXR1cmUxOwotCQlTdHJpbmcgc2lnMiA9IHNpZ25hdHVyZTI7Ci0JCS8vIEZpcnN0IGNoZWNrIGFycmF5IGNvdW50LgotCQlpZiAoU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMSkgPT0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMikpIHsKLQkJCS8vIFdlIGhhdmUgdGhlIHNhbWUgYXJyYXkgY291bnQsIGdldCB0aGUgZWxlbWVudCB0eXBlcyBmb3IgY29uc2lkZXJhdGlvbi4KLQkJCXNpZzEgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnMSk7Ci0JCQlzaWcyID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZzIpOwotCi0JCQkvLyBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6Ci0JCQkvLwkJMSkgQm90aCBhcmUgdW5xdWFsaWZpZWQgKGJvdGggYmVpbmcgcHJpbWl0aXZlIHdpbGwgZmFsbCBpbnRvIHRoaXMpLAotCQkJLy8JCTIpIEJvdGggYXJlIHF1YWxpZmllZCwgYW5kCi0JCQkvLwkJMykgT25lIGlzIHF1YWxpZmllZCBhbmQgdGhlIG90aGVyIGlzIG5vdCAob25lIGNvdWxkIGJlIHByaW1pdGl2ZSkuCi0KLQkJCS8vIEZvciB0aGUgZmlyc3QgdHdvIGNhc2VzIGEgY29tcGFyZSBvZiB0aGUgcmVhZGFibGUgbmFtZXMgd2lsbCBhbHdheXMgZG8uCi0JCQlpZiAoISgoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIF4gKHNpZzIuaW5kZXhPZignLicpID09IC0xKSkpIHsKLQkJCQlyZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMSkuZXF1YWxzKFNpZ25hdHVyZS50b1N0cmluZyhzaWcyKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoaXMgaXMgY2FzZSAzLgotCQkJCS8vIEZpcnN0IHJvb3Qgb3V0IG9uZSBiZWluZyBwcmltaXRpdmUuCi0JCQkJaWYgKCgoc2lnMS5jaGFyQXQoMCkgPT0gJ1EnKSB8fCAoc2lnMS5jaGFyQXQoMCkgPT0gJ0wnKSkgJiYgKChzaWcyLmNoYXJBdCgwKSA9PSAnUScpIHx8IChzaWcyLmNoYXJBdCgwKSA9PSAnTCcpKSkgewotCQkJCQkvLyBHZXQgdGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHF1YWxpZmllZCBzaWduYXR1cmUKLQkJCQkJLy8gYW5kIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgb3RoZXIuCi0JCQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBudWxsOwotCQkJCQlpZiAoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQkJCXF1YWxpZmllZE5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCQlzaW1wbGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcxKTsKLQkJCQkJCXNpbXBsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiB0aGUgc2ltcGxlIG5hbWUgcmVzb2x2ZXMgdG8gdGhlIHF1YWxpZmllZCBuYW1lLCB3ZSBoYXZlIGEgbWF0Y2guCi0JCQkJCXJlc3VsdCA9IHF1YWxpZmllZE5hbWUuZXF1YWxzKHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmVlZHNUb1Jlc29sdmVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRm9yUmVmbGVjdGlvbikgewotCQlyZXR1cm4gISh0eXBlLmlzQmluYXJ5KCkgfHwgKCFpc0ZvclJlZmxlY3Rpb24gJiYgc2ltcGxlTmFtZS5pbmRleE9mKFBFUklPRCkgPiAtMSkgfHwgaXNQcmltaXRpdmVPclZvaWQoc2ltcGxlTmFtZSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNpbXBsZSBuYW1lIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHR5cGUuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzaW1wbGUgbmFtZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0eXBlLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaW1wbGVUeXBlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2ltcGxlIG5hbWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHlwZS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlU2ltcGxlVHlwZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIE1hcCByZXNvbHZlZE5hbWVDYWNoZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoIW5lZWRzVG9SZXNvbHZlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pKQotCQkJcmV0dXJuIHNpbXBsZU5hbWU7Ci0JCVN0cmluZyBrZXkgPSBudWxsLCBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJaWYgKHJlc29sdmVkTmFtZUNhY2hlICE9IG51bGwpIHsKLQkJCWtleSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBSRVNPTFZFRF9OQU1FICsgc2ltcGxlTmFtZTsKLQkJCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSByZXNvbHZlZE5hbWVDYWNoZS5nZXQoa2V5KTsKLQkJfQotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXVtdIHJlc3VsdCA9IGdldFR5cGVOYW1lSW5mbyh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhY2tOYW1lID0gcmVzdWx0WzBdWzBdOwotCQkJCWlmIChwYWNrTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQlxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgJyQnKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQliLmFwcGVuZChyZXN1bHRbMF1bMF0pLmFwcGVuZChQRVJJT0QpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQliLmFwcGVuZCh0eXBlTmFtZSk7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gc2ltcGxlTmFtZTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlZE5hbWVDYWNoZSAhPSBudWxsKQotCQkJCXJlc29sdmVkTmFtZUNhY2hlLnB1dChrZXksIHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lOwotCX0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgYSBtYXRjaGluZyBtZXRob2QgYW5kIHNldHMgaXQgaW4gdGhlCi0JICogZGVzY3JpcHRvciBpZiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2Qgc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1TaWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKHR5cGUsIG1ldGhvZE5hbWUsIHBhcm1TaWdzLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIGFuZCBzZXRzIGl0IGluIHRoZQotCSAqIGRlc2NyaXB0b3IgaWYgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKElUeXBlIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtU2lncywgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkvLyBGaXJzdCBnZXQgYWxsIHRoZSBtZXRob2RzIGJ5IHRoaXMgbmFtZSBhbmQgd2l0aCB0aGlzIG1hbnkgcGFybXMuCi0JCUlNZXRob2RbXSBhbGxNZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgY2FuZGlkYXRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgcGFybVNpZ3NMZW5ndGggPSAocGFybVNpZ3MgIT0gbnVsbCA/IHBhcm1TaWdzLmxlbmd0aCA6IDApOwotCQkJaWYgKChhbGxNZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSAmJiAoYWxsTWV0aG9kc1tpXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSA9PSBwYXJtU2lnc0xlbmd0aCkpCi0JCQkJY2FuZGlkYXRlTWV0aG9kcy5hZGQoYWxsTWV0aG9kc1tpXSk7Ci0JCX0KLQotCQkvLyBGb3IgZWFjaCBjYW5kaWRhdGUgY29uc2lkZXIgZWFjaCBwYXJtIGZvciBhIG1hdGNoLgotCQkvLyBUYWtlIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzIG9uIGFsbCBwYXJtcy4KLQkJSU1ldGhvZCBuZXh0ID0gbnVsbDsKLQkJU3RyaW5nW10gbmV4dFBhcm1TaWdzID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBjYW5kaWRhdGVJdGVyID0gY2FuZGlkYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoIWZvdW5kICYmIChjYW5kaWRhdGVJdGVyLmhhc05leHQoKSkpIHsKLQkJCW5leHQgPSAoSU1ldGhvZCkgY2FuZGlkYXRlSXRlci5uZXh0KCk7Ci0JCQluZXh0UGFybVNpZ3MgPSBuZXh0LmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsoZm91bmQgJiYgKGkgPCBuZXh0UGFybVNpZ3MubGVuZ3RoKSk7IGkrKykKLQkJCQlmb3VuZCAmPSBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHBhcm1TaWdzW2ldLCBuZXh0UGFybVNpZ3NbaV0sIHJlc29sdmVkTmFtZUNhY2hlKTsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyBuZXh0IDogbnVsbDsKLQl9Ci0KLQkvKioKLQkqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkqIGZpcnN0IHdpbGwgYmUgdGhlIElKYXZhRWxlbWVudCB0aGF0IHdhcyBmb3VuZCBhbmQgdGhlCi0JKiBzZWNvbmQgd2lsbCBiZSB0aGUgcXVhbGlmaWVkTmFtZSB1c2VkIHRvIGZpbmQgaXQuCi0JKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIGZpbmRBY3R1YWxKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMl07Ci0JCWlmIChhZGFwdG9yID09IG51bGwpCi0JCQlyZXN1bHRbMV0gPSBxdWFsaWZpZWROYW1lOwotCQllbHNlIAotCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkCi0JCQlyZXN1bHRbMV0gPSBnZXRSZXNvbHZlZFR5cGVOYW1lKHF1YWxpZmllZE5hbWUsIGFkYXB0b3IuZ2V0VHlwZSgpLCBhZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQotCQlyZXN1bHRbMF0gPSBmaW5kSmF2YUVsZW1lbnQoKFN0cmluZykgcmVzdWx0WzFdLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCWlmIChyZXN1bHRbMF0gPT0gbnVsbCkKLQkJCWZpbmRJbm5lckphdmFFbGVtZW50KHJlc3VsdCwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkgKiBmaXJzdCB3aWxsIGJlIHRoZSBJSmF2YUVsZW1lbnQgdGhhdCB3YXMgZm91bmQgYW5kIHRoZQotCSAqIHNlY29uZCB3aWxsIGJlIHRoZSBxdWFsaWZpZWROYW1lIHVzZWQgdG8gZmluZCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmluZElubmVySmF2YUVsZW1lbnQoT2JqZWN0W10gaW5mbywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWROYW1lLCBpbm5lck5hbWU7Ci0JCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSBpbmZvWzFdOwotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJaW5uZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJaW5uZXJOYW1lICs9ICIkIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5uZXJOYW1lICs9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSk7Ci0JCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkIHdoaWNoIGl0IG1heSBub3QgYmUgaWYgYW4gaW5uZXIgY2xhc3MKLQkJCQlpbm5lck5hbWUgPSBnZXRSZXNvbHZlZFR5cGVOYW1lKGlubmVyTmFtZSwgYWRhcHRvci5nZXRUeXBlKCksIGFkYXB0b3IuZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCQlpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoaW5uZXJOYW1lKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaW5mb1sxXSA9IGlubmVyTmFtZTsKLQkJCWluZm9bMF0gPSBmaW5kSmF2YUVsZW1lbnQoaW5uZXJOYW1lLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCQlpZiAoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpJiYgaW5mb1swXSA9PSBudWxsKQotCQkJCWZpbmRJbm5lckphdmFFbGVtZW50KGluZm8sIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUphdmFFbGVtZW50IGZpbmRKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShxdWFsaWZpZWROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogCi0JKiBSZXNvbHZlIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGEgVHlwZS4KLQkqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkqIFRoZSBpbnB1dCBpcyBhIHNpbXBsZSBvciBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKiBUaGUgb3V0cHV0IHdpbGwgYmUgYSBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lLCB0eXBlQ2FjaGUsIHRydWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgYm9vbGVhbiB1c2VBZHZhbmNlZEZvcklubmVycywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCQotCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBudWxsOwotCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKLQkJaWYgKHVzZUFkdmFuY2VkRm9ySW5uZXJzKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBmaW5kQWN0dWFsSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJZm91bmQgPSAoSUphdmFFbGVtZW50KSByZXN1bHRbMF07Ci0JCQlyZXNvbHZlZE5hbWUgPSAoU3RyaW5nKSByZXN1bHRbMV07Ci0JCX0gZWxzZQotCQkJZm91bmQgPSBmaW5kSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCWVsc2UgaWYgKGZvdW5kIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkvLyBzdHJpcCB0aGUgIi5qYXZhIiwgbGlmdGVkIGZyb20gQ29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpCi0JCQkJU3RyaW5nIGN1TWFpblR5cGVOYW1lID0gZm91bmRDVS5nZXRFbGVtZW50TmFtZSgpOwotCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJcmV0dXJuIGZvdW5kQ1UuZ2V0VHlwZShjdU1haW5UeXBlTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGZvdW5kIGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCQlJVHlwZSB0eXBlID0gKChJVHlwZSkgZm91bmQpOwotCQkJCWlmICghdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKS5lcXVhbHMocmVzb2x2ZWROYW1lKSkgewotCQkJCQkvLyBJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgaGVyZS4gU29tZXRpbWUgaW4gdGhlIHBhc3QgZm9yIGFuIGlubmVyIGNsYXNzLCB0aGUKLQkJCQkJLy8gSVR5cGUgcmV0dXJuZWQgd2FzIGZvciB0aGUgb3V0ZXIgY2xhc3MsIHNvIHlvdSB3b3VsZCBuZWVkIHRvIHNlYXJjaCBhZ2FpbgotCQkJCQkvLyBmb3IgdGhlIGlubmVyIGNsYXNzIGFnYWluc3QgdGhlIG91dGVyIGNsYXNzLiBJIGRvbid0IGtub3cgaG93IHRoaXMgbm93IGNhbgotCQkJCQkvLyBoYXBwZW4uIFRoZSBjb2RlIGZvbGxvd2VkIGFib3ZlIGlzIGV4dHJlbWVsbHkgY29tcGxpY2F0ZWQsIGVzcGVjaWFsbHkgd2hlbgotCQkJCQkvLyBpdCBpcyBhbiBpbm5lciBjbGFzcyB0aGF0IGlzbid0IGZ1bGx5LXF1YWxpZmllZCB0aGF0IGlzIGluc2lkZSBhIHNvdXJjZSBmaWxlLgotCQkJCQkvLyBJdCBnb2VzIHRocm91Z2ggc29tZSBneXJhdGlvbnMgZm9yIHRoYXQuIEkgZG9uJ3Qga25vdyB3aGF0IGl0IHdvdWxkCi0JCQkJCS8vIHJldHVybiBpbiB0aGF0IGNhc2UuIEJ1dCBqdXN0IGluIGNhc2UsIHRoZSB0ZXN0IGlzIGhlcmUgdG8gYmUgc2FmZS4KLQkJCQkJaW50IGluZGV4ID0gcmVzb2x2ZWROYW1lLmxhc3RJbmRleE9mKCckJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZGV4ID4gLTEpCi0JCQkJCQlyZXR1cm4gdHlwZS5nZXRUeXBlKHJlc29sdmVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCByZXNvbHZlZE5hbWUubGVuZ3RoKCkpKTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShwYWNrYWdlTmFtZSwgcXVhbGlmaWVkVHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJykpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10geyBwYWNrYWdlTmFtZSArICIuIiArIHF1YWxpZmllZFR5cGVOYW1lLCBqbWUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhQ2xhc3NKRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhQ2xhc3NKRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlmZmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhQ2xhc3NBZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RZUEVfTkFNRSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBTdGVwIGlkcyB1c2VkIGZvciBUaW1lclRlc3RzIG9mIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9DTEFTUyA9ICJSZWZsZWN0IEpET00gQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9NRVRIT0RTID0gIlJlZmxlY3QgYWxsIEpET00gbWV0aG9kcyBmb3IgYSBjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZMRUNUX0ZJRUxEUyA9ICJSZWZsZWN0IGFsbCBKRE9NIGZpZWxkcyBmb3IgYSBjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcm90ZWN0ZWQgSVR5cGUgc291cmNlVHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgdHlwZVJlc29sdXRpb25DYWNoZSA9IG5ldyBIYXNoTWFwKDI1KTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzUmVmbGVjdGVkRmllbGRzLCBpc1JlZmxlY3RpbmdGaWVsZHM7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1JlZmxlY3RlZE1ldGhvZHMsIGlzUmVmbGVjdGluZ01ldGhvZHM7Ci0JCi0JcHVibGljIEphdmFDbGFzc0pET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0LCBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGluRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIHdvcmtpbmdQcm9qZWN0KTsKLQkJc2V0QWRhcHRlckZhY3RvcnkoaW5GYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdGaWVsZHMgPSBuZXcgSGFzaE1hcCgpOyAKLQkvKgotCSAqIGFkZEZpZWxkcyAtIHJlZmxlY3Qgb3VyIGZpZWxkcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpZWxkcygpIHsKLQotCQkvLyBUaGUgYWxnb3JpdGhtIHdlIHdpbGwgdXNlIGlzOgotCQkvLyAxKSBQYXNzIHRocm91Z2ggdGhlIElGaWVsZCdzIG9mIHRoaXMgY2xhc3MKLQkJLy8gICAgYSkgSWYgaXQgaXMgaW4gZXhpc3RpbmdGaWVsZHMsIHRoZW4gYWRkIHRvIG5ld0V4aXN0aW5nIHRoZSBlbnRyeSBmcm9tCi0JCS8vICAgICAgIG9sZEV4aXN0aW5nIChkZWxldGluZyBmcm9tIG9sZEV4aXN0aW5nIGF0IHRoZSBzYW1lIHRpbWUpLCBhbmQgZmx1c2ggdGhlIGZpZWxkLiBUaGlzIGlzIHNvIG5leHQgd2UgcmUtZ2V0IGFueSBjaGFuZ2VkIHBhcnRzIG9mIGl0LgotCQkvLyAgICBiKSBlbHNlIG5vdCBleGlzdGluZywgdGhlbiBjcmVhdGUgbmV3IGZpZWxkIGFuZCBhZGQgdG8gdGhlIG5ldyBmaWVsZHMgbGlzdC4KLQkJLy8gMikgUmVtb3ZlIGZyb20gdGhlIGZpZWxkcyBsaXN0IGFueSBzdGlsbCBsZWZ0IGluIG9sZEV4aXN0aW5nLiBUaGVzZSBhcmUgb25lcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KLQkJLy8gMykgQWRkIGFsbCBvZiB0aGUgbmV3cyBvbmVzIHRvIHRoZSBmaWVsZHMuCi0JCS8vICAgICAgIAotCQlJRmllbGRbXSBmaWVsZHMgPSBudWxsOwotCQl0cnkgewotCQkJZmllbGRzID0gZ2V0U291cmNlVHlwZSgpLmdldEZpZWxkcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBmYWxzZTsJCi0JCX0KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwkJCi0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJSmF2YUZpZWxkSkRPTUFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JCU1hcCBuZXdFeGlzdGluZyA9IG5ldyBIYXNoTWFwKGZpZWxkcy5sZW5ndGgpOwotCQlMaXN0IG5ld0ZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlGaWVsZCBpZmllbGQgPSBmaWVsZHNbaV07Ci0JCQlmaWVsZCA9IChGaWVsZCkgZXhpc3RpbmdGaWVsZHMucmVtb3ZlKGlmaWVsZCk7CS8vIEdldCB0aGUgZXhpc3RpbmcgZmllbGQgKHdoaWNoIGlzIHRoZSB2YWx1ZSkgZnJvbSB0aGUgY29sbGVjdGlvbiBrZXllZCBieSBJRmllbGQuCi0JCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGFuIGV4aXN0aW5nIG1ldGhvZC4gU28ganVzdCBwdXQgb3ZlciB0byBuZXdFeGlzdGluZy4gVGhlbiBmbHVzaCBpdC4KLQkJCQluZXdFeGlzdGluZy5wdXQoaWZpZWxkLCBmaWVsZCk7Ci0JCQkJLy8gU2luY2UgdGhpcyBpcyBhIG5ldyBtZXRob2QsIGl0IGlzIG5vdCBhdHRhY2hlZCB0byBhIHJlc291cmNlLCBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhZGFwdGVyLgotCQkJCWFkYXB0ZXIgPSAoSmF2YUZpZWxkSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZmllbGQsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCQlhZGFwdGVyID0gKEphdmFGaWVsZEpET01BZGFwdG9yKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0TmV3KGZpZWxkLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJZWxzZQotCQkJCQlhZGFwdGVyLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbih0cnVlKTsKLQkJCQlhZGFwdGVyLnNldFNvdXJjZUZpZWxkKGlmaWVsZCk7CS8vIEdpdmUgaXQgdGhpcyBuZXcgSUZpZWxkCi0JCQl9IGVsc2UgewotCQkJCS8vIEl0IGlzIGEgbmV3IG1ldGhvZC4gQ3JlYXRlIHRoZSBuZXcgbWV0aG9kLCBhZGQgdG8gbmV3RXhpc3RpbmcsIGFuZCBhZGQgdG8gbmV3TWV0aG9kcyBsaXN0LgotCQkJCWZpZWxkID0gY3JlYXRlSmF2YUZpZWxkKGlmaWVsZCwgcmVzb3VyY2UpOwotCQkJCW5ld0V4aXN0aW5nLnB1dChpZmllbGQsIGZpZWxkKTsJCQkJCi0JCQkJbmV3RmllbGRzLmFkZChmaWVsZCk7Ci0JCQkJYWRhcHRlciA9IChKYXZhRmllbGRKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhmaWVsZCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIuc2V0U291cmNlRmllbGQoaWZpZWxkKTsKLQkJCX0KLQkJfQotCQkKLQkJQmFzaWNFTGlzdCBmaWVsZHNMaXN0ID0gKEJhc2ljRUxpc3QpIGdldEphdmFDbGFzc1RhcmdldCgpLmdldEZpZWxkc0dlbigpOwotCQlpZiAoIWV4aXN0aW5nRmllbGRzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFueSBzdGlsbCBsZWZ0IGluIG9sZCBleGlzdGluZyBhcmUgZGVsZXRlZC4gU28gd2UgbWFrZSB0aGVtIHByb3hpZXMgYW5kIHRoZW4gcmVtb3ZlIHRoZW0gZnJvbSBmaWVsZHMgbGlzdC4JCQkKLQkJCVVSSSBiYXNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlDb2xsZWN0aW9uIHRvRGVsZXRlID0gZXhpc3RpbmdGaWVsZHMudmFsdWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG0gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHJlc291cmNlLmdldElEKG0pOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCQl9Ci0JCQlmaWVsZHNMaXN0LnJlbW92ZUFsbCh0b0RlbGV0ZSk7Ci0JCX0KLQkJCi0JCWlmICghbmV3RmllbGRzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFkZCBpbiB0aGUgbmV3cyBvbmVzCi0JCQlmaWVsZHNMaXN0LmFkZEFsbFVuaXF1ZShuZXdGaWVsZHMpOwotCQl9Ci0JCQotCQkvLyBGaW5hbGx5IHNldCBjdXJyZW50IGV4aXN0aW5nIHRvIHRoZSBuZXcgbWFwIHdlIGNyZWF0ZWQuCi0JCWV4aXN0aW5nRmllbGRzID0gbmV3RXhpc3Rpbmc7Ci0JCXJldHVybiB0cnVlOwkJCQotCX0KLQkKLQlwcml2YXRlIE1hcCBleGlzdGluZ01ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOyAKLQkvKgotCSAqIGFkZE1ldGhvZHMgLSByZWZsZWN0IG91ciBtZXRob2RzLiBNZXJnZSBpbiB3aXRoIHRoZSBwcmV2aW91cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRNZXRob2RzKCkgewotCQkvLyBUaGUgYWxnb3JpdGhtIHdlIHdpbGwgdXNlIGlzOgotCQkvLyAxKSBQYXNzIHRocm91Z2ggdGhlIElNZXRob2QncyBvZiB0aGlzIGNsYXNzCi0JCS8vICAgIGEpIElmIGl0IGlzIGluIGV4aXN0aW5nTWV0aG9kcywgdGhlbiBhZGQgdG8gbmV3RXhpc3RpbmcgdGhlIGVudHJ5IGZyb20KLQkJLy8gICAgICAgb2xkRXhpc3RpbmcgKGRlbGV0aW5nIGZyb20gb2xkRXhpc3RpbmcgYXQgdGhlIHNhbWUgdGltZSksIGFuZCBmbHVzaCB0aGUgbWV0aG9kLiBUaGlzIGlzIHNvIG5leHQgd2UgcmUtZ2V0IGFueSBjaGFuZ2VkIHBhcnRzIG9mIGl0LgotCQkvLyAgICBiKSBlbHNlIG5vdCBleGlzdGluZywgdGhlbiBjcmVhdGUgbmV3IG1ldGhvZCBhbmQgYWRkIHRvIHRoZSBuZXcgbWV0aG9kcyBsaXN0LgotCQkvLyAyKSBSZW1vdmUgZnJvbSB0aGUgbWV0aG9kcyBsaXN0IGFueSBzdGlsbCBsZWZ0IGluIG9sZEV4aXN0aW5nLiBUaGVzZSBhcmUgb25lcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KLQkJLy8gMykgQWRkIGFsbCBvZiB0aGUgbmV3cyBvbmVzIHRvIHRoZSBtZXRob2RzLgotCQkvLyAgICAgICAKLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJcmV0dXJuIGZhbHNlOwkKLQkJfQotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7CQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFNZXRob2RKRE9NQWRhcHRvciBhZGFwdGVyID0gbnVsbDsKLQkJTWFwIG5ld0V4aXN0aW5nID0gbmV3IEhhc2hNYXAobWV0aG9kcy5sZW5ndGgpOwotCQlMaXN0IG5ld01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJSU1ldGhvZCBpbSA9IG1ldGhvZHNbaV07Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBleGlzdGluZ01ldGhvZHMucmVtb3ZlKGltKTsJLy8gR2V0IHRoZSBleGlzdGluZyBtZXRob2QgKHdoaWNoIGlzIHRoZSB2YWx1ZSkgZnJvbSB0aGUgY29sbGVjdGlvbiBrZXllZCBieSBJTWV0aG9kLgotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJLy8gSXQgaXMgYW4gZXhpc3RpbmcgbWV0aG9kLiBTbyBqdXN0IHB1dCBvdmVyIHRvIG5ld0V4aXN0aW5nLiBUaGVuIGZsdXNoIGl0LgotCQkJCW5ld0V4aXN0aW5nLnB1dChpbSwgbWV0aG9kKTsKLQkJCQlhZGFwdGVyID0gKEphdmFNZXRob2RKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShtZXRob2QpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCWFkYXB0ZXIuc2V0U291cmNlTWV0aG9kKGltKTsJLy8gR2l2ZSBpdCB0aGlzIG5ldyBJTWV0aG9kCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG5ldyBtZXRob2QuIENyZWF0ZSB0aGUgbmV3IG1ldGhvZCwgYWRkIHRvIG5ld0V4aXN0aW5nLCBhbmQgYWRkIHRvIG5ld01ldGhvZHMgbGlzdC4KLQkJCQltZXRob2QgPSBjcmVhdGVKYXZhTWV0aG9kKGltLCByZXNvdXJjZSk7Ci0JCQkJbmV3RXhpc3RpbmcucHV0KGltLCBtZXRob2QpOwkJCQkKLQkJCQluZXdNZXRob2RzLmFkZChtZXRob2QpOwotCQkJCS8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgbWV0aG9kLCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJCQlhZGFwdGVyID0gKEphdmFNZXRob2RKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhtZXRob2QsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLnNldFNvdXJjZU1ldGhvZChtZXRob2RzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJQmFzaWNFTGlzdCBtZXRob2RzTGlzdCA9IChCYXNpY0VMaXN0KSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCWlmICghZXhpc3RpbmdNZXRob2RzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFueSBzdGlsbCBsZWZ0IGluIG9sZCBleGlzdGluZyBhcmUgZGVsZXRlZC4gU28gd2UgbWFrZSB0aGVtIHByb3hpZXMgYW5kIHRoZW4gcmVtb3ZlIHRoZW0gZnJvbSBtZXRob2RzIGxpc3QuCi0JCQlVUkkgYmFzZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJQ29sbGVjdGlvbiB0b0RlbGV0ZSA9IGV4aXN0aW5nTWV0aG9kcy52YWx1ZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gdG9EZWxldGUuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gcmVzb3VyY2UuZ2V0SUQobSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJCW0uZVNldFByb3h5VVJJKGJhc2VVUkkuYXBwZW5kRnJhZ21lbnQoaWQpKTsKLQkJCX0KLQkJCW1ldGhvZHNMaXN0LnJlbW92ZUFsbCh0b0RlbGV0ZSk7Ci0JCX0KLQkJCi0JCWlmICghbmV3TWV0aG9kcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhZGQgaW4gdGhlIG5ld3Mgb25lcwotCQkJbWV0aG9kc0xpc3QuYWRkQWxsVW5pcXVlKG5ld01ldGhvZHMpOwotCQl9Ci0JCQotCQkvLyBGaW5hbGx5IHNldCBjdXJyZW50IGV4aXN0aW5nIHRvIHRoZSBuZXcgbWFwIHdlIGNyZWF0ZWQuCi0JCWV4aXN0aW5nTWV0aG9kcyA9IG5ld0V4aXN0aW5nOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQ2xlYXIgc291cmNlIFR5cGUgOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQlzb3VyY2VUeXBlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIGZpZWxkcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoRmllbGRzKCkgewotCQkvLyBGaXJzdCB0dXJuIHRoZW0gYWxsIGludG8gcHJveGllcyBzbyB0aGF0IGFueSBob2xkZXJzIHdpbGwgcmUtcmVzb2x2ZSB0byBtYXliZSB0aGUgbmV3IG9uZSBpZiBjbGFzcyBjb21lcyBiYWNrLgotCQlleGlzdGluZ0ZpZWxkcy5jbGVhcigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlVUkkgYmFzZVVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJTGlzdCBmaWVsZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJaW50IG1zaXplID0gZmllbGRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2l6ZTsgaSsrKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZiA9IChJbnRlcm5hbEVPYmplY3QpIGZpZWxkcy5nZXQoaSk7Ci0JCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQoZik7Ci0JCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQlmLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCX0KLQkJZmllbGRzLmNsZWFyKCk7CS8vIE5vdyB3ZSBjYW4gY2xlYXIgaXQuCi0JCXJldHVybiB0cnVlOwotCQl9Ci0JLyoqCi0JICogQ2xlYXIgdGhlIGltcGxlbWVudHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEltcGxlbWVudHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgbWV0aG9kcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTWV0aG9kcygpIHsKLQkJLy8gRmlyc3QgdHVybiB0aGVtIGFsbCBpbnRvIHByb3hpZXMgc28gdGhhdCBhbnkgaG9sZGVycyB3aWxsIHJlLXJlc29sdmUgdG8gbWF5YmUgdGhlIG5ldyBvbmUgaWYgY2xhc3MgY29tZXMgYmFjay4KLQkJZXhpc3RpbmdNZXRob2RzLmNsZWFyKCk7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCVVSSSBiYXNlVVJJID0gcmVzLmdldFVSSSgpOwotCQlMaXN0IG1ldGhvZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCWludCBtc2l6ZSA9IG1ldGhvZHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1zaXplOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBtID0gKEludGVybmFsRU9iamVjdCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQobSk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCX0KLQkJbWV0aG9kcy5jbGVhcigpOwkvLyBOb3cgd2UgY2FuIGNsZWFyIGl0LgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoSW5uZXJDbGFzc2VzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0OwotCQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlmbHVzaEFuZENsZWFyQ2FjaGVkTW9kZWxPYmplY3QgPSBjbGVhckNhY2hlZE1vZGVsT2JqZWN0OwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgYSByZWZsZWN0IGlmIGEgcmVhbCBmbHVzaCBpcyBuZWVkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZsdXNoTm93KCkgewotCQlpZiAoZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0KQotCQkJc2V0U291cmNlVHlwZShudWxsKTsKLQkJdHlwZVJlc29sdXRpb25DYWNoZS5jbGVhcigpOwotCQlmbHVzaE1vZGlmaWVycygpOwotCQlmbHVzaFN1cGVyKCk7Ci0JCWZsdXNoSW1wbGVtZW50cygpOwotCQlpZiAoZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCQkvLyBEb24ndCBmbHVzaCB0aGVzZSB5ZXQuIFdlIHdpbGwgdHJ5IHRvIHJldXNlIHRoZW0gb24gdGhlIG5leHQgcmVmbHVzaC4gSWYgY2xlYXIgbW9kZWwgdG9vLCB0aGVuIGZsdXNoIHRoZW0uIFRoaXMgdXN1YWxseSBtZWFucyBjbGFzcyBoYXMgYmVlbiBkZWxldGVkLCBzbyB3aHkga2VlcCB0aGVtIGFyb3VuZC4KLQkJCWZsdXNoTWV0aG9kcygpOwotCQkJZmx1c2hGaWVsZHMoKTsKLQkJfQotCQkvLyBFdmVuIGlmIHdlIGRpZG4ndCBmbHVzaCB0aGUgZmllbGRzL21ldGhvZHMsIHdlIGRvIG5lZWQgdG8gbWFyayBhcyBub3QgcmVmbGVjdGVkIHNvIG9uIG5leHQgdXNhZ2Ugd2Ugd2lsbCBtZXJnZSBpbiB0aGUgY2hhbmdlcy4KLQkJaGFzUmVmbGVjdGVkTWV0aG9kcyA9IGZhbHNlOwotCQloYXNSZWZsZWN0ZWRGaWVsZHMgPSBmYWxzZTsKLQkJCi0JCWZsdXNoSW5uZXJDbGFzc2VzKCk7Ci0JCWZsdXNoQW5kQ2xlYXJDYWNoZWRNb2RlbE9iamVjdCA9IGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkvKioKLQkgKiBnZXRCaW5hcnlUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRCaW5hcnlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRCaW5hcnlUeXBlKCgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCB8fCBmbHVzaEFuZENsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQkJc291cmNlVHlwZSA9IEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUoamF2YUNsYXNzLmdldEphdmFQYWNrYWdlKCkuZ2V0TmFtZSgpLCBqYXZhQ2xhc3MucHJpbUdldE5hbWUoKSwgZ2V0U291cmNlUHJvamVjdCgpKTsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgc291cmNlVHlwZSB3YXMgZm91bmQgYW5kIHdlIGFyZSBub3QgaW4gdGhlIG1pZGRsZSBvZgotCQkJICogcmVmbGVjdGluZyBpdCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGhhc1JlZmxlY3RlZAotCQkJICogaXMgc2V0IGJhY2sgdG8gZmFsc2UuICBJZiB0aGlzIGlzIG5vdCBkb25lIHRoZW4gdGhlIHN5c3RlbQotCQkJICogYXNzdW1lcyB0aGF0IHRoZSBjb250ZW50IGluIHRoZSB0YXJnZXQgbW9kZWwgb2JqZWN0IGhhcyBiZWVuCi0JCQkgKiByZWZsZWN0ZWQgZnJvbSB0aGlzIGZvdW5kIHNvdXJjZVR5cGUgd2hpY2ggaXMgbm90IHRoZSBjYXNlLgotCQkJICovCi0JCQlpZiAoaGFzVmFsaWRSZWZsZWN0aW9uKCkpCi0JCQkJZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gc291cmNlVHlwZTsKLQl9Ci0JLyoqCi0JICogZ2V0U291cmNlVHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggZGVzY3JpYmVzIG91ciBleGlzdGluZyBKYXZhIGNsYXNzIG9yIHNvdXJjZSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJcmV0dXJuIHR5cGVSZXNvbHV0aW9uQ2FjaGU7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBpcyBudWxsIG9yIGlmCi0JICogaXQgaXMgYSBiaW5hcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgewotCQlpZiAoZ2V0U291cmNlVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vbXVzdCBiZSBuZXc/Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkuaXNCaW5hcnkoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcmVmbGVjdEphdmFDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlJVHlwZSB0eXBlID0gSkRPTVNlYXJjaEhlbHBlci5maW5kVHlwZShxdWFsaWZpZWROYW1lLCB0cnVlLCBnZXRTb3VyY2VQcm9qZWN0KCksIHRoaXMpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIHJlZmxlY3RKYXZhQ2xhc3ModHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NSZWYocXVhbGlmaWVkTmFtZSk7Ci0JfQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcmVmbGVjdEphdmFDbGFzcyhJVHlwZSBhVHlwZSkgewotCQlpZiAoYVR5cGUgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKEVPYmplY3QpIGdldFRhcmdldCgpKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUphdmFDbGFzc0pET01BZGFwdG9yIGFkYXB0b3IgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChhZGFwdG9yICE9IG51bGwpCi0JCQkJCWFkYXB0b3Iuc2V0U291cmNlVHlwZShhVHlwZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gamF2YUNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBSZXR1cm4gdHJ1ZSBhbHdheXMgYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciB3aWxsIGZsdXNoIHdpdGggdGhlIHR5cGUgY2FuCi0JICogYmUgZm91bmQgYWdhaW4uICBJbiBoZWFkbGVzcyBtb2RlLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSB0eXBlIGlzIGZvdW5kLiAgVGhpcyBpcwotCSAqIG5lZWRlZCBiZWNhdWNlIG1vc3QgaGVhZGxlc3MgdGFza3MgYXJlIGRvbmUgdW5kZXIgb25lIG9wZXJhdGlvbiBhbmQgdGhlIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyCi0JICogbWF5IG5vdCBoYXZlIGEgY2hhbmNlIHRvIGZsdXNoIGEgYmFkIHJlZmxlY3Rpb24gYmVmb3JlIHRoZSByZWFsIHR5cGUgbmVlZHMgdG8gYmUgZm91bmQgYW5kIGNhbiBiZSBmb3VuZC4KLQkgKiBKYXZhQ2xhc3MgYWRhcHRvcjoKLQkgKiAtIHNldCBtb2RpZmllcnMKLQkgKiAtIHNldCBuYW1lCi0JICogLSBzZXQgcmVmZXJlbmNlIHRvIHN1cGVyCi0JICogLSBjcmVhdGUgbWV0aG9kcwotCSAqIC0gY3JlYXRlIGZpZWxkcwotCSAqIC0gYWRkIGltcG9ydHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlpZiAoaGFzRmx1c2hlZCkgewotCQkJLy8gV2UgZmx1c2ggc29tZXRpbWUgaW4gdGhlIHBhc3Qgc2luY2UgbGFzdCByZWZsZWN0LiBTbyBub3cgZG8gdGhlIGFjdHVhbCBmbHVzaC4KLQkJCWZsdXNoTm93KCk7Ci0JCX0KLQkJc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCQlib29sZWFuIGlzSGVhZGxlc3MgPSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmdldEN1cnJlbnRDb250ZXh0KCkgPT0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUOwotCQlpZiAoY2FuUmVmbGVjdCgpKSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfQ0xBU1MpOwotCQkJdHJ5IHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0U291cmNlVHlwZSgpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCWJvb2xlYW4gaXNXQyA9IGN1ICE9IG51bGwgPyBjdS5pc1dvcmtpbmdDb3B5KCkgOiBmYWxzZTsKLQkJCQlJUmVzb3VyY2UgcmVzID0gaXNXQyA/IGdldFNvdXJjZVR5cGUoKS5nZXRSZXNvdXJjZSgpIDogbnVsbDsKLQkJCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHBoeXNpY2FsIGNsYXNzZXMuIElmIHN0aWxsIGp1c3QgaW4gd29ya2luZyBjb3B5IGFuZCBub3QgeWV0IHB1dCBvdXQgdG8KLQkJCQkvLyBkaXNrLCB3ZSBkb24ndCBzaG91bGQgdHJlYXQgYXMgbm90IGV4aXN0LiBBbnl0aGluZyBlbHNlIGlzIGNvbnNpZGVyZWQgZXhpc3RpbmcgYmVjYXVzZSB3ZSBnb3QgcGFzdAotCQkJCS8vIGdldFNvdXJjZVR5cGUuZXhpc3RzLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSB0cnV0aCBmb3Igbm9uLXdjLiBCdXQgZm9yIHdjIHR5cGVzIGl0IHdpbGwgcmV0dXJuIHRydWUsCi0JCQkJLy8gZXZlbiB0aG91Z2ggbm90IHBoeXNpY2FsbHkgb24gZGlzayAoc3VjaCBhcyBqdXN0IGNyZWF0aW5nIGl0IGFuZCBoYWRuJ3Qgc2F2ZWQgaXQgeWV0KS4gU28gZm9yIHdjIHR5cGVzCi0JCQkJLy8gd2UgbmVlZCB0byB0ZXN0IHRoZSBhY3R1YWwgcmVzb3VyY2UuCi0JCQkJLy8gVGVzdCBpcyBPSyBpZiBub3Qgd2MsIG9yIGlmIHdjLCB0aGVuIHRoZXJlIGlzIGEgcmVzLiBhbmQgaXQgaXMgYWNjZXNzaWJsZS4KLQkJCQlpZiAoIWlzV0MgfHwgKHJlcyAhPSBudWxsICYmIHJlcy5pc0FjY2Vzc2libGUoKSkpIHsKLQkJCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkJCXNldE5hbWluZygpOwotCQkJCQl0cnkgewotCQkJCQkJc2V0U3VwZXIoKTsKLQkJCQkJfSBjYXRjaCAoSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJc2V0SW1wbGVtZW50cygpOwotCQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKCk7Ci0JCQkJCXNldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQkJCS8vYWRkSW1wb3J0cygpOwotCQkJCQlpZiAoaXNIZWFkbGVzcykgewotCQkJCQkJcmVnaXN0ZXJXaXRoRmFjdG9yeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX0NMQVNTKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNIZWFkbGVzcykKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSB7Ci0JCQlyZWdpc3RlcldpdGhGYWN0b3J5KCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJCS8vIE5lZWQgdG8gZ2V0IGl0IGFuZCByZWZsZWN0IGl0IHNvIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhpcyB0YXJnZXQgaXMgc2V0IGNvcnJlY3RseS4gV2UgY2FuIGp1c3QKLQkJCS8vIHNldCBpdCBvdXJzZWx2ZXMgZGlyZWN0bHkgYmVjYXVzZSBFQ29yZSB3b3VsZCB0cnkgdG8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGlubmVyIGNsYXNzZXMgb2YgdGhlIGRlY2xhcmluZyB0eXBlLiBUaGlzCi0JCQkvLyB3b3VsZCBjYXVzZSBpdCB0byBiZSBhZGRlZCB0d2ljZSwgb25jZSBmcm9tIHRoZSByZWZsZWN0aW9uIGNhdXNlZCBieSB0aGUgaW52ZXJzZSBzZXR0aW5nLCBhbmQgb25jZSBmcm9tIG91ciBkb2luZwotCQkJLy8gdGhlIGludmVyc2Ugc2V0dGluZyBpdHNlbGYuCi0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBkZWNsYXJpbmdUeXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlKYXZhQ2xhc3NJbXBsIGRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzc0ltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJZGVjbGFyaW5nQ2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCk7CS8vIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBwdXQgdXMgaW50byBpdHMgbGlzdCBhbmQgYWxzbyBzZXQgb3VyIGRlY2xhcmluZyBjbGFzcyB0byB0aGlzIGRlY2xhcmluZyB0eXBlLgotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVmbGVjdCgpIHsKLQkJcmV0dXJuIGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VUeXBlKCkuZXhpc3RzKCk7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSAmJiBjYW5SZWZsZWN0KCkpIHsKLQkJCWlmICghaGFzUmVmbGVjdGVkRmllbGRzICYmICFpc1JlZmxlY3RpbmdGaWVsZHMpIHsKLQkJCQlpc1JlZmxlY3RpbmdGaWVsZHMgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9GSUVMRFMpOwotCQkJCQlhZGRGaWVsZHMoKTsKLQkJCQkJaGFzUmVmbGVjdGVkRmllbGRzID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQloYXNSZWZsZWN0ZWRGaWVsZHMgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGUpOyAKLQkJCQkJfQkJCQkJCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaXNSZWZsZWN0aW5nRmllbGRzID0gZmFsc2U7Ci0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX0ZJRUxEUyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGhhc1JlZmxlY3RlZEZpZWxkczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7CS8vIENvdWxkbid0IHJlZmxlY3QgdGhlIGJhc2UgdmFsdWVzLCBzbyBjb3VsZG4ndCBkbyBmaWVsZHMgZWl0aGVyCi0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgJiYgY2FuUmVmbGVjdCgpKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZE1ldGhvZHMgJiYgIWlzUmVmbGVjdGluZ01ldGhvZHMpIHsKLQkJCQlpc1JlZmxlY3RpbmdNZXRob2RzID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EUyk7Ci0JCQkJCWhhc1JlZmxlY3RlZE1ldGhvZHMgPSBhZGRNZXRob2RzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaGFzUmVmbGVjdGVkTWV0aG9kcyA9IGZhbHNlOwotCQkJCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8iKSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzISEhIgotCQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoZSk7IAotCQkJCQl9CQkJCQkKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpc1JlZmxlY3RpbmdNZXRob2RzID0gZmFsc2U7Ci0JCQkJCWlmICghaGFzUmVmbGVjdGVkKQotCQkJCQkJZmx1c2hNZXRob2RzKCk7CS8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIHNvIHdlIHdpbGwgZG8gYSBjb21wbGV0ZSBmbHVzaCB0byBiZSBvbiBzYWZlIHNpZGUuCi0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRFMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBoYXNSZWZsZWN0ZWRNZXRob2RzOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsJLy8gQ291bGRuJ3QgcmVmbGVjdCB0aGUgYmFzZSB2YWx1ZXMsIHNvIGNvdWxkbid0IGRvIGZpZWxkcyBlaXRoZXIKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyV2l0aEZhY3RvcnkoKSB7Ci0JCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVnaXN0ZXJSZWZsZWN0aW9uKGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLCBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRU9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIKLQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpID09IHRoaXMKLQkJCSYmIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpID09IGdldFRhcmdldCgpKQotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS51bnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgaW5GYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gaW5GYWN0b3J5OwotCX0KLQkvKioKLQkgKiBzZXRJbXBsZW1lbnRzIC0gc2V0IG91ciBpbXBsZW1lbnRlZC9zdXBlciBpbnRlcmZhY2VzIGhlcmUKLQkgKiBGb3IgYW4gaW50ZXJmYWNlLCB0aGVzZSBhcmUgc3VwZXJjbGFzc2VzLgotCSAqIEZvciBhIGNsYXNzLCB0aGVzZSBhcmUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsZW1lbnRzKCkgewotCQl0cnkgewotCQkJU3RyaW5nW10gaW50ZXJmYWNlTmFtZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpOwotCQkJSmF2YUNsYXNzIHJlZjsKLQkJCS8vIG5lZWRzIHdvcmssIHRoZSBuYW1lcyBhYm92ZSB3aWxsIGJlIHNpbXBsZSBuYW1lcyBpZiB3ZSBhcmUgcmVsZmVjdGluZyBmcm9tIGEgc291cmNlIGZpbGUKLQkJCUxpc3QgbGlzdCA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpbnRlcmZhY2VOYW1lc1tpXTsKLQkJCQkvLyBpZiBhIGNsYXNzIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgYWN0dWFsbHkgYW4gaW5uZXIgaW50ZXJmYWNlLCB0aGUgaW5uZXIgaW50ZXJmYWNlCi0JCQkJLy8gcGFja2FnZSBpcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5IHdpdGhvdXQgZ2V0dGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIEZvciBleGFtcGxlLAotCQkJCS8vIHB1YmxpYyBjbGFzcyBUZXN0QmVhbiBpbXBsZW1lbnRzIFNvbWVPdGhlclNpbXBsZUNsYXNzLlNvbWVJbnRlcmZhY2UKLQkJCQkvLyB3aXRob3V0IGdldHRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCB3ZSBhcmUgdXNpbmcgU29tZU90aGVyU2ltcGxlQ2xhc3MgYXMgdGhlIAotCQkJCS8vIHBhY2thZ2UgbmFtZSB3aGljaCBpcyBpbmNvcnJlY3QuCi0JCQkJU3RyaW5nIGlubmVydHlwZU5hbWUgPSBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUobmFtZSwgZ2V0VHlwZSgpLCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCQkJCWlmIChpbm5lcnR5cGVOYW1lICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IGlubmVydHlwZU5hbWU7Ci0JCQkJfQotCQkJCXJlZiA9IHJlZmxlY3RKYXZhQ2xhc3MobmFtZSk7Ci0JCQkJbGlzdC5hZGQocmVmKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0QWJzdHJhY3QoRmxhZ3MuaXNBYnN0cmFjdChnZXRTb3VyY2VUeXBlKCkuZ2V0RmxhZ3MoKSkpOwotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoRmxhZ3MuaXNQdWJsaWMoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCS8vIFNldCB0eXBlIHRvIGNsYXNzIG9yIGludGVyZmFjZSwgbm90IHlldCBoYW5kbGluZyBFWENFUFRJT04KLQkJCWlmIChnZXRTb3VyY2VUeXBlKCkuaXNDbGFzcygpKQotCQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwpOwotCQkJZWxzZQotCQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkKLQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgamF2YUNsYXNzVGFyZ2V0LmdldFF1YWxpZmllZE5hbWUoKSwgbnBlLmdldE1lc3NhZ2UoKX0pLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSIKLQkJfQotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIChwYWNrYWdlIG5hbWUgKyBuYW1lKSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRCAtIHNpbXBsZSBuYW1lLCBpZGVudGl0eSB3aXRoaW4gYSBwYWNrYWdlIGRvY3VtZW50Ci0JICogCS0gbnVsbCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvKiBOYW1pbmcgaGFzIGJlZW4gcHJvdmlkZWQgYnkgdGhlIEphdmFSZWZsZWN0aW9uS2V5IAotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlqYXZhQ2xhc3NUYXJnZXQucmVmU2V0VVVJRCgoU3RyaW5nKW51bGwpOwotCQkoKFhNSVJlc291cmNlKWphdmFDbGFzc1RhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUNsYXNzVGFyZ2V0LGdldFNvdXJjZVR5cGUoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJKi8KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlVHlwZShJVHlwZSBhVHlwZSkgewotCQlzb3VyY2VUeXBlID0gYVR5cGU7Ci0JfQotCS8qKgotCSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlcigpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN1cGVyTmFtZSA9IG51bGw7Ci0JCUlUeXBlIHN1cGVyVHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoIWdldFNvdXJjZVR5cGUoKS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJc3VwZXJOYW1lID0gZ2V0U291cmNlVHlwZSgpLmdldFN1cGVyY2xhc3NOYW1lKCk7Ci0JCQkJLy8gYmluYXJ5IHR5cGVzIHdpbGwgYWx3YXlzIGhhdmUgZnVsbHktcXVhbGlmaWVkIHN1cGVyIG5hbWVzLCBzbyBubyBuZWVkIHRvIGRvIGFueSBzZWFyY2hpbmcuCi0JCQkJaWYgKCFnZXRTb3VyY2VUeXBlKCkuaXNCaW5hcnkoKSAmJiBzdXBlck5hbWUgIT0gbnVsbCAmJiBpc1RhcmdldElubmVyKCkpIHsKLQkJCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQkJCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJCQkJCS8vR2V0IGFsbCBwYXJlbnQgSW5uZXJUeXBlcwotCQkJCQkJSVR5cGVbXSBpbm5lcnMgPSBkZWNsYXJpbmdUeXBlLmdldFR5cGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlUeXBlIHR5cGUgPSBpbm5lcnNbaV07Ci0JCQkJCQkJaWYgKHN1cGVyTmFtZS5lcXVhbHModHlwZS5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJCQlzdXBlck5hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCkgKyAnLicgKyBzdXBlck5hbWU7Ci0JCQkJCQkJCXJlZmxlY3RJbm5lckNsYXNzZXMoZGVjbGFyaW5nVHlwZSk7Ci0JCQkJCQkJCXN1cGVyVHlwZSA9IHR5cGU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL1NvdXJjZSBmaWxlcyByZXR1cm4gbnVsbCBpZiBleHRlbmRzIGRvZXMgbm90IGV4aXN0LgotCQkJCWlmIChzdXBlck5hbWUgPT0gbnVsbCAmJiAhZ2V0U291cmNlVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPQkpFQ1RfVFlQRV9OQU1FKSkKLQkJCQkJc3VwZXJOYW1lID0gT0JKRUNUX1RZUEVfTkFNRTsKLQkJCQlpZiAoc3VwZXJOYW1lICE9IG51bGwpIHsKLQkJCQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQkJCQlpZiAoc3VwZXJUeXBlICE9IG51bGwpCi0JCQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKHJlZmxlY3RKYXZhQ2xhc3Moc3VwZXJUeXBlKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWphdmFDbGFzc1RhcmdldC5zZXRTdXBlcnR5cGUocmVmbGVjdEphdmFDbGFzcyhzdXBlck5hbWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXRJbm5lcigpIHsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCXJldHVybiAoamF2YUNsYXNzLmdldE5hbWUoKS5pbmRleE9mKCckJykgIT0gLTEpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKSAhPSBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKCkgewotCQlJVHlwZVtdIGlubmVyQ2xhc3NlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbm5lckNsYXNzZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0VHlwZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoaW5uZXJDbGFzc2VzICE9IG51bGwgJiYgaW5uZXJDbGFzc2VzLmxlbmd0aCAhPSAwKSB7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0U291cmNlVHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlubmVyID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHBhY2thZ2VOYW1lLCBpbm5lckNsYXNzZXNbaV0uZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSwgc2V0KTsKLQkJCQlkZWNsYXJlZENsYXNzZXMuYWRkKGlubmVyKTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKElUeXBlIGFUeXBlKSB7Ci0JCUlUeXBlW10gaW5uZXJDbGFzc2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlubmVyQ2xhc3NlcyA9IGFUeXBlLmdldFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsICYmIGlubmVyQ2xhc3Nlcy5sZW5ndGggIT0gMCkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gYVR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCUphdmFDbGFzc0ltcGwgcGFyZW50VHlwZSA9IChKYXZhQ2xhc3NJbXBsKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGFUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IHBhcmVudFR5cGUuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JCQlKYXZhQ2xhc3MgaW5uZXI7Ci0JCQkKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgaW5uZXJDbGFzc2VzW2ldLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBpZiB3ZSBoYXZlIGEgdmFsaWQgc291cmNlIGFuZCBoYXMgYmVlbiByZWZsZWN0ZWQuIFRoaXMgaXMgdG8gb25seQotCSAqIHRvIGJlIHVzZWQgYnkgdGhpcyBhZGFwdGVyIGFuZCBieSB0aGUgSkRPTSBhZGFwdGVyIGZhY3RvcnkuIEl0IGhhcyBhIAotCSAqIHZlcnkgc3BlY2lmaWMgbWVhbmluZyBhbmQgbWF5IGNoYW5nZSBhcyBuZWVkZWQuIEl0IHNob3VsZCBub3QgYmUgdXNlZAotCSAqIGZvciBhbnkgb3RoZXIgcHVycG9zZS4gSXQgaXMgbm90IGFuIEFQSS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gaGFzVmFsaWRSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gc291cmNlVHlwZSAhPSBudWxsICYmIGhhc1JlZmxlY3RlZCAmJiAhaXNSZWZsZWN0aW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMWRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFGaWVsZEpET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5GaWVsZEltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFGaWVsZEpET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTl9DT01NRU5UID0gIi8qIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfQ09NTUVOVCA9ICIqLyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSUZpZWxkIHNvdXJjZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVR5cGUgcGFyZW50VHlwZSA9IG51bGw7Ci0JcHVibGljIEphdmFGaWVsZEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCwgd29ya2luZ1Byb2plY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlRmllbGQgPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJaWYgKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpCi0JCQljbGVhclNvdXJjZSgpOwotCQlGaWVsZEltcGwgZmllbGQgPSBnZXRUYXJnZXRGaWVsZCgpOwotCQlmaWVsZC5zZXRJbml0aWFsaXplcihudWxsKTsKLQkJZmllbGQuc2V0RmluYWwoZmFsc2UpOwotCQlmaWVsZC5zZXRTdGF0aWMoZmFsc2UpOwotCQlmaWVsZC5zZXRUcmFuc2llbnQoZmFsc2UpOwotCQlmaWVsZC5zZXRWb2xhdGlsZShmYWxzZSk7Ci0JCWZpZWxkLnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWZpZWxkLnNldEVUeXBlKG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldFRhcmdldEZpZWxkKCkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyBmb3IgdGhlIHNvdXJjZSBzdGFydGluZyBhZnRlciB0aGUgZmllbGQncyBuYW1lIHRvIHRoZSBlbmQgb2YKLQkgKiB0aGUgc291cmNlIHJhbmdlLiAgVGhpcyB3aWxsIGJlIHRoZSBzb3VyY2UgYWZ0ZXIgdGhlIG5hbWUgd2hpY2ggY291bGQgaW5jbHVkZSBjb21tZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2UoKSB7Ci0JCUlPcGVuYWJsZSBvcGVuYWJsZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0T3BlbmFibGUoKTsKLQkJdHJ5IHsKLQkJCUlTb3VyY2VSYW5nZSBuYW1lUmFuZ2UsIHNvdXJjZVJhbmdlOwotCQkJaW50IHN0YXJ0ID0gLTEsIGxlbmd0aCA9IDA7Ci0JCQlJQnVmZmVyIGJ1ZmZlciA9IG9wZW5hYmxlLmdldEJ1ZmZlcigpOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lUmFuZ2UgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE5hbWVSYW5nZSgpOwotCQkJc3RhcnQgPSBuYW1lUmFuZ2UuZ2V0T2Zmc2V0KCkgKyBuYW1lUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoc3RhcnQgIT0gLTEpIHsKLQkJCQlzb3VyY2VSYW5nZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQlpZiAoc291cmNlUmFuZ2UuZ2V0T2Zmc2V0KCkgIT0gLTEpCi0JCQkJCWxlbmd0aCA9IHNvdXJjZVJhbmdlLmdldE9mZnNldCgpICsgc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCkgLSBzdGFydDsKLQkJCQlyZXR1cm4gYnVmZmVyLmdldFRleHQoc3RhcnQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgZmllbGQgc291cmNlIHN0cmluZyB3aXRob3V0IGNvbW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlV2l0aG91dENvbW1lbnRzKCkgewotCQlTdHJpbmcgcyA9IGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2UoKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IHN0YXJ0Q29tbWVudCA9IC0xOwotCQlpbnQgZW5kQ29tbWVudCA9IC0xOwotCQl3aGlsZSAoc3RhcnQgPCBzLmxlbmd0aCgpKSB7Ci0JCQlzdGFydENvbW1lbnQgPSBzLmluZGV4T2YoQkVHSU5fQ09NTUVOVCwgc3RhcnQpOwotCQkJaWYgKHN0YXJ0Q29tbWVudCA+IDApIHsKLQkJCQlTdHJpbmcgbmV3U3RyaW5nOwotCQkJCWVuZENvbW1lbnQgPSBzLmluZGV4T2YoRU5EX0NPTU1FTlQsIHN0YXJ0KTsKLQkJCQluZXdTdHJpbmcgPSBzLnN1YnN0cmluZyhzdGFydCwgc3RhcnRDb21tZW50KTsKLQkJCQlzID0gbmV3U3RyaW5nICsgcy5zdWJzdHJpbmcoZW5kQ29tbWVudCArIEVORF9DT01NRU5ULmxlbmd0aCgpLCBzLmxlbmd0aCgpKTsKLQkJCQlzdGFydCA9IDA7Ci0JCQkJc3RhcnRDb21tZW50ID0gLTE7Ci0JCQkJZW5kQ29tbWVudCA9IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlzdGFydCA9IHMubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCS8qKgotCSAqIGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcgLSBwYXJzZSB0aGUgc291cmNlIGZvciBvdXIgc291cmNlIGZpZWxkIAotCSAqIAlhbmQgcmV0dXJuIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcuCi0JICogIFJldHVybiBudWxsIGlmIG5vIGluaXRpYWxpemF0aW9uIHN0cmluZyBvciBjb25zdGFudCB2YWx1ZSBpcyBwcmVzZW50LgotCSAqIGkuZS4gLSBwdWJsaWMgU3RyaW5nIGZvbyA9ICJmb28gZGVmYXVsdCI7IHNob3VsZCByZXR1cm4gImZvbyBkZWZhdWx0IiAoaW5jbHVkaW5nIHF1b3RlcykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFnZXRQYXJlbnRUeXBlKCkuaXNCaW5hcnkoKSkgewotCQkJCVN0cmluZyBzb3VyY2UgPSBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlV2l0aG91dENvbW1lbnRzKCk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWludCBlcXVhbHNQb3MgPSBzb3VyY2UuaW5kZXhPZignPScpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaW50IGVuZFBvcyA9IHNvdXJjZS5pbmRleE9mKCcsJyk7Ly8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZW5kUG9zID09IC0xKQotCQkJCQkJZW5kUG9zID0gc291cmNlLmxlbmd0aCgpIC0gMTsKLQkJCQkJaWYgKGVxdWFsc1BvcyAhPSAtMSAmJiBlcXVhbHNQb3MgPCBlbmRQb3MpIHsKLQkJCQkJCS8vIENvcHkgZnJvbSBhZnRlciAiPSIgdG8gYmVmb3JlICI7IiBvciAiLCIKLQkJCQkJCXJlc3VsdCA9IHNvdXJjZS5zdWJzdHJpbmcoZXF1YWxzUG9zICsgMSwgZW5kUG9zKTsKLQkJCQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEJpbmFyeSB0eXBlLCBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY29uc3RhbnQKLQkJCQkvLyBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBBUEkncywgYnV0IHRoaXMgaXMgcHJvYmFibHkgb25seQotCQkJCS8vIGF2YWlsYWJsZSBmb3Igc3RhdGljcy4KLQkJCQlPYmplY3QgY29uc3RhbnRWYWx1ZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0Q29uc3RhbnQoKTsKLQkJCQkvLyBOZWVkIHRvIGNvbnZlcnQgdGhlIGNvbnN0YW50IHRvIGEgU3RyaW5nCi0JCQkJaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBjb25zdGFudFZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChjb25zdGFudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlyZXN1bHQgPSAiXCIiICsgcmVzdWx0ICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHB1bnQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0YXJnZXRGaWVsZCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0RmllbGQuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlpZiAocGFyZW50SmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUZpZWxkKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlRmllbGQgIT0gbnVsbDsKLSAgICB9Ci0JCi0JLyoKLQkgKiBVc2VkIGJ5IEphdmEgQ2xhc3MgSkRPTSBhZGFwdGVyIHRvIGNyZWF0ZSBhbmQgc2V0IHdpdGggYSBzb3VyY2UgZmllbGQKLQkgKi8JCi0JcHVibGljIHZvaWQgc2V0U291cmNlRmllbGQoSUZpZWxkIGZpZWxkKSB7Ci0JCXNvdXJjZUZpZWxkID0gZmllbGQ7Ci0JfQkKLQkvKioKLQkgKiBnZXRTb3VyY2VGaWVsZCAtIHJldHVybiB0aGUgSUZpZWxkIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIElGaWVsZCBnZXRTb3VyY2VGaWVsZCgpIHsKLQkJaWYgKHNvdXJjZUZpZWxkID09IG51bGwgfHwgIXNvdXJjZUZpZWxkLmV4aXN0cygpKSB7Ci0JCQlJVHlwZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlzb3VyY2VGaWVsZCA9IHBhcmVudC5nZXRGaWVsZCgoKEZpZWxkKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gc291cmNlRmllbGQ7Ci0JfQotCXB1YmxpYyBGaWVsZEltcGwgZ2V0VGFyZ2V0RmllbGQoKSB7Ci0JCXJldHVybiAoRmllbGRJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRUeXBlKCk7Ci0JfQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJRmllbGQgZmllbGQgPSBnZXRUYXJnZXRGaWVsZCgpOwotCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSkRPTUFkYXB0b3IgY2xhc3NBZGFwdG9yID0gKEpET01BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JCQkJaWYgKGNsYXNzQWRhcHRvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gY2xhc3NBZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJaWYgKGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VGaWVsZCgpICE9IG51bGwpIHsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJLy8Jc2V0TmFtaW5nKCk7Ci0JCQlzZXRUeXBlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJU3RyaW5nIGluaXRpYWxpemVyID0gZ2V0RmllbGRJbml0aWFsaXplclN0cmluZygpOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEluaXRpYWxpemVyKGNyZWF0ZUJsb2NrKGphdmFGaWVsZFRhcmdldC5nZXROYW1lKCksIGluaXRpYWxpemVyKSk7Ci0JCQlpbnQgZmxhZ3MgPSBnZXRTb3VyY2VGaWVsZCgpLmdldEZsYWdzKCk7Ci0JCQlqYXZhRmllbGRUYXJnZXQuc2V0RmluYWwoRmxhZ3MuaXNGaW5hbChmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFN0YXRpYyhGbGFncy5pc1N0YXRpYyhmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFRyYW5zaWVudChGbGFncy5pc1RyYW5zaWVudChmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFZvbGF0aWxlKEZsYWdzLmlzVm9sYXRpbGUoZmxhZ3MpKTsKLQkJCS8vIFNldCB2aXNpYmlsaXR5Ci0JCQlpZiAoRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcml2YXRlKGZsYWdzKSkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChmbGFncykpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCQllbHNlCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geygoWE1JUmVzb3VyY2UpIGphdmFGaWVsZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQoamF2YUZpZWxkVGFyZ2V0KSwgbnBlLmdldE1lc3NhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSIKLQkJfQotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MKLQkgKgktIElECi0JICogCS0gbnVsbCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQlKYXZhQ2xhc3MgcGFyZW50ID0gamF2YUZpZWxkVGFyZ2V0LmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJKChYTUlSZXNvdXJjZSkgamF2YUZpZWxkVGFyZ2V0LmVSZXNvdXJjZSgpKS5zZXRJRChqYXZhRmllbGRUYXJnZXQsIHBhcmVudC5nZXROYW1lKCkgKyAiXyIgKyBqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21TaWduYXR1cmUoZ2V0U291cmNlRmllbGQoKS5nZXRUeXBlU2lnbmF0dXJlKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJc2V0RmllbGRUeXBlKGdldFRhcmdldEZpZWxkKCksIHR5cGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU3NGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAwIDE6MjA6MzEgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJvdGVjdGVkIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotLyoqCi0gKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFKRE9NQWRhcHRlckZhY3RvcnkoSUphdmFQcm9qZWN0IGFKYXZhUHJvamVjdCkgewotCXRoaXMoKTsKLQlzZXRKYXZhUHJvamVjdChhSmF2YVByb2plY3QpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhQ2xhc3NKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCksIHRoaXMpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhRmllbGRKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCkpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YU1ldGhvZEpET01BZGFwdG9yKHRhcmdldCwgZ2V0SmF2YVByb2plY3QoKSk7Ci19Ci0vKioKLSAqICBGbHVzaCBBTEwgYWRhcHRlcnMsIHdvcnN0IGNhc2UKLSAqIFdlIGFsc28gd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgc291cmNlIHR5cGVzIGFyZSBhbHNvIGNsZWFyZWQKLSAqIGluIHRoaXMgd29yc3QgY2FzZSBzY2VuYXJpby4KLSAqLwotcHVibGljIHZvaWQgZmx1c2hBbGwoKSB7Ci0JZG9GbHVzaChyZWZsZWN0ZWQudmFsdWVzKCksdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyBMaXN0IGZsdXNoQWxsTm9Ob3RpZmljYXRpb24oKSB7Ci0JcmV0dXJuIGRvRmx1c2gocmVmbGVjdGVkLnZhbHVlcygpLHRydWUsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgZmx1c2hQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBub0ZsdXNoSWZTb3VyY2VGb3VuZCkgewotCUxpc3QgYWRhcHRvcnMgPSBnZXRSZWZsZWN0ZWRGb3JQYWNrYWdlKHBhY2thZ2VOYW1lLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCk7Ci0JZG9GbHVzaChhZGFwdG9ycywgdHJ1ZSwgdHJ1ZSk7Ci19Ci1wdWJsaWMgTGlzdCBmbHVzaFBhY2thZ2VOb05vdGlmaWNhdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQlMaXN0IGFkYXB0b3JzID0gZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgbm9GbHVzaElmU291cmNlRm91bmQpOwotCXJldHVybiBkb0ZsdXNoKGFkYXB0b3JzLCB0cnVlLCBmYWxzZSk7Ci19Ci0vKioKLSAqIFJldHVybiBhIExpc3Qgb2YgcmVmbGVjdGlvbiBhZGFwdG9ycyB0aGF0IGJlbG9uZyB0byAKLSAqIHRoZSBwYWNrYWdlTmFtZS4KLSAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICogQHJldHVybgotICovCi1wcml2YXRlIExpc3QgZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gZmlsdGVyRm91bmRUeXBlcykgewotCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmICFyZWZsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVmbGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCU1hcC5FbnRyeSBlbnRyeTsKLQkJCVN0cmluZyBrZXk7Ci0JCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBhZGFwdG9yOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWFkYXB0b3IgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJLyoKLQkJCQkgKiBFbnN1cmUgdGhhdCB0aGUgdGhlIGFkYXB0b3IgaXMgb25seSBmaWx0ZXJlZCBvdXQgaWYgaXQgaGFzCi0JCQkJICogYWN0dWFsbHkgcmVmbGVjdGVkIHRoZSBjb250ZW50LiAgSXQgaXMgbm90IGdvb2QgZW5vdWdoIGp1c3QKLQkJCQkgKiB0byB0ZXN0IGZvciB0aGUgc291cmNlVHlwZS4KLQkJCQkgKi8KLQkJCQlpZiAoZmlsdGVyRm91bmRUeXBlcyAmJiBhZGFwdG9yLmhhc1ZhbGlkUmVmbGVjdGlvbigpKQotCQkJCQljb250aW51ZTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpICYmIGtleS5pbmRleE9mKCcuJywgcGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKSA8IDApIHsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyZXN1bHQuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotfQotcHJpdmF0ZSBMaXN0IGRvRmx1c2goQ29sbGVjdGlvbiBhZGFwdG9ycywgYm9vbGVhbiBjbGVhclNvdXJjZVR5cGUsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlpZiAoIWFkYXB0b3JzLmlzRW1wdHkoKSkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQlMaXN0IG5vdGlmaWNhdGlvbnMgPSBkb05vdGlmeSA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KGFkYXB0b3JzLnNpemUoKSk7Ci0JCXRyeSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uOwotCQkJSXRlcmF0b3IgaSA9IGFkYXB0b3JzLml0ZXJhdG9yKCk7Ci0JCQlKRE9NQWRhcHRvciBhZGFwdG9yOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJYWRhcHRvciA9IChKRE9NQWRhcHRvcikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRvTm90aWZ5KQotCQkJCQlhZGFwdG9yLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQllbHNlIHsKLQkJCQkJbm90aWZpY2F0aW9uID0gYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKQotCQkJCQkJbm90aWZpY2F0aW9ucy5hZGQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCXJldHVybiBub3RpZmljYXRpb25zOwotCX0KLQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLX0KLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCWEuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotfQotcHVibGljIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCXJldHVybiBhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uUGx1c0lubmVyTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGlubmVyTmFtZSA9IHNvdXJjZSArICckJzsKLQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVN0cmluZyBrZXk7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGtleS5lcXVhbHMoc291cmNlKSB8fCBrZXkuc3RhcnRzV2l0aChpbm5lck5hbWUpKSB7Ci0JCQkJYWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoa2V5KTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChub3RpZmljYXRpb24gPT0gbnVsbCkKLQkJCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKTsKLQkJCQkJZWxzZQotCQkJCQkJKChOb3RpZmljYXRpb25DaGFpbikgbm90aWZpY2F0aW9uKS5hZGQoYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmNvcmUuYXBpLklKYXZhUHJvamVjdAotICovCi1wdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCXJldHVybiBqYXZhUHJvamVjdDsKLX0KLS8qKgotICogQ3JlYXRlIGEgSmF2YSBNb2RlbCBsaXN0ZW5lciB3aGljaCB3aWxsIGZsdXNoIGludmFsaWRhdGVkIGFkYXB0b3JzLgotICogVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFkYXB0ZXJzIHRvIHJlLXJlZmxlY3QgdGhlaXIgdGFyZ2V0IG9iamVjdCdzIGNvbnRlbnRzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3luY2hyb25pemVyKCkgewotCXN5bmNocm9uaXplciA9IG5ldyBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcih0aGlzKTsKLX0KLS8qKgotICogTm90aWZ5IGFsbCBKRE9NQWRhcHRlcnMgd2hpY2ggdXNlIHRoZSBzYW1lIHRhcmdldCBJQ29tcGlsYXRpb25Vbml0Ci0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDQ6NDU6NDMgUE0pCi0gKi8KLXB1YmxpYyB2b2lkIG5vdGlmeUNvbnRlbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgdGFyZ2V0Q1UpIHsKLQotCWlmICh0YXJnZXRDVSA9PSBudWxsIHx8IHJlZmxlY3RlZC52YWx1ZXMoKT09bnVsbCkgcmV0dXJuIDsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCXRyeSB7Ci0JCUl0ZXJhdG9yIGkgPSByZWZsZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgYSA9IGkubmV4dCgpIDsKLQkJCWlmIChhIGluc3RhbmNlb2YgSkRPTUFkYXB0b3IpIHsKLQkJCQlKRE9NQWRhcHRvciBhZGFwdG9yID0gKEpET01BZGFwdG9yKSBhOwotCQkJCUlNZW1iZXIgcmVmbGVjdGlvblNvdXJjZSA9IChJTWVtYmVyKSBhZGFwdG9yLmdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGFkYXB0ZXJDVSA9IG51bGwgOwotCQkJCWlmIChyZWZsZWN0aW9uU291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJICAgYWRhcHRlckNVID0gcmVmbGVjdGlvblNvdXJjZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCX0KLQkJCQlpZiAoYWRhcHRlckNVICE9IG51bGwgJiYgdGFyZ2V0Q1UuZXF1YWxzKGFkYXB0ZXJDVSkpIHsKLQkJCSAgICAgICBhZGFwdG9yLmNvbnRlbnRDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsgIAkKLQl9Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEBwYXJhbSBuZXdKYXZhUHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QKLSAqLwotcHVibGljIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IG5ld0phdmFQcm9qZWN0KSB7Ci0JamF2YVByb2plY3QgPSBuZXdKYXZhUHJvamVjdDsKLQlpZiAobmV3SmF2YVByb2plY3QgIT0gbnVsbCAmJiBzeW5jaHJvbml6ZXIgPT0gbnVsbCkKLQkJaW5pdGlhbGl6ZVN5bmNocm9uaXplcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1ldGhvZEpET01BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjg3YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLQotLyoqCi0gKiBKYXZhIE1ldGhvZCBSZWZsZWN0aW9uIEFkYXB0ZXIgZm9yIEpET00gKGkuZS4gSkRUIG1vZGVsKQotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTWV0aG9kSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhTWV0aG9kQWRhcHRlciAgewotCi0JLyoKLQkgKiBTdGVwIGlkcyB1c2VkIGZvciBUaW1lclRlc3RzIG9mIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9NRVRIT0QgPSAiUmVmbGVjdCBKRE9NIE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgcGFyZW50VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YU1ldGhvZEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCwgd29ya2luZ1Byb2plY3QpOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCWNsZWFyU291cmNlKCk7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCQltZXRob2Quc2V0SXNHZW5lcmF0ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0RmluYWwoZmFsc2UpOwotCQltZXRob2Quc2V0TmF0aXZlKGZhbHNlKTsKLQkJbWV0aG9kLnNldFN0YXRpYyhmYWxzZSk7Ci0JCW1ldGhvZC5zZXRTeW5jaHJvbml6ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0Q29uc3RydWN0b3IoZmFsc2UpOwotCQltZXRob2Quc2V0QWJzdHJhY3QoZmFsc2UpOwotCQltZXRob2Quc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJbWV0aG9kLnNldEVUeXBlKG51bGwpOwotCQltZXRob2QuZ2V0UGFyYW1ldGVyc0dlbigpLmNsZWFyKCk7Ci0JCW1ldGhvZC5nZXRKYXZhRXhjZXB0aW9uc0dlbigpLmNsZWFyKCk7CQkKLQkJcGFyZW50VHlwZSA9IG51bGw7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJKChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKSkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQkKLQkvKioKLQkgKiBhZGRFeGNlcHRpb25zIC0gcmVmbGVjdCBvdXIgZXhjZXB0aW9uIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25zKCkgewotCQl0cnkgewotCQkJSU1ldGhvZCBzb3VyY2VNZXRob2QgPSBnZXRTb3VyY2VNZXRob2QoKTsKLQkJCVN0cmluZ1tdIGV4Y2VwdGlvbk5hbWVzID0gc291cmNlTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCQlMaXN0IGV4Y2VwdGlvbnMgPSAoKE1ldGhvZEltcGwpIGdldFRhcmdldCgpKS5nZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZUZyb21TaWduYXR1cmUoZXhjZXB0aW9uTmFtZXNbaV0pKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7Ci0JCVN0cmluZ1tdIHBhcm1OYW1lcyA9IG5ldyBTdHJpbmdbMF0sIHBhcm1UeXBlTmFtZXMgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQl0cnkgewotCQkJcGFybU5hbWVzID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCS8vIFRlbXAgaGFjayB0byB3b3JrIGFyb3VuZCBhIEphdmFNb2RlbCBidWcsIGFib3ZlIGNhbGwgb24gYSBCaW5hcnkgbWV0aG9kIG1heSByZXR1cm4gbnVsbAotCQlpZiAocGFybU5hbWVzID09IG51bGwgfHwgcGFybU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwYXJtTmFtZXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1OYW1lc1tpXSA9ICJhcmciICsgaTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JCXJldHVybiBwYXJtTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogYWRkUGFyYW1ldGVycyAtIHJlZmxlY3Qgb3VyIHBhcm1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycygpIHsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCU1ldGhvZEltcGwgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQkJTGlzdCBwYXJhbXMgPSBqYXZhTWV0aG9kVGFyZ2V0LmdldFBhcmFtZXRlcnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJhbXMuYWRkKGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgbnVsbCwgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHBhcm1UeXBlTmFtZXNbaV0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlTWV0aG9kID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcyB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRhcmdldE1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldE1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAocGEgIT0gbnVsbCkKLQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcm1UeXBlU2lnbmF0dXJlcyAtIHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzIChpbiBTaWduYXR1cmUgZm9ybWF0KSBmb3Igb3VyIHBhcmFtZXRlciB0eXBlcyBGb3IgcmVmbGVjdGlvbiBwdXJwb3Nlcywgd2UgY2FuIG9ubHkgcmVseSBvbgotCSAqIG91ciBVVUlELCBzaW5jZSBvdXIgcGFybXMgbWF5IG5vdCB5ZXQgYmUga25vd24uIHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5Tb3VyY2VNYXBwZXIuY29udmVydFR5cGVOYW1lc1RvU2lncygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcm1UeXBlU2lnbmF0dXJlcygpIHsKLQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJU3RyaW5nW10gdHlwZU5hbWVzID0gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCgoWE1JUmVzb3VyY2UpIGphdmFNZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFNZXRob2RUYXJnZXQpKTsKLQkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCWludCBuID0gdHlwZU5hbWVzLmxlbmd0aDsKLQkJaWYgKG4gPT0gMCkKLQkJCXJldHVybiBlbXB0eVN0cmluZ0FycmF5OwotCQlTdHJpbmdbXSB0eXBlU2lncyA9IG5ldyBTdHJpbmdbbl07Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotCQkJCXR5cGVTaWdzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUobmV3IFN0cmluZyh0eXBlTmFtZXNbaV0pLCBnZXRQYXJlbnRUeXBlKCkuaXNCaW5hcnkoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0eXBlU2lnczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VNZXRob2QoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VNZXRob2QgIT0gbnVsbDsKLSAgICB9Ci0KLQkvKgotCSAqIFVzZWQgYnkgSmF2YSBDbGFzcyBKRE9NIGFkYXB0ZXIgdG8gY3JlYXRlIGFuZCBzZXQgd2l0aCBhIHNvdXJjZSBtZXRob2QvCi0JICovCQotCXB1YmxpYyB2b2lkIHByaW1TZXRNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLQkJc291cmNlTWV0aG9kID0gbWV0aG9kOwotCX0KLQkvKioKLQkgKiBnZXRzb3VyY2VNZXRob2QgLSByZXR1cm4gdGhlIElNZXRob2Qgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgbWV0aG9kCi0JICovCi0JcHVibGljIElNZXRob2QgZ2V0U291cmNlTWV0aG9kKCkgewotCQlpZiAoKHNvdXJjZU1ldGhvZCA9PSBudWxsKSB8fCAoIXNvdXJjZU1ldGhvZC5leGlzdHMoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJSVR5cGUgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1OYW1lcyA9IHRoaXMuZ2V0UGFybVR5cGVTaWduYXR1cmVzKCk7Ci0JCQkJCXNvdXJjZU1ldGhvZCA9IEpET01TZWFyY2hIZWxwZXIuc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QocGFyZW50LCAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSwgcGFybU5hbWVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VNZXRob2Q7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkgewotCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IG1ldGhvZC5nZXRKYXZhQ2xhc3MoKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUpET01BZGFwdG9yIGNsYXNzQWRhcHRvciA9IChKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCQkJCWlmIChjbGFzc0FkYXB0b3IgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNsYXNzQWRhcHRvci5nZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4gb24gZW50cnk6IFVVSUQsIG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwKLQkgKiBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuIE1ldGhvZCBhZGFwdG9yOiAtIHNldCBtb2RpZmllcnMgLSBzZXQgbmFtZSAtIHNldCByZXR1cm4gdHlwZSAtIGFkZCBwYXJhbWV0ZXJzIC0gYWRkIGV4Y2VwdGlvbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCXRyeSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EKTsKLQkJCWlmIChpc1Jlc291cmNlTG9hZGVkKCkgJiYgZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0U291cmNlTWV0aG9kKCkgIT0gbnVsbCAmJiBzb3VyY2VNZXRob2QuZXhpc3RzKCkpIHsKLQkJCQlzZXRNb2RpZmllcnMoKTsKLQkJCQlzZXROYW1pbmcoKTsKLQkJCQlzZXRSZXR1cm5UeXBlKCk7Ci0JCQkJYWRkUGFyYW1ldGVycygpOwotCQkJCWFkZEV4Y2VwdGlvbnMoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZ2VuZXJhdGVkIGZsYWcgaWYgQGdlbmVyYXRlZCBpcyBmb3VuZCBpbiB0aGUgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEdlbmVyYXRlZEZsYWcoKSB7Ci0JCU1ldGhvZCBtZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKE1ldGhvZC5HRU5FUkFURURfQ09NTUVOVF9UQUcpOwotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCW1ldGhvZFRhcmdldC5zZXRJc0dlbmVyYXRlZCh0cnVlKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfU2V0dGluZ19HZW5GbGFnX0VSUk9SXyIsIG5ldyBPYmplY3RbXQotCQkJLy8geygoWE1JUmVzb3VyY2UpbWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChtZXRob2RUYXJnZXQpLCBucGUuZ2V0TWVzc2FnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gImVycm9yIHNldHRpbmcgdGhlIGdlbmVyYXRlZCBmbGFnIG9uCi0JCQkvLyB7MH0sIGV4Y2VwdGlvbjogezF9IgotCQl9Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyI3JlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkpIHsKLQkJCXNldEdlbmVyYXRlZEZsYWcoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpKSB7Ci0JCQlTdHJpbmcgW10gcGFyYW1OYW1lcyA9IGdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCQlMaXN0IHBhcmFtID0gKChNZXRob2RJbXBsKWdldFRhcmdldCgpKS5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKEphdmFQYXJhbWV0ZXIpcGFyYW0uZ2V0KGkpKS5zZXROYW1lKHBhcmFtTmFtZXNbaV0pOwkJCQkKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCU1ldGhvZCBtZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJdHJ5IHsKLQkJCW1ldGhvZFRhcmdldC5zZXRGaW5hbChGbGFncy5pc0ZpbmFsKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXROYXRpdmUoRmxhZ3MuaXNOYXRpdmUoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldFN0YXRpYyhGbGFncy5pc1N0YXRpYyhnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0U3luY2hyb25pemVkKEZsYWdzLmlzU3luY2hyb25pemVkKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXRDb25zdHJ1Y3RvcihnZXRTb3VyY2VNZXRob2QoKS5pc0NvbnN0cnVjdG9yKCkpOwotCi0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJLy9TZXQgYWJzdHJhY3QKLQkJCWlmIChqYXZhQ2xhc3MuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gVHlwZUtpbmQuSU5URVJGQUNFKQotCQkJCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdCh0cnVlKTsKLQkJCWVsc2UKLQkJCQltZXRob2RUYXJnZXQuc2V0QWJzdHJhY3QoRmxhZ3MuaXNBYnN0cmFjdChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQkvLyBTZXQgdmlzaWJpbGl0eQotCQkJaWYgKGphdmFDbGFzcy5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0UgfHwgRmxhZ3MuaXNQdWJsaWMoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1ByaXZhdGUoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcm90ZWN0ZWQoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCQllbHNlCi0JCQkJLy9WaXNpYmlsaXR5IG11c3QgYmUgcGFja2FnZQotCQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJIkVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7ICgoWE1JUmVzb3VyY2UpIG1ldGhvZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQobWV0aG9kVGFyZ2V0KSwgbnBlLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0sIGV4Y2VwdGlvbjogezF9IgotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUgLSBxdWFsaWZpZWQgbmFtZSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzIC0gSUQgLSBuYW1lLWJhc2VkIFVVSUQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCS8vCi0JCS8vCW5hbWluZyBpcyBjdXJyZW50bHkgYSBuby1vcCBzaW5jZSB0aGUgbmFtZSBhbmQgVVVJRCBtdXN0IGJlIHNldCBwcmlvciB0byByZWZsZWN0aW9uCi0JCS8vCS4uLmFuZCBJRCBpcyByZWR1bmRhbnQgd2l0aCBVVUlELgotCQkvLwlqYXZhRmllbGRUYXJnZXQuc2V0SUQocGFyZW50LmdldFF1YWxpZmllZE5hbWUoKSArICJfIiArIGphdmFGaWVsZFRhcmdldC5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHJldHVybiB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5UeXBlKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21TaWduYXR1cmUoZ2V0U291cmNlTWV0aG9kKCkuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJamF2YU1ldGhvZFRhcmdldC5zZXRFVHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYodHlwZU5hbWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzMvMjAwMSAxMDowODozNCBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U291cmNlTWV0aG9kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlTWV0aG9kKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QgbmV3U291cmNlTWV0aG9kKSB7Ci0JCXNvdXJjZU1ldGhvZCA9IG5ld1NvdXJjZU1ldGhvZDsKLQl9Ci0JCi0JLyoKLQkgKiBPdmVycmlkZSB0byB0b2xlcmF0ZSBKREsgNSB2YXJpYWJsZSB0eXBlcy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkpET01BZGFwdG9yI3R5cGVOYW1lRnJvbVNpZ25hdHVyZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCVN0cmluZyBlcmFzdXJlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVyYXN1cmUgPSBTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUodHlwZVNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RoZSBzaWduYXR1cmUgaXMgbm90IHRoZSBjb3JyZWN0IGZvcm1hdCBmb3IgYSB2YXJpYWJsZS4KLQkJfQotCQlpZiAoZXJhc3VyZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gbnVsbDsKLQkJCVN0cmluZyByZXNvbHZlZFZhcmlhYmxlID0gbnVsbDsKLQkJCQotCQkJaW50IGFycmF5Q291bnQgPSBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChlcmFzdXJlKTsKLQkJCWlmIChhcnJheUNvdW50ID4gMCkgewotCQkJCS8vV2UgaGF2ZSBhbiBhcnJheS4gIENoZWNrIGlmIHRoZSBlbGVtZW50IHR5cGUgaXMgYSB2YXJpYWJsZS4KLQkJCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKGVyYXN1cmUpOwotCQkJCXZhcmlhYmxlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhlbGVtZW50VHlwZU5hbWUpOwotCQkJCXJlc29sdmVkVmFyaWFibGUgPSByZXNvbHZlVmFyaWFibGVOYW1lKGVyYXN1cmUsIHZhcmlhYmxlTmFtZSk7Ci0JCQkJaWYgKHJlc29sdmVkVmFyaWFibGUgIT0gbnVsbCkgewotCQkJCQkvL0FkZCBhcnJheSBpbmZvLgotCQkJCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIocmVzb2x2ZWRWYXJpYWJsZSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlDb3VudDsgaSsrKSB7Ci0JCQkJCQliLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlc29sdmVkVmFyaWFibGUgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YXJpYWJsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZSk7Ci0JCQkJLy9OZWVkIHRvIHJlc29sdmUgdGhlIHZhcmlhYmxlLgotCQkJCXJlc29sdmVkVmFyaWFibGUgPSByZXNvbHZlVmFyaWFibGVOYW1lKGVyYXN1cmUsIHZhcmlhYmxlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAocmVzb2x2ZWRWYXJpYWJsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnR5cGVOYW1lRnJvbVNpZ25hdHVyZShlcmFzdXJlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc29sdmVkVmFyaWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnR5cGVOYW1lRnJvbVNpZ25hdHVyZSh0eXBlU2lnbmF0dXJlKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVWYXJpYWJsZU5hbWUoU3RyaW5nIGVyYXN1cmUsIFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKLQkJSU1ldGhvZCBtZXRob2QgPSBnZXRTb3VyY2VNZXRob2QoKTsKLQkJSVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlUGFyYW1ldGVycyA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZTEpIHsKLQkJCS8vRmFpbGVkIHRvIHJldHJpZXZlIHR5cGUgcGFyYW1ldGVycyBmb3IgYW55IG51bWJlciBvZiByZWFzb25zLgotCQl9Ci0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IG51bGw7Ci0JCWlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZVBhcmFtZXRlcnNbaV0uZXhpc3RzKCkgJiYgdmFyaWFibGVOYW1lLmVxdWFscyh0eXBlUGFyYW1ldGVyc1tpXS5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQl0eXBlUGFyYW0gPSB0eXBlUGFyYW1ldGVyc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVQYXJhbSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gYm91bmRzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlib3VuZHMgPSB0eXBlUGFyYW0uZ2V0Qm91bmRzKCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKGJvdW5kcyAhPSBudWxsICYmIGJvdW5kcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXJldHVybiBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUoYm91bmRzWzBdLCBnZXRUeXBlKCksIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuICJqYXZhLmxhbmcuT2JqZWN0IjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gbWV0aG9kLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpCi0JCXsKLQkJCXRyeSB7Ci0JCQkJdHlwZVBhcmFtZXRlcnMgPSAoKElUeXBlKXBhcmVudCkuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCS8vRmFpbGVkIHRvIHJldHJpZXZlIHR5cGUgcGFyYW1ldGVycyBmb3IgYW55IG51bWJlciBvZiByZWFzb25zLgotCQkJfQotCQl9Ci0JCWlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZVBhcmFtZXRlcnNbaV0uZXhpc3RzKCkgJiYgdmFyaWFibGVOYW1lLmVxdWFscyh0eXBlUGFyYW1ldGVyc1tpXS5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQl0eXBlUGFyYW0gPSB0eXBlUGFyYW1ldGVyc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVQYXJhbSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gYm91bmRzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlib3VuZHMgPSB0eXBlUGFyYW0uZ2V0Qm91bmRzKCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKGJvdW5kcyAhPSBudWxsICYmIGJvdW5kcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXJldHVybiBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUoYm91bmRzWzBdLCBnZXRUeXBlKCksIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuICJqYXZhLmxhbmcuT2JqZWN0IjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzUwOGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzMxLzIwMDAgMToxMzoxMiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkphdmFNb2RlbExpc3RlbmVyfSBpbnN0ZWFkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsTGlzdGVuZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmF2YU1vZGVsTGlzdGVuZXIgewotCi0JLyoqCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIEphdmFNb2RlbExpc3RlbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudHNUb0xpc3RlbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcihpbnQgZXZlbnRzVG9MaXN0ZW4pIHsKLQkJc3VwZXIoZXZlbnRzVG9MaXN0ZW4pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhZDViNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KYXZhTW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzEvMjAwMCAxMTo0MjowNSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGV4dGVuZHMgSmF2YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGZBZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoZWRBbGwgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCBmbHVzaFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGZsdXNoVHlwZVBsdXNJbm5lciA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBub3RpZmljYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKgotCSAqIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyKEphdmFKRE9NQWRhcHRlckZhY3Rvcnkgc3luY2hyb25pemVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IHN5bmNocm9uaXplZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQkKLQkvKioKLQkgKiBUZWxsIHRoZSByZWZsZWN0aW9uIGZhY3RvcnkgdG8gZmx1c2ggdGhlIHBhc3NlZCBJVHlwZQotCSAqLwotCXByb3RlY3RlZCBOb3RpZmljYXRpb24gZG9GbHVzaChJVHlwZSBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQkvKgotCSAqIEZsdXNoIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCBhbnkgaW5uZXIgY2xhc3NlcyBzaW5jZSB3ZSBkb24ndCBpZiB0aGV5IG1heSBvciBtYXkgbm90IG9mIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBkb0ZsdXNoKElDb21waWxhdGlvblVuaXQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFJlZmxlY3Rpb25QbHVzSW5uZXJOb05vdGlmaWNhdGlvbihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSVR5cGUgZWxlbWVudCkgewotCQlpZiAoIWZsdXNoVHlwZXMuY29udGFpbnMoZWxlbWVudCkpCi0JCQlmbHVzaFR5cGVzLmFkZChlbGVtZW50KTsKLQl9Ci0JLyoKLQkgKiBmbHVzaCB0aGUgY29tcGlsYXRpb24gdW5pdC4gU2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpbm5lciBjbGFzc2VzIG1heSBhbHNvCi0JICogb2YgYmVlbiBhZmZlY3RlZCwgdGhleSB0byB3aWxsIGJlIGZsdXNoZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWlmICghZmx1c2hUeXBlUGx1c0lubmVyLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJZmx1c2hUeXBlUGx1c0lubmVyLmFkZChlbGVtZW50KTsJCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24ocGFja2FnZU5hbWUsIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSk7Ci0JfQotCXByb3RlY3RlZCBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZkFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCA6IHsKLQkJCQkvLyBBIGZpbGUgc2F2ZSBoYWQgb2NjdXJyZWQuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGN1cnJlbnRseSB3b3JraW5nIGNvcHkgb3Igbm90LgotCQkJCS8vIEl0IG1lYW5zIHNvbWV0aGluZyBoYXMgY2hhbmdlZCB0byB0aGUgZmlsZSBvbiBkaXNrLCBidXQgZG9uJ3Qga25vdyB3aGF0LgotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgIT0gMCkgewotCQkJCQlmbHVzaChlbGVtZW50KTsJLy8gRmx1c2ggZXZlcnl0aGluZywgaW5jbHVkaW5nIGlubmVyIGNsYXNzZXMuCQkJCQkKLQkJCQl9IGVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSA9PSAwICYmIAotCQkJCQkJKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOKSAhPSAwKSAgLy9BIHR5cGUgbWF5IGhhdmUgYmVlbiBhZGRlZCBvciByZW1vdmVkLgotCQkJCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOgotCQkJCWlmICghZWxlbWVudC5pc1dvcmtpbmdDb3B5KCkpCi0JCQkJCWRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElKYXZhUHJvamVjdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoaXNJbkNsYXNzcGF0aChlbGVtZW50KSkgewotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIHx8IChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xPU0VEKSAhPSAwKSkgewotCQkJCWlmIChlbGVtZW50LmVxdWFscyhnZXRBZGFwdGVyRmFjdG9yeSgpLmdldEphdmFQcm9qZWN0KCkpKQotCQkJCQlzdG9wU3luY2hyb25pemVyKCk7Ci0JCQkJZWxzZQotCQkJCQlmbHVzaEFsbCgpOyAvL2Fub3RoZXIgZGVwZW5kZW50IHByb2plY3QgaGFzIGNoYW5nZWQgc28gZmx1c2ggYWxsIHRvIGJlIHNhZmUKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCB8fCBpc0NsYXNzcGF0aFJlc291cmNlQ2hhbmdlKGRlbHRhKSkgewotCQkJCWZsdXNoQWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQkJfQotCX0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ2xhc3NGaWxlIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQlpZiAoa2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIHx8IGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCS8vIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRvdGFsbHkgcmVtb3ZlZCBvciBqdXN0IG1vdmVkIHNvbWV3aGVyZSBlbHNlLCB3ZSB3aWxsIGNsZWFyIG91dCBhbmQgcmVtb3ZlIHRoZQotCQkJLy8gYWRhcHRlciBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGEgcmVuYW1lIHdoaWNoIHdvdWxkIGJlIGEgZGlmZmVyZW50IGNsYXNzLgotCQkJLy8gQ3VycmVudGx5IHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZGVsZXRlZCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGZpbmQgdGhlIHR5cGVzIGluIHRoZSB1bml0IHRvIHJlbW92ZS4KLQkJCS8vIFNvIGluc3RlYWQgd2UgYXNrIGZhY3RvcnkgdG8gcmVtb3ZlIGFsbCBpdCBhbnkgdGhhdCBzdGFydCB3aXRoIGl0IHBsdXMgZm9yIGlubmVyIGNsYXNzZXMuCi0JCQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSk7Ci0JCQlyZXR1cm47IC8vIFNpbmNlIHRoZSBjbGFzc2ZpbGUgd2FzIHJlbW92ZWQgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiAoYWN0dWFsbHkgdGhlIGNoaWxkcmVuIGxpc3Qgd2lsbCBiZSBlbXB0eQotCQl9Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBjaGlsZHJlbi5sZW5ndGg7IGlpKyspIHsKLQkJCXByb2Nlc3NEZWx0YShjaGlsZHJlbltpaV0pOwotCQl9Ci0JfQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGZsdXNoZWRBbGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsYXNzUGF0aENoYW5nZShkZWx0YSkpCi0JCQlmbHVzaEFsbCgpOwotCQllbHNlCi0JCQlzdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0JCi0JLyogCi0JICogV2Ugd2lsbCBmb3JjZSB0aGUgZmx1c2hpbmcgb2YgYWxsIGFkYXB0b3JzIGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIGEgdHlwZSB3YXMgcmVmbGVjdGVkIHByaW9yIHRvIHRoZSBwYWNrYWdlIGV4aXN0aW5nIG9yCi0JICogaWYgdGhlIHBhY2thZ2UgaXMgZGVsZXRlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI3Byb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEIDogCi0JCQkJLy8gRXZlbiB0aG91Z2ggYWRkZWQgdGhlcmUgaXMgcG9zc2liaWxpdHkgdGhhdCBwYWNrYWdlIGV4aXN0cyBpbiBvdGhlciByb290IGJ1dCB0aGlzCi0JCQkJLy8gb25lIG1heSBub3cgdGFrZSBwcmlvcml0eSwgc28gd2Ugd2lsbCBjbGVhciB0aGUgcGFja2FnZSBhbnl3YXkuCi0JCQkJZmx1c2hQYWNrYWdlKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpLCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgOgotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hQYWNrYWdlKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpLCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQsIGRlbHRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVR5cGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWlmIChraW5kID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgfHwga2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkgewotCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJZmx1c2goZWxlbWVudCk7Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCQkJLy8gTm90ZSwgaWYgYSBtZXRob2QgZWxlbWVudCBvciBhIGZpZWxkIHdhcyBjaGFuZ2VkLCB0aGVyZSBtYXkgYmUgZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpCi0JCQkvLyAgICAgICB0aGF0IHdpbGwgaGF2ZSB0byBiZSBwcm9jZXNzZWQgaWYgd2UgYXJlIHRvIHVwZGF0ZSB0aGUgSmF2YU1ldGhvZC9KYXZhRmllbGQgSkRPTUFkYXB0b3Igcy4JCi0JCX0KLQl9Ci0JLyoqCi0JICogR2l2ZW4gdGhhdCBhbiBJVHlwZSBkb2VzIG5vdCBleGlzdHMgYW55bW9yZSwgYXNzdW1lCi0JICogdGhhdCB0aGUgdHlwZSdzIG5hbWUgaXMgcGFja2FnZS5maWxlbmFtZSAod2l0aG91dCB0aGUgLmphdmEpCi0JICogSWYgd2UgYXJlIHdyb25nIChpZiwgdGhlbiBhIHJhcmUgY2FzZSksICB3ZSB3aWxsIGZsdXNoLgotCSAqIE5leHQgYWNjZXNzIHdpbGwgaW5kdWNlIGEgcmVmbGVjdGlvbiBhdHRlbXB0LgotCSAqIEBkZXByZWNhdGVkIFRoaXMgZG9lc24ndCBsb29rIGxpa2UgaXQgaXMgZXZlciBjYWxsZWQuIEl0IHNvbWVvbmUgZWxzZSBjYWxscyBpdCwgcGxlYXNlIGNvbnRhY3QgZGV2ZWxvcG1lbnQgdG8gc2VlIGlmIHJpZ2h0IG1ldGhvZCB0byBiZSBjYWxsZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbW92ZU9yQWRkKElDb21waWxhdGlvblVuaXQgZWxlbWVudCkgewotCQlkaXNBc3NvY2lhdGVTb3VyY2UoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUlUeXBlIHByaW1hcnkgPSBjdS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJaWYgKHByaW1hcnkgIT0gbnVsbCkKLQkJCXJldHVybiBwcmltYXJ5LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQllbHNlIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCQkvLyBKdXN0IHN0cmlwIG9mZiBleHRlbnNpb24uIFRoZXJlIGlzIGFjdHVhbGx5IGEgbW9yZSBjb21wbGljYXRlZCB0ZXN0IGZvciAiamF2YSBsaWtlIGV4dGVuc3Rpb25zIiBidXQgSkRUIGhhcyB0aGF0IGhpZGRlblwKLQkJCS8vIHNvIHdlIHdpbGwganVzdCBndWVzcyBhbmQgdGFrZSBvZmYgdGhlIGV4dGVuc2lvbi4KLQkJCWludCBpZHggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGlkeCAhPSAtMSkKLQkJCQlmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBpZHgpOwotCQkJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudCkgY3UuZ2V0UGFyZW50KCkpLmdldEVsZW1lbnROYW1lKCkrJy4nK2ZpbGVuYW1lOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChJQ2xhc3NGaWxlIGNmKSB7Ci0JCQotCQlyZXR1cm4gY2YuZ2V0VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPD0gNSB8fCAhbmFtZS5zdWJzdHJpbmcobmFtZS5sZW5ndGgoKSAtIDUpLmVxdWFscygiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBTaG91bGQgbm90IGJlIGhlcmUsIAotCQkJTG9nZ2VyIGxvZ2dlciA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkKLQkJCQlsb2dnZXIubG9nKCJJbnZhbGlkIC5qYXZhIGZpbGU6ICIgKyBuYW1lLCBMZXZlbC5GSU5FKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gTWFrZSBhIGd1ZXNzLCBhdCB3b3JzdCBjYXNlLCBub3RoaW5nIHdpbGwgY29tZSBvdXQgb2YgdGhpcy4KLQkJCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID49IDApCi0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArICIuamF2YSI7IC8vIHJlbmFtZSB0aGUgZXh0ZW5zaW9uIHRvIC5qYXZhIC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQluYW1lID0gbmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpID09IG51bGwgfHwgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOwotCQllbHNlCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBmcm9tIGxpc3RlbmluZyB0byBhbnkgbW9yZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTeW5jaHJvbml6ZXIoKSB7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJCXN1cGVyLmVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJCWZsdXNoVHlwZXMoKTsKLQkJCXByb2Nlc3NOb3RpZmljYXRpb25zKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmbHVzaGVkQWxsID0gZmFsc2U7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmx1c2hUeXBlcygpIHsKLQkJaWYgKCFmbHVzaFR5cGVzLmlzRW1wdHkoKSkgewotCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQlOb3RpZmljYXRpb24gbm90OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbHVzaFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdHlwZSA9IChJVHlwZSkgZmx1c2hUeXBlcy5nZXQoaSk7Ci0JCQkJbm90ID0gZG9GbHVzaCh0eXBlKTsKLQkJCQlpZiAobm90ICE9IG51bGwpCi0JCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmbHVzaFR5cGVQbHVzSW5uZXIuaXNFbXB0eSgpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBudWxsOwotCQkJTm90aWZpY2F0aW9uIG5vdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmx1c2hUeXBlUGx1c0lubmVyLnNpemUoKTsgaSsrKSB7Ci0JCQkJdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmbHVzaFR5cGVQbHVzSW5uZXIuZ2V0KGkpOwotCQkJCW5vdCA9IGRvRmx1c2godW5pdCk7Ci0JCQkJaWYgKG5vdCAhPSBudWxsKQotCQkJCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCQkJfQotCQl9CQkKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc05vdGlmaWNhdGlvbnMoKSB7Ci0JCU5vdGlmaWVyIG5vdGlmaWVyOwotCQlOb3RpZmljYXRpb24gbm90OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdCA9IChOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbnMuZ2V0KGkpOwotCQkJbm90aWZpZXIgPSAoTm90aWZpZXIpIG5vdC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbm90aWZpZXIuZU5vdGlmeShub3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZyhlKTsgLy9jYXRjaCBleGNlcHRpb25zIHNvIGFsbCBub3RpZmljYXRpb25zIGFyZSBwcm9jZXNzZWQKLQkJCQl9IAotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlOb3RpZmljYXRpb24gbm90ID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5kaXNBc3NvY2lhdGVTb3VyY2UocXVhbGlmaWVkTmFtZSwgZmFsc2UpOwotCQlpZiAobm90ICE9IG51bGwpCi0JCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJTm90aWZpY2F0aW9uIG5vdCA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKHF1YWxpZmllZE5hbWUsIGZhbHNlKTsKLQkJaWYgKG5vdCAhPSBudWxsKQotCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmx1c2hBbGwoKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpKTsKLQkJZmx1c2hlZEFsbCA9IHRydWU7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoIWZsdXNoZWRBbGwpCi0JCQlzdXBlci5wcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI3Byb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKCFmbHVzaGVkQWxsKQotCQkJc3VwZXIucHJvY2Vzc0RlbHRhKGRlbHRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0lKYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMzEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDY6MjggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFQcm9qZWN0SW5mbyB7Ci1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZVBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YUVNRk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZiYzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotLyoKLSAqICRSQ1NmaWxlOiBKYXZhRU1GTmF0dXJlLmphdmEsdiAkICRSZXZpc2lvbjogMS4xNyAkICREYXRlOiAyMDA2LzA5LzE0IDE4OjMxOjA4ICQKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5JSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIEphdmFFTUZOYXR1cmUgZXh0ZW5kcyBFTUZOYXR1cmUgaW1wbGVtZW50cyBJSmF2YUVNRk5hdHVyZSB7Ci0vKioKLSAqIEphdmFNT0ZOYXR1cmVSdW50aW1lIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhRU1GTmF0dXJlKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgY3JlYXRlUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYoIWhhc1J1bnRpbWUocHJvamVjdCkpCi0JCWlmIChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZXhpc3RzKCkpCi0JCQlhZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0KLQlyZXR1cm4gZ2V0UnVudGltZShwcm9qZWN0KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hdHVyZSdzIElELgotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYXR1cmVJRCgpIHsKLQlyZXR1cm4gSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgotICovCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQlyZXR1cm4gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRmlyc3QgY2hlY2sgZm9yIHJlZ2lzdGVyZWQgbmF0dXJlcy4KLSAqIEByZXR1cm4gSUphdmFNT0ZOYXR1cmVSdW50aW1lCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCW5hdHVyZSA9IHByaW1HZXRSdW50aW1lKHByb2plY3QpOwotCXJldHVybiBuYXR1cmU7Ci19Ci0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvamVjdCBoYXMgYSBydW50aW1lIGNyZWF0ZWQgb24gaXQuCi0gKiBDaGVjayBmb3IgcmVnaXN0ZXJlZCBuYXR1cmVzIGZpcnN0LgotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCXJldHVybiBwcmltSGFzUnVudGltZShwcm9qZWN0KTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotCi19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRG8gbm90IGNoZWNrIGZvciBvdGhlciByZWdpc3RlcmVkIHR5cGVzLgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgcHJpbUdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiAoSmF2YUVNRk5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHByb2plY3QgaGFzIGEgcnVudGltZSBjcmVhdGVkIG9uIGl0LgotICogRG8gbm90IGNoZWNrIGZvciByZWdpc3RlcmVkIG5hdHVyZSBpZHMuCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJpbUhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi0vKioKLSAqIHByaW1hcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpIHsKLQlpZiAoZW1mQ29udGV4dCA9PSBhTmF0dXJlKSByZXR1cm47Ci0JZW1mQ29udGV4dCA9IGFOYXR1cmU7Ci0JUmVzb3VyY2VTZXQgc2V0ID0gYU5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCXNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KEphdmFYTUlGYWN0b3J5LlNDSEVNRSwgSmF2YVhNSUZhY3RvcnkuSU5TVEFOQ0UpOwkKLQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQljb25maWd1cmVVUklDb252ZXJ0ZXIoY29udik7Ci0JYWRkQWRhcHRlckZhY3RvcmllcyhzZXQpOwkKLX0KLQotLyoqCi0gKiBzZWNvbmRhcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCXByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGFOYXR1cmUpOwotfQotCi0vKioKLSAqIFJlbW92ZSB0aGUgcHJvamVjdCBhcyBhIGNvbnRhaW5lciBmcm9tIHRoZSBjb252ZXJ0ZXIgYW5kIGFkZAotICogdGhlIHNvdXJjZSBmb2xkZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVVSSUNvbnZlcnRlcihXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udikgewotCWNvbnYucmVtb3ZlSW5wdXRDb250YWluZXIoZ2V0UHJvamVjdCgpKTsKLQljb252LmFkZElucHV0Q29udGFpbmVyKGdldEVNRlJvb3QoKSk7Ci19Ci0KLS8qKgotICogQWRkIEFkYXB0b3IgZmFjdG9yaWVzIHRvIGFDb250ZXh0IHdoaWNoIGlzIG5vdwotICogYmVpbmcgdXNlZCBmb3IgdGhpcyBuYXR1cmUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoUmVzb3VyY2VTZXQgYVNldCkgewotCWFkZEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcmllcyhhU2V0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yaWVzKFJlc291cmNlU2V0IGFTZXQpIHsKLQlMaXN0IGZhY3RvcmllcyA9IGFTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCS8vIFRoZSBjb250ZXh0IG1heSBhbHJlYWR5IGhhdmUgYSBKYXZhUmVmbGVjdGlvbiBhZGFwdG9yIGZhY3RvcnksIHNvIHJlbW92ZSBpdAotCS8vIFRoaXMgc2hvdWxkIG1heWJlIGJlIGNvbnNpZGVyZWQgYSBsb2dpYyBlcnJvciwgYnV0IHdlIGNhbiByZWNvdmVyIGVhc2lseQotCWlmICghZmFjdG9yaWVzLmlzRW1wdHkoKSkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGZhY3RvcmllcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJZmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0KLQlmYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0b3J5KTsKLX0KLQotcHJpdmF0ZSBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZSNzZXRQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotICovCi1wdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQlzdXBlci5zZXRQcm9qZWN0KG5ld1Byb2plY3QpOwotCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IEphdmFKRE9NQWRhcHRlckZhY3RvcnkoSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTZiMGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjsKLS8qCi0gKiAkUkNTZmlsZTogSmF2YVBsdWdpbi5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTMgJCAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1OCAkCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbC5KYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5FY2xpcHNlTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgYSB0b3AtbGV2ZWwgY2xhc3Mgb2YgdGhlIGphdmEgcGx1Z2luIHRvb2wuCi0gKiAKLSAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBVSSBwbHVnaW5zCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmFQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVBsdWdpbiBJTlNUQU5DRTsKLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIEphdmEgcGx1Z2luIGFuZCBjYWNoZSBpdHMgZGVmYXVsdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBKYXZhUGx1Z2luKCkgewotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkKLQkJCWxvZ2dlciA9IEVjbGlwc2VMb2dnZXIuZ2V0RWNsaXBzZUxvZ2dlcih0aGlzKTsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBKYXZhUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCQlKYXZhQ29udGV4dC5zZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmNsYXNzKTsKLQkJSkVNVXRpbFBsdWdpbi5nZXRQbHVnaW5SZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IEphdmFKREtBZGFwdGVyRmFjdG9yeSgpKTsJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQcm9qZWN0SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQcm9qZWN0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZlNTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjsKLS8qCi0KLQotICovCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDk6MjYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEluZm8gaW1wbGVtZW50cyBJSmF2YVByb2plY3RJbmZvIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0pBVkFfT1VUUFVUX1BBVEggPSAiYmluIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfUEFUSCA9ICJzb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZVBhdGg7Ci0vKioKLSAqIEphdmFQcm9qZWN0SW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVByb2plY3RJbmZvKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTb3VyY2VQYXRoKCkgewotCXJldHVybiBERUZBVUxUX1NPVVJDRV9QQVRIOwotfQotLyoqCi0gKiBHZXQgdGhlIGNsYXNzIHBhdGggZm9yIHRoZSByZWNpZXZlci4gQnkgZGVmYXVsdCBhc2sgdGhlIHRlbXBsYXRlCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFN0cmluZyBnZXRTb3VyY2VQYXRoKCkgewotCWlmIChzb3VyY2VQYXRoID09IG51bGwpCi0JCXNvdXJjZVBhdGggPSBnZXREZWZhdWx0U291cmNlUGF0aCgpOwotCXJldHVybiBzb3VyY2VQYXRoOwotfQotcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmcgcGF0aCkgewotCXNvdXJjZVBhdGggPSBwYXRoOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZmNGUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0FTVEJvdW5kUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULkludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotIAotLyoqCi0gKiBUaGlzIHdvcmtzIG9uIHJlc29sdmVkIEFTVCBub2Rlcy4gSWYgdGhlIG5vZGVzIGhhZCBub3QgYmVlbiByZXNvbHZlZCwgdGhpcyB3aWxsIHJldHVybiBub3RpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUQm91bmRSZXNvbHZlciBleHRlbmRzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULklSZXNvbHZlciNyZXNvbHZlTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgewotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlzd2l0Y2ggKGJpbmRpbmcuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElCaW5kaW5nLlRZUEU6Ci0JCQkJU3RyaW5nIHR5cGVuYW1lID0gZ2V0VHlwZU5hbWUoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCQkJUFROYW1lIHB0bmFtZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE5hbWUoKTsKLQkJCQlwdG5hbWUuc2V0TmFtZSh0eXBlbmFtZSk7Ci0JCQkJcmV0dXJuIHB0bmFtZTsKLQkJCWNhc2UgSUJpbmRpbmcuVkFSSUFCTEU6Ci0JCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJCQlpZiAodmFyaWFibGVCaW5kaW5nLmlzRmllbGQoKSkgewotCQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWModmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycygpKSkgewotCQkJCQkJUFRGaWVsZEFjY2VzcyBmYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCQkJCQkvLyBJZiBqdXN0IGEgc2ltcGxlIG5hbWUsIHRoZW4gaXQgaXMgbGlrZSB0aGlzLmZpZWxkLCBzbyBubyByZWNlaXZlci4gTm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGlzIHlldC4KLQkJCQkJCWlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7Ci0JCQkJCQkJLy8gVGhlcmUgYXJlIHBhcnRzIGJlZm9yZSB0aGlzIG9uZS4gR2V0IHRoZW0gYXMgYW4gZXhwcmVzc2lvbiAoZWl0aGVyIGEgbmFtZSwgb3IgYW5vdGhlciBmaWVsZCBhY2Nlc3MpCi0JCQkJCQkJZmEuc2V0UmVjZWl2ZXIocmVzb2x2ZU5hbWUoKChRdWFsaWZpZWROYW1lKSBuYW1lKS5nZXRRdWFsaWZpZXIoKSkpOwotCQkJCQkJfQotCQkJCQkJZmEuc2V0RmllbGQodmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm4gZmE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvd0ludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsRmllbGRfRVhDXywgbmV3IE9iamVjdFtde3ZhcmlhYmxlQmluZGluZy5nZXROYW1lKCl9KSk7IAotLy8JCQkJCQlwdXNoKG5ldyBQdXNoRmllbGRWYXJpYWJsZSh2YXJpYWJsZUlkLCBnZXRUeXBlU2lnbmF0dXJlKGRlY2xhcmluZ1R5cGVCaW5kaW5nKSwgZkNvdW50ZXIpKTsKLS8vCQkJCQkJcHVzaChuZXcgUHVzaFRoaXMoZ2V0RW5jbG9zaW5nTGV2ZWwobm9kZSwgZGVjbGFyaW5nVHlwZUJpbmRpbmcpKSk7Ci0vLwkJCQkJCXN0b3JlSW5zdHJ1Y3Rpb24oKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLkFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfLCBuZXcgT2JqZWN0W117dmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKX0pKTsgCi0vLwkJCQkJcHVzaChuZXcgUHVzaExvY2FsVmFyaWFibGUodmFyaWFibGVJZCkpOwotCQkJCX0JCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LklSZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKFR5cGUgdHlwZSkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJcmV0dXJuIChiaW5kaW5nICE9IG51bGwpID8gZ2V0VHlwZU5hbWUoYmluZGluZykgOiBudWxsOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlyZXR1cm4gKGJpbmRpbmcgIT0gbnVsbCkgPyBnZXRUeXBlTmFtZShiaW5kaW5nKSA6IG51bGw7IAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlTdHJpbmdCdWZmZXIgbmFtZTsKLQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJbmFtZT0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUeXBlTmFtZSh0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKSk7Ci0JCQlpbnQgZGltZW5zaW9ucz0gdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewotCQkJCW5hbWUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCQl9Ci0JCW5hbWU9IG5ldyBTdHJpbmdCdWZmZXIodHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCXR5cGVCaW5kaW5nPSB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQl3aGlsZSh0eXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnJCcpLmluc2VydCgwLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOwotCQkJdHlwZUJpbmRpbmc9IHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCX0KLQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwgJiYgIXBhY2thZ2VCaW5kaW5nLmlzVW5uYW1lZCgpKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnLicpLmluc2VydCgwLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVRoaXMoKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZVRoaXMoKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUVGhpc0xpdGVyYWwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSUphdmFFTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4ODUzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotIAotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIEphdmEgRU1GIE5hdHVyZSBjb25zdGFudHMuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhRU1GTmF0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRCA9ICJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLkphdmFFTUZOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0phdmFNb2RlbExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM3MjlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0phdmFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLS8qCi0gKiAkUkNTZmlsZTogSmF2YU1vZGVsTGlzdGVuZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAwOC8wNi8zMCAyMTowNjo0MSAkCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlLkpFTVBsdWdpbjsKLQotLyoqCi0gKiBBbiBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIEphdmEgTW9kZWwgY2hhbmdlcy4gSXQgYnJlYWtzIHRoZSBub3RpZmljYXRpb24gdXAgaW50byBpbmRpdmlkdWFsIG1ldGhvZCBjYWxscyB0byBtYWtlIGl0IGVhc2llciB0byB3YWxrCi0gKiB0aGUgbm90aWZpY2F0aW9uIHRyZWUuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBsaXN0ZW5pbmcgb25seSBmb3Ige0BsaW5rIEVsZW1lbnRDaGFuZ2VkRXZlbnQjUE9TVF9DSEFOR0V9IGV2ZW50cy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgcmVzb2x2ZWRDb250YWluZXJzID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXRoaXMoRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggc3VwcGx5aW5nIHRoZSB0eXBlIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudHNUb0xpc3RlbgotCSAqICAgICAgICAgICAgb3InZCB0b2dldGhlciBldmVudCBsaXN0ZW5pbmcgdHlwZXMuIFNlZSB7QGxpbmsgRWxlbWVudENoYW5nZWRFdmVudH0gZm9yIHRoZSB0eXBlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoaW50IGV2ZW50c1RvTGlzdGVuKSB7Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcywgZXZlbnRzVG9MaXN0ZW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIjZWxlbWVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQotCQlwcm9jZXNzRGVsdGEoKElKYXZhRWxlbWVudERlbHRhKSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEdlbmVyYWxseSBkaXNwYXRjaCB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlbHRhLiBOb3JtYWxseSB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIG92ZXJyaWRkZW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGRyZW4oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NEZWx0YShjaGlsZHJlbltpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3VyY2UgY29udGVudCBoYXMgY2hhbmdlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSBvd24gZnVuY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250ZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGEuIFRoaXMgbWV0aG9kIHNob3VsZCBub3JtYWxseSBub3QgYmUgb3ZlcnJpZGRlbi4gT25lCi0JICogdXNhZ2Ugd291bGQgYmUgdG8gYWRkIGRlbHRhIHR5cGVzIHRoYXQgYXJlIHRvIGJlIHByb2Nlc3NlZCBhbmQgZGlzcGF0Y2hlZCBieSB0aGUKLQkgKiBzdWJjbGFzc2VzLiBGb3IgZXhhbXBsZSBhbHNvIGRpc3BhdGNoIG9uIHtAbGluayBJSmF2YUVsZW1lbnQjSU1QT1JUX0NPTlRBSU5FUn0uIFN1YmNsYXNzZXMKLQkgKiBzaG91bGQgY2FsbCA8Y29kZT5zdXBlci5wcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPiBpZiBpdCBpcyBub3Qgb25lIHRoZXkKLQkgKiBhcmUgaW50ZXJlc3RlZCBpbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCS8vIGlmIHRoZSBjbGFzcyBwYXRoIGhhcyBjaGFuZ2VkIHdlIHJlZnJlc2ggdGhlIHJlc29sdmVkIGNvbnRhaW5lciBjYWNoZQotCQlpbnQgZmxhZ3M9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCWlmICgoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgJiYgIXJlc29sdmVkQ29udGFpbmVycy5pc0VtcHR5KCkpewotCQkJcmVzb2x2ZWRDb250YWluZXJzLmNsZWFyKCk7CQkJCi0JCX0KLQotCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJSmF2YU1vZGVsKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUphdmFQcm9qZWN0KSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUNsYXNzRmlsZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJVHlwZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJLy8gTm90ZTogaWYgd2UgYXJlIHRvIHVwZGF0ZSB0aGUgTWV0aG9kL0ZpZWxkIGFkYXB0ZXJzLCB3ZSBzaG91bGQgcHJvY2VzcyB0aGUKLQkJCS8vIElKYXZhRWxlbWVudC5NRVRIT0QgYW5kIElKYXZhRWxlbWVudC5GSUVMRAotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgY2xhc3NmaWxlIGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIEl0IHdpbGwgbm90IHdhbGsgYW55IGNoaWxkcmVuIG9mIHRoZSBkZWx0YSBlaXRoZXIuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0JICogdG8gcGVyZm9ybSB0aGVpciBvd24gZnVuY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ2xhc3NGaWxlIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgY29tcGlsYXRpb24gdW5pdCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQsIElKYXZhRWxlbWVudERlbHRhKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBqYXZhIG1vZGVsIGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGVpciBvd24KLQkgKiBmdW5jdGlvbnMuIElmIHRoZXkgd2lzaCB0byB3YWxrIHRoZSBjaGlsZHJlbiB0aGV5IHNob3VsZCB0aGVuIGFsc28gY2FsbAotCSAqIDxjb2RlPnN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFNb2RlbCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFNb2RlbCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGphdmEgcHJvamVjdCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElKYXZhUHJvamVjdCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcGFja2FnZSBmcmFnbWVudCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQsIElKYXZhRWxlbWVudERlbHRhKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY2hhbmdlZCBldmVudC4gVGhlIGRlZmF1bHQgaXMgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlbHRhLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBwZXJmb3JtIHRoZWlyCi0JICogb3duIGZ1bmN0aW9ucy4gSWYgdGhleSB3aXNoIHRvIHdhbGsgdGhlIGNoaWxkcmVuIHRoZXkgc2hvdWxkIHRoZW4gYWxzbyBjYWxsCi0JICogPGNvZGU+c3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50Um9vdCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBJVHlwZSBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLiBJdCB3aWxsIG5vdCB3YWxrIGFueSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEgZWl0aGVyLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0bwotCSAqIHBlcmZvcm0gdGhlaXIgb3duIGZ1bmN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVR5cGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGRlbHRhIGlzIGEgY2xhc3NwYXRoIGNoYW5nZS4gSS5lLiBzb21ldGhpbmcgYWRkZWQvcmVtb3ZlZC9tb3ZlZCBhcm91bmQgZm9yIHRoZSBjbGFzc3BhdGguIFRoaXMgc2hvdWxkIG9ubHkgYmUKLQkgKiBjYWxsZWQgZm9yIGEgZGVsdGEgdGhhdCBpcyBmb3IgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS4gU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuIG92ZXJyaWRlIG9mCi0JICoge0BsaW5rICNwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290LCBJSmF2YUVsZW1lbnREZWx0YSl9Ci0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBjbGFzc3BhdGggY2hhbmdlIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGFzc1BhdGhDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDApCi0JCQkJfHwgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkgfHwgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVPUkRFUikgIT0gMCkpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBjaGFuZ2UgaXMgdGhpcyBpcyBhIHJhdyBjbGFzc3BhdGggY2hhbmdlLCBvciBpZiBhIGZpbGUgdGhhdCBpcyBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCB3YXMgY2hhbmdlZCB0aGF0IGFsc28gY2FuIG1lYW4gYQotCSAqIHJhdyBjbGFzc3BhdGggY2hhbmdlLiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgZm9yIGEgZGVsdGEgdGhhdCBpcyBmb3IgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCi0JICogPHA+Ci0JICogU2VlIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YS4jRl9DTEFTU1BBVEhfQ0hBTkdFRH0gYW5kIHtAbGluayAjaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKElQYXRoKX0gZm9yIGRldGFpbHMuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlcyA9IGRlbHRhLmdldFJlc291cmNlRGVsdGFzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJcGF0aCA9IHJlc291cmNlc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJaWYgKGlzQWxzb0NsYXNzcGF0aENoYW5nZShwYXRoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIHBhdGggaXMgb25lIHRoYXQgd2hlbiBjaGFuZ2VkIGNhbiByZXN1bHQgaW4gYSBjbGFzc3BhdGggY2hhbmdlLiBUaGlzIGlzIGNhbGxlZCBmcm9tCi0JICoge0BsaW5rICNpc0NsYXNzcGF0aFJlc291cmNlQ2hhbmdlKElKYXZhRWxlbWVudERlbHRhKX0uIFRoZSBmaWxlIG11c3QgYmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmaWxlIGJlaW5nIGNoYW5nZWQgd291bGQgcmVzdWx0IGluIGEgY2xhc3NwYXRoIGNoYW5nZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fsc29DbGFzc3BhdGhDaGFuZ2UoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBnaXZlbiBqYXZhIHByb2plY3QgaXMgaW4gdGhlIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlY3Vyc2l2ZSkuIFRoaXMgY3VycmVudGx5IHdpbGwgbm90IHdhbGsgdGhyb3VnaCBjb250YWluZXJzIChzdWNoIGFzIHRoZQotCSAqIFBERSBjb250YWluZXIpLiBPbmx5IHRocm91Z2ggdGhlIGRpcmVjdCBhbmQgcmVjdXJzaXZlIHByb2plY3QgcmVmZXJlbmNlcy4gVGhlIGphdmEgcHJvamVjdCBpcyBkZXRlcm1pbmVkIGJ5IHN1YmNsYXNzZXMsIHNlZQotCSAqIHtAbGluayAjZ2V0SmF2YVByb2plY3QoKX0uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGlzIGluIGNsYXNzcGF0aCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCUlKYXZhUHJvamVjdCBsaXN0ZW5lckphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJaWYgKGphdmFQcm9qZWN0LmVxdWFscyhsaXN0ZW5lckphdmFQcm9qZWN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gaXNJbkNsYXNzcGF0aChqYXZhUHJvamVjdCwgbGlzdGVuZXJKYXZhUHJvamVjdCwgdHJ1ZSwgbmV3IEhhc2hTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGphdmEgcHJvamVjdCBmb3IgdGhpcyBsaXN0ZW5lci4gU3ViY2xhc3NlcyBtdXN0IHByb3ZpZGUgYSBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0LiA8Y29kZT5udWxsPC9jb2RlPiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoKLQkgKiB0ZXN0IHRvIHNlZSBpZiB0aGUgdGVzdFByb2plY3QgaXMgaW4gdGhlIGNsYXNzcGF0aCAoaW5jbHVkaW5nIGZyb20gYW55IHJlZmVyZW5jZWQgcHJvamVjdHMpIG9mIHRoZSB0YXJnZXQgcHJvamVjdC4gS2VlcCB0cmFjayBvZiB0aG9zZSBhbHJlYWR5Ci0JICogdmlzaXRlZCBzbyBhcyBub3QgdG8gdmlzaXQgYWdhaW4uIFRvbyBsYXRlIHRvIG1ha2UgcHJpdmF0ZS4gQnV0IGl0IHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgSUphdmFQcm9qZWN0IHRhcmdldFByb2plY3QsIGJvb2xlYW4gaXNGaXJzdExldmVsLCBTZXQgdmlzaXRlZCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyh0YXJnZXRQcm9qZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdmlzaXRlZC5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQl0cnkgewotCQkJZW50cmllcyA9IHRhcmdldFByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTGlzdCBwcm9qZWN0cyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCQlJSmF2YVByb2plY3QgZW50cnlQcm9qZWN0ID0gZ2V0VmlzaWJsZUphdmFQcm9qZWN0KGVudHJ5LCBpc0ZpcnN0TGV2ZWwpOwotCQkJCQlpZiAoZW50cnlQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCWlmIChlbnRyeVByb2plY3QuZXF1YWxzKHRlc3RQcm9qZWN0KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAocHJvamVjdHMgPT0gbnVsbCkgewotCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJvamVjdHMuYWRkKGVudHJ5UHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJLy9BIGNvbnRhaW5lciBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHByb2plY3RzLgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoZW50cnkuZ2V0UGF0aCgpLCB0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUpFTVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgY29udGFpbmVyLmdldEtpbmQoKSAhPSBJQ2xhc3NwYXRoQ29udGFpbmVyLktfQVBQTElDQVRJT04pCi0JCQkJCQlicmVhazsKLQkJCQkJLy9GaXJzdCBzZWUgaWYgd2UgYWxyZWFkeSByZXNvbHZlZAotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzID0gbnVsbDsKLQkJCQkJY29udGFpbmVyRW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSlyZXNvbHZlZENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lcik7Ci0JCQkJCWlmIChjb250YWluZXJFbnRyaWVzID09IG51bGwpIHsKLQkJCQkJCWNvbnRhaW5lckVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCQkJcmVzb2x2ZWRDb250YWluZXJzLnB1dChjb250YWluZXIsIGNvbnRhaW5lckVudHJpZXMpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXNbal0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7Ci0JCQkJCQkJSUphdmFQcm9qZWN0IGNvbkVudHJ5UHJvamVjdCA9IGdldFZpc2libGVKYXZhUHJvamVjdChjb250YWluZXJFbnRyaWVzW2pdLCBpc0ZpcnN0TGV2ZWwpOwotCQkJCQkJCWlmIChjb25FbnRyeVByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoY29uRW50cnlQcm9qZWN0LmVxdWFscyh0ZXN0UHJvamVjdCkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByb2plY3RzID09IG51bGwpIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXByb2plY3RzLmFkZChjb25FbnRyeVByb2plY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBwcm9qZWN0cywgZmFsc2UsIHZpc2l0ZWQpOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGFuIElKYXZhUHJvamVjdCB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIGVudHJ5Ci0JICogaWYgaXQgaXMgY3VycmVudGx5IHZpc2libGUgdG8gZG93bnN0cmVhbSBwcm9qZWN0cy4KLQkgKi8KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRWaXNpYmxlSmF2YVByb2plY3QoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIGlzRmlyc3RMZXZlbCkgewotCQlpZiAoaXNGaXJzdExldmVsIHx8IGVudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJSUNsYXNzcGF0aEVudHJ5IHJlc0VudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QocmVzRW50cnkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogU2VlIGlmIHRoZSB0ZXN0UHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIGFueSBvZiB0aGUgbGlzdCBvZiBwcm9qZWN0cyBvciBpbiBhbnkgcHJvamVjdCB0aGF0IGFuIGVudHJ5IGluIHRoZSBsaXN0IG1heSBvZiB2aXNpdGVkLiBUb28gbGF0ZQotCSAqIHRvIG1ha2UgcHJpdmF0ZS4gQnV0IGl0IHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgTGlzdCBzb21lSmF2YVByb2plY3RzLCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQkJaWYgKHNvbWVKYXZhUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSBzb21lSmF2YVByb2plY3RzLnNpemUoKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWphdmFQcm9qID0gKElKYXZhUHJvamVjdCkgc29tZUphdmFQcm9qZWN0cy5nZXQoaSk7Ci0JCQlyZXR1cm4gaXNJbkNsYXNzcGF0aCh0ZXN0UHJvamVjdCwgamF2YVByb2osIGlzRmlyc3RMZXZlbCwgdmlzaXRlZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgY2xhc3NwYXRoIGVudHJ5IGlzIGZvci4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gY2xhc3NwYXRoIGVudHJpZXMgb2YgdHlwZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9QUk9KRUNUfQotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqICAgICAgICAgICAgY2xhc3NwYXRoIGVudHJ5IG9mIHR5cGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNDUEVfUFJPSkVDVH0uCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IGZvciB0aGlzIGVudHJ5LiBUaGUgcHJvamVjdCBtaWdodCBub3QgYWN0dWFsbHkgZXhpc3QuIFRoYXQgaXMgbm90IHZlcmlmaWVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JCWlmIChwcm9qICE9IG51bGwpCi0JCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtzcGFjZSByb290LiBBIHV0aWxpdHkgbWV0aG9kLgotCSAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTA1M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmVtUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotLyoKLSAqICRSQ1NmaWxlOiBKZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMiAkICREYXRlOiAyMDA4LzA3LzE3IDE2OjM5OjI1ICQKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFByb2plY3QgVXRpbGl0aWVzIGZvciBKRU0gYW5kIEphdmEuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSmVtUHJvamVjdFV0aWxpdGllcyBleHRlbmRzIFByb2plY3RVdGlsaXRpZXMgewotCQotCXByaXZhdGUgSmVtUHJvamVjdFV0aWxpdGllcygpewotCX0KLQkKLQkvKioKLQkgKiBUaGUgbmF0dXJlIGlkIGZvciBKRU0gTmF0dXJlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9FTUZfTmF0dXJlSUQgPSBJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQ7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBFTUYgbmF0dXJlIGZvciBKRU0gZm9yIHRoZSBwcm9qZWN0LiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBhZGROYXR1cmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWRkIHRoZSBuYXR1cmUgdG8gdGhlIHByb2plY3QgaWYgbm90IHNldC4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGRvbid0IGFkZCBuYXR1cmUgaWYgbm90IGFscmVhZHkgb24gcHJvamVjdC4KLQkgKiBAcmV0dXJuIHRoZSBFTUZOYXR1cmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kIGFuZCBhZGROYXR1cmUgd2FzIDxjb2RlPmZhbHNlPC9jb2RlPiBvciBpdCB3YXMgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZSBnZXRKRU1fRU1GX05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFkZE5hdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkTmF0dXJlID8gSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHByb2plY3QpIDogSmF2YUVNRk5hdHVyZS5nZXRSdW50aW1lKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YUNsYXNzIGZyb20gYW4gSUZpbGUuCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gYUZpbGUuZ2V0UHJvamVjdCgpOwotCQlMaXN0IGZvbGRlcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQlmb2xkZXJzLmFkZEFsbChnZXRMaWJyYXJ5Q29udGFpbmVycyhwcm9qZWN0KSk7Ci0JCUlDb250YWluZXIgZm9sZGVyID0gbnVsbDsKLQkJSVBhdGggZm9sZGVyUGF0aCwgZmlsZVBhdGgsIGphdmFQYXRoOwotCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKGZvbGRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCWZvbGRlclBhdGggPSBmb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCWludCBzZWdtZW50cyA9IGZpbGVQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhmb2xkZXJQYXRoKTsKLQkJCQlpZiAoc2VnbWVudHMgPiAwKSB7Ci0JCQkJCWphdmFQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cyk7Ci0JCQkJCWphdmFQYXRoID0gamF2YVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IGphdmFQYXRoLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocXVhbGlmaWVkTmFtZSwgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCBzb3VyY2UgY29udGFpbmVycyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2Ygc291cmNlIGNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJTGlzdCBzb3VyY2VDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBzb3VyY2VQYXRocyA9IGdldFNvdXJjZVBhdGhzKHApOwotCQkJaWYgKHNvdXJjZVBhdGhzICE9IG51bGwgJiYgIXNvdXJjZVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgc291cmNlUGF0aHMuZ2V0KGkpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJCQlzb3VyY2VDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlQ29udGFpbmVycy5hZGQocC5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VDb250YWluZXJzOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRTb3VyY2VQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJc291cmNlUGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlUGF0aHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIElDb250YWluZXJzIHRoYXQgYXJlIExpYnJhcmllcyBpbiB0aGUgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIGxpYnJhcnkgSUNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExpYnJhcnlDb250YWluZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlicmFyeUNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IGxpYnJhcnlQYXRocyA9IGdldGxpYnJhcnlQYXRocyhwKTsKLQkJCWlmIChsaWJyYXJ5UGF0aHMgIT0gbnVsbCAmJiAhbGlicmFyeVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGxpYnJhcnlQYXRocy5nZXQoaSk7Ci0JCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCWxpYnJhcnlDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJbGlicmFyeUNvbnRhaW5lcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeUNvbnRhaW5lcnM7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldGxpYnJhcnlQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBsaWJyYXJ5UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlsaWJyYXJ5UGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlicmFyeVBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBuYXR1cmUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IG5hdHVyZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKElKYXZhUHJvamVjdCkgcC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVG91Y2ggY2xhc3NwYXRoLiBJdCBzaW1wbHkgdGFrZXMgdGhlIGNsYXNzcGF0aCBhbmQgc2V0cyBpdCBiYWNrIGluLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmluYXJ5IG91dHB1dCBmaWxlcyBmb3IgdGhlIEphdmFQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwYXRoIHRvIGJpbmFyeSBvdXRwdXQgZm9sZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBqYXZhIHByb2plY3Qgb3Igb3RoZXIgcHJvYmxlbS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24oSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghamF2YVByb2ouaXNPcGVuKCkpCi0JCQkJamF2YVByb2oub3BlbihudWxsKTsKLQkJCXJldHVybiBqYXZhUHJvai5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QncyBiaW5hcnkgb3V0cHV0IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gcHJvamVjdCdzIG91dHB1dCBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRKYXZhUHJvamVjdE91dHB1dENvbnRhaW5lcihJUHJvamVjdCBwKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRKYXZhUHJvamVjdE91dHB1dExvY2F0aW9uKHApOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQlyZXR1cm4gcDsKLQkJcmV0dXJuIHAuZ2V0Rm9sZGVyKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiaW5hcnkgb3V0cHV0IGFic29sdXRlIChsb2NhbCBmaWxlIHN5c3RlbSkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gcHJvamVjdCdzIG91dHB1dCBwYXRoIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBqYXZhIHByb2plY3Qgb3Igc29tZSBvdGhlciBlcnJvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0QWJzb2x1dGVMb2NhdGlvbihJUHJvamVjdCBwKSB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0SmF2YVByb2plY3RPdXRwdXRDb250YWluZXIocCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkKLQkJCXJldHVybiBjb250YWluZXIuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBKRFQgSmF2YU1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gSkRUJ3MgSmF2YU1vZGVsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsIGdldEphdmFNb2RlbCgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvagotCSAqIEByZXR1cm4gc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cyhJSmF2YVByb2plY3QgamF2YVByb2opIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGphdmFQcm9qLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKLQkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkKLQkJCQlyZXN1bHQuYWRkKHJvb3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSByZXMKLQkgKiAgICAgICAgICAgIHJlc291cmNlCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSVJlc291cmNlIHJlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShyZXMuZ2V0RnVsbFBhdGgoKSwgbnVsbCwgbnVsbCk7Ci0JCXJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKHAsIGVudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHBhdGggZnJvbSB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byByZW1vdmUKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJUGF0aCBwYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgZiA9IHAuZ2V0RmlsZShwYXRoKTsKLQkJcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgocCwgZik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjbGFzc3BhdGggZW50cnkgZnJvbSB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHAuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChjbGFzc3BhdGgsIGVudHJ5KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGxpc3Qgb2YgZW50cmllcyBmcm9tIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gZW50cmllcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBJQ2xhc3NQYXRoRW50cnkncwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIExpc3QgZW50cmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHAuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChjbGFzc3BhdGgsIGVudHJpZXMpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5W10gcHJpbVJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gZGlkUmVtb3ZlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpKSkKLQkJCQlyZXN1bHQuYWRkKGNwRW50cnkpOwotCQkJZWxzZQotCQkJCWRpZFJlbW92ZSA9IHRydWU7Ci0JCX0KLQkJaWYgKCFkaWRSZW1vdmUpCi0JCQlyZXR1cm4gY2xhc3NwYXRoOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKSByZXN1bHQudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIExpc3QgZW50cmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgYXJyYXlMaXN0ID0gQXJyYXlzLmFzTGlzdChjbGFzc3BhdGgpOwotCQlMaXN0IHJlbW92ZWFibGUgPSBuZXcgQXJyYXlMaXN0KGFycmF5TGlzdCk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeTsKLQkJYm9vbGVhbiBkaWRSZW1vdmUgPSBmYWxzZTsKLQkJaW50IHNpemUgPSBlbnRyaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aC5sZW5ndGg7IGorKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gY2xhc3NwYXRoW2pdOwotCQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKGNsYXNzcGF0aFtqXS5nZXRQYXRoKCkpKSB7Ci0JCQkJCWlmIChyZW1vdmVhYmxlLnJlbW92ZShjcEVudHJ5KSkKLQkJCQkJCWRpZFJlbW92ZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZGlkUmVtb3ZlKQotCQkJcmV0dXJuIGNsYXNzcGF0aDsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgcmVtb3ZlYWJsZS50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVtb3ZlYWJsZS5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNsYXNzcGF0aCBhcyBhbiBhcnJheSBvciBVUkwncy4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcmV0dXJuIGFycmF5IG9mIFVSTCdzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGphdmFQcm9qZWN0IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTFtdIGdldENsYXNzcGF0aEFzVVJMQXJyYXkoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgyMCk7Ci0JCWNvbGxlY3RDbGFzc3BhdGhVUkxzKGphdmFQcm9qZWN0LCB1cmxzLCB2aXNpdGVkLCB0cnVlKTsKLQkJVVJMW10gcmVzdWx0ID0gbmV3IFVSTFt1cmxzLnNpemUoKV07Ci0JCXVybHMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdENsYXNzcGF0aFVSTHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBMaXN0IHVybHMsIFNldCB2aXNpdGVkLCBib29sZWFuIGlzRmlyc3RQcm9qZWN0KSB7Ci0JCWlmICh2aXNpdGVkLmNvbnRhaW5zKGphdmFQcm9qZWN0KSkKLQkJCXJldHVybjsKLQkJdmlzaXRlZC5hZGQoamF2YVByb2plY3QpOwotCQlJUGF0aCBvdXRQYXRoID0gZ2V0SmF2YVByb2plY3RPdXRwdXRBYnNvbHV0ZUxvY2F0aW9uKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCW91dFBhdGggPSBvdXRQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCVVSTCBvdXQgPSBQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZUZpbGVVUkwob3V0UGF0aCk7Ci0JCXVybHMuYWRkKG91dCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQl0cnkgewotCQkJZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJCWNvbGxlY3RDbGFzc3BhdGhFbnRyeVVSTChlbnRyeSwgdXJscyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOiB7Ci0JCQkJCWlmIChpc0ZpcnN0UHJvamVjdCB8fCBlbnRyeS5pc0V4cG9ydGVkKCkpCi0JCQkJCQljb2xsZWN0Q2xhc3NwYXRoVVJMcyhnZXRKYXZhUHJvamVjdChlbnRyeSksIHVybHMsIHZpc2l0ZWQsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0Q2xhc3NwYXRoRW50cnlVUkwoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBMaXN0IHVybHMpIHsKLQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJaWYgKG51bGwgPT0gcGF0aC5nZXREZXZpY2UoKSkgewotCQkJSUZpbGUgamFyRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcGF0aCA9IGphckZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJfQotCi0JCVVSTCB1cmwgPSBQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZUZpbGVVUkwocGF0aCk7Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXVybHMuYWRkKHVybCk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpOwotCQlpZiAocHJvaiAhPSBudWxsKQotCQkJcmV0dXJuIGdldEphdmFQcm9qZWN0KHByb2opOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHByb2plY3QgYSBiaW5hcnkgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBUeXBpY2FsbHkgYSBKYXZhIHByb2plY3QgaXMgY29uc2lkZXJlZCBiaW5hcnkgaWYgaXQgZG9lcyBub3QgaGF2ZSBhIHNvdXJjZSBlbnRyeSBpbiB0aGUgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBQcm9qZWN0IHRvIHRlc3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2plY3QgaXMgYSBiaW5hcnkgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnlQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KGFQcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQl0cnkgewotCQkJZW50cmllcyA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdG8gamF2YSBjbGFzcyBwYXRoLgotCSAqIDxwPgotCSAqIEFwcGVuZCBhIGxpc3Qgb2YgSUNsYXNzcGF0aEVudHJ5J3MgdG8gdGhlIGJ1aWxkIHBhdGggb2YgdGhlIHBhc3NlZCBwcm9qZWN0LiBVcGRhdGVkIHRvIHJlbW92ZSBleGlzdGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcGFzc2VkIGVudHJpZXMgYmVmb3JlCi0JICogYXBwZW5kaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBhcHBlbmRDbGFzc3BhdGhFbnRyaWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIGVudHJpZXMKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRKYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIExpc3QgYXBwZW5kQ2xhc3NwYXRoRW50cmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHAuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJTGlzdCBuZXdQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCQkvLyBTa2lwIGVudHJpZXMgd2hpY2ggYXJlIGluIHRoZSBhcHBlbmQgbGlzdAotCQkJCWlmIChhcHBlbmRDbGFzc3BhdGhFbnRyaWVzLmluZGV4T2YoZW50cnkpIDwgMCkKLQkJCQkJbmV3UGF0aExpc3QuYWRkKGVudHJ5KTsKLQkJCX0KLQkJCW5ld1BhdGhMaXN0LmFkZEFsbChhcHBlbmRDbGFzc3BhdGhFbnRyaWVzKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbmV3UGF0aExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld1BhdGhMaXN0LnNpemUoKV0pOwotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgY2xhc3NwYXRoIGVudHJ5LgotCSAqIDxwPgotCSAqIEFwcGVuZCBvbmUgSUNsYXNzcGF0aEVudHJ5IHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwYXNzZWQgcHJvamVjdC4gSWYgYSBjbGFzc3BhdGggZW50cnkgaGF2aW5nIHRoZSBzYW1lIHBhdGggYXMgdGhlIHBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cywKLQkgKiB0aGVuIGRvZXMgbm90aGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIFByb2plY3QKLQkgKiBAcGFyYW0gbmV3RW50cnkKLQkgKiAgICAgICAgICAgIEVudHJ5Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlMaXN0IG5ld1BhdGhMaXN0ID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGgubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCS8vIGZpeCBkdXAgY2xhc3MgcGF0aCBlbnRyeSBmb3IgLkpFVEVtaXR0ZXIgcHJvamVjdAotCQkJLy8gU2tpcCB0aGUgZW50cnkgdG8gYmUgYWRkZWQgaWYgaXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpIHsKLQkJCQlpZiAoIWVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UobmV3RW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpKQotCQkJCQluZXdQYXRoTGlzdC5hZGQoZW50cnkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5lcXVhbHMobmV3RW50cnkuZ2V0UGF0aCgpKSkKLQkJCQkJbmV3UGF0aExpc3QuYWRkKGVudHJ5KTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQluZXdQYXRoTGlzdC5hZGQobmV3RW50cnkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSAoSUNsYXNzcGF0aEVudHJ5W10pIG5ld1BhdGhMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdQYXRoTGlzdC5zaXplKCldKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgcGF0aCBtYXRjaGluZyB0aGUgcGFyYW1ldGVyOyBpZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwsIG9yIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLCByZXR1cm4gdGhlIGZpcnN0Ci0JICogc291cmNlIHBhdGggb24gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGRlZmF1bHRTb3VyY2VOYW1lCi0JICogICAgICAgICAgICBzb3VyY2UgZm9sZGVyIHRvIGZpbmQgaWYgb24gY2xhc3NwYXRoLCBvciBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgZmlyc3QgZm9sZGVyCi0JICogQHJldHVybiBwYXRoIHNlYXJjaGVkIGZvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgcHJvYmxlbS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFNvdXJjZVBhdGhPckZpcnN0KElQcm9qZWN0IHAsIFN0cmluZyBkZWZhdWx0U291cmNlTmFtZSkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBudWxsOwotCQl0cnkgewotCQkJY3AgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeSBmaXJzdFNvdXJjZSA9IG51bGw7Ci0JCUlQYXRoIGRlZmF1bHRTb3VyY2VQYXRoID0gbnVsbDsKLQkJaWYgKGRlZmF1bHRTb3VyY2VOYW1lICE9IG51bGwpCi0JCQlkZWZhdWx0U291cmNlUGF0aCA9IFByb2plY3RVdGlsaXRpZXMuY3JlYXRlUGF0aChwLCBkZWZhdWx0U291cmNlTmFtZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCWlmIChmaXJzdFNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0U291cmNlID0gY3BbaV07Ci0JCQkJCWlmIChkZWZhdWx0U291cmNlUGF0aCA9PSBudWxsKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjcFtpXS5nZXRQYXRoKCkuZXF1YWxzKGRlZmF1bHRTb3VyY2VQYXRoKSkKLQkJCQkJcmV0dXJuIGRlZmF1bHRTb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpcnN0U291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZpcnN0U291cmNlLmdldFBhdGgoKS5zZWdtZW50KDApLmVxdWFscyhwLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmlyc3RTb3VyY2UuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEhhY2sgdG8gZm9yY2UgYSByZWxvYWQgb2YgdGhlIC5jbGFzc3BhdGggZmlsZQotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IHRvIHJlbG9hZAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JjZUNsYXNzcGF0aFJlbG9hZChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvaiAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2oucmVhZFJhd0NsYXNzcGF0aCgpOwotCQkJaWYgKGVudHJpZXMgIT0gbnVsbCkgewotCQkJCUlQYXRoIG91dHB1dCA9IGphdmFQcm9qLnJlYWRPdXRwdXRMb2NhdGlvbigpOwotCQkJCWlmIChvdXRwdXQgIT0gbnVsbCkKLQkJCQkJamF2YVByb2ouc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG91dHB1dCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBhdGhzIG9mIGFsbCBvZiB0aGUgbG9jYWwgamFycyBpbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdC4gSXQgZG9lcyBub3QgcmVjdXJzZSBpbnRvIHJlZmVyZW5jZWQgcHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gc2VhcmNoIChzaG91bGQgYmUgYSBqYXZhIHByb2plY3QpLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIElQYXRoLCB3aGVyZSBlYWNoIGVudHJ5IGlzIGEgcHJvamVjdCByZWxhdGl2ZSBwYXRoIHRvIGEgSkFSIGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TG9jYWxKQVJQYXRoc0Zyb21DbGFzc3BhdGgoSVByb2plY3QgcHJvaikgewotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwcm9qKTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBwcm9qLmdldEZ1bGxQYXRoKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCWludCBzZWdtZW50cyA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHByb2plY3RQYXRoKTsKLQkJCQkJaWYgKHNlZ21lbnRzID4gMCkKLQkJCQkJCXJlc3VsdC5hZGQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRzKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXI7IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgaWYgdGhlIHNvdXJjZSBmb2xkZXIgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgsIHJldHVybiB0aGUgZmlyc3QKLQkgKiBzb3VyY2UgZm9sZGVyIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBkZWZhdWx0U291cmNlTmFtZQotCSAqICAgICAgICAgICAgc291cmNlIGZvbGRlciB0byBmaW5kIGlmIG9uIGNsYXNzcGF0aCwgb3IgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGZpcnN0IGZvbGRlcgotCSAqIEByZXR1cm4gY29udGFpbmVyIHNlYXJjaGVkIGZvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgcHJvYmxlbS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0U291cmNlRm9sZGVyT3JGaXJzdChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHNvdXJjZVBhdGggPSBnZXRTb3VyY2VQYXRoT3JGaXJzdChwLCBkZWZhdWx0U291cmNlTmFtZSk7Ci0JCQlpZiAoc291cmNlUGF0aCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZSBpZiAoc291cmNlUGF0aC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIHA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHAuZ2V0Rm9sZGVyKHNvdXJjZVBhdGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgSUZvbGRlciB0aGF0IHJlcHJlc2VudHMgZWFjaCBzb3VyY2UgZm9sZGVyIGluIGEgamF2YSBwcm9qZWN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0U291cmNlQ29udGFpbmVycyhJUHJvamVjdCl9YmVjYXVzZSB0aGUgcHJvamVjdCBpdHNlbGYgbWlnaHQgYmUgYSBzb3VyY2UgY29udGFpbmVyCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZUZvbGRlcnMoSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJTGlzdCBzb3VyY2VGb2xkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBzb3VyY2VQYXRocyA9IGdldFNvdXJjZVBhdGhzKHApOwotCQkJaWYgKHNvdXJjZVBhdGhzICE9IG51bGwgJiYgIXNvdXJjZVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgc291cmNlUGF0aHMuZ2V0KGkpOwotCQkJCQlpZiAoIXBhdGguaXNFbXB0eSgpKQotCQkJCQkJc291cmNlRm9sZGVycy5hZGQocC5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VGb2xkZXJzOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L05vQVNUUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L05vQVNUUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyODUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULkludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBmb3IgQVNUIFJlc29sdXRpb24sIGJ1dCBpdCBzaW1wbHkgdHVybnMgTmFtZSBpbnRvIFBUTmFtZS4gVXNlZnVsIHdoZW4KLSAqIGp1c3QgY3JlYXRpbmcgYSBwYXJzZSB0cmVlIHdoZXJlIHdlIGtub3cgdGhlIG5hbWVzIGFyZSBvayBhbmQganVzdCB0eXBlcy4gCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5vQVNUUmVzb2x2ZXIgZXh0ZW5kcyBBU1RCb3VuZFJlc29sdmVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZU5hbWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUpCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiByZXNvbHZlTmFtZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROYW1lKG5hbWUudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKFR5cGUgdHlwZSkgewotCQlyZXR1cm4gdHlwZS50b1N0cmluZygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTU4YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLSAKLS8qKgotICogQ3JlYXRlIGEgcGFyc2UgdHJlZSBmcm9tIGFuIEFTVCBub2RlLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uOwkvLyBFYWNoIHZpc2l0IChvciBlbmR2aXNpdCkgd2lsbCBwdXQgaW50byBleHByZXNzaW9uIHRoZSByZXN1bHQgb2YgdGhlIHZpc2l0IGlmIGl0IHByb2R1Y2VkIGFuIGV4cHJlc3Npb24uCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIGJ5IFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVCB0byByZXNvbHZlIHRoZSB0eXBlcyB0byB0aGUgYXBwcm9wcmlhdGUKLQkgKiB0eXBlcyAoZS5nLiAiU3RyaW5nIiB0byAiamF2YS5sYW5nLlN0cmluZyIpLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJlc29sdmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXNvbHZlIHRoZSBOYW1lLiBJdCBjYW4gcmV0dXJuIGVpdGhlciBhIFBUTmFtZSBpZiBpdCBpcyBqdXN0IGEgY2xhc3NuYW1lLAotCQkgKiBvciBhIFBURmllbGRBY2Nlc3MgaWYgaXQgcmVzb2x2ZXMgdG8gYSBQVEZpZWxkQWNjZXNzLiBUaGUgUFRGaWVsZEFjY2VzcyBzaG91bGQKLQkJICogYmUgY29tcGxldGUuIGUuZyB3ZSBoYXZlIGNsYXNzIGxpa2U6Ci0JCSAqIDxjb2RlPgotCQkgKiAJcGFja2FnZSB4eXo7IAotCQkgKiAJcHVibGljIGNsYXNzIEFDbGFzcyB7Ci0JCSAqIAkJcHVibGljIGphdmEuYXd0LlJlY3RhbmdsZSByZWN0OwotCQkgKiAJfSAKLQkJICogPC9jb2RlPgotCQkgKiBUaGVuIGEgTmFtZSBsaWtlIDxjb2RlPkFDbGFzcy5yZWN0Lng8L2NvZGU+IHNob3VsZCByZXNvbHZlIHRvOgotCQkgKiAKLQkJICogUFRGaWVsZEFjY2VzczoKLQkJICogCXJlY2VpdmVyOiAKLQkJICogCQlQVEZpZWxkQWNjZXNzCi0JCSAqIAkJCXJlY2VpdmVyOiB4eXouQUNsYXNzCi0JCSAqIAkJCWZpZWxkOiAicmVjdCIKLQkJICogCWZpZWxkOiAieCIKLQkJICoKLQkJICogQWN0dWFsbHkgaXQgY2FuIHJldHVybiBhbnkgdmFsaWQgZXhwcmVzc2lvbiB0aGF0IGhhcyBhIHZhbHVlIChpLmUuIGl0IGNhbm5vdCBiZSBhIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggYSA8Y29kZT52b2lkPC9jb2RlPiByZXR1cm4gdHlwZSkuIAotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHJldHVybiBFaXRoZXIgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSAoYXMgYSBQVE5hbWUpIG9yIGEgUFRGaWVsZEFjY2VzcywgYW55IG90aGVyIHR5cGUgb2YgZXhwcmVzc2lvbi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFBURXhwcmVzc2lvbiByZXNvbHZlTmFtZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBSZXNvbHZlIHRoZSB0eXBlLiBJZiBpdCBpcyBhbiBhcnJheSB0eXBlIHJldHVybiBpdCBpbiBmb3JtYXQgInR5cGVbXVtdIi4KLQkJICogCi0JCSAqIEBwYXJhbSB0eXBlCi0JCSAqIEByZXR1cm4gVGhlIHR5cGUgbmFtZSwgaW5jbHVkaW5nIGJyYWNrZXRzIGlmIGFycmF5IHR5cGUuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVzb2x2ZVR5cGUoVHlwZSB0eXBlKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0JCQotCQkvKioKLQkJICogVGhpcyBpcyBmb3IgcmVzb2x2aW5nICJ0aGlzIiBsaXRlcmFsLiBJdCBzaG91bGQgZWl0aGVyIHJldHVybiBhIFBUVGhpc0xpdGVyYWwsIGlmIGl0Ci0JCSAqIGNhbid0IGRvIHJlc29sdmUsIG9yIHNvbWUgUFRFeHByZXNzaW9uIHRoYXQgY2FuIHJlc29sdmUgdG8gInRoaXMiIGZvciBldmFsdWF0aW9uLgotCQkgKiAKLQkJICogQHJldHVybiBJZiByZXNvbHZhYmxlLCBhIFBURXhwcmVzc2lvbiwgZWxzZSBhIFBUVGhpc0xpdGVyYWwgaWYgbm90IHJlc29sdmFibGUuCi0JCSAqIEB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFBURXhwcmVzc2lvbiByZXNvbHZlVGhpcygpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBSZXNvbHZlIHRoZSB0eXBlIHNwZWNpZmllZCBhcyBhIE5hbWUuIEl0IG1heSBiZSBhIHNpbXBsZSBuYW1lIG9yIGl0IG1heSBiZQotCQkgKiBhIHF1YWxpZmllZCBuYW1lLiBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIE5hbWUgdGhhdCB3ZSBrbm93IG11c3QgYmUgYQotCQkgKiB0eXBlLiBUaGlzIGlzIHNvIHRoYXQgdGhlcmUgaXMgbm8gY29uZnVzaW9uIHdpdGggaXQgcG9zc2libHkgYmVpbmcgYSBmaWVsZCBvciB2YXJpYWJsZQotCQkgKiB0aGF0IGhhcyB0aGUgc2FtZSBjYXNlIGFuZCBzcGVsbGluZyBhcyBhIHR5cGUgbmFtZS4KLQkJICogQHBhcmFtIG5hbWUKLQkJICogQHJldHVybiB0aGUgdHlwZSBuYW1lLgotCQkgKiBAdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVzb2x2ZVR5cGUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0JCQotCQkvKioKLQkJICogVGhpcyBpcyB1c2VkIGJ5IHRoZSByZXNvbHZlciBpZiBpdCBjYW4ndCByZXNvbHZlIGZvciBzb21lIHJlYXNvbi4gVGhpcyB3aWxsIHRocm93Ci0JCSAqIGFuIGludmFsaWQgZXhwcmVzc2lvbiBleGNlcHRpb24gd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuCi0JCSAqIAotCQkgKiBAcGFyYW0gbXNnIE1lc3NhZ2UgdG8gYmUgcHV0IGludG8gdGhlIGV4Y2VwdGlvbi4KLQkJICogQHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB0aHJvd0ludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKFN0cmluZyBtc2cpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24obXNnKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFdoZW4gYW4gaW52YWxpZCBleHByZXNzaW9uIGhhcyBiZWVuIGZvdW5kIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24uIEl0IHdpbGwKLQkgKiBiZSBjYXVnaHQgYXQgdGhlIHRvcCBhbmQgY29udmVydGVkIGludG8gYW4gSW52YWxpZEV4cHJlc3Npb24gYW5kIHRoZSByZXN0IG9mIHRoZSBwYXJzZSB0cmVlIHdpbGwgYmUKLQkgKiB0aHJvd24gYXdheS4gCi0JICogCi0JICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBhIG1lc3NhZ2UgYXMgdG8gd2h5IGl0IGlzIGludmFsaWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjQyOTg0NTYzMTkxNTIwNjY3OEw7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzIFRoZSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIGZpbmFsIGludmFsaWQgZXhwcmVzc2lvbi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBnaXZlbiByZXNvbHZlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUKFJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBBU1QgRXhwcmVzc2lvbiBhbmQgcmV0dXJuIGEgUFRFeHByZXNzaW9uLiBJZiBhbnkgcGFydCB3YXMgaW52YWxpZCwgdGhlbgotCSAqIG9ubHkgYW4gUFRJbnZhbGlkRXhwcmVzc2lvbiB3aWxsIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBhc3RFeHByZXNzaW9uCi0JICogQHJldHVybiBUaGUgUFRFeHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBQVEV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIGFzdEV4cHJlc3Npb24pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwZXJmb3JtKGFzdEV4cHJlc3Npb24pOwotCQl9IGNhdGNoIChJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDcmVhdGUgYSBtc2cgdGhhdCBpcyBmb3JtZWQgb2YgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFuZCB0aGUgZnVsbCBpbml0IHN0cmluZy4KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUXzAsIG5ldyBPYmplY3RbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGFzdEV4cHJlc3Npb24udG9TdHJpbmcoKX0pOyAKLQkJCVBUSW52YWxpZEV4cHJlc3Npb24gZXhwID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQkJCWV4cC5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlyZXR1cm4gZXhwOwotCQl9CQotCX0KLQkKLQkvKgotCSAqIFZpc2l0IHRoZSBBU1QgZXhwcmVzc2lvbiBhbmQgZ2V0IHRoZSBQYXJzZVRyZWUgRXhwcmVzc2lvbi4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIGluZGl2aWR1YWwgdmlzaXRzIHdoZW4gcGFyc2luZyBhIHRyZWUuCi0JICogSXQgcGFzc2VzIHRvIHRoZSB0b3AgbWV0aG9kIChjcmVhdGVFeHByZXNzaW9uKSwgd2hpY2ggY2FuCi0JICogaGFuZGxlIHRoZSBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBJZiBhbnkgdmlzaXQgZG9lc24ndCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgdGhlbiBhbiBpbnZhbGlkCi0JICogZXhwcmVzc2lvbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gdG8gaW5kaWNhdGUgdGhpcy4gSWYgdGhlCi0JICogaW5jb21pbmcgZXhwcmVzc2lvbiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiByZXR1cm4gb2YgPGNvZGU+bnVsbDwvY29kZT4gaXMgb2sgYmVjYXVzZQotCSAqIHRoaXMgd291bGQgYmUgZm9yIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gd2hpY2ggZGlkbid0IGV4aXN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBQYXJzZVRyZWUgRXhwcmVzc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpbmNvbWluZyBleHByZXNzaW9uIHdhcyBudWxsLiAKLQkgKiAKLQkgKiBAc2VlIGNyZWF0ZUV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24pCi0JICogQGV4Y2VwdGlvbiBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQVEV4cHJlc3Npb24gcGVyZm9ybShFeHByZXNzaW9uIGFzdEV4cHJlc3Npb24pIHsKLQkJaWYgKGFzdEV4cHJlc3Npb24gIT0gbnVsbCkgewotCQkJZXhwcmVzc2lvbiA9IG51bGw7Ci0JCQlhc3RFeHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKLQkJCWlmIChleHByZXNzaW9uID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ18sIG5ldyBPYmplY3RbXSB7YXN0RXhwcmVzc2lvbi50b1N0cmluZygpfSkpOyAKLQkJCXJldHVybiBleHByZXNzaW9uOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwkvLyBUaGlzIGlzIG9rLiBJdCBtZWFucyBhbiBvcHRpb25hbCBleHByZXNzaW9uIHdhcyBiZWluZyBwcm9jZXNzZWQgYW5kIHRoZSBleHByZXNzaW9uIGRpZG4ndCBleGlzdC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlQVEFycmF5QWNjZXNzIGFhID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQXJyYXlBY2Nlc3MoKTsKLQkJTGlzdCBpbmRleGVzID0gYWEuZ2V0SW5kZXhlcygpOwotCQlFeHByZXNzaW9uIGFycmF5RXhwID0gbm9kZTsKLQkJd2hpbGUgKGFycmF5RXhwLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9BQ0NFU1MpIHsKLQkJCS8vIFZpc2l0IHRoZSBpbmRleCB0byBnZXQgdGhlIGluZGV4IGV4cHJlc3Npb24uCi0JCQlBcnJheUFjY2VzcyBhcnJheSA9IChBcnJheUFjY2VzcykgYXJyYXlFeHA7IAotCQkJaW5kZXhlcy5hZGQoMCwgcGVyZm9ybShhcnJheS5nZXRJbmRleCgpKSk7CS8vIFdlJ3JlIHRyeWluZyB0byBjcmVhdGUgdGhlIGZpbmFsIGV4cHJlc3Npb24gZnJvbSBpbnNpZGUgb3V0LCB0aGUgaW5kZXhlcyBhcmUgY3JlYXRlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJYXJyYXlFeHAgPSBhcnJheS5nZXRBcnJheSgpOwotCQl9Ci0JCWFhLnNldEFycmF5KHBlcmZvcm0oYXJyYXlFeHApKTsJLy8gRmluYWwgYXJyYXlFeHAgaXMgdGhlIHRydWUgZXhwcmVzc2lvbi4KLQkJZXhwcmVzc2lvbiA9IGFhOwkvLyBTZXQgdGhlIHJldHVybiBleHByZXNzaW9uIGZvciB0aGlzIHZpc2l0LgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlQVEFycmF5Q3JlYXRpb24gYWMgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBcnJheUNyZWF0aW9uKCk7Ci0JCWFjLnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRUeXBlKCkpKTsKLQkJTGlzdCBhY0RpbXMgPSBhYy5nZXREaW1lbnNpb25zKCk7Ci0JCUxpc3QgbkRpbXMgPSBub2RlLmRpbWVuc2lvbnMoKTsKLQkJaW50IG5zaXplID0gbkRpbXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWFjRGltcy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgbkRpbXMuZ2V0KGkpKSk7Ci0JCX0KLQkJYWMuc2V0SW5pdGlhbGl6ZXIoKFBUQXJyYXlJbml0aWFsaXplcikgcGVyZm9ybShub2RlLmdldEluaXRpYWxpemVyKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGFjOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCVBUQXJyYXlJbml0aWFsaXplciBhaSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQkJTGlzdCBleHBzID0gbm9kZS5leHByZXNzaW9ucygpOwotCQlMaXN0IGFpZXhwcyA9IGFpLmdldEV4cHJlc3Npb25zKCk7Ci0JCWludCBuZXhwID0gZXhwcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4cDsgaSsrKSB7Ci0JCQlhaWV4cHMuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIGV4cHMuZ2V0KGkpKSk7Ci0JCX0KLQkJZXhwcmVzc2lvbiA9IGFpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsJLy8gV2UgY2FuJ3QgaGFuZGxlIGFzc2lnbm1lbnQuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJUFRCb29sZWFuTGl0ZXJhbCBibCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCWJsLnNldEJvb2xlYW5WYWx1ZShub2RlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJZXhwcmVzc2lvbiA9IGJsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRDYXN0RXhwcmVzc2lvbiBjdAk9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENhc3RFeHByZXNzaW9uKCk7Ci0JCWN0LnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRUeXBlKCkpKTsKLQkJY3Quc2V0RXhwcmVzc2lvbihwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCWV4cHJlc3Npb24gPSBjdDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlQVENoYXJhY3RlckxpdGVyYWwgY2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCWNsLnNldEVzY2FwZWRWYWx1ZShub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJY2wuc2V0Q2hhclZhbHVlKG5vZGUuY2hhclZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gY2w7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWlmIChub2RlLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSAhPSBudWxsKSB7IAotCQkJUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGFkZWNsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJYWRlY2wuc2V0RGVjbGFyYXRpb24obm9kZS50b1N0cmluZygpKTsKLQkJCWV4cHJlc3Npb24gPSBhZGVjbDsKLQkJfSBlbHNlIHsKLQkJCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNpYyA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJLy8gSWYgYXN0IGxldmVsID0gMiwgdGhlbiB5b3UgbXVzdCB1c2UgZ2V0TmFtZSwgYnV0IHRoZSBuYW1lIG5lZWRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgdHlwZQotCQkJLy8gc28gdGhhdCBpdCBjYW4gYmUgcmVzb2x2ZWQuIElmIGFzdCBsZXZlbCA+IDIsIHRoZW4gaXQgd2lsbCByZXR1cm4gYSB0eXBlIHRvIGJlIHJlc29sdmVkLgotCQkJLy8gTm90ZTogY2FuJ3QganVzdCB1c2UgcmVzb2x2ZSBuYW1lIG9uIHRoZSBuYW1lIGJlY2F1c2UgaWYgYSBmaWVsZCBhbmQgYSBjbGFzcyB3ZXJlIHNwZWxsZWQKLQkJCS8vIHRoZSBzYW1lIHRoZW4gdGhlIGNvZGVnZW4gcmVzb2x2ZXIgd291bGQgcmV0dXJuIGFuIGluc3RhbmNlIHJlZiB0byB0aGUgZmllbGQgaW5zdGVhZC4KLQkJCVN0cmluZyB0eXBlID0gbm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyID8gcmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXROYW1lKCkpIDogcmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRUeXBlKCkpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCXR5cGUgPSBub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzIgPyBub2RlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSA6IG5vZGUuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQljaWMuc2V0VHlwZSh0eXBlKTsKLQkJCUxpc3QgYXJncyA9IGNpYy5nZXRBcmd1bWVudHMoKTsKLQkJCUxpc3QgbmFyZ3MgPSBub2RlLmFyZ3VtZW50cygpOwotCQkJaW50IG5zaXplID0gbmFyZ3Muc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQkJYXJncy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgbmFyZ3MuZ2V0KGkpKSk7Ci0JCQl9Ci0JCQlleHByZXNzaW9uID0gY2ljOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQljZS5zZXRDb25kaXRpb24ocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQljZS5zZXRUcnVlKHBlcmZvcm0obm9kZS5nZXRUaGVuRXhwcmVzc2lvbigpKSk7Ci0JCWNlLnNldEZhbHNlKHBlcmZvcm0obm9kZS5nZXRFbHNlRXhwcmVzc2lvbigpKSk7Ci0JCWV4cHJlc3Npb24gPSBjZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBjcmVhdGVGaWVsZEFjY2Vzcyhub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGNyZWF0ZUZpZWxkQWNjZXNzKFN0cmluZyBuYW1lLCBQVEV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKLQkJUFRGaWVsZEFjY2VzcyBmYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCWZhLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJZmEuc2V0RmllbGQobmFtZSk7Ci0JCXJldHVybiBmYTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGluZml4T3BlclRvUGFyc2VPcGVyOwotCXByaXZhdGUgZmluYWwgUFRJbmZpeE9wZXJhdG9yIGdldFBhcnNlSW5maXgoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCWlmIChwcmVmaXhPcGVyVG9QYXJzZU9wZXIgPT0gbnVsbCkgewotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIgPSBuZXcgSGFzaE1hcCg1KTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQU5ELCBQVEluZml4T3BlcmF0b3IuQU5EX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9BTkQsIFBUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9BTkRfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX09SLCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfT1JfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkRJVklERSwgUFRJbmZpeE9wZXJhdG9yLkRJVklERV9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRVFVQUxTLCBQVEluZml4T3BlcmF0b3IuRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSX0VRVUFMUywgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSLCBQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVGVF9TSElGVCwgUFRJbmZpeE9wZXJhdG9yLkxFRlRfU0hJRlRfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1NfRVFVQUxTLCBQVEluZml4T3BlcmF0b3IuTEVTU19FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1MsIFBUSW5maXhPcGVyYXRvci5MRVNTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUywgUFRJbmZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1RfRVFVQUxTLCBQVEluZml4T3BlcmF0b3IuTk9UX0VRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuT1IsIFBUSW5maXhPcGVyYXRvci5PUl9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUywgUFRJbmZpeE9wZXJhdG9yLlBMVVNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJFTUFJTkRFUiwgUFRJbmZpeE9wZXJhdG9yLlJFTUFJTkRFUl9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVELCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRCwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5USU1FUywgUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5YT1IsIFBUSW5maXhPcGVyYXRvci5YT1JfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIChQVEluZml4T3BlcmF0b3IpIGluZml4T3BlclRvUGFyc2VPcGVyLmdldChvcGVyYXRvcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbmZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRJbmZpeEV4cHJlc3Npb24gaW5mID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZi5zZXRMZWZ0T3BlcmFuZChwZXJmb3JtKG5vZGUuZ2V0TGVmdE9wZXJhbmQoKSkpOwotCQlQVEluZml4T3BlcmF0b3IgaW5vcGVyID0gZ2V0UGFyc2VJbmZpeChub2RlLmdldE9wZXJhdG9yKCkpOwotCQlpZiAoaW5vcGVyID09IG51bGwpIHsKLQkJCS8vIEl0IGlzIG5vdCBvbmUgd2UgY2FuIGhhbmRsZS4KLQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbigKLQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9PcGVyYXRvclRvb0NvbXBsaWNhdGVkVG9IYW5kbGVfRVhDXywgbmV3IE9iamVjdFtdIHsgbm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkgfSkpOyAKLQkJfQotCQlpbmYuc2V0T3BlcmF0b3IoaW5vcGVyKTsKLQkJaW5mLnNldFJpZ2h0T3BlcmFuZChwZXJmb3JtKG5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkpKTsKLQkJTGlzdCBlb3BzID0gaW5mLmdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJTGlzdCBuZW9wcyA9IG5vZGUuZXh0ZW5kZWRPcGVyYW5kcygpOwotCQlpbnQgbnNpemUgPSBuZW9wcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJZW9wcy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgbmVvcHMuZ2V0KGkpKSk7Ci0JCX0KLQkJZXhwcmVzc2lvbiA9IGluZjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbnN0YW5jZW9mRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUSW5zdGFuY2VvZiBpbm9mID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQlpbm9mLnNldE9wZXJhbmQocGVyZm9ybShub2RlLmdldExlZnRPcGVyYW5kKCkpKTsKLQkJaW5vZi5zZXRUeXBlKHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGlub2Y7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUG9zdGZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGNhbid0IGhhbmRsZSBwb3N0IGZpeC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IGNyZWF0ZU1ldGhvZEludm9jYXRpb24obm9kZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCBwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSwgbm9kZS5hcmd1bWVudHMoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBtZXRob2QgaW52b2NhdGlvbiB1c2luZyB0aGUgZ2l2aW5nIHJlY2VpdmVyLCBuYW1lLCBhcmdzLgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlTWV0aG9kSW52b2NhdGlvbihTdHJpbmcgbmFtZSwgUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBMaXN0IGFyZ0V4cHJlc3Npb25zKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbiBtaSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKTsKLQkJbWkuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQltaS5zZXROYW1lKG5hbWUpOwotCQlMaXN0IGFyZ3MgPSBtaS5nZXRBcmd1bWVudHMoKTsKLQkJaW50IG5zaXplID0gYXJnRXhwcmVzc2lvbnMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWFyZ3MuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIGFyZ0V4cHJlc3Npb25zLmdldChpKSkpOwotCQl9Ci0JCXJldHVybiBtaTsKLQl9Ci0JCi0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQlleHByZXNzaW9uID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlQVE51bWJlckxpdGVyYWwgbmwgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCW5sLnNldFRva2VuKG5vZGUuZ2V0VG9rZW4oKSk7Ci0JCWV4cHJlc3Npb24gPSBubDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGUgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQlwZS5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHBlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBwcmVmaXhPcGVyVG9QYXJzZU9wZXI7Ci0JcHJpdmF0ZSBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIGdldFBhcnNlUHJlZml4KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKHByZWZpeE9wZXJUb1BhcnNlT3BlciA9PSBudWxsKSB7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIgPSBuZXcgSGFzaE1hcCg1KTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT01QTEVNRU5ULCBQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRfTElURVJBTCk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsIFBUUHJlZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9ULCBQVFByZWZpeE9wZXJhdG9yLk5PVF9MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTLCBQVFByZWZpeE9wZXJhdG9yLlBMVVNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIChQVFByZWZpeE9wZXJhdG9yKSBwcmVmaXhPcGVyVG9QYXJzZU9wZXIuZ2V0KG9wZXJhdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWlmIChub2RlLmdldE9wZXJhbmQoKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTlVNQkVSX0xJVEVSQUwpIHsKLQkJCS8vIEZvciBudW1iZXIgbGl0ZXJhbHMgd2Ugc2VlIGlmIGl0IGlzIGEgIisiIG9yICItIiBwcmVmaXgsIGFuZCBpZiBpdCBpcywgd2Ugc2ltcGx5Ci0JCQkvLyBjcmVhdGUgYSBQVE51bWJlckxpdGVyYWwgd2l0aCB0aGUgb3BlcmF0b3IgYWxyZWFkeSBpbiBpdC4gSXQgaXMgYSBzaW1wbGlmaWNhdGlvbi4KLQkJCS8vIEFueSBvdGhlciBvcGVyYXRvciB3ZSd2ZSBsZWZ0IGFsb25lIHNpbmNlIHRob3NlIHdvbid0IGJlIGRlY29kZWQgc2ltcGx5IGJ5IHRoZQotCQkJLy8gTnVtYmVyIGRlY29kZXIuCi0JCQkvLyBJZiBub3QgYSBudW1iZXIgbGl0ZXJhbCwgdGhlbiBsZWF2ZSBhbG9uZSBzaW5jZSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgcHJlZml4Ci0JCQkvLyBvcGVyYXRpb24uCi0JCQlQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yID0gbm9kZS5nZXRPcGVyYXRvcigpOwotCQkJaWYgKG9wZXJhdG9yID09IFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyB8fCBvcGVyYXRvciA9PSBQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTKSB7Ci0JCQkJUFROdW1iZXJMaXRlcmFsIG5tID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCQkJCW5tLnNldFRva2VuKG9wZXJhdG9yLnRvU3RyaW5nKCkgKyAoKE51bWJlckxpdGVyYWwpIG5vZGUuZ2V0T3BlcmFuZCgpKS5nZXRUb2tlbigpKTsKLQkJCQlleHByZXNzaW9uID0gbm07Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJUFRQcmVmaXhFeHByZXNzaW9uIHBlID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQlQVFByZWZpeE9wZXJhdG9yIHB0b3BlciA9IGdldFBhcnNlUHJlZml4KG5vZGUuZ2V0T3BlcmF0b3IoKSk7Ci0JCWlmIChwdG9wZXIgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IG9uZSB3ZSBjYW4gaGFuZGxlLgotCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKAotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ18sIG5ldyBPYmplY3RbXSB7IG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpIH0pKTsgCi0JCX0KLQkJcGUuc2V0T3BlcmF0b3IocHRvcGVyKTsKLQkJcGUuc2V0RXhwcmVzc2lvbihwZXJmb3JtKG5vZGUuZ2V0T3BlcmFuZCgpKSk7Ci0JCWV4cHJlc3Npb24gPSBwZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQlleHByZXNzaW9uID0gcmVzb2x2ZXIucmVzb2x2ZU5hbWUobm9kZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlTmFtZShub2RlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlQVFN0cmluZ0xpdGVyYWwgc2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCXNsLnNldEVzY2FwZWRWYWx1ZShub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJc2wuc2V0TGl0ZXJhbFZhbHVlKG5vZGUuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gc2w7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IGNyZWF0ZUZpZWxkQWNjZXNzKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgcmVzb2x2ZXIucmVzb2x2ZVRoaXMoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJNZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgcmVzb2x2ZXIucmVzb2x2ZVRoaXMoKSwgbm9kZS5hcmd1bWVudHMoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhpc0V4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGhpc0V4cHJlc3Npb24gbm9kZSkgewotCQlleHByZXNzaW9uID0gcmVzb2x2ZXIucmVzb2x2ZVRoaXMoKTsKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCQlQVFR5cGVMaXRlcmFsIHB0bCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCXB0bC5zZXRUeXBlKHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWV4cHJlc3Npb24gPSBwdGw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1dvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjA5ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX0V4cHJlc3Npb25Ub29Db21wbGljYXRlZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9PcGVyYXRvclRvb0NvbXBsaWNhdGVkVG9IYW5kbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsRmllbGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsVmFyaWFibGVfRVhDXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE3ZjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHswfSAtIHsxfQotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX0V4cHJlc3Npb25Ub29Db21wbGljYXRlZF9FWENfICAgICAgICAgICA9IElXQVYwMTc3RSBFeHByZXNzaW9uICJ7MH0iIGlzIHRvbyBjb21wbGljYXRlZC4KLVBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9PcGVyYXRvclRvb0NvbXBsaWNhdGVkVG9IYW5kbGVfRVhDXyAgICAgPSBJV0FWMDE3OUUgT3BlcmF0b3IgInswfSIgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIGhhbmRsZS4KLUFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxGaWVsZF9FWENfPUNhbm5vdCBoYW5kbGUgbG9jYWwgZmllbGQgYWNjZXNzIG9mICJ7MH0iCi1BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsVmFyaWFibGVfRVhDXz1DYW5ub3QgaGFuZGxlIGxvY2FsIHZhcmlhYmxlIGFjY2VzcyBvZiAiezB9IgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzQ1NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamF2YWluc3QvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9mamF2YS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTY3NDAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qZW1fMi4wLjIwMC4yMDA4MDYwMzEzMDQuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNmOGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlZmlsZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9nbGV2ZWw9ZGVmYXVsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTM5OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZW08L25hbWU+Ci0gICAgPGNvbW1lbnQ+PC9jb21tZW50PgotICAgIDxwcm9qZWN0cz48L3Byb2plY3RzPgotICAgIDxidWlsZFNwZWM+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgICAgICA8YnVpbGRDb21tYW5kPgotICAgICAgICAgICAgPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgICAgICA8YnVpbGRDb21tYW5kPgotICAgICAgICAgICAgPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICA8L2J1aWxkU3BlYz4KLSAgICA8bmF0dXJlcz4KLSAgICAgICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0gICAgICAgIDxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotICAgIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTUwNDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTUgMjE6MTQ6MzYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAyZTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0jU2F0IE1hciAzMSAyMzowODowMyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMzJjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEZlYiAyMSAxMDowOTowMyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9qdmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjhlM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmUuSkVNUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLnByb3h5LG9yZy5lY2xpcHNlLmplbS50ZXN0cyxvcmcuZWNsaXBzZS5qZW0udWksb3JnLmVjbGlwc2UuamVtLnV0aWwsb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwsCi0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjMuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS5wcm94eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCAiYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIgImIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ2YjJlLi4wMDAwMDAwCi0tLSAiYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLURvIG5vdCBpbmNsdWRlIGEgbmV3IGRlcGVuZGVuY3kgcGx1Z2luIHRvIHRoZSBNQU5JRkVTVCBmb3IgdGhpcyBwbHVnaW5kISEhCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIHBsdWdpbiBpcyBhbHNvIGV4ZWN1dGVkIG91dHNpZGUgb2YgRWNsaXBzZSBmcmFtZXdvcmssIHN1Y2ggSUJNIFdlYnNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGMpIElCTS4gV2UgY2Fubm90IGFkZAotbmV3IGRlcGVuZGVuY2llcyB0byB0aGUgcGx1Z2luIGJlY2F1c2UgdGhlIGN1cnJlbnQgc2V0IGlzIGNvbnNpZGVyZWQgdG8gYmUgQVBJLiBBZGRpbmcgYSBuZXcgc2V0IHdpdGhvdXQgY29uc3VsdGluZyB0aG9zZSB1c2VycyB3b3VsZCBicmVhawotdGhlbS4KLQotVGhlIGV4dGVybmFsIEFQSSBpcyBhbnl0aGluZyBpbiB0aGUgbW9mamF2YSBmb2xkZXIuIElmIGl0IGlzIG9ubHkgZm9yIGEgY2xhc3MgaW4gdGhlIG90aGVyIHNvdXJjZSBmb2xkZXIocykgaXQgbWF5IGJlIE9LIHNpbmNlIHRoZXkgd291bGQgbm90IGJlIAotdXNpbmcgdGhhdCBjb2RlLiBCdXQgaXQgd291bGQgYmUgYmVzdCB0byBjb25zdWx0IHdpdGggdGhlbSBmaXJzdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZWE1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+PGhlYWQ+PHRpdGxlPkFib3V0PC90aXRsZT4KLQotCi0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvaGVhZD48Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LmluaSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMTQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lm1hcHBpbmdzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTUxNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNi8wNS8xOCAxOTowOTo1OCAkCi0jCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgRU1GIE1vZGVsXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiAyMDAwLCAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdmVwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YWRkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNyYy5leGNsdWRlcyA9ICoqLy5jdnNpZ25vcmUKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIG92ZXJyaWRlcy8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgbW9kZWwvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG1vZGVsLyxcCi0gICAgICAgICAgICAgICByb3NlLwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IG1vZmphdmEvLFwKLSAgICAgICAgICAgamF2YWluc3QvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2ZWJiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qZW0iPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9lY2xpcHNlMzIucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbXBsaWNpdEFsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkMDRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbXBsaWNpdEFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBsaWNpdCBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBmb3IgYW4gaW1wbGljaXQgYWxsb2NhdGlvbiB3aGVyZSB0aGUgb2JqZWN0IGNvbWVzIGZyb20gdGhlIGZlYXR1cmUgb2YgYW5vdGhlciBvYmplY3QuIEl0IGlzIHRoZSBsaXZlIEphdmEgdmFsdWUgZnJvbSB0aGUgcmVtb3RlIHZtLgotICogPC9wPiAKLSAqIEBzaW5jZSAxLjAuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEltcGxpY2l0QWxsb2NhdGlvbiBleHRlbmRzIEphdmFBbGxvY2F0aW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogVGhlIHBhcmVudCB3aG8gaXMgdG8gZ2l2ZSB1cCB0aGUgdmFsdWUuCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGFyZW50KEVPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbXBsaWNpdEFsbG9jYXRpb25fUGFyZW50KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVPYmplY3QgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJlbnQoRU9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBUaGUgZmVhdHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgbGl2ZSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmVhdHVyZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZlYXR1cmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEZlYXR1cmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIHZhbHVlKTsKLQotfSAvLyBJbXBsaWNpdEFsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luaXRTdHJpbmdBbGxvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9Jbml0U3RyaW5nQWxsb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY4YzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luaXRTdHJpbmdBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiAKLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb24jZ2V0QWxsb2NTdHJpbmcoKQotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0U3RyaW5nQWxsb2NhdGlvbiBleHRlbmRzIEphdmFBbGxvY2F0aW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgZm9yIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdFN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEluaXRTdHJpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdFN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdFN0cmluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluaXRTdHJpbmdBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlYTMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25GYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25GYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbXBsaWNpdEFsbG9jYXRpb24gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgcGFyc2UgdHJlZSBhbGxvY2F0aW9uIHdpdGggYW4gZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEByZXR1cm4gVGhlIG5ldyBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEFycmF5QWNjZXNzIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGFycmF5IGFjY2VzcyB3aXRoIHRoZSBhcnJheSBhbmQgaW5kZXhlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYXJyYXkKLQkgKiBAcGFyYW0gaW5kZXhlcyBsaXN0IG9mIGluZGV4IGV4cHJlc3Npb25zCi0JICogQHJldHVybiBUaGUgbmV3IGFycmF5IGFjY2Vzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEFycmF5QWNjZXNzIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoUFRFeHByZXNzaW9uIGFycmF5LCBMaXN0IGluZGV4ZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlDcmVhdGlvbiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGFuIGFycmF5IGNyZWF0aW9uIHdpdGggdGhlIHR5cGUsIGRpbWVuc2lvbnMsIGFuZCBpbml0aWFsaXplci4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSwgZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi4KLQkgKiBAcGFyYW0gZGltZW5zaW9ucyBUaGUgZGltZW5zaW9uIGV4cHJlc3Npb25zLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkaW1lbnNpb24gZXhwcmVzc2lvbnMuCi0JICogQHBhcmFtIGluaXRpYWxpemVyIFRoZSBpbml0aWFsaXplciwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbGl6ZXIuCi0JICogQHJldHVybiBUaGUgbmV3IGFycmF5IGNyZWF0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQXJyYXlDcmVhdGlvbiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oU3RyaW5nIHR5cGUsIExpc3QgZGltZW5zaW9ucywgUFRBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhbiBhcnJheSBpbml0aWxpemVyIHdpdGggaW5pdGlhbGl6ZSBleHBlc3Npb25zLgotCSAqIEBwYXJhbSBleHByZXNzaW9ucyBUaGUgbGlzdCBvZiBleHByZXNzaW9ucywgPGNvZGU+bnVsbDwvY29kZT4gaWYgZW1wdHkgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICogQHJldHVybiBUaGUgbmV3IGFycmF5IGluaXRpYWxpemVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoTGlzdCBleHByZXNzaW9ucyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEJvb2xlYW5MaXRlcmFsIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgYm9vbGVhbiBsaXRlcmFsIHdpdGggYSBnaXZlbiB2YWx1ZS4KLQkgKiBAcGFyYW0gYm9vbGVhblZhbHVlCi0JICogQHJldHVybiBUaGUgbmV3IGJvb2xlYW4gbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEJvb2xlYW5MaXRlcmFsIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoYm9vbGVhbiBib29sZWFuVmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgY2FzdCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uLCBlLmcuIDxjb2RlPnNob3J0PC9jb2RlPiBvciA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIGJlaW5nIGNhc3QuCi0JICogQHJldHVybiBUaGUgbmV3IGNhc3QgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oU3RyaW5nIHR5cGUsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjaGFyYWN0ZXIgbGl0ZXJhbC4KLQkgKiBAcGFyYW0gZXNjYXBlZFZhbHVlIFRoZSBlc2NhcGVkIHZhbHVlIHRvIHVzZS4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2hhcmFjdGVyIGxpdGVyYWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRDaGFyYWN0ZXJMaXRlcmFsIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbChTdHJpbmcgZXNjYXBlZFZhbHVlKTsJCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBjbGFzcywgZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi4KLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciBhcmd1bWVudHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBhcmdzLgotCSAqIEByZXR1cm4gVGhlIG5ldyBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbihTdHJpbmcgdHlwZSwgTGlzdCBhcmd1bWVudHMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIHRoZSBjb25kaXRpb24gYW5kIHRydWUvZmFsc2UgZXhwcmVzc2lvbnMuCi0JICogCi0JICogQHBhcmFtIGNvbmRpdGlvbgotCSAqIEBwYXJhbSB0cnVlRXhwcmVzc29pbgotCSAqIEBwYXJhbSBmYWxzZUV4cHJlc3Npb24KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIGNvbmRpdGlvbiwgUFRFeHByZXNzaW9uIHRydWVFeHByZXNzb2luLCBQVEV4cHJlc3Npb24gZmFsc2VFeHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURmllbGRBY2Nlc3MgY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgZmllbGQgYWNjZXNzIHdpdGggcmVjZWl2ZXIgYW5kIGZpZWxkIG5hbWUuCi0JICogQHBhcmFtIHJlY2VpdmVyIFRoZSByZWNlaXZlciBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIEBwYXJhbSBmaWVsZCBUaGUgZmllbGQgbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgZmllbGQgYWNjZXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBURmllbGRBY2Nlc3MgY3JlYXRlUFRGaWVsZEFjY2VzcyhQVEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBmaWVsZCk7CQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgaW5maXggZXhwcmVzc2lvbiB3aXRoIHRoZSBsZWZ0L3JpZ2h0L2V4dGVuZGVkIG9wZXJhbmRzIGFuZCB0aGUgb3BlcmF0b3IuCi0JICogQHBhcmFtIGxlZnRPcGVyYW5kCi0JICogQHBhcmFtIG9wZXJhdG9yCi0JICogQHBhcmFtIHJpZ2h0T3BlcmFuZAotCSAqIEBwYXJhbSBleHRlbmRlZE9wZXJhbmRzIFRoZSBsaXN0IG9mIGV4dGVuZGVkIG9wZXJhbmRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBleHRlbmRlZCBvcGVyYW5kcy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRJbmZpeEV4cHJlc3Npb24gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kLCBQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQsIExpc3QgZXh0ZW5kZWRPcGVyYW5kcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlb2Y8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlb2Y8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5zdGFuY2VvZiBjcmVhdGVQVEluc3RhbmNlb2YoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHdpdGggYW4gb3BlcmFuZCBhbmQgYSB0eXBlLgotCSAqIEBwYXJhbSBvcGVyYW5kCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2Ugb2YuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZihQVEV4cHJlc3Npb24gb3BlcmFuZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggYSByZWNlaXZlciwgbmFtZSwgYW5kIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjZWl2ZXIgVGhlIHJlY2VpdmVyIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHJlY2VpdmVyLgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCi0JICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXJndW1lbnRzLgotCSAqIEByZXR1cm4gVGhlIG5ldyBtZXRob2QgaW52b2NhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIExpc3QgYXJndW1lbnRzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFROYW1lIGNyZWF0ZVBUTmFtZSgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgbmFtZSB3aXRoIHRoZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBUaGUgbmV3IG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFROYW1lIGNyZWF0ZVBUTmFtZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVE51bGxMaXRlcmFsIGNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBudW1iZXIgbGl0ZXJhbCB3aXRoIHRoZSB0b2tlbi4KLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgbnVtYmVyIGxpdGVyYWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFROdW1iZXJMaXRlcmFsIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbChTdHJpbmcgdG9rZW4pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gd2l0aCB0aGUgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0aGF0IGlzIGluIHRoZSBwYXJlbnRoZXNpcy4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihQVEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRQcmVmaXhFeHByZXNzaW9uIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgcHJlZml4IGV4cHJlc3Npb24gZ2l2ZW4gYW4gb3BlcmF0b3IgYW5kIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIG9wZXJhdG9yCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIFRoZSBuZXcgcHJlZml4IGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRQcmVmaXhFeHByZXNzaW9uIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbihQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yLCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRTdHJpbmdMaXRlcmFsIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgc3RyaW5nIGxpdGVyYWwgZ2l2ZW4gdGhlIGVzY2FwZWQgbGl0ZXJhbCBzdHJpbmcuCi0JICogQHBhcmFtIGVzY2FwZUxpdGVyYWwKLQkgKiBAcmV0dXJuIFRoZSBuZXcgc3RyaW5nIGxpdGVyYWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRTdHJpbmdMaXRlcmFsIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbChTdHJpbmcgZXNjYXBlTGl0ZXJhbCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFRoaXNMaXRlcmFsIGNyZWF0ZVBUVGhpc0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgdHlwZSBsaXRlcmFsIGdpdmVuIHRoZSB0eXBlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBUaGUgbmV3IHR5cGUgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFR5cGVMaXRlcmFsIGNyZWF0ZVBUVHlwZUxpdGVyYWwoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBjcmVhdGVQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IFBUSW5zdGFuY2VSZWZlcmVuY2Ugd2l0aCBhIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSBpbnN0YW5jZSk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbnZhbGlkIGV4cHJlc3Npb24gd2l0aCBhIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIFRoZSBuZXcgaW52YWxpZCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUSW52YWxpZEV4cHJlc3Npb24gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicgYXMKLQkgKiB1dGlsaXR5IHdpdGggYSBnaXZlbiBpbml0IHN0cmluZy4KLQkgKiBAcGFyYW0gaW5pdFN0cmluZyAtIFN0cmluZyB0byBwdXQgaW50byBpbml0aWFsaXphdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSBhbGxvY2F0aW9uIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKFN0cmluZyBpbml0U3RyaW5nKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicgYXMKLQkgKiB1dGlsaXR5IHdpdGggYSBnaXZlbiBwYXJlbnQgYW5kIGZlYXR1cmUuCi0JICogQHBhcmFtIHBhcmVudCBUaGUgc291cmNlIHRvIGdldCB0aGUgdmFsdWUgZnJvbS4KLQkgKiBAcGFyYW0gc2YgVGhlIGZlYXR1cmUgb24gdGhlIHNvdXJjZSBmb3IgdGhlIHZhbHVlLgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvblBhY2thZ2UgZ2V0SW5zdGFudGlhdGlvblBhY2thZ2UoKTsKLQotfSAvL0luc3RhbnRpYXRpb25GYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNzQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEphdmEgSW5zdGFudGlhdGlvbiBQYWNrYWdlCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnN0YW50aWF0aW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImluc3RhbnRpYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UgPGVtPklKYXZhIEluc3RhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJSmF2YUluc3RhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElKQVZBX0lOU1RBTkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUpBVkFfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZSA8ZW0+SUphdmEgT2JqZWN0IEluc3RhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJSmF2YU9iamVjdEluc3RhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElKQVZBX09CSkVDVF9JTlNUQU5DRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIDxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SUphdmFEYXRhVHlwZUluc3RhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElKQVZBX0RBVEFfVFlQRV9JTlNUQU5DRSA9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElKQVZBX0RBVEFfVFlQRV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSkFWQV9PQkpFQ1RfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkphdmFBbGxvY2F0aW9uSW1wbCA8ZW0+SmF2YSBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5KYXZhQWxsb2NhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldEphdmFBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpBVkFfQUxMT0NBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsIDxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOSVRfU1RSSU5HX0FMTE9DQVRJT04gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkcgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkltcGxpY2l0QWxsb2NhdGlvbkltcGwgPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkltcGxpY2l0QWxsb2NhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkUgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwgPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBhcnNlVHJlZUFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFSU0VfVFJFRV9BTExPQ0FUSU9OID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSU0VfVFJFRV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRFeHByZXNzaW9uSW1wbCA8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0VYUFJFU1NJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUFjY2Vzc0ltcGwgPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUFjY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQXJyYXlBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcnJheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTU19fQVJSQVkgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1NfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCA8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQXJyYXlDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaW1lbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5SW5pdGlhbGl6ZXJJbXBsIDxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUluaXRpYWxpemVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBcnJheUluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FSUkFZX0lOSVRJQUxJWkVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0lOSVRJQUxJWkVSX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQm9vbGVhbkxpdGVyYWxJbXBsIDxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQm9vbGVhbkxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEJvb2xlYW5MaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0JPT0xFQU5fTElURVJBTCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2xlYW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQk9PTEVBTl9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2FzdEV4cHJlc3Npb25JbXBsIDxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2FzdEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVENhc3RFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT05fX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwgPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVENoYXJhY3RlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUwgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXIgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCA8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT04gPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyZ3VtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCA8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcnVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmFsc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbCA8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRGaWVsZEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1MgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNlaXZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTX19GSUVMRCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1NfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsIDxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT04gPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWZ0IE9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJpZ2h0IE9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBPcGVyYW5kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZW9mSW1wbCA8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZW9mSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbnN0YW5jZW9mKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFT0YgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFT0ZfX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbnN0YW5jZW9mPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFT0ZfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCA8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTiA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyZ3VtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTmFtZUltcGwgPGVtPlBUIE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9OQU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05BTUVfX05BTUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05BTUVfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdWxsTGl0ZXJhbEltcGwgPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdWxsTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUTnVsbExpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTlVMTF9MSVRFUkFMID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OVUxMX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdW1iZXJMaXRlcmFsSW1wbCA8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVtYmVyTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUTnVtYmVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9OVU1CRVJfTElURVJBTCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRva2VuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTlVNQkVSX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwgPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQcmVmaXhFeHByZXNzaW9uSW1wbCA8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUUHJlZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFN0cmluZ0xpdGVyYWxJbXBsIDxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXRlcmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFRoaXNMaXRlcmFsSW1wbCA8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFRoaXNMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRUaGlzTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9USElTX0xJVEVSQUwgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1RISVNfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFR5cGVMaXRlcmFsSW1wbCA8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFR5cGVMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRUeXBlTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9UWVBFX0xJVEVSQUwgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfVFlQRV9MSVRFUkFMX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1RZUEVfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEludmFsaWRFeHByZXNzaW9uSW1wbCA8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEludmFsaWRFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTlZBTElEX0VYUFJFU1NJT04gPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOVkFMSURfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlUmVmZXJlbmNlSW1wbCA8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlUmVmZXJlbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRV9SRUZFUkVOQ0UgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRV9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCA8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjbGFyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IgPGVtPlBUIEluZml4IE9wZXJhdG9yPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5maXhPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTkZJWF9PUEVSQVRPUiA9IDMxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yIDxlbT5QVCBQcmVmaXggT3BlcmF0b3I8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUUHJlZml4T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX09QRVJBVE9SID0gMzI7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZSA8ZW0+SUphdmEgT2JqZWN0IEluc3RhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSmF2YU9iamVjdEluc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbiA8ZW0+SmF2YSBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKYXZhQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24gPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbiNnZXRJbml0U3RyaW5nIDxlbT5Jbml0IFN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZygpCi0JICogQHNlZSAjZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiA8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFyZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldFBhcmVudCgpCi0JICogQHNlZSAjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fUGFyZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RmVhdHVyZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlKCkKLQkgKiBAc2VlICNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEltcGxpY2l0QWxsb2NhdGlvbl9GZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uIDxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uKCkKLQkgKiBAc2VlICNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiA8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MgPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEFycmF5QWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXJyYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5KCkKLQkgKiBAc2VlICNnZXRQVEFycmF5QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5QWNjZXNzX0FycmF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRJbmRleGVzIDxlbT5JbmRleGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmRleGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRJbmRleGVzKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5QWNjZXNzX0luZGV4ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiA8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQXJyYXlDcmVhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEFycmF5Q3JlYXRpb25fVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXREaW1lbnNpb25zIDxlbT5EaW1lbnNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaW1lbnNpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldERpbWVuc2lvbnMoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUNyZWF0aW9uX0RpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldEluaXRpYWxpemVyKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyIDxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBcnJheUluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyI2dldEV4cHJlc3Npb25zIDxlbT5FeHByZXNzaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhwcmVzc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIjZ2V0RXhwcmVzc2lvbnMoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsIDxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRCb29sZWFuTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBzZWUgI2dldFBUQm9vbGVhbkxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQm9vbGVhbkxpdGVyYWxfQm9vbGVhblZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uIDxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDYXN0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVENhc3RFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwgPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVENoYXJhY3RlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVENoYXJhY3RlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYXIgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0Q2hhclZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVENoYXJhY3RlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9DaGFyVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIDxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFyZ3VtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldEFyZ3VtZW50cygpCi0JICogQHNlZSAjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX0FyZ3VtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24gPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldENvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0NvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRUcnVlIDxlbT5UcnVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VHJ1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldFRydWUoKQotCSAqIEBzZWUgI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldEZhbHNlIDxlbT5GYWxzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkZhbHNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0RmFsc2UoKQotCSAqIEBzZWUgI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9GYWxzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyA8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBURmllbGRBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZWNlaXZlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIoKQotCSAqIEBzZWUgI2dldFBURmllbGRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0RmllbGQoKQotCSAqIEBzZWUgI2dldFBURmllbGRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBURmllbGRBY2Nlc3NfRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uIDxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRJbmZpeEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0TGVmdE9wZXJhbmQgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxlZnQgT3BlcmFuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kKCkKLQkgKiBAc2VlICNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fTGVmdE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3BlcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvcigpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUSW5maXhFeHByZXNzaW9uX09wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRSaWdodE9wZXJhbmQoKQotCSAqIEBzZWUgI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9SaWdodE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRFeHRlbmRlZE9wZXJhbmRzIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRFeHRlbmRlZE9wZXJhbmRzKCkKLQkgKiBAc2VlICNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mIDxlbT5QVCBJbnN0YW5jZW9mPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEluc3RhbmNlb2Y8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUSW5zdGFuY2VvZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0T3BlcmFuZCA8ZW0+T3BlcmFuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk9wZXJhbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0T3BlcmFuZCgpCi0JICogQHNlZSAjZ2V0UFRJbnN0YW5jZW9mKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRJbnN0YW5jZW9mKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEluc3RhbmNlb2ZfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uIDxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZWNlaXZlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRSZWNlaXZlcigpCi0JICogQHNlZSAjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVE1ldGhvZEludm9jYXRpb25fUmVjZWl2ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFyZ3VtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRBcmd1bWVudHMoKQotCSAqIEBzZWUgI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX0FyZ3VtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lIDxlbT5QVCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UFROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVE5hbWVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbCA8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUTnVsbExpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCA8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUTnVtYmVyTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwjZ2V0VG9rZW4gPGVtPlRva2VuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG9rZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwjZ2V0VG9rZW4oKQotCSAqIEBzZWUgI2dldFBUTnVtYmVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFROdW1iZXJMaXRlcmFsX1Rva2VuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIDxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uKCkKLQkgKiBAc2VlICNnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0V4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiA8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUUHJlZml4RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3BlcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IoKQotCSAqIEBzZWUgI2dldFBUUHJlZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uKCkKLQkgKiBAc2VlICNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwgPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFN0cmluZ0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVFN0cmluZ0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldExpdGVyYWxWYWx1ZSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpdGVyYWwgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0TGl0ZXJhbFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVFN0cmluZ0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUU3RyaW5nTGl0ZXJhbF9MaXRlcmFsVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWwgPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFRoaXNMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsIDxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRUeXBlTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVFR5cGVMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24gPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24jZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uI2dldE1lc3NhZ2UoKQotCSAqIEBzZWUgI2dldFBUSW52YWxpZEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSA8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIDxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldERlY2xhcmF0aW9uIDxlbT5EZWNsYXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlY2xhcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldERlY2xhcmF0aW9uKCkKLQkgKiBAc2VlICNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXRJbXBvcnRzIDxlbT5JbXBvcnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbXBvcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldEltcG9ydHMoKQotCSAqIEBzZWUgI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0ltcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yIDxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlBUIEluZml4IE9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFBUSW5maXhPcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yIDxlbT5QVCBQcmVmaXggT3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QVCBQcmVmaXggT3BlcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFBUUHJlZml4T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIDxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSA8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvbkZhY3RvcnkgZ2V0SW5zdGFudGlhdGlvbkZhY3RvcnkoKTsKLQotfSAvL0luc3RhbnRpYXRpb25QYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9KYXZhQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNjU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9KYXZhQWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgImFsbG9jYXRpb24iIHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICJhbGxvY2F0aW9uIiBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SmF2YUFsbG9jYXRpb24oKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBbGxvY2F0aW9uIGV4dGVuZHMgRU9iamVjdHsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBpcyBhIHBhcnNlIHRyZWUgYWxsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhcnNlIHRyZWUgYWxsb2NhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gaXMgYW4gaW1wbGljaXQgYWxsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGltcGxpY2l0IGFsbG9jYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCk7Ci19IC8vIEphdmFBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI2YjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YSx2IDEuMSAyMDA1LzEwLzI4IDIyOjU2OjQ2IHJrdWxwIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLiBDdXJyZW50bHkgd2Ugb25seSBzdG9yZSB0aGUgCi0gKiBlbnRpcmUgZGVjbGFyYXRpb24gYXMgYSBzdHJpbmcsIGluY2x1ZGluZyB0aGUgIm5ldyBBQ2xhc3MoKSB7Li4ufSIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldERlY2xhcmF0aW9uIDxlbT5EZWNsYXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldEltcG9ydHMgPGVtPkltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVjbGFyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWNsYXJhdGlvbiB0ZXh0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWNsYXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVjbGFyYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0RlY2xhcmF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb24gPGVtPkRlY2xhcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWNsYXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlY2xhcmF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBpbXBvcnRzIG5lZWRlZCBpbiB0aGUgbWFpbiBjbGFzcyBieSB0aGlzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGEgdHJhbnNpZW50IGF0dHJpYnV0ZS4gSXQgaXMgbm90IHNlcmlhbGl6ZWQsIG5vciBpcyBpdCBwYXJzZWQgaW50byBmcm9tIGV4aXN0aW5nIGNvZGUuIEl0cyBvbmx5IHB1cnBvc2UgaXMgdG8gaGVscCBjb2RlIGdlbmVyYXRpb24gb24gYSBicmFuZCBuZXcgZGVjbGFyYXRpb24gdG8ga25vdyB3aGF0IGltcG9ydHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluIGNsYXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBvcnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0ltcG9ydHMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEltcG9ydHMoKTsKLQotfSAvLyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlBY2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyNzJjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5QWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IEFjY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFycmF5IGFjY2Vzcy4gZS5nLiB4WzNdLiAKLSAqIAotICogVW5saWtlIEFTVCwgdGhlIGVudGlyZSBleHByZXNzaW9uIG9mIHR5cGUgeFszXVs0XSB3aWxsIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2VwYXJhdGUgQXJyYXlBY2Nlc3MgZm9yIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbi4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIGl0IGlzIGEgc2ltcGxlIGFycmF5IGFjY2VzcyB3aGVyZSBpdCBpcyBvZiB0aGUgZm9ybSB7ZXhwcmVzc2lvbn1bZXhwcmVzc2lvbl1bZXhwcmVzc2lvbl0uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRBcnJheSA8ZW0+QXJyYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0SW5kZXhlcyA8ZW0+SW5kZXhlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUFjY2VzcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEFycmF5QWNjZXNzIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFycmF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGFycmF5IHRvIGFjY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJyYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFycmF5KFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlBY2Nlc3NfQXJyYXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEFycmF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXJyYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFycmF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcnJheShQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXhlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbnMgcmVwcmVzZW50aW5nIHRoZSBpbmRleGVzIG9mIHRoZSBhY2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5QWNjZXNzX0luZGV4ZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5kZXhlcygpOwotCi19IC8vIEFycmF5QWNjZXNzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5Q3JlYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlDcmVhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThjYWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlDcmVhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQ3JlYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBcnJheSBDcmVhdGlvbiBleHByZXNzaW9uLCBlLmcuIG5ldyBpbnRbM10gb3IgbmV3IGphdmEubGFuZ1N0cmluZ1tdW10ge3siYSJ9LCB7ImIifX0KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldERpbWVuc2lvbnMgPGVtPkRpbWVuc2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEFycmF5Q3JlYXRpb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlLCBlLmcuIGludFtdW10gb3IgamF2YS5sYW5nLlN0cmluZ1tdLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBkaW1lbnNpb24gYnJhY2tldHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpbWVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIHRoZSBkaW1lbnNpb25zLiBZb3UgY2FuIGhhdmUgWzNdWzRdW10gYnV0IFtdWzMzXSBpcyBpbnZhbGlkLiBTbyBmb3IgZWFjaCBkaW1lbnNpb24gdGhhdCBoYXMgYW4gZXhwcmVzc2lvbiwgdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSBpbiB0aGUgbGlzdCwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIFdoZW4geW91IHJlYWNoIHRoZSBlbXB0eSBkaW1lbnNpb25zLCB0aGUgbGlzdCB3aWxsIGVuZCB0b28uIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaW1lbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUNyZWF0aW9uX0RpbWVuc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsaXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgaW5pdGlhbGl6ZXIsIGlmIGFueSwgZm9yIHRoaXMgYXJyYXkuIEUuZy4gbmV3IGludFtdIHsyLDN9LiBJdCBpcyB0aGUgezIsM30uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBcnJheUluaXRpYWxpemVyIGdldEluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRpYWxpemVyKFBUQXJyYXlJbml0aWFsaXplciB2YWx1ZSk7Ci0KLX0gLy8gQXJyYXlDcmVhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZjVmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBcnJheSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLiBUaGlzIGlzIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciBjb250YWluZWQgd2l0aGluIHRoZSBleHByZXNzaW9ucyBsaXN0IGZvciB0aGUgdG9wIEFycmF5SW5pdGlhbGl6ZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyI2dldEV4cHJlc3Npb25zIDxlbT5FeHByZXNzaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUluaXRpYWxpemVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQXJyYXlJbml0aWFsaXplciBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBpbml0aWFsaXplciwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBmaXJzdCBjYXNlIGl0IHdpbGwgYmUgdHdvIE51bWJlckxpdGVyYWxzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIsIGZvbGxvd2VkIGJ5IGEgTnVtYmVyTGl0ZXJhbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHByZXNzaW9ucygpOwotCi19IC8vIEFycmF5SW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQm9vbGVhbkxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQm9vbGVhbkxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1NmRlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEJvb2xlYW5MaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9vbGVhbiBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGJvb2xlYW4gbGl0ZXJhbCwgaS5lLiB0cnVlIG9yIGZhbHNlIGRpcmVjdGx5IGluIHRoZSBjb2RlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQm9vbGVhbkxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRCb29sZWFuTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29sZWFuIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2xlYW5WYWx1ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQm9vbGVhblZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29sZWFuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIEJvb2xlYW5MaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENhc3RFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENhc3RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmQyMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDYXN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDYXN0IGV4cHJlc3Npb24sIGUuZy4gKHNob3J0KSAxMAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENhc3RFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ2FzdEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgb2YgdGhlIGNhc3QsIGUuZy4gaW50IG9yIGphdmEubGFuZy5TdHJpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBDYXN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENoYXJhY3RlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIxZDZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJhY3RlciBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGNoYXJhY3RlciBleHByZXNzaW9uLCBlLmcuICdhJyBvciAnXHInLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENoYXJhY3RlckxpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAnYScgb3IgJ1xyJy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIHRoZW1zZWx2ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzY2FwZWRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYXIgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgcHJpbWl0aXZlIGNoYXJhY3RlciB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhclZhbHVlKGNoYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQljaGFyIGdldENoYXJWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFyVmFsdWUoY2hhciB2YWx1ZSk7Ci0KLX0gLy8gQ2hhcmFjdGVyTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMWUzMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLiBFLmcuIG5ldyBTdHJpbmcoImEiKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBjbGFzcy4gRS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBUaGlzIHNob3VsZCBiZSBmdWxseS1xdWFsaWZpZWQgZm9yIGFsbG9jYXRpb24gcHVycG9zZXMuIEl0IHNob3VsZCBhbHNvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIGlmIFggaXMgYW4gaW5uZXIgY2xhc3Mgb2Ygai5ZLCB0aGVuIHRoZSB0eXBlIGhlcmUgc2hvdWxkIGJlICJqLlkkWCIuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bcmd1bWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBcmd1bWVudHMoKTsKLQotfSAvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTIxNWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmRpdGlvbmFsIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgdGVzdCBFeHByZXNzb24sIGUuZy4gKHg9MykgPyAxIDogMgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRUcnVlIDxlbT5UcnVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbmRpdGlvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldENvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25kaXRpb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRydWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0cnVlIGV4cHJlc3Npb24KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJ1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VHJ1ZShQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRUcnVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRUcnVlIDxlbT5UcnVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcnVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUcnVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcnVlKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GYWxzZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZhbHNlIGV4cHJlc3Npb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZhbHNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRGYWxzZShQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9GYWxzZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RmFsc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldEZhbHNlIDxlbT5GYWxzZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmFsc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEZhbHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGYWxzZShQVEV4cHJlc3Npb24gdmFsdWUpOwotCi19IC8vIENvbmRpdGlvbmFsRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNmMyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURXhwcmVzc2lvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRFeHByZXNzaW9uIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmlzaXRvciBpcyBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0KFBhcnNlVmlzaXRvciB2aXNpdG9yKTsKLX0gLy8gRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRGaWVsZEFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRGaWVsZEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ3ZmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURmllbGRBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWVsZCBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRGaWVsZEFjY2VzcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEZpZWxkQWNjZXNzIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlY2VpdmVyKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBhY2Nlc3NlZCwgZS5nLiByZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEZpZWxkQWNjZXNzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4RXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NmMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5maXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGV4cHJlc3Npb24gd2l0aCBhbiBvcGVyYXRvciB0aGF0IGhhcyB0d28gb3BlcmFuZHMsIGUuZy4gMyArIDQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0TGVmdE9wZXJhbmQgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldEV4dGVuZGVkT3BlcmFuZHMgPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEluZml4RXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZWZ0IE9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxlZnQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRMZWZ0T3BlcmFuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0TGVmdE9wZXJhbmQgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVmdCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRMZWZ0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVmdE9wZXJhbmQoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvcGVyYXRvciwgZS5nLiArCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcgotCSAqIEBzZWUgI3NldE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uX09wZXJhdG9yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbmZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcGVyYXRvcihQVEluZml4T3BlcmF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlnaHQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJpZ2h0IGV4cHJlc3Npb24uIGkuZS4gNCBvZiAiMyArIDQiCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJpZ2h0T3BlcmFuZChQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9SaWdodE9wZXJhbmQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldFJpZ2h0T3BlcmFuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSaWdodE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJpZ2h0T3BlcmFuZChQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgT3BlcmFuZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNlcmllcyBvZiBpbmZpeCBvcGVyYXRpb25zIG9mIHRoZSBzYW1lIG9wZXJhdG9yLCBlLmcuIDEgKyAyICsgMyArIDQuIDEgYW5kIDIgd2lsbCBnbyBpbnRvIGxlZnQgYW5kIHJpZ2h0LCB3aGlsZSB7MywgNH0gd2lsbCBnbyBpbnRvIHRoZSBleHRlbmRlZCBvcGVyYW5kcy4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSBleHByZXNzaW9uCi0JICogSWYgdGhlcmUgaXMgbm8gbGVmdCBvcGVyYW5kIGFuZCBhIHJpZ2h0IG9wZXJhbmQsIG9yIHZpY2UgdmVyc2EsIGFuZCBubyBleHRlbmRlZCBvcGVyYW5kcwotCSAqIHJldHVybiB0aGUgcmVtYWluaW5nIHNpbmdsZSBvcGVyYW5kCi0JICogSWYgdGhlcmUgaXMgbm8gbGVmdCBvcGVyYW5kIGFuZCBhIHJpZ2h0IGFuZCBzb21lIGV4dGVuZGVkIG9uZXMgc2h1ZmZsZSBldmVyeXRoaW5nIGFsb25nCi0JICogc28gdGhhdCB0aGUgcmlnaHQgYmVjb21lcyB0aGUgbGVmdCBhbmQgdGhlIGZpcnN0IGV4dGVuZGVkIG1vdmVzIGludG8gdGhlIHJpZ2h0Ci0JICogb3IgaWYgbm8gcmlnaHQgYW5kIGEgbGVmdCB0aGVuIGp1c3QgbW92ZSB0aGUgZmlyc3QgZXh0ZW5kZWQgaW50byB0aGUgcmlnaHQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEV4cHJlc3Npb24gYXNDb21wcmVzc2VkRXhwcmVzc2lvbigpOwotCi19IC8vIEluZml4RXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3YzE0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkluZml4IE9wZXJhdG9yPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVudW1lcmF0b3IgZm9yIHRoZSBvcGVyYXRvciBvbiBhbiBJbmZpeEV4cHJlc3Npb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhPcGVyYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBUSW5maXhPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAqIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1RJTUVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ESVZJREU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAvIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0RJVklERV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWSURFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFTUFJTkRFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICUgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUkVNQUlOREVSX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1BSU5ERVIgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UExVUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICsgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUExVU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NSU5VUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIC0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTUlOVVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVTID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFRlQgU0hJRlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8PCBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNMRUZUX1NISUZUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1NISUZUID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJJR0hUIFNISUZUIFNJR05FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqID4+IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1JJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU0hJRlRfU0lHTkVEID0gNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJJR0hUIFNISUZUIFVOU0lHTkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPj4+IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1JJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVF9VTlNJR05FRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRVNTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCAgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTEVTU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVTUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HUkVBVEVSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNHUkVBVEVSX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSID0gOTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFU1MgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPD0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTEVTU19FUVVBTFNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1NfRVFVQUxTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HUkVBVEVSIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqID49IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0dSRUFURVJfRVFVQUxTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX0VRVUFMUyA9IDExOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPT0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjRVFVQUxTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVBTFMgPSAxMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVCBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAhPSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfRVFVQUxTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRVFVQUxTID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5YT1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBeIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1hPUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE9SID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTkQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAmIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0FORF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5EID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIHwgIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI09SX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUiA9IDE2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORElUSU9OQUwgQU5EPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogJiYgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9BTkQgPSAxNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkRJVElPTkFMIE9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogfHwgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORElUSU9OQUxfT1JfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkRJVElPTkFMX09SID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFRJTUVTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFRJTUVTLCAiVElNRVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRJVklERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNESVZJREUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBESVZJREVfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoRElWSURFLCAiRElWSURFIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRU1BSU5ERVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNQUlOREVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgUkVNQUlOREVSX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFJFTUFJTkRFUiwgIlJFTUFJTkRFUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UExVUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQTFVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgUExVU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihQTFVTLCAiUExVUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TUlOVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUlOVVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBNSU5VU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihNSU5VUywgIk1JTlVTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRUZUIFNISUZUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xFRlRfU0hJRlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBMRUZUX1NISUZUX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKExFRlRfU0hJRlQsICJMRUZUX1NISUZUIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SSUdIVCBTSElGVCBTSUdORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUklHSFRfU0hJRlRfU0lHTkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFJJR0hUX1NISUZUX1NJR05FRCwgIlJJR0hUX1NISUZUX1NJR05FRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UklHSFQgU0hJRlQgVU5TSUdORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUklHSFRfU0hJRlRfVU5TSUdORUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBSSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihSSUdIVF9TSElGVF9VTlNJR05FRCwgIlJJR0hUX1NISUZUX1VOU0lHTkVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xFU1MKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBMRVNTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKExFU1MsICJMRVNTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HUkVBVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0dSRUFURVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBHUkVBVEVSX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKEdSRUFURVIsICJHUkVBVEVSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRVNTIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMRVNTX0VRVUFMUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIExFU1NfRVFVQUxTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKExFU1NfRVFVQUxTLCAiTEVTU19FUVVBTFMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkdSRUFURVIgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0dSRUFURVJfRVFVQUxTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgR1JFQVRFUl9FUVVBTFNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoR1JFQVRFUl9FUVVBTFMsICJHUkVBVEVSX0VRVUFMUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VRVUFMUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIEVRVUFMU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihFUVVBTFMsICJFUVVBTFMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVCBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX0VRVUFMUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIE5PVF9FUVVBTFNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoTk9UX0VRVUFMUywgIk5PVF9FUVVBTFMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlhPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNYT1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBYT1JfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoWE9SLCAiWE9SIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQU5ECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgQU5EX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKEFORCwgIkFORCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBPUl9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihPUiwgIk9SIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05ESVRJT05BTCBBTkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORElUSU9OQUxfQU5ECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKENPTkRJVElPTkFMX0FORCwgIkNPTkRJVElPTkFMX0FORCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORElUSU9OQUwgT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORElUSU9OQUxfT1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBDT05ESVRJT05BTF9PUl9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihDT05ESVRJT05BTF9PUiwgIkNPTkRJVElPTkFMX09SIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UFQgSW5maXggT3BlcmF0b3I8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvcltdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBQVEluZml4T3BlcmF0b3JbXSB7Ci0JCQlUSU1FU19MSVRFUkFMLAotCQkJRElWSURFX0xJVEVSQUwsCi0JCQlSRU1BSU5ERVJfTElURVJBTCwKLQkJCVBMVVNfTElURVJBTCwKLQkJCU1JTlVTX0xJVEVSQUwsCi0JCQlMRUZUX1NISUZUX0xJVEVSQUwsCi0JCQlSSUdIVF9TSElGVF9TSUdORURfTElURVJBTCwKLQkJCVJJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUwsCi0JCQlMRVNTX0xJVEVSQUwsCi0JCQlHUkVBVEVSX0xJVEVSQUwsCi0JCQlMRVNTX0VRVUFMU19MSVRFUkFMLAotCQkJR1JFQVRFUl9FUVVBTFNfTElURVJBTCwKLQkJCUVRVUFMU19MSVRFUkFMLAotCQkJTk9UX0VRVUFMU19MSVRFUkFMLAotCQkJWE9SX0xJVEVSQUwsCi0JCQlBTkRfTElURVJBTCwKLQkJCU9SX0xJVEVSQUwsCi0JCQlDT05ESVRJT05BTF9BTkRfTElURVJBTCwKLQkJCUNPTkRJVElPTkFMX09SX0xJVEVSQUwsCi0JCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFUkFUT1JfU1RSSU5HOwotCXN0YXRpYyB7Ci0JCU9QRVJBVE9SX1NUUklORyA9IG5ldyBTdHJpbmdbVkFMVUVTX0FSUkFZLmxlbmd0aF07Ci0JCU9QRVJBVE9SX1NUUklOR1tUSU1FU10gPSAiKiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tESVZJREVdID0gIi8iOwotCQlPUEVSQVRPUl9TVFJJTkdbUkVNQUlOREVSXSA9ICIlIjsKLQkJT1BFUkFUT1JfU1RSSU5HW1BMVVNdID0gIisiOwotCQlPUEVSQVRPUl9TVFJJTkdbTUlOVVNdID0gIi0iOwotCQlPUEVSQVRPUl9TVFJJTkdbTEVGVF9TSElGVF0gPSAiPCI7Ci0JCU9QRVJBVE9SX1NUUklOR1tSSUdIVF9TSElGVF9TSUdORURdID0gIj4+IjsKLQkJT1BFUkFUT1JfU1RSSU5HW1JJR0hUX1NISUZUX1VOU0lHTkVEXSA9ICI+Pj4iOwotCQlPUEVSQVRPUl9TVFJJTkdbTEVTU10gPSAiPCI7Ci0JCU9QRVJBVE9SX1NUUklOR1tHUkVBVEVSXSA9ICI+IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0xFU1NfRVFVQUxTXSA9ICI8PSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tHUkVBVEVSX0VRVUFMU10gPSAiPj0iOwotCQlPUEVSQVRPUl9TVFJJTkdbRVFVQUxTXSA9ICI9PSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tOT1RfRVFVQUxTXSA9ICIhPSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tYT1JdID0gIl4iOwotCQlPUEVSQVRPUl9TVFJJTkdbQU5EXSA9ICImIjsKLQkJT1BFUkFUT1JfU1RSSU5HW09SXSA9ICJ8IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0NPTkRJVElPTkFMX0FORF0gPSAiJiYiOwotCQlPUEVSQVRPUl9TVFJJTkdbQ09ORElUSU9OQUxfT1JdID0gInx8IjsKLQl9Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UFQgSW5maXggT3BlcmF0b3I8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBUIEluZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRJbmZpeE9wZXJhdG9yIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUFRJbmZpeE9wZXJhdG9yIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UFQgSW5maXggT3BlcmF0b3I8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRJbmZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBUSU1FUzogcmV0dXJuIFRJTUVTX0xJVEVSQUw7Ci0JCQljYXNlIERJVklERTogcmV0dXJuIERJVklERV9MSVRFUkFMOwotCQkJY2FzZSBSRU1BSU5ERVI6IHJldHVybiBSRU1BSU5ERVJfTElURVJBTDsKLQkJCWNhc2UgUExVUzogcmV0dXJuIFBMVVNfTElURVJBTDsKLQkJCWNhc2UgTUlOVVM6IHJldHVybiBNSU5VU19MSVRFUkFMOwotCQkJY2FzZSBMRUZUX1NISUZUOiByZXR1cm4gTEVGVF9TSElGVF9MSVRFUkFMOwotCQkJY2FzZSBSSUdIVF9TSElGVF9TSUdORUQ6IHJldHVybiBSSUdIVF9TSElGVF9TSUdORURfTElURVJBTDsKLQkJCWNhc2UgUklHSFRfU0hJRlRfVU5TSUdORUQ6IHJldHVybiBSSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMOwotCQkJY2FzZSBMRVNTOiByZXR1cm4gTEVTU19MSVRFUkFMOwotCQkJY2FzZSBHUkVBVEVSOiByZXR1cm4gR1JFQVRFUl9MSVRFUkFMOwotCQkJY2FzZSBMRVNTX0VRVUFMUzogcmV0dXJuIExFU1NfRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIEdSRUFURVJfRVFVQUxTOiByZXR1cm4gR1JFQVRFUl9FUVVBTFNfTElURVJBTDsKLQkJCWNhc2UgRVFVQUxTOiByZXR1cm4gRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIE5PVF9FUVVBTFM6IHJldHVybiBOT1RfRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIFhPUjogcmV0dXJuIFhPUl9MSVRFUkFMOwotCQkJY2FzZSBBTkQ6IHJldHVybiBBTkRfTElURVJBTDsKLQkJCWNhc2UgT1I6IHJldHVybiBPUl9MSVRFUkFMOwotCQkJY2FzZSBDT05ESVRJT05BTF9BTkQ6IHJldHVybiBDT05ESVRJT05BTF9BTkRfTElURVJBTDsKLQkJCWNhc2UgQ09ORElUSU9OQUxfT1I6IHJldHVybiBDT05ESVRJT05BTF9PUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQVEluZml4T3BlcmF0b3IoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvcGVyYXRvciBzdHJpbmcgKGkuZS4gZm9yIFBMVVMgcmV0dXJuICIrIikuCi0JICogQHJldHVybiBUaGUgb3BlcmF0b3Igc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBPUEVSQVRPUl9TVFJJTkdbZ2V0VmFsdWUoKV07Ci0JfQotCi19IC8vSW5maXhPcGVyYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZVJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY1MTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEluc3RhbmNlUmVmZXJlbmNlIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlKElKYXZhSW5zdGFuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJSmF2YUluc3RhbmNlIGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZShJSmF2YUluc3RhbmNlIHZhbHVlKTsKLQotfSAvLyBQVEluc3RhbmNlUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlb2YuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VvZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM2OWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VvZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluc3RhbmNlb2Y8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBJbnN0YW5jZW9mIGV4cHJlc3Npb24sIGUuZy4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0T3BlcmFuZCA8ZW0+T3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5zdGFuY2VvZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEluc3RhbmNlb2YgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIHRvIHRlc3QsIGUuZy4geCBpbiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcGVyYW5kKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5zdGFuY2VvZl9PcGVyYW5kKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0T3BlcmFuZCA8ZW0+T3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3BlcmFuZChQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHRlc3QsIGUuZy4gamF2YS5sYW5nLlN0cmluZy4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnN0YW5jZW9mCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEludmFsaWRFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEludmFsaWRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTA5ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnZhbGlkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludmFsaWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgc29tZSBleHByZXNzaW9uIHdlIGp1c3QgY2FuJ3QgZXZhbHVhdGUgZm9yIG91ciBwdXJwb3Nlcy4gSXQgYWxsb3dzIHVzIHRvIHRlbGwgdGhlIGV2YWx1YXRpb24gd2hhdCBpcyBhY3R1YWxseSB3cm9uZy4gSXQgc2hvdWxkIGJlIHBsYWNlZCBhcyB0aGUgcm9vdCBleHByZXNzaW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBtdWNoIG9mIHRoZSB0cmVlIGFuZCB0aGVuIGZpbmFsbHkgZmFpbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW52YWxpZEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRJbnZhbGlkRXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIG1lc3NhZ2UgYXMgdG8gd2h5IGl0IGlzIGludmFsaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbl9NZXNzYWdlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24jZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEludmFsaWRFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE1ldGhvZEludm9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTWV0aG9kSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYyNWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTWV0aG9kSW52b2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEludm9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBNZXRob2RJbnZvY2F0aW9uIGV4cHJlc3Npb24sIGUuZy4geC5nZXRZKDMpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWNlaXZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hvIHRoZSBtZXRob2QgaXMgaW52b2tlZCBhZ2FpbnN0LiBUaGlzIG1heSBiZSBub3Qgc2V0LCB3aGljaCBtZWFucyAidGhpcyIuIEl0IG1heSBhbHNvIGJlIGEgTmFtZSwgd2hpY2ggd291bGQgbWVhbiBhIGNsYXNzIGxpa2UgImphdmEubGFuZy5TdHJpbmciCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY2VpdmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE1ldGhvZEludm9jYXRpb25fUmVjZWl2ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNlaXZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVjZWl2ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyZ3VtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudHMsIGlmIGFueSwgdG8gdGhlIG1ldGhvZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJndW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRNZXRob2RJbnZvY2F0aW9uX0FyZ3VtZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFyZ3VtZW50cygpOwotCi19IC8vIE1ldGhvZEludm9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2NiZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgcmVwcmVzZW50cyBhIG5hbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3IgdGhlIHJlY2VpdmVyIG9mIGEgbWV0aG9kIGludm9jYXRpb24sIGUuZy4geC5nZXRZKCkgb3IgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKS4gSW4gdGhlc2UgY2FzZXMgeW91IHdvdWxkIGhhdmUgYSBuYW1lIG9mICJ4IiBvciAiamF2YS5sYW5nLlN0cmluZyIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE5hbWUgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUsIHdoaWNoIGNhbiBiZSBhIHR5cGUgb3IgYSB2YXJpYWJsZS4gSWYgaXQgaXMgYSB0eXBlLCB0aGVuICBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE5hbWVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVsbExpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVsbExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMDZhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bGxMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVsbCBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAibnVsbCIKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE51bGxMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUTnVsbExpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci19IC8vIE51bGxMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bWJlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVtYmVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q0MjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVtYmVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnQgYSBudW1iZXIgcHJpbWl0aXZlIGxpdGVyYWwsIGUuZy4gMTAuIE9uZSBvcHRpbWl6YXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpcyB0aGF0IGlmIGFuIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm0gK251bWJlciBvciAtbnVtYmVyLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGEgUHJlZml4RXhwcmVzc2lvbiB3aXRoIGEgTnVtYmVyTGl0ZXJhbCB0byBqdXN0IGEgTnVtYmVyTGl0ZXJhbC4gVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwjZ2V0VG9rZW4gPGVtPlRva2VuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE51bWJlckxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFROdW1iZXJMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRva2VuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG9rZW4gdmFsdWUsIGUuZy4gMTAsIDEwZCwgb3IgLTEwLjc1Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRva2VuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb2tlbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VG9rZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRva2VuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb2tlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG9rZW4oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOdW1iZXJMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjllYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGV4cHJlc3Npb24gd2l0aGluIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGUgcGFyZW50aGVzaXMsIGUuZy4gKHgrMykgdGhlbiB0aGUgZXhwcmVzc2lvbiBpcyAieCszIgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gUGFyZW50aGVzaXplZEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4RXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTA0MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZml4IEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIG9uZSBvcGVyYW5kIG9wZXJhdG9yLCB3aGVyZSB0aGUgb3BlcmF0b3IgY29tZXMgYmVmb3JlIHRoZSBvcGVyYW5kLCBlLmcuIC0gKHgrMykuIEluIEFTVCwgZXZlbiAtMyBpcyBtb2RlbGVkIGFzIGEgUHJlZml4RXhwcmVzc2lvbiBvZiBvcGVyYXRvciAiLSIgYW5kIGV4cHJlc3Npb24gb2YgTnVtYmVyTGl0ZXJhbCgzKS4gQnV0IHdlIG9wdGltaXplIHRoaXMgYXdheSBhbmQganVzdCB1c2UgYSBOdW1iZXJMaXRlcmFsKC0zKSBkaXJlY3RseSBpbnN0ZWFkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRQcmVmaXhFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3BlcmF0b3Igb2YgdGhpcyBleHByZXNzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSAjc2V0T3BlcmF0b3IoUFRQcmVmaXhPcGVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUHJlZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUUHJlZml4T3BlcmF0b3IgZ2V0T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IKLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3BlcmF0b3IoUFRQcmVmaXhPcGVyYXRvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiB0aGF0IHRoZSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi19IC8vIFByZWZpeEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZDRiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5QcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHByZWZpeCBleHByZXNzaW9uIG9wZXJhdG9yLiBXZSBhcmUgbm90IG1vZGVsaW5nICsrIGFuZCAtLS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQcmVmaXhPcGVyYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBUUHJlZml4T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBMVVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiArIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1BMVVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TUlOVVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAtIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI01JTlVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT01QTEVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogfiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNDT01QTEVNRU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVNRU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICEgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1QgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UExVUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQTFVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIFBMVVNfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKFBMVVMsICJQTFVTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NSU5VUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNSU5VUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBNSU5VU19MSVRFUkFMID0gbmV3IFBUUHJlZml4T3BlcmF0b3IoTUlOVVMsICJNSU5VUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09NUExFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT01QTEVNRU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIENPTVBMRU1FTlRfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKENPTVBMRU1FTlQsICJDT01QTEVNRU5UIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIE5PVF9MSVRFUkFMID0gbmV3IFBUUHJlZml4T3BlcmF0b3IoTk9ULCAiTk9UIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UFQgUHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFBUUHJlZml4T3BlcmF0b3JbXSB7Ci0JCQlQTFVTX0xJVEVSQUwsCi0JCQlNSU5VU19MSVRFUkFMLAotCQkJQ09NUExFTUVOVF9MSVRFUkFMLAotCQkJTk9UX0xJVEVSQUwsCi0JCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFUkFUT1JfU1RSSU5HOwotCXN0YXRpYyB7Ci0JCU9QRVJBVE9SX1NUUklORyA9IG5ldyBTdHJpbmdbVkFMVUVTX0FSUkFZLmxlbmd0aF07Ci0JCU9QRVJBVE9SX1NUUklOR1tQTFVTXSA9ICIrIjsKLQkJT1BFUkFUT1JfU1RSSU5HW01JTlVTXSA9ICItIjsKLQkJT1BFUkFUT1JfU1RSSU5HW0NPTVBMRU1FTlRdID0gIn4iOwotCQlPUEVSQVRPUl9TVFJJTkdbTk9UXSA9ICIhIjsKLQl9Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UFQgUHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QVCBQcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFByZWZpeE9wZXJhdG9yIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUFRQcmVmaXhPcGVyYXRvciByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQVFByZWZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBQTFVTOiByZXR1cm4gUExVU19MSVRFUkFMOwotCQkJY2FzZSBNSU5VUzogcmV0dXJuIE1JTlVTX0xJVEVSQUw7Ci0JCQljYXNlIENPTVBMRU1FTlQ6IHJldHVybiBDT01QTEVNRU5UX0xJVEVSQUw7Ci0JCQljYXNlIE5PVDogcmV0dXJuIE5PVF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQVFByZWZpeE9wZXJhdG9yKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0b3Igc3RyaW5nIChpLmUuIGZvciBQTFVTIHJldHVybiAiKyIpLgotCSAqIEByZXR1cm4gVGhlIG9wZXJhdG9yIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gT1BFUkFUT1JfU1RSSU5HW2dldFZhbHVlKCldOwotCX0KLX0gLy9QcmVmaXhPcGVyYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRTdHJpbmdMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFN0cmluZ0xpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhNWVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFN0cmluZ0xpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHJpbmcgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIGxpdGVyYWwsIGUuZy4gImFzZGYiLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZXNjYXBlZCBzdHJpbmcuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAiYWIiIG9yICJjXHIiLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFc2NhcGVkVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRTdHJpbmdMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXRlcmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGl0ZXJhbFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUU3RyaW5nTGl0ZXJhbF9MaXRlcmFsVmFsdWUoKQotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaXRlcmFsVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpdGVyYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGl0ZXJhbFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU3RyaW5nTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUaGlzTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUaGlzTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM5Y2E3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVGhpc0xpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaGlzIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzICJ0aGlzIiwgZS5nLiB0aGlzLmdldFgoKSB3aWxsIGJlIGEgTWV0aG9kSW52b2NhdGlvbiB3aXRoIHRoZSByZWNlaXZlciBiZWluZyBhIFRoaXNMaXRlcmFsLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGZvcm1hdCBYWVoudGhpcyBiZWNhdXNlIHRoYXQgaXMgZm9yIGlubmVyIGNsYXNzZXMgYW5kIHdlIGRvbid0IHN1cHBvcnQgdGhhdCByaWdodCBub3cuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRUaGlzTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFRoaXNMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotfSAvLyBUaGlzTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUeXBlTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUeXBlTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E5MTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVHlwZUxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUVHlwZUxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRUeXBlTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUVHlwZUxpdGVyYWxfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUeXBlTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VUcmVlQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VUcmVlQWxsb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM1NmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVHJlZUFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcnNlVHJlZUFsbG9jYXRpb24gZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQYXJzZVRyZWVBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzJhNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotIAotLyoqCi0gKiBBIHZpc2l0b3IgZm9yIGFic3RyYWN0IHBhcnNlIGV4cHJlc3Npb24gdHJlZXMuCi0gKiA8cD4KLSAqIEZvciBlYWNoIGRpZmZlcmVudCBjb25jcmV0ZSBFeHByZXNzaW9uIG5vZGUgdHlwZSA8aXQ+VDwvaXQ+IHRoZXJlIGFyZQotICogYSBwYWlyIG9mIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+cHVibGljIGJvb2xlYW4gdmlzaXQoPGl0PlQ8L2l0PiBub2RlKTwvY29kZT4gLSBWaXNpdHMKLSAqIHRoZSBnaXZlbiBub2RlIHRvIHBlcmZvcm0gc29tZSBhcmJpdHJhcnkgb3BlcmF0aW9uLiBJZiA8Y29kZT50cnVlPC9jb2RlPgotICogaXMgcmV0dXJuZWQsIHRoZSBnaXZlbiBub2RlJ3MgY2hpbGQgbm9kZXMgd2lsbCBiZSB2aXNpdGVkIG5leHQ7IGhvd2V2ZXIsCi0gKiBpZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQsIHRoZSBnaXZlbiBub2RlJ3MgY2hpbGQgbm9kZXMgd2lsbCAKLSAqIG5vdCBiZSB2aXNpdGVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIGRvZXMKLSAqIG5vdGhpbmcgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50Ci0gKiB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KLSAqIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBlbmRWaXNpdCg8aXQ+VDwvaXQ+IG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIFdoZW4gdXNlZCBpbiB0aGUKLSAqIGNvbnZlbnRpb25hbCB3YXksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbGwgb2YgdGhlIGdpdmVuIG5vZGUncwotICogY2hpbGRyZW4gaGF2ZSBiZWVuIHZpc2l0ZWQgKG9yIGltbWVkaWF0ZWx5LCBpZiA8Y29kZT52aXNpdDwvY29kZT4gcmV0dXJuZWQKLSAqIDxjb2RlPmZhbHNlPC9jb2RlPikuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgZG9lcwotICogbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogSW4gYWRkaXRpb24sIHRoZXJlIGFyZSBhIHBhaXIgb2YgbWV0aG9kcyBmb3IgdmlzaXRpbmcgQVNUIG5vZGVzIGluIHRoZSAKLSAqIGFic3RyYWN0LCByZWdhcmRsZXNzIG9mIG5vZGUgdHlwZToKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBwcmVWaXNpdChBU1ROb2RlIG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIAotICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBwcmlvciB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZS1zcGVjaWZpYwotICogPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZC4KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgotICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIHBvc3RWaXNpdChBU1ROb2RlIG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIAotICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciB0aGUgYXBwcm9wcmlhdGUgdHlwZS1zcGVjaWZpYwotICogPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZC4KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgotICogPC91bD4KLSAqIDxwPgotICogRm9yIG5vZGVzIHdpdGggbGlzdC12YWx1ZWQgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzIHdpdGhpbiB0aGUgbGlzdAotICogYXJlIHZpc2l0ZWQgaW4gb3JkZXIuIEZvciBub2RlcyB3aXRoIG11bHRpcGxlIHByb3BlcnRpZXMsIHRoZSBjaGlsZCBub2RlcwotICogYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIHRoYXQgbW9zdCBjbG9zZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSBsZXhpY2FsCi0gKiByZWFkaW5nIG9yZGVyIG9mIHRoZSBzb3VyY2UgcHJvZ3JhbS4gRm9yIGluc3RhbmNlLCBmb3IgYSB0eXBlIGRlY2xhcmF0aW9uCi0gKiBub2RlLCB0aGUgY2hpbGQgb3JkZXJpbmcgaXM6IG5hbWUsIHN1cGVyY2xhc3MsIHN1cGVyaW50ZXJmYWNlcywgYW5kIAotICogYm9keSBkZWNsYXJhdGlvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgdHJlZSBpbiB0aGUgdmlzaXRvciwgY2FyZSBpcyByZXF1aXJlZCB0bwotICogZW5zdXJlIHRoYXQgdGhlIGNvbnNlcXVlbmNlcyBhcmUgYXMgZXhwZWN0ZWQgYW5kIGRlc2lyYWJsZS4KLSAqIER1cmluZyB0aGUgY291cnNlIG9mIGFuIG9yZGluYXJ5IHZpc2l0IHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gbm9kZSwgZXZlcnkgbm9kZQotICogaW4gdGhlIHN1YnRyZWUgaXMgdmlzaXRlZCBleGFjdGx5IHR3aWNlLCBmaXJzdCB3aXRoIDxjb2RlPnZpc2l0PC9jb2RlPiBhbmQKLSAqIHRoZW4gd2l0aCA8Y29kZT5lbmRWaXNpdDwvY29kZT4uIER1cmluZyBhIHRyYXZlcnNhbCBvZiBhIHN0YXRpb25hcnkgdHJlZSwgCi0gKiBlYWNoIG5vZGUgaXMgZWl0aGVyIGJlaGluZCAoYWZ0ZXIgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KSwgYWhlYWQgKGJlZm9yZSAKLSAqIDxjb2RlPnZpc2l0PC9jb2RlPiksIG9yIGluIHByb2dyZXNzIChiZXR3ZWVuIDxjb2RlPnZpc2l0PC9jb2RlPiBhbmQKLSAqIHRoZSBtYXRjaGluZyA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLiBDaGFuZ2VzIHRvIHRoZSAiYmVoaW5kIiByZWdpb24gb2YgdGhlCi0gKiB0cmVlIGFyZSBvZiBubyBjb25zZXF1ZW5jZSB0byB0aGUgdmlzaXQgaW4gcHJvZ3Jlc3MuIENoYW5nZXMgdG8gdGhlICJhaGVhZCIKLSAqIHJlZ2lvbiB3aWxsIGJlIHRha2VuIGluIHN0cmlkZS4gQ2hhbmdlcyB0byB0aGUgImluIHByb2dyZXNzIiBwb3J0aW9uIGFyZQotICogdGhlIG1vcmUgaW50ZXJlc3RpbmcgY2FzZXMuIFdpdGggYSBub2RlLCB0aGUgdmFyaW91cyBwcm9wZXJ0aWVzIGFyZSBhcnJhbmdlZAotICogaW4gYSBsaW5lYXIgbGlzdCwgd2l0aCBhIGN1cnNvciB0aGF0IHNlcGFyYXRlcyB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUKLSAqIGJlZW4gdmlzaXRlZCBmcm9tIHRoZSBvbmVzIHRoYXQgYXJlIHN0aWxsIHRvIGJlIHZpc2l0ZWQgKHRoZSBjdXJzb3IKLSAqIGlzIGJldHdlZW4gdGhlIGVsZW1lbnRzLCByYXRoZXIgdGhhbiBvbiBhbiBlbGVtZW50KS4gVGhlIGN1cnNvciBtb3ZlcyBmcm9tCi0gKiB0aGUgaGVhZCB0byB0aGUgdGFpbCBvZiB0aGlzIGxpc3QsIGFkdmFuY2luZyB0byB0aGUgbmV4dCBwb3NpdGlvbiBqdXN0Ci0gKiA8aXQ+YmVmb3JlPC9pdD4gPGNvZGU+dmlzaXQ8L2NvZGU+IGlmIGNhbGxlZCBmb3IgdGhhdCBjaGlsZC4gQWZ0ZXIgdGhlIGNoaWxkCi0gKiBzdWJ0cmVlIGhhcyBiZWVuIGNvbXBsZXRlbHkgdmlzaXRlZCwgdGhlIHZpc2l0IG1vdmVzIG9uIHRoZSBjaGlsZCAKLSAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJzb3IuIFJlbW92aW5nIGEgY2hpbGQgd2hpbGUgaXQgaXMgYmVpbmcgdmlzaXRlZAotICogZG9lcyBub3QgYWx0ZXIgdGhlIGNvdXJzZSBvZiB0aGUgdmlzaXQuIEJ1dCBhbnkgY2hpbGRyZW4gYWRkZWQgYXQgcG9zaXRpb25zCi0gKiBhZnRlciB0aGUgY3Vyc29yIGFyZSBjb25zaWRlcmVkIGluIHRoZSAiYWhlYWQiIHBvcnRpb24gYW5kIHdpbGwgYmUgdmlzaXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2FzZXMgdG8gd2F0Y2ggb3V0IGZvcjoKLSAqIDx1bD4KLSAqIDxsaT5Nb3ZpbmcgYSBjaGlsZCBub2RlIGZ1cnRoZXIgZG93biB0aGUgbGlzdC4gVGhpcyBjb3VsZCByZXN1bHQgaW4gdGhlCi0gKiBjaGlsZCBzdWJ0cmVlIGJlaW5nIHZpc2l0ZWQgbXVsdGlwbGUgdGltZXM7IHRoZXNlIHZpc2l0cyBhcmUgc2VxdWVudGlhbC48L2xpPgotICogPGxpPk1vdmluZyBhIGNoaWxkIG5vZGUgdXAgaW50byBhbiBhbmNlc3Rvci4gSWYgdGhlIG5ldyBob21lIGZvcgotICogdGhlIG5vZGUgaXMgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiwgdGhlIHN1YnRyZWUgd2lsbCBiZSB2aXNpdGVkIAotICogYSBzZWNvbmQgdGltZTsgYWdhaW4sIHRoZXNlIHZpc2l0cyBhcmUgc2VxdWVudGlhbC48L2xpPgotICogPGxpPk1vdmluZyBhIG5vZGUgZG93biBpbnRvIGEgY2hpbGQuIElmIHRoZSBuZXcgaG9tZSBmb3IKLSAqIHRoZSBub2RlIGlzIGluIHRoZSAiYWhlYWQiIHBvcnRpb24sIHRoZSBzdWJ0cmVlIHdpbGwgYmUgdmlzaXRlZCAKLSAqIGEgc2Vjb25kIHRpbWU7IGluIHRoaXMgY2FzZSwgdGhlIHZpc2l0cyB3aWxsIGJlIG5lc3RlZC4gSW4gc29tZSBjYXNlcywKLSAqIHRoaXMgY2FuIGxlYWQgdG8gYSBzdGFjayBvdmVyZmxvdyBvciBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbi48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBOb3RlOiBUaGlzIGlzIGJhc2VkIHVwb24gdGhlIHZpc2l0IGNvbmNlcHQgaW4gb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IuIAotICoKLSAqIEBzZWUgRXhwcmVzc2lvbiNhY2NlcHQKLSAqICAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VWaXNpdG9yIHsKLQkKLQkvKioKLQkgKiBFeGNlcHRpb24gdG8gdGhyb3cgdG8ganVzdCBzdG9wIHZpc2l0aW5nIGEgcGFyc2UgdmlzaXQuIEl0IGRvZXNuJ3QgbWVhbiBlcnJvciwgaXQKLQkgKiBqdXN0IG1lYW5zIHN0b3AgdmlzaXRpbmcuIFBhcnNlVmlzaXRvcnMgc2hvdWxkIHRocm93IHRoaXMgd2hlbiB0aGV5IHdhbnQgdG8gc3RvcAotCSAqIHZpc2l0aW5nIGZ1cnRoZXIgd2l0aG91dCBhbiBleHBsaWNpdCBlcnJvci4KLQkgKiA8cD4KLQkgKiBJZiB0aGV5IHdhbnQgdG8gaW5kaWNhdGUgYW4gZXJyb3IsIHBhcnNlIHZpc2l0b3JzIGNhbiB0aHJvdyBhbnkgb3RoZXIgUnVudGltZUV4Y2VwdGlvbi4gCi0JICogVGhvc2Ugd2lsbCBhbHNvIHN0b3AgdmlzaXRpbmcsIGJ1dCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIG9uIG91dCBvZiB0aGUgCi0JICoge0BsaW5rIFBURXhwcmVzc2lvbiNhY2NlcHQoUGFyc2VWaXNpdG9yKX0uIFN0b3BWaXNpdGluZyB3aWxsIG5vdCBiZSBwYXNzZWQgb24KLQkgKiBidXQgd2lsbCBiZSBjYXVnaHQgaW5zaWRlIGFjY2VwdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RvcFZpc2l0aW5nIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAuMQotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUyNDY4NjA4MDY1NjgzNTU1MjBMOwotCQkKLQl9Ci0JLyoqCi0JICogVmlzaXRzIHRoZSBnaXZlbiBwYXJzZSBub2RlIHByaW9yIHRvIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0LiAoYmVmb3JlIDxjb2RlPnZpc2l0PC9jb2RlPikuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIHZpc2l0Ci0JICovCi0JcHVibGljIHZvaWQgcHJlVmlzaXQoUFRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gcGFyc2Ugbm9kZSBmb2xsb3dpbmcgdGhlIHR5cGUtc3BlY2lmaWMgdmlzaXQgKGFmdGVyIDxjb2RlPmVuZFZpc2l0PC9jb2RlPikuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIHZpc2l0Ci0JICovCi0JcHVibGljIHZvaWQgcG9zdFZpc2l0KFBURXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVHlwZUxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZVJlZmVyZW5jZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE5hbWUgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUVHlwZUxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW5zdGFuY2VSZWZlcmVuY2Ugbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9GZWF0dXJlVmFsdWVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9GZWF0dXJlVmFsdWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDk2OTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgKGFuIEVNRiBFT2JqZWN0IHN1YmNsYXNzKSBwcm92aWRlIGEgdmlzaXRlcgotICogY2FwYWJpbGl0eSB0byB0aGUgc2V0IGZlYXR1cmVzIG9uIHRoZSBFT2JqZWN0LiBUaGlzIHdheSBvbmx5IHRoZSBzZXQgZmVhdHVyZXMKLSAqIGFyZSBwcmVzZW50ZWQgdG8gdGhlIHZpc2l0b3IuIFRoaXMgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZVZhbHVlUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEEgaGVscGVyIGNsYXNzIGZvciBGZWF0dXJlVmFsdWVQcm92aWRlci4KLQkgKiAKLQkgKiBAc2VlIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyI3Zpc2l0U2V0RmVhdHVyZXMoRU9iamVjdCwgVmlzaXRvcikKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyIHsKLQkJCi0JCS8qKgotCQkgKiBBIGhlbHBlciB0byBoYW5kbGUgd2hlcmUgdGhlIG9iamVjdCBtYXkgb3IgbWF5IG5vdCBiZQotCQkgKiBpbXBsZW1lbnQgRmVhdHVyZVZhbHVlUHJvdmlkZXIuIFRoaXMgd2F5IGl0IGNhbiBiZSBhCi0JCSAqIGNvbW1vbiBhY2Nlc3MgdG8gZG8gaXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZW9iamVjdAotCQkgKiBAcGFyYW0gdmlzaXRvcgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoRU9iamVjdCBlb2JqZWN0LCBWaXNpdG9yIHZpc2l0b3IpIHsKLQkJCWlmIChlb2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlUHJvdmlkZXIpCi0JCQkJcmV0dXJuICgoRmVhdHVyZVZhbHVlUHJvdmlkZXIpZW9iamVjdCkudmlzaXRTZXRGZWF0dXJlcyh2aXNpdG9yKTsKLQkJCWVsc2UgewotCQkJCS8vIE5vdCBhIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBzbyBkbyBub3JtYWwuCi0JCQkJSXRlcmF0b3IgZmVhdHVyZXMgPSBlb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGZlYXR1cmVzLmhhc05leHQoKSl7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZXMubmV4dCgpOwotCQkJCQlpZihlb2JqZWN0LmVJc1NldChzZikpewotCQkJCQkJT2JqZWN0IHJlc3VsdCA9IHZpc2l0b3IuaXNTZXQoc2YsIGVvYmplY3QuZUdldChzZikpOwotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBbnN3ZXJzIHdoZXRoZXIgYW55IGZlYXR1cmUgaXMgc2V0IG9yIG5vdC4KLQkJICogPHA+Ci0JCSAqIDxiPk5vdGU6PC9iPiBUaGlzIFNIT1VMRCBOT1QgYmUgdXNlZCBhcyBhIHRlc3QgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdG8gZG8gdmlzaXRTZXRGZWF0dXJlcyBvciBub3QuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGp1c3QgY2FsbAotCQkgKiB2aXNpdFNldEZlYXR1cmVzLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIHNlZSBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkJICogCi0JCSAqIEBwYXJhbSBlb2JqZWN0Ci0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW55RmVhdHVyZVNldChFT2JqZWN0IGVvYmplY3QpIHsKLQkJCWlmIChlb2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlUHJvdmlkZXIpCi0JCQkJcmV0dXJuICgoRmVhdHVyZVZhbHVlUHJvdmlkZXIpZW9iamVjdCkuaXNBbnlGZWF0dXJlU2V0KCk7Ci0JCQllbHNlIHsKLQkJCQkvLyBOb3QgYSBGZWF0dXJlVmFsdWVQcm92aWRlciwgc28gZG8gbm9ybWFsLgotCQkJCUl0ZXJhdG9yIGZlYXR1cmVzID0gZW9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShmZWF0dXJlcy5oYXNOZXh0KCkpewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmVzLm5leHQoKTsKLQkJCQkJaWYoZW9iamVjdC5lSXNTZXQoc2YpKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSBGZWF0dXJlVmFsdWVQcm92aWRlckhlbHBlcigpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdmlzaXRlciBjYWxsYmFjay4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFZpc2l0b3J7Ci0JCS8qKgotCQkgKiBDYWxsZWQgZm9yIGVhY2ggc2V0IGZlYXR1cmUgb24gdGhlIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLgotCQkgKiAKLQkJICogQHBhcmFtIGZlYXR1cmUKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gdG8gY29udGludWUgdG8gbmV4dCBzZXR0aW5nLCBvciBhIHZhbHVlIHRvIHN0b3AgdmlzaXRpbmcgYW5kIHJldHVybiB0aGF0IHZhbHVlIGJlIHRoZSByZWFsIGV4Y2VwdGlvbi4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlPYmplY3QgaXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSk7Ci0JfQkKLQotCS8qKgotCSAqIFZpc2l0IHRoZSBzZXQgZmVhdHVyZXMuCi0JICogQHBhcmFtIGFWaXNpdG9yCi0JICogQHBhcmFtIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBzZXR0aW5ncyB2aXNpdGVkLCBvciB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgdmlzaXQgKGlzU2V0KSB0aGF0IHJldHVybmVkIGEgbm9uLW51bGxTZS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoVmlzaXRvciBhVmlzaXRvcik7Ci0JCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIGFueSBmZWF0dXJlIGlzIHNldCBvciBub3QuCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgU0hPVUxEIE5PVCBiZSB1c2VkIGFzIGEgdGVzdCBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBkbyB2aXNpdFNldEZlYXR1cmVzIG9yIG5vdC4gSXQgaXMKLQkgKiBtb3JlIGVmZmljaWVudCB0byBqdXN0IGNhbGwgdmlzaXRTZXRGZWF0dXJlcy4gSXQgc2hvdWxkIGJlIHVzZWQgb25seSB0byBzZWUgaWYgYW55IGZlYXR1cmVzIGFyZSBzZXQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FueUZlYXR1cmVTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRmNzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5zdGFuY2VzIG9mIGphdmEgZGF0YSB0eXBlcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhRGF0YVR5cGVJbnN0YW5jZSBleHRlbmRzIElKYXZhSW5zdGFuY2UgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA0YTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkluc3RhbmNlOwotLyoqCi0gKiBBIGNvbW1vbiBpbnRlcmZhY2UgZm9yIEphdmEgaW5zdGFuY2VzLiBJdCB3aWxsIGJlCi0gKiBzaGFyZWQgYnkgSmF2YSBPYmplY3RzIGFuZCBKYXZhIERhdGFUeXBlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUluc3RhbmNlIGV4dGVuZHMgRU9iamVjdCwgRmVhdHVyZVZhbHVlUHJvdmlkZXIsIElJbnN0YW50aWF0aW9uSW5zdGFuY2UgewotCQotCS8qKgotCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBvYmplY3QuCi0JICogQHJldHVybiBUaGUgYWxsb2NhdGlvbiBvYmplY3QuCi0JICovCi0JcHVibGljIEphdmFBbGxvY2F0aW9uIGdldEFsbG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGFsbG9jYXRpb24gZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqIEBwYXJhbSBhbGxvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvbihKYXZhQWxsb2NhdGlvbiBhbGxvY2F0aW9uKTsJCi0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gaGFzIGJlZW4gc2V0IG9yIG5vdC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNldC4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgd2UgYXJlIGFuIGluc3RhbmNlIG9mIG9uZSBvZiBKYXZhJ3MgcHJpbWl0aXZlIGRhdGEgdHlwZXMuCi0JICogZS5nLiBib29sZWFuLCBjaGFyIC0gdHJ1ZSBvdGhlcndpc2UsIGUuZy4gamF2YS5sYW5nLkJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgaGFzIGFuIGltcGxpY2l0IGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbXBsaWNpdCBhbGxvY2F0aW9uLiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IHNldCBvciBub3QgaW1wbGljaXQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIGhhcyBhbiBwYXJzZXRyZWUgYWxsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhcnNldHJlZSBhbGxvY2F0aW9uLiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IHNldCBvciBub3QgcGFyc2V0cmVlLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhT2JqZWN0SW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFPYmplY3RJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmMyNzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFPYmplY3RJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgamF2YSBvYmplY3QgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhT2JqZWN0SW5zdGFuY2UgZXh0ZW5kcyBJSmF2YUluc3RhbmNlIHsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTI0NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DdXJyZW50bHlUaGlzTm90U3VwcG9ydGVkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFEYXRhVHlwZUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGI1MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYSBKYXZhIE1vZGVsIERhdGF0eXBlIChpLmUuIHByaW1pdGl2ZSkuCi0gKiBJdCBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nLCB3aGljaCBiZWNvbWVzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcKLSAqIGZvciB0aGUgaW5zdGFuY2UuIEl0J3MgdG9TdHJpbmcgd2lsbCBiZSB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotICoKLSAqIEl0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgdGhlIElKYXZhRGF0YVR5cGVJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFEYXRhVHlwZUluc3RhbmNlIGV4dGVuZHMgSmF2YUluc3RhbmNlIGltcGxlbWVudHMgSUphdmFEYXRhVHlwZUluc3RhbmNlIHsKLQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpIHsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFGYWN0b3J5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdlYzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyOwotCi0vKioKLSAqIEFkYXB0ZXIgb24gSmF2YUZhY3RvcnlJbXBsIHRvIGRvIGluc3RhbnRpYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmFjdG9yeUhhbmRsZXIgaW1wbGVtZW50cyBJSW5zdGFudGlhdGlvbkhhbmRsZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBKYXZhRmFjdG9yeUhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YUZhY3RvcnlIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUZhY3RvcnlBZGFwdGVyLgotCSAqLwotCXByb3RlY3RlZCBKYXZhRmFjdG9yeUhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXIjaGFuZGxlc0NsYXNzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0NsYXNzKEVDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlIGluc3RhbmNlb2YgSmF2YUNsYXNzIHx8IHR5cGUgaW5zdGFuY2VvZiBKYXZhRGF0YVR5cGU7Ci0JCS8vIER1cmluZyBYTUkgbG9hZGluZywgaXQgY2FuJ3QgdGVsbCB0aGUgSmF2YURhdGFUeXBlIGlzIGRpZmZlcmVudCB0aGFuIEphdmFDbGFzcy4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlciNoYW5kbGVzRGF0YVR5cGUob3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNEYXRhVHlwZShKYXZhRGF0YVR5cGUgdHlwZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlciNjcmVhdGUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGphdmFDbGFzcykgewotCQlFT2JqZWN0IHJlc3VsdCA9IGphdmFDbGFzcyBpbnN0YW5jZW9mIEphdmFDbGFzcyA/IChFT2JqZWN0KSBuZXcgSmF2YU9iamVjdEluc3RhbmNlKCkgOiBuZXcgSmF2YURhdGFUeXBlSW5zdGFuY2UoKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIHJlc3VsdCkuZVNldENsYXNzKGphdmFDbGFzcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjE0OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGUkCi0gKiAgJFJldmlzaW9uJCAgJERhdGUkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLkludGVybmFsLkR5bmFtaWNWYWx1ZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBmb3IgamF2YSBtb2RlbCBvYmplY3RzLgotICogSXQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGRpcmVjdGx5LCB0aGUgSUphdmFPYmplY3RJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUluc3RhbmNlIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YUluc3RhbmNlIHsKLQkKLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKXsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZUNsYXNzKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXRBbGxvY2F0aW9uKCkgPyAoSmF2YUFsbG9jYXRpb24pIGVHZXQoSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcykpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNJbXBsaWNpdCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNQYXJzZVRyZWUoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFZpc2l0IHRoZSBhcmd1bWVudCB3aXRoIGFsbCBvZiB0aGUgc2V0IGZlYXR1cmVzIGluIGFuIG9wdGltaXplZCBmYXNoaW9uIAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBOSUwgPSBFU3RydWN0dXJhbEZlYXR1cmVJbXBsLkludGVybmFsU2V0dGluZ0RlbGVnYXRlU2luZ2xlLk5JTDsKLQlwdWJsaWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoVmlzaXRvciBhVmlzaXRvcikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVIYXNTZXR0aW5ncygpKSB7Ci0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHNldHRpbmdzID0gKEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIpIGVTZXR0aW5ncygpOwotCi0JCQlPYmplY3RbXSBzZXRQcm9wZXJ0eVZhbHVlcyA9IHNldHRpbmdzLmVTZXR0aW5ncygpOwotCQkJaWYgKHNldFByb3BlcnR5VmFsdWVzICE9IG51bGwpIHsKLQkJCQlMaXN0IGFsbEZlYXR1cmVzID0gc2V0dGluZ3MuZ2V0QWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRQcm9wZXJ0eVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHNldFByb3BlcnR5VmFsdWVzW2ldOwotCQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyA8bnVsbD4gaXMgaGFuZGxlZCBieSB0aGUgcGxhY2Vob2xkZXIgTklMLiBBIHNldHRpbmcgb2YgdHJ1ZSBudWxsIG1lYW5zIG5vdCBzZXQuIEEgc2V0dGluZyBvZiBOSUwgbWVhbnMgc2V0IHRvIG51bGwuCi0JCQkJCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBOSUwpCi0JCQkJCQkJcHJvcGVydHlWYWx1ZSA9IG51bGw7Ci0JCQkJCQlpZiAoKHJlc3VsdCA9IGFWaXNpdG9yLmlzU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzLmdldChpKSwgcHJvcGVydHlWYWx1ZSkpICE9IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQW55RmVhdHVyZVNldCgpIHsKLQkJaWYgKGVIYXNTZXR0aW5ncygpKSB7Ci0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHNldHRpbmdzID0gKEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIpIGVTZXR0aW5ncygpOwotCi0JCQlPYmplY3RbXSBzZXRQcm9wZXJ0eVZhbHVlcyA9IHNldHRpbmdzLmVTZXR0aW5ncygpOwotCQkJaWYgKHNldFByb3BlcnR5VmFsdWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNldFByb3BlcnR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gc2V0UHJvcGVydHlWYWx1ZXNbaV07Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFsbG9jYXRpb24oKSB7Ci0JCUVSZWZlcmVuY2UgYWxsb2NhdGlvbkZlYXR1cmUgPSBKYXZhSW5zdGFudGlhdGlvbi5nZXRBbGxvY2F0aW9uRmVhdHVyZSh0aGlzKTsKLQkJcmV0dXJuIGFsbG9jYXRpb25GZWF0dXJlICE9IG51bGwgJiYgZUlzU2V0KGFsbG9jYXRpb25GZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvbihKYXZhQWxsb2NhdGlvbiBhbGxvY2F0aW9uKSB7Ci0JCUVSZWZlcmVuY2UgYWxsb2NhdGlvbkZlYXR1cmUgPSBKYXZhSW5zdGFudGlhdGlvbi5nZXRBbGxvY2F0aW9uRmVhdHVyZSh0aGlzKTsKLQkJaWYgKGFsbG9jYXRpb25GZWF0dXJlICE9IG51bGwpCi0JCQllU2V0KGFsbG9jYXRpb25GZWF0dXJlLCBhbGxvY2F0aW9uKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gRU9iamVjdCdzIHRvU3RyaW5nIGlzIHRvbyBiaWcgZm9yIHVzLCBzbyB3ZSBkbyBhIGN1c3RvbWl6ZWQgb25lLgotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoJ0AnKTsKLQkJcmVzdWx0LmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKCkpKTsKLQkJCi0JCWlmIChlSXNQcm94eSgpKQotCQl7Ci0JCSAgcmVzdWx0LmFwcGVuZCgiIChlUHJveHlVUkk6ICIpOyAvLyROT04tTkxTLTEkCi0JCSAgcmVzdWx0LmFwcGVuZChlUHJveHlVUkkoKSk7Ci0JCSAgcmVzdWx0LmFwcGVuZCgnKScpOwotCQl9Ci0JCWlmKGdldEphdmFUeXBlKCkgIT0gbnVsbCl7Ci0JCQlyZXN1bHQuYXBwZW5kKCd7Jyk7Ci0JCQlyZXN1bHQuYXBwZW5kKGdldEphdmFUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCXJlc3VsdC5hcHBlbmQoJ30nKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBnZXRBbGxvY2F0aW9uKCk7Ci0JCQlpZiAoYWxsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZCgnOicpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChhbGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGNhbiBvY2N1ciBiZWNhdXNlIHNvbWV0aW1lcyB0aGlzIGVDbGFzcyBjYW4ndCBiZSBjb25zdHJ1Y3RlZCByaWdodCBhbmQgd29uJ3QgaGF2ZSBhbiBpbml0c3RyaW5nIGZlYXR1cmUuCi0JCQkvLyBJbiB0aGF0IGNhc2UgYW4gTlBFIGlzIHRocm93bi4KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlciBleHRlbmRzIEVQcm9wZXJ0aWVzSG9sZGVySW1wbCB7Ci0JCXByaXZhdGUgRUxpc3QgYWxsU3RydWN0dXJhbEZlYXR1cmVzOwotCQkKLQkJcHVibGljIEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIoKSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlU2V0dGluZ3MoKSB7Ci0JCQlyZXR1cm4gZVNldHRpbmdzOwotCQl9Ci0KLQkJcHVibGljIEVMaXN0IGdldEFsbFN0cnVjdHVyYWxGZWF0dXJlcygpIHsKLQkJCXJldHVybiBhbGxTdHJ1Y3R1cmFsRmVhdHVyZXM7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIENsZWFyIHRoZSBjYWNoZS4gVGhpcyBpcyBkdWUgdG8gCi0JCSAqIHN0cnVjdHVyYWwgZmVhdHVyZXMgaGF2ZSBjaGFuZ2VkLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJCWVTZXR0aW5ncyA9IG51bGw7Ci0JCQlzZXRFQ29udGVudHMobnVsbCk7Ci0JCQlzZXRFQ3Jvc3NSZWZlcmVuY2VzKG51bGwpOwotCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gbnVsbDsJCQkKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbC5FUHJvcGVydGllc0hvbGRlckltcGwjYWxsb2NhdGVTZXR0aW5ncyhpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhbGxvY2F0ZVNldHRpbmdzKGludCBtYXhpbXVtRHluYW1pY0ZlYXR1cmVJRCkgewotCQkJaWYgKGFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IGdldEVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsJCQkKLQkJCXN1cGVyLmFsbG9jYXRlU2V0dGluZ3MobWF4aW11bUR5bmFtaWNGZWF0dXJlSUQpOwotCQl9Ci0JCQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbC5FUHJvcGVydGllc0hvbGRlckltcGwjc2V0RUNvbnRlbnRzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVDb250ZW50cyhFTGlzdCBlQ29udGVudHMpIHsKLQkJCWlmIChhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBnZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQlzdXBlci5zZXRFQ29udGVudHMoZUNvbnRlbnRzKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbC5FUHJvcGVydGllc0hvbGRlckltcGwjc2V0RUNyb3NzUmVmZXJlbmNlcyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFQ3Jvc3NSZWZlcmVuY2VzKEVMaXN0IGVDcm9zc1JlZmVyZW5jZXMpIHsKLQkJCWlmIChhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBnZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQlzdXBlci5zZXRFQ3Jvc3NSZWZlcmVuY2VzKGVDcm9zc1JlZmVyZW5jZXMpOwotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVQcm9wZXJ0aWVzSG9sZGVyIGVQcm9wZXJ0aWVzKCkKLQl7Ci0JICBpZiAoZVByb3BlcnRpZXMgPT0gbnVsbCkKLQkgIHsKLQkJZVByb3BlcnRpZXMgPSBuZXcgSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcigpOwotCSAgfQotCSAgcmV0dXJuIGVQcm9wZXJ0aWVzOwotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VTZXRDbGFzcyhFQ2xhc3MpCi0JICovCi0JcHVibGljIHZvaWQgZVNldENsYXNzKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIuZVNldENsYXNzKGVDbGFzcyk7Ci0JCW1pZ3JhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RUNsYXNzIE5ldyBlQ2xhc3Mgc2V0IHRvLiAobnVsbCkgd2hlbiBtaWdyYXRpbmcgd2hpbGUgbm90IHNldHRpbmcgYSBuZXcgRUNsYXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1pZ3JhdGUoKSB7Ci0JCS8vIE5vdGU6IFRoaXMgaXMgZXh0cmVtZWxseSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIEl0IG1heSBjaGFuZ2UgZm9yIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBFTUYuCQotCQlpZiAoZVByb3BlcnRpZXMgIT0gbnVsbCAmJiAoZVByb3BlcnRpZXMuaGFzU2V0dGluZ3MoKSB8fCBlUHJvcGVydGllcy5nZXRFQ29udGVudHMoKSAhPSBudWxsIHx8IGVQcm9wZXJ0aWVzLmdldEVDcm9zc1JlZmVyZW5jZXMoKSAhPSBudWxsKSkgewotCQkJLy8gTWF5YmUgbmVlZCB0byByZWNvbnN0cnVjdCBzZXR0aW5ncyBvciBjbGVhciBjYWNoZS4KLQkJCUphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgcHJvcGVydGllcyA9IChKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKSBlUHJvcGVydGllczsKLQkJCUVMaXN0IG9sZEFsbEZlYXR1cmVzID0gcHJvcGVydGllcy5nZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQotCQkJLy8gU2VlIGlmIG1pZ3JhdGlvbiBuZWVkZWQuCi0JCQlpZiAocHJvcGVydGllcy5nZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkgPT0gb2xkQWxsRmVhdHVyZXMpCi0JCQkJcmV0dXJuOwkvLyBObyBtaWdyYXRpb24gbmVlZGVkLgotCQkJCi0JCQlPYmplY3RbXSBvbGRTZXR0aW5ncyA9IHByb3BlcnRpZXMuZVNldHRpbmdzKCk7CQkJCi0JCQlwcm9wZXJ0aWVzLmNsZWFyQ2FjaGUoKTsJLy8gQ2xlYXIgdGhlIGNhY2hlIHNvIHdlIGNhbiByZWJ1aWxkIGl0LgotCQkJaWYgKG9sZFNldHRpbmdzID09IG51bGwpIHsKLQkJCQlyZXR1cm47CS8vIEl0IHdhcyBqdXN0IGVpdGhlciBjb250ZW50cyBvciBjcm9zc3JlZnMsIGFuZCB0aGV5IGhhdmUgYmVlbiBhcHByb3ByaWF0ZWx5IGNsZWFyZWQuCQkJCi0JCQl9Ci0JCQkKLQkJCS8vIEl0IGlzIGFzc3VtZWQgdGhhdCBhbnkgU0YgdGhhdCAoYnkgaWRlbnRpdHkpIGlzIGluCi0JCQkvLyBib3RoIHRoZSBvbGQgYW5kIHRoZSBuZXcgZUNsYXNzLCB0aGVuIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgaW50ZXJuYWwgY2hhbmdlcy4gSXQgc2ltcGx5IGNoYW5nZWQgcG9zaXRpb24KLQkJCS8vIGluIHRoZSBzZXR0aW5ncyBsaXN0LiBPdGhlcndpc2UsIG5lZWQgdG8gc2VlIGlmIGNvbXBhdGlibGUgYnkgc2FtZSBuYW1lLCBhbmQgaWYgc28sIG1vdmUgaXQuCQkJCi0JCQllU2V0dGluZ3MoKTsJLy8gQ3JlYXRlIG5ldyBzZXR0aW5ncwotCQkJT2JqZWN0W10gbmV3U2V0dGluZ3MgPSBwcm9wZXJ0aWVzLmVTZXR0aW5ncygpOwotCQkJaW50IHN0YXRpY0ZlYXR1cmVDbnQgPSBlU3RhdGljRmVhdHVyZUNvdW50KCk7CQkJCi0JCQlmb3IgKGludCBvbGRJbmRleCA9IDA7IG9sZEluZGV4IDwgb2xkU2V0dGluZ3MubGVuZ3RoOyBvbGRJbmRleCsrKSB7Ci0JCQkJaWYgKG9sZFNldHRpbmdzW29sZEluZGV4XSAhPSBudWxsKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIG9sZEFsbEZlYXR1cmVzLmdldChvbGRJbmRleCtzdGF0aWNGZWF0dXJlQ250KTsKLQkJCQkJaW50IG5ld0luZGV4ID0gc3VwZXIuZUR5bmFtaWNGZWF0dXJlSUQoc2YpOwkvLyBUbyBhdm9pZCByZWN1cnNlIG9uIG1pZ3JhdGUuCi0JCQkJCWlmIChuZXdJbmRleCA+IC0xKSB7Ci0JCQkJCQltb3ZlRVNldHRpbmcob2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzLCBvbGRJbmRleCwgc2YsIG5ld0luZGV4KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFNlZSBpZiBpdCBleGlzdHMgYnkgbmFtZSBhbmQgaXMgY29tcGF0aWJsZS4KLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdTRiA9IHByb3BlcnRpZXMuZ2V0RUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKHNmLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAobmV3U0YgIT0gbnVsbCAmJiBuZXdTRi5nZXRDbGFzcygpLmVxdWFscyhzZi5nZXRDbGFzcygpKSAmJgotCQkJCQkJCW5ld1NGLmlzTWFueSgpID09IHNmLmlzTWFueSgpICYmIG5ld1NGLmlzQ2hhbmdlYWJsZSgpID09IHNmLmlzQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiBjb21wYXRpYmxlID0gbmV3U0YuaXNVbmlxdWUoKSA9PSBzZi5pc1VuaXF1ZSgpIHx8ICFuZXdTRi5pc1VuaXF1ZSgpOwkvLyBJZiBuZXcgaXMgbm90IHVuaXF1ZSwgdGhlbiBkb2Vzbid0IG1hdHRlciBpZiBvbGQgYW5kIG5ldyBhcmUgdGhlIHNhbWUKLQkJCQkJCQlpZiAobmV3U0YgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCQkJCUVSZWZlcmVuY2UgbmV3UmVmID0gKEVSZWZlcmVuY2UpIG5ld1NGOwotCQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBzZjsKLQkJCQkJCQkJY29tcGF0aWJsZSA9IG5ld1JlZi5pc0NvbnRhaW5tZW50KCkgPT0gcmVmLmlzQ29udGFpbm1lbnQoKSAmJiBuZXdSZWYuZ2V0RVJlZmVyZW5jZVR5cGUoKS5pc1N1cGVyVHlwZU9mKHJlZi5nZXRFUmVmZXJlbmNlVHlwZSgpKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY29tcGF0aWJsZSA9IG5ld1NGLmdldEVUeXBlKCkuZXF1YWxzKHNmLmdldEVUeXBlKCkpOwotCQkJCQkJCQkKLQkJCQkJCQlpZiAoY29tcGF0aWJsZSkgewotCQkJCQkJCQluZXdJbmRleCA9IGVEeW5hbWljRmVhdHVyZUlEKG5ld1NGKTsKLQkJCQkJCQkJbW92ZUVTZXR0aW5nKG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncywgb2xkSW5kZXgsIG5ld1NGLCBuZXdJbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IAotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlRVNldHRpbmcoT2JqZWN0W10gb2xkU2V0dGluZ3MsIE9iamVjdFtdIG5ld1NldHRpbmdzLCBpbnQgb2xkSW5kZXgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiwgaW50IG5ld0luZGV4KSB7Ci0JCS8vIFNlZSBpZiBzaW5nbGUgdnMgbWFueS4KLQkJaWYgKCFzZi5pc01hbnkoKSkKLQkJCW5ld1NldHRpbmdzW25ld0luZGV4XSA9IG9sZFNldHRpbmdzW29sZEluZGV4XTsJLy8gR3JlYXQsIHdlIGNhbiBqdXN0IG1vdmUgaXQgb3Zlci4KLQkJZWxzZSB7Ci0JCQkvLyBNYW55IGlzIG1vcmUgZGlmZmljdWx0LiBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBkeW5hbWljIGxpc3Qgb2YgcmlnaHQgdHlwZSwgYW5kCi0JCQkvLyB0aGVuIGp1c3QgY29weSBvdmVyIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBvbmUuIFdlIGNyZWF0ZSBuZXcgb25lIGJ5IGRvaW5nIGEgc2ltcGxlIGVHZXQuCi0JCQkvLyBUaGlzIHdpbGwgY29uc3RydWN0IGFuIGVtcHR5IG9uZSB3aXRoIG5vIG5vdGlmaWNhdGlvbnMgZ29pbmcgb3V0LgotCQkJLy8gTm90ZTogVGhpcyBpcyBleHRyZW1lbGx5IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gV2Ugd2lsbCBiZSB0aHJvd2luZyBhd2F5IHRoZSBvbGQKLQkJCS8vIG9sZE1hbnksIHNvIGl0IGlzIG9rIHRvIHJldXNlIHRoZSBhY3R1YWwgYXJyYXkgb2YgZGF0YSBmb3IgdGhlIG5ld01hbnkuCi0JCQlCYXNpY0VMaXN0IG5ld01hbnkgPSAoQmFzaWNFTGlzdCkgZUdldChzZik7Ci0JCQlCYXNpY0VMaXN0IG9sZE1hbnkgPSAoQmFzaWNFTGlzdCkgb2xkU2V0dGluZ3Nbb2xkSW5kZXhdOwotCQkJbmV3TWFueS5zZXREYXRhKG9sZE1hbnkuc2l6ZSgpLCBvbGRNYW55LmRhdGEoKSk7IAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBEeW5hbWljVmFsdWVIb2xkZXIgZVNldHRpbmdzKCkgewotCQltaWdyYXRlKCk7Ci0JCXJldHVybiBzdXBlci5lU2V0dGluZ3MoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1M2EwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgamF2YSBtb2RlbCBpbnN0YW50aWF0aW9uIGNvZGUgYW5kIHRvIGFjY2VzcyBkeW5hbWljIGZlYXR1cmVzLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluc3RhbnRpYXRpb24gewotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9DQVRJT04gPSAiYWxsb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTRmVhdHVyZShJSmF2YU9iamVjdEluc3RhbmNlIGpvYmplY3QsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gam9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ2V0U0ZlYXR1cmUoam9iamVjdCwgZmVhdHVyZU5hbWUpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0IGEgc3RydWN0dXJhbCBmZWF0dXJlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiBnZXRTRmVhdHVyZSgoSmF2YUNsYXNzKSBqb2JqZWN0LmdldEphdmFUeXBlKCksIHNmVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhIEphdmFDbGFzcywgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKEphdmFDbGFzcyBqY2xhc3MsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gZ2V0U0ZlYXR1cmUoamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCksIHNmVVJJKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgc3RydWN0dXJhbCBmZWF0dXJlIGZyb20gYSBSZXNvdXJjZVNldCwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKFJlc291cmNlU2V0IHJzZXQsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcnNldC5nZXRFT2JqZWN0KHNmVVJJLCB0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ2V0U0ZlYXR1cmUoKEphdmFDbGFzcykgam9iamVjdC5nZXRKYXZhVHlwZSgpLCBzZlVSSSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYSBKYXZhQ2xhc3MsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKEphdmFDbGFzcyBqY2xhc3MsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdldFNGZWF0dXJlKGpjbGFzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLCBzZlVSSSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGEgUmVzb3VyY2VTZXQsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKFJlc291cmNlU2V0IHJzZXQsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJzZXQuZ2V0RU9iamVjdChzZlVSSSwgdHJ1ZSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFsbG9jYXRpb24gRmVhdHVyZSBmb3IgdGhpcyBvYmplY3QuIFNpbmNlIGl0IGRlcGVuZHMKLQkgKiBvbiB3aGF0IHJlc291cmNlIHRoYXQgdGhlIG1ldGFjbGFzcyBpcyBkZWZpbmVkIGluLCB3ZSBtdXN0IGxvb2sgZm9yIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRBbGxvY2F0aW9uRmVhdHVyZShJSmF2YUluc3RhbmNlIGppbnN0YW5jZSkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGppbnN0YW5jZS5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoQUxMT0NBVElPTik7Ci0JfQotCQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoUmVzb3VyY2VTZXQgcnNldCkgewotCQkJaWYgKEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocnNldCwgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuQURBUFRFUl9LRVkpID09IG51bGwpCi0JCQkJcnNldC5lQWRhcHRlcnMoKS5hZGQobmV3IEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmM2JhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIGF0dGFjaGVkIHRvIHRoZSByZXNvdXJjZSBzZXQgZm9yIGEgamF2YSBtb2RlbC4gVGhlCi0gKiBKYXZhWE1JRmFjdG9yeSB3aWxsIGFzayBmb3IgdGhpcyBhZGFwdGVyIGFuZCBhc2sgaXQgZm9yIHRoZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyI2dldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCkKLQkgKi8KLQlwdWJsaWMgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCBmYWN0b3J5KSB7Ci0JCXJldHVybiBKYXZhRmFjdG9yeUhhbmRsZXIuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLkFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhT2JqZWN0SW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmMmIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLSAKLQotLyoqCi0gKiBKYXZhIE9iamVjdCBJbnN0YW5jZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzaW5jZSAxLjEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhT2JqZWN0SW5zdGFuY2UgZXh0ZW5kcyBKYXZhSW5zdGFuY2UgaW1wbGVtZW50cyBJSmF2YU9iamVjdEluc3RhbmNlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL1BhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M4MzQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcGFyc2UgdmlzaXRvciBmb3IgaW5zdGFudGlhdGluZyBhIGJlYW4gcHJveHkgZnJvbSBhIGphdmEgcGFyc2UgdHJlZSBhbGxvY2F0aW9uLgotICogSXQgY2FuIGJlIHJldXNlZCwgYnV0IGlzIG5vdCB0aHJlYWQtc2FmZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IgZXh0ZW5kcyBQYXJzZVZpc2l0b3IgewotCQkKLQkvKioKLQkgKiBUaGUgZXhwcmVzc2lvbiB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIGV2YWx1YXRlZC4KLQkgKi8KLQlwcml2YXRlIElFeHByZXNzaW9uIGV4cHJlc3Npb247Ci0JCi0JLyoKLQkgKiBUaGUgbmV4dCBleHByZXNzaW9uIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZC4gSXQgaXMgdXNlZCB3aGVuIG9uZSBleHByZXNzaW9uIGlzIHNlbmRpbmcgdGhlCi0JICogdmlzaXRhdGlvbiB0byB0aGUgbmV4dCBleHByZXNzaW9uLiBJdCB3aWxsIHNldCB0aGlzIHRvIHdoYXQgdGhhdCBleHByZXNzaW9uIHNob3VsZCBiZSB1c2luZy4gVGhpcwotCSAqIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBuZXh0IGV4cHJlc3Npb24gZG9lc24ndCBrbm93IHdoYXQgaXQgc2hvdWxkIGJlLgotCSAqLwotCXByaXZhdGUgRm9yRXhwcmVzc2lvbiBuZXh0RXhwcmVzc2lvbiA9IEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT047Ci0JCi0JLyoqCi0JICogQW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nLiBJdCBpcyBhIFJ1bnRpbWVFeGNlcHRpb24gYmVjYXVzZQotCSAqIGl0IGNhbiBiZSB0aHJvd24gYXQgYW55IHRpbWUuIEl0IHdyYXBwZXJzIGFub3RoZXIgZXhjZXB0aW9uLiBUaGF0IGV4Y2VwdGlvbgotCSAqIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY2F1c2Ugb2YgdGhlIFByb2Nlc3NpbmdFeGNlcHRpb24uCi0JICogCi0JICogQHNlZSBUaHJvd2FibGUjZ2V0Q2F1c2UoKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNjg2MjQyMjI0OTA0MDY2NDNMOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2F1c2UKLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIFByb2Nlc3NpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCQlzdXBlcihjYXVzZSk7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3JbXSBJTkZJWFRPUFJPWFk7Ci0Jc3RhdGljIHsKLQkJSU5GSVhUT1BST1hZID0gbmV3IEluZml4T3BlcmF0b3JbUFRJbmZpeE9wZXJhdG9yLlZBTFVFUy5zaXplKCldOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkFORF0gPSBJbmZpeE9wZXJhdG9yLklOX0FORDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9BTkRdID0gSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfT1JdID0gSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9PUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5ESVZJREVdID0gSW5maXhPcGVyYXRvci5JTl9ESVZJREU7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuRVFVQUxTXSA9IEluZml4T3BlcmF0b3IuSU5fRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJdID0gSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfRVFVQUxTXSA9IEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTEVGVF9TSElGVF0gPSBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTEVTU10gPSBJbmZpeE9wZXJhdG9yLklOX0xFU1M7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTEVTU19FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5NSU5VU10gPSBJbmZpeE9wZXJhdG9yLklOX01JTlVTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLk5PVF9FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9OT1RfRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLk9SXSA9IEluZml4T3BlcmF0b3IuSU5fT1I7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUExVU10gPSBJbmZpeE9wZXJhdG9yLklOX1BMVVM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUkVNQUlOREVSXSA9IEluZml4T3BlcmF0b3IuSU5fUkVNQUlOREVSOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF0gPSBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRF0gPSBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1VOU0lHTkVEOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlRJTUVTXSA9IEluZml4T3BlcmF0b3IuSU5fVElNRVM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuWE9SXSA9IEluZml4T3BlcmF0b3IuSU5fWE9SOwotCX0KLQkKLQkvKioKLQkgKiBBIGhlbHBlciBtZXRob2QgdG8gY29udmVydCB0aGUgcGFyc2UgdHJlZSdzIGluZml4IG9wZXJhdG9yIHRvIHRoZSBQcm94eSBpbmZpeCBvcGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmZpeE9wZXJhdG9yIGNvbnZlcnRQVEluZml4T3BlcmF0b3JUb1Byb3h5SW5maXhPcGVyYXRvcihQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJcmV0dXJuIElORklYVE9QUk9YWVtvcGVyYXRvci5nZXRWYWx1ZSgpXTsKLQl9Ci0KLQlzdGF0aWMgZmluYWwgUHJlZml4T3BlcmF0b3JbXSBQUkVGSVhUT1BST1hZOwotCXN0YXRpYyB7Ci0JCVBSRUZJWFRPUFJPWFkgPSBuZXcgUHJlZml4T3BlcmF0b3JbUFRQcmVmaXhPcGVyYXRvci5WQUxVRVMuc2l6ZSgpXTsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRdID0gUHJlZml4T3BlcmF0b3IuUFJFX0NPTVBMRU1FTlQ7Ci0JCVBSRUZJWFRPUFJPWFlbUFRQcmVmaXhPcGVyYXRvci5NSU5VU10gPSBQcmVmaXhPcGVyYXRvci5QUkVfTUlOVVM7Ci0JCVBSRUZJWFRPUFJPWFlbUFRQcmVmaXhPcGVyYXRvci5OT1RdID0gUHJlZml4T3BlcmF0b3IuUFJFX05PVDsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLlBMVVNdID0gUHJlZml4T3BlcmF0b3IuUFJFX1BMVVM7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwYXJzZSB0cmVlJ3MgcHJlZml4IG9wZXJhdG9yIHRvIHRoZSBQcm94eSBwcmVmaXggb3BlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdG9yCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZml4T3BlcmF0b3IgY29udmVydFBUUHJlZml4T3BlcmF0b3JUb1Byb3h5UHJlZml4T3BlcmF0b3IoUFRQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlyZXR1cm4gUFJFRklYVE9QUk9YWVtvcGVyYXRvci5nZXRWYWx1ZSgpXTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB2aXNpdG9yIHdpdGggdGhlIGdpdmVuIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IoKSB7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0JCi0KLQkvKioKLQkgKiBHZXQgdGhlIGJlYW5wcm94eSBmb3IgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJlZ2lzdHJ5LiBJdCB3aWxsIGV2YWx1YXRlIGltbWVkaWF0ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoUFRFeHByZXNzaW9uIGV4cHJlc3Npb24sIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhwcmVzc2lvbiA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQl0cnkgewotCQkJZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7Ci0JCX0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gSGFuZGxlIHRoZSBtb3N0IGNvbW1vbiB0aGF0IG1ha2Ugc2Vuc2UgdG8gYmUga25vdyBkaXN0aW5jdGx5IGFuZCB0aHJvdyB0aGVtIGluc3RlYWQgb2YgUHJvY2Vzc2luZ0V4Y2VwdGlvbi4KLQkJCVRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpOwotCQkJaWYgKHQgaW5zdGFuY2VvZiBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikKLQkJCQl0aHJvdyAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24pIHQ7Ci0JCQllbHNlIGlmICh0IGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKQotCQkJCXRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pIHQ7Ci0JCQllbHNlCi0JCQkJdGhyb3cgZTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXNpbmcgdGhlIGdpdmVuIGV4cHJlc3Npb24gcHJvY2Vzc29yIGFsbG9jYXRlIHRoZSBwcm94eS4gSXQgd2lsbCBub3QgZXZhbHVhdGUgaW1tZWRpYXRlbHksIGJ1dCBqdXN0IHB1c2ggb250byB0aGUgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBleHByZXNzaW9uUHJvY2Vzc29yCi0JICogQHJldHVybiB0aGUgRXhwcmVzc2lvblByb3h5IGZvciB0aGUgYWxsb2NhdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBnZXRQcm94eShQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvblByb2Nlc3NvcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvblByb2Nlc3NvcjsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IGV4cHJlc3Npb25Qcm9jZXNzb3IuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCk7Ci0JCQlleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKLQkJCXJldHVybiBwcm94eTsKLQkJfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBIYW5kbGUgdGhlIG1vc3QgY29tbW9uIHRoYXQgbWFrZSBzZW5zZSB0byBiZSBrbm93IGRpc3RpbmN0bHkgYW5kIHRocm93IHRoZW0gaW5zdGVhZCBvZiBQcm9jZXNzaW5nRXhjZXB0aW9uLgotCQkJVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikKLQkJCQl0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKSB0OwotCQkJZWxzZQotCQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIG5leHQgZXhwcmVzc2lvbiB0eXBlLiAoaS5lLiB0aGUgPGNvZGU+Zm9yRXhwcmVzc2lvbjwvY29kZT4gZmllbGQgb2YgbW9zdCBvZiB0aGUgY3JlYXRlIGV4cHJlc3Npb24gbWV0aG9kcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV4dEV4cHJlc3Npb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZUluZml4RXhwcmVzc2lvbihpbnQsIGludCwgaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gbmV4dEV4cHJlc3Npb24pIHsKLQkJdGhpcy5uZXh0RXhwcmVzc2lvbiA9IG5leHRFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBleHByZXNzaW9uIHR5cGUuIChpLmUuIHRoZSA8Y29kZT5mb3JFeHByZXNzaW9uPC9jb2RlPiBmaWVsZCBvZiBtb3N0IG9mIHRoZSBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZUluZml4RXhwcmVzc2lvbihpbnQsIGludCwgaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBGb3JFeHByZXNzaW9uIGdldE5leHRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV4dEV4cHJlc3Npb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLlBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DYW5ub3RQcm9jZXNzQW5vbnltb3VzRGVjbGFyYXRpb25zX0VYQ18sIG5ldyBPYmplY3RbXSB7bm9kZS5nZXREZWNsYXJhdGlvbigpfSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQXJyYXlBY2Nlc3MoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRJbmRleGVzKCkuc2l6ZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSk7Ci0JCW5vZGUuZ2V0QXJyYXkoKS5hY2NlcHQodGhpcyk7Ci0JCUxpc3QgaWR4ID0gbm9kZS5nZXRJbmRleGVzKCk7Ci0JCWludCBzID0gaWR4LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgpOwotCQkJKChQVEV4cHJlc3Npb24pIGlkeC5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQXJyYXlDcmVhdGlvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSwgbm9kZS5nZXREaW1lbnNpb25zKCkuc2l6ZSgpKTsKLQkJaWYgKG5vZGUuZ2V0RGltZW5zaW9ucygpLmlzRW1wdHkoKSkgewotCQkJbm9kZS5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzKTsJLy8gQXJyYXkgaW5pdGlhbGl6ZXIgZG9lc24ndCByZXF1aXJlIGEgbmV4dCBleHByZXNzaW9uLgotCQl9IGVsc2UgewotCQkJTGlzdCBkaW1zID0gbm9kZS5nZXREaW1lbnNpb25zKCk7Ci0JCQlpbnQgcyA9IGRpbXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OKTsKLQkJCQkoKFBURXhwcmVzc2lvbikgZGltcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQXJyYXlJbml0aWFsaXplcihub2RlLmdldEV4cHJlc3Npb25zKCkuc2l6ZSgpKTsKLQkJTGlzdCBleHBzID0gbm9kZS5nZXRFeHByZXNzaW9ucygpOwotCQlpbnQgcyA9IGV4cHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04pOwotCQkJKChQVEV4cHJlc3Npb24pIGV4cHMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmlzQm9vbGVhblZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVDYXN0RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0FTVF9FWFBSRVNTSU9OKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldENoYXJWYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCksIG5vZGUuZ2V0QXJndW1lbnRzKCkuc2l6ZSgpKTsKLQkJTGlzdCBhcmdzID0gbm9kZS5nZXRBcmd1bWVudHMoKTsKLQkJaW50IHMgPSBhcmdzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBhcmdzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTik7Ci0JCW5vZGUuZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUpOwotCQlub2RlLmdldFRydWUoKS5hY2NlcHQodGhpcyk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UpOwotCQlub2RlLmdldEZhbHNlKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVGaWVsZEFjY2VzcyhnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldEZpZWxkKCksIG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKTsKLQkJaWYgKG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSKTsKLQkJCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVJbmZpeEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgY29udmVydFBUSW5maXhPcGVyYXRvclRvUHJveHlJbmZpeE9wZXJhdG9yKG5vZGUuZ2V0T3BlcmF0b3IoKSksIG5vZGUuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLnNpemUoKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCk7Ci0JCW5vZGUuZ2V0TGVmdE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQpOwotCQlub2RlLmdldFJpZ2h0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJTGlzdCBleHRlbmRlZCA9IG5vZGUuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQlpbnQgcyA9IGV4dGVuZGVkLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQpOwotCQkJKChQVEV4cHJlc3Npb24pIGV4dGVuZGVkLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5TVEFOQ0VPRl9WQUxVRSk7Ci0JCW5vZGUuZ2V0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5vZGUuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0TmFtZSgpLCBub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCwgbm9kZS5nZXRBcmd1bWVudHMoKS5zaXplKCkpOwotCQlpZiAobm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSKTsKLQkJCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJTGlzdCBhcmdzID0gbm9kZS5nZXRBcmd1bWVudHMoKTsKLQkJaW50IHMgPSBhcmdzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5UKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBhcmdzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCS8vIFRoaXMgaXMgc3BlY2lhbCBpbiB0aGUgUFROYW1lIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSB0eXBlIHJlY2VpdmVyIGF0IHRoaXMgdGltZS4KLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVR5cGVSZWNlaXZlcihub2RlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJLy8gVGhpcyBpcyBzcGVjaWFsIGluIHRoZSBQVE5hbWUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIHR5cGUgcmVjZWl2ZXIgYXQgdGhpcyB0aW1lLgotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlTnVsbChnZXROZXh0RXhwcmVzc2lvbigpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJLy8gSXQgaXMgYXNzdW1lZCB0aGUgdG9rZW5zIGFyZSB0cmltbWVkLgotCQlTdHJpbmcgbGl0ID0gbm9kZS5nZXRUb2tlbigpOwotCQljaGFyIGxhc3RDaGFyID0gbGl0LmNoYXJBdChsaXQubGVuZ3RoKCktMSk7Ci0JCWlmIChsYXN0Q2hhciA9PSAnbCcgfHwgbGFzdENoYXIgPT0gJ0wnICkgewotCQkJLy8gSXQgaXMgZGVmaW5pdGVseSBhIGxvbmcuCi0JCQkvLyBVc2luZyBkZWNvZGUgc28gdGhhdCB0aGluZ3MgbGlrZSAweDMgd2lsbCBiZSBwYXJzZWQuIHBhcnNlTG9uZyB3b24ndCByZWNvZ25pemUgdGhvc2UuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBMb25nLmRlY29kZShsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKS0xKSkubG9uZ1ZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKGxhc3RDaGFyID09ICdGJyB8fCBsYXN0Q2hhciA9PSAnZicpIHsKLQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBmbG9hdC4KLQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIEZsb2F0LnBhcnNlRmxvYXQobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCktMSkpKTsKLQkJfSBlbHNlIGlmIChsYXN0Q2hhciA9PSAnRCcgfHwgbGFzdENoYXIgPT0gJ2QnKSAgewotCQkJLy8gSXQgaXMgZGVmaW5pdGVseSBhIGRvdWJsZS4KLQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIERvdWJsZS5wYXJzZURvdWJsZShsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKS0xKSkpOwotCQl9IGVsc2UgaWYgKGxpdC5pbmRleE9mKCcuJykgIT0gLTEgfHwgbGl0LmluZGV4T2YoJ2UnKSAhPSAtMSB8fCBsaXQuaW5kZXhPZignRScpICE9IC0xKSB7Ci0JCQkJLy8gSXQgaXMgZGVmaW5pdGVseSBhIGRvdWJsZS4gKGhhcyBhIHBlcmlvZCBvciBhbiBleHBvbmVudCwgYnV0IGRvZXMgbm90IGhhdmUgYW4gJ2YnIG9uIHRoZSBlbmQgaXMgYWx3YXlzIGEgZG91YmxlKS4KLQkJCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBEb3VibGUucGFyc2VEb3VibGUobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCkpKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBVc2luZyBkZWNvZGUgc28gdGhhdCB0aGluZ3MgbGlrZSAweDMgd2lsbCBiZSBwYXJzZWQuIHBhcnNlSW50IHdvbid0IHJlY29nbml6ZSB0aG9zZS4KLQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIEludGVnZXIuZGVjb2RlKGxpdCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7CS8vIEZvciBpbnN0YW50aWF0aW9uIHB1cnBvc2VzLCB0aGUgcGFyZW50aGVzaXMgY2FuIGJlIGlnbm9yZWQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIGNvbnZlcnRQVFByZWZpeE9wZXJhdG9yVG9Qcm94eVByZWZpeE9wZXJhdG9yKG5vZGUuZ2V0T3BlcmF0b3IoKSkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5EKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJveHlFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIGdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobm9kZS5nZXRMaXRlcmFsVmFsdWUoKSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ3VycmVudGx5VGhpc05vdFN1cHBvcnRlZF9FWENfKTsgCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVUeXBlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMWYxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0N1cnJlbnRseVRoaXNOb3RTdXBwb3J0ZWRfRVhDXyA9IElXQVYwMDAxRSBDdXJyZW50bHkgInRoaXMiIGlzIG5vdCBzdXBwb3J0ZWQKLVBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DYW5ub3RQcm9jZXNzQW5vbnltb3VzRGVjbGFyYXRpb25zX0VYQ18gPSBDYW5ub3QgcHJvY2VzcyBhbm9ueW1vdXMgZGVjbGFyYXRpb25zOiAiezB9IgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbXBsaWNpdEFsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzZGU1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkltcGxpY2l0IEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbCNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBsaWNpdEFsbG9jYXRpb25JbXBsIGV4dGVuZHMgSmF2YUFsbG9jYXRpb25JbXBsIGltcGxlbWVudHMgSW1wbGljaXRBbGxvY2F0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnQoKSA8ZW0+UGFyZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZWF0dXJlKCkgPGVtPkZlYXR1cmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZlYXR1cmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1wbGljaXRBbGxvY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBvbGRQYXJlbnQgPSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcGFyZW50KTsKLQkJCWlmIChwYXJlbnQgIT0gb2xkUGFyZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5ULCBvbGRQYXJlbnQsIHBhcmVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgYmFzaWNHZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KEVPYmplY3QgbmV3UGFyZW50KSB7Ci0JCUVPYmplY3Qgb2xkUGFyZW50ID0gcGFyZW50OwotCQlwYXJlbnQgPSBuZXdQYXJlbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVCwgb2xkUGFyZW50LCBwYXJlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5lSXNQcm94eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgb2xkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZmVhdHVyZSk7Ci0JCQlpZiAoZmVhdHVyZSAhPSBvbGRGZWF0dXJlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSwgb2xkRmVhdHVyZSwgZmVhdHVyZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgYmFzaWNHZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJZmVhdHVyZSA9IG5ld0ZlYXR1cmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkUsIG9sZEZlYXR1cmUsIGZlYXR1cmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcmVudCgpOwotCQkJCXJldHVybiBiYXNpY0dldFBhcmVudCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmVhdHVyZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVDoKLQkJCQlzZXRQYXJlbnQoKEVPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRToKLQkJCQlzZXRGZWF0dXJlKChFU3RydWN0dXJhbEZlYXR1cmUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVDoKLQkJCQlzZXRQYXJlbnQoKEVPYmplY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCXNldEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRToKLQkJCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkltcGxpY2l0QWxsb2NhdGlvbigiICsgZ2V0UGFyZW50KCkgKyAiLSIgKyBnZXRGZWF0dXJlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfSAvL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQyYWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwjZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbkltcGwgaW1wbGVtZW50cyBJbml0U3RyaW5nQWxsb2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRTdHJpbmcoKSA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRfU1RSSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRTdHJpbmcoKSA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW5pdFN0cmluZyA9IElOSVRfU1RSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdFN0cmluZygpIHsKLQkJcmV0dXJuIGluaXRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdFN0cmluZyhTdHJpbmcgbmV3SW5pdFN0cmluZykgewotCQlTdHJpbmcgb2xkSW5pdFN0cmluZyA9IGluaXRTdHJpbmc7Ci0JCWluaXRTdHJpbmcgPSBuZXdJbml0U3RyaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORywgb2xkSW5pdFN0cmluZywgaW5pdFN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkc6Ci0JCQkJcmV0dXJuIGdldEluaXRTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXNldEluaXRTdHJpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkc6Ci0JCQkJc2V0SW5pdFN0cmluZyhJTklUX1NUUklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXJldHVybiBJTklUX1NUUklOR19FREVGQVVMVCA9PSBudWxsID8gaW5pdFN0cmluZyAhPSBudWxsIDogIUlOSVRfU1RSSU5HX0VERUZBVUxULmVxdWFscyhpbml0U3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJlc3VsdC5hcHBlbmQoIkluaXRTdHJpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRTdHJpbmcpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZjJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEluc3RhbnRpYXRpb25GYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTjogcmV0dXJuIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT046IHJldHVybiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OOiByZXR1cm4gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1M6IHJldHVybiBjcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OOiByZXR1cm4gY3JlYXRlUFRBcnJheUNyZWF0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSOiByZXR1cm4gY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTjogcmV0dXJuIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1M6IHJldHVybiBjcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GOiByZXR1cm4gY3JlYXRlUFRJbnN0YW5jZW9mKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OOiByZXR1cm4gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUU6IHJldHVybiBjcmVhdGVQVE5hbWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVMTF9MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFROdWxsTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RISVNfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUVGhpc0xpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFRUeXBlTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRTogcmV0dXJuIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OOiByZXR1cm4gY3JlYXRlUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9PUEVSQVRPUjogewotCQkJCVBUSW5maXhPcGVyYXRvciByZXN1bHQgPSBQVEluZml4T3BlcmF0b3IuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX09QRVJBVE9SOiB7Ci0JCQkJUFRQcmVmaXhPcGVyYXRvciByZXN1bHQgPSBQVFByZWZpeE9wZXJhdG9yLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9PUEVSQVRPUjoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX09QRVJBVE9SOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCkgewotCQlJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwgaW5pdFN0cmluZ0FsbG9jYXRpb24gPSBuZXcgSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpbml0U3RyaW5nQWxsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpIHsKLQkJSW1wbGljaXRBbGxvY2F0aW9uSW1wbCBpbXBsaWNpdEFsbG9jYXRpb24gPSBuZXcgSW1wbGljaXRBbGxvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gaW1wbGljaXRBbGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCVBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIHBhcnNlVHJlZUFsbG9jYXRpb24gPSBuZXcgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHBhcnNlVHJlZUFsbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcygpIHsKLQkJUFRBcnJheUFjY2Vzc0ltcGwgcHRBcnJheUFjY2VzcyA9IG5ldyBQVEFycmF5QWNjZXNzSW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpIHsKLQkJUFRBcnJheUNyZWF0aW9uSW1wbCBwdEFycmF5Q3JlYXRpb24gPSBuZXcgUFRBcnJheUNyZWF0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUNyZWF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCkgewotCQlQVEFycmF5SW5pdGlhbGl6ZXJJbXBsIHB0QXJyYXlJbml0aWFsaXplciA9IG5ldyBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsKCk7Ci0JCXJldHVybiBwdEFycmF5SW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpIHsKLQkJUFRCb29sZWFuTGl0ZXJhbEltcGwgcHRCb29sZWFuTGl0ZXJhbCA9IG5ldyBQVEJvb2xlYW5MaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRCb29sZWFuTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCkgewotCQlQVENhc3RFeHByZXNzaW9uSW1wbCBwdENhc3RFeHByZXNzaW9uID0gbmV3IFBUQ2FzdEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdENhc3RFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCkgewotCQlQVENoYXJhY3RlckxpdGVyYWxJbXBsIHB0Q2hhcmFjdGVyTGl0ZXJhbCA9IG5ldyBQVENoYXJhY3RlckxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdENoYXJhY3RlckxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgewotCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgcHRDbGFzc0luc3RhbmNlQ3JlYXRpb24gPSBuZXcgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IG5ldyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoKSB7Ci0JCVBURmllbGRBY2Nlc3NJbXBsIHB0RmllbGRBY2Nlc3MgPSBuZXcgUFRGaWVsZEFjY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIHB0RmllbGRBY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCkgewotCQlQVEluZml4RXhwcmVzc2lvbkltcGwgcHRJbmZpeEV4cHJlc3Npb24gPSBuZXcgUFRJbmZpeEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdEluZml4RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZigpIHsKLQkJUFRJbnN0YW5jZW9mSW1wbCBwdEluc3RhbmNlb2YgPSBuZXcgUFRJbnN0YW5jZW9mSW1wbCgpOwotCQlyZXR1cm4gcHRJbnN0YW5jZW9mOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCkgewotCQlQVE1ldGhvZEludm9jYXRpb25JbXBsIHB0TWV0aG9kSW52b2NhdGlvbiA9IG5ldyBQVE1ldGhvZEludm9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdE1ldGhvZEludm9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTmFtZSBjcmVhdGVQVE5hbWUoKSB7Ci0JCVBUTmFtZUltcGwgcHROYW1lID0gbmV3IFBUTmFtZUltcGwoKTsKLQkJcmV0dXJuIHB0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFROdWxsTGl0ZXJhbCBjcmVhdGVQVE51bGxMaXRlcmFsKCkgewotCQlQVE51bGxMaXRlcmFsSW1wbCBwdE51bGxMaXRlcmFsID0gbmV3IFBUTnVsbExpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdE51bGxMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKCkgewotCQlQVE51bWJlckxpdGVyYWxJbXBsIHB0TnVtYmVyTGl0ZXJhbCA9IG5ldyBQVE51bWJlckxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdE51bWJlckxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKLQkJUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwgcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IG5ldyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRQcmVmaXhFeHByZXNzaW9uIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpIHsKLQkJUFRQcmVmaXhFeHByZXNzaW9uSW1wbCBwdFByZWZpeEV4cHJlc3Npb24gPSBuZXcgUFRQcmVmaXhFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRQcmVmaXhFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCkgewotCQlQVFN0cmluZ0xpdGVyYWxJbXBsIHB0U3RyaW5nTGl0ZXJhbCA9IG5ldyBQVFN0cmluZ0xpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdFN0cmluZ0xpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUVGhpc0xpdGVyYWwgY3JlYXRlUFRUaGlzTGl0ZXJhbCgpIHsKLQkJUFRUaGlzTGl0ZXJhbEltcGwgcHRUaGlzTGl0ZXJhbCA9IG5ldyBQVFRoaXNMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRUaGlzTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKCkgewotCQlQVFR5cGVMaXRlcmFsSW1wbCBwdFR5cGVMaXRlcmFsID0gbmV3IFBUVHlwZUxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdFR5cGVMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKSB7Ci0JCVBUSW52YWxpZEV4cHJlc3Npb25JbXBsIHB0SW52YWxpZEV4cHJlc3Npb24gPSBuZXcgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0SW52YWxpZEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpIHsKLQkJUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwgcHRJbnN0YW5jZVJlZmVyZW5jZSA9IG5ldyBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcHRJbnN0YW5jZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKLQkJUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCBwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPSBuZXcgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwotCX0KLQotCXB1YmxpYyBQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSBpbnN0YW5jZSkgewotCQlQVEluc3RhbmNlUmVmZXJlbmNlIHB0SW5zdGFuY2VSZWZlcmVuY2UgPSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JCXB0SW5zdGFuY2VSZWZlcmVuY2Uuc2V0UmVmZXJlbmNlKGluc3RhbmNlKTsKLQkJcmV0dXJuIHB0SW5zdGFuY2VSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25QYWNrYWdlIGdldEluc3RhbnRpYXRpb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKEluc3RhbnRpYXRpb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbnRpYXRpb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBJbXBsaWNpdEFsbG9jYXRpb24gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YpIHsKLQkJSW1wbGljaXRBbGxvY2F0aW9uIGFsbG9jID0gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCWFsbG9jLnNldFBhcmVudChwYXJlbnQpOwotCQlhbGxvYy5zZXRGZWF0dXJlKHNmKTsKLQkJcmV0dXJuIGFsbG9jOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKFN0cmluZyBpbml0U3RyaW5nKSB7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uIGFsbG9jID0gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQkJYWxsb2Muc2V0SW5pdFN0cmluZyhpbml0U3RyaW5nKTsKLQkJcmV0dXJuIGFsbG9jOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJUGFyc2VUcmVlQWxsb2NhdGlvbiBhID0gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQXJyYXlBY2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUFjY2VzcyBjcmVhdGVQVEFycmF5QWNjZXNzKFBURXhwcmVzc2lvbiBhcnJheSwgTGlzdCBpbmRleGVzKSB7Ci0JCVBUQXJyYXlBY2Nlc3MgYSA9IGNyZWF0ZVBUQXJyYXlBY2Nlc3MoKTsKLQkJYS5zZXRBcnJheShhcnJheSk7Ci0JCWEuZ2V0SW5kZXhlcygpLmFkZEFsbChpbmRleGVzKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRBcnJheUNyZWF0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIFBUQXJyYXlDcmVhdGlvbiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oU3RyaW5nIHR5cGUsIExpc3QgZGltZW5zaW9ucywgUFRBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbiBhID0gY3JlYXRlUFRBcnJheUNyZWF0aW9uKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJaWYgKGRpbWVuc2lvbnMgIT0gbnVsbCkKLQkJCWEuZ2V0RGltZW5zaW9ucygpLmFkZEFsbChkaW1lbnNpb25zKTsKLQkJYS5zZXRJbml0aWFsaXplcihpbml0aWFsaXplcik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQXJyYXlJbml0aWFsaXplcihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcihMaXN0IGV4cHJlc3Npb25zKSB7Ci0JCVBUQXJyYXlJbml0aWFsaXplciBhID0gY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCk7Ci0JCWlmIChleHByZXNzaW9ucyAhPSBudWxsKQotCQkJYS5nZXRFeHByZXNzaW9ucygpLmFkZEFsbChleHByZXNzaW9ucyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgUFRCb29sZWFuTGl0ZXJhbCBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKGJvb2xlYW4gYm9vbGVhblZhbHVlKSB7Ci0JCVBUQm9vbGVhbkxpdGVyYWwgYSA9IGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQkJYS5zZXRCb29sZWFuVmFsdWUoYm9vbGVhblZhbHVlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDYXN0RXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIFBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbihTdHJpbmcgdHlwZSwgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJUFRDYXN0RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCWEuc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUQ2hhcmFjdGVyTGl0ZXJhbCBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoU3RyaW5nIGVzY2FwZWRWYWx1ZSkgewotCQlQVENoYXJhY3RlckxpdGVyYWwgYSA9IGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCQlhLnNldEVzY2FwZWRWYWx1ZShlc2NhcGVkVmFsdWUpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oU3RyaW5nIHR5cGUsIExpc3QgYXJndW1lbnRzKSB7Ci0JCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGEgPSBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKLQkJCWEuZ2V0QXJndW1lbnRzKCkuYWRkQWxsKGFyZ3VtZW50cyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKAotCQlQVEV4cHJlc3Npb24gY29uZGl0aW9uLAotCQlQVEV4cHJlc3Npb24gdHJ1ZUV4cHJlc3NvaW4sCi0JCVBURXhwcmVzc2lvbiBmYWxzZUV4cHJlc3Npb24pIHsKLQkJUFRDb25kaXRpb25hbEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCWEuc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7Ci0JCWEuc2V0VHJ1ZSh0cnVlRXhwcmVzc29pbik7Ci0JCWEuc2V0RmFsc2UoZmFsc2VFeHByZXNzaW9uKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRGaWVsZEFjY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBURmllbGRBY2Nlc3MgY3JlYXRlUFRGaWVsZEFjY2VzcyhQVEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBmaWVsZCkgewotCQlQVEZpZWxkQWNjZXNzIGEgPSBjcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCWEuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQlhLnNldEZpZWxkKGZpZWxkKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKAotCQlQVEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsCi0JCVBUSW5maXhPcGVyYXRvciBvcGVyYXRvciwKLQkJUFRFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCwKLQkJTGlzdCBleHRlbmRlZE9wZXJhbmRzKSB7Ci0JCVBUSW5maXhFeHByZXNzaW9uIGEgPSBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigpOwotCQlhLnNldExlZnRPcGVyYW5kKGxlZnRPcGVyYW5kKTsKLQkJYS5zZXRPcGVyYXRvcihvcGVyYXRvcik7Ci0JCWEuc2V0UmlnaHRPcGVyYW5kKHJpZ2h0T3BlcmFuZCk7Ci0JCWlmIChleHRlbmRlZE9wZXJhbmRzICE9IG51bGwpCi0JCQlhLmdldEV4dGVuZGVkT3BlcmFuZHMoKS5hZGRBbGwoZXh0ZW5kZWRPcGVyYW5kcyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUSW5zdGFuY2VvZihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUSW5zdGFuY2VvZiBjcmVhdGVQVEluc3RhbmNlb2YoUFRFeHByZXNzaW9uIG9wZXJhbmQsIFN0cmluZyB0eXBlKSB7Ci0JCVBUSW5zdGFuY2VvZiBhID0gY3JlYXRlUFRJbnN0YW5jZW9mKCk7Ci0JCWEuc2V0T3BlcmFuZChvcGVyYW5kKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUSW52YWxpZEV4cHJlc3Npb24gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihTdHJpbmcgbWVzc2FnZSkgewotCQlQVEludmFsaWRFeHByZXNzaW9uIGEgPSBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0JCWEuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgTGlzdCBhcmd1bWVudHMpIHsKLQkJUFRNZXRob2RJbnZvY2F0aW9uIGEgPSBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKTsKLQkJYS5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0JCWEuc2V0TmFtZShuYW1lKTsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQotCQkJYS5nZXRBcmd1bWVudHMoKS5hZGRBbGwoYXJndW1lbnRzKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUTmFtZSBjcmVhdGVQVE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUFROYW1lIGEgPSBjcmVhdGVQVE5hbWUoKTsKLQkJYS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVE51bWJlckxpdGVyYWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFROdW1iZXJMaXRlcmFsIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbChTdHJpbmcgdG9rZW4pIHsKLQkJUFROdW1iZXJMaXRlcmFsIGEgPSBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJYS5zZXRUb2tlbih0b2tlbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBhID0gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIFBUUHJlZml4RXhwcmVzc2lvbiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oUFRQcmVmaXhPcGVyYXRvciBvcGVyYXRvciwgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJUFRQcmVmaXhFeHByZXNzaW9uIGEgPSBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKTsKLQkJYS5zZXRPcGVyYXRvcihvcGVyYXRvcik7Ci0JCWEuc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRTdHJpbmdMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUU3RyaW5nTGl0ZXJhbCBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoU3RyaW5nIGVzY2FwZUxpdGVyYWwpIHsKLQkJUFRTdHJpbmdMaXRlcmFsIGEgPSBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQkJYS5zZXRFc2NhcGVkVmFsdWUoZXNjYXBlTGl0ZXJhbCk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUVHlwZUxpdGVyYWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKFN0cmluZyB0eXBlKSB7Ci0JCVBUVHlwZUxpdGVyYWwgYSA9IGNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLX0gLy9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZWJlMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEluc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcl9JbnZhbGlkRXhwcmVzc2lvbjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEluc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25QYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzZDc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSW5zdGFudGlhdGlvblBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFBbGxvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFycmF5QWNjZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0QXJyYXlDcmVhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRCb29sZWFuTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdENhc3RFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEZpZWxkQWNjZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0SW5maXhFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0SW5zdGFuY2VvZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHROYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TnVsbExpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHROdW1iZXJMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0U3RyaW5nTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFRoaXNMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0VHlwZUxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHB0SW5maXhPcGVyYXRvckVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcHRQcmVmaXhPcGVyYXRvckVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlKYXZhSW5zdGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5zdGFudGlhdGlvblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEluc3RhbnRpYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEluc3RhbnRpYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsIHRoZUluc3RhbnRpYXRpb25QYWNrYWdlID0gKEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBJbnN0YW50aWF0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBJbnN0YW50aWF0aW9uUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVJbnN0YW50aWF0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUluc3RhbnRpYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUluc3RhbnRpYXRpb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVJbnN0YW50aWF0aW9uUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhT2JqZWN0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBqYXZhQWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEltcGxpY2l0QWxsb2NhdGlvbl9GZWF0dXJlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEFycmF5QWNjZXNzKCkgewotCQlyZXR1cm4gcHRBcnJheUFjY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5QWNjZXNzX0FycmF5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQXJyYXlDcmVhdGlvbigpIHsKLQkJcmV0dXJuIHB0QXJyYXlDcmVhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEFycmF5Q3JlYXRpb25fVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUNyZWF0aW9uX0luaXRpYWxpemVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiBwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEJvb2xlYW5MaXRlcmFsKCkgewotCQlyZXR1cm4gcHRCb29sZWFuTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEJvb2xlYW5MaXRlcmFsX0Jvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQ2FzdEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdENhc3RFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENhc3RFeHByZXNzaW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENhc3RFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENoYXJhY3RlckxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9DaGFyVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgewotCQlyZXR1cm4gcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fQXJndW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fQ29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9GYWxzZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEZpZWxkQWNjZXNzKCkgewotCQlyZXR1cm4gcHRGaWVsZEFjY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEZpZWxkQWNjZXNzX1JlY2VpdmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRGaWVsZEFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBURmllbGRBY2Nlc3NfRmllbGQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEZpZWxkQWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEluZml4RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0SW5maXhFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9FeHRlbmRlZE9wZXJhbmRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW5zdGFuY2VvZigpIHsKLQkJcmV0dXJuIHB0SW5zdGFuY2VvZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5zdGFuY2VvZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUSW5zdGFuY2VvZl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRJbnN0YW5jZW9mRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE1ldGhvZEludm9jYXRpb24oKSB7Ci0JCXJldHVybiBwdE1ldGhvZEludm9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVE1ldGhvZEludm9jYXRpb25fQXJndW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE5hbWUoKSB7Ci0JCXJldHVybiBwdE5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFROYW1lX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdE5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTnVsbExpdGVyYWwoKSB7Ci0JCXJldHVybiBwdE51bGxMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFROdW1iZXJMaXRlcmFsKCkgewotCQlyZXR1cm4gcHROdW1iZXJMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0TnVtYmVyTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUUHJlZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFN0cmluZ0xpdGVyYWwoKSB7Ci0JCXJldHVybiBwdFN0cmluZ0xpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRTdHJpbmdMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0U3RyaW5nTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUU3RyaW5nTGl0ZXJhbF9MaXRlcmFsVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUVGhpc0xpdGVyYWwoKSB7Ci0JCXJldHVybiBwdFRoaXNMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRUeXBlTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0VHlwZUxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRUeXBlTGl0ZXJhbF9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRUeXBlTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbl9NZXNzYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0RlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0ltcG9ydHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UFRJbmZpeE9wZXJhdG9yKCkgewotCQlyZXR1cm4gcHRJbmZpeE9wZXJhdG9yRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBUUHJlZml4T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBwdFByZWZpeE9wZXJhdG9yRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YUluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFJbnN0YW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvbkZhY3RvcnkgZ2V0SW5zdGFudGlhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSW5zdGFudGlhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX0RBVEFfVFlQRV9JTlNUQU5DRSk7Ci0KLQkJaUphdmFJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9JTlNUQU5DRSk7Ci0KLQkJaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9PQkpFQ1RfSU5TVEFOQ0UpOwotCi0JCWphdmFBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfQUxMT0NBVElPTik7Ci0KLQkJaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5JVF9TVFJJTkdfQUxMT0NBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MsIElOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HKTsKLQotCQlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1QTElDSVRfQUxMT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcywgSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSk7Ci0KLQkJcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQVJTRV9UUkVFX0FMTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MsIFBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0VYUFJFU1NJT04pOwotCi0JCXB0QXJyYXlBY2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfQUNDRVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5QWNjZXNzRUNsYXNzLCBQVF9BUlJBWV9BQ0NFU1NfX0FSUkFZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5QWNjZXNzRUNsYXNzLCBQVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMpOwotCi0JCXB0QXJyYXlDcmVhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BUlJBWV9DUkVBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIpOwotCi0JCXB0QXJyYXlJbml0aWFsaXplckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BUlJBWV9JTklUSUFMSVpFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUluaXRpYWxpemVyRUNsYXNzLCBQVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlMpOwotCi0JCXB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQk9PTEVBTl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLCBQVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUUpOwotCi0JCXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ0FTVF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENhc3RFeHByZXNzaW9uRUNsYXNzLCBQVF9DQVNUX0VYUFJFU1NJT05fX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NIQVJBQ1RFUl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFKTsKLQotCQlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MsIFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUyk7Ci0KLQkJcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSk7Ci0KLQkJcHRGaWVsZEFjY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9GSUVMRF9BQ0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0RmllbGRBY2Nlc3NFQ2xhc3MsIFBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0RmllbGRBY2Nlc3NFQ2xhc3MsIFBUX0ZJRUxEX0FDQ0VTU19fRklFTEQpOwotCi0JCXB0SW5maXhFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lORklYX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyk7Ci0KLQkJcHRJbnN0YW5jZW9mRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOU1RBTkNFT0YpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRJbnN0YW5jZW9mRUNsYXNzLCBQVF9JTlNUQU5DRU9GX19UWVBFKTsKLQotCQlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTUVUSE9EX0lOVk9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcywgUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMpOwotCi0JCXB0TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE5hbWVFQ2xhc3MsIFBUX05BTUVfX05BTUUpOwotCi0JCXB0TnVsbExpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTlVMTF9MSVRFUkFMKTsKLQotCQlwdE51bWJlckxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTlVNQkVSX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0TnVtYmVyTGl0ZXJhbEVDbGFzcywgUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOKTsKLQotCQlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcywgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfUFJFRklYX0VYUFJFU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfU1RSSU5HX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0U3RyaW5nTGl0ZXJhbEVDbGFzcywgUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0U3RyaW5nTGl0ZXJhbEVDbGFzcywgUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUUpOwotCi0JCXB0VGhpc0xpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfVEhJU19MSVRFUkFMKTsKLQotCQlwdFR5cGVMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1RZUEVfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRUeXBlTGl0ZXJhbEVDbGFzcywgUFRfVFlQRV9MSVRFUkFMX19UWVBFKTsKLQotCQlwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOVkFMSURfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcywgUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFKTsKLQotCQlwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOU1RBTkNFX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcywgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UpOwotCi0JCXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcywgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlwdEluZml4T3BlcmF0b3JFRW51bSA9IGNyZWF0ZUVFbnVtKFBUX0lORklYX09QRVJBVE9SKTsKLQkJcHRQcmVmaXhPcGVyYXRvckVFbnVtID0gY3JlYXRlRUVudW0oUFRfUFJFRklYX09QRVJBVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YUluc3RhbmNlKCkpOwotCQlpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFJbnN0YW5jZSgpKTsKLQkJaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQWxsb2NhdGlvbigpKTsKLQkJaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQWxsb2NhdGlvbigpKTsKLQkJcHRBcnJheUFjY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEZpZWxkQWNjZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnN0YW5jZW9mRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHROdWxsTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHROdW1iZXJMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0U3RyaW5nTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRUaGlzTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRUeXBlTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzLCBJSmF2YURhdGFUeXBlSW5zdGFuY2UuY2xhc3MsICJJSmF2YURhdGFUeXBlSW5zdGFuY2UiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGlKYXZhSW5zdGFuY2VFQ2xhc3MsIElKYXZhSW5zdGFuY2UuY2xhc3MsICJJSmF2YUluc3RhbmNlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzLCBJSmF2YU9iamVjdEluc3RhbmNlLmNsYXNzLCAiSUphdmFPYmplY3RJbnN0YW5jZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoamF2YUFsbG9jYXRpb25FQ2xhc3MsIEphdmFBbGxvY2F0aW9uLmNsYXNzLCAiSmF2YUFsbG9jYXRpb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLCBJbml0U3RyaW5nQWxsb2NhdGlvbi5jbGFzcywgIkluaXRTdHJpbmdBbGxvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbml0U3RyaW5nIiwgbnVsbCwgMCwgMSwgSW5pdFN0cmluZ0FsbG9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIkltcGxpY2l0QWxsb2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RU9iamVjdCgpLCBudWxsLCAicGFyZW50IiwgbnVsbCwgMSwgMSwgSW1wbGljaXRBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIG51bGwsICJmZWF0dXJlIiwgbnVsbCwgMSwgMSwgSW1wbGljaXRBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcywgUGFyc2VUcmVlQWxsb2NhdGlvbi5jbGFzcywgIlBhcnNlVHJlZUFsbG9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBhcnNlVHJlZUFsbG9jYXRpb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDEsIDEsIFBhcnNlVHJlZUFsbG9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEV4cHJlc3Npb25FQ2xhc3MsIFBURXhwcmVzc2lvbi5jbGFzcywgIlBURXhwcmVzc2lvbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHRBcnJheUFjY2Vzc0VDbGFzcywgUFRBcnJheUFjY2Vzcy5jbGFzcywgIlBUQXJyYXlBY2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlBY2Nlc3NfQXJyYXkoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFycmF5IiwgbnVsbCwgMCwgMSwgUFRBcnJheUFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJpbmRleGVzIiwgbnVsbCwgMSwgLTEsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFycmF5Q3JlYXRpb25FQ2xhc3MsIFBUQXJyYXlDcmVhdGlvbi5jbGFzcywgIlBUQXJyYXlDcmVhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJkaW1lbnNpb25zIiwgbnVsbCwgMCwgLTEsIFBUQXJyYXlDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUNyZWF0aW9uX0luaXRpYWxpemVyKCksIHRoaXMuZ2V0UFRBcnJheUluaXRpYWxpemVyKCksIG51bGwsICJpbml0aWFsaXplciIsIG51bGwsIDAsIDEsIFBUQXJyYXlDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0QXJyYXlJbml0aWFsaXplckVDbGFzcywgUFRBcnJheUluaXRpYWxpemVyLmNsYXNzLCAiUFRBcnJheUluaXRpYWxpemVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb25zIiwgbnVsbCwgMCwgLTEsIFBUQXJyYXlJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MsIFBUQm9vbGVhbkxpdGVyYWwuY2xhc3MsICJQVEJvb2xlYW5MaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEJvb2xlYW5MaXRlcmFsX0Jvb2xlYW5WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImJvb2xlYW5WYWx1ZSIsIG51bGwsIDAsIDEsIFBUQm9vbGVhbkxpdGVyYWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENhc3RFeHByZXNzaW9uRUNsYXNzLCBQVENhc3RFeHByZXNzaW9uLmNsYXNzLCAiUFRDYXN0RXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRDYXN0RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgMSwgUFRDYXN0RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcywgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCAiUFRDaGFyYWN0ZXJMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlc2NhcGVkVmFsdWUiLCBudWxsLCAwLCAxLCBQVENoYXJhY3RlckxpdGVyYWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9DaGFyVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVDaGFyKCksICJjaGFyVmFsdWUiLCBudWxsLCAwLCAxLCBQVENoYXJhY3RlckxpdGVyYWwuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgIlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX0FyZ3VtZW50cygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiYXJndW1lbnRzIiwgbnVsbCwgMCwgLTEsIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAiUFRDb25kaXRpb25hbEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0NvbmRpdGlvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX1RydWUoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInRydWUiLCBudWxsLCAwLCAxLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImZhbHNlIiwgbnVsbCwgMCwgMSwgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEZpZWxkQWNjZXNzRUNsYXNzLCBQVEZpZWxkQWNjZXNzLmNsYXNzLCAiUFRGaWVsZEFjY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRGaWVsZEFjY2Vzc19SZWNlaXZlcigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAicmVjZWl2ZXIiLCBudWxsLCAwLCAxLCBQVEZpZWxkQWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWVsZCIsIG51bGwsIDAsIDEsIFBURmllbGRBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRJbmZpeEV4cHJlc3Npb24uY2xhc3MsICJQVEluZml4RXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fTGVmdE9wZXJhbmQoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImxlZnRPcGVyYW5kIiwgbnVsbCwgMCwgMSwgUFRJbmZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUSW5maXhFeHByZXNzaW9uX09wZXJhdG9yKCksIHRoaXMuZ2V0UFRJbmZpeE9wZXJhdG9yKCksICJvcGVyYXRvciIsIG51bGwsIDAsIDEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluZml4RXhwcmVzc2lvbl9SaWdodE9wZXJhbmQoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInJpZ2h0T3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluZml4RXhwcmVzc2lvbl9FeHRlbmRlZE9wZXJhbmRzKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHRlbmRlZE9wZXJhbmRzIiwgbnVsbCwgMCwgLTEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbnN0YW5jZW9mRUNsYXNzLCBQVEluc3RhbmNlb2YuY2xhc3MsICJQVEluc3RhbmNlb2YiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5zdGFuY2VvZl9PcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJvcGVyYW5kIiwgbnVsbCwgMCwgMSwgUFRJbnN0YW5jZW9mLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEluc3RhbmNlb2ZfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUSW5zdGFuY2VvZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcywgUFRNZXRob2RJbnZvY2F0aW9uLmNsYXNzLCAiUFRNZXRob2RJbnZvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVE1ldGhvZEludm9jYXRpb25fUmVjZWl2ZXIoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInJlY2VpdmVyIiwgbnVsbCwgMCwgMSwgUFRNZXRob2RJbnZvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVE1ldGhvZEludm9jYXRpb25fTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX0FyZ3VtZW50cygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiYXJndW1lbnRzIiwgbnVsbCwgMCwgLTEsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0TmFtZUVDbGFzcywgUFROYW1lLmNsYXNzLCAiUFROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVE5hbWVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBUTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0TnVsbExpdGVyYWxFQ2xhc3MsIFBUTnVsbExpdGVyYWwuY2xhc3MsICJQVE51bGxMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHROdW1iZXJMaXRlcmFsRUNsYXNzLCBQVE51bWJlckxpdGVyYWwuY2xhc3MsICJQVE51bWJlckxpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidG9rZW4iLCBudWxsLCAwLCAxLCBQVE51bWJlckxpdGVyYWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLCBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmNsYXNzLCAiUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgMSwgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcywgUFRQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCAiUFRQcmVmaXhFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSwgdGhpcy5nZXRQVFByZWZpeE9wZXJhdG9yKCksICJvcGVyYXRvciIsIG51bGwsIDAsIDEsIFBUUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRQcmVmaXhFeHByZXNzaW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAwLCAxLCBQVFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFN0cmluZ0xpdGVyYWxFQ2xhc3MsIFBUU3RyaW5nTGl0ZXJhbC5jbGFzcywgIlBUU3RyaW5nTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRTdHJpbmdMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXNjYXBlZFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRTdHJpbmdMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaXRlcmFsVmFsdWUiLCBudWxsLCAwLCAxLCBQVFN0cmluZ0xpdGVyYWwuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0VGhpc0xpdGVyYWxFQ2xhc3MsIFBUVGhpc0xpdGVyYWwuY2xhc3MsICJQVFRoaXNMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHRUeXBlTGl0ZXJhbEVDbGFzcywgUFRUeXBlTGl0ZXJhbC5jbGFzcywgIlBUVHlwZUxpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUVHlwZUxpdGVyYWxfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUVHlwZUxpdGVyYWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzLCBQVEludmFsaWRFeHByZXNzaW9uLmNsYXNzLCAiUFRJbnZhbGlkRXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbl9NZXNzYWdlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXNzYWdlIiwgbnVsbCwgMCwgMSwgUFRJbnZhbGlkRXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MsIFBUSW5zdGFuY2VSZWZlcmVuY2UuY2xhc3MsICJQVEluc3RhbmNlUmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpLCB0aGlzLmdldElKYXZhSW5zdGFuY2UoKSwgbnVsbCwgInJlZmVyZW5jZSIsIG51bGwsIDEsIDEsIFBUSW5zdGFuY2VSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MsIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgIlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0RlY2xhcmF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWNsYXJhdGlvbiIsIG51bGwsIDAsIDEsIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0ltcG9ydHMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImltcG9ydHMiLCBudWxsLCAwLCAtMSwgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuY2xhc3MsICJQVEluZml4T3BlcmF0b3IiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuVElNRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkRJVklERV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUkVNQUlOREVSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTEVGVF9TSElGVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTEVTU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTEVTU19FUVVBTFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5FUVVBTFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLk5PVF9FUVVBTFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlhPUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuQU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5PUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLmNsYXNzLCAiUFRQcmVmaXhPcGVyYXRvciIpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLlBMVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5OT1RfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0luc3RhbnRpYXRpb25QYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9KYXZhQWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWIzOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9KYXZhQWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0gCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSmF2YUFsbG9jYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUFsbG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19IC8vSmF2YUFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMTA0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci0gCi0vKioKLSAqIFRoaXMgbmFpdmVseSBmbGF0dGVucyB0aGUgUGFyc2VUcmVlLiBJdCBqdXN0IHdvcmtzIHdpdGggd2hhdCdzIHRoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lciBleHRlbmRzIFBhcnNlVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0U3RyaW5nQnVmZmVyKCkgewotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXN1bHQgb2YgdGhlIGZsYXR0ZW5pbmcuCi0JICogQHJldHVybiBUaGUgZmxhdHRlbmVkIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXNldCB0aGUgcmVzdWx0IHNvIHRoYXQgZmxhdHRlbmVyIGNhbiBiZSB1c2VkIGFnYWluLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlidWZmZXIuc2V0TGVuZ3RoKDApOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXREZWNsYXJhdGlvbigpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlub2RlLmdldEFycmF5KCkuYWNjZXB0KHRoaXMpOwotCQlpZiAoIW5vZGUuZ2V0SW5kZXhlcygpLmlzRW1wdHkoKSkgewotCQkJTGlzdCBpbmRleGVzID0gbm9kZS5nZXRJbmRleGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCQkJKChQVEV4cHJlc3Npb24pIGluZGV4ZXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotICAgICAgICBTdHJpbmcgYXJyYXlUeXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0gICAgICAgIGludCBvYiA9IGFycmF5VHlwZS5pbmRleE9mKCdbJyk7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gaGFuZGxlUXVhbGlmaWVkTmFtZShhcnJheVR5cGUuc3Vic3RyaW5nKDAsIG9iKSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWZmZXIuYXBwZW5kKHR5cGUpOwotICAgICAgICBpbnQgcmVhbGRpbXMgPSAwOwotICAgICAgICB3aGlsZSAob2IgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZWFsZGltcysrOwotICAgICAgICAgICAgICAgIG9iID0gYXJyYXlUeXBlLmluZGV4T2YoJ1snLG9iKzEpOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgZGltcyA9IG5vZGUuZ2V0RGltZW5zaW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICAgICAgKChQVEV4cHJlc3Npb24pIGRpbXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnXScpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGk9ZGltcy5zaXplKCk7IGkgPCByZWFsZGltczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICgoUFRFeHByZXNzaW9uKSBub2RlLmdldEluaXRpYWxpemVyKCkpLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCd7Jyk7Ci0JCUxpc3QgZXhwID0gbm9kZS5nZXRFeHByZXNzaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cC5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgZXhwLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuaXNCb29sZWFuVmFsdWUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCIpICIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiA/ICIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0VHJ1ZSgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRGYWxzZSgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRGaWVsZCgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0TGVmdE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJU3RyaW5nIG9wZXIgPSBub2RlLmdldE9wZXJhdG9yKCkuZ2V0T3BlcmF0b3IoKTsKLQkJYnVmZmVyLmFwcGVuZChvcGVyKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlub2RlLmdldFJpZ2h0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJTGlzdCBleHQgPSBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHQuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQob3Blcik7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXh0LmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCW5vZGUuZ2V0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiIGluc3RhbmNlb2YgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLk5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcl9JbnZhbGlkRXhwcmVzc2lvbiwgbmV3IE9iamVjdFtde25vZGUuZ2V0TWVzc2FnZSgpfSkpOyAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKSB7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0TmFtZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRUb2tlbigpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS5nZXRPcGVyYXRvcigpKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoInRoaXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgb25lIHRvIG92ZXJpZGUgdGhlIGhhbmRsaW5nIG9mIHF1YWxpZmllZCBuYW1lcy4KLQkgKiBUaGUgZGVmYXVsdCBvcGVyYXRpb24gaXMgdG8gZG8gbm90aGluZy4KLQkgKiAKLQkgKiBPdmVycmlkZXJzIG1heSBjaG9vc2UgdG8gdXNlIHNob3J0IG5hbWVzLCByZWx5aW5nIG9uIGltcG9ydCBzdGF0ZW1lbnQgaGFuZGxpbmcuCi0JICogCi0JICogQHBhcmFtIHFOYW1lICAKLQkgKiBAcmV0dXJuIE5hbWUgdG8gdXNlIGZvciB0aGUgZmxhdHRlbmVkIHJlc3VsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaGFuZGxlUXVhbGlmaWVkTmFtZShTdHJpbmcgcU5hbWUpIHsKLQkJcmV0dXJuIHFOYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5ZDhjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCNnZXRJbXBvcnRzIDxlbT5JbXBvcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJhdGlvbigpIDxlbT5EZWNsYXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmF0aW9uKCkgPGVtPkRlY2xhcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJhdGlvbiA9IERFQ0xBUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wb3J0cygpIDxlbT5JbXBvcnRzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcG9ydHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbXBvcnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJhdGlvbihTdHJpbmcgbmV3RGVjbGFyYXRpb24pIHsKLQkJU3RyaW5nIG9sZERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCWRlY2xhcmF0aW9uID0gbmV3RGVjbGFyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT04sIG9sZERlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBvcnRzKCkgewotCQlpZiAoaW1wb3J0cyA9PSBudWxsKSB7Ci0JCQlpbXBvcnRzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gaW1wb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT046Ci0JCQkJcmV0dXJuIGdldERlY2xhcmF0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlyZXR1cm4gZ2V0SW1wb3J0cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlzZXREZWNsYXJhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlnZXRJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OOgotCQkJCXNldERlY2xhcmF0aW9uKERFQ0xBUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlnZXRJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlyZXR1cm4gREVDTEFSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlY2xhcmF0aW9uICE9IG51bGwgOiAhREVDTEFSQVRJT05fRURFRkFVTFQuZXF1YWxzKGRlY2xhcmF0aW9uKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTOgotCQkJCXJldHVybiBpbXBvcnRzICE9IG51bGwgJiYgIWltcG9ydHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVjbGFyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlY2xhcmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBvcnRzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBvcnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUFjY2Vzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUFjY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMGM3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IEFjY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbCNnZXRBcnJheSA8ZW0+QXJyYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUFjY2Vzc0ltcGwjZ2V0SW5kZXhlcyA8ZW0+SW5kZXhlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQXJyYXlBY2Nlc3NJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQXJyYXlBY2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFycmF5KCkgPGVtPkFycmF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcnJheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBhcnJheSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleGVzKCkgPGVtPkluZGV4ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXhlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluZGV4ZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQXJyYXlBY2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQXJyYXlBY2Nlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEFycmF5KCkgewotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXJyYXkoUFRFeHByZXNzaW9uIG5ld0FycmF5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRBcnJheSA9IGFycmF5OwotCQlhcnJheSA9IG5ld0FycmF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBvbGRBcnJheSwgbmV3QXJyYXkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFycmF5KFBURXhwcmVzc2lvbiBuZXdBcnJheSkgewotCQlpZiAobmV3QXJyYXkgIT0gYXJyYXkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFycmF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFycmF5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXJyYXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXJyYXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFycmF5KG5ld0FycmF5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG5ld0FycmF5LCBuZXdBcnJheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbmRleGVzKCkgewotCQlpZiAoaW5kZXhlcyA9PSBudWxsKSB7Ci0JCQlpbmRleGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTKTsKLQkJfQotCQlyZXR1cm4gaW5kZXhlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJCXJldHVybiBiYXNpY1NldEFycmF5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluZGV4ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXJldHVybiBnZXRBcnJheSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJcmV0dXJuIGdldEluZGV4ZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJc2V0QXJyYXkoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJZ2V0SW5kZXhlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5kZXhlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlzZXRBcnJheSgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCWdldEluZGV4ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXJldHVybiBhcnJheSAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJcmV0dXJuIGluZGV4ZXMgIT0gbnVsbCAmJiAhaW5kZXhlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0QXJyYXkoKSk7Ci0JCQlpZiAoaW5kZXhlcyAhPSBudWxsKQotCQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGluZGV4ZXMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL0FycmF5QWNjZXNzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5Q3JlYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlDcmVhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhOGIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlDcmVhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQ3JlYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwjZ2V0RGltZW5zaW9ucyA8ZW0+RGltZW5zaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQXJyYXlDcmVhdGlvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBcnJheUNyZWF0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpbWVuc2lvbnMoKSA8ZW0+RGltZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaW1lbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGltZW5zaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplcigpIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQXJyYXlDcmVhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRBcnJheUNyZWF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERpbWVuc2lvbnMoKSB7Ci0JCWlmIChkaW1lbnNpb25zID09IG51bGwpIHsKLQkJCWRpbWVuc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRpbWVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlJbml0aWFsaXplciBnZXRJbml0aWFsaXplcigpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluaXRpYWxpemVyKFBUQXJyYXlJbml0aWFsaXplciBuZXdJbml0aWFsaXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEFycmF5SW5pdGlhbGl6ZXIgb2xkSW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKLQkJaW5pdGlhbGl6ZXIgPSBuZXdJbml0aWFsaXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBvbGRJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVyKFBUQXJyYXlJbml0aWFsaXplciBuZXdJbml0aWFsaXplcikgewotCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gaW5pdGlhbGl6ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluaXRpYWxpemVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbml0aWFsaXplcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbml0aWFsaXplcihuZXdJbml0aWFsaXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG5ld0luaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGltZW5zaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJCXJldHVybiBiYXNpY1NldEluaXRpYWxpemVyKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGltZW5zaW9ucygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxpemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJZ2V0RGltZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGltZW5zaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKFBUQXJyYXlJbml0aWFsaXplciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCWdldERpbWVuc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChQVEFycmF5SW5pdGlhbGl6ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCXJldHVybiBkaW1lbnNpb25zICE9IG51bGwgJiYgIWRpbWVuc2lvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGluaXRpYWxpemVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGRpbWVuc2lvbnMpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0SW5pdGlhbGl6ZXIoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotfSAvL0FycmF5Q3JlYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlJbml0aWFsaXplckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUluaXRpYWxpemVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWViYTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUluaXRpYWxpemVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IEluaXRpYWxpemVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlJbml0aWFsaXplckltcGwjZ2V0RXhwcmVzc2lvbnMgPGVtPkV4cHJlc3Npb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBcnJheUluaXRpYWxpemVySW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFycmF5SW5pdGlhbGl6ZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb25zKCkgPGVtPkV4cHJlc3Npb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXhwcmVzc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQXJyYXlJbml0aWFsaXplckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRBcnJheUluaXRpYWxpemVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4cHJlc3Npb25zKCkgewotCQlpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgewotCQkJZXhwcmVzc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlMpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHByZXNzaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUzoKLQkJCQlnZXRFeHByZXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhwcmVzc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUzoKLQkJCQlnZXRFeHByZXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUzoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbnMgIT0gbnVsbCAmJiAhZXhwcmVzc2lvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGV4cHJlc3Npb25zKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9BcnJheUluaXRpYWxpemVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEJvb2xlYW5MaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEJvb2xlYW5MaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYzZGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9vbGVhbiBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQm9vbGVhbkxpdGVyYWxJbXBsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRCb29sZWFuTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRCb29sZWFuTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm9vbGVhblZhbHVlKCkgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQk9PTEVBTl9WQUxVRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU5fVkFMVUVfRUZMQUcgPSAxIDw8IDg7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRCb29sZWFuTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRCb29sZWFuTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblZhbHVlKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gbmV3Qm9vbGVhblZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkQm9vbGVhblZhbHVlID0gKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdCb29sZWFuVmFsdWUpIGVGbGFncyB8PSBCT09MRUFOX1ZBTFVFX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Qk9PTEVBTl9WQUxVRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFLCBvbGRCb29sZWFuVmFsdWUsIG5ld0Jvb2xlYW5WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXJldHVybiBpc0Jvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRToKLQkJCQlzZXRCb29sZWFuVmFsdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXNldEJvb2xlYW5WYWx1ZShCT09MRUFOX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDApICE9IEJPT0xFQU5fVkFMVUVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9Cb29sZWFuTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMzRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2FzdEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDYXN0RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDYXN0RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDYXN0RXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDYXN0RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9DYXN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhMWQyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFyYWN0ZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDaGFyYWN0ZXJMaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVzY2FwZWRWYWx1ZSA9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhclZhbHVlKCkgPGVtPkNoYXIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYXJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIENIQVJfVkFMVUVfRURFRkFVTFQgPSAnXHUwMDAwJzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJWYWx1ZSgpIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBjaGFyIGNoYXJWYWx1ZSA9IENIQVJfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENoYXJhY3RlckxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVzY2FwZWRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQljaGFyVmFsdWVTZXQgPSBmYWxzZTsKLQkJc2V0Q2hhclZhbHVlR2VuKENIQVJfVkFMVUVfRURFRkFVTFQpOwotCQlzZXRFc2NhcGVkVmFsdWVHZW4obmV3RXNjYXBlZFZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlR2VuKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJU3RyaW5nIG9sZEVzY2FwZWRWYWx1ZSA9IGVzY2FwZWRWYWx1ZTsKLQkJZXNjYXBlZFZhbHVlID0gbmV3RXNjYXBlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSwgb2xkRXNjYXBlZFZhbHVlLCBlc2NhcGVkVmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhclZhbHVlU2V0OwotCQotCXB1YmxpYyBjaGFyIGdldENoYXJWYWx1ZSgpIHsKLQkJaWYgKCFjaGFyVmFsdWVTZXQgJiYgZXNjYXBlZFZhbHVlICE9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpIHsKLQkJCVN0cmluZyBzID0gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcJycgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcJycgKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2hhciBjID0gcy5jaGFyQXQoMSk7Ci0JCQlpZiAoYyA9PSAnXCcnKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCWlmIChsZW4gPT0gNCkgewotCQkJCQlzZXRDaGFyVmFsdWVHZW4oZ2V0Q2hhckVzY2FwZWQocy5jaGFyQXQoMikpKTsKLQkJCQl9IGVsc2UgaWYgKGxlbiA9PSA4KSB7Ci0JCQkJCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCi0JCQkJCWludCBjdXJyZW50UG9zaXRpb24gPSAyOwotCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwotCQkJCQlpZiAocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspID09ICd1JykgewotCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMSA8IDAKLQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMyIDwgMAotCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzMgPCAwCi0JCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjNCA8IDApewotCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNldENoYXJWYWx1ZUdlbigoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlCi0JCQkJc2V0Q2hhclZhbHVlR2VuKGMpOwotCQkJCi0JCQljaGFyVmFsdWVTZXQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRDaGFyVmFsdWVHZW4oKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXJFc2NhcGVkKGNoYXIgbmV4dENoYXIpIHsKLQkJc3dpdGNoKG5leHRDaGFyKSB7Ci0JCQljYXNlICdiJyA6Ci0JCQkJcmV0dXJuICdcYic7Ci0JCQljYXNlICd0JyA6Ci0JCQkJcmV0dXJuICdcdCc7Ci0JCQljYXNlICduJyA6Ci0JCQkJcmV0dXJuICdcbic7Ci0JCQljYXNlICdmJyA6Ci0JCQkJcmV0dXJuICdcZic7Ci0JCQljYXNlICdyJyA6Ci0JCQkJcmV0dXJuICdccic7Ci0JCQljYXNlICdcIic6Ci0JCQkJcmV0dXJuICdcIic7Ci0JCQljYXNlICdcJyc6Ci0JCQkJcmV0dXJuICdcJyc7Ci0JCQljYXNlICdcXCc6Ci0JCQkJcmV0dXJuICdcXCc7Ci0JCQljYXNlICcwJyA6Ci0JCQkJcmV0dXJuICdcMCc7Ci0JCQljYXNlICcxJyA6Ci0JCQkJcmV0dXJuICdcMSc7Ci0JCQljYXNlICcyJyA6Ci0JCQkJcmV0dXJuICdcMic7Ci0JCQljYXNlICczJyA6Ci0JCQkJcmV0dXJuICdcMyc7Ci0JCQljYXNlICc0JyA6Ci0JCQkJcmV0dXJuICdcNCc7Ci0JCQljYXNlICc1JyA6Ci0JCQkJcmV0dXJuICdcNSc7Ci0JCQljYXNlICc2JyA6Ci0JCQkJcmV0dXJuICdcNic7Ci0JCQljYXNlICc3JyA6Ci0JCQkJcmV0dXJuICdcNyc7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNoYXIgZ2V0Q2hhclZhbHVlR2VuKCkgewotCQlyZXR1cm4gY2hhclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJWYWx1ZShjaGFyIG5ld0NoYXJWYWx1ZSkgewkJCi0JCWNoYXJWYWx1ZVNldCA9IHRydWU7Ci0JCXNldENoYXJWYWx1ZUdlbihuZXdDaGFyVmFsdWUpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDgpOwotCQliLmFwcGVuZCgnXCcnKTsgLy8gb3BlbmluZyBkZWxpbWl0ZXIKLQkJYXBwZW5kQ2hhcmFjdGVyKG5ld0NoYXJWYWx1ZSwgYik7Ci0JCWIuYXBwZW5kKCdcJycpOyAvLyBjbG9zaW5nIGRlbGltaXRlcgotCQlzZXRFc2NhcGVkVmFsdWVHZW4oYi50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZENoYXJhY3RlcihjaGFyIGNoYXJhY3RlciwgU3RyaW5nQnVmZmVyIGIpIHsKLQkJc3dpdGNoKGNoYXJhY3RlcikgewotCQkJY2FzZSAnXGInIDoKLQkJCQliLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JyA6Ci0JCQkJYi5hcHBlbmQoIlxcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbicgOgotCQkJCWIuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXGYnIDoKLQkJCQliLmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJyA6Ci0JCQkJYi5hcHBlbmQoIlxcciIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcIic6Ci0JCQkJYi5hcHBlbmQoIlxcXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCWIuYXBwZW5kKCJcXFwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJzoKLQkJCQliLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMCcgOgotCQkJCWIuYXBwZW5kKCJcXDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDEnIDoKLQkJCQliLmFwcGVuZCgiXFwxIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wyJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMycgOgotCQkJCWIuYXBwZW5kKCJcXDMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDQnIDoKLQkJCQliLmFwcGVuZCgiXFw0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w1JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNicgOgotCQkJCWIuYXBwZW5kKCJcXDYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDcnIDoKLQkJCQliLmFwcGVuZCgiXFw3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkJYi5hcHBlbmQoY2hhcmFjdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYXJWYWx1ZUdlbihjaGFyIG5ld0NoYXJWYWx1ZSkgewotCQljaGFyIG9sZENoYXJWYWx1ZSA9IGNoYXJWYWx1ZTsKLQkJY2hhclZhbHVlID0gbmV3Q2hhclZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRSwgb2xkQ2hhclZhbHVlLCBjaGFyVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZ2V0Q2hhclZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJc2V0Q2hhclZhbHVlKCgoQ2hhcmFjdGVyKW5ld1ZhbHVlKS5jaGFyVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJc2V0Q2hhclZhbHVlKENIQVJfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZXNjYXBlZFZhbHVlICE9IG51bGwgOiAhRVNDQVBFRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZXNjYXBlZFZhbHVlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJcmV0dXJuIGNoYXJWYWx1ZSAhPSBDSEFSX1ZBTFVFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0NoYXJhY3RlckxpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3ZDRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyZ3VtZW50cygpIDxlbT5Bcmd1bWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJndW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJndW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXJndW1lbnRzKCkgewotCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKLQkJCWFyZ3VtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFMpOwotCQl9Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyZ3VtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFyZ3VtZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcmd1bWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCWdldEFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGFyZ3VtZW50cyAhPSBudWxsICYmICFhcmd1bWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBhcmd1bWVudHMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0NsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTMzMTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25kaXRpb25hbCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25kaXRpb24oKSA8ZW0+Q29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gY29uZGl0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRydWUoKSA8ZW0+VHJ1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJ1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiB0cnVlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGYWxzZSgpIDxlbT5GYWxzZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmFsc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZmFsc2VfID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKLQkJcmV0dXJuIGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb25kaXRpb24oUFRFeHByZXNzaW9uIG5ld0NvbmRpdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkQ29uZGl0aW9uID0gY29uZGl0aW9uOwotCQljb25kaXRpb24gPSBuZXdDb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgb2xkQ29uZGl0aW9uLCBuZXdDb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmRpdGlvbihQVEV4cHJlc3Npb24gbmV3Q29uZGl0aW9uKSB7Ci0JCWlmIChuZXdDb25kaXRpb24gIT0gY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbmRpdGlvbihuZXdDb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBuZXdDb25kaXRpb24sIG5ld0NvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0VHJ1ZSgpIHsKLQkJcmV0dXJuIHRydWVfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRydWUoUFRFeHByZXNzaW9uIG5ld1RydWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFRydWUgPSB0cnVlXzsKLQkJdHJ1ZV8gPSBuZXdUcnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBvbGRUcnVlLCBuZXdUcnVlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcnVlKFBURXhwcmVzc2lvbiBuZXdUcnVlKSB7Ci0JCWlmIChuZXdUcnVlICE9IHRydWVfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0cnVlXyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0cnVlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RydWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHJ1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHJ1ZShuZXdUcnVlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG5ld1RydWUsIG5ld1RydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEZhbHNlKCkgewotCQlyZXR1cm4gZmFsc2VfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZhbHNlKFBURXhwcmVzc2lvbiBuZXdGYWxzZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRmFsc2UgPSBmYWxzZV87Ci0JCWZhbHNlXyA9IG5ld0ZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgb2xkRmFsc2UsIG5ld0ZhbHNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWxzZShQVEV4cHJlc3Npb24gbmV3RmFsc2UpIHsKLQkJaWYgKG5ld0ZhbHNlICE9IGZhbHNlXykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZmFsc2VfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZhbHNlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdGYWxzZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGYWxzZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZhbHNlKG5ld0ZhbHNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBuZXdGYWxzZSwgbmV3RmFsc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VHJ1ZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRGYWxzZShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRDb25kaXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlyZXR1cm4gZ2V0VHJ1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlyZXR1cm4gZ2V0RmFsc2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlzZXRDb25kaXRpb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXNldFRydWUoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlzZXRGYWxzZSgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJc2V0Q29uZGl0aW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXNldFRydWUoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXNldEZhbHNlKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlyZXR1cm4gY29uZGl0aW9uICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJcmV0dXJuIHRydWVfICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXJldHVybiBmYWxzZV8gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRDb25kaXRpb24oKSk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUcnVlKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RmFsc2UoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiMTIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUFRFeHByZXNzaW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUFRFeHByZXNzaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5FeHByZXNzaW9uI2FjY2VwdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWNjZXB0KFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXRyeSB7Ci0JCQljaGlsZEFjY2VwdDAodmlzaXRvcik7Ci0JCX0gY2F0Y2ggKFBhcnNlVmlzaXRvci5TdG9wVmlzaXRpbmcgZSkgewotCQkJLy8gRG8gbm90aGluZywgdGhpcyBpcyBhIG5vcm1hbCB3YXkgdG8ganVzdCBzdG9wIHZpc2l0aW5nLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHR5cGUtc3BlY2lmaWMgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGluIGFsbCBjb25jcmV0ZSBFeHByZXNzaW9uIG5vZGUgdHlwZXMuCi0JICogPHA+Ci0JICogR2VuZXJhbCB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50YXRpb24gb24gZWFjaCBjb25jcmV0ZSBBU1ROb2RlIGNsYXNzOgotCSAqIDxwcmU+Ci0JICogPGNvZGU+Ci0JICogYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkgKiBpZiAodmlzaXRDaGlsZHJlbikgewotCSAqICAgIC8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkgKiAgICBhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRQcm9wZXJ0eTEoKSk7Ci0JICogICAgYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgcmF3TGlzdFByb3BlcnR5KTsKLQkgKiAgICBhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRQcm9wZXJ0eTIoKSk7Ci0JICogfQotCSAqIHZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JICogPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIE5vdGUgdGhhdCB0aGUgY2FsbGVyICg8Y29kZT5hY2NlcHQ8L2NvZGU+KSB0YWtlIGNhcmVzIG9mIGludm9raW5nCi0JICogPGNvZGU+dmlzaXRvci5wcmVWaXNpdCh0aGlzKTwvY29kZT4gYW5kIDxjb2RlPnZpc2l0b3IucG9zdFZpc2l0KHRoaXMpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcik7Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieSB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mCi0JICogPGNvZGU+YWNjZXB0MDwvY29kZT4gdG8gdHJhdmVyc2Ugb3B0aW9uYWwgcHJvcGVydGllcy4gRXF1aXZhbGVudAotCSAqIHRvIDxjb2RlPmNoaWxkLmFjY2VwdCh2aXNpdG9yKTwvY29kZT4gaWYgPGNvZGU+Y2hpbGQ8L2NvZGU+Ci0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIEV4cHJlc3Npb24gbm9kZSB0byBkaXNwYXRjaCB0b28sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgaWYgbm9uZS4gSXQgYWN0dWFsbHkgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBQVEV4cHJlc3Npb25JbXBsLCBidXQgCi0JICogICAgaXQgd291bGQgYmUgdG9vIGRpZmZpY3VsdCB0byBwdXQgdGhlIGNhc3QgaW4gZWFjaCBjYWxsIHRvIGFjY2VwdENoaWxkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFjY2VwdENoaWxkKFBhcnNlVmlzaXRvciB2aXNpdG9yLCBQVEV4cHJlc3Npb24gY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkoKFBURXhwcmVzc2lvbkltcGwpIGNoaWxkKS5jaGlsZEFjY2VwdDAodmlzaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBPTkxZIGJ5IFBURXhwcmVzc2lvbkltcGwgZm9yIHRoZSBjaGlsZCB0byBhY2NlcHQgdGhlIHZpc2l0b3IsIGJ1dAotCSAqIGl0IGRvZXNuJ3QgY2F0Y2ggU3RvcFZpc2l0aW5nLgotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGlsZEFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJaWYgKHZpc2l0b3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIGJlZ2luIHdpdGggdGhlIGdlbmVyaWMgcHJlLXZpc2l0Ci0JCXZpc2l0b3IucHJlVmlzaXQodGhpcyk7Ci0JCS8vIGR5bmFtaWMgZGlzcGF0Y2ggdG8gaW50ZXJuYWwgbWV0aG9kIGZvciB0eXBlLXNwZWNpZmljIHZpc2l0L2VuZFZpc2l0Ci0JCWFjY2VwdDAodmlzaXRvcik7Ci0JCS8vIGVuZCB3aXRoIHRoZSBnZW5lcmljIHBvc3QtdmlzaXQKLQkJdmlzaXRvci5wb3N0VmlzaXQodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgZ2l2ZW4gbGl2ZSBsaXN0IG9mCi0JICogY2hpbGQgbm9kZXMuIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqIEBwYXJhbSBjaGlsZHJlbiB0aGUgY2hpbGQgRXhwcmVzc2lvbiBub2RlcyB0byBkaXNwYXRjaCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY2NlcHRDaGlsZHJlbihQYXJzZVZpc2l0b3IgdmlzaXRvciwgTGlzdCBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIChQVEV4cHJlc3Npb24pIGNoaWxkcmVuLmdldChpKSk7Ci0JCQl9Ci0JCX0gCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIGFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW4gYXZlcmFnZSBjb21waWxhdGlvbiB1bml0Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDYwMDApOwotCQlpbnQgcCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQkJdHJ5IHsKLQkJCWFwcGVuZERlYnVnU3RyaW5nKGJ1ZmZlcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gc2luY2UgZGVidWdnZXIgc29tZXRpbWVzIGNhbGwgdG9TdHJpbmcgbWV0aG9kcywgcHJvYmxlbXMgY2FuIGVhc2lseSBoYXBwZW4gd2hlbgotCQkJLy8gdG9TdHJpbmcgaXMgY2FsbGVkIG9uIGFuIGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgaW5pdGlhbGl6ZWQKLQkJCWJ1ZmZlci5zZXRMZW5ndGgocCk7Ci0JCQlidWZmZXIuYXBwZW5kKCIhIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhbmRhcmRUb1N0cmluZygpKTsKLQkJfQotCQkvLyBjb252ZXJ0IHRvIGEgc3RyaW5nLCBidXQgbG9zZSB0aGUgZXh0cmEgc3BhY2UgaW4gdGhlIHN0cmluZyBidWZmZXIgYnkgY29weWluZwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgc3RhbmRhcmRUb1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlYnVnU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJLy8gcHJpbnQgdGhlIHN1YnRyZWUgYnkgZGVmYXVsdAotCQlhcHBlbmRQcmludFN0cmluZyhidWZmZXIpOwotCX0KLQkKLQkvKgotCSAqIEFwcGVuZHMgYSBzdGFuZGFyZCBKYXZhIHNvdXJjZSBjb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc3VidHJlZSB0byB0aGUgZ2l2ZW4KLQkgKiBzdHJpbmcgYnVmZmVyLgotCSAqIAotCSAqIEBwYXJhbSBidWZmZXIgdGhlIHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRvCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYXBwZW5kUHJpbnRTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIgcHJpbnRlciA9IG5ldyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIoKTsKLQkJdGhpcy5hY2NlcHQocHJpbnRlcik7Ci0JCWJ1ZmZlci5hcHBlbmQocHJpbnRlci5nZXRSZXN1bHQoKSk7Ci0JfQkKLQotfSAvL0V4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURmllbGRBY2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURmllbGRBY2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTE0ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWVsZCBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBURmllbGRBY2Nlc3NJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBURmllbGRBY2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlY2VpdmVyKCkgPGVtPlJlY2VpdmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWNlaXZlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiByZWNlaXZlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGQoKSA8ZW0+RmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZCgpIDxlbT5GaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGQgPSBGSUVMRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEZpZWxkQWNjZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEZpZWxkQWNjZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpIHsKLQkJcmV0dXJuIHJlY2VpdmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkUmVjZWl2ZXIgPSByZWNlaXZlcjsKLQkJcmVjZWl2ZXIgPSBuZXdSZWNlaXZlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgb2xkUmVjZWl2ZXIsIG5ld1JlY2VpdmVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIpIHsKLQkJaWYgKG5ld1JlY2VpdmVyICE9IHJlY2VpdmVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWNlaXZlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlY2VpdmVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWNlaXZlcihuZXdSZWNlaXZlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBuZXdSZWNlaXZlciwgbmV3UmVjZWl2ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkKCkgewotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGQoU3RyaW5nIG5ld0ZpZWxkKSB7Ci0JCVN0cmluZyBvbGRGaWVsZCA9IGZpZWxkOwotCQlmaWVsZCA9IG5ld0ZpZWxkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxELCBvbGRGaWVsZCwgZmllbGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJlY2VpdmVyKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXJldHVybiBnZXRSZWNlaXZlcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXJldHVybiBnZXRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlzZXRSZWNlaXZlcigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJc2V0RmllbGQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlzZXRSZWNlaXZlcigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlzZXRGaWVsZChGSUVMRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIHJlY2VpdmVyICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZCAhPSBudWxsIDogIUZJRUxEX0VERUZBVUxULmVxdWFscyhmaWVsZCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJlY2VpdmVyKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL0ZpZWxkQWNjZXNzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluZml4RXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTZkMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluZml4RXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRMZWZ0T3BlcmFuZCA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0RXh0ZW5kZWRPcGVyYW5kcyA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluZml4RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbmZpeEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlZnRPcGVyYW5kKCkgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVmdE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gbGVmdE9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgT1BFUkFUT1JfRURFRkFVTFQgPSBQVEluZml4T3BlcmF0b3IuVElNRVNfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5maXhPcGVyYXRvciBvcGVyYXRvciA9IE9QRVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmlnaHRPcGVyYW5kKCkgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpZ2h0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRPcGVyYW5kcygpIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZE9wZXJhbmRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRPcGVyYW5kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbmZpeEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUSW5maXhFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRMZWZ0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIGxlZnRPcGVyYW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdMZWZ0T3BlcmFuZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkTGVmdE9wZXJhbmQgPSBsZWZ0T3BlcmFuZDsKLQkJbGVmdE9wZXJhbmQgPSBuZXdMZWZ0T3BlcmFuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBvbGRMZWZ0T3BlcmFuZCwgbmV3TGVmdE9wZXJhbmQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdMZWZ0T3BlcmFuZCkgewotCQlpZiAobmV3TGVmdE9wZXJhbmQgIT0gbGVmdE9wZXJhbmQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGxlZnRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxlZnRPcGVyYW5kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdMZWZ0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMZWZ0T3BlcmFuZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMZWZ0T3BlcmFuZChuZXdMZWZ0T3BlcmFuZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG5ld0xlZnRPcGVyYW5kLCBuZXdMZWZ0T3BlcmFuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluZml4T3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihQVEluZml4T3BlcmF0b3IgbmV3T3BlcmF0b3IpIHsKLQkJUFRJbmZpeE9wZXJhdG9yIG9sZE9wZXJhdG9yID0gb3BlcmF0b3I7Ci0JCW9wZXJhdG9yID0gbmV3T3BlcmF0b3IgPT0gbnVsbCA/IE9QRVJBVE9SX0VERUZBVUxUIDogbmV3T3BlcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SLCBvbGRPcGVyYXRvciwgb3BlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFJpZ2h0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIHJpZ2h0T3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld1JpZ2h0T3BlcmFuZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkUmlnaHRPcGVyYW5kID0gcmlnaHRPcGVyYW5kOwotCQlyaWdodE9wZXJhbmQgPSBuZXdSaWdodE9wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG9sZFJpZ2h0T3BlcmFuZCwgbmV3UmlnaHRPcGVyYW5kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld1JpZ2h0T3BlcmFuZCkgewotCQlpZiAobmV3UmlnaHRPcGVyYW5kICE9IHJpZ2h0T3BlcmFuZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmlnaHRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJpZ2h0T3BlcmFuZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JpZ2h0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSaWdodE9wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJpZ2h0T3BlcmFuZChuZXdSaWdodE9wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgbmV3UmlnaHRPcGVyYW5kLCBuZXdSaWdodE9wZXJhbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRPcGVyYW5kcygpIHsKLQkJaWYgKGV4dGVuZGVkT3BlcmFuZHMgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRPcGVyYW5kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRPcGVyYW5kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TGVmdE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSaWdodE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZE9wZXJhbmRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXJldHVybiBnZXRMZWZ0T3BlcmFuZCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0T3BlcmF0b3IoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlyZXR1cm4gZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJc2V0TGVmdE9wZXJhbmQoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcigoUFRJbmZpeE9wZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXNldExlZnRPcGVyYW5kKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcihPUEVSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlyZXR1cm4gbGVmdE9wZXJhbmQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIG9wZXJhdG9yICE9IE9QRVJBVE9SX0VERUZBVUxUOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXJldHVybiByaWdodE9wZXJhbmQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkT3BlcmFuZHMgIT0gbnVsbCAmJiAhZXh0ZW5kZWRPcGVyYW5kcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldExlZnRPcGVyYW5kKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmlnaHRPcGVyYW5kKCkpOwotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZXh0ZW5kZWRPcGVyYW5kcyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jYXNDb21wcmVzc2VkRXhwcmVzc2lvbigpCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBhc0NvbXByZXNzZWRFeHByZXNzaW9uKCkgewotCQkvLyBJZiBubyBsZWZ0IGFuZCBubyByaWdodAotCQlpZihnZXRMZWZ0T3BlcmFuZCgpID09IG51bGwgJiYgZ2V0UmlnaHRPcGVyYW5kKCkgIT0gbnVsbCl7Ci0JCQkvLyBubyBleHRlbmRzIHNvIGp1c3QgdXNlIHRoZSByaWdodCBvcGVyYW5kCi0JCQlpZihnZXRFeHRlbmRlZE9wZXJhbmRzKCkuaXNFbXB0eSgpKXsKLQkJCQlyZXR1cm4gZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSByaWdodCBiZWNvbWVzIHRoZSBuZXcgbGVmdAotCQkJCXNldExlZnRPcGVyYW5kKGdldFJpZ2h0T3BlcmFuZCgpKTsKLQkJCQkvLyBUaGUgZmlyc3Qgb3BlcmFuZCBiZWNvbWVzIHRoZSByaWdodCBvbmUKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbikgZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLnJlbW92ZSgwKSk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZ2V0UmlnaHRPcGVyYW5kKCkgPT0gbnVsbCAmJiBnZXRMZWZ0T3BlcmFuZCgpICE9IG51bGwpewotCQkJLy8gbm8gZXh0ZW5kcyBzbyBqdXN0IHVzZSB0aGUgbGVmdCBvcGVyYW5kCi0JCQlpZihnZXRFeHRlbmRlZE9wZXJhbmRzKCkuaXNFbXB0eSgpKXsKLQkJCQlyZXR1cm4gZ2V0TGVmdE9wZXJhbmQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIHJpZ2h0IGJlY29tZXMgdGhlIGZpcnN0IGV4dGVuZGVkCi0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLnJlbW92ZSgwKSk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9CQkJCi0JCX0JCi0JCXJldHVybiB0aGlzOwotCX0KLX0gLy9JbmZpeEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjVkMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICVXJQotICogQHZlcnNpb24gJUklICVIJQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlUmVmZXJlbmNlSW1wbCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5zdGFuY2VSZWZlcmVuY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZSgpIDxlbT5SZWZlcmVuY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElKYXZhSW5zdGFuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElKYXZhSW5zdGFuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmVJc1Byb3h5KCkpIHsKLQkJCUlKYXZhSW5zdGFuY2Ugb2xkUmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJcmVmZXJlbmNlID0gKElKYXZhSW5zdGFuY2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXJlZmVyZW5jZSk7Ci0JCQlpZiAocmVmZXJlbmNlICE9IG9sZFJlZmVyZW5jZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFLCBvbGRSZWZlcmVuY2UsIHJlZmVyZW5jZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElKYXZhSW5zdGFuY2UgYmFzaWNHZXRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgbmV3UmVmZXJlbmNlKSB7Ci0JCUlKYXZhSW5zdGFuY2Ugb2xkUmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQlyZWZlcmVuY2UgPSBuZXdSZWZlcmVuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFLCBvbGRSZWZlcmVuY2UsIHJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWZlcmVuY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCXNldFJlZmVyZW5jZSgoSUphdmFJbnN0YW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJc2V0UmVmZXJlbmNlKChJSmF2YUluc3RhbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gcmVmZXJlbmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRFeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSW5zdGFuY2VSZWZ7IiArIHJlZmVyZW5jZSArICJ9IjsKLQl9Ci0KLX0gLy9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VvZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2ZjE2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VvZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnN0YW5jZW9mPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwjZ2V0T3BlcmFuZCA8ZW0+T3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluc3RhbmNlb2ZJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5zdGFuY2VvZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmFuZCgpIDxlbT5PcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIG9wZXJhbmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnN0YW5jZW9mSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluc3RhbmNlb2YoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldE9wZXJhbmQoKSB7Ci0JCXJldHVybiBvcGVyYW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld09wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZE9wZXJhbmQgPSBvcGVyYW5kOwotCQlvcGVyYW5kID0gbmV3T3BlcmFuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgb2xkT3BlcmFuZCwgbmV3T3BlcmFuZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3T3BlcmFuZCkgewotCQlpZiAobmV3T3BlcmFuZCAhPSBvcGVyYW5kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9wZXJhbmQobmV3T3BlcmFuZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBuZXdPcGVyYW5kLCBuZXdPcGVyYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldE9wZXJhbmQobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGdldE9wZXJhbmQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlzZXRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJc2V0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXJldHVybiBvcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0T3BlcmFuZCgpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL0luc3RhbmNlb2ZJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOGM1NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnZhbGlkIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUSW52YWxpZEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW52YWxpZEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlKCkgPGVtPk1lc3NhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2UgPSBNRVNTQUdFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW52YWxpZEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2UgPSBtZXNzYWdlOwotCQltZXNzYWdlID0gbmV3TWVzc2FnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFLCBvbGRNZXNzYWdlLCBtZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlzZXRNZXNzYWdlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlzZXRNZXNzYWdlKE1FU1NBR0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2UgIT0gbnVsbCA6ICFNRVNTQUdFX0VERUZBVUxULmVxdWFscyhtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL0ludmFsaWRFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE1ldGhvZEludm9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTWV0aG9kSW52b2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3YTYwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTWV0aG9kSW52b2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgSW52b2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUTWV0aG9kSW52b2NhdGlvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRNZXRob2RJbnZvY2F0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWNlaXZlcigpIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVjZWl2ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmd1bWVudHMoKSA8ZW0+QXJndW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyZ3VtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyZ3VtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRNZXRob2RJbnZvY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE1ldGhvZEludm9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCkgewotCQlyZXR1cm4gcmVjZWl2ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRSZWNlaXZlciA9IHJlY2VpdmVyOwotCQlyZWNlaXZlciA9IG5ld1JlY2VpdmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG9sZFJlY2VpdmVyLCBuZXdSZWNlaXZlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyKSB7Ci0JCWlmIChuZXdSZWNlaXZlciAhPSByZWNlaXZlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVjZWl2ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlY2VpdmVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlY2VpdmVyKG5ld1JlY2VpdmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgbmV3UmVjZWl2ZXIsIG5ld1JlY2VpdmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFyZ3VtZW50cygpIHsKLQkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCQlhcmd1bWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZWNlaXZlcihudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXJndW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXJldHVybiBnZXRSZWNlaXZlcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBnZXRBcmd1bWVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlzZXRSZWNlaXZlcigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCWdldEFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJndW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCWdldEFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gcmVjZWl2ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gYXJndW1lbnRzICE9IG51bGwgJiYgIWFyZ3VtZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJlY2VpdmVyKCkpOwotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9NZXRob2RJbnZvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmNTc4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROYW1lSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFROYW1lSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE5hbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL05hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVsbExpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVsbExpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YTg2NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bGxMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVsbCBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFROdWxsTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFROdWxsTGl0ZXJhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTnVsbExpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTnVsbExpdGVyYWwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vTnVsbExpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVtYmVyTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE5YTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk51bWJlciBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVtYmVyTGl0ZXJhbEltcGwjZ2V0VG9rZW4gPGVtPlRva2VuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFROdW1iZXJMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE51bWJlckxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb2tlbigpIDxlbT5Ub2tlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9rZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRva2VuKCkgPGVtPlRva2VuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb2tlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0b2tlbiA9IFRPS0VOX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTnVtYmVyTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFROdW1iZXJMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKLQkJcmV0dXJuIHRva2VuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRva2VuKFN0cmluZyBuZXdUb2tlbikgewotCQlTdHJpbmcgb2xkVG9rZW4gPSB0b2tlbjsKLQkJdG9rZW4gPSBuZXdUb2tlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOLCBvbGRUb2tlbiwgdG9rZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlyZXR1cm4gZ2V0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlzZXRUb2tlbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJc2V0VG9rZW4oVE9LRU5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJcmV0dXJuIFRPS0VOX0VERUZBVUxUID09IG51bGwgPyB0b2tlbiAhPSBudWxsIDogIVRPS0VOX0VERUZBVUxULmVxdWFscyh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0b2tlbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9rZW4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vTnVtYmVyTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjMjg1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUHJlZml4RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2OGFlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUHJlZml4RXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwjZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUUHJlZml4RXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRQcmVmaXhFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgT1BFUkFUT1JfRURFRkFVTFQgPSBQVFByZWZpeE9wZXJhdG9yLlBMVVNfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IgPSBPUEVSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFByZWZpeEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUUHJlZml4RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFByZWZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUFRQcmVmaXhPcGVyYXRvciBuZXdPcGVyYXRvcikgewotCQlQVFByZWZpeE9wZXJhdG9yIG9sZE9wZXJhdG9yID0gb3BlcmF0b3I7Ci0JCW9wZXJhdG9yID0gbmV3T3BlcmF0b3IgPT0gbnVsbCA/IE9QRVJBVE9SX0VERUZBVUxUIDogbmV3T3BlcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiwgb2xkT3BlcmF0b3IsIG9wZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGdldE9wZXJhdG9yKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoKFBUUHJlZml4T3BlcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoT1BFUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIG9wZXJhdG9yICE9IE9QRVJBVE9SX0VERUZBVUxUOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vUHJlZml4RXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFN0cmluZ0xpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjE3MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFN0cmluZ0xpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFN0cmluZ0xpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUU3RyaW5nTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc2NhcGVkVmFsdWUgPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpdGVyYWxWYWx1ZSgpIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJVEVSQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGl0ZXJhbFZhbHVlKCkgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaXRlcmFsVmFsdWUgPSBMSVRFUkFMX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUU3RyaW5nTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRTdHJpbmdMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiBlc2NhcGVkVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJc3RyaW5nTGl0ZXJhbFNldCA9IGZhbHNlOwotCQlzZXRMaXRlcmFsVmFsdWVHZW4oTElURVJBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCXNldEVzY2FwZWRWYWx1ZUdlbihuZXdFc2NhcGVkVmFsdWUpOwkJCi0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZUdlbihTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRFc2NhcGVkVmFsdWUgPSBlc2NhcGVkVmFsdWU7Ci0JCWVzY2FwZWRWYWx1ZSA9IG5ld0VzY2FwZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUsIG9sZEVzY2FwZWRWYWx1ZSwgZXNjYXBlZFZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0cmluZ0xpdGVyYWxTZXQ7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsVmFsdWUoKSB7Ci0JCWlmICghc3RyaW5nTGl0ZXJhbFNldCAmJiBlc2NhcGVkVmFsdWUgIT0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCkgewotCQkJU3RyaW5nIHMgPSBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA8IDIgfHwgcy5jaGFyQXQoMCkgIT0gJ1wiJyB8fCBzLmNoYXJBdChsZW4tMSkgIT0gJ1wiJyApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCQlpbnQgc3RvcCA9IGxlbi0xOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdG9wOyBpKyspIHsKLQkJCQljaGFyIGF0aSA9IHMuY2hhckF0KGkpOwotCQkJCWlmIChhdGkgPT0gJ1xcJykgewotCQkJCQlpZiAoKytpIDwgc3RvcCkgewotCQkJCQkJYXRpID0gcy5jaGFyQXQoaSk7Ci0JCQkJCQlpZiAoYXRpID09ICd1JykgewotCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7Ci0JCQkJCQkJaWYgKGkrNCA+PSBzdG9wCi0JCQkJCQkJCQl8fCAoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjMSA8IDAKLQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGMyIDwgMAotCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzMgPCAwCi0JCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjNCA8IDApewotCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHN0cmluZyBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQlidWZmZXIuYXBwZW5kKChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlidWZmZXIuYXBwZW5kKFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuZ2V0Q2hhckVzY2FwZWQoYXRpKSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UKLQkJCQkJYnVmZmVyLmFwcGVuZChhdGkpOwkKLQkJCX0KLQkJCQotCQkJc3RyaW5nTGl0ZXJhbFNldCA9IHRydWU7Ci0JCQlzZXRMaXRlcmFsVmFsdWVHZW4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TGl0ZXJhbFZhbHVlR2VuKCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbFZhbHVlR2VuKCkgewotCQlyZXR1cm4gbGl0ZXJhbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpdGVyYWxWYWx1ZShTdHJpbmcgbmV3TGl0ZXJhbFZhbHVlKSB7Ci0JCXN0cmluZ0xpdGVyYWxTZXQgPSB0cnVlOwotCQlzZXRMaXRlcmFsVmFsdWVHZW4obmV3TGl0ZXJhbFZhbHVlKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdMaXRlcmFsVmFsdWUubGVuZ3RoKCkrMik7Ci0JCWIuYXBwZW5kKCdcIicpOyAvLyBvcGVuaW5nIGRlbGltaXRlcgotCQlpbnQgc3RvcCA9IG5ld0xpdGVyYWxWYWx1ZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9wOyBpKyspIHsKLQkJCVBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuYXBwZW5kQ2hhcmFjdGVyKG5ld0xpdGVyYWxWYWx1ZS5jaGFyQXQoaSksIGIpOwkKLQkJfQotCQliLmFwcGVuZCgnXCInKTsgLy8gY2xvc2luZyBkZWxpbWl0ZXIKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKGIudG9TdHJpbmcoKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpdGVyYWxWYWx1ZUdlbihTdHJpbmcgbmV3TGl0ZXJhbFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRMaXRlcmFsVmFsdWUgPSBsaXRlcmFsVmFsdWU7Ci0JCWxpdGVyYWxWYWx1ZSA9IG5ld0xpdGVyYWxWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUUsIG9sZExpdGVyYWxWYWx1ZSwgbGl0ZXJhbFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXJldHVybiBnZXRMaXRlcmFsVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXNldEVzY2FwZWRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXNldExpdGVyYWxWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoRVNDQVBFRF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlzZXRMaXRlcmFsVmFsdWUoTElURVJBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlc2NhcGVkVmFsdWUgIT0gbnVsbCA6ICFFU0NBUEVEX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlc2NhcGVkVmFsdWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlyZXR1cm4gTElURVJBTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gbGl0ZXJhbFZhbHVlICE9IG51bGwgOiAhTElURVJBTF9WQUxVRV9FREVGQVVMVC5lcXVhbHMobGl0ZXJhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1N0cmluZ0xpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVGhpc0xpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVGhpc0xpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTM3MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGhpcyBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRUaGlzTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRUaGlzTGl0ZXJhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUVGhpc0xpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUVGhpc0xpdGVyYWwoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vVGhpc0xpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVHlwZUxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVHlwZUxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDViN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFR5cGVMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUVHlwZUxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUVHlwZUxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUVHlwZUxpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUVHlwZUxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9UeXBlTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiNWNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbkltcGwgaW1wbGVtZW50cyBQYXJzZVRyZWVBbGxvY2F0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG9sZEV4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24pIHsKLQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gZXhwcmVzc2lvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHByZXNzaW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgbmV3RXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpICE9IG51bGwgPyBnZXRFeHByZXNzaW9uKCkudG9TdHJpbmcoKSA6IHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjQ0YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcl9JbnZhbGlkRXhwcmVzc2lvbj0gaW52YWxpZDogInswfSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGZmOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iaW5zdGFudGlhdGlvbiIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkphdmEgSW5zdGFudGlhdGlvbiBQYWNrYWdlIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhRGF0YVR5cGVJbnN0YW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YUluc3RhbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhT2JqZWN0SW5zdGFuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFJbnN0YW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpbnRlcmZhY2UgaXMgdGhlIGluc3RhbmNlIG9mIGFuIGphdmEgb2JqZWN0IGluIHRoZSBqYXZhIG1vZGVsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQWxsb2NhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgJnF1b3Q7YWxsb2NhdGlvbiZxdW90OyBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRTdHJpbmdBbGxvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUFsbG9jYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0U3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciB0aGlzIG9iamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1wbGljaXRBbGxvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUFsbG9jYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmVhdHVyZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RydWN0dXJhbEZlYXR1cmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFyc2VUcmVlQWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBURXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFycmF5QWNjZXNzIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnJheSBhY2Nlc3MuIGUuZy4geFszXS4gJiN4RDsmI3hBOyYjeEQ7JiN4QTtVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJyYXkiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBhcnJheSB0byBhY2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluZGV4ZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgdGhlIGluZGV4ZXMgb2YgdGhlIGFjY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBcnJheUNyZWF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnJheSBDcmVhdGlvbiBleHByZXNzaW9uLCBlLmcuIG5ldyBpbnRbM10gb3IgbmV3IGphdmEubGFuZ1N0cmluZ1tdW10ge3smcXVvdDthJnF1b3Q7fSwgeyZxdW90O2ImcXVvdDt9fSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlLCBlLmcuIGludFtdW10gb3IgamF2YS5sYW5nLlN0cmluZ1tdLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBkaW1lbnNpb24gYnJhY2tldHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpbWVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdGlhbGl6ZXIiIGVUeXBlPSIjLy9QVEFycmF5SW5pdGlhbGl6ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgaW5pdGlhbGl6ZXIsIGlmIGFueSwgZm9yIHRoaXMgYXJyYXkuIEUuZy4gbmV3IGludFtdIHsyLDN9LiBJdCBpcyB0aGUgezIsM30uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQXJyYXlJbml0aWFsaXplciIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgZW50aXJlIGV4cHJlc3Npb24sIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbnMgbGlzdCBmb3IgdGhlIHRvcCBBcnJheUluaXRpYWxpemVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpc3RoZSBsaXN0IG9mIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgaW5pdGlhbGl6ZXIsIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgZmlyc3QgY2FzZSBpdCB3aWxsIGJlIHR3byBOdW1iZXJMaXRlcmFscy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyLCBmb2xsb3dlZCBieSBhIE51bWJlckxpdGVyYWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQm9vbGVhbkxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBib29sZWFuIGxpdGVyYWwsIGkuZS4gdHJ1ZSBvciBmYWxzZSBkaXJlY3RseSBpbiB0aGUgY29kZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9vbGVhblZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDYXN0RXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FzdCBleHByZXNzaW9uLCBlLmcuIChzaG9ydCkgMTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG9mIHRoZSBjYXN0LCBlLmcuIGludCBvciBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENoYXJhY3RlckxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBjaGFyYWN0ZXIgZXhwcmVzc2lvbiwgZS5nLiAnYScgb3IgJ1xyJy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXNjYXBlZFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAnYScgb3IgJ1xyJy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIHRoZW1zZWx2ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYXJWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUNoYXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgcHJpbWl0aXZlIGNoYXJhY3RlciB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uIEUuZy4gbmV3IFN0cmluZygmcXVvdDthJnF1b3Q7KSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MuIEUuZy4gamF2YS5sYW5nLlN0cmluZy4gVGhpcyBzaG91bGQgYmUgZnVsbHktcXVhbGlmaWVkIGZvciBhbGxvY2F0aW9uIHB1cnBvc2VzLiBJdCBzaG91bGQgYWxzbyBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBpZiBYIGlzIGFuIGlubmVyIGNsYXNzIG9mIGouWSwgdGhlbiB0aGUgdHlwZSBoZXJlIHNob3VsZCBiZSAmcXVvdDtqLlkkWCZxdW90Oy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFyZ3VtZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGVzdCBFeHByZXNzb24sIGUuZy4gKHg9MykgPyAxIDogMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25kaXRpb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0cnVlIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0cnVlIGV4cHJlc3Npb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmFsc2UiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZhbHNlIGV4cHJlc3Npb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBURmllbGRBY2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFjY2VzcyBhIGZpZWxkIGV4cHJlc3Npb24sIGUuZy4gamF2YS5hd3QuQ29sb3IucmVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlY2VpdmVyIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpZWxkIGlzIGluLCBlLmcuIGphdmEuYXd0LkNvbG9yLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBhY2Nlc3NlZCwgZS5nLiByZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5maXhFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHByZXNzaW9uIHdpdGggYW4gb3BlcmF0b3IgdGhhdCBoYXMgdHdvIG9wZXJhbmRzLCBlLmcuIDMgKyA0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsZWZ0T3BlcmFuZCIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3BlcmF0b3IiIGVUeXBlPSIjLy9QVEluZml4T3BlcmF0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3BlcmF0b3IsIGUuZy4gKyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyaWdodE9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0IGV4cHJlc3Npb24uIGkuZS4gNCBvZiAmcXVvdDszICsgNCZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZE9wZXJhbmRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHdoZW4gdGhlcmUgYXJlIGEgc2VyaWVzIG9mIGluZml4IG9wZXJhdGlvbnMgb2YgdGhlIHNhbWUgb3BlcmF0b3IsIGUuZy4gMSArIDIgKyAzICsgNC4gMSBhbmQgMiB3aWxsIGdvIGludG8gbGVmdCBhbmQgcmlnaHQsIHdoaWxlIHszLCA0fSB3aWxsIGdvIGludG8gdGhlIGV4dGVuZGVkIG9wZXJhbmRzLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQVEluZml4T3BlcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVudW1lcmF0b3IgZm9yIHRoZSBvcGVyYXRvciBvbiBhbiBJbmZpeEV4cHJlc3Npb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJUSU1FUyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Iiogb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRElWSURFIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii8gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVNQUlOREVSIiB2YWx1ZT0iMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiUgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUExVUyIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIrIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik1JTlVTIiB2YWx1ZT0iNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTEVGVF9TSElGVCIgdmFsdWU9IjUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImbHQ7Jmx0OyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSSUdIVF9TSElGVF9TSUdORUQiIHZhbHVlPSI2Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUklHSFRfU0hJRlRfVU5TSUdORUQiIHZhbHVlPSI3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj4+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFU1MiIHZhbHVlPSI4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0OyAgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR1JFQVRFUiIgdmFsdWU9IjkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFU1NfRVFVQUxTIiB2YWx1ZT0iMTAiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImbHQ7PSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJHUkVBVEVSX0VRVUFMUyIgdmFsdWU9IjExIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPj0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVFVQUxTIiB2YWx1ZT0iMTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI9PSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT1RfRVFVQUxTIiB2YWx1ZT0iMTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIhPSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJYT1IiIHZhbHVlPSIxNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Il4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQU5EIiB2YWx1ZT0iMTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImYW1wOyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPUiIgdmFsdWU9IjE2Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifCAgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09ORElUSU9OQUxfQU5EIiB2YWx1ZT0iMTciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImYW1wOyZhbXA7IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTkRJVElPTkFMX09SIiB2YWx1ZT0iMTgiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ8fCBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5zdGFuY2VvZiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5zdGFuY2VvZiBleHByZXNzaW9uLCBlLmcuIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHRvIHRlc3QsIGUuZy4geCBpbiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHRlc3QsIGUuZy4gamF2YS5sYW5nLlN0cmluZy4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTWV0aG9kSW52b2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWNlaXZlciIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaG8gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGFnYWluc3QuIFRoaXMgbWF5IGJlIG5vdCBzZXQsIHdoaWNoIG1lYW5zICZxdW90O3RoaXMmcXVvdDsuIEl0IG1heSBhbHNvIGJlIGEgTmFtZSwgd2hpY2ggd291bGQgbWVhbiBhIGNsYXNzIGxpa2UgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcmd1bWVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0IG9mIGFyZ3VtZW50cywgaWYgYW55LCB0byB0aGUgbWV0aG9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE5hbWUiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIG5hbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3IgdGhlIHJlY2VpdmVyIG9mIGEgbWV0aG9kIGludm9jYXRpb24sIGUuZy4geC5nZXRZKCkgb3IgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKS4gSW4gdGhlc2UgY2FzZXMgeW91IHdvdWxkIGhhdmUgYSBuYW1lIG9mICZxdW90O3gmcXVvdDsgb3IgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90Oy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lLCB3aGljaCBjYW4gYmUgYSB0eXBlIG9yIGEgdmFyaWFibGUuIElmIGl0IGlzIGEgdHlwZSwgdGhlbiAgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTnVsbExpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gJnF1b3Q7bnVsbCZxdW90OyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE51bWJlckxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b2tlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICZxdW90O3grMyZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFByZWZpeEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgb25lIG9wZXJhbmQgb3BlcmF0b3IsIHdoZXJlIHRoZSBvcGVyYXRvciBjb21lcyBiZWZvcmUgdGhlIG9wZXJhbmQsIGUuZy4gLSAoeCszKS4gSW4gQVNULCBldmVuIC0zIGlzIG1vZGVsZWQgYXMgYSBQcmVmaXhFeHByZXNzaW9uIG9mIG9wZXJhdG9yICZxdW90Oy0mcXVvdDsgYW5kIGV4cHJlc3Npb24gb2YgTnVtYmVyTGl0ZXJhbCgzKS4gQnV0IHdlIG9wdGltaXplIHRoaXMgYXdheSBhbmQganVzdCB1c2UgYSBOdW1iZXJMaXRlcmFsKC0zKSBkaXJlY3RseSBpbnN0ZWFkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcGVyYXRvciIgZVR5cGU9IiMvL1BUUHJlZml4T3BlcmF0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3BlcmF0b3Igb2YgdGhpcyBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHRoYXQgdGhlIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUFRQcmVmaXhPcGVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBleHByZXNzaW9uIG9wZXJhdG9yLiBXZSBhcmUgbm90IG1vZGVsaW5nICsrIGFuZCAtLS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBMVVMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIrIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik1JTlVTIiB2YWx1ZT0iMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ii0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09NUExFTUVOVCIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PVCIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIhIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRTdHJpbmdMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyBsaXRlcmFsLCBlLmcuICZxdW90O2FzZGYmcXVvdDsuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzY2FwZWRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGVzY2FwZWQgc3RyaW5nLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJnF1b3Q7YWImcXVvdDsgb3IgJnF1b3Q7Y1xyJnF1b3Q7LiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaXRlcmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFRoaXNMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzICZxdW90O3RoaXMmcXVvdDssIGUuZy4gdGhpcy5nZXRYKCkgd2lsbCBiZSBhIE1ldGhvZEludm9jYXRpb24gd2l0aCB0aGUgcmVjZWl2ZXIgYmVpbmcgYSBUaGlzTGl0ZXJhbC4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBmb3JtYXQgWFlaLnRoaXMgYmVjYXVzZSB0aGF0IGlzIGZvciBpbm5lciBjbGFzc2VzIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgcmlnaHQgbm93LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFR5cGVMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsLiAgSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW52YWxpZEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgc29tZSBleHByZXNzaW9uIHdlIGp1c3QgY2FuJ3QgZXZhbHVhdGUgZm9yIG91ciBwdXJwb3Nlcy4gSXQgYWxsb3dzIHVzIHRvIHRlbGwgdGhlIGV2YWx1YXRpb24gd2hhdCBpcyBhY3R1YWxseSB3cm9uZy4gSXQgc2hvdWxkIGJlIHBsYWNlZCBhcyB0aGUgcm9vdCBleHByZXNzaW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBtdWNoIG9mIHRoZSB0cmVlIGFuZCB0aGVuIGZpbmFsbHkgZmFpbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVzc2FnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRJbnN0YW5jZVJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uIEN1cnJlbnRseSB3ZSBvbmx5IHN0b3JlIHRoZSAmI3hEOyYjeEE7ZW50aXJlIGRlY2xhcmF0aW9uIGFzIGEgc3RyaW5nLCBpbmNsdWRpbmcgdGhlICZxdW90O25ldyBBQ2xhc3MoKSB7Li4ufSZxdW90Oy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVjbGFyYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVjbGFyYXRpb24gdGV4dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wb3J0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzc2NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0IgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IiIgbW9kZWxOYW1lPSJpbnN0YW5jZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5wcm92aWRlci5pbnN0YW5jZUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLnByZXNlbnRhdGlvbi5pbnN0YW5jZUVkaXRvclBsdWdpbiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcaW5zdGFuY2UubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V29ya3NwYWNlUm9vdDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ikluc3RhbnRpYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iaW5zdGFuY2UuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9USU1FUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9ESVZJREUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUkVNQUlOREVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1BMVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTUlOVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTEVGVF9TSElGVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9SSUdIVF9TSElGVF9TSUdORUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUklHSFRfU0hJRlRfVU5TSUdORUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTEVTUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9HUkVBVEVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0xFU1NfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0dSRUFURVJfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0VRVUFMUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9OT1RfRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1hPUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9BTkQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvT1IiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvQ09ORElUSU9OQUxfQU5EIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0NPTkRJVElPTkFMX09SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvUExVUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvTUlOVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL0NPTVBMRU1FTlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL05PVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9JSmF2YURhdGFUeXBlSW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0lKYXZhSW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0lKYXZhT2JqZWN0SW5zdGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0phdmFBbGxvY2F0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9Jbml0U3RyaW5nQWxsb2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9Jbml0U3RyaW5nQWxsb2NhdGlvbi9pbml0U3RyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSW1wbGljaXRBbGxvY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL0ltcGxpY2l0QWxsb2NhdGlvbi9wYXJlbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL0ltcGxpY2l0QWxsb2NhdGlvbi9mZWF0dXJlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUGFyc2VUcmVlQWxsb2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUGFyc2VUcmVlQWxsb2NhdGlvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRFeHByZXNzaW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5QWNjZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5QWNjZXNzL2FycmF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUFjY2Vzcy9pbmRleGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlDcmVhdGlvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uL2RpbWVuc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5Q3JlYXRpb24vaW5pdGlhbGl6ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5SW5pdGlhbGl6ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlJbml0aWFsaXplci9leHByZXNzaW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQm9vbGVhbkxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRCb29sZWFuTGl0ZXJhbC9ib29sZWFuVmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVENhc3RFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2FzdEV4cHJlc3Npb24vdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2FzdEV4cHJlc3Npb24vZXhwcmVzc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ2hhcmFjdGVyTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENoYXJhY3RlckxpdGVyYWwvZXNjYXBlZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENoYXJhY3RlckxpdGVyYWwvY2hhclZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24vdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uL2FyZ3VtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi9jb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi90cnVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDb25kaXRpb25hbEV4cHJlc3Npb24vZmFsc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzL3JlY2VpdmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEZpZWxkQWNjZXNzL2ZpZWxkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL2xlZnRPcGVyYW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbi9vcGVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL3JpZ2h0T3BlcmFuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL2V4dGVuZGVkT3BlcmFuZHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlb2YiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VvZi9vcGVyYW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlb2YvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRNZXRob2RJbnZvY2F0aW9uL3JlY2VpdmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVE1ldGhvZEludm9jYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbi9hcmd1bWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFROYW1lL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE51bGxMaXRlcmFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE51bWJlckxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFROdW1iZXJMaXRlcmFsL3Rva2VuIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4RXhwcmVzc2lvbi9vcGVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4RXhwcmVzc2lvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRTdHJpbmdMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUU3RyaW5nTGl0ZXJhbC9lc2NhcGVkVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUU3RyaW5nTGl0ZXJhbC9saXRlcmFsVmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFRoaXNMaXRlcmFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFR5cGVMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUVHlwZUxpdGVyYWwvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUSW52YWxpZEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRJbnZhbGlkRXhwcmVzc2lvbi9tZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZVJlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlUmVmZXJlbmNlL3JlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24vZGVjbGFyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi9pbXBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhhYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iamF2YSIKLSAgICBuc1VSST0iamF2YS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qZW0uamF2YSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFuZ2VzIHRvIHN5bmNoIHVwIHdpdGggSmF2YTNlOiYjeEQ7JiN4QTstIGRlbGV0ZWQgSmF2YUVsZW1lbnQsIEJvZHlFbGVtZW50IHdoaWNoIGRpZG4ndCBhZGQgYW55dGhpbmcgdXNlZnVsJiN4RDsmI3hBOy0gZGVsZXRlZCBOZXN0ZWRDbGFzcyBhbmQgdGhlIGFzc29jaWF0aW9uIHdoaWNoIGRlc2NyaWJlZCBuZXN0aW5nLCBjb250ZW50cyBjYW4gYmUgdXNlZCBpbnN0ZWFkJiN4RDsmI3hBOy0gZGVsZXRlZCBleHRlbmRzL2V4dGVuZGVkQnkgd2hpY2ggaXMgcmVwbGFjZWQgd2l0aCBNT0Ygc3VidHlwZS9zdXBlcnR5cGUmI3hEOyYjeEE7LSBkZWxldGVkIHRoZSBjbHVtc3kgbWFpbiBkaWFncmFtJiN4RDsmI3hBOy0gbW92ZWQgdGhlIE1PRiBpbmhlcml0YW5jZSBkZXRhaWxzIHRvIHRoZSBNT0YgYmluZGluZyBkaWFncmFtJiN4RDsmI3hBOy0gZGVsZXRlZCAmcXVvdDtmaW5hbCZxdW90OyBvbiBKYXZhUGFyYW1ldGVyLCBkb24ndCBrbm93IHdoYXQgdGhhdCB3YXMgc3VwcG9zZWQgdG8gYmUmI3hEOyYjeEE7LSBkZWxldGVkIHRoZSBDYXRlZ29yeSBqdW5rJiN4RDsmI3hBOy0gY2hhbmdlZCB0aGUgQmxvY2stdHlwZWQgYXR0cmlidXRlcyBvbiBGaWVsZCwgTWV0aG9kLCBJbml0aWFsaXplciB0byBiZSBhc3NvY2lhdGlvbnMgdG8gQmxvY2smI3hEOyYjeEE7JiN4RDsmI3hBO091dHN0YW5kaW5nIHF1ZXN0aW9ucy9pc3N1ZXM6JiN4RDsmI3hBOy0gSmF2YVBhcmFtZXRlcktpbmQgc2hvdWxkIGdvIGF3YXkgaWYgd2UgZ2V0IHRoZSBiYXNlIFBhcmFtZXRlciBraW5kIGZpeGVkIHVwJiN4RDsmI3hBOyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2xhc3MiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3MiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc05lc3RlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmllbGQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkRXh0ZW5kZWQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1JldHVybiBudWxsIGlmIGEgRmllbGQgbmFtZWQgZmllbGROYW1lIGlzIG5vdCBmb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkTmFtZWQiIGVUeXBlPSIjLy9GaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZpZWxkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2QiIGVUeXBlPSIjLy9NZXRob2QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXRob2ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyVHlwZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9lUGFyYW1ldGVycz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZEV4dGVuZGVkIiBlVHlwZT0iIy8vTWV0aG9kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXRob2ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyVHlwZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9lUGFyYW1ldGVycz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RzRXh0ZW5kZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImFNZXRob2ROYW1lUHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXhjbHVkZWROYW1lcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZCIgZVR5cGU9IiMvL01ldGhvZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kc05hbWVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U3VwZXJ0eXBlIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImltcGxlbWVudHNJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW50ZXJmYWNlVHlwZSIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImluZm9TdHJpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImluaGVyaXRzRnJvbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNFeGlzdGluZ1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9lcyB0aGlzIHR5cGUgZXhpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0ludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGFuIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFN1cGVydHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgc3VwZXJ0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iamF2YWNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2luZCIgZVR5cGU9IiMvL1R5cGVLaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1YmxpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGxlbWVudHNJbnRlcmZhY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc0ltcG9ydCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFja2FnZUltcG9ydHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YVBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmllbGRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpZWxkIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9GaWVsZC9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZC9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdGlhbGl6ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxpemVyIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Jbml0aWFsaXplci9qYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjbGFyZWRDbGFzc2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvZGVjbGFyaW5nQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjbGFyaW5nQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2RlY2xhcmVkQ2xhc3NlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhUGFja2FnZSIgZVR5cGU9IiMvL0phdmFQYWNrYWdlIgotICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhUGFja2FnZS9qYXZhQ2xhc3NlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJldmVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUV2ZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbGxFdmVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUV2ZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRpYWxpemVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdGF0aWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9pbml0aWFsaXplcnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iIy8vQmxvY2siLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVBhcmFtZXRlciIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VQYXJhbWV0ZXIiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0FycmF5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzUmV0dXJuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SmF2YVR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFF1YWxpZmllZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtZXRlcktpbmQiIGVUeXBlPSIjLy9KYXZhUGFyYW1ldGVyS2luZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2QiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT3BlcmF0aW9uIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gJmx0O2NvZGU+IHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSAmbHQ7L2NvZGU+IC4mI3hEOyYjeEE7ICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFyYW1ldGVyIiBlVHlwZT0iIy8vSmF2YVBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlck5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRSZXR1cm5UeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgcmV0dXJuIHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRSZXR1cm5UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSByZXR1cm4gdHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTaWduYXR1cmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuICBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZCB0aHJvd3MgZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0ZvciBleGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgJnF1b3Q7VGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiZxdW90Oy4gIFRoaXMgaXMgcHVibGljLCAmbHQ7dHQ+cHJvdGVjdGVkJmx0Oy90dD4gb3IgJmx0O3R0PnByaXZhdGUmbHQ7L3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICZsdDt0dD5hYnN0cmFjdCZsdDsvdHQ+LCAmbHQ7dHQ+c3RhdGljJmx0Oy90dD4sICZsdDt0dD5maW5hbCZsdDsvdHQ+LCAmbHQ7dHQ+c3luY2hyb25pemVkJmx0Oy90dD4gJmx0O3R0Pm5hdGl2ZSZsdDsvdHQ+LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzR2VuZXJhdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuJiN4RDsmI3hBO1RoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBAZ2VuZXJhdGVkIHRhZyBpbiB0aGUgY29tbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldElzR2VuZXJhdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZ2VuZXJhdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzVm9pZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhYnN0cmFjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmF0aXZlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5jaHJvbml6ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJ1Y3RvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhVmlzaWJpbGl0eSIgZVR5cGU9IiMvL0phdmFWaXNpYmlsaXR5S2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFQYXJhbWV0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFFeGNlcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvbWV0aG9kcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9CbG9jayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWVsZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VUeXBlZEVsZW1lbnQiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb250YWluaW5nSmF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhVmlzaWJpbGl0eSIgZVR5cGU9IiMvL0phdmFWaXNpYmlsaXR5S2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2llbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZvbGF0aWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvZmllbGRzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVyIiBlVHlwZT0iIy8vQmxvY2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHlwZUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlVOREVGSU5FRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0xBU1MiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTlRFUkZBQ0UiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJFWENFUFRJT04iIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJsb2NrIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmxvY2siIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CbG9jayIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Jsb2NrIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVBhY2thZ2UiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FUGFja2FnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzc2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2phdmFQYWNrYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSmF2YVZpc2liaWxpdHlLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQQUNLQUdFPTEmI3hEOyYjeEE7UFVCTElDPTImI3hEOyYjeEE7UFJJVkFURT0zJiN4RDsmI3hBO1BST1RFQ1RFRD00Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQVUJMSUMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBSSVZBVEUiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQUk9URUNURUQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQQUNLQUdFIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkphdmFQYXJhbWV0ZXJLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJTj0wJiN4RDsmI3hBO09VVD0xJiN4RDsmI3hBO0lOT1VUPTImI3hEOyYjeEE7UkVUVVJOPTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPVVQiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTk9VVCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFVFVSTiIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YURhdGFUeXBlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFycmF5VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0phdmFDbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlJiN4RDsmI3hBOyAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUmI3hEOyYjeEE7ICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMmI3hEOyYjeEE7ICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZSYjeEQ7JiN4QTsgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4mI3hEOyYjeEE7ICYjeEQ7JiN4QTsgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOiYjeEQ7JiN4QTsgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaW5hbENvbXBvbmVudFR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlIG5hbWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAmI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNQcmltaXRpdmVBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0Q29tcG9uZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgY29tcG9uZW50IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJoZWxwZXJDb21wb25lbnRUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFycmF5RGltZW5zaW9ucyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VDbGFzc2lmaWVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkpUeXBlSmF2YUhlbHBlcnMiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21tb24gaW50ZXJmYWNlIGJldHdlZW4gSmF2YUNsYXNzIGFuZCBKYXZhRGF0YVR5cGUgcGx1cyBzb21lIGNvbW1vbiBoZWxwZXIgbWV0aG9kcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSlR5cGVMaXN0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9ImphdmEudXRpbC5MaXN0IHR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUV2ZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJ1Y3R1cmFsRmVhdHVyZSIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0ZmQ2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtL21vZmphdmEiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iIiBtb2RlbE5hbWU9IkphdmEiIG1vZGVsUGx1Z2luQ2xhc3M9IiIgZWRpdFBsdWdpbkNsYXNzPSJqYXZhLnByb3ZpZGVyLkphdmFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJqYXZhLnByZXNlbnRhdGlvbi5KYXZhRWRpdG9yUGx1Z2luIiB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIgotICAgIGJvb2xlYW5GbGFnc0ZpZWxkPSJlRmxhZ3MiIGJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cz0iOCIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxqYXZhTW9kZWwubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V29ya3NwYWNlUm9vdDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkphdmFSZWYiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0iIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIKLSAgICAgIGVjb3JlUGFja2FnZT0iamF2YS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvVU5ERUZJTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9DTEFTUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvSU5URVJGQUNFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9FWENFUFRJT04iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BVQkxJQyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BSSVZBVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QUk9URUNURUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QQUNLQUdFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL09VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvSU5PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL1JFVFVSTiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJqYXZhLmVjb3JlIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iamF2YS5lY29yZSMvL0pUeXBlTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3Mva2luZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvcHVibGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFDbGFzcy9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ltcGxlbWVudHNJbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvY2xhc3NJbXBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9wYWNrYWdlSW1wb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ZpZWxkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL21ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbml0aWFsaXplcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9kZWNsYXJlZENsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9kZWNsYXJpbmdDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9qYXZhUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2V2ZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2FsbEV2ZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNOZXN0ZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGQvZmllbGROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZEV4dGVuZGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRFeHRlbmRlZC9maWVsZE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkTmFtZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZE5hbWVkL2ZpZWxkTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRzRXh0ZW5kZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZC9tZXRob2ROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEV4dGVuZGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRXh0ZW5kZWQvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFeHRlbmRlZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRPbmx5U3BlY2lmaWNNZXRob2RzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcy9hTWV0aG9kTmFtZVByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRPbmx5U3BlY2lmaWNNZXRob2RzL2V4Y2x1ZGVkTmFtZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZC9tZXRob2ROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZC9wYXJhbWV0ZXJUeXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzTmFtZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzTmFtZWQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0U3VwZXJ0eXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbXBsZW1lbnRzSW50ZXJmYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW1wbGVtZW50c0ludGVyZmFjZS9pbnRlcmZhY2VUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmZvU3RyaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmhlcml0c0Zyb20iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbmhlcml0c0Zyb20vamF2YUNsYXNzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pc0V4aXN0aW5nVHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3NldFN1cGVydHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3NldFN1cGVydHlwZS9qYXZhY2xhc3MiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0luaXRpYWxpemVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSW5pdGlhbGl6ZXIvaXNTdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL2phdmFDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL3NvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9wYXJhbWV0ZXJLaW5kIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvaXNBcnJheSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2lzUmV0dXJuIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZ2V0SmF2YVR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9nZXRRdWFsaWZpZWROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9NZXRob2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvYWJzdHJhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL25hdGl2ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2Qvc3luY2hyb25pemVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvY29uc3RydWN0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3N0YXRpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YVZpc2liaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9wYXJhbWV0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YUV4Y2VwdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2Qvc291cmNlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRDb250YWluaW5nSmF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRQYXJhbWV0ZXIiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRQYXJhbWV0ZXIvcGFyYW1ldGVyTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UmV0dXJuVHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0UmV0dXJuVHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldFJldHVyblR5cGUvdHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0U2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9pc0dlbmVyYXRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0SXNHZW5lcmF0ZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRJc0dlbmVyYXRlZC9nZW5lcmF0ZWQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2lzVm9pZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vRmllbGQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC9zdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvamF2YVZpc2liaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvdHJhbnNpZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL3ZvbGF0aWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9GaWVsZC9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0ZpZWxkL2luaXRpYWxpemVyIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0ZpZWxkL2dldENvbnRhaW5pbmdKYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vRmllbGQvaXNBcnJheSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vQmxvY2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9CbG9jay9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQmxvY2svbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vQmxvY2svY29udGVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0NvbW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vU3RhdGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFQYWNrYWdlL2phdmFDbGFzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhRGF0YVR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhRGF0YVR5cGUvZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9BcnJheVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9BcnJheVR5cGUvYXJyYXlEaW1lbnNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2NvbXBvbmVudFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2dldEZpbmFsQ29tcG9uZW50VHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9pc1ByaW1pdGl2ZUFycmF5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9zZXRDb21wb25lbnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvc2V0Q29tcG9uZW50VHlwZS9oZWxwZXJDb21wb25lbnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhRXZlbnQiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MWI1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzAzLzI1IDEzOjEyOjUyICQKLSMKLQotRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyAgICAgICA9IElXQVYwMDAyRSBGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMuIENoZWNrIGNsYXNzcGF0aC4KLUNvdWxkX05vdF9SZWZsZWN0X01ldGhvZHNfRVJST1JfICAgICAgPSBJV0FWMDAwM0UgQ291bGQgbm90IHJlZmxlY3QgbWV0aG9kcyBmb3IgezB9IGJlY2F1c2Ugb25lIG9mIHRoZSBtZXRob2RzIHJlZmVyZW5jZXMgYSB0eXBlIHRoYXQgY291bGQgbm90IGJlIGxvYWRlZC4gIEV4Y2VwdGlvbjogezF9IENoZWNrIGNsYXNzcGF0aC4KLUNvdWxkX05vdF9SZWZsZWN0X0NvbnN0cnVjdG9yc19FUlJPUl8gPSBJV0FWMDE0MkUgQ291bGQgbm90IHJlZmxlY3QgY29uc3RydWN0b3JzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiAgRXhjZXB0aW9uOiB7MX0gQ2hlY2sgY2xhc3NwYXRoLgotQ291bGRfTm90X1JlZmxlY3RfRmllbGRzX0VSUk9SXyAgICAgICA9IElXQVYwMTQzRSBDb3VsZCBub3QgcmVmbGVjdCBmaWVsZHMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgZmllbGRzIGlzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEV4Y2VwdGlvbjogezF9IENoZWNrIGNsYXNzcGF0aC4KLUVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8gICAgICAgICAgPSBJV0FWMDE0NEUgRXJyb3IgbG9va2luZyB1cCB0eXBlIHswfS4gIEV4Y2VwdGlvbjogezF9IENoZWNrIGNsYXNzcGF0aC4KLUVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfICAgICAgPSBJV0FWMDE0NUUgRXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0uICBFeGNlcHRpb246IHsxfQotRXJyb3JfU2V0dGluZ19HZW5GbGFnX0VSUk9SXyAgICAgICAgICA9IElXQVYwMTUzRSBFcnJvciBzZXR0aW5nIHRoZSBnZW5lcmF0ZWQgZmxhZyBvbiB7MH0uICBFeGNlcHRpb246IHsxfQotSmF2YV9JbmhfQ3ljbGVfRVJST1JfICAgICAgICAgICAgICAgICA9IElXQVYwMTU0RSBEZXRlY3RlZCBhbiBpbmhlcml0YW5jZSBjeWNsZSB3aGVuIHswfSB0cnlzIHRvIGV4dGVuZCB7MX0uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvY29yZS9KRU1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjZTZjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRWNsaXBzZUxvZ2dlcjsKLQotCi0vKioKLSAqIG9yZy5lY2xpcHNlLmplbSBwbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEpFTVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKRU1QbHVnaW4gUExVR0lOOwotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmplbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgSkVNUGx1Z2luKCkgewotCQlQTFVHSU4gPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEpFTVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBQTFVHSU47Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwkJCi0JfQotCQotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlICwgZXhjZXB0aW9uKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UgLCBleGNlcHRpb24pKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YUNsYXNzQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YUNsYXNzQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA2Njc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFDbGFzc0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMjcvMjAwMSAxOjE3OjQ2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhQ2xhc3NBZGFwdG9yIHsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgaXMgbnVsbCBvciBpZgotICogaXQgaXMgYSBiaW5hcnkgdHlwZS4KLSAqLwotYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0gKi8KLWJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIDsKLQotLyoqCi0gKiBSZWZsZWN0IHRoZSBmaWVsZHMKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCk7CQotCi0vKioKLSAqIFJlZmxlY3QgdGhlIG1ldGhvZHMuCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmxlY3Rpb24gb2NjdXJyZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1ib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFNZXRob2RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZGIwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotIAotCi0vKioKLSAqIFVzZWQgdG8gcmVmbGVjdCBtZXRob2RzCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YU1ldGhvZEFkYXB0ZXIgewotCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgZ2VuZXJhdGVkIGlmIG5lY2Vzc2FyeS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmxlY3Rpb24gb2NjdXJyZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCk7Ci0JCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmxlY3Rpb24gb2NjdXJyZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JbnRlcm5hbFJlYWRBZGFwdGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzQ3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JbnRlcm5hbFJlYWRBZGFwdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEludGVybmFsUmVhZEFkYXB0YWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIHsKLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nIG1ldGhvZAotICogaW1wbGVtZW50YXRpb25zOgotICogcHVibGljIE9iamVjdCBwcmltUmVmVmFsdWUoRU9iamVjdCBhKSB7Ci0gKglyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoYSk7Ci0gKiB9Ci0gKiBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3QgYSkgewotICoJcmV0dXJuIFJlZmxlY3Rpb25BZGFwdG9yLmdldFZhbHVlKHRoaXMsIGEpOwotICogfQotICovCi0vL3B1YmxpYyBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgYSk7Ci12b2lkIHNldFJlZmxlY3RlZChib29sZWFuIGFCb29sZWFuKTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTFhNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkFycmF5VHlwZUltcGw7Ci0KLS8qKgotICogQXJyYXkgdHlwZSByZWZsZWN0aW9uIGFkYXB0ZXIuIFNpbmNlIGFycmF5cyBhcmUgdmVyeSBjb25zdGFudCB3ZSBkb24ndCBuZWVkIGFueSBmYW5jeSByZWZsZWN0aW9uIHRvIHRoZSBzb3VyY2UgdHlwZSAoY2xhc3Mgb2JqZWN0KS4gSXQgcmVhbGx5Ci0gKiBkb2Vzbid0IGRvIGFueXRoaW5nLiBJdCBpcyBqdXN0IGhlcmUgc28gdGhhdCBpdCBleGlzdHMuIEV2ZXJ5dGhpbmcgaXMgY29uc3RhbnQgb3IgZGVwZW5kcyBvbiB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGltcGxlbWVudHMgSUphdmFDbGFzc0FkYXB0b3IgewotCi0JcHVibGljIEphdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNnZXRSZWZsZWN0aW9uU291cmNlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBUaGVyZSBpc24ndCBhbnkgZm9yIGFycmF5cy4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWZsZWN0aW9uU291cmNlKCkgewotCQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB2YWxpZCwgc28gd2UgcGFzcyBvbiB0byB1c2UgdGhlIGZpbmFsIGNvbXBvbmVudC4KLQkJQXJyYXlUeXBlIGpoID0gKEFycmF5VHlwZSkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFIZWxwZXJzIGZjID0gamguZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCXJldHVybiAoZmMuaXNQcmltaXRpdmUoKSB8fCAoKEphdmFDbGFzcykgZmMpLmlzRXhpc3RpbmdUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotCQlBcnJheVR5cGUgamggPSAoQXJyYXlUeXBlKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUhlbHBlcnMgZmMgPSBqaC5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJaWYoZmMuaXNQcmltaXRpdmUoKSkKLQkJICAgIHJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJICAgIEphdmFSZWZsZWN0aW9uQWRhcHRvciByZWZsZWN0aW9uQWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZmMsIFJlZmxlY3Rpb25BZGFwdG9yLlRZUEVfS0VZKTsKLQkJICAgIHJldHVybiAocmVmbGVjdGlvbkFkYXB0b3IgIT0gbnVsbCkgPyByZWZsZWN0aW9uQWRhcHRvci5oYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgOiBmYWxzZTsJCSAgICAKLQkJfSAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yI3JlZmxlY3RWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCUFycmF5VHlwZUltcGwgYXQgPSAoQXJyYXlUeXBlSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gQXJyYXlzIGFyZSBhbHdheXM6Ci0JCS8vCQlmaW5hbAotCQkvLwkJU3VwZXJ0eXBlIG9mIGphdmEubGFuZy5PYmplY3QKLQkJLy8JCWltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQkJYXQuc2V0RmluYWwodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlhdC5zZXRTdXBlcnR5cGUoKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJqYXZhLmxhbmcuT2JqZWN0IiwgKEVPYmplY3QpIGdldFRhcmdldCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQkJbGlzdC5hZGQoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIikpOyAvLyROT04tTkxTLTEkCi0JCWxpc3QuYWRkKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5pby5TZXJpYWxpemFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlBcnJheVR5cGVJbXBsIGF0ID0gKEFycmF5VHlwZUltcGwpIGdldFRhcmdldCgpOwotCQlhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI2lzU291cmNlVHlwZUZyb21CaW5hcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNyZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNyZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3NvdXJjZVR5cGVFeGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBoYXNSZWZsZWN0aW9uU291cmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxMzc2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLy8gTWFpbnRhaW4gYSBtYXBwaW5nIG9mIHRoZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgYWRhcHRvcnMgd2hpY2ggaGF2ZQotCS8vIHJlbGZlY3RlZCBmcm9tIHRoZW0uICBUaGlzIGFsbG93cyBhIGZsdXNoIG9wZXJhdGlvbiB0byBmb3JjZSB0aG9zZQotCS8vIGFkYXB0ZXJzIHRvIHJlLXJlZmxlY3QuCi0JcHJvdGVjdGVkIEhhc2hNYXAgcmVmbGVjdGVkID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBLZXkgZm9yIHRoZSB0eXBlIG9mIGFkYXB0ZXJzIHRoYXQgdGhpcyBmYWN0b3J5IGNyZWF0ZXMuIChVc2VkIGluIGlzRmFjdG9yeUZvclR5cGUoKSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVkgPSBSZWFkQWRhcHRvci5UWVBFX0tFWTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZ2lzdGVyUXVldWU7Ci0JcHJvdGVjdGVkIExpc3QgdW5yZWdpc3RlclF1ZXVlOwotLyoqCi0gKiBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0ZXIgPSBudWxsOwotCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQlKYXZhUmVmUGFja2FnZSBwYWNrID0gZ2V0SmF2YVJlZlBhY2thZ2UoKTsKLQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0SmF2YUNsYXNzKCkpCi0JCWFkYXB0ZXIgPSBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKHRhcmdldCk7Ci0JZWxzZQotCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0QXJyYXlUeXBlKCkpCi0JCQlhZGFwdGVyID0gY3JlYXRlQXJyYXlUeXBlQWRhcHRvcih0YXJnZXQpOwotCQllbHNlCi0JCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kKCkpCi0JCQkJYWRhcHRlciA9IGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKHRhcmdldCk7Ci0JCQllbHNlCi0JCQkJaWYgKG9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldEZpZWxkKCkpCi0JCQkJCWFkYXB0ZXIgPSBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKHRhcmdldCk7Ci0JcmV0dXJuIGFkYXB0ZXI7Ci19Ci0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVBcnJheVR5cGVBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyKHRhcmdldCk7Ci19Ci0KLXByb3RlY3RlZCBhYnN0cmFjdCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgOwotcHJvdGVjdGVkIGFic3RyYWN0IFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci1wcm90ZWN0ZWQgYWJzdHJhY3QgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JcmV0dXJuIGRpc0Fzc29jaWF0ZVNvdXJjZShzb3VyY2UsIHRydWUpOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGEgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KHNvdXJjZSk7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JaWYgKGEgIT0gbnVsbCkgewotCQlpZiAoZG9Ob3RpZnkpCi0JCQlhLnJlbGVhc2VTb3VyY2VUeXBlKCk7Ci0JCWVsc2UKLQkJCW5vdGlmaWNhdGlvbiA9IGEucmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotfQotcHVibGljIHZvaWQgZmx1c2hBbGwoKSB7fQotLy8gRmx1c2ggdGhlIGFkYXB0ZXIgZm9yIGEgc291cmNlIG9iamVjdAotcHVibGljIHZvaWQgZmx1c2hSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHt9Ci1wcm90ZWN0ZWQgSmF2YVJlZlBhY2thZ2UgZ2V0SmF2YVJlZlBhY2thZ2UoKSB7Ci0JcmV0dXJuIChKYXZhUmVmUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci19Ci1wdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSwgUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRlcikgewotCWlmIChpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQpIHsKLQkJaWYgKHJlZ2lzdGVyUXVldWUgPT0gbnVsbCkKLQkJCXJlZ2lzdGVyUXVldWUgPSBuZXcgSGFzaE1hcCgpOwotCQlyZWdpc3RlclF1ZXVlLnB1dChzb3VyY2UsIGFkYXB0ZXIpOwotCX0gZWxzZQotCQlyZWZsZWN0ZWQucHV0KHNvdXJjZSwgYWRhcHRlcik7Ci19Ci1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JaWYgKGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCkgewotCQlpZiAodW5yZWdpc3RlclF1ZXVlID09IG51bGwpCi0JCQl1bnJlZ2lzdGVyUXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXVucmVnaXN0ZXJRdWV1ZS5hZGQoc291cmNlKTsKLQl9IGVsc2UKLQkJcmVmbGVjdGVkLnJlbW92ZShzb3VyY2UpOwotfQotcHVibGljIHZvaWQgZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKFN0cmluZyBzb3VyY2UpIHsKLQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoc291cmNlLCB0cnVlKTsKLX0KLQotcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBkb05vdGlmeSkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGlubmVyTmFtZSA9IHNvdXJjZSArICckJzsKLQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVN0cmluZyBrZXk7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGtleS5lcXVhbHMoc291cmNlKSB8fCBrZXkuc3RhcnRzV2l0aChpbm5lck5hbWUpKSB7Ci0JCQkJYWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoa2V5KTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChkb05vdGlmeSkKLQkJCQkJCWFkYXB0b3IucmVsZWFzZVNvdXJjZVR5cGUoKTsKLQkJCQkJZWxzZQotCQkJCQkJbm90aWZpY2F0aW9uID0gYWRhcHRvci5yZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQl9Ci0JcmV0dXJuIG5vdGlmaWNhdGlvbjsKLX0KLQotcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKSB7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gZmFsc2U7Ci0JaWYgKHVucmVnaXN0ZXJRdWV1ZSAhPSBudWxsICYmICF1bnJlZ2lzdGVyUXVldWUuaXNFbXB0eSgpKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5yZWdpc3RlclF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZsZWN0ZWQucmVtb3ZlKHVucmVnaXN0ZXJRdWV1ZS5nZXQoaSkpOwotCQl9Ci0JCXVucmVnaXN0ZXJRdWV1ZS5jbGVhcigpOwotCX0KLQlpZiAocmVnaXN0ZXJRdWV1ZSAhPSBudWxsICYmICFyZWdpc3RlclF1ZXVlLmlzRW1wdHkoKSkgewotCQlJdGVyYXRvciBpdCA9IHJlZ2lzdGVyUXVldWUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJcmVmbGVjdGVkLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmVnaXN0ZXJRdWV1ZS5jbGVhcigpOwotCX0KLX0KLXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gVFlQRV9LRVkuZXF1YWxzKHR5cGUpOwotfQotfQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFmN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQkKLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgZXh0ZW5kcyBSZWZsZWN0aW9uQWRhcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENfTUVUSE9EX0RFRkFVTFRfQ1RPUiA9IFN0cmluZy52YWx1ZU9mKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKSArIFNfQ09OU1RSVUNUT1JfVE9LRU47Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9CUkFDS0VUID0gIlsiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlLiBUaGlzIGlzIHNlbnQgYWdhaW5zdCBhIEphdmFDbGFzcyAoYXMgdGhlIHRhcmdldCkgd2hlbmV2ZXIgZmx1c2ggb2YgdGhlIHJlZmxlY3Rpb24gb2NjdXJzLiBJdCB3aWxsIGJlCi0JICogc2VudCB1bmRlciB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgb2YgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRkxVU0hfUkVGTEVDVElPTl9FVkVOVCA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWNvcmVGYWN0b3J5KCkuY3JlYXRlRUF0dHJpYnV0ZSgpOwotCQotCS8qKgotCSAqIFNwZWNpYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUuIFRoaXMgaXMgc2VudCBhZ2FpbnN0IGEgSmF2YUNsYXNzIChhcyB0aGUgdGFyZ2V0KSB3aGVuZXZlciBmbHVzaCBvZiBhIG5ldyBjbGFzcyAoaS5lLiAKLQkgKiBubyBzb3VyY2Ugd2FzIGZvdW5kKSBvZiB0aGUgcmVmbGVjdGlvbiBvY2N1cnMuIEl0IHdpbGwgYmUKLQkgKiBzZW50IHVuZGVyIHRoZSBub3RpZmljYXRpb24gZXZlbnQgdHlwZSBvZiBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBGTFVTSF9ORVdfUkVGTEVDVElPTl9FVkVOVCA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWNvcmVGYWN0b3J5KCkuY3JlYXRlRUF0dHJpYnV0ZSgpOwotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBuYW1lLiBOb3QgcmVhbGx5IG5lZWRlZCBidXQgaXQgd291bGQgYmUgbmljZS4KLQkgKi8KLQlzdGF0aWMgewotCQlGTFVTSF9SRUZMRUNUSU9OX0VWRU5ULnNldE5hbWUoImZsdXNoUmVmbGVjdGVkVmFsdWVzIik7ICAgIC8vJE5PTi1OTFMtMSQKLQkJRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQuc2V0TmFtZSgiZmx1c2hOZXdSZWZsZWN0ZWRWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGbHVzaGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGbHVzaGluZyA9IGZhbHNlOwotLyoqCi0gKiBKYXZhUmVmbGVjdGlvbkFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFSZWZsZWN0aW9uQWRhcHRvcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBKYXZhUmVmbGVjdGlvbkFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSB0YXJnZXQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIKLSAqLwotcHVibGljIEphdmFSZWZsZWN0aW9uQWRhcHRvcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciB0YXJnZXQpIHsKLQlzdXBlcih0YXJnZXQpOwotfQotLyoqCi0gKiBjcmVhdGVCbG9jayAtIGluc3RhbnRpYXRlIGEgQmxvY2sgY29udGFpbmluZyB0aGUgcGFzc2VkIHNvdXJjZQotICovCi1wdWJsaWMgQmxvY2sgY3JlYXRlQmxvY2soU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2VTdHJpbmcpIHsKLQlCbG9jayBuZXdCbG9jayA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlQmxvY2soKTsKLQluZXdCbG9jay5zZXROYW1lKG5hbWUgKyAiXyIgKyAiYmxvY2siKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCW5ld0Jsb2NrLnNldFNvdXJjZShzb3VyY2VTdHJpbmcpOwotCXJldHVybiBuZXdCbG9jazsKLX0KLS8qKgotICogc2V0U3VwZXIgLSBzZXQgb3VyIHN1cGVydHlwZSBoZXJlLCBpbXBsZW1lbnRlZCBpbnRlcmZhY2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci19Ci0vKioKLSAqIGNyZWF0ZUphdmFQYXJhbWV0ZXIgLSBpbnN0YW50aWF0ZSBhIEphdmEgUGFyYW1ldGVyIGJhc2VkIG9uIHRoZSBwYXNzZWQgbmFtZSBhbmQgdHlwZSBuYW1lIChhIHNpbXBsZSBuYW1lLCBOT1QgQSBTSUdOQVRVUkUhISEpCi0gKiBUaGUgaWQgZm9yIGEgcGFyYW1ldGVyIGhhcyB0byBiZSBjb21wbGV4IGluIG9yZGVyIHRvIGJlIHBhcnNhYmxlIGludG8gY2xhc3MsIG1ldGhvZCwgYW5kIHBhcm0uCi0gKiBJdCBpcyBjcmVhdGVkIGJ5IGFwcGVuZGluZyB0aGUgcGFybSBuYW1lIHRvIHRoZSBtZXRob2QgaWQsIHdpdGggYSBrbm93biBzZXBhcmF0b3IuCi0gKiBJdCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgIkZvby5kb1NvbWV0aGluZyhqYXZhLmxhbmcuSW50ZWdlci1hcmcwIgotICovCi1wdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKE1ldGhvZCBwYXJlbnRNZXRob2QsIFN0cmluZyBwYXJtTmFtZSwgU3RyaW5nIHBhcm1UeXBlTmFtZSkgewotCUphdmFQYXJhbWV0ZXIgbmV3UGFybSA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCWlmIChwYXJtTmFtZSE9bnVsbCkKLQkgICBuZXdQYXJtLnNldE5hbWUocGFybU5hbWUpOwotLy8gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFybSkuZVNldElEKHBhcmVudE1ldGhvZC5lSUQoKSArIENfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiArIHBhcm1OYW1lKTsKLQlTdHJpbmcgY2xhc3NSZWZTdHJpbmcgPSBwYXJtVHlwZU5hbWU7Ci0JbmV3UGFybS5zZXRFVHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYoY2xhc3NSZWZTdHJpbmcpKTsKLQlyZXR1cm4gbmV3UGFybTsKLX0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIGRpbWVuc2lvbnMgZm9yIGEgdHlwZU5hbWUuCi0gKiBGb3IgZXhhbXBsZSAiZm9vW11bXSIgd291bGQgcmV0dXJuIGEgTGlzdCBvZiBJbnRlZ2VycwotICogMSwgMS4gIEF0IHNvbWUgcG9pbnQgd2UgbWF5IHdhbnQgdG8gYWN0dWFsbHkgY2FwdHVyZSB0aGUgc2l6ZQotICogZm9yIEZpZWxkcyBidXQgd2Ugd291bGQgbmVlZCB0aGUgaW5pdGlhbGl6ZXIgc291cmNlIHRvIGRldGVybWluZSB0aGF0LgotICovCi1wdWJsaWMgTGlzdCBnZXRBcnJheURpbWVuc2lvbnMoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JTGlzdCBkaW1lbnNpb25zID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQlpbnQgYmVnaW4gPSAwOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJd2hpbGUgKGJlZ2luIDwgdHlwZU5hbWUubGVuZ3RoKCkpIHsKLQkJCWluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZihMRUZUX0JSQUNLRVQsIGJlZ2luKTsKLQkJCWlmIChpbmRleCA+IC0xKSB7Ci0JCQkJZGltZW5zaW9ucy5hZGQobmV3IEludGVnZXIoMSkpOwotCQkJCWJlZ2luID0gaW5kZXggKyAxOwotCQkJfSBlbHNlIHsKLQkJCQliZWdpbiA9IHR5cGVOYW1lLmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBkaW1lbnNpb25zOwotfQotLyogR2V0IHRoZSBKYXZhIEZhY3RvcnkKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhRmFjdG9yeSgpIHsKLQlyZXR1cm4gKChvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZS5lTlNfVVJJKSkuZ2V0SmF2YVJlZkZhY3RvcnkoKTsKLX0KLXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotLyoqCi0gKiBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kVVVJRCAtIFB1bGwgdGhlIHBhcm0gdHlwZSBuYW1lcyBvdXQgb2YgYSBtZXRob2QgSUQKLSAqIAkJSXQgd2lsbCBiZSBpbiB0aGUgZm9ybTogInNpbXBsZWNsYXNzLm1ldGhvZE5hbWUoY29tLmZyb25rLlBhcm0xX3R5cGUscGFybTJ0eXBlIgotICovCi1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldFR5cGVOYW1lc0Zyb21NZXRob2RJRChTdHJpbmcgbWV0aG9kSUQpIHsKLQlpZiAobWV0aG9kSUQuY2hhckF0KG1ldGhvZElELmxlbmd0aCgpLTEpID09IENfTUVUSE9EX1BBUk1fREVMSU1JVEVSIHx8IG1ldGhvZElELmVuZHNXaXRoKENfTUVUSE9EX0RFRkFVTFRfQ1RPUikpCi0JCXJldHVybiBlbXB0eVN0cmluZ0FycmF5OwotCQkKLQkvLyBDb3VudCB0aGUgcGFybXMgZmlyc3QuICBUaGUgbnVtYmVyIG9mIHBhcm1zIGlzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgJywnICsgMQotCWludCBudW1QYXJtcyA9IDE7Ci0JaW50IHBvcyA9IC0xOwotCS8vIFNraXAgdGhlICcuJyBhZnRlciBjbGFzc25hbWUKLQlwb3MgPSBtZXRob2RJRC5pbmRleE9mKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiwgKytwb3MpOwotCS8vIExvb2sgZm9yIHRoZSBzdGFydCBvZiB0aGUgcGFybXMKLQlpbnQgcGFybVBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIsICsrcG9zKTsKLQlwb3MgPSBwYXJtUG9zOwotCXdoaWxlICgocG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX1BBUk1fUEFSTV9ERUxJTUlURVIsICsrcG9zKSkgIT0gLTEpCi0JCW51bVBhcm1zKys7Ci0JU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbbnVtUGFybXNdOwotCS8vIG5vdyBjb2xsZWN0IHRoZSBwYXJtIG5hbWVzCi0JLy8gc2tpcCB0aGUgbWV0aG9kIG5hbWUKLQlwb3MgPSBwYXJtUG9zOwotCWludCBpID0gMCwgZW5kOwotCWRvIHsKLQkJZW5kID0gbWV0aG9kSUQuaW5kZXhPZihDX1BBUk1fUEFSTV9ERUxJTUlURVIsIHBvcyArIDEpOwotCQkvLyBUaGlzIGlzIHRoZSBsYXN0IHBhcmFtZXRlciwgd2UgbWF5IG5lZWQgdG8gc3RyaXAgYSB0cmFpbGluZyAmViBmb3IgYSBjb25zdHJ1Y3RvcgotCQlpZiAoZW5kID09IC0xKQotCQkJZW5kID0gbWV0aG9kSUQuaW5kZXhPZihTX0NPTlNUUlVDVE9SX1RPS0VOLCBwb3MgKyAxKTsKLQkJLy8gb3RoZXJ3aXNlIHRha2UgdGhlIHJlc3Qgb2YgdGhlIElECi0JCWlmIChlbmQgPT0gLTEpCi0JCQllbmQgPSBtZXRob2RJRC5sZW5ndGgoKTsKLQkJcGFybVR5cGVOYW1lc1tpKytdID0gbWV0aG9kSUQuc3Vic3RyaW5nKHBvcyArIDEsIGVuZCk7Ci0JfSB3aGlsZSAoKHBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19QQVJNX1BBUk1fREVMSU1JVEVSLCArK3BvcykpICE9IC0xKTsKLQlyZXR1cm4gcGFybVR5cGVOYW1lczsKLX0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQotcHVibGljIGJvb2xlYW4gaGFzUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICByZXR1cm4gZ2V0UmVmbGVjdGlvblNvdXJjZSgpICE9IG51bGw7Ci19Ci0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gKgotICovCi1wdWJsaWMgdm9pZCByZWxlYXNlU291cmNlVHlwZSgpewotfQotCi0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotICogQHJldHVybgotICovCi1wdWJsaWMgTm90aWZpY2F0aW9uIHJlbGVhc2VTb3VyY2VUeXBlTm9Ob3RpZmljYXRpb24oKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlU291cmNlVHlwZShKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQlyZXR1cm47Ci0KLQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgZXhpc3RpbmcgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JaWYgKGV4aXN0aW5nICE9IG51bGwpCi0JCWV4aXN0aW5nLnJlbGVhc2VTb3VyY2VUeXBlKCk7Ci19Ci0vKgotICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGEgRmllbGQgQWRhcHRvciB0byBzZXQgdGhlIHR5cGUgb2YgYUZpZWxkCi0gKiB0byBiZSBhVHlwZU5hbWUuICBhVHlwZU5hbWUgbWF5IGNvbnRhaW4gYXJyYXkgYnJhY2tldHMgd2hpY2ggbmVlZAotICogdG8gYmUgZGV0ZWN0ZWQgaW4gb3JkZXIgdG8gc2V0IHRoZSBhcnJheSBkaW1lbnNpb25zIG9uIGFGaWVsZC4KLSAqLwotcHJvdGVjdGVkIHZvaWQgc2V0RmllbGRUeXBlKEZpZWxkIGFGaWVsZCwgU3RyaW5nIGFUeXBlTmFtZSkgewotCWlmIChhRmllbGQgIT0gbnVsbCAmJiBhVHlwZU5hbWUgIT0gbnVsbCkgewotCQlTdHJpbmcgY2xhc3NSZWZTdHJpbmcgPSBhVHlwZU5hbWU7Ci0JCWFGaWVsZC5zZXRFVHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYoY2xhc3NSZWZTdHJpbmcpKTsKLQl9Ci19Ci1wdWJsaWMgZmluYWwgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCkgewotCXJldHVybiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGZhbHNlKTsKLX0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JTm90aWZpY2F0aW9uIG5vdCA9IGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihjbGVhckNhY2hlZE1vZGVsT2JqZWN0KTsKLQlpZiAobm90ICE9IG51bGwpCi0JCWdldFRhcmdldCgpLmVOb3RpZnkobm90KTsKLQlyZXR1cm4gaGFzRmx1c2hlZDsKLX0KLQotcHVibGljIHN5bmNocm9uaXplZCBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCWlmICghaGFzRmx1c2hlZCAmJiAhaXNGbHVzaGluZykgewotCQlib29sZWFuIGlzRXhpc3RpbmcgPSBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCk7Ci0JCXRyeSB7Ci0JCQlpc0ZsdXNoaW5nID0gdHJ1ZTsKLQkJCWhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCQkJaGFzRmx1c2hlZCA9IGZsdXNoUmVmbGVjdGVkVmFsdWVzKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJaGFzRmx1c2hlZCA9IGZhbHNlOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikKLQkJCQl0aHJvdyAoRXJyb3IpIGU7Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaXNGbHVzaGluZyA9IGZhbHNlOwotCQkJcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUZsdXNoTm90aWZpY2F0aW9uKGlzRXhpc3RpbmcpOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBAcGFyYW0gaXNFeGlzdGluZwotICogQHJldHVybgotICovCi1wcm90ZWN0ZWQgTm90aWZpY2F0aW9uIGNyZWF0ZUZsdXNoTm90aWZpY2F0aW9uKGJvb2xlYW4gaXNFeGlzdGluZykgewotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXNFeGlzdGluZyA/IEZMVVNIX1JFRkxFQ1RJT05fRVZFTlQgOiBGTFVTSF9ORVdfUkVGTEVDVElPTl9FVkVOVDsKLQlyZXR1cm4gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpZ2V0VGFyZ2V0KCksRVZFTlQsIGZlYXR1cmUsIG51bGwsIG51bGwpOwotfQotcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci19Ci0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhcmluZyBvZiB0aGUgdmFsdWVzLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcmVmbGVjdGlvbiBoYWQgb2NjdXJyZWQuCi0gKi8KLXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpIHsKLQlpZiAoaXNGbHVzaGluZykKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiBzdXBlci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLX0KLQotLyoqCi0gKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0Ci0gKi8KLXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JaGFzRmx1c2hlZCA9IGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzQ4MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuQ2hhcmFjdGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsLlN0cmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIFRoaXMga2V5IGhhbmRsZXMgSmF2YSBSZWZsZWN0aW9uLiBJdCBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIGVudHJpZXMgaWYKLSAqIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSByZXNvdXJjZS4gVGhlcmUgaXMgYW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3Igb3RoZXIKLSAqIHR5cGVzIG9mIGlkcyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBieSB0aGlzIGtleS4gVGhleSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZQotICogSmF2YVhNSUZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGVzZSBrZXlzLCBhbmQgdGhlIGZhY3Rvcnkgd2lsbCBwYXNzIGluCi0gKiBhIExpc3Qgb2YgdGhlc2UgcmVnaXN0ZXJlZCBleHRlbnNpb24gcHJvY2Vzc2VycyAoSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKS4KLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA4OjI0OjM2IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZmxlY3Rpb25LZXkgaW1wbGVtZW50cyBJSmF2YVJlZmxlY3Rpb25LZXkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUFJJTUlUSVZFUyA9IG5ldyBBcnJheUxpc3QoOCk7Ci0KLQlzdGF0aWMgeyBpbml0aWFsaXplUHJpbWl0aXZlc0NvbGxlY3Rpb24oKTsgfQotCQotCXByb3RlY3RlZCBKYXZhWE1JRmFjdG9yeUltcGwuSmF2YVhNSVJlc291cmNlIHJlc291cmNlOyAvL0ZCCi0JcHJvdGVjdGVkIExpc3QgZXh0ZW5zaW9uczsKLQotcHVibGljIEphdmFSZWZsZWN0aW9uS2V5KExpc3QgZXh0ZW5zaW9ucywgSmF2YVhNSUZhY3RvcnlJbXBsLkphdmFYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci19Ci0vL0ZCIEVORAotCi0vKiAKLSAqIENyZWF0ZSBhbiBBcnJheVR5cGUgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlQXJyYXlUeXBlKCkKLSAqLwotcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlQXJyYXlUeXBlKCk7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIEphdmFDbGFzcyBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhQ2xhc3MoKQotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhQ2xhc3MoKTsKLX0KLS8qKgotICogQ3JlYXRlIGEgZGF0YSB0eXBlIGFuZCBwdXQgaXQgaW4gdGhlIHByaW1pdGl2ZXMgcmVzb3VyY2UKLSAqLwotcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldEphdmFEYXRhVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlKYXZhRGF0YVR5cGUgcmVzdWx0ID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQlyZXN1bHQuc2V0TmFtZSh0eXBlTmFtZSk7Ci0JLy8gKChJbnRlcm5hbEVPYmplY3QpcmVzdWx0KS5lU2V0SUQodHlwZU5hbWUpOwotCS8vcmVzdWx0LmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkvL3Jlc3VsdC5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQocmVzdWx0KTsKLQlyZXNvdXJjZS5zZXRJRChyZXN1bHQsIHR5cGVOYW1lKTsJCi0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIAotICogQ3JlYXRlIGEgRmllbGQgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YUZpZWxkKCkKLSAqLwotcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZCgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotfQotLyogCi0gKiBDcmVhdGUgYSBNZXRob2QgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YU1ldGhvZCgpCi0gKi8KLXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZCgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLX0KLS8qIAotICogQ3JlYXRlIGEgSmF2YVBhcmFtZXRlciBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhUGFyYW1ldGVyKCkKLSAqLwotcHVibGljIEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci19Ci0vL0ZCLyoqCi0vL0ZCICogT3ZlcnJpZGUgdG8gdHJ5IHRvIGludHJvc3BlY3Qgb2JqZWN0cwotLy9GQiAqIHRoYXQgYXJlbid0IGZvdW5kIHVzaW5nIHRoZSBkZWZhdWx0IG1lY2hhbmlzbS4KLS8vRkIgKi8KLS8vRkJwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0vL0ZCIAlPYmplY3QgamF2YU9iamVjdCA9IHN1cGVyLmdldChrZXkpOwotLy9GQiAJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkgewotLy9GQiAJCWphdmFPYmplY3QgPSBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucygoU3RyaW5nKSBrZXkpOwotLy9GQiAJCWlmIChqYXZhT2JqZWN0ID09IG51bGwpCi0vL0ZCIAkJCWphdmFPYmplY3QgPSBnZXRKYXZhT2JqZWN0KChTdHJpbmcpIGtleSk7Ci0vL0ZCIAl9Ci0vL0ZCCXJldHVybiBqYXZhT2JqZWN0OwotLy9GQn0KLQotLy9GQiBBRERFRAotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXkpIHsKLQlPYmplY3QgamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKGtleSk7Ci0JaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLQkJamF2YU9iamVjdCA9IGdldEphdmFPYmplY3Qoa2V5KTsKLQlyZXR1cm4gamF2YU9iamVjdDsKLX0KLS8vRkIgRU5ECi0KLS8qCi0gKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0gKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEFycmF5VHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0QXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCUFycmF5VHlwZSBhcnJheVR5cGUgPSB0aGlzLmNyZWF0ZUFycmF5VHlwZSgpOwotCWFycmF5VHlwZS5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClhcnJheVR5cGUpLmVTZXRJRCh0eXBlTmFtZSk7Ci0JLy9hcnJheVR5cGUuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCWludCBwb3MgPSAtMSwgYnJhY2VzID0gMDsKLQlkbyB7Ci0JCXBvcyA9IHR5cGVOYW1lLmluZGV4T2YoIlsiLCBwb3MrMSk7Ly8kTk9OLU5MUy0xJAotCQlpZiAocG9zICE9IC0xKQotCQkJYnJhY2VzKys7Ci0JfSB3aGlsZSAocG9zICE9IC0xKTsKLQlhcnJheVR5cGUuc2V0QXJyYXlEaW1lbnNpb25zKGJyYWNlcyk7Ci0JLy9hcnJheVR5cGUuc2V0RVBhY2thZ2UoZ2V0UGFja2FnZSgpKTsKLQlnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKGFycmF5VHlwZSk7Ci0JcmVzb3VyY2Uuc2V0SUQoYXJyYXlUeXBlLCB0eXBlTmFtZSk7CQotCXJldHVybiBhcnJheVR5cGU7Ci19Ci0vKgotICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0ZWggY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVDbGFzc2lmaWVyIGdldEphdmFDbGFzcyhTdHJpbmcgdHlwZU5hbWUpIHsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gdGhpcy5jcmVhdGVKYXZhQ2xhc3MoKTsKLQlqYXZhQ2xhc3Muc2V0TmFtZSh0eXBlTmFtZSk7Ci0JLy8gKChJbnRlcm5hbEVPYmplY3QpamF2YUNsYXNzKS5lU2V0SUQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JLy9qYXZhQ2xhc3MuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCS8vIGphdmFDbGFzcy5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQoamF2YUNsYXNzKTsKLQlyZXNvdXJjZS5zZXRJRChqYXZhQ2xhc3MsIHR5cGVOYW1lKTsKLQlyZXR1cm4gamF2YUNsYXNzOwotfQotLyogR2V0IHRoZSBKYXZhIEZhY3RvcnkKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhRmFjdG9yeSgpIHsKLQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFOwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIGRpcmVjdCByZXRyaWV2YWwgb2YgZmllbGRzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIGZpZWxkOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvbwotICogCi0gKi8KLXByb3RlY3RlZCBGaWVsZCBnZXRKYXZhRmllbGQoU3RyaW5nIGtleVZhbHVlKSB7Ci0JRmllbGQgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgY2xhc3NOYW1lLCBtZW1iZXJOYW1lOwotCWludCBtZW1iZXJEZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JY2xhc3NOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKDAsIG1lbWJlckRlbGltaXRlcik7Ci0JbWVtYmVyTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhtZW1iZXJEZWxpbWl0ZXIgKyAxKTsKLQlFQ2xhc3NpZmllciBqYXZhQ2xhc3MgPSAoRUNsYXNzaWZpZXIpIHByaW1HZXQoY2xhc3NOYW1lKTsKLQkvLyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgaW5zdGFudGlhdGVkIHRoZSBjb250YWluaW5nIGNsYXNzLCB0aGVuIGdvIGRvIGl0LgotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJamF2YUNsYXNzID0gZ2V0SmF2YVR5cGUoY2xhc3NOYW1lKTsKLQlpZiAoKGphdmFDbGFzcyAhPSBudWxsKSAmJiAhKChKYXZhSGVscGVycykgamF2YUNsYXNzKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCS8vIFdlIGhhdmUgYSBjbGFzcy4gTm93IHdlIG5lZWQgdG8gZm9yY2UgcmVmbGVjdGlvbiwgdGhpcyB3aWxsIGNhdXNlCi0JCS8vIHRoZSBKYXZhUmVmbGVjdGlvbktleSB0byBiZSB1cGRhdGVkIGFuZCBoYXZlIHRoZSBtZW1iZXIgYWRkZWQgdG8gdGhlCi0JCS8vIGxpc3QuCi0JCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldEZpZWxkcygpOwotCQkvL0ZCIHJlc3VsdCA9IChGaWVsZCkgc3VwZXIuZ2V0KGtleVZhbHVlKTsgLy8gSXQgc2hvdWxkIG5vdyBiZSByZWdpc3RlcmVkLgotCQlyZXN1bHQgPSAoRmllbGQpIHByaW1HZXQoa2V5VmFsdWUpOyAvLyBJdCBzaG91bGQgbm93IGJlIHJlZ2lzdGVyZWQuCi0JCQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUZpZWxkIHRlbXBGaWVsZCA9IGNyZWF0ZUphdmFGaWVsZCgpOwotCQkJdGVtcEZpZWxkLnNldE5hbWUobWVtYmVyTmFtZSk7Ci0JCQkvLyAoKEludGVybmFsRU9iamVjdCl0ZW1wRmllbGQpLmVTZXRJRChrZXlWYWx1ZSk7Ci0JCQkvL3RlbXBGaWVsZC5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRGaWVsZHMoKS5hZGQodGVtcEZpZWxkKTsKLQkJCXJlc3VsdCA9IHRlbXBGaWVsZDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBtZXRob2RzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIG1ldGhvZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oCi0gKiAKLSAqLwotcHJvdGVjdGVkIE1ldGhvZCBnZXRKYXZhTWV0aG9kKFN0cmluZyBrZXlWYWx1ZSkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCVN0cmluZyBjbGFzc05hbWUsIG1lbWJlck5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQljbGFzc05hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoMCwgbWVtYmVyRGVsaW1pdGVyKTsKLQlpbnQgcGFybURlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIsIG1lbWJlckRlbGltaXRlcik7Ci0JbWVtYmVyTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhtZW1iZXJEZWxpbWl0ZXIgKyAxLCBwYXJtRGVsaW1pdGVyKTsKLQlFQ2xhc3NpZmllciBqYXZhQ2xhc3MgPSAoRUNsYXNzaWZpZXIpIHByaW1HZXQoY2xhc3NOYW1lKTsKLQkvLyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgaW5zdGFudGlhdGVkIHRoZSBjb250YWluaW5nIGNsYXNzLCB0aGVuIGdvIGRvIGl0LgotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJamF2YUNsYXNzID0gZ2V0SmF2YVR5cGUoY2xhc3NOYW1lKTsKLQlpZiAoKGphdmFDbGFzcyAhPSBudWxsKSAmJiAhKChKYXZhSGVscGVycykgamF2YUNsYXNzKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCS8vIFdlIGhhdmUgYSBjbGFzcy4gTm93IHdlIG5lZWQgdG8gZm9yY2UgcmVmbGVjdGlvbiwgdGhpcyB3aWxsIGNhdXNlCi0JCS8vIHRoZSBKYXZhUmVmbGVjdGlvbktleSB0byBiZSB1cGRhdGVkIGFuZCBoYXZlIHRoZSBtZW1iZXIgYWRkZWQgdG8gdGhlCi0JCS8vIGxpc3QuCi0JCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldE1ldGhvZHMoKTsKLQkJcmVzdWx0ID0gKE1ldGhvZCkgcHJpbUdldChrZXlWYWx1ZSk7IC8vIEl0IHNob3VsZCBub3cgYmUgcmVnaXN0ZXJlZC4KLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRlbXBNZXRob2QgPSBjcmVhdGVKYXZhTWV0aG9kKCk7Ci0JCQl0ZW1wTWV0aG9kLnNldE5hbWUobWVtYmVyTmFtZSk7Ci0JCQlyZXNvdXJjZS5zZXRJRCh0ZW1wTWV0aG9kLCBrZXlWYWx1ZSk7Ci0JCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRNZXRob2RzKCkuYWRkKHRlbXBNZXRob2QpOwotCQkJcmVzdWx0ID0gdGVtcE1ldGhvZDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0SmF2YU9iamVjdChqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRU9iamVjdCBnZXRKYXZhT2JqZWN0KFN0cmluZyBrZXlWYWx1ZSkgewotCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQlpbnQgaW5kZXggPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JaWYgKGluZGV4ID4gMCkgewotCQkvLyBUaGUgcmVmZXJlbmNlIGlzIHRvIGEgbWVtYmVyOiBmaWVsZCwgbWV0aG9kLCBvciBwYXJhbWV0ZXIuCi0JCS8vIFRha2UgdGhlIG1vc3Qgc3BlY2lmaWMgY2FzZSBmaXJzdCwgYSBwYXJhbWV0ZXIuCi0JCS8vIE9ubHkgYSBwYXJhbWV0ZXIgc2hvdWxkIGNvbnRhaW4gdGhlIG1ldGhvZElEIHRvIHBhcm1JRCBkZWxpbWl0ZXIuCi0JCWJvb2xlYW4gaXNQYXJhbWV0ZXIgPSAoa2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIsIGluZGV4KSAhPSAtMSk7Ci0JCWlmIChpc1BhcmFtZXRlcikgewotCQkJcmVzdWx0ID0gZ2V0SmF2YVBhcmFtZXRlcihrZXlWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgdGFyZ2V0IGlzIGEgZmllbGQgb3IgbWV0aG9kLiBJZiBpdCBoYXMgYSAiKCIsIHRoZW4gaXQgaXMgYSBtZXRob2QuCi0JCQkvLyBJZiBpdCBpcyBub3QgZm91bmQsIHRoZW4gd2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2JqZWN0LgotCQkJaW50IHBhcm1TdGFydCA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIsIGluZGV4KTsKLQkJCWJvb2xlYW4gaXNGaWVsZCA9IHBhcm1TdGFydCA9PSAtMTsKLQkJCWlmIChpc0ZpZWxkKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SmF2YUZpZWxkKGtleVZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SmF2YU1ldGhvZChrZXlWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlyZXN1bHQgPSBnZXRKYXZhVHlwZShrZXlWYWx1ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogU2VlIGlmIHRoZSBleHRlbnNpb25zIGNhbiByZXNvbHZlIHRoaXMgZmlyc3QuCi0gKi8KLXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoU3RyaW5nIGtleVZhbHVlKSB7Ci0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24pIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IG9iaiA9IGV4dGVuc2lvbi5nZXRPYmplY3Qoa2V5VmFsdWUsIHRoaXMpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiBvYmo7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogVGhpcyBhbGxvd3MgZm9yIHRoZSByZXRyaWV2YWwgb2YgcGFyYW1ldGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0gKiBwYXJhbWV0ZXI6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKC1hcmcwCi0gKiAKLSAqLwotcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXIgZ2V0SmF2YVBhcmFtZXRlcihTdHJpbmcga2V5VmFsdWUpIHsKLQlKYXZhUGFyYW1ldGVyIHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIHBhcm1OYW1lOwotCWludCBtZW1iZXJEZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JaW50IHBhcm1EZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiwgbWVtYmVyRGVsaW1pdGVyKTsKLQlwYXJtTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhwYXJtRGVsaW1pdGVyICsgMSk7Ci0JLy8gZ2V0TWV0aG9kKCkgd2lsbCBmaW5kIG9yIGNyZWF0ZSBhIG1ldGhvZAotCU1ldGhvZCBtZXRob2QgPSB0aGlzLmdldEphdmFNZXRob2Qoa2V5VmFsdWUuc3Vic3RyaW5nKHBhcm1EZWxpbWl0ZXIpKTsKLQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJcmVzdWx0ID0gbWV0aG9kLmdldFBhcmFtZXRlcihwYXJtTmFtZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJSmF2YVBhcmFtZXRlciB0ZW1wUGFyYW1ldGVyID0gY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCQkJdGVtcFBhcmFtZXRlci5zZXROYW1lKHBhcm1OYW1lKTsKLQkJCS8vICgoSW50ZXJuYWxFT2JqZWN0KXRlbXBQYXJhbWV0ZXIpLmVTZXRJRChrZXlWYWx1ZSk7Ci0JCQkvLyB0ZW1wUGFyYW1ldGVyLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkJCW1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHRlbXBQYXJhbWV0ZXIpOwotCQkJcmVzdWx0ID0gdGVtcFBhcmFtZXRlcjsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0SmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVDbGFzc2lmaWVyIGdldEphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCWlmIChpc1ByaW1pdGl2ZSh0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRKYXZhRGF0YVR5cGUodHlwZU5hbWUpOwotCWVsc2UgaWYgKGlzQXJyYXkodHlwZU5hbWUpKQotCQlyZXR1cm4gZ2V0QXJyYXlUeXBlKHR5cGVOYW1lKTsKLQllbHNlIGlmIChpc1ZhbGlkSmF2YUlkZW50aWZpZXIodHlwZU5hbWUpKQotCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKHR5cGVOYW1lKTsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyB0eXBlTmFtZSkgewotCWlmICh0eXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJU3RyaW5nSXRlcmF0b3IgY2hhckl0ZXIgPSBuZXcgU3RyaW5nSXRlcmF0b3IodHlwZU5hbWUpOwotCQlpZiAoQ2hhcmFjdGVyVXRpbC5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhckl0ZXIubmV4dCgpKSkgewotCQkJLy8gU3RhcnRzIHdpdGggYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgY2hhcmFjdGVyLgotCQkJLy8gTm93IHNlZSBpZiB0aGUgcmVzdCBhcmUgdmFsaWQuCi0JCQl3aGlsZSAoY2hhckl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXJVdGlsLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXJJdGVyLm5leHQoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gTm90IHZhbGlkCi0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I3ByaW1HZXQoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIE9iamVjdCBwcmltR2V0KFN0cmluZyBrZXkpIHsKLQlyZXR1cm4gcmVzb3VyY2UucHJpbUdldEVPYmplY3Qoa2V5KTsKLX0KLXByb3RlY3RlZCBFUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCS8vRkIgcmV0dXJuIChFUGFja2FnZSkgc3VwZXIuZ2V0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOwotCS8vIHJldHVybiAoRVBhY2thZ2UpIHJlc291cmNlLmdldEVPYmplY3QoSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7IC8vRkIKLQkvL3JldHVybiAoRVBhY2thZ2UpIHJlc291cmNlLmdldEVPYmplY3QoSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7IC8vRkIKLQlyZXR1cm4gKEVQYWNrYWdlKUVjb3JlVXRpbC5nZXRPYmplY3RCeVR5cGUocmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFUGFja2FnZSgpKTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA5OjU2OjUzIEFNKQotICovCi1wcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmltaXRpdmVzQ29sbGVjdGlvbigpIHsKLQlQUklNSVRJVkVTLmFkZChOX1ZPSUQpOwotCVBSSU1JVElWRVMuYWRkKE5fQk9PTEVBTik7Ci0JUFJJTUlUSVZFUy5hZGQoTl9CWVRFKTsKLQlQUklNSVRJVkVTLmFkZChOX0NIQVIpOwotCVBSSU1JVElWRVMuYWRkKE5fRE9VQkxFKTsKLQlQUklNSVRJVkVTLmFkZChOX0ZMT0FUKTsKLQlQUklNSVRJVkVTLmFkZChOX0lOVCk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9MT05HKTsKLQlQUklNSVRJVkVTLmFkZChOX1NIT1JUKTsKLX0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2lzQXJyYXkoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIGJvb2xlYW4gaXNBcnJheShTdHJpbmcgdHlwZU5hbWUpIHsKLQlyZXR1cm4gdHlwZU5hbWUuZW5kc1dpdGgoIltdIik7Ly8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDk6NTQ6MjMgQU0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSB0eXBlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBpc1ByaW1pdGl2ZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlyZXR1cm4gUFJJTUlUSVZFUy5jb250YWlucyh0eXBlTmFtZSk7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDZlOWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBSZXNvdXJjZSBmb3IgdGhlIEphdmEgcHJvdG9jb2wuCi0gKiAKLSAqIEl0IGFsbG93cyBleHRlbnNpb25zIHRvIHRoZSByZWZsZWN0aW9uIGtleSB0byBiZSByZWdpc3RlcmVkIHdpdGggaXQuCi0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgODoyMjoyMyBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUlGYWN0b3J5SW1wbCBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKYXZhWE1JRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9TRVBFUkFUT1IgPSAiOi8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIExpc3QgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIEphdmFYTUlGYWN0b3J5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhWE1JRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbnMucmVtb3ZlKGV4dGVuc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSmF2YVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgeG1pdXJpLCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBjaGFuZ2VkIHRvIGFsbG93IGEgemVyby1sZW5ndGggcGFja2FnZSBuYW1lIAotCQkvLyBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiamF2YTovI2ludCIsIGV0Yy4KLQkJSmF2YVJlZkZhY3RvcnkgamZhYyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRTsKLQkJSmF2YVBhY2thZ2UgcGFjayA9IGpmYWMuY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJLy8gTmVlZCB0byBjcmVhdGUgYW5kIGFkZCBzcGVjaWFsIEphdmFGYWN0b3J5IGZvciBpbnN0YW50aWF0aW9uIHRvIHdvcmsuCi0JCUphdmFGYWN0b3J5SW1wbCBmYWN0ID0gbmV3IEphdmFGYWN0b3J5SW1wbCgpOwotCQlwYWNrLnNldEVGYWN0b3J5SW5zdGFuY2UoZmFjdCk7Ci0JCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFN0YW5kYXJkIEphdmEgcGFja2FnZQotCQkJcGFjay5zZXROc1ByZWZpeChwYWNrYWdlTmFtZSk7Ci0JCQlwYWNrLnNldE5hbWUocGFja2FnZU5hbWUpOwotCQl9IGVsc2UgewotCQkJLy8gUHJpbWl0aXZlIHBhY2thZ2UKLQkJCXBhY2suc2V0TnNQcmVmaXgoSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSk7Ci0JCQlwYWNrLnNldE5hbWUoSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSk7Ci0JCX0KLQotCQlwYWNrLnNldE5zVVJJKHhtaXVyaSk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHBhY2spOwotCQkoKFhNSVJlc291cmNlKSBwYWNrLmVSZXNvdXJjZSgpKS5zZXRJRChwYWNrLCBKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBKYXZhWE1JUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCQlwcm90ZWN0ZWQgSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXk7Ci0KLQkJcHVibGljIEphdmFYTUlSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQlzdXBlcih1cmkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UmVmbGVjdGlvbktleShJSmF2YVJlZmxlY3Rpb25LZXkga2V5KSB7Ci0JCQlyZWZsZWN0aW9uS2V5ID0ga2V5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJc3VwZXIubG9hZChvcHRpb25zKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCQlFT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmdldEVPYmplY3QodXJpRnJhZ21lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlZmxlY3Rpb25LZXkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChFT2JqZWN0KSByZWZsZWN0aW9uS2V5LmdldCh1cmlGcmFnbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQkvKioKLQkJICogVXNlZCBieSBKYXZhUmVmbGVjdGlvbktleSB0byBsb29rIGRpcmVjdGx5IGludG8gSUQgdGFibGUgdG8gYnlwYXNzIGFuIGluZmluaXRlIGxvb3AuIEl0IHdpbGwgCi0JCSAqIGNhbGwgaGVyZSBiZWNhdXNlIGl0IG1heSBub3Qgb2YgZmlyc3QgYmVlbiBmb3VuZCwgYnV0IHRoZW4gYWRkZWQsIHNvIG5vdyBpcyBmb3VuZC4KLQkJICogCi0JCSAqIEBwYXJhbSB1cmlGcmFnbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCUVPYmplY3QgcHJpbUdldEVPYmplY3QoU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3VzZUlEQXR0cmlidXRlcygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VJREF0dHJpYnV0ZXMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCUphdmFYTUlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXZhWE1JUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2Uuc2V0UmVmbGVjdGlvbktleShuZXcgSmF2YVJlZmxlY3Rpb25LZXkoZXh0ZW5zaW9ucywgcmVzb3VyY2UpKTsKLQotCQlTdHJpbmcgdXJpU3RyaW5nID0gdXJpLnRvU3RyaW5nKCk7Ci0JCWNyZWF0ZUphdmFQYWNrYWdlKHN0cmlwU2NoZW1lKHVyaVN0cmluZyksIHVyaVN0cmluZywgcmVzb3VyY2UpOwotCi0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoSmF2YVhNSUZhY3RvcnkuU0NIRU1FLCBKYXZhWE1JRmFjdG9yeS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgdGhlIHRyYWlsaW5nIGlkZW50aWZpZXIsIGlmIGFueSwgZnJvbSB0aGUgdXJpLiAgQW4gaWRlbnRpZmllcgotCSAqIGJlZ2lucyB3aXRoICMgb3IgfC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdHJpcFNjaGVtZShTdHJpbmcgdXJpKSB7Ci0JCWludCBpbmRleCA9IHVyaS5pbmRleE9mKFNDSEVNQV9TRVBFUkFUT1IpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIFNDSEVNQV9TRVBFUkFUT1IubGVuZ3RoKCksIHVyaS5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiB1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2RhZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWFkQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogRXh0ZW5kZWQgQWRhcHRvciBpbnRlcmZhY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciBhbiBhZGFwdGVyCi0gKiBwcm92aWRpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0MToxOSBQTSkKLSAqIEBhdXRob3I6IFNjb3R0IFJpY2gKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkQWRhcHRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZID0gIkphdmFSZWZsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpOwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOyAvL0ZCCi19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVmbGVjdGlvbkFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVmbGVjdGlvbkFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4OWNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmUuSkVNUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLS8qKgotICogUmVmbGVjdGlvbkFkYXB0b3IgLSBhIHJlYWQgYWRhcHRvciBiYXNlIGltcGxlbWVudGF0aW9uIHdoaWNoIGRvZXMgYSBidWxrCi0gKiAJbG9hZCBvZiByZWxmbGVjdGVkIHZhbHVlcyBvbiB0aGUgZmlyc3QgcmVxdWVzdC4KLSAqIAlTdWJjbGFzc2VzIGNhbiBvcHRpbWl6ZSB0byBkZWZlciBzb21lIHByb3BlcnRpZXMuCi0gKiAJUHJvcGVydGllcyBtYXkgYWxzbyBiZSBkZWZlcnJlZCBieSBzZXR0aW5nIHRoZWlyIHZhbHVlcyB3aXRoIHByb3h5IHJlZmVyZW5jZXMsCi0gKiAJZm9yIGV4YW1wbGUsIGZvciBzdXBlcnR5cGUgYW5kIG90aGVyIHJlZmVyZW5jZWQgdHlwZXMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmxlY3Rpb25BZGFwdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCBpbXBsZW1lbnRzIFJlYWRBZGFwdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSID0gJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX01FVEhPRF9QQVJNX0RFTElNSVRFUiA9ICcoJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSID0gJy0nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1BBUk1fUEFSTV9ERUxJTUlURVIgPSAnLCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFBBVEhfREVMSU1JVEVSID0gJy8nOwotCS8vIFNXIGlkIGNvbnRhaW5zICYgaW4geG1sIGZpbGUgY2FzdWVzIGV4Y2VwdGlvbiB0aHJvdyBkdXJpbmcgbG9hZAotICAgICAgICAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTX0NPTlNUUlVDVE9SX1RPS0VOID0gIiZWIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19DT05TVFJVQ1RPUl9UT0tFTiA9ICJfViI7Ly8kTk9OLU5MUy0xJCAvLyBTVwotCS8vIGNhY2hlIGEgc3RhdGljIGVtcHR5IFN0cmluZ1tdIGZvciBubyBwYXJtIG1ldGhvZHMKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGVtcHR5U3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCQotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiBldmVudCB0eXBlIGZvciBzcGVjaWFsIFJlZmxlY3Rpb24gbm90aWZpY2F0aW9ucy4gVGhpcyB3aWxsIGJlIHRoZSBldmVudCB0eXBlIGZvciB0aGUgc3BlY2lhbCBvbmVzLCBsaWtlIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogVGhlIGxpc3RlbmVyIHNob3VsZCBsaXN0ZW4gZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIHRoZW4gY2hlY2sgdGhlIGZlYXR1cmUgZm9yIHRoZSB0eXBlIG9mIHNwZWNpYWwgZXZlbnQgKGxpa2UgUkVGTEVDVElPTl9FVkVOVCkuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlQgPSAtMzQ1NjsJLy8gVXNpbmcgYSBmdW5ueSBudW1iZXIgdG8gdHJ5IHRvIGVsaW1pbmF0ZSBjb25mbGljdGlvbiB3aXRoIGFueSBvdGhlciBzcGVjaWFscyB0aGF0IG1heSBvZiBvY2N1ciBmcm9tIG90aGVyIGNvZGUgb24gdGhlIEphdmFDbGFzcy4KLQkKLQkvKioKLQkgKiBTcGVjaWFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlLiBUaGlzIGlzIHNlbnQgYWdhaW5zdCBhIEphdmFDbGFzcyAoYXMgdGhlIHRhcmdldCkgd2hlbmV2ZXIgcmVmbGVjdGlvbiBvY2N1cnMuIEl0IHdpbGwgYmUKLQkgKiBzZW50IHVuZGVyIHRoZSBub3RpZmljYXRpb24gZXZlbnQgdHlwZSBvZiBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBSRUZMRUNUSU9OX0VWRU5UID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQXR0cmlidXRlKCk7Ci0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIG5hbWUuIE5vdCByZWFsbHkgbmVlZGVkIGJ1dCBpdCB3b3VsZCBiZSBuaWNlLgotCSAqLwotCXN0YXRpYyB7UkVGTEVDVElPTl9FVkVOVC5zZXROYW1lKCJyZWZsZWN0VmFsdWVzIik7fSAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWZsZWN0aW5nID0gZmFsc2U7Ci1wdWJsaWMgUmVmbGVjdGlvbkFkYXB0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBSZWZsZWN0aW9uQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlzdXBlcigpOwotCXNldFRhcmdldCh0YXJnZXQpOwotfQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIGVuc3VyZSBmdWxsIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0YXJnZXQuICBSZXF1aXJlZAotICogZm9yIHNlcmlhbGl6YXRpb24uCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JjZURlZmVycmVkUmVhZEZvcihFT2JqZWN0IHRhcmdldCkgewotCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3IgPSByZXRyaWV2ZUFkYXB0b3JGcm9tKHRhcmdldCk7Ci0JaWYgKGFkYXB0b3IgIT0gbnVsbCkgewotCQlhZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLX0KLXByb3RlY3RlZCBSZXNvdXJjZSBnZXRUYXJnZXRSZXNvdXJjZSgpIHsKLQlpZiAoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkKLQkJcmV0dXJuICgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGdldFRhcmdldCgpKS5lUmVzb3VyY2UoKTsKLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogSGVscGVyIG1ldGhvZCB0byBmZXRjaCB0aGUgYWRhcHRvciBmcm9tIHRoZSBvYmplY3QsIGFuZCBpZiBpdCBleGlzdHMsIGdldCB0aGUgYWRhcHRlZAotICogdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuICBPdmVybG9hZGVkIGZvciBtYW55LXNpZGVkIGF0dHJpYnV0ZXMgd2hlcmUgdGhlIHJldHVybiB2YWx1ZSB3b3VsZAotICogb3RoZXJ3aXNlIGJlIGFuIGVudW1lcmF0aW9uOyBpbiB0aGlzIGNhc2Ugd2lsbCByZXR1cm4gYW4gQXJyYXkgaW5zdGVhZC4gCi0gKi8KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFUmVmZXJlbmNlIGF0dHJpYnV0ZSkgewkKLS8vRkIJUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvciA9IHJldHJpZXZlQWRhcHRvckZyb20ob2JqZWN0KTsKLS8vRkIJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLS8vRkIJCXJldHVybiBhZGFwdG9yLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotLy9GQglyZXR1cm4gKChJUmVhZEFkYXB0YWJsZSkgb2JqZWN0KS5wcmltUmVmVmFsdWUoYXR0cmlidXRlKTsKLQlyZXR1cm4gb2JqZWN0LmVHZXQoYXR0cmlidXRlKTsgLy9GQgotCQotfQotLypIZWxwZXIgbWV0aG9kIHRvIGZldGNoIHRoZSBhZGFwdG9yIGZyb20gdGhlIG9iamVjdCwgYW5kIGlmIGl0IGV4aXN0cywgZ2V0IHRoZSBhZGFwdGVkCi0gKnZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgotICovCi1wdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsJCi0vL0ZCCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3IgPSByZXRyaWV2ZUFkYXB0b3JGcm9tKG9iamVjdCk7Ci0vL0ZCCWlmIChhZGFwdG9yICE9IG51bGwpCi0vL0ZCCQlyZXR1cm4gYWRhcHRvci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLS8vRkIJcmV0dXJuICgoSVJlYWRBZGFwdGFibGUpIG9iamVjdCkucHJpbVJlZlZhbHVlKGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIG9iamVjdC5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpYXR0cmlidXRlKTsgLy9GQgotfQotLyoqCi0gKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0vL0ZCCXJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotLy9GQglyZXR1cm4gKChJUmVhZEFkYXB0YWJsZSkgb2JqZWN0KS5wcmltUmVmVmFsdWUoYXR0cmlidXRlKTsKLQlyZXR1cm4gb2JqZWN0LmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlhdHRyaWJ1dGUpOyAvL0ZCCi19Ci0vKioKLSAqIGlzQWRhcHRvckZvclR5cGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gKHR5cGUgPT0gUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotfQotLyoqCi0gKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKTsKLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcmVmbGVjdGlvbiBoYWQgb2NjdXJyZWQuCi0gKi8KLXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSB7Ci0JaWYgKCFoYXNSZWZsZWN0ZWQgJiYgIWlzUmVmbGVjdGluZykgewotCQl0cnkgewotCQkJaXNSZWZsZWN0aW5nID0gdHJ1ZTsKLQkJCUVPYmplY3QgZXRhcmdldCA9IChFT2JqZWN0KWdldFRhcmdldCgpOwotCQkJaWYgKCFldGFyZ2V0LmVJc1Byb3h5KCkgJiYgZXRhcmdldC5lUmVzb3VyY2UoKSAhPSBudWxsICYmIGV0YXJnZXQuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKQotCQkJCWhhc1JlZmxlY3RlZCA9IHJlZmxlY3RWYWx1ZXMoKTsKLQkJCWVsc2UKLQkJCQloYXNSZWZsZWN0ZWQgPSBmYWxzZTsJLy8gQVMgbG9uZyB3ZSBhcmUgYSBwcm94eSBvciBpcyBub3QgaW4gYSB2YWxpZCByZXNvdXJjZSBvciBzZXQsIHdlIHdvbid0IHJlZmxlY3QuCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQlsb2dnZXIubG9nV2FybmluZyhlKTsKLQkJCQlKRU1QbHVnaW4ubG9nV2FybmluZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaXNSZWZsZWN0aW5nID0gZmFsc2U7Ci0JCQlnZXRUYXJnZXQoKS5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KWdldFRhcmdldCgpLCBFVkVOVCwgUkVGTEVDVElPTl9FVkVOVCwgbnVsbCwgbnVsbCwgTm90aWZpY2F0aW9uLk5PX0lOREVYKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhc1JlZmxlY3RlZDsKLX0KLXB1YmxpYyBzdGF0aWMgUmVmbGVjdGlvbkFkYXB0b3IgcmV0cmlldmVBZGFwdG9yRnJvbShFT2JqZWN0IG9iamVjdCkgewotCXN5bmNocm9uaXplZCAob2JqZWN0KSB7Ci0JCXJldHVybiAoUmVmbGVjdGlvbkFkYXB0b3IpRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKG9iamVjdCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSkRLQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSkRLQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMxNmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0pES0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpES0FkYXB0b3IgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgewotCXB1YmxpYyBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHVibGljIEpES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQpOwotCQlzZXRBZGFwdGVyRmFjdG9yeShhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgY29uc3RydWN0b3IuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVDbGFzc05hbWUuc2ltcGxlQ2xhc3NOYW1lKGNvbS5mcm9uay5QYXJtVHlwZTFfcGFybVR5cGUyJlYKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqCi0JICogSXQgaGFzIHRvIGJlIGRvbmUgc2VwYXJhdGVseSBmb3IgSkRLIGJlY2F1c2UgQ29uc3RydWN0b3JzIGFuZCBNZXRob2RzIGFyZSBkaWZmZXJlbnQgY2xhc3Nlcy4KLQkgKiBIb3dldmVyLCBpbiB0aGUgSmF2YSBNb2RlbCB0aGV5IGFyZSBib3RoIGp1c3QgTWV0aG9kcyB3aXRoIGEgZmxhZyBpbmRpY2F0aW5nIENvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBqZGtDb25zdHJ1Y3RvcikgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlTmFtZShqZGtDb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJb3V0LmFwcGVuZChDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCQlvdXQuYXBwZW5kKGNvbXB1dGVNZXRob2ROYW1lKGpka0NvbnN0cnVjdG9yKSk7Ci0JCW91dC5hcHBlbmQoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlDbGFzc1tdIHBhcm1UeXBlcyA9IGpka0NvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlvdXQuYXBwZW5kKHBhcm1UeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJaWYgKGkgPCBwYXJtVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQlvdXQuYXBwZW5kKENfUEFSTV9QQVJNX0RFTElNSVRFUik7Ci0JCX0KLQkJb3V0LmFwcGVuZChTX0NPTlNUUlVDVE9SX1RPS0VOKTsgLy9JdCdzIGEgY29uc3RydWN0b3IKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIElmIHRoZXJlIGFyZSBubyBwYXJtcywgaXQgd2lsbCBlbmQgd2l0aCBhICIoIiBzbyB0aGF0IGl0IGNhbiBiZSBkaXN0aWN0aXZlIGZyb20gYSBmaWVsZC4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJc2ltcGxlQ2xhc3NOYW1lLm1ldGhvZE5hbWUoY29tLmZyb25rLlBhcm1UeXBlMV9wYXJtVHlwZTIKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgamRrTWV0aG9kKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTaW1wbGVOYW1lKGpka01ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJb3V0LmFwcGVuZChDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCQlvdXQuYXBwZW5kKGNvbXB1dGVNZXRob2ROYW1lKGpka01ldGhvZCkpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBqZGtNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW91dC5hcHBlbmQocGFybVR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQlpZiAoaSA8IHBhcm1UeXBlcy5sZW5ndGggLSAxKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQlpZiAoamRrTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhqZGtNZXRob2QuZ2V0TmFtZSgpKSkKLQkJCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7IC8vSXQncyBhIGNvbnN0cnVjdG9yCi0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZE5hbWUgLSBnZW5lcmF0ZSB0aGUgbmFtZSB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgY29uc3RydWN0b3IuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICoKLQkgKiBJdCBoYXMgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5IGZvciBKREsgYmVjYXVzZSBDb25zdHJ1Y3RvcnMgYW5kIE1ldGhvZHMgYXJlIGRpZmZlcmVudCBjbGFzc2VzLgotCSAqIEhvd2V2ZXIsIGluIHRoZSBKYXZhIE1vZGVsIHRoZXkgYXJlIGJvdGgganVzdCBNZXRob2RzIHdpdGggYSBmbGFnIGluZGljYXRpbmcgQ29uc3RydWN0b3IuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2ROYW1lKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGpka0NvbnN0cnVjdG9yKSB7Ci0JCXJldHVybiBnZXRTaW1wbGVOYW1lKGpka0NvbnN0cnVjdG9yLmdldE5hbWUoKSk7IC8vIENUT1IgbmFtZXMgY29tZSBiYWNrIGZ1bGx5LXF1YWxpZmllZCB3aXRoIHBhY2thZ2UuCi0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2ROYW1lIC0gZ2VuZXJhdGUgdGhlIG5hbWUgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBGb3IgdGhlIG1vbWVudCwgbmFtZXMgYXJlIHNpbXBsZSwgYW5kIFVVSUQncyBhcmUgY29tcGxleC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kTmFtZShqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgamRrTWV0aG9kKSB7Ci0JCXJldHVybiBqZGtNZXRob2QuZ2V0TmFtZSgpOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhRmllbGQgLSBpbnN0YW50aWF0ZSBhIEphdmEgRmllbGQgYmFzZWQgb24gdGhlIHBhc3NlZCBGaWVsZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgZmllbGQgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICovCi0JcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCByZWZsZWN0ZWRGaWVsZCwgWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmllbGQgbmV3RmllbGQgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0JCW5ld0ZpZWxkLnNldE5hbWUocmVmbGVjdGVkRmllbGQuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZU5hbWUocmVmbGVjdGVkRmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdGaWVsZCwgY2xhc3NOYW1lICsgQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSICsgcmVmbGVjdGVkRmllbGQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIG5ld0ZpZWxkOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhTWV0aG9kIC0gaW5zdGFudGlhdGUgYSBKYXZhIE1ldGhvZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEphdmEgUmVmbGVjdGlvbiBDb25zdHJ1Y3RvcgotCSAqIFdlIGFyZSBkZWZlcnJpbmcgbWV0aG9kIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgZW5vdWdoIGluZm8gaW4gdGhlIGVtcHR5IE1ldGhvZCB0byBmaW5kIGl0cyBKYXZhIHNvdXJjZS4KLQkgKiBUaGUgSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBqZGtDb25zdHJ1Y3RvciwgWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWV0aG9kIG5ld01ldGhvZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci0JCS8vIFdlIHVzZSBhIHNpbXBsZSBuYW1lLCBidXQgYSBjb21wbGV4IElEIAotCQluZXdNZXRob2Quc2V0TmFtZShjb21wdXRlTWV0aG9kTmFtZShqZGtDb25zdHJ1Y3RvcikpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZGtDb25zdHJ1Y3RvcikpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhTWV0aG9kIC0gaW5zdGFudGlhdGUgYSBKYXZhIE1ldGhvZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEphdmEgUmVmbGVjdGlvbiBNZXRob2QKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIElEIHdpbGwgZXZlbnR1YWxseSBob2xkIGVub3VnaCBpbmZvIHRvIGlkZW50aWZ5IHRoZSBzb3VyY2UsIHNvIHdlIHVzZSBpdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGpka01ldGhvZCwgWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWV0aG9kIG5ld01ldGhvZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci0JCS8vIFdlIHVzZSBhIHNpbXBsZSBuYW1lLCBidXQgYSBjb21wbGV4IElEIAotCQluZXdNZXRob2Quc2V0TmFtZShjb21wdXRlTWV0aG9kTmFtZShqZGtNZXRob2QpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3TWV0aG9kLCBjb21wdXRlTWV0aG9kSUQoamRrTWV0aG9kKSk7Ci0JCXJldHVybiBuZXdNZXRob2Q7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDcvMDAgMzo0Mzo1NSBQTSkKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFKREtBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKYXZhSkRLQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JcHVibGljIENsYXNzTG9hZGVyIGdldEFsdGVybmF0ZUNsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBNZXRob2QgdG8gY29udmVydCB0aGUgdGV4dHVhbCBmb3JtIG9mIGEgcHJpbWl0aXZlIHR5cGUgaW50byBpdHMgQ2xhc3Mgb2JqZWN0Ci0JKgotCSogQHBhcmFtIHR5cGUgVGhlIHByaW1pdGl2ZSB0eXBlJ3MgdGV4dHVhbCByZXByZXNlbnRhdGlvbgotCSovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRQcmltaXRpdmVUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUNsYXNzIGMgPSBudWxsOwotCi0JCWlmICh0eXBlLmVxdWFscyhieXRlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBieXRlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHNob3J0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBzaG9ydC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGludC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhsb25nLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBsb25nLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBmbG9hdC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhkb3VibGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGRvdWJsZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhib29sZWFuLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBib29sZWFuLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGNoYXIuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGNoYXIuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gdm9pZC5jbGFzczsKLQkJfQotCi0JCXJldHVybiBjOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgb2YgYSAnLictc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgotCSAqIFJldHVybnMgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KLQkgKiBGb3IgZXhhbXBsZToKLQkgKiA8cHJlPgotCSAqIGdldFNpbXBsZU5hbWUoImphdmEubGFuZy5PYmplY3QiKSAtPiAiT2JqZWN0IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaW50IGxhc3REb3QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0RG90ID09IC0xKQotCQkJcmV0dXJuIG5hbWU7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7Ci0JfQotCXB1YmxpYyBDbGFzcyBnZXRUeXBlKEphdmFIZWxwZXJzIG1vZGVsQ2xhc3MpIHsKLQkJQ2xhc3MgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG1vZGVsQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgbW9kZWxDbGFzczsKLQkJCUNsYXNzIGNvbXBvbmVudENsYXNzID0gZ2V0VHlwZShhcnJheVR5cGUuZ2V0RmluYWxDb21wb25lbnRUeXBlKCkpOwotCQkJcmVzdWx0ID0gKEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudENsYXNzLCBuZXcgaW50W2FycmF5VHlwZS5nZXRBcnJheURpbWVuc2lvbnMoKV0pKS5nZXRDbGFzcygpOwotCQl9IGVsc2UgaWYgKG1vZGVsQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJcmVzdWx0ID0gZ2V0VHlwZShtb2RlbENsYXNzLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXRUeXBlKCgoSmF2YUNsYXNzKSBtb2RlbENsYXNzKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQkvLyBUcnkgZm9yIGEgcHJpbWl0aXZlIHR5cGUgKCJpbnQiLCJjaGFyIixldGMuKSBmaXJzdAotCQlDbGFzcyBwcmltVHlwZSA9IGdldFByaW1pdGl2ZVR5cGUocXVhbGlmaWVkTmFtZSk7Ci0JCWlmIChwcmltVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDaGFuZ2VkIGZvciBkZWZlY3QgIzIxMjE0NyBib3RwQGF1c2FpeDE5LmF1c3Rpbi5pYm0uY29tQDc2MzAgc3lzdGVtLgotCQkJLy8KLQkJCS8vIFNlYXJjaCBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzbG9hZGVycyAodGhlIGZpcnN0IG9uZSB0aGF0IGV4aXN0cykgaW4gdGhpcyBvcmRlci4gSWYgbm90IGZvdW5kCi0JCQkvLyBpbiBhIGNsYXNzbG9hZGVyLCBpdCB3aWxsIG5vdCByb2xsLW92ZXIgdG8gYW5vdGhlciBjbGFzcyBsb2FkZXIuIFRoaXMgaXMgdG8gYXZvaWQgcHJvYmxlbXMgd2hlcmUgYQotCQkJLy8gY2xhc3MgbWF5IGV4aXN0IGluIG1vcmUgdGhhbiBvbmUgY2xhc3Nsb2FkZXIuIFlvdSBnZXQgZXJyb3JzIHdoZW4gdGhpcyBoYXBwZW5zIGR1ZSB0byBvbmUgY2xhc3MgdGhhdAotCQkJLy8gd2FzIGZvdW5kIGluIG9ubHkgb25lIGNsYXNzbG9hZGVyIHRoYXQgcmVmZXJzIHRvIGFub3RoZXIgY2xhc3MgdGhhdCB3YXMgZm91bmQgaW4gYm90aCBjbGFzc2xvYWRlcnMuCi0JCQkvLyBUaGV5IGRvbid0IG1hdGNoIHdoZW4gdHJ5aW5nIHRvIHJlZmxlY3QgbGF0ZXIuCi0JCQkvLyAxKSBBbHRlcm5hdGUgY2xhc3Nsb2FkZXIgKGlmIGV4aXN0cykKLQkJCS8vIDIpIFRocmVhZCBjb250ZXh0IGNsYXNzbG9hZGVyIChpZiBleGlzdHMpCi0JCQkvLyAzKSBTeXN0ZW0gY2xhc3Nsb2FkZXIgKGlmIGV4aXN0cykKLQkJCS8vIDQpIENsYXNzLmZvck5hbWUoKS4KLQkJCWlmIChnZXRBbHRlcm5hdGVDbGFzc0xvYWRlcigpICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRlQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MocXVhbGlmaWVkTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmYyKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJCWlmIChjb250ZXh0Q2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBjb250ZXh0Q2xhc3NMb2FkZXIubG9hZENsYXNzKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNsYXNzTG9hZGVyIHN5c3RlbUNsYXNzTG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLQkJCWlmIChzeXN0ZW1DbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHN5c3RlbUNsYXNzTG9hZGVyLmxvYWRDbGFzcyhxdWFsaWZpZWROYW1lKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKHF1YWxpZmllZE5hbWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHByaW1UeXBlOwotCX0KLQkvKgotCSAqIFV0aWxpdHkgcm91dGluZSB0byBwYXBlciBvdmVyIGFycmF5IHR5cGUgbmFtZXMKLQkgKiBCb3Jyb3dlZCBmcm9tIGEgcGFja2FnZS12aXNpYmlsaXR5IGhlbHBlciBvbiBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZAotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoQ2xhc3MgdHlwZSkgewotCQlpZiAodHlwZS5pc0FycmF5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgY2wgPSB0eXBlOwotCQkJCWludCBkaW1lbnNpb25zID0gMDsKLQkJCQl3aGlsZSAoY2wuaXNBcnJheSgpKSB7Ci0JCQkJCWRpbWVuc2lvbnMrKzsKLQkJCQkJY2wgPSBjbC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQoY2wuZ2V0TmFtZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewotCQkJCQlzYi5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvKkZBTExUSFJVKi8KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBNZXRob2QgdG8gY29udmVydCB0aGUgdGV4dHVhbCBmb3JtIG9mIGEgcHJpbWl0aXZlIHR5cGUgaW50byBpdHMgQ2xhc3Mgb2JqZWN0Ci0JKgotCSogQHBhcmFtIHR5cGUgVGhlIHByaW1pdGl2ZSB0eXBlJ3MgdGV4dHVhbCByZXByZXNlbnRhdGlvbgotCSovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBwcmltaXRpdmVGb3JOYW1lKFN0cmluZyB0eXBlKSB7Ci0JCUNsYXNzIGMgPSBudWxsOwotCi0JCWlmICh0eXBlLmVxdWFscyhieXRlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBieXRlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHNob3J0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBzaG9ydC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGludC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhsb25nLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBsb25nLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBmbG9hdC5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhkb3VibGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGRvdWJsZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhib29sZWFuLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBib29sZWFuLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGNoYXIuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGNoYXIuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gdm9pZC5jbGFzczsKLQkJfQotCi0JCXJldHVybiBjOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDcvMDAgMzo0Mzo1NSBQTSkKLQkgKiBAcGFyYW0gbmV3QWRhcHRlckZhY3Rvcnkgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YUpES0FkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoSmF2YUpES0FkYXB0ZXJGYWN0b3J5IG5ld0FkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3QWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUNsYXNzSkRLQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUNsYXNzSkRLQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZmOTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFDbGFzc0pES0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogUmVmbGVjdCB0aGUgY2xhc3MgdXNpbmcgc3RhbmRhcmQgamF2YS5yZWZsZWN0IG1ldGhvZHMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFDbGFzc0pES0FkYXB0b3IgZXh0ZW5kcyBKREtBZGFwdG9yIGltcGxlbWVudHMgSUphdmFDbGFzc0FkYXB0b3IgewotCi0JcHJvdGVjdGVkIENsYXNzIHNvdXJjZVR5cGUgPSBudWxsOwotCi0JcHVibGljIEphdmFDbGFzc0pES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIGFkZEZpZWxkcyAtIHJlZmxlY3Qgb3VyIGZpZWxkcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZpZWxkcygpIHsKLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlMaXN0IHRhcmdldEZpZWxkcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldEZpZWxkc0dlbigpOwotCQl0YXJnZXRGaWVsZHMuY2xlYXIoKTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGRbXSBmaWVsZHMgPSB7fTsKLQkJdHJ5IHsKLQkJCWZpZWxkcyA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJlZEZpZWxkcygpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlcnJvcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoCi0JCQkJCSJDb3VsZF9Ob3RfUmVmbGVjdF9GaWVsZHNfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlcnJvci5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJdGFyZ2V0RmllbGRzLmFkZChjcmVhdGVKYXZhRmllbGQoZmllbGRzW2ldLCByZXNvdXJjZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYWRkTWV0aG9kcyAtIHJlZmxlY3Qgb3VyIG1ldGhvZHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RzKCkgewotCQkvLyBXZSBuZWVkIHRvIGZpcnN0IGRvIG1ldGhvZHMgYW5kIHRoZW4gZG8gY29uc3RydWN0b3JzIGJlY2F1c2UgdGhlIEpESyB0cmVhdHMgdGhlbSBhcyB0d28KLQkJLy8gZGlmZmVyZW50IG9iamVjdHMsIHdoaWNoIHRoZSBKYXZhIE1vZGVsIHRyZWF0cyB0aGVtIGFzIGJvdGggTWV0aG9kJ3MuCi0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJTGlzdCB0YXJnZXRNZXRob2RzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQl0YXJnZXRNZXRob2RzLmNsZWFyKCk7Ci0JCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZFtdIG1ldGhvZHMgPSB7fTsKLQkJdHJ5IHsKLQkJCW1ldGhvZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVycm9yKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZygKLQkJCQkJCQkJUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJCQkJCSJDb3VsZF9Ob3RfUmVmbGVjdF9NZXRob2RzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWUoKSwgZXJyb3IudG9TdHJpbmcoKX0pLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJdGFyZ2V0TWV0aG9kcy5hZGQoY3JlYXRlSmF2YU1ldGhvZChtZXRob2RzW2ldLCByZXNvdXJjZSkpOwotCQl9Ci0KLQkJLy8gTm93IGRvIHRoZSBjb25zdHJ1Y3RvcnMKLQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3JbXSBjdG9ycyA9IHt9OwotCQl0cnkgewotCQkJY3RvcnMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXJyb3IpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nKAotCQkJCQkJCQlSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCQkJIkNvdWxkX05vdF9SZWZsZWN0X0NvbnN0cnVjdG9yc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lKCksIGVycm9yLmdldE1lc3NhZ2UoKX0pLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXRhcmdldE1ldGhvZHMuYWRkKGNyZWF0ZUphdmFNZXRob2QoY3RvcnNbaV0sIHJlc291cmNlKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgZmllbGRzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hGaWVsZHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldEZpZWxkc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBpbXBsZW1lbnRzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbXBsZW1lbnRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgbWV0aG9kcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTWV0aG9kcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoSW5uZXJDbGFzc2VzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1vZGlmaWVycygpIHsKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0QWJzdHJhY3QoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0RmluYWwoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0UHVibGljKGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZsdXNoTW9kaWZpZXJzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaFN1cGVyKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaEltcGxlbWVudHMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoTWV0aG9kcygpOwotCQlyZXN1bHQgJj0gZmx1c2hGaWVsZHMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoSW5uZXJDbGFzc2VzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5zZXRSZWZsZWN0ZWQoZmFsc2UpOwotCQlzdXBlci5wb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN1cGVydHlwZSB0byBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoU3VwZXIoKSB7Ci0JCUxpc3QgdGFyZ2V0U3VwZXJzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkucHJpbUdldEVTdXBlclR5cGVzKCk7Ci0JCXRhcmdldFN1cGVycy5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhcmdldCB0eXBlZCB0byBhIEphdmFDbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzSW1wbCBnZXRKYXZhQ2xhc3NUYXJnZXQoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpOwotCX0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZVR5cGUgIT0gbnVsbDsKLSAgICB9Ci0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBqYXZhLmxhbmcuQ2xhc3Mgd2hpY2ggZGVzY3JpYmVzIG91ciBleGlzdGluZyBKYXZhIGNsYXNzCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldFNvdXJjZVR5cGUoKSB7Ci0JCWlmIChzb3VyY2VUeXBlID09IG51bGwpIHsKLQkJCXNvdXJjZVR5cGUgPSBnZXRUeXBlKChKYXZhQ2xhc3MpIGdldFRhcmdldCgpKTsKLQkJfQotCQlyZXR1cm4gc291cmNlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBpcyBudWxsIG9yIGlmIGl0IGlzIGEgYmluYXJ5IHR5cGUuIFJlZmxlY3Rpb24gZnJvbSB0aGUgSkRLIGlzIGFsd2F5cyBmcm9tIGJpbmFyeS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LiBvbiBlbnRyeTogbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQKLQkgKiBkb2N1bWVudCBtdXN0IGJlIHNldC4gUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCBKYXZhQ2xhc3MgYWRhcHRvcjogLSBzZXQgbW9kaWZpZXJzIC0gc2V0IG5hbWUgLSBzZXQgcmVmZXJlbmNlIHRvIHN1cGVyIC0gY3JlYXRlIG1ldGhvZHMgLQotCSAqIGNyZWF0ZSBmaWVsZHMgLSBhZGQgaW1wb3J0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbCkgewotCQkJCXNldE1vZGlmaWVycygpOwotCQkJCXNldE5hbWluZygpOwotCQkJCXRyeSB7Ci0JCQkJCXNldFN1cGVyKCk7Ci0JCQkJfSBjYXRjaCAoSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfQotCQkJCXNldEltcGxlbWVudHMoKTsKLQkJCQlhZGRNZXRob2RzKCk7Ci0JCQkJYWRkRmllbGRzKCk7Ci0JCQkJcmVmbGVjdElubmVyQ2xhc3NlcygpOwotCQkJCXNldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5yZWdpc3RlclJlZmxlY3Rpb24oZ2V0U291cmNlVHlwZSgpLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJLy8JYWRkSW1wb3J0cygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJLy9Eb24ndCBjYWNoZSB0aGUgY2xhc3MgYmV5b25kIHRoZSBvcGVyYXRpb24gb2YgcmVmbGVjdCB2YWx1ZXM7Ci0JCQkvL3RoaXMgZW5hYmxlcyBkeW5hbWljIHN3YXBwaW5nIG9mIHRoZSBhbHRlcm5hdGUgY2xhc3MgbG9hZGVyCi0JCQkvL2ZvciBqYXZhIHJlZmxlY3Rpb24sIGFzIHdlbGwgYXMgYXZvaWRzIHBvdGVudGlhbCBtZW1vcnkgbGVha2FnZQotCQkJc291cmNlVHlwZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCUNsYXNzIGRlY2xhcmluZ1R5cGUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgewotCQkJLy8gTmVlZCB0byBnZXQgaXQgYW5kIHJlZmxlY3QgaXQgc28gdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGlzIHRhcmdldCBpcyBzZXQgY29ycmVjdGx5LiBXZSBjYW4ganVzdAotCQkJLy8gc2V0IGl0IG91cnNlbHZlcyBkaXJlY3RseSBiZWNhdXNlIEVDb3JlIHdvdWxkIHRyeSB0byBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgaW5uZXIgY2xhc3NlcyBvZiB0aGUgZGVjbGFyaW5nIHR5cGUuIFRoaXMKLQkJCS8vIHdvdWxkIGNhdXNlIGl0IHRvIGJlIGFkZGVkIHR3aWNlLCBvbmNlIGZyb20gdGhlIHJlZmxlY3Rpb24gY2F1c2VkIGJ5IHRoZSBpbnZlcnNlIHNldHRpbmcsIGFuZCBvbmNlIGZyb20gb3VyIGRvaW5nCi0JCQkvLyB0aGUgaW52ZXJzZSBzZXR0aW5nIGl0c2VsZi4KLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCUphdmFDbGFzc0ltcGwgZGVjbGFyaW5nQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGRlY2xhcmluZ1R5cGUuZ2V0TmFtZSgpLCBzZXQpOwotCQkJZGVjbGFyaW5nQ2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCk7CS8vIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBwdXQgdXMgaW50byBpdHMgbGlzdCBhbmQgYWxzbyBzZXQgb3VyIGRlY2xhcmluZyBjbGFzcyB0byB0aGlzIGRlY2xhcmluZyB0eXBlLgotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RJbm5lckNsYXNzZXMoKSB7Ci0JCUNsYXNzW10gaW5uZXJDbGFzc2VzID0gZ2V0U291cmNlVHlwZSgpLmdldENsYXNzZXMoKTsKLQkJaWYgKGlubmVyQ2xhc3Nlcy5sZW5ndGggIT0gMCkgewotCQkJTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQkJCUphdmFDbGFzcyBpbm5lcjsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5uZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5uZXIgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoaW5uZXJDbGFzc2VzW2ldLmdldE5hbWUoKSwgc2V0KTsKLQkJCQlkZWNsYXJlZENsYXNzZXMuYWRkKGlubmVyKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogc2V0SW1wbGVtZW50cyAtIHNldCBvdXIgaW1wbGVtZW50ZWQvc3VwZXIgaW50ZXJmYWNlcyBoZXJlIEZvciBhbiBpbnRlcmZhY2UsIHRoZXNlIGFyZSBzdXBlcmNsYXNzZXMuIEZvciBhIGNsYXNzLCB0aGVzZSBhcmUgaW1wbGVtZW50ZWQKLQkgKiBpbnRlcmZhY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEltcGxlbWVudHMoKSB7Ci0JCUNsYXNzW10gaW50ZXJmYWNlcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRJbnRlcmZhY2VzKCk7Ci0JCS8vIG5lZWRzIHdvcmssIHRoZSBuYW1lcyBhYm92ZSB3aWxsIGJlIHNpbXBsZSBuYW1lcyBpZiB3ZSBhcmUgcmVsZmVjdGluZyBmcm9tIGEgc291cmNlIGZpbGUKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFDbGFzcyByZWY7Ci0JCUxpc3QgaW50TGlzdCA9IGphdmFDbGFzc1RhcmdldC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpOwotCQlpbnRMaXN0LmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJcmVmID0gY3JlYXRlSmF2YUNsYXNzUmVmKGludGVyZmFjZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWludExpc3QuYWRkKHJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0QWJzdHJhY3QoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChnZXRTb3VyY2VUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzRmluYWwoZ2V0U291cmNlVHlwZSgpLmdldE1vZGlmaWVycygpKSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQdWJsaWMoZ2V0U291cmNlVHlwZSgpLmdldE1vZGlmaWVycygpKSk7Ci0JCS8vIFNldCB0eXBlIHRvIGNsYXNzIG9yIGludGVyZmFjZSwgbm90IHlldCBoYW5kbGluZyBFWENFUFRJT04KLQkJaWYgKGdldFNvdXJjZVR5cGUoKS5pc0ludGVyZmFjZSgpKQotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpOwotCQllbHNlCi0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5DTEFTU19MSVRFUkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZSAtIHF1YWxpZmllZCBuYW1lIChwYWNrYWdlIG5hbWUgKyBuYW1lKSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzIC0gSUQgLQotCSAqIHNpbXBsZSBuYW1lLCBpZGVudGl0eSB3aXRoaW4gYSBwYWNrYWdlIGRvY3VtZW50IC0gTk8gVVVJRCEhIQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8JSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQkvLwlqYXZhQ2xhc3NUYXJnZXQucmVmU2V0VVVJRCgoU3RyaW5nKSBudWxsKTsKLQkJLy8JKChYTUlSZXNvdXJjZSlqYXZhQ2xhc3NUYXJnZXQuZVJlc291cmNlKCkpLnNldElEKGphdmFDbGFzc1RhcmdldCxnZXRTaW1wbGVOYW1lKGdldFNvdXJjZVR5cGUoKS5nZXROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTdXBlciAtIHNldCBvdXIgc3VwZXJ0eXBlIGhlcmUsIGltcGxlbWVudGVkIGludGVyZmFjZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXIoKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCUNsYXNzIHN1cGVyQ2xhc3MgPSBudWxsOwotCQlzdXBlckNsYXNzID0gZ2V0U291cmNlVHlwZSgpLmdldFN1cGVyY2xhc3MoKTsKLQkJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQkJamF2YUNsYXNzVGFyZ2V0LnNldFN1cGVydHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYoc3VwZXJDbGFzcy5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzb3VyY2VUeXBlRXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUZpZWxkSkRLQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUZpZWxkSkRLQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODQ2OTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFGaWVsZEpES0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFGaWVsZEpES0FkYXB0b3IgZXh0ZW5kcyBKREtBZGFwdG9yIHsKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgc291cmNlRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBDbGFzcyBwYXJlbnRUeXBlID0gbnVsbDsKLQlwdWJsaWMgSmF2YUZpZWxkSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCS8qKgotCSAqIGdldFBhcmVudFR5cGUgLSByZXR1cm4gdGhlIENsYXNzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIG91ciBwYXJlbnQgSmF2YUNsYXNzCi0JICogd2UncmUgZ29pbmcgdG8gZG8gdGhpcyBhIGxvdCwgc28gY2FjaGUgaXQuCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldFBhcmVudFR5cGUoKSB7Ci0JCWlmIChwYXJlbnRUeXBlID09IG51bGwpIHsKLQkJCUZpZWxkIHRhcmdldEZpZWxkID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJCUphdmFDbGFzcyBwYXJlbnRKYXZhQ2xhc3MgPSB0YXJnZXRGaWVsZC5nZXRKYXZhQ2xhc3MoKTsKLQkJCUphdmFDbGFzc0pES0FkYXB0b3IgcGEgPSAoSmF2YUNsYXNzSkRLQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAocGEgIT0gbnVsbCkKLQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGaWVsZCgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZUZpZWxkICE9IG51bGw7Ci0gICAgfQotCS8qKgotCSAqIGdldFNvdXJjZUZpZWxkIC0gcmV0dXJuIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBnZXRTb3VyY2VGaWVsZCgpIHsKLQkJaWYgKHNvdXJjZUZpZWxkID09IG51bGwpIHsKLQkJCUNsYXNzIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50VHlwZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlRmllbGQgPSBwYXJlbnQuZ2V0RGVjbGFyZWRGaWVsZCgoKEZpZWxkKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpKTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIE9LLCBjYXJyeSBvbgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlRmllbGQ7Ci0JfQotCXB1YmxpYyBGaWVsZCBnZXRUYXJnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBKYXZhQ2xhc3MgYWRhcHRvcjoKLQkgKgktIHNldCBtb2RpZmllcnMKLQkgKgktIHNldCBuYW1lCi0JICogCS0gc2V0IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlpZiAoZ2V0U291cmNlRmllbGQoKSAhPSBudWxsKSB7Ci0JCQlzZXRNb2RpZmllcnMoKTsKLQkJCXNldFR5cGUoKTsKLQkJCXNldEluaXRpYWxpemVySWZQb3NzaWJsZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBVc2VkIGZvciB0aGUgdmVyeSBuYXJyb3cgY2FzZSBvZiBmaW5hbCBzdGF0aWMgU3RyaW5ncwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEluaXRpYWxpemVySWZQb3NzaWJsZSgpIHsKLQkJaWYgKCEoZ2V0VGFyZ2V0RmllbGQoKS5pc1N0YXRpYygpICYmIGdldFRhcmdldEZpZWxkKCkuaXNGaW5hbCgpICYmICJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMoKChKYXZhSGVscGVycykgZ2V0VGFyZ2V0RmllbGQoKS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpIGdldFNvdXJjZUZpZWxkKCkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJdmFsdWUgPSAiXCIiLmNvbmNhdCh2YWx1ZSkuY29uY2F0KCJcIiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCUJsb2NrIGFCbG9jayA9IGNyZWF0ZUJsb2NrKGdldFRhcmdldEZpZWxkKCkuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JCWdldFRhcmdldEZpZWxkKCkuc2V0SW5pdGlhbGl6ZXIoYUJsb2NrKTsKLQl9Ci0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCUZpZWxkIGphdmFGaWVsZFRhcmdldCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCS8vIEZvciBKREsgcmVmbGVjdGlvbiwgSSBkb24ndCB0aGluayB3ZSBjYW4gc2V0IHRoZSBpbml0aWFsaXplcgotCQlpbnQgbW9kaWZpZXJzID0gZ2V0U291cmNlRmllbGQoKS5nZXRNb2RpZmllcnMoKTsKLQkJamF2YUZpZWxkVGFyZ2V0LnNldFN0YXRpYyhqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKTsKLQkJamF2YUZpZWxkVGFyZ2V0LnNldFRyYW5zaWVudChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1RyYW5zaWVudChtb2RpZmllcnMpKTsKLQkJamF2YUZpZWxkVGFyZ2V0LnNldFZvbGF0aWxlKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzVm9sYXRpbGUobW9kaWZpZXJzKSk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRGaW5hbChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ZpbmFsKG1vZGlmaWVycykpOwotCQkvLyBTZXQgdmlzaWJpbGl0eQotCQlpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSkKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURV9MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSkKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQllbHNlCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKGdldFNvdXJjZUZpZWxkKCkuZ2V0VHlwZSgpKTsKLQkJc2V0RmllbGRUeXBlKGdldFRhcmdldEZpZWxkKCksIHR5cGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhSkRLQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFKREtBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDk0ZWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFKREtBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAwIDE6MjA6MzEgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSkRLQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyOwotCS8qKgotCSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQkvL2FkYXB0ZXJLZXkgPSBUWVBFX05BTUU7Ci0JfQotCS8qKgotCSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgewotCQl0aGlzKCk7Ci0JCXNldENvbnRleHRDbGFzc0xvYWRlcihhQ2xhc3NMb2FkZXIpOwotCX0KLQlwcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUNsYXNzQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbmV3IEphdmFGaWVsZEpES0FkYXB0b3IodGFyZ2V0LCB0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbmV3IEphdmFNZXRob2RKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCS8vIEZsdXNoIEFMTCBhZGFwdGVycywgd29yc3QgY2FzZQotCXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQl0cnkgewotCQkJSXRlcmF0b3IgaSA9IHJlZmxlY3RlZC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKQotCQkJCSAoKEphdmFDbGFzc0pES0FkYXB0b3IpIGkubmV4dCgpKS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JfQotCS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLQlwdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCQlKYXZhQ2xhc3NKREtBZGFwdG9yIGEgPSAoSmF2YUNsYXNzSkRLQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJYS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDcvMDAgMzozODoxMiBQTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gY29udGV4dENsYXNzTG9hZGVyOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6Mzg6MTIgUE0pCi0JICogQHBhcmFtIG5ld0NvbnRleHRDbGFzc0xvYWRlciBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Q2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld0NvbnRleHRDbGFzc0xvYWRlcikgewotCQljb250ZXh0Q2xhc3NMb2FkZXIgPSBuZXdDb250ZXh0Q2xhc3NMb2FkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YU1ldGhvZEpES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzM1Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YU1ldGhvZEpES0FkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuTWV0aG9kSW1wbDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YU1ldGhvZEpES0FkYXB0b3IgZXh0ZW5kcyBKREtBZGFwdG9yIGltcGxlbWVudHMgSUphdmFNZXRob2RBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCBzb3VyY2VBY2Nlc3NpYmxlID0gbnVsbDsgLy8gQ291bGQgYmUgbWV0aG9kIG9yIGN0b3IuCi0JcHJvdGVjdGVkIENsYXNzIHBhcmVudFR5cGUgPSBudWxsOwotCS8vIGNhY2hlIGEgc3RhdGljIGVtcHR5IENsYXNzW10gZm9yIG5vIHBhcm0gbWV0aG9kcwotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3NbXSBlbXB0eUNsYXNzQXJyYXkgPSBuZXcgQ2xhc3NbMF07Ci0JLy8gY2FjaGUgYSBzdGF0aWMgZW1wdHkgU3RyaW5nW10sIHRvbwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZW1wdHlTdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHVibGljIEphdmFNZXRob2RKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JLyoqCi0JICogYWRkRXhjZXB0aW9ucyAtIHJlZmxlY3Qgb3VyIGV4Y2VwdGlvbiBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhjZXB0aW9ucygpIHsKLQkJQ2xhc3NbXSBleGNlcHRpb25zID0KLQkJCShnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCi0JCQkJPyAoKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRFeGNlcHRpb25UeXBlcygpCi0JCQkJOiAoKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCS8vCUVMaXN0IGV4TGlzdCA9IChFTGlzdCkgamF2YU1ldGhvZFRhcmdldC5wcmltUmVmVmFsdWUoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpKTsKLQkJTGlzdCBleExpc3QgPSBnZXRNZXRob2RUYXJnZXQoKS5nZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWV4TGlzdC5hZGQoY3JlYXRlSmF2YUNsYXNzUmVmKGV4Y2VwdGlvbnNbaV0uZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kSW1wbCBnZXRNZXRob2RUYXJnZXQoKSB7Ci0JCXJldHVybiAoTWV0aG9kSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCS8qKgotCSAqIGFkZFBhcmFtZXRlcnMgLSByZWZsZWN0IG91ciBwYXJtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlcnMoKSB7Ci0JCUNsYXNzW10gcGFybVR5cGVzID0KLQkJCShnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCi0JCQkJPyAoKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRQYXJhbWV0ZXJUeXBlcygpCi0JCQkJOiAoKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCU1ldGhvZEltcGwgamF2YU1ldGhvZFRhcmdldCA9IGdldE1ldGhvZFRhcmdldCgpOwotCQkvLyAJTGlzdCBwTGlzdCA9IChMaXN0KSBqYXZhTWV0aG9kVGFyZ2V0LnByaW1SZWZWYWx1ZShKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kX1BhcmFtZXRlcnMoKSk7Ci0JCUxpc3QgcExpc3QgPSBqYXZhTWV0aG9kVGFyZ2V0LmdldFBhcmFtZXRlcnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBMaXN0LmFkZChjcmVhdGVKYXZhUGFyYW1ldGVyKGphdmFNZXRob2RUYXJnZXQsICJhcmciICsgaSwgZ2V0VHlwZU5hbWUocGFybVR5cGVzW2ldKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gKChNZXRob2QpIGdldFRhcmdldCgpKS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JfQotCS8qKgotCSAqIGdldFBhcmVudFR5cGUgLSByZXR1cm4gdGhlIENsYXNzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIG91ciBwYXJlbnQgSmF2YUNsYXNzCi0JICogd2UncmUgZ29pbmcgdG8gZG8gdGhpcyBhIGxvdCwgc28gY2FjaGUgaXQuCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldFBhcmVudFR5cGUoKSB7Ci0JCWlmIChwYXJlbnRUeXBlID09IG51bGwpIHsKLQkJCU1ldGhvZCB0YXJnZXRNZXRob2QgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJCUphdmFDbGFzcyBwYXJlbnRKYXZhQ2xhc3MgPSB0YXJnZXRNZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJSmF2YUNsYXNzSkRLQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKREtBZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihwYXJlbnRKYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChwYSAhPSBudWxsKQotCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCS8qKgotCSAqIGdldFBhcm1UeXBlU2lnbmF0dXJlcyAtIHJldHVybiBhbiBhcnJheSBvZiBDbGFzc2VzIGZvciBvdXIgcGFyYW1ldGVyIHR5cGVzCi0JICogCUZvciByZWZsZWN0aW9uIHB1cnBvc2VzLCB3ZSBjYW4gb25seSByZWx5IG9uIG91ciBJRCwgc2luY2Ugb3VyIHBhcm1zIG1heQotCSAqICBub3QgeWV0IGJlIGtub3duLgotCSAqLwotCXByb3RlY3RlZCBDbGFzc1tdIGdldFBhcm1UeXBlcygpIHsKLQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJU3RyaW5nIGlkID0gKChYTUlSZXNvdXJjZSkgamF2YU1ldGhvZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQoamF2YU1ldGhvZFRhcmdldCk7Ci0JCVN0cmluZ1tdIHR5cGVOYW1lcyA9IGdldFR5cGVOYW1lc0Zyb21NZXRob2RJRChpZCk7Ci0JCWlmICh0eXBlTmFtZXMgPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzQXJyYXk7Ci0JCWludCBuID0gdHlwZU5hbWVzLmxlbmd0aDsKLQkJaWYgKG4gPT0gMCkKLQkJCXJldHVybiBlbXB0eUNsYXNzQXJyYXk7Ci0JCUNsYXNzW10gdHlwZXMgPSBuZXcgQ2xhc3Nbbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQl0eXBlc1tpXSA9IGdldFR5cGUodHlwZU5hbWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUFjY2Vzc2libGUoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7IAotICAgICAgICByZXR1cm4gc291cmNlQWNjZXNzaWJsZSAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRzb3VyY2VNZXRob2QgLSByZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgewotCQlpZiAoc291cmNlQWNjZXNzaWJsZSA9PSBudWxsKSB7Ci0JCQlDbGFzcyBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCUNsYXNzW10gcGFybVR5cGVzID0gdGhpcy5nZXRQYXJtVHlwZXMoKTsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VBY2Nlc3NpYmxlID0gcGFyZW50LmdldERlY2xhcmVkTWV0aG9kKCgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpLCBwYXJtVHlwZXMpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIE9LLCBjYW4ndCByZWZsZWN0IGl0Ci0JCQkJfQotCi0JCQkJaWYgKHNvdXJjZUFjY2Vzc2libGUgPT0gbnVsbCkgewotCQkJCQkvLyBJdCB3YXNuJ3QgYSBtZXRob2QsIHRyeSBmb3IgY29uc3RydWN0b3IuCi0JCQkJCXRyeSB7Ci0JCQkJCQlzb3VyY2VBY2Nlc3NpYmxlID0gcGFyZW50LmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFybVR5cGVzKTsKLQkJCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIE9LLCBjYW4ndCByZWZsZWN0IGl0Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUFjY2Vzc2libGU7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBVVUlELCBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBNZXRob2QgYWRhcHRvcjoKLQkgKgktIHNldCBtb2RpZmllcnMKLQkgKgktIHNldCBuYW1lCi0JICogCS0gc2V0IHJldHVybiB0eXBlCi0JICogCS0gYWRkIHBhcmFtZXRlcnMKLQkgKiAJLSBhZGQgZXhjZXB0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCWlmIChnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgIT0gbnVsbCkgewotCQkJKChNZXRob2QpIGdldFRhcmdldCgpKS5zZXRJc0dlbmVyYXRlZChmYWxzZSk7Ci0JCQlzZXRNb2RpZmllcnMoKTsKLQkJCXNldE5hbWluZygpOwotCQkJc2V0UmV0dXJuVHlwZSgpOwotCQkJYWRkUGFyYW1ldGVycygpOwotCQkJYWRkRXhjZXB0aW9ucygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXIjcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQkKLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlpbnQgbW9kaWZpZXJzID0KLQkJCShnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCi0JCQkJPyAoKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRNb2RpZmllcnMoKQotCQkJCTogKChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRNb2RpZmllcnMoKTsKLQkJbWV0aG9kVGFyZ2V0LnNldEFic3RyYWN0KGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzQWJzdHJhY3QobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRGaW5hbChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ZpbmFsKG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0TmF0aXZlKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzTmF0aXZlKG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0U3RhdGljKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0U3luY2hyb25pemVkKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3luY2hyb25pemVkKG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0Q29uc3RydWN0b3IoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpOwotCQkvLyBTZXQgdmlzaWJpbGl0eQotCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQlpZiAoKGphdmFDbGFzcy5nZXRLaW5kKCkgPT0gVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpIHx8IChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSkKLQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSkKLQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURV9MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSkKLQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQllbHNlCi0JCQkvL1Zpc2liaWxpdHkgbXVzdCBiZSBwYWNrYWdlCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0JfQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlCi0JICogCS0gcXVhbGlmaWVkIG5hbWUgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcwotCSAqCS0gSUQKLQkgKiAJLSBuYW1lLWJhc2VkIFVVSUQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCS8vCi0JCS8vCW5hbWluZyBpcyBjdXJyZW50bHkgYSBuby1vcCBzaW5jZSB0aGUgbmFtZSBhbmQgVVVJRCBtdXN0IGJlIHNldCBwcmlvciB0byByZWZsZWN0aW9uCi0JCS8vCS4uLmFuZCBJRCBpcyByZWR1bmRhbnQgd2l0aCBVVUlELgotCQkvLwlqYXZhRmllbGRUYXJnZXQuc2V0SUQocGFyZW50LmdldFF1YWxpZmllZE5hbWUoKSArICJfIiArIGphdmFGaWVsZFRhcmdldC5nZXROYW1lKCkpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciByZXR1cm4gdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmV0dXJuVHlwZSgpIHsKLQkJaWYgKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgewotCQkJQ2xhc3MgdHlwZSA9ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQkvKgotCQkJCQlKYXZhUGFyYW1ldGVyIG5ld1BhcmFtZXRlciA9IGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgInJlc3VsdCIsIGdldFR5cGVOYW1lKHR5cGUpKTsvLyROT04tTkxTLTEkCi0JCQkJCW5ld1BhcmFtZXRlci5zZXRQYXJhbWV0ZXJLaW5kKE1ldGFKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk4pOwotCQkJCQlqYXZhTWV0aG9kVGFyZ2V0LmdldFBhcmFtZXRlcnMoKS5hZGQobmV3UGFyYW1ldGVyKTsKLQkJCSovCi0JCQlqYXZhTWV0aG9kVGFyZ2V0LnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZihnZXRUeXBlTmFtZSh0eXBlKSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9ubHMvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL25scy9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmZTI5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL25scy9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImphdmFhZGFwdGVycyIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0JCQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYmVhbmluZm8vSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJmOTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYmVhbmluZm8vSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgQmVhbmluZm8gYWRhcHRlci4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICogaXMgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHNvIHRoYXQgYmVhbmluZm8gY29kZSB3aWxsIG5vdCBiZSBsb2FkZWQKLSAqIHVubGVzcyBpdCBuZWVkcyB0byBiZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRyb3NwZWN0aW9uQWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuY2xhc3M7Ci0JcHVibGljIHZvaWQgaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7Ci0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpOwotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCk7Ci0JcHVibGljIEJhc2ljRUxpc3QgZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0RXZlbnRzKCk7Ci0JcHVibGljIEVMaXN0IGdldEFsbEV2ZW50cygpOwotCXB1YmxpYyBFTGlzdCBnZXRBbGxQcm9wZXJ0aWVzKCk7CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5pdC9KYXZhSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmYxYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBJbml0aWFsaXplIHRoZSBKYXZhIFJlZmxlY3Rpb24gbWVjaGFuaXNtcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5pdCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHBsdWdpbl9pbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCWluaXQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCQkJcHJlUmVnaXN0ZXJQYWNrYWdlcygpOwotCQkJCXNldERlZmF1bHRSZXNvdXJjZUZhY3RvcnkoKTsKLQkJCX0KLQkJCS8vUmVnaXN0ZXIgcmVzb3VyY2UgZmFjdG9yeQotCQkJSmF2YVhNSUZhY3RvcnlJbXBsLnJlZ2lzdGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZVJlZ2lzdGVyUGFja2FnZXMoKSB7Ci0JCS8vZWNvcmUKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleSgiZWNvcmUueG1pIikpIC8vJE5PTi1OTFMtMSQKLQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dCgiZWNvcmUueG1pIiwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9qYXZhCi0JCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkoImphdmEueG1pIikpIC8vJE5PTi1OTFMtMSQKLQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dCgiamF2YS54bWkiLCBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UpOyAvLyROT04tTkxTLTEkCi0JfQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VGYWN0b3J5KCkgewotCQkvL1RoaXMgaXMgbm90IGRvbmUgb3V0c2lkZSBvZiBFY2xpcHNlCi0JCWlmIChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLmdldChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKSA9PSBudWxsKQotCQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoCi0JCQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwKLQkJCQluZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGx1Z2luSW5pdChib29sZWFuIGJQbHVnaW5Jbml0KSB7Ci0JCS8vIEhlcmUncyB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIGJlIHJlYWQuCi0JCXBsdWdpbl9pbml0aWFsaXplZCA9IGJQbHVnaW5Jbml0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ4OTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIEluc3RhbnRpYXRpb24gaGFuZGxlci4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICogaXMgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHNvIHRoYXQgaW5zdGFudGlhdGlvbiBjb2RlIHdpbGwgbm90IGJlIGxvYWRlZAotICogdW5sZXNzIGl0IG5lZWRzIHRvIGJlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaGFuZGxlcyB0aGUgZGF0YXR5cGUKLQkgKiBvciB3aGV0aGVyIHRoZSBzdGFuZGFyZCBFRmFjdG9yeSBkb2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNEYXRhVHlwZShKYXZhRGF0YVR5cGUgdHlwZSk7Ci0JCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBhZGFwdGVyIGhhbmRsZXMgdGhlIEVDbGFzcyBvciB0aGUKLQkgKiBzdGFuZGFyZCBFRmFjdG9yeSBkb2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNDbGFzcyhFQ2xhc3MgdHlwZSk7Ci0JCi0JLyoqCi0JICogSWYgYWRhcHRlckhhbmRsZXNJbnN0YW5jZSByZXR1cm5zIHRydWUsIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0byBjcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgamF2YUNsYXNzKTsKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGU1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgYSBmYWN0b3J5IGZvciBJSW5zdGFudGlhdGlvbkhhbmRsZXIncy4gSXQgaXMgYXR0YWNoZWQgYXMKLSAqIGFuIGFkYXB0ZXIgb24gdGhlIFJlc291cmNlU2V0IHRoYXQgY29udGFpbnMgdGhlIGphdmEgbW9kZWwuIEphdmFYTUlGYWN0b3J5Ci0gKiB3aWxsIHVzZSBpdCB0byByZXRyaWV2ZSBpdHMgSUluc3RhbnRpYXRpb25IYW5kbGVyLiBJZiB0aGUgYWRhcHRlciBpcyBub3QKLSAqIGZvdW5kLCB0aGVuIG5vIGluc3RhbnRpYXRpb24gaGFuZGxlciBleGlzdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuY2xhc3M7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIElJbnN0YW50aWF0aW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCBmYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTk1NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYW4gaW5zdGFuY2UuIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAqIGlzIGluIGEgc2VwYXJhdGUgcHJvamVjdCBzbyB0aGF0IGluc3RhbnRpYXRpb24gY29kZSB3aWxsIG5vdCBiZSBsb2FkZWQKLSAqIHVubGVzcyBpdCBuZWVkcyB0byBiZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFudGlhdGlvbkluc3RhbmNlIHsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBKYXZhSGVscGVycyBmb3IgdGhlIGphdmEgdHlwZSBvZiB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQXJyYXlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODVmNjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotLyoqCi0gKiBEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUKLSAqICAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUKLSAqICAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzCi0gKiAgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuCi0gKiAKLSAqICAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUKLSAqICAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLgotICogIAotICogICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDoKLSAqICAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJyYXlUeXBlIGV4dGVuZHMgSmF2YUNsYXNzewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEFycmF5RGltZW5zaW9ucyBhdHRyaWJ1dGUKLQkgKi8KLQlpbnQgZ2V0QXJyYXlEaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQXJyYXlEaW1lbnNpb25zIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0QXJyYXlEaW1lbnNpb25zKGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBDb21wb25lbnRUeXBlIHJlZmVyZW5jZQotCSAqLwotCUVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZSNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudFR5cGUoRUNsYXNzaWZpZXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotCSAqIAotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZwotCSAqIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlCi0JICogbmFtZS4KLQkgKi8KLQlKYXZhSGVscGVycyBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gCi0JICogCi0JICogSWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkCi0JICogYXJyYXkgdHlwZS4KLQkgKi8KLQlKYXZhSGVscGVycyBnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzCi0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZUFycmF5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTZXQgdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZShKYXZhSGVscGVycyBoZWxwZXJDb21wb25lbnRUeXBlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmODlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2sgZXh0ZW5kcyBFT2JqZWN0ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNvdXJjZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU291cmNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U291cmNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbnRlbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDb250ZW50cygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2NzcxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1lbnQgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0ZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0ZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGE4NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpZWxkIGV4dGVuZHMgRVR5cGVkRWxlbWVudHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0aWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSmF2YVZpc2liaWxpdHkgYXR0cmlidXRlCi0JICovCi0JSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNnZXRKYXZhVmlzaWJpbGl0eSA8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kCi0JICogQHNlZSAjZ2V0SmF2YVZpc2liaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zaWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2llbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRyYW5zaWVudChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0RmllbGRfVHJhbnNpZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1RyYW5zaWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNUcmFuc2llbnQgPGVtPlRyYW5zaWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNpZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1RyYW5zaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZvbGF0aWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZvbGF0aWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWb2xhdGlsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0RmllbGRfVm9sYXRpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVm9sYXRpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVm9sYXRpbGUgPGVtPlZvbGF0aWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Wb2xhdGlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNWb2xhdGlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Vm9sYXRpbGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBJbml0aWFsaXplciByZWZlcmVuY2UKLQkgKi8KLQlCbG9jayBnZXRJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRpYWxpemVyKEJsb2NrIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLgotCSAqLwotCWJvb2xlYW4gaXNBcnJheSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMmZlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzg1NjkwODQ3NDI3ODk3NjU2TDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTVNHX1BBVFRFUk4gPSBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJKYXZhX0luaF9DeWNsZV9FUlJPUl8iKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbihKYXZhQ2xhc3MgYVN1YmNsYXNzLCBKYXZhQ2xhc3MgYVN1cGVyY2xhc3MpIHsKLQkJdGhpcyhNZXNzYWdlRm9ybWF0LmZvcm1hdChNU0dfUEFUVEVSTiwgbmV3IE9iamVjdFtde2FTdWJjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCksIGFTdXBlcmNsYXNzLmdldFF1YWxpZmllZE5hbWUoKX0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU4ODk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0aWFsaXplciBleHRlbmRzIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0JQm9vbGVhbiBnZXRJc1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0SXNTdGF0aWMoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplciNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShCbG9jayB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyN2FkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBAZXh0ZW5kcyBKYXZhSGVscGVycwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcyA8ZW0+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0Q2xhc3NJbXBvcnQgPGVtPkNsYXNzIEltcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldFBhY2thZ2VJbXBvcnRzIDxlbT5QYWNrYWdlIEltcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRGaWVsZHMgPGVtPkZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRJbml0aWFsaXplcnMgPGVtPkluaXRpYWxpemVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldERlY2xhcmVkQ2xhc3NlcyA8ZW0+RGVjbGFyZWQgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldERlY2xhcmluZ0NsYXNzIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRKYXZhUGFja2FnZSA8ZW0+SmF2YSBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RXZlbnRzIDxlbT5FdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRBbGxFdmVudHMgPGVtPkFsbCBFdmVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFDbGFzcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ2xhc3MgZXh0ZW5kcyBFQ2xhc3MsIEphdmFIZWxwZXJzewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVRIT0RfTkFNRSA9ICIqIjsKLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFB1YmxpY01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSA7Ci0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIEZpZWxkcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuCi0JICogVGhlIGZpZWxkIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuCi0JICovICAKLQlwdWJsaWMgRmllbGRbXSBsaXN0RmllbGRFeHRlbmRlZCgpOwotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIG91ciBNZXRob2RzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuCi0JICogVGhlIG1ldGhvZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLgotCSAqLyAgCi0JcHVibGljIE1ldGhvZFtdIGxpc3RNZXRob2RFeHRlbmRlZCgpOwotLy9GQiAgIC8qKgotLy9GQiAgICAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGludGVybmFsIHJlZmxlY3Rpb24uIERvIG5vdCB1c2UuCi0vL0ZCICAgICovCi0vL0ZCICAgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBLaW5kIGF0dHJpYnV0ZQotCSAqLwotCVR5cGVLaW5kIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChUeXBlS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNQdWJsaWMgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1B1YmxpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljIDxlbT5QdWJsaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQdWJsaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1YmxpYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEltcGxlbWVudHNJbnRlcmZhY2VzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBDbGFzc0ltcG9ydCByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0Q2xhc3NJbXBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGFja2FnZUltcG9ydHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFBhY2thZ2VJbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpZWxkcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RmllbGRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1ldGhvZHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW5pdGlhbGl6ZXJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRJbml0aWFsaXplcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIERlY2xhcmluZ0NsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldERlY2xhcmluZ0NsYXNzIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVjbGFyaW5nQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlY2xhcmluZ0NsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIERlY2xhcmVkQ2xhc3NlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RGVjbGFyZWRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhUGFja2FnZSByZWZlcmVuY2UKLQkgKi8KLQlKYXZhUGFja2FnZSBnZXRKYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFdmVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEV2ZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIEV2ZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbGwgRXZlbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIEV2ZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFDbGFzc19BbGxFdmVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFsbEV2ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JYm9vbGVhbiBpc05lc3RlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCUZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSBmcm9tIHRoaXMgSmF2YUNsYXNzIG9yIGFueSBzdXBlcnR5cGVzLgotCSAqIAotCSAqIFJldHVybiBudWxsIGlmIGEgRmllbGQgbmFtZWQgZmllbGROYW1lIGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlGaWVsZCBnZXRGaWVsZEV4dGVuZGVkKFN0cmluZyBmaWVsZE5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCUZpZWxkIGdldEZpZWxkTmFtZWQoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlMaXN0IGdldEZpZWxkc0V4dGVuZGVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlCi0JICogc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0Ci0JICogZ2VuZXJhbCB0byBtb3N0IHNwZWNpZmljLgotCSAqLwotCUxpc3QgZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgCi0JICogaGllcmFyY2h5LgotCSAqLwotCU1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcyBleGNsdWRpbmcgcGFydGljdWxhciBjbGFzc2VzIGFuZCBtZXRob2RzLgotCSAqIEBwYXJhbSBleGNsdWRlZENsYXNzZXMgLSBBIGxpc3Qgb2YgSmF2YUNsYXNzIGluc3RhbmNlcyB0byBiZSBpZ25vcmVkLgotCSAqIEBwYXJhbSBleGNsdWRlZE1ldGhvZHMgLSBBIGxpc3Qgb2YgTWV0aG9kIGluc3RhbmNlcyB0byBiZSBpZ25vcmVkLgotCSAqLwotCUxpc3QgZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoTGlzdCBleGNsdWRlZENsYXNzZXMsIExpc3QgZXhjbHVkZWRNZXRob2RzKSA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZHMgdGhhdCBiZWdpbnMgd2l0aCBAYU1ldGhvZE5hbWVQcmVmaXggYW5kIGlzIG5vdAotCSAqIGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgCi0JICogd2lsbCBiZSByZXR1cm5lZC4KLQotCSAqLwotCUxpc3QgZ2V0T25seVNwZWNpZmljTWV0aG9kcyhTdHJpbmcgYU1ldGhvZE5hbWVQcmVmaXgsIExpc3QgZXhjbHVkZWROYW1lcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseQotCSAqIHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdAotCSAqIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JTWV0aG9kIGdldFB1YmxpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGl0IHdpbGwgbm90IGdvIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCUxpc3QgZ2V0UHVibGljTWV0aG9kcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlMaXN0IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0bwotCSAqIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlMaXN0IGdldFB1YmxpY01ldGhvZHNOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0U3VwZXJ0eXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUZXN0IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgdGhlIHBhc3NlZCBpbnRlcmZhY2UgKG9yIG9uZSBvZiBpdHMKLQkgKiBzdXBlcnR5cGVzKS4KLQkgKi8KLQlib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGludGVyZmFjZVR5cGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuCi0JICovCi0JU3RyaW5nIGluZm9TdHJpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tIHRoZSBwYXNzZWQgaW4gY2xhc3MuCi0JICovCi0JYm9vbGVhbiBpbmhlcml0c0Zyb20oSmF2YUNsYXNzIGphdmFDbGFzcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEb2VzIHRoaXMgdHlwZSBleGlzdC4KLQkgKi8KLQlib29sZWFuIGlzRXhpc3RpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJcyB0aGlzIGFuIGludGVyZmFjZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNldCB0aGUgc3VwZXJ0eXBlLgotCSAqLwotCXZvaWQgc2V0U3VwZXJ0eXBlKEphdmFDbGFzcyBqYXZhY2xhc3MpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHBhc3NlZCBKYXZhQ2xhc3MgY2FuIGJlIHNldCBhcyB0aGUgc3VwZXJ0eXBlCi0JICogb2YgdGhpcyBKYXZhQ2xhc3MuICBUaGlzIG1ldGhvZCB3aWxsIHRlc3QgdG8gc2VlIGlmIGFKYXZhQ2xhc3Mgd2lsbAotCSAqIGNyZWF0ZSBhIGN5Y2xlIGluIHRoZSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuICBSZXR1cm4gdHJ1ZSBpZiBubwotCSAqIGluaGVyaXRhbmNlIGN5Y2xlIHdpbGwgYmUgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkU3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSA7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZXMgdGhhdCByZXByZXNlbnQgdGhlIEJlYW5JbmZvIHByb3BlcnRpZXMgZm9yCi0JICoganVzdCB0aGlzIEphdmEgY2xhc3MsIG5vdCBpbmNsdWRpbmcgaW5oZXJpdGVkLiBJdCB3aWxsIHJldHVybiBhbnkgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogdGhhdCB3YXMgc3BlY2lmaWVkIGFzIGJlaW5nIGF0IHRoaXMgY2xhc3MgZWl0aGVyIHRocm91Z2ggdGhlIFhNSSBvdmVycmlkZSBkb2N1bWVudCBvcgotCSAqIHRocm91Z2ggdGhlIEJlYW5JbmZvLiBTdHJ1Y3R1cmFsIGZlYXR1cmVzIHRocm91Z2ggdGhlIFhNSSBtYXkgbm90IGJlIGJlYW4gcHJvcGVydGllcywKLQkgKiBidXQgdGhleSBhcmUgcGFydCBvZiB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIGF0IHRoaXMgY2xhc3Mgb25seS4gCi0JICogCi0JICogVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIGdldEVBdHRyaWJ1dGVzKCkgYW5kIGdldEVSZWZlcmVuY2VzKCkuCi0JICogCi0JICogVG8gcmV0cmlldmUgb25seSB0aGUgQmVhbiBQcm9wZXJ0aWVzLCB0aGVuIHVzZSBCZWFuaW5mbyAKLQkgKiBVdGlsaXRpZXMuZ2V0UHJvcGVydGllc0l0ZXJhdG9yKGphdmFjbGFzcy5nZXRQcm9wZXJ0aWVzKCkpIGFuZCB0aGlzIHdpbGwgaXRlcmF0ZSBvdmVyCi0JICogdGhlIEJlYW4gUHJvcGVydHlEZWNvcmF0b3JzLCBhbmQgZmlsdGVyIG91dCB0aGUgbm9uLWJlYW4gZmVhdHVyZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBwcm9wZXJ0aWVzIChhcyBFU3RydWN0dXJhbEZlYXR1cmUncykgZm9yIHRoaXMgamF2YSBjbGFzcy4gVGhpcyBsaXN0IGlzCi0JICogbm90IG1vZGlmaWFibGUuCi0JICovCi0JRUxpc3QgZ2V0UHJvcGVydGllcygpOwotCQotCS8qKgotCSAqIEdldCBhbGwgb2YgdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZXMgdGhhdCByZXByZXNlbnQgdGhlIEJlYW5JbmZvIHByb3BlcnRpZXMgZm9yCi0JICoganVzdCB0aGlzIEphdmEgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQuIEl0IHdpbGwgcmV0dXJuIGFueSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiB0aGF0IHdhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgWE1JIG92ZXJyaWRlIGRvY3VtZW50IG9yCi0JICogdGhyb3VnaCB0aGUgQmVhbkluZm8uIFN0cnVjdHVyYWwgZmVhdHVyZXMgdGhyb3VnaCB0aGUgWE1JIG1heSBub3QgYmUgYmVhbiBwcm9wZXJ0aWVzLAotCSAqIGJ1dCB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUuCi0JICogCi0JICogVGhlIGlzIGxpa2UgZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpIGV4Y2VwdCB0aGF0IGlmIEJlYW5JbmZvIGhpZGVzIGFueSBiZWFuIHByb3BlcnRpZXMKLQkgKiBmcm9tIHRoZSBzdXBlciBjbGFzcywgdGhpcyBsaXN0IHdpbGwgYWxzbyBoaWRlIHRoZW0sIHdoaWxlIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMKLQkgKiB3aWxsIG5vdC4KLQkgKiAKLQkgKiBUbyByZXRyaWV2ZSBvbmx5IHRoZSBCZWFuIFByb3BlcnRpZXMsIHRoZW4gdXNlIEJlYW5pbmZvIAotCSAqIFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IoamF2YWNsYXNzLmdldEFsbFByb3BlcnRpZXMoKSkgYW5kIHRoaXMgd2lsbCBpdGVyYXRlIG92ZXIKLQkgKiB0aGUgQmVhbiBQcm9wZXJ0eURlY29yYXRvcnMsIGFuZCBmaWx0ZXIgb3V0IHRoZSBub24tYmVhbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgaW5oZXJpdGVkLCAoYXMgRVN0cnVjdHVyYWxGZWF0dXJlJ3MpIGZvciB0aGlzIGNsYXNzLiBUaGlzIGxpc3QgaXMKLQkgKiBub3QgbW9kaWZpYWJsZS4KLQkgKi8KLQlFTGlzdCBnZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWZsZWN0aW9uIHR5cGUsIGlmIGl0IGV4aXN0cywgZm9yIHRoaXMgY2xhc3MuIElmIHJ1bm5pbmcgd2l0aGluIEVjbGlwc2UgdGhpcwotCSAqIHdpbGwgYmUgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlfSwgb3IgcnVubmluZyBvdXRzaWRlIG9mIEVjbGlwc2UgaXQgd2lsbCBiZSBhIHtAbGluayBqYXZhLmxhbmcuQ2xhc3N9LgotCSAqIAotCSAqIEByZXR1cm4gSVR5cGUgaWYgaW4gRWNsaXBzZSwgQ2xhc3MgaWYgb3V0c2lkZSBFY2xpcHNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0eXBlIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlPYmplY3QgZ2V0UmVmbGVjdGlvblR5cGUoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YURhdGFUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFEYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWMwYjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBleHRlbmRzIEphdmFIZWxwZXJzCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhRGF0YVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YURhdGFUeXBlIGV4dGVuZHMgRUNsYXNzLCBKYXZhSGVscGVyc3sKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWU5NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgRXZlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUV2ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRXZlbnQgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmV7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmZmMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhSGVscGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzI3LzIwMDAgNDo0MjowNCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSGVscGVycyBleHRlbmRzIEVDbGFzcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX05BTUUgPSAiamF2YS5sYW5nLkJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfTkFNRSA9ICJqYXZhLmxhbmcuQ2hhcmFjdGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9OQU1FID0gImphdmEubGFuZy5CeXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX05BTUUgPSAiamF2YS5sYW5nLkRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX05BTUUgPSAiamF2YS5sYW5nLkZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URUdFUl9OQU1FID0gImphdmEubGFuZy5JbnRlZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19OQU1FID0gImphdmEubGFuZy5Mb25nIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSA9ICJqYXZhLmxhbmcuU2hvcnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JPT0xFQU5fTkFNRSA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9DSEFSQUNURVJfTkFNRSA9ICJjaGFyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CWVRFX05BTUUgPSAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRE9VQkxFX05BTUUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9GTE9BVF9OQU1FID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9JTlRFR0VSX05BTUUgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9MT05HX05BTUUgPSAibG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fU0hPUlRfTkFNRSA9ICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fTk9UX0lEID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fQk9PTEVBTl9JRCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0NIQVJBQ1RFUl9JRCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0JZVEVfSUQgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9ET1VCTEVfSUQgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9GTE9BVF9JRCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0lOVEVHRVJfSUQgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9MT05HX0lEID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fU0hPUlRfSUQgPSA4OwotCQotCS8qKgotCSAqIEdldCB0aGUgcXVhbGlmaWVkIG5hbWUgKHdpdGggdXNpbmcgJy4nIGZvciBpbm5lciBjbGFzc2VzKS4gV2lsbCByZXR1cm4gdGhlIG5hbWUgaWYgcHJpbWl0aXZlIHRvbyAoZS5nLiAiYm9vbGVhbiIpCi0JICogTm90ZTogVGhpcyBzaG91bGQgb2YgYmVlbiBnZXQgdGhlIHNpbXBsZSBuYW1lIGFuZCBub3QgdGhlIHF1YWxpZmVkIG5hbWUsIGJ1dCBpdCBpcyB0b28gbGF0ZSBhbmQgaGFzIGJlZW4gZXN0YWJsaXNoZWQKLQkgKiBhcyB0aGUgQVBJLiBVc2UgPGNvZGU+Z2V0U2ltcGxlTmFtZSgpPC9jb2RlPiBpbnN0ZWFkIGlmIHlvdSB3YW50IHRoZSBuYW1lIG5vdCBxdWFsaWZpZWQuCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUuCi0JICogQHNlZSBKYXZhSGVscGVycyNnZXRTaW1wbGVOYW1lKCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCk7Ci0JLyoqCi0JICogR2V0IHRoZSBzaW1wbGUgbmFtZS4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJpbWl0aXZlLCBvciBpZiBhIGNsYXNzLCB0aGUgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlLiBBbmQgaWYgaXQgaXMgYW4KLQkgKiBpbm5lciBjbGFzcywgaXQgd2lsbCB1c2UgJy4nIGluc3RlYWQgb2YgJyQnLiBJZiB5b3Ugd2FudCB0aGUgc2ltcGxlIG5hbWUgZm9yIHJlZmxlY3Rpb24gKGkuZS4gd2l0aCAnJCcpIHVzZSA8Y29kZT5nZXROYW1lKCk8L2NvZGU+LgotCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIChubyBwYWNrYWdlKSBvZiB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcHJpbWl0aXZlIHR5cGUgdGhhdCB0aGlzIGhlbHBlciB3cmFwcGVycyBvciBpcyAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiB0eXBlcyByZXR1cm4gImludCIgdHlwZSkuIElmIG5vdCBhIHByaW1pdGl2ZQotCSAqIG9yIGEgd3JhcHBlciBmb3IgYSBwcmltaXRpdmUsIHRoZW4gcmV0dXJuIG51bGwuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhRGF0YVR5cGUgZ2V0UHJpbWl0aXZlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwcmltaXRpdmUgaWQgdGhhdCB0aGlzIGhlbHBlciB3cmFwcGVycyBvciBpcyAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiB3aWxsIHJldHVybiB7QGxpbmsgSmF2YUhlbHBlcnMjUFJJTV9JTlRFR0VSX0lEfSkuIElmCi0JICogbm90IGEgd3JhcHBlciBmb3IgYSBwcmltaXRpdmUgdGhlbiByZXR1cm4ge0BsaW5rIEphdmFIZWxwZXJzI1BSSU1fTk9UX0lEfS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpOwotCS8qKgotCSAqIFRvIGJlIHVzZWQgYnkgcGVvcGxlIHRoYXQgbmVlZCB0byBnZXQgdGhlIHF1YWxpZmllZCBuYW1lLiBUaGlzIHdvdWxkIHVzZSAnLicgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiBhbmQgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lLgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lLCBpbmNsdWRpbmcgcGFja2FnZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8JCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JcHVibGljIEphdmFDbGFzcyBnZXRXcmFwcGVyKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpOwotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbgotCSAqIG9iamVjdCBvZiB0aGlzIGNsYXNzPyBJbiBvdGhlciB3b3JkcyBpcyB0aGlzIGNsYXNzIGEKLQkgKiBzdXBlcnR5cGUgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcywgb3IgaXMgaXQgc3VwZXJpbnRlcmZhY2UKLQkgKiBvZiBpdD8gT3IgaW4gdGhlIGNhc2Ugb2YgcHJpbWl0aXZlcywgYXJlIHRoZXkgdGhlIHNhbWUuIAotCSAqIEBwYXJhbSBhQ2xhc3MKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFzc2lnbmFibGUgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShFQ2xhc3NpZmllciBhQ2xhc3MpOwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IHBlb3BsZSB0aGF0IG5lZWQgdG8gZ2V0IHRoZSBxdWFsaWZpZWQgbmFtZSB1c2VkIGZvciByZWZsZWN0aW9uLiBUaGlzIHdvdWxkIHVzZSAnJCcgaW5zdGVhZCBvZiAnLicgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiBhbmQgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lLgotCSAqIFR5cGljYWxseSBiZWFuIGluZm8gd291bGQgbmVlZCB0byB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSwgdXNlICckJyBmb3IgaW5uZXIgY2xhc3NlcwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSA7CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdjMzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotcHVibGljIGludGVyZmFjZSBKYXZhUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSUQgPSAiKnBhY2thZ2UiOwkvLyBUaGUgaWQgKHRoZSBwYXJ0IHRoYXQgZ29lcyBhZnRlciB0aGUgJyMnIGZvciBhIGphdmEgcGFja2FnZS4pIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJLy8gVGhlcmUgd2lsbCBvbmx5IGJlIG9uZSBwYWNrYWdlIHBlciBqYXZhIHJlc291cmNlIHNvIGl0Ci0JCQkJCQkJCQkJCQkJCS8vIGNhbiBiZSB1bmlxdWUuIE5vIGphdmEgdHlwZXMsIG1ldGhvZHMsIGZpZWxkcyBpZHMgY2FuCi0JCQkJCQkJCQkJCQkJCS8vIHN0YXJ0IHdpdGggYW4gYXN0ZXJpY2sgc28gd2lsbCBiZSB1bmlxdWUuCi0JCQkJCQkJCQkJCQkJCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1JVElWRV9QQUNLQUdFX05BTUUgPSAiXy1qYXZhcHJpbSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEphdmFDbGFzc2VzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRKYXZhQ2xhc3NlcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIDsKLQotfSAvL0phdmFQYWNrYWdlCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmNDJkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVBhcmFtZXRlciBleHRlbmRzIEVQYXJhbWV0ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUGFyYW1ldGVyS2luZCBhdHRyaWJ1dGUKLQkgKi8KLQlKYXZhUGFyYW1ldGVyS2luZCBnZXRQYXJhbWV0ZXJLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2dldFBhcmFtZXRlcktpbmQgPGVtPlBhcmFtZXRlciBLaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyS2luZAotCSAqIEBzZWUgI2dldFBhcmFtZXRlcktpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlcktpbmQoSmF2YVBhcmFtZXRlcktpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSBhbiBhcnJheSB0eXBlLgotCSAqLwotCWJvb2xlYW4gaXNBcnJheSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBhIHJldHVybiBwYXJhbWV0ZXIuCi0JICovCi0JYm9vbGVhbiBpc1JldHVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCVN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXJLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXJLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzI0ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIElOPTAKLSAqIE9VVD0xCi0gKiBJTk9VVD0yCi0gKiBSRVRVUk49MwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhUGFyYW1ldGVyS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFQYXJhbWV0ZXJLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU4gPSAwOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI09VVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUID0gMTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOT1VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk9VVCA9IDI7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjUkVUVVJOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRVUk4gPSAzOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgSU5fTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChJTiwgIklOIiwgIklOIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI09VVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIE9VVF9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKE9VVCwgIk9VVCIsICJPVVQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOT1VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgSU5PVVRfTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChJTk9VVCwgIklOT1VUIiwgIklOT1VUIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVRVUk48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVRVUk48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI1JFVFVSTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIFJFVFVSTl9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKFJFVFVSTiwgIlJFVFVSTiIsICJSRVRVUk4iKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSmF2YVBhcmFtZXRlcktpbmRbXSB7Ci0JCQlJTl9MSVRFUkFMLAotCQkJT1VUX0xJVEVSQUwsCi0JCQlJTk9VVF9MSVRFUkFMLAotCQkJUkVUVVJOX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVBhcmFtZXRlcktpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUGFyYW1ldGVyS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUphdmFQYXJhbWV0ZXJLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTjogcmV0dXJuIElOX0xJVEVSQUw7Ci0JCQljYXNlIE9VVDogcmV0dXJuIE9VVF9MSVRFUkFMOwotCQkJY2FzZSBJTk9VVDogcmV0dXJuIElOT1VUX0xJVEVSQUw7Ci0JCQljYXNlIFJFVFVSTjogcmV0dXJuIFJFVFVSTl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKYXZhUGFyYW1ldGVyS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vSmF2YVBhcmFtZXRlcktpbmQKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjFiMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWZGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhUmVmRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb3h5IHJlZmVyZW5jZSB0byB0aGUgY2xhc3MgbmFtZS4KLQkgKiBAcGFyYW0gdGFyZ2V0TmFtZSBDbGFzc25hbWUgdG8gY3JlYXRlIGEgcHJveHkgcmVmZXJlbmNlIHRvLiBUaGlzIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLgotCSAqIEByZXR1cm4gQSBwcm94eSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKTsKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIGphdmEgdHlwZSAoY2xhc3Mgb3IgcHJpbWl0aXZlKSBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBvciB0eXBlIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogPHA+TG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogQHBhcmFtIGFRdWFsaWZpZWROYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGNsYXNzIG9yIHByaW1pdGl2ZSAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5pbnQ8L2NvZGU+Ci0JICogQHBhcmFtIHJlbGF0ZWRPYmplY3QgRU9iamVjdCB0aGF0IGl0IHdpbGwgYmUgcmVsYXRlZCB0b28gKGl0IHdpbGwgbG9vayB0aHJvdWdoIHRoZSByZXNvdXJjZSBzZXQncyBwcm9qZWN0IG9mIHRoZSBFT2JqZWN0KQotCSAqIEByZXR1cm4gVGhlIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCByZWxhdGVkT2JqZWN0IGlzIG5vdCBjb250YWluZWQgYnkgYSByZXNvdXJjZSBzZXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBFT2JqZWN0IHJlbGF0ZWRPYmplY3QpOwotCQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgamF2YSB0eXBlIChjbGFzcyBvciBwcmltaXRpdmUpIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIG9yIGNsYXNzIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogQHBhcmFtIGFRdWFsaWZpZWROYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGNsYXNzIG9yIHByaW1pdGl2ZSAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5pbnQ8L2NvZGU+LiAKLQkgKiBAcGFyYW0gc2V0IFJlc291cmNlIHNldCB0byB1c2UuIEl0cyBwcm9qZWN0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlLgotCSAqIEByZXR1cm4gVGhlIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsJCi0JCi0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSB0eXBlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBwYXJhbSBhUGFja2FnZU5hbWUgUGFja2FnZSBuYW1lCi0JICogQHBhcmFtIGFUeXBlTmFtZSBUeXBlIG5hbWUgCi0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVBhY2thZ2VOYW1lLCBTdHJpbmcgYVR5cGVOYW1lLCBSZXNvdXJjZVNldCBzZXQpOwotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHBhY2thZ2UKLQkgKiBAcGFyYW0gc2V0IFJlc291cmNlIHNldCB0byB1c2UuIEl0cyBwcm9qZWN0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBwYWNrYWdlLgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFQYWNrYWdlIHJlZmxlY3RQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsKLQkKLQkvKioKLQkgKiBUaGUgc2NoZW1lIGZvciBhIGphdmEgVVJJLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUFJPVE9DT0xfVVJJX1NDSEVNRSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVVJJIGZvciBhY2Nlc3NpbmcgYSB0eXBlIHRocm91Z2gge0BsaW5rIFJlc291cmNlU2V0I2dldEVPYmplY3QoVVJJLCBib29sZWFuKX0uCi0JICogQHBhcmFtIGFRdWFsaWZpZWROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVHlwZVVSSShTdHJpbmcgYVF1YWxpZmllZE5hbWUpOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVVJJIGZvciBhY2Nlc3NpbmcgYSB0eXBlIHRocm91Z2gge0BsaW5rIFJlc291cmNlU2V0I2dldEVPYmplY3QoVVJJLCBib29sZWFuKX0uCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2UgbmFtZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIDxjb2RlPiIiPC9jb2RlPiBmb3IgcHJpbWl0aXZlcyBvciBkZWZhdWx0IHBhY2thZ2UpCi0JICogQHBhcmFtIHR5cGVOYW1lIHR5cGUgbmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVVJJIGZvciBhY2Nlc3NpbmcgYSBwYWNrYWdlIHRocm91Z2gge0BsaW5rIFJlc291cmNlU2V0I2dldEVPYmplY3QoVVJJLCBib29sZWFuKX0uCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2UgbmFtZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIDxjb2RlPiIiPC9jb2RlPiBmb3IgcHJpbWl0aXZlcyBvciBkZWZhdWx0IHBhY2thZ2UpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlUGFja2FnZVVSSShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCS8qKgotCSAqIEdldCBqdXN0IHRoZSB0eXBlIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSB0eXBlVVJJCi0JICogQHJldHVybiB0aGUgdHlwZSBuYW1lIG9yIDxjb2RlPiIiPC9jb2RlPiBpZiBub3QgYSB2YWxpZCB0eXBlIFVSSQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vdCBhIHZhbGlkIHR5cGUgVVJJCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZShVUkkgdHlwZVVSSSk7Ci0JCi0JLyoqCi0JICogR2V0IGp1c3QgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBAcGFyYW0gamF2YVVSSSBlaXRoZXIgYSB0eXBlIG9yIGEgcGFja2FnZSBVUkkuCi0JICogQHJldHVybiBwYWNrYWdlIG5hbWUgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIGRlZmF1bHQgcGFja2FnZSBvciBwcmltaXRpdmUuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm90IGEgdmFsaWQgcGFja2FnZSBvciB0eXBlIFVSSQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoVVJJIGphdmFVUkkpOwotCQotCS8qKgotCSAqIEdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZS4KLQkgKiBAcGFyYW0gdHlwZVVSSQotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIG5vdCBhIHZhbGlkIHR5cGUgVVJJCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm90IGEgdmFsaWQgdHlwZSBVUkkKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUeXBlTmFtZShVUkkgdHlwZVVSSSk7Ci0JCi0JLyoqCi0JICogSXMgdGhpcyBhIHZhbGlkIGphdmEgdXJpLgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKYXZhVVJJKFVSSSB1cmkpOwotCi0JLyoqCi0JICogSXMgdGhpcyBhIHZhbGlkIHR5cGUgdXJpLgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUeXBlVVJJKFVSSSB1cmkpOwotCQotCS8qKgotCSAqIElzIHRoaXMgYSB2YWxpZCBwYWNrYWdlIHVyaS4KLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZVVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSB2YWx1ZSB3aXRoIGFuIGFycmF5IG9mIHRoZSBjb21wb25lbnQgdHlwZQotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGNvbXBvbmVudFR5cGUpOwotCS8qKgotCSAqIEByZXR1cm4gQXJyYXlUeXBlIHZhbHVlIHdpdGggYW4gYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zIGFuZCBmaW5hbCBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZCB2YWx1ZQotCSAqLwotCU1ldGhvZCBjcmVhdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUNsYXNzIHZhbHVlCi0JICovCi0JSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWVsZCB2YWx1ZQotCSAqLwotCUZpZWxkIGNyZWF0ZUZpZWxkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEJsb2NrIHZhbHVlCi0JICovCi0JQmxvY2sgY3JlYXRlQmxvY2soKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29tbWVudCB2YWx1ZQotCSAqLwotCUNvbW1lbnQgY3JlYXRlQ29tbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTdGF0ZW1lbnQgdmFsdWUKLQkgKi8KLQlTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRpYWxpemVyIHZhbHVlCi0JICovCi0JSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlciB2YWx1ZQotCSAqLwotCUphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcnJheVR5cGUgdmFsdWUKLQkgKi8KLQlBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFEYXRhVHlwZSB2YWx1ZQotCSAqLwotCUphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhY2thZ2UgdmFsdWUKLQkgKi8KLQlKYXZhUGFja2FnZSBjcmVhdGVKYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JSmF2YVJlZlBhY2thZ2UgZ2V0SmF2YVJlZlBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTNhZjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBKYXZhUmVmUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlZlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiamF2YSI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTUyA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX1RZUEVfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX1RZUEVfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VUWVBFX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FVFlQRV9QQVJBTUVURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9DTEFTU19fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VHRU5FUklDX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUdFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fS0lORCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX1BVQkxJQyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRklFTERTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fTUVUSE9EUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VWRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19BTExfRVZFTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTEQgPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0QgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUiA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFID0gOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9FVkVOVCA9IDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0UgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DSyA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlQgPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlQgPSA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSX19JU19TVEFUSUMgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fSkFWQV9DTEFTUyA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSX19TT1VSQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRJQUxJWkVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX05BTUUgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FR0VORVJJQ19UWVBFID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTiA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19FT1BFUkFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX05BTUUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX01BTlkgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VHRU5FUklDX1RZUEUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUdFTkVSSUNfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRVRZUEVfUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FVFlQRV9QQVJBTUVURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VQQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VQQVJBTUVURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeGNlcHRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VFWENFUFRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VFWENFUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIEV4Y2VwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUdFTkVSSUNfRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FR0VORVJJQ19FWENFUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fTkFUSVZFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3luY2hyb25pemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19TWU5DSFJPTklaRUQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRklOQUwgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25zdHJ1Y3RvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fQ09OU1RSVUNUT1IgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0aWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1NUQVRJQyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fSkFWQV9WSVNJQklMSVRZID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX0pBVkFfRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX0pBVkFfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19TT1VSQ0UgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRUdFTkVSSUNfVFlQRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fRUdFTkVSSUNfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0aWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fU1RBVElDID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19KQVZBX1ZJU0lCSUxJVFkgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX0pBVkFfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19JTklUSUFMSVpFUiA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fU09VUkNFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0tfX05BTUUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fQ09OVEVOVFMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJsb2NrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJMT0NLX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX1NPVVJDRSA9IEJMT0NLX19TT1VSQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX05BTUUgPSBCTE9DS19fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09NTUVOVF9fQ09OVEVOVFMgPSBCTE9DS19fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01NRU5UX0ZFQVRVUkVfQ09VTlQgPSBCTE9DS19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlRfX1NPVVJDRSA9IEJMT0NLX19TT1VSQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVF9fTkFNRSA9IEJMT0NLX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlRfX0NPTlRFTlRTID0gQkxPQ0tfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0YXRlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJMT0NLX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX05BTUUgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTlNfVVJJID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19OU19VUkk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5zIFByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTlNfUFJFRklYID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19OU19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhY3RvcnkgSW5zdGFuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ2xhc3NpZmllcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1YnBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRVNVQlBBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfVFlQRV9OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfVFlQRV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FVFlQRV9QQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVRZUEVfUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUdFTkVSSUNfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQU5OT1RBVElPTlMgPSBKQVZBX0NMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fTkFNRSA9IEpBVkFfQ0xBU1NfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEpBVkFfQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5TVEFOQ0VfVFlQRV9OQU1FID0gSkFWQV9DTEFTU19fSU5TVEFOQ0VfVFlQRV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VQQUNLQUdFID0gSkFWQV9DTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGUgUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVRZUEVfUEFSQU1FVEVSUyA9IEpBVkFfQ0xBU1NfX0VUWVBFX1BBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19BQlNUUkFDVCA9IEpBVkFfQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOVEVSRkFDRSA9IEpBVkFfQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VTVVBFUl9UWVBFUyA9IEpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRU9QRVJBVElPTlMgPSBKQVZBX0NMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfQVRUUklCVVRFUyA9IEpBVkFfQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA9IEpBVkFfQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVJFRkVSRU5DRVMgPSBKQVZBX0NMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFUVFJJQlVURVMgPSBKQVZBX0NMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgPSBKQVZBX0NMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA9IEpBVkFfQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEpBVkFfQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTID0gSkFWQV9DTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBBUlJBWV9UWVBFX19FSURfQVRUUklCVVRFID0gSkFWQV9DTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVMgPSBKQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUdFTkVSSUNfU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUyA9IEpBVkFfQ0xBU1NfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19LSU5EID0gSkFWQV9DTEFTU19fS0lORDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fUFVCTElDID0gSkFWQV9DTEFTU19fUFVCTElDOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRklOQUwgPSBKQVZBX0NMQVNTX19GSU5BTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTVBMRU1FTlRTX0lOVEVSRkFDRVMgPSBKQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0NMQVNTX0lNUE9SVCA9IEpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fUEFDS0FHRV9JTVBPUlRTID0gSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19GSUVMRFMgPSBKQVZBX0NMQVNTX19GSUVMRFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX01FVEhPRFMgPSBKQVZBX0NMQVNTX19NRVRIT0RTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTklUSUFMSVpFUlMgPSBKQVZBX0NMQVNTX19JTklUSUFMSVpFUlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0RFQ0xBUkVEX0NMQVNTRVMgPSBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1MgPSBKQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0pBVkFfUEFDS0FHRSA9IEpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVZFTlRTID0gSkFWQV9DTEFTU19fRVZFTlRTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19BTExfRVZFTlRTID0gSkFWQV9DTEFTU19fQUxMX0VWRU5UUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyA9IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFID0gSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJyYXkgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0VWRU5UX19OQU1FID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX01BTlkgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0VHRU5FUklDX1RZUEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRUdFTkVSSUNfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fQ0hBTkdFQUJMRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1VOU0VUVEFCTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXJpdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVSSVZFRCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgRXZlbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9WSVNJQklMSVRZX0tJTkQgPSAxMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfS0lORCA9IDE0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SlR5cGUgSmF2YSBIZWxwZXJzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEpUeXBlSmF2YUhlbHBlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlRZUEVfSkFWQV9IRUxQRVJTID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkpUeXBlIExpc3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SlR5cGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpUWVBFX0xJU1QgPSAxNjsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRZUEVfS0lORCA9IDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImphdmEueG1pIjsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qZW0uamF2YSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFSZWZQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUNsYXNzIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljIDxlbT5QdWJsaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMoKQotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX1B1YmxpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsKCkKLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFDbGFzc19GaW5hbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfSW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0NsYXNzSW1wb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19NZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmluZ0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0phdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19FdmVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWVsZCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9GaW5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhdGljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNTdGF0aWMoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9TdGF0aWMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfSmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNUcmFuc2llbnQgPGVtPlRyYW5zaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zaWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVHJhbnNpZW50KCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfVHJhbnNpZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVm9sYXRpbGUgPGVtPlZvbGF0aWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Vm9sYXRpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1ZvbGF0aWxlKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfVm9sYXRpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmllbGRfSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpZWxkX0luaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0Fic3RyYWN0IDxlbT5BYnN0cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFic3RyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc05hdGl2ZSA8ZW0+TmF0aXZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmF0aXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzTmF0aXZlKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9OYXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3luY2hyb25pemVkIDxlbT5TeW5jaHJvbml6ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW5jaHJvbml6ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0ZpbmFsKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9GaW5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNDb25zdHJ1Y3RvciA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25zdHJ1Y3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXRpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N0YXRpYygpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9KYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RfUGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYXJhbWV0ZXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFQYXJhbWV0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNpc0ZpbmFsKCkKLQkgKiBAc2VlICNnZXRKYXZhUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFQYXJhbWV0ZXJfUGFyYW1ldGVyS2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcnJheVR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEFycmF5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnJheVR5cGVfQXJyYXlEaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFEYXRhVHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YURhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFFdmVudCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUV2ZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYWNrYWdlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhUGFja2FnZV9KYXZhQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBCbG9jayBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QmxvY2soKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmxvY2tfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEJsb2NrX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QmxvY2tfQ29udGVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29tbWVudCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTdGF0ZW1lbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBJbml0aWFsaXplciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhVmlzaWJpbGl0eUtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYXJhbWV0ZXJLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEphdmFQYXJhbWV0ZXJLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFR5cGVLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFR5cGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpUeXBlTGlzdCBvYmplY3QKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SlR5cGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpUeXBlSmF2YUhlbHBlcnMgb2JqZWN0Ci0JICovCi0JRURhdGFUeXBlIGdldEpUeXBlSmF2YUhlbHBlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUphdmFSZWZGYWN0b3J5IGdldEphdmFSZWZGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhQ2xhc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX0NMQVNTX19LSU5EID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19LaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdWJsaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX0NMQVNTX19QVUJMSUMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX1B1YmxpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX0NMQVNTX19GSU5BTCA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfRmluYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudHMgSW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgSW1wb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0NsYXNzSW1wb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlIEltcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfUGFja2FnZUltcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpZWxkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fRklFTERTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19GaWVsZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX01ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWxpemVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fSU5JVElBTElaRVJTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlY2xhcmVkIENsYXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVjbGFyaW5nIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBQYWNrYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXZlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19FVkVOVFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0V2ZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWxsIEV2ZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fQUxMX0VWRU5UUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkluaXRpYWxpemVySW1wbCA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkluaXRpYWxpemVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEluaXRpYWxpemVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOSVRJQUxJWkVSID0gZUlOU1RBTkNFLmdldEluaXRpYWxpemVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTdGF0aWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUSUFMSVpFUl9fSVNfU1RBVElDID0gZUlOU1RBTkNFLmdldEluaXRpYWxpemVyX0lzU3RhdGljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOSVRJQUxJWkVSX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldEluaXRpYWxpemVyX0phdmFDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5JVElBTElaRVJfX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRJbml0aWFsaXplcl9Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVBhcmFtZXRlckltcGwgPGVtPkphdmEgUGFyYW1ldGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUGFyYW1ldGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFQYXJhbWV0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9QQVJBTUVURVIgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhcmFtZXRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1BBUkFNRVRFUl9fRklOQUwgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhcmFtZXRlcl9QYXJhbWV0ZXJLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGwgPGVtPk1ldGhvZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuTWV0aG9kSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldE1ldGhvZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fQUJTVFJBQ1QgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYXRpdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX05BVElWRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RfTmF0aXZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5jaHJvbml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX1NZTkNIUk9OSVpFRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RfU3luY2hyb25pemVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fRklOQUwgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0ZpbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25zdHJ1Y3RvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fQ09OU1RSVUNUT1IgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0NvbnN0cnVjdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGF0aWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX1NUQVRJQyA9IGVJTlNUQU5DRS5nZXRNZXRob2RfU3RhdGljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX0pBVkFfVklTSUJJTElUWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9fUEFSQU1FVEVSUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RfUGFyYW1ldGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBFeGNlcHRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfX0pBVkFfRVhDRVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldE1ldGhvZF9KYXZhQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9fU09VUkNFID0gZUlOU1RBTkNFLmdldE1ldGhvZF9Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuRmllbGRJbXBsIDxlbT5GaWVsZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuRmllbGRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0RmllbGQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklFTEQgPSBlSU5TVEFOQ0UuZ2V0RmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklFTERfX0ZJTkFMID0gZUlOU1RBTkNFLmdldEZpZWxkX0ZpbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGF0aWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUVMRF9fU1RBVElDID0gZUlOU1RBTkNFLmdldEZpZWxkX1N0YXRpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklFTERfX0pBVkFfVklTSUJJTElUWSA9IGVJTlNUQU5DRS5nZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklFTERfX1RSQU5TSUVOVCA9IGVJTlNUQU5DRS5nZXRGaWVsZF9UcmFuc2llbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklFTERfX1ZPTEFUSUxFID0gZUlOU1RBTkNFLmdldEZpZWxkX1ZvbGF0aWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJRUxEX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldEZpZWxkX0phdmFDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUVMRF9fSU5JVElBTElaRVIgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfSW5pdGlhbGl6ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQmxvY2tJbXBsIDxlbT5CbG9jazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQmxvY2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0QmxvY2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQkxPQ0sgPSBlSU5TVEFOQ0UuZ2V0QmxvY2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJMT0NLX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0QmxvY2tfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQkxPQ0tfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QmxvY2tfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJMT0NLX19DT05URU5UUyA9IGVJTlNUQU5DRS5nZXRCbG9ja19Db250ZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5Db21tZW50SW1wbCA8ZW0+Q29tbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQ29tbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRDb21tZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29tbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5TdGF0ZW1lbnRJbXBsIDxlbT5TdGF0ZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLlN0YXRlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRTdGF0ZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1RBVEVNRU5UID0gZUlOU1RBTkNFLmdldFN0YXRlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUGFja2FnZUltcGwgPGVtPkphdmEgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YVBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldEphdmFQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTID0gZUlOU1RBTkNFLmdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFEYXRhVHlwZUltcGwgPGVtPkphdmEgRGF0YSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRGF0YVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YURhdGFUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfREFUQV9UWVBFID0gZUlOU1RBTkNFLmdldEphdmFEYXRhVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5BcnJheVR5cGVJbXBsIDxlbT5BcnJheSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5BcnJheVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0QXJyYXlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSUkFZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXJyYXlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcnJheSBEaW1lbnNpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyA9IGVJTlNUQU5DRS5nZXRBcnJheVR5cGVfQXJyYXlEaW1lbnNpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFID0gZUlOU1RBTkNFLmdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFFdmVudEltcGwgPGVtPkphdmEgRXZlbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFFdmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhRXZlbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9FVkVOVCA9IGVJTlNUQU5DRS5nZXRKYXZhRXZlbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kIDxlbT5UeXBlIEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0VHlwZUtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBUWVBFX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0VHlwZUtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZCA8ZW0+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFWaXNpYmlsaXR5S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIEpBVkFfVklTSUJJTElUWV9LSU5EID0gZUlOU1RBTkNFLmdldEphdmFWaXNpYmlsaXR5S2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcktpbmQgPGVtPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YVBhcmFtZXRlcktpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBKQVZBX1BBUkFNRVRFUl9LSU5EID0gZUlOU1RBTkNFLmdldEphdmFQYXJhbWV0ZXJLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5KVHlwZSBKYXZhIEhlbHBlcnM8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEpUeXBlSmF2YUhlbHBlcnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSlRZUEVfSkFWQV9IRUxQRVJTID0gZUlOU1RBTkNFLmdldEpUeXBlSmF2YUhlbHBlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkpUeXBlIExpc3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEpUeXBlTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBKVFlQRV9MSVNUID0gZUlOU1RBTkNFLmdldEpUeXBlTGlzdCgpOwotCi0JfQotCi19IC8vSmF2YVJlZlBhY2thZ2UKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVVJMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzEyMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVVJMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIEphdmFSZWZGYWN0b3J5fSBVUkkgbWV0aG9kcyBpbnN0ZWFkLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFVUkwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLlVSTCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYID0gImphdmE6LyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKYXZhVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHVybFN0cmluZyBqYXZhLmxhbmcuU3RyaW5nCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNjcmVhdGVUeXBlVVJJKFN0cmluZyl9IG9yIHtAbGluayBKYXZhUmVmRmFjdG9yeSNjcmVhdGVQYWNrYWdlVVJJKFN0cmluZyl9Ci0JICovCi0JcHVibGljIEphdmFVUkwoU3RyaW5nIHVybFN0cmluZykgewotCQlzdXBlcih1cmxTdHJpbmcpOwotCX0KLQkvKioKLQkgKiBKYXZhVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5hbWVTcGFjZU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpRCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNjcmVhdGVUeXBlVVJJKFN0cmluZywgU3RyaW5nKX0KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSmF2YVVSTChTdHJpbmcgbmFtZVNwYWNlTmFtZSwgU3RyaW5nIGlEKSB7Ci0JCXN1cGVyKG51bGwsIG51bGwpOwotCQlpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKG5hbWVTcGFjZU5hbWUpOwotCQl0aGlzLklEID0gaUQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2dldFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfSAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCBpbiBWaXN1YWxBZ2UuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNnZXRGdWxsVHlwZU5hbWUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZXNwYWNlTmFtZSAhPSBudWxsKSB7Ci0JCQlidWYuYXBwZW5kKG5hbWVzcGFjZU5hbWUpOwotCQkJaWYgKElEICE9IG51bGwpCi0JCQkJYnVmLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKElEICE9IG51bGwpCi0JCQlidWYuYXBwZW5kKElEKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNnZXRQYWNrYWdlTmFtZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlTdHJpbmcgaW50ZXJuYWxOYW1lID0gbmFtZXNwYWNlTmFtZS5zdWJzdHJpbmcoSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYLmxlbmd0aCgpLCBuYW1lc3BhY2VOYW1lLmxlbmd0aCgpKTsKLQkJcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgIyBzaWduIHRvIGRlbGltaXQgdGhlIHN0YXJ0IG9mIHRoZSBqYXZhIHBhY2thZ2UgdXMgdGhlIGluaGVyaXRlZCBiZWhhdmlvcgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tU3RyaW5nKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybC5pbmRleE9mKCIjIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLmluaXRpYWxpemVGcm9tU3RyaW5nKHVybCk7Ci0JCWVsc2UgewotCQkJaW50IGVuZE9mUGFja2FnZU5hbWUgPSB1cmwubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChlbmRPZlBhY2thZ2VOYW1lID09IC0xKQotCQkJCWluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcobnVsbCk7Ci0JCQllbHNlCi0JCQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyh1cmwuc3Vic3RyaW5nKDAsIGVuZE9mUGFja2FnZU5hbWUpKTsKLQkJCUlEID0gdXJsLnN1YnN0cmluZyhlbmRPZlBhY2thZ2VOYW1lICsgMSk7Ci0JCX0KLQotCX0KLQkvKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKFN0cmluZyBhTmFtZXNwYWNlTmFtZSkgewotCQlpZiAoYU5hbWVzcGFjZU5hbWUgPT0gbnVsbCkKLQkJCW5hbWVzcGFjZU5hbWUgPSBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVg7Ci0JCWVsc2UKLQkJCW5hbWVzcGFjZU5hbWUgPSBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVggKyBhTmFtZXNwYWNlTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFVcmxTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNpc0phdmFVUkkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9IAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFVUkwoU3RyaW5nIGFVcmxTdHJpbmcpIHsKLQkJaWYgKGFVcmxTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFVcmxTdHJpbmcuc3RhcnRzV2l0aChKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVVJMKCIgKyBnZXRGdWxsU3RyaW5nKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVZpc2liaWxpdHlLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFWaXNpYmlsaXR5S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmM2M2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVZpc2liaWxpdHlLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQQUNLQUdFPTEKLSAqIFBVQkxJQz0yCi0gKiBQUklWQVRFPTMKLSAqIFBST1RFQ1RFRD00Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFWaXNpYmlsaXR5S2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFWaXNpYmlsaXR5S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVQkxJQzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQVUJMSUNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJJVkFURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUklWQVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPVEVDVEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVEVEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUEFDS0FHRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0UgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVCTElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QVUJMSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVCTElDCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBVQkxJQ19MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQVUJMSUMsICJQVUJMSUMiLCAiUFVCTElDIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUklWQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QUklWQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BSSVZBVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUFJJVkFURV9MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQUklWQVRFLCAiUFJJVkFURSIsICJQUklWQVRFIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBST1RFQ1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9URUNURUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUFJPVEVDVEVEX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBST1RFQ1RFRCwgIlBST1RFQ1RFRCIsICJQUk9URUNURUQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUEFDS0FHRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQQUNLQUdFX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBBQ0tBR0UsICJQQUNLQUdFIiwgIlBBQ0tBR0UiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSmF2YVZpc2liaWxpdHlLaW5kW10gewotCQkJUFVCTElDX0xJVEVSQUwsCi0JCQlQUklWQVRFX0xJVEVSQUwsCi0JCQlQUk9URUNURURfTElURVJBTCwKLQkJCVBBQ0tBR0VfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVZpc2liaWxpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKYXZhVmlzaWJpbGl0eUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFBVQkxJQzogcmV0dXJuIFBVQkxJQ19MSVRFUkFMOwotCQkJY2FzZSBQUklWQVRFOiByZXR1cm4gUFJJVkFURV9MSVRFUkFMOwotCQkJY2FzZSBQUk9URUNURUQ6IHJldHVybiBQUk9URUNURURfTElURVJBTDsKLQkJCWNhc2UgUEFDS0FHRTogcmV0dXJuIFBBQ0tBR0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSmF2YVZpc2liaWxpdHlLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9KYXZhVmlzaWJpbGl0eUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvTWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL01ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2NhNWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZCBleHRlbmRzIEVPcGVyYXRpb257Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfQ09NTUVOVF9UQUcgPSAiQGdlbmVyYXRlZCI7Ci0JLyoqCi0JICogTGlzdHMgYWxsIHRoZSBwYXJhbWV0ZXJzLCBleGNsdWRpbmcgdGhlIHJldHVybiB0eXBlCi0JICovIAotCXB1YmxpYyBKYXZhUGFyYW1ldGVyW10gbGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNBYnN0cmFjdCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0Fic3RyYWN0IDxlbT5BYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzTmF0aXZlIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNOYXRpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc05hdGl2ZSA8ZW0+TmF0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYXRpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYXRpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTeW5jaHJvbml6ZWQgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3luY2hyb25pemVkIDxlbT5TeW5jaHJvbml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bmNocm9uaXplZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5bmNocm9uaXplZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNDb25zdHJ1Y3RvciBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzQ29uc3RydWN0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0NvbnN0cnVjdG9yIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQ29uc3RydWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0aWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSmF2YVZpc2liaWxpdHkgYXR0cmlidXRlCi0JICovCi0JSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0SmF2YVZpc2liaWxpdHkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZAotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQYXJhbWV0ZXJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRQYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEphdmFFeGNlcHRpb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRKYXZhRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKi8KLQlCbG9jayBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShCbG9jayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLgotCSAqLwotCUphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4KLQkgKiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgPC8vY29kZT4gLgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCUphdmFQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgcmV0dXJuIHR5cGUuCi0JICovCi0JSmF2YUhlbHBlcnMgZ2V0UmV0dXJuVHlwZSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdGhlIHJldHVybiB0eXBlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbCB0eXBlRGF0YVR5cGU9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkpUeXBlSmF2YUhlbHBlcnMiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0dXJuVHlwZShKYXZhSGVscGVycyB0eXBlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4KLQkgKiAKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuICBUaGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyB0aGUgbWV0aG9kIAotCSAqIGFjY2VzcyBtb2RpZmllcnMsIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSwgZm9sbG93ZWQgYnkgYQotCSAqIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLAotCSAqIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqIG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkCi0JICogZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkCi0JICogdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGU6Ci0JICogCi0JICogICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICogCi0JICogVGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YQotCSAqIExhbmd1YWdlIFNwZWNpZmljYXRpb24iLiAgVGhpcyBpcyBwdWJsaWMsIDx0dD5wcm90ZWN0ZWQ8Ly90dD4gb3IKLQkgKiA8dHQ+cHJpdmF0ZTwvL3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JICogPHR0PmFic3RyYWN0PC8vdHQ+LCA8dHQ+c3RhdGljPC8vdHQ+LCA8dHQ+ZmluYWw8Ly90dD4sIDx0dD5zeW5jaHJvbml6ZWQ8Ly90dD4KLQkgKiA8dHQ+bmF0aXZlPC8vdHQ+LgotCi0JICovCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgc3lzdGVtIGdlbmVyYXRlZC4KLQkgKiBUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgQGdlbmVyYXRlZCB0YWcgaW4gdGhlIGNvbW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0dlbmVyYXRlZCgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzR2VuZXJhdGVkKGJvb2xlYW4gZ2VuZXJhdGVkKTsKLQotICAgIC8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYSB2b2lkIHJldHVybiB0eXBlIG1ldGhvZC4KLQkgKi8KLQlib29sZWFuIGlzVm9pZCgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9TdGF0ZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjJkZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZW1lbnQgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTMzYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9UeXBlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0VHlwZUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTkRFRklORURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0xBU1NfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFUkZBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URVJGQUNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJGQUNFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWENFUFRJT05fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENFUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5ERUZJTkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgVU5ERUZJTkVEX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoVU5ERUZJTkVELCAiVU5ERUZJTkVEIiwgIlVOREVGSU5FRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NMQVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgQ0xBU1NfTElURVJBTCA9IG5ldyBUeXBlS2luZChDTEFTUywgIkNMQVNTIiwgIkNMQVNTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFUkZBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVSRkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFUkZBQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBJTlRFUkZBQ0VfTElURVJBTCA9IG5ldyBUeXBlS2luZChJTlRFUkZBQ0UsICJJTlRFUkZBQ0UiLCAiSU5URVJGQUNFIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWENFUFRJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBFWENFUFRJT05fTElURVJBTCA9IG5ldyBUeXBlS2luZChFWENFUFRJT04sICJFWENFUFRJT04iLCAiRVhDRVBUSU9OIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFR5cGVLaW5kW10gewotCQkJVU5ERUZJTkVEX0xJVEVSQUwsCi0JCQlDTEFTU19MSVRFUkFMLAotCQkJSU5URVJGQUNFX0xJVEVSQUwsCi0JCQlFWENFUFRJT05fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBUeXBlS2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVR5cGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHlwZUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUeXBlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBUeXBlS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVU5ERUZJTkVEOiByZXR1cm4gVU5ERUZJTkVEX0xJVEVSQUw7Ci0JCQljYXNlIENMQVNTOiByZXR1cm4gQ0xBU1NfTElURVJBTDsKLQkJCWNhc2UgSU5URVJGQUNFOiByZXR1cm4gSU5URVJGQUNFX0xJVEVSQUw7Ci0JCQljYXNlIEVYQ0VQVElPTjogcmV0dXJuIEVYQ0VQVElPTl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUeXBlS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHlwZUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZlODFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUmVmbGVjdGlvbktleSB7Ci0KLQkvKiBDb25zdGFudHMgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSBuYW1lcwotCSAqIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHdoaWNoIGFyZSB1c2VkIHRvIHJlZmVyIHRvIGEgcHJpbWl0aXZlIHR5cGUsCi0JICogaS5lLiBuZXcgSmF2YVVSTCgiaW50IikgIG9yIG5ldyBVUkwoImphdmE6Ly8jaW50IikKLQkgKiBUaGVzZSB0eXBlcyBhcmUgY2FjaGVkIGJ5IHByZS1sb2FkaW5nIGRvY3VtZW50cyBmb3IgdGhlIHByaW1pdGl2ZXMsCi0JICogaW4gImphdmE6Ly8iLCBhbmQgZm9yIHRoZSBqYXZhLmxhbmcgKE9iamVjdCBhbmQgU3RyaW5nKSBjbGFzc2VzCi0JICovCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9WT0lEID0gInZvaWQiOwkgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fSU5UID0gImludCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fQk9PTEVBTiA9ICJib29sZWFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9DSEFSID0gImNoYXIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0JZVEUgPSAiYnl0ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fTE9ORyA9ICJsb25nIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9GTE9BVCA9ICJmbG9hdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fRE9VQkxFID0gImRvdWJsZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fU0hPUlQgPSAic2hvcnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qIAotCSAqIENyZWF0ZSBhbiBBcnJheVR5cGUgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIEphdmFDbGFzcyBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgRmllbGQgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEZpZWxkIGNyZWF0ZUphdmFGaWVsZCgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgTWV0aG9kIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZCgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgSmF2YVBhcmFtZXRlciBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQotCS8vRkIvKioKLQkvL0ZCICogT3ZlcnJpZGUgdG8gdHJ5IHRvIGludHJvc3BlY3Qgb2JqZWN0cwotCS8vRkIgKiB0aGF0IGFyZW4ndCBmb3VuZCB1c2luZyB0aGUgZGVmYXVsdCBtZWNoYW5pc20uCi0JLy9GQiAqLwotCS8vRkJwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JLy9GQiAJT2JqZWN0IGphdmFPYmplY3QgPSBzdXBlci5nZXQoa2V5KTsKLQkvL0ZCIAlpZiAoamF2YU9iamVjdCA9PSBudWxsKSB7Ci0JLy9GQiAJCWphdmFPYmplY3QgPSBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucygoU3RyaW5nKSBrZXkpOwotCS8vRkIgCQlpZiAoamF2YU9iamVjdCA9PSBudWxsKQotCS8vRkIgCQkJamF2YU9iamVjdCA9IGdldEphdmFPYmplY3QoKFN0cmluZykga2V5KTsKLQkvL0ZCIAl9Ci0JLy9GQglyZXR1cm4gamF2YU9iamVjdDsKLQkvL0ZCfQotCi0JLy9GQiBBRERFRAotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0KFN0cmluZyBrZXkpOwotCi0JLy9GQiBFTkQKLQotCS8qCi0JICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotCSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGhlIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRUNsYXNzaWZpZXIgZ2V0QXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQkvKgotCSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLQkgKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRlaCBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVDbGFzc2lmaWVyIGdldEphdmFDbGFzcyhTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogVGhpcyBhbGxvd3MgZm9yIHRoZSByZXRyaWV2YWwgb2YgYXR0cmlidXRlcy9tZXRob2RzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLQkgKiBmaWVsZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb28KLQkgKiBtZXRob2Q6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKAotCSAqIHBhcmFtZXRlcjogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oLWFyZzAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRKYXZhT2JqZWN0KFN0cmluZyBrZXlWYWx1ZSk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA5OjUyOjI4IEFNKQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyCi0JICogQHBhcmFtIHR5cGVOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRUNsYXNzaWZpZXIgZ2V0SmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGZyb20gdGhlIGtleSBidXQgZG9uJ3QgZG8gYW55IAotCSAqIHRyaWVzIGF0IGNyZWF0aW9uIG9mIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqIFRoZSBLZXkgbXVzdCBiZSBhbiBJRCBmb3IgaXQgdG8gYmUgZm91bmQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBwcmltR2V0KFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHBhc3NlZCB0eXBlIHJlcHJlc2VudHMgYSBKYXZhIEFycmF5IHR5cGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FycmF5KFN0cmluZyB0eXBlTmFtZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5N2ZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnM7Ci0KLS8qKgotICogRXh0ZW5zaW9uIGludGVyZmFjZSB0byBhZGQgYW4gYWRkaXRpb25hbCByZWZsZWN0aW9uIGtleSBpbiB0byBoYW5kbGUKLSAqIG90aGVyIHR5cGVzIG9mIGtleSdzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGlkLgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSByZWZsZWN0aW9uS2V5Ci0JICogQHJldHVybiB0aGUgb2JqZWN0IChpdCBzaG91bGQgYWRkIHRoZSBpZCB3aXRoIG9iamVjdCB0byB0aGUgcmVzb3VyY2UncyBpZCB0YWJsZSBiZWZvcmUgcmV0dXJuaW5nIGl0KSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgb25lIGl0IGhhbmRsZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkLCBJSmF2YVJlZmxlY3Rpb25LZXkgcmVmbGVjdGlvbktleSk7Ci0JCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYmZhZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhWE1JRmFjdG9yeUltcGw7Ci0gCi0KLS8qKgotICogRmFjdG9yeSBmb3IgSmF2YSBYTUkgUmVzb3VyY2VzLgotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVhNSUZhY3RvcnkgewotCi0JLyoqCi0JICogU2NoZW1lIHVzZWQgaW4gVVJJJ3MgZm9yIGplbSBlbGVtZW50cy4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUUgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFYTUlGYWN0b3J5IElOU1RBTkNFID0gbmV3IEphdmFYTUlGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmVnaXN0ZXIgdGhlIHJlZmxlY3Rpb24ga2V5IGV4dGVuc2lvbi4KLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pOwotCQotCS8qKgotCSAqIERlcmVnaXN0ZXIgdGhlIHJlZmxlY3Rpb24ga2V5IGV4dGVuc2lvbi4KLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgZGVyZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDkwNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0gCi0KLS8qKgotICogCi0gKiBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIG9sZGVyIHByZS1FTUYgMi4yIGdlbmVyYXRlZCBjb2RlIHRoYXQgYWNjZXNzZXMgdGhlIHBhY2thZ2UgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0gKiBUaGlzIGlzIGtpbmQgb2YgQVBJIGFuZCBtdXN0IG5vdCBnbyBhd2F5LCBidXQgbmV3IGNsaWVudHMgc2hvdWxkIG5vdCByZWZlcmVuY2UgdGhpcyBjbGFzcy4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwgewotCi0JcHVibGljIEphdmFSZWZQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIERvIG5vdCB1c2UuIFRoaXMgaXMgaGVyZSBvbmx5IGZvciB0aGUgb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gVGhpcyBpcyBoZXJlIG9ubHkgZm9yIHRoZSBvbGRlciBwcmUtRU1GIDIuMiBnZW5lcmF0ZWQgY29kZSB0aGF0IGFjY2Vzc2VzIHRoZSBwYWNrYWdlIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgaW5pdCgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQXJyYXlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDk4YjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlCi0gKiAgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlCi0gKiAgICBzcGVjaWZpZWQgZGlyZWN0bHkuICBUaGlzIHdvdWxkIHJlcXVpcmUgaW5zdGFudGlhdGluZyBhIGNoYWluIG9mIGNvbXBvbmVudCB0eXBlcwotICogICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLgotICogCi0gKiAgIFRoZSBjb21wb25lbnQgdHlwZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGUgZmluYWxDb21wb25lbnRUeXBlCi0gKiAgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4KLSAqICAKLSAqICAgRm9yIHRoaXMgcmVhc29uLCB0aGUgcHJlZmVycmVkIHdheSB0byBjcmVhdGUgaXMgdGhyb3VnaCB0aGUgSmF2YVJlZkZhY3RvcnkgZmFjdG9yeSBtZXRob2Q6Ci0gKiAgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlUeXBlSW1wbCBleHRlbmRzIEphdmFDbGFzc0ltcGwgaW1wbGVtZW50cyBBcnJheVR5cGUsIEphdmFDbGFzcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJyYXlEaW1lbnNpb25zKCkgPGVtPkFycmF5IERpbWVuc2lvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFycmF5RGltZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVCA9IDA7Ci0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGFycmF5RGltZW5zaW9ucyA9IEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZSgpIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCQotCXByb3RlY3RlZCBKYXZhSGVscGVycyBmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFycmF5VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuQVJSQVlfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBhcnJheSB0eXBlIGZyb20gb3VyIHR5cGUgbmFtZS4KLQkgKiBUaGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheSB0eXBlIGlzIGVzc2VudGlhbGx5OiBuZXcgQXJyYXlUeXBlSW1wbChmaW5hbENvbXBvbmVudFR5cGUsIGFycmF5RGltZW5zaW9ucy0xKQotCSAqIHVubGVzcyBvdXIgYXJyYXkgZGltZW5zaW9uIGlzIDEsIGluIHdoaWNoIGNhc2UgaXQgaXMgb25seSBvdXIgZmluYWwgY29tcG9uZW50IHR5cGUuCi0JICoKLQkgKiBJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4KLQkgKiAiamF2YS5sYW5nLlN0cmluZ1tdW10iIGNvbXBvbmVudCB0eXBlIGlzICJqYXZhLmxhbmcuU3RyaW5nW10iCi0JICoKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgY29tcHV0ZUNvbXBvbmVudFR5cGUoKSB7Ci0JCVN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJLy8gU3RyaXAgdGhlIGxhc3QgW10gZm9ybSBteSBuYW1lIHRvIGdldCBteSBjb21wb25lbnQgdHlwZSdzIG5hbWUKLQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUuc3Vic3RyaW5nKDAsIGNvbXBvbmVudE5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShjb21wb25lbnROYW1lLCB0aGlzKTsKLQl9Ci0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcGVyZm9ybSBzb21lIGxhenkgaW5pdGlhbGl6YXRpb24KLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJLy8gSWYgd2UgZG8gbm90IGhhdmUgYSBjb21wb25lbnQgdHlwZSBzZXQsIGJ1dCB3ZSBoYXZlIGEgbmFtZSAod2hpY2ggY29udGFpbnMgb3VyIGNvbXBvbmVudCB0eXBlIG5hbWUpCi0JCS8vIHdlIGNhbiBjb21wdXRlIHRoZSBjb21wb25lbnQgdHlwZS4KLQkJaWYgKCh0aGlzLmdldENvbXBvbmVudFR5cGVHZW4oKSA9PSBudWxsKSAmJiAodGhpcy5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCWNvbXBvbmVudFR5cGUgPSBjb21wdXRlQ29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBnZXRDb21wb25lbnRUeXBlR2VuKCk7Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gCi0JICogCi0JICogSWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZ2V0Q29tcG9uZW50VHlwZSgpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIEFycmF5IFR5cGUuCi0JICogCi0JICogSW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpIHsKLQkJaWYgKGZpbmFsQ29tcG9uZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQkvLyBTdHJpcCBhbGwgdGhlIFtdIGZyb20gbXkgbmFtZSB0byBnZXQgbXkgRklOQUwgY29tcG9uZW50IHR5cGUncyBuYW1lCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5pbmRleE9mKCJbIikpOwotCQkJZmluYWxDb21wb25lbnRUeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGNvbXBvbmVudE5hbWUsIHRoaXMpOwotCQl9Ci0JCXJldHVybiBmaW5hbENvbXBvbmVudFR5cGU7Ci0JfQotCS8qKgotCSAqIChKYXZhSGVscGVycylpc0FycmF5IC0gQXJyYXlUeXBlcyBhcmUgYXJyYXlzCi0JICogT3ZlcnJpZGUgZnJvbSBKYXZhQ2xhc3MuCi0JICovICAgIAotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlQXJyYXkoKSB7Ci0JCXJldHVybiBnZXRGaW5hbENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoSmF2YUhlbHBlcnMgaGVscGVyQ29tcG9uZW50VHlwZSkgewotCQlzZXRDb21wb25lbnRUeXBlKChFQ2xhc3NpZmllcikgaGVscGVyQ29tcG9uZW50VHlwZSk7CQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBcnJheURpbWVuc2lvbnMoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXNldEFycmF5RGltZW5zaW9ucygoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJc2V0QXJyYXlEaW1lbnNpb25zKEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGFycmF5RGltZW5zaW9ucyAhPSBBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlyZXR1cm4gY29tcG9uZW50VHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIGFycmF5RGltZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnJheURpbWVuc2lvbnMoaW50IG5ld0FycmF5RGltZW5zaW9ucykgewotCQlpbnQgb2xkQXJyYXlEaW1lbnNpb25zID0gYXJyYXlEaW1lbnNpb25zOwotCQlhcnJheURpbWVuc2lvbnMgPSBuZXdBcnJheURpbWVuc2lvbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlMsIG9sZEFycmF5RGltZW5zaW9ucywgYXJyYXlEaW1lbnNpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFycmF5RGltZW5zaW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXJyYXlEaW1lbnNpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGVHZW4oKSB7Ci0JCWlmIChjb21wb25lbnRUeXBlICE9IG51bGwgJiYgY29tcG9uZW50VHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29tcG9uZW50VHlwZSA9IChJbnRlcm5hbEVPYmplY3QpY29tcG9uZW50VHlwZTsKLQkJCWNvbXBvbmVudFR5cGUgPSAoRUNsYXNzaWZpZXIpZVJlc29sdmVQcm94eShvbGRDb21wb25lbnRUeXBlKTsKLQkJCWlmIChjb21wb25lbnRUeXBlICE9IG9sZENvbXBvbmVudFR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSwgb2xkQ29tcG9uZW50VHlwZSwgY29tcG9uZW50VHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBiYXNpY0dldENvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoRUNsYXNzaWZpZXIgbmV3Q29tcG9uZW50VHlwZSkgewotCQlmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCQlzZXRDb21wb25lbnRUeXBlR2VuKG5ld0NvbXBvbmVudFR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlR2VuKEVDbGFzc2lmaWVyIG5ld0NvbXBvbmVudFR5cGUpIHsKLQkJRUNsYXNzaWZpZXIgb2xkQ29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0JCWNvbXBvbmVudFR5cGUgPSBuZXdDb21wb25lbnRUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSwgb2xkQ29tcG9uZW50VHlwZSwgY29tcG9uZW50VHlwZSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJLy8gT3ZlcnJpZGUgdG8gYWx3YXlzIHJldHVybiB0aGUgY2xhc3MgaWYgZmluYWwgdHlwZSBpcyB2YWxpZC4KLQkJSmF2YUhlbHBlcnMgZnQgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKCFmdC5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlUeXBlS2luZCBmdEtpbmQgPSAoKEphdmFDbGFzcykgZnQpLmdldEtpbmQoKTsgCi0JCQlyZXR1cm4gIGZ0S2luZCAhPSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCA/IFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwgOiBUeXBlS2luZC5VTkRFRklORURfTElURVJBTDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gVHlwZUtpbmQuQ0xBU1NfTElURVJBTDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJLy8gT3ZlcnJpZGUgdG8gcmV0dXJuIHRoZSBraW5kIG9mIHRoZSBmaW5hbCBjb21wb25lbnQsIGJlY2F1c2UgdGhhdCBkZXRlcm1pbmVzIGl0LgotCQlKYXZhSGVscGVycyBmdCA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoIWZ0LmlzUHJpbWl0aXZlKCkpIHsKLQkJCXJldHVybiAoKEphdmFDbGFzcykgZnQpLmlzUHVibGljKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzMzQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCbG9jayB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzb3VyY2UgPSBTT1VSQ0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRzKCkgPGVtPkNvbnRlbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGVudHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEJsb2NrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIG5ld1NvdXJjZSkgewotCQlTdHJpbmcgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCkgewotCQkJY29udGVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmxvY2suY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzb3VyY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjY3ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0NvbW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBDb21tZW50IHsKLQotCQotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5DT01NRU5UOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9GaWVsZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9GaWVsZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3OWU3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVUeXBlZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDcm9zc1JlZmVyZW5jZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbXBsIGV4dGVuZHMgRVR5cGVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBGaWVsZCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUQVRJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0VGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmlzaWJpbGl0eSgpIDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVZpc2liaWxpdHlLaW5kIGphdmFWaXNpYmlsaXR5ID0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNpZW50KCkgPGVtPlRyYW5zaWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFOU0lFTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNpZW50KCkgPGVtPlRyYW5zaWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUVOVF9FRkxBRyA9IDEgPDwgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWb2xhdGlsZSgpIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWb2xhdGlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZPTEFUSUxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZvbGF0aWxlKCkgPGVtPlZvbGF0aWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ZvbGF0aWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWT0xBVElMRV9FRkxBRyA9IDEgPDwgMTM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplcigpIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCbG9jayBpbml0aWFsaXplciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRmllbGRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuRklFTEQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRmllbGRSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgZmllbGQgaW4gdGhlIG5hbWVkIEphdmEgY2xhc3MgaW4gdGhlIGZvcm0gInBhY2thZ2UuY2xhc3NfZmllbGQiCi0JICogQGRlcHJlY2F0ZWQgbm8gcmVwbGFjZW1lbnQgYXQgdGhpcyB0aW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgY3JlYXRlRmllbGRSZWYoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCByZWYgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmllbGQoKTsKLQkJVVJJIGNsYXNzVVJJID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVVUkkoY2xhc3NOYW1lKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIHJlZikuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoY2xhc3NVUkkudG9TdHJpbmcoKStSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIrZmllbGROYW1lKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gbGF6eSBpbml0aWFsaXphdGlvbnMvcmVmbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0RVR5cGUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIEJsb2NrIGdldEluaXRpYWxpemVyKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRJbml0aWFsaXplckdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTdGF0aWNHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNUcmFuc2llbnRHZW4oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWb2xhdGlsZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNWb2xhdGlsZUdlbigpOwotCX0JCi0KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHlHZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFZhbHVlcygpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSByZWFkQWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQloYXNSZWZsZWN0ZWQgPSBzZXRSZWZsZWN0ZWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFVzZWQgYnkgcmVmbGVjdGlvbiBhZGFwdGVyIHRvIGNsZWFyIHRoZSByZWZsZWN0aW9uLiBUaGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVmbGVjdGVkKGJvb2xlYW4gcmVmbGVjdGVkKSB7Ci0JCWhhc1JlZmxlY3RlZCA9IHJlZmxlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGdldEphdmFUeXBlKCkuaXNBcnJheSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcygoSmF2YUNsYXNzKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRKYXZhQ2xhc3MobnVsbCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbml0aWFsaXplcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXJldHVybiBpc1N0YXRpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxpemVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMOgotCQkJCXNldEZpbmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXNldEphdmFWaXNpYmlsaXR5KChKYXZhVmlzaWJpbGl0eUtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKEJsb2NrKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCkgIT0gU1RBVElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBqYXZhVmlzaWJpbGl0eSAhPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKSAhPSBUUkFOU0lFTlRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCkgIT0gVk9MQVRJTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGluaXRpYWxpemVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gcHJldmVudCB0aGUgcmVmbGVjdGlvbiBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIEVMaXN0IGVDb250ZW50cygpIHsKLQkJRUxpc3QgcmVzdWx0cyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCS8vRkIKLQkJLy9GQiBFTGlzdCBjb250YWlubWVudHMgPSBlQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCS8vRkIgaWYgKGNvbnRhaW5tZW50cyAhPSBudWxsKSB7Ci0JCS8vRkIgSXRlcmF0b3IgaSA9IGNvbnRhaW5tZW50cy5pdGVyYXRvcigpOwotCQkvL0ZCIHdoaWxlIChpLmhhc05leHQoKSkgewotCQkvL0ZCIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkvL0ZCIC8vQ2hhbmdlIGZyb20gc3VwZXIgdG8gcHJpbVJlZlZhbHVlCi0JCS8vRkIgT2JqZWN0IHZhbHVlID0gcHJpbVJlZlZhbHVlKHNmKTsKLQkJLy9GQiAvL0VuZENoYW5nZQotCQkvL0ZCIGlmICh2YWx1ZSAhPSBudWxsKQotCQkvL0ZCIGlmIChzZi5pc01hbnkoKSkKLQkJLy9GQiByZXN1bHRzLmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkvL0ZCIGVsc2UKLQkJLy9GQiByZXN1bHRzLmFkZCh2YWx1ZSk7Ci0JCS8vRkIgfQotCQkvL0ZCIH0KLQkJaWYgKGdldEluaXRpYWxpemVyR2VuKCkgIT0gbnVsbCkKLQkJCXJlc3VsdHMuYWRkKGdldEluaXRpYWxpemVyR2VuKCkpOyAvL0ZCCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgIiArICIoIiArIGdldE5hbWUoKSArICIpIjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5R2VuKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIG5ld1N0YXRpYykgewotCQlib29sZWFuIG9sZFN0YXRpYyA9IChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTdGF0aWMpIGVGbGFncyB8PSBTVEFUSUNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TVEFUSUNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUMsIG9sZFN0YXRpYywgbmV3U3RhdGljKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIG5ld0phdmFWaXNpYmlsaXR5KSB7Ci0JCUphdmFWaXNpYmlsaXR5S2luZCBvbGRKYXZhVmlzaWJpbGl0eSA9IGphdmFWaXNpYmlsaXR5OwotCQlqYXZhVmlzaWJpbGl0eSA9IG5ld0phdmFWaXNpYmlsaXR5ID09IG51bGwgPyBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgOiBuZXdKYXZhVmlzaWJpbGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWSwgb2xkSmF2YVZpc2liaWxpdHksIGphdmFWaXNpYmlsaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnRHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIG5ld1RyYW5zaWVudCkgewotCQlib29sZWFuIG9sZFRyYW5zaWVudCA9IChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdUcmFuc2llbnQpIGVGbGFncyB8PSBUUkFOU0lFTlRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5UUkFOU0lFTlRfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQsIG9sZFRyYW5zaWVudCwgbmV3VHJhbnNpZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWb2xhdGlsZUdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2xhdGlsZShib29sZWFuIG5ld1ZvbGF0aWxlKSB7Ci0JCWJvb2xlYW4gb2xkVm9sYXRpbGUgPSAoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdWb2xhdGlsZSkgZUZsYWdzIHw9IFZPTEFUSUxFX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Vk9MQVRJTEVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRSwgb2xkVm9sYXRpbGUsIG5ld1ZvbGF0aWxlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyBuZXdKYXZhQ2xhc3MpIHsKLQkJaWYgKG5ld0phdmFDbGFzcyAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKYXZhQ2xhc3MobmV3SmF2YUNsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTLCBuZXdKYXZhQ2xhc3MsIG5ld0phdmFDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCbG9jayBnZXRJbml0aWFsaXplckdlbigpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluaXRpYWxpemVyKEJsb2NrIG5ld0luaXRpYWxpemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUJsb2NrIG9sZEluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7Ci0JCWluaXRpYWxpemVyID0gbmV3SW5pdGlhbGl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgb2xkSW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihCbG9jayBuZXdJbml0aWFsaXplcikgewotCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gaW5pdGlhbGl6ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluaXRpYWxpemVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbml0aWFsaXplcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbml0aWFsaXplcihuZXdJbml0aWFsaXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG5ld0luaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGF0aWM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFWaXNpYmlsaXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXZhVmlzaWJpbGl0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNpZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2b2xhdGlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjQyNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0luaXRpYWxpemVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXplckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N0YXRpYygpIDxlbT5JcyBTdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfU1RBVElDX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzU3RhdGljID0gSVNfU1RBVElDX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJsb2NrIHNvdXJjZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSW5pdGlhbGl6ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLklOSVRJQUxJWkVSOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzU3RhdGljKCkgewotCQlyZXR1cm4gaXNTdGF0aWM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdGF0aWMoQm9vbGVhbiBuZXdJc1N0YXRpYykgewotCQlCb29sZWFuIG9sZElzU3RhdGljID0gaXNTdGF0aWM7Ci0JCWlzU3RhdGljID0gbmV3SXNTdGF0aWM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUMsIG9sZElzU3RhdGljLCBpc1N0YXRpYykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUykgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MgJiYgbmV3SmF2YUNsYXNzICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3SmF2YUNsYXNzKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3SmF2YUNsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0phdmFDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SmF2YUNsYXNzKG5ld0phdmFDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0U291cmNlKCkgewotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTb3VyY2UgPSAoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZTsKLQkJCXNvdXJjZSA9IChCbG9jayllUmVzb2x2ZVByb3h5KG9sZFNvdXJjZSk7Ci0JCQlpZiAoc291cmNlICE9IG9sZFNvdXJjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmxvY2sgYmFzaWNHZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKEJsb2NrIG5ld1NvdXJjZSkgewotCQlCbG9jayBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCXNvdXJjZSA9IG5ld1NvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRKYXZhQ2xhc3MoKEphdmFDbGFzcylvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXJldHVybiBnZXRJc1N0YXRpYygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXNldElzU3RhdGljKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlzZXRJc1N0YXRpYyhJU19TVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJcmV0dXJuIElTX1NUQVRJQ19FREVGQVVMVCA9PSBudWxsID8gaXNTdGF0aWMgIT0gbnVsbCA6ICFJU19TVEFUSUNfRURFRkFVTFQuZXF1YWxzKGlzU3RhdGljKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNTdGF0aWM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlzU3RhdGljKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhQ2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTdmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVDb2xsZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcyA8ZW0+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0Q2xhc3NJbXBvcnQgPGVtPkNsYXNzIEltcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldFBhY2thZ2VJbXBvcnRzIDxlbT5QYWNrYWdlIEltcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRGaWVsZHMgPGVtPkZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRJbml0aWFsaXplcnMgPGVtPkluaXRpYWxpemVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldERlY2xhcmVkQ2xhc3NlcyA8ZW0+RGVjbGFyZWQgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldERlY2xhcmluZ0NsYXNzIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRKYXZhUGFja2FnZSA8ZW0+SmF2YSBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RXZlbnRzIDxlbT5FdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRBbGxFdmVudHMgPGVtPkFsbCBFdmVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIEphdmFDbGFzcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFR5cGVLaW5kIEtJTkRfRURFRkFVTFQgPSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUeXBlS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1B1YmxpYygpIDxlbT5QdWJsaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFVCTElDX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1B1YmxpYygpIDxlbT5QdWJsaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQVUJMSUNfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDExOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKSA8ZW0+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGxlbWVudHNJbnRlcmZhY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW1wbGVtZW50c0ludGVyZmFjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NJbXBvcnQoKSA8ZW0+Q2xhc3MgSW1wb3J0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzSW1wb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2xhc3NJbXBvcnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZUltcG9ydHMoKSA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VJbXBvcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGFja2FnZUltcG9ydHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRzKCkgPGVtPkZpZWxkczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWVsZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kcygpIDxlbT5NZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVycygpIDxlbT5Jbml0aWFsaXplcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbGl6ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmVkQ2xhc3NlcygpIDxlbT5EZWNsYXJlZCBDbGFzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmVkQ2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJpbmdDbGFzcygpIDxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmluZ0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGRlY2xhcmluZ0NsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV2ZW50cygpIDxlbT5FdmVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXZlbnRzID0gbnVsbDsKLQotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfQ0xBU1M7Ci0JfQotCi0JLyoqCi0JICogUHJvdGVjdGVkIGhlbHBlciBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RGaWVsZHNFeHRlbmRlZChMaXN0IGZpZWxkcykgewotCQlmaWVsZHMuYWRkQWxsKGdldEZpZWxkcygpKTsKLQkJSXRlcmF0b3IgaXQ7Ci0JCWl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKQotCQkJKChKYXZhQ2xhc3NJbXBsKSBpdC5uZXh0KCkpLmNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RNZXRob2RzRXh0ZW5kZWQoTWFwIG1ldGhvZHMsIGJvb2xlYW4gb25seVB1YmxpYywgTGlzdCBleGNsdWRlZENsYXNzZXMsIExpc3QgZXhjbHVkZWRNZXRob2RzKSB7Ci0JCUl0ZXJhdG9yIGl0MSwgaXQyOwotCQlpdDIgPSBnZXRFeHRlbmRlZExvb2t1cEl0ZXJhdG9yKCk7Ci0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzOwotCQl3aGlsZSAoaXQyLmhhc05leHQoKSkgewotCQkJamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGl0Mi5uZXh0KCk7Ci0JCQlpZiAoIWV4Y2x1ZGVkQ2xhc3Nlcy5jb250YWlucyhqYXZhQ2xhc3MpKQotCQkJCWphdmFDbGFzcy5jb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIG9ubHlQdWJsaWMsIGV4Y2x1ZGVkQ2xhc3NlcywgZXhjbHVkZWRNZXRob2RzKTsKLQkJfQotCQlpdDEgPSBvbmx5UHVibGljID8gZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCkgOiBnZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIG5leHRNZXRob2Q7Ci0JCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQluZXh0TWV0aG9kID0gKE1ldGhvZCkgaXQxLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRNZXRob2RzLmNvbnRhaW5zKG5leHRNZXRob2QpKQotCQkJCW1ldGhvZHMucHV0KG5leHRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBuZXh0TWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZUNsYXNzUmVmKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXR1cm4gbWV0aG9kOwotCQllbHNlIHsKLQkJCUphdmFDbGFzc0ltcGwgbXlTdXBlcjsKLQkJCW15U3VwZXIgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpZiAobXlTdXBlciAhPSBudWxsKQotCQkJCXJldHVybiBteVN1cGVyLmZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJcmV0dXJuIG1ldGhvZDsKLQkJZWxzZSB7Ci0JCQlKYXZhQ2xhc3NJbXBsIHN1cGVySW50ZXJmYWNlOwotCQkJTGlzdCBsaXN0ID0gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCXN1cGVySW50ZXJmYWNlID0gKEphdmFDbGFzc0ltcGwpIGxpc3QuZ2V0KGkpOwotCQkJCW1ldGhvZCA9IHN1cGVySW50ZXJmYWNlLmZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBJZiBhbnlvbmUgaXMgcmVmZXJlbmNpbmcgdGhpcywgcGxlYXNlIHVzZSBnZXRFQWxsU3VwZXJUeXBlcygpIGluc3RlYWQuIFRoaXMgd2FzIHBsYWNlZCBoZXJlIGFuZCBtaXNzcGVsbGVkIGJ5IG1pc3Rha2UuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbFN1cGVydHlwZXMoKSB7Ci0JCWdldEVTdXBlclR5cGVzKCk7IC8vRm9yY2UgcmVmbGVjdGlvbiwgaWYgbmVlZGVkLCBiZWZvcmUgZ2V0dGluZyBhbGwgc3VwZXJ0eXBlcy4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gcmVmbGVjdGlvbiBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NJbXBvcnQoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRDbGFzc0ltcG9ydEdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbE9wZXJhdGlvbnMoKTsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlpZiAoZUFsbE9wZXJhdGlvbnMgPT0gbnVsbCkKLQkJCWVBbGxPcGVyYXRpb25zID0gaWEuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJcmV0dXJuIGVBbGxPcGVyYXRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IEJlYW5JbmZvIGFkYXB0ZXIgY2FuIGFjY2VzcwotCSAqIHVuLWludHJvc3BlY3RlZCBhbGwgb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEVMaXN0IHByaW1HZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFT3BlcmF0aW9ucygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBvdGhlcnMuIEl0IGlzIGhlcmUgc28gdGhhdCBCZWFuSW5mbyBhZGFwdGVycyBjYW4gZ28gdG8KLQkgKiB0aGUgbm9uLWludHJvc3BlY3RlZCBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpIHsKLQkJLy8gQW4gaW50ZXJuYWwgbWV0aG9kIGZvciByZXR1cm5pbmcgYWN0dWFsIHdvIGZsdWZmaW5nIHVwLgotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmludHJvc3BlY3RJZk5lY2Vzc2FyeSgpOyAvLyBUbyBjYXVzZSBpbnRyb3NwZWN0aW9uIHNvIHRoZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgaXMgYWRkZWQuCi0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzSW50ZXJuYWwoKSB7Ci0JCS8vIEFuIGludGVybmFsIG1ldGhvZCBmb3IgcmV0dXJuaW5nIGFjdHVhbCB3byBmbHVmZmluZyB1cC4KLQkJcmV0dXJuIHN1cGVyLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGltcGxlbW50c0luZmVyZmFjZSBMaXN0IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIG9yIG9uIHRoZSBzdXBlciBMaXN0IGlmIGl0IGlzIGEgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJamF2YS51dGlsLkxpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0JCUZpZWxkIGZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJZmllbGQgPSAoRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpKQotCQkJCXJldHVybiBmaWVsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkTmFtZWQoZmllbGROYW1lKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGaWVsZCByZXN1bHQgPSAoKEphdmFDbGFzcykgaXQubmV4dCgpKS5nZXRGaWVsZEV4dGVuZGVkKGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkTmFtZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZ2V0RmllbGQoZmllbGROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RmllbGRzKCkgewotCQlyZWZsZWN0RmllbGRzKCk7Ci0JCXJldHVybiBnZXRGaWVsZHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIEludHJvc3BlY3Rpb25BZGFwdG9yIHdoaWNoIGNhbiBpbnRyb3NwZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIElJbnRyb3NwZWN0aW9uQWRhcHRlciBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gTmVlZCB0byBzeW5jIHRoaXMgYmVjYXVzZSB3ZSBhcmUgbm93IGluIG11bHRpLXRocmVhZCBlbnYuCi0JCXJldHVybiAoSUludHJvc3BlY3Rpb25BZGFwdGVyKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHByaW1HZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCS8qKgotCSAqIGdldEphdmFQYWNrYWdlLiBUaGlzIGlzIGEgZGVyaXZlZCByZWxhdGlvbnNoaXAsIHNvIHdlIG11c3QgaW1wbGVtZW50IGl0IGhlcmUgdG8gZ2V0IHRoZSBFUGFja2FnZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF2YVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldE1ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMsIExpc3QgbWV0aG9kTGlzdCkgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTGlzdC5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kTGlzdC5nZXQoaSk7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLnNpemUoKSkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgamggPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tqXS5nZXRFVHlwZSgpOwotCQkJCQkJaWYgKCFqaC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVzLmdldChqKSkpIHsKLQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSAvLyBlbmQgaWYgcGFyYW1zIGVxdWFsCi0JCQkJCX0gLy8gZW5kIGNvbXBhcmUgYWxsIHBhcmFtcwotCQkJCQlpZiAoZm91bmQpIC8vc2hvcnQgY2lyY3VpdCBvdXQgb2YgdGhpcyBsb29wIGFuZCByZXR1cm4gdGhlIHdpbm5lcgotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9IC8vIGVuZCBjb21wYXJlIGxlbmd0aHMKLQkJCX0gLy8gZW5kIGNvbXBhcmUgbmFtZXMKLQkJfSAvLyBlbmQgbG9vcCB0aHJvdWdoIGFsbCBtZXRob2RMaXN0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIHsKLQkJTGlzdCBtZXRob2RzLCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc2FtZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSArIDEpOwotCQlzaWduYXR1cmVzLmFkZChERUZBVUxUX01FVEhPRF9OQU1FKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChzYW1lTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAoIXNpZ25hdHVyZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJCXNpZ25hdHVyZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJfSBlbHNlCi0JCQkJc2FtZU5hbWVzLmFkZChtZXRob2ROYW1lKTsKLQkJCXNpZ25hdHVyZXMuYWRkKGFNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kQ2xhc3NNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCXJlZmxlY3RNZXRob2RzKCk7Ci0JCXJldHVybiBnZXRNZXRob2RzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QsIExpc3QpIG9uIEphdmFDbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBleGNsdWRlZENsYXNzZXMsIGV4Y2x1ZGVkTWV0aG9kcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KG1ldGhvZHMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHRoaXMucHJpbUdldE5hbWUoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0VHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLgotCSAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPbmx5U3BlY2lmaWNNZXRob2RzKFN0cmluZyBhTWV0aG9kTmFtZVByZWZpeCwgTGlzdCBleGNsdWRlZE5hbWVzKSB7Ci0JCUxpc3QgbWV0aG9kcywgc3BlY2lmaWM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc3BlY2lmaWMgPSBuZXcgQXJyYXlMaXN0KG1ldGhvZHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChhTWV0aG9kTmFtZVByZWZpeCAhPSBudWxsICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aChhTWV0aG9kTmFtZVByZWZpeCkgJiYgZXhjbHVkZWROYW1lcyAhPSBudWxsICYmICFleGNsdWRlZE5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKQotCQkJCXNwZWNpZmljLmFkZChhTWV0aG9kKTsKLQkJfQotCQlyZXR1cm4gc3BlY2lmaWM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFBhY2thZ2VJbXBvcnRzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0UGFja2FnZUltcG9ydHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmltaXRpdmUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBnZXRQcmltaXRpdmUoKSB7Ci0JCVN0cmluZyBwcmltaXRpdmVOYW1lID0gZ2V0UHJpbWl0aXZlTmFtZSgpOwotCQlpZiAocHJpbWl0aXZlTmFtZSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBlUmVzb3VyY2UoKTsKLQkJCXJldHVybiAoSmF2YURhdGFUeXBlKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QocHJpbWl0aXZlTmFtZSwgcmVzLmdldFJlc291cmNlU2V0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRQcmltaXRpdmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoSU5URUdFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0lOVEVHRVJfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJPT0xFQU5fTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CT09MRUFOX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoU0hPUlRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9TSE9SVF9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoTE9OR19OQU1FKSkKLQkJCXJldHVybiBQUklNX0xPTkdfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKERPVUJMRV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0RPVUJMRV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQ0hBUkFDVEVSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQ0hBUkFDVEVSX0lEOwotCQlyZXR1cm4gUFJJTV9OT1RfSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgbmFtZSBmb3IgdGhpcyB0eXBlIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmltaXRpdmVOYW1lKCkgewotCQlTdHJpbmcgbXlOYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAobXlOYW1lLmVxdWFscyhJTlRFR0VSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fSU5URUdFUl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQk9PTEVBTl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhTSE9SVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX1NIT1JUX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKExPTkdfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9MT05HX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRE9VQkxFX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0NIQVJBQ1RFUl9OQU1FOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgZ2V0UHVibGljTWV0aG9kcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzKCkgewotCQlMaXN0IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlTWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBtLmdldEphdmFWaXNpYmlsaXR5KCkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSB7Ci0JCU1hcCBtZXRob2RzID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdE1ldGhvZHNFeHRlbmRlZChtZXRob2RzLCB0cnVlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlwdWJsaWNNZXRob2RzLmFkZChtKTsKLQkJfQotCQlyZXR1cm4gcHVibGljTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlTWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG0gPSAoTWV0aG9kKSB0aGVNZXRob2RzLmdldChpKTsKLQkJCWlmIChtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVJc1Byb3h5KCkpIHsKLQkJCXJlc3VsdCA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5nZXRGdWxsVHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gcHJpbUdldFF1YWxpZmllZE5hbWUoKTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnJCcsICcuJyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUgdXNlZCBmb3IgcmVmbGVjdGlvbi4gVHlwaWNhbGx5IGJlYW4gaW5mbyB3b3VsZCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiBwcmltR2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlYWRBZGFwdG9yIHdoaWNoIGNhbiByZWZsZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQkvLyBOZWVkIHRvIHN5bmMgYmVjYXVzZSBub3cgaW4gYSBtdWx0aS10aHJlYWQgZW52LgotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfUkVGTEVDVEVEID0gMHgwLCBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX01FVEhPRFMgPSAweDIsIFJFRkxFQ1RFRF9GSUVMRFMgPSAweDQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEJhc2UoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0JBU0UpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSBSRUZMRUNURURfQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RGaWVsZHMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0ZJRUxEUykgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhQ2xhc3NBZGFwdG9yKSByZWFkQWRhcHRvcikucmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0ZJRUxEUyB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBmaWVsZHMgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RNZXRob2RzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9NRVRIT0RTKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFDbGFzc0FkYXB0b3IpIHJlYWRBZGFwdG9yKS5yZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX01FVEhPRFMgfCBSRUZMRUNURURfQkFTRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZmllbGRzIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEphdmFDbGFzcyBnZXRTdXBlcnR5cGUoKSB7Ci0JCS8vIElmIHRoaXMgaXMgYW4gaW50ZXJmYWNlLCB0aGVyZSBpcyBubyBzdXBlcnR5cGUuIEhvd2V2ZXIsIHRoZSBlU3VwZXJUeXBlcyBJUyBmaWxsZWQgaW4gd2l0aCBhbnkgaW50ZXJmYWNlIHRoYXQgdGhpcyBleHRlbmRzLiAKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJcmV0dXJuICghbGlzdC5pc0VtcHR5KCkpID8gKEphdmFDbGFzcykgbGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJaWYgKHRoaXMgPT0gaW50ZXJmYWNlVHlwZSkKLQkJCXJldHVybiB0cnVlOwotCQlFTGlzdCBpbXBsZW1lbnRlZCA9IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUphdmFDbGFzcyBhbkludGVyZmFjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCQkJYW5JbnRlcmZhY2UgPSAoSmF2YUNsYXNzKSBpbXBsZW1lbnRlZC5nZXQoaSk7Ci0JCQlpZiAoYW5JbnRlcmZhY2UuaW1wbGVtZW50c0ludGVyZmFjZShpbnRlcmZhY2VUeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbXBsZW1lbnRzSW50ZXJmYWNlKGludGVyZmFjZVR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuCi0JICovCi0JcHVibGljIFN0cmluZyBpbmZvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB0cmlwIGNsYXNzIHJlZmxlY3Rpb24KLQkJLy9GQiB0aGlzLmVHZXQoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzc19QdWJsaWMoKSk7Ci0JCXJlZmxlY3RCYXNlKCk7IC8vRkIKLQkJb3V0LmFwcGVuZCgiSmF2YSBjbGFzczogIiArIGdldFF1YWxpZmllZE5hbWUoKSArICJcbiIpOwotCQlvdXQuYXBwZW5kKCIgIHN1cGVyY2xhc3M6ICIgKyB0aGlzLmdldFN1cGVydHlwZSgpICsgIlxuIik7Ci0JCUVMaXN0IGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQlGaWVsZCBmaWVsZDsKLQkJaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIEZpZWxkczpcbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCQlvdXQuYXBwZW5kKCIgICAgIiArICgoSmF2YUhlbHBlcnMpIGZpZWxkLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBmaWVsZC5nZXROYW1lKCkgKyAiXG4iKTsKLQkJCX0KLQkJfQotCQlFTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kcygpOwotCQlNZXRob2QgbWV0aG9kOwotCQlpZiAobWV0aG9kcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIE1ldGhvZHM6XG4iKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJCS8vIHRyaXAgbWV0aG9kIHJlZmxlY3Rpb24KLQkJCQltZXRob2QuaXNTdGF0aWMoKTsKLQkJCQlpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSAhPSBudWxsKQotCQkJCQlvdXQuYXBwZW5kKCIgICAgIiArIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKSArICIgIik7Ci0JCQkJZWxzZQotCQkJCQlvdXQuYXBwZW5kKCIgICAgdm9pZCAiKTsKLQkJCQlvdXQuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCQkJCUVMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm07Ci0JCQkJaWYgKHBhcm1zLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHBhcm1zLnNpemUoKTsgaWkrKykgewotCQkJCQkJcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoaWkpOwotCQkJCQkJLy9GQiBpZiAoIXBhcm0uaXNSZXR1cm4oKSkgewotCQkJCQkJb3V0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJtLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBwYXJtLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAoaWkgPCBwYXJtcy5zaXplKCkgLSAxKQotCQkJCQkJCW91dC5hcHBlbmQoIiwgIik7Ci0JCQkJCQkvL0ZCIH0KLQkJCQkJfQotCQkJCX0KLQkJCQlvdXQuYXBwZW5kKCIpXG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmhlcml0c0Zyb20oSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlpZiAodGhpcyA9PSBqYXZhQ2xhc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbmhlcml0c0Zyb20oamF2YUNsYXNzKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MuIEluIG90aGVyIHdvcmRzIGlzIHRoaXMgY2xhc3MgYSBzdXBlcnR5cGUgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcywKLQkgKiBvciBpcyBpdCBzdXBlcmludGVyZmFjZSBvZiBpdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlpZiAoYUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQlKYXZhQ2xhc3MgdGhlQ2xhc3MgPSAoSmF2YUNsYXNzKSBhQ2xhc3M7Ci0JCQkvLyBJZiBlaXRoZXIgdGhpcyBjbGFzcyBvciBhQ2xhc3Mga2luZCBpcyB1bmtub3duIHRoZW4gaXQgaXNuJ3QgYXNzaWduYWJsZUZyb20uCi0JCQlpZiAoZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMIHx8IHRoZUNsYXNzLmdldEtpbmQoKSA9PSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBJZiB0aGUgImFDbGFzcyIgaXMgbm90IGEgSmF2YUNsYXNzIChpLmUuIGl0IGlzIGVpdGhlciBhIEphdmFEYXRhdHlwZSBvcgotCQkJLy8gc29tZSBvdGhlciBraW5kIG9mIE1PRiBjbGFzc2lmaWVyKSwgdGhlbiBpdCBjYW5ub3QgYmUKLQkJCS8vIGFzc2lnbmVkIHRvIHNvbWV0aGluZyBvZiB0aGlzIGNsYXNzLgotCQkJaWYgKGdldEtpbmQoKSAhPSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkKLQkJCQlpZiAodGhlQ2xhc3MuZ2V0S2luZCgpICE9IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKQotCQkJCQlyZXR1cm4gdGhlQ2xhc3MuaW5oZXJpdHNGcm9tKHRoaXMpOwotCQkJCWVsc2UgewotCQkJCQkvLyBhQ2xhc3MgaXMgYW4gaW50ZXJmYWNlLCBzbyBpdCBpcyBhc3NpZ25hYmxlIG9ubHkgaWYKLQkJCQkJLy8gInRoaXMiIGlzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQkJCQkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRoZUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhpcyB0eXBlIGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdUeXBlKCkgewotCQkvLyBUT0RPOiBUZW1wb3JhcnksIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJICAgIHJldHVybiAoYWRhcHRlcikuaGFzUmVmbGVjdGlvblNvdXJjZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoaXMgaXMgdmFsaWQgb2JqZWN0IG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSUluc3RhbnRpYXRpb25JbnN0YW5jZSA/IGlzQXNzaWduYWJsZUZyb20oKChJSW5zdGFudGlhdGlvbkluc3RhbmNlKSBvKS5nZXRKYXZhVHlwZSgpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIGZpZWxkcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KLQkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHN1cGVydHlwZXMgYWJvdmUgSmF2YUNsYXNzIHdpbGwgaG9sZCBBdHRyaWJ1dGVzIHJhdGhlciB0aGFuIEZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgRmllbGRbXSBsaXN0RmllbGRFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtmaWVsZHMuc2l6ZSgpXTsKLQkJZmllbGRzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcwotCSAqIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VwZXJ0eXBlcyBhYm92ZSBKYXZhQ2xhc3Mgd2lsbCBob2xkIE9wZXJhdGlvbnMgcmF0aGVyIHRoYW4gTWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCkgewotCQlqYXZhLnV0aWwuTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbbWV0aG9kcy5zaXplKCldOwotCQltZXRob2RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlpZiAoZUlzUHJveHkoKSkgewotCQkJcmVzdWx0ID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmdldEZ1bGxUeXBlTmFtZShlUHJveHlVUkkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhUGFja2FnZSBwYWNrID0gZ2V0SmF2YVBhY2thZ2UoKTsKLQkJCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5nZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApCi0JCQkJcmVzdWx0ID0gcGFjay5nZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgKChKYXZhUmVmRmFjdG9yeUltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRSkucHJpbUdldFR5cGVOYW1lKHRoaXMucHJpbUdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gdGhpcy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgotCSAqIG1lY2hhbmlzbS4gTG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUsIHJlbGF0ZWRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWZsZWN0aW9uCi0JICogbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBvciBjbGFzcyBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZQotCSAqIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhUGFja2FnZU5hbWUsIGFDbGFzc05hbWUsIHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpOwotCQlMaXN0IHMgPSBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCQlzLmNsZWFyKCk7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpCi0JCQlzLmFkZChhSmF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXZlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQzoKLQkJCQlyZXR1cm4gaXNQdWJsaWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlSW1wb3J0cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJcmV0dXJuIGdldEZpZWxkcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldERlY2xhcmVkQ2xhc3NlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEphdmFQYWNrYWdlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiBnZXRFdmVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QWxsRXZlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlzZXRLaW5kKChUeXBlS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCWdldEluaXRpYWxpemVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKFBVQkxJQ19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOgotCQkJCWdldENsYXNzSW1wb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCWdldEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCkgIT0gUFVCTElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0ludGVyZmFjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGNsYXNzSW1wb3J0ICE9IG51bGwgJiYgIWNsYXNzSW1wb3J0LmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBwYWNrYWdlSW1wb3J0cyAhPSBudWxsICYmICFwYWNrYWdlSW1wb3J0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZmllbGRzICE9IG51bGwgJiYgIWZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgIWluaXRpYWxpemVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlcyAhPSBudWxsICYmICFkZWNsYXJlZENsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZXZlbnRzICE9IG51bGwgJiYgIWV2ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuICFnZXRBbGxFdmVudHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXNzZWQgSmF2YUNsYXNzIGlzIGEgdmFsaWQgc3VwZXIgY2xhc3MgKGkuZS4sIGl0IGRvZXMgbm90IGNyZWF0ZSBhbnkgY3ljbGVzIGluIHRoZSBpbmhlcml0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUphdmFDbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCXRocm93IG5ldyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKHRoaXMsIGFKYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQkJaWYgKGFKYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXF1YWxzKGFKYXZhQ2xhc3MpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBleHRlbmRlZElzVmFsaWRTdXBlcnR5cGUoZ2V0U3VidHlwZXMoKSwgYUphdmFDbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1YnR5cGVzCi0JICogQHBhcmFtIGFKYXZhQ2xhc3MKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRJc1ZhbGlkU3VwZXJ0eXBlKExpc3Qgc3VidHlwZXMsIEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmICghYmFzaWNJc1ZhbGlkU3VwZXJ0eXBlKHN1YnR5cGVzLCBhSmF2YUNsYXNzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YUNsYXNzIHN1YnR5cGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1YnR5cGUgPSAoSmF2YUNsYXNzKSBzdWJ0eXBlcy5nZXQoaSk7Ci0JCQlpZiAoIXN1YnR5cGUuaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhc2ljSXNWYWxpZFN1cGVydHlwZShMaXN0IHN1YnR5cGVzLCBKYXZhQ2xhc3MgYUphdmFDbGFzcykgewotCQlKYXZhQ2xhc3Mgc3VidHlwZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlcy5zaXplKCk7IGkrKykgewotCQkJc3VidHlwZSA9IChKYXZhQ2xhc3MpIHN1YnR5cGVzLmdldChpKTsKLQkJCWlmIChzdWJ0eXBlLmVxdWFscyhhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0U3VidHlwZXMoKSB7Ci0JCXJldHVybiBnZXRFU3VwZXJBZGFwdGVyKCkuZ2V0U3ViY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIGdldFF1YWxpZmllZE5hbWUoKSArICIpIjsKLQl9Ci0KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEtpbmRHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFR5cGVLaW5kIG5ld0tpbmQpIHsKLQkJVHlwZUtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gaXNQdWJsaWNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiBuZXdQdWJsaWMpIHsKLQkJYm9vbGVhbiBvbGRQdWJsaWMgPSAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UHVibGljKSBlRmxhZ3MgfD0gUFVCTElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+UFVCTElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUMsIG9sZFB1YmxpYywgbmV3UHVibGljKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZEdlbigpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEluaXRpYWxpemVycygpIHsKLQkJaWYgKGluaXRpYWxpemVycyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChJbml0aWFsaXplci5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLAotCQkJCQlKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxpemVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgbmV3RGVjbGFyaW5nQ2xhc3MpIHsKLQkJaWYgKG5ld0RlY2xhcmluZ0NsYXNzICE9IGRlY2xhcmluZ0NsYXNzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZWNsYXJpbmdDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERlY2xhcmluZ0NsYXNzKG5ld0RlY2xhcmluZ0NsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgbmV3RGVjbGFyaW5nQ2xhc3MsIG5ld0RlY2xhcmluZ0NsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgZGVjbGFyaW5nQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlY2xhcmluZ0NsYXNzID0gKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzczsKLQkJCWRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZERlY2xhcmluZ0NsYXNzKTsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBvbGREZWNsYXJpbmdDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgb2xkRGVjbGFyaW5nQ2xhc3MsIGRlY2xhcmluZ0NsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKEphdmFDbGFzcyBuZXdEZWNsYXJpbmdDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKYXZhQ2xhc3Mgb2xkRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLQkJZGVjbGFyaW5nQ2xhc3MgPSBuZXdEZWNsYXJpbmdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTLCBvbGREZWNsYXJpbmdDbGFzcywgbmV3RGVjbGFyaW5nQ2xhc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXREZWNsYXJlZENsYXNzZXMoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkgewotCQlpZiAoZGVjbGFyZWRDbGFzc2VzID09IG51bGwpIHsKLQkJCWRlY2xhcmVkQ2xhc3NlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsgLy8gQXMgb2YgRU1GIDIuMCwgbG9jYWwgcHJvcGVydGllcyBhcmUgdGhlIGxvY2FsIGZlYXR1cmVzLiBVc2VkIHRvIGJlIGEgbWVyZ2Ugb2YgZWF0dHJpYnV0ZXMgYW5kIGVyZWZlcmVuY2VzLgotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBhZGFwdGVyID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEV2ZW50cygpOwotCQlyZXR1cm4gZ2V0RXZlbnRzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50c0dlbigpIHsKLQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7Ci0JCQlldmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YUV2ZW50LmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFMpOwotCQl9Ci0JCXJldHVybiBldmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxFdmVudHM7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgaWEgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoaWEgPT0gbnVsbCkKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7IC8vIE5vIGludHJvc3BlY3Rpb24sIGRvIG5vcm1hbC4KLQkJcmV0dXJuIGFsbEV2ZW50cyA9IGlhLmdldEFsbEV2ZW50cygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxFdmVudHNHZW4oKSB7Ci0JCXJldHVybiBhbGxFdmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxQcm9wZXJ0aWVzOwotCi0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBpYSA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChpYSA9PSBudWxsKQotCQkJcmV0dXJuIEVDb2xsZWN0aW9ucy5FTVBUWV9FTElTVDsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlyZXR1cm4gYWxsUHJvcGVydGllcyA9IGlhLmdldEFsbFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllc0dlbigpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpIHsKLQkJaWYgKGltcGxlbWVudHNJbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWltcGxlbWVudHNJbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUykgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKiAKLQkJCQkgKiBAc2luY2UgMS4xLjAKLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5nZXQoaW5kZXgpOyAvL2ZvcmNlIHJlc29sdXRpb24gc28gdGhlIEVTdXBlckFkYXB0ZXIgd2lsbCBiZSB1cGRhdGVkIGNvcnJlY3RseQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQkJc3VwZXIuY2xlYXIoKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQkJCQlzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZChpbmRleCwgb2JqZWN0KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZChvYmplY3QpOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlczsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGdldEludGVyZmFjZVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDbGFzc0ltcG9ydEdlbigpIHsKLQkJaWYgKGNsYXNzSW1wb3J0ID09IG51bGwpIHsKLQkJCWNsYXNzSW1wb3J0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzSW1wb3J0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsvL0ZvcmNlIHJlZmxlY3Rpb24sIGlmIG5lZWRlZCwgYmVmb3JlIGdldHRpbmcgYWxsIHN1cGVydHlwZXMuCi0JCXJldHVybiBzdXBlci5nZXRFQWxsU3VwZXJUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IHRoZSByZWZsZWN0aW9uCi0JICogYWRhcHRlcnMgY2FuIHJlZmVyZW5jZSB0aGUgdW5yZWZsZWN0ZWQgc3VwZXJ0eXBlcy4KLQkgKiAgCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFTGlzdCBwcmltR2V0RVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlSW1wb3J0c0dlbigpIHsKLQkJaWYgKHBhY2thZ2VJbXBvcnRzID09IG51bGwpIHsKLQkJCXBhY2thZ2VJbXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhUGFja2FnZS5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZUltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpZWxkc0dlbigpIHsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCQlmaWVsZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChGaWVsZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kc0dlbigpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2VHZW4oKSB7Ci0JCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gYmFzaWNHZXRKYXZhUGFja2FnZSgpOwotCQlyZXR1cm4gamF2YVBhY2thZ2UgIT0gbnVsbCAmJiBqYXZhUGFja2FnZS5lSXNQcm94eSgpID8gKEphdmFQYWNrYWdlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClqYXZhUGFja2FnZSkgOiBqYXZhUGFja2FnZTsKLQl9Ci0KLQkvKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBiYXNpY0dldEphdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF2YVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCB0cnVlLiBJdCBpcyBiYXNpY2FsbHkgb25seSBmb3IgcmVzZXQgb2YgcmVmbGVjdGlvbiwgbm90IHRvIHNldCBhIHBhcnRpY3VsYXIgc3RhdGUuIEJ1dCBJbnRlcm5hbFJlYWRBZGFwdGFibGUKLQkgKiBtYXkgYmUgdXNlZCBieSBzb21lb25lIHRoYXQgc2hvdWxkbid0IHNvIHRvIGJlIGJlIHNhZmUgd2Uga2VlcCBpdC4gVE9ETyBSZW1vdmUgSW50ZXJuYWxSZWFkQWRhcHRhYmxlIGluIG5leHQgdmVyc2lvbi4gTmVlZCB0byB3YWl0IGJlY2F1c2Ugd2UKLQkgKiBuZWVkIHRpbWUgdG8gbm90aWZ5IGV2ZXJ5b25lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSW50ZXJuYWxSZWFkQWRhcHRhYmxlI3NldFJlZmxlY3RlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAoIWFCb29sZWFuKQotCQkJcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRSZWZsZWN0aW9uVHlwZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uVHlwZSgpIHsKLQkJSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGphID0gKChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIGdldFJlYWRBZGFwdGVyKCkpOwotCQlyZXR1cm4gamEgIT0gbnVsbCA/IGphLmdldFJlZmxlY3Rpb25Tb3VyY2UoKSA6IG51bGw7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDZhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURhdGFUeXBlSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBKYXZhRGF0YVR5cGUgewotCi0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfWkVSTyA9ICIwLjAiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfWkVSTyA9ICIwLjBmIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJfWkVSTyA9ICInMCciOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWkVSTyA9ICIwIjsKLQkKLQlwcml2YXRlIGludCBwcmltaXRpdmVfdHlwZSA9IFBSSU1fTk9UX0lEOwotCQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEphdmFOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9CT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIEZBTFNFOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIERPVUJMRV9aRVJPOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQlyZXR1cm4gRkxPQVRfWkVSTzsJCQkKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBDSEFSX1pFUk87Ci0JCXJldHVybiBaRVJPOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFByaW1pdGl2ZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW1pdGl2ZUlEKCkgewotCQlpZiAocHJpbWl0aXZlX3R5cGUgPT0gUFJJTV9OT1RfSUQpIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQk9PTEVBTl9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQ0hBUkFDVEVSX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQllURV9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQllURV9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX1NIT1JUX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9TSE9SVF9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0lOVEVHRVJfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0lOVEVHRVJfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9MT05HX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9MT05HX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0ZMT0FUX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9ET1VCTEVfSUQ7Ci0JCX0KLQkJcmV0dXJuIHByaW1pdGl2ZV90eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJU3RyaW5nIHdyYXBwZXJOYW1lID0gZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHdyYXBwZXJOYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUod3JhcHBlck5hbWUsIHRoaXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBnZXRXcmFwcGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKSB7Ci0JCXN3aXRjaCAoZ2V0UHJpbWl0aXZlSUQoKSkgewotCQkJY2FzZSBQUklNX0lOVEVHRVJfSUQ6Ci0JCQkJcmV0dXJuIElOVEVHRVJfTkFNRTsKLQkJCWNhc2UgUFJJTV9DSEFSQUNURVJfSUQ6Ci0JCQkJcmV0dXJuIENIQVJBQ1RFUl9OQU1FOwotCQkJY2FzZSBQUklNX0JPT0xFQU5fSUQ6Ci0JCQkJcmV0dXJuIEJPT0xFQU5fTkFNRTsKLQkJCWNhc2UgUFJJTV9CWVRFX0lEOgotCQkJCXJldHVybiBCWVRFX05BTUU7Ci0JCQljYXNlIFBSSU1fU0hPUlRfSUQ6Ci0JCQkJcmV0dXJuIFNIT1JUX05BTUU7Ci0JCQljYXNlIFBSSU1fTE9OR19JRDoKLQkJCQlyZXR1cm4gTE9OR19OQU1FOwotCQkJY2FzZSBQUklNX0ZMT0FUX0lEOgotCQkJCXJldHVybiBGTE9BVF9OQU1FOwotCQkJY2FzZSBQUklNX0RPVUJMRV9JRDoKLQkJCQlyZXR1cm4gRE9VQkxFX05BTUU7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qCi0JICogSmF2YUhlbHBlcnMuaXNBcnJheSgpIC0gYXJyYXkgdHlwZXMgYXJlIGFsd2F5cyBKYXZhQ2xhc3NlcywgZXZlbiBpZiB0aGVpciBjb21wb25lbnQgdHlwZSBpcwotCSAqCQlhIHByaW1pdGl2ZSBkYXRhIHR5cGUuIFJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbgotCSAqIG9iamVjdCBvZiB0aGlzIGNsYXNzPyBJbiB0aGUgY2FzZSBvZiBwcmltaXRpdmVzLCBhcmUgdGhleSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlyZXR1cm4gdGhpcyA9PSBhQ2xhc3M7Ci0JfQotCS8qKgotCSAqIFNlZSBpZiB0aGlzIGlzIHZhbGlkIG9iamVjdCBvZiB0aGlzIHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnN0YW5jZShPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIElJbnN0YW50aWF0aW9uSW5zdGFuY2UgPyBpc0Fzc2lnbmFibGVGcm9tKCgoSUluc3RhbnRpYXRpb25JbnN0YW5jZSkgbykuZ2V0SmF2YVR5cGUoKSkgOiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2E1Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFdmVudEltcGwgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIGltcGxlbWVudHMgSmF2YUV2ZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfRVZFTlQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmZhYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSB0byB1c2UgSmF2YVJlZiBwYWNrYWdlcy4gSXQgd2lsbCB1c2UgdGhlCi0gKiBJSW5zdGFudGlhdGlvbkhhbmRsZXIsIGlmIHRoZXJlIGlzIG9uZSwgdG8gZG8gdGhlCi0gKiBmYWN0b3J5IHJlcXVlc3RzLiBFbHNlIGl0IHdpbGwgbGV0IHRoZSBzdXBlcmNsYXNzIGhhbmRsZSBpdC4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCB7Ci0JCi0JcHJpdmF0ZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIgaW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJldHJpZXZlZEhhbmRsZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUZhY3RvcnlJbXBsLgotCSAqLwotCXB1YmxpYyBKYXZhRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpIHsKLQkJaWYgKCFyZXRyaWV2ZWRIYW5kbGVyKSB7Ci0JCQkvLyBOZWVkIHRvIHJldHJpZXZlIGhhbmRsZXIgbGF6aWx5IGJlY2F1c2Ugd2hlbiBmYWN0b3J5IGlzIGNyZWF0ZWQgaXQgZG9lcyBub3QgeWV0IGtub3cgd2hhdCBSZXNvdXJjZVNldCBpdCBpcyBpbi4KLQkJCS8vIENhbid0IGtub3cgdGhhdCB1bnRpbCB0aGUgZmlyc3QgdGltZSB3ZSBuZWVkIGEgaGFuZGxlci4KLQkJCVJlc291cmNlU2V0IHJzZXQgPSBnZXRFUGFja2FnZSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocnNldCAhPSBudWxsKSB7Ci0JCQkJcmV0cmlldmVkSGFuZGxlciA9IHRydWU7Ci0JCQkJSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZmFjdG9yeSA9IChJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJaW5zdGFudGlhdGlvbkhhbmRsZXIgPSBmYWN0b3J5LmdldEluc3RhbnRpYXRpb25IYW5kbGVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uSGFuZGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkjY3JlYXRlKEVDbGFzcykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlJSW5zdGFudGlhdGlvbkhhbmRsZXIgaWEgPSBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpOwotCQlpZiAoaWEgPT0gbnVsbCB8fCAhaWEuaGFuZGxlc0NsYXNzKGVDbGFzcykpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlKGVDbGFzcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBpYS5jcmVhdGUoZUNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNmEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVBhY2thZ2UsIEVQYWNrYWdlIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBjbGFzc2VzIHRoYXQgdGhpcyBwYWNrYWdlIGNvbnRhaW5zLgotCSAqIFNpbmNlIHRoaXMgaXMgYSBkZXJpdmVkIHJlbGF0aW9uc2hpcCwgd2UgbmVlZCB0byBpbXBsZW1lbnQKLQkgKiBpdCBoZXJlLiBJdCB3aWxsIGdldCB0aGUgbWV0YW9iamVjdHMgbGlzdC4gVGhlc2UgYXJlIHRoZQotCSAqIGphdmEgY2xhc3NlcyB0aGlzIHBhY2thZ2UgY29udGFpbnMuCi0JICoKLQkgKiBJZiB0aGlzIGlzIHRoZSBwcmltaXRpdmVzIHBhY2thZ2UsIHRoZW4gaXQgbXVzdCByZXR1cm4KLQkgKiBhbiBlbXB0eSBsaXN0IGJlY2F1c2UgaXQgZG9lc24ndCBjb250YWluIGFueSBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhQ2xhc3NlcygpIHsKLQkJcmV0dXJuICFQUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhnZXROYW1lKCkpID8KLQkJCUVDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVFTGlzdChnZXRFQ2xhc3NpZmllcnMoKSkgOgotCQkJRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiAhZ2V0SmF2YUNsYXNzZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgcGFja2FnZS4KLSAqIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgLmphdmFwcmltIHBhY2thZ2UKLSAqIHNpbmNlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgcGFja2FnZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCWlmIChpc0RlZmF1bHQoKSkKLQkJcmV0dXJuICIiOwotCWVsc2UKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCi0JU3RyaW5nIGludGVybmFsTmFtZSA9IHN1cGVyLmdldE5hbWUoKSA7Ci0JcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZSA7CQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCXJldHVybiBKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhzdXBlci5nZXROYW1lKCkpOwkKLX0KLQkvKioKLQkgKiBTaW5jZSBjbGFzc2VzIGFyZSBsb2FkZWQgZHluYW1pY2FsbHkgYW5kIG5vdCBmcm9tIGEgc2NoZW1hLCBhCi0JICogY2xhc3MgY291bGQgYmUgYXNrZWQgZm9yIHRocm91Z2ggdGhpcyBtZXRob2QsIGFuZCBpZiBub3QgeWV0IHJlZmxlY3RlZCwKLQkgKiBpdCB3b3VsZG4ndCBiZSBmb3VuZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY2xhc3MgYXNrZWQgZm9yCi0JICogaW4gdGhpcyBwYWNrYWdlIGlzIGZvdW5kIChpLmUuIHBvb2ZlZCB1cCkuIE90aGVyd2lzZSBsb2FkaW5nIGFuIGluc3RhbmNlCi0JICogZG9jdW1lbnQgdGhhdCByZWZlcnMgdG8gamF2YSBjbGFzcyB0aHJvdWdoIG5hbWVzcGFjZXMgd29uJ3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVDbGFzc2lmaWVyKFN0cmluZyBjbGFzc05hbWUpIHsJCQkKLQkJLy8gVHJ5IHRvIGdldCB0aGUgY2xhc3MgZnJvbSB0aGUgcmVzb3VyY2UgdGhhdCB0aGlzIHBhY2thZ2UgaXMgaW4uCi0JCS8vIFRoaXMgd2lsbCBjcmVhdGUgaXQgaWYgbm90IGZvdW5kLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlCi0JCS8vIHN0cnVjdHVyZSBpcyB0aGVyZSBpcyBvbmUgamF2YSBwYWNrYWdlIHBlciByZXNvdXJjZSwgYW5kCi0JCS8vIHRoZSBpZCBvZiB0aGUgY2xhc3MgaXMgdGhlIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZQotCQkvLyBwb3J0aW9uLCB3aGljaCBpcyB3aGF0IGNsYXNzTmFtZSBhYm92ZSBpcy4KLQkJT2JqZWN0IHJlc3VsdCA9IGVSZXNvdXJjZSgpLmdldEVPYmplY3QoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIChyZXN1bHQgaW5zdGFuY2VvZiBFQ2xhc3NpZmllcikgPyAoRUNsYXNzaWZpZXIpIHJlc3VsdCA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0UGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVBhY2thZ2UgcmVmbGVjdChTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RQYWNrYWdlKHBhY2thZ2VOYW1lLCBzZXQpOwotICAgIH0KLQlAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ29udGVudHMoKQotCSAgewotCSAgICBpZiAoZUNvbnRlbnRzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQ29udGVudHMgPSBFQ29udGVudHNFTGlzdC5jcmVhdGVFQ29udGVudHNFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNvbnRlbnRzOwotCSAgfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotfSAvL0phdmFQYWNrYWdlSW1wbAotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFyYW1ldGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmIyY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFyYW1ldGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtZXRlckltcGwgZXh0ZW5kcyBFUGFyYW1ldGVySW1wbCBpbXBsZW1lbnRzIEphdmFQYXJhbWV0ZXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcktpbmQoKSA8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcktpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQgPSBKYXZhUGFyYW1ldGVyS2luZC5JTl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXJLaW5kIHBhcmFtZXRlcktpbmQgPSBQQVJBTUVURVJfS0lORF9FREVGQVVMVDsKLQlwcm90ZWN0ZWQgSmF2YVBhcmFtZXRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQVJBTUVURVI7Ci0JfQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKWdldEVUeXBlKCk7Ci0JfQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuIChlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2QpID8gKChNZXRob2QpZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSA6IHRoaXMuZ2V0TmFtZSgpOwotICB9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyS2luZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKChKYXZhUGFyYW1ldGVyS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBwYXJhbWV0ZXJLaW5kICE9IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGdldEphdmFUeXBlKCkuaXNBcnJheSgpOwotCX0KLQkvKioKLQkgKiBJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JldHVybigpIHsKLQkJcmV0dXJuIEphdmFQYXJhbWV0ZXJLaW5kLlJFVFVSTiA9PSBnZXRQYXJhbWV0ZXJLaW5kKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldFBhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcktpbmQoSmF2YVBhcmFtZXRlcktpbmQgbmV3UGFyYW1ldGVyS2luZCkgewotCQlKYXZhUGFyYW1ldGVyS2luZCBvbGRQYXJhbWV0ZXJLaW5kID0gcGFyYW1ldGVyS2luZDsKLQkJcGFyYW1ldGVyS2luZCA9IG5ld1BhcmFtZXRlcktpbmQgPT0gbnVsbCA/IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUIDogbmV3UGFyYW1ldGVyS2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5ELCBvbGRQYXJhbWV0ZXJLaW5kLCBwYXJhbWV0ZXJLaW5kKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHJlZmxlY3Rpb24gYWRhcHRlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGVDb250YWluZXIoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfUEFSQU1fTkFNRSA9IDB4MjsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IFJFRkxFQ1RFRF9CQVNFOyAgLy8gQXQgdGhpcyB0aW1lIGJhc2UgcmVmbGVjdGlvbgotCQkJCQkJCQkJCQkJCSAgLy8gaXMgcGVyZm9ybWVkIGF0IGNyZWF0aW9uLgotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFBhcmFtTmFtZSgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfUEFSQU1fTkFNRSkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhTWV0aG9kQWRhcHRlcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQkvLyBOb3JtYWxseSB3ZSB3b3VsZG4ndCBuZWVkIHRvIHNldCB0aGlzIGJlY2F1c2UgaXQgd291bGQgYmUgc2V0IGR1cmluZyB0aGUgcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSwgYnV0Ci0JCQkJLy8gaW4gY2FzZSB0aGVyZSB3YXMgYSBwcm9ibGVtIHdlIG1hcmsgaXQgc3RpbGwgcmVmbGVjdGVkIHNvIHdlIGRvbid0IHRyeSBhZ2Fpbi4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfQkFTRSB8IFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBnZW5lcmF0ZWQgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZWZsZWN0UGFyYW1OYW1lKCk7Ci0JCXJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIuc2V0TmFtZShuYW1lKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCSAgIHJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJLaW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUmVmRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbC5KYXZhQ29udGV4dDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF2YVJlZkZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhUmVmRmFjdG9yeSB0aGVKYXZhUmVmRmFjdG9yeSA9IChKYXZhUmVmRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiamF2YS54bWkiKTsgCi0JCQlpZiAodGhlSmF2YVJlZkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKYXZhUmVmRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKYXZhUmVmRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlcyBhYm91dCBUeXBlIFVSSSdzLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgYSB0eXBlIHVyaSBpczogImphdmE6L3BhY2thZ2UjY2xhc3NuYW1lIi4gInBhY2thZ2UiIGlzIGVpdGhlciB0aGUgcGFja2FnZSBuYW1lLAotCSAqIHdpdGggJy4nIGZvciBwYWNrYWdlIHNlcGFyYXRvciAoZS5nLiAiamF2YTovYS5iI1hZWiIpLiBPciBmb3IgcHJpbWl0aXZlIChlLmcuICJqYXZhOi8jaW50Iikgb3IKLQkgKiBmb3IgZGVmYXVsdCBwYWNrYWdlIChlLmcuICJqYXZhOi8jWFlaIikuCi0JICogPHA+Ci0JICogVGhlIGNsYXNzbmFtZSBoYXMgc29tZSBzcGVjaWFsIGNoYW5nZXMuIEZpcnN0IGl0IG11c3QgdXNlIHJlZmxlY3Rpb24gZm9ybWF0IHdoaWNoIG1lYW5zCi0JICogdGhhdCBhbnkgaW5uZXIgY2xhc3MgbXVzdCB1c2UgdGhlICckJyBmb3JtYXQsIGkuZS4gIkEuQiIgbXVzdCBiZSAiQSRCIi4KLQkgKiA8cD4KLQkgKiBOZXh0IGlmIHRoZXJlIGlzCi0JICogYSBnZW5lcmljIGludm9sdmVkIHRoZW4gaXQgbXVzdCBiZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OiAiQTw/IGV4dGVuZHMgYS5CPiIgd2lsbAotCSAqIGJlIGNoYW5nZWQgdG8gIkF7PyBleHRlbmRzIGEhQn0iLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGZpcnN0IHRoYXQgJzwnIGFuZCAnPicgYXJlCi0JICogaW52YWxpZCBpbiBhIGZyYWdtZW50IChpZCkgb2YgYSBVUkkuIFNvIHdlIHJlcGxhY2UgdGhlbSB3aXRoICd7fScuIE5leHQgYmVjYXVzZSB3ZSB1c2UKLQkgKiB0aGUgZnJhZ21lbnQgIkEuZmllbGQiIG9yICJBLm1ldGhvZCgiIHRvIG1lYW4gYSBmaWVsZCBvciBtZXRob2QgaWQsIHdlIGNhbid0IGhhdmUgdGhlCi0JICogJy4nIGluIHRoZSBnZW5lcmljIHBvcnRpb24uIElmIGl0IHdhcyB0aGVyZSB3ZSBjb3VsZG4ndCBxdWlja2x5IGZpbmQgdGhlIGFwcHJvcHJpYXRlIG5lc3RpbmcKLQkgKiBvZiB0aGUgZ2VuZXJpYydzICd7fScgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhbm90aGVyIGdlbmVyaWMgd2l0aGluIHRoZSBnZW5lcmljLCBhbmQgdGhlbgotCSAqIHNheSB0byBmaW5kIHRoZSAnLicgYWZ0ZXIgdGhhdCBuZXN0ZWQgc2V0LgotCSAqLwotCi0JCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19JRF9TRVBBUkFUT1I8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0lEX1NFUEFSQVRPUiA9ICchJzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NFUEFSQVRPUjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEdFTkVSSUNfU0VQQVJBVE9SID0gJy4nOwotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPkdFTkVSSUNfSURfRU5EPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9FTkQgPSAnfSc7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19FTkQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0VORCA9ICc+JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX0lEX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9TVEFSVCA9ICd7JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19TVEFSVCA9ICc8JzsKLQkKLQotCXB1YmxpYyBKYXZhUmVmRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1M6IHJldHVybiBjcmVhdGVKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVI6IHJldHVybiBjcmVhdGVJbml0aWFsaXplcigpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUjogcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EOiByZXR1cm4gY3JlYXRlTWV0aG9kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEOiByZXR1cm4gY3JlYXRlRmllbGQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0s6IHJldHVybiBjcmVhdGVCbG9jaygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UOiByZXR1cm4gY3JlYXRlQ29tbWVudCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlQ6IHJldHVybiBjcmVhdGVTdGF0ZW1lbnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFOiByZXR1cm4gY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEU6IHJldHVybiBjcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRTogcmV0dXJuIGNyZWF0ZUFycmF5VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuVFlQRV9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVUeXBlS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1ZJU0lCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXJLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0pBVkFfSEVMUEVSUzoKLQkJCQlyZXR1cm4gY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9MSVNUOgotCQkJCXJldHVybiBjcmVhdGVKVHlwZUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlRZUEVfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9WSVNJQklMSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKYXZhVmlzaWJpbGl0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9KQVZBX0hFTFBFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKVHlwZUphdmFIZWxwZXJzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSlRZUEVfTElTVDoKLQkJCQlyZXR1cm4gY29udmVydEpUeXBlTGlzdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBjb21wb25lbnRUeXBlKSB7Ci0JCUFycmF5VHlwZSBhdCA9IGNyZWF0ZUFycmF5VHlwZSgpOwotCQkKLQkJU3RyaW5nIGNvbXB1dGVkTmFtZSA9IGNvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIltdIjsKLQkJYXQuc2V0TmFtZShjb21wdXRlZE5hbWUpOwotCQlyZXR1cm4gYXQ7Ci0JfQotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJQXJyYXlUeXBlIGF0ID0gY3JlYXRlQXJyYXlUeXBlKCk7Ci0JCQotCQlTdHJpbmcgY29tcHV0ZWROYW1lID0gZmluYWxDb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspewotCQkJY29tcHV0ZWROYW1lID0gY29tcHV0ZWROYW1lICsgIltdIjsKLQkJfQotCQlhdC5zZXROYW1lKGNvbXB1dGVkTmFtZSk7Ci0JCXJldHVybiBhdDsKLQl9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgamF2YSBjb250ZXh0Ci0gICAqIEByZXR1cm4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNjcmVhdGVKYXZhQ29udGV4dCgpfSBpbnN0ZWFkLgotICAgKiBAc2luY2UgMS4yLjAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSmF2YUNvbnRleHQoKSB7Ci0gICAgcmV0dXJuIEphdmFDb250ZXh0LmNyZWF0ZUphdmFDb250ZXh0KCk7Ci0gIH0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpfSBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhQ29udGV4dC5nZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNzZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhDbGFzcyl9IGluc3RlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKENsYXNzIGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCUphdmFDb250ZXh0LnNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVNZXRob2QoKSB7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gbmV3IE1ldGhvZEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpIHsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSBuZXcgSmF2YUNsYXNzSW1wbCgpOwotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVGaWVsZCgpIHsKLQkJRmllbGRJbXBsIGZpZWxkID0gbmV3IEZpZWxkSW1wbCgpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEJsb2NrIGNyZWF0ZUJsb2NrKCkgewotCQlCbG9ja0ltcGwgYmxvY2sgPSBuZXcgQmxvY2tJbXBsKCk7Ci0JCXJldHVybiBibG9jazsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KCkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCkgewotCQlTdGF0ZW1lbnRJbXBsIHN0YXRlbWVudCA9IG5ldyBTdGF0ZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCkgewotCQlJbml0aWFsaXplckltcGwgaW5pdGlhbGl6ZXIgPSBuZXcgSW5pdGlhbGl6ZXJJbXBsKCk7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCkgewotCQlKYXZhUGFyYW1ldGVySW1wbCBqYXZhUGFyYW1ldGVyID0gbmV3IEphdmFQYXJhbWV0ZXJJbXBsKCk7Ci0JCXJldHVybiBqYXZhUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCkgewotCQlBcnJheVR5cGVJbXBsIGFycmF5VHlwZSA9IG5ldyBBcnJheVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcnJheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVLaW5kIGNyZWF0ZVR5cGVLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVR5cGVLaW5kIHJlc3VsdCA9IFR5cGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlS2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEphdmFWaXNpYmlsaXR5S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyS2luZCBjcmVhdGVKYXZhUGFyYW1ldGVyS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBKYXZhUGFyYW1ldGVyS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEpUeXBlSmF2YUhlbHBlcnNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlSlR5cGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKVHlwZUxpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKSB7Ci0JCUphdmFEYXRhVHlwZUltcGwgamF2YURhdGFUeXBlID0gbmV3IEphdmFEYXRhVHlwZUltcGwoKTsKLQkJcmV0dXJuIGphdmFEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCUphdmFQYWNrYWdlSW1wbCBqYXZhUGFja2FnZSA9IG5ldyBKYXZhUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGphdmFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVmUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNjcmVhdGVDbGFzc1JlZihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJSmF2YUNsYXNzIHJlZiA9IGNyZWF0ZUphdmFDbGFzcygpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoY3JlYXRlVHlwZVVSSSh0YXJnZXROYW1lKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCVJlc291cmNlIHIgPSByZWxhdGVkT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAociAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBycyA9IHIuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChycyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBycyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoYVF1YWxpZmllZE5hbWUgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJCWlmIChpbmRleCA+IDApCi0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCksIGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIGFRdWFsaWZpZWROYW1lLmxlbmd0aCgpKSwgc2V0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcmVmbGVjdFR5cGUoIiIsIGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFQYWNrYWdlTmFtZSwgU3RyaW5nIGFUeXBlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChhVHlwZU5hbWUgIT0gbnVsbCAmJiBhUGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVUeXBlVVJJKGFQYWNrYWdlTmFtZSwgYVR5cGVOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFQYWNrYWdlKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVQYWNrYWdlVVJJKHBhY2thZ2VOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIGFRdWFsaWZpZWROYW1lKSB7Ci0JCS8vIGZvciBuZWVkIHRvIGp1c3QgdG9sZXJhdGUgZ2VuZXJpY3MgKGkuZS4gIjwuLi4+Ii4gRnVsbHkgc3VwcG9ydCBsYXRlci4KLQkJLy9JbiB0aGlzIGNhc2UgdG9sZXJhdGUgbWVhbnMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMuCi0JCWludCBnZW5OZHggPSBhUXVhbGlmaWVkTmFtZS5pbmRleE9mKEdFTkVSSUNfU1RBUlQpOwotCQlpbnQgcGtnTmR4ID0gZ2VuTmR4ID09IC0xID8gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKSA6IGFRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcuJywgZ2VuTmR4KTsKLQkJaWYgKHBrZ05keCA+IC0xKQotCQkJcmV0dXJuIGNyZWF0ZVR5cGVVUkkoYVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIHBrZ05keCksIGdlbk5keCA9PSAtMSA/IGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhwa2dOZHgrMSkgOiBhUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcocGtnTmR4KzEsIGdlbk5keCkpOwotCQllbHNlCi0JCQlyZXR1cm4gY3JlYXRlVHlwZVVSSShudWxsLCBhUXVhbGlmaWVkTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJU3RyaW5nW10gcGtnbmFtZSA9IG51bGw7Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkKLQkJCXBrZ25hbWUgPSBuZXcgU3RyaW5nW10ge3BhY2thZ2VOYW1lfTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVIaWVyYXJjaGljYWxVUkkoSkFWQV9QUk9UT0NPTF9VUklfU0NIRU1FLCBudWxsLCBudWxsLCBwa2duYW1lLCBudWxsLCBjcmVhdGVUeXBlTmFtZSh0eXBlTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBVUkknZCB0eXBlIG5hbWUgZnJvbSBhIHJlZ3VsYXIgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZU5hbWUgdHlwZSBuYW1lLCBubyBwYWNrYWdlIGFsbG93ZWQsIGFuZCBtdXN0IGJlIGluIGZvcm0gZm9yIHJlZmxlY3Rpb24gKGkuZS4gJyQnIG5vdCAnLicgdG8gc2VwYXJhdGUgb3V0ZXIgYW5kIGlubmVyIGNsYXNzZXMpLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCi0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfSURfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZShVUkkgdHlwZVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKHR5cGVVUkkpKSB7Ci0JCQlyZXR1cm4gcHJpbUdldFR5cGVOYW1lKHR5cGVVUkkuZnJhZ21lbnQoKSk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlVVJJLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdHlwZSBuYW1lIGZyb20gVVJJJ2QgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZSB1cmkgZnJhZ21lbnQgdmFsdWUgZm9yIHR5cGUgbmFtZS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19JRF9TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfSURfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFBhY2thZ2VOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShVUkkgamF2YVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKGphdmFVUkkpIHx8IGlzUGFja2FnZVVSSShqYXZhVVJJKSkgewotCQkJaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCXJldHVybiBqYXZhVVJJLnNlZ21lbnQoMCk7Ci0JCQl9IGVsc2UgaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMCkKLQkJCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQJCi0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhVVJJLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YVVSSS50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjZ2V0RnVsbFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVHlwZU5hbWUoVVJJIHR5cGVVUkkpIHsKLQkJU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZSh0eXBlVVJJKTsKLQkJaWYgKCFpc1R5cGVVUkkodHlwZVVSSSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGVVUkkudG9TdHJpbmcoKSk7Ci0JCQotCQlpZiAocGtnTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gcGtnTmFtZSsnLicrZ2V0VHlwZU5hbWUodHlwZVVSSSk7Ci0JCWVsc2UKLQkJCXJldHVybiB0eXBlVVJJLmZyYWdtZW50KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVBhY2thZ2VVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCVN0cmluZ1tdIHBrZ25hbWUgPSBudWxsOwotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlwa2duYW1lID0gbmV3IFN0cmluZ1tdIHtwYWNrYWdlTmFtZX07Ci0JCXJldHVybiBVUkkuY3JlYXRlSGllcmFyY2hpY2FsVVJJKEpBVkFfUFJPVE9DT0xfVVJJX1NDSEVNRSwgbnVsbCwgbnVsbCwgcGtnbmFtZSwgbnVsbCwgSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzSmF2YVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzVHlwZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHlwZVVSSShVUkkgdXJpKSB7Ci0JCWlmIChpc0phdmFVUkkodXJpKSkgewotCQkJU3RyaW5nIGZyYWcgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnICE9IG51bGwgJiYgIUphdmFQYWNrYWdlLlBBQ0tBR0VfSUQuZXF1YWxzKGZyYWcpKSB7Ci0JCQkJaW50IGRlbGltTmR4ID0gZnJhZy5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZGVsaW1OZHggPSBmcmFnLmluZGV4T2YoJy8nKTsJLy8gRnJvbSBiZWFuaW5mbyBmb3IgcHJvcGVydHkuCi0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzUGFja2FnZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBpc0phdmFVUkkodXJpKSAmJiBKYXZhUGFja2FnZS5QQUNLQUdFX0lELmVxdWFscyh1cmkuZnJhZ21lbnQoKSk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNGQ1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVJlZlBhY2thZ2UsIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXZhUmVmUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUNsYXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYXJhbWV0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJsb2NrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFEYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnJheVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUV2ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGphdmFWaXNpYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gamF2YVBhcmFtZXRlcktpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpUeXBlTGlzdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEphdmFSZWZQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIHVzZSBvZiB0aGUgb2xkZXIgZGVwcmVjYXRlZCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC4KLQkgKiBAcGFyYW0gYgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVmUGFja2FnZUltcGwoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGhlcmUgb25seSBmb3Igb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4gTmV3Ci0JICogY29kZSBzaG91bGQgbm90IHVzZSB0aGlzIGRpcmVjdGx5LgotCSAqIEByZXR1cm4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBOb3RlOiBOZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gSWYgRU1GIGV2ZXIgY2hhbmdlcyBob3cgaXQgZ2VuZXJhdGVzIHRoZSBpbml0IG1ldGhvZCBhbmQgYXNzaWducyB0aGUKLQkJLy8gcGFja2FnZSBpbiBhIGRpZmZlcmVudCB3YXkgdGhlbiB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UgdG9vLgotCQlpZiAoIShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsKSkKLQkJCW5ldyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gaW5pdEdlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgaW5pdEdlbigpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhUmVmUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKYXZhUmVmUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUphdmFSZWZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmF2YVJlZlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF2YVJlZlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUphdmFSZWZQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gamF2YUNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX1B1YmxpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpZWxkX0luaXRpYWxpemVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpIHsKLQkJcmV0dXJuIGphdmFQYXJhbWV0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnJheVR5cGUoKSB7Ci0JCXJldHVybiBhcnJheVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFycmF5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJyYXlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKSB7Ci0JCXJldHVybiBqYXZhRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRXZlbnQoKSB7Ci0JCXJldHVybiBqYXZhRXZlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIGphdmFQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJsb2NrKCkgewotCQlyZXR1cm4gYmxvY2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmxvY2tfU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWJsb2NrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIHN0YXRlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHlLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEphdmFQYXJhbWV0ZXJLaW5kKCkgewotCQlyZXR1cm4gamF2YVBhcmFtZXRlcktpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHlwZUtpbmQoKSB7Ci0JCXJldHVybiB0eXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVMaXN0KCkgewotCQlyZXR1cm4galR5cGVMaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpIHsKLQkJcmV0dXJuIGpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFSZWZGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFSZWZGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWphdmFDbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0tJTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUFVCTElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJTkFMKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJRUxEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19NRVRIT0RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRVZFTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMpOwotCi0JCWluaXRpYWxpemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRJQUxJWkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX0lTX1NUQVRJQyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdGlhbGl6ZXJFQ2xhc3MsIElOSVRJQUxJWkVSX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX1NPVVJDRSk7Ci0KLQkJamF2YVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVBhcmFtZXRlckVDbGFzcywgSkFWQV9QQVJBTUVURVJfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhUGFyYW1ldGVyRUNsYXNzLCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQpOwotCi0JCW1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX05BVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NZTkNIUk9OSVpFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fQ09OU1RSVUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19TVEFUSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NPVVJDRSk7Ci0KLQkJZmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklFTEQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fU1RBVElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZEVDbGFzcywgRklFTERfX0pBVkFfVklTSUJJTElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19UUkFOU0lFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fVk9MQVRJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpZWxkRUNsYXNzLCBGSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmllbGRFQ2xhc3MsIEZJRUxEX19JTklUSUFMSVpFUik7Ci0KLQkJYmxvY2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkxPQ0spOwotCQljcmVhdGVFQXR0cmlidXRlKGJsb2NrRUNsYXNzLCBCTE9DS19fU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShibG9ja0VDbGFzcywgQkxPQ0tfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJsb2NrRUNsYXNzLCBCTE9DS19fQ09OVEVOVFMpOwotCi0JCWNvbW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NTUVOVCk7Ci0KLQkJc3RhdGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQVRFTUVOVCk7Ci0KLQkJamF2YVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhUGFja2FnZUVDbGFzcywgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMpOwotCi0JCWphdmFEYXRhVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0RBVEFfVFlQRSk7Ci0KLQkJYXJyYXlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSUkFZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFycmF5VHlwZUVDbGFzcywgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJyYXlUeXBlRUNsYXNzLCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSk7Ci0KLQkJamF2YUV2ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfRVZFTlQpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0eXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oVFlQRV9LSU5EKTsKLQkJamF2YVZpc2liaWxpdHlLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1ZJU0lCSUxJVFlfS0lORCk7Ci0JCWphdmFQYXJhbWV0ZXJLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1BBUkFNRVRFUl9LSU5EKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpUWVBFX0pBVkFfSEVMUEVSUyk7Ci0JCWpUeXBlTGlzdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKVFlQRV9MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJamF2YUNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVQYXJhbWV0ZXIoKSk7Ci0JCW1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RU9wZXJhdGlvbigpKTsKLQkJZmllbGRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVUeXBlZEVsZW1lbnQoKSk7Ci0JCWNvbW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCbG9jaygpKTsKLQkJc3RhdGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmxvY2soKSk7Ci0JCWphdmFQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFUGFja2FnZSgpKTsKLQkJamF2YURhdGFUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWFycmF5VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFDbGFzcygpKTsKLQkJamF2YUV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqYXZhQ2xhc3NFQ2xhc3MsIEphdmFDbGFzcy5jbGFzcywgIkphdmFDbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0tpbmQoKSwgdGhpcy5nZXRUeXBlS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX1B1YmxpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInB1YmxpYyIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCBudWxsLCAiaW1wbGVtZW50c0ludGVyZmFjZXMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImNsYXNzSW1wb3J0IiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCksIHRoaXMuZ2V0SmF2YVBhY2thZ2UoKSwgbnVsbCwgInBhY2thZ2VJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCB0aGlzLmdldEZpZWxkKCksIHRoaXMuZ2V0RmllbGRfSmF2YUNsYXNzKCksICJmaWVsZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZCgpLCB0aGlzLmdldE1ldGhvZF9KYXZhQ2xhc3MoKSwgIm1ldGhvZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCksIHRoaXMuZ2V0SW5pdGlhbGl6ZXIoKSwgdGhpcy5nZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKSwgImluaXRpYWxpemVycyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSwgImRlY2xhcmVkQ2xhc3NlcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgImRlY2xhcmluZ0NsYXNzIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgdGhpcy5nZXRKYXZhUGFja2FnZSgpLCB0aGlzLmdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCksICJqYXZhUGFja2FnZSIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJldmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJhbGxFdmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNOZXN0ZWQiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGRFeHRlbmRlZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGROYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldEZpZWxkc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldE1ldGhvZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldE1ldGhvZCgpLCAiZ2V0TWV0aG9kRXh0ZW5kZWQiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE1ldGhvZHNFeHRlbmRlZCIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhTWV0aG9kTmFtZVByZWZpeCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZXhjbHVkZWROYW1lcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRQdWJsaWNNZXRob2QiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHNOYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRTdXBlcnR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxlbWVudHNJbnRlcmZhY2UiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImludGVyZmFjZVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5mb1N0cmluZyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW5oZXJpdHNGcm9tIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJqYXZhQ2xhc3MiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzRXhpc3RpbmdUeXBlIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0ludGVyZmFjZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIG51bGwsICJzZXRTdXBlcnR5cGUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImphdmFjbGFzcyIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoaW5pdGlhbGl6ZXJFQ2xhc3MsIEluaXRpYWxpemVyLmNsYXNzLCAiSW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRpYWxpemVyX0lzU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAiaXNTdGF0aWMiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgSW5pdGlhbGl6ZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRpYWxpemVyX1NvdXJjZSgpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJzb3VyY2UiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSwgdGhpcy5nZXRKYXZhUGFyYW1ldGVyS2luZCgpLCAicGFyYW1ldGVyS2luZCIsIG51bGwsIDAsIDEsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhUGFyYW1ldGVyRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzUmV0dXJuIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0SmF2YVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFF1YWxpZmllZE5hbWUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVDbGFzcywgTWV0aG9kLmNsYXNzLCAiTWV0aG9kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfQWJzdHJhY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhYnN0cmFjdCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX05hdGl2ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm5hdGl2ZSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN5bmNocm9uaXplZCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNvbnN0cnVjdG9yIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic3RhdGljIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSwgdGhpcy5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSwgImphdmFWaXNpYmlsaXR5IiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImphdmFFeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX0phdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19NZXRob2RzKCksICJqYXZhQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZF9Tb3VyY2UoKSwgdGhpcy5nZXRCbG9jaygpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRDb250YWluaW5nSmF2YUNsYXNzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgImdldFBhcmFtZXRlciIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1ldGVyTmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0UmV0dXJuVHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIG51bGwsICJzZXRSZXR1cm5UeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAidHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzR2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgbnVsbCwgInNldElzR2VuZXJhdGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1ZvaWQiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGZpZWxkRUNsYXNzLCBGaWVsZC5jbGFzcywgIkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1N0YXRpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0YXRpYyIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpLCB0aGlzLmdldEphdmFWaXNpYmlsaXR5S2luZCgpLCAiamF2YVZpc2liaWxpdHkiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfVHJhbnNpZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidHJhbnNpZW50IiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1ZvbGF0aWxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidm9sYXRpbGUiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmllbGRfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpZWxkX0luaXRpYWxpemVyKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgImluaXRpYWxpemVyIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGZpZWxkRUNsYXNzLCB0aGlzLmdldEphdmFDbGFzcygpLCAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihmaWVsZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0FycmF5IiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhibG9ja0VDbGFzcywgQmxvY2suY2xhc3MsICJCbG9jayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfU291cmNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCbG9ja19Db250ZW50cygpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJjb250ZW50cyIsIG51bGwsIDAsIC0xLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbW1lbnRFQ2xhc3MsIENvbW1lbnQuY2xhc3MsICJDb21tZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc3RhdGVtZW50RUNsYXNzLCBTdGF0ZW1lbnQuY2xhc3MsICJTdGF0ZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhUGFja2FnZUVDbGFzcywgSmF2YVBhY2thZ2UuY2xhc3MsICJKYXZhUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgImphdmFDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEphdmFQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhRGF0YVR5cGVFQ2xhc3MsIEphdmFEYXRhVHlwZS5jbGFzcywgIkphdmFEYXRhVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YURhdGFUeXBlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhhcnJheVR5cGVFQ2xhc3MsIEFycmF5VHlwZS5jbGFzcywgIkFycmF5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiYXJyYXlEaW1lbnNpb25zIiwgbnVsbCwgMCwgMSwgQXJyYXlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBBcnJheVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGFycmF5VHlwZUVDbGFzcywgdGhpcy5nZXRKVHlwZUphdmFIZWxwZXJzKCksICJnZXRGaW5hbENvbXBvbmVudFR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNQcmltaXRpdmVBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIG51bGwsICJzZXRDb21wb25lbnRUeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiaGVscGVyQ29tcG9uZW50VHlwZSIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoamF2YUV2ZW50RUNsYXNzLCBKYXZhRXZlbnQuY2xhc3MsICJKYXZhRXZlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuY2xhc3MsICJUeXBlS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5FWENFUFRJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuY2xhc3MsICJKYXZhVmlzaWJpbGl0eUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLmNsYXNzLCAiSmF2YVBhcmFtZXRlcktpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLklOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuT1VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuSU5PVVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk5fTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoalR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZSwgSmF2YUhlbHBlcnMuY2xhc3MsICJKVHlwZUphdmFIZWxwZXJzIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShqVHlwZUxpc3RFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJKVHlwZUxpc3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU4NWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kSW1wbCBleHRlbmRzIEVPcGVyYXRpb25JbXBsIGltcGxlbWVudHMgTWV0aG9kIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgc2lnbmF0dXJlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWJzdHJhY3QoKSA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBQlNUUkFDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBYnN0cmFjdCgpIDxlbT5BYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmF0aXZlKCkgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOYXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOQVRJVkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmF0aXZlKCkgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOYXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5BVElWRV9FRkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTeW5jaHJvbml6ZWQoKSA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N5bmNocm9uaXplZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNZTkNIUk9OSVpFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTeW5jaHJvbml6ZWQoKSA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N5bmNocm9uaXplZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hST05JWkVEX0VGTEFHID0gMSA8PCAxMjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbnN0cnVjdG9yKCkgPGVtPkNvbnN0cnVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09OU1RSVUNUT1JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uc3RydWN0b3IoKSA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ29uc3RydWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlNUUlVDVE9SX0VGTEFHID0gMSA8PCAxNDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RBVElDX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfRUZMQUcgPSAxIDw8IDE1OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFWaXNpYmlsaXR5KCkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVZpc2liaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA9IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTDsKLQotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNHZW5lcmF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhVmlzaWJpbGl0eUtpbmQgamF2YVZpc2liaWxpdHkgPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBhcmFtZXRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YUV4Y2VwdGlvbnMoKSA8ZW0+SmF2YSBFeGNlcHRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFFeGNlcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgamF2YUV4Y2VwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgc291cmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3RHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBuZXdBYnN0cmFjdCkgewotCQlib29sZWFuIG9sZEFic3RyYWN0ID0gKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3QWJzdHJhY3QpIGVGbGFncyB8PSBBQlNUUkFDVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkFCU1RSQUNUX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNULCBvbGRBYnN0cmFjdCwgbmV3QWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZUdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmF0aXZlKGJvb2xlYW4gbmV3TmF0aXZlKSB7Ci0JCWJvb2xlYW4gb2xkTmF0aXZlID0gKGVGbGFncyAmIE5BVElWRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld05hdGl2ZSkgZUZsYWdzIHw9IE5BVElWRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk5BVElWRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkUsIG9sZE5hdGl2ZSwgbmV3TmF0aXZlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChib29sZWFuIG5ld1N5bmNocm9uaXplZCkgewotCQlib29sZWFuIG9sZFN5bmNocm9uaXplZCA9IChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTeW5jaHJvbml6ZWQpIGVGbGFncyB8PSBTWU5DSFJPTklaRURfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TWU5DSFJPTklaRURfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVELCBvbGRTeW5jaHJvbml6ZWQsIG5ld1N5bmNocm9uaXplZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmluYWwpIGVGbGFncyB8PSBGSU5BTF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJTkFMX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gbmV3Q29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGRDb25zdHJ1Y3RvciA9IChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0NvbnN0cnVjdG9yKSBlRmxhZ3MgfD0gQ09OU1RSVUNUT1JfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5DT05TVFJVQ1RPUl9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19DT05TVFJVQ1RPUiwgb2xkQ29uc3RydWN0b3IsIG5ld0NvbnN0cnVjdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIG5ld1N0YXRpYykgewotCQlib29sZWFuIG9sZFN0YXRpYyA9IChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTdGF0aWMpIGVGbGFncyB8PSBTVEFUSUNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TVEFUSUNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDLCBvbGRTdGF0aWMsIG5ld1N0YXRpYykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdG8gZW5zdXJlIHJlZmxlY3Rpb24gaXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0Fic3RyYWN0R2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNDb25zdHJ1Y3RvckdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNOYXRpdmVHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTdGF0aWNHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEphdmFFeGNlcHRpb25zR2VuKCk7Ci0JfQotCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHlHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVycygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0UGFyYW1ldGVyc0dlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQjZ2V0RVR5cGUoKQotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRFVHlwZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4gc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvL2NvZGU+IC4KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig3NSk7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoIigiKTsKLQkJTGlzdCBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW07Ci0JCWludCBwYXJtU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0JCWludCBjb21tYVRlc3QgPSAwOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1TaXplOyBqKyspIHsKLQkJCWlmIChqID4gY29tbWFUZXN0KSB7Ci0JCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCQlwYXJhbSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KGopOwotCQkJLy9GQiBpZiAocGFyYW0uaXNSZXR1cm4oKSkgewotCQkJLy9GQiBjb21tYVRlc3QgKys7Ci0JCQkvL0ZCIGNvbnRpbnVlOwotCQkJLy9GQiB9Ci0JCQlzYi5hcHBlbmQoKChKYXZhSGVscGVycykgcGFyYW0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlzYi5hcHBlbmQoIikiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotCQlMaXN0IHBhcm1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcm07Ci0JCWludCBwYXJtU2l6ZSA9IHBhcm1zLnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlwYXJtID0gKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldChqKTsKLQkJCWlmIChwYXJtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyTmFtZSkpCi0JCQkJcmV0dXJuIHBhcm07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9SRUZMRUNURUQgPSAweDAsIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfR0VORVJBVEVEID0gMHgyOwotCi0JcHJvdGVjdGVkIGludCByZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0JBU0UpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSBSRUZMRUNURURfQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSByZWZsZWN0aW9uIGFkYXB0ZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JLyoKLQkgKiBVc2VkIGJ5IHJlZmxlY3Rpb24gYWRhcHRlciB0byBjbGVhciB0aGUgcmVmbGVjdGlvbi4gVGhpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlZmxlY3RlZChib29sZWFuIHJlZmxlY3RlZCkgewotCQlpZiAoIXJlZmxlY3RlZCkKLQkJCXJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldFJldHVyblR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCWlmIChzaWduYXR1cmUgPT0gbnVsbCkKLQkJCXNpZ25hdHVyZSA9IGRvR2V0U2lnbmF0dXJlKCk7Ci0JCXJldHVybiBzaWduYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLgotCSAqIAotCSAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsCi0JICogZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhCi0JICogcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzCi0JICogZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcHVibGljIGJvb2xlYW4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKiAKLQkgKiBUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgIlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24iLiBUaGlzIGlzIHB1YmxpYywKLQkgKiA8dHQ+cHJvdGVjdGVkPC8vdHQ+IG9yIDx0dD5wcml2YXRlPC8vdHQ+IGZpcnN0LCBhbmQgdGhlbiBvdGhlciBtb2RpZmllcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogPHR0PmFic3RyYWN0PC8vdHQ+LCA8dHQ+c3RhdGljPC8vdHQ+LCA8dHQ+ZmluYWw8Ly90dD4sIDx0dD5zeW5jaHJvbml6ZWQ8Ly90dD4gPHR0Pm5hdGl2ZTwvL3R0Pi4KLQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChnZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQzoKLQkJCQlzYi5hcHBlbmQoIlB1YmxpYyAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRDoKLQkJCQlzYi5hcHBlbmQoIlByb3RlY3RlZCAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEU6Ci0JCQkJc2IuYXBwZW5kKCJQcml2YXRlICIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRToKLQkJCQlzYi5hcHBlbmQoIlBhY2thZ2UgIik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGlzQWJzdHJhY3QoKSkKLQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QgIik7Ci0JCWlmIChpc1N0YXRpYygpKQotCQkJc2IuYXBwZW5kKCJzdGF0aWMgIik7Ci0JCWlmIChpc0ZpbmFsKCkpCi0JCQlzYi5hcHBlbmQoImZpbmFsICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWQoKSkKLQkJCXNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOwotCQlpZiAoaXNOYXRpdmUoKSkKLQkJCXNiLmFwcGVuZCgibmF0aXZlICIpOwotCQlpZiAoaXNWb2lkKCkpCi0JCQlzYi5hcHBlbmQoInZvaWQgIik7Ci0JCWVsc2UKLQkJCXNiLmFwcGVuZChnZXRSZXR1cm5UeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIiAiKTsKLQkJc2IuYXBwZW5kKGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpICsgIi4iKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSArICIoIik7Ci0JCUxpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtOwotCQlpbnQgcGFybVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1TaXplOyBqKyspIHsKLQkJCXBhcmFtID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoaik7Ci0JCQkvL0ZCIGlmIChwYXJhbS5pc1JldHVybigpKQotCQkJLy9GQiBjb250aW51ZTsgLy8gbGlzdFBhcmFtZXRlcnMoKSBpbmNsdWRlcyByZXR1cm4gdHlwZSBpbiBhcnJheQotCQkJc2IuYXBwZW5kKCgoSmF2YUhlbHBlcnMpIHBhcmFtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlpZiAoaiA8IChwYXJhbXMuc2l6ZSgpIC0gMSkpIHsKLQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoIikiKTsKLQkJTGlzdCBleGNlcHRpb25zID0gZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJSmF2YUNsYXNzIGV4Y2VwdGlvbjsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJc2IuYXBwZW5kKCIgdGhyb3dzICIpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBleGNlcHRpb25zLnNpemUoKTsgaysrKSB7Ci0JCQkJZXhjZXB0aW9uID0gKEphdmFDbGFzcykgZXhjZXB0aW9ucy5nZXQoayk7Ci0JCQkJc2IuYXBwZW5kKGV4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpKTsKLQkJCQlpZiAoayA8IChleGNlcHRpb25zLnNpemUoKSAtIDEpKSB7Ci0JCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0R2VuZXJhdGVkKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9HRU5FUkFURUQpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gKChJSmF2YU1ldGhvZEFkYXB0ZXIpIHJlYWRBZGFwdG9yKS5yZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfR0VORVJBVEVEIHwgUkVGTEVDVEVEX0JBU0UpOyAvLyBXZSBjYW4gYmUgY2VydGFpbiBiYXNlIHdpbGwgYmUgZG9uZSBieSByZWZsZWN0IGdlbmVyYXRlZCBpZiBub3QgYWxyZWFkeQotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSAiZ2VuZXJhdGVkIiB0YWcgaW4gdGhlIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWQoKSB7Ci0JCXJlZmxlY3RHZW5lcmF0ZWQoKTsKLQkJcmV0dXJuIGlzR2VuZXJhdGVkOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkR2VuKCkgewotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgewotCQkvL0ZCIHJldHVybiAoZ2V0UmV0dXJuUGFyYW1ldGVyKCkgPT0gbnVsbCB8fCAidm9pZCIuZXF1YWxzKGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKTsKLQkJcmV0dXJuIChnZXRSZXR1cm5UeXBlKCkgPT0gbnVsbCB8fCAidm9pZCIuZXF1YWxzKGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFOgotCQkJCXJldHVybiBpc05hdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJcmV0dXJuIGlzU3luY2hyb25pemVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXJldHVybiBpc0NvbnN0cnVjdG9yKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlyZXR1cm4gaXNTdGF0aWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGdldEphdmFFeGNlcHRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFOgotCQkJCXNldE5hdGl2ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXNldFN5bmNocm9uaXplZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXNldENvbnN0cnVjdG9yKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUM6Ci0JCQkJc2V0U3RhdGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoKEphdmFWaXNpYmlsaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SmF2YUV4Y2VwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJc2V0TmF0aXZlKE5BVElWRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlzZXRTeW5jaHJvbml6ZWQoU1lOQ0hST05JWkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19DT05TVFJVQ1RPUjoKLQkJCQlzZXRDb25zdHJ1Y3RvcihDT05TVFJVQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXNldEphdmFWaXNpYmlsaXR5KEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNUOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwKSAhPSBOQVRJVkVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMCkgIT0gU1lOQ0hST05JWkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19DT05TVFJVQ1RPUjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMCkgIT0gQ09OU1RSVUNUT1JfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCkgIT0gU1RBVElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWToKLQkJCQlyZXR1cm4gamF2YVZpc2liaWxpdHkgIT0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCXJldHVybiBqYXZhRXhjZXB0aW9ucyAhPSBudWxsICYmICFqYXZhRXhjZXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBhcmFtZXRlcltdIGxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpIHsKLQkJQ29sbGVjdGlvbiB2ID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyW10gcmVzdWx0ID0gbmV3IEphdmFQYXJhbWV0ZXJbdi5zaXplKCldOwotCQl2LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZUNvbnRlbnRzKCkgewotCQlFTGlzdCByZXN1bHRzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJcmVzdWx0cy5hZGRBbGwoZ2V0UGFyYW1ldGVyc0dlbigpKTsgLy9GQgotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNHZW5lcmF0ZWQoYm9vbGVhbiBnZW5lcmF0ZWQpIHsKLQkJaXNHZW5lcmF0ZWQgPSBnZW5lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXR1cm4gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoSmF2YUhlbHBlcnMgdHlwZSkgewotCQl0aGlzLnNldEVUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHlHZW4oKSB7Ci0JCXJldHVybiBqYXZhVmlzaWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgbmV3SmF2YVZpc2liaWxpdHkpIHsKLQkJSmF2YVZpc2liaWxpdHlLaW5kIG9sZEphdmFWaXNpYmlsaXR5ID0gamF2YVZpc2liaWxpdHk7Ci0JCWphdmFWaXNpYmlsaXR5ID0gbmV3SmF2YVZpc2liaWxpdHkgPT0gbnVsbCA/IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA6IG5ld0phdmFWaXNpYmlsaXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWSwgb2xkSmF2YVZpc2liaWxpdHksIGphdmFWaXNpYmlsaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUykgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SmF2YUNsYXNzKG5ld0phdmFDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MsIG5ld0phdmFDbGFzcywgbmV3SmF2YUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJsb2NrIGdldFNvdXJjZSgpIHsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU291cmNlID0gKEludGVybmFsRU9iamVjdClzb3VyY2U7Ci0JCQlzb3VyY2UgPSAoQmxvY2spZVJlc29sdmVQcm94eShvbGRTb3VyY2UpOwotCQkJaWYgKHNvdXJjZSAhPSBvbGRTb3VyY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCbG9jayBiYXNpY0dldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoQmxvY2sgbmV3U291cmNlKSB7Ci0JCUJsb2NrIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWJzdHJhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmF0aXZlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeW5jaHJvbml6ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cnVjdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXRpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YVZpc2liaWxpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFWaXNpYmlsaXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlcnNHZW4oKSB7Ci0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLQkJCXBhcmFtZXRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YVBhcmFtZXRlci5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKSB7Ci0JCWlmIChqYXZhRXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlqYXZhRXhjZXB0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoSmF2YUNsYXNzLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGphdmFFeGNlcHRpb25zOwotCX0KLQotCSAgQE92ZXJyaWRlCi0JICBwdWJsaWMgRUxpc3Q8RU9iamVjdD4gZUNyb3NzUmVmZXJlbmNlcygpCi0JICB7Ci0JICAgIGlmIChlQ3Jvc3NSZWZlcmVuY2VzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQ3Jvc3NSZWZlcmVuY2VzID0gRUNyb3NzUmVmZXJlbmNlRUxpc3QuY3JlYXRlRUNyb3NzUmVmZXJlbmNlRUxpc3QodGhpcyk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGVDcm9zc1JlZmVyZW5jZXM7Ci0JICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9TdGF0ZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmZlN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVtZW50SW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFN0YXRlbWVudCB7Ci0KLQlwcm90ZWN0ZWQgU3RhdGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5TVEFURU1FTlQ7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZkMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9VUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFVSTCB7Ci0JcHVibGljIFN0cmluZyBuYW1lc3BhY2VOYW1lOwotCXB1YmxpYyBTdHJpbmcgSUQ7Ci0JTGlzdCBhdHRyaWJ1dGVOYW1lczsKLS8qKgotICogVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVUkwoU3RyaW5nIHVybFN0cmluZykgewotCWluaXRpYWxpemVGcm9tU3RyaW5nKHVybFN0cmluZyk7Ci19Ci0vKioKLSAqIFVSTCBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgVVJMKFN0cmluZyBuYW1lU3BhY2VOYW1lLCBTdHJpbmcgYW5JRCkgewotCXRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVTcGFjZU5hbWU7Ci0JdGhpcy5JRCA9IGFuSUQ7Ci19Ci1wdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKLQlyZXR1cm4gYXR0cmlidXRlTmFtZXM7Ci19Ci1wdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JaW50IHBvdW5kSW54ID0gdXJsU3RyaW5nLmxhc3RJbmRleE9mKCcjJyk7Ci0JaWYgKHBvdW5kSW54ID4gLTEpIHsKLQkJbmFtZXNwYWNlTmFtZSA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgcG91bmRJbngpOwotCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKHBvdW5kSW54ICsgMSk7Ci0JCWludCBkb3RJbmRleCA9IHVybFN0cmluZy5pbmRleE9mKCItPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQlJRCA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWVTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKGRvdEluZGV4ICsgMik7Ci0JCQlhdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRvIHsKLQkJCQlkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWVTdHJpbmcuaW5kZXhPZigiLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQkJCWF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lU3RyaW5nLnN1YnN0cmluZygwLCBkb3RJbmRleCkpOwotCQkJCQlhdHRyaWJ1dGVOYW1lU3RyaW5nID0gYXR0cmlidXRlTmFtZVN0cmluZy5zdWJzdHJpbmcoZG90SW5kZXggKyAyKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWVTdHJpbmcpOwotCQkJfSB3aGlsZSAoZG90SW5kZXggPiAtMSk7Ci0JCX0gZWxzZSB7Ci0JCQlJRCA9IHVybFN0cmluZzsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vIGFzc3VtZSB0aGF0IGFueSBVUkwgc3RyaW5nIHRoYXQgZW5kcyB3aXRoIC54bWkgaXMgYSBuYW1lc3BhY2UuCi0JCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi54bWkiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWVzcGFjZU5hbWUgPSB1cmxTdHJpbmc7Ci0JCQlJRCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lc3BhY2VOYW1lID0gIj9kZWZhdWx0VVJMPyI7IC8vJE5PTi1OTFMtMSQKLQkJCUlEID0gdXJsU3RyaW5nOwotCQl9Ci0JfQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlVSTCgiICsgKChuYW1lc3BhY2VOYW1lID09IG51bGwpID8gIiIgOiBuYW1lc3BhY2VOYW1lICsgIiMiKSArICgoSUQgPT0gbnVsbCkgPyAiIiA6IElEKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzODZmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrLkphdmFKREtBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIGNsYXNzIHRvIGhhbmRsZSB0aGUgamF2YSBjb250ZXh0LiBUaGUgamF2YSBjb250ZXh0IGlzIGEgcmVzb3VyY2Ugc2V0Ci0gKiB0aGF0IGhhcyB0aGUgYXBwcm9wcmlhdGUgcmVmbGVjdGlvbiBhZGFwdGVyIGF0dGFjaGVkLCBlaXRoZXIgZm9yIGphdmEgcmVmbGVjdGlvbiBvcgotICogZm9yIEpEVCByZWZsZWN0aW9uLiBUaGUgZGVmYXVsdCBpcyBmb3IgamF2YSByZWZsZWN0aW9uLiBXaGVuIHJ1bm5pbmcgaW4gRWNsaXBzZSBpdAotICogd2lsbCBiZSB0aGUgSkRUIHJlZmxlY3Rpb24uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPlRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjdXN0b21lcnMgdGhhdCBhcmUgbm90IGRvaW5nIG5vcm1hbCBFY2xpcHNlIEpEVCBKRU0KLSAqIHJlZmxlY3Rpb24uIE5vcm1hbCBKRU0gc2hvdWxkIGJlIHVzaW5nIHRoZSBKRU0gRU1GIG5hdHVyZSBhY2Nlc3MgaW5zdGVhZC4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNvbnRleHQgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IEphdmFKREtBZGFwdGVyRmFjdG9yeS5jbGFzczsKLQkKLQlwcml2YXRlIEphdmFDb250ZXh0KCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBqYXZhIGNvbnRleHQuIFRvIGJlIHVzZWQgb3V0c2lkZSBvZiBFY2xpcHNlLgotCSAqIFdpdGhpbiBub3JtYWwgRWNsaXBzZSBKRU0gdXNhZ2UgdGhlIEpFTSBFTUYgbmF0dXJlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSmF2YUNvbnRleHQoKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKGNyZWF0ZUphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSk7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSAhPSBudWxsKQotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChBZGFwdGVyRmFjdG9yeSkgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gUmVmbGVjdGlvbiBvciBpbnN0YW50aWF0aW9uIHByb2JsZW1zLgotCQkJLy8gT0ssIGNhbid0IGRvIEphdmEgTW9kZWwgcmVmbGVjdGlvbgotCQl9Ci0JCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDbGFzcyBmb3IgdGhlIEphdmEgcmVmZWN0aW9uIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBDbGFzcyBmb3IgdGhlIEphdmEgcmVmZWN0aW9uIGFkYXB0ZXIgZmFjdG9yeS4gV2l0aGluIEVjbGlwc2UgdGhpcyBzaG91bGQgbm90Ci0JICogYmUgc2V0IGJ5IGN1c3RvbWVycy4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoQ2xhc3MgamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MpIHsKLQkJUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWM2ZTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVJlZkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVmU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEphdmFSZWZTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xhc3MoSmF2YUNsYXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0aWFsaXplcihJbml0aWFsaXplciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbGl6ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2QoTWV0aG9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWVsZChGaWVsZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmllbGRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCbG9jayhCbG9jayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmxvY2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21tZW50KENvbW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZW1lbnQoU3RhdGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTdGF0ZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFja2FnZShKYXZhUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRGF0YVR5cGUoSmF2YURhdGFUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnJheVR5cGUoQXJyYXlUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcnJheVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRXZlbnQoSmF2YUV2ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhRXZlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQ2xhc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFyYW1ldGVyKEVQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVQYXJhbWV0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFT3BlcmF0aW9uKEVPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFja2FnZShFUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0aWFsaXplckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciA8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGFyYW1ldGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QgPGVtPk1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCA8ZW0+RmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmllbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrIDxlbT5CbG9jazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCbG9ja0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQ29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudCA8ZW0+U3RhdGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0ZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZSA8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFEYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlIDxlbT5BcnJheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnJheVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudCA8ZW0+SmF2YSBFdmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YUV2ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCA8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQgPGVtPkVOYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllciA8ZW0+RUNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxlbT5FQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50IDxlbT5FVHlwZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlciA8ZW0+RVBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFUGFyYW1ldGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIDxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UgPGVtPkVQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhUmVmQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY0MjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZlN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFSZWZTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1M6IHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YUNsYXNzKGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzKGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVI6IHsKLQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVI6IHsKLQkJCQlKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVBhcmFtZXRlcihqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFUGFyYW1ldGVyKGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EOiB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVPcGVyYXRpb24obWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEOiB7Ci0JCQkJRmllbGQgZmllbGQgPSAoRmllbGQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpZWxkKGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLOiB7Ci0JCQkJQmxvY2sgYmxvY2sgPSAoQmxvY2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJsb2NrKGJsb2NrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlQ6IHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tbWVudChjb21tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCbG9jayhjb21tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVDogewotCQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCbG9jayhzdGF0ZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFOiB7Ci0JCQkJSmF2YVBhY2thZ2UgamF2YVBhY2thZ2UgPSAoSmF2YVBhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFQYWNrYWdlKGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFUGFja2FnZShqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRTogewotCQkJCUphdmFEYXRhVHlwZSBqYXZhRGF0YVR5cGUgPSAoSmF2YURhdGFUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhRGF0YVR5cGUoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3MoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFOiB7Ci0JCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFycmF5VHlwZShhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUphdmFDbGFzcyhhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzcyhhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlQ6IHsKLQkJCQlKYXZhRXZlbnQgamF2YUV2ZW50ID0gKEphdmFFdmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YUV2ZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xhc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUNsYXNzKEphdmFDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXRpYWxpemVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXRpYWxpemVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0aWFsaXplcihJbml0aWFsaXplciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2QoTWV0aG9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmllbGQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpZWxkKEZpZWxkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmxvY2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmxvY2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJsb2NrKEJsb2NrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21tZW50KENvbW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZW1lbnQoU3RhdGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YVBhY2thZ2UoSmF2YVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YURhdGFUeXBlKEphdmFEYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFycmF5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJyYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJyYXlUeXBlKEFycmF5VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRXZlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBFdmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUV2ZW50KEphdmFFdmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzaWZpZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzaWZpZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVDbGFzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFyYW1ldGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYXJhbWV0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVQYXJhbWV0ZXIoRVBhcmFtZXRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU9wZXJhdGlvbihFT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVQYWNrYWdlKEVQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhUmVmU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL05vdGlmaWNhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5MjYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3Mgb2Ygc3RhdGljIG1ldGhvZHMgZm9yIGhhbmRsaW5nIHNwZWNpYWwgSkVNIG5vdGlmaWNhdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uVXRpbCB7Ci0JLyoKLQkgKiBOb3QgbWVhbnQgdG8gYmUgY29uc3RydWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBOb3RpZmljYXRpb25VdGlsKCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBub3RpZmljYXRpb24gaXMgYSByZWZsZWN0aW9uIG5vdGlmaWNhdGlvbi4gSWYgaXQgaXMsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgSmF2YUNsYXNzIGhhcwotCSAqIGp1c3QgaGFkIHJlZmxlY3Rpb24gcGVyZm9ybWVkIG9uIGl0LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSByZWZsZWN0aW9uIGV2ZW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmxlY3Rpb25FdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5SRUZMRUNUSU9OX0VWRU5UOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gZmx1c2ggZXZlbnQgb2YgYSBKYXZhQ2xhc3Mgd2l0aCBleGlzdGluZyBjb2RlLiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSAKLQkgKiBKYXZhQ2xhc3MgaGFzIGp1c3QgaGFkIHRoZSByZWZsZWN0aW9uIHJlc3VsdHMgZmx1c2hlZCwgQU5EIHRoaXMgd2FzIGEgY2xhc3MgdGhhdCBoYWQgZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgY29kZSBvbiBpdC4uCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGZsdXNoIGV2ZW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsdXNoRXZlbnQoTm90aWZpY2F0aW9uIG1zZykgewotCQlyZXR1cm4gbXNnLmdldEV2ZW50VHlwZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLkVWRU5UICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gSmF2YVJlZmxlY3Rpb25BZGFwdG9yLkZMVVNIX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBub3RpZmljYXRpb24gaXMgYSByZWZsZWN0aW9uIGZsdXNoIGV2ZW50IG9mIGEgSmF2YUNsYXNzIHRoYXQgaXMgbmV3IGFuZCBkb2Vzbid0IGhhdmUgZXhpc3RpbmcgY29kZS4KLQkgKiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBKYXZhQ2xhc3MgaGFzIGp1c3QgaGFkIHRoZSByZWZsZWN0aW9uIHJlc3VsdHMgZmx1c2hlZCwgQU5EIHRoaXMgd2FzIGEgY2xhc3MgdGhhdCB3YXMgbmV3IGFuZAotCSAqIGhhZCBubyBjb2RlIGJlaGluZCBpdC4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgZmx1c2ggZXZlbnQgb2YgbmV3IGNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsdXNoTmV3RXZlbnQoTm90aWZpY2F0aW9uIG1zZykgewotCQlyZXR1cm4gbXNnLmdldEV2ZW50VHlwZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLkVWRU5UICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gSmF2YVJlZmxlY3Rpb25BZGFwdG9yLkZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE0YWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy8uLlJPT1QuLi5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNoYW5nZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9DaGFuZ2UiIHhtaTp2ZXJzaW9uPSIyLjAiPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJYOlJPT1QjLy9Acm9vdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgICAgIDwhLS0gdG9vIHJlbWluZCB1cyB0aGF0IHRoZXNlIGFyZSBuZWVkIHRvIGJlIGRvbmUgeWV0IGluIHRoZSBuZXcgYWxsb2NhdGlvbiBzY2hlbWUuIAotICA8YWRkZWRFT2JqZWN0cyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zdGFudGlhdGVVc2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8YWRkZWRFT2JqZWN0cyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VyaWFsaXplRGF0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotLS0+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLTwvY2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzL2phdmEvbGFuZy9PYmplY3Qub3ZlcnJpZGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4OTJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYmVhbmluZm89Imh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2JlYW5pbmZvLmVjb3JlIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNoYW5nZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9DaGFuZ2UiIHhtaTp2ZXJzaW9uPSIyLjAiPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJYOlJPT1QjLy9Acm9vdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8IS0tIFR1cm4gY2xhc3MgcHJvcGVydHkgdG8gYSBoaWRkZW4gYW5kIG5vdCBpbnRyb3NwZWN0ZWQgcHJvcGVydHkuIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndCBoYW5kbGUgSmF2YSAxLjUgdGVtcGxhdGVzCi0gICAgICAgIHlldCBhcyB2YWxpZCBKYXZhQ2xhc3NlcyBhbmQgaXQgY2F1c2VzIFhNSSBzZXJpYWxpemF0aW9uIGVycm9ycyBiZWNhdXNlIGl0IGluY2x1ZGVzIHRoZSAiPCIgaW4gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgZm9yIHRoZSBzdGFuZGFyZCBqYXZhIGNsYXNzIHdoaWNoIGlzOiAiamF2YTovamF2YS5sYW5nI0NsYXNzPD8gZXh0ZW5kcyBDbGFzcz4iLiB0aGlzIGlzIGludmFsaWQgaW4gdGhlIHNlcmlhbGl6YXRpb24uIC0tPgotICAgICAgICAKLSAgIDxvYmplY3RzVG9BdHRhY2ggbmFtZT0iY2xhc3MiIHhtaTppZD0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FT2JqZWN0Ij4KLSAgICAgPGVBbm5vdGF0aW9ucyBoaWRkZW49InRydWUiIG1lcmdlSW50cm9zcGVjdGlvbj0iZmFsc2UiIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYmVhbmluZm86UHJvcGVydHlEZWNvcmF0b3IiLz4KLSAgIDwvb2JqZWN0c1RvQXR0YWNoPgotICAgCi0gICA8IS0tIAotICAgICAgVGhpcyBpcyBraW5kIG9mIGNoZWF0LCBidXQgZGF0YXR5cGVzIGFyZSBuZXZlciBpbnRyb3NwZWN0ZWQsIHNvIHdlIGNhbid0IGdldCB0aGVzZSBhdHRyaWJ1dGVzCi0gICAgICBhZGRlZCB0byB0aGVtIGluIGEgbm9ybWFsIHdheS4gQnkgZG9pbmcgaXQgaGVyZSwgd2hlbiBqYXZhLmxhbmcuT2JqZWN0IGlzIGludHJvc3BlY3RlZCwgdGhlc2UKLSAgICAgIHdpbGwgYmUgZG9uZSBhdCB0aGUgc2FtZSB0aW1lLiBBbmQgc2luY2UgT2JqZWN0IG5lZWRzIHRvIGJlIGludHJvc3BlY3RlZCBiZWZvcmUgYW55dGhpbmcgZWxzZQotICAgICAgY2FuIGJlIGRvbmUsIHRoZXNlIHdpbGwgYmUgZG9uZSBiZWZvcmUgYW55dGhpbmcgbmVlZHMgdGhlbS4gLS0+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNib29sZWFuIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJib29sZWFuX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImJvb2xlYW5fZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2NoYXIiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImNoYXJfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iY2hhcl9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jaW50Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJpbnRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iaW50X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNmbG9hdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iZmxvYXRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iZmxvYXRfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI3Nob3J0Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJzaG9ydF9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJzaG9ydF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jbG9uZyI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0ibG9uZ19lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJsb25nX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNkb3VibGUiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImRvdWJsZV9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJkb3VibGVfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2J5dGUiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImJ5dGVfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iYnl0ZV9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotPC9jaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJlYTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkCi0jCi0KLQotcGx1Z2luTmFtZSA9IEphdmEgRU1GIE1vZGVsCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzM0NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSIKLSAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9pbnN0YW5jZS5nZW5tb2RlbCIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlIgotICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCIKLSAgICAgICAgICAgIHVyaT0iamF2YS54bWkiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnJlZ2lzdHJhdGlvbnMiPgotICAgICAgPHJlZ2lzdHJhdGlvbiBjb250YWluZXI9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0gICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgcGFja2FnZT0iamF2YS5sYW5nIgotICAgICAgICAgICAgcGF0aD0ib3ZlcnJpZGVzL2phdmEvbGFuZyI+Ci0gICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgcGFja2FnZT0iLi5ST09ULi4iCi0gICAgICAgICAgICBwYXRoPSJvdmVycmlkZXMiPgotICAgICAgICA8L292ZXJyaWRlPgotICAgICAgPC9yZWdpc3RyYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTNhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLm1kfgotKi5jYX4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjFlZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9lZG9jamF2YTIuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNTYxMyArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSURMIgotCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuamVtIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkicHJlZml4IgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiSmF2YVJlZiIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiamF2YS54bWkiKSkpCi0gICAgcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIKLSAgICBkb2N1bWVudGF0aW9uIAkKLXxDaGFuZ2VzIHRvIHN5bmNoIHVwIHdpdGggSmF2YTNlOgotfC0gZGVsZXRlZCBKYXZhRWxlbWVudCwgQm9keUVsZW1lbnQgd2hpY2ggZGlkbid0IGFkZCBhbnl0aGluZyB1c2VmdWwKLXwtIGRlbGV0ZWQgTmVzdGVkQ2xhc3MgYW5kIHRoZSBhc3NvY2lhdGlvbiB3aGljaCBkZXNjcmliZWQgbmVzdGluZywgY29udGVudHMgY2FuIGJlIHVzZWQgaW5zdGVhZAotfC0gZGVsZXRlZCBleHRlbmRzL2V4dGVuZGVkQnkgd2hpY2ggaXMgcmVwbGFjZWQgd2l0aCBNT0Ygc3VidHlwZS9zdXBlcnR5cGUKLXwtIGRlbGV0ZWQgdGhlIGNsdW1zeSBtYWluIGRpYWdyYW0KLXwtIG1vdmVkIHRoZSBNT0YgaW5oZXJpdGFuY2UgZGV0YWlscyB0byB0aGUgTU9GIGJpbmRpbmcgZGlhZ3JhbQotfC0gZGVsZXRlZCAiZmluYWwiIG9uIEphdmFQYXJhbWV0ZXIsIGRvbid0IGtub3cgd2hhdCB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZQotfC0gZGVsZXRlZCB0aGUgQ2F0ZWdvcnkganVuawotfC0gY2hhbmdlZCB0aGUgQmxvY2stdHlwZWQgYXR0cmlidXRlcyBvbiBGaWVsZCwgTWV0aG9kLCBJbml0aWFsaXplciB0byBiZSBhc3NvY2lhdGlvbnMgdG8gQmxvY2sKLXwKLXxPdXRzdGFuZGluZyBxdWVzdGlvbnMvaXNzdWVzOgotfC0gSmF2YVBhcmFtZXRlcktpbmQgc2hvdWxkIGdvIGF3YXkgaWYgd2UgZ2V0IHRoZSBiYXNlIFBhcmFtZXRlciBraW5kIGZpeGVkIHVwCi18Ci0gICAgCi0gICAgc3RlcmVvdHlwZSAJIm1ldGFtb2RlbCIKLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODFEREY0NzAyNzEiCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZiIKLQkgICAgcXVpZHUgICAgICAJIjM3NEFBOEY5MDI4RSIpCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzlCRDM2NjAwMEZFIgotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZSIKLQkgICAgcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJKYXZhQ2xhc3MiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5OTA5NTAwMDBCMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzTmVzdGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QzIxMDFENiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNUIzMDA0NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZpZWxkTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUFBIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJGaWVsZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGRFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjYyNTAxMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXwgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuCi18Ci18UmV0dXJuIG51bGwgaWYgYSBGaWVsZCBuYW1lZCBmaWVsZE5hbWUgaXMgbm90IGZvdW5kLgotCQkgICAgCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZE5hbWVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNjY3MDI1NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZpZWxkTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUFFIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJGaWVsZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGRzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI2OEEwMzI4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjkxMTAyMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXRob2ROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjEiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyVHlwZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCMiIKLQkJCSAgICBkb2N1bWVudGF0aW9uIAkiTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIk1ldGhvZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI5RUEwM0NBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkE1MTAxMTUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1ldGhvZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCNSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJUeXBlcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUI2IgotCQkJICAgIGRvY3VtZW50YXRpb24gCSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiTWV0aG9kIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJBN0QwMzU0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQUMzMDIxRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgd2lsbCBiZSByZXR1cm5lZC4KLXwKLQkJICAgIAotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImFNZXRob2ROYW1lUHJlZml4IgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjkiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZXhjbHVkZWROYW1lcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUJBIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQkM5MDM4MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWV0aG9kTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUJDIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlclR5cGVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkQiCi0JCQkgICAgZG9jdW1lbnRhdGlvbiAJIkxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJNZXRob2QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDM0QwMzRFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQzYzMDMyMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZHNOYW1lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkNBQTAwNUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDMSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTdXBlcnR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDRjkwMENEIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaW1wbGVtZW50c0ludGVyZmFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkQzOTAwOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnRlcmZhY2VUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQzQiCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpbmZvU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDgyMDJEMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4iCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImluaGVyaXRzRnJvbSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkQ5RTAyRTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiamF2YUNsYXNzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQzciCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0V4aXN0aW5nVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkUxMTAxMjAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRG9lcyB0aGlzIHR5cGUgZXhpc3QuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJFMkYwMTM3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYW4gaW50ZXJmYWNlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFN1cGVydHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkU3QjAwQTAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSBzdXBlcnR5cGUuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImphdmFjbGFzcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUNCIgotCQkJICAgIHR5cGUgICAgICAgCSJKYXZhQ2xhc3MiCi0JCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCQkgICAgcmVzdWx0ICAgICAJInZvaWQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBNDVFMDIzMiIKLQkJICAgIHR5cGUgICAgICAgCSJUeXBlS2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjQ2MDAyQkYiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjhDRTgwMjBDIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOEY5QzAyRDciCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkluaXRpYWxpemVyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEE1REMwMEJCIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpc1N0YXRpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBODY1MDAwRiIKLQkJICAgIHR5cGUgICAgICAgCSJCb29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVBhcmFtZXRlciIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwYi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCNzgxOEIwMDE4NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNFNjE1MDEwNCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0FycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRkQ0MDM0RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNSZXR1cm4iCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJGRUYwMDA1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEphdmFUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDOEU3MDAxQSIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRRdWFsaWZpZWROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDOTI2MDAyRiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QjY0NzAyQUYiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbWV0ZXJLaW5kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFQjQwMEMyIgotCQkgICAgdHlwZSAgICAgICAJIkphdmFQYXJhbWV0ZXJLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM5MUMxRThGMDEyMyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwZi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk1MzgwM0FEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNERBQTIwMEEwIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMwNDIwMkEzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzA3NjAxM0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4gc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvY29kZT4gLgotfCAKLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMwQjgwMTFDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUUzIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJKYXZhUGFyYW1ldGVyIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRSZXR1cm5UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMTQ3MDAxMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIHJldHVybiB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRSZXR1cm5UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMjc0MDNDRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIHJldHVybiB0eXBlIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFFOCIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikpCi0JCSAgICByZXN1bHQgICAgIAkidm9pZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTaWduYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMxN0QwMDQzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLgotfAotfFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotfAotfEZvciBleGFtcGxlOgotfAotfCAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotfAotfFRoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAiVGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiIuICBUaGlzIGlzIHB1YmxpYywgPHR0PnByb3RlY3RlZDwvdHQ+IG9yIDx0dD5wcml2YXRlPC90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiA8dHQ+YWJzdHJhY3Q8L3R0PiwgPHR0PnN0YXRpYzwvdHQ+LCA8dHQ+ZmluYWw8L3R0PiwgPHR0PnN5bmNocm9uaXplZDwvdHQ+IDx0dD5uYXRpdmU8L3R0Pi4KLXwKLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0dlbmVyYXRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzFGQzAwNkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLgotfFRoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBAZ2VuZXJhdGVkIHRhZyBpbiB0aGUgY29tbWVudC4KLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0SXNHZW5lcmF0ZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMyNDQwMzdGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZ2VuZXJhdGVkIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxRUMiCi0JCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJICAgIHJlc3VsdCAgICAgCSJ2b2lkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzVm9pZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzIxODAzOEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwQkMwMjJCIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmF0aXZlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwRDEwMzY0IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3luY2hyb25pemVkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwREIwM0MxIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZFMDAwMzMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJ1Y3RvciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUFERDI4MDI0NSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0YXRpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkU0MDM1MCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFWaXNpYmlsaXR5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2RUIwMzk3IgotCQkgICAgdHlwZSAgICAgICAJIkphdmFWaXNpYmlsaXR5S2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzODIzMzNCRTAzMkUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJGaWVsZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDQ4N0Y5MDMzNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFVHlwZWRFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEY2MDM5OCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRDb250YWluaW5nSmF2YUNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNTEyMDAyNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNBcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjU1RjAxRTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMWQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2QkUwMjZGIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMWUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2QzIwMkVEIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVZpc2liaWxpdHkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZDNzAzNEYiCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2llbnQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg4MDEwM0I4IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidm9sYXRpbGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg4MDgwMTJEIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJUeXBlS2luZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRCNDYwMDJCRiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQiCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVU5ERUZJTkVEIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFMzYwMUExIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNMQVNTIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFNDQwMjVEIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOVEVSRkFDRSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTU2MDEyNCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJFWENFUFRJT04iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUU2NTAxQTEiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJCbG9jayIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU3RkMwMjM5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBNkM1M0UxMDAyOSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkNvbW1lbnQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjctMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODBGODg5QjAyQjgiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4OEQ2MDBBNSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIpKSkKLQkob2JqZWN0IENsYXNzICJTdGF0ZW1lbnQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODBGODhCOTAyNUEiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDJhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4OERBMDA1NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhUGFja2FnZSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyYi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMmMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk0RDcwMDQ2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYWNrYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDVDM0Y3MDAwQSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVZpc2liaWxpdHlLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyMzMzQkUwMzJFIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxQQUNLQUdFPTEKLXxQVUJMSUM9MgotfFBSSVZBVEU9MwotfFBST1RFQ1RFRD00Ci0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBVQkxJQyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0UyMDIyQyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQUklWQVRFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTcwMDNFIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBST1RFQ1RFRCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0U4MDM4OSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQQUNLQUdFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRUEwMzhDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhUGFyYW1ldGVyS2luZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MUMxRThGMDEyMyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18SU49MAotfE9VVD0xCi18SU5PVVQ9MgotfFJFVFVSTj0zCi0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFRkMwMkVDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk9VVCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRUZGMDE2QSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTk9VVCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRjAxMDA0MCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSRVRVUk4iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzOS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMjE5NDAzODciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFEYXRhVHlwZSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzYS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2OEUyMDFCMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldERlZmF1bHRWYWx1ZVN0cmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkY5MTAzMDMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4iCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpKQotCShvYmplY3QgQ2xhc3MgIkFycmF5VHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNBOUQ3OUVEMDFERiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18RGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlCi18ICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotfCAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzCi18ICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLgotfAotfCAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUKLXwgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4KLXwgCi18ICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDoKLXwgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKQotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3OUZEMDEwRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmluYWxDb21wb25lbnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QTgyMDE5MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4KLXwKLXxJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUgbmFtZS4KLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QUY5ODAxMzYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuIAotfAotfElmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNQcmltaXRpdmVBcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjQxNzAyQjgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMiCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRDb21wb25lbnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNDU1MDNCQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIGNvbXBvbmVudCB0eXBlLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJoZWxwZXJDb21wb25lbnRUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAyMjYiCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFycmF5RGltZW5zaW9ucyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJICAgIHZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCSAgICB2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpKQotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QUM4MDI4NCIKLQkJICAgIHR5cGUgICAgICAgCSJpbnQiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKVHlwZUphdmFIZWxwZXJzIgotCSAgICBxdWlkICAgICAgIAkiM0I2NUFERTQwM0E2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21tb24gaW50ZXJmYWNlIGJldHdlZW4gSmF2YUNsYXNzIGFuZCBKYXZhRGF0YVR5cGUgcGx1cyBzb21lIGNvbW1vbiBoZWxwZXIgbWV0aG9kcy4iCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUFFMTcwMjY5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSlR5cGVMaXN0IgotCSAgICBxdWlkICAgICAgIAkiM0I2NUI4NzYwMkMxIgotCSAgICBkb2N1bWVudGF0aW9uIAkiamF2YS51dGlsLkxpc3QgdHlwZSIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1Qjg4RjAzOTkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhRXZlbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzREY0Q0U4MzAzOTAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIpKQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQXNzb2NpYXRpb24gIkltcGxlbWVudHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2MtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QTBENzAyNDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJDb25zdHJhaW50IC0gU291cmNlIG9mIGltcGxlbWVudHMgaXMgb2YgVHlwZUtpbmQgQ0xBU1NUWVBFIGFuZCB0YXJnZXQgaXMgSU5URVJGQUNFVFlQRSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW1wbGVtZW50c0ludGVyZmFjZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTBEQTAxMDkiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wbGVtZW50c0ludGVyZmFjZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcGxlbWVudGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTBEQTAxMzgiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wbGVtZW50ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiTWV0aG9kSGFzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDMwMkNFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXJzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDgwMTk2IgotCQkgICAgbGFiZWwgICAgICAJInBhcmFtZXRlcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDgwMTk3IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEIwODgwMUE1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvdHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCMDkxMDA3RCIKLQkJICAgIGxhYmVsICAgICAgCSIvdHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3R5cGVkRWxlbWVudCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCMDkxMDA4QyIKLQkJICAgIGxhYmVsICAgICAgCSIvdHlwZWRFbGVtZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiTWV0aG9kVGhyb3dzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUIwMTc4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGFyZ2V0IG11c3QgYmUgb2Yga2luZCBFWENFUFRJT05UWVBFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJqYXZhRXhjZXB0aW9ucyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBCNjFFMDFDMyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhRXhjZXB0aW9ucyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUUwMjI3IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQ29udGVudHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODEwRTYwODAyNjgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNvbnRhaW5lZEJ5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDktMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU2MEUwMTQ0IgotCQkgICAgbGFiZWwgICAgICAJImNvbnRhaW5lZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU2MEUwMTYyIgotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIkNsYXNzSW1wb3J0cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY2xhc3NJbXBvcnQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRCRjAwMEUiCi0JCSAgICBsYWJlbCAgICAgIAkiY2xhc3NJbXBvcnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcG9ydGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0ZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRCRjAwMEYiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wb3J0ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiUGFja2FnZUltcG9ydHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODI5QzRFQzAyMDciCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhY2thZ2VJbXBvcnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM0RUUwMEZCIgotCQkgICAgbGFiZWwgICAgICAJInBhY2thZ2VJbXBvcnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcG9ydGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1MC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRFRTAxMDUiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wb3J0ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUJEMDIxOSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZmllbGRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkUwMzUwIgotCQkgICAgbGFiZWwgICAgICAJImZpZWxkcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkUwM0JGIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODJBMjlDMDAxN0QiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIm1ldGhvZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1NS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlDMTAxNzQiCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMxMDIwQSIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjQwM0M2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvc3VwZXJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjgwM0I3IgotCQkgICAgbGFiZWwgICAgICAJIi9zdXBlcnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIi9zdWJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTktMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjkwMDk4IgotCQkgICAgbGFiZWwgICAgICAJIi9zdWJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMDMwMUFDIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvc3VwZXJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMDkwMzI4IgotCQkgICAgbGFiZWwgICAgICAJIi9zdXBlcnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIi9zdWJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMEEwMDFDIgotCQkgICAgbGFiZWwgICAgICAJIi9zdWJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTA5NTAzRTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVycyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk3MDE1MyIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpJbml0aWFsaXplciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk3MDE1RCIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUEyMTIwMEMyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJkZWNsYXJlZENsYXNzZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTIxNzAxRDgiCi0JCSAgICBsYWJlbCAgICAgIAkiZGVjbGFyZWRDbGFzc2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJkZWNsYXJpbmdDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMjE3MDJEQyIKLQkJICAgIGxhYmVsICAgICAgCSJkZWNsYXJpbmdDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTJBNzAxQzEiCi0JICAgIHN0ZXJlb3R5cGUgCSJkZXJpdmVkIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3NlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY0LTAwNWQ5ZTZhZGVjNDoxIikpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTJBODAzNjciCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFQYWNrYWdlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjUtMDA1ZDllNmFkZWM0OjEiKSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE5MDA4MyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhUGFja2FnZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Ni0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzMzMDM2QSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzgwMTQwIgotCQkgICAgbGFiZWwgICAgICAJInNvdXJjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJpbml0aWFsaXplciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzM4MDE2OCIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDNTYwMkEyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbml0aWFsaXplciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzU3MDJERiIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZmllbGQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUM1NzAzMDciCi0JCSAgICBsYWJlbCAgICAgIAkiZmllbGQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBQ0E1MDFFNyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NmFjNDAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDQTcwMTdDIgotCQkgICAgbGFiZWwgICAgICAJInNvdXJjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ2YWM0MC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUNBNzAxQjgiCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUwMDE2OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXZlbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUyMDA4RiIKLQkJICAgIGxhYmVsICAgICAgCSJldmVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRXZlbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiIKLQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkJFMjAwOTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiCi0JICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3NzAyNTMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImFsbEV2ZW50cyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0M4OTM4NzgwMkNDIgotCQkgICAgbGFiZWwgICAgICAJImFsbEV2ZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3ODAyQ0UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiCi0JICAgIHF1aWQgICAgICAgCSIzREY0Q0FBRDAxQTMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0RGNENBQUUwMUVCIgotCQkgICAgbGFiZWwgICAgICAJImNvbXBvbmVudFR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzaWZpZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDRTRGRUUwMzcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkgICAgcXVpZCAgICAgICAJIjNERjRDQUFFMDFGNSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkFycmF5VHlwZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTlENzlFRDAxREYiKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFY29yZSBiaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlDMEYwMDlCIgotCSAgICB0aXRsZSAgICAgIAkiRWNvcmUgYmluZGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJNDA5NAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBAMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSg2ODksIDM2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDY4OSwgNDI0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTgKLQkJCW1heF93aWR0aCAgCTcwOSkKLQkJICAgIHdpZHRoICAgICAgCTg0OAotCQkgICAgaGVpZ2h0ICAgICAJNDM4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDQ4MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDMxLCA0MzQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhY2thZ2UiIEAzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTAzLCA0NSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVQYWNrYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwNUMzRjcwMDBBIgotCQkgICAgd2lkdGggICAgICAJMTk2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTRENzAwNDYiCi0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyOCwgMTgyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDE0NjUsIDE2MTUpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoMTQ2NSwgMTcxNSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTQ1MikKLQkJICAgIHdpZHRoICAgICAgCTU0NAotCQkgICAgaGVpZ2h0ICAgICAJNDQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT3BlcmF0aW9uIiBANgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzIwLCAxNDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYKLQkJCWxvY2F0aW9uICAgCSgyMjMxLCA0NSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0REFBMjAwQTAiCi0JCSAgICB3aWR0aCAgICAgIAkxOTYKLQkJICAgIGhlaWdodCAgICAgCTIyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRGF0YVR5cGUiIEA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM1MiwgMTIxNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDExLCAxMTQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSgxMSwgMTE5OSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1ODUpCi0JCSAgICB3aWR0aCAgICAgIAk3MDAKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMzYsIDc2OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDE3MzYsIDM1NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoMTczNiwgNDEzKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTE3Ci0JCQltYXhfd2lkdGggIAkxMDI3KQotCQkgICAgd2lkdGggICAgICAJMTIxOAotCQkgICAgaGVpZ2h0ICAgICAJODQ0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk5MDk1MzgwM0FEIgotCQkgICAgY2xpZW50ICAgICAJQDgKLQkJICAgIHN1cHBsaWVyICAgCUA2Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNzYsIDM0NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc2LCAyNTUpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzMTIsIDI4NjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoMzMwLCAyMjczKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJbG9jYXRpb24gICAJKDMzMCwgMjMyOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyNQotCQkJbWF4X3dpZHRoICAJMTY4MCkKLQkJICAgIHdpZHRoICAgICAgCTE5ODIKLQkJICAgIGhlaWdodCAgICAgCTEyMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTUwMDAwQjMiCi0JCSAgICBjbGllbnQgICAgIAlAMTAKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTQsIDIyNjIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5NCwgMjA0NCkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIgQDEyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDE0NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoNjA4LCAxMjg2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDYwOCwgMTM0MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk3Ci0JCQltYXhfd2lkdGggIAk2ODUpCi0JCSAgICB3aWR0aCAgICAgIAk4MTgKLQkJICAgIGhlaWdodCAgICAgCTM5NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhcmFtZXRlciIgQDEzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDk2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTMKLQkJCWxvY2F0aW9uICAgCSg5MTksIDg2MSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNFNjE1MDEwNCIKLQkJICAgIHdpZHRoICAgICAgCTE5NgotCQkgICAgaGVpZ2h0ICAgICAJMjIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCNzgxOEIwMDE4NiIKLQkJICAgIGNsaWVudCAgICAgCUAxMgotCQkgICAgc3VwcGxpZXIgICAJQDEzCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAxNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDgxNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSg1NiwgNjMwKQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDU2LCA3MzApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk0NTIpCi0JCSAgICB3aWR0aCAgICAgIAk1NDYKLQkJICAgIGhlaWdodCAgICAgCTM5NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUyNjhFMjAxQjEiCi0JCSAgICBjbGllbnQgICAgIAlANwotCQkgICAgc3VwcGxpZXIgICAJQDE1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFVHlwZWRFbGVtZW50IiBAMTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgMTEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3Ci0JCQlsb2NhdGlvbiAgIAkoOTE2LCA0MSkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVUeXBlZEVsZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEY2MDM5OCIKLQkJICAgIHdpZHRoICAgICAgCTM5NAotCQkgICAgaGVpZ2h0ICAgICAJMTY0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDQ4N0Y5MDMzNCIKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlAMTcKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9seW1vcnBoaXNtIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlEMDAwMzczIgotCSAgICB0aXRsZSAgICAgIAkiUG9seW1vcnBoaXNtIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoMzY1LCA1MzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAyMAotCQkgICAgbG9jYXRpb24gICAJKDE2NiwgNTM3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI0MDNDNiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1cGVydHlwZSIgQDIxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMwLCAyMTcpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMgotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA0ODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdXBlcnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC40MTkxOTIKLQkJCQloZWlnaHQgICAgIAkzOAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI4MDNCNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTY2LCA1MzcpCi0JCQkJKDE2NiwgNTE3KQotCQkJCSgzNTYsIDUxNykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgNTE3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQotCQkJCWxvY2F0aW9uICAgCSgzMzQsIDQ2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdWJ0eXBlIiBAMjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzAsIDIxNykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNAotCQkJCWxvY2F0aW9uICAgCSgyNTcsIDU4MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1YnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC41MzI0NjgKLQkJCQloZWlnaHQgICAgIAkyNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI5MDA5OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTY2LCA1MzcpCi0JCQkJKDE2NiwgNTU4KQotCQkJCSgzNTYsIDU1OCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgNTU4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNAotCQkJCWxvY2F0aW9uICAgCSgzMzQsIDYxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDI3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzOTIsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCWxvY2F0aW9uICAgCSgxMjYxLCA1MzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjgwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJJbXBsZW1lbnRzIiBAMjgKLQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDUyMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTBENzAyNDIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcGxlbWVudHNJbnRlcmZhY2VzIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDQzMCwgLTU0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDgzOSwgNDg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDcKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJCQlwY3REaXN0ICAgIAktMC4zNDM1NTgKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMERBMDEwOSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjgKLQkJCSAgICBzdXBwbGllciAgIAlAMjcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDQsIDUyMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MiwgNTIxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgxMTgxLCA0ODUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNzczMDA2Ci0JCQkJaGVpZ2h0ICAgICAJMzcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBsZW1lbnRlZEJ5IiBAMzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDQzMCwgLTU0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMKLQkJCQlQYXJlbnRfVmlldyAJQDMyCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDU3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW1wbGVtZW50ZWRCeSIKLQkJCQlwY3REaXN0ICAgIAktMC40NzA3NjkKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMERBMDEzOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjgKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDQsIDUyMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCA1MjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQKLQkJCQlQYXJlbnRfVmlldyAJQDMyCi0JCQkJbG9jYXRpb24gICAJKDY4NCwgNTY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg0MzIzMAotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMzUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCA2MDEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMDMwMUFDIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VwZXJ0eXBlIiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkgICAgbG9jYXRpb24gICAJKDM1OCwgMjY1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDE3MjEsIDY0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1cGVydHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjIyNzI3MwotCQkJCWhlaWdodCAgICAgCTEzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMDkwMzI4IgotCQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNzUwLCA2MDEpCi0JCQkJKDE3NTAsIDYyNykKLQkJCQkoMTUzMiwgNjI3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA2MDEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzIsIDYyNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOAotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTU1NywgNTc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1YnR5cGUiIEAzOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzU4LCAyNjUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MAotCQkJCVBhcmVudF9WaWV3IAlAMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTYyNiwgNTUzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VidHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjYxNTk3MAotCQkJCWhlaWdodCAgICAgCTI0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMEEwMDFDIgotCQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNzUwLCA2MDEpCi0JCQkJKDE3NTAsIDU3NikKLQkJCQkoMTUzMiwgNTc2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA2MDEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzIsIDU3NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQotCQkJCVBhcmVudF9WaWV3IAlAMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTU1NywgNjMwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjM4MTA5RjkyMDAwQiIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTI3NjAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBOb3RlVmlldyBANDIKLQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDE4NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQyCi0JCQlsb2NhdGlvbiAgIAkoNTUxLCAxNzE4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTU1OQotCQkJbGFiZWwgICAgICAJIlRoaXMgc2hvdWxkIHJlYWxseSBiZSBKYXZhQ2xhc3MgYW5kIEphdmFEYXRhVHlwZSwgZUNsYXNzaWZpZXIgaXMgdGhlaXIgY2xvc2VzdCBjb21tb24gYW5jZXN0b3IuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTg0MjE2MzEKLQkJICAgIHdpZHRoICAgICAgCTYxOQotCQkgICAgaGVpZ2h0ICAgICAJMjU2KQotCQkob2JqZWN0IE5vdGVWaWV3IEA0MwotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMzIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJbG9jYXRpb24gICAJKDEwNywgMTY2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTI5NQotCQkJbGFiZWwgICAgICAJIlRoZSBjbGFzc2VzIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSBzdGFuZGFyZCBFUGFja2FnZSBtZXRhT2JqZWN0cyByZWxhdGlvbnNoaXAuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAkzNTUKLQkJICAgIGhlaWdodCAgICAgCTMyMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIgQDQ0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NzYsIDQ4MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDQKLQkJCWxvY2F0aW9uICAgCSgxNjgwLCA0MzQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIiBANDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJbG9jYXRpb24gICAJKDEzNjMsIDE1MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbml0aWFsaXplciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANDUKLQkJCWxvY2F0aW9uICAgCSgxMzYzLCAyMDcpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzQ1KQotCQkgICAgd2lkdGggICAgICAJNDI4Ci0JCSAgICBoZWlnaHQgICAgIAkxNjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEA0NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NgotCQkJbG9jYXRpb24gICAJKDQ0NywgNTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIiBANDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMTU4NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDcKLQkJCWxvY2F0aW9uICAgCSgxMzQ0LCAxNDg4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA0NwotCQkJbG9jYXRpb24gICAJKDEzNDQsIDE1NDQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNjc4KQotCQkgICAgd2lkdGggICAgICAJODE4Ci0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBANDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcxMiwgOTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJbG9jYXRpb24gICAJKDE2MTMsIDk0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxNgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiTWV0aG9kSGFzIiBANDkKLQkJICAgIGxvY2F0aW9uICAgCSgxNzAwLCAxMjYyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjAzMDJDRSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kIiBANTAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwOCwgMjM4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGMDgwMTk3IgotCQkJICAgIGNsaWVudCAgICAgCUA0OQotCQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3MDAsIDEyNjIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDAsIDEwNDkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEKLQkJCQlQYXJlbnRfVmlldyAJQDUwCi0JCQkJbG9jYXRpb24gICAJKDE2MzMsIDEwOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzgxNjU5Ci0JCQkJaGVpZ2h0ICAgICAJNjgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJhbWV0ZXJzIiBANTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwOCwgMjM4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDE4MzcsIDE0MzMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmFtZXRlcnMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDM1NjUKLQkJCQloZWlnaHQgICAgIAkxMzcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUYwODAxOTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMCwgMTI2MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMCwgMTQ3NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NAotCQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCQlsb2NhdGlvbiAgIAkoMTYzNiwgMTQ1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDUxMjgKLQkJCQloZWlnaHQgICAgIAk2NQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Ci0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSgxNTkyLCAxMzk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjYyODgyMQotCQkJCWhlaWdodCAgICAgCTEwOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIgQDU2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxOTIsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJbG9jYXRpb24gICAJKDIwNjQsIDYwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhRXZlbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIHdpZHRoICAgICAgCTI3NAotCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDU3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDU2MCwgNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDM3NCwgNTU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCWxvY2F0aW9uICAgCSgzNzQsIDYxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAkzMTMpCi0JCSAgICB3aWR0aCAgICAgIAkzOTAKLQkJICAgIGhlaWdodCAgICAgCTI1OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA1OAotCQkgICAgbG9jYXRpb24gICAJKDEyMTMsIDUzOCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRDAyMTkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzMsIDI4MikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSgxNTExLCA1MTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQlwY3REaXN0ICAgIAkwLjY1MzAxNwotCQkJCWhlaWdodCAgICAgCTI2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QkUwMzUwIgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTMsIDUzOCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3MSwgNTM4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSgxNjI0LCA0ODUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMzLCAyODIpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QkUwM0JGIgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTMsIDUzOCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA1MzgpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSg5MTYsIDMwNykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NTAzRTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRpYWxpemVycyIgQDY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIDk5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDEwOTYsIDIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW5pdGlhbGl6ZXJzIgotCQkJCXBjdERpc3QgICAgCTAuNDEwNzE5Ci0JCQkJaGVpZ2h0ICAgICAJOTIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NzAxNTMiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTE2LCAzMDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTQsIDMwNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NgotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTM0NSwgMzY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjk3OTY4NwotCQkJCWhlaWdodCAgICAgCTYxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzIiBANjcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgOTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEwOTcwMTVEIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg5MTYsIDMwNykKLQkJCQkoNzEzLCAzMDcpCi0JCQkJKDcxMywgNTQzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTYsIDMwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA1NDMpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBANjgKLQkJICAgIGxvY2F0aW9uICAgCSgyMDYsIDY0MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxMjAwQzIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImRlY2xhcmVkQ2xhc3NlcyIgQDY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc4LCAyNzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MAotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1ODIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMyNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2RlY2xhcmVkQ2xhc3NlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjM0MzE5NQotCQkJCWhlaWdodCAgICAgCTMxCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyMTcwMUQ4IgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMDYsIDY0MikKLQkJCQkoMjA2LCA2MTIpCi0JCQkJKDM2NSwgNjEyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDYsIDY0MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY1LCA2MTIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDM0NywgNTU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMjM2NwotCQkJCWhlaWdodCAgICAgCTU3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVjbGFyaW5nQ2xhc3MiIEA3MgotCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3OCwgMjc0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMKLQkJCQlQYXJlbnRfVmlldyAJQDcyCi0JCQkJbG9jYXRpb24gICAJKDI1OCwgNjc1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyOTgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitkZWNsYXJpbmdDbGFzcyIKLQkJCQlwY3REaXN0ICAgIAkwLjQzNDI4NgotCQkJCWhlaWdodCAgICAgCTMKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxNzAyREMiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIwNiwgNjQyKQotCQkJCSgyMDYsIDY3MikKLQkJCQkoMzY1LCA2NzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNiwgNjQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjUsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NAotCQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCQlsb2NhdGlvbiAgIAkoMzQ1LCA3MjYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA3NQotCQkgICAgbG9jYXRpb24gICAJKDYwMywgMzQ3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA3NgotCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJbG9jYXRpb24gICAJKDYwMywgMjI4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRlcml2ZWQ+PiIKLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQloZWlnaHQgICAgIAkxMjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMkE3MDFDMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzZXMiIEA3NwotCQkJICAgIFBhcmVudF9WaWV3IAlANzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcsIDIxOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDQxOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YUNsYXNzZXMiCi0JCQkJcGN0RGlzdCAgICAJMC4zNjc1MjEKLQkJCQloZWlnaHQgICAgIAkxMTcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTJBODAzNjciCi0JCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAzLCAzNDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMywgNTQzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJCWxvY2F0aW9uICAgCSg2NTcsIDUyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFQYWNrYWdlIiBAODAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkgICAgbG9jYXRpb24gICAJKDI3LCAyMTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoNDgyLCAxNzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI2MwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2phdmFQYWNrYWdlIgotCQkJCXBjdERpc3QgICAgCTAuODYyOTAzCi0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyQTkwMDgzIgotCQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkJICAgIHN1cHBsaWVyICAgCUA0NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYwMywgMzQ3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDMsIDE1MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MgotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoNjU3LCAxNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA4MwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDQzCi0JCSAgICBzdXBwbGllciAgIAlANzUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAODQKLQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDE1MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1Ci0JCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQlsb2NhdGlvbiAgIAkoNjE2LCAxNDY1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaGlkZGVuICAgICAJVFJVRQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiIgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTYwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjA4ODAxQTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIi90eXBlZEVsZW1lbnQiIEA4NgotCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDk0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRCMDkxMDA4QyIKLQkJCSAgICBjbGllbnQgICAgIAlAODQKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjE2LCAxNTI0KQotCQkJCSg2MTYsIDE1ODQpCi0JCQkJKDEzMzUsIDE1ODQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYxNiwgMTUyNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMzNSwgMTU4NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NwotCQkJCVBhcmVudF9WaWV3IAlAODYKLQkJCQlsb2NhdGlvbiAgIAkoMTI1NiwgMTUzMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIi90eXBlIiBAODgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Ci0JCQkgICAgbG9jYXRpb24gICAJKDU2LCA5NDgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQotCQkJCVBhcmVudF9WaWV3IAlAODgKLQkJCQlsb2NhdGlvbiAgIAkoNjk3LCAxMDk5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvdHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjU4ODE2MQotCQkJCWhlaWdodCAgICAgCTgxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEIwOTEwMDdEIgotCQkJICAgIGNsaWVudCAgICAgCUA4NAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYxNiwgMTUyNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjE2LCA4MDEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOTAKLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA5NjEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzAwMTdEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RzIiBAOTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwCi0JCQkgICAgbG9jYXRpb24gICAJKDYwOCwgNzA1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDE0MDksIDg4OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kcyIKLQkJCQlwY3REaXN0ICAgIAkwLjYyNDAyMwotCQkJCWhlaWdodCAgICAgCTczCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzEwMTc0IgotCQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODgsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwNCwgOTYxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxNDgzLCAxMDE3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc2NjA0MAotCQkJCWhlaWdodCAgICAgCTU2Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzIiBAOTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwCi0JCQkgICAgbG9jYXRpb24gICAJKDYwOCwgNzA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUMxMDIwQSIKLQkJCSAgICBjbGllbnQgICAgIAlAOTAKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTA4OCwgOTYxKQotCQkJCSg3MzIsIDk2MSkKLQkJCQkoNzMyLCA4MDEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODgsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzMyLCA4MDEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJNZXRob2RUaHJvd3MiIEA5NQotCQkgICAgbG9jYXRpb24gICAJKDEwNDcsIDk4MSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxQjAxNzgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDk2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDQwNSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxRTAyMjciCi0JCQkgICAgY2xpZW50ICAgICAJQDk1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0NywgOTgxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjA0LCA5ODEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUV4Y2VwdGlvbnMiIEA5NwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg3LCA0MDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OAotCQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCQlsb2NhdGlvbiAgIAkoNzMzLCA5NDUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2phdmFFeGNlcHRpb25zIgotCQkJCXBjdERpc3QgICAgCTAuNTYzNjY0Ci0JCQkJaGVpZ2h0ICAgICAJMzcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxRTAxQzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDk1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwNDcsIDk4MSkKLQkJCQkoNjY5LCA5ODEpCi0JCQkJKDY2OSwgODAxKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ3LCA5ODEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY2OSwgODAxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJCWxvY2F0aW9uICAgCSg3MjMsIDg1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxMDAKLQkJICAgIGxvY2F0aW9uICAgCSgxNTQxLCA4MDYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkJFMDAxNjgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImV2ZW50cyIgQDEwMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwCi0JCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTM0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQlsb2NhdGlvbiAgIAkoMjE2OSwgNzY1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitldmVudHMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQkUyMDA4RiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTAwCi0JCQkgICAgc3VwcGxpZXIgICAJQDU2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1NDEsIDgwNikKLQkJCQkoMjIzOCwgODA2KQotCQkJCSgyMjM4LCA3MTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDgwNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzOCwgNzE3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMwotCQkJCVBhcmVudF9WaWV3IAlAMTAxCi0JCQkJbG9jYXRpb24gICAJKDIyOTIsIDc5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAMTA0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMzQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MkZCRTIwMDkxIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDAKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQxLCA4MDYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1NSwgODA2KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxMDUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCA2NjMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3NzAyNTMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImFsbEV2ZW50cyIgQDEwNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkgICAgbG9jYXRpb24gICAJKDg0NSwgLTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcKLQkJCQlQYXJlbnRfVmlldyAJQDEwNgotCQkJCWxvY2F0aW9uICAgCSgxOTI1LCA2MjIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2FsbEV2ZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4OTM4NzgwMkNDIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDUKLQkJCSAgICBzdXBwbGllciAgIAlANTYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA1LCA2NjMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTUsIDY2MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgKLQkJCQlQYXJlbnRfVmlldyAJQDEwNgotCQkJCWxvY2F0aW9uICAgCSgxOTc1LCA3MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODc2MzM2Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDEwOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkgICAgbG9jYXRpb24gICAJKDg0NSwgLTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4OTM4NzgwMkNFIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA1LCA2NjMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1NSwgNjYzKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3NpZmllciIgQDExMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDIyNTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCAyMDU5KQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzaWZpZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjNBQ0U0RkVFMDM3MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDExMAotCQkJbG9jYXRpb24gICAJKDEzMCwgMjE2MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNTM4KQotCQkgICAgd2lkdGggICAgICAJNjU0Ci0JCSAgICBoZWlnaHQgICAgIAk0MTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6QXJyYXlUeXBlIiBAMTExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM1MiwgMTMyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTExCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxMjU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkFycmF5VHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBOUQ3OUVEMDFERiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDExMQotCQkJbG9jYXRpb24gICAJKDExMiwgMTMxMSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk0MDUpCi0JCSAgICB3aWR0aCAgICAgIAk0OTgKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E5RDc5RkQwMTBGIgotCQkgICAgY2xpZW50ICAgICAJQDExMQotCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQzMSwgMTI0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzEsIDgwMSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDExMwotCQkgICAgbG9jYXRpb24gICAJKDM5MywgMTcyOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFEMDFBMyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50VHlwZSIgQDExNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKC01NSwgMzg1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoMzc4LCAxOTg2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjb21wb25lbnRUeXBlIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0FBRTAxRUIiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMTAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoNDc3LCAyMDA4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJICAgIGxvY2F0aW9uICAgCSgtNTUsIDM4NSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0FBRTAxRjUiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIgQDExOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjI0LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTE4Ci0JCQlsb2NhdGlvbiAgIAkoMjAzMywgMTQ1KQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzgyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVN0cnVjdHVyYWxGZWF0dXJlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiCi0JCSAgICB3aWR0aCAgICAgIAk0MDAKLQkJICAgIGhlaWdodCAgICAgCTE4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGNENFODMwMzkwIgotCQkgICAgY2xpZW50ICAgICAJQDU2Ci0JCSAgICBzdXBwbGllciAgIAlAMTE4Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkltcG9ydHMiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTBEQzAxNUQiCi0JICAgIHRpdGxlICAgICAgCSJJbXBvcnRzIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTIwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMyMCwgNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMjAKLQkJCWxvY2F0aW9uICAgCSgxODksIDYyNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiQ2xhc3NJbXBvcnRzIiBAMTIxCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTE1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIKLQkJCVBhcmVudF9WaWV3IAlAMTIxCi0JCQlsb2NhdGlvbiAgIAkoNjc3LCAxMDQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ2xhc3NJbXBvcnRzIgotCQkJcGN0RGlzdCAgICAJMS4wNjY2NjcKLQkJCWhlaWdodCAgICAgCTc2Ci0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImNsYXNzSW1wb3J0IiBAMTIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAzMzEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg2NjUsIDY3MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY2xhc3NJbXBvcnQiCi0JCQkJcGN0RGlzdCAgICAJMC43MjcxNTQKLQkJCQloZWlnaHQgICAgIAkyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0QkYwMDBFIgotCQkJICAgIGNsaWVudCAgICAgCUAxMjEKLQkJCSAgICBzdXBwbGllciAgIAlAMTIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY0MywgMTExNSkKLQkJCQkoNzAzLCAxMTE1KQotCQkJCSg3MDMsIDY3MikKLQkJCQkoNDYwLCA2NzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MywgMTExNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYwLCA2NzIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjMKLQkJCQlsb2NhdGlvbiAgIAkoNTI1LCA3MjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTE0Njc2Ci0JCQkJaGVpZ2h0ICAgICAJNTEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg3NDIsIDczNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC41ODc0NjcKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcG9ydGVkQnkiIEAxMjcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDMzMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOAotCQkJCVBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJbG9jYXRpb24gICAJKDMzMCwgOTM2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBvcnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCTAuNzA4MDQwCi0JCQkJaGVpZ2h0ICAgICAJMTAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEYiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjQzLCAxMTE1KQotCQkJCSgzMjAsIDExMTUpCi0JCQkJKDMyMCwgNzI5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDMsIDExMTUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyMCwgNzI5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQotCQkJCVBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJbG9jYXRpb24gICAJKDI4MCwgODAyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NzYxMQotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEAxMzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMzAKLQkJCWxvY2F0aW9uICAgCSgxMjQ3LCAxNzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiUGFja2FnZUltcG9ydHMiIEAxMzEKLQkJICAgIGxvY2F0aW9uICAgCSgxMDIzLCAzODIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMgotCQkJUGFyZW50X1ZpZXcgCUAxMzEKLQkJCWxvY2F0aW9uICAgCSgxMDM4LCA0MTkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYWNrYWdlSW1wb3J0cyIKLQkJCXBjdERpc3QgICAgCTAuNzUwMDAwCi0JCQloZWlnaHQgICAgIAkzNwotCQkJb3JpZW50YXRpb24gCTEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0RUMwMjA3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBvcnRlZEJ5IiBAMTMzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxNywgLTMwNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNAotCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJbG9jYXRpb24gICAJKDY0OCwgNDMwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBvcnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCTAuNjQ2NTI2Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFRTAxMDUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAyMywgMzgyKQotCQkJCSgxMDIzLCAyNTUpCi0JCQkJKDQxMywgNjE0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQlsb2NhdGlvbiAgIAkoNTEyLCA2MTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYWNrYWdlSW1wb3J0cyIgQDEzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTcsIC0zMDYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxMjIzLCA1NzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhY2thZ2VJbXBvcnRzIgotCQkJCXBjdERpc3QgICAgCTAuNTIyNDcyCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFRTAwRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAyMywgMzgyKQotCQkJCSgxMDIzLCA2MTgpCi0JCQkJKDEyNjUsIDYxOCkKLQkJCQkoMTM4NiwgMjgxKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgMzc4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgNTAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjc2OTY2MwotCQkJCWhlaWdodCAgICAgCTEwOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNvdXJjZSBjb2RlIgotCSAgICBxdWlkICAgICAgIAkiMzgxMEExM0IwMTU5IgotCSAgICB0aXRsZSAgICAgIAkiU291cmNlIGNvZGUiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpDb21tZW50IiBAMTQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDU5MiwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCWxvY2F0aW9uICAgCSg0NzUsIDY0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJDb21tZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODg5QjAyQjgiCi0JCSAgICB3aWR0aCAgICAgIAkyNTIKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpTdGF0ZW1lbnQiIEAxNDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDEKLQkJCWxvY2F0aW9uICAgCSg5ODMsIDY0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTdGF0ZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4OEI5MDI1QSIKLQkJICAgIHdpZHRoICAgICAgCTI2MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIiBAMTQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NCwgMjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDIKLQkJCWxvY2F0aW9uICAgCSgzMywgMjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIgotCQkgICAgd2lkdGggICAgICAJMjQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxNDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2LCAxMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MwotCQkJbG9jYXRpb24gICAJKDE2MCwgNjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkyMTAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIgQDE0NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NjQsIDM1MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQ0Ci0JCQlsb2NhdGlvbiAgIAkoNjkyLCAyNTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmxvY2siKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE0NAotCQkJbG9jYXRpb24gICAJKDY5MiwgMzEyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTI5MCkKLQkJICAgIHdpZHRoICAgICAgCTM2MgotCQkgICAgaGVpZ2h0ICAgICAJMjE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1Ci0JCSAgICBsb2NhdGlvbiAgIAkoODY0LCA1ODApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoODY0LCA1ODApCi0JCQkoODY0LCA0NTkpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4RDYwMEE1IgotCQkgICAgY2xpZW50ICAgICAJQDE0MAotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODEsIDYzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODEsIDU4MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE0NSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4REEwMDU2IgotCQkgICAgY2xpZW50ICAgICAJQDE0MQotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIxLCA2MzApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMSwgNTgwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTQ1KQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDE0OAotCQkgICAgbG9jYXRpb24gICAJKDQ3MywgMzAwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzMzMDM2QSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic291cmNlIiBAMTQ5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzLCAtMzg4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDkKLQkJCQlsb2NhdGlvbiAgIAkoNTk5LCAyNjcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvdXJjZSIKLQkJCQlwY3REaXN0ICAgIAkwLjU5OTM5MwotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzgwMTQwIgotCQkJICAgIGNsaWVudCAgICAgCUAxNDgKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDczLCAzMDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY4MywgMzAwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MQotCQkJCVBhcmVudF9WaWV3IAlAMTQ5Ci0JCQkJbG9jYXRpb24gICAJKDYwNSwgMzM0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjYzNTI2NgotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXIiIEAxNTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTMsIC0zODgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzgwMTY4IgotCQkJICAgIGNsaWVudCAgICAgCUAxNDgKLQkJCSAgICBzdXBwbGllciAgIAlAMTQyCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDczLCAzMDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NCwgMzAwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDE1MwotCQkgICAgbG9jYXRpb24gICAJKDY3MSwgMTE0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTQKLQkJCVBhcmVudF9WaWV3IAlAMTUzCi0JCQlsb2NhdGlvbiAgIAkoNjcxLCA1NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiIgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTYwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUM1NjAyQTIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRpYWxpemVyIiBAMTU1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzE5LCAtMzM0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNTUKLQkJCQlsb2NhdGlvbiAgIAkoOTU0LCAyMTApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luaXRpYWxpemVyIgotCQkJCXBjdERpc3QgICAgCTAuODkxODI3Ci0JCQkJaGVpZ2h0ICAgICAJMTA0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDNTcwMkRGIgotCQkJICAgIGNsaWVudCAgICAgCUAxNTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY3MSwgMTE0KQotCQkJCSg4NTAsIDExNCkKLQkJCQkoODUwLCAyNDUpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3MSwgMTE0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDI0NSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTcKLQkJCQlQYXJlbnRfVmlldyAJQDE1NQotCQkJCWxvY2F0aW9uICAgCSg3OTAsIDIxOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MTM0NjIKLQkJCQloZWlnaHQgICAgIAk2MQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImZpZWxkIiBAMTU4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzE5LCAtMzM0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzU3MDMwNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTUzCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0MwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3MSwgMTE0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjEsIDExNCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEAxNTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCA0OTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1OQotCQkJbG9jYXRpb24gICAJKDE5MCwgNDUwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxNAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEAxNjAKLQkJICAgIGxvY2F0aW9uICAgCSg1OTYsIDQ5NikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUNBNTAxRTciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNvdXJjZSIgQDE2MQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgLTQ0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MgotCQkJCVBhcmVudF9WaWV3IAlAMTYxCi0JCQkJbG9jYXRpb24gICAJKDY5MCwgNDYzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzb3VyY2UiCi0JCQkJcGN0RGlzdCAgICAJMC40NzQ3NzcKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQ0E3MDE3QyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTYwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg1OTYsIDQ5NikKLQkJCQkoNzU5LCA0OTYpCi0JCQkJKDc1OSwgNDU5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTYsIDQ5NikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU5LCA0NTkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjEKLQkJCQlsb2NhdGlvbiAgIAkoODE3LCA0NzcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTE1MzY3Ci0JCQkJaGVpZ2h0ICAgICAJNTgKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEAxNjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MAotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIC00NDgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDQTcwMUI4IgotCQkJICAgIGNsaWVudCAgICAgCUAxNjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTU5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTk2LCA0OTYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5NSwgNDk2KSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkRhdGEgVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTFDRTAyRUIiCi0JICAgIHRpdGxlICAgICAgCSJEYXRhIFR5cGVzIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6VHlwZUtpbmQiIEAxNjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJbG9jYXRpb24gICAJKDc3LCA4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJUeXBlS2luZCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSg3NywgMzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEI0NjAwMkJGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoNzcsIDE0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyNzcpCi0JCSAgICB3aWR0aCAgICAgIAkzNDQKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhVmlzaWJpbGl0eUtpbmQiIEAxNjYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCA2NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDY4LCA1MDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDY4LCA0NTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyMzMzQkUwMzJFIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDU1NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyOTIpCi0JCSAgICB3aWR0aCAgICAgIAkzNjIKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMTY3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTI5NiwgMjA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjcKLQkJCWxvY2F0aW9uICAgCSg4ODcsIDUyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTc4MwotCQkJbGFiZWwgICAgICAJCi18VGhlIEphdmEgcHJpbWl0aXZlIHR5cGVzIGFyZSBpbnN0YW5jZXMgb2YgSmF2YURhdGFUeXBlLiAgVGhlIGNvbW1vbiBwYXJlbnQgY2xhc3Mgd2l0aCBKYXZhQ2xhc3MgaXMgQ2xhc3NpZmllci4gIFRoZSBwcmltaXRpdmUgdHlwZXMgY2FuIGJlIG9idGFpbmVkIHZpYSBhIEphdmFVUkwoImludCIpLCB3aGljaCByZXNvbHZlcyB0byBhIHJlZmVyZW5jZSBsaWtlOiAiamF2YTovI2ludCIKLQkJCSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk4NDMKLQkJICAgIGhlaWdodCAgICAgCTMyNSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyS2luZCIgQDE2OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDEwODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2OAotCQkJbG9jYXRpb24gICAJKDYzLCA5NDgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlcktpbmQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDkwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkxQzFFOEYwMTIzIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDEwMDQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNQotCQkJbWF4X3dpZHRoICAJMjA3KQotCQkgICAgd2lkdGggICAgICAJNDA0Ci0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgTm90ZVZpZXcgQDE2OQotCQkgICAgbG9jYXRpb24gICAJKDc2OCwgMTEyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY5Ci0JCQlsb2NhdGlvbiAgIAkoNTc0LCAxMDE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTM1MgotCQkJbGFiZWwgICAgICAJIlRlbXBvcmFyeSBlbnVtIGZvciBKYXZhIHBhcmFtZXRlciBraW5kIHVudGlsIHdlIGdldCB0aGUgYmFzZSBzb3J0ZWQgb3V0IikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk0MTIKLQkJICAgIGhlaWdodCAgICAgCTIxOSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRGF0YVR5cGUiIEAxNzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgMTQwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcwCi0JCQlsb2NhdGlvbiAgIAkoOTk5LCAxMzYyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRGF0YVR5cGUiIEAxNzEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNjQwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzEKLQkJCWxvY2F0aW9uICAgCSg4MTIsIDUxMSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU1MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTI1MDMzRSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJbG9jYXRpb24gICAJKDgxMiwgNjExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTIyKQotCQkgICAgd2lkdGggICAgICAJNTcwCi0JCSAgICBoZWlnaHQgICAgIAkyODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTcyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMTY5Ci0JCSAgICBzdXBwbGllciAgIAlAMTY4Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkphdmEgVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1QjgyMzAyMEQiCi0JICAgIHRpdGxlICAgICAgCSJKYXZhIFR5cGVzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyBkaWFncmFtIGNvbnRhaW5zIHRoZSBKYXZhIFR5cGVzIHRoYXQgYXJlIG5vdCBFTUYgY2xhc3NlcyBidXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhpcyBkaWFncmFtLiIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTQ3OAotCSAgICBvcmlnaW5feSAgIAkzNQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkpUeXBlSmF2YUhlbHBlcnMiIEAxNzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAyMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMTU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEwMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKVHlwZUphdmFIZWxwZXJzIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMTA5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMDI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNzMKLQkJCWxvY2F0aW9uICAgCSgzOTgsIDIxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk4NzMpCi0JCSAgICB3aWR0aCAgICAgIAkxMDQ2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SlR5cGVMaXN0IiBAMTc0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDUyMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKVHlwZUxpc3QiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQlsb2NhdGlvbiAgIAkoNjI4LCA0NzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQlsb2NhdGlvbiAgIAkoNjI4LCA1NzkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTA3KQotCQkgICAgd2lkdGggICAgICAJNTIyCi0JCSAgICBoZWlnaHQgICAgIAkyMTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW5jZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwMDdlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDg2NjkgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJJREUiCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JICAgIHZhbHVlICAgICAgCSIiKSkKLSAgICBxdWlkICAgICAgIAkiM0E3OUVCQTUwMzMxIgotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCUZBTFNFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjk3IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI4RSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNCODZGMTcyMDE2RiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJpbnN0YW50aWF0aW9uIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxpbnN0YW50aWF0aW9uLmNhdCIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE4MCIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVjb3JlLmNhdCIKLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb24iIEAxCi0JCQlsb2NhdGlvbiAgIAkoMzM0LCAyNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwLCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJpbnN0YW50aWF0aW9uIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQjg2RjE3MjAxODAiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJcXVpZCAgICAgICAJIjNCODZGMzFGMDI4MSIKLQkJdGl0bGUgICAgICAJIkRlcGVuZGVuY2llcyAoRG9uJ3QgZWRpdCkiCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgTm90ZVZpZXcgQDIKLQkJCWxvY2F0aW9uICAgCSg3NTMsIDY4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJICAgIGxvY2F0aW9uICAgCSgzMDUsIDUzOSkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTYKLQkJCSAgICBtYXhfd2lkdGggIAk4NjAKLQkJCSAgICBsYWJlbCAgICAgIAkiVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMuIFRoZXkgYXJlIG5vdCB0byBiZSBlZGl0ZWQuIFRoZXkgbXVzdCBvbmx5IGJlIGVkaXRlZCBieSB0aGVpciBvd25lciBtb2RlbHMuIikKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTg0MjE2MzEKLQkJCXdpZHRoICAgICAgCTkyMAotCQkJaGVpZ2h0ICAgICAJMzA1KQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAzCi0JCQlsb2NhdGlvbiAgIAkoMjYzLCAxODUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5LCAxMDEpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNCODZGMTcyMDE2RiIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTc2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTcwIgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzIiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzVGFzayIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIgotCQkJCXZhbHVlICAgICAgCTIwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIgotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMjEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNaXhpbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFzayIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiCi0JCQkJdmFsdWUgICAgICAJMjA5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIgotCQkJCXZhbHVlICAgICAgCTIxMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIyNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIgotCQkJCXZhbHVlICAgICAgCTIyOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXV0byIKLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiREJNUyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVmlldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iCi0JCQl2YWx1ZSAgICAgIAkiTm9uZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm93IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKLQkJCXZhbHVlICAgICAgCSJTUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk0iCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcY2hhcnNldHMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcamNlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpzc2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxccnQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc3VucnNhc2lnbi5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGRuc25zLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbGRhcHNlYy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxvY2FsZWRhdGEuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxzdW5qY2VfcHJvdmlkZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXGxvY2FsX3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcVVNfZXhwb3J0X3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcZHQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGh0bWxjb252ZXJ0ZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXHRvb2xzLmphciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIgotCQkJdmFsdWUgICAgICAJMykKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5IgotCQkJdmFsdWUgICAgICAJImNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU29EQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVG9wTGluayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZW51bSIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibW9kdWxlIgotCQkJCXZhbHVlICAgICAgCTEwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiCi0JCQkJdmFsdWUgICAgICAJMTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQkJdmFsdWUgICAgICAJMTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkidW5pb24iCi0JCQkJdmFsdWUgICAgICAJMTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibWF4IgotCQkJCXZhbHVlICAgICAgCTEwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxjaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIwIgotCQkJCXZhbHVlICAgICAgCTIyMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjEiCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5VmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRlcGxveSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY29uc3RyYWludHMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNJRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpKQotCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzEiKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbnRpYXRpb24uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFkMGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJpbnN0YW50aWF0aW9uIgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuamVtLmludGVybmFsIikpKQotICAgIHF1aWQgICAgICAgCSIzQjg2RjE3MjAxODAiCi0gICAgZG9jdW1lbnRhdGlvbiAJIkphdmEgSW5zdGFudGlhdGlvbiBQYWNrYWdlIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJJSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjhBQjE3ODAyQjEiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTUyOTU2MjAxNEUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhBQjE5MTAwQzIiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklKYXZhSW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTUxNTc3ODAyQjkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklKYXZhT2JqZWN0SW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjc4MkQ3OTAyOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGludGVyZmFjZSBpcyB0aGUgaW5zdGFuY2Ugb2YgYW4gamF2YSBvYmplY3QgaW4gdGhlIGphdmEgbW9kZWwuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MTU3REEwM0REIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNzgzMDE4MDFDOSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YUFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RTY5MDAwNjEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgImFsbG9jYXRpb24iIHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4KLQkgICAgCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBDbGFzcyAiSW5pdFN0cmluZ0FsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUFGOTAwMUUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUI3NTAyREEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5pdFN0cmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzRkZERTFERTAzMkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciB0aGlzIG9iamVjdC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJJbXBsaWNpdEFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUMxNDAyNDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVDNDcwMEU3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIikpKQotCShvYmplY3QgQ2xhc3MgIlBhcnNlVHJlZUFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkM5MTAwMDUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJDQjcwMUQ2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIikpKQotCShvYmplY3QgQ2xhc3MgIlBURXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJQVEFycmF5QWNjZXNzIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJFMTQwMjUwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBcnJheSBhY2Nlc3MuIGUuZy4geFszXS4gCi18Ci18VW5saWtlIEFTVCwgdGhlIGVudGlyZSBleHByZXNzaW9uIG9mIHR5cGUgeFszXVs0XSB3aWxsIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2VwYXJhdGUgQXJyYXlBY2Nlc3MgZm9yIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbi4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIGl0IGlzIGEgc2ltcGxlIGFycmF5IGFjY2VzcyB3aGVyZSBpdCBpcyBvZiB0aGUgZm9ybSB7ZXhwcmVzc2lvbn1bZXhwcmVzc2lvbl1bZXhwcmVzc2lvbl0uCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJFNkYwMUY3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU4RTAyMzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBhcnJheSB0byBhY2Nlc3MuIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5kZXhlcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU5QjAwN0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb25zIHJlcHJlc2VudGluZyB0aGUgaW5kZXhlcyBvZiB0aGUgYWNjZXNzLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIxLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQXJyYXlDcmVhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzNzEyMDI1QSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7ImEifSwgeyJiIn19Ci0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM3MjEwMDQ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzN0U5MDJCRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZnVsbHktcXVhbGlmaWVkIHR5cGUsIGUuZy4gaW50W11bXSBvciBqYXZhLmxhbmcuU3RyaW5nW10sIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBicmFja2V0cy4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpbWVuc2lvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM4OTUwMUU4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluaXRpYWxpemVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzOTdDMDIzMSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBpbml0aWFsaXplciwgaWYgYW55LCBmb3IgdGhpcyBhcnJheS4gRS5nLiBuZXcgaW50W10gezIsM30uIEl0IGlzIHRoZSB7MiwzfS4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRBcnJheUluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzOTY4MDE0QyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRBcnJheUluaXRpYWxpemVyIgotCSAgICBxdWlkICAgICAgIAkiNDAwODM5NjgwMTRDIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQXJyYXkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgZW50aXJlIGV4cHJlc3Npb24sIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbnMgbGlzdCBmb3IgdGhlIHRvcCBBcnJheUluaXRpYWxpemVyLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzOTc5MDAzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNBNTcwMEVCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXN0aGUgbGlzdCBvZiBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGluaXRpYWxpemVyLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIGZpcnN0IGNhc2UgaXQgd2lsbCBiZSB0d28gTnVtYmVyTGl0ZXJhbHMuIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciwgZm9sbG93ZWQgYnkgYSBOdW1iZXJMaXRlcmFsLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQm9vbGVhbkxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4M0FFNzAyNDciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgYm9vbGVhbiBsaXRlcmFsLCBpLmUuIHRydWUgb3IgZmFsc2UgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCMUQwMDAwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJib29sZWFuVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCM0QwMDFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbC4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDYXN0RXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjZGMDA1OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkNhc3QgZXhwcmVzc2lvbiwgZS5nLiAoc2hvcnQpIDEwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCRDYwMzA5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjk2MDBGNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2FzdCwgZS5nLiBpbnQgb3IgamF2YS5sYW5nLlN0cmluZyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0JCNjAzM0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENoYXJhY3RlckxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NERGMTAyNzciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdcXHInLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RTEzMDFFQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXNjYXBlZFZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RTM5MDE0RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICdhJyBvciAnXFxyJy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIHRoZW1zZWx2ZXMuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaGFyVmFsdWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFQjcwMkNDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhY3R1YWwgcHJpbWl0aXZlIGNoYXJhY3RlciB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iCi0JCSAgICB0eXBlICAgICAgIAkiY2hhciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NEY0MDAyNkYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfENsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uIEUuZy4gbmV3IFN0cmluZygiYSIpCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRGNEMwMkY4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RkFEMDI5NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBFLmcuIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGZ1bGx5LXF1YWxpZmllZCBmb3IgYWxsb2NhdGlvbiBwdXJwb3Nlcy4gSXQgc2hvdWxkIGFsc28gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gaWYgWCBpcyBhbiBpbm5lciBjbGFzcyBvZiBqLlksIHRoZW4gdGhlIHR5cGUgaGVyZSBzaG91bGQgYmUgImouWSRYIi4gCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJndW1lbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MTVFMDEzOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4iCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1MUZCMDI2QSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0ZXN0IEV4cHJlc3NvbiwgZS5nLiAoeD0zKSA/IDEgOiAyIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNzQwMTJFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25kaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyMUQwMkFGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cnVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MjQxMDMzMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdHJ1ZSBleHByZXNzaW9uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNUYwMjk2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmYWxzZSBleHByZXNzaW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEZpZWxkQWNjZXNzIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUyREYwMjA0IgotCSAgICBkb2N1bWVudGF0aW9uIAkiQWNjZXNzIGEgZmllbGQgZXhwcmVzc2lvbiwgZS5nLiBqYXZhLmF3dC5Db2xvci5yZWQiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTM1RDAyNDEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlY2VpdmVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzEzMDEyQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWVsZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTM0NTAwQUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGFjY2Vzc2VkLCBlLmcuIHJlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluZml4RXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzhCMDE0MyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFuIGV4cHJlc3Npb24gd2l0aCBhbiBvcGVyYXRvciB0aGF0IGhhcyB0d28gb3BlcmFuZHMsIGUuZy4gMyArIDQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU1NzAwMDMyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZWZ0T3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTNBQzAwMDAiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYXRvciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTNCNjAwRDciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG9wZXJhdG9yLCBlLmcuICsiCi0JCSAgICB0eXBlICAgICAgIAkiUFRJbmZpeE9wZXJhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1M0UxMDM1OSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyaWdodE9wZXJhbmQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU0MEQwMTg2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHJpZ2h0IGV4cHJlc3Npb24uIGkuZS4gNCBvZiAiMyArIDQiCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuZGVkT3BlcmFuZHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU1MTEwMzlDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlVzZWQgd2hlbiB0aGVyZSBhcmUgYSBzZXJpZXMgb2YgaW5maXggb3BlcmF0aW9ucyBvZiB0aGUgc2FtZSBvcGVyYXRvciwgZS5nLiAxICsgMiArIDMgKyA0LiAxIGFuZCAyIHdpbGwgZ28gaW50byBsZWZ0IGFuZCByaWdodCwgd2hpbGUgezMsIDR9IHdpbGwgZ28gaW50byB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMuICIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5maXhPcGVyYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0UxMDM1OSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVudW1lcmF0b3IgZm9yIHRoZSBvcGVyYXRvciBvbiBhbiBJbmZpeEV4cHJlc3Npb24uIgotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlRJTUVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjgzMDI0MCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIqIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkRJVklERSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY4RTAxRTIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiLyBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSRU1BSU5ERVIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2OTIwMkJBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiUgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUExVUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5NzAzOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiKyBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJNSU5VUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5QzAxRDgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiLSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRUZUX1NISUZUIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkI1MDI3NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8PCBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSSUdIVF9TSElGVF9TSUdORUQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QkEwMENEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj4+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJJR0hUX1NISUZUX1VOU0lHTkVEIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkMzMDM4RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+Pj4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTEVTUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZDQzAzQ0MiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPCAgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiR1JFQVRFUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZEOTAwMUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRVNTX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZERDAwNEIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPD0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiR1JFQVRFUl9FUVVBTFMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2RTUwMjlCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj49IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZFQzAyNzMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPT0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZGOTAzOUUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiIT0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiWE9SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzAxMDMyOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJeIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkFORCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcxMjAzNEEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiJiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJPUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcwNDAyRkEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifCAgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09ORElUSU9OQUxfQU5EIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzE2MDA3NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSImJiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT05ESVRJT05BTF9PUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcyNjAyQkQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifHwgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5zdGFuY2VvZiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1N0QzMDNBMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1ODkxMDNBRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTgwNzAyMzQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHZhbHVlIHRvIHRlc3QsIGUuZy4geCBpbiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU4MkEwMjIwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB0ZXN0LCBlLmcuIGphdmEubGFuZy5TdHJpbmcuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTWV0aG9kSW52b2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1OEI2MDE4QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIk1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbiwgZS5nLiB4LmdldFkoMykiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUI5RDAwNjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlY2VpdmVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjBBMDFFQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFdobyB0aGUgbWV0aG9kIGlzIGludm9rZWQgYWdhaW5zdC4gVGhpcyBtYXkgYmUgbm90IHNldCwgd2hpY2ggbWVhbnMgInRoaXMiLiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICJqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjYxMDBEOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcmd1bWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCNjkwMkVEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsaXN0IG9mIGFyZ3VtZW50cywgaWYgYW55LCB0byB0aGUgbWV0aG9kLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1OEVBMDI4MCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyByZXByZXNlbnRzIGEgbmFtZS4gVGhpcyBjYW4gaGFwcGVuIGZvciB0aGUgcmVjZWl2ZXIgb2YgYSBtZXRob2QgaW52b2NhdGlvbiwgZS5nLiB4LmdldFkoKSBvciBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApLiBJbiB0aGVzZSBjYXNlcyB5b3Ugd291bGQgaGF2ZSBhIG5hbWUgb2YgIngiIG9yICJqYXZhLmxhbmcuU3RyaW5nIi4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUJBMTAwREIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwQzExMDQwMUJFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lLCB3aGljaCBjYW4gYmUgYSB0eXBlIG9yIGEgdmFyaWFibGUuIElmIGl0IGlzIGEgdHlwZSwgdGhlbiAgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROdWxsTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkJGMDAyMCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAibnVsbCIKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUJENDAyRjEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTnVtYmVyTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1QzQwMDM1QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Q0VGMDI0NCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG9rZW4iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVDQUEwMjRGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVDRjkwMDdDIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUY0RTAzRTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVGMjIwMTJCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGUgcGFyZW50aGVzaXMsIGUuZy4gKHgrMykgdGhlbiB0aGUgZXhwcmVzc2lvbiBpcyAieCszIgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRQcmVmaXhFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVGQUQwMDhCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBIG9uZSBvcGVyYW5kIG9wZXJhdG9yLCB3aGVyZSB0aGUgb3BlcmF0b3IgY29tZXMgYmVmb3JlIHRoZSBvcGVyYW5kLCBlLmcuIC0gKHgrMykuIEluIEFTVCwgZXZlbiAtMyBpcyBtb2RlbGVkIGFzIGEgUHJlZml4RXhwcmVzc2lvbiBvZiBvcGVyYXRvciAiLSIgYW5kIGV4cHJlc3Npb24gb2YgTnVtYmVyTGl0ZXJhbCgzKS4gQnV0IHdlIG9wdGltaXplIHRoaXMgYXdheSBhbmQganVzdCB1c2UgYSBOdW1iZXJMaXRlcmFsKC0zKSBkaXJlY3RseSBpbnN0ZWFkLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MkRDMDFENyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3BlcmF0b3IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwQkMwMTk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBvcGVyYXRvciBvZiB0aGlzIGV4cHJlc3Npb24uIgotCQkgICAgdHlwZSAgICAgICAJIlBUUHJlZml4T3BlcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYwMjQwMEQyIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwQzUwMDY1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIHRoYXQgdGhlIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUUHJlZml4T3BlcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcHJlZml4IGV4cHJlc3Npb24gb3BlcmF0b3IuIFdlIGFyZSBub3QgbW9kZWxpbmcgKysgYW5kIC0tLiIKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQTFVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDZGMDFCNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIrIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk1JTlVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDcyMDNCOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSItIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTVBMRU1FTlQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNzgwMEFCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIn4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDdEMDE0OCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIhIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFN0cmluZ0xpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjFFMjAwMEIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIGxpdGVyYWwsIGUuZy4gImFzZGYiLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MkQ3MDMzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXNjYXBlZFZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MUZDMDFDQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIGVzY2FwZWQgc3RyaW5nLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gImFiIiBvciAiY1xyIi4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBxdW90ZXMgdGhlbXNlbHZlcy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXRlcmFsVmFsdWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyMEEwMEJEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhY3R1YWwgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUVGhpc0xpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjNBNzAwQ0IiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFJlcHJlc2VudHMgInRoaXMiLCBlLmcuIHRoaXMuZ2V0WCgpIHdpbGwgYmUgYSBNZXRob2RJbnZvY2F0aW9uIHdpdGggdGhlIHJlY2VpdmVyIGJlaW5nIGEgVGhpc0xpdGVyYWwuIFdlIGNhbid0IGhhbmRsZSB0aGUgZm9ybWF0IFhZWi50aGlzIGJlY2F1c2UgdGhhdCBpcyBmb3IgaW5uZXIgY2xhc3NlcyBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IHJpZ2h0IG5vdy4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjQxODAxOUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQ2xhc3MgIlBUVHlwZUxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjQ5NTAxODEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjU0QzAwMDgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY0RDcwMzdCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsLiAgSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbnZhbGlkRXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2NUFGMDIwOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgc29tZSBleHByZXNzaW9uIHdlIGp1c3QgY2FuJ3QgZXZhbHVhdGUgZm9yIG91ciBwdXJwb3Nlcy4gSXQgYWxsb3dzIHVzIHRvIHRlbGwgdGhlIGV2YWx1YXRpb24gd2hhdCBpcyBhY3R1YWxseSB3cm9uZy4gSXQgc2hvdWxkIGJlIHBsYWNlZCBhcyB0aGUgcm9vdCBleHByZXNzaW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBtdWNoIG9mIHRoZSB0cmVlIGFuZCB0aGVuIGZpbmFsbHkgZmFpbC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjZGNTAyNTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY2RTQwMjk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluc3RhbmNlUmVmZXJlbmNlIgotCSAgICBxdWlkICAgICAgIAkiNDAxN0RCMTgwMkIzIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAxN0RCNEEwMzQxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKSkKLQkob2JqZWN0IENsYXNzICJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MzYyN0MxNDAzOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEFuIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbi4gQ3VycmVudGx5IHdlIG9ubHkgc3RvcmUgdGhlIAotfGVudGlyZSBkZWNsYXJhdGlvbiBhcyBhIHN0cmluZywgaW5jbHVkaW5nIHRoZSAibmV3IEFDbGFzcygpIHsuLi59Ii4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MzYyN0Q0RTAwRDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlY2xhcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQzNjI3RDY5MDE0NyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZGVjbGFyYXRpb24gdGV4dC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImltcG9ydHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDM2Mjg5RTUwMzRCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MTAzRDUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcGFyZW50IHdobyBpcyB0byBnaXZlIHVwIHRoZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOTAiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPYmplY3QiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M0RjFDODYwMTIzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbXBsaWNpdEFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDMTQwMjQyIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUREMDAwODgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZmVhdHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgbGl2ZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZlYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTQ4IgotCQkgICAgbGFiZWwgICAgICAJImZlYXR1cmUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTUyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0UwMDFCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJvb3QgZXhwcmVzc2lvbiBvZiB0aGUgcGFyc2UgdHJlZS4gVGhlIHJlc3VsdCBvZiBpdCBpcyB0aGUgYWxsb2NhdGlvbi4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0YwMkU0IgotCQkgICAgbGFiZWwgICAgICAJImV4cHJlc3Npb24iCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzNENGMDJFNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBhcnNlVHJlZUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDOTEwMDA1IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSI0MDE3REJFMzAxMzgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlZmVyZW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAwMDYiCi0JCSAgICBsYWJlbCAgICAgIAkicmVmZXJlbmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAxNjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjNCNzgyRDFCMDM0RiIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBOb3RlVmlldyBAMQotCQkgICAgbG9jYXRpb24gICAJKDc0NywgMTAwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDM0MiwgODU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTc3NQotCQkJbGFiZWwgICAgICAJIlRoaXMgaXMgdXNlZCBhcyB0aGUgRUNsYXNzaWZpZXIgd2hlbiB5b3Ugd2FudCBhIGNvZGUtZ2VuZXJhdGVkIGNsYXNzIHRvIHBvaW50IHRvIGFuIGluc3RhbmNlIG9mIGEgSUphdmFPYmplY3RJbnN0YW5jZSBpbXBsZW1lbnRlci4gKFdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGEgamF2YSBtb2RlbCBqYXZhIG9iamVjdCkuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk4MzUKLQkJICAgIGhlaWdodCAgICAgCTMyMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YURhdGFUeXBlSW5zdGFuY2UiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI2NTksIDY2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDE3NzcsIDYwNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNzY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUphdmFEYXRhVHlwZUluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxNzc3LCA1NTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE3NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEFCMTc4MDJCMSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxNzc3LCA2NjYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTUxMikKLQkJICAgIHdpZHRoICAgICAgCTE3ODIKLQkJICAgIGhlaWdodCAgICAgCTI0MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMwotCQkgICAgbG9jYXRpb24gICAJKDIzNzgsIDEwNTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxOTcwLCA4ODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNwotCQkJbWF4X3dpZHRoICAJNzgwCi0JCQlsYWJlbCAgICAgIAkiVGhpcyBpcyB1c2VkIGFzIHRoZSBFQ2xhc3NpZmllciB3aGVuIHlvdSB3YW50IGEgY29kZS1nZW5lcmF0ZWQgY2xhc3MgdG8gcG9pbnQgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFEYXRhVHlwZUluc3RhbmNlIGltcGxlbWVudGVyLiAoV2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBqYXZhIG1vZGVsIGphdmEgcHJpbWl0aXZlKS4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTg0MAotCQkgICAgaGVpZ2h0ICAgICAJMzQwKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAyCi0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAxNjYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSg4MDQsIDg1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE1NjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YUluc3RhbmNlIikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTm9uZSIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDgwNCwgMTQ2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTEzNDApCi0JCSAgICB3aWR0aCAgICAgIAkxNTc4Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTU4NCwgNDU1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxNTg0LCA0NTUpCi0JCQkoMTU4NCwgMjU5KSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFPYmplY3RJbnN0YW5jZSIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODU4LCA2NjYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDYxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YU9iamVjdEluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDU2NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjc4MkQ3OTAyOTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoNjI3LCA2NzUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTQ1OSkKLQkJICAgIHdpZHRoICAgICAgCTQ4MAotCQkgICAgaGVpZ2h0ICAgICAJMjI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlANwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1N0RBMDNERCIKLQkJICAgIGNsaWVudCAgICAgCUA3Ci0JCSAgICBzdXBwbGllciAgIAlANQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTUsIDU1MikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTUsIDQ1NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1Mjk1NjIwMTRFIgotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2NTksIDU0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjU5LCA0NTUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2KSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkphdmEgQ29uc3RydWN0b3JzIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUU2NkQwMDdGIgotCSAgICB0aXRsZSAgICAgIAkiSmF2YSBDb25zdHJ1Y3RvcnMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIgQDExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDEyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMQotCQkJbG9jYXRpb24gICAJKDkwMiwgNjkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIKLQkJICAgIHdpZHRoICAgICAgCTM2MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkluaXRTdHJpbmdBbGxvY2F0aW9uIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTUzLCA0OTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoMzI5LCA0MTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDQ4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5pdFN0cmluZ0FsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQUY5MDAxRSIKLQkJICAgIHdpZHRoICAgICAgCTQ2NgotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzMjMpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMDczLCAzMjMpCi0JCQkoMTA3MywgMTgzKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVCNzUwMkRBIgotCQkgICAgY2xpZW50ICAgICAJQDEyCi0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA0MDEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY4LCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RU9iamVjdCIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDk0MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSgxNjQ1LCA4OTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjEyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRU9iamVjdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiM0M0RjFDODYwMTIzIgotCQkgICAgd2lkdGggICAgICAJMjMwCi0JCSAgICBoZWlnaHQgICAgIAkxMTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIgQDE2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxNDIsIDkyNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNgotCQkJbG9jYXRpb24gICAJKDE5MTgsIDg4MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFU3RydWN0dXJhbEZlYXR1cmUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIHdpZHRoICAgICAgCTQ2NgotCQkgICAgaGVpZ2h0ICAgICAJMTE3Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkltcGxpY2l0QWxsb2NhdGlvbiIgQDE3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwMTgsIDUxMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCWxvY2F0aW9uICAgCSgxODE5LCA0NTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW1wbGljaXRBbGxvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUMxNDAyNDIiCi0JCSAgICB3aWR0aCAgICAgIAk0MTYKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUM0NzAwRTciCi0JCSAgICBjbGllbnQgICAgIAlAMTcKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDIzLCA0NDYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyMywgMzIzKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTMpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTkKLQkJICAgIGxvY2F0aW9uICAgCSgxODgxLCA3MjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MTAzRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDIwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTYsIDIyOCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxCi0JCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJCWxvY2F0aW9uICAgCSgxNzI3LCA4NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEzNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmVudCIKLQkJCQlwY3REaXN0ICAgIAkwLjk5MTIyNAotCQkJCWhlaWdodCAgICAgCTcyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVENzIwMzkwIgotCQkJICAgIGNsaWVudCAgICAgCUAxOQotCQkJICAgIHN1cHBsaWVyICAgCUAxNQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMgotCQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MSwgNzk0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjMzNzgxNwotCQkJCWhlaWdodCAgICAgCTI2Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTYsIDIyOCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MjAzOUEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE3Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDI0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNzIxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVERDAwMDg4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmZWF0dXJlIiBAMjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkgICAgbG9jYXRpb24gICAJKDkxNSwgMjIxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYKLQkJCQlQYXJlbnRfVmlldyAJQDI1Ci0JCQkJbG9jYXRpb24gICAJKDIwMjgsIDc2NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZmVhdHVyZSIKLQkJCQlwY3REaXN0ICAgIAkwLjE4MTM0NgotCQkJCWhlaWdodCAgICAgCTY0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVERDEwMTQ4IgotCQkJICAgIGNsaWVudCAgICAgCUAyNAotCQkJICAgIHN1cHBsaWVyICAgCUAxNgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNwotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoMjE3MiwgODM5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDI4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJICAgIGxvY2F0aW9uICAgCSg5MTUsIDIyMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMTAxNTIiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE3Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDI5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDc3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJbG9jYXRpb24gICAJKDEwOTUsIDcyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBhcnNlVHJlZUFsbG9jYXRpb24iIEAzMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjY1LCA0OTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMwCi0JCQlsb2NhdGlvbiAgIAkoMTAzMiwgNDQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcnNlVHJlZUFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyQzkxMDAwNSIKLQkJICAgIHdpZHRoICAgICAgCTQ4NAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyQ0I3MDFENiIKLQkJICAgIGNsaWVudCAgICAgCUAzMAotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDQzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY1LCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAzMgotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDYzNSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENFMDAxQiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXhwcmVzc2lvbiIgQDMzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJICAgIGxvY2F0aW9uICAgCSgtMSwgMTQwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQKLQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJbG9jYXRpb24gICAJKDExMTEsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjIwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXhwcmVzc2lvbiIKLQkJCQlwY3REaXN0ICAgIAkwLjQ5MjUzNwotCQkJCWhlaWdodCAgICAgCTE1NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENGMDJFNCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlAMjkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUKLQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJbG9jYXRpb24gICAJKDEzMDcsIDY3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC41NjcxNjQKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEsIDE0MCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzRDRjAyRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBhcnNlIFRyZWUgRXhwcmVzc2lvbnMiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkNDMjAxNDYiCi0JICAgIHRpdGxlICAgICAgCSJQYXJzZSBUcmVlIEV4cHJlc3Npb25zIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMjUKLQkgICAgb3JpZ2luX3kgICAJNTc2OAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDM3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNDgsIDEyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJbG9jYXRpb24gICAJKDExNzksIDczKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUFjY2VzcyIgQDM4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMzUsIDU0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzgKLQkJCWxvY2F0aW9uICAgCSgxODQ4LCA0MTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNzc0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUFjY2VzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJFMTQwMjUwIgotCQkgICAgd2lkdGggICAgICAJNzkyCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUNyZWF0aW9uIiBAMzkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDM0LCA1MTkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQlsb2NhdGlvbiAgIAkoOSwgMzYzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTg1MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlDcmVhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM3MTIwMjVBIgotCQkgICAgd2lkdGggICAgICAJODY4Ci0JCSAgICBoZWlnaHQgICAgIAkzMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUluaXRpYWxpemVyIiBANDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgNTE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJbG9jYXRpb24gICAJKDkyOSwgNDM4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTg2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlJbml0aWFsaXplciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NjgwMTRDIgotCQkgICAgd2lkdGggICAgICAJODgyCi0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRCb29sZWFuTGl0ZXJhbCIgQDQxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDk5NywgODcwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJbG9jYXRpb24gICAJKDcxOSwgNzkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQm9vbGVhbkxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQUU3MDI0NyIKLQkJICAgIHdpZHRoICAgICAgCTU3NAotCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2FzdEV4cHJlc3Npb24iIEA0MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzkxLCA4ODkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQyCi0JCQlsb2NhdGlvbiAgIAkoMTQ3NCwgNzU4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTYzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ2FzdEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQjZGMDA1OCIKLQkJICAgIHdpZHRoICAgICAgCTY1MgotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDMKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ4LCAzMzApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMzQ4LCAzMzApCi0JCQkoMTM0OCwgMTg3KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NzkwMDM4IgotCQkgICAgY2xpZW50ICAgICAJQDQwCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM4MSwgNDI1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzODEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQjFEMDAwMCIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxOCwgNzc4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkxOCwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCRDYwMzA5IgotCQkgICAgY2xpZW50ICAgICAJQDQyCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5MSwgNzQ2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRTZGMDFGNyIKLQkJICAgIGNsaWVudCAgICAgCUAzOAotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMzUsIDQwMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM1LCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEA0OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzcyLCAxMDk1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQlsb2NhdGlvbiAgIAkoMTIwMywgMTA0NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2hhcmFjdGVyTGl0ZXJhbCIgQDQ5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMCwgMTQzOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDkKLQkJCWxvY2F0aW9uICAgCSgxNjQsIDEzMzIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDaGFyYWN0ZXJMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NERGMTAyNzciCi0JCSAgICB3aWR0aCAgICAgIAk1NTAKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzcyMTAwNDkiCi0JCSAgICBjbGllbnQgICAgIAlAMzkKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NjEsIDM1MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIiBANTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NiwgMTQ2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTEKLQkJCWxvY2F0aW9uICAgCSg5MzAsIDEzMzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJODMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0RjQwMDI2RiIKLQkJICAgIHdpZHRoICAgICAgCTg1MAotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTIKLQkJICAgIGxvY2F0aW9uICAgCSgxMzcyLCAxMjYwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTM3MiwgMTI2MCkKLQkJCSgxMzcyLCAxMTU4KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRFMTMwMUVBIgotCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTY0LCAxMzE5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU2NCwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0RjRDMDJGOCIKLQkJICAgIGNsaWVudCAgICAgCUA1MQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjcsIDEzMjApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NywgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiBANTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2OSwgMTQ4MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCWxvY2F0aW9uICAgCSgxODcyLCAxMzI1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTFGQjAyNkEiCi0JCSAgICB3aWR0aCAgICAgIAk2MTIKLQkJICAgIGhlaWdodCAgICAgCTMzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTI3NDAxMkUiCi0JCSAgICBjbGllbnQgICAgIAlANTUKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTY4LCAxMzEzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjgsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEZpZWxkQWNjZXNzIiBANTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNzYxLCAxNzk0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDQ3OSwgMTY2MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEZpZWxkQWNjZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTJERjAyMDQiCi0JCSAgICB3aWR0aCAgICAgIAk1ODIKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTM1RDAyNDEiCi0JCSAgICBjbGllbnQgICAgIAlANTcKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3NjAsIDE2NTEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbmZpeEV4cHJlc3Npb24iIEA1OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzkwLCAxODQ1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJbG9jYXRpb24gICAJKDEyODYsIDE2NjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTAwOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5maXhFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTM4QjAxNDMiCi0JCSAgICB3aWR0aCAgICAgIAkxMDI2Ci0JCSAgICBoZWlnaHQgICAgIAkzODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbmZpeE9wZXJhdG9yIiBANjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY2MCwgMjIwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjAKLQkJCWxvY2F0aW9uICAgCSgyMzQ1LCAxNjk5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5maXhPcGVyYXRvciIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MAotCQkJbG9jYXRpb24gICAJKDIzNDUsIDE2NDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzRTEwMzU5IgotCQkgICAgd2lkdGggICAgICAJNjQ4Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1NTcwMDAzMiIKLQkJICAgIGNsaWVudCAgICAgCUA1OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODksIDE2NTIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4OSwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDYyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNzIsIDI4NTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCWxvY2F0aW9uICAgCSgxMTAzLCAyODAyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnN0YW5jZW9mIiBANjMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzcxLCAzMjU1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJbG9jYXRpb24gICAJKDg1LCAzMTI0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5zdGFuY2VvZiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU3RDMwM0EyIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANjMKLQkJCWxvY2F0aW9uICAgCSg4NSwgMzE4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk0OTMpCi0JCSAgICB3aWR0aCAgICAgIAk1OTAKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE1ldGhvZEludm9jYXRpb24iIEA2NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ2LCAzMjU4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJbG9jYXRpb24gICAJKDg2MCwgMzExNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk3NzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE1ldGhvZEludm9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1OEI2MDE4QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQlsb2NhdGlvbiAgIAkoODYwLCAzMTc4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTcxNSkKLQkJICAgIHdpZHRoICAgICAgCTc5MAotCQkgICAgaGVpZ2h0ICAgICAJMzA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTmFtZSIgQDY1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5NjIsIDMyMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY1Ci0JCQlsb2NhdGlvbiAgIAkoMTgwOSwgMzEyMSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMDcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1OEVBMDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDY1Ci0JCQlsb2NhdGlvbiAgIAkoMTgwOSwgMzE4MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzMDMpCi0JCSAgICB3aWR0aCAgICAgIAkzMjUKLQkJICAgIGhlaWdodCAgICAgCTIwNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTI3MiwgMzA2MSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEyNzIsIDMwNjEpCi0JCQkoMTI3MiwgMjkxNikpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1ODkxMDNBRiIKLQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ3NCwgMzExMikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzQsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUI5RDAwNjciCi0JCSAgICBjbGllbnQgICAgIAlANjQKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjQ1LCAzMTA2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDUsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJBMTAwREIiCi0JCSAgICBjbGllbnQgICAgIAlANjUKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA1LCAzMTEwKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDUsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE51bGxMaXRlcmFsIiBANzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyOCwgMzE5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzAKLQkJCWxvY2F0aW9uICAgCSgyMTcwLCAzMTQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMxNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUTnVsbExpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QkJGMDAyMCIKLQkJICAgIHdpZHRoICAgICAgCTMzNAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QkQ0MDJGMSIKLQkJICAgIGNsaWVudCAgICAgCUA3MAotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyOTcsIDMxMzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5NywgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDcyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNDMsIDM4NjcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCWxvY2F0aW9uICAgCSgxMDc0LCAzODE2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFROdW1iZXJMaXRlcmFsIiBANzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODAyLCAzNTgzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJbG9jYXRpb24gICAJKDYxOSwgMzQ4OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNjcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE51bWJlckxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QzQwMDM1QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDczCi0JCQlsb2NhdGlvbiAgIAkoNjE5LCAzNTUwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTMwMykKLQkJICAgIHdpZHRoICAgICAgCTM4NQotCQkgICAgaGVpZ2h0ICAgICAJMjEwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Q0VGMDI0NCIKLQkJICAgIGNsaWVudCAgICAgCUA3MwotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczMCwgMzQ3OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzAsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIiBANzUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY3OSwgMzYwOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzUKLQkJCWxvY2F0aW9uICAgCSgxMzgxLCAzNTEzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Q0Y5MDA3QyIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoMTM4MSwgMzU3NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NDYpCi0JCSAgICB3aWR0aCAgICAgIAk2MTQKLQkJICAgIGhlaWdodCAgICAgCTIxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUY0RTAzRTEiCi0JCSAgICBjbGllbnQgICAgIAlANzUKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc3LCAzNTAyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFByZWZpeEV4cHJlc3Npb24iIEA3NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDQyMjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQlsb2NhdGlvbiAgIAkoOSwgNDA5MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk2NDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFByZWZpeEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1RkFEMDA4QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQlsb2NhdGlvbiAgIAkoOSwgNDE1MSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1NTMpCi0JCSAgICB3aWR0aCAgICAgIAk2NjAKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFByZWZpeE9wZXJhdG9yIiBANzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMzLCA0NjAyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NDY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUHJlZml4T3BlcmF0b3IiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzgKLQkJCWxvY2F0aW9uICAgCSgzNCwgNDQxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NTI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTM0MykKLQkJICAgIHdpZHRoICAgICAgCTQxNgotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUU3RyaW5nTGl0ZXJhbCIgQDc5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDQxOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQlsb2NhdGlvbiAgIAkoODQ5LCA0MDkyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM1MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUU3RyaW5nTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYxRTIwMDBCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzkKLQkJCWxvY2F0aW9uICAgCSg4NDksIDQxNTMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNDU5KQotCQkgICAgd2lkdGggICAgICAJMzcwCi0JCSAgICBoZWlnaHQgICAgIAkyMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MAotCQkgICAgbG9jYXRpb24gICAJKDEyNDMsIDQwMjApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMjQzLCA0MDIwKQotCQkJKDEyNDMsIDM5MzApKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjJENzAzMzgiCi0JCSAgICBjbGllbnQgICAgIAlANzkKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDA4LCA0MDgxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjJEQzAxRDciCi0JCSAgICBjbGllbnQgICAgIAlANzcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTcsIDQwNzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRUaGlzTGl0ZXJhbCIgQDgzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NTUsIDQxODApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgzCi0JCQlsb2NhdGlvbiAgIAkoMTQ5NCwgNDEyOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFRoaXNMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjNBNzAwQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjQxODAxOUYiCi0JCSAgICBjbGllbnQgICAgIAlAODMKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI3LCA0MTE3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFR5cGVMaXRlcmFsIiBAODUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNDIwMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODUKLQkJCWxvY2F0aW9uICAgCSgyMDkzLCA0MTA2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUVHlwZUxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NDk1MDE4MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDg1Ci0JCQlsb2NhdGlvbiAgIAkoMjA5MywgNDE2NykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkyODEpCi0JCSAgICB3aWR0aCAgICAgIAkzNDUKLQkJICAgIGhlaWdodCAgICAgCTIxNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjU0QzAwMDgiCi0JCSAgICBjbGllbnQgICAgIAlAODUKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTk3LCA0MDkzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEludmFsaWRFeHByZXNzaW9uIiBAODcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NywgNDU0NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCWxvY2F0aW9uICAgCSgxMjc5LCA0NDQ5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM1NwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW52YWxpZEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NUFGMDIwOSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQlsb2NhdGlvbiAgIAkoMTI3OSwgNDUxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzNjgpCi0JCSAgICB3aWR0aCAgICAgIAkzNzUKLQkJICAgIGhlaWdodCAgICAgCTIxNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjZGNTAyNTgiCi0JCSAgICBjbGllbnQgICAgIAlAODcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEzLCA0NDM4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTMsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIiBAODkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMwMSwgNDkxNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODkKLQkJCWxvY2F0aW9uICAgCSgyMTM3LCA0ODg3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhSW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODkKLQkJCWxvY2F0aW9uICAgCSgyMTM3LCA0ODM3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIKLQkJICAgIHdpZHRoICAgICAgCTM0NgotCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5zdGFuY2VSZWZlcmVuY2UiIEA5MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDA1LCA0NTA5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5MAotCQkJbG9jYXRpb24gICAJKDE4MDUsIDQzOTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDAxCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbnN0YW5jZVJlZmVyZW5jZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCMTgwMkIzIgotCQkgICAgd2lkdGggICAgICAJNDE5Ci0JCSAgICBoZWlnaHQgICAgIAkyNTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCNEEwMzQxIgotCQkgICAgY2xpZW50ICAgICAJQDkwCi0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk0MywgNDM4MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQzLCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAOTIKLQkJICAgIGxvY2F0aW9uICAgCSgyMTY1LCA0NzMwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTMwMTM4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2UiIEA5MwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAyNTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NAotCQkJCVBhcmVudF9WaWV3IAlAOTMKLQkJCQlsb2NhdGlvbiAgIAkoMjEyMCwgNDc5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcmVmZXJlbmNlIgotCQkJCXBjdERpc3QgICAgCTAuMjMxOTYwCi0JCQkJaGVpZ2h0ICAgICAJNzcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REJFNjAwMDYiCi0JCQkgICAgY2xpZW50ICAgICAJQDkyCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1Ci0JCQkJUGFyZW50X1ZpZXcgCUA5MwotCQkJCWxvY2F0aW9uICAgCSgyMjcwLCA0NzgzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDk2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MgotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDI1OSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REJFNjAxNjQiCi0JCQkgICAgY2xpZW50ICAgICAJQDkyCi0JCQkgICAgc3VwcGxpZXIgICAJQDkwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIgQDk3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg1MiwgNDU3NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCWxvY2F0aW9uICAgCSg0OTUsIDQ0NzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNzE0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MzYyN0MxNDAzOTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJbG9jYXRpb24gICAJKDQ5NSwgNDUzMikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1MDMpCi0JCSAgICB3aWR0aCAgICAgIAk3MzIKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MzYyN0Q0RTAwRDAiCi0JCSAgICBjbGllbnQgICAgIAlAOTcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzcsIDQ0NTkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjc3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZiOTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvamF2YU1vZGVsLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDg4MTkgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJJREUiCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JICAgIHZhbHVlICAgICAgCSIiKSkKLSAgICBxdWlkICAgICAgIAkiMzlFREZCRTAwM0I0IgotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCVRSVUUKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjYiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEQiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I1IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiMzlFREZCRTAwM0I3IgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW1cXHJvc2VcXGVkb2NqYXZhMi5jYXQiCi0JCXF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEUiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMQotCQkJbG9jYXRpb24gICAJKDc4NCwgNTI4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMCwgNDkzKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiamF2YSIpCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDQ0MykKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkgICAgbmxpbmVzICAgICAJMQotCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIgotCQkJd2lkdGggICAgICAJMzIwCi0JCQloZWlnaHQgICAgIAkxODIpCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDIKLQkJCWxvY2F0aW9uICAgCSgzMDQsIDU0NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJICAgIGxvY2F0aW9uICAgCSgxNjAsIDQ2MCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I3IgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEMiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjgiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUwMDNCQSIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJInJvc2VJZCIKLQkJdmFsdWUgICAgICAJIjc1MzExNzU0MCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjkiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iCi0JCQkJdmFsdWUgICAgICAJMjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk1peGluIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYXNrIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjI1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiCi0JCQkJdmFsdWUgICAgICAJMjI5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBdXRvIgotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiIKLQkJCXZhbHVlICAgICAgCSJUcnVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5IgotCQkJCXZhbHVlICAgICAgCTIzMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ2xlYXJDYXNlIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJInByb2plY3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEQk1TIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNWaWV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIktleUxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JvdyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIgotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTSIKLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCIKLQkJCXZhbHVlICAgICAgCSI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxjaGFyc2V0cy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqY2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcanNzZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxydC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzdW5yc2FzaWduLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcZG5zbnMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsZGFwc2VjLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbG9jYWxlZGF0YS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXHN1bmpjZV9wcm92aWRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcbG9jYWxfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxVU19leHBvcnRfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxkdC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcaHRtbGNvbnZlcnRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcdG9vbHMuamFyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIklCTSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJtXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJzXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUmVxdWlzaXRlUHJvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTb0RBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJlbnVtIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtYXgiCi0JCQkJdmFsdWUgICAgICAJMTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTEwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkia2luZCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGNpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjAiCi0JCQkJdmFsdWUgICAgICAJMjIzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMSIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyIKLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlWYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY29uc3RyYWludHMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpKQotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjkiKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQ5ODlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb250cm9sbGVyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0L2NvbW1vbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+CQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzMjI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWNvbnRyb2xsZXIuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2M3ZjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4OGE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDEyOjUyOjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMzgyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTYXQgSnVuIDAyIDE3OjA2OjI2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmN2MzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMTI6NTI6NDggRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdiNTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5ub3RhdGlvbiBDb250cm9sbGVyIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4NTEwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBjb250cm9sbGVyLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMzBjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEFubm90YXRpb25zIENvbnRyb2xsZXIgaW50ZXJmYWNlIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBlbWl0dGVycyBhbmQgZGV0ZXJtaW5pbmcgYXZhaWxhYmxlCi0gKiB0YWcgc2V0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25zQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgdGFnIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGUgc3BlY2lmaWVkIHRhZwotCSAqIAotCSAqIEBwYXJhbSB0YWdzZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgdGFnc2V0IChlLmcuICJlamIiKQotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0YWdzZXQgaXMgYXZhaWxhYmxlIGFuZCBlbmFibGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYWdIYW5kbGVySW5zdGFsbGVkKFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogRGlzYWJsZXMgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgQW5ub3RhdGVkIEVNRiBPYmplY3QKLQkgKiBAcGFyYW0gdGFnc2V0Ci0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbnMgdGFnc2V0IHRvIGRpc2FibGUgb24gdGhlIG9iamVjdAotCSAqIEByZXR1cm4gYW4gSVN0YXR1cyByZXByZXNlbnRpbmcgc3VjY2VzcyBvciBmYWlsdXJlCi0JICovCi0JcHVibGljIElTdGF0dXMgZGlzYWJsZUFubm90YXRpb25zKEVPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBhbm5vdGF0ZWQgZmlsZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGVsIG9iamVjdCB3YXMgZ2VuZXJhdGVkIHZpYQotCSAqIGFubm90YXRpb25zIGZyb20gYSBwYXJlbnQgcmVzb3VyY2UgYW5kIGlzIGVuYWJsZWQKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxPYmplY3QKLQkgKiAgICAgICAgICAgIFRoZSBBbm5vdGF0ZWQgRU1GIE9iamVjdAotCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCBzb3VyY2UgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1vZGVsT2JqZWN0Ci0JICovCi0JcHVibGljIElGaWxlIGdldEVuYWJsZWRBbm5vdGF0aW9uRmlsZShFT2JqZWN0IG1vZGVsT2JqZWN0KTsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBkdXJpbmcgY3JlYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBmaWxlcyB0b3VjaGVkIGJ5IHRoZSBhbm5vdGF0aW9ucyBwcm9jZXNzaW5nCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nCi0JICovCi0JcHVibGljIElGaWxlW10gcHJvY2VzcyhJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBhcnJheQotCSAqIAotCSAqIEByZXR1cm4gYWxsIGZpbGVzIHRvdWNoZWQgYnkgdGhlIGFubm90YXRpb25zIHByb2Nlc3NpbmcKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcKLQkgKi8KLQlwdWJsaWMgSUZpbGVbXSBwcm9jZXNzKElSZXNvdXJjZVtdIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gZGlzcG9zZSBhbmQgY2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM1ZDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuSUFubm90YXRpb25zUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyIElOU1RBTkNFID0gbmV3IEFubm90YXRpb25zQ29udHJvbGxlckhlbHBlcigpOwotCi0JcHJvdGVjdGVkIEFubm90YXRpb25zQ29udHJvbGxlckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdCB0aGUgYW5ub3RhdGVkIG1vZGVsIG9iamVjdAotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBvYmplY3QgaGFzIGFubm90YXRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0ZWQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZU9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCkgIT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlMaXN0IGFubm90YXRpb25zUHJvdmlkZXJzID0gQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNQcm92aWRlcnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFubm90YXRpb25zUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJQW5ub3RhdGlvbnNQcm92aWRlciBwcm92aWRlciA9IChJQW5ub3RhdGlvbnNQcm92aWRlcikgYW5ub3RhdGlvbnNQcm92aWRlcnMuZ2V0KGkpOwotCQkJaWYgKHByb3ZpZGVyIT1udWxsICYmIHByb3ZpZGVyLmlzQW5ub3RhdGVkKGVPYmplY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byB0YWcgYSBtb2RlbCBvYmplY3QgYXMgYW5ub3RhdGVkCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byB0YWcgYSBtb2RlbCBvYmplY3QgYXMgYW5ub3RhdGVkIEFubm90YXRpb25zIEFkYXB0ZXJzIGNhbiBob2xkIGV4dHJhCi0JICogaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBBIFN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25zKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIuYWRkQW5ub3RhdGlvbnMoZU9iamVjdCwgbmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRvIHRhZyBhIG1vZGVsIG9iamVjdCBhcyBhbm5vdGF0ZWQgQW5ub3RhdGlvbnMgQWRhcHRlcnMgY2FuIGhvbGQgZXh0cmEKLQkgKiBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBBIHN0cmluZyBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIEEgU3RyaW5nIHZhbHVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBbm5vdGF0aW9ucyhFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZU9iamVjdCwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWNxdWlyZXMgdGhlIGdlbmVyYXRlZCBhbm5vdGF0aW9uIGNvbW1lbnQgYW5kIHBhcnNlcyB0aGUgRnJhZ21lbnQgVVJMIG9mIHRoZSBmb2xsb3dpbmcgZm9ybQotCSAqIHRvIHJldHVybiB0aGUgdGFnc2V0IG5hbWU6Ci0JICogCi0JICogY29tLmFjbWUuZWpicy5NeUVKQiMgPHRhZ3NldD4vIDxmcmFnbWVudD4uIDxmcmFnbWVudC1wb2ludGVyPgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgYW5ub3RhdGVkIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIDx0YWdzZXQ+aW4gdGhlIFVSTCBleGFtcGxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdzZXQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyB0YWdzZXQgPSBnZXRUYWdzZXRGcm9tUHJvdmlkZXJzKGVPYmplY3QpOwotCQlpZiAodGFnc2V0ID09IG51bGwpIHsKLQkJCXRhZ3NldCA9IGdldFRhZ3NldEZyb21GcmFnbWVudChlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gdGFnc2V0OwotCX0KLQkKLQkvKioKLQkgKiBBY3F1aXJlcyB0aGUgZ2VuZXJhdGVkIGFubm90YXRpb24gY29tbWVudCBhbmQgcGFyc2VzIHRoZSBGcmFnbWVudCBVUkwgb2YgdGhlIGZvbGxvd2luZyBmb3JtCi0JICogdG8gcmV0dXJuIHRoZSB0YWdzZXQgbmFtZToKLQkgKiAKLQkgKiBjb20uYWNtZS5lamJzLk15RUpCIyA8dGFnc2V0Pi8gPGZyYWdtZW50Pi4gPGZyYWdtZW50LXBvaW50ZXI+Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIFRoZSBhbm5vdGF0ZWQgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgPHRhZ3NldD5pbiB0aGUgVVJMIGV4YW1wbGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdzZXRGcm9tRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0KLQkJU3RyaW5nIGdlbmVyYXRlZENvbW1lbnQgPSAoU3RyaW5nKSBBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZU9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCk7Ci0JCWlmIChnZW5lcmF0ZWRDb21tZW50ID09IG51bGwgfHwgZ2VuZXJhdGVkQ29tbWVudC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBwb3VuZGl0ID0gZ2VuZXJhdGVkQ29tbWVudC5pbmRleE9mKCcjJyk7Ci0JCWludCBzbGFzaCA9IGdlbmVyYXRlZENvbW1lbnQuaW5kZXhPZignLycpOwotCQlpZiAocG91bmRpdCA8IDAgfHwgc2xhc2ggPCAwIHx8IHBvdW5kaXQgPj0gc2xhc2gpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdlbmVyYXRlZENvbW1lbnQuc3Vic3RyaW5nKHBvdW5kaXQgKyAxLCBzbGFzaCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogRGV0ZWN0IHRoZSBwcmltYXJ5IHRhZ3NldCB1c2VkIHRvIGNyZWF0ZSBhbiBlT2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICogQHBhcmFtIGVPYmplY3QgLSBBbiB7QGxpbmsgRU9iamVjdH0gdGhhdCBtYXkgYmUgYW5ub3RhdGVkLgotCSAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkgb2YgdGhlIHVzZWQgdGFnc2V0IG5hbWVzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFRhZ3NldEZyb21Qcm92aWRlcnMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyB0YWdzZXQgPSBudWxsOwotCQlMaXN0IGFubm90YXRpb25Qcm92aWRlcnMgPSBBbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlci5JTlNUQU5DRS5nZXRBbm5vdGF0aW9uc1Byb3ZpZGVycygpOwotCQlpbnQgc2l6ZSA9IGFubm90YXRpb25Qcm92aWRlcnMuc2l6ZSgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBzaXplICYmIHRhZ3NldCA9PSBudWxsOyBpKyspIHsKLQkJCUlBbm5vdGF0aW9uc1Byb3ZpZGVyIHByb3ZpZGVyID0gKElBbm5vdGF0aW9uc1Byb3ZpZGVyKSBhbm5vdGF0aW9uUHJvdmlkZXJzLmdldChpKTsKLQkJCXRhZ3NldCA9IHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRQcmltYXJ5VGFnc2V0KGVPYmplY3QpIDogbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENvbXBpbGF0aW9uVW5pdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1vZGVsIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICBhbiBBbm5vdGF0ZWQgbW9kZWwgT2JqZWN0Ci0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdCB3aGljaCB3YXMgcmVzcG9uc2libGUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRBbm5vdGF0ZWRDVShFT2JqZWN0IGVPYmplY3QpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEFubm90YXRlZENVRnJvbVByb3ZpZGVyKGVPYmplY3QpOwotCQlpZiAoY3UgPT0gbnVsbCkgewotCQkJY3UgPSBnZXRBbm5vdGF0ZWRDVUZyb21GcmFnbWVudChlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gY3U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIENvbXBpbGF0aW9uVW5pdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1vZGVsIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICBhbiBBbm5vdGF0ZWQgbW9kZWwgT2JqZWN0Ci0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdCB3aGljaCB3YXMgcmVzcG9uc2libGUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QKLQkgKi8KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0QW5ub3RhdGVkQ1VGcm9tRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyBmcmFnbWVudFN0cmluZyA9IChTdHJpbmcpIEFubm90YXRpb25zQWRhcHRlci5nZXRBbm5vdGF0aW9ucyhlT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQkJaWYgKGZyYWdtZW50U3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHlwZVN0cmluZyA9IGZyYWdtZW50U3RyaW5nOwotCQlpZiAoZnJhZ21lbnRTdHJpbmcuaW5kZXhPZignIycpPjApCi0JCQl0eXBlU3RyaW5nID0gZnJhZ21lbnRTdHJpbmcuc3Vic3RyaW5nKDAsIGZyYWdtZW50U3RyaW5nLmluZGV4T2YoJyMnKSk7Ci0JCUlUeXBlIGl0eXBlOwotCi0JCWlmICh0eXBlU3RyaW5nICE9IG51bGwgJiYgKGl0eXBlID0gZmluZFR5cGUodHlwZVN0cmluZywgZU9iamVjdCkpICE9IG51bGwpIHsKLQkJCXJldHVybiBpdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTmVlZCB0byBkZWxlZ2F0ZSB0aGUgcmV0cmlldmFsIG9mIHRoZSBhbm5vdGF0ZWQge0BsaW5rIElDb21waWxhdGlvblVuaXR9IGZvcgotCSAqIHRoZSBwYXNzZWQgZU9iamVjdC4gIFRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGJ1dCBpbiB0aGlzIGNhc2UgdGhlIGZpcnN0IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogPHA+Ci0JICogVGhpcyBBUEkgd291bGQgbmVlZCB0byBiZSByZXZpc2l0ZWQgaW4gdGhlIGZ1dHVyZSBpZiB0aGVyZSBpcyBhIHJlcXVpcmVtZW50IHRvIHNob3cKLQkgKiBhbGwge0BsaW5rIElDb21waWxhdGlvblVuaXR9IGVsZW1lbnRzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgZU9iamVjdCB2aWEgYW5ub3RhdGlvbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0IC0gYW4gaW5zdGFuY2Ugb2YgYW4ge0BsaW5rIEVPYmplY3R9IHRoYXQgbWF5IGJlIGFubm90YXRlZC4KLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0QW5ub3RhdGVkQ1VGcm9tUHJvdmlkZXIoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgcHJpbWFyeUNVID0gbnVsbDsKLQkJTGlzdCBhbm5vdGF0aW9uUHJvdmlkZXJzID0gQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNQcm92aWRlcnMoKTsKLQkJaW50IHNpemUgPSBhbm5vdGF0aW9uUHJvdmlkZXJzLnNpemUoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc2l6ZSAmJiBwcmltYXJ5Q1UgPT0gbnVsbDsgaSsrKSB7Ci0JCQlJQW5ub3RhdGlvbnNQcm92aWRlciBwcm92aWRlciA9IChJQW5ub3RhdGlvbnNQcm92aWRlcikgYW5ub3RhdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQlwcmltYXJ5Q1UgPSBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0UHJpbWFyeUFubm90YXRlZENvbXBpbGF0aW9uVW5pdChlT2JqZWN0KSA6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlDVTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHR5cGUsIEVPYmplY3QgZU9iamVjdCkgewotCQlJVHlwZSByZXN1bHQgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmplY3QpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gamF2YVByb2plY3QuZmluZFR5cGUodHlwZSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBoYXMgYW5ub3RhdGlvbiBzdXBwb3J0IGVuYWJsZWQgb24gaXQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb25TdXBwb3J0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuaGFzQW5ub3RhdGlvbnNCdWlsZGVyKHByb2plY3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLQotCi0vKioKLSAqIEFubm90YXRpb25zQ29udHJvbGxlclJlZ2lzdHJ5IGZvciByZWFkaW5nIGFubm90YXRpb25zIGNvbnRyb2xsZXIgZXh0ZW5zaW9ucwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIoKTsKLQkKLQlzdGF0aWMgewotCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldCBkZXNjcmlwdG9yczsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zQ29udHJvbGxlcnM7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3IgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05TX0NPTlRST0xMRVIgPSAiYW5ub3RhdGlvbnNDb250cm9sbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSAiYnVpbGRlcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIElEOwotCQlwcml2YXRlIFN0cmluZyBidWlsZGVySUQ7Ci0JCXByaXZhdGUgZmluYWwgaW50IGxvYWRPcmRlcjsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IGxvYWRPcmRlckNvdW50ZXIgPSAwOwotCi0JCXB1YmxpYyBEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlnRWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCUFzc2VydC5pc0xlZ2FsKEFOTk9UQVRJT05TX0NPTlRST0xMRVIuZXF1YWxzKGFDb25maWdFbGVtZW50LmdldE5hbWUoKSksIEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyX0VSUk9SXzApOwotCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQkJSUQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJYnVpbGRlcklEID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQlVJTERFUl9JRCk7Ci0JCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZSNnZXRJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkJcmV0dXJuIElEOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEJ1aWxkZXJJRCgpIHsKLQkJCXJldHVybiBidWlsZGVySUQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZSNnZXRMb2FkT3JkZXIoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCQlyZXR1cm4gbG9hZE9yZGVyOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb25zQ29udHJvbGxlciBjcmVhdGVJbnN0YW5jZSgpIHsKLQkJCUFubm90YXRpb25zQ29udHJvbGxlciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKEFubm90YXRpb25zQ29udHJvbGxlcikgY29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlcigpIHsKLQkJc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIsICJhbm5vdGF0aW9uc0NvbnRyb2xsZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogcmVhZCBleHRlbnNpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERlc2NyaXB0b3IuQU5OT1RBVElPTlNfQ09OVFJPTExFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWFkZEFubm90YXRpb25Db250cm9sbGVyKG5ldyBEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uQ29udHJvbGxlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihkZXNjcmlwdG9yLmdldElEKCksIG51bGwpLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0RGVzY3JpcHRvcnMoKS5hZGQoZGVzY3JpcHRvcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uQ29udHJvbGxlcnMuCi0JICovCi0JcHJvdGVjdGVkIFNvcnRlZFNldCBnZXREZXNjcmlwdG9ycygpIHsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0JCQlkZXNjcmlwdG9ycyA9IG5ldyBUcmVlU2V0KElkZW50aWZpYWJsZUNvbXBhcmF0b3IuZ2V0SW5zdGFuY2UoKSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihkZXNjcmlwdG9yLmdldElEKCksIHByb2plY3QpOwotCQkJaWYgKGlkZW50aWZpZXIuaXNFbmFibGVkKCkpCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFueSBhbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlBbm5vdGF0aW9uc1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3JzKCkuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyI2lkZW50aWZpZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoRW5hYmxlbWVudElkZW50aWZpZXIpIGlkZW50aWZpZXJFdmVudC5nZXRJZGVudGlmaWVyKCkpLmdldFByb2plY3QoKTsKLQkJZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVycygpLnJlbW92ZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb25zIGNvbnRyb2xsZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQW5ub3RhdGlvbnNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQW5ub3RhdGlvbnNDb250cm9sbGVyKSBnZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXJzKCkuZ2V0KHByb2plY3QpOwotCQlpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoIWhhc0Fubm90YXRpb25zQnVpbGRlcihwcm9qZWN0KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IocHJvamVjdCk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCWdldEFubm90YXRpb25zQ29udHJvbGxlcnMoKS5wdXQocHJvamVjdCwgKGNvbnRyb2xsZXIgPSBkZXNjcmlwdG9yLmNyZWF0ZUluc3RhbmNlKCkpKTsKLQkJfQotCi0JCXJldHVybiBjb250cm9sbGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbkNvbnRyb2xsZXJzLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVycygpIHsKLQkJaWYgKGFubm90YXRpb25zQ29udHJvbGxlcnMgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zQ29udHJvbGxlcnMgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zQ29udHJvbGxlcnM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb25zQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCURlc2NyaXB0b3IgYW5ub3RhdGlvbnNEZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihwcm9qZWN0KTsKLQkJaWYgKGFubm90YXRpb25zRGVzY3JpcHRvcj09bnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGhhc0J1aWxkZXIocHJvamVjdCwgYW5ub3RhdGlvbnNEZXNjcmlwdG9yLmdldEJ1aWxkZXJJRCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyTmFtZSkgewotCQl0cnkgewotCQkJSUNvbW1hbmRbXSBidWlsZGVycyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRCdWlsZFNwZWMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29tbWFuZCBidWlsZGVyID0gYnVpbGRlcnNbaV07Ci0JCQkJaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoYnVpbGRlci5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVyTmFtZSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyMjA5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIEFubm90YXRpb25UYWdSZWdpc3RyeQotICogd2hlbiBpdCBpcyB0aW1lIHRvIHJlZ2lzdGVyIHRoZSB0YWdzIGZvciBhIGdpdmVuCi0gKiBUYWdTZXQuICBBbiBBbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIGRlZmluZWQKLSAqIHVzaW5nIHRoZSBhbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLgotICogCi0gKiBAc2VlIGNvbS5pYm0ud3RwLmFubm90YXRpb25zLnJlZ2lzdHJ5LkFubm90YXRpb25UYWdSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIgewotCXZvaWQgcmVnaXN0ZXJUYWdzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDlkN2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBrZWxsZXlwCi0gKiAKLSAqIFNpbmdsZXRvbiB0aGF0IHBhcnNlcyB0aGUgYW5ub3RhdGlvbiB0YWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgYW5ub3RhdGlvbi10YWdoYW5kbGVyIGV4dGVuc2lvbgotICogcG9pbnQsIGFuZCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBpdCBmb3Igb3RoZXIgY2xhc3Nlcy4gTGFyZ2VseSB0YWtlbiBmcm9tIHRoZQotICogQW5ub3RhdGlvblByb2Nlc3NvciBidWlsZGVyLgotICovCi0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVGFnUmVnaXN0cnkgewotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgb25jZSB3ZSd2ZSByZWFkIGluIHRoZSBhbm5vdGF0aW9uIHRhZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwbHVnaW4gcmVnaXN0cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1RBR19JTkZPID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uVGFnSW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3Qgb2YgdGFnIHNwZWNzIGZvciBhbGwgb2YgdGhlIHRhZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGFsbFRhZ1NwZWNzID0gbmV3IEFycmF5TGlzdCgpIHsKLQkJZmluYWwgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODY4MzQ1MjU4MTEyMjg5MjE5MEw7Ci0KLQkJcHJpdmF0ZSB2b2lkIHNjb3BlQWxsKENvbGxlY3Rpb24gYywgYm9vbGVhbiBmb3JBZGQpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBjLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlUYWdTcGVjIHRzID0gKFRhZ1NwZWMpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChmb3JBZGQpCi0JCQkJCWFkZFNjb3BlKHRzKTsKLQkJCQllbHNlCi0JCQkJCXJlbW92ZVNjb3BlKHRzKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRTY29wZShUYWdTcGVjIHRzKSB7Ci0JCQlpZiAodHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlzd2l0Y2ggKHRzLmdldFNjb3BlKCkpIHsKLQkJCQljYXNlIFRhZ1NwZWMuRklFTEQgOgotCQkJCQlmaWVsZFRhZ3MucHV0KHRzLmdldFRhZ05hbWUoKSwgdHMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ1NwZWMuTUVUSE9EIDoKLQkJCQkJbWV0aG9kVGFncy5wdXQodHMuZ2V0VGFnTmFtZSgpLCB0cyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5UWVBFIDoKLQkJCQkJdHlwZVRhZ3MucHV0KHRzLmdldFRhZ05hbWUoKSwgdHMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZW1vdmVTY29wZShUYWdTcGVjIHRzKSB7Ci0JCQlpZiAodHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlzd2l0Y2ggKHRzLmdldFNjb3BlKCkpIHsKLQkJCQljYXNlIFRhZ1NwZWMuRklFTEQgOgotCQkJCQlmaWVsZFRhZ3MucmVtb3ZlKHRzLmdldFRhZ05hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5NRVRIT0QgOgotCQkJCQltZXRob2RUYWdzLnJlbW92ZSh0cy5nZXRUYWdOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ1NwZWMuVFlQRSA6Ci0JCQkJCXR5cGVUYWdzLnJlbW92ZSh0cy5nZXRUYWdOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlzdXBlci5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJYWRkU2NvcGUoKFRhZ1NwZWMpZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLQkJCVRhZ1NwZWMgbmV3VGFnU3BlYyA9IChUYWdTcGVjKW87Ci0JCQkvLyBzZWFyY2ggZm9yIGFscmVhZHkgZXhpc3RpbmcgdGFnIHNwZWMgd2l0aCBzYW1lIG5hbWUgYW5kIHNhbWUgdGFnIHNldCBuYW1lCi0JCQlmb3IgKGludCBpPTA7IGk8dGhpcy5zaXplKCk7IGkrKykgewotCQkJCVRhZ1NwZWMgdGFnU3BlYyA9IChUYWdTcGVjKSBnZXQoaSk7Ci0JCQkJaWYgKHRhZ1NwZWMuZ2V0VGFnTmFtZSgpLmVxdWFscyhuZXdUYWdTcGVjLmdldFRhZ05hbWUoKSkgJiYgdGFnU3BlYy5nZXRTY29wZSgpID09IG5ld1RhZ1NwZWMuZ2V0U2NvcGUoKSkgewotCQkJCQlyZW1vdmUodGFnU3BlYyk7Ci0JCQkJCXJlbW92ZVNjb3BlKHRhZ1NwZWMpOwotCQkJCX0JCi0JCQl9Ci0JCQkvLyBhZGQgdGhlIG5ldyB0YWcgc3BlYwotCQkJYWRkU2NvcGUobmV3VGFnU3BlYyk7Ci0JCQlyZXR1cm4gc3VwZXIuYWRkKG5ld1RhZ1NwZWMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotCQkJc2NvcGVBbGwoYywgdHJ1ZSk7Ci0JCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7Ci0JCQlzY29wZUFsbChjLCB0cnVlKTsKLQkJCXJldHVybiBzdXBlci5hZGRBbGwoaW5kZXgsIGMpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCXJlbW92ZVNjb3BlKChUYWdTcGVjKSByZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQkJcmVtb3ZlU2NvcGUoKFRhZ1NwZWMpIG8pOwotCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShvKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGMpIHsKLQkJCXNjb3BlQWxsKGMsIGZhbHNlKTsKLQkJCXJldHVybiBzdXBlci5yZW1vdmVBbGwoYyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gdGhpcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJVGFnU3BlYyB0cyA9IChUYWdTcGVjKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWMuY29udGFpbnModHMpKQotCQkJCQlyZW1vdmVTY29wZSh0cyk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIucmV0YWluQWxsKGMpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIE1hcCBmcm9tIGEgdGFnIG5hbWUgdG8gYSBJbml0VGFnSW5mby4gT25seSBsaXZlIGR1cmluZyB1cCB0byB0aGUgZW5kIG9mIHRoZSBpbml0KCkgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB0YWdBdHRyaWJzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogRGl2aXNpb24gb2YgdGFnIG5hbWVzIGJldHdlZW4gYWxsb3dlZCBzY29wZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1ldGhvZFRhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHR5cGVUYWdzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBmaWVsZFRhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19QUk9QID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0lOSVRJQUxJWkVSX0VYX1BUID0gImFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05TX0NPTlRST0xMRVJfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEhlbHBlciBmb3IgaW5pdCwgcGFyc2UgdGhlIHRhZyBhdHRyaWJ1dGVzIGZvciBhIEFubm90YXRpb25UYWdJbmZvIHRhZy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbXMKLQkgKiAgICAgICAgICAgIEFycmF5IG9mICJhdHRyaWIiIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIExvd2VyY2FzZWQgbmFtZSBvZiB0aGUgdGFnIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbml0VGFnSW5mbyBwYXJzZVRhZ0F0dHJpYnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbXMsIFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgc2NvcGUpIHsKLQkJaW50IGk7Ci0JCUFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUluaXRUYWdJbmZvIHRhZ0luZiA9IG5ldyBJbml0VGFnSW5mbyh0YWdOYW1lLCBzY29wZSwgYXR0cmliTGlzdCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGVsZW1zW2ldOwotCi0JCQlpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYXR0cmliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVRhZ0F0dHJpYlNwZWMgdGFzID0gbmV3IFRhZ0F0dHJpYlNwZWMoZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZWxlbS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgdXNlID0gZWxlbS5nZXRBdHRyaWJ1dGUoInVzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl0YXMuc2V0VHlwZShlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJLy8gYWRkIHZhbGlkIHZhbHVlcwotCQkJCWlmICgiZW51bSIuZXF1YWxzKGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB2YWxpZFZhbHVlcyA9IGVsZW0uZ2V0Q2hpbGRyZW4oImVudW1WYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlMaXN0IHZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCVN0cmluZyB2YWx1ZSA9IHZhbGlkVmFsdWVzW2pdLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWVzTGlzdC5hZGQodmFsdWUpOwotCQkJCQl9Ci0JCQkJCVN0cmluZ1tdIHZhbGlkVmFsdWVzQXJyYXkgPSBuZXcgU3RyaW5nW3ZhbHVlc0xpc3Quc2l6ZSgpXTsKLQkJCQkJdmFsaWRWYWx1ZXNBcnJheSA9IChTdHJpbmdbXSkgdmFsdWVzTGlzdC50b0FycmF5KHZhbGlkVmFsdWVzQXJyYXkpOwotCi0JCQkJCXRhcy5zZXRWYWxpZFZhbHVlcyh2YWxpZFZhbHVlc0FycmF5KTsKLQkJCQl9Ci0KLQkJCQlpZiAodXNlID09IG51bGwpIHsKLQkJCQkJdGFzLmNsZWFyUmVxdWlyZWQoKTsKLQkJCQl9IGVsc2UgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKCJyZXF1aXJlZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFzLnNldFJlcXVpcmVkKCk7Ci0JCQkJfSBlbHNlIGlmICh1c2UuZXF1YWxzSWdub3JlQ2FzZSgib3B0aW9uYWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRhcy5jbGVhclJlcXVpcmVkKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVW5saWtlbHksIHVubGVzcyBhbm5vdGF0aW9uIGV4dGVuc2lvbiBzcGVjIGNoYW5nZXMKLQkJCQkJLy8gd2l0aG91dCBjaGFuZ2VzIGhlcmUuCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzkgKyB1c2UpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtVW5pcXVlQXJyYXkgPSBlbGVtLmdldENoaWxkcmVuKCJ1bmlxdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlbGVtVW5pcXVlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQl0YXMuc2V0VW5pcXVlKCk7Ci0JCQkJCWlmIChlbGVtVW5pcXVlQXJyYXlbMF0uZ2V0QXR0cmlidXRlKCJzY29wZSIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRhcy5nZXRVbmlxdWUoKS5zZXRTY29wZShUYWdBdHRyaWJTcGVjLnVuaXF1ZVNjb3BlRnJvbVN0cmluZyhlbGVtVW5pcXVlQXJyYXlbMF0uZ2V0QXR0cmlidXRlKCJzY29wZSIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGVsZW1VbmlxdWVBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLlRhZ0F0dHJpYlNwZWNfMiArIGVsZW1VbmlxdWVBcnJheS5sZW5ndGgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGFzLmNsZWFyVW5pcXVlKCk7Ci0JCQkJfQotCi0JCQkJYXR0cmliTGlzdC5hZGQodGFzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnSW5mOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFnIHNldCBuYW1lIGZyb20gYSBmdWxsIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBGdWxsIHRhZyBuYW1lICh3aXRob3V0IHRoZSAnQCcgYXQgdGhlIGJlZ2lubmluZykKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFnU2V0RnJvbVRhZ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCi0JCWlmIChpZHggIT0gLTEpCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIGZyb20gYSBmdWxsIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBGdWxsIHRhZyBuYW1lICh3aXRob3V0IHRoZSAnQCcgYXQgdGhlIGJlZ2lubmluZykKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFnRnJvbVRhZ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaWR4ID0gbmFtZS5pbmRleE9mKCcuJyk7Ci0KLQkJaWYgKGlkeCAhPSAtMSkgewotCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGlkeCArIDEpOwotCQl9Ci0JCS8vIERlZmF1bHQgdG8gdGhlIHdob2xlIG5hbWUgYmVpbmcgdGhlIHRhZ3NldC4KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgaW4gYWxsIG9mIHRoZSB0YWcgYXR0cmlidXRlIGluZm9ybWF0aW9uIGZyb20gYWxsIGFubm90YXRpb24tdGFnLWluZm8gZXh0ZW5zaW9ucyBkZWZpbmVkCi0JICogaW4gdGhlIHN5c3RlbSwgYW5kIGluaXRpYWxpemVzIHRoZSB0YWdBdHRyaWJzIGhhc2h0YWJsZSB3aXRoIHRoZW0uCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkQWxsQXR0cmlidXRlSW5mbyhJRXh0ZW5zaW9uUG9pbnQgeHApIHsKLQotCQlpZiAoeHAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUV4dGVuc2lvbltdIGV4dHMgPSB4cC5nZXRFeHRlbnNpb25zKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1zID0gZXh0c1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShleHRzW2ldLmdldE5hbWVzcGFjZSgpKTsKLQkJCVN0cmluZyBpZGVudGlmaWVyID0gZXh0c1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gbnVsbDsKLQkJCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJCVN0cmluZyBzY29wZSA9IG51bGw7Ci0JCQlTdHJpbmcgdGFnU2V0ID0gbnVsbDsKLQkJCVN0cmluZyBmdWxsVGFnTmFtZSA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJZWxlbSA9IGVsZW1zW2pdOwotCQkJCWlmICghZWxlbS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiQW5ub3RhdGlvblRhZ0luZm8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0YWdTZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSgidGFnU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0YWdOYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoInRhZ05hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNjb3BlID0gZWxlbS5nZXRBdHRyaWJ1dGUoInNjb3BlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaXNOdWxsT3JFbXB0eSh0YWdTZXQpIHx8IGlzTnVsbE9yRW1wdHkodGFnTmFtZSkgfHwgaXNOdWxsT3JFbXB0eShzY29wZSkpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhOTFMuYmluZChBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzEwLCBuZXcgT2JqZWN0W117aWRlbnRpZmllcn0pKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZ1bGxUYWdOYW1lID0gdGFnU2V0ICsgIi4iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJSW5pdFRhZ0luZm8gdGFnSW5mID0gcGFyc2VUYWdBdHRyaWJzKGVsZW0uZ2V0Q2hpbGRyZW4oKSwgZnVsbFRhZ05hbWUudG9Mb3dlckNhc2UoKSwgc2NvcGUpOwotCQkJCVN0cmluZyBrZXkgPSAoZnVsbFRhZ05hbWUgKyAiIyIgKyBzY29wZSkudG9Mb3dlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8qCi0JCQkJICogVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgQW5ub3RhdGlvblRhZ0luZm8gdGFnIGZvciBhbnkgb25lIGFubm90YXRpb24gdGFnLgotCQkJCSAqLwotCQkJCWlmICh0YWdBdHRyaWJzLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzAgKyB0YWdOYW1lICsgIicuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQl0YWdJbmYuYnVuZGxlID0gYnVuZGxlOwotCQkJCQl0YWdBdHRyaWJzLnB1dChrZXksIHRhZ0luZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRhZ1NwZWMgaW5mb3JtYXRpb24gaW4gZnJvbSB0aGUgcGx1Z2luIHJlZ2lzdHJ5LiBUYWtlbiBmcm9tIEFubm90YXRpb25Qcm9jZXNzb3IuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyByZWFkaW5nIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYy8qIHN5bmNocm9uaXplZCAqL2Jvb2xlYW4gaW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkgLyogUHJldmVudCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbiAqLwotICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgICBpbml0aWFsaXplU3RhdGljVGFnRGVmaW5pdGlvbnMoKTsKLSAgICAgIGluaXRpYWl6ZUR5bmFtaWNUYWdEZWZpbml0aW9ucygpOwotICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgICAgIC8qIERvbid0IG5lZWQgdGhpcyBhbnltb3JlICovCi0gICAgICAgdGFnQXR0cmlicyA9IG51bGw7Ci0KLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgIH0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVTdGF0aWNUYWdEZWZpbml0aW9ucygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQotCQkvLyBUT0RPOiBOb3QgZXZlbiBjaGVja2luZyB0aGUgdGFnc2V0IGV4dGVuc2lvbiBwb2ludCB5ZXQuCi0JCUlFeHRlbnNpb25Qb2ludCB4cCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEFOTk9UQVRJT05fVEFHX0lORk8pOwotCi0gICAgICAgIGlmICh4cCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElFeHRlbnNpb25bXSB4ID0geHAuZ2V0RXh0ZW5zaW9ucygpOwotCi0gICAgICAgIC8qIEdldCBhbGwgdGFnIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiAqLwotICAgICAgICByZWFkQWxsQXR0cmlidXRlSW5mbyh4cCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgeC5sZW5ndGg7IGorKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGFnU3BlY3MgPSB4W2pdLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdTcGVjcy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCB0YWdTcGVjID0gdGFnU3BlY3NbaV07Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSB0YWdTcGVjLmdldEF0dHJpYnV0ZSgidGFnU2V0IikgKyAiLiIgKyB0YWdTcGVjLmdldEF0dHJpYnV0ZSgidGFnTmFtZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCVN0cmluZyBzY29wZSA9IHRhZ1NwZWMuZ2V0QXR0cmlidXRlKCJzY29wZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG11bHRpcGxpY2l0eSA9IHRhZ1NwZWMuZ2V0QXR0cmlidXRlKCJtdWx0aXBsaWNpdHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVRhZ1NwZWMgdHMgPSBudWxsOwotCQkJCWlmIChtdWx0aXBsaWNpdHkgIT0gbnVsbCkKLQkJCQkJdHMgPSBuZXcgVGFnU3BlYyh0YWdOYW1lLCBUYWdTcGVjLnNjb3BlRnJvbVN0cmluZyhzY29wZSksIFRhZ1NwZWMubXVsdGlwbGljaXR5RnJvbVN0cmluZyhtdWx0aXBsaWNpdHkpKTsKLQkJCQllbHNlCi0JCQkJCXRzID0gbmV3IFRhZ1NwZWModGFnTmFtZSwgVGFnU3BlYy5zY29wZUZyb21TdHJpbmcoc2NvcGUpLCBUYWdTcGVjLk11bHRpcGxpY2l0eS5PTkUpOwotCQkJCVN0cmluZyBrZXkgPSAodGFnTmFtZSArICIjIiArIHNjb3BlKS50b0xvd2VyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJSW5pdFRhZ0luZm8gdGFnSW5mID0gKEluaXRUYWdJbmZvKSB0YWdBdHRyaWJzLmdldChrZXkpOwotCi0JCQkJYWxsVGFnU3BlY3MuYWRkKHRzKTsKLQotCQkJCWlmICh0YWdJbmYgIT0gbnVsbCkgewotCQkJCQl0cy5zZXRBdHRyaWJ1dGVzKHRhZ0luZi5hdHRyaWJ1dGVzKTsKLQkJCQkJdHMuc2V0QnVuZGxlKHRhZ0luZi5idW5kbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIH0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhaXplRHluYW1pY1RhZ0RlZmluaXRpb25zKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgeHAgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEFOTk9UQVRJT05TX0NPTlRST0xMRVJfTkFNRVNQQUNFLCBEWU5BTUlDX0lOSVRJQUxJWkVSX0VYX1BUKTsKLQkJaWYgKHhwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0geHAuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCXRyeSB7Ci0JCQkJCUFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplcikgZWxlbWVudHNbal0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19QUk9QKTsKLQkJCQkJaW5pdGlhbGl6ZXIucmVnaXN0ZXJUYWdzKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIEFubm90YXRpb25UYWdSZWdpc3RyeS5UYWdTcGVjcyBmb3IgYWxsIHRhZ3MuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyByZWFkaW5nIHRoZSBpbml0aWFsaXphdGlvbiBkYXRhIGZyb20gdGhlIHBsdWdpbiByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMaXN0IGdldEFsbFRhZ1NwZWNzKCkgewotCQlyZXR1cm4gYWxsVGFnU3BlY3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc01ldGhvZFRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gbWV0aG9kVGFncy5jb250YWluc0tleSh0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRmllbGRUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGZpZWxkVGFncy5jb250YWluc0tleSh0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzVHlwZVRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdHlwZVRhZ3MuY29udGFpbnNLZXkodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB0aGUgdGFnc3BlYyBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QgdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIEZ1bGwgbmFtZSBmb3IgYSB0YWcuCi0JICogQHJldHVybiBhIFRhZ1NwZWMgZm9yIHRoZSB0YWcgbmFtZSwgb3IgbnVsbCBpZiBubyB0YWcgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUYWdTcGVjIGdldE1ldGhvZFRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gKFRhZ1NwZWMpIG1ldGhvZFRhZ3MuZ2V0KHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIHRhZ3NwZWMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQgdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIEZ1bGwgbmFtZSBmb3IgYSB0YWcuCi0JICogQHJldHVybiBhIFRhZ1NwZWMgZm9yIHRoZSB0YWcgbmFtZSwgb3IgbnVsbCBpZiBubyB0YWcgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUYWdTcGVjIGdldEZpZWxkVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiAoVGFnU3BlYykgZmllbGRUYWdzLmdldCh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSB0YWdzcGVjIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIEZ1bGwgbmFtZSBmb3IgYSB0YWcuCi0JICogQHJldHVybiBhIFRhZ1NwZWMgZm9yIHRoZSB0YWcgbmFtZSwgb3IgbnVsbCBpZiBubyB0YWcgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUYWdTcGVjIGdldFR5cGVUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIChUYWdTcGVjKSB0eXBlVGFncy5nZXQodGFnTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5pdFRhZ0luZm8gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgTGlzdCBhdHRyaWJ1dGVzOwotCi0JCXByaXZhdGUgQnVuZGxlIGJ1bmRsZTsKLQotCQlwcml2YXRlIFN0cmluZyBzY29wZTsKLQotCQlwdWJsaWMgSW5pdFRhZ0luZm8oU3RyaW5nIG5hbWUsIFN0cmluZyBzY29wZSwgTGlzdCBhdHQpIHsKLQkJCWF0dHJpYnV0ZXMgPSBhdHQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYgKCEob2JqIGluc3RhbmNlb2YgSW5pdFRhZ0luZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJcmV0dXJuIG5hbWUuZXF1YWxzKCgoSW5pdFRhZ0luZm8pIG9iaikubmFtZSkgfHwgKHNjb3BlLmVxdWFscygoKEluaXRUYWdJbmZvKSBvYmopLm5hbWUpKTsKLQotCQl9Ci0JfQotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUFubm90YXRpb25UYWdSZWdpc3RyeS5pbml0KCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5Bbm5vdGF0aW9uVGFnUmVnaXN0cnlfRVJST1JfMSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdzZXRSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdzZXRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZlMTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnc2V0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciA3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdzZXRSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEFubm90YXRpb25UYWdzZXRSZWdpc3RyeSgpOwotCi0JcHJpdmF0ZSBNYXAgaW5kZXg7Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5KCkgewotCQlzdXBlcigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiwgVGFnc2V0RGVzY3JpcHRvci5UQUdTRVQpOyAvLyROT04tTkxTLTEkCi0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgTGlzdCBkZXNjcmlwdG9yczsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKFRhZ3NldERlc2NyaXB0b3IuVEFHU0VULmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCWdldERlc2NyaXB0b3JzKCkuYWRkKG5ldyBUYWdzZXREZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVGFnc2V0RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApIHsKLQotCQkJLyogSW5kZXggZGVzY3JpcHRvcnMgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgc2VhcmNoaW5nICovCi0JCQlUYWdzZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFnc2V0RGVzY3JpcHRvcikgZ2V0SW5kZXgoKS5nZXQobmFtZSk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCXJldHVybiBkZXNjcmlwdG9yOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IEFubm90YXRpb25UYWdzZXRSZWdpc3RyeS5JTlNUQU5DRS5nZXREZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGVzY3JpcHRvciA9IChUYWdzZXREZXNjcmlwdG9yKSBpdHIubmV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLQkJCQkJZ2V0SW5kZXgoKS5wdXQoZGVzY3JpcHRvci5nZXROYW1lKCksIGRlc2NyaXB0b3IpOwotCQkJCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0b3JzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzKCkgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbmRleC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEluZGV4KCkgewotCQlpZiAoaW5kZXggPT0gbnVsbCkKLQkJCWluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJUYWdzZXQoVGFnc2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwgJiYgZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yLmdldE5hbWUoKSkgPT0gbnVsbCkKLQkJCWdldERlc2NyaXB0b3JzKCkuYWRkKGRlc2NyaXB0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDNjNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImFubm90YXRpb25jb250cm9sbGVyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnU3BlY18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ1NwZWNfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdTcGVjXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnU3BlY182OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ0F0dHJpYlNwZWNfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdBdHRyaWJTcGVjXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblRhZ1BhcnNlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdQYXJzZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXJfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfRVJST1JfMTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTU2NzBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeTsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogIAotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmc7Ci0JcHJpdmF0ZSBpbnQgdmFsdWVPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZURpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFbmRRdW90ZSA9IHRydWU7Ci0KLQlwdWJsaWMgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcihTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCB2YWx1ZU9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgdmFsdWVEaXNwbGF5U3RyaW5nKSB7Ci0JCXRoaXMucmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLQkJdGhpcy52YWx1ZU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQl0aGlzLnJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JCXRoaXMudmFsdWVEaXNwbGF5U3RyaW5nID0gdmFsdWVEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudExlbmd0aChpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJdGhpcy5yZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudFN0cmluZyhTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcpIHsKLQkJdGhpcy5yZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWVEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlRGlzcGxheVN0cmluZyhTdHJpbmcgdmFsdWVEaXNwbGF5U3RyaW5nKSB7Ci0JCXRoaXMudmFsdWVEaXNwbGF5U3RyaW5nID0gdmFsdWVEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmFsdWVPZmZzZXQoKSB7Ci0JCXJldHVybiB2YWx1ZU9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZU9mZnNldChpbnQgdmFsdWVPZmZzZXQpIHsKLQkJdGhpcy52YWx1ZU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUoKSB7Ci0JCXJldHVybiBlbnN1cmVCZWdpblF1b3RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuc3VyZUJlZ2luUXVvdGUoYm9vbGVhbiBlbnN1cmVCZWdpblF1b3RlKSB7Ci0JCXRoaXMuZW5zdXJlQmVnaW5RdW90ZSA9IGVuc3VyZUJlZ2luUXVvdGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5zdXJlRW5kUXVvdGUoKSB7Ci0JCXJldHVybiBlbnN1cmVFbmRRdW90ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnN1cmVFbmRRdW90ZShib29sZWFuIGVuc3VyZUVuZFF1b3RlKSB7Ci0JCXRoaXMuZW5zdXJlRW5kUXVvdGUgPSBlbnN1cmVFbmRRdW90ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0F0dHJpYnV0ZVZhbHVlc0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0F0dHJpYnV0ZVZhbHVlc0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMwYThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9BdHRyaWJ1dGVWYWx1ZXNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDEsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZVZhbHVlc0hlbHBlciB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1ZBTFVFUyA9IG5ldyBTdHJpbmdbMF07Ci0Jc3RhdGljIGZpbmFsIEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJbXSBFTVBUWV9QUk9QT1NBTF9IRUxQRVJTID0gbmV3IEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaW1wbGUgU3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGdpdmVuCi0JICoge0BsaW5rIFRhZ0F0dHJpYnV0ZVNwZWN9YW5kIHtAbGluayBJSmF2YUVsZW1lbnR9LgotCSAqIAotCSAqIEBwYXJhbSB0YXMKLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKFRhZ0F0dHJpYlNwZWMgdGFzLCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIG1vcmUgYWR2YW5jZWQgYXBpIGZvciByZXR1cm5pbmcgdmFsaWQgdmFsdWVzIGZvciBhIGdpdmVuIHtAbGluayBUYWdBdHRyaWJTcGVjfS4KLQkgKiBUaGlzIGFwaSBwcm92aWRlcyB5b3Ugd2l0aCBtb3JlIGZsZXhpYmlsaXR5IHRvIGNvbnRyb2wgdGhlIHJlcGxhY2VtZW50IHN0cmluZyB0aGF0IGlzIHVzZWQKLQkgKiBmb3IgdGhlIGNvbXBsZXRpb24uCi0JICogCi0JICogQHBhcmFtIHRhcwotCSAqIEBwYXJhbSBwYXJ0aWFsVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWVPZmZzZXQKLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJbXSBnZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVycyhUYWdBdHRyaWJTcGVjIHRhcywgU3RyaW5nIHBhcnRpYWxWYWx1ZSwgaW50IHZhbHVlT2Zmc2V0LCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ0F0dHJpYlNwZWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9UYWdBdHRyaWJTcGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZGFkNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ0F0dHJpYlNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVJlc291cmNlczsKLQotLyoqCi0gKiBAYXV0aG9yIGtlbGxleXAgSW5mb3JtYXRpb24gb24gYSBzaW5nbGUgcGFyYW1ldGVyIGZvciBhIHRhZy4gUGFyYW1ldGVycyBoYXZlIG5hbWVzLCBhbmQgY2FuIGJlCi0gKiAgICAgICAgIG1hcmtlZCBhcyBiZWluZyByZXF1aXJlZC4gKGllLCBub3Qgb3B0aW9uYWwpCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdBdHRyaWJTcGVjIHsKLQlwcml2YXRlIFN0cmluZyBhdHRyaWJOYW1lOwotCXByaXZhdGUgaW50IGZsYWdzOwotCXByaXZhdGUgU3RyaW5nIGhlbHBLZXk7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IFR5cGUuVEVYVDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxHX1JFUVVJUkVEID0gMTsKLQlwcml2YXRlIFN0cmluZ1tdIHZhbGlkVmFsdWVzOwotCXByaXZhdGUgVGFnU3BlYyB0YWdTcGVjOwotCi0JLyogRW51bSBmb3IgdHlwZSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVHlwZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQVRZUEUgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNID0gMzsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVW5pcXVlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRCA9IDQ7Ci0KLQkJcHJpdmF0ZSBpbnQgc2NvcGUgPSBNT0RVTEU7Ci0KLQkJcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJCXJldHVybiBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNjb3BlKGludCBpbikgewotCQkJc2NvcGUgPSBpbjsKLQkJfQotCX0KLQotCXByaXZhdGUgVW5pcXVlIHVuaXF1ZTsKLQotCXB1YmxpYyBVbmlxdWUgZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gdW5pcXVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgewotCQlyZXR1cm4gdW5pcXVlICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKCkgewotCQl1bmlxdWUgPSBuZXcgVW5pcXVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJVbmlxdWUoKSB7Ci0JCXVuaXF1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0YWcgYXR0cmlidXRlIHR5cGUgdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIEludGVnZXIgdHlwZSwgZGVmYXVsdHMgdG8gVEVYVCBpZiB0aGUgdHlwZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHR5cGVOYW1lVG9UeXBlKFN0cmluZyBuYW1lKSB7Ci0JCS8vVE9ETyBhZGQgZW51bQotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzdHJpbmciKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gVHlwZS5URVhUOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJvb2xlYW4iKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJvb2wiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gVHlwZS5CT09MRUFOOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImphdmFUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBUeXBlLkpBVkFUWVBFOwotCQkJfQotCQl9Ci0JCXJldHVybiBUeXBlLlRFWFQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSB0eXBlIGVudW0gdG8gYSB0eXBlIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZVRvVHlwZU5hbWUoaW50IHR5KSB7Ci0JCXN3aXRjaCAodHkpIHsKLQkJCWNhc2UgVHlwZS5URVhUIDoKLQkJCQlyZXR1cm4gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVHlwZS5CT09MRUFOIDoKLQkJCQlyZXR1cm4gImJvb2wiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFR5cGUuSkFWQVRZUEUgOgotCQkJCXJldHVybiAiamF2YVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUYWdBdHRyaWJTcGVjIHdpdGggPGNvZGU+bmFtZTwvY29kZT4gYXMgdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIGZvciB0aGUgYXR0cmlidXRlLiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgbmFtZSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBUYWdBdHRyaWJTcGVjKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhuYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQXR0cmliU3BlYyhTdHJpbmcgbmFtZSwgU3RyaW5nIGhscEtleSkgewotCQlzZXRBdHRyaWJOYW1lKG5hbWUpOwotCQlzZXRIZWxwS2V5KGhscEtleSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqICAgICAgICAgICAgVEVYVCB8IEJPT0xFQU4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0KSB7Ci0JCXR5cGUgPSB0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIHR5cGVuYW1lCi0JICogICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24sIHNob3VsZCBiZSB0ZXh0IG9yIGJvb2xlYW4uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZW5hbWUpIHsKLQkJdHlwZSA9IHR5cGVOYW1lVG9UeXBlKHR5cGVuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGUgPT0gVHlwZS5KQVZBVFlQRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZUlzVGV4dCgpIHsKLQkJcmV0dXJuIHR5cGUgPT0gVHlwZS5URVhUOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNCb29sKCkgewotCQlyZXR1cm4gdHlwZSA9PSBUeXBlLkJPT0xFQU47Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJOYW1lKCkgewotCQlyZXR1cm4gYXR0cmliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZS4gVGhpcyBjYW4gbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5ldyBuYW1lIGZvciB0aGUgYXR0cmlidXRlLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIG5hbWUgaXMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMuVGFnQXR0cmliU3BlY182KTsgCi0JCX0KLQkJYXR0cmliTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIChmbGFncyAmIEZMR19SRVFVSVJFRCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXF1aXJlZCBmbGFnIGZvciB0aGlzIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZCgpIHsKLQkJZmxhZ3MgfD0gRkxHX1JFUVVJUkVEOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgcmVxdWlyZWQgZmxhZyBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVxdWlyZWQoKSB7Ci0JCWZsYWdzICY9ICh+RkxHX1JFUVVJUkVEKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBoZWxwIGtleSBmb3IgdGhpcyB0YWcgYXR0cmlidXRlLiBTaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0S2V5KGludCBhVHlwZSkgewotCQlpZiAoYVR5cGUgIT0gVGFnU3BlYy5IRUxQX1RFWFQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGhlbHBLZXkgPT0gbnVsbCkgewotCQkJaGVscEtleSA9IGRlZmF1bHRIZWxwS2V5KCk7Ci0JCX0KLQkJcmV0dXJuIGhlbHBLZXk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgaGVscCB0ZXh0IHNvIGl0IGluY2x1ZGVzIHR5cGUgYW5kIHVzZSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybUxvY2FsaXplZFRleHQoU3RyaW5nIHR4dCkgewotCQlpZiAodHh0ID09IG51bGwpCi0JCQlyZXR1cm4gdHh0OwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0eHQubGVuZ3RoKCkgKyA1MCk7Ci0KLQkJYnVmLmFwcGVuZCgiPGI+VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCh0eXBlVG9UeXBlTmFtZSh0eXBlKSk7Ci0JCWJ1Zi5hcHBlbmQoIiwgVXNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5pc1JlcXVpcmVkKCkpIHsKLQkJCWJ1Zi5hcHBlbmQoInJlcXVpcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIm9wdGlvbmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGhpcy5pc1VuaXF1ZSgpKSB7Ci0JCQlidWYuYXBwZW5kKCIsIHVuaXF1ZTpzY29wZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoVGFnQXR0cmliU3BlYy51bmlxdWVTY29wZVRvU3RyaW5nKHRoaXMuZ2V0VW5pcXVlKCkuZ2V0U2NvcGUoKSkpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIjwvYj48cD4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKHR4dCk7Ci0JCWJ1Zi5hcHBlbmQoIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBoZWxwIGtleSBmb3IgdGhpcyB0YWcgYXR0cmlidXRlLiBTaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWxwS2V5KCkgewotCQlyZXR1cm4gZ2V0VGV4dEtleShUYWdTcGVjLkhFTFBfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVscCBrZXkuIFNldHRpbmcgdGhpcyB0byBudWxsIHJlc2V0cyB0aGUgaGVscCBrZXkgdG8gdGhlIGRlZmF1bHQgaGVscCBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBLZXkoU3RyaW5nIGtleSkgewotCQloZWxwS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaGVscCBrZXkgbmFtZSBmb3IgdGhpcyB0YWcuCi0JICogIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRIZWxwS2V5KCkgewotCQlyZXR1cm4gImF0aC4iICsgYXR0cmliTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IHVuaXF1ZVNjb3BlRnJvbVN0cmluZyhTdHJpbmcgc2NvcGVTdHIpIHsKLQkJaWYgKHNjb3BlU3RyICE9IG51bGwpIHsKLQkJCWlmIChzY29wZVN0ci5lcXVhbHNJZ25vcmVDYXNlKCJtb2R1bGUiKSlyZXR1cm4gVGFnQXR0cmliU3BlYy5VbmlxdWUuTU9EVUxFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5GSUxFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5UWVBFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgibWV0aG9kIikpcmV0dXJuIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLk1FVEhPRDsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNjb3BlU3RyLmVxdWFsc0lnbm9yZUNhc2UoImZpZWxkIikpcmV0dXJuIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLkZJRUxEOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5UYWdBdHRyaWJTcGVjXzEgKyBzY29wZVN0cik7Ci0JCXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5NT0RVTEU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlU2NvcGVUb1N0cmluZyhpbnQgc2NvcGUpIHsKLQkJc3dpdGNoIChzY29wZSkgewotCQkJY2FzZSBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5NT0RVTEUgOgotCQkJCXJldHVybiAibW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5GSUxFIDoKLQkJCQlyZXR1cm4gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLlRZUEUgOgotCQkJCXJldHVybiAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVGFnQXR0cmliU3BlYy5VbmlxdWUuTUVUSE9EIDoKLQkJCQlyZXR1cm4gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVGFnQXR0cmliU3BlYy5VbmlxdWUuRklFTEQgOgotCQkJCXJldHVybiAiZmllbGQiOyAvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLlRhZ0F0dHJpYlNwZWNfMSArIHNjb3BlKTsKLQkJCQlyZXR1cm4gInVua25vd24gdmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRWYWx1ZXMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKCkgewotCQlyZXR1cm4gdmFsaWRWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkVmFsdWVzCi0JICogICAgICAgICAgICBUaGUgdmFsaWRWYWx1ZXMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkVmFsdWVzKFN0cmluZ1tdIHZhbGlkVmFsdWVzKSB7Ci0JCXRoaXMudmFsaWRWYWx1ZXMgPSB2YWxpZFZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgVGFnU3BlYyBnZXRUYWdTcGVjKCkgewotCQlyZXR1cm4gdGFnU3BlYzsKLQl9Ci0KLQl2b2lkIHNldFRhZ1NwZWMoVGFnU3BlYyB0YWdTcGVjKSB7Ci0JCXRoaXMudGFnU3BlYyA9IHRhZ1NwZWM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBUYWdIZWxwKCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlQnVuZGxlIGIgPSBnZXRUYWdTcGVjKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcga2V5ID0gZ2V0SGVscEtleSgpOwotCQlTdHJpbmcgdmFsID0gYi5nZXRTdHJpbmcoZ2V0SGVscEtleSgpKTsKLQkJaWYgKHZhbCA9PSBrZXkpCi0JCQl2YWwgPSBudWxsOwotCQlyZXR1cm4gdHJhbnNmb3JtTG9jYWxpemVkVGV4dCh2YWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ1NwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlZjIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbGwgb2YgdGhlIGluZm9ybWF0aW9uIGluIGEgc2luZ2xlIHRhZ1NwZWMgdGFnLCBpbmNsdWRpbmcgdGhlIGVuY2xvc2luZyBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFnU3BlYyB7Ci0KLQkvKioKLQkgKiBIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVkIHRoZSBjb21wbGV0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIHRhZywKLQkgKiBpZiBhbnkuCi0JICovCi0JQnVuZGxlIGJ1bmRsZTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhdHRlbXB0ZWRUb0ZpbmRSZXNvdXJjZUJ1bmRsZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JcHJpdmF0ZSBUYWdzZXREZXNjcmlwdG9yIHRhZ3NldERlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB0YWcuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKLQotCS8qKgotCSAqIFNjb3BlIG9mIHRoZSB0YWc6IE1FVEhPRCB8IEZJRUxEIHwgVFlQRQotCSAqLwotCXByaXZhdGUgaW50IHNjb3BlOwotCi0JLyoqCi0JICogTXVsdGlwbGljaXR5IG9mIHRoZSB0YWc6IE9ORSB8IE1BTlkKLQkgKi8KLQlwcml2YXRlIGludCBtdWx0aXBsaWNpdHk7Ci0KLQkvKioKLQkgKiBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldCBmb3IgdGhpcyB0YWcuIChJbnN0YW5jZXMgb2YgVGFnQXR0cmliU3BlYykKLQkgKi8KLQlwcml2YXRlIExpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgU3RyaW5nIGhlbHBLZXk7Ci0KLQkvKioKLQkgKiBUZXh0IHR5cGUgZm9yIHVzZSB3aXRoIGxvY2FsaXplZCB0ZXh0IGNvbnRhaW5lci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUxQX1RFWFQgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSAyOwotCi0JcHVibGljIGludGVyZmFjZSBNdWx0aXBsaWNpdHkgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkUgPSAxOwotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTlkgPSAyOwotCX0KLQotCXB1YmxpYyBUYWdTcGVjKFN0cmluZyBhTmFtZSwgaW50IGFTY29wZSwgaW50IGFNdWx0aXBsaWNpdHkpIHsKLQkJdGFnTmFtZSA9IGFOYW1lOwotCQlzY29wZSA9IGFTY29wZTsKLQkJbXVsdGlwbGljaXR5ID0gYU11bHRpcGxpY2l0eTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBzY29wZUZyb21TdHJpbmcoU3RyaW5nIHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gVGFnU3BlYy5UWVBFOwotCQkJfSBlbHNlIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoImZpZWxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBUYWdTcGVjLkZJRUxEOwotCQkJfSBlbHNlIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIm1ldGhvZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gVGFnU3BlYy5NRVRIT0Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNob3VsZCBiZSBpbXBvc3NpYmxlIHVubGVzcyB0aGUgYW5ub3RhdGlvbi10YWdoYW5kbGVyLmV4c2Qgb3IKLQkJCQkvLyBjYWxsaW5nIGNvZGUgY2hhbmdlcy4KLQkJCQkvL1RPRE86IExvZ2dpbmcKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLCBJU3RhdHVzLk9LLCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuVGFnU3BlY18zICsgcywgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiwgSVN0YXR1cy5PSywgQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLlRhZ1NwZWNfNCwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBtdWx0aXBsaWNpdHlGcm9tU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIjEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIFRhZ1NwZWMuTXVsdGlwbGljaXR5Lk9ORTsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBUYWdTcGVjLk11bHRpcGxpY2l0eS5NQU5ZOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiwgSVN0YXR1cy5PSywgQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLlRhZ1NwZWNfNCwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy9SZXR1cm4gZGVmYXVsdAotCQlyZXR1cm4gVGFnU3BlYy5NdWx0aXBsaWNpdHkuT05FOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gU2NvcGUgZm9yIHRhZywgTUVUSE9EIHwgVFlQRSB8IEZJRUxECi0JICovCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbXVsdGlwbGljaXR5IGZvciB0YWcsIE9ORSB8IE1BTlkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE11bHRpcGxpY2l0eSgpIHsKLQkJcmV0dXJuIG11bHRpcGxpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIHRhZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JcHVibGljIFRhZ3NldERlc2NyaXB0b3IgZ2V0VGFnU2V0RGVzY3JpcHRvcigpIHsKLQkJaWYgKHRhZ3NldERlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJU3RyaW5nIHRhZ1NldE5hbWUgPSBnZXRUYWdOYW1lKCk7Ci0JCQlpbnQgaW5kZXggPSB0YWdTZXROYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJdGFnU2V0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJdGFnU2V0TmFtZSA9IHRhZ1NldE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl0YWdzZXREZXNjcmlwdG9yID0gQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5LklOU1RBTkNFLmdldERlc2NyaXB0b3IodGFnU2V0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRhZ3NldERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2NvcGUgb2YgdGhpcyB0YWcuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIE1FVEhPRCB8IFRZUEUgfCBGSUVMRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjb3BlKGludCBpKSB7Ci0JCXNjb3BlID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhpcyB0YWcuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIE9ORSB8IE1BTlkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aXBsaWNpdHkoaW50IGkpIHsKLQkJbXVsdGlwbGljaXR5ID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICBOYW1lIGZvciB0aGUgdGFnLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHN0cmluZykgewotCQl0YWdOYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIHRhZy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIHRhZy4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0Ci0JICogICAgICAgICAgICBBIFRhZ0F0dHJpYlNwZWMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoVGFnQXR0cmliU3BlYyBhdHQpIHsKLQkJaWYgKGF0dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzLmFkZChhdHQpOwotCQlhdHQuc2V0VGFnU3BlYyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgdGFnLgotCSAqIAotCSAqIEBwYXJhbSBsc3QKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGxpc3Qgb2YgVGFnQXR0cmliU3BlY3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKExpc3QgbHN0KSB7Ci0JCWlmIChsc3QgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlhdHRyaWJ1dGVzID0gbHN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlUYWdBdHRyaWJTcGVjIHRhcyA9IChUYWdBdHRyaWJTcGVjKSBsc3QuZ2V0KGkpOwotCQkJCXRhcy5zZXRUYWdTcGVjKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9va3MgZm9yIGF0dHJpYnV0ZSBuYW1lZCA8Y29kZT5hdHROYW1lPC9jb2RlPi4gQ2FzZSBpbnNlbnNpdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TmFtZQotCSAqICAgICAgICAgICAgTmFtZSB0byBsb29rIGZvcgotCSAqIEByZXR1cm4gQSBUYWdBdHRyaWJTcGVjLCBvciBudWxsIGlmIG5vbmUgd2FzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBUYWdBdHRyaWJTcGVjIGF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHROYW1lKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVRhZ0F0dHJpYlNwZWMgdGFzID0gKFRhZ0F0dHJpYlNwZWMpIGkubmV4dCgpOwotCi0JCQlpZiAoYXR0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhcy5nZXRBdHRyaWJOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRhczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVjbGFyaW5nUGx1Z2luLgotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWNsYXJpbmdQbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBkZWNsYXJpbmdQbHVnaW4gdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VCdW5kbGUuCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCAmJiAhYXR0ZW1wdGVkVG9GaW5kUmVzb3VyY2VCdW5kbGUpIHsKLQkJCWF0dGVtcHRlZFRvRmluZFJlc291cmNlQnVuZGxlID0gdHJ1ZTsKLQkJCUJ1bmRsZSBhQnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCQlpZiAoYUJ1bmRsZSAhPSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2VCdW5kbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlKSB7Ci0JCWF0dGVtcHRlZFRvRmluZFJlc291cmNlQnVuZGxlID0gZmFsc2U7Ci0JCXRoaXMucmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkVmFsdWVzSGVscGVyLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKSB7Ci0JCWlmICh2YWxpZFZhbHVlc0hlbHBlciA9PSBudWxsICYmIGdldFRhZ1NldERlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJc2V0VmFsaWRWYWx1ZXNIZWxwZXIoZ2V0VGFnU2V0RGVzY3JpcHRvcigpLmdldFZhbGlkVmFsdWVzSGVscGVyKCkpOwotCQlyZXR1cm4gdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkVmFsdWVzSGVscGVyCi0JICogICAgICAgICAgICBUaGUgdmFsaWRWYWx1ZXNIZWxwZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkVmFsdWVzSGVscGVyKEF0dHJpYnV0ZVZhbHVlc0hlbHBlciB2YWxpZFZhbHVlc0hlbHBlcikgewotCQl0aGlzLnZhbGlkVmFsdWVzSGVscGVyID0gdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwS2V5KCkgewotCQlpZiAoaGVscEtleSA9PSBudWxsKQotCQkJaGVscEtleSA9IGNvbXB1dGVIZWxwS2V5KCk7Ci0JCXJldHVybiBoZWxwS2V5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIZWxwS2V5KCkgewotCQlyZXR1cm4gInRhZ2guIiArIGdldFRhZ05hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBLZXkoU3RyaW5nIGhlbHBLZXkpIHsKLQkJdGhpcy5oZWxwS2V5ID0gaGVscEtleTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFRhZ0hlbHAoKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VCdW5kbGUgYiA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGtleSA9IGdldEhlbHBLZXkoKTsKLQkJU3RyaW5nIHZhbCA9IGIuZ2V0U3RyaW5nKGdldEhlbHBLZXkoKSk7Ci0JCWlmICh2YWwgPT0ga2V5KQotCQkJdmFsID0gbnVsbDsKLQkJcmV0dXJuIHZhbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ3NldERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9UYWdzZXREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNGM0ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ3NldERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciA3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRhZ3NldERlc2NyaXB0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHU0VUID0gIkFubm90YXRpb25UYWdTZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRElTUExBWV9OQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFSRU5UX1RBR1NFVCA9ICJwYXJlbnRUYWdzZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZBTElEX1ZBTFVFU19IRUxQRVIgPSAidmFsaWRWYWx1ZXNIZWxwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudFRhZ3NldDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlVmFsdWVzSGVscGVyIHZhbGlkVmFsdWVzSGVscGVyOwotCi0JcHJvdGVjdGVkIFRhZ3NldERlc2NyaXB0b3IoKSB7Ci0JCWVsZW1lbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBUYWdzZXREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQl0aGlzLmRpc3BsYXlOYW1lID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRElTUExBWV9OQU1FKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFU0NSSVBUSU9OKTsKLQkJdGhpcy5wYXJlbnRUYWdzZXQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QQVJFTlRfVEFHU0VUKTsKLQkJLy8gc2V0IHRoZSB2YWxpZCB2YWx1ZXMgaGVscGVyIGlmIHRoZXJlIGlzIG9uZQotCQl0cnkgewotCQkJU3RyaW5nIHZhbGlkVmFsdWVzSGVscGVyTmFtZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTElEX1ZBTFVFU19IRUxQRVIpOwotCQkJaWYgKHZhbGlkVmFsdWVzSGVscGVyTmFtZSAhPSBudWxsKSB7Ci0JCQkJQ2xhc3MgbG9hZGVkID0gQ2xhc3MuZm9yTmFtZSh2YWxpZFZhbHVlc0hlbHBlck5hbWUpOwotCQkJCXRoaXMudmFsaWRWYWx1ZXNIZWxwZXIgPSAoQXR0cmlidXRlVmFsdWVzSGVscGVyKSBsb2FkZWQubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50VGFnc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VGFnc2V0KCkgewotCQlyZXR1cm4gcGFyZW50VGFnc2V0OwotCX0KLQotCXB1YmxpYyBUYWdzZXREZXNjcmlwdG9yW10gZ2V0RGlyZWN0RGVwZW5kZW50cygpIHsKLQotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwgfHwgZ2V0TmFtZSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVGFnc2V0RGVzY3JpcHRvclswXTsKLQotCQlMaXN0IGRlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVGFnc2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBBbm5vdGF0aW9uVGFnc2V0UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJZGVzY3JpcHRvciA9IChUYWdzZXREZXNjcmlwdG9yKSBpdHIubmV4dCgpOwotCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoZGVzY3JpcHRvci5nZXRQYXJlbnRUYWdzZXQoKSkpCi0JCQkJZGVwZW5kZW50cy5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQotCQlUYWdzZXREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgVGFnc2V0RGVzY3JpcHRvcltkZXBlbmRlbnRzLnNpemUoKV07Ci0JCWRlcGVuZGVudHMudG9BcnJheShkZXNjcmlwdG9ycyk7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkVmFsdWVzSGVscGVyLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKSB7Ci0JCXJldHVybiB2YWxpZFZhbHVlc0hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsaWRWYWx1ZXNIZWxwZXIKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZFZhbHVlc0hlbHBlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRWYWx1ZXNIZWxwZXIoQXR0cmlidXRlVmFsdWVzSGVscGVyIHZhbGlkVmFsdWVzSGVscGVyKSB7Ci0JCXRoaXMudmFsaWRWYWx1ZXNIZWxwZXIgPSB2YWxpZFZhbHVlc0hlbHBlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZWQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQW5ub3RhdGlvbnNfQ29udHJvbGxlcj1Bbm5vdGF0aW9ucyBDb250cm9sbGVyCi1hbm5vdGF0aW9uX3RhZ19pbmZvPWFubm90YXRpb24gdGFnIGluZm8KLWFubm90YXRpb25fdGFnc2V0PWFubm90YXRpb24gdGFnc2V0Ci1hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyPWFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwZmRhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbnNDb250cm9sbGVyIiBuYW1lPSIlQW5ub3RhdGlvbnNfQ29udHJvbGxlciIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbnNDb250cm9sbGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkFubm90YXRpb25UYWdJbmZvIiBuYW1lPSIlYW5ub3RhdGlvbl90YWdfaW5mbyIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbi10YWctaW5mby5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJBbm5vdGF0aW9uVGFnU2V0IiBuYW1lPSIlYW5ub3RhdGlvbl90YWdzZXQiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb24udGFnc2V0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIiIG5hbWU9IiVhbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmV4c2QiLz4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZmZmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvbnRyb2xsZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb250cm9sbGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjMxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvbnRyb2xsZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRhZ1NwZWNfMz1Vbmtub3duIHRhZyBzY29wZToKLVRhZ1NwZWNfND1OdWxsIHRhZyBzY29wZS4KLVRhZ1NwZWNfNT1Vbmtub3duIHRhZyBtdWx0aXBsaWNpdHk6Ci1UYWdTcGVjXzY9TnVsbCB0YWcgbXVsdGlwbGljaXR5LgotVGFnQXR0cmliU3BlY18xPVVua25vd24gJ3VuaXF1ZScgc2NvcGUgdmFsdWU6Ci1UYWdBdHRyaWJTcGVjXzI9TW9yZSB0aGFuIG9uZSAndW5pcXVlJyB0YWcgZGVmaW5lZDoKLUFubm90YXRpb25UYWdQYXJzZXJfMD1OdWxsIGV2ZW50IGhhbmRsZXIuCi1Bbm5vdGF0aW9uVGFnUGFyc2VyXzE9Ci1Bbm5vdGF0aW9uVGFnUmVnaXN0cnlfMD1Nb3JlIHRoYW4gb25lICdBbm5vdGF0aW9uVGFnSW5mbycgdGFnIGZvciB0aGUgdGFnICcKLUFubm90YXRpb25UYWdSZWdpc3RyeV85PXBhcnNlVGFnQXR0cmliczogdW5rbm93biAndXNlJyB2YWx1ZToKLUFubm90YXRpb25UYWdSZWdpc3RyeV8xMD1JbmNvbXBsZXRlIGVsZW1lbnQgQW5ub3RhdGlvblRhZ0luZm8gaW4gcGx1Z2luIHswfQotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzExPXBhcnNlVGFnQXR0cmliczogdW5rbm93biAnaXNKYXZhVHlwZUlkZW50aWZpZXInIHZhbHVlOgotQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlcl9FUlJPUl8wPUlXQUUwMDAxRSBJbnZhbGlkIElDb25maWd1cmF0aW9uRWxlbWVudCB1c2VkIHRvIGNyZWF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZWdpc3RyeS5EZXNjcmlwdG9yLgotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5X0VSUk9SXzE9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb24tdGFnLWluZm8uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uLXRhZy1pbmZvLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjIzOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb24tdGFnLWluZm8uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiBpZD0iQW5ub3RhdGlvblRhZ0luZm8iIG5hbWU9IkFubm90YXRpb24gVGFnIEluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRGVzY3JpYmVzIHRoZSB0YWdzIGNvbnRhaW5lZCBieSBhIHRhZyBzZXQgYW5kIHRoZSB0YWcmYXBvcztzIGF0dHJpYnV0ZXMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJBbm5vdGF0aW9uVGFnSW5mbyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iQW5ub3RhdGlvblRhZ0luZm8iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhdHRyaWIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFnU2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHRhZyBzZXQgdGhpcyB0YWcgY29tZXMgdW5kZXJuZWF0aC4gICggZm9yIGluc3RhbmNlLCBpZiB3ZSZhcG9zO3JlIGRlZmluaW5nIHRoZSAmbHQ7Y29kZSZndDtAZWpiLmJlYW4mbHQ7L2NvZGUmZ3Q7DQotdGFnLCB0aGVuIHRoZSB0YWcgc2V0IHdvdWxkIGJlICZsdDtjb2RlJmd0O2VqYiZsdDsvY29kZSZndDsuICkgIFRoZSB0YWcgc2V0IG11c3QgaGF2ZSBiZWVuIGRlZmluZWQgdXNpbmcgdGhlIGFubm90YXRpb24udGFnc2V0IGV4dGVuc2lvbiBwb2ludC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFnTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSB0YWcuICAoIGlmIHdlJmFwb3M7cmUgZGVmaW5pbmcgdGhlICZsdDtjb2RlJmd0O0BlamIuYmVhbiZsdDsvY29kZSZndDsgdGFnLCB0aGVuIHRoZSB0YWdOYW1lIHdvdWxkIGJlICZsdDtjb2RlJmd0O2JlYW4mbHQ7L2NvZGUmZ3Q7ICkuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjb3BlIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBTY29wZSBvZiB0aGUgYmVhbi4gIE11c3QgYmUgJmx0O2NvZGUmZ3Q7dHlwZSZsdDsvY29kZSZndDssJmx0O2NvZGUmZ3Q7bWV0aG9kJmx0Oy9jb2RlJmd0Oywgb3IgJmx0O2NvZGUmZ3Q7ZmllbGQmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgICAgPHNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ0eXBlIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibWV0aG9kIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZmllbGQiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtdWx0aXBsaWNpdHkiIHVzZT0iZGVmYXVsdCIgdmFsdWU9IjEiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE11bHRpcGxpY2l0eSBvZiB0aGUgdGFnc2V0LiAgTXVzdCBiZSAmbHQ7Y29kZSZndDsxJmx0Oy9jb2RlJmd0OyBvciZsdDtjb2RlJmd0OyombHQ7L2NvZGUmZ3Q7LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLCBpZiBub3Qgc3BlY2lmaWVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgICAgPHNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSIxIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iKiI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uLiAgTWF5IGJlIGEgZGVzY3JpcHRpb24gc3RyaW5nLCBvciBhDQota2V5IHRvIGxvY2FsaXplZCB0ZXh0IGZvciB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIGRlY2xhcmluZyBwbHVnaW4mYXBvcztzIHJlc291cmNlIGJ1bmRsZS4gTm8gZGVmYXVsdCBpZiB0aGlzIGlzDQotbm90IHNwZWNpZmllZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImF0dHJpYiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVuaXF1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVudW1WYWx1ZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIHRleHQgZm9yIHRoZSBhdHRyaWJ1dGUsIG9yIGtleSBwb2ludGluZyB0byB0aGUgbG9jYWxpemVkIGRlc2NyaXB0aW9uIHRleHQgaW5zaWRlIG9mIHRoZSBkZWNsYXJpbmcgcGx1Z2luJmFwb3M7cyByZXNvdXJjZSBidW5kbGUuICBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAmbHQ7Y29kZSZndDthdGguQVRUUklCVVRFX05BTUUmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHVzZT0iZGVmYXVsdCIgdmFsdWU9Im9wdGlvbmFsIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBTZXRzIHdoZXRoZXIgdGhpcyB0YWcgaXMgJmx0O2NvZGUmZ3Q7b3B0aW9uYWwmbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O3JlcXVpcmVkJmx0Oy9jb2RlJmd0Oy4gIFRoZSBkZWZhdWx0IGlzICZsdDtjb2RlJmd0O29wdGlvbmFsJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0iZGVmYXVsdCIgdmFsdWU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVHlwZSBvZiB0aGUgYXR0cmlidXRlLCAmbHQ7Y29kZSZndDtzdHJpbmd8Ym9vbGVhbnxqYXZhVHlwZSZsdDsvY29kZSZndDsuICBEZWZhdWx0cyB0byAmbHQ7Y29kZSZndDtzdHJpbmcmbHQ7L2NvZGUmZ3Q7IGlmIG5vdCBzcGVjaWZpZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJvb2wiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJqYXZhVHlwZSI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImVudW0iPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0idW5pcXVlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBzY29wZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjb3BlIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJtb2R1bGUiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgdW5pcXVlbmVzcyBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gSXQgaXMgb25lIG9mIHRoZSAmbHQ7Y29kZSZndDttb2R1bGUmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtmaWxlJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7dHlwZSZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O21ldGhvZCZsdDsvY29kZSZndDssb3IgICZsdDtjb2RlJmd0O2ZpZWxkJmx0Oy9jb2RlJmd0Oy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJmFwb3M7bW9kdWxlJmFwb3M7Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgICAgPHNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJtb2R1bGUiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmaWxlIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0idHlwZSI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im1ldGhvZCI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZpZWxkIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVudW1WYWx1ZXMiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSB1c2VyIGEgZHJvcCBkb3duIGNob2ljZSBvZiB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgYXR0cmlidXRlIHNlbGVjdGlvbi4gIEVhY2ggb25lIG9mIHRoZXNlICZxdW90O3ZhbHVlcyZxdW90OyBpcyBhbiBlbnRyeSBpbiB0aGF0IGRyb3AgZG93biBmb3IgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb24udGFnc2V0LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbi50YWdzZXQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExM2VmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbi50YWdzZXQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiBpZD0iQW5ub3RhdGlvblRhZ1NldCIgbmFtZT0iQW5ub3RhdGlvbnMgVGFnIFNldCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBBbGxvd3MgY2xpZW50cyB0byBkZWZpbmUgYSB0YWcgc2V0IGZvciBhbiBhbm5vdGF0aW9uIA0KLXRhZy4gIEEgdGFnIHNldCBuYW1lZCBYIHdvdWxkIGNvbnRhaW4gYWxsIG9mIHRoZSB0YWdzIHRoYXQNCi1sb29rIGxpa2UgJmx0O2NvZGUmZ3Q7QFgudGFnJmx0Oy9jb2RlJmd0Oy4gIFNvIHRoZSAmbHQ7Y29kZSZndDtlamImbHQ7L2NvZGUmZ3Q7DQotdGFnIHNldCB3b3VsZCBjb250YWluIHRoZSAmbHQ7Y29kZSZndDtAZWpiLmJlYW4mbHQ7L2NvZGUmZ3Q7IHRhZywgDQotdGhlICZsdDtjb2RlJmd0O0BlamIucGVyc2lzdGVuY2UmbHQ7L2NvZGUmZ3Q7IHRhZywgdGhlICZsdDtjb2RlJmd0O0BlamIucGsmbHQ7L2NvZGUmZ3Q7IHRhZywgZXRjLi4uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJBbm5vdGF0aW9uVGFnU2V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJBbm5vdGF0aW9uVGFnU2V0Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHRhZ3NldC4gIFRoZSBuYW1lIGZvciB0aGUgdGFnc2V0IHRoYXQgY29udGFpbnMgdGhlICZsdDtjb2RlJmd0O0BlamIuYmVhbiZsdDsvY29kZSZndDsgdGFnIHdvdWxkIGJlICZsdDtjb2RlJmd0O2VqYiZsdDsvY29kZSZndDsuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSB0ZXh0IG9mIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSB0YWcsIG9yIGEgcmVzb3VyY2UNCi1rZXkgcG9pbnRpbmcgdG8gdGhlIGxvY2FsaXplZCBkaXNwbGF5IG5hbWUgaW5zaWRlIG9mIHRoZQ0KLWRlY2xhcmluZyBwbHVnaW4mYXBvcztzIHJlc291cmNlIGJ1bmRsZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFnIHNldC4gIENhbiBiZSB0aGUgdGV4dCBvZiB0aGUgDQotZGVzY3JpcHRpb24sIG9yIGEga2V5IGZvciB0aGUgZGVjbGFyaW5nIHBsdWdpbiZhcG9zO3MgcmVzb3VyY2UgYnVuZGxlIHRoYXQgcG9pbnRzIHRvIHRoZSBsb2NhbGl6ZWQgdGV4dCBmb3IgdGhlIHRhZyBzZXQgZGVzY3JpcHRpb24uDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudFRhZ3NldCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIG9wdGlvbmFsbHkgdG8gc2V0IGEgdGFnc2V0IGFzIGEgcGFyZW50IHRvIHRoaXMgb25lLCB3aGljaCB3aWxsIGVuZm9yY2UgdGhlIHBhcmVudCBhcyBhIHByZXJlcXVpc2l0ZSB0YWcgc2V0IHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBmaXJzdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsaWRWYWx1ZXNIZWxwZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBvcHRpb25hbGx5IHRvIGFkZCBhIHByb2dyYW1tYXRpYyBkeW5hbWljIGhlbHBlciB0byBzdXBwbHkgdGhlIHVzZXIgd2l0aCBhIHNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMgaW4gdGhpcyB0YWcgc2V0LCBkZXBlbmRpbmcgb24gYXR0cmlidXRlIHNlbGVjdGlvbi4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWIwOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIgaWQ9ImFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIiIG5hbWU9IkFubm90YXRpb24gVGFnIER5bmFtaWMgSW5pdGlhbGl6ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhbGxvdyBmb3IgY2xpZW50cyB0byBkZWZpbmUgdGhlaXIgYW5ub3RhdGlvbiB0YWdzIGR5bmFtaWNhbGx5LiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc3RhdGljYWxseSBkZWZpbmUgYW5ub3RhdGlvbiB0YWdzIHVzaW5nIHRoZSB0YWctaW5mbyBleHRlbnNpb24gcG9pbnQuICBUaGUgZXh0ZW5zaW9ucyBmb3IgdGhpcyBwb2ludCB3aWxsIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGluaXRpYWxpemluZyB0aGUgc3RhdGljIGFubm90YXRpb24gdGFncyBmcm9tIHRoZSB0YWctaW5mbyBleHRlbnNpb24gcG9pbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImluaXRpYWxpemVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbml0aWFsaXplciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNldCB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbS5pYm0ud3RwLmFubm90YXRpb25zLnJlZ2lzdHJ5LkFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIgaW50ZXJmYWNlLiAgVGhpcyBjbGFzcyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbnNDb250cm9sbGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbnNDb250cm9sbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzVkYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb25zQ29udHJvbGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiIGlkPSJhbm5vdGF0aW9uc0NvbnRyb2xsZXIiIG5hbWU9IkFubm90YXRpb25zIENvbnRyb2xsZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGFubm90YXRpb25zQ29udHJvbGxlciBpcyB1c2VkIGluIGdlbmVyYXRpbmcgYW5ub3RhdGVkIGJlYW5zLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5ub3RhdGlvbnNDb250cm9sbGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uc0NvbnRyb2xsZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBpcyB1c2VkIHRvIGNvb3JkaW5hdGUgcHJlY2VkZW5jZSB1c2luZyBmdW5jdGlvbiBncm91cHMgc28gdGhpcyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZnVuY3Rpb24gZ3JvdXAgYmluZGluZ3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBjbGFzcyBkZWZpbmVkIGJ5IHRoZSBleHRlbnNpb24NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVpbGRlcklEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIElEIG9mIHRoZSBhbm5vdGF0aW9ucyBidWlsZGVyIHRvIGJlIHVzZWQgYnkgdGhpcyBhbm5vdGF0aW9ucyBjb250cm9sbGVyLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1NGQ4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+CQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjMzVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1hbm5vdGF0aW9ucy1jb3JlLmphcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYwMmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0NzkyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE2IDE3OjE1OjExIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMDUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTYXQgSnVuIDAyIDE3OjA2OjM4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiZDc2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI1N1biBBcHIgMTYgMTc6MTQ6NTIgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FlMTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTBjMDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5ZDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtTmFtZS4wID0gQW5ub3RhdGlvbiBDb3JlIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gQW5ub3RhdGlvbnMgUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0M2Q2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhbm5vdGF0aW9uc1Byb3ZpZGVyIiBuYW1lPSIlZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbnNQcm92aWRlci5leHNkIi8+Ci0gPGV4dGVuc2lvbgotICAgICAgIGlkPSJBbm5vdGF0aW9uc1RyYW5zbGF0b3IiCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLnRyYW5zbGF0b3JFeHRlbnNpb24iPgotICAgICAgIDx0cmFuc2xhdG9yCi0gICAgICAgCQljbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc1RyYW5zbGF0b3IiPgotICAgICAgIDwvdHJhbnNsYXRvcj4KLSA8L2V4dGVuc2lvbj4KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3MThhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTM0Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGFnU3BlY18zPVVua25vd24gdGFnIHNjb3BlOgotVGFnU3BlY180PU51bGwgdGFnIHNjb3BlLgotVGFnQXR0cmliU3BlY182PQotQW5ub3RhdGlvblRhZ1BhcnNlcl8wPU51bGwgZXZlbnQgaGFuZGxlci4KLUFubm90YXRpb25UYWdQYXJzZXJfMT0KLUFubm90YXRpb25UYWdSZWdpc3RyeV8wPU1vcmUgdGhhbiBvbmUgJ0Fubm90YXRpb25UYWdJbmZvJyB0YWcgZm9yIHRoZSB0YWcgJwotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5Xzk9cGFyc2VUYWdBdHRyaWJzOiB1bmtub3duICd1c2UnIHZhbHVlOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25zUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uc1Byb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGRjZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25zUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25zUHJvdmlkZXIiIG5hbWU9IkFubm90YXRpb25zIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIGJ5IGNsaWVudHMgdG8gYWxsb3cgdGhlaXIgb3duIGFubm90YXRpb24gcHJvdmlkZXIgdG8gZGV0YWlsIGluZm9ybWF0aW9uIG9uIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gRU9iamVjdCBpcyBhbm5vdGF0ZWQgZm9yIG9uZSBvZiB0aGVpciB0YWcgc2V0cy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFubm90YXRpb25zUHJvdmlkZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbnNQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciBhIGNsYXNzIHdoaWNoIGltcGxtZW50cyB0aGUgSUFubm90YXRpb25zUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbMS4wLjJdCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbVGhpcyBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0ZWRDb21tZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0ZWRDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc2N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgVGFnUGFyc2VFdmVudEhhbmRsZXIgewotCi0JcHJpdmF0ZSBNYXAgYW5ub3RhdGlvbnM7Ci0KLQlwcml2YXRlIFRva2VuIGFubm90YXRpb25Ub2tlbjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXIjYW5ub3RhdGlvblRhZyhvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4pCi0JICovCi0JcHVibGljIHZvaWQgYW5ub3RhdGlvblRhZyhUb2tlbiB0YWcpIHsKLQkJdGhpcy5hbm5vdGF0aW9uVG9rZW4gPSB0YWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXIjZW5kT2ZUYWcoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2F0dHJpYnV0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4sCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Ub2tlbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoVG9rZW4gbmFtZSwgaW50IGVxdWFsc1Bvc2l0aW9uLCBUb2tlbiB2YWx1ZSkgewotCQlpZiAodmFsdWUuZ2V0VGV4dCgpID09IG51bGwgfHwgdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApCi0JCQlnZXRBbm5vdGF0aW9ucygpLnB1dCh0aGlzLmFubm90YXRpb25Ub2tlbi5nZXRUZXh0KCksIG5hbWUuZ2V0VGV4dCgpKTsKLQkJZWxzZQotCQkJZ2V0QW5ub3RhdGlvbnMoKS5wdXQobmFtZS5nZXRUZXh0KCksIHZhbHVlLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldEFubm90YXRpb25zKCkgewotCQlpZiAoYW5ub3RhdGlvbnMgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvblRhZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk2NjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvblRhZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ1BhcnNlciB7Ci0KLQlwcml2YXRlIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIGhhbmRsZXI7Ci0KLQlwcml2YXRlIGNoYXJbXSBpbnB1dDsKLQotCWludCBwb3M7Ci0KLQlpbnQgZW5kT2ZMYXN0R29vZEF0dFBhcnNlOwotCi0JcHVibGljIEFubm90YXRpb25UYWdQYXJzZXIoVGFnUGFyc2VFdmVudEhhbmRsZXIgdHApIHsKLQkJaWYgKHRwID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLkFubm90YXRpb25UYWdQYXJzZXJfMCk7IAotCQl9Ci0JCWhhbmRsZXIgPSB0cDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW9zKCkgewotCQlyZXR1cm4gcG9zID49IGlucHV0Lmxlbmd0aDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNXUyhjaGFyIGMpIHsKLQkJcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXHQnOwotCX0KLQotCXByaXZhdGUgdm9pZCBza2lwV1MoKSB7Ci0JCXdoaWxlIChwb3MgPCBpbnB1dC5sZW5ndGggJiYgKGlzV1MoaW5wdXRbcG9zXSkgfHwgaW5wdXRbcG9zXSA9PSAnKicpKSB7Ci0JCQlwb3MrKzsKLQkJfQotCX0KLQotCS8vIENhbGxlciBpcyBleHBlY3RlZCB0byBtYWtlIHN1cmUgdGhlIGVvcyBoYXMgbm90IGJlZW4gcmVhY2hlZC4KLQlwcml2YXRlIGNoYXIgcGVlaygpIHsKLQkJcmV0dXJuIGlucHV0W3Bvc107Ci0JfQotCi0JLy8gQ2FsbGVyIGlzIGV4cGVjdGVkIHRvIGNoZWNrIGZvciBFT1MuCi0JcHJpdmF0ZSBjaGFyIG5leHRDaGFyKCkgewotCQlyZXR1cm4gaW5wdXRbcG9zKytdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05leHRDaGFyKGNoYXIgYykgewotCQlpZiAoZW9zKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwZWVrKCkgPT0gYzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJRENoYXIoY2hhciBjKSB7Ci0JCXJldHVybiAhaXNXUyhjKSAmJiBjICE9ICc9JyAmJiBjICE9ICdAJyAmJiBjICE9ICdcIic7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBjb2xsZWN0SUQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigxNik7Ci0JCVRva2VuIHQgPSBuZXcgVG9rZW4oKTsKLQotCQl0LnNldEJlZ2lubmluZyhwb3MpOwotCQl3aGlsZSAoIWVvcygpICYmIGlzSURDaGFyKHBlZWsoKSkpIHsKLQkJCWIuYXBwZW5kKG5leHRDaGFyKCkpOwotCQl9Ci0JCXQuc2V0RW5kKHBvcyAtIDEpOwotCQl0LnNldFRleHQoYi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RBdHRyaWJOYW1lKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzYXZlID0gcG9zOwotCi0JCVRva2VuIHJldHZhbCA9IGNvbGxlY3RJRCgpOwotCQlpZiAocmV0dmFsLmxlbmd0aCgpID09IDApIHsKLQkJCXBvcyA9IHNhdmU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgVG9rZW4gZXhwZWN0VGFnKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzYXZlUG9zID0gcG9zOwotCi0JCWlmIChuZXh0Q2hhcigpICE9ICdAJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZW9zKCkgfHwgaXNXUyhwZWVrKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVRva2VuIHJldHZhbCA9IGV4cGVjdEF0dHJpYk5hbWUoKTsKLQotCQlpZiAocmV0dmFsLmxlbmd0aCgpID09IDApIHsKLQkJCXBvcyA9IHNhdmVQb3MgKyAxOwotCQl9Ci0JCXJldHZhbC5zZXRCZWdpbm5pbmcoc2F2ZVBvcyk7Ci0KLQkJLy8gU2F2ZSBlbmQgb2YgcGFyc2Ugc28gd2UgY2FuIHBhc3MgaXQgYXMgdGhlIGVuZCBvZiB0aGUgcGFyc2VkIHRhZy4KLQkJZW5kT2ZMYXN0R29vZEF0dFBhcnNlID0gcG9zOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgVG9rZW4gZXhwZWN0UXVvdGVkVmFsdWUoKSB7Ci0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVG9rZW4gdG9rID0gbmV3IFRva2VuKCk7Ci0KLQkJdG9rLnNldEJlZ2lubmluZyhwb3MpOwotCQlpZiAocGVlaygpICE9ICdcIicpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCW5leHRDaGFyKCk7Ci0KLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcig2NCk7Ci0KLQkJd2hpbGUgKCFlb3MoKSAmJiBwZWVrKCkgIT0gJ1wiJykgewotCQkJYi5hcHBlbmQobmV4dENoYXIoKSk7Ci0JCX0KLQkJaWYgKCFlb3MoKSkgewotCQkJbmV4dENoYXIoKTsKLQkJfQotCi0JCXRvay5zZXRFbmQocG9zIC0gMSk7Ci0JCXRvay5zZXRUZXh0KGIudG9TdHJpbmcoKSk7Ci0JCXJldHVybiB0b2s7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4cGVjdEFzc2lnbigpIHsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAobmV4dENoYXIoKSA9PSAnPScpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXBvcy0tOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBta051bGxUb2tlbigpIHsKLQkJVG9rZW4gcmV0dmFsID0gbmV3IFRva2VuKCk7Ci0KLQkJcmV0dmFsLnNldEJlZ2lubmluZyhwb3MpOwotCQlyZXR2YWwuc2V0RW5kKHBvcyAtIDEpOwotCQlyZXR2YWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VOZXh0QXR0cmlidXRlKCkgewotCQlza2lwV1MoKTsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVG9rZW4ga2V5ID0gY29sbGVjdElEKCk7Ci0KLQkJaWYgKGtleSA9PSBudWxsIHx8IGtleS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlza2lwV1MoKTsKLQkJaWYgKGVvcygpKSB7Ci0JCQkvLyBHbyBhaGVhZCBhbmQgcmVwb3J0IGl0LCBldmVuIHRob3VnaCBpdCBpcyBhIHBhcnRpYWwgYXR0cmlidXRlLiAoCi0JCQkvLyB3ZSBzdGlsbCBmYWlsIGhlcmUgKQotCQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCAtMSwgbWtOdWxsVG9rZW4oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgZXFQb3MgPSBwb3M7Ci0KLQkJaWYgKCFleHBlY3RBc3NpZ24oKSkgewotCQkJLy8gRXZlbiB0aG91Z2ggd2Ugd29uJ3QgcGFyc2UgdGhpcyBhcyBhIGZ1bGwgYXR0cmlidXRlLCBnbyBhaGVhZCBhbmQKLQkJCS8vIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCBpdC4gU29tZSBjbGllbnRzIHdhbnQgdG8gc2VlIHBhcnRpYWwKLQkJCS8vIGF0dHJpYnV0ZXMuCi0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIC0xLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlza2lwV1MoKTsKLQotCQlpZiAoZW9zKCkpIHsKLQkJCS8vIFNhbWUgaGVyZSAtIHdlIGZhaWwgb24gaXQsIGJ1dCB3ZSByZXBvcnQgaXQgYW55d2F5Ci0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIGVxUG9zLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUb2tlbiB2YWx1ZSA9IGV4cGVjdFF1b3RlZFZhbHVlKCk7Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gY29sbGVjdElEKCk7Ci0JCQlpZiAoaXNOZXh0Q2hhcignPScpKSB7Ci0JCQkJcG9zID0gdmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCQkJdmFsdWUgPSBta051bGxUb2tlbigpOwotCQkJfQotCQl9Ci0JCWVuZE9mTGFzdEdvb2RBdHRQYXJzZSA9IHBvczsKLQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCBlcVBvcywgdmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VBdHRyaWJ1dGVzKCkgewotCQl3aGlsZSAoIWVvcygpICYmIHBhcnNlTmV4dEF0dHJpYnV0ZSgpKSB7Ci0JCQkvLyBsb29wIHdoaWxlIG5vdCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2tpcFRvVGFnQ2hhcigpIHsKLQkJd2hpbGUgKCFlb3MoKSAmJiBwZWVrKCkgIT0gJ0AnKSB7Ci0JCQluZXh0Q2hhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VySW5wdXQoY2hhcltdIHRleHQpIHsKLQkJaW5wdXQgPSB0ZXh0OwotCQlwb3MgPSAwOwotCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcklucHV0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFBhcnNlcklucHV0KHRleHQudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFyc2UoKSB7Ci0JCXdoaWxlICghZW9zKCkpIHsKLQkJCXNraXBUb1RhZ0NoYXIoKTsKLQkJCVRva2VuIHRhZyA9IGV4cGVjdFRhZygpOwotCQkJaWYgKHRhZyA9PSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQloYW5kbGVyLmFubm90YXRpb25UYWcodGFnKTsKLQkJCXBhcnNlQXR0cmlidXRlcygpOwotCQkJaGFuZGxlci5lbmRPZlRhZyhlbmRPZkxhc3RHb29kQXR0UGFyc2UpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDMxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ2xvbmVhYmxlUHVibGljOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ2xvbmVhYmxlUHVibGljIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRCA9ICJnZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX1RZUEUgPSBBbm5vdGF0aW9uc0FkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgTk9USUZJQ0FUSU9OX0ZFQVRVUkUgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCgpIHsKLQkJLy8gYW5vbnltb3VzIGlubmVyIGNsYXNzCi0JfTsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zTWFwOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvLyB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQkvL3JldHVybiBzdXBlci5jbG9uZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbWZPYmplY3QpOwotCQlhZGFwdGVyLmFkZEFubm90YXRpb25zKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGludGVybmFsR2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJcmV0dXJuIChhZGFwdGVyID09IG51bGwpID8gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QuZUNvbnRhaW5lcigpLCBuYW1lKSA6IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMobmFtZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyLnJlbW92ZUFubm90YXRpb25zKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlnZXRBbm5ub3RhdGlvbnMoKS5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm5vdGF0aW9ucygpLmdldChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5ub3RhdGlvbnMoKS5yZW1vdmUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0QW5ubm90YXRpb25zKCkgewotCQlpZiAoYW5ub3RhdGlvbnNNYXAgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKGVtZk9iamVjdCkgOiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IG5ldyBBbm5vdGF0aW9uc0FkYXB0ZXIoKTsKLQkJYWRhcHRlci5zZXRUYXJnZXQoZW1mT2JqZWN0KTsKLQkJZW1mT2JqZWN0LmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFubm90YXRpb25zQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gKEFubm90YXRpb25zQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihlbWZPYmplY3QsIEFEQVBURVJfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI4Mjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25zQ29yZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiYW5ub3RhdGlvbmNvcmUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdTcGVjXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnU3BlY180OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ0F0dHJpYlNwZWNfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUGFyc2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblRhZ1BhcnNlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdSZWdpc3RyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdSZWdpc3RyeV85OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk4YjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIoKTsKLQkKLQlzdGF0aWMgewotCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3IgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QVF9QTFVHSU4gPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OU19QUk9WSURFUiA9ICJhbm5vdGF0aW9uc1Byb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLQotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgSUFubm90YXRpb25zUHJvdmlkZXIgY3JlYXRlSW5zdGFuY2UoKSB7Ci0JCQlJQW5ub3RhdGlvbnNQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKElBbm5vdGF0aW9uc1Byb3ZpZGVyKSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NOQU1FKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgYW5ub3RhdGlvbnNQcm92aWRlcnM7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlcigpIHsKLQkJc3VwZXIoRGVzY3JpcHRvci5FWFRFTlNJT05fUFRfUExVR0lOLCBEZXNjcmlwdG9yLkFOTk9UQVRJT05TX1BST1ZJREVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRGVzY3JpcHRvci5BTk5PVEFUSU9OU19QUk9WSURFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWFkZEFubm90YXRpb25zUHJvdmlkZXIobmV3IERlc2NyaXB0b3IoZWxlbWVudCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uc1Byb3ZpZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQW5ub3RhdGlvbnNQcm92aWRlciBwcm92aWRlciA9IGRlc2NyaXB0b3IuY3JlYXRlSW5zdGFuY2UoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQlnZXRBbm5vdGF0aW9uc1Byb3ZpZGVycygpLmFkZChwcm92aWRlcik7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbnNQcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbnNQcm92aWRlcnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9uc1Byb3ZpZGVycyA9PSBudWxsKQotCQkJYW5ub3RhdGlvbnNQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uc1Byb3ZpZGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTEwYWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgaGFuZGxlcjsKLQotCXByaXZhdGUgQW5ub3RhdGlvblRhZ1BhcnNlciBwYXJzZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25zVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCIjY29tbWVudCIsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFubm90YXRpb25zVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgc3R5bGUgfCBUcmFuc2xhdG9yLkNPTU1FTlRfRkVBVFVSRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5lbWYueG1sLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEhhbmRsZXIoKS5nZXRBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCWdldFBhcnNlcigpLnNldFBhcnNlcklucHV0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQlnZXRQYXJzZXIoKS5wYXJzZSgpOwotCQlTdHJpbmcgbmFtZTsKLQkJTWFwIGFubm90YXRpb25zID0gZ2V0SGFuZGxlcigpLmdldEFubm90YXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3Iga2V5cyA9IGFubm90YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGtleXMuaGFzTmV4dCgpOykgewotCQkJbmFtZSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVtZk9iamVjdCwgbmFtZSwgYW5ub3RhdGlvbnMuZ2V0KG5hbWUpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBnZXRNT0ZWYWx1ZShlbWZPYmplY3QpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3VuU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gKGFGZWF0dXJlID09IGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCWhhbmRsZXIgPSBuZXcgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJzZXIuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb25UYWdQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpCi0JCQlwYXJzZXIgPSBuZXcgQW5ub3RhdGlvblRhZ1BhcnNlcihnZXRIYW5kbGVyKCkpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0lBbm5vdGF0aW9uc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0lBbm5vdGF0aW9uc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWYzYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9JQW5ub3RhdGlvbnNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgY2xpZW50cyB0byBhbGxvdyB0aGVpciBvd24gYW5ub3RhdGlvbiBwcm92aWRlciB0byBkZXRhaWwgaW5mb3JtYXRpb24KLSAqIG9uIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gRU9iamVjdCBpcyBhbm5vdGF0ZWQgZm9yIG9uZSBvZiB0aGVpciB0YWcgc2V0cy4KLSAqIAotICogQGF1dGhvciBqbGFudXRpCi0gKiBAcGxhbm5lZCBmb3IgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25zUHJvdmlkZXIgewotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcGFzc2VkIEVPYmplY3QgaXMgYW5ub3RhdGVkIGJ5IHlvdXIgYW5ub3RhdGlvbiBwcm92aWRlcgotCSAqIAotCSAqIEBwbGFubmVkIGZvciAyLjAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZSBvZiBpc0Fubm90YXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFzc2VkIGVPYmplY3QgbWF5IGhhdmUgYmVlbiBhbm5vdGVkLiAgSWYgdHJ1ZSwgaXQgaXMgZGVzaXJlZCB0bwotCSAqIGRldGVybWluZSB3aGljaCB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gaGFzIHRoZSB0YWcgb3IgdGFncyB0aGF0IGNyZWF0ZWQKLQkgKiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGxhbm5lZCBmb3IgMi4wCi0JICogQHBhcmFtIGVPYmplY3QgLSBBbiB7QGxpbmsgRU9iamVjdH0gdGhhdCBtYXkgYmUgYW5ub3RhdGVkLgotCSAqIEByZXR1cm4gdGhlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSB0aGF0IGhhcyB0aGUgdGFnIHRoYXQgY3JlYXRlZCB0aGlzIGVPYmplY3QuCi0JICogCi0JICogQHNlZSAjZ2V0UHJpbWFyeVRhZ3NldChFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFByaW1hcnlBbm5vdGF0ZWRDb21waWxhdGlvblVuaXQoRU9iamVjdCBlT2JqZWN0KTsKLQotCS8qKgotCSAqIEl0IGlzIGRlc2lyZWQgdG8gb2J0YWluIHRoZSB0YWdzZXQgbmFtZSB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcGFzc2VkCi0JICogZU9iamVjdC4KLQkgKiAKLQkgKiBAcGxhbm5lZCBmb3IgMi4wCi0JICogQHBhcmFtIGVPYmplY3QgQW4ge0BsaW5rIEVPYmplY3R9IHdoaWNoIG1heSBiZSBhbm5vdGF0ZWQuCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGFnc2V0IHdoaWNoIGNyZWF0ZXMgdGhlIHBhc3NlZCBlT2JqZWN0LgotCSAqIAotCSAqIEBzZWUgI2dldFByaW1hcnlBbm5vdGF0ZWRDb21waWxhdGlvblVuaXQoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlUYWdzZXQoRU9iamVjdCBlT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVGFnUGFyc2VFdmVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVGFnUGFyc2VFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OTQxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotCi0vKioKLSAqIFBhcnNlciBhbmQgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgd2FudCB0byByZWNlaXZlIHBhcnNpbmcgZXZlbnRzLiBXaGVuIHBhcnNpbmcgaXMgc3RhcnRlZAotICogdGhyb3VnaCB0aGUgPGNvZGU+cGFyc2UoKTwvY29kZT4gbWV0aG9kLCBldmVudCBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIGludGVyZXN0aW5nIGZlYXR1cmVzIGluCi0gKiB0aGUgcGFyc2UuICggbGlrZSBhIFNBWCBDb250ZW50SGFuZGxlciApCi0gKiAKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBhbm5vdGF0aW9uIHRhZyBpcyBlbmNvdW50ZXJlZC4gVGhpcyB3aWxsIGFsd2F5cyBiZSB0aGUgZmlyc3QgcGllY2Ugb2YgY29udGVudAotCSAqIGVuY291bnRlcmVkLiBGb2xsb3dlZCBieSBhIGVuZE9mVGFnKCApIGNhbGwgd2hlbiB0aGUgZW5kIG9mIHRoZSB0YWcgaXMgcmVhY2hlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhbm5vdGF0aW9uVGFnKFRva2VuIHRhZyk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZW50aXJlIGFubm90YXRpb24gZm9yIGEgc2luZ2xlIHRhZyBoYXMgYmVlbiBwYXJzZWQuCi0JICogCi0JICogQHBhcmFtIHBvcwotCSAqICAgICAgICAgICAgUG9zaXRpb24gaW4gdGhlIHN0cmVhbSBvZiB0aGUgZW5kIG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpOwotCi0JLyoqCi0JICogQ2FsbGVkIGZvciBldmVyeSBhdHRyaWJ1dGUgc2V0dGluZyBlbmNvdW50ZXJlZCBmb3IgYW4gYW5ub3RhdGlvbiB0YWcuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gZXF1YWxzUG9zaXRpb24KLQkgKiAgICAgICAgICAgIFNvdXJjZSBwb3NpdGlvbiBvZiB0aGUgZXF1YWxzIHNpZ24sIG9yIC0xIGlmIG5vIGVxdWFscyBzaWduIHdhcyBmb3VuZC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIHdpdGggYW55IHF1b3RlcyBzdHJpcHBlZCBvZmYuIFdpbGwgYmUgemVybyBsZW5ndGggdG9rZW4gaWYKLQkgKiAgICAgICAgICAgIG5vIGF0dHJpYnV0ZSB3YXMgZm91bmQuCi0JICovCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFRva2VuIG5hbWUsIGludCBlcXVhbHNQb3NpdGlvbiwgVG9rZW4gdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMzEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLS8qKgotICogQSBzdHJpbmcsIGFuZCB0aGUgcmFuZ2UgaXQgd2FzIHRha2VuIGZyb20gaW4gdGhlIHNvdXJjZSBmaWxlLiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlLiAoaWUsIHdpdGgKLSAqIHNvdXJjZSAiQUJDRCIsIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBmb3IgdGhlIFRva2VuICJCQyIgd291bGQgYmUgKDEsMikgKQotICogCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRva2VuIHsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IGJlZ2lubmluZzsKLQlwcml2YXRlIGludCBlbmQ7Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBQb3NpdGlvbiBpbiBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QmVnaW5uaW5nKCkgewotCQlyZXR1cm4gYmVnaW5uaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB0b2tlbiBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgQSBzb3VyY2UgcG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWdpbm5pbmcoaW50IGkpIHsKLQkJYmVnaW5uaW5nID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgQSBzb3VyY2UgcG9zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kKGludCBpKSB7Ci0JCWVuZCA9IGk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgewotCQl0ZXh0ID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gdGV4dC5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIDxjb2RlPnNyY1BvczwvY29kZT4gY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoaXMgdG9rZW4uCi0JICogCi0JICogQHBhcmFtIHNyY1BvcwotCSAqICAgICAgICAgICAgQSBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoZSB0b2tlbiBjYW1lIGZyb20uCi0JICogQHJldHVybiB0cnVlIGlmIHNyY1BvcyBjb21lcyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIHRva2VuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltbWVkaWF0ZWx5UHJlY2VkZXMoaW50IHNyY1BvcykgewotCQlyZXR1cm4gZW5kICsgMSA9PSBzcmNQb3M7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciBzcmNQb3MgaXMgd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgcmFuZ2UgcmFuZ2Ugb2YgdGhlIHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSBzcmNQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHNyY1BvcykgewotCQlyZXR1cm4gc3JjUG9zID49IGJlZ2lubmluZyAmJiBzcmNQb3MgPD0gZW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRjNzk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0L2NvbW1vbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjAzNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotdWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjg1NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0NzkyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNiAxNzoxNToxMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MTkzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IEp1biAwMiAxNzowNjo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDNlYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBdWcgMjAgMTY6MDc6MzUgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzE0MDJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1N1biBBdWcgMjAgMDQ6MzA6NTEgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQzNjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNTdW4gQXVnIDIwIDE2OjA3OjM1IEVEVCAyMDA2Ci1ERUxFR0FURVNfUFJFRkVSRU5DRT1kZWxlZ2F0ZVZhbGlkYXRvckxpc3RvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuV1NETERlbGVnYXRpbmdWYWxpZGF0b3JcPW9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5WYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yXD1vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcjsKLVVTRVJfQlVJTERfUFJFRkVSRU5DRT1lbmFibGVkQnVpbGRWYWxpZGF0b3JMaXN0b3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lNZXNzYWdlVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yO29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUERpcmVjdGl2ZVZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uLkhUTUxWYWxpZGF0b3I7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3I7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRUxWYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLldTRExEZWxlZ2F0aW5nVmFsaWRhdG9yOwotVVNFUl9NQU5VQUxfUFJFRkVSRU5DRT1lbmFibGVkTWFudWFsVmFsaWRhdG9yTGlzdG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJTWVzc2FnZVZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcjtvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BEaXJlY3RpdmVWYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yO29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEphdmFWYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yO29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5XU0RMRGVsZWdhdGluZ1ZhbGlkYXRvcjsKLVVTRVJfUFJFRkVSRU5DRT1vdmVycmlkZUdsb2JhbFByZWZlcmVuY2VzZmFsc2UKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NzRjNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUFubm90YXRpb25zX1VJXwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMi5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkuVWlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVFY2xpcHNlX1VJXwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc3d0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYWZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLgotc3JjLmluY2x1ZGVzPXNjaGVtYS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjE0MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1Bbm5vdGF0aW9uc0NvbXBsZXRpb25Qcm9jZXNzb3I9QW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yCi1Bbm5vdGF0aW9uc19VSV89QW5ub3RhdGlvbnMgVUkgUGx1Zy1pbgotRWNsaXBzZV9VSV89RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE5NmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvciI+Ci0gICAgICA8amF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IKLSAgICAgICAgICAgIG5hbWU9IiVBbm5vdGF0aW9uc0NvbXBsZXRpb25Qcm9jZXNzb3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aS5Bbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MiCi0gICAgICAgICAgICBpZD0iQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yIj4KLSAgICAgIDwvamF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDkxOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMudWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3Byb3BlcnR5X2ZpbGVzL3RhZ2hhbmRsZXJ1aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3Byb3BlcnR5X2ZpbGVzL3RhZ2hhbmRsZXJ1aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDI5MDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcm9wZXJ0eV9maWxlcy90YWdoYW5kbGVydWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSjJFRUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3Nvcl8zPUVycm9yIHBhcnNpbmcgYXR0cmlidXRlcyAtIHdhcyBleHBlY2luZyBhICc9JyBidXQgZm91bmQgJwotSjJFRUFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3Nvcl80PScgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zY2hlbWEvQW5ub3RhdGlvblVJLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc2NoZW1hL0Fubm90YXRpb25VSS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FmOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zY2hlbWEvQW5ub3RhdGlvblVJLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIiBpZD0iQW5ub3RhdGlvblVJIiBuYW1lPSJBbm5vdGF0aW9uVUkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciBlbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgYW4gZXhpc3RpbmcgdGFnIHNldC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkF1dG9Db21wbGV0ZURhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iQXV0b0NvbXBsZXRlRGF0YSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRW5hYmxlcyBjb250ZW50IGFzc2lzdCBmb3IgYSBzaW5nbGUgdGFnIHNldC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhZ1NldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSB0YWcgc2V0IGNvZGUgYXNzaXN0IHNob3VsZCBiZSBlbmFibGVkIGZvci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fic3RyYWN0QW5ub3RhdGlvblRhZ1Byb3Bvc2FsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQWJzdHJhY3RBbm5vdGF0aW9uVGFnUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxYTc3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQWJzdHJhY3RBbm5vdGF0aW9uVGFnUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuSUxpbmtlZE1vZGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUkuRXhpdEZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUkuSUV4aXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLmxpbmsuRWRpdG9yTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25UYWdQcm9wb3NhbCB7Ci0JLyoqCi0JICogQSBjbGFzcyB0byBzaW1wbGlmeSB0cmFja2luZyBhIHJlZmVyZW5jZSBwb3NpdGlvbiBpbiBhIGRvY3VtZW50LgotCSAqLwotCXN0YXRpYyBmaW5hbCBjbGFzcyBSZWZlcmVuY2VUcmFja2VyIHsKLQkKLQkJLyoqIFRoZSByZWZlcmVuY2UgcG9zaXRpb24gY2F0ZWdvcnkgbmFtZS4gKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZPSAicmVmZXJlbmNlX3Bvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvKiogVGhlIHBvc2l0aW9uIHVwZGF0ZXIgb2YgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbi4gKi8KLQkJcHJpdmF0ZSBmaW5hbCBJUG9zaXRpb25VcGRhdGVyIGZQb3NpdGlvblVwZGF0ZXI9IG5ldyBEZWZhdWx0UG9zaXRpb25VcGRhdGVyKENBVEVHT1JZKTsKLQkJLyoqIFRoZSByZWZlcmVuY2UgcG9zaXRpb24uICovCi0JCXByaXZhdGUgZmluYWwgUG9zaXRpb24gZlBvc2l0aW9uPSBuZXcgUG9zaXRpb24oMCk7Ci0JCi0JCS8qKgotCQkgKiBDYWxsZWQgYmVmb3JlIGRvY3VtZW50IGNoYW5nZXMgb2NjdXIuIEl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHBvc3RSZXBsYWNlKCkuCi0JCSAqCi0JCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdG8gdHJhY2sgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbi4KLQkJICoKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByZVJlcGxhY2UoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkJZlBvc2l0aW9uLnNldE9mZnNldChvZmZzZXQpOwotCQkJdHJ5IHsKLQkJCQlkb2N1bWVudC5hZGRQb3NpdGlvbkNhdGVnb3J5KENBVEVHT1JZKTsKLQkJCQlkb2N1bWVudC5hZGRQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0JCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oQ0FURUdPUlksIGZQb3NpdGlvbik7Ci0JCi0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaG91bGQgbm90IGhhcHBlbgotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIENhbGxlZCBhZnRlciB0aGUgZG9jdW1lbnQgY2hhbmdlZCBvY2N1cnJlZC4gSXQgbXVzdCBiZSBwcmVjZWRlZCBieSBhIGNhbGwgdG8gcHJlUmVwbGFjZSgpLgotCQkgKgotCQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRvIHRyYWNrIHRoZSByZWZlcmVuY2UgcG9zaXRpb24uCi0JCSAqLwotCQlwdWJsaWMgaW50IHBvc3RSZXBsYWNlKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJdHJ5IHsKLQkJCQlkb2N1bWVudC5yZW1vdmVQb3NpdGlvbihDQVRFR09SWSwgZlBvc2l0aW9uKTsKLQkJCQlkb2N1bWVudC5yZW1vdmVQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0JCQkJZG9jdW1lbnQucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShDQVRFR09SWSk7Ci0JCi0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaG91bGQgbm90IGhhcHBlbgotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlBvc2l0aW9uLmdldE9mZnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBFeGl0UG9saWN5IGltcGxlbWVudHMgSUV4aXRQb2xpY3kgewotCQotCQlmaW5hbCBjaGFyIGZFeGl0Q2hhcmFjdGVyOwotCQlwcml2YXRlIGZpbmFsIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JCi0JCXB1YmxpYyBFeGl0UG9saWN5KGNoYXIgZXhpdENoYXJhY3RlciwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRXhpdENoYXJhY3Rlcj0gZXhpdENoYXJhY3RlcjsKLQkJCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCX0KLQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uVUkuRXhpdFBvbGljeSNkb0V4aXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQubGluay5MaW5rZWRQb3NpdGlvbk1hbmFnZXIsIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQsIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIEV4aXRGbGFncyBkb0V4aXQoTGlua2VkTW9kZU1vZGVsIGVudmlyb25tZW50LCBWZXJpZnlFdmVudCBldmVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQotCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBmRXhpdENoYXJhY3RlcikgewotCQkJCWlmIChlbnZpcm9ubWVudC5hbnlQb3NpdGlvbkNvbnRhaW5zKG9mZnNldCkpCi0JCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuVVBEQVRFX0NBUkVULCBmYWxzZSk7Ci0JCQkJcmV0dXJuIG5ldyBFeGl0RmxhZ3MoSUxpbmtlZE1vZGVMaXN0ZW5lci5VUERBVEVfQ0FSRVQsIHRydWUpOwotCQkJfQotCQotCQkJc3dpdGNoIChldmVudC5jaGFyYWN0ZXIpIHsKLQkJCQljYXNlICc7JzoKLQkJCQkJcmV0dXJuIG5ldyBFeGl0RmxhZ3MoSUxpbmtlZE1vZGVMaXN0ZW5lci5OT05FLCB0cnVlKTsKLQkJCQljYXNlIFNXVC5DUjoKLQkJCQkJLy8gd2hlbiBlbnRlcmluZyBhbiBhbm9ueW1vdXMgY2xhc3MgYXMgYSBwYXJhbWV0ZXIsIHdlIGRvbid0IHdhbnQKLQkJCQkJLy8gdG8ganVtcCBhZnRlciB0aGUgcGFyZW50aGVzaXMgd2hlbiByZXR1cm4gaXMgcHJlc3NlZAotCQkJCQlpZiAob2Zmc2V0ID4gMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAoZkRvY3VtZW50LmdldENoYXIob2Zmc2V0IC0gMSkgPT0gJ3snKQotCQkJCQkJCQlyZXR1cm4gbmV3IEV4aXRGbGFncyhJTGlua2VkTW9kZUxpc3RlbmVyLkVYSVRfQUxMLCB0cnVlKTsKLQkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBmYWxsIHRocm91Z2gKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgU3RyaW5nIGZSZXBsYWNlbWVudFN0cmluZzsKLQlwcml2YXRlIGludCBmUmVwbGFjZW1lbnRPZmZzZXQ7Ci0JcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoOwotCXByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbjsKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkNvbnRleHRJbmZvcm1hdGlvbjsKLQkvL3ByaXZhdGUgUHJvcG9zYWxJbmZvIGZQcm9wb3NhbEluZm87Ci0JcHJpdmF0ZSBjaGFyW10gZlRyaWdnZXJDaGFyYWN0ZXJzOwotCXByaXZhdGUgU3RyaW5nIGZTb3J0U3RyaW5nOwotCXByaXZhdGUgaW50IGZSZWxldmFuY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luSmF2YWRvYzsKLQkKLQlwcml2YXRlIFN0eWxlUmFuZ2UgZlJlbWVtYmVyZWRTdHlsZVJhbmdlOwotCXByaXZhdGUgYm9vbGVhbiBmVG9nZ2xlRWF0aW5nOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0JCi0JLyoqCi0JICogVGhlIFVSTCBvZiB0aGUgc3R5bGUgc2hlZXQgKGNzcykuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByaXZhdGUgVVJMIGZTdHlsZVNoZWV0VVJMOwkKLQotCXByb3RlY3RlZCBBYnN0cmFjdEFubm90YXRpb25UYWdQcm9wb3NhbCgpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiNnZXRUcmlnZ2VyQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRUcmlnZ2VyQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGZUcmlnZ2VyQ2hhcmFjdGVyczsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSB0cmlnZ2VyQ2hhcmFjdGVycyBUaGUgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIHRyaWdnZXIgdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMKLQkgKiAgICAgICAgY29tcGxldGlvbiBwcm9wb3NhbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyaWdnZXJDaGFyYWN0ZXJzKGNoYXJbXSB0cmlnZ2VyQ2hhcmFjdGVycykgewotCQlmVHJpZ2dlckNoYXJhY3RlcnM9IHRyaWdnZXJDaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb3Bvc2FsIGluZm8uCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsSW5mbyBUaGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wb3NhbCBvcgotCSAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotLy8JcHVibGljIHZvaWQgc2V0UHJvcG9zYWxJbmZvKFByb3Bvc2FsSW5mbyBwcm9wb3NhbEluZm8pIHsKLS8vCQlmUHJvcG9zYWxJbmZvPSBwcm9wb3NhbEluZm87Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhZGRpdGlvbmFsIHByb3Bvc2FsIGluZm8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMKLQkgKi8KLS8vCXByb3RlY3RlZCBQcm9wb3NhbEluZm8gZ2V0UHJvcG9zYWxJbmZvKCkgewotLy8JCXJldHVybiBmUHJvcG9zYWxJbmZvOwotLy8JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBpbnNlcnRpb24gb2Zmc2V0LiBCeSBkZWZhdWx0IHRoaXMgaXMgdGhlIGxlbmd0aCBvZgotCSAqIHRoZSBjb21wbGV0aW9uIHN0cmluZyAoQ3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIGNvbXBsZXRpb24pCi0JICogCi0JICogQHBhcmFtIGN1cnNvclBvc2l0aW9uIFRoZSBjdXJzb3JQb3NpdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShjdXJzb3JQb3NpdGlvbiA+PSAwKTsKLQkJZkN1cnNvclBvc2l0aW9uPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbXBsZXRpb25Qcm9wb3NhbCNhcHBseQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBub3QgdXNlZCBhbnkgbG9uZ2VyCi0JCWFwcGx5KGRvY3VtZW50LCAoY2hhcikgMCwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGNoYXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQsIGNoYXIgdHJpZ2dlciwgaW50IG9mZnNldCkgewotCQl0cnkgewotCQkJLy8gcGF0Y2ggcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCQlpbnQgZGVsdGE9IG9mZnNldCAtIChnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSk7Ci0JCQlpZiAoZGVsdGEgPiAwKQotCQkJCXNldFJlcGxhY2VtZW50TGVuZ3RoKGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgKyBkZWx0YSk7Ci0JCi0JCQlib29sZWFuIGlzU21hcnRUcmlnZ2VyPSBpc1NtYXJ0VHJpZ2dlcih0cmlnZ2VyKTsKLQkKLQkJCVN0cmluZyByZXBsYWNlbWVudDsKLQkJCWlmIChpc1NtYXJ0VHJpZ2dlciB8fCB0cmlnZ2VyID09IChjaGFyKSAwKSB7Ci0JCQkJcmVwbGFjZW1lbnQ9IGdldFJlcGxhY2VtZW50U3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSk7Ci0JCi0JCQkJLy8gZml4IGZvciBQUiAjNTUzMy4gQXNzdW1lcyB0aGF0IG5vIGVhdGluZyB0YWtlcyBwbGFjZS4KLQkJCQlpZiAoKGdldEN1cnNvclBvc2l0aW9uKCkgPiAwICYmIGdldEN1cnNvclBvc2l0aW9uKCkgPD0gYnVmZmVyLmxlbmd0aCgpICYmIGJ1ZmZlci5jaGFyQXQoZ2V0Q3Vyc29yUG9zaXRpb24oKSAtIDEpICE9IHRyaWdnZXIpKSB7Ci0JCQkJCWJ1ZmZlci5pbnNlcnQoZ2V0Q3Vyc29yUG9zaXRpb24oKSwgdHJpZ2dlcik7Ci0JCQkJCXNldEN1cnNvclBvc2l0aW9uKGdldEN1cnNvclBvc2l0aW9uKCkgKyAxKTsKLQkJCQl9Ci0JCi0JCQkJcmVwbGFjZW1lbnQ9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCXNldFJlcGxhY2VtZW50U3RyaW5nKHJlcGxhY2VtZW50KTsKLQkJCX0KLQkKLQkJCS8vIHJlZmVyZW5jZSBwb3NpdGlvbiBqdXN0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGNoYW5nZS4KLQkJCWludCByZWZlcmVuY2VPZmZzZXQ9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJZmluYWwgUmVmZXJlbmNlVHJhY2tlciByZWZlcmVuY2VUcmFja2VyPSBuZXcgUmVmZXJlbmNlVHJhY2tlcigpOwotCQkJcmVmZXJlbmNlVHJhY2tlci5wcmVSZXBsYWNlKGRvY3VtZW50LCByZWZlcmVuY2VPZmZzZXQpOwotCQotCQkJcmVwbGFjZShkb2N1bWVudCwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcmVwbGFjZW1lbnQpOwotCQotCQkJcmVmZXJlbmNlT2Zmc2V0PSByZWZlcmVuY2VUcmFja2VyLnBvc3RSZXBsYWNlKGRvY3VtZW50KTsKLQkJCXNldFJlcGxhY2VtZW50T2Zmc2V0KHJlZmVyZW5jZU9mZnNldCAtIChyZXBsYWNlbWVudCA9PSBudWxsID8gMCA6IHJlcGxhY2VtZW50Lmxlbmd0aCgpKSk7Ci0JCi0JCQkvLyBQUiA0NzA5NwotCQkJaWYgKGlzU21hcnRUcmlnZ2VyKQotCQkJCWhhbmRsZVNtYXJ0VHJpZ2dlcihkb2N1bWVudCwgdHJpZ2dlciwgcmVmZXJlbmNlT2Zmc2V0KTsKLQkKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydFRyaWdnZXIoY2hhciB0cmlnZ2VyKSB7Ci0JCXJldHVybiB0cmlnZ2VyID09ICc7JyAmJiBnZXRCb29sZWFuUHJlZmVyZW5jZShQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TTUFSVF9TRU1JQ09MT04pCi0JCQkJfHwgdHJpZ2dlciA9PSAneycgJiYgZ2V0Qm9vbGVhblByZWZlcmVuY2UoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU01BUlRfT1BFTklOR19CUkFDRSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuUHJlZmVyZW5jZShTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlTdHJpbmcgdmFsdWUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2UocHJlZmVyZW5jZUtleSwgZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTbWFydFRyaWdnZXIoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCByZWZlcmVuY2VPZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50Q29tbWFuZCBjbWQ9IG5ldyBEb2N1bWVudENvbW1hbmQoKSB7Ci0JCX07Ci0JCQotCQljbWQub2Zmc2V0PSByZWZlcmVuY2VPZmZzZXQ7Ci0JCWNtZC5sZW5ndGg9IDA7Ci0JCWNtZC50ZXh0PSBDaGFyYWN0ZXIudG9TdHJpbmcodHJpZ2dlcik7Ci0JCWNtZC5kb2l0PSB0cnVlOwotCQljbWQuc2hpZnRzQ2FyZXQ9IHRydWU7Ci0JCWNtZC5jYXJldE9mZnNldD0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldEN1cnNvclBvc2l0aW9uKCk7Ci0JCQotLy8JCVNtYXJ0U2VtaWNvbG9uQXV0b0VkaXRTdHJhdGVneSBzdHJhdGVneT0gbmV3IFNtYXJ0U2VtaWNvbG9uQXV0b0VkaXRTdHJhdGVneShJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcpOwotLy8JCXN0cmF0ZWd5LmN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChkb2N1bWVudCwgY21kKTsKLQkJCi0JCXJlcGxhY2UoZG9jdW1lbnQsIGNtZC5vZmZzZXQsIGNtZC5sZW5ndGgsIGNtZC50ZXh0KTsKLQkJc2V0Q3Vyc29yUG9zaXRpb24oY21kLmNhcmV0T2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGNtZC50ZXh0Lmxlbmd0aCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVwbGFjZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmcpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghZG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKS5lcXVhbHMoc3RyaW5nKSkKLQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjEjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAoZlRleHRWaWV3ZXIgPT0gbnVsbCkKLQkJCWZUZXh0Vmlld2VyPSB2aWV3ZXI7Ci0JCQotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MDU5Ci0JCS8vIGRvbid0IGFwcGx5IHRoZSBwcm9wb3NhbCBpZiBmb3Igc29tZSByZWFzb24gd2UncmUgbm90IHZhbGlkIGFueSBsb25nZXIKLQkJaWYgKCFpc0luSmF2YWRvYygpICYmICF2YWxpZGF0ZShkb2N1bWVudCwgb2Zmc2V0LCBudWxsKSkgewotCQkJc2V0Q3Vyc29yUG9zaXRpb24ob2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSk7Ci0JCQlpZiAodHJpZ2dlciAhPSAnXDAnKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQsIDAsIFN0cmluZy52YWx1ZU9mKHRyaWdnZXIpKTsKLQkJCQkJc2V0Q3Vyc29yUG9zaXRpb24oZ2V0Q3Vyc29yUG9zaXRpb24oKSArIDEpOwotCQkJCQlpZiAodHJpZ2dlciA9PSAnKCcgJiYgYXV0b2Nsb3NlQnJhY2tldHMoKSkgewotCQkJCQkJZG9jdW1lbnQucmVwbGFjZShnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgZ2V0Q3Vyc29yUG9zaXRpb24oKSwgMCwgIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc2V0VXBMaW5rZWRNb2RlKGRvY3VtZW50LCAnKScpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkb24ndCBlYXQgaWYgbm90IGluIHByZWZlcmVuY2VzLCBYT1Igd2l0aCBtb2RpZmllciBrZXkgMSAoQ3RybCkKLQkJLy8gYnV0OiBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiwgcmVwbGFjZSBpdCEKLQkJUG9pbnQgc2VsZWN0aW9uPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQlmVG9nZ2xlRWF0aW5nPSAoc3RhdGVNYXNrICYgU1dULk1PRDEpICE9IDA7Ci0JCWludCBuZXdMZW5ndGg9IHNlbGVjdGlvbi54ICsgc2VsZWN0aW9uLnkgLSBnZXRSZXBsYWNlbWVudE9mZnNldCgpOwotCQlpZiAoKGluc2VydENvbXBsZXRpb24oKSBeIGZUb2dnbGVFYXRpbmcpICYmIG5ld0xlbmd0aCA+PSAwKQotCQkJc2V0UmVwbGFjZW1lbnRMZW5ndGgobmV3TGVuZ3RoKTsKLQotCQlhcHBseShkb2N1bWVudCwgdHJpZ2dlciwgb2Zmc2V0KTsKLQkJZlRvZ2dsZUVhdGluZz0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zYWwgaXMgd2l0aGluIGphdmFkb2MsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wb3NhbCBpcyB3aXRoaW4gamF2YWRvYywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5KYXZhZG9jKCl7Ci0JCXJldHVybiBmSXNJbkphdmFkb2M7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFkb2MgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpc0luSmF2YWRvYyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zYWwgaXMgd2l0aGluIGphdmFkb2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbkphdmFkb2MoYm9vbGVhbiBpc0luSmF2YWRvYykgewotCQlmSXNJbkphdmFkb2M9IGlzSW5KYXZhZG9jOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldEN1cnNvclBvc2l0aW9uKCksIDApOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29tcGxldGlvblByb3Bvc2FsI2dldENvbnRleHRJbmZvcm1hdGlvbigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQlyZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBjb250ZXh0SW5mb3JtYXRpb24gVGhlIGNvbnRleHQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcG9zYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24pIHsKLQkJZkNvbnRleHRJbmZvcm1hdGlvbj0gY29udGV4dEluZm9ybWF0aW9uOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0vLwkJaWYgKGdldFByb3Bvc2FsSW5mbygpICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGluZm89IGdldFByb3Bvc2FsSW5mbygpLmdldEluZm8obnVsbCk7Ci0vLwkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwLCBnZXRTdHlsZVNoZWV0VVJMKCkpOwotLy8JCQkJYnVmZmVyLmFwcGVuZChpbmZvKTsKLS8vCQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLS8vCQkJCWluZm89IGJ1ZmZlci50b1N0cmluZygpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBpbmZvOwotLy8JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0vLwkJaWYgKGdldFByb3Bvc2FsSW5mbygpICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGluZm89IGdldFByb3Bvc2FsSW5mbygpLmdldEluZm8obW9uaXRvcik7Ci0vLwkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwLCBnZXRTdHlsZVNoZWV0VVJMKCkpOwotLy8JCQkJYnVmZmVyLmFwcGVuZChpbmZvKTsKLS8vCQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLS8vCQkJCWluZm89IGJ1ZmZlci50b1N0cmluZygpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBpbmZvOwotLy8JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0eWxlIHNoZWV0IFVSTC4KLQkgKgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVVJMIGdldFN0eWxlU2hlZXRVUkwoKSB7Ci0JCWlmIChmU3R5bGVTaGVldFVSTCA9PSBudWxsKSB7Ci0KLQkJCUJ1bmRsZSBidW5kbGU9IFBsYXRmb3JtLmdldEJ1bmRsZShKYXZhVUkuSURfUExVR0lOKTsKLQkJCWZTdHlsZVNoZWV0VVJMPSBidW5kbGUuZ2V0RW50cnkoIi9KYXZhZG9jSG92ZXJTdHlsZVNoZWV0LmNzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZlN0eWxlU2hlZXRVUkwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZTdHlsZVNoZWV0VVJMPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoZlN0eWxlU2hlZXRVUkwpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0eWxlU2hlZXRVUkw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKSB7Ci0JCWlmIChnZXRDb250ZXh0SW5mb3JtYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgLSAxOwotCQlyZXR1cm4gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldEN1cnNvclBvc2l0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVwbGFjZW1lbnQgb2Zmc2V0LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVwbGFjZW1lbnQgb2Zmc2V0LgotCSAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldCBUaGUgcmVwbGFjZW1lbnQgb2Zmc2V0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50T2Zmc2V0KGludCByZXBsYWNlbWVudE9mZnNldCkgewotCQlBc3NlcnQuaXNUcnVlKHJlcGxhY2VtZW50T2Zmc2V0ID49IDApOwotCQlmUmVwbGFjZW1lbnRPZmZzZXQ9IHJlcGxhY2VtZW50T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMjZ2V0Q29tcGxldGlvbk9mZnNldCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmVmaXhDb21wbGV0aW9uU3RhcnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgY29tcGxldGlvbk9mZnNldCkgewotCQlyZXR1cm4gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXBsYWNlbWVudCBsZW5ndGguCi0JICogQHJldHVybiBSZXR1cm5zIGEgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXBsYWNlbWVudCBsZW5ndGguCi0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoIFRoZSByZXBsYWNlbWVudExlbmd0aCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudExlbmd0aChpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShyZXBsYWNlbWVudExlbmd0aCA+PSAwKTsKLQkJZlJlcGxhY2VtZW50TGVuZ3RoPSByZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXBsYWNlbWVudCBzdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXBsYWNlbWVudCBzdHJpbmcuCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nIFRoZSByZXBsYWNlbWVudCBzdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nKSB7Ci0JCUFzc2VydC5pc05vdE51bGwocmVwbGFjZW1lbnRTdHJpbmcpOwotCQlmUmVwbGFjZW1lbnRTdHJpbmc9IHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMjZ2V0UmVwbGFjZW1lbnRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFByZWZpeENvbXBsZXRpb25UZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGNvbXBsZXRpb25PZmZzZXQpIHsKLQkJaWYgKCFpc0NhbWVsQ2FzZU1hdGNoaW5nKCkpCi0JCQlyZXR1cm4gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKTsKLQkJCi0JCVN0cmluZyBwcmVmaXg9IGdldFByZWZpeChkb2N1bWVudCwgY29tcGxldGlvbk9mZnNldCk7Ci0JCXJldHVybiBnZXRDYW1lbENhc2VDb21wb3VuZChwcmVmaXgsIGdldFJlcGxhY2VtZW50U3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UuCi0JICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlmSW1hZ2U9IGltYWdlOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uI2lzVmFsaWRGb3IoSURvY3VtZW50LCBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZEZvcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlKGRvY3VtZW50LCBvZmZzZXQsIG51bGwpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCi0JCWlmIChvZmZzZXQgPCBnZXRSZXBsYWNlbWVudE9mZnNldCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJYm9vbGVhbiB2YWxpZGF0ZWQ9IGlzVmFsaWRQcmVmaXgoZ2V0UHJlZml4KGRvY3VtZW50LCBvZmZzZXQpKTsKLQotCQlpZiAodmFsaWRhdGVkICYmIGV2ZW50ICE9IG51bGwpIHsKLQkJCS8vIGFkYXB0IHJlcGxhY2VtZW50IHJhbmdlIHRvIGRvY3VtZW50IGNoYW5nZQotCQkJaW50IGRlbHRhPSAoZXZlbnQuZlRleHQgPT0gbnVsbCA/IDAgOiBldmVudC5mVGV4dC5sZW5ndGgoKSkgLSBldmVudC5mTGVuZ3RoOwotCQkJZmluYWwgaW50IG5ld0xlbmd0aD0gTWF0aC5tYXgoZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSArIGRlbHRhLCAwKTsKLQkJCXNldFJlcGxhY2VtZW50TGVuZ3RoKG5ld0xlbmd0aCk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdGVkOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnByZWZpeDwvY29kZT4gaXMgYSB2YWxpZCBwcmVmaXggZm9yIHRoaXMgcHJvcG9zYWwuIFVzdWFsbHksIHdoaWxlIGNvZGUKLQkgKiBjb21wbGV0aW9uIGlzIGluIHByb2dyZXNzLCB0aGUgdXNlciB0eXBlcyBhbmQgZWRpdHMgdGhlIHByZWZpeCBpbiB0aGUgZG9jdW1lbnQgaW4gb3JkZXIgdG8KLQkgKiBmaWx0ZXIgdGhlIHByb3Bvc2FsIGxpc3QuIEZyb20ge0BsaW5rICN2YWxpZGF0ZShJRG9jdW1lbnQsIGludCwgRG9jdW1lbnRFdmVudCkgfSwgdGhlCi0JICogY3VycmVudCBwcmVmaXggaW4gdGhlIGRvY3VtZW50IGlzIGV4dHJhY3RlZCBhbmQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlCi0JICogcHJvcG9zYWwgaXMgc3RpbGwgdmFsaWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2hlY2tzIGlmIDxjb2RlPnByZWZpeDwvY29kZT4gaXMgYSBwcmVmaXggb2YgdGhlIHByb3Bvc2FsJ3MKLQkgKiB7QGxpbmsgI2dldERpc3BsYXlTdHJpbmcoKSBkaXNwbGF5IHN0cmluZ30gdXNpbmcgdGhlIHtAbGluayAjaXNQcmVmaXgoU3RyaW5nLCBTdHJpbmcpIH0KLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcmVmaXggdGhlIGN1cnJlbnQgcHJlZml4IGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcyBhIHZhbGlkIHByZWZpeCBvZiB0aGlzIHByb3Bvc2FsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCS8qCi0JCSAqIFNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjY3Ci0JCSAqIHdoeSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcuCi0JCSAqIFN0cmluZyB3b3JkPSBmUmVwbGFjZW1lbnRTdHJpbmc7Ci0JCSAqLwotCQlyZXR1cm4gaXNQcmVmaXgocHJlZml4LCBnZXREaXNwbGF5U3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByb3Bvc2FsJ3MgcmVsZXZhbmNlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVsZXZhbmNlKCkgewotCQlyZXR1cm4gZlJlbGV2YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9wb3NhbCdzIHJlbGV2YW5jZS4KLQkgKiBAcGFyYW0gcmVsZXZhbmNlIFRoZSByZWxldmFuY2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsZXZhbmNlKGludCByZWxldmFuY2UpIHsKLQkJZlJlbGV2YW5jZT0gcmVsZXZhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgaW4gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZyb20ge0BsaW5rICNnZXRSZXBsYWNlbWVudE9mZnNldCgpfSB0bwotCSAqIDxjb2RlPm9mZnNldDwvY29kZT4uIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGJlZm9yZSB0aGUKLQkgKiByZXBsYWNlbWVudCBvZmZzZXQgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGVuIGFjY2Vzc2luZyB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQl0cnkgewotCQkJaW50IGxlbmd0aD0gb2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLQkJCWlmIChsZW5ndGggPiAwKQotCQkJCXJldHVybiBkb2N1bWVudC5nZXQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gb2YgPGNvZGU+cHJlZml4PC9jb2RlPiB3aXRoIHRoZSBzdGFydCBvZiA8Y29kZT5zdHJpbmc8L2NvZGU+LgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIDxjb2RlPnByZWZpeDwvY29kZT4gaXMgbG9uZ2VyIHRoYW4gPGNvZGU+c3RyaW5nPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCBzdHJpbmcgPT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKSA+IHN0cmluZy5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHN0YXJ0PSBzdHJpbmcuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgoKSk7Ci0JCXJldHVybiBzdGFydC5lcXVhbHNJZ25vcmVDYXNlKHByZWZpeCkgfHwgaXNDYW1lbENhc2VNYXRjaGluZygpICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gocHJlZml4LnRvQ2hhckFycmF5KCksIHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXRjaGVzIDxjb2RlPnByZWZpeDwvY29kZT4gYWdhaW5zdCA8Y29kZT5zdHJpbmc8L2NvZGU+IGFuZCByZXBsYWNlcyB0aGUgbWF0Y2hlZCByZWdpb24KLQkgKiBieSBwcmVmaXguIENhc2UgaXMgcHJlc2VydmVkIGFzIG11Y2ggYXMgcG9zc2libGUuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+c3RyaW5nPC9jb2RlPiBpZiBjYW1lbCBjYXNlIGNvbXBsZXRpb24KLQkgKiBpcyBkaXNhYmxlZC4gRXhhbXBsZXMgd2hlbiBjYW1lbCBjYXNlIGNvbXBsZXRpb24gaXMgZW5hYmxlZDoKLQkgKiA8dWw+Ci0JICogPGxpPmdldENhbWVsQ29tcG91bmQoIk51UG8iLCAiTnVsbFBvaW50ZXJFeGNlcHRpb24iKSAtPiAiTnVQb2ludGVyRXhjZXB0aW9uIjwvbGk+Ci0JICogPGxpPmdldENhbWVsQ29tcG91bmQoIk51UG9FIiwgIk51bGxQb2ludGVyRXhjZXB0aW9uIikgLT4gIk51UG9FeGNlcHRpb24iPC9saT4KLQkgKiA8bGk+Z2V0Q2FtZWxDb21wb3VuZCgiaGFzQ29kIiwgImhhc2hDb2RlIikgLT4gImhhc0NvZGUiPC9saT4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byBtYXRjaCBhZ2FpbnN0Ci0JICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIG1hdGNoCi0JICogQHJldHVybiBhIGNvbXBvdW5kIG9mIHByZWZpeCBhbmQgYW55IHBvc3RmaXggdGFrZW4gZnJvbSA8Y29kZT5zdHJpbmc8L2NvZGU+Ci0JICogQHNpbmNlIDMuMgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2FtZWxDYXNlQ29tcG91bmQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN0cmluZykgewotCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gc3RyaW5nLmxlbmd0aCgpKQotCQkJcmV0dXJuIHN0cmluZzsKLQotCQkvLyBhIG5vcm1hbCBwcmVmaXggLSBubyBjYW1lbCBjYXNlIGxvZ2ljIGF0IGFsbAotCQlTdHJpbmcgc3RhcnQ9IHN0cmluZy5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJaWYgKHN0YXJ0LmVxdWFsc0lnbm9yZUNhc2UocHJlZml4KSkKLQkJCXJldHVybiBzdHJpbmc7Ci0KLQkJZmluYWwgY2hhcltdIHBhdHRlcm5DaGFycz0gcHJlZml4LnRvQ2hhckFycmF5KCk7Ci0JCWZpbmFsIGNoYXJbXSBzdHJpbmdDaGFycz0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0KLQkJZm9yIChpbnQgaT0gMTsgaSA8PSBzdHJpbmdDaGFycy5sZW5ndGg7IGkrKykKLQkJCWlmIChDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm5DaGFycywgMCwgcGF0dGVybkNoYXJzLmxlbmd0aCwgc3RyaW5nQ2hhcnMsIDAsIGkpKQotCQkJCXJldHVybiBwcmVmaXggKyBzdHJpbmcuc3Vic3RyaW5nKGkpOwotCi0JCS8vIE5vdCBhIGNhbWVsIGNhc2UgbWF0Y2ggYXQgYWxsLgotCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIC0+IHN0YXkgd2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvcgotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjYW1lbCBjYXNlIG1hdGNoaW5nIGlzIGVuYWJsZWQuCi0JICogCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FtZWxDYXNlTWF0Y2hpbmcoKSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRQcm9qZWN0KCk7Ci0JCVN0cmluZyB2YWx1ZTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXZhbHVlPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09ERUFTU0lTVF9DQU1FTF9DQVNFX01BVENIKTsKLQkJZWxzZQotCQkJdmFsdWU9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPREVBU1NJU1RfQ0FNRUxfQ0FTRV9NQVRDSCwgdHJ1ZSk7Ci0JCQotCQlyZXR1cm4gSmF2YUNvcmUuRU5BQkxFRC5lcXVhbHModmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbnNlcnRDb21wbGV0aW9uKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2U9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBwcmVmZXJlbmNlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0lOU0VSVF9DT01QTEVUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlSR0IgcmdiPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHByZWZlcmVuY2UsIFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9SRVBMQUNFTUVOVF9GT1JFR1JPVU5EKTsKLQkJcmV0dXJuIEphdmFVSS5nZXRDb2xvck1hbmFnZXIoKS5nZXRDb2xvcihyZ2IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbG9yIGdldEJhY2tncm91bmRDb2xvcihTdHlsZWRUZXh0IHRleHQpIHsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2U9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVJHQiByZ2I9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IocHJlZmVyZW5jZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX1JFUExBQ0VNRU5UX0JBQ0tHUk9VTkQpOwotCQlyZXR1cm4gSmF2YVVJLmdldENvbG9yTWFuYWdlcigpLmdldENvbG9yKHJnYik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGFpclByZXNlbnRhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZSZW1lbWJlcmVkU3R5bGVSYW5nZSAhPSBudWxsKSB7Ci0JCQkgaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgewotCQkJIAkvLyBhdHRlbXB0cyB0byByZWR1Y2UgdGhlIHJlZHJhdyBhcmVhCi0JCQkgCUlUZXh0Vmlld2VyRXh0ZW5zaW9uMiB2aWV3ZXIyPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSB2aWV3ZXI7Ci0KLQkJCSAJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCi0JCQkgCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQkgCQlJUmVnaW9uIG1vZGVsUmFuZ2U9IGV4dGVuc2lvbi53aWRnZXRSYW5nZTJNb2RlbFJhbmdlKG5ldyBSZWdpb24oZlJlbWVtYmVyZWRTdHlsZVJhbmdlLnN0YXJ0LCBmUmVtZW1iZXJlZFN0eWxlUmFuZ2UubGVuZ3RoKSk7Ci0JCQkgCQlpZiAobW9kZWxSYW5nZSAhPSBudWxsKQotCQkJIAkJCXZpZXdlcjIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24obW9kZWxSYW5nZS5nZXRPZmZzZXQoKSwgbW9kZWxSYW5nZS5nZXRMZW5ndGgoKSk7Ci0KLQkJCSAJfSBlbHNlIHsKLQkJCQkJdmlld2VyMi5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbihmUmVtZW1iZXJlZFN0eWxlUmFuZ2Uuc3RhcnQgKyB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpLCBmUmVtZW1iZXJlZFN0eWxlUmFuZ2UubGVuZ3RoKTsKLQkJCSAJfQotCi0JCQl9IGVsc2UKLQkJCQl2aWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdHlsZShJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQotCQlTdHlsZWRUZXh0IHRleHQ9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHdpZGdldENhcmV0PSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0KLQkJaW50IG1vZGVsQ2FyZXQ9IDA7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb249IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCW1vZGVsQ2FyZXQ9IGV4dGVuc2lvbi53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQod2lkZ2V0Q2FyZXQpOwotCQl9IGVsc2UgewotCQkJSVJlZ2lvbiB2aXNpYmxlUmVnaW9uPSB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJbW9kZWxDYXJldD0gd2lkZ2V0Q2FyZXQgKyB2aXNpYmxlUmVnaW9uLmdldE9mZnNldCgpOwotCQl9Ci0KLQkJaWYgKG1vZGVsQ2FyZXQgPj0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkpIHsKLQkJCXJlcGFpclByZXNlbnRhdGlvbih2aWV3ZXIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldD0gd2lkZ2V0Q2FyZXQ7Ci0JCWludCBsZW5ndGg9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gbW9kZWxDYXJldDsKLQotCQlDb2xvciBmb3JlZ3JvdW5kPSBnZXRGb3JlZ3JvdW5kQ29sb3IodGV4dCk7Ci0JCUNvbG9yIGJhY2tncm91bmQ9IGdldEJhY2tncm91bmRDb2xvcih0ZXh0KTsKLQotCQlTdHlsZVJhbmdlIHJhbmdlPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChvZmZzZXQpOwotCQlpbnQgZm9udFN0eWxlPSByYW5nZSAhPSBudWxsID8gcmFuZ2UuZm9udFN0eWxlIDogU1dULk5PUk1BTDsKLQotCQlyZXBhaXJQcmVzZW50YXRpb24odmlld2VyKTsKLQkJZlJlbWVtYmVyZWRTdHlsZVJhbmdlPSBuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgZm9udFN0eWxlKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkU3R5bGVSYW5nZS5zdHJpa2VvdXQ9IHJhbmdlLnN0cmlrZW91dDsKLQkJCWZSZW1lbWJlcmVkU3R5bGVSYW5nZS51bmRlcmxpbmU9IHJhbmdlLnVuZGVybGluZTsKLQkJfQotCi0JCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3NTQKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U3R5bGVSYW5nZShmUmVtZW1iZXJlZFN0eWxlUmFuZ2UpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgewotCQkJLy8gY2F0Y2hpbmcgZXhjZXB0aW9uIGFzIG9mZnNldCArIGxlbmd0aCBtaWdodCBiZSBvdXRzaWRlIG9mIHRoZSB0ZXh0IHdpZGdldAotCQkJZlJlbWVtYmVyZWRTdHlsZVJhbmdlPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChJVGV4dFZpZXdlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQkJaWYgKCFpbnNlcnRDb21wbGV0aW9uKCkgXiBzbWFydFRvZ2dsZSkKLQkJCXVwZGF0ZVN0eWxlKHZpZXdlcik7Ci0JCWVsc2UgewotCQkJcmVwYWlyUHJlc2VudGF0aW9uKHZpZXdlcik7Ci0JCQlmUmVtZW1iZXJlZFN0eWxlUmFuZ2U9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQoSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5zZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJcmVwYWlyUHJlc2VudGF0aW9uKHZpZXdlcik7Ci0JCWZSZW1lbWJlcmVkU3R5bGVSYW5nZT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24zI2dldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKQotCSAqLwotCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotLy8JCWlmICghQnJvd3NlckluZm9ybWF0aW9uQ29udHJvbC5pc0F2YWlsYWJsZShudWxsKSkKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJCi0vLwkJaWYgKGZDcmVhdG9yID09IG51bGwpIHsKLS8vCQkJZkNyZWF0b3I9IG5ldyBBYnN0cmFjdFJldXNhYmxlSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLS8vCQkJCQotLy8JCQkJLyoKLS8vCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5ob3Zlci5BYnN0cmFjdFJldXNhYmxlSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciNkb0NyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLS8vCQkJCSAqLwotLy8JCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgZG9DcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0vLwkJCQkJcmV0dXJuIG5ldyBCcm93c2VySW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgU1dULk5PX1RSSU0gfCBTV1QuVE9PTCwgU1dULk5PTkUsIG51bGwpOwotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlyZXR1cm4gZkNyZWF0b3I7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U29ydFN0cmluZygpIHsKLQkJcmV0dXJuIGZTb3J0U3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNvcnRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQlmU29ydFN0cmluZz0gc3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gZlRleHRWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUb2dnbGVFYXRpbmcoKSB7Ci0JCXJldHVybiBmVG9nZ2xlRWF0aW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgYSBzaW1wbGUgbGlua2VkIG1vZGUgYXQge0BsaW5rICNnZXRDdXJzb3JQb3NpdGlvbigpfSBhbmQgYW4gZXhpdCBwb2xpY3kgdGhhdCB3aWxsCi0JICogZXhpdCB0aGUgbW9kZSB3aGVuIDxjb2RlPmNsb3NpbmdDaGFyYWN0ZXI8L2NvZGU+IGlzIHR5cGVkIGFuZCBhbiBleGl0IHBvc2l0aW9uIGF0Ci0JICogPGNvZGU+Z2V0Q3Vyc29yUG9zaXRpb24oKSArIDE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gY2xvc2luZ0NoYXJhY3RlciB0aGUgZXhpdCBjaGFyYWN0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcExpbmtlZE1vZGUoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIGNsb3NpbmdDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldFRleHRWaWV3ZXIoKSAhPSBudWxsICYmIGF1dG9jbG9zZUJyYWNrZXRzKCkpIHsKLQkJCWludCBvZmZzZXQ9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRDdXJzb3JQb3NpdGlvbigpOwotCQkJaW50IGV4aXQ9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudFN0cmluZygpLmxlbmd0aCgpOwotCQkJdHJ5IHsKLQkJCQlMaW5rZWRQb3NpdGlvbkdyb3VwIGdyb3VwPSBuZXcgTGlua2VkUG9zaXRpb25Hcm91cCgpOwotCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgb2Zmc2V0LCAwLCBMaW5rZWRQb3NpdGlvbkdyb3VwLk5PX1NUT1ApKTsKLQkJCQkKLQkJCQlMaW5rZWRNb2RlTW9kZWwgbW9kZWw9IG5ldyBMaW5rZWRNb2RlTW9kZWwoKTsKLQkJCQltb2RlbC5hZGRHcm91cChncm91cCk7Ci0JCQkJbW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0JCQkJCi0JCQkJTGlua2VkTW9kZVVJIHVpPSBuZXcgRWRpdG9yTGlua2VkTW9kZVVJKG1vZGVsLCBnZXRUZXh0Vmlld2VyKCkpOwotCQkJCXVpLnNldFNpbXBsZU1vZGUodHJ1ZSk7Ci0JCQkJdWkuc2V0RXhpdFBvbGljeShuZXcgRXhpdFBvbGljeShjbG9zaW5nQ2hhcmFjdGVyLCBkb2N1bWVudCkpOwotCQkJCXVpLnNldEV4aXRQb3NpdGlvbihnZXRUZXh0Vmlld2VyKCksIGV4aXQsIDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQl1aS5zZXRDeWNsaW5nTW9kZShMaW5rZWRNb2RlVUkuQ1lDTEVfTkVWRVIpOwotCQkJCXVpLmVudGVyKCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvY2xvc2VCcmFja2V0cygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmU9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBwcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DTE9TRV9CUkFDS0VUUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlzcGxheVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWZEaXNwbGF5U3RyaW5nPSBzdHJpbmc7Ci0JfQotCQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RGlzcGxheVN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhIGVsZW1lbnQgcHJvcG9zZWQgYnkgdGhlIHJlY2VpdmVyLCBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBqYXZhIGVsZW1lbnQgcHJvcG9zZWQgYnkgdGhlIHJlY2VpdmVyLCBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0vLwkJaWYgKGdldFByb3Bvc2FsSW5mbygpICE9IG51bGwpCi0vLwkJCXRyeSB7Ci0vLwkJCQlyZXR1cm4gZ2V0UHJvcG9zYWxJbmZvKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLS8vCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIHgpIHsKLS8vCQkJCUphdmFQbHVnaW4ubG9nKHgpOwotLy8JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiZDJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvblRhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LkF0dHJpYnV0ZVZhbHVlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LlRhZ0F0dHJpYlNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5UYWdTcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVGFnQ29tcGxldGlvblByb2MgaW1wbGVtZW50cyBJSmF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IsIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCT09MRUFOX1ZBTElEX1ZBTFVFUyA9IG5ldyBTdHJpbmdbXXsiZmFsc2UiLCAidHJ1ZSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlJQ29tcGlsYXRpb25Vbml0IG1faWN1OwotCi0JSURvY3VtZW50IG1fZG9jOwotCi0JTGlzdCBtX3RhZ3M7Ci0KLQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMgYWN0aXZlIHdoZW4gbWF5YmVDb21wbGV0ZUF0dHJpYnV0ZSBpcyBsaXZlLgotCVRva2VuIG1fdGFnTmFtZTsKLQotCS8qKgotCSAqIFNldCBvZiBhbGwgYXR0cmlidXRlcyBuYW1lcyBlbmNvdW50ZXJlZC4gT25seSBsaXZlIHdoZW4gbWF5YmVDb21wbGV0ZUF0dHJpYnV0ZSBpcyBsaXZlLgotCSAqLwotCVNldCBtX2F0dFNldCA9IG5ldyBUcmVlU2V0KCk7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIEF0dHJpYnV0ZS4gT25seSBsaXZlIHdoZW4gbWF5YmVDb21wbGVBdHRyaWJ1dGUgaXMgbGl2ZS4KLQkgKi8KLQlMaXN0IG1fYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUFubm90YXRpb25UYWdQYXJzZXIgbV9wYXJzZXIgPSBuZXcgQW5ub3RhdGlvblRhZ1BhcnNlcih0aGlzKTsKLQotCS8qKgotCSAqIFNjb3BlIG9mIHRoZSB0YWcuIFRhZ1NwZWMuVFlQRSB8IFRhZ1NwZWMuTUVUSE9EIHwgVGFnU3BlYy5GSUVMRC4gTm90IHZhbGlkIHVudGlsCi0JICogZ2V0QW5ub3RhdGlvbkFyZWEgaGFzIGJlZW4gY2FsbGVkIGZvciBhIGNvbXBsZXRpb25zIHJlcXVlc3QsIGFuZCBvbmx5IHRoZW4gaWYKLQkgKiBnZXRBbm5vdGF0aW9uQXJlYSgpIGRpZCBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JaW50IG1fdGFnU2NvcGU7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jKCkgewotCQlpbml0VGFnSW5mbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0VGFnSW5mbygpIHsKLQkJaWYgKG1fdGFncyA9PSBudWxsKQotCQkJbV90YWdzID0gQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LmdldEFsbFRhZ1NwZWNzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElDb21waWxhdGlvblVuaXQgY3UsIGludCBvZmZzZXQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQsCi0JICogICAgICBpbnQsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElDb21waWxhdGlvblVuaXQgY3UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBmbGFncykgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJLy8gU2V0IHVwIGNvbXBsZXRpb24gcHJvY2Vzc29yIHN0YXRlLgotCQltX2RvYyA9IEphdmFVSS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9ySW5wdXQpOwotCQltX2ljdSA9IGN1OwotCi0JCXRyeSB7Ci0JCQlBbm5vdGF0aW9uQXJlYSBhcmVhID0gZ2V0QW5ub3RhdGlvbkFyZWEob2Zmc2V0KTsKLQotCQkJaWYgKGFyZWEgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBDaGVjayBmb3IgdGFnIGNvbXBsZXRpb24gZmlyc3QuICggdGhlIGVhc2llciBjYXNlICkKLQkJCVN0cmluZyB0c2YgPSBnZXRUYWdTb0ZhcklmTm90Q29tcGxldGVkKGFyZWEuYmVnaW5PZmZzZXQsIG9mZnNldCk7Ci0KLQkJCWlmICh0c2YgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRUYWdDb21wbGV0aW9uc0Zvcih0c2YsIGFyZWEsIGxlbmd0aCk7Ci0JCQl9Ci0KLQkJCS8vIEFjaCwgaGF2ZSB0byB0cnkgdGhlIGhhcmRlciBjYXNlIG5vdywgd2hlcmUgd2UgcGFyc2UgdGhlCi0JCQkvLyBhbm5vdGF0aW9uCi0JCQlyZXR1cm4gbWF5YmVDb21wbGV0ZUF0dHJpYnV0ZShhcmVhLCBvZmZzZXQpOwotCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaWxlbnRseSBmYWlsLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBtYXliZUNvbXBsZXRlQXR0cmlidXRlKEFubm90YXRpb25BcmVhIGFyZWEsIGludCBjdXJzb3JQb3MpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCW1fYXR0U2V0LmNsZWFyKCk7Ci0JCW1fYXR0cmlidXRlcy5jbGVhcigpOwotCi0JCW1fcGFyc2VyLnNldFBhcnNlcklucHV0KG1fZG9jLmdldChhcmVhLmJlZ2luT2Zmc2V0LCBhcmVhLmxlbmd0aCgpKSk7Ci0JCW1fcGFyc2VyLnBhcnNlKCk7Ci0KLQkJVGFnU3BlYyB0cyA9IG51bGw7Ci0JCWlmIChtX3RhZ05hbWUhPW51bGwpCi0JCQl0cyA9IGdldFRhZ1NwZWNGb3JUYWdOYW1lKG1fdGFnTmFtZS5nZXRUZXh0KCkpOwotCi0JCS8vIERvIHdlIGV2ZW4gcmVjb2duaXplIHRoaXMgdGFnPwotCQlpZiAodHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBMb29wIHRocm91Z2ggYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgd2l0aGluIGEgYXR0cmlidXRlCi0JCS8vIGFzc2lnbm1lbnQsIG9yIGJldHdlZW4gYXNzaWduZW1lbnRzLgotCQlBdHRyaWJ1dGUgdGFyZ2V0ID0gbnVsbDsKLQkJQXR0cmlidXRlIGxhc3QgPSBudWxsOwotCQlBdHRyaWJ1dGUgYmVmb3JlID0gbnVsbDsKLQkJQXR0cmlidXRlIGEgPSBudWxsOwotCQlib29sZWFuIGJldHdlZW4gPSBmYWxzZTsKLQkJaW50IHJDdXJQb3MgPSBhcmVhLnJlbGF0aXZlQ3Vyc29yUG9zKGN1cnNvclBvcyk7Ci0JCUl0ZXJhdG9yIGkgPSBtX2F0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlhID0gKEF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0KLQkJCWlmIChhLmNvbnRhaW5zKHJDdXJQb3MpKSB7Ci0JCQkJdGFyZ2V0ID0gYTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAobGFzdCAhPSBudWxsKSB7Ci0JCQkJLy8gU2VlIGlmIHRoZSBjdXJzb3IgaXMgYmV0d2VlbiwgYnV0IG5vdCBkaXJlY3RseSBhZGphY2VudCB0bwotCQkJCS8vIHRoZSBsYXN0IHR3byBhdHRyaWJ1dGVzLgotCQkJCWlmIChyQ3VyUG9zID4gbGFzdC5tYXhFeHRlbnQoKSArIDEgJiYgckN1clBvcyA8IGEubWluRXh0ZW50KCkgLSAxKSB7Ci0JCQkJCWJldHdlZW4gPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGEuaW1tZWRpYXRlbHlQcmVjZWRlcyhyQ3VyUG9zKSkgewotCQkJCQliZWZvcmUgPSBhOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlsYXN0ID0gYTsKLQkJfQotCi0JCWlmICh0YXJnZXQgPT0gbnVsbCkgewotCQkJaWYgKGJldHdlZW4pIHsKLQkJCQkvLyBJZiB3ZSdyZSBiZXR3ZWVuIGF0dHJpYnV0ZXMsIHN1Z2dlc3QgYWxsIHBvc3NpYmxlIGF0dHJpYnV0ZXMuCi0JCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MsIDAsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChiZWZvcmUgIT0gbnVsbCkgewotCQkJCS8vIFdlJ3JlIHJpZ2h0IGFmdGVyIHRoZSBhdHRyaWJ1dGUgbmFtZWQgaW4gJ2JlZm9yZScsIHNvIHNldCB0aGUKLQkJCQkvLyB0YXJnZXQgdG8gaXQsIGFuZCBmYWxsCi0JCQkJLy8gIHRocm91Z2ggdG8gdGhlIHRhcmdldCBoYW5kbGluZyBjb2RlLgotCQkJCXRhcmdldCA9IGJlZm9yZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbm90IGJldHdlZW4gYW5kIG5vdCBpbW1lZGlhdGVseSBhZnRlciBhbiBhdHRyaWJ1dGUuIFdlIGFyZQotCQkJCS8vIHBhc3QgdGhlIGVuZCBvZiB0aGUgcGFyc2VkIGFubm90YXRpb24uCi0JCQkJLy8gIE9ubHkgb2ZmZXIgc3VnZ2VzdGlvbnMgaWYgaXQgbG9va3MgbGlrZSB0aGUgbGFzdCBhbm5vdGF0aW9uCi0JCQkJLy8gYXR0cmlidXRlIGlzIHZhbGlkLgotCQkJCWlmIChhID09IG51bGwpIHsKLQkJCQkJLy8gTm8gYW5ub3RhdGlvbnMgYXR0cmlidXRlcywgc3VnZ2VzdCBldmVyeXRoaW5nLgotCQkJCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcywgMCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChyQ3VyUG9zID4gYS5tYXhFeHRlbnQoKSkgewotCQkJCQlpZiAoYS5oYXNBc3NpZ25tZW50KCkgJiYgYS5oYXNWYWx1ZSgpKSB7Ci0JCQkJCQkvLyBMYXN0IGFubm90YXRpb24gd2FzIGdvb2QsIGFuZCB3ZSdyZSBwYXN0IGl0LCBzbyBkbwotCQkJCQkJLy8gY29tcGxldGlvbnMgZm9yIGFueXRoaW5nCi0JCQkJCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcywgMCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSBpZiAoYS5oYXNBc3NpZ25tZW50KCkpCi0JCQkJCQlyZXR1cm4gYXR0cmlidXRlVmFsaWRWYWx1ZXNGb3IodHMsIGEsIGFyZWEsIGN1cnNvclBvcyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zIC0gYS5uYW1lLmxlbmd0aCgpLCAwLCBhLm5hbWUuZ2V0VGV4dCgpLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBEaWRuJ3QgbWF0Y2ggYW55dGhpbmcsIG5vdCBwYXN0IHRoZSBlbmQgLSB3ZSdyZSBwcm9iYWJseQotCQkJCQkvLyB0aGUgZmlyc3QgYXR0cmlidXRlCi0JCQkJCS8vIGJlaW5nIGFkZGVkIHRvIHRoZSB0YWcuCi0JCQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zLCAwLCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBDb21wbGV0aW9uIGZvciBhIHBhcnRpYWwgYXR0cmlidXRlIG5hbWU/Ci0JCWlmICh0YXJnZXQubmFtZS5pbW1lZGlhdGVseVByZWNlZGVzKHJDdXJQb3MpKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGFyZWEucmVsYXRpdmVUb0Ficyh0YXJnZXQubmFtZS5nZXRCZWdpbm5pbmcoKSksIHRhcmdldC5uYW1lLmxlbmd0aCgpLCB0YXJnZXQubmFtZS5nZXRUZXh0KCksICF0YXJnZXQuaGFzQXNzaWdubWVudCgpKTsKLQkJfQotCi0JCS8vIEFyZSB3ZSBpbiB0aGUgbWlkZGxlIG9mIGEgbmFtZT8KLQkJaWYgKHRhcmdldC5uYW1lLmNvbnRhaW5zKHJDdXJQb3MpKSB7Ci0JCQkvLyBXZSd2ZSBvcHRlZCB0byByZXBsYWNlIHRoZSBlbnRpcmUgbmFtZSBmb3IgdGhpcyBjYXNlLCB3aGljaCBzZWVtcwotCQkJLy8gdG8gbWFrZSB0aGUgbW9zdCBzZW5zZS4KLQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgYXJlYS5yZWxhdGl2ZVRvQWJzKHRhcmdldC5uYW1lLmdldEJlZ2lubmluZygpKSwgdGFyZ2V0Lm5hbWUubGVuZ3RoKCksIHRhcmdldC5uYW1lLmdldFRleHQoKS5zdWJzdHJpbmcoMCwgckN1clBvcyAtIHRhcmdldC5uYW1lLmdldEJlZ2lubmluZygpKSwgIXRhcmdldC5oYXNBc3NpZ25tZW50KCkpOwotCQl9Ci0KLQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBlaXRoZXIgaW4gYSB2YWx1ZSwgb3IgcmVhbGx5IGNvbmZ1c2VkLgotCQkvLyB0cnkgYW5kIHJldHVybiB2YWxpZCB2YWx1ZXMgb3IgYmFpbD8KLQkJaWYgKGEudmFsdWUgIT0gbnVsbCAmJiAoYS52YWx1ZS5jb250YWlucyhyQ3VyUG9zKSB8fCAodGFyZ2V0Lmhhc0Fzc2lnbm1lbnQoKSAmJiBhcmVhLnJlbGF0aXZlQ3Vyc29yUG9zKGN1cnNvclBvcykgPiBhLm5hbWUuZ2V0QmVnaW5uaW5nKCkpKSkKLQkJCXJldHVybiBhdHRyaWJ1dGVWYWxpZFZhbHVlc0Zvcih0cywgYSwgYXJlYSwgY3Vyc29yUG9zKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MsIDAsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdmFsaWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGF0dHJpYnV0ZVZhbGlkVmFsdWVzRm9yKFRhZ1NwZWMgdHMsIEF0dHJpYnV0ZSBhLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB7Ci0JCVRhZ0F0dHJpYlNwZWMgdGFzID0gdHMuYXR0cmlidXRlTmFtZWQoYS5uYW1lLmdldFRleHQoKSk7Ci0JCWlmICh0YXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IGdldFZhbGlkVmFsdWVzKHRhcywgYSwgYXJlYSk7Ci0JCVN0cmluZyBwYXJ0aWFsVmFsdWUgPSBjYWxjdWxhdGVQYXJ0aWFsVmFsdWUoYSwgYXJlYSwgY3Vyc29yUG9zKTsKLQkJaW50IHZhbHVlT2Zmc2V0ID0gY2FsY3VsYXRlVmFsdWVPZmZzZXQoYSwgYXJlYSwgY3Vyc29yUG9zKTsKLQkJaWYgKHZhbGlkVmFsdWVzID09IG51bGwgfHwgdmFsaWRWYWx1ZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQXR0cmlidXRlQ29tcGxldGlvblByb3Bvc2Fscyh0cywgdGFzLCBwYXJ0aWFsVmFsdWUsIHZhbHVlT2Zmc2V0LCBhLnZhbHVlLmdldFRleHQoKSwgYXJlYS5qYXZhRWxlbWVudCk7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHBhcnRpYWxWYWx1ZSwgdmFsdWVPZmZzZXQsIHZhbGlkVmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHMKLQkgKiBAcGFyYW0gdGFzCi0JICogQHBhcmFtIHBhcnRpYWxWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZU9mZnNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gY3JlYXRlQ3VzdG9tQXR0cmlidXRlQ29tcGxldGlvblByb3Bvc2FscyhUYWdTcGVjIHRzLCBUYWdBdHRyaWJTcGVjIHRhcywgU3RyaW5nIHBhcnRpYWxWYWx1ZSwgaW50IHZhbHVlT2Zmc2V0LCBTdHJpbmcgdmFsdWUsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotCQlBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgaGVscGVyID0gdHMuZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKTsKLQkJaWYgKGhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJbXSBwcm9wb3NhbEhlbHBlcnMgPSBoZWxwZXIuZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcnModGFzLCBwYXJ0aWFsVmFsdWUsIHZhbHVlT2Zmc2V0LCBqYXZhRWxlbWVudCk7Ci0JCWlmIChwcm9wb3NhbEhlbHBlcnMgPT0gbnVsbCB8fCBwcm9wb3NhbEhlbHBlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBuZXcgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxIZWxwZXJzLmxlbmd0aF07Ci0JCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wb3NhbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbEhlbHBlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXByb3Bvc2FsID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChwcm9wb3NhbEhlbHBlcnNbaV0pOwotCQkJLy9wcm9wb3NhbC5zZXRQYXJ0aWFsVmFsdWVTdHJpbmcocGFydGlhbFZhbHVlKTsKLQkJCXByb3Bvc2Fsc1tpXSA9IHByb3Bvc2FsOwotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNyZWF0ZUF0dHJpYnV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoU3RyaW5nIHBhcnRpYWxWYWx1ZSwgaW50IHZhbHVlT2Zmc2V0LCBTdHJpbmdbXSB2YWxpZFZhbHVlcykgewotCQlMaXN0IHJlc3VsdGluZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJwbFN0cmluZyA9IHZhbGlkVmFsdWVzW2ldOwotCQkJaWYgKHBhcnRpYWxWYWx1ZSAhPSBudWxsICYmICFycGxTdHJpbmcuc3RhcnRzV2l0aChwYXJ0aWFsVmFsdWUpKQotCQkJCWNvbnRpbnVlOwotCQkJQW5ub3RhdGlvblRhZ1Byb3Bvc2FsIHByb3AgPSBuZXcgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsKHJwbFN0cmluZywgdmFsdWVPZmZzZXQsIDAsIG51bGwsIHJwbFN0cmluZywgOTApOwotCQkJcHJvcC5zZXRFbnN1cmVRdW90ZWQodHJ1ZSk7Ci0JCQkvL3Byb3Auc2V0UGFydGlhbFZhbHVlU3RyaW5nKHBhcnRpYWxWYWx1ZSk7Ci0JCQlyZXN1bHRpbmdWYWx1ZXMuYWRkKHByb3ApOwotCQl9Ci0JCWlmIChyZXN1bHRpbmdWYWx1ZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0aW5nVmFsdWVzLnRvQXJyYXkobmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdGluZ1ZhbHVlcy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKFRhZ0F0dHJpYlNwZWMgdGFzLCBBdHRyaWJ1dGUgYSwgQW5ub3RhdGlvbkFyZWEgYXJlYSkgewotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IHRhcy5nZXRWYWxpZFZhbHVlcygpOwotCQlpZiAodmFsaWRWYWx1ZXMgPT0gbnVsbCB8fCB2YWxpZFZhbHVlcy5sZW5ndGggPT0gMCkgewotCQkJQXR0cmlidXRlVmFsdWVzSGVscGVyIGhlbHBlciA9IHRhcy5nZXRUYWdTcGVjKCkuZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKTsKLQkJCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXZhbGlkVmFsdWVzID0gaGVscGVyLmdldFZhbGlkVmFsdWVzKHRhcywgYXJlYS5qYXZhRWxlbWVudCk7Ci0JCQlpZiAoKHZhbGlkVmFsdWVzID09IG51bGwgfHwgdmFsaWRWYWx1ZXMubGVuZ3RoID09IDApICYmIHRhcy52YWx1ZUlzQm9vbCgpKQotCQkJCXZhbGlkVmFsdWVzID0gQk9PTEVBTl9WQUxJRF9WQUxVRVM7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhCi0JICogQHBhcmFtIGFyZWEKLQkgKiBAcGFyYW0gY3Vyc29yUG9zCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVZhbHVlT2Zmc2V0KEF0dHJpYnV0ZSBhLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB7Ci0JCWlmIChhLnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gY3Vyc29yUG9zOwotCQlpbnQgbmFtZUVuZCA9IGEubmFtZS5nZXRFbmQoKTsKLQkJaW50IHZhbEJlZyA9IGEudmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCWlmICh2YWxCZWcgPiBuYW1lRW5kICsgMikKLQkJCXJldHVybiBhcmVhLnJlbGF0aXZlVG9BYnMobmFtZUVuZCArIDIpOyAvL1ZhbHVlIHRvbyBmYXIgYXdheSB0byBiZSBjb3JyZWN0LgotCQlyZXR1cm4gYXJlYS5yZWxhdGl2ZVRvQWJzKHZhbEJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGEKLQkgKiBAcGFyYW0gYXJlYQotCSAqIEBwYXJhbSBjdXJzb3JQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlUGFydGlhbFZhbHVlKEF0dHJpYnV0ZSBhLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB7Ci0JCWlmIChhLnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IG5hbWVFbmQgPSBhLm5hbWUuZ2V0RW5kKCk7Ci0JCWludCB2YWx1ZUJlZyA9IGEudmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCWlmICh2YWx1ZUJlZyA+IG5hbWVFbmQgKyAyKQotCQkJcmV0dXJuIG51bGw7IC8vVmFsdWUgaXMgdG9vIGZhciBhd2F5IHNvIGl0IG11c3Qgbm90IGJlIHBhcnQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0JCWludCByZWxhdGl2ZVBvcyA9IGFyZWEucmVsYXRpdmVDdXJzb3JQb3MoY3Vyc29yUG9zKTsKLQkJaWYgKGEudmFsdWUuY29udGFpbnMocmVsYXRpdmVQb3MpKSB7Ci0JCQlib29sZWFuIGhhc0JlZ2luUXVvdGUgPSB2YWx1ZUJlZyAtIG5hbWVFbmQgPT0gMjsKLQkJCVN0cmluZyB2YWx1ZSA9IGEudmFsdWUuZ2V0VGV4dCgpOwotCQkJaW50IGVuZCA9IHJlbGF0aXZlUG9zIC0gdmFsdWVCZWc7Ci0JCQlpZiAoaGFzQmVnaW5RdW90ZSkKLQkJCQllbmQtLTsKLQkJCWlmIChlbmQgPiAtMSkgewotCQkJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCQlpZiAoZW5kIDwgbGVuZ3RoKQotCQkJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGVuZCk7Ci0JCQkJZWxzZSBpZiAoZW5kID09IGxlbmd0aCkKLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGFnU3BlYyBnZXRUYWdTcGVjRm9yVGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlTdHJpbmcgc2ltcGxlTmFtZSA9IHRhZ05hbWU7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5sZW5ndGgoKSA+IDAgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJ0AnKQotCQkJc2ltcGxlTmFtZSA9IHRhZ05hbWUubGVuZ3RoKCkgPT0gMiA/ICIiIDogdGFnTmFtZS5zdWJzdHJpbmcoMSk7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoIChtX3RhZ1Njb3BlKSB7Ci0JCQljYXNlIFRhZ1NwZWMuVFlQRSA6Ci0JCQkJcmV0dXJuIEFubm90YXRpb25UYWdSZWdpc3RyeS5nZXRUeXBlVGFnKHNpbXBsZU5hbWUpOwotCQkJY2FzZSBUYWdTcGVjLk1FVEhPRCA6Ci0JCQkJcmV0dXJuIEFubm90YXRpb25UYWdSZWdpc3RyeS5nZXRNZXRob2RUYWcoc2ltcGxlTmFtZSk7Ci0JCQljYXNlIFRhZ1NwZWMuRklFTEQgOgotCQkJCXJldHVybiBBbm5vdGF0aW9uVGFnUmVnaXN0cnkuZ2V0RmllbGRUYWcoc2ltcGxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKFRhZ1NwZWMgdHMsIGludCByZXBsYWNlT2Zmc2V0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHBhcnRpYWxBdHRyaWJ1dGVOYW1lLCBib29sZWFuIGFwcGVuZEVxdWFscykgewotCQlJdGVyYXRvciBpID0gdHMuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgcHJvcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVGFnQXR0cmliU3BlYyB0YXMgPSAoVGFnQXR0cmliU3BlYykgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgYW5hbWUgPSB0YXMuZ2V0QXR0cmliTmFtZSgpOwotCi0JCQkvLyBEb24ndCBzdWdnZXN0IGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuCi0JCQlpZiAoIW1fYXR0U2V0LmNvbnRhaW5zKGFuYW1lKSkgewotCQkJCWlmIChhbmFtZS5zdGFydHNXaXRoKHBhcnRpYWxBdHRyaWJ1dGVOYW1lKSkgewotCQkJCQlTdHJpbmcgcnR4dCA9IGFwcGVuZEVxdWFscyA/IGFuYW1lICsgJz0nIDogYW5hbWU7Ci0JCQkJCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChydHh0LCByZXBsYWNlT2Zmc2V0LCByZXBsYWNlTGVuZ3RoLCBudWxsLCBhbmFtZSwgOTApOwotCQkJCQlwcm9wLnNldEhlbHBUZXh0KGxvb2t1cEF0dEhlbHAodGFzKSk7Ci0JCQkJCXByb3BzLmFkZChwcm9wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb3BzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wcy50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wcy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuYW5ub3RhdGlvbnMuVGFnUGFyc2VFdmVudEhhbmRsZXIjYW5ub3RhdGlvblRhZyhjb20uaWJtLndzLnJkLmFubm90YXRpb25zLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGFubm90YXRpb25UYWcoVG9rZW4gdGFnKSB7Ci0JCW1fdGFnTmFtZSA9IHRhZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuYW5ub3RhdGlvbnMuVGFnUGFyc2VFdmVudEhhbmRsZXIjZW5kT2ZUYWcoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5UYWdQYXJzZUV2ZW50SGFuZGxlciNhdHRyaWJ1dGUoY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5Ub2tlbiwKLQkgKiAgICAgIGludCwgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5Ub2tlbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoVG9rZW4gbmFtZSwgaW50IGVxdWFsc1Bvc2l0aW9uLCBUb2tlbiB2YWx1ZSkgewotCQltX2F0dHJpYnV0ZXMuYWRkKG5ldyBBdHRyaWJ1dGUobmFtZSwgZXF1YWxzUG9zaXRpb24sIHZhbHVlKSk7Ci0JCW1fYXR0U2V0LmFkZChuYW1lLmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwbGFjZW1lbnRGb3JUYWcoVGFnU3BlYyB0cywgaW50IGJlZ2luSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZCA9IG5ldyBTdHJpbmdCdWZmZXIoMzIpOwotCi0JCWJ1ZC5hcHBlbmQoJ0AnKTsKLQkJYnVkLmFwcGVuZCh0cy5nZXRUYWdOYW1lKCkpOwotCi0JCVN0cmluZyBwcmVmaXggPSBnZXRBcnJheVByZWZpeEZvck11bHRpcGxlQXR0cmlicyhiZWdpbkluZGV4KTsKLQkJTGlzdCBhdHRyaWJ1dGVzID0gdHMuZ2V0QXR0cmlidXRlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJVGFnQXR0cmliU3BlYyB0YXMgPSAoVGFnQXR0cmliU3BlYykgYXR0cmlidXRlcy5nZXQoaSk7Ci0KLQkJCWlmICh0YXMuaXNSZXF1aXJlZCgpKSB7Ci0JCQkJYnVkLmFwcGVuZChwcmVmaXgpOwotCQkJCWJ1ZC5hcHBlbmQodGFzLmdldEF0dHJpYk5hbWUoKSk7Ci0JCQkJYnVkLmFwcGVuZCgnPScpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRBcnJheVByZWZpeEZvck11bHRpcGxlQXR0cmlicyhpbnQgYmVnaW5JbmRleCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JCS8vIEdldCBzb3VyY2UgZnJvbSBjb21waWxhdGlvbiB1bml0Ci0JCXRyeSB7Ci0JCQlzb3VyY2UgPSBtX2ljdS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBiZWdpbkluZGV4IDwgMCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJLy8gdHJpbSBvZmYgZXZlcnl0aGluZyBhZnRlciBvdXIgYmVnaW4gaW5kZXgKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgYmVnaW5JbmRleCArIDEpOwotCQkJaW50IG5ld0xpbmVJbmRleCA9IHNvdXJjZS5sYXN0SW5kZXhPZignXG4nKTsKLQkJCS8vaWYgd2UgYXJlIG9uIGZpcnN0IGxpbmUuLi4KLQkJCWlmIChuZXdMaW5lSW5kZXggPT0gLTEpCi0JCQkJbmV3TGluZUluZGV4ID0gMDsKLQkJCS8vIEdldCB0aGUgY3VycmVudCBsaW5lCi0JCQlTdHJpbmcgY3VycmVudExpbmUgPSBzb3VyY2Uuc3Vic3RyaW5nKG5ld0xpbmVJbmRleCwgYmVnaW5JbmRleCArIDEpOwotCQkJLy8gQ3VycmVudGx5IHdlIGhhdmUgdG8gaGF2ZSB0aGUgJ0AnIHNpZ24gdG8gc2hvdyBvdXIgbWVudQotCQkJaW50IGFubm90YXRpb25JbmRleCA9IGN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCdAJyk7Ci0JCQlyZXN1bHQgPSBjdXJyZW50TGluZS5zdWJzdHJpbmcoMCwgYW5ub3RhdGlvbkluZGV4KTsKLQkJCXJlc3VsdCA9IHJlc3VsdCArICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhZ0NvbXBsZXRpb25zRm9yKFN0cmluZyBwYXJ0aWFsVGFnTmFtZSwgQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IHNlbGVjdExlbmd0aCkgewotCQlMaXN0IGZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbV90YWdzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdTcGVjIHRzID0gKFRhZ1NwZWMpIG1fdGFncy5nZXQoaSk7Ci0JCQlTdHJpbmcgdG5hbWUgPSB0cy5nZXRUYWdOYW1lKCk7Ci0KLQkJCWlmICh0cy5nZXRTY29wZSgpID09IG1fdGFnU2NvcGUgJiYgdG5hbWUuc3RhcnRzV2l0aChwYXJ0aWFsVGFnTmFtZSkpIHsKLQkJCQlTdHJpbmcgcnR4dCA9IGdldFJlcGxhY2VtZW50Rm9yVGFnKHRzLCBhcmVhLmJlZ2luT2Zmc2V0KTsKLQkJCQlTdHJpbmcgbGFibCA9ICdAJyArIHRuYW1lOwotCQkJCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChydHh0LCBhcmVhLmJlZ2luT2Zmc2V0LCBNYXRoLm1heChzZWxlY3RMZW5ndGgsIHJ0eHQubGVuZ3RoKCkpLCBudWxsLCBsYWJsLCA5MCk7Ci0JCQkJcHJvcC5zZXRIZWxwVGV4dChsb29rdXBUYWdIZWxwKHRzKSk7Ci0JCQkJZm91bmQuYWRkKHByb3ApOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFmb3VuZC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAoSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSkgZm91bmQudG9BcnJheShuZXcgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbZm91bmQuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXUzEoY2hhciBjKSB7Ci0JCXJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnKicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdTb0ZhcklmTm90Q29tcGxldGVkKGludCBzdGFydGluZ0F0LCBpbnQgY3Vyc29yQXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChtX2RvYy5nZXRDaGFyKHN0YXJ0aW5nQXQpICE9ICdAJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgZmlyc3RDaGFyID0gc3RhcnRpbmdBdCArIDE7Ci0KLQkJaWYgKGZpcnN0Q2hhciA9PSBjdXJzb3JBdCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmb3IgKGludCBpID0gZmlyc3RDaGFyOyBpIDwgY3Vyc29yQXQ7IGkrKykgewotCQkJY2hhciBjID0gbV9kb2MuZ2V0Q2hhcihpKTsKLQotCQkJaWYgKGlzV1MxKGMpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbV9kb2MuZ2V0KGZpcnN0Q2hhciwgY3Vyc29yQXQgLSBmaXJzdENoYXIpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHRoZSBhcmVhIG9mIHRoZSBhbm5vdGF0aW9uIHdlJ3JlIHRyeWluZyB0byBjb21wbGV0ZS4gQWxzbyBpbml0aWFsaXplcwotCSAqIG1fdGFnU2NvcGUuCi0JICogCi0JICogQHBhcmFtIGZyb21PZmZzZXQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb25BcmVhIGdldEFubm90YXRpb25BcmVhKGludCBmcm9tT2Zmc2V0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QsIHJvdWdobHkgY2FsY3VsYXRlIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCi0JCUlKYXZhRWxlbWVudCBlbCA9IG1faWN1LmdldEVsZW1lbnRBdChmcm9tT2Zmc2V0KTsKLQkJaW50IGFic21heCwgYWJzbWluOwotCQlpZiAoZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHkgPSBlbC5nZXRFbGVtZW50VHlwZSgpOwotCi0JCXN3aXRjaCAodHkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEIDoKLQkJCQlJRmllbGQgZiA9IChJRmllbGQpIGVsOwotCQkJCWFic21heCA9IGYuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJYWJzbWluID0gZi5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCW1fdGFnU2NvcGUgPSBUYWdTcGVjLkZJRUxEOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKLQkJCQlJVHlwZSB0ID0gKElUeXBlKSBlbDsKLQkJCQlhYnNtYXggPSB0LmdldE5hbWVSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCWFic21pbiA9IHQuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQltX3RhZ1Njb3BlID0gVGFnU3BlYy5UWVBFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0QgOgotCQkJCUlNZXRob2QgbSA9IChJTWV0aG9kKSBlbDsKLQkJCQlhYnNtYXggPSBtLmdldE5hbWVSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCWFic21pbiA9IG0uZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQltX3RhZ1Njb3BlID0gVGFnU3BlYy5NRVRIT0Q7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCW1fdGFnU2NvcGUgPSAtMTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgYWZ0ZXIgdGhlIG5hbWUgZm9yIHRoZSBtZW1iZXIuCi0JCWlmIChhYnNtYXggPCBmcm9tT2Zmc2V0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBtaW4gPSAwLCBtYXggPSAwOwotCQl0cnkgewotCQkJLy8gU2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIHN0YXJ0aW5nICdAJy4KLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAobWluID0gZnJvbU9mZnNldDsgbWluID49IGFic21pbjsgbWluLS0pIHsKLQkJCQlpZiAobV9kb2MuZ2V0Q2hhcihtaW4pID09ICdAJykgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gU2VhcmNoIGZvcndhcmRzIGZvciB0aGUgbmV4dCAnQCcsIG9yIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCi0JCQlmb3IgKG1heCA9IGZyb21PZmZzZXQgKyAxOyBtYXggPCBhYnNtYXg7IG1heCsrKSB7Ci0JCQkJaWYgKG1fZG9jLmdldENoYXIobWF4KSA9PSAnQCcpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBuZXcgQW5ub3RhdGlvbkFyZWEoZWwsIG1pbiwgTWF0aC5taW4oYWJzbWF4LCBtYXgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb29rdXBUYWdIZWxwKFRhZ1NwZWMgdHMpIHsKLQkJaWYgKHRzICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXJldHVybiB0cy5sb29rdXBUYWdIZWxwKCk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCS8vIERvIG5vdGhpbmcsIHJldHVybiBudWxsCi0JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cEF0dEhlbHAoVGFnQXR0cmliU3BlYyB0YXMpIHsKLQkJaWYgKHRhcyAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGFzLmxvb2t1cFRhZ0hlbHAoKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZywgcmV0dXJuIG51bGwKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSByYW5nZSB0aGF0IGdvZXMgZnJvbSB0aGUgYmVnaW5uaW5nIHBvc2l0aW9uIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGVuZCBwb3NpdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uQXJlYSB7Ci0JCS8qKgotCQkgKiBEb2N1bWVudCBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgamF2YWRvYyBhbm5vdGF0aW9uLgotCQkgKi8KLQkJaW50IGJlZ2luT2Zmc2V0OwotCi0JCS8qKgotCQkgKiBEb2N1bWVudCBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgYXJlYSB0aGF0IGNvdWxkIGNvbnRhaW4gYW4gYW5ub3RhdGlvbi4KLQkJICovCi0JCWludCBlbmRPZmZzZXQ7Ci0JCS8qKgotCQkgKiBUaGUgSmF2YSBlbGVtZW50IHRoYXQgdGhpcyBhbm5vdGF0aW9uIGlzIGFzc2lnbmVkLgotCQkgKiAKLQkJICogQHBhcmFtIGJlZwotCQkgKiBAcGFyYW0gZW5kCi0JCSAqLwotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQ7Ci0KLQkJcHVibGljIEFubm90YXRpb25BcmVhKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgaW50IGJlZywgaW50IGVuZCkgewotCQkJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50OwotCQkJYmVnaW5PZmZzZXQgPSBiZWc7Ci0JCQllbmRPZmZzZXQgPSBlbmQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gb2Zmc2V0ID49IGJlZ2luT2Zmc2V0ICYmIG9mZnNldCA8IGVuZE9mZnNldDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQkJcmV0dXJuIGVuZE9mZnNldCAtIGJlZ2luT2Zmc2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYXJlYS4gT25seSB2YWxpZCBpZgotCQkgKiA8Y29kZT50aGlzLmNvbnRhaW5zKCBhYnNDdXJzb3JQb3MgKTwvY29kZT4KLQkJICogCi0JCSAqIEBwYXJhbSBhYnNDdXJzb3JQb3MKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIGludCByZWxhdGl2ZUN1cnNvclBvcyhpbnQgYWJzQ3Vyc29yUG9zKSB7Ci0JCQlyZXR1cm4gYWJzQ3Vyc29yUG9zIC0gYmVnaW5PZmZzZXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHJlbGF0aXZlVG9BYnMoaW50IHJlbFBvcykgewotCQkJcmV0dXJuIGJlZ2luT2Zmc2V0ICsgcmVsUG9zOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXR0cmlidXRlIHsKLQkJVG9rZW4gbmFtZTsKLQotCQlUb2tlbiB2YWx1ZTsKLQotCQlpbnQgZXF1YWxzUG9zOwotCi0JCUF0dHJpYnV0ZShUb2tlbiBuLCBpbnQgZXAsIFRva2VuIHYpIHsKLQkJCW5hbWUgPSBuOwotCQkJdmFsdWUgPSB2OwotCQkJZXF1YWxzUG9zID0gZXA7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBc3NpZ25tZW50KCkgewotCQkJcmV0dXJuIGVxdWFsc1BvcyAhPSAtMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1ZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlLmxlbmd0aCgpICE9IDA7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgc3JjUG9zKSB7Ci0JCQlyZXR1cm4gc3JjUG9zID49IG1pbkV4dGVudCgpICYmIHNyY1BvcyA8PSBtYXhFeHRlbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbWluRXh0ZW50KCkgewotCQkJcmV0dXJuIG5hbWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG1heEV4dGVudCgpIHsKLQkJCWlmIChoYXNBc3NpZ25tZW50KCkpIHsKLQkJCQlpZiAoaGFzVmFsdWUoKSkKLQkJCQkJcmV0dXJuIHZhbHVlLmdldEVuZCgpOwotCQkJCXJldHVybiBlcXVhbHNQb3M7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZS5nZXRFbmQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGltbWVkaWF0ZWx5UHJlY2VkZXMoaW50IHBvcykgewotCQkJcmV0dXJuIG1heEV4dGVudCgpICsgMSA9PSBwb3M7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ1Byb3Bvc2FsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ1Byb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzM0NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGtlbGxleXAKLSAqIAotICogQSBjb21wbGV0aW9uIHByb3Bvc2FsIGVzcGVjaWFsbHkgZm9yIEFubm90YXRpb24gdGFnIGNvbXBsZXRpb25zLiBUaGlzIHByb2JsZW0gdGhpcyBjbGFzcyB3YXMKLSAqIGNyZWF0ZWQgdG8gc29sdmUgd2FzIHRoZSBwcm9ibGVtIG9mIGF0dGFjaGluZyBoZWxwIHRleHQgdG8gYSBwcm9wb3NhbC4gVGhlIG1lY2hhbmlzbSBpbnNpZGUgb2YKLSAqIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgd2FzIHVzZWxlc3MgdG8gdXMsIHNpbmNlIGl0IHdhcyB0aWVkIHRvIHRoZSBpZGVhIHRoYXQgdGhlIHByb3Bvc2FsIHdvdWxkCi0gKiBiZSBmb3IgYW4gYWN0dWFsIGphdmEgZWxlbWVudCwgdGhhdCBoYXMgamF2YWRvYyBhdHRhY2hlZCB0byBpdCwgZXRjLi4uIFNvIGhlcmUgd2Ugc3ViY2xhc3MKLSAqIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgYW5kIG92ZXJyaWRlIDxjb2RlPmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm88L2NvZGU+IGZvciBhIG1vcmUgc3VpdGFibGUKLSAqIHdheSBvZiBhc3NvY2lhdGluZyBoZWxwIHRleHQgd2l0aCBhIHByb3Bvc2FsLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGFnUHJvcG9zYWwgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7Ci0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlRW5kUXVvdGUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBsb2NhbFN0cmluZzsKLQkvL1N0cmluZyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBwcmVmaXguCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbGlkYXRpb25TdHJpbmc7Ci0KLQkvKioKLQkgKiBMb2NhbGl6ZWQgaGVscCB0ZXh0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvY1RleHQ7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdHJpbmcKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRPZmZzZXQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEBwYXJhbSByZWxldmFuY2UKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHJlbGV2YW5jZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlcGxhY2VtZW50U3RyaW5nKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZXBsYWNlbWVudE9mZnNldCA+PSAwKTsKLQkJQXNzZXJ0LmlzVHJ1ZShyZXBsYWNlbWVudExlbmd0aCA+PSAwKTsKLQotCQlzZXRSZXBsYWNlbWVudFN0cmluZyhyZXBsYWNlbWVudFN0cmluZyk7Ci0JCXNldFJlcGxhY2VtZW50T2Zmc2V0KHJlcGxhY2VtZW50T2Zmc2V0KTsKLQkJc2V0UmVwbGFjZW1lbnRMZW5ndGgocmVwbGFjZW1lbnRMZW5ndGgpOwotCQlzZXRJbWFnZShpbWFnZSk7Ci0JCXNldERpc3BsYXlTdHJpbmcoZGlzcGxheVN0cmluZyA9PSBudWxsID8gcmVwbGFjZW1lbnRTdHJpbmcgOiBkaXNwbGF5U3RyaW5nKTsKLQkJc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCXNldEN1cnNvclBvc2l0aW9uKHJlcGxhY2VtZW50U3RyaW5nLmxlbmd0aCgpKTsKLQkJc2V0U29ydFN0cmluZyhkaXNwbGF5U3RyaW5nID09IG51bGwgPyByZXBsYWNlbWVudFN0cmluZyA6IGRpc3BsYXlTdHJpbmcpOwotCQl0aGlzLmxvY2FsU3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLlN0cmluZywgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdHJpbmcKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRPZmZzZXQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEBwYXJhbSByZWxldmFuY2UKLQkgKi8KLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwoQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciBwcm9wb3NhbEhlbHBlcikgewotCQl0aGlzKHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50U3RyaW5nKCksIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlT2Zmc2V0KCksIHByb3Bvc2FsSGVscGVyLmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG51bGwsIHByb3Bvc2FsSGVscGVyLmdldFZhbHVlRGlzcGxheVN0cmluZygpLCA5MCk7Ci0JCWlmIChwcm9wb3NhbEhlbHBlciBpbnN0YW5jZW9mIFVJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcikKLQkJCXNldEltYWdlKCgoVUlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyKSBwcm9wb3NhbEhlbHBlcikuZ2V0SW1hZ2UoKSk7Ci0JCXNldEVuc3VyZUJlZ2luUXVvdGUocHJvcG9zYWxIZWxwZXIuZW5zdXJlQmVnaW5RdW90ZSgpKTsKLQkJc2V0RW5zdXJlRW5kUXVvdGUocHJvcG9zYWxIZWxwZXIuZW5zdXJlRW5kUXVvdGUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25UYWdQcm9wb3NhbChVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIgcHJvcG9zYWxIZWxwZXIpIHsKLQkJdGhpcyhwcm9wb3NhbEhlbHBlci5nZXRSZXBsYWNlbWVudFN0cmluZygpLCBwcm9wb3NhbEhlbHBlci5nZXRWYWx1ZU9mZnNldCgpLCBwcm9wb3NhbEhlbHBlci5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBwcm9wb3NhbEhlbHBlci5nZXRJbWFnZSgpLCBwcm9wb3NhbEhlbHBlci5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSwgOTApOwotCQlzZXRFbnN1cmVCZWdpblF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUJlZ2luUXVvdGUoKSk7Ci0JCXNldEVuc3VyZUVuZFF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUVuZFF1b3RlKCkpOwotCX0KLQotCS8qKgotCSAqIE91ciBvdmVycmlkZSB0aGF0IHVzZXMgPGNvZGU+dGV4dEhvbGRlcjwvY29kZT4gdG8gcHJvdmlkZSB0aGUgaGVscCB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIGxvY1RleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaG9sZGVyIG9mIHRoZSBoZWxwIHRleHQgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHdpdGggdGhpcyBwcm9wb3NhbC4KLQkgKiAKLQkgKiBAcGFyYW0gaGxkCi0JICogICAgICAgICAgICBhbiBMb2NhbGl6ZWRUZXh0Q29udGFpbmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscFRleHQoU3RyaW5nIHMpIHsKLQkJbG9jVGV4dCA9IHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBjaGFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJZW5zdXJlUXVvdGVkSWZOZWNlc3NhcnkoZG9jdW1lbnQsIG9mZnNldCk7Ci0JCXN1cGVyLmFwcGx5KGRvY3VtZW50LCB0cmlnZ2VyLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlUXVvdGVkSWZOZWNlc3NhcnkoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChlbnN1cmVCZWdpblF1b3RlIHx8IGVuc3VyZUVuZFF1b3RlKSB7Ci0JCQl0cnkgewotCQkJCWNoYXIgYmVnaW4gPSBkb2N1bWVudC5nZXRDaGFyKGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgLSAxKTsKLQkJCQljaGFyIGVuZCA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoZW5zdXJlQmVnaW5RdW90ZSAmJiBlbnN1cmVFbmRRdW90ZSAmJiBiZWdpbiAhPSBRVU9URSAmJiBlbmQgIT0gUVVPVEUpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWIuYXBwZW5kKFFVT1RFKS5hcHBlbmQobG9jYWxTdHJpbmcpLmFwcGVuZChRVU9URSk7Ci0JCQkJCWxvY2FsU3RyaW5nID0gYi50b1N0cmluZygpOwotCQkJCX0gZWxzZSBpZiAoZW5zdXJlQmVnaW5RdW90ZSAmJiBiZWdpbiAhPSBRVU9URSkKLQkJCQkJbG9jYWxTdHJpbmcgPSBRVU9URSArIGxvY2FsU3RyaW5nOwotCQkJCWVsc2UgaWYgKGVuc3VyZUVuZFF1b3RlICYmIGVuZCAhPSBRVU9URSkKLQkJCQkJbG9jYWxTdHJpbmcgPSBsb2NhbFN0cmluZyArIFFVT1RFOwotCQkJCXNldFJlcGxhY2VtZW50U3RyaW5nKGxvY2FsU3RyaW5nKTsKLQkJCQlzZXRDdXJzb3JQb3NpdGlvbihsb2NhbFN0cmluZy5sZW5ndGgoKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5zdXJlUXVvdGVkKGJvb2xlYW4gZW5zdXJlUXVvdGVkKSB7Ci0JCXNldEVuc3VyZUJlZ2luUXVvdGUoZW5zdXJlUXVvdGVkKTsKLQkJc2V0RW5zdXJlRW5kUXVvdGUoZW5zdXJlUXVvdGVkKTsKLQl9Ci0KLQkvL3B1YmxpYyB2b2lkIHNldFBhcnRpYWxWYWx1ZVN0cmluZyhTdHJpbmcgcGFydGlhbFZhbHVlU3RyaW5nKSB7Ci0JLy8JdGhpcy5wYXJ0aWFsVmFsdWVTdHJpbmcgPSBwYXJ0aWFsVmFsdWVTdHJpbmc7Ci0JLy99Ci0JcHVibGljIHZvaWQgc2V0RW5zdXJlQmVnaW5RdW90ZShib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUpIHsKLQkJdGhpcy5lbnN1cmVCZWdpblF1b3RlID0gZW5zdXJlQmVnaW5RdW90ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnN1cmVFbmRRdW90ZShib29sZWFuIGVuc3VyZUVuZFF1b3RlKSB7Ci0JCXRoaXMuZW5zdXJlRW5kUXVvdGUgPSBlbnN1cmVFbmRRdW90ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChnZXRSZXBsYWNlbWVudFN0cmluZygpLnN0YXJ0c1dpdGgoZ2V0RGlzcGxheVN0cmluZygpKSkgewotCQkJcmV0dXJuIHN1cGVyLmlzVmFsaWRQcmVmaXgocHJlZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNQcmVmaXgodHJpbShwcmVmaXgpLCBnZXRWYWxpZGF0aW9uU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyaW5nKCkgewotCQlpZiAoZlZhbGlkYXRpb25TdHJpbmcgPT0gbnVsbCkgewotCQkJZlZhbGlkYXRpb25TdHJpbmcgPSB0cmltKGdldFJlcGxhY2VtZW50U3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRhdGlvblN0cmluZzsKLQl9Ci0KLQkKLQkvKgotCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpcyBjb21wbGV4IGFuZCBsYXJnZXIgdGhhbiB0aGUgcHJlZml4LgotCSAqIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHRyaW0gdGhlIHByZWZpeCB0byB0aGUgbGFzdCB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gIFRoaXMKLQkgKiB3aWxsIHByb3ZpZGUgdXMgd2l0aCBhIHByZWZpeCB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgZGlzcGxheSBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdHJpbShTdHJpbmcgYVN0cmluZykgewotCQlpZiAoYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBhU3RyaW5nOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gY2hhcnMgPSBhU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSBjaGFycy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhcnNbaV0pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoY2hhcnNbaV0pOwotCQkJfQotCQl9Ci0JCWJ1ZmZlciA9IGJ1ZmZlci5yZXZlcnNlKCk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0lXUkRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9JV1JEUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjg2ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0lXUkRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIElXUkRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkudGFnaGFuZGxlcnVpIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElXUkRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVBbm5vdGF0aW9uc0NvbXBsZXRpb25Qcm9jZXNzb3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yXzQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJV1JEUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk1Mzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9VSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIgZXh0ZW5kcyBBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIHsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nCi0JICogQHBhcmFtIHZhbHVlT2Zmc2V0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIHZhbHVlRGlzcGxheVN0cmluZwotCSAqLwotCXB1YmxpYyBVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgdmFsdWVPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHZhbHVlRGlzcGxheVN0cmluZykgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgdmFsdWVPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCB2YWx1ZURpc3BsYXlTdHJpbmcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VpUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5NmY0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVpUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZjMWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkMjljMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWpkdF9pbnRlZ3JhdGlvbi5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzBiY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE4MzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA0IDIzOjI0OjUyIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmZGIxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlZGYzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjOTc5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIgotCQlmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIgotCQlmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhZDAzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SW50ZWdyYXRpb24gUGx1Zy1pbgotcGx1Z2luVmVuZG9yPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWVhZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICBuYW1lPSJXb3JraW5nIENvcHkgTWFuYWdlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9IndvcmtpbmdDb3B5TWFuYWdlciIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5XVFBXb3JraW5nQ29weU1hbmFnZXIiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBuYW1lPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIiPgotICAgICAgPHZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyCi0gICAgICAgIGlkPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBoYW5kbGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLkphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHNlbGVjdGlvblR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QudXRpbGl0eSIKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeSI+Ci0gICAgICA8L2VkaXRNb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsLkphdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZyI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsLkRhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWciLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ZyYW1ld29ya3MvQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vZnJhbWV3b3Jrcy9Db21tb25GcmFtZXdvcmtzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzhkYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vZnJhbWV3b3Jrcy9Db21tb25GcmFtZXdvcmtzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbiAKLQotICAgIGV4dGVuZHMgV1RQUGx1Z2luCi0KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09VUkNFX0ZPTERFUiA9ICJkZWZhdWx0U291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GT0xERVIgPSAib3V0cHV0Rm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbiBpbnN0OwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwbHVnaW4gc2luZ2xldG9uLgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbiBnZXREZWZhdWx0KCkgCi0gICAgewotICAgICAgICByZXR1cm4gaW5zdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbW1vbkZyYW1ld29ya3NQbHVnaW4oKSB7Ci0gICAgCXN1cGVyKCk7Ci0JCWlmIChpbnN0ID09IG51bGwpCi0JCQlpbnN0ID0gdGhpczsKLQl9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIFBMVUdJTl9JRDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUxvZyBsb2cgPSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9ICJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBsb2cubG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRjYjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aERlY29yYXRpb25zCi17Ci0gICAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKLSAgICBwcml2YXRlIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBleHRyYUF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50UGF0aCggZmluYWwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBmaW5hbCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoQXR0cmlidXRlW10gZ2V0RXh0cmFBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhcnJheSAKLSAgICAgICAgICAgID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLnNpemUoKSBdOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChJQ2xhc3NwYXRoQXR0cmlidXRlW10pIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLnRvQXJyYXkoIGFycmF5ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhQXR0cmlidXRlcyggZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4dHJhQXR0cmlidXRlcy5hZGQoIGF0dHJzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dHJhQXR0cmlidXRlKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyCi0gICAgICAgICAgICA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLmFkZCggYXR0ciApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjYzNThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIKLXsKLQlwcml2YXRlIGZpbmFsIEZpbGUgZjsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgZGVjb3JhdGlvbnM7Ci0gICAgCi0gICAgcHVibGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBGaWxlIHdzZGlyID0gd3MuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgd3NtZHJvb3QgPSBuZXcgRmlsZSggd3NkaXIsICIubWV0YWRhdGEvLnBsdWdpbnMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluYWwgRmlsZSBwbWRyb290ID0gbmV3IEZpbGUoIHdzbWRyb290LCBwbHVnaW4gKTsKLSAgICAKLSAgICAgICAgdGhpcy5mID0gbmV3IEZpbGUoIHBtZHJvb3QsICJjbGFzc3BhdGguZGVjb3JhdGlvbnMueG1sIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSByZWFkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGFzc3BhdGhEZWNvcmF0aW9ucyBnZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRyeSApCi0gICAgewotICAgICAgICBmaW5hbCBIYXNoTWFwIHN1Ym1hcCA9IChIYXNoTWFwKSB0aGlzLmRlY29yYXRpb25zLmdldCgga2V5ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3VibWFwID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChDbGFzc3BhdGhEZWNvcmF0aW9ucykgc3VibWFwLmdldCggZW50cnkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgKQotICAgIHsKLSAgICAJSGFzaE1hcCBzdWJtYXAgPSAoSGFzaE1hcCkgdGhpcy5kZWNvcmF0aW9ucy5nZXQoIGtleSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHN1Ym1hcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VibWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMucHV0KCBrZXksIHN1Ym1hcCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdWJtYXAucHV0KCBlbnRyeSwgZGVjICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyQWxsRGVjb3JhdGlvbnMoIGZpbmFsIFN0cmluZyBrZXkgKQotICAgIHsKLSAgICAJdGhpcy5kZWNvcmF0aW9ucy5yZW1vdmUoIGtleSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoKQotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmb2xkZXIgPSB0aGlzLmYuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAKLSAgICAgICAgaWYoICEgZm9sZGVyLmV4aXN0cygpICYmICEgZm9sZGVyLm1rZGlycygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcmludFdyaXRlciB3ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgQnVmZmVyZWRXcml0ZXIoIG5ldyBGaWxlV3JpdGVyKCB0aGlzLmYgKSApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHcucHJpbnRsbiggIjxjbGFzc3BhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IGRlY29yYXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgIGl0cjEuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MSA9IChNYXAuRW50cnkpIGl0cjEubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcCBzdWJtYXAgPSAoTWFwKSBlbnRyeTEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50KCAiICA8Y29udGFpbmVyIGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkxLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgdy5wcmludGxuKCAiXCI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gc3VibWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgICAgICBpdHIyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MiA9IChNYXAuRW50cnkpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjIAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoQ2xhc3NwYXRoRGVjb3JhdGlvbnMpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICA8ZW50cnkgaWQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkyLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIlwiPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBkZWMuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyID0gYXR0cnNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICAgIDxhdHRyaWJ1dGUgbmFtZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggYXR0ci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICJcIj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiPC9hdHRyaWJ1dGU+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIiAgICA8L2VudHJ5PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50bG4oICIgIDwvY29udGFpbmVyPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3LnByaW50bG4oICI8L2NsYXNzcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHJlYWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiggISB0aGlzLmYuZXhpc3RzKCkgKSByZXR1cm4gbWFwOwotCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgRWxlbWVudCByb290ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGYgKSApOwotICAgICAgICAgICAgcm9vdCA9IGRvY2J1aWxkZXIucGFyc2UoIGluICkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW4gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IGVsZW1lbnRzKCByb290LCAiY29udGFpbmVyIiApOyBpdHIxLmhhc05leHQoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZTEgPSAoRWxlbWVudCkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2lkID0gZTEuZ2V0QXR0cmlidXRlKCAiaWQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSGFzaE1hcCBzdWJtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgbWFwLnB1dCggY2lkLCBzdWJtYXAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gZWxlbWVudHMoIGUxLCAiZW50cnkiICk7IGl0cjIuaGFzTmV4dCgpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUyID0gKEVsZW1lbnQpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlaWQgPSBlMi5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN1Ym1hcC5wdXQoIGVpZCwgZGVjICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIzID0gZWxlbWVudHMoIGUyICk7IGl0cjMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUzID0gKEVsZW1lbnQpIGl0cjMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbiA9IGUzLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggbi5lcXVhbHMoICJzb3VyY2UtYXR0YWNobWVudC1wYXRoIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFBhdGgoIG5ldyBQYXRoKCB0ZXh0KCBlMyApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBuLmVxdWFscyggInNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aCIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjLnNldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCggbmV3IFBhdGgoIHRleHQoIGUzICkgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG4uZXF1YWxzKCAiYXR0cmlidXRlIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGUzLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5hZGRFeHRyYUF0dHJpYnV0ZSggbmFtZSwgdGV4dCggZTMgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGV4dCggZmluYWwgRWxlbWVudCBlbCApCi0gICAgewotICAgICAgICBmaW5hbCBOb2RlTGlzdCBub2RlcyA9IGVsLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICBTdHJpbmcgc3RyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IG5vZGVzLmdldExlbmd0aCgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gbm9kZXMuaXRlbSggaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYnVmICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdmFsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHN0ciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggc3RyICk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHZhbCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gdmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGJ1ZiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yIGVsZW1lbnRzKCBmaW5hbCBFbGVtZW50IGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudHNJdGVyYXRvciggZWwsIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3IgZWxlbWVudHMoIGZpbmFsIEVsZW1lbnQgZWwgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50c0l0ZXJhdG9yKCBlbCwgbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnRzSXRlcmF0b3IKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJdGVyYXRvcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTm9kZUxpc3Qgbm9kZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247Ci0gICAgICAgIHByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0gICAgICAgIHB1YmxpYyBFbGVtZW50c0l0ZXJhdG9yKCBmaW5hbCBFbGVtZW50IHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubm9kZXMgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAtMTsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24rKzsKLQotICAgICAgICAgICAgZm9yKCA7IHRoaXMucG9zaXRpb24gPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmVsZW1lbnQgPT0gbnVsbDsgCi0gICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24rKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gdGhpcy5ub2Rlcy5pdGVtKCB0aGlzLnBvc2l0aW9uICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmCi0gICAgICAgICAgICAgICAgICAgICggdGhpcy5uYW1lID09IG51bGwgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyggdGhpcy5uYW1lICkgKSApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCB0aGlzLmVsZW1lbnQgIT0gbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWwgPSB0aGlzLmVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIGlmKCBlbCA9PSBudWxsICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWR2YW5jZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gZWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSAKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE2MWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aFV0aWwKLXsKLSAgICBwcml2YXRlIENsYXNzcGF0aFV0aWwoKSB7fQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGdldFJlc29sdmVkQ2xhc3NwYXRoKCBmaW5hbCBJSmF2YVByb2plY3QganByb2osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIGVudHJ5VG9JZ25vcmUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFJlc29sdmVkQ2xhc3NwYXRoKCBqcHJvaiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBlbnRyeVRvSWdub3JlICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0IGVudHJpZXNUb0lnbm9yZSApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQgcmVzb2x2ZWQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgdHJ5IAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1sgaSBdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBlbnRyaWVzVG9JZ25vcmUuY29udGFpbnMoIGVudHJ5LmdldFBhdGgoKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzd2l0Y2goIGVudHJ5LmdldEVudHJ5S2luZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQuYWRkKCBlbnRyeS5nZXRQYXRoKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KCBlbnRyeSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZW50cnkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQuYWRkKCBlbnRyeS5nZXRQYXRoKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciggZW50cnkuZ2V0UGF0aCgpLCBqcHJvaiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbnRhaW5lciAhPSBudWxsICkgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCi0JICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBjb250YWluZXJFbnRyaWVzLmxlbmd0aDsgaisrICkKLQkgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggY29udGFpbmVyRW50cmllc1sgaiBdLmdldFBhdGgoKSApOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvciggZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZDMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyCi0KLSAgICBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXIKLQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aFR5cGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aFR5cGUgCi0gICAgICAgICAgICBMSUJfRElSRUNUT1JZID0gbmV3IFBhdGhUeXBlKCksCi0gICAgICAgICAgICBDTEFTU0VTX0RJUkVDVE9SWSA9IG5ldyBQYXRoVHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZGVjb3JhdGlvbnM7IAotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb3VyY2UgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyB0bwotICAgICAgICAvLyByZXNvdXJjZXMgcmVsZXZhbnQgdG8gZmxleGlibGUgcHJvamVjdCBjb250YWluZXJzIGFjcm9zcyB0aGUKLSAgICAgICAgLy8gd29ya3NwYWNlIGFuZCByZWZyZXNoIHRoZW0gYXMgbmVjZXNzYXJ5LgotICAgICAgICAKLSAgICAgICAgTGlzdGVuZXIucmVnaXN0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlYWQgdGhlIGRlY29yYXRpb25zIGZyb20gdGhlIHdvcmtzcGFjZSBtZXRhZGF0YS4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW4gPSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLlBMVUdJTl9JRDsKLSAgICAgICAgZGVjb3JhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyKCBwbHVnaW4gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIiEiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVjb3JhdGlvbk1hbmFnZXJLZXkoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRhaW5lcil7Ci0gICAgCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKSArIFNFUEFSQVRPUiArIGNvbnRhaW5lcjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIElQYXRoIHBhdGg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIElKYXZhUHJvamVjdCBvd25lcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIElQYXRoW10gcGF0aHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXRoVHlwZVtdIHBhdGhUeXBlczsKLSAgICBwcml2YXRlIGZpbmFsIExpc3QgZW50cmllczsKLSAgICBwcml2YXRlIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwZW50cmllczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgY29udGFpbmVyVHlwZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIAotICAgIHB1YmxpYyBGbGV4aWJsZVByb2plY3RDb250YWluZXIoIGZpbmFsIElQYXRoIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IG93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGhbXSBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoVHlwZVtdIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy5wYXRocyA9IHBhdGhzOwotICAgICAgICB0aGlzLnBhdGhUeXBlcyA9IHR5cGVzOwotICAgICAgICAKLSAgICAgICAgaWYoICEgaXNGbGV4aWJsZVByb2plY3QoIHRoaXMucHJvamVjdCApICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2lsZW50bHkgbm9vcCBpZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0IGlzIG5vdCBhIGZsZXhpYmxlCi0gICAgICAgICAgICAvLyBwcm9qZWN0LiBTaG91bGQgSSBiZSBkb2luZyBzb21ldGhpbmcgZWxzZSBoZXJlPwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmVudHJpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICAgICAgdGhpcy5jcGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WyAwIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkRmxleGlibGVQcm9qZWN0Q29udGFpbmVyVHlwZSggcGF0aC5zZWdtZW50KCAwICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZW50cmllcyA9IGNvbXB1dGVDbGFzc3BhdGhFbnRyaWVzKCk7Ci0gICAgICAgIHRoaXMuY3BlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVsgdGhpcy5lbnRyaWVzLnNpemUoKSBdOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSB0aGlzLmVudHJpZXMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgSVBhdGggZW50cnlQYXRoID0gKElQYXRoKSB0aGlzLmVudHJpZXMuZ2V0KCBpICk7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOyAKLSAgICAgICAgICAgIGlmKG51bGwgIT0gcmVzb3VyY2UgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotICAgICAgICAgICAgICAgIHRoaXMuY3BlbnRyaWVzWyBpIF0gPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoZW50cnlQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhpcy5jcGVudHJpZXNbIGkgXSA9IG5ld0xpYnJhcnlFbnRyeSggZW50cnlQYXRoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBLX0FQUExJQ0FUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNwZW50cmllczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdXRPZkRhdGUoIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhICkKLSAgICB7Ci0gICAgICAgIGlmKCBkZWx0YSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0IGN1cnJlbnRFbnRyaWVzID0gY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKTsKLSAgICAgICAgcmV0dXJuICEgdGhpcy5lbnRyaWVzLmVxdWFscyggY3VycmVudEVudHJpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVmcmVzaCgpOwotICAgIAotICAgIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZ2V0RGVjb3JhdGlvbnNNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvcmF0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGNvbXB1dGVDbGFzc3BhdGhFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZjIAotICAgICAgICAgICAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggdGhpcy5wcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdmMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQgZXhpc3RpbmdFbnRyaWVzIAotICAgICAgICAgICAgPSBDbGFzc3BhdGhVdGlsLmdldFJlc29sdmVkQ2xhc3NwYXRoKCB0aGlzLm93bmVyLCBnZXRQYXRoKCkgKTsKLSAgICAgICAgCi0gICAgICAgIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IHZjLmdldFJlZmVyZW5jZXMoKTsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7Ci0gICAgICAgIFNldCBqYXJzSGFuZGxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFN0cmluZyBqYXJOYW1lID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21wID0gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBpZiAoIXJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMocGF0aHNbMF0ubWFrZUFic29sdXRlKCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgamFyTmFtZSA9IHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gamFyTmFtZSl7Ci0gICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKGphck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVBhdGggbmV3UGF0aCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcC5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGNvbXA7Ci0gICAgICAgICAgICAgICAgaWYgKGFyY2hpdmVDb21wLmdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFKSkgewotICAgICAgICAgICAgICAgIAkvLyBkbyBub3QgcHJvY2VzcyBjb21wb25lbnRzIGR5bmFtaWNhbGx5IGNvbXB1dGVkIGZyb20gdGhlIEphdmEgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlza0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAJbmV3UGF0aCA9bmV3IFBhdGgoZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRyaWVzLmNvbnRhaW5zKGlGaWxlLmdldEZ1bGxQYXRoKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gY29tcC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgbmV3UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgCWlmKCBuZXdQYXRoICE9IG51bGwgJiYgISBleGlzdGluZ0VudHJpZXMuY29udGFpbnMoIG5ld1BhdGggKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cmllcy5hZGQoIG5ld1BhdGggKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0aGlzLnBhdGhzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZjLmdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsRm9sZGVyIHZmID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoIHBhdGhzWyBpIF0gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMucGF0aFR5cGVzWyBpIF0gPT0gUGF0aFR5cGUuTElCX0RJUkVDVE9SWSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIGNvbnRlbnRzOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBtZW1iZXJzKCB2ZiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY29udGVudHMubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJlc291cmNlIHIgPSBjb250ZW50c1sgaiBdLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwID0gci5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIWphcnNIYW5kbGVkLmNvbnRhaW5zKHAubGFzdFNlZ21lbnQoKSkgJiYgIGlzSmFyRmlsZSggciApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKHAubGFzdFNlZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIGV4aXN0aW5nRW50cmllcy5jb250YWlucyggcCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAllbnRyaWVzLmFkZCggcCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDb250YWluZXJbXSB1ZiA9IHZmLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCB1Zi5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwID0gdWZbIGogXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgamFyc0hhbmRsZWQuY29udGFpbnMoIHAubGFzdFNlZ21lbnQoKSApICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgISBpc1NvdXJjZU9yT3V0cHV0RGlyZWN0b3J5KCBwICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXJzSGFuZGxlZC5hZGQocC5sYXN0U2VnbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgZXhpc3RpbmdFbnRyaWVzLmNvbnRhaW5zKCBwICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgCWVudHJpZXMuYWRkKCBwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW50cmllczsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCB0byBwcm92aWRlIGEgc2FmZSBsYXN0LW1pbnV0ZSB3b3JrYXJvdW5kCi0gICAgLy8gZm9yIHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk3NC4KLSAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgcmV2aXNpdGVkIGluIGEgZnV0dXJlIHJlbGVhc2UgdG8gZmluZCBhIG1vcmUKLSAgICAvLyBwZXJtYW5lbnQgc29sdXRpb24uCi0KLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoIGZpbmFsIElWaXJ0dWFsRm9sZGVyIHZmICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiB2Zi5tZW1iZXJzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeSggZmluYWwgSVBhdGggcCApCi0gICAgewotICAgICAgICBJUGF0aCBzcmNwYXRoID0gbnVsbDsKLSAgICAgICAgSVBhdGggc3Jjcm9vdHBhdGggPSBudWxsOwotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cnMgPSB7fTsKLSAgICAgICAgSUFjY2Vzc1J1bGVbXSBhY2Nlc3MgPSB7fTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyAKLSAgICAgICAgICAgID0gZGVjb3JhdGlvbnMuZ2V0RGVjb3JhdGlvbnMoIGdldERlY29yYXRpb25NYW5hZ2VyS2V5KHByb2plY3QsIGdldFBhdGgoKS50b1N0cmluZygpKSwgcC50b1N0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVjICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzcmNwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0gICAgICAgICAgICBzcmNyb290cGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KCBwLCBzcmNwYXRoLCBzcmNyb290cGF0aCwgYWNjZXNzLCBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZU9yT3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBJUGF0aCBhUGF0aCApCi0gICAgewotICAgICAgICBpZiggaXNKYXZhUHJvamVjdCggdGhpcy5wcm9qZWN0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoIHRoaXMucHJvamVjdCApOwotICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ganByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBzcmMgPSBjcGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggb3V0cHV0ID0gY3BlLmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzcmMuZXF1YWxzKCBhUGF0aCApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0LmVxdWFscyggYVBhdGggKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGpwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkuZXF1YWxzKCBhUGF0aCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoIGZpbmFsIElQcm9qZWN0IHBqICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGouZ2V0TmF0dXJlKCBKYXZhQ29yZS5OQVRVUkVfSUQgKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0KCBmaW5hbCBJUHJvamVjdCBwaiApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBqLmdldE5hdHVyZSggSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEICkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXJGaWxlKCBmaW5hbCBJUmVzb3VyY2UgZiApCi0gICAgewotICAgICAgICBpZiggZi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm5hbWUgPSBmLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZuYW1lLmVuZHNXaXRoKCAiLmphciIgKSB8fCBmbmFtZS5lbmRzV2l0aCggIi56aXAiICkgKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWV0YWRhdGFGaWxlKCBmaW5hbCBJUmVzb3VyY2UgZiApCi0gICAgewotICAgICAgICBpZiggZi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm5hbWUgPSBmLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYoIGZuYW1lLmVxdWFscyggIi5jb21wb25lbnQiICkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZuYW1lLmVxdWFscyggIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IiApIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmbmFtZS5lcXVhbHMoICIuY2xhc3NwYXRoIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBmaW5hbCBJUGF0aCBwYXRoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggY29udGFpbmVyVHlwZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyVHlwZXMuY29udGFpbnMoIHBhdGguc2VnbWVudCggMCApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGbGV4aWJsZVByb2plY3RDb250YWluZXJUeXBlKCBmaW5hbCBTdHJpbmcgdHlwZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGNvbnRhaW5lclR5cGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGFpbmVyVHlwZXMuYWRkKCB0eXBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTGlzdGVuZXIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggbGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoIGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2NyZWVuIHRoZSBkZWx0YSBiZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIuIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBpc0ludGVyZXN0aW5nRXZlbnQoIGV2ZW50ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTG9jYXRlIGFsbCBvZiB0aGUgZmxleGlibGUgcHJvamVjdCBjb250YWluZXJzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0cyAKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzWyBpIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaXNKYXZhUHJvamVjdCggcHJvamVjdCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcGVzID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY3Blcy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwZXNbIGogXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBwYXRoICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciggcGF0aCwganByb2ogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKCBjb250ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgY29udGFpbmVycyB0aGF0IGFyZSBvdXQgb2YgZGF0ZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IGNvbnRhaW5lcnMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGbGV4aWJsZVByb2plY3RDb250YWluZXIgYyAKLSAgICAgICAgICAgICAgICAgICAgPSAoRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKSBjb250YWluZXJzLmdldCggaSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjLmlzT3V0T2ZEYXRlKCBkZWx0YSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmVzdGluZ0V2ZW50KCBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsgMSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KCBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCByLmdldFR5cGUoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLlJPT1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5QUk9KRUNUOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KCAoSVByb2plY3QpIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZPTERFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyAwIF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZJTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlzSmFyRmlsZSggciApIHx8IGlzTWV0YWRhdGFGaWxlKCByICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyAwIF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV2ZW50LmdldERlbHRhKCkuYWNjZXB0KCB2aXNpdG9yLCBmYWxzZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFsgMCBdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NDA2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplciAKLQotICAgIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKLQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBkZWNvcmF0aW9ucwotICAgICAgICA9IEZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5nZXREZWNvcmF0aW9uc01hbmFnZXIoKTsKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIHNnICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAJZmluYWwgU3RyaW5nIGtleSA9IEZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5nZXREZWNvcmF0aW9uTWFuYWdlcktleShwcm9qZWN0LmdldFByb2plY3QoKSwgY29udGFpbmVyUGF0aC50b1N0cmluZygpKTsKLSAgICAJCi0gICAgCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBzZy5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0gICAgICAgIAotICAgICAgICBkZWNvcmF0aW9ucy5jbGVhckFsbERlY29yYXRpb25zKCBrZXkgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVBhdGggc3JjcGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0gICAgICAgICAgICBmaW5hbCBJUGF0aCBzcmNyb290cGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0gZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzcmNwYXRoICE9IG51bGwgfHwgYXR0cnMubGVuZ3RoID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVpZCA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50UGF0aCggc3JjcGF0aCApOwotICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIHNyY3Jvb3RwYXRoICk7Ci0gICAgICAgICAgICAgICAgZGVjLnNldEV4dHJhQXR0cmlidXRlcyggYXR0cnMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5zZXREZWNvcmF0aW9ucygga2V5LCBlaWQsIGRlYyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkZWNvcmF0aW9ucy5zYXZlKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcgotICAgICAgICAgICAgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIGNvbnRhaW5lclBhdGgsIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgICggKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgY29udGFpbmVyICkucmVmcmVzaCgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4NzA0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwgZXh0ZW5kcyBBcnRpZmFjdEVkaXRNb2RlbCBpbXBsZW1lbnRzIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBXb3JraW5nQ29weU1hbmFnZXIgd29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwKLQkJCWJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksIFN0cmluZyByb290Q29udGVudFR5cGUpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgY29udGV4dCwgdG9NYWtlUmVhZE9ubHksIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIG1vZHVsZVVSSSwgcm9vdFVSSSwgcm9vdENvbnRlbnRUeXBlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEphdmFBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksCi0JCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXN1cGVyKGVkaXRNb2RlbElELCBjb250ZXh0LCB0b01ha2VSZWFkT25seSwgbW9kdWxlVVJJLCByb290VVJJLCByb290Q29udGVudFR5cGUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5FZGl0TW9kZWxJZAotCSAqIEBwYXJhbSBhQ29udGV4dAotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqIEBwYXJhbSB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5Ci0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKi8KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBib29sZWFuIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwKLQkJCQl0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBhTW9kdWxlVVJJKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuRWRpdE1vZGVsSWQKLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiBAcGFyYW0gdG9NYWtlUmVhZE9ubHkKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqLwotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgYU1vZHVsZVVSSSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBkZWxldGUKLQkgKiAKLQkgKiBAY3UgZnJvbSB0aGUgd29ya2JlbmNoIGFuZCBmaXggdGhlIGludGVybmFsIHJlZmVyZW5jZXMgZm9yIHRoaXMgd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZGVsZXRlKGN1LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEoyRUVOYXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQlzdXBlci5kb0Rpc3Bvc2UoKTsKLQkJcmVzZXRXb3JraW5nQ29weU1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCWphdmEudXRpbC5TZXQgYWZmZWN0ZWQgPSBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JCWlmIChnZXRXb3JraW5nQ29weU1hbmFnZXIoKSAhPSBudWxsKQotCQkJYWZmZWN0ZWQuYWRkQWxsKGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldEFmZmVjdGVkRmlsZXMoKSk7Ci0JCi0JCXJldHVybiBhZmZlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuIERvZXMgbm90IGNvbm5lY3QgdGhlIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRFeGlzdGluZ1dvcmtpbmdDb3B5KGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXRzIG9ubHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJYm9vbGVhbiBkaXJ0eUJvb2wgPSBzdXBlci5pc0RpcnR5KCk7Ci0JCWlmICghZGlydHlCb29sICYmIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpICE9IG51bGwpCi0JCQlkaXJ0eUJvb2wgPSBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5oYXNXb3JraW5nQ29waWVzKCk7Ci0JCXJldHVybiBkaXJ0eUJvb2w7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNhdmVDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlpZiAobW9uaXRvciA9PSBudWxsIHx8ICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXN1cGVyLnByaW1TYXZlKG1vbml0b3IpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2UpIHsKLQkJCQlhY2Nlc3MoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCQkvL1dlIG5lZWQgYSBiZXR0ZXIgd2F5IHRvIHBhc3MgdGhpcyB0aHJvdWdoIHRoZSBzYXZlIG9wdGlvbnMgaW5zdGVhZC4KLQkJCQkvL1dlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoIWlzUmVhZE9ubHkoKSkKLQkJCQlhUmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQlhZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQotCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaXNSZWZSZXMgPSBhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2U7Ci0JCQlpZiAoaXNSZWZSZXMpCi0JCQkJcmVsZWFzZSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpOwotCQkJaWYgKCFpc0Rpc3Bvc2luZygpKQotCQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCQl9Ci0JCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChSZXNvdXJjZSBhUmVzb3VyY2UsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKCFpc1JldmVydGluZyAmJiAhZGlzcG9zaW5nICYmICFpc1JlYWRPbmx5KCkgJiYgb2xkVmFsdWUgJiYgIW5ld1ZhbHVlICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCXN1cGVyLnJlc291cmNlSXNMb2FkZWRDaGFuZ2VkKGFSZXNvdXJjZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnRlZChSZWZlcmVuY2VkUmVzb3VyY2UgcmV2ZXJ0ZWRSZXNvdXJjZSkgewotCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnJldmVydCgpOwotCQlyZXZlcnRBbGxSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZUNvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFdvcmtpbmdDb3B5TWFuYWdlciBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCWlmICh3b3JraW5nQ29weU1hbmFnZXIgPT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5TWFuYWdlciA9IFdvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkubmV3UmVnaXN0ZXJlZEluc3RhbmNlKCk7Ci0JCXJldHVybiB3b3JraW5nQ29weU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIHdvcmtpbmcgY29weSBtYW5hZ2VyIGJlY2F1c2UgdGhlIGVqYi1qYXIueG1sIHdhcyByZW1vdmVkIHdpdGhvdXQgZGlzcG9zaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlpZiAod29ya2luZ0NvcHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXdvcmtpbmdDb3B5TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl3b3JraW5nQ29weU1hbmFnZXIgPSBudWxsOwotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1YTUzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFZGl0TW9kZWxGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRURJVF9NT0RFTF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QubW9kdWxlY29yZS5lZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9EVUxFX1VSSSA9ICJNT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfVVJJID0gIlJPT1RfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFID0gIlJPT1RfQ09OVEVOVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCVVSSSByb290VVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfVVJJKSA6IG51bGwpOwotCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlID0gKFN0cmluZykgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJLHJvb3RVUkkscm9vdENvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlVUkkgcm9vdFVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX1VSSSkgOiBudWxsKTsKLQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSA9IChTdHJpbmcpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX0NPTlRFTlRfVFlQRSkgOiBudWxsKTsKLQkJaWYobW9kdWxlVVJJID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIE1vZHVsZSBVUkkgbXVzdCBiZSBwcm92aWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UsZmFsc2UsIG1vZHVsZVVSSSxyb290VVJJLHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjZ2V0Q2FjaGVJRChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsgCi0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKXBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSk7Ci0JCWlmKG1vZHVsZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Iittb2R1bGVVUkkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWRpdE1vZGVsSUQrIjpOT1VSSSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2U5OTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBKYXZhIFByb2plY3QgdmFsaWRhdGlvbiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgewotCQotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRCYXNlVmFsaWRhdGlvblR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldEJhc2VWYWxpZGF0aW9uVHlwZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0JCQlyZXR1cm4gKChJSmF2YVByb2plY3Qpc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI3NldFZhbGlkYXRpb25UeXBlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKSB7Ci0JCXRoaXMudmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxZTRlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjcvMjAwMSA0OjE0OjMwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgaW1wbGVtZW50cyBXb3JraW5nQ29weU1hbmFnZXIgewotCi0JLy9OZXcgQ1VzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgdXBvbiBkaXNwb3NlCi0JcHJpdmF0ZSBMaXN0IG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0czsKLQkvL05ldyBDVXMgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhhdCBuZWVkIHNhdmVkIGltbWVkaWF0ZWx5IChhZnRlciBlYWNoIGdlbikKLQlwcml2YXRlIExpc3QgbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzOwotCS8vQSBjb21wbGV0ZSBsaXN0IG9mIG5ldyBDVXMgdGhhdCBpcyBvbmx5IGNsZWFyZWQgb24gc2F2ZSBhbmQgZGlzcG9zZQotCXByaXZhdGUgTGlzdCBuZXdDb21waWxhdGlvblVuaXRzOwotCXByaXZhdGUgSGFzaE1hcCBkZWxldGVkQ29tcGlsYXRpb25Vbml0czsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQotCS8qKgotCSAqIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSk7Ci0JCWlmICghZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoY3UpICYmICFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCXByaW1BZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkucmVtb3ZlKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuYWRkKGN1KTsKLQkJZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCkuYWRkKHdvcmtpbmdDb3B5KTsKLQkJaWYgKCFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmFkZChjdSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IHdjLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2MuY29tbWl0V29ya2luZ0NvcHkoZmFsc2UsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seSh3YykpCi0JCQkJCXdjLmNvbW1pdFdvcmtpbmdDb3B5KGZhbHNlLCBtb25pdG9yKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZQotCSAqIAotCSAqIEBjdSBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcyB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQljdSA9IGN1LmdldFByaW1hcnkoKTsKLQkJYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSk7Ci0JCXRyeSB7Ci0JCQljdS5kZWxldGUoZmFsc2UsIG1vbml0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCkKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJTGlzdCBjdXMgPSBnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB3YyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQljdSA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJCXdjID0gY3U7Ci0JCQkJY3UgPSB3Yy5nZXRQcmltYXJ5KCk7Ci0JCQl9Ci0JCQlwcmltRGVsZXRlKGN1KTsKLQkJCWlmICh3YyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQlwcmltRGlzcG9zZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJaWYgKCFXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpIHsKLQkJCQlXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlydW5uYWJsZS5ydW4obnVsbCk7Ci0JCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJLy9ydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydCgpIHsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJcHJpbVJldmVydCgpOwotCQkJfQotCQl9OwotCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgNjo0MzozNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVsZXRlZENvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShjdSk7Ci0JCWlmIChuZXdDVSAhPSBudWxsKQotCQkJcmV0dXJuIG5ld0NVOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE5LzIwMDEgMTE6MDA6MTkgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZXdDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQluZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbmV3Q29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIHRoaXMgQ29tcGlsYXRpb25Vbml0IGFuZCBpdHMgd29ya2luZyBjb3B5LiBJZgotCSAqIHRoaXMgaXMgdGhlIGNhc2UsIHJldHVybiBvdXIgbmV3IHdvcmtpbmcgY29weSBhbmQgZG8gbm90IGNyZWF0ZSBhIG5ldyBvbmUuCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0TmV3Q29tcGlsYXRpb25Vbml0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoaGFzTmV3Q29tcGlsYXRpb25Vbml0KGN1KSkgewotCQkJTGlzdCBsaXN0ID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvcHk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpIGxpc3QuZ2V0KGkpOwotCQkJCWlmIChjdS5lcXVhbHMoY29weS5nZXRQcmltYXJ5KCkpKQotCQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhY2thZ2VGcmFnbWVudCBmb3IgdGhlIGdpdmVuIElDb21waWxhdGlvblVuaXQuCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGN1OwotCQlpbnQgZWxlbWVudFR5cGUgPSBjdS5nZXRFbGVtZW50VHlwZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQllbGVtZW50VHlwZSA9IHBhcmVudC5nZXRFbGVtZW50VHlwZSgpOwotCQkJZWxzZQotCQkJCWVsZW1lbnRUeXBlID0gLTE7Ci0JCX0KLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVyUmVnaXN0ZXIuZ2V0U2F2ZUhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGN1LmlzV29ya2luZ0NvcHkoKSkKLQkJCXJldHVybiBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBjdS5nZXRXb3JraW5nQ29weShudWxsKTsKLQkJYWRkTmV3Q29tcGlsYXRpb25Vbml0KGN1LCB3b3JraW5nQ29weSk7Ci0JCXJldHVybiB3b3JraW5nQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBIYXMgYSBuZXcgY29tcGlsYXRpb24gdW5pdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBTYXZlSGFuZGxlckhlYWRsZXNzLmlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJT2JqZWN0W10gaW5mbyA9IG5ldyBPYmplY3RbMl07Ci0JCWluZm9bMF0gPSBnZXRQYWNrYWdlRnJhZ21lbnQoY3UpOwotCQl0cnkgewotCQkJaW5mb1sxXSA9IGN1LmdldFNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaW5mb1sxXSA9IG51bGw7Ci0JCX0KLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5wdXQoY3UsIGluZm8pOwotCX0KLQotCS8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGVsZXRlIGNhbGwuCi0JcHJvdGVjdGVkIHZvaWQgcHJpbURlbGV0ZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY3UuZXhpc3RzKCkpCi0JCQkJY3UuZGVsZXRlKHRydWUsIG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvL1doYXQgdG8gZG8gaGVyZT8KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1EaXNwb3NlKCkgewotCQlkaXNjYXJkT3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCk7Ci0JCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCk7Ci0JCW5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQluZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJldmVydCgpIHsKLQkJZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpOwotCQlyZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0cygpOwotCQluZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBwcmltR2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzYXZlTmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgY3VzID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgd2M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQl3YyA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJY29tbWl0V29ya2luZ0NvcHkod2MsIG1vbml0b3IpOwotCQl9Ci0JCWN1cy5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5yZW1vdmUoY3UpICE9IG51bGwpIHsKLQkJCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsLCBuZXh0Q1UsIHRlc3RDVTsKLQkJCQlvcmlnaW5hbCA9IGN1LmdldFByaW1hcnkoKTsKLQkJCQlTZXQgY3VzID0gZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5rZXlTZXQoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGN1cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJbmV4dENVID0gKElDb21waWxhdGlvblVuaXQpIGl0Lm5leHQoKTsKLQkJCQkJdGVzdENVID0gbmV4dENVLmlzV29ya2luZ0NvcHkoKSA/IChJQ29tcGlsYXRpb25Vbml0KSBuZXh0Q1UuZ2V0UHJpbWFyeSgpIDogbmV4dENVOwotCQkJCQlpZiAodGVzdENVLmVxdWFscyhvcmlnaW5hbCkpIHsKLQkJCQkJCWN1cy5yZW1vdmUobmV4dENVKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgT2JqZWN0W10gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlpZiAoaW5mb1swXSAhPSBudWxsICYmIGluZm9bMV0gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IChJUGFja2FnZUZyYWdtZW50KSBpbmZvWzBdOwotCQkJU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIGluZm9bMV07Ci0JCQl0cnkgewotCQkJCUlDb21waWxhdGlvblVuaXQgZXhpc3RpbmdDVSA9IHBhY2suZ2V0Q29tcGlsYXRpb25Vbml0KHR5cGVOYW1lKTsKLQkJCQlpZiAoZXhpc3RpbmdDVS5leGlzdHMoKSAmJiBnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoZXhpc3RpbmdDVSkpCi0JCQkJCWV4aXN0aW5nQ1UuZGVsZXRlKGZhbHNlLCBwbSk7Ci0JCQkJcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQodHlwZU5hbWUsIHNvdXJjZSwgZmFsc2UsIHBtKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUlQcm9ncmVzc01vbml0b3IgcG0gPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlJQ29tcGlsYXRpb25Vbml0IGN1OwotCQlPYmplY3RbXSBpbmZvOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UsIGluZm8sIHBtKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBhUnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiB2YWxpZGF0ZSkgewotCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0KLQkJLy8gVE9ETyBCcmVhayB0aGUgdmFsaWRhdG9yIGRlcGVkZW5jeQotCQkvLwlpZiAodmFsaWRhdGUpCi0JCS8vCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCS8vCWVsc2UgewotCQkvLwkJSVByb2plY3QgcHJvaiA9IGdldFZhbGlkYXRpb25Qcm9qZWN0KCk7Ci0JCS8vCQkJCi0JCS8vCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkvLwkJYm9vbGVhbiBkaXNhYmxlVmFsaWRhdG9ycyA9IHByb2ogIT0gbnVsbDsKLQkJLy8JCWJvb2xlYW4gd2FzU3VzcGVuZGVkID0gZmFsc2U7Ci0JCS8vCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMpIHsKLQkJLy8JCQl3YXNTdXNwZW5kZWQgPSBtZ3IuaXNTdXNwZW5kZWQocHJvaik7Ci0JCS8vCQkJaWYgKCF3YXNTdXNwZW5kZWQpCi0JCS8vCQkJCW1nci5zdXNwZW5kVmFsaWRhdGlvbihwcm9qLCB0cnVlKTsKLQkJLy8JCX0KLQkJLy8JCXRyeSB7Ci0JCS8vCQkJcHJpbVJ1bk9wZXJhdGlvbihhUnVubmFibGUsIG1vbml0b3IpOwotCQkvLwkJfSBmaW5hbGx5IHsKLQkJLy8JCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMgJiYgIXdhc1N1c3BlbmRlZCkKLQkJLy8JCQkJbWdyLnN1c3BlbmRWYWxpZGF0aW9uKHByb2osIGZhbHNlKTsKLQkJLy8JCX0KLQkJLy8JfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW5PcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIGFSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAoYVJ1bm5hYmxlICE9IG51bGwpIHsKLQkJCS8vaWYgKHdvcmtzcGFjZS5pc1RyZWVMb2NrZWQoKSkKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhbm5vdF9ydW5fSjJFRVVJV29ya2luZ0NvX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiQ2Fubm90IHJ1biBKMkVFVUlXb3JraW5nQ29weU1hbmFnZXIgb3BlcmF0aW9uIGJlY2F1c2UgdGhlIFdvcmtzcGFjZQotCQkJLy8gdHJlZSBpcyBsb2NrZWQuIgotCQkJLy9lbHNlIHsKLQkJCWlmICghV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihhUnVubmFibGUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlQ29tcGlsYXRpb25Vbml0cyhhTW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvciwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKLQkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVOZXdDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlwcmltU2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG1vbml0b3IsIGZhbHNlKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZVJlYWRPbmx5KElDb21waWxhdGlvblVuaXQgd2MpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIHdjLmdldFByaW1hcnkoKS5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKChJRmlsZSkgcmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKLQkJcmV0dXJuIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyAhPSBudWxsICYmICFkZWxldGVkQ29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpIHx8IChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzLmlzRW1wdHkoKSkgfHwgKG5ld0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmV3Q29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNjYzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nQ29weU1hbmFnZXIgZXh0ZW5kcyBXb3JraW5nQ29weVByb3ZpZGVyIHsKLQotCXZvaWQgZGlzcG9zZSgpOwotCi0JamF2YS51dGlsLlNldCBnZXRBZmZlY3RlZEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQl2b2lkIHNhdmVDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXZvaWQgc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBNZXRob2QgaGFzV29ya2luZ0NvcGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1dvcmtpbmdDb3BpZXMoKTsKLQotCS8qKgotCSAqIFJldmVydCBhbGwgd29ya2luZyBjb3BpZXMuCi0JICovCi0Jdm9pZCByZXZlcnQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUzZjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogIAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeSB7Ci0KLQkvLwlwcm90ZWN0ZWQgc3RhdGljIENsYXNzIHdvcmtpbmdDb3B5TWFuYWdlckNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBXb3JraW5nQ29weU1hbmFnZXIgbmV3UmVnaXN0ZXJlZEluc3RhbmNlKCkgewotCQlyZXR1cm4gKFdvcmtpbmdDb3B5TWFuYWdlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgid29ya2luZ0NvcHlNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLwlwdWJsaWMgc3RhdGljIElXb3JraW5nQ29weU1hbmFnZXIgY3JlYXRlV29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCS8vCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoKSAhPSBudWxsKQotCS8vCQkJdHJ5IHsKLQkvLwkJCQlyZXR1cm4gKElXb3JraW5nQ29weU1hbmFnZXIpIGdldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKCkubmV3SW5zdGFuY2UoKTsKLQkvLwkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTEpIHsKLQkvLwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLQkvLwkJCX0KLQkvLwkJcmV0dXJuIG51bGw7Ci0JLy8JfQotCS8vCQotCS8vCS8qKgotCS8vCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkvLwkgKiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDc6NTM6MTUgQU0pCi0JLy8JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3MKLQkvLwkgKi8KLQkvLwlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzcyBnZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcygpIHsKLQkvLwkJcmV0dXJuIHdvcmtpbmdDb3B5TWFuYWdlckNsYXNzOwotCS8vCX0KLQkvLwkKLQkvLwkvKioKLQkvLwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JLy8JICogQ3JlYXRpb24gZGF0ZTogKDQvMjYvMjAwMSA3OjUzOjE1IEFNKQotCS8vCSAqIEBwYXJhbSBuZXdXb3JraW5nQ29weU1hbmFnZXJDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLQkvLwkgKi8KLQkvLwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoamF2YS5sYW5nLkNsYXNzIG5ld1dvcmtpbmdDb3B5TWFuYWdlckNsYXNzKSB7Ci0JLy8JCXdvcmtpbmdDb3B5TWFuYWdlckNsYXNzID0gbmV3V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NmY1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotCi0vKioKLSAqIFRoZSB1c2VyIG9mIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdXBwbHkgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2J0YWluIGNvbXBpbGF0aW9uIHdvcmtpbmcgY29waWVzIGZyb20gdGhpcyBpbnRlcmZhY2UuIFRoZSBzdXBwbGllciBvZiB0aGUKLSAqIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjb21taXR0aW5nIHRoZSB3b3JraW5nIGNvcGllcyB3aGVuIGFwcHJvcHJpYXRlIGZvciB0aGUgdXNlcidzCi0gKiBlZGl0IG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZSBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHdvcmtiZW5jaCBhbmQgZml4IHRoZSBpbnRlcm5hbCByZWZlcmVuY2VzIGZvciB0aGlzCi0JICogd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGN1Ci0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCB0byBkZWxldGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIGZvciB0aGUgZGVsZXRlCi0JICovCi0Jdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhhdCBpcywgdGhlIG1hbmFnZXIgYWxyZWFkeQotCSAqIGhhcyBhIHdvcmtpbmcgY29weSBmb3IgdGhpcyB1bml0LCBpdCBkb2VzIG5vdCBjcmVhdGUgYSBuZXcgd29ya2luZyBjb3B5LiBEb2VzIG5vdCBjb25uZWN0IHRoZQotCSAqIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpdCB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCUlDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBvciBjcmVhdGVzIGEgbmV3IHdvcmtpbmcgY29weQotCSAqIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgcmV0dXJucyBpdC4gSWYgYSB3b3JraW5nIGNvcHkgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHdvcmtpbmcgY29weSBjYW4gbm90IGJlIGNyZWF0ZWQKLQkgKi8KLQlJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQwYjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9GT0xERVJfTkFNRSA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUl9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FID0gIklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5ERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHID0gIklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGY1OTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRXZlbnRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotICAgIHByaXZhdGUgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnOwotICAgIAotCXB1YmxpYyBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSAKLQl7Ci0JCXRoaXMoIG5ldyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCkgKTsKLQl9Ci0JCi0JcHVibGljIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciggZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnICkKLQl7Ci0JICAgIHRoaXMuaW5zdGFsbENvbmZpZyA9IGluc3RhbGxDb25maWc7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgCi0JewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9GT0xERVJfTkFNRSk7Ci0gICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdCgpCi0gICAgewotICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRtID0gZ2V0RGF0YU1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICBkbS5zZXRQcm9wZXJ0eSggRkFDRVRfSUQsIElNb2R1bGVDb25zdGFudHMuSlNUX0pBVkEgKTsKLSAgICAgICAgZG0uc2V0UHJvcGVydHkoIEpBVkFfRkFDRVRfSU5TVEFMTF9DT05GSUcsIHRoaXMuaW5zdGFsbENvbmZpZyApOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoICEgdGhpcy5pbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3VyY2VGb2xkZXJOYW1lID0gdGhpcy5pbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRtLnNldFByb3BlcnR5KCBTT1VSQ0VfRk9MREVSX05BTUUsIHNvdXJjZUZvbGRlck5hbWUgKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBkZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5pbnN0YWxsQ29uZmlnLmdldERlZmF1bHRPdXRwdXRGb2xkZXIoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdE91dHB1dEZvbGRlck5hbWUgPSB0aGlzLmluc3RhbGxDb25maWcuZ2V0RGVmYXVsdE91dHB1dEZvbGRlcigpLnRvUG9ydGFibGVTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZG0uc2V0UHJvcGVydHkoIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCBkZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV2ZW50TGlzdGVuZXI8SmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudD4gbGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IElFdmVudExpc3RlbmVyPEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQ+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZXZlbnQuZ2V0VHlwZSgpID09IEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQuVHlwZS5TT1VSQ0VfRk9MREVSU19DSEFOR0VEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGluc3RhbGxDb25maWcuZ2V0U291cmNlRm9sZGVycygpLnNpemUoKSA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRtLnNldFByb3BlcnR5KCBTT1VSQ0VfRk9MREVSX05BTUUsIHZhbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBldmVudC5nZXRUeXBlKCkgPT0gSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudC5UeXBlLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9DSEFOR0VEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSBpbnN0YWxsQ29uZmlnLmdldERlZmF1bHRPdXRwdXRGb2xkZXIoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRtLnNldFByb3BlcnR5KCBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSwgdmFsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5pbnN0YWxsQ29uZmlnLmFkZExpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgIH0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldCggZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwcm9wZXJ0eVZhbHVlICkKLSAgICB7Ci0gICAgICAgIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBTT1VSQ0VfRk9MREVSX05BTUUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlcnM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBwcm9wZXJ0eVZhbHVlID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvdXJjZUZvbGRlcnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuPElQYXRoPnNpbmdsZXRvbkxpc3QoIG5ldyBQYXRoKCAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5pbnN0YWxsQ29uZmlnLnNldFNvdXJjZUZvbGRlcnMoIHNvdXJjZUZvbGRlcnMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW5zdGFsbENvbmZpZy5zZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApICk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9wZXJ0eVNldCggcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjY0OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEpBVkFfRkFDRVQgPSBKYXZhRmFjZXQuRkFDRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzEzID0gSmF2YUZhY2V0LkpBVkFfMTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzE0ID0gSmF2YUZhY2V0LkpBVkFfMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzUwID0gSmF2YUZhY2V0LkpBVkFfNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzYwID0gSmF2YUZhY2V0LkpBVkFfNjA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmdiApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGV2ZWwgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwuc2V0Q29tcGlsZXJMZXZlbCggcHJvamVjdCwgbGV2ZWwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlRnVsbEJ1aWxkKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q2xhc3NwYXRoKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gb2xkdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gbmV3dmVyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBwcm9qZWN0LCBvbGR2ZXIsIG5ld3ZlciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGNvbXBpbGVyTGV2ZWxUb0ZhY2V0KCBmaW5hbCBTdHJpbmcgdmVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmNvbXBpbGVyTGV2ZWxUb0ZhY2V0KCB2ZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFRvQ29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuZmFjZXRUb0NvbXBpbGVyTGV2ZWwoIGZ2ICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWY1YjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RGYWNldENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIEphdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotICAgICAgICBDb2xsZWN0aW9uIHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVCk7Ci0gICAgICAgIHNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCByZXF1aXJlZEZhY2V0cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmQ3ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9XdHBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXdHBVdGlscyAKLXsKLSAgICBwcml2YXRlIFd0cFV0aWxzKCkge30KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1RQX05BVFVSRSAKLSAgICAgICAgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9OQVRVUkUKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5BVFVSRVMgPSB7V1RQX05BVFVSRSwgSkVNX05BVFVSRX07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkFUVVJFUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShOQVRVUkVTW2ldKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIE5BVFVSRVNbaV0pOwotCQkJfQotCQl9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZXN0b0VBUiggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAKLQl7Ci0JICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkgICAgZmluYWwgU3RyaW5nW10gY3VycmVudCA9IGRlc2MuZ2V0TmF0dXJlSWRzKCk7Ci0JICAgIGZpbmFsIFN0cmluZ1tdIHJlcGxhY2VtZW50ID0gbmV3IFN0cmluZ1sgY3VycmVudC5sZW5ndGggKyAxIF07Ci0JICAgIFN5c3RlbS5hcnJheWNvcHkoIGN1cnJlbnQsIDAsIHJlcGxhY2VtZW50LCAwLCBjdXJyZW50Lmxlbmd0aCApOwotCSAgICByZXBsYWNlbWVudFsgY3VycmVudC5sZW5ndGggXSA9IFdUUF9OQVRVUkU7Ci0JICAgIGRlc2Muc2V0TmF0dXJlSWRzKCByZXBsYWNlbWVudCApOwotCSAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKCBkZXNjLCBudWxsICk7Ci0JfSAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgCi0JewotICAgIAlQcm9qZWN0VXRpbGl0aWVzLnJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KCBwcm9qZWN0LCBXVFBfTkFUVVJFICk7Ci0gICAgCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoIHByb2plY3QsIEpFTV9OQVRVUkUgKTsKLQl9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9EYXRhTW9kZWxUb0phdmFGYWNldEluc3RhbGxDb25maWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwMmQ4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIERhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIKLQotICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmNsYXNzIH07Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBhZGFwdGFibGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgZG0uZ2V0UHJvcGVydHkoIElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmM0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElEYXRhTW9kZWwuY2xhc3MgfTsKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IElEYXRhTW9kZWwuY2xhc3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgCi0gICAgICAgICAgICAgICAgPSBuZXcgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCggcHJvdmlkZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzMDAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZmoyZWUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbkFyY2hpdmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlQ29yZVBsdWdpbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImFyY2hpdmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVlLW1vZGVscyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlmOGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXJ1bnRpbWUKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0ZjQ1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzUxMGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVGh1IE1heSAxMCAxODozMzo1MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDg5ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgTWF5IDA4IDE2OjUwOjEwIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1M2JlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLmJpbmRpbmdzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24ueG1sZXJyb3JjdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcCwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTJiYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gaW50ZW5kZWQgZm9yIHN1YmNsYXNzaW5nCi0gKiBieSBjbGllbnRzLiBTZWUge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gZm9yIGRldGFpbHMuIENsaWVudHMgd2lsbCwgaG93ZXZlciwKLSAqIG1vc3QgbGlrZWx5IHdpc2ggdG8gc3ViY2xzcyBlaXRoZXIge0BsaW5rIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyfSBvcgotICoge0BsaW5rIEFic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyfSBpbnN0ZWFkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcmNoaXZlQWRhcHRlciBpbXBsZW1lbnRzIElBcmNoaXZlQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXRoaXMuYXJjaGl2ZSA9IGFyY2hpdmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfSBpbnRlbmRlZCBmb3Igc3ViY2xhc3NpbmcKLSAqIGJ5IGNsaWVudHMuIFNlZSB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfSBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJjaGl2ZUhhbmRsZXIgaW1wbGVtZW50cyBJQXJjaGl2ZUhhbmRsZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE4N2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLlppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGw7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGludGVuZGVkIGZvcgotICogc3ViY2xhc3NpbmcgYnkgY2xpZW50cy4gU2VlIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlQWRhcHRlciBpbXBsZW1lbnRzIElBcmNoaXZlTG9hZEFkYXB0ZXIgewotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHJlcHJlc2VudGluZyBhCi0JICogZGlyZWN0b3J5IGVudHJ5IGZvciB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRGlyZWN0b3J5KElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJdmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYUZpbGUgPSBudWxsOwotCQlhRmlsZSA9IG5ldyBBcmNoaXZlUmVzb3VyY2VJbXBsKCk7Ci0JCWFGaWxlLnNldFBhdGgoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCWFGaWxlLnNldFR5cGUoSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRSk7Ci0JCWFGaWxlLnNldEFyY2hpdmUoZ2V0QXJjaGl2ZSgpKTsKLQkJcmV0dXJuIGFGaWxlOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gcmVwcmVzZW50aW5nIGEKLQkgKiBmaWxlIGVudHJ5IGZvciB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRmlsZShJUGF0aCBhcmNoaXZlUmVsYXRpdmVQYXRoKSB7Ci0JCXZlcmlmeVJlbGF0aXZlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gbnVsbDsKLQkJYUZpbGUgPSBuZXcgQXJjaGl2ZVJlc291cmNlSW1wbCgpOwotCQlhRmlsZS5zZXRQYXRoKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQlhRmlsZS5zZXRUeXBlKElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFKTsKLQkJYUZpbGUuc2V0QXJjaGl2ZShnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVtcHR5IHtAbGluayBJQXJjaGl2ZVJlc291cmNlfSBtYW5maWVzdAotCSAqIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG1hbmlmZXN0UGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFyY2hpdmVSZXNvdXJjZSBjcmVhdGVNYW5pZmVzdChJUGF0aCBtYW5pZmVzdFBhdGgpIHsKLQkJdmVyaWZ5UmVsYXRpdmUobWFuaWZlc3RQYXRoKTsKLQkJSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IG51bGw7Ci0JCW1hbmlmZXN0ID0gbmV3IEFyY2hpdmVSZXNvdXJjZUltcGwoKSB7Ci0JCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIG1hbmlmZXN0Q29udGVudHMgPSAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXHJcblxyXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYW5pZmVzdENvbnRlbnRzLmdldEJ5dGVzKCkpKTsKLQkJCX0KLQkJfTsKLQkJbWFuaWZlc3Quc2V0UGF0aChtYW5pZmVzdFBhdGgpOwotCQltYW5pZmVzdC5zZXRUeXBlKElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFKTsKLQkJbWFuaWZlc3Quc2V0QXJjaGl2ZShnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVJlbGF0aXZlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJaWYgKGFyY2hpdmVSZWxhdGl2ZVBhdGguaXNBYnNvbHV0ZSgpICYmICFhcmNoaXZlUmVsYXRpdmVQYXRoLmVxdWFscyhJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYXJjaGl2ZVJlbGF0aXZlUGF0aCArICIgbXVzdCBiZSByZWxhdGl2ZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoYXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZS5BUkNISVZFX1RZUEUpIHsKLQkJCUlBcmNoaXZlIHRoaXNBcmNoaXZlID0gKElBcmNoaXZlKSBhcmNoaXZlUmVzb3VyY2U7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCUlBcmNoaXZlU2F2ZUFkYXB0ZXIgc2F2ZUFkYXB0ZXIgPSBuZXcgWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbChieXRlT3V0KTsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuU0FWRV9BREFQVEVSLCBzYXZlQWRhcHRlcik7Ci0JCQl0cnkgewotCQkJCUlBcmNoaXZlRmFjdG9yeS5JTlNUQU5DRS5zYXZlQXJjaGl2ZSh0aGlzQXJjaGl2ZSwgYXJjaGl2ZU9wdGlvbnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBzYXZlIG5lc3RlZCBBcmNoaXZlICIgKyBhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIiBuZXN0ZWQgZXhjZXB0aW9uID0gIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZU91dC50b0J5dGVBcnJheSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb247IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyBMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb247IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMmM5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFyY2hpdmVTYXZlQWRhcHRlcn0gaW50ZW5kZWQgZm9yCi0gKiBzdWJjbGFzc2luZyBieSBjbGllbnRzLiBTZWUge0BsaW5rIElBcmNoaXZlU2F2ZUFkYXB0ZXJ9IGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVBZGFwdGVyIGltcGxlbWVudHMgSUFyY2hpdmVTYXZlQWRhcHRlciB7Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IG51bGw7IAotCXByb3RlY3RlZCBJQXJjaGl2ZVJlc291cmNlIG1ldGFJbmYgPSBudWxsOyAKLQkKLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGludCBHQVRIRVJfUkVTT1VSQ0VTX1RJQ0tTID0gMTAwMDsKLQkJZmluYWwgaW50IFNBVkVfUkVTT1VSQ0VTX1RJQ0tTID0gMTAwMDsKLQkJZmluYWwgaW50IEZJTklTSF9USUNLUyA9IDEwOwotCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBHQVRIRVJfUkVTT1VSQ0VTX1RJQ0tTICsgU0FWRV9SRVNPVVJDRVNfVElDS1MgKyBGSU5JU0hfVElDS1M7Ci0JCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIlNhdmluZyByZXNvdXJjZXMiLCBUT1RBTF9USUNLUyk7Ci0JCQkKLQkJCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMgPSBnZXRBcmNoaXZlUmVzb3VyY2VzRm9yU2F2ZSgpOwotCQkJSVBhdGggbWFuaWZlc3RQYXRoID0gbmV3IFBhdGgoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCQlpZihnZXRBcmNoaXZlKCkuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKSl7Ci0JCQkJbWFuaWZlc3QgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7Ci0JCQl9Ci0JCQlJUGF0aCBtZXRhSW5mUGF0aCA9IG1hbmlmZXN0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJaWYoZ2V0QXJjaGl2ZSgpLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG1ldGFJbmZQYXRoKSl7Ci0JCQkJbWV0YUluZiA9IGdldEFyY2hpdmUoKS5nZXRBcmNoaXZlUmVzb3VyY2UobWV0YUluZlBhdGgpOwotCQkJfQotCQkJCQotCQkJbW9uaXRvci53b3JrZWQoR0FUSEVSX1JFU09VUkNFU19USUNLUyk7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHNhdmVTdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1JFU09VUkNFU19USUNLUyk7Ci0JCQlpbnQgU1VCX1NBVkVfVElDS1MgPSAxMDsKLQkJCWludCBTVUJfVE9UQUxfVElDS1MgPSBTVUJfU0FWRV9USUNLUyAqIChmaWxlcy5zaXplKCkgKyAyKTsKLQkJCXRyeSB7Ci0JCQkJc2F2ZVN1Yk1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgcmVzb3VyY2VzIiwgU1VCX1RPVEFMX1RJQ0tTKTsKLQkJCQlpZihtYW5pZmVzdCAhPSBudWxsKXsKLQkJCQkJc2F2ZShtYW5pZmVzdCk7Ci0JCQkJfQotCQkJCXNhdmVTdWJNb25pdG9yLndvcmtlZChTVUJfU0FWRV9USUNLUyk7Ci0JCQkJaWYobWV0YUluZiAhPSBudWxsKXsKLQkJCQkJc2F2ZShtZXRhSW5mKTsKLQkJCQl9Ci0JCQkJc2F2ZVN1Yk1vbml0b3Iud29ya2VkKFNVQl9TQVZFX1RJQ0tTKTsKLQkJCQlmb3IgKElBcmNoaXZlUmVzb3VyY2UgZmlsZSA6IGZpbGVzKSB7Ci0JCQkJCWlmIChzaG91bGRTYXZlKGZpbGUpKSB7Ci0JCQkJCQlzYXZlKGZpbGUpOwotCQkJCQl9Ci0JCQkJCXNhdmVTdWJNb25pdG9yLndvcmtlZChTVUJfU0FWRV9USUNLUyk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzYXZlU3ViTW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJY2F1Z2h0RXhjZXB0aW9uID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmluaXNoKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJaWYoY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpewotCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGNhdWdodEV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlc0ZvclNhdmUoKSB7Ci0JCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBzYXZlIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmUoSUFyY2hpdmVSZXNvdXJjZSBmaWxlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3ViY2xhc3Nlc3Mgc2hvdWxkIG92ZXJyaWRlIHRvIGF2b2lkIHNhdmluZyB0aGUgc3BlY2lmaWVkCi0JICoge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9LiBlLmcuIHRvIGF2b2lkIHNhdmluZyBzb3VyY2UgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJQXJjaGl2ZVJlc291cmNlIGZpbGUpIHsKLQkJaWYoZmlsZSA9PSBtYW5pZmVzdCB8fCBmaWxlID09IG1ldGFJbmYpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjQyMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3OTY0Mzk0MTUzMTA5MDMzMTdMOwotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSl7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGYwYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDEwMzIyMDE2OTEzNDMzNDExMkw7Ci0KLQlwdWJsaWMgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzYTBlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzM2NjExNjEyMjc3NzcyMTE0OEw7Ci0KLQlwdWJsaWMgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMzRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICoge0BsaW5rIEFyY2hpdmVPcHRpb25zfSBpcyBhIG1lYW5zIGZvciBwYXNzaW5nIGRhdGEgcGVydGFpbmluZyB0byBvcGVuaW5nIGFuZAotICogc2F2aW5nIHtAbGluayBJQXJjaGl2ZX1zLiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIHdyYXBwZXIgYXJvdW5kIHtAbGluayBNYXB9Ci0gKiBhbmQgYSBmZXcgd2VsbCBkZWZpbmVkIE9wdGlvbktleXMuIENsaWVudHMgYXJlIHdlbGNvbWUgdG8gZGVmaW5lIGFuZCBzZXQvZ2V0Ci0gKiBhbnkgb3B0aW9ucyBkZWVtZWQgbmVjZXNzYXJ5LgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlT3B0aW9ucyB7Ci0KLQkvLyBUT0RPIGFkZCBkZWJ1ZyB0cmFjaW5nIHN1cHBvcnQKLQotCS8qKgotCSAqIEFuIE9wdGlvbktleSB1c2VkIGZvciBzcGVjaWZ5aW5nIGFuIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0FEQVBURVIgPSAiTE9BRF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYW4ge0BsaW5rIElBcmNoaXZlU2F2ZUFkYXB0ZXJ9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQURBUFRFUiA9ICJTQVZFX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhdGggZm9yIHRoZSBBcmNoaXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfUEFUSCA9ICJBUkNISVZFX1BBVEgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFyZW50IEFyY2hpdmUgdXNlZCB3aGVuIG9wZW5pbmcgbmVzdGVkIEFyY2hpdmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9BUkNISVZFID0gIlBBUkVOVF9BUkNISVZFIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTWFwIG9wdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zKCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbihPYmplY3Qgb3B0aW9uS2V5KSB7Ci0JCXJldHVybiBvcHRpb25zTWFwLmNvbnRhaW5zS2V5KG9wdGlvbktleSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPcHRpb24oT2JqZWN0IG9wdGlvbktleSkgewotCQlyZXR1cm4gb3B0aW9uc01hcC5nZXQob3B0aW9uS2V5KTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb24oT2JqZWN0IG9wdGlvbktleSwgT2JqZWN0IG9wdGlvblZhbHVlKSB7Ci0JCW9wdGlvbnNNYXAucHV0KG9wdGlvbktleSwgb3B0aW9uVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVPcHRpb24oT2JqZWN0IG9wdGlvbktleSl7Ci0JCW9wdGlvbnNNYXAucmVtb3ZlKG9wdGlvbktleSk7Ci0JfQotCQotCXB1YmxpYyBTZXQga2V5U2V0KCl7Ci0JCXJldHVybiBvcHRpb25zTWFwLmtleVNldCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI4ZTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMDI3MDQzNzk0MTUzNjYwNjhMOwotCi0JcHVibGljIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotCQotCXB1YmxpYyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNmMTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAYXV0aG9yIGphc2hvbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZSBleHRlbmRzIElBcmNoaXZlUmVzb3VyY2UgewotCi0JSVBhdGggRU1QVFlfTU9ERUxfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gc3BlY2lmaWVkIGJ5IHRoZSBhcmNoaXZlIHJlbGF0aXZlCi0JICogcGF0aC4gVGhyb3dzIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259IGlmIHRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QKLQkgKiByZWxhdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlbGF0aXZlUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIElBcmNoaXZlfSBmb3IgdGhlIHNwZWNpZmllZCBhcmNoaXZlUmVzb3VyY2UuIElmIHRoZQotCSAqIHtAbGluayBJQXJjaGl2ZX0gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0Ci0JICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXROZXN0ZWRBcmNoaXZlcygpfS4gQWxzbywgdGhlIG9yaWdpbmFsCi0JICoge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMge0BsaW5rIElBcmNoaXZlfSdzCi0JICogbGlzdCBvZiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX1zIHJldHVybmVkIGJ5Ci0JICoge0BsaW5rICNnZXRBcmNoaXZlUmVzb3VyY2VzKCl9IGFuZCByZXBsYWNlZCB3aXRoIHRoZSByZXR1cm5lZAotCSAqIHtAbGluayBJQXJjaGl2ZX0uCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmVSZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZSBnZXROZXN0ZWRBcmNoaXZlKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIExpc3Q8SUFyY2hpdmU+IGdldE5lc3RlZEFyY2hpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9cyBpbiB0aGUgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdCgpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpOwotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zIGdldEFyY2hpdmVPcHRpb25zKCk7Ci0KLQlwdWJsaWMgSUFyY2hpdmVMb2FkQWRhcHRlciBnZXRMb2FkQWRhcHRlcigpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjBiYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi0vKioKLSAqIEFuIHtAbGluayBJQXJjaGl2ZUFkYXB0ZXJ9IHByb3ZpZGVzIGEgYnJpZGdlIHNvIGFueSB7QGxpbmsgT2JqZWN0fSAob3IKLSAqIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE9iamVjdH1zKSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMgYW4ge0BsaW5rIElBcmNoaXZlfS4KLSAqIEVhY2gge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBvbmUge0BsaW5rIElBcmNoaXZlfSBhdCBhCi0gKiB0aW1lLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgaW5zdGVhZCBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RBcmNoaXZlQWRhcHRlcn0gb3Igb25lIGlmIGl0cwotICogc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZUFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUge0BsaW5rIElBcmNoaXZlfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyLiBFdmVyeQotCSAqIHtAbGluayBJQXJjaGl2ZUFkYXB0ZXJ9IGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSB7QGxpbmsgSUFyY2hpdmV9LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUge0BsaW5rIElBcmNoaXZlfSBmb3IgdGhpcyB7QGxpbmsgSUFyY2hpdmVBZGFwdGVyfS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhZDY2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlRmFjdG9yeUltcGw7Ci0KLS8qKgotICoge0BsaW5rIElBcmNoaXZlRmFjdG9yeX0gaXMgdGhlIHdoZXJlIGNsaWVudHMgc2hvdWxkIG9wZW4gYW5kIHNhdmUgYXJjaGl2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhyb3VnaCB7QGxpbmsgI0lOU1RBTkNFfQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQXJjaGl2ZUZhY3Rvcnl9LgotCSAqLwotCUlBcmNoaXZlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBBcmNoaXZlRmFjdG9yeUltcGwoKTsKLQotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShJUGF0aCBhcmNoaXZlUGF0aCkgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGNsb3NlQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKTsKLQotCXB1YmxpYyB2b2lkIHNhdmVBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUsIElQYXRoIG91dHB1dFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmVBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUsIEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNWMxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi0vKioKLSAqIEFuIHtAbGluayBJQXJjaGl2ZUhhbmRsZXJ9IGhhbmRsZXMgYSBzcGVjaWZpYyB0eXBlIG9mIHtAbGluayBJQXJjaGl2ZX0uCi0gKiB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfXMgYXJlIGRlZmluZWQgdmlhIGV4dGVuc2lvbiBwb2ludHMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCBpbnN0ZWFkIHN1YmNsYXNzIHtAbGluayBBYnN0cmFjdEFyY2hpdmVIYW5kbGVyfSBvciBvbmUgaWYgaXRzCi0gKiBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMge0BsaW5rIElBcmNoaXZlSGFuZGxlcn0gY2FuIGhhbmRsZQotCSAqIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlfS4gVmFyaW91cyB7QGxpbmsgSUFyY2hpdmV9IHR5cGVzIG1heSBiZQotCSAqIGRldGVybWluZWQgYnkgZXhhbWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUge0BsaW5rIElBcmNoaXZlfS4gZS5nLiBieQotCSAqIHRoZSBleGlzdGVuY2Ugb2YgY2VydGFpbiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX1zIG9yIHRoZWlyIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExZWNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICoge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGtub3dzIGhvdyB0byBsb2FkIG9yIHJlYWQgdGhlIGNvbnRlbnRzIGZvciBhbgotICoge0BsaW5rIElBcmNoaXZlfS4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24gbW9kZWwgZm9yIHJlYWRpbmcgaW4gdGhlCi0gKiBjb250ZW50cyBvZiBhbiB7QGxpbmsgSUFyY2hpdmV9LgotICogCi0gKiBCeSBleHRlbmRpbmcge0BsaW5rIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyfSBhbmQgdXNpbmcKLSAqIHtAbGluayBBcmNoaXZlT3B0aW9uc30gY2xpZW50cyBtYXkgInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuCi0gKiB7QGxpbmsgSUFyY2hpdmV9LiBFeGFtcGxlcyBtaWdodCBpbmNsdWRlIHJlYWRpbmcgZnJvbSBhIHppcCBmaWxlLCBmcm9tIGFuCi0gKiBpbnB1dCBzdHJlYW0sIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCBvciBmcm9tIGEgd29ya2JlbmNoLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgaW5zdGVhZCBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXJ9IG9yIG9uZSBpZgotICogaXRzIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVMb2FkQWRhcHRlciBleHRlbmRzIElBcmNoaXZlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhpcyB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0gY29udGFpbnMKLQkgKiB0aGUge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHNwZWNpZmllZCBieSB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uIElmCi0JICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoaXMKLQkgKiB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0gc2hvdWxkIGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHJldHVybiBhbgotCSAqIHtAbGluayBJQXJjaGl2ZVJlc291cmNlfSBmcm9tIHtAbGluayAjZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoKX0gdXNpbmcgYW4KLQkgKiBlcXVhbCBwYXNzZWQge0BsaW5rIElQYXRofS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gc3BlY2lmaWVkIGJ5IHRoZSBwYXNzZWQKLQkgKiB7QGxpbmsgSVBhdGh9LiBBIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IGlzIHRocm93biBpZiB0aGlzCi0JICoge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGRvZXMgbm90IGNvbnRhaW4gdGhlIHtAbGluayBJQXJjaGl2ZVJlc291cmNlfQotCSAqIGFzIHNwZWNpZmllZCBieSB7QGxpbmsgI2NvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoKX0uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIGFsbCB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gY29udGFpbmVkIGJ5IHRoaXMKLQkgKiB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IDxJQXJjaGl2ZVJlc291cmNlPiBnZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gZm9yIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9LgotCSAqIElmIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IGlzIG5vdCBjb250YWluZWQgYnkgdGhpcwotCSAqIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSwgdGhlbiBhIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IGlzCi0JICogdGhyb3duLiBBbiB7QGxpbmsgSU9FeGNlcHRpb259IGlzIHRocm93biBmb3IgYWxsIG90aGVyIGVycm9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlc291cmNlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGNvbnRhaW5zCi0JICogYSBtb2RlbCBPYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBwYXNzZWQge0BsaW5rIElQYXRofS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxPYmplY3RQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIE9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIHBhc3NlZCB7QGxpbmsgSVBhdGh9LiBBbgotCSAqIHtAbGluayBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhpcwotCSAqIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSBkb2VzIG5vdCBjb250YWluIHRoZSBtb2RlbCBPYmplY3QgYXMKLQkgKiBzcGVjaWZpZWQgYnkge0BsaW5rICNjb250YWluc01vZGVsT2JqZWN0KElQYXRoKX0uCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0UGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRlNzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQGF1dGhvciBqYXNob2xsCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZVJlc291cmNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFVOS05PV05fVFlQRSA9IC0xOwotCi0JcHVibGljIHN0YXRpYyBpbnQgRklMRV9UWVBFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgaW50IERJUkVDVE9SWV9UWVBFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEFSQ0hJVkVfVFlQRSA9IDI7Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpOwotCi0JcHVibGljIHZvaWQgc2V0UGF0aChJUGF0aCBwYXRoKTsKLQotCXB1YmxpYyBsb25nIGdldFNpemUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKTsKLQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpOwotCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKTsKLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgZmlsZVR5cGUpOwotCi0JcHVibGljIElBcmNoaXZlIGdldEFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhpcyB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gaWYgaXRzIHR5cGUgaXMKLQkgKiBlaXRoZXIgYSB7QGxpbmsgI0ZJTEVfVFlQRX0gb3Ige0BsaW5rICNBUkNISVZFX1RZUEV9IGFzIGRlZmluZWQgYnkKLQkgKiB7QGxpbmsgI2dldFR5cGUoKX0uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkIGlmIHRoZSB0eXBlIGlzCi0JICoge0BsaW5rICNESVJFQ1RPUllfVFlQRX0uCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZjgwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBJQXJjaGl2ZUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ2xvc2UgYW5kIHJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vdGlmeSByZXNvdXJjZXMgaWYgbmVjZXNzYXJ5IHRoYXQgc2F2ZSBpcyBjb21wbGV0ZSBmb3IgdGhpcyBhcmNoaXZlLAotCSAqIGJlaW5nIGNhcmVmdWwgbm90IHRvIGNsb3NlIGFueSByZXNvdXJjZXMgdGhhdCBhIHBhcmVudCBhcmNoaXZlIG1pZ2h0Ci0JICogc3RpbGwgYmUgdXNpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzVhODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJQXJjaGl2ZUZhY3RvcnkgewotCi0JcHVibGljIElBcmNoaXZlIG9wZW5BcmNoaXZlKElQYXRoIGFyY2hpdmVQYXRoKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCVppcEZpbGUgemlwRmlsZTsKLQkJdHJ5IHsKLQkJCXppcEZpbGUgPSBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpOwotCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIG9wZW5GYWlsdXJlRXhjZXB0aW9uID0gbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gb3BlbkZhaWx1cmVFeGNlcHRpb24gPSBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgb3BlbkZhaWx1cmVFeGNlcHRpb247Ci0JCX0KLQkJWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwgbG9hZEFkYXB0ZXIgPSBuZXcgWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwoemlwRmlsZSk7Ci0JCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIsIGxvYWRBZGFwdGVyKTsKLQkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkFSQ0hJVkVfUEFUSCwgYXJjaGl2ZVBhdGgpOwotCQlyZXR1cm4gb3BlbkFyY2hpdmUoYXJjaGl2ZU9wdGlvbnMpOwotCX0KLQotCS8vIFRPRE8gYWRkIHRyYWNpbmcgc3VwcG9ydAotCS8vIGluZm8gaW4gc3BlYyBwYWdlIDE1NAotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVJbXBsIGFyY2hpdmUgPSBuZXcgQXJjaGl2ZUltcGwoYXJjaGl2ZU9wdGlvbnMpOwotCQlhcmNoaXZlLnNldEFyY2hpdmVGYWN0b3J5KHRoaXMpOwotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZUFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQkoKEFyY2hpdmVJbXBsKSBhcmNoaXZlKS5jbG9zZSgpOwotCQkvLyBUT0RPIGFkZCB0cmFjaW5nIHN1cHBvcnQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSwgSVBhdGggb3V0cHV0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJZmluYWwgaW50IFNBVkVfVElDS1MgPSAxOTg7Ci0JCWZpbmFsIGludCBDTEVBTlVQX1RJQ0tTID0gMTsKLQkJZmluYWwgaW50IFRPVEFMX1RJQ0tTID0gU0FWRV9USUNLUyArIENMRUFOVVBfVElDS1M7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiU2F2aW5nIGFyY2hpdmUgdG86ICIgKyBvdXRwdXRQYXRoLnRvT1NTdHJpbmcoKSwgVE9UQUxfVElDS1MpOwotCQkJU3RyaW5nIGFVcmkgPSBvdXRwdXRQYXRoLnRvT1NTdHJpbmcoKTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCQlBcmNoaXZlVXRpbC5jaGVja1dyaXRlYWJsZShhRmlsZSk7Ci0JCQlib29sZWFuIGZpbGVFeGlzdGVkID0gYUZpbGUuZXhpc3RzKCk7Ci0JCQlJQXJjaGl2ZVNhdmVBZGFwdGVyIGFTYXZlQWRhcHRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWphdmEuaW8uRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBmaWxlRXhpc3RlZCA/IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBGaWxlKGFVcmksIGFGaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkpIDogYUZpbGU7Ci0JCQkJYVNhdmVBZGFwdGVyID0gY3JlYXRlU2F2ZUFkYXB0ZXJGb3JKYXIoZGVzdGluYXRpb25GaWxlKTsKLQkJCQlhU2F2ZUFkYXB0ZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlzYXZlKGFTYXZlQWRhcHRlciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1RJQ0tTKSk7Ci0KLQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQlpZiAoZmlsZUV4aXN0ZWQpIHsKLQkJCQkJQXJjaGl2ZVV0aWwuY2xlYW51cEFmdGVyVGVtcFNhdmUoYVVyaSwgYUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKENMRUFOVVBfVElDS1MpOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3Igc2F2aW5nIGFyY2hpdmU6ICIgKyBhcmNoaXZlICsgIiB0byBvdXRwdXQgcGF0aDogIiArIG91dHB1dFBhdGgsIGUpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIGZhaWx1cmUpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYVNhdmVBZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB3ZVRyaWVkKSB7Ci0JCQkJCS8vIElnbm9yZQotCQkJCX0KLQkJCQlpZiAoIWZpbGVFeGlzdGVkKQotCQkJCQlhRmlsZS5kZWxldGUoKTsKLQkJCQl0aHJvdyBmYWlsdXJlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmVTYXZlQWRhcHRlciBjcmVhdGVTYXZlQWRhcHRlckZvckphcihqYXZhLmlvLkZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmV4aXN0cygpICYmIGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBmaWxlOiAiICsgYUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkiKTsKLQkJfQotCQlqYXZhLmlvLkZpbGUgcGFyZW50ID0gYUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCWphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwob3V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElBcmNoaXZlU2F2ZUFkYXB0ZXIgYW5BZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJYW5BZGFwdGVyLnNhdmUobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWFuQWRhcHRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlLCBBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJZmluYWwgaW50IFNBVkVfVElDS1MgPSAxOTg7Ci0JCWZpbmFsIGludCBDTE9TRV9USUNLUyA9IDI7Ci0JCWZpbmFsIGludCBUT1RBTF9USUNLUyA9IFNBVkVfVElDS1MgKyBDTE9TRV9USUNLUzsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgYXJjaGl2ZSIsIFRPVEFMX1RJQ0tTKTsKLQkJCUlBcmNoaXZlU2F2ZUFkYXB0ZXIgYVNhdmVBZGFwdGVyID0gKElBcmNoaXZlU2F2ZUFkYXB0ZXIpIGFyY2hpdmVPcHRpb25zLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5TQVZFX0FEQVBURVIpOwotCQkJdHJ5IHsKLQkJCQlhU2F2ZUFkYXB0ZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlzYXZlKGFTYXZlQWRhcHRlciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1RJQ0tTKSk7Ci0KLQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQltb25pdG9yLndvcmtlZChDTE9TRV9USUNLUyk7Ci0JCQl9IGNhdGNoIChBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gZmFpbHVyZSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChhU2F2ZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJCWFTYXZlQWRhcHRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHdlVHJpZWQpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJCXRocm93IGZhaWx1cmU7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3Igc2F2aW5nIGFyY2hpdmU6ICIgKyBhcmNoaXZlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM0OWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVJbXBsIGV4dGVuZHMgQXJjaGl2ZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElBcmNoaXZlIHsKLQotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnM7Ci0KLQlwcml2YXRlIElBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXI7Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVGaWxlSW5kZXggewotCQlwcml2YXRlIE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4gaW5kZXggPSBuZXcgSGFzaE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4oKTsKLQotCQlwcml2YXRlIExpc3Q8SUFyY2hpdmU+IG5lc3RlZEFyY2hpdmVzID0gbnVsbDsKLQotCQlwcml2YXRlIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZnVsbEluZGV4ID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gZnVsbHlJbmRleGVkID0gZmFsc2U7Ci0KLQkJcHVibGljIEFyY2hpdmVGaWxlSW5kZXgoKSB7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SUFyY2hpdmU+IGdldE5lc3RlZEFyY2hpdmVzKCkgewotCQkJaWYgKG5lc3RlZEFyY2hpdmVzID09IG51bGwpIHsKLQkJCQluZXN0ZWRBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3Q8SUFyY2hpdmU+KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZXM7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNGaWxlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJCUFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyLnZlcmlmeVJlbGF0aXZlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIGluZGV4LmNvbnRhaW5zS2V5KGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBJQXJjaGl2ZVJlc291cmNlIGdldEZpbGUoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgewotCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gaW5kZXguZ2V0KGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIGFGaWxlOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5vdGVFbXB0eUZpbGUoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgewotCQkJdmVyaWZ5Tm90RnVsbHlJbmRleGVkKCk7Ci0JCQlBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci52ZXJpZnlSZWxhdGl2ZShhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJCWluZGV4LnB1dChhcmNoaXZlUmVsYXRpdmVQYXRoLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGaWxlKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKLQkJCXZlcmlmeU5vdEZ1bGx5SW5kZXhlZCgpOwotCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYUZpbGUuZ2V0UGF0aCgpKTsKLQkJCWluZGV4LnB1dChhRmlsZS5nZXRQYXRoKCksIGFGaWxlKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Z1bGx5SW5kZXhlZCgpIHsKLQkJCXJldHVybiBmdWxseUluZGV4ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmdWxseUluZGV4KExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChmdWxseUluZGV4ZWQpIHsKLQkJCQkJdmVyaWZ5Tm90RnVsbHlJbmRleGVkKCk7Ci0JCQkJfQotCQkJCWZ1bGx5SW5kZXhlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWZvciAoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA6IGZpbGVzKSB7Ci0JCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYUZpbGUuZ2V0UGF0aCgpKTsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJaWYgKCFpbmRleC5jb250YWluc0tleShhRmlsZS5nZXRQYXRoKCkpKSB7Ci0JCQkJCQlpbmRleC5wdXQoYUZpbGUuZ2V0UGF0aCgpLCBhRmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0RnVsbEluZGV4KCkgewotCQkJaWYgKCFpc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpbGUgbGlzdCBoYXMgbm90IGJlZW4gZnVsbHkgaW5kZXhlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZnVsbEluZGV4ID09IG51bGwpIHsKLQkJCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElBcmNoaXZlUmVzb3VyY2U+KCk7Ci0JCQkJbGlzdC5hZGRBbGwoaW5kZXgudmFsdWVzKCkpOwotCQkJCWZ1bGxJbmRleCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZnVsbEluZGV4OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHZlcmlmeU5vdEZ1bGx5SW5kZXhlZCgpIHsKLQkJCWlmIChpc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gbW9kaWZ5IGEgZnVsbHkgaW5kZXhlZCBmaWxlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgQXJjaGl2ZUZpbGVJbmRleCBhcmNoaXZlRmlsZUluZGV4ID0gbmV3IEFyY2hpdmVGaWxlSW5kZXgoKTsKLQotCXByaXZhdGUgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbiBvcGVuZW5kQnkgPSBudWxsOwotCi0JcHVibGljIEFyY2hpdmVJbXBsKEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zKSB7Ci0JCXNldFR5cGUoSUFyY2hpdmVSZXNvdXJjZS5BUkNISVZFX1RZUEUpOwotCQlzZXRBcmNoaXZlT3B0aW9ucyhhcmNoaXZlT3B0aW9ucyk7Ci0JCWxvYWRBZGFwdGVyID0gKElBcmNoaXZlTG9hZEFkYXB0ZXIpIGdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUik7Ci0JCWxvYWRBZGFwdGVyLnNldEFyY2hpdmUodGhpcyk7Ci0JCW9wZW5lbmRCeSA9IG5ldyBGYWlsZWRUb0Nsb3NlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gb3BlbmVuZEJ5ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCW9wZW5lbmRCeSA9IG51bGw7Ci0JCWZvciAoSUFyY2hpdmUgbmVzdGVkQXJjaGl2ZSA6IGdldE5lc3RlZEFyY2hpdmVzKCkpIHsKLQkJCUlBcmNoaXZlRmFjdG9yeS5JTlNUQU5DRS5jbG9zZUFyY2hpdmUobmVzdGVkQXJjaGl2ZSk7Ci0JCX0KLQkJbG9hZEFkYXB0ZXIuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyLnZlcmlmeVJlbGF0aXZlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gbnVsbDsKLQkJaWYgKGFyY2hpdmVGaWxlSW5kZXguY29udGFpbnNGaWxlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpKSB7Ci0JCQlhRmlsZSA9IGFyY2hpdmVGaWxlSW5kZXguZ2V0RmlsZShhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJfSBlbHNlIGlmICghYXJjaGl2ZUZpbGVJbmRleC5pc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQlhRmlsZSA9IGxvYWRBZGFwdGVyLmdldEFyY2hpdmVSZXNvdXJjZShhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJCWlmIChhRmlsZSA9PSBudWxsKSB7Ci0JCQkJYXJjaGl2ZUZpbGVJbmRleC5ub3RlRW1wdHlGaWxlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlhcmNoaXZlRmlsZUluZGV4LmFkZEZpbGUoYUZpbGUpOwotCQkJfQotCQl9Ci0JCWlmKGFGaWxlID09IG51bGwpewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihhcmNoaXZlUmVsYXRpdmVQYXRoLnRvU3RyaW5nKCkgKyIgaW4gIit0b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoIWFyY2hpdmVGaWxlSW5kZXguaXNGdWxseUluZGV4ZWQoKSkgewotCQkJCWFyY2hpdmVGaWxlSW5kZXguZnVsbHlJbmRleChsb2FkQWRhcHRlci5nZXRBcmNoaXZlUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcmNoaXZlRmlsZUluZGV4LmdldEZ1bGxJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvYWRBZGFwdGVyKElBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIpIHsKLQkJdGhpcy5sb2FkQWRhcHRlciA9IGxvYWRBZGFwdGVyOwotCX0KLQkKLQlwdWJsaWMgSUFyY2hpdmVMb2FkQWRhcHRlciBnZXRMb2FkQWRhcHRlcigpIHsKLQkJcmV0dXJuIGxvYWRBZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFyY2hpdmVPcHRpb25zKEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zKSB7Ci0JCXRoaXMuYXJjaGl2ZU9wdGlvbnMgPSBhcmNoaXZlT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZU9wdGlvbnMgZ2V0QXJjaGl2ZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBhcmNoaXZlT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbG9hZEFkYXB0ZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlzdXBlci5maW5hbGl6ZSgpOwotCQlpZiAoaXNPcGVuKCkpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQXJjaGl2ZSBvcGVuZXIgZGlkIG5vdCBjbG9zZSBhcmNoaXZlOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQXJjaGl2ZSB3YXMgb3BlbmVkIGhlcmU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wZW5lbmRCeS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdCgpIHsKLQkJcmV0dXJuIGNvbnRhaW5zTW9kZWxPYmplY3QoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUobW9kZWxPYmplY3RQYXRoKTsKLQkJcmV0dXJuIGdldExvYWRBZGFwdGVyKCkuY29udGFpbnNNb2RlbE9iamVjdChtb2RlbE9iamVjdFBhdGgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKSB0aHJvd3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNb2RlbE9iamVjdChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci52ZXJpZnlSZWxhdGl2ZShtb2RlbE9iamVjdFBhdGgpOwotCQlyZXR1cm4gZ2V0TG9hZEFkYXB0ZXIoKS5nZXRNb2RlbE9iamVjdChtb2RlbE9iamVjdFBhdGgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCWlmIChhcmNoaXZlRmlsZUluZGV4LmNvbnRhaW5zRmlsZShhcmNoaXZlUmVsYXRpdmVQYXRoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoIWFyY2hpdmVGaWxlSW5kZXguaXNGdWxseUluZGV4ZWQoKSkgewotCQkJcmV0dXJuIGxvYWRBZGFwdGVyLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0TmVzdGVkQXJjaGl2ZShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoYXJjaGl2ZVJlc291cmNlLmdldEFyY2hpdmUoKSAhPSB0aGlzKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbigiQXR0ZW1wdGVkIHRvIG9wZW4gbmVzdGVkIElBcmNoaXZlICIgKyBhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIiB1c2luZyBhbiBJQXJjaGl2ZVJlc291cmNlIG5vdCBjb250YWluZWQgaW4gdGhpcyBJQXJjaGl2ZS4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCUlBcmNoaXZlUmVzb3VyY2UgY2FjaGVkQXJjaGl2ZVJlc291cmNlID0gZ2V0QXJjaGl2ZVJlc291cmNlKGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwotCi0JCQlpZiAoY2FjaGVkQXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZVJlc291cmNlLkFSQ0hJVkVfVFlQRSkgewotCQkJCUlBcmNoaXZlIG5lc3RlZEFyY2hpdmUgPSAoSUFyY2hpdmUpIGNhY2hlZEFyY2hpdmVSZXNvdXJjZTsKLQkJCQlpZiAoIWFyY2hpdmVGaWxlSW5kZXguZ2V0TmVzdGVkQXJjaGl2ZXMoKS5jb250YWlucyhuZXN0ZWRBcmNoaXZlKSkgewotCQkJCQlhcmNoaXZlRmlsZUluZGV4LmdldE5lc3RlZEFyY2hpdmVzKCkuYWRkKG5lc3RlZEFyY2hpdmUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKLQkJCX0gZWxzZSBpZiAoY2FjaGVkQXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbigiQXR0ZW1wdGVkIHRvIG9wZW4gbmVzdGVkIElBcmNoaXZlICIgKyBjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIiB1c2luZyBhIGRpcmVjdG9yeS4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbmVzdGVkTG9hZEFkYXB0ZXIgPSBudWxsOwotCi0JCQl0cnkgewotCQkJCWphdmEuaW8uRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdGVtcEZpbGUgPSBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRmlsZShjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXJjaGl2ZVV0aWwud2FybigiV2FybmluZzogVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGUgZm9yICIgKyBjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIi4gIFRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmICh0ZW1wRmlsZSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gY2FjaGVkQXJjaGl2ZVJlc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQkJCW5lc3RlZExvYWRBZGFwdGVyID0gbmV3IFRlbXBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCh0ZW1wRmlsZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCWlmIChuZXN0ZWRMb2FkQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJLy8gVE9ETyBpbXBsZW1lbnQgYSBaaXBTdHJlYW0gcmVhZGVyIGlmIG5lY2Vzc2FyeQotCQkJfQotCi0JCQlBcmNoaXZlT3B0aW9ucyBuZXN0ZWRBcmNoaXZlT3B0aW9ucyA9IGNsb25lVW5rbm93bk9wdGlvbnMoYXJjaGl2ZU9wdGlvbnMpOwotCQkJbmVzdGVkQXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLlBBUkVOVF9BUkNISVZFLCB0aGlzKTsKLQkJCW5lc3RlZEFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIsIG5lc3RlZExvYWRBZGFwdGVyKTsKLQkJCW5lc3RlZEFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5BUkNISVZFX1BBVEgsIGNhY2hlZEFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwotCQkJSUFyY2hpdmUgbmVzdGVkQXJjaGl2ZSA9IGFyY2hpdmVGYWN0b3J5Lm9wZW5BcmNoaXZlKG5lc3RlZEFyY2hpdmVPcHRpb25zKTsKLQkJCW5lc3RlZEFyY2hpdmUuc2V0UGF0aChjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpKTsKLQkJCW5lc3RlZEFyY2hpdmUuc2V0QXJjaGl2ZSh0aGlzKTsKLQkJCXJldHVybiBuZXN0ZWRBcmNoaXZlOwotCi0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIGNsb25lVW5rbm93bk9wdGlvbnMoQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMpewotCQlBcmNoaXZlT3B0aW9ucyBuZXdPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJjaGl2ZU9wdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihrZXkgPT0gQXJjaGl2ZU9wdGlvbnMuQVJDSElWRV9QQVRIIHx8IGtleSA9PSBBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIgfHwga2V5ID09IEFyY2hpdmVPcHRpb25zLlNBVkVfQURBUFRFUil7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCW5ld09wdGlvbnMuc2V0T3B0aW9uKGtleSwgYXJjaGl2ZU9wdGlvbnMuZ2V0T3B0aW9uKGtleSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdPcHRpb25zOwotCX0KLQkKLQkKLQlwdWJsaWMgTGlzdDxJQXJjaGl2ZT4gZ2V0TmVzdGVkQXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGFyY2hpdmVGaWxlSW5kZXguZ2V0TmVzdGVkQXJjaGl2ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwKLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlc291cmNlCi0JICovCi0Jdm9pZCBhZGRBcmNoaXZlUmVzb3VyY2VJbnRlcm5hbChJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgewotCQlhcmNoaXZlRmlsZUluZGV4LmluZGV4LnB1dChhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpLCBhcmNoaXZlUmVzb3VyY2UpOwotCQlpZihhcmNoaXZlUmVzb3VyY2UuZ2V0VHlwZSgpID09IEFSQ0hJVkVfVFlQRSl7Ci0JCQlhcmNoaXZlRmlsZUluZGV4LmdldE5lc3RlZEFyY2hpdmVzKCkuYWRkKChJQXJjaGl2ZSlhcmNoaXZlUmVzb3VyY2UpOwotCQl9Ci0JCWFyY2hpdmVGaWxlSW5kZXguZnVsbEluZGV4ID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElBcmNoaXZlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeTsKLQkvKioKLQkgKiBJbnRlcm5hbDsgY2xpZW50cyBzaG91bGQgbm90IGNhbGwuCi0JICogQHBhcmFtIGFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZUZhY3RvcnkoSUFyY2hpdmVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5KXsKLQkJdGhpcy5hcmNoaXZlRmFjdG9yeSA9IGFyY2hpdmVGYWN0b3J5OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NkNjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlTG9hZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSUFyY2hpdmVSZXNvdXJjZSB7Ci0KLQlwcml2YXRlIElBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IFVOS05PV05fVFlQRTsKLQotCXByaXZhdGUgbG9uZyBzaXplID0gLTE7Ci0KLQlwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkID0gLTE7Ci0KLQlwcml2YXRlIElQYXRoIHBhdGggPSBudWxsOwotCi0JcHVibGljIElBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJdGhpcy5hcmNoaXZlID0gYXJjaGl2ZTsKLQkJKChBcmNoaXZlSW1wbClhcmNoaXZlKS5hZGRBcmNoaXZlUmVzb3VyY2VJbnRlcm5hbCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKSB7Ci0JCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhdGgoSVBhdGggcGF0aCkgewotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzd2l0Y2ggKGdldFR5cGUoKSkgewotCQljYXNlIElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEU6Ci0JCWNhc2UgSUFyY2hpdmVSZXNvdXJjZS5VTktOT1dOX1RZUEU6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJY2FzZSBJQXJjaGl2ZVJlc291cmNlLkZJTEVfVFlQRToKLQkJY2FzZSBJQXJjaGl2ZVJlc291cmNlLkFSQ0hJVkVfVFlQRToKLQkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIgPSBudWxsOwotCQkJbG9hZEFkYXB0ZXIgPSBnZXRBcmNoaXZlKCkuZ2V0TG9hZEFkYXB0ZXIoKTsKLQkJCXJldHVybiBsb2FkQWRhcHRlci5nZXRJbnB1dFN0cmVhbSh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzd2l0Y2ggKGdldFR5cGUoKSkgewotCQljYXNlIEZJTEVfVFlQRToKLQkJCWJ1ZmZlci5hcHBlbmQoIkZpbGU6ICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRElSRUNUT1JZX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJEaXJlY3Rvcnk6ICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVJDSElWRV9UWVBFOgotCQkJYnVmZmVyLmFwcGVuZCgiQXJjaGl2ZTogIik7Ci0JCQlicmVhazsKLQkJY2FzZSBVTktOT1dOX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJVbmtub3duOiAiKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKGdldFBhdGgoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVVJJQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVVSSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZjZTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQotCXByaXZhdGUgSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0KLQlwdWJsaWMgQXJjaGl2ZVVSSUNvbnZlcnRlcihJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXRoaXMuYXJjaGl2ZSA9IGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIElBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBNYXAgPFVSSSwgSVBhdGg+IHVyaVRvUGF0aE1hcCA9IG5ldyBIYXNoTWFwIDxVUkksIElQYXRoPigpOwotCi0JcHJvdGVjdGVkIE1hcCA8SVBhdGgsIFVSST4gcGF0aFRvVVJJTWFwID0gbmV3IEhhc2hNYXAgPElQYXRoLCBVUkk+KCk7Ci0KLQlwdWJsaWMgZmluYWwgVVJJIGdldFVSSShJUGF0aCBwYXRoKSB7Ci0JCWlmICghcGF0aFRvVVJJTWFwLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0JCQlVUkkgdXJpID0gY29udmVydFBhdGhUb1VSSShwYXRoKTsKLQkJCXVyaVRvUGF0aE1hcC5wdXQodXJpLCBwYXRoKTsKLQkJCXBhdGhUb1VSSU1hcC5wdXQocGF0aCwgdXJpKTsKLQkJCXJldHVybiB1cmk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGF0aFRvVVJJTWFwLmdldChwYXRoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBVUkkgY29udmVydFBhdGhUb1VSSShJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGNvbnZlcnRVUklUb1BhdGgoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IFBhdGgodXJpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJUGF0aCBnZXRQYXRoKFVSSSB1cmkpIHsKLQkJaWYgKCF1cmlUb1BhdGhNYXAuY29udGFpbnNLZXkodXJpKSkgewotCQkJSVBhdGggcGF0aCA9IGNvbnZlcnRVUklUb1BhdGgodXJpKTsKLQkJCXVyaVRvUGF0aE1hcC5wdXQodXJpLCBwYXRoKTsKLQkJCXBhdGhUb1VSSU1hcC5wdXQocGF0aCwgdXJpKTsKLQkJCXJldHVybiBwYXRoOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHVyaVRvUGF0aE1hcC5nZXQodXJpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gZ2V0UGF0aCh1cmkpOwotCQlJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSA9IGdldEFyY2hpdmUoKS5nZXRBcmNoaXZlUmVzb3VyY2UocGF0aCk7Ci0JCXJldHVybiBhcmNoaXZlUmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YjI5YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVV0aWwgewotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlbXBEaXJlY3RvcnlOYW1lOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmlvLkZpbGUgdGVtcERpcmVjdG9yeTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHVyaSwgb3IgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3QKLQkgKiBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVUYWlsKFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHRlbXBVUkkgPSB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotCQl3aGlsZSAodGVtcFVSSS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl0ZW1wVVJJID0gdGVtcFVSSS5zdWJzdHJpbmcoMCwgdGVtcFVSSS5sZW5ndGgoKSAtIDEpOwotCQlpbnQgbGFzdEluZGV4ID0gdGVtcFVSSS5sYXN0SW5kZXhPZignLycpOwotCQlpZiAobGFzdEluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVyaTsKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwgdGVtcFVSSS5sZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVtcEZpbGUoYmFzZU5hbWUsIGdldFRlbXBEaXJlY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lLCBqYXZhLmlvLkZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZVRhaWwoYmFzZU5hbWUpOwotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPCAzKSB7Ci0JCQlmaWxlTmFtZSA9ICJXU1RNUCIgKyBmaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWphdmEuaW8uRmlsZSB0ZW1wRmlsZSA9IGphdmEuaW8uRmlsZS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSwgbnVsbCwgZGlyZWN0b3J5KTsKLQkJRGVsZXRlT25FeGl0VXRpbGl0eS5tYXJrRm9yRGVsZXRpb24odGVtcEZpbGUpOwotCQlyZXR1cm4gdGVtcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGZpbGVzLCByZWN1cnNpdmUsIHRoYXQgY2FuJ3QgYmUgd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcml0ZVByb3RlY3RlZEZpbGVzKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCQlpZiAoYUxpc3QgPT0gbnVsbCkKLQkJCWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkgJiYgIWFGaWxlLmNhbldyaXRlKCkpCi0JCQlhTGlzdC5hZGQoYUZpbGUpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJamF2YS5pby5GaWxlW10gZmlsZXMgPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlnZXRXcml0ZVByb3RlY3RlZEZpbGVzKGZpbGVzW2ldLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1dyaXRlYWJsZShqYXZhLmlvLkZpbGUgYUZpbGUpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlMaXN0IGxvY2tlZCA9IEFyY2hpdmVVdGlsLmdldFdyaXRlUHJvdGVjdGVkRmlsZXMoYUZpbGUsIG51bGwpOwotCQlpZiAobG9ja2VkLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQltc2cuYXBwZW5kKCJDYW5ub3Qgd3JpdGUgdG8gZmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCW1zZy5hcHBlbmQoIk9uZSBvciBtb3JlIGZpbGVzIGlzIHdyaXRlIHByb3RlY3RlZCBvciBsb2NrZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZCgnXG4nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NrZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWphdmEuaW8uRmlsZSBsb2NrZWRGaWxlID0gKGphdmEuaW8uRmlsZSkgbG9ja2VkLmdldChpKTsKLQkJCW1zZy5hcHBlbmQobG9ja2VkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQltc2cuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24obXNnLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtOyBmb3IgZGlyZWN0b3JpZXMsIHJlY3Vyc2UgdGhlCi0JICogc3ViZGlyZWN0b3JpZXMgYW5kIGRlbGV0ZSB0aGVtIGFzIHdlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bDsgZmFsc2UgaWYgYW55IGZpbGUgb3Igc3ViIGZpbGUgY291bGQgbm90IGJlCi0JICogICAgICAgICBkZWxldGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZShqYXZhLmlvLkZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWphdmEuaW8uRmlsZVtdIGZpbGVzID0gYUZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFkZWxldGUoZmlsZXNbaV0pKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgY2FuIHJlbmFtZSBpdCB0aGVuIHdlIGNhbiBkZWxldGUgaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5hbWVhYmxlKGphdmEuaW8uRmlsZSBvcmlnKSB7Ci0JCWphdmEuaW8uRmlsZSBvcmlnQ29weTEgPSBudWxsOwotCQlqYXZhLmlvLkZpbGUgb3JpZ0NvcHkyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9yaWdDb3B5MSA9IG9yaWcuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJb3JpZ0NvcHkyID0gb3JpZy5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBiYXNlTmFtZSA9ICJzYXZlLnRtcCI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChvcmlnLmdldFBhcmVudCgpICE9IG51bGwpCi0JCQkJYmFzZU5hbWUgPSBuZXcgamF2YS5pby5GaWxlKG9yaWcuZ2V0UGFyZW50KCksIGJhc2VOYW1lKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWphdmEuaW8uRmlsZSB0ZW1wID0gbnVsbDsKLQkJaW50IGluZGV4ID0gMDsKLQkJZG8gewotCQkJbmFtZSA9IGJhc2VOYW1lICsgaW5kZXg7Ci0JCQl0ZW1wID0gbmV3IGphdmEuaW8uRmlsZShuYW1lKTsKLQkJCWluZGV4Kys7Ci0JCX0gd2hpbGUgKHRlbXAuZXhpc3RzKCkpOwotCQlyZXR1cm4gb3JpZ0NvcHkxLnJlbmFtZVRvKHRlbXApICYmIHRlbXAucmVuYW1lVG8ob3JpZ0NvcHkyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIGFVcmksIGphdmEuaW8uRmlsZSBvcmlnaW5hbCwgamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRmlsZSkgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJY2hlY2tXcml0ZWFibGUob3JpZ2luYWwpOwotCQlib29sZWFuIGRlbGV0ZVdvcmtlZCA9IGZhbHNlOwotCQlpZiAob3JpZ2luYWwuaXNEaXJlY3RvcnkoKSAmJiAhaXNSZW5hbWVhYmxlKG9yaWdpbmFsKSkgewotCQkJLy8gVE9ETyB0aHJvdyBuZXcKLQkJCS8vIFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywKLQkJCS8vIChuZXcgT2JqZWN0W117b3JpZ2luYWwuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyA9ICJVbmFibGUgdG8KLQkJCS8vIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZSAiCi0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWlmIChBcmNoaXZlVXRpbC5kZWxldGUob3JpZ2luYWwpKSB7Ci0JCQkJZGVsZXRlV29ya2VkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBNYWpvciBoYWNrIGhlcmU7IHRoZSBwcm9ibGVtIGlzIHRoYXQgYSBwcmV2aW91cyBjYWxsCi0JCQkJLy8gdG8gY2xvc2UgdGhlIHNvdXJjZSBmaWxlIG1heSBub3QgeWV0IGhhdmUKLQkJCQkvLyBiZWVuIHJlZmxlY3RlZCBpbiB0aGUgb3Mvdm07IHRoZXJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbAotCQkJCS8vIHRvIGRlbGV0ZSBmYWlscy4gVG8gZ2V0IGFyb3VuZCB0aGlzLAotCQkJCS8vIHdhaXQgZm9yIGEgYml0IGFuZCByZXRyeTsgaWYgaXQgY29udGludWVzIHRvIGZhaWwsIHRoZW4KLQkJCQkvLyB0aW1lIG91dCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKGRlbGV0ZVdvcmtlZCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJaWYgKGRlc3RpbmF0aW9uRmlsZS5yZW5hbWVUbyhvcmlnaW5hbCkpewotCQkJCQlEZWxldGVPbkV4aXRVdGlsaXR5LmZpbGVIYXNCZWVuRGVsZXRlZChkZXN0aW5hdGlvbkZpbGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFRPRE8gdGhyb3cgbmV3Ci0JCS8vIFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywKLQkJLy8gKG5ldyBPYmplY3RbXXtvcmlnaW5hbC5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7IC8vID0gIlVuYWJsZSB0byByZXBsYWNlCi0JCS8vIG9yaWdpbmFsIGFyY2hpdmUgIgotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbSB1cCB1bnRpbCB0aGUKLQkgKiBmaXJzdCBlbmQgb2YgZmlsZSBjaGFyYWN0ZXIsIGFuZCBjbG9zZSB0aGUgdHdvIHN0cmVhbXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKCEoaW4gaW5zdGFuY2VvZiBaaXBJbnB1dFN0cmVhbSkpCi0JCQkJaW4uY2xvc2UoKTsKLQkJCWlmICghKG91dCBpbnN0YW5jZW9mIFppcE91dHB1dFN0cmVhbSkpCi0JCQkJb3V0LmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oVGhyb3dhYmxlIGUpewotCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBtZXNzYWdlKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBaaXBGaWxlIG5ld1ppcEZpbGUoU3RyaW5nIGZpbGVOYW1lKXRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgWmlwRmlsZSBuZXdaaXBGaWxlKEZpbGUgYUZpbGUpdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShhRmlsZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBaaXBGaWxlcyB3aGljaCBhdm9pZCBtZW1vcnkgbGVha3MgCi0JICogYmVjYXVzZSBjbG9zaW5nIHRoZW0gZmFpbHMgdG8gY2xvc2Ugb3BlbiBpbnB1dHN0cmVhbXMuCi0JICogVGhlcmUgaXMgYSBTVU4gYnVnIG9wZW4gZm9yIHRoaXM6IGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY3MzUyNTUgCi0gICAgICogYnV0IGl0IGxvb2tzIGxpa2UgdGhlICJmaXgiIHdpbGwgYmUgdG8gY2hhbmdlIHRoZSBKYXZhZG9jIDotKCAgIAotCSAqIEBwYXJhbSBhRmlsZSBtb2RlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWmlwRmlsZSBuZXdaaXBGaWxlKEZpbGUgYUZpbGUsIGludCBtb2RlKSB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgWmlwRmlsZShhRmlsZSwgbW9kZSl7Ci0JCQlDb2xsZWN0aW9uIDxJbnB1dFN0cmVhbT4gb3BlblN0cmVhbXMgPSBudWxsOwotCQkJCi0JCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oWmlwRW50cnkgZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBzdXBlci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJaWYoaW4gIT0gbnVsbCl7Ci0JCQkJCWlmKG9wZW5TdHJlYW1zID09IG51bGwpewotCQkJCQkJb3BlblN0cmVhbXMgPSBuZXcgQXJyYXlMaXN0PElucHV0U3RyZWFtPigpOwotCQkJCQl9Ci0JCQkJCW9wZW5TdHJlYW1zLmFkZChpbik7Ci0JCQkJfQotCQkJCXJldHVybiBpbjsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCWNsb3NlT3BlblN0cmVhbXMoKTsKLQkJCQlzdXBlci5jbG9zZSgpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgY2xvc2VPcGVuU3RyZWFtcygpIHsKLQkJCQlpZihvcGVuU3RyZWFtcyAhPSBudWxsKXsKLQkJCQkJZm9yKElucHV0U3RyZWFtIGluOm9wZW5TdHJlYW1zKXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl3YXJuKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY4Y2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVPbkV4aXRVdGlsaXR5IHsKLQotCXByaXZhdGUgc3RhdGljIFNldCB0ZW1wRmlsZXNUb0RlbGV0ZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGNsZWFudXBDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMRUFOVVBfVEhSRVNIT0xEID0gMTAwMDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFya0ZvckRlbGV0aW9uKEZpbGUgZmlsZSkgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRlbXBGaWxlc1RvRGVsZXRlICE9IG51bGwpIHsKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKHRlbXBGaWxlc1RvRGVsZXRlKSB7Ci0JCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcEZpbGVzVG9EZWxldGUuaXRlcmF0b3IoKTsKLQkJCQkJCQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlmaWxlID0gKEZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pKTsKLQkJCQl0ZW1wRmlsZXNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBGaWxlc1RvRGVsZXRlICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGVtcEZpbGVzVG9EZWxldGUpIHsKLQkJCQljbGVhbnVwQ291bnQrKzsKLQkJCQl0ZW1wRmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7Ci0JCQl9Ci0JCQlpZiAoY2xlYW51cENvdW50ID4gQ0xFQU5VUF9USFJFU0hPTEQpIHsKLQkJCQlydW5DbGVhbnVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsZUhhc0JlZW5EZWxldGVkKEZpbGUgZmlsZSkgewotCQlpZiAodGVtcEZpbGVzVG9EZWxldGUgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0ZW1wRmlsZXNUb0RlbGV0ZSkgewotCQkJCWNsZWFudXBDb3VudCsrOwotCQkJCXRyeSB7Ci0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJdGVtcEZpbGVzVG9EZWxldGUucmVtb3ZlKGZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmIChjbGVhbnVwQ291bnQgPiBDTEVBTlVQX1RIUkVTSE9MRCkgewotCQkJCXJ1bkNsZWFudXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5DbGVhbnVwKCkgewotCQlpZiAodGVtcEZpbGVzVG9EZWxldGUgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0ZW1wRmlsZXNUb0RlbGV0ZSkgewotCQkJCWNsZWFudXBDb3VudCA9IDA7Ci0JCQkJTGlzdCBmaWxlc1RvUmVtb3ZlID0gbnVsbDsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHRlbXBGaWxlc1RvRGVsZXRlLml0ZXJhdG9yKCk7Ci0JCQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlID0gKEZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWlmIChmaWxlc1RvUmVtb3ZlID09IG51bGwpIHsKLQkJCQkJCQkJZmlsZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmlsZXNUb1JlbW92ZS5hZGQoZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZmlsZXNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCXRlbXBGaWxlc1RvRGVsZXRlLnJlbW92ZUFsbChmaWxlc1RvUmVtb3ZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0ZhaWxlZFRvQ2xvc2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9GYWlsZWRUb0Nsb3NlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWI3MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0ZhaWxlZFRvQ2xvc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDY1NDY4MTUxOTcwODM4NzY1OEw7Ci0KLQlwdWJsaWMgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9UZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9UZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkN2Q2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5EZWxldGVPbkV4aXRVdGlsaXR5OwotCi0KLS8qKgotICogVXNlZCBhcyBhbiBvcHRpbWl6YXRpb24gZm9yIHJlYWRpbmcgamFycyB3aXRoaW4gamFycy4gUmVhZGluZyBmcm9tIGEgWmlwRmlsZSBpcyBtdWNoIGZhc3RlciB0aGFuCi0gKiBmcm9tIGEgWmlwSW5wdXRTdHJlYW0sIHRoZXJlZm9yZSwgd2hlbiBwb3NzaWJsZSwgaXQgbWFrZXMgc2Vuc2UgdG8gY29weSB0aGUgbmVzdGVkIGphciB0byBhIHRlbXAKLSAqIGZpbGUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZSB0ZW1wIGZpbGUgZ2V0cyBkZWxldGVkIG9uIG5vcm1hbAotICogc3lzdGVtIGV4aXQsIHVzaW5nIHRoZSBoZWxwZXIgbWV0aG9kIG9uIGphdmEuaW8uRmlsZS4gVGhpcyBhZGFwdGVyIHdpbGwgYWxzbyBkZWxldGUgdGhlIGZpbGUKLSAqIHdoZW4gY2xvc2VkIG9yIGZpbmFsaXplZC4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCBleHRlbmRzIFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsIHsKLQotCXByb3RlY3RlZCBGaWxlIGZpbGU7Ci0JCi0JcHVibGljIFRlbXBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsKGphdmEuaW8uRmlsZSBmaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSkpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlmaWxlLmRlbGV0ZSgpOwotCQlEZWxldGVPbkV4aXRVdGlsaXR5LmZpbGVIYXNCZWVuRGVsZXRlZChmaWxlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5N2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgWmlwRmlsZSB6aXBGaWxlOwotCi0JcHVibGljIFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbChaaXBGaWxlIHppcEZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy56aXBGaWxlID0gemlwRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJdHJ5IHsKLQkJCWdldFppcEZpbGUoKS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgewotCQlaaXBFbnRyeSBlbnRyeSA9IGdldFppcEZpbGUoKS5nZXRFbnRyeShyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggZmlsZVBhdGgpIHsKLQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkoZmlsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYUZpbGUgPSBudWxsOwotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJYUZpbGUgPSBjcmVhdGVGaWxlKGVudHJ5KTsKLQkJfQotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGdldFppcEZpbGUoKS5lbnRyaWVzKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA9IGNyZWF0ZUZpbGUoZW50cnkpOwotCQkJbGlzdC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBJQXJjaGl2ZVJlc291cmNlIGNyZWF0ZUZpbGUoWmlwRW50cnkgZW50cnkpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGVudHJ5LmdldE5hbWUoKSk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYUZpbGUgPSBudWxsOwotCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFGaWxlID0gY3JlYXRlRmlsZShwYXRoKTsKLQkJCWFGaWxlLnNldFNpemUoZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQl9IGVsc2UgeyAvLyBhbHdheXMgaW5jbHVkZSBkaXJlY3RvcmllcwotCQkJYUZpbGUgPSBjcmVhdGVEaXJlY3RvcnkocGF0aCk7Ci0JCQlhRmlsZS5zZXRTaXplKGVudHJ5LmdldFNpemUoKSk7Ci0JCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJfQotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVBhdGggcGF0aCA9IGFGaWxlLmdldFBhdGgoKTsKLQkJCVN0cmluZyB1cmkgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IGdldFppcEZpbGUoKS5nZXRFbnRyeSh1cmkpOwotCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaGFjaywgYnV0IHppcCBmaWxlcyBhcmUgc2Vuc2l0aXZlIHRvIHRoZSBkaWZmZXJlbmNlCi0JCQkJLy8gYmV0d2VlbiAnLycgYW5kICdcXCcKLQkJCQkvLyBzbyB0aGUgaGFjayBpcyB0byB0cnkgYWxsIGNvbWJpbmF0aW9ucyB0byBzZWUgaWYgYW55IGV4aXN0Ci0JCQkJY2hhcltdIGNoYXJzID0gdXJpLnRvQ2hhckFycmF5KCk7Ci0JCQkJaW50W10gc2xhc2hJbmRpY2VzID0gbmV3IGludFtjaGFycy5sZW5ndGhdOwotCQkJCWludCBzbGFzaENvdW50ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChjaGFyc1tpXSA9PSAnLycgfHwgY2hhcnNbaV0gPT0gJ1xcJykgewotCQkJCQkJc2xhc2hJbmRpY2VzW3NsYXNoQ291bnRdID0gaTsKLQkJCQkJCXNsYXNoQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbnQgc2xhc2hQb3cgPSAoaW50KSBNYXRoLnBvdygyLCBzbGFzaENvdW50KTsKLQkJCQlib29sZWFuIGZvdW5kSXQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNsYXNoUG93ICYmICFmb3VuZEl0OyBpKyspIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzbGFzaENvdW50OyBqKyspIHsKLQkJCQkJCWlmICgoaSA+PiBqICYgMSkgPT0gMSkgewotCQkJCQkJCWNoYXJzW3NsYXNoSW5kaWNlc1tqXV0gPSAnLyc7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNoYXJzW3NsYXNoSW5kaWNlc1tqXV0gPSAnXFwnOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KG5ldyBTdHJpbmcoY2hhcnMpKTsKLQkJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJCWZvdW5kSXQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShnZXRaaXBGaWxlKCkuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHppcENsb3NlZCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHppcENsb3NlZC50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEZpbGUgZ2V0WmlwRmlsZSgpIHsKLQkJcmV0dXJuIHppcEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0WmlwRmlsZShqYXZhLnV0aWwuemlwLlppcEZpbGUgbmV3WmlwRmlsZSkgewotCQl6aXBGaWxlID0gbmV3WmlwRmlsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHppcEZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbigiU2ltcGxlIFppcCBBcmNoaXZlcyBoYXZlIG5vIG1vZGVsIG9iamVjdHMuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjAwZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVNhdmVBZGFwdGVyOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgY29uY3JldGUgaW1wbGVudGF0aW9uIG9mIElBcmNoaXZlU2F2ZUFkYXB0ZXIuIEFsbCB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUsIGluY2x1ZGluZyB4bWkKLSAqIHJlc291cmNlcywgd2lsbCBiZSBvdXRwdXQgdG8gYSBaaXBPdXRwdXRTdHJlYW0uIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBiZSBwYXNzZWQgaW4gYnkgdGhlCi0gKiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgaW1wbGVtZW50cyBJQXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uU3RyZWFtOwotCS8qKiBVc2VkIGludGVybmFsbHkgKi8KLQlwcm90ZWN0ZWQgWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbTsKLQotCS8qKgotCSAqIFdyYXBzIGEgbmV3IHppcCBvdXRwdXQgc3RyZWFtIGFyb3VuZCB0aGUgcGFyYW1ldGVyCi0JICovCi0JcHVibGljIFppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwoT3V0cHV0U3RyZWFtIG91dCkgewotCQlzZXREZXN0aW5hdGlvblN0cmVhbShvdXQpOwotCQlzZXRaaXBPdXRwdXRTdHJlYW0obmV3IFppcE91dHB1dFN0cmVhbShvdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlc3RpbmF0aW9uU3RyZWFtKCkuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmVTYXZlQWRhcHRlciBjcmVhdGVOZXN0ZWRTYXZlQWRhcHRlcihJQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIG5ldyBaaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsKGdldFppcE91dHB1dFN0cmVhbSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5maW5pc2goKTsKLQkJLy9JZiB0aGlzIGlzIG5vdCBuZXN0ZWQsIGNsb3NlIHRoZSBzdHJlYW0gdG8gZnJlZSB1cCB0aGUgcmVzb3VyY2UKLQkJLy9vdGhlcndpc2UsIGRvbid0IGNsb3NlIGl0IGJlY2F1c2UgdGhlIHBhcmVudCBtYXkgbm90IGJlIGRvbmUKLQkJaWYgKCEoZ2V0RGVzdGluYXRpb25TdHJlYW0oKSBpbnN0YW5jZW9mIFppcE91dHB1dFN0cmVhbSkpCi0JCQlnZXREZXN0aW5hdGlvblN0cmVhbSgpLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmlvLk91dHB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXREZXN0aW5hdGlvblN0cmVhbSgpIHsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uU3RyZWFtOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFppcE91dHB1dFN0cmVhbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gZ2V0WmlwT3V0cHV0U3RyZWFtKCkgewotCQlyZXR1cm4gemlwT3V0cHV0U3RyZWFtOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmUoSUFyY2hpdmVSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpOwotCQkJaWYocmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEUgJiYgIXBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSl7Ci0JCQkJcGF0aCA9IHBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCX0KLQkJCQotCQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkocGF0aC50b1N0cmluZygpKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSA+IDApCi0JCQkJZW50cnkuc2V0VGltZShyZXNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJQXJjaGl2ZVV0aWwuY29weShyZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpLCBnZXRaaXBPdXRwdXRTdHJlYW0oKSk7Ci0JCQl9Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5jbG9zZUVudHJ5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzdGluYXRpb25TdHJlYW0KLQkgKiAgICAgICAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25TdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gbmV3RGVzdGluYXRpb25TdHJlYW0pIHsKLQkJZGVzdGluYXRpb25TdHJlYW0gPSBuZXdEZXN0aW5hdGlvblN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3WmlwT3V0cHV0U3RyZWFtCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFppcE91dHB1dFN0cmVhbShqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSBuZXdaaXBPdXRwdXRTdHJlYW0pIHsKLQkJemlwT3V0cHV0U3RyZWFtID0gbmV3WmlwT3V0cHV0U3RyZWFtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL0phdmFFRVF1aWNrUGVlay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL0phdmFFRVF1aWNrUGVlay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE4NjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9KYXZhRUVRdWlja1BlZWsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBBIFV0aWxpdHkgZm9yIHF1aWNrbHkgZGV0ZXJtaW5pbmcgdGhlIHR5cGUgYW5kIHZlcnNpb24gb2YgYSBKYXZhIEVFCi0gKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgamFzaG9sbAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRUVRdWlja1BlZWsgaW1wbGVtZW50cyBKMkVFVmVyc2lvbkNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5TRVQgPSAtMjsKLQotCXByaXZhdGUgWE1MUm9vdEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrKGludCB0eXBlLCBpbnQgdmVyc2lvbikgewotCQl0aGlzKHR5cGUsIHZlcnNpb24sIFVOU0VUKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrKGludCB0eXBlLCBpbnQgdmVyc2lvbiwgaW50IGphdmFFRVZlcnNpb24pIHsKLQkJaWYgKHR5cGUgPT0gVU5LTk9XTikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInR5cGUgbXVzdCBub3QgYmUgVU5LTk9XTiIpOwotCQl9IGVsc2UgaWYgKHZlcnNpb24gPT0gVU5LTk9XTikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInZlcnNpb24gbXVzdCBub3QgYmUgVU5LTk9OVyIpOwotCQl9IGVsc2UgaWYgKGphdmFFRVZlcnNpb24gPT0gVU5LTk9XTikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImphdmFFRVZlcnNpb24gbXVzdCBub3QgYmUgVU5LTk9OVyIpOwotCQl9Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuamF2YUVFVmVyc2lvbiA9IGphdmFFRVZlcnNpb247Ci0JfQotCi0JcHVibGljIEphdmFFRVF1aWNrUGVlayhJbnB1dFN0cmVhbSBpbikgewotCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0JCQkJaGFuZGxlciA9IG5ldyBYTUxSb290SGFuZGxlcigpOwotCQkJCWhhbmRsZXIucGFyc2VDb250ZW50cyhpbnB1dFNvdXJjZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJCWluLnJlc2V0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2ZXJzaW9uID0gVU5LTk9XTjsKLQkJCWphdmFFRVZlcnNpb24gPSBVTktOT1dOOwotCQkJdHlwZSA9IFVOS05PV047Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB2ZXJzaW9uID0gVU5TRVQ7Ci0KLQlwcml2YXRlIGludCBqYXZhRUVWZXJzaW9uID0gVU5TRVQ7Ci0KLQlwcml2YXRlIGludCB0eXBlID0gVU5TRVQ7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdHlwZSBhcyBkZWZpbmVkIGJ5IG9uZSBvZgotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNVTktOT1dOfSwKLQkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjQVBQTElDQVRJT05fQ0xJRU5UX1RZUEV9LAotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNBUFBMSUNBVElPTl9UWVBFfSwKLQkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjRUpCX1RZUEV9LAotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNDT05ORUNUT1JfVFlQRX0sCi0JICoge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzI1dFQl9UWVBFfSwKLQkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjV0VCU0VSVklDRVNfVFlQRX0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlpZiAodHlwZSA9PSBVTlNFVCkgewotCQkJU3RyaW5nIHJvb3ROYW1lID0gaGFuZGxlci5nZXRSb290TmFtZSgpOwotCQkJaWYgKHJvb3ROYW1lID09IG51bGwpIHsKLQkJCQl0eXBlID0gVU5LTk9XTjsKLQkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ET0NUWVBFKSkgewotCQkJCXR5cGUgPSBBUFBMSUNBVElPTl9DTElFTlRfVFlQRTsKLQkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRE9DVFlQRSkpIHsKLQkJCQl0eXBlID0gQVBQTElDQVRJT05fVFlQRTsKLQkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0RPQ1RZUEUpKSB7Ci0JCQkJdHlwZSA9IEVKQl9UWVBFOwotCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfRE9DVFlQRSkpIHsKLQkJCQl0eXBlID0gQ09OTkVDVE9SX1RZUEU7Ci0JCQl9IGVsc2UgaWYgKHJvb3ROYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9ET0NUWVBFKSkgewotCQkJCXR5cGUgPSBXRUJfVFlQRTsKLQkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0RPQ1RZUEUpKSB7Ci0JCQkJdHlwZSA9IFdFQlNFUlZJQ0VTX1RZUEU7Ci0JCQl9ZWxzZSB7Ci0JCQkJdHlwZSA9IFVOS05PV047Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplU2NoZW1hTG9jYXRpb24oU3RyaW5nIHNjaGVtYUxvY2F0aW9uKXsKLQkJaWYoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljaGFyIFtdIG9sZENoYXJzID0gc2NoZW1hTG9jYXRpb24udG9DaGFyQXJyYXkoKTsKLQkJY2hhciBbXSBuZXdDaGFycyA9IG5ldyBjaGFyW29sZENoYXJzLmxlbmd0aF07Ci0JCWludCBuZXdDaGFySW5kZXggPSAwOwotCQlib29sZWFuIG9uV2hpdGVTcGFjZSA9IHRydWU7Ci0JCWJvb2xlYW4gYWZ0ZXJXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCWZvcihpbnQgb2xkQ2hhckluZGV4PTA7IG9sZENoYXJJbmRleDxvbGRDaGFycy5sZW5ndGg7IG9sZENoYXJJbmRleCsrKXsKLQkJCWFmdGVyV2hpdGVTcGFjZSA9IG9uV2hpdGVTcGFjZTsKLQkJCW9uV2hpdGVTcGFjZSA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2Uob2xkQ2hhcnNbb2xkQ2hhckluZGV4XSk7Ci0JCQlib29sZWFuIHNob3VsZFNraXAgPSBvbldoaXRlU3BhY2UgJiYgYWZ0ZXJXaGl0ZVNwYWNlOwotCQkJaWYoIXNob3VsZFNraXApewotCQkJCW5ld0NoYXJzW25ld0NoYXJJbmRleCsrXSA9IG9uV2hpdGVTcGFjZSA/ICcgJyA6IG9sZENoYXJzW29sZENoYXJJbmRleF07Ci0JCQl9Ci0JCQlib29sZWFuIGF0RW5kID0gKChvbGRDaGFySW5kZXggKyAxKSA9PSBvbGRDaGFycy5sZW5ndGgpOwotCQkJaWYoYXRFbmQgJiYgb25XaGl0ZVNwYWNlKXsKLQkJCQl3aGlsZShuZXdDaGFySW5kZXggPiAwICAmJiBuZXdDaGFyc1tuZXdDaGFySW5kZXgtMV0gPT0gJyAnKXsKLQkJCQkJbmV3Q2hhckluZGV4IC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihuZXdDaGFycyAhPSBudWxsKXsKLQkJCXJldHVybiBuZXcgU3RyaW5nKG5ld0NoYXJzLCAwLCBuZXdDaGFySW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHNjaGVtYUxvY2F0aW9uOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGZvciB0aGlzIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0eXBlLiBGb3IKLQkgKiBleGFtcGxlLCBpZiB0aGlzIGlzIGEgRUpCIDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoaXMgcmV0dXJucyB0aGUKLQkgKiBjb25zdGFudCBmb3IgMy4wIGFzIGRlZmluZWQgYnllIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50c30KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotCQlpZiAodmVyc2lvbiA9PSBVTlNFVCkgewotCQkJU3RyaW5nIHB1YmxpY0lEID0gaGFuZGxlci5nZXREdGRQdWJsaWNJRCgpOwotCQkJU3RyaW5nIHN5c3RlbUlEID0gaGFuZGxlci5nZXREdGRTeXN0ZW1JRCgpOwotCQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBudWxsOwotCQkJaWYgKHB1YmxpY0lEID09IG51bGwgfHwgc3lzdGVtSUQgPT0gbnVsbCkgewotCQkJCWlmIChoYW5kbGVyLmdldFJvb3RBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotCQkJCQlzY2hlbWFOYW1lID0gbm9ybWFsaXplU2NoZW1hTG9jYXRpb24oaGFuZGxlci5nZXRSb290QXR0cmlidXRlcygpLmdldFZhbHVlKCJ4c2k6c2NoZW1hTG9jYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKHNjaGVtYU5hbWUgPT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uID0gVU5LTk9XTjsKLQkJCQkJcmV0dXJuIHZlcnNpb247Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChnZXRUeXBlKCkpIHsKLQkJCWNhc2UgQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMpCi0JCQkJCQkJJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKSB8fCBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzMpKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8yKQotCQkJCQkJCSYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMikgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8yKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzFfNCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzUpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzYpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQTElDQVRJT05fVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMpCi0JCQkJCQkJJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMykgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMykpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8yKQotCQkJCQkJCSYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzIpIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU0NIRU1BXzFfNCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV81KSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfNikpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFSkJfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMl8wKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMCkgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8yXzApKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzFfMSkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8xXzEpIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NDSEVNQV8yXzEpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfM18wKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1JfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCkgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0FMVF9TWVNURU1JRF8xXzApKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV8xXzYpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgV0VCX1RZUEU6Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzMpIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8zKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzIpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yKSB8fCBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfQUxUX1NZU1RFTUlEXzJfMikpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl80KSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOwotCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NDSEVNQV8zXzApKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzNfMF9JRDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgV0VCU0VSVklDRVNfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJTRVJWSUNFX1BVQkxJQ0lEKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRCkpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8wX0lEOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfMV8xKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfMV9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BXzFfMikpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzJfSUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZlcnNpb24gPT0gVU5TRVQpIHsKLQkJCQl2ZXJzaW9uID0gVU5LTk9XTjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIHRoZSB2ZXJzaW9uIHJldHVybmVkIGZyb20ge0BsaW5rICNnZXRWZXJzaW9uKCl9IHRvIHRoZSBKYXZhIEVFIHNwZWMKLQkgKiB2ZXJzaW9uLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBhbiBFSkIgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhpcwotCSAqIHJldHVybnMgdGhlIGNvbnN0YW50IGZvciA1LjAgKHdoaWNoIG1hcHMgdG8gdGhlIEphdmEgRUUgc3BlYyB2ZXJzaW9uIG9mCi0JICogNS4wKS4gYXMgZGVmaW5lZCBieSB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHN9Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmF2YUVFVmVyc2lvbigpIHsKLQkJaWYgKGphdmFFRVZlcnNpb24gPT0gVU5TRVQpIHsKLQkJCWludCB0eXBlID0gZ2V0VHlwZSgpOwotCQkJaW50IHZlcnNpb24gPSBnZXRWZXJzaW9uKCk7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6Ci0JCQljYXNlIEFQUExJQ0FUSU9OX1RZUEU6Ci0JCQkJamF2YUVFVmVyc2lvbiA9IHZlcnNpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVKQl9UWVBFOgotCQkJCXN3aXRjaCAodmVyc2lvbikgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOgotCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOgotCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRUNvbnN0YW50cy5KRUVfNl8wX0lEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTk5FQ1RPUl9UWVBFOgotCQkJCXN3aXRjaCAodmVyc2lvbikgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSkVFXzZfMF9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUJfVFlQRToKLQkJCQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOgotCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgV0VCU0VSVklDRVNfVFlQRToKLQkJCXN3aXRjaCAodmVyc2lvbikgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzBfSUQ6Ci0JCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzFfSUQ6Ci0JCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzJfSUQ6Ci0JCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkJaWYgKGphdmFFRVZlcnNpb24gPT0gVU5TRVQpIHsKLQkJCQlqYXZhRUVWZXJzaW9uID0gVU5LTk9XTjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamF2YUVFVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YUVFVmVyc2lvbihpbnQgamF2YUVFVmVyc2lvbikgewotCQl0aGlzLmphdmFFRVZlcnNpb24gPSBqYXZhRUVWZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9YTUxSb290SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL1hNTFJvb3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGMyNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL1hNTFJvb3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxSb290SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgTGV4aWNhbEhhbmRsZXIgewotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcnNpbmcgc2hvdWxkIHN0b3AuIFRoaXMgaXMgdXN1YWxseQotCSAqIHRyaWdnZXJlZCB3aGVuIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdG9wUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBBbGwgc2VyaWFsaXphYmxlIG9iamVjdHMgc2hvdWxkIGhhdmUgYSBzdGFibGUgc2VyaWFsVmVyc2lvblVJRAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3RvcFBhcnNpbmdFeGNlcHRpb248L2NvZGU+IHdpdGggYQotCQkgKiA8Y29kZT5udWxsPC9jb2RlPiBkZXRhaWwgbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBTdG9wUGFyc2luZ0V4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKChTdHJpbmcpIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZHRkTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBkdGRQdWJsaWNJRCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBkdGRTeXN0ZW1JRCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBmb3VuZCBpbiB0aGUgWE1MIGZpbGUuIFRoaXMKLQkgKiBtZW1iZXIgdmFyaWFibGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIHRoZSBmaWxlIGhhcyBiZWVuIHBhcnNlZAotCSAqIHN1Y2Nlc3NmdWwgdG8gdGhlIHBvaW50IG9mIGZpbmRpbmcgdGhlIHRvcC1sZXZlbCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRGb3VuZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGVzZSBhcmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGZvdW5kIGluIHRoZSBYTUwgZmlsZS4KLQkgKiBUaGlzIG1lbWJlciB2YXJpYWJsZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgdGhlIGZpbGUgaGFzIGJlZW4KLQkgKiBwYXJzZWQgc3VjY2Vzc2Z1bCB0byB0aGUgcG9pbnQgb2YgZmluZGluZyB0aGUgdG9wLWxldmVsIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNGb3VuZCA9IG51bGw7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldER0ZE5hbWUoKSB7Ci0JCXJldHVybiBkdGROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHRkUHVibGljSUQoKSB7Ci0JCXJldHVybiBkdGRQdWJsaWNJRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldER0ZFN5c3RlbUlEKCkgewotCQlyZXR1cm4gZHRkU3lzdGVtSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRGb3VuZDsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRSb290QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXNGb3VuZDsKLQl9Ci0KLQlwdWJsaWMgWE1MUm9vdEhhbmRsZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbW1lbnQoZmluYWwgY2hhcltdIGNoLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBsZW5ndGgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBTQVggcGFyc2VyIGZvciB1c2Ugd2l0aGluIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBwYXJzZXIuCi0JICogCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgYSBwYXJzZXIgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiBzb21ldGhpbmcgaW4gZ2VuZXJhbCBnb2VzIHdyb25nIHdoZW4gY3JlYXRpbmcgdGhlIHBhcnNlci4KLQkgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+WE1MUmVhZGVyPC9jb2RlPiBkb2VzIG5vdCByZWNvZ25pemUgdGhlCi0JICogICAgICAgICAgICAgbGV4aWNhbCBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCSAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPlhNTFJlYWRlcjwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbGV4aWNhbAotCSAqICAgICAgICAgICAgIGhhbmRsZXIgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXIgY3JlYXRlUGFyc2VyKFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgcGFyc2VyLgotCQlmaW5hbCBTQVhQYXJzZXIgcGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJZmluYWwgWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkaXNhYmxlIERURCB2YWxpZGF0aW9uIChidWcgNjM2MjUpCi0JCXRyeSB7Ci0JCQkvLyBiZSBzdXJlIHZhbGlkYXRpb24gaXMgIm9mZiIgb3IgdGhlIGZlYXR1cmUgdG8gaWdub3JlIERURCdzIHdpbGwKLQkJCS8vIG5vdCBhcHBseQotCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1leHRlcm5hbC1kdGQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3QgYSBiaWcgZGVhbCBpZiB0aGUgcGFyc2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgZmVhdHVyZXMKLQkJfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vdCBhIGJpZyBkZWFsIGlmIHRoZSBwYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmVhdHVyZXMKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmRDREFUQSgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRFREKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmREVEQoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGVuZEVudGl0eShmaW5hbCBTdHJpbmcgbmFtZSkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJzZUNvbnRlbnRzKElucHV0U291cmNlIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIFBhcnNlIHRoZSBmaWxlIGludG8gd2UgaGF2ZSB3aGF0IHdlIG5lZWQgKG9yIGFuIGVycm9yIG9jY3VycykuCi0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZpbmFsIFNBWFBhcnNlciBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoZmFjdG9yeSk7Ci0JCQkvLyB0byBzdXBwb3J0IGV4dGVybmFsIGVudGl0aWVzIHNwZWNpZmllZCBhcyByZWxhdGl2ZSBVUklzIChzZWUgYnVnCi0JCQkvLyA2MzI5OCkKLQkJCWNvbnRlbnRzLnNldFN5c3RlbUlkKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcnNlci5wYXJzZShjb250ZW50cywgdGhpcyk7Ci0JCX0gY2F0Y2ggKFN0b3BQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEFib3J0IHRoZSBwYXJzaW5nIG5vcm1hbGx5LiBGYWxsIHRocm91Z2guLi4KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFJlc29sdmUgZXh0ZXJuYWwgZW50aXR5IGRlZmluaXRpb25zIHRvIGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyB0byBzcGVlZAotCSAqIHVwIHByb2Nlc3Npbmcgb2YgZmlsZXMgd2l0aCBleHRlcm5hbCBEVERzLiBOb3QgcmVzb2x2aW5nIHRoZSBjb250ZW50cyBvZgotCSAqIHRoZSBEVEQgaXMgb2ssIGFzIG9ubHkgdGhlIFN5c3RlbSBJRCBvZiB0aGUgRFREIGRlY2xhcmF0aW9uIGlzIHVzZWQuCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoIiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0Q0RBVEEoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0RFREKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgcHVibGljSWQsIGZpbmFsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWR0ZE5hbWUgPSBuYW1lOwotCQlkdGRQdWJsaWNJRCA9IHB1YmxpY0lkOwotCQlkdGRTeXN0ZW1JRCA9IHN5c3RlbUlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0RWxlbWVudChmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyBxdWFsaWZpZWROYW1lLCBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQllbGVtZW50Rm91bmQgPSBlbGVtZW50TmFtZSA9PSBudWxsIHx8IGVsZW1lbnROYW1lLmxlbmd0aCgpID09IDAgPyBxdWFsaWZpZWROYW1lOiBlbGVtZW50TmFtZTsKLQkJaWYoZWxlbWVudEZvdW5kLmluZGV4T2YoJzonKSAhPSAtMSl7Ci0JCQllbGVtZW50Rm91bmQgPSBlbGVtZW50Rm91bmQuc3Vic3RyaW5nKGVsZW1lbnRGb3VuZC5pbmRleE9mKCc6JykrMSk7Ci0JCX0KLQkJYXR0cmlidXRlc0ZvdW5kID0gYXR0cmlidXRlczsKLQkJdGhyb3cgbmV3IFN0b3BQYXJzaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydEVudGl0eShmaW5hbCBTdHJpbmcgbmFtZSkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjgxOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zcmMuaW5jbHVkZXMgPSByb3NlLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIG1vZGVsLwotamFycy5jb21waWxlLm9yZGVyID0gLgotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IG1vZmoyZWUvLFwKLSAgICAgICAgICAgd2Vic2VydmljZXMvLFwKLSAgICAgICAgICAgY29tbW9uQXJjaGl2ZS8sXAotICAgICAgICAgICBqMmVlQ29yZVBsdWdpbi8sXAotICAgICAgICAgICBqMmVlLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgYXJjaGl2ZS8sXAotICAgICAgICAgICBqZWUtbW9kZWxzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTBmNTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL2NvbW1vbmFyY2hpdmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3ViY2xhc3NfcmVzcG9uc2liaWx0eV9FWENfPUlXQUUwMDAxRSB7MH0gbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcwota2V5X2NsYXNzX3JlZmxlY3Rpb25fRVJST1JfPUlXQUUwMDAyRSBVbmFibGUgdG8gcmVmbGVjdCB0aGUgY2xhc3MgInswfSIgaW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkgZmllbGQgInsxfSIgZnJvbSBlbnRpdHkgInsyfSIKLWtleV9maWVsZF9yZWZsZWN0aW9uX0VSUk9SXz1JV0FFMDAwM0UgVW5hYmxlIHRvIHJlZmxlY3QgdGhlIHR5cGUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkICJ7MH0iIGZyb20gZW50aXR5ICJ7MX0iCi1yZW1vdmluZ19rZXlfZmllbGRfSU5GT189SVdBRTAwMDRJIFJlbW92aW5nIGludmFsaWQgcHJpbS1rZXktZmllbGQgInswfSIgZnJvbSBlbnRpdHkgInsxfSIKLXJlcGFpcl91c2FnZV9FUlJPUl89SVdBRTAwMDVFIFJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiBjYW5ub3Qgd3JpdGUgdG8gZGVzdGluYXRpb25QYXRoOiB7MH0KLWludmFsaWRfYXJjaGl2ZV9FWENfPUlXQUUwMDA2RSBBcmNoaXZlIGlzIG5vdCBhIHZhbGlkIHswfSBiZWNhdXNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIG5vdCBiZSBmb3VuZCAoY2FzZSBzZW5zaXRpdmUpOiB7MX0KLWxvYWRfcmVzb3VyY2VfRVhDXz1JV0FFMDAwN0UgQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgInswfSIgaW4gYXJjaGl2ZSAiezF9IgotbmVzdGVkX2phcl9FWENfPUlXQUUwMDA4RSBBbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHswfSBmcm9tIHsxfQotbWFrZV90ZW1wX2Rpcl9FWENfPUlXQUUwMDA5RSBVbmFibGUgdG8gbWFrZSB0ZW1wIGRpcmVjdG9yeTogezB9Ci1pbnZhbGlkX2NsYXNzcGF0aF9XQVJOXz1JV0FFMDAxMFcgQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgWmlwIGZpbGUKLWludmFsaWRfY3BfZmlsZV9XQVJOXz1JV0FFMDAxMVcgQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgZG9lcyBub3QgcG9pbnQgdG8gYSBsb2NhbCBmaWxlCi1pb19leF9sb2FkaW5nX0VYQ189SVdBRTAwMTJFIEFuIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIHswfQotdHhfYmVhbl9tZ2RfV0FSTl89SVdBRTAwMTNXIEVKQiAxLjAgSW1wb3J0OiBOb3QgbWFwcGluZyBUWF9CRUFOX01BTkFHRUQgY29udHJvbCBkZXNjcmlwdG9yIGZvciB7MH0KLWVycm9yX3NhdmluZ19FWENfPUlXQUUwMDE0RSBFcnJvciBzYXZpbmcgezB9Ci1pb19leF9tYW5pZmVzdF9FWENfPUlXQUUwMDE1RSBBbiBJT0V4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHRoZSBtYW5pZmVzdCBpbiBhcmNoaXZlOiB7MH0KLWlvX2V4X3Jlb3Blbl9FWENfPUlXQUUwMDE2RSBJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSByZW9wZW5pbmcgezB9Ci11bmFibGVfcmVwbGFjZV9FWENfPUlXQUUwMDE3RSBVbmFibGUgdG8gcmVwbGFjZSBvcmlnaW5hbCBhcmNoaXZlOiB7MH0KLWR1cGxpY2F0ZV9maWxlX0VYQ189SVdBRTAwMThFIFRoZSBhcmNoaXZlIG5hbWVkIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSBuYW1lZCB7MX0KLWR1cGxpY2F0ZV9lbnRyeV9FWENfPUlXQUUwMDE5RSBBIGZpbGUgb3IgcmVzb3VyY2Ugd2l0aCB1cmkgezB9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIG5hbWVkIHsxfQotZmlsZV9leGlzdF9hc19kaXJfRVhDXz1JV0FFMDAyMEUgQSBmaWxlIG5hbWVkIHswfSBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5Ci11bmNvbnRhaW5lZF9tb2R1bGVfRVhDXz1JV0FFMDAyMUUgTW9kdWxlIHswfSBpcyBub3QgY29udGFpbmVkIGJ5IGFuIEVBUiBmaWxlCi1kZF9pbl9lYXJfbG9hZF9FWENfPUlXQUUwMDIyRSBFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBFQVIgZmlsZSAiezF9IgotbmVzdGVkX29wZW5fZmFpbF9FWENfPUlXQUUwMDIzRSBVbmFibGUgdG8gb3BlbiBtb2R1bGUgZmlsZSAiezB9IiBpbiBFQVIgZmlsZSAiezF9IgotZHVwbGljYXRlX21vZHVsZV9FWENfPUlXQUUwMDI0RSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgRUFSIGZpbGUgInswfSIgYWxyZWFkeSBjb250YWlucyBhIG1vZHVsZSBoYXZpbmcgdXJpICJ7MX0iCi1ub19zZWNfcm9sZV9FWENfPUlXQUUwMDI1RSB7MH06IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0KLWR1cF9zZWNfcm9sZV9FWENfPUlXQUUwMDI2RSB7MH06IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0KLWR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXz1JV0FFMDAyN0UgRGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB7MH0gYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfcmVzb3VyY2VfRVhDXz1JV0FFMDAyOEUgUmVzb3VyY2UgbmFtZWQgInswfSIgYWxyZWFkeSBleGlzdHMgaW4gYXJjaGl2ZSAiezF9IgotZXJyb3Jfc2F2aW5nX0VYQ189SVdBRTAwMzBFIEVycm9yIHNhdmluZyB7MH0KLWFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfPUlXQUUwMDMxRSBUaGUgbWV0aG9kICJhZGRDb3B5Q2xhc3MiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzLiBVUkk6IHswfQotYWRkX2NvcHlfbGliX2Rpcl9FWENfPUlXQUUwMDMyRSBUaGUgbWV0aG9kICJhZGRDb3B5TGliIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3Rvcmllcy4gVVJJOiB7MH0KLWxpc3RfY29tcG9uZW50c193YXJfRVhDXz1JV0FFMDAzM0UgRXhjZXB0aW9uIG9jY3VycmVkIGxpc3RpbmcgY29tcG9uZW50cyBpbiBXQVIgZmlsZTogezB9Ci1vcGVuX25lc3RlZF9FWENfPUlXQUUwMDM0RSBDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIKLW1ha2VfdGVtcF9maWxlX1dBUk5fPUlXQUUwMDM1VyBXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZSBmb3IgezB9LiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4KLWZpbGVfbm90X2ZvdW5kX0VYQ189SVdBRTAwMzZFIFVSSSBOYW1lOiB7MH07IEZpbGUgbmFtZTogezF9Ci1jb3VsZF9ub3Rfb3Blbl9FWENfPUlXQUUwMDM3RSBDb3VsZCBub3Qgb3BlbiB7MH0KLWNvdWxkX25vdF9maW5kX2Rpcl9FWENfPUlXQUUwMDM4RSBVbmFibGUgdG8gb3BlbiBkaXJlY3RvcnkgezB9Ci1ub3RfYV9kaXJfRVhDXz1JV0FFMDAzOUUgVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IGJlY2F1c2UgZmlsZSBpcyBub3QgYSBkaXJlY3Rvcnk6IHswfQotaW5mZXJyZWRfZGRzX0VYQ189SVdBRTAwNDBFIFRoZSBFSkIgSkFSIGZpbGUgInswfSIgd2FzIGluZmVycmVkIHRvIGJlIG9mIHZlcnNpb24gMS4wIGJlY2F1c2UgdGhlIG1hbmlmZXN0IGRvZXMgbm90IGRlY2xhcmUgZW50ZXJwcmlzZSBiZWFucyBidXQgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGV4aXN0IGluIHRoZSBKQVIuCi1maWxlbmFtZV9leGNlcHRpb25fRVhDXz1JV0FFMDA0MUUgRmlsZW5hbWU6IHswfTsgRXhjZXB0aW9uOiB7MX0KLW5vX2Rkc18xMF9FWENfPUlXQUUwMDQyRSBObyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGluIEVKQiAxLjAgSkFSIGZpbGU6IHswfQotbWFuaWZlc3RfZGRfbG9hZF9FWENfPUlXQUUwMDQzRSBUaGUgSkFSIG1hbmlmZXN0IGRlY2xhcmVzIGFuIGVudGVycHJpc2UgYmVhbiBmb3Igd2hpY2ggdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGNhbiBub3QgYmUgbG9hZGVkOiB7MH0KLW1hbmlmZXN0X2RkX2ZpbmRfRVhDXz1JV0FFMDA0NEUgVGhlIEpBUiBtYW5pZmVzdCBkZWNsYXJlcyBhbiBlbnRlcnByaXNlIGJlYW4gZm9yIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBjYW4gbm90IGJlIGZvdW5kOiB7MH0KLWlvX2V4X3JlYWRpbmdfZGRfRVhDXz1JV0FFMDA0NUUgSU8gRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgezB9Ci1zZXJfbm90X2RkX0VYQ189SVdBRTAwNDZFIFRoZSBzZXJpYWxpemVkIG9iamVjdCBpbiBmaWxlICJ7MH0iIGlzIG5vdCBhIGFuIGluc3RhbmNlIG9mIGphdmF4LmVqYi5kZXBsb3ltZW50LkRlcGxveW1lbnREZXNjcmlwdG9yCi1yZWFkaW5nX2RkX0VYQ189SVdBRTAwNDdFIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfQotbWlzc2luZ19jbGFzc19FWENfPUlXQUUwMDQ4RSBDb3VsZCBub3QgZGVzZXJpYWxpemUgezB9IGJlY2F1c2UgYSByZXF1aXJlZCBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuICBFeGNlcHRpb246IHsxfQotQ29udmVydGVkPUNvbnZlcnRlZAotU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVhDXz1JV0FFMDA0OUUgU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoKLUlPRXhjZXB0aW9uX29jY3VycmVkX3doaWxlX0VYQ189SVdBRTAwNTBFIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvcHlpbmcgbWFuaWZlc3QKLUV4dHJhY3RfZGVzdGluYXRpb25faXNfdGhlX0VYQ189SVdBRTAwNTFFIEV4dHJhY3QgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgcGF0aCBhcyBzb3VyY2UgZmlsZQotUGFyYW1ldGVyX3Nob3VsZF9ub3RfYmVfbnVfRVhDXz1JV0FFMDA1MkUgUGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbAotQXJjaGl2ZV9pc19ub3RfYV92YWxpZF9FSkJfRVhDXz1JV0FFMDA1NUUgQXJjaGl2ZSBpcyBub3QgYSB2YWxpZCBFSkIgSkFSIGZpbGUgKDEuMCkgYmVjYXVzZSBubyBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgY2FuIGJlIGZvdW5kLCBlaXRoZXIgaW4gdGhlIG1hbmlmZXN0IG9yIGluIGVudHJpZXMgd2l0aCBhICIuc2VyIiBleHRlbnNpb24KLV9UaGVfZm9sbG93aW5nX2ZpbGVzX2NvdWxkX0VYQ189SVdBRTAwNTZFIFRoZSBmb2xsb3dpbmcgZmlsZXMgY291bGQgbm90IGJlIGxvYWRlZDoKLUZpeFByaW1LZXlDb21tYW5kX2ZhaWxlZF9fX0VYQ189SVdBRTAwNTdFIEZpeFByaW1LZXlDb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToKLUZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19fPUZpeFByaW1LZXlDb21tYW5kIHVzYWdlOiAgPHNvdXJjZUphckZpbGVQYXRoPiBbZGVzdGluYXRpb25QYXRoXQotRml4UHJpbUtleUNvbW1hbmRfdXNhZ2VfX3NfRVhDXz1JV0FFMDA1OEUgRml4UHJpbUtleUNvbW1hbmQgdXNhZ2U6IHNvdXJjZUphckZpbGVQYXRoIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBFSkIgSkFSIGZpbGUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIEVKQiBKQVIgZmlsZQotUmVwYWlyX2NvbW1hbmRfZmFpbGVkX19fZXhfRVhDXz1JV0FFMDA1OUUgUmVwYWlyIGNvbW1hbmQgZmFpbGVkIC0gZXhjZXB0aW9uIHN0YWNrIHRyYWNlOgotUmVwYWlyc19hbGxfZW50cmllc19pbl90aGU9UmVwYWlycyBhbGwgZW50cmllcyBpbiB0aGUgTUVUQS1JTkYgYW5kL29yIFdFQi1JTkYgZGlyZWN0b3JpZXMgdG8gYmUgdGhlIGNvcnJlY3QgY2FzZQotUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2U9UmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6ICA8c291cmNlSmFyRmlsZVBhdGg+IDxkZXN0aW5hdGlvblBhdGg+Ci1SZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZTFfRVJST1JfPUlXQUUwMDYwRSBSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogc291cmNlSmFyRmlsZVBhdGggbXVzdCBwb2ludCB0byBhIHZhbGlkIGFyY2hpdmUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIGFyY2hpdmUKLUFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsPUFwcGxpY2F0aW9uIENsaWVudCBKQVIgRmlsZQotRUFSX0ZpbGU9RUFSIEZpbGUKLUVKQl9KYXJfRmlsZT1FSkIgSkFSIEZpbGUKLVJBUl9GaWxlPVJBUiBGaWxlCi1XQVJfRmlsZT1XQVIgRmlsZQotRXJyb3Jfb2NjdXJyZWRfaXRlcmF0aW5nX2ZfRVhDXz1JV0FFMDA2MUUgRXJyb3Igb2NjdXJyZWQgaXRlcmF0aW5nIGZpbGVzCi1FbmRfb2ZfbGlzdF9yZWFjaGVkX0VYQ189SVdBRTAwNjJFIFJlYWNoZWQgZW5kIG9mIGxpc3QKLUludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ189SVdBRTAwNjNFIEludGVybmFsIEVycm9yOiBJdGVyYXRvciBvdXQgb2Ygc3luYyB3aXRoIHppcCBlbnRyaWVzCi1FcnJvcl9pdGVyYXRpbmdfdGhlX2FyY2hpdl9FWENfPUlXQUUwMDY0RSBFcnJvciBpdGVyYXRpbmcgdGhlIGFyY2hpdmUKLUFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfPUlXQUUwMDY1RSBBYnNvbHV0ZSBwYXRoIHVua25vd24KLU9yaWdpbmFsX2FyY2hpdmVfaXNfbm90X2FfX0VYQ189SVdBRTAwNjZFIE9yaWdpbmFsIGFyY2hpdmUgaXMgbm90IGEgZGlyZWN0b3J5Ci1OdWxsX3VyaV9FWENfPUlXQUUwMDY3RSBOdWxsIHVyaQotTW9kdWxlX2ZpbGU9TW9kdWxlIGZpbGUKLUFfV0FSX2ZpbGU9V0FSIGZpbGUKLUFuX0VKQl9KQVJfZmlsZT1FSkIgSkFSIGZpbGUKLUFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZT1BcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUKLUFfUkFSX2ZpbGU9UkFSIGZpbGUKLUFfQXBwbGljYXRpb25fZmlsZT1BcHBsaWNhdGlvbiBmaWxlCi1BX2ZpbGVfZG9lc19ub3RfZXhpc3RfZm9yX21vZHVsZT1BIGZpbGUgZG9lcyBub3QgZXhpc3QgZm9yIG1vZHVsZSBlbGVtZW50IGhhdmluZyB1cmk6IHswfQotRmlsZV9ub3RfY29ycmVjdF90eXBlPVRoZSBmaWxlIHswfSBpbiBFQVIgZmlsZSB7MX0gaXMgbm90IHRoZSBjb3JyZWN0IHR5cGUgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEV4cGVjdGVkIHR5cGU6IHsyfSI7Ci1Nb2R1bGVfbm90X2luX0VBUj1Nb2R1bGUgaXMgbm90IGluIGFuIEVBUjogezB9Ci1Nb2R1bGVfZmlsZV9kb2VzX25vdF9leGlzdF8yPU1vZHVsZSBmaWxlIGRvZXMgbm90IGV4aXN0IGZvciBNb2R1bGUgcmVmLiAgTW9kdWxlID0gezB9Ci1GaWxlSW1wbF9fRXJyb3JfMD1SZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I4NDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkNsaWVudCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5MmQyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlb3BlbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZSBleHRlbmRzIENvbnRhaW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX1dBUl9GSUxFUyA9IDEgPDwgMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfRUFSX0ZJTEVTID0gMSA8PCAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9FSkJKQVJfRklMRVMgPSAxIDw8IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FQUENMSUVOVF9GSUxFUyA9IDEgPDwgNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfQVJDSElWRVMgPSAxIDw8IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX1JBUl9GSUxFUyA9IDEgPDwgNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfQUxMID0gKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICgxIDw8IDMpIHwgKDEgPDwgNCkgfCAoMSA8PCA1KSB8ICgxIDw8IDYpOwotCi0JcHVibGljIEFyY2hpdmUgYWRkQ29weShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgRmlsZSBhZGRDb3B5KEZpbGUgYUZpbGUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0IGEgZmxhdHRlbmVkIGxpc3QgZnJvbSB0aGUgZGlyZWN0b3J5LCB0aGVuIGFkZENvcHkgdGhlIGxpc3QKLQkgKiAKLQkgKiBAdGhyb3dzIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgZmlsZSB3aXRoIGEgdXJpIHRoYXQgZXF1YWxzIG9uZSBvZiB0aGUgbmVzdGVkIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCB0aGUgY29waWVkIGZpbGVzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMaXN0IGFkZENvcHkoUmVhZE9ubHlEaXJlY3RvcnkgZGlyKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBMaXN0IGFkZENvcHlGaWxlcyhMaXN0IGxpc3RPZkZpbGVzKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKX0KLQkgKiAKLQkgKiBJZiBhbnkgb3BlbmVkIGFyY2hpdmUgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIHRoaXMgYXJjaGl2ZSBhcyBpdHMgbG9hZGluZyBjb250YWluZXIsIHJldHVybgotCSAqIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJuIHRydWUuIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86IG9wZW4gamFyIEEuIGNyZWF0ZQotCSAqIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0byBCLiBBdHRlbXB0IHRvIGNsb3NlIGphciBBIGJlZm9yZSBzYXZpbmcgamFyIEIuIFRoZW4gYXR0ZW1wdCB0bwotCSAqIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzIGJlY2F1c2UgQSBpcyBjbG9zZWQuIFRoaXMgbWV0aG9kIGFsbG93cyBjbGllbnQgY29kZSB0byB0ZXN0IGZvcgotCSAqIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzIGJlZm9yZSBzYXZpbmcgdGhlIHNvdXJjZSBhcmNoaXZlLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGUKLQkgKiBzb2x1dGlvbiBpcyB0byBlaXRoZXIgY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ2xvc2UoKTsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbG9hZCBzdHJhdGVneSBmb3IgdGhpcyBhcmNoaXZlIGFuZCBjbG9zZXMgYWxsIGNvbnRhaW5lZCBhcmNoaXZlczsgV0FSTklORzogSWYKLQkgKiBmaWxlcyBoYXZlIGJlZW4gY29waWVkIGZyb20gdGhpcyBhcmNoaXZlIHRvIGFub3RoZXIgYXJjaGl2ZSwgdGhlbiB0aGUgZGVzdGluYXRpb24gYXJjaGl2ZQotCSAqIHNob3VsZCBiZSBzYXZlZCBvciBjbG9zZWQgYmVmb3JlIHRoaXMgYXJjaGl2ZSBjYW4gYmUgc2FmZWx5IGNsb3NlZDsgdG8gdGVzdCBpZiB0aGlzIGFyY2hpdmUKLQkgKiBjYW4gc2FmZWx5IGNsb3NlIGludm9rZSB7QGxpbmsgI2NhbkNsb3NlKCl9Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGFuIGV4cGFuZGVkIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmxhZ3MgaXMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIHRoZQotCSAqIHNwZWNpZmllZCB0eXBlcyB0byBiZSBleHBhbmRlZDsgZXhhbXBsZToKLQkgKiA8Y29kZT5hbkVhckZpbGUuc2F2ZUFzRGlyZWN0b3J5KGFuRWFyRmlsZS5FWFBBTkRfV0FSX0ZJTEVTIHwgYW5FYXJGaWxlLkVYUEFORF9FSkJKQVJGSUxFUyk8L2NvZGU+OwotCSAqIAotCSAqIElmIHRoaXMgYXJjaGl2ZSB3YXMgbG9hZGVkIGZyb20gdGhlIHNhbWUgdXJpIGFzIGl0IGlzIGJlaW5nIGV4dHJhY3RlZCB0bywgdGhlIG9yaWduYWwgd2lsbCBiZQotCSAqIGRlbGV0ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdChpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIHBlcmZvcm1hbmNlLCBzYXZlIHRoZSBhcmNoaXZlIHdpdGhvdXQgcmVvcGVuaW5nOyBGdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhpcyBpbnN0YW5jZQotCSAqIHdpdGhvdXQgZmlyc3QgY2FsbGluZyB7QGxpbmsgI3Jlb3Blbn13aWxsIHlpZWxkIHVuZXhwZWN0ZWQgcmVzdWx0cy4KLQkgKiAKLQkgKiBAc2VlICNleHRyYWN0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0Tm9SZW9wZW4oaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhIGRpcmVjdG9yeSB1c2luZyB0aGUgc3BlY2lmaWVkIHVyaQotCSAqIAotCSAqIFRoZSBhcmNoaXZlIHdpbGwgbm90IGJlIHJlbmFtZWQKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAc2VlICNleHRyYWN0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG8oU3RyaW5nIHVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRBcmNoaXZlQ2xhc3NMb2FkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIEFSY2hpdmUgdGhhdCBzdGFydCB3aXRoIHRoZSBwcmVmaXgKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNCeVByZWZpeChTdHJpbmcgcHJlZml4KTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIEFyY2hpdmUgZXhjbHVkaW5nIGFueSBmaWxlIHRoYXQgc3RhcnRzIHdpdGggb25lIG9mIHRoZSBwcmVmaXhlcwotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlc1dpdGhvdXRQcmVmaXgoU3RyaW5nW10gcHJlZml4ZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJvb3QgbGV2ZWwgKG5vbi1uZXN0ZWQpIG9wZW5lZCBhcmNoaXZlcyBjb250YWluaW5nIGZpbGVzIHRoYXQgaGF2ZSB0aGlzCi0JICogYXJjaGl2ZSBhcyBpdHMgbG9hZGluZyBjb250YWluZXI7IHRoZSBzZXQgd2lsbCBiZSBlbXB0eSBpZiBubyBzdWNoIG9wZW5lZCBhcmNoaXZlIGV4aXN0cy4KLQkgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUgamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvCi0JICogQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8gc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMKLQkgKiBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IgZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMKLQkgKiBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgZW1wdHksIHRoZSBzb2x1dGlvbiBpcyB0byBlaXRoZXIKLQkgKiBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRyYUNsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmssIHNwZWNpZmljYWxseSBhcyBhbiBvcHRpbWl6YXRpb24gd2hlbiBzYXZpbmcvZXhwbG9kaW5nCi0JICogYXJjaGl2ZXMgd2l0aCBuZXN0ZWQgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVzRm9yU2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpOwotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBnZXRNYW5pZmVzdCgpOwotCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zIGdldE9wdGlvbnMoKTsKLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHdlYnNwaGVyZSBydW50aW1lIHdoZXJlIGFyY2hpdmVzIGFyZSBvbiBkaXNrIChub3QgbmVzdGVkIGluIGphcnMpCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGFic29sdXRlIHBhdGhzIHRoYXQgcmVwcmVzZW50cyB0aGlzIGFyY2hpdmUgb25seSwgYW5kIGluIHRoZSBjYXNlIG9mCi0JICogICAgICAgICBXQVJGaWxlcywgdGhlIG5lc3RlZCBsb2FkYWJsZSBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKSB0byBnZXQgdGhlCi0JICogcmVjdXJzaXZlIGJlaGF2aW9yLCB0aGUgQXJjaGl2ZSBtdXN0IGJlbG9uZyB0byBhbiBFQVIgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhpcyBhcmNoaXZlLCBhbGwgaXQncyBwcmVyZXFzLCByZWN1cnNpdmUuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldEZ1bGxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKSB0byBnZXQgdGhlCi0JICogcmVjdXJzaXZlIGJlaGF2aW9yLCB0aGUgQXJjaGl2ZSBtdXN0IGJlbG9uZyB0byBhbiBFQVIgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIEFyY2hpdmUsIGFsbCBpdCdzCi0JICogICAgICAgICBwcmVyZXFzLCByZWN1cnNpdmUuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIG1ldGEgcmVzb3VyY2VzIGdldCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcHJvcGVydGllcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwdWJsaWMgU2F2ZUZpbHRlciBnZXRTYXZlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IGdldFNhdmVTdHJhdGVneSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRYbWxFbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBBcmNoaXZlIGhhcwotCSAqIAotCSAqIEBvdGhlciBvbiBpdCdzIGNsYXNzcGF0aCwgZWl0aGVyIGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseQotCSAqIEBwYXJhbSBBcmNoaXZlCi0JICogICAgICAgICAgICBvdGhlciAtIGFub3RoZXIgYXJjaGl2ZSBpbiB0aGUgc2FtZSBFQVIgZmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyKTsKLQotCS8qKgotCSAqIEludGVybmFsIEFQSTsgVXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSl9Ci0JICogCi0JICogQHBhcmFtIEFyY2hpdmUKLQkgKiAgICAgICAgICAgIG90aGVyIC0gYW5vdGhlciBhcmNoaXZlIGluIHRoZSBzYW1lIEVBUiBmaWxlCi0JICogQHBhcmFtIFNldAotCSAqICAgICAgICAgICAgdmlzaXRlZCAtIHRoZSBzZXQgb2YgYXJjaGl2ZXMgYWxyZWFkeSB2aXNpdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUgb3RoZXIsIFNldCB2aXNpdGVkLCBFQVJGaWxlIGVhcik7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgdGhlIGFyY2hpdmUgaGFzIGJlZW4gb3BlbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgbG9hZCBzdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCi0JLyoqCi0JICogQW4gaXRlbSBpcyBjb25zaWRlcmVkIGEgZHVwbGljYXRlIGlmIHRoZSBhcmNoaXZlIGNvbnRhaW5zIGEgZmlsZSBvciBsb2FkZWQgbW9mIHJlc291cmNlIHdpdGgKLQkgKiB0aGUgdXJpLCBvciBpZiB0aGUgdXJpIGlzIGVxdWFsIHRvIHRoZSBtYW5pZmVzdCB1cmkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFVzZWQgYXMgYW4gb3B0aW1pemF0aW9uIGF0IGNvcHkgdGltZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFuaWZlc3RTZXQoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGRpc3BhdGNoIGJldHdlZW4gdGhlIGFyY2hpdmUgYW5kIHRoZSBsb2FkIHN0cmF0ZWd5IHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUKLQkgKiBsaXN0OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHN0aWxsIG9wZW5lZCBmb3IgcmVhZDsgaWYgbm90LCBJT0V4Y2VwdGlvbnMgY291bGQgYmUgdGhyb3duCi0JICogb24gYXR0ZW1wdHMgdG8gZ2V0IGlucHV0IHN0cmVhbXMgb24gZmlsZSBlbnRyaWVzLiByZW9wZW4oKSB3aWxsIGNhdXNlIHRoaXMgYXJjaGl2ZSBhbmQgaXRzCi0JICogbmVzdGVkIGFyY2hpdmVzIHRvIHJlYnVpbGQgdGhlaXIgbG9hZCBzdHJhdGVnaWVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9mIHJlc291cmNlIGFuZCBhZGQgaXQgdG8gdGhlIHJlc291cmNlIHNldCBvZiB0aGUgY29udGV4dCBvZiB0aGlzIGFyY2hpdmU7IGFsbAotCSAqIHJlc291cmNlcyBpbiBtZW1vcnkgYXJlIHNhdmVkIHdoZW4gdGhlIGFyY2hpdmUgaXMgc2F2ZWQKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhcmNoaXZlIGhhdmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vZiByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBhcmNoaXZlOyBhbGwKLQkgKiByZXNvdXJjZXMgaW4gbWVtb3J5IGFyZSBzYXZlZCB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGRpc3BhdGNoIGJldHdlZW4gdGhlIGFyY2hpdmUgYW5kIHRoZSBsb2FkIHN0cmF0ZWd5IHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUKLQkgKiBsaXN0OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXh0cmEgY2xhc3MgcGF0aCB3aXRoIG5vIHJlZnJlc2ggb2YgdGhlIGNsYXNzIGxvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZShGaWxlIGFGaWxlKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgInJlLXN5bmNpbmciIGFuIGFyY2hpdmUgYWZ0ZXIgc2F2ZTsgY2xpZW50cyBub3JtYWxseSBzaG91bGQgbm90IG5lZWQgdGhpcwotCSAqIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbigpIHRocm93cyBSZW9wZW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlb3BlbmluZyBuZXN0ZWQgYXJjaGl2ZXM7IGNsaWVudHMgbm9ybWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgYXMgYSBqYXIgZmlsZSB3aXRoIHRoZSB1cmkgb2YgdGhlIGFyY2hpdmU7Ci0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICogCi0JICogQHRocm93cyBSZW9wZW5FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHJlLXN5bmNpbmcgdGhlIGFyY2hpdmUgdG8gdGhlIG5ld2x5IHNhdmVkCi0JICogICAgICAgICAgICAgZGVzdGluYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSB1c2luZyB0aGUgc2F2ZSBzdHJhdGVneSBzcGVjaWZpZWQKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFNhdmVTdHJhdGVneSBhU3RyYXRlZ3kpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGEgamFyIGZpbGUgdXNpbmcgdXJpIHByb3ZpZGVkOyBJZiB0aGUgdXJpIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBVUkkgb2YKLQkgKiB0aGlzIGFyY2hpdmUsIHRoZSB1cmkgb2YgdGhpcyBhcmNoaXZlIHdpbGwgY2hhbmdlIHRvIHRoZSBuZXcgdXJpIChmb3IgcmVvcGVuKQotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyB1cmkpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIHBlcmZvcm1hbmNlLCBzYXZlIHRoZSBhcmNoaXZlIHdpdGhvdXQgcmVvcGVuaW5nOyBGdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhpcyBpbnN0YW5jZQotCSAqIHdpdGhvdXQgZmlyc3QgY2FsbGluZyB7QGxpbmsgI3Jlb3Blbn13aWxsIHlpZWxkIHVuZXhwZWN0ZWQgcmVzdWx0cy4KLQkgKiAKLQkgKiBAc2VlICNzYXZlQXMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBc05vUmVvcGVuKFN0cmluZyB1cmkpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU5vUmVvcGVuKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZUNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlQ2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld0FyY2hpdmVDbGFzc0xvYWRlcik7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzcGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpOwotCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoQXJjaGl2ZU1hbmlmZXN0IG5ld01hbmlmZXN0KTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KGphdmEudXRpbC5qYXIuTWFuaWZlc3QgYU1hbmlmZXN0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIENsYXNzLXBhdGggbWFuaWZlc3QgZW50cnksIHJlYnVpbGRzIHRoZSBjbGFzcyBsb2FkZXIsIGFuZCByZWZyZXNoZXMgYW55IHJlZmxlY3RlZAotCSAqIGphdmEgY2xhc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0Q2xhc3NQYXRoQW5kUmVmcmVzaChTdHJpbmcgY2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBuZXdPcHRpb25zKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUZpbHRlcihTYXZlRmlsdGVyIGFGaWx0ZXIpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2F2ZVN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgbmV3U2F2ZVN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1htbEVuY29kaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sRW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdYbWxFbmNvZGluZyk7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hldGhlciBqYXZhIHJlZmxlY3Rpb24gc2hvdWxkIGJlIHNldCB1cCBmb3IgdGhpcyBhcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZQotCSAqIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuQ29tbW9uYXJjaGl2ZVBhY2thZ2UjZ2V0QXJjaGl2ZV9UeXBlcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFR5cGVzKCk7Ci0KLQlib29sZWFuIGlzVHlwZShTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhNzYzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkaXNjcmltaW5hdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGN1c3RvbVR5cGVzID0gbnVsbDsKLQotCS8qCi0JICogTW9zdCBrbm93biB0eXBlcyBhcmUgb2YgbGVuZ3RoIDMuIFdoZW52ZXIgYSBuZXcgdHlwZSBpcyBhZGRlZCB0aGF0IGlzIG5vdCBvZiBsZW5ndGggMywKLQkgKiBtb2RpZmljYXRpb25zIG1heSBiZSBuZWNlc3NhcnkgdG8gdGhlICdpc0tub3duQXJjaGl2ZVR5cGUoKSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZWZhdWx0S25vd25UeXBlcyA9IG5ldyBTdHJpbmdbXXsiZWFyIiwgIndhciIsICJqYXIiLCAiemlwIiwgImZhciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSgpOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdG9yRGlzY3JpbWluYXRvcihHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3IpIHsKLQkJSU5TVEFOQ0UuZ2V0RGlzY3JpbWluYXRvcnMoKS5hZGQoZGlzY3JpbWluYXRvcik7Ci0JCUlOU1RBTkNFLmFkZEtub3duQXJjaGl2ZVR5cGVzKGRpc2NyaW1pbmF0b3IuZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXREaXNjcmltaW5hdG9ycygpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3JzID09IG51bGwpCi0JCQlkaXNjcmltaW5hdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUeXBlcyhBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3JzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZGlzY3JpbWluYXRvcnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCWRpc2NyaW1pbmF0b3IgPSAoR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvcikgaXRyLm5leHQoKTsKLQkJCWlmIChkaXNjcmltaW5hdG9yLmRpc2NyaW1pbmF0ZShhcmNoaXZlKSkKLQkJCQlhcmNoaXZlLmdldFR5cGVzKCkuYWRkKGRpc2NyaW1pbmF0b3IuZ2V0VHlwZUtleSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEtub3duQXJjaGl2ZVR5cGVzKFN0cmluZ1tdIG5ld1R5cGVzKSB7Ci0JCWlmIChjdXN0b21UeXBlcyA9PSBudWxsKSB7Ci0JCQljdXN0b21UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljdXN0b21UeXBlcy5hZGQobmV3VHlwZXNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNLbm93bkFyY2hpdmVUeXBlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCWlmIChmaWxlVVJJID09IG51bGwgfHwgZmlsZVVSSS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBsb3dlckNhc2VVcmkgPSBmaWxlVVJJLnRvTG93ZXJDYXNlKCk7Ci0JCS8qCi0JCSAqIEVuc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIFVSSSBpcyBsb25nIGVub3VnaCB0byBjb250YWluIGEgLjMgc3R5bGUgZXh0ZW5zaW9uCi0JCSAqLwotCQlpZiAobG93ZXJDYXNlVXJpLmxlbmd0aCgpID4gNCAmJiBsb3dlckNhc2VVcmkuY2hhckF0KGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSAtIDQpID09ICcuJykgewotCQkJU3RyaW5nIGVuZGluZyA9IGxvd2VyQ2FzZVVyaS5zdWJzdHJpbmcobG93ZXJDYXNlVXJpLmxlbmd0aCgpIC0gMyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRLbm93blR5cGVzLmxlbmd0aDsgaSsrKQotCQkJCWlmIChkZWZhdWx0S25vd25UeXBlc1tpXS5lcXVhbHMoZW5kaW5nKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgY3VzdG9tVHlwZSA9IG51bGw7Ci0JCWlmIChjdXN0b21UeXBlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBjdXN0b21UeXBlc0l0ZXJhdG9yID0gY3VzdG9tVHlwZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChjdXN0b21UeXBlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWN1c3RvbVR5cGUgPSAoU3RyaW5nKSBjdXN0b21UeXBlc0l0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZmlsZVVSSS5lbmRzV2l0aChjdXN0b21UeXBlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NsaWVudE1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY3MTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NsaWVudE1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudE1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0JQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci19IC8vQ2xpZW50TW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzA4MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkgewotCi0JcHVibGljIHN0YXRpYyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkoKTsKLQotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlRmFjdG9yeSBjb21tb25BcmNoaXZlRmFjdG9yeSA9ICgoQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsKSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSkuZ2V0RGVsZWdhdGUoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gY29tbW9uQXJjaGl2ZUZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSkgewotCQljb21tb25BcmNoaXZlRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjk2MjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiY29tbW9uYXJjaGl2ZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RfYV9kaXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlSW1wbF9fRXJyb3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZTFfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVfZXhpc3RfYXNfZGlyX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlX2VudHJ5X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyX25vdF9kZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJBUl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVuYW1lX2V4Y2VwdGlvbl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub19zZWNfcm9sZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yaWdpbmFsX2FyY2hpdmVfaXNfbm90X2FfX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlX21vZHVsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRpbmdfZGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVfZmlsZV9kb2VzX25vdF9leGlzdF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfV0FSX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU9FeGNlcHRpb25fb2NjdXJyZWRfd2hpbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19leF9tYW5pZmVzdF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19zX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRml4UHJpbUtleUNvbW1hbmRfdXNhZ2VfX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYW1ldGVyX3Nob3VsZF9ub3RfYmVfbnVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZF9pbl9lYXJfbG9hZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vX2Rkc18xMF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpc3RfY29tcG9uZW50c193YXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9FSkJfSkFSX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3Blbl9uZXN0ZWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBhaXJfY29tbWFuZF9mYWlsZWRfX19leF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZF9vcGVuX2ZhaWxfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9pdGVyYXRpbmdfdGhlX2FyY2hpdl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VfdGVtcF9maWxlX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdfY2xhc3NfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBhaXJfdXNhZ2VfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkX25vdF9maW5kX2Rpcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRfY29weV9saWJfZGlyX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3Zpbmdfa2V5X2ZpZWxkX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZHVsZV9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHhfYmVhbl9tZ2RfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFuaWZlc3RfZGRfbG9hZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGtleV9jbGFzc19yZWZsZWN0aW9uX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmNvbnRhaW5lZF9tb2R1bGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlX25vdF9mb3VuZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2V4X3JlYWRpbmdfZGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkX2NwX2ZpbGVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZF9hcmNoaXZlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZF9yZXNvdXJjZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRfY2xhc3NwYXRoX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dHJhY3RfZGVzdGluYXRpb25faXNfdGhlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3ViY2xhc3NfcmVzcG9uc2liaWx0eV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZHVsZV9ub3RfaW5fRUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVfbm90X2NvcnJlY3RfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19leF9sb2FkaW5nX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGRfbm90X29wZW5fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYW5pZmVzdF9kZF9maW5kX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkX2phcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cF9yZXNvdXJjZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlcGFpcnNfYWxsX2VudHJpZXNfaW5fdGhlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2V4X3Jlb3Blbl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29jY3VycmVkX2l0ZXJhdGluZ19mX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwX3NlY19yb2xlX21vZHVsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZV9maWxlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5mZXJyZWRfZGRzX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5hYmxlX3JlcGxhY2VfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJfSmFyX0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQV9maWxlX2RvZXNfbm90X2V4aXN0X2Zvcl9tb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQV9SQVJfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBfc2VjX3JvbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVGhlX2ZvbGxvd2luZ19maWxlc19jb3VsZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGtleV9maWVsZF9yZWZsZWN0aW9uX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfb2ZfbGlzdF9yZWFjaGVkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3Jfc2F2aW5nX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZV9pc19ub3RfYV92YWxpZF9FSkJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlX3RlbXBfZGlyX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRml4UHJpbUtleUNvbW1hbmRfZmFpbGVkX19fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBX0FwcGxpY2F0aW9uX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTnVsbF91cmlfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbF9FcnJvcl9fSXRlcmF0b3Jfb19FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDU0MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25hcmNoaXZlRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRlbGwgdGhlIGZhY3RvcnkgdGhhdCBhbiBhcmNoaXZlIGhhcyBiZWVuIG9wZW5lZDsgdGhlIGZhY3RvcnkgbWFpbnRhaW5zIGEgd2VhayBzZXQgb2YgYWxsIHRoZQotCSAqIG9wZW4gYXJjaGl2ZXMgdG8gZGV0ZXJtaW5lIGlmIGFub3RoZXIgYXJjaGl2ZSBjYW4gYmUgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFyY2hpdmVDbG9zZWQoQXJjaGl2ZSBhQ2xvc2VkQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBmYWN0b3J5IHRoYXQgYW4gYXJjaGl2ZSBoYXMgYmVlbiBvcGVuZWQ7IHRoZSBmYWN0b3J5IG1haW50YWlucyBhIHdlYWsgc2V0IG9mIGFsbCB0aGUKLQkgKiBvcGVuIGFyY2hpdmVzIHRvIGRldGVybWluZSBpZiBhbm90aGVyIGFyY2hpdmUgY2FuIGJlIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcmNoaXZlT3BlbmVkKEFyY2hpdmUgYW5PcGVuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihBcmNoaXZlKX0KLQkgKiAKLQkgKiBJZiBhbnkgb3BlbmVkIGFyY2hpdmUgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIHRoZSBwYXJhbWV0ZXIgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyLCByZXR1cm4KLQkgKiBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybiB0cnVlLiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUKLQkgKiBqYXIgQi4gQ29weSBmaWxlcyBmcm9tIEEgdG8gQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8KLQkgKiBzYXZlIEIsIGFuZCB0aGUgc2F2ZSBmYWlscyBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IKLQkgKiBkZXBlbmRlbnQgb3BlbiBhcmNoaXZlcyBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlCi0JICogc29sdXRpb24gaXMgdG8gZWl0aGVyIGNsb3NlIG9yIHNhdmUgQiBiZWZvcmUgY2xvc2luZyBBLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCS8qKgotCSAqIENsb3NlIGFueSBvcGVuIGFyY2hpdmVzIGFuZCBkZWxldGUgdGhlIHRlbXAgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIG5lc3RlZCBhcmNoaXZlcy4gRHVlIHRvCi0JICogbGltaXRhdGlvbnMgaW4gdGhlIGRlbGV0ZU9uRXhpdCgpIG1ldGhvZCBvZiBmaWxlLCBpbiAxLjIuMiB0aGVyZSBpcyBubyB3YXkgdG8gZW5zdXJlIHRoZXNlCi0JICogZmlsZXMgZ2V0IGRlbGV0ZWQuIENsaWVudCBjb2RlIHNob3VsZCB1c2UgZ29vZCBwcmFjdGljZSBieSBjYWxsaW5nIHtAbGluayBBcmNoaXZlI2Nsb3NlfXdoZW4KLQkgKiBmaW5pc2hlZCB3aXRoIGFuIEFyY2hpdmUgaW5zdGFuY2UsIHJhdGhlciB0aGFuIGp1c3QgZGlzY2FyZCBhbiBpbnN0YW5jZSB3aXRoIG9wZW4gZmlsZQotCSAqIGhhbmRsZXMgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGdjJ2QuIEJleW9uZCB0aGF0LCBwcm9ncmFtIGNvZGUgY29tcGlsZWQgZm9yIDEuMyBjYW4gKGFuZAotCSAqIHNob3VsZCkgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgc2h1dGRvd24gaG9vazogPGNvZGU+Ci0JICogCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKCkgewotCSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICgoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkuY2xvc2VPcGVuQXJjaGl2ZXMoKTsKLQkgfQotCSB9KTs8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2VPcGVuQXJjaGl2ZXMoKTsKLQotCXB1YmxpYyBBcmNoaXZlIGNvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JcHVibGljIE1vZHVsZUZpbGUgY29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkgKGFkZHMgYW4gZW1wdHkgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVBcmNoaXZlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgdXN1YWxseSBzaG91bGQgbm90IG5lZWQgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkgKGFkZHMgYW4gZW1wdHkgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIEVBUkZpbGUgY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZvciBlZGl0aW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgYXBwcm9wcmlhdGVseSAoYWRkcyBhbiBlbXB0eSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gVVJJIGFuZCBvcHRpb25zCi0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbml0aWFsaXplZCBFQVIgYmFzZWQgb24gdGhlIGdpdmVuIFVSSSBhbmQgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgRUpCIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkkgYW5kIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFQVJGaWxlKEVBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUpCSmFyRmlsZShFSkJKYXJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoTW9kdWxlRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdSQVJGaWxlKFJBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3V0FSRmlsZShXQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTnVsbExvYWRTdHJhdGVneUltcGw7IHVzZWQgZm9yIG5ldyBhcmNoaXZlcwotCSAqLwotCUxvYWRTdHJhdGVneSBjcmVhdGVFbXB0eUxvYWRTdHJhdGVneSgpOwotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBkeW5hbWljYWxseSBidWlsZCBhIGxvYWQgc3RyYXRlZ3kgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIERldGVybWluZXMgd2hldGhlcgotCSAqIHRoZSB1cmkgcG9pbnRzIHRvIGEgamFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkgKGFkZHMgYW4gZW1wdHkgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBpbnRyb3NwZWN0IGFuIGFyY2hpdmUgYW5kIGdldCBpdCdzIGNsYXNzIHBhdGggZW50cmllcyBiZWZvcmUgZnVsbHkgb3BlbmluZwotCSAqIHRoZSBhcmNoaXZlOyBuZWVkZWQgYmVjYXVzZSB3ZSBtYXkgbmVlZCBleHRyYSBjbGFzc3BhdGggaW5mbyB0byBiZSBhYmxlIHRvIG9wZW4gdGhlIDEuMCBmaWxlCi0JICogYW5kIGRlc2VyaWFsaXplIGl0cyBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIGEgdG9rZW5pemVkIGFycmF5IG9mIGNsYXNzIHBhdGggY29tcG9uZW50cwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzUGF0aFZhbHVlcyhTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCByb290IGxldmVsIChub24tbmVzdGVkKSBvcGVuZWQgYXJjaGl2ZXMgY29udGFpbmluZyBmaWxlcyB0aGF0IGhhdmUgdGhlCi0JICogcGFyYW1ldGVyIGFzIGl0cyBsb2FkaW5nIGNvbnRhaW5lcjsgdGhlIHNldCB3aWxsIGJlIGVtcHR5IGlmIG5vIHN1Y2ggb3BlbmVkIGFyY2hpdmUgZXhpc3RzLgotCSAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86IG9wZW4gamFyIEEuIGNyZWF0ZSBqYXIgQi4gQ29weSBmaWxlcyBmcm9tIEEgdG8KLQkgKiBCLiBBdHRlbXB0IHRvIGNsb3NlIGphciBBIGJlZm9yZSBzYXZpbmcgamFyIEIuIFRoZW4gYXR0ZW1wdCB0byBzYXZlIEIsIGFuZCB0aGUgc2F2ZSBmYWlscwotCSAqIGJlY2F1c2UgQSBpcyBjbG9zZWQuIFRoaXMgbWV0aG9kIGFsbG93cyBjbGllbnQgY29kZSB0byB0ZXN0IGZvciBkZXBlbmRlbnQgb3BlbiBhcmNoaXZlcwotCSAqIGJlZm9yZSBzYXZpbmcgdGhlIHNvdXJjZSBhcmNoaXZlLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBlbXB0eSwgdGhlIHNvbHV0aW9uIGlzIHRvIGVpdGhlcgotCSAqIGNsb3NlIG9yIHNhdmUgQiBiZWZvcmUgY2xvc2luZyBBLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlIGJ5IHRoZSBwYXNzZWQgdXJpCi0JICogCi0JICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUga2luZCBvZiBhcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIHVyaSwgYW5kIHVzZSB0aGUgZXh0cmFDbGFzc1BhdGggZm9yIGphdmEgcmVmbGVjdGlvbiwgaW4KLQkgKiBhZGRpdGlvbiB0byB0aGUgbWFuaWZlc3QgY2xhc3MtcGF0aDsgbW9zdGx5IHVzZWQgZm9yIGVqYiAxLjAgamFyIGZpbGVzIHRvIGJlIGNvbnZlcnRlZAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGtpbmQgb2YgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIG9wZW5uaW5nIGFuIEFyY2hpdmUgaW4gYW4gQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyB1cmksIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIG9wZW5uaW5nIGFuIEFyY2hpdmUgaW4gYW4gQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5IG9wZW5SZWFkT25seURpcmVjdG9yeShTdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBhcmNoaXZlIGJ5IHRoZSBwYXNzZWQgcGFyYW1ldGVyLCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCBvZgotCSAqIGFyY2hpdmUgaXQgaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIEFyY2hpdmUsIGJ1dCBub3QgYSBzdWJjbGFzcwotCSAqLwotCUFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCUFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gV0FSRmlsZSB2YWx1ZQotCSAqLwotCVdBUkZpbGUgY3JlYXRlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQkphckZpbGUgdmFsdWUKLQkgKi8KLQlFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudEZpbGUgdmFsdWUKLQkgKi8KLQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUFSRmlsZSB2YWx1ZQotCSAqLwotCUVBUkZpbGUgY3JlYXRlRUFSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFJBUkZpbGUgdmFsdWUKLQkgKi8KLQlSQVJGaWxlIGNyZWF0ZVJBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBBcmNoaXZlIHZhbHVlCi0JICovCi0JQXJjaGl2ZSBjcmVhdGVBcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRmlsZSB2YWx1ZQotCSAqLwotCUZpbGUgY3JlYXRlRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFJlYWRPbmx5RGlyZWN0b3J5IHZhbHVlCi0JICovCi0JUmVhZE9ubHlEaXJlY3RvcnkgY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNvbW1vbmFyY2hpdmVQYWNrYWdlIGdldENvbW1vbmFyY2hpdmVQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUpCTW9kdWxlUmVmIHZhbHVlCi0JICovCi0JRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQ29udmllbmluY2UgbWV0aG9kIGZvciB3cmFwcGluZyBhIHN0YW5kYWxvbmUgRUpCIEpBUiBmaWxlCi0JICovCi0JRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZihFSkJKYXJGaWxlIGVqYkphckZpbGUpOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gV2ViTW9kdWxlUmVmIHZhbHVlCi0JICovCi0JV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQ29udmllbmluY2UgbWV0aG9kIGZvciB3cmFwcGluZyBhIHN0YW5kYWxvbmUgV0FSIGZpbGUKLQkgKi8KLQlXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKFdBUkZpbGUgd2FyRmlsZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ2xpZW50TW9kdWxlUmVmIHZhbHVlCi0JICovCi0JQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQ29udmllbmluY2UgbWV0aG9kIGZvciB3cmFwcGluZyBhIHN0YW5kYWxvbmUgQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlCi0JICovCi0JQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZihBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2xpZW50RmlsZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlUmVmIHZhbHVlCi0JICovCi0JQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQ29udmllbmluY2UgbWV0aG9kIGZvciB3cmFwcGluZyBhIHN0YW5kYWxvbmUgUkFSIGZpbGUKLQkgKi8KLQlDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKFJBUkZpbGUgcmFyRmlsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIENvbW1vbmFyY2hpdmVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25hcmNoaXZlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY29tbW9uYXJjaGl2ZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRSA9IDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX1JFRiA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRiA9IDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRiA9IDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRiA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRiA9IDE0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEUgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRSA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fVVJJID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0xBU1RfTU9ESUZJRUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fU0laRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFX19PUklHSU5BTF9VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fQ09OVEFJTkVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX1VSSSA9IEZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19MQVNUX01PRElGSUVEID0gRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19TSVpFID0gRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlkgPSBGSUxFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19PUklHSU5BTF9VUkkgPSBGSUxFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVIgPSBGSUxFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19DT05UQUlORVIgPSBGSUxFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19GSUxFUyA9IEZJTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19VUkkgPSBDT05UQUlORVJfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fTEFTVF9NT0RJRklFRCA9IENPTlRBSU5FUl9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fU0laRSA9IENPTlRBSU5FUl9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJDSElWRV9fRElSRUNUT1JZX0VOVFJZID0gQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fT1JJR0lOQUxfVVJJID0gQ09OVEFJTkVSX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSID0gQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fQ09OVEFJTkVSID0gQ09OVEFJTkVSX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fRklMRVMgPSBDT05UQUlORVJfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJDSElWRV9fVFlQRVMgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFyY2hpdmU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSQ0hJVkVfRkVBVFVSRV9DT1VOVCA9IENPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fVVJJID0gQVJDSElWRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRCA9IEFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19TSVpFID0gQVJDSElWRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IEFSQ0hJVkVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJID0gQVJDSElWRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBBUkNISVZFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUiA9IEFSQ0hJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fRklMRVMgPSBBUkNISVZFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19UWVBFUyA9IEFSQ0hJVkVfX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Nb2R1bGUgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IEFSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQgPSBNT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX09SSUdJTkFMX1VSSSA9IE1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0ZJTEVTID0gTU9EVUxFX0ZJTEVfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIEphciBGaWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQVJfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0FSIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fVVJJID0gTU9EVUxFX0ZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQgPSBNT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX1NJWkUgPSBNT0RVTEVfRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IE1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX09SSUdJTkFMX1VSSSA9IE1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0ZJTEVTID0gTU9EVUxFX0ZJTEVfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX1RZUEVTID0gTU9EVUxFX0ZJTEVfX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19NT0RVTEVfUkVGUyA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FQVIgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUFSX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUlkgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19VUkkgPSBDT05UQUlORVJfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fTEFTVF9NT0RJRklFRCA9IENPTlRBSU5FUl9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRSA9IENPTlRBSU5FUl9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fRElSRUNUT1JZX0VOVFJZID0gQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fT1JJR0lOQUxfVVJJID0gQ09OVEFJTkVSX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSID0gQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSID0gQ09OVEFJTkVSX19DT05UQUlORVI7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19GSUxFUyA9IENPTlRBSU5FUl9fRklMRVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZWFkIE9ubHkgRGlyZWN0b3J5PC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SQVIgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFSX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX0VBUl9GSUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX1JFRl9fTU9EVUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FSkIgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX19FQVJfRklMRSA9IE1PRFVMRV9SRUZfX0VBUl9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX19NT0RVTEUgPSBNT0RVTEVfUkVGX19NT0RVTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlYiBNb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBNT0RVTEVfUkVGX19NT0RVTEVfRklMRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFID0gTU9EVUxFX1JFRl9fRUFSX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRSA9IE1PRFVMRV9SRUZfX01PRFVMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q2xpZW50IE1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMSUVOVF9NT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db25uZWN0b3IgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb25hcmNoaXZlLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25hcmNoaXZlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ29udGFpbmVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyX0ZpbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gV0FSRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTW9kdWxlRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFQVJGaWxlX01vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfRWFyRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWYjZ2V0TW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWYjZ2V0TW9kdWxlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQk1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdlYk1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ2xpZW50TW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDbGllbnRNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDb25uZWN0b3JNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQkphckZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQkphckZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFJBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJBUkZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZSNnZXREZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGUjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBzZWUgI2dldFJBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBBcmNoaXZlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSNnZXRUeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UeXBlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkFyY2hpdmUjZ2V0VHlwZXMoKQotCSAqIEBzZWUgI2dldEFyY2hpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyY2hpdmVfVHlwZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfVVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfTGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI2dldEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfRGlyZWN0b3J5RW50cnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9PcmlnaW5hbFVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsZV9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSZWFkT25seURpcmVjdG9yeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkZpbGVJbXBsIDxlbT5GaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5GaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMRSA9IGVJTlNUQU5DRS5nZXRGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxFX19VUkkgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9VUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhc3QgTW9kaWZpZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxFX19MQVNUX01PRElGSUVEID0gZUlOU1RBTkNFLmdldEZpbGVfTGFzdE1vZGlmaWVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRV9fU0laRSA9IGVJTlNUQU5DRS5nZXRGaWxlX1NpemUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IGVJTlNUQU5DRS5nZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxFX19PUklHSU5BTF9VUkkgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9PcmlnaW5hbFVSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZGluZyBDb250YWluZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxFX19DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9Db250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQXJjaGl2ZUltcGwgPGVtPkFyY2hpdmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkFyY2hpdmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0QXJjaGl2ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUkNISVZFID0gZUlOU1RBTkNFLmdldEFyY2hpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUkNISVZFX19UWVBFUyA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlX1R5cGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVKQkphckZpbGVJbXBsIDxlbT5FSkIgSmFyIEZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVKQkphckZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0RUpCSmFyRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfSkFSX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5XQVJGaWxlSW1wbCA8ZW0+V0FSIEZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLldBUkZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0V0FSRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXQVJfRklMRSA9IGVJTlNUQU5DRS5nZXRXQVJGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFdBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRUFSRmlsZUltcGwgPGVtPkVBUiBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5FQVJGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEVBUkZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUFSX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0RUFSRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVBUl9GSUxFX19NT0RVTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRFQVJGaWxlX01vZHVsZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsIDxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUFBMSUNBVElPTl9DTElFTlRfRklMRSA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZUZpbGVJbXBsIDxlbT5Nb2R1bGUgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuTW9kdWxlRmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRNb2R1bGVGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1PRFVMRV9GSUxFID0gZUlOU1RBTkNFLmdldE1vZHVsZUZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29udGFpbmVySW1wbCA8ZW0+Q29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db250YWluZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0Q29udGFpbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfX0ZJTEVTID0gZUlOU1RBTkNFLmdldENvbnRhaW5lcl9GaWxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5SZWFkT25seURpcmVjdG9yeUltcGwgPGVtPlJlYWQgT25seSBEaXJlY3Rvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLlJlYWRPbmx5RGlyZWN0b3J5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldFJlYWRPbmx5RGlyZWN0b3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFQURfT05MWV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuUkFSRmlsZUltcGwgPGVtPlJBUiBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5SQVJGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldFJBUkZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkFSX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0UkFSRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVJlZkltcGwgPGVtPk1vZHVsZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRNb2R1bGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTU9EVUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBGaWxlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVhciBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1PRFVMRV9SRUZfX0VBUl9GSUxFID0gZUlOU1RBTkNFLmdldE1vZHVsZVJlZl9FYXJGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNT0RVTEVfUkVGX19NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlUmVmX01vZHVsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5FSkJNb2R1bGVSZWZJbXBsIDxlbT5FSkIgTW9kdWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRUpCTW9kdWxlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEVKQk1vZHVsZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfTU9EVUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRFSkJNb2R1bGVSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV2ViTW9kdWxlUmVmSW1wbCA8ZW0+V2ViIE1vZHVsZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLldlYk1vZHVsZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRXZWJNb2R1bGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX01PRFVMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0V2ViTW9kdWxlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNsaWVudE1vZHVsZVJlZkltcGwgPGVtPkNsaWVudCBNb2R1bGUgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5DbGllbnRNb2R1bGVSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0Q2xpZW50TW9kdWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENMSUVOVF9NT0RVTEVfUkVGID0gZUlOU1RBTkNFLmdldENsaWVudE1vZHVsZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JNb2R1bGVSZWZJbXBsIDxlbT5Db25uZWN0b3IgTW9kdWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29ubmVjdG9yTW9kdWxlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldENvbm5lY3Rvck1vZHVsZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05ORUNUT1JfTU9EVUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQotCX0KLQotfSAvL0NvbW1vbmFyY2hpdmVQYWNrYWdlCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0Nvbm5lY3Rvck1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQwMjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0Nvbm5lY3Rvck1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCUNvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLX0gLy9Db25uZWN0b3JNb2R1bGVSZWYKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTMzNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXIgZXh0ZW5kcyBGaWxlIHsKLQotCS8qKgotCSAqIEluZGljYXRlIHdoZXRoZXIgdGhlIGFyY2hpdmUgY29udGFpbnMgYSBmaWxlIGhhdmluZyBhIHJlbGF0aXZlIHBhdGggb2YgdGhlIHBhcmFtZXRlcjsgdGhlIHVyaQotCSAqIG1heSBvciBtYXkgbm90IGhhdmUgYSBsZWFkaW5nIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIGl0cyBsb2FkIHN0cmF0ZWd5LCBpZiBpdCBpcyBrbm93bi4gU2hvdWxkIGJlIHVzZWQKLQkgKiBtYWlubHkgZm9yIHJlYWQtb25seSBydW50aW1lIHB1cnBvc2VzLCBhcyBlZGl0LXRpbWUgbW9kaWZpY2F0aW9ucyBtYXkgbWFrZSB0aGUgcmVzdWx0Ci0JICogdW5kZWZpbmVkLgotCSAqIAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGFyY2hpdmUgaXMgInZpcnR1YWwiLCBlZywgYSBuZXN0ZWQgamFyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRMb2FkU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGhhcyBldmVyIGhhZCBpdHMgZmlsZXMgZW51bWVyYXRlZDsgdXNlZCBhcyBhbiBvcHRpbWl6YXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKTsKLQotCS8qKgotCSAqIEdvZXMgZGlyZWN0bHkgdG8gdGhlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIElucHV0U3RyZWFtIHByaW1HZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHJlYnVpbGRGaWxlSW5kZXgoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0xvYWRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld0xvYWRTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmlsZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhpcyBDb250YWluZXIgYW5kIGRyb3BzIHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyRmlsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VBUkZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VBUkZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNzU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVBUkZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIE1ha2VzIGEgY29weSBvZgotCSAqIAotCSAqIEBhTW9kdWxlRmlsZSwgdXNpbmcgaXRzIGxvY2FsIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgY3JlYXRlcyBhIG5ldyBNb2R1bGUgYW5kIGFkZHMgaXQgdG8gdGhlCi0JICogICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgdGhpcyBFQVIgZmlsZSBhbmQgYWRkcyB0aGUgY29weSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgdG8gdGhpcyBFQVIuCi0JICogCi0JICogQHJldHVybiBUaGUgY29waWVkIG1vZHVsZSBmaWxlCi0JICogCi0JICogQGV4Y2VwdGlvbiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGlzIEVBUiBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoZSBzYW1lIHVyaSBhcwotCSAqIEBhTW9kdWxlRmlsZQotCSAqLwotCi0JcHVibGljIE1vZHVsZUZpbGUgYWRkQ29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFkZENvcHkoTW9kdWxlRmlsZSkgZXhjZXB0IHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyBNb2R1bGVSZWYKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUmVmIGFkZENvcHlSZWYoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZCBhIGNvcHkgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdG8gdGhlIGRkIGZvciB0aGUgbW9kdWxlOyBpZiBhbiBhbHQgZGQgaXMgc3BlY2lmaWVkLCBhZGQgdG8KLQkgKiB0aGF0IGRkOyBvdGhlcndpc2UgYWRkIHRvIHRoZSBzdGFuZGFyZCBkZCBvZiB0aGUgbW9kdWxlOyBhbHNvIGFkZCBhIGNvcHkgb2YgdGhlIHJvbGUgdG8gdGhlCi0JICogZWFyIGZpbGUgZGQgaWYgYSByb2xlIHdpdGggdGhhdCBuYW1lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBkZCBmb3IgYU1vZHVsZSBhbHJlYWR5IGNvbnRhaW5zIGEgcm9sZSB3aXRoIHRoYXQgbmFtZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weShTZWN1cml0eVJvbGUgYVJvbGUsIE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkIGEgY29weSBvZiB0aGUgc2VjdXJpdHkgcm9sZSB0byB0aGUgZWFyIGZpbGUncyBkZCwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGEgcm9sZQotCSAqIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weUlmTm90RXhpc3RzKFNlY3VyaXR5Um9sZSBhUm9sZSk7Ci0KLQlFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBBcHBsaWNhdGlvbkNsaWVudEZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBDbGllbnRNb2R1bGVSZWZzCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2xpZW50TW9kdWxlUmVmcygpOwotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb24gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3Rvck1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoRWpiTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKEphdmFDbGllbnRNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JV2ViQXBwIGdldERlcGxveW1lbnREZXNjcmlwdG9yKFdlYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBFSkJKYXJGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCSmFyRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIEVKQk1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJNb2R1bGVSZWZzKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlCi0JICogcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlCi0JICogZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMuCi0JICogCi0JICogQ2FuIGJlIHVzZWQgd2l0aCBlamIgMS4xIHJlZmVyZW5jZXMgb25seS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB7QGxpbmsjZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZiwgU3RyaW5nIG1vZHVsZVVyaSApCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiBhbmQgYSBtb2R1bGUgdXJpLCBpZiBvbmUgZXhpc3RzLiBUaGUKLQkgKiBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOwotCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4gUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlCi0JICogd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yCi0JICogZGVyZWZlcmVuY2luZyBlamIgcmVmcy4KLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgJiBlamIgMi4wIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIG1vZHVsZVVyaSAtIFRoZSBtb2R1bGUgdXJpCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpKTsKLQotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmksIFN0cmluZyBhbHRERCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgcmVmIHdoaWNoIHJlZmVyZW5jZXMKLQkgKiBAbW9kdWxlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgZ2V0TW9kdWxlUmVmKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgYWxsIG1vZHVsZSByZWZzIGluIHRoaXMgRUFSIGhhdmluZyBhIHJlZmVyZW5jZSB0bwotCSAqIEBhTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZVJlZnMoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBNb2R1bGVGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIFJhckZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSQVJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgRkFSRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiB7QGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSl9Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RkFSRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIENvbm5lY3Rvck1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHNlY3VyaXR5IHJvbGVzIGZyb20gYWxsIGV4aXN0aW5nIG1vZHVsZXMgKEVqYk1vZHVsZSBhbmQgV2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlc0Zyb21BbGxNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHNlY3VyaXR5IHJvbGVzIGZyb20gYW4gZXhpc3RpbmcgbW9kdWxlIChFamJNb2R1bGUgYW5kIFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Um9sZXNGcm9tTW9kdWxlKE1vZHVsZSBhTW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIFdhckZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXQVJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgV2ViTW9kdWxlUmVmcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIHJvbGUgaW50byBlYWNoIE1vZHVsZUZpbGUgaW4gdGhlIGVhciBmaWxlIHdoaWNoIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiB0aGUgcm9sZQotCSAqIEFzc3VtcHRpb246IGEgcm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiAKLQkgKiBAcm9sZSBleGlzdHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSk7Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSByb2xlIGludG8gdGhlIE1vZHVsZUZpbGUgZm9yIHRoZSBtb2R1bGUsIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIHRoZQotCSAqIHJvbGUgQXNzdW1wdGlvbjogYSByb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIAotCSAqIEByb2xlIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgcHVzaERvd25Sb2xlKFNlY3VyaXR5Um9sZSByb2xlLCBNb2R1bGUgYU1vZHVsZSk7Ci0KLQkvKioKLQkgKiBBdHRlbXB0IHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZvciB0aGUgcGFyYW1ldGVyIGZyb20gdGhpcyBvYmplY3QncyBkZCwgdGhlbiByZW1vdmUgdGhlIG1vZHVsZQotCSAqIGZpbGUsIGlmIGl0IGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55IG90aGVyIE1vZHVsZVJlZiwgZnJvbSB0aGUgbGlzdCBvZiBmaWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShNb2R1bGVSZWYgYU1vZHVsZVJlZik7Ci0KLQkvKioKLQkgKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGVhciBmaWxlJ3MgZGQ7IHB1c2ggdGhpcyBjaGFuZ2UgZG93biB0byBhbnkgY29udGFpbmVkIG1vZHVsZQotCSAqIGRkJ3M7IGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVzIGFuIGFsdC1kZCwgdGhlIGNoYW5nZSB3aWxsIGJlIHJlZmxlY3RlZCB0aGVyZTsgb3RoZXJ3aXNlIGl0Ci0JICogd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIHN0YW5kYXJkIGRkIG9mIHRoZSBtb2R1bGUKLQkgKiAKLQkgKiBAdGhyb3dzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGRkIGZvciB0aGUgZWFyIGRvZXMgbm90IGNvbnRhaW4gYSByb2xlIHdpdGggdGhlIGV4aXN0aW5nUm9sZU5hbWUKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBkZCBmb3IgdGhlIGVhciBmaWxlIGFscmVhZHkgY29udGFpbnMgYSByb2xlIHdpdGggdGhlIG5ldyBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpIHRocm93cyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIGVhY2ggc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGQgZm9yIGVhY2ggbW9kdWxlLCBhZGQgYSBjb3B5IHRvIHRoZSBlYXIgZmlsZSdzIGRkOyBpZiBhbgotCSAqIGFsdC1kZCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUsIHVzZSB0aGF0IGRkOyBvdGhlcndpc2UgdXNlIHRoZSBzdGFuZGFyZCBkZCBpbiB0aGUgbW9kdWxlCi0JICogZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBGb3IgZWFjaCBzZWN1cml0eSByb2xlIGluIHRoZSBkZCBmb3IgYSBtb2R1bGUsIGFkZCBhIGNvcHkgdG8gdGhlIGVhciBmaWxlJ3MgZGQ7IGlmIGFuIGFsdC1kZAotCSAqIGlzIHNwZWNpZmllZCBmb3IgdGhlIG1vZHVsZSwgdXNlIHRoYXQgZGQ7IG90aGVyd2lzZSB1c2UgdGhlIHN0YW5kYXJkIGRkIGluIHRoZSBtb2R1bGUgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKE1vZHVsZSBhTW9kdWxlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1vZHVsZVJlZnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1vZHVsZVJlZnMoKTsKLQotCXB1YmxpYyBMaXN0IGdldEFyY2hpdmVzT2ZUeXBlKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIE1hcCBvZiBNb2R1bGVzIGFzIGtleXMgYW5kIGEgTGlzdCBvZiBFSkIgUmVmZXJlbmNlcyBhcyB0aGUgdmFsdWVzLiBUaGlzIHdpbGwgbGV0IHlvdQotCSAqIGtub3cgd2hpY2ggTW9kdWxlcyB0aGUgcmVmZXJlbmNlcyBjYW1lIGZyb20uIFlvdSBjYW4gZmlsdGVyIHRoZSBsaXN0IG9mIEVKQiBSZWZlcmVuY2VzCi0JICogcmV0dXJuZWQgb24gdGhlIGxpbmtlZCBhdHRyaWJ1dGVkIG9mIHRoZSByZWZlcmVuY2UuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGZpbHRlciBsaW5rZWQKLQkgKiByZWZlcmVuY2VzLCBub24tbGlua2VkIHJlZmVyZW5jZXMsIG9yIG5laXRoZXIgKGkuZS4sIHJldHVybiBhbGwgcmVmZXJlbmNlcykuCi0JICovCi0JTWFwIGdldEVKQlJlZmVyZW5jZXMoYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQkphckZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQkphckZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZDBhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJKYXJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphckZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHRvb2xzIHBlcmZvcm1pbmcgc2VsZWN0aXZlIGltcG9ydAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFzc29jaWF0ZWRGaWxlcyhFbnRlcnByaXNlQmVhbiBlamIpOwotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0ZWRGcm9tMTAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCTW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMjZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCTW9kdWxlUmVmIGV4dGVuZHMgTW9kdWxlUmVmIHsKLQotCUVKQkphciBnZXRFSkJKYXIoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLX0gLy9FSkJNb2R1bGVSZWYKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0ZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwNTNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9GaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB1cCB0byB0aGUgZmlsZW5hbWU7IGUuZy4sIGZyb20gY29tL2libS9mb28vYmFyLmNsYXNzLCBjb20vaWJtL2ZvbwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VVJJKCk7Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhaWwgb2YgdGhlIGZpbGUgcGF0aDsgZS5nLiwgZnJvbSBjb20vaWJtL2Zvby9iYXIuY2xhc3MsIHJldHVybiBiYXIuY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRkFSRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seURpcmVjdG9yeSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVUkkgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFzdE1vZGlmaWVkIGF0dHJpYnV0ZQotCSAqLwotCWxvbmcgZ2V0TGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldExhc3RNb2RpZmllZCA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICN1bnNldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjZ2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjZ2V0TGFzdE1vZGlmaWVkIDxlbT5MYXN0IE1vZGlmaWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjc2V0TGFzdE1vZGlmaWVkKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNnZXRMYXN0TW9kaWZpZWQgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IE1vZGlmaWVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjc2V0TGFzdE1vZGlmaWVkKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNpemUgYXR0cmlidXRlCi0JICovCi0JbG9uZyBnZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5GaWxlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTaXplKCkKLQkgKiBAc2VlICN1bnNldFNpemUoKQotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNpemUobG9uZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAnCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkZpbGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzU2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQHNlZSAjc2V0U2l6ZShsb25nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTaXplKCkKLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAc2VlICNzZXRTaXplKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseQotCSAqIHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3Vuc2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3NldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjdW5zZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBPcmlnaW5hbFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0T3JpZ2luYWxVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBPcmlnaW5hbFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE9yaWdpbmFsVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIExvYWRpbmdDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0JQ29udGFpbmVyIGdldExvYWRpbmdDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvYWRpbmdDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2FkaW5nQ29udGFpbmVyKENvbnRhaW5lciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIENvbnRhaW5lciByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFjY2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0dlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjb250cmlidXRvcnMgc2hvdWxkIHVzZSB0byBzcGVjaWZ5IHRoZSBnZW5lcmljIHR5cGUgdGhhdAotCSAqIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYXJjaGl2ZXMuIEV4YW1wbGU6IGNvbS55b3VyY29tcGFueS5qMmVlLmV4dGVuc2lvbi5jdXN0b21Nb2R1bGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlS2V5KCk7Ci0KLQkvKioKLQkgKiBJZiBjb21tb24gYXJjaGl2ZSBzaG91bGQgcmVjb2duaXplIGZpbGUgZXh0ZW5zaW9ucyBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmVzLCBlLmcuLCAuamFyLAotCSAqIC56aXAsIHRoZW4gdGhlc2UgZmlsZSBleHRlbnNpb25zIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCBpbmRpdmlkdWFsIGRpc2NyaW1pbmF0b3JzIGNhbiBpbXBsZW1lbnQgdG8gZGV0ZXJtaW5lIGlmIGFuIEFyY2hpdmUgaXMgb2YgYQotCSAqIHBhcnRpY3VsYXIgdHlwZS4gSW1wbGVtZW50ZXJzIHNob3VsZCBiZSBzZW5zaXRpdmUgdG8gcGVyZm9ybWFuY2UgcmVxdWlybWVudHMuIFVzdWFsbHkgc2ltcGxlCi0JICogdGVzdHMgc2hvdWxkIGJlIHBlcmZvcm1lZCwgc3VjaCBhczoKLQkgKiA8Y29kZT5pZiAoYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSgieHh4LnhtbCIpPGNvZGU+LiAgVGhlIHJlc3VsdCB3aWxsCi0JICogYmUgc3RvcmVkIGluIHRoZSBBcmNoaXZlJ3MgInR5cGVzIiBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGFuQXJjaGl2ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNjcmltaW5hdGUoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDRiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZUZpbGUgZXh0ZW5kcyBBcmNoaXZlIHsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lciBmb3IgdGhpcyBhcmNoaXZlIGNhc3RlZCB0byBFQVJGaWxlOyBudWxsIGlmIHRoaXMgZmlsZSBpcyBub3QgY29udGFpbmVkCi0JICogaW4gYW4gRUFSRmlsZQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgZ2V0RXhwb3J0U3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGdldEltcG9ydFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBmaWxlLiBGb3IgZXhhbXBsZSwgIjIuMCIKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCwgVXNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gSUQgb2YgdGhlIG1vZHVsZSBGb3IgZXhhbXBsZSwgIjIwIgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjVmVyc2lvbklEKCk7Ci0KLQlFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgbnVsbDsgdXNlZCBmb3IgY29weSwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0JICogaW1wb3J0IHN0cmF0ZWd5IG5lZWRzIHRvIGJlIGNvcGllZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneSBuZXdFeHBvcnRTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbXBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IG5ld0ltcG9ydFN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIEoyRUUgdmVyc2lvbiBmb3IgdGhpcyBhcmNoaXZlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKGludCB2ZXJzaW9uSUQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTEyMzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlUmVmIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJzZWQgbG9jYWwgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIE1vZHVsZUZpbGUKLQkgKi8KLQlFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyc2VkIGFsdCBkZCwgaWYgaXQgZXhpc3RzLCBmcm9tIHRoZSBFQVIgZmlsZSBjb250YWluaW5nIHRoaXMgbW9kdWxlCi0JICovCi0JRU9iamVjdCBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhbHQgZGQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdGhlIGxvY2FsIGRkCi0JICovCi0JRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXJpIGZyb20gdGhlIHtAbGluayBNb2R1bGV9cmVmZXJlbmNlZCBieSB0aGlzIHJlZjsgaWYgdGhlcmUgaXMgbm8gbW9kdWxlLCAoZWcuIGEKLQkgKiBzdGFuZGFsb25lIEpBUiksIGdldHMgdGhlIHVyaSBmcm9tIHRoZSB7QGxpbmsgTW9kdWxlRmlsZX0uIEFzc3VtcHRpb246IFRoZSB1cmkgb2YgdGhlCi0JICoge0BsaW5rIE1vZHVsZX1hbmQge0BsaW5rIE1vZHVsZUZpbGV9c2hvdWxkIHN0YXkgaW4gc3luYwotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgTW9kdWxlRmlsZSByZWZlcmVuY2UKLQkgKi8KLQlNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoKTsKLQotCS8qKgotCSAqIFNpbWlsYXIgdG8ge0BsaW5rIEFyY2hpdmUjZ2V0TW9mUmVzb3VyY2UoU3RyaW5nKX0sIGV4Y2VwdCB0aGF0IGFsdC1kZCBpbmRpcmVjdGlvbiBpcwotCSAqIGNvbnNpZGVyZWQuIElmIHRoaXMgbW9kdWxlIHVzZXMgYW4gYWx0LWRkLCB0aGVuIHRoZSB1cmkgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCB0aGUgImFsdC1yb290IgotCSAqIGFuZCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgb3duaW5nIEVBUiBmaWxlLiBJbiB0aGlzIGNhc2UsIGFsbCBocmVmcyBpbnRvIGFuZAotCSAqIG91dCBvZiB0aGlzIHJlc291cmNlIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgRUFSLiBUaGUgaHJlZnMgYXJlIHRha2VuIGNhcmUgb2YKLQkgKiBmb3IgZnJlZSB3aGVuIHRoZSBjbGllbnQgdXNlcyB7QGxpbmsgI21ha2VBbHREZXNjcmlwdG9yc0FuZFJlc291cmNlcygpfS4gVGhlIGFsdCByb290IGlzCi0JICogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKiAKLQkgKiBAc2VlIE1vZHVsZUV4dGVuc2lvbiNnZXRBbHRSb290KCkKLQkgKi8KLQlSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QWx0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0TG9jYWxSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnB1dCBzdHJlYW0gZnJvbSB0aGUgcmVzb3VyY2VzIHBhdGggb2YgZWl0aGVyIHRoZSBNb2R1bGVGaWxlLCBpZiB0aGUgbW9kdWxlIGRvZXMKLQkgKiBub3QgdXNlIGFsdC1kZCwgb3IgZnJvbSB0aGUgYWx0Um9vdCBvZiB0aGUgbW9kdWxlLCBmb3VuZCBpbiB0aGUgcmVzb3VyY2VzIHBhdGggb2YgdGhlIEVBUgotCSAqIAotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogUmV0cmlldmUgYSByZXNvdXJjZSBmcm9tIHRoZSBNb2R1bGVGaWxlCi0JICogCi0JICogQHNlZSBBcmNoaXZlI2dldE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlSZXNvdXJjZSBnZXRMb2NhbE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSB1cmkgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCB0aGUgImFsdC1yb290IiBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIG93bmluZwotCSAqIEVBUiBmaWxlLgotCSAqLwotCVJlc291cmNlIGdldEFsdE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2YgcmVzb3VyY2UgYW5kIGFkZCBpdCB0byB0aGUgcmVzb3VyY2Ugc2V0IG9mIHRoZSBjb250ZXh0IG9mIGVpdGhlciB0aGUgbW9kdWxlCi0JICogZmlsZSBpZiB0aGlzIE1vZHVsZVJlZiBpcyBub3QgYW4gYWx0LCBvciB0byB0aGUgRUFSIGZpbGUgaWYgaXQgaXMgYW4gYWx0LiBJZiB0aGlzIG1vZHVsZSBpcwotCSAqIHVzZXMgYW4gYWx0LWRkLCB0aGVuIHRoZSB1cmkgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCB0aGUgImFsdC1yb290IiBUaGUgYWx0IHJvb3QgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFyY2hpdmUgaGF2aW5nIHRoZSB1cmkKLQkgKi8KLQlSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCVJlc291cmNlIG1ha2VMb2NhbE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlSZXNvdXJjZSBtYWtlQWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTW9kdWxlRmlsZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldE1vZHVsZUZpbGUoTW9kdWxlRmlsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZW5hbWUgdGhpcyBtb2R1bGU7IGJvdGggaXRzIE1vZHVsZUZpbGUgYW5kIE1vZHVsZSBlbGVtZW50IGZyb20gdGhlIEFwcGxpY2F0aW9uIGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKTsKLQotCWJvb2xlYW4gaXNFSkIoKTsKLQotCWJvb2xlYW4gaXNXZWIoKTsKLQotCWJvb2xlYW4gaXNDbGllbnQoKTsKLQotCWJvb2xlYW4gaXNDb25uZWN0b3IoKTsKLQotCWJvb2xlYW4gdXNlc0FsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIEVhckZpbGUgcmVmZXJlbmNlCi0JICovCi0JRUFSRmlsZSBnZXRFYXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFYXJGaWxlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWFyRmlsZShFQVJGaWxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TW9kdWxlKE1vZHVsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkNvbW1vbmFyY2hpdmVQYWNrYWdlI2dldE1vZHVsZVJlZl9Nb2R1bGUoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kdWxlIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW9kdWxlKE1vZHVsZSB2YWx1ZSk7Ci0KLX0gLy9Nb2R1bGVSZWYKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JBUkZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JBUkZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmNTUyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSQVJGaWxlIGV4dGVuZHMgTW9kdWxlRmlsZXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbm5lY3RvciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZSNnZXREZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBSQVIgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgZm9yIGV4cGFuZGluZwotCSAqIHRoZSBSQVIgZmlsZSBpZiBpdCBpcyBhIHN0YW5kYWxvbmUgUkFSLiBJZiB0aGUgUkFSIGZpbGUgaXMgcGFja2FnZWQgYXMgcGFydCBvZiBhbiBFQVIsIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLiBJbnN0ZWFkLCB0aGUgZXhwYW5kVG8oKSBvZiB0aGUgRUFSIHNob3VsZCBiZSB1c2VkIGV4cGFuZCB0aGUKLQkgKiBjb250ZW50cyBvZiB0aGUgZWFyIGFuZCB0aGUgbmVzdGVkIFJBUiByZWxhdGl2ZSB0byB0aGUgRUFSJ3MgZGlyZWN0b3J5IChzaW1pbGFyIHRvIFdBUidzKS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMi82LzIwMDEgNzo0NDo0MSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGV4cGFuZEZsYWdzCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQl2b2lkIGV4dHJhY3RUb0Nvbm5lY3RvckRpcmVjdG9yeShTdHJpbmcgZGlyLCBpbnQgZXhwYW5kRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlYWRPbmx5RGlyZWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZWFkT25seURpcmVjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VmNzYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlYWRPbmx5RGlyZWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5RGlyZWN0b3J5IGV4dGVuZHMgQ29udGFpbmVyIHsKLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KFN0cmluZyB1cmkpOwotCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KFN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmbGF0IGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yaWVzLCB3aXRoIHRoZQotCSAqIGRpcmVjdG9yaWVzIGZpbHRlcmVkIG91dCwgYXMgdGhlIGxpc3Qgd291bGQgYXBwZWFyIGluIGFuIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWxlc1JlY3Vyc2l2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgZmlsZXMgd2l0aCBqdXN0IHRoZSBpbnN0YW5jZXMgb2YgUmVhZE9ubHlEaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWFkT25seURpcmVjdG9yaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVwYWlyQXJjaGl2ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllZTViOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yNy8wMSAyOjIwOjQ0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBhaXJBcmNoaXZlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBkaXJlY3RvcnlOYW1lczsKLQotCS8qKgotCSAqIFJlcGFpck1ldGFJbmZDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlcGFpckFyY2hpdmVDb21tYW5kKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXN1cGVyKCJSZXBhaXIgQXJjaGl2ZSIsIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuUmVwYWlyc19hbGxfZW50cmllc19pbl90aGUpOyAvLyA9ICJSZXBhaXJzIGFsbCBlbnRyaWVzIGluIHRoZSBNRVRBLUlORiBhbmQvb3IgV0VCLUlORiBkaXJlY3RvcmllcyB0byBiZSB0aGUgY29ycmVjdCBjYXNlIi8vJE5PTi1OTFMtMSQKLQkJYXJjaGl2ZSA9IGFuQXJjaGl2ZTsKLQkJLy9FbnN1cmUgSW5pdGlhaWxpemF0aW9uCi0JCWdldERpcmVjdG9yeU5hbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb24uY29tbWFuZC5Db21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTGlzdCBmaWxlcyA9IGFyY2hpdmUuZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpIHsKLQkJCQluZXcgUmVwYWlyQXJjaGl2ZUNvbW1hbmQoKEFyY2hpdmUpIGFGaWxlKS5leGVjdXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB1cHBlclVyaSA9IGFGaWxlLmdldFVSSSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGRpcmVjdG9yeU5hbWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIHVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBrZXlzQW5kVmFsdWVzLm5leHQoKTsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodXBwZXJVcmkuc3RhcnRzV2l0aChrZXkpICYmICF1cmkuc3RhcnRzV2l0aCh2YWx1ZSkpIHsKLQkJCQkJCVN0cmluZyB0YWlsID0gdXJpLnN1YnN0cmluZyhrZXkubGVuZ3RoKCkpOwotCQkJCQkJYUZpbGUuc2V0VVJJKHZhbHVlLmNvbmNhdCh0YWlsKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE0LzAxIDU6NTU6MTQgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLnV0aWwuTWFwIGdldERpcmVjdG9yeU5hbWVzKCkgewotCQlpZiAoZGlyZWN0b3J5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlyZWN0b3J5TmFtZXMgPSBuZXcgSGFzaE1hcCg2KTsKLQkJCWRpcmVjdG9yeU5hbWVzLnB1dChKMkVFQ29uc3RhbnRzLk1FVEFfSU5GLnRvVXBwZXJDYXNlKCksIEoyRUVDb25zdGFudHMuTUVUQV9JTkYpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEoyRUVDb25zdGFudHMuV0VCX0lORi50b1VwcGVyQ2FzZSgpLCBKMkVFQ29uc3RhbnRzLldFQl9JTkYpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkudG9VcHBlckNhc2UoKSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JCQlkaXJlY3RvcnlOYW1lcy5wdXQoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkudG9VcHBlckNhc2UoKSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQl9Ci0JCXJldHVybiBkaXJlY3RvcnlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXthcmNoaXZlfSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTQvMDEgNjo0NjoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoIXZhbGlkYXRlQXJncyhhcmdzKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZShhcmdzWzBdKTsKLQkJCW5ldyBSZXBhaXJBcmNoaXZlQ29tbWFuZChhbkFyY2hpdmUpLmV4ZWN1dGUoKTsKLQkJCWFuQXJjaGl2ZS5zYXZlQXMoYXJnc1sxXSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuUmVwYWlyX2NvbW1hbmRfZmFpbGVkX19fZXhfRVhDXyk7IC8vID0gIlJlcGFpciBjb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToiCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uLmNvbW1hbmQuQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUFyZ3MoU3RyaW5nW10gYXJncykgewotCQlpZiAoIShhcmdzLmxlbmd0aCA9PSAyKSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJlcGFpckFyY2hpdmVDb21tYW5kX3VzYWdlKTsgLy8gPSAiUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6ICA8c291cmNlSmFyRmlsZVBhdGg+IDxkZXN0aW5hdGlvblBhdGg+IgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShhcmdzWzBdKTsKLQkJYm9vbGVhbiBpc1ppcCA9IGZhbHNlOwotCQlqYXZhLnV0aWwuemlwLlppcEZpbGUgemlwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcCA9IEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSk7Ci0JCQlpc1ppcCA9IHRydWU7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCWlzWmlwID0gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoemlwICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJfQotCQlpZiAoIWlzWmlwICYmICFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJlcGFpckFyY2hpdmVDb21tYW5kX3VzYWdlMV9FUlJPUl8pOyAvLyA9ICJSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogc291cmNlSmFyRmlsZVBhdGggbXVzdCBwb2ludCB0byBhIHZhbGlkIGFyY2hpdmUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIGFyY2hpdmUiCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoYXJnc1sxXSkuY2FuV3JpdGUoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIucmVwYWlyX3VzYWdlX0VSUk9SXywgKG5ldyBPYmplY3RbXXthcmdzWzFdfSkpKTsgLy8gPSAiUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6IGNhbm5vdCB3cml0ZSB0byBkZXN0aW5hdGlvblBhdGggIgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGU5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkNvbGxlY3RpbmdFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMDowNDowOCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVYbWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRzOwotCXByb3RlY3RlZCBNb2R1bGVGaWxlIGFyY2hpdmU7Ci0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXN0ZWQgPSB0cnVlOwotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRlWG1sQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVYbWxDb21tYW5kKE1vZHVsZUZpbGUgbSkgewotCQlzdXBlcigpOwotCQlhcmNoaXZlID0gbTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGVYbWxDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRlWG1sQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRhdGVYbWwoKTsKLQkJaWYgKGlzVmFsaWRhdGVOZXN0ZWQoKSkgewotCQkJTGlzdCBhcmNoaXZlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQXJjaGl2ZSBhID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCQlpZiAoIWEuaXNNb2R1bGVGaWxlKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCU1vZHVsZUZpbGUgbSA9IChNb2R1bGVGaWxlKSBhOwotCQkJCVZhbGlkYXRlWG1sQ29tbWFuZCBjbWQgPSBuZXcgVmFsaWRhdGVYbWxDb21tYW5kKG0pOwotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJcmVzdWx0cy5hZGRBbGwoY21kLmdldFJlc3VsdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gTGlzdCBvZiBYbWxWYWxpZGF0aW9uUmVzdWx0OyAxIGZvciB0aGUgYXJjaGl2ZSwgYW5kIG9uZSBmb3IgZWFjaCBuZXN0ZWQgbW9kdWxlIGZpbGUKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIyLzIwMDEgMTowNjo1MiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlTmVzdGVkKCkgewotCQlyZXR1cm4gdmFsaWRhdGVOZXN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMjIvMjAwMSAxOjA2OjUyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWxpZGF0ZU5lc3RlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlTmVzdGVkKGJvb2xlYW4gbmV3VmFsaWRhdGVOZXN0ZWQpIHsKLQkJdmFsaWRhdGVOZXN0ZWQgPSBuZXdWYWxpZGF0ZU5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0YXRlWG1sKCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlSZXNvdXJjZSByZXMgPSBhcmNoaXZlLmdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKS5lUmVzb3VyY2UoKTsKLQkJWG1sVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgWG1sVmFsaWRhdGlvblJlc3VsdCgpOwotCQlyZXN1bHQuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKGJvcywgbmV3IGphdmEudXRpbC5IYXNoTWFwKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKLQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGluU3RyZWFtKTsKLQkJQ29sbGVjdGluZ0Vycm9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENvbGxlY3RpbmdFcnJvckhhbmRsZXIoKTsKLQkJWG1sRG9jdW1lbnRSZWFkZXIgcGFyc2VBZGFwdGVyID0gbmV3IFhtbERvY3VtZW50UmVhZGVyKHNvdXJjZSwgbnVsbCwgaGFuZGxlcik7Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyB0cnkvY2F0Y2ggY2xhdXNlIGlzIGFkZGVkIHRvIGhhbmRsZSB0aGUgY2FzZQotCQkvLyB3aGVuIFNBWCBwYXJzZXIgdGhyb3dzIGEgZmF0YWwgZXhjZXB0aW9uICh0eXBlIFNBWEV4Y2VwdGlvbikKLQkJLy8gZm9yIHVubWF0Y2hpbmcgZW5kIHRhZyB0aGF0IHJlc3VsdHMgaW4gYSBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGJlIHRocm93bi4gTmVlZCB0byBjYXRjaCBpdCBzbyB3ZSBjYW4gZ2V0IHRoZSBwYXJzZXIgZXhjZXB0aW9ucwotCQkvLyBhbmQgZGlzcGxheSB0aGVtIHRvIHRoZSB1c2VyLgotCQl0cnkgewotCQkJcGFyc2VBZGFwdGVyLnBhcnNlRG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCi0JCQlpZiAoaGFuZGxlci5nZXRDYXVnaHRFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5zZXRBcmNoaXZlKGFyY2hpdmUpOwotCQkJCXJlc3VsdC5zZXRDYXVnaHRFeGNlcHRpb25zKGhhbmRsZXIuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpKTsKLQkJCQlyZXN1bHRzLmFkZChyZXN1bHQpOwotCQkJfQotCi0JCQl0aHJvdyByZTsKLQkJfQotCi0JCXJlc3VsdC5zZXRBcmNoaXZlKGFyY2hpdmUpOwotCQlyZXN1bHQuc2V0Q2F1Z2h0RXhjZXB0aW9ucyhoYW5kbGVyLmdldENhdWdodEV4Y2VwdGlvbnMoKSk7Ci0JCXJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV0FSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV0FSRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdiMDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dBUkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0FSRmlsZSBleHRlbmRzIE1vZHVsZUZpbGUgewotCi0JLyoqCi0JICogQ29weSB0aGUgZmlsZSwgYW5kIHN3aXp6bGUgdGhlIGZpbGUgdXJpIGlmIG5lY2Vzc2FyeSBieSBwcmVwZW5kaW5nIHRoZSBjbGFzc2VzIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgb2YgYSBmaWxlIHdpdGggdGhlIG1vZGlmaWVkIHVyaSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciBpcyBhIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUNsYXNzKEZpbGUgYUZpbGUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29weSB0aGUgZmlsZSwgYW5kIHN3aXp6bGUgdGhlIGZpbGUgdXJpIGlmIG5lY2Vzc2FyeSBieSBwcmVwZW5kaW5nIHRoZSBsaWJzIGRpcmVjdG9yeQotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgb2YgYSBmaWxlIHdpdGggdGhlIG1vZGlmaWVkIHVyaSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHBhcmFtZXRlciBpcyBhIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUxpYihGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIGdldENsYXNzZXMoKSAtIGZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIGNsYXNzIGZpbGVzIGZyb20gXHdlYi1pbmZcY2xhc3NlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENsYXNzZXMoKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGaWx0ZXIgZmlsZXMgdG8gcmV0dXJuIHRoZSBmaWxlcyBmcm9tIFx3ZS1pbmZcbGliCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlicygpOwotCi0JLyoqCi0JICogRmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgSkFScyBhbmQgWmlwcyBmcm9tIFx3ZS1pbmZcbGliCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGliQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIGdldFJlc291cmNlcygpIC0gZmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgV2ViIHJlc291cmNlcyB3aXRoaW4gdGhlIFdBUiAobm8KLQkgKiBjbGFzc2VzL2xpYnMvbWV0YWRhdGEpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgb3V0cHV0IGZpbGUgcGFzc2VkIGluCi0JICogCi0JICogQHBhcmFtIGFDbGFzc0ZpbGUKLQkgKiAgICAgICAgICAgIFRoZSAuY2xhc3MgZmlsZSBvciBvdGhlciBvdXRwdXQgZmlsZSB0byBmaW5kIHRoZSBzb3VyY2UgZm9yCi0JICogQHJldHVybiBTdHJpbmcgVGhlIG1hdGNoaW5nIHNvdXJjZS4gTnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzb3VyY2UgZm91bmQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKEZpbGUgYUNsYXNzRmlsZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV2ViTW9kdWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTA5OTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV2ViTW9kdWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViTW9kdWxlUmVmIGV4dGVuZHMgTW9kdWxlUmVmIHsKLQlXZWJBcHAgZ2V0V2ViQXBwKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi19IC8vV2ViTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9YbWxWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9YbWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTk1ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvWG1sVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozMTo1MyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgWG1sVmFsaWRhdGlvblJlc3VsdCB7Ci0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgYXJjaGl2ZTsKLQlwcm90ZWN0ZWQgTGlzdCBjYXVnaHRFeGNlcHRpb25zOwotCi0JLyoqCi0JICogWG1sVmFsaWRhdGlvblJlc3VsdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYbWxWYWxpZGF0aW9uUmVzdWx0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzQ6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjM0OjQ1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIGNhdWdodEV4Y2VwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShNb2R1bGVGaWxlIG5ld0FyY2hpdmUpIHsKLQkJYXJjaGl2ZSA9IG5ld0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2F1Z2h0RXhjZXB0aW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXVnaHRFeGNlcHRpb25zKGphdmEudXRpbC5MaXN0IG5ld0NhdWdodEV4Y2VwdGlvbnMpIHsKLQkJY2F1Z2h0RXhjZXB0aW9ucyA9IG5ld0NhdWdodEV4Y2VwdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTdiNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIHdpdGggbWFuaXB1bGF0aW9uIG9mIGFyY2hpdmVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MzQwMTQ1NDY1OTU2NTA1NTcwTDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMWE1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlczsgdGhlcmUgYXJlCi0gKiBzb21lIHNpdHVhdGlvbnMgd2hlcmUgd2UgY2FuIG9ubHkgdGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGEgc3VidHlwZSBvZiBleGNlcHRpb24sCi0gKiBiZWNhdXNlIHRoZSBzaWduYXR1cmVzIG9mIGV0b29scyBnZW5lcmF0ZWQgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiB0byB0aHJvdyBhbnkgZXhjZXB0aW9uCi0gKiBvdGhlciB0aGFuIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NzI3NjAzMjE1MDUyMTg2OTU4TDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk2Y2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMgb2NjdXJyaW5nIHdpdGggbWFuaXB1bGF0aW9uIG9mIGFyY2hpdmVzLCB3aGVyZSBhCi0gKiBjYXVnaHQgZXhjZXB0aW9uIGNhdXNlcyB0aGlzIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDExNjU1MTY2MDM3MzAwNTQ2TDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjhlNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0RlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIG9jY3VyIGlmIGFuIGVycm9yL2V4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgbG9hZGluZyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zODcwMzE0NDgxMTQ4ODcxNjY1TDsKLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0R1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0R1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhiZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGFuIGF0dGVtcCBpcyBtYWRlIHRvIGFkZCB0byBhIGxpc3QgYW4gb2JqZWN0IGVxdWFsaW5nLCBvciBoYXZpbmcKLSAqIHRoZSBzYW1lIG5hbWUsIGlkLCBldGMsIGFzIGFub3RoZXIgb2JqZWN0IGluIHRoZSBsaXN0LgotICovCi1wdWJsaWMgY2xhc3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzI2OTEzOTUxODk1NzgyNjEzMEw7Ci0JcHJvdGVjdGVkIE9iamVjdCBkdXBsaWNhdGU7Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oU3RyaW5nIHMsIE9iamVjdCBvKSB7Ci0JCXN1cGVyKHMpOwotCQlzZXREdXBsaWNhdGUobyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMTYvMDEgOTo0MzowMCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREdXBsaWNhdGUoKSB7Ci0JCXJldHVybiBkdXBsaWNhdGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMTYvMDEgOTo0MzowMCBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RHVwbGljYXRlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RHVwbGljYXRlKGphdmEubGFuZy5PYmplY3QgbmV3RHVwbGljYXRlKSB7Ci0JCWR1cGxpY2F0ZSA9IG5ld0R1cGxpY2F0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzOWY4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggb2NjdXJzIHdoZW4gYSBtb2YgcmVzb3VyY2UncyBleHRlbnQgY29udGFpbnMgemVybyBlbGVtZW50cyBhbmQgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gKiB0byBhY2Nlc3MgYW4gZWxlbWVtdCBmcm9tIHRoZSByZXNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQ4MjM5MzMwNDI4MDE2MDU4NUw7Ci0KLQkvKioKLQkgKiBFbXB0eVJlc291cmNlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0lBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0lBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk3MjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9JQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZXhjZXB0aW9uLklXcmFwcGVkRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8vRGVmYXVsdAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL01hbmlmZXN0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTWFuaWZlc3RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmZTIwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTWFuaWZlc3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMDQ1MTQwODk5MDc4MTkyMDE5TDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTmVzdGVkSmFyRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTmVzdGVkSmFyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjhmNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05lc3RlZEphckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyBhIGphciB3aXRoaW4gYSBqYXIKLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZEphckV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTk5NTQ3MjMyNDI2NDYzODFMOwotCi0JcHVibGljIE5lc3RlZEphckV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk3M2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA1LzAxIDc6MzE6MjcgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyMjIyOTA4ODYzMzMxNzkyMjNMOwotCi0JLyoqCi0JICogTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJjN2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUVsZW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm8gTG9uZ2VyIHVzZWQ7IGNoZWNrIGZvciBudWxsIGluc3RlYWQgRXhjZXB0aW9uIHdoaWNoIG9jY3VycyBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAqICAgICAgICAgICAgIHRvIGFjY2VzcyBhIG5vbi1leGlzdGVudCBtb2R1bGUgZGQgZWxlbWVudCBmcm9tIGFuIGVhciBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzgxODEzMzUxMTYwMjIyNzc0TDsKLQotCS8qKgotCSAqIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUZpbGVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUZpbGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNDM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MjYxMDg0NjQ2MTQ3MzYyNzc2TDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOb01vZHVsZUZpbGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4OTc0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNi8wMSA5OjI2OjQzIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDcyMjUyNDE3MzQzOTEwOTYzTDsKLQotCS8qKgotCSAqIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1ZDEzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NjkwNjMxNjMxNTkzMTAxMzgyTDsKLQotCS8qKgotCSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyNjZiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzA4LzAxIDg6MzM6NTEgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzUzOTMxNzc2MjUxMDQ4NTY5OUw7Ci0KLQkvKioKLQkgKiBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OGQ0YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgd2hpbGUgb3BlbmluZyBhbiBhcmNoaXZlOyBjb3VsZCBvY2N1ciBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMsIGVnLCBpbwotICogZmFpbHVyZSwgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVycm9ycywgZXRjLiBDaGVjayB0aGUgbmVzdGVkIGV4Y2VwdGlvbiBmb3IgbW9yZSBpbmZvLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE3ODY5MjQxNTYwNTEwOTEzNDBMOwotCi0JLyoqCi0JICogT3BlbkZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbkZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlb3BlbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlb3BlbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ3OWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZW9wZW5FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGNhbiBiZSB0aHJvd24gYXMgYSByZXN1bHQgb2YgYW4gSU8gZXhjZXB0aW9uIHdoaWNoIG1heSBvY2N1ciB3aGlsZSAicmUtc3luY2luZyIKLSAqIGFuIGFyY2hpdmUgYWZ0ZXIgaXQgaGFzIGJlZW4gc2F2ZWQuIEZvciBleGFtcGxlLCBpZiAxMCBmaWxlcyBhcmUgY29waWVkIGZyb20gQXJjaGl2ZSBBIHRvIEFyY2hpdmUKLSAqIEIsIHRoZW4gYXJjaGl2ZSBiIGlzIHNhdmVkLCBpdHMgY29udGVudHMgd2lsbCBiZSBsb2FkZWQgZnJvbSBhIG5ldyBzb3VyY2UsIHRoZSBuZXdseSBzYXZlZCBqYXIKLSAqIGZpbGUuIFRoZXJlZm9yZSwgdGhlIGFyY2hpdmUgd2lsbCBiZSByZW9wZW5lZCBhZnRlciBzYXZpbmcsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhbiBJT0V4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFJlb3BlbkV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc5NzU5NTcyMTg0MjMzNjM2MEw7Ci0KLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVvcGVuRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFJlb3BlbkV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVuRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZXNvdXJjZUxvYWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZXNvdXJjZUxvYWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YzgzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVzb3VyY2VMb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gaWYgaW4gZXhjZXB0aW9uIG90aGVyIHRoYW4gamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gaXMgY2F1Z2h0IHdoaWxlCi0gKiBhdHRlbXB0aW5nIHRvIGxvYWQgYSBtb2YgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUxvYWRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMzMzcyMjU0ODkxMDI2MzUzMzlMOwotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJkNTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggb2NjdXJzIHdoaWxlIHNhdmluZyBhbiBhcmNoaXZlOyBjb3VsZCBvY2N1ciBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMsIGVnLCBpbwotICogZmFpbHVyZSwgZXRjLiBDaGVjayB0aGUgbmVzdGVkIGV4Y2VwdGlvbiBmb3IgbW9yZSBpbmZvLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODU5MzI1MzMzOTg0NzY1MDI0Nkw7Ci0KLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFNhdmVGYWlsdXJlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZUZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1N1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWVmNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1N1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHVzZWQgYXMgYSB3YXkgdG8gZW5mb3JjZSBhYnN0cmFjdCBiZWhhdmlvciB3aXRob3V0IGRlY2xhcmluZyB0aGUgbWV0aG9kcwotICogYWJzdHJhY3QuIE5lY2Vzc2FyeSBiZWNhdXNlIGltcGwgY2xhc3NlcyBpbiB0aGUgZXRvb2xzIGdlbmVyYXRlZCBoaWVyYXJjaHkgY2Fubm90IGJlIGFic3RyYWN0IGlmCi0gKiB0aGV5IGhhdmUgc3VidHlwZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODE1NjczNjcxNzc1NTY0MzU0TDsKLQotCS8qKgotCSAqIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlzdXBlcihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLnN1YmNsYXNzX3Jlc3BvbnNpYmlsdHlfRVhDXywgKG5ldyBPYmplY3RbXXttZXRob2ROYW1lfSkpKTsgLy8gPSAiIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MiCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1VuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1VuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVkODI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9VbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBFeGNlcHRpb24gbm8gbG9uZ2VyIHRocm93bjsgY2hlY2sgZm9yIG51bGwgaW5zdGVhZC4gRXhjZXB0aW9uIHdoaWNoIG1heSBiZSB0aHJvd24KLSAqICAgICAgICAgICAgIHdoZW5ldmVyIGEge0BsaW5rIE1vZHVsZUZpbGV9aXMgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhbiBlYXIgZmlsZSBidXQgaXQKLSAqICAgICAgICAgICAgIGlzIG5vdAotICovCi1wdWJsaWMgY2xhc3MgVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDczMTE3NzU3NDY1NDk3MTgxOTBMOwotCi0JLyoqCi0JICogVW5jb250YWluZWRNb2R1bGVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVuY29udGFpbmVkTW9kdWxlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDE4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBjYXRhbG9nIG9mIHVzZWZ1bCBjb25zdGFudHMgZm9yIHRoZSBhcmNoaXZlIHN1cHBvcnQuIENhbiBiZSB1c2VkIHRvIHN0b3JlIHJlbGF0aXZlCi0gKiBwYXRocyB0byBzcGVjaWZpYyB4bWwgYW5kIHhtaSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZUNvbnN0YW50cyBleHRlbmRzIEoyRUVDb25zdGFudHMgewotCS8vU3RhbmRhcmQgSmFyIGluZm8KLQkvKiogImNvbSIgKi8KLQlTdHJpbmcgUkFSX0NMQVNTRVNfVVJJID0gImNvbSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbGF0aXZlIHBhdGggaW4gYSB3YXIgZmlsZSB3aXRoIG5vIGxlYWRpbmcgc2xhc2ggIldFQi1JTkYvbGliLyIKLQkgKi8KLQlTdHJpbmcgV0VCQVBQX0xJQl9VUkkgPSAiV0VCLUlORi9saWIvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVsYXRpdmUgcGF0aCBpbiBhIHdhciBmaWxlIHdpdGggbm8gbGVhZGluZyBzbGFzaCAiV0VCLUlORi9jbGFzc2VzLyIKLQkgKi8KLQlTdHJpbmcgV0VCQVBQX0NMQVNTRVNfVVJJID0gIldFQi1JTkYvY2xhc3Nlcy8iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTRkNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0vKioKLSAqIEluaXRpYWxpemVyIGNsYXNzIHRvIHByZXJlZ2lzdGVyIHBhY2thZ2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlSW5pdCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHBsdWdpbl9pbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCWluaXQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWludm9rZVByZXJlcUluaXRzKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpCi0JCQkJcHJlUmVnaXN0ZXJQYWNrYWdlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2VzKCkgewotCQkvL0NvbW1vbmFyY2hpdmVQYWNrYWdlIHJlZwotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImNvbW1vbmFyY2hpdmUueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQkJCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJCQkJfQotCQkJCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCQkJCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQkJCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCQkJCX0KLQkJCQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQkJCQlyZXR1cm4gTG9vc2Vjb25maWdGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGludm9rZVByZXJlcUluaXRzKGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlKMkVFSW5pdC5pbml0KHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRkMzUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIEFQSSBvZgotICogCi0gKiBAbGluayBqYXZhLnV0aWwuamFyLk1hbmlmZXN0LCBhbG9uZyB3aXRoIGFkZGVkIGhlbHBlcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlTWFuaWZlc3QgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpOwotCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSwgQXR0cmlidXRlcyBhdHRyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0cyB0aGUgdmVyc2lvbiB0byAiMS4wIiBpZiBub3QgYWxyZWFkeSBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uSWZOZWNlc3NhcnkoKTsKLQotCXB1YmxpYyB2b2lkIGFwcGVuZENsYXNzUGF0aChTdHJpbmcgZXh0ZW5zaW9uKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRFbnRyaWVzCi0JICovCi0JcHVibGljIE1hcCBnZXRFbnRyaWVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRNYWluQXR0cmlidXRlcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgaWZmIHRoZSBlbnRyeSBleGlzdHMgaW4gYSBjYXNlLXNlbnNpdGl2ZSBtYW5uZXI7IG1hbmlmZXN0IHZlcnNpb24gaXMKLQkgKiByZXF1aXJlZCBmb3IgdGhlIG1hbmlmZXN0IHRvIHNhdmUgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGlmZiB0aGUgZW50cnkgZXhpc3RzIGluIGEgY2FzZS1zZW5zaXRpdmUgbWFubmVyOyBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIGlzCi0JICogb3B0aW9uYWwgaW4gIHRoZSBtYW5pZmVzdAotCSAqICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVudHJpZXMgbm90IGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjbGFzcyBwYXRoIG9mIHRoaXMgbWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZUNsYXNzUGF0aChTdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNyZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoU3RyaW5nIGVudHJ5TmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KTsKLQotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbmF0aW9uVmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I3dyaXRlCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkMzY5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hbmlmZXN0IGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlTWFuaWZlc3RJbXBsIGV4dGVuZHMgamF2YS51dGlsLmphci5NYW5pZmVzdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IHsKLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3RJbXBsKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJlYWQoaXMpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFyY2hpdmVNYW5pZmVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtYW4KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IG1hbikgewotCQlzdXBlcihtYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gbmV3IEF0dHJpYnV0ZXMoKTsKLQkJYWRkRW50cnkoZW50cnlOYW1lLCBhdHRyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lLCBBdHRyaWJ1dGVzIGF0dHIpIHsKLQkJZ2V0RW50cmllcygpLnB1dChlbnRyeU5hbWUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlhZGRFbnRyeShlbnRyeU5hbWUpOwotCQlhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlhdHRyLnB1dFZhbHVlKGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpIHsKLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIG1hbmlmZXN0IGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgaWYKLQkJLy9UaGUgdmVyc2lvbiBpcyBub3Qgc2V0LiBJbiBhZGRpdGlvbiB0byBzYXZlcywgdGhlIHNlcmlhbGl6YXRpb24gaXMgdXNlZCBmb3IgY29weQotCQlpZiAoZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBnZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCXNldE1hbmlmZXN0VmVyc2lvbigiMS4wIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY2xhc3NQYXRoICE9IG51bGwpCi0JCQlzZXRDbGFzc1BhdGgoY2xhc3NQYXRoICsgIiAiICsgZXh0ZW5zaW9uKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXNldENsYXNzUGF0aChleHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc1BhdGgoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRWYWx1ZUlnbm9yZUtleUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSwgZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkgewotCQlTdHJpbmcgY2xhc3NQYXRoID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjbGFzc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRUb2tlbnMoY2xhc3NQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXkpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhdHRyLmdldFZhbHVlKGtleSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRWYWx1ZUlnbm9yZUtleUNhc2UoQXR0cmlidXRlcy5OYW1lLk1BSU5fQ0xBU1MudG9TdHJpbmcoKSwgZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5NQU5JRkVTVF9WRVJTSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgbWVyZ2VDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuTGlzdCBleGlzdGluZyA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGdldENsYXNzUGF0aFRva2VuaXplZCgpKTsKLQkJU3RyaW5nIGNwID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjcCAhPSBudWxsKQotCQkJc2IuYXBwZW5kKGNwKTsKLQkJYm9vbGVhbiBlbXB0eSA9IGNwID09IG51bGwgfHwgIiIuZXF1YWxzKGNwKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzUGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghZXhpc3RpbmcuY29udGFpbnMoY2xhc3NQYXRoRW50cmllc1tpXSkpIHsKLQkJCQlpZiAoIWVtcHR5KQotCQkJCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJZW1wdHkgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2xhc3NQYXRoRW50cmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJc2V0Q2xhc3NQYXRoKHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJZ2V0RW50cmllcygpLnJlbW92ZShlbnRyeU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIE9iamVjdCBrZXkpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0ci5yZW1vdmUoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCkgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlpZiAoYVNwYWNlRGVsaW1pdGVkUGF0aCA9PSBudWxsKQotCQkJYXR0cmlidXRlcy5yZW1vdmUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotCQllbHNlCi0JCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCksIGFTcGFjZURlbGltaXRlZFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoamF2YS5sYW5nLlN0cmluZyBjbGFzc05hbWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJYXR0cmlidXRlcy5yZW1vdmUoQXR0cmlidXRlcy5OYW1lLk1BSU5fQ0xBU1MpOwotCQllbHNlCi0JCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTLnRvU3RyaW5nKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTi50b1N0cmluZygpLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIE1hbmlmZXN0IHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLCBzcGxpdHRpbmcgZWFjaCBjbGFzc3BhdGggZW50cnkgb24gYSBsaW5lCi0JICogYnkgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVNwbGl0dGluZ0NsYXNzcGF0aChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCS8vIFdyaXRlIG91dCB0aGUgbWFpbiBhdHRyaWJ1dGVzIGZvciB0aGUgbWFuaWZlc3QKLQkJd3JpdGVNYWluU3BsaXR0aW5nQ2xhc3NwYXRoKGdldE1haW5BdHRyaWJ1dGVzKCksIGRvcyk7Ci0JCS8vIE5vdyB3cml0ZSBvdXQgdGhlIHByZS1lbnRyeSBhdHRyaWJ1dGVzCi0JCUl0ZXJhdG9yIGl0ID0gZ2V0RW50cmllcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoKFN0cmluZykgZS5nZXRLZXkoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJZG9zLndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJd3JpdGUoKEF0dHJpYnV0ZXMpIGUuZ2V0VmFsdWUoKSwgZG9zKTsKLQkJfQotCQlkb3MuZmx1c2goKTsKLQl9Ci0KLQkvKgotCSAqIFdyaXRlcyB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBvdXRwdXQgc3RyZWFtLiBYWFggTmVlZCB0byBoYW5kbGUgVVRGOAotCSAqIHZhbHVlcyBhbmQgYnJlYWsgdXAgbGluZXMgbG9uZ2VyIHRoYW4gNzIgYnl0ZXMKLQkgKiAKLQkgKiBAc2VlIEF0dHJpYnV0ZXMjd3JpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKChBdHRyaWJ1dGVzLk5hbWUpIGUuZ2V0S2V5KCkpLnRvU3RyaW5nKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCh0b1V0ZjgoKFN0cmluZykgZS5nZXRWYWx1ZSgpKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJb3Mud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJb3Mud3JpdGVCeXRlcygiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBXcml0ZXMgdGhlIGN1cnJlbnQgYXR0cmlidXRlcyB0byB0aGUgc3BlY2lmaWVkIGRhdGEgb3V0cHV0IHN0cmVhbSwgbWFrZSBzdXJlIHRvIHdyaXRlIG91dCB0aGUKLQkgKiBNQU5JRkVTVF9WRVJTSU9OIG9yIFNJR05BVFVSRV9WRVJTSU9OIGF0dHJpYnV0ZXMgZmlyc3QuCi0JICogCi0JICogQHNlZSBBdHRyaWJ1dGVzI3dyaXRlTWFpbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlTWFpblNwbGl0dGluZ0NsYXNzcGF0aChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlICotVmVyc2lvbiBoZWFkZXIgZmlyc3QsIGlmIGl0IGV4aXN0cwotCQlTdHJpbmcgdmVybmFtZSA9IEF0dHJpYnV0ZXMuTmFtZS5NQU5JRkVTVF9WRVJTSU9OLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gdG9VdGY4KGF0dHJpYnV0ZXMuZ2V0VmFsdWUodmVybmFtZSkpOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQl2ZXJuYW1lID0gQXR0cmlidXRlcy5OYW1lLlNJR05BVFVSRV9WRVJTSU9OLnRvU3RyaW5nKCk7Ci0JCQl2ZXJzaW9uID0gdG9VdGY4KGF0dHJpYnV0ZXMuZ2V0VmFsdWUodmVybmFtZSkpOwotCQl9Ci0KLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJb3V0LndyaXRlQnl0ZXModmVybmFtZSArICI6ICIgKyB2ZXJzaW9uICsgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyB3cml0ZSBvdXQgYWxsIGF0dHJpYnV0ZXMgZXhjZXB0IGZvciB0aGUgdmVyc2lvbgotCQkvLyB3ZSB3cm90ZSBvdXQgZWFybGllcgotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gKChBdHRyaWJ1dGVzLk5hbWUpIGUuZ2V0S2V5KCkpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoKHZlcnNpb24gIT0gbnVsbCkgJiYgIShuYW1lLmVxdWFsc0lnbm9yZUNhc2UodmVybmFtZSkpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpKSkgewotCQkJCQl3cml0ZVNwbGl0KG91dCwgbmFtZSwgdG9VdGY4KChTdHJpbmcpIGUuZ2V0VmFsdWUoKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQodG9VdGY4KChTdHJpbmcpIGUuZ2V0VmFsdWUoKSkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJCW91dC53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlvdXQud3JpdGVCeXRlcygiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVTcGxpdChEYXRhT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOwotCQlpbnQgaW5jID0gMDsKLQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQkJaWYgKGluYyA9PSAwKSB7Ci0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKLQkJCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKHRvay5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAodG9rLmNvdW50VG9rZW5zKCkgPiAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJb3V0LndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJaW5jKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpbmUgYnJlYWtzIHRvIGVuZm9yY2UgYSBtYXhpbXVtIDcyIGJ5dGVzIHBlciBsaW5lLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2NhbE1ha2U3MlNhZmUoU3RyaW5nQnVmZmVyIGxpbmUpIHsKLQkJaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPiA3MikgewotCQkJaW50IGluZGV4ID0gNzA7Ci0JCQkvLyBidWcgMjMzODAxIC0gd2UgYXJlIHNwbGl0dGluZyBldmVyeSA3MiBieXRlcywgYnV0IGFkZGluZyB0d28gYnl0ZXMgdG8gdGhlIGVuZCBvZiwgCi0JCQkvLyBhbmQgb25lIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgbGluZSBhZnRlciB0aGUgZmlyc3QKLQkJCXdoaWxlIChpbmRleCAtIDEgPCBsZW5ndGgpIHsKLQkJCQlpZiAobGluZS5jaGFyQXQoaW5kZXgpID09ICcgJykKLQkJCQl7Ci0JCQkJCWluZGV4LS07Ci0JCQkJfQotCQkJCWxpbmUuaW5zZXJ0KGluZGV4LCAiXHJcbiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ICs9IDcyOwotCQkJCWxlbmd0aCArPSAzOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVuYXRpb25WZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04udG9TdHJpbmcoKSwgdmVyc2lvbik7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIEVuY29kZXMgYSBkb3VibGUtYnl0ZSBzdHJpbmcgaW50byBVVEY4IGZvcm0uIEV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUKLSAgICAgKiByZXR1cm5lZCBzdHJpbmcgcmVwcmVzZW50cyBvbmUgYnl0ZSBvZiB0aGUgVVRGOCBlbmNvZGluZy4gCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9VdGY4KCBmaW5hbCBTdHJpbmcgc3RyICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggc3RyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSB1dGY4ID0gc3RyLmdldEJ5dGVzKCAiVVRGLTgiICk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyggdXRmOCwgMCwgMCwgdXRmOC5sZW5ndGggKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFmZGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDIvMDEgMjo1ODo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU9wdGlvbnMgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FYID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET00gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSAzOwotCi0JcHJpdmF0ZSBpbnQgcmVuZGVyZXJUeXBlID0gREVGQVVMVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTU9ERV9DT01QQVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTU9ERV9TUEVDID0gMTsKLQotCXByaXZhdGUgaW50IGNsYXNzTG9hZGluZ01vZGUgPSBMT0FEX01PREVfQ09NUEFUOwotCi0JCi0JLyoqCi0JICogTG9hZCBzdHJhdGVneSBmb3Igb3BlbmluZy9yZWFkaW5nIHRoZSBhcmNoaXZlOyBvcHRpb25hbCAtIGlmIG51bGwgYSBsb2FkIHN0cmF0ZWd5IHdpbGwgYmUKLQkgKiBjcmVhdGVkIHdoZW4gdGhlIGFyY2hpdmUgaXMgb3BlbmVkCi0JICovCi0JcHJpdmF0ZSBMb2FkU3RyYXRlZ3kgbG9hZFN0cmF0ZWd5OwotCS8qKgotCSAqIEluZGljYXRvciBmb3Igd2hldGhlciBhdXRvIGphdmEgcmVmbGVjdGlvbiBzaG91bGQgYmUgdHVybmVkIG9uIGluIHRoZSBhcmNoaXZlIC0gZGVmYXVsdHMgdG8KLQkgKiB0cnVlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVzZUphdmFSZWZsZWN0aW9uID0gdHJ1ZTsKLQkvKioKLQkgKiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgdGhlIGFyY2hpdmUgd2lsbCBiZSBtb2RpZmllZCBhZnRlciBvcGVuaW5nIG9yIGlmIGl0IGlzIGp1c3QgYmVpbmcKLQkgKiBvcGVuZWQsIHJlYWQsIHNhdmVkIHRvIGEgbmV3IGxvY2F0aW9uOyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCB0ZW1wIGZpbGUgY3JlYXRpb24KLQkgKiBhbmQgc2F2aW5nIG9mIGluZGl2aWR1YWwgZmlsZXMgd2l0aGluIGEgbmVzdGVkIGFyY2hpdmUgaWYgdGhlIG5lc3RlZCBhcmNoaXZlIHdpbGwgbm90IGNoYW5nZSAtCi0JICogZGVmYXVsdHMgdG8gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCS8qKgotCSAqIEluZGljYXRvciBmb3Igd2hldGhlciBhIGxpYmFyeSBuZXN0ZWQgaW4gYW5vdGhlciBhcmNoaXZlIChlZywgdXRpbGl0eSBKQVJzIGluIGFuIEVBUikgd2lsbCBiZQotCSAqIHNhdmVkIG91dCBhcyBhbiBvcmRpbmFyeSBmaWxlIG9yIGFzIGEgbmVzdGVkIEFyY2hpdmUuIFdoZW4gbG9hZGVkIGludG8gbWVtb3J5IHRoZXNlIGZpbGVzIGFyZQotCSAqIHRyZWF0ZWQgYXMgQXJjaGl2ZXMsIHRvIHN1cHBvcnQgZHluYW1pYyBjbGFzcyBsb2FkaW5nIGZvciBKYXZhIHJlZmxlY3Rpb24gb2YgY2xhc3NlcyBpbgotCSAqIEVKQkphckZpbGVzIGFuZCBkZXBlbmRlbnQgSkFScy4gQW4gYXJjaGl2ZSBvcGVuZWQgZm9yIGVkaXQsIGVpdGhlciBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKLQkgKiBmaWxlcyBvciBjaGFuZ25pbmcgdGhlIE1hbmlmZXN0IG9yIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLCB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGZpbGUgb25lCi0JICogZmlsZSBhdCBhIHRpbWUuIFRoZSBkZWZhdWx0IGZvciB0aGlzIGZsYWcgaXMgdHJ1ZTsgaXQgb25seSBhcHBsaWVzIHRvIGxpYnJhcnkgQXJjaGl2ZXMsIG5vdAotCSAqIGluc3RhbmNlcyBvZiBNb2R1bGVGaWxlLiBJZiB5b3Ugd2lzaCB0byBlZGl0IGEgbmVzdGVkIGxpYnJhcnksIHNldCB0aGlzIGZsYWcgdG8gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZUxpYnJhcmllc0FzRmlsZXMgPSB0cnVlOwotCi0KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcyA9IHRydWU7Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBuZXN0ZWQgYXJjaGl2ZXMgYXJlIHRyZWF0ZWQgYXMgcHJpbWl0aXZlIGFyY2hpdmVzIGFuZCBhcmUgbm90IHBpcGVkIHRocm91Z2ggdGhlCi0JICogZGlzY3JpbWluYXRvciB0cmVlIG9uIHRoZSBhcmNoaXZlIGZhY3Rvcnk7IG1vZHVsZSBmaWxlcyBpbiBhbiBFQVIgYXJlIG9wZW5lZCB1c2luZyB0aGUKLQkgKiBzcGVjaWZpYyBvcGVuIG1ldGhvZHMgb24gdGhlIGZhY3Rvcnk7IGNoYW5nZSB0aGlzIGZsYWcgaWYgeW91J2QgbGlrZSBuZXN0ZWQgYXJjaGl2ZXMgdG8gYmUKLQkgKiBkaXNjcmltaW5hdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIE1hcCByZWFkT25seUZsYWdzOwotCi0JLyoqCi0JICogQXJjaGl2ZU9wdGlvbnMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU9wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLCBzZXR0aW5nIHRoZSBsb2FkU3RyYXRlZ3kgdG8gbnVsbAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXJldHVybiBjbG9uZVdpdGgobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLCBzZXR0aW5nIHRoZSBsb2FkU3RyYXRlZ3kgdG8gbnVsbAotCSAqLwotCXB1YmxpYyBBcmNoaXZlT3B0aW9ucyBjbG9uZVdpdGgoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kpIHsKLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIHJlc3VsdCA9IChBcmNoaXZlT3B0aW9ucykgc3VwZXIuY2xvbmUoKTsKLQkJCXJlc3VsdC5zZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCQlyZXN1bHQucmVhZE9ubHlGbGFncyA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zIGNsb25lV2l0aChMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgewotCQlBcmNoaXZlT3B0aW9ucyByZXN1bHQgPSBjbG9uZVdpdGgoYUxvYWRTdHJhdGVneSk7Ci0JCXJlc3VsdC5zZXRJc1JlYWRPbmx5KGlzUmVhZE9ubHkodXJpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRMb2FkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBsb2FkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xOC8yMDAxIDI6NDI6MTEgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcygpIHsKLQkJcmV0dXJuIHNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIG5ld0lzUmVhZE9ubHkpIHsKLQkJaXNSZWFkT25seSA9IG5ld0lzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIHJlYWRPbmx5LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChyZWFkT25seUZsYWdzID09IG51bGwpCi0JCQlyZWFkT25seUZsYWdzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVhZE9ubHlGbGFncy5wdXQodXJpLCBuZXcgQm9vbGVhbihyZWFkT25seSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoU3RyaW5nIHVyaSkgewotCQlpZiAocmVhZE9ubHlGbGFncyAhPSBudWxsKSB7Ci0JCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgcmVhZE9ubHlGbGFncy5nZXQodXJpKTsKLQkJCWlmIChib29sICE9IG51bGwpCi0JCQkJcmV0dXJuIGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9hZFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBuZXdMb2FkU3RyYXRlZ3kpIHsKLQkJbG9hZFN0cmF0ZWd5ID0gbmV3TG9hZFN0cmF0ZWd5OwotCQlsb2FkU3RyYXRlZ3kuc2V0UmVhZE9ubHkoaXNSZWFkT25seSgpKTsKLQkJbG9hZFN0cmF0ZWd5LnNldFJlbmRlcmVyVHlwZShnZXRSZW5kZXJlclR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xOC8yMDAxIDI6NDI6MTEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1NhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlT25seURpcnR5TW9mUmVzb3VyY2VzKGJvb2xlYW4gbmV3U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcykgewotCQlzYXZlT25seURpcnR5TW9mUmVzb3VyY2VzID0gbmV3U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VKYXZhUmVmbGVjdGlvbihib29sZWFuIG5ld1VzZUphdmFSZWZsZWN0aW9uKSB7Ci0JCXVzZUphdmFSZWZsZWN0aW9uID0gbmV3VXNlSmF2YVJlZmxlY3Rpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlSmF2YVJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiB1c2VKYXZhUmVmbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzYXZlTGlicmFyaWVzQXNGaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpIHsKLQkJcmV0dXJuIHNhdmVMaWJyYXJpZXNBc0ZpbGVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNhdmVMaWJyYXJpZXNBc0ZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBzYXZlTGlicmFyaWVzQXNGaWxlcwotCSAqICAgICAgICAgICAgVGhlIHNhdmVMaWJyYXJpZXNBc0ZpbGVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVMaWJyYXJpZXNBc0ZpbGVzKGJvb2xlYW4gc2F2ZUxpYnJhcmllc0FzRmlsZXMpIHsKLQkJdGhpcy5zYXZlTGlicmFyaWVzQXNGaWxlcyA9IHNhdmVMaWJyYXJpZXNBc0ZpbGVzOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKCkgewotCQlyZXR1cm4gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMuCi0JICogCi0JICogQHBhcmFtIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzCi0JICogICAgICAgICAgICBUaGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoYm9vbGVhbiBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcykgewotCQl0aGlzLmRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzID0gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW5kZXJlclR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRSZW5kZXJlclR5cGUoKSB7Ci0JCXJldHVybiByZW5kZXJlclR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJlbmRlcmVyVHlwZSBhbGxvd3MgYSB1c2VyIHRvIG92ZXJyaWRlIHRoZSByZW5kZXJlciB1c2VkIGJ5IENvbW1vbiBBcmNoaXZlIGZvciBzcGVjaWFsCi0JICogY2FzZXMgaW4gdGhlIFVJIHdoZXJlIHlvdSByZWFsbHkgd2FudCB0byB1c2UgYSBub24tc3luY2hyb25pemluZyByZW5kZXJlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuZGVyZXJUeXBlCi0JICogICAgICAgICAgICBUaGUgcmVuZGVyZXJUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoaW50IHJlbmRlcmVyVHlwZSkgewotCQl0aGlzLnJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDbGFzc0xvYWRpbmdNb2RlKCkgewotCQlyZXR1cm4gY2xhc3NMb2FkaW5nTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZCB2YWx1ZXMgYXJlIExPQURfTU9ERV9DT01QQVQgb3IgTE9BRF9NT0RFX1NQRUMuIFRoZSBkZWZhdWx0IGlzIExPQURfTU9ERV9DT01QQVQuIFRoaXMKLQkgKiBmbGFnIGlzIHRvIHNldCB0aGUgY2xhc3MgbG9hZGluZyBtb2RlOyB0aGUgZGVmYXVsdCBpcyBMT0FEX01PREVfQ09NUEFUIGZvciBiYWNrd2FyZHMKLQkgKiBjb21wYXRpYmlsaXR5LCB3aGlsZSBMT0FEX01PREVfU1BFQyB3aWxsIGVuZm9yY2Ugc3BlYyBkZWZpbmVkIGNsYXNzIGxvYWRpbmcuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTG9hZGluZ01vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRpbmdNb2RlKGludCBjbGFzc0xvYWRpbmdNb2RlKSB7Ci0JCXRoaXMuY2xhc3NMb2FkaW5nTW9kZSA9IGNsYXNzTG9hZGluZ01vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzY1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBhbiBBUEkgZm9yIG9wZW5pbmcgYXJjaGl2ZXMuIFRoZSB7QGxpbmsgQ29tbW9uQXJjaGl2ZUZhY3Rvcnl9Ci0gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcm9vdCBsZXZlbCBkaXNjcmltaW5hdG9yIHRvIG9wZW4gYW4gYXJjaGl2ZS4gVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIGFwaQotICogaXMgaXQgYWxsb3dzIGV4dGVuZGVkIHRlYW1zIG9yIHRoaXJkIHBhcnRpZXMgdG8gcGx1ZyBpbiB0byB0aGUgZnJhbWV3b3JrIHRvIGFsbG93IHNwZWNpYWxpemVkCi0gKiBraW5kcyBvZiBqYXIgZmlsZXMgZG8gYmUgZGlzY2VybmVkIGF0IGNyZWF0aW9uL29wZW4gdGltZSB3aXRob3V0IHRoZSBjbGllbnQgaGF2aW5nIHRvIHByb3ZpZGUgYQotICogbG90IG9mIGxvZ2ljLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgd291bGQgc2ltcGx5IHdyaXRlCi0gKiA8Y29kZT4oKENvbW1vbkFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbkFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW4oYVN0cmluZyk8Y29kZT4sIGFuZCBnZXQgYmFjayAKLSAqIHRoZSBjb3JyZWN0IGtpbmQgb2YgYXJjaGl2ZSBpbnN0YW5jZS4gIEEgZGlzY3JpbWluYXRvciBjb250YWlucyBjaGlsZHJlbiwgd2hpY2ggaXMgYW4gb3JkZXJlZCBsaXN0IG9mIGRpc2NyaW1pbmF0b3JzLCBlYWNoIG9mIHdoaWNoIAotICogY2FuIGhhdmUgaXRzIHR1cm4gdG8gZGV0ZXJtaW5lIGlmIGl0IGNhbiBvcGVuIGFuIGFyY2hpdmUuICBUaGUgZmlyc3Qgb25lIHRvIHN1Y2NlZWQgd2lucy4gIE9uY2UgYSBkaXNjcmltaW5hdG9yIGRldGVybWluZXMgdGhhdCBpdAotICogY2FuIG9wZW4gYW4gYXJjaGl2ZSwgaXQgZ2l2ZXMgZWFjaCBvZiBpdHMgY2hpbGRyZW4gdGhlIG9wcG9ydHVudGl0eSB0byBkbyBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYywgYW5kIHNvIG9uLiBJbiB0aGUgYmFzZQotICogaW1wbGVtZW50YXRpb24sIGRpc2NyaW1pbmF0b3JzIGFyZSBkZWZpbmVkIGFzIHNpbmdsZSBpbnN0YW5jZXMgb2YgYW4gaW5uZXIgY2xhc3MgZm9yIGVhY2ggaW1wb3J0IHN0cmF0ZWd5LiAgVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIAotICogaG93IHRvIHJlZ2lzdGVyIGEgZGlzY3JpbWluYXRvciBmb3IgYSBzcGVjaWFsaXplZCBFSkJKYXJGaWxlOiAKLSAqIDxjb2RlPkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKS5hZGRDaGlsZChhRGlzY3JpbWluYXRvcik7PC9jb2RlPgotICogVGhpcyB3b3VsZCBiZSBkb25lIGFzIGFuIGluaXRpYWxpemF0aW9uIGF0IHN0YXJ0dXAgdGltZS4gIElmIHRoZSBjaGlsZCBkaXNjcmltaW5hdG9yIGlzIGV2ZXIgaW52b2tlZCwgdGhlIHBhcmVudCB3aWxsIGhhdmUgYWxyZWFkeQotICogZGV0ZXJtaW5lZCB0aGF0IHRoZSBhcmNoaXZlIGlzIGFuIEVKQkphckZpbGUgYW5kIHdpbGwgaGF2ZSBjb252ZXJ0ZWQgaXQgdG8gdGhhdCB0eXBlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgcHJlZGVjZXNzb3IgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRBZnRlcihBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQsIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBwcmVkZWNlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBzdWNjZXNzb3IgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRCZWZvcmUoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc3VjY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0ZXN0cyBvbiB0aGUgYXJjaGl2ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdGhlIGtpbmQgdGhpcyBkaXNjcmltaW5hdG9yIGlzIGludGVyZXN0ZWQKLQkgKiBpbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgdGhlIGltcG9ydCBzdHJhdGVneSBmb3IgYSBjb252ZXJ0ZWQgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyB0byBiZSBwcmVzZW50ZWQgZWl0aGVyIHRocm91Z2ggYW4gZXhjZXB0aW9uIG9yIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHNwZWNpZmljCi0JICoga2luZCBvZiBhcmNoaXZlIGlzIGV4cGVjdGVkIGFuZCB0aGlzIGRpc2NyaW1pbmF0b3IgY2FuJ3Qgb3BlbiBpdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBQb2ludCBvZiBlbnRyeSBmb3IgYXR0ZW1wdGluZyB0byBvcGVuIGFuIGFyY2hpdmUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udmVydGVkIGFyY2hpdmUgb3IgbnVsbCBpZiB0aGlzIGRpc2NyaW1pbmF0b3IgY2FuJ3QgY29udmVydCBpdAotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0NmIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQHNlZSBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuOwotCi0JcHVibGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCkgewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlnZXRDaGlsZHJlbigpLmFkZChjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQWZ0ZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHByZWRlY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSBnZXRDaGlsZHJlbigpLmluZGV4T2YocHJlZGVjZXNzb3IpOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJaW5kZXgrKzsKLQkJCWdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24ocHJlZGVjZXNzb3IudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRCZWZvcmUoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc3VjY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQlpZiAoaGFzQ2hpbGQoY2hpbGQpKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSBnZXRDaGlsZHJlbigpLmluZGV4T2Yoc3VjY2Vzc29yKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWdldENoaWxkcmVuKCkuYWRkKGluZGV4LCBjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3VjY2Vzc29yLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIEFyY2hpdmUgY29udmVydChBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBkZXN0aW5hdGlvbiA9IGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKTsKLQotCQkvL3R1cm4gb2Ygbm90aWZpY2F0aW9ucwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCWRlc3RpbmF0aW9uLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkvL0NvcHkgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMKLQkJZGVzdGluYXRpb24uc2V0VVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldE9yaWdpbmFsVVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldFNpemUoYW5BcmNoaXZlLmdldFNpemUoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldExhc3RNb2RpZmllZChhbkFyY2hpdmUuZ2V0TGFzdE1vZGlmaWVkKCkpOwotCi0JCWRlc3RpbmF0aW9uLnNldExvYWRTdHJhdGVneShhbkFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlkZXN0aW5hdGlvbi5zZXRPcHRpb25zKGFuQXJjaGl2ZS5nZXRPcHRpb25zKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRFeHRyYUNsYXNzcGF0aChhbkFyY2hpdmUuZ2V0RXh0cmFDbGFzc3BhdGgoKSk7Ci0JCWlmIChkZXN0aW5hdGlvbi5pc01vZHVsZUZpbGUoKSkgewotCQkJSW1wb3J0U3RyYXRlZ3kgaW1wb3J0U3RyYXRlZ3kgPSBjcmVhdGVJbXBvcnRTdHJhdGVneShhbkFyY2hpdmUsIGRlc3RpbmF0aW9uKTsKLQkJCSgoTW9kdWxlRmlsZSkgZGVzdGluYXRpb24pLnNldEltcG9ydFN0cmF0ZWd5KGltcG9ydFN0cmF0ZWd5KTsKLQkJfQotCi0KLQotCQkvL3R1cm4gbm90aWZpY2F0aW9ucyBiYWNrIG9uCi0JCWRlc3RpbmF0aW9uLmVTZXREZWxpdmVyKHRydWUpOwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcih0cnVlKTsKLQotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKTsKLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBhbmQgYXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBhcmNoaXZlIHRvIHRoZSBjaGlsZCdzIHR5cGU7IHJldHVybiB0aGUKLQkgKiBjb252ZXJ0ZWQgYXJjaGl2ZSBmcm9tIHRoZSBmaXJzdCBjaGlsZCB0aGF0IHN1Y2NlZWRzLCBvciBudWxsIGlmIG5vIGNoaWxkIHN1Y2NlZWRzIG9yIG5vCi0JICogY2hpbGQgZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIEFyY2hpdmUgZ2V0SW1wb3J0YWJsZUFyY2hpdmVGcm9tQ2hpbGQoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGFzQ2hpbGRyZW4oKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCUFyY2hpdmUgY2hpbGRDb252ZXJ0ZWRBcmNoaXZlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkID0gKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcikgdGhlQ2hpbGRyZW4uZ2V0KGkpOwotCQkJY2hpbGRDb252ZXJ0ZWRBcmNoaXZlID0gY2hpbGQub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJCWlmIChjaGlsZENvbnZlcnRlZEFyY2hpdmUgIT0gbnVsbCkgewotCQkJCXJldHVybiBjaGlsZENvbnZlcnRlZEFyY2hpdmU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYbWxERE1lc3NhZ2UoU3RyaW5nIGFyY2hpdmVUeXBlLCBTdHJpbmcgZGRVcmkpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuaW52YWxpZF9hcmNoaXZlX0VYQ18sIChuZXcgT2JqZWN0W117YXJjaGl2ZVR5cGUsIGRkVXJpfSkpOyAvLyA9ICJBcmNoaXZlIGlzIG5vdCBhIHZhbGlkIHswfSBiZWNhdXNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIG5vdCBiZSBmb3VuZCAoY2FzZSBzZW5zaXRpdmUpOiB7MX0iCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MpIHsKLQkJcmV0dXJuIGhhc0NoaWxkcmVuKCkgJiYgZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhkaXNjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuSW1wb3J0KGFuQXJjaGl2ZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFyY2hpdmUgY29udmVydGVkQXJjaGl2ZSA9IGNvbnZlcnQoYW5BcmNoaXZlKTsKLQkJQXJjaGl2ZSBjaGlsZENvbnZlcnRlZEFyY2hpdmUgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZyb21DaGlsZChjb252ZXJ0ZWRBcmNoaXZlKTsKLQkJaWYgKGNoaWxkQ29udmVydGVkQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNoaWxkQ29udmVydGVkQXJjaGl2ZTsKLQkJcmV0dXJuIGNvbnZlcnRlZEFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkKSB7Ci0JCWdldENoaWxkcmVuKCkucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihqYXZhLnV0aWwuTGlzdCBuZXdDaGlsZHJlbikgewotCQljaGlsZHJlbiA9IG5ld0NoaWxkcmVuOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2OGJmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHVzZWQgZm9yIGxvYWRpbmcgb2YgbW9mIHJlc291cmNlcyBjb250YWluZWQgd2l0aGluIGFuIGFyY2hpdmU7IGtub3dzIGhvdyB0byByZXRyaWV2ZQotICogYW4gaW5wdXQgc3RyZWFtIGZvciBhIGdpdmVuIHVyaQotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBmaWxlUHJvdG9jb2wgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBwbGF0Zm9ybVByb3RvY29sID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGluRmlsZXBhdGgsIG91dEZpbGVwYXRoOwotCi0JcHVibGljIEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgYW5BcmNoaXZlLCBTdHJpbmcgcmVzb3VyY2VzUGF0aCkgewotCQlzZXRBcmNoaXZlKGFuQXJjaGl2ZSk7Ci0JCXRoaXMucmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCXNldElucHV0RmlsZXBhdGgocmVzb3VyY2VzUGF0aCk7Ci0JCVN0cmluZyBvdXRwYXRoID0gcmVzb3VyY2VzUGF0aDsKLQkJaWYgKG91dHBhdGggPT0gbnVsbCkgewotCQkJTG9hZFN0cmF0ZWd5IGwgPSBhbkFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0JCQlpZiAobCAhPSBudWxsICYmIGwuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCW91dHBhdGggPSBsLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0T3V0cHV0RmlsZXBhdGgob3V0cGF0aCk7Ci0JfQotCi0JLyoqIFRoZSBhcmNoaXZlIGZyb20gd2hpY2ggcmVzb3VyY2VzIHdpbGwgYmUgbG9hZGVkICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgYXJjaGl2ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlc1BhdGg7Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlpZiAocmVzb3VyY2VzUGF0aCAhPSBudWxsKQotCQkJaW4gPSBtYWtlSW5wdXRTdHJlYW0odXJpKTsKLQkJaWYgKGluICE9IG51bGwpCi0JCQlyZXR1cm4gaW47Ci0JCXJldHVybiBnZXRBcmNoaXZlKCkuZ2V0SW5wdXRTdHJlYW0odXJpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCWFyY2hpdmUgPSBuZXdBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlc1BhdGguCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXNvdXJjZXNQYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNQYXRoCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2VzUGF0aCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXNQYXRoKFN0cmluZyByZXNvdXJjZXNQYXRoKSB7Ci0JCXRoaXMucmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCXNldElucHV0RmlsZXBhdGgocmVzb3VyY2VzUGF0aCk7Ci0JCXNldE91dHB1dEZpbGVwYXRoKHJlc291cmNlc1BhdGgpOwotCX0KLQotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJcmV0dXJuICgoVVJJQ29udmVydGVySW1wbC5VUklNYXApZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnB1dCBmaWxlIHBhdGggY29uc2lzdHMgb2YgYSBzdHJpbmcgb2YgZGlyZWN0b3JpZXMgb3IgemlwIGZpbGVzIHNlcGFyYXRlZCBieSBzZW1pLWNvbG9ucwotCSAqIHRoYXQgYXJlIHNlYXJjaGVkIHdoZW4gYW4gaW5wdXQgc3RyZWFtIGlzIGNvbnN0cnVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlcGF0aCgpIHsKLQkJcmV0dXJuIGluRmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVwYXRoCi0JICogICAgICAgICAgICBUaGUgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRGaWxlcGF0aChTdHJpbmcgZmlsZXBhdGgpIHsKLQkJaW5GaWxlcGF0aCA9IGZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIG91dHB1dCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVwYXRoKCkgewotCQlyZXR1cm4gb3V0RmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogVGhlIG91dHB1dCBmaWxlIHBhdGggaXMgdGhlIHBhdGggbmFtZSBvZiBhIGRpcmVjdG9yeSB0byBwcmVwZW5kIHRvIHJlbGF0aXZlIGZpbGUgcGF0aCBuYW1lcwotCSAqIHdoZW4gYW4gb3V0cHV0IHN0cmVhbSBpcyBjb25zdHJ1Y3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZXBhdGgoU3RyaW5nIGZpbGVwYXRoKSB7Ci0JCW91dEZpbGVwYXRoID0gZmlsZXBhdGg7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgVVJJIHRvIGFuIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIG1ha2VJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkkgY29udmVydGVkID0gdXJpOwotCi0JCWlmICgoZmlsZVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpIHx8IGNvbnZlcnRlZC5zY2hlbWUoKSA9PSBudWxsKSAmJiBpbkZpbGVwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBzZWFyY2hGaWxlUGF0aChjb252ZXJ0ZWQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJVVJMIHVybCA9IGNyZWF0ZVVSTChjb252ZXJ0ZWQudG9TdHJpbmcoKSk7Ci0JCVVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQlyZXR1cm4gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCB0aGUgZmlsZSBwYXRoIGlmIHRoZSBmaWxlIHBvcnRpb24gb2YgdGhlIFVSTCBpcyBub3QgYWJzb2x1dGUgKGRvZXMgbm90IGJlZ2luIHdpdGggIi8iOwotCSAqIG90aGVyd2lzZSwgYXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gc2VhcmNoRmlsZVBhdGgoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluRmlsZXBhdGgsICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGYgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCVppcEZpbGUgemYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6ZiA9IEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQlpZiAoemYgIT0gbnVsbCkgewotCQkJCWluID0gc2VhcmNoWmlwRmlsZSh6ZiwgZmlsZW5hbWUpOwotCQkJCWlmIChpbiA9PSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJemYuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW4gPSBzZWFyY2hEaXJlY3RvcnkoZiwgZmlsZW5hbWUpOwotCQkJfQotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJcmV0dXJuIGluOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciB0aGUgZmlsZSB3aXRoIHRoZSByZWxhdGl2ZSBwYXRoIG5hbWUgb2YgZmlsZW5hbWUgZXhpc3RzIGluIHRoZQotCSAqIGdpdmVuIGRpcmVjdG9yeS4gSWYgbm90LCBpdCByZXR1cm5zIG51bGw7IG90aGVyd2lzZSwgaXQgb3BlbnMgdGhlIGZpbGUgdXAgYW5kIHJldHVybnMgdGhlCi0JICogaW5wdXQgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGphdmEuaW8uSW5wdXRTb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gc2VhcmNoRGlyZWN0b3J5KFN0cmluZyBkaXIsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGRpci5lcXVhbHMoIi4iKSkgLy8kTk9OLU5MUy0xJAotCQkJZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgZiA9IG5ldyBGaWxlKGRpciArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGZpbGVuYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgWmlwRW50cnkgd2hvc2UgbmFtZSBpcyBmaWxlbmFtZSBpbiB0aGUgZ2l2ZW4KLQkgKiBaaXBGaWxlLiBJZiBub3QsIGl0IHJldHVybnMgbnVsbDsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIGFuIGlucHV0IHNvdXJjZSB0byByZWFkIGZyb20gdGhlCi0JICogWmlwRW50cnkuCi0JICogCi0JICogQHBhcmFtIHppcAotCSAqICAgICAgICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlCi0JICogQHJldHVybiBqYXZhLmlvLklucHV0U291cmNlCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIHNlYXJjaFppcEZpbGUoWmlwRmlsZSB6aXAsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgZW50cnkgPSB6aXAuZ2V0RW50cnkoZmlsZW5hbWUpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGEgVVJMIGZyb20gdGhlIHVyaTsgaWYgdGhlIGF0dGVtcHQgZmFpbHMsIGF0dGVtcHQgdG8gYXBwZW5kICJmaWxlOiIgdG8gdGhlIFVSSTsgaWYgdGhlCi0JICogYXR0ZW1wdCBzdGlsbCBmYWlscywgYXR0ZW1wdCB0byByZXBsYWNlIHRoZSBwcm90b2NvbCB3aXRoIHRoZSBmaWxlIHByb3RvY29sLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdXJpCi0JICovCi0JcHVibGljIFVSTCBjcmVhdGVVUkwoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCU1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtID0gbnVsbDsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbSA9IChNYWxmb3JtZWRVUkxFeGNlcHRpb24pIGU7Ci0JCX0KLQkJaWYgKHVybCAhPSBudWxsKQotCQkJcmV0dXJuIHVybDsKLQkJLy8gRWl0aGVyIHRyZWF0IHRoZSBVUkkgYXMgYSBmaWxlcGF0aCAoaWYgdGhlcmUgYXJlIG5vIDogb3IKLQkJLy8gYSA6IGluIHBvc2l0aW9uIDEpIG9yIHJlcGxhY2UgdGhlIGdpdmVuIHByb3RvY29sIHdpdGggdGhlCi0JCS8vIGZpbGUgcHJvdG9jb2wuCi0JCWludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID09IDEpCi0JCQl1cmkgPSBmaWxlUHJvdG9jb2wgKyAiOiIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoaW5kZXggPiAwKQotCQkJdXJpID0gZmlsZVByb3RvY29sICsgIjoiICsgdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJldHVybiB1cmw7Ci0JCXRocm93IG07Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgVVJJIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHVyaQotCSAqLwotCXB1YmxpYyBPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVVSSSBjb252ZXJ0ZWQgPSB1cmk7Ci0JCWlmIChwbGF0Zm9ybVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpKSB7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSByZXNvbHZlUGxhdGZvcm0obmV3IFVSTChjb252ZXJ0ZWQudG9TdHJpbmcoKSkpOwotCQkJaWYgKHJlc29sdmVkVVJMICE9IG51bGwpIHsKLQkJCQljb252ZXJ0ZWQgPSBVUkkuY3JlYXRlRmlsZVVSSShyZXNvbHZlZFVSTC5nZXRGaWxlKCkpOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlUHJvdG9jb2wuZXF1YWxzKGNvbnZlcnRlZC5zY2hlbWUoKSkgfHwgY29udmVydGVkLnNjaGVtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBvcGVuRmlsZU91dHB1dFN0cmVhbShjb252ZXJ0ZWQpOwotCQl9Ci0JCVVSTCB1cmwgPSBjcmVhdGVVUkwoY29udmVydGVkLnRvU3RyaW5nKCkpOwotCQlVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJdXJsQ29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKLQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFVSTCByZXNvbHZlUGxhdGZvcm0oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbGV0IFdvcmtiZW5jaFVSSUNvbnZlcnRlciBpbXBsZW1lbnQgdGhpcyBvbmUuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBmaWxlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiB1cmkgKHRoZSB1cmkgaGFzIGZpbGUgcHJvdG9jb2wpLiBJZiBhbiBvdXRwdXQgZmlsZQotCSAqIHBhdGggaXMgc3BlY2lmaWVkIGFuZCB0aGUgZmlsZSBuYW1lIGlzIHJlbGF0aXZlLCBwcmVwZW5kIHRoZSBvdXRwdXQgZmlsZSBwYXRoIHRvIHRoZSBmaWxlCi0JICogbmFtZS4gTWFrZSB0aGUgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIHRoZSBmaWxlIGlmIHRoZXkgZG8gbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3BlbkZpbGVPdXRwdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKTsKLQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSAmJiBvdXRGaWxlcGF0aCAhPSBudWxsKSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUob3V0RmlsZXBhdGggKyBGaWxlLnNlcGFyYXRvciArIHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJU3RyaW5nIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJbmV3IEZpbGUocGFyZW50KS5ta2RpcnMoKTsKLQkJfQotCQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9FeHBvcnRTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9FeHBvcnRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWIwODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRXhwb3J0U3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuQXJjaGl2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLQotCi0KLS8qKgotICogRXhwb3J0U3RyYXRlZ3kga25vd3Mgd2hhdCB0byBkbyBqdXN0IGJlZm9yZSBhIGR1bXAgb2YgYW4gYXJjaGl2ZSBpcyBhYm91dCB0byBvY2N1ciwgdHlwaWNhbGx5Ci0gKiBhZGRpbmcgaXRlbXMgc3VjaCBhcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFuZCBzdWNoLiBUaGlzIHByb3ZpZGVzIGEgZGVsZWdhdGlvbiBtb2RlbCBmb3IKLSAqIGFyY2hpdmUvdmVyc2lvbi9wbGF0Zm9ybSBzcGVjaWZpYyBydWxlcyBhYm91dCB3aGljaCByZXNvdXJjZXMgZXRjIG5lZWQgdG8gYmUgZXhwb3J0ZWQuIENsaWVudHMKLSAqIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZCAicGx1ZyBpbiIgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gYXJjaGl2ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHBvcnRTdHJhdGVneSBleHRlbmRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RyYXRlZ3kgaGFzIGFscmVhZHkgc2F2ZWQgYSBmaWxlIGVudHJ5IGhhdmluZyBhIHVyaSBuYW1lZCBieSB0aGUKLQkgKiBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTYXZlZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFRoZSBhcmNoaXZlIGlzIHNhdmluZyBpdHNlbGYsIGFuZCBnaXZpbmcgdGhlIGV4cG9ydCBzdHJhdGVneSB0aGUgb3Bwb3J0dW5pdHkgdG8gZG8gd2hhdGV2ZXIKLQkgKiBpdCBuZWVkcyB0byBkby4gVGhlIGV4cG9ydCBzdHJhdGVneSBtYXkgd3JpdGUgZW50cmllcyBkaXJlY3RseSB0byB0aGUgU2F2ZVN0cmF0ZWd5LCBidXQgaWYgaXQKLQkgKiBkb2VzLCBpdCBzaG91bGQgcmVtZW1iZXIgdGhlIG5hbWVzIG9mIHRoZXNlIGVudHJpZXMgc28gdGhlIGFyY2hpdmUgZG9lcyBub3QgYXR0ZW1wdCB0bwotCSAqIGR1cGxpY2F0ZSBieSBzYXZpbmcgYW4gZW50cnkgd2l0aCB0aGUgc2FtZSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI5YjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMToyMDowOSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGV4dGVuZHMgU2F2ZUZpbHRlckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgewotCXByb3RlY3RlZCBTZXQgZXhjbHVkZWRFeHRlbnNpb25zOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCXByb3RlY3RlZCBTZXQgZXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2U7Ci0KLQkvKioKLQkgKiBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsKFN0cmluZ1tdIGV4dGVuc2lvbnNUb0V4Y2x1ZGUsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlzdXBlcigpOwotCQlTZXQgZXh0ZW5zaW9ucyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNUb0V4Y2x1ZGUubGVuZ3RoOyBpKyspIHsKLQkJCWV4dGVuc2lvbnMuYWRkKGV4dGVuc2lvbnNUb0V4Y2x1ZGVbaV0pOwotCQl9Ci0JCXNldEV4Y2x1ZGVkRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJc2V0SXNDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbChTdHJpbmcgZXh0ZW5zaW9uLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJc3VwZXIoKTsKLQkJU2V0IGV4dGVuc2lvbnMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoMSk7Ci0JCWV4dGVuc2lvbnMuYWRkKGV4dGVuc2lvbik7Ci0JCXNldEV4Y2x1ZGVkRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJc2V0SXNDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbChTZXQgZXh0ZW5zaW9uc1RvRXhjbHVkZSwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEV4Y2x1ZGVkRXh0ZW5zaW9ucyhleHRlbnNpb25zVG9FeGNsdWRlKTsKLQkJc2V0SXNDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMToyNDoyOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXRFeGNsdWRlZEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBleGNsdWRlZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMjo0MjoyMCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlNldCBnZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZSgpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChpc0Nhc2VTZW5zaXRpdmUoKSkKLQkJCXJldHVybjsKLQotCQlqYXZhLnV0aWwuSGFzaFNldCBhU2V0ID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGdldEV4Y2x1ZGVkRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWFTZXQuYWRkKCgoU3RyaW5nKSBpdC5uZXh0KCkpLnRvVXBwZXJDYXNlKCkpOwotCQl9Ci0JCXNldEV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKGFTZXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGlzQ2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAxOjI0OjI4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeGNsdWRlZEV4dGVuc2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeGNsdWRlZEV4dGVuc2lvbnMoamF2YS51dGlsLlNldCBuZXdFeGNsdWRlZEV4dGVuc2lvbnMpIHsKLQkJZXhjbHVkZWRFeHRlbnNpb25zID0gbmV3RXhjbHVkZWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDI6NDI6MjAgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UoamF2YS51dGlsLlNldCBuZXdFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZSkgewotCQlleGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZSA9IG5ld0V4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElzQ2FzZVNlbnNpdGl2ZShib29sZWFuIHZhbHVlKSB7Ci0JCWlzQ2FzZVNlbnNpdGl2ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlRmlsdGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShTdHJpbmcgdXJpLCBBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTdHJpbmcgZXh0ZW5zaW9uID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRGaWxlTmFtZUV4dGVuc2lvbih1cmkpOwotCQlpZiAoZXh0ZW5zaW9uLmVxdWFscygiIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJU2V0IGV4Y2x1ZGVkOwotCQlpZiAoaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWV4Y2x1ZGVkID0gZ2V0RXhjbHVkZWRFeHRlbnNpb25zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlleGNsdWRlZCA9IGdldEV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKCk7Ci0JCQlleHRlbnNpb24gPSBleHRlbnNpb24udG9VcHBlckNhc2UoKTsKLQkJfQotCi0JCXJldHVybiAhZXhjbHVkZWQuY29udGFpbnMoZXh0ZW5zaW9uKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAyYjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wMi8wMSA1OjIwOjAwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZUl0ZXJhdG9yIHsKLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpOwotCi0JcHVibGljIEZpbGUgbmV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNDY0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUl0ZXJhdG9ySW1wbCBpbXBsZW1lbnRzIEZpbGVJdGVyYXRvciB7Ci0JcHJvdGVjdGVkIExpc3QgZmlsZXM7Ci0JcHJvdGVjdGVkIGludCBwb3NpdGlvbiA9IDA7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wMi8wMSA2OjE2OjUyIFBNKQotCSAqLwotCXB1YmxpYyBGaWxlSXRlcmF0b3JJbXBsKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgRmlsZUl0ZXJhdG9ySW1wbChMaXN0IHRoZUZpbGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWZpbGVzID0gdGhlRmlsZXM7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBwb3NpdGlvbiA8IGZpbGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBuZXh0KCkgewotCQlpZiAoIWhhc05leHQoKSkKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRW5kX29mX2xpc3RfcmVhY2hlZF9FWENfKTsgLy8gPSAiRW5kIG9mIGxpc3QgcmVhY2hlZCIKLQkJcmV0dXJuIChGaWxlKSBmaWxlcy5nZXQocG9zaXRpb24rKyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9NYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWY4MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9NYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLQotLyoqCi0gKiBVc2VkIGZvciBtYW5pZmVzdCBzdXBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsIGV4dGVuZHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9USVRMRSA9ICJTcGVjaWZpY2F0aW9uLVRpdGxlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPSAiU3BlY2lmaWNhdGlvbi1WZXJzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1ZFTkRPUiA9ICJTcGVjaWZpY2F0aW9uLVZlbmRvciI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fVElUTEUgPSAiSW1wbGVtZW50YXRpb24tVGl0bGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX1ZFUlNJT04gPSAiSW1wbGVtZW50YXRpb24tVmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fVkVORE9SID0gIkltcGxlbWVudGF0aW9uLVZlbmRvciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFuaWZlc3RQYWNrYWdlRW50cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1hbmlmZXN0UGFja2FnZUVudHJ5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBNYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwoaW50IHNpemUpIHsKLQkJc3VwZXIoc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogTWFuaWZlc3RQYWNrYWdlRW50cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIE1hbmlmZXN0UGFja2FnZUVudHJ5SW1wbChqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgYXR0cikgewotCQlzdXBlcihhdHRyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoSU1QTEVNRU5UQVRJT05fVElUTEUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoSU1QTEVNRU5UQVRJT05fVkVORE9SKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChJTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoTkFNRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoU1BFQ0lGSUNBVElPTl9USVRMRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KFNQRUNJRklDQVRJT05fVkVORE9SKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KFNQRUNJRklDQVRJT05fVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25UaXRsZShTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KElNUExFTUVOVEFUSU9OX1RJVExFLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25WZW5kb3IoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChJTVBMRU1FTlRBVElPTl9WRU5ET1IsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChJTVBMRU1FTlRBVElPTl9WRVJTSU9OLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KE5BTUUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uVGl0bGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChTUEVDSUZJQ0FUSU9OX1RJVExFLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlbmRvcihTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KFNQRUNJRklDQVRJT05fVkVORE9SLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChTUEVDSUZJQ0FUSU9OX1ZFUlNJT04sIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9OZXN0ZWRBcmNoaXZlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyZDk0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IgZXh0ZW5kcyBGaWxlSXRlcmF0b3JJbXBsIHsKLQlwcm90ZWN0ZWQgWmlwSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW07Ci0JcHJvdGVjdGVkIFppcEVudHJ5IGN1cnJlbnRFbnRyeTsKLQotCXN0YXRpYyBjbGFzcyBXcmFwcGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0JCS8qKgotCQkgKiBAcGFyYW0gaW4KLQkJICovCi0JCXB1YmxpYyBXcmFwcGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKLQkJCXN1cGVyKGluKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI2Nsb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vZG8gbm90aGluZyBiZWNhdXNlIHdlIHdhbnQgdG8gcHJldmVudCB0aGUgY2xpZW50cyBmcm9tIGNsb3NpbmcgdGhlIHppcAotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5lc3RlZEFyY2hpdmVJdGVyYXRvcihMaXN0IHRoZUZpbGVzLCBaaXBJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJc3VwZXIodGhlRmlsZXMpOwotCQl6aXBJbnB1dFN0cmVhbSA9IHN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKCFhRmlsZS5nZXRVUkkoKS5lcXVhbHMoY3VycmVudEVudHJ5LmdldE5hbWUoKSkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ18pOyAvLyA9ICJJbnRlcm5hbCBFcnJvcjogSXRlcmF0b3Igb3V0IG9mIHN5bmMgd2l0aCB6aXAgZW50cmllcyIKLQkJcmV0dXJuIG5ldyBXcmFwcGVySW5wdXRTdHJlYW0oemlwSW5wdXRTdHJlYW0pOwotCX0KLQotCXB1YmxpYyBGaWxlIG5leHQoKSB7Ci0JCUZpbGUgbmV4dCA9IHN1cGVyLm5leHQoKTsKLQkJdHJ5IHsKLQkJCWRvIHsKLQkJCQljdXJyZW50RW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQkJCX0gd2hpbGUgKGN1cnJlbnRFbnRyeS5pc0RpcmVjdG9yeSgpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRXJyb3JfaXRlcmF0aW5nX3RoZV9hcmNoaXZfRVhDXywgZXgpOyAvLyA9ICJFcnJvciBpdGVyYXRpbmcgdGhlIGFyY2hpdmUiCi0JCX0KLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGEzYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLWZpbmFsIGNsYXNzIFJlc291cmNlUHJveHlWYWxpZGF0b3IgewotCXN0YXRpYyBIYXNoTWFwIHJlc291cmNlVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCBjb250YWluZWQgPSByZWZPYmplY3QuZUNvbnRlbnRzKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZC5zaXplKCk7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIGNvbnRhaW5lZC5nZXQoaSk7Ci0JCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCUVPYmplY3QgcHJveHlPck9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkgJiYgIXJlZmVyZW5jZS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQlJdGVyYXRvciB2YWx1ZSA9ICgoTGlzdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKSkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKHZhbHVlLmhhc05leHQoKSkgewotCQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSB2YWx1ZS5uZXh0KCk7Ci0JCQkJCQlpZiAocHJveHlPck9iamVjdC5lSXNQcm94eSgpKQotCQkJCQkJCXZhbHVlLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSByZWZPYmplY3QuZUdldChyZWZlcmVuY2UsIGZhbHNlKTsKLQkJCQkJaWYgKHByb3h5T3JPYmplY3QgIT0gbnVsbCAmJiBwcm94eU9yT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCVVSSSByZXNvdXJjZVVSSSA9ICgoRU9iamVjdEltcGwpIHByb3h5T3JPYmplY3QpLmVQcm94eVVSSSgpLnRyaW1GcmFnbWVudCgpOwotCQkJCQkJU3RyaW5nIHByb3RvY29sID0gcmVzb3VyY2VVUkkuc2NoZW1lKCk7Ci0JCQkJCQlpZiAocHJvdG9jb2wgPT0gbnVsbCB8fCAhcHJvdG9jb2wuZXF1YWxzKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBpZCA9ICgoRU9iamVjdEltcGwpIHByb3h5T3JPYmplY3QpLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQkJaWYgKHJlc291cmNlVVJJTWFwLmdldChyZXNvdXJjZVVSSSkgIT0gbnVsbCkgewotCQkJCQkJCQlSZXNvdXJjZSBjYWNoZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VVUklNYXAuZ2V0KHJlc291cmNlVVJJKTsKLQkJCQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSAoKFhNTFJlc291cmNlKSBjYWNoZWRSZXNvdXJjZSkuZ2V0SURUb0VPYmplY3RNYXAoKS5nZXQoaWQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJCQkJcmVzb3VyY2VVUklNYXAucHV0KHJlc291cmNlVVJJLCBwcm94eU9yT2JqZWN0LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHByb3h5T3JPYmplY3QgPT0gbnVsbCB8fCBwcm94eU9yT2JqZWN0LmVJc1Byb3h5KCkpCi0JCQkJCQkJCXJlZk9iamVjdC5lU2V0KHJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCWlmIChyZWZPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJCXJlc29sdmVDb250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIHByb3hpZXMgd2l0aCA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdG8gYmUgcmVzb2x2ZWQuCi0JICovCi0Jc3RhdGljIHZvaWQgY2hlY2tGb3JVbnJlc29sdmFibGVQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsgLy9SZXNldCBoYXNobWFwIG9uIGVhY2ggY2FsbAotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQkJRU9iamVjdCBtb2ZPYmplY3Q7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvcExldmVscy5zaXplKCk7IGkrKykgewotCQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSB0b3BMZXZlbHMuZ2V0KGkpOwotCQkJCXJlc29sdmVQcm94aWVzKG1vZk9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgxYzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB7Ci0KLQotCS8qKgotCSAqIFRoZSByZXNvbHZlZCBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeQotCSAqLwotCVN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKTsKLQotCXZvaWQgc2V0QWJzb2x1dGVQYXRoKFN0cmluZyBhYnNvbHV0ZVBhdGgpOwotCi0JLyoqCi0JICogQSBzaW5nbGUgdG9rZW4gZnJvbSB0aGUgQ2xhc3MtUGF0aDogYXR0cmJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TWFuaWZlc3RWYWx1ZSgpOwotCi0Jdm9pZCBzZXRNYW5pZmVzdFZhbHVlKFN0cmluZyBtYW5pZmVzdFZhbHVlKTsKLQotCS8qKgotCSAqIHZhbGlkIG9ubHkgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVJGaWxlLCB1bmRlciBXRUItSU5GL2xpYgotCSAqLwotCVdBUkZpbGUgZ2V0V2FyRmlsZSgpOwotCi0Jdm9pZCBzZXRXYXJGaWxlKFdBUkZpbGUgYVdhckZpbGUpOwotCi0JLyoqCi0JICogdHJ1ZSBpZiB0aGlzIGVudHJ5IGlzIGEgbGlicmFyeSBpbiBhIFdBUiBmaWxlCi0JICovCi0JYm9vbGVhbiBpc1dlYkxpYigpOwotCi0JLyoqCi0JICogVGhlIHJlc29sdmVkIGFyY2hpdmUgaW5zaWRlIGFuIEVBUiB0aGF0IHRoaXMgZW50cnkgcG9pbnRzIHRvOyBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgdGhlCi0JICogQXJjaGl2ZSB0aGF0IGhhcyB0aGUgZW50cnkgaW4gdGhlIG1hbmlmZXN0LCBidXQgcmF0aGVyIHRoZSByZWZlcmVuY2VkIGFyY2hpdmUvCi0JICovCi0JQXJjaGl2ZSBnZXRSZWZlcmVuY2VkQXJjaGl2ZSgpOwotCi0Jdm9pZCBzZXRSZWZlcmVuY2VkQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjYwY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwgaW1wbGVtZW50cyBSdW50aW1lQ2xhc3NwYXRoRW50cnkgewotCi0JLyoqIEEgc2luZ2xlIHRva2VuIGZyb20gdGhlIENsYXNzLVBhdGg6IGF0dHJidXRlICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYW5pZmVzdFZhbHVlOwotCS8qKiBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFic29sdXRlUGF0aDsKLQkvKiogdmFsaWQgb25seSBpZiB0aGlzIGVudHJ5IGlzIGEgbGlicmFyeSBpbiBhIFdBUkZpbGUsIHVuZGVyIFdFQi1JTkYvbGliICovCi0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQotCXByb3RlY3RlZCBBcmNoaXZlIHJlZmVyZW5jZWRBcmNoaXZlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0Q2xhc3NwYXRoRW50cnlJbXBsLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKLQkJcmV0dXJuIGFic29sdXRlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhYnNvbHV0ZVBhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlUGF0aCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIGFic29sdXRlUGF0aCkgewotCQl0aGlzLmFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5pZmVzdFZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWYWx1ZSgpIHsKLQkJcmV0dXJuIG1hbmlmZXN0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFuaWZlc3RWYWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuaWZlc3RWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG1hbmlmZXN0VmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3RWYWx1ZShTdHJpbmcgbWFuaWZlc3RWYWx1ZSkgewotCQl0aGlzLm1hbmlmZXN0VmFsdWUgPSBtYW5pZmVzdFZhbHVlOwotCX0KLQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB3YXJGaWxlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFdBUkZpbGUKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBnZXRXYXJGaWxlKCkgewotCQlyZXR1cm4gd2FyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3YXJGaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3YXJGaWxlCi0JICogICAgICAgICAgICBUaGUgd2FyRmlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXYXJGaWxlKFdBUkZpbGUgd2FyRmlsZSkgewotCQl0aGlzLndhckZpbGUgPSB3YXJGaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBSdW50aW1lQ2xhc3NwYXRoRW50cnkpCi0JCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKCgoUnVudGltZUNsYXNzcGF0aEVudHJ5KSBvKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUnVudGltZUNsYXNzcGF0aEVudHJ5I2lzV2ViTGliKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYkxpYigpIHsKLQkJcmV0dXJuIHdhckZpbGUgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2VkQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZEFyY2hpdmUKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2VkQXJjaGl2ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQXJjaGl2ZShBcmNoaXZlIHJlZmVyZW5jZWRBcmNoaXZlKSB7Ci0JCXRoaXMucmVmZXJlbmNlZEFyY2hpdmUgPSByZWZlcmVuY2VkQXJjaGl2ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTk0NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotCi0vKioKLSAqIE9iamVjdCB1c2VkIGZvciBzYXZpbmcgYW4gYXJjaGl2ZSB3aXRoIG9ubHkgYSBzdWJzZXQgb2YgaXRzIGZpbGVzLiBCeSBkZWZhdWx0IGFsbCBmaWxlcyBhcmUKLSAqIHNhdmVkLiBDbGllbnRzIGNhbiBjcmVhdGUgYSBjdXN0b20gZmlsdGVyIGFuZCBzZXQgaXQgb24gYSBzYXZlIHN0cmF0ZWd5LCBhbmQgY2FsbAotICoge0BsaW5rIEFyY2hpdmUjc2F2ZShTYXZlU3RyYXRlZ3kpfQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNhdmVGaWx0ZXIgewotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIGFuIGVsZW1lbnQgaW4gdGhlIGFyY2hpdmUgaGF2aW5nIHRoZSB1cmkgc2hvdWxkIGJlIHNhdmVkOyB0aGUgdXJpIG1heSBiZSBmb3IgYQotCSAqIGZpbGUsIGEgbmVzdGVkIGFyY2hpdmUsIG9yIGEgbG9hZGVkIG1vZiByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA0MWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotCi0KLS8qKgotICogRGVmYXVsdCBmaWx0ZXIgd2hpY2ggYWxsb3dzIGFsbCBlbGVtZW10cyB0byBzYXZlCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmlsdGVySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciB7Ci0JLyoqCi0JICogU2F2ZUZpbHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUZpbHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKGphdmEubGFuZy5TdHJpbmcgdXJpLCBBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODFmNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8yMy8wMSAxMTowNDo1MiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwgZXh0ZW5kcyBTYXZlRmlsdGVySW1wbCB7Ci0JLyoqIFNldCBvZiBmaWxlIHVyaXMgdG8gYmUgc2F2ZWQgKi8KLQlwcm90ZWN0ZWQgU2V0IHNlbGVjdGVkRmlsZU5hbWVzOwotCi0JLyoqCi0JICogU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igd2l0aCBhIHByZXNlbGVjdGVkIHN1YnNldCBvZiB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgdG8gYmUgc2F2ZWQ7IGVhY2ggZWxlbWVudAotCSAqIGluIHRoZSBsaXN0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZX0KLQkgKi8KLQlwdWJsaWMgU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwoTGlzdCBhcmNoaXZlRmlsZXMpIHsKLQkJc3VwZXIoKTsKLQkJU2V0IGZpbGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGFyY2hpdmVGaWxlcy5nZXQoaSk7Ci0JCQlmaWxlTmFtZXMuYWRkKGFGaWxlLmdldFVSSSgpKTsKLQkJfQotCQlzZXRTZWxlY3RlZEZpbGVOYW1lcyhmaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFBhcmFtZXRlciBtdXN0IGJlIGEgc2V0IG9mIHZhbGlkIHVyaXMgaW4gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwoU2V0IGZpbGVOYW1lcykgewotCQlzdXBlcigpOwotCQlzZXRTZWxlY3RlZEZpbGVOYW1lcyhmaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzIzLzAxIDExOjE5OjAxIEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFNlbGVjdGVkRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRGaWxlTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMjMvMDEgMTE6MTk6MDEgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld1NlbGVjdGVkRmlsZU5hbWVzCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRGaWxlTmFtZXMoamF2YS51dGlsLlNldCBuZXdTZWxlY3RlZEZpbGVOYW1lcykgewotCQlzZWxlY3RlZEZpbGVOYW1lcyA9IG5ld1NlbGVjdGVkRmlsZU5hbWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFNhdmUoamF2YS5sYW5nLlN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RlZEZpbGVOYW1lcygpLmNvbnRhaW5zKHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BbHRSZXNvdXJjZVJlZ2lzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FsdFJlc291cmNlUmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZDdhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FsdFJlc291cmNlUmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQWx0UmVzb3VyY2VSZWdpc3RlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTZXQgcmVnaXN0ZXJlZFVSSXMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJvdGVjdGVkIEFsdFJlc291cmNlUmVnaXN0ZXIoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIEFyY2hpdmUgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIHJlc291cmNlIHdoaWNoIGNhbiBiZSBjb3BpZWQgdXAgYXMgYW4gYWx0IGluIGFuCi0JICogRUFSIGZpbGUuIFRoZSB1cmkgc2hvdWxkIGJlIGluIGNhbmFub25pY2FsIGZvcm0gYW5kIHVzZSB0aGUgZm9yd2FyZCBzbGFzaCwgZWcsCi0JICogIk1FVEEtSU5GL3ZlbmRvci1leHRlbnNpb25zLnhtaSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJVUkkoU3RyaW5nIHVyaSkgewotCQlyZWdpc3RlcmVkVVJJcy5hZGQodXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVSZWdpc3RlclVSSShTdHJpbmcgdXJpKSB7Ci0JCXJlZ2lzdGVyZWRVUklzLnJlbW92ZSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gcmVnaXN0ZXJlZFVSSXMuY29udGFpbnModXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRSZWdpc3RlcmVkVVJJcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChyZWdpc3RlcmVkVVJJcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhMDg5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnQgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEU7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbkNsaWVudCBkZCA9IHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQkJaWYgKGRkID09IG51bGwgJiYgY2FuTGF6eUluaXRpYWxpemUoKSkgewotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGFDbGllbnQgPSAoKENsaWVudFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkpLmdldENsaWVudEZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQlyZXNvdXJjZS5zZXRJRChhQ2xpZW50LCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfSUQpOwotCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihhQ2xpZW50KTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYUNsaWVudCk7Ci0JCXJldHVybiBhQ2xpZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50IGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSAoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb25DbGllbnQpZVJlc29sdmVQcm94eShvbGREZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gb2xkRGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oQXBwbGljYXRpb25DbGllbnQgbmV3RGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJQXBwbGljYXRpb25DbGllbnQgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEFwcGxpY2F0aW9uQ2xpZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbkNsaWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQ5MDVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5U2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBPdmVyUmlkZSBjbGFzcyB0byB1c2UgdGhlIHByb3BlciBjb3B5aW5nIG9mIFhNTFJlc291cmNlIGRvY3R5cGVzLiBIYWQgdG8gY3JlYXRlIHRoaXMgY2xhc3MgRHVlIHRvCi0gKiB0aGUgd2F5IGl0J3MgaGFuZGxlZCBpbiB0aGUgY29weSBjb21tYW5kcyBvZiBFdG9vbHNDb3B5VXRpbGl0eQotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMTgvMDEgODg4ODg4ODg6NDggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEphcmVkIEp1cmtpZXdpY3oKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkgZXh0ZW5kcyBFdG9vbHNDb3B5U2Vzc2lvbiB7Ci0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKLQkJCWNvcHlQcmltS2V5SW5mbygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYVJlZk9iamVjdCwgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgcHJpbUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5wcmltQ29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWlmIChjb3BpZWQgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KQotCQkJY29weVByaW1LZXlJbmZvKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBhUmVmT2JqZWN0LCAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgY29waWVkKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eShFdG9vbHNDb3B5VXRpbGl0eSBhQ29weVV0aWxpdHkpIHsKLQkJc3VwZXIoYUNvcHlVdGlsaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5U2Vzc2lvbiNuZXdJbnN0YW5jZShSZXNvdXJjZSwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29weVJlc291cmNlID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCi0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCSgoWE1MUmVzb3VyY2UpIGNvcHlSZXNvdXJjZSkuc2V0VmVyc2lvbklEKCgoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSkuZ2V0VmVyc2lvbklEKCkpOwotCQlyZXR1cm4gY29weVJlc291cmNlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENvcHlJZkZvdW5kKEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWRPYmplY3QgPSBzdXBlci5nZXRDb3B5SWZGb3VuZChhbk9iamVjdCk7Ci0JCWlmICgoYW5PYmplY3QgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpICYmIChhbk9iamVjdCA9PSBjb3BpZWRPYmplY3QpKSB7Ci0JCQljb3BpZWRPYmplY3QgPSBuZXdJbnN0YW5jZShhbk9iamVjdCk7Ci0JCQlVUkkgdXJpID0gRWNvcmVVdGlsLmdldFVSSShhbk9iamVjdCk7Ci0JCQkoKEludGVybmFsRU9iamVjdCkgY29waWVkT2JqZWN0KS5lU2V0UHJveHlVUkkodXJpKTsKLQkJfQotCQlyZXR1cm4gY29waWVkT2JqZWN0OwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5jb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJaWYgKGNvcGllZCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JCQljb3B5UHJpbUtleUluZm8oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGFSZWZPYmplY3QsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvcHlQcmltS2V5SW5mbyhDb250YWluZXJNYW5hZ2VkRW50aXR5IHNvdXJjZSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjb3BpZWQpIHsKLQkJQ01QQXR0cmlidXRlIHByaW1LZXlGaWVsZCA9IHNvdXJjZS5nZXRQcmltS2V5RmllbGQoKTsKLQkJaWYgKHByaW1LZXlGaWVsZCAhPSBudWxsKQotCQkJY29waWVkLnNldFByaW1LZXlGaWVsZChwcmltS2V5RmllbGQpOwotCX0KLQotCS8qCi0JICogU3VwZXIgY2xhc3Mgb3ZlcnJpZGUgdG8gaGFuZGxlIHVucmVzb2x2YWJsZSBwcm94aWVzIChKYXZhQ2xhc3MpCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJaWYgKHNob3VsZENvcHlSZWZlcmVuY2UoYVJlZmVyZW5jZSwgYVJlZk9iamVjdCkpIHsgLy8gQnVnemlsbGEgMTc3Mzk3Ci0JCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJCWNvcHlNYW55UmVmZXJlbmNlKGFSZWZlcmVuY2UsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYVJlZmVyZW5jZSkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXZhbHVlID0gKChJbnRlcm5hbEVPYmplY3QpIGFSZWZPYmplY3QpLmVHZXQoYVJlZmVyZW5jZSwgZmFsc2UpOwotCQkJY29weVNpbmdsZVJlZmVyZW5jZShhUmVmZXJlbmNlLCAoRU9iamVjdCkgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIDxwPkNvbnN0YW50IGludHJvZHVjZWQgZm9yIGJ1Z3ppbGxhIDE3NzM5NzogVGhlIG5hbWUgb2YgdGhlIENNUCAna2V5QXR0cmlidXRlcycKLSAgICAgKiBhdHRyaWJ1dGUsIHdoaWNoIGlzIG5vdCB0byBiZSBjb3BpZWQgaWYgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS48L3A+Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01QX0tFWV9BVFRSSUJVVEVTX05BTUUgPSAia2V5QXR0cmlidXRlcyI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5UZXN0IGludHJvZHVjZWQgZm9yIGJ1Z3ppbGxhIDE3NzM5NzogVGVsbCBpZiBhIHNwZWNpZmllZCByZWZlcmVuY2UKLSAgICAgKiBzaG91bGQgYmUgY29waWVkLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIGEgQ01QIEJlYW4sIGFuZCBmb3IKLSAgICAgKiB0aGUga2V5IGF0dHJpYnV0ZXMgYXR0cmlidXRlLCBhbmQgYW5zd2VycyBmYWxzZSB3aGVuIHRoaXMgYXR0cmlidXRlCi0gICAgICogaXMgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhpcyBhdHRyaWJ1dGUgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgcmVmbGVjdGlvbjsgdGhlcmUgYXJlIGNvcHkgY2FzZXMKLSAgICAgKiB3aGVyZSB0aGUgcGFyZW50IEVKQiBKYXIgZG9lcyBub3QgaGF2ZSBpdHMgZnVsbCBjbGFzc3BhdGggZW52aXJvbm1lbnQKLSAgICAgKiBhdmFpbGFibGUsIHdoaWNoIHByZXZlbnRzIHRoZSBsb2FkaW5nIG9mIGRlcGVuZGVudCBjbGFzc2VzLiAgU2luY2UgdGhlCi0gICAgICogaW5pdGlhbGl6YXRpb24gaXMgbGF6eSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZXNvbHZlIHRoaXMgd2hlbiBjb3B5aW5nOwotICAgICAqIGFjY2VzcyB0byB0aGUgY29weSB0YXJnZXQgY2FuIHBlcmZvcm0gdGhlIGluaXRpYWxpemF0aW9uLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhUmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgYXR0cmlidXRlIGJlaW5nIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gYVJlZk9iamVjdCBUaGUgbW9kZWwgb2JqZWN0IGJlaW5nIGNvcGllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUgaXMgdG8gYmUgY29waWVkLgotICAgICAqICAgICAgICAgRmFsc2UgaWYgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUgaXMgbm90IHRvIGJlIGNvcGllZC4KLSAgICAgKi8KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRDb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhUmVmT2JqZWN0KQotICAgIHsgICAgICAgIAotICAgICAgICBpZiAoICEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsKSB8fAotICAgICAgICAgICAgICFhUmVmZXJlbmNlLmdldE5hbWUoKS5lcXVhbHMoQ01QX0tFWV9BVFRSSUJVVEVTX05BTUUpICkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAKLSAgICAgICAgCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsIGNtcEJlYW4gPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwpIGFSZWZPYmplY3Q7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY21wQmVhbi5nZXRJc0luaXRpYWxpemVkS2V5QXR0cmlidXRlcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjliYzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuRGVmYXVsdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ29weUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5U2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOC8wMCA2OjI2OjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlQ29weVV0aWxpdHkgZXh0ZW5kcyBFdG9vbHNDb3B5VXRpbGl0eSB7Ci0JLyoqCi0JICogTW9kdWxlRmlsZUNvcHlVdGlsdGl0eSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcmNoaXZlQ29weVV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldENvcHlBZGFwdGVycyh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIEVuZCBvZiBjb2RlIHB1bGxlZCBmcm9tIEV0b29sc0NvcHlVdGlsaXR5IHRvIG92ZXItcmlkZSB0aGUgcHJpbUNvcHkgbWV0aG9kLgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWlmICgoKERlZmF1bHRhYmxlKSBhVmFsdWUpLmlzRGVmYXVsdCgpKQotCQkJcmV0dXJuOwotCQlzdXBlci5hZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBjb3B5KEFyY2hpdmVNYW5pZmVzdCBtZikgewotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCW1mLndyaXRlKG91dCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCS8vVGhpcyBzaG91bGQgYWxtb3N0IG5ldmVyIGhhcHBlbiwgdW5sZXNzIHRoZXJlIGlzIGFuIGlzc3VyZSB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uCi0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5JT0V4Y2VwdGlvbl9vY2N1cnJlZF93aGlsZV9FWENfLCBpb3gpOyAvLyA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIG1hbmlmZXN0IgotCQl9Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgY29weShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCi0JCS8vRmlyc3QgY3JlYXRlIGEgY29weSBncm91cCBhbmQgY29weSB1dGlsOyBjb3B5IHRoZSBhcmNoaXZlIGFuZCBhbGwgaXRzIHJlc291cmNlcwotCQlDb3B5R3JvdXAgY29weUdyb3VwID0gbmV3IENvcHlHcm91cCgpOwotCQljb3B5R3JvdXAuc2V0UHJlc2VydmVJZHModHJ1ZSk7Ci0JCXByZXBhcmVSZXNvdXJjZXNGb3JDb3B5KGFuQXJjaGl2ZSwgY29weUdyb3VwKTsKLQkJY29weUdyb3VwLmFkZChhbkFyY2hpdmUpOwotCQl0aGlzLmNvcHkoY29weUdyb3VwKTsKLQotCQlBcmNoaXZlIGNvcGllZEFyY2hpdmUgPSAoQXJjaGl2ZSkgZ2V0Q29weShhbkFyY2hpdmUpOwotCi0JCWZpbmlzaENvcHkoYW5BcmNoaXZlLCBjb3BpZWRBcmNoaXZlLCBjb3B5R3JvdXApOwotCQlyZXR1cm4gY29waWVkQXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZSBjb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJLyoqCi0JCSAqIFRpbWluZyBpc3N1ZTsgaWYgdGhlIHJlc291cmNlcyBjb250YWluaW5nIHRoZSBiaW5kaW5ncywgZXh0ZW5zaW9ucywgYW5kIGRkIGhhdmUgbm90IHlldAotCQkgKiBiZSBsb2FkZWQsIGZvcmNlIHRoYXQgYmVmb3JlIHRoZSBjb3B5IG9jY3Vyczsgb3RoZXJ3aXNlLCB0aGV5IHdpbGwgZ2V0IGxvYWRlZCBhcyB0aGUKLQkJICogYWNjZXNzb3JzIGFyZSBpbnZva2VkIGR1cmluZyBjb3B5LiBCZWNhdXNlIHRoZXkgd2lsbCBiZSBsb2FkZWQgYnV0IG5vdCBjb3BpZWQgaW50byB0aGUKLQkJICogbmV3IGFyY2hpdmUncyBjb250ZXh0LCB0aGVuIGNoYW5nZXMgd2lsbCBub3QgZ2V0IHNhdmVkLiBCeSBmb3JjaW5nIHRoZSBsb2FkIGJlZm9yZSB0aGUKLQkJICogY29weSBjb21tZW5jZXMsIHRoZSBsb2FkZWQgcmVzb3VyY2VzIHdpbGwgYWxzbyBiZSBjb3BpZWQgdG8gdGhlIG5ldyBhcmNoaXZlCi0JCSAqLwotCQlhTW9kdWxlRmlsZS5nZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoKLQkJICogUkxTLTgvMTIvMjAwMiBIYWNrIHRvIGZpeCBib3RwIGRlZmVjdCAiMTQxNjQwLWZhaWxlZCB0byBpbnN0YWxsIC53YXIgZmlsZSB3aXRoCi0JCSAqIGZpbHRlci1tYXBwaW5nIiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIGEgdHJhbnNpZW50IGZpZWxkIG9uIHRoZSBmaWx0ZXIgbWFwcGluZwotCQkgKiBjbGFzcyBmb3IgdGhlIHNlcnZsZXQgbmFtZSB0aGUgcmVsYXRpb25zaGlwIHRvIHRoZSBzZXJ2bGV0IGlzIGxhemlseSBwb3B1bGF0ZWQgdGhlIGZpcnN0Ci0JCSAqIHRpbWUgaXQgaXMgcmVxdWVzdGVkLiBJZiB3ZSBkb24ndCB0cmlwIGl0LCB0aGVuIGl0IHdvbid0IGdldCBjb3BpZWQuCi0JCSAqLwotCi0JCWlmIChhTW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJTGlzdCBmaWx0ZXJNYXBwaW5ncyA9ICgoV0FSRmlsZSkgYU1vZHVsZUZpbGUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyTWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQkoKEZpbHRlck1hcHBpbmcpIGZpbHRlck1hcHBpbmdzLmdldChpKSkuZ2V0U2VydmxldCgpOwotCQkJfQotCQl9Ci0JCU1vZHVsZUZpbGUgY29waWVkID0gKE1vZHVsZUZpbGUpIGNvcHkoKEFyY2hpdmUpIGFNb2R1bGVGaWxlKTsKLQotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHdlcmUgcHVsbGVkIG91dCBvZiBFdG9vbHNDb3B5VXRpbGl0eSBzbyB3ZSBjYW4gb3Zlci1yaWRlIHRoZQotCSAqIEV0b29sc0NvcHlTZXNzaW9uIG9iamVjdCB3aXRoIG91ciBvd24gc3VjaCB0aGF0IGRvaWN0eXBlcyBkbyBnZXQgcHJlc2VydmVkIHdpdGggWE1MCi0JICogUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKLQkJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJCXNlc3Npb24uc2V0UHJlc2VydmVJZHMoYUdyb3VwLmdldFByZXNlcnZlSWRzKCkpOwotCQkJc2Vzc2lvbi5jb3B5KGFHcm91cCk7Ci0JCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJUmVzb3VyY2UgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlJbXBvcnRTdHJhdGVneUlmTmVjZXNzYXJ5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUsIE1vZHVsZUZpbGUgY29weSkgewotCQlpZiAoIWFNb2R1bGVGaWxlLmlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSkKLQkJCWNvcHkuc2V0SW1wb3J0U3RyYXRlZ3koYU1vZHVsZUZpbGUuZ2V0SW1wb3J0U3RyYXRlZ3koKS5jcmVhdGVJbXBvcnRTdHJhdGVneShhTW9kdWxlRmlsZSwgY29weSkpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBBcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5KHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQ29weShDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFyY2hpdmVDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEFyY2hpdmVDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHkoYUdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hDb3B5KEFyY2hpdmUgc291cmNlLCBBcmNoaXZlIGNvcHksIENvcHlHcm91cCBncm91cCkgewotCi0JCWNvcHkuc2V0TG9hZFN0cmF0ZWd5KGdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSk7Ci0JCWNvcHkuc2V0RXh0cmFDbGFzc3BhdGgoc291cmNlLmdldEV4dHJhQ2xhc3NwYXRoKCkpOwotCQljb3B5LnNldFhtbEVuY29kaW5nKHNvdXJjZS5nZXRYbWxFbmNvZGluZygpKTsKLQkJaWYgKHNvdXJjZS5pc01hbmlmZXN0U2V0KCkpIHsKLQkJCWNvcHkuc2V0TWFuaWZlc3QoY29weShzb3VyY2UuZ2V0TWFuaWZlc3QoKSkpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlGaWxlIG1hbmlmZXN0VG9Db3B5ID0gc291cmNlLmdldEZpbGUoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQkJCWlmIChtYW5pZmVzdFRvQ29weSAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgY29waWVkTWFuaWZlc3QgPSAoRmlsZSkgZ2V0Q29weShtYW5pZmVzdFRvQ29weSk7Ci0JCQkJCWNvcGllZE1hbmlmZXN0LnNldExvYWRpbmdDb250YWluZXIobWFuaWZlc3RUb0NvcHkuZ2V0TG9hZGluZ0NvbnRhaW5lcigpKTsKLQkJCQkJY29weS5hZGRDb3B5KGNvcGllZE1hbmlmZXN0KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0cmlldmVSZXNvdXJjZXNGcm9tQ29weShjb3B5LCBncm91cCk7Ci0KLQkJaWYgKHNvdXJjZS5pc01vZHVsZUZpbGUoKSkKLQkJCWNvcHlJbXBvcnRTdHJhdGVneUlmTmVjZXNzYXJ5KChNb2R1bGVGaWxlKSBzb3VyY2UsIChNb2R1bGVGaWxlKSBjb3B5KTsKLQotCQlMaXN0IGZpbGVzID0gc291cmNlLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJRmlsZSBjb3BpZWRGaWxlID0gKEZpbGUpIGdldENvcHkoYUZpbGUpOwotCQkJY29waWVkRmlsZS5zZXRMb2FkaW5nQ29udGFpbmVyKGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpCi0JCQkJZmluaXNoTmVzdGVkQ29weSgoQXJjaGl2ZSkgYUZpbGUsIChBcmNoaXZlKSBjb3BpZWRGaWxlKTsKLQkJfQotCQkvL05vdGlmaWNhdGlvbiB3YXMgc3VzcGVuZGVkIGR1cmluZyBjb3B5OyB0aGVyZWZvcmUgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGZpbGVzCi0JCS8vSW4gdGhlIGFyY2hpdmUgZ2V0IGluZGV4ZWQKLQkJY29weS5yZWJ1aWxkRmlsZUluZGV4KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoTmVzdGVkQ29weShBcmNoaXZlIHNvdXJjZSwgQXJjaGl2ZSBjb3B5KSB7Ci0KLQkJQ29weUdyb3VwIGdyb3VwID0gbmV3IENvcHlHcm91cCgpOwotCQlwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShzb3VyY2UsIGdyb3VwKTsKLQkJY29weShncm91cCk7Ci0JCWZpbmlzaENvcHkoc291cmNlLCBjb3B5LCBncm91cCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVSZXNvdXJjZXNGb3JDb3B5KEFyY2hpdmUgYW5BcmNoaXZlLCBDb3B5R3JvdXAgY29weUdyb3VwKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbkFyY2hpdmUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIUFyY2hpdmVVdGlsLmlzSmF2YVJlc291cmNlKHJlc291cmNlKSkKLQkJCQljb3B5R3JvdXAuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldHJpZXZlUmVzb3VyY2VzRnJvbUNvcHkoQXJjaGl2ZSBjb3BpZWRBcmNoaXZlLCBDb3B5R3JvdXAgY29weUdyb3VwKSB7Ci0KLQkJTGlzdCByZXNvdXJjZXMgPSBjb3B5R3JvdXAuZ2V0Q29waWVkUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSBjb3BpZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWNvcGllZEFyY2hpdmUuYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoY29waWVkUmVzb3VyY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE0NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrLkphdmFKREtBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5NYW5pZmVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlb3BlbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkNsYXNzcGF0aFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVJbXBsIGV4dGVuZHMgQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzIEFyY2hpdmUgewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZXMoKSA8ZW0+VHlwZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFR5cGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdHlwZXMgPSBudWxsOwotCi0JLyoqIE91ciBzcGVjaWFsaXplZCBtYW5pZmVzdCAqLwotCXByb3RlY3RlZCBBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3Q7Ci0KLQkvKiogSW1wbGVtZW50ZXIgZm9yIHNhdmluZyB0aGlzIGFyY2hpdmUgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IHNhdmVTdHJhdGVneTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHJvdGVjdGVkIFNhdmVGaWx0ZXIgc2F2ZUZpbHRlcjsKLQotCS8qKiBFbmNvZGluZyB0byBiZSB1c2VkIGZvciBhbGwgeG1pIHJlc291cmNlcyBhbmQgeG1sIGRkczsgZGVmYXVsdHMgdG8gVVRGLTggKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEVuY29kaW5nID0gSjJFRUNvbnN0YW50cy5ERUZBVUxUX1hNTF9FTkNPRElORzsKLQotCS8qKiBDdXN0b20gY2xhc3MgbG9hZGVyIHVzZWQgdG8gbG9hZCBjbGFzc2VzIGZyb20gdGhlIGFyY2hpdmUgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgYXJjaGl2ZUNsYXNzTG9hZGVyOwotCi0JLyoqCi0JICogcGF0aCBvZiB0aGUgc3RhbmRhcmQgY2xhc3NwYXRoIGZvcm1hdCB3aGVyZSB0aGUgYXJjaGl2ZSBtYXkgbG9vayBmb3IgY2xhc3NlcyBub3QgZm91bmQgaW4gdGhlCi0JICogc3lzdGVtIGNsYXNzcGF0aCBvciBpbiB0aGUgYXJjaGl2ZSAtIHVzZWQgZm9yIGphdmEgcmVmbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFDbGFzc3BhdGg7Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgb3B0aW9uczsKLQotCXB1YmxpYyBBcmNoaXZlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5hcmNoaXZlT3BlbmVkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkFSQ0hJVkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUeXBlcygpIHsKLQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCXR5cGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVMpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKLQkJCQlyZXR1cm4gdHlwZXMgIT0gbnVsbCAmJiAhdHlwZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgYWRkQ29weShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQljaGVja0FkZFZhbGlkKGFuQXJjaGl2ZSk7Ci0JCUFyY2hpdmUgY29weSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY29weShhbkFyY2hpdmUpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgQWRkcyBhIGNvcHkgb2YgdGhlIHBhcmFtZXRlciB0byB0aGlzIGFyY2hpdmUKLQkgKiBAdGhyb3dzIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBhcmNoaXZlIGFscmVhZHkgY29udGFpbnMgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCB1cmkKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5KEZpbGUgYUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNSZWFkT25seURpcmVjdG9yeSgpKSB7Ci0JCQlhZGRDb3B5KChSZWFkT25seURpcmVjdG9yeSkgYUZpbGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2hlY2tBZGRWYWxpZChhRmlsZSk7Ci0JCUZpbGUgY29weSA9IGNvcHkoYUZpbGUpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZmxhdHRlbmVkIGxpc3QgZnJvbSB0aGUgZGlyZWN0b3J5LCB0aGVuIGFkZENvcHkgdGhlIGxpc3QKLQkgKiAKLQkgKiBAdGhyb3dzIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgZmlsZSB3aXRoIGEgdXJpIHRoYXQgZXF1YWxzIG9uZSBvZiB0aGUgbmVzdGVkIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCB0aGUgY29waWVkIGZpbGVzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBhZGRDb3B5KFJlYWRPbmx5RGlyZWN0b3J5IGRpcikgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkQ29weUZpbGVzKGRpci5nZXRGaWxlc1JlY3Vyc2l2ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMaXN0IGFkZENvcHlGaWxlcyhqYXZhLnV0aWwuTGlzdCBsaXN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCS8vT3B0aW1pemF0aW9uIC0gbWFrZSBzdXJlIHRoZSBmaWxlSW5kZXggaXMgYWxyZWFkeSBidWlsdCB0byBzcGVlZCB1cAotCQkvLyBjb250YWluc0ZpbGUKLQkJZ2V0RmlsZXMoKTsKLQkJTGlzdCBjb3B5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJY2hlY2tBZGRWYWxpZChhRmlsZSk7Ci0JCQljb3B5TGlzdC5hZGQoY29weShhRmlsZSkpOwotCQl9Ci0JCWdldEZpbGVzKCkuYWRkQWxsKGNvcHlMaXN0KTsKLQkJcmV0dXJuIGNvcHlMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSkgewotCQlnZXRMb2FkU3RyYXRlZ3koKS5hZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShhUmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldERlcGVuZGVudE9wZW5BcmNoaXZlcygpfQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ2xvc2UoKSB7Ci0JCXJldHVybiAhZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5nZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbih0aGlzKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tBZGRWYWxpZChGaWxlIGFGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tBZGRWYWxpZChhRmlsZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tBZGRWYWxpZChTdHJpbmcgYVVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBnZXRGaWxlKGFVcmkpOwotCQkJaWYgKGYgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZHVwbGljYXRlX2ZpbGVfRVhDXywgKG5ldyBPYmplY3RbXXtnZXRVUkkoKSwgYVVyaX0pKSwgZik7IC8vID0gIlRoZSBhcmNoaXZlIG5hbWVkIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSBuYW1lZCB7MX0iCi0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBvaykgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyBhVXJpLCBqYXZhLmlvLkZpbGUgb3JpZ2luYWwsIGphdmEuaW8uRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJY2hlY2tXcml0ZWFibGUob3JpZ2luYWwpOwotCQlib29sZWFuIGRlbGV0ZVdvcmtlZCA9IGZhbHNlOwotCQlpZiAob3JpZ2luYWwuaXNEaXJlY3RvcnkoKSAmJiAhaXNSZW5hbWVhYmxlKG9yaWdpbmFsKSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywgKG5ldyBPYmplY3RbXXtvcmlnaW5hbC5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7IC8vID0gIlVuYWJsZSB0byByZXBsYWNlIG9yaWdpbmFsIGFyY2hpdmUgIgotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoQXJjaGl2ZVV0aWwuZGVsZXRlKG9yaWdpbmFsKSkgewotCQkJCWRlbGV0ZVdvcmtlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIFRPRE8gTWFqb3IgaGFjayBoZXJlOyB0aGUgcHJvYmxlbSBpcyB0aGF0IGEgcHJldmlvdXMgY2FsbAotCQkJCS8vIHRvIGNsb3NlIHRoZSBzb3VyY2UgZmlsZSBtYXkgbm90IHlldCBoYXZlCi0JCQkJLy9iZWVuIHJlZmxlY3RlZCBpbiB0aGUgb3Mvdm07IHRoZXJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbAotCQkJCS8vIHRvIGRlbGV0ZSBmYWlscy4gVG8gZ2V0IGFyb3VuZCB0aGlzLAotCQkJCS8vd2FpdCBmb3IgYSBiaXQgYW5kIHJldHJ5OyBpZiBpdCBjb250aW51ZXMgdG8gZmFpbCwgdGhlbgotCQkJCS8vIHRpbWUgb3V0IGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChkZWxldGVXb3JrZWQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCWlmIChkZXN0aW5hdGlvbkZpbGUucmVuYW1lVG8ob3JpZ2luYWwpKQotCQkJCQlyZXR1cm47Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci51bmFibGVfcmVwbGFjZV9FWENfLCAobmV3IE9iamVjdFtde29yaWdpbmFsLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8gPSAiVW5hYmxlIHRvIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZSAiCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJZ2V0TG9hZFN0cmF0ZWd5KCkuY2xvc2UoKTsKLQkJcmVsZWFzZUNsYXNzTG9hZGVyKCk7Ci0JCWdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuYXJjaGl2ZUNsb3NlZCh0aGlzKTsKLQkJaWYgKGlzSW5kZXhlZCgpKSB7Ci0JCQlMaXN0IGFyY2hpdmVzID0gZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSkpLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjb3B5KEZpbGUgYUZpbGUpIHsKLQkJRmlsZSBjb3B5ID0gbnVsbDsKLQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJY29weSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY29weSgoQXJjaGl2ZSkgYUZpbGUpOwotCQllbHNlCi0JCQljb3B5ID0gKEZpbGUpIEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkoYUZpbGUpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneUZvclJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kgPSBudWxsOwotCQlMb29zZUFyY2hpdmUgbG9vc2UgPSBnZXRMb2FkU3RyYXRlZ3koKS5nZXRMb29zZUFyY2hpdmUoKTsKLQotCQlpZiAobG9vc2UgIT0gbnVsbCkgewotCQkJYUxvYWRTdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlTG9hZFN0cmF0ZWd5KGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpKTsKLQkJCWFMb2FkU3RyYXRlZ3kuc2V0TG9vc2VBcmNoaXZlKGxvb3NlKTsKLQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCWFMb2FkU3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUxvYWRTdHJhdGVneShnZXRVUkkoKSk7Ci0JCWVsc2UKLQkJCWFMb2FkU3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KGdldFVSSSgpLCBwYXJlbnQuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCi0JCXJldHVybiBhTG9hZFN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnkgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBhYnNvbHV0ZVBhdGgpIHsKLQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwoKTsKLQkJZW50cnkuc2V0QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGFsbCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgdG8gYWJzb2x1dGUgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cmllcyhTdHJpbmdbXSBlbnRyaWVzLCBTdHJpbmcgcGFyZW50UGF0aCkgewotCi0JCUxpc3QgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KGVudHJpZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJLyoKLQkJCSAqIEFkZGVkIGZvciBsb29zZSBtb2R1bGUgc3VwcG9ydCAtIGlmIHRoZSBjYW5hbm9uaWNhbGl6ZWQgZW50cnkgcmVzb2x2ZXMgdG8gYW4gYXJjaGl2ZQotCQkJICogaW4gdGhlIGNvbnRhaW5pbmcgZWFyLCB0aGVuIGFkZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGF0IGFyY2hpdmUKLQkJCSAqLwotCQkJQXJjaGl2ZSBkZXBlbmRlbnRKYXIgPSByZXNvbHZlQ2xhc3NwYXRoRW50cnlJbkVBUihlbnRyeSk7Ci0JCQlpZiAoZGVwZW5kZW50SmFyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgcnVuRW50cnkgPSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZGVwZW5kZW50SmFyLmdldEJpbmFyaWVzUGF0aCgpLCBlbnRyeSk7Ci0JCQkJCXJ1bkVudHJ5LnNldFJlZmVyZW5jZWRBcmNoaXZlKGRlcGVuZGVudEphcik7Ci0JCQkJCWFMaXN0LmFkZChydW5FbnRyeSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBzaG91bGRudEhhcHBlbkluUnVudGltZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJCS8vT3RoZXJ3aXNlLCBjb21wdXRlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeSByZWxhdGl2ZSB0bwotCQkJLy8gdGhpcyBqYXIKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZW50cnkpOwotCQkJU3RyaW5nIGFic1BhdGggPSBudWxsOwotCQkJaWYgKGFGaWxlLmlzQWJzb2x1dGUoKSkKLQkJCQlhYnNQYXRoID0gYUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQllbHNlIHsKLQkJCQlhYnNQYXRoID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkocGFyZW50UGF0aCwgZW50cnkpOwotCQkJCWFic1BhdGggPSBDbGFzc3BhdGhVdGlsLm5vcm1hbGl6ZVBhdGgoYWJzUGF0aCk7Ci0JCQl9Ci0JCQlhTGlzdC5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFic1BhdGgsIGVudHJ5KSk7Ci0JCX0KLQotCQlyZXR1cm4gYUxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoU3RyaW5nIGFic29sdXRlUGF0aCwgU3RyaW5nIG1hbmlmZXN0VmFsdWUpIHsKLQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFic29sdXRlUGF0aCk7Ci0JCWVudHJ5LnNldE1hbmlmZXN0VmFsdWUobWFuaWZlc3RWYWx1ZSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShqYXZhLmlvLkZpbGUgZGlyLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZXhwYW5zaW9uRmxhZ3MpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9yRGlyZWN0b3J5KFN0cmluZyBhVXJpLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKGFVcmksIGV4cGFuc2lvbkZsYWdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckphcihqYXZhLmlvLkZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmV4aXN0cygpICYmIGFGaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5maWxlX2V4aXN0X2FzX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde2FGaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsvLyA9ICJBIGZpbGUgbmFtZWQgezB9IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkiCi0JCWphdmEuaW8uRmlsZSBwYXJlbnQgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShhRmlsZSk7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChvdXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdChpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uIHsKLQkJZXh0cmFjdE5vUmVvcGVuKGV4cGFuc2lvbkZsYWdzKTsKLQkJcmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0Tm9SZW9wZW4oaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgYVVyaSA9IGdldFVSSSgpOwotCQlqYXZhLmlvLkZpbGUgYURpciA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCWJvb2xlYW4gaW5Vc2UgPSBnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFEaXIpOwotCi0JCXRyeSB7Ci0JCQlqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25EaXIgPSBpblVzZSA/IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBEaXJlY3RvcnkoYVVyaSwgYURpci5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGFyZW50RmlsZSgpKSA6IGFEaXI7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShkZXN0aW5hdGlvbkRpciwgZXhwYW5zaW9uRmxhZ3MpOwotCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCWNsb3NlKCk7Ci0JCQlpZiAoaW5Vc2UpIHsKLQkJCQljbGVhbnVwQWZ0ZXJUZW1wU2F2ZShhVXJpLCBhRGlyLCBkZXN0aW5hdGlvbkRpcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmVycm9yX3NhdmluZ19FWENfLCAobmV3IE9iamVjdFtde3VyaX0pKSwgZXgpOyAvLyA9ICJFcnJvciBzYXZpbmcgIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG8oamF2YS5sYW5nLlN0cmluZyBhVXJpLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBhRGlyID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzVXNpbmcoYURpcikpCi0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5FeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfKTsgLy8gPSAiRXh0cmFjdCBkZXN0aW5hdGlvbiBpcyB0aGUgc2FtZSBwYXRoIGFzIHNvdXJjZSBmaWxlIgotCi0JCXRyeSB7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShhRGlyLCBleHBhbnNpb25GbGFncyk7Ci0JCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5lcnJvcl9zYXZpbmdfRVhDXywgKG5ldyBPYmplY3RbXXthVXJpfSkpLCBleCk7IC8vID0gIkVycm9yIHNhdmluZyAiCi0JCX0KLQotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlc0J5UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzKHByZWZpeCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGZpbHRlckZpbGVzKFN0cmluZyBwcmVmaXgsIFN0cmluZ1tdIHN1ZmZpeGVzKSB7Ci0JCUxpc3Qgc3Vic2V0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZUZpbGVzID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSB0aGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIWFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSAmJiBhRmlsZS5nZXRVUkkoKS5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJaWYgKHN1ZmZpeGVzID09IG51bGwgfHwgaGFzU3VmZml4KGFGaWxlLmdldFVSSSgpLCBzdWZmaXhlcykpCi0JCQkJCXN1YnNldC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBzdWJzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBzdWZmaXhlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzU3VmZml4KFN0cmluZyBhVXJpLCBTdHJpbmdbXSBzdWZmaXhlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYVVyaS5lbmRzV2l0aChzdWZmaXhlc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlc1dpdGhvdXRQcmVmaXgoU3RyaW5nW10gcHJlZml4ZXMpIHsKLQkJTGlzdCBzdWJzZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlRmlsZXMgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIHRoZUZpbGVzLmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpCi0JCQkJY29udGludWU7Ci0JCQlib29sZWFuIHNob3VsZEFkZCA9IHRydWU7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByZWZpeGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKGFGaWxlLmdldFVSSSgpLnN0YXJ0c1dpdGgocHJlZml4ZXNbal0pKSB7Ci0JCQkJCXNob3VsZEFkZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2hvdWxkQWRkKQotCQkJCXN1YnNldC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBzdWJzZXQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0QXJjaGl2ZUNsYXNzTG9hZGVyKCkgewotCQlpZiAoYXJjaGl2ZUNsYXNzTG9hZGVyID09IG51bGwpCi0JCQlpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJcmV0dXJuIGFyY2hpdmVDbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBcmNoaXZlRmlsZXMoKSB7Ci0JCUxpc3QgYXJjaGl2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkgewotCQkJCWFyY2hpdmVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBtYW5pZmVzdCBjbGFzcyBwYXRoIGFuZCB0aGUgZXh0cmEgY2xhc3MgcGF0aCwgYW5kIGluc3RhbnRpYXRlIGEgVVJMIGNsYXNzbG9hZGVyLAotCSAqIHdpdGggYSBwYXJlbnQgb2YgdGhlIGFyY2hpdmVDbGFzc0xvYWRlcgotCSAqLwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXRDbGFzc1BhdGhDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCkgewotCi0JCUxpc3QgY2xhc3NQYXRoQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGdldE1hbmlmZXN0KCkgIT0gbnVsbCkKLQkJCWNsYXNzUGF0aENvbXBvbmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKSkpOwotCQlTdHJpbmcgZXh0cmFDcCA9IGdldEV4dHJhQ2xhc3NwYXRoKCk7Ci0JCWlmIChleHRyYUNwICE9IG51bGwpCi0JCQljbGFzc1BhdGhDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KEFyY2hpdmVVdGlsLmdldFRva2VucyhleHRyYUNwLCAiOyIpKSk7Ly8kTk9OLU5MUy0xJAotCi0JCWphdmEubmV0LlVSTFtdIHVybEFycmF5ID0gQXJjaGl2ZVV0aWwudG9Mb2NhbFVSTHMoY2xhc3NQYXRoQ29tcG9uZW50cywgZ2V0Um9vdEZvclJlbGF0aXZlRGVwZW5kZW50SmFycygpKTsKLQkJcmV0dXJuIG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcih1cmxBcnJheSwgcGFyZW50Q2wpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBmb3IgdGhlIGN1c3RvbSBjbGFzcyBsb2FkZXIgdXNlZCBieSB0aGlzIGFyY2hpdmUKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0RGVmYXVsdENsYXNzTG9hZGVyKCkgewotCQlDbGFzc0xvYWRlciBwbHVnaW5DbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJcmV0dXJuIHBsdWdpbkNsYXNzTG9hZGVyID09IG51bGwgPyBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpIDogcGx1Z2luQ2xhc3NMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYWxsIHRoZSBjbGFzc3BhdGggZW50cmllcyB0byBhYnNvbHV0ZSBwYXRocwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEVudHJpZXNBc0Fic29sdXRlUGF0aHMoU3RyaW5nW10gZW50cmllcywgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQotCQlMaXN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCS8qCi0JCQkgKiBBZGRlZCBmb3IgbG9vc2UgbW9kdWxlIHN1cHBvcnQgLSBpZiB0aGUgY2FuYW5vbmljYWxpemVkIGVudHJ5IHJlc29sdmVzIHRvIGFuIGFyY2hpdmUKLQkJCSAqIGluIHRoZSBjb250YWluaW5nIGVhciwgdGhlbiBhZGQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhhdCBhcmNoaXZlCi0JCQkgKi8KLQkJCUFyY2hpdmUgZGVwZW5kZW50SmFyID0gcmVzb2x2ZUNsYXNzcGF0aEVudHJ5SW5FQVIoZW50cnkpOwotCQkJaWYgKGRlcGVuZGVudEphciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYUxpc3QuYWRkKGRlcGVuZGVudEphci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBzaG91bGRudEhhcHBlbkluUnVudGltZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJCS8vT3RoZXJ3aXNlLCBjb21wdXRlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeSByZWxhdGl2ZSB0bwotCQkJLy8gdGhpcyBqYXIKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZW50cnkpOwotCQkJaWYgKGFGaWxlLmlzQWJzb2x1dGUoKSkKLQkJCQlhTGlzdC5hZGQoYUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJZWxzZQotCQkJCWFMaXN0LmFkZChBcmNoaXZlVXRpbC5nZXRPU1VyaShwYXJlbnRQYXRoLCBlbnRyeSkpOwotCQl9Ci0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRyYUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIGV4dHJhQ2xhc3NwYXRoOwotCX0KLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLCBzcGVjaWZpY2FsbHkgYXMgYW4gb3B0aW1pemF0aW9uIHdoZW4gc2F2aW5nL2V4cGxvZGluZwotCSAqIGFyY2hpdmVzIHdpdGggbmVzdGVkIGFyY2hpdmVzCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yIGdldEZpbGVzRm9yU2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRGaWxlSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKGdldExvYWRpbmdDb250YWluZXIoKSAhPSBudWxsIHx8IGdldExvYWRTdHJhdGVneSgpID09IG51bGwgfHwgZ2V0TG9hZFN0cmF0ZWd5KCkuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBzdXBlci5nZXRJbnB1dFN0cmVhbSgpOwotCi0JCS8vVGhpcyBhcmNoaXZlIHdhcyBjb3BpZWQgaW47IHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yCi0JCS8vIG1vZHVsZSBmaWxlcwotCQlpZiAoaXNNb2R1bGVGaWxlKCkgfHwgIWdldE9wdGlvbnMoKS5pc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZGVmaW5lZCBzdGF0ZSBvZiBuZXN0ZWQgYXJjaGl2ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy9XZSBoYXZlIHRvIGZpbmQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG9yaWdpbmFsIGFyY2hpdmUgZnJvbSB3aGljaAotCQkvLyB0aGlzIHdhcyBjb3BpZWQsCi0JCS8vaWYgaXQgaXMga25vd24KLQotCQlMaXN0IGxpc3QgPSBnZXRGaWxlcygpOwotCi0JCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpCi0JCQkJY29udGludWU7Ci0JCQlhYnNvbHV0ZVBhdGggPSBhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShhYnNvbHV0ZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyBhVXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShhVXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGdldEphdmFBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChKYXZhSkRLQWRhcHRlckZhY3RvcnkpIEVjb3JlVXRpbC5nZXRBZGFwdGVyRmFjdG9yeShnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIHJldHVybnMgYW4gaW1tdXRhYmxlIGNvbGxlY3Rpb24gb2YgdGhlIGxvYWRlZAotCSAqICAgICAgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZSBzZXQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqLwotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluID0gZ2V0SW5wdXRTdHJlYW0oSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQkJCW1ha2VNYW5pZmVzdChpbik7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQltYWtlTWFuaWZlc3QoKTsKLQkJCX0gY2F0Y2ggKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJCVdyYXBwZWRFeGNlcHRpb24gd3JhcEV4ID0gbmV3IFdyYXBwZWRFeGNlcHRpb24oKGV4KS5nZXRXcmFwcGVkRXhjZXB0aW9uKCkpOwotCQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKHdyYXBFeCkpCi0JCQkJCW1ha2VNYW5pZmVzdCgpOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuaW9fZXhfbWFuaWZlc3RfRVhDXywgKG5ldyBPYmplY3RbXXtnZXRVUkkoKX0pKSwgZXgpOyAvLyA9ICJBbiBJT0V4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHRoZSBtYW5pZmVzdDogIgotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5pb19leF9tYW5pZmVzdF9FWENfLCAobmV3IE9iamVjdFtde2dldFVSSSgpfSkpLCBleCk7IC8vID0gIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgdGhlIG1hbmlmZXN0OiAiCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIG1hbmlmZXN0IGRvZXMgbm90Ci0JCS8vIHNlcmlhbGl6ZSBjb3JyZWN0bHkgaWYKLQkJLy9UaGUgdmVyc2lvbiBpcyBub3Qgc2V0LiBJbiBhZGRpdGlvbiB0byBzYXZlcywgdGhlIHNlcmlhbGl6YXRpb24gaXMKLQkJLy8gdXNlZCBmb3IgY29weQotCQlpZiAobWFuaWZlc3QuZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBtYW5pZmVzdC5nZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQltYW5pZmVzdC5zZXRNYW5pZmVzdFZlcnNpb24oIjEuMCIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRNb2ZSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoU3RyaW5nIGFVcmkpIHsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2UgPSBnZXRNb2ZSZXNvdXJjZShhVXJpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UgPSBtYWtlTW9mUmVzb3VyY2UoYVVyaSk7Ci0JCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZG94KSB7Ci0JCQkJLy9XZSBqdXN0IGNoZWNrZWQgZm9yIHRoaXM7IGl0IHdvbid0IGhhcHBlbgotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBsb29raW5nIGF0IHRoZSBjbGFzcyBwYXRoIG9mIHRoaXMgamFyIChmcm9tIHRoZSBtYW5pZmVzdCksIHNvbWUgb2YgdGhlIGVsZW1lbnRzIG1heSBoYXZlCi0JICogYSByZWxhdGl2ZSBwYXRoLCB0aHVzIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnN0YWxsIGxvY2F0aW9uIG9mIHRoaXMgamFyLiBJZiB0aGUgYWJzb2x1dGUKLQkgKiBwYXRoIGZyb20gd2hpY2ggdGhlIGFyY2hpdmUgd2FzIGxvYWRlZCwgcmV0dXJuIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoYXQgcGF0aDsgb3RoZXJ3aXNlLAotCSAqIHNlZSBpZiB0aGUgY29udGFpbmluZyBhcmNoaXZlIGhhcyBhbiBhYnNvbHV0ZSBwYXRoOyBpZiBuZWl0aGVyIHdvcmssIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQKLQkgKiB3b3JraW5nIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdEZvclJlbGF0aXZlRGVwZW5kZW50SmFycygpIHsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlDb250YWluZXIgdGhlQ29udGFpbmVyID0gdGhpczsKLQkJd2hpbGUgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHBhdGggPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwYXRoID0gdGhlQ29udGFpbmVyLmdldEFic29sdXRlUGF0aCgpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCXRoZUNvbnRhaW5lciA9IHRoZUNvbnRhaW5lci5nZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCX0KLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCS8vQXQgdGhpcyBwb2ludCB3aGF0IGVsc2UgY2FuIHdlIGRvPwotCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShwYXRoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aDsKLQkJdHJ5IHsKLQkJCWFic29sdXRlUGF0aCA9IGdldEJpbmFyaWVzUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkKGFic29sdXRlUGF0aCk7Ci0KLQkJU3RyaW5nIHBhcmVudFBhdGggPSBuZXcgamF2YS5pby5GaWxlKGFic29sdXRlUGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlTdHJpbmdbXSBtZkVudHJpZXMgPSBnZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQllbnRyaWVzLmFkZEFsbChnZXRFbnRyaWVzQXNBYnNvbHV0ZVBhdGhzKG1mRW50cmllcywgcGFyZW50UGF0aCkpOwotCi0JCXJldHVybiAoU3RyaW5nW10pIGVudHJpZXMudG9BcnJheShuZXcgU3RyaW5nW2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIGdldFNhdmVGaWx0ZXIoKSB7Ci0JCXJldHVybiBzYXZlRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA0LzAwIDM6MzE6MzIgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgZ2V0U2F2ZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gc2F2ZVN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXJldHVybiB4bWxFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDbGFzc0xvYWRlcigpIHsKLQkJLy9Tb21lIGxvYWQgc3RyYXRlZ2llcyBtYXkgcHJvdmlkZSBhIG1vZiBjb250ZXh0IGZvciB3aGljaAotCQkvL2FuIGFsdGVybmF0ZSBjbGFzcyBsb2FkZXIgaXMgbm90IG5lY2Vzc2FyeQotCQlpZiAoIXNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCkpCi0JCQlyZXR1cm47Ci0JCUNsYXNzTG9hZGVyIGV4dHJhQ2wgPSBudWxsOwotCQlDbGFzc0xvYWRlciBkZWZhdWx0Q2wgPSBnZXREZWZhdWx0Q2xhc3NMb2FkZXIoKTsKLQkJaWYgKGdldENvbnRhaW5lcigpID09IG51bGwgfHwgIWdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpKQotCQkJZXh0cmFDbCA9IGdldENsYXNzUGF0aENsYXNzTG9hZGVyKGRlZmF1bHRDbCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gY3JlYXRlRHluYW1pY0NsYXNzTG9hZGVyKGRlZmF1bHRDbCwgZXh0cmFDbCk7Ci0JCXNldEFyY2hpdmVDbGFzc0xvYWRlcihjbCk7Ci0JCUphdmFKREtBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SmF2YUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWZhY3Rvcnkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKLQkJZmFjdG9yeS5mbHVzaEFsbCgpOwotCX0KLQotCXB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcih0aGlzLCBwYXJlbnRDbCwgZXh0cmFDbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCXJldHVybiBjb250YWluc0ZpbGUoYVVyaSkgfHwgaXNNb2ZSZXNvdXJjZUxvYWRlZChhVXJpKSB8fCBKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSS5lcXVhbHMoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmlmZXN0U2V0KCkgewotCQlyZXR1cm4gbWFuaWZlc3QgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5pc01vZlJlc291cmNlTG9hZGVkKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQganVzdCB0ZXN0IHRoZSBleHRlbnNpb24gb2YgdGhlIHVyaSBmb3Igb25lIG9mIHRoZSBrbm93biBhcmNoaXZlIHR5cGVzOyBzdWJjbGFzc2VzCi0JICogbWF5IHdoaWNoIHRvIG92ZXJyaWRlLgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRBcmNoaXZlKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQkvLzExMDM5MC4zIEVycm9yIGxvYWRpbmcgYWx0LWJpbmRpbmdzCi0JCS8qCi0JCSAqIERvbid0IGluZmVyIHRoYXQgYSBmb2xkZXIgd2hpY2ggZW5kcyB3aXRoIC5qYXIgaXMgYW4gZXhwbG9kZWQgYXJjaGl2ZTsgRUFSIGZpbGUgd2lsbCBkbwotCQkgKiB0aGF0IElGIHRoZSBmb2xkZXIgaXMgZGVjbGFyZWQgYXMgYSBtb2R1bGUgaW4gdGhlIEVBUgotCQkgKi8KLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShnZXRBYnNvbHV0ZVBhdGgoKSwgYVVyaSk7Ci0JCQkJamF2YS5pby5GaWxlIGlvRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7Ci0JCQkJaWYgKCFpb0ZpbGUuZXhpc3RzKCkgfHwgKGlvRmlsZS5pc0RpcmVjdG9yeSgpICYmIGFVcmkuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLkFMVF9JTkYpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LklOU1RBTkNFLmlzS25vd25BcmNoaXZlVHlwZShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpICE9IG51bGwgJiYgZ2V0TG9hZFN0cmF0ZWd5KCkuaXNPcGVuKCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBtYWtlTWFuaWZlc3QoKSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCk7Ci0JCXNldE1hbmlmZXN0KG1mKTsKLQkJcmV0dXJuIG1mOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgbWFrZU1hbmlmZXN0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0JCXNldE1hbmlmZXN0KG1mKTsKLQkJcmV0dXJuIG1mOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIGFVcmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlyZXR1cm4gbWFrZU1vZlJlc291cmNlKGFVcmksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlI21ha2VNb2ZSZXNvdXJjZShTdHJpbmcsIEVMaXN0KQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIGFVcmksIEVMaXN0IGV4dGVudCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0R1cGxpY2F0ZShhVXJpKSkKLQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kdXBsaWNhdGVfZW50cnlfRVhDXywgKG5ldyBPYmplY3RbXXthVXJpLCBnZXRVUkkoKX0pKSk7IC8vID0gIkEgZmlsZSBvciByZXNvdXJjZSB3aXRoIHVyaSB7MH0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUgbmFtZWQgezF9IgotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkubWFrZU1vZlJlc291cmNlKGFVcmksIGV4dGVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIGFVcmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5OZXN0ZWRBcmNoaXZlKGFVcmksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3Blbk5lc3RlZEFyY2hpdmUobG9vc2UsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGV4dHJhIGNsYXNzIHBhdGggd2l0aCBubyByZWZyZXNoIG9mIHRoZSBjbGFzcyBsb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2V0RXh0cmFDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZyBuZXdFeHRyYUNsYXNzcGF0aCkgewotCQlleHRyYUNsYXNzcGF0aCA9IG5ld0V4dHJhQ2xhc3NwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBhcmNoaXZlIGNsYXNzIGxvYWRlciB0byBwcmV2ZW50IGdjIHByb2JsZW1zIG9yIHByb2JsZW1zIHdpdGggdGVtcAotCSAqIGZpbGVzIG5vdCBnZXR0aW5nIGRlbGV0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQ2xhc3NMb2FkZXIoKSB7Ci0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJc2V0QXJjaGl2ZUNsYXNzTG9hZGVyKG51bGwpOwotCQkJZ2V0SmF2YUFkYXB0ZXJGYWN0b3J5KCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoRmlsZSBhRmlsZSkgewotCQlnZXRGaWxlcygpLnJlbW92ZShhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW9wZW4oKSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uIHsKLQkJcmVvcGVuKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgcmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uIHsKLQkJTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kgPSBudWxsOwotCQl0cnkgewotCQkJYUxvYWRTdHJhdGVneSA9IGNyZWF0ZUxvYWRTdHJhdGVneUZvclJlb3BlbihwYXJlbnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJlb3BlbkV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmlvX2V4X3Jlb3Blbl9FWENfLCAobmV3IE9iamVjdFtde2dldFVSSSgpfSkpLCBleCk7IC8vID0gIklPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlb3BlbmluZyAiCi0JCX0KLQkJLy9QUTU0NTcyCi0JCUxvYWRTdHJhdGVneSBjdXJyZW50ID0gZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCWFMb2FkU3RyYXRlZ3kuc2V0UmVzb3VyY2VTZXQoY3VycmVudC5wcmltR2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkvKgotCQkJICogZml4aW5nIHByb2JsZW0gd2l0aCBvcnBoYW5lZCBsb2FkIHN0cmF0ZWd5IGxpc3RlbmluZyB0byB0aGUgcmVzb3VyY2Ugc2V0Ci0JCQkgKi8KLQkJCWN1cnJlbnQuc2V0UmVzb3VyY2VTZXQobnVsbCk7Ci0JCX0KLQotCQlzZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQlpZiAoIWlzSW5kZXhlZCgpKQotCQkJcmV0dXJuOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBmID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWYuc2V0T3JpZ2luYWxVUkkoZi5nZXRVUkkoKSk7Ci0JCQlmLnNldExvYWRpbmdDb250YWluZXIodGhpcyk7Ci0JCQlpZiAoZi5pc0FyY2hpdmUoKSkKLQkJCQkoKEFyY2hpdmUpIGYpLnJlb3Blbih0aGlzKTsKLQkJfQotCQlnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmFyY2hpdmVPcGVuZWQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVJvb3QoUmVzb3VyY2UgYVJlc291cmNlLCBFT2JqZWN0IHJvb3QpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFTGlzdCBleHRlbnQgPSBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJRU9iamVjdCBleGlzdGluZ1Jvb3QgPSBudWxsOwotCQlpZiAoIWV4dGVudC5pc0VtcHR5KCkpIHsKLQkJCWV4aXN0aW5nUm9vdCA9IChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOwotCQkJaWYgKGV4aXN0aW5nUm9vdCA9PSByb290KQotCQkJCXJldHVybjsKLQkJCWV4dGVudC5yZW1vdmUoMCk7Ci0JCX0KLQkJaWYgKHJvb3QgIT0gbnVsbCkKLQkJCWV4dGVudC5hZGQoMCwgcm9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgcmVzb2x2ZUNsYXNzcGF0aEVudHJ5SW5FQVIoU3RyaW5nIGVudHJ5KSB7Ci0JCS8qCi0JCSAqIEFkZGVkIHRvIHN1cHBvcnQgcnVudGltZSBjbGFzc3BhdGggZm9yIGxvb3NlIG1vZHVsZXMKLQkJICovCi0JCUNvbnRhaW5lciBwYXJlbnQgPSBnZXRDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuaXNFQVJGaWxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYVVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGVudHJ5LCB0aGlzKTsKLQkJaWYgKGFVcmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUZpbGUgYUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJYUZpbGUgPSBwYXJlbnQuZ2V0RmlsZShhVXJpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhRmlsZS5pc0FyY2hpdmUoKSA/IChBcmNoaXZlKSBhRmlsZSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb24gewotCQlzYXZlQXMoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgYVN0cmF0ZWd5KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlzZXRTYXZlU3RyYXRlZ3koYVN0cmF0ZWd5KTsKLQkJU2F2ZUZpbHRlciBleGlzdGluZ0ZpbHRlciA9IGFTdHJhdGVneS5nZXRGaWx0ZXIoKTsKLQkJYm9vbGVhbiBvbGREZWxpdmVyeSA9IGVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKSkKLQkJCQllU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQlhU3RyYXRlZ3kuc2V0RmlsdGVyKGdldFNhdmVGaWx0ZXIoKSk7Ci0JCQlhU3RyYXRlZ3kuc2F2ZSgpOwotCQkJdHJ5IHsKLQkJCQlhU3RyYXRlZ3kuZmluaXNoKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlveCkgewotCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihnZXRVUkkoKSwgaW94KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vV2UgaGF2ZSB0byBsZWF2ZSB0aGUgZmlsZSBpbmRleCBpZiB3ZSBhcmUgYSBkaXJlY3RvcnkgYmVjYXVzZSB3ZQotCQkJLy8gbWlnaHQgaGF2ZQotCQkJLy9vcGVuIGZpbGUgaGFuZGxlcyB0byBhcmNoaXZlcwotCQkJaWYgKGdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkgJiYgIWdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlmaWxlcy5jbGVhcigpOwotCQkJCS8vKChCYXNpY0VMaXN0KWZpbGVzKS5zZXRMaXN0SW1wbGVtZW50YXRpb24obmV3IEFycmF5TGlzdCgwKSk7Ci0JCQkJZVNldERlbGl2ZXIob2xkRGVsaXZlcnkpOwotCQkJCWVBZGFwdGVycygpLnJlbW92ZShnZXRGaWxlSW5kZXhBZGFwdGVyKCkpOwotCQkJCWZpbGVJbmRleEFkYXB0ZXIgPSBudWxsOwotCQkJCWZpbGVJbmRleCA9IG51bGw7Ci0JCQl9Ci0JCQlzZXRTYXZlU3RyYXRlZ3kobnVsbCk7Ci0JCQlhU3RyYXRlZ3kuc2V0RmlsdGVyKGV4aXN0aW5nRmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBhVXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCXNhdmVBc05vUmVvcGVuKGFVcmkpOwotCQlyZW9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBjYW4gcmVuYW1lIGl0IHRoZW4gd2UgY2FuIGRlbGV0ZSBpdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVuYW1lYWJsZShqYXZhLmlvLkZpbGUgb3JpZykgewotCQlqYXZhLmlvLkZpbGUgb3JpZ0NvcHkxID0gbnVsbDsKLQkJamF2YS5pby5GaWxlIG9yaWdDb3B5MiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvcmlnQ29weTEgPSBvcmlnLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCW9yaWdDb3B5MiA9IG9yaWcuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgYmFzZU5hbWUgPSAic2F2ZS50bXAiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAob3JpZy5nZXRQYXJlbnQoKSAhPSBudWxsKQotCQkJCWJhc2VOYW1lID0gbmV3IGphdmEuaW8uRmlsZShvcmlnLmdldFBhcmVudCgpLCBiYXNlTmFtZSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlqYXZhLmlvLkZpbGUgdGVtcCA9IG51bGw7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWRvIHsKLQkJCW5hbWUgPSBiYXNlTmFtZSArIGluZGV4OwotCQkJdGVtcCA9IG5ldyBqYXZhLmlvLkZpbGUobmFtZSk7Ci0JCQlpbmRleCsrOwotCQl9IHdoaWxlICh0ZW1wLmV4aXN0cygpKTsKLQkJcmV0dXJuIG9yaWdDb3B5MS5yZW5hbWVUbyh0ZW1wKSAmJiB0ZW1wLnJlbmFtZVRvKG9yaWdDb3B5Mik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tXcml0ZWFibGUoamF2YS5pby5GaWxlIGRlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgbG9ja2VkID0gQXJjaGl2ZVV0aWwuZ2V0V3JpdGVQcm90ZWN0ZWRGaWxlcyhkZXN0LCBudWxsKTsKLQkJaWYgKGxvY2tlZC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbXNnLmFwcGVuZCgiQ2Fubm90IHdyaXRlIHRvIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCW1zZy5hcHBlbmQoIk9uZSBvciBtb3JlIGZpbGVzIGlzIHdyaXRlIHByb3RlY3RlZCBvciBsb2NrZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZCgnXG4nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NrZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IChqYXZhLmlvLkZpbGUpIGxvY2tlZC5nZXQoaSk7Ci0JCQltc2cuYXBwZW5kKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKG1zZy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBc05vUmVvcGVuKFN0cmluZyBhVXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFVcmkpOwotCQljaGVja1dyaXRlYWJsZShhRmlsZSk7Ci0JCWJvb2xlYW4gZmlsZUV4aXN0ZWQgPSBhRmlsZS5leGlzdHMoKTsKLQkJLy9ib3RwIDE0MjE0OQotCQkvL2Jvb2xlYW4gaW5Vc2UgPSBnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFGaWxlKTsKLQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25GaWxlID0gZmlsZUV4aXN0ZWQgPyBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRmlsZShhVXJpLCBhRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGFyZW50RmlsZSgpKSA6IGFGaWxlOwotCQkJCWFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JKYXIoZGVzdGluYXRpb25GaWxlKTsKLQkJCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCQl0aGlzLmNsb3NlKCk7Ci0JCQkJaWYgKGZpbGVFeGlzdGVkKSB7Ci0JCQkJCWNsZWFudXBBZnRlclRlbXBTYXZlKGFVcmksIGFGaWxlLCBkZXN0aW5hdGlvbkZpbGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5lcnJvcl9zYXZpbmdfRVhDXywgKG5ldyBPYmplY3RbXXthVXJpfSkpLCBleCk7IC8vID0gIkVycm9yIHNhdmluZyAiCi0JCQl9Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsdXJlRXhjZXB0aW9uIGZhaWx1cmUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGFTYXZlU3RyYXRlZ3kgIT0gbnVsbCkKLQkJCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlpZiAoIWZpbGVFeGlzdGVkKQotCQkJCWFGaWxlLmRlbGV0ZSgpOwotCQkJdGhyb3cgZmFpbHVyZTsKLQkJfQotCi0JCXNldFVSSShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVOb1Jlb3BlbigpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXNhdmVBc05vUmVvcGVuKGdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdBcmNoaXZlQ2xhc3NMb2FkZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3QXJjaGl2ZUNsYXNzTG9hZGVyKSB7Ci0JCWFyY2hpdmVDbGFzc0xvYWRlciA9IG5ld0FyY2hpdmVDbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzcGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpIHsKLQkJcHJpbVNldEV4dHJhQ2xhc3NwYXRoKG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQkJLy9PcHRpbWl6YXRpb24gLSBvbmx5IHJlIGluaXQgaWYgYSBjbCBleGlzdHM7IG90aGVyd2lzZSBpdCB3aWxsIGluaXQgb24KLQkJLy8gZGVtYW5kCi0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgIT0gbnVsbCkKLQkJCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoQXJjaGl2ZU1hbmlmZXN0IG5ld01hbmlmZXN0KSB7Ci0JCW1hbmlmZXN0ID0gbmV3TWFuaWZlc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGFNYW5pZmVzdCkgewotCQlzZXRNYW5pZmVzdCgoQXJjaGl2ZU1hbmlmZXN0KSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsKGFNYW5pZmVzdCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIENsYXNzLXBhdGggbWFuaWZlc3QgZW50cnksIHJlYnVpbGRzIHRoZSBjbGFzcyBsb2FkZXIsIGFuZCByZWZyZXNoZXMgYW55IHJlZmxlY3RlZAotCSAqIGphdmEgY2xhc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0Q2xhc3NQYXRoQW5kUmVmcmVzaChTdHJpbmcgY2xhc3NwYXRoKSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IGdldE1hbmlmZXN0KCk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0JCQltYWtlTWFuaWZlc3QoKTsKLQkJfQotCQltZi5zZXRDbGFzc1BhdGgoY2xhc3NwYXRoKTsKLQkJLy9PcHRpbWl6YXRpb24gLSBvbmx5IHJlIGluaXQgaWYgYSBjbCBleGlzdHM7IG90aGVyd2lzZSBpdCB3aWxsIGluaXQgb24KLQkJLy8gZGVtYW5kCi0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgIT0gbnVsbCkKLQkJCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBuZXdPcHRpb25zKSB7Ci0JCW9wdGlvbnMgPSBuZXdPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUZpbHRlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgbmV3U2F2ZUZpbHRlcikgewotCQlzYXZlRmlsdGVyID0gbmV3U2F2ZUZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNC8wMCAzOjMxOjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTYXZlU3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZVN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneSBuZXdTYXZlU3RyYXRlZ3kpIHsKLQkJc2F2ZVN0cmF0ZWd5ID0gbmV3U2F2ZVN0cmF0ZWd5OwotCQlpZiAobmV3U2F2ZVN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld1NhdmVTdHJhdGVneS5zZXRBcmNoaXZlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3WG1sRW5jb2RpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld1htbEVuY29kaW5nKSB7Ci0JCXhtbEVuY29kaW5nID0gbmV3WG1sRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgamF2YSByZWZsZWN0aW9uIHNob3VsZCBiZSBzZXQgdXAgZm9yIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gZ2V0T3B0aW9ucygpLnVzZUphdmFSZWZsZWN0aW9uKCkgJiYgZ2V0TG9hZFN0cmF0ZWd5KCkuaXNDbGFzc0xvYWRlck5lZWRlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRocm93UmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyByZXNvdXJjZVVyaSwgRXhjZXB0aW9uIGV4KSB0aHJvd3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFJlc291cmNlTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmxvYWRfcmVzb3VyY2VfRVhDXywgKG5ldyBPYmplY3RbXXtyZXNvdXJjZVVyaSwgZ2V0VVJJKCl9KSksIGV4KTsgLy8gPSAiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgInswfSIgaW4gYXJjaGl2ZSAiezF9IiIKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldFJlc291cmNlc1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJpbmFyaWVzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVtcHR5Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVswXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGludGVybmFsR2V0QmluYXJpZXNQYXRoKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCByZXR1cm4ganVzdCB0aGUgY29udGVudHMgb2YgdGhpcyBhcmNoaXZlCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldExvY2FsUnVudGltZUNsYXNzUGF0aCgpIHsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gaW50ZXJuYWxHZXRCaW5hcmllc1BhdGgoKTsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W117Y3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFic29sdXRlUGF0aCl9OwotCX0KLQotCQotIAlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aEF0VGhpc0xldmVsKCkgewotCQkvLyBCWiAxNzA1MzI6IERvbid0IHVzZSB0aGUgYXJjaGl2ZSdzIGFic29sdXRlIHBhdGggd2hlbiB0aGUKLQkJLy8gYXJjaGl2ZSBpcyBsb29zZWx5IG1hcHBlZC4gIFRoZSBjdXJyZW50IGFyY2hpdmUncyBhYnNvbHV0ZQotCQkvLyBwYXRoLCBnZW5lcmFsbHksIHdpbGwgbm90IGJlIGluIGEgZml4ZWQgbG9jYXRpb24gcmVsYXRpdmUKLQkJLy8gdG8gdGhlIHBhdGggb2YgdGhlIHBhcmVudCBhcHBsaWNhdGlvbi4KLQkJU3RyaW5nIHBhcmVudFBhdGggPSBnZXRQYXJlbnRQYXRoKCk7Ci0JCWlmICggcGFyZW50UGF0aCA9PSBudWxsICkKLSAJCQlyZXR1cm4gZW1wdHlDbGFzc3BhdGgoKTsKLQkJCi0gCQlTdHJpbmdbXSBtZkVudHJpZXMgPSBnZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlpZiAoIG1mRW50cmllcy5sZW5ndGggPT0gMCApCi0gCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCQotIAkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZEFsbCggY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJpZXMobWZFbnRyaWVzLCBwYXJlbnRQYXRoKSApOwotIAotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkoIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbIGVudHJpZXMuc2l6ZSgpIF0gKTsKLSAJfQotCi0JLyoqCi0JICogPHA+QW5zd2VyIGEgcGFyZW50IHBhdGggZm9yIHVzZSBieSB0aGUgcmVjZWl2ZXIuICBUYWtlIGludG8KLQkgKiBhY2NvdW50IHdlaHRoZXIgdGhlIHJlY2VpdmVyIGlzIGEgbG9vc2UgYXBwbGljYXRpb24gb3Igbm90LgotCSAqIAotCSAqIDxwPkFuc3dlciBudWxsIGluIGNhc2UgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgZGV0ZXJtaW5pbmcKLQkgKiB0aGUgcGFyZW50IHBhdGguPC9wPgotCSAqIAotCSAqIDxwPkFkZGVkIGZvciBCWiAxNzA1MzIuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gQSBwYXJlbnQgcGF0aCBmb3IgdXNlIGJ5IHRoZSByZWNlaXZlci4gIE51bGwgaW4gY2FzZSBvZiBhbiBlcnJvci4KLQkgKiAKLQkgKiAgQHNlZSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFyZW50UGF0aCgpIHsKLQkJdHJ5IHsKLQkJCWlmICggKGdldExvYWRTdHJhdGVneSgpLmdldExvb3NlQXJjaGl2ZSgpICE9IG51bGwpICYmIGdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpICkgewotCQkJCXJldHVybiBnZXRFQVJGaWxlKCkuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldEJpbmFyaWVzUGF0aCgpKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0RnVsbFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0JCXJldHVybiBjb25jYXQoZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCksIGdldERlcGVuZGVuY3lDbGFzc1BhdGgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGNvbmNhdChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBhcnJheTEsIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGFycmF5MikgewotCQlMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRlbXAuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJyYXkxKSk7Ci0JCXRlbXAuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJyYXkyKSk7Ci0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIHRlbXAudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W3RlbXAuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGgoKSB7Ci0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2V0IHZpc2l0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlTZXQgcHJvY2Vzc2VkRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXZpc2l0ZWQuYWRkKHRoaXMpOwotCQlnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKHZpc2l0ZWQsIGVudHJpZXMsIHByb2Nlc3NlZEVudHJpZXMsIHRoaXMpOwotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdldERlcGVuZGVuY3lDbGFzc1BhdGgoU2V0IHZpc2l0ZWRBcmNoaXZlcywgTGlzdCBlbnRyaWVzLCBTZXQgcHJvY2Vzc2VkRW50cmllcywgQXJjaGl2ZSBjdXJyZW50KSB7Ci0KLQkJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gbG9jYWwgPSAoKEFyY2hpdmVJbXBsKSBjdXJyZW50KS5nZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKykgewotCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbG9jYWxbaV07Ci0JCQlpZiAoIXByb2Nlc3NlZEVudHJpZXMuY29udGFpbnMoZW50cnkpKSB7Ci0JCQkJZW50cmllcy5hZGQoZW50cnkpOwotCQkJCXByb2Nlc3NlZEVudHJpZXMuYWRkKGVudHJ5KTsKLQkJCX0KLQkJCUFyY2hpdmUgcmVzb2x2ZWQgPSBlbnRyeS5nZXRSZWZlcmVuY2VkQXJjaGl2ZSgpOwotCQkJaWYgKHJlc29sdmVkID09IG51bGwpCi0JCQkJQ2xhc3NwYXRoVXRpbC5wcm9jZXNzTWFuaWZlc3QoZW50cnkuZ2V0QWJzb2x1dGVQYXRoKCksIGVudHJpZXMsIHByb2Nlc3NlZEVudHJpZXMpOwotCQkJZWxzZSBpZiAoIXZpc2l0ZWRBcmNoaXZlcy5jb250YWlucyhyZXNvbHZlZCkpIHsKLQkJCQl2aXNpdGVkQXJjaGl2ZXMuYWRkKHJlc29sdmVkKTsKLQkJCQlnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKHZpc2l0ZWRBcmNoaXZlcywgZW50cmllcywgcHJvY2Vzc2VkRW50cmllcywgcmVzb2x2ZWQpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlDb250YWluZXIgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIEVBUkZpbGUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUFSRmlsZSkgcGFyZW50OwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIGdldFJlc29sdmVkQXJjaGl2ZShTdHJpbmcgbWZWYWx1ZSwgRUFSRmlsZSBlYXIpIHsKLQkJU3RyaW5nIGFVcmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShtZlZhbHVlLCB0aGlzKTsKLQkJaWYgKGFVcmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIChBcmNoaXZlKSBlYXIuZ2V0RmlsZShhVXJpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4MikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSNoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSBvdGhlcikgewotCQlpZiAob3RoZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRUFSRmlsZSBlYXIgPSBnZXRFQVJGaWxlKCk7Ci0JCWlmIChlYXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU2V0IHZpc2l0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlyZXR1cm4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKG90aGVyLCB2aXNpdGVkLCBlYXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyLCBTZXQgdmlzaXRlZCwgRUFSRmlsZSBlYXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHZpc2l0ZWQuY29udGFpbnModGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXZpc2l0ZWQuYWRkKHRoaXMpOwotCQlTdHJpbmdbXSBtZkVudHJpZXMgPSBnZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1mRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBnZXRSZXNvbHZlZEFyY2hpdmUobWZFbnRyaWVzW2ldLCBlYXIpOwotCQkJaWYgKGFuQXJjaGl2ZSAhPSBudWxsICYmIGFuQXJjaGl2ZS5oYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8ob3RoZXIsIHZpc2l0ZWQsIGVhcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSNpc1R5cGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1R5cGUoU3RyaW5nIHR5cGUpIHsKLQotCQlyZXR1cm4gKHR5cGVzICE9IG51bGwgJiYgZ2V0VHlwZXMoKS5jb250YWlucyh0eXBlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NsaWVudE1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ2xpZW50TW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk3NWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ2xpZW50TW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRNb2R1bGVSZWZJbXBsIGV4dGVuZHMgTW9kdWxlUmVmSW1wbCBpbXBsZW1lbnRzIENsaWVudE1vZHVsZVJlZiB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIENsaWVudE1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQ0xJRU5UX01PRFVMRV9SRUY7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9DbGllbnRNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2NzY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkRpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWFyMTJJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5Lk5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5Lk51bGxMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlJhckltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LldhcjIySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5EZWxldGVPbkV4aXRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IHRoZUNvbW1vbmFyY2hpdmVGYWN0b3J5ID0gKENvbW1vbmFyY2hpdmVGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjb21tb25hcmNoaXZlLnhtaSIpOyAKLQkJCWlmICh0aGVDb21tb25hcmNoaXZlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUNvbW1vbmFyY2hpdmVGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgb3BlbkFyY2hpdmVzOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVsZWdhdGVOZWVkc0luaXQgPSB0cnVlOwotCXByaXZhdGUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZGVsZWdhdGUgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJaW5pdFByZXJlcXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdERlbGVnYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZU5lZWRzSW5pdCkgewotCQkJZGVsZWdhdGVOZWVkc0luaXQgPSBmYWxzZTsKLQkJCWRlbGVnYXRlID0gbmV3IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCgpIHsKLQotCQkJCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlR2VuKCk7Ci0JCQkJfQotCi0KLQkJCQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIEVBUkZpbGUgY3JlYXRlRUFSRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUVBUkZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyRmlsZUdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlRUpCTW9kdWxlUmVmR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVJBUkZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlV2ViTW9kdWxlUmVmR2VuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEU6IHJldHVybiBjcmVhdGVGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkU6IHJldHVybiBjcmVhdGVBcmNoaXZlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRTogcmV0dXJuIGNyZWF0ZUVKQkphckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEU6IHJldHVybiBjcmVhdGVXQVJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFOiByZXR1cm4gY3JlYXRlRUFSRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRTogcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZOiByZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEU6IHJldHVybiBjcmVhdGVSQVJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcmNoaXZlQ2xvc2VkKEFyY2hpdmUgYUNsb3NlZEFyY2hpdmUpIHsKLQkJZ2V0T3BlbkFyY2hpdmVzKCkucmVtb3ZlKGFDbG9zZWRBcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcmNoaXZlT3BlbmVkKEFyY2hpdmUgYW5PcGVuQXJjaGl2ZSkgewotCQlnZXRPcGVuQXJjaGl2ZXMoKS5wdXQoYW5PcGVuQXJjaGl2ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oQXJjaGl2ZSl9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ2xvc2UoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuICFnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihhbkFyY2hpdmUpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZU9wZW5BcmNoaXZlcygpIHsKLQkJaWYgKGdldE9wZW5BcmNoaXZlcygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChnZXRPcGVuQXJjaGl2ZXMoKSkgewotCQkJTGlzdCBvcGVuZWQgPSBuZXcgQXJyYXlMaXN0KGdldE9wZW5BcmNoaXZlcygpLnNpemUoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IGdldE9wZW5BcmNoaXZlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJb3BlbmVkLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVuZWQuc2l6ZSgpOyBpKyspIHsKLQkJCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBvcGVuZWQuZ2V0KGkpOwotCQkJCWFuQXJjaGl2ZS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY29weShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gbmV3IEFyY2hpdmVDb3B5VXRpbGl0eSgpLmNvcHkoYW5BcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBjb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKS5jb3B5KGFNb2R1bGVGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlID0gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoY2xpZW50RmlsZSwgdXJpKTsKLQkJcmV0dXJuIGNsaWVudEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gY3JlYXRlQXJjaGl2ZSgpOwotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSk7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVBcmNoaXZlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBjcmVhdGVBcmNoaXZlKCk7Ci0JCWluaXRpYWxpemVOZXdBcmNoaXZlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQotCX0KLQotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlQ2hpbGRMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSwgTG9hZFN0cmF0ZWd5IHBhcmVudCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlMb2FkU3RyYXRlZ3kgY2hpbGRTdHJhdGVneSA9IG51bGw7Ci0JCWlmIChwYXJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nIGRpck5hbWUgPSAoKERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kpIHBhcmVudCkuZ2V0RGlyZWN0b3J5VXJpKCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkVXJpID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZGlyTmFtZSwgdXJpKTsKLQkJCWNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3kocXVhbGlmaWVkVXJpKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVOZXN0ZWRMb2FkU3RyYXRlZ3kodXJpLCBwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBjaGlsZFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFQVJGaWxlIGVhckZpbGUgPSBjcmVhdGVFQVJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFQVJGaWxlKGVhckZpbGUsIHVyaSk7Ci0JCXJldHVybiBlYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFQVJGaWxlIGVhckZpbGUgPSBjcmVhdGVFQVJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFQVJGaWxlKGVhckZpbGUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBlYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFSkJKYXJGaWxlKGVqYkphckZpbGUsIHVyaSk7Ci0JCXJldHVybiBlamJKYXJGaWxlOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IGNyZWF0ZUVKQkphckZpbGUoKTsKLQkJaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoZWpiSmFyRmlsZSwgdXJpLCBvcHRpb25zKTsKLQkJcmV0dXJuIGVqYkphckZpbGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTnVsbExvYWRTdHJhdGVneUltcGw7IHVzZWQgZm9yIG5ldyBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgTnVsbExvYWRTdHJhdGVneUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGR5bmFtaWNhbGx5IGJ1aWxkIGEgbG9hZCBzdHJhdGVneSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gRGV0ZXJtaW5lcyB3aGV0aGVyCi0JICogdGhlIHVyaSBwb2ludHMgdG8gYSBqYXIgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZW5hbWUgPSB1cmkucmVwbGFjZSgnLycsIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZmlsZV9ub3RfZm91bmRfRVhDXywgKG5ldyBPYmplY3RbXXt1cmksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyA9ICJVUkkgTmFtZTogezB9OyBGaWxlIG5hbWU6IHsxfSIKLQkJfQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gbmV3IERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbChmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsb2FkIHN0cmF0ZWd5IGZvciBhIG5lc3RlZCBhcmNoaXZlOyBieSBkZWZhdWx0IHdpbGwgZXh0cmFjdCB0aGUgbmVzdGVkIGFyY2hpdmUgdG8gYQotCSAqIHRlbXAgZmlsZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gVGhpcyBpcyBiZWNhdXNlIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIHppcCBlbnRyaWVzIGluIGEKLQkgKiBuZXN0ZWQgYXJjaGl2ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UsIGFuZCBpZiB0aGUgYXJjaGl2ZSdzIGNvbnRlbnRzCi0JICogYXJlIGJlaW5nIG1vZGlmaWVkLCBjb3BpZWQsIGV0YywgdGhpcyBpcyBtdWNoIGZhc3Rlci4gSWYgYSB0ZW1wIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkLCBvcgotCSAqIGlmIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCByZWFkIG9ubHkgKGZvciBydW50aW1lKSwgdGhlbiB1c2UgYSBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5LCB3aGljaAotCSAqIHJldHJpZXZlcyB0aGUgY29udGVudHMgb2YgYSB6aXAgZW50cnkgYnkgc2VxdWVudGlhbGx5IHNlYXJjaGluZyBhIHppcCBpbnB1dCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZU5lc3RlZExvYWRTdHJhdGVneShTdHJpbmcgdXJpLCBMb2FkU3RyYXRlZ3kgcGFyZW50KSB7Ci0JCUxvYWRTdHJhdGVneSBsb2FkU3RyYXRlZ3kgPSBudWxsOwotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gKChBcmNoaXZlKSBwYXJlbnQuZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKTsKLQotCQlpZiAoIW9wdGlvbnMuaXNSZWFkT25seSh1cmkpKQotCQkJbG9hZFN0cmF0ZWd5ID0gY3JlYXRlVGVtcFppcEZpbGVTdHJhdGVneUlmUG9zc2libGUodXJpLCBwYXJlbnQpOwotCi0JCWlmIChsb2FkU3RyYXRlZ3kgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwocGFyZW50KTsKLQkJcmV0dXJuIGxvYWRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJUkFSRmlsZSByYXJGaWxlID0gY3JlYXRlUkFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3UkFSRmlsZShyYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZVRlbXBaaXBGaWxlU3RyYXRlZ3lJZlBvc3NpYmxlKFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHsKLQotCQlpZiAoIUFyY2hpdmVVdGlsLnNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJamF2YS5pby5GaWxlIHRlbXBGaWxlID0gQXJjaGl2ZVV0aWwuY3JlYXRlVGVtcEZpbGUodXJpKTsKLQkJCURlbGV0ZU9uRXhpdFV0aWxpdHkubWFya0ZvckRlbGV0aW9uKHRlbXBGaWxlKTsKLQkJCUlucHV0U3RyZWFtIGluID0gcGFyZW50LmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCXJldHVybiBuZXcgVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKHRlbXBGaWxlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUFyY2hpdmVVdGlsLmluZm9ybShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm1ha2VfdGVtcF9maWxlX1dBUk5fLCAobmV3IE9iamVjdFtde3VyaX0pKSArIGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vID0gIldhcm5pbmc6IFVuYWJsZSB0byBjcmVhdGUgdGVtcCBmaWxlIGZvciB7MH0uICBUaGlzIHdpbGwgaW1wYWN0IHBlcmZvcm1hbmNlLiIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJV0FSRmlsZSB3YXJGaWxlID0gY3JlYXRlV0FSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3V0FSRmlsZSh3YXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gd2FyRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZGVmYXVsdE9wdGlvbnMoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kpIHsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldExvYWRTdHJhdGVneShhTG9hZFN0cmF0ZWd5KTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBnZXRQYWNrYWdlKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkKLQkJCXJldHVybiBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzUGF0aFZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IGFuQXJjaGl2ZS5nZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yMy8wMSAyOjM1OjU1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldE9wZW5BcmNoaXZlcygpIHsKLQkJaWYgKG9wZW5BcmNoaXZlcyA9PSBudWxsKQotCQkJb3BlbkFyY2hpdmVzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcCgpKTsKLQkJcmV0dXJuIG9wZW5BcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgU2V0IGdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCVNldCBkZXBlbmRlbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJc3luY2hyb25pemVkIChnZXRPcGVuQXJjaGl2ZXMoKSkgewotCQkJSXRlcmF0b3Igb3BlbmVkID0gZ2V0T3BlbkFyY2hpdmVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChvcGVuZWQuaGFzTmV4dCgpKSB7Ci0JCQkJQXJjaGl2ZSBvcGVuZWRBcmNoaXZlID0gKEFyY2hpdmUpIG9wZW5lZC5uZXh0KCk7Ci0JCQkJaWYgKG9wZW5lZEFyY2hpdmUgPT0gYW5BcmNoaXZlKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIW9wZW5lZEFyY2hpdmUuaXNJbmRleGVkKCkpCi0JCQkJCS8vICoqKioqKioqKipPcHRpbWl6YXRpb24qKioqKioqKioqKgotCQkJCQkvLyBJZiB0aGUgZmlsZSBsaXN0IGhhcyBuZXZlciBiZWVuIGJ1aWx0IGZvciB0aGUgYXJjaGl2ZSwgd2UKLQkJCQkJLy8gZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCi0JCQkJCS8vIGl0IG5vdywKLQkJCQkJLy8gYW5kIHdlIGFyZSBzdXJlIHRoYXQgdGhlIGFyY2hpdmUgaXMgbm90IHByZXZlbnRpbmcgdGhlCi0JCQkJCS8vIHBhcmFtZXRlciBmcm9tIGNsb3NpbmcKLQkJCQkJY29udGludWU7Ci0JCQkJTGlzdCBmaWxlcyA9IG9wZW5lZEFyY2hpdmUuZ2V0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJCQlpZiAoYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpID09IGFuQXJjaGl2ZSkgewotCQkJCQkJQXJjaGl2ZSBvdXRlcm1vc3QgPSBvcGVuZWRBcmNoaXZlOwotCQkJCQkJQ29udGFpbmVyIGMgPSBvcGVuZWRBcmNoaXZlLmdldENvbnRhaW5lcigpOwotCQkJCQkJd2hpbGUgKGMgIT0gbnVsbCAmJiBjLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJCQkJb3V0ZXJtb3N0ID0gKEFyY2hpdmUpIGM7Ci0JCQkJCQkJYyA9IGMuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlkZXBlbmRlbnRzLmFkZChvdXRlcm1vc3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vRWxlbWVudHMgZnJvbSBvbmUgb2YgdGhlIGNoaWxkcmVuIChlLmcuLCBhIG1vZHVsZSBmaWxlIGluIGFuIGVhcikgbWF5IGhhdmUgYmVlbiBjb3BpZWQgdG8KLQkJLy9hbm90aGVyIGFyY2hpdmUKLQkJTGlzdCBuZXN0ZWRBcmNoaXZlcyA9IGFuQXJjaGl2ZS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRBcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJZGVwZW5kZW50cy5hZGRBbGwoZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oKEFyY2hpdmUpIG5lc3RlZEFyY2hpdmVzLmdldChpKSkpOwotCQl9Ci0JCXJldHVybiBkZXBlbmRlbnRzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0UHJlcmVxcygpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdC5pbnZva2VQcmVyZXFJbml0cyh0cnVlKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJZGlzYy5hZGRDaGlsZChFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCQlkaXNjLmFkZENoaWxkKFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JCWRpc2MuYWRkQ2hpbGQoQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJYW5BcmNoaXZlLnNldFVSSSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0U2l6ZSgwKTsKLQkJYW5BcmNoaXZlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFuQXJjaGl2ZS5zZXREaXJlY3RvcnlFbnRyeShmYWxzZSk7Ci0JCWFuQXJjaGl2ZS5zZXRMb2FkU3RyYXRlZ3koY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VBUkZpbGUoRUFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFSkJKYXJGaWxlKEVKQkphckZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3TW9kdWxlRmlsZShNb2R1bGVGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSk7Ci0JCWFuQXJjaGl2ZS5tYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdSQVJGaWxlKFJBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3V0FSRmlsZShXQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpZiAob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9wdGlvbnMuc2V0TG9hZFN0cmF0ZWd5KGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQkJfQotCi0JCWFuQXJjaGl2ZS5zZXRVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldFNpemUoMCk7Ci0JCWFuQXJjaGl2ZS5zZXRMYXN0TW9kaWZpZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhbkFyY2hpdmUuc2V0RGlyZWN0b3J5RW50cnkoZmFsc2UpOwotCQlhbkFyY2hpdmUuc2V0TG9hZFN0cmF0ZWd5KG9wdGlvbnMuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlhbkFyY2hpdmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFQVJGaWxlKEVBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUpCSmFyRmlsZShFSkJKYXJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoTW9kdWxlRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld0FyY2hpdmUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCQlhbkFyY2hpdmUubWFrZURlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3UkFSRmlsZShSQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1dBUkZpbGUoV0FSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlyZXR1cm4gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgLSBvcGVuIHRoZSBhcmNoaXZlIGJ5IHRoZSBwYXNzZWQgbmFtZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBzdHJhdGVnaWVzLiBOYW1lIG1heSBiZSBhIHBhdGggdG8gYSBqYXIsIGEgemlwLCBvciBhIGRpcmVjdG9yeSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEFyY2hpdmUKLQkgKiB0eXBlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCXJldHVybiBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKGV4dHJhQ2xhc3NQYXRoKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlhbkFyY2hpdmUuc2V0RXh0cmFDbGFzc3BhdGgoZXh0cmFDbGFzc1BhdGgpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKGV4dHJhQ2xhc3NQYXRoKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSBsb29zZS5nZXRVcmkoKTsKLQkJdHJ5IHsKLQkJCWlmKGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpID09IG51bGwpewotCQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm9wZW5fbmVzdGVkX0VYQ18sIChuZXcgT2JqZWN0W10ge3VyaSxwYXJlbnQuZ2V0VVJJKCl9KSksIG51bGwpOyAvLyA9ICJDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIiCi0JCQl9Ci0JCQlMb2FkU3RyYXRlZ3kgY2hpbGRTdHJhdGVneSA9IGNyZWF0ZUxvYWRTdHJhdGVneShsb29zZS5nZXRCaW5hcmllc1BhdGgoKSk7Ci0JCQljaGlsZFN0cmF0ZWd5LnNldExvb3NlQXJjaGl2ZShsb29zZSk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gcGFyZW50LmdldE9wdGlvbnMoKS5jbG9uZVdpdGgoY2hpbGRTdHJhdGVneSwgbG9vc2UuZ2V0VXJpKCkpOwotCQkJcmV0dXJuIHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIub3Blbl9uZXN0ZWRfRVhDXywgKG5ldyBPYmplY3RbXXt1cmksIHBhcmVudC5nZXRVUkkoKX0pKSwgZXgpOyAvLyA9ICJDb3VsZCBub3Qgb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUgInswfSIgaW4gInsxfSIiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlMb2FkU3RyYXRlZ3kgY2hpbGRTdHJhdGVneSA9IGNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KHVyaSwgcGFyZW50LmdldExvYWRTdHJhdGVneSgpKTsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBwYXJlbnQuZ2V0T3B0aW9ucygpLmNsb25lV2l0aChjaGlsZFN0cmF0ZWd5LCB1cmkpOwotCQkJaWYgKG9wdGlvbnMuc2hvdWxkRGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoKSkKLQkJCQlyZXR1cm4gb3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJCXJldHVybiBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm9wZW5fbmVzdGVkX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBwYXJlbnQuZ2V0VVJJKCl9KSksIGV4KTsgLy8gPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChSQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChSQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFJBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuUmVhZE9ubHlEaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5IG9wZW5SZWFkT25seURpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHVyaSk7Ci0JCWlmICghYUZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuY291bGRfbm90X2ZpbmRfZGlyX0VYQ18sIChuZXcgT2JqZWN0W117dXJpfSkpKTsgLy8gPSAiVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5ICIKLQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIubm90X2FfZGlyX0VYQ18sIChuZXcgT2JqZWN0W117dXJpfSkpKTsgLy8gPSAiVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IGJlY2F1c2UgZmlsZSBpcyBub3QgYSBkaXJlY3RvcnkgOiIKLQkJTG9hZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gbmV3IFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCh1cmkpOwotCQlSZWFkT25seURpcmVjdG9yeSBjb250YWluZXIgPSBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpOwotCQljb250YWluZXIuc2V0VVJJKHVyaSk7Ci0JCWNvbnRhaW5lci5zZXRMb2FkU3RyYXRlZ3koc3RyYXRlZ3kpOwotCQljb250YWluZXIuc2V0TGFzdE1vZGlmaWVkKGFGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBUYWtlIHRoZSBwcmltaXRpdmUgYXJjaGl2ZSBhbmQgcnVuIGl0IHRocm91Z2ggdGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvcnMgdG8gY29udmVydCBpdCB0byB0aGUKLQkgKiBjb3JyZWN0IHNwZWNpYWxpemVkIHR5cGU7IGFmdGVyIGFmdGVyIGNvbnZlcnNpb24sIHRlbGwgdGhlIGFyY2hpdmUgdG8gaW5pdGFsaXplIGl0c2VsZiBpZgotCSAqIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuU3BlY2lmaWNBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFkaXNjLmNhbkltcG9ydChhbkFyY2hpdmUpKSB7Ci0JCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihkaXNjLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCX0KLQkJQXJjaGl2ZSBzcGVjaWZpY0FyY2hpdmUgPSBkaXNjLm9wZW5BcmNoaXZlKGFuQXJjaGl2ZSk7Ci0JCXNwZWNpZmljQXJjaGl2ZS5pbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0JCXJldHVybiBzcGVjaWZpY0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBjYXNlIGZvciBlamIgamFyIGZpbGVzLCBiZWNhdXNlIG9mIHRoZSBuZWVkIHRvIHN1cHBvcnQgbm9uLWNvbXBsaWFudCAxLjAgamFycwotCSAqLwotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5TcGVjaWZpY0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIHNwZWNpZmljID0gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIGRpc2MpOwotCQlpZiAoc3BlY2lmaWMgPT0gYW5BcmNoaXZlKSB7Ci0JCQkvL1RoZSBkaXNjcmltaW5hdG9yIGZhaWxlZCB0byBjb252ZXJ0IHRoZSBhcmNodmUgdG8gYW4gZWpiIGphciBmaWxlCi0JCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihkaXNjLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHNwZWNpZmljOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFdBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zLmdldExvYWRTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3koY3JlYXRlTG9hZFN0cmF0ZWd5KHVyaSkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5jb3VsZF9ub3Rfb3Blbl9FWENfLCAobmV3IE9iamVjdFtde3VyaX0pKSwgZXgpOyAvLyA9ICJDb3VsZCBub3Qgb3BlbiAiCi0JCQl9Ci0JCX0KLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBjcmVhdGVBcmNoaXZlKCk7Ci0JCWFuQXJjaGl2ZS5zZXRVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldE9yaWdpbmFsVVJJKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRMb2FkU3RyYXRlZ3kob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCWFuQXJjaGl2ZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmNvbnRyaWJ1dGVUeXBlcyhhbkFyY2hpdmUpOwotCQlyZXR1cm4gYW5BcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByaW1PcGVuQXJjaGl2ZShkZWZhdWx0T3B0aW9ucyhhTG9hZFN0cmF0ZWd5KSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByaW1PcGVuQXJjaGl2ZShuZXcgQXJjaGl2ZU9wdGlvbnMoKSwgdXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcGVuQXJjaGl2ZXMoamF2YS51dGlsLk1hcCBuZXdPcGVuQXJjaGl2ZXMpIHsKLQkJb3BlbkFyY2hpdmVzID0gbmV3T3BlbkFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGVHZW4oKSB7Ci0JCVdBUkZpbGVJbXBsIHdhckZpbGUgPSBuZXcgV0FSRmlsZUltcGwoKTsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUdlbigpIHsKLQkJRUpCSmFyRmlsZUltcGwgZWpiSmFyRmlsZSA9IG5ldyBFSkJKYXJGaWxlSW1wbCgpOwotCQlyZXR1cm4gZWpiSmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbigpIHsKLQkJQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCBhcHBsaWNhdGlvbkNsaWVudEZpbGUgPSBuZXcgQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVHZW4oKSB7Ci0JCUVBUkZpbGVJbXBsIGVhckZpbGUgPSBuZXcgRUFSRmlsZUltcGwoKTsKLQkJcmV0dXJuIGVhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZUdlbigpIHsKLQkJUkFSRmlsZUltcGwgcmFyRmlsZSA9IG5ldyBSQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmlsZSBjcmVhdGVGaWxlKCkgewotCQlGaWxlSW1wbCBmaWxlID0gbmV3IEZpbGVJbXBsKCk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeSBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpIHsKLQkJUmVhZE9ubHlEaXJlY3RvcnlJbXBsIHJlYWRPbmx5RGlyZWN0b3J5ID0gbmV3IFJlYWRPbmx5RGlyZWN0b3J5SW1wbCgpOwotCQlyZXR1cm4gcmVhZE9ubHlEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIGdldENvbW1vbmFyY2hpdmVQYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbW1vbmFyY2hpdmVQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmR2VuKCkgewotCQlFSkJNb2R1bGVSZWZJbXBsIGVqYk1vZHVsZVJlZiA9IG5ldyBFSkJNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJNb2R1bGVSZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWZHZW4oKSB7Ci0JCVdlYk1vZHVsZVJlZkltcGwgd2ViTW9kdWxlUmVmID0gbmV3IFdlYk1vZHVsZVJlZkltcGwoKTsKLQkJcmV0dXJuIHdlYk1vZHVsZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkdlbigpIHsKLQkJQ2xpZW50TW9kdWxlUmVmSW1wbCBjbGllbnRNb2R1bGVSZWYgPSBuZXcgQ2xpZW50TW9kdWxlUmVmSW1wbCgpOwotCQlyZXR1cm4gY2xpZW50TW9kdWxlUmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmR2VuKCkgewotCQlDb25uZWN0b3JNb2R1bGVSZWZJbXBsIGNvbm5lY3Rvck1vZHVsZVJlZiA9IG5ldyBDb25uZWN0b3JNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiBjb25uZWN0b3JNb2R1bGVSZWY7Ci0JfQotCi0JcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUpIHsKLQkJQ2xpZW50TW9kdWxlUmVmIHJlZiA9IGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCQlyZWYuc2V0TW9kdWxlRmlsZShjbGllbnRGaWxlKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkjY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKFJBUkZpbGUpCi0JICovCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoUkFSRmlsZSByYXJGaWxlKSB7Ci0JCUNvbm5lY3Rvck1vZHVsZVJlZiByZWYgPSBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUocmFyRmlsZSk7Ci0JCXJldHVybiByZWY7Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkjY3JlYXRlRUpCTW9kdWxlUmVmKEVKQkphckZpbGUpCi0JICovCi0JcHVibGljIEVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoRUpCSmFyRmlsZSBlamJKYXJGaWxlKSB7Ci0JCUVKQk1vZHVsZVJlZiByZWYgPSBjcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5I2NyZWF0ZVdlYk1vZHVsZVJlZihXQVJGaWxlKQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKFdBUkZpbGUgd2FyRmlsZSkgewotCQlXZWJNb2R1bGVSZWYgcmVmID0gY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0JCXJlZi5zZXRNb2R1bGVGaWxlKHdhckZpbGUpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmUoKSB7Ci0JCUFyY2hpdmVJbXBsIGFyY2hpdmUgPSBuZXcgQXJjaGl2ZUltcGwoKTsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JfQotCi0KLQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OTdkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVQYWNrYWdlLAotICogICAgICAgICAgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJjaGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiSmFyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2FyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWFyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYk1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViTW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGllbnRNb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlDb21tb25hcmNoaXZlUGFja2FnZUltcGwgdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UgPSAoQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlFamJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUxvb3NlY29uZmlnUGFja2FnZUltcGwgdGhlTG9vc2Vjb25maWdQYWNrYWdlID0gKExvb3NlY29uZmlnUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExvb3NlY29uZmlnUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIExvb3NlY29uZmlnUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSkgOiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lcl9GaWxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0FSRmlsZSgpIHsKLQkJcmV0dXJuIHdhckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0FSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiBtb2R1bGVGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUFSRmlsZSgpIHsKLQkJcmV0dXJuIGVhckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFQVJGaWxlX01vZHVsZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfRWFyRmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZHVsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGVqYk1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIHdlYk1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENsaWVudE1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGNsaWVudE1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQkphckZpbGUoKSB7Ci0JCXJldHVybiBlamJKYXJGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphckZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSQVJGaWxlKCkgewotCQlyZXR1cm4gcmFyRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcmNoaXZlX1R5cGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJjaGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9MYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9TaXplKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfT3JpZ2luYWxVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVfQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiByZWFkT25seURpcmVjdG9yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlmaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fTEFTVF9NT0RJRklFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fU0laRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fRElSRUNUT1JZX0VOVFJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19PUklHSU5BTF9VUkkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbGVFQ2xhc3MsIEZJTEVfX0xPQURJTkdfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWxlRUNsYXNzLCBGSUxFX19DT05UQUlORVIpOwotCi0JCWFyY2hpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJDSElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJjaGl2ZUVDbGFzcywgQVJDSElWRV9fVFlQRVMpOwotCi0JCWVqYkphckZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJGaWxlRUNsYXNzLCBFSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJd2FyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2FyRmlsZUVDbGFzcywgV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJZWFyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWFyRmlsZUVDbGFzcywgRUFSX0ZJTEVfX01PRFVMRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlYXJGaWxlRUNsYXNzLCBFQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJbW9kdWxlRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEVfRklMRSk7Ci0KLQkJY29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyRUNsYXNzLCBDT05UQUlORVJfX0ZJTEVTKTsKLQotCQlyZWFkT25seURpcmVjdG9yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUFEX09OTFlfRElSRUNUT1JZKTsKLQotCQlyYXJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyYXJGaWxlRUNsYXNzLCBSQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQltb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9EVUxFX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19NT0RVTEVfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19FQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19NT0RVTEUpOwotCi0JCWVqYk1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTU9EVUxFX1JFRik7Ci0KLQkJd2ViTW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9NT0RVTEVfUkVGKTsKLQotCQljbGllbnRNb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0xJRU5UX01PRFVMRV9SRUYpOwotCi0JCWNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05ORUNUT1JfTU9EVUxFX1JFRik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJTG9vc2Vjb25maWdQYWNrYWdlIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTG9vc2Vjb25maWdQYWNrYWdlLmVOU19VUkkpOwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlFamJQYWNrYWdlIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZSB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJQ2xpZW50UGFja2FnZSB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQkJSmNhUGFja2FnZSB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VicGFja2FnZXMKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUxvb3NlY29uZmlnUGFja2FnZSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlmaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWFyY2hpdmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250YWluZXIoKSk7Ci0JCWVqYkphckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQl3YXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJZWFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCW1vZHVsZUZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBcmNoaXZlKCkpOwotCQljb250YWluZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGaWxlKCkpOwotCQlyZWFkT25seURpcmVjdG9yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRhaW5lcigpKTsKLQkJcmFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCW1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQllamJNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0JCXdlYk1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQkJY2xpZW50TW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCQljb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhmaWxlRUNsYXNzLCBGaWxlLmNsYXNzLCAiRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIlVSSSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfTGFzdE1vZGlmaWVkKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAibGFzdE1vZGlmaWVkIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX1NpemUoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJzaXplIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGlyZWN0b3J5RW50cnkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfT3JpZ2luYWxVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm9yaWdpbmFsVVJJIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyKCksIG51bGwsICJsb2FkaW5nQ29udGFpbmVyIiwgbnVsbCwgMSwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZV9Db250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXJfRmlsZXMoKSwgImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcmNoaXZlRUNsYXNzLCBBcmNoaXZlLmNsYXNzLCAiQXJjaGl2ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJjaGl2ZV9UeXBlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZXMiLCBudWxsLCAwLCAtMSwgQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYkphckZpbGVFQ2xhc3MsIEVKQkphckZpbGUuY2xhc3MsICJFSkJKYXJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUVqYlBhY2thZ2UuZ2V0RUpCSmFyKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIEVKQkphckZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3YXJGaWxlRUNsYXNzLCBXQVJGaWxlLmNsYXNzLCAiV0FSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V0FSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuZ2V0V2ViQXBwKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIFdBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlYXJGaWxlRUNsYXNzLCBFQVJGaWxlLmNsYXNzLCAiRUFSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCksIHRoaXMuZ2V0TW9kdWxlUmVmKCksIHRoaXMuZ2V0TW9kdWxlUmVmX0VhckZpbGUoKSwgIm1vZHVsZVJlZnMiLCBudWxsLCAxLCAtMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0QXBwbGljYXRpb24oKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcywgQXBwbGljYXRpb25DbGllbnRGaWxlLmNsYXNzLCAiQXBwbGljYXRpb25DbGllbnRGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlQ2xpZW50UGFja2FnZS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBBcHBsaWNhdGlvbkNsaWVudEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtb2R1bGVGaWxlRUNsYXNzLCBNb2R1bGVGaWxlLmNsYXNzLCAiTW9kdWxlRmlsZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyRUNsYXNzLCBDb250YWluZXIuY2xhc3MsICJDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyX0ZpbGVzKCksIHRoaXMuZ2V0RmlsZSgpLCB0aGlzLmdldEZpbGVfQ29udGFpbmVyKCksICJmaWxlcyIsIG51bGwsIDAsIC0xLCBDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWFkT25seURpcmVjdG9yeUVDbGFzcywgUmVhZE9ubHlEaXJlY3RvcnkuY2xhc3MsICJSZWFkT25seURpcmVjdG9yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJhckZpbGVFQ2xhc3MsIFJBUkZpbGUuY2xhc3MsICJSQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUpjYVBhY2thZ2UuZ2V0Q29ubmVjdG9yKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIFJBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtb2R1bGVSZWZFQ2xhc3MsIE1vZHVsZVJlZi5jbGFzcywgIk1vZHVsZVJlZiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpLCB0aGlzLmdldE1vZHVsZUZpbGUoKSwgbnVsbCwgIm1vZHVsZUZpbGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9FYXJGaWxlKCksIHRoaXMuZ2V0RUFSRmlsZSgpLCB0aGlzLmdldEVBUkZpbGVfTW9kdWxlUmVmcygpLCAiZWFyRmlsZSIsIG51bGwsIDEsIDEsIE1vZHVsZVJlZi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX01vZHVsZSgpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJNb2R1bGVSZWZFQ2xhc3MsIEVKQk1vZHVsZVJlZi5jbGFzcywgIkVKQk1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdlYk1vZHVsZVJlZkVDbGFzcywgV2ViTW9kdWxlUmVmLmNsYXNzLCAiV2ViTW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2xpZW50TW9kdWxlUmVmRUNsYXNzLCBDbGllbnRNb2R1bGVSZWYuY2xhc3MsICJDbGllbnRNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MsIENvbm5lY3Rvck1vZHVsZVJlZi5jbGFzcywgIkNvbm5lY3Rvck1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc0Njc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBDb25uZWN0b3JNb2R1bGVSZWYgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RPUl9NT0RVTEVfUkVGOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0Nvbm5lY3RvcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3IoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDc3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVySW1wbCBleHRlbmRzIEZpbGVJbXBsIGltcGxlbWVudHMgQ29udGFpbmVyIHsKLQotCi0JLyoqCi0JICogSW5uZXIgY2xhc3Mgd2hpY2ggbWFpbnRhaW5zIHRoZSBpbmRleCBmb3IgdGhlIGRvbWFpbidzIGNvbGxlY3Rpb24gb2Ygbm9kZXMga2V5ZWQgYnkgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiAodHlwZSA9PSAiRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRJbmRleGVkRmlsZShTdHJpbmcgbmV3VmFsdWUsIE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlmaWxlSW5kZXgucHV0KG5ld1ZhbHVlLCBub3RpZmllcik7Ci0JCQlpZiAobm90aWZpZXIuZUFkYXB0ZXJzKCkgPT0gbnVsbCB8fCAhbm90aWZpZXIuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJbm90aWZpZXIuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSW5kZXhlZEZpbGUoU3RyaW5nIG9sZFZhbHVlLCBOb3RpZmllciBub3RpZmllcikgewotCQkJZmlsZUluZGV4LnJlbW92ZShvbGRWYWx1ZSk7Ci0JCQlub3RpZmllci5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChmaWxlSW5kZXggPT0gbnVsbCB8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJLy9JZiB0aGUgbmFtZSBjaGFuZ2VkLCB1cGRhdGUgdGhlIGluZGV4Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKS5lcXVhbHMoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGVfVVJJKCkpICYmICgoRmlsZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLmdldENvbnRhaW5lcigpID09IENvbnRhaW5lckltcGwudGhpcykgewotCQkJCWZpbGVJbmRleC5yZW1vdmUobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCWZpbGVJbmRleC5wdXQobm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCX0KLQkJCS8vSGFuZGxlIGFkZHMgYW5kIHJlbW92ZXMKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyX0ZpbGVzKCkpICYmIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpID09IENvbnRhaW5lckltcGwudGhpcykgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6IHsKLQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWFkZEluZGV4ZWRGaWxlKGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDogewotCQkJCQkJcmVtb3ZlSW5kZXhlZEZpbGUoKChGaWxlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZ2V0VVJJKCksIChGaWxlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6IHsKLQkJCQkJCWZpbGVzQWRkZWQoKExpc3QpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDogewotCQkJCQkJZmlsZXNSZW1vdmVkKChMaXN0KSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDogewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDogewotCQkJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRQb3NpdGlvbigpICE9IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgeyAvL1RoaXMgaXMgbm93IGEKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gcmVwbGFjZSBpbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNT0YyCi0JCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCXJlbW92ZUluZGV4ZWRGaWxlKCgoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmdldFVSSSgpLCAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJCWFkZEluZGV4ZWRGaWxlKGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaWxlc0FkZGVkKExpc3QgbmV3RmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgbmV3RmlsZXMuZ2V0KGkpOwotCQkJCWFkZEluZGV4ZWRGaWxlKGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmlsZXNSZW1vdmVkKExpc3Qgb2xkRmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgb2xkRmlsZXMuZ2V0KGkpOwotCQkJCXJlbW92ZUluZGV4ZWRGaWxlKGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVidWlsZEZpbGVJbmRleCgpIHsKLQkJCXJlbW92ZUFkYXB0ZXJzSWZOZWNlc3NhcnkoKTsKLQkJCWZpbGVJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIElmIHRoZSBwcmltYXJ5IGNvbGxlY3Rpb24gYWxyZWFkeSBoYXMgZWxlbWVudHMsCi0JCQkvLydyZWZsZWN0IHRoZW0gaW4gdGhlIGluZGV4Li4uCi0JCQlpZiAoZ2V0RmlsZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJSXRlcmF0b3IgaSA9IGdldEZpbGVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGkubmV4dCgpOwotCQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBZGFwdGVyc0lmTmVjZXNzYXJ5KCkgewotCQkJaWYgKGZpbGVJbmRleCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBmaWxlSW5kZXgudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYUZpbGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqIEltcGxlbWVudGVyIGZvciBsb2FkaW5nIGVudHJpZXMgaW4gdGhpcyBjb250YWluZXIgKi8KLQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IGxvYWRTdHJhdGVneTsKLQkvKioKLQkgKiBJbmRleCB0byBwcm92aWRlIGZhc3QgbG9va3VwIGJ5IG5hbWUgb2YgZmlsZXMuCi0JICovCi0JcHJvdGVjdGVkIE1hcCBmaWxlSW5kZXg7Ci0JLyoqCi0JICogQW4gYWRhcHRlciB3aGljaCBtYWludGFpbnMgdGhlIGZpbGUgaW5kZXgKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIgZmlsZUluZGV4QWRhcHRlcjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmlsZXMgPSBudWxsOwotCi0JcHVibGljIENvbnRhaW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEFJTkVSOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNGaWxlKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQlTdHJpbmcga2V5ID0gYVVyaS5zdGFydHNXaXRoKCIvIikgPyBBcmNoaXZlVXRpbC50cnVuY2F0ZUZyb21Gcm9udElnbm9yZUNhc2UoYVVyaSwgIi8iKSA6IGFVcmk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzSW5kZXhlZCgpKQotCQkJcmV0dXJuIGdldEZpbGVJbmRleCgpLmNvbnRhaW5zS2V5KGtleSk7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5jb250YWlucyhrZXkpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKFN0cmluZyBVUkkpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNJbmRleGVkKCkpIHsKLQkJCWdldEZpbGVzKCk7Ci0JCX0KLQkJRmlsZSBmaWxlID0gKEZpbGUpIGdldEZpbGVJbmRleCgpLmdldChVUkkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oVVJJKTsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNS8wMCA3OjIwOjIxIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTWFwIGdldEZpbGVJbmRleCgpIHsKLQkJaWYgKGZpbGVJbmRleCA9PSBudWxsKQotCQkJZ2V0RmlsZUluZGV4QWRhcHRlcigpLnJlYnVpbGRGaWxlSW5kZXgoKTsKLQkJcmV0dXJuIGZpbGVJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNS8wMCA3OjIwOjIxIFBNKQotCSAqIAotCSAqIEByZXR1cm4gRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIgZ2V0RmlsZUluZGV4QWRhcHRlcigpIHsKLQkJaWYgKGZpbGVJbmRleEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZmlsZUluZGV4QWRhcHRlciA9IG5ldyBGaWxlTm90aWZpY2F0aW9uQWRhcHRlcigpOwotCQkJZUFkYXB0ZXJzKCkuYWRkKGZpbGVJbmRleEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBmaWxlSW5kZXhBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIExpc3QgaXMgYnVpbHQgb24gZGVtYW5kLCBieSByZXF1ZXN0aW5nIGZyb20gdGhlIGxvYWQgc3RyYXRlZ3kuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbGVzKCkgewotCQlFTGlzdCBmaWxlc0xpc3QgPSB0aGlzLmdldEZpbGVzR2VuKCk7Ci0JCWlmICghaXNJbmRleGVkKCkpIHsKLQkJCWlmIChmaWxlc0xpc3QuaXNFbXB0eSgpICYmIGdldExvYWRTdHJhdGVneSgpICE9IG51bGwpIHsKLQkJCQlmaWxlc0xpc3QuYWRkQWxsKGdldExvYWRTdHJhdGVneSgpLmNvbGxlY3RGaWxlcygpKTsKLQkJCX0KLQkJCS8vQ2F1c2VzIHRoZSBpbmRleCB0byBiZSBidWlsdAotCQkJZ2V0RmlsZUluZGV4KCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSBMb29rcyBmb3IgYSBmaWxlIHdpdGggdGhlIGdpdmVuIHVyaSwgYW5kIHJldHVybnMgYW4KLQkgKiAgICAgIGlucHV0IHN0cmVhbTsgb3B0aW1pemF0aW9uOiBpZiB0aGUgZmlsZSBsaXN0IGhhcyBub3QgYmVlbiBidWlsdCwgZ29lcyBkaXJlY3RseSB0byB0aGUKLQkgKiAgICAgIGxvYWRTdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0luZGV4ZWQoKSkgewotCQkJcmV0dXJuIGdldEZpbGUoYVVyaSkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJfQotCQlyZXR1cm4gcHJpbUdldElucHV0U3RyZWFtKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgZ2V0TG9hZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbG9hZFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7Ci0JCXJldHVybiBmaWxlSW5kZXggIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSBHb2VzIGRpcmVjdGx5IHRvIHRoZSBsb2FkU3RyYXRlZ3kuCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gcHJpbUdldElucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldElucHV0U3RyZWFtKGFVcmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYnVpbGRGaWxlSW5kZXgoKSB7Ci0JCWdldEZpbGVJbmRleEFkYXB0ZXIoKS5yZWJ1aWxkRmlsZUluZGV4KCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9hZFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgbmV3TG9hZFN0cmF0ZWd5KSB7Ci0KLQkJaWYgKG5ld0xvYWRTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQluZXdMb2FkU3RyYXRlZ3kuc2V0Q29udGFpbmVyKHRoaXMpOwotCQkJaWYgKGxvYWRTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJbmV3TG9hZFN0cmF0ZWd5LnNldFJlbmRlcmVyVHlwZShsb2FkU3RyYXRlZ3kuZ2V0UmVuZGVyZXJUeXBlKCkpOwotCQkJCW5ld0xvYWRTdHJhdGVneS5zZXRSZWFkT25seShsb2FkU3RyYXRlZ3kuaXNSZWFkT25seSgpKTsKLQkJCQlsb2FkU3RyYXRlZ3kuc2V0Q29udGFpbmVyKG51bGwpOwotCQkJCWxvYWRTdHJhdGVneS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWxvYWRTdHJhdGVneSA9IG5ld0xvYWRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlc0dlbigpIHsKLQkJaWYgKGZpbGVzID09IG51bGwpIHsKLQkJCWZpbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRmlsZS5jbGFzcywgdGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJGaWxlcygpIHsKLQkJYm9vbGVhbiBvbGREZWxpdmVyeSA9IGVEZWxpdmVyKCk7Ci0JCWZpbGVzLmNsZWFyKCk7Ci0JCWVTZXREZWxpdmVyKG9sZERlbGl2ZXJ5KTsKLQkJaWYgKGlzSW5kZXhlZCgpKSB7Ci0JCQllQWRhcHRlcnMoKS5yZW1vdmUoZmlsZUluZGV4QWRhcHRlcik7Ci0JCQlmaWxlSW5kZXhBZGFwdGVyID0gbnVsbDsKLQkJCWZpbGVJbmRleCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWM4MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJBcHBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgRUFSRmlsZSB7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbDsgY2xpZW50cyBzaG91bGQgdXNlIHtAbGluayAjZ2V0TW9kdWxlUmVmKE1vZHVsZSl9Ci0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZShNb2R1bGUgbW9kdWxlRGVzY3JpcHRvcikgewotCQlNb2R1bGVSZWYgcmVmID0gZ2V0TW9kdWxlUmVmKG1vZHVsZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gKHJlZiA9PSBudWxsKSA/IG51bGwgOiByZWYuZ2V0TW9kdWxlRmlsZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgYWRkQ29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IHByaW1BZGRDb3B5UmVmKGFNb2R1bGVGaWxlKTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1vZHVsZVJlZikKLQkJCXJldHVybiAoKE1vZHVsZVJlZikgcmVzdWx0KS5nZXRNb2R1bGVGaWxlKCk7Ci0KLQkJcmV0dXJuIChNb2R1bGVGaWxlKSByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbW9kdWxlUmVmcyA9IG51bGw7Ci0KLQlwdWJsaWMgRUFSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuRUFSX0ZJTEU7Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgYWRkQ29weShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYW5BcmNoaXZlLmlzTW9kdWxlRmlsZSgpKQotCQkJcmV0dXJuIGFkZENvcHkoKE1vZHVsZUZpbGUpIGFuQXJjaGl2ZSk7Ci0JCUFyY2hpdmUgY29weSA9IHN1cGVyLmFkZENvcHkoYW5BcmNoaXZlKTsKLQkJY29weS5pbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBwcmltQWRkQ29weVJlZihNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJLy9mb3JjZSB0aGlzIGxpc3QgdG8gZ2V0IGluaXRpYWxpemVkIGJlZm9yZSB0aGUgYWRkCi0JCUVMaXN0IHJlZnMgPSBnZXRNb2R1bGVSZWZzKCk7Ci0KLQkJaWYgKGFNb2R1bGVGaWxlLmlzRUFSRmlsZSgpKQotCQkJLy9JZiBpdCdzIGFuIGVhciB0aGVuIGp1c3QgdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgYXJjaGl2ZQotCQkJcmV0dXJuIHN1cGVyLmFkZENvcHkoYU1vZHVsZUZpbGUpOwotCQljaGVja0FkZFZhbGlkKGFNb2R1bGVGaWxlKTsKLQkJTW9kdWxlRmlsZSBjb3B5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jb3B5KGFNb2R1bGVGaWxlKTsKLQkJTW9kdWxlIG5ld01vZHVsZSA9IGNyZWF0ZU1vZHVsZUZvckNvcHlpbmcoYU1vZHVsZUZpbGUpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJY29weS5pbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJaWYgKCFjb3B5LmdldFVSSSgpLmVxdWFscyhuZXdNb2R1bGUuZ2V0VXJpKCkpKQotCQkJY29weS5zZXRVUkkobmV3TW9kdWxlLmdldFVyaSgpKTsKLQotCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5hZGQobmV3TW9kdWxlKTsKLQkJTW9kdWxlUmVmIGFSZWYgPSBjcmVhdGVNb2R1bGVSZWYobmV3TW9kdWxlLCBjb3B5KTsKLQkJcmVmcy5hZGQoYVJlZik7Ci0JCXJldHVybiBhUmVmOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZVJlZiBhZGRDb3B5UmVmKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlPYmplY3QgcmVzdWx0ID0gcHJpbUFkZENvcHlSZWYoYU1vZHVsZUZpbGUpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTW9kdWxlUmVmKQotCQkJcmV0dXJuIChNb2R1bGVSZWYpIHJlc3VsdDsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGFkZENvcHkoU2VjdXJpdHlSb2xlIGFSb2xlLCBNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCUVPYmplY3QgZGQgPSBudWxsOwotCQl0cnkgewotCQkJZGQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihhTW9kdWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kZF9pbl9lYXJfbG9hZF9FWENfLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBlKTsgLy8gPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCX0KLQkJU3RyaW5nIHJvbGVOYW1lID0gYVJvbGUuZ2V0Um9sZU5hbWUoKTsKLQkJU2VjdXJpdHlSb2xlIGNvcHkgPSAoU2VjdXJpdHlSb2xlKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KGFSb2xlKTsKLQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpIGRkOwotCQkJaWYgKGVqYkphci5jb250YWluc1NlY3VyaXR5Um9sZShyb2xlTmFtZSkpCi0JCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXywgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCByb2xlTmFtZX0pKSwgZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZU5hbWVkKHJvbGVOYW1lKSk7IC8vID0gIkRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfSIKLQkJCWdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGVqYkphcikuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChjb3B5KTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBkZDsKLQkJCWlmICh3ZWJBcHAuY29udGFpbnNTZWN1cml0eVJvbGUocm9sZU5hbWUpKQotCQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ18sIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgcm9sZU5hbWV9KSksIHdlYkFwcC5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlTmFtZSkpOy8vID0gIkRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfSIKLQkJCXdlYkFwcC5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGNvcHkpOwotCQl9Ci0JCWFkZENvcHlJZk5vdEV4aXN0cyhhUm9sZSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBhZGRDb3B5SWZOb3RFeGlzdHMoU2VjdXJpdHlSb2xlIGFSb2xlKSB7Ci0JCUFwcGxpY2F0aW9uIGRkID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJU2VjdXJpdHlSb2xlIGNvcHkgPSBudWxsOwotCQlpZiAoIWRkLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpKSB7Ci0JCQljb3B5ID0gKFNlY3VyaXR5Um9sZSkgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShhUm9sZSk7Ci0JCQlkZC5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGNvcHkpOwotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRHVwbGljYXRlKFN0cmluZyBhVXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGlzRHVwbGljYXRlKGFVcmkpKQotCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmR1cF9yZXNvdXJjZV9FWENfLCAobmV3IE9iamVjdFtde2FVcmksIGdldFVSSSgpfSkpKTsgLy8gPSAiUmVzb3VyY2UgbmFtZWQgInswfSIgYWxyZWFkeSBleGlzdHMgaW4gYXJjaGl2ZSAiezF9IiIKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2R1bGUgY3JlYXRlTW9kdWxlRm9yQ29weWluZyhNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCU1vZHVsZSBhTW9kdWxlID0gbnVsbDsKLQkJaWYgKGFNb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlhTW9kdWxlID0gZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlV2ViTW9kdWxlKCk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWFNb2R1bGUgPSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVFamJNb2R1bGUoKTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlhTW9kdWxlID0gZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCQl9IGVsc2UgaWYgKGFNb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlhTW9kdWxlID0gZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0JCX0KLQkJYU1vZHVsZS5zZXRVcmkoYU1vZHVsZUZpbGUuZ2V0VVJJKCkpOwotCQlyZXR1cm4gYU1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIE9ubHkgcmV0dXJuIG51bGwgaWYgYW4gYWx0REQgaXMgbm90IGRlZmluZWQuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCS8vIExvb2sgZm9yIGFsdERECi0JCVN0cmluZyBhbHRERCA9IGFNb2R1bGUuZ2V0QWx0REQoKTsKLQkJaWYgKEFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkoYWx0REQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNNb2ZSZXNvdXJjZUxvYWRlZChhbHRERC50cmltKCkpKQotCQkJcmVnaXN0ZXJSZXNvdXJjZUZhY3RvcnkoYU1vZHVsZSwgYWx0REQpOwotCQlYTUxSZXNvdXJjZSBkZFJlcyA9IChYTUxSZXNvdXJjZSkgZ2V0TW9mUmVzb3VyY2UoYWx0REQudHJpbSgpKTsKLQkJaWYgKCFkZFJlcy5pc0FsdCgpKSB7Ci0JCQlkZFJlcy5zZXRJc0FsdCh0cnVlKTsKLQkJCWRkUmVzLnNldEFwcGxpY2F0aW9uKGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkpOwotCQl9Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRSb290KGRkUmVzKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZXMoKSB7Ci0JCUxpc3QgY2xpZW50RmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQkJY2xpZW50RmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xpZW50RmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KEVKQkphciBlamJKYXIpIHsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFkID0gZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlpZiAoYWQgPT0gbnVsbCkgewotCQkJYWQgPSAoKEVqYlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJCWVqYkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoYWQpOwotCQl9Ci0JCXJldHVybiBhZDsKLQl9Ci0KLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb24gZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0SW1wb3J0U3RyYXRlZ3koKS5pbXBvcnRNZXRhRGF0YSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3JNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKChNb2R1bGUpIGFNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoRWpiTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoRUpCSmFyKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoTW9kdWxlKSBhTW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoSmF2YUNsaWVudE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoTW9kdWxlKSBhTW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJRU9iamVjdCBkZCA9IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKGFNb2R1bGUpOwotCQlpZiAoZGQgPT0gbnVsbCkKLQkJCWRkID0gZ2V0TW9kdWxlRmlsZShhTW9kdWxlKS5nZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCXJldHVybiBkZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldERlcGxveW1lbnREZXNjcmlwdG9yKFdlYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlyZXR1cm4gKFdlYkFwcCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEVKQkphckZpbGVzKCkgewotCQlMaXN0IGVqYkphckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCQllamJKYXJGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlamJKYXJGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiwgaWYgb25lIGV4aXN0cy4gVGhlIGVqYi1saW5rIHZhbHVlIG9mIHRoZQotCSAqIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGhpdCBmb3VuZDsgYXNzdW1wdGlvbiB0aGF0IHRoZSBlamIgbmFtZXMgYXJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZQotCSAqIGVhciBmaWxlLiBUaGlzIHdpbGwgbGlrZWx5IGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgd2F5IGZvciBkZXJlZmVyZW5jaW5nIGVqYiByZWZzLgotCSAqIAotCSAqIENhbiBiZSB1c2VkIHdpdGggZWpiIDEuMSByZWZlcmVuY2VzIG9ubHkuCi0JICogCi0JICogQGRlcHJlY2F0ZWQge0BsaW5rI2dldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYsIFN0cmluZyBtb2R1bGVVcmkgKQotCSAqIEBwYXJhbSBFamJSZWYKLQkgKiAgICAgICAgICAgIHJlZiAtIEFuIGVqYiByZWZlcmVuY2UKLQkgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpIHsKLQkJU3RyaW5nIGxpbmsgPSByZWYuZ2V0TGluaygpOwotCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGphckZpbGVzID0gZ2V0RUpCSmFyRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9ICgoRUpCSmFyRmlsZSkgamFyRmlsZXMuZ2V0KGkpKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFuTmFtZWQobGluayk7Ci0JCQlpZiAoYmVhbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGJlYW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUKLQkgKiByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBoaXQgZm91bmQ7IGFzc3VtcHRpb24gdGhhdCB0aGUgZWpiIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBlYXIgZmlsZS4gVGhpcyB3aWxsIGxpa2VseSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIHdheSBmb3IgZGVyZWZlcmVuY2luZyBlamIgcmVmcwotCSAqIAotCSAqIENhbiBiZSB1c2VkIHdpdGggZWpiIDEuMSAmIGVqYiAyLjAgcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gRWpiUmVmCi0JICogICAgICAgICAgICByZWYgLSBBbiBlamIgcmVmZXJlbmNlCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgbW9kdWxlVXJpIC0gVGhlIG1vZHVsZSB1cmkKLQkgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYsIFN0cmluZyBtb2R1bGVVcmkpIHsKLQkJU3RyaW5nIGxpbmsgPSByZWYuZ2V0TGluaygpOwotCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfS8vIGlmCi0KLQkJaWYgKGxpbmsuaW5kZXhPZignIycpID09IC0xKSB7Ci0JCQlFbnRlcnByaXNlQmVhbiBsaW5rZWRFSkIgPSBudWxsOwotCQkJWE1MUmVzb3VyY2UgcmVzID0gKFhNTFJlc291cmNlKSByZWYuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgRUpCUmVzb3VyY2UpIHsKLQkJCQkvL011c3QgYmUgaW4gYW4gRUpCIEpBUiB0byBiZSBoZXJlCi0JCQkJRUpCSmFyIGphciA9ICgoRUpCUmVzb3VyY2UpIHJlcykuZ2V0RUpCSmFyKCk7Ci0JCQkJaWYgKGphciAhPSBudWxsKQotCQkJCQlsaW5rZWRFSkIgPSBqYXIuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYocmVmKTsKLQkJCX0KLQkJCWlmIChsaW5rZWRFSkIgPT0gbnVsbCkgewotCQkJCUxpc3QgamFyRmlsZXMgPSBnZXRFSkJKYXJGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamFyRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJbGlua2VkRUpCID0gKChFSkJKYXJGaWxlKSBqYXJGaWxlcy5nZXQoaSkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChsaW5rKTsKLQkJCQkJaWYgKGxpbmtlZEVKQiAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbGlua2VkRUpCOwotCQkJCQl9Ly8gaWYKLQkJCQl9Ly8gZm9yCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gbGlua2VkRUpCOwotCQl9IGVsc2UgewotCQkJLy9HcmFiIHRoZSBlamIgbmFtZSBhbmQgZWpiIGphciBuYW1lIGZyb20gdGhlIGxpbmsKLQkJCVN0cmluZyBlamJCZWFuTmFtZSA9IGxpbmsuc3Vic3RyaW5nKGxpbmsuaW5kZXhPZigiIyIpICsgMSwgbGluay5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlamJKYXJOYW1lID0gbGluay5zdWJzdHJpbmcoMCwgbGluay5pbmRleE9mKCIjIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChlamJCZWFuTmFtZSAhPSBudWxsICYmIGVqYkphck5hbWUgIT0gbnVsbCkgewotCQkJCS8vR2V0IHRoZSB1cmkgb2YgdGhlIGphciBuYW1lLgotCQkJCVN0cmluZyBlamJKYXJVcmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShlamJKYXJOYW1lLCBtb2R1bGVVcmkpOwotCQkJCWlmIChlamJKYXJVcmkgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJLy9HZXQgdGhlIGFjdHVhbCBqYXIgZmlsZQotCQkJCQkJRmlsZSBhRmlsZSA9IGdldEZpbGUoZWpiSmFyVXJpKTsKLQkJCQkJCWlmIChhRmlsZSA9PSBudWxsIHx8ICFhRmlsZS5pc0VKQkphckZpbGUoKSkKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQkJRUpCSmFyRmlsZSBqYXJGaWxlID0gKEVKQkphckZpbGUpIGdldEZpbGUoZWpiSmFyVXJpKTsKLQkJCQkJCUxpc3QgZWpicyA9IGphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCQkJCS8vQ2hlY2sgaWYgYW55IG9mIHRoZSBiZWFucyBpbiB0aGUgbGlzdCBtYXRjaCB0aGUgZ2l2ZW4gZWpiIGJlYW4gbmFtZSBnaXZlCi0JCQkJCQkvLyBpbgotCQkJCQkJLy90aGUgbGluawotCQkJCQkJaWYgKGVqYnMgIT0gbnVsbCAmJiAhZWpicy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlJdGVyYXRvciBpdCA9IGVqYnMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCUVudGVycHJpc2VCZWFuIGVqYkJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGl0Lm5leHQoKTsKLQkJCQkJCQkJaWYgKGVqYkJlYW4gIT0gbnVsbCAmJiBlamJCZWFuLmdldE5hbWUoKS5lcXVhbHMoZWpiQmVhbk5hbWUpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gZWpiQmVhbjsKLQkJCQkJCQkJfS8vIGlmCi0JCQkJCQkJfS8vIHdoaWxlCi0JCQkJCQl9Ly8gaWYKLQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZlKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfS8vIHRyeQotCQkJCX0vLyBpZgotCQkJfS8vIGlmCi0JCX0vLyBpZgotCQlyZXR1cm4gbnVsbDsKLQl9Ly8gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIGFVcmksIFN0cmluZyBhbHRERCkgewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGUoYVVyaSwgYWx0REQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZVJlZiBnZXRNb2R1bGVSZWYoTW9kdWxlIG1vZHVsZURlc2NyaXB0b3IpIHsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuZ2V0TW9kdWxlKCkgPT0gbW9kdWxlRGVzY3JpcHRvcikKLQkJCQlyZXR1cm4gcmVmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbHRlcmVkIGxpc3Qgb2YgdGhlIGFyY2hpdmVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlRmlsZXMoKSB7Ci0JCUxpc3QgbW9kdWxlRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc01vZHVsZUZpbGUoKSkgewotCQkJCW1vZHVsZUZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZUZpbGVzOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zRm9yT3BlbmluZyhTdHJpbmcgYVVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlMb2FkU3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KGFVcmksIGdldExvYWRTdHJhdGVneSgpKTsKLQkJcmV0dXJuIGdldE9wdGlvbnMoKS5jbG9uZVdpdGgoc3RyYXRlZ3ksIGFVcmkpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zRm9yT3BlbmluZyhMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb257Ci0JCWlmKGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpID09IG51bGwpewotCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIub3Blbl9uZXN0ZWRfRVhDXywgKG5ldyBPYmplY3RbXSB7bG9vc2UuZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBudWxsKTsgLy8gPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JCUxvYWRTdHJhdGVneSBzdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlTG9hZFN0cmF0ZWd5KGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpKTsKLQkJc3RyYXRlZ3kuc2V0TG9vc2VBcmNoaXZlKGxvb3NlKTsKLQkJcmV0dXJuIGdldE9wdGlvbnMoKS5jbG9uZVdpdGgoc3RyYXRlZ3ksIGxvb3NlLmdldFVyaSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSQVJGaWxlcygpIHsKLQkJTGlzdCByYXJGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQkJcmFyRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmFyRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Um9sZXNGcm9tQWxsTW9kdWxlcygpIHsKLQkJRUxpc3Qgcm9sZUxpc3QgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QoKTsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gbW9kdWxlcy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlFTGlzdCByb2xlcyA9IGdldFJvbGVzRnJvbU1vZHVsZShhTW9kdWxlKTsKLQkJCWZvciAoaW50IGogPSAwLCBtID0gcm9sZXMuc2l6ZSgpOyBqIDwgbTsgaisrKSB7Ci0JCQkJcm9sZUxpc3QuYWRkKHJvbGVzLmdldChqKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbU1vZHVsZShNb2R1bGUgYU1vZHVsZSkgewotCQlFTGlzdCByb2xlTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCgpOwotCQl0cnkgewotCQkJaWYgKGFNb2R1bGUuaXNXZWJNb2R1bGUoKSkKLQkJCQlyb2xlTGlzdCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIGFNb2R1bGUpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWVsc2UgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkKLQkJCQlyb2xlTGlzdCA9IGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIGFNb2R1bGUpKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZGRfaW5fZWFyX2xvYWRfRVhDXywgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFdBUkZpbGVzKCkgewotCQlMaXN0IHdhckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCQl3YXJGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3YXJGaWxlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJPcGVuKCkgewotCQlzdXBlci5pbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHN1cGVyIHJldHVybnMgdHJ1ZSwgb3IgcmV0dXJuIHdoZXRoZXIgdGhlIGFwcCBkZCBjb250YWlucyBhIG1vZHVsZSBoYXZpbmcgdGhlCi0JICogdXJpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB7Ci0JCWlmIChzdXBlci5pc05lc3RlZEFyY2hpdmUoYVVyaSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoYVVyaSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJQXBwbGljYXRpb24gYXBwbCA9ICgoQXBwbGljYXRpb25QYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0JCXJlc291cmNlLnNldElEKGFwcGwsIEoyRUVDb25zdGFudHMuQVBQTF9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGFwcGwpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhcHBsKTsKLQkJcmV0dXJuIGFwcGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJTW9kdWxlIG0gPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGxvb3NlLmdldFVyaSgpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5vcGVuTmVzdGVkQXJjaGl2ZShsb29zZSk7Ci0KLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gZ2V0T3B0aW9uc0Zvck9wZW5pbmcobG9vc2UpOwotCQkJcmV0dXJuIG9wZW5OZXN0ZWRBcmNoaXZlKG0sIGFyY2hpdmVPcHRpb25zKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJLy9Qcm9iYWJseSB0aGUgZmlsZSBkaWQgbm90IGV4aXN0OyBzaWxlbnRseSBmYWlsLCBwZXIgcmVxdWVzdCBmcm9tIFdTIHJ1bnRpbWUKLQkJCS8vTW9yZSB0aGFuIGxpa2VseSBhIGZhaWx1cmUgaXMgZ29pbmcgdG8gb2NjdXIgZG93biB0aGUgcm9hZCB3aGVuIGEgTW9kdWxlRmlsZSBmb3IgYQotCQkJLy8gTW9kdWxlCi0JCQkvL2luIHRoZSBkZCBpcyByZXF1ZXN0ZWQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCi0JCU1vZHVsZSBtID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZShhVXJpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5vcGVuTmVzdGVkQXJjaGl2ZShhVXJpKTsKLQotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBnZXRPcHRpb25zRm9yT3BlbmluZyhhVXJpKTsKLQkJCXJldHVybiBvcGVuTmVzdGVkQXJjaGl2ZShtLCBhcmNoaXZlT3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vUHJvYmFibHkgdGhlIGZpbGUgZGlkIG5vdCBleGlzdDsgc2lsZW50bHkgZmFpbCwgcGVyIHJlcXVlc3QgZnJvbSBXUyBydW50aW1lCi0JCQkvL01vcmUgdGhhbiBsaWtlbHkgYSBmYWlsdXJlIGlzIGdvaW5nIHRvIG9jY3VyIGRvd24gdGhlIHJvYWQgd2hlbiBhIE1vZHVsZUZpbGUgZm9yIGEKLQkJCS8vIE1vZHVsZQotCQkJLy9pbiB0aGUgZGQgaXMgcmVxdWVzdGVkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTW9kdWxlIG0sIEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgYVVyaSA9IG0uZ2V0VXJpKCk7Ci0KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBTaW5jZSB3ZSBoYXZlIGEgY2x1ZSBhYm91dCB0aGUgdHlwZSBvZiBhcmNoaXZlIHRvIG9wZW4gVXNlIHRoZSBhcHByb3ByaWF0ZSBvcGVuCi0JCQkgKiBtZXRob2QsIHNvIGlmIGEgZmFpbHVyZSBvY2N1cnJzLCB3ZSBjYW4gZ2V0IGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlCi0JCQkgKi8KLQkJCWlmIChtLmlzV2ViTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCQkJZWxzZSBpZiAobS5pc0VqYk1vZHVsZSgpKQotCQkJCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGFyY2hpdmVPcHRpb25zLCBhVXJpKTsKLQkJCWVsc2UgaWYgKG0uaXNKYXZhTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShhcmNoaXZlT3B0aW9ucywgYVVyaSk7Ci0JCQllbHNlIGlmIChtLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCi0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5uZXN0ZWRfb3Blbl9mYWlsX0VYQ18sIChuZXcgT2JqZWN0W117YVVyaSwgZ2V0VVJJKCl9KSksIGV4KTsgLy8gPSAiVW5hYmxlIHRvIG9wZW4gbW9kdWxlIGZpbGUgInswfSIgaW4gRUFSIGZpbGUgInsxfSIiCi0JCX0KLQkJLy9TaG91bGQgbmV2ZXIgcmVhY2ggdGhlIGNvZGUgYmVsb3cKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcHVzaERvd25Sb2xlKFNlY3VyaXR5Um9sZSByb2xlKSB7Ci0JCWlmIChyb2xlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuUGFyYW1ldGVyX3Nob3VsZF9ub3RfYmVfbnVfRVhDXyk7IC8vID0gIlBhcmFtZXRlciBzaG91bGQgbm90IGJlIG51bGwiCi0KLQkJTGlzdCBtb2R1bGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCXB1c2hEb3duUm9sZShyb2xlLCBtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSwgTW9kdWxlIGFNb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCWlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpIHsKLQkJCQlXZWJBcHAgZGQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBhTW9kdWxlKTsKLQkJCQlpZiAoZGQuZ2V0U2VjdXJpdHlSb2xlTmFtZWQocm9sZS5nZXRSb2xlTmFtZSgpKSA9PSBudWxsKQotCQkJCQlkZC5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkocm9sZSkpOwotCQkJfSBlbHNlIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHkgPSBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBhTW9kdWxlKSk7Ci0JCQkJaWYgKGFzc2VtYmx5LmdldFNlY3VyaXR5Um9sZU5hbWVkKHJvbGUuZ2V0Um9sZU5hbWUoKSkgPT0gbnVsbCkKLQkJCQkJYXNzZW1ibHkuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KHJvbGUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kZF9pbl9lYXJfbG9hZF9FWENfLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBlKTsgLy8gPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBhbHQtZGQgaXMgYWJvdXQgdG8gYmUgbG9hZGVkOyByZWdpc3RlciB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZmFjdG9yeSBmb3IgdGhlIHVyaSBzbyBpdAotCSAqIHdpbGwgZ2V0IGxvYWRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJSZXNvdXJjZUZhY3RvcnkoTW9kdWxlIGFNb2R1bGUsIFN0cmluZyBhVXJpKSB7Ci0JCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IEVKQkphclJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQlmYWN0b3J5ID0gV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmdldFJlZ2lzdGVyZWRGYWN0b3J5KCk7Ci0JCWVsc2UgaWYgKGFNb2R1bGUuaXNKYXZhTW9kdWxlKCkpCi0JCQlmYWN0b3J5ID0gQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0Nvbm5lY3Rvck1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IENvbm5lY3RvclJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCi0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCQkoKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpKS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChhVXJpLCBmYWN0b3J5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKE1vZHVsZVJlZiBhTW9kdWxlUmVmKSB7Ci0JCWlmIChhTW9kdWxlUmVmID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU1vZHVsZSBhTW9kdWxlID0gYU1vZHVsZVJlZi5nZXRNb2R1bGUoKTsKLQotCQlpZiAoYU1vZHVsZSAhPSBudWxsKQotCQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkucmVtb3ZlKGFNb2R1bGUpOwotCi0JCWdldE1vZHVsZVJlZnMoKS5yZW1vdmUoYU1vZHVsZVJlZik7Ci0JCWlmIChnZXRNb2R1bGVSZWZzKGFNb2R1bGVSZWYuZ2V0TW9kdWxlRmlsZSgpKS5pc0VtcHR5KCkpCi0JCQlnZXRGaWxlcygpLnJlbW92ZShhTW9kdWxlUmVmLmdldE1vZHVsZUZpbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFQVJGaWxlCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlUmVmcyhNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuZ2V0TW9kdWxlRmlsZSgpID09IGFNb2R1bGVGaWxlKQotCQkJCXJlc3VsdC5hZGQocmVmKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbmFtZVJvbGVzSW5Nb2R1bGVERHMoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobS5pc0VqYk1vZHVsZSgpKQotCQkJCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBtKS5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCQkJCWVsc2UgaWYgKG0uaXNXZWJNb2R1bGUoKSkKLQkJCQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgbSkucmVuYW1lU2VjdXJpdHlSb2xlKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmRkX2luX2Vhcl9sb2FkX0VYQ18sIChuZXcgT2JqZWN0W117bS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBlYXIgZmlsZSAiezF9IiIKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpIHRocm93cyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb24gYXBwID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJU2VjdXJpdHlSb2xlIGFSb2xlID0gYXBwLmdldFNlY3VyaXR5Um9sZU5hbWVkKGV4aXN0aW5nUm9sZU5hbWUpOwotCQlpZiAoYVJvbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm5vX3NlY19yb2xlX0VYQ18sIChuZXcgT2JqZWN0W117Z2V0VVJJKCksIGV4aXN0aW5nUm9sZU5hbWV9KSkpOyAvLyA9ICI6IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCAiCi0JCWlmIChhcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3Um9sZU5hbWUpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZHVwX3NlY19yb2xlX0VYQ18sIChuZXcgT2JqZWN0W117Z2V0VVJJKCksIG5ld1JvbGVOYW1lfSkpLCBhcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3Um9sZU5hbWUpKTsgLy8gPSAiOiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgIgotCi0JCWFSb2xlLnNldFJvbGVOYW1lKG5ld1JvbGVOYW1lKTsKLQotCQlyZW5hbWVSb2xlc0luTW9kdWxlRERzKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKCkgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJcm9sbFVwUm9sZXMoYU1vZHVsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKE1vZHVsZSBhTW9kdWxlKSB7Ci0JCUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJCXNlY3VyaXR5Um9sZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBhTW9kdWxlKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQllbHNlIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQkJc2VjdXJpdHlSb2xlcyA9IGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIGFNb2R1bGUpKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZGRfaW5fZWFyX2xvYWRfRVhDXywgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0KLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN1cml0eVJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlhZGRDb3B5SWZOb3RFeGlzdHMoKFNlY3VyaXR5Um9sZSkgc2VjdXJpdHlSb2xlcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb24gbCkgewotCQl0aGlzLnNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGwpOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKSB7Ci0JCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsICYmIGRlcGxveW1lbnREZXNjcmlwdG9yLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IChBcHBsaWNhdGlvbillUmVzb2x2ZVByb3h5KG9sZERlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBvbGREZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihBcHBsaWNhdGlvbiBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQlBcHBsaWNhdGlvbiBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZVJlZnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlUmVmcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlnZXRNb2R1bGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNb2R1bGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJZ2V0TW9kdWxlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCXJldHVybiBtb2R1bGVSZWZzICE9IG51bGwgJiYgIW1vZHVsZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNb2R1bGVSZWZzR2VuKCkgewotCQlpZiAobW9kdWxlUmVmcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTW9kdWxlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlUmVmczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlUmVmcygpIHsKLQkJRUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnNHZW4oKTsKLQotCQlpZiAocmVmcy5pc0VtcHR5KCkpCi0JCQlpbml0UmVmcyhyZWZzKTsKLQotCQlyZXR1cm4gcmVmczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0UmVmcyhFTGlzdCByZWZzKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCXJlZnMuYWRkKGNyZWF0ZU1vZHVsZVJlZihtb2R1bGUsIG51bGwpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVSZWYgY3JlYXRlTW9kdWxlUmVmKE1vZHVsZSBhTW9kdWxlLCBNb2R1bGVGaWxlIGFGaWxlKSB7Ci0JCU1vZHVsZVJlZiBuZXdSZWYgPSBudWxsOwotCi0JCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQluZXdSZWYgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzSmF2YU1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQotCQluZXdSZWYuc2V0TW9kdWxlKGFNb2R1bGUpOwotCQluZXdSZWYuc2V0TW9kdWxlRmlsZShhRmlsZSk7Ci0KLQkJcmV0dXJuIG5ld1JlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRDbGllbnRNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbGllbnRNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNDbGllbnQoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNDb25uZWN0b3IoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRFSkJNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNFSkIoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRXZWJNb2R1bGVSZWZzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuaXNXZWIoKSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUFSRmlsZSNnZXRGQVJGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RkFSRmlsZXMoKSB7Ci0JCUxpc3QgZmFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0ZBUkZpbGUoKSkgewotCQkJCWZhckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhckZpbGVzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUjZ2V0QXJjaGl2ZXNPZlR5cGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcmNoaXZlc09mVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEVKQlJlZmVyZW5jZXMoYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCWlmICghZmlsdGVyTGlua2VkUmVmZXJlbmNlcyB8fCAhZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcykgewotCQkJQXBwbGljYXRpb24gYXBwID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWlmIChhcHAgIT0gbnVsbCkgewotCQkJCUxpc3QgbW9kdWxlcyA9IGFwcC5nZXRNb2R1bGVzKCk7Ci0JCQkJTW9kdWxlIG1vZHVsZTsKLQkJCQlNYXAgcmVmZXJlbmNlcyA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCW1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJCQl0cnkgewotCQkJCQkJcmVmZXJlbmNlcyA9IGNvbGxlY3RFSkJSZWZlcmVuY2VzKG1vZHVsZSwgZmlsdGVyTGlua2VkUmVmZXJlbmNlcywgZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcywgcmVmZXJlbmNlcyk7Ci0JCQkJCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0gY2F0Y2ggKEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZWZlcmVuY2VzOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzCi0JICogQHBhcmFtIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBjb2xsZWN0RUpCUmVmZXJlbmNlcyhNb2R1bGUgbW9kdWxlLCBib29sZWFuIGZpbHRlckxpbmtlZFJlZmVyZW5jZXMsIGJvb2xlYW4gZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcywgTWFwIHJlZmVyZW5jZXMpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCU1hcCBteVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOwotCQlMaXN0IG1vZHVsZVJlZmVyZW5jZXMgPSBnZXRFSkJSZWZlcm5lY2VzKG1vZHVsZSk7Ci0JCWlmIChtb2R1bGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIW1vZHVsZVJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlFamJSZWYgcmVmID0gbnVsbDsKLQkJCUxpc3QgZmlsdGVyZWRSZWZzID0gbnVsbDsKLQkJCVN0cmluZyBsaW5rID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJCXJlZiA9IChFamJSZWYpIG1vZHVsZVJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJCWxpbmsgPSByZWYuZ2V0TGluaygpOwotCQkJCWlmICgobGluayAhPSBudWxsICYmIGxpbmsubGVuZ3RoKCkgPiAwICYmICFmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzKSB8fCAoKGxpbmsgPT0gbnVsbCB8fCBsaW5rLmxlbmd0aCgpID09IDApICYmICFmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzKSkgewotCQkJCQlpZiAoZmlsdGVyZWRSZWZzID09IG51bGwpCi0JCQkJCQlmaWx0ZXJlZFJlZnMgPSBuZXcgQXJyYXlMaXN0KG1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpKTsKLQkJCQkJZmlsdGVyZWRSZWZzLmFkZChyZWYpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmaWx0ZXJlZFJlZnMgIT0gbnVsbCkgewotCQkJCWlmIChteVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCQkJbXlSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlteVJlZmVyZW5jZXMucHV0KG1vZHVsZSwgZmlsdGVyZWRSZWZzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEVKQlJlZmVybmVjZXMoTW9kdWxlIG1vZHVsZSkgdGhyb3dzIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlpZiAobW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQlFSkJKYXIgZWpiSmFyID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVqYk1vZHVsZSkgbW9kdWxlKTsKLQkJCQlyZXR1cm4gZ2V0RUpCUmVmZXJlbmNlcyhlamJKYXIpOwotCQkJfSBlbHNlIGlmIChtb2R1bGUuaXNXZWJNb2R1bGUoKSkgewotCQkJCVdlYkFwcCB3ZWJBcHAgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBtb2R1bGUpOwotCQkJCWlmICh3ZWJBcHAgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHdlYkFwcC5nZXRFamJSZWZzKCk7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZS5pc0phdmFNb2R1bGUoKSkgewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChKYXZhQ2xpZW50TW9kdWxlKSBtb2R1bGUpOwotCQkJCWlmIChhcHBDbGllbnQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGFwcENsaWVudC5nZXRFamJSZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVqYkphcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RUpCUmVmZXJlbmNlcyhFSkJKYXIgZWpiSmFyKSB7Ci0JCWlmIChlamJKYXIgIT0gbnVsbCkgewotCQkJTGlzdCBlamJzID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQkJTGlzdCByZWZzID0gbnVsbDsKLQkJCUVudGVycHJpc2VCZWFuIGVqYiA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVqYnMuc2l6ZSgpOyBpKyspIHsKLQkJCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pIGVqYnMuZ2V0KGkpOwotCQkJCWlmIChyZWZzID09IG51bGwpCi0JCQkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVmcy5hZGRBbGwoZWpiLmdldEVqYlJlZnMoKSk7Ci0JCQl9Ci0JCQlpZiAocmVmcyAhPSBudWxsKQotCQkJCXJldHVybiByZWZzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJKYXJGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJKYXJGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNiNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkphckZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBFSkJKYXJGaWxlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFSkJKYXIgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHVibGljIEVKQkphckZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfRklMRTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB0b29scyBwZXJmb3JtaW5nIHNlbGVjdGl2ZSBpbXBvcnQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBc3NvY2lhdGVkRmlsZXMoRW50ZXJwcmlzZUJlYW4gZWpiKSB7Ci0KLQkJTGlzdCBjbGFzc05hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlamIuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkgewotCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkpOwotCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAoZWpiLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCWlmIChlamIuaGFzUmVtb3RlQ2xpZW50KCkpIHsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0SG9tZUludGVyZmFjZU5hbWUoKSk7Ci0JCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZWpiLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZSgpKTsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRFamJDbGFzc05hbWUoKSk7Ci0KLQkJaWYgKGVqYi5pc0VudGl0eSgpKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gKChFbnRpdHkpIGVqYikuZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQkJCWlmICghY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmEiKSkvLyROT04tTkxTLTEkCi0JCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc05hbWVzLmdldChpKTsKLQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBjbGFzc1VyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY2xhc3NOYW1lVG9VcmkoY2xhc3NOYW1lKTsKLQkJCVN0cmluZyBqYXZhVXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5jbGFzc05hbWVUb0phdmFVcmkoY2xhc3NOYW1lKTsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0LmFkZChnZXRGaWxlKGNsYXNzVXJpKSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpb3gpIHsKLQkJCQkvL0RvIG5vdGhpbmcgLSB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGphciBmaWxlCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlc3VsdC5hZGQoZ2V0RmlsZShqYXZhVXJpKSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpb3gpIHsKLQkJCQkvL0RvIG5vdGhpbmcgLSB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGphciBmaWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIEVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlFSkJKYXIgZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0SW1wb3J0U3RyYXRlZ3koKS5pbXBvcnRNZXRhRGF0YSgpOwotCQkJfSBjYXRjaCAoRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUpCSmFyRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0ZWRGcm9tMTAoKSB7Ci0JCXJldHVybiBnZXRJbXBvcnRTdHJhdGVneSgpICE9IG51bGwgJiYgZ2V0SW1wb3J0U3RyYXRlZ3koKS5pc0VKQjEwKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUVKQkphciBlamJKYXIgPSAoKEVqYlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJKYXIoKTsKLQkJcmVzb3VyY2Uuc2V0SUQoZWpiSmFyLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGVqYkphcik7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGVqYkphcik7Ci0KLQkJcmV0dXJuIGVqYkphcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEVKQkphciBsKSB7Ci0JCXRoaXMuc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4obCk7Ci0JCXJlcGxhY2VSb290KGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKSB7Ci0JCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsICYmIGRlcGxveW1lbnREZXNjcmlwdG9yLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IChFSkJKYXIpZVJlc29sdmVQcm94eShvbGREZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gb2xkRGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihFSkJKYXIgbmV3RGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJRUpCSmFyIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChFSkJKYXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjUzOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJNb2R1bGVSZWZJbXBsIGV4dGVuZHMgTW9kdWxlUmVmSW1wbCBpbXBsZW1lbnRzIEVKQk1vZHVsZVJlZiB7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFSkJNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkVKQl9NT0RVTEVfUkVGOwotCX0KLQotCXB1YmxpYyBFSkJKYXIgZ2V0RUpCSmFyKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChFSkJKYXIpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0VKQigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL0VKQk1vZHVsZVJlZkltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwY2U3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0TW9kaWZpZWQoKSA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIExBU1RfTU9ESUZJRURfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZCA9IExBU1RfTU9ESUZJRURfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMYXN0IE1vZGlmaWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsYXN0TW9kaWZpZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU0laRV9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTaXplIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2l6ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdG9yeUVudHJ5KCkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGlyZWN0b3J5RW50cnkoKSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlyZWN0b3J5RW50cnkgPSBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERpcmVjdG9yeSBFbnRyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlyZWN0b3J5RW50cnlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxVUkkoKSA8ZW0+T3JpZ2luYWwgVVJJPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JpZ2luYWxVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsVVJJID0gT1JJR0lOQUxfVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb250YWluZXIgbG9hZGluZ0NvbnRhaW5lciA9IG51bGw7Ci0KLQlwdWJsaWMgRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuRklMRTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlVUkkoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRGaWxlTmFtZVBhcmVudChnZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCkucHJpbUdldElucHV0U3RyZWFtKGdldE9yaWdpbmFsVVJJKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLmdldEZpbGVOYW1lVGFpbChnZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGlzUmVhZE9ubHlEaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIG5ld1VSSSkgewotCQlTdHJpbmcgb2xkVVJJID0gdXJpOwotCQl1cmkgPSBuZXdVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSSwgb2xkVVJJLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbmV3TGFzdE1vZGlmaWVkKSB7Ci0JCWxvbmcgb2xkTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCQlsYXN0TW9kaWZpZWQgPSBuZXdMYXN0TW9kaWZpZWQ7Ci0JCWJvb2xlYW4gb2xkTGFzdE1vZGlmaWVkRVNldCA9IGxhc3RNb2RpZmllZEVTZXQ7Ci0JCWxhc3RNb2RpZmllZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVELCBvbGRMYXN0TW9kaWZpZWQsIGxhc3RNb2RpZmllZCwgIW9sZExhc3RNb2RpZmllZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCWxvbmcgb2xkTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCQlib29sZWFuIG9sZExhc3RNb2RpZmllZEVTZXQgPSBsYXN0TW9kaWZpZWRFU2V0OwotCQlsYXN0TW9kaWZpZWQgPSBMQVNUX01PRElGSUVEX0VERUZBVUxUOwotCQlsYXN0TW9kaWZpZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRCwgb2xkTGFzdE1vZGlmaWVkLCBMQVNUX01PRElGSUVEX0VERUZBVUxULCBvbGRMYXN0TW9kaWZpZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGFzdE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbGFzdE1vZGlmaWVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBsb25nIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgbmV3U2l6ZSkgewotCQlsb25nIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJYm9vbGVhbiBvbGRTaXplRVNldCA9IHNpemVFU2V0OwotCQlzaXplRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkUsIG9sZFNpemUsIHNpemUsICFvbGRTaXplRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNpemUoKSB7Ci0JCWxvbmcgb2xkU2l6ZSA9IHNpemU7Ci0JCWJvb2xlYW4gb2xkU2l6ZUVTZXQgPSBzaXplRVNldDsKLQkJc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0JCXNpemVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRSwgb2xkU2l6ZSwgU0laRV9FREVGQVVMVCwgb2xkU2l6ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5RW50cnkoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbiBuZXdEaXJlY3RvcnlFbnRyeSkgewotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5ID0gZGlyZWN0b3J5RW50cnk7Ci0JCWRpcmVjdG9yeUVudHJ5ID0gbmV3RGlyZWN0b3J5RW50cnk7Ci0JCWJvb2xlYW4gb2xkRGlyZWN0b3J5RW50cnlFU2V0ID0gZGlyZWN0b3J5RW50cnlFU2V0OwotCQlkaXJlY3RvcnlFbnRyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlksIG9sZERpcmVjdG9yeUVudHJ5LCBkaXJlY3RvcnlFbnRyeSwgIW9sZERpcmVjdG9yeUVudHJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERpcmVjdG9yeUVudHJ5KCkgewotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5ID0gZGlyZWN0b3J5RW50cnk7Ci0JCWJvb2xlYW4gb2xkRGlyZWN0b3J5RW50cnlFU2V0ID0gZGlyZWN0b3J5RW50cnlFU2V0OwotCQlkaXJlY3RvcnlFbnRyeSA9IERJUkVDVE9SWV9FTlRSWV9FREVGQVVMVDsKLQkJZGlyZWN0b3J5RW50cnlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZLCBvbGREaXJlY3RvcnlFbnRyeSwgRElSRUNUT1JZX0VOVFJZX0VERUZBVUxULCBvbGREaXJlY3RvcnlFbnRyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREaXJlY3RvcnlFbnRyeSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeUVudHJ5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWxVUkkoKSB7Ci0JCXJldHVybiBvcmlnaW5hbFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbFVSSShTdHJpbmcgbmV3T3JpZ2luYWxVUkkpIHsKLQkJU3RyaW5nIG9sZE9yaWdpbmFsVVJJID0gb3JpZ2luYWxVUkk7Ci0JCW9yaWdpbmFsVVJJID0gbmV3T3JpZ2luYWxVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSSwgb2xkT3JpZ2luYWxVUkksIG9yaWdpbmFsVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyIGdldExvYWRpbmdDb250YWluZXIoKSB7Ci0JCWlmIChsb2FkaW5nQ29udGFpbmVyICE9IG51bGwgJiYgbG9hZGluZ0NvbnRhaW5lci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTG9hZGluZ0NvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpbG9hZGluZ0NvbnRhaW5lcjsKLQkJCWxvYWRpbmdDb250YWluZXIgPSAoQ29udGFpbmVyKWVSZXNvbHZlUHJveHkob2xkTG9hZGluZ0NvbnRhaW5lcik7Ci0JCQlpZiAobG9hZGluZ0NvbnRhaW5lciAhPSBvbGRMb2FkaW5nQ29udGFpbmVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVIsIG9sZExvYWRpbmdDb250YWluZXIsIGxvYWRpbmdDb250YWluZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRhaW5lciBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKSB7Ci0JCXJldHVybiBsb2FkaW5nQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRpbmdDb250YWluZXIoQ29udGFpbmVyIG5ld0xvYWRpbmdDb250YWluZXIpIHsKLQkJQ29udGFpbmVyIG9sZExvYWRpbmdDb250YWluZXIgPSBsb2FkaW5nQ29udGFpbmVyOwotCQlsb2FkaW5nQ29udGFpbmVyID0gbmV3TG9hZGluZ0NvbnRhaW5lcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVIsIG9sZExvYWRpbmdDb250YWluZXIsIGxvYWRpbmdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKENvbnRhaW5lcillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyKENvbnRhaW5lciBuZXdDb250YWluZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnRhaW5lciwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBuZXdDb250YWluZXIpIHsKLQkJaWYgKG5ld0NvbnRhaW5lciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIgJiYgbmV3Q29udGFpbmVyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnRhaW5lcikuZUludmVyc2VBZGQodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSLCBuZXdDb250YWluZXIsIG5ld0NvbnRhaW5lcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIoKENvbnRhaW5lcilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJc2V0TGFzdE1vZGlmaWVkKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RNb2RpZmllZDogIik7Ci0JCWlmIChsYXN0TW9kaWZpZWRFU2V0KSByZXN1bHQuYXBwZW5kKGxhc3RNb2RpZmllZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNpemU6ICIpOwotCQlpZiAoc2l6ZUVTZXQpIHJlc3VsdC5hcHBlbmQoc2l6ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpcmVjdG9yeUVudHJ5OiAiKTsKLQkJaWYgKGRpcmVjdG9yeUVudHJ5RVNldCkgcmVzdWx0LmFwcGVuZChkaXJlY3RvcnlFbnRyeSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmlnaW5hbFVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBGaWxlI2lzRkFSRmlsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGQVJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjAzMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUZpbGVJbXBsIGV4dGVuZHMgQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBNb2R1bGVGaWxlIHsKLQotCS8qKiBJbXBsZW1lbnRlciBmb3IgZXh0cmFjdGluZyBtZXRhLWRhdGEgZnJvbSB0aGlzIGFyY2hpdmUgaW50byB0aGUgcm9vdCBvYmplY3QgKi8KLQlwcm90ZWN0ZWQgSW1wb3J0U3RyYXRlZ3kgaW1wb3J0U3RyYXRlZ3k7Ci0JLyoqIEltcGxlbWVudGVyIGZvciBhZGRpbmcgbWV0YS1kYXRhIHRvIGFuIGFib3V0LXRvLWJlLWV4cG9ydGVkIGFyY2hpdmUgKi8KLQlwcm90ZWN0ZWQgRXhwb3J0U3RyYXRlZ3kgZXhwb3J0U3RyYXRlZ3k7Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFX0ZJTEU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGF6eUluaXRpYWxpemUoKSB7Ci0JCXJldHVybiBnZXRJbXBvcnRTdHJhdGVneSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNb2ZSZXNvdXJjZShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCUNvbnRhaW5lciBhQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChhQ29udGFpbmVyID09IG51bGwgfHwgIWFDb250YWluZXIuaXNFQVJGaWxlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoKEVBUkZpbGUpIGFDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgZ2V0RXhwb3J0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBleHBvcnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBnZXRJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGltcG9ydFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZpbGUsIG9yIGVtcHR5IHN0cmluZyBpZiB1bmtub3duIHZlcnNpb24uIEZvcgotCSAqIGV4YW1wbGUsICIyLjAiCi0JICogCi0JICogQGRlcHJlY2F0ZWQsIFVzZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjVmVyc2lvbigpIHsKLQkJZmxvYXQgdmVyID0gZ2V0U3BlY1ZlcnNpb25JRCgpOwotCQlGbG9hdCBzcGVjVmVyc2lvbiA9IG5ldyBGbG9hdCh2ZXIgLyAxMCk7Ci0JCXJldHVybiBzcGVjVmVyc2lvbi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBJRCBvZiB0aGUgbW9kdWxlIEZvciBleGFtcGxlLCAiMjAiCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNWZXJzaW9uSUQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChYTUxSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0KLQkvKioKLQkgKiBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JcHVibGljIFJlc291cmNlIG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgbWFrZU1vZlJlc291cmNlKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpOwotCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZkV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQltYWtlRGVwbG95bWVudERlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc2V0U2F2ZVN0cmF0ZWd5KGFTYXZlU3RyYXRlZ3kpOwotCQlpZiAoZ2V0RXhwb3J0U3RyYXRlZ3koKSAhPSBudWxsKQotCQkJZ2V0RXhwb3J0U3RyYXRlZ3koKS5wcmVTYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQlzdXBlci5zYXZlKGFTYXZlU3RyYXRlZ3kpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneSBuZXdFeHBvcnRTdHJhdGVneSkgewotCQlleHBvcnRTdHJhdGVneSA9IG5ld0V4cG9ydFN0cmF0ZWd5OwotCQlpZiAobmV3RXhwb3J0U3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJbmV3RXhwb3J0U3RyYXRlZ3kuc2V0QXJjaGl2ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ltcG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgbmV3SW1wb3J0U3RyYXRlZ3kpIHsKLQkJaW1wb3J0U3RyYXRlZ3kgPSBuZXdJbXBvcnRTdHJhdGVneTsKLQkJaWYgKG5ld0ltcG9ydFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld0ltcG9ydFN0cmF0ZWd5LnNldEFyY2hpdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZSNzZXRKMkVFVmVyc2lvbihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oaW50IHZlcnNpb25JRCkgewotCQl0cnkgewotCQkJKChYTUxSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5zZXRWZXJzaW9uSUQodmVyc2lvbklEKTsKLQkJfSBjYXRjaCAoUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDg3ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk5vTW9kdWxlRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZVJlZkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGVSZWYgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZSgpIDxlbT5Nb2R1bGU8L2VtPn0nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZSBtb2R1bGUgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFX1JFRjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRMaXN0KEVMaXN0IGxpc3QpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlR2VuKCkgewotCQlpZiAobW9kdWxlRmlsZSAhPSBudWxsICYmIG1vZHVsZUZpbGUuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE1vZHVsZUZpbGUgPSAoSW50ZXJuYWxFT2JqZWN0KW1vZHVsZUZpbGU7Ci0JCQltb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpZVJlc29sdmVQcm94eShvbGRNb2R1bGVGaWxlKTsKLQkJCWlmIChtb2R1bGVGaWxlICE9IG9sZE1vZHVsZUZpbGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRSwgb2xkTW9kdWxlRmlsZSwgbW9kdWxlRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVGaWxlOwotCX0KLQotCXB1YmxpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoKSB7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQlpbml0TW9kdWxlRmlsZUZyb21FQVIoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGJhc2ljR2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE1vZHVsZUZpbGVGcm9tRUFSKCkgewotCQljaGVja0VBUkZpbGUoKTsKLQkJTW9kdWxlRmlsZSBhRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhRmlsZSA9IChNb2R1bGVGaWxlKSBnZXRFYXJGaWxlKCkuZ2V0RmlsZShtb2R1bGUuZ2V0VXJpKCkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCS8vSWdub3JlCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy9JZ25vcmUKLQkJfQotCQljaGVja1R5cGUobW9kdWxlLCBhRmlsZSk7Ci0JCXNldE1vZHVsZUZpbGUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZUZpbGUoTW9kdWxlRmlsZSBuZXdNb2R1bGVGaWxlKSB7Ci0JCU1vZHVsZUZpbGUgb2xkTW9kdWxlRmlsZSA9IG1vZHVsZUZpbGU7Ci0JCW1vZHVsZUZpbGUgPSBuZXdNb2R1bGVGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRSwgb2xkTW9kdWxlRmlsZSwgbW9kdWxlRmlsZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNBbHRERCgpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gIUFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkobW9kdWxlLmdldEFsdEREKCkpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJaWYgKGdldEVhckZpbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKGdldE1vZHVsZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlpZiAoZ2V0RWFyRmlsZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEVhckZpbGUoKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcihnZXRNb2R1bGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0RUFSRmlsZSgpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJaWYgKGdldE1vZHVsZUZpbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRNb2R1bGVGaWxlKCkuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNzZXRVUkkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRNb2R1bGVGaWxlKCkgIT0gbnVsbCkKLQkJCWdldE1vZHVsZUZpbGUoKS5zZXRVUkkodXJpKTsKLQotCQlpZiAoZ2V0TW9kdWxlKCkgIT0gbnVsbCkKLQkJCWdldE1vZHVsZSgpLnNldFVyaSh1cmkpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0Nvbm5lY3RvcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzRUpCKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNXZWIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBnZXRFYXJGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUFSRmlsZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWFyRmlsZShFQVJGaWxlIG5ld0VhckZpbGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VhckZpbGUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFyRmlsZShFQVJGaWxlIG5ld0VhckZpbGUpIHsKLQkJaWYgKG5ld0VhckZpbGUgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUgJiYgbmV3RWFyRmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VhckZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFYXJGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VhckZpbGUpLmVJbnZlcnNlQWRkKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFYXJGaWxlKG5ld0VhckZpbGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG5ld0VhckZpbGUsIG5ld0VhckZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5lSXNQcm94eSgpKSB7Ci0JCQlNb2R1bGUgb2xkTW9kdWxlID0gbW9kdWxlOwotCQkJbW9kdWxlID0gKE1vZHVsZSkgRWNvcmVVdGlsLnJlc29sdmUobW9kdWxlLCB0aGlzKTsKLQkJCWlmIChtb2R1bGUgIT0gb2xkTW9kdWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFLCBvbGRNb2R1bGUsIG1vZHVsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZHVsZSBiYXNpY0dldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGUoTW9kdWxlIG5ld01vZHVsZSkgewotCQlNb2R1bGUgb2xkTW9kdWxlID0gbW9kdWxlOwotCQltb2R1bGUgPSBuZXdNb2R1bGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRSwgb2xkTW9kdWxlLCBtb2R1bGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRFYXJGaWxlKChFQVJGaWxlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRFYXJGaWxlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGVGaWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gZ2V0RWFyRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZUZpbGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlICJyZXNvdXJjZXMgcGF0aCIgb2YgZWl0aGVyIHRoZSBNb2R1bGVGaWxlLCBpZiB0aGUgbW9kdWxlIGRvZXMKLQkgKiBub3QgdXNlIGFsdC1kZCwgb3IgZnJvbSB0aGUgYWx0Um9vdCBvZiB0aGUgbW9kdWxlLCBmb3VuZCBpbiB0aGUgcmVzb3VyY2VzIHBhdGggb2YgdGhlIEVBUgotCSAqIAotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5I2dldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBnZXRBbHRSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JCXJldHVybiBnZXRMb2NhbFJlc291cmNlSW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0TG9jYWxSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrTW9kdWxlRmlsZSgpOwotCQlyZXR1cm4gbW9kdWxlRmlsZS5nZXRSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEFsdFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0VXJpKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZS5nZXRVcmkoKTsKLQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBtb2R1bGVGaWxlLmdldFVSSSgpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldEFsdE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0QWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRMb2NhbE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQljaGVja01vZHVsZUZpbGUoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGUuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBnZXRBbHRNb2ZSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gZ2V0TG9jYWxNb2ZSZXNvdXJjZSh1cmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI21ha2VBbHRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VBbHRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCXJldHVybiBnZXRFYXJGaWxlKCkubWFrZU1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tFQVJGaWxlKCkgewotCQlpZiAoZ2V0RWFyRmlsZSgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5Nb2R1bGVfbm90X2luX0VBUiwgbmV3IE9iamVjdFtde2dldFVyaSgpfSkpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNtYWtlTG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VMb2NhbE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQljaGVja01vZHVsZUZpbGUoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGUubWFrZU1vZlJlc291cmNlKHVyaSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja01vZHVsZUZpbGUoKSB7Ci0JCWdldE1vZHVsZUZpbGUoKTsKLQkJaWYgKG1vZHVsZUZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOb01vZHVsZUZpbGVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5Nb2R1bGVfZmlsZV9kb2VzX25vdF9leGlzdF8yLCBuZXcgT2JqZWN0W117Z2V0VXJpKCl9KSk7IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShNb2R1bGUgbW9kdWxlRGVzY3JpcHRvciwgRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfZmlsZV9kb2VzX25vdF9leGlzdF9mb3JfbW9kdWxlLCBuZXcgT2JqZWN0W117bW9kdWxlRGVzY3JpcHRvci5nZXRVcmkoKX0pOyAKLQkJCXRocm93IG5ldyBOb01vZHVsZUZpbGVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJLy9BZGRlZCBmb3IgZGVmZWN0IDExMzkyOQotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQlTdHJpbmcgdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuTW9kdWxlX2ZpbGU7IAotCQlpZiAobW9kdWxlRGVzY3JpcHRvci5pc1dlYk1vZHVsZSgpICYmICFhRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQV9XQVJfZmlsZTsgCi0JCX0gZWxzZSBpZiAobW9kdWxlRGVzY3JpcHRvci5pc0VqYk1vZHVsZSgpICYmICFhRmlsZS5pc0VKQkphckZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQW5fRUpCX0pBUl9maWxlOyAKLQkJfSBlbHNlIGlmIChtb2R1bGVEZXNjcmlwdG9yLmlzSmF2YU1vZHVsZSgpICYmICFhRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl0eXBlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5Bbl9BcHBsaWNhdGlvbl9DbGllbnRfSkFSX2ZpbGU7IAotCQl9IGVsc2UgaWYgKG1vZHVsZURlc2NyaXB0b3IuaXNDb25uZWN0b3JNb2R1bGUoKSAmJiAhYUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCXR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfUkFSX2ZpbGU7IAotCQl9IGVsc2UgaWYgKCFhRmlsZS5pc01vZHVsZUZpbGUoKSkKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQotCQlpZiAoaXNWYWxpZCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZWFyVXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGdldEVhckZpbGUoKSAhPSBudWxsKQotCQkJZWFyVXJpID0gZ2V0RWFyRmlsZSgpLmdldFVSSSgpOwotCQlTdHJpbmcgbWVzc2FnZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlX25vdF9jb3JyZWN0X3R5cGUiLCBuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCksIGVhclVyaSwgdHlwZX0pOyAvLyROT04tTkxTLTEkCi0JCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI21ha2VNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZXNBbHRERCgpKQotCQkJcmV0dXJuIG1ha2VBbHRNb2ZSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gbWFrZUxvY2FsTW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUkFSRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUkFSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZTY0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUkFSRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIFJBUkZpbGUgewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3IgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHVibGljIFJBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLlJBUl9GSUxFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUNsYXNzKEZpbGUgYUZpbGUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5hZGRfY29weV9jbGFzc19kaXJfRVhDXywgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRVUkkoKX0pKSk7IC8vID0gIk1ldGhvZCBhZGRDb3B5Q2xhc3Mgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMgOiIKLQkJcmV0dXJuIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KGFGaWxlLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgYWRkQ29weUZpbGVBZGRpbmdQcmVmaXgoRmlsZSBhRmlsZSwgU3RyaW5nIHVyaVByZWZpeCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzd2l6emxlZFVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoIXN3aXp6bGVkVXJpLnN0YXJ0c1dpdGgodXJpUHJlZml4KSkgewotCQkJc3dpenpsZWRVcmkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkodXJpUHJlZml4LCBzd2l6emxlZFVyaSwgJy8nKTsKLQkJfQotCQljaGVja0FkZFZhbGlkKHN3aXp6bGVkVXJpKTsKLQkJRmlsZSBjb3B5ID0gY29weShhRmlsZSk7Ci0JCWNvcHkuc2V0VVJJKHN3aXp6bGVkVXJpKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9yQ29ubmVjdG9yRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBkaXIsIGludCBleHBhbnNpb25GbGFncykgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoZGlyLmdldEFic29sdXRlUGF0aCgpLCBleHBhbnNpb25GbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG9Db25uZWN0b3JEaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZyBhVXJpLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBhRGlyID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzVXNpbmcoYURpcikpCi0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5FeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfKTsgLy8gPSAiRXh0cmFjdCBkZXN0aW5hdGlvbiBpcyB0aGUgc2FtZSBwYXRoIGFzIHNvdXJjZSBmaWxlIgotCi0JCXRyeSB7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckNvbm5lY3RvckRpcmVjdG9yeShhRGlyLCBleHBhbnNpb25GbGFncyk7Ci0JCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5lcnJvcl9zYXZpbmdfRVhDXywgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8gPSAiRXJyb3Igc2F2aW5nICIKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLlJBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzQnlQcmVmaXgoQXJjaGl2ZUNvbnN0YW50cy5SQVJfQ0xBU1NFU19VUkkpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUNvbm5lY3RvciBkZCA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKQotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbm5lY3RvciBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCVN0cmluZ1tdIHByZWZpeGVzID0ge0oyRUVDb25zdGFudHMuTUVUQV9JTkYsIEoyRUVDb25zdGFudHMuV0VCX0lORn07Ci0JCXJldHVybiBmaWx0ZXJGaWxlc1dpdGhvdXRQcmVmaXgocHJlZml4ZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlKY2FQYWNrYWdlIHAgPSAoSmNhUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQkJSmNhRmFjdG9yeSBmY3QgPSBwLmdldEpjYUZhY3RvcnkoKTsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IGZjdC5jcmVhdGVDb25uZWN0b3IoKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY29ubmVjdG9yKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoY29ubmVjdG9yKTsKLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3RvciBsKSB7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbDsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChDb25uZWN0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKENvbm5lY3RvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlyZXR1cm4gbmV3IFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUmVhZE9ubHlEaXJlY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5M2U2NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlEaXJlY3RvcnlJbXBsIGV4dGVuZHMgQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzIFJlYWRPbmx5RGlyZWN0b3J5IHsKLQotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuUkVBRF9PTkxZX0RJUkVDVE9SWTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJZ2V0RmlsZXMoKTsKLQkJcmV0dXJuIGdldEZpbGVJbmRleCgpLmNvbnRhaW5zS2V5KGFVcmkpOwotCX0KLQotCS8qKgotCSAqIGNvbnRhaW5zRmlsZUluUm9vdE9yU3ViZGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuY29udGFpbnMoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghY29udGFpbnNGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oYVVyaSk7Ci0KLQkJaWYgKGNvbnRhaW5zRmlsZShhVXJpKSkKLQkJCXJldHVybiBnZXRGaWxlKGFVcmkpOwotCi0JCUxpc3Qgc3ViZGlycyA9IGdldFJlYWRPbmx5RGlyZWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJkaXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZWFkT25seURpcmVjdG9yeSBzdWJkaXIgPSAoUmVhZE9ubHlEaXJlY3RvcnkpIHN1YmRpcnMuZ2V0KGkpOwotCQkJaWYgKHN1YmRpci5jb250YWluc0ZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShhVXJpKSkKLQkJCQlyZXR1cm4gc3ViZGlyLmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShhVXJpKTsKLQkJfQotCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZsYXQgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgc3ViZGlyZWN0b3JpZXMsIHdpdGggdGhlCi0JICogZGlyZWN0b3JpZXMgZmlsdGVyZWQgb3V0LCBhcyB0aGUgbGlzdCB3b3VsZCBhcHBlYXIgaW4gYW4gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlc1JlY3Vyc2l2ZSgpIHsKLQkJTGlzdCBhbGxGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlc0xpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCQlhbGxGaWxlcy5hZGRBbGwoKChSZWFkT25seURpcmVjdG9yeSkgYUZpbGUpLmdldEZpbGVzUmVjdXJzaXZlKCkpOwotCQkJZWxzZQotCQkJCWFsbEZpbGVzLmFkZChhRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGFsbEZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIGZpbGVzIHdpdGgganVzdCB0aGUgaW5zdGFuY2VzIG9mIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVhZE9ubHlEaXJlY3RvcmllcygpIHsKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlc0xpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCQlmaWx0ZXJlZC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBpc1JlYWRPbmx5RGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzNTY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNC8wMCA1OjI0OjQ0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgc2luZ2xldG9uOwotCi0JLyoqCi0JICogQ29tbW9uQXJjaGl2ZUZhY3RvcnlEZXNjcmltaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgVGhpcyBuZXZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcwotCSAqICAgICAgaW1wbGVtZW50ZXIuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbnVsbCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGdldCBjYWxsZWQgYXQgdGhpcyBsZXZlbAotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9yI2dldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCgpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWFjYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgNToyNDo0NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBDb21tb25BcmNoaXZlRmFjdG9yeURlc2NyaW1pbmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlqYXZhLnV0aWwuTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZC5jYW5JbXBvcnQoYW5BcmNoaXZlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgVGhpcyBuZXZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcwotCSAqICAgICAgaW1wbGVtZW50ZXIuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbnVsbCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGdldCBjYWxsZWQgYXQgdGhpcyBsZXZlbAotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9yI2dldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCW1lc3NhZ2UuYXBwZW5kKGNoaWxkLmdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSk7Ci0JCQltZXNzYWdlLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWFkZENoaWxkKEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Ijb3BlbkFyY2hpdmUoQXJjaGl2ZSkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSByZXN1bHQgPSBzdXBlci5vcGVuQXJjaGl2ZShhbkFyY2hpdmUpOwotCQlpZiAocmVzdWx0ID09IGFuQXJjaGl2ZSkKLQkJCS8vQ291bGRuJ3QgY29udmVydAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV0FSRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV0FSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxYTEwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLldhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0FSRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIFdBUkZpbGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlYkFwcCBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3Qgc291cmNlRmlsZXM7Ci0KLQlwdWJsaWMgV0FSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuV0FSX0ZJTEU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5Q2xhc3MoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuYWRkX2NvcHlfY2xhc3NfZGlyX0VYQ18sIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCl9KSkpOyAvLyA9ICJNZXRob2QgYWRkQ29weUNsYXNzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzIDoiCi0JCXJldHVybiBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChhRmlsZSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KEZpbGUgYUZpbGUsIFN0cmluZyB1cmlQcmVmaXgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlTdHJpbmcgc3dpenpsZWRVcmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKCFzd2l6emxlZFVyaS5zdGFydHNXaXRoKHVyaVByZWZpeCkpIHsKLQkJCXN3aXp6bGVkVXJpID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKHVyaVByZWZpeCwgc3dpenpsZWRVcmksICcvJyk7Ci0JCX0KLQkJY2hlY2tBZGRWYWxpZChzd2l6emxlZFVyaSk7Ci0JCUZpbGUgY29weSA9IGNvcHkoYUZpbGUpOwotCQljb3B5LnNldFVSSShzd2l6emxlZFVyaSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlMaWIoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuYWRkX2NvcHlfbGliX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde2FGaWxlLmdldFVSSSgpfSkpKTsgLy8gPSAiTWV0aG9kIGFkZENvcHlMaWIgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMgOiIKLQkJcmV0dXJuIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KGFGaWxlLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KFN0cmluZyBsaWJQYXRoKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShsaWJQYXRoKTsKLQkJZW50cnkuc2V0V2FyRmlsZSh0aGlzKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgYnVpbGRpbmcgdGhlIHJ1bnRpbWUgY2xhc3MgcGF0aAotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBTdHJpbmdzLCB0aGUgYWJzb2x1dGUgcGF0aHMgb2YgYWxsIGZpbGUgZW50cmllcyAobm8gZGlyZWN0b3JpZXMpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWxsRmlsZUVudHJpZXNSZWN1cnNpdmUoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KSB7Ci0JCWlmICghYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gYUxpc3Q7Ci0JCS8vbW9kaWZpZWQgZm9yIGJvdHAgMTI2MTQwIDA1LjI5LjAyCi0JCVN0cmluZyBuYW1lID0gYUZpbGUuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5yZWdpb25NYXRjaGVzKHRydWUsIG5hbWUubGVuZ3RoKCkgLSA0LCAiLmphciIsIDAsIDQpKSB7Ly8kTk9OLU5MUy0xJAotCQkJYUxpc3QuYWRkKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfSBlbHNlIGlmIChhRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlqYXZhLmlvLkZpbGVbXSBjaGlsZHJlbiA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGNoaWxkcmVuW2ldLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENsYXNzZXMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlc0J5UHJlZml4KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlXZWJBcHAgZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpCi0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TGlicygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzQnlQcmVmaXgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaWJBcmNoaXZlcygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkksIG5ldyBTdHJpbmdbXXsiamFyIiwgInppcCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlTdHJpbmdbXSBwcmVmaXhlcyA9IHtKMkVFQ29uc3RhbnRzLk1FVEFfSU5GLCBKMkVFQ29uc3RhbnRzLldFQl9JTkZ9OwotCQlyZXR1cm4gZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KHByZWZpeGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIGZyb20gc3VwZXJjbGFzcyB0byBpbmNsdWRlIHRoZSBjbGFzZXNlcyBhbmQgbGlicyBvZiBhIFdBUkZpbGUgVGhlcmUgYWxzbyBpcyBhbgotCSAqIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGFuIGV4cGxvZGVkIHdhciBmaWxlIFRoZSBmb2xsb3dpbmcgaXMgd2hhdCBzaG91bGQgYmUgcmV0dXJuZWQ6Ci0JICogCi0JICogMSkgV0FSIGRpcmVjdG9yeSArIC9XRUItSU5GL2NsYXNzZXMgMikgYWxsIEpBUiBmaWxlcyBjb250YWluZWQgaW4gW1dBUiBkaXJlY3RvcnkgKwotCSAqIC9XRUItSU5GL2xpYl0gMykgV0FSIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aDsKLQkJdHJ5IHsKLQkJCWFic29sdXRlUGF0aCA9IGdldExvYWRTdHJhdGVneSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbMF07Ci0JCX0KLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBjbGFzc2VzUGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGFic29sdXRlUGF0aCwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQkJZW50cmllcy5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGNsYXNzZXNQYXRoKSk7Ci0JCQlhZGRXZWJMaWJzKGFic29sdXRlUGF0aCwgZW50cmllcyk7Ci0JCX0KLQotCQllbnRyaWVzLmFkZChjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYWJzb2x1dGVQYXRoKSk7Ci0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpIHsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gaW50ZXJuYWxHZXRCaW5hcmllc1BhdGgoKTsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIG1mRW50cmllcyA9IHN1cGVyLmdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpOwotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWZFbnRyaWVzKSk7Ci0KLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgZW50cmllcy50b0FycmF5KG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJMaWJzKFN0cmluZyBhYnNvbHV0ZVBhdGgsIExpc3QgZW50cmllcykgewotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBPcHRpbWl6YXRpb24qKioqKioqKioqKiBXZSBjb3VsZCBoYXZlIHVzZWQgdGhlIGhlbHBlciBnZXRsaWJzIGhlcmU7IGhvd2V2ZXIsIHRoYXQgY291bGQKLQkJICogZHJhZyBkb3duIHBlcmZvcm1hbmNlIGFzIHRoZSBmdWxsIGZpbGUgbGlzdCB3b3VsZCBoYXZlIHRvIGdldCBidWlsdCwgYW5kIHRoaXMgaXMgcnVudGltZTsKLQkJICogaWYgdGhlIGNsYXNzZXMgcG9ydGlvbiBpcyBodWdlIHRoZW4gYnVpbGRpbmcgdGhlIGZpbGUgbGlzdCB3b3VsZCBiZSBzbG93OyBtb3Jlb3Zlciwgd2UKLQkJICogd291bGQgdGhlbiBoYXZlIHRvIGNsZWFyIHRoZSBpbmRleCBmcm9tIHRoaXMgd2FyIGZpbGUuIHRoZXJlZm9yZSwgd2UnbGwgZG8gYSBsaXR0bGUgZXh0cmEKLQkJICogd29yayB0byBnZXQgdGhlIGxpYnMKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShBcmNoaXZlVXRpbC5nZXRPU1VyaShhYnNvbHV0ZVBhdGgsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpKTsKLQkJTGlzdCBsaWJzID0gZ2V0QWxsRmlsZUVudHJpZXNSZWN1cnNpdmUoYUZpbGUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBsaWJzLmdldChpKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KGxpYlBhdGgpKTsKLQkJfQotCQlhZGRMb29zZUxpYnNUb1J1bnRpbWVDbGFzc3BhdGgoZW50cmllcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9vc2VMaWJzVG9SdW50aW1lQ2xhc3NwYXRoKExpc3QgZW50cmllcykgewotCQlMb29zZVdBUkZpbGUgbG9vc2UgPSAoTG9vc2VXQVJGaWxlKSBnZXRMb2FkU3RyYXRlZ3koKS5nZXRMb29zZUFyY2hpdmUoKTsKLQkJaWYgKGxvb3NlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTGlzdCBsb29zZUxpYnMgPSBsb29zZS5nZXRMb29zZUxpYnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb29zZUxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCUxvb3NlTGlicmFyeSBsaWIgPSAoTG9vc2VMaWJyYXJ5KSBsb29zZUxpYnMuZ2V0KGkpOwotCQkJZW50cmllcy5hZGQoY3JlYXRlTGliQ2xhc3NwYXRoRW50cnkobGliLmdldEJpbmFyaWVzUGF0aCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWxjdWxhdGVTb3VyY2VDYW5kaWRhdGVGaWxlcygpIHsKLQkJTGlzdCBmaWxlc0xpc3QgPSBnZXRGaWxlcygpOwotCQlMaXN0IHJldEZpbGVzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmaWxlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYVVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQlpZiAoYVVyaS5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV0VCX0lORikgJiYgIWFVcmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkKLQkJCQlyZXRGaWxlcy5hZGQoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHJldEZpbGVzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUNhbmRpZGF0ZUZpbGVzKCkgewotCQlpZiAoc291cmNlRmlsZXMgPT0gbnVsbCkgewotCQkJc291cmNlRmlsZXMgPSBjYWxjdWxhdGVTb3VyY2VDYW5kaWRhdGVGaWxlcygpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgcGF0aFN0cmluZywgU3RyaW5nIHJlbFRvUGF0aFN0cmluZykgewotCi0JCWlmIChwYXRoU3RyaW5nLnN0YXJ0c1dpdGgocmVsVG9QYXRoU3RyaW5nKSkKLQkJCXJldHVybiBBcmNoaXZlVXRpbC50cnVuY2F0ZUZyb21Gcm9udElnbm9yZUNhc2UocGF0aFN0cmluZywgcmVsVG9QYXRoU3RyaW5nKTsKLQotCQlyZXR1cm4gcGF0aFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgb3V0cHV0IGZpbGUgcGFzc2VkIGluCi0JICogCi0JICogQHBhcmFtIGFDbGFzc0ZpbGUKLQkgKiAgICAgICAgICAgIFRoZSAuY2xhc3MgZmlsZSBvciBvdGhlciBvdXRwdXQgZmlsZSB0byBmaW5kIHRoZSBzb3VyY2UgZm9yCi0JICogQHJldHVybiBTdHJpbmcgVGhlIG1hdGNoaW5nIHNvdXJjZS4gTnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzb3VyY2UgZm91bmQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VGaWxlKEZpbGUgYUNsYXNzRmlsZSkgewotCQlMaXN0IHNvdXJjZUZpbGVzTGlzdCA9IGdldFNvdXJjZUNhbmRpZGF0ZUZpbGVzKCk7Ci0JCVN0cmluZyBjbGFzc1VSSSA9IGFDbGFzc0ZpbGUuZ2V0VVJJKCk7Ci0JCVN0cmluZyBjb252ZXJ0ZWRDbGFzc1VSSSA9IGNsYXNzVVJJOwotCQlpZiAoY2xhc3NVUkkuZW5kc1dpdGgoIi5jbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQljb252ZXJ0ZWRDbGFzc1VSSSA9IEFyY2hpdmVVdGlsLmNsYXNzVXJpVG9KYXZhVXJpKGFDbGFzc0ZpbGUuZ2V0VVJJKCkpOwotCQllbHNlIAotCQkJcmV0dXJuIG51bGw7Ci0JCWNvbnZlcnRlZENsYXNzVVJJID0gbWFrZVJlbGF0aXZlKGNvbnZlcnRlZENsYXNzVVJJLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JCWludCBiZXN0TGVuZ3RoID0gMzI3Njc7Ci0JCUZpbGUgYmVzdE1hdGNoID0gbnVsbDsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJU3RyaW5nIGFVcmkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VGaWxlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJYVVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQlpZiAoYVVyaS5lbmRzV2l0aChjb252ZXJ0ZWRDbGFzc1VSSSkgJiYgIWFVcmkuZXF1YWxzKGNsYXNzVVJJKSkgewotCQkJCWludCBleGNlc3NMZW5ndGggPSBhVXJpLmxlbmd0aCgpIC0gY29udmVydGVkQ2xhc3NVUkkubGVuZ3RoKCk7Ci0JCQkJaWYgKGV4Y2Vzc0xlbmd0aCA8IGJlc3RMZW5ndGgpIHsKLQkJCQkJYmVzdE1hdGNoID0gZmlsZTsKLQkJCQkJYmVzdExlbmd0aCA9IGV4Y2Vzc0xlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJlc3RNYXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJV2ViQXBwIHdlYkFwcCA9ICgoV2ViYXBwbGljYXRpb25QYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZVdlYkFwcCgpOwotCQlyZXNvdXJjZS5zZXRJRCh3ZWJBcHAsIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4od2ViQXBwKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQod2ViQXBwKTsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHAgbCkgewotCQl0aGlzLnNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGwpOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSAoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoV2ViQXBwKWVSZXNvbHZlUHJveHkob2xkRGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihXZWJBcHAgbmV3RGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJV2ViQXBwIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlyZXR1cm4gbmV3IFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0MWNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBXZWJNb2R1bGVSZWYgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5XRUJfTU9EVUxFX1JFRjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2ViTW9kdWxlUmVmI2dldFdlYkFwcCgpCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlyZXR1cm4gKFdlYkFwcCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzV2ViKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vV2ViTW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTU5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBleHBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBBcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTIzNmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4yIEFwcGxpY2F0aW9uIENsaWVudAotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsgLy8gPSAiQXBwbGljYXRpb24gQ2xpZW50IEphciBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBBcHBDbGllbnQyMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb25DbGllbnQgY2xpZW50ID0gbnVsbDsKLQotCQljbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcihjbGllbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2FkMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc3VwZXJ0eXBlIGZvciBhbGwgdGhlIGFyY2hpdmUgc3RyYXRlZ2llcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlU3RyYXRlZ3kgewotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoQXJjaGl2ZSBhcmNoaXZlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MjQ5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotLyoqCi0gKiBUaGlzIGFuIGFic3RyYWN0IHR5cGUgb2ZmIHdoaWNoIGFueSBpbXBsZW1lbnRlcnMgb2YgdGhlIGFyY2hpdmUgc3RyYXRlZ3kgY2FuIHN1YmNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZTsKLQotCS8qKgotCSAqIEFyY2hpdmVTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcmNoaXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCWFyY2hpdmUgPSBuZXdBcmNoaXZlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0Nvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0Nvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViMmViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogSW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gc2F2ZSBhbiBhcmNoaXZlcyBjb250ZW50cyB0byBhIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeU5hbWU7Ci0JcHJvdGVjdGVkIFVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXI7Ci0JLyoqIEluZGljYXRlcyB3aGljaCB0eXBlIG9mIGFyY2hpdmVzIHNob3VsZCBiZSBleHBhbmRlZCAqLwotCXByb3RlY3RlZCBpbnQgZXhwYW5zaW9uRmxhZ3M7Ci0KLQkvKioKLQkgKiBEaXJlY3RvcnlEdW1wU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXJlY3RvcnlEdW1wU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChTdHJpbmcgZGlyTmFtZSwgaW50IGZsYWdzKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpcmVjdG9yeU5hbWUoZGlyTmFtZSk7Ci0JCXNldEV4cGFuc2lvbkZsYWdzKGZsYWdzKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZERpcmVjdG9yeVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCVN0cmluZyB1cmkgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmdldE9TVXJpKGdldERpcmVjdG9yeU5hbWUoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKHVyaSwgZ2V0RXhwYW5zaW9uRmxhZ3MoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc2hvdWxkRXhwYW5kKGFuQXJjaGl2ZSkpCi0JCQlyZXR1cm4gY3JlYXRlTmVzdGVkRGlyZWN0b3J5U3RyYXRlZ3koYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGNyZWF0ZU5lc3RlZFppcFN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkWmlwU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpKTsKLQkJcmV0dXJuIG5ldyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsKG91dCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMDAgMjoyNjozNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxMDoxODoyMSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwYW5zaW9uRmxhZ3MoKSB7Ci0JCXJldHVybiBleHBhbnNpb25GbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDgvMDAgNDo1MDozMiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciBnZXRVcmlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwgY29udmVydGVyID0gbmV3IEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKGdldEFyY2hpdmUoKSwgZ2V0RGlyZWN0b3J5TmFtZSgpKTsKLQkJY29udmVydGVyLnNldE91dHB1dEZpbGVwYXRoKGdldERpcmVjdG9yeU5hbWUoKSk7Ci0JCXNldFVyaUNvbnZlcnRlcihjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWtkaXJzKFN0cmluZyBkaXJlY3RvcnlQYXRoKSB7Ci0JCUZpbGUgYURpcmVjdG9yeSA9IG5ldyBGaWxlKGdldERpcmVjdG9yeU5hbWUoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGRpcmVjdG9yeVBhdGgpOwotCQlhRGlyZWN0b3J5Lm1rZGlycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQkJYU1hbmlmZXN0LndyaXRlKG91dCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkksIGlveCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVudHJ5TmFtZSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKQotCQkJbWtkaXJzKGVudHJ5TmFtZSk7Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoZW50cnlOYW1lKSk7Ci0JCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5jb3B5KGluLCBvdXQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFGaWxlLmdldFVSSSgpLCBpb3gpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZU1vZlJlc291cmNlKGFSZXNvdXJjZSwgb3MpOwotCQlvcy5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzE1LzAwIDI6MjY6MzcgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0RpcmVjdG9yeU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3RGlyZWN0b3J5TmFtZSkgewotCQlkaXJlY3RvcnlOYW1lID0gbmV3RGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxMDoxODoyMSBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhwYW5zaW9uRmxhZ3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuc2lvbkZsYWdzKGludCBuZXdFeHBhbnNpb25GbGFncykgewotCQlleHBhbnNpb25GbGFncyA9IG5ld0V4cGFuc2lvbkZsYWdzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1VyaUNvbnZlcnRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaUNvbnZlcnRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIG5ld1VyaUNvbnZlcnRlcikgewotCQl1cmlDb252ZXJ0ZXIgPSBuZXdVcmlDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRXhwYW5kKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0KLQkJaW50IGZsYWcgPSAwOwotCi0JCWlmIChhbkFyY2hpdmUuaXNXQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfV0FSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUpCSkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfUkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUFBDTElFTlRfRklMRVM7Ci0JCWVsc2UKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUkNISVZFUzsKLQotCQlyZXR1cm4gKGdldEV4cGFuc2lvbkZsYWdzKCkgJiBmbGFnKSAhPSAwOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU0OWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLS8qKgotICogU3BlY2lhbGl6ZWQgbG9hZCBzdHJhdGVneSB0aGF0IHJlYWRzIGVudHJpZXMgaW4gYW4gYXJjaGl2ZSBmcm9tIGEgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kgZXh0ZW5kcyBMb2FkU3RyYXRlZ3kgewotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VXJpKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4NjY4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWdSZWdpc3RlcjsKLQotCi0vKioKLSAqIExvYWQgc3RyYXRlZ3kgdXNlZCBmb3IgcmVhZGluZyBleHBhbmRpbmcgYXJjaGl2ZXM7IHR5cGljYWxseSBpbiBhIHJ1bm5pbmcgc2VydmVyIHRoaXMgd291bGQgYmUgYW4KLSAqIEVBUiBvciBXQVIsIGFsdGhvdWdoIGl0IGNhbiBiZSBhbnkgQXJjaGl2ZQotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCi0KLQlwdWJsaWMgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIGFEaXJlY3RvcnlVcmkpIHsKLQkJc3VwZXIoYURpcmVjdG9yeVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBhRmlsZSwgamF2YS51dGlsLkxpc3QgYUxpc3QpIHsKLQkJYWRkRmlsZXMoYUZpbGUsIGFMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKLQl9Ci0KLQotCi0JcHVibGljIExvb3NlQXJjaGl2ZSBnZXRMb29zZUFyY2hpdmUoKSB7Ci0JCWlmIChsb29zZUFyY2hpdmUgPT0gbnVsbCAmJiBnZXRDb250YWluZXIoKS5pc0VBUkZpbGUoKSkgewotCQkJU3RyaW5nIG9zU3RyaW5nID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCkpOwotCQkJc2V0TG9vc2VBcmNoaXZlKExvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZmluZExvb3NlQXBwbGljYXRpb24ob3NTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbG9vc2VBcmNoaXZlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIzOTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHJlYWQgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYW5kIHRyZWF0IHRoZW0gYXMgZmlsZQotICogZW50cmllcyBpbiBhbiBhcmNoaXZlCi0gKiAKLSAqIEBzZWUgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgaW1wbGVtZW50cyBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5IHsKLQkvKioKLQkgKiBUaGUgcm9vdCB1cmkgZnJvbSB3aGljaCBhbGwgcmVsYXRpdmUgZmlsZXMgZW50cmllcyBhcmUgbG9hZGVkOyBtdXN0IHBvaW50IHRvIGEgdmFsaWQgbG9jYWwKLQkgKiBkaXJlY3RvcnkKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBJU19BSVggPSAiQUlYIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeVVyaTsKLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IHRoZSBkaXJlY3RvcnkgdXJpIHdpdGggdGhlIHN5c3RlbSBkZXBlbmRlbnQgZmlsZSBzZXBhcmF0b3IgcmVwbGFjZWQgYnkgYQotCSAqIGZvcndhcmQgc2xhc2gKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCXByb3RlY3RlZCBzdGF0aWMgY2hhciBTRVBBUkFUT1JfQ0hBUiA9IGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCi0JcHVibGljIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIGFEaXJlY3RvcnlVcmkpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlyZWN0b3J5VXJpKGFEaXJlY3RvcnlVcmkpOwotCQlTdHJpbmcgbm9ybWFsaXplZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlub3JtYWxpemVkID0gbmV3IEZpbGUoYURpcmVjdG9yeVVyaSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCW5vcm1hbGl6ZWQgPSBhRGlyZWN0b3J5VXJpOwotCQl9Ci0JCXNldERpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKG5vcm1hbGl6ZWQucmVwbGFjZShTRVBBUkFUT1JfQ0hBUiwgJy8nKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGREaXJlY3RvcnkoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZpbGUoamF2YS5pby5GaWxlIGFGaWxlLCBMaXN0IGFMaXN0KSB7Ci0KLQkJU3RyaW5nIHVyaSA9IGdldFVSSUZyb20oYUZpbGUpOwotCQlpZiAoY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMuY29udGFpbnNLZXkodXJpKSkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGNGaWxlID0gY3JlYXRlRmlsZSh1cmkpOwotCQljRmlsZS5zZXRTaXplKGFGaWxlLmxlbmd0aCgpKTsKLQkJY0ZpbGUuc2V0TGFzdE1vZGlmaWVkKGFGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJYUxpc3QuYWRkKGNGaWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlcyhqYXZhLmlvLkZpbGUgYURpcmVjdG9yeSwgTGlzdCBhTGlzdCkgewotCi0JCVN0cmluZ1tdIGZpbGVOYW1lcyA9IGFEaXJlY3RvcnkubGlzdCgpOwotCQlpZiAoZmlsZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoYURpcmVjdG9yeS5nZXRQYXRoKCksIGZpbGVOYW1lc1tpXSwgU0VQQVJBVE9SX0NIQVIpOwotCQkJaWYgKGZpbGVOYW1lc1tpXSA9PSBudWxsIHx8IChJU19BSVggJiYgIi5iYWNrdXAiLmVxdWFscyhmaWxlTmFtZXNbaV0pKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSk7Ci0JCQlpZiAoIWFGaWxlLmV4aXN0cygpKQotCQkJCWNvbnRpbnVlOwotCQkJLy9UaGlzIGNvdWxkIG9jY3VyIG9uIHNvbWUgd2luZG93cyBtYWNoaW5lcywgZWcgQzpccGFnZWZpbGUuc3lzCi0JCQkvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBzY2FubmluZyBkaXJlY3Rvcnkgc3RydWN0dXJlIik7Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSAmJiAhaXNBcmNoaXZlKGdldFVSSUZyb20oYUZpbGUpKSkgewotCQkJCWFkZERpcmVjdG9yeShhRmlsZSwgYUxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlhZGRGaWxlKGFGaWxlLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldEZpbGVOYW1lRnJvbSh1cmkpKS5leGlzdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmlvLkZpbGUgZ2V0RGlyZWN0b3J5Rm9yTGlzdCgpOwotCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5VXJpKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5VXJpOwotCX0KLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5VXJpQXNaaXBTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBPUyBmaWxlbmFtZSBmcm9tIGEgcmVsYXRpdmUgdXJpCi0JICovCi0JLy8gVE9ETyBGaXggdGhlIHR5cGUgY2FzaW5nIGluIHY2LjAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lRnJvbShTdHJpbmcgdXJpKSB7Ci0JCUxvb3NlQXJjaGl2ZSBhTG9vc2VBcmNoaXZlID0gZ2V0TG9vc2VBcmNoaXZlKCk7Ci0JCWlmIChhTG9vc2VBcmNoaXZlICE9IG51bGwpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChhTG9vc2VBcmNoaXZlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT04gOgotCQkJCQlyZXN1bHQgPSBnZXRVUklGcm9tTG9vc2VBcmNoaXZlc0lmQXZhaWxhYmxlKCgoTG9vc2VBcHBsaWNhdGlvbikgYUxvb3NlQXJjaGl2ZSkuZ2V0TG9vc2VBcmNoaXZlcygpLCB1cmkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRSA6Ci0JCQkJCXJlc3VsdCA9IGdldFVSSUZyb21Mb29zZUFyY2hpdmVzSWZBdmFpbGFibGUoKChMb29zZVdBUkZpbGUpIGFMb29zZUFyY2hpdmUpLmdldExvb3NlTGlicygpLCB1cmkpOwotCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSB1cmk7Ci0JCWlmIChTRVBBUkFUT1JfQ0hBUiAhPSAnLycpCi0JCQluYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgU0VQQVJBVE9SX0NIQVIpOwotCQlyZXR1cm4gZ2V0RGlyZWN0b3J5VXJpKCkgKyBTRVBBUkFUT1JfQ0hBUiArIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJRnJvbUxvb3NlQXJjaGl2ZXNJZkF2YWlsYWJsZShMaXN0IGxvb3NlQXJjaGl2ZXMsIFN0cmluZyB1cmkpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb29zZUFyY2hpdmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTG9vc2VBcmNoaXZlIGxvb3NlQXJjaGl2ZUVsZW1lbnQgPSAoTG9vc2VBcmNoaXZlKSBpdGVyLm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKGxvb3NlQXJjaGl2ZUVsZW1lbnQuZ2V0VXJpKCkpKQotCQkJCXJldHVybiBsb29zZUFyY2hpdmVFbGVtZW50LmdldEJpbmFyaWVzUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJamF2YS5pby5GaWxlIGRpcmVjdG9yeSA9IGdldERpcmVjdG9yeUZvckxpc3QoKTsKLQkJYWRkRmlsZXMoZGlyZWN0b3J5LCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcyhTdHJpbmcgc3ViZm9sZGVyUGF0aCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEuaW8uRmlsZSBjb250YWluZXJEaXJlY3RvcnkgPSBnZXREaXJlY3RvcnlGb3JMaXN0KCk7Ci0JCWphdmEuaW8uRmlsZSBzdWJmb2xkZXIgPSBuZXcgamF2YS5pby5GaWxlKGNvbnRhaW5lckRpcmVjdG9yeSwgc3ViZm9sZGVyUGF0aCk7Ci0JCWFkZEZpbGVzKHN1YmZvbGRlciwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlTmFtZUZyb20odXJpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlbGF0aXZlIHVyaSBmcm9tIHRoZSBqYXZhLmlvLkZpbGUsIHRvIGJlIHVzZWQgZm9yIGEgZmlsZSBlbnRyeTsgdGhlIHNlcGFyYXRvciB3aWxsCi0JICogYmUgdGhlIHppcCBzdGFuZGFyZCAoZm9yd2FyZCBzbGFzaCAoIi8iKSkuCi0JICovCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVSSUZyb20oRmlsZSBhRmlsZSkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZWxhdGl2ZSA9IG51bGw7Ci0JCVN0cmluZyByb290ID0gZ2V0RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCW5hbWUgPSBhRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlyZWxhdGl2ZSA9IG1ha2VSZWxhdGl2ZShuYW1lLCByb290KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCQlpZiAocmVsYXRpdmUgPT0gbnVsbCkgewotCQkJbmFtZSA9IGFGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJcmVsYXRpdmUgPSBtYWtlUmVsYXRpdmUobmFtZSwgcm9vdCk7Ci0JCX0KLQkJaWYgKHJlbGF0aXZlID09IG51bGwpIHsKLQkJCW5hbWUgPSBhRmlsZS5nZXRQYXRoKCk7Ci0JCQlyb290ID0gcmVwbGFjZVNlcGFyYXRvcnMoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCQkJcmVsYXRpdmUgPSBtYWtlUmVsYXRpdmUobmFtZSwgcm9vdCk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aXZlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZXBhcmF0b3JzKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKQotCQkJcmV0dXJuIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyByb290KQotCXsKLQkgICAgaWYgKCAoZmlsZU5hbWUgPT0gbnVsbCkgfHwgKHJvb3QgPT0gbnVsbCkgKQotCSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLQkgICAgaW50IG9mZnNldCA9IHJvb3QubGVuZ3RoKCk7Ci0KLQkgICAgd2hpbGUgKCAob2Zmc2V0ID4gMCkgJiYgcm9vdC5jaGFyQXQob2Zmc2V0IC0gMSkgPT0gJy8nICkKLQkgICAgICAgIG9mZnNldC0tOwotCi0JICAgIGlmICggb2Zmc2V0IDwgcm9vdC5sZW5ndGgoKSApIHsKLQkgICAgICAgIG9mZnNldCsrOwotCi0JICAgICAgICBpZiAoIG9mZnNldCA8IHJvb3QubGVuZ3RoKCkgKQotCSAgICAgICAgICAgIHJvb3QgPSByb290LnN1YnN0cmluZygwLCBvZmZzZXQpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgcm9vdCArPSAnLyc7Ci0JICAgIH0KLQotCSAgICBTdHJpbmcgbmFtZSA9IHJlcGxhY2VTZXBhcmF0b3JzKGZpbGVOYW1lKTsKLQotCSAgICBpZiAoIG5hbWUuc3RhcnRzV2l0aChyb290KSApCi0JICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoIHJvb3QubGVuZ3RoKCkgKTsKLQkgICAgZWxzZQotCSAgICAgICAgbmFtZSA9IG51bGw7Ci0KLQkgICAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZyhqYXZhLmlvLkZpbGUgYVN5c3RlbUZpbGUpIHsKLQkJamF2YS5pby5GaWxlIGRpciA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCQlyZXR1cm4gZGlyLmVxdWFscyhhU3lzdGVtRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VXJpKGphdmEubGFuZy5TdHJpbmcgbmV3RGlyZWN0b3J5VXJpKSB7Ci0JCWRpcmVjdG9yeVVyaSA9IG5ld0RpcmVjdG9yeVVyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKSB7Ci0JCWRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nID0gbmV3RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA0ZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHNhdmUgYW4gYXJjaGl2ZXMgY29udGVudHMgdG8gYSBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlOYW1lOwotCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyOwotCS8qKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBhcmNoaXZlcyBzaG91bGQgYmUgZXhwYW5kZWQgKi8KLQlwcm90ZWN0ZWQgaW50IGV4cGFuc2lvbkZsYWdzOwotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoU3RyaW5nIGRpck5hbWUsIGludCBmbGFncykgewotCQlzdXBlcigpOwotCQlzZXREaXJlY3RvcnlOYW1lKGRpck5hbWUpOwotCQlzZXRFeHBhbnNpb25GbGFncyhmbGFncyk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRPU1VyaShnZXREaXJlY3RvcnlOYW1lKCksIGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCXJldHVybiBuZXcgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCh1cmksIGdldEV4cGFuc2lvbkZsYWdzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNob3VsZEV4cGFuZChhbkFyY2hpdmUpKQotCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZERpcmVjdG9yeVN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShhbkFyY2hpdmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFppcFN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoYW5BcmNoaXZlLmdldFVSSSgpKSk7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChvdXQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzE1LzAwIDI6MjY6MzcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGFuc2lvbkZsYWdzKCkgewotCQlyZXR1cm4gZXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIgZ2V0VXJpQ29udmVydGVyKCkgewotCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCUFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsIGNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChnZXRBcmNoaXZlKCksIGdldERpcmVjdG9yeU5hbWUoKSk7Ci0JCWNvbnZlcnRlci5zZXRPdXRwdXRGaWxlcGF0aChnZXREaXJlY3RvcnlOYW1lKCkpOwotCQlzZXRVcmlDb252ZXJ0ZXIoY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhTdHJpbmcgZGlyZWN0b3J5UGF0aCkgewotCQlGaWxlIGFEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXREaXJlY3RvcnlOYW1lKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBkaXJlY3RvcnlQYXRoKTsKLQkJYURpcmVjdG9yeS5ta2RpcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCQlpZiAoZ2V0QXJjaGl2ZSgpLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkpCi0JCQkJc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSwgaW94KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgZW50cnlOYW1lID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpCi0JCQlta2RpcnMoZW50cnlOYW1lKTsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShlbnRyeU5hbWUpKTsKLQkJCQlBcmNoaXZlVXRpbC5jb3B5KGluLCBvdXQpOwotCQkJCXNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKGFGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgaW94KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG9zKTsKLQkJb3MuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdEaXJlY3RvcnlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeU5hbWUpIHsKLQkJZGlyZWN0b3J5TmFtZSA9IG5ld0RpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cGFuc2lvbkZsYWdzCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbnNpb25GbGFncyhpbnQgbmV3RXhwYW5zaW9uRmxhZ3MpIHsKLQkJZXhwYW5zaW9uRmxhZ3MgPSBuZXdFeHBhbnNpb25GbGFnczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGFGaWxlKSB7Ci0JCWxvbmcgbGFzdE1vZCA9IGFGaWxlLmdldExhc3RNb2RpZmllZCgpOwotCQlpZiAobGFzdE1vZCA9PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgYWJzUGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGdldERpcmVjdG9yeU5hbWUoKSwgYUZpbGUuZ2V0VVJJKCkpOwotCQlGaWxlIGlvRmlsZSA9IG5ldyBGaWxlKGFic1BhdGgpOwotCQlpb0ZpbGUuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKFN0cmluZyB1cmkpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhRmlsZSA9IGdldEFyY2hpdmUoKS5nZXRGaWxlKHVyaSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBtdXN0QmVBTmV3RW50cnkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDgvMDAgNDo1MDozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VXJpQ29udmVydGVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpQ29udmVydGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIgbmV3VXJpQ29udmVydGVyKSB7Ci0JCXVyaUNvbnZlcnRlciA9IG5ld1VyaUNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFeHBhbmQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQotCQlpbnQgZmxhZyA9IDA7Ci0KLQkJaWYgKGFuQXJjaGl2ZS5pc1dBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9FQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9SQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VKQkphckZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9FSkJKQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0FQUENMSUVOVF9GSUxFUzsKLQkJZWxzZQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0FSQ0hJVkVTOwotCi0JCXJldHVybiAoZ2V0RXhwYW5zaW9uRmxhZ3MoKSAmIGZsYWcpICE9IDA7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJdGVyYXRlT3ZlcihBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSXRlcmF0ZU92ZXIoYW5BcmNoaXZlKSB8fCBzaG91bGRFeHBhbmQoYW5BcmNoaXZlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMmQxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4yIEFwcGxpY2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFYXIxMkV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEV4cG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogRWFyMTJFeHBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFYXIxMkV4cG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZDU2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkVBUl9GaWxlLCBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7IC8vID0gIkVBUiBGaWxlIgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBFYXIxMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gKEVBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb24gYXBwbCA9IG51bGw7Ci0KLQkJYXBwbCA9IChBcHBsaWNhdGlvbikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCWdldEVBUkZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcihhcHBsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NDRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4xIEVqYiBKYXIKLSAqLwotcHVibGljIGNsYXNzIEVqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBFamJKYXIxMUV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGEyNmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gaW1wb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjEgRWpiIEphcgotICovCi1wdWJsaWMgY2xhc3MgRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRUpCX0phcl9GaWxlLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOyAvLyA9ICJFSkIgSmFyIEZpbGUiCi0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBFamJKYXIxMUltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBnZXRFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gKEVKQkphckZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUpCSmFyIGVqYkphciA9IG51bGw7Ci0KLQkJZWpiSmFyID0gKEVKQkphcikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlnZXRFSkJKYXJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoZWpiSmFyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0V4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDg3NWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0V4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRlciBvZmYgd2hpY2ggb3RoZXIgZXhwb3J0IHN0cmF0ZWdpZXMgY2FuIHN1YmNsYXNzCi0gKiAKLSAqIEBzZWUgRXhwb3J0U3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBFeHBvcnRTdHJhdGVneSB7Ci0JLyoqIFRoZSBsaXN0IG9mIGZpbGVzIGFscmVhZHkgc2F2ZWQgYnkgdGhpcyBzdHJhdGVneSBkdXJpbmcgaW52b2thdGlvbiBvZiBwcmVTYXZlKCkgKi8KLQlwcm90ZWN0ZWQgU2V0IHNhdmVkRmlsZXM7Ci0KLQlwdWJsaWMgRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFNhdmVkRmlsZXMoKSB7Ci0JCWlmIChzYXZlZEZpbGVzID09IG51bGwpCi0JCQlzYXZlZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIHNhdmVkRmlsZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU2F2ZWQoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gc2F2ZWRGaWxlcyAhPSBudWxsICYmIGdldFNhdmVkRmlsZXMoKS5jb250YWlucyh1cmkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmc7IHN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGU7IHR5cGljYWwgb3BlcmF0aW9ucyB3b3VsZCBiZSB0bwotCSAqIGFkZCBleHRyYSBlbGVtZW50cyB0byB0aGUgb3V0Z29pbmcgYXJjaGl2ZSwgdXNpbmcgU2F2ZVN0cmF0ZWd5I3NhdmUoRmlsZSwKLQkgKiBqYXZhLmlvLklucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZmlsZSB3aXRoIHRoZSBnaXZlbiB1cmkgaGFzIGp1c3QgYmVlbiBzYXZlZDsgYWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2Ygc2F2ZWQgZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlZChTdHJpbmcgdXJpKSB7Ci0JCWdldFNhdmVkRmlsZXMoKS5hZGQodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTYXZlZEZpbGVzKGphdmEudXRpbC5TZXQgbmV3U2F2ZWRGaWxlcykgewotCQlzYXZlZEZpbGVzID0gbmV3U2F2ZWRGaWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkODVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLS8qKgotICogSW1wb3J0U3RyYXRlZ3kga25vd3MgaG93IHRvIGludGVycHJldCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gYXJjaGl2ZSwgdXN1YWxseSBpbiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9ycywgdG8gYnVpbGQgdXAgYSBtb2RlbCBvZiB0aGUgY29udGFpbmVkIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0U3RyYXRlZ3kgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3kgewotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdXNlZCBmb3IgY29weWluZyBhcmNoaXZlczsgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMga2luZCBvZiBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKTsKLQotCS8qKgotCSAqIERvIHdoYXRldmVyIGlzIG5lY2Vzc2FyeSB0byBicmluZyBpbiBtZXRhZGF0YSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBzZXQgdGhlIGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9ycyB0byB0aGUgc3RhbmRhcmQgZm9ybSB0aGF0IHRoZSBhcGlzIGNhbiByZWNvZ25pemUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQjEwKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQ2MTczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotCi0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2ZmIHdoaWNoIG90aGVyIGltcG9ydCBzdHJhdGVnaWVzIGNhbiBzdWJjbGFzcwotICogCi0gKiBAc2VlIEltcG9ydFN0cmF0ZWd5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgSW1wb3J0U3RyYXRlZ3kgewotCS8qKgotCSAqIEFyY2hpdmVJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQjEwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NzI5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBMb2FkU3RyYXRlZ3kga25vd3MgaG93IHRvIGxvYWQgb3IgcmVhZCB0aGUgY29udGVudHMgb2YgYSBjb250YWluZXIuIFRoaXMgcHJvdmlkZXMgYSBkZWxlZ2F0aW9uCi0gKiBtb2RlbCBmb3IgcmVhZGluZyBpbiB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBmaWxlLiBDbGllbnRzIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZAotICogInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuIGFyY2hpdmUuIEV4YW1wbGVzIG1pZ2h0IGluY2x1ZGUgcmVhZGluZyBmcm9tIGEgemlwIGZpbGUsIGZyb20gYW4KLSAqIGlucHV0IHN0cmVhbSwgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIG9yIGZyb20gYSB3b3JrYmVuY2guCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9hZFN0cmF0ZWd5IHsKLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpOwotCi0JLyoqCi0JICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQgYnkgdGhpcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyBzdHJhdGVneSwgaWYgaXQgZXhpc3RzOyBjYXNlcyB3aGVyZSBpdCBtaWdodCBub3QgZXhpc3QgaXMgaWYKLQkgKiB0aGUgbG9hZCBzdHJhdGVneSBpcyAidmlydHVhbCIsIGUuZy4sIGEgamFyIHdpdGhpbiBhIGphcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIG1ldGEgcmVzb3VyY2VzIGdldCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcHJvcGVydGllcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOwotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgcHJpbUdldFJlc291cmNlU2V0KCk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgYnkgYW4gYXJjaGl2ZSB0byBvYnRhaW4gYSBsaXN0IG9mIGl0J3MgZmlsZXMsIHdoaWNoIGlzIHVzdWFsbHkgZGVmZXJyZWQgdW50aWwgdGhlIGZpcnN0Ci0JICogdGltZSBpdCBpcyBpbnZva2VkLCBhcyBhbiBvcHRpbWl6YXRpb24uCi0JICovCi0JcHVibGljIExpc3QgY29sbGVjdEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBvbiBhbiBlbnRyeSBuYW1lZCBieSB0aGUgcGFyYW1ldGVyCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gYW4gZW50cnkgbmFtZWQgYnkgdGhlIHBhcmFtZXRlciwgZnJvbSB0aGUgInJlc291cmNlcyBwYXRoIiBvZiB0aGUKLQkgKiBsb29zZSBhcmNoaXZlIGlmIGl0IGV4aXN0cywgT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBzYW1lIGFzCi0JICoge0BsaW5rICNnZXRJbnB1dFN0cmVhbShTdHJpbmcpfQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpOwotCi0JcHVibGljIFJlc291cmNlIGdldEV4aXN0aW5nTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQW4gYXJjaGl2ZSB1c2VzIGEgY3VzdG9tIGNsYXNzIGxvYWRlciBmb3IgamF2YSByZWZsZWN0aW9uIHdpdGhpbiBhIG1vZiByZXNvdXJjZVNldDsKLQkgKiBpbXBsZW1lbnRlcnMgb2YgTG9hZFN0cmF0ZWd5IG1heSBzdXBwbHkgYSBtb2YgcmVzb3VyY2VTZXQgZm9yIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIGlzIG5vdAotCSAqIG5lY2Vzc2FyeSwgb3IgY291bGQgZXZlbiBjYXVzZSBicmVha2FnZTsgdGhpcyB0ZXN0IGdpdmVzIHRoZSBzdHJhdGVneSB0aGUgY2hhbmNlIHRvICJvcHQgb3V0IgotCSAqIG9mIHRoZSBjbGFzcyBsb2FkaW5nIGdhbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzTG9hZGVyTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhcmNoaXZlIGlzIHJlYWRpbmcgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNNb2ZSZXNvdXJjZUxvYWRlZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciByZXNvdXJjZXMgY2FuIGJlIHJlYWQgYnkgdGhpcyBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JLyoqCi0JICogSXMgdGhlIHBhcmFtZXRlciBpbiB1c2UgYnkgdGhpcyBzdHJhdGVneT8gTmVlZGVkIGZvciB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkIHRvIHRoZSBzYW1lCi0JICogbG9jYXRpb24gZnJvbSB3aGljaCBpdCB3YXMgcmVhZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKTsKLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbnMsIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBoYXZlIG5vdCBiZWVuIGNoYW5nZWQ7IGluc3RlYWQgb2YKLQkgKiBpdGVyYXRpbmcgZWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlLCB3ZSBtYXkgYmUgYWJsZSB0byBidWxrIHNhdmUgdGhlIHdob2xlIHRoaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWlyZXNJdGVyYXRpb25PblNhdmUoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KTsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgYUNvbnRhaW5lcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpOwotCi0JcHVibGljIExvb3NlQXJjaGl2ZSBnZXRMb29zZUFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldExvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgYUxvb3NlQXJjaGl2ZSk7Ci0JCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKFN0cmluZyBzdWJmb2xkZXJQYXRoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KTsKLQotCXB1YmxpYyBpbnQgZ2V0UmVuZGVyZXJUeXBlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoaW50IGkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjE5ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotLyoqCi0gKiBBYnN0YWN0IGltcGxlbWVudGVyIG9mZiB3aGljaCBhbmQgbG9hZCBzdHJhdGVneSBtYXkgc3ViY2xhc3MKLSAqIAotICogQHNlZSBMb2FkU3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIExvYWRTdHJhdGVneSB7Ci0KLQkvKiogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHVuZGVybHlpbmcgcmVzb3VyY2VzIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wZW4gPSB0cnVlOwotCi0JLyoqIFRoZSBhcmNoaXZlIG9yIGRpcmVjdG9yeSB0byB3aGljaCB0aGlzIHN0cmF0ZWd5IGJlbG9uZ3MgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCS8qKiBSZXNvdXJjZVNldCB1c2VkIGZvciBtb2YveG1pIHJlc291cmNlcyAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByb3RlY3RlZCBMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlOwotCi0JcHJvdGVjdGVkIE1hcCBjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0KLQlwcml2YXRlIGludCByZW5kZXJlclR5cGU7Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJUmVzb3VyY2UgZXhpc3RpbmdSZXNvdXJjZSA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoYVJlc291cmNlLmdldFVSSSgpLCBmYWxzZSk7Ci0JCWlmIChleGlzdGluZ1Jlc291cmNlICE9IG51bGwpCi0JCQlnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShleGlzdGluZ1Jlc291cmNlKTsKLQkJZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNb2RpZmljYXRpb25UcmFja2luZyhSZXNvdXJjZSByZXMpIHsKLQkJYm9vbGVhbiB0cmFja2luZ01vZHMgPSByZXMuaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQlib29sZWFuIGlzUmVhZE9ubHkgPSAoY29udGFpbmVyICE9IG51bGwpID8gKChBcmNoaXZlKSBjb250YWluZXIpLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkgOiBmYWxzZTsKLQkJYm9vbGVhbiBzaG91bGRUcmFja01vZHMgPSAhKGlzUmVhZE9ubHkgfHwgQXJjaGl2ZVV0aWwuaXNKYXZhUmVzb3VyY2UocmVzKSB8fCBBcmNoaXZlVXRpbC5pc1JlZ2lzdGVyZWRVUklNYXBwaW5nKHJlcykpOwotCQlpZiAoc2hvdWxkVHJhY2tNb2RzICYmICF0cmFja2luZ01vZHMpCi0JCQlyZXMuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQgYnkgdGhpcyBvYmplY3QgYW5kIHNldCB0aGUgc3RhdGUgdG8gY2xvc2VkLiBTdWJjbGFzc2VzCi0JICogc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzZXRJc09wZW4oZmFsc2UpOwotICAgICAgICBpZihyZXNvdXJjZVNldCAhPSBudWxsICYmIHJlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotICAgICAgICAJcmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQHNlZSBMb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmIChjb250YWluc1VzaW5nTG9vc2VBcmNoaXZlKHVyaSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHByaW1Db250YWlucyh1cmkpOwotCX0KLQotCS8qCi0JICogVHJ5IHRoZSByZXNvdXJjZXMgcGF0aCBmaXJzdDsgaWYgdGhhdCBmYWxzZSwgc2VlIGlmIHdlIGhhdmUgYSBjaGlsZCBsb29zZSBhcmNoaXZlIHdpdGggdGhlCi0JICogdXJpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNVc2luZ0xvb3NlQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxvb3NlQXJjaGl2ZSBsb29zZSA9IGdldExvb3NlQXJjaGl2ZSgpOwotCQlpZiAobG9vc2UuZ2V0UmVzb3VyY2VzUGF0aCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShsb29zZS5nZXRSZXNvdXJjZXNQYXRoKCksIHVyaSk7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmZpbmRGaXJzdExvb3NlQ2hpbGQodXJpLCBsb29zZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjcmVhdGVEaXJlY3RvcnkoU3RyaW5nIHVyaSl7Ci0JCUZpbGUgYUZpbGUgPSBudWxsOwotCQlhRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRmlsZSgpOwotCQlhRmlsZS5zZXREaXJlY3RvcnlFbnRyeSh0cnVlKTsKLQkJYUZpbGUuc2V0VVJJKHVyaSk7Ci0JCWFGaWxlLnNldE9yaWdpbmFsVVJJKHVyaSk7Ci0JCWFGaWxlLnNldExvYWRpbmdDb250YWluZXIoZ2V0Q29udGFpbmVyKCkpOwotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHVyaSkgewotCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJaWYgKGlzQXJjaGl2ZSh1cmkpKQotCQkJYUZpbGUgPSBvcGVuTmVzdGVkQXJjaGl2ZSh1cmkpOwotCQlpZiAoYUZpbGUgPT0gbnVsbCkgewotCQkJYUZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUZpbGUoKTsKLQkJCWFGaWxlLnNldFVSSSh1cmkpOwotCQkJYUZpbGUuc2V0T3JpZ2luYWxVUkkodXJpKTsKLQkJfQotCQlhRmlsZS5zZXRMb2FkaW5nQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQkJcmV0dXJuIGFGaWxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWlmKGlzT3Blbil7Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfKTsgLy8gPSAiQWJzb2x1dGUgcGF0aCB1bmtub3duIgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCA/IGdldEFic29sdXRlUGF0aCgpIDogZ2V0TG9vc2VBcmNoaXZlKCkuZ2V0UmVzb3VyY2VzUGF0aCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJpbUdldFJlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiBnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsID8gbnVsbCA6IGdldExvb3NlQXJjaGl2ZSgpLmdldFJlc291cmNlc1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJpbmFyaWVzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCA/IGdldEFic29sdXRlUGF0aCgpIDogZ2V0TG9vc2VBcmNoaXZlKCkuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldCBwcmltR2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBTaG91bGQgd2UgaXRlcmF0ZSBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFzIHBhcnQgb2Ygc2F2aW5nLCBvciBjYW4gd2UgdHJlYXQgdGhlIGFyY2hpdmUKLQkgKiBhcyBvbmUgYmlnIGZpbGUgZHVyaW5nIHNhdmU/IFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHksIGl0ZXJhdGluZyB0aGUgZmlsZXMgaWY6IDEpIElmIHRoZQotCSAqIGFyY2hpdmUgaXMgYSBtb2R1bGUgZmlsZSBhbmQgaXQgaXMgTk9UIHJlYWQtb25seSAyKSBJZiB0aGUgbG9hZCBzdHJhdGVneSBpcyBhIGRpcmVjdG9yeSAzKSBJZgotCSAqIHRoZSBhcmNoaXZlIGlzIGEgdXRpbGl0eSBKQVIsIGFuZCB0aGUgZmlsZXMgbGlzdCBoYXMgbmV2ZXIgYmVlbiBpbml0aWFsaXplZCwgb3IgaWYgdGhlCi0JICogbG9hZGluZyBjb250YWluZXJzIGZvciBhbGwgdGhlIGZpbGVzIGFyZSB0aGUgc2FtZSBBTkQgbm90IGRpcmVjdG9yaWVzLCBBTkQgdGhlCi0JICoge0BsaW5rIEFyY2hpdmVPcHRpb25zI2lzU2F2ZUxpYnJhcmllc0FzRmlsZXMoKX1vZiB0aGUgYXJjaGl2ZSBpcyB0cnVlLgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kjcmVxdWlyZXNJdGVyYXRpb25PblNhdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVpcmVzSXRlcmF0aW9uT25TYXZlKCkgewotCQlpZiAoIWdldENvbnRhaW5lcigpLmlzQXJjaGl2ZSgpIHx8IGlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSAoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCk7Ci0JCS8vV2Ugc2hvdWxkIGxlYXZlIHV0aWxpdHkgSkFScyBpbnRhY3QsIHVubGVzcyB3ZXJlIHRvbGQgbm90IHRvCi0JCS8vVGhlIG1hbmlmZXN0IG1heSBoYXZlIGJlZW4gc2lnbmVkCi0JCWlmIChhbkFyY2hpdmUuaXNNb2R1bGVGaWxlKCkpCi0JCQlyZXR1cm4gIWFuQXJjaGl2ZS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpOwotCQllbHNlIGlmIChhbkFyY2hpdmUuZ2V0T3B0aW9ucygpLmlzU2F2ZUxpYnJhcmllc0FzRmlsZXMoKSAmJiBhbkFyY2hpdmUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWlmIChhbkFyY2hpdmUuaXNJbmRleGVkKCkpIHsKLQkJCQlMaXN0IGZpbGVzID0gYW5BcmNoaXZlLmdldEZpbGVzKCk7Ci0JCQkJRmlsZSBhRmlsZSA9IG51bGw7Ci0JCQkJQ29udGFpbmVyIGZpcnN0Q29udGFpbmVyID0gbnVsbDsKLQkJCQlDb250YWluZXIgbENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJCQlhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQkJCWlmIChpID09IDApIHsKLQkJCQkJCWZpcnN0Q29udGFpbmVyID0gYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCQkJaWYgKGZpcnN0Q29udGFpbmVyLmdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJbENvbnRhaW5lciA9IGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQkJaWYgKGxDb250YWluZXIgIT0gZmlyc3RDb250YWluZXIpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJdXBkYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmcoKFJlc291cmNlKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQl1cGRhdGVNb2RpZmljYXRpb25UcmFja2luZygoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseTsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbAotCSAqLwotCXB1YmxpYyBGaWxlSXRlcmF0b3IgZ2V0RmlsZUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlSXRlcmF0b3JJbXBsKGdldENvbnRhaW5lcigpLmdldEZpbGVzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRGaWxlcygpOwotCi0JcHVibGljIExpc3QgY29sbGVjdEZpbGVzKCkgewotCQkvL1RoZSBsb29zZSBhcmNoaXZlcyBuZWVkIHRvIGJlIHJlYWQgZmlyc3QKLQkJY29sbGVjdEZpbGVzRnJvbUxvb3NlQXJjaGl2ZXMoKTsKLQkJTGlzdCBmaWxlcyA9IGdldEZpbGVzKCk7Ci0JCWZpbGVzLmFkZEFsbChjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy52YWx1ZXMoKSk7Ci0JCWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEZpbGVzRnJvbUxvb3NlQXJjaGl2ZXMoKSB7Ci0JCWlmICghY2FuSGF2ZUxvb3NlQ2hpbGRyZW4oKSB8fCBnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsKSB7Ci0JCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IExvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZ2V0TG9vc2VDaGlsZHJlbihnZXRMb29zZUFyY2hpdmUoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTG9vc2VBcmNoaXZlIGxvb3NlID0gKExvb3NlQXJjaGl2ZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJU3RyaW5nIHVyaSA9IGxvb3NlLmdldFVyaSgpOwotCQkJaWYgKCFjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy5jb250YWluc0tleSh1cmkpKSB7Ci0JCQkJQXJjaGl2ZSBhcmNoaXZlID0gb3Blbk5lc3RlZEFyY2hpdmUobG9vc2UpOwotCQkJCWlmIChhcmNoaXZlICE9IG51bGwpIHsKLQkJCQkJY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMucHV0KHVyaSwgYXJjaGl2ZSk7Ci0JCQkJCWFyY2hpdmUuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgcmV0dXJucyBhbiBpbW11dGFibGUgY29sbGVjdGlvbiBvZiB0aGUgbG9hZGVkCi0JICogICAgICByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGNvcHlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvcHlSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlcyk7Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoY29weVJlc291cmNlcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyID0gY29weVJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzLmlzTG9hZGVkKCkpCi0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd3JhcEV4KSB7Ci0JCQlpZiAoKEV4dGVuZGVkRWNvcmVVdGlsLmdldEZpbGVOb3RGb3VuZERldGVjdG9yKCkuaXNGaWxlTm90Rm91bmQod3JhcEV4KSkpIHsKLQkJCQlGaWxlTm90Rm91bmRFeGNlcHRpb24gZmlsZU5vdEZvdW5kRXggPSBFeHRlbmRlZEVjb3JlVXRpbC5nZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbih3cmFwRXgpOwotCQkJCXRocm93IGZpbGVOb3RGb3VuZEV4OwotCQkJfQotCQkJdGhyb3dSZXNvdXJjZUxvYWRFeGNlcHRpb24odXJpLCB3cmFwRXgpOwotCQkJcmV0dXJuIG51bGw7IC8vbmV2ZXIgaGFwcGVucyAtIGNvbXBpbGVyIGV4cGVjdHMgaXQgdGhvdWdoCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoKSB7Ci0JCS8vTm90IHRoZSBiZXN0IGRlc2lnbiBoZXJlLCBiZWNhdXNlIGEgbG9hZCBzdHJhdGVneSBzaG91bGQgb25seSBrbm93Ci0JCS8vIGFib3V0Ci0JCS8vY29udGFpbmVyOyBob3dldmVyLCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgZ2V0IGNhbGxlZCB3aGVuIHRoZQotCQkvLyBjb250YWluZXIKLQkJLy9pcyBhbiBhcmNoaXZlCi0JCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKSBnZXRDb250YWluZXIoKTsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChhcmNoaXZlLCBwcmltR2V0UmVzb3VyY2VzUGF0aCgpKTsKLQkJUmVzb3VyY2VTZXQgcnMgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcmVnID0gY3JlYXRlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcnMuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnKTsKLQkJc2V0UmVzb3VyY2VTZXQocnMpOwotCQlycy5zZXRVUklDb252ZXJ0ZXIoY29udmVydGVyKTsKLQkJaWYgKGFyY2hpdmUuc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKSkgewotCQkJcnMuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCi0JCQkvLyBURkI6IFByb2JsZW0gaGVyZToKLQkJCS8vICdBcmNoaXZlLmluaXRpYWxpemVDbGFzc0xvYWRlcicgY2FsbHMKLQkJCS8vICdBcmNoaXZlLmdldEphdmFBZGFwdGVyRmFjdG9yeScsIHdoaWNoCi0JCQkvLyAnQXJjaGl2ZS5nZXRSZXNvdXJjZVNldCcsIHdoaWNoIGNhbGxzCi0JCQkvLyAnTG9hZFN0cmF0ZWd5LmluaXRpYWxpemVSZXNvdXJjZVNldCcsIHdoaWNoIGNhbGxzCi0JCQkvLyAnQXJjaGl2ZS5pbml0aWFsaXplQ2xhc3NMb2FkZXInIGFsbCBvdmVyIGFnYWluLgotCQkJLy8KLQkJCS8vIFRoaXMgY3JlYXRlcyBhIHNlY29uZCwgcmVkdW5kYW50IGNsYXNzbG9hZGVyLAotCQkJLy8gYW5kIHBsYWNlcyB0aGUgZmlyc3QgY2xhc3Nsb2FkZXIgaW4gdGhlIEphdmFKREtBZGFwdGVyRmFjdG9yeS4KLQkJCS8vIEhlbmNlIG5vdCBvbmx5IGlzIHRoZSBjbGFzc2xvYWRlciBjcmVhdGVkIHR3aWNlLCBidXQKLQkJCS8vIGJvdGggY29waWVzIGFyZSBhY3RpdmUuICBXaGVuIHRoZXJlIGFyZSBsYXJnZSBjbGFzc3BhdGhzLAotCQkJLy8gdGhpcyB3aWxsIGxhcmdlIGR1cGxpY2F0ZSBzdHJ1Y3R1cmVzLgotCQkJLy8KLQkJCS8vIFNpbmNlIHRoZSBjbGFzc2xvYWRlciB3aWxsIGJlIGluaXRpYWxpemVkIGJ5ICdnZXRDbGFzc0xvYWRlcicsCi0JCQkvLyB0aGUgaW5pdGlhbGl6YXRpb24sIGhlcmUsIHNlZW1zIHVubmVjZXNzYXJ5LgotCQkJCi0JCQkvLyBhcmNoaXZlLmluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgY3JlYXRlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gbmV3IEoyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5KCk7Ci0KLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0JCXN3aXRjaCAoZ2V0UmVuZGVyZXJUeXBlKCkpIHsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuU0FYIDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBcmNoaXZlT3B0aW9ucy5ET00gOgotCQkJCXJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBcmNoaXZlT3B0aW9ucy5ERUZBVUxUIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRSZW5kZXJlclR5cGUoKSB7Ci0JCXJldHVybiByZW5kZXJlclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcmNoaXZlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmlzTmVzdGVkQXJjaGl2ZSh1cmkpOwotCX0KLQotCS8qKgotCSAqIEFuIGFyY2hpdmUgdXNlcyBhIGN1c3RvbSBjbGFzcyBsb2FkZXIgZm9yIGphdmEgcmVmbGVjdGlvbiB3aXRoaW4gYSBtb2YgcmVzb3VyY2VTZXQ7Ci0JICogaW1wbGVtZW50ZXJzIG9mIExvYWRTdHJhdGVneSBtYXkgc3VwcGx5IGEgbW9mIHJlc291cmNlU2V0IGZvciB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciBpcyBub3QKLQkgKiBuZWNlc3NhcnksIG9yIGNvdWxkIGV2ZW4gY2F1c2UgYnJlYWthZ2U7IHRoaXMgdGVzdCBnaXZlcyB0aGUgc3RyYXRlZ3kgdGhlIGNoYW5jZSB0byAib3B0IG91dCIKLQkgKiBvZiB0aGUgY2xhc3MgbG9hZGluZyBnYW1lCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc0xvYWRlck5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSBUaGUgZGVmYXVsdCBpcyBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSNnZXRFeGlzdGluZ01vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gaXNPcGVuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kgcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JICogICAgICBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBleHRlbnQpIHsKLQkJUmVzb3VyY2UgZXhpc3RpbmcgPSBnZXRFeGlzdGluZ01vZlJlc291cmNlKHVyaSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKQotCQkJcmV0dXJuIGV4aXN0aW5nOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyB1cmkpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLm9wZW5OZXN0ZWRBcmNoaXZlKHVyaSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCS8vQ2F1Z2h0IGFuIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlKTsKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJLy9DYXVnaHQgYW4gZXhjZXB0aW9uIHRyeWluZyB0byBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgbmV3Q29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgbmV3UmVzb3VyY2VTZXQpIHsKLQkJLy8gZml4ZXMgcHJvYmxlbSBpbiByZW9wZW4KLQkJaWYgKHJlc291cmNlU2V0ICE9IG5ld1Jlc291cmNlU2V0KSB7Ci0KLQkJCS8vIHJlbW92ZSBhZGFwdGVyIGZyb20gb2xkIHJlc291cmNlIHNldAotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpCi0JCQkJcmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCi0JCQkvLyBhZGQgYXMgYWRhcHRlciB0byBuZXcgcmVzb3VyY2Ugc2V0IGlmIG5lY2Vzc2FyeQotCQkJaWYgKG5ld1Jlc291cmNlU2V0ICE9IG51bGwgJiYgIW5ld1Jlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJCW5ld1Jlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQotCQkJcmVzb3VyY2VTZXQgPSBuZXdSZXNvdXJjZVNldDsKLQkJfSAvLyBubyBuZWVkIHRvIHVwZGF0ZSBpZiBvbGQgc2V0IGVxdWFscyBuZXcgc2V0IChieSByZWZlcmVuY2UpCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNPcGVuKGJvb2xlYW4gbmV3SXNPcGVuKSB7Ci0JCWlzT3BlbiA9IG5ld0lzT3BlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd1Jlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcmVzb3VyY2VVcmksIEV4Y2VwdGlvbiBleCkgdGhyb3dzIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5sb2FkX3Jlc291cmNlX0VYQ18sIChuZXcgT2JqZWN0W117cmVzb3VyY2VVcmksIGdldENvbnRhaW5lcigpLmdldFVSSSgpfSkpLCBleCk7IC8vID0gIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9vc2VBcmNoaXZlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMb29zZUFyY2hpdmUgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlyZXR1cm4gbG9vc2VBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvb3NlQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9vc2VBcmNoaXZlCi0JICogICAgICAgICAgICBUaGUgbG9vc2VBcmNoaXZlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlKSB7Ci0JCXRoaXMubG9vc2VBcmNoaXZlID0gbG9vc2VBcmNoaXZlOwotCQljaGVja0xvb3NlUGF0aHNWYWxpZCgpOwotCX0KLQotCS8qCi0JICogQWRkZWQgdG8gc3VwcG9ydCBXQVMgcnVudGltZTsgdGhyb3cgYW4gQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBwYXRocyBpbiB0aGUKLQkgKiBsb29zZSBjb25maWcgZG9lcyBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrTG9vc2VQYXRoc1ZhbGlkKCkgewotCQlpZiAobG9vc2VBcmNoaXZlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHBhdGggPSBsb29zZUFyY2hpdmUuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWphdmEuaW8uRmlsZSBpb0ZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpOwotCQkJaWYgKCFpb0ZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGJpbmFyaWVzIHBhdGg6ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXBhdGggPSBsb29zZUFyY2hpdmUuZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlqYXZhLmlvLkZpbGUgaW9GaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTsKLQkJCWlmICghaW9GaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZXMgcGF0aDogIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYXZlTG9vc2VDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lci5pc0VBUkZpbGUoKSB8fCBjb250YWluZXIuaXNXQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5kZXJlclR5cGUKLQkgKiAgICAgICAgICAgIFRoZSByZW5kZXJlclR5cGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZShpbnQgcmVuZGVyZXJUeXBlKSB7Ci0JCXRoaXMucmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOwotCX0KLQkKLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoU3RyaW5nIHN1YmZvbGRlclBhdGgpIHsKLQkJTGlzdCBzdWJzZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlRmlsZXMgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpdGhlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmdldFVSSSgpLnN0YXJ0c1dpdGgoc3ViZm9sZGVyUGF0aCkpCQotCQkJCXN1YnNldC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBzdWJzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjU1YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5OZXN0ZWRKYXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5OZXN0ZWRBcmNoaXZlSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBMb2FkIHN0cmF0ZWd5IHVzZWQgYXMgYSBsYXN0IHJlc29ydCB0byByZWFkIGVudHJpZXMgZnJvbSBqYXJzIGluc2lkZSBvZiBqYXJzLiBJdCBpcyBhIGxhc3QgcmVzb3J0Ci0gKiBiZWNhdXNlIG9mIHRoZSBwb29yIHBlcmZvbWFuY2UgaW52b2x2ZWQsIGFzIHRoZSBjb250ZW50cyBvZiB0aGUgemlwIGVudHJpZXMgYXJlIG5vdCBjYWNoZWQsIGFuZAotICogc2VxdWVudGlhbCBzY2FuIHNlYXJjaGVzIHdpbGwgY2F1c2UgdGhlIHppcCBzdHJlYW0gdG8gYmUgaW5mbGF0ZWQgb24gZWFjaCBzZWFyY2guIFdoZW5ldmVyCi0gKiBwb3NzaWJsZSwKLSAqIAotICogQGxpbmsge1RlbXBGaWxlTG9hZFN0cmF0ZWd5fSBzaG91bGQgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgTG9hZFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogSW5kZXggdG8gaW1wcm92ZSBsb29rdXAgcGVyZm9ybWFuY2UgLSBub3QgdXNlZCBpZiBpbiBSdW50aW1lIHRvIHJlZHVjZSBmb290cHJpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIHVyaXNUb1Bvc2l0aW9uczsKLQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IHBhcmVudDsKLQotCS8qKgotCSAqIE5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsKExvYWRTdHJhdGVneSBwYXJlbnRTdHJhdGVneSkgewotCQlzdXBlcigpOwotCQlzZXRQYXJlbnQocGFyZW50U3RyYXRlZ3kpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkSW5kZXgoKSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJWmlwSW5wdXRTdHJlYW0gemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJCVppcEVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJCWxvbmcgcG9zaXRpb24gPSAwOwotCQkJd2hpbGUgKChlbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotCQkJCXBvc2l0aW9uKys7Ci0JCQkJbWFwLnB1dChlbnRyeS5nZXROYW1lKCksIG5ldyBMb25nKHBvc2l0aW9uKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3dOZXN0ZWRKYXJFeGNlcHRpb24oaW94KTsKLQkJfQotCQlzZXRVcmlzVG9Qb3NpdGlvbnMobWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJaWYgKHVzaW5nSW5kZXgoKSkKLQkJCXJldHVybiBjb250YWluc1VzaW5nSW5kZXgodXJpKTsKLQkJcmV0dXJuIGNvbnRhaW5zU2VxdWVudGlhbGx5KHVyaSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc1NlcXVlbnRpYWxseShTdHJpbmcgdXJpKSB7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbVNraXBwZWRUbyh1cmkpOwotCQkJcmV0dXJuIHppcyAhPSBudWxsOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHppcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJemlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc1VzaW5nSW5kZXgoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0VXJpc1RvUG9zaXRpb25zKCkuY29udGFpbnNLZXkodXJpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseTsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbAotCSAqLwotCXB1YmxpYyBGaWxlSXRlcmF0b3IgZ2V0RmlsZUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gbmV3IE5lc3RlZEFyY2hpdmVJdGVyYXRvcihnZXRDb250YWluZXIoKS5nZXRGaWxlcygpLCBnZXRaaXBJbnB1dFN0cmVhbSgpKTsKLQkJcmV0dXJuIHN1cGVyLmdldEZpbGVJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoNTAwKTsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcyA9IGdldFppcElucHV0U3RyZWFtKCk7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCUZpbGUgYUZpbGUgPSBjcmVhdGVGaWxlKGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJCWFGaWxlLnNldFNpemUoZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJCWxpc3QuYWRkKGFGaWxlKTsKLQkJCQl9Ci0JCQkJZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3dOZXN0ZWRKYXJFeGNlcHRpb24oaW94KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh6aXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAodXNpbmdJbmRleCgpKQotCQkJcmV0dXJuIGdldElucHV0U3RyZWFtVXNpbmdJbmRleCh1cmkpOwotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW1TZXF1ZW50aWFsbHkodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbVNlcXVlbnRpYWxseShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcElucHV0U3RyZWFtU2tpcHBlZFRvKHVyaSkpOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtVXNpbmdJbmRleChTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUxvbmcgcG9zaXRpb24gPSAoTG9uZykgZ2V0VXJpc1RvUG9zaXRpb25zKCkuZ2V0KHVyaSk7Ci0JCWlmIChwb3NpdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbSgpOwotCQlsb25nIHBvcyA9IHBvc2l0aW9uLmxvbmdWYWx1ZSgpOwotCQlmb3IgKGxvbmcgaSA9IDA7IGkgPCBwb3M7IGkrKykgewotCQkJemlzLmdldE5leHRFbnRyeSgpOwotCQl9Ci0JCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHppcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDcvMDAgNjoxMjozNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDcvMDAgNDozODoyMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLk1hcCBnZXRVcmlzVG9Qb3NpdGlvbnMoKSB7Ci0JCWlmICh1c2luZ0luZGV4KCkgJiYgdXJpc1RvUG9zaXRpb25zID09IG51bGwpCi0JCQlidWlsZEluZGV4KCk7Ci0JCXJldHVybiB1cmlzVG9Qb3NpdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIFppcElucHV0U3RyZWFtIGdldFppcElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCk7Ci0JCUlucHV0U3RyZWFtIGluID0gZ2V0UGFyZW50KCkuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJcmV0dXJuIG5ldyBaaXBJbnB1dFN0cmVhbShpbik7Ci0JfQotCi0JcHJvdGVjdGVkIFppcElucHV0U3RyZWFtIGdldFppcElucHV0U3RyZWFtU2tpcHBlZFRvKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuTnVsbF91cmlfRVhDXyk7IC8vID0gIk51bGwgdXJpIgotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbSgpOwotCQkJZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCWlmICh1cmkuZXF1YWxzKGVudHJ5LmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiB6aXM7Ci0JCQkJZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnRyeSB3YXMgbm90IGZvdW5kIHNvIGNsb3NlIHRoZSBzdHJlYW0KLQkJCWlmIChlbnRyeSA9PSBudWxsICYmIHppcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJemlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNy8wMCA2OjEyOjM2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJlbnQKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBuZXdQYXJlbnQpIHsKLQkJcGFyZW50ID0gbmV3UGFyZW50OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDQ6Mzg6MjEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1VyaXNUb1Bvc2l0aW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLk1hcAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaXNUb1Bvc2l0aW9ucyhqYXZhLnV0aWwuTWFwIG5ld1VyaXNUb1Bvc2l0aW9ucykgewotCQl1cmlzVG9Qb3NpdGlvbnMgPSBuZXdVcmlzVG9Qb3NpdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQW4gZXhjZXB0aW9uIHdhcyBjYXVnaHQgcmVhZGluZyB0aGUgbmVzdGVkIGphcjsgdGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd05lc3RlZEphckV4Y2VwdGlvbihFeGNlcHRpb24gY2F1Z2h0RXhjZXB0aW9uKSB7Ci0JCXRocm93IG5ldyBOZXN0ZWRKYXJFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5uZXN0ZWRfamFyX0VYQ18sIChuZXcgT2JqZWN0W117Z2V0Q29udGFpbmVyKCkuZ2V0VVJJKCksIGdldFBhcmVudCgpLmdldENvbnRhaW5lcigpLmdldFVSSSgpfSkpLCBjYXVnaHRFeGNlcHRpb24pOy8vID0gIkFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgezB9IGZyb20gezF9IgotCX0KLQotCS8qKgotCSAqIERvbid0IHVzZSB0aGUgaW5kZXggaW4gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQ7IHJlZHVjZSBmb290cHJpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2luZ0luZGV4KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vcmV0dXJuICFjb20uaWJtLmV0b29scy5hcmNoaXZlLnV0aWwuQXJjaGl2ZVV0aWwuaXNSdW50aW1lKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L051bGxMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWY2MWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L051bGxMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBOby1vcCBpbXBsZW1lbnRlciB1c2VkIGZvciBuZXcgYXJjaGl2ZSBpbnN0YW5jZXMsIHdoaWNoIGhhdmUgdGhlaXIgY29udGVudHMgYWRkZWQgYW5kIGNvcGllZCBmcm9tCi0gKiBvdGhlciBzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBlbXB0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JLyoqCi0JICogTnVsbExvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOdWxsTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7Ci0JCXJldHVybiBlbXB0eUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTc3ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSBKMkMgUmVzb3VyY2UgQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgUmFyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBSYXJFeHBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSYXJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgSjJDIFJlc291cmNlIEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJhckltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzY3JpbWluYXRvciBleHRlbmRzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgUmFySW1wb3J0U3RyYXRlZ3lJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuUkFSX0ZpbGUsIEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7IC8vID0gIlJBUiBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJBUkZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogUmFySW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmFySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJCS8vIENvbm5lY3RvcnMgdXNlIHRoZWlyIG93biBzcGVjaWFsIGVudGl0eSByZXNvbHZlciBmb3Igbm93Li4uCi0JCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wLCAiY29ubmVjdG9yXzFfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yOwotCX0KLQotCXB1YmxpYyBSQVJGaWxlIGdldFJBUkZpbGUoKSB7Ci0JCXJldHVybiAoUkFSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb25uZWN0b3IgY29ubmVjdG9yID0gbnVsbDsKLQotCQljb25uZWN0b3IgPSAoQ29ubmVjdG9yKSBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCWdldFJBUkZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcihjb25uZWN0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDhlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCB7Ci0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBzdWJkaXJlY3Rvcnk7Ci0KLQkvKioKLQkgKiBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIGFEaXJlY3RvcnlVcmkpIHsKLQkJc3VwZXIoYURpcmVjdG9yeVVyaSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyByb290RGlyZWN0b3J5VXJpLCBqYXZhLmlvLkZpbGUgc3ViZGlyKSB7Ci0JCXN1cGVyKHJvb3REaXJlY3RvcnlVcmkpOwotCQlzZXRTdWJkaXJlY3Rvcnkoc3ViZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGREaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBhRmlsZSwgamF2YS51dGlsLkxpc3QgYUxpc3QpIHsKLQkJUmVhZE9ubHlEaXJlY3RvcnkgZGlyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVSZWFkT25seURpcmVjdG9yeSgpOwotCQlkaXIuc2V0TGFzdE1vZGlmaWVkKGFGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJZGlyLnNldFVSSShnZXRVUklGcm9tKGFGaWxlKSk7Ci0JCWRpci5zZXRMb2FkaW5nQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQkJZGlyLnNldExvYWRTdHJhdGVneShuZXcgUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKGdldERpcmVjdG9yeVVyaSgpLCBhRmlsZSkpOwotCQlhTGlzdC5hZGQoZGlyKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBzdXBlci5jb250YWlucyh1cmkpICYmIChnZXRTdWJkaXJlY3RvcnkoKSA9PSBudWxsIHx8IHN1YmRpcmVjdG9yeUNvbnRhaW5zKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgc3ViZGlyID0gZ2V0U3ViZGlyZWN0b3J5KCk7Ci0JCWlmIChzdWJkaXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdWJkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGlyZWN0b3J5Rm9yTGlzdCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKSB7Ci0JCWlmIChnZXRTdWJkaXJlY3RvcnkoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFN1YmRpcmVjdG9yeSgpOwotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXREaXJlY3RvcnlVcmkoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDEvMDgvMDEgMToxMDo0NyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEuaW8uRmlsZQotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLkZpbGUgZ2V0U3ViZGlyZWN0b3J5KCkgewotCQlyZXR1cm4gc3ViZGlyZWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEFsd2F5cyByZXR1cm4gZmFsc2UsIGJlY2F1c2Ugd2Ugd2FudCB0byB0cmVhdCB0aGUgZW50cmllcyBpbiBhIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBhcyBiYXNpYwotCSAqIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcmNoaXZlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAxLzA4LzAxIDE6MTA6NDcgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1N1YmRpcmVjdG9yeQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3ViZGlyZWN0b3J5KGphdmEuaW8uRmlsZSBuZXdTdWJkaXJlY3RvcnkpIHsKLQkJc3ViZGlyZWN0b3J5ID0gbmV3U3ViZGlyZWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN1YmRpcmVjdG9yeUNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJaWYgKGdldFN1YmRpcmVjdG9yeSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0RmlsZU5hbWVGcm9tKHVyaSkpLmdldFBhcmVudEZpbGUoKTsKLQkJYm9vbGVhbiBjb250YWlucyA9IGZhbHNlOwotCQl3aGlsZSAoYUZpbGUgIT0gbnVsbCAmJiAhY29udGFpbnMpIHsKLQkJCWlmIChnZXRTdWJkaXJlY3RvcnkoKS5lcXVhbHMoYUZpbGUpKSB7Ci0JCQkJY29udGFpbnMgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlhRmlsZSA9IGFGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiY2UyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7Ci0KLQotLyoqCi0gKiBLbm93cyBob3cgdG8gZXhwb3J0IHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGZpbGUuIFRoaXMgcHJvdmlkZXMgYSBkZWxlZ2F0aW9uIG1vZGVsIHNhdmluZyB0aGUKLSAqIGFyY2hpdmUuIEV4YW1wbGVzIG1pZ2h0IGluY2x1ZGUgZXhwb3J0aW5nIHRvIGEgemlwIG91dHB1dCBzdHJlYW0sIHRvIHRoZSBmaWxlIHN5c3RlbSwgb3IgaW50byBhCi0gKiB3b3JrYmVuY2guCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2F2ZVN0cmF0ZWd5IGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5IHsKLQkvKioKLQkgKiBDbG9zZSBhbmQgcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQgYnkgdGhpcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTm90aWZ5IHJlc291cmNlcyBpZiBuZWNlc3NhcnkgdGhhdCBzYXZlIGlzIGNvbXBsZXRlIGZvciB0aGlzIGFyY2hpdmUsIGJlaW5nIGNhcmVmdWwgbm90IHRvCi0JICogY2xvc2UgYW55IHJlc291cmNlcyB0aGF0IGEgcGFyZW50IGFyY2hpdmUgbWlnaHQgc3RpbGwgYmUgdXNpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBTYXZlRmlsdGVyIGdldEZpbHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYXJjaGl2ZSBpcyBzYXZpbmcgZmlsZXMgdG8gYSBkaXJlY3Rvcnkgb24gdGhlIGZpbGUgc3lzdGVtCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKTsKLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBGaWxlSXRlcmF0b3IgaXRlcmF0b3IpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBzYXZlTW9mUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKFNhdmVGaWx0ZXIgYUZpbHRlcik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTk4MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRlciBvZmYgd2hpY2ggYW55IHNhdmUgc3RyYXRlZ3kgY2FuIHN1YmNsYXNzCi0gKiAKLSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBTYXZlRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIFNhdmVTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nIC0gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcgLSBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDQ6MTE6MjggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJZmlsdGVyID0gbmV3IFNhdmVGaWx0ZXJJbXBsKCk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2FkZWRSZXNvdXJjZU9yTWFuaWZlc3QoRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZSgpLmlzTW9mUmVzb3VyY2VMb2FkZWQoYUZpbGUuZ2V0VVJJKCkpIHx8IGFGaWxlLmdldFVSSSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJc2F2ZU1hbmlmZXN0KCk7Ci0JCXNhdmVNb2ZSZXNvdXJjZXMoKTsKLQkJc2F2ZUZpbGVzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU2F2ZVN0cmF0ZWd5IHN0cmF0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmF0ID0gY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYW5BcmNoaXZlLmdldFVSSSgpLCBpb3gpOwotCQl9Ci0JCWFuQXJjaGl2ZS5zYXZlKHN0cmF0KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIEZpbGVJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpICYmIHNob3VsZEl0ZXJhdGVPdmVyKChBcmNoaXZlKSBhRmlsZSkpCi0JCQlzYXZlKChBcmNoaXZlKSBhRmlsZSk7Ci0JCWVsc2UgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlpbiA9IGl0ZXJhdG9yLmdldElucHV0U3RyZWFtKGFGaWxlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQlzYXZlKGFGaWxlLCBpbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRmlsZXMoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJRmlsZUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QXJjaGl2ZSgpLmdldEZpbGVzRm9yU2F2ZSgpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUZpbGUgYUZpbGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNob3VsZFNhdmUoYUZpbGUpKQotCQkJCQlzYXZlKGFGaWxlLCBpdGVyYXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRXJyb3Jfb2NjdXJyZWRfaXRlcmF0aW5nX2ZfRVhDXywgaW94KTsgLy8gPSAiRXJyb3Igb2NjdXJyZWQgaXRlcmF0aW5nIGZpbGVzIgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1hbmlmZXN0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFzaG91bGRTYXZlKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSkKLQkJCXJldHVybjsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gZ2V0QXJjaGl2ZSgpLmdldE1hbmlmZXN0KCk7Ci0JCWlmIChtZi5nZXRNYW5pZmVzdFZlcnNpb24oKSA9PSBudWxsIHx8IG1mLmdldE1hbmlmZXN0VmVyc2lvbigpLmVxdWFscygiIikpLy8kTk9OLU5MUy0xJAotCQkJbWYuc2V0TWFuaWZlc3RWZXJzaW9uKCIxLjAiKTsvLyROT04tTkxTLTEkCi0JCXNhdmUobWYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFzaG91bGRTYXZlKGFSZXNvdXJjZSkpCi0JCQlyZXR1cm47Ci0JCXNldEVuY29kaW5nKGFSZXNvdXJjZSk7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIHdhc01vZGlmaWVkID0gYVJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJCU91dHB1dFN0cmVhbSBvcyA9IGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlzYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvcyk7Ci0JCQlhUmVzb3VyY2Uuc2V0TW9kaWZpZWQod2FzTW9kaWZpZWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhUmVzb3VyY2Uuc2F2ZShvcywgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2VzKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRBcmNoaXZlKCkuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJLy9XZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhpcyBwcm9jZXNzIGJlY2F1c2UgamF2YSByZXNvdXJjZXMgY291bGQgZ2V0IGFkZGVkIGR1cmluZyB0aGUKLQkJLy9wcm9jZXNzIG9mIGl0ZXJhdGluZyBhbmQgc2F2aW5nLCBhbmQgYWRkaW5nIHRvIGEgY29sbGVjdGlvbiB3aGlsZSBpdGVyYXRpbmcgY2F1c2VzIGEKLQkJLy8gZmFpbHVyZQotCQlMaXN0IHhtaVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9XZSB3aWxsIHNhdmUgdGhlIHhtaSByZXNvdXJjZXMgZmlyc3QsIHRoZW4gdGhlIHhtbCByZXNvdXJjZXMuIFRoaXMgd2F5IHRoZQotCQkvL2FueSBuZWNlc3NhcnkgaWQncyBmb3IgcmVmZXJlbmNlZCBvYmplY3RzIHdpbGwgaGF2ZSBiZWVuIGdlbmVyYXRlZCBwcmlvciB0byBzYXZlCi0JCUxpc3QgeG1sUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vCQlXZSBkb24ndCB3YW50IHRvIHNhdmUgdGhlIGphdmEgcmVmbGVjdGlvbiByZXNvdXJjZXMgb3IgdXJpIG1hcHBlZCByZXNvdXJjZXMKLQkJCWlmICghQXJjaGl2ZVV0aWwuaXNKYXZhUmVzb3VyY2UocmVzKSAmJiAhQXJjaGl2ZVV0aWwuaXNSZWdpc3RlcmVkVVJJTWFwcGluZyhyZXMpICYmICFBcmNoaXZlVXRpbC5pc1BsYXRmb3JtTWV0YVJlc291cmNlKHJlcykpIHsKLQkJCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJCQkvL0ZvciBub3csIGFsd2F5cyB1c2UgdGhlIG1vZjUgZm9ybWF0Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKLQkJCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHJlcykuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCQkJeG1sUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCWVsc2UgewotCQkJCQl4bWlSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJhc2ljU2F2ZU1vZlJlc291cmNlcyh4bWlSZXNvdXJjZXMpOwotCQliYXNpY1NhdmVNb2ZSZXNvdXJjZXMoeG1sUmVzb3VyY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NhdmVNb2ZSZXNvdXJjZXMoTGlzdCByZXNvdXJjZXMpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlzYXZlTW9mUmVzb3VyY2UocmVzKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5jb2RpbmcoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKQotCQkJKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKSBhUmVzb3VyY2UpLnNldEVuY29kaW5nKGFyY2hpdmUuZ2V0WG1sRW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgNDoxMToyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsdGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIG5ld0ZpbHRlcikgewotCQlmaWx0ZXIgPSBuZXdGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIG5lc3RlZCBhcmNoaXZlIG5lZWRzIHRvIGJlIHNhdmVkIG9uZSBmaWxlIGF0IGEgdGltZSwgb3IgaWYgd2UgY2FuIGJ1bGsKLQkgKiBzYXZlIGl0IGZyb20gdGhlIG9yaWdpbmFsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSXRlcmF0ZU92ZXIoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKS5yZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoRmlsZSBhRmlsZSkgewotCQlib29sZWFuIGxvYWRlZCA9IGlzTG9hZGVkUmVzb3VyY2VPck1hbmlmZXN0KGFGaWxlKTsKLQkJaWYgKGxvYWRlZCkgewotCQkJUmVzb3VyY2UgcmVzID0gYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKS5nZXRFeGlzdGluZ01vZlJlc291cmNlKGFGaWxlLmdldFVSSSgpKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvL211c3QgYmUgbWFuaWZlc3QKLQkJCXJldHVybiAhc2hvdWxkU2F2ZShyZXMpOwotCQl9Ci0KLQkJaWYgKGdldEFyY2hpdmUoKS5pc01vZHVsZUZpbGUoKSkgewotCQkJTW9kdWxlRmlsZSBtID0gKE1vZHVsZUZpbGUpIGdldEFyY2hpdmUoKTsKLQkJCWlmIChtLmdldEV4cG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCAmJiBtLmdldEV4cG9ydFN0cmF0ZWd5KCkuaGFzU2F2ZWQoYUZpbGUuZ2V0VVJJKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc2hvdWxkU2F2ZShhRmlsZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKCFyZXMuaXNNb2RpZmllZCgpICYmIGdldEFyY2hpdmUoKS5nZXRPcHRpb25zKCkuc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzaG91bGRTYXZlKHJlcy5nZXRVUkkoKS50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG9uZSBtZXRob2QgdGhyb3VnaCB3aGljaCBhbGwgZWxlbWVudHMgb2YgYW4gYXJjaGl2ZSAoZmlsZSwgbmVzdGVkIGFyY2hpdmUsIG1vZgotCSAqIHJlc291cmNlLCBvciBtYW5pZmVzdCkgd2lsbCBiZSB0ZXN0ZWQgYmVmb3JlIHNhdmluZy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gZG8gc29tZXRoaW5nCi0JICogbW9yZSBzcGVjaWZpYwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0RmlsdGVyKCkuc2hvdWxkU2F2ZSh1cmksIGdldEFyY2hpdmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9UZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNzJiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9UZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5EZWxldGVPbkV4aXRVdGlsaXR5OwotCi0KLS8qKgotICogVXNlZCBhcyBhbiBvcHRpbWl6YXRpb24gZm9yIHJlYWRpbmcgamFycyB3aXRoaW4gamFycy4gUmVhZGluZyBmcm9tIGEgWmlwRmlsZSBpcyBtdWNoIGZhc3RlciB0aGFuCi0gKiBmcm9tIGEgWmlwSW5wdXRTdHJlYW0sIHRoZXJlZm9yZSwgd2hlbiBwb3NzaWJsZSwgaXQgbWFrZXMgc2Vuc2UgdG8gY29weSB0aGUgbmVzdGVkIGphciB0byBhIHRlbXAKLSAqIGZpbGUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZSB0ZW1wIGZpbGUgZ2V0cyBkZWxldGVkIG9uIG5vcm1hbAotICogc3lzdGVtIGV4aXQsIHVzaW5nIHRoZSBoZWxwZXIgbWV0aG9kIG9uIGphdmEuaW8uRmlsZS4gVGhpcyBzdHJhdGVneSB3aWxsIGFsc28gZGVsZXRlIHRoZSBmaWxlCi0gKiB3aGVuIGNsb3NlZCBvciBmaW5hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogVGVtcG9yYXJ5WmlwRmlsZUxvYWRTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRlbXBvcmFyeVppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZQotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbChqYXZhLmlvLkZpbGUgZmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlmaWxlLmRlbGV0ZSgpOwotCQlEZWxldGVPbkV4aXRVdGlsaXR5LmZpbGVIYXNCZWVuRGVsZXRlZChmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfKTsgLy8gPSAiQWJzb2x1dGUgcGF0aCB1bmtub3duIgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTIwZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSAyLjIgV2ViIGFwcAotICovCi1wdWJsaWMgY2xhc3MgV2FyMjJFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFdhcjIyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2FyMjJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWQ2NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMi4yIFdlYiBhcHAKLSAqLwotcHVibGljIGNsYXNzIFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLldBUl9GaWxlLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpOyAvLyA9ICJXQVIgRmlsZSIKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvcjsKLQotCS8qKgotCSAqIFdhcjIySW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2FyMjJJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3IoKS5jcmVhdGVJbXBvcnRTdHJhdGVneShvbGQsIG5ld0FyY2hpdmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yID09IG51bGwpIHsKLQkJCWRpc2NyaW1pbmF0b3IgPSBuZXcgRGlzY3JpbWluYXRvcigpOwotCQl9Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yOwotCX0KLQotCXB1YmxpYyBXQVJGaWxlIGdldFdBUkZpbGUoKSB7Ci0JCXJldHVybiAoV0FSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVdlYkFwcCB3ZWJhcHAgPSBudWxsOwotCQl3ZWJhcHAgPSAoV2ViQXBwKSBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJZ2V0V0FSRmlsZSgpLnNldERlcGxveW1lbnREZXNjcmlwdG9yKHdlYmFwcCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1htbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNmJmZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50ZXIgZm9yIGFyY2hpdmVzIHRoYXQgdXNlIHhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogWG1sQmFzZWRJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gKE1vZHVsZUZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlyZXNvdXJjZSA9IGdldE1vZHVsZUZpbGUoKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUVPYmplY3Qgcm9vdCA9IG51bGw7Ci0KLQkJcm9vdCA9IEFyY2hpdmVVdGlsLmdldFJvb3QocmVzb3VyY2UpOwotCi0JCXJldHVybiByb290OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYwMjg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHJlYWQgZmlsZXMgZnJvbSBhIHppcC9qYXIgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAqIAotICogQHNlZSBMb2FkU3RyYXRlZ3kKLSAqLwotCi1wdWJsaWMgY2xhc3MgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIFppcEZpbGUgemlwRmlsZTsKLQkKLQkvKioKLQkgKiBaaXBGaWxlTG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFppcEZpbGVMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXNldEZpbGUoZmlsZSk7Ci0JCXNldFppcEZpbGUob3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzdXBlci5jbG9zZSgpOwotCQl0cnkgewotCQkJZ2V0WmlwRmlsZSgpLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8yMC8wMCA0OjQwOjE0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIGphdmEuaW8uRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBnZXRaaXBGaWxlKCkuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkJaWYoIWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLmNvbnRhaW5zS2V5KGVudHJ5LmdldE5hbWUoKSkpIHsKLQkJCQkJRmlsZSBhRmlsZSA9IGNyZWF0ZUZpbGUoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQkJYUZpbGUuc2V0U2l6ZShlbnRyeS5nZXRTaXplKCkpOwotCQkJCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQkJbGlzdC5hZGQoYUZpbGUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZihpbmNsdWRlRW1wdHlEaXJlY3RvcmllcykgewotCQkJCUZpbGUgYUZpbGUgPSBjcmVhdGVEaXJlY3RvcnkoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlhRmlsZS5zZXREaXJlY3RvcnlFbnRyeSh0cnVlKTsKLQkJCQlhRmlsZS5zZXRTaXplKGVudHJ5LmdldFNpemUoKSk7Ci0JCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJbGlzdC5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQotCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB6aXBDbG9zZWQpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih6aXBDbG9zZWQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8wMS8wMCAxMToyODoxMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEZpbGUgZ2V0WmlwRmlsZSgpIHsKLQkJcmV0dXJuIHppcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKSB7Ci0JCXJldHVybiBnZXRGaWxlKCkgIT0gbnVsbCAmJiBnZXRGaWxlKCkuZXF1YWxzKGFTeXN0ZW1GaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8yMC8wMCA0OjQwOjE0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWxlCi0JICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKGphdmEuaW8uRmlsZSBuZXdGaWxlKSB7Ci0JCWZpbGUgPSBuZXdGaWxlOwotCX0KLQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgMTE6Mjg6MTIgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld1ppcEZpbGUKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFppcEZpbGUoamF2YS51dGlsLnppcC5aaXBGaWxlIG5ld1ppcEZpbGUpIHsKLQkJemlwRmlsZSA9IG5ld1ppcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGVtcHR5IGRpcmVjdG9yaWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgCi0JICogZmlsZSBsaXN0IG9mIHRoaXMgYXJjaGl2ZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNldCB0byB7QGxpbmsgI0FyY2hpdmVVdGlsLklOQ0xVREVfRU1QVFlfRElSRUNUT1JJRVN9Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVFbXB0eURpcmVjdG9yaWVzID0gQXJjaGl2ZVV0aWwuSU5DTFVERV9FTVBUWV9ESVJFQ1RPUklFUzsKLQkKLQkvKioKLQkgKiBJZiB0aGlzIHZhbHVlIGhhcyBub3QgYmVlbiBzZXQsIHRoZSBkZWZhdWx0IGlzIGRlZmluZWQgYnkge0BsaW5rICNBcmNoaXZlVXRpbC5JTkNMVURFX0VNUFRZX0RJUkVDVE9SSUVTfS4KLQkgKiAKLQkgKiBJZiB0aGlzIHZhbHVlIGlzIDxjb2RlPnRydWU+PC9jb2RlPiB0aGVuIGVtcHR5IGRpcmVjdG9yaWVzIHdpbGwgYmUgaW5jbHVkZWQgaW4ge0BsaW5rICNnZXRGaWxlcygpfS4KLQkgKiAKLQkgKiBAc2VlICNzZXRJbmNsdWRlRW1wdHlEaXJlY3Rvcmllcyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMoKSB7Ci0JCXJldHVybiBpbmNsdWRlRW1wdHlEaXJlY3RvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHZhbHVlIGhhcyBub3QgYmVlbiBzZXQsIHRoZSBkZWZhdWx0IGlzIGRlZmluZWQgYnkge0BsaW5rICNBcmNoaXZlVXRpbC5JTkNMVURFX0VNUFRZX0RJUkVDVE9SSUVTfS4KLQkgKiAKLQkgKiBAc2VlICNpc0luY2x1ZGVFbXB0eURpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRW1wdHlEaXJlY3Rvcmllcyhib29sZWFuIGluY2x1ZGVFbXB0eURpcmVjdG9yaWVzKSB7Ci0JCXRoaXMuaW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMgPSBpbmNsdWRlRW1wdHlEaXJlY3RvcmllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZWUwYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBjb25jcmV0ZSBpbXBsZW50YXRpb24gb2YgU2F2ZVN0cmF0ZWd5LiBBbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlLCBpbmNsdWRpbmcgeG1pCi0gKiByZXNvdXJjZXMsIHdpbGwgYmUgb3V0cHV0IHRvIGEgWmlwT3V0cHV0U3RyZWFtLiBUaGUgb3V0cHV0IHN0cmVhbSBzaG91bGQgYmUgcGFzc2VkIGluIGJ5IHRoZQotICogY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW07Ci0JLyoqIFVzZWQgaW50ZXJuYWxseSAqLwotCXByb3RlY3RlZCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtOwotCi0JLyoqCi0JICogV3JhcHMgYSBuZXcgemlwIG91dHB1dCBzdHJlYW0gYXJvdW5kIHRoZSBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCXNldERlc3RpbmF0aW9uU3RyZWFtKG91dCk7Ci0JCXNldFppcE91dHB1dFN0cmVhbShuZXcgWmlwT3V0cHV0U3RyZWFtKG91dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChnZXRaaXBPdXRwdXRTdHJlYW0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuZmluaXNoKCk7Ci0JCS8vSWYgdGhpcyBpcyBub3QgbmVzdGVkLCBjbG9zZSB0aGUgc3RyZWFtIHRvIGZyZWUgdXAgdGhlIHJlc291cmNlCi0JCS8vb3RoZXJ3aXNlLCBkb24ndCBjbG9zZSBpdCBiZWNhdXNlIHRoZSBwYXJlbnQgbWF5IG5vdCBiZSBkb25lCi0JCWlmICghKGdldERlc3RpbmF0aW9uU3RyZWFtKCkgaW5zdGFuY2VvZiBaaXBPdXRwdXRTdHJlYW0pKQotCQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5pby5PdXRwdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0RGVzdGluYXRpb25TdHJlYW0oKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvblN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0WmlwT3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneSNzYXZlTW9mUmVzb3VyY2UoUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCVVSSSB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCS8vRW5zdXJlIGNvbnRhaW5lciByZWxhdGl2ZSBVUkkKLQkJVVJJQ29udmVydGVyIGNvbnYgPSBnZXRBcmNoaXZlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnYgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKQotCQkJdXJpID0gKChDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSBjb252KS5kZU5vcm1hbGl6ZSh1cmkpOwotCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeSh1cmkudG9TdHJpbmcoKSk7Ci0JCXppcE91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkoZW50cnkpOwotCQlzdXBlci5zYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvdXQpOwotCQl6aXBPdXRwdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gZ2V0WmlwT3V0cHV0U3RyZWFtKCkgewotCQlyZXR1cm4gemlwT3V0cHV0U3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlhTWFuaWZlc3Qud3JpdGUoZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSwgaW94KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCXN1cGVyLnNhdmUoYW5BcmNoaXZlKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLmNsb3NlRW50cnkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYW5BcmNoaXZlLmdldFVSSSgpLCBpb3gpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKLQkJCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkgJiYgIWVudHJ5TmFtZS5lbmRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeU5hbWUgPSBlbnRyeU5hbWUgKyAnLyc7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpOwotCQkJaWYgKGFGaWxlLmdldExhc3RNb2RpZmllZCgpID4gMCkKLQkJCQllbnRyeS5zZXRUaW1lKGFGaWxlLmdldExhc3RNb2RpZmllZCgpKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlpZiAoIWFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkgewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY29weShpbiwgZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCQkJfQotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgaW94KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZXN0aW5hdGlvblN0cmVhbQotCSAqICAgICAgICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBuZXdEZXN0aW5hdGlvblN0cmVhbSkgewotCQlkZXN0aW5hdGlvblN0cmVhbSA9IG5ld0Rlc3RpbmF0aW9uU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdaaXBPdXRwdXRTdHJlYW0KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0WmlwT3V0cHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtIG5ld1ppcE91dHB1dFN0cmVhbSkgewotCQl6aXBPdXRwdXRTdHJlYW0gPSBuZXdaaXBPdXRwdXRTdHJlYW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE0MWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIENsYXNzIGxvYWRlciB3aGljaCBsb2FkcyBhIGdpdmVuIHNldCBvZiBjbGFzc2VzIHN0b3JlZCBpbiBieXRlIGFycmF5cy4gKEFzc3VtcHRpb246IFN5c3RlbQotICogY2xhc3NlcyBhbmQgdGhvc2UgaW4gdGhlIHNldCBhcmUgdGhlIG9ubHkgY2xhc3NlcyBuZWVkZWQgdG8gcmVzb2x2ZSBlYWNoIG9uZSkKLSAqLwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7ICAgIAotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBleHRyYUNsYXNzTG9hZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGluRUFSRmlsZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BST1RPQ09MID0gImFyY2hpdmUiOwotCXByaXZhdGUgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIgaGFuZGxlcjsKLSAgICAKLQlwcm90ZWN0ZWQgUHJvdGVjdGlvbkRvbWFpbiBwcm90ZWN0aW9uRG9tYWluOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPlRoaXMgY29uc3RydWN0b3IgYWNjZXB0cyBhIHByb3RlY3Rpb24gZG9tYWluLCB3aGljaCBpcyB1c2VkCi0gICAgICogYnkgPGNvZGU+ZmluZENsYXNzPC9jb2RlPi48L3A+Ci0gICAgICogCi0gICAgICogQHNlZSBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlciNmaW5kQ2xhc3MoU3RyaW5nKQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcihBcmNoaXZlIGFuQXJjaGl2ZSwgQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wsIFByb3RlY3Rpb25Eb21haW4gcERvbWFpbikgewotICAgICAgICBzdXBlcihwYXJlbnRDbCk7Ci0gICAgICAgIHNldEFyY2hpdmUoYW5BcmNoaXZlKTsKLSAgICAgICAgc2V0RXh0cmFDbGFzc0xvYWRlcihleHRyYUNsKTsKLSAgICAgICAgaW5FQVJGaWxlID0gYW5BcmNoaXZlLmdldENvbnRhaW5lcigpICE9IG51bGwgJiYgYW5BcmNoaXZlLmdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpOwotICAgICAgICBoYW5kbGVyID0gbmV3IEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyKCk7Ci0gICAgICAgIHByb3RlY3Rpb25Eb21haW4gPSBwRG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcihBcmNoaXZlIGFuQXJjaGl2ZSwgQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLSAgICAgICAgdGhpcyhhbkFyY2hpdmUsIHBhcmVudENsLCBleHRyYUNsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Mb2FkcyBhIHNwZWNpZmllZCBjbGFzcy4gIENhbGxlZCBvbmx5IGFmdGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGhhcyBoYWQKLSAgICAgKiBpdHMgY2hhbmNlIHRvIGxvYWQgdGhlIGNsYXNzLCBhcyBwZXIgdGhlIEphdmEyIGRlbGVnYXRpb24gbW9kZWwuPC9wPgotICAgICAqIAotICAgICAqIDxwPldoZW4gbm9uLW51bGwsIHRoZSByZWNlaXZlcidzIHByb3RlY3Rpb24KLSAgICAgKiBkb21haW4gaXMgcGFzc2VkIGluIHRvIHRoZSBjYWxsIHRvIDxjb2RlPmRlZmluZUNsYXNzPC9jb2RlPi48L3A+Ci0gICAgICogCi0gICAgICogQHNlZSBDbGFzc0xvYWRlciNkZWZpbmVDbGFzcyhTdHJpbmcsIGJ5dGVbXSwgaW50KQotICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIjZGVmaW5lQ2xhc3MoU3RyaW5nLCBieXRlW10sIGludCwgUHJvdGVjdGlvbkRvbWFpbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLQkJQ2xhc3MgcmVzdWx0OwotCQkvLyBMb2FkIGNsYXNzIGJ5dGVzIGZyb20gY3VycmVudCBzZXQgb2YgY2xhc3MgYnl0ZVtdJ3MKLQkJYnl0ZVtdIGJ5dGVzID0gZ2V0Q2xhc3NCeXRlc0ZvcihuYW1lKTsKLQotCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCBwcm90ZWN0aW9uRG9tYWluID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmaW5lQ2xhc3MobmFtZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgsIHByb3RlY3Rpb25Eb21haW4pOyAKLSAgICAgICAgICAgIH0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQkJfSAvLyBlbmRpZgotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCX0gLy8gZW5kaWYKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8wMCA5OjU5OjU3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHJpdmF0ZSBieXRlW10gZ2V0RGF0YShGaWxlIGZpbGUpIHsKLQkJaWYgKG51bGwgIT0gZmlsZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gQXJjaGl2ZVV0aWwuaW5wdXRTdHJlYW1Ub0J5dGVzKGZpbGUuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmlvX2V4X2xvYWRpbmdfRVhDXywgKG5ldyBPYmplY3RbXXtmaWxlLmdldE5hbWUoKX0pKSwgZSk7IC8vID0gIkFuIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nICIJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRDbGFzc0J5dGVzRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIENoYW5nZSB0aGUgY2xhc3MgbmFtZSB0byBhIGphciBlbnRyeSBuYW1lCi0JCVN0cmluZyBqYXJFbnRyeU5hbWUgPSBBcmNoaXZlVXRpbC5jbGFzc05hbWVUb1VyaShjbGFzc05hbWUpOwotCQlyZXR1cm4gZ2V0RGF0YShnZXRGaWxlKGphckVudHJ5TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCXJldHVybiAoRUFSRmlsZSkgZ2V0QXJjaGl2ZSgpLmdldENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzIxLzAwIDY6NTg6MDUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldEV4dHJhQ2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBleHRyYUNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIGR5bmFtaWMgY2xhc3MgbG9hZGluZyBpbiBkZXBlbmRlbnQgamFycyBpbiBlYXJzOyB0aGUgc2V0IGlzIHVzZWQgdG8gdGVybWluYXRlIGEKLQkgKiBjeWNsZSBpZiBvbmUgZXhpc3RzOyB0aGUgY3ljbGUgaXMgaW52YWxpZCwgYnV0IHlvdSBuZXZlciBrbm93IHdoYXQgcGVvcGxlIG1pZ2h0IHRyeS4uLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBTZXQgdmlzaXRlZEFyY2hpdmVzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICh2aXNpdGVkQXJjaGl2ZXMuY29udGFpbnMoZ2V0QXJjaGl2ZSgpKSkKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl2aXNpdGVkQXJjaGl2ZXMuYWRkKGdldEFyY2hpdmUoKSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGxvYWRDbGFzc0luRGVwZW5kZW50SmFySW5FQVIobmFtZSwgdmlzaXRlZEFyY2hpdmVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzIGMgPSBsb2FkQ2xhc3NJbkRlcGVuZGVudEphcihuYW1lKTsKLQkJCWlmIChjICE9IG51bGwgJiYgcmVzb2x2ZSkKLQkJCQlyZXNvbHZlQ2xhc3MoYyk7Ci0JCQlyZXR1cm4gYzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3NJbkRlcGVuZGVudEphcihTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0JCWlmIChpbkVBUkZpbGUpIHsKLQkJCXJldHVybiBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKG5hbWUpOwotCQl9IGVsc2UgaWYgKGdldEV4dHJhQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RXh0cmFDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhuYW1lKTsKLQkJfQotCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihTdHJpbmcgbmFtZSwgU2V0IHZpc2l0ZWRBcmNoaXZlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcywgQ0xBU1NfVFlQRSk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIobmFtZSwgQ0xBU1NfVFlQRSk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCX0KLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIobmFtZSwgRklMRV9UWVBFKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEZpbGUpIG9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDTEFTU19UWVBFID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIGludCB0eXBlKSB7Ci0JCVNldCB2aXNpdGVkQXJjaGl2ZXMgPSBuZXcgSGFzaFNldCg1KTsKLQkJdmlzaXRlZEFyY2hpdmVzLmFkZChnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcywgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRSZXNvdXJjZUluRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIFNldCB2aXNpdGVkQXJjaGl2ZXMsIGludCB0eXBlKSB7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aCA9IGFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGNsYXNzcGF0aFtpXSwgYXJjaGl2ZSk7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlGaWxlIGphckZpbGUgPSBnZXRFQVJGaWxlKCkuZ2V0RmlsZSh1cmkpOwotCQkJCWlmIChqYXJGaWxlLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJCUFyY2hpdmUgZGVwID0gKEFyY2hpdmUpIGphckZpbGU7Ci0JCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCQkJY2FzZSBDTEFTU19UWVBFIDoKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZXR1cm4gKChBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcikgZGVwLmdldEFyY2hpdmVDbGFzc0xvYWRlcigpKS5sb2FkQ2xhc3MobmFtZSwgdmlzaXRlZEFyY2hpdmVzKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIG5vRGljZSkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQljYXNlIEZJTEVfVFlQRSA6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmV0dXJuIGRlcC5nZXRGaWxlKG5hbWUpOwotCQkJCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub0RpY2UpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZGVwSmFyTm90SW5FQVIpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8wMCA5OjU5OjU3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdBcmNoaXZlCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yMS8wMCA2OjU4OjA1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdFeHRyYUNsYXNzTG9hZGVyKSB7Ci0JCWV4dHJhQ2xhc3NMb2FkZXIgPSBuZXdFeHRyYUNsYXNzTG9hZGVyOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlKG5hbWUpOwotCQkJaWYgKG51bGwgIT0gZmlsZSkgewotCQkJCXJldHVybiBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmlvX2V4X2xvYWRpbmdfRVhDXywgKG5ldyBPYmplY3RbXXtuYW1lfSkpLCBlKTsgLy8gPSAiQW4gSU8gZXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGVGcm9tQXJjaGl2ZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEFyY2hpdmUoKS5nZXRGaWxlKG5hbWUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tQXJjaGl2ZShuYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKG5hbWUpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBVUkwgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChnZXRGaWxlKG5hbWUpICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobnVsbCwgVVJMX1BST1RPQ09MICsgIjovLyIgKyBuYW1lLCBoYW5kbGVyKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyIGV4dGVuZHMgVVJMU3RyZWFtSGFuZGxlciB7Ci0JCXB1YmxpYyBBcmNoaXZlVVJMU3RyZWFtSGFuZGxlcigpIHsKLQkJfQotCi0JCXByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVVUkxDb25uZWN0aW9uKHVybCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVVUkxDb25uZWN0aW9uIGV4dGVuZHMgVVJMQ29ubmVjdGlvbiB7Ci0JCXByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKLQotCQlwcm90ZWN0ZWQgQXJjaGl2ZVVSTENvbm5lY3Rpb24oVVJMIHVybCkgewotCQkJc3VwZXIodXJsKTsKLQkJCXJlc291cmNlTmFtZSA9IHVybC50b1N0cmluZygpLnN1YnN0cmluZyhVUkxfUFJPVE9DT0wubGVuZ3RoKCkgKyAzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwNTE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSU1hcHBpbmdSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwRmlsZUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuWG1sRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBob2xkIGhlbHBlciBtZXRob2RzIGNvbW1vbiB0byBtdWx0aXBsZSBjbGFzc2VzIGluIHRoZSBhcmNoaXZlIHN1cHBvcnQKLSAqIHBhY2thZ2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVZBID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1NRTEogPSAiLnNxbGoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pTUCA9ICIuanNwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUnVudGltZSA9IGZhbHNlOwotCi0JLyoqCi0JICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0ZW1wIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBmb3IgZXh0cmFjdGluZyBuZXN0ZWQgamFycyBmb3IKLQkgKiByZWFkOyBkZWZhdWx0cyB0byB0cnVlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkID0gdHJ1ZTsKLQotCS8qKgotCSAqIFNldHRhYmxlIG5hbWUgZm9yIHRoZSB0ZW1wIGRpcmVjdG9yeTsgbXVzdCByZXNvbHZlIHRvIGEgdmFsaWQgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW07IGlmIG5vdAotCSAqIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlbXBEaXJlY3RvcnlOYW1lOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmlvLkZpbGUgdGVtcERpcmVjdG9yeTsKLQkKLQkvKioKLQkgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZW1wdHkgZGlyZWN0b3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGR1cmluZyBpbXBvcnQ7IGRlZmF1bHRzIHRvIHRydWUuCi0JICogCi0JICogQHNlZSBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCNpc0luY2x1ZGVFbXB0eURpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gSU5DTFVERV9FTVBUWV9ESVJFQ1RPUklFUyA9IHRydWU7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVUb0phdmFVcmkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpLmNvbmNhdChET1RfSkFWQSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lVG9VcmkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpLmNvbmNhdChET1RfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIEZvciBhIGdpdmVuIHVyaSBvZiBhIC5jbGFzcyBmaWxlLCBkZXJpdmUgdGhlIHVyaSBvZiB0aGUgLmphdmEgZmlsZTsgdGFrZXMgaW50byBjb25zaWRlcmF0aW9uCi0JICogaW5uZXIgY2xhc3NlcyBieSBzcGxpdHRpbmcgb24gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgJyQnCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYSB1cmkgb3IgbnVsbCBpZiB0aGUgaW5wdXQgaXMgbnVsbCBvciBkb2Vzbid0IGVuZCB3aXRoICIuY2xhc3MiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NVcmlUb0phdmFVcmkoU3RyaW5nIGNsYXNzVXJpKSB7Ci0JCWlmIChjbGFzc1VyaSA9PSBudWxsIHx8ICFjbGFzc1VyaS5lbmRzV2l0aChET1RfQ0xBU1MpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHRydW5jYXRlZCA9IHRydW5jYXRlSWdub3JlQ2FzZShjbGFzc1VyaSwgRE9UX0NMQVNTKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJ1bmNhdGVkLCAiJCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0b2submV4dFRva2VuKCkuY29uY2F0KERPVF9KQVZBKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25jYXRlbmF0ZXMgdGhlIHR3byBzdHJpbmdzIHdpdGggYSBzZXBhcmF0b3IsIGlmIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdFVyaShTdHJpbmcgZGlyZWN0b3J5bmFtZSwgU3RyaW5nIGZpbGVuYW1lLCBjaGFyIHNlcGFyYXRvcikgewotCQlTdHJpbmcgdXJpID0gZGlyZWN0b3J5bmFtZTsKLQkJaWYgKCFkaXJlY3RvcnluYW1lLmVuZHNXaXRoKHNlcGFyYXRvciArICIiKSAmJiAhZmlsZW5hbWUuc3RhcnRzV2l0aChzZXBhcmF0b3IgKyAiIikpIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl1cmkgPSB1cmkgKyBzZXBhcmF0b3I7Ci0JCXJldHVybiB1cmkgKyBmaWxlbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0gdXAgdW50aWwgdGhlIGZpcnN0IGVuZCBvZiBmaWxlCi0JICogY2hhcmFjdGVyLCBhbmQgY2xvc2UgdGhlIHR3byBzdHJlYW1zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJdHJ5IHsKLQkJCWludCBuID0gaW4ucmVhZChidWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQoYnVmZmVyKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghKGluIGluc3RhbmNlb2YgWmlwSW5wdXRTdHJlYW0pKQotCQkJCWluLmNsb3NlKCk7Ci0JCQlpZiAoIShvdXQgaW5zdGFuY2VvZiBaaXBPdXRwdXRTdHJlYW0pKQotCQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIHBhcmVudERpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlGaWxlIHRlbXBGaWxlID0gY3JlYXRlVGVtcEZpbGUoYmFzZU5hbWUsIHBhcmVudERpcmVjdG9yeSk7Ci0JCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQl0ZW1wRmlsZS5ta2RpcigpOwotCQlyZXR1cm4gdGVtcEZpbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBiYXNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlbXBGaWxlKGJhc2VOYW1lLCBnZXRUZW1wRGlyZWN0b3J5KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgYmFzZU5hbWUsIEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZVRhaWwoYmFzZU5hbWUpOwotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPCAzKSB7Ci0JCQlmaWxlTmFtZSA9ICJXU1RNUCIgKyBmaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGZpbGVOYW1lLCBudWxsLCBkaXJlY3RvcnkpOwotCQlyZXR1cm4gdGVtcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogZGVsZXRlcyBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW07IGZvciBkaXJlY3RvcmllcywgcmVjdXJzZSB0aGUgc3ViZGlyZWN0b3JpZXMgYW5kIGRlbGV0ZQotCSAqIHRoZW0gYXMgd2VsbAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsOyBmYWxzZSBpZiBhbnkgZmlsZSBvciBzdWIgZmlsZSBjb3VsZCBub3QgYmUgZGVsZXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGUoRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gYUZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFkZWxldGUoZmlsZXNbaV0pKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGZpbGVzLCByZWN1cnNpdmUsIHRoYXQgY2FuJ3QgYmUgd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcml0ZVByb3RlY3RlZEZpbGVzKEZpbGUgYUZpbGUsIExpc3QgYUxpc3QpIHsKLQkJaWYgKGFMaXN0ID09IG51bGwpCi0JCQlhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFGaWxlLmV4aXN0cygpICYmICFhRmlsZS5jYW5Xcml0ZSgpKQotCQkJYUxpc3QuYWRkKGFGaWxlKTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWdldFdyaXRlUHJvdGVjdGVkRmlsZXMoZmlsZXNbaV0sIGFMaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPHA+QWx0ZXJuYXRlIG1ldGhvZCBmb3IgcmVzb2x2aW5nIGNsYXNzIHBhdGggZW50cmllcy48L3A+Ci0JICogCi0JICogPHA+Tm90ZTogTm90IHN1cmUgd2hhdCB0aGlzIGlzIGZvciwgYXMgYSBjbGFzc3BhdGgKLQkgKiBlbnRyeSBzdWNoIGFzICIuLi90YXJnZXRKYXIuamFyIiBzZWVtcyBpbnZhbGlkLCBhcyBpdAotCSAqIHJlYWNoZXMgb3V0c2lkZSBvZiB0aGUgRUFSIGRpcmVjdG9yeS48L3A+Ci0JICogCi0JICogPHA+V2hpbGUgdGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgIi4vIiBmcm9tIGEgY2xhc3NwYXRoIGVudHJ5LAotCSAqIGl0IHdpbGwgbm90IHJlbW92ZSAiLi4vIiwgd2hpY2ggd2lsbCBiZSBhZGRlZCBiYWNrIHdoZW4KLQkgKiBkZXJlc29sdmluZyB0aGUgZW50cnkuICBUaGVyZSBpcyBubyBtZWFuaW5nZnVsIG5hbWUgdG8gYXNzaWduCi0JICogdG8gYW4gZW50aXR5IG91dHNpZGUgb2YgdGhlIGZpbGVzZXQgb2YgdGhlIGNvbnRhaW5lci48L3A+Ci0JICogCi0JICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGVjbGlwc2UgVVJJIGZ1bmN0aW9uLCBhcyBvcHBvc2VkIHRvIHRoZQotCSAqIGltcGxlbWVudGF0aW9uIGluIDxjb2RlPmRlcml2ZUVBUlJlbGF0aXZlVVJJPC9jb2RlPi48L3A+Ci0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IFRoZSBjbGFzcy1wYXRoIGVudHJ5IHdoaWNoIGlzIHRvIGJlIHJlc29sdmVkLgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBhZ2FpbnN0IHdoaWNoIHRvIHJlc29sdmUgdGhlIGVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHRleHQgb2YgdGhlIHJlc29sdmVkIGVudHJ5LgotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcml2ZVJlbGF0aXZlVVJJKFN0cmluZyBjbGFzc3BhdGhFbnRyeSwgQ29udGFpbmVyIGNvbnRhaW5lcikKLQl7Ci0JCVVSSSBjb250YWluZXJVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSggY29udGFpbmVyLmdldFVSSSgpICk7Ci0JCS8vICdjb250YWluZXIuZ2V0VVJJKCknIHJldHVybnMgYSBzdHJpbmcuCi0KLQkJVVJJIGVudHJ5VVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoY2xhc3NwYXRoRW50cnkpOwotCQkKLQkJVVJJIHJlc29sdmVkVVJJID0gZW50cnlVUkkucmVzb2x2ZShjb250YWluZXJVUkkpOwotCQlVUkkgcmVjb3ZlcmVkVVJJID0gcmVzb2x2ZWRVUkkuZGVyZXNvbHZlKGNvbnRhaW5lclVSSSk7Ci0JCQotCQlyZXR1cm4gcmVjb3ZlcmVkVVJJLnRvRmlsZVN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBMZXZlcmFnZSB0aGUgamF2YS5pby5GaWxlIGFwaXMgdG8gcmVzb2x2ZSB0aGluZ3MgbGlrZSAiLi94eHgiIGFuZCAiLi4veHh4IiBpbnRvIHVyaXMgb2YKLQkgKiBlbnRyaWVzIGluIHRoZSBlYXIgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSAtCi0JICogICAgICAgICAgICBhIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBtYW5pZmVzdCBvZgotCSAqIEBhbkFyY2hpdmUKLQkgKiBAcGFyYW0gYW5BcmNoaXZlIC0KLQkgKiAgICAgICAgICAgIHRoZSBhcmNoaXZlIHRvIHdoaWNoIHRoZSBkZXBlbmRlbnQgamFyIGlzIHJlbGF0aXZlCi0JICogCi0JICogQHJldHVybiBhIGNhbmFub25pY2FsaXplZCByZWxhdGl2ZSB1cmkgb2YgYW4gZW50cnkgaW4gYW4gZWFyIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbnQKLQkgKiAgICAgICAgIGphcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcml2ZUVBUlJlbGF0aXZlVVJJKFN0cmluZyBjbGFzc3BhdGhFbnRyeSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGRlcml2ZUVBUlJlbGF0aXZlVVJJKGNsYXNzcGF0aEVudHJ5LCBhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIExldmVyYWdlIHRoZSBqYXZhLmlvLkZpbGUgYXBpcyB0byByZXNvbHZlIHRoaW5ncyBsaWtlICIuL3h4eCIgYW5kICIuLi94eHgiIGludG8gdXJpcyBvZgotCSAqIGVudHJpZXMgaW4gdGhlIGVhciBmaWxlCi0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IC0KLQkgKiAgICAgICAgICAgIGEgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIG1hbmlmZXN0IG9mIGFuIGFyY2hpdmUKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSB1cmkgb2YgdGhlIGFyY2hpdmUgdG8gd2hpY2ggdGhlIGRlcGVuZGVudCBqYXIgaXMgcmVsYXRpdmUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgY2FuYW5vbmljYWxpemVkIHJlbGF0aXZlIHVyaSBvZiBhbiBlbnRyeSBpbiBhbiBlYXIgZmlsZSByZXByZXNlbnRpbmcgdGhlIGRlcGVuZGVudAotCSAqICAgICAgICAgamFyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVyaXZlRUFSUmVsYXRpdmVVUkkoU3RyaW5nIGNsYXNzcGF0aEVudHJ5LCBTdHJpbmcgYXJjaGl2ZVVyaSkgewotCQl0cnkgewotCQkJU3RyaW5nIHBhcmVudCA9IGdldEZpbGVOYW1lUGFyZW50KGFyY2hpdmVVcmkpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcGFyZW50ID0gIi4iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgd29ya2luZ0RpciA9IG5ldyBqYXZhLmlvLkZpbGUoIi4iKS5nZXRDYW5vbmljYWxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJU3RyaW5nIHJlc29sdmVkUGF0aCA9IG5ldyBqYXZhLmlvLkZpbGUocGFyZW50LCBjbGFzc3BhdGhFbnRyeSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aCh3b3JraW5nRGlyKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChyZXNvbHZlZFBhdGguZXF1YWxzKHdvcmtpbmdEaXIpKQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHN0YXJ0ID0gd29ya2luZ0Rpci5lbmRzV2l0aChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKSA/IHdvcmtpbmdEaXIubGVuZ3RoKCkgOiB3b3JraW5nRGlyLmxlbmd0aCgpICsgMTsKLQkJCXJldHVybiByZXNvbHZlZFBhdGguc3Vic3RyaW5nKHN0YXJ0LCByZXNvbHZlZFBhdGgubGVuZ3RoKCkpLnJlcGxhY2UoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vZ2V0Q2Fub25pY2FsUGF0aCBjb3VsZCB0aHJvdyB0aGlzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiAiIiBpZiB0aGVyZSBpcyBubyBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZUV4dGVuc2lvbihTdHJpbmcgdXJpKSB7Ci0KLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IGZyb20gdGhlIHVyaSwgb3IgdGhlIHRydW5jYXRpb24gb2YgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3QKLQkgKiBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVQYXJlbnQoU3RyaW5nIHVyaSkgewotCQlpZiAodXJpPT1udWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCkgLSAxKTsKLQkJaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChsYXN0SW5kZXggPT0gMCkKLQkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSB1cmksIG9yIHRoZSBzZWdtZW50IGFmdGVyIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZVRhaWwoU3RyaW5nIHVyaSkgewotCQlTdHJpbmcgdGVtcFVSSSA9IHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXdoaWxlICh0ZW1wVVJJLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBVUkkgPSB0ZW1wVVJJLnN1YnN0cmluZygwLCB0ZW1wVVJJLmxlbmd0aCgpIC0gMSk7Ci0JCWludCBsYXN0SW5kZXggPSB0ZW1wVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChsYXN0SW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJpOwotCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCB0ZW1wVVJJLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIG9iamVjdCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCByZXR1cm4gdGhlIG93bmluZyBtb2R1bGUgZmlsZTsgZm9yCi0JICogZXhhbXBsZSwgcmV0cmlldmUgdGhlIEVKQkphckZpbGUgdGhhdCBvd25zIHRoZSBFSkJKYXIuIFRoaXMgd29ya3MgZXZlbiBmb3IgYWx0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKEVPYmplY3QgZGRPYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gZGRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFyY2hpdmUgYXJjaGl2ZSA9IGdldEFyY2hpdmUocmVzKTsKLQkJaWYgKGFyY2hpdmUgPT0gbnVsbCB8fCAhYXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghKHJlcyBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVhNTFJlc291cmNlIHhtbFJlcyA9IChYTUxSZXNvdXJjZSkgcmVzOwotCQlpZiAoeG1sUmVzLmlzQWx0KCkpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlRmlsZVVzaW5nQWx0REQoKEVBUkZpbGUpIGFyY2hpdmUsIHJlcyk7Ci0KLQkJcmV0dXJuIChNb2R1bGVGaWxlKSBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlVXNpbmdBbHRERChFQVJGaWxlIGVhciwgUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB1cmkgPSByZXMuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJTW9kdWxlIG0gPSBlYXIuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVIYXZpbmdBbHRERCh1cmkpOwotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZHVsZVJlZiByZWYgPSBlYXIuZ2V0TW9kdWxlUmVmKG0pOwotCQlpZiAocmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gcmVmLmdldE1vZHVsZUZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVGaWxlVHlwZU5hbWUoaW50IG1vZHVsZVR5cGUpIHsKLQkJc3dpdGNoIChtb2R1bGVUeXBlKSB7Ci0JCQljYXNlIFhNTFJlc291cmNlLkFQUExJQ0FUSU9OX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfQXBwbGljYXRpb25fZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLkFQUF9DTElFTlRfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQW5fQXBwbGljYXRpb25fQ2xpZW50X0pBUl9maWxlOyAKLQkJCWNhc2UgWE1MUmVzb3VyY2UuRUpCX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFuX0VKQl9KQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQV9XQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLlJBUl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX1JBUl9maWxlOyAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIHJlc291cmNlLCByZXR1cm4gdGhlIG93bmluZyBtb2R1bGUgZmlsZTsgZm9yIGV4YW1wbGUsIHJldHJpZXZlIHRoZSBFSkJKYXJGaWxlCi0JICogdGhhdCBvd25zIHRoZSBFSkJKYXIuIEluIHRoZSBjYXNlIG9mIGFsdHMsIHRoaXMgcmV0dXJucyB0aGUgRUFSRmlsZSBhbmQgbm90IHRoZSBtb2R1bGUgZmlsZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbDsgY2xpZW50cyBzaG91bGQgdXNlIHtAbGluayAjZ2V0TW9kdWxlRmlsZShFT2JqZWN0KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmUgZ2V0QXJjaGl2ZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVVSSUNvbnZlcnRlciBjb252ID0gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlpZiAoY29udiA9PSBudWxsIHx8ICEoY29udiBpbnN0YW5jZW9mIEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoKEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKSBjb252KS5nZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgaXMgdXNlZCBpbiB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TVXJpKFN0cmluZyB1cmkpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCWlmIChzZXAgIT0gJy8nKQotCQkJcmV0dXJuIHVyaS5yZXBsYWNlKCcvJywgc2VwKTsKLQkJcmV0dXJuIHVyaS5yZXBsYWNlKCdcXCcsIHNlcCk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgaXMgdXNlZCBpbiB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TVXJpKFN0cmluZyBkaXJlY3RvcnluYW1lLCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nIG9zRGlyTmFtZSA9IGdldE9TVXJpKGRpcmVjdG9yeW5hbWUpOwotCQlTdHJpbmcgb3NGaWxlTmFtZSA9IGdldE9TVXJpKGZpbGVuYW1lKTsKLQkJcmV0dXJuIGNvbmNhdFVyaShvc0Rpck5hbWUsIG9zRmlsZU5hbWUsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZXh0ZW50IG9mIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEB0aHJvd3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBleHRlbnQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0Um9vdChSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWlmIChleHRlbnQuc2l6ZSgpIDwgMSkgewotCQkJdGhyb3cgbmV3IEVtcHR5UmVzb3VyY2VFeGNlcHRpb24oYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiAoRU9iamVjdCkgZXh0ZW50LmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdGVtcERpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxOjE2OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3RvcnlOYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBnZXRUb2tlbnMoYVN0cmluZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gKGRlbGltaXRlciA9PSBudWxsKSA/IG5ldyBTdHJpbmdUb2tlbml6ZXIoYVN0cmluZykgOiBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcsIGRlbGltaXRlcik7Ci0JCWludCBzaXplID0gdG9rLmNvdW50VG9rZW5zKCk7Ci0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiB0b2suaGFzTW9yZVRva2VucygpOyBpKyspIHsKLQkJCXRva2Vuc1tpXSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlSWdub3JlS2V5Q2FzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKGphdmEubGFuZy5TdHJpbmcga2V5LCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgYXR0cikgewotCQlJdGVyYXRvciBrZXlzQW5kVmFsdWVzID0gYXR0ci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzQW5kVmFsdWVzLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkga2V5c0FuZFZhbHVlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgZW50cnlLZXkgPSBlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpOwotCQkJaWYgKGVudHJ5S2V5LmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsID8gbnVsbCA6IGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5mb3JtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gdXAgdW50aWwgdGhlIGZpcnN0IGVuZCBvZiBmaWxlIGNoYXJhY3RlciwgYWRkIHRoaXMKLQkgKiBkYXRhIHRvIGEgYnl0ZSBhcnJheSwgYW5kIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW07IHJldHVybnMgdGhlIGJ5dGUgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBpbnB1dFN0cmVhbVRvQnl0ZXMoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWNvcHkoaW4sIG91dCk7Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBKYXZhVVJMLmlzSmF2YVVSTChhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVnaXN0ZXJlZFVSSU1hcHBpbmcoUmVzb3VyY2UgcmVzKSB7Ci0JCXJldHVybiBVUklNYXBwaW5nUmVnaXN0cnlJbXBsLklOU1RBTkNFLmdldFVSSShyZXMuZ2V0VVJJKCkpICE9IHJlcy5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybU1ldGFSZXNvdXJjZShSZXNvdXJjZSByZXMpIHsKLQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJcmV0dXJuICJwbGF0Zm9ybSIuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgIm1ldGEiLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lKCkgewotCQlyZXR1cm4gaXNSdW50aW1lOwotCX0KLQotCS8qKgotCSAqIElzIGl0IHdpdGhpbiB0aGUgc3BlYyBmb3IgdGhlIEpBUiBvciBtb2R1bGUgZmlsZSB0byByZWZlcmVuY2UgdGhlIGFyY2hpdmUgdmlhIHRoZSBNYW5pZmVzdAotCSAqIENsYXNzLVBhdGg/Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWREZXBlbmRlbmN5KEFyY2hpdmUgcmVmZXJlbmNlZEpBUiwgQXJjaGl2ZSByZWZlcmVuY2luZ0pBUikgewotCQkvL05vIG90aGVyIG1vZHVsZXMgc2hvdWxkIHJlZmVyZW5jZSB3YXJzCi0JCWlmIChyZWZlcmVuY2VkSkFSLmlzV0FSRmlsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChyZWZlcmVuY2VkSkFSID09IHJlZmVyZW5jaW5nSkFSKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vQ2xpZW50cyBjYW4gcmVmZXJlbmNlIGFsbCBidXQgdGhlIFdBUnMsIHdoaWNoIHdlJ3ZlIGFscmVhZHkgY292ZXJlZAotCQkvLyBhYm92ZTsgV0FScyBhbmQgRUpCIEpBUnMKLQkJLy9jYW4gcmVmZXJlbmNlIGFsbCBidXQgV0FScywgYWJvdmUsIG9yIEFwcGxpY2F0aW9uQ2xpZW50cwotCQlyZXR1cm4gcmVmZXJlbmNpbmdKQVIuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB8fCAhcmVmZXJlbmNlZEpBUi5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgcHJvcGVydGllcyBmaWxlIHdpdGggdGhlIGdpdmVuIHVyaSBmcm9tIHRoZSBnaXZlbiBhcmNoaXZlCi0JICogCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzIHJlYWRpbmcgdGhlIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoQXJjaGl2ZSBhcmNoaXZlLCBTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXAubG9hZChpbik7Ci0JCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SXNSdW50aW1lKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaXNSdW50aW1lID0gYUJvb2xlYW47Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZChib29sZWFuIHZhbHVlKSB7Ci0JCXNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMToyNjoyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGVtcERpcmVjdG9yeQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRlbXBEaXJlY3RvcnkoamF2YS5pby5GaWxlIG5ld1RlbXBEaXJlY3RvcnkpIHsKLQkJdGVtcERpcmVjdG9yeSA9IG5ld1RlbXBEaXJlY3Rvcnk7Ci0JCXRlbXBEaXJlY3RvcnlOYW1lID0gbmV3VGVtcERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wIGRpcmVjdG9yeSB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IGNyZWF0ZXMgaXQgYW5kIHNldHMgaXQgdG8gYmUgZGVsZXRlZCBvbiBleGl0Ci0JICogaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIG5ld1RlbXBEaXJlY3RvcnlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHRocm93cyBBcmNoaXZlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgYW5kIGNhbiBub3QgYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZW1wRGlyZWN0b3J5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1RlbXBEaXJlY3RvcnlOYW1lKSB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBkaXIgPSBuZXcgamF2YS5pby5GaWxlKG5ld1RlbXBEaXJlY3RvcnlOYW1lKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJCWlmICghZGlyLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBBcmNoaXZlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIubWFrZV90ZW1wX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde25ld1RlbXBEaXJlY3RvcnlOYW1lfSkpKTsgLy8gPSAiVW5hYmxlIHRvIG1ha2UgdGVtcCBkaXJlY3Rvcnk6ICIKLQkJCURlbGV0ZU9uRXhpdFV0aWxpdHkubWFya0ZvckRlbGV0aW9uKGRpcik7Ci0JCX0KLQkJc2V0VGVtcERpcmVjdG9yeShkaXIpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDE6MDg6MjAgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkKCkgewotCQlyZXR1cm4gc2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBzdHJpbmcgZWxlbWVudHMgdG8gYW4gYXJyYXkgb2YgZmlsZSBVUkxzOyBpZiBhbiBlbnRyeSBpcyByZWxhdGl2ZSwgbWFrZQotCSAqIGl0IHJlbGF0aXZlIHRvIHRoZSB1cmkgcm9vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJMW10gdG9Mb2NhbFVSTHMoTGlzdCBlbnRyaWVzLCBTdHJpbmcgdXJpUm9vdCkgewotCQlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHBhdGhFbnRyeSA9IChTdHJpbmcpIGVudHJpZXMuZ2V0KGkpOwotCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoRW50cnkpOwotCQkJaWYgKCFhRmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQlwYXRoRW50cnkgPSBnZXRPU1VyaSh1cmlSb290LCBwYXRoRW50cnkpOwotCQkJCWFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoRW50cnkpOwotCQkJfQotCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkgewotCQkJCS8vaW5mb3JtKCJDbGFzc3BhdGggZWxlbWVudCAiICsgcGF0aEVudHJ5ICsgIiBkb2VzIG5vdAotCQkJCS8vIGV4aXN0Iik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWlmICghcGF0aEVudHJ5LmVuZHNXaXRoKGphdmEuaW8uRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQkJCXBhdGhFbnRyeSA9IHBhdGhFbnRyeSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJWmlwRmlsZSB6aXAgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXppcCA9IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGFGaWxlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaW5mb3JtKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuaW52YWxpZF9jbGFzc3BhdGhfV0FSTl8sIChuZXcgT2JqZWN0W117cGF0aEVudHJ5fSkpKTsgLy8gPSAiQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgWmlwIGZpbGUiCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmICh6aXAgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGhFbnRyeSk7Ci0JCQkJamF2YS5uZXQuVVJMIGFVcmwgPSBhRmlsZS50b1VSTCgpOyAKLQkJCQl1cmxzLmFkZChhVXJsKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotCQkJCWluZm9ybShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmludmFsaWRfY3BfZmlsZV9XQVJOXywgKG5ldyBPYmplY3RbXXtwYXRoRW50cnl9KSkpOyAvLyA9ICJDbGFzc3BhdGggZWxlbWVudCAiezB9IiBkb2VzIG5vdCBwb2ludCB0byBhIGxvY2FsIGZpbGUiCi0JCQl9Ci0JCX0KLQkJamF2YS5uZXQuVVJMW10gdXJsQXJyYXkgPSBuZXcgamF2YS5uZXQuVVJMW3VybHMuc2l6ZSgpXTsKLQkJcmV0dXJuIChqYXZhLm5ldC5VUkxbXSkgdXJscy50b0FycmF5KHVybEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWJzdHJpbmcgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciwgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcHJlZml4Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgbGVhZGluZ1N1YlN0cmluZykgewotCQlpZiAoIWFTdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGxlYWRpbmdTdWJTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQlyZXR1cm4gYVN0cmluZzsKLQkJcmV0dXJuIGFTdHJpbmcuc3Vic3RyaW5nKGxlYWRpbmdTdWJTdHJpbmcubGVuZ3RoKCksIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1YnN0cmluZyBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLCB1cCB0byB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2Vjb25kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGVJZ25vcmVDYXNlKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgdHJhaWxpbmdTdWJTdHJpbmcpIHsKLQkJaW50IGluZGV4ID0gYVN0cmluZy50b0xvd2VyQ2FzZSgpLmxhc3RJbmRleE9mKHRyYWlsaW5nU3ViU3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gYVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlUb0NsYXNzTmFtZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB0cnVuY2F0ZUlnbm9yZUNhc2UodXJpLnJlcGxhY2UoJy8nLCAnLicpLCBET1RfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyRUUxM0Zhc3RDaGVjayhNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJaWYgKG1vZHVsZUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCVN0cmluZyB1cmkgPSBtb2R1bGVGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0JCXRyeSB7Ci0JCQlpbiA9IG1vZHVsZUZpbGUuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQotCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBYbWxEb2N1bWVudFJlYWRlci5yZWFkRG9jdW1lbnRUeXBlKGluLCB1cmkpOwotCQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBpZHMgPSBnZXRKMkVFMTNQdWJsaWNBbmRTeXN0ZW1JZEZvcihtb2R1bGVGaWxlKTsKLQkJCWlmIChpZHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gaWRzWzBdLmVxdWFscyhkb2NUeXBlLmdldFB1YmxpY0lkKCkpICYmIGlkc1sxXS5lcXVhbHMoZG9jVHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0SjJFRTEzUHVibGljQW5kU3lzdGVtSWRGb3IoTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMywgSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzAsIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMH07Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMywgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMywgSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wLCBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzB9OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL1RPRE8gZG9pbmcgdGhlIHBhcnNlIHdpdGggU0FYIHdvdWxkIGJlIGZhc3RlcgotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZhc3RTcGVjVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlTdHJpbmcgdXJpID0gbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCQl0cnkgewotCQkJaW4gPSBtb2R1bGVGaWxlLmdldElucHV0U3RyZWFtKHVyaSk7Ci0KLQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gbnVsbDsKLQotCQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGluKTsKLQkJCUdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBhUmVhZGVyID0gbmV3IFhtbERvY3VtZW50UmVhZGVyKHNvdXJjZSk7Ci0JCQlhUmVhZGVyLnNldFZhbGlkYXRlKGZhbHNlKTsKLQkJCURvY3VtZW50IGFEb2N1bWVudCA9IGFSZWFkZXIucGFyc2VEb2N1bWVudCgpOwotCQkJaWYgKGFEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZG9jVHlwZSA9IGFEb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCQl9Ci0JCQlpbnQgdmVyc2lvbiA9IC0xOwotCQkJaWYgKG51bGwgIT0gZG9jVHlwZSkgewotCQkJCVN0cmluZyBwdWJsaWNJRCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJCQlTdHJpbmcgc3lzdGVtSUQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uID0gbG9va3VwVmVyc2lvbihtb2R1bGVGaWxlLCBwdWJsaWNJRCwgc3lzdGVtSUQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IC0xKSB7Ci0JCQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBudWxsOwotCQkJCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoYURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKG51bGwgPT0gZG9jVHlwZSkgewotCQkJCQkJTmFtZWROb2RlTWFwIG1hcCA9IGFEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAobnVsbCAhPSBtYXApIHsKLQkJCQkJCQlOb2RlIHNjaGVtYU5vZGUgPSBtYXAuZ2V0TmFtZWRJdGVtKCJ4c2k6c2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChudWxsICE9IHNjaGVtYU5vZGUpIHsKLQkJCQkJCQkJc2NoZW1hTmFtZSA9IHNjaGVtYU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCU5vZGUgdmVyc2lvbk5vZGUgPSBtYXAuZ2V0TmFtZWRJdGVtKCJ2ZXJzaW9uIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChudWxsICE9IHZlcnNpb25Ob2RlKSB7Ci0JCQkJCQkJCXZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gc2NoZW1hTmFtZSkgewotCQkJCQl2ZXJzaW9uID0gbG9va3VwVmVyc2lvbihtb2R1bGVGaWxlLCBzY2hlbWFOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKHZlcnNpb24gPT0gLTEpIHsKLQkJCQkJdmVyc2lvbiA9IHBhcnNlVmVyc2lvblN0cmluZyhtb2R1bGVGaWxlLCB2ZXJzaW9uU3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIC0xOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBwYXJzZVZlcnNpb25TdHJpbmcoTW9kdWxlRmlsZSBtb2R1bGVGaWxlLCBTdHJpbmcgdmVyc2lvbkF0dHIpIHsKLQkJaW50IHZlcnNpb24gPSAtMTsKLQkJaWYgKG1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBsb29rdXBWZXJzaW9uKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgU3RyaW5nIHNjaGVtYU5hbWUpIHsKLQkJaW50IHZlcnNpb24gPSAtMTsKLQkJaWYgKG1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV8xXzQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlmICgoc2NoZW1hTmFtZS5pbmRleE9mKEoyRUVDb25zdGFudHMuRUpCSkFSX1NDSEVNQV8yXzFfTlMpKSAhPSAtMSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfMV80KSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8zKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMykpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzIpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzIpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8yKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzApfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfQUxUX1NZU1RFTUlEXzJfMCkpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8xXzEpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMV8xKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8xXzEpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMyl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMikgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzIpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfQUxUX1NZU1RFTUlEXzJfMikpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9BTFRfU1lTVEVNSURfMV8wKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ2xhc3NwYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTdkY2ZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ2xhc3NwYXRoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzTWFuaWZlc3QoU3RyaW5nIGluUGF0aCwgTGlzdCBydENsYXNzcGF0aCwgU2V0IHByb2Nlc3NlZFBhdGhzKSB7Ci0JCUFycmF5TGlzdCBwYXRocyA9IGdldE1hbmlmZXN0UGF0aHMoaW5QYXRoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5zaXplKCk7IGkrKykgewotCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgcGF0aHMuZ2V0KGkpOwotCQkJaWYgKCFwcm9jZXNzZWRQYXRocy5jb250YWlucyhlbnRyeSkpIHsKLQkJCQlwcm9jZXNzZWRQYXRocy5hZGQoZW50cnkpOwotCQkJCXJ0Q2xhc3NwYXRoLmFkZChlbnRyeSk7Ci0JCQkJcHJvY2Vzc01hbmlmZXN0KGVudHJ5LmdldEFic29sdXRlUGF0aCgpLCBydENsYXNzcGF0aCwgcHJvY2Vzc2VkUGF0aHMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnkgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBhYnNvbHV0ZVBhdGgsIFN0cmluZyBtYW5pZmVzdFZhbHVlKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsKCk7Ci0JCWVudHJ5LnNldEFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpOwotCQllbnRyeS5zZXRNYW5pZmVzdFZhbHVlKG1hbmlmZXN0VmFsdWUpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3QgZ2V0TWFuaWZlc3RQYXRocyhTdHJpbmcgcGF0aCkgewotCQlBcnJheUxpc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChmLmV4aXN0cygpKSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJRmlsZSBtYW5pZmVzdEZpbGUgPSBuZXcgRmlsZShwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiTUFOSUZFU1QuTUYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgewotCQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7Ci0JCQkJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbnB1dFN0cmVhbSk7Ci0JCQkJCQltYW5pZmVzdFBhdGhzID0gZ2V0TWFuaWZlc3RDbGFzc1BhdGhzKG1hbmlmZXN0LCBmLmdldFBhcmVudCgpKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChudWxsICE9IGlucHV0U3RyZWFtKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlqYXJGaWxlID0gbmV3IEphckZpbGUoZik7Ci0JCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gamFyRmlsZS5nZXRNYW5pZmVzdCgpOwotCQkJCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkKLQkJCQkJCW1hbmlmZXN0UGF0aHMgPSBnZXRNYW5pZmVzdENsYXNzUGF0aHMobWFuaWZlc3QsIGYuZ2V0UGFyZW50KCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoamFyRmlsZSAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlqYXJGaWxlLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vSWdub3JlCi0JCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYW5pZmVzdFBhdGhzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQXJyYXlMaXN0IGdldE1hbmlmZXN0Q2xhc3NQYXRocyhNYW5pZmVzdCBtYW5pZmVzdCwgU3RyaW5nIGFyY2hpdmVQYXRoKSB7Ci0JCUFycmF5TGlzdCBwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXR0cmlidXRlcyBtYWluID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IG1haW4uZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotCQlpZiAoY2xhc3NQYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQYXRoLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJU3RyaW5nIHBhdGggPSBhcmNoaXZlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgdG9rZW47Ci0JCQkJcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGF0aCk7Ci0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJCXBhdGhMaXN0LmFkZChjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCwgdG9rZW4pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGhMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCXRyeSB7Ci0JCQlmID0gZi5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gZi5nZXRQYXRoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjhjZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci0KLQotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChDb21tb25hcmNoaXZlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSB0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZVN3aXRjaCBzdyA9IG5ldyBDb21tb25hcmNoaXZlU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXIoQ29udGFpbmVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVdBUkZpbGUoV0FSRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXQVJGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlRmlsZShNb2R1bGVGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQVJGaWxlKEVBUkZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUFSRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZShFSkJKYXJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUkFSRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmUoQXJjaGl2ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcmNoaXZlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRmlsZShGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeShSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIHN3LmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRhaW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkNvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUNvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXQVJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUkZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUkFSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyY2hpdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCQ2xpZW50SmFyRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTW9kdWxlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViTW9kdWxlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2xpZW50TW9kdWxlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ29tbW9uYXJjaGl2ZVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmUoQXJjaGl2ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckZpbGUoRUpCSmFyRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdBUkZpbGUoV0FSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGUoRUFSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUFSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lcihDb250YWluZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5KFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGUoUkFSRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUkFSRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZVJlZihNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1vZHVsZVJlZihFSkJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYk1vZHVsZVJlZihXZWJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNsaWVudE1vZHVsZVJlZihDbGllbnRNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3Rvck1vZHVsZVJlZihDb25uZWN0b3JNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLiBJdCdzIHVzZWZ1bCB0bwotCSAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXQVJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUkZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUkFSRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyY2hpdmVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2ZiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uYXJjaGl2ZVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5OwotCi0JcHVibGljIENvbW1vbmFyY2hpdmVTd2l0Y2goKSB7Ci0JCWZhY3RvcnkgPSAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQltb2RlbFBhY2thZ2UgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSAhPSBtb2RlbFBhY2thZ2UpCi0JCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0KLQkJc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEUgOiB7Ci0JCQkJV0FSRmlsZSBjYXN0ZWRPYmplY3QgPSAoV0FSRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdBUkZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFIDogewotCQkJCUVBUkZpbGUgY2FzdGVkT2JqZWN0ID0gKEVBUkZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFQVJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRSA6IHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2FzdGVkT2JqZWN0ID0gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFIDogewotCQkJCUVKQkphckZpbGUgY2FzdGVkT2JqZWN0ID0gKEVKQkphckZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRSA6IHsKLQkJCQlSQVJGaWxlIGNhc3RlZE9iamVjdCA9IChSQVJGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUkFSRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRSA6IHsKLQkJCQlBcmNoaXZlIGNhc3RlZE9iamVjdCA9IChBcmNoaXZlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEUgOiB7Ci0JCQkJRmlsZSBjYXN0ZWRPYmplY3QgPSAoRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUlkgOiB7Ci0JCQkJUmVhZE9ubHlEaXJlY3RvcnkgY2FzdGVkT2JqZWN0ID0gKFJlYWRPbmx5RGlyZWN0b3J5KSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfSAvLyBkb1N3aXRjaAotCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZShXQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGUoRUFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZShFSkJKYXJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmUoQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlRmlsZShGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeShSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVSZWYoTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNb2R1bGVSZWYoRUpCTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGVSZWYoV2ViTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDbGllbnRNb2R1bGVSZWYoQ2xpZW50TW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGVSZWYoQ29ubmVjdG9yTW9kdWxlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2hHZW4oRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRTogewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWxlKGZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRTogewotCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKGFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFOiB7Ci0JCQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphckZpbGUoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEU6IHsKLQkJCQlXQVJGaWxlIHdhckZpbGUgPSAoV0FSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0FSRmlsZSh3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRTogewotCQkJCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFQVJGaWxlKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcGxpY2F0aW9uQ2xpZW50RmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRTogewotCQkJCU1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUobW9kdWxlRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUobW9kdWxlRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobW9kdWxlRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVI6IHsKLQkJCQlDb250YWluZXIgY29udGFpbmVyID0gKENvbnRhaW5lcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShjb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZOiB7Ci0JCQkJUmVhZE9ubHlEaXJlY3RvcnkgcmVhZE9ubHlEaXJlY3RvcnkgPSAoUmVhZE9ubHlEaXJlY3RvcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlYWRPbmx5RGlyZWN0b3J5KHJlYWRPbmx5RGlyZWN0b3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIocmVhZE9ubHlEaXJlY3RvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUocmVhZE9ubHlEaXJlY3RvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJlYWRPbmx5RGlyZWN0b3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFOiB7Ci0JCQkJUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJBUkZpbGUocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRjogewotCQkJCU1vZHVsZVJlZiBtb2R1bGVSZWYgPSAoTW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYobW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUY6IHsKLQkJCQlFSkJNb2R1bGVSZWYgZWpiTW9kdWxlUmVmID0gKEVKQk1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCTW9kdWxlUmVmKGVqYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGVqYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGOiB7Ci0JCQkJV2ViTW9kdWxlUmVmIHdlYk1vZHVsZVJlZiA9IChXZWJNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYk1vZHVsZVJlZih3ZWJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZih3ZWJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRjogewotCQkJCUNsaWVudE1vZHVsZVJlZiBjbGllbnRNb2R1bGVSZWYgPSAoQ2xpZW50TW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDbGllbnRNb2R1bGVSZWYoY2xpZW50TW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYoY2xpZW50TW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjbGllbnRNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUY6IHsKLQkJCQlDb25uZWN0b3JNb2R1bGVSZWYgY29ubmVjdG9yTW9kdWxlUmVmID0gKENvbm5lY3Rvck1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29ubmVjdG9yTW9kdWxlUmVmKGNvbm5lY3Rvck1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGNvbm5lY3Rvck1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29ubmVjdG9yTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJHZW4oQ29udGFpbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlR2VuKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGVHZW4oTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlR2VuKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZUdlbihFQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlR2VuKEVKQkphckZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGVHZW4oUkFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZUdlbihBcmNoaXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlR2VuKEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5R2VuKFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlR2VuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbW1vbmFyY2hpdmVTd2l0Y2gKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWQ1ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlT25FeGl0VXRpbGl0eSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFya0ZvckRlbGV0aW9uKEZpbGUgZmlsZSkgewotCQlvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuRGVsZXRlT25FeGl0VXRpbGl0eS5tYXJrRm9yRGVsZXRpb24oZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGVIYXNCZWVuRGVsZXRlZChGaWxlIGZpbGUpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkRlbGV0ZU9uRXhpdFV0aWxpdHkuZmlsZUhhc0JlZW5EZWxldGVkKGZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5DbGVhbnVwKCkgewotCQlvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuRGVsZXRlT25FeGl0VXRpbGl0eS5ydW5DbGVhbnVwKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRUFSRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRUFSRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyZTk1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIEVBUkZpbGVVdGlsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFQVJGaWxlVXRpbC4KLQkgKi8KLQlwcml2YXRlIEVBUkZpbGVVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtb2R1bGUgZmlsZXMgd2hpY2ggYXJlIGEgc3BlYyBsZXZlbCB0b28gaGlnaCBmb3IgdGhlIEVBUiBmaWxlLiBJZiB0aGUKLQkgKiBFQVIgaXMgMS4zLCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIE90aGVyd2lzZSByZXR1cm5zIGFueSBKMkVFIDEuMyBtb2R1bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbmNvbXBhdGlibGUxM01vZHVsZUZpbGVzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlpZiAoaXNKMkVFMTMoZWFyRmlsZSkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlMaXN0IG1vZHVsZUZpbGVzID0gZWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKSBtb2R1bGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoaXNKMkVFMTMoYU1vZHVsZUZpbGUpKQotCQkJCXJlc3VsdC5hZGQoYU1vZHVsZUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG1vZHVsZSBmaWxlcyB3aGljaCBhcmUgYSBzcGVjIGxldmVsIHRvbyBoaWdoIGZvciB0aGUgRUFSIGZpbGUuIElmIHRoZQotCSAqIEVBUiBpcyAxLjQsIHJldHVybnMgYW4gZW1wdHkgbGlzdC4gT3RoZXJ3aXNlIHJldHVybnMgYW55IEoyRUUgMS40IG1vZHVsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEluY29tcGF0aWJsZTE0TW9kdWxlRmlsZXMoRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCWlmIChpc0oyRUUxNChlYXJGaWxlKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUxpc3QgbW9kdWxlRmlsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVGaWxlIGFNb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpIG1vZHVsZUZpbGVzLmdldChpKTsKLQkJCWlmIChpc0oyRUUxNChhTW9kdWxlRmlsZSkpCi0JCQkJcmVzdWx0LmFkZChhTW9kdWxlRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKMkVFMTMoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgewotCQl0cnkgewotCQkJWE1MUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGFNb2R1bGVGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCXJldHVybiB4bWxSZXNvdXJjZS5nZXRKMkVFVmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSjJFRTE0KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlc291cmNlIHhtbFJlc291cmNlID0gKFhNTFJlc291cmNlKSBhTW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlyZXR1cm4geG1sUmVzb3VyY2UuZ2V0SjJFRVZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRmlsZUR1cHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRmlsZUR1cHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlNmM4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEwOjI4OjQ0IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRHVwcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHNGaWxlcyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHNEdXBzID0gMDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgc0pBUnMgPSAwOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRW50cnlOYW1lcyA9IG5ldyBTdHJpbmdbXXsiY29tL2libS9pdmovZWpiL3J1bnRpbWUvX0NvcHlIZWxwZXJfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fSG9tZUhhbmRsZV9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YXgvZWpiL19IYW5kbGVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fRUpCT2JqZWN0X1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZheC9lamIvX0VKQkhvbWVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmEvbGFuZy9fQ2xvbmVhYmxlX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJImNvbS9pYm0vd2Vic3BoZXJlL2NzaS9fVHJhbnNhY3Rpb25hbE9iamVjdF9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjb20vaWJtL3dlYnNwaGVyZS9jc2kvX0NTSVNlcnZhbnRfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS9lanMvY29udGFpbmVyL19FSlNXcmFwcGVyX1RpZS5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS9lanMvY29udGFpbmVyL19FSlNXcmFwcGVyX1N0dWIuY2xhc3MiIC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQgZXhjbHVkZWQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGV4Y2x1ZGVkRW50cnlOYW1lcykpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnksIE1hcCBtYXAsIFN0cmluZyBqYXJOYW1lKSB7Ci0JCXNGaWxlcysrOwotCi0JCU9iamVjdCBjdXJyZW50ID0gbWFwLmdldChlbnRyeSk7Ci0JCWlmIChjdXJyZW50ID09IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGVudHJ5IGlzIGZvdW5kCi0JCQltYXAucHV0KGVudHJ5LCBqYXJOYW1lKTsKLQkJfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkvLyBUaGVyZSBpcyBvbmUgb3RoZXIgZW50cnkKLQkJCW1hcC5yZW1vdmUoZW50cnkpOwotCi0JCQlTdHJpbmcgb3RoZXIgPSAoU3RyaW5nKSBjdXJyZW50OwotCQkJTGlua2VkTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCWxpc3QuYWRkRmlyc3Qob3RoZXIpOwotCQkJbGlzdC5hZGRGaXJzdChqYXJOYW1lKTsKLQkJCW1hcC5wdXQoZW50cnksIGxpc3QpOwotCi0JCQlzRHVwcysrOwotCQl9IGVsc2UgewotCQkJLy8gVGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgb3RoZXIgaW5zdGFuY2VzCi0JCQlMaW5rZWRMaXN0IGxpc3QgPSAoTGlua2VkTGlzdCkgY3VycmVudDsKLQkJCWxpc3QuYWRkRmlyc3QoamFyTmFtZSk7Ci0KLQkJCXNEdXBzKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiRmlsZUR1cHMgdXRpbGl0eVxyXG5cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCgiU3lub3BzaXM6XHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIkFuYWx5emVzIEpBUiBhbmQgWklQIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciBkdXBsaWNhdGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUuICBUaGlzIGV4Y2x1ZGVzIGFsbCBlbnRyaWVzIGluIHRoZSBcIk1FVEEtSU5GXCIgZGlyZWN0b3J5IG9mIHRoZSBhcmNoaXZlLiAgVGhpcyBkb2VzIG5vdCBjaGVjayB0aW1lc3RhbXBzIG9yIHNpemUuXHJcblxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJVc2FnZTogRmlsZUR1cHMgZGlyTmFtZVxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVHJlZU1hcCBtYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShhcmdzW2ldKTsKLQkJCQlwcm9jZXNzRGlyZWN0b3J5KHJvb3QsIG1hcCk7Ci0JCQl9Ci0KLQkJCVRyZWVNYXAgb3V0cHV0TWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCQkJU2V0IHNldCA9IG1hcC5lbnRyeVNldCgpOwotCQkJSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgbWUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IG8gPSBtZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTGlua2VkTGlzdCkgewotCQkJCQlTdHJpbmdCdWZmZXIgamFycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkJCQlMaW5rZWRMaXN0IGxpc3QgPSAoTGlua2VkTGlzdCkgbzsKLQkJCQkJSXRlcmF0b3IgZW50cnlJdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoZW50cnlJdGVyLmhhc05leHQoKSkgewotCQkJCQkJamFycy5hcHBlbmQoZW50cnlJdGVyLm5leHQoKSk7Ci0JCQkJCQlqYXJzLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlMaW5rZWRMaXN0IG91dHB1dExpc3QgPSAoTGlua2VkTGlzdCkgb3V0cHV0TWFwLmdldChqYXJzLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAob3V0cHV0TGlzdCA9PSBudWxsKSB7Ci0JCQkJCQlvdXRwdXRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCQkJCW91dHB1dE1hcC5wdXQoamFycy50b1N0cmluZygpLCBvdXRwdXRMaXN0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRMaXN0LmFkZEZpcnN0KG1lLmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVNldCBvdXRTZXQgPSBvdXRwdXRNYXAuZW50cnlTZXQoKTsKLQkJCWl0ID0gb3V0U2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IG1lID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBqYXJzID0gKFN0cmluZykgbWUuZ2V0S2V5KCk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoamFycywgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQkJfQotCi0JCQkJTGlua2VkTGlzdCBsaXN0ID0gKExpbmtlZExpc3QpIG1lLmdldFZhbHVlKCk7Ci0JCQkJSXRlcmF0b3IgZW50cnlJdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChlbnRyeUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICIgKyAoU3RyaW5nKSBlbnRyeUl0ZXIubmV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuU2VhcmNoZWQgIiArIHNKQVJzICsgIiBqYXJzLCBmb3VuZCAiICsgc0R1cHMgKyAiIGR1cHMgaW4gIiArIHNGaWxlcyArICIgZmlsZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoRmlsZSByb290LCBNYXAgbWFwKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZiA9IGZpbGVzW2ldOwotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkKLQkJCQlwcm9jZXNzRGlyZWN0b3J5KGYsIG1hcCk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi56aXAiKSB8fCBuYW1lLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJcHJvY2Vzc0ZpbGUoZiwgbWFwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSwgTWFwIG1hcCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlIYXNoU2V0IGZpbGVzSW5GaWxlID0gbmV3IEhhc2hTZXQoKTsKLQotCQlzSkFScysrOwotCQlaaXBGaWxlIHppcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXAgPSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShmaWxlKTsKLQkJCUVudW1lcmF0aW9uIGVOdW0gPSB6aXAuZW50cmllcygpOwotCQkJd2hpbGUgKGVOdW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZU51bS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORiIpICYmICFleGNsdWRlZC5jb250YWlucyhuYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlmaWxlc0luRmlsZS5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIipFcnJvciBzZWFyY2hpbmcgaW4gIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh6aXAgIT0gbnVsbCkKLQkJCQkJemlwLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQkJLy8gTm93IGFkZCB0aGUgcGFja2FnZXMgdG8gdGhlIG1hcAotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldFBhdGgoKTsKLQotCQlJdGVyYXRvciBpdCA9IGZpbGVzSW5GaWxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlhZGRFbnRyeShlbnRyeU5hbWUsIG1hcCwgZmlsZW5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9KMkVFRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvSjJFRUZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTk4M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9KMkVFRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gaG9sZCBoZWxwZXIgbWV0aG9kcyBjb21tb24gdG8gbXVsdGlwbGUgY2xhc3NlcyBpbiB0aGUgYXJjaGl2ZSBzdXBwb3J0Ci0gKiBwYWNrYWdlcwotICovCi1wdWJsaWMgY2xhc3MgSjJFRUZpbGVVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfQ0xBU1MgPSAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU1FMSiA9ICIuc3FsaiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfSlNQID0gIi5qc3AiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRlbXAgZGlyZWN0b3J5IHNob3VsZCBiZSB1c2VkIGZvciBleHRyYWN0aW5nIG5lc3RlZCBqYXJzIGZvcgotCSAqIHJlYWQ7IGRlZmF1bHRzIHRvIHRydWUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQgPSB0cnVlOwotCi0JLyoqCi0JICogU2V0dGFibGUgbmFtZSBmb3IgdGhlIHRlbXAgZGlyZWN0b3J5OyBtdXN0IHJlc29sdmUgdG8gYSB2YWxpZCBmaWxlIG9uIHRoZSBmaWxlIHN5c3RlbTsgaWYgbm90Ci0JICogc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgc3lzdGVtIHRlbXAgZGlyZWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdGVtcERpcmVjdG9yeU5hbWU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGphdmEuaW8uRmlsZSB0ZW1wRGlyZWN0b3J5OwotCQotCS8qKgotCSAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBlbXB0eSBkaXJlY3RvcmllcyBzaG91bGQgYmUgaW5jbHVkZWQgZHVyaW5nIGltcG9ydDsgZGVmYXVsdHMgdG8gdHJ1ZS4KLQkgKiAKLQkgKiBAc2VlIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsI2lzSW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBJTkNMVURFX0VNUFRZX0RJUkVDVE9SSUVTID0gdHJ1ZTsKLQkKLQotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlVXNpbmdBbHRERChFQVJGaWxlIGVhciwgUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB1cmkgPSByZXMuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJTW9kdWxlIG0gPSBlYXIuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVIYXZpbmdBbHRERCh1cmkpOwotCQlpZiAobSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZHVsZVJlZiByZWYgPSBlYXIuZ2V0TW9kdWxlUmVmKG0pOwotCQlpZiAocmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gcmVmLmdldE1vZHVsZUZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVGaWxlVHlwZU5hbWUoaW50IG1vZHVsZVR5cGUpIHsKLQkJc3dpdGNoIChtb2R1bGVUeXBlKSB7Ci0JCQljYXNlIFhNTFJlc291cmNlLkFQUExJQ0FUSU9OX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfQXBwbGljYXRpb25fZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLkFQUF9DTElFTlRfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQW5fQXBwbGljYXRpb25fQ2xpZW50X0pBUl9maWxlOyAKLQkJCWNhc2UgWE1MUmVzb3VyY2UuRUpCX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFuX0VKQl9KQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQV9XQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLlJBUl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX1JBUl9maWxlOyAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25jYXRlbmF0ZXMgdGhlIHR3byBzdHJpbmdzIGFuZCBlbnN1cmVzIHRoZSBjb3JyZWN0IHNlcGFyYXRvciBpcyB1c2VkIGluIHRoZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T1NVcmkoU3RyaW5nIHVyaSkgewotCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJaWYgKHNlcCAhPSAnLycpCi0JCQlyZXR1cm4gdXJpLnJlcGxhY2UoJy8nLCBzZXApOwotCQlyZXR1cm4gdXJpLnJlcGxhY2UoJ1xcJywgc2VwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVudCBvZiB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAdGhyb3dzIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZXh0ZW50IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpIHsKLQkJCXRocm93IG5ldyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpIGV4dGVudC5nZXQoMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMToxNjo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGVtcERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wRGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRva2VucyhTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gZ2V0VG9rZW5zKGFTdHJpbmcsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IChkZWxpbWl0ZXIgPT0gbnVsbCkgPyBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcpIDogbmV3IFN0cmluZ1Rva2VuaXplcihhU3RyaW5nLCBkZWxpbWl0ZXIpOwotCQlpbnQgc2l6ZSA9IHRvay5jb3VudFRva2VucygpOwotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgdG9rLmhhc01vcmVUb2tlbnMoKTsgaSsrKSB7Ci0JCQl0b2tlbnNbaV0gPSB0b2submV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUlnbm9yZUtleUNhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlSWdub3JlS2V5Q2FzZShqYXZhLmxhbmcuU3RyaW5nIGtleSwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIGF0dHIpIHsKLQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGF0dHIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGtleXNBbmRWYWx1ZXMubmV4dCgpOwotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCA/IG51bGwgOiBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKMkVFMTNGYXN0Q2hlY2soTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlTdHJpbmcgdXJpID0gbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCQl0cnkgewotCQkJaW4gPSBtb2R1bGVGaWxlLmdldElucHV0U3RyZWFtKHVyaSk7Ci0KLQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gWG1sRG9jdW1lbnRSZWFkZXIucmVhZERvY3VtZW50VHlwZShpbiwgdXJpKTsKLQkJCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gaWRzID0gZ2V0SjJFRTEzUHVibGljQW5kU3lzdGVtSWRGb3IobW9kdWxlRmlsZSk7Ci0JCQlpZiAoaWRzID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIGlkc1swXS5lcXVhbHMoZG9jVHlwZS5nZXRQdWJsaWNJZCgpKSAmJiBpZHNbMV0uZXF1YWxzKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEoyRUUxM1B1YmxpY0FuZFN5c3RlbUlkRm9yKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlpZiAobW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMl8wLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzB9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzMsIEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCwgSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wfTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmFzdFNwZWNWZXJzaW9uKFN0cmluZyBmaWxlVVJJKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlVVJJKTsKLQotICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGluKTsKLSAgICAgICAgICAgR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyIGFSZWFkZXIgPSBuZXcgWG1sRG9jdW1lbnRSZWFkZXIoc291cmNlKTsKLSAgICAgICAgICAgYVJlYWRlci5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0gICAgICAgICAgIERvY3VtZW50IGFEb2N1bWVudCA9IGFSZWFkZXIucGFyc2VEb2N1bWVudCgpOwotICAgICAgICAgICBpZiAoYURvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZG9jVHlwZSA9IGFEb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaW50IHZlcnNpb24gPSAtMTsKLSAgICAgICAgICAgaWYgKG51bGwgIT0gZG9jVHlwZSkgewotICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSUQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JRCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgICAgICAgaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbG9va3VwVmVyc2lvbihmaWxlVVJJLCBwdWJsaWNJRCwgc3lzdGVtSUQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gLTEpIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmIChhRG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBkb2NUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBhRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBzY2hlbWFOb2RlID0gbWFwLmdldE5hbWVkSXRlbSgieHNpOnNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gc2NoZW1hTm9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFOYW1lID0gc2NoZW1hTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHZlcnNpb25Ob2RlID0gbWFwLmdldE5hbWVkSXRlbSgidmVyc2lvbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdmVyc2lvbk5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9IHZlcnNpb25Ob2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChudWxsICE9IHNjaGVtYU5hbWUpIHsKLSAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24oZmlsZVVSSSwgc2NoZW1hTmFtZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlVmVyc2lvblN0cmluZyhmaWxlVVJJLCB2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpCi0gICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgIC8vSWdub3JlCi0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VWZXJzaW9uU3RyaW5nKFN0cmluZyBmaWxlVVJJLCBTdHJpbmcgdmVyc2lvbkF0dHIpIHsKLSAgICAgICAgaW50IHZlcnNpb24gPSAtMTsKLSAgICAgICAgaWYgKGlzRUFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzFfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMV9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ7IAotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMV9URVhUKSkgeyAKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzFfSUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLSAgICAgICAgICAgfSAKLSAgICAgICAgfSBlbHNlIGlmIChpc1dBUkZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzRfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzNfMF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzUkFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNl9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLQotICAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwVmVyc2lvbihTdHJpbmcgZmlsZVVSSSwgU3RyaW5nIHNjaGVtYU5hbWUpIHsKLSAgICAgICAgaW50IHZlcnNpb24gPSAtMTsKLSAgICAgICAgaWYgKGlzRUFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfNikpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfNSkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfMV80KSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpc0VKQkphckZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMV9OUykpICE9IC0xKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOyAgIAotICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMF9OUykpICE9IC0xKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzJfMV9OUykpICE9IC0xKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfNikpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV81KSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzFfNCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNXQVJGaWxlKGZpbGVVUkkpKSB7Ci0gICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfM18wKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzNfMF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl81KSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl80KSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzUkFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNikpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFZlcnNpb24oU3RyaW5nIGZpbGVVUkksIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChpc0VBUkZpbGUoZmlsZVVSSSkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzMpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMikgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMil8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzApICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMl8wKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8yXzApKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMV8xKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoZmlsZVVSSSkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzV0FSRmlsZShmaWxlVVJJKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzMpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzMpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMil8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8yKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNSQVJGaWxlKGZpbGVVUkkpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzApfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCkpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSQVJGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCQotCQlyZXR1cm4gKGZpbGVVUkkuaW5kZXhPZihKMkVFQ29uc3RhbnRzLlJBUl9TSE9SVF9OQU1FKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dBUkZpbGUoU3RyaW5nIGZpbGVVUkkpIHsKLQkJCi0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUpICE9IC0xKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VKQkphckZpbGUoU3RyaW5nIGZpbGVVUkkpIHsKLQkJcmV0dXJuIChmaWxlVVJJLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSkgIT0gLTEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFQVJGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSkgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9PYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjZWY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOwotaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlciBleHRlbmRzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gewotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2w7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCi0JcHVibGljIE9iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIoSW5wdXRTdHJlYW0gaXMsIENsYXNzTG9hZGVyIGxvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gewotCi0JCXN1cGVyKGlzKTsKLQotCQlpZiAobG9hZGVyICE9IG51bGwpCi0JCQljbCA9IGxvYWRlcjsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGphdmEgdHlwZSBjbGFzcyBnaXZlbiBhIHNpZ25hdHVyZSBsZXR0ZXIuCi0JICovCi0KLQlwcml2YXRlIENsYXNzIGdldFR5cGUoY2hhciB0eXBlKSB7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlICdCJyA6Ci0JCQkJcmV0dXJuIGJ5dGUuY2xhc3M7Ci0JCQljYXNlICdDJyA6Ci0JCQkJcmV0dXJuIGNoYXIuY2xhc3M7Ci0JCQljYXNlICdEJyA6Ci0JCQkJcmV0dXJuIGRvdWJsZS5jbGFzczsKLQkJCWNhc2UgJ0YnIDoKLQkJCQlyZXR1cm4gZmxvYXQuY2xhc3M7Ci0JCQljYXNlICdJJyA6Ci0JCQkJcmV0dXJuIGludC5jbGFzczsKLQkJCWNhc2UgJ0onIDoKLQkJCQlyZXR1cm4gbG9uZy5jbGFzczsKLQkJCWNhc2UgJ1MnIDoKLQkJCQlyZXR1cm4gc2hvcnQuY2xhc3M7Ci0JCQljYXNlICdaJyA6Ci0JCQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVzb2x2ZUNsYXNzKCkgbWV0aG9kIHRvIHVzZSBhIGN1c3RvbSBjbGFzcyBsb2FkZXIuCi0JICovCi0KLQlwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NEZXNjLmdldE5hbWUoKTsKLQotCQkvL1V0aWxzVHJhY2UudHJhY2UoIiBPYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyOiBSZXNvbHZpbmcgIiArIGNsYXNzTmFtZSk7Ci0KLQkJLy8gSGFuZGxlIGFycmF5cyBvZiBjbGFzc2VzIGRpZmZlcmVudGx5Ci0KLQkJaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJbIikpIHsvLyROT04tTkxTLTEkCi0KLQkJCUNsYXNzIGNvbXBvbmVudCA9IG51bGw7Ci0JCQlpbnQgZGltTnVtOwotCi0JCQlmb3IgKGRpbU51bSA9IDE7IGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSA9PSAnWyc7IGRpbU51bSsrKQotCi0JCQlpZiAoY2xhc3NOYW1lLmNoYXJBdChkaW1OdW0pID09ICdMJykgewotCQkJCWNvbXBvbmVudCA9IGNsLmxvYWRDbGFzcyhjbGFzc05hbWUuc3Vic3RyaW5nKGRpbU51bSArIDEsIGNsYXNzTmFtZS5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSAhPSBkaW1OdW0gKyAxKQotCQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOyAvLyBtYWxmb3JtZWQKLQkJCQljb21wb25lbnQgPSBnZXRUeXBlKGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSk7Ci0JCQl9Ci0KLQkJCWludCBkaW1lbnNpb25zW10gPSBuZXcgaW50W2RpbU51bV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbU51bTsgaSsrKQotCQkJCWRpbWVuc2lvbnNbaV0gPSAwOwotCi0JCQlyZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50LCBkaW1lbnNpb25zKS5nZXRDbGFzcygpOwotCi0JCX0KLQkJcmV0dXJuIGNsLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTk2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyIGV4dGVuZHMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgewotCi0gICAgcHVibGljIFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsLCBQcm90ZWN0aW9uRG9tYWluIHBEb21haW4pIHsKLSAgICAgICAgc3VwZXIoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgcERvbWFpbik7Ci0gICAgfQotICAgIAotCXB1YmxpYyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKEFyY2hpdmUgYW5BcmNoaXZlLCBDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlzdXBlcihhbkFyY2hpdmUsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBnZXRSYXJGaWxlKCkuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQXJjaGl2ZSkgY2hpbGRyZW4uZ2V0KGkpKS5nZXRGaWxlKG5hbWUpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RmlsZUZyb21EZXBlbmRlbnRKYXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBSQVJGaWxlIGdldFJhckZpbGUoKSB7Ci0JCXJldHVybiAoUkFSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODdiNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotCi0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlciBleHRlbmRzIEFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0xvYWRpbmdGcm9tV0FSID0gdHJ1ZTsKLQotCXB1YmxpYyBXYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKEFyY2hpdmUgYW5BcmNoaXZlLCBDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCwgUHJvdGVjdGlvbkRvbWFpbiBwRG9tYWluKSB7Ci0JCXN1cGVyKGFuQXJjaGl2ZSwgcGFyZW50Q2wsIGV4dHJhQ2wsIHBEb21haW4pOwotCQlhbGxvd0xvYWRpbmdGcm9tV0FSID0gYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5nZXRDbGFzc0xvYWRpbmdNb2RlKCkgPT0gQXJjaGl2ZU9wdGlvbnMuTE9BRF9NT0RFX0NPTVBBVDsKLQl9Ci0JCi0JcHVibGljIFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXRoaXMoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeSBmaXJzdCwgdGhlbiB3YXIsIHRoZW4gbmVzdGVkIGFyY2hpdmVzLgotCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeQotCQlTdHJpbmcgc3dpenpsZWROYW1lID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLCBuYW1lLCAnLycpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFdhckZpbGUoKS5nZXRGaWxlKHN3aXp6bGVkTmFtZSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJLy9zZWFyY2ggd2FyIGlmIHJ1bm5pbmcgd2l0aCBjb21wYXRpYmlsaXR5Ci0JCWlmIChhbGxvd0xvYWRpbmdGcm9tV0FSKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbUFyY2hpdmUobmFtZSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJLy9zZWFyY2ggbmVzdGVkIGFyY2hpdmVzCi0JCUxpc3QgY2hpbGRyZW4gPSBnZXRXYXJGaWxlKCkuZ2V0TGlicygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEFyY2hpdmUpIGNoaWxkcmVuLmdldChpKSkuZ2V0RmlsZShuYW1lKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJLy9maW5hbGx5IHNlYXJjaCBqYXJzIGluIGVhcgotCQlyZXR1cm4gZ2V0RmlsZUZyb21EZXBlbmRlbnRKYXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBXQVJGaWxlIGdldFdhckZpbGUoKSB7Ci0JCXJldHVybiAoV0FSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiYzYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlQXBwbGljYXRpb24gZXh0ZW5kcyBMb29zZUFyY2hpdmUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBMb29zZUFyY2hpdmVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRMb29zZUFyY2hpdmVzKCk7Ci0KLX0gLy9Mb29zZUFwcGxpY2F0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjVmMDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb29zZUFyY2hpdmUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotCWJvb2xlYW4gaXNFQVIoKTsKLQotCWJvb2xlYW4gaXNXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEJpbmFyaWVzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQmluYXJpZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0QmluYXJpZXNQYXRoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZXNvdXJjZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVzb3VyY2VzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlc1BhdGgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgTG9vc2VBcHAgcmVmZXJlbmNlCi0JICovCi0JTG9vc2VBcHBsaWNhdGlvbiBnZXRMb29zZUFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9vc2VBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIHZhbHVlKTsKLQotCWJvb2xlYW4gaXNNb2R1bGUoKTsKLQotfSAvL0xvb3NlQXJjaGl2ZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWdSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWdSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M2NzA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlnUmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIGludGVybmFsbHkgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUNvbmZpZ1JlZ2lzdGVyIHsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBsb29zZSBjb25maWcgZG9jdW1lbnQ7Ci0JICogIndhcy5sb29zZS5jb25maWciCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PU0VfQ09ORklHX1BST1BFUlRZID0gIndhcy5sb29zZS5jb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlndXJhdGlvbiBsb29zZUNvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKiogSGF2ZSB3ZSBwcmV2aW91c2x5IGxvYWRlZCBvciB0cmllZCB0byBsb2FkIHRoZSBsb29zZSBjb25maWd1cmF0aW9uPyAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwIGxvb3NlRWFyTWFwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvb3NlQ29uZmlnUmVnaXN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlnUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTG9vc2VDb25maWdSZWdpc3RlcigpOwotCi0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHRoZSBlYXIgZmlsZSBpbiB0aGUgZmx1ZmZlZCBMb29zZUNvbmZpZ3VyYXRpb24gb2JqZWN0LCBhbmQgYXR0ZW1wdHMgdG8gbG9hZCB0aGUKLQkgKiBMb29zZUFwcGxpY2F0aW9uIG9uIGRlbWFuZCBmcm9tIHRoZSBleGlzdGluZyBtYXBwaW5ncyBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExvb3NlQXBwbGljYXRpb24gZmluZExvb3NlQXBwbGljYXRpb24oU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbihTdHJpbmcKLQkJLy8gZWFyRmlsZVVSST1cIiIrZWFyRmlsZVVSSSsiXCIpIik7Ci0JCWlmIChnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlMaXN0IGFwcHMgPSBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwcy5zaXplKCk7IGkrKykgewotCQkJCUxvb3NlQXBwbGljYXRpb24gYXBwID0gKExvb3NlQXBwbGljYXRpb24pIGFwcHMuZ2V0KGkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCQkvLyBhcHBbIitpKyJdLmdldFVSSSgpPVwiIithcHAuZ2V0VXJpKCkrIlwiIiApOwotCQkJCWlmIChhcHAuZ2V0VXJpKCkuZXF1YWxzKGVhckZpbGVVUkkpKQotCQkJCQlyZXR1cm4gYXBwOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKTogZGlkIG5vdCBmaW5kIGxvYWRlZAotCQkvLyBMb29zZUFwcGxpY2F0aW9uLCBsb2FkaW5nIG5ldyB2YWx1ZS4iICk7Ci0JCWlmIChnZXREb2N1bWVudFVSSSgpID09IG51bGwgfHwgZ2V0RG9jdW1lbnRVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJVVJJIGxvb3NlQ29uZmlnID0gKFVSSSkgZ2V0TG9vc2VFYXJNYXAoKS5nZXQoZWFyRmlsZVVSSSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6IGxvb3NlQ29uZmlnIFVSSQotCQkJLy8gZnJvbSBtYXAgXCIiK2xvb3NlQ29uZmlnKyJcIiIpOwotCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGxvYWRMb29zZUFwcGxpY2F0aW9uKGxvb3NlQ29uZmlnKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCS8vIGxvb3NlQXBwbGljYXRpb249IithcHBsaWNhdGlvbik7Ci0JCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgewotCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJLy8gbG9vc2VBcHBsaWNhdGlvbiBjb250YWlucyAiICsgbW9kdWxlcy5zaXplKCkgKyAiIG1vZHVsZXMuIik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJCS8vIG1vZHVsZXMuZ2V0KCIraSsiKToiKyBtb2R1bGVzLmdldChpKSk7Ci0JCQkJCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JCQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogICAgICAgICAgICBUaGUgY29udGFpbmluZyBFQVIgLS0gdGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSB3aWxsIGJlIGRldGVybWluZWQKLQkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkKLQkgKiBAcGFyYW0gbG9vc2VBcHBsaWNhdGlvblJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gVVJJIG9mIGEgZG9jdW1lbnQgY29udGFpbmluZyBhIExvb3NlQXBwbGljYXRpb24gYXMgaXRzCi0JICogICAgICAgICAgICByb290Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VNYXBwaW5nKENvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpIHsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJYWRkTG9vc2VNYXBwaW5nKEFyY2hpdmVVdGlsLmdldE9TVXJpKGNvbnRhaW5lci5nZXRVUkkoKSksIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICogQHBhcmFtIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSBvZiBhIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBMb29zZUFwcGxpY2F0aW9uIGFzIGl0cwotCSAqICAgICAgICAgICAgcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExvb3NlTWFwcGluZyhTdHJpbmcgZWFyRmlsZVVSSSwgU3RyaW5nIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkgewotCQlpZiAoZWFyRmlsZVVSSSAhPSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZyhTdHJpbmcKLQkJCS8vIGVhckZpbGVVUkk9XCIiK2VhckZpbGVVUkkrIlwiLCBTdHJpbmcKLQkJCS8vIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZT1cIiIrbG9vc2VBcHBsaWNhdGlvblJlc291cmNlKyJcIikiKTsKLQkJCWlmIChnZXRMb29zZUVhck1hcCgpLmNvbnRhaW5zS2V5KGVhckZpbGVVUkkpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5hZGRMb29zZU1hcHBpbmcoKTogRm91bmQgZXhpc3Rpbmcga2V5Ci0JCQkJLy8gd2l0aCBzYW1lIGVhckZpbGVVUkksIGxvb2tpbmcgZm9yIGxvYWRlZCBhcHAuIik7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKGVhckZpbGVVUkkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuYWRkTG9vc2VNYXBwaW5nKCk6IExvYWRlZCBhcHA9IiArCi0JCQkJLy8gYXBwKTsKLQkJCQlpZiAoYXBwICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShVUkkuY3JlYXRlVVJJKGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZygpOiBjbGVhcmluZwotCQkJCQkvLyByZXNvdXJjZToiICsgcmVzKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlyZW1vdmVMb29zZUFwcGxpY2F0aW9uKGFwcCk7Ci0JCQkJfQotCQkJfQotCQkJZ2V0TG9vc2VFYXJNYXAoKS5wdXQoZWFyRmlsZVVSSSwgVVJJLmNyZWF0ZVVSSShsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGdldExvb3NlQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLQkJCUxpc3QgYXBwcyA9IGdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSAoTG9vc2VBcHBsaWNhdGlvbikgYXBwcy5nZXQoaSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKCk6Ci0JCQkJLy8gYXBwWyIraSsiXS5nZXRVUkkoKT1cIiIrYXBwLmdldFVyaSgpKyJcIiIgKTsKLQkJCQlpZiAoYXBwLmdldFVyaSgpLmVxdWFscyhlYXJGaWxlVVJJKSkKLQkJCQkJcmV0dXJuIGFwcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgYWRkaW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dzIHJlbW92aW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uCi0JCS8vIGFwcGxpY2F0aW9uPVwiIithcHBsaWNhdGlvbisiXCIpIik7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLnJlbW92ZShhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZyBlYXJGaWxlVVJJKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGVhckZpbGVVUkkgIT0gbnVsbCkKLQkJCWdldExvb3NlRWFyTWFwKCkucmVtb3ZlKGVhckZpbGVVUkkpOwotCX0KLQotCXB1YmxpYyBMb29zZU1vZHVsZSBmaW5kTG9vc2VNb2R1bGUoTG9vc2VBcHBsaWNhdGlvbiBhcHAsIFN0cmluZyB1cmksIFN0cmluZyBhbHRERCkgewotCQlMaXN0IGFyY2hpdmVzID0gYXBwLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJTG9vc2VBcmNoaXZlIGVsZW1lbnQgPSAoTG9vc2VBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNNb2R1bGUoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHVyaSwgZWxlbWVudC5nZXRVcmkoKSkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoYWx0REQsICgoTG9vc2VNb2R1bGUpIGVsZW1lbnQpLmdldEFsdEREKCkpKQotCQkJCXJldHVybiAoTG9vc2VNb2R1bGUpIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExvb3NlTW9kdWxlIGZpbmRMb29zZU1vZHVsZShNb2R1bGUgbSwgRUFSRmlsZSBlYXIpIHsKLQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbihlYXIuZ2V0VVJJKCkpOwotCQlyZXR1cm4gYXBwID09IG51bGwgPyBudWxsIDogZmluZExvb3NlTW9kdWxlKGFwcCwgbS5nZXRVcmkoKSwgbS5nZXRBbHRERCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb247IHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVxdWVzdGVkIGl0IHdpbGwgYmUgcmVsb2FkZWQ7Ci0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCWxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQkJbG9vc2VDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKChMb29zZUNvbmZpZ3VyYXRpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHkgdGhlbiBmbHVmZiB1cCBhIExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QKLQkJCSAqLwotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKExvb3NlY29uZmlnRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkQXR0ZW1wdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCkgewotCQlTdHJpbmcgdXJpID0gZ2V0RG9jdW1lbnRVUkkoKTsKLQkJaWYgKEFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBsb29zZSBjb25maWd1cmF0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbiBsb2FkTG9vc2VBcHBsaWNhdGlvbihVUkkgbG9vc2VBcHBVUkkpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShsb29zZUFwcFVSSSk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChMb29zZUFwcGxpY2F0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkTG9vc2VBcHBsaWNhdGlvblJlc291cmNlKFVSSSBsb29zZUNvbmZpZ1VSSSkgewotCQlpZiAobG9vc2VDb25maWdVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKGxvb3NlQ29uZmlnVVJJLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGxvb3NlIGFwcGxpY2F0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb29zZUNvbmZpZ3VyYXRpb24uIEJhc2ljIGFjY2Vzc29yIHdpdGggbm8gaW5pdGlhbGl6YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMb29zZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTG9vc2VDb25maWd1cmF0aW9uIHByaW1HZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsb29zZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqIFRoZSB2YWx1ZSBvZiB0aGUgbG9vc2UgY29uZmlnIHByb3BlcnR5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShMT09TRV9DT05GSUdfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4gVHJpZXMgdG8gbG9hZCBpdCB1c2luZyB0aGUgc3lzdGVtIHByb3BlcnR5IHdhcy5sb29zZS5jb25maWcsIGlmCi0JICogbmVjZXNzYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQ29uZmlndXJhdGlvbiBvciBudWxsCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChsb29zZUNvbmZpZ3VyYXRpb24gPT0gbnVsbCAmJiAhbG9hZEF0dGVtcHRlZCkKLQkJCWxvYWRMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvb3NlQ2hpbGRyZW4oTG9vc2VBcmNoaXZlIGxvb3NlKSB7Ci0JCWlmIChsb29zZSAhPSBudWxsKSB7Ci0JCQlpZiAobG9vc2UuaXNFQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZUFwcGxpY2F0aW9uKSBsb29zZSkuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQkJZWxzZSBpZiAobG9vc2UuaXNXQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZVdBUkZpbGUpIGxvb3NlKS5nZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUFyY2hpdmUgZmluZEZpcnN0TG9vc2VDaGlsZChTdHJpbmcgdXJpLCBMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldExvb3NlQ2hpbGRyZW4obG9vc2UpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUFyY2hpdmUgY2hpbGQgPSAoTG9vc2VBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBjaGlsZC5nZXRVcmkoKSkpCi0JCQkJcmV0dXJuIGxvb3NlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9vc2VDb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9vc2VDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQ29uZmlndXJhdGlvbihMb29zZUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBIYXZlIHdlIHByZXZpb3VzbHkgbG9hZGVkIG9yIHRyaWVkIHRvIGxvYWQgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24/Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldExvYWRBdHRlbXB0ZWQoKSB7Ci0JCXJldHVybiBsb2FkQXR0ZW1wdGVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9vc2VFYXJNYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXRMb29zZUVhck1hcCgpIHsKLQkJaWYgKGxvb3NlRWFyTWFwID09IG51bGwpCi0JCQlsb29zZUVhck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBsb29zZUVhck1hcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhjZjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VDb25maWd1cmF0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBBcHBsaWNhdGlvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEFwcGxpY2F0aW9ucygpOwotCi19IC8vTG9vc2VDb25maWd1cmF0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUxpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlMzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlTGlicmFyeSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBMb29zZVdBUiByZWZlcmVuY2UKLQkgKi8KLQlMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvb3NlV0FSIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9vc2VXQVIoTG9vc2VXQVJGaWxlIHZhbHVlKTsKLQotfSAvL0xvb3NlTGlicmFyeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTAwOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb29zZU1vZHVsZSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldEFsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBbHRERChTdHJpbmcgdmFsdWUpOwotCi19IC8vTG9vc2VNb2R1bGUKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlV0FSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZmU1NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlV0FSRmlsZSBleHRlbmRzIExvb3NlTW9kdWxlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTG9vc2VMaWJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRMb29zZUxpYnMoKTsKLQotfSAvL0xvb3NlV0FSRmlsZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1MmY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLkxvb3NlY29uZmlnUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlY29uZmlnRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBBcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlQXBwbGljYXRpb24gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvb3NlIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9vc2UgTW9kdWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBXQVIgRmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZWNvbmZpZ1BhY2thZ2UgZ2V0TG9vc2Vjb25maWdQYWNrYWdlKCk7Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmU2ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5Mb29zZWNvbmZpZ0ZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlY29uZmlnUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJsb29zZWNvbmZpZyI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9vc2Vjb25maWdQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbCA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQXJjaGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEggPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUFwcGxpY2F0aW9uSW1wbCA8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQXBwbGljYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXJjaGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUyA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VMaWJyYXJ5SW1wbCA8ZW0+TG9vc2UgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19VUkkgPSBMT09TRV9BUkNISVZFX19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmluYXJpZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQID0gTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIFdBUjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19MT09TRV9XQVIgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZU1vZHVsZUltcGwgPGVtPkxvb3NlIE1vZHVsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VNb2R1bGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9NT0RVTEVfX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0IEREPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19BTFRfREQgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIE1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VDb25maWd1cmF0aW9uSW1wbCA8ZW0+TG9vc2UgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9DT05GSUdVUkFUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VXQVJGaWxlSW1wbCA8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlV0FSRmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZVdBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19VUkkgPSBMT09TRV9NT0RVTEVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2VzIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQID0gTE9PU0VfTU9EVUxFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0IEREPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERCA9IExPT1NFX01PRFVMRV9fQUxUX0REOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTID0gTE9PU0VfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb24gPGVtPkxvb3NlIEFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvb3NlIEFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb24jZ2V0TG9vc2VBcmNoaXZlcyA8ZW0+TG9vc2UgQXJjaGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvb3NlIEFyY2hpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbiNnZXRMb29zZUFyY2hpdmVzKCkKLQkgKiBAc2VlICNnZXRMb29zZUFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb29zZSBBcmNoaXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUFyY2hpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRCaW5hcmllc1BhdGggPGVtPkJpbmFyaWVzIFBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CaW5hcmllcyBQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldEJpbmFyaWVzUGF0aCgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRSZXNvdXJjZXNQYXRoIDxlbT5SZXNvdXJjZXMgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlcyBQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFJlc291cmNlc1BhdGgoKQotCSAqIEBzZWUgI2dldExvb3NlQXJjaGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRMb29zZUFwcCA8ZW0+TG9vc2UgQXBwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkxvb3NlIEFwcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRMb29zZUFwcCgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSA8ZW0+TG9vc2UgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUxpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSNnZXRMb29zZVdBUiA8ZW0+TG9vc2UgV0FSPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkxvb3NlIFdBUjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSNnZXRMb29zZVdBUigpCi0JICogQHNlZSAjZ2V0TG9vc2VMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlIDxlbT5Mb29zZSBNb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvb3NlTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlI2dldEFsdEREIDxlbT5BbHQgREQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHQgREQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZSNnZXRBbHRERCgpCi0JICogQHNlZSAjZ2V0TG9vc2VNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb24gPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uI2dldEFwcGxpY2F0aW9ucyA8ZW0+QXBwbGljYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcHBsaWNhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb24jZ2V0QXBwbGljYXRpb25zKCkKLQkgKiBAc2VlICNnZXRMb29zZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlQ29uZmlndXJhdGlvbl9BcHBsaWNhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZSA8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZSNnZXRMb29zZUxpYnMgPGVtPkxvb3NlIExpYnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvb3NlIExpYnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGUjZ2V0TG9vc2VMaWJzKCkKLQkgKiBAc2VlICNnZXRMb29zZVdBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlV0FSRmlsZV9Mb29zZUxpYnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnRmFjdG9yeSBnZXRMb29zZWNvbmZpZ0ZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUFwcGxpY2F0aW9uSW1wbCA8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQXBwbGljYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQXBwbGljYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9PU0VfQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TG9vc2VBcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXJjaGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUyA9IGVJTlNUQU5DRS5nZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbCA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZUFyY2hpdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9PU0VfQVJDSElWRSA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX0FSQ0hJVkVfX1VSSSA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmVfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIID0gZUlOU1RBTkNFLmdldExvb3NlQXJjaGl2ZV9SZXNvdXJjZXNQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQID0gZUlOU1RBTkNFLmdldExvb3NlQXJjaGl2ZV9Mb29zZUFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUxpYnJhcnlJbXBsIDxlbT5Mb29zZSBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUxpYnJhcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9MSUJSQVJZID0gZUlOU1RBTkNFLmdldExvb3NlTGlicmFyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgV0FSPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiA9IGVJTlNUQU5DRS5nZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VNb2R1bGVJbXBsIDxlbT5Mb29zZSBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZU1vZHVsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0TG9vc2VNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdCBERDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX01PRFVMRV9fQUxUX0REID0gZUlOU1RBTkNFLmdldExvb3NlTW9kdWxlX0FsdEREKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQ29uZmlndXJhdGlvbkltcGwgPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPT1NFX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyA9IGVJTlNUQU5DRS5nZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlV0FSRmlsZUltcGwgPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZVdBUkZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlV0FSRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9XQVJfRklMRSA9IGVJTlNUQU5DRS5nZXRMb29zZVdBUkZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTID0gZUlOU1RBTkNFLmdldExvb3NlV0FSRmlsZV9Mb29zZUxpYnMoKTsKLQotCX0KLQotfSAvL0xvb3NlY29uZmlnUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhlNTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcHBsaWNhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUFwcGxpY2F0aW9uSW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZUFwcGxpY2F0aW9uIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbG9vc2VBcmNoaXZlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX0FQUExJQ0FUSU9OOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldExvb3NlQXJjaGl2ZXMoKSB7Ci0JCWlmIChsb29zZUFyY2hpdmVzID09IG51bGwpIHsKLQkJCWxvb3NlQXJjaGl2ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChMb29zZUFyY2hpdmUuY2xhc3MsIHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFApOwotCQl9Ci0JCXJldHVybiBsb29zZUFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlQXJjaGl2ZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUFyY2hpdmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBnZXRMb29zZUFyY2hpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQlnZXRMb29zZUFyY2hpdmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb29zZUFyY2hpdmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCWdldExvb3NlQXJjaGl2ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBsb29zZUFyY2hpdmVzICE9IG51bGwgJiYgIWxvb3NlQXJjaGl2ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzdhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29zZUFyY2hpdmVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmkgPSBVUklfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpbmFyaWVzUGF0aCgpIDxlbT5CaW5hcmllcyBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmluYXJpZXNQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUklFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmluYXJpZXNQYXRoID0gQklOQVJJRVNfUEFUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzUGF0aCgpIDxlbT5SZXNvdXJjZXMgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlc1BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VzUGF0aCA9IFJFU09VUkNFU19QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQXJjaGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX0FSQ0hJVkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dBUigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB7Ci0JCXJldHVybiBiaW5hcmllc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmluYXJpZXNQYXRoKFN0cmluZyBuZXdCaW5hcmllc1BhdGgpIHsKLQkJU3RyaW5nIG9sZEJpbmFyaWVzUGF0aCA9IGJpbmFyaWVzUGF0aDsKLQkJYmluYXJpZXNQYXRoID0gbmV3QmluYXJpZXNQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCwgb2xkQmluYXJpZXNQYXRoLCBiaW5hcmllc1BhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHsKLQkJcmV0dXJuIHJlc291cmNlc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzUGF0aChTdHJpbmcgbmV3UmVzb3VyY2VzUGF0aCkgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCXJlc291cmNlc1BhdGggPSBuZXdSZXNvdXJjZXNQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEgsIG9sZFJlc291cmNlc1BhdGgsIHJlc291cmNlc1BhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGdldExvb3NlQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChMb29zZUFwcGxpY2F0aW9uKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIG5ld0xvb3NlQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZUFwcCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQXBwKExvb3NlQXBwbGljYXRpb24gbmV3TG9vc2VBcHApIHsKLQkJaWYgKG5ld0xvb3NlQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAgJiYgbmV3TG9vc2VBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMb29zZUFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0xvb3NlQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xvb3NlQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvb3NlQXBwKG5ld0xvb3NlQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAsIG5ld0xvb3NlQXBwLCBuZXdMb29zZUFwcCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kdWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZUFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKEJJTkFSSUVTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBCSU5BUklFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyBiaW5hcmllc1BhdGggIT0gbnVsbCA6ICFCSU5BUklFU19QQVRIX0VERUZBVUxULmVxdWFscyhiaW5hcmllc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZXNQYXRoICE9IG51bGwgOiAhUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1cmk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmluYXJpZXNQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiaW5hcmllc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlc1BhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb29zZUFyY2hpdmVJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQ29uZmlndXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU2MDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTG9vc2VDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvb3NlQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFwcGxpY2F0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcHBsaWNhdGlvbnMoKSB7Ci0JCWlmIChhcHBsaWNhdGlvbnMgPT0gbnVsbCkgewotCQkJYXBwbGljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExvb3NlQXBwbGljYXRpb24uY2xhc3MsIHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlMpOwotCQl9Ci0JCXJldHVybiBhcHBsaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXBwbGljYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXBwbGljYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6Ci0JCQkJcmV0dXJuIGFwcGxpY2F0aW9ucyAhPSBudWxsICYmICFhcHBsaWNhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTGlicmFyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzYxNGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlTGlicmFyeUltcGwgZXh0ZW5kcyBMb29zZUFyY2hpdmVJbXBsIGltcGxlbWVudHMgTG9vc2VMaWJyYXJ5IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VMaWJyYXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvb3NlV0FSRmlsZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9vc2VXQVIoTG9vc2VXQVJGaWxlIG5ld0xvb3NlV0FSLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZVdBUiwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlV0FSKExvb3NlV0FSRmlsZSBuZXdMb29zZVdBUikgewotCQlpZiAobmV3TG9vc2VXQVIgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiAmJiBuZXdMb29zZVdBUiAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvb3NlV0FSKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3TG9vc2VXQVIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VXQVIpLmVJbnZlcnNlQWRkKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUywgTG9vc2VXQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvb3NlV0FSKG5ld0xvb3NlV0FSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG5ld0xvb3NlV0FSLCBuZXdMb29zZVdBUikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZVdBUihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUywgTG9vc2VXQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXJldHVybiBnZXRMb29zZVdBUigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJc2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlzZXRMb29zZVdBUigoTG9vc2VXQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXJldHVybiBnZXRMb29zZVdBUigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0xvb3NlTGlicmFyeUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI1OThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlTW9kdWxlSW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZU1vZHVsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdEREKCkgPGVtPkFsdCBERDwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZU1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX01PRFVMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIGdldEFsdEREKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERChBTFRfRERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIEFMVF9ERF9FREVGQVVMVCA9PSBudWxsID8gYWx0REQgIT0gbnVsbCA6ICFBTFRfRERfRURFRkFVTFQuZXF1YWxzKGFsdEREKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsdEREOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRERCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xvb3NlTW9kdWxlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MjcwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlV0FSRmlsZUltcGwgZXh0ZW5kcyBMb29zZU1vZHVsZUltcGwgaW1wbGVtZW50cyBMb29zZVdBUkZpbGUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb29zZUxpYnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlV0FSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX1dBUl9GSUxFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV0FSKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb29zZUxpYnMoKSB7Ci0JCWlmIChsb29zZUxpYnMgPT0gbnVsbCkgewotCQkJbG9vc2VMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTG9vc2VMaWJyYXJ5LmNsYXNzLCB0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpOwotCQl9Ci0JCXJldHVybiBsb29zZUxpYnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUxpYnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCXJldHVybiBnZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJZ2V0TG9vc2VMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb29zZUxpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlnZXRMb29zZUxpYnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJcmV0dXJuIGxvb3NlTGlicyAhPSBudWxsICYmICFsb29zZUxpYnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Mb29zZVdBUkZpbGVJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODAwZWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlY29uZmlnRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ0ZhY3RvcnksIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ0ZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUxvb3NlY29uZmlnRmFjdG9yeSB0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgPSAoTG9vc2Vjb25maWdGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIpOyAKLQkJCWlmICh0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVMb29zZWNvbmZpZ0ZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgTG9vc2Vjb25maWdGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZWNvbmZpZ0ZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT046IHJldHVybiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiByZXR1cm4gY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEU6IHJldHVybiBjcmVhdGVMb29zZU1vZHVsZSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTjogcmV0dXJuIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHJldHVybiBjcmVhdGVMb29zZVdBUkZpbGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKSB7Ci0JCUxvb3NlQXBwbGljYXRpb25JbXBsIGxvb3NlQXBwbGljYXRpb24gPSBuZXcgTG9vc2VBcHBsaWNhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZUxpYnJhcnkoKSB7Ci0JCUxvb3NlTGlicmFyeUltcGwgbG9vc2VMaWJyYXJ5ID0gbmV3IExvb3NlTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpIHsKLQkJTG9vc2VXQVJGaWxlSW1wbCBsb29zZVdBUkZpbGUgPSBuZXcgTG9vc2VXQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VXQVJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpIHsKLQkJTG9vc2VNb2R1bGVJbXBsIGxvb3NlTW9kdWxlID0gbmV3IExvb3NlTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUxvb3NlQ29uZmlndXJhdGlvbkltcGwgbG9vc2VDb25maWd1cmF0aW9uID0gbmV3IExvb3NlQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdQYWNrYWdlIGdldExvb3NlY29uZmlnUGFja2FnZSgpIHsKLQkJcmV0dXJuIChMb29zZWNvbmZpZ1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI4NzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIExvb3NlY29uZmlnUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ1BhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXBwbGljYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXJjaGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZU1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZVdBUkZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBMb29zZWNvbmZpZ0ZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKExvb3NlY29uZmlnUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIExvb3NlY29uZmlnUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUVqYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlID0gKENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTG9vc2Vjb25maWdQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlyZXR1cm4gbG9vc2VBcmNoaXZlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlTGlicmFyeSgpIHsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUxpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpIHsKLQkJcmV0dXJuIGxvb3NlV0FSRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VXQVJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZU1vZHVsZSgpIHsKLQkJcmV0dXJuIGxvb3NlTW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnRmFjdG9yeSBnZXRMb29zZWNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTG9vc2Vjb25maWdGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9BUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcHBsaWNhdGlvbkVDbGFzcywgTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTKTsKLQotCQlsb29zZUFyY2hpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfQVJDSElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19MT09TRV9BUFApOwotCi0JCWxvb3NlTGlicmFyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUxpYnJhcnlFQ2xhc3MsIExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUik7Ci0KLQkJbG9vc2VNb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb29zZU1vZHVsZUVDbGFzcywgTE9PU0VfTU9EVUxFX19BTFRfREQpOwotCi0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3MsIExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyk7Ci0KLQkJbG9vc2VXQVJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPT1NFX1dBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZVdBUkZpbGVFQ2xhc3MsIExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxvb3NlTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZUFyY2hpdmUoKSk7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsb29zZVdBUkZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZU1vZHVsZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGxvb3NlQXBwbGljYXRpb25FQ2xhc3MsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICJMb29zZUFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmUoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSwgImxvb3NlQXJjaGl2ZXMiLCBudWxsLCAwLCAtMSwgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQXJjaGl2ZUVDbGFzcywgTG9vc2VBcmNoaXZlLmNsYXNzLCAiTG9vc2VBcmNoaXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYmluYXJpZXNQYXRoIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfUmVzb3VyY2VzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VzUGF0aCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpLCAibG9vc2VBcHAiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihsb29zZUFyY2hpdmVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNNb2R1bGUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTGlicmFyeUVDbGFzcywgTG9vc2VMaWJyYXJ5LmNsYXNzLCAiTG9vc2VMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGUoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksICJsb29zZVdBUiIsIG51bGwsIDAsIDEsIExvb3NlTGlicmFyeS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTW9kdWxlRUNsYXNzLCBMb29zZU1vZHVsZS5jbGFzcywgIkxvb3NlTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZU1vZHVsZV9BbHRERCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWx0REQiLCBudWxsLCAwLCAxLCBMb29zZU1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcywgTG9vc2VDb25maWd1cmF0aW9uLmNsYXNzLCAiTG9vc2VDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25zIiwgbnVsbCwgMCwgLTEsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlV0FSRmlsZUVDbGFzcywgTG9vc2VXQVJGaWxlLmNsYXNzLCAiTG9vc2VXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5KCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksICJsb29zZUxpYnMiLCBudWxsLCAwLCAtMSwgTG9vc2VXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCX0KLQotfSAvL0xvb3NlY29uZmlnUGFja2FnZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDAyMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2Vjb25maWdTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTG9vc2Vjb25maWdTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUFyY2hpdmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUxpYnJhcnkoTG9vc2VMaWJyYXJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUxpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUNvbmZpZ3VyYXRpb24oTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZVdBUkZpbGUoTG9vc2VXQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZVdBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXJjaGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlV0FSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0xvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZmFhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBMb29zZWNvbmZpZ1N3aXRjaCB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OOiB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBsb29zZUFwcGxpY2F0aW9uID0gKExvb3NlQXBwbGljYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQXBwbGljYXRpb24obG9vc2VBcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlQXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlQXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkU6IHsKLQkJCQlMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlID0gKExvb3NlQXJjaGl2ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlQXJjaGl2ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobG9vc2VBcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiB7Ci0JCQkJTG9vc2VMaWJyYXJ5IGxvb3NlTGlicmFyeSA9IChMb29zZUxpYnJhcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTGlicmFyeShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxvb3NlQXJjaGl2ZShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFOiB7Ci0JCQkJTG9vc2VNb2R1bGUgbG9vc2VNb2R1bGUgPSAoTG9vc2VNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTW9kdWxlKGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTG9vc2VDb25maWd1cmF0aW9uIGxvb3NlQ29uZmlndXJhdGlvbiA9IChMb29zZUNvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQ29uZmlndXJhdGlvbihsb29zZUNvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHsKLQkJCQlMb29zZVdBUkZpbGUgbG9vc2VXQVJGaWxlID0gKExvb3NlV0FSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VXQVJGaWxlKGxvb3NlV0FSRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VNb2R1bGUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChsb29zZVdBUkZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlQXBwbGljYXRpb24oTG9vc2VBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VBcmNoaXZlKExvb3NlQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VMaWJyYXJ5KExvb3NlTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VXQVJGaWxlKExvb3NlV0FSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VDb25maWd1cmF0aW9uKExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ1N3aXRjaAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNDQ4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiPgotCTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50IiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29tcG9uZW50U2NvcGVkUmVmcyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJIYW5kbGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUG9ydENvbXBvbmVudFJlZiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlNlcnZpY2VSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IldlYlNlcnZpY2VzQ2xpZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iV2ViU2VydmljZXNSZXNvdXJjZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uIiBhcGk9ImZhbHNlIiA+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uUmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJDb25uZWN0b3JNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IkVqYk1vZHVsZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkphdmFDbGllbnRNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJXZWJNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQiPjwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AiIGFwaT0iZmFsc2UiID4KLQkJPHR5cGUgbmFtZT0iSlNQQ29uZmlnIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkpzcEZhY3RvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJKU1BQcm9wZXJ0eUdyb3VwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVGFnTGliUmVmVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50IiBhcGk9ImZhbHNlIiA+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uQ2xpZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJDbGllbnRGYWN0b3J5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJBdXRoQ29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJBdXRoTWV0aG9kS2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNvbnRleHRQYXJhbSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRpc3BhdGNoZXJUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFcnJvckNvZGVFcnJvclBhZ2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJFcnJvclBhZ2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRmlsdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkZpbHRlck1hcHBpbmciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJGb3JtTG9naW5Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJIVFRQTWV0aG9kVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iSFRUUE1ldGhvZFR5cGVFbnVtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iSW5pdFBhcmFtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iSlNQVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkxvZ2luQ29uZmlnIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWltZU1hcHBpbmciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IlJlc0F1dGhTZXJ2bGV0VHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlJvbGVOYW1lVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlY3VyaXR5Q29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlcnZsZXQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZXJ2bGV0TWFwcGluZyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlcnZsZXRUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IlNlc3Npb25Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUYWdMaWJSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJVUkxQYXR0ZXJuVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVzZXJEYXRhQ29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IldlYkFwcCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IldlYmFwcGxpY2F0aW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IldlYkFwcFJlc291cmNlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJXZWJUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iV2VsY29tZUZpbGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJXZWxjb21lRmlsZUxpc3QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIj48L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29tbW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRlcGxveW1lbnRFeHRlbnNpb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJEZXNjcmlwdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iRGVzY3JpcHRpb25Hcm91cCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRpc3BsYXlOYW1lIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRUpCTG9jYWxSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFamJSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQkJPHR5cGUgbmFtZT0iRWpiUmVmVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkVudkVudHJ5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRW52RW50cnlUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmxlVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ikljb25UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iSWRlbnRpdHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJKTkRJRW52UmVmc0dyb3VwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9Ikxpc3RlbmVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJQYXJhbVZhbHVlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iUU5hbWUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNBdXRoVHlwZUJhc2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNvdXJjZUVudlJlZiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlJlc291cmNlUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IlJlc1NoYXJpbmdTY29wZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlJZGVudGl0eSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlSb2xlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlSb2xlUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iVXNlQ2FsbGVySWRlbnRpdHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI+Ci0JCTx0eXBlIG5hbWU9IkpheHJwY21hcFJlc291cmNlRmFjdG9yeSIgcmVmZXJlbmNlPSJmYWxzZSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI+PC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSIgYXBpPSJmYWxzZSIgPgotCQk8dHlwZSBuYW1lPSJBY3RpdmF0aW9uU3BlYyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJBZG1pbk9iamVjdCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJDb25maWdQcm9wZXJ0eSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNvbm5lY3Rpb25EZWZpbml0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29ubmVjdG9yIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29ubmVjdG9yUmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkpjYUZhY3RvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJMaWNlbnNlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZUFkYXB0ZXIiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2VMaXN0ZW5lciIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNvdXJjZUFkYXB0ZXIiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZWN1cml0eVBlcm1pc3Npb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQWNrbm93bGVkZ2VNb2RlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFjdGl2YXRpb25Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJBc3NlbWJseURlc2NyaXB0b3IiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IkNNUEF0dHJpYnV0ZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNNUkZpZWxkIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29tbW9uUmVsYXRpb25zaGlwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29tbW9uUmVsYXRpb25zaGlwUm9sZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJDb250YWluZXJNYW5hZ2VkRW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRGVzdGluYXRpb25UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCRXh0ZW5zaW9uRmlsdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFamJGYWN0b3J5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCSmFyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRUpCTWV0aG9kQ2F0ZWdvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJFamJNZXRob2RFbGVtZW50SGVscGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCUmVsYXRpb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJFSkJSZWxhdGlvbnNoaXBSb2xlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFSkJSZXNvdXJjZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkVudGVycHJpc2VCZWFuIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRXhjbHVkZUxpc3QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJJUm9sZVNoYXBlU3RyYXRlZ3kiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJNZXNzYWdlRHJpdmVuIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJNZXRob2RFbGVtZW50S2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iTWV0aG9kUGVybWlzc2lvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik1ldGhvZFRyYW5zYWN0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iTXVsdGlwbGljaXR5S2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlF1ZXJ5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUXVlcnlNZXRob2QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBzIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJSZXR1cm5UeXBlTWFwcGluZyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlJvbGVTb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZXNzaW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iU2Vzc2lvblR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQkJPHR5cGUgbmFtZT0iU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvblR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDE5OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZHMgYWxsIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0Ci0jCi0jIDpCZWdpbjogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6QmVnaW46Ci0jQ09NUE9ORU5UUFJFRklYIENIS0oKLSNDT01QT05FTlROQU1FRk9SIENIS0ogSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uCi0jQ01WQ1BBVEhOQU1FIG5jZi9zcmMvamF2YS9jb20vaWJtL3dlYnNwaGVyZS92YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLQotCi1FUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFPUNIS0oxMDAwRTogVmFsaWRhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUgaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDFFOiBWYWxpZGF0aW9uIGZhaWxlZDoKLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUpCX1JFRlM9Q0hLSjEwMDJFOiBVbnJlc29sdmFibGUgRUpCIHJlZmVyZW5jZXMgaW4gezB9OwotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1JTlZBTElEX0REPUNIS0oxMDAzRTogVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGhhcyBhbiBpbnZhbGlkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkk9Q0hLSjEwMDRFOiBUaGUgVVJJLCB7MH0sIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDVFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gYW4gdW5rbm93biBzeW50YXggZXJyb3IuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaGVscCBpZGVudGlmeSB0aGUgYmFkIHNlY3Rpb24uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYW5ub3QgYmUgb3BlbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXz1JV0FFMDAwMkUgRHVwbGljYXRlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSAiezB9IiBpbiBhcHBsaWNhdGlvbi1jbGllbnQueG1sLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwMDNFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgYXBwbGljYXRpb24tY2xpZW50LnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl89SVdBRTAwMDRFIER1cGxpY2F0ZSBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlICJ7MH0iIGluIGFwcGxpY2F0aW9uLWNsaWVudC54bWwuCi1BUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl89SVdBRTAwMzVFIFRoZSBNYWluLUNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY5ZjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyAKLSMgRUFSIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQgCi0jICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtXIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE1lc3NhZ2UgbnVtYmVycyBhcmUgZm91ciBkaWdpdCBudW1iZXJzLCBmcm9tICcwMDAwJyB0byAnOTk5OScsIGluY2x1c2l2ZS4KLSMgTWVzc2FnZSBudW1iZXJzIGFyZSBmaWxsZWQgdG8gdGhlIGxlZnQgd2l0aCAnMCcsIHRvIGEgd2lkdGggb2YgNC4KLSMKLSMgVmFsaWQgbWVzc2FnZSB0eXBlIGNvZGVzIGFyZToKLSMgICAgIEkgKEluZm9ybWF0aW9uYWwpCi0jICAgICBXIChXYXJuaW5nKQotIyAgICAgRSAoRXJyb3IpCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLSMgMjktSnVuZS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieSAKLSMgIEhhbnkgU2FsZW0gYW5kIG93bmVkIGJ5IERlbm5pcyBIZWJlcnQuICBBbnkgZnV0dXJlIGNoYW5nZXMgc2hvdWxkIAotIyAgYWxzbyBiZSB2ZXJpZmllZCB1c2luZyB0aGlzIHRvb2wuICBQbGVhc2UgY29udGFjdCBEZW5uaXMgCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0oxMDAwRTogRUFSIFZhbGlkYXRpb24gZmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEU9Q0hLSjEwMDFFOiBUaGUgRUFSIHByb2plY3QgezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM9Q0hLSjEwMDJFOiBEdXBsaWNhdGUgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkk9Q0hLSjEwMDNFOiBBIG1vZHVsZSBoYXMgYmVlbiBkZWZpbmVkIHdpdGggbm8gVVJJLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX0VBUl9NSVNTSU5HX1VSST1DSEtKMTAwNEU6IFRoZSBVUkksIHswfSwgZG9lcyBub3QgbWF0Y2ggYW55dGhpbmcgaW4gdGhlIEVBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwNUU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIHN0YXJ0IG9mIHRoZSBiYWQgc2VjdGlvbiBpcyBhdCBsaW5lIHswfSwgY29sdW1uIHsxfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMDZFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBzdGFydCBvZiB0aGUgYmFkIHNlY3Rpb24gaXMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIGVycm9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfPUlXQUUwMDA1RSBUaGUgVVJJIHswfSBjb250YWlucyBhIHNwYWNlLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIGl0IGNhbm5vdCBiZSByZWZlcmVuY2VkIGZyb20gYSBtYW5pZmVzdCBmaWxlLgotTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl89SVdBRTAwMDZFIFRoZSBtb2R1bGUgezB9IGhhcyBkdXBsaWNhdGUgdXJpIGluIEVBUjogezF9LgotTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfPUlXQUUwMDA3RSBTYW1lIGNvbnRleHQgcm9vdCAiezB9IiBleGlzdHMgaW4gV2ViIG1vZHVsZXMgInsxfSIgYW5kICJ7Mn0iLgotTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfPUlXQUUwMDA5RSBUaGUgbW9kdWxlIHswfSBoYXMgZW1wdHkgPGFsdC1kZD4gdGFnIGluIEVBUiB7MX0uICBUaGUgdGFnIHNob3VsZCBiZSByZW1vdmVkIG9yIHRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQuCi1EVVBMSUNBVEVfVVRJTEpBUl9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXz1JV0FFMDAxMEUgPVRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgdXRpbGl0eSBKQVIgVVJJIHsyfS4KLURVUExJQ0FURV9NT0RVTEVfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl89SVdBRTAwMTFFIFRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgbW9kdWxlIG5hbWUgezJ9LgotTUVTU0FHRV9VVElMX1VSSV9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTJFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBVUkkuCi1NRVNTQUdFX1VUSUxfUFJPSkVDVF9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTNFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBwcm9qZWN0IG5hbWUuCi1FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXz1JV0FFMDAxNEUgQW4gZXJyb3Igb2NjdXJyZWQgdmFsaWRhdGluZyB0aGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHswfS4KLU1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXz1JV0FFMDAxNUUgVGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MH0gZG9lcyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgotTUFOSUZFU1RfTElORV9FWENFRURTX0xFTkdUSF9FUlJPUl89SVdBRTAwMTZFIExpbmUgezB9IGluIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezF9IGV4Y2VlZHMgdGhlIHNwZWNpZmljYXRpb24gbGltaXQgb2YgNzIgYnl0ZXMuCi0KLUlOVkFMSURfVVJJX0ZPUl9NT0RVTEVfRVJST1JfPUlXQUUwMDE3RSBUaGUgbW9kdWxlIHswfSBoYXMgYSB3cm9uZyBkZWZhdWx0IGV4dGVuc2lvbiAoLmphciBmb3IgRUpCIG1vZHVsZXMgYW5kIC53YXIgZm9yIFdlYiBtb2R1bGVzKS4KLUVBUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDAxOEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciBhcHBsaWNhdGlvbi54bWwgaW4gcHJvamVjdCAiezF9IiBuZWVkcyB0byBiZSB2ZXJzaW9uICJ7Mn0iLgotCi1NT0RVTEVfRERfUEFSU0VfTElORUNPTF9FUlJPUl89SVdBRTAwMTlFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezF9LCBjb2x1bW4gezJ9LgotTU9EVUxFX0REX1BBUlNFX0xJTkVfRVJST1JfPUlXQUUwMDIwRSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIG1vZHVsZSB7MH0gY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIGJhZCBzZWN0aW9uIHN0YXJ0cyBhdCBsaW5lIHsxfQotTU9EVUxFX0REX1BBUlNFX05PSU5GT19FUlJPUl89SVdBRTAwMjFFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLgotRUpCX0JFQU5fRUpCX0xJTktfSU5URUZBQ0VfTUlTTUFUQ0hfRVJST1JfPUlXQUUwMDM3RSBUaGUgaW50ZXJmYWNlcyBvZiB0aGUgbGlua2VkIGVudGVycHJpc2UgYmVhbiB7MH0gZG8gbm90IG1hdGNoIHRob3NlIGluIEVKQiByZWYgezF9IGluIG1vZHVsZSB7Mn0uCi0KLUNMQVNTUEFUSF9DT01QT05FTlRfVVJJX01BVENIRVNfQVJDSElWRV9VUkk9VVJJIHsxfSBmb3IgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5IGZyb20gcHJvamVjdCB7MH0gY2xhc2hlcyB3aXRoIGV4aXN0aW5nIGFyY2hpdmUgaW4gRUFSLgotRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJPVVSSSB7MX0gZm9yIGNsYXNzcGF0aCBkZXBlbmRlbmN5IGZyb20gcHJvamVjdCB7MH0gbWFwcyB0byBhIGRpZmZlcmVudCBmaWxlIHN5c3RlbSBwYXRoIGFzIGFub3RoZXIgY2xhc3NwYXRoIGRlcGVuZGVuY3kgd2l0aCB0aGUgc2FtZSBVUkkuCi0KLUpFRTVfUFJPSkVDVF9SRUZFUkVOQ0VEX0JZX1BSRV9KRUU1X0VBUj1GYWNldCB2ZXJzaW9uIGZvciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezB9IG11c3QgYmUgNS4wIHRvIGNvbnRhaW4gSmF2YSBFRSA1LjAgcHJvamVjdCB7MX0uCi0KLSMgd2FybmluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSTklOR19NRVRBRk9MREVSX01JU1NJTkc9SVdBSjAwMDBXOiBNZXRhIGZvbGRlciB7MH0gbXVzdCBleGlzdCBpbiBwcm9qZWN0IHsxfS4KLVdBUk5JTkdfRklMRV9NSVNTSU5HPUlXQUowMDAxVzogezB9IG11c3QgZXhpc3QgaW4gcHJvamVjdCB7MX0uCi1NRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fPUlXQUUwMDIyVyBUaGUgbW9kdWxlIHswfSBoYXMgYWx0LWRkIHsxfSwgYnV0IHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBpbiBFQVIgezJ9LgotSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfT05FX1dBUk5fPUlXQUUwMDIzVyBUaGUgTWFuaWZlc3QgQ2xhc3MtUGF0aCBpbiBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgRUFSOiB7MX0uCi1JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9UV09fV0FSTl89SVdBRTAwMjRXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGZvciBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSwgezF9LCB0aGF0IGlzIG5vdCByZXNvbHZhYmxlIHRvIGEgZmlsZSBvciBtb2R1bGUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb246IHsyfS4KLUlOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX0RFUEVOREVOQ1lfV0FSTl89SVdBRTAwMjVXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGluIG1vZHVsZSB7MH0gY29udGFpbnMgYW4gZW50cnksIHsxfSwgdGhhdCByZXNvbHZlcyB0byBhcmNoaXZlIHsyfS4gIFRoaXMgZGVwZW5kZW5jeSBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgSmF2YSBFRSBzcGVjaWZpY2F0aW9uLgotUFJPSkVDVF9JU19DTE9TRURfV0FSTl89SVdBRTAwMjZXIEVBUiBWYWxpZGF0aW9uIGNhbm5vdCBydW4gb24gY2xvc2VkIHByb2plY3Q6IHswfS4gT3BlbiB0aGUgcHJvamVjdCwgYW5kIHRyeSBhZ2Fpbi4KLVBST0pFQ1RfRE9FU19OT1RfRVhJU1RfV0FSTl89SVdBRTAwMjdXIFRoZSBwcm9qZWN0IHswfSBmb3IgbW9kdWxlIG9yIHV0aWxpdHkgSkFSIHsxfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezJ9IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi1NSVNTSU5HX1dFQk5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMjhXIFRoZSB3ZWIgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGlzIG5vdCBhIEphdmEgRUUgV2ViIHByb2plY3QuCi1ERVBSRUNBVEVEX0FCU1BBVEhTX1dBUk5fPUlXQUUwMDI5VyBUaGUgSUJNIGV4dGVuc2lvbnMgZmlsZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezB9IGNvbnRhaW5zIGRlcHJlY2F0ZWQgYWJzb2x1dGUgcGF0aHMuICBVc2UgdGhlIGFwcGxpY2F0aW9uIGVkaXRvciB0byBjbGVhbiB1cCB0aGUgZmlsZS4KLUlOVkFMSURfQ09OVEVYVFJPT1RfV0VCTU9EVUxFX1dBUk5fPUlXQUUwMDMwVyBUaGUgY29udGV4dCByb290IGZvciBXZWIgbW9kdWxlOiB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OiB7MX0gZG9lcyBub3QgbWF0Y2ggdGhlIGNvbnRleHQgcm9vdCBpbiB3ZWIgcHJvamVjdCBzZXR0aW5ncyBvZiB7Mn0uCi1NSVNTSU5HX0NMSUVOVE5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMzFXIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q6ezF9IGlzIG5vdCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdC4KLU1JU1NJTkdfRUpCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzMlcgVGhlIEVKQiBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaXMgbm90IGFuIEVKQiBwcm9qZWN0LgotTUlTU0lOR19QUk9KRUNUX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzM1cgVGhlIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBhcyBhIEphdmEgRUUgbW9kdWxlIGRlcGVuZGVuY3kuIAotSU5WQUxJRF9DQVNFX0ZPUl9NQU5JRkVTVF9FUlJPUl89SVdBRTAwMzhFIFRoZSBjYXNlIG9mIHRoZSBtYW5pZmVzdCBmaWxlIG5hbWUgInswfSIgaW4gYXJjaGl2ZSB7MX0gaW4gaW5jb3JyZWN0LiAgRmlsZSBuYW1lIG11c3QgYmUgIk1FVEEtSU5GL01BTklGRVNULk1GIiwgY2FzZSBzZW5zaXRpdmUuCi1VUklfQUxSRUFEWV9FWElTVFNfSU5fRUFSX1dBUk5fPUlXQUUwMDM5VyBQcm9qZWN0IHV0aWxpdHkgSkFSIFVSSSB7MH0gY29sbGlkZXMgd2l0aCBhbiBleGlzdGluZyBmaWxlIGluIHByb2plY3QgezF9LgotTUlTU0lOR19NT0RVTEVfRVhURU5TSU9OX0VSUk9SXz1JV0FFMDA0MEUgVGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiBpbiBFQVIgcHJvamVjdDogezB9IGlzIG1pc3NpbmcgbW9kdWxlIGV4dGVuc2lvbiBmb3IgbW9kdWxlIHByb2plY3Q6IHsxfS4KLVBST0pFQ1RfU0VSVkVSX1RBUkdFVF9ET0VTX05PVF9NQVRDSF9FQVI9VGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBjb250YWluaW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCAiezF9IgotTk9fU0VSVkVSX1RBUkdFVF9NT0RVTEVfSU5fRUFSX1dJVEhfU0VSVkVSX1RBUkdFVD1UaGUgbW9kdWxlIHByb2plY3QgInswfSIgd2l0aCBubyB0YXJnZXQgc2VydmVyIGJlbG9uZ3MgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0ICJ7MX0iIHRoYXQgaGFzIGEgdGFyZ2V0IHNlcnZlcgotTk9fU0VSVkVSX1RBUkdFVF9PTl9FQVJfV0lUSF9NT0RVTEVfU0VSVkVSX1RBUkdFVFM9VGhlIGVhciBwcm9qZWN0ICJ7MH0iIHdpdGggbm8gdGFyZ2V0IHNlcnZlciBoYXMgbW9kdWxlIHByb2plY3QgInsxfSIgdGhhdCBoYXMgYSB0YXJnZXQgc2VydmVyCi1JTlZBTElEX0VBUl9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMPVRoZSBKYXZhIEVFIDEuNCBzcGVjaWZpY2F0aW9uIEVBUiBwcm9qZWN0ICJ7MH0iIGhhcyBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IHNlcnZlciAiezF9IgotSU5WQUxJRF9NT0RVTEVfU0VSVkVSX1RBUkdFVF9GT1JfMTRfU1BFQ19MRVZFTD1UaGUgSmF2YSBFRSAxLjQgc3BlY2lmaWNhdGlvbiBtb2R1bGUgcHJvamVjdCAiezB9IiBoYXMgYW4gaW5jb21wYXRpYmxlIHRhcmdldCBzZXJ2ZXIgInsxfSIuCi1NRVNTQUdFX0lOQ09NUEFUSUJMRV9TUEVDX1dBUk5JTkdfPUlXQUUwMDA4RSBUaGUgbW9kdWxlICJ7MH0iIGlzIGF0IGFuIGluY29tcGF0aWJsZSBKYXZhIEVFIHNwZWNpZmljYXRpb24gbGV2ZWwgdGhhbiB0aGF0IG9mIHRoZSAiezF9IiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotTUVTU0FHRV9JTkNPTVBBVElCTEVfMTNfU1BFQ19XQVJOSU5HXz1JV0FFMDAwOEUgVGhlIG1vZHVsZSAiezB9IiBpcyBKYXZhIEVFIHYxLjMgc3BlY2lmaWNhdGlvbiBsZXZlbCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIGluIHRoZSB2MS4yIEVBUi4KLU1FU1NBR0VfSU5DT01QQVRJQkxFXzE0X1NQRUNfV0FSTklOR189VGhlIG1vZHVsZSAiezB9IiBpcyBKYXZhIEVFIHYxLjQgc3BlY2lmaWNhdGlvbiBsZXZlbCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIGluIHRoZSB2MS4zIEVBUi4KLUVBUl9WQUxJREFUSU9OX0lOVEVSTkFMX0VSUk9SX1VJXz1JV0FFMDA1M0UgQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkIHJ1bm5pbmcgdmFsaWRhdGlvbiBvbiBwcm9qZWN0OnswfSwgY2hlY2sgdGhlIGxvZyBmaWxlIGZvciBkZXRhaWxzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VqYnZhbGlkYXRvci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYmNlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VqYnZhbGlkYXRvci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogQ29kZSBvcmllbnRlZCBpbnN0cnVjdGlvbnM6Ci0jICAgICAqCi0jICAgICAqIEluIHRoZSBzdHJpbmcsIHlvdSBtYXkgc2VlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBzZXF1ZW5jZXM6Ci0jICAgICAqIGEpIHtufSAgd2hlcmUgbiBpcyBhIG51bWJlci4gVGhlc2UgYXJlIHJlcGxhY2VhYmxlIHBhcmFtZXRlcnMuCi0jICAgICAqIGIpICcnICBJbiAucHJvcGVydGllcyBmaWxlcywgaW4gb3JkZXIgdG8gc2VlIG9uZSBhcG9zdHJvcGhlICgnKSBpbiB0aGUgZmluYWwKLSMgICAgICogICAgc3RyaW5nLCBzb21ldGltZXMgdHdvIGFwb3N0cm9waGVzIG11c3QgYmUgZW50ZXJlZCBpbiB0aGUgc3RyaW5nLiBJbiB0aGUgdHJhbnNsYXRlZAotIyAgICAgKiAgICBzdHJpbmcsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB7bn0gaW4gdGhlIHN0cmluZywgdGhlbiB0byBzaG93IG9uZSBhcG9zdHJvcGhlCi0jICAgICAqICAgIHRvIHRoZSB1c2VyLCBwdXQgdHdvIGFwb3N0cm9waGVzIGluIHRoZSBzdHJpbmcuIElmIHRoZXJlIGFyZSBubyB7bn0gaW4gdGhlIHN0cmluZywKLSMgICAgICogICAgdGhlbiBwdXQgb25lIGFwb3N0cm9waGUuCi0jICAgICAqICAgIEZvciBleGFtcGxlLCBzYXkgdGhhdCB5b3Ugd2FudCB0aGUgdXNlciB0byByZWFkICJHZW9yZ2UncyBmaWxlIi4gCi0jICAgICAqICAgICAgICBHRU9SR0U9R2VvcmdlJ3MgZmlsZSB3YXMgb24gdGhlIGRlc2suCi0jICAgICAqICAgICAgICBHRU9SR0UyPUdlb3JnZScncyBmaWxlIGFuZCB7MH0gd2VyZSBvbiB0aGUgZGVzay4KLSMgICAgICogICAgR0VPUkdFIHVzZXMgb25lIGFwb3N0cm9waGUgYmVjYXVzZSB0aGVyZSBhcmUgbm8ge259IGFuZCBHRU9SR0UyCi0jICAgICAqICAgIHVzZXMgdHdvIGFwb3N0cm9waGVzIGJlY2F1c2UgdGhlcmUgaXMgYSB7bn0uCi0jICAgICAqIGMpICcnIHRleHQgJycgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGRvdWJsZQotIyAgICAgKiAgICBhcG9zdHJvcGhlcyBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuIAotIyAgICAgKiBkKSA8dGV4dD4gd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGFuZ2xlCi0jICAgICAqICAgIGJyYWNrZXRzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogZSkgInRleHQiIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBxdW90YXRpb24gCi0jICAgICAqICAgIG1hcmtzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogICAgCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIE90aGVyIGluc3RydWN0aW9ucwotIyAgICAgKiBhKSBEbyBub3QgdHJhbnNsYXRlIGFueSB0ZXh0IHRoYXQgaXMgb24gYSBsaW5lIHdoaWNoIGJlZ2lucyB3aXRoIGEgY29tbWVudCAKLSMgICAgICogICAgc3ltYm9sICgjKS4KLSMgICAgICogYikgRG8gbm90IHRyYW5zbGF0ZSB0aGVzZSB3b3JkczogCi0jICAgICAqICAgICAgICBzY2hlbWEsIEVKQiwgUkRCLCBKQVIsIFJNSSwgQk1QLCBDTVAsIE9PU1FMCi0jICAgICAqIGMpIFBsZWFzZSByZXR1cm4gdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHVzaW5nIHRoZSBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0jICAgICAqICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdHdvIG9mIHRoZSBmaWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUuCi0jICAgICAqCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIEFueSBvdGhlciBjb21tZW50cyB0byB0aGUgdHJhbnNsYXRvcnMgYXJlIG9uIGxpbmVzIHdoaWNoIHN0YXJ0IGxpa2UgdGhpczogICMgMlRDOgotIwotIyBWZXJzaW9uIDEuNDIKLSMKLQotIwotIyBCZWdpbiBFSkIgVmFsaWRhdG9yIHN0cmluZ3MuCi0jCi0jIFRoZSBwdXJwb3NlIG9mCi0jIElEczoKLSMgICAgU1RBVFVTPVN0YXR1cyBtZXNzYWdlCi0jICAgIExPQz1UZXh0IGRlc2NyaXB0aW9uIG9mIGEgbG9jYXRpb24gKGlkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbSB3aGVuIG5vIGxpbmUgbnVtYmVyIGlzIGF2YWlsYWJsZSkKLSMgICAgQ0hLSj1FSkIgdmFsaWRhdGlvbiBtZXNzYWdlCi0jCi0KLSMKLSMgU3RhcnQgb2Ygc3RhdHVzIG1lc3NhZ2VzCi0jCi1TVEFUVVNfVkFMSURBVElORz1WYWxpZGF0aW5nIHswfS4KLQotTE9DX0NMQVNTPUNsYXNzOiB7MH0KLUxPQ19GSUVMRD1GaWVsZDogezB9LCBDbGFzczogezF9Ci1MT0NfTUVUSE9EPU1ldGhvZDogezB9LCBDbGFzczogezF9Ci1MT0NfQkVBTj1FbnRlcnByaXNlIGJlYW46IHswfQotTE9DX1JPTEU9PGxvY2FsUmVsYXRpb25zaGlwUm9sZXM+OiB7MH0sIEVudGVycHJpc2UgYmVhbjogezF9Ci1MT0NfUk9MRVJFRj08c2VjdXJpdHktcm9sZS1yZWY+OiB7MH0KLUxPQ19NRVRIT0RFTEVNRU5UPTxtZXRob2Q+IGVsZW1lbnQ6IHswfQotTE9DX01FVEhPRFBFUk1JU1NJT049PG1ldGhvZC1wZXJtaXNzaW9uPiBlbGVtZW50OiB7MH0KLUxPQ19NRVRIT0RUUkFOU0FDVElPTj08Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBlbGVtZW50OiB7MH0KLUxPQ19FSkJSRUxBVElPTj08ZWpiLXJlbGF0aW9uPjogezB9Ci1MT0NfRUpCUkVMQVRJT05TSElQUk9MRT08ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPjogezB9LCA8ZWpiLXJlbGF0aW9uPjogezF9Ci0jCi0jIGVuZCBvZiBzdGF0dXMgbWVzc2FnZXMKLSMKLQotIwotIyBTdGFydCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0jCi0jIEFsbCB1bmlxdWUgZXJyb3IgaWRzIGZvbGxvdyB0aGlzIGZvcm1hdDoKLSMKLSMgICAgQ0hLSm5ubm5bc10KLSMKLSMgd2hlcmUKLSMgICAgLSBDSEtKIGlzIHRoZSBmb3VyIGNoYXJhY3RlciB1bmlxdWUgY29tcG9uZW50IHByZWZpeAotIyAgICAtIG5ubm4gaXMgdGhlIG51bWVyaWNhbCBpZCwgdW5pcXVlIHdpdGhpbiBFSkIgVmFsaWRhdG9yCi0jICAgIC0gW3NdIGlzIHRoZSBzZXZlcml0eSBpbmRpY2F0b3I6IEUgKGVycm9yKSwgVyAod2FybmluZyksIG9yIEkgKGluZm9ybWF0aW9uKS4KLSMKLSMgbm5ubiByYW5nZXMgZnJvbSAyMDAwIC0gMjk5OQotIyAgICAyMDAwIC0gMjA5OSBNZXNzYWdlcyBvbiBhIGNsYXNzCi0jICAgIDIxMDAgLSAyMTk5IE1lc3NhZ2VzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBXZWJzcGhlcmUgb3IgV1NBIChpLmUuLCBub3QgbWVudGlvbmVkIGluIEVKQiBzcGVjaWZpY2F0aW9uLCBzdWNoIGFzIGFzc29jaWF0aW9ucyAmIGZpbmRlcnMpCi0jICAgIDIyMDAgLSAyMzk5IE1lc3NhZ2VzIG9uIGEgZmllbGQKLSMgICAgMjQwMCAtIDI3OTkgTWVzc2FnZXMgb24gYSBtZXRob2QKLSMgICAgMjgwMCAtIDI4OTkgTWVzc2FnZXMgb24gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotIyAgICAyOTAwIC0gMjk5OSBNaXNjZWxsYW5lb3VzCi0jCi0KLSMgCi0jIE1lc3NhZ2VzIGNvbW1vbiBhY3Jvc3MgRUpCIHNwZWNpZmljYXRpb25zCi0jCi1DSEtKMjkwMD1DSEtKMjkwMEk6IEludGVybmFsIGVycm9yIHdoZW4gcnVubmluZyBFSkIgdmFsaWRhdG9yLiBSZWFkIHRoZSBsb2cgZm9yIGRldGFpbHMuCi1DSEtKMjg1Mj1DSEtKMjg1Mlc6IEludGVybmFsIGVycm9yIHdoaWxlIHZhbGlkYXRpbmcgezB9LiBUaGUgYmVhbiBiZWluZyB2YWxpZGF0ZWQgd2FzIHsxfS4KLUNIS0oyNDMzPUNIS0oyNDMzVzogQ2Fubm90IHZhbGlkYXRlIHswfSBiZWNhdXNlIHsxfSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI5MDc9Q0hLSjI5MDdFOiBUeXBlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI5MDU9Q0hLSjI5MDVXOiBUaGUgRUpCIFZhbGlkYXRvciBkaWQgbm90IHJ1biBiZWNhdXNlIGVqYi1qYXIueG1sIGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IgZm91bmQuIFJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUNIS0oyMDQxPUNIS0oyMDQxSTogUGVybWFuZW50IGNsYXNzZXMgYW5kIGludGVyZmFjZXMgc2hvdWxkIGJlIGluIGEgbmFtZWQgcGFja2FnZS4gKEpMUyAyLjA6IDcuNC4yKS4KLQotQ0hLSjI0NTYuaT1DSEtKMjQ1Nlc6IHswfSBzaG91bGQgdGhyb3cgezF9IGZvciB7Mn0gb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBkZXBsb3ltZW50IGNvZGUuCi1DSEtKMjQ1Ni5tPUNIS0oyNDU2VzogVGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IHswfSBmb3IgezF9IG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycyBpbiB0aGUgZGVwbG95bWVudCBjb2RlLgotCi0jCi0jIGVuZCBvZiBjb21tb24gbWVzc2FnZXMKLSMKLQotIwotIyBNZXNzYWdlcyBmb3IgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotIwotQ0hLSjIwMDEuZWIuZWpiMTE9Q0hLSjIwMDFXOiBUaGUgezB9IGtleSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgezF9IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi45KQotQ0hLSjIwMDIuZWIuaS5lamIxMT1DSEtKMjAwMlc6IFRoaXMgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB7MH0uIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyMDAyLmViLm0uZWpiMTE9Q0hLSjIwMDJXOiBUaGlzIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyMDAzRS5lamIxMT1DSEtKMjAwM0U6IFRoaXMgY2xhc3MgbXVzdCBub3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uLiAoRUpCIDEuMTogNi41LjMpLgotQ0hLSjIwMDNJLmVqYjExPUNIS0oyMDAzSTogQmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHN0YXRlZnVsIHNlc3Npb24gYmVhbnMgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uLiAoRUpCIDEuMTogNi41LjMpLgotQ0hLSjIwMDQuZWIuaS5lamIxMT1DSEtKMjAwNFc6IFRoZSB7MX0gYmVhbiBjbGFzcyBzaG91bGQgbm90IGltcGxlbWVudCB0aGUgezB9IGVqYkZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS40LjYpCi1DSEtKMjAwNC5lYi5tLmVqYjExPUNIS0oyMDA0VzogVGhlIHswfSBiZWFuIGNsYXNzIHNob3VsZCBub3QgaW1wbGVtZW50IGFuIGVqYkZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS40LjYpCi1DSEtKMjAwNS5laC5pLmVqYjExPUNIS0oyMDA1RTogezB9IG11c3QgYmUgZWl0aGVyIGEgY3JlYXRlIG1ldGhvZCBvciBhIGZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAwNS5laC5tLmVqYjExPUNIS0oyMDA1RTogVGhlIG1ldGhvZCBtdXN0IGJlIGVpdGhlciBhIGNyZWF0ZSBtZXRob2Qgb3IgYSBmaW5kIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMDYuc2IuZWpiMTE9Q0hLSjIwMDZFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMDYuZWIuZWpiMTE9Q0hLSjIwMDZFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAwNy5zYi5lamIxMT1DSEtKMjAwN1c6IHswfSBzaG91bGQgbm90IGRlY2xhcmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMDcuZWIuZWpiMTE9Q0hLSjIwMDdXOiB7MH0gc2hvdWxkIG5vdCBkZWNsYXJlIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMDguc2IuZWpiMTE9Q0hLSjIwMDhFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlamJDcmVhdGUgbWV0aG9kLiAoRUpCIDEuMTogNi41LjUsIDYuMTAuMykKLUNIS0oyMDA5LmViLmVqYjExPUNIS0oyMDA5RTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIChFSkIgMS4xOiA5LjIuNSkKLUNIS0oyMDEwLnNoLmVqYjExPUNIS0oyMDEwRTogVGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNyZWF0ZSBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAxMS5laC5lamIxMT1DSEtKMjAxMUU6IFRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMTIuc3IuZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjUpLgotQ0hLSjIwMTIuc2guZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjIwMTIuZXIuZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuNykuCi1DSEtKMjAxMi5laC5lamIxMT1DSEtKMjAxMkU6IFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gKEVKQiAxLjE6IDkuMi44KS4KLUNIS0oyMDEzLnNiLmVqYjExPUNIS0oyMDEzRTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHsxfS4gKEVKQiAxLjE6IDYuMTAuMikuCi1DSEtKMjAxMy5lYi5lamIxMT1DSEtKMjAxM0U6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB7MX0uIChFSkIgMS4xOiA5LjIuMikuCi1DSEtKMjAxNC5zYi5lamIxMT1DSEtKMjAxNEU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgYWJzdHJhY3QuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAxNC5lYi5lamIxMT1DSEtKMjAxNEU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgYWJzdHJhY3QuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDE1LnNiLmVqYjExPUNIS0oyMDE1RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDE1LmViLmVqYjExPUNIS0oyMDE1RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMTcuc3IuZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjIwMTcuc2guZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjIwMTcuZXIuZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjAxNy5laC5lamIxMT1DSEtKMjAxN0U6IEludGVyZmFjZSBtdXN0IGV4dGVuZCB7MH0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDE5LmViLmVqYjExPUNIS0oyMDE5STogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi45KSAoUk1JIDEuMzogMi42KS4KLQotCi1DSEtKMjAyMC5lYi5lamIxMT1DSEtKMjAyMEU6IFRoZSB7MH0ga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMDIxLmViLmVqYjExPUNIS0oyMDIxRTogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjAyMi5zYi5lamIxMT1DSEtKMjAyMkU6IHswfSBiZWFuIGNsYXNzIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMjIuZWIuZWpiMTE9Q0hLSjIwMjJFOiB7MH0gYmVhbiBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMjMuc3IuaS5lamIxMT1DSEtKMjAyM0U6IHswfSBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjIwMjMuc3IubS5lamIxMT1DSEtKMjAyM0U6IFRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezB9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjAyMy5lci5pLmVqYjExPUNIS0oyMDIzRTogezB9IG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyMDIzLmVyLm0uZWpiMTE9Q0hLSjIwMjNFOiBUaGlzIG1ldGhvZCBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHswfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjAyNC5zaC5pLmVqYjExPUNIS0oyMDI0RTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IGNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI0LnNoLm0uZWpiMTE9Q0hLSjIwMjRFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBjcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNS5zYi5pLmVqYjExPUNIS0oyMDI1RTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IGVqYkNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI1LnNiLm0uZWpiMTE9Q0hLSjIwMjVFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBlamJDcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNi5zaC5pLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MX0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB7MH0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAyNi5zaC5tLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MH0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyMDI2LmVoLmkuZWpiMTE9Q0hLSjIwMjZFOiBCZWFuIGNsYXNzIHsxfSBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHswfS4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMjYuZWgubS5lamIxMT1DSEtKMjAyNkU6IEJlYW4gY2xhc3MgezB9IG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDI4LmViLmkuZWpiMTE9Q0hLSjIwMjhXOiB7MH0gd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAyOC5lYi5tLmVqYjExPUNIS0oyMDI4VzogVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAyOS5lYi5pLmVqYjExPUNIS0oyMDI5VzogezB9IGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSBpbnRlcmZhY2UgezF9LiAoRUpCIDEuMTogOS4yLjMpCi1DSEtKMjAyOS5lYi5tLmVqYjExPUNIS0oyMDI5VzogVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lIGludGVyZmFjZSB7MH0uIChFSkIgMS4xOiA5LjIuMykKLUNIS0oyMDMwLmVoLmkuZWpiMTE9Q0hLSjIwMzBFOiB7MH0gbXVzdCBoYXZlIGEgbWF0Y2hpbmcgZWpiRmluZCBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAzMC5laC5tLmVqYjExPUNIS0oyMDMwRTogVGhpcyBtZXRob2QgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgZWpiRmluZCBtZXRob2QgaW4gdGhlIHswfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAzMi5lYi5lamIxMT1DSEtKMjAzMlc6IEJlYW4gY2xhc3MgezB9IG11c3QgZGVjbGFyZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuIChFSkIgMS4xOiA5LjQuNykKLUNIS0oyMDMzLmViLmVqYjExPUNIS0oyMDMzVzogVGhlIHNldEVudGl0eUNvbnRleHQoRW50aXR5Q29udGV4dCBpYykgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzQuZWIuZWpiMTE9Q0hLSjIwMzRXOiBUaGUgdW5zZXRFbnRpdHlDb250ZXh0KCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzUuZWIuZWpiMTE9Q0hLSjIwMzVXOiBUaGUgZWpiQWN0aXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNi5lYi5lamIxMT1DSEtKMjAzNlc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNy5lYi5lamIxMT1DSEtKMjAzN1c6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzOC5lYi5lamIxMT1DSEtKMjAzOFc6IFRoZSBlamJMb2FkKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzkuZWIuZWpiMTE9Q0hLSjIwMzlXOiBUaGUgZWpiU3RvcmUoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi0KLUNIS0oyMDQwLnNiLmVqYjExPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIChFSkIgMS4xOiA2LjEwLjIpCi0KLUNIS0oyMTAwLmVqYjExPUNIS0oyMTAwRTogQm90aCBlbmRzIG9mIHRoZSByb2xlIG11c3QgdXNlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLgotQ0hLSjIxMDEuZWpiMTE9Q0hLSjIxMDFFOiBCb3RoIGVuZHMgb2YgdGhlIHJvbGUgbXVzdCB1c2UgdGhlIHNhbWUgdHlwZS4KLUNIS0oyMTAyLmVoLmVqYjExPUNIS0oyMTAyRTogRWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2Qgb24gdGhlIHswfSBjbGFzcywgbXVzdCBiZSBkZWZpbmVkLgotQ0hLSjIxMDMuZWpiMTE9Q0hLSjIxMDNFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGluaGVyaXQgezF9LiAoRUpCIDEuMTogQi4yKQotQ0hLSjIxMDQuZWpiMTE9Q0hLSjIxMDRFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBub3QgaW5oZXJpdCB7MX0uIChFSkIgMS4xOiBCLjIpCi1DSEtKMjEwNS5lamIxMT1DSEtKMjEwNUU6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgaW5oZXJpdCB7MX0uIChFSkIgMS4xOiBCLjIpCi1DSEtKMjEwNi5lamIxMT1DSEtKMjEwNkU6IEJlYW4gezB9IG11c3QgdXNlIHsxfSBhcyBpdHMgPHByaW0ta2V5LWNsYXNzPiAoRUpCIDEuMTogQi4yKS4KLQotQ0hLSjIyMDAuaS5lamIxMT1DSEtKMjIwMFc6IFRoZSB7MH0gc3RhdGljIGZpZWxkIHNob3VsZCBiZSBmaW5hbC4gKEVKQiAxLjE6IDE4LjEuMikKLUNIS0oyMjAwLm0uZWpiMTE9Q0hLSjIyMDBXOiBUaGlzIHN0YXRpYyBmaWVsZCBzaG91bGQgYmUgZmluYWwuIChFSkIgMS4xOiAxOC4xLjIpCi1DSEtKMjIwMS5lYi5pLmVqYjExPUNIS0oyMjAxRTogezB9IG11c3Qgbm90IGJlIHRyYW5zaWVudC4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDEuZWIubS5lamIxMT1DSEtKMjIwMUU6IFRoZSBmaWVsZCBtdXN0IG5vdCBiZSB0cmFuc2llbnQuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAyLmViLmkuZWpiMTE9Q0hLSjIyMDJXOiBUaGUgZmllbGQgdHlwZSBvZiBmaWVsZCB7MH0gaXMgaW52YWxpZCBmb3IgYSBDTVAgYmVhbi4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDIuZWIubS5lamIxMT1DSEtKMjIwMlc6IFRoZSBmaWVsZCB0eXBlIGlzIGludmFsaWQgZm9yIGEgQ01QIGJlYW4uIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAzLmViLmkuZWpiMTE9Q0hLSjIyMDNFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAzLmViLm0uZWpiMTE9Q0hLSjIyMDNFOiBUaGUgZmllbGQgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjA1LmViLmkuZWpiMTE9Q0hLSjIyMDVXOiBUaGUgcHJpbWFyeSBrZXkgZmllbGQgbmFtZWQgezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMjA1LmViLm0uZWpiMTE9Q0hLSjIyMDVXOiBUaGUgcHJpbWFyeSBrZXkgZmllbGQgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjIyMDYuZWIuaS5lamIxMT1DSEtKMjIwNlc6IHswfSBtdXN0IGJlIGEgPGNtcC1maWVsZD4gb2YgezF9IGFuZCBhIGZpZWxkIG9mIGJlYW4gY2xhc3MgezJ9LiAoRUpCIDEuMTogOS40LjcuMikuCi1DSEtKMjIwNi5lYi5tLmVqYjExPUNIS0oyMjA2VzogVGhpcyBmaWVsZCBtdXN0IGJlIGEgPGNtcC1maWVsZD4gb2YgezB9IGFuZCBhIGZpZWxkIG9mIGJlYW4gY2xhc3MgezF9LiAoRUpCIDEuMTogOS40LjcuMikuCi1DSEtKMjIwNy5lYi5lamIxMT1DSEtKMjIwN0U6IEtleSBmaWVsZCB7MH0gbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBwcmltYXJ5IGtleSwgezF9LiAoRUpCIDEuMTogOS40LjcuMSkuCi0KLUNIS0oyNDAwLmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gbWV0aG9kIHswfS4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwMC5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDAwLmJ1cy5zYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gbWV0aG9kIHswfS4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwMC5idXMuc2IubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDAwLmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDAuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDAwLmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDAwLmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDAuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDAuZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwMC5idXMuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDAwLmJ1cy5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDAxLnNiLmkuZWpiMTE9Q0hLSjI0MDFFOiB7MH0gbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDYuMTAuMykKLUNIS0oyNDAxLnNiLm0uZWpiMTE9Q0hLSjI0MDFFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogNi4xMC4zKQotQ0hLSjI0MDIuc2guaS5lamIxMT1DSEtKMjQwMlc6IHswfSBtdXN0IHJldHVybiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjI0MDIuc2gubS5lamIxMT1DSEtKMjQwMlc6IFRoaXMgY3JlYXRlIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA2LjEwLjYpLgotQ0hLSjI0MDIuZWguaS5lamIxMT1DSEtKMjQwMlc6IHswfSBtdXN0IHJldHVybiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA5LjIuOCkuCi1DSEtKMjQwMi5laC5tLmVqYjExPUNIS0oyNDAyVzogVGhpcyBjcmVhdGUgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSB0eXBlLiAgKEVKQiAxLjE6IDkuMi44KS4KLUNIS0oyNDAzLmVoLmkuZWpiMTE9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQwMy5laC5tLmVqYjExPUNIS0oyNDAzVzogVGhlIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDA1LmVoLmkuZWpiMTE9Q0hLSjI0MDVXOiBUaGUgb3JkZXIgYW5kIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgaW4gezB9IG11c3QgbWF0Y2ggdGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgZmllbGRzIGluIHRoZSB7MX0ga2V5IGNsYXNzLiAoRUpCIDEuMTogOS4yLjgsIDkuNC43LjMsIDE2LjUpCi1DSEtKMjQwNS5laC5tLmVqYjExPUNIS0oyNDA1VzogVGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgZmllbGRzIGluIHRoZSB7MH0ga2V5IGNsYXNzLiAoRUpCIDEuMTogOS4yLjgsIDkuNC43LjMsIDE2LjUpCi1DSEtKMjQwNi5lYi5pLmVqYjExPUNIS0oyNDA2VzogezB9IHNob3VsZCByZXR1cm4gdGhlIHByaW1hcnkga2V5IHR5cGUgezF9LiAoRUpCIDEuMTogOS4yLjMsIDkuNC4yLCA5LjQuNy4zKS4KLUNIS0oyNDA2LmViLm0uZWpiMTE9Q0hLSjI0MDZXOiBUaGUgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHByaW1hcnkga2V5IHR5cGUgezB9LiAoRUpCIDEuMTogOS4yLjMsIDkuNC4yLCA5LjQuNy4zKS4KLUNIS0oyNDA3LmViLmkuZWpiMTE9Q0hLSjI0MDdXOiB7MH0gc2hvdWxkIHJldHVybiBlaXRoZXIgezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAgKEVKQiAxLjE6IDkuMi41KQotQ0hLSjI0MDcuZWIubS5lamIxMT1DSEtKMjQwN1c6IFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gIChFSkIgMS4xOiA5LjIuNSkKLQotQ0hLSjI0MDguZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDguZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGUgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDA4LmJ1cy5zYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA4LmJ1cy5zYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDguZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwOC5lamJDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDguZWpiUG9zdENyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDguZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwOC5lamJGaW5kLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOC5lamJGaW5kLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDA4LmJ1cy5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjYpLgotQ0hLSjI0MDguYnVzLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi42KS4KLQotQ0hLSjI0MDkuZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDkuZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwOS5idXMuc2IuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwOS5idXMuc2IubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA5LmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDkuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDA5LmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDA5LmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDkuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDkuZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOS5idXMuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDA5LmJ1cy5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDEwLmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQxMC5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQxMC5idXMuc2IuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MTAuYnVzLnNiLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MTAuZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MTAuZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQxMC5lamJQb3N0Q3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MTAuZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MTAuZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDEwLmVqYkZpbmQuZWIubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDEwLmJ1cy5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDEwLmJ1cy5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjYpLgotCi1DSEtKMjQxMS5zYi5pLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIChFSkIgMS4xOiA2LjEwLjQpCi1DSEtKMjQxMS5zYi5tLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogNi4xMC40KQotQ0hLSjI0MTEuZWIuaS5lamIxMT1DSEtKMjQxMUU6IFRoZSBuYW1lIG9mIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogOS4yLjYpCi1DSEtKMjQxMS5lYi5tLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogOS4yLjYpCi0KLUNIS0oyNDEyLnNiLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zYi5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lYi5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lYi5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNyLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMC41KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNyLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZXIuaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuNykgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lci5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yLjcpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc2guaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc2gubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTAuNikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5laC5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMi44KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmVoLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi0KLUNIS0oyNDEzLnNiLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNiLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTApIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZWIuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5lYi5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc3IuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTAuNSkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zci5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZXIuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVyLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNoLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc2gubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMC42KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVoLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5laC5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi0KLUNIS0oyNDE0LnNoLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNC5zaC5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE0LmVoLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDE0LmVoLm0uZWpiMTE9Q0hLSjI0MTRFOiBUaGUgbWV0aG9kIG11c3QgdGhyb3cgezB9LiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQxNC5zci5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjI0MTQuc3IubS5lamIxMT1DSEtKMjQxNEU6IFRoZSBtZXRob2QgbXVzdCB0aHJvdyB7MH0uIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNC5lci5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjQxNC5lci5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDkuMi43KQotCi1DSEtKMjQxNS5zci5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyNDE1LnNyLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNS5lci5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjI0MTUuZXIubS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezB9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjI0MTUuc2guaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNS5zaC5tLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MH0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTUuZWguaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDE1LmVoLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLQotQ0hLSjI0MTguZWIuaS5lamIxMT1DSEtKMjQxOEU6IHswfSBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogOS4yLjQpCi1DSEtKMjQxOC5lYi5tLmVqYjExPUNIS0oyNDE4RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDkuMi40KQotQ0hLSjI0MTkuc2guaS5lamIxMT1DSEtKMjQxOUU6IHswfSBtdXN0IGJlIGEgY3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE5LnNoLm0uZWpiMTE9Q0hLSjI0MTlFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGEgY3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLQotQ0hLSjI0MjAuc2IuaS5lamIxMT1DSEtKMjQyMEU6IHsxfSBtdXN0IGJlIHRocm93biBieSB7MH0nJ3MgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsyfSBob21lIGludGVyZmFjZS4gKEVKQiAxLjE6IDYuMTAuNiwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQyMC5zYi5tLmVqYjExPUNIS0oyNDIwRTogezB9IG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogNi4xMC42LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDIwLmViLmkuZWpiMTE9Q0hLSjI0MjBFOiB7MX0gbXVzdCBiZSB0aHJvd24gYnkgezB9JydzIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7Mn0gaG9tZSBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuOCwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQyMC5lYi5tLmVqYjExPUNIS0oyNDIwRTogezB9IG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogOS4yLjgsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuc2IuaS5lamIxMT1DSEtKMjQzMkU6IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7Mn0uIChFSkIgMS4xOiA2LjEwLjUsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuc2IubS5lamIxMT1DSEtKMjQzMkU6IFRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA2LjEwLjUsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuZWIuaS5lamIxMT1DSEtKMjQzMkU6IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezF9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7Mn0uIChFSkIgMS4xOiA5LjIuNywgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQzMi5lYi5tLmVqYjExPUNIS0oyNDMyRTogVGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDkuMi43LCAxMi4yLjEsIDEyLjIuMikKLQotQ0hLSjI4MDEuZWpiMTE9Q0hLSjI4MDFFOiBUaGUgdmFsdWUgb2YgdGhlIDxlamItbmFtZT4gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgwMi5uYW1lZC5lamIxMT1DSEtKMjgwMkU6IDxlamItY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDIudW5uYW1lZC5lamIxMT1DSEtKMjgwMkU6IFVua25vd24gY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLWNsYXNzPiBlbGVtZW50LiAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgwMy5uYW1lZC5lamIxMT1DSEtKMjgwM0U6IDxob21lPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMy51bm5hbWVkLmVqYjExPUNIS0oyODAzRTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpLgotQ0hLSjI4MDQubmFtZWQuZWpiMTE9Q0hLSjI4MDRFOiA8cmVtb3RlPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwNC51bm5hbWVkLmVqYjExPUNIS0oyODA0RTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8cmVtb3RlPiBlbGVtZW50LiAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgwNi5lamIxMT1DSEtKMjgwNkU6IFRoZSB2YWx1ZSBvZiB0aGUgPHJlZW50cmFudD4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiVHJ1ZSIgb3IgIkZhbHNlIi4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgwNy5lamIxMT1DSEtKMjgwN0U6IFRoZSB2YWx1ZSBvZiB0aGUgPHNlc3Npb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiU3RhdGVmdWwiIG9yICJTdGF0ZWxlc3MiLiAoRUpCIDEuMTogMTYuMiwgMTYuNSkKLUNIS0oyODA4LmVqYjExPUNIS0oyODA4RTogVGhlIHZhbHVlIG9mIHRoZSA8dHJhbnNhY3Rpb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuIChFSkIgMS4xOiAxMS4zLjUsIDE2LjIsLCAxNi41KQotQ0hLSjI4MDkuZWpiMTE9Q0hLSjI4MDlFOiBUaGUgdmFsdWUgb2YgdGhlIDxwZXJzaXN0ZW5jZS10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gIChFSkIgMS4xOiAxNi4yLCAxNi41KQotQ0hLSjI4MTAubmFtZWQuZWpiMTE9Q0hLSjI4MTBFOiA8cHJpbS1rZXktY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MTAudW5uYW1lZC5lamIxMT1DSEtKMjgxMEU6IFVua25vd24gY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSA8cHJpbS1rZXktY2xhc3M+IGVsZW1lbnQuICAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgxMS5uYW1lZC5lamIxMT1DSEtKMjgxMUU6IDxmaWVsZC1uYW1lPiB7MH0gY2Fubm90IGJlIGxvY2F0ZWQgb24gYmVhbiBjbGFzcyB7MX0uIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODExLnVubmFtZWQuZWpiMTE9Q0hLSjI4MTFFOiA8Y21wLWZpZWxkPiBtdXN0IHNwZWNpZnkgYSA8ZmllbGQtbmFtZT4uIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODEyLmVqYjExPUNIS0oyODEyRTogQmVhbiBjbGFzcyB7MH0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4uIChFSkIgMS4xOiAxNi41KQotQ0hLSjI4MTQuZWpiMTE9Q0hLSjI4MTRXOiA8ZWpiLW5hbWU+LCBpbiA8bWV0aG9kPiwgc2hvdWxkIHNwZWNpZnkgYSBrbm93biBlbnRlcnByaXNlIGJlYW4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMiwgMTYuNSkKLQotQ0hLSjI4MjAuZWpiMTE9Q0hLSjI4MjBXOiBUaGUgc2VjdXJpdHkgcm9sZSByZWYgbXVzdCBiZSBkZWZpbmVkIG9ubHkgb25jZS4KLUNIS0oyODIyLmVqYjExPUNIS0oyODIyVzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IGZvciBiZWFuIHswfSBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAoRUpCIDEuMTogMTUuMi41LjMpCi1DSEtKMjgyMy5lamIxMT1DSEtKMjgyM1c6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1saW5rPiBlbGVtZW50LiAoRUpCIDEuMTogMTUuMy4zKQotQ0hLSjI4MjQuZWpiMTE9Q0hLSjI4MjRXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgcmVmZXJzIHRvIHVua25vd24gcm9sZSB7MH0uIChFSkIgMS4xOiAxNS4zLjMpCi1DSEtKMjgyNS5lamIxMT1DSEtKMjgyNVc6IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50IGluIGVqYi1qYXIueG1sIHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMS4xOiAxNS4zLjEpCi1DSEtKMjgyNi5lamIxMT1DSEtKMjgyNlc6IFRoZSBzZWN1cml0eS1yb2xlIG5hbWUgbXVzdCBiZSB1bmlxdWUuIChFSkIgMS4xOiAxNS4zLjEpCi1DSEtKMjgyNy5lamIxMT1DSEtKMjgyN1c6IENhbm5vdCB1c2UgYSA8cm9sZS1saW5rPiBlbGVtZW50IHdpdGhvdXQgPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnRzLiAoRUpCIDEuMTogMTUuMi41LjMsIDE1LjMuMSwgMTUuMy4zKQotQ0hLSjI4MjguZWpiMTE9Q0hLSjI4MjhFOiBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IGVsZW1lbnQgd2l0aG91dCBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4gKEVKQiAxLjE6IDkuNC43LCAxNi41KQotQ0hLSjI4MjkuZWpiMTE9Q0hLSjI4MjlFOiBLZXkgY2xhc3MgezB9IGRvZXMgbm90IG1hcCB0byBhbnkgZmllbGRzIGluIGVudGVycHJpc2UgYmVhbiB7MX0uIChFSkIgMS4xOiA5LjQuNywgMTYuNSkKLQotQ0hLSjI4MzAuZWpiMTE9Q0hLSjI4MzBXOiBUaGUgdHlwZSBvZiB0aGUgezB9IGZpZWxkIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgzMS5lamIxMT1DSEtKMjgzMVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgPGNtcC1maWVsZD4gZWxlbWVudC4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjgzMi5lamIxMT1DSEtKMjgzMkk6IEhvbWUgezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMS4xOiAxNC4zLjEuMikKLUNIS0oyODMzLmVqYjExPUNIS0oyODMzSTogUmVtb3RlIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDEuMTogMTQuMy4xLjIpCi1DSEtKMjgzNC5lamIxMT1DSEtKMjgzNEk6IEJlYW4gezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMS4xOiAxNC4zLjIpCi1DSEtKMjgzNS5lamIxMT1DSEtKMjgzNUk6IEJlYW4gezB9IGlzIGEgezF9IHR5cGUuIFVwZGF0ZSB0aGUgPGVqYi1yZWYtdHlwZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMS4xOiAxNC4zLjIpCi1DSEtKMjgzNi5lamIxMT1DSEtKMjgzNkk6IEJlYW4gezB9IHVzZXMgaG9tZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDEuMTogMTQuMy4yKQotQ0hLSjI4MzcuZWpiMTE9Q0hLSjI4MzdJOiBCZWFuIHswfSB1c2VzIHJlbW90ZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDEuMTogMTQuMy4yKS4KLUNIS0oyODM4LmVqYjExPUNIS0oyODM4STogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dC4gKEVKQiAxLjE6IDE0LjMuMS4xKS4KLUNIS0oyODM5LmVqYjExPUNIS0oyODM5VzogVGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMS4xOiAxNC4yLjEuMikKLQotQ0hLSjI4NDAuZWpiMTE9Q0hLSjI4NDBXOiBUaGUgPGVudi1lbnRyeS10eXBlPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAxLjE6IDE0LjIuMS4yKS4KLUNIS0oyODQxLmVqYjExPUNIS0oyODQxVzogVGhlIHswfSBuYW1lLCBpbiB0aGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBjYW4gYmUgdXNlZCBvbmx5IG9uY2UgaW4gdGhlIGJlYW4uIChFSkIgMS4xOiAxNC4yLjEuMikuCi1DSEtKMjg0Mi5lamIxMT1DSEtKMjg0Mlc6IDxtZXRob2QtcGFyYW1zPiBpcyBpZ25vcmVkIHdoZW4gPG1ldGhvZC1uYW1lPiBpcyAiKiIuIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0My5lamIxMT1DSEtKMjg0M1c6IE5vIG1ldGhvZHMsIG9uIHswfSwgbWF0Y2ggdGhpcyA8bWV0aG9kPi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yKS4KLUNIS0oyODQ0LmVqYjExPUNIS0oyODQ0VzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IHNob3VsZCBiZSBzZXQgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIpLgotQ0hLSjI4NDUuZWpiMTE9Q0hLSjI4NDVXOiBBdCBsZWFzdCBvbmUgPHJvbGUtbmFtZT4gc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0Ni5lamIxMT1DSEtKMjg0Nlc6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMS4xOiAxNS4zLjIpLgotQ0hLSjI4NDcuZWpiMTE9Q0hLSjI4NDdXOiBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPi4gKEVKQiAxLjE6IDExLjQuMSkuCi1DSEtKMjg0OS5lamIxMT1DSEtKMjg0OVc6IENhbm5vdCB2YWxpZGF0ZSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb2YgezB9IGJlY2F1c2UgezF9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1MC5lamIxMT1DSEtKMjg1MFc6IENhbm5vdCB2YWxpZGF0ZSA8bWV0aG9kPiBiZWNhdXNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTEuZWpiMTE9Q0hLSjI4NTFXOiBDYW5ub3QgdmFsaWRhdGUgezB9IGJlY2F1c2UgezF9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1Mi5lamIxMT1DSEtKMjg1Mlc6IFRocm93YWJsZSBjYXVnaHQgd2hpbGUgdmFsaWRhdGluZyB0aGUgZWpiLWphci54bWwuIFRoZSBiZWFuIGJlaW5nIHZhbGlkYXRlZCB3YXMgezB9LgotQ0hLSjI4NTMuZWpiMTE9Q0hLSjI4NTNXOiBUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgdGhlIGlibS1lamItamFyLWV4dC54bWkuIFRoZSBiZWFuIGJlaW5nIHZhbGlkYXRlZCB3YXMgezB9LgotCi1DSEtKMjkwOC5lamIxMT1DSEtKMjkwOFc6IEFuIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgcmVmbGVjdGVkIHByb3Blcmx5LiBSdW4gdGhlIFhNTCB2YWxpZGF0b3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUNIS0oyODk1LmVqYjExPUNIS0oyODk1VzogPGVqYi1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIChFSkIgMS4xOiAxNi41KS4KLUNIS0oyODc1LmVqYjExPUNIS0oyODc1RTogPGVqYi1jbGllbnQtamFyPiB7MH0gbXVzdCBleGlzdCBpbiBldmVyeSBFQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgRUpCIG1vZHVsZSAoRUpCIDEuMTogMTYuNSwgMTcuNCkuCi0KLQotIyBFSkJfTUVUSE9EX0JFQU5fTlVMTD1DSEtKMjQzNFc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYmVhbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgYmVhbiBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9NRVRIT0RfSE9NRV9OVUxMPUNIS0oyNDM1VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBob21lIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgaG9tZSBpbnRlcmZhY2UnJ3MgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX01FVEhPRF9SRU1PVEVfTlVMTD1DSEtKMjQzNlc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgcmVtb3RlIGludGVyZmFjZScncyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTUVUSE9EX05VTEw9Q0hLSjI0MzdXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZm91bmQuCi0jIEVKQl9NRVRIT0RfS0VZX05VTEw9Q0hLSjI0MzhXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHByaW1hcnkga2V5IGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBrZXkgY2xhc3MnJyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfUkVNT1RFX05VTEw9Q0hLSjI5MDRFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTlVMTD1DSEtKMjkwM0U6IFZhbGlkYXRpb24gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSBmb3VuZC4KLSMgRUpCX05PVFJFRkxFQ1RFRF9KQVZBQ0xBU1M9Q0hLSjI5MDdFOiBDYW5ub3QgdmFsaWRhdGUgYmVjYXVzZSB0aGUgezB9IHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4gRW5zdXJlIHRoYXQgaXQsIGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVuY2llcywgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGguCi0jIEVKQl9GSUVMRF9DQU5OT1RfUkVGTEVDVD1DSEtKMjIwOFc6IFR5cGUgezB9IG9mIGZpZWxkIHsxfSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBFbnN1cmUgdGhhdCB7MH0sIGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVuY2llcywgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGguCi0jIEVKQl9GSUVMRF9CRUFOX05VTEw9Q0hLSjIyMDlXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYmVhbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgYmVhbiBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9IT01FX05VTEw9Q0hLSjIyMTBXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgaG9tZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGhvbWUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9SRU1PVEVfTlVMTD1DSEtKMjIxMVc6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9GSUVMRF9OVUxMPUNIS0oyMjEyVzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZm91bmQuCi0jIEVKQl9GSUVMRF9LRVlfTlVMTD1DSEtKMjIxM1c6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBwcmltYXJ5IGtleSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUga2V5IGNsYXNzJycgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0hBU19NVUxUSVBMRV9QS19NRVRIT0RTPUNIS0oyMDAwVzogVGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gb25seSBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLSMgRUpCX0hPTUVfTlVMTD1DSEtKMjkwMUU6IFZhbGlkYXRpb24gb2YgezB9IHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGhvbWUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfS0VZX05VTEw9Q0hLSjI5MDJFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBrZXkgY2xhc3MgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgaXRzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9CRUFOX05VTEw9Q0hLSjI5MDBFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfQk1QX05PRklFTERTPUNIS0oyMDQyVzogVG8gaGF2ZSBhIHByaW1hcnkga2V5LCB0aGUgezB9IGJlYW4gY2xhc3MgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBmaWVsZC4gKEVKQiAxLjE6IDkuMS41LjEpCi0jIEVKQl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMjgyMUU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotIyBFSkJfRERfTUVUSFRSQU5TQUNUSU9OX05PX1RSQU5TQUNUSU9OPUNIS0oyODQ4VzogQXQgbGVhc3Qgb25lIDx0cmFucy1hdHRyaWJ1dGU+IG11c3QgYmUgc2V0IGluIGEgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4uIChFSkIgMS4xOiAxMS40LjEpCi0KLSMKLSMgZW5kIG9mIG1lc3NhZ2VzIGZvciB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0jCi0KLSMKLSMgTWVzc2FnZXMgZm9yIEVKQiAyLjAgc3BlY2lmaWNhdGlvbgotIwotQ0hLSjI4MjguZWpiMjA9Q0hLSjI4MjhFOiBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IHdpdGhvdXQgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgKEVKQiAyLjA6IDEwLjguMSwgMjIuNSkuCi1DSEtKMjgyOS5lamIyMD1DSEtKMjgyOUU6IEtleSBjbGFzcyB7MH0gZG9lcyBub3QgbWFwIHRvIGFueSBmaWVsZHMgaW4gZW50ZXJwcmlzZSBiZWFuIHsxfS4gKEVKQiAyLjA6IDEwLjgsIDIyLjUpLgotQ0hLSjI4MzkuZWpiMjA9Q0hLSjI4MzlXOiBUaGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAyLjA6IDIwLjIuMS4yKS4KLUNIS0oyODQwLmVqYjIwPUNIS0oyODQwVzogVGhlIDxlbnYtZW50cnktdHlwZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMi4wOiAyMC4yLjEuMikuCi1DSEtKMjg0MS5lamIyMD1DSEtKMjg0MVc6IFRoZSB7MH0gbmFtZSwgaW4gdGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgY2FuIGJlIHVzZWQgb25seSBvbmNlIGluIHRoZSBiZWFuLiAoRUpCIDIuMDogMjAuMi4xLjIpLgotQ0hLSjI4MzAuZWpiMjA9Q0hLSjI4MzBXOiBUaGUgdHlwZSBvZiB0aGUgezB9IGZpZWxkIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgzMS5lamIyMD1DSEtKMjgzMVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgPGNtcC1maWVsZD4gZWxlbWVudC4gKEVKQiAyLjA6IDEwLjguMikuCi1DSEtKMjgwMS5lamIyMD1DSEtKMjgwMUU6IFRoZSB2YWx1ZSBvZiB0aGUgPGVqYi1uYW1lPiBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLiAoRUpCIDIuMCAyMi4yLCAyMi41KS4KLUNIS0oyODA5LmVqYjIwPUNIS0oyODA5RTogVGhlIHZhbHVlIG9mIHRoZSA8cGVyc2lzdGVuY2UtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuICAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwNi5lamIyMD1DSEtKMjgwNkU6IFRoZSB2YWx1ZSBvZiB0aGUgPHJlZW50cmFudD4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiVHJ1ZSIgb3IgIkZhbHNlIi4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDcuZWpiMjA9Q0hLSjI4MDdFOiBUaGUgdmFsdWUgb2YgdGhlIDxzZXNzaW9uLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIi4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDguZWpiMjA9Q0hLSjI4MDhFOiBUaGUgdmFsdWUgb2YgdGhlIDx0cmFuc2FjdGlvbi10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gKEVKQiAyLjA6IDE3LjMuNiwgMjIuMiwgMjIuNSkuCi1DSEtKMjgxNC5lamIyMD1DSEtKMjgxNFc6IDxlamItbmFtZT4sIGluIDxtZXRob2Q+LCBzaG91bGQgc3BlY2lmeSBhIGtub3duIGVudGVycHJpc2UgYmVhbi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yLCAyMi41KS4KLUNIS0oyODQyLmVqYjIwPUNIS0oyODQyVzogPG1ldGhvZC1wYXJhbXM+IGlzIGlnbm9yZWQgd2hlbiA8bWV0aG9kLW5hbWU+IGlzICIqIi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQzLmVqYjIwPUNIS0oyODQzVzogTm8gbWV0aG9kcywgb24gezB9LCBtYXRjaCB0aGlzIDxtZXRob2Q+LiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIpLgotQ0hLSjI4NDQuZWpiMjA9Q0hLSjI4NDRXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZD4gc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMikuCi1DSEtKMjg0NS5lamIyMD1DSEtKMjg0NVc6IEEgPHJvbGUtbmFtZT4gb3IgYW4gPHVuY2hlY2tlZD4gZWxlbWVudCBzaG91bGQgYmUgc2V0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQ2LmVqYjIwPUNIS0oyODQ2VzogTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAyLjA6IDIxLjMuMikuCi1DSEtKMjg0Ny5lamIyMD1DSEtKMjg0N1c6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+LiAoRUpCIDIuMDogMTcuNC4xKS4KLUNIS0oyODEyLmVqYjIwPUNIS0oyODEyRTogQmVhbiBjbGFzcyB7MH0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4uIChFSkIgMi4wOiAyMi41KS4KLUNIS0oyODMyLmVqYjIwPUNIS0oyODMySTogSG9tZSB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLUNIS0oyODMzLmVqYjIwPUNIS0oyODMzSTogUmVtb3RlIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDIuMDogMjAuMy4xLjIpLgotQ0hLSjI4MzQuZWpiMjA9Q0hLSjI4MzRJOiBCZWFuIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM1LmVqYjIwPUNIS0oyODM1STogQmVhbiB7MH0gaXMgYSB7MX0gdHlwZS4gVXBkYXRlIHRoZSA8ZWpiLXJlZi10eXBlPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzNi5lamIyMD1DSEtKMjgzNkk6IEJlYW4gezB9IHVzZXMgaG9tZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM3LmVqYjIwPUNIS0oyODM3STogQmVhbiB7MH0gdXNlcyByZW1vdGUgezF9LiBVcGRhdGUgdGhlIDxlamItcmVmPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzOC5lamIyMD1DSEtKMjgzOEk6IEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlICJlamIiIHN1YmNvbnRleHQuIChFSkIgMi4wOiAyMC4zLjEuMSkuCi1DSEtKMjgyMC5lamIyMD1DSEtKMjgyMFc6IFRoZSBzZWN1cml0eSByb2xlIHJlZiBpcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLgotQ0hLSjI4MjIuZWpiMjA9Q0hLSjI4MjJXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgZm9yIGJlYW4gezB9IHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMS4yLjUuMykuCi1DSEtKMjgyMy5lamIyMD1DSEtKMjgyM1c6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1saW5rPiBlbGVtZW50LiAoRUpCIDIuMDogMjEuMy4zKS4KLUNIS0oyODI0LmVqYjIwPUNIS0oyODI0VzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IHJlZmVycyB0byB1bmtub3duIHJvbGUgezB9LiAoRUpCIDIuMDogMjEuMy4zKS4KLUNIS0oyODI1LmVqYjIwPUNIS0oyODI1VzogPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnQgaW4gZWpiLWphci54bWwgc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIxLjMuMSkuCi1DSEtKMjgyNi5lamIyMD1DSEtKMjgyNlc6IFRoZSBzZWN1cml0eS1yb2xlIG5hbWUgbXVzdCBiZSB1bmlxdWUuIChFSkIgMi4wOiAyMS4zLjEpLgotQ0hLSjI4MjcuZWpiMjA9Q0hLSjI4MjdXOiBDYW5ub3QgdXNlIGEgPHJvbGUtbGluaz4gZWxlbWVudCB3aXRob3V0IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50cy4gKEVKQiAyLjA6IDIxLjIuNS4zLCAyMS4zLjEsIDIxLjMuMykuCi1DSEtKMjg1MC5lamIyMD1DSEtKMjg1MFc6IENhbm5vdCB2YWxpZGF0ZSA8bWV0aG9kPiBiZWNhdXNlIHRoZSB7MH0gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTEuZWpiMjA9Q0hLSjI4NTFXOiBDYW5ub3QgdmFsaWRhdGUgezB9IGJlY2F1c2UgdHlwZSB7MX0gY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODc1LmVqYjIwPUNIS0oyODc1RTogPGVqYi1jbGllbnQtamFyPiB7MH0gbXVzdCBleGlzdCBpbiBldmVyeSBFQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgRUpCIG1vZHVsZSAoRUpCIDIuMDogMjIuNSwgMjMuNCwgMjMuNikuCi0KLUNIS0oyMDAzRS5lamIyMD1DSEtKMjAwM0U6IFRoaXMgY2xhc3MgbXVzdCBub3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChFSkIgMi4wOiA3LjUuMywgNy4xMC4yLCAxNy4zLjQuMSkuCi1DSEtKMjAwM0kuZWpiMjA9Q0hLSjIwMDNJOiBCZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gc3RhdGVmdWwgc2Vzc2lvbiBiZWFucyBuZWVkIG5vdCBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gKEVKQiAyLjA6IDcuNS4zLCA3LjEwLjIsIDE3LjMuNC4xKS4KLUNIS0oyODAyLm5hbWVkLmVqYjIwPUNIS0oyODAyRTogPGVqYi1jbGFzcz4gY2xhc3MgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMi51bm5hbWVkLmVqYjIwPUNIS0oyODAyRTogVGhlIGJlYW4gY2xhc3MsIGlkZW50aWZpZWQgYnkgdGhlIDxlamItY2xhc3M+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDMubmFtZWQuZWpiMjA9Q0hLSjI4MDNFOiA8aG9tZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDMudW5uYW1lZC5lamIyMD1DSEtKMjgwM0U6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA0Lm5hbWVkLmVqYjIwPUNIS0oyODA0RTogPHJlbW90ZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDQudW5uYW1lZC5lamIyMD1DSEtKMjgwNEU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPHJlbW90ZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDUubmFtZWQuZWpiMjA9Q0hLSjI4MDVFOiA8bG9jYWwtaG9tZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDUudW5uYW1lZC5lamIyMD1DSEtKMjgwNUU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGxvY2FsLWhvbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODAwLm5hbWVkLmVqYjIwPUNIS0oyODAwRTogPGxvY2FsPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMC51bm5hbWVkLmVqYjIwPUNIS0oyODAwRTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8bG9jYWw+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODEwLm5hbWVkLmVqYjIwPUNIS0oyODEwRTogPHByaW0ta2V5LWNsYXNzPiBjbGFzcyB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODEwLnVubmFtZWQuZWpiMjA9Q0hLSjI4MTBFOiBVbmtub3duIGNsYXNzIHNwZWNpZmllZCBpbiB0aGUgPHByaW0ta2V5LWNsYXNzPiBlbGVtZW50LiAgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MTEuZWpiMjA9Q0hLSjI4MTFFOiA8ZmllbGQtbmFtZT4gezB9IGNhbm5vdCBiZSBsb2NhdGVkIG9uIGJlYW4gY2xhc3MgezF9LiAoRUpCIDIuMDogMjIuNSkuCi0KLUNIS0oyMTAzLmVqYjIwPUNIS0oyMTAzRTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGJlYW4gY2xhc3MgbXVzdCBpbmhlcml0IHsxfSAoRUpCIDIuMDogRC4yKQotQ0hLSjIxMDQuZWpiMjA9Q0hLSjIxMDRFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBub3QgaW5oZXJpdCB7MX0uIChFSkIgMi4wOiBELjIpLgotQ0hLSjIxMDUuZWpiMjA9Q0hLSjIxMDVFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gY29tcG9uZW50IGludGVyZmFjZSBtdXN0IGluaGVyaXQgezF9LiAoRUpCIDIuMDogRC4yKS4KLUNIS0oyMTA2LmVqYjIwPUNIS0oyMTA2RTogIEJlYW4gezB9IG11c3QgdXNlIHsxfSBhcyBpdHMgPHByaW0ta2V5LWNsYXNzPiAoRUpCIDIuMDogRC4yKS4KLUNIS0oyODQ5LmVqYjIwPUNIS0oyODQ5VzogQ2Fubm90IHZhbGlkYXRlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZiB7MH0gYmVjYXVzZSB0aGUgezF9IHR5cGUsIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotCi1DSEtKMjg5NS5lamIyMD1DSEtKMjg5NVc6IDxlamItbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphci54bWwgZmlsZSAoRUpCIDIuMDogMjIuNSkuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNsYXNzL2ludGVyZmFjZSBjaGVja3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGltcGxlbWVudCBTZXNzaW9uQmVhbi9FbnRpdHlCZWFuL01lc3NhZ2VEcml2ZW5CZWFuL01lc3NhZ2VMaXN0ZW5lcgotQ0hLSjIwMTcuc2IuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogNy41LjEsIDcuMTAuMikuCi1DSEtKMjAxNy5tYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiAxNS40LjEsIDE1LjcuMikuCi1DSEtKMjAxNy5jYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwMTcuYmIuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogMTIuMi4yKS4KLQotIyBpbXBsZW1lbnQgRUpCSG9tZQotQ0hLSjIwMTcuc3JoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkhvbWUgKEVKQiAyLjA6IDYuMywgNy4xMC42KS4KLUNIS0oyMDE3LmNyaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJIb21lIChFSkIgMi4wOiA5LjUsIDEwLjYuMTApLgotQ0hLSjIwMTcuYnJoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkhvbWUgKEVKQiAyLjA6IDkuNSwgMTIuMi45KS4KLQotIyBpbXBsZW1lbnQgRUpCTG9jYWxIb21lCi1DSEtKMjAxNy5zbGguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxIb21lIChFSkIgMi4wOiA2LjQsIDcuMTAuOCkuCi1DSEtKMjAxNy5jbGguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxIb21lIChFSkIgMi4wOiA5LjYsIDEwLjYuMTIpLgotQ0hLSjIwMTcuYmxoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsSG9tZSAoRUpCIDIuMDogOS42LCAxMi4yLjExKS4KLQotIyBpbXBsZW1lbnQgRUpCT2JqZWN0Ci1DSEtKMjAxNy5zcmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA2LjUsIDcuMTAuNSkuCi1DSEtKMjAxNy5jcmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA5LjksIDEwLjYuOSkuCi1DSEtKMjAxNy5icmMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCT2JqZWN0IChFSkIgMi4wOiA5LjksIDEyLjIuOCkuCi0KLSMgaW1wbGVtZW50IEVKQkxvY2FsT2JqZWN0Ci1DSEtKMjAxNy5zbGMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjAxNy5jbGMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgKEVKQiAyLjA6IDkuMTAsIDEwLjYuMTApLgotQ0hLSjIwMTcuYmxjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IChFSkIgMi4wOiA5LjEwLCAxMi4yLjEwKS4KLQotIyBpbXBsIGNvbXBvbmVudCBpbnRlcmZhY2UKLUNIS0oyMDQwLmNiLmVqYjIwPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjA0MC5iYi5lamIyMD1DSEtKMjA0MEk6ICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwNDAuc2IuZWpiMjA9Q0hLSjIwNDBJOiAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogNy4xMC4yKS4KLQotIyBiZWFuIGNsYXNzCi1DSEtKMjAxNC5jYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuMy4xLCAxMC40LjEsIDEwLjYuMikuCi1DSEtKMjAxNC5tYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjAxNC5iYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjAxNC5zYi5lamIyMD1DSEtKMjAxNFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDcuMTAuMSkuCi0KLUNIS0oyMDIyLmNiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyMDIyLm1iLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyMDIyLmJiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyMDIyLnNiLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyMDIyLmtjLmVqYjIwPUNIS0oyMDIyVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuOC4yKS4KLQotQ0hLSjIwMTUuY2IuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwMTUubWIuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwMTUuYmIuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwMTUuc2IuZWpiMjA9Q0hLSjIwMTVXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjEpLgotCi0jIGRlcGVuZGVudCB2YWx1ZSBjbGFzcwotQ0hLSjIwMTguZWpiMjA9Q0hLSjIwMThXOiBUaGlzIGNsYXNzIG11c3QgYmUgc2VyaWFsaXphYmxlIChFSkIgMi4wOiAxMC4zLjMsIDEwLjYuMykuCi1DSEtKMjA0My5lamIyMD1DSEtKMjA0M1c6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuMykuCi1DSEtKMjA0NC5lamIyMD1DSEtKMjA0NFc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjYuMykuCi0KLSMga2V5IGNsYXNzCi1DSEtKMjAxOS5rYy5lamIyMD1DSEtKMjAxOVc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AgKEVKQiAyLjA6IDkuOCwgMTAuNi4xMykuCi1DSEtKMjAxOS5rYi5lamIyMD1DSEtKMjAxOVc6IFRoaXMgY2xhc3MgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AgKEVKQiAyLjA6IDkuOCwgMTIuMi4xMikuCi0KLQotIyMjCi0jIG1ldGhvZHMgd2hpY2ggbXVzdCBleGlzdAotIyMjCi0jIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycwotQ0hLSjIwNTAuY29uc3RyLnNiLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjEwLjIpLgotQ0hLSjIwNTAuY29uc3RyLmNiLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMikuCi1DSEtKMjA1MC5jb25zdHIuYmIuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xLCAxMi4yLjIpLgotQ0hLSjIwNTAuY29uc3RyLm1iLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwNTAuY29uc3RyLmtjLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC44LjIpLgotCi0KLSMgYWNjZXNzb3IgbWV0aG9kCi1DSEtKMjA1MC5hY2MuY2IuZWpiMjA9Q0hLSjIwNTBFOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIHswfSAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjIwNTAub25NZXNzYWdlLm1iLmVqYjIwPUNIS0oyMDUwVzogb25NZXNzYWdlKGphdmF4Lmptcy5NZXNzYWdlKSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS40LjIsIDE1LjcuNCkuCi0KLUNIS0oyMDUwLmVqYkNyZWF0ZS5zZmIuZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjUuNSkuCi1DSEtKMjA1MC5lamJDcmVhdGUuc3NiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjgpLgotQ0hLSjIwNTAuZWpiQ3JlYXRlLm1iLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS40LjQsIDE1LjcuMikuCi0KLUNIS0oyMDUwLmVqYkZpbmRCeVByaW1hcnlLZXkuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBzZXRFbnRpdHlDb250ZXh0KEVudGl0eUNvbnRleHQpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dC5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBzZXRFbnRpdHlDb250ZXh0KEVudGl0eUNvbnRleHQpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLnVuc2V0RW50aXR5Q29udGV4dC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSB1bnNldEVudGl0eUNvbnRleHQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLnVuc2V0RW50aXR5Q29udGV4dC5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSB1bnNldEVudGl0eUNvbnRleHQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJBY3RpdmF0ZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJBY3RpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiQWN0aXZhdGUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiQWN0aXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJQYXNzaXZhdGUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJQYXNzaXZhdGUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyMDUwLmVqYlBhc3NpdmF0ZS5zYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy41LjEpLgotCi1DSEtKMjA1MC5lamJSZW1vdmUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJSZW1vdmUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyMDUwLmVqYlJlbW92ZS5tYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyMDUwLmVqYlJlbW92ZS5zYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNC4yLjIsIDcuNS4xKS4KLQotQ0hLSjIwNTAuZWpiTG9hZC5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJMb2FkKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJMb2FkLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkxvYWQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJTdG9yZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJTdG9yZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiU3RvcmUuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiU3RvcmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5jcmVhdGUuc3NyaC5lamIyMD1DSEtKMjA1MFc6IFRoZSBjcmVhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjIwNTAuY3JlYXRlLnNzbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGUgY3JlYXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuOCwgNy4xMC44KS4KLQotQ0hLSjIwNTAuY3JlYXRlLnNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBjcmVhdGUgbWV0aG9kIChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyMDUwLmNyZWF0ZS5zbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgY3JlYXRlIG1ldGhvZCAoRUpCIDIuMDogNi40LjEsIDcuMTAuOCkuCi0KLUNIS0oyMDUwLmZpbmQuY3JoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIpLgotQ0hLSjIwNTAuZmluZC5icmguZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZmluZGVyIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjUuMikuCi1DSEtKMjA1MC5maW5kLmNsaC5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBmaW5kZXIgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yKS4KLUNIS0oyMDUwLmZpbmQuYmxoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS42LjIpLgotCi1DSEtKMjA1MC5ob21lLmNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS41LjQpLgotQ0hLSjIwNTAuaG9tZS5icmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgaG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNS40KS4KLUNIS0oyMDUwLmhvbWUuY2xoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi1DSEtKMjA1MC5ob21lLmJsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS42LjQpLgotCi1DSEtKMjA1MC5lamJIb21lLmNyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5lamJIb21lLmJyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5lamJIb21lLmNsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi1DSEtKMjA1MC5lamJIb21lLmJsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGVqYkhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi0KLUNIS0oyMDUwLmhhc2hDb2RlLmtiLmVqYjIwPUNIS0oyMDUwVzogaGFzaENvZGUoKSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEyLjIuMTIpLgotQ0hLSjIwNTAuaGFzaENvZGUua2MuZWpiMjA9Q0hLSjIwNTBXOiBoYXNoQ29kZSgpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTAuNi4xMykuCi0KLUNIS0oyMDUwLmVxdWFscy5rYi5lamIyMD1DSEtKMjA1MFc6IGVxdWFscyhPYmplY3QpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTIuMi4xMikuCi1DSEtKMjA1MC5lcXVhbHMua2MuZWpiMjA9Q0hLSjIwNTBXOiBlcXVhbHMoT2JqZWN0KSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEwLjYuMTMpLgotCi0jIGVqYlNlbGVjdCAtIG5lZWRlZD8gcGwxNzQgc2F5cyB6ZXJvIG9yIG1vcmUsIHAuMTkzIHNheXMgb25lIG9yIG1vcmUKLUNIS0oyMDUwLmVqYlNlbGVjdC5jYi5lamIyMD1DSEtKMjA1MFc6IEFuIGVqYlNlbGVjdCBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjcpLgotCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmNyaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleS5jbGguZWpiMjA9Q0hLSjIwNTBXOiBmaW5kQnlQcmltYXJ5S2V5IG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkuYmxoLmVqYjIwPUNIS0oyMDUwVzogZmluZEJ5UHJpbWFyeUtleSBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmJyaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi0KLSMgZWpiRmluZAotQ0hLSjIwNTAuZWpiRmluZC5iYi5lamIyMD1DSEtKMjA1MFc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmVqYlBvc3RDcmVhdGUuY2IuZWpiMjA9Q0hLSjIwNTBFOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYlBvc3RDcmVhdGUuYmIuZWpiMjA9Q0hLSjIwNTBFOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEsIDEyLjIuNCkuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgbWV0aG9kIGNoZWNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYXBwbGljYXRpb24gZXhjZXB0aW9uCi1DSEtKMjQwNC5pLmVqYjIwPUNIS0oyNDA0VzogQXBwbGljYXRpb24gZXhjZXB0aW9uIHsxfSBvbiB7MH0gbXVzdCBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MDQubS5lamIyMD1DSEtKMjQwNFc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MH0gbXVzdCBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MTYuaS5lamIyMD1DSEtKMjQxNlc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MX0gb24gezB9IG11c3Qgbm90IGV4dGVuZCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotQ0hLSjI0MTYubS5lamIyMD1DSEtKMjQxNlc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MH0gbXVzdCBub3QgZXh0ZW5kIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIChFSkIgMi4wOiAxOC4xLjEsIDE4LjIuMSkuCi0KLSMgZWpiUmVtb3ZlCi1DSEtKMjQ5Mi5tYi5pLmVqYjIwPUNIS0oyNDkyVzogezB9IG9uIHsxfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkyLm1iLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkyLmNiLmkuZWpiMjA9Q0hLSjI0OTJXOiB7MH0gb24gezF9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTIuY2IubS5lamIyMD1DSEtKMjQ5Mlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTIuYmIuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDkyLmJiLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTIuc2IuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjQ5Mi5zYi5tLmVqYjIwPUNIS0oyNDkyVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuNikuCi0KLUNIS0oyNDkzLm1iLmkuZWpiMjA9Q0hLSjI0OTNXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5My5tYi5tLmVqYjIwPUNIS0oyNDkzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5My5jYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTMuY2IubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTMuYmIuaS5lamIyMD1DSEtKMjQ5M1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTMuYmIubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5My5zYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjYpLgotQ0hLSjI0OTMuc2IubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjYpLgotCi1DSEtKMjQ5NC5tYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDk0Lm1iLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5NC5jYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDk0LmNiLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5NC5iYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTQuYmIubS5lamIyMD1DSEtKMjQ5NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTQuc2IuaS5lamIyMD1DSEtKMjQ5NFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjQ5NC5zYi5tLmVqYjIwPUNIS0oyNDk0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjYpLgotCi1DSEtKMjUwNS5lamJSZW1vdmUubWIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLm1iLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLmNiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5jYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5iYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5iYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLnNiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy42KS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5zYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy42KS4KLQotIyBlamJDcmVhdGUKLUNIS0oyNDIxLm1iLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMS5jYi5pLmVqYjIwPUNIS0oyNDIxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjEuYmIuaS5lamIyMD1DSEtKMjQyMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIxLnNiLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMS5tYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMS5jYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMS5iYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMS5zYi5tLmVqYjIwPUNIS0oyNDIxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuMykuCi0KLUNIS0oyNDIyLnNiLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMi5jYi5pLmVqYjIwPUNIS0oyNDIyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjIuYmIuaS5lamIyMD1DSEtKMjQyMlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIyLm1iLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMi5zYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMi5jYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMi5iYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMi5tYi5tLmVqYjIwPUNIS0oyNDIyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuMykuCi0KLUNIS0oyNDIzLnNiLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjMuY2IuaS5lamIyMD1DSEtKMjQyM1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMy5iYi5pLmVqYjIwPUNIS0oyNDIzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIzLm1iLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjMuc2IubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIzLmNiLm0uZWpiMjA9Q0hLSjI0MjNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMy5iYi5tLmVqYjIwPUNIS0oyNDIzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjMubWIubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy4zKS4KLQotQ0hLSjI0MjQuY2IuaS5lamIyMD1DSEtKMjQyNFc6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyNC5iYi5pLmVqYjIwPUNIS0oyNDI0VzogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDI0LnNiLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDI0Lm1iLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDI0LmNiLm0uZWpiMjA9Q0hLSjI0MjRXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyNC5iYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjQuc2IubS5lamIyMD1DSEtKMjQyNFc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyNC5tYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy4zKS4KLQotCi0KLSMgZWpiQ3JlYXRlJ3MgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlCi1DSEtKMjUwMC5lamJDcmVhdGUuc2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjUwMC5lamJDcmVhdGUuY2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjUwMC5lamJDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjUwMC5lamJDcmVhdGUuc2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5iYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuMykuCi0KLUNIS0oyNDk3LmNiLmkuZWpiMjA9Q0hLSjI0OTdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0OTcuY2IubS5lamIyMD1DSEtKMjQ5N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40KS4KLQotQ0hLSjI1MDEuZWpiQ3JlYXRlLm1iLmkuZWpiMjA9Q0hLSjI1MDFJOiB7MH0gbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy4zLCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLmVqYkNyZWF0ZS5tYi5tLmVqYjIwPUNIS0oyNTAxSTogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy4zLCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLmVqYlJlbW92ZS5tYi5pLmVqYjIwPUNIS0oyNTAxSTogezB9IG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuNSwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5lamJSZW1vdmUubWIubS5lamIyMD1DSEtKMjUwMUk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuNSwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwMUk6IHswfSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS40LjEwLCAxNS43LjQsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEub25NZXNzYWdlLm1iLm0uZWpiMjA9Q0hLSjI1MDFJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS40LjEwLCAxNS43LjQsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotCi0KLUNIS0oyNTAzLmVqYkNyZWF0ZS5zYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC4zLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuMywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5zYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjMsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuMywgMTguMy44LCAxOC42KS4KLQotIyBlamJQb3N0Q3JlYXRlCi1DSEtKMjQyNi5jYi5pLmVqYjIwPUNIS0oyNDI2VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjYuYmIuaS5lamIyMD1DSEtKMjQyNlc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNDI2LmNiLm0uZWpiMjA9Q0hLSjI0MjZXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI2LmJiLm0uZWpiMjA9Q0hLSjI0MjZXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI0MjcuY2IuaS5lamIyMD1DSEtKMjQyN1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI3LmJiLmkuZWpiMjA9Q0hLSjI0MjdXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjQyNy5jYi5tLmVqYjIwPUNIS0oyNDI3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyNy5iYi5tLmVqYjIwPUNIS0oyNDI3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNCkuCi0KLUNIS0oyNDI4LmNiLmkuZWpiMjA9Q0hLSjI0MjhXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjguYmIuaS5lamIyMD1DSEtKMjQyOFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjQyOC5jYi5tLmVqYjIwPUNIS0oyNDI4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjguYmIubS5lamIyMD1DSEtKMjQyOFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZS5jYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNTA1LmVqYlBvc3RDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMi4yLjQpLgotCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjUsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYlBvc3RDcmVhdGUuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi40LCAxOC4zLjgsIDE4LjYpLgotCi0KLSMgZWpiSG9tZQotQ0hLSjI0MzAuY2IuaS5lamIyMD1DSEtKMjQzMEk6IHsxfSBtdXN0IGV4aXN0IGZvciB7MH0gdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuNikuCi1DSEtKMjQzMC5iYi5pLmVqYjIwPUNIS0oyNDMwSTogezF9IG11c3QgZXhpc3QgZm9yIHswfSB0byBiZSBjYWxsZWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDMwLmNiLm0uZWpiMjA9Q0hLSjI0MzBJOiB7MH0gbXVzdCBleGlzdCBmb3IgdGhpcyBtZXRob2QgdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuNikuCi1DSEtKMjQzMC5iYi5tLmVqYjIwPUNIS0oyNDMwSTogezB9IG11c3QgZXhpc3QgZm9yIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjQzMS5jYi5pLmVqYjIwPUNIS0oyNDMxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzEuYmIuaS5lamIyMD1DSEtKMjQzMVc6IHswfSBtdXN0IGJlIHB1YmxpYy4gIChFSkIgMi4wOiAxMi4yLjYpLgotQ0hLSjI0MzEuY2IubS5lamIyMD1DSEtKMjQzMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzEuYmIubS5lamIyMD1DSEtKMjQzMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAgKEVKQiAyLjA6IDEyLjIuNikuCi0KLUNIS0oyNDM5LmNiLmkuZWpiMjA9Q0hLSjI0MzlXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzkuYmIuaS5lamIyMD1DSEtKMjQzOVc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNikuCi1DSEtKMjQzOS5jYi5tLmVqYjIwPUNIS0oyNDM5VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI0MzkuYmIubS5lamIyMD1DSEtKMjQzOVc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi42KS4KLQotQ0hLSjI1MDAuZWpiSG9tZS5jYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNTAwLmVqYkhvbWUuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNikuCi1DSEtKMjUwMC5lamJIb21lLmNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNTAwLmVqYkhvbWUuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjYpLgotCi1DSEtKMjUwMy5lamJIb21lLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjYsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJIb21lLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjYsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJIb21lLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkhvbWUuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi42LCAxOC4zLjgsIDE4LjYpLgotCi0jIGVqYkZpbmQKLUNIS0oyNDU3LmJiLmkuZWpiMjA9Q0hLSjI0NTdXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQ1Ny5iYi5tLmVqYjIwPUNIS0oyNDU3VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNDU4LmJiLmkuZWpiMjA9Q0hLSjI0NThXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQ1OC5iYi5tLmVqYjIwPUNIS0oyNDU4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNDU5LmJiLmkuZWpiMjA9Q0hLSjI0NTlXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI0NTkuYmIubS5lamIyMD1DSEtKMjQ1OVc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI1MDAuZWpiRmluZC5iYi5pLmVqYjIwPUNIS0oyNTAwSTogezB9IG9uIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNTAwLmVqYkZpbmQuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjQwNy5iYi5pLmVqYjIwPUNIS0oyNDA3VzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNDA3LmJiLm0uZWpiMjA9Q0hLSjI0MDdXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNTAzLmVqYkZpbmQuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkZpbmQuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi41LCAxOC4zLjgsIDE4LjYpLgotCi1DSEtKMjQ5OC5iYi5pLmVqYjIwPUNIS0oyNDk4VzogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ5OC5iYi5tLmVqYjIwPUNIS0oyNDk4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLQotCi0jCi0jIG1ldGhvZHMgd2hpY2ggbXVzdCBub3QgZXhpc3QKLSMKLUNIS0oyNTAyLmVqYkZpbmQuY2IuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdC4gVGhlIGNvbnRhaW5lciBwcm92aWRlcyB0aGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjIpLgotQ0hLSjI1MDIuZWpiRmluZC5jYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIFRoZSBjb250YWluZXIgcHJvdmlkZXMgdGhpcyBtZXRob2QgaW1wbGVtZW50YXRpb24gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4yKS4KLQotQ0hLSjI1MDIuZWpiU2VsZWN0LmJiLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzIChFSkIgMi4wOiAxMi4xLjUpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmJiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgIChFSkIgMi4wOiAxMi4xLjUpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNmYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAoRUpCIDIuMDogNy42LjEpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNmYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzICAoRUpCIDIuMDogNy42LjEpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNzYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAoRUpCIDIuMDogNy44LjIpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LnNzYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzICAoRUpCIDIuMDogNy44LjIpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyYy5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JjLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsYy5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xjLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotCi0jIGZpbmFsaXplCi1DSEtKMjUwMi5maW5hbGl6ZS5jYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLmNiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLm1iLmkuZWpiMjA9Q0hLSjI1MDJJOiBmaW5hbGl6ZSgpIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjI1MDIuZmluYWxpemUubWIubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjI1MDIuZmluYWxpemUuYmIuaS5lamIyMD1DSEtKMjUwMkk6IGZpbmFsaXplKCkgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5iYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5zYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLnNiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC4yKS4KLQotQ0hLSjI1MDIuc2xoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwMi5zbGgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI1MDIuc3JoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMi5zcmgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjYpLgotCi0KLSMgYnVzaW5lc3MKLUNIS0oyNDExLnNiLmkuZWpiMjA9Q0hLSjI0MTFXOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQxMS5jYi5pLmVqYjIwPUNIS0oyNDExVzogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0MTEuYmIuaS5lamIyMD1DSEtKMjQxMVc6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDExLnNiLm0uZWpiMjA9Q0hLSjI0MTFXOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQxMS5jYi5tLmVqYjIwPUNIS0oyNDExVzogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0MTEuYmIubS5lamIyMD1DSEtKMjQxMVc6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI0NDEuc2IuaS5lamIyMD1DSEtKMjQ0MVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQxLmNiLmkuZWpiMjA9Q0hLSjI0NDFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0MS5iYi5pLmVqYjIwPUNIS0oyNDQxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI0NDEuc2IubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDEuY2IubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDEuYmIubS5lamIyMD1DSEtKMjQ0MVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjQ0Mi5zYi5pLmVqYjIwPUNIS0oyNDQyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDIuY2IuaS5lamIyMD1DSEtKMjQ0Mlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQyLmJiLmkuZWpiMjA9Q0hLSjI0NDJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjQ0Mi5zYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0Mi5jYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0Mi5iYi5tLmVqYjIwPUNIS0oyNDQyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNDQzLnNiLmkuZWpiMjA9Q0hLSjI0NDNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDMuY2IuaS5lamIyMD1DSEtKMjQ0M1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0My5iYi5pLmVqYjIwPUNIS0oyNDQzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDQzLnNiLm0uZWpiMjA9Q0hLSjI0NDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0My5jYi5tLmVqYjIwPUNIS0oyNDQzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDMuYmIubS5lamIyMD1DSEtKMjQ0M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI1MDAuYnVzLnNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI1MDAuYnVzLmNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI1MDAuYnVzLmJiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI1MDAuYnVzLnNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNTAwLmJ1cy5jYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjUwMC5idXMuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjUwMy5idXMuc2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjcsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuc2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjcsIDE4LjMuOCwgMTguNikuCi0KLSMgb25NZXNzYWdlCi1DSEtKMjUwMy5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDE1LjQuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5vbk1lc3NhZ2UubWIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTUuNC4xMCwgMTguMy44LCAxOC42KS4KLQotQ0hLSjI0NDUubWIuaS5lamIyMD1DSEtKMjQ0NVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNDQ1Lm1iLm0uZWpiMjA9Q0hLSjI0NDVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy40KS4KLQotQ0hLSjI0NDYubWIuaS5lamIyMD1DSEtKMjQ0Nlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNDQ2Lm1iLm0uZWpiMjA9Q0hLSjI0NDZXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy40KS4KLQotQ0hLSjI0NDcubWIuaS5lamIyMD1DSEtKMjQ0N1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNCkuCi1DSEtKMjQ0Ny5tYi5tLmVqYjIwPUNIS0oyNDQ3VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjQpLgotCi1DSEtKMjUwNS5vbk1lc3NhZ2UubWIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjQpLgotQ0hLSjI1MDUub25NZXNzYWdlLm1iLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjQpLgotCi0jIGFjY2Vzc29yIG1ldGhvZAotQ0hLSjI0NDkuY2IuaS5lamIyMD1DSEtKMjQ0OVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDQ5LmNiLm0uZWpiMjA9Q0hLSjI0NDlXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0NTAuY2IuaS5lamIyMD1DSEtKMjQ1MFc6IHswfSBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjQ1MC5jYi5tLmVqYjIwPUNIS0oyNDUwVzogVGhpcyBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotCi0jIGdldCAmIHNldCBtZXRob2RzIG9mIGNtciBmaWVsZHMKLUNIS0oyNDczLmNyYy5pLmVqYjIwPUNIS0oyNDczVzogezB9IG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDczLmNyYy5tLmVqYjIwPUNIS0oyNDczVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzMuY3JoLmkuZWpiMjA9Q0hLSjI0NzNXOiB7MH0gbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzMuY3JoLm0uZWpiMjA9Q0hLSjI0NzNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi0KLSMgaG9tZQotQ0hLSjI0NjEuaG9tZS5icmguZWpiMjA9Q0hLSjI0NjFXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2MS5ob21lLmNyaC5lamIyMD1DSEtKMjQ2MVc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2MS5ob21lLnNyaC5lamIyMD1DSEtKMjQ2MVc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogNy4xMC42KS4KLQotQ0hLSjI0NjIuY2xoLmkuZWpiMjA9Q0hLSjI0NjJJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYyLmJyaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYyLmNyaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2Mi5ibGguaS5lamIyMD1DSEtKMjQ2Mkk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjIuY2xoLm0uZWpiMjA9Q0hLSjI0NjJJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYyLmJyaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYyLmNyaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2Mi5ibGgubS5lamIyMD1DSEtKMjQ2Mkk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotCi1DSEtKMjQ2My5jbGguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYzLmJyaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2My5jcmguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDYzLmJsaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjMuY2xoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2My5icmgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjMuY3JoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2My5ibGgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLQotQ0hLSjI0NjQuY2xoLmkuZWpiMjA9Q0hLSjI0NjRJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDY0LmJyaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDY0LmNyaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2NC5ibGguaS5lamIyMD1DSEtKMjQ2NEk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotQ0hLSjI0NjQuY2xoLm0uZWpiMjA9Q0hLSjI0NjRJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDY0LmJyaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDY0LmNyaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2NC5ibGgubS5lamIyMD1DSEtKMjQ2NEk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotCi1DSEtKMjUwMy5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAzLmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAzLmhvbWUuc3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5ob21lLmJsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLmNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLnNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5icmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAzLmhvbWUuY3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDMuaG9tZS5zcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuaG9tZS5ibGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLmNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuc2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLQotCi0jIGNyZWF0ZQotQ0hLSjI1MDMuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNTAzLmNyZWF0ZS5jcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI1MDMuY3JlYXRlLnNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuY3JlYXRlLmJsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuY2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5zbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5icmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNTAzLmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjUwMy5jcmVhdGUuc3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5ibGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuY2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLnNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDY3LnNyaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY3LnNsaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNDY3LmNyaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0NjcuY2xoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQ2Ny5icmguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI0NjcuYmxoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi1DSEtKMjQ2Ny5zcmgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY3LnNsaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI0NjcuY3JoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDY3LmNsaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQ2Ny5icmgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjQ2Ny5ibGgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotCi1DSEtKMjQwMi5zZnJoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyNDAyLnNmbGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuNC4xLCA3LjEwLjgpLgotQ0hLSjI0MDIuc3NyaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNi4zLjEsIDcuOCwgNy4xMC42KS4KLUNIS0oyNDAyLnNzbGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuNC4xLCA3LjgsIDcuMTAuOCkuCi1DSEtKMjQwMi5jcmguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDAyLmNsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIpLgotQ0hLSjI0MDIuYnJoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDAyLmJsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotQ0hLSjI0MDIuc2ZyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA2LjMuMSwgNy4xMC42KS4KLUNIS0oyNDAyLnNmbGgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNi40LjEsIDcuMTAuOCkuCi1DSEtKMjQwMi5zc3JoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuMy4xLCA3LjgsIDcuMTAuNikuCi1DSEtKMjQwMi5zc2xoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuNC4xLCA3LjgsIDcuMTAuOCkuCi1DSEtKMjQwMi5jcmgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0MDIuY2xoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyKS4KLUNIS0oyNDAyLmJyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDAyLmJsaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi0KLUNIS0oyNDc2LnNyaC5pLmVqYjIwPUNIS0oyNDc2RTogezB9IG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjI0NzYuc2xoLmkuZWpiMjA9Q0hLSjI0NzZFOiB7MH0gbXVzdCBiZSB0aGUgY3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgsIDcuMTAuOCkuCi1DSEtKMjQ3Ni5zcmgubS5lamIyMD1DSEtKMjQ3NkU6IFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjYpLgotQ0hLSjI0NzYuc2xoLm0uZWpiMjA9Q0hLSjI0NzZFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBjcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCwgNy4xMC44KS4KLUNIS0oyNDc2LnNzYi5pLmVqYjIwPUNIS0oyNDc2RTogezB9IG11c3QgYmUgdGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44KS4KLUNIS0oyNDc2LnNzYi5tLmVqYjIwPUNIS0oyNDc2RTogVGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgZWpiQ3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgpLgotCi0KLSMgcmVtb3RlIGNyZWF0ZQotQ0hLSjI1MDQuY3JlYXRlLnNyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTA0LmNyZWF0ZS5zbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwNC5jcmVhdGUuY3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNTA0LmNyZWF0ZS5jbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI1MDQuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmNyZWF0ZS5ibGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI1MDQuY3JlYXRlLnNyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwNC5jcmVhdGUuc2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNTA0LmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNTA0LmNyZWF0ZS5jbGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNTA0LmNyZWF0ZS5icmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuY3JlYXRlLmJsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuMTEpLgotCi1DSEtKMjUwMC5jcmVhdGUuc3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuY3JlYXRlLmNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuY3JlYXRlLmJyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMC5jcmVhdGUuc3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmNyZWF0ZS5jcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5jcmVhdGUuYnJoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi0KLSMgaG9tZSBtZXRob2QKLUNIS0oyNTA0LmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMTApLgotQ0hLSjI1MDQuaG9tZS5jbGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4xMikuCi1DSEtKMjUwNC5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmhvbWUuYmxoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmhvbWUuY3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTA0LmhvbWUuY2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEyKS4KLUNIS0oyNTA0LmhvbWUuYnJoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmhvbWUuYmxoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMSkuCi0KLQotIyBmaW5kIG1ldGhvZAotQ0hLSjI1MDMuZmluZC5icmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjUwMy5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjUwMy5maW5kLnNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuZmluZC5ibGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5jbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5zbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuYnJoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjUwMy5maW5kLmNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTAzLmZpbmQuc3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmZpbmQuYmxoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5jbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLnNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDc3LmNyaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3Ny5icmguaS5lamIyMD1DSEtKMjQ3N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc3LmNsaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzcuYmxoLmkuZWpiMjA9Q0hLSjI0NzdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3Ny5jcmgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3Ny5icmgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjI0NzcuY2xoLm0uZWpiMjA9Q0hLSjI0NzdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc3LmJsaC5tLmVqYjIwPUNIS0oyNDc3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi0KLUNIS0oyNDc4LmNyaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jcmgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jbGguaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguY2xoLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguYnJoLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJyaC5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJsaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5ibGgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5jYi5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jYi5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmJiLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJiLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotCi1DSEtKMjQwMy5icmguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMi4xLjcsIDEyLjIuOSkuCi1DSEtKMjQwMy5ibGguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNi4yLCAxMi4xLjcsIDEyLjIuMTEpLgotQ0hLSjI0MDMuY3JoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjUuMiwgMTAuNS42LCAxMC42LjEwLCAxMS4yLjIpLgotQ0hLSjI0MDMuY2xoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTAuNS42LCAxMC42LjEyLCAxMS4yLjIpLgotQ0hLSjI0MDMuYnJoLm0uZWpiMjA9Q0hLSjI0MDNXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMi4xLjcsIDEyLjIuOSkuCi1DSEtKMjQwMy5ibGgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS42LjIsIDEyLjEuNywgMTIuMi4xMSkuCi1DSEtKMjQwMy5jcmgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS41LjIsIDEwLjUuNiwgMTAuNi4xMCwgMTEuMi4yKS4KLUNIS0oyNDAzLmNsaC5tLmVqYjIwPUNIS0oyNDAzVzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTAuNS42LCAxMC42LjEyLCAxMS4yLjIpLgotCi0jIHJlbW90ZSBmaW5kCi1DSEtKMjUwNC5maW5kLmJyaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI1MDQuZmluZC5icmgubS5lamIyMD1DSEtKMjUwNFc6IHswfSBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmZpbmQuY3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMTApLgotCi0jIGxvY2FsIGZpbmQKLUNIS0oyNTA0LmZpbmQuYmxoLmkuZWpiMjA9Q0hLSjI1MDRXOiB7MX0gbXVzdCBleGlzdCBvbiB7Mn0gZm9yIHswfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjUwNC5maW5kLmNsaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjUwNC5maW5kLmJsaC5tLmVqYjIwPUNIS0oyNTA0VzogezB9IG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmZpbmQuY2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMikuCi0KLQotQ0hLSjI1MDAuZmluZC5zcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5maW5kLmNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuZmluZC5icmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDAuZmluZC5zcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuZmluZC5jcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5maW5kLmJyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotCi1DSEtKMjQ5NS5jbGguaS5lamIyMD1DSEtKMjQ5NUk6IHswfSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNiwgMTAuNi4xNCkuCi1DSEtKMjQ5NS5jbGgubS5lamIyMD1DSEtKMjQ5NUk6IFRoaXMgbWV0aG9kIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLUNIS0oyNDk1LmNyaC5pLmVqYjIwPUNIS0oyNDk1STogezB9IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLUNIS0oyNDk1LmNyaC5tLmVqYjIwPUNIS0oyNDk1STogVGhpcyBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjYsIDEwLjYuMTQpLgotCi0KLSMgbWV0aG9kIG9uIGEgY29tcG9uZW50IGludGVyZmFjZQotQ0hLSjI1MDMuYnVzLnNyYy5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI1MDMuYnVzLnNsYy5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC43LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJyYy5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI1MDMuYnVzLmJsYy5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTIuMi4xMCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jcmMuaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAzLmJ1cy5jbGMuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuc3JjLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAzLmJ1cy5zbGMubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC43LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJyYy5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjUwMy5idXMuYmxjLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDEyLjIuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuY3JjLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAzLmJ1cy5jbGMubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTguMy44LCAxOC42KS4KLQotIyBtZXRob2Qgb24gYSBob21lIGludGVyZmFjZQotQ0hLSjI0NjUuYnJoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDY1LmJsaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI0NjUuY3JoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2NS5jbGguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNDY1LnNyaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjQ2NS5zbGguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI0NjUuYnJoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjUuYmxoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNDY1LmNyaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2NS5jbGgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI0NjUuc3JoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI0NjUuc2xoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiA3LjEwLjgpLgotCi0jIG1ldGhvZCBvbiBhIHJlbW90ZSBob21lCi1DSEtKMjUwMC5ob21lLnNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmhvbWUuY3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5ob21lLmJyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMC5ob21lLnNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5ob21lLmNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmhvbWUuYnJoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi0KLUNIS0oyNDY2LnNyYy5pLmVqYjIwPUNIS0oyNDY2STogezB9IG11c3Qgbm90IGV4cG9zZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ2Ni5jcmguaS5lamIyMD1DSEtKMjQ2Nkk6IHswfSBtdXN0IG5vdCBleHBvc2UgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDY2LmJyaC5pLmVqYjIwPUNIS0oyNDY2STogezB9IG11c3Qgbm90IGV4cG9zZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2Ni5jcmgubS5lamIyMD1DSEtKMjQ2Nkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjYuYnJoLm0uZWpiMjA9Q0hLSjI0NjZJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlIChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjYuc3JjLm0uZWpiMjA9Q0hLSjI0NjZJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlIChFSkIgMi4wOiA3LjEwLjUpLgotCi0jIG1ldGhvZCBvbiBhIHJlbW90ZSBjb21wb25lbnQKLUNIS0oyNDY4LnNyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDY4LmNyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDY4LmJyYy5lamIyMD1DSEtKMjQ2OFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTIuMi44KS4KLQotQ0hLSjI1MDAuYnVzLnNyYy5pLmVqYjIwPUNIS0oyNTAwSTogezB9IGluIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAwLmJ1cy5jcmMuaS5lamIyMD1DSEtKMjUwMEk6IHswfSBpbiBtZXRob2QgezF9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjUwMC5idXMuYnJjLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MH0gaW4gbWV0aG9kIHsxfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI1MDAuYnVzLnNyYy5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjUwMC5idXMuY3JjLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAwLmJ1cy5icmMubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjgpLgotCi1DSEtKMjQ3Mi5zcmguaS5lamIyMD1DSEtKMjQ3Mlc6IHsxfSBpbiBtZXRob2QgezB9IGNhbm5vdCBiZSBhbiBhcmd1bWVudCBvciByZXN1bHQgdHlwZSAoRUpCIDIuMDogNi43LjIpLgotQ0hLSjI0NzIuYnJjLmkuZWpiMjA9Q0hLSjI0NzJXOiB7MH0gbXVzdCBub3QgcGFzcyB7MX0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTIuMi44KS4KLUNIS0oyNDcyLmNyYy5pLmVqYjIwPUNIS0oyNDcyVzogezB9IG11c3Qgbm90IHBhc3MgezF9IGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogOS43LjIsIDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDcyLmJyYy5tLmVqYjIwPUNIS0oyNDcyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyB7MH0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTIuMi44KS4KLUNIS0oyNDcyLmNyYy5tLmVqYjIwPUNIS0oyNDcyVzogVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyB7MH0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzIuc3JoLm0uZWpiMjA9Q0hLSjI0NzJXOiB7MH0gY2Fubm90IGJlIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlIChFSkIgMi4wOiA2LjcuMikuCi0KLSMgbWV0aG9kIG9uIGEgcmVtb3RlIGNvbXBvbmVudCBDTVAKLUNIS0oyNDc0LmNyYy5pLmVqYjIwPUNIS0oyNDc0VzogezB9IG11c3Qgbm90IGV4cG9zZSB7MX0gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDc0LmNyYy5tLmVqYjIwPUNIS0oyNDc0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHswfSAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotCi1DSEtKMjQ5MC5jcmMuaS5lamIyMD1DSEtKMjQ5MFc6IHswfSBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSktKMjQ5MC5jcmMubS5lamIyMD1DSEtKMjQ5MFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLQotIyBlamJTZWxlY3QgbWV0aG9kCi1DSEtKMjQ4NS5jYi5pLmVqYjIwPUNIS0oyNDg1VzogezB9IG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi43KS4KLUNIS0oyNDg1LmNiLm0uZWpiMjA9Q0hLSjI0ODVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC41LjcsIDEwLjYuNykuCi0KLUNIS0oyNDg3LmNiLmkuZWpiMjA9Q0hLSjI0ODdXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNykuCi1DSEtKMjQ4Ny5jYi5tLmVqYjIwPUNIS0oyNDg3VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNykuCi0KLUNIS0oyNDg4LmNiLmkuZWpiMjA9Q0hLSjI0ODhXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjcpLgotQ0hLSjI0ODguY2IubS5lamIyMD1DSEtKMjQ4OFc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi43KS4KLQotQ0hLSjI0ODYuY2IuaS5lamIyMD1DSEtKMjQ4Nlc6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjUuNywgMTEuMi4yKS4KLUNIS0oyNDg2LmNiLm0uZWpiMjA9Q0hLSjI0ODZXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjUuNywgMTEuMi4yKS4KLQotQ0hLSjI0OTYuY2IuaS5lamIyMD1DSEtKMjQ5Nlc6IHswfSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi4xNCkuCi1DSEtKMjQ5Ni5jYi5tLmVqYjIwPUNIS0oyNDk2VzogVGhpcyBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjcsIDEwLjYuMTQpLgotCi0jIGNvbXBvbmVudCBtYXRjaGluZyBtZXRob2QKLUNIS0oyMDIzLnNyYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyMDIzLnNsYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyMDIzLmJyYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyMDIzLmJsYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjAyMy5jcmMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjAyMy5jbGMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjIwMjMuc3JjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyMDIzLnNsYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjAyMy5icmMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjIwMjMuYmxjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjAyMy5jcmMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjIwMjMuY2xjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4xMSkuCi0KLUNIS0oyNDcwLnNyYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcwLnNsYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcwLmNyYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcwLmNsYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MC5icmMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MC5ibGMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjI0NzAuc3JjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ3MC5zbGMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcwLmNyYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzAuY2xjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjI0NzAuYnJjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MC5ibGMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTIuMi4xMCkuCi0KLUNIS0oyNDcxLnNyYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NzEuc2xjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MS5jcmMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcxLmNsYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyNDcxLmJyYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzEuYmxjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjI0NzEuc3JjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcxLnNsYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MS5jcmMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzEuY2xjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MS5icmMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzEuYmxjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTIuMi4xMCkuCi0KLSMgRUpCT2JqZWN0LCBFSkJMb2NhbE9iamVjdCBtZXRob2RzCi1DSEtKMjQ2OS5zcmMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA2LjUpLgotQ0hLSjI0Njkuc2xjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LmNyYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5jbGMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLUNIS0oyNDY5LmJyYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5ibGMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLUNIS0oyNDY5LnNyYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LnNsYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LmNyYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS45KS4KLUNIS0oyNDY5LmNsYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS4xMCkuCi1DSEtKMjQ2OS5icmMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5ibGMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuMTApLgotCi0jIGZpbmRCeVByaW1hcnlLZXkKLUNIS0oyNDc1LmNyaC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MX0pIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3NS5jbGguaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezF9KSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzUuY3JoZC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuY2xoZC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuYnJoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzUuYmxoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc1LmNyaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc1LmNsaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc1LmNyaGQubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuY2xoZC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgKEVKQiAyLjA6IDEwLjguMykuCi1DSEtKMjQ3NS5icmgubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MH0pIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc1LmJsaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLQotQ0hLSjI0NzkuY3JoLmkuZWpiMjA9Q0hLSjI0NzlFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3OS5jbGguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc5LmJyaC5pLmVqYjIwPUNIS0oyNDc5RTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3OS5ibGguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc5LmNyaC5tLmVqYjIwPUNIS0oyNDc5RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3OS5jbGgubS5lamIyMD1DSEtKMjQ3OUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzkuYnJoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzkuYmxoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZpZWxkIGNoZWNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNIS0oyNDUyLnNiLmkuZWpiMjA9Q0hLSjI0NTJXOiBUcmFuc2llbnQgZmllbGQgezB9IHNob3VsZCBub3QgYmUgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiA3LjQuMSkuCi1DSEtKMjQ1Mi5zYi5tLmVqYjIwPUNIS0oyNDUyVzogQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDcuNC4xKS4KLQotQ0hLSjI0NTMuc2IuaS5lamIyMD1DSEtKMjQ1M1c6IFRyYW5zaWVudCBmaWVsZHMgKHswfSkgYXJlIGRpc2NvdXJhZ2VkIChFSkIgMi4wOiA3LjQuMSkuCi1DSEtKMjQ1My5zYi5tLmVqYjIwPUNIS0oyNDUzVzogVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQgKEVKQiAyLjA6IDcuNC4xKS4KLQotIyBDTVIgYW5kIENNUCBmaWVsZHMgbXVzdCBOT1QgYmUgZGVmaW5lZCBvbiB0aGUgYmVhbiBjbGFzcy4KLUNIS0oyNDU0LmNiLmkuZWpiMjA9Q0hLSjI0NTRXOiB7MH0gbXVzdCBub3QgYmUgZGVmaW5lZCAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDU0LmNiLm0uZWpiMjA9Q0hLSjI0NTRXOiB7MH0gbXVzdCBub3QgYmUgZGVmaW5lZCAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0ODAuY2IuaS5lamIyMD1DSEtKMjQ4MEk6IHswfSBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0ODAuY2IubS5lamIyMD1DSEtKMjQ4MEk6IHswfSBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4MS5jYi5pLmVqYjIwPUNIS0oyNDgxVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLUNIS0oyNDgxLmNiLm0uZWpiMjA9Q0hLSjI0ODFXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXAtZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotCi1DSEtKMjQ4Mi5jYi5pLmVqYjIwPUNIS0oyNDgyVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLUNIS0oyNDgyLmNiLm0uZWpiMjA9Q0hLSjI0ODJXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotCi1DSEtKMjQ4My5jYi5pLmVqYjIwPUNIS0oyNDgzVzogezB9IHNob3VsZCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDgzLmNiLm0uZWpiMjA9Q0hLSjI0ODNXOiB7MH0gc2hvdWxkIG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4NC5jYi5pLmVqYjIwPUNIS0oyNDg0VzogezB9IG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ4NC5jYi5tLmVqYjIwPUNIS0oyNDg0VzogezB9IG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDg5LmNiLmkuZWpiMjA9Q0hLSjI0ODlXOiBGaWVsZCB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDEwLjguMSkuCi1DSEtKMjQ4OS5jYi5tLmVqYjIwPUNIS0oyNDg5VzogVGhpcyBmaWVsZCBtdXN0IGJlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogMTAuOC4xKS4KLQotQ0hLSjIyMDUua2MuaS5lamIyMD1DSEtKMjIwNVc6IEZpZWxkIHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuOC4yKS4KLUNIS0oyMjA1LmtjLm0uZWpiMjA9Q0hLSjIyMDVXOiBUaGlzIGZpZWxkIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC44LjIpLgotCi1DSEtKMjIwNi5rYy5pLmVqYjIwPUNIS0oyMjA2VzogRmllbGQgezB9IG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuOC4yKS4KLUNIS0oyMjA2LmtjLm0uZWpiMjA9Q0hLSjIyMDZXOiBUaGlzIGZpZWxkIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuOC4yKS4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIERECi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNIS0oyODgwLnMuZWpiMjA9Q0hLSjI4ODBXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODEucy5lamIyMD1DSEtKMjg4MVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8aG9tZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4Mi5zLmVqYjIwPUNIS0oyODgyVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbD4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4My5zLmVqYjIwPUNIS0oyODgzVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODQucy5lamIyMD1DSEtKMjg4NFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsLWhvbWU+IG9yIGEgPGhvbWU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODUucy5lamIyMD1DSEtKMjg4NVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsPiBvciBhIDxyZW1vdGU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODAuYy5lamIyMD1DSEtKMjg4MFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWwtaG9tZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4MS5jLmVqYjIwPUNIS0oyODgxVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgyLmMuZWpiMjA9Q0hLSjI4ODJXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgzLmMuZWpiMjA9Q0hLSjI4ODNXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4NC5jLmVqYjIwPUNIS0oyODg0VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4NS5jLmVqYjIwPUNIS0oyODg1VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWw+IG9yIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4MC5iLmVqYjIwPUNIS0oyODgwVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbC1ob21lPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODgxLmIuZWpiMjA9Q0hLSjI4ODFXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGhvbWU+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODIuYi5lamIyMD1DSEtKMjg4Mlc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODMuYi5lamIyMD1DSEtKMjg4M1c6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODg0LmIuZWpiMjA9Q0hLSjI4ODRXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbC1ob21lPiBvciBhIDxob21lPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODg1LmIuZWpiMjA9Q0hLSjI4ODVXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTIuMi4xKS4KLQotQ0hLSjI4MTMuZWpiMjA9Q0hLSjI4MTNJOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIChFSkIgMi4wOiAxMC4zLjEzLCAxMS4yLjYuMSkuCi1DSEtKMjgxOS5lamIyMD1DSEtKMjgxOUk6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgKEVKQiAyLjA6IDEwLjMuMTMsIDEwLjYuMTQsIDExLjIuNi4xKS4KLUNIS0oyODU0LmVqYjIwPUNIS0oyODU0RTogPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIChFSkIgMi4wOiAxMC4zLjEzLCAxMC42LjE0LCAxMS4yLjIpLgotQ0hLSjI4NTguZWpiMjA9Q0hLSjI4NThXOiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4NTkuZWpiMjA9Q0hLSjI4NTlXOiBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiA8ZWpiLW5hbWU+IChFSkIgMi4wOiAxMC42LjE0LCAxMS4yLjYuMSkuCi1DSEtKMjg2MC5lamIyMD1DSEtKMjg2MFc6IFJlc2VydmVkIGlkZW50aWZpZXIgezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gKEVKQiAyLjA6IDEwLjYuMTQsIDExLjIuNi4xKS4KLQotQ0hLSjI4NjEuZWpiMjA9Q0hLSjI4NjFJOiA8Y21wLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSwgMTEuMi42LjEpLgotQ0hLSjI4NTcuZWpiMjA9Q0hLSjI4NTdJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSwgMTEuMi42LjEpLgotCi1DSEtKMjg2Mi5lamIyMD1DSEtKMjg2Mkk6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBzZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2My5lamIyMD1DSEtKMjg2M0k6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBnZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2NC5lamIyMD1DSEtKMjg2NEk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBzZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg2NS5lamIyMD1DSEtKMjg2NUk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGhhdmUgYSBnZXQgbWV0aG9kIChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi1DSEtKMjg1NS5lamIyMD1DSEtKMjg1NUk6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGJlIGEgSmF2YSBwcmltaXRpdmUgb3IgYSBKYXZhIHNlcmlhbGl6YWJsZSB0eXBlIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI4NTYuZWpiMjA9Q0hLSjI4NTZJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyODE1LmVqYjIwPUNIS0oyODE1VzogRGVwZW5kZW50IHZhbHVlIGNsYXNzIHswfSBjYW5ub3QgYmUgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4zKS4KLQotQ0hLSjI4MTYuZWpiMjA9Q0hLSjI4MTZJOiA8ZWpiLXJlbGF0aW9uLW5hbWU+IG11c3QgYmUgdW5pcXVlIGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4MTcuZWpiMjA9Q0hLSjI4MTdJOiA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiA8ZWpiLXJlbGF0aW9uPiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODE4LmVqYjIwPUNIS0oyODE4STogVGhlIHZhbHVlIG9mIHRoZSA8bXVsdGlwbGljaXR5PiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJPbmUiIG9yICJNYW55IiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODIxLmVqYjIwPUNIS0oyODIxSTogPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4gaW4gcm9sZSB7MH0gbXVzdCByZWZlciB0byBhbiBleGlzdGluZyBDTVAgYmVhbiAoRUpCIDIuMDogMTAuMy4yLCAyMi41KS4KLUNIS0oyODQ4LmVqYjIwPUNIS0oyODQ4STogPGNhc2NhZGUtZGVsZXRlPiBtdXN0IGJlIHVzZWQgd2l0aCBhIDxtdWx0aXBsaWNpdHk+IG9mICJPbmUiIChFSkIgMi4wOiAxMC4zLjQuMiwgMjIuNSkuCi1DSEtKMjg2Ni5lamIyMD1DSEtKMjg2Nkk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGRlZmluZWQgb24gezF9IChFSkIgMi4wOiAxMC4zLjIsIDIyLjUpLgotQ0hLSjI4NjcuZWpiMjA9Q0hLSjI4NjdJOiBUaGlzIGJlYW4gY2FuIGhhdmUgb25seSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGJlYW5zIChFSkIgMi4wOiAxMC4zLjIpLgotQ0hLSjI4NjguZWpiMjA9Q0hLSjI4NjhJOiBUaGUgdmFsdWUgb2YgdGhlIDxjbXItZmllbGQtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJqYXZhLnV0aWwuU2V0IiAoRUpCIDIuMDogMTAuMy4xMywgMjIuNSkuCi1DSEtKMjg2OS5lamIyMD1DSEtKMjg2OUk6IEF0IGxlYXN0IG9uZSA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiBtdXN0IGRlZmluZSBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4NzAuZWpiMjA9Q0hLSjI4NzBJOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC4zLjEzKS4KLUNIS0oyODcxLmVqYjIwPUNIS0oyODcxSTogPGVqYi1uYW1lPiB7MH0gbXVzdCByZWZlciB0byBhIENNUCBiZWFuIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMpLgotCi1DSEtKMjg3Mi5lamIyMD1DSEtKMjg3MkU6IFRoZSB2YWx1ZSBvZiB0aGUgPGNtcC12ZXJzaW9uPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICIxLngiIG9yICIyLngiIChFSkIgMi4wOiAyMi41KS4KLUNIS0oyODczLmVqYjIwPUNIS0oyODczVzogTWlncmF0ZSB0aGlzIGJlYW4ncyBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuCi1DSEtKMjg3NC5lamIyMD1DSEtKMjg3NFc6IE1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4KLQotQ0hLSjI4ODYuZWpiMjE9Q0hLSjI4ODVFOiBEdXBsaWNhdGUgYWN0aXZhdGlvbiBjb25maWc6ICJ7MH0iIGV4aXN0IGluIG1lc3NhZ2UgZHJpdmVuIGJlYW46ICJ7MX0iLgotQ0hLSjI4ODcuZWpiMjE9VGhlIGFjdGl2YXRpb24gY29uZmlnIHdpdGggbmFtZTogInswfSIgaGFzIGludmFsaWQgdmFsdWU6ICJ7MX0iIGZvciBtZXNzYWdlIGRyaXZlbiBiZWFuOiAiezJ9Ii4KLUNIS0oyODkwLmVqYjIxPVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGU6ICJ7MH0iIGFuZCBkZXN0aW5hdGlvbiB0eXBlIGFjdGl2YXRpb24gY29uZmlnIHByb3BlcnR5IHZhbHVlOiAiezF9IiBkbyBub3QgbWF0Y2ggIGZvciBiZWFuOiAiezJ9Ii4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIDJUQzogRG8gbm90IHRyYW5zbGF0ZSBhbnl0aGluZyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24uIFRoZXNlIHN0cmluZ3MKLSMgICAgICBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgSWdub3JlIHRoZXNlIG1lc3NhZ2VzIGZvciBub3c7IHRoZSBFSkIgUUwgdmFsaWRhdG9yIG1heSB0YWtlIGNhcmUgb2YgdGhpcy4KLSMgSWYgbm90LCBhZGQgdGhpcyB2YWxpZGF0aW9uIGludG8gdGhlIEVKQkphclZSdWxlIGNsYXNzLgotIwotIwotIyBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMKLSMKLSMgSVdBRDQ5MjcuZWpiMjA9SVdBRDQ5MjdXOiBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZSB7MH0gbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgRlJPTSBjbGF1c2UgKEVKQiAyLjA6IDExLjIuNi4yKS4KLSMgSVdBRDQ5MjguZWpiMjA9SVdBRDQ5MjhXOiBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAoRUpCIDIuMDogMTEuMi42LjIpLgotIyBJV0FENDkyOS5lamIyMD1JV0FENDkyOVc6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIChFSkIgMi4wOiAxMS4yLjYuMikuCi0jIElXQUQ0OTMwLmVqYjIwPUlXQUQ0OTMwVzogPGVqYi1uYW1lPiB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgKEVKQiAyLjA6IDExLjIuNi4yKS4KLQotIwotIyBxdWVyeSBzdGF0ZW1lbnQKLSMKLSMgSVdBRDQ5MTguZWpiMjA9SVdBRDQ5MThXOiBUaGlzIHF1ZXJ5IG11c3QgY29udGFpbiBhIFNFTEVDVCBjbGF1c2UgKEVKQiAyLjA6IDExLjEpLgotIyBJV0FENDkxOS5lamIyMD1JV0FENDkxOVc6IFRoaXMgcXVlcnkgbXVzdCBjb250YWluIGEgRlJPTSBjbGF1c2UgKEVKQiAyLjA6IDExLjEpLgotIyBJV0FENDkyMC5lamIyMD1JV0FENDkyMFc6IFRoaXMgcXVlcnkgaGFzIGEgc3ludGF4IGVycm9yIChFSkIgMi4wOiAxMS4yKS4KLSMKLQotCi0jIElXQUQ0ODA4LmVqYjIwPUlXQUQ0ODA4VzogVGhpcyBiZWFuIG11c3QgdXNlIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIChFSkIgMi4wOiAxNy4zLjEsIDE3LjMuMykuCi0jIElXQUQ0ODA5LmVqYjIwPUlXQUQ0ODA5VzogU3BlY2lmeSBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODEwLmVqYjIwPUlXQUQ0ODEwVzogQSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgbXVzdCBub3QgZXhpc3QgZm9yIHRoaXMgbWV0aG9kIChFSkIgMi4wOiAxNy40LjEpLgotCi0jIElXQUQ0ODExLmVqYjIwPUlXQUQ0ODExVzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IG11c3QgZXhpc3QgaW4gYSA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ5MDAuZWpiMjA9SVdBRDQ5MDBXOiBUaGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+IG11c3QgcmVmZXJlbmNlIG9ubHkgb25lIGJlYW4gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0OTAxLmVqYjIwPUlXQUQ0OTAxVzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDE3LjQuMSkKLSMgSVdBRDQ4MTUuZWpiMjA9SVdBRDQ4MTVXOiBObyBtZXRob2RzIG9uIHswfSBtYXRjaCB0aGlzIDxtZXRob2Q+IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgxNy5lamIyMD1JV0FENDgxN1c6IDx0cmFucy1hdHRyaWJ1dGU+IGlzIHVua25vd24gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODE4LmVqYjIwPUlXQUQ0ODE4VzogT25seSBvbmUgU3R5bGUgMSA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBtYXkgZXhpc3QgZm9yIHswfSAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MTkuZWpiMjA9SVdBRDQ4MTlXOiBPbmx5IG9uZSBTdHlsZSAyIDxjb250YWluZXItdHJhbnNhY3Rpb24+IG1heSBleGlzdCBmb3IgezB9IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgyMC5lamIyMD1JV0FENDgyMFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kLXBhcmFtPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wYXJhbXM+LgotCi0jIElXQUQ0ODIxLmVqYjIwPUlXQUQ0ODIxVzogPGVudi1lbnRyeS12YWx1ZT4gbXVzdCBiZSBhIHswfSAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyMi5lamIyMD1JV0FENDgyMlc6IDxlbnYtZW50cnktbmFtZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyMy5lamIyMD1JV0FENDgyM1c6IDxlbnYtZW50cnktdHlwZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyNC5lamIyMD1JV0FENDgyNFc6IDxlbnYtZW50cnktbmFtZT4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHswfSAoRUpCIDIuMDogMjAuMi4xLjIpLgotIyBJV0FENDgyNS5lamIyMD1JV0FENDgyNVc6IDxlbnYtZW50cnktdHlwZT4gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgKEVKQiAyLjA6IDIwLjIuMS4yLCAyMi41KS4KLSMgSVdBRDQ4MjYuZWpiMjA9SVdBRDQ4MjZXOiA8ZW52LWVudHJ5LXZhbHVlPiBtdXN0IGJlIGEgU3RyaW5nIG9yIGEgY2hhcmFjdGVyIChFSkIgMi4wOiAyMC4yLjEuMikuCi0KLSMgSVdBRDQ4MjguZWpiMjA9SVdBRDQ4MjhXOiBDb252ZW50aW9uYWxseSB0aGlzIHJlZmVyZW5jZSBpcyBsb2NhdGVkIGluIHRoZSAiZWpiIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC4zLjEuMSwgMjIuNSkuCi0jIElXQUQ0ODI5LmVqYjIwPUlXQUQ0ODI5VzogVGhpcyA8ZW52LWVudHJ5PiBzaG91bGQgYmUgaW4gYW4gPGVqYi1yZWY+IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODMwLmVqYjIwPUlXQUQ0ODMwVzogVGhpcyA8ZW52LWVudHJ5PiBzaG91bGQgYmUgaW4gYW4gPGVqYi1sb2NhbC1yZWY+IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODMxLmVqYjIwPUlXQUQ0ODMxVzogPGVqYi1yZWYtdHlwZT4gbXVzdCBiZSB7MH0gKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzMi5lamIyMD1JV0FENDgzMlc6IDxlamItcmVmPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzMuZWpiMjA9SVdBRDQ4MzNXOiA8ZWpiLWxvY2FsLXJlZj4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM0LmVqYjIwPUlXQUQ0ODM0VzogPGhvbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzNS5lamIyMD1JV0FENDgzNVc6IDxsb2NhbC1ob21lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzYuZWpiMjA9SVdBRDQ4MzZXOiA8cmVtb3RlPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzcuZWpiMjA9SVdBRDQ4MzdXOiA8bG9jYWwtcmVtb3RlPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzguZWpiMjA9SVdBRDQ4MzhXOiA8ZWpiLXJlZj4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHswfSAoRUpCIDIuMDogMjAuMy4xLjIpLgotIyBJV0FENDgzOS5lamIyMD1JV0FENDgzOVc6IDxlamItbG9jYWwtcmVmPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gezB9IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODQwLmVqYjIwPUlXQUQ0ODQwVzogPGhvbWU+IHswfSBpcyBub3QgdXNlZCBieSBiZWFuIHsxfSAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODQxLmVqYjIwPUlXQUQ0ODQxVzogPHJlbW90ZT4gezB9IGlzIG5vdCB1c2VkIGJ5IGJlYW4gezF9IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4NDIuZWpiMjA9SVdBRDQ4NDJXOiA8ZWpiLWxpbms+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yKS4KLQotIyBJV0FENDg0My5lamIyMD1JV0FENDg0M1c6IFRoaXMgPGVudi1lbnRyeT4gbXVzdCBiZSBhIDxyZXNvdXJjZS1yZWY+IChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ0LmVqYjIwPUlXQUQ0ODQ0VzogPHJlcy1yZWYtbmFtZT4gc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAiamF2YTpjb20vZW52LyIgc3RyaW5nIChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ1LmVqYjIwPUlXQUQ0ODQ1VzogPHJlcy1hdXRoPiBtdXN0IGJlICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIgKEVKQiAyLjA6IDIwLjQuMS4yKS4KLSMgSVdBRDQ4NDYuZWpiMjA9SVdBRDQ4NDZXOiA8cmVzLXNoYXJpbmctc2NvcGU+IG11c3QgYmUgIlNoYXJlYWJsZSIgb3IgIlVuc2hhcmVhYmxlIiAoRUpCIDIuMDogMjAuNC4xLjIpLgotIyBJV0FENDg0Ny5lamIyMD1JV0FENDg0N1c6IDxyZXNvdXJjZS1yZWY+IG11c3QgYmUgdW5pcXVlIGluIGJlYW4gezB9IChFSkIgMi4wOiAyMC40LjEuMikuCi0KLSMgSVdBRDQ4NDguZWpiMjA9SVdBRDQ4NDhXOiBDb252ZW50aW9uYWxseSB0aGlzIGlzIGxvY2F0ZWQgaW4gdGhlICJqYXZhOmNvbXAvZW52L2pkYmMiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0jIElXQUQ0ODQ5LmVqYjIwPUlXQUQ0ODQ5VzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi9qbXMiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0jIElXQUQ0ODUwLmVqYjIwPUlXQUQ0ODUwVzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi9tYWlsIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotIyBJV0FENDg1MS5lamIyMD1JV0FENDg1MVc6IENvbnZlbnRpb25hbGx5IHRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgImphdmE6Y29tcC9lbnYvdXJsIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotCi0jIElXQUQ0ODUyLmVqYjIwPUlXQUQ0ODUyVzogVGhpcyA8ZW52LWVudHJ5PiBtdXN0IGJlIGEgPHJlc291cmNlLWVudi1yZWY+IChFSkIgMi4wOiAyMC41LjEuMikuCi0jIElXQUQ0ODUzLmVqYjIwPUlXQUQ0ODUzVzogPHJlc291cmNlLWVudi1yZWYtbmFtZT4gc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAiamF2YTpjb21wL2VudiIgc3RyaW5nIChFSkIgMi4wOiAyMC41LjEuMikuCi0jIElXQUQ0ODU0LmVqYjIwPUlXQUQ0ODU0VzogQSBKTVMgRGVzdGluYXRpb24gdmFsdWUgbXVzdCBiZSBlaXRoZXIgamF2YXguam1zLlF1ZXVlIG9yIGphdmF4Lmptcy5Ub3BpYyAoRUpCIDIuMDogMjAuNS4xLjIpLgotIyBJV0FENDg1NS5lamIyMD1JV0FENDg1NVc6IDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+IG11c3QgYmUgdW5pcXVlIGluIGJlYW4gezB9IChFSkIgMi4wOiAyMC41LjEuMikuCi0KLSMgSVdBRDQ4NTYuZWpiMjA9SVdBRDQ4NTZXOiBBIDxyb2xlLW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjIuNS4zKS4KLSMgSVdBRDQ4NTcuZWpiMjA9SVdBRDQ4NTdXOiA8cm9sZS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIGJlYW4gezF9IChFSkIgMi4wOiAyMS4yLjUuMykuCi0jIElXQUQ0ODU4LmVqYjIwPUlXQUQ0ODU4VzogQSA8cm9sZS1uYW1lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjEpLgotIyBJV0FENDg1OS5lamIyMD1JV0FENDg1OVc6IDxyb2xlLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYmVhbiB7MX0gKEVKQiAyLjA6IDIxLjMuMSkuCi0jIElXQUQ0ODYwLmVqYjIwPUlXQUQ0ODYwVzogU2VjdXJpdHkgcm9sZXMgbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4xKS4KLQotIyBJV0FENDkzMS5lamIyMD1JV0FENDkzMVc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiAoRUpCIDIuMDogMjEuMy4yKS4KLSMgSVdBRDQ5MzIuZWpiMjA9SVdBRDQ5MzJXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4yKSAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ5MzMuZWpiMjA9SVdBRDQ5MzNXOiBObyBtZXRob2RzIG9uIHswfSBtYXRjaCB0aGlzIDxtZXRob2Q+IChFSkIgMi4wOiAyMS4zLjIpLgotIyBJV0FENDkzNC5lamIyMD1JV0FENDkzNFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kLXBhcmFtPiBtdXN0IGV4aXN0IGluIGEgPG1ldGhvZC1wYXJhbXM+LgotCi0jIElXQUQ0ODY2LmVqYjIwPUlXQUQ0ODY2VzogQSA8cm9sZS1saW5rPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjMpLgotIyBJV0FENDg2Ny5lamIyMD1JV0FENDg2N1c6IFRoaXMgPHJvbGUtbGluaz4gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMykuCi0jIElXQUQ0ODY4LmVqYjIwPUlXQUQ0ODY4VzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMykuCi0KLSMgSVdBRDQ4NjkuZWpiMjA9SVdBRDQ4NjlXOiA8c2VjdXJpdHktaWRlbnRpdHk+IG11c3QgYmUgZWl0aGVyICJ1c2UtY2FsbGVyLWlkZW50aXR5IiBvciAicnVuLWFzIiAoRUpCIDIuMDogMjEuMy40KS4KLSMgSVdBRDQ4NzAuZWpiMjA9SVdBRDQ4NzBXOiA8c2VjdXJpdHktaWRlbnRpdHk+IG11c3QgYmUgInJ1bi1hcyIgKEVKQiAyLjA6IDIxLjMuNCkuCi0jIElXQUQ0ODcxLmVqYjIwPUlXQUQ0ODcxVzogU2VjdXJpdHkgcm9sZSB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy40LjEpLgotCi0jIElXQUQ0ODc1LmVqYjIwPUlXQUQ0ODc1VzogPHNlc3Npb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc2LmVqYjIwPUlXQUQ0ODc2VzogPHRyYW5zYWN0aW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyICJCZWFuIiBvciAiQ29udGFpbmVyIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc3LmVqYjIwPUlXQUQ0ODc3VzogPHBlcnNpc3RlbmNlLXR5cGU+IG11c3QgYmUgZWl0aGVyICJCZWFuIiBvciAiQ29udGFpbmVyIiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0jIElXQUQ0ODc5LmVqYjIwPUlXQUQ0ODc5VzogQXQgbGVhc3Qgb25lIDxjbXAtZmllbGQ+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotCi0jIElXQUQ0ODgwLmVqYjIwPUlXQUQ0ODgwVzogPGFja25vd2xlZGdlLW1vZGU+IG11c3QgYmUgZWl0aGVyICJBdXRvLWFja25vd2xlZGdlIiBvciAiRHVwcy1vay1hY2tub3dsZWRnZSIgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4MS5lamIyMD1JV0FENDg4MVc6IDxjYXNjYWRlLWRlbGV0ZT4gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4Mi5lamIyMD1JV0FENDg4Mlc6IDxjbXAtdmVyc2lvbj4gbXVzdCBiZSBlaXRoZXIgIjEueCIgb3IgIjIueCIgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4My5lamIyMD1JV0FENDg4M1c6IDxjbXItZmllbGQtbmFtZT4gbXVzdCBleGlzdCBvbiB7MH0gKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4NC5lamIyMD1JV0FENDg4NFc6IDxjbXItZmllbGQtdHlwZT4gbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHswfSAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg1LmVqYjIwPUlXQUQ0ODg1VzogPGNtci1maWVsZC10eXBlPiBtdXN0IGJlIGVpdGhlciBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0IChFSkIgMi4wOiAyMi41KS4KLQotIyBJV0FENDg4Ni5lamIyMD1JV0FENDg4Nlc6IDxjbXItZmllbGQtbmFtZT4gbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg3LmVqYjIwPUlXQUQ0ODg3VzogPGRlc3RpbmF0aW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyIGphdmF4Lmptcy5RdWV1ZSBvciBqYXZheC5qbXMuVG9waWMgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4OS5lamIyMD1JV0FENDg4OVc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4OTAuZWpiMjA9SVdBRDQ4OTBXOiA8ZWpiLXJlZi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBiZWFuIHswfSAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODkxLmVqYjIwPUlXQUQ0ODkxVzogPGVqYi1yZWYtdHlwZT4gbXVzdCBiZSAiRW50aXR5IiBvciAiU2Vzc2lvbiIgKEVKQiAyLjA6IDIyLjUpLgotCi0jIElXQUQ0ODYyLmVqYjIwPUlXQUQ0ODYyVzogPHJlc3VsdC10eXBlLW1hcHBpbmc+IG11c3QgYmUgIlJlbW90ZSIgKEVKQiAyLjA6IDEwLjUuNykuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIDJUQzogZW5kIG9mIG1lc3NhZ2VzIHdoaWNoIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIGVuZCBvZiBtZXNzYWdlcyBmb3IgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbgotIwotCi0jCi0jIGVuZCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0jCi0KLSMKLSMgRW5kIEVKQiBWYWxpZGF0aW9uIHN0cmluZ3MKLSMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL0oyRUVFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vSjJFRUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhZWFlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vSjJFRUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLnhtbGVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FbGVtZW50SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLklFcnJvck1lc3NhZ2VDdXN0b21pemVyOwotCi0vKioKLSAqIEEgSjJFRSBtZXNzYWdlIGN1c3RvbWl6ZXIgZm9yIHRoZSBYTUwgdmFsaWRhdG9yLiBUaGlzIGVycm9yIGN1c3RvbWl6ZXIgd2lsbAotICogY3VzdG9taXplIGVycm9ycyBvbiBhcHBsaWNhdGlvbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRXJyb3JNZXNzYWdlQ3VzdG9taXplciBpbXBsZW1lbnRzIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciNjdXN0b21pemVNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FbGVtZW50SW5mb3JtYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGN1c3RvbWl6ZU1lc3NhZ2UoRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvLCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlpZiAoImN2Yy1jb21wbGV4LXR5cGUuMi40LmEiLmVxdWFscyhlcnJvcktleSkgfHwgImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiLmVxdWFscyhlcnJvcktleSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoImFwcGxpY2F0aW9uIi5lcXVhbHMoZWxlbWVudEluZm8uZ2V0TG9jYWxuYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlib29sZWFuIGFwcGxpY2F0aW9uSGFzTW9kdWxlID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudEluZm8uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJRWxlbWVudEluZm9ybWF0aW9uIGNoaWxkID0gKEVsZW1lbnRJbmZvcm1hdGlvbikgaS5uZXh0KCk7Ci0JCQkJCWlmICgibW9kdWxlIi5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxuYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWFwcGxpY2F0aW9uSGFzTW9kdWxlID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghYXBwbGljYXRpb25IYXNNb2R1bGUpIHsKLQkJCQkJcmV0dXJuIEoyRUVYTUxDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMuSjJFRV9BUFBMSUNBVElPTl9PTkVfT1JfTU9SRV9NT0RVTEVTOwotCQkJCX0KLQkJCX0KLQkJCWlmICgiZWpiLWphciIuZXF1YWxzKGVsZW1lbnRJbmZvLmdldExvY2FsbmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYm9vbGVhbiBlamJIYXNCZWFucyA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRJbmZvLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnRJbmZvcm1hdGlvbiBjaGlsZCA9IChFbGVtZW50SW5mb3JtYXRpb24pIGkubmV4dCgpOwotCQkJCQlpZiAoImVudGVycHJpc2UtYmVhbnMiLmVxdWFscyhjaGlsZC5nZXRMb2NhbG5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZWpiSGFzQmVhbnMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFlamJIYXNCZWFucykgewotCQkJCQlyZXR1cm4gSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcy5FSkJfT05FX09SX01PUkVfQkVBTlM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbGVycm9yY3VzdG9taXphdGlvbi9KMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTgzMzU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbGVycm9yY3VzdG9taXphdGlvbi9KMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKiAvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLnhtbGVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLnhtbGVycm9yY3VzdG9taXphdGlvbi5qMmVleG1sY3VzdG9tdmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9BUFBMSUNBVElPTl9PTkVfT1JfTU9SRV9NT0RVTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQl9PTkVfT1JfTU9SRV9CRUFOUzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEoyRUVYTUxDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL2oyZWV4bWxjdXN0b212YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vajJlZXhtbGN1c3RvbXZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5ZmZhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vajJlZXhtbGN1c3RvbXZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi1KMkVFX0FQUExJQ0FUSU9OX09ORV9PUl9NT1JFX01PRFVMRVMgPSBBIEphdmEgRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBtdXN0IGNvbnRhaW4gb25lIG9yIG1vcmUgbW9kdWxlcy4KLUVKQl9PTkVfT1JfTU9SRV9CRUFOUz1BbiBFSkIgbW9kdWxlIG11c3QgY29udGFpbiBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW5zLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCTVBIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjJiYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCTVBIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFCTVBIb21lVlJ1bGUgZXh0ZW5kcyBBRW50aXR5SG9tZVZSdWxlIHsKLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCWlmKChtZXRob2RUeXBlICYgRklORCkgIT0gRklORCkgewotCQkJc3VwZXIudmFsaWRhdGVNYXRjaGluZ1JldHVyblR5cGVNYXRjaGVzKHZjLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgYmVhbk1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJSmF2YUhlbHBlcnMgaG9tZVJldFR5cGUgPSBob21lTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCUphdmFIZWxwZXJzIGJlYW5SZXRUeXBlID0gYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVSZXRUeXBlLCBiZWFuUmV0VHlwZSkpIHsKLQkJCQkvLyBlbWl0IHRoZSBlcnJvciBvbmx5IGlmIGl0J3MgYSBtdWx0aS1maW5kZXIuIFNpbmdsZS1maW5kZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgb24gdGhlIGhvbWUgJiBiZWFuIGNsYXNzLgotCQkJCWJvb2xlYW4gaG9tZVJldFR5cGVJc1JlbW90ZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVSZXRUeXBlLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCQlib29sZWFuIGhvbWVSZXRUeXBlSXNMb2NhbCA9ICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpKTsKLQkJCQlib29sZWFuIGJlYW5SZXRUeXBlSXNLZXkgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShiZWFuUmV0VHlwZSwgKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpKTsKLQkJCQlpZighKChob21lUmV0VHlwZUlzUmVtb3RlIHx8IGhvbWVSZXRUeXBlSXNMb2NhbCkgJiYgYmVhblJldFR5cGVJc0tleSkpIHsKLQkJCQkJU3RyaW5nIHJldFR5cGVOYW1lID0gbnVsbDsKLQkJCQkJaWYoYmVhblJldFR5cGVJc0tleSkgewotCQkJCQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJCQkJCXJldFR5cGVOYW1lID0gKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUkVNT1RFIDogYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKS5nZXRKYXZhTmFtZSgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmV0VHlwZU5hbWUgPSAoYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0xPQ0FMIDogYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLmdldEphdmFOYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXRUeXBlTmFtZSA9IChiZWFuUmV0VHlwZSA9PSBudWxsKSA/ICI/IiA6IGJlYW5SZXRUeXBlLmdldEphdmFOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJldFR5cGVOYW1lfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWRiYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGxvbmdbXSBCQVNFX1RZUEVTID0gbmV3IGxvbmdbXXtJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUfTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFkgPSBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORzsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLgotCQotCXB1YmxpYyBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gQkFTRV9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRFamJDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIEhFTFBFUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighZm9sbG93QWJzdHJhY3RSdWxlcyhjbGF6eikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighZm9sbG93UHVibGljUnVsZXMoY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKCFmb2xsb3dGaW5hbFJ1bGVzKGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRSZW1vdGVIb21lTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzBdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0TG9jYWxIb21lTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzFdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzJdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0TG9jYWxDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbM107Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbNF07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIEEgYmVhbiBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6Ci0JCS8vICAgIDEuIHJlbW90ZSBob21lCi0JCS8vICAgIDIuIGxvY2FsIGhvbWUKLQkJLy8gICAgMy4gcmVtb3RlIGNvbXBvbmVudAotCQkvLyAgICA0LiBsb2NhbCBjb21wb25lbnQKLQkJLy8gICAgNS4gYmVhbiBjbGFzcyAod2hlbiBzZWFyY2hpbmcgZm9yIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QpLgotCQkvLyBJZiBhIHBhcnRpY3VsYXIgYmVhbiBkb2Vzbid0IHVzZSBhIHJlbW90ZSB2aWV3IG9yIGxvY2FsIHZpZXcsCi0JCS8vIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgbnVsbC4gCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFs1XTsKLQkJSmF2YUNsYXNzIHJlbW90ZUhvbWUgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSByZW1vdGVIb21lLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZSA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKGxvY2FsSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMV0gPSBsb2NhbEhvbWUuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMV0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgcmVtb3RlQ29tcG9uZW50ID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdFsyXSA9IHJlbW90ZUNvbXBvbmVudC5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFsyXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbENvbXBvbmVudCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJaWYobG9jYWxDb21wb25lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0WzNdID0gbG9jYWxDb21wb25lbnQuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbM10gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgIT0gbnVsbCkgewotCQkJcmVzdWx0WzRdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzRdID0gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgYmVhbiBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nRWpiSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCS8vIFNlY3Rpb24gbnVtYmVyIHN0YXRpbmcgdGhpcyBuYW1lIGNvbnZlbnRpb24/Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJLy8gU3RyaXAgdGhlICJlamJIb21lIiBvZmYsIHN0cmlwIG9mZiB0aGUgbmV4dCBjaGFyYWN0ZXIsIGFuZCByZXBsYWNlIHRoYXQgY2hhcmFjdGVyIHdpdGggYSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGF0IGNoYXJhY3RlcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWV0aG9kTmFtZS5jaGFyQXQoMCkpKTsKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg4KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYkNyZWF0ZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfQyk7Ci0JCS8vIFN0cmlwIHRoZSAiZWpiQyIgb2ZmIG9mICJjcmVhdGUiIGFuZCByZXBsYWNlIHdpdGggImMiCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoNCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0MpOwotCQkvLyBTdHJpcCB0aGUgImVqYlBvc3RDIiBvZmYgb2YgImNyZWF0ZSIgYW5kIHJlcGxhY2Ugd2l0aCAiYyIKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg4KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYkZpbmRNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0YpOwotCQkvLyBTdHJpcCB0aGUgImVqYkYiIG9mZiBvZiAiZWpiRmluZCIgYW5kIHJlcGxhY2Ugd2l0aCAiZiIKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JfQotCQotCS8qCi0JICogVGhlIGdpdmVuIG1ldGhvZCBpcyBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gbnVsbDsgLy8gbm90IHN1cHBvc2VkIHRvIGhhdmUgYSBtYXRjaGluZyBtZXRob2QKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dGaW5hbFJ1bGVzKEphdmFDbGFzcyBjbGF6eikgewotCQlpZihzaG91bGRCZUZpbmFsKGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzRmluYWwoKTsKLQkJfQotCQlyZXR1cm4gIWNsYXp6LmlzRmluYWwoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UHVibGljUnVsZXMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmKHNob3VsZEJlUHVibGljKGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzUHVibGljKCk7Ci0JCX0KLQkJcmV0dXJuICFjbGF6ei5pc1B1YmxpYygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dBYnN0cmFjdFJ1bGVzKEphdmFDbGFzcyBjbGF6eikgewotCQlpZihzaG91bGRCZUFic3RyYWN0KGNsYXp6KSkgewotCQkJcmV0dXJuIGNsYXp6LmlzQWJzdHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gIWNsYXp6LmlzQWJzdHJhY3QoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKChyZXRUeXBlID09IG51bGwpIHx8ICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmV0VHlwZSkpKSB7Ci0JCQlTdHJpbmcgcmV0VHlwZU5hbWUgPSAocmV0VHlwZSA9PSBudWxsKSA/IGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKGJlYW4sIG1ldGhvZCkgOiByZXRUeXBlLmdldEphdmFOYW1lKCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117cmV0VHlwZU5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0KLQkJaWYodmFsaWRhdGVFamJDcmVhdGVNZXRob2RFeGNlcHRpb25zKCkpIHsKLQkJCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFamJDcmVhdGVNZXRob2RFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVFamJIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQzMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0KLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJIb21lLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyAiZWpiSG9tZSIgaXMgNyBjaGFyYWN0ZXJzCi0JCS8vIG1ldGhvZCB3aWxsIGZvbGxvdyB0aGUgY29udmVudGlvbiwgImVqYkhvbWUiICsgQ2hhci50b1VwcGVyKDApICsgc3Vic3RyaW5nKDEpLCBzbyByZXZlcnNlIHRoYXQgY29udmVudGlvbiBoZXJlCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1ldGhvZC5nZXROYW1lKCkuY2hhckF0KDcpKSk7IC8vIHB1dCB0aGUgY2hhcmFjdGVyIGJhY2sgaW50byBsb3dlci1jYXNlCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoOCkpOyAvLyBzdWJzdHJpbmcgc3RhcnRzIGF0IHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nICJlamJIb21lIiBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciAtLSBzdWJzdHJpbmcgaXMgMCBpbmRleGVkCi0JCVN0cmluZyBtZXRob2RUb01hdGNoTmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkKLQkJTWV0aG9kIG1hdGNoaW5nUmVtb3RlSG9tZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2RUb01hdGNoTmFtZSwgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaGluZ1JlbW90ZUhvbWVNZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNZXRob2QgbWF0Y2hpbmdMb2NhbEhvbWVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kVG9NYXRjaE5hbWUsIGdldExvY2FsSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaGluZ0xvY2FsSG9tZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQzMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2RUb01hdGNoTmFtZX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDA0OCA9IEJ1c2luZXNzIG1ldGhvZHMgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwMSA9IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxNyA9IFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MTEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNDkgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwMiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzE4ID0gVGhlIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1MCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjAzID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMTkgPSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1MSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwNCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyMCA9IFRoZSBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTIgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFJNSS1JSU9QIHR5cGUuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDUgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFJNSS1JSU9QIHR5cGUuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjEgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0cnVlKTsKLQkJCi0JCS8vIElXQUQ0MDUzID0gVGhpcyBtZXRob2QgY2Fubm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDcuMTAuNCwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA2ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi44LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjIgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4yLjcsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2J1cywgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZU1hdGNoaW5nQ29tcG9uZW50TWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDQwMiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDkyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0NDAzID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDkzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0NDA0ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkKLQkJLy8gSVdBRDQ0MDUgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFtZXRob2QuaXNWb2lkKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNV9lamJSZW1vdmUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgSmF2YUNsYXNzLCBGaWVsZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZEV4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDAyNCA9IEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQwMjUgPSBUcmFuc2llbnQgZmllbGRzIGFyZSBkaXNjb3VyYWdlZC4gUmVhZCBzZWN0aW9uIDcuNC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MTE1ID0gezB9IG11c3Qgbm90IGJlIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gUmVhZCBzZWN0aW9uIDEwLjMuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDI1OSA9IDxjbXAtZmllbGQ+IGZpZWxkIG11c3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTEuMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjYwID0gPGNtci1maWVsZD4gZmllbGQgbXVzdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMS4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpKSB7Ci0JCQl2YWxpZGF0ZVRyYW5zaWVudEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVHJhbnNpZW50RmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQnkgZGVmYXVsdCBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIFNFUklBTFZFUlNJT05VSUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gT1RIRVJfRklFTEQ7Ci0JCX0JCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEphdmFDbGFzcyBtYXRjaGluZ0NsYXp6LCBNZXRob2QgbWF0Y2hpbmdNZXRob2QpIHsKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBvbiB0aGUgYmVhbiBjbGFzcycgbWV0aG9kIG11c3QgYmUgdGhyb3duIG9uIHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2QKLQkJLyogRG9uJ3QgY2hlY2sgZm9yIHRoaXMgaGVyZSAtIGxldCB0aGUgaG9tZSAmIGNvbXBvbmVudCBkbyBpdC4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIG1hdGNoaW5nTWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCX0KLQkJKi8KLQkJCi0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZCBzaG91bGQgYmUgdGhyb3duIG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycwotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRTdWJ0eXBlRXhjZXB0aW9ucyhiZWFuLCBtYXRjaGluZ01ldGhvZCwgbWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQ1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2hpbmdDbGF6ei5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJTWV0aG9kIHJlbW90ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyksIGdldFJlbW90ZUhvbWVNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYocmVtb3RlTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSwgcmVtb3RlTWV0aG9kKTsKLQkJfQotCQkKLQkJTWV0aG9kIGxvY2FsTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSwgZ2V0TG9jYWxIb21lTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGxvY2FsTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpLCBsb2NhbE1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0NvbXBvbmVudE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCU1ldGhvZCByZW1vdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKHJlbW90ZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSwgcmVtb3RlTWV0aG9kKTsKLQkJfQotCQkKLQkJTWV0aG9kIGxvY2FsTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZC5nZXROYW1lKCksIGdldExvY2FsQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGxvY2FsTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCksIGxvY2FsTWV0aG9kKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNFamJPYmplY3QpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEVqYk9iamVjdCA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50RWpiT2JqZWN0ID0gc3VwZXJ0eXBlLmdldEVqYkNsYXNzKCk7Ci0KLQkJCS8vIEVKQk9iamVjdCBhIFhjaGlsZCBvZiBwYXJlbnQgRUpCT2JqZWN0IChYID0gY2hpbGQsIGdyYW5kY2hpbGQsIGdyZWF0LWdyYW5kY2hpbGQsIGV0Yy4pCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzRWpiT2JqZWN0KTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50RWpiT2JqZWN0KTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNFamJPYmplY3QsIHBhcmVudEVqYk9iamVjdCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzRWpiT2JqZWN0LCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIG11c3Qgbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbgotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNNUEhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM0MzhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQ01QSG9tZVZSdWxlIGV4dGVuZHMgQUVudGl0eUhvbWVWUnVsZSB7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCi0JCS8vIENoZWNrIHRoYXQgdGhpcyBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbAotCQkvLyBmaW5kQnlQcmltYXJ5S2V5IGRvZXMgbm90IG5lZWQgYSBxdWVyeSBlbGVtZW50ICgxMC41LjYpCi0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOREJZUFJJTUFSWUtFWSkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzb2NpYXRlZFdpdGhRdWVyeShjbXAsIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpbmRNYXRjaGluZ01ldGhvZChsb25nIG1ldGhvZFR5cGUpIHsKLQkJaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5maW5kTWF0Y2hpbmdNZXRob2QobWV0aG9kVHlwZSk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuZWpiLmVqYjIwLnJ1bGVzLmltcGwuQUhvbWVWUnVsZSNyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgTWV0aG9kKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldHVybnNDb21wb25lbnRJbnRlcmZhY2VPckNvbGxlY3Rpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIHJldHVyblBhcm0gPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5QYXJtLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQlpZigobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpIHsKLQkJCXN1cGVyLnZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyh2YywgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIGJlYW5NZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQl9Ci0JCS8vIGRvIG5vdCB2YWxpZGF0ZSB0aGUgcmV0dXJuIHR5cGUgb2YgZmluZCBtZXRob2RzIGJlY2F1c2UgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgYmVhbiBjbGFzcwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyYWVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBSW50ZXJmYWNlVHlwZVZSdWxlIHsKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYoKGlzUmVtb3RlKCkgJiBSRU1PVEUpID09IFJFTU9URSkgewotCQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldERlZmF1bHRNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gQlVTSU5FU1M7Ci0JfQotCQotCXB1YmxpYyBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFmb2xsb3dSTUlfSUlPUEluaGVyaXRhbmNlUnVsZXMoYmVhbiwgY2xhenopKSB7Ci0JCQkvLyBJV0FENDA1NyA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiA3LjEwLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjEwID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzMjYgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsgLy8gY2hlY2sgYXBwbGljYXRpb24gZXhjZXB0aW9ucwotCQkKLQkJaWYoaXNFSkJJbnRlcmZhY2VNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJLy8gSVdBRDQwMjEgPSB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci4gUmVhZCBzZWN0aW9uIDYuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxMTAgPSB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci4gUmVhZCBzZWN0aW9uIDkuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxMTIgPSB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci4gUmVhZCBzZWN0aW9uIDkuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJTWV0aG9kIG1hdGNoID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZC5nZXROYW1lKCksIGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaCA9PSBudWxsKSB7Ci0JCQkvLyBJV0FENDA1OCA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2lhdGlvbi4KLQkJCS8vIElXQUQ0MDcwID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gNy4xMC43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMyNyA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzNTQgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiAxMi4yLjEwIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIxMSA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMjcgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiAxMC42LjExIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIG1hdGNoLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCQkvLyBJV0FENDIxMiA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgYXMgezB9LiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJLy8gSVdBRDQyMjggPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgc2FtZSB0eXBlIGFzIHswfS4gUmVhZCBzZWN0aW9uIDEwLjYuMTEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkvLyBJV0FENDMyOCA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgYXMgezB9IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCS8vIElXQUQ0MzU1ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9LiBSZWFkIHNlY3Rpb24gMTIuMi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWF0Y2guZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJCi0JCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1hdGNoLCBtZXRob2QpOwotCQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWVpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDcxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpLCBtYXRjaC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJLy8gSVdBRDQwNTYgPSBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQwNjkgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiA3LjEwLjcsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzMjUgPSBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzNTMgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4yLjEwLCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjA5ID0gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC42Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19idXMsIGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MDU1ID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwOCA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMC42Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjQgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0cnVlKTsKLQkJCi0JCUphdmFIZWxwZXJzIG9lID0gZ2V0T3ZlckV4cG9zZWRMb2NhbFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmKG9lICE9IG51bGwpIHsKLQkJCS8vIElXQUQ0MDU5ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxMDcgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gOS43LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzMwID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxMjggPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTAuMy4xLCAxMC4zLjEwLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtvZS5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc0NvbXBvbmVudCkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRDb21wb25lbnQgPSBnZXRDb21wb25lbnRJbnRlcmZhY2Uoc3VwZXJ0eXBlKTsKLQotCQkJaWYocGFyZW50Q29tcG9uZW50ID09IG51bGwpIHsKLQkJCQkvLyBjaGlsZCB1c2VzIGVpdGhlciBsb2NhbCwgb3IgcmVtb3RlLCBidXQgbm90IGJvdGggaW50ZXJmYWNlcwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gQ29tcG9uZW50IGEgWGNoaWxkIG9mIHBhcmVudCBDb21wb25lbnQKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNDb21wb25lbnQpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRDb21wb25lbnQpOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0NvbXBvbmVudCwgcGFyZW50Q29tcG9uZW50KSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc0NvbXBvbmVudC5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudENvbXBvbmVudC5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNDb21wb25lbnQsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIHN1cGVydHlwZSwgcGFyZW50Q29tcG9uZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTIxOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlCZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBRW50aXR5QmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBQmVhbkNsYXNzVlJ1bGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtaXNzaW5nTWV0aG9kVGVtcGxhdGUgPSAiezB9KHsxfSkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkKLQkJdmFsaWRhdGVNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1hdGNoaW5nTWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUgKyBtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg5KTsgLy8gImVqYkNyZWF0ZSIgaXMgOSBjaGFyYWN0ZXJzIGxvbmcsIHNvIHN0cmlwIG9mZiBjaGFyYWN0ZXJzIDAuLjggaW5jbHVzaXZlCi0JCU1ldGhvZCBlamJQb3N0Q3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1hdGNoaW5nTWV0aG9kTmFtZSwgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKGVqYlBvc3RDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1pc3NpbmdNZXRob2QgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChtaXNzaW5nTWV0aG9kVGVtcGxhdGUsIG5ldyBTdHJpbmdbXXttYXRjaGluZ01ldGhvZE5hbWUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRQYXJtc0FzU3RyaW5nKG1ldGhvZCl9KTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttaXNzaW5nTWV0aG9kfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5SG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGNhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUVudGl0eUhvbWVWUnVsZSBleHRlbmRzIEFIb21lVlJ1bGUgewotCS8qKgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgaXNuJ3QgbGlzdGVkIGluIHRoZSBLTk9XTl9NRVRIT0RTLCB3aGF0IHR5cGUgb2YgbWV0aG9kIGlzIGl0Ci0JICogY29uc2lkZXJlZCB0byBiZT8KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIEhPTUU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUphdmFDbGFzcyBrZXkgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJaWYoKHBhcm1zLmxlbmd0aCAhPSAxKSB8fCAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGtleSwgcGFybXNbMF0uZ2V0SmF2YVR5cGUoKSkpKSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IChrZXkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBrZXkuZ2V0SmF2YU5hbWUoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtrZXlOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzRmluZGVyRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCXZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQlpZighcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQlKYXZhQ2xhc3MgY29tcG9uZW50SW50ZXJmYWNlID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pOwotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQkJCWlmKGNvbXBvbmVudEludGVyZmFjZSAhPSBudWxsKSB7Ci0JCQkJCWNsYXNzTmFtZSA9IGNvbXBvbmVudEludGVyZmFjZS5nZXRKYXZhTmFtZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTDsKLQkJCQkJfQotCQkJCX0KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2NsYXNzTmFtZX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2dldENvbXBvbmVudEludGVyZmFjZShiZWFuKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSG9tZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM1MCA9IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiB7MH0uIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gdGhlICJ2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkgbWV0aG9kLgotCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDYyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9SRU1PVkUpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWRmYzQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUhvbWVWUnVsZSBleHRlbmRzIEFJbnRlcmZhY2VUeXBlVlJ1bGUgewotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZigoaXNSZW1vdGUoKSAmIFJFTU9URSkgPT0gUkVNT1RFKSB7Ci0JCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBCeSBkZWZhdWx0LCBkbyBub3RoaW5nLgotCQkvLyBMZXQgdGhlIGVudGl0eSBydWxlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYW5kIHRoZSBzZXNzaW9uIGRvbid0IGRvIGFueXRoaW5nCi0JCS8vIGJlY2F1c2UgdmFsaWRhdGVNZXRob2RNdXN0Tm90RXhpc3QgZG9lcyB3aGF0IHRoZSBzZXNzaW9ucyBuZWVkLgkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGZvbGxvd3NDcmVhdGVFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUEluaGVyaXRhbmNlKGNsYXp6KSkgewotCQkJLy8gSVdBRDQzMzQgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gMTIuMi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIxNyA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMC42LjEwIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDA2MiA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiA3LjEwLjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOyAvLyBjaGVjayBhcHBsaWNhdGlvbiBleGNlcHRpb25zCi0JCQotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQlTdHJpbmcgbmFtZU9mTWV0aG9kVG9GaW5kID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJYm9vbGVhbiB2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzID0gZmFsc2U7Ci0JCWlmKChtZXRob2RUeXBlICYgQ1JFQVRFKSA9PSBDUkVBVEUpIHsKLQkJCXZhbGlkYXRlQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJDKTsKLQkJCS8vIFN0cmlwIHRoZSAiYyIgb2ZmIG9mICJjcmVhdGUiIGFuZCByZXBsYWNlIHdpdGggImVqYkMiCi0JCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJCW5hbWVPZk1ldGhvZFRvRmluZCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSA9PSBGSU5EKSB7Ci0JCQl2YWxpZGF0ZUZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGKTsKLQkJCS8vIFN0cmlwIHRoZSAiZiIgb2ZmIG9mICJmaW5kIiBhbmQgcmVwbGFjZSB3aXRoICJlamJGIgotCQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKSk7Ci0JCQluYW1lT2ZNZXRob2RUb0ZpbmQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcyA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEhPTUUpID09IEhPTUUpIHsKLQkJCS8vIHJlbW92ZSBpcyBhIHNwZWNpYWwgbWV0aG9kLiBTZWUgOS41LjMgZm9yIGFuIGV4YW1wbGUKLQkKLQkJCXZhbGlkYXRlSG9tZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQkKLQkJCS8vIFNlY3Rpb24gbnVtYmVyIHN0YXRpbmcgdGhpcyBuYW1lIGNvbnZlbnRpb24/Ci0JCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkhPTUUpOwotCQkJYnVmZmVyLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UobWV0aG9kTmFtZS5jaGFyQXQoMCkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQkJbmFtZU9mTWV0aG9kVG9GaW5kID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkKLQkJCXZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIHNob3VsZG4ndCBiZSBoZXJlLiBBVHlwZVZSdWxlIHdpbGwgY2F0Y2guCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWV0aG9kVHlwZSBtVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkJaWYobVR5cGUgPT0gbnVsbCkgewotCQkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiQUhvbWVWUnVsZSAtIHZhbGlkYXRlIG1ldGhvZCB3aGljaCBtdXN0IG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIk1ldGhvZCB0eXBlIGlzIG51bGw6ICIgKyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkgKyAiOjoiICsgbWV0aG9kLmdldE5hbWUoKSApOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCksIGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsICgobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpKTsgLy8gZG8gbm90IGNoZWNrIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIGEgZmluZCBtZXRob2QgaXMgc2VyaWFsaXphYmxlLiBJZiBpdCdzIENvbGxlY3Rpb24gb3IgU2V0IGl0IHdvbid0IGJlIHNlcmlhbGl6YWJsZSwgYW5kIGlmIGl0IGRvZXNuJ3QgcmV0dXJuIENvbGxlY3Rpb24sIFNldCwgb3IgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdGhlbiB0aGUgcmV0dXJuIHR5cGUgd2lsbCBiZSBmbGFnZ2VkLgotCQkKLQkJSmF2YUhlbHBlcnMgbG9jYWwgPSBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYobG9jYWwgIT0gbnVsbCkgewotCQkJLy8gSVdBRDQwMjMgPSB7MH0gY2Fubm90IGJlIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlLiBSZWFkIHNlY3Rpb24gNi43LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjI1ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDEwLjYuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzUxID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2xvY2FsLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoZmluZE1hdGNoaW5nTWV0aG9kKG1ldGhvZFR5cGUpKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nQmVhbk1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmFtZU9mTWV0aG9kVG9GaW5kLCB2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZmluZE1hdGNoaW5nTWV0aG9kKGxvbmcgbWV0aG9kVHlwZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5NZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIFN0cmluZyBuYW1lT2ZNZXRob2RUb0ZpbmQsIGJvb2xlYW4gdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcywgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1hdGNoID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG5hbWVPZk1ldGhvZFRvRmluZCwgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKG1hdGNoID09IG51bGwpIHsKLQkJCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQlpZihtVHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gb29wcwotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBSG9tZVZSdWxlIC0gdmFsaWRhdGUgbWV0aG9kIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIGJlYW4uZ2V0TmFtZSgpICsgIjo6IiArIGNsYXp6LmdldEphdmFOYW1lKCkgKyAiOjoiICsgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQkJCVN0cmluZyBiZWFuQ2xhc3NOYW1lID0gKGJlYW5DbGFzcyA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9CRUFOX0NMQVNTIDogYmVhbkNsYXNzLmdldEphdmFOYW1lKCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtVHlwZS5nZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde25hbWVPZk1ldGhvZFRvRmluZCwgYmVhbkNsYXNzTmFtZX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZih2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzKSB7Ci0JCQkJdmFsaWRhdGVNYXRjaGluZ1JldHVyblR5cGVNYXRjaGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtYXRjaCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJfQotCi0JCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1hdGNoLCBtZXRob2QpOwotCQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWVpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpLCBtYXRjaC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTWV0aG9kKSB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lTWV0aG9kLmdldFJldHVyblR5cGUoKSwgYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW117YmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFmb2xsb3dzQ3JlYXRlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCUphdmFDbGFzcyBjb21wb25lbnRJbnRlcmZhY2UgPSBnZXRDb21wb25lbnRJbnRlcmZhY2UoYmVhbik7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQkJCWlmKGNvbXBvbmVudEludGVyZmFjZSAhPSBudWxsKSB7Ci0JCQkJY2xhc3NOYW1lID0gY29tcG9uZW50SW50ZXJmYWNlLmdldEphdmFOYW1lKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZigoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljbGFzc05hbWUgPSBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfTE9DQUw7Ci0JCQkJfQotCQkJfQotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117Y2xhc3NOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSG9tZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM1MCA9IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiB7MH0uIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gdGhlICJ2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkgbWV0aG9kLgotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldHVybnNDb21wb25lbnRJbnRlcmZhY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJSmF2YUNsYXNzIGNvbXBvbmVudEludGVyZmFjZSA9IGdldENvbXBvbmVudEludGVyZmFjZShiZWFuKTsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGNvbXBvbmVudEludGVyZmFjZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHJldHVybnNDb21wb25lbnRJbnRlcmZhY2VPckNvbGxlY3Rpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIHJldHVyblBhcm0gPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlKYXZhSGVscGVycyBqYXZhVXRpbEVudW1lcmF0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbik7Ci0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblBhcm0sIGphdmFVdGlsRW51bWVyYXRpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuUGFybSwgamF2YVV0aWxDb2xsZWN0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzSG9tZSkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJLy8gYmVhbiBoYXMgbm8gc3VwZXJ0eXBlCi0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50SG9tZSA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgdGhpcyBDTVAncyBzdXBlcnR5cGUKLQkJCXBhcmVudEhvbWUgPSBnZXRIb21lSW50ZXJmYWNlKHN1cGVydHlwZSk7Ci0KLQkJCWlmKHBhcmVudEhvbWUgPT0gbnVsbCkgewotCQkJCS8vIGNoaWxkIHVzZXMgZWl0aGVyIGxvY2FsLCBvciByZW1vdGUsIGJ1dCBub3QgYm90aCBpbnRlcmZhY2VzCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBIb21lIGEgWGNoaWxkIG9mIHBhcmVudCBIb21lCi0JCQkvLyBJbiBvdXIgRUpCIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUsIHdoaWxlIGl0IGlzIGxlZ2FsIGZvcgotCQkJLy8gYSBob21lIHRvIGluaGVyaXQgZnJvbSBhbm90aGVyIGhvbWUsIChzZWN0aW9uIEIuMiksIGl0IGlzIG5vdCBsZWdhbAotCQkJLy8gZm9yIFdTQSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLiAKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNIb21lKTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50SG9tZSk7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNIb21lLCBwYXJlbnRIb21lKSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc0hvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRIb21lLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0hvbWUsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIHN1cGVydHlwZSwgcGFyZW50SG9tZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FJbnRlcmZhY2VUeXBlVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSW50ZXJmYWNlVHlwZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDc5MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FJbnRlcmZhY2VUeXBlVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKgotICogVGhpcyBjbGFzcyBpcyBhIGhhY2sgYXJvdW5kIHRoZSBKYXZhIGxhY2sgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0gKiBBbGwgaWYgc3RhdGVtZW50cyB3aGljaCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgd291bGQgbm9ybWFsbHkgcmVwbGFjZQotICogYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUludGVyZmFjZVR5cGVWUnVsZSBleHRlbmRzIEFUeXBlVlJ1bGUgaW1wbGVtZW50cyBJRUpCSW50ZXJmYWNlVHlwZSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFswXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBIGhvbWUgb3IgY29tcG9uZW50IGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gYmVhbiBjbGFzcwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJcmVzdWx0WzBdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBob21lIG9yIGNvbXBvbmVudCdzIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlQXBwbGljYXRpb25FeGNlcHRpb25SdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRUpCSW50ZXJmYWNlTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlsb25nW10gc3VwZXJUeXBlcyA9IGdldFN1cGVydHlwZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8c3VwZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYoQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5pc0NsYXNzVHlwZShiZWFuLCBtZXRob2QuZ2V0SmF2YUNsYXNzKCksIHN1cGVyVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0T3ZlckV4cG9zZWRMb2NhbFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCS8vIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbWV0aG9kIGRvZXNuJ3QgZXhwb3NlIGFueSBvZiB0aGUgbG9jYWwgdHlwZXMgb2YgdGhlIGJlYW4KLQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJCWlmKHBhcm1zICE9IG51bGwpIHsKLQkJCQlmb3IoaW50IGk9MDsgaTxwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSBwYXJtc1tpXTsKLQkJCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTG9jYWxUeXBlKGJlYW4sIHBhcm0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQkJCXJldHVybiBwYXJtLmdldEphdmFUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE5vdyBjaGVjayB0aGUgcmV0dXJuIHR5cGUKLQkJCUphdmFIZWxwZXJzIHBhcm0gPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTG9jYWxUeXBlKGJlYW4sIHBhcm0pKSB7Ci0JCQkJcmV0dXJuIHBhcm07Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZihmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBTRVJJQUxWRVJTSU9OVUlEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE9USEVSX0ZJRUxEOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uICB7Ci0JCUxpc3QgZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElXQUQ0NDE5ID0gezB9IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBqYXZhLmxhbmcuRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTguMS4xLCAxOC4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBqYXZhTGFuZ0V4Y2VwdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfRVhDRVBUSU9OLCBiZWFuKTsKLQkJCUphdmFIZWxwZXJzIGphdmFMYW5nUnVudGltZUV4Y2VwdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTiwgYmVhbik7Ci0JCQkKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXBwbGljYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uLCBiZWFuKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGV4Y2VwdGlvbiwgamF2YUxhbmdFeGNlcHRpb24pKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQotCQkJCQkvLyBubyBwb2ludCBjaGVja2luZyB0aGUgcmVzdAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gSVdBRDQ0MjAgPSB7MH0gbXVzdCBub3QgYmUgYSBzdWJjbGFzcyBvZiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDE4LjEuMSwgMTguMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBqYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24pKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQxNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIHZjLmFkZE1lc3NhZ2UoIkNhbm5vdCB2YWxpZGF0ZSBleGNlcHRpb25zIGJlY2F1c2UgdGhlIHswfSB0eXBlIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguIik7Ci0JCQkvLyBEb24ndCBhZGQgYW55IG1lc3NhZ2Ugb3RoZXIgdGhhbiB0aGUgImNhbm5vdCB2YWxpZGF0ZSIgbWVzc2FnZS4KLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BS2V5Q2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODQwNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBsb25nW10gQkFTRV9UWVBFUyA9IG5ldyBsb25nW117SVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVH07Ci0JCi0JcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBCQVNFX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBtZXRob2QgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzIAotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGtleSBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIENIS0oyMTA4ID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gOS44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIENIS0oyMjQxID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTAuNi4xMyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBDSEtKMjM3NiA9IHswfSBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEyLjIuMTIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQlyZXR1cm4gU0VSSUFMVkVSU0lPTlVJRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBPVEhFUl9GSUVMRDsKLQkJfQkKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBOT19NRVRIT0RTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQkvLyBEb2Vzbid0IG1hdHRlciBpZiB0aGUga2V5IGNsYXNzIHRocm93cyBSZW1vdGVFeGNlcHRpb24gb3Igbm90Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDAwNWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBQmVhbkNsYXNzVlJ1bGUgewotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlVHJhbnNpZW50RmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoZmllbGQuaXNUcmFuc2llbnQoKSkgewotCQkJLy8gSVdBRDQwMjUgPSBUcmFuc2llbnQgZmllbGRzIGFyZSBkaXNjb3VyYWdlZC4gUmVhZCBzZWN0aW9uIDcuNC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCi0JCQlKYXZhSGVscGVycyBqYXZheEVqYlNlc3Npb25Db250ZXh0ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQ09OVEVYVCwgYmVhbik7Ci0JCQlKYXZhSGVscGVycyBqYXZheFRyYW5zYWN0aW9uVXNlcnRyYW5zYWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX1RSQU5TQUNUSU9OX1VTRVJUUkFOU0FDVElPTiwgYmVhbik7Ci0JCQlKYXZhSGVscGVycyBqYXZheE5hbWluZ0NvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfTkFNSU5HX0NPTlRFWFQsIGJlYW4pOwotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCBqYXZheEVqYlNlc3Npb25Db250ZXh0KSB8fAotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgamF2YXhUcmFuc2FjdGlvblVzZXJ0cmFuc2FjdGlvbikgfHwKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpKSB8fAotCQkJCS8vVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSk5ESU5hbWluZ0NvbnRleHQoZmllbGQpKQotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgamF2YXhOYW1pbmdDb250ZXh0KSkKLQkJCXsKLQkJCQkvLyBJV0FENDAyNCA9IEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwkJCi0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTllZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU2Vzc2lvbkhvbWVWUnVsZSBleHRlbmRzIEFIb21lVlJ1bGUgewotCS8qKgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgaXNuJ3QgbGlzdGVkIGluIHRoZSBLTk9XTl9NRVRIT0RTLCB3aGF0IHR5cGUgb2YgbWV0aG9kIGlzIGl0Ci0JICogY29uc2lkZXJlZCB0byBiZT8KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJLy8gSWYgaXQncyBub3QgYSBjcmVhdGUgbWV0aG9kLCB0aGVuIGl0IHNob3VsZG4ndCBiZSB0aGVyZS4KLQkJcmV0dXJuIEVYQ0xVREVEX01FVEhPRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTdGF0ZWxlc3NIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmOGI4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVN0YXRlbGVzc0hvbWVWUnVsZSBleHRlbmRzIEFTZXNzaW9uSG9tZVZSdWxlIHsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBjcmVhdGUoKSBtZXRob2QuCi0JCWlmKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoICE9IDApIHx8ICghSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci52YWxpZGF0ZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMzNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVHlwZVZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSUNsYXNzVlJ1bGUsIElFSkJUeXBlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fRklFTERTID0gMDsKLQotCXByaXZhdGUgbG9uZyBfbWV0aG9kTGlzdCA9IE5PX01FVEhPRFM7Ci0JcHJpdmF0ZSBsb25nIF9maWVsZExpc3QgPSBOT19GSUVMRFM7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMuc3VidGFzayhJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLlNUQVRVU19WQUxJREFUSU5HLCBuZXcgU3RyaW5nW117KChKYXZhQ2xhc3MpIHRhcmdldCkuZ2V0SmF2YU5hbWUoKX0pOwotCi0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjo6dmFsaWRhdGUoIiArIHRhcmdldFBhcmVudCArICIsICIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKSB0YXJnZXRQYXJlbnQ7Ci0JCQlKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKSB0YXJnZXQ7Ci0KLQkJCXRyeSB7Ci0JCQkJLy9jbGVhbiB1cCBvbGQgcmVmbGVjdGlvbiBlcnJvciBvbiB0aGUgY2xhenogdGhhdCBpcyBnZXR0aW5nIHZhbGlkYXRlZAotCQkJCXZjLnJlbW92ZU1lc3NhZ2VzKGNsYXp6KTsKLQkJCQkvLyBDaGVjayB0aGF0IGFsbCBvZiB0aGUgdHlwZXMgaW4gdGhlIGJlYW4gcmVmbGVjdGVkIGNvcnJlY3RseSwKLQkJCQkvLyBhbmQgdGhhdCB0aGUgdHlwZXMnIHBhcmVudHMgcmVmbGVjdGVkIGNvcnJlY3RseSB0b28uCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGNsYXp6KTsKLQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlyZWZsZWN0aW9uRXJyb3IodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCQlMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCA9IGdldE1ldGhvZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgY2xhenoubGlzdE1ldGhvZEV4dGVuZGVkKCksIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCQlMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0ID0gZ2V0RmllbGRzRXh0ZW5kZWQodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGNsYXp6Lmxpc3RGaWVsZEV4dGVuZGVkKCksIGZpZWxkc0V4dGVuZGVkTGlzdCk7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCXZhbGlkYXRlU3VwZXJ0eXBlcyh2YywgYmVhbiwgY2xhenopOwotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCQl2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdCh2YywgYmVhbiwgY2xhenopOwotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJcmVmbGVjdGlvbkVycm9yKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotCQkJLy8gcmVtb3ZlIGFueSBleGlzdGluZyBtZXNzYWdlcyBzaW5jZSB0aGV5IG1heSBiZSBmYXVsdHkKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZFtdIGZpZWxkcywgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCQlmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIGZpZWxkcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJBIGZpZWxkIGlzIG51bGwgb24gIiArIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBmaWVsZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiVmFsaWRhdGluZyBmaWVsZCAiICsgZmllbGQuZ2V0TmFtZSgpICsgIm9uIGNsYXp6ICIgKyBjbGF6eiArICIgYW5kIGlzVmFsaWQgcmV0dXJucyAiICsgaXNWYWxpZChiZWFuLCBjbGF6eiwgZmllbGQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJfQotCi0JCQkJCWlmIChpc1ZhbGlkKGJlYW4sIGNsYXp6LCBmaWVsZCkpIHsKLQkJCQkJCXJlZ2lzdGVyKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQl9IGNhdGNoIChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotCQkJLy8gcmVtb3ZlIGFueSBleGlzdGluZyBtZXNzYWdlcyBzaW5jZSB0aGV5IG1heSBiZSBmYXVsdHkKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChpc093bmVkQnlCYXNlKGJlYW4sIG1ldGhvZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiAoKGdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpICYgRVhDTFVERURfTUVUSE9EKSAhPSBFWENMVURFRF9NRVRIT0QpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzT3duZWRCeUJhc2UoRW50ZXJwcmlzZUJlYW4gYmVhbiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJbG9uZ1tdIGJhc2VUeXBlcyA9IGdldEJhc2VUeXBlcygpOwotCQlpZiAoYmFzZVR5cGVzID09IG51bGwpIHsKLQkJCS8vIG5vIHBhcmVudHMKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5pc0NsYXNzVHlwZShiZWFuLCBmaWVsZC5nZXRKYXZhQ2xhc3MoKSwgYmFzZVR5cGVzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc093bmVkQnlCYXNlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWxvbmdbXSBiYXNlVHlwZXMgPSBnZXRCYXNlVHlwZXMoKTsKLQkJaWYgKGJhc2VUeXBlcyA9PSBudWxsKSB7Ci0JCQkvLyBubyBwYXJlbnRzCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKENsYXNzVXRpbGl0eS5nZXRVdGlsaXR5KCkuaXNDbGFzc1R5cGUoYmVhbiwgbWV0aG9kLmdldEphdmFDbGFzcygpLCBiYXNlVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChpc093bmVkQnlCYXNlKGJlYW4sIGZpZWxkKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuICgoZ2V0RmllbGRUeXBlKGJlYW4sIGNsYXp6LCBmaWVsZCkgJiBFWENMVURFRF9GSUVMRCkgIT0gRVhDTFVERURfRklFTEQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2RbXSBtZXRob2RzLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCQltZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJCQkvLyBObyBwb2ludCBhZGRpbmcgYSB2YWxpZGF0aW9uIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHVzZXIgY2FuJ3QgZG8gYW55dGhpbmcuCi0JCQkJCS8vIExvZyB0aGlzIGNvbmRpdGlvbi4KLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBtZXRob2RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIk9uICIgKyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkgKyAiLCB0aGVyZSBpcyBhIG51bGwgbWV0aG9kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBtZXRob2RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIlZhbGlkYXRpbmcgbWV0aG9kICIgKyBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpICsgIiBvbiBjbGF6eiAiICsgY2xhenogKyAiIGFuZCBpc1ZhbGlkIHJldHVybnMgIiArIGlzVmFsaWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJfQotCi0JCQkJCWlmIChpc1ZhbGlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgewotCQkJCQkJcmVnaXN0ZXIodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJCWlmIChpc01ldGhvZEFsbG93ZWRUb0V4aXN0KGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgewotCQkJCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXZhbGlkYXRlTWV0aG9kV2hpY2hNdXN0Tm90RXhpc3QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghaXNPd25lZEJ5QmFzZShiZWFuLCBtZXRob2QpKSB7Ci0JCQkJCQkJaWYgKChNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpICYgRVhDTFVERURfTUVUSE9EKSA9PSBFWENMVURFRF9NRVRIT0QpIHsKLQkJCQkJCQkJLy8gdW5pZGVudGlmaWVkIG1ldGhvZCBleGNsdWRlZAotCQkJCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWV0aG9kLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyByZW1vdmUgYW55IGV4aXN0aW5nIG1lc3NhZ2VzIHNpbmNlIHRoZXkgbWF5IGJlIGZhdWx0eQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlfZmllbGRMaXN0ID0gKF9maWVsZExpc3QgfCBnZXRGaWVsZFR5cGUoYmVhbiwgY2xhenosIGZpZWxkKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdENvbnN0cnVjdG9yKGxvbmcgbWV0aG9kVHlwZSkgewotCQlyZXR1cm4gKChtZXRob2RUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvZXNQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JFeGlzdCgpIHsKLQkJaWYgKChfbWV0aG9kTGlzdCAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUl9OT1BBUk0pID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUl9OT1BBUk0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3Rvckluc2VydGVkQnlDb21waWxlcigpIHsKLQkJLy8gSWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGluIHRoZSBsaXN0LCBhbmQgaWYgdGhlcmUgYXJlIG5vIGNvbnN0cnVjdG9ycywKLQkJLy8gdGhlIEphdmEgY29tcGlsZXIgd2lsbCBpbnNlcnQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCQlpZiAoKF9tZXRob2RMaXN0ICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1IpIHsKLQkJCS8vIFRoZXJlIGlzIGEgY29uc3RydWN0b3IsIHNvIHJldHVybiBmYWxzZS4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzTWV0aG9kQWxsb3dlZFRvRXhpc3QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJbG9uZ1tdIG1ldGhvZHMgPSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKTsKLQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbG9uZyBtZXRob2RUeXBlID0gbWV0aG9kc1tpXTsKLQkJCQlsb25nIGV4aXN0aW5nTWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQkJaWYgKChleGlzdGluZ01ldGhvZFR5cGUgJiBtZXRob2RUeXBlKSA9PSBtZXRob2RUeXBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0RXhpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nW10gbWV0aG9kcyA9IGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpOwotCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlsb25nIG1ldGhvZFR5cGUgPSBtZXRob2RzW2ldOwotCQkJCWJvb2xlYW4gZW1pdFdhcm5pbmcgPSBmYWxzZTsKLQkJCQlpZiAoaXNEZWZhdWx0Q29uc3RydWN0b3IobWV0aG9kVHlwZSkpIHsKLQkJCQkJaWYgKCFkb2VzUHVibGljRGVmYXVsdENvbnN0cnVjdG9yRXhpc3QoKSAmJiAhaXNEZWZhdWx0Q29uc3RydWN0b3JJbnNlcnRlZEJ5Q29tcGlsZXIoKSkgewotCQkJCQkJZW1pdFdhcm5pbmcgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW1pdFdhcm5pbmcgPSAhZXhpc3RzKG1ldGhvZFR5cGUpOwotCQkJCX0KLQotCQkJCWlmIChlbWl0V2FybmluZykgewotCQkJCQkvLyBJV0FENDA0MSA9IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgbm8KLQkJCQkJLy8gcGFyYW1ldGVycy4gUmVhZCBzZWN0aW9uIDcuMTAuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDE0MiA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTAuNS4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MTczID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC42LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQyNzEgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEyLjEuNC4xIG9mIHRoZSBFSkIgMi4wCi0JCQkJCS8vIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MjkwID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMi4yLjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQzODggPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDE1LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQlJTWV0aG9kVHlwZSBtVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUobWV0aG9kVHlwZSk7Ci0JCQkJCWlmIChtVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyB1bW1tbS4uLi5vb3BzLiBUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBtZXRob2RzIHdoaWNoIG11c3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVudHJ5LnNldFRleHQoIk1ldGhvZCB0eXBlIGlzIG51bGw6ICIgKyBtZXRob2RUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtVHlwZS5nZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117bVR5cGUuZ2V0TWV0aG9kTmFtZShiZWFuLCBjbGF6eiwgbnVsbCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1ldGhvZFdoaWNoTXVzdE5vdEV4aXN0KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJTWV0aG9kVHlwZSBtVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQlpZiAobVR5cGUgPT0gbnVsbCkgewotCQkJLy8gd2hhdCBoYXBwZW5lZD8KLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBtZXRob2Qgd2hpY2ggbXVzdCBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoIk1ldGhvZCB0eXBlIGlzIG51bGw6ICIgKyBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbVR5cGUuZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttVHlwZS5nZXRNZXRob2ROYW1lKGJlYW4sIGNsYXp6LCBtZXRob2QpfSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpOwotCi0JcHVibGljIGFic3RyYWN0IGxvbmdbXSBnZXRCYXNlVHlwZXMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCk7IC8vIGlzIGEgbWlzc2luZyAob3IgcHJlc2VudCkKLQkJCQkJCQkJCQkJCQkJCSAvLyBSZW1vdGVFeGNlcHRpb24gYSB3YXJuaW5nIG9yIGFuCi0JCQkJCQkJCQkJCQkJCQkgLy8gZXJyb3I/IFNlZSBJTG9jYWxUeXBlIGFuZAotCQkJCQkJCQkJCQkJCQkJIC8vIElSZW1vdGVUeXBlLgotCi0JcHVibGljIGZpbmFsIGxvbmcgZ2V0TWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX01FVEhPRDsKLQkJfQotCQlsb25nIGlkID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQlpZiAoKGlkICYgQ0xJTklUKSA9PSBDTElOSVQpIHsKLQkJCXJldHVybiBFWENMVURFRF9NRVRIT0Q7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCV9tZXRob2RMaXN0ID0gKF9tZXRob2RMaXN0IHwgTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZVN1cGVydHlwZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyh2YywgYmVhbiwgY2xhenopOwotCQl2YWxpZGF0ZVNob3VsZE5vdEJlU3VwZXJUeXBlcyh2YywgYmVhbiwgY2xhenopOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZE5vdEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSB0eXBlczsKLQkJLy8gVGVzdCBmb3IgdHlwZXMgd2hpY2ggY2FuIGJlIHN1cGVydHlwZXMsIHRob3VnaCBpdCdzIGVpdGhlciBub3QgcmVjb21tZW5kZWQgb3Igc2hvdWxkIGJlCi0JCS8vIGNvZGVkIHdpdGggY2F1dGlvbgotCQl0eXBlcyA9IGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFIZWxwZXJzIHN1cGVyVHlwZSA9IENsYXNzVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0U3VwZXJ0eXBlKGJlYW4sIHR5cGVzW2ldKTsKLQkJCQlpZiAoc3VwZXJUeXBlID09IG51bGwpIHsKLQkJCQkJLy8gbm8gc3VwZXJ0eXBlCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgc3VwZXJUeXBlKSkgewotCQkJCQkvLyBJV0FENDE3OSA9IEJlY2F1c2UgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIHswfSwgInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhCi0JCQkJCS8vIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIFJlYWQgc2VjdGlvbiAxMC42LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQyOTIgPSBCZWNhdXNlIHswfSBpbXBsZW1lbnRzIHsxfSwgInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZAotCQkJCQkvLyBhcmd1bWVudCBvciByZXN1bHQuIFJlYWQgc2VjdGlvbiAxMi4yLjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQwNDMgPSBCZWNhdXNlIHswfSBpbXBsZW1lbnRzIHsxfSwgInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZAotCQkJCQkvLyBhcmd1bWVudCBvciByZXN1bHQuIFJlYWQgc2VjdGlvbiA3LjEwLjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmMKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlsb25nW10gdHlwZXMgPSBnZXRTdXBlcnR5cGVzKCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YUhlbHBlcnMgc3VwZXJUeXBlID0gQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRTdXBlcnR5cGUoYmVhbiwgdHlwZXNbaV0pOwotCQkJCWlmIChzdXBlclR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyBubyBzdXBlcnR5cGUKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgc3VwZXJUeXBlKSkgewotCQkJCQkvLyBJV0FENDAyNiA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25CZWFuLiBSZWFkIHNlY3Rpb24KLQkJCQkJLy8gNy41LjEsIDcuMTAuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDM3OSA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YXguZWpiLk1lc3NhZ2VEcml2ZW5CZWFuLiBSZWFkCi0JCQkJCS8vIHNlY3Rpb24gMTUuNC4xLCAxNS43LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQzODAgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuIFJlYWQgc2VjdGlvbgotCQkJCQkvLyAxNS40LjEsIDE1LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDE3MCA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YS5lamIuRW50aXR5QmVhbi4gUmVhZCBzZWN0aW9uIDEwLjYuMgotCQkJCQkvLyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI4NiA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YS5lamIuRW50aXR5QmVhbi4gUmVhZCBzZWN0aW9uIDEyLjIuMgotCQkJCQkvLyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117c3VwZXJUeXBlLmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJX21ldGhvZExpc3QgPSBOT19NRVRIT0RTOwotCQlfZmllbGRMaXN0ID0gTk9fRklFTERTOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25FcnJvcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgIHsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoZmllbGQpOwotCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eiwgZmllbGQuZ2V0TmFtZSgpKTsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IGdldFJlZmxlY3Rpb25XYXJuaW5nKHZjLCBleGMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpICB7Ci0JCXZjLnJlbW92ZU1lc3NhZ2VzKG1ldGhvZCk7Ci0JCXZjLnJlbW92ZU1lc3NhZ2VzKGNsYXp6LCBtZXRob2QuZ2V0U2lnbmF0dXJlKCkpOwotCQlJTWVzc2FnZSBtZXNzYWdlID0gZ2V0UmVmbGVjdGlvbldhcm5pbmcodmMsIGV4YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElNZXNzYWdlIGdldFJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBFT2JqZWN0IGZpZWxkT3JNZXRob2QpIHsKLQkJaWYgKGV4YyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUphdmFDbGFzcyBiYWRDbGF6eiA9IGV4Yy5nZXRKYXZhQ2xhc3MoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gKGJhZENsYXp6ID09IG51bGwpID8gIj8iIDogYmFkQ2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCi0JCWlmIChmaWVsZE9yTWV0aG9kIGluc3RhbmNlb2YgRmllbGQpIHsKLQkJCVN0cmluZyBuYW1lID0gKChGaWVsZCkgZmllbGRPck1ldGhvZCkuZ2V0TmFtZSgpOwotCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCAoRmllbGQpIGZpZWxkT3JNZXRob2QsIG5ldyBTdHJpbmdbXXtuYW1lLCB0eXBlTmFtZX0sIHRoaXMpOwotCQl9IGVsc2UgaWYgKGZpZWxkT3JNZXRob2QgaW5zdGFuY2VvZiBNZXRob2QpIHsKLQkJCVN0cmluZyBuYW1lID0gKChNZXRob2QpIGZpZWxkT3JNZXRob2QpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgKE1ldGhvZCkgZmllbGRPck1ldGhvZCwgbmV3IFN0cmluZ1tde25hbWUsIHR5cGVOYW1lfSwgdGhpcyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoWE1JUmVzb3VyY2UpIGZpZWxkT3JNZXRob2QuZVJlc291cmNlKCkpLmdldElEKGZpZWxkT3JNZXRob2QpOwotCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117bmFtZSwgdHlwZU5hbWV9LCB0aGlzKTsKLQkJfQotCQlpZiAoYmFkQ2xhenogPT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJnZXRNZXNzYWdlSWQoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIGJvb2xlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJJbnZhbGlkSW5wdXRFeGNlcHRpb24gdGhyb3duIG9uIHVua25vd24gY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCi0JcHVibGljIGZpbmFsIEphdmFDbGFzcyBnZXRDb21wb25lbnRJbnRlcmZhY2UoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJcmV0dXJuIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBleGlzdHMobG9uZyBtZXRob2RUeXBlKSB7Ci0JCXJldHVybiAoKF9tZXRob2RMaXN0ICYgbWV0aG9kVHlwZSkgPT0gbWV0aG9kVHlwZSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFDbGFzcyBnZXRIb21lSW50ZXJmYWNlKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCXJldHVybiBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCS8vIG11c3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uIG9yIG9uZSBvZiBpdHMgcGFyZW50cyAoSU9FeGNlcHRpb24gb3IgRXhjZXB0aW9uKQotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NSZW1vdGVFeGNlcHRpb25PclBhcmVudChiZWFuLCBtZXRob2QpOwotCQl9IGVsc2UgaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuTE9DQUwpID09IElFSkJUeXBlLkxPQ0FMKSB7Ci0JCQkvLyBtdXN0IG5vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24KLQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZG9lc05vdFRocm93UmVtb3RlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCwgYm9vbGVhbiBjaGVja1JldHVyblR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gcGFybXNbaV07Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBwYXJtLmdldEphdmFUeXBlKCkpKSB7Ci0JCQkJCUlNZXRob2RUeXBlIG10ID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQkJCS8vIGxvZwotCQkJCQl9IGVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtdC5nZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde3Bhcm0uZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7IC8vIENhbid0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbmFtZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZmllbGQsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYmVjYXVzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHdoZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBpdCdzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gcmV0dXJuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbWV0aG9kLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGl0J3MKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBjb25mdXNpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHNlZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vICJyZXN1bHQiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZC4KLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaGVja1JldHVyblR5cGUpIHsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQkJCUlNZXRob2RUeXBlIG10ID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQkJCS8vIGxvZwotCQkJCQl9IGVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtdC5nZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOyAvLyBDYW4ndAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB1c2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG5hbWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGZpZWxkLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBiZWNhdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHdoZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gcmV0dXJuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHR5cGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG1ldGhvZCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBjb25mdXNpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gc2VlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vICJyZXN1bHQiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZC4KLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkb24ndCBuZWVkIHRvIGNoZWNrCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dSTUlfSUlPUEluaGVyaXRhbmNlUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUEluaGVyaXRhbmNlKGNsYXp6KTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCS8qCi0JCSAqIEZvciBub3csIGRvIG5vdGhpbmcuIEluIGZ1dHVyZSwgY2hlY2sgaWYgdGhlIGZpZWxkIGlzIHB1YmxpYyAmIHN0YXRpYz8KLQkJICovCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzYTNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gY29tbW9uIHRvIHNlc3Npb24gYW5kIGVudGl0eSBiZWFucy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUJlYW4gZXh0ZW5kcyBBVmFsaWRhdGVFSkIgewotCXByb3RlY3RlZCBIYXNoU2V0IGNvbXBvbmVudFBhcmVudHMgPSBudWxsOyAvLyBUaGUgSmF2YUNsYXNzIGluc3RhbmNlcyB3aGljaCBhcmUgcGFyZW50cyBvZiB0aGlzIEphdmFDbGFzcyBpbnN0YW5jZSwgaWYgdGhpcyBKYXZhQ2xhc3MgaW5zdGFuY2UgaXMgcGFydCBvZiBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JCi0JcHVibGljIEFWYWxpZGF0ZUJlYW4oKSB7Ci0JCWNvbXBvbmVudFBhcmVudHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJY29tcG9uZW50UGFyZW50cy5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZENvbXBvbmVudFBhcmVudHMoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIHRoaXMgQ01QJ3Mgc3VwZXJ0eXBlCi0JCUphdmFDbGFzcyB0aGlzRWpiT2JqZWN0ID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlKYXZhQ2xhc3MgcGFyZW50RWpiT2JqZWN0ID0gc3VwZXJ0eXBlLmdldEVqYkNsYXNzKCk7Ci0KLQkJLy8gRUpCT2JqZWN0IGEgWGNoaWxkIG9mIHBhcmVudCBFSkJPYmplY3QgKFggPSBjaGlsZCwgZ3JhbmRjaGlsZCwgZ3JlYXQtZ3JhbmRjaGlsZCwgZXRjLikKLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNFamJPYmplY3QsIHBhcmVudEVqYk9iamVjdCkpIHsKLQkJCWNvbXBvbmVudFBhcmVudHMuYWRkKHBhcmVudEVqYk9iamVjdCk7Ci0JCX0KLQkJYnVpbGRDb21wb25lbnRQYXJlbnRzKHN1cGVydHlwZSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0RWpiQ2xhc3MoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldFJlbW90ZUhvbWVNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMF07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRSZW1vdGVDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMV07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMl07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIEEgYmVhbiBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6Ci0JCS8vICAgIDEuIGhvbWUKLQkJLy8gICAgMi4gcmVtb3RlCi0JCS8vICAgIDMuIGJlYW4gY2xhc3MgKHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kKS4KLQkJLy8gSWYgYSBwYXJ0aWN1bGFyIGJlYW4gZG9lc24ndCB1c2UgYSByZW1vdGUgdmlldyBvciBsb2NhbCB2aWV3LAotCQkvLyB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIG51bGwuIAotCQlMaXN0W10gcmVzdWx0ID0gbmV3IExpc3RbM107Ci0JCUphdmFDbGFzcyByZW1vdGVIb21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKHJlbW90ZUhvbWUgIT0gbnVsbCkgewotCQkJcmVzdWx0WzBdID0gcmVtb3RlSG9tZS5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyByZW1vdGVDb21wb25lbnQgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlpZihyZW1vdGVDb21wb25lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0WzFdID0gcmVtb3RlQ29tcG9uZW50LmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzFdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzICE9IG51bGwpIHsKLQkJCXJlc3VsdFsyXSA9IGJlYW5DbGFzcy5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFsyXSA9IG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGJlYW4gY2xhc3MnIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JCi0JLyoqCi0JICogRm9yIHRoZSBjaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kIGhhcyBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsCi0JICogdGhpcyBtZXRob2QsIGdpdmVuIHRoZSBiZWFuIG1ldGhvZCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBob21lIG1ldGhvZC4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyBmaW5hbCBNZXRob2QgZ2V0TWF0Y2hpbmdIb21lQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJLy8gY2hlY2sgb25seSB0aGUgY3VycmVudCBjbGFzcywgbm90IHRoZSBwYXJlbnRzIGluIHRoaXMgY2FzZS4KLQkJLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0ZXN0cy4KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUsIGhvbWVJbnRmLmdldE1ldGhvZHMoKSk7Ci0JfQotCQotCS8qKgotCSAqIEZvciB0aGUgY2hlY2sgdGhhdCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBoYXMgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lLAotCSAqIHRoaXMgbWV0aG9kLCBnaXZlbiB0aGUgYmVhbiBtZXRob2QsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaG9tZSBtZXRob2QuCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZEV4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMuIHRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUphdmFDbGFzcyBob21lSW50ZiA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgaG9tZUludGYpOwotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoaG9tZUludGYsIG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgd2hpY2ggdGhlIGJlYW4gbXVzdCBpbXBsZW1lbnQuCi0JICogRm9yIGVudGl0eSBiZWFucywgaXQncyBqYXZheC5lamIuRW50aXR5QmVhbi4KLQkgKiBGb3Igc2Vzc2lvbiBiZWFucywgaXQncyBqYXZheC5lamIuU2Vzc2lvbkJlYW4uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJlbnROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgcGFzc2VkIGluIGlzIGEgYnVzaW5lc3MgbWV0aG9kLgotCSAqCi0JICogQWx0aG91Z2ggdGhlIEVKQiAxLjEgc3BlYyBpbXBsaWVzIHRoYXQgYWxsIG5vbi1mcmFtZXdvcmsgbWV0aG9kcyBhcmUgYnVzaW5lc3MgbWV0aG9kcywKLQkgKiBkZXZlbG9wZXJzIG1heSBjcmVhdGUgbWV0aG9kcyBvbiB0aGUgYmVhbiB3aGljaCBhcmUgbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzCi0JICogbWV0aG9kIChpc0J1c2luZXNzTWV0aG9kKSBzZXBhcmF0ZXMgdGhlICJpbnRlcm5hbCBoZWxwZXIiIG1ldGhvZHMgZnJvbSB0aGUgYnVzaW5lc3MKLQkgKiBtZXRob2RzIGJ5IGNoZWNraW5nIGlmIGEgY29ycmVzcG9uZGluZyBtZXRob2QgZXhpc3RzIG9uIHRoZSByZW1vdGUgaW50ZXJmYWNlLiBJZiBpdAotCSAqIGRvZXMsIGNvbnNpZGVyIHRoaXMgYSBidXNpbmVzcyBtZXRob2QuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQotCQlpZiAoaXNGcmFtZXdvcmtNZXRob2QobmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBDaGVjayBpZiB0aGVyZSdzIGEgbWF0Y2hpbmcgbWV0aG9kIG9uIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZXJmYWNlID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGVyZmFjZSk7Ci0JCU1ldGhvZCByZW1vdGVJbnRlcmZhY2VNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQocmVtb3RlSW50ZXJmYWNlLCBuYW1lLCBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCQlpZiAoKHJlbW90ZUludGVyZmFjZU1ldGhvZCA9PSBudWxsKSB8fCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzRUpCT2JqZWN0TWV0aG9kKGJlYW4sIHJlbW90ZUludGVyZmFjZU1ldGhvZCkpKSB7Ci0JCQkvLyBubyBtYXRjaGluZyBtZXRob2QKLQkJCS8vIGZpbHRlciBvdXQgbWV0aG9kcyBmcm9tIGphdmF4LmVqYi5FSkJPYmplY3QKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIHBhc3NlZCBpbiBpcyBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBpbiBhCi0JICogY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudEluaGVyaXRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoY29tcG9uZW50UGFyZW50cyA9PSBudWxsKSB7Ci0JCQkvLyBOb3QgcGFydCBvZiBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiAoY29tcG9uZW50UGFyZW50cy5jb250YWlucyhtZXRoLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYW1ld29ya01ldGhvZChTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQUNUSVZBVEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQQVNTSVZBVEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJSRU1PVkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGSU5EKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkFMSVpFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBmaWVsZHMgKGkuZS4sIG51bGwpLCBhbmQgZmllbGRzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBleGNsdWRlIHJvb3Qgb2JqZWN0IG1ldGhvZHMKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdEZpZWxkKGJlYW4sIGZpZWxkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gZXhjbHVkZSByb290IG9iamVjdCBtZXRob2RzCi0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSmF2YUxhbmdPYmplY3RNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSkpIHsKLQkJCQlyZXR1cm4gaXNWYWxpZEVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFKSkgewotCQkJCXJldHVybiBpc1ZhbGlkRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGVqYkNyZWF0ZSBtZXRob2QgcGFzc2VkIGluIGlzIG5vdCBpbmhlcml0ZWQgCi0JICogZnJvbSBhIHBhcmVudCBpbiBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHksIG9yIGlzIGluaGVyaXRlZCwKLQkgKiBidXQgaXMgYWxzbyBkZWZpbmVkIG9uIHRoaXMgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBleGNsdWRlIGVqYkNyZWF0ZSBtZXRob2RzIHdoaWNoIGFyZSBpbmhlcml0ZWQKLQkgKiBmcm9tIGEgcGFyZW50IGluIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgYW5kIGFyZSBub3QKLQkgKiBleHBvc2VkIGFueXdoZXJlIG9uIHRoaXMgYmVhbiBjbGFzcyBpbnN0YW5jZSBpdHNlbGYuIChpLmUuLCBpbmhlcml0ZWQsCi0JICogYnV0IG5ldmVyIHVzZWQuKSBTaW5jZSB3ZSBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgdGhlc2UgbWV0aG9kcywgd2UKLQkgKiBzaG91bGQgbm90IGZsYWcgdGhlbSBhcyB3YXJuaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc0NvbXAgPSBpc0NvbXBvbmVudEluaGVyaXRlZCh2YywgYmVhbiwgY2xhenosIG1ldGgpOwotCQlpZiAoaXNDb21wKSB7Ci0JCQlNZXRob2QgaG9tZU1ldGggPSBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRoLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQlpZiAoaG9tZU1ldGggPT0gbnVsbCkgewotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQkKLQkvKioKLQkgKiAxOC4xLjIgUHJvZ3JhbW1pbmcgcmVzdHJpY3Rpb25zCi0JICouLi4KLQkgKiAgICAtIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCSAqICAgYWxsb3dlZC4gVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzdGF0aWMgZmllbGRzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MgYmUKLQkgKiAgIGRlY2xhcmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQl2YWxpZGF0ZVN0YXRpY0ZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCX0KLQkKLQkvKioKLQkgKiA2LjEwLjQgQnVzaW5lc3MgbWV0aG9kcwotCSAqIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqIAkJLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKgotCSAqIDkuMi42IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLQkgKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICdlamInIHRvIAotCSAqICAgICAgICAgIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCQlpZiAobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQxMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBTZWN0aW9uIDYuMTAuNSAoc2Vzc2lvbiksIDkuMi43IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCi0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlKTsKLQotCQlNZXRob2QgcmVtb3RlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKHJlbW90ZSwgbWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpKTsKLQkJaWYgKHJlbW90ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBUaGVuIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBoYXZlIGJlZW4gY2FsbGVkOyB1bmxlc3MgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlIHJlbW90ZSwgdGhpcyBiZWFuIG1ldGhvZCBpc24ndCBhIGJ1c2luZXNzIG1ldGhvZC4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIHJlbW90ZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCksIGV4Yy5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSwgcmVtb3RlTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlc3Npb24gYmVhbiBjbGFzczoKLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLlNlc3Npb25CZWFuIAotCSAqICAgICAgICBpbnRlcmZhY2UuCi0JICogCQktIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IAotCSAqICAgICAgICBiZSBhYnN0cmFjdC4KLQkgKiAJCS0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBzZXNzaW9uIGJlYW4ncyAKLQkgKiAgICAgICAgcmVtb3RlIGludGVyZmFjZSBbNF0gLgotCSAqIAkJLSBJZiB0aGUgY2xhc3MgaXMgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4sIGl0IG1heSBvcHRpb25hbGx5IGltcGxlbWVudCAKLQkgKiAgICAgICAgdGhlIGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKiAJCS0gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gSWYgdGhlIAotCSAqICAgICAgICBzZXNzaW9uIGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlbiB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIGVqYkNyZWF0ZSBtZXRob2RzLCAKLQkgKiAgICAgICAgdGhlIG1ldGhvZHMgb2YgdGhlIFNlc3Npb25CZWFuIGludGVyZmFjZSwgYW5kIHRoZSBtZXRob2RzIG9mIHRoZSBvcHRpb25hbCAKLQkgKiAgICAgICAgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UgbWF5IGJlIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcywgCi0JICogICAgICAgIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCSAqCi0JICouLi4KLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0LgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmaW5hbC4KLQkgKi4uLgotCSAqICAgLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSBbOV0uIAotCSAqICAgICBJZiB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLCB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIG5vLW9wIAotCSAqICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuIFRoZSBjb250YWluZXIgCi0JICogICAgIHdpbGwgbmV2ZXIgaW52b2tlIHRoZXNlIG1ldGhvZHMgb24gdGhlIGJlYW4gaW5zdGFuY2VzIGF0IHJ1bnRpbWUuCi0JICogICAtIEEgbm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcyBpcyByZXF1aXJlZCB0byBhdm9pZCAKLQkgKiAgICAgZGVmaW5pbmcgdGhlIGVudGl0eSBiZWFuIGNsYXNzIGFzIGFic3RyYWN0LgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIGFuZCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSwgYW5kIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGFzIGRlc2NyaWJlZCAKLQkgKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIAotCSAqICAgICBJZiB0aGUgZW50aXR5IGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotCSAqICAgICBtZXRob2RzIG9mIHRoZSBFbnRpdHlCZWFuIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIAotCSAqICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0JICogICAgIGV4YW1wbGUgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSAKLQkgKiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJYnVpbGRDb21wb25lbnRQYXJlbnRzKGJlYW4pOwotCi0JCS8vIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIChmb3IgZW50aXR5IGJlYW5zKSwgCi0JCS8vIG9yIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gKGZvciBzZXNzaW9uIGJlYW5zKSwgaW50ZXJmYWNlLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShnZXRQYXJlbnROYW1lKCksIGJlYW4pKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDEzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10ge2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKSwgZ2V0UGFyZW50TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gRm9yIGJvdGggZW50aXR5IGFuZCBzZXNzaW9uIGJlYW5zLCB0aGUgY2xhc3MgbXVzdCBiZSBwdWJsaWMuCi0JCWlmICghY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gRm9yIGJvdGggZW50aXR5IGFuZCBzZXNzaW9uIGJlYW5zLCB0aGUgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0JCWlmIChjbGF6ei5pc0Fic3RyYWN0KCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIEZvciBib3RoIGVudGl0eSBhbmQgc2Vzc2lvbiBiZWFucywgdGhlIGNsYXNzIG11c3Qgbm90IGJlIGZpbmFsLgotCQlpZiAoY2xhenouaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuMyBlamJDcmVhdGUgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotCSAqICAgICBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUuCi0JICogICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JICogICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkgKiAgICAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkgKiAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSAKLQkgKiAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0JICogICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICogICAtIFRoZSBlbnRpdHkgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIGEgdW5pcXVlIHByaW1hcnkga2V5LiAKLQkgKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSBwcmltYXJ5IGtleSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBwcmltYXJ5IGtleXMgb2YgYWxsIAotCSAqICAgICB0aGUgZXhpc3RpbmcgZW50aXR5IG9iamVjdHMgd2l0aGluIHRoZSBzYW1lIGhvbWUuIFRoZSBlamJDcmVhdGUgbWV0aG9kIHNob3VsZCAKLQkgKiAgICAgdGhyb3cgdGhlIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBvbiBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhbiBlbnRpdHkgb2JqZWN0IHdpdGggCi0JICogICAgIGEgZHVwbGljYXRlIHByaW1hcnkga2V5LiBIb3dldmVyLCBpdCBpcyBsZWdhbCB0byByZXVzZSB0aGUgcHJpbWFyeSBrZXkgb2YgYQotCSAqICAgICBwcmV2aW91c2x5IHJlbW92ZWQgZW50aXR5IG9iamVjdC4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLi4uCi0JICoKLQkgKiA5LjQuMiBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUKLQkgKi4uLgotCSAqICAgLSBUaGUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgdG8gcmV0dXJuIHRoZSBwcmltYXJ5IGtleSBjbGFzcyB0eXBlLiAKLQkgKiAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHNob3VsZCBiZSBjb2RlZCB0byByZXR1cm4gYSBudWxsLiAKLQkgKiAgICAgVGhlIHJldHVybmVkIHZhbHVlIGlzIGlnbm9yZWQgYnkgdGhlIENvbnRhaW5lci4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kX2hvbWVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgbXVzdCBoYXZlIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNZXRob2QgY3JlYXRlTWV0aG9kID0gZ2V0TWF0Y2hpbmdIb21lQ3JlYXRlTWV0aG9kRXh0ZW5kZWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlpZiAoY3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIENhbid0IGNoZWNrIHRoZSBleGNlcHRpb25zIG9mIGEgbWV0aG9kIHdoaWNoIGRvZXNuJ3QgZXhpc3QuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBXaGV0aGVyIHRoaXMgaXMgZnJvbSBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvciBub3QsIGlmIHRoZSBtZXRob2QgZXhpc3RzIG9uIHRoZQotCQkvLyBob21lLCBjaGVjayB0aGF0IHRoZSBtZXRob2QgZm9sbG93cyB0aGUgc3BlYy4KLQotCQkvLyBTZWN0aW9uIDYuMTAuNiAoc2Vzc2lvbiksIDkuMi44IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIGNyZWF0ZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGV4Yy5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUhlbHBlck1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIG1lc3NhZ2VQcmVmaXgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZG9lc05vdFRocm93UmVtb3RlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbWVzc2FnZVByZWZpeCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIDE4LjEuMiBQcm9ncmFtbWluZyByZXN0cmljdGlvbnMKLQkgKi4uLgotCSAqICAgIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0JICogICBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotCSAqICAgZGVjbGFyZWQgYXMgZmluYWwuCi0JICouLi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVN0YXRpY0ZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBbiBlbnRlcnByaXNlIEJlYW4gbXVzdCBub3QgdXNlIHJlYWQvd3JpdGUgc3RhdGljIGZpZWxkcy4gVXNpbmcgcmVhZC1vbmx5IHN0YXRpYyBmaWVsZHMgaXMKLQkJLy8gYWxsb3dlZC4gVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzdGF0aWMgZmllbGRzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MgYmUKLQkJLy8gZGVjbGFyZWQgYXMgZmluYWwuCi0JCWlmIChmaWVsZC5pc1N0YXRpYygpICYmICFmaWVsZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBKYXZhQ2xhc3MgbWF0Y2hpbmdDbGF6eiwgTWV0aG9kIG1hdGNoaW5nTWV0aG9kKSB7Ci0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gb24gdGhlIGJlYW4gY2xhc3MnIG1ldGhvZCBtdXN0IGJlIHRocm93biBvbiB0aGUgY29tcG9uZW50L2hvbWUgbWV0aG9kCi0JCS8qIERvbid0IGNoZWNrIGZvciB0aGlzIGhlcmUgLSBsZXQgdGhlIGhvbWUgJiBjb21wb25lbnQgZG8gaXQuCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWV0aG9kLCBtYXRjaGluZ01ldGhvZCk7Ci0JCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQl9Ci0JCSovCi0JCQotCQkvLyBFdmVyeSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2Qgc2hvdWxkIGJlIHRocm93biBvciB0aGVyZSBtYXkgYmUgY29tcGlsZSBlcnJvcnMKLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0U3VidHlwZUV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2hpbmdNZXRob2QsIG1ldGhvZCk7Ci0JCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0NTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoaW5nQ2xhenouZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzRWpiT2JqZWN0KSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRFamJPYmplY3QgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudEVqYk9iamVjdCA9IHN1cGVydHlwZS5nZXRFamJDbGFzcygpOwotCi0JCQkvLyBFSkJPYmplY3QgYSBYY2hpbGQgb2YgcGFyZW50IEVKQk9iamVjdCAoWCA9IGNoaWxkLCBncmFuZGNoaWxkLCBncmVhdC1ncmFuZGNoaWxkLCBldGMuKQotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0VqYk9iamVjdCk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudEVqYk9iamVjdCk7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzRWpiT2JqZWN0LCBwYXJlbnRFamJPYmplY3QpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzRWpiT2JqZWN0LmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50RWpiT2JqZWN0LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0VqYk9iamVjdCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQl2YWxpZGF0ZUFwcGVuZGl4Qih2Yywgc3VwZXJ0eXBlLCBwYXJlbnRFamJPYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFSkIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFSkIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2YzE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRUpCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzUvMDEgMTE6NTE6MDkgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFSkIgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgewotCXByaXZhdGUgTGlzdCByb2xlTWV0aG9kTmFtZXM7Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWlmKHJvbGVNZXRob2ROYW1lcyAhPSBudWxsKSB7Ci0JCQlyb2xlTWV0aG9kTmFtZXMuY2xlYXIoKTsKLQkJCXJvbGVNZXRob2ROYW1lcyA9IG51bGw7IC8vIGluIHRoaXMgY2FzZSwgY2xlYXJpbmcgdGhlIGxpc3QgaXNuJ3QgZW5vdWdoLCBiZWNhdXNlIGl0IGlzIGxlZ2FsIHRvIGhhdmUgemVybyByb2xlIG5hbWVzLiBNdXN0IGJlIG51bGwgb3Igd2UnbGwga2VlcCB0cnlpbmcgdG8gcmVsb2FkIHRoZSByb2xlIG5hbWVzIGp1c3QgYmVjYXVzZSB0aGVyZSBhcmUgemVybyByb2xlIG5hbWVzLgotCQl9Ci0JfQotCQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOS81LzIwMDEgMTI6MzY6MzkgUE0pCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJvbGVNZXRob2ROYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJdHJ5IHsKLQkJCWlmIChyb2xlTWV0aG9kTmFtZXMgPT0gbnVsbCAmJiBiZWFuICE9IG51bGwpIHsKLQkJCQlyb2xlTWV0aG9kTmFtZXMgPSBnZXRSb2xlTWV0aG9kTmFtZXNFeHRlbmRlZChiZWFuKTsKLQkJCX0KLQkJCXJldHVybiByb2xlTWV0aG9kTmFtZXM7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBhUm9sZU1ldGhvZE5hbWVzID0gZ2V0Um9sZU1ldGhvZE5hbWVzKHZjLCBiZWFuKTsKLQkJaWYoYVJvbGVNZXRob2ROYW1lcyAhPSBudWxsICYmICFhUm9sZU1ldGhvZE5hbWVzLmlzRW1wdHkoKSkKLQkJICByZXR1cm4gYVJvbGVNZXRob2ROYW1lcy5jb250YWlucyhtZXRob2QuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgZmllbGRzIChpLmUuLCBudWxsKSwgYW5kIGZpZWxkcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBmb2xsb3dpbmcgY2FsbCBjaGVja3MgaWYgdGhlIHR5cGUgcmVmbGVjdGVkIHByb3Blcmx5Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCkpOwotCi0JCWlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4gU2luY2UgbWFueSBvZiB0aGUgY2xhc3NlcyBkbwotCSAqIG5vdCB2YWxpZGF0ZSBmaWVsZHMgbm93LCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgYSBuby1vcCBzbyB0aGF0IHRoZQotCSAqIGNsYXNzZXMgY29tcGlsZS4gCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgY2hlY2tpbmcgKGlmIGVqYk1ldGhvZCBleGlzdHMpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eik7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbkVycm9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSAgewotCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eik7Ci0JCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkvLyBPbmUgb2YgdHdvIGNhc2VzIHdoZXJlIHdlIGNhcmUgaWYgdGhlIHR5cGUgaXMgb24gdGhpcyBjbGFzcyBvciBub3QgKGkuZS4sIG5vdCBsZWF2aW5nIGl0IHVwIHRvIE1lc3NhZ2VVdGlsaXR5KQotCQlTdHJpbmdbXSBtc2dQYXJtID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/ICI/IiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCkpIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKGZpZWxkLmdldE5hbWUoKSksIFN0cmluZy52YWx1ZU9mKGphdmFDbGFzc05hbWUpfTsKLQkJfQotCQllbHNlIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge2phdmFDbGFzc05hbWV9OyAvLyBNZXNzYWdlVXRpbGl0eSB3aWxsIHN1YnN0aXR1dGUgaW4gdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JCX0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkvLyBPbmUgb2YgdHdvIGNhc2VzIHdoZXJlIHdlIGNhcmUgaWYgdGhlIHR5cGUgaXMgb24gdGhpcyBjbGFzcyBvciBub3QgKGkuZS4sIG5vdCBsZWF2aW5nIGl0IHVwIHRvIE1lc3NhZ2VVdGlsaXR5KQotCQlTdHJpbmdbXSBtc2dQYXJtID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/ICI/IiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpKSB7Ci0JCQltc2dQYXJtID0gbmV3IFN0cmluZ1tdIHttZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBqYXZhQ2xhc3NOYW1lfTsKLQkJfQotCQllbHNlIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge2phdmFDbGFzc05hbWV9OyAvLyBNZXNzYWdlVXRpbGl0eSB3aWxsIHN1YnN0aXR1dGUgaW4gdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JCX0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCi0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQlKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKXRhcmdldDsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBjaGVjayBpZiBhbGwgb2YgdGhlIHR5cGVzIGluIHRoZSBiZWFuIHJlZmxlY3RlZCBwcm9wZXJseQotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGNsYXp6KTsKLQkJCQotCQkJdmMuc3VidGFzayhJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLlNUQVRVU19WQUxJREFUSU5HLCBuZXcgU3RyaW5nW117Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSk7Ci0JCQl2YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQl2YWxpZGF0ZU1ldGhvZHModmMsIGJlYW4sIGNsYXp6KTsKLQkJCXZhbGlkYXRlRmllbGRzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJlZmxlY3Rpb25FcnJvcih2YywgYmVhbiwgY2xhenopOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gYXZvaWQgdmFsaWRhdGluZyBhIEZpZWxkIG1vcmUKLQkgKiB0aGFuIG9uY2UuICBUaGlzIGlzIG5vdCB1c2VkIGZvciBjaGVja2luZyB0aGUgZXhpc3RlbmNlIG9mIGEgZmllbGQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0KSkgewotCQkJcHJpbVZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gYXZvaWQgdmFsaWRhdGluZyBhIE1ldGhvZCBtb3JlCi0JICogdGhhbiBvbmNlLiAgVGhpcyBpcyBub3QgdXNlZCBmb3IgY2hlY2tpbmcgdGhlIGV4aXN0ZW5jZSBvZiBhIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCXByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB2YWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCXByaW1WYWxpZGF0ZUV4aXN0ZW5jZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUZpZWxkcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFdoZW5ldmVyIGxvb3Bpbmcgb3ZlciBhbiBlbnRpcmUgbGlzdCwgYWx3YXlzIHVzZSBhbiAKLQkJLy8gaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGZvciBsb29wLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gCi0JCS8vIElmIHRoZSBsaXN0IGlzIGFuIGluc3RhbmNlIG9mIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxlLAotCQkvLyB0aGUgZ2V0KGkpIGNhbGwgY2FuIHRha2UgIGEgbG9uZyB0aW1lLiAKLQkJTGlzdCBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCUxpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QgPSBnZXRGaWVsZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJZmllbGQgPSAoRmllbGQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBVmFsaWRhdGVFSkIudmFsaWRhdGVGaWVsZHMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkEgZmllbGQgaXMgbnVsbCBvbiAiICsgY2xhenopOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBlKTsKLQkJCX0KLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AsIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhUGFyYW1ldGVyW10gYXJncyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGFyZ3NbaV0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117YXJnc1tpXS5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzUmVtb3RlRXhjZXB0aW9uT3JQYXJlbnQoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLCBidXQgZG9lc24ndCBjaGVjayB0aGUgZXhjZXB0aW9ucy4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2RSZXR1cm5UeXBlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwsIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSBleGNlcHRpb25zLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RSZXR1cm5UeXBlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluYWwgY2hlY2sgdG8gc2VlIGlmIHJlcXVpcmVkIG1ldGhvZHMgd2VyZSBkZXRlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1ldGhvZHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBXaGVuZXZlciBsb29waW5nIG92ZXIgYW4gZW50aXJlIGxpc3QsIGFsd2F5cyB1c2UgYW4gCi0JCS8vIGl0ZXJhdG9yIGluc3RlYWQgb2YgYSBmb3IgbG9vcCwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIAotCQkvLyBJZiB0aGUgbGlzdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGxpbmtlZCBsaXN0LCBmb3IgZXhhbXBsZSwKLQkJLy8gdGhlIGdldChpKSBjYWxsIGNhbiB0YWtlICBhIGxvbmcgdGltZS4gCi0JCU1ldGhvZFtdIGVqYk1ldGhvZHMgPSBjbGF6ei5saXN0TWV0aG9kRXh0ZW5kZWQoKTsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0ID0gZ2V0TWV0aG9kc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCWZvcihpbnQgaT0wOyBpPGVqYk1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQltZXRob2QgPSBlamJNZXRob2RzW2ldOwotCQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJLy8gTm8gcG9pbnQgYWRkaW5nIGEgdmFsaWRhdGlvbiBtZXNzYWdlLCBiZWNhdXNlIHRoZSB1c2VyIGNhbid0IGRvIGFueXRoaW5nLgotCQkJCS8vIExvZyB0aGlzIGNvbmRpdGlvbi4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFWYWxpZGF0ZUVKQi52YWxpZGF0ZU1ldGhvZHMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIk9uICIgKyBjbGF6eiArICIsIHRoZXJlIGlzIGEgbnVsbCBtZXRob2QuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBlKTsKLQkJCX0KLQkJfQotCQl2YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmU0MzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4KLSAqIElmIGEgQ01QIHJlcXVpcmVtZW50IGlzIGRpZmZlcmVudCB0aGFuIHRoZXNlLCB0aGVuIHRoZSBkaWZmZXJlbmNlcyBhcmUKLSAqIGRvY3VtZW50ZWQgaW4gOS40Llggc2VjdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFbnRpdHlCZWFuIGV4dGVuZHMgQVZhbGlkYXRlQmVhbiB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQVhfRUpCX0VOVElUWUJFQU4gPSAiamF2YXguZWpiLkVudGl0eUJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VURU5USVRZQ09OVEVYVCA9ICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOU0VURU5USVRZQ09OVEVYVCA9ICJ1bnNldEVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCTE9BRCA9ICJlamJMb2FkIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQlNUT1JFID0gImVqYlN0b3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFYX0VKQl9FTlRJVFlDT05URVhUID0gImphdmF4LmVqYi5FbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNTZXRFbnRpdHlDb250ZXh0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1Vuc2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJBY3RpdmF0ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJQYXNzaXZhdGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiUmVtb3ZlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYkxvYWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiU3RvcmUgPSBmYWxzZTsKLQotCS8qKgotCSAqIEdpdmVuIGEgYmVhbidzIGVqYkZpbmQgbWV0aG9kLCByZXR1cm4gdGhlIG1hdGNoaW5nIGZpbmQgbWV0aG9kIGZyb20KLQkgKiB0aGUgaG9tZSwgaWYgaXQgZXhpc3RzLiBJZiBub3QsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWF0Y2hpbmdIb21lRmluZE1ldGhvZEV4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSwgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0ZJTkQpOwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnROYW1lIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpBVkFYX0VKQl9FTlRJVFlCRUFOOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYW1ld29ya01ldGhvZChTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoc3VwZXIuaXNGcmFtZXdvcmtNZXRob2QobmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGNoZWNrIGZvciBlbnRpdHktc3BlY2lmaWMgbWV0aG9kcwotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJMT0FEKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCU1RPUkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9TRVRFTlRJVFlDT05URVhUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfVU5TRVRFTlRJVFlDT05URVhUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBtZXRob2RzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBmb2xsb3cgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24sCi0JICogYW5kIHRoYXQgdGhlcmUgYXJlIG5vIG1pc3NpbmcgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKiBTZWN0aW9uOiA5LjIuMgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVN0cmluZyBuYW1lID0gZWpiTWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSkpCi0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKQotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKQotCQkJdmFsaWRhdGVGaW5hbGl6ZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKQotCQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAoaXNCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCkpCi0JCQl2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZQotCQkJdmFsaWRhdGVIZWxwZXJNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGVqYk1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmICghaGFzU2V0RW50aXR5Q29udGV4dCAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9TRVRFTlRJVFlDT05URVhUKSkgewotCQkJSmF2YVBhcmFtZXRlcltdIHBhcmFtcyA9IGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJCWlmIChwYXJhbXMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocGFyYW1zWzBdLmdldEphdmFUeXBlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCwgYmVhbikpKSB7Ci0JCQkJCWhhc1NldEVudGl0eUNvbnRleHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzVW5zZXRFbnRpdHlDb250ZXh0ICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNVbnNldEVudGl0eUNvbnRleHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJBY3RpdmF0ZSAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJBY3RpdmF0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYlBhc3NpdmF0ZSAmJiBuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQQVNTSVZBVEUpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiUGFzc2l2YXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiUmVtb3ZlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJSZW1vdmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJMb2FkICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkxPQUQpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiTG9hZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYlN0b3JlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYlN0b3JlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhlamJNZXRob2QpICYmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJaGFzVmFsaWRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi42Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7IC8vIG1ha2Ugc3VyZSB0aGF0IG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAnZWpiJwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOF9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA5X2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RXaXRob3V0RXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucy4KLQkJLy8gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCQkvLyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCQkvLyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCQkvLyBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCQkvLyB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCQl2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kTm9SZW1vdGVFeGNlcHRpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQl2YWxpZGF0ZU5vUmVtb3RlRXhjZXB0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDAwX2J1cyk7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgVmFsaWRhdGVCZWFuLgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJLy8gUGx1cywgY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgotCQl2ZXJpZnlGaWVsZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuMywgOS4yLjggYW5kIDkuNC4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCQkvLyBCdXQgaWYgdGhlIGJlYW4gdXNlcyBqYXZhLmxhbmcuT2JqZWN0IGZvciBhIGtleSwgZG9uJ3QgY2hlY2sgaWYgaXQncyBzZXJpYWxpemFibGUuCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoYmVhbikpIHsKLQkJCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQkKLQkJCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGU7IHVubGVzcyB0aGlzIGlzCi0JCS8vIGEgQ01QLCBhbmQgYW4gdW5rb253biBwcmltYXJ5IGtleSBjbGFzcyBpcyB1c2VkLiBSZWFkIHNlY3Rpb24gOS40LjcuMy4KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2Rfa2V5RGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkJLy8gaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JCS8vIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkJLy8gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSAKLQkJLy8gYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkJLy8gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIAotCQkvLyBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiQ3JlYXRlKTsKLQotCQkvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB0aGlzIGVqYkNyZWF0ZSBtZXRob2QuCi0JCU1ldGhvZCBlamJQb3N0Q3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFLCBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCQlpZiAoZWpiUG9zdENyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBDaGVjayBmb3IgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lLCBhbmQgdGhhdCB0aGUgZXhjZXB0aW9ucyBvbgotCQkvLyB0aGlzIG1ldGhvZCBhcmUgYSBzdWJzZXQgb2YgdGhlIGV4Y2VwdGlvbnMgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBvbiB0aGUgaG9tZS4KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4zLCA5LjIuOCBhbmQgOS40LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9rZXlEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MgKHNlY3Rpb24gOS40LjcuMykgaXMgYWxzbyB2YWxpZGF0ZWQgYnkgdGhpcwotCQkvLyBjaGVjaywgYmVjYXVzZSB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBvZiB0eXBlIGphdmEubGFuZy5PYmplY3QsIGFuZAotCQkvLyB0aGUgZWpiQ3JlYXRlIG11c3QgcmV0dXJuIGphdmEubGFuZy5PYmplY3QuCi0JCUphdmFIZWxwZXJzIHByaW1hcnlLZXkgPSBudWxsOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGJlYW4pKSB7Ci0JCQlwcmltYXJ5S2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShwYXJtVHlwZSwgcHJpbWFyeUtleSkpIHsKLQkJCS8vIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBqYXZhLmxhbmcuT2JqZWN0LCBjb3VsZCBiZSBzZWN0aW9uIDkuNC43LjMKLQkJCVN0cmluZyBrZXlOYW1lID0gKHByaW1hcnlLZXkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBwcmltYXJ5S2V5LmdldEphdmFOYW1lKCk7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0ge2tleU5hbWV9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi41LCA5LjQuNiBhbmQgOS40LjcuMwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgbWV0aG9kIGlzIGEgbm8tb3Agc28gdGhhdCB0aGUgZGVwZW5kZW5jeSBjbGFzc2VzIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IGl0LgotCQkvLyAoVGhpcyBtZXRob2Qgd2lsbCBuZXZlciBiZSBjYWxsZWQgaW4gYSBkZXBlbmRlbmN5IGNsYXNzLikKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjUsIDkuNC42IGFuZCA5LjQuNy4zCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kX2hvbWVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCQkvLyBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkJLy8gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCQkvLyAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkJLy8gb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCQlKYXZhQ2xhc3MgaG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgaG9tZSk7Ci0KLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0YgKyBtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg0KTsgLy8gZS5nLiBpZiB0aGUgaG9tZSBtZXRob2QgaXMgbmFtZWQgZmluZFgsIHRoZW4gdGhlIGJlYW4gbWV0aG9kIHdpbGwgYmUgbmFtZWQgZWpiRmluZFgKLQkJTWV0aG9kIGhvbWVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoaG9tZSwgbWV0aG9kLCBtZXRob2ROYW1lKTsKLQkJaWYgKGhvbWVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gVGhlbiB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZDsgdW5sZXNzIHRoZSBtZXRob2QgZXhpc3RzIG9uIHRoZSByZW1vdGUsIHRoaXMgYmVhbiBtZXRob2QgaXNuJ3QgYSBidXNpbmVzcyBtZXRob2QuCi0JCQlyZXR1cm47Ci0JCX0KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIGhvbWVNZXRob2QpOwotCQlpZiAoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGV4Yy5nZXRRdWFsaWZpZWROYW1lKCksIGhvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNAotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJLy8gVGhlIG1ldGhvZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBoYXMgYWxyZWFkeSB0ZXN0ZWQgdGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgZWpiUG9zdENyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gKChwYXJtVHlwZSA9PSBudWxsKSA/ICIiIDogcGFybVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXJldHVyblR5cGVOYW1lLmVxdWFscyhJVHlwZUNvbnN0YW50cy5WT0lEKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkJLy8gdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCQkvLyBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCQkvLyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JCS8vIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJQb3N0Q3JlYXRlKTsKLQotCQkvLyBWZXJpZnkgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZC4KLQkJTWV0aG9kIGVqYkNyZWF0ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFLCBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZF9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjQKLQkqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZF9ob21lRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJQb3N0Q3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFDbGFzcyBob21lSW50ZiA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgaG9tZUludGYpOwotCi0JCU1ldGhvZCBjcmVhdGVNZXRob2QgPSBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2RFeHRlbmRlZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmIChjcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaXMgaW5oZXJpdGVkIGZyb20gYSBjb21wb25lbnQgcGFyZW50LCBpdCBpcyBsaWtlbHkKLQkJCS8vIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRlIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgaG9tZS4KLQkJCS8vIFNpbmNlIG91ciB0b29scyBnZW5lcmF0ZSB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlIGNvZGUsIHN1cHByZXNzIHRoaXMgd2FybmluZy4KLQotCQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgd2hpY2ggYXJlIGluaGVyaXRlZCB2aWEgY29tcG9uZW50IGluaGVyaXRhbmNlLCBidXQgZG8gbm90Ci0JCQkvLyBoYXZlIGEgbWV0aG9kIG9uIHRoZWlyIGltbWVkaWF0ZSBob21lLCBhcmUgZmlsdGVyZWQgb3V0IHZpYSB0aGUgaXNWYWxpZChNZXRob2QpIG1ldGhvZC4KLQotCQkJLy8gVGhlIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kIGNoZWNrcyBmb3IgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kLCBidXQganVzdCBpbgotCQkJLy8gY2FzZSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBpcyBtaXNzaW5nLCBjaGVjayBmb3IgaXQgaGVyZSB0b28uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBob21lSW50Zi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJCS8vIENhbid0IGNoZWNrIHRoZSBleGNlcHRpb25zIG9mIGEgbWV0aG9kIHdoaWNoIGRvZXNuJ3QgZXhpc3QuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBXaGV0aGVyIHRoaXMgaXMgZnJvbSBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvciBub3QsIGlmIHRoZSBtZXRob2QgZXhpc3RzIG9uIHRoZQotCQkvLyBob21lLCBjaGVjayB0aGF0IHRoZSBtZXRob2QgZm9sbG93cyB0aGUgc3BlYy4KLQotCQkvLyBTZWN0aW9uIDYuMTAuNiAoc2Vzc2lvbiksIDkuMi44IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIGNyZWF0ZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgaG9tZUludGYuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJZiBpdCdzICJmaW5hbGl6ZSgpIiwgdGhlIGVqYiBiZWFuIHNob3VsZG4ndCBoYXZlIHRoZSBtZXRob2QuCi0JCWlmIChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIFRoaXMgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIGJlY2F1c2UgRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZCB0byBiZSBjYWxsZWQuIEVKQiAxLjEgKHNlY3Rpb24gNi4xMC4yKSBzcGVjaWZpY2FsbHkgcHJvaGliaXRzIGl0LgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmdbXSBtb2RlbE9iamVjdE5hbWUgPSBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQlpZiAoIWhhc1ZhbGlkQ29uc3RydWN0b3IgJiYgaGFzQUNvbnN0cnVjdG9yKSB7Ci0JCQkvLyBJZiBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cyBkb2VzIG5vdCBleGlzdCBleHBsaWNpdGx5LAotCQkJLy8gSmF2YSB3aWxsIGluc2VydCBvbmUgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3JzIGRlZmluZWQgaW4gdGhlCi0JCQkvLyBjbGFzcy4gSWYgdGhlcmUgaXMgYSBjb25zdHJ1Y3RvciwgSmF2YSBkb2VzIG5vdCBpbnNlcnQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzU2V0RW50aXR5Q29udGV4dCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzVW5zZXRFbnRpdHlDb250ZXh0KSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJBY3RpdmF0ZSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiUGFzc2l2YXRlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJSZW1vdmUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYkxvYWQpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYlN0b3JlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2ZXJpZnlGaWVsZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJaGFzVmFsaWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzU2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCQloYXNVbnNldEVudGl0eUNvbnRleHQgPSBmYWxzZTsKLQkJaGFzRWpiQWN0aXZhdGUgPSBmYWxzZTsKLQkJaGFzRWpiUGFzc2l2YXRlID0gZmFsc2U7Ci0JCWhhc0VqYlJlbW92ZSA9IGZhbHNlOwotCQloYXNFamJMb2FkID0gZmFsc2U7Ci0JCWhhc0VqYlN0b3JlID0gZmFsc2U7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlIb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTczYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZW50aXR5IGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA5LjIuOAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlRW50aXR5SG9tZSBleHRlbmRzIEFWYWxpZGF0ZUhvbWUgewotCXByaXZhdGUgSGFzaFNldCBmaW5kQnlQS01ldGhvZHMgPSBudWxsOwotCi0JcHVibGljIEFWYWxpZGF0ZUVudGl0eUhvbWUoKSB7Ci0JCWZpbmRCeVBLTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWZpbmRCeVBLTWV0aG9kcy5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudEZpbmRCeVByaW1hcnlLZXlDb3VudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIE5lZWQgdG8gdHJhY2sgbnVtYmVyIG9mIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kcyBmb3IgdGhlCi0JCS8vIHZhbGlkYXRlTWV0aG9kRXhpc3RzKCkgY2hlY2tzLiBEbyBub3QgY2hlY2sgb25seSB0aGUgY3VycmVudAotCQkvLyBjbGFzcywgb3IgYSBmaW5kQnlQcmltYXJ5S2V5IHdoaWNoIGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IGludGVyZmFjZQotCQkvLyB3aWxsIG5vdCBiZSBkZXRlY3RlZC4KLQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQlmaW5kQnlQS01ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgcmV0dXJucyB0aGUgcmVtb3RlIGludGVyZmFjZSwKLQkgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlT2JqZWN0RmluZGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBUaGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QgaXMgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmVtb3RlSW50ZikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgaXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBlbnRpdHkgaG9tZSdzIG1ldGhvZHMgY29tcGx5IHdpdGggdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoaGlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBoaU1ldGhvZC5nZXROYW1lKCk7Ci0KLQkJLy8gRWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJLy8gICAtIEEgY3JlYXRlIG1ldGhvZC4KLQkJLy8gICAtIEEgZmluZGVyIG1ldGhvZC4KLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpCi0JCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGhpTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCkpCi0JCQl2YWxpZGF0ZUZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCk7Ci0JCWVsc2UgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCQkvLyBUaGUgc3VwZXJjbGFzcyBjaGVja3MgdGhhdCB0aGUgaG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJIb21lLAotCQkvLyBhbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGNvbXBsaWVzIHdpdGggUk1JLUlJT1AgcnVsZXMuCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBjcmVhdGUgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJLy8KLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkJLy8gYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JCS8vIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkJLy8gKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JCS8vIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGNyZWF0ZSBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04gfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLQkJLy8gUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBjcmVhdGUgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2RfYmVhbkRlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQlzdXBlci52YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLwotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCQkvLyBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkJLy8gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCQkvLyAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkJLy8gb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCQl2YWxpZGF0ZU1hdGNoaW5nQmVhblBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBJbiBhZGRpdGlvbiB0byByZWd1bGFyIGZpbmQgcnVsZXMsIGZpbmRCeVByaW1hcnlLZXkgbmVlZHMgdG8gZm9sbG93IHNvbWUgb3RoZXIgcnVsZXMuCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2Rfa2V5RGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGhhc1ZhbGlkRkJQS01ldGhvZCA9IGZhbHNlOwotCQlFbnRpdHkgZW50aXR5QmVhbiA9IChFbnRpdHkpIGJlYW47IC8vIGJlYW4gaXMgY2hlY2tlZCBmb3IgbnVsbCBpbiBBVmFsaWRhdGVFSkIudmFsaWRhdGUoKSBtZXRob2QsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0IGhlcmUuCi0JCUphdmFDbGFzcyBrZXlDbGFzcyA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleSgpOwotCQkKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGtleUNsYXNzKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCQkvLyBUaGlzIGNoZWNrIGFsc28gdmFsaWRhdGVzIGNhc2UgOS40LjcuMyAoQ01QIHVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MsCi0JCS8vIHdoaWNoIG11c3QgYmUgZGVjbGFyZWQgYXMgamF2YS5sYW5nLk9iamVjdC4pCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJaWYgKHBhcm1zLmxlbmd0aCA9PSAxKSB7Ci0JCQlKYXZhSGVscGVycyB0eXBlID0gcGFybXNbMF0uZ2V0SmF2YVR5cGUoKTsKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBrZXlDbGFzcykpIHsKLQkJCQkvLyBjaGVjayB0aGF0IGl0J3MgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcgotCQkJCWlmIChpc1NpbmdsZU9iamVjdEZpbmRlcih2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQkJaGFzVmFsaWRGQlBLTWV0aG9kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjaGVjayBpZiBpdCdzIGphdmEubGFuZy5PYmplY3QuIElmIGl0IGlzLCB0aGlzIGNvdWxkIGJlIGEgY2FzZSBvZiA5LjQuNy4zLgotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTYW1lVHlwZSh0eXBlLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgZW50aXR5QmVhbikpKSB7Ci0JCQkJCWhhc1ZhbGlkRkJQS01ldGhvZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFoYXNWYWxpZEZCUEtNZXRob2QpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGtleUNsYXNzLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJbiBhZGRpdGlvbiB0byByZWd1bGFyIGZpbmQgcnVsZXMsIGZpbmRCeVByaW1hcnlLZXkgbmVlZHMgdG8gZm9sbG93IHNvbWUgb3RoZXIgcnVsZXMuCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2RfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKCFpc1NpbmdsZU9iamVjdEZpbmRlcih2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCVN0cmluZyByZW1vdGVJbnRmTmFtZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0TmFtZSgpOyAvLyBDYW4gYXNzdW1lIHRoYXQgcmVtb3RlIGludGVyZmFjZSBpc24ndCBudWxsLCBvciBpc1NpbmdsZU9iamVjdEZpbmRlciB3b3VsZCBoYXZlIHRocm93biBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmVtb3RlSW50Zk5hbWUgfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBmaW5kZXIgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBjbGFzcyBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JCS8vIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCQkvLwotCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIGEgdHlwZSBvciBhbiBhcnJheSBvZiB0eXBlcywgdGhlIGZvbGxvd2luZwotCQkvLyBjYWxsIHdpbGwgcmV0dXJuIHRoZSBiYXNlIHR5cGUuIGkuZS4sIGlmIGl0J3MgYW4gYXJyYXkgb2YgIk15Q2xhc3MiLAotCQkvLyB0aGUgcmV0dXJuVHlwZU5hbWUgd2lsbCBiZSBzZXQgdG8gIk15Q2xhc3MiLCBub3QgYW4gYXJyYXkgdHlwZS4KLQkJdmFsaWRhdGVGaW5kTWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0ZJTkRFUkVYQ0VQVElPTiB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWJvb2xlYW4gdmFsaWRhdGVSTUlQYXJhbWV0ZXJzID0gdHJ1ZTsgLy8gc2hvdWxkIHRoZSBwYXJhbWV0ZXJzIGJlIHZhbGlkYXRlZCB0byBzZWUgaWYgdGhleSBmb2xsb3cgUk1JLUlJT1AgcnVsZXM/Ci0JCWJvb2xlYW4gdmFsaWRhdGVSTUlSZXRUeXBlID0gdHJ1ZTsgLy8gc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBiZSB2YWxpZGF0ZWQgdG8gc2VlIGlmIGl0IGZvbGxvd3MgUk1JLUlJT1AgcnVsZXM/Ci0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJLy8gLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCQkvLwotCQkJLy8gVGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIGlzIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLgotCQkJLy8gVGhlIGNhbGwgdG8gdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcCBpcyBkb25lIGluCi0JCQkvLyB2YWxpZGF0ZUZpbmRNZXRob2RfcmVtb3RlRGVwKG1ldGhvZCk7Ci0JCQkvL3ZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9yZW1vdGVEZXAobWV0aG9kKTsKLQotCQkJLy8gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCQl2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2Rfa2V5RGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShiZWFuKSkgewotCQkJCXZhbGlkYXRlUk1JUGFyYW1ldGVycyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCQkJCQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLQkJLy8gUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCS8vIEhvd2V2ZXIsIHRoZSByZXR1cm4gdHlwZSBvZiAiRW51bWVyYXRpb24iIG9yICJDb2xsZWN0aW9uIiBpcyBleGVtcHRlZCBmcm9tIHRoaXMKLQkJLy8gY2hlY2ssIGJlY2F1c2UgdGhlIHNwZWMgc3RhdGVzLCBpbiA5LjEuOC4yLCB0aGF0IEVudW1lcmF0aW9uIG9yIENvbGxlY3Rpb24gbXVzdCBiZSByZXR1cm5lZAotCQkvLyBmb3IgbXVsdGktb2JqZWN0IGZpbmRlcnMuCi0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl2YWxpZGF0ZVJNSVJldFR5cGUgPSAhKChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXRUeXBlLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OLCBiZWFuKSkpIHx8IAotCQkJCQkJCQkoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0VHlwZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKSkpKTsKLQkJCi0JCWlmKHZhbGlkYXRlUk1JUGFyYW1ldGVycykgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCWlmKHZhbGlkYXRlUk1JUmV0VHlwZSkgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFJldHVyblR5cGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBmaW5kZXIgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBjbGFzcyBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2RfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotCQkvLyBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkJLy8KLQkJLy8gV2hldGhlciBvciBub3QgdGhlIHBhcmFtZXRlciBpcyBhIHR5cGUgb3IgYW4gYXJyYXkgb2YgdHlwZXMsIHRoZSBmb2xsb3dpbmcKLQkJLy8gY2FsbCB3aWxsIHJldHVybiB0aGUgYmFzZSB0eXBlLiBpLmUuLCBpZiBpdCdzIGFuIGFycmF5IG9mICJNeUNsYXNzIiwKLQkJLy8gdGhlIHJldHVyblR5cGVOYW1lIHdpbGwgYmUgc2V0IHRvICJNeUNsYXNzIiwgbm90IGFuIGFycmF5IHR5cGUuCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCS8vIFBlcmZvcm0gdGhpcyBjaGVjayBmb3IgYWxsIGZpbmRlcnMgYnV0IHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4KLQkJLy8gVGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSByZW1vdGUgaW50ZXJmYWNlLCBiZWNhdXNlIHRoZSBtZXRob2QgaXMKLQkJLy8gYSBzaW5nbGUtb2JqZWN0IGZpbmRlciBtZXRob2Q7IGJ1dCBvdGhlciBmaW5kZXJzIG1heSByZXR1cm4gYSBDb2xsZWN0aW9uIG9yIEVudW1lcmF0aW9uLgotCQlpZiAoIW1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQotCQkJaWYgKCEgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fCAKLQkJCSAgICAgICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pIHx8IAotCQkJICAgICAgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHJlbW90ZUludGYpKSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IHJlbW90ZUludGYuZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJc3VwZXIudmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlNZXRob2QgZWpiQ3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgcmVwb3J0ZWQgaW4gc3VwZXIKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZmluZGVyIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgY2xhc3MgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5GaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKGhvbWVNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQlTdHJpbmcgZmluZE1ldGhvZE5hbWUgPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkYgKyAoaG9tZU1ldGhvZC5nZXROYW1lKCkpLnN1YnN0cmluZygxKTsgLy8gZS5nLiBpZiB0aGUgaG9tZSBtZXRob2QgaXMgbmFtZWQgZmluZFgsIHRoZW4gdGhlIGJlYW4gbWV0aG9kIHdpbGwgYmUgbmFtZWQgZWpiRmluZFgKLQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgYmVhbk1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuQ2xhc3MsIGhvbWVNZXRob2QsIGZpbmRNZXRob2ROYW1lKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgcmV0dXJuIHR5cGVzIG1hdGNoCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCUphdmFIZWxwZXJzIGhvbWVSZXRUeXBlID0gaG9tZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCUphdmFIZWxwZXJzIGJlYW5SZXRUeXBlID0gYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW5SZXRUeXBlKSkgewotCQkJLy8gZW1pdCB0aGUgZXJyb3Igb25seSBpZiBpdCdzIGEgbXVsdGktZmluZGVyLiBTaW5nbGUtZmluZGVycyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIG9uIHRoZSBob21lICYgYmVhbiBjbGFzcy4KLQkJCWJvb2xlYW4gaG9tZVJldFR5cGVJc1JlbW90ZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVSZXRUeXBlLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCWJvb2xlYW4gYmVhblJldFR5cGVJc0tleSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW5SZXRUeXBlLCAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpOwotCQkJaWYoIShob21lUmV0VHlwZUlzUmVtb3RlICYmIGJlYW5SZXRUeXBlSXNLZXkpKSB7Ci0JCQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IChiZWFuUmV0VHlwZUlzS2V5KSA/IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgOiBiZWFuUmV0VHlwZTsgLy8gaWYgdGhlIGJlYW4gY2xhc3MgcmV0dXJucyBhIGtleSwgdGhlIGhvbWUgbXVzdCByZXR1cm4gdGhlIHJlbW90ZTsgaWYgdGhlIGJlYW4gY2xhc3MgcmV0dXJucyBhIENvbGwvRW51bSwgdGhlIGhvbWUgbXVzdCByZXR1cm4gdGhlIHNhbWUKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJldFR5cGUuZ2V0SmF2YU5hbWUoKSwgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0JCS8vIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQKLQkJLy8gbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLyoKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBleGNlcHRpb25zIGhlcmUgLSBsZXQgdGhlIGJlYW4gY2xhc3MgZG8gaXQuIFdoZW4gdGhlIGhvbWUKLQkJLy8gY2hhbmdlcywgYSAiZGVwZW5kZW50IiB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuJ3MgY2hlY2tzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCS8vIElmIGl0IGlzIGNoZWNrZWQgaW4gdGhpcyBtZXRob2QgYXMgd2VsbCwgdGhlcmUgYXJlIGR1cGxpY2F0ZSBtZXNzYWdlcyBvbiB0aGUgdGFzayBsaXN0LgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBnZXROb3RTdWJzZXRFeGNlcHRpb25zKGhvbWVNZXRob2QsIGJlYW5NZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9USElfRVhDRVAsIG1zZ1Bhcm0sIGJlYW5NZXRob2QsIEVKQl9CRUFOX0dST1VQKTsKLQkJCX0KLQkJfQkKLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGhhcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBvbiB0aGUgYmVhbi4KLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChob21lTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW5DbGFzcyk7Ci0KLQkJTWV0aG9kIGJlYW5NZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCBob21lTWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJLy8gTGV0IHRoZSBiZWFuIGNsYXNzIHJlcG9ydCB0aGlzIG1lc3NhZ2UuIE90aGVyd2lzZSwgd2hlbiB0aGUgYmVhbiBjbGFzcyByZXBvcnRzIGl0LCB0aGlzIG1lc3NhZ2UgbG9va3MgbGlrZSBhIGR1cGxpY2F0ZS4KLQkJCS8qCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCSovCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCQkvLyBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkJLy8gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCQkvLyAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkJLy8gb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgaG9tZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMoaG9tZU1ldGhvZCwgYmVhbk1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgYmVhbk1ldGhvZCwgRUpCX0JFQU5fR1JPVVApOwotCQkJfQotCQl9Ci0JCSovCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWlmIChmaW5kQnlQS01ldGhvZHMuc2l6ZSgpID09IDApIHsKLQkJCS8vIG11c3QgaGF2ZSBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCS8qCi0JCS8vIE5vdCBzdXJlIGlmIHRoaXMgY2hlY2sgaXMgdXNlZnVsIG9yIG5vdCwgYmVjYXVzZSBpdCBpcyBsZWdhbCBmb3IgYSBjaGlsZCBob21lIHRvIGRlY2xhcmUgYSBmaW5kQnlQcmltYXJ5S2V5LAotCQkvLyBhbmQgYWxzbyBmb3IgYSBwYXJlbnQgaG9tZSB0byBkZWNsYXJlIGEgZmluZEJ5UHJpbWFyeUtleS4KLQkJZWxzZSBpZiAoIGZpbmRCeVBLTWV0aG9kcy5zaXplKCkgPiAxICkgewotCQkJLy8gaWYgdGhlIGhvbWUgaW50ZXJmYWNlIGhhcyBtdWx0aXBsZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZHMgKGltcGxpZWQgYnkgOS4yLjgpCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpbmRCeVBLTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX0hBU19NVUxUSVBMRV9QS19NRVRIT0RTLCAoTWV0aG9kKWl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzMDNiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA2LjgsIDYuMTAuNiBhbmQgOS4yLjgKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUhvbWUgZXh0ZW5kcyBBVmFsaWRhdGVFSkIgewotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldEhvbWVJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBBIGhvbWUgb3IgY29tcG9uZW50IGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gYmVhbiBjbGFzcwotCQlMaXN0W10gcmVzdWx0ID0gbmV3IExpc3RbMV07Ci0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGhvbWUgb3IgY29tcG9uZW50J3MgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBjaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kIGhhcyBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsCi0JICogdGhpcyBtZXRob2QsIGdpdmVuIHRoZSBiZWFuIG1ldGhvZCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBob21lIG1ldGhvZC4KLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjEwLjYgYW5kIDkuMi44Ci0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNYXRjaGluZ0JlYW5FamJDcmVhdGVNZXRob2RFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbi5nZXRFamJDbGFzcygpLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIEV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNFSkJIb21lTWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNDbGluaXRNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogNi4xMC42IGFuZCA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgYW4gaW50ZXJmYWNlCi0JCWlmICghY2xhenouaXNJbnRlcmZhY2UoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDEyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBob21lIGludGVyZmFjZSBtdXN0IGluaGVyaXQgamF2YXguZWpiLkVKQkhvbWUuY2xhc3MKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FLCBiZWFuKSkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRSB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogNi44IGFuZCA2LjEwLjYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCQkvLyB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkJLy8gb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCQkvLyBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogNi44LCA2LjEwLjYgYW5kIDkuMi44Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZiA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRmKTsKLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmVtb3RlSW50ZikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyByZW1vdGVJbnRmLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjEwLjYgYW5kIDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgZWpiQ3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU2VjdGlvbiA2LjEwLjYgKHNlc3Npb24pLCA5LjIuOCAoZW50aXR5KSwgZGVjbGFyZSB0aGF0IGFsbCBleGNlcHRpb25zIGRlY2xhcmVkCi0JCS8vIG9uIHRoZSBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YKLQkJLy8gdGhlIG1hdGNoaW5nIGNyZWF0ZSBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8qCi0JCS8vIERvbid0IGNoZWNrIGZvciB0aGUgZXhjZXB0aW9ucyBoZXJlIC0gbGV0IHRoZSBiZWFuIGNsYXNzIGRvIGl0LiBXaGVuIHRoZSBob21lCi0JCS8vIGNoYW5nZXMsIGEgImRlcGVuZGVudCIgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbidzIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkvLyBJZiBpdCBpcyBjaGVja2VkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwsIHRoZXJlIGFyZSBkdXBsaWNhdGUgbWVzc2FnZXMgb24gdGhlIHRhc2sgbGlzdC4KLQkJSGFzaFNldCBleGNlcHRpb25zID0gZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhtZXRob2QsIGVqYkNyZWF0ZU1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgZWpiQ3JlYXRlTWV0aG9kLCBFSkJfSE9NRV9HUk9VUCk7IC8vIHNpbmNlIHdlJ3JlIGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgYmVhbiBjbGFzcywgd2UgbmVlZCB0byBtYXJrIGl0IGxpa2UgdGhlIGJlYW4gY2xhc3Mgd291bGQ7IGkuZS4sIGEgaG9tZS1kZXBlbmRlbnQgbWVzc2FnZQotCQkJfQotCQl9Ci0JCSovCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNIb21lKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQkKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkvLyBiZWFuIGhhcyBubyBzdXBlcnR5cGUKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbglzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRIb21lID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJcGFyZW50SG9tZSA9IHN1cGVydHlwZS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0KLQkJCS8vIEhvbWUgYSBYY2hpbGQgb2YgcGFyZW50IEhvbWUKLQkJCS8vIEluIG91ciBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZSwgd2hpbGUgaXQgaXMgbGVnYWwgZm9yCi0JCQkvLyBhIGhvbWUgdG8gaW5oZXJpdCBmcm9tIGFub3RoZXIgaG9tZSwgKHNlY3Rpb24gQi4yKSwgaXQgaXMgbm90IGxlZ2FsCi0JCQkvLyBmb3IgV1NBIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuIAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0hvbWUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRIb21lKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0hvbWUsIHBhcmVudEhvbWUpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzSG9tZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEhvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzSG9tZSwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVLZXlDbGFzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmJiNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkga2V5IGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICogU2VjdGlvbiA5LjIuOQotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVLZXlDbGFzcyBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKChFbnRpdHkpIHBhcmVudCkuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIG1ldGhvZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MgCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBleGNsdWRlIHJvb3Qgb2JqZWN0IG1ldGhvZHMKLQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSmF2YUxhbmdPYmplY3RNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQl2YWxpZGF0ZUxlZ2FsUk1JVHlwZSh2YywgYmVhbiwgY2xhenopOwotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIGNsYXNzIGlzIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUC4KLQkgKgotCSAqIEphdmEgUmVtb3RlIE1ldGhvZEludm9jYXRpb24KLQkgKiBTcGVjaWZpY2F0aW9uCi0JICoKLQkgKiBSZXZpc2lvbiAxLjcsIEphdmEgMiBTREssIFN0YW5kYXJkIEVkaXRpb24sIHYxLjMuMCwgRGVjZW1iZXIgMTk5OQotCSAqCi0JICogU2VjdGlvbjogMi42Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSVR5cGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShjbGF6eik7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBjbGF6eikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi45Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBUaGUgY2xhc3MgbXVzdCBwcm92aWRlIHN1aXRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoQ29kZSgpIGFuZCAKLQkJLy8gZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJpbWFyeSBrZXlzIAotCQkvLyBieSBjbGllbnQgY29kZS4KLQkJTWV0aG9kIGhhc2hDb2RlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9IQVNIQ09ERSwgbmV3IEphdmFIZWxwZXJzWzBdKTsKLQkJaWYgKChoYXNoQ29kZU1ldGhvZCA9PSBudWxsKSB8fCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBoYXNoQ29kZU1ldGhvZCkpIHsKLQkJCS8vIEVKQiAxLjAgZGlkIG5vdCByZXF1aXJlIHRoaXMgbWV0aG9kLCBzbyB0aGlzIGlzIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIGVycm9yLgotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9EU0lHTkFUVVJFX0hBU0hDT0RFfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlNZXRob2QgZXF1YWxzTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FUVVBTFMsIG5ldyBKYXZhSGVscGVyc1tde1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKX0pOwotCQlpZiAoKGVxdWFsc01ldGhvZCA9PSBudWxsKSB8fCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSmF2YUxhbmdPYmplY3RNZXRob2QoYmVhbiwgZXF1YWxzTWV0aG9kKSkpIHsKLQkJCS8vIEVKQiAxLjAgZGlkIG5vdCByZXF1aXJlIHRoaXMgbWV0aG9kLCBzbyB0aGlzIGlzIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIGVycm9yLgotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9EU0lHTkFUVVJFX0VRVUFMUyB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYzYmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVSZW1vdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyByZW1vdGUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKiBUaGUgY2hlY2tzIGZvciBhIHNlc3Npb24gcmVtb3RlIGludGVyZmFjZSBhbmQgYW4gZW50aXR5IHJlbW90ZSBpbnRlcmZhY2UgYXJlIHRoZSBzYW1lCi0gKiBpbiBFSkIgMS4xLgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqIFNlY3Rpb246IDYuMTAuNSBhbmQgOS4yLjcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZVJlbW90ZSBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzID09IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgaG9tZSBvciBjb21wb25lbnQncyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBFeGNsdWRlIHJvb3QgcmVtb3RlIGludGVyZmFjZSBtZXRob2RzIAotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0VKQk9iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0NsaW5pdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgcmVtb3RlIGludGVyZmFjZSdzIG1ldGhvZHMgYWdhaW5zdCB0aGUgRUpCIDEuMSBzcGVjLgotCSAqIFNlY3Rpb246IDYuMTAuNSBhbmQgOS4yLjcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UocmlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgcmlNZXRob2QpOwotCi0JCS8vIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKLQkJLy8gbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gCi0JCXZhbGlkYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCByaU1ldGhvZCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQkvL1RoZXJlIGFyZSBubyByZXF1aXJlZCBtZXRob2RzLgotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSByZW1vdGUgaW50ZXJmYWNlIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotCSAqIFZlcnNpb246IDEuMQotCSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotCSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0JICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLQkgKiBTZWN0aW9uOiA2LjEwLjUgYW5kIDkuMi43Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gSXQgbXVzdCBiZSBhbiBpbnRlcmZhY2UsIG5vdCBhIGNsYXNzLgotCQlpZiAoIWNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0JCUphdmFIZWxwZXJzIGphdmF4RWpiT2JqZWN0ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QsIGJlYW4pOwotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBqYXZheEVqYk9iamVjdCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogNi4xMC41IGFuZCA5LjIuNwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgcmVtb3RlTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKHJlbW90ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgYmVhbk1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuQ2xhc3MsIHJlbW90ZU1ldGhvZCwgcmVtb3RlTWV0aG9kLmdldE5hbWUoKSk7Ci0JCWlmIChiZWFuTWV0aG9kID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW5DbGFzcy5nZXROYW1lKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgcmVtb3RlTWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUocmVtb3RlTWV0aG9kLmdldFJldHVyblR5cGUoKSkpOwotCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIExldCB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbiBjbGFzcyByZXBvcnQgdGhlIHJlZmxlY3Rpb24gd2FybmluZy4KLQkJCS8vIERvbid0IGRvIGFueSB2YWxpZGF0aW9uIGJhc2VkIG9uIHRoYXQgbWV0aG9kLgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgcmV0dXJuIHR5cGVzIG1hdGNoCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmVtb3RlTWV0aG9kLmdldFJldHVyblR5cGUoKSwgYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIHJlbW90ZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKSwgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0KLQkJLy8gU2VjdGlvbiA2LjEwLjUgKHNlc3Npb24pLCA5LjIuNyAoZW50aXR5KSwgZGVjbGFyZSB0aGF0IGFsbCBleGNlcHRpb25zIGRlY2xhcmVkCi0JCS8vIG9uIHRoZSBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YKLQkJLy8gdGhlIG1hdGNoaW5nIGNyZWF0ZSBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkJLyoKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBleGNlcHRpb25zIGhlcmUgLSBsZXQgdGhlIGJlYW4gY2xhc3MgZG8gaXQuIFdoZW4gdGhlIHJlbW90ZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMocmVtb3RlTWV0aG9kLCBiZWFuTWV0aG9kKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfTUVUSE9EX1RIUk9XX05PVFJJX0VYQ0VQLCBtc2dQYXJtLCBiZWFuTWV0aG9kLCBFSkJfQkVBTl9HUk9VUCk7Ci0JCQl9Ci0JCX0JCi0JCSovCi0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSByZW1vdGUgaW50ZXJmYWNlJ3MgbWV0aG9kcyBhZ2FpbnN0IHRoZSBFSkIgMS4xIHNwZWMuCi0JICogU2VjdGlvbjogNi4xMC41IGFuZCA5LjIuNwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKLQkJLy8gbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgcmlNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5hbCBjaGVjayB0byBzZWUgaWYgcmVxdWlyZWQgbWV0aG9kcyB3ZXJlIGRldGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9UaGVyZSBhcmUgbm8gcmVxdWlyZWQgbWV0aG9kcy4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzUmVtb3RlKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRSZW1vdGUgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudFJlbW90ZSA9IHN1cGVydHlwZS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQotCQkJLy8gUmVtb3RlIGEgWGNoaWxkIG9mIHBhcmVudCBSZW1vdGUKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNSZW1vdGUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRSZW1vdGUpOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc1JlbW90ZSwgcGFyZW50UmVtb3RlKSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc1JlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudFJlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNSZW1vdGUsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRpb25SdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDVkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklFSkJNb2RlbEV4dGVuZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUnVsZSB7Ci0KLSAgICBwcml2YXRlIFNldCBfZGVwZW5kZW50cyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZEhlbHBlciA9IG51bGw7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2FkZERlcGVuZGVudChJVmFsaWRhdGlvblJ1bGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVwZW5kZW50KElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0gICAgICAgIGlmIChydWxlID09IG51bGwpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgaWYgKF9kZXBlbmRlbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIF9kZXBlbmRlbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9kZXBlbmRlbnRzLmFkZChydWxlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2dldERlcGVuZGVudHMoKQotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZ2V0RGVwZW5kZW50cygpIHsKLSAgICAgICAgcmV0dXJuIF9kZXBlbmRlbnRzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RWpiRXh0ZW5zaW9uSGVscGVyKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBFbnRlcnByaXNlQmVhbgotICAgICAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4gcmV0dXJuIHRoZSBzdXBlciB0eXBlIG9mIGFuIEVudGVycHJpc2VCZWFuIGJ5Ci0gICAgICogICAgICAgICBsb2FkaW5nIHRoZSBleHRuZW5zaW9uIHBsdWdpbiBpZiBleHRlbnNpb24gcGx1Z2luIGZhaWxzIHRvIGxvYWQKLSAgICAgKiAgICAgICAgIHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEVudGVycHJpc2VCZWFuIGdldFN1cGVyVHlwZShFbnRlcnByaXNlQmVhbiBlbnRlcnByaXNlQmVhbikgewotICAgICAgICBFbnRlcnByaXNlQmVhbiBzdXBlclR5cGUgPSBudWxsOwotICAgICAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgYU1vZEhlbHBlciA9IGdldEVqYkV4dGVuc2lvbkhlbHBlcihlbnRlcnByaXNlQmVhbik7Ci0gICAgICAgIGlmIChhTW9kSGVscGVyICE9IG51bGwpIHN1cGVyVHlwZSA9IGFNb2RIZWxwZXIuZ2V0U3VwZXJUeXBlKGVudGVycHJpc2VCZWFuKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gRW50ZXJwcmlzZUJlYW4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyAtIHN1cGVyIHR5cGUgZmlsZSBuYW1lIHJldHVybiB0aGUgc3VwZXIgdHlwZSBmaWxlIG9mIGFuCi0gICAgICogICAgICAgICBFbnRlcnByaXNlQmVhbiBieSBsb2FkaW5nIHRoZSBleHRuZW5zaW9uIHBsdWdpbiBpZiBleHRlbnNpb24KLSAgICAgKiAgICAgICAgIHBsdWdpbiBmYWlscyB0byBsb2FkIHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFSkJJbmhlcml0YW5jZUZpbGVOYW1lKCkgewotICAgICAgICBTdHJpbmcgc3VwZXJUeXBlRmlsZU5hbWUgPSBudWxsOwotICAgICAgICAvLyBUT0RPIE1ERSBSZXZpc2l0IHRoaXMgYWZ0ZXIgdGhlIGRyb3AKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGFNb2RIZWxwZXIgPSBnZXRFamJFeHRlbnNpb25IZWxwZXIobnVsbCk7Ci0gICAgICAgIGlmIChhTW9kSGVscGVyICE9IG51bGwpIHN1cGVyVHlwZUZpbGVOYW1lID0gYU1vZEhlbHBlci5nZXRFSkJJbmhlcml0YW5jZUZpbGVOYW1lKCk7Ci0gICAgICAgIHJldHVybiBzdXBlclR5cGVGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gRW50ZXJwcmlzZUJlYW4KLSAgICAgKiBAcmV0dXJuIExpc3QgLSBleHRlbmRlZCByb2xlIG5hbWVzIHJldHVybiB0aGUgZXh0ZW5kZWQgcm9sZSBtZXRob2QgbmFtZQotICAgICAqICAgICAgICAgb2YgYW4gRW50ZXJwcmlzZUJlYW4gYnkgbG9hZGluZyB0aGUgZXh0bmVuc2lvbiBwbHVnaW4gaWYKLSAgICAgKiAgICAgICAgIGV4dGVuc2lvbiBwbHVnaW4gZmFpbHMgdG8gbG9hZCByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBMaXN0IGdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKEVudGVycHJpc2VCZWFuIGVudGVycHJpc2VCZWFuKSB7Ci0gICAgICAgIExpc3Qgcm9sZU5hbWVFeHRlbmRlZCA9IG51bGw7Ci0gICAgICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBhTW9kSGVscGVyID0gZ2V0RWpiRXh0ZW5zaW9uSGVscGVyKGVudGVycHJpc2VCZWFuKTsKLSAgICAgICAgaWYgKGFNb2RIZWxwZXIgIT0gbnVsbCAmJiBlbnRlcnByaXNlQmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkKLSAgICAgICAgICAgICAgICByb2xlTmFtZUV4dGVuZGVkID0gYU1vZEhlbHBlci5nZXRSb2xlTWV0aG9kTmFtZXNFeHRlbmRlZCgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICByZXR1cm4gcm9sZU5hbWVFeHRlbmRlZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBCeSBkZWZhdWx0LCBhbGxvY2F0ZSBub3RoaW5nLgotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcG9zdFZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdFZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkKLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgYXNzdW1lIHRoYXQgbm90aGluZyB3YXMgYWxsb2NhdGVkIGluIHByZVZhbGlkYXRlLgotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgdGhhdCBub3RoaW5nIG5lZWRzIHRvIGJlIHJlc2V0Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y5MmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIEVKQiBWYWxpZGF0aW9uIHJ1bGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkoKSB7Ci0JCS8vRGVmYXVsdAotICAgIH0KLQotICAgIHByb3RlY3RlZCBIYXNoTWFwIF9ydWxlTGlzdCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0gICAgCWlmKHJ1bGUgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgIAkvLyBTaW5jZSB3ZSBkb24ndCBwdXQgYSBsb2NrIG9uIHRoZSBydWxlIHdoZW4gaXQncyBjaGVja2VkIG91dCB2aWEgZ2V0UnVsZShPYmplY3QpLAotICAgIAkvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gb3RoZXIgdGhhbiByZXNldCB0aGUgcnVsZSB0byBwcmVwYXJlIGl0IGZvciByZXVzZS4KLSAgICAJcnVsZS5yZXNldCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJdGVyYXRvciBhZGREZXBlbmRlbnRSdWxlVG9SdWxlTGlzdCgpIHsKLSAgICAJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcnVsZUxpc3QudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQlJVmFsaWRhdGlvblJ1bGUgcnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpaXRlcmF0b3IubmV4dCgpOwotICAgIAkJT2JqZWN0W10gaWRzID0gcnVsZS5nZXREZXBlbmRzT24oKTsKLSAgICAJCWlmKGlkcyA9PSBudWxsKSB7Ci0gICAgCQkJY29udGludWU7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWZvcihpbnQgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykgewotICAgIAkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpX3J1bGVMaXN0LmdldChpZHNbaV0pOwotICAgIAkJCWlmKGRSdWxlICE9IG51bGwpIHsKLSAgICAJCQkJZFJ1bGUuYWRkRGVwZW5kZW50KHJ1bGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nQWxsRGVwZW5kZW50UnVsZXMoKSB7Ci0gICAgCUl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIAlMb2dnZXIgbG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0gICAgCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotICAgIAkJaXRlcmF0b3IgPSBfcnVsZUxpc3QudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAJCUl0ZXJhdG9yIGRlcEl0ZXJhdG9yID0gbnVsbDsKLSAgICAJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLSAgICAJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIAkJCWJ1ZmZlci5hcHBlbmQoImxpc3Qgb2YgZGVwZW5kZW50cyBmb3IgcnVsZToiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWJ1ZmZlci5hcHBlbmQocnVsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWlmKGRlcGVuZGVudHMgIT0gbnVsbCkgewotICAgIAkJCQlkZXBJdGVyYXRvciA9IGRlcGVuZGVudHMuaXRlcmF0b3IoKTsKLSAgICAJCQkJd2hpbGUoZGVwSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQkJCQlJVmFsaWRhdGlvblJ1bGUgZFJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWRlcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJCWJ1ZmZlci5hcHBlbmQoZFJ1bGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIAkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExvZ2dlciBnZXRNc2dMb2dnZXIoKTsKLQotICAgIHByb3RlY3RlZCBFSkJKYXIgZ2V0RUpCSmFyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotICAgIAlyZXR1cm4gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGlkZW50aWZpZWQgSVZhbGlkYXRpb25SdWxlLgotICAgICAqIElmIHRoZSBydWxlaWQgaXMgbm90IHJlZ2lzdGVyZWQsIG9yIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqIGluc3RhbnRpYXRpbmcgdGhlIElWYWxpZGF0aW9uUnVsZSwgdGhlbiBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIElWYWxpZGF0aW9uUnVsZSBnZXRSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotICAgIAkvLyBUbyBhdm9pZCBsb2FkaW5nIGEgcnVsZSB1bnRpbCBpdCBpcyBuZWVkZWQsIGludGlhbGl6ZQotICAgIAkvLyB0aGUgbGlzdCB3aXRoIGEgcnVsZSBpZCBhcyB0aGUga2V5LCBhbmQgYSBTdHJpbmcgY2xhc3MgbmFtZQotICAgIAkvLyBhcyBhIHZhbHVlLiBXaGVuIGEgcnVsZSBpcyBsb2FkZWQsIGlmIHRoZSB2YWx1ZSBpcyBhIFN0cmluZywKLSAgICAJLy8gdGhlbiB0aGUgSVZhbGlkYXRpb25SdWxlIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWQuIENyZWF0ZSBhbgotICAgIAkvLyBpbnN0YW5jZSBhbmQgc3RvcmUgdGhhdCBpbiBwbGFjZSBvZiB0aGUgU3RyaW5nLiBJZiB0aGUgdmFsdWUKLSAgICAJLy8gaXMgYWxyZWFkeSBhbiBJVmFsaWRhdGlvblJ1bGUgaW5zdGFuY2UsIHJldHVybiBpdC4KLSAgICAJCi0gICAgCU9iamVjdCBydWxlID0gX3J1bGVMaXN0LmdldChydWxlSWQpOwotICAgIAlpZihydWxlID09IG51bGwpIHsKLSAgICAJCS8vIE5vIHN1Y2ggcnVsZUlkIHJlZ2lzdGVyZWQuCi0gICAgCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0gICAgCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0gICAgCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlIGZyb20gcnVsZUlkOiAiICsgcnVsZUlkKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJfQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJCi0gICAgCXJldHVybiAoSVZhbGlkYXRpb25SdWxlKXJ1bGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZWVhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI0LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIE1hcCBfdmFsaWRhdGVkID0gbnVsbDsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0RUpCVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQlfdmFsaWRhdGVkID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0VmFsaWRhdGVkTWFwKCl7Ci0JCWlmKCBfdmFsaWRhdGVkID09IG51bGwgKXsKLQkJCV92YWxpZGF0ZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBfdmFsaWRhdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nUnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2Yyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIFRocm93YWJsZSBleGMpIHsKLQkJSU1lc3NhZ2UgbXNzZyA9IHZjLmdldE1lc3NhZ2UoKTsKLQkJbXNzZy5zZXRJZChpbnRlcm5hbEVycm9yTWVzc2FnZSgpKTsKLQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQkJaWYoZXhjICE9IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCByZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmKHZjLmdldFVSSXMoKSA9PSBudWxsKSB7Ci0JCQkJLy8gRnVsbCB2YWxpZGF0aW9uCi0JCQkJdmMucmVtb3ZlQWxsTWVzc2FnZXMoKTsgLy8gUmVtb3ZlIG1lc3NhZ2VzIGZyb20gdGhlIEVKQkphci4KLQkJCQl2Yy5sb2FkTW9kZWwocmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIG51bGx9KTsgLy8gUmVtb3ZlIG1lc3NhZ2VzIGZyb20gYW55IEVKQiBjbGllbnQgSkFSIGZpbGVzIG9yIEphdmEgVXRpbGl0eSBKQVIgZmlsZXMuCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwcmVSZW1vdmVPbGRNZXNzYWdlcyh2Yyx0YXJnZXRzKTsgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldHMgdG8gYmUgdmFsaWRhdGVkLCBhbmQgcmVtb3ZlIG1lc3NhZ2VzIGZyb20gYWxsIG9mIHRoZW0uCi0KLQkJCS8vIFJlbW92ZSB0aGUgbWVzc2FnZXMgZnJvbSBhbGwgb2YgdGhlIGNoYW5nZWQgZmlsZXMgYW5kIHRoZWlyIGRlcGVuZGVudHMuCi0JCQl2Yy5sb2FkTW9kZWwocmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIHRhcmdldHN9KTsKLQkJCXJldHVybiB0YXJnZXRzOwotCQl9Ci0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHBhcmFtIHRhcmdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVSZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW92ZU9sZE1lc3NhZ2VzU3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JKiBAcmV0dXJuCi0JKi8KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSUhlbHBlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQkJc3VwZXIudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVmFsaWRhdGlvblJ1bGUgcnVsZSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZihpc1ZhbGlkYXRlZChydWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KSkgewotICAgIAkJLy8gV2hldGhlciBvciBub3QgdGhpcyBpcyBhIGZ1bGwgb3IgaW5jcmVtZW50YWwgcnVuLCBkb24ndCByZXZhbGlkYXRlIHRoaXMgdGFyZ2V0Ci0gICAgCQkvLyBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZC4gKGUuZy4gaWYgYSBjbGFzcyBpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgYmVhbiwKLSAgICAJCS8vIGFuZCBzYXkgb25lIGJlYW4gaXMgc3RhdGVsZXNzIGFuZCBvbmUgaXMgc3RhdGVmdWwsIGFuZCBldmVyeXRoaW5nIGVsc2UgYWJvdXQgdGhlCi0gICAgCQkvLyBiZWFucyBhcmUgaWRlbnRpY2FsLCBkb24ndCB2YWxpZGF0ZSB0aGF0IGNsYXNzIGFnYWluLikKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJdHJ5IHsKLSAgICAJCXJ1bGUucHJlVmFsaWRhdGUoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAkJcnVsZS52YWxpZGF0ZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCQlydWxlLnBvc3RWYWxpZGF0ZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCX0KLSAgICAJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0gICAgCX0KLSAgICAJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgCQl0aHJvdyBlOwotICAgIAl9Ci0gICAgCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLSAgICAJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIGV4Yyk7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlzZXRWYWxpZGF0ZWQocnVsZS5nZXRJZCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCQlyZWxlYXNlUnVsZXMocnVsZSk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcnVsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbGVhc2VSdWxlcyhJVmFsaWRhdGlvblJ1bGUgcnVsZSk7IAotCi0gICAgcHJpdmF0ZSBJRUpCVmFsaWRhdGlvbkNvbnRleHQgX3ZjID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBJRUpCVmFsaWRhdGlvbkNvbnRleHQgZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSB7Ci0gICAgCXJldHVybiBfdmM7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbGlkYXRpb25Db250ZXh0KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotICAgIAlfdmMgPSB2YzsKLSAgICB9Ci0JCi0JLyoqCi0JICogIFRoaXMgY2xhc3MgaXMgcHVibGljIG9ubHkgZm9yIHRoZSBFSkJIZWxwZXIuCi0JICovCi0JcHVibGljIGNsYXNzIFRhcmdldE9iamVjdCB7Ci0JCXByaXZhdGUgT2JqZWN0IF9wYXJlbnQgPSBudWxsOwotCQlwcml2YXRlIE9iamVjdCBfdGFyZ2V0ID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBUYXJnZXRPYmplY3QoKSB7Ci0JCQkvL0RlZmF1bHQKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRUYXJnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gX3BhcmVudDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gX3RhcmdldDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0UGFyZW50KE9iamVjdCB0cCkgewotCQkJX3BhcmVudCA9IHRwOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHQpIHsKLQkJCV90YXJnZXQgPSB0OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IHBhcmVudCA9IChnZXRUYXJnZXRQYXJlbnQoKSA9PSBudWxsKSA/IDAgOiBnZXRUYXJnZXRQYXJlbnQoKS5oYXNoQ29kZSgpOwotCQkJaW50IHRhcmdldCA9IChnZXRUYXJnZXQoKSA9PSBudWxsKSA/IDAgOiBnZXRUYXJnZXQoKS5oYXNoQ29kZSgpOwotCQkJcmV0dXJuIHBhcmVudCArIHRhcmdldDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZihvID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmKHRoaXMgPT0gbykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlpZighKG8gaW5zdGFuY2VvZiBUYXJnZXRPYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlPYmplY3QgdGhpc1BhcmVudCA9IHRoaXMuZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQlPYmplY3Qgb1BhcmVudCA9ICgoVGFyZ2V0T2JqZWN0KW8pLmdldFRhcmdldFBhcmVudCgpOwotCQkJT2JqZWN0IHRoaXNUYXJnZXQgPSB0aGlzLmdldFRhcmdldCgpOwotCQkJT2JqZWN0IG9UYXJnZXQgPSAoKFRhcmdldE9iamVjdClvKS5nZXRUYXJnZXQoKTsKLQkJCQotCQkJaWYoKHRoaXNQYXJlbnQgPT0gbnVsbCkgJiYgKG9QYXJlbnQgPT0gbnVsbCkpIHsKLQkJCQkvLyBjaGVjayB0YXJnZXQKLQkJCX0KLQkJCWVsc2UgaWYoKHRoaXNQYXJlbnQgIT0gbnVsbCkgJiYgKG9QYXJlbnQgIT0gbnVsbCkpIHsKLQkJCQlpZih0aGlzUGFyZW50LmVxdWFscyhvUGFyZW50KSkgewotCQkJCQkvLyBjaGVjayB0YXJnZXQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmKCh0aGlzVGFyZ2V0ID09IG51bGwpICYmIChvVGFyZ2V0ID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKCh0aGlzVGFyZ2V0ICE9IG51bGwpICYmIChvVGFyZ2V0ICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuICh0aGlzVGFyZ2V0LmVxdWFscyhvVGFyZ2V0KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlZChPYmplY3Qga2V5LCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgCVNldCBkb25lID0gbnVsbDsKLSAgICAJaWYoZ2V0VmFsaWRhdGVkTWFwKCkuY29udGFpbnNLZXkoa2V5KSkgewotICAgIAkJZG9uZSA9IChTZXQpZ2V0VmFsaWRhdGVkTWFwKCkuZ2V0KGtleSk7Ci0gICAgCX0KLSAgICAJZWxzZSB7Ci0gICAgCQlkb25lID0gbmV3IEhhc2hTZXQoKTsKLSAgICAJfQotICAgIAkKLSAgICAJZG9uZS5hZGQoZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLmdldFRhcmdldE9iamVjdCh0YXJnZXRQYXJlbnQsIHRhcmdldCkpOwotICAgIAlnZXRWYWxpZGF0ZWRNYXAoKS5wdXQoa2V5LCBkb25lKTsKLSAgICB9Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBUYXJnZXRPYmplY3RQb29sIHsKLQkJcHJpdmF0ZSBpbnQgX2dyb3dTaXplID0gMDsKLQkJcHJpdmF0ZSBWZWN0b3IgX3Bvb2wgPSBudWxsOwotCQkKLQkJcHVibGljIFRhcmdldE9iamVjdFBvb2woaW50IGluaXRpYWxTaXplKSB7Ci0JCQlfZ3Jvd1NpemUgPSBpbml0aWFsU2l6ZTsKLQkJCV9wb29sID0gbmV3IFZlY3Rvcihpbml0aWFsU2l6ZSwgX2dyb3dTaXplKTsKLQkJCWdyb3coKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGdyb3coKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxfZ3Jvd1NpemU7IGkrKykgewotCQkJCV9wb29sLmFkZChuZXcgVGFyZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgVGFyZ2V0T2JqZWN0IGdldFRhcmdldE9iamVjdChPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0JCQlpZihfcG9vbC5zaXplKCkgPD0gMCkgewotCQkJCWdyb3coKTsKLQkJCX0KLQkJCVRhcmdldE9iamVjdCBvYmogPSAoVGFyZ2V0T2JqZWN0KV9wb29sLnJlbW92ZSgwKTsKLQkJCW9iai5zZXRUYXJnZXRQYXJlbnQodGFyZ2V0UGFyZW50KTsKLQkJCW9iai5zZXRUYXJnZXQodGFyZ2V0KTsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbGVhc2UoVGFyZ2V0T2JqZWN0IG9iaikgewotCQkJb2JqLnNldFRhcmdldFBhcmVudChudWxsKTsKLQkJCW9iai5zZXRUYXJnZXQobnVsbCk7Ci0JCQlfcG9vbC5hZGQob2JqKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFyZ2V0T2JqZWN0UG9vbCBnZXRUYXJnZXRPYmplY3RQb29sKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlZChPYmplY3Qga2V5LCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgCWlmKCFnZXRWYWxpZGF0ZWRNYXAoKS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAKLSAgICAKLSAgICAJU2V0IGRvbmUgPSAoU2V0KWdldFZhbGlkYXRlZE1hcCgpLmdldChrZXkpOwotICAgIAlUYXJnZXRPYmplY3QgdGVtcCA9IGdldFRhcmdldE9iamVjdFBvb2woKS5nZXRUYXJnZXRPYmplY3QodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAl0cnkgewotICAgIAkJaWYoZG9uZS5jb250YWlucyh0ZW1wKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAkJCi0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlnZXRUYXJnZXRPYmplY3RQb29sKCkucmVsZWFzZSh0ZW1wKTsKLSAgICAJfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotICAgIAlpZiggX3ZhbGlkYXRlZCAhPSBudWxsICl7Ci0JICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0ZWQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkgICAgCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAJCVNldCBkb25lID0gKFNldClfdmFsaWRhdGVkLmdldChpdGVyYXRvci5uZXh0KCkpOwotCSAgICAJCUl0ZXJhdG9yIHRvSXRlcmF0b3IgPSBkb25lLml0ZXJhdG9yKCk7Ci0JICAgIAkJd2hpbGUodG9JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCl0b0l0ZXJhdG9yLm5leHQoKTsKLQkgICAgCQkJZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLnJlbGVhc2UodG8pOwotCSAgICAJCX0KLQkgICAgCQlkb25lLmNsZWFyKCk7Ci0JICAgIAl9Ci0JICAgIAlfdmFsaWRhdGVkLmNsZWFyKCk7Ci0JICAgIAlfdmFsaWRhdGVkID0gbnVsbDsKLSAgICAJfQotICAgIAlzZXRWYWxpZGF0aW9uQ29udGV4dChudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3M2I3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC85LzIwMDEgMTE6NDk6NDcgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX01PREVMX05BTUUgPSAiQVBQTElDQVRJT05DTElFTlRfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0REID0gIklOVkFMSURfREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUpCX1JFRlMgPSAiRVJST1JfRUpCX1JFRlMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05DTElFTlRfVkFMSURBVE9SX0lEID0gIkFQUExJQ0FUSU9OQ0xJRU5UX1ZBTElEQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BUFBDTElFTlRfSU5WQUxJRF9BUFBDTElFTlRfRklMRSA9ICJFUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVBQQ0xJRU5UX01JU1NJTkdfVVJJID0gIk1FU1NBR0VfQVBQQ0xJRU5UX01JU1NJTkdfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0FQUENMSUVOVF9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0wgPSAiQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0wiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkUgPSAiQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX0NBTk5PVF9PUEVOX0REID0gIkFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRERfUEFSU0VfTk9JTkZPID0gIkFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0RVUF9SRVNfRU5WX1JFRl9FUlJPUl8gPSAiQVBQQ0xJRU5UX0RVUF9SRVNfRU5WX1JFRl9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0RVUF9FSkJfUkVGX0VSUk9SXyA9ICJBUFBDTElFTlRfRFVQX0VKQl9SRUZfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9NQUlOX0NMQVNTX0VSUk9SXyA9ICJBUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl8iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY4NDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuVmFsaWRhdGVYbWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBhcHBsaWNhdGluLWNsaWVudC54bWwKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERDsKLQkKLQkvKioKLSAJICogQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLSAJICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0vLyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcgotCQotCS8qKgotIAkgKiA8cD5BbnN3ZXIgdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggaXMKLSAJICogdXNlZCBieSB0aGUgcmVjZWl2ZXIuPC9wPgotIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gQVBMSUNBVElPTkNMSUVOVF9DQVRFR09SWTsKLQl9Ly8gZ2V0QmFzZU5hbWUKLQkKLQkvKioKLQkgKiAgWE1MIFZhbGlkYXRvciBub3cgaGFuZGxlcyB2YWxpZGF0aW9uIG9mIERlcGxveW1lbnQgRGVzY3JpcHRvcgotCSAqIAotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCSAgdmFsaWRhdGVNYWluQ2xhc3NJbk1hbmlmZXN0KCk7Ci0JfS8vIHZhbGlkYXRlCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1haW5DbGFzc0luTWFuaWZlc3QoKSB7Ci0KLQkJaWYgKGFwcENsaWVudEZpbGUgIT0gbnVsbCAmJiBhcHBDbGllbnRGaWxlLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1haW5DbGFzcyA9IGFwcENsaWVudEZpbGUuZ2V0TWFuaWZlc3QoKS5nZXRNYWluQ2xhc3MoKTsKLQkJCWlmIChtYWluQ2xhc3MgPT0gbnVsbCB8fCBtYWluQ2xhc3MubGVuZ3RoKCkgPT0gMCkgewotCQkJCU9iamVjdCB0YXJnZXQgPSBnZXRNYW5pZmVzdFRhcmdldCgpOwotCQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIEFQUENMSUVOVF9NQUlOX0NMQVNTX0VSUk9SXywgbmV3IFN0cmluZ1swXSwgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNYW5pZmVzdFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikKLQkgIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCXZhbGlkYXRlSW5Kb2IoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCX0vLyB2YWxpZGF0ZQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRlIHhtbCBjb21tYW5kLgotCSAqIAotCSAqIEByZXR1cm4gQ29tbWFuZAotCSAqLwkKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVWYWxpZGF0ZVhNTENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFZhbGlkYXRlWG1sQ29tbWFuZChhcHBDbGllbnRGaWxlKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ly8gY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgYXBwQ2xpZW50RmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50RmlsZQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgZ2V0QXBwQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGFwcENsaWVudEZpbGU7Ci0JfS8vIGdldEFwcENsaWVudEZpbGUKLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcENsaWVudEZpbGUuCi0JICogCi0JICogQHBhcmFtIEFwcGxpY2F0b25DbGllbnRGaWxlIGFwcENsaWVudEZpbGUgLSBUaGUgYXBwQ2xpZW50RmlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBDbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlKSB7Ci0JCXRoaXMuYXBwQ2xpZW50RmlsZSA9IGFwcENsaWVudEZpbGU7Ci0JfS8vIHNldEFwcENsaWVudEZpbGUKLQotCS8qKgotCSAqIEdldHMgdGhlIGFwcENsaWVudERELgotCSAqIAotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwQ2xpZW50REQoKSB7Ci0JCXJldHVybiBhcHBDbGllbnRERDsKLQl9Ly8gZ2V0QXBwQ2xpZW50REQKLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcENsaWVudERELgotCSAqIAotCSAqIEBwYXJhbSBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERCAtIFRoZSBhcHBDbGllbnRERCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBDbGllbnRERChBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERCkgewotCQl0aGlzLmFwcENsaWVudEREID0gYXBwQ2xpZW50REQ7Ci0JfS8vIHNldEFwcENsaWVudERECi0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgCi0JIAkJdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlzdXBlci52YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJCV9yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBudWxsKTsgCi0JCQkKLQkJCXNldEFwcENsaWVudEZpbGUoIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGluSGVscGVyLmxvYWRNb2RlbChBUFBDTElFTlRfTU9ERUxfTkFNRSkgKTsKLQkJCWlmICggYXBwQ2xpZW50RmlsZSAhPSBudWxsICkgewotCQkJCXNldEFwcENsaWVudEREKCBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0FQUENMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFKTsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCQl9Ly8gaWYKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0FQUENMSUVOVF9WQUxJREFUSU9OX0ZBSUxFRCk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCX0vLyB0cnkgCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWFwcENsaWVudEREID0gbnVsbDsKLQkJYXBwQ2xpZW50RmlsZSA9IG51bGw7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCX0JCi19Ly8gQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjA3YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBRW50aXR5QmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYmIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRU5USVRZQkVBTn07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NPTlNUUlVDVE9SX05PUEFSTSwgRUpCRklOREJZUFJJTUFSWUtFWSwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQlBPU1RDUkVBVEUsIEVKQkhPTUUsIEZJTkFMSVpFX05PUEFSTSwgRUpCRklOREJZUFJJTUFSWUtFWSwgRUpCRklORCwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNLCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJDcmVhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiRmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlNlbGVjdCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJGaW5kK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBvc3RDcmVhdGUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMrU1BFQ30pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDExLCBuZXcgU3RyaW5nW117Q0hLSjI0MTErQkVYVCwgQ0hLSjI0MTErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIxLCBuZXcgU3RyaW5nW117Q0hLSjI0MjErQkVYVCwgQ0hLSjI0MjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMitCRVhULCBDSEtKMjQyMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMywgbmV3IFN0cmluZ1tde0NIS0oyNDIzK0JFWFQsIENIS0oyNDIzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI0LCBuZXcgU3RyaW5nW117Q0hLSjI0MjQrQkVYVCwgQ0hLSjI0MjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNitCRVhULCBDSEtKMjQyNitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMCwgbmV3IFN0cmluZ1tde0NIS0oyNDMwK0JFWFQsIENIS0oyNDMwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU3LCBuZXcgU3RyaW5nW117Q0hLSjI0NTcrQkVYVCwgQ0hLSjI0NTcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1OCtCRVhULCBDSEtKMjQ1OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1OSwgbmV3IFN0cmluZ1tde0NIS0oyNDU5K0JFWFQsIENIS0oyNDU5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkyLCBuZXcgU3RyaW5nW117Q0hLSjI0OTIrQkVYVCwgQ0hLSjI0OTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZmluYWxpemUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9maW5hbGl6ZStCRVhULCBDSEtKMjUwMl9maW5hbGl6ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwM19lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkhvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJIb21lK0JFWFQsIENIS0oyNTAzX2VqYkhvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkZpbmQrQkVYVCwgQ0hLSjI1MDNfZWpiRmluZCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFCZWFuQ2xhc3NWUnVsZSNmb2xsb3dFamJDcmVhdGVSZXR1cm5UeXBlUnVsZXMoTWV0aG9kKQotCSAqLwotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKHJldFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWTsKLQkJfQotCQlyZXR1cm4gcmV0VHlwZS5nZXRKYXZhTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkZJTkQpID09IEVKQkZJTkQpIHsKLQkJCXZhbGlkYXRlRWpiRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQl2YWxpZGF0ZUVqYkhvbWVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkNyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJGSU5EKSA9PSBFSkJGSU5EKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJGaW5kTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCSE9NRSkgPT0gRUpCSE9NRSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiSG9tZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4KLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vICMgZWpiRmluZCBtZXRob2RzCi0JCS8vIElXQUQ0NTAyID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3Qgb24gdGhpcyBjbGFzcy4gUmVhZCBzZWN0aW9uIDEwLjUuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDUwNyA9IFRoZSBjb250YWluZXIgcHJvdmlkZXMgdGhlIGVqYkZpbmQgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIGNvdmVyZWQgYnkgdGhlICJtdXN0IG5vdCBleGlzdCIgY29kZT8KLQkJCi0JCS8vIElXQUQ0MzA1ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCQotCQkvLyBJV0FENDMwNiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQzMDcgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQzMDggPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBmYWxzZSk7IC8vIGRvIG5vdCBjaGVjayBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgc2VyaWFsaXphYmxlCi0JCQotCQkvLyBJV0FENDMwOSA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxMiA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlKYXZhSGVscGVycyByZXRUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUobWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCUphdmFIZWxwZXJzIGtleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJaWYoIShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldFR5cGUsIGJlYW4pIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXRUeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXRUeXBlLCBrZXkpCi0JCSAgICkpIHsKLQkJICAgCVN0cmluZyBrZXlOYW1lID0gKGtleSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWSA6IGtleS5nZXRKYXZhTmFtZSgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtrZXlOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0Mjg1ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTY4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC41LjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDMxMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuNSwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiRmluZCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QS2V5Q2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDkxYThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUEtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBS2V5Q2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJUmVtb3RlVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmtiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0hBU0hDT0RFX05PUEFSTSwgRVFVQUxTfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBIQVNIQ09ERV9OT1BBUk0sIEVRVUFMUywgQ09OU1RSVUNUT1IsIENPTlNUUlVDVE9SX05PUEFSTX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfaGFzaENvZGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9oYXNoQ29kZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VxdWFscywgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VxdWFscytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCS8vIEtleSBtZXRob2RzIGFyZSBub3QgY2hlY2tlZCBmb3IgUmVtb3RlRXhjZXB0aW9uLCBidXQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBWUnVsZXMuLi4KLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuICgoRW50aXR5KXBhcmVudCkuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNsYXNzVlJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBFbnRlcnByaXNlQmVhbiwgSmF2YUNsYXNzLCBNZXRob2QpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgcGFyZW50LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uIG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgKG90aGVyIHRoYW4gdGhlCi0JCS8vIHZhbGlkYXRpb24gcGVyZm9ybWVkIGluIEFLZXlDbGFzc1ZSdWxlJ3MgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgaGFzaENvZGUoKQotCQkvLyBhbmQgZXF1YWxzKE9iamVjdCkKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNsYXNzVlJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBFbnRlcnByaXNlQmVhbiwgSmF2YUNsYXNzLCBGaWVsZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZEV4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBEbyBub3QgcGVyZm9ybSBhbnkgdmFsaWRhdGlvbiBvbiB0aGUgZmllbGRzIG9mIHRoZSBCTVAga2V5IGNsYXNzCi0JCWxvbmcgZmllbGRUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0RmllbGRUeXBlSWQoYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJaWYoKGZpZWxkVHlwZSAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VSSUFMVkVSU0lPTlVJRCkgewotCQkJdmFsaWRhdGVTZXJpYWxWZXJzaW9uVUlEKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWYwNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUExvY2FsQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSUxvY2FsVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5ibGMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCSAKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2dldERlcGVuZHNPbigpCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNnZXRJZCgpCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0TWVzc2FnZUlkcygpCi0JICovCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjQxOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBMb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFCTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJRUpCVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W10geyBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTIH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYmxoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW10geyBKQVZBWF9FSkJfRUpCTE9DQUxIT01FIH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW10geyBGSU5EQllQUklNQVJZS0VZLCBGSU5EIH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tdIHtDTElOSVQsIENSRUFURSwgRklOREJZUFJJTUFSWUtFWSwgRklORCwgSE9NRSB9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tdIHtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tdIHtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2MitCRVhULCBDSEtKMjQ2MitNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDYzK0JFWFQsIENIS0oyNDYzK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjQrQkVYVCwgQ0hLSjI0NjQrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVCB9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NzcrQkVYVCwgQ0hLSjI0NzcrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXSB7IENIS0oyNDc5K0JFWFQsIENIS0oyNDc5K01FWFQgfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDNfZmluZCtCRVhULCBDSEtKMjUwM19maW5kK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwM19ob21lK0JFWFQsIENIS0oyNTAzX2hvbWUrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDRfZmluZCtCRVhULCBDSEtKMjUwNF9maW5kK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwNF9ob21lK0JFWFQsIENIS0oyNTA0X2hvbWUrTUVYVCB9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2NzE2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUFJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJyYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzMzk4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBSZW1vdGVIb21lVlJ1bGUgZXh0ZW5kcyBBQk1QSG9tZVZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5icmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkRCWVBSSU1BUllLRVksIEZJTkR9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURSwgRklOREJZUFJJTUFSWUtFWSwgRklORCwgSE9NRX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MitCRVhULCBDSEtKMjQ2MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tde0NIS0oyNDYzK0JFWFQsIENIS0oyNDYzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW117Q0hLSjI0NjQrQkVYVCwgQ0hLSjI0NjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW117Q0hLSjI0NzcrQkVYVCwgQ0hLSjI0NzcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tde0NIS0oyNDc5K0JFWFQsIENIS0oyNDc5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZmluZCtCRVhULCBDSEtKMjUwM19maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19ob21lK0JFWFQsIENIS0oyNTAzX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfZmluZCtCRVhULCBDSEtKMjUwNF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9ob21lK0JFWFQsIENIS0oyNTA0X2hvbWUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBCZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdhZTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBCZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFFbnRpdHlCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FTlRJVFlCRUFOfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0xPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0UsIFJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFfTsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDT05TVFJVQ1RPUl9OT1BBUk0sIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCRklORCwgRklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ09OU1RSVUNUT1JfTk9QQVJNLCBDT05TVFJVQ1RPUiwgRUpCQ1JFQVRFLCBFSkJQT1NUQ1JFQVRFLCBFSkJIT01FLCBGSU5BTElaRV9OT1BBUk0sIEVKQkZJTkQsIEFDQ0VTU09SLCBFSkJGSU5EQllQUklNQVJZS0VZLCBTRVRFTlRJVFlDT05URVhULCBVTlNFVEVOVElUWUNPTlRFWFRfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkxPQURfTk9QQVJNLCBFSkJTVE9SRV9OT1BBUk0sIEVKQlNFTEVDVCwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBBZGQgdGhlc2UgY2hlY2tzIGluIHRoZSBjb2RlIGxhdGVyCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MSwgbmV3IFN0cmluZ1tde0NIS0oyNDgxK0JFWFQsIENIS0oyNDgxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDgyLCBuZXcgU3RyaW5nW117Q0hLSjI0ODIrQkVYVCwgQ0hLSjI0ODIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MytCRVhULCBDSEtKMjQ4MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NCwgbmV3IFN0cmluZ1tde0NIS0oyNDg0K0JFWFQsIENIS0oyNDg0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg5LCBuZXcgU3RyaW5nW117Q0hLSjI0ODkrQkVYVCwgQ0hLSjI0ODkrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjIwNStCRVhULCBDSEtKMjIwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNiwgbmV3IFN0cmluZ1tde0NIS0oyMjA2K0JFWFQsIENIS0oyMjA2K01FWFR9KTsKLQkJLy8gZW5kIGFkZCBsYXRlcgotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2FjYywgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2FjYytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3NldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJBY3RpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkFjdGl2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiTG9hZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkxvYWQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTdG9yZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlN0b3JlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU2VsZWN0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUG9zdENyZWF0ZStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMwLCBuZXcgU3RyaW5nW117Q0hLSjI0MzArQkVYVCwgQ0hLSjI0MzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDksIG5ldyBTdHJpbmdbXXtDSEtKMjQ0OStCRVhULCBDSEtKMjQ0OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUwLCBuZXcgU3RyaW5nW117Q0hLSjI0NTArQkVYVCwgQ0hLSjI0NTArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NCtCRVhULCBDSEtKMjQ1NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MCtCRVhULCBDSEtKMjQ4MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NSwgbmV3IFN0cmluZ1tde0NIS0oyNDg1K0JFWFQsIENIS0oyNDg1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg2LCBuZXcgU3RyaW5nW117Q0hLSjI0ODYrQkVYVCwgQ0hLSjI0ODYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4NytCRVhULCBDSEtKMjQ4NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4OCwgbmV3IFN0cmluZ1tde0NIS0oyNDg4K0JFWFQsIENIS0oyNDg4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MitCRVhULCBDSEtKMjQ5MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MywgbmV3IFN0cmluZ1tde0NIS0oyNDkzK0JFWFQsIENIS0oyNDkzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk0LCBuZXcgU3RyaW5nW117Q0hLSjI0OTQrQkVYVCwgQ0hLSjI0OTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NitCRVhULCBDSEtKMjQ5NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NywgbmV3IFN0cmluZ1tde0NIS0oyNDk3K0JFWFQsIENIS0oyNDk3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiSG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkhvbWUrQkVYVCwgQ0hLSjI1MDBfZWpiSG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9maW5hbGl6ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2ZpbmFsaXplK0JFWFQsIENIS0oyNTAyX2ZpbmFsaXplK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJGaW5kK0JFWFQsIENIS0oyNTAyX2VqYkZpbmQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJIb21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiSG9tZStCRVhULCBDSEtKMjUwM19lamJIb21lK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKLQkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gTkVJVEhFUjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgY21wKTsKLQkJCX0KLQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMuLi4uCi0JCQkJLy8gbGV0IHRoaXMgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IChnZXRQcmltYXJ5S2V5KCkpCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKHJldFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWTsKLQkJfQotCQlyZXR1cm4gcmV0VHlwZS5nZXRKYXZhTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCQotCQkvLyAxMC4zLjEsIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbnQgZmllbGRzIGFuZCBjb250YWluZXItbWFuYWdlZCByZWxhdGlvbnNoaXAgCi0JCS8vIGZpZWxkcyBtdXN0ICpub3QqIGJlIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLiAKLQkJTGlzdCBjbXJGaWVsZHMgPSBjbXAuZ2V0Q01SRmllbGRzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY21yRmllbGRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01SRmllbGQgY21yRmllbGQgPSAoQ01SRmllbGQpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoKGNtckZpZWxkICE9IG51bGwpICYmICghY21yRmllbGQuaXNEZXJpdmVkKCkpKSB7Ci0JCQkJdmFsaWRhdGVDbXJGaWVsZCh2YywgY21wLCBjbGF6eiwgY21yRmllbGQpOwotCQkJfQotCQl9Ci0JCQotCQlMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBmaWx0ZXIgPSBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKTsKLQkJZmlsdGVyLmVuYWJsZUNhY2hlKHRydWUpOwotCQlMaXN0IGNtcEZpZWxkcyA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKGZpbHRlcik7Ci0JCWlmKGNtcEZpZWxkcyAhPSBudWxsICYmICFjbXBGaWVsZHMuaXNFbXB0eSgpKSB7Ci0JCWl0ZXJhdG9yID0gY21wRmllbGRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01QQXR0cmlidXRlIGNtcEZpZWxkID0gKENNUEF0dHJpYnV0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigoY21wRmllbGQgIT0gbnVsbCkgJiYgKCFjbXBGaWVsZC5pc0Rlcml2ZWQoKSkpIHsKLQkJCQl2YWxpZGF0ZUNtcEZpZWxkKHZjLCBjbXAsIGNsYXp6LCBjbXBGaWVsZCk7Ci0JCQl9Ci0JCSAgfQotCQl9Ci0JCWZpbHRlci5jbGVhckNhY2hlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQ3JlYXRlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUVqYlNlbGVjdE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBwYXJlbnQsIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyAjIGVqYlNlbGVjdDxNRVRIT0Q+IGNoZWNrcwotCQkvLyBJV0FENDE1NCA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTAuNS4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0NTAyID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3Qgb24gdGhpcyBjbGFzcy4gUmVhZCBzZWN0aW9uIDEwLjUuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDE5NyA9IEFuIGVqYlNlbGVjdCBtZXRob2QgbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEwLjYuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkKLQkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiwgYmVhbik7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpICYmCi0JCQkhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSwgamF2YVV0aWxDb2xsZWN0aW9uKSApIHsKLQkJCS8vIElXQUQ0MTYwID0gVHlwZSB7MH0gY2Fubm90IGJlIHJldHVybmVkIGJ5IGEgc2VsZWN0IG1ldGhvZC4gUmVhZCBzZWN0aW9uIDEwLjUuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDg2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDE5OCA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighbWV0aG9kLmlzQWJzdHJhY3QoKSkgewotCQkJLy8gSVdBRDQxOTkgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0LiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDE1OCA9IHswfSBtdXN0IGJlIGFic3RyYWN0LiBSZWFkIHNlY3Rpb24gMTAuNS43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDIwMCA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjYuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDg4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDI4NSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmF4LmVqYi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjEuOC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDE2OCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIENoZWNrIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLgotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NvY2lhdGVkV2l0aFF1ZXJ5KGNtcCwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDk2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ21wRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgSmF2YUNsYXNzIGNsYXp6LCBDTVBBdHRyaWJ1dGUgYXR0cmliKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGF0dHJpYi5nZXROYW1lKCk7Ci0JCWlmKChmaWVsZE5hbWUgPT0gbnVsbCkgfHwgKGZpZWxkTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBsZXQgdGhlIEVKQkphclZSdWxlIHJlcG9ydCB0aGlzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCFDaGFyYWN0ZXIuaXNMb3dlckNhc2UoZmllbGROYW1lLmNoYXJBdCgwKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgY2xhenosIGF0dHJpYi5nZXRGaWVsZCgpLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIFNlY3Rpb24gMTAuOC4zCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbmtub3duUHJpbWFyeUtleShhdHRyaWIpKSB7Ci0JCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBjbXAuZ2V0RWpiQ2xhc3MoKTsKLQkJCU1ldGhvZCBnZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGF0dHJpYi5nZXRHZXR0ZXJOYW1lKCksIG5ldyBKYXZhSGVscGVyc1swXSwgYXR0cmliLmdldFR5cGUoKSk7Ci0JCQlpZihnZXRNZXRob2QgPT0gbnVsbCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9hY2MsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBjbGF6eiwgbmV3IFN0cmluZ1tde2F0dHJpYi5nZXRHZXR0ZXJOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsaWRhdGVDTVBBY2Nlc3Nvck1ldGhvZCh2YywgY21wLCBjbGF6eiwgZ2V0TWV0aG9kLCBhdHRyaWIpOwotCQkJfQotCQkJCi0JCQlKYXZhSGVscGVyc1tdIHNldE1ldGhvZFBhcm1zID0gbmV3IEphdmFIZWxwZXJzW117YXR0cmliLmdldFR5cGUoKX07Ci0JCQlNZXRob2Qgc2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGVqYkNsYXNzLCBhdHRyaWIuZ2V0U2V0dGVyTmFtZSgpLCBzZXRNZXRob2RQYXJtcyk7Ci0JCQlpZihzZXRNZXRob2QgPT0gbnVsbCkgewotCQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gYXR0cmliLmdldFNldHRlck5hbWUoKSArICIoIiArIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRQYXJtc0FzU3RyaW5nKHNldE1ldGhvZFBhcm1zKSArICIpIjsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9hY2MsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBjbGF6eiwgbmV3IFN0cmluZ1tde3NldHRlck5hbWV9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsaWRhdGVDTVBBY2Nlc3Nvck1ldGhvZCh2YywgY21wLCBjbGF6eiwgc2V0TWV0aG9kLCBhdHRyaWIpOwotCQkJfQotCQl9Ci0KLQkJRmllbGQgZmllbGQgPSBhdHRyaWIuZ2V0RmllbGQoKTsKLQkJaWYgKChmaWVsZCAhPSBudWxsKSAmJiAoY2xhenouZ2V0RmllbGRFeHRlbmRlZChhdHRyaWIuZ2V0TmFtZSgpKSAhPSBudWxsKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDU0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBjbGF6eiwgZmllbGQsIG5ldyBTdHJpbmdbXXthdHRyaWIuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbXJGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBKYXZhQ2xhc3MgY2xhenosIENNUkZpZWxkIGNtckZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNtckZpZWxkLmdldE5hbWUoKTsKLQkJaWYoKGZpZWxkTmFtZSA9PSBudWxsKSB8fCAoZmllbGROYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGxldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIUNoYXJhY3Rlci5pc0xvd2VyQ2FzZShmaWVsZE5hbWUuY2hhckF0KDApKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDgwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgY21wLCBjbGF6eiwgY21yRmllbGQuZ2V0RmllbGQoKSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBjbXAuZ2V0RWpiQ2xhc3MoKTsKLQkJSmF2YUhlbHBlcnMgbG9jYWxUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldENNUkZpZWxkVHlwZSh2YywgY21wLCBjbGF6eiwgY21yRmllbGQpOwotCQlpZihsb2NhbFR5cGUgPT0gbnVsbCkgewotCQkJLy8gdXNlciBtYWRlIGEgbWlzdGFrZSBpbiBlamItamFyLnhtbCBieSB0cnlpbmcgdG8gY3JlYXRlIGEgcmVsYXRpb24KLQkJCS8vIHRvIGEgQ01QIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGxvY2FsIGludGVyZmFjZS4KLQkJCS8vIERvbid0IHJlcG9ydCBhbiBlcnJvciBoZXJlOyBsZXQgdGhlIEREIHZhbGlkYXRpb24gcmVwb3J0IHRoZSBlcnJvci4KLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2QgZ2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGVqYkNsYXNzLCBjbXJGaWVsZC5nZXRHZXR0ZXJOYW1lKCksIG5ldyBKYXZhSGVscGVyc1swXSwgbG9jYWxUeXBlKTsKLQkJaWYoZ2V0TWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9hY2MsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBjbGF6eiwgbmV3IFN0cmluZ1tde2NtckZpZWxkLmdldEdldHRlck5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkYXRlQ01SQWNjZXNzb3JNZXRob2QodmMsIGNtcCwgY2xhenosIGdldE1ldGhvZCwgY21yRmllbGQpOwotCQl9Ci0JCQotCQlKYXZhSGVscGVyc1tdIHNldE1ldGhvZFBhcm1zID0gbmV3IEphdmFIZWxwZXJzW117bG9jYWxUeXBlfTsKLQkJTWV0aG9kIHNldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChlamJDbGFzcywgY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpLCBzZXRNZXRob2RQYXJtcyk7Ci0JCWlmKHNldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgc2V0dGVyTmFtZSA9IGNtckZpZWxkLmdldFNldHRlck5hbWUoKSArICIoIiArIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRQYXJtc0FzU3RyaW5nKHNldE1ldGhvZFBhcm1zKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgY2xhenosIG5ldyBTdHJpbmdbXXtzZXR0ZXJOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVDTVJBY2Nlc3Nvck1ldGhvZCh2YywgY21wLCBjbGF6eiwgc2V0TWV0aG9kLCBjbXJGaWVsZCk7Ci0JCX0KLQkJCi0JCUZpZWxkIGZpZWxkID0gY21yRmllbGQuZ2V0RmllbGQoKTsKLQkJaWYgKChmaWVsZCAhPSBudWxsKSAmJiAoY2xhenouZ2V0RmllbGRFeHRlbmRlZChjbXJGaWVsZC5nZXROYW1lKCkpICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCBmaWVsZCwgbmV3IFN0cmluZ1tde2NtckZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNNUkFjY2Vzc29yTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBDTVJGaWVsZCBmaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQkJIAotCQlpZighbWV0aG9kLmlzQWJzdHJhY3QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDUwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ01QQWNjZXNzb3JNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIENNUEF0dHJpYnV0ZSBmaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQkJIAotCQlpZighbWV0aG9kLmlzQWJzdHJhY3QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDUwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCSE9NRSkgPT0gRUpCSE9NRSkgewotCQkJdmFsaWRhdGVFamJIb21lTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQUNDRVNTT1IpID09IEFDQ0VTU09SKSB7Ci0JCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGluIHRoZSB2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopIG1ldGhvZAotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkNyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJIb21lTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBBQ0NFU1NPUikgPT0gQUNDRVNTT1IpIHsKLQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgaW4gdGhlIHZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eikgbWV0aG9kCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nQnVzaW5lc3NNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIAotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBLZXlDbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZWFiOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQUtleUNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSVJlbW90ZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIua2MiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0hBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUl9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIEhBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SfTsKLQotCXByaXZhdGUgU2V0IF9rZXlGaWVsZHMgPSBudWxsOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9oYXNoQ29kZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2hhc2hDb2RlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZXF1YWxzLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZXF1YWxzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjIwNStCRVhULCBDSEtKMjIwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNiwgbmV3IFN0cmluZ1tde0NIS0oyMjA2K0JFWFQsIENIS0oyMjA2K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJLy8gS2V5IG1ldGhvZHMgYXJlIG5vdCBjaGVja2VkIGZvciBSZW1vdGVFeGNlcHRpb24sIGJ1dCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIFZSdWxlcy4uLgotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXBhcmVudDsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZG8gbm90IHZhbGlkYXRlIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5Ci0JCX0KLQkJCi0JCXJldHVybiBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkby4KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCi0JCS8vIElXQUQ0MjUxID0gVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEwLjguMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgcHJpbWFyeUtleSwgbmV3IFN0cmluZ1tdIHsgcHJpbWFyeUtleS5nZXROYW1lKCksIGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRLZXlGaWVsZHMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoX2tleUZpZWxkcyA9PSBudWxsKSB7Ci0JCQkvLyBLbm93IHRoYXQgdGhlIHRyYXZlcnNhbCBvZiB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGlzIGRvbmUgc2VxdWVudGlhbGx5LgotCQkJLy8gaS5lLiwgdGhhdCBhIGNsYXNzIGlzIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gb25lIGJlYW4gYXQgYXQgdGltZS4KLQkJCS8vIFRodXMsIHdlIGNhbiBjYWNoZSB0aGUga2V5IGZpZWxkIGluZm9ybWF0aW9uIHRvIHNwZWVkIHVwIHN1YnNlcXVlbnQgY2FsbHMuCi0JCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQkJX2tleUZpZWxkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTVBBdHRyaWJ1dGUgYXR0cmliID0gKENNUEF0dHJpYnV0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJX2tleUZpZWxkcy5hZGQoYXR0cmliLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9rZXlGaWVsZHM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIEZpZWxkKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgZmllbGRUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0RmllbGRUeXBlSWQoYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJaWYoKGZpZWxkVHlwZSAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VSSUFMVkVSU0lPTlVJRCkgewotCQkJdmFsaWRhdGVTZXJpYWxWZXJzaW9uVUlEKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSVdBRDQyNTMgPSBUaGlzIGZpZWxkIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuOC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGZpZWxkKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCVNldCBrZXlGaWVsZHMgPSBnZXRLZXlGaWVsZHMoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbik7Ci0JCQlpZigha2V5RmllbGRzLmNvbnRhaW5zKGZpZWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLyBJV0FENDI1NCA9IFRoaXMgZmllbGQgaXMgbm90IGEgPGNtcC1maWVsZD4uIFJlYWQgc2VjdGlvbiAxMC44LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMjA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWlmKF9rZXlGaWVsZHMgIT0gbnVsbCkgewotCQkJX2tleUZpZWxkcy5jbGVhcigpOwotCQkJX2tleUZpZWxkcyA9IG51bGw7IC8vIGluIHRoaXMgY2FzZSwgY2xlYXJpbmcgdGhlIFNldCBpc24ndCBlbm91Z2guCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjYWNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01QTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElDb21wb25lbnRUeXBlLCBJTG9jYWxUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgRUpCU0VMRUNUfTsgLy8gTXVzdCBrbm93IEVKQlNFTEVDVCB0byBjaGVjayB0aGF0IGl0J3Mgbm90IGV4cG9zZWQgb24gdGhpcyBpbnRlcmZhY2UKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NCwgbmV3IFN0cmluZ1tde0NIS0oyNDc0K0JFWFQsIENIS0oyNDc0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWVlMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBMb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFDTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkRCWVBSSU1BUllLRVksIEZJTkR9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FLCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW117Q0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tde0NIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tde0NIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk1LCBuZXcgU3RyaW5nW117Q0hLSjI0OTUrQkVYVCwgQ0hLSjI0OTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxNTViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBSZW1vdGVDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJQ29tcG9uZW50VHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MywgbmV3IFN0cmluZ1tde0NIS0oyNDczK0JFWFQsIENIS0oyNDczK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc0LCBuZXcgU3RyaW5nW117Q0hLSjI0NzQrQkVYVCwgQ0hLSjI0NzQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCi0JCS8vIDEwLjMuMSwgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVudCBmaWVsZHMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkIHJlbGF0aW9uc2hpcCAKLQkJLy8gZmllbGRzIG11c3QgKm5vdCogYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIAotCQlMaXN0IGNtckZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXJGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigoY21yRmllbGQgIT0gbnVsbCkgJiYgKCFjbXJGaWVsZC5pc0Rlcml2ZWQoKSkpIHsKLQotCQkJCUphdmFIZWxwZXJzIGxvY2FsVHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRDTVJGaWVsZFR5cGUodmMsIGNtcCwgY2xhenosIGNtckZpZWxkKTsKLQkJCQlpZihsb2NhbFR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyB1c2VyIG1hZGUgYSBtaXN0YWtlIGluIGVqYi1qYXIueG1sIGJ5IHRyeWluZyB0byBjcmVhdGUgYSByZWxhdGlvbgotCQkJCQkvLyB0byBhIENNUCB3aGljaCBkb2Vzbid0IGhhdmUgYSBsb2NhbCBpbnRlcmZhY2UuCi0JCQkJCS8vIERvbid0IHJlcG9ydCBhbiBlcnJvciBoZXJlOyBsZXQgdGhlIEREIHZhbGlkYXRpb24gcmVwb3J0IHRoZSBlcnJvci4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gQ2Fubm90IGV4cG9zZSBnZXQvc2V0IG1ldGhvZHMgb2YgQ01SIGZpZWxkcyBvbiB0aGUgcmVtb3RlIGhvbWUgb3IgaW50ZXJmYWNlCi0JCQkJTWV0aG9kIHJlbW90ZUdldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgY21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpLCBuZXcgSmF2YUhlbHBlcnNbMF0sIGxvY2FsVHlwZSk7Ci0JCQkJaWYocmVtb3RlR2V0TWV0aG9kICE9IG51bGwpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDczLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBjbGF6eiwgcmVtb3RlR2V0TWV0aG9kLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCi0JCQkJSmF2YUhlbHBlcnNbXSBzZXRNZXRob2RQYXJtcyA9IG5ldyBKYXZhSGVscGVyc1tde2xvY2FsVHlwZX07Ci0JCQkJTWV0aG9kIHJlbW90ZVNldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpLCBzZXRNZXRob2RQYXJtcyk7Ci0JCQkJaWYocmVtb3RlU2V0TWV0aG9kICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHNldHRlck5hbWUgPSBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCkgKyAiKCIgKyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0UGFybXNBc1N0cmluZyhzZXRNZXRob2RQYXJtcykgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCByZW1vdGVTZXRNZXRob2QsIG5ldyBTdHJpbmdbXXtzZXR0ZXJOYW1lfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZWMyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBSZW1vdGVIb21lVlJ1bGUgZXh0ZW5kcyBBQ01QSG9tZVZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkRCWVBSSU1BUllLRVksIEZJTkR9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FLCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW117Q0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tde0NIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tde0NIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk1LCBuZXcgU3RyaW5nW117Q0hLSjI0OTUrQkVYVCwgQ0hLSjI0OTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2ZDUxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBsb25nIHN1cGVydHlwZV9jb3VudGVyID0gMHgxOyAvLyB1c2VkIGJ5IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5qYXZhCi0JcHJpdmF0ZSBsb25nW10gX2NsYXNzVHlwZUluZGV4OwotCXByaXZhdGUgQUNsYXNzVHlwZVtdIF9jbGFzc05hbWVzOwotCQotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQUNsYXNzVHlwZSB7Ci0JCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRJZCgpOwotCi0JCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShnZXROYW1lKGJlYW4pLCBiZWFuKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIElzIHRoaXMgY2xhc3MgdHlwZSBlcXVhbCB0byB0aGUgY2xhenogcGFyYW1ldGVyLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlKYXZhSGVscGVycyB0aGlzQ2xhc3MgPSBnZXRDbGFzcyhiZWFuKTsKLQkJCWlmKHRoaXNDbGFzcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2xhenouZXF1YWxzKHRoaXNDbGFzcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NVdGlsaXR5IF9pbnN0ID0gbnVsbDsKLQkKLQlwcml2YXRlIENsYXNzVXRpbGl0eSgpIHsKLQkJYnVpbGRUeXBlTGlzdCgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENsYXNzVXRpbGl0eSBnZXRVdGlsaXR5KCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBDbGFzc1V0aWxpdHkoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGNsYXp6IGlzIHRoZSBzYW1lIGFzIHRoZSBjbGFzcywgaWRlbnRpZmllZCBieSB0aGUgInR5cGUiCi0JICogcGFyYW1ldGVyLCBpbiB0aGUgYmVhbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIGxvbmcgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUFDbGFzc1R5cGUgY3QgPSBnZXRDbGFzc1R5cGUodHlwZSk7Ci0JCWlmKGN0ID09IG51bGwpIHsKLQkJCS8vIFVua25vd24gdHlwZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gY3QuZXF1YWxzKGJlYW4sIGNsYXp6KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBsb25nIHR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlBQ2xhc3NUeXBlIGN0ID0gZ2V0Q2xhc3NUeXBlKHR5cGUpOwotCQlpZihjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGN0LmdldE5hbWUoYmVhbik7Ci0JfQotCi0JcHVibGljIEFDbGFzc1R5cGUgZ2V0Q2xhc3NUeXBlKGxvbmcgdHlwZSkgewotCQlpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKF9jbGFzc1R5cGVJbmRleCwgdHlwZSk7Ci0JCWlmKGluZGV4ID4gX2NsYXNzTmFtZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoaW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoX2NsYXNzTmFtZXNbaW5kZXhdLmdldElkKCkgIT0gdHlwZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBfY2xhc3NOYW1lc1tpbmRleF07Ci0JfQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldFN1cGVydHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBsb25nIHR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlBQ2xhc3NUeXBlIGN0ID0gZ2V0Q2xhc3NUeXBlKHR5cGUpOwotCQlpZihjdCA9PSBudWxsKSB7Ci0JCQkvLyBObyBzdXBlcnR5cGUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gY3QuZ2V0Q2xhc3MoYmVhbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFR5cGVMaXN0KCkgewotCQlpbnQgdHlwZUNvdW50ID0gMTI7IC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpZGVudGlmaWFibGUgY2xhc3NlcyBpbiBJVHlwZUNvbnN0YW50cwotCQlfY2xhc3NUeXBlSW5kZXggPSBuZXcgbG9uZ1t0eXBlQ291bnRdOwotCQlfY2xhc3NOYW1lcyA9IG5ldyBBQ2xhc3NUeXBlW3R5cGVDb3VudF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCQotCQkvLyBUaGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIGxvbmdbXSBpcyBlcXVhbCB0byB0aGUKLQkJLy8gaW5kZXggb2YgdGhlIElNZXRob2RUeXBlIGluIHRoZSBJTWV0aG9kVHlwZVtdLiBCeSB1c2luZwotCQkvLyB0aGlzIHRlY2huaXF1ZSBpbnN0ZWFkIG9mIGEgSGFzaE1hcCwgd2UgZG9uJ3QgbmVlZCB0bwotCQkvLyBjcmVhdGUgYW4gSW50ZWdlciBldmVyeSB0aW1lIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSAKLQkJLy8gSU1ldGhvZFR5cGUuCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5MT0NBTF9DT01QT05FTlRfSU5URVJGQUNFOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlKYXZhSGVscGVycyBjbGF6eiA9IGdldENsYXNzKGJlYW4pOwotCQkJCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5MT0NBTF9DT01QT05FTlRfSU5URVJGQUNFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSkpIHsKLQkJCQkJSmF2YUNsYXNzIHJlc3VsdCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5SRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJSmF2YUhlbHBlcnMgY2xhenogPSBnZXRDbGFzcyhiZWFuKTsKLQkJCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQkJSmF2YUNsYXNzIHJlc3VsdCA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVzdWx0KTsKLQkJCQkJfQotCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VOVElUWUJFQU47Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUJFQU47Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRU5USVRZQkVBTjsKLQkJCX0KLQkJfTsKLQkKLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTEhPTUU7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTEhPTUU7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1Q7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJIT01FOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkhPTUU7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJPQkpFQ1Q7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJPQkpFQ1Q7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1Q7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1Q7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfTUVTU0FHRURSSVZFTkJFQU47Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfTUVTU0FHRURSSVZFTkJFQU47Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0pNU19NRVNTQUdFTElTVEVORVI7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0pNU19NRVNTQUdFTElTVEVORVI7Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTkJFQU47Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTkJFQU47Ci0JCQl9Ci0JCX07Ci0KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGQ0ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMgZXh0ZW5kcyBKMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV8xXzMgPSAiMS4wIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFXzFfNCA9ICIxLjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX01PREVMX05BTUUgPSAiQ09OTkVDVE9SX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfID0gIkNPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFID0gIkVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEID0gIkVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyNDkwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIENvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMgewotCXByb3RlY3RlZCBSQVJGaWxlIHJhckZpbGU7Ci0JcHJvdGVjdGVkIENvbm5lY3RvciBjb25uZWN0b3JERDsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLkoyRUVWYWxpZGF0b3IjZ2V0QmFzZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiAicmFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25uZWN0b3JERC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdG9yIGdldENvbm5lY3RvckREKCkgewotCQlyZXR1cm4gY29ubmVjdG9yREQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbm5lY3RvckREIFRoZSBjb25uZWN0b3JERCB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29ubmVjdG9yREQoQ29ubmVjdG9yIGNvbm5lY3RvckREKSB7Ci0JCXRoaXMuY29ubmVjdG9yREQgPSBjb25uZWN0b3JERDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJhckZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFJBUkZpbGUgZ2V0UmFyRmlsZSgpIHsKLQkJcmV0dXJuIHJhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJhckZpbGUgVGhlIHJhckZpbGUgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhckZpbGUoUkFSRmlsZSByYXJGaWxlKSB7Ci0JCXRoaXMucmFyRmlsZSA9IHJhckZpbGU7Ci0JfQotCQkKLQkvKioKLQkgKiBEb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7CQkKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKMkVFMTREb2NUeXBlKCkgewotCQotCQlpZiAoIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzQ7Ci0JCQkvL3BhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzM7Ci0JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0JCX0gZWxzZSBpZiAoZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzM7Ci0JCQkvL3BhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzQ7Ci0JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0JCX0vLyBpZgotCX0vLyB2YWxpZGF0ZURvY1R5cGVWc05hdHVyZQotCQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uewotCQotCQlzdXBlci52YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkKLQkJLy8gRmlyc3QgcmVtb3ZlIGFsbCBwcmV2aW91cyBtc2cuIGZvciB0aGlzIHByb2plY3QKLQkJX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIG51bGwpOyAvLyBOb3RlIHRoZSBXYXJIZWxwZXIgd2lsbCByZXR1cm4gd2ViLnhtbCB3aXRoIGEgbnVsbCBvYmplY3QgYXMgd2VsbAotCQotCQl0cnkgewotCQkJc2V0UmFyRmlsZSgoUkFSRmlsZSkgaGVscGVyLmxvYWRNb2RlbChDT05ORUNUT1JfTU9ERUxfTkFNRSkpOwotCQkJaWYgKHJhckZpbGUgIT0gbnVsbCkgewotCQkJCXNldENvbm5lY3RvckREKCByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgKTsKLQkJCQkvL3ZhbGlkYXRlSjJFRTE0RG9jVHlwZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUpOwotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCX0KLQkKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRCk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXJhckZpbGUgPSBudWxsOwotCQljb25uZWN0b3JERCA9IG51bGw7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWM2MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0R1cGxpY2F0ZXNUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogSW4gc29tZSBwbGFjZXMgaW4gdGhlIGNvZGUsIGl0IGlzIG5lY2Vzc2FyeSB0byBmaW5kIG91dCBpZiB0aGVyZQotICogYXJlIGR1cGxpY2F0ZXMgaW4gYSBsaXN0LCBhbmQgaWYgdGhlcmUgYXJlLCB0byByZWdpc3RlciBhIHZhbGlkYXRpb24KLSAqIG1lc3NhZ2UgYWdhaW5zdCB0aGUgZHVwbGljYXRlcy4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1ha2UgZmluZGluZwotICogdGhlIGR1cGxpY2F0ZXMgZWFzaWVyLgotICovCi1wdWJsaWMgY2xhc3MgRHVwbGljYXRlc1RhYmxlIGV4dGVuZHMgamF2YS51dGlsLkhhc2hNYXAgewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTg5OTAxODQ5NTU1MjI5NzE4TDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVU5JUVVFID0gQm9vbGVhbi5GQUxTRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRFVQTElDQVRFID0gQm9vbGVhbi5UUlVFOwotCXByb3RlY3RlZCBNYXAgX2R1cGxpY2F0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogQWRkIGFuIG9iamVjdCB0byB0aGlzIHRhYmxlOyBpZiB0aGUgb2JqZWN0IGlzIGEgZHVwbGljYXRlLCBpdCB3aWxsIGJlCi0JICogbWFya2VkIHRvIGEgZHVwbGljYXRlIGluc3RlYWQgb2YgYmVpbmcgYWRkZWQgdHdpY2UgdG8gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotCQkvLyBCdWlsZCB1cCBoYXNodGFibGUgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbGVtZW50cy4KLQkJT2JqZWN0IGtleSA9IGdldChvKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlwdXQobywgVU5JUVVFKTsKLQkJfQotCQllbHNlIHsKLQkJCXNhdmVEdXBsaWNhdGUobyk7Ci0JCQlwdXQobywgRFVQTElDQVRFKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEdXBsaWNhdGUoT2JqZWN0IG8pIHsKLQkJLy8gVGhlIGdpdmVuIG9iamVjdCBoYXMgYmVlbiBtYXJrZWQgYSBkdXBsaWNhdGUuCi0JCS8vIEdpdmVuIHRoYXQgdGhlIEhhc2hNYXAgY2FuIHN0b3JlIG9ubHkgb25lIG9iamVjdCB3aXRoIHRoZSBrZXksIAotCQkvLyBkdXBsaWNhdGVzIGFyZSBvdmVyd3JpdHRlbi4gVGhpcyBtZXRob2Qgc3RvcmVzIHRoZSBkdXBsaWNhdGVzCi0JCS8vIGVsc2V3aGVyZSBpbiBhIExpc3QuCi0JCWlmIChfZHVwbGljYXRlcyA9PSBudWxsKSB7Ci0JCQlfZHVwbGljYXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlMaXN0IGR1cExpc3QgPSAoTGlzdCkgX2R1cGxpY2F0ZXMuZ2V0KG8pOwotCQlpZiAoZHVwTGlzdCA9PSBudWxsKSB7Ci0JCQlkdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJZHVwTGlzdC5hZGQobyk7Ci0JCV9kdXBsaWNhdGVzLnB1dChvLCBkdXBMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gdHJ1ZTsgZWxzZSwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRHVwbGljYXRlcygpIHsKLQkJcmV0dXJuIGNvbnRhaW5zVmFsdWUoRFVQTElDQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gdHJ1ZTsgZWxzZSwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVW5pcXVlcygpIHsKLQkJcmV0dXJuIGNvbnRhaW5zVmFsdWUoVU5JUVVFKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIGEgc2V0IG9mIHRoZSBkdXBsaWNhdGVzLgotCSAqIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHNldC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREdXBsaWNhdGVzKCkgewotCQlpZiAoIWNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8vIEVsc2UsIGdldCB0aGUgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QKLQkJcmV0dXJuIGdldEVsZW1lbnRzKERVUExJQ0FURSk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoaXMgdGFibGUsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGR1cGxpY2F0ZXMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgbGlzdC4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RWxlbWVudHMoQm9vbGVhbiB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gRWxzZSwgZ2V0IHRoZSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQlTZXQga2V5cyA9IGtleVNldCgpOwotCQlpZiAoa2V5cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0JCQlpZiAodmFsdWUgPT0gdHlwZSkgewotCQkJCWVsZW1lbnRzLmFkZChrZXkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHR5cGUgPT0gRFVQTElDQVRFKSB7Ci0JCQkvLyBBbHNvIGFkZCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgImR1cGxpY2F0ZXMiIGxpc3QuCi0JCQlpZiAoX2R1cGxpY2F0ZXMgIT0gbnVsbCkgewotCQkJCWl0ZXJhdG9yID0gX2R1cGxpY2F0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUxpc3QgZHVwTGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChkdXBMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIGEgc2V0IG9mIHRoZSB1bmlxdWUgZWxlbWVudHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgc2V0LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVuaXF1ZXMoKSB7Ci0JCWlmICghY29udGFpbnNVbmlxdWVzKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gRWxzZSwgZ2V0IHRoZSB1bmlxdWUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQlyZXR1cm4gZ2V0RWxlbWVudHMoVU5JUVVFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJaWYoX2R1cGxpY2F0ZXMgIT0gbnVsbCkgewotCQkJX2R1cGxpY2F0ZXMuY2xlYXIoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGM2NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlYXJ2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9WQUxJREFUSU9OX0ZBSUxFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9FQVJfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9FQVJfTUlTU0lOR19VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX0REX1BBUlNFX0xJTkVDT0w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX0REX1BBUlNFX0xJTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX0REX1BBUlNFX05PSU5GTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfRERfQ0FOTk9UX09QRU5fREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJX0NPTlRBSU5TX1NQQUNFU19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfRU1QVFlfQUxUX0REX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVfVVRJTEpBUl9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVfTU9EVUxFX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVVRJTF9VUklfTkFNRV9DT0xMSVNJT05fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVVRJTF9QUk9KRUNUX05BTUVfQ09MTElTSU9OX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQU5JRkVTVF9MSU5FX0VORF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFOSUZFU1RfTElORV9FWENFRURTX0xFTkdUSF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9VUklfRk9SX01PRFVMRV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRFVMRV9ERF9QQVJTRV9MSU5FQ09MX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RVTEVfRERfUEFSU0VfTElORV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX0REX1BBUlNFX05PSU5GT19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCX0JFQU5fRUpCX0xJTktfSU5URUZBQ0VfTUlTTUFUQ0hfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfTUVUQUZPTERFUl9NSVNTSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfRklMRV9NSVNTSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfSU5WQUxJRF9BTFRfRERfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfT05FX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX1RXT19XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9ERVBFTkRFTkNZX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfSVNfQ0xPU0VEX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfRE9FU19OT1RfRVhJU1RfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlTU0lOR19XRUJOQVRVUkVfRk9STU9EVUxFX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFUFJFQ0FURURfQUJTUEFUSFNfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9DT05URVhUUk9PVF9XRUJNT0RVTEVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlTU0lOR19DTElFTlROQVRVUkVfRk9STU9EVUxFX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfRUpCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSVNTSU5HX1BST0pFQ1RfRk9STU9EVUxFX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfQ0FTRV9GT1JfTUFOSUZFU1RfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSV9BTFJFQURZX0VYSVNUU19JTl9FQVJfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlTU0lOR19NT0RVTEVfRVhURU5TSU9OX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX1NFUlZFUl9UQVJHRVRfRE9FU19OT1RfTUFUQ0hfRUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX1NFUlZFUl9UQVJHRVRfTU9EVUxFX0lOX0VBUl9XSVRIX1NFUlZFUl9UQVJHRVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fU0VSVkVSX1RBUkdFVF9PTl9FQVJfV0lUSF9NT0RVTEVfU0VSVkVSX1RBUkdFVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9FQVJfU0VSVkVSX1RBUkdFVF9GT1JfMTRfU1BFQ19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX01PRFVMRV9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9JTkNPTVBBVElCTEVfMTNfU1BFQ19XQVJOSU5HXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0lOQ09NUEFUSUJMRV8xNF9TUEVDX1dBUk5JTkdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9WQUxJREFUSU9OX0lOVEVSTkFMX0VSUk9SX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDTEFTU1BBVEhfQ09NUE9ORU5UX1VSSV9NQVRDSEVTX0FSQ0hJVkVfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKRUU1X1BST0pFQ1RfUkVGRVJFTkNFRF9CWV9QUkVfSkVFNV9FQVI7Ci0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9CQotCQotCS8qKgotCSAqICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAuLi4KLSAgICAgIC8vIG5vIGFyZ3MKLSAgICAgIG1lc3NhZ2UgPSBFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5rZXlfb25lOwotICAgICAgLi4uCi0gICAgICAvLyBiaW5kIG9uZSBhcmcKLSAgICAgIG1lc3NhZ2UgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5rZXlfdHdvLCAiZXhhbXBsZSB1c2FnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJFeHQyMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCRXh0MjBWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFjMzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJFeHQyMFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVmFsaWRhdGUgdGhlIFdlYlNwaGVyZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBub24tc3BlYyBmZWF0dXJlcywgc3VjaAotICogYXMgY29tcG9uZW50IGluaGVyaXRhbmNlLgotICovCi1wdWJsaWMgY2xhc3MgRUpCRXh0MjBWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0OSwgbmV3IFN0cmluZ1tde0NIS0oyODQ5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUyLCBuZXcgU3RyaW5nW117Q0hLSjI4NTJ9KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkVYVDsKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBiZWFuIGNvbXBvbmVudHMgKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBiZWFuIGNsYXNzLCBhbmQgcHJpbWFyeQotCSAqIGtleSkgY2FuIGFsbCBiZSBmb3VuZCBhbmQgcmVmbGVjdGVkLCByZXR1cm4gdHJ1ZS4gTGV0IHRoZSBERFZhbGlkYXRvcgotCSAqIHJlcG9ydCB0aGUgZXJyb3IgbWVzc2FnZSBhZ2FpbnN0IHRoZSBiZWFuIGlmIG9uZSBvZiB0aGVzZSB0eXBlcyBkb2Vzbid0IHJlZmxlY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXJlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBiZWFuIGlzIG51bGwsIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotCQkvLyBub3QgYmUgY2FsbGVkIGlmIGl0IGlzLgotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCS8vIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJlc3QKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJSmF2YUNsYXNzIHByaW1hcnlLZXkgPSAoKEVudGl0eSkgYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQkJdHJ5IHsKLQkJCQlpZigoKEVudGl0eSliZWFuKS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkpIHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0JCQotCQlFSkJKYXIgZWpiSmFyID0gbnVsbDsKLQkJaWYodGFyZ2V0UGFyZW50ID09IG51bGwpIHsKLQkJCWVqYkphciA9IChFSkJKYXIpdGFyZ2V0OwotCQkJdmFsaWRhdGUodmMsIGVqYkphcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBydW5uaW5nIGFzIGEgZGVwZW5kZW50Ci0JCQllamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQkJdmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbnRlcnByaXNlQmVhbnMuaXRlcmF0b3IoKTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihiZWFuID09IG51bGwpIHsKLQkJCQkvLyBJZiBiZWFuIGlzbid0IHZhbGlkLCBkb24ndCBwZXJmb3JtIGFueSBvZiB0aGUgb3RoZXIKLQkJCQkvLyB2YWxpZGF0aW9uIGNoZWNrcyBvbiBpdC4gTGV0IEREVmFsaWRhdG9yIG91dHB1dCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNsYXNzIGV4aXN0cywgZXRjLgotCQkJaWYoIWFyZUJlYW5Db21wb25lbnRzUmVmbGVjdGVkKGJlYW4pKSB7Ci0JCQkJLy8gU29tZXRoaW5nIGRpZG4ndCByZWZsZWN0IHByb3Blcmx5LCBzbyBkb24ndCBjb250aW51ZSB3aXRoIHRoZQotCQkJCS8vIHJlc3Qgb2YgdGhlIGNoZWNrcy4gU29tZSBtZXRhZGF0YSB3aWxsIGJlIG5vbnNlbnNlLgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gQ29tcG9uZW50IGluaGVyaXRhbmNlIGlzIG5vdyBjaGVja2VkIGluIGVhY2ggVlJ1bGUgaW5zdGVhZCBvZiBoZXJlLgotCQkJLy8gVGhpcyB3YXMgbmVjZXNzYXJ5IGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uOyBpZiBvbmUgY2xhc3MgY2hhbmdlZAotCQkJLy8gaW4gdGhlIGJlYW4sIGFuZCB0aGUgYmVhbiB3YXMgYSBtZW1iZXIgb2YgY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGVuCi0JCQkvLyBtZXNzYWdlcyB3ZXJlIGFkZGVkIG11bHRpcGxlIHRpbWVzIG9udG8gdGhlIGNsYXNzZXMgd2hpY2ggaGFkIG5vdCBjaGFuZ2VkLgotCQkJLy8gSW4gb3JkZXIgdG8gYXZvaWQgbXVsdGlwbGUgbWVzc2FnZXMsIG9ubHkgdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZgotCQkJLy8gdGhlIGNsYXNzIHdoaWNoIGNoYW5nZWQgc2hvdWxkIGJlIHJldmFsaWRhdGVkIHdoZW4gdGhlIGNsYXNzIGNoYW5nZXMuCi0JCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgZWpiSmFyLCBiZWFuKTsgLy8gdmFsaWRhdGUgdGhlIGtleSBjbGFzcyBzaW5jZSB0aGF0IG1lc3NhZ2UgaXMgcmVnaXN0ZXJlZCBhZ2FpbnN0IGVqYi1qYXIueG1sCi0JCX0KLQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCS8qIHVucmVhY2hhYmxlIGNhdGNoIGJsb2NrCi0JCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117QXJjaGl2ZUNvbnN0YW50cy5FSkJKQVJfRVhURU5TSU9OU19TSE9SVF9OQU1FLCBiZWFuTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJLy8gSWYgdGhlcmUncyBhIHByb2JsZW0sIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBiZWFuLgotCQkJU3RyaW5nIHN1cGVyVHlwZU5hbWUgPSBnZXRFSkJJbmhlcml0YW5jZUZpbGVOYW1lKCk7Ci0JCQlpZihzdXBlclR5cGVOYW1lID09IG51bGwpCi0JCQkgIHN1cGVyVHlwZU5hbWUgPSAidW5rbm93biBzdXBlciB0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtzdXBlclR5cGVOYW1lLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCFiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKYXZhQ2xhc3MgdGhpc0tleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50S2V5ID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJLy8gS2V5IGEgWGNoaWxkIG9mIHBhcmVudCBLZXkKLQkJCS8vIEluIFdTQSBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgcm9vdCBFSkIgbXVzdCBkZWZpbmUgdGhlIGtleS4KLQkJCS8vIFRoZSBrZXkgaXMgdGhlIHNhbWUgZm9yIGFsbCBjaGlsZCBFSkJzLgotCQkJaWYgKHN1cGVydHlwZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXBhcmVudEtleSA9ICgoRW50aXR5KSBzdXBlcnR5cGUpLmdldFByaW1hcnlLZXkoKTsKLQotCQkJCWlmICgodGhpc0tleSA9PSBudWxsKSB8fCAocGFyZW50S2V5ID09IG51bGwpIHx8ICF0aGlzS2V5LmVxdWFscyhwYXJlbnRLZXkpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKSwgcGFyZW50S2V5LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudEtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIxMVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzdjZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZWpiLWphci54bWwgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotICogVGhlIEJlYW4gUHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlY2xhcmluZyBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgb2YgdGhlIGRlcGxveS1tZW50Ci0gKiBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcwotICogcmVmZXJlbmNlcyBpbiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyBvZiB0aGUgc2VjdXJpdHkKLSAqIHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlIGVsZW1lbnRzLgotICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlIHVzaW5nIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0gKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiBUaGUgbmFtZSBtdXN0IGJlIHRoZQotICogc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkKLSAqIG1ldGhvZC4KLSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLSAqIEEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSByb2xlLW5hbWUgZWxlbWVudCwgaXMgc2NvcGVkIHRvIHRoZSBzZXMtc2lvbgotICogb3IgZW50aXR5IGJlYW4gZWxlbWVudCB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcyBhcmUgZGVjbGFyZWQgaW4KLSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgICBUaGlzIHNlY3VyaXR5IHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgPC9lbnRpdHk+Ci0gKiAgICAgICAuLi4KLSAqICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgIC4uLgotICoKLSAqIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWJvdmUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudGVycHJpc2UgYmVhbiBBYXJkdmFya1BheXJvbGwgbWFrZXMgdGhlCi0gKiBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0gKgotICoKLSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlCi0gKiBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdS1yaXR5LQotICogcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0gKiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGxpbmtzIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLWxpbmsKLSAqIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4KLSAqIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIHJvbGUtbGluayByZWZlcmVuY2UuCi0gKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lZAotICogcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBlbXBsb3llZXMgb2YgdGhlIHBheXJvbGwgZGVwYXJ0bWVudC4KLSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0gKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLSAqCi0gKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0gKiAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICA8L2VudGl0eT4KLSAqICAgICAgIC4uLgotICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICogICAgLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXIxMVZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX2VqYk5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCSkFSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VKQkVYVH07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNCwgbmV3IFN0cmluZ1tde0NIS0oyODE0ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNSwgbmV3IFN0cmluZ1tde0NIS0oyODI1ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNiArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQzLCBuZXcgU3RyaW5nW117Q0hLSjI4NDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NCwgbmV3IFN0cmluZ1tde0NIS0oyODQ0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NywgbmV3IFN0cmluZ1tde0NIS0oyODQ3ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MCwgbmV3IFN0cmluZ1tde0NIS0oyODUwICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3NSwgbmV3IFN0cmluZ1tde0NIS0oyODc1ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg5NSwgbmV3IFN0cmluZ1tde0NIS0oyODk1ICsgU1BFQ30pOwotCX0KLQkKLQlwdWJsaWMgRUpCSmFyMTFWUnVsZSgpIHsKLQkJX2VqYk5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogMTUuMy4xIFNlY3VyaXR5IHJvbGVzCi0JICogVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW4gZGVmaW5lIG9uZSBvciBtb3JlIHNlY3VyaXR5IHJvbGVzIGluIAotCSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgdGhlbiBhc3NpZ25zIAotCSAqIGdyb3VwcyBvZiBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zJyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcwotCSAqIHRvIHRoZSBzZWN1cml0eSByb2xlcyB0byBkZWZpbmUgdGhlIHNlY3VyaXR5IHZpZXcgb2YgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEJlY2F1c2UgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkb2VzIG5vdCwgaW4gZ2VuZXJhbCwga25vdyB0aGUgCi0JICogc2VjdXJpdHkgZW52aXJvbm1lbnQgb2YgdGhlIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LCB0aGUgc2VjdXJpdHkgCi0JICogcm9sZXMgYXJlIG1lYW50IHRvIGJlIGxvZ2ljYWwgcm9sZXMgKG9yIGFjdG9ycyksIGVhY2ggcmVwcmVzZW50aW5nIAotCSAqIGEgdHlwZSBvZiB1c2VyIHRoYXQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgYWNjZXNzIHJpZ2h0cyB0byB0aGUgCi0JICogYXBwbGljYXRpb24uIFRoZSBEZXBsb3llciB0aGVuIGFzc2lnbnMgdXNlciBncm91cHMgYW5kL29yIHVzZXIgCi0JICogYWNjb3VudHMgZGVmaW5lZCBpbiB0aGUgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIAotCSAqIGRlZmluZWQgYnkgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlci4KLQkgKiAgICBEZWZpbmluZyB0aGUgc2VjdXJpdHkgcm9sZXMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBbMTddCi0JICogZm9yIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIuICBUaGVpciBvbWlzc2lvbiBpbiB0aGUgZGVwbG95bWVudCAKLQkgKiBkZXNjcmlwdG9yIG1lYW5zIHRoYXQgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjaG9zZSBub3QgdG8gcGFzcyBhbnkgCi0JICogc2VjdXJpdHkgZGVwbG95bWVudCByZWxhdGVkIGluc3RydWN0aW9ucyB0byB0aGUgRGVwbG95ZXIgaW4gdGhlIAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgCi0JICogdGhlIGZvbGxvd2luZzoKLQkgKiAgICAtIERlZmluZSBlYWNoIHNlY3VyaXR5IHJvbGUgdXNpbmcgYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0JICogICAgLSBVc2UgdGhlIHJvbGUtbmFtZSBlbGVtZW50IHRvIGRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcm9sZS4KLQkgKiAgICAtIE9wdGlvbmFsbHksIHVzZSB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCB0byBwcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgCi0JICogICAgICBhIHNlY3VyaXR5IHJvbGUuCi0JICogVGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgYnkgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgYXJlIHNjb3BlZCB0byAKLQkgKiB0aGUgZWpiLWphciBmaWxlIGxldmVsLCBhbmQgYXBwbHkgdG8gYWxsIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSAKLQkgKiBlamItamFyIGZpbGUuCi0JICogWzE3XSBJZiB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGRvZXMgbm90IGRlZmluZSBzZWN1cml0eSByb2xlcyBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0aGUgRGVwbG95ZXIgd2lsbCBoYXZlIHRvIGRlZmluZSBzZWN1cml0eQotCSAqIHJvbGVzIGF0IGRlcGxveW1lbnQgdGltZS4KLQkgKi4uLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFZhbGlkYXRlIHRoZSBzZWN1cml0eSByb2xlcywgaWYgdGhleSdyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseS1kZXNjcmlwdG9yLgotCQlpZiAoZWpiSmFyID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2wgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZSBfcm9sZSA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlV3JhcHBlcihTZWN1cml0eVJvbGUgcm9sZSkgewotCQkJCV9yb2xlID0gcm9sZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlV3JhcHBlcikgewotCQkJCQlSb2xlV3JhcHBlciBvdGhlciA9IChSb2xlV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGUoKS5nZXRSb2xlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFJvbGUoKSB7Ci0JCQkJcmV0dXJuIF9yb2xlOwotCQkJfQotCQl9Ci0KLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHJvbGVzID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IG51bGw7Ci0JCQlJdGVyYXRvciByb2xlSXQgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJvbGVJdC5oYXNOZXh0KCkpIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUtbmFtZSBlbGVtZW50IGhhcyBiZWVuIHNldAotCQkJCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSByb2xlSXQubmV4dCgpOwotCQkJCWlmIChyb2xlID09IG51bGwpIHsKLQkJCQkJLy8gcm9sZS1uYW1lIG5vdCBzZXQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVqYkphciwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCghcm9sZS5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpKSB8fCAocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gcm9sZS1uYW1lIG5vdCBzZXQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJvbGUsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgaGFzaHRhYmxlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgcm9sZS1uYW1lcy4KLQkJCQkJcm9sZU5hbWVzLmFkZChuZXcgUm9sZVdyYXBwZXIocm9sZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZU5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZU5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGUoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZU5hbWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlMaXN0IG1ldGhUcmFucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gbXQgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhUcmFucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQl0cnkgewotCQkJCW10ID0gKE1ldGhvZFRyYW5zYWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQkJfQotCQkJCW10ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIm10IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gdmFsaWRhdGVNZXRob2RFbGVtZW50cyh2YywgZWpiSmFyLCBtdC5nZXRNZXRob2RFbGVtZW50cygpKTsKLQkJCWlmICghaGFzVmFsaWRNZXRob2QpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCWl0ZXJhdG9yID0gbWV0aG9kUGVybWlzc2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWV0aG9kUGVybWlzc2lvbiBtcCA9IChNZXRob2RQZXJtaXNzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG1wLmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCS8vIDE1LjMuMiwgcC4gMjI5LCBhIDxtZXRob2QtcGVybWlzc2lvbj4gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZXRob2QgbGlzdGVkIChhbmQgdGhhdCBtZXRob2QgbXVzdCBiZSBmb3VuZCkKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCS8vIGF0IGxlYXN0IG9uZSBzZWN1cml0eS1yb2xlIG11c3QgYmUgZGVmaW5lZAotCQkJTGlzdCBtcHJvbGVzID0gbXAuZ2V0Um9sZXMoKTsKLQkJCWlmICgobXByb2xlcyA9PSBudWxsKSB8fCAobXByb2xlcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yIGlzIGNhbGxlZCBpZiB0aGUgRUpCSmFyIGNvdWxkIGxvYWQsIHdoaWNoIG1lYW5zCi0JICogdGhhdCB0aGUgc3ludGF4IG9mIHRoZSBKQVIgaXMgKG1vc3RseSkgY29ycmVjdC4KLQkgKgotCSAqIEVKQiBzcGVjIDEuMSwgc2VjdGlvbiBDLjQsICJBZGRlZCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBCZWFuIFByb3ZpZGVyIHRvIHNwZWNpZnkgd2hldGhlciB0aGUKLQkgKiBlbnRlcnByaXNlIGJlYW4gdXNlcyBhIGJlYW4tbWFuYWdlZCBvciBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbi4iCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSB0YXJnZXQ7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudGVycHJpc2VCZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJU3RyaW5nIGJlYW5OYW1lID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0ZXIodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCQlPYmplY3QgaWQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOOwotCQkJCUlWYWxpZGF0aW9uUnVsZSB2UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmICh2UnVsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LCBzbyBqdXN0Ci0JCQkJCS8vIG5lZWQgdG8gYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRoZSB0YXNrIGxpc3QuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl2UnVsZS5wcmVWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQkJdlJ1bGUudmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnBvc3RWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0JCQkJfQotCQkJCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2YywgZXhjKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZSh2UnVsZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNpbmNlIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGlzIG5vdCBzcGVjaWZpYyB0byBhIGJlYW4sIHZhbGlkYXRlIGl0IG9uY2UsIGFmdGVyIGFsbCBiZWFuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0JCXZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVVbmlxdWVFamJOYW1lcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVDbGllbnRKQVIodmMsIGVqYkphcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfZWpiTmFtZS5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gVG8gY2hlY2sgaWYgZXZlcnkgYmVhbiBuYW1lIGlzIHVuaXF1ZSwgbmVlZCB0byBidWlsZCBhIGxpc3QKLQkJX2VqYk5hbWUuYWRkKG5ldyBFamJOYW1lV3JhcHBlcihiZWFuKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgVGhyb3dhYmxlIGV4YykgewotCQlJTWVzc2FnZSBtc3NnID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltc3NnLnNldElkKElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTAwKTsKLQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQotCQlpZihleGMgIT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX2VqYk5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRWpiTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFamJOYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODk1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgd3JhcHBlci5nZXRCZWFuKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldEJlYW4oKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsaWVudEpBUihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJU3RyaW5nIGNsaWVudEpBUk5hbWUgPSBlamJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCWlmKGNsaWVudEpBUk5hbWUgPT0gbnVsbCkgewotCQkJLy8gTm8gY2xpZW50IEpBUiBzcGVjaWZpZWQ7IGV2ZXJ5dGhpbmcncyBva2F5LgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX0NMSUVOVEpBUiwgbmV3IE9iamVjdFtde2NsaWVudEpBUk5hbWV9KTsKLQkJaWYoZXhpc3RzID09IG51bGwpIHsKLQkJCS8vIEhlbHBlciBkb2Vzbid0IHN1cHBvcnQgbG9hZCBtb2RlbC4gV0FTPwotCQkJLy8gQ2FuJ3QgcGVyZm9ybSB0aGlzIGNoZWNrLCBzbyBqdXN0IHJldHVybi4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWV4aXN0cy5ib29sZWFuVmFsdWUoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBlamJKYXIsIG5ldyBTdHJpbmdbXXtjbGllbnRKQVJOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQm90aCBzZWN0aW9uIDExLjQuMSBhbmQgMTUuMy4yIG5lZWQgdGhlIDxtZXRob2Q+IGVsZW1lbnQuIEFsc28gcmVmZXIKLQkgKiB0byAxNi41IGZvciBzeW50YXguCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlZCBieSB0aGlzIGxpc3Qgb2YgCi0JICogTWV0aG9kRWxlbWVudCBjYW4gYmUgZm91bmQuCi0JKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgTGlzdCBlbGVtZW50cykgewotCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IGVsZW1lbnQuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCWlmIChiZWFuID09IG51bGwpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkvLyBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIG1ldGhvZHMgb24gdGhlIGhvbWUgb3IgcmVtb3RlIGludGVyZmFjZSBpZiB0aGVyZScKLQkJCQkvLyBiZWVuIGEgcHJvYmxlbSBsb2NhdGluZyBvciByZWZsZWN0aW5nIHRob3NlIHR5cGVzCi0JCQkJYm9vbGVhbiByZWZsZWN0ZWQgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0hPTUUgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhc3NOYW1lIH07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVmbGVjdGVkID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9SRU1PVEUgOiBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY2xhc3NOYW1lIH07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYocmVmbGVjdGVkKSB7Ci0JCQkJCS8vIFRoZSAiZWxlbWVudC5nZXRNZXRob2RzKCkiIGhhcyBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gd2hlbiBpdCBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgbWV0aG9kcyBmcm9tIHRoZSBob21lL3JlbW90ZSBpbnRlcmZhY2UsCi0JCQkJCS8vIGlmIGVpdGhlciBvZiB0aGUgaW50ZXJmYWNlcyBkb24ndCBleGlzdC4KLQkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQotCQkJCQlNZXRob2RbXSBtZXRob2RzID0gZWxlbWVudC5nZXRNZXRob2RzKCk7IC8vIGdldCBhbGwgbWV0aG9kcyB3aGljaCB3aWxsIGJlIHJldHJpZXZlZCBmb3IgdGhlIGdpdmVuIG1ldGhvZC1wZXJtaXNzaW9uCi0JCQkJCWJvb2xlYW4gaGFzTWV0aG9kcyA9ICgobWV0aG9kcyAhPSBudWxsKSAmJiAobWV0aG9kcy5sZW5ndGggPiAwKSk7Ci0KLQkJCQkJaWYgKCFoYXNNZXRob2RzKSB7Ci0JCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQloYXNWYWxpZE1ldGhvZCA9IHRydWU7IC8vIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCAoMTUuMy4yLCBwLjIyOSkKLQkJCQkJCWlmIChuYW1lLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMaXN0IHBhcmFtcyA9IGVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQkJCQkJaWYgKChwYXJhbXMgIT0gbnVsbCkgJiYgKHBhcmFtcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlcnJvcgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGhhc1ZhbGlkTWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgRUpCIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVqYk5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFbnRlcnByaXNlQmVhbiBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEVqYk5hbWVXcmFwcGVyKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFamJOYW1lV3JhcHBlcikgewotCQkJCUVqYk5hbWVXcmFwcGVyIG90aGVyID0gKEVqYk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldEJlYW4oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjIwVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNzJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEVKQkphcjIwVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX2VqYk5hbWUgPSBudWxsOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9hc05hbWUgPSBudWxsOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9yZWxhdGlvbnNoaXBOYW1lID0gbnVsbDsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfcmVsYXRpb25zaGlwUm9sZU5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJFWFR9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA1X05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDVfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDVfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA1X1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDYsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNywgbmV3IFN0cmluZ1tde0NIS0oyODA3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA4LCBuZXcgU3RyaW5nW117Q0hLSjI4MDgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDksIG5ldyBTdHJpbmdbXXtDSEtKMjgwOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODExX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTFfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNiwgbmV3IFN0cmluZ1tde0NIS0oyODE2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE3LCBuZXcgU3RyaW5nW117Q0hLSjI4MTcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTgsIG5ldyBTdHJpbmdbXXtDSEtKMjgxOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMCwgbmV3IFN0cmluZ1tde0NIS0oyODIwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIxLCBuZXcgU3RyaW5nW117Q0hLSjI4MjErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMywgbmV3IFN0cmluZ1tde0NIS0oyODIzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI0LCBuZXcgU3RyaW5nW117Q0hLSjI4MjQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjUsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNiwgbmV3IFN0cmluZ1tde0NIS0oyODI2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI3LCBuZXcgU3RyaW5nW117Q0hLSjI4MjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjgyOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOSwgbmV3IFN0cmluZ1tde0NIS0oyODI5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMwLCBuZXcgU3RyaW5nW117Q0hLSjI4MzArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMiwgbmV3IFN0cmluZ1tde0NIS0oyODMyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMzLCBuZXcgU3RyaW5nW117Q0hLSjI4MzMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzQsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNSwgbmV3IFN0cmluZ1tde0NIS0oyODM1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM2LCBuZXcgU3RyaW5nW117Q0hLSjI4MzYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzcsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOCwgbmV3IFN0cmluZ1tde0NIS0oyODM4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM5LCBuZXcgU3RyaW5nW117Q0hLSjI4MzkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MiwgbmV3IFN0cmluZ1tde0NIS0oyODQyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQzLCBuZXcgU3RyaW5nW117Q0hLSjI4NDMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDQsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NSwgbmV3IFN0cmluZ1tde0NIS0oyODQ1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDcsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0OCwgbmV3IFN0cmluZ1tde0NIS0oyODQ4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUwLCBuZXcgU3RyaW5nW117Q0hLSjI4NTArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTQsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NSwgbmV3IFN0cmluZ1tde0NIS0oyODU1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU2LCBuZXcgU3RyaW5nW117Q0hLSjI4NTYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTcsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1OCwgbmV3IFN0cmluZ1tde0NIS0oyODU4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU5LCBuZXcgU3RyaW5nW117Q0hLSjI4NTkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjAsIG5ldyBTdHJpbmdbXXtDSEtKMjg2MCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2NiwgbmV3IFN0cmluZ1tde0NIS0oyODY2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODY3LCBuZXcgU3RyaW5nW117Q0hLSjI4NjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjg2OCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2OSwgbmV3IFN0cmluZ1tde0NIS0oyODY5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODcxLCBuZXcgU3RyaW5nW117Q0hLSjI4NzErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjg3MitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3MywgbmV3IFN0cmluZ1tde0NIS0oyODczK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODc0LCBuZXcgU3RyaW5nW117Q0hLSjI4NzQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjg3NSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODk1LCBuZXcgU3RyaW5nW117Q0hLSjI4OTUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgRUpCSmFyMjBWUnVsZSgpIHsKLQkJX2VqYk5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCV9hc05hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCV9yZWxhdGlvbnNoaXBOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCS8vIEVKQkphciBkb2Vzbid0IGRlcGVuZCBvbiBhbnl0aGluZyBlbHNlCi0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkpBUjsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJLy8gU2luY2UgdGhpcyBydWxlIGRvZXNuJ3QgZGVwZW5kIG9uIGFub3RoZXIgcnVsZSwgdGhpcwotCQkvLyBtZXRob2QgKHdoaWNoIGlzIGNhbGxlZCBvbiBhIGRlcGVuZGVudCBydWxlKSB3aWxsIG5ldmVyCi0JCS8vIGJlIGNhbGxlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9lamJOYW1lLmNsZWFyKCk7Ci0JCV9hc05hbWUuY2xlYXIoKTsKLQkJX3JlbGF0aW9uc2hpcE5hbWUuY2xlYXIoKTsKLQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBUaHJvd2FibGUgZXhjKSB7Ci0JCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDApOwotCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCi0JCWlmKGV4YyAhPSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotCQlsb2codmMsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2coSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQkphcjIwVlJ1bGUgLSB2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjo6dmFsaWRhdGUoIiArIHRhcmdldFBhcmVudCArICIsICIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJfQotCQkKLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpIHRhcmdldDsKLQkJTGlzdCBiZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlyZWdpc3Rlcih2YywgZWpiSmFyLCBiZWFuKTsKLQkKLQkJCQlPYmplY3QgaWQgPSBudWxsOwkJCQotCQkJCXN3aXRjaChiZWFuLmdldFZlcnNpb25JRCgpKSB7Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCQkJaWQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiAKLQkJCQkJCWlkID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FTlRFUlBSSVNFQkVBTjsKLQkJCQkJCWJyZWFrOyAKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8vIFdoYXQgdmVyc2lvbiBpcyBpdCB0aGVuPwotCQkJCQkJaWYoYmVhbiBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIHsKLQkJCQkJCQl2YWxpZGF0ZUNNUFZlcnNpb25FbGVtZW50KHZjLCBlamJKYXIsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW4pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbG9nCi0JCQkJCQkJbG9nKHZjLCAiIWJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgIWJlYW4uaXNWZXJzaW9uMl9YKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkgCi0JCQkJCi0JCQkJSVZhbGlkYXRpb25SdWxlIHZSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYodlJ1bGUgPT0gbnVsbCkgewotCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJdlJ1bGUucHJlVmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCQl2UnVsZS5wb3N0VmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJfQotCQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0JCQkJCXRocm93IGV4YzsKLQkJCQl9Ci0JCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIGV4Yyk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UodlJ1bGUpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIHNvbWV0aGluZyBnb2VzIHdyb25nLCBqdXN0IHByb2NlZWQgd2l0aCB0aGUgbmV4dCBiZWFuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBTaW5jZSB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBpcyBub3Qgc3BlY2lmaWMgdG8gYSBiZWFuLCB2YWxpZGF0ZSBpdCBvbmNlLCBhZnRlciBhbGwgYmVhbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLgotCQl2YWxpZGF0ZUFzc2VtYmx5RGVzY3JpcHRvckVsZW1lbnQodmMsIGVqYkphcik7Ci0JCS8vVE9ETyBUaGUgRGF0YXNvdXJjZSB2YWxpZGF0aW9uIHdpbGwgYmUgZG9uZSBieSB0aGUgZXh0ZW5zaW9ucwotCQl2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZVVuaXF1ZUFic3RyYWN0U2NoZW1hTmFtZXModmMsIGVqYkphcik7Ci0JCXZhbGlkYXRlUmVsYXRpb25zaGlwcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVDbGllbnRKQVIodmMsIGVqYkphcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBUbyBjaGVjayBpZiBldmVyeSBiZWFuIG5hbWUgaXMgdW5pcXVlLCBuZWVkIHRvIGJ1aWxkIGEgbGlzdAotCQlfZWpiTmFtZS5hZGQobmV3IEVqYk5hbWVXcmFwcGVyKGJlYW4pKTsKLQkJCi0JCWlmKChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgJiYgYmVhbi5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQkvLyBUbyBjaGVjayBpZiBldmVyeSBiZWFuIG5hbWUgaXMgdW5pcXVlLCBuZWVkIHRvIGJ1aWxkIGEgbGlzdAotCQkJX2FzTmFtZS5hZGQobmV3IEFTTmFtZVdyYXBwZXIoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDTVBWZXJzaW9uRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWlmKGNtcC5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9WZXJzaW9uKCkpKSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IGNtcC5nZXRWZXJzaW9uKCk7Ci0JCQlpZighIChDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YLmVxdWFscyh2ZXJzaW9uKSB8fCBDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YLmVxdWFscyh2ZXJzaW9uKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCQkKLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBWYWxpZGF0ZSB0aGUgc2VjdXJpdHkgcm9sZXMsIGlmIHRoZXkncmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHktZGVzY3JpcHRvci4KLQkJaWYgKGVqYkphciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJvbGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIFNlY3VyaXR5Um9sZSBpbnN0YW5jZS4KLQkJICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JCSAqCi0JCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIFNlY3VyaXR5Um9sIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCQkgKi8KLQkJY2xhc3MgUm9sZVdyYXBwZXIgewotCQkJcHJpdmF0ZSBTZWN1cml0eVJvbGUgX3JvbGUgPSBudWxsOwotCi0JCQlwdWJsaWMgUm9sZVdyYXBwZXIoU2VjdXJpdHlSb2xlIHJvbGUpIHsKLQkJCQlfcm9sZSA9IHJvbGU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZVdyYXBwZXIpIHsKLQkJCQkJUm9sZVdyYXBwZXIgb3RoZXIgPSAoUm9sZVdyYXBwZXIpIG87Ci0JCQkJCXJldHVybiBfcm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhvdGhlci5nZXRSb2xlKCkuZ2V0Um9sZU5hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFNlY3VyaXR5Um9sZSBnZXRSb2xlKCkgewotCQkJCXJldHVybiBfcm9sZTsKLQkJCX0KLQkJfQotCi0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWlmIChhc3NlbWJseURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byB2YWxpZGF0ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCByb2xlcyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCWlmIChyb2xlcyAhPSBudWxsKSB7Ci0JCQlEdXBsaWNhdGVzVGFibGUgcm9sZU5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSBudWxsOwotCQkJSXRlcmF0b3Igcm9sZUl0ID0gcm9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChyb2xlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlLW5hbWUgZWxlbWVudCBoYXMgYmVlbiBzZXQKLQkJCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgcm9sZUl0Lm5leHQoKTsKLQkJCQlpZiAoKHJvbGUgPT0gbnVsbCkgfHwgKCFyb2xlLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSkpIHx8IChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyByb2xlLW5hbWUgbm90IHNldAotCQkJCQlpZihyb2xlID09IG51bGwpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByb2xlLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYXNzZW1ibHlEZXNjcmlwdG9yLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEJ1aWxkIHVwIGhhc2h0YWJsZSB0byBjaGVjayBmb3IgZHVwbGljYXRlIHJvbGUtbmFtZXMuCi0JCQkJCXJvbGVOYW1lcy5hZGQobmV3IFJvbGVXcmFwcGVyKHJvbGUpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSByb2xlLW5hbWVzLiAoMTUuMy4xKQotCQkJaWYgKHJvbGVOYW1lcy5jb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJCUxpc3QgZHVwbGljYXRlcyA9IHJvbGVOYW1lcy5nZXREdXBsaWNhdGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgKChSb2xlV3JhcHBlcikgaXRlcmF0b3IubmV4dCgpKS5nZXRSb2xlKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCXJvbGVOYW1lcy5jbGVhcigpOwotCQl9Ci0KLQkJTGlzdCBtZXRoVHJhbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uIG10ID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXRoVHJhbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJdHJ5IHsKLQkJCQltdCA9IChNZXRob2RUcmFuc2FjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJCX0KLQkJCQltdCA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChtdCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkJKYXIyMFZSdWxlLnZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIm10IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gdmFsaWRhdGVNZXRob2RFbGVtZW50cyh2YywgZWpiSmFyLCBtdC5nZXRNZXRob2RFbGVtZW50cygpKTsKLQkJCWlmICghaGFzVmFsaWRNZXRob2QpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCWl0ZXJhdG9yID0gbWV0aG9kUGVybWlzc2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWV0aG9kUGVybWlzc2lvbiBtcCA9IChNZXRob2RQZXJtaXNzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG1wLmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCS8vIDE1LjMuMiwgcC4gMjI5LCBhIDxtZXRob2QtcGVybWlzc2lvbj4gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZXRob2QgbGlzdGVkIChhbmQgdGhhdCBtZXRob2QgbXVzdCBiZSBmb3VuZCkKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCS8vIGF0IGxlYXN0IG9uZSBzZWN1cml0eS1yb2xlIG11c3QgYmUgZGVmaW5lZAotCQkJTGlzdCBtcHJvbGVzID0gbXAuZ2V0Um9sZXMoKTsKLQkJCWlmICgoKG1wcm9sZXMgPT0gbnVsbCkgfHwgKG1wcm9sZXMuc2l6ZSgpID09IDApKSAmJiAoIW1wLmlzU2V0VW5jaGVja2VkKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG1wLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVbmlxdWVBYnN0cmFjdFNjaGVtYU5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX2FzTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBU05hbWVXcmFwcGVyIHdyYXBwZXIgPSAoQVNOYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgd3JhcHBlci5nZXRCZWFuKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX2VqYk5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRWpiTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFamJOYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODk1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgd3JhcHBlci5nZXRCZWFuKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldEJlYW4oKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbGF0aW9uc2hpcHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGVqYkphci5nZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCWlmKHJlbGF0aW9uc2hpcHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0IGVqYlJlbGF0aW9uTGlzdCA9IHJlbGF0aW9uc2hpcHMuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZWpiUmVsYXRpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRUpCUmVsYXRpb24gcmVsYXRpb24gPSAoRUpCUmVsYXRpb24paXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlfcmVsYXRpb25zaGlwTmFtZS5hZGQobmV3IEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIocmVsYXRpb24pKTsKLQkJCQotCQkJYm9vbGVhbiBhdExlYXN0T25lQ21yRmllbGRFeGlzdHMgPSBmYWxzZTsKLQkJCUxpc3Qgcm9sZXMgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCQkJSXRlcmF0b3Igcm9sZUl0ZXJhdG9yID0gcm9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKHJvbGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSlyb2xlSXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCV9yZWxhdGlvbnNoaXBSb2xlTmFtZS5hZGQobmV3IEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcihyb2xlKSk7Ci0KLQkJCQlib29sZWFuIHZhbGlkTXVsdGlwbGljaXR5ID0gcm9sZS5pc1NldE11bHRpcGxpY2l0eSgpOwotCQkJCWlmKCF2YWxpZE11bHRpcGxpY2l0eSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MTgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCi0JCQkJLy8gMTAuMy40LjIgCi0JCQkJLy8gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkJCQkvLyBlbGVtZW50IGNvbnRhaW5lZCBpbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpZiB0aGUgKm90aGVyKiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkJCQkvLyBlbGVtZW50IGluIHRoZSBzYW1lIGVqYi1yZWxhdGlvbiBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSBvcHBvc2l0ZVJvbGUgPSByb2xlLmdldE9wcG9zaXRlKCk7Ci0JCQkJaWYocm9sZS5pc1NldENhc2NhZGVEZWxldGUoKSkgewotCQkJCQlib29sZWFuIGlzT3RoZXJNdWx0aXBsaWNpdHlPbmUgPSAoKG9wcG9zaXRlUm9sZS5pc1NldE11bHRpcGxpY2l0eSgpKSAmJiAob3Bwb3NpdGVSb2xlLmdldE11bHRpcGxpY2l0eSgpLmdldFZhbHVlKCkgPT0gTXVsdGlwbGljaXR5S2luZC5PTkUpKTsKLQkJCQkJaWYoIWlzT3RoZXJNdWx0aXBsaWNpdHlPbmUpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg0OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlDTVJGaWVsZCBjbXJGaWVsZCA9IHJvbGUuZ2V0Q21yRmllbGQoKTsKLQkJCQlpZihjbXJGaWVsZCAhPSBudWxsKSB7Ci0JCQkJCWF0TGVhc3RPbmVDbXJGaWVsZEV4aXN0cyA9IHRydWU7Ci0JCQkJCWlmKGNtckZpZWxkLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpKSkgewotCQkJCQkJU3RyaW5nIGNtckZpZWxkVHlwZSA9IGNtckZpZWxkLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpOwotCQkJCQkJaWYoKCFJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04uZXF1YWxzKGNtckZpZWxkVHlwZSkpICYmCi0JCQkJCQkJKCFJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX1NFVC5lcXVhbHMoY21yRmllbGRUeXBlKSkpIHsKLQkJCQkJCQkvLyBDSEtKMjg2ODogVGhlIHZhbHVlIG9mIHRoZSA8Y21yLWZpZWxkLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgImphdmEudXRpbC5Db2xsZWN0aW9uIiBvciAiamF2YS51dGlsLlNldCIgKEVKQiAyLjA6IDEwLjMuMTMsIDIyLjUpLgotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIHRoaXMpOwotCQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJUm9sZVNvdXJjZSBzb3VyY2VSb2xlU291cmNlID0gcm9sZS5nZXRTb3VyY2UoKTsKLQkJCQlpZihzb3VyY2VSb2xlU291cmNlID09IG51bGwpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgbmV3IFN0cmluZ1tde3JvbGUuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUVudGl0eSBzb3VyY2VFbnRpdHkgPSBzb3VyY2VSb2xlU291cmNlLmdldEVudGl0eUJlYW4oKTsKLQkJCQlpZihzb3VyY2VFbnRpdHkgPT0gbnVsbCkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117cm9sZS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihzb3VyY2VFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJLy8gQ0hLSjI4NjY6IDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGRlZmluZWQgb24gezF9IChFSkIgMi4wOiAyMi41KS4KLQkJCQkJaWYoY21yRmllbGQgIT0gbnVsbCkgewotCQkJCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSlzb3VyY2VFbnRpdHk7Ci0JCQkJCQlMaXN0IGNtckZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJCQkJCWJvb2xlYW4gZm91bmRfY21yRmllbGQgPSBmYWxzZTsKLQkJCQkJCWlmKChjbXJGaWVsZHMgIT0gbnVsbCkgJiYgKGNtckZpZWxkcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCWZvdW5kX2NtckZpZWxkID0gY21yRmllbGRzLmNvbnRhaW5zKGNtckZpZWxkKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYoIWZvdW5kX2NtckZpZWxkKSB7Ci0JCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgbmV3IFN0cmluZ1tde2NtckZpZWxkLmdldE5hbWUoKSwgc291cmNlRW50aXR5LmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENIS0oyODcxOiA8ZWpiLW5hbWU+IHswfSBtdXN0IHJlZmVyIHRvIGEgQ01QIGJlYW4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMykuCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg3MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIG5ldyBTdHJpbmdbXXtzb3VyY2VFbnRpdHkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKCBvcHBvc2l0ZVJvbGUgPT0gbnVsbCApCi0JCQkJCWNvbnRpbnVlOwotCQkJCVJvbGVTb3VyY2Ugb3Bwb3NpdGVSb2xlU291cmNlID0gb3Bwb3NpdGVSb2xlLmdldFNvdXJjZSgpOwotCQkJCWlmKG9wcG9zaXRlUm9sZVNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCS8vIERvIG5vdCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgLSB3aGVuIHdlIGl0ZXJhdGUgdG8gdGhlIHJvbGUgd2hlcmUKLQkJCQkJLy8gdGhpcyBpcyB0aGUgc291cmNlLCB0aGlzIGVycm9yIHdpbGwgYmUgZGV0ZWN0ZWQuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBvcHBvc2l0ZVJvbGVTb3VyY2UuZ2V0RW50aXR5QmVhbigpOwotCQkJCWlmKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkJCS8vIERvIG5vdCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgLSB3aGVuIHdlIGl0ZXJhdGUgdG8gdGhlIHJvbGUgd2hlcmUKLQkJCQkJLy8gdGhpcyBpcyB0aGUgc291cmNlLCB0aGlzIGVycm9yIHdpbGwgYmUgZGV0ZWN0ZWQuCi0JCQkJfQotCQkJCWVsc2UgaWYodGFyZ2V0RW50aXR5LmdldExvY2FsSW50ZXJmYWNlKCkgPT0gbnVsbCkgewotCQkJCQkvLyBEb2VzIHRoZSB0YXJnZXQgb2YgdGhpcyByb2xlIGhhdmUgYSBsb2NhbCBpbnRlcmZhY2U/Ci0JCQkJCS8vIENIS0oyODY3OiBUaGlzIGJlYW4gY2FuIGhhdmUgb25seSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGJlYW5zIChFSkIgMi4wOiAxMC4zLjIpLgotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBvcHBvc2l0ZVJvbGUsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gVmVyaWZ5IHVuaXF1ZSByb2xlIG5hbWVzIHdpdGhpbiB0aGUgPGVqYi1yZWxhdGlvbj4KLQkJCXZhbGlkYXRlVW5pcXVlUmVsYXRpb25zaGlwUm9sZU5hbWVzKHZjLCBlamJKYXIpOwotCQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmNsZWFyKCk7Ci0JCQkKLQkJCWlmKCFhdExlYXN0T25lQ21yRmllbGRFeGlzdHMpIHsKLQkJCQkvLyBDSEtKMjg2OUk6IEF0IGxlYXN0IG9uZSA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiBtdXN0IGRlZmluZSBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJlbGF0aW9uLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotCQl2YWxpZGF0ZVVuaXF1ZVJlbGF0aW9uTmFtZXModmMsIGVqYkphcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVW5pcXVlUmVsYXRpb25OYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJTGlzdCBuYW1lcyA9IF9yZWxhdGlvbnNoaXBOYW1lLmdldER1cGxpY2F0ZXMoKTsKLQkJaWYobmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVKQlJlbGF0aW9uTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgxNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHdyYXBwZXIuZ2V0UmVsYXRpb24oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0UmVsYXRpb24oKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVbmlxdWVSZWxhdGlvbnNoaXBSb2xlTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfcmVsYXRpb25zaGlwUm9sZU5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyIHdyYXBwZXIgPSAoRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgxNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHdyYXBwZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLCBuZXcgU3RyaW5nW117d3JhcHBlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJvdGggc2VjdGlvbiAxMS40LjEgYW5kIDE1LjMuMiBuZWVkIHRoZSA8bWV0aG9kPiBlbGVtZW50LiBBbHNvIHJlZmVyCi0JICogdG8gMTYuNSBmb3Igc3ludGF4LgotCSAqCi0JICogUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBtZXRob2RzIHJlZmVyZW5jZWQgYnkgdGhpcyBsaXN0IG9mIAotCSAqIE1ldGhvZEVsZW1lbnQgY2FuIGJlIGZvdW5kLgotCSovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVNZXRob2RFbGVtZW50cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIExpc3QgZWxlbWVudHMpIHsKLQkJaWYgKChlbGVtZW50cyA9PSBudWxsKSB8fCAoZWxlbWVudHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSBlbGVtZW50LmdldEVudGVycHJpc2VCZWFuKCk7Ci0JCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQotCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBlbGVtZW50LmdldE1ldGhvZHMoKTsgLy8gZ2V0IGFsbCBtZXRob2RzIHdoaWNoIHdpbGwgYmUgcmV0cmlldmVkIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLXBlcm1pc3Npb24KLQkJCQlib29sZWFuIGhhc01ldGhvZHMgPSAoKG1ldGhvZHMgIT0gbnVsbCkgJiYgKG1ldGhvZHMubGVuZ3RoID4gMCkpOwotCi0JCQkJaWYgKCFoYXNNZXRob2RzKSB7Ci0JCQkJCS8vIHdhcm5pbmcKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQloYXNWYWxpZE1ldGhvZCA9IHRydWU7IC8vIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCAoMTUuMy4yLCBwLjIyOSkKLQkJCQkJaWYgKG5hbWUuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTGlzdCBwYXJhbXMgPSBlbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotCQkJCQkJaWYgKChwYXJhbXMgIT0gbnVsbCkgJiYgKHBhcmFtcy5zaXplKCkgPiAwKSkgewotCQkJCQkJCS8vIHdhcm5pbmcKLQkJCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaGFzVmFsaWRNZXRob2Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDbGllbnRKQVIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCVN0cmluZyBjbGllbnRKQVJOYW1lID0gZWpiSmFyLmdldEVqYkNsaWVudEphcigpOwotCQlpZihjbGllbnRKQVJOYW1lID09IG51bGwpIHsKLQkJCS8vIE5vIGNsaWVudCBKQVIgc3BlY2lmaWVkOyBldmVyeXRoaW5nJ3Mgb2theS4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQm9vbGVhbiBleGlzdHMgPSAoQm9vbGVhbil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9DTElFTlRKQVIsIG5ldyBPYmplY3RbXXtjbGllbnRKQVJOYW1lfSk7Ci0JCWlmKGV4aXN0cyA9PSBudWxsKSB7Ci0JCQkvLyBIZWxwZXIgZG9lc24ndCBzdXBwb3J0IGxvYWQgbW9kZWwuIFdBUz8KLQkJCS8vIENhbid0IHBlcmZvcm0gdGhpcyBjaGVjaywgc28ganVzdCByZXR1cm4uCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCFleGlzdHMuYm9vbGVhblZhbHVlKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgZWpiSmFyLCBuZXcgU3RyaW5nW117Y2xpZW50SkFSTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQljbGFzcyBBU05hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgQVNOYW1lV3JhcHBlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBBU05hbWVXcmFwcGVyKSB7Ci0JCQkJQVNOYW1lV3JhcHBlciBvdGhlciA9IChBU05hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9iZWFuLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuZXF1YWxzKG90aGVyLmdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYoKGdldEJlYW4oKSAhPSBudWxsKSAmJiAoZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIEVKQiBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZS4KLQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkgKgotCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkgKi8KLQljbGFzcyBFamJOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgRW50ZXJwcmlzZUJlYW4gX2JlYW4gPSBudWxsOwotCi0JCXB1YmxpYyBFamJOYW1lV3JhcHBlcihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQlfYmVhbiA9IGJlYW47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgRWpiTmFtZVdyYXBwZXIpIHsKLQkJCQlFamJOYW1lV3JhcHBlciBvdGhlciA9IChFamJOYW1lV3JhcHBlcilvOwotCQkJCWlmKChfYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldEJlYW4oKS5nZXROYW1lKCkgPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoX2JlYW4uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmKG90aGVyLmdldEJlYW4oKS5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfYmVhbi5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldEJlYW4oKS5nZXROYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYoKGdldEJlYW4oKSAhPSBudWxsKSAmJiAoZ2V0QmVhbigpLmdldE5hbWUoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBnZXRCZWFuKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJlbGF0aW9uIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVKQlJlbGF0aW9uIF9yZWxhdGlvbiA9IG51bGw7Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIoRUpCUmVsYXRpb24gcmVsKSB7Ci0JCQlfcmVsYXRpb24gPSByZWw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgRUpCUmVsYXRpb25OYW1lV3JhcHBlcikgewotCQkJCUVKQlJlbGF0aW9uTmFtZVdyYXBwZXIgb3RoZXIgPSAoRUpCUmVsYXRpb25OYW1lV3JhcHBlcilvOwotCQkJCWlmKChfcmVsYXRpb24uZ2V0TmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfcmVsYXRpb24uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmKG90aGVyLmdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX3JlbGF0aW9uLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYoKGdldFJlbGF0aW9uKCkgIT0gbnVsbCkgJiYgKGdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCi0JCXB1YmxpYyBFSkJSZWxhdGlvbiBnZXRSZWxhdGlvbigpIHsKLQkJCXJldHVybiBfcmVsYXRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcmVsYXRpb24gbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFSkJSZWxhdGlvbnNoaXBSb2xlIF9yZWxhdGlvbnNoaXBSb2xlID0gbnVsbDsKLQotCQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSkgewotCQkJX3JlbGF0aW9uc2hpcFJvbGUgPSByb2xlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcikgewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlciBvdGhlciA9IChFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX3JlbGF0aW9uc2hpcFJvbGUuZ2V0Um9sZU5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkgPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoX3JlbGF0aW9uc2hpcFJvbGUuZ2V0Um9sZU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9yZWxhdGlvbnNoaXBSb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRSZWxhdGlvbnNoaXBSb2xlKCkgIT0gbnVsbCkgJiYgKGdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCi0JCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0JCQlyZXR1cm4gX3JlbGF0aW9uc2hpcFJvbGU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzk2YjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRUpCVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBJRUpCVmFsaWRhdGlvbkNvbnRleHQgewotCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0aW9uQ29udGV4dCBfaGVscGVyID0gbnVsbDsKLQlwcml2YXRlIElSZXBvcnRlciBfcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgTG9nRW50cnkgbG9nRW50cnkgPSBudWxsOwotLy8JcHJpdmF0ZSBJTWVzc2FnZSBfbWVzc2FnZSA9IG51bGw7Ci0JCi0JcHVibGljIEVKQlZhbGlkYXRpb25Db250ZXh0KElWYWxpZGF0b3IgdiwgSVZhbGlkYXRpb25Db250ZXh0IGgsIElSZXBvcnRlciByKSB7Ci0JCXNldFZhbGlkYXRvcih2KTsKLQkJc2V0SGVscGVyKGgpOwotCQlzZXRSZXBvcnRlcihyKTsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdikgewotCQlfdmFsaWRhdG9yID0gdjsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0aW9uQ29udGV4dCBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBfaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoSVZhbGlkYXRpb25Db250ZXh0IGgpIHsKLQkJX2hlbHBlciA9IGg7Ci0JfQotCQotCXB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKSB7Ci0JCXJldHVybiBfcmVwb3J0ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKElSZXBvcnRlciByKSB7Ci0JCV9yZXBvcnRlciA9IHI7Ci0JfQotCQotIAkvKgotIAkgKiBSZXR1cm5zIGFuIGVtcHR5IE1lc3NhZ2Ugd2hpY2ggY2FuIGJlIHJldXNlZC4KLSAJICovCi0gCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotIAkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7Ci0gCQltZXNzYWdlLnNldEJ1bmRsZU5hbWUoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0gCQlyZXR1cm4gbWVzc2FnZTsKLSAJCS8qCi0gCQlpZihfbWVzc2FnZSA9PSBudWxsKSB7Ci0gCQkJX21lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOwotIAkJfQotIAkJCi0gCQlyZXNldChfbWVzc2FnZSk7Ci0gCQlfbWVzc2FnZS5zZXRCdW5kbGVOYW1lKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotIAkJCi0JCXJldHVybiBfbWVzc2FnZTsKLQkJKi8KLQl9Ci0JCi0JCS8qKgotCSAqIElmLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYW4gSU1lc3NhZ2UgaXMgcmV1c2VkIGluc3RlYWQgb2YgY3JlYXRpbmcKLQkgKiBhIG5ldyBvbmUgZWFjaCB0aW1lLCB0aGlzIG1ldGhvZCByZXNldHMgdGhlIGludGVybmFsIGZpZWxkcyB0byB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmVhbGx5IGJlIG9uIHRoZSBJTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGJ1dAotCSAqIHRoaXMnbGwgZG8gZm9yIG5vdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldChJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCW1lc3NhZ2Uuc2V0SWQobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKG51bGwpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KE1lc3NhZ2VGaWx0ZXIuQU5ZX1NFVkVSSVRZKTsKLQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0QnVuZGxlTmFtZShudWxsKTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKElNZXNzYWdlLkxJTkVOT19VTlNFVCk7Ci0JCW1lc3NhZ2Uuc2V0T2Zmc2V0KElNZXNzYWdlLk9GRlNFVF9VTlNFVCk7Ci0JCW1lc3NhZ2Uuc2V0TGVuZ3RoKElNZXNzYWdlLk9GRlNFVF9VTlNFVCk7Ci0JfQotCQotCQotCQotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkoyRUVfQ09SRV9QTFVHSU4pOwotCX0KLQkKLQlwdWJsaWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JICAgIGlmKGxvZ0VudHJ5ID09IG51bGwpCi0JICAgICAgICBsb2dFbnRyeSA9IG5ldyBMb2dFbnRyeShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkJcmV0dXJuIGxvZ0VudHJ5OwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIGdldEhlbHBlcigpLmxvYWRNb2RlbChzeW1ib2xpY05hbWUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcykgewotCQlyZXR1cm4gZ2V0SGVscGVyKCkubG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgcGFybXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcygpIHsKLQkJZ2V0UmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhnZXRWYWxpZGF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzKE9iamVjdCB0YXJnZXQpIHsKLQkJZ2V0UmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhnZXRWYWxpZGF0b3IoKSwgdGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwSWRlbnRpZmllcikgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZU1lc3NhZ2VTdWJzZXQoZ2V0VmFsaWRhdG9yKCksIHRhcmdldCwgZ3JvdXBJZGVudGlmaWVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldCkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gIG5ldyBNZXNzYWdlKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUsc2V2ZXJpdHksbWVzc2FnZUlkLG51bGwsdGFyZ2V0KTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSAgbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMsdGFyZ2V0KTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJLyoqCi0JCSAqIDExLzI4LzA1IENvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGdldCByaWQgb2YgV2FybmluZyBtZXNzYWdlCi0JCSAqIFF1aXRlIHBvc3NpYmx5IHRoZSBnZXRSb3BvcnRlcigpLmFkZE1lc3NhZ2UgbmVlZHMgdG8gYmUgdXNlZC4KLQkJICogCi0JCSAqLwotCQkKLQkJLy9JTWVzc2FnZSBtZXNzYWdlID0gIG5ldyBNZXNzYWdlKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUsc2V2ZXJpdHksbWVzc2FnZUlkLG51bGwsdGFyZ2V0LGdyb3VwTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMsdGFyZ2V0LGdyb3VwTmFtZSk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVybWluYXRlSWZDYW5jZWxsZWQoKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCWlmKGdldFJlcG9ydGVyKCkuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCkgewotCQlzdWJ0YXNrKG1lc3NhZ2VJZCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHsKLQkJaWYoKG1lc3NhZ2VJZCA9PSBudWxsKSB8fCAobWVzc2FnZUlkLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlJTWVzc2FnZSBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotCQltZXNzYWdlLnNldElkKG1lc3NhZ2VJZCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKHBhcm1zKTsKLQkJZ2V0UmVwb3J0ZXIoKS5kaXNwbGF5U3VidGFzayhnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMzczYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIENvcmUgRUpCIFZhbGlkYXRpb24gcnVsZXMKLSAqLwotcHVibGljIGNsYXNzIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgX2luc3QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBjb250ZXh0TWFwID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5KCkgewotCQljcmVhdGVSdWxlTGlzdCgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCXByb3RlY3RlZCBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCl7Ci0JICAgIGlmKGxvZ2dlciA9PSBudWxsKQotCSAgICAgICAgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkoyRUVfQ09SRV9QTFVHSU4pOwotCSAgICByZXR1cm4gbG9nZ2VyOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUnVsZUxpc3QoKSB7Ci0JCV9ydWxlTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VKQkpBUiwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRUpCSmFyMTFWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkpBUiwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRUpCSmFyMjBWUnVsZSgpKTsKLQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FbnRlcnByaXNlQmVhbjExVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FTlRFUlBSSVNFQkVBTiwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRW50ZXJwcmlzZUJlYW4yMFZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZVNlc3Npb25CZWFuKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlU2Vzc2lvblJlbW90ZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVTZXNzaW9uSG9tZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25Mb2NhbEhvbWVWUnVsZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUNNUEJlYW4oKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUNNUFJlbW90ZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9LRVlDTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVDTVBLZXkoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QQmVhbkNsYXNzVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBSZW1vdGVDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBSZW1vdGVIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUExvY2FsQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBMb2NhbEhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QS2V5Q2xhc3NWUnVsZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUJNUEJlYW4oKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUJNUFJlbW90ZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUJNUEhvbWUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QS2V5KCkpOwotCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBCZWFuQ2xhc3NWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUFJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUFJlbW90ZUhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QTG9jYWxDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUExvY2FsSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBLZXlDbGFzc1ZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUoKSk7Ci0JCQotCQlhZGREZXBlbmRlbnRSdWxlVG9SdWxlTGlzdCgpOwotCQlsb2dBbGxEZXBlbmRlbnRSdWxlcygpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgSUZpbGVEZWx0YSByZXByZXNlbnRzIGEgc3RhdGljIGxvYWQgbW9kZWwgKGkuZS4sIHRoZSBmaWxlIG5hbWUgaXMgYWx3YXlzIHRoZSBzYW1lKSwKLQkgKiB0aGVuIHJldHVybiB0aGUgSW50ZWdlciB3aGljaCBsb2FkcyB0aGF0IG1vZGVsLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljICBPYmplY3QgZ2V0UnVsZUlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmKGZpbGVOYW1lID09IG51bGwpIHsKLQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAoYUxvZ2dlciAhPSBudWxsICYmIGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlIGZyb20gZmlsZU5hbWU6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRUpCSmFyIGVqYkphciA9IGdldEVKQkphcih2Yyk7Ci0KLQkJaWYoZmlsZU5hbWUuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSkpIHsKLQkJCWlmKGVqYkphci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKSB7Ci0JCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCSkFSOwotCQkJfQotCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSOwotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBtdXN0IGJlIGEgSmF2YUNsYXNzCi0JfQotCQotCS8qKgotCSAqIElmIHRoZSBJRmlsZURlbHRhIHJlcHJlc2VudHMgYSBkeW5hbWljIGxvYWQgbW9kZWwgKGkuZS4sIHRoZSBmaWxlIG5hbWUgY2FuIGJlIGNoYW5nZWQgYnkgdGhlCi0JICogdXNlciksIHRoZW4gcmV0dXJuIHRoZSBJbnRlZ2VyIHdoaWNoIGxvYWRzIHRoYXQgbW9kZWwuIFJldHVybiBudWxsIGlmIG5vIHN1Y2ggbW9kZWwgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0UnVsZUlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgSmF2YUNsYXNzIGNsYXp6LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIFJldHVybiB0aGUgcnVsZSBpZCB3aGljaCB3aWxsIHZhbGlkYXRlIHRoZSBKYXZhQ2xhc3MgYXMgdGhlIAotCQkvLyB0eXBlIHdoaWNoIGl0IGlzIHVzZWQgYXMgYnkgdGhlIEVudGVycHJpc2VCZWFuLgotCQlpZigoY2xhenogPT0gbnVsbCkgfHwgKGJlYW4gPT0gbnVsbCkpIHsKLQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAoYUxvZ2dlciAhPSBudWxsICYmIGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlIGJlY2F1c2UgZWl0aGVyIGJlYW4gKCIgKyBiZWFuICsgIikgb3IgY2xhc3MgKCIgKyBjbGF6eiArICIpIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gaXNTdGF0ZWxlc3NTZXNzaW9uID0gKGJlYW4uaXNTZXNzaW9uKCkgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVsZXNzKGJlYW4pKTsKLQkJYm9vbGVhbiBpc1N0YXRlZnVsU2Vzc2lvbiA9IChiZWFuLmlzU2Vzc2lvbigpICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlZnVsKGJlYW4pKTsKLQkJCi0JCWlmKGJlYW4uZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0RWpiQ2xhc3MoKSkpIHsKLQkJCQlpZihpc1N0YXRlbGVzc1Nlc3Npb24pIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyICE9IG51bGwgJiYgYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihpc1N0YXRlbGVzc1Nlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWlmKGNsYXp6LmVxdWFscygoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCWlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCQkJCS8vIElmIGl0J3MgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGl0J3MgZXhlbXB0IGZyb20gdGhlc2UgY2hlY2tzLgotCQkJCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUzsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIGlmKGJlYW4uZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkgewotCQkJaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0RWpiQ2xhc3MoKSkpIHsKLQkJCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjFfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldEVqYkNsYXNzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjFfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9IT01FOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGJlYW4gaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlpZihjbGF6ei5lcXVhbHMoKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpKSkgewotCQkJCQlpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCQkJCQkvLyBJZiBpdCdzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LCBpdCdzIGV4ZW1wdCBmcm9tIHRoZXNlIGNoZWNrcy4KLQkJCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9LRVlDTEFTUzsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1M7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjFfWCgpICYmIGNsYXp6LmVxdWFscygoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiAhYmVhbi5pc1ZlcnNpb24xX1goKSAmJiAhYmVhbi5pc1ZlcnNpb24yX1goKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJVmFsaWRhdGlvblJ1bGUgZ2V0UnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJTWFwIHJ1bGVNYXAgPSAoTWFwKSBjb250ZXh0TWFwLmdldCh2Yy5nZXRSZXBvcnRlcigpKTsKLQkJaWYocnVsZU1hcCA9PSBudWxsKXsKLQkJCS8vIGluc3RhbnRpYXRlIGEgbmV3IHNldCBvZiBydWxlcyBmb3IgZWFjaCBpbnN0YW5jZSBvZiBFSkIgdmFsaWRhdG9yIGFzIHRoZSBydWxlIGNsYXNzZXMKLQkJCS8vIGFyZSBub3QgdGhyZWFkIHNhZmUsIGluIGNhc2Ugd2hlbiBtdWx0aXBsZSBlamIgdmFsaWRhdG9ycyBydW4gb24gbXVsdGlwbGUgcHJvamVjdHMgYXQKLQkJCS8vIHRoZSBzYW1lIHRpbWUsIHJ1bGUgb2JqZWN0cyBjYW4gcmVwb3J0IGluY29ycmVjdCBlcnJvcnMgc2VlIGJ1ZyAxODcyODYKLQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpOwotCQkJcnVsZU1hcCA9IGZhY3RvcnkuX3J1bGVMaXN0OwotCQkJY29udGV4dE1hcC5wdXQodmMuZ2V0UmVwb3J0ZXIoKSwgcnVsZU1hcCk7Ci0JCX0KLQkJT2JqZWN0IHJ1bGUgPSBydWxlTWFwLmdldChydWxlSWQpOwotICAgIAlpZihydWxlID09IG51bGwpIHsKLSAgICAJCS8vIE5vIHN1Y2ggcnVsZUlkIHJlZ2lzdGVyZWQuCi0gICAgCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0gICAgCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0gICAgCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlIGZyb20gcnVsZUlkOiAiICsgcnVsZUlkKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJfQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJcmV0dXJuIChJVmFsaWRhdGlvblJ1bGUpcnVsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXJSdWxlTWFwKElSZXBvcnRlciByZXBvcnRlcil7Ci0JCWNvbnRleHRNYXAucmVtb3ZlKHJlcG9ydGVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYwZDk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRUpCVmFsaWRhdG9yIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUYXJnZXRPYmplY3RQb29sIF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIExvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsKLQkKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdG9yKCkgewotCQlfaW5zdCA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRUpCVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcml2YXRlIExvZ0VudHJ5IGdldExvZ0VudHJ5KCl7Ci0JICAgIGlmKGxvZ0VudHJ5ID09IG51bGwpCi0JICAgICAgICBsb2dFbnRyeSA9IG5ldyBMb2dFbnRyeShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkgICAgcmV0dXJuIGxvZ0VudHJ5OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gImVqYnZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21tb25WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkoyRUVfQ09SRV9QTFVHSU4pOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkJWYWxpZGF0b3I6OnZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoInZhbGlkYXRlIHRvb2sgIiArIChlbmQgLSBzdGFydCkgKyAiIG1pbGxpc2Vjb25kcy4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBlbnRyeSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUVKQlZhbGlkYXRpb25Db250ZXh0IHZjID0gbmV3IEVKQlZhbGlkYXRpb25Db250ZXh0KHRoaXMsIGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJc2V0VmFsaWRhdGlvbkNvbnRleHQodmMpOwotCQkJaWYgKGlzRnVsbFZhbGlkYXRlKHZjKSkgewotCQkJCWZ1bGxWYWxpZGF0ZSh2Yyk7Ci0JCQl9IGVsc2UgewotCQkJCWluY3JlbWVudGFsVmFsaWRhdGUodmMpOwotCQkJfQotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCVmFsaWRhdG9yOjp2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgidmFsaWRhdGUgdG9vayAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBlbnRyeSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0KLQkJfQotCX0JCi0JCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNvbW1vblZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNvbW1vblZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGxWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHsKLQkJU3RyaW5nW10gZmlsZVVSSXMgPSB2Yy5nZXRVUklzKCk7Ci0JCWlmKGZpbGVVUklzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmKGZpbGVVUklzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8ZmlsZVVSSXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB1cmkgPSBmaWxlVVJJc1tpXTsKLQkJCWlmKHVyaS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bkRlcGVuZGVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJZiBhIGNsYXNzIGlzIGJlaW5nIHJ1biBvbmx5IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHJ1bGUgd2hpY2ggaGFzIGNoYW5nZWQsCi0JCS8vIGkuZS4sIGl0J3MgYSBkZXBlbmRlbnQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBydW4gaXRzIGRlcGVuZGVudHMgYmVjYXVzZSB0aGUKLQkJLy8gY2xhc3MgaXRzZWxmIGhhc24ndCBjaGFuZ2VkLgotCQlTZXQgZGVwZW5kZW50cyA9IHJ1bGUuZ2V0RGVwZW5kZW50cygpOwotCQlpZihkZXBlbmRlbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlJVmFsaWRhdGlvblJ1bGUgZFJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlPYmplY3QgZFJ1bGVUYXJnZXQgPSBkUnVsZS5nZXRUYXJnZXQodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQkJCWlmKGRSdWxlVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJcnVuKGRSdWxlLCB0YXJnZXRQYXJlbnQsIGRSdWxlVGFyZ2V0KTsgLy8gZmFsc2U9bm90IGZ1bGwgdmFsaWRhdGlvbgotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIGV4Yyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UocnVsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBpbnRlcm5hbEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTAwOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nUnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2Yyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZVJlbW92ZU9sZE1lc3NhZ2VzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTGlzdCB2YWxpZGF0ZWRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsJCi0JCQlTdHJpbmdbXSB1cmlzID0gdmMuZ2V0VVJJcygpOwotCQkJZm9yKGludCBpPTA7IGk8dXJpcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB1cmlJbnN0ID0gdXJpc1tpXTsKLQkJCQlpZigodXJpSW5zdCA9PSBudWxsKSB8fCAodXJpSW5zdC5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIHVyaUluc3QpOwotCQkJCWlmKGlkID09IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gY2xhenpBbmRCZWFuID0gKE9iamVjdFtdKXZjLmxvYWRNb2RlbCh1cmlJbnN0LCBudWxsKTsgLy8gRG9uJ3QgbmVlZCBhIHNlY29uZCBwYXJhbWV0ZXIsIGJ1dCBjYW4ndCBjYXN0IGEgUmVmT2JqZWN0IHRvIGFuIE9iamVjdFtdLCBzbyB1c2UgdGhlIHNlY29uZCBsb2FkIG1ldGhvZC4KLQkJCQkJaWYoY2xhenpBbmRCZWFuID09IG51bGwpIHsKLQkJCQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQotCQkJCQkvLyBJbiB0aGUgY2xhenpBbmRCZWFuIG9iamVjdCBhcnJheSwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBKYXZhQ2xhc3MsCi0JCQkJCS8vIGFuZCB0aGUgcmVzdCBvZiB0aGUgZW50cmllcyBhcmUgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlcyB3aGljaCAKLQkJCQkJLy8gdXNlIHRoZSBKYXZhQ2xhc3MuCi0JCQkJCUphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpY2xhenpBbmRCZWFuWzBdOwotCQkJCQlMaXN0IGJlYW5zID0gKExpc3QpY2xhenpBbmRCZWFuWzFdOwotCi0JCQkJCS8vIFRoZSB2YWxpZGF0ZWRDbGFzcyBzZXQga2VlcHMgdHJhY2sgb2YgSmF2YUNsYXNzZXMgCi0JCQkJCS8vIHRoYXQgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhpcyBzZXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgCi0JCQkJCS8vIHdob3NlIGNoaWxkcmVuIG5lZWQgdG8gYmUgZm91bmQgYW5kIHZhbGlkYXRlZC4gCi0JCQkJCS8vIFZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFmdGVyIGFsbCBvZiB0aGUgY2hhbmdlZCBmaWxlcyAKLQkJCQkJLy8gYXJlIHZhbGlkYXRlZCBzbyB0aGF0IGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgYWxsIG9mCi0JCQkJCS8vIHRoZSBjaGFuZ2VkIGZpbGVzIGNhbiBiZSBzZWFyY2hlZCBmb3IgYXQgb25jZS4gU2VhcmNoaW5nCi0JCQkJCS8vIG9uY2Ugb24gYSBncm91cCBwcm9kdWNlcyBwZXJmb3JtYW5jZSBzYXZpbmdzIGJlY2F1c2UKLQkJCQkJLy8gdGhlIHR5cGUgaGllcmFyY2h5IG1ldGhvZCB0YWtlcyBhIG5vbi10cml2aWFsIGFtb3VudAotCQkJCQkvLyBvZiB0aW1lIHdoZW4gdGhlcmUncyBhIGxhcmdlIGdyb3VwIG9mIGRlbHRhcy4KLQkJCQkJdmFsaWRhdGVkQ2xhc3Nlcy5hZGQoY2xhenopOwotCi0JCQkJCWlmKChiZWFucyA9PSBudWxsKSB8fCAoYmVhbnMuc2l6ZSgpID09IDApKSB7Ci0JCQkJCQkvLyBUaGUgSmF2YUNsYXNzIGl0c2VsZiBpcyBub3QgcGFydCBvZiBhbiBlbnRlcnByaXNlIGJlYW4sIGJ1dCBvbmUgb2YgaXRzIGNoaWxkcmVuIG1heSBiZS4KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNsYXp6LCBiZWFuKTsKLQkJCi0JCQkJCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQkJCWlmKGNsYXp6UnVsZSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IChpZiBpdCdzCi0JCQkJCQkJCS8vIGFuIGVycm9yIC0gdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUga2V5IGlzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5KS4KLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkKLQkJCQkJCQlzZXRWYWxpZGF0ZWQoY2xhenpSdWxlLmdldElkKCksIGJlYW4sIGNsYXp6KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCQkJaWYoZWpiSmFyID09IG51bGwpIHsKLQkJCQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJVmFsaWRhdGlvblJ1bGUgZWpiRXh0UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQlpZihlamJFeHRSdWxlID09IG51bGwpIHsKLQkJCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LCBzbyBqdXN0Ci0JCQkJCQkvLyBuZWVkIHRvIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0aGUgdGFzayBsaXN0LgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXNldFZhbGlkYXRlZChlamJFeHRSdWxlLmdldElkKCksIG51bGwsIGVqYkphcik7Ci0JCQkJfQotCQkJfSAvLyBlbmQgZm9yCi0JCQkKLQkJCS8vIEFsd2F5cyB2YWxpZGF0ZSBlamItamFyLnhtbCwgYmVjYXVzZSBhIGNoYW5nZSB0byBvbmUgb2YgdGhlIGZpbGVzIGl0IHJlZmVyZW5jZXMKLQkJCS8vIG1heSBtZWFuIHRoYXQgaXQgbmVlZHMgdG8gYmUgcmV2YWxpZGF0ZWQuCQotCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQkJaWYoZWpiSmFyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgaWQgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGVJZCh2YywgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSk7Ci0JCQkJaWYoaWQgPT0gbnVsbCkgewotCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVmFsaWRhdGlvblJ1bGUgZWpiSmFyUnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQlpZihlamJKYXJSdWxlID09IG51bGwpIHsKLQkJCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJCX0KLQkJCQkJc2V0VmFsaWRhdGVkKGVqYkphclJ1bGUuZ2V0SWQoKSwgbnVsbCwgZWpiSmFyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKHZhbGlkYXRlZENsYXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCS8vIENoZWNrIHRoZSBjaGlsZHJlbiBvZiB0aGUgY2hhbmdlZCBjbGFzc2VzLgotCQkJCS8vIFRoaXMgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZGVwZW5kZW50cywgYmVjYXVzZQotCQkJCS8vIHRoZSBkZXBlbmRlbnRzIG9mIHRoZSBjaGlsZHJlbiBjbGFzc2VzIG11c3QgYmUgY2hlY2tlZAotCQkJCS8vIGFzIHdlbGwuCi0KLQkJCQkvLyBDbGFzcyBuZXZlciB2YWxpZGF0ZWQgYmVmb3JlLCBzbyBjaGVjayBpdHMgY2hpbGRyZW4KLQkJCQlmb3IgKGludCB2QyA9IDA7IHZDPHZhbGlkYXRlZENsYXNzZXMuc2l6ZSgpOyB2QysrKSB7Ci0JCQkJCUxpc3QgYmVhbnMgPSAoTGlzdCl2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQiwgbmV3IE9iamVjdFtde3ZhbGlkYXRlZENsYXNzZXMuZ2V0KHZDKX0pOwotCQkJCQlpZigoYmVhbnMgPT0gbnVsbCkgfHwgKGJlYW5zLnNpemUoKSA9PSAwKSkgewotCQkJCQkJLy8gVGhlIGNsYXNzIGlzIG5vdCBhIG1lbWJlciBvZiBhbiBlbnRlcnByaXNlIGJlYW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlTZXQgcm9vdFZhbGlkYXRlZENsYXNzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJcm9vdFZhbGlkYXRlZENsYXNzLmFkZCh2YWxpZGF0ZWRDbGFzc2VzLmdldCh2QykpOwotCQkJCQlKYXZhQ2xhc3NbXSBjaGlsZHJlbiA9IChKYXZhQ2xhc3NbXSl2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkNISUxEUkVOLCBuZXcgT2JqZWN0W117dmMuZ2V0UmVwb3J0ZXIoKSwgcm9vdFZhbGlkYXRlZENsYXNzfSk7Ci0JCQkJCWlmKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHsKLQkJCQkJCUl0ZXJhdG9yIGJjaXRlcmF0b3IgPSBudWxsOwotCQkJCQkJT2JqZWN0IGlkID0gbnVsbDsKLQkJCQkJCWZvcihpbnQgYz0wOyBjPGNoaWxkcmVuLmxlbmd0aDsgYysrKSB7Ci0JCQkJCQkJSmF2YUNsYXNzIGNoaWxkID0gY2hpbGRyZW5bY107Ci0JCQkJCQkJYmVhbnMgPSAoTGlzdCl2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQiwgbmV3IE9iamVjdFtde2NoaWxkfSk7Ci0JCQkJCQkJLy8gVGhlIGNoaWxkIGlzIG5vdCBhIG1lbWJlciBvZiBhbiBlbnRlcnByaXNlIGJlYW4uCi0JCQkJCQkJaWYoKGJlYW5zID09IG51bGwpIHx8IChiZWFucy5zaXplKCkgPT0gMCkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWJjaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlKGJjaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pYmNpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNoaWxkLCBiZWFuKTsKLQkJCQkJCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSwgc28ganVzdCBuZWVkIHRvIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0aGUgdGFzayBsaXN0LgotCQkJCQkJCQlpZihjbGF6elJ1bGUgPT0gbnVsbCkKLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQlzZXRWYWxpZGF0ZWQoY2xhenpSdWxlLmdldElkKCksIGJlYW4sIGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFsaWRhdGVkQ2xhc3Nlcy5jbGVhcigpOyAvLyBEb24ndCBuZWVkIHRoaXMgY2FjaGUgYW55IG1vcmU7IGZyZWUgdGhlIG1lbW9yeS4KLQkJCX0KLQkJCQotCQkJLy8gTm93LCB2YWxpZGF0ZSB0aGUgZGVwZW5kZW50cy4KLQkJCXRhcmdldHMucHV0QWxsKF92YWxpZGF0ZWQpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXJnZXRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgaWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSVZhbGlkYXRpb25SdWxlIHJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZihydWxlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCVNldCBjb250ZXh0cyA9IChTZXQpdGFyZ2V0cy5nZXQoaWQpOwotCQkJCWlmKGNvbnRleHRzID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCUl0ZXJhdG9yIGNJdGVyYXRvciA9IGNvbnRleHRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoY0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlUYXJnZXRPYmplY3QgdG8gPSAoVGFyZ2V0T2JqZWN0KWNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCU9iamVjdCB0YXJnZXRQYXJlbnQgPSB0by5nZXRUYXJnZXRQYXJlbnQoKTsKLQkJCQkJT2JqZWN0IHRhcmdldCA9IHRvLmdldFRhcmdldCgpOwotCQkJCQlTZXQgZGVwZW5kZW50cyA9IHJ1bGUuZ2V0RGVwZW5kZW50cygpOwotCQkJCQlpZihkZXBlbmRlbnRzID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJdGVyYXRvciBkSXRlcmF0b3IgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlKGRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSVZhbGlkYXRpb25SdWxlIGRSdWxlID0gKElWYWxpZGF0aW9uUnVsZSlkSXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCBkUnVsZVRhcmdldCA9IGRSdWxlLmdldFRhcmdldCh0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCQkJCQkJaWYoZFJ1bGVUYXJnZXQgIT0gbnVsbCkgewotCQkJCQkJCQlzZXRWYWxpZGF0ZWQoZFJ1bGUuZ2V0SWQoKSwgdGFyZ2V0UGFyZW50LCBkUnVsZVRhcmdldCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCBleGMpOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHJ1bGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gTm8gbWF0dGVyIHdoYXQsIGNsZWFyIHRoZSB0ZW1wb3JhcnkgY2FjaGVzLgotCQkJdGFyZ2V0cy5jbGVhcigpOwotCQkJdmFsaWRhdGVkQ2xhc3Nlcy5jbGVhcigpOwotCQkJCi0JCQkvLyBOb3cgcHV0IHRoZSAidmFsaWRhdGVkIiByZXN1bHRzIGluICJkb25lIiwgYmVjYXVzZSB0aGV5IHdlcmVuJ3QKLQkJCS8vIHJlYWxseSB2YWxpZGF0ZWQ7IGl0IHdhcyBqdXN0IGEgdHJhY2tpbmcgbWVjaGFuaXNtLgotCQkJdGFyZ2V0cy5wdXRBbGwoX3ZhbGlkYXRlZCk7Ci0JCQlfdmFsaWRhdGVkLmNsZWFyKCk7IC8vIENsZWFyIHRoZSAidmFsaWRhdGVkIiBjYWNoZSBiZWNhdXNlIHRoZSB0YXJnZXRzIHdlcmVuJ3QgcmVhbGx5IHZhbGlkYXRlZDsgdGhleSB3ZXJlIGp1c3QgdHJhY2tlZC4KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW92ZU9sZE1lc3NhZ2VzU3RyaW5nKCkgewotCQlyZXR1cm4gRUpCVmFsaWRhdG9yTW9kZWxFbnVtLlJFTU9WRV9PTERfTUVTU0FHRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZ1bGxWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJcmVtb3ZlT2xkTWVzc2FnZXModmMsbnVsbCk7IC8vIG51bGwgPT0gbm8gSUZpbGVEZWx0YSwgbnVsbCA9IGRvbid0IHRyYWNrIHRhcmdldHMKLQkJCi0KLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQlpZihlamJKYXIgPT0gbnVsbCkgewotCQkJLy8gTG9nLCBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGFzayBsaXN0LCBhbmQgcmV0dXJuLgotCQkJLy8gRUpCUHJvamVjdFJlc291cmNlcyB3aWxsIGFscmVhZHkgaGF2ZSBsb2dnZWQgdGhlIHByb2JsZW0uCi0JCQkKLQkJCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCQltc3NnLnNldElkKElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA1KTsKLQkJCXZjLmFkZE1lc3NhZ2UobXNzZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKTsKLQkJaWYoaWQgPT0gbnVsbCkgewotCQkJLy8gTG9nLCBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGFzayBsaXN0LCBhbmQgcmV0dXJuLgotCQkJbG9nTWlzc2luZ1J1bGUodmMsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlWYWxpZGF0aW9uUnVsZSBlamJKYXJSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCWlmKGVqYkphclJ1bGUgPT0gbnVsbCkgewotCQkJbG9nTWlzc2luZ1J1bGUodmMsIGlkKTsKLQkJCXJldHVybjsKLQkJfQotCQlydW4oZWpiSmFyUnVsZSwgbnVsbCwgZWpiSmFyKTsgLy8gdHJ1ZT0gZnVsbCB2YWxpZGF0aW9uCi0KLQkJTGlzdCBiZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCQlpZCA9IG51bGw7Ci0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUphdmFDbGFzc1tdIGNsYXNzZXMgPSBnZXRKYXZhQ2xhc3MoYmVhbik7Ci0JCQlmb3IoaW50IGk9MDsgaTxjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJCQlpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBjbGF6eiwgYmVhbik7Ci0JCQotCQkJCUlWYWxpZGF0aW9uUnVsZSBjbGF6elJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZihjbGF6elJ1bGUgPT0gbnVsbCkgewotCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSAoaWYgaXQncwotCQkJCQkvLyBhbiBlcnJvciAtIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIGtleSBpcyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSkuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCi0JCQkJcnVuKGNsYXp6UnVsZSwgYmVhbiwgY2xhenopOyAvLyB0cnVlID0gZnVsbCB2YWxpZGF0aW9uCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzc1tdIGdldEphdmFDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUphdmFDbGFzc1tdIGNsYXNzZXMgPSBuZXcgSmF2YUNsYXNzWzZdOwotCQkKLQkJSmF2YUNsYXNzIGVqYkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZigoZWpiQ2xhc3MgIT0gbnVsbCkgJiYgKGVqYkNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQljbGFzc2VzW2NvdW50KytdID0gZWpiQ2xhc3M7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyByZW1vdGVDbGFzcyA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCWlmKChyZW1vdGVDbGFzcyAhPSBudWxsKSAmJiAocmVtb3RlQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSByZW1vdGVDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsQ2xhc3MgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCWlmKChsb2NhbENsYXNzICE9IG51bGwpICYmIChsb2NhbENsYXNzLmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQljbGFzc2VzW2NvdW50KytdID0gbG9jYWxDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGhvbWVDbGFzcyA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlpZigoaG9tZUNsYXNzICE9IG51bGwpICYmIChob21lQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBob21lQ2xhc3M7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbEhvbWVDbGFzcyA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKChsb2NhbEhvbWVDbGFzcyAhPSBudWxsKSAmJiAobG9jYWxIb21lQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBsb2NhbEhvbWVDbGFzczsKLQkJfQotCQkKLQkJaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJSmF2YUNsYXNzIGtleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJCWlmKChrZXkgIT0gbnVsbCkgJiYgKGtleS5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJCWNsYXNzZXNbY291bnQrK10gPSBrZXk7Ci0JCQl9Ci0JCX0KLQotCQlpZihjb3VudCA9PSA2KSB7Ci0JCQlyZXR1cm4gY2xhc3NlczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzW10gcmVzdWx0ID0gbmV3IEphdmFDbGFzc1tjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NlcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5jcmVtZW50YWxWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTWFwIHRhcmdldHMgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJcmVtb3ZlT2xkTWVzc2FnZXModmMsdGFyZ2V0cyk7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGlkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYocnVsZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlTZXQgY29udGV4dHMgPSAoU2V0KXRhcmdldHMuZ2V0KGlkKTsKLQkJCQlpZihjb250ZXh0cyA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlJdGVyYXRvciBjSXRlcmF0b3IgPSBjb250ZXh0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCljSXRlcmF0b3IubmV4dCgpOwotCQkJCQlydW4ocnVsZSwgdG8uZ2V0VGFyZ2V0UGFyZW50KCksIHRvLmdldFRhcmdldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0YXJnZXRzLmNsZWFyKCk7Ci0JCQl0YXJnZXRzID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGFyZ2V0T2JqZWN0UG9vbCBnZXRUYXJnZXRPYmplY3RQb29sKCkgewotCQlpZihfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbiA9IG5ldyBUYXJnZXRPYmplY3RQb29sKDEwMCk7Ci0JCX0KLQkJcmV0dXJuIF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uQWJzdHJhY3RFSkJWYWxpZGF0b3IjcmVsZWFzZVJ1bGVzKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLklWYWxpZGF0aW9uUnVsZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUnVsZXMoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLSAgICAgICAgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHJ1bGUpOwotICAgICAgICAKLSAgICB9Ci0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpewotCQlpZiggcmVwb3J0ZXIgaW5zdGFuY2VvZiBXb3JrYmVuY2hSZXBvcnRlciApewotCQkJV29ya2JlbmNoUmVwb3J0ZXIgd2JSZXBvcnRlciA9IChXb3JrYmVuY2hSZXBvcnRlcilyZXBvcnRlcjsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3YlJlcG9ydGVyLmdldFByb2plY3QoKTsKLQkJCUhhc2hNYXAgaGVscGVyTWFwID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldEhlbHBlck1hcChwcm9qZWN0KTsKLQkJCWhlbHBlck1hcC5jbGVhcigpOwotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnByb2plY3RIZWxwZXJNYXAucmVtb3ZlKCBoZWxwZXJNYXAgKTsKLQkJCWhlbHBlck1hcCA9IG51bGw7Ci0JCX0KLQkJLy8gY2xlYXIgdGhlIG1hcCB3aGVuIHRoZSBlamIgdmFsaWRhdG9yIGlzIGRvbmUgc2VlIGJ1ZyAxODcyODYKLQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5jbGVhclJ1bGVNYXAocmVwb3J0ZXIpOwotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODI0NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvck1vZGVsRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lcyBvZiB0aGUgbW9kZWxzIHdoaWNoIHRoZQotICogRUpCVmFsaWRhdG9yIG5lZWRzLCBhbmQgdGhlIElWYWxpZGF0aW9uQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gdGhlIEVKQlZhbGlkYXRvcidzCi0gKiB2YWxpZGF0ZSBtZXRob2QgbXVzdCBzdXBwb3J0IHRoZXNlIHN5bWJvbGljIG5hbWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlZhbGlkYXRvck1vZGVsRW51bSB7Ci0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX01PREVMID0gIkVKQl9NT0RFTCI7IC8vIHJldHVybiBhbiBFSkJKYXIgb2JqZWN0IC8vJE5PTi1OTFMtMSQKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfRklMRSA9ICJFSkJfRklMRSI7IC8vIHJldHVybiBhIE1vZHVsZUZpbGUgb2JqZWN0IChlaXRoZXIgRUpCSmFyRmlsZSBvciBFQVJGaWxlKSAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCID0gIkVKQiI7IC8vIEdpdmVuIGEgSmF2YUNsYXNzIGluc3RhbmNlLCByZXR1cm4gYSBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgdGhhdCB1c2UgdGhhdCBKYXZhQ2xhc3MgYXMgcGFydCBvZiB0aGUgYmVhbi4gLy8kTk9OLU5MUy0xJAotCSAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOID0gImNoaWxkcmVuIjsgLy8gR2l2ZW4gYSBKYXZhQ2xhc3MgaW5zdGFuY2UsIHJldHVybiBhIEphdmFDbGFzc1tdIG9mIHRoZSBKYXZhQ2xhc3NlcyB0aGF0IGluaGVyaXQgb3IgZXh0ZW5kIHRoZSBpbnN0YW5jZS4gLy8kTk9OLU5MUy0xJAotCSAgIC8vVGhlIEVKQl9CSU5ESU5HIHN5bWJvbHMgaXMgV0FTIHNwZWNpZmljIGFuZCBuZWVkIHRvIGJlIG1vdmVkIHRvIFdBUyBFeHQgbGF5ZXIKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfQklORElORyA9ICJFSkJfQklORElORyI7IC8vIHJldHVybiB0aGUgRUpCSmFyQmluZGluZyBmb3IgdGhlIEVKQkphciAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX0NMSUVOVEpBUiA9ICJFSkJfQ0xJRU5USkFSIjsgLy8gSWYgdGhlIEVKQiB1c2VzIGEgY2xpZW50IEpBUiwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIEpBUiwgdGhpcyBtZXRob2QgcmV0dXJucyBhIEJvb2xlYW4uVFJVRSBpZiB0aGUgY2xpZW50IEpBUiBjYW4gYmUgZm91bmQgYW5kIGxvYWRlZCBzdWNjZXNzZnVsbHkuIElmIGl0IGNhbid0IGJlIGZvdW5kIGFuZCBsb2FkZWQsIHJldHVybiBCb29sZWFuLkZBTFNFLiAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX09MRF9NRVNTQUdFUyA9ICJSRU1PVkVfT0xEX01FU1NBR0VTIjsgLy8gUmVtb3ZlIGFsbCBNZXNzYWdlcyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIE9iamVjdHMgaW4gdGhlIGFycmF5LiAvLyROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMGNiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRVJlZlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVSZWZWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZXJlZnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRVJlZlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVOUkVTT0xWRURfRUpCX1JFRl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfVU5SRVNPTFZFRF9NREJfTUlTU0lOR19NRVNTQUdFX0RFU1RJTkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VNUFRZX01FU1NTQUdFREVTVElOQVRJT047Ci0KLQkKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVSZWZWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VhclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VhclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZiMTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuVmFsaWRhdGVYbWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTm9Nb2R1bGVGaWxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvNi8yMDAwIDExOjA4OjU1IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRWFyVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19SRUZfR1JPVVBfTkFNRSA9ICJSRVNfUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSA9ICJSRVNfRU5WX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVGX0dST1VQX05BTUUgPSAiU0VSVklDRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVGX0dST1VQX05BTUUgPSAiRUpCX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FID0gIlNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfUkVGX0dST1VQX05BTUUgPSAiTUVTU0FHRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FID0gIk1FU1NBR0VfREVTVElOQVRJT05fUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTVElOQVRJT05fTURCX1JFRl9HUk9VUF9OQU1FID0gIk1FU1NBR0VfREVTVElOQVRJT05fTURCX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7Ci0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGFwcEREOwotCQotCS8qKgotCSAqIFJlbGF0aW9uc2hpcE1hcFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFYXJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIEVhclZhbGlkYXRvcgotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsaWRhdGVYTUwgY29tbWFuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVWYWxpZGF0ZVhNTENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFZhbGlkYXRlWG1sQ29tbWFuZChlYXJGaWxlKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ly8gY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kCi0JCi0JLyoqCi0JICogPHA+QW5zd2VyIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGlzCi0JICogdXNlZCBieSB0aGUgcmVjZWl2ZXIuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlTmFtZSgpIHsKLQkJcmV0dXJuIEVBUl9DQVRFR09SWTsKLQl9Ly8gZ2V0QmFzZU5hbWUKLQkKLQkvKioKLQkgKiBYTUwgVmFsaWRhdGlvbiBub3cgaGFuZGxlcyB2YWxpZGF0aW9uIG9mIERlcGxveW1lbnQgRGVzY3JpcHRvcgotCSAqIAotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCSAgdmFsaWRhdGVNb2R1bGVzKGFwcERELmdldE1vZHVsZXMoKSk7Ci0JICB2YWxpZGF0ZVNlY3VyaXR5KCk7Ci0JICB2YWxpZGF0ZVJlZnMoKTsKLQkgIHZhbGlkYXRlV2ViQ29udGV4dHMoKTsKLQkgIHZhbGlkYXRlU3BlY0xldmVsKCk7Ci0JICB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQl9Ly8gdmFsaWRhdGUKLQkKLQkvKioKLQkgKiBEb2VzIHRoZSB2YWxpZGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2YWxpZGF0ZUluSm9iKCBpbkhlbHBlciwgaW5SZXBvcnRlciApOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyAgdmFsaWRhdGVJbkpvYiggSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlciApIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCQkKLQkJaW5SZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzKTsKLQkJc3VwZXIudmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlciApOwotCQl0cnkgewotCQkJZWFyRmlsZSA9IChFQVJGaWxlKSBfaGVscGVyLmxvYWRNb2RlbChKMkVFQ29uc3RhbnRzLkVBUl9NT0RFTF9OQU1FKTsKLQkJCWlmIChlYXJGaWxlICE9IG51bGwpIHsKLQkJCQlhcHBERCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlpZiAoYXBwREQgIT0gbnVsbCAmJiBhcHBERC5lUmVzb3VyY2UoKSAhPSBudWxsICYmIGFwcERELmVSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCi0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FQVJfRERfQ0FOTk9UX09QRU5fREQsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnKTsKLQkJCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTXNnLmdldFRleHQoKSk7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FUlJPUl9FQVJfSU5WQUxJRF9FQVJfRklMRSwgbmV3IFN0cmluZ1tdIHsgZ2V0UmVzb3VyY2VOYW1lKCl9KTsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZyk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJfSAvLyBpZgotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1tdIHBhcmFtID0gbmV3IFN0cmluZ1sxXTsKLQkJCWlmIChlYXJGaWxlICE9IG51bGwpCi0JCQkJcGFyYW1bMF0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FQVJfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUl9VSV8sIHBhcmFtICk7CQkJCi0JCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZyApOwotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2csIGUpOwotCQl9IC8vIHRyeSAKLQkJcmV0dXJuIHN0YXR1czsKLQl9IC8vIHZhbGlkYXRlCi0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZSBuYW1lCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIGVhckZpbGUuZ2V0VVJJKCk7Ci0JfS8vIGdldFJlc291cmNlTmFtZQotCQotCS8qKgotCSAqIHZhbGlkYXRlIGZvciBkdXBsaWNhdGVzIGluIEVBUiBSb2xlcwotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBlYXJSb2xlTGlzdCAtIExpc3Qgb2YgZWFyIHJvbGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWFyUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QpIHsKLQkJU2V0IHMgPSBuZXcgSGFzaFNldChlYXJSb2xlTGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclJvbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlID0gKFNlY3VyaXR5Um9sZSkgZWFyUm9sZUxpc3QuZ2V0KGkpOwotCQkJaWYgKCEocy5hZGQoc2VjdXJpdHlSb2xlLmdldFJvbGVOYW1lKCkpKSkgewotCQkJCVN0cmluZyByb2xlTmFtZSA9IHNlY3VyaXR5Um9sZS5nZXRSb2xlTmFtZSgpOwotCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFyYW1zWzBdID0gcm9sZU5hbWU7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMsIHBhcmFtcyk7IAotCQkJCWFkZExvY2FsaXplZFdhcm5pbmcoIG1zZywgYXBwREQgKTsKLQkJCX0vLyBpZgotCQl9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRWFyUm9sZXMKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZVJlZnMoV2ViQXBwKSAtIHZhbGlkYXRlIEVKQiAgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBFamJSZWYgZXJlZiAtIEFuIGVqYiByZWYuCi0JICogQHBhcmFtIFN0aW5nIHVyaSAtIFRoZSB1cmkgb2YgdGhlIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSBmb3IoaW50IGkgPSAwOyBpIDwgZWpiUmVmcy5zaXplKCk7IGkrKykgewotCSAgRWpiUmVmIGVyZWYgPSAoRWpiUmVmKSBlamJSZWZzLmdldChpKTsKLQkgIFN0cmluZyByZWZOYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JICBTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzJdOwotCSAgcGFyYW1zWzBdID0gcmVmTmFtZTsKLQkgIHBhcmFtc1sxXSA9IHVyaTsKLQkgIAotCSAgaWYgKChlcmVmLmdldE5hbWUoKS50cmltKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FLCBwYXJhbXMpOwotCSAgfS8vIGlmCi0JICBpZiAoZXJlZi5pc1NldFR5cGUoKSkKLQkgICAge2lmKGVyZWYuZ2V0VHlwZSgpID09IG51bGwgKSAKLQkJICBhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFLCBwYXJhbXMpO30KLQkgIGVsc2UgCi0JICAJIGFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUsIHBhcmFtcyk7Ci0JICAvLyBpZgotCSAgaWYgKChlcmVmLmdldEhvbWUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRIb21lKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcmFtcyk7Ci0JICB9Ly8gaWYKLQkgIGlmICgoZXJlZi5nZXRSZW1vdGUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRSZW1vdGUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJhbXMpOwotCSAgfQotCSB9Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGVqYiBpbnRlcmZhY2VzIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHNpbWlsYXIuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZiBlcmVmIC0gVGhlIGVqYiByZWZlcmVuY2UuCi0JICogQHBhcmFtIEVudGVycHJpc2VCZWFuIGVqYiAtIFRoZSBlbnRlcnByaXNlIGJlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbWlsYXJFSkJJbnRlcmZhY2UoRWpiUmVmIGVyZWYsIEVudGVycHJpc2VCZWFuIGVqYikgewotCQkKLQkJaWYoIGVyZWYuaXNMb2NhbCgpICkgewotCQkJaWYoIGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJCWVqYi5nZXRMb2NhbEludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJCSgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQkJKChFSkJMb2NhbFJlZillcmVmKS5nZXRMb2NhbCgpID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfS8vIGlmCi0JCQkKLQkJCWJvb2xlYW4gaXNIb21lTG9jYWxPayA9IGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkuZXF1YWxzKCgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkpOwotCQkJYm9vbGVhbiBpc1JlbW90ZUxvY2FsT2sgPSAgZWpiLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpLmVxdWFscygoKEVKQkxvY2FsUmVmKWVyZWYpLmdldExvY2FsKCkpOwotCQkgCXJldHVybiBpc0hvbWVMb2NhbE9rICYmIGlzUmVtb3RlTG9jYWxPazsKLQkJfS8vIGlmCi0JCQotCQlpZiggZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJZXJlZi5nZXRIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQllcmVmLmdldFJlbW90ZSgpID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0vLyBpZgotCQkKLQkJYm9vbGVhbiBpc0hvbWVPayA9IGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpLmVxdWFscyggZXJlZi5nZXRIb21lKCkgKTsKLQkJYm9vbGVhbiBpc1JlbW90ZU9rID0gZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKS5lcXVhbHMoIGVyZWYuZ2V0UmVtb3RlKCkgKTsKLQkJCi0JCXJldHVybiBpc0hvbWVPayAmJiBpc1JlbW90ZU9rOwotCX0vLyBpc1NpbWlsYXJFSkJJbnRlcmZhY2UKLQkJCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIExpc3QgZWpiUmVmcyAtIExpc3Qgb2YgZWpiIHJlZnMuCi0JICogQHBhcmFtIFN0cmluZyB1cmkgLSBUaGUgdXJpIG9mIHRoZSBtb2R1bGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJSZWZzLnNpemUoKTsgaSsrKSB7Ci0JICAJICBFamJSZWYgZXJlZiA9IChFamJSZWYpIGVqYlJlZnMuZ2V0KGkpOwotCQkgIGlmKCBlcmVmICE9IG51bGwgJiYgZXJlZi5nZXRMaW5rKCkgIT0gbnVsbCAmJiBlcmVmLmdldExpbmsoKS5sZW5ndGgoKSA+IDApIHsKLQkJICAJRW50ZXJwcmlzZUJlYW4gZWpiID0gZWFyRmlsZS5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZiggZXJlZiwgdXJpICk7Ci0JCSAgCWlmKCBlamIgPT0gbnVsbCApIHsKLQkJICAJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJcGFyYW1zWzBdID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJcGFyYW1zWzFdID0gdXJpOwotCQkJCXBhcmFtc1syXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fLCBwYXJhbXMpOwotCQkgIAkJYWRkTG9jYWxpemVkV2FybmluZyhtc2csIG51bGwpOwotCQkgIAl9IGVsc2UgewotCQkgIAkJaWYoICFpc1NpbWlsYXJFSkJJbnRlcmZhY2UoIGVyZWYsIGVqYiApICkgewotCQkgIAkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJCXBhcmFtc1swXSA9IGVqYi5nZXROYW1lKCk7Ci0JCQkJCXBhcmFtc1sxXSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCQlwYXJhbXNbMl0gPSB1cmk7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl8sIHBhcmFtcyk7CQkJCQkKLQkJICAJCQlhZGRMb2NhbGl6ZWRFcnJvciggbXNnLCBhcHBERCk7Ci0JCSAgCQl9Ci0JCSAgCX0KLQkJICB9Ci0JICB9Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBleGlzdGFuY2Ugb2YgdGhlIEVKQiBSb2xlcyBpbiB0aGUgRUFSIFJvbGVzIGFuZCBkdXBsaWNhdGVzIGliIEVKQiBSb2xlcwotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBlYXJSb2xlTGlzdCAtIExpc3Qgb2YgZWFyIHJvbGVzLgotCSAqIEBwYXJhbSBFTGlzdCBlamJSb2xlcyAtIExpc3Qgb2YgZWpiIHJvbGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QsIEVMaXN0IGVqYlJvbGVzKSB7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IGVqYlJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCWlmICghKGVhclJvbGVMaXN0LmNvbnRhaW5zKGVqYlJvbGVzLmdldChpKSkpKSB7Ci0JCSAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJICBwYXJhbXNbMF0gPSAoKFNlY3VyaXR5Um9sZSkgKGVqYlJvbGVzLmdldChpKSkpLmdldFJvbGVOYW1lKCk7CQkgICAgICAgICAgCi0JCSAgYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFyYW1zKTsKLQkJfS8vIGlmCi0JICB9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMKLQkKLQkvKioKLQkgKiBGb3IgZWFjaCBtb2R1bGUsIG1ha2Ugc3VyZSBpdHMgYXJjaGl2ZSBleGlzdHMKLQkgKihhIHZlcnkgZXhwZW5zaXZlLCBidXQgbW9yZSBtZWFuaW5nZnVsIHRlc3Qgd291bGQgYmUgdG8gYWxzbyBtYWtlIHN1cmUgdGhleSBjYW4gYmUgbG9hZGVkKQotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBtb2R1bGVzTGlzdCAtIExpc3Qgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTW9kdWxlcyhFTGlzdCBtb2R1bGVzTGlzdCkgewotLy8JCVN0cmluZyBlcnJvclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlNZXNzYWdlIG1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgIlZhbGlkYXRpbmcgTW9kdWxlcyIpOwotCQlfcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soIHRoaXMsIG1zZyApOwotCQkKLQkJCi0JCUhhc2hTZXQgZHVwbGljYXRlVVJJID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBtLmdldFVyaSgpOwotCQkJaWYgKChmaWxlbmFtZSA9PSBudWxsKSB8fCAoZmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlhZGRMb2NhbGl6ZWRFcnJvcihFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0VBUl9OT19NT0RVTEVfVVJJLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9jaGVjayBpZiB0aGUgVVJJIGhhcyBhbnkgc3BhY2VzCi0JCQkJaWYoICBmaWxlbmFtZS5pbmRleE9mKCAiICIgKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IGZpbGVuYW1lOwotCQkJCQlTdHJpbmcgbXNnMSA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLlVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfLCBwYXJhbXMpOwotCQkJCQlhZGRMb2NhbGl6ZWRFcnJvcihtc2cxLCBhcHBERCk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gaWYKLQkJCVN0cmluZyBhbHRERCA9IG0uZ2V0QWx0REQoKTsKLQkJCWlmIChhbHRERCAhPSBudWxsKQotCQkJCWFsdEREID0gYWx0REQudHJpbSgpOwotCQkJdmFsaWRhdGVBbHRERChtLCBhbHRERCk7Ci0JCQlTdHJpbmcga2V5ID0gYWx0REQgPT0gbnVsbCA/IGZpbGVuYW1lICsgYWx0REQgOiBmaWxlbmFtZTsKLQkJCWlmICghZHVwbGljYXRlVVJJLmFkZChrZXkpKSB7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJCXBhcmFtc1sxXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0VBUl9EVVBMSUNBVEVfVVJJX0VSUk9SXywgcGFyYW1zKTsKLQkJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKLQkJCX0vLyBpZgotCQotCQl9Ly8gZm9yCi0JCi0JfS8vIHZhbGlkYXRlTW9kdWxlcwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBhbHQgZGQKLQkgKiAKLQkgKiBAcGFyYW0gTW9kdWxlIG0gLSBBIG1vZHVsZS4KLQkgKiBAcGFyYW0gU3RyaW5nIGFsdEREIC0gQW4gYWx0REQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFsdEREKE1vZHVsZSBtLCBTdHJpbmcgYWx0REQpIHsKLQkJLy9pc0R1cGxpY2F0ZSB3aWxsIHRlc3QgaWYgaXQgaXMgYSBmaWxlIG9yIGEgbG9hZGVkIHJlc291cmNlCi0JCWlmICgiIi5lcXVhbHMoYWx0REQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJcGFyYW1zWzFdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfLCBwYXJhbXMpOwotCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBhcHBERCk7Ci0JCX0gZWxzZSBpZiAoYWx0REQgIT0gbnVsbCAmJiAhZWFyRmlsZS5pc0R1cGxpY2F0ZShhbHRERCkpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJcGFyYW1zWzFdID0gYWx0REQ7Ci0JCQlwYXJhbXNbMl0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fLCBwYXJhbXMpOwkJCQotCQkJYWRkTG9jYWxpemVkV2FybmluZyh0bXAsIGFwcEREKTsKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlQWx0REQKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSBFSkIgYW5kIHJlc291cmNlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZnMoKSB7Ci0JCQotCQlJTWVzc2FnZSBtc2cgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksICJWYWxpZGF0aW5nIFJlZnMiKTsKLQkJX3JlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKCB0aGlzLCBtc2cgKTsKLQkJCi0JCQotCQlMaXN0IG1vZHVsZUxpc3QgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJaWYocmVmLmlzV2ViKCkpIHsKLQkJCQkJdmFsaWRhdGVXZWJBcHBSZWZzKHJlZik7CQkJCX0gIAotCQkJCWVsc2UgaWYoIHJlZi5pc0VKQigpICkgewotCQkJCSAgICB2YWxpZGF0ZUVKQk1vZHVsZVJlZnMocmVmKTsKLQkJCQl9IGVsc2UgaWYocmVmLmlzQ2xpZW50KCkpCi0JCQkJCXZhbGlkYXRlQXBwQ2xpZW50UmVmcyhyZWYpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcmFtc1swXSA9IHJlZi5nZXRVcmkoKTsKLQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9NT0RVTEVfRERfRklMRV9OT1RfRk9VTkQsIHBhcmFtcyk7CQkJCQkKLQkJCX0gCi0JCQkKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHJlZgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUFwcENsaWVudFJlZnMoTW9kdWxlUmVmIHJlZikgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50SW1wbClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJTGlzdCBlamJSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBlamJSZWZzLmFkZEFsbChhcHBDbGllbnQuZ2V0RWpiUmVmZXJlbmNlcygpKTsKLQkJdmFsaWRhdGVFSkJSZWZNYW5kYXRvcnlFbGVtZW50cyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQl2YWxpZGF0ZUVKQlJlZnMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJaWYgKGFwcENsaWVudCAhPSBudWxsICYmIGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwotCQkJTGlzdCByZXNvdXJjZVJlZnMgPSBhcHBDbGllbnQuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IGFwcENsaWVudC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSBhcHBDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCSAgICAKLQkJCXZhbGlkYXRlRHVwbGljYXRlRUpCUmVmcyhhbGxSZWZzLGVqYlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZVJlZnMoYWxsUmVmcyxyZXNvdXJjZVJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZUVudlJlZnMoYWxsUmVmcyxyZXNvdXJjZUVudlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVTZXJ2aWNlUmVmcyhhbGxSZWZzLHNlcnZpY2VSZWZzKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVmCi0JICogQHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVdlYkFwcFJlZnMoTW9kdWxlUmVmIHJlZikgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZWpiUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgZWpiUmVmcy5hZGRBbGwod2ViQXBwLmdldEVqYlJlZnMoKSk7Ci0JICAgIGVqYlJlZnMuYWRkQWxsKHdlYkFwcC5nZXRFamJMb2NhbFJlZnMoKSk7Ci0JCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJdmFsaWRhdGVFSkJSZWZzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCWlmICh3ZWJBcHAgIT0gbnVsbCAmJiB3ZWJBcHAuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCkgewotCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwotCQkJTGlzdCByZXNvdXJjZVJlZnMgPSB3ZWJBcHAuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IHdlYkFwcC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSB3ZWJBcHAuZ2V0U2VydmljZVJlZnMoKTsKLQkJCQotCQkJdmFsaWRhdGVEdXBsaWNhdGVFSkJSZWZzKGFsbFJlZnMsZWpiUmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhhbGxSZWZzLHJlc291cmNlUmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlRW52UmVmcyhhbGxSZWZzLHJlc291cmNlRW52UmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVNlcnZpY2VSZWZzKGFsbFJlZnMsc2VydmljZVJlZnMpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZWYKLQkgKiBAdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUpCTW9kdWxlUmVmcyhNb2R1bGVSZWYgcmVmKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcilyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJaWYoIGVqYkphciAhPSBudWxsICkgewotCQkJTGlzdCBlamJDb2xsZWN0aW9uID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwkJCQotCQkJaWYoIGVqYkNvbGxlY3Rpb24gIT0gbnVsbCB8fCAhZWpiQ29sbGVjdGlvbi5pc0VtcHR5KCkgKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gZWpiSmFyLmVSZXNvdXJjZSgpOwotCQkJCWNsZWFuVXBBbGxSZWZTdWJUYXNrTWVzc2FnZXMocmVzKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVqYkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsJCi0JCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIHsKLQkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKCBlamJCZWFuICE9IG51bGwgKSB7Ci0JCQkJCSAgICBMaXN0IGVqYlJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCSAgICBlamJSZWZzLmFkZEFsbChlamJCZWFuLmdldEVqYlJlZnMoKSk7Ci0JCQkJCSAgICBlamJSZWZzLmFkZEFsbChlamJCZWFuLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJCQkJCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJCQkJCXZhbGlkYXRlRUpCUmVmcyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQkJCQkJaWYoZWpiSmFyLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCQkJCQlTZXQgYWxsUmVmcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJTGlzdCByZXNvdXJjZVJlZnMgPSBlamJCZWFuLmdldFJlc291cmNlUmVmcygpOwotCQkJCQkJCUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gZWpiQmVhbi5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCQkJCQlMaXN0IHNlY1JvbGVSZWZzID0gZWpiQmVhbi5nZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQkJCQkJTGlzdCBzZXJ2aWNlUmVmcyA9IGVqYkJlYW4uZ2V0U2VydmljZVJlZnMoKTsKLQkJCQkJCQlMaXN0IG1lc3NhZ2VEZXN0UmVmcyA9IGVqYkJlYW4uZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJCQkJCSAgICAKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZUVKQlJlZnMoYWxsUmVmcyxlamJSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhhbGxSZWZzLHJlc291cmNlUmVmcyk7Ci0JCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZUVudlJlZnMoYWxsUmVmcyxyZXNvdXJjZUVudlJlZnMpOwotCQkJCQkJCXZhbGlkYXRlRHVwbGljYXRlU2VjdXJpdHlSb2xlUmVmcyhhbGxSZWZzLHNlY1JvbGVSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZVNlcnZpY2VSZWZzKGFsbFJlZnMsc2VydmljZVJlZnMpOwotCQkJCQkJCXZhbGlkYXRlRHVwbGljYXRlTWVzc2FnZURlc3RSZWZzKGFsbFJlZnMsbWVzc2FnZURlc3RSZWZzKTsKLQkJCQkJICAgfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JIAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIHNlcnZpY2VSZWZzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRHVwbGljYXRlU2VydmljZVJlZnMoU2V0IGFsbFJlZnMsIExpc3Qgc2VydmljZVJlZnMpIHsKLQkJaWYgKCFzZXJ2aWNlUmVmcy5pc0VtcHR5KCkpIHsKLQkJCVNlcnZpY2VSZWYgZmlyc3RSZWYgPSAoU2VydmljZVJlZikoc2VydmljZVJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IHNlcnZpY2VSZWZzLnNpemUoKTsgcmVmTm8rKykgewotCQkJU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikgKHNlcnZpY2VSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKGFsbFJlZnMuYWRkKHJlZk5hbWUpKSkKLQkJCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9TRVJWSUNFUkVGLCBwYXJtcyxyZWYsU0VSVklDRV9SRUZfR1JPVVBfTkFNRSk7Ci0JCX0KLQkgIH0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBzZWNSb2xlUmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVNlY3VyaXR5Um9sZVJlZnMoU2V0IGFsbFJlZnMsIExpc3Qgc2VjUm9sZVJlZnMpIHsKLQkJaWYgKCFzZWNSb2xlUmVmcy5pc0VtcHR5KCkpIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiBmaXJzdFJlZiA9IChTZWN1cml0eVJvbGVSZWYpKHNlY1JvbGVSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBzZWNSb2xlUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiByZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSAoc2VjUm9sZVJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfU0VDVVJJVFlST0xFUkVGLCBwYXJtcyxyZWYsU0VDX1JPTEVfUkVGX0dST1VQX05BTUUpOwotCQl9Ci0JICB9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbFJlZnMKLQkgKiBAcGFyYW0gcmVzb3VyY2VFbnZSZWZzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUmVzb3VyY2VFbnZSZWZzKFNldCBhbGxSZWZzLCBMaXN0IHJlc291cmNlRW52UmVmcykgewotCQlpZiAoIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlRW52UmVmIGZpcnN0UmVmID0gKFJlc291cmNlRW52UmVmKShyZXNvdXJjZUVudlJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IHJlc291cmNlRW52UmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCVJlc291cmNlRW52UmVmIHJlZiA9IChSZXNvdXJjZUVudlJlZikgKHJlc291cmNlRW52UmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyByZWZOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKGFsbFJlZnMuYWRkKHJlZk5hbWUpKSkKLQkJCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYsIHBhcm1zLHJlZixSRVNfRU5WX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCSAgfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIHJlc291cmNlUmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhTZXQgYWxsUmVmcywgTGlzdCByZXNvdXJjZVJlZnMpIHsKLQkJaWYgKCFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVJlZiBmaXJzdFJlZiA9IChSZXNvdXJjZVJlZikocmVzb3VyY2VSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCByZXNvdXJjZVJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlSZXNvdXJjZVJlZiByZWYgPSAoUmVzb3VyY2VSZWYpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGLCBwYXJtcyxyZWYsUkVTX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCSAgfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBlamJSZWZzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVFSkJSZWZzKFNldCBhbGxSZWZzLCBMaXN0IGVqYlJlZnMpIHsKLQkJaWYgKCFlamJSZWZzLmlzRW1wdHkoKSkgewotCQkJRWpiUmVmIGZpcnN0UmVmID0gKEVqYlJlZikoZWpiUmVmcy5nZXQoMCkpOwotCQlpZighKGZpcnN0UmVmLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSkKLQkJCWNsZWFuVXBTdWJUYXNrTWVzc2FnZXMoZmlyc3RSZWYpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgZWpiUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCUVqYlJlZiByZWYgPSAoRWpiUmVmSW1wbCkgKGVqYlJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfRUpCUkVGLCBwYXJtcywgcmVmLCBFSkJfUkVGX0dST1VQX05BTUUpOwotCQkgfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIGVqYlJlZnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZU1lc3NhZ2VEZXN0UmVmcyhTZXQgYWxsUmVmcywgTGlzdCBtZXNzYWdlRGVzdFJlZnMpIHsKLQkJaWYgKCFtZXNzYWdlRGVzdFJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgZmlyc3RSZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKShtZXNzYWdlRGVzdFJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG1lc3NhZ2VEZXN0UmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSAobWVzc2FnZURlc3RSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByZWZOYW1lOwotCQkJaWYgKCEoYWxsUmVmcy5hZGQocmVmTmFtZSkpKQotCQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX01FU1NTQUdFREVTVElOQVRJT05SRUYsIHBhcm1zLHJlZiwgTUVTU0FHRV9SRUZfR1JPVVBfTkFNRSk7Ci0JCSB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlyc3RSZWYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwU3ViVGFza01lc3NhZ2VzKEVPYmplY3QgcmVmKSB7Ci0JCS8vTm8gT3AgLSBzdWJjbGFzcyBvdmVycmlkZXMgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBBbGxSZWZTdWJUYXNrTWVzc2FnZXMoUmVzb3VyY2UgcmVzKSB7Ci0JCS8vTm8gT3AgLSBzdWJjbGFzcyBvdmVycmlkZXMgCi0JfQotCi0JLyoqCi0JICogRWpiIHJlZnMgdG8gdGhlIHJ1bm5pbmcgbGlzdCBvZiBlamIgcmVmcy4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBjdXJyZW50UmVmcyAtIExpc3Qgb2YgY3VycmVudCBlamIgcmVmcyB0byBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gTGlzdCBlamJSZWZzIC0gY29sbGVjdGlvbiBvZiBydW5uaW5nIGVqYnJlZnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFSkJSZWZzKCBMaXN0IGN1cnJlbnRSZWZzLCBMaXN0IGVqYlJlZnMgKSB7CQkKLQkJaWYoIGN1cnJlbnRSZWZzID09IG51bGwgfHwgZWpiUmVmcyA9PSBudWxsICkKLQkJCXJldHVybjsKLQkJCi0JCWVqYlJlZnMuYWRkQWxsKCBjdXJyZW50UmVmcyApOwkJCQkJCQkJCQotCX0vLyBhZGRFSkJSZWZzCi0KLQkvKioKLQkgKiB2YWxpZGF0ZSBzZWN1cml0eSBjb25zdHJhaW50cywgcm9sZXMsIGFuZCBzZWN1cml0eSByb2xlIHJlZnMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eSgpIHsKLQkJRUxpc3QgZWFyUm9sZUxpc3QgPSBhcHBERC5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCWlmICghZWFyUm9sZUxpc3QuaXNFbXB0eSgpKQotCQkJdmFsaWRhdGVFYXJSb2xlcyhlYXJSb2xlTGlzdCk7Ci0JCUVMaXN0IG1vZHVsZUxpc3QgPSBhcHBERC5nZXRNb2R1bGVzKCk7Ci0JCWlmICghbW9kdWxlTGlzdC5pc0VtcHR5KCkpIHsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKG0uaXNFamJNb2R1bGUoKSkgewotCQkJCQlFTGlzdCBlamJSb2xlcyA9IG0uZ2V0QXBwbGljYXRpb24oKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQkJCWlmICghZWpiUm9sZXMuaXNFbXB0eSgpKQotCQkJCQkJdmFsaWRhdGVFSkJSb2xlc1dpdGhFQVJSb2xlcyhlYXJSb2xlTGlzdCwgZWpiUm9sZXMpOwotCQkJCX0vLyBpZgotCQkJCWlmIChtLmlzV2ViTW9kdWxlKCkpIHsKLQkJCQkJRUxpc3Qgd2ViUm9sZXMgPSBtLmdldEFwcGxpY2F0aW9uKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJCQlpZiAoIXdlYlJvbGVzLmlzRW1wdHkoKSkKLQkJCQkJCXZhbGlkYXRlV0VCUm9sZXNXaXRoRUFSUm9sZXMoZWFyUm9sZUxpc3QsIHdlYlJvbGVzKTsKLQkJCQl9Ly8gaWYKLQkJCX0vLyBmb3IKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlU2VjdXJpdHkKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgYW4gZWFyIGZvciBkdXBsaWNhdGUgd2ViIGNvbnRleHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlV2ViQ29udGV4dHMoKSB7Ci0JCQotCQlFTGlzdCBtb2R1bGVMaXN0ID0gYXBwREQuZ2V0TW9kdWxlcygpOwotCSAgCU1hcCB2aXNpdGVkV2ViQ29udGV4dCA9IG5ldyBIYXNoTWFwKCk7Ci0JICAJCi0JICAJaWYoICFtb2R1bGVMaXN0LmlzRW1wdHkoKSApIHsJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVMaXN0Lml0ZXJhdG9yKCk7CQkKLQkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7Ci0JCSAgCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCSAgCQlpZiggbW9kdWxlLmlzV2ViTW9kdWxlKCkgKSB7Ci0JCSAgCQkJCi0JCSAgCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpbW9kdWxlOwotCQkJICAJCQkKLQkJCSAgCQlpZiggd2ViTW9kdWxlICE9IG51bGwgKSB7Ci0JCQkgIAkJCWlmKCB2aXNpdGVkV2ViQ29udGV4dC5jb250YWluc0tleSggd2ViTW9kdWxlLmdldENvbnRleHRSb290KCkgKSApIHsKLQkJCSAgCQkJCVdlYk1vZHVsZSB0ZW1wV2ViTW9kdWxlID0gKFdlYk1vZHVsZSl2aXNpdGVkV2ViQ29udGV4dC5nZXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICk7Ci0JCQkJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCQkJCQlwYXJhbXNbMF0gPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQkJCQlwYXJhbXNbMV0gPSB3ZWJNb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJCQkJcGFyYW1zWzJdID0gdGVtcFdlYk1vZHVsZS5nZXRVcmkoKTsKLQkJCQkJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfLCBwYXJhbXMpOwotCQkJCQkJCQotCQkJICAJCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBhcHBERCk7Ci0JCQkgIAkJCX0gZWxzZSB7Ci0JCQkgIAkJCQl2aXNpdGVkV2ViQ29udGV4dC5wdXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpLCB3ZWJNb2R1bGUgKTsKLQkJCSAgCQkJfS8vIGlmCi0JCQkgIAkJCQkKLQkJCSAgCQl9Ly8gaWYKLQkJICAJCQkKLQkJICAJCX0vLyBpZgotCQkJfS8vIHdoaWxlCi0JICAJfS8vIGlmCi0JfS8vIHZhbGlkYXRlV2ViQ29udGV4dHMKLQkKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIG1vZHVsZXMgYXJlIGEgc3BlYyBsZXZlbCB0b28gaGlnaCBmb3IgdGhlIEVBUiBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNwZWNMZXZlbCgpIHsKLQkJaW50IGVhclZlcnNpb24gPSBnZXRWZXJzaW9uSUQoZWFyRmlsZSk7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJCi0JCWlmKCAhbW9kdWxlcy5pc0VtcHR5KCkgKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJCU1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCSAgCQltb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpaXRlcmF0b3IubmV4dCgpOwotCQkgIAkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCAmJiBnZXRWZXJzaW9uSUQobW9kdWxlRmlsZSkgPiBlYXJWZXJzaW9uKSB7Ci0JCQkgIAkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1tdIHttb2R1bGVGaWxlLmdldFVSSSgpLCBlYXJGaWxlLmdldE5hbWUoKX07Ci0JCQkgIAkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLk1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR18sIHBhcmFtcyk7Ci0JCQkJCWFkZExvY2FsaXplZFdhcm5pbmcodG1wLCBhcHBERCk7Ci0JCSAgCQl9Ci0JCQl9CQkgIAkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGVGaWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldFZlcnNpb25JRChNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJWE1MUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IChYTUxSZXNvdXJjZSkgbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewkKLQkJCS8vSWdub3JlCi0JCX0KLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkgdmFsaWRhdGVNREJNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JfQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1EQk1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJIGlmKCByZWYuaXNFSkIoKSApIHsKLQkJCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCWlmKCBlamJKYXIgIT0gbnVsbCApIHsKLQkJCQkJCXJlbW92ZUFsbE1lc3NhZ2VzKGVqYkphcixNRVNTQUdFX0RFU1RJTkFUSU9OX01EQl9SRUZfR1JPVVBfTkFNRSk7Ci0JCQkJCQlMaXN0IGVqYkNvbGxlY3Rpb24gPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7CQkJCi0JCQkJCQlpZiggZWpiQ29sbGVjdGlvbiAhPSBudWxsIHx8ICFlamJDb2xsZWN0aW9uLmlzRW1wdHkoKSApIHsKLQkJCQkJCSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVqYkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsJCi0JCQkJCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIHsKLQkJCQkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKCBlamJCZWFuICE9IG51bGwgKSB7Ci0JCQkJCQkJCQlpZiAoZWpiQmVhbi5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCQkJCQkJCU1lc3NhZ2VEcml2ZW4gbWVzc2FnZURyaXZlbkJlYW4gPSAoTWVzc2FnZURyaXZlbillamJCZWFuOwotCQkJCQkJCQkJCWlmIChtZXNzYWdlRHJpdmVuQmVhbi5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpIGNvbnRpbnVlOwotCQkJCQkJCQkJCVN0cmluZyBsaW5rID0gbWVzc2FnZURyaXZlbkJlYW4uZ2V0TGluaygpOwotCQkJCQkJCQkJCWlmIChsaW5rICE9IG51bGwgJiYgIWlzRXhpc3RNZXNzYWdlRGVzdGluYXRpb25MaW5rKGxpbmssIHJlZikpIHsKLQkJCQkJCQkJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1s0XTsKLQkJCQkJCQkJCQkJcGFyYW1zWzBdID0gbGluazsKLQkJCQkJCQkJCQkJcGFyYW1zWzFdID0gbWVzc2FnZURyaXZlbkJlYW4uZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlwYXJhbXNbMl0gPSByZWYuZ2V0VXJpKCk7Ci0JCQkJCQkJCQkJCXBhcmFtc1szXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9VTlJFU09MVkVEX01EQl9NSVNTSU5HX01FU1NBR0VfREVTVElOQVRJT04sIHBhcmFtcyxtZXNzYWdlRHJpdmVuQmVhbiwgTUVTU0FHRV9ERVNUSU5BVElPTl9NREJfUkVGX0dST1VQX05BTUUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSB9Ci0JCQl9IGNhdGNoIChBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCQlpZiAoIShuZXN0ZWQgaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IHJlZi5nZXRVcmkoKTsKLQkJCQkJYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5ELCBwYXJhbXMpOwotCQkJCX0KLQkJCX0gCi0JCQkKLQkJfQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmcyhyZWYpOwotCQl9Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoTW9kdWxlUmVmIG1vZHVsZVJlZikgewotCQlMaXN0IGRlc3RpbmF0aW9uc1JlZnMgPSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKG1vZHVsZVJlZik7Ci0JCWNsZWFyVXBTdWJUYXNrTWVzc2FnZURlc3RpbmF0aW9uTWVzc2FnZXMobW9kdWxlUmVmLGRlc3RpbmF0aW9uc1JlZnMpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgZGVzdGluYXRpb25zUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSAoZGVzdGluYXRpb25zUmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyBsaW5rID0gIHJlZi5nZXRMaW5rKCkgOwotCQkJaWYgKGxpbmsgPT0gbnVsbCkgY29udGludWU7IC8vIGRvbnQgdmFsaWRhdGUgaWYgdGhlIGxpbmsgaXMgbnVsbAotCQkJaWYgKCBsaW5rLmxlbmd0aCgpPT0gMCkgeyAvLyBlbXB0eSBsaW5rIGlzIGFuIGVycm9yCi0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCQlwYXJhbXNbMF0gPSByZWYuZ2V0TmFtZSgpOwotCQkJCXBhcmFtc1sxXSA9IG1vZHVsZVJlZi5nZXRVcmkoKTsKLQkJCQlwYXJhbXNbMl0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCQkKLQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FTVBUWV9NRVNTU0FHRURFU1RJTkFUSU9OLCBwYXJhbXMscmVmLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FKTsKLQkJCX0gZWxzZSBpZiAoIWlzRXhpc3RNZXNzYWdlRGVzdGluYXRpb25MaW5rKGxpbmssIG1vZHVsZVJlZikpIHsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzRdOwotCQkJCXBhcmFtc1swXSA9IGxpbms7Ci0JCQkJcGFyYW1zWzFdID0gcmVmLmdldE5hbWUoKTsKLQkJCQlwYXJhbXNbMl0gPSBtb2R1bGVSZWYuZ2V0VXJpKCk7Ci0JCQkJcGFyYW1zWzNdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfTUVTU1NBR0VERVNUSU5BVElPTiwgcGFyYW1zLHJlZiwgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfR1JPVVBfTkFNRSk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjbGVhclVwU3ViVGFza01lc3NhZ2VEZXN0aW5hdGlvbk1lc3NhZ2VzKE1vZHVsZVJlZiBtb2R1bGVSZWYsIExpc3QgZGVzdGluYXRpb25zUmVmcykgewotCQl0cnkgewotCQkJaWYoIG1vZHVsZVJlZiAhPSBudWxsICYmIG1vZHVsZVJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwgKXsKLQkJCQlyZW1vdmVBbGxNZXNzYWdlcyhtb2R1bGVSZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSxNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FKTsKLQkJCX0KLQkJfSBjYXRjaCAoQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgZGVzdGluYXRpb25zUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSAoZGVzdGluYXRpb25zUmVmcy5nZXQocmVmTm8pKTsKLQkJCXJlbW92ZUFsbE1lc3NhZ2VzKHJlZixNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhpc3RNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZyBsaW5rLCBNb2R1bGVSZWYgbW9kdWxlUmVmKSB7Ci0JCWlmIChsaW5rID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJaW50IGluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7Ci0JCVN0cmluZyBkZXN0aW5hdGlvbk5hbWU7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJZGVzdGluYXRpb25OYW1lID0gbGluazsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtb2R1bGVOYW1lID0gbGluay5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCQlkZXN0aW5hdGlvbk5hbWUgPSBsaW5rLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJCW1vZHVsZVJlZiA9IGdldE1vZHVsZVJlZkJ5TmFtZShtb2R1bGVOYW1lKTsKLQkJCWlmIChtb2R1bGVSZWYgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJCi0JCX0KLQkJTGlzdCBkZXN0aW5hdGlvbnMgPSBnZXRNZXNzYWdlRGVzdGluYXRpb25zKG1vZHVsZVJlZik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzdGluYXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb24gbWVzc2FnZURlc3RpbmF0aW9uID0gKE1lc3NhZ2VEZXN0aW5hdGlvbikgKGRlc3RpbmF0aW9ucy5nZXQoaSkpOwotCQkJaWYgKGRlc3RpbmF0aW9uTmFtZS5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uLmdldE5hbWUoKSkpIHJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2R1bGVSZWYgZ2V0TW9kdWxlUmVmQnlOYW1lKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0JCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCU1vZHVsZSBtb2R1bGUgPSByZWYuZ2V0TW9kdWxlKCk7Ci0JCQlpZiAobW9kdWxlTmFtZS5lcXVhbHMobW9kdWxlLmdldFVyaSgpKSkgewotCQkJCXJldHVybiByZWY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyhNb2R1bGVSZWYgcmVmKSB7Ci0JCUxpc3QgZGVzdGluYXRpb25SZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCWlmKHJlZi5pc1dlYigpKSB7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJZGVzdGluYXRpb25SZWZzLmFkZEFsbCh3ZWJBcHAuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJCX0gZWxzZSBpZiggcmVmLmlzRUpCKCkgKSB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJZGVzdGluYXRpb25SZWZzLmFkZEFsbChnZXRFSkJNZXNzYWdlRGVzdGluYXRpb25SZWZzKGVqYkphcikpOwotCQkJfSBlbHNlIGlmKHJlZi5pc0NsaWVudCgpKSB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50SW1wbClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlkZXN0aW5hdGlvblJlZnMuYWRkQWxsKGFwcENsaWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQkJfQotCQl9IGNhdGNoIChBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4LmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJaWYgKCEobmVzdGVkIGluc3RhbmNlb2YgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKSkgewotCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFyYW1zWzBdID0gcmVmLmdldFVyaSgpOwotCQkJCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX01PRFVMRV9ERF9GSUxFX05PVF9GT1VORCwgcGFyYW1zKTsKLQkJCX0KLQkJfSAKLQkJCQotCQkKLQkJcmV0dXJuIGRlc3RpbmF0aW9uUmVmczsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEVKQk1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoRUpCSmFyIGVqYkphcikgewotCQlMaXN0IGVqYk1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKCBlamJKYXIgIT0gbnVsbCApIHsKLQkJCUxpc3QgZWpiQ29sbGVjdGlvbiA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsJCQkKLQkJCWlmKCBlamJDb2xsZWN0aW9uICE9IG51bGwgfHwgIWVqYkNvbGxlY3Rpb24uaXNFbXB0eSgpICkgewotCQkJICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWpiQ29sbGVjdGlvbi5pdGVyYXRvcigpOwkKLQkJCQl3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgewotCQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoIGVqYkJlYW4gIT0gbnVsbCApIHsKLQkJCQkJCWVqYk1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuYWRkQWxsKGVqYkJlYW4uZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWpiTWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoTW9kdWxlUmVmIHJlZikgewotCQlMaXN0IGRlc3RpbmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmKHJlZi5pc1dlYigpKSB7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJZGVzdGluYXRpb25zLmFkZEFsbCh3ZWJBcHAuZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJCX0gZWxzZSBpZiggcmVmLmlzRUpCKCkgKSB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJaWYgKGVqYkphciAhPSBudWxsICYmIGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJCQlkZXN0aW5hdGlvbnMuYWRkQWxsKGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQkJfSBlbHNlIGlmKHJlZi5pc0NsaWVudCgpKSB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50SW1wbClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlkZXN0aW5hdGlvbnMuYWRkQWxsKGFwcENsaWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQkJfQotCQl9IGNhdGNoIChBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4LmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJaWYgKCEobmVzdGVkIGluc3RhbmNlb2YgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKSkgCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlyZXR1cm4gZGVzdGluYXRpb25zOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlfaGVscGVyID0gaGVscGVyOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZWFyRmlsZSA9IG51bGw7Ci0JCWFwcEREID0gbnVsbDsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQkKLQotfS8vIEVhclZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IxM2E2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbnRlcnByaXNlQmVhbjExVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZWpiLWphci54bWwgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotICogVGhlIEJlYW4gUHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlY2xhcmluZyBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgb2YgdGhlIGRlcGxveS1tZW50Ci0gKiBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcwotICogcmVmZXJlbmNlcyBpbiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyBvZiB0aGUgc2VjdXJpdHkKLSAqIHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlIGVsZW1lbnRzLgotICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlIHVzaW5nIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0gKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiBUaGUgbmFtZSBtdXN0IGJlIHRoZQotICogc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkKLSAqIG1ldGhvZC4KLSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLSAqIEEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSByb2xlLW5hbWUgZWxlbWVudCwgaXMgc2NvcGVkIHRvIHRoZSBzZXMtc2lvbgotICogb3IgZW50aXR5IGJlYW4gZWxlbWVudCB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcyBhcmUgZGVjbGFyZWQgaW4KLSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgICBUaGlzIHNlY3VyaXR5IHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgPC9lbnRpdHk+Ci0gKiAgICAgICAuLi4KLSAqICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgIC4uLgotICoKLSAqIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWJvdmUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudGVycHJpc2UgYmVhbiBBYXJkdmFya1BheXJvbGwgbWFrZXMgdGhlCi0gKiBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0gKgotICoKLSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlCi0gKiBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdS1yaXR5LQotICogcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0gKiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGxpbmtzIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLWxpbmsKLSAqIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4KLSAqIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIHJvbGUtbGluayByZWZlcmVuY2UuCi0gKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lZAotICogcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBlbXBsb3llZXMgb2YgdGhlIHBheXJvbGwgZGVwYXJ0bWVudC4KLSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0gKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLSAqCi0gKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0gKiAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICA8L2VudGl0eT4KLSAqICAgICAgIC4uLgotICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICogICAgLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlQmVhbjExVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfUkVNT1RFfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIExpc3QgX3NlY3VyaXR5Um9sZXMgPSBudWxsOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMSwgbmV3IFN0cmluZ1tde0NIS0oyODAxICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9VTk5BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19VTk5BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9VTk5BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDYsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA3LCBuZXcgU3RyaW5nW117Q0hLSjI4MDcgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOCwgbmV3IFN0cmluZ1tde0NIS0oyODA4ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDksIG5ldyBTdHJpbmdbXXtDSEtKMjgwOSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9VTk5BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTFfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMV9OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODExX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMV9VTk5BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMiArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjAsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIyLCBuZXcgU3RyaW5nW117Q0hLSjI4MjIgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMywgbmV3IFN0cmluZ1tde0NIS0oyODIzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI3LCBuZXcgU3RyaW5nW117Q0hLSjI4MjcgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOCwgbmV3IFN0cmluZ1tde0NIS0oyODI4ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMCwgbmV3IFN0cmluZ1tde0NIS0oyODMwICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMyLCBuZXcgU3RyaW5nW117Q0hLSjI4MzIgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMywgbmV3IFN0cmluZ1tde0NIS0oyODMzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzQsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM1LCBuZXcgU3RyaW5nW117Q0hLSjI4MzUgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNiwgbmV3IFN0cmluZ1tde0NIS0oyODM2ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzcsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM4LCBuZXcgU3RyaW5nW117Q0hLSjI4MzggKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOSwgbmV3IFN0cmluZ1tde0NIS0oyODM5ICsgU1BFQ30pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQwLCBuZXcgU3RyaW5nW117Q0hLSjI4NDAgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MSwgbmV3IFN0cmluZ1tde0NIS0oyODQxICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MiwgbmV3IFN0cmluZ1tde0NIS0oyODUyfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDgsIG5ldyBTdHJpbmdbXXtDSEtKMjkwOCArIFNQRUN9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCS8vIElmIGNhbGxlZCBhcyBhIGRlcGVuZGVudCwgcGFyZW50IHdpbGwgYmUgdGhpcyBFbnRlcnByaXNlQmVhbi4KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTZXNzaW9uVHlwZUVsZW1lbnQoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCS8vIGNoZWNrIHN5bnRheAotCQlpZiAoIXNlc3Npb24uaXNTZXRTZXNzaW9uVHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoc2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVGVUwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFTEVTUykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KFNlc3Npb24gc2Vzc2lvbkJlYW4pIHsKLQkJaWYgKCFzZXNzaW9uQmVhbi5pc1NldFRyYW5zYWN0aW9uVHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQkVBTikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogSWYgdGhlIGJlYW4gY29tcG9uZW50cyAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGJlYW4gY2xhc3MsIGFuZCBwcmltYXJ5Ci0JICoga2V5KSBjYW4gYWxsIGJlIGZvdW5kIGFuZCByZWZsZWN0ZWQsIHJldHVybiB0cnVlLiBFbHNlLCBhZGQgYSB2YWxpZGF0aW9uIGVycm9yCi0JICogYWdhaW5zdCB0aGUgYmVhbiwgYW5kIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJlYW5Db21wb25lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBiZWFuIGlzIG51bGwsIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotCQkvLyBub3QgYmUgY2FsbGVkIGlmIGl0IGlzLgotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDJfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXRFamJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDNfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDNfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDRfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNF9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBwcmltYXJ5S2V5KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJaWYgKCgoRW50aXR5KSBiZWFuKS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMF9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyAoKEVudGl0eSkgYmVhbikuZ2V0UHJpbWFyeUtleU5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMF9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ01QRmllbGRFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheCBvZiB0YWcgaXMgb2theQotCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCUxpc3QgZmllbGRzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoKGZpZWxkcyA9PSBudWxsKSB8fCAoZmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXRFamJDbGFzc05hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIG1hcHNUb011bHRpcGxlRmllbGRzID0gIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW4pOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWVsZHMuaXRlcmF0b3IoKTsKLQkJCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJCUxpc3QgZmllbGROYW1lcyA9IG5ldyBBcnJheUxpc3QoZmllbGRzLnNpemUoKSk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQ01QQXR0cmlidXRlIGF0dHJpYiA9IChDTVBBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoYXR0cmliID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJERFZhbGlkYXRvci52YWxpZGF0ZUNNUEZpZWxkRWxlbWVudChFbnRlcnByaXNlQmVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiQ01QQXR0cmlidXRlIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmaWVsZCA9IGF0dHJpYi5nZXRGaWVsZCgpOwotCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCWlmIChhdHRyaWIuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTFfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYXR0cmliLmdldE5hbWUoKSwgYmVhbi5nZXRFamJDbGFzc05hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTFfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJCQkvLyBub3QgYSBjdXN0b21lci1lbnRlcmVkIGZpZWxkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWZpZWxkTmFtZXMuYWRkKGZpZWxkLmdldE5hbWUoKSk7Ci0KLQkJCQl0cnkgewotCQkJCQkvLyBJZiB0aGUgZmllbGQgaXMgbm90IGEgdmFsaWQgdHlwZQotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy8gZmllbGQgbm90IGlkZW50aWZpZWQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gOS40LjcuMgotCQkJaWYgKG1hcHNUb011bHRpcGxlRmllbGRzICYmICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQlMaXN0IHByaW1LZXlGaWVsZHMgPSBjbXAuZ2V0UHJpbWFyeUtleSgpLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0KLQkJCQkvLyAoOS40LjcuMSBpcyB2YWxpZGF0ZWQgaW4gdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KGJlYW4pCi0JCQkJLy8gY2hlY2sgaWYgdGhlIHByaW1hcnkga2V5IGNsYXNzJyBmaWVsZHMgZXhpc3QgaW4gdGhlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCQkJCWl0ZXJhdG9yID0gcHJpbUtleUZpZWxkcy5pdGVyYXRvcigpOwotCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlGaWVsZCBrZXlGaWVsZCA9IChGaWVsZCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoKGtleUZpZWxkLmdldE5hbWUoKSAhPSBudWxsKSAmJiAoa2V5RmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSkgewotCQkJCQkJLy8gbm90IGEgY3VzdG9tZXItZW50ZXJlZCBmaWVsZAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIWZpZWxkTmFtZXMuY29udGFpbnMoa2V5RmllbGQuZ2V0TmFtZSgpKSkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGtleUZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBpcyBjYWxsZWQgaWYgdGhlIEVKQkphciBjb3VsZCBsb2FkLCB3aGljaCBtZWFucwotCSAqIHRoYXQgdGhlIHN5bnRheCBvZiB0aGUgSkFSIGlzIChtb3N0bHkpIGNvcnJlY3QuCi0JICoKLQkgKiBFSkIgc3BlYyAxLjEsIHNlY3Rpb24gQy40LCAiQWRkZWQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGUgQmVhbiBQcm92aWRlciB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlCi0JICogZW50ZXJwcmlzZSBiZWFuIHVzZXMgYSBiZWFuLW1hbmFnZWQgb3IgY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24uIgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgewotCQlFSkJKYXIgZWpiSmFyID0gbnVsbDsKLQkJaWYodGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCS8vIHJ1bm5pbmcgYXMgYSBkZXBlbmRlbnQKLQkJCWVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQl9Ci0JCWVsc2UgewotCQkJZWpiSmFyID0gKEVKQkphcil0YXJnZXRQYXJlbnQ7Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbil0YXJnZXQ7Ci0JCQotCQl2YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI5MDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJCS8vIElmIGJlYW4gaXNuJ3QgdmFsaWQsIGRvbid0IHBlcmZvcm0gYW55IG9mIHRoZSBvdGhlcgotCQkJLy8gdmFsaWRhdGlvbiBjaGVja3Mgb24gaXQuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNsYXNzIGV4aXN0cywgZXRjLgotCQkJYm9vbGVhbiByZWZsZWN0ZWQgPSB2YWxpZGF0ZUJlYW5Db21wb25lbnRzKHZjLCBlamJKYXIsIGJlYW4pOyAvLyBhc3N1bWUgZXZlcnl0aGluZyB3aWxsIHJlZmxlY3QgcHJvcGVybHkKLQotCQkJdmFsaWRhdGVFbnRlcnByaXNlVHlwZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUVKQk5hbWVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVSZWVudHJhbnRFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVTZXNzaW9uVHlwZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVBlcnNpc3RlbmNlVHlwZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyh2YywgZWpiSmFyLCBiZWFuKTsKLQotCQkJaWYgKCFyZWZsZWN0ZWQpIHsKLQkJCQkvLyBTb21ldGhpbmcgZGlkbid0IHJlZmxlY3QgcHJvcGVybHksIHNvIGRvbid0IGNvbnRpbnVlIHdpdGggdGhlCi0JCQkJLy8gcmVzdCBvZiB0aGUgY2hlY2tzLiBTb21lIG1ldGFkYXRhIHdpbGwgYmUgbm9uc2Vuc2UuCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKSAhPSBudWxsICYmICFjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJCQkvLyBEb24ndCB2YWxpZGF0ZSB0aGUgZmllbGRzIGlmIGl0J3MgbmVpdGhlciBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSBub3IgYSBjb21wb3VuZCBwcmltYXJ5IGtleS4KLQkJCQkJLy8gSWYgdGhlIHVzZXIgd2FzIGF0dGVtcHRpbmcgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGJ1dCBkaWQgYSB0eXBvIGluIGVqYi1qYXIueG1sLAotCQkJCQkvLyB0aGUgdXNlciB3aWxsIHNlZSBhIGxvdCBvZiBzdHJhbmdlIG1lc3NhZ2VzIGxvZ2dlZCBhZ2FpbnN0IHRoZSBmaWVsZHMgaW4gdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4KLQkJCQkJdmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJfQotCQkJfQotCi0JCQl2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUVKQlJlZih2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlU2VjdXJpdHlSb2xlUmVmRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJLyogdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2sKLQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvckNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0TmFtZSgpIH0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCU1zZ0xvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJfQotCQl9Ci0JCSovCi0JCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCkgfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQk5hbWVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IGJlYW4uZ2V0TmFtZSgpOwotCQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgc2VjdGlvbiAxNC4zIG9mIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiAxNC4zIEVKQiBSZWZlcmVuY2VzCi0JICogICAxNC4zLjEgQmVhbiBQcm92aWRlcidzIHJlc3BvbnNpYmlsaXRpZXMKLQkgKiAgICAgMTQuMy4xLjEgRUpCIHJlZmVyZW5jZSBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCi0JICogICAgIDE0LjMuMS4yIERlY2xhcmF0aW9uIG9mIEVKQiByZWZlcmVuY2VzIGluIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqICAgMTQuMy4yIEFwcGxpY2F0aW9uIEFzc2VtYmxlcidzIHJlc3BvbnNpYmlsaXRpZXMKLQkgKiAgIDE0LjMuMyBEZXBsb3llcidzIHJlc3BvbnNpYmlsaXR5Ci0JICogICAxNC4zLjQgQ29udGFpbmVyIFByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBlamJSZWZzID0gYmVhbi5nZXRFamJSZWZzKCk7Ci0JCWlmICgoZWpiUmVmcyA9PSBudWxsKSB8fCAoZWpiUmVmcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZWpiUmVmcy5pdGVyYXRvcigpOwotCQlFamJSZWYgcmVmID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmVmID0gKEVqYlJlZikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHJlZiA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJERFZhbGlkYXRvci52YWxpZGF0ZUVKQlJlZihFbnRlcnByaXNlQmVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJFamJSZWYgaXMgbnVsbCBpbiAiICsgYmVhbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyAxNC4zLjEuMQotCQkJLy8gSW5mbyBtc3NnLiAiRUpCIHNwZWMgcmVjb21tZW5kcyB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIG90aGVyIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSBlamIgc3ViY29udGV4dCBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IgotCQkJRW50ZXJwcmlzZUJlYW4gbmFtZWRFamIgPSBudWxsOwotCQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0xpbmsoKSkpIHsKLQkJCQkvLyBMb2FkIHRoZSBFSkIgaWRlbnRpZmllZCBieSB0aGUgcmVmZXJlbmNlLCBpZiBpdCBleGlzdHMuCi0JCQkJbmFtZWRFamIgPSBlamJKYXIuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYocmVmKTsKLQkJCQlpZiAobmFtZWRFamIgIT0gbnVsbCkgewotCQkJCQkvLyBpZiBpdCdzIG51bGwsIGxldCB0aGUgRUFSIHZhbGlkYXRvciByZXBvcnQgaXQKLQkJCQkJSW50ZWdlciBlamJUeXBlID0gbmV3IEludGVnZXIocmVmLmdldFR5cGUoKS5nZXRWYWx1ZSgpKTsKLQkJCQkJYm9vbGVhbiB3cm9uZ1R5cGUgPSBmYWxzZTsgLy8gaXMgdGhlIEVKQiwgaWRlbnRpZmllZCBieSBlamItbGluaywgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBlamItcmVmLXR5cGUgZWxlbWVudD8KLQkJCQkJU3RyaW5nIHR5cGUgPSAobmFtZWRFamIgaW5zdGFuY2VvZiBTZXNzaW9uKSA/ICJTZXNzaW9uIiA6ICJFbnRpdHkiOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChlamJUeXBlID09IG51bGwpIHsKLQkJCQkJCS8vIE5laXRoZXIgc2Vzc2lvbiBub3IgZW50aXR5PwotCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChlamJUeXBlLmludFZhbHVlKCkgPT0gRWpiUmVmVHlwZS5TRVNTSU9OKSB7Ci0JCQkJCQlpZiAoIShuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pKSB7Ci0JCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChlamJUeXBlLmludFZhbHVlKCkgPT0gRWpiUmVmVHlwZS5FTlRJVFkpIHsKLQkJCQkJCWlmICghKG5hbWVkRWpiIGluc3RhbmNlb2YgRW50aXR5KSkgewotCQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICh3cm9uZ1R5cGUpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIHR5cGUgfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyAxNC4zLjEuMiwgMTQuMy4yLCAxNC4zLjQKLQkJCS8vIENoZWNrIHRoYXQgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIGFuZCByZW1vdGUgaGF2ZSBiZWVuIGRlZmluZWQsIGFuZCBleGlzdAotCQkJdmFsaWRhdGVIb21lUmVmKHZjLCBlamJKYXIsIHJlZiwgbmFtZWRFamIpOwotCQkJdmFsaWRhdGVSZW1vdGVSZWYodmMsIGVqYkphciwgcmVmLCBuYW1lZEVqYik7Ci0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlpZiAocmVmLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJLy8gSWYgZWpiIG5hbWUgaXNuJ3Qgc2V0LCB0aGF0IGVycm9yIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgb25lIG9mIHRoZSB2YWxpZGF0ZVJlZiBtZXRob2RzCi0JCQkJLy8gRG9uJ3QgZHVwbGljYXRlIHRoYXQgZWZmb3J0IGhlcmUuCi0JCQkJU3RyaW5nIGVqYk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJCWlmICghZWpiTmFtZS5zdGFydHNXaXRoKCJlamIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRW50ZXJwcmlzZVR5cGVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBBdHRlbXB0IGluIHZhaW4gdG8gdmFsaWRhdGUgdGhlIGVudGVycHJpc2UgdHlwZSBlbGVtZW50IGhlcmUsIGJlY2F1c2UgCi0JCS8vIGlmIGl0J3Mgbm90IHNwZWNpZmllZCwgdGhlcmUncyBhIHN5bnRheCBlcnJvciwgYW5kIHRoZSAKLQkJLy8gdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUmVwb3J0ZXIsIElWYWxpZGF0aW9uQ29udGV4dCkgd291bGQgaGF2ZSBiZWVuIAotCQkvLyBjYWxsZWQgaW5zdGVhZC4KLQkJLyoKLQkJaWYoISAoYmVhbi5pc1Nlc3Npb24oKSB8fCBiZWFuLmlzRW50aXR5KCkgKSkgewotCQkJLy8gbm8gdGFnIHNwZWNpZmllZAotCQkJU3RyaW5nIGJlYW5OYW1lID0gKGJlYW4uZ2V0TmFtZSgpID09IG51bGwpID8gIiIgOiBiZWFuLmdldE5hbWUoKTsKLQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfRERfSU5WQUxJRF9FTlRFUlBSSVNFVFlQRSwgbmV3IFN0cmluZ1tde2JlYW5OYW1lfSwgYmVhbik7Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgc2VjdGlvbiAxNC4zIG9mIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiAxNC4yLjEuMiBEZWNsYXJhdGlvbiBvZiBlbnZpcm9ubWVudCBlbnRyaWVzCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgZW52RW50cmllcyA9IGJlYW4uZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JCWlmICgoZW52RW50cmllcyA9PSBudWxsKSB8fCAoZW52RW50cmllcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVudkVudHJ5IGVudkVudHJ5ID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbnZFbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCUR1cGxpY2F0ZXNUYWJsZSBlbnZOYW1lcyA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJZW52RW50cnkgPSAoRW52RW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbnZFbnRyeSA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJERFZhbGlkYXRvci52YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhFbnRlcnByaXNlQmVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJFamJFbnRyeSBpcyBudWxsIGluICIgKyBiZWFuLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVudkVudHJ5LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZW52TmFtZXMuYWRkKGVudkVudHJ5LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJaWYgKGVudkVudHJ5LmlzU2V0VHlwZSgpKSB7Ci0JCQkJLy8gMTQuMi4xLjI7IHR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlc2UgdHlwZXM6IFN0cmluZywgSW50ZWdlciwgQm9vbGVhbiwgRG91YmxlLCBCeXRlLCBTaG9ydCwgTG9uZywgYW5kIEZsb2F0LgotCQkJCWludCB0eXBlID0gZW52RW50cnkuZ2V0VHlwZSgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKCEoKHR5cGUgPT0gRW52RW50cnlUeXBlLkJPT0xFQU4pIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5CWVRFKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuRE9VQkxFKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuRkxPQVQpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5JTlRFR0VSKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuTE9ORykgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLlNIT1JUKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuU1RSSU5HKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVudk5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQlJdGVyYXRvciBkdXBzID0gZW52TmFtZXMuZ2V0RHVwbGljYXRlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZHVwcy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGR1cHMubmV4dCgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW10geyBuYW1lIH0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgPGVqYi1yZWY+IGVsZW1lbnQgdGhpcyBtZXRob2QgdmFsaWRhdGVzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSA8ZWpiLXJlZj4gdXNlcyBhbiA8ZWpiLWxpbms+LCB0aGlzIGlzIHRoZSBlbnRlcnByaXNlIGJlYW4gaWRlbnRpZmllZCBieSB0aGF0IGxpbmsuIElmIHRoZSBsaW5rIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIHRoZSB1c2VyIGhhcyBpZGVudGlmaWVkIGEgYmVhbiB3aGljaCBkb2Vzbid0IGV4aXN0LCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIb21lUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRWpiUmVmIHJlZiwgRW50ZXJwcmlzZUJlYW4gbmFtZWRFamIpIHsKLQkJYm9vbGVhbiB2YWxpZFR5cGUgPSB0cnVlOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXJlZi5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9Ib21lKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBob21lTmFtZSA9IHJlZi5nZXRIb21lKCk7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGhvbWVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShpbnRmVHlwZSk7Ci0KLQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGlkZW50aWZpZWQgaG9tZS9yZW1vdGUgaW50ZXJmYWNlIGluIHRoZSBlamItcmVmCi0JCQkJCS8vIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9uZSB1c2VkIGJ5IHRoZSBiZWFuLgotCQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUuZ2V0V3JhcHBlcigpLCBpbnRmVHlwZSkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIGludGZUeXBlLmdldE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdmFsaWRUeXBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IHsgcmVmLmdldEhvbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBlcnNpc3RlbmNlVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIEF0dGVtcHQgaW4gdmFpbiB0byB2YWxpZGF0ZSB0aGUgcGVyc2lzdGVuY2UgdHlwZSBlbGVtZW50IGhlcmUsIGJlY2F1c2UgCi0JCS8vIGlmIGl0J3Mgbm90IHNwZWNpZmllZCwgdGhlcmUncyBhIHN5bnRheCBlcnJvciwgYW5kIHRoZSAKLQkJLy8gdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUmVwb3J0ZXIsIElWYWxpZGF0aW9uQ29udGV4dCkgd291bGQgaGF2ZSBiZWVuIAotCQkvLyBjYWxsZWQgaW5zdGVhZC4KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQlFbnRpdHkgZW50aXR5QmVhbiA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIShlbnRpdHlCZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHx8IGVudGl0eUJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBJZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgcmVmbGVjdGVkIHByb3Blcmx5LCByZXR1cm4gdHJ1ZS4gRWxzZSwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUHJpbUtleUNsYXNzRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQlpZiAoYmVhbiBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIHsKLQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCUphdmFDbGFzcyBjbGFzID0gY21wLmdldFByaW1hcnlLZXkoKTsKLQkJCQlpZiAoY2xhcyAhPSBudWxsICYmICFjbGFzLmVJc1Byb3h5KCkgJiYgIWlzVmFsaWRQcmltS2V5RmllbGQoY21wLGNsYXMpKSB7Ci0JCQkJCS8vIDkuNC43LjEKLQkJCQkJLy8gdXNlciBoYXMgc3BlY2lmaWVkIGJvdGggYSBwcmltLWtleS1jbGFzcyBhbmQgYSBwcmlta2V5LWZpZWxkCi0JCQkJCS8vIGNhbid0IHVzZSB0aGUgQ01QQXR0cmlidXRlJ3MgZmllbGQncyBuYW1lLCBiZWNhdXNlIHRoZSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgcmV0dXJuZWQgaXMgbnVsbAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgcHJpbWFyeSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSB4bWwsIGFuc3dlciB3aGV0aGVyIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBkZXJpdmVkIHByaW1hcnlLZXlBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFByaW1LZXlGaWVsZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgSmF2YUNsYXNzIGNsYXMpIHsKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5TmFtZSgpLmVxdWFscyhjbGFzLmdldEphdmFOYW1lKCkpOyAKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVSZWVudHJhbnRFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBiZWFuOwotCQkJaWYgKCFlbnRpdHkuaXNTZXRSZWVudHJhbnQoKSkgewotCQkJCS8vIENhbiBvbmx5IHRlc3QgaWYgdGhlIHJlZW50cmFudCBhdHRyaWJ1dGUgaXMgc2V0LCBiZWNhdXNlIHRoZSBtb2RlbCBkZWZhdWx0cyBpdAotCQkJCS8vIHRvIHNvbWUgYm9vbGVhbiB2YWx1ZSBpZiBpdCBpc24ndCBzZXQuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBFamJSZWYgaXMgbm90IHZhbGlkLCBhZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JICoKLQkgKiBAcGFybSBFamJSZWYgVGhlIHJlZiB3aG9zZSBob21lIHRoaXMgbWV0aG9kIGNoZWNrcy4KLQkgKiBAcGFybSBFbnRlcnByaXNlQmVhbiBJZiB0aGUgRWpiUmVmIHVzZXMgYW4gPGVqYi1saW5rPiBlbGVtZW50LCB0aGlzIGlzIHRoZSBlbnRlcnByaXNlIGJlYW4gaWRlbnRpZmllZCBieSB0aGF0IGVsZW1lbnQuIEl0IG1heSBiZSBudWxsLCBpZiB0aGUgdXNlciBoYXMgbWFkZSBhIG1pc3Rha2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZW1vdGVSZWYoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFamJSZWYgcmVmLCBFbnRlcnByaXNlQmVhbiBuYW1lZEVqYikgewotCQlib29sZWFuIHZhbGlkVHlwZSA9IHRydWU7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pcmVmLmVDb250YWluZXIoKTsKLQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX1JlbW90ZSgpKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcmVtb3RlTmFtZSA9IHJlZi5nZXRSZW1vdGUoKTsKLQkJCQlKYXZhSGVscGVycyB0eXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUocmVtb3RlTmFtZSwgYmVhbik7Ci0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudAotCQkJCS8vIGV4aXN0cy4KLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodHlwZSk7Ci0KLQkJCQlpZiAobmFtZWRFamIgIT0gbnVsbCkgewotCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQKLQkJCQkJLy8gaXMgYXNzaWduYWJsZSB0byB0aGUgaG9tZSB1c2VkIGJ5IHRoZSBuYW1lZCBFSkIgaW4gdGhlCi0JCQkJCS8vIDxlamItbGluaz4gZWxlbWVudC4KLQkJCQkJSmF2YUNsYXNzIGludGZUeXBlID0gbmFtZWRFamIuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShpbnRmVHlwZSk7Ci0KLQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGlkZW50aWZpZWQgaG9tZS9yZW1vdGUgaW50ZXJmYWNlIGluIHRoZSBlamItcmVmCi0JCQkJCS8vIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9uZSB1c2VkIGJ5IHRoZSBiZWFuLgotCQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUuZ2V0V3JhcHBlcigpLCBpbnRmVHlwZSkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIGludGZUeXBlLmdldE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdmFsaWRUeXBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IHsgcmVmLmdldFJlbW90ZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDE1LjIuNS4zIERlY2xhcmF0aW9uIG9mIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgZnJvbSB0aGUgYmVhbidzIGNvZGUKLQkgKiBUaGUgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVjbGFyaW5nIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiAKLQkgKiBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIAotCSAqIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcyByZWZlcmVuY2VzIGluCi0JICogdGhlIGNvZGUgYWxsb3dzIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgb3IgRGVwbG95ZXIgdG8gbGluayB0aGUgbmFtZXMgCi0JICogb2YgdGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIAotCSAqIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZGVjbGFyZSBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlZCBpbiB0aGUgY29kZQotCSAqIHVzaW5nIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0JICogICAgICBEZWNsYXJlIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLW5hbWUgZWxlbWVudC4gCi0JICogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byAKLQkgKiB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkgbWV0aG9kLgotCSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgCi0JICogZGVzY3JpcHRpb24gZWxlbWVudC4gQSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRoZSBuYW1lIGRlZmluZWQgCi0JICogYnkgdGhlIHJvbGUtbmFtZSBlbGVtZW50LCBpcyBzY29wZWQgdG8gdGhlIHNlc3Npb24gb3IgZW50aXR5IGJlYW4gZWxlbWVudCAKLQkgKiB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4gVGhlIGZvbGxvd2luZyAKLQkgKiBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzIAotCSAqIGFyZSBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqICAgIC4uLgotCSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotCSAqICAgICAgIC4uLgotCSAqICAgICAgIDxlbnRpdHk+Ci0JICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0JICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotCSAqICAgICAgICAgIC4uLgotCSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgICAgIFRoaXMgc2VjdXJpdHkgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLQkgKiAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byB1cGRhdGUgZW1wbG95ZWVzJyBzYWxhcmllcy4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50ZXJwcmlzZSBiZWFuIAotCSAqIEFhcmR2YXJrUGF5cm9sbCBtYWtlcyB0aGUgc2VjdXJpdHkgY2hlY2sgdXNpbmcgaXNDYWxsZXJJblJvbGUoInBheXJvbGwiKQotCSAqIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0JICoKLQkgKgotCSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotCSAqIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZGVmaW5lcyB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLCBoZSBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIAotCSAqIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIAotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuIFRoZSBBcHBsaWNhdGlvbiAKLQkgKiBBc3NlbWJsZXIgbGlua3MgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIAotCSAqIHJvbGUtbGluayBlbGVtZW50LiBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2YgCi0JICogb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotCSAqIEEgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgdGhlIHZhbHVlIG9mIHJvbGUtbmFtZSBpcyB0aGUgCi0JICogc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayByZWZlcmVuY2UuCi0JICogVGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhhbXBsZSBzaG93cyBob3cgdG8gbGluayB0aGUgc2VjdXJpdHkgCi0JICogcm9sZSByZWZlcmVuY2UgbmFtZWQgcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICBUaGlzIHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotCSAqICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50LgotCSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0JICogICAgICAgICAgICAgICAgYW55b25lJ3MgcGF5cm9sbCByZWNvcmQuCi0JICoKLQkgKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgcGF5cm9sbC1kZXBhcnRtZW50IHJvbGUuCi0JICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLQkgKiAgICAgICAgICAgICA8cm9sZS1saW5rPnBheXJvbGwtZGVwYXJ0bWVudDwvcm9sZS1saW5rPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eVJvbGVSZWZFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJvbGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIFNlY3VyaXR5Um9sZVJlZiBpbnN0YW5jZS4KLQkJICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JCSAqCi0JCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIFNlY3VyaXR5Um9sUmVmIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCQkgKi8KLQkJY2xhc3MgUm9sZVJlZldyYXBwZXIgewotCQkJcHJpdmF0ZSBTZWN1cml0eVJvbGVSZWYgX3JlZiA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlUmVmV3JhcHBlcihTZWN1cml0eVJvbGVSZWYgcmVmKSB7Ci0JCQkJX3JlZiA9IHJlZjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlUmVmV3JhcHBlcikgewotCQkJCQlSb2xlUmVmV3JhcHBlciBvdGhlciA9IChSb2xlUmVmV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yZWYuZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRSb2xlUmVmKCkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmIGdldFJvbGVSZWYoKSB7Ci0JCQkJcmV0dXJuIF9yZWY7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGFyZVNSb2xlc0RlZmluZWQgPSAoKF9zZWN1cml0eVJvbGVzICE9IG51bGwpICYmIChfc2VjdXJpdHlSb2xlcy5zaXplKCkgPiAwKSk7Ci0KLQkJTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gYmVhbi5nZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCWlmICgoc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsKSAmJiAoc2VjdXJpdHlSb2xlUmVmcy5zaXplKCkgIT0gMCkpIHsKLQkJCS8vIENoZWNrIHRoYXQgZWFjaCBzZWN1cml0eSByb2xlIHJlZiByZWZlcnMgdG8gYSBzZWN1cml0eSByb2xlLAotCQkJLy8gaWYgc2VjdXJpdHkgcm9sZXMgYXJlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IsCi0JCQkvLyBhbmQgdGhhdCBlYWNoIHJlZmVyZW5jZWQgc2VjdXJpdHkgcm9sZSBleGlzdHMuCi0JCQlEdXBsaWNhdGVzVGFibGUgcm9sZVJlZk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN1cml0eVJvbGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VjdXJpdHlSb2xlUmVmIHJlZiA9IChTZWN1cml0eVJvbGVSZWYpIHNlY3VyaXR5Um9sZVJlZnMuZ2V0KGkpOwotCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZSBuYW1lIGlzIHNldCAoMTUuMi41LjMpCi0JCQkJU3RyaW5nIHJvbGVOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCQlpZiAoKHJvbGVOYW1lID09IG51bGwpIHx8IChyb2xlTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJvbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGJlYW5OYW1lID0gKGJlYW4uZ2V0TmFtZSgpID09IG51bGwpID8gIiIgOiBiZWFuLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCBuZXcgU3RyaW5nW10geyBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEJ1aWxkIHVwIHRoZSBsaXN0IG9mIG5hbWVzLCB0byBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlyb2xlUmVmTmFtZXMuYWRkKG5ldyBSb2xlUmVmV3JhcHBlcihyZWYpKTsKLQkJCQl9Ci0KLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlIGxpbmsgaXMgc2V0ICgxNS4zLjMpCi0JCQkJU3RyaW5nIHJvbGVMaW5rID0gcmVmLmdldExpbmsoKTsKLQkJCQlib29sZWFuIGlzTGlua0RlZmluZWQgPSAoKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSkpICYmIChyb2xlTGluayAhPSBudWxsKSAmJiAoIXJvbGVMaW5rLmVxdWFscygiIikpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKChhcmVTUm9sZXNEZWZpbmVkKSAmJiAoIWlzTGlua0RlZmluZWQpKSB7Ci0JCQkJCS8vIG11c3QgaGF2ZSByb2xlIGxpbmsgZGVmaW5lZCAoMTUuMy4zKQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKCFhcmVTUm9sZXNEZWZpbmVkKSAmJiAoaXNMaW5rRGVmaW5lZCkpIHsKLQkJCQkJLy8gbXVzdCBub3QgaGF2ZSByb2xlIGxpbmsgZGVmaW5lZCAoMTUuMi41LjMpCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhcmVTUm9sZXNEZWZpbmVkICYmIGlzTGlua0RlZmluZWQpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcm9sZSBsaXN0ZWQgaW4gdGhlIGxpbmsgZXhpc3RzLiAoMTUuMy4zKQotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9zZWN1cml0eVJvbGVzLml0ZXJhdG9yKCk7Ci0JCQkJCWJvb2xlYW4gcm9sZUV4aXN0cyA9IGZhbHNlOwotCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNlY3VyaXR5Um9sZSByb2xlID0gKFNlY3VyaXR5Um9sZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGVMaW5rKSkgewotCQkJCQkJCXJvbGVFeGlzdHMgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghcm9sZUV4aXN0cykgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgbmV3IFN0cmluZ1tdIHsgcm9sZU5hbWUgfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVjayBmb3IgZHVwbGljYXRlcwotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZVJlZk5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZVJlZk5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVSZWZXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGVSZWYoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZVJlZk5hbWVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogNi41LjMgVGhlIG9wdGlvbmFsIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCi0JICouLi4KLQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCSAqIGltcGxlbWVudCB0aGUgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkgKiBzeW5jaHJvbml6YXRpb24gY2FsbCBiYWNrcyBiZWNhdXNlIHRoZSBiZWFuIGlzIGluIGNvbnRyb2wgb2YgdGhlIGNvbW1pdCB0aGUgYmVhbiAKLQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlc3Npb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCVNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBiZWFuOwotCi0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWJvb2xlYW4gaXNWYWxpZFNlc3MgPSBpc1ZhbGlkU2Vzc2lvblR5cGVFbGVtZW50KHNlc3Npb24pOwotCQkJaWYgKCFpc1ZhbGlkU2VzcykgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgc2Vzc2lvbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQkJCWlmICghaXNWYWxpZFRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoc2Vzc2lvbkJlYW4pKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCi0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJaWYoZWpiSmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlfc2VjdXJpdHlSb2xlcyA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMjBWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTE4MmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbnRlcnByaXNlQmVhbjIwVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUJlYW4yMFZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBMaXN0IF9zZWN1cml0eVJvbGVzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSk1TX01FU1NBR0lOR19UWVBFID0gImphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIiOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAxLCBuZXcgU3RyaW5nW117Q0hLSjI4MDErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDVfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNV9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNV9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDVfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNiwgbmV3IFN0cmluZ1tde0NIS0oyODA2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA3LCBuZXcgU3RyaW5nW117Q0hLSjI4MDcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDgsIG5ldyBTdHJpbmdbXXtDSEtKMjgwOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOSwgbmV3IFN0cmluZ1tde0NIS0oyODA5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMCwgbmV3IFN0cmluZ1tde0NIS0oyODIwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIyLCBuZXcgU3RyaW5nW117Q0hLSjI4MjIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNCwgbmV3IFN0cmluZ1tde0NIS0oyODI0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI1LCBuZXcgU3RyaW5nW117Q0hLSjI4MjUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNywgbmV3IFN0cmluZ1tde0NIS0oyODI3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI4LCBuZXcgU3RyaW5nW117Q0hLSjI4MjgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMSwgbmV3IFN0cmluZ1tde0NIS0oyODMxK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMyLCBuZXcgU3RyaW5nW117Q0hLSjI4MzIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNCwgbmV3IFN0cmluZ1tde0NIS0oyODM0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM1LCBuZXcgU3RyaW5nW117Q0hLSjI4MzUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzYsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNywgbmV3IFN0cmluZ1tde0NIS0oyODM3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM4LCBuZXcgU3RyaW5nW117Q0hLSjI4MzgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzksIG5ldyBTdHJpbmdbXXtDSEtKMjgzOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MCwgbmV3IFN0cmluZ1tde0NIS0oyODQwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQxLCBuZXcgU3RyaW5nW117Q0hLSjI4NDErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NiwgbmV3IFN0cmluZ1tde0NIS0oyODQ2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ3LCBuZXcgU3RyaW5nW117Q0hLSjI4NDcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTQsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NSwgbmV3IFN0cmluZ1tde0NIS0oyODU1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU2LCBuZXcgU3RyaW5nW117Q0hLSjI4NTYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTcsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1OCwgbmV3IFN0cmluZ1tde0NIS0oyODU4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU5LCBuZXcgU3RyaW5nW117Q0hLSjI4NTkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjAsIG5ldyBTdHJpbmdbXXtDSEtKMjg2MCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4MCwgbmV3IFN0cmluZ1tdeyJDSEtKMjg4MC5zIitTUEVDLCAiQ0hLSjI4ODAuYiIrU1BFQywgIkNIS0oyODgwLmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4MSwgbmV3IFN0cmluZ1tdeyJDSEtKMjg4MS5zIitTUEVDLCAiQ0hLSjI4ODEuYiIrU1BFQywgIkNIS0oyODgxLmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4MiwgbmV3IFN0cmluZ1tdeyJDSEtKMjg4Mi5zIitTUEVDLCAiQ0hLSjI4ODIuYiIrU1BFQywgIkNIS0oyODgyLmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4MywgbmV3IFN0cmluZ1tdeyJDSEtKMjg4My5zIitTUEVDLCAiQ0hLSjI4ODMuYiIrU1BFQywgIkNIS0oyODgzLmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4NCwgbmV3IFN0cmluZ1tdeyJDSEtKMjg4NC5zIitTUEVDLCAiQ0hLSjI4ODQuYiIrU1BFQywgIkNIS0oyODg0LmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg4NSwgbmV3IFN0cmluZ1tdeyJDSEtKMjg4NS5zIitTUEVDLCAiQ0hLSjI4ODUuYiIrU1BFQywgIkNIS0oyODg1LmMiK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlOyBuZWVkIGRpZmYgc3BlYyBudW1iZXIgZm9yIGVhY2ggdHlwZSBvZiBiZWFuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCS8vIEVKQkphciBkb2Vzbid0IGRlcGVuZCBvbiBhbnl0aGluZyBlbHNlCi0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VOVEVSUFJJU0VCRUFOOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlyZXR1cm4gcGFyZW50OyAvLyBUaGUgcGFyZW50IHdpbGwgYmUgYW4gRW50ZXJwcmlzZUJlYW4uCi0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVudGVycHJpc2VCZWFuMjBWUnVsZSAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0JCQotCQlFSkJKYXIgZWpiSmFyID0gbnVsbDsKLQkJaWYodGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCS8vIHJ1bm5pbmcgYXMgYSBkZXBlbmRlbnQKLQkJCWVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQl9Ci0JCWVsc2UgewotCQkJZWpiSmFyID0gKEVKQkphcil0YXJnZXRQYXJlbnQ7Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbil0YXJnZXQ7Ci0JCQotCQl2YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQl9Ci0JCQkKLQkJCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIENoZWNrIGlmIHRoZSBiZWFuIHBhcnRzIGFyZSByZWZsZWN0ZWQuIFNvbWUgcnVsZXMgY2FuIGJlIHZhbGlkYXRlZAotCQkJLy8gd2hldGhlciBvciBub3QgdGhlIGJlYW4gaXMgcmVmbGVjdGVkLgotCQkJYm9vbGVhbiByZWZsZWN0ZWQgPSB2YWxpZGF0ZUJlYW5Db21wb25lbnRzUmVmbGVjdGVkKHZjLCBlamJKYXIsIGJlYW4pOwotCi0JCQkvLyBUaGVzZSBydWxlcyBjYW4gYmUgdmFsaWRhdGVkIHdoZXRoZXIgb3Igbm90IHRoZSBiZWFuIGlzIHJlZmxlY3RlZC4KLQkJCXZhbGlkYXRlRUpCTmFtZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVNlc3Npb25UeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUGVyc2lzdGVuY2VUeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKHZjLCBlamJKYXIsIGJlYW4pOwotCi0JCQkvLyBUaGUgcmVzdCBvZiB0aGUgcnVsZXMgY2Fubm90IGJlIHZhbGlkYXRlZCBiZWNhdXNlIHRoZSBiZWFuIGlzbid0IHJlZmxlY3RlZC4KLQkJCWlmICghcmVmbGVjdGVkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQl2YWxpZGF0ZUxvY2FsUGFpcnModmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVJlbW90ZVBhaXJzKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVMb2NhbE9yUmVtb3RlKHZjLCBlamJKYXIsIGJlYW4pOwotCi0JCQlpZiAoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJaWYoKGNtcC5nZXRQcmltS2V5RmllbGQoKSAhPSBudWxsKSAmJiAhY21wLmdldFByaW1LZXlGaWVsZCgpLmVJc1Byb3h5KCkpIHsKLQkJCQkJLy8gRG9uJ3QgdmFsaWRhdGUgdGhlIGZpZWxkcyBpZiBpdCdzIG5laXRoZXIgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgbm9yIGEgY29tcG91bmQgcHJpbWFyeSBrZXkuCi0JCQkJCS8vIElmIHRoZSB1c2VyIHdhcyBhdHRlbXB0aW5nIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LCBidXQgZGlkIGEgdHlwbyBpbiBlamItamFyLnhtbCwKLQkJCQkJLy8gdGhlIHVzZXIgd2lsbCBzZWUgYSBsb3Qgb2Ygc3RyYW5nZSBtZXNzYWdlcyBsb2dnZWQgYWdhaW5zdCB0aGUgZmllbGRzIGluIHRoZSBwcmltaXRpdmUgcHJpbWFyeSBrZXkuCi0JCQkJCXZhbGlkYXRlQ01QRmllbGRFbGVtZW50KHZjLCBlamJKYXIsIGNtcCk7Ci0JCQkJfQotCQkJCXZhbGlkYXRlQWJzdHJhY3RTY2hlbWFOYW1lRWxlbWVudCh2YywgZWpiSmFyLCBjbXApOwotCQkJCXZhbGlkYXRlSmF2YUlkZW50aWZpZXIodmMsIGVqYkphciwgY21wKTsKLQkJCX0KLQkJCWlmKGJlYW4uaXNNZXNzYWdlRHJpdmVuKCkgJiYgYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKSB7Ci0JCQkJdmFsaWRhdGVBY3RpdmF0aW9uQ29uZmlndXJhdGlvbih2YywgKE1lc3NhZ2VEcml2ZW4pYmVhbik7Ci0JCQl9Ci0JCQl2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUVKQlJlZih2YywgZWpiSmFyLCBiZWFuKTsKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGJlYW4gY29tcG9uZW50cyAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGJlYW4gY2xhc3MsIGFuZCBwcmltYXJ5Ci0JICoga2V5KSBjYW4gYWxsIGJlIGZvdW5kIGFuZCByZWZsZWN0ZWQsIHJldHVybiB0cnVlLiBMZXQgdGhlIEREVmFsaWRhdG9yCi0JICogcmVwb3J0IHRoZSBlcnJvciBtZXNzYWdlIGFnYWluc3QgdGhlIGJlYW4gaWYgb25lIG9mIHRoZXNlIHR5cGVzIGRvZXNuJ3QgcmVmbGVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJlYW5Db21wb25lbnRzUmVmbGVjdGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBiZWFuIGlzIG51bGwsIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotCQkvLyBub3QgYmUgY2FsbGVkIGlmIGl0IGlzLgotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSkpIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXXtiZWFuLmdldEVqYkNsYXNzTmFtZSgpfSwgdGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQl9Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmVzdAotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDNfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0SG9tZUludGVyZmFjZU5hbWUoKX0sIHRoaXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwM19VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJfQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNF9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW117YmVhbi5nZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDRfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCX0KLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDVfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDVfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODAwX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXXtiZWFuLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDBfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCX0KLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBwcmltYXJ5S2V5KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQkJaWYoKChFbnRpdHkpYmVhbikuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9QcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdeygoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXlOYW1lKCl9LCB0aGlzKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl9Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNNUEZpZWxkRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCS8vIGNoZWNrIHN5bnRheCBvZiB0YWcgaXMgb2theQotCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQlpZiAoKGZpZWxkcyA9PSBudWxsKSB8fCAoZmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJLy8gdW5saWtlIEVKQiAxLjEgQ01QcywgdGhpcyBpcyBsZWdhbC4KLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gbWFwc1RvTXVsdGlwbGVGaWVsZHMgPSAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotLy8JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJTGlzdCBmaWVsZE5hbWVzID0gbmV3IEFycmF5TGlzdChmaWVsZHMuc2l6ZSgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01QQXR0cmlidXRlIGF0dHJpYiA9IChDTVBBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQoRW50ZXJwcmlzZUJlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiQ01QQXR0cmlidXRlIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZmllbGROYW1lcy5hZGQoYXR0cmliLmdldE5hbWUoKSk7Ci0KLQkJCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IGF0dHJpYi5nZXRUeXBlKCk7Ci0JCQl0cnkgewotCQkJCS8vIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCB0eXBlCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGZpZWxkVHlwZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCS8vIGZpZWxkIG5vdCBpZGVudGlmaWVkCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgbmV3IFN0cmluZ1tdIHsgYXR0cmliLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJY29udGludWU7IC8vIGlmIHlvdSBjYW4ndCByZWZsZWN0IGl0LCB0aGVuIHlvdSBjYW4ndCB2YWxpZGF0ZSBpdAotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCWlmKCFmaWVsZFR5cGUuaXNQcmltaXRpdmUoKSAmJiAKLQkJCQkgICAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2VyaWFsaXphYmxlKGZpZWxkVHlwZSwgY21wKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGF0dHJpYi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IG5ldyBTdHJpbmdbXXt9IDogbmV3IFN0cmluZ1tde2UuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gOS40LjcuMgotCQlpZiAobWFwc1RvTXVsdGlwbGVGaWVsZHMgJiYgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldFByaW1hcnlLZXkoKS5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCi0JCQkvLyAoOS40LjcuMSBpcyB2YWxpZGF0ZWQgaW4gdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KGJlYW4pCi0JCQkvLyBjaGVjayBpZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MnIGZpZWxkcyBleGlzdCBpbiB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JCQlpdGVyYXRvciA9IHByaW1LZXlGaWVsZHMuaXRlcmF0b3IoKTsKLQotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUZpZWxkIGtleUZpZWxkID0gKEZpZWxkKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKChrZXlGaWVsZC5nZXROYW1lKCkgIT0gbnVsbCkgJiYgKGtleUZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkpIHsKLQkJCQkJLy8gbm90IGEgY3VzdG9tZXItZW50ZXJlZCBmaWVsZAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIWZpZWxkTmFtZXMuY29udGFpbnMoa2V5RmllbGQuZ2V0TmFtZSgpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBuZXcgU3RyaW5nW10geyBrZXlGaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNNUkZpZWxkRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWlmIChjbXAgPT0gbnVsbCkKLQkJCXJldHVybjsgCi0JCXN3aXRjaChjbXAuZ2V0VmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDogZGVmYXVsdDoKLQkJCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlDTVJGaWVsZCBmaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCQkJCWlmKChmaWVsZE5hbWUgPT0gbnVsbCkgfHwgKGZpZWxkTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCWNvbnRpbnVlOyAvLyBkb24ndCBsb29rIGZvciB0aGUgZ2V0IG1ldGhvZHMKLQkJCQkJfQotCQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRKYXZhSWRlbnRpZmllcihmaWVsZE5hbWUpKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShmaWVsZFR5cGUsIGNtcC5nZXRMb2NhbEludGVyZmFjZSgpKSAmJgotCQkJCQkJICAgICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24oZmllbGRUeXBlLCBjbXApICYmCi0JCQkJCQkgICAgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tU2V0KGZpZWxkVHlwZSwgY21wKSkgewotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgbmV3IFN0cmluZ1tdIHsgZmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gbmV3IFN0cmluZ1tde30gOiBuZXcgU3RyaW5nW117ZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTmFtZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gYmVhbi5nZXROYW1lKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBiZWFuLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsJCQotCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkSmF2YUlkZW50aWZpZXIobmFtZSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQotCQkJLy8gcC4gNDY2Ci0JCQkvLyAiVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54IG11c3QgY29uZm9ybQotCQkJLy8gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JCQkvLyBjbXAtdmVyc2lvbiAyLnggbXVzdCBub3QgYmUgYSByZXNlcnZlZCBsaXRlcmFsIGluIEVKQiBRTC4KLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1Jlc2VydmVkV29yZChuYW1lKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVBYnN0cmFjdFNjaGVtYU5hbWVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuOyAKLQkJc3dpdGNoKGNtcC5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCi0JCQkJU3RyaW5nIG5hbWUgPSBjbXAuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0JCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkSmF2YUlkZW50aWZpZXIobmFtZSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODU4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgbmFtZSBpcyBub3QgYSByZXNlcnZlZCB3b3JkCi0JCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUmVzZXJ2ZWRXb3JkKG5hbWUpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSmF2YUlkZW50aWZpZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQkvKgotCQkgKiBEb24ndCBkdXBsaWNhdGUgdGhlIEVKQiBRTCB2YWxpZGF0b3IncyBmdW5jdGlvbi4KLQkJTGlzdCBxdWVyaWVzID0gY21wLmdldFF1ZXJpZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBxdWVyaWVzLml0ZXJhdG9yKCk7Ci0JCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJKi8KLQl9Ci0JCi0KLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjMgRUpCIFJlZmVyZW5jZXMKLQkgKiAgIDE0LjMuMSBCZWFuIFByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgICAxNC4zLjEuMSBFSkIgcmVmZXJlbmNlIHByb2dyYW1taW5nIGludGVyZmFjZXMKLQkgKiAgICAgMTQuMy4xLjIgRGVjbGFyYXRpb24gb2YgRUpCIHJlZmVyZW5jZXMgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogICAxNC4zLjIgQXBwbGljYXRpb24gQXNzZW1ibGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgMTQuMy4zIERlcGxveWVyJ3MgcmVzcG9uc2liaWxpdHkKLQkgKiAgIDE0LjMuNCBDb250YWluZXIgUHJvdmlkZXIncyByZXNwb25zaWJpbGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGVqYlJlZnMgPSBiZWFuLmdldEVqYlJlZnMoKTsKLQkJaWYgKChlamJSZWZzID09IG51bGwpIHx8IChlamJSZWZzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWZzLml0ZXJhdG9yKCk7Ci0JCUVqYlJlZiByZWYgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZWYgPSAoRWpiUmVmKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRUpCUmVmKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYlJlZiBpcyBudWxsIGluICIgKyBiZWFuLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlFbnRlcnByaXNlQmVhbiBuYW1lZEVqYiA9IG51bGw7Ci0JCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpKSkgewotCQkJCS8vIExvYWQgdGhlIEVKQiBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UsIGlmIGl0IGV4aXN0cy4KLQkJCQluYW1lZEVqYiA9IGVqYkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihyZWYpOwotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIGlmIHRoZSBuYW1lZCBFSkIgaXMgbnVsbCBpdCBjb3VsZCBiZSBpbiBhbm90aGVyIEVKQkphcgotCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwotCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZWpiVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBOZWl0aGVyIHNlc3Npb24gbm9yIGVudGl0eT8KLQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuU0VTU0lPTikgewotCQkJCQkJaWYgKCEobmFtZWRFamIgaW5zdGFuY2VvZiBTZXNzaW9uKSkgewotCQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuRU5USVRZKSB7Ci0JCQkJCQlpZiAoIShuYW1lZEVqYiBpbnN0YW5jZW9mIEVudGl0eSkpIHsKLQkJCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAod3JvbmdUeXBlKSB7Ci0JCQkJCQlTdHJpbmdbXSBwYXJtcyA9IHsgbmFtZWRFamIuZ2V0TmFtZSgpLCB0eXBlIH07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gMTQuMy4xLjIsIDE0LjMuMiwgMTQuMy40Ci0JCQkvLyBDaGVjayB0aGF0IGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLCBob21lLCBhbmQgcmVtb3RlIGhhdmUgYmVlbiBkZWZpbmVkLCBhbmQgZXhpc3QKLQkJCXZhbGlkYXRlSG9tZVJlZih2YywgZWpiSmFyLCByZWYsIG5hbWVkRWpiKTsKLQkJCXZhbGlkYXRlUmVtb3RlUmVmKHZjLCBlamJKYXIsIHJlZiwgbmFtZWRFamIpOwotCi0JCQkvLyAxNC4zLjEuMQotCQkJLy8gSW5mbyBtc3NnLiAiRUpCIHNwZWMgcmVjb21tZW5kcyB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIG90aGVyIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSBlamIgc3ViY29udGV4dCBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IgotCQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX05hbWUoKSkpIHsKLQkJCQkvLyBJZiBlamIgbmFtZSBpc24ndCBzZXQsIHRoYXQgZXJyb3Igd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBvbmUgb2YgdGhlIHZhbGlkYXRlUmVmIG1ldGhvZHMKLQkJCQkvLyBEb24ndCBkdXBsaWNhdGUgdGhhdCBlZmZvcnQgaGVyZS4KLQkJCQlTdHJpbmcgZWpiTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKCFlamJOYW1lLnN0YXJ0c1dpdGgoImVqYi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjIuMS4yIERlY2xhcmF0aW9uIG9mIGVudmlyb25tZW50IGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBlbnZFbnRyaWVzID0gYmVhbi5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJaWYgKChlbnZFbnRyaWVzID09IG51bGwpIHx8IChlbnZFbnRyaWVzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW52RW50cnkgZW52RW50cnkgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLQkJRHVwbGljYXRlc1RhYmxlIGVudk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQllbnZFbnRyeSA9IChFbnZFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudkVudHJ5ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYkVudHJ5IGlzIG51bGwgaW4gIiArIGJlYW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQllbnZOYW1lcy5hZGQoZW52RW50cnkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuaXNTZXRUeXBlKCkpIHsKLQkJCQkvLyAxNC4yLjEuMjsgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGVzZSB0eXBlczogU3RyaW5nLCBJbnRlZ2VyLCBCb29sZWFuLCBEb3VibGUsIEJ5dGUsIFNob3J0LCBMb25nLCBhbmQgRmxvYXQuCi0JCQkJaW50IHR5cGUgPSBlbnZFbnRyeS5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISgodHlwZSA9PSBFbnZFbnRyeVR5cGUuQk9PTEVBTikgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkJZVEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5ET1VCTEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5GTE9BVCkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLklOVEVHRVIpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5MT05HKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuU0hPUlQpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5TVFJJTkcpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5DSEFSQUNURVIpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW52TmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCUl0ZXJhdG9yIGR1cHMgPSBlbnZOYW1lcy5nZXREdXBsaWNhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkdXBzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZHVwcy5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IG5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBFamJSZWYgaXMgbm90IHZhbGlkLCBhZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JICoKLQkgKiBAcGFybSBFamJSZWYgVGhlIDxlamItcmVmPiBlbGVtZW50IHRoaXMgbWV0aG9kIHZhbGlkYXRlcy4KLQkgKiBAcGFybSBFbnRlcnByaXNlQmVhbiBJZiB0aGUgPGVqYi1yZWY+IHVzZXMgYW4gPGVqYi1saW5rPiwgdGhpcyBpcyB0aGUgZW50ZXJwcmlzZSBiZWFuIGlkZW50aWZpZWQgYnkgdGhhdCBsaW5rLiBJZiB0aGUgbGluayBkb2Vzbid0IGV4aXN0LCBvciBpZiB0aGUgdXNlciBoYXMgaWRlbnRpZmllZCBhIGJlYW4gd2hpY2ggZG9lc24ndCBleGlzdCwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSG9tZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaG9tZU5hbWUgPSByZWYuZ2V0SG9tZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShob21lTmFtZSwgYmVhbik7Ci0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudAotCQkJCS8vIGV4aXN0cy4KLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodHlwZSk7Ci0KLQkJCQlpZiAobmFtZWRFamIgIT0gbnVsbCkgewotCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQKLQkJCQkJLy8gaXMgYXNzaWduYWJsZSB0byB0aGUgaG9tZSB1c2VkIGJ5IHRoZSBuYW1lZCBFSkIgaW4gdGhlCi0JCQkJCS8vIDxlamItbGluaz4gZWxlbWVudC4KLQkJCQkJSmF2YUNsYXNzIGludGZUeXBlID0gbmFtZWRFamIuZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoaW50ZlR5cGUpOwotCi0JCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpZGVudGlmaWVkIGhvbWUvcmVtb3RlIGludGVyZmFjZSBpbiB0aGUgZWpiLXJlZgotCQkJCQkvLyBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvbmUgdXNlZCBieSB0aGUgYmVhbi4KLQkJCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBpbnRmVHlwZSkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIGludGZUeXBlLmdldE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdmFsaWRUeXBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IHsgcmVmLmdldEhvbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBwcm92aWRlcyBhIGxvY2FsIHZpZXcsIGJvdGggcGFydHMgb2YgdGhlIHZpZXcgbXVzdCBleGlzdC4KLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQsIHRoZW4gYWxsIHBhcnRzIG9mIHRoZSBiZWFuIGFyZSByZWZsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbFBhaXJzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gTWVzc2FnZSBkcml2ZW4gYmVhbnMgZG9uJ3QgdXNlIGxvY2FsIG9yIHJlbW90ZSB2aWV3cwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWwgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyBsb2NhbEhvbWUgPSBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQlpZigobG9jYWwgIT0gbnVsbCApICYmIChsb2NhbEhvbWUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKChsb2NhbCA9PSBudWxsKSAmJiAobG9jYWxIb21lICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGVpdGhlciBib3RoIGFyZSBzZXQgb3IgYm90aCBhcmUgdW5zZXQsIGFuZCB0aGF0J3MgZmluZS4KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBwcm92aWRlcyBhIHJlbW90ZSB2aWV3LCBib3RoIHBhcnRzIG9mIHRoZSB2aWV3IG11c3QgZXhpc3QuCi0JICogSWYgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkLCB0aGVuIGFsbCBwYXJ0cyBvZiB0aGUgYmVhbiBhcmUgcmVmbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVtb3RlUGFpcnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBNZXNzYWdlIGRyaXZlbiBiZWFucyBkb24ndCB1c2UgbG9jYWwgb3IgcmVtb3RlIHZpZXdzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgaG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlpZigocmVtb3RlICE9IG51bGwpICYmIChob21lID09IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZigocmVtb3RlID09IG51bGwpICYmIChob21lICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGVpdGhlciBib3RoIGFyZSBzZXQgb3IgYm90aCBhcmUgdW5zZXQsIGFuZCB0aGF0J3MgZmluZS4KLQl9Ci0KLQkvKioKLQkgKiBUaGUgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgbG9jYWwgdmlldywgb3IgYSByZW1vdGUgdmlldywgb3IgYm90aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsT3JSZW1vdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBNZXNzYWdlIGRyaXZlbiBiZWFucyBkb24ndCB1c2UgbG9jYWwgb3IgcmVtb3RlIHZpZXdzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZSA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgcmVtb3RlSG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCi0JCWlmKChsb2NhbEhvbWUgPT0gbnVsbCkgJiYgKHJlbW90ZUhvbWUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKChsb2NhbCA9PSBudWxsKSAmJiAocmVtb3RlID09IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBlcnNpc3RlbmNlVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIEF0dGVtcHQgaW4gdmFpbiB0byB2YWxpZGF0ZSB0aGUgcGVyc2lzdGVuY2UgdHlwZSBlbGVtZW50IGhlcmUsIGJlY2F1c2UgCi0JCS8vIGlmIGl0J3Mgbm90IHNwZWNpZmllZCwgdGhlcmUncyBhIHN5bnRheCBlcnJvciwgYW5kIHRoZSAKLQkJLy8gdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUmVwb3J0ZXIsIElWYWxpZGF0aW9uQ29udGV4dCkgd291bGQgaGF2ZSBiZWVuIAotCQkvLyBjYWxsZWQgaW5zdGVhZC4KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQlFbnRpdHkgZW50aXR5QmVhbiA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIShlbnRpdHlCZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHx8IGVudGl0eUJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBjbGFzcyByZWZsZWN0ZWQgcHJvcGVybHksIHJldHVybiB0cnVlLiBFbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJQ01QQXR0cmlidXRlIGF0dHIgPSBjbXAuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCQkJaWYoKGF0dHIgIT0gbnVsbCkgJiYgIWF0dHIuZUlzUHJveHkoKSAmJiAhaXNWYWxpZFByaW1LZXlGaWVsZChjbXAsYXR0cikpICB7Ci0JCQkJCS8vIDkuNC43LjEKLQkJCQkJLy8gdXNlciBoYXMgc3BlY2lmaWVkIGJvdGggYSBwcmltLWtleS1jbGFzcyBhbmQgYSBwcmlta2V5LWZpZWxkCi0JCQkJCS8vIGNhbid0IHVzZSB0aGUgQ01QQXR0cmlidXRlJ3MgZmllbGQncyBuYW1lLCBiZWNhdXNlIHRoZSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgcmV0dXJuZWQgaXMgbnVsbAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgcHJpbSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSB4bWwsIGFuc3dlciB3aGV0aGVyIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBkZXJpdmVkIHByaW1hcnlLZXlBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkUHJpbUtleUZpZWxkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBDTVBBdHRyaWJ1dGUgYXR0cikgewotCQlyZXR1cm4gY21wLmdldFByaW1hcnlLZXlOYW1lKCkuZXF1YWxzKGF0dHIuZ2V0VHlwZSgpLmdldEphdmFOYW1lKCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIWVudGl0eS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1JlZW50cmFudCgpKSkgewotCQkJCS8vIENhbiBvbmx5IHRlc3QgaWYgdGhlIHJlZW50cmFudCBhdHRyaWJ1dGUgaXMgc2V0LCBiZWNhdXNlIHRoZSBtb2RlbCBkZWZhdWx0cyBpdAotCQkJCS8vIHRvIHNvbWUgYm9vbGVhbiB2YWx1ZSBpZiBpdCBpc24ndCBzZXQuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgcmVmIHdob3NlIGhvbWUgdGhpcyBtZXRob2QgY2hlY2tzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSBFamJSZWYgdXNlcyBhbiA8ZWpiLWxpbms+IGVsZW1lbnQsIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgZWxlbWVudC4gSXQgbWF5IGJlIG51bGwsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbW90ZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZW1vdGVOYW1lID0gcmVmLmdldFJlbW90ZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZSwgaW50ZlR5cGUpKSB7Ci0JCQkJCQlTdHJpbmdbXSBwYXJtcyA9IHsgbmFtZWRFamIuZ2V0TmFtZSgpLCBpbnRmVHlwZS5nZXROYW1lKCl9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIXZhbGlkVHlwZSkgewotCQkJU3RyaW5nW10gcGFybXMgPSB7IHJlZi5nZXRSZW1vdGUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDE1LjIuNS4zIERlY2xhcmF0aW9uIG9mIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgZnJvbSB0aGUgYmVhbidzIGNvZGUKLQkgKiBUaGUgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVjbGFyaW5nIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiAKLQkgKiBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIAotCSAqIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcyByZWZlcmVuY2VzIGluCi0JICogdGhlIGNvZGUgYWxsb3dzIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgb3IgRGVwbG95ZXIgdG8gbGluayB0aGUgbmFtZXMgCi0JICogb2YgdGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIAotCSAqIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZGVjbGFyZSBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlZCBpbiB0aGUgY29kZQotCSAqIHVzaW5nIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0JICogICAgICBEZWNsYXJlIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLW5hbWUgZWxlbWVudC4gCi0JICogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byAKLQkgKiB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkgbWV0aG9kLgotCSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgCi0JICogZGVzY3JpcHRpb24gZWxlbWVudC4gQSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRoZSBuYW1lIGRlZmluZWQgCi0JICogYnkgdGhlIHJvbGUtbmFtZSBlbGVtZW50LCBpcyBzY29wZWQgdG8gdGhlIHNlc3Npb24gb3IgZW50aXR5IGJlYW4gZWxlbWVudCAKLQkgKiB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4gVGhlIGZvbGxvd2luZyAKLQkgKiBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzIAotCSAqIGFyZSBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqICAgIC4uLgotCSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotCSAqICAgICAgIC4uLgotCSAqICAgICAgIDxlbnRpdHk+Ci0JICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0JICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotCSAqICAgICAgICAgIC4uLgotCSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgICAgIFRoaXMgc2VjdXJpdHkgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLQkgKiAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byB1cGRhdGUgZW1wbG95ZWVzJyBzYWxhcmllcy4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50ZXJwcmlzZSBiZWFuIAotCSAqIEFhcmR2YXJrUGF5cm9sbCBtYWtlcyB0aGUgc2VjdXJpdHkgY2hlY2sgdXNpbmcgaXNDYWxsZXJJblJvbGUoInBheXJvbGwiKQotCSAqIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0JICoKLQkgKgotCSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotCSAqIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZGVmaW5lcyB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLCBoZSBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIAotCSAqIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIAotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuIFRoZSBBcHBsaWNhdGlvbiAKLQkgKiBBc3NlbWJsZXIgbGlua3MgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIAotCSAqIHJvbGUtbGluayBlbGVtZW50LiBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2YgCi0JICogb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotCSAqIEEgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgdGhlIHZhbHVlIG9mIHJvbGUtbmFtZSBpcyB0aGUgCi0JICogc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayByZWZlcmVuY2UuCi0JICogVGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhhbXBsZSBzaG93cyBob3cgdG8gbGluayB0aGUgc2VjdXJpdHkgCi0JICogcm9sZSByZWZlcmVuY2UgbmFtZWQgcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICBUaGlzIHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotCSAqICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50LgotCSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0JICogICAgICAgICAgICAgICAgYW55b25lJ3MgcGF5cm9sbCByZWNvcmQuCi0JICoKLQkgKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgcGF5cm9sbC1kZXBhcnRtZW50IHJvbGUuCi0JICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLQkgKiAgICAgICAgICAgICA8cm9sZS1saW5rPnBheXJvbGwtZGVwYXJ0bWVudDwvcm9sZS1saW5rPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eVJvbGVSZWZFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJvbGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIFNlY3VyaXR5Um9sZVJlZiBpbnN0YW5jZS4KLQkJICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JCSAqCi0JCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIFNlY3VyaXR5Um9sZVJlZiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkJICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkJICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkJICovCi0JCWNsYXNzIFJvbGVSZWZXcmFwcGVyIHsKLQkJCXByaXZhdGUgU2VjdXJpdHlSb2xlUmVmIF9yZWYgPSBudWxsOwotCi0JCQlwdWJsaWMgUm9sZVJlZldyYXBwZXIoU2VjdXJpdHlSb2xlUmVmIHJlZikgewotCQkJCV9yZWYgPSByZWY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZVJlZldyYXBwZXIpIHsKLQkJCQkJUm9sZVJlZldyYXBwZXIgb3RoZXIgPSAoUm9sZVJlZldyYXBwZXIpIG87Ci0JCQkJCXJldHVybiBfcmVmLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0Um9sZVJlZigpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFNlY3VyaXR5Um9sZVJlZiBnZXRSb2xlUmVmKCkgewotCQkJCXJldHVybiBfcmVmOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBhcmVTUm9sZXNEZWZpbmVkID0gKChfc2VjdXJpdHlSb2xlcyAhPSBudWxsKSAmJiAoX3NlY3VyaXR5Um9sZXMuc2l6ZSgpID4gMCkpOwotCi0JCUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IGJlYW4uZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQlpZiAoKHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCkgJiYgKHNlY3VyaXR5Um9sZVJlZnMuc2l6ZSgpICE9IDApKSB7Ci0JCQkvLyBDaGVjayB0aGF0IGVhY2ggc2VjdXJpdHkgcm9sZSByZWYgcmVmZXJzIHRvIGEgc2VjdXJpdHkgcm9sZSwKLQkJCS8vIGlmIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLAotCQkJLy8gYW5kIHRoYXQgZWFjaCByZWZlcmVuY2VkIHNlY3VyaXR5IHJvbGUgZXhpc3RzLgotCQkJRHVwbGljYXRlc1RhYmxlIHJvbGVSZWZOYW1lcyA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlUmVmcy5zaXplKCk7IGkrKykgewotCQkJCVNlY3VyaXR5Um9sZVJlZiByZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSBzZWN1cml0eVJvbGVSZWZzLmdldChpKTsKLQotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUgbmFtZSBpcyBzZXQgKDE1LjIuNS4zKQotCQkJCVN0cmluZyByb2xlTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKChyb2xlTmFtZSA9PSBudWxsKSB8fCAocm9sZU5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyb2xlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBiZWFuTmFtZSA9IChiZWFuLmdldE5hbWUoKSA9PSBudWxsKSA/ICIiIDogYmVhbi5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgbmV3IFN0cmluZ1tdIHsgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBCdWlsZCB1cCB0aGUgbGlzdCBvZiBuYW1lcywgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJcm9sZVJlZk5hbWVzLmFkZChuZXcgUm9sZVJlZldyYXBwZXIocmVmKSk7Ci0JCQkJfQotCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZSBsaW5rIGlzIHNldCAoMTUuMy4zKQotCQkJCVN0cmluZyByb2xlTGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JCQkJYm9vbGVhbiBpc0xpbmtEZWZpbmVkID0gKChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCkpKSAmJiAocm9sZUxpbmsgIT0gbnVsbCkgJiYgKCFyb2xlTGluay5lcXVhbHMoIiIpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmICgoYXJlU1JvbGVzRGVmaW5lZCkgJiYgKCFpc0xpbmtEZWZpbmVkKSkgewotCQkJCQkvLyBtdXN0IGhhdmUgcm9sZSBsaW5rIGRlZmluZWQgKDE1LjMuMykKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCghYXJlU1JvbGVzRGVmaW5lZCkgJiYgKGlzTGlua0RlZmluZWQpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGhhdmUgcm9sZSBsaW5rIGRlZmluZWQgKDE1LjIuNS4zKQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXJlU1JvbGVzRGVmaW5lZCAmJiBpc0xpbmtEZWZpbmVkKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHJvbGUgbGlzdGVkIGluIHRoZSBsaW5rIGV4aXN0cy4gKDE1LjMuMykKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfc2VjdXJpdHlSb2xlcy5pdGVyYXRvcigpOwotCQkJCQlib29sZWFuIHJvbGVFeGlzdHMgPSBmYWxzZTsKLQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTZWN1cml0eVJvbGUgcm9sZSA9IChTZWN1cml0eVJvbGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhyb2xlTGluaykpIHsKLQkJCQkJCQlyb2xlRXhpc3RzID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJvbGVFeGlzdHMpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIG5ldyBTdHJpbmdbXSB7IHJvbGVOYW1lIH0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSByb2xlLW5hbWVzLiAoMTUuMy4xKQotCQkJaWYgKHJvbGVSZWZOYW1lcy5jb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJCUxpc3QgZHVwbGljYXRlcyA9IHJvbGVSZWZOYW1lcy5nZXREdXBsaWNhdGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgKChSb2xlUmVmV3JhcHBlcikgaXRlcmF0b3IubmV4dCgpKS5nZXRSb2xlUmVmKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCXJvbGVSZWZOYW1lcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogNi41LjMgVGhlIG9wdGlvbmFsIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCi0JICouLi4KLQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCSAqIGltcGxlbWVudCB0aGUgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkgKiBzeW5jaHJvbml6YXRpb24gY2FsbCBiYWNrcyBiZWNhdXNlIHRoZSBiZWFuIGlzIGluIGNvbnRyb2wgb2YgdGhlIGNvbW1pdCB0aGUgYmVhbiAKLQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlc3Npb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCVNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBiZWFuOwotCi0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWJvb2xlYW4gaXNWYWxpZFNlc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFNlc3Npb25UeXBlRWxlbWVudChzZXNzaW9uKTsKLQkJCWlmICghaXNWYWxpZFNlc3MpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIHNlc3Npb24sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KHNlc3Npb25CZWFuKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJX3NlY3VyaXR5Um9sZXMgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJX3NlY3VyaXR5Um9sZXMgPSBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSBFSkIgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRWpiTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVudGVycHJpc2VCZWFuIF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgRWpiTmFtZVdyYXBwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gb3RoZXIgPSAoRW50ZXJwcmlzZUJlYW4pIG87Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotCi0JY2xhc3MgQVNOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEFTTmFtZVdyYXBwZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFuKSB7Ci0JCQlfYmVhbiA9IGJlYW47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb3RoZXIgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbzsKLQkJCQlyZXR1cm4gX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuZXF1YWxzKG90aGVyLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkcml2ZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVBY3RpdmF0aW9uQ29uZmlndXJhdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1lc3NhZ2VEcml2ZW4gYmVhbikgewotCQlBY3RpdmF0aW9uQ29uZmlnIGNvbmZpZyAgPSBiZWFuLmdldEFjdGl2YXRpb25Db25maWcoKTsKLQkJaWYoY29uZmlnICE9IG51bGwpIHsKLQkJCUxpc3QgY29uZmlnUHJvcGVydGllcyA9IGNvbmZpZy5nZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCQlpZihjb25maWdQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWNvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSGFzaFNldCBuYW1lUHJvcGVydHlTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBjb25maWdQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBwcm9wZXJ0eSA9IChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpY29uZmlnUHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gZG9lc05vdEV4aXN0cyA9IG5hbWVQcm9wZXJ0eVNldC5hZGQocHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJCQkJaWYoIWRvZXNOb3RFeGlzdHMpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4NiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgYmVhbiwgYmVhbi5nZXRFamJKYXIoKSxuZXcgU3RyaW5nW10ge3Byb3BlcnR5LmdldE5hbWUoKSxiZWFuLmdldE5hbWUoKX0sdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJaWYoaXNKTVNNREIoYmVhbikpIHsKLQkJCQkJdmFsaWRhdGlvbkFja01vZGVBY3RpdmF0aW9uQ29uZmlnKHZjLCBiZWFuLCBwcm9wZXJ0eSk7Ci0JCQkJCXZhbGlkYXRlRGVzdGluYXRpb25UeXBlQWN0aXZhdGlvbkNvbmZpZyh2YywgYmVhbiwgcHJvcGVydHkpOwotCQkJCQl2YWxpZGF0ZUR1cmFiaWxpdHlBY3RpdmF0aW9uQ29uZmlnKHZjLCBiZWFuLCBjb25maWdQcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7Ci0JCQkJICAgfQotCQkJCX0KLQkJCX0KLQkgIH0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSk1TTURCKE1lc3NhZ2VEcml2ZW4gYmVhbikgewotCQlyZXR1cm4gYmVhbi5nZXRNZXNzYWdpbmdUeXBlKCkgPT0gbnVsbCB8fCBiZWFuLmdldE1lc3NhZ2luZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEpNU19NRVNTQUdJTkdfVFlQRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uQWNrTW9kZUFjdGl2YXRpb25Db25maWcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXNzYWdlRHJpdmVuIGJlYW4sIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQlpZihwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuYWNrTW9kZUtleSkgJiYgIUFycmF5cy5hc0xpc3QoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5hY2tNb2RlVmFsdWVzKS5jb250YWlucyhwcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODg3LCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBiZWFuLCBiZWFuLmdldEVqYkphcigpLG5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0TmFtZSgpLHByb3BlcnR5LmdldFZhbHVlKCksYmVhbi5nZXROYW1lKCl9LHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIHByb3BlcnR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGVzdGluYXRpb25UeXBlQWN0aXZhdGlvbkNvbmZpZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1lc3NhZ2VEcml2ZW4gYmVhbiwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHByb3BlcnR5KSB7Ci0JCWlmKHByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5kZXN0aW5hdGlvblR5cGVLZXkpICYmICFBcnJheXMuYXNMaXN0KE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuZGVzdGluYXRpb25UeXBlVmFsdWVzKS5jb250YWlucyhwcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODg3LCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBiZWFuLCBiZWFuLmdldEVqYkphcigpLG5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0TmFtZSgpLHByb3BlcnR5LmdldFZhbHVlKCksYmVhbi5nZXROYW1lKCl9LHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQlKYXZhQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uID0gYmVhbi5nZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJaWYobWVzc2FnZURlc3RpbmF0aW9uICE9IG51bGwgJiYgbWVzc2FnZURlc3RpbmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSAhPSBudWxsICYmIChwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuZGVzdGluYXRpb25UeXBlS2V5KSAmJiAhKG1lc3NhZ2VEZXN0aW5hdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHByb3BlcnR5LmdldFZhbHVlKCkpKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg5MCwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgYmVhbiwgYmVhbi5nZXRFamJKYXIoKSxuZXcgU3RyaW5nW10ge21lc3NhZ2VEZXN0aW5hdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkscHJvcGVydHkuZ2V0VmFsdWUoKSxiZWFuLmdldE5hbWUoKX0sdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNvbmZpZ1Byb3BlcnRpZXMKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEdXJhYmlsaXR5QWN0aXZhdGlvbkNvbmZpZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1lc3NhZ2VEcml2ZW4gYmVhbiwgTGlzdCBjb25maWdQcm9wZXJ0aWVzLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJaWYocHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscyhNREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmR1cmFiaWxpdHlLZXkpICYmICFBcnJheXMuYXNMaXN0KE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuZHVyYWJpbGl0eVZhbHVlKS5jb250YWlucyhwcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgewotCQkgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4NywgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgYmVhbiwgYmVhbi5nZXRFamJKYXIoKSxuZXcgU3RyaW5nW10ge3Byb3BlcnR5LmdldE5hbWUoKSxwcm9wZXJ0eS5nZXRWYWx1ZSgpLGJlYW4uZ2V0TmFtZSgpfSx0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0gICAgICB9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4MTQyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2xhc3NWUnVsZSBleHRlbmRzIElWYWxpZGF0aW9uUnVsZSB7Ci0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQkvLyBCZWNhdXNlIGNhbGxpbmcgSmF2YUNsYXNzOjpnZXRNZXRob2RzRXh0ZW5kZWQoKSBpcyBhbiBleHBlbnNpdmUgY2FsbCwgbmVlZCB0byBjYWxsIGl0IG9uY2UKLQkvLyBwZXIgY2xhc3MgaW5zdGVhZCBvZiBtdWx0aXBsZSB0aW1lcyBwZXIgY2xhc3MuIEhvd2V2ZXIsIGVhY2ggY2xhc3MgaW4gdGhlIGJlYW4gbmVlZHMgZGlmZmVyZW50Ci0JLy8gbGlzdHM6Ci0JLy8gICAxLiBLZXkgY2xhc3MgbmVlZHMgbm8gbGlzdHMuCi0JLy8gICAyLiBIb21lIGludGVyZmFjZSAocmVtb3RlICYgbG9jYWwpIG5lZWRzIHRoZSBiZWFuIGNsYXNzJyBnZXRNZXRob2RzRXh0ZW5kZWQgbGlzdC4KLQkvLyAgIDMuIENvbXBvbmVudCBpbnRlcmZhY2UgKHJlbW90ZSAmIGxvY2FsKSBuZWVkcyB0aGUgYmVhbiBjbGFzcycgZ2V0TWV0aG9kc0V4dGVuZGVkIGxpc3QuCi0JLy8gICA0LiBCZWFuIGNsYXNzIG5lZWRzIHRoZSByZW1vdGUgaG9tZSwgbG9jYWwgaG9tZSwgcmVtb3RlIGNvbXBvbmVudCwgYW5kIGxvY2FsIGNvbXBvbmVudCdzIGdldE1ldGhvZHNFeHRlbmRlZCBsaXN0LgotCS8vIEdpdmVuIHRoYXQgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiwgYWRkIGEgTGlzdFtdIGFzIGEgZmluYWwgcGFyYW1ldGVyLCBhbmQgZWFjaAotCS8vIGltcGxlbWVudGF0aW9uIGNhbiBmaWd1cmUgb3V0IHdoYXQgdGhlIExpc3RbXSBuZWVkcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCwgaWYgYW55dGhpbmcuIChpLmUuLCB0aGUKLQkvLyBrZXkgY2xhc3Mgd2lsbCBwcm9iYWJseSBwYXNzIGluIGEgbnVsbCBpbnN0ZWFkIG9mIGFuIGVtcHR5IExpc3QuKQotCS8vIAotCS8vIFNpbWlsYXIgcmVhc29uaW5nIGZvciB0aGUgTGlzdFtdIG9mIGdldEZpZWxkc0V4dGVuZGVkKCkuCi0JcHVibGljIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JcHVibGljIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JQ29tcG9uZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lDb21wb25lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDBmYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lDb21wb25lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFR5cGUgZXh0ZW5kcyBJRUpCSW50ZXJmYWNlVHlwZSB7Ci0JcHVibGljIEphdmFDbGFzcyBnZXRIb21lSW50ZXJmYWNlKEVudGVycHJpc2VCZWFuIGJlYW4pOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJJbnRlcmZhY2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQkludGVyZmFjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjMmJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQkludGVyZmFjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0gCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCSW50ZXJmYWNlVHlwZSBleHRlbmRzIElFSkJUeXBlIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkludGVyZmFjZU1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVBcHBsaWNhdGlvbkV4Y2VwdGlvblJ1bGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cywgYm9vbGVhbiBjaGVja1JldHVyblR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JcHVibGljIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQlwdWJsaWMgYm9vbGVhbiBmb2xsb3dSTUlfSUlPUEluaGVyaXRhbmNlUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkZDQ5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlR5cGUgZXh0ZW5kcyBJVHlwZUNvbnN0YW50cywgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGludCBSRU1PVEUgPSAweDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgTE9DQUwgPSAweDI7Ci0JcHVibGljIHN0YXRpYyBpbnQgTkVJVEhFUiA9IDB4NDsKLQkKLQlwdWJsaWMgbG9uZ1tdIGdldFN1cGVydHlwZXMoKTsKLQlwdWJsaWMgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpOwotCQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSBtZXRob2QgbmFtZXMgd2hpY2ggdGhpcwotCSAqIHJ1bGUgdmFsaWRhdGVzLCB3aGF0IHR5cGUgc2hvdWxkIHRoZSBtZXRob2QgYmUgY29uc2lkZXJlZD8gKGUuZy4gaG9tZSBvciBidXNpbmVzcykuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKTsKLQlwdWJsaWMgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKTsKLQotCXB1YmxpYyBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCk7Ci0JcHVibGljIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKTsKLQkKLQlwdWJsaWMgaW50IGlzUmVtb3RlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2Q3ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIElWYWxpZGF0aW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkKLQkKLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQlwdWJsaWMgSVZhbGlkYXRpb25Db250ZXh0IGdldEhlbHBlcigpOwotCXB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKTsKLQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZSgpOyAvLyByZXR1cm5zIGFuIGVtcHR5IElNZXNzYWdlIHdoaWNoIGNhbiBiZSByZXVzZWQKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpOwotCQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JCi0JcHVibGljIExvZ0VudHJ5IGdldExvZ0VudHJ5KCk7Ci0JCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSk7Ci0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpOwotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKCk7Ci0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCk7Ci0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwSWRlbnRpZmllcik7Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCk7Ci0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zKTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldCk7Ci0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0KTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSk7Ci0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKTsKLQkKLQlwdWJsaWMgdm9pZCBzdWJ0YXNrKFN0cmluZyBtZXNzYWdlSWQpOwotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjg4ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlZhbGlkYXRvckNvbnN0YW50cyB7Ci0JLy8gTmFtZSBvZiAucHJvcGVydGllcyBmaWxlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZWpidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIE5hbWUgb2YgbG9nZ2VyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HTkFNRSA9ICJFSkJWYWxpZGF0b3JMb2ciOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gU3RhdHVzIGNvbnN0YW50cyB3aGljaCBkbyBub3QgcmVxdWlyZSBhIG1lc3NhZ2UgcHJlZml4IChlLmcuIEFCQ0QwMDAwRSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfVkFMSURBVElORyA9ICJTVEFUVVNfVkFMSURBVElORyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1BSSU1BUllfS0VZID0gIjxwcmltYXJ5LWtleT4iOyAvLyB3aGVuIGEga2V5IGNsYXNzIG5hbWUgbmVlZHMgdG8gYmUgZGlzcGxheWVkLCBidXQgdGhhdCBjbGFzcyBpcyBudWxsLCBkaXNwbGF5IHRoaXMgaW5zdGVhZCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9CRUFOX0NMQVNTID0gIjxlamItY2xhc3M+IjsgLy8gd2hlbiBhIGJlYW4gY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0xPQ0FMX0hPTUUgPSAiPGxvY2FsLWhvbWU+IjsgLy8gd2hlbiBhIGxvY2FsLWhvbWUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0xPQ0FMID0gIjxsb2NhbD4iOyAvLyB3aGVuIGEgbG9jYWwgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0hPTUUgPSAiPGhvbWU+IjsgLy8gd2hlbiBhIGhvbWUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1JFTU9URSA9ICI8cmVtb3RlPiI7IC8vIHdoZW4gYSByZW1vdGUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBXZSB1c2UgYSBzdHJpbmcgaGVyZSBiZWNhdXNlIHRoaXMgaW50ZXJmYWNlIGlzIHNoaXBwZWQgd2l0aCBXQVMsIGJ1dAotCS8vIEoyRUVDb3JlUGx1Z2luIGlzIG5vdC4gVGhlcmVmb3JlIGhhdmluZyB0aGUgSjJFRUNvcmVQbHVnaW4uUExVR0lOX0lEIAotCS8vIGRlcGVuZGVuY3kgd29ya3MgZmluZSBpbiB0aGUgdG9vbGluZyBlbnYsIGJ1dCB3aWxsIHJlc3VsdCBpbiBOb0NsYXNzRGVmRm91bmQgaW4gV0FTCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfQ09SRV9QTFVHSU4gPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZSI7IC8vICROT04tTkxTLTEkIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGVkYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaG9sZHMgdGhlIG1lc3NhZ2UgY29uc3RhbnRzIHRoYXQgYXJlIGNvbW1vbiBhY3Jvc3MKLSAqIHNwZWNpZmljYXRpb25zLiAoZS5nLiBpbnRlcm5hbCBlcnJvciBtZXNzYWdlcywgY2hlY2tzIHRoYXQgYXJlIHRoZSBzYW1lLikKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JLy8gQ29uc3RhbnRzIHVzZWQgaW4gbWVzc2FnZSBpZHMKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0JBU0UgPSAiLmkiOyAvLyBTdHJpbmcgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgYmFzZSB0eXBlLCBub3QgdGhlIEphdmFDbGFzcyBiZWluZyB2YWxpZGF0ZWQuIChJbmhlcml0ZWQgbWV0aG9kLikgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT05fVEhJUyA9ICIubSI7IC8vIFN0cmluZyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIEphdmFDbGFzcyBiZWluZyB2YWxpZGF0ZWQuIChNZXRob2QgaW1wbCBvbiBKYXZhQ2xhc3MgaXRzZWxmLikgLy8kTk9OLU5MUy0xJAotCi0JLy8gSW50ZXJuYWwgZXJyb3JzIGFuZCBzdWNoCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA0MSA9ICJDSEtKMjA0MSI7IC8vIHVubmFtZWQgcGFja2FnZSAoSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uKSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzMyA9ICJDSEtKMjQzMyI7IC8vIGNhbm5vdCByZWZsZWN0IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU2ID0gIkNIS0oyNDU2IjsgLy8gU2hvdWxkIHRocm93IFggb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBkZXBsb3kgY29kZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTIgPSAiQ0hLSjI4NTIiOyAvLyBUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgZWpiLWphci54bWwgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI5MDAgPSAiQ0hLSjI5MDAiOyAvLyBJbnRlcm5hbCBlcnJvciB3aGlsZSBydW5uaW5nIEVKQiB2YWxpZGF0b3IgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI5MDUgPSAiQ0hLSjI5MDUiOyAvLyBFSkIgVmFsaWRhdG9yIGNvdWxkIG5vdCBydW4gYmVjYXVzZSBlamItamFyLnhtbCBjb3VsZCBub3QgYmUgbG9hZGVkLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjkwNyA9ICJDSEtKMjkwNyI7IC8vIFR5cGUgWCwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLiAvLyROT04tTkxTLTEkCi0KLQkvLyBTcGVjaWZpY2F0aW9uIHJ1bGVzCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwM0UgPSAiQ0hLSjIwMDNFIjsgLy8gaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChjYW4gYmUgZXJyb3Igb3IgaW5mbyBkZXBlbmRpbmcgb24gY29udGV4dCkgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDNJID0gIkNIS0oyMDAzSSI7IC8vIGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiAoY2FuIGJlIGVycm9yIG9yIGluZm8gZGVwZW5kaW5nIG9uIGNvbnRleHQpIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTQgPSAiQ0hLSjIwMTQiOyAvLyBjbGFzcyBtdXN0IGJlLCBvciBtdXN0IG5vdCBiZSwgYWJzdHJhY3QgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTUgPSAiQ0hLSjIwMTUiOyAvLyBjbGFzcyBtdXN0IGJlLCBvciBtdXN0IG5vdCBiZSwgZmluYWwgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTcgPSAiQ0hLSjIwMTciOyAvLyBjbGFzcy9pbnRlcmZhY2UgbXVzdCBleHRlbmQvaW1wbGVtZW50IFggLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTkgPSAiQ0hLSjIwMTkiOyAvLyBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUvYSBsZWdhbCB2YWx1ZSB0eXBlIGluIFJNSS1JSU9QIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjIgPSAiQ0hLSjIwMjIiOyAvLyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyMyA9ICJDSEtKMjAyMyI7IC8vIGEgbWF0Y2hpbmcgbWV0aG9kIChmb3IgdGhpcyBjb21wb25lbnQgbWV0aG9kKSBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDAgPSAiQ0hLSjIwNDAiOyAvLyAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTAzID0gIkNIS0oyMTAzIjsgLy8gSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgYmVhbiBjbGFzcyBtdXN0IGluaGVyaXQgWC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDQgPSAiQ0hLSjIxMDQiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBob21lIGNsYXNzIG11c3Qgbm90IGluaGVyaXQgWC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDUgPSAiQ0hLSjIxMDUiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIFguIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTA2ID0gIkNIS0oyMTA2IjsgLy8gSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgYmVhbiBtdXN0IHVzZSBYIGFzIGl0cyBwcmltYXJ5IGtleS4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwNSA9ICJDSEtKMjIwNSI7IC8vIHByaW1hcnkga2V5IGZpZWxkIFggbXVzdCBiZSBwdWJsaWMgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDYgPSAiQ0hLSjIyMDYiOyAvLyBwcmltYXJ5IGtleSBmaWVsZCBYIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoYW5kIGluIEVKQiAxLjEsIGFsc28gYSBmaWVsZCBvZiB0aGUgYmVhbiBjbGFzcykgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMiA9ICJDSEtKMjQwMiI7IC8vIFRoZSBjcmVhdGUgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSByZW1vdGUgaW50ZXJmYWNlIHR5cGUgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDMgPSAiQ0hLSjI0MDMiOyAvLyBUaGUgZmluZGVyIG1ldGhvZCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwNyA9ICJDSEtKMjQwNyI7IC8vIFRoZSBlamJGaW5kIG1ldGhvZCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDExID0gIkNIS0oyNDExIjsgLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAxID0gIkNIS0oyODAxIjsgLy8gbWlzc2luZyA8ZWpiLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAyX05BTUVEID0gIkNIS0oyODAyLm5hbWVkIjsvLyA8ZWpiLWNsYXNzPiBjYW5ub3QgYmUgcmVmbGVjdGVkIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAyX1VOTkFNRUQgPSAiQ0hLSjI4MDIudW5uYW1lZCI7Ly8gdW5rbm93biA8ZWpiLWNsYXNzPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwM19OQU1FRCA9ICJDSEtKMjgwMy5uYW1lZCI7Ly8gPGhvbWU+IGNhbm5vdCBiZSByZWZsZWN0ZWQgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDNfVU5OQU1FRCA9ICJDSEtKMjgwMy51bm5hbWVkIjsvLyB1bmtub3duIDxob21lPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNF9OQU1FRCA9ICJDSEtKMjgwNC5uYW1lZCI7Ly8gPHJlbW90ZT4gY2Fubm90IGJlIHJlZmxlY3RlZCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNF9VTk5BTUVEID0gIkNIS0oyODA0LnVubmFtZWQiOy8vIHVua25vd24gPHJlbW90ZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDYgPSAiQ0hLSjI4MDYiOy8vIDxyZWVudHJhbnQ+IG11c3QgYmUgZWl0aGVyICJUcnVlIiBvciAiRmFsc2UiIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA3ID0gIkNIS0oyODA3IjsgLy8gPHNlc3Npb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwOCA9ICJDSEtKMjgwOCI7IC8vIDx0cmFuc2FjdGlvbi10eXBlPiBtdXN0IGJlIGVpdGhlciAiQmVhbiIgb3IgIkNvbnRhaW5lciIgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDkgPSAiQ0hLSjI4MDkiOyAvLyA8cGVyc2lzdGVuY2UtdHlwZT4gbXVzdCBiZSBlaXRoZXIgIkJlYW4iIG9yICJDb250YWluZXIiIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTBfTkFNRUQgPSAiQ0hLSjI4MTAubmFtZWQiOy8vIDxwcmltLWtleS1jbGFzcz4gY2Fubm90IGJlIHJlZmxlY3RlZCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMF9VTk5BTUVEID0gIkNIS0oyODEwLnVubmFtZWQiOy8vIHVua25vd24gPHByaW0ta2V5LWNsYXNzPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMV9OQU1FRCA9ICJDSEtKMjgxMS5uYW1lZCI7Ly8gPGZpZWxkLW5hbWU+IG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTFfVU5OQU1FRCA9ICJDSEtKMjgxMS51bm5hbWVkIjsvLyA8ZmllbGQtbmFtZT4gbXVzdCBleGlzdCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMiA9ICJDSEtKMjgxMiI7IC8vIEJlYW4gY2xhc3MgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTQgPSAiQ0hLSjI4MTQiOyAvLyA8bWV0aG9kPidzIDxlamItbmFtZT4gc2hvdWxkIHNwZWNpZnkgYSBrbm93biBlbnRlcnByaXNlIGJlYW4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyMCA9ICJDSEtKMjgyMCI7IC8vIDxzZWN1cml0eS1yb2xlLXJlZj4gbXVzdCBiZSB1bmlxdWUuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIyID0gIkNIS0oyODIyIjsgLy8gPHNlY3VyaXR5LXJvbGUtcmVmPiBtdXN0IGRlZmluZSBhIDxyb2xlLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIzID0gIkNIS0oyODIzIjsgLy8gPHNlY3VyaXR5LXJvbGUtcmVmPiBzaG91bGQgZGVmaW5lIGEgPHJvbGUtbGluaz4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjQgPSAiQ0hLSjI4MjQiOyAvLyA8c2VjdXJpdHktcm9sZS1yZWY+IG11c3QgaWRlbnRpZnkgYSBrbm93biA8c2VjdXJpdHktcm9sZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjUgPSAiQ0hLSjI4MjUiOyAvLyA8c2VjdXJpdHktcm9sZT4gc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjYgPSAiQ0hLSjI4MjYiOyAvLyA8c2VjdXJpdHktcm9sZT4gbmFtZSBzaG91bGQgYmUgdW5pcXVlLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyNyA9ICJDSEtKMjgyNyI7IC8vIENhbm5vdCB1c2UgYSA8cm9sZS1saW5rPiB3aXRob3V0IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50cy4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjggPSAiQ0hLSjI4MjgiOyAvLyBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IGVsZW1lbnQgd2l0aG91dCBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjkgPSAiQ0hLSjI4MjkiOyAvLyBFdmVyeSBmaWVsZCBpbiB0aGUgcHJpbWFyeSBrZXkgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzMCA9ICJDSEtKMjgzMCI7IC8vIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzMSA9ICJDSEtKMjgzMSI7IC8vIFggbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXAtZmllbGQ+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMyID0gIkNIS0oyODMyIjsgLy8gPGVqYi1yZWY+J3MgaG9tZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMzID0gIkNIS0oyODMzIjsgLy8gPGVqYi1yZWY+J3MgcmVtb3RlIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzQgPSAiQ0hLSjI4MzQiOyAvLyA8ZWpiLXJlZj4ncyBiZWFuIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzUgPSAiQ0hLSjI4MzUiOyAvLyBCZWFuIFggaXMgYSBZIHR5cGUuIFVwZGF0ZSB0aGUgPGVqYi1yZWYtdHlwZT4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzYgPSAiQ0hLSjI4MzYiOyAvLyBCZWFuIFggdXNlcyBob21lIFkuIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODM3ID0gIkNIS0oyODM3IjsgLy8gQmVhbiBYIHVzZXMgcmVtb3RlIFkuIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODM4ID0gIkNIS0oyODM4IjsgLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzkgPSAiQ0hLSjI4MzkiOyAvLyA8ZW52LWVudHJ5LW5hbWU+IG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDAgPSAiQ0hLSjI4NDAiOyAvLyA8ZW52LWVudHJ5LXR5cGU+IG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQxID0gIkNIS0oyODQxIjsgLy8gVGhlIFggbmFtZSwgaW4gdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIG11c3QgYmUgdW5pcXVlIGluIHRoZSBiZWFuLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0MiA9ICJDSEtKMjg0MiI7IC8vIDxtZXRob2QtcGFyYW1zPiBpcyBpZ25vcmVkIHdoZW4gPG1ldGhvZC1uYW1lPiBpcyAiKiIgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDMgPSAiQ0hLSjI4NDMiOyAvLyA8bWV0aG9kPiBYIG11c3QgZXhpc3Qgb24gYmVhbiBZLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NCA9ICJDSEtKMjg0NCI7IC8vIEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBzaG91bGQgZXhpc3QgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NSA9ICJDSEtKMjg0NSI7IC8vIEF0IGxlYXN0IG9uZSA8cm9sZS1uYW1lPiBzaG91bGQgZXhpc3QgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NiA9ICJDSEtKMjg0NiI7IC8vIE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxtZXRob2QtcGVybWlzc2lvbj4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDcgPSAiQ0hLSjI4NDciOyAvLyBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0OSA9ICJDSEtKMjg0OSI7IC8vIENhbm5vdCB2YWxpZGF0ZSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb2YgWCBiZWNhdXNlIFkgY2Fubm90IGJlIHJlZmxlY3RlZC4gLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzUgPSAiQ0hLSjI4NzUiOyAvLyBFSkIgQ2xpZW50IEpBUiBtdXN0IGV4aXN0IGFuZCBiZSBpbiB0aGUgc2FtZSBFQVIgYXMgdGhpcyBFSkIgSkFSLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODUwID0gIkNIS0oyODUwIjsgLy8gQ2Fubm90IHZhbGlkYXRlIDxtZXRob2Q+IGJlY2F1c2UgWCwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODk1ID0gIkNIS0oyODk1IjsgLy8gZHVwbGljYXRlIDxlamItbmFtZT4gLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lGaWVsZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRmllbGRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmY3MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lGaWVsZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIElGaWVsZFR5cGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01FU1NBR0VfUFJFRklYID0gIiI7IC8vIEZvciB0aGUgdHdvIGdldE1lc3NhZ2VJZF9YIG1ldGhvZHMsIGlmIHRoZSBtZXRob2QgbmV2ZXIgcmVxdWlyZXMgdGhhdCBwYXJ0aWN1bGFyIG1lc3NhZ2UsIHJldHVybiB0aGlzIG1lc3NhZ2UgcHJlZml4IGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBsb25nIGdldElkKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUhvbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUhvbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU5NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lIb21lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIb21lVHlwZSBleHRlbmRzIElFSkJJbnRlcmZhY2VUeXBlIHsKLQlwdWJsaWMgSmF2YUNsYXNzIGdldENvbXBvbmVudEludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTG9jYWxUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUxvY2FsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEwYTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTG9jYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhbFR5cGUgewotCXB1YmxpYyBpbnQgSVNfUkVNT1RFID0gSUVKQlR5cGUuTE9DQUw7Ci0JcHVibGljIGludCBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFkgPSBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORzsgLy8gSWYgYSBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uIHdoZW4gaXQgc2hvdWxkbid0LCB0aGF0J3MgYSBkZXByZWNhdGVkIHVzZSwgaGVuY2UgYSB3YXJuaW5nLgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODIzZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBob2xkcyB0aGUgbWVzc2FnZSBjb25zdGFudHMgdGhhdCBhcmUgc3BlY2lmaWMKLSAqIHRvIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyBleHRlbmRzIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzIHsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUMgPSAiLmVqYjExIjsgLy8gRUpCIHNwZWNpZmljYXRpb24gYmVpbmcgdmFsaWRhdGVkIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDAxID0gIkNIS0oyMDAxIjsgLy8gVGhlIGtleSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgWCBtZXRob2QuICAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwMiA9ICJDSEtKMjAwMiI7IC8vIFRoaXMgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDQgPSAiQ0hLSjIwMDQiOyAvLyBUaGUgYmVhbiBjbGFzcyBzaG91bGQgbm90IGltcGxlbWVudCB0aGUgZWpiRmluZCBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA1ID0gIkNIS0oyMDA1IjsgLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGVpdGhlciBhIGNyZWF0ZSBtZXRob2Qgb3IgYSBmaW5kIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDYgPSAiQ0hLSjIwMDYiOyAvLyBUaGUgYmVhbiBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA3ID0gIkNIS0oyMDA3IjsgLy8gVGhlIGJlYW4gY2xhc3Mgc2hvdWxkIG5vdCBkZWNsYXJlIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDggPSAiQ0hLSjIwMDgiOyAvLyBUaGUgYmVhbiBjbGFzcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVqYkNyZWF0ZSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA5ID0gIkNIS0oyMDA5IjsgLy8gVGhlIGJlYW4gY2xhc3MgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTAgPSAiQ0hLSjIwMTAiOyAvLyBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjcmVhdGUgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxMSA9ICJDSEtKMjAxMSI7IC8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxMiA9ICJDSEtKMjAxMiI7IC8vIFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTMgPSAiQ0hLSjIwMTMiOyAvLyBUaGUgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyMCA9ICJDSEtKMjAyMCI7IC8vIFRoZSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDIxID0gIkNIS0oyMDIxIjsgLy8gVGhlIGtleSBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyNCA9ICJDSEtKMjAyNCI7IC8vIFggbXVzdCBub3QgZXhpc3QuIE9ubHkgY3JlYXRlKCkgbWF5IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyNSA9ICJDSEtKMjAyNSI7IC8vIFggbXVzdCBub3QgZXhpc3QuIE9ubHkgZWpiQ3JlYXRlKCkgbWF5IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyNiA9ICJDSEtKMjAyNiI7IC8vIFRoZSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDI4ID0gIkNIS0oyMDI4IjsgLy8gVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjkgPSAiQ0hLSjIwMjkiOyAvLyBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBpcyBkZWZpbmVkIG9uIHRoZSBob21lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzMCA9ICJDSEtKMjAzMCI7IC8vIFRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhIG1hdGNoaW5nIGVqYkZpbmQgbWV0aG9kIGluIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzMiA9ICJDSEtKMjAzMiI7IC8vIEJlYW4gY2xhc3MgWCBtdXN0IGRlY2xhcmUgYXQgbGVhc3Qgb25lIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzMyA9ICJDSEtKMjAzMyI7IC8vIFRoZSBzZXRFbnRpdHlDb250ZXh0IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzNCA9ICJDSEtKMjAzNCI7IC8vIFRoZSB1bnNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM1ID0gIkNIS0oyMDM1IjsgLy8gVGhlIGVqYkFjdGl2YXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzNiA9ICJDSEtKMjAzNiI7IC8vIFRoZSBlamJQYXNzaXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM3ID0gIkNIS0oyMDM3IjsgLy8gVGhlIGVqYlJlbW92ZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzggPSAiQ0hLSjIwMzgiOyAvLyBUaGUgZWpiTG9hZCBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzkgPSAiQ0hLSjIwMzkiOyAvLyBUaGUgZWpiU3RvcmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDAgPSAiQ0hLSjIxMDAiOyAvLyBCb3RoIGVuZHMgb2YgdGhlIHJvbGUgbXVzdCB1c2UgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTAxID0gIkNIS0oyMTAxIjsgLy8gQm90aCBlbmRzIG9mIHRoZSByb2xlIG11c3QgdXNlIHRoZSBzYW1lIHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTAyID0gIkNIS0oyMTAyIjsgLy8gRWl0aGVyIGEgZmluZGVyIGRlc2NyaXB0b3IsIG9yIGEgbWF0Y2hpbmcgY3VzdG9tIGZpbmRlciBtZXRob2QsIG11c3QgYmUgZGVmaW5lZC4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwMCA9ICJDSEtKMjIwMCI7IC8vIFRoZSBzdGF0aWMgZmllbGQgbXVzdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDEgPSAiQ0hLSjIyMDEiOyAvLyBUaGUgZmllbGQgbXVzdCBub3QgYmUgdHJhbnNpZW50LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwMiA9ICJDSEtKMjIwMiI7IC8vIFRoZSBmaWVsZCB0eXBlIGlzIGludmFsaWQgZm9yIGEgPGNtcC1maWVsZD4uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjAzID0gIkNIS0oyMjAzIjsgLy8gVGhlIGZpZWxkIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwNyA9ICJDSEtKMjIwNyI7IC8vIEZpZWxkIFggb24gYmVhbiBZIG11c3QgYmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgPHByaW1rZXktZmllbGQ+LiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAwX2J1cyA9ICJDSEtKMjQwMC5idXMiOyAvLyBEZXByZWNhdGVkIHVzZSBvZiBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAwX2VqYkNyZWF0ZSA9ICJDSEtKMjQwMC5lamJDcmVhdGUiOyAvLyBEZXByZWNhdGVkIHVzZSBvZiBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAwX2VqYkZpbmQgPSAiQ0hLSjI0MDAuZWpiRmluZCI7IC8vIERlcHJlY2F0ZWQgdXNlIG9mIFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjQwMC5lamJQb3N0Q3JlYXRlIjsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMSA9ICJDSEtKMjQwMSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA1ID0gIkNIS0oyNDA1IjsgLy8gZmluZEJ5UHJpbWFyeUtleSBtdXN0IGhhdmUgdGhlIDxwcmltLWtleS1jbGFzcz4gYXMgaXRzIGFyZ3VtZW50LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwNiA9ICJDSEtKMjQwNiI7IC8vIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHByaW1hcnkga2V5IHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA4X2J1cyA9ICJDSEtKMjQwOC5idXMiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDhfZWpiQ3JlYXRlID0gIkNIS0oyNDA4LmVqYkNyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOF9lamJGaW5kID0gIkNIS0oyNDA4LmVqYkZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDhfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjQwOC5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA5X2J1cyA9ICJDSEtKMjQwOS5idXMiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDlfZWpiQ3JlYXRlID0gIkNIS0oyNDA5LmVqYkNyZWF0ZSI7IC8vVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA5X2VqYkZpbmQgPSAiQ0hLSjI0MDkuZWpiRmluZCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOV9lamJQb3N0Q3JlYXRlID0gIkNIS0oyNDA5LmVqYlBvc3RDcmVhdGUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTBfYnVzID0gIkNIS0oyNDEwLmJ1cyI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTBfZWpiQ3JlYXRlID0gIkNIS0oyNDEwLmVqYkNyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTBfZWpiRmluZCA9ICJDSEtKMjQxMC5lamJGaW5kIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMF9lamJQb3N0Q3JlYXRlID0gIkNIS0oyNDEwLmVqYlBvc3RDcmVhdGUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEyID0gIkNIS0oyNDEyIjsgLy8gVGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEzID0gIkNIS0oyNDEzIjsgLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE0ID0gIkNIS0oyNDE0IjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBleGNlcHRpb24gWC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTUgPSAiQ0hLSjI0MTUiOyAvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTggPSAiQ0hLSjI0MTgiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxOSA9ICJDSEtKMjQxOSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgYSBjcmVhdGUgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyMCA9ICJDSEtKMjQyMCI7IC8vIFggbXVzdCBiZSB0aHJvd24gYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSBob21lIGludGVyZmFjZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MzIgPSAiQ0hLSjI0MzIiOyAvLyBYIG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgcmVtb3RlIGludGVyZmFjZS4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjkwOCA9ICJDSEtKMjkwOCI7IC8vIEFuIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgcmVmbGVjdGVkLiBSdW4gdGhlIFhNTCB2YWxpZGF0b3IuIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWIwZGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaG9sZHMgdGhlIG1lc3NhZ2UgY29uc3RhbnRzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZQotICogRUpCIDIuMCBzcGVjaWZpY2F0aW9uIChlLmcuIE1EQi1vbmx5IG1lc3NhZ2VzKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIGV4dGVuZHMgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMgewotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQyA9ICIuZWpiMjAiOyAvLyBFSkIgc3BlY2lmaWNhdGlvbiBiZWluZyB2YWxpZGF0ZWQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fQkFTRV9TUEVDID0gT05fQkFTRSArIFNQRUM7IAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fVEhJU19TUEVDID0gT05fVEhJUyArIFNQRUM7Ci0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKID0gbnVsbDsgLy8gUGxhY2Vob2xkZXIgZm9yIGEgbWVzc2FnZSBpZCB3aGVuIHRoZSBpZCBoYXNuJ3QgYmVlbiBjcmVhdGVkIGluIHRoZSAucHJvcGVydGllcyBmaWxlCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxOCA9ICJDSEtKMjAxOCI7IC8vIFRoaXMgZGVwZW5kZW50IHZhbHVlIGNsYXNzIG11c3QgYmUgc2VyaWFsaXphYmxlLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDQzID0gIkNIS0oyMDQzIjsgLy8gVGhpcyBkZXBlbmRlbnQgdmFsdWUgY2xhc3MgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDQ0ID0gIkNIS0oyMDQ0IjsgLy8gVGhpcyBkZXBlbmRlbnQgdmFsdWUgY2xhc3MgbXVzdCBub3QgYmUgYWJzdHJhY3QuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNTBfYWNjID0gIkNIS0oyMDUwLmFjYyI7IC8vIEFuIGFjY2Vzc29yIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9jb25zdHIgPSAiQ0hLSjIwNTAuY29uc3RyIjsgLy8gQSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9jcmVhdGUgPSAiQ0hLSjIwNTAuY3JlYXRlIjsgLy8gQSBjcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkFjdGl2YXRlID0gIkNIS0oyMDUwLmVqYkFjdGl2YXRlIjsgLy8gVGhlIGVqYkFjdGl2YXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJDcmVhdGUgPSAiQ0hLSjIwNTAuZWpiQ3JlYXRlIjsgLy8gQW4gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJGaW5kID0gIkNIS0oyMDUwLmVqYkZpbmQiOyAvLyBBbiBlamJGaW5kIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5ID0gIkNIS0oyMDUwLmVqYkZpbmRCeVByaW1hcnlLZXkiOyAvLyBBbiBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJIb21lID0gIkNIS0oyMDUwLmVqYkhvbWUiOyAvLyBBbiBlamJIb21lIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJMb2FkID0gIkNIS0oyMDUwLmVqYkxvYWQiOyAvLyBBbiBlamJMb2FkIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJQYXNzaXZhdGUgPSAiQ0hLSjIwNTAuZWpiUGFzc2l2YXRlIjsgLy8gQW4gZWpiUGFzc2l2YXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJQb3N0Q3JlYXRlID0gIkNIS0oyMDUwLmVqYlBvc3RDcmVhdGUiOyAvLyBBbiBlamJQb3N0Q3JlYXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJSZW1vdmUgPSAiQ0hLSjIwNTAuZWpiUmVtb3ZlIjsgLy8gQW4gZWpiUmVtb3ZlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJTZWxlY3QgPSAiQ0hLSjIwNTAuZWpiU2VsZWN0IjsgLy8gQW4gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lamJTdG9yZSA9ICJDSEtKMjA1MC5lamJTdG9yZSI7IC8vIEFuIGVqYlN0b3JlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9lcXVhbHMgPSAiQ0hLSjIwNTAuZXF1YWxzIjsgLy8gQW4gZXF1YWxzIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9maW5kID0gIkNIS0oyMDUwLmZpbmQiOyAvLyBBbiBmaW5kIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5ID0gIkNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkiOyAvLyBBbiBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9oYXNoQ29kZSA9ICJDSEtKMjA1MC5oYXNoQ29kZSI7IC8vIEFuIGhhc2hDb2RlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9ob21lID0gIkNIS0oyMDUwLmhvbWUiOyAvLyBBbiBob21lIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9vbk1lc3NhZ2UgPSAiQ0hLSjIwNTAub25NZXNzYWdlIjsgLy8gQW4gb25NZXNzYWdlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0ID0gIkNIS0oyMDUwLnNldEVudGl0eUNvbnRleHQiOyAvLyBBbiBzZXRFbnRpdHlDb250ZXh0IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQgPSAiQ0hLSjIwNTAudW5zZXRFbnRpdHlDb250ZXh0IjsgLy8gQW4gdW5zZXRFbnRpdHlDb250ZXh0IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA0ID0gIkNIS0oyNDA0IjsgLy8gQXBwbGljYXRpb24gZXhjZXB0aW9uIFggbXVzdCBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxNiA9ICJDSEtKMjQxNiI7IC8vIEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBYIG11c3Qgbm90IGV4dGVuZCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjEgPSAiQ0hLSjI0MjEiOyAvLyBlamJDcmVhdGUgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDIyID0gIkNIS0oyNDIyIjsgLy8gZWpiQ3JlYXRlIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyMyA9ICJDSEtKMjQyMyI7IC8vIGVqYkNyZWF0ZSBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDI0ID0gIkNIS0oyNDI0IjsgLy8gZWpiQ3JlYXRlIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDI2ID0gIkNIS0oyNDI2IjsgLy8gZWpiUG9zdENyZWF0ZSBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjcgPSAiQ0hLSjI0MjciOyAvLyBlamJQb3N0Q3JlYXRlIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyOCA9ICJDSEtKMjQyOCI7IC8vIGVqYlBvc3RDcmVhdGUgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzMCA9ICJDSEtKMjQzMCI7IC8vIFggbXVzdCBleGlzdCBmb3IgdGhpcyBlamJIb21lIG1ldGhvZCB0byBiZSBjYWxsZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDMxID0gIkNIS0oyNDMxIjsgLy8gZWpiSG9tZSBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MzkgPSAiQ0hLSjI0MzkiOyAvLyBlamJIb21lIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDEgPSAiQ0hLSjI0NDEiOyAvLyBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQyID0gIkNIS0oyNDQyIjsgLy8gYnVzaW5lc3MgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0MyA9ICJDSEtKMjQ0MyI7IC8vIGJ1c2luZXNzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQ1ID0gIkNIS0oyNDQ1IjsgLy8gb25NZXNzYWdlIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0NiA9ICJDSEtKMjQ0NiI7IC8vIG9uTWVzc2FnZSBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDcgPSAiQ0hLSjI0NDciOyAvLyBvbk1lc3NhZ2UgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0OSA9ICJDSEtKMjQ0OSI7IC8vIGFjY2Vzc29yIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NTAgPSAiQ0hLSjI0NTAiOyAvLyBhY2Nlc3NvciBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdCAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1MiA9ICJDSEtKMjQ1MiI7IC8vIEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1MyA9ICJDSEtKMjQ1MyI7IC8vIFRyYW5zaWVudCBmaWVsZHMgYXJlIGRpc2NvdXJhZ2VkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1NCA9ICJDSEtKMjQ1NCI7IC8vIENNUiBhbmQgQ01QIGZpZWxkcyBtdXN0IG5vdCBiZSBkZWZpbmVkIG9uIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1NyA9ICJDSEtKMjQ1NyI7IC8vIGVqYkZpbmQgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU4ID0gIkNIS0oyNDU4IjsgLy8gZWpiRmluZCBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NTkgPSAiQ0hLSjI0NTkiOyAvLyBlamJGaW5kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjEgPSAiQ0hLSjI0NjEiOyAvLyBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgaW50ZXJmYWNlcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjIgPSAiQ0hLSjI0NjIiOyAvLyBUaGUgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjMgPSAiQ0hLSjI0NjMiOyAvLyBUaGUgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDY0ID0gIkNIS0oyNDY0IjsgLy8gVGhlIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjUgPSAiQ0hLSjI0NjUiOyAvLyBob21lIG1ldGhvZCBYIG11c3QgdGhyb3cgWSBmb3IgWi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjYgPSAiQ0hLSjI0NjYiOyAvLyByZW1vdGUgaG9tZSBtZXRob2QgWCBtdXN0IG5vdCBleHBvc2UgdGhlIFkgdHlwZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjcgPSAiQ0hLSjI0NjciOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93IENyZWF0ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjggPSAiQ0hLSjI0NjgiOyAvLyBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDY5ID0gIkNIS0oyNDY5IjsgLy8gVGhpcyBtZXRob2QgKEVKQk9iamVjdCBvciBFSkJMb2NhbE9iamVjdCkgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzAgPSAiQ0hLSjI0NzAiOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRjaGluZyBtZXRob2QgbXVzdCByZXR1cm4gWC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzEgPSAiQ0hLSjI0NzEiOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRjaGluZyBtZXRob2QgbXVzdCB0aHJvdyBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MiA9ICJDSEtKMjQ3MiI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHBhc3MgWCBhcyBhbiBhcmd1bWVudCBvciByZXN1bHQgdHlwZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzMgPSAiQ0hLSjI0NzMiOyAvLyBUaGlzIChDTVIpIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NCA9ICJDSEtKMjQ3NCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NSA9ICJDSEtKMjQ3NSI7IC8vIGZpbmRCeVByaW1hcnlLZXkncyBhcmd1bWVudCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzYgPSAiQ0hLSjI0NzYiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBjcmVhdGUvZWpiQ3JlYXRlIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzcgPSAiQ0hLSjI0NzciOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93IEZpbmRlckV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzggPSAiQ0hLSjI0NzgiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NzkgPSAiQ0hLSjI0NzkiOyAvLyBmaW5kQnlQcmltYXJ5S2V5IG11c3QgcmV0dXJuIFguIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDgwID0gIkNIS0oyNDgwIjsgLy8gQ01QL0NNUiBmaWVsZCBuYW1lIG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDgxID0gIkNIS0oyNDgxIjsgLy8gZmllbGQgWCBtdXN0IGJlIGEgPGNtcC1maWVsZD4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODIgPSAiQ0hLSjI0ODIiOyAvLyBmaWVsZCBYIG11c3QgYmUgYSA8Y21yLWZpZWxkPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4MyA9ICJDSEtKMjQ4MyI7IC8vIENNUC9DTVIgZmllbGQgc2hvdWxkIG5vdCBiZSBleHBvc2VkIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDg0ID0gIkNIS0oyNDg0IjsgLy8gQ01QL0NNUiBmaWVsZCBtdXN0IGJlIGVpdGhlciBhIHByaW1pdGl2ZSBvciBhIHNlcmlhbGl6YWJsZSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4NSA9ICJDSEtKMjQ4NSI7IC8vIGVqYlNlbGVjdCBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODYgPSAiQ0hLSjI0ODYiOyAvLyBlamJTZWxlY3QgbXVzdCByZXR1cm4gWCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODcgPSAiQ0hLSjI0ODciOyAvLyBlamJTZWxlY3QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDg4ID0gIkNIS0oyNDg4IjsgLy8gZWpiU2VsZWN0IG11c3QgdGhyb3cgRmluZGVyRXhjZXB0aW9uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDg5ID0gIkNIS0oyNDg5IjsgLy8gRmllbGQgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTAgPSAiQ0hLSjI0OTAiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5MiA9ICJDSEtKMjQ5MiI7IC8vIGVqYlJlbW92ZSBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTMgPSAiQ0hLSjI0OTMiOyAvLyBlamJSZW1vdmUgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDk0ID0gIkNIS0oyNDk0IjsgLy8gZWpiUmVtb3ZlIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTUgPSAiQ0hLSjI0OTUiOyAvLyBUaGlzIGZpbmQgbWV0aG9kIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTYgPSAiQ0hLSjI0OTYiOyAvLyBUaGlzIGVqYlNlbGVjdCBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5NyA9ICJDSEtKMjQ5NyI7IC8vIGVqYkNyZWF0ZSBtdXN0IHRocm93IENyZWF0ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMF9lamJDcmVhdGUgPSAiQ0hLSjI1MDAuZWpiQ3JlYXRlIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMF9lamJIb21lID0gIkNIS0oyNTAwLmVqYkhvbWUiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2VqYkZpbmQgPSAiQ0hLSjI1MDAuZWpiRmluZCI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfYnVzaW5lc3MgPSAiQ0hLSjI1MDAuYnVzIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMF9ob21lID0gIkNIS0oyNTAwLmhvbWUiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2NyZWF0ZSA9ICJDSEtKMjUwMC5jcmVhdGUiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2ZpbmQgPSAiQ0hLSjI1MDAuZmluZCI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMV9lamJDcmVhdGUgPSAiQ0hLSjI1MDEuZWpiQ3JlYXRlIjsgLy8gZWpiQ3JlYXRlIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAxX2VqYlJlbW92ZSA9ICJDSEtKMjUwMS5lamJSZW1vdmUiOyAvLyBlamJSZW1vdmUgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDFfb25NZXNzYWdlID0gIkNIS0oyNTAxLm9uTWVzc2FnZSI7IC8vIGVqYlJlbW92ZSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAyX2VqYkZpbmQgPSAiQ0hLSjI1MDIuZWpiRmluZCI7IC8vIGVqYkZpbmQgbXVzdCBub3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAyX2VqYlNlbGVjdCA9ICJDSEtKMjUwMi5lamJTZWxlY3QiOyAvLyBlamJTZWxlY3QgbXVzdCBub3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAyX2ZpbmFsaXplID0gIkNIS0oyNTAyLmZpbmFsaXplIjsgLy8gZmluYWxpemUgbXVzdCBub3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAyID0gIkNIS0oyNTAyIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuICAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2J1cyA9ICJDSEtKMjUwMy5idXMiOyAvLyBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfY3JlYXRlID0gIkNIS0oyNTAzLmNyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfZWpiQ3JlYXRlID0gIkNIS0oyNTAzLmVqYkNyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfZWpiRmluZCA9ICJDSEtKMjUwMy5lamJGaW5kIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19lamJIb21lID0gIkNIS0oyNTAzLmVqYkhvbWUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI1MDMuZWpiUG9zdENyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfZmluZCA9ICJDSEtKMjUwMy5maW5kIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19ob21lID0gIkNIS0oyNTAzLmhvbWUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX29uTWVzc2FnZSA9ICJDSEtKMjUwMy5vbk1lc3NhZ2UiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfYnVzaW5lc3MgPSAiQ0hLSjI1MDQuYnVzaW5lc3MiOyAvLyBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA0X2NyZWF0ZSA9ICJDSEtKMjUwNC5jcmVhdGUiOyAvLyBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA0X2ZpbmQgPSAiQ0hLSjI1MDQuZmluZCI7IC8vIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfaG9tZSA9ICJDSEtKMjUwNC5ob21lIjsgLy8gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA1X2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA1X29uTWVzc2FnZSA9ICJDSEtKMjUwNS5vbk1lc3NhZ2UiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwNV9lamJSZW1vdmUgPSAiQ0hLSjI1MDUuZWpiUmVtb3ZlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwMF9OQU1FRCA9ICJDSEtKMjgwMC5uYW1lZCI7IC8vIDxsb2NhbD4gY2Fubm90IGJlIHJlZmxlY3RlZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDBfVU5OQU1FRCA9ICJDSEtKMjgwMC51bm5hbWVkIjsgLy8gPGxvY2FsPiBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNV9OQU1FRCA9ICJDSEtKMjgwNS5uYW1lZCI7IC8vIDxsb2NhbC1ob21lPiBjYW5ub3QgYmUgcmVmbGVjdGVkIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA1X1VOTkFNRUQgPSAiQ0hLSjI4MDUudW5uYW1lZCI7IC8vIDxsb2NhbC1ob21lPiBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMyA9ICJDSEtKMjgxMyI7IC8vIDxlamItbmFtZT4gWCBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxNiA9ICJDSEtKMjgxNiI7IC8vIDxlamItcmVsYXRpb24tbmFtZT4gbXVzdCBiZSB1bmlxdWUgaW4gZWpiLWphci54bWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODE3ID0gIkNIS0oyODE3IjsgLy8gPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gPGVqYi1yZWxhdGlvbj4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTggPSAiQ0hLSjI4MTgiOyAvLyBUaGUgdmFsdWUgb2YgdGhlIDxtdWx0aXBsaWNpdHk+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIk9uZSIgb3IgIk1hbnkiIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODE5ID0gIkNIS0oyODE5IjsgLy8gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyMSA9ICJDSEtKMjgyMSI7IC8vIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+IHswfSBtdXN0IGV4aXN0IGluIHRoZSBtb2R1bGUgLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0OCA9ICJDSEtKMjg0OCI7IC8vIDxjYXNjYWRlLWRlbGV0ZT4gbXVzdCBiZSB1c2VkIHdpdGggYSA8bXVsdGlwbGljaXR5PiBvZiAiT25lIiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg1NCA9ICJDSEtKMjg1NCI7IC8vIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphci54bWwgZmlsZSAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg1NSA9ICJDSEtKMjg1NSI7IC8vIDxjbXAtZmllbGQ+IHswfSBtdXN0IGJlIGEgSmF2YSBwcmltaXRpdmUgb3IgYSBKYXZhIHNlcmlhbGl6YWJsZSB0eXBlIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU2ID0gIkNIS0oyODU2IjsgLy8gPGNtci1maWVsZD4gezB9IG11c3QgYmUgdGhlIHsxfSB0eXBlIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU3ID0gIkNIS0oyODU3IjsgLy8gPGNtci1maWVsZD4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgYW5kIGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU4ID0gIkNIS0oyODU4IjsgLy8gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiBtdXN0IGV4aXN0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU5ID0gIkNIS0oyODU5IjsgLy8gUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gPGVqYi1uYW1lPiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2MCA9ICJDSEtKMjg2MCI7IC8vIFJlc2VydmVkIGlkZW50aWZpZXIgezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NjYgPSAiQ0hLSjI4NjYiOyAvLyA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBkZWZpbmVkIG9uIHsxfSAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2NyA9ICJDSEtKMjg2NyI7IC8vIFRoaXMgYmVhbiBjYW4gaGF2ZSBvbmx5IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgYmVhbnMgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NjggPSAiQ0hLSjI4NjgiOyAvLyBUaGUgdmFsdWUgb2YgdGhlIDxjbXItZmllbGQtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJqYXZhLnV0aWwuU2V0IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2OSA9ICJDSEtKMjg2OSI7IC8vIEF0IGxlYXN0IG9uZSA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiBtdXN0IGRlZmluZSBhIDxjbXItZmllbGQ+IC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzAgPSAiQ0hLSjI4NzAiOyAvLyA8ZWpiLW5hbWU+IHswfSBtdXN0IGV4aXN0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODcxID0gIkNIS0oyODcxIjsgLy8gPGVqYi1uYW1lPiB7MH0gbXVzdCByZWZlciB0byBhIENNUCBiZWFuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODcyID0gIkNIS0oyODcyIjsgLy8gVGhlIHZhbHVlIG9mIHRoZSA8Y21wLXZlcnNpb24+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIjEueCIgb3IgIjIueCIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzMgPSAiQ0hLSjI4NzMiOyAvLyBNaWdyYXRlIHRoaXMgYmVhbidzIGRhdGFzb3VyY2UgYmluZGluZyB0byBhIENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzQgPSAiQ0hLSjI4NzQiOyAvLyBNaWdyYXRlIHRoaXMgRUpCIG1vZHVsZSdzIGRlZmF1bHQgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODgwID0gIkNIS0oyODgwIjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbC1ob21lPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4MSA9ICJDSEtKMjg4MSI7IC8vIFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8aG9tZT4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODIgPSAiQ0hLSjI4ODIiOyAvLyBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4MyA9ICJDSEtKMjg4MyI7IC8vIFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8cmVtb3RlPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4NCA9ICJDSEtKMjg4NCI7IC8vIFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsLWhvbWU+IG9yIGEgPGhvbWU+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODg1ID0gIkNIS0oyODg1IjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWw+IG9yIGEgPHJlbW90ZT4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODYgPSAiQ0hLSjI4ODYuZWpiMjEiOyAvLyBEdXBsaWNhdGUgYWN0aXZhdGlvbiBjb25maWc6ICJ7MH0iIGV4aXN0IGluIG1lc3NhZ2UgZHJ2aWVuIGJlYW46ICJ7MX0iIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODg3ID0gIkNIS0oyODg3LmVqYjIxIjsgLy8gVGhlIGFjdGl2YXRpb24gY29uZmlnIHdpdGggbmFtZSA6ICJ7MH0iIGhhcyBpbnZhbGlkIHZhbHVlIDogIjEiIGZvciBtZXNzYWdlIGRydmllbiBiZWFuOiAiezJ9IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4OCA9ICJDSEtKMjg4OC5lamIyMSI7IC8vIFRoZSBhY3RpdmF0aW9uIGNvbmZpZzogInswfSIgY2FuIG9ubHkgZXhpc3QgZm9yIGEgZGVzdGluYXRpb24gdHlwZTogInsxfSIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODkgPSAiQ0hLSjI4ODkuZWpiMjEiOyAvLyBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBpcyBub3Qgc2V0IGZvciBiZWFuOiAiezB9IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg5MCA9ICJDSEtKMjg5MC5lamIyMSI7IC8vIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgInswfSIgYW5kIGRlc3RpbmF0aW9uIHR5cGUgYWN0aXZhdGlvbiBjb25maWcgcHJvcGVydHkgdmFsdWUgInsxfSIgZG8gbm90IG1hdGNoICBmb3IgYmVhbjogInsyfSIgLy8kTk9OLU5MUy0xJAkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3NmYxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBOT19NRVRIT0RTID0gMHgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFWENMVURFRF9NRVRIT0QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyOyAvLyAweDEgKDEpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVYQ0xVREVEX0ZJRUxEID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLyAweDIgKDIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9USEVSX0ZJRUxEID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLyAweDQgKDQpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDQ0VTU09SID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4OCAoOCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlVTSU5FU1MgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMCAoMTYpCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ0xJTklUID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAgKDMyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDT05TVFJVQ1RPUiA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDQwICg2NCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ09OU1RSVUNUT1JfTk9QQVJNID0gIENPTlNUUlVDVE9SIHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLyAweDQwfDB4ODAgKDE5MikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ1JFQVRFID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwICgyNTYpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENSRUFURV9OT1BBUk0gPSBDUkVBVEUgfCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7ICAvLzB4MTAwfDB4MjAwICg3NjgpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkFDVElWQVRFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDQwMCAoMTAyNCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCQ1JFQVRFID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwICgyMDQ4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJDUkVBVEVfTk9QQVJNID0gRUpCQ1JFQVRFIHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOy8vMHg4MDB8MHgxMDAwICg2MTQ0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJGSU5EID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAgLy8weDIwMDAgKDgxOTIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkZJTkRCWVBSSU1BUllLRVkgPSBFSkJGSU5EIHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAwMHwweDQwMDAgKDI0NTc2KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJIT01FID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwMCAoMzI3NjgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkxPQURfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwMDAgKDY1NTM2KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJQQVNTSVZBVEVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAwMDAgKDEzMSwwNzIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQlBPU1RDUkVBVEUgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg0MDAwMCAoMjYyLDE0NCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCUkVNT1ZFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMDAwICg1MjQsMjg4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJTRUxFQ1QgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAwMDAgKDEsMDQ4LDU3NikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCU1RPUkVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOy8vMHgyMDAwMDAgKDIsMDk3LDE1MikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVFVQUxTID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAgLy8weDQwMDAwMCAoNCwxOTQsMzA0KQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGSU5EID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwMDAwICg4LDM4OCw2MDgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZJTkRCWVBSSU1BUllLRVkgPSBGSU5EIHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwMDAwMCAoMjUsMTY1LDgyNCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRklOQUxJWkVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAwMDAwMCAoMzMsNTU0LDQzMikKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSEFTSENPREVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAwMDAwMCAoNjcsMTA4LDg2NCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSEVMUEVSID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwMDAwMCAoMTM0LDIxNyw3MjgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEhPTUUgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAwMDAwMCAoMjY4LDQzNSw0NTYpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9OTUVTU0FHRSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwMDAwMDAwICg1MzYsODcwLDkxMikKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU0VSSUFMVkVSU0lPTlVJRCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDQwMDAwMDAwICgxLDA3Myw3NDEsODI0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTRVRTRVNTSU9OQ09OVEVYVCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMDAwMDAwICgyLDE0Nyw0ODMsNjQ4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTRVRFTlRJVFlDT05URVhUID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwMDAwMDAwICg0LDI5NCw5NjcsMjk2KQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTlNFVEVOVElUWUNPTlRFWFRfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAwMDAwMDAwICg4LDU4OSw5MzQsNTkyKQotCQotCi0JLy8gcHJlZml4ZXMgb2Ygc29tZSBtZXRob2QgbmFtZXMKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9DID0gImMiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCID0gImVqYiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkJDID0gImVqYkMiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCRiA9ICJlamJGIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQkZJTkQgPSAiZWpiRmluZCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkJIT01FID0gImVqYkhvbWUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCU0VMRUNUID0gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GID0gImYiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRklORCA9ICJmaW5kIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0dFVCA9ICJnZXQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfU0VMRUNUID0gInNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9TRVQgPSAic2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWV0aG9kIG5hbWVzCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9DUkVBVEUgPSAiY3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSA9ICJlamJBY3RpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCQ1JFQVRFID0gImVqYkNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCRklOREJZUFJJTUFSWUtFWSA9ICJlamJGaW5kQnlQcmltYXJ5S2V5IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJMT0FEID0gImVqYkxvYWQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQlBBU1NJVkFURSA9ICJlamJQYXNzaXZhdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUgPSAiZWpiUG9zdENyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCUkVNT1ZFID0gImVqYlJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCU1RPUkUgPSAiZWpiU3RvcmUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VRVUFMUyA9ICJlcXVhbHMiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0ZJTkFMSVpFID0gImZpbmFsaXplIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZID0gImZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0hBU0hDT0RFID0gImhhc2hDb2RlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9PTk1FU1NBR0UgPSAib25NZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9SRU1PVkUgPSAicmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9TRVRTRVNTSU9OQ09OVEVYVCA9ICJzZXRTZXNzaW9uQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfU0VURU5USVRZQ09OVEVYVCA9ICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9VTlNFVEVOVElUWUNPTlRFWFQgPSAidW5zZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIGZpZWxkIG5hbWVzCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCA9ICJzZXJpYWxWZXJzaW9uVUlEIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEZvciBzdWJzdGl0dXRpb24gaW50byBzdHJpbmdzCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RTSUdOQVRVUkVfRVFVQUxTID0gImVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRFNJR05BVFVSRV9IQVNIQ09ERSA9ICJoYXNoQ29kZSgpIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwMzFhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBJTWV0aG9kVHlwZSB7Ci0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRJZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIHR5cGUgaXMgYSBkZWZhdWx0IHR5cGUgZm9yIGFuIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLgotCSAqIEZvciBleGFtcGxlLCBpZiB0aGUgbWV0aG9kIG9uIHRoZSBob21lIGlzIG5laXRoZXIgYSBjcmVhdGUgbm9yIGEgZmluZCBtZXRob2QsIHRoZW4KLQkgKiBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBkZWZhdWx0IHR5cGUsIGEgaG9tZSBtZXRob2QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpOwotCQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpOyAvLyByZXF1aXJlZCBtZXRob2QgaXMgbWlzc2luZwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKTsgLy8gbWV0aG9kIHNob3VsZCBub3QgZXhpc3QKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCk7IC8vIG1ldGhvZCB0aHJvd3MgKG9yIGRvZXNuJ3QgdGhyb3cpIFJlbW90ZUV4Y2VwdGlvbgotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKTsgLy8gbWV0aG9kIGlzIG1pc3NpbmcgaXRzIG1hdGNoaW5nIG1ldGhvZCBvbiB0aGUgYmVhbiBjbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKTsgLy8gcGFyYW1ldGVyIG9yIHJldHVybiB0eXBlIGlzIG5vdCBhIGxlZ2FsIFJNSS1JSU9QIHR5cGUKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JUmVtb3RlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lSZW1vdGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjUzODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lSZW1vdGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGVUeXBlIHsKLQlwdWJsaWMgaW50IElTX1JFTU9URSA9IElFSkJUeXBlLlJFTU9URTsKLQlwdWJsaWMgaW50IE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWSA9IElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUjsgLy8gSWYgYSBtZXRob2QgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gaXQgc2hvdWxkLCBSTUlDIGJsb3dzIHVwLCBoZW5jZSB0aGlzIHNpdHVhdGlvbiBpcyBhbiBlcnJvci4KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVHlwZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lUeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjY4ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lUeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJVHlwZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBsb25nIE5PX1NVUEVSVFlQRSA9IDB4MDsKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgTE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlcjsgLy8gMHgxICgxKQotCXB1YmxpYyBzdGF0aWMgbG9uZyBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLyAweDIgKDIpCi0JCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFYX0VKQl9FTlRJVFlCRUFOID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vIDB4NCAoNCkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRSA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLzB4OCAoOCkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7Ly8weDEwICgxNikKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VKQkhPTUUgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8weDIwICgzMikKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VKQk9CSkVDVCA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAgKDY0KQotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBX0xBTkdfT0JKRUNUID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7Ly8weDgwICgxMjgpCi0JCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTiA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwICgyNTYpCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFYX0pNU19NRVNTQUdFTElTVEVORVIgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgIC8vMHgyMDAgKDUxMikKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX1NFU1NJT05CRUFOID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHg0MDAgKDEwMjQpCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vIDB4ODAwICgyMDQ4KQotCQotCS8vIHByaW1pdGl2ZSB0eXBlcwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRCA9ICJ2b2lkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIGNsYXNzIGFuZCBpbnRlcmZhY2UgdHlwZXMKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0lPX0lPRVhDRVBUSU9OID0gImphdmEuaW8uSU9FeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9JT19TRVJJQUxJWkFCTEUgPSAiamF2YS5pby5TZXJpYWxpemFibGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfTEFOR19FWENFUFRJT04gPSAiamF2YS5sYW5nLkV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTiA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEUgPSAiamF2YS5ybWkuUmVtb3RlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTiA9ICJqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04gPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OID0gImphdmEudXRpbC5FbnVtZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1VUSUxfU0VUID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0NSRUFURUVYQ0VQVElPTiA9ICJqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlCRUFOID0gImphdmF4LmVqYi5FbnRpdHlCZWFuIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJFWENFUFRJT04gPSAiamF2YXguZWpiLkVKQkV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRSA9ICJqYXZheC5lamIuRUpCSG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxIT01FID0gImphdmF4LmVqYi5FSkJMb2NhbEhvbWUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVCA9ICJqYXZheC5lamIuRUpCT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVCA9ICJqYXZheC5lamIuRUpCTG9jYWxPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQgPSAiamF2YXguZWpiLkVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0ZJTkRFUkVYQ0VQVElPTiA9ICJqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTiA9ICJqYXZheC5lamIuTWVzc2FnZURyaXZlbkJlYW4iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX09CSkVDVE5PVEZPVU5ERVhDRVBUSU9OID0gImphdmF4LmVqYi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTkJFQU4gPSAiamF2YXguZWpiLlNlc3Npb25CZWFuIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQ09OVEVYVCA9ICJqYXZheC5lamIuU2Vzc2lvbkNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04gPSAiamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0UgPSAiamF2YXguam1zLk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUiA9ICJqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX1RSQU5TQUNUSU9OX1VTRVJUUkFOU0FDVElPTiA9ICJqYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9OQU1JTkdfQ09OVEVYVCA9ICJqYXZheC5uYW1pbmcuQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0YTE4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVZhbGlkYXRpb25SdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25SdWxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHJ1bGUuIEdpdmVuIHRoaXMgaWQsIHRoaXMgcnVsZSBjYW4gYmUgbG9hZGVkIGZyb20KLQkgKiB0aGUgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkcyBvZiB0aGUgcnVsZXMgd2hpY2ggdGhpcyBydWxlIGRlcGVuZHMgb24uIChUaGF0IGlzLAotCSAqIGlmIG9uZSBvZiB0aGVzZSBydWxlcyBydW5zLCB0aGVuIHRoaXMgcnVsZSBuZWVkcyB0byBiZSBydW4uKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRzT24oKTsKLQkKLQkvKioKLQkgKiBBZGQgYSB2YWxpZGF0aW9uIHJ1bGUgd2hpY2ggbmVlZHMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGlzIHJ1bGUgaXMgcnVuLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlcGVuZGVudChJVmFsaWRhdGlvblJ1bGUgcnVsZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgSVZhbGlkYXRpb25SdWxlcyB3aGljaCBkZXBlbmQgb24gdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGVwZW5kZW50cygpOwotCQotCS8qKgotCSAqIEdpdmVuIHRoZSB0YXJnZXQncyBwYXJlbnQgYW5kIHRoZSBjaGFuZ2VkIHRhcmdldCwgcmV0dXJuIHRoZSB0YXJnZXQgd2hpY2ggCi0JICogdGhpcyBydWxlIHNob3VsZCB2YWxpZGF0ZS4gRm9yIGV4YW1wbGUsIGlmIGEgYmVhbiBjbGFzcyBjaGFuZ2VzLCB0aGVuIHRoZSAKLQkgKiB0YXJnZXQgcGFyZW50IHdvdWxkIGJlIHRoZSBFbnRlcnByaXNlQmVhbiwgYW5kIHRoaXMgcnVsZSBjb3VsZCByZXR1cm4KLQkgKiB0aGUgaG9tZSBpbnRlcmZhY2UsIG9yIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlLCBvciB0aGUga2V5IGNsYXNzLCBldGMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCk7Ci0KLQkvKioKLQkgKiBJZiBhbnkgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCBiZWZvcmUgdGhlIHZhbGlkYXRlIG1ldGhvZCBpcyBjYWxsZWQsCi0JICogdGhlbiB0aGF0IGluZm9ybWF0aW9uIHNob3VsZCBiZSBjYWxjdWxhdGVkIGhlcmUuIFRoaXMgY2FjaGVkIGluZm9ybWF0aW9uIHNob3VsZAotCSAqIGJlIGNsZWFuZWQgdXAgaW4gdGhlIHBvc3RWYWxpZGF0ZSBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgdGFyZ2V0IG9iamVjdC4gUmVwb3J0IGFsbCBtZXNzYWdlcywgbG9hZCBtb2RlbHMsIGV0Yy4KLQkgKiB0aHJvdWdoIHRoZSBJVmFsaWR0aW9uQ29udGV4dCBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjbGVhbnMgdXAgYW55IHJlc291cmNlcyBjYWxjdWxhdGVkIG9yIGNhY2hlZCBpbiB0aGUgcHJlVmFsaWRhdGUgbWV0aG9kLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgdmFsaWRhdGUgbWV0aG9kIGhhcyBjb21wbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVG8gZW5hYmxlIHRoaXMgcnVsZSBmb3IgcmV1c2UsIHJlc2V0IGFueSBzdG9yZWQgdmFsdWVzICh3aGljaCB3ZXJlIGNhbGN1bGF0ZWQgCi0JICogZHVyaW5nIHZhbGlkYXRpb24pIHRvIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWFwcGluZyBvZiBDSEtKIG1lc3NhZ2UgaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldE1lc3NhZ2VJZHMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVZhbGlkYXRpb25SdWxlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWMzOTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblJ1bGVMaXN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9FSkJKQVIgPSBuZXcgSW50ZWdlcigxKTsgLy8gRUpCIDEuMSBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0VKQkVYVCA9IG5ldyBJbnRlZ2VyKDIpOyAvLyBFSkIgMS4xIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfRUpCSkFSID0gbmV3IEludGVnZXIoMyk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9FSkJFWFQgPSBuZXcgSW50ZWdlcig0KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0VOVEVSUFJJU0VCRUFOID0gbmV3IEludGVnZXIoNSk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0VOVEVSUFJJU0VCRUFOID0gbmV3IEludGVnZXIoNik7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9TRVNTSU9OX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDcpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9TRVNTSU9OX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDgpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9TRVNTSU9OX0hPTUUgPSBuZXcgSW50ZWdlcig5KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQ01QX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDEwKTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQ01QX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDExKTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQ01QX0hPTUUgPSBuZXcgSW50ZWdlcigxMik7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0NNUF9LRVlDTEFTUyA9IG5ldyBJbnRlZ2VyKDEzKTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9CTVBfQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMTQpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9CTVBfUkVNT1RFID0gbmV3IEludGVnZXIoMTUpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9CTVBfSE9NRSA9IG5ldyBJbnRlZ2VyKDE2KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQk1QX0tFWUNMQVNTID0gbmV3IEludGVnZXIoMTcpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDE4KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDE5KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUgPSBuZXcgSW50ZWdlcigyMCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTCA9IG5ldyBJbnRlZ2VyKDIxKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSA9IG5ldyBJbnRlZ2VyKDIyKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMjMpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUgPSBuZXcgSW50ZWdlcigyNCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUgPSBuZXcgSW50ZWdlcigyNSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMID0gbmV3IEludGVnZXIoMjYpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUgPSBuZXcgSW50ZWdlcigyNyk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMjgpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDI5KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9IT01FID0gbmV3IEludGVnZXIoMzApOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX0xPQ0FMID0gbmV3IEludGVnZXIoMzEpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX0xPQ0FMSE9NRSA9IG5ldyBJbnRlZ2VyKDMyKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9LRVlDTEFTUyA9IG5ldyBJbnRlZ2VyKDMzKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDM0KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9SRU1PVEUgPSBuZXcgSW50ZWdlcigzNSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfSE9NRSA9IG5ldyBJbnRlZ2VyKDM2KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9MT0NBTCA9IG5ldyBJbnRlZ2VyKDM3KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9MT0NBTEhPTUUgPSBuZXcgSW50ZWdlcigzOCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfS0VZQ0xBU1MgPSBuZXcgSW50ZWdlcigzOSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX01FU1NBR0VfQkVBTkNMQVNTID0gbmV3IEludGVnZXIoNDApOyAvLyBFSkIgMi4wIHByb2plY3RzCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzY3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGVpdGhlciBhIHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZAotICogb3Igd2hlbiBleHBlY3RlZCBpbnB1dCAoZS5nLiB0aGUgcmVtb3RlIGludGVyZmFjZSkgaXMgbnVsbC4KLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzgxMTA0NjQ0ODY4NDg2OTg0NUw7Ci0JcHJpdmF0ZSBKYXZhQ2xhc3MgX2NsYXNzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbgotCSAqIGF2YWlsYWJsZSB0byBpZGVudGlmeSB3aGF0IGlzIGludmFsaWQuCi0JICovCi0JcHVibGljIEludmFsaWRJbnB1dEV4Y2VwdGlvbigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHdoZW4gdGhlIGdpdmVuIHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgSW52YWxpZElucHV0RXhjZXB0aW9uKEphdmFDbGFzcyBjbGF6eikgewotCQlfY2xhc3MgPSBjbGF6ejsKLQl9Ci0JCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBfY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRU1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhYzY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRU1lc3NhZ2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBKMkVFIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSRUZfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uZXJlZnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0NBVEVHT1JZID0gIndhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NBVEVHT1JZID0gImVhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCSkFSX0NBVEVHT1JZID0gImVqYmphcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBMSUNBVElPTkNMSUVOVF9DQVRFR09SWSA9ICJhcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX05BTUUgPSAidmFsaWRhdG9yLm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUgPSAiRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRlJFTU9URSA9ICJFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFID0gIkVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfU0VSVklDRVJFRiA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfTUVTU1NBR0VERVNUSU5BVElPTlJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19NRVNTU0FHRURFU1RJTkFUSU9OID0gIkVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT04iOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VNUFRZX01FU1NTQUdFREVTVElOQVRJT04gPSAiRVJST1JfRUFSX01JU1NJTkdfRU1QVFlfTUVTU1NBR0VERVNUSU5BVElPTiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfVU5SRVNPTFZFRF9NREJfTUlTU0lOR19NRVNTQUdFX0RFU1RJTkFUSU9OID0gIkVSUk9SX1VOUkVTT0xWRURfTURCX01JU1NJTkdfTUVTU0FHRV9ERVNUSU5BVElPTiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01PRFVMRV9ERF9GSUxFX05PVF9GT1VORCA9ICJFUlJPUl9NT0RVTEVfRERfRklMRV9OT1RfRk9VTkQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWI4NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBoYW5kbGVycyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIHJlc291cmNlQ2xhc3NMb2FkZXI7Ci0JcHJvdGVjdGVkIGphdmEudXRpbC5Mb2NhbGUgbG9jYWxlID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1bmRsZU5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLS8qKgotICogUmVzb3VyY2VIYW5kbGVyIGNvbnN0cnVjdG9yLiAgVGhpcyBjb25zdHJ1Y3RvciB1c2VzIHRoZSBkZWZhdWx0IGxvY2FsZS4KLSAqCi0gKi8KLXB1YmxpYyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBSZXNvdXJjZUhhbmRsZXIgY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIFRoZSBMb2NhbGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxvY2FsZSB0byBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICovCi1wdWJsaWMgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIoTG9jYWxlIGxvY2FsZSkgewotCXN1cGVyKCk7Ci0Jc2V0TG9jYWxlKGxvY2FsZSk7Ci19Ci0vKioKLSAqIEdldHRlciBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSBwcm9wZXJ0eS4gIFRoaXMgcHJvcGVydHkgaXMgbGF6aWx5IGluaXRpYWxpemVkIHVzaW5nIHRoZQotICogbG9jYWxlIHByb3BlcnR5OyBzbyB0aGF0IHByb3BlcnR5IG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICoKLSAqIEByZXR1cm4gVGhlIFJlc291cmNlQnVuZGxlIG9iamVjdCBjb250YWluaW5nIHRoZSBtZXNzYWdlcyB0byBiZSBoYW5kbGVkIGJ5IHRoaXMgaW5zdGFuY2UuCi0gKi8KLXB1YmxpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKCkgewotCWlmICh0aGlzLmJ1bmRsZSA9PSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpID09IG51bGwpCi0JCQkJdGhpcy5idW5kbGUgPSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSxnZXRMb2NhbGUoKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5idW5kbGUgPSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSxnZXRMb2NhbGUoKSwgZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJldHJpZXZpbmcgYnVuZGxlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsvLyROT04tTkxTLTEkCi0JCQkJIiB1c2luZyBsb2NhbGU6ICIgKyBnZXRMb2NhbGUoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IC8vIGVuZHRyeQotCX0gLy8gZW5kaWYKLQlyZXR1cm4gdGhpcy5idW5kbGU7Ci19Ci0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAyOjI2OjI0IFBNKQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JcmV0dXJuIGJ1bmRsZU5hbWU7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcykgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5KTsKLQkKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnIFRoZSBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgT2JqZWN0IGFyZ1tdKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXksIGFyZyk7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIE9iamVjdCBhcnJheS4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZyBUaGUgT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIE9iamVjdCBhcmdbXSwgTG9jYWxlIGxvY2FsZSkgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MsIGxvY2FsZSkuZ2V0TWVzc2FnZShrZXksIGFyZyk7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudC4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgU3RyaW5nIGFyZzEpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnMSk7Ci0KLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5LCBhcmcxLCBhcmcyKTsKLQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXksIGFyZzEsIGFyZzIsIGFyZzMpOwotCQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KSB7Ci0KLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0KLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc1IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA1LgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywKLQkJCQkJCSBTdHJpbmcgYXJnMSwgCi0JCQkJCQkgU3RyaW5nIGFyZzIsIAotCQkJCQkJIFN0cmluZyBhcmczLCAKLQkJCQkJCSBTdHJpbmcgYXJnNCwgCi0JCQkJCQkgU3RyaW5nIGFyZzUpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwKLQkJCQkJCSBhcmcxLCAKLQkJCQkJCSBhcmcyLCAKLQkJCQkJCSBhcmczLCAKLQkJCQkJCSBhcmc0LCAKLQkJCQkJCSBhcmc1KTsKLQkKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcywgbG9jYWxlKS5nZXRNZXNzYWdlKGtleSk7Ci0JCi19Ci0vKioKLSAqIEdldCB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIHByb3BlcnR5IGZpbGUuCi0gKgotICogQHJldHVybiBUaGUgcmVzb3VyY2UgaGFuZGxlciBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgc3RhdGljIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIGdldEhhbmRsZXIoU3RyaW5nIGZpbGVOYW1lLCBDbGFzcyBhQ2xhc3MpIHsKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSxhQ2xhc3MsTG9jYWxlLmdldERlZmF1bHQoKSk7Ci19Ci0vKioKLSAqIEdldCB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIHByb3BlcnR5IGZpbGUuCi0gKgotICogQHJldHVybiBUaGUgcmVzb3VyY2UgaGFuZGxlciBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgc3RhdGljIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIGdldEhhbmRsZXIoU3RyaW5nIGZpbGVOYW1lLCBDbGFzcyBhQ2xhc3MsIExvY2FsZSBsb2NhbGUpIHsKLQlTdHJpbmcgaGFuZGxlcktleSA9IGdldEhhbmRsZXJLZXkoZmlsZU5hbWUsIGxvY2FsZSk7Ci0JaWYgKGhhbmRsZXJzLmdldChoYW5kbGVyS2V5KSA9PSBudWxsKSB7Ci0JCUoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIHRlbXAgPSBuZXcgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIobG9jYWxlKTsKLQkJdGVtcC5zZXRSZXNvdXJjZUNsYXNzTG9hZGVyKGFDbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQkJdGVtcC5zZXRCdW5kbGVOYW1lKGZpbGVOYW1lKTsKLQkJaGFuZGxlcnMucHV0KGhhbmRsZXJLZXksdGVtcCk7Ci0JfQotCQotCXJldHVybiAoSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIpKGhhbmRsZXJzLmdldChoYW5kbGVyS2V5KSk7Ci19Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIYW5kbGVyS2V5KFN0cmluZyBfYmFzZU5hbWUsIExvY2FsZSBsb2NhbGUpIHsKLQlTdHJpbmdCdWZmZXIgbG9jYWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIl8iKS5hcHBlbmQobG9jYWxlLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQlpZiAobG9jYWxlLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JICBsb2NhbGVOYW1lLnNldExlbmd0aCgwKTsKLQlyZXR1cm4gX2Jhc2VOYW1lICsgbG9jYWxlTmFtZS50b1N0cmluZygpOwotICB9ICAgICAgCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzI2LzIwMDEgMTowNDo1MCBQTSkKLSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpIHsKLQlyZXR1cm4gcmVzb3VyY2VDbGFzc0xvYWRlcjsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvMjYvMjAwMSAxOjA0OjUwIFBNKQotICogQHBhcmFtIG5ld1Jlc291cmNlQ2xhc3NMb2FkZXIgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0gKi8KLXB1YmxpYyB2b2lkIHNldFJlc291cmNlQ2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld1Jlc291cmNlQ2xhc3NMb2FkZXIpIHsKLQlyZXNvdXJjZUNsYXNzTG9hZGVyID0gbmV3UmVzb3VyY2VDbGFzc0xvYWRlcjsKLX0KLQotLyoqCi0gKiBTZXR0ZXIgZm9yIHRoZSBsb2NhbGUgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIFRoZSBsb2NhbGUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0JdGhpcy5sb2NhbGUgPSBsb2NhbGU7Ci19Ci0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAyOjI2OjI0IFBNKQotICogQHBhcmFtIG5ld0J1bmRsZU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgdm9pZCBzZXRCdW5kbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3QnVuZGxlTmFtZSkgewotCWJ1bmRsZU5hbWUgPSBuZXdCdW5kbGVOYW1lOwotfQotCi0KLS8qKgotICogR2V0dGVyIGZvciB0aGUgbG9jYWxlIHByb3BlcnR5LgotICoKLSAqIEByZXR1cm4gVGhlIGxvY2FsZS4KLSAqLwotcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0JaWYgKGxvY2FsZSA9PSBudWxsKQotCQlsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCXJldHVybiBsb2NhbGU7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKi8KLQotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJdGVtcCA9IGdldEJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFycmF5LgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZyBUaGUgT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3QgYXJnW10pIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJdGVtcCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEJ1bmRsZSgpLmdldFN0cmluZyhrZXkpLCBhcmcpOwotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcxKSB7Ci0KLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKGFyZzEgIT0gbnVsbCkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFsxXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXksIG1zZ29iaik7Ci0JCX0gCi0JCWVsc2UgewotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5KTsKLQkJfQotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7Ci0JU3RyaW5nIHRlbXAgPSBudWxsOwotCXRyeSB7Ci0JCWlmICgoYXJnMSAhPSBudWxsKSAmJiAoYXJnMiAhPSBudWxsKSkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFsyXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCi19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMy4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKSB7Ci0JU3RyaW5nIHRlbXAgPSBudWxsOwotCXRyeSB7Ci0JCWlmICgoYXJnMSAhPSBudWxsKSAmJiAoYXJnMiAhPSBudWxsKSAmJiAoYXJnMyAhPSBudWxsKSkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFszXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJbXNnb2JqWzJdID0gYXJnMzsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSwgbXNnb2JqKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXkpOwotCQl9Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLQkKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpICYmIChhcmczICE9IG51bGwpICYmIChhcmc0ICE9IG51bGwpKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzRdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCW1zZ29ialsxXSA9IGFyZzI7Ci0JCQltc2dvYmpbMl0gPSBhcmczOwotCQkJbXNnb2JqWzNdID0gYXJnNDsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSwgbXNnb2JqKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXkpOwotCQl9Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc1IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA1LgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksCi0JCQkJCQkgU3RyaW5nIGFyZzEsIAotCQkJCQkJIFN0cmluZyBhcmcyLCAKLQkJCQkJCSBTdHJpbmcgYXJnMywgCi0JCQkJCQkgU3RyaW5nIGFyZzQsIAotCQkJCQkJIFN0cmluZyBhcmc1KSB7Ci0KLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpICYmIChhcmczICE9IG51bGwpICYmIAotCQkJCShhcmc0ICE9IG51bGwpICYmIChhcmc1ICE9IG51bGwpICkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFs1XTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJbXNnb2JqWzJdID0gYXJnMzsKLQkJCW1zZ29ialszXSA9IGFyZzQ7Ci0JCQltc2dvYmpbNF0gPSBhcmc1OwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjg0YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgzLzkvMjAwMSAzOjM0OjM5IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiwgSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXByb3RlY3RlZCBJUmVwb3J0ZXIgX3JlcG9ydGVyOwotCXByb3RlY3RlZCBJVmFsaWRhdGlvbkNvbnRleHQgX2hlbHBlcjsKLQlwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXMgPSBPS19TVEFUVVM7Ci0KLQotCXB1YmxpYyBKMkVFVmFsaWRhdG9yKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFtIDxlbT5lcnJvcjwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbXNnSWQpIHsKLQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbSA8ZW0+ZXJyb3I8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKSB7Ci0JCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBtc2dBcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW0gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkKSB7Ci0JCWFkZEVycm9yKG1zZ0NhdGVnb3J5LCBtc2dJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIDxlbT5lcnJvcjwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MpIHsKLQkJdGhpcy5hZGRFcnJvcihidW5kbGVOYW1lLCBtc2dJZCwgbXNnQXJncywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIDxlbT5lcnJvcjwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQpIHsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoYnVuZGxlTmFtZSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGJ1bmRsZU5hbWUsIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZ0lkLCBtc2dBcmdzLCB0YXJnZXQpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgbGluZU51bWJlcikgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoYnVuZGxlTmFtZSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCi0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9jYWxpemVkRXJyb3IoU3RyaW5nIG1zZywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2csIHRhcmdldCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRFcnJvcihTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0LCBpbnQgbGluZU51bWJlcikgewotCQlhZGRMb2NhbGl6ZWRFcnJvciggbXNnLCB0YXJnZXQsIG51bGwsIGxpbmVOdW1iZXIgKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTG9jYWxpemVkRXJyb3IoU3RyaW5nIG1zZywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGxpbmVOdW1iZXIpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoIGdyb3VwTmFtZSApOwotCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRFcnJvcihTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2csIHRhcmdldCk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKCBncm91cE5hbWUgKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBtc2dJZCkgewotCQlhZGRJbmZvKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW4gPGVtPmluZm9ybWF0aW9uYWw8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBtc2dBcmdzCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykgewotCQlhZGRJbmZvKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBtc2dBcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW4gPGVtPmluZm9ybWF0aW9uYWw8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnQ2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkSW5mbyhTdHJpbmcgbXNnQ2F0ZWdvcnksIFN0cmluZyBtc2dJZCkgewotCQlhZGRJbmZvKG1zZ0NhdGVnb3J5LCBtc2dJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIDxlbT5pbmZvcm1hdGlvbmFsPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkSW5mbyhTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKSB7Ci0JCWFkZEluZm8oYnVuZGxlTmFtZSwgbXNnSWQsIG1zZ0FyZ3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEluZm8oU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTWVzc2FnZShidW5kbGVOYW1lLCBJTWVzc2FnZS5MT1dfU0VWRVJJVFksIG1zZ0lkLCBtc2dBcmdzLCB0YXJnZXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRJbmZvKFN0cmluZyBtc2csIE9iamVjdCB0YXJnZXQpIHsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBtc2csIHRhcmdldCkpOwotCX0JCi0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEgPGVtPndhcm5pbmc8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbXNnSWQpIHsKLQkJYWRkV2FybmluZyhnZXRCYXNlTmFtZSgpLCBtc2dJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEgPGVtPndhcm5pbmc8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBtc2dBcmdzCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykgewotCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBtc2dBcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkKSB7Ci0JCWFkZFdhcm5pbmcobXNnQ2F0ZWdvcnksIG1zZ0lkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykgewotCQlhZGRXYXJuaW5nKGJ1bmRsZU5hbWUsIG1zZ0lkLCBtc2dBcmdzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTWVzc2FnZShidW5kbGVOYW1lLCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIG1zZ0lkLCBtc2dBcmdzLCB0YXJnZXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGJ1bmRsZU5hbWUsIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsaXplZFdhcm5pbmcoU3RyaW5nIG1zZywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIG1zZywgdGFyZ2V0KSk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZExvY2FsaXplZFdhcm5pbmcoU3RyaW5nIG1zZywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBtc2csIHRhcmdldCk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCX0JCi0JCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuCi0JICogQGRlcHJlY2F0ZWQgVXNlIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0JCV9yZXBvcnRlciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIElmIGNsZWFudXAgd2lsbCB0YWtlIHNvbWUgdGltZSwgdGhlCi0JICogSVZhbGlkYXRvciBzaG91bGQgcmVwb3J0IHN1YnRhc2sgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgdGhyb3VnaCB0aGUgSVJlcG9ydGVyIHBhcmFtZXRlci4gVGhlCi0JICogQVJlcG9ydGVyIHBhcmFtZXRlciB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCV9yZXBvcnRlciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBVSS4gVGhlIFZhbGlkYXRpb25CdWlsZGVyCi0JICogdXNlcyB0aGlzIHN0cmluZyBhcyBpbnB1dCB0byB0aGUgSVByb2dyZXNzTW9uaXRvci4gaS5lLiwgQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIHZhbGlkYXRpb24KLQkgKiBwcm9jZXNzLCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyIHdpbGwgb3V0cHV0IHRoaXMgc3RyaW5nOiAiezB9IGlzIHZhbGlkYXRpbmcgezF9LiIsIHdoZXJlIHswfQotCSAqIGlzIHRoZSBzdHJpbmcgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLCBhbmQgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXQxUGFyYW0oU3RyaW5nIHN0cmluZzEpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXJldHVybiBwYXJtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldDJQYXJhbShTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXBhcm1zWzFdID0gc3RyaW5nMjsKLQkJcmV0dXJuIHBhcm1zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFZhbGlkYXRvciwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuIFRoZSBWYWxpZGF0aW9uQnVpbGRlcgotCSAqIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8gdGhlIElQcm9ncmVzc01vbml0b3IuIGkuZS4sIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uCi0JICogcHJvY2VzcywgdGhlIFZhbGlkYXRpb24gQnVpbGRlciB3aWxsIG91dHB1dCB0aGlzIHN0cmluZzogInswfSBpcyB2YWxpZGF0aW5nIHsxfS4iLCB3aGVyZSB7MH0KLQkgKiBpcyB0aGUgc3RyaW5nIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucywgYW5kIHsxfSBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0M1BhcmFtKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXBhcm1zWzFdID0gc3RyaW5nMjsKLQkJcGFybXNbMl0gPSBzdHJpbmczOwotCQlyZXR1cm4gcGFybXM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW5zd2VyIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmVyLgotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsb2NhbGl6ZWQgbWVzc2FnZSBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2VOYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgKGZpbGVuYW1lIG1pbnVzIGFueSBsb2NhbGUgc3VmZml4KQotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIGtleSBvZiB0aGUgbWVzc2FnZSB0byBsb29rdXAgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBtc2dBcmdzCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIGludG8gYW55IG1lc3NhZ2UgYXJndW1lbnRzIGluIHRoZQotCSAqICAgICAgICAgICAgbWVzc2FnZSdzIHZhbHVlLgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdG8gcmV0cmlldmUgdGhlIG1lc3NhZ2UgdGV4dCBmcm9tLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnQ2F0ZWdvcnksIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShtc2dDYXRlZ29yeSwgbXNnSWQsIGdldENsYXNzKCksIG1zZ0FyZ3MsIGxvY2FsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxvY2FsaXplZCBtZXNzYWdlIGZyb20gYSByZXNvdXJjZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZU5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSAoZmlsZW5hbWUgbWludXMgYW55IGxvY2FsZSBzdWZmaXgpCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUga2V5IG9mIHRoZSBtZXNzYWdlIHRvIGxvb2t1cCBmcm9tIHRoZSBidW5kbGUuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSB0byByZXRyaWV2ZSB0aGUgbWVzc2FnZSB0ZXh0IGZyb20uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKG1zZ0NhdGVnb3J5LCBtc2dJZCwgZ2V0Q2xhc3MoKSwgbG9jYWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6Ci0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICAmcXVvdDt7MH0gaXMgdmFsaWRhdGluZyB7MX0uJnF1b3Q7LAotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwPgotCSAqIHdoZXJlCi0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICB7MH0gaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsCi0JICogPC9wcmU+Ci0JICogCi0JICogPHA+Ci0JICogYW5kCi0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBuYW1lIHRleHQuCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZShnZXRCYXNlTmFtZSgpLCBWQUxJREFUT1JfTkFNRSwgbG9jYWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcmFtMShTdHJpbmcgc3RyaW5nMSkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCXBhcm1zWzBdID0gc3RyaW5nMTsKLQkJcmV0dXJuIHBhcm1zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIERlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIE1PRiBtb2RlbC4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5oZWxwZXI8L2NvZGU+IGFuZCA8Y29kZT5yZXBvcnRlcjwvY29kZT4gbWF5IG5vdCBiZSBudWxsLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+Ci0JICogbWF5IGJlIG51bGwsIGlmIGEgZnVsbCBidWlsZCBpcyBkZXNpcmVkLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gbG9hZHMgYSBFT2JqZWN0LiBUaGUgRU9iamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgTU9GIG1vZGVsIGFib3V0IHRvIGJlCi0JICogdmFsaWRhdGVkLiBXaGVuIHRoaXMgb2JqZWN0IGlzIHRyYXZlcnNlZCwgeW91IGNhbiByZWFjaCBldmVyeSBlbGVtZW50IGluIHRoZSBNT0YgbW9kZWwgd2hpY2gKLQkgKiBuZWVkcyB0byBiZSB2YWxpZGF0ZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yCi0JICogaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+IGlzIGFuIGFycmF5IG9mIGZpbGUgbmFtZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0Ci0JICogdmFsaWRhdGlvbi4gSWYgPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBudWxsLCBvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSwgdGhlbiBhIGZ1bGwKLQkgKiBidWlsZCBpcyBwZXJmb3JtZWQuIE90aGVyd2lzZSwgdmFsaWRhdGlvbiBvbiBqdXN0IHRoZSBmaWxlcyBsaXN0ZWQgaW4gdGhlIFZlY3RvciBpcwotCSAqIHBlcmZvcm1lZC4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCSAgX2hlbHBlciA9IGluSGVscGVyOwotCQkgIF9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0JCSAgaWYgKChpbkhlbHBlciA9PSBudWxsKSB8fCAoaW5SZXBvcnRlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQkgIH0JCQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotCQlfaGVscGVyID0gaW5IZWxwZXI7Ci0JCV9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0JCXN0YXR1cyA9IE9LX1NUQVRVUzsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhFamJSZWYgZXJlZiwgU3RyaW5nIG93bmVyTmFtZSkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCXBhcm1zWzBdID0gZXJlZi5nZXROYW1lKCk7Ci0JCXBhcm1zWzFdID0gb3duZXJOYW1lOwotCi0JCWlmICgoZXJlZi5nZXROYW1lKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUsIHBhcm1zLCBlcmVmKTsKLQkJaWYgKGVyZWYuaXNTZXRUeXBlKCkpIHsKLQkJCWlmIChlcmVmLmdldFR5cGUoKSA9PSBudWxsKQotCQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUsIHBhcm1zKTsKLQkJfSBlbHNlCi0JCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFLCBwYXJtcyk7Ci0KLQkJU3RyaW5nIHJlZkhvbWUgPSBlcmVmLmdldEhvbWUoKTsKLQkJaWYgKChyZWZIb21lID09IG51bGwpIHx8IChyZWZIb21lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcm1zLCBlcmVmKTsKLQotCQlpZiAoKGVyZWYuZ2V0UmVtb3RlKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0UmVtb3RlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKQotCQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJtcywgZXJlZik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVzb3VyY2VSZWZzKExpc3QgcmVzb3VyY2VSZWZzKSB7Ci0KLQkJaW50IG51bVJlZnMgPSByZXNvdXJjZVJlZnMuc2l6ZSgpOwotCQlTZXQgcmVmU2V0ID0gbmV3IEhhc2hTZXQobnVtUmVmcyk7Ci0KLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCVN0cmluZyByZWZOYW1lID0gKChSZXNvdXJjZVJlZkltcGwpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSkpLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKHJlZlNldC5hZGQocmVmTmFtZSkpKQotCQkJCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGLCBwYXJtcywgcmVzb3VyY2VSZWZzLmdldChyZWZObykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGV4aXN0YW5jZSBvZiBXZWIgUm9sZXMgd2l0aGluIHRoZSBFQVIgUm9sZXMgYW5kIGR1cGxpY2F0ZXMgaW4gV2ViIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlV0VCUm9sZXNXaXRoRUFSUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QsIEVMaXN0IHdhclJvbGVzKSB7Ci0JCWludCBudW1Sb2xlcyA9IHdhclJvbGVzLnNpemUoKTsKLQotCQkvLyBURkIgVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBhICdzbWFsbCcgbGlzdCBvZiB3YXJSb2xlcy4KLQkJLy8gSWYgJ3dhclJvbGVzJyBnZXRzIHRvbyBiaWcgdGhlbiBhbm90aGVyIGltcGxlbWVudGF0aW9uCi0JCS8vIHdpbGwgYmUgbmVjZXNzYXJ5LgotCi0JCWZvciAoaW50IHJvbGVObyA9IDA7IHJvbGVObyA8IG51bVJvbGVzOyByb2xlTm8rKykgewotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlTZWN1cml0eVJvbGVJbXBsIG5leHRSb2xlID0gKFNlY3VyaXR5Um9sZUltcGwpICh3YXJSb2xlcy5nZXQocm9sZU5vKSk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IG5leHRSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCQlpZiAoIShlYXJSb2xlTGlzdC5jb250YWlucyhuZXh0Um9sZSkpKQotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFybXMsIG5leHRSb2xlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4OTFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZURyaXZlbkJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5tYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOLCBKQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgSVNfUkVNT1RFID0gTkVJVEhFUjsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtPTk1FU1NBR0UsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgT05NRVNTQUdFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEVfTk9QQVJNLCBFSkJDUkVBVEUsIEVKQlJFTU9WRV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTX07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX29uTWVzc2FnZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0NStCRVhULCBDSEtKMjQ0NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0NiwgbmV3IFN0cmluZ1tde0NIS0oyNDQ2K0JFWFQsIENIS0oyNDQ2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQ3LCBuZXcgU3RyaW5nW117Q0hLSjI0NDcrQkVYVCwgQ0hLSjI0NDcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDFfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDFfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAxX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDFfZWpiUmVtb3ZlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAxX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAxX29uTWVzc2FnZStCRVhULCBDSEtKMjUwMV9vbk1lc3NhZ2UrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDNfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDVfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93RWpiQ3JlYXRlUmV0dXJuVHlwZVJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5pc1ZvaWQoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlZPSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgT05NRVNTQUdFKSA9PSBPTk1FU1NBR0UpIHsKLQkJCXZhbGlkYXRlT25NZXNzYWdlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24obWV0aG9kLCBiZWFuKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAxX2VqYlJlbW92ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpIHsKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIENyZWF0ZUV4Y2VwdGlvbgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHx8IChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpKXsJCQotCQkJSmF2YUNsYXNzIGpjbGFzcyA9ICgoTWVzc2FnZURyaXZlbiliZWFuKS5nZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLQkJCQlpZiAoamNsYXNzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVIpKXsKLQkJCQkJc3VwZXIudmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXModmMsYmVhbixjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLmVqYjIwcnVsZXMuaW1wbC5BVHlwZVZSdWxlI3ZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZigoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB8fCAoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKSl7CQkKLQkJCUphdmFDbGFzcyBqY2xhc3MgPSAoKE1lc3NhZ2VEcml2ZW4pYmVhbikuZ2V0TWVzc2FnaW5nVHlwZSgpOwotLy8JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLS8vCQkJCWlmIChqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUikpewotLy8JCQkJICAgIHN1cGVyLnZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWlmKCBqY2xhc3MgPT0gbnVsbCB8fCBqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUikpewotCQkJCSAgICBzdXBlci52YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdCh2YywgYmVhbiwgY2xhenopOwotCQkJfQotCQl9Ci0gICAgICAKLSAgICB9Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVPbk1lc3NhZ2VNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM5NiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk5ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gUmVhZCBzZWN0aW9uIDE1LjcuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDQwMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X29uTWVzc2FnZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9vbk1lc3NhZ2UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfb25NZXNzYWdlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxNjRhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VVdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19NRVNTQUdFX0lEID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlVXRpbGl0eSBpbnN0ID0gbnVsbDsKLQotCXByaXZhdGUgTWVzc2FnZVV0aWxpdHkoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cE5hbWUoT2JqZWN0IHRhcmdldFBhcmVudCkgewotCQlpZih0YXJnZXRQYXJlbnQgPT0gbnVsbCkgewotCQkJLy8gTm8gY29udGV4dCB0byBhc3NvY2lhdGUgdGhlIG1lc3NhZ2Ugd2l0aAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIFNvIGZhciwgdGhlIG9ubHkgdGFyZ2V0IHBhcmVudCB3aGljaCBpcyB1c2VkIGFzIGEgZ3JvdXAgbmFtZSBpcyB0aGUgRW50ZXJwcmlzZUJlYW4KLQkJaWYodGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJlYW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYmVhbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKChYTUlSZXNvdXJjZSliZWFuLmVSZXNvdXJjZSgpKS5nZXRJRChiZWFuKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZUlkKE9iamVjdCBtZXNzYWdlTnVtYmVyLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IC0xOwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IChTdHJpbmdbXSlpZHMuZ2V0KG1lc3NhZ2VOdW1iZXIpOwotCQlpZihyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmKHJlc3VsdC5sZW5ndGggPT0gMSkgewotCQkJaWYocmVzdWx0WzBdLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0WzBdOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gQnkgY29udmVudGlvbiwgdGhpcyBpcyB0aGUgb3JkZXIgb2YgdGhlIGVudHJpZXMgaW4gdGhlIFN0cmluZ1tdCi0JCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJaW5kZXggPSAwOwotCQkJfQotCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJaW5kZXggPSAxOwotCQkJfQotCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWluZGV4ID0gMjsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCWluZGV4ID0gMzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdoYXQgdGhlIGhlY2sgaXMgaXQ/Ci0JCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkKLQkJCWlmKChyZXN1bHQubGVuZ3RoIDw9IGluZGV4KSB8fCAocmVzdWx0W2luZGV4XS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdFtpbmRleF07Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBub3QgcmVnaXN0ZXJlZCBvbiBhIG1ldGhvZC4KLQkgKi8JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlSWQoT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCWlmKG1lc3NhZ2VOdW1iZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5PX01FU1NBR0VfSUQ7Ci0JCX0KLQkJCi0JCU1hcCBpZHMgPSBydWxlLmdldE1lc3NhZ2VJZHMoKTsKLQkJaWYoKGlkcyA9PSBudWxsKSB8fCAoaWRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcmVzdWx0ID0gKFN0cmluZ1tdKWlkcy5nZXQobWVzc2FnZU51bWJlcik7Ci0JCWlmKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5sZW5ndGggPT0gMCkgfHwgKHJlc3VsdFswXS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCQotCS8qCi0JICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcmVnaXN0ZXJlZCBvbiBhIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2VJZChPYmplY3QgbWVzc2FnZU51bWJlciwgSVZhbGlkYXRpb25SdWxlIHJ1bGUsIGJvb2xlYW4gaXNNZXRob2RPbkNsYXNzKSB7Ci0JCWlmKG1lc3NhZ2VOdW1iZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5PX01FU1NBR0VfSUQ7Ci0JCX0KLQkJCi0JCU1hcCBpZHMgPSBydWxlLmdldE1lc3NhZ2VJZHMoKTsKLQkJaWYoKGlkcyA9PSBudWxsKSB8fCAoaWRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSAoU3RyaW5nW10paWRzLmdldChtZXNzYWdlTnVtYmVyKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmKG1lc3NhZ2VzICE9IG51bGwpIHsKLQkJCWlmKGlzTWV0aG9kT25DbGFzcyAmJiBtZXNzYWdlcy5sZW5ndGggPT0gMikgewotCQkJCXJlc3VsdCA9IG1lc3NhZ2VzWzFdOwotCQkJfQotCQkJZWxzZSBpZiAobWVzc2FnZXMubGVuZ3RoID49IDEpIHsKLQkJCQlyZXN1bHQgPSBtZXNzYWdlc1swXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgaW50IHNldmVyaXR5LCBTdHJpbmcgaWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQltZXNzYWdlLnNldElkKGlkKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMocGFybXMpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdCh0YXJnZXQpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqIAotCSAqIEZvciB1c2Ugb25seSBieSB0aGUgREQgVlJ1bGVzLgotCSAqLwotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCSmFyIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlUmVmIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kRWxlbWVudCB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZFRyYW5zYWN0aW9uIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kUGVybWlzc2lvbiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uc2hpcFJvbGUgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCUmVsYXRpb24gdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBBc3NlbWJseURlc2NyaXB0b3IgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JLyoqIAotCSAqIEZvciB1c2Ugb25seSBieSB0aGUgREQgVlJ1bGVzLgotCSAqLwotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCSmFyIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBNZXRob2RFbGVtZW50IHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBTZWN1cml0eVJvbGVSZWYgdGFyZ2V0LCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBPYmplY3QgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIE9iamVjdCB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgYmVhbiwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIGJlYW4sIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIGJlYW4sIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgYmVhbiwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCBjbGF6eiwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIGFkZGl0aW9uYWxQYXJtcywgY2xhenosIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgbnVsbCwgY2xhenosIG1ldGhvZCwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIG1ldGhvZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgYWRkaXRpb25hbFBhcm1zLCBydWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBtZXRob2QsIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkJCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGJlYW4sIGNsYXp6LCBydWxlKTsKLQkJfQotCQkKLQkJLy9yZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIG51bGwsIGNsYXp6LCBmaWVsZCwgZmllbGQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgZmllbGQpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCQlTdHJpbmcgW10gYWRkaXRpb25hbFBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJYWRkaXRpb25hbFBhcm1zWzBdID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLmdldEphdmFOYW1lKCk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgZmllbGQsIGZpZWxkLmdldE5hbWUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIGZpZWxkKSwgZ2V0R3JvdXBOYW1lKGJlYW4pLCBydWxlKTsKLQl9Ci0JCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGJlYW4sIGNsYXp6LCBhZGRpdGlvbmFsUGFybXMsIHJ1bGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGFkZGl0aW9uYWxQYXJtcywgY2xhenosIGZpZWxkLCBmaWVsZC5nZXROYW1lKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBKYXZhQ2xhc3MgY2xhenosIEVPYmplY3QgZmllbGRPck1ldGhvZCwgU3RyaW5nIGZpZWxkT3JNZXRob2ROYW1lLCBib29sZWFuIGlzTWV0aG9kT25DbGFzcywgU3RyaW5nIGdyb3VwTmFtZSwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGRPck1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBncm91cE5hbWUpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSBwYXJtcyA9IG51bGw7Ci0JCUVPYmplY3QgdGFyZ2V0ID0gbnVsbDsKLQkJaWYoaXNNZXRob2RPbkNsYXNzKSB7Ci0JCQkvLyBsZWF2ZSBwYXJtcyBudWxsIHNpbmNlIG5vIHBhcm1zIGFyZSBuZWVkZWQKLQkJCXRhcmdldCA9IGZpZWxkT3JNZXRob2Q7Ci0JCQlwYXJtcyA9IGFkZGl0aW9uYWxQYXJtczsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGFkZGl0aW9uYWxQYXJtcyA9PSBudWxsKSB7Ci0JCQkJcGFybXMgPSBuZXcgU3RyaW5nW117ZmllbGRPck1ldGhvZE5hbWV9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFybXMgPSBuZXcgU3RyaW5nW2FkZGl0aW9uYWxQYXJtcy5sZW5ndGggKyAxXTsKLQkJCQlwYXJtc1swXSA9IGZpZWxkT3JNZXRob2ROYW1lOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25hbFBhcm1zLCAwLCBwYXJtcywgMSwgYWRkaXRpb25hbFBhcm1zLmxlbmd0aCk7Ci0JCQl9Ci0JCQl0YXJnZXQgPSBjbGF6ejsKLQkJfQotCi0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlLCBpc01ldGhvZE9uQ2xhc3MpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBncm91cE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXRob2RVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTlkNmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXRob2RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kVXRpbGl0eSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kVXRpbGl0eSBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nW10gX21ldGhvZFR5cGVJbmRleDsKLQlwcml2YXRlIElNZXRob2RUeXBlW10gX21ldGhvZFR5cGVzOwotCXByaXZhdGUgbG9uZ1tdIF9maWVsZFR5cGVJbmRleDsKLQlwcml2YXRlIElGaWVsZFR5cGVbXSBfZmllbGRUeXBlczsKLQkKLQlwcml2YXRlIE1ldGhvZFV0aWxpdHkoKSB7Ci0JCWJ1aWxkVHlwZUxpc3QoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IE1ldGhvZFV0aWxpdHkoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJTWV0aG9kVHlwZVtdIGdldE1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gX21ldGhvZFR5cGVzOwotCX0KLQotCXB1YmxpYyBJRmllbGRUeXBlIGdldEZpZWxkVHlwZShsb25nIHR5cGUpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChfZmllbGRUeXBlSW5kZXgsIHR5cGUpOwotCQlpZihpbmRleCA+IF9maWVsZFR5cGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluZGV4IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKF9maWVsZFR5cGVzW2luZGV4XS5nZXRJZCgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gX2ZpZWxkVHlwZXNbaW5kZXhdOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kVHlwZSBnZXRNZXRob2RUeXBlKGxvbmcgdHlwZSkgewotCQlpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKF9tZXRob2RUeXBlSW5kZXgsIHR5cGUpOwotCQlpZihpbmRleCA+IF9tZXRob2RUeXBlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfbWV0aG9kVHlwZXNbaW5kZXhdLmdldElkKCkgIT0gdHlwZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBfbWV0aG9kVHlwZXNbaW5kZXhdOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRNZXRob2RUeXBlSWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBnZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBydWxlKTsKLQkJaWYobVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHJ1bGUuZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1UeXBlLmdldElkKCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlSWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSUVKQlR5cGUgcnVsZSkgewotCQlJRmllbGRUeXBlIG1UeXBlID0gZ2V0RmllbGRUeXBlKGJlYW4sIGNsYXp6LCBmaWVsZCwgcnVsZSk7Ci0JCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJCi0JCXJldHVybiBtVHlwZS5nZXRJZCgpOwotCX0KLQkKLQlwdWJsaWMgSUZpZWxkVHlwZSBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSUVKQlR5cGUgcnVsZSkgewotCQlJRmllbGRUeXBlW10ga25vd25GaWVsZFR5cGVzID0gX2ZpZWxkVHlwZXM7Ci0JCWlmKGtub3duRmllbGRUeXBlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8a25vd25GaWVsZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmllbGRUeXBlIG10ID0ga25vd25GaWVsZFR5cGVzW2ldOwotCQkJaWYobXQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc0ZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQpKSB7Ci0JCQkJcmV0dXJuIG10OwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbWV0aG9kcywgd2hpY2ggZHluYW1pY2FsbHktbmFtZWQKLQkJLy8gbWV0aG9kIHR5cGUgaXMgaXQ/Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSU1ldGhvZFR5cGUgZ2V0TWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cywgSUVKQlR5cGUgcnVsZSkgewotCQlsb25nW10ga25vd25NZXRob2RUeXBlcyA9IHJ1bGUuZ2V0S25vd25NZXRob2RUeXBlcygpOwotCQlpZihrbm93bk1ldGhvZFR5cGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlmb3IoaW50IGk9MDsgaTxrbm93bk1ldGhvZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWV0aG9kVHlwZSBtdCA9IGdldE1ldGhvZFR5cGUoa25vd25NZXRob2RUeXBlc1tpXSk7Ci0JCQlpZihtdCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKG10LmlzRGVmYXVsdFR5cGUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc01ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJcmV0dXJuIG10OwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbWV0aG9kcywgd2hpY2ggZHluYW1pY2FsbHktbmFtZWQKLQkJLy8gbWV0aG9kIHR5cGUgaXMgaXQ/Ci0JCXJldHVybiBnZXRNZXRob2RUeXBlKHJ1bGUuZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFR5cGVMaXN0KCkgewotCQlpbnQgdHlwZUNvdW50ID0gMjk7IC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpZGVudGlmaWFibGUgbWV0aG9kcyBpbiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMKLQkJX21ldGhvZFR5cGVJbmRleCA9IG5ldyBsb25nW3R5cGVDb3VudF07Ci0JCV9tZXRob2RUeXBlcyA9IG5ldyBJTWV0aG9kVHlwZVt0eXBlQ291bnRdOwotCQlpbnQgY291bnQgPSAwOwotCQkKLQkJaW50IGZpZWxkVHlwZUNvdW50ID0gMTsgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGlkZW50aWZpYWJsZSBmaWVsZHMgaW4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzCi0JCV9maWVsZFR5cGVJbmRleCA9IG5ldyBsb25nW2ZpZWxkVHlwZUNvdW50XTsKLQkJX2ZpZWxkVHlwZXMgPSBuZXcgSUZpZWxkVHlwZVtmaWVsZFR5cGVDb3VudF07Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJCi0JCS8vIFRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgbG9uZ1tdIGlzIGVxdWFsIHRvIHRoZQotCQkvLyBpbmRleCBvZiB0aGUgSU1ldGhvZFR5cGUgaW4gdGhlIElNZXRob2RUeXBlW10uIEJ5IHVzaW5nCi0JCS8vIHRoaXMgdGVjaG5pcXVlIGluc3RlYWQgb2YgYSBIYXNoTWFwLCB3ZSBkb24ndCBuZWVkIHRvCi0JCS8vIGNyZWF0ZSBhbiBJbnRlZ2VyIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byBsb2NhdGUgdGhlIAotCQkvLyBJTWV0aG9kVHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQUNDRVNTT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQUNDRVNTT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gIiI7IC8vIHRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGV4aXN0cwotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJBQ0NFU1NPUjo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5CVVNJTkVTUzsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5CVVNJTkVTUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGEgYnVzaW5lc3MgbWV0aG9kIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQlVTSU5FU1M6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgYSBidXNpbmVzcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJCVVNJTkVTUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19idXM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2J1c2luZXNzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9idXNpbmVzczsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQkvLyBJdCdzIGEgYnVzaW5lc3MgbWV0aG9kIGlmIGl0J3MgZXhwb3NlZCBvbiB0aGUgY29tcG9uZW50IGludGVyZmFjZS4KLQkJCQkvLyBIQUNLIC4uLiBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgQUJlYW5DbGFzc1ZSdWxlLCBhbmQgaXRzIHN1YnR5cGVzLCBhcmUgdGhlIG9ubHkgY2xhc3NlcyB0aGF0IHdpbGwgZXZlciBoYXZlIGEgQlVTSU5FU1MgbWV0aG9kLgotCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBBQmVhbkNsYXNzVlJ1bGUuZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0vLwkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpICE9IG51bGwpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldExvY2FsQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW50ZXJuYWwgaGVscGVyIG1ldGhvZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DTElOSVQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ0xJTklUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjbGluaXQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiA8Y2xpbml0PiBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ0xJTklUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDTElOSVQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8vIEJlIGNhcmVmdWwgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lIGFzIHRoZXkgYXJlIGluIAotCQkvLyBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuIEVhY2ggbWV0aG9kIHR5cGUgaXMgYW4gYXNjZW5kaW5nIG51bWJlciwgYW5kIGlmIHRoZXkKLQkJLy8gZ28gb3V0IG9mIG9yZGVyLCB0aGUgYmluYXJ5IHNlYXJjaCBjYW4ndCBmaW5kIHRoZSBtZXRob2QgdHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9jb25zdHI7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBjbGF6ei5nZXROYW1lKCkgKyAiKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NvbnN0cjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1JfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJLy8gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQkJCQlpZihtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEU7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NyZWF0ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9jcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfY3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQUNUSVZBVEVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkFDVElWQVRFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiQWN0aXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQWN0aXZhdGU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJBQ1RJVkFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkFDVElWQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkNSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJDcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiQ3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQ1JFQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJGSU5EOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkZpbmQiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJGaW5kOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkRCWVBSSU1BUllLRVk7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCRklOREJZUFJJTUFSWUtFWTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJlamJGaW5kQnlQcmltYXJ5S2V5KCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlKYXZhQ2xhc3MgcGsgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQkJCXBrTmFtZSA9ICgocGsgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBway5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHBrTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJGaW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EQllQUklNQVJZS0VZOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJIT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJIb21lOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiSG9tZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJIb21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkxvYWQoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiTG9hZDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkxPQUQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCTE9BRDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJMT0FEKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUEFTU0lWQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQQVNTSVZBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQYXNzaXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiUGFzc2l2YXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUEFTU0lWQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQQVNTSVZBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUE9TVENSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQT1NUQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQb3N0Q3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQkvLyBDYW4gb25seSBkeW5hbWljYWxseSBjaGVjayBpZiBlamJQb3N0Q3JlYXRlIGlzIG1pc3NpbmcsIAotCQkJCS8vIGJhc2VkIG9uIHdoYXQgdHlwZSBvZiBlamJDcmVhdGUgbWV0aG9kcyBleGlzdC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUE9TVENSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQT1NUQ1JFQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlJFTU9WRV9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUkVNT1ZFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiUmVtb3ZlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlJlbW92ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlJFTU9WRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUkVNT1ZFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNFTEVDVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJTRUxFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlNlbGVjdDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiU2VsZWN0OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNFTEVDVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJTRUxFQ1Q6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU0VMRUNUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQlNFTEVDVCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCU1RPUkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNUT1JFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiU3RvcmUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiU3RvcmU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU1RPUkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVFVQUxTOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVRVUFMUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZXF1YWxzKE9iamVjdCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VxdWFsczsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVRVUFMUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRVFVQUxTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FUVVBTFMpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIG9iamVjdCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1bMF0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihvYmplY3QuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiZmluZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmQ7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklORDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfSAKLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOQUxJWkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkFMSVpFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZmluYWxpemUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGZpbmFsaXplIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZmluYWxpemU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0wKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhBU0hDT0RFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IQVNIQ09ERV9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhhc2hDb2RlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hhc2hDb2RlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkhBU0hDT0RFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9IQVNIQ09ERSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hvbWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiSE9NRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19ob21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5PTk1FU1NBR0U7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuT05NRVNTQUdFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJvbk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX29uTWVzc2FnZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIk9OTUVTU0FHRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiT05NRVNTQUdFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX09OTUVTU0FHRSkpIHsKLQkJCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKYXZhSGVscGVycyBqbXNNZXNzYWdlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFLCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1zWzBdLmdldEphdmFUeXBlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoam1zTWVzc2FnZS5lcXVhbHMocGFybVR5cGUpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VURU5USVRZQ09OVEVYVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVRFTlRJVFlDT05URVhUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0OwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJTRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIGVudGl0eUNvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQsIGJlYW4pOwotCQkJCQkJCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gcGFybVswXS5nZXRKYXZhVHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCWlmKGVudGl0eUNvbnRleHQuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAidW5zZXRFbnRpdHlDb250ZXh0KCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlVOU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiVU5TRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9maWVsZFR5cGVJbmRleFtmaWVsZENvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEOwotCQlfZmllbGRUeXBlc1tmaWVsZENvdW50KytdID0gbmV3IElGaWVsZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1JvbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NDZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlci4KLSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlciBjYW5ub3QgYmUgdXNlZAotICogZGlyZWN0bHkgYnkgdGhlIEVKQiBWYWxpZGF0b3IgKHRvIGNhbGN1bGF0ZSByb2xlIG1ldGhvZCBuYW1lcykgYmVjYXVzZQotICogaXQgdXNlcyBjbGFzc2VzIHdoaWNoIGFyZSBub3QgdXNlZCBieSBXZWJTcGhlcmUuIFVudGlsIHRoZSBsb25nLXRlcm0KLSAqIGZpeCBjYW4gYmUgcHV0IGluLCB0aGlzIGNsYXNzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJvbGVIZWxwZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiA9ICJwcml2YXRlU2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9TGluayI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX05BTUVfUFJFRklYID0gImFkZCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUVEVSX05BTUVfUFJFRklYID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9OQU1FX1BSRUZJWCA9ICJyZW1vdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9BRERfTkFNRV9QUkVGSVggPSAic2Vjb25kYXJ5QWRkIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYID0gInNlY29uZGFyeVJlbW92ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1NFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZWNvbmRhcnlTZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXI7Ci0vKioKLSAqIFJvbGVIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFJvbGVIZWxwZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQ29sbGVjdCB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBiZWFuIGNsYXNzCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHJvbGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0Um9sZU1ldGhvZE5hbWVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIExpc3QgYUxpc3QpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCB8fCBhTGlzdCA9PSBudWxsKSByZXR1cm47Ci0JYUxpc3QuYWRkKGdldExpbmtHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JaWYgKGFSb2xlLmlzRm9yd2FyZCgpKSB7Ci0JCWFMaXN0LmFkZChnZXRLZXlHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRLZXlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JfQotCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKQotCQlhTGlzdC5hZGQoZ2V0R2V0dGVyTmFtZShhUm9sZSkpOwotCWlmICghaXNNYW55KGFSb2xlKSkgewotCQl0cnkgewotCQkJaWYoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzS2V5KCkpCi0JCQkJCWFMaXN0LmFkZChnZXRTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJaWYgKCFhUm9sZS5pc0tleSgpKSB7Ci0JCQkJCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBjYXVnaHQsIGFzc3VtZSB0aGF0IHRoZSByb2xlIGlzbid0IGEga2V5LgotCQkJLy8gSnVzdCBjb250aW51ZS4KLQkJfQotCX0gZWxzZSB7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlBZGROYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmKGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNLZXkoKSkgewotCQkJCQkJYUxpc3QuYWRkKGdldEFkZE5hbWUoYVJvbGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIElmIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBvcHBvc2l0ZSBpc24ndCBhIGtleS4KLQkJCX0KLQkJCWlmIChhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpICE9IG51bGwgJiYgIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNSZXF1aXJlZCgpKQotCQkJCWFMaXN0LmFkZChnZXRSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhU3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZC4KLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlyc3RBc1VwcGVyY2FzZShTdHJpbmcgYVN0cmluZykgewotCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+MCAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGFTdHJpbmcuY2hhckF0KDApKSkgewotCQljaGFyW10gY2hhcnMgPSBhU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoYXJzKTsKLQl9Ci0JcmV0dXJuIGFTdHJpbmc7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZ1tdIHJlcGxhY2VtZW50cykgewotCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgcmVwbGFjZW1lbnRzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBhZGQgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiYWRke2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogYWRkRGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRkTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEFERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBnZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiZ2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogZ2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEdFVFRFUl9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUtleSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIGdldERlcGFydG1lbnRLZXkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUdldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthcmd9KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInByaXZhdGVTZXR7YVJvbGUgbmFtZX1LZXkiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBwcml2YXRlU2V0RGVwYXJ0bWVudEtleS4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIGZvcm1hdChLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FyZ30pOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGxpbmsgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUxpbmsiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBnZXREZXBhcnRtZW50TGluay4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua0dldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoTElOS19HRVRURVJfTkFNRV9QQVRURVJOLCBuZXcgU3RyaW5nW117YXJnfSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBSRU1PVkVfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2Vjb25kYXJ5IGFkZCBtZXRob2QgbmFtZSBmb3IgQGFSb2xlLgotICogSXQgd2lsbCBiZSBpbiB0aGUgZm9ybWF0ICJzZWNvbmRhcnlBZGR7YVJvbGUgbmFtZX0iLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBzZWNvbmRhcnlBZGREZXBhcnRtZW50LgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWNvbmRhcnlBZGROYW1lKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JU3RyaW5nIGFyZyA9IGZpcnN0QXNVcHBlcmNhc2UoYVJvbGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gU0VDT05EQVJZX0FERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBzZWNvbmRhcnkgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNlY29uZGFyeVJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNlY29uZGFyeVJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlY29uZGFyeVJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYICsgYXJnOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZGFyeSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAic2Vjb25kYXJ5U2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogc2Vjb25kYXJ5U2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIFNFQ09OREFSWV9TRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNldHthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNldERlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgaXMgbWFueS4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFueShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JcmV0dXJuIGFSb2xlICE9IG51bGwgJiYgYVJvbGUuaXNNYW55KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhmMDBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNmYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9TRVNTSU9OQkVBTn07Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSB0cnVlOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RUpCQ1JFQVRFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkFMSVpFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENPTlNUUlVDVE9SX05PUEFSTSwgQ09OU1RSVUNUT1IsIEVKQkNSRUFURSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwM0ksIG5ldyBTdHJpbmdbXXtDSEtKMjAwM0krU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJDcmVhdGUgKyBTTVNTR0lEICsgU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHN0YXRlZnVsIG1lc3NhZ2UgZGlmZmVycyBmcm9tIHN0YXRlbGVzcyBtZXNzYWdlKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MiwgbmV3IFN0cmluZ1tde0NIS0oyNDUyK0JFWFQsIENIS0oyNDUyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUzLCBuZXcgU3RyaW5nW117Q0hLSjI0NTMrQkVYVCwgQ0hLSjI0NTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKLQkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gTkVJVEhFUjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLlZPSUQsIGJlYW4pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5WT0lEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiAKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuZWpiMjAucnVsZXMuSUNsYXNzVlJ1bGUjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pYmVhbjsKLQkJYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU3RhdGVmdWwgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KHNlc3Npb24pICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0JlYW5NYW5hZ2VkU2Vzc2lvbihzZXNzaW9uKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWZ1bChzZXNzaW9uKSk7Ci0KLQkJaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJSmF2YUhlbHBlcnMgc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pOwotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldEVqYkNsYXNzKCksIHNzKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDAzSSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRFamJDbGFzcygpKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoZS5nZXRKYXZhQ2xhc3MoKSl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YTMyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zbGMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2ZDBiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNGTVNTR0lEID0gIi5zZmxoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY3JlYXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrU0ZNU1NHSUQrT05fQkFTRStTUEVDLCBDSEtKMjQwMitTRk1TU0dJRCtPTl9USElTK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChkaWZmIHN0cmluZyB0aGFuIHN0YXRlbGVzcyBiZWFuKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdkMzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMzQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkhvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0ZNU1NHSUQgPSAiLnNmcmgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEV9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NGTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU0ZNU1NHSUQrT05fVEhJUytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWExMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc2IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfU0VTU0lPTkJFQU59OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RUpCQ1JFQVRFX05PUEFSTSwgQ09OU1RSVUNUT1JfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQkNSRUFURV9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTSwgQlVTSU5FU1N9OwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSB0cnVlOwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzRSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzRStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIyLCBuZXcgU3RyaW5nW117Q0hLSjIwMjIrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStTTVNTR0lEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMStCRVhULCBDSEtKMjQyMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMiwgbmV3IFN0cmluZ1tde0NIS0oyNDIyK0JFWFQsIENIS0oyNDIyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIzLCBuZXcgU3RyaW5nW117Q0hLSjI0MjMrQkVYVCwgQ0hLSjI0MjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNCtCRVhULCBDSEtKMjQyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNiwgbmV3IFN0cmluZ1tde0NIS0oyNDI2K0JFWFQsIENIS0oyNDI2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI3LCBuZXcgU3RyaW5nW117Q0hLSjI0MjcrQkVYVCwgQ0hLSjI0MjcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQyOCtCRVhULCBDSEtKMjQyOCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MitCRVhULCBDSEtKMjQ1MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MywgbmV3IFN0cmluZ1tde0NIS0oyNDUzK0JFWFQsIENIS0oyNDUzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc2LCBuZXcgU3RyaW5nW117Q0hLSjI0NzYrU01TU0dJRCArIE9OX0JBU0UrU1BFQywgQ0hLSjI0NzYrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkyLCBuZXcgU3RyaW5nW117Q0hLSjI0OTIrQkVYVCwgQ0hLSjI0OTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9BQlNUUkFDVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9GSU5BTDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfUFVCTElDOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBORUlUSEVSOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuVk9JRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoICE9IDApIHx8ICghSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuZWpiMjAucnVsZXMuSUNsYXNzVlJ1bGUjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCQkvKgotCQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkJICouLi4KLQkJICogT25seSBhIHN0YXRlZnVsIFNlc3Npb24gYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIG1heSAKLQkJICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkJICouLi4KLQkJICogVGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBTZXNzaW9uIGJlYW4gd2l0aCBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gdG8gcmVseSBvbiB0aGUgCi0JCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJICogdHJhbnNhY3Rpb24gY29tbWl0LgotCQkgKi4uLgotCQkgKi8KLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIHNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKTsKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldEVqYkNsYXNzKCksIHNzKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMDNFLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGJlYW4uZ2V0RWpiQ2xhc3MoKSksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGUuZ2V0SmF2YUNsYXNzKCkpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2MzZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjgzYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbEhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQVN0YXRlbGVzc0hvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEVfTk9QQVJNLCBDUkVBVEUsIEZJTkFMSVpFX05PUEFSTX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY3JlYXRlK1NNU1NHSUQrU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrU01TU0dJRCtPTl9CQVNFK1NQRUMsIENIS0oyNDAyK1NNU1NHSUQrT05fVEhJUytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NitCRVhULCBDSEtKMjQ3NitNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZmQ2ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1YjE3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZSBleHRlbmRzIEFTdGF0ZWxlc3NIb21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFX05PUEFSTSwgQ1JFQVRFLCBGSU5BTElaRV9OT1BBUk19OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrU01TU0dJRCtTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NiwgbmV3IFN0cmluZ1tde0NIS0oyNDc2K0JFWFQsIENIS0oyNDc2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2JhMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZW50aXR5IGJlYW4gY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmViIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlib29sZWFuIGhhc1BLTWV0aG9kID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAyLCBuZXcgU3RyaW5nW117Q0hLSjIwMDIrQkVYVCwgQ0hLSjIwMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOSwgbmV3IFN0cmluZ1tde0NIS0oyMDA5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMywgbmV3IFN0cmluZ1tde0NIS0oyMDMzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzQsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM1LCBuZXcgU3RyaW5nW117Q0hLSjIwMzUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNiwgbmV3IFN0cmluZ1tde0NIS0oyMDM2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzcsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM4LCBuZXcgU3RyaW5nW117Q0hLSjIwMzgrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOSwgbmV3IFN0cmluZ1tde0NIS0oyMDM5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9idXMrQkVYVCwgQ0hLSjI0MDBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDBfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA2LCBuZXcgU3RyaW5nW117Q0hLSjI0MDYrQkVYVCwgQ0hLSjI0MDYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9idXMrQkVYVCwgQ0hLSjI0MDhfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDhfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMCwgbmV3IFN0cmluZ1tde0NIS0oyNDIwK0JFWFQsIENIS0oyNDIwK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWhhc1BLTWV0aG9kID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCS8vIEJNUHMgbXVzdCBpbXBsZW1lbnQgZWpiRmluZEJ5UHJpbWFyeUtleS4gSWYgaXQgaXNuJ3QgaW1wbGVtZW50ZWQsIHZhbGlkYXRlTWV0aG9kRXhpc3RzKCkgd2lsbAotCQkvLyBvdXRwdXQgYW4gZXJyb3IuIChoYXNQS01ldGhvZCA9IHRydWUgaW1wbGllcyBpbXBsZW1lbnRlZCwgb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZCkKLQkJaWYgKCFoYXNQS01ldGhvZCAmJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuNgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MKLQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQk1QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi42IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgcGFyZW50LgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi41Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCQkvLyAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBhYm92ZSBjaGVjay4KLQotCQkvLyBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JCS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JCS8vIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJGaW5kLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkJLy8gb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JCXZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiRmluZCk7Ci0KLQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuNQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JCS8vIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCi0JCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCi0JCWlmKCAhKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHByaW1hcnlLZXkpIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pCi0JCSAgICkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNAotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBlamJQb3N0Q3JlYXRlIG1ldGhvZCBjaGVja3MKLQkJc3VwZXIudmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBObyBzcGVjaWZpYyBCTVAgZWpiUG9zdENyZWF0ZSBtZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNCBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi41Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCi0JCWlmICghaGFzUEtNZXRob2QpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLyoKLQkJLy8gUGx1cywgY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgotCQlMaXN0IGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQlpZigoZmllbGRzID09IG51bGwpIHx8IChmaWVsZHMuc2l6ZSgpID09IDApKSB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfQk1QX05PRklFTERTLCBuZXcgU3RyaW5nW10ge2dldE1vZGVsT2JqZWN0TmFtZSgpfSwgZ2V0TW9kZWxPYmplY3QoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNQS01ldGhvZCA9IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjJkNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBiZWFuIG1hbmFnZWQgZW50aXR5IGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA5LjIuOAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBIb21lIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5SG9tZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmVoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNSwgbmV3IFN0cmluZ1tde0NIS0oyMDA1K0JFWFQsIENIS0oyMDA1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI2LCBuZXcgU3RyaW5nW117Q0hLSjIwMjYrQkVYVCwgQ0hLSjIwMjYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDMwLCBuZXcgU3RyaW5nW117Q0hLSjIwMzArQkVYVCwgQ0hLSjIwMzArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSB2ZXJpZnlNYXRjaGluZ0JlYW5GaW5kTWV0aG9kIGNoZWNrcyBmb3IgdGhlIHR3byBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOgotCQkvLyAKLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQkvLyAKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCXZhbGlkYXRlRmluZE1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgdmVyaWZ5TWF0Y2hpbmdCZWFuRmluZE1ldGhvZCBjaGVja3MgZm9yIHRoZSB0d28gZm9sbG93aW5nIHJlcXVpcmVtZW50czoKLQkJLy8gCi0JCS8vIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JCS8vIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkJLy8gKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCQkvLyBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkJLy8gCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQl2YWxpZGF0ZU1hdGNoaW5nQmVhbkZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNGFkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIFZhbGlkYXRlIGEgQk1QIGtleS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQk1QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDEsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotLy9Eb24ndCB1c2UgdGhhdCBBVmFsaWRhdGVFSkIgbWV0aG9kCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitFWFR9KTsKLS8vRG9uJ3QgdXNlIHRoYXQgQVZhbGlkYXRlRUpCIG1ldGhvZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrRVhUfSk7Ci0vL0Rvbid0IHVzZSB0aGF0IEFWYWxpZGF0ZUVKQiBtZXRob2QJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ2NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIEJNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViZmE4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgTGlzdCBfY29udGFpbmVyTWFuYWdlZEZpZWxkcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDIsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMitCRVhULCBDSEtKMjAwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNCwgbmV3IFN0cmluZ1tde0NIS0oyMDA0K0JFWFQsIENIS0oyMDA0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA2LCBuZXcgU3RyaW5nW117Q0hLSjIwMDYrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNywgbmV3IFN0cmluZ1tde0NIS0oyMDA3K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMiwgbmV3IFN0cmluZ1tde0NIS0oyMDMyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzMsIG5ldyBTdHJpbmdbXXtDSEtKMjAzMytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM0LCBuZXcgU3RyaW5nW117Q0hLSjIwMzQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNSwgbmV3IFN0cmluZ1tde0NIS0oyMDM1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzYsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM3LCBuZXcgU3RyaW5nW117Q0hLSjIwMzcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOCwgbmV3IFN0cmluZ1tde0NIS0oyMDM4K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzksIG5ldyBTdHJpbmdbXXtDSEtKMjAzOStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMSwgbmV3IFN0cmluZ1tde0NIS0oyMjAxK0JFWFQsIENIS0oyMjAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjAyLCBuZXcgU3RyaW5nW117Q0hLSjIyMDIrQkVYVCwgQ0hLSjIyMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMytCRVhULCBDSEtKMjIwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNywgbmV3IFN0cmluZ1tde0NIS0oyMjA3K0VYVCwgQ0hLSjIyMDcrRVhUfSk7IC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpZCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXRob2QgaXMgaW5oZXJpdGVkCi0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJGaW5kK0JFWFQsIENIS0oyNDAwX2VqYkZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNiwgbmV3IFN0cmluZ1tde0NIS0oyNDA2K0JFWFQsIENIS0oyNDA2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMitCRVhULCBDSEtKMjQzMitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgewotCQlyZXR1cm4gX2NvbnRhaW5lck1hbmFnZWRGaWVsZHM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpIHsKLQkJcmV0dXJuIChnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuc2l6ZSgpID4gMCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjEKLQkgKiAKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEhvbWVfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgaG9tZUludGYpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuMQotCSAqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZFJlbW90ZV9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCksIHJlbW90ZUludGYpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgbG9hZENvbnRhaW5lck1hbmFnZWRGaWVsZHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gVGhlIHZhbGlkYXRpb24gaW4gdGhpcyBjbGFzcywgb2YgdGhlIGZpZWxkcywgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlCi0JCS8vIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcywgbm90IHRoZSBmaWVsZHMgb2YgdGhpcyBjbGFzcyBkaXJlY3RseS4KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlMaXN0IGZpZWxkcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlMaXN0IGNtcEF0dHJpYnV0ZXMgPSAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW4pLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoY21wQXR0cmlidXRlcyAhPSBudWxsICYmICFjbXBBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewotCQkJCWZpZWxkcyA9IG5ldyBBcnJheUxpc3QoY21wQXR0cmlidXRlcy5zaXplKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21wQXR0cmlidXRlcy5zaXplKCk7IGkrKykKLQkJCQkJZmllbGRzLmFkZCgoKENNUEF0dHJpYnV0ZSkgY21wQXR0cmlidXRlcy5nZXQoaSkpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJfQotCQkJZmllbGRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDE4LjEuMgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQl2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjYKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzCi0JCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKLQkJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIENNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNiBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKLQkJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7IC8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gYWJvdmUiCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIHBhcmVudC4KLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleSh2YywgYmVhbiwgY2xhenopOyAvLyBpZiB0aGlzIGNsYXNzIHVzZXMgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIHRoZSB0eXBlIG9mIHRoZSBrZXkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNDb250YWluZXJNYW5hZ2VkRmllbGQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCkpIHsKLQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhmaWVsZCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZmllbGQuaXNUcmFuc2llbnQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGlmIGl0J3MgYSByZWZlcmVuY2UgdG8gdGhlIGhvbWUgb3IgcmVtb3RlIGludGVyZmFjZS4KLQkJCXZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkX2RlcGVuZGVudCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuMQotCSAqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIGVpdGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgCi0JICogb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkX2RlcGVuZGVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUhlbHBlcnMgZmllbGRUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpOwotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2VyaWFsaXphYmxlKGZpZWxkVHlwZSwgYmVhbikpIHsKLQkJCS8vIElmIGl0IHdlcmUgcHJpbWl0aXZlLCBpdCB3b3VsZCBiZSBzZXJpYWxpemFibGUsIHNvIHR3byBjaGVja3Mgd2VyZSBkb25lIGluIHRoYXQgb25lIGxpbmUgb2YgY29kZS4KLQkJCS8vIAotCQkJLy8gQ2hlY2sgaWYgaXQncyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIG9yIGhvbWUgaW50ZXJmYWNlCi0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJaWYgKCEoaXNDb250YWluZXJNYW5hZ2VkSG9tZV9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSB8fCAoaXNDb250YWluZXJNYW5hZ2VkUmVtb3RlX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIGZpZWxkKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjYKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCS8vIE9ubHkgQk1QcyBpbXBsZW1lbnQgZmluZGVyIG1ldGhvZHMuCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNCBhbmQgOS40LjIKLQkqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFBlcmZvcm0gY29tbW9uIEJNUC9DTVAgZWpiUG9zdENyZWF0ZSBtZXRob2QgY2hlY2tzCi0JCXN1cGVyLnZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQ01QIGVqYlBvc3RDcmVhdGVNZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNCBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47IC8vIGJlYW4gaXMgY2hlY2tlZCBmb3IgbnVsbCBpbiBBVmFsaWRhdGVFSkIudmFsaWRhdGUoKSBtZXRob2QsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0IGhlcmUuCi0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWl0aXZlIHByaW1hcnkga2V5Ci0KLQkJCS8vIHByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkJCS8vIFRoZSBmaWVsZCdzIHR5cGUgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkJCUNNUEF0dHJpYnV0ZSBrZXlBdHRyaWJ1dGUgPSBjbXAuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCQlGaWVsZCBrZXlGaWVsZCA9IChrZXlBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDoga2V5QXR0cmlidXRlLmdldEZpZWxkKCk7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCQlpZiAoKGtleUZpZWxkID09IG51bGwpIHx8ICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSgoSmF2YUhlbHBlcnMpa2V5RmllbGQuZ2V0RVR5cGUoKSwgcHJpbWFyeUtleSkpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBrZXlBdHRyaWJ1dGUuZ2V0TmFtZSgpLCBwcmltYXJ5S2V5LmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBrZXlGaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBmaWVsZCBleGlzdHMgb24gdGhlIGJlYW4uCi0JICovCi0JcHVibGljIHZvaWQgdmVyaWZ5RmllbGRFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoIWhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJX2NvbnRhaW5lck1hbmFnZWRGaWVsZHMgPSBsb2FkQ29udGFpbmVyTWFuYWdlZEZpZWxkcyh2YywgKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudCwgKEphdmFDbGFzcyl0YXJnZXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1YjhhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4gKEFuZCB0aGUgYnVsayBvZiB0aG9zZQotICogYXJlIGltcGxlbWVudGVkIGluIFZhbGlkYXRlS2V5Q2xhc3MuKQotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgU2V0IF9iZWFuRmllbGROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAxLCBuZXcgU3RyaW5nW117Q0hLSjIwMDErRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE5LCBuZXcgU3RyaW5nW117Q0hLSjIwMTkrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIwLCBuZXcgU3RyaW5nW117Q0hLSjIwMjArRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMSwgbmV3IFN0cmluZ1tde0NIS0oyMDIxK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOyAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGlkIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGluaGVyaXRlZCBvciBub3QKLQkJCi0vL0FWYWxpZGF0ZUVKQiBtZXRob2Qgbm90IHVzZWQJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLS8vQVZhbGlkYXRlRUpCIG1ldGhvZCBub3QgdXNlZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotLy9BVmFsaWRhdGVFSkIgbWV0aG9kIG5vdCB1c2VkCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9iZWFuRmllbGROYW1lcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjEgYW5kIDkuNC43LjIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEZpZWxkTmFtZUxpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQnVpbGQgdXAgdGhlIGxpc3Qgb2YgZmllbGQgbmFtZXMgdG8gYmUgdXNlZCBpbiB0aGUgZmllbGQgdmFsaWRhdGlvbi4KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQlpZiAoY21wID09IG51bGwpIHsKLQkJCS8vIExldCB0aGUgY2xhc3MgdmFsaWRhdGlvbiB0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQkvLyBUaGVzZSBhcmUgZGlmZmVyZW50IGZpZWxkcyB0aGFuIHRoZSBvbmVzIHZhbGlkYXRlZCBieSB0aGlzCi0JCQkJCS8vIHZhbEltcGwgY2xhc3MsIHNvIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZHVwbGljYXRlIHJlZmxlY3Rpb24KLQkJCQkJLy8gd2FybmluZ3MgbG9nZ2VkIGFnYWluc3QgdGhlIHNhbWUgb2JqZWN0LgotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoYXR0cmlidXRlLmdldFR5cGUoKSk7Ci0JCQkJCV9iZWFuRmllbGROYW1lcy5hZGQoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkvL1RPRE8gKERhbikgQ2hhbmdlIHRvIHVzZSB0aGUgYXR0cmlidXRlIGRpcmVjdGx5IGFuZCBub3QgdGhlIGZpZWxkLgotCQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenogLCBhdHRyaWJ1dGUuZ2V0RmllbGQoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICoKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuNy4yCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhmaWVsZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkJLy8gZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JCS8vIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIGNtcCBpcyBudWxsLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGJ5IHZhbGlkYXRlRmllbGRzKCksCi0JCS8vIGFuZCB2YWxpZGF0ZUZpZWxkcygpIHdvbid0IGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGJlYW4gaXMgbnVsbC4KLQotCQlpZiAoIV9iZWFuRmllbGROYW1lcy5jb250YWlucyhmaWVsZC5nZXROYW1lKCkpKSB7Ci0JCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBjbXAuZ2V0RWpiQ2xhc3MoKTsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShlamJDbGFzcyk7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbXAuZ2V0TmFtZSgpLCBjbXAuZ2V0RWpiQ2xhc3MoKS5nZXROYW1lKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjIwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQkvL05vdGhpbmcgdG8gZG8uCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCS8vIFRoZXNlIGJvb2xlYW5zIGFyZSB1c2VkIGluIHRoZSB2YWxpZGF0ZU1ldGhvZEV4aXN0cygpIGNoZWNrcy4KLQkJCWhhc0FDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGVqYk1ldGhvZCkgJiYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljCi0JCWlmICghY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlidWlsZEZpZWxkTmFtZUxpc3QodmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgZm9yIGNtcCBrZXkgYXR0cmlidXRlcyBpZiBpdCdzIG5vdCBhIHZhbGlkIHByaW0ga2V5IGZpZWxkLgotCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgTU9GSGVscGVyLmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHByaW1hcnlLZXksIG5ldyBTdHJpbmdbXSB7IHByaW1hcnlLZXkuZ2V0TmFtZSgpLCBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlTWV0aG9kRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJLy8gSWYgdGhlIGNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCwgSmF2YSBpbnNlcnRzIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzLgotCQkvLyBCdXQgaWYgdGhlIGNsYXNzIGhhcyBhdCBsZWFzdCBvbmUgY29uc3RydWN0b3IgZGVmaW5lZCwgSmF2YSB3aWxsIG5vdCBpbnNlcnQgYSBjb25zdHJ1Y3Rvci4KLQkJaWYgKCFoYXNEZWZhdWx0Q29uc3RydWN0b3IgJiYgaGFzQUNvbnN0cnVjdG9yKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVlZDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIENNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lciI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzg3YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICogU2VjdGlvbjogNi44LCA2LjEwLjIsIDYuMTAuMyBhbmQgNi4xMC40Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVNlc3Npb25CZWFuIGV4dGVuZHMgQVZhbGlkYXRlQmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZXQgY3JlYXRlTWV0aG9kcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNJLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNJICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNFLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNFICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNiwgbmV3IFN0cmluZ1tde0NIS0oyMDA2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDcsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA4LCBuZXcgU3RyaW5nW117Q0hLSjIwMDgrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI1LCBuZXcgU3RyaW5nW117Q0hLSjIwMjUrQkVYVCwgQ0hLSjIwMjUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAxLCBuZXcgU3RyaW5nW117Q0hLSjI0MDErQkVYVCwgQ0hLSjI0MDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfYnVzK0JFWFQsIENIS0oyNDA4X2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDhfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjAsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMCtCRVhULCBDSEtKMjQyMCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMyLCBuZXcgU3RyaW5nW117Q0hLSjI0MzIrQkVYVCwgQ0hLSjI0MzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQljcmVhdGVNZXRob2RzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRlU2Vzc2lvbkJlYW4oKSB7Ci0JCWNyZWF0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDcmVhdGVNZXRob2QoKSB7Ci0JCWlmIChoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID09IHRydWUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgJiYgKCFoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kKSkgewotCQkJaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgaXQgdG8gdGhlIGxpc3QsIGZvciByZXBvcnRpbmcgZXh0cmFuZW91cyBjcmVhdGUgbWV0aG9kcywgZm9yIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zIChzZWN0aW9uIDYuOCkKLQkJCWNyZWF0ZU1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYW1ld29ya01ldGhvZChTdHJpbmcgbmFtZSkgewotCQlpZiAoc3VwZXIuaXNGcmFtZXdvcmtNZXRob2QobmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIHNlc3Npb24tc3BlY2lmaWMgbWV0aG9kcwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfU0VUU0VTU0lPTkNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kcyBhbmQgYnVzaW5lc3MgbWV0aG9kcyBmb2xsb3cgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiBTZWN0aW9uOiA2LjgsIDYuMTAuMiwgNi4xMC4zIGFuZCA2LjEwLjQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlamJNZXRob2QuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkFMSVpFKSkgewotCQkJdmFsaWRhdGVGaW5hbGl6ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWpiTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJdmFsaWRhdGVDb25zdHJ1Y3Rvcih2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCkpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYgKCFpc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJdmFsaWRhdGVIZWxwZXJNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQkJdmFsaWRhdGVDb25zdHJ1Y3Rvcih2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgc3VwcGxpZWQgYnVzaW5lc3MgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYyBydWxlcy4KLQkgKiBTZWN0aW9uOiA2LjEwLjQKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gY2hlY2sgbWV0aG9kIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAnZWpiJwkKLQotCQkvLyBUaGUgbWV0aG9kIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXN0IG9mIHRoZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGUgdmFsaWRhdGVNZXRob2QgbWV0aG9kLgotCQl2YWxpZGF0ZUJ1c2luZXNzTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkZWZpbml0aW9uIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKgotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0JICogU2VjdGlvbjogNi4xMC4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQkJLy8gc3VwZXIudmFsaWRhdGVDbGFzcygpIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOgotCQkvLyAJCS0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLlNlc3Npb25CZWFuIAotCQkvLyAgICAgICAgaW50ZXJmYWNlLgotCQkvLyAgIAktIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IAotCQkvLyAgICAgICAgYmUgYWJzdHJhY3QuCi0KLQkJLy8gSWYgdGhlIGNsYXNzIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLCBpdCBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgCi0JCS8vIHRoZSBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0KLQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pYmVhbjsKLQkJYm9vbGVhbiBpc1N0YXRlbGVzcyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKTsKLQkJYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU3RhdGVmdWwgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQmVhbk1hbmFnZWRTZXNzaW9uKHNlc3Npb24pICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlZnVsKHNlc3Npb24pKTsKLQotCQlpZiAoaXNTdGF0ZWxlc3MpIHsKLQkJCS8qCi0JCQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkJCSAqIFNlY3Rpb246IDYuNS4zCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IChiZWFuLmdldEVqYkNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfQkVBTl9DTEFTUyA6IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJCVN0cmluZyBlQ2xhc3MgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKTsgLy8gU2luY2Ugb25seSBnZXRUeXBlIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIHRoaXMgY2Fubm90IGhhdmUgYmVlbiB0aHJvd24gYmVjYXVzZSBvZiB0aGUgYmVhbiBjbGFzcwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW5DbGFzc05hbWUsIGVDbGFzcyB9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCQkJICogU2VjdGlvbjogNi41LjMKLQkJCSAqLwotCQkJdHJ5IHsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRFamJDbGFzcygpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDAzSSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgYmVhbi5nZXRFamJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gSWYgdGhlIAotCQkvLyBzZXNzaW9uIGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlbiB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIGVqYkNyZWF0ZSBtZXRob2RzLCAKLQkJLy8gdGhlIG1ldGhvZHMgb2YgdGhlIFNlc3Npb25CZWFuIGludGVyZmFjZSwgYW5kIHRoZSBtZXRob2RzIG9mIHRoZSBvcHRpb25hbCAKLQkJLy8gU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UgbWF5IGJlIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcywgCi0JCS8vIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCQkvLyAgLSB0aGlzIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIEVKQiBNT0YgbW9kZWwuIFdoZW4gYXNrZWQgaWYgYSBKYXZhQ2xhc3MgaGFzIGEgbWV0aG9kLAotCQkvLyAgICB0aGUgbW9kZWwgY2hlY2tzIHRoZSBjbGFzcycgcGFyZW50cyB0b28uCi0KLQkJLy8gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBzZXNzaW9uIGJlYW4ncyAKLQkJLy8gcmVtb3RlIGludGVyZmFjZSBbNF0gLgotCQkvLyBbNF0gSWYgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkb2VzIGltcGxlbWVudCB0aGUgcmVtb3RlIGludGVyZmFjZSwgY2FyZSBtdXN0IAotCQkvLyBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotCQkvLyBwb3RlbnRpYWwgZXJyb3IgY2FuIGJlIGF2b2lkZWQgYnkgY2hvb3Npbmcgbm90IHRvIGltcGxlbWVudCB0aGUgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLQkJdmFsaWRhdGVDbGFzc19yZW1vdGVEZXAodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotCSAqIFZlcnNpb246IDEuMQotCSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotCSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0JICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLQkgKiBTZWN0aW9uOiA2LjEwLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzX3JlbW90ZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JCS8vIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkJLy8gWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkJLy8gYmUgdGFrZW4gdG8gYXZvaWQgcGFzc2luZyBvZiB0aGlzIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gVGhpcyAKLQkJLy8gcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlKTsKLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCByZW1vdGUpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0ge2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKSwgcmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29uc3RydWN0b3IoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQlpZiAoIWhhc1ZhbGlkQ29uc3RydWN0b3IgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkgJiYgKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCWhhc1ZhbGlkQ29uc3RydWN0b3IgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgc3VwcGxpZWQgZWpiQ3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMgcnVsZXMuCi0JICogU2VjdGlvbjogNi4xMC4zCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB2b2lkLgotCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCVN0cmluZyByZXR1cm5UeXBlTmFtZSA9ICgocGFybVR5cGUgPT0gbnVsbCkgPyAiIiA6IHBhcm1UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIXJldHVyblR5cGVOYW1lLmVxdWFscyhJVHlwZUNvbnN0YW50cy5WT0lEKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCXZhbGlkYXRlRWpiQ3JlYXRlTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuMTAuMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBiZWNhdXNlIEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluYWxpemUoKSBtZXRob2QgdG8gYmUgY2FsbGVkLiBFSkIgMS4xIChzZWN0aW9uIDYuMTAuMikgc3BlY2lmaWNhbGx5IHByb2hpYml0cyBpdC4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuOCwgNi4xMC4yIGFuZCA2LjEwLjMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCWlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBoYXNBQ29uc3RydWN0b3IpIHsKLQkJCS8vIElmIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzIGRvZXMgbm90IGV4aXN0IGV4cGxpY2l0bHksCi0JCQkvLyBKYXZhIHdpbGwgaW5zZXJ0IG9uZSBhcyBsb25nIGFzIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCBpbiB0aGUKLQkJCS8vIGNsYXNzLiBJZiB0aGVyZSBpcyBhIGNvbnN0cnVjdG9yLCBKYXZhIGRvZXMgbm90IGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNDcmVhdGVNZXRob2QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCQkvLyBubyBhcmd1bWVudHMuCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikgJiYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY3JlYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgKE1ldGhvZCkgaXRlcmF0b3IubmV4dCgpLCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBzdXBwbGllZCBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogZWpiQ3JlYXRlIGFuZCBidXNpbmVzcyBtZXRob2RzIGZvbGxvdyBzb21lIG9mIHRoZSBzYW1lIHJ1bGVzLiBUaGlzIG1ldGhvZCBjaGVja3MgdGhvc2UgcnVsZXMuCi0JICogKFBhcnQgb2Ygc2VjdGlvbnMgNi4xMC4zIGFuZCA2LjEwLjQpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01vZGlmaWVyc0FuZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIAotCQkvLyB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JCS8vIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfYnVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1vZGlmaWVyc0FuZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIAotCQkvLyB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JCS8vIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiQ3JlYXRlKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4YTQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIFNlc3Npb24gaG9tZSBpbnRlcmZhY2UgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlU2Vzc2lvbkhvbWUgZXh0ZW5kcyBBVmFsaWRhdGVIb21lIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQlwcml2YXRlIFNldCBjcmVhdGVNZXRob2RzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA1LCBuZXcgU3RyaW5nW117Q0hLSjIwMDUrQkVYVCwgQ0hLSjIwMDUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTAsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMCtFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI0LCBuZXcgU3RyaW5nW117Q0hLSjIwMjQrQkVYVCwgQ0hLSjIwMjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjYsIG5ldyBTdHJpbmdbXXtDSEtKMjAyNitCRVhULCBDSEtKMjAyNitNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE5LCBuZXcgU3RyaW5nW117Q0hLSjI0MTkrQkVYVCwgQ0hLSjI0MTkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWNyZWF0ZU1ldGhvZHMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRlU2Vzc2lvbkhvbWUoKSB7Ci0JCWNyZWF0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NyZWF0ZU1ldGhvZCgpIHsKLQkJaWYgKGhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPT0gdHJ1ZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmNyZW1lbnRDcmVhdGVNZXRob2RDb3VudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSAmJiAoIWhhc0RlZmF1bHRDcmVhdGVNZXRob2QpKSB7Ci0JCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFkZCBpdCB0byB0aGUgbGlzdCwgZm9yIHJlcG9ydGluZyBleHRyYW5lb3VzIGNyZWF0ZSBtZXRob2RzLCBmb3Igc3RhdGVsZXNzIHNlc3Npb24gYmVhbnMgKHNlY3Rpb24gNi44KQotCQkJY3JlYXRlTWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBzZXNzaW9uIGhvbWUgaW50ZXJmYWNlJ3MgbWV0aG9kcyBmb2xsb3cgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiAKLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotCSAqIFNlY3Rpb246IDYuOCBhbmQgNi4xMC42Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaGlNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShoaU1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGhpTWV0aG9kLmdldE5hbWUoKTsKLQkJLy8gSG9tZSBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgZGVjbGFyZSBjcmVhdGUgbWV0aG9kcwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKSkgewotCQkJdmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBIb21lIGludGVyZmFjZSBzaG91bGQgb25seSBkZWNsYXJlIGNyZWF0ZSBtZXRob2RzCi0JCQkvLyAoTm8gbWV0aG9kcyBvdGhlciB0aGFuIGNyZWF0ZSBtZXRob2RzIGFyZSBsaXN0ZWQgaW4gc2VjdGlvbiA2LjEwLjYsCi0JCQkvLyBidXQgb3RoZXIgc2VjdGlvbnMgb2YgdGhlIHNwZWMsIGUuZy4gOS4yLjIsIGV4cGxpY2l0bHkgbGlzdCBlYWNoIHR5cGUKLQkJCS8vIG9mIG1ldGhvZCB3aGljaCBjYW4gYmUgb24gYSBjbGFzcy9pbnRlcmZhY2UuKQotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBzZXNzaW9uIGhvbWUgY2xhc3MgZGVmaW5pdGlvbiBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotCSAqIFNlY3Rpb246IDYuMTAuNgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBCb3RoIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgVmFsaWRhdGVIb21lIGNsYXNzJ3MgdmFsaWRhdGVDbGFzcyBtZXRob2QuCi0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0KLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkJLy8gZm9yIFJNSS9JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCQkvLyB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkJLy8gb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCQkvLyBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04gfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBQZXJmb3JtIHRoZSBjaGVja3Mgd2hpY2ggZGVwZW5kIG9uIGFub3RoZXIgY2xhc3MgaW4gdGhlIGVudGVycHJpc2UgYmVhbi4KLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQotCQkvLyBBIHNlc3Npb24gYmVhbidzIGhvbWUgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlIG1ldGhvZHMuCi0JCWlmICghaGFzQ3JlYXRlTWV0aG9kKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbW9kZWxPYmplY3ROYW1lLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCQkvLyBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlLiBUaGVyZSBjYW4gYmUgbm8gb3RoZXIgY3JlYXRlIG1ldGhvZHMgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLiAKLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKSAmJiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcmVhdGVNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBpdGVyYXRvci5uZXh0KCksIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25SZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25SZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyMjA2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgYSBTZXNzaW9uIGJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVNlc3Npb25SZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zciI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5ZDYxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgdGhlIHVzZXIgY2FuY2VscyB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcwNjU2NTUzNDcwMzAxMDMyODlMOwotCi0JcHVibGljIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgbG9uZyBtZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPSAweDE7IC8vIHVzZWQgYnkgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfcmVzZXJ2ZWRXb3JkcyA9IG5ldyBTdHJpbmdbXXsiU0VMRUNUIiwgIkZST00iLCAiV0hFUkUiLCAiRElTVElOQ1QiLCAiT0JKRUNUIiwgIk5VTEwiLCAiVFJVRSIsICJGQUxTRSIsICJOT1QiLCAiQU5EIiwgIk9SIiwgIkJFVFdFRU4iLCAiTElLRSIsICJJTiIsICJBUyIsICJVTktOT1dOIiwgIkVNUFRZIiwgIk1FTUJFUiIsICJPRiIsICJJUyJ9OyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMyQgLy8kTk9OLU5MUy0xNCQgLy8kTk9OLU5MUy0xNSQgLy8kTk9OLU5MUy0xNiQgLy8kTk9OLU5MUy0xNyQgLy8kTk9OLU5MUy0xOCQgLy8kTk9OLU5MUy0xOSQgLy8kTk9OLU5MUy0yMCQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGhlbHBlck1hcCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBNYXAgcHJvamVjdEhlbHBlck1hcCA9ICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcCgpICk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBjb21tb25DbGFzc05hbWVzID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRDTVJGaWVsZFR5cGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIENNUkZpZWxkIGZpZWxkKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IGZpZWxkLmdldFJvbGUoKTsKLQkJaWYoIXJvbGUuaXNNYW55KCkpIHsKLQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gcm9sZS5nZXRUeXBlRW50aXR5KCk7Ci0JCQlpZihjbXAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlKYXZhQ2xhc3MgbG9jYWwgPSBjbXAuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCS8vIElmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZSBpbiBlamItamFyLnhtbCwgYW5kIHRoZXkgYXJlIHRyeWluZyB0byBtYWtlCi0JCQkvLyBhIHJlbGF0aW9uc2hpcCB0byBhIGNtcCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLCBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkJCS8vIHdpbGwgYmUgdGhyb3duLiBMZXQgdGhlIEREIHZhbGlkYXRpb24gY2F0Y2ggdGhhdCBlcnJvcjsganVzdCByZXR1cm4KLQkJCS8vIHdoZW4gdGhpcyBoYXBwZW5zLgotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoY21wLCBsb2NhbCk7Ci0JCQl9Ci0JCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGxvY2FsOwotCQl9Ci0JCQkvLyA8Y21yLWZpZWxkLXR5cGU+IGlzIGVpdGhlciBhIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGEgamF2YS51dGlsLlNldCAocC4gNDY0KQotCQkJcmV0dXJuIGZpZWxkLmdldENvbGxlY3Rpb25UeXBlKCk7Ci0JfQotCi0JCi0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZm9sbG93c0ZpbmRlckV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBmb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbEVudW1lcmF0aW9uKSkgewotCQkJLy8gT25seSBzaW5nbGUgb2JqZWN0IGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgbWF5IHRocm93IHRoaXMgZXhjZXB0aW9uCi0JCQlyZXR1cm4gIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQkvLyBPbmx5IHNpbmdsZSBvYmplY3QgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBtYXkgdGhyb3cgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCS8vIEl0J3MgYSBzaW5nbGUgZmluZGVyL3NlbGVjdCBtZXRob2QsIHNvIGl0IGNhbiB0aHJvdyB0aGUgZXhjZXB0aW9uLCB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIHRvLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgTWV0aG9kIGZyb20gdGhlIG1ldGhvZCBsaXN0IHdoaWNoIGhhcyB0aGUgZ2l2ZW4KLQkgKiBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMgKGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcnJheSBlbGVtZW50cykuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIFN0cmluZ1tdKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFQYXJhbWV0ZXJbXSBpbnRvIGEgU3RyaW5nW10uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YVBhcmFtZXRlcltdIHBhcmFtZXRlclR5cGVzLCBMaXN0IG1ldGhvZExpc3QpIHsKLQkJaWYobWV0aG9kTGlzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXMgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwYXJhbXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCQkJCi0JCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsgLy9NYXliZTsgd2UgbmVlZCBtb3JlIGluZm8KLQkJCQkJCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgcGFybSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1zW2pdLmdldEVUeXBlKCkpOwotCQkJCQkJSmF2YUhlbHBlcnMgdHlwZSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1ldGVyVHlwZXNbal0uZ2V0RVR5cGUoKSk7Ci0JCQkJCQlpZighaXNTYW1lVHlwZShwYXJtLCB0eXBlKSkgewotCQkJCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChmb3VuZCkgewotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcywgTGlzdCBtZXRob2RMaXN0KSB7Ci0JCWlmKG1ldGhvZExpc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhvZExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgewotCQkJCQkJLy9pZiBhbnkgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGRvZXNuJ3QgbWF0Y2ggdGhlbiBmbGlwIGJhY2sgdG8gZmFsc2UKLQkJCQkJCUphdmFIZWxwZXJzIHBhcm0gPSAoKEphdmFIZWxwZXJzKXBhcmFtc1tqXS5nZXRFVHlwZSgpKTsKLQkJCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tqXTsKLQkJCQkJCWlmKCFpc1NhbWVUeXBlKHBhcm0sIHR5cGUpKSB7Ci0JCQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIEphdmFDbGFzcyBjbGF6eiwgcmV0dXJuIGEgbWV0aG9kLCBuYW1lZCBtZXRob2ROYW1lVG9GaW5kLAotCSAqIHdoaWNoIGhhcyBleGFjdGx5IHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBtZXRob2RUb01hdGNoLgotCSAqCi0JICogSWYgbm8gbWV0aG9kIGV4aXN0cyB3aXRoIHRoYXQgbmFtZSBhbmQgYXJndW1lbnQgbGlzdCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb3IgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE1ldGhvZCBtZXRob2RUb01hdGNoLCBTdHJpbmcgbWV0aG9kTmFtZVRvRmluZCwgTGlzdCBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCWlmKG1ldGhvZHNFeHRlbmRlZExpc3QgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IGludmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBMaXN0LiBBIG51bGwgTGlzdAotCQkJLy8gbWVhbnMgdGhhdCBhIHR5cGUgd2hvc2UgbWV0aG9kcyBuZWVkIHRvIGJlIHNlYXJjaGVkIGRvZXNuJ3QgZXhpc3QsCi0JCQkvLyBzdWNoIGFzIHNlYXJjaGluZyBhIGxvY2FsIHZpZXcsIGJ1dCB0aGUgYmVhbiBoYXMgb25seSBhIHJlbW90ZSB2aWV3LgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lVG9GaW5kLCBtZXRob2RUb01hdGNoLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogRnJvbSBKYXZhQ2xhc3MgY2xhenosIHJldHVybiBhIG1ldGhvZCwgbmFtZWQgbWV0aG9kTmFtZVRvRmluZCwKLQkgKiB3aGljaCBoYXMgZXhhY3RseSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgbWV0aG9kVG9NYXRjaC4KLQkgKgotCSAqIElmIG5vIG1ldGhvZCBleGlzdHMgd2l0aCB0aGF0IG5hbWUgYW5kIGFyZ3VtZW50IGxpc3QsIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRoZSBleGNlcHRpb25zIG9yIHJldHVybiB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gsIFN0cmluZyBtZXRob2ROYW1lVG9GaW5kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kTmFtZVRvRmluZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWVUb0ZpbmQsIG1ldGhvZFRvTWF0Y2gubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgU3RyaW5nW10pLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJCXJldHVybiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gbnVsbDsKLQkJZG8gewotCQkJbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICogCi0JICogSWYgcmV0VHlwZSBpcyBudWxsIGl0IG1lYW5zIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZG9lc24ndCBuZWVkIHRvIGJlIGNoZWNrZWQuCi0JICogT3RoZXJ3aXNlLCBjaGVjayB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXRjaGVzIHRvby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzLCBKYXZhSGVscGVycyByZXRUeXBlKSB7Ci0JCWlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCQlyZXR1cm4gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0JCWRvIHsKLQkJCW1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIG1ldGhvZHMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJaWYocmV0VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUphdmFIZWxwZXJzIG1ldGhSZXRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShtZXRoUmV0VHlwZSwgcmV0VHlwZSkpIHsKLQkJCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChTdHJpbmcsIFN0cmluZ1tdLCBKYXZhQ2xhc3MpLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGNsYXp6LmdldE1ldGhvZHMoKSk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQkvLyBjaGVjayBwYXJlbnRzCi0JCUxpc3QgY2xhc3Nlc1RvQ2hlY2sgPSBjbGF6ei5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQlJdGVyYXRvciBjbGF6ekl0ZXJhdG9yID0gY2xhc3Nlc1RvQ2hlY2suaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNsYXp6SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljbGF6eiA9IChKYXZhQ2xhc3MpIGNsYXp6SXRlcmF0b3IubmV4dCgpOwotCQkJbWV0aG9kID0gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgY2xhenouZ2V0TWV0aG9kcygpKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCS8vIGNoZWNrIHBhcmVudHMKLQkJTGlzdCBjbGFzc2VzVG9DaGVjayA9IGNsYXp6LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUl0ZXJhdG9yIGNsYXp6SXRlcmF0b3IgPSBjbGFzc2VzVG9DaGVjay5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2xhenpJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWNsYXp6ID0gKEphdmFDbGFzcykgY2xhenpJdGVyYXRvci5uZXh0KCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgbWV0aG9kIGJ1dCBub3QgbWV0aG9kVG9NYXRjaC4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBleGNlcHRpb25zLCByZXR1cm4gbnVsbC4gKENoZWNrIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMKLQkgKiBpbiB0aGUgbWV0aG9kIGZvciBlYWNoIGV4Y2VwdGlvbiwgb3IgYSBwYXJlbnQgb2YgdGhlIGV4Y2VwdGlvbi4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBNZXRob2QgbWV0aG9kVG9NYXRjaCkgewotCQlpZigobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JCQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhIG1ldGhvZCBvZiB0aGUgCi0JCS8vIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvLwotCQkvLyBTZWN0aW9uIDEyLjIuMgotCQkvLyBbMTVdIEEgY2hlY2tlZCBleGNlcHRpb24gaXMgb25lIHRoYXQgaXMgbm90IGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkJLy8gIk5vdGUgdGhhdCB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mIHRoZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiwKLQkJLy8gYW5kIHRoZXJlZm9yZSBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGxpc3RlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZXMgb2YgdGhlIGJ1c2luZXNzCi0JCS8vIG1ldGhvZHMuIgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1ldGhUb01hdGNoRXhjZXB0aW9ucyA9IG1ldGhvZFRvTWF0Y2guZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJTGlzdCBmb3VuZE1ldGhFeGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZm91bmRNZXRoRXhjZXB0aW9ucy5zaXplKCk7IGkrKyApIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWZvdW5kTWV0aEV4Y2VwdGlvbnMuZ2V0KGkpOwotCQkJaWYgKCAhaXNSdW50aW1lRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzUmVtb3RlRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzRXhjZXB0aW9uSW5MaXN0KGV4YywgbWV0aFRvTWF0Y2hFeGNlcHRpb25zKSApIHsKLQkJCQlleGNlcHRpb25zLmFkZChleGMpOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBleGNlcHRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IG1ldGhvZCBidXQgbm90IG1ldGhvZFRvTWF0Y2guCi0JICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggZXhjZXB0aW9ucywgcmV0dXJuIG51bGwuIChDaGVjayB0aGUgbGlzdCBvZiBleGNlcHRpb25zCi0JICogaW4gdGhlIG1ldGhvZCBmb3IgZWFjaCBleGNlcHRpb24sIG9yIGEgY2hpbGQgb2YgdGhlIGV4Y2VwdGlvbi4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgZ2V0Tm90U3Vic2V0U3VidHlwZUV4Y2VwdGlvbnMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gpIHsKLQkJaWYoKG1ldGhvZFRvTWF0Y2ggPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCQkKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLQkJLy8gbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8KLQkJLy8gU2VjdGlvbiAxMi4yLjIKLQkJLy8gWzE1XSBBIGNoZWNrZWQgZXhjZXB0aW9uIGlzIG9uZSB0aGF0IGlzIG5vdCBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vICJOb3RlIHRoYXQgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gaXMgYSBzdWJjbGFzcyBvZiB0aGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24sCi0JCS8vIGFuZCB0aGVyZWZvcmUgaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBsaXN0ZWQgaW4gdGhlIHRocm93cyBjbGF1c2VzIG9mIHRoZSBidXNpbmVzcwotCQkvLyBtZXRob2RzLiIKLQkJSGFzaFNldCBleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMgPSBtZXRob2RUb01hdGNoLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUxpc3QgZm91bmRNZXRoRXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGZvdW5kTWV0aEV4Y2VwdGlvbnMuc2l6ZSgpOyBpKysgKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylmb3VuZE1ldGhFeGNlcHRpb25zLmdldChpKTsKLQkJCWlmICggIWlzUnVudGltZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc1JlbW90ZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc1N1YnR5cGVFeGNlcHRpb25Jbkxpc3QoZXhjLCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMpICkgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGV4Yyk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIAlFeGNsdWRlIHJvb3QgaG9tZSBpbnRlcmZhY2UgbWV0aG9kcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJIb21lTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FKTsKLQl9Ci0JCi0JLyoqCi0JICogCUV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMgCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCT2JqZWN0TWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uLCBvciBhIHBhcmVudCBvZiB0aGUgZXhjZXB0aW9uLCBpcyBpbiB0aGUgbGlzdCBvZiBleGNlcHRpb25zLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFeGNlcHRpb25Jbkxpc3QoSmF2YUNsYXNzIGV4YywgTGlzdCBleGNlcHRpb25MaXN0KSB7Ci0JICAgICAgIGlmKChleGMgPT0gbnVsbCkgfHwgKGV4Y2VwdGlvbkxpc3QgPT0gbnVsbCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgaWYoIWV4Yy5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9uTGlzdC5pdGVyYXRvcigpOwotCSAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgICAgIGlmKGlzQXNzaWduYWJsZUZyb20oZXhjLCBleGNlcHRpb24pKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWZsZWN0aW9uIHByb2JsZW0sIGRvIG5vdCBzd2FsbG93IHRoZSBleGNlcHRpb24gb3IgYQotCSAgICAgICAgICAgICAgICAgICAgIC8vIGZhdWx0eSBtZXNzYWdlIG1heSBhcHBlYXIuIChpLmUuLCAiZXhjIiBpcyBub3QgdGhyb3duIGJ5ICJmb28iIHdoZW4gaXQKLQkgICAgICAgICAgICAgICAgICAgICAvLyByZWFsbHkgaXMgYnV0IG9uZSBvZiBmb28ncyBleGNlcHRpb25zIHdhc24ndCByZWZsZWN0ZWQuCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uLCBvciBhIGNoaWxkIG9mIHRoZSBleGNlcHRpb24sIGlzIGluIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1N1YnR5cGVFeGNlcHRpb25Jbkxpc3QoSmF2YUNsYXNzIGV4YywgTGlzdCBleGNlcHRpb25MaXN0KSB7Ci0JICAgICAgIGlmKChleGMgPT0gbnVsbCkgfHwgKGV4Y2VwdGlvbkxpc3QgPT0gbnVsbCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgaWYoIWV4Yy5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9uTGlzdC5pdGVyYXRvcigpOwotCSAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgICAgIGlmKGlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBleGMpKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWZsZWN0aW9uIHByb2JsZW0sIGRvIG5vdCBzd2FsbG93IHRoZSBleGNlcHRpb24gb3IgYQotCSAgICAgICAgICAgICAgICAgICAgIC8vIGZhdWx0eSBtZXNzYWdlIG1heSBhcHBlYXIuIChpLmUuLCAiZXhjIiBpcyBub3QgdGhyb3duIGJ5ICJmb28iIHdoZW4gaXQKLQkgICAgICAgICAgICAgICAgICAgICAvLyByZWFsbHkgaXMgYnV0IG9uZSBvZiBmb28ncyBleGNlcHRpb25zIHdhc24ndCByZWZsZWN0ZWQuCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9mdGVuLCBmb3IgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBjb250YWlucwotCSAqIHRoZSBuYW1lIG9mIGEgY2xhc3MuIEJ1dCwgc29tZXRpbWVzLCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGlzCi0JICogYmVpbmcgZ2VuZXJhdGVkIGJlY2F1c2UgYSBjbGFzcyBpcyBudWxsIHdoZW4gaXQgc2hvdWxkbid0IGJlLgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgaGVscGVyIG1ldGhvZCB3aGljaCBtYWtlcyB0aGUgY29uc3RydWN0aW9uIG9mCi0JICogdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhIGxpdHRsZSBsZXNzIGNsdXR0ZXJlZCAoaS5lLiwgaW5zdGVhZAotCSAqIG9mIGNoZWNraW5nIGlmIHRoZSBjbGFzcyBpcyBudWxsIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlCi0JICogbWVzc2FnZSwganVzdCBjYWxsIHRoaXMgbWV0aG9kLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKEphdmFIZWxwZXJzIGhlbHBlcikgewotCQlpZihoZWxwZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGhlbHBlci5nZXRKYXZhTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gZS5nLiwgaWYKLQkgKiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyAicHVibGljIEludGVnZXIgZm9vKFN0cmluZyBhLCBTdHJpbmcgYiwgU3RyaW5nIGMpIgotCSAqIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyAiU3RyaW5nLCBTdHJpbmcsIFN0cmluZyIuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFBhcm1zQXNTdHJpbmcoTWV0aG9kIG1ldGhvZCkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBnZXRQYXJtc0FzU3RyaW5nKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gCi0JICogQHNlZSBnZXRQYXJtc0FzU3RyaW5nKE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXJtc0FzU3RyaW5nKEphdmFQYXJhbWV0ZXJbXSBwYXJtKSB7Ci0JCWlmKHBhcm0ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaW50IGk9MDsgaTxwYXJtLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0eXBlID0gcGFybVtpXS5nZXRKYXZhVHlwZSgpOwotCQkJYnVmZmVyLmFwcGVuZCgoKHR5cGUgPT0gbnVsbCkgPyAibnVsbCIgOiB0eXBlLmdldEphdmFOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChDT01NQSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci5zdWJzdHJpbmcoMCwgYnVmZmVyLmxlbmd0aCgpIC0gMik7IC8vIHNpbmNlICJDT01NQSIgaXMgMiBjaGFyIGxvbmcsIGFuZCB0aGUgbGFzdCBDT01NQSBpc24ndCBuZWVkZWQgYXQgdGhlIGVuZCwgcmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgbGFzdCBDT01NQQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gCi0JICogQHNlZSBnZXRQYXJtc0FzU3RyaW5nKE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXJtc0FzU3RyaW5nKEphdmFIZWxwZXJzW10gcGFybSkgewotCQlpZihwYXJtLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgdHlwZSA9IHBhcm1baV07Ci0JCQlidWZmZXIuYXBwZW5kKCgodHlwZSA9PSBudWxsKSA/ICJudWxsIiA6IHR5cGUuZ2V0SmF2YU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKENPTU1BKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnN1YnN0cmluZygwLCBidWZmZXIubGVuZ3RoKCkgLSAyKTsgLy8gc2luY2UgIkNPTU1BIiBpcyAyIGNoYXIgbG9uZywgYW5kIHRoZSBsYXN0IENPTU1BIGlzbid0IG5lZWRlZCBhdCB0aGUgZW5kLCByZXR1cm4gZXZlcnl0aGluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBsYXN0IENPTU1BCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGUuZy4gImNvbS5pYm0uZm9vLk15Rm9vIgotCSAqIElmIHRoZSB0eXBlIGlzIGFuIGFycmF5LCB0aGUgYXJyYXkgdHlwZSB3aWxsIGJlIHJldHVybmVkLgotCSAqIGUuZy4gaWYgdGhlIHR5cGUgaXMgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuU3RyaW5nW10gd2lsbAotCSAqIGJlIHJldHVybmVkLCBub3QgdGhlIGphdmEubGFuZy5TdHJpbmcgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFIZWxwZXJzIGdldFR5cGUoRUNsYXNzaWZpZXIgY2xhc3NpZmllcikgewotCQlpZihjbGFzc2lmaWVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCUphdmFIZWxwZXJzIHR5cGUgPSAoKEphdmFIZWxwZXJzKWNsYXNzaWZpZXIpOwotCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkgLyoqCi0gICAgICogamF2YUNsYXNzTmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0VHlwZShTdHJpbmcgamF2YUNsYXNzTmFtZSwgRW50ZXJwcmlzZUJlYW4gZWpiKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKChqYXZhQ2xhc3NOYW1lID09IG51bGwpIHx8IChqYXZhQ2xhc3NOYW1lLmVxdWFscygiIikgfHwgKGVqYiA9PSBudWxsKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVqYi5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUphdmFIZWxwZXJzIGhlbHBlciA9IG51bGw7Ci0JCWlmKGNvbW1vbkNsYXNzTmFtZXMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZUNvbW1vbkNsYXNzTmFtZXMoKTsKLQkJfQotCQlpZiAoY29tbW9uQ2xhc3NOYW1lcy5jb250YWlucyhqYXZhQ2xhc3NOYW1lKSkgewotCQkJUmVzb3VyY2VTZXQgclNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpewotCQkJCXByb2plY3QgPSAoKFByb2plY3RSZXNvdXJjZVNldCkgc2V0KS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCS8vaGVscGVyTWFwID0gZ2V0SGVscGVyTWFwKHJTZXQpOwotCQkJLy9PYmplY3Qgb2JqID0gZ2V0SGVscGVyTWFwKHJTZXQpLmdldChqYXZhQ2xhc3NOYW1lKTsKLQkJCU9iamVjdCBvYmogPSBnZXRIZWxwZXJNYXAocHJvamVjdCkuZ2V0KGphdmFDbGFzc05hbWUpOwotCQkJaWYgKG9iaiAhPSBudWxsKSAKLQkJCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBvYmo7Ci0JCQkgZWxzZSB7Ci0JCQkJaGVscGVyID0gZ2V0VHlwZShqYXZhQ2xhc3NOYW1lLHJTZXQpOwotCQkJCS8vZ2V0SGVscGVyTWFwKHJTZXQpLnB1dChqYXZhQ2xhc3NOYW1lLCBoZWxwZXIpOwotCQkJCWdldEhlbHBlck1hcChwcm9qZWN0KS5wdXQoamF2YUNsYXNzTmFtZSwgaGVscGVyKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQloZWxwZXIgPSBnZXRUeXBlKGphdmFDbGFzc05hbWUsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gaGVscGVyOwotCX0KLSAgIAotCSAgcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIGdldEhlbHBlck1hcChJUHJvamVjdCAgcHJvamVjdCl7Ci0JCUhhc2hNYXAgbWFwSGVscGVyID0gKEhhc2hNYXApcHJvamVjdEhlbHBlck1hcC5nZXQoIHByb2plY3QgKTsgCi0JCWlmKCBtYXBIZWxwZXIgPT0gbnVsbCApewotCQkJbWFwSGVscGVyID0gIG5ldyBIYXNoTWFwKCk7Ci0JCQlwcm9qZWN0SGVscGVyTWFwLnB1dChwcm9qZWN0LCBtYXBIZWxwZXIpOwotCQl9Ci0JCWhlbHBlck1hcCA9IG1hcEhlbHBlcjsKLQkJcmV0dXJuIG1hcEhlbHBlcjsKLQl9ICAgIAotICAgIAotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVDb21tb25DbGFzc05hbWVzKCkgewotCQlpZiAoY29tbW9uQ2xhc3NOYW1lcyAhPSBudWxsKSByZXR1cm47Ci0JCUhhc2hTZXQgbmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfSU9fSU9FWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfSU9fU0VSSUFMSVpBQkxFKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfRVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEVFWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9TRVQpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlCRUFOKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCRVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRSk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRSk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVCk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0ZJTkRFUkVYQ0VQVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05DT05URVhUKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0UpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVIpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX1RSQU5TQUNUSU9OX1VTRVJUUkFOU0FDVElPTik7Ci0JCWNvbW1vbkNsYXNzTmFtZXMgPSBuYW1lczsKLQl9Ci0JCi0JLyoqCi0JICogamF2YUNsYXNzTmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0VHlwZShTdHJpbmcgamF2YUNsYXNzTmFtZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHlwZShqYXZhQ2xhc3NOYW1lLCByZXNvdXJjZVNldCwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIGphdmFDbGFzc05hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldFR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBib29sZWFuIHRocm93RXhjSWZOb3RWYWxpZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChqYXZhQ2xhc3NOYW1lID09IG51bGwpICB8fCAoamF2YUNsYXNzTmFtZS5lcXVhbHMoIiIpIHx8IChyZXNvdXJjZVNldCA9PSBudWxsKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoU3RyaW5nLCBSZXNvdXJjZVNldCwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0ZXh0ID0gImludmFsaWQgcGFyYW1ldGVyOyBqYXZhQ2xhc3NOYW1lID0gezB9IGFuZCByZXNvdXJjZVNldCA9IHsxfSI7Ci0JCQkJLy9lbnRyeS5zZXRUZXh0KCJpbnZhbGlkIHBhcmFtZXRlcjsgamF2YUNsYXNzTmFtZSA9IHswfSBhbmQgcmVzb3VyY2VTZXQgPSB7MX0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXtqYXZhQ2xhc3NOYW1lLCBTdHJpbmcudmFsdWVPZihyZXNvdXJjZVNldCl9KTsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwKLQkJCQkJCSBuZXcgU3RyaW5nW117amF2YUNsYXNzTmFtZSwgU3RyaW5nLnZhbHVlT2YocmVzb3VyY2VTZXQpfSk7Ci0JCQkJZW50cnkuc2V0VGV4dChyZXN1bHQpOwotCQkJCQotCQkJCWVudHJ5LmFwcGVuZFN0YWNrVHJhY2UoKTsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCi0JCS8vIElmIHRoZSBjbGFzcyBkb2Vzbid0IGV4aXN0LCBpdCB3aWxsIGJlIHJlZmxlY3RlZAotCQlKYXZhSGVscGVycyBoZWxwZXIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoamF2YUNsYXNzTmFtZSwgcmVzb3VyY2VTZXQpOwotCQlpZih0aHJvd0V4Y0lmTm90VmFsaWQpIHsKLQkJCWlzVmFsaWRUeXBlKGhlbHBlcik7IC8vIGNoZWNrIHRoYXQgdGhlIHR5cGUgaGFzIGJlZW4gcmVmbGVjdGVkIHByb3Blcmx5Ci0JCX0KLQkJCi0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCS8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpIHsKLQkJaWYobG9nRW50cnkgPT0gbnVsbCkgewotCQkgICAgbG9nRW50cnkgPSBuZXcgTG9nRW50cnkoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0JCX0KLQkJbG9nRW50cnkucmVzZXQoKTsgLy8gcmVzZXQgdGhlIHZhbHVlcyBzbyB0aGF0IHdlJ3JlIG5vdCBsb2dnaW5nIHN0YWxlIGRhdGEKLQkJcmV0dXJuIGxvZ0VudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotICAgICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGxvZ2dlciA9IEoyRUVDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotICAgICAgICByZXR1cm4gbG9nZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0VHlwZShGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIChKYXZhSGVscGVycylmaWVsZC5nZXRFVHlwZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgSmF2YUNsYXNzIHBhc3NlZCBpbiBoYXMgdGhlIE1ldGhvZCBkZWZpbmVkCi0JICogb24gaXQuIFJldHVybiBmYWxzZSBpZiB0aGUgTWV0aG9kIGlzIGRlZmluZWQgb24gYSBzdXBlcnR5cGUgb3IgCi0JICogaXMgbm90IGRlZmluZWQgb24gdGhlIGNsYXNzIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gb25DbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGNsYXp6ID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGNsYXp6LmVxdWFscyhtZXRob2QuZ2V0SmF2YUNsYXNzKCkpOyAKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIEphdmFDbGFzcyBwYXNzZWQgaW4gaGFzIHRoZSBGaWVsZCBkZWZpbmVkCi0JICogb24gaXQuIFJldHVybiBmYWxzZSBpZiB0aGUgRmllbGQgaXMgZGVmaW5lZCBvbiBhIHN1cGVydHlwZSBvciAKLQkgKiBpcyBub3QgZGVmaW5lZCBvbiB0aGUgY2xhc3MgYXQgYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBvbkNsYXNzKEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJaWYoKGNsYXp6ID09IG51bGwpIHx8IChmaWVsZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gY2xhenouZXF1YWxzKGZpZWxkLmdldEphdmFDbGFzcygpKTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0FwcGxpY2F0aW9uRXhjZXB0aW9uKEphdmFDbGFzcyBleGNlcHRpb24sIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoZXhjZXB0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gRXhlbXB0IEVKQkV4Y2VwdGlvbiBmcm9tIHRoZSBhcHBsaWNhdGlvbiBleGNlcHRpb24gY2hlY2sgYmVjYXVzZSBpdCdsbCBkcml2ZSB1c2VycyBjcmF6eSB0byBzZWUgCi0JCS8vIGl0IGZsYWdnZWQgYXMgYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uLgotCQl0cnkgewotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2FtZVR5cGUoZXhjZXB0aW9uLCBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCRVhDRVBUSU9OLCBiZWFuKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZ2dlZCBpbiBnZXRUeXBlKCkKLQkJCS8vIGlmIEVKQkV4Y2VwdGlvbiBjYW4ndCBiZSBmb3VuZCwgdGhlbiB0aGVyZSdzIHByb2JhYmx5IGEgc3lzdGVtIEpBUiBtaXNzaW5nCi0JCX0KLQkJCi0JCS8vIDE4LjEuMSBBcHBsaWNhdGlvbiBleGNlcHRpb25zCi0JCS8vIEFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpcyBhbiBleGNlcHRpb24gZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhIG1ldGhvZCBvZiB0aGUgZW50ZXJwcmlzZQotCQkvLyBCZWFuJ3MgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXMsIG90aGVyIHRoYW4gdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkJcmV0dXJuICFpc1JlbW90ZUV4Y2VwdGlvbihleGNlcHRpb24sIGJlYW4pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNSZW1vdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGphdmFSbWlSZW1vdGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFLCBiZWFuKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oY2xhenosIGphdmFSbWlSZW1vdGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNSZXNlcnZlZFdvcmQoU3RyaW5nIG5hbWUpIHsKLQkJaWYobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyB1cHBlck5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCWZvcihpbnQgaT0wOyBpPF9yZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZih1cHBlck5hbWUuZXF1YWxzKF9yZXNlcnZlZFdvcmRzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUnVudGltZUV4Y2VwdGlvbihKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgcnVudGltZUV4YyA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OLCBiZWFuKTsKLQkJCXJldHVybiBpc0V4Y2VwdGlvbihjbGF6eiwgcnVudGltZUV4Yy5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVtb3RlRXhjZXB0aW9uKEphdmFDbGFzcyBjbGF6eiwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyByZW1vdGVFeGMgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEVFWENFUFRJT04sIGJlYW4pOwotCQkJcmV0dXJuIGlzRXhjZXB0aW9uKGNsYXp6LCByZW1vdGVFeGMuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGNsYXp6IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0V4Y2VwdGlvbihKYXZhQ2xhc3MgY2xhenosIEphdmFDbGFzcyBleGNlcHRpb24pIHsKLQkJaWYoKGNsYXp6ID09IG51bGwpIHx8IChleGNlcHRpb24gPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20oY2xhenosIGV4Y2VwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGVpdGhlciBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb24uCi0JICogVGhlIGJlYW4gaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlyZXR1cm4gaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBqYXZhVXRpbENvbGxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLkVudW1lcmF0aW9uLCBvciBhIHR5cGUgd2hpY2ggaW5oZXJpdHMvZXh0ZW5kcyBqYXZhLnV0aWwuRW51bWVyYXRpb24uCi0JICogVGhlIGJlYW4gaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBqYXZhLnV0aWwuRW51bWVyYXRpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKEphdmFIZWxwZXJzIHR5cGUsIEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlKYXZhSGVscGVycyBqYXZhVXRpbEVudW1lcmF0aW9uID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OLCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxFbnVtZXJhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGVpdGhlciBqYXZhLnV0aWwuU2V0LCBvciBhIHR5cGUgd2hpY2ggaW5oZXJpdHMvZXh0ZW5kcyBqYXZhLnV0aWwuU2V0LgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLlNldCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tU2V0KEphdmFIZWxwZXJzIHR5cGUsIEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlKYXZhSGVscGVycyBqYXZhVXRpbFNldCA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9TRVQsIGJlYW4pOwotCQlyZXR1cm4gaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBqYXZhVXRpbFNldCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgdGhlIGNvbXBhcmUgdHlwZSwgb3IgaW5oZXJpdHMvZXh0ZW5kcyB0aGUgY29tcGFyZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEphdmFIZWxwZXJzIHR5cGUsIEphdmFIZWxwZXJzIGNvbXBhcmVUeXBlKSB7Ci0JCWlmKCh0eXBlID09IG51bGwpIHx8IChjb21wYXJlVHlwZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCWlmKHR5cGUuaXNQcmltaXRpdmUoKSB8fCBjb21wYXJlVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlpZih0eXBlLmlzUHJpbWl0aXZlKCkgJiYgY29tcGFyZVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCXJldHVybiB0eXBlLmdldFByaW1pdGl2ZSgpLmVxdWFscyhjb21wYXJlVHlwZS5nZXRQcmltaXRpdmUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZih0eXBlLmlzQXJyYXkoKSAmJiBjb21wYXJlVHlwZS5pc0FycmF5KCkpIHsKLQkJCUphdmFDbGFzcyBjbGFzc1R5cGUgPSB0eXBlLmdldFdyYXBwZXIoKTsKLQkJCUphdmFDbGFzcyBjbGFzc0NvbXBhcmVUeXBlID0gY29tcGFyZVR5cGUuZ2V0V3JhcHBlcigpOwotCQkJaWYoKGNsYXNzVHlwZSA9PSBudWxsKSB8fCAoY29tcGFyZVR5cGUgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlKYXZhSGVscGVycyBmaW5hbFR5cGUgPSAoKEFycmF5VHlwZSljbGFzc1R5cGUpLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQkJSmF2YUhlbHBlcnMgZmluYWxDb21wYXJlVHlwZSA9ICgoQXJyYXlUeXBlKWNsYXNzQ29tcGFyZVR5cGUpLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20oZmluYWxUeXBlLCBmaW5hbENvbXBhcmVUeXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBjb21wYXJlVHlwZS5nZXRXcmFwcGVyKCkuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLmdldFdyYXBwZXIoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzQXNzb2NpYXRlZFdpdGhRdWVyeShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgTWV0aG9kIG1ldGhvZCkgewotCQkvLyBDaGVjayBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbC4KLQkJTGlzdCBxdWVyaWVzID0gY21wLmdldFF1ZXJpZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBxdWVyaWVzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlRdWVyeSBxdWVyeSA9IChRdWVyeSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlRdWVyeU1ldGhvZCBxdWVyeU1ldGhvZCA9IHF1ZXJ5LmdldFF1ZXJ5TWV0aG9kKCk7Ci0JCQlpZihxdWVyeU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJLy8gTGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZigocXVlcnlNZXRob2QuZ2V0TmFtZSgpID09IG51bGwpIHx8IHF1ZXJ5TWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBMZXQgdGhlIEVKQkphclZSdWxlIHJlcG9ydCB0aGlzCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKHF1ZXJ5TWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmb3VuZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzQmVhbk1hbmFnZWRTZXNzaW9uKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiAoKChTZXNzaW9uKWJlYW4pLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkJFQU4pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyB0aGUgc3RhdGljIGluaXRpYWxpemVyIHVzZWQgZm9yIGludGVyZmFjZXMgKCI8Y2xpbml0PiIpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xpbml0TWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNKTkRJTmFtaW5nQ29udGV4dChGaWVsZCBmaWVsZCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIGRlZmluZWQgb24gamF2YS5sYW5nLk9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhTGFuZ09iamVjdEZpZWxkKEVudGVycHJpc2VCZWFuIGJlYW4sIEZpZWxkIGZpZWxkKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIGZpZWxkLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGRlZmluZWQgb24gbmFtZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3duZWRCeShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIGNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGdpdmVuIGNsYXNzIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3Mgb3duZXIsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGhlbHBlciA9IGdldFR5cGUoY2xhc3NOYW1lLCBiZWFuKTsKLQkJCWlmKGhlbHBlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlKYXZhQ2xhc3Mgb2JqZWN0ID0gaGVscGVyLmdldFdyYXBwZXIoKTsKLQkJCQotCQkJcmV0dXJuIGlzU2FtZVR5cGUob3duZXIsIG9iamVjdCk7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjbGFzcyBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2FtZVR5cGUoSmF2YUhlbHBlcnMgb3duZXIsIEphdmFIZWxwZXJzIG9iamVjdCkgewotCQlpZihvd25lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKG93bmVyLmlzUHJpbWl0aXZlKCkgJiYgb2JqZWN0LmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIEJvdGggYXJlIEphdmFEYXRhVHlwZQotCQkJcmV0dXJuIG93bmVyLmdldFByaW1pdGl2ZSgpLmVxdWFscyhvYmplY3QuZ2V0UHJpbWl0aXZlKCkpOwotCQl9Ci0JCWVsc2UgaWYob3duZXIuaXNBcnJheSgpICYmIG9iamVjdC5pc0FycmF5KCkpIHsKLQkJCS8vIEJvdGggYXJlIEFycmF5VHlwZQotCQkJQXJyYXlUeXBlIG93bmVyQXJyYXkgPSAoQXJyYXlUeXBlKW93bmVyOwotCQkJQXJyYXlUeXBlIG9iamVjdEFycmF5ID0gKEFycmF5VHlwZSlvYmplY3Q7Ci0JCQlyZXR1cm4gaXNTYW1lVHlwZShvd25lckFycmF5LmdldEZpbmFsQ29tcG9uZW50VHlwZSgpLCBvYmplY3RBcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSk7Ci0JCX0KLQkJZWxzZSBpZigob3duZXIuZ2V0V3JhcHBlcigpICE9IG51bGwpICYmIChvYmplY3QuZ2V0V3JhcHBlcigpICE9IG51bGwpKSB7Ci0JCQkvLyBCb3RoIGFyZSBKYXZhQ2xhc3MKLQkJCXJldHVybiBvd25lci5nZXRXcmFwcGVyKCkuZXF1YWxzKG9iamVjdC5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gbWlzbWF0Y2hpbmcgSmF2YUhlbHBlcnMgdHlwZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgaXMgZGVmaW5lZCBvbiBqYXZhLmxhbmcuT2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFMYW5nT2JqZWN0TWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMZWdhbFJNSV9JSU9QSW5oZXJpdGFuY2UoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMZWdhbFJNSV9JSU9QVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhSGVscGVycyBoZWxwZXIpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihoZWxwZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiBpc1NlcmlhbGl6YWJsZShoZWxwZXIsIGJlYW4pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMb2NhbFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUhlbHBlcnMgdHlwZSkgewotCQl0cnkgewotCQkJaWYoaXNTYW1lVHlwZSh0eXBlLCBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKSkpIHsKLQkJCQkvLyBJZiB0aGVyZSdzIGFuIHVuZGVmaW5lZCBwcmltYXJ5IGtleSAoamF2YS5sYW5nLk9iamVjdCksIGRvbid0IGZsYWcgaXQgYXMgYSBsb2NhbCB0eXBlLgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gTGV0IHRoZSBERCB2YWxpZGF0aW9uIHJlcG9ydCB0aGlzLgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihpc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSwgdHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihpc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCksIHR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gQml0IG9mIGEgcGVyZm9ybWFuY2UgaGFjayBoZXJlLgotCQkvLyBEb24ndCB3YW50IHRvIGxvYWQgYW5kIHBhcnNlIHRoZSBlbnRpcmUgRUpCSmFyIGp1c3QgdG8gY2hlY2sgaWYKLQkJLy8gdGhpcyB0eXBlIGlzIGxvY2FsLCBzbyBhc3N1bWUgdGhhdCBpZiB0aGUgZXh0ZW5kcyAKLQkJLy8gamF2YXguZWpiLkVKQkxvY2FsSG9tZSBvciBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QsIHRoZW4gaXQncyBsb2NhbC4KLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGVqYkxvY2FsSG9tZSA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUUsIGJlYW4pOwotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShlamJMb2NhbEhvbWUsIHR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gaWdub3JlIGFuZCB0cnkgb3RoZXIgdHlwZQotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgZWpiTG9jYWxPYmplY3QgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1QsIGJlYW4pOwotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShlamJMb2NhbE9iamVjdCwgdHlwZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzVW5rbm93blByaW1hcnlLZXkoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQlyZXR1cm4gdXNlc1Vua25vd25QcmltYXJ5S2V5KChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW4pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZXNVbmtub3duUHJpbWFyeUtleShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZihjbXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYoaXNTYW1lVHlwZShjbXAuZ2V0UHJpbWFyeUtleSgpLCBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBjbXApKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiBqYXZhLmxhbmcuT2JqZWN0IGNhbid0IGJlIGZvdW5kLCB0aGVyZSdzIGJpZ2dlciBwcm9ibGVtcyB0aGFuIHZhbGlkYXRpbmcKLQkJCS8vIGl0IG1pc3Rha2VubHkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmKGNtcC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQlMaXN0IGNtcEZpZWxkcyA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKTsKLQkJCWlmKGNtcEZpZWxkcyAhPSBudWxsICYmICFjbXBGaWVsZHMuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGNtcEZpZWxkcy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJQ01QQXR0cmlidXRlIGF0dHJpYiA9IChDTVBBdHRyaWJ1dGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGlzVW5rbm93blByaW1hcnlLZXkoYXR0cmliKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCSAgfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVW5pZGlyZWN0aW9uYWxSZWxhdGlvbnNoaXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUpIHsKLQkJLy8gUGFnZSAxMzEgb2YgRUpCIDIuMDoKLQkJLy8gQSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGNtci1maWVsZCBvbiB0aGUgZW50aXR5IGJlYW4gaW5zdGFuY2UgZnJvbSB3aGljaAotCQkvLyBuYXZpZ2F0aW9uIGNhbiB0YWtlIHBsYWNlLCBhbmQgbm8gcmVsYXRlZCBjbXItZmllbGQgb24gdGhlIGVudGl0eSBiZWFuIGluc3RhbmNlIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKLQkJLy8gcmVsYXRpb25zaGlwLiBVbmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGFyZSB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBCZWFuIFByb3ZpZGVyIHdpc2hlcyB0byByZXN0cmljdAotCQkvLyB0aGUgdmlzaWJpbGl0eSBvZiBhIHJlbGF0aW9uc2hpcC4KLQkJRW50aXR5IHNvdXJjZUVudGl0eSA9IHJvbGUuZ2V0U291cmNlKCkuZ2V0RW50aXR5QmVhbigpOwotCQlpZihzb3VyY2VFbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighc291cmNlRW50aXR5LmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUNNUkZpZWxkIHNvdXJjZUNNUkZpZWxkID0gcm9sZS5nZXRDbXJGaWVsZCgpOwotCQlpZihzb3VyY2VDTVJGaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUVKQlJlbGF0aW9uc2hpcFJvbGUgb3Bwb3NpdGUgPSByb2xlLmdldE9wcG9zaXRlKCk7Ci0JCWlmKG9wcG9zaXRlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJQ01SRmllbGQgb3Bwb3NpdGVDTVJGaWVsZCA9IG9wcG9zaXRlLmdldENtckZpZWxkKCk7Ci0JCWlmKG9wcG9zaXRlQ01SRmllbGQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JfQotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1Vua25vd25QcmltYXJ5S2V5KENNUEF0dHJpYnV0ZSBhdHRyaWIpIHsKLQkJaWYoYXR0cmliID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gU2VjdGlvbiAxMC44LjMKLQkJLy8gQnkgZGVmaW5pdGlvbiwgdGhlIGRlcGxveWVyJ3MgZ2VuZXJhdGVkIENNUCBmaWVsZCdzIG5hbWUgaXMgZGVmaW5lZCBpbiB0aGUgCi0JCS8vIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuV0FTX0dFTkVSQVRFRF9TVFJJTkdfRklFTEQgY29uc3RhbnQuCi0JCXJldHVybiBDb250YWluZXJNYW5hZ2VkRW50aXR5LldBU19HRU5FUkFURURfU1RSSU5HX0ZJRUxELmVxdWFscyhhdHRyaWIuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHJpbWl0aXZlUHJpbWFyeUtleShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZihjbXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCWlmKChjbXAuZ2V0UHJpbUtleUZpZWxkKCkgIT0gbnVsbCkgJiYgIWNtcC5nZXRQcmltS2V5RmllbGQoKS5lSXNQcm94eSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1YmxpYyhGaWVsZCBmaWVsZCkgewotCQlpZiAoIGZpZWxkID09IG51bGwgKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMID09IGZpZWxkLmdldEphdmFWaXNpYmlsaXR5KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1YmxpYyggTWV0aG9kIG1ldGhvZCApIHsKLQkJaWYgKCBtZXRob2QgPT0gbnVsbCApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwgPT0gbWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBDbGFzcyB0eXBlIGlzIHNlcmlhbGl6YWJsZS4KLQkgKgotCSAqIFJNSSAxLjMgc3BlY2lmaWNhdGlvbgotCSAqIDIuNiBQYXJhbWV0ZXIgUGFzc2luZyBpbiBSZW1vdGUgTWV0aG9kIEludm9jYXRpb24KLQkgKiBBbiBhcmd1bWVudCB0bywgb3IgYSByZXR1cm4gdmFsdWUgZnJvbSwgYSByZW1vdGUgb2JqZWN0IGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQKLQkgKiBpcyBzZXJpYWxpemFibGUuIFRoaXMgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzLCByZW1vdGUgb2JqZWN0cywgYW5kIG5vbi1yZW1vdGUKLQkgKiBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBqYXZhLmlvLlNlcmlhbGl6YWJsZSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU2VyaWFsaXphYmxlKEphdmFIZWxwZXJzIGNsLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYoY2wgPT0gbnVsbCkgewotCQkJLy8gYXNzdW1lIGl0J3Mgdm9pZAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJLy8gQ2hlY2sgaWYgdGhlIHR5cGUgcmVmbGVjdGVkIHByb3Blcmx5Ci0JCWlzVmFsaWRUeXBlKGNsKTsKLQkJCi0JCWlmICggY2wuaXNQcmltaXRpdmUoKSApIHsKLQkJCS8vIEphdmFIZWxwZXJzIGlzIGEgSmF2YURhdGFUeXBlCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKGNsLmlzQXJyYXkoKSkgewotCQkJQXJyYXlUeXBlIGFycmF5ID0gKEFycmF5VHlwZSljbDsKLQkJCWlmKGFycmF5LmlzUHJpbWl0aXZlQXJyYXkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJLy8gZWxzZSwgbm90IHByaW1pdGl2ZSwgc28gY2hlY2sgaXRzIGNvbnRlbnRzCi0JCQljbCA9IGFycmF5LmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCi0JCUphdmFIZWxwZXJzIHJlbW90ZSA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSwgYmVhbik7Ci0JCWlmKGlzQXNzaWduYWJsZUZyb20oY2wsIHJlbW90ZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBzZXJpYWwgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0lPX1NFUklBTElaQUJMRSwgYmVhbik7Ci0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGNsLCBzZXJpYWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNTdGF0ZWZ1bChFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gKCgoU2Vzc2lvbiliZWFuKS5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVGVUwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNTdGF0ZWxlc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuICgoKFNlc3Npb24pYmVhbikuZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFTEVTUyk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbm5hbWVkUGFja2FnZShKYXZhUGFja2FnZSBwa2cpIHsKLQkJaWYocGtnID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlTdHJpbmcgcGtnTmFtZSA9IHBrZy5nZXROYW1lKCk7Ci0JCXJldHVybiAoKHBrZ05hbWUgPT0gbnVsbCkgfHwgKHBrZ05hbWUuZXF1YWxzKCIiKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWNoYXJbXSBuYW1lQ2hhciA9IG5hbWUudG9DaGFyQXJyYXkoKTsKLQkJaWYobmFtZUNoYXIubGVuZ3RoIDwgMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChuYW1lQ2hhclswXSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllciA9IHRydWU7Ci0JCWZvcihpbnQgaT0xOyBpPG5hbWVDaGFyLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZighQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVDaGFyW2ldKSkgewotCQkJCWlzVmFsaWRKYXZhSWRlbnRpZmllciA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkSmF2YUlkZW50aWZpZXI7Ci0JfQotCQotCS8qKgotCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCSAqLi4uCi0JICogT25seSBhIHN0YXRlZnVsIFNlc3Npb24gYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIG1heSAKLQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqLi4uCi0JICogVGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBTZXNzaW9uIGJlYW4gd2l0aCBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gdG8gcmVseSBvbiB0aGUgCi0JICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JICoga25vd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkIGFuZCBpdCBrbm93cyB0aGUgb3V0Y29tZSBvZiB0aGUgCi0JICogdHJhbnNhY3Rpb24gY29tbWl0LgotCSAqLi4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRTZXNzaW9uVHlwZUVsZW1lbnQoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCWlmKHNlc3Npb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBjaGVjayBzeW50YXgKLQkJaWYoIXNlc3Npb24uaXNTZXRTZXNzaW9uVHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFRlVMKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChTZXNzaW9uIHNlc3Npb25CZWFuKSB7Ci0JCWlmKHNlc3Npb25CZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIXNlc3Npb25CZWFuLmlzU2V0VHJhbnNhY3Rpb25UeXBlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uQmVhbi5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5CRUFOKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgdHlwZSBpcyBub3QgcmVmbGVjdGVkIHByb3Blcmx5LCB0aHJvdyBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGlzVmFsaWRUeXBlKEphdmFIZWxwZXJzIHR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZih0eXBlID09IG51bGwpIHsKLQkJCS8vIENoZWF0aW5nIGhlcmUuIFNob3VsZCB0ZWNobmljYWxseSBhY2Nlc3MgdGhlIE1zZ0xvZ2dlciBmcm9tIHRoZSBJRUpCVmFsaWRhdGlvbkNvbnRleHQKLQkJCS8vIHR5cGUsIGJ1dCB3aGVuIEkgc3RhcnRlZCBjaGFuZ2luZyB0aGlzIG1ldGhvZCBhbmQgdGhlIGlzVmFsaWRUeXBlSGllcmFyY2h5IG1ldGhvZCwKLQkJCS8vIEkgZW5kZWQgdXAgY2hhbmdpbmcgNDIgZmlsZXMgYmVjYXVzZSB0aGVzZSB0d28gbWV0aG9kcyBhcmUgY2FsbGVkIGRpcmVjdGx5IG9yCi0JCQkvLyBpbmRpcmVjdGx5IGZyb20gYWxtb3N0IGV2ZXJ5d2hlcmUuIFRoYXQgd2FzIHRvbyBtdWNoIGNoYW5nZSwgc28gSSBjaGVhdGVkLgotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJ0eXBlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LmFwcGVuZFN0YWNrVHJhY2UoKTsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCi0JCWlmKHR5cGUuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSB0eXBlIHJlZmxlY3RlZCBwcm9wZXJseS4gSWYgdGhlcmUncyBhbnkgY29tcGlsZSBlcnJvcnMsIG9yIHJlZmVyZW5jZXMgdG8gdW5yZXNvbHZlZAotCQkJLy8gY2xhc3NlcywgY2FuIG91dHB1dCBzb21lIG1pc3Rha2VuIGVycm9yIG1lc3NhZ2VzLgotCQkJLy8gZS5nLiBjbGFzcyBpcyBub3Qgc2VyaWFsaXphYmxlCi0JCQlKYXZhQ2xhc3Mgd3JhcHBlciA9IHR5cGUuZ2V0V3JhcHBlcigpOwotCQkJaWYodHlwZS5pc0FycmF5KCkpIHsKLQkJCQlBcnJheVR5cGUgYXJyYXkgPSAoQXJyYXlUeXBlKXR5cGU7Ci0JCQkJaXNWYWxpZFR5cGUoYXJyYXkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYoIXdyYXBwZXIuaXNFeGlzdGluZ1R5cGUoKSkgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiIXdyYXBwZXIuaXNFeGlzdGluZ1R5cGUoKTsgdHlwZSBpcyAiICsgd3JhcHBlci5nZXRKYXZhTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih3cmFwcGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgbm90IHJlZmxlY3RlZCBwcm9wZXJseSwgdGhyb3cgYW4gSW52YWxpZElucHV0RXhjZXB0aW9uLgotCSAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgaXNWYWxpZFR5cGUsIGFsc28gY2hlY2tzIGV2ZXJ5IGludGVyZmFjZSBhbmQgY2xhc3MKLQkgKiBwYXJlbnQgb2YgdGhlIHBhc3NlZC1pbiB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBpc1ZhbGlkVHlwZUhpZXJhcmNoeShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhSGVscGVycyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDaGVhdGluZyBoZXJlLiBTaG91bGQgdGVjaG5pY2FsbHkgYWNjZXNzIHRoZSBNc2dMb2dnZXIgZnJvbSB0aGUgSUVKQlZhbGlkYXRpb25Db250ZXh0Ci0JCQkvLyB0eXBlLCBidXQgd2hlbiBJIHN0YXJ0ZWQgY2hhbmdpbmcgdGhpcyBtZXRob2QgYW5kIHRoZSBpc1ZhbGlkVHlwZSBtZXRob2QsCi0JCQkvLyBJIGVuZGVkIHVwIGNoYW5naW5nIDQyIGZpbGVzIGJlY2F1c2UgdGhlc2UgdHdvIG1ldGhvZHMgYXJlIGNhbGxlZCBkaXJlY3RseSBvcgotCQkJLy8gaW5kaXJlY3RseSBmcm9tIGFsbW9zdCBldmVyeXdoZXJlLiBUaGF0IHdhcyB0b28gbXVjaCBjaGFuZ2UsIHNvIEkgY2hlYXRlZC4KLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgidHlwZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQkvLyBGaXJzdCwgY2hlY2sgdGhpcyBoZWxwZXIgaXRzZWxmLgotCQlpc1ZhbGlkVHlwZSh0eXBlKTsKLQkJSmF2YUhlbHBlcnMgamF2YUxhbmdPYmplY3QgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJaWYoaXNTYW1lVHlwZSh0eXBlLCBqYXZhTGFuZ09iamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSWYgdGhpcyBoZWxwZXIgZXhpc3RzLCBhbmQgaXMgbm90IGphdmEubGFuZy5PYmplY3QsIHRoZW4gY2hlY2sgZXZlcnkgc3VwZXJ0eXBlLgotCQlKYXZhQ2xhc3MgY2xhc3NUeXBlID0gdHlwZS5nZXRXcmFwcGVyKCk7Ci0JCWlmKGNsYXNzVHlwZSA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgYUxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoInR5cGUuZ2V0V3JhcHBlcigpIHJldHVybnMgbnVsbDsgdHlwZSBpcyAiICsgdHlwZS5nZXRKYXZhTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJLy8gQ2hlY2sgdGhlIHN1cGVyY2xhc3MuIFNpbmNlIHR5cGUgaXMgbm90IGphdmEubGFuZy5PYmplY3QsIHRoZXJlIGlzIGF0IGxlYXN0Ci0JCS8vIHRoZSBqYXZhLmxhbmcuT2JqZWN0IHN1cGVyY2xhc3MuCi0JCWlmKCFjbGFzc1R5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJSmF2YUNsYXNzIHN1cGVyVHlwZSA9IGNsYXNzVHlwZS5nZXRTdXBlcnR5cGUoKTsKLQkJCWlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHN1cGVyVHlwZSk7Ci0JCX0KLQkKLQkJLy8gQ2hlY2sgdGhlIHN1cGVyaW50ZXJmYWNlcywgaWYgdGhleSBleGlzdC4KLQkJTGlzdCBzdXBlckludGVyZmFjZXMgPSBjbGFzc1R5cGUuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJaWYoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc3VwZXJJbnRlcmZhY2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3Mgc3VwZXJJbnRmID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgc3VwZXJJbnRmKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSTUkgMS4zIHBhZ2UgNiBzZWN0aW9uIDIuNC4xLCAKLQkgKiAgICBBIHJlbW90ZSBtZXRob2QgZGVjbGFyYXRpb24gbXVzdCBpbmNsdWRlIHRoZSBleGNlcHRpb24gamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChvciBvbmUKLQkgKiAgICBvZiBpdHMgdXBzZXJjbGFzc2VzIHN1Y2ggYXMgamF2YS5pby5JT0V4Y2VwdGlvbiBvciBqYXZhLmxhbmcuRXhjZXB0aW9uKSBpbiBpdHMgdGhyb3dzCi0JICogICAgY2xhdXNlLCBpbiBhZGRpdGlvbiB0byBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMgZXhjZXB0aW9ucyAobm90ZSB0aGF0IGFwcGxpY2F0aW9uIAotCSAqICAgIHNwZWNpZmljIGV4Y2VwdGlvbnMgZG8gbm90IGhhdmUgdG8gZXh0ZW5kIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c1JlbW90ZUV4Y2VwdGlvbk9yUGFyZW50KEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uT3JQYXJlbnQoYmVhbiwgbWV0aG9kLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY2hlY2tzIGlmIFJlbW90ZUV4Y2VwdGlvbiAoZXhhY3RseSwgbm90IEV4Y2VwdGlvbiBvciBJT0V4Y2VwdGlvbikKLQkgKiBpcyBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuICF0aHJvd3NFeGNlcHRpb24oYmVhbiwgbWV0aG9kLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9PQkpFQ1ROT1RGT1VOREVYQ0VQVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NGaW5kZXJFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJvd3NFeGNlcHRpb24oYmVhbiwgbWV0aG9kLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0ZJTkRFUkVYQ0VQVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NDcmVhdGVFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJvd3NFeGNlcHRpb24oYmVhbiwgbWV0aG9kLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0NSRUFURUVYQ0VQVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NBcHBsaWNhdGlvbkV4Y2VwdGlvbihNZXRob2QgbWV0aG9kLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIENIS0oyNDE5ID0gezB9IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBqYXZhLmxhbmcuRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTguMS4xLCAxOC4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZihpc0FwcGxpY2F0aW9uRXhjZXB0aW9uKGV4Y2VwdGlvbiwgYmVhbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCB0aHJvd3MgdGhlIG5hbWVkIGV4Y2VwdGlvbiBvciBhIGNsYXNzIHdoaWNoIGV4dGVuZHMgdGhlIG5hbWVkIGV4Y2VwdGlvbi4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c0V4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgZXhjZXB0aW9uTmFtZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUxpc3QgZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IGdldFR5cGUoZXhjZXB0aW9uTmFtZSwgYmVhbikuZ2V0V3JhcHBlcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZXhjLCBleGNlcHRpb24pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIHJldHVybnMgdGhlIG5hbWVkIGV4Y2VwdGlvbiwgYW4gZXhjZXB0aW9uIHdoaWNoIGV4dGVuZHMgdGhlIG5hbWVkIGV4Y2VwdGlvbiwgb3Igb25lIG9mIHRoZSBwYXJlbnRzIG9mIHRoZSBuYW1lZCBleGNlcHRpb24gKGUuZy4gamF2YS5sYW5nLkV4Y2VwdGlvbikuCi0JICogVXNlIHRoaXMgbWV0aG9kIGlmIGl0IG5lZWRzIHRvIGJlIGRldGVjdGVkIHRoYXQgYW4gZXhjZXB0aW9uIGNhbiBiZSB0aHJvd24gZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2ggc29tZXRoaW5nIGdlbmVyaWMgbGlrZSBqYXZhLmxhbmcuRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb25PclBhcmVudChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgZXhjZXB0aW9uTmFtZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBleGNlcHRpb24gPSBnZXRUeXBlKGV4Y2VwdGlvbk5hbWUsIGJlYW4pLmdldFdyYXBwZXIoKTsKLQotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShleGMsIGV4Y2VwdGlvbikpIHsKLQkJCQkvLyBBc3NpZ25hYmxlIGZyb20gdGhlIG5hbWVkIGV4Y2VwdGlvbiwgZS5nLiBSZW1vdGVFeGNlcHRpb24gb3IgYSBjaGlsZCBvZiBSZW1vdGVFeGNlcHRpb24KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShleGNlcHRpb24sIGV4YykpIHsKLQkJCQkvLyBUaGUgbmFtZWQgZXhjZXB0aW9uIGlzIGFzc2lnbmFibGUgZnJvbSB0aGUgbWV0aG9kIGV4Y2VwdGlvbiwgZS5nLiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZXNDb2xsZWN0aW9uQ2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZigoYmVhbiA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJaWYocGFybXMgIT0gbnVsbCkgewotCQkJZm9yKGludCBpPTA7IGk8cGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSBwYXJtc1tpXTsKLQkJCQl0cnkgewotCQkJCQlpZihpc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihwYXJtLmdldEphdmFUeXBlKCksIGJlYW4pKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUgYW5kIHRlc3QgbmV4dCBwYXJtCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gTm93IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCQl0cnkgewotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24obWV0aG9kLmdldFJldHVyblR5cGUoKSwgYmVhbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZXNMb2NhbFR5cGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGJlYW4gPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWlmKHBhcm1zICE9IG51bGwpIHsKLQkJCWZvcihpbnQgaT0wOyBpPHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gcGFybXNbaV07Ci0JCQkJaWYoaXNMb2NhbFR5cGUoYmVhbiwgcGFybS5nZXRKYXZhVHlwZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBOb3cgY2hlY2sgdGhlIHJldHVybiB0eXBlCi0JCWlmKGlzTG9jYWxUeXBlKGJlYW4sIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSTWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjgxYjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotCi0vKioKLSAqIE1lc3NhZ2Uga2V5IGNvbnN0YW50cyBmb3IgV0FSIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0FSTWVzc2FnZUNvbnN0YW50cyBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9WQUxJREFUT1JfSUQgPSAiV0FSX1ZBTElEQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfTU9ERUxfTkFNRSA9ICJXQVJfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQgPSAiRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NNQUxMX0lDT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTEFSR0VfSUNPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkcgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fU0VSVkxFVF9NQVBQSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19KU1AgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfVExEID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dFTENPTUVfRklMRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkwgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9TRVJWTEVUID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUYgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TRVNTSU9OX1RJTUVPVVQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TRVNTSU9OX1RJTUVPVVQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlkiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEUiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRV9OQU1FID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRV9OQU1FIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0hUVFBfQ01EIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVFJBTlNQT1JUID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSlNQRklMRV9SRUYiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9XRUxDT01FX0ZJTEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRSIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9BVVRIX01FVEhPRCIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU4gPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjIgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjMgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMyIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjIiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIzIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0ZJTFRFUiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX1VOQ09OVEFJTkVEX01PRFVMRV9GSUxFX0VYQ0VQVElPTiA9ICJFUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfV0FSX0ZJTEUgPSAiRVJST1JfSU5WQUxJRF9XQVJfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9EVVBMSUNBVEVfV0VCX0lORl9MSUI9ICJFUlJPUl9EVVBMSUNBVEVfV0VCX0lORl9MSUIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1QgPSAiRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJID0gIkVSUk9SX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfRERfUEFSU0VfTElORUNPTCA9ICJXQVJfRERfUEFSU0VfTElORUNPTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfRERfUEFSU0VfTElORSA9ICJXQVJfRERfUEFSU0VfTElORSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfRERfQ0FOTk9UX09QRU5fREQgPSAiV0FSX0REX0NBTk5PVF9PUEVOX0REIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9OT0lORk8gPSAiV0FSX0REX1BBUlNFX05PSU5GTyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QgPSAiRVJST1JfRUFSX0lOVkFMSURfQ09OVEVYVF9ST09UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFCSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1QgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRSI7IC8vJE5PTi1OTFMtMSQJCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQ09ORkxJQ1RJTkdfV0xQX1BST0pFQ1QgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFIjsgIC8vJE5PTi1OTFMtMSQKLQkvL0oyRUUgMTQgTWVzc2FnZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1VSTF9QQVRURVJOX0VORF9XSVRIX0NBUlJBSUdFX1JFVFVSTiA9ICJNRVNTQUdFX1VSTF9QQVRURVJOX0VORF9XSVRIX0NBUlJBSUdFX1JFVFVSTiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkKLQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0OTM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndhcnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NNQUxMX0lDT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX05PX1dFTENPTUVfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9XQVJfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FQ09MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUl9ERF9QQVJTRV9OT0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSX0REX0NBTk5PVF9PUEVOX0REOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVFJBTlNQT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0ZJTFRFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQ09ORkxJQ1RJTkdfV0xQX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NFUlZFUl9UQVJHRVRfTUlTTUFUQ0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9VUkxfUEFUVEVSTl9FTkRfV0lUSF9DQVJSQUlHRV9SRVRVUk47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1NlY3VyaXR5X1JvbGVfTmFtZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYl9BcmNoaXZlX1ZhbGlkYXRvcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfUm9sZV9OYW1lXzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMjY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8zMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzM5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfUGFyYW1ldGVyX1ZhbHVlXzQwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80OTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX01pbWVfRXh0ZW5zaW9uXzU0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfTWltZV9UeXBlXzU1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfTWltZV9FeHRlbnNpb25fX181NjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfRmlsdGVyX05hbWVfNjY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9VUkxfNzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9VUkxfNzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9TZXJ2bGV0X05hbWVfNzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9UYWdsaWJfODA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9UYWdMaWJfX184MTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184ODsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjhiNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dhclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRUpCTG9jYWxSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5ubHMuUmVzb3VyY2VIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgV2FyVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIFdBUk1lc3NhZ2VDb25zdGFudHMgewotCXByb3RlY3RlZCBXQVJGaWxlIHdhckZpbGU7Ci0JcHJvdGVjdGVkIFdlYkFwcCB3ZWJERDsKLQlwcml2YXRlIEhhc2h0YWJsZSBodHRwTWV0aG9kcyA9IG51bGw7Ci0KLQkvLyBPcHRpb25hbCBjaGlsZCB2YWxpZGF0b3JzCi0JLy8gcHJvdGVjdGVkIFdlYkV4dFZhbGlkYXRvciB3ZWJFeHRWYWxpZGF0b3I7Ci0JLy8gcHJvdGVjdGVkIFdlYkJuZFZhbGlkYXRvciB3ZWJCbmRWYWxpZGF0b3I7Ci0KLQotCS8qKgotCSAqIFJlbGF0aW9uc2hpcE1hcFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXYXJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogV2lsbCBjb25zdHJ1Y3QgYSBIYXNoVGFibGUgb2Ygcm9sZXMsIGFuZCBjaGVjayBmb3IgZHVwbGljYXRlcyBhbmQgbnVsbCBlbnRyaWVzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaHRhYmxlCi0JICogQHBhcmFtIHJvbGVzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QKLQkgKi8KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEFuZFZhbGlkYXRlU2VjdXJpdHlSb2xlcyhFTGlzdCByb2xlcykgewotCi0JCUhhc2h0YWJsZSBzZWNSb2xlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaWYgKHJvbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoc2VjUm9sZXMpOwotCi0JCUl0ZXJhdG9yIHNSb2xlcyA9IHJvbGVzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHNSb2xlcy5oYXNOZXh0KCkpIHsKLQkJCQotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCX0KLQkJCQotCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSAoU2VjdXJpdHlSb2xlKSBzUm9sZXMubmV4dCgpOwotCi0KLQkJCVN0cmluZyBuYW1lID0gcm9sZS5nZXRSb2xlTmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQluYW1lID0gbmFtZS50cmltKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1NlY3VyaXR5X1JvbGVfTmFtZV82OwotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIHJvbGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHNlY1JvbGVzLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0KLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBuYW1lOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIHJvbGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2VjUm9sZXMucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlyZXR1cm4gc2VjUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW5zd2VyIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmVyLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gV0FSX0NBVEVHT1JZOwotCX0KLQotCS8vIE1lc3NhZ2luZyBoZWxwZXJzIC4uLgotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBVSS4KLQkgKiAKLQkgKiBAc2VlIEoyRUVWYWxpZGF0b3IjZ2V0TmFtZQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5XZWJfQXJjaGl2ZV9WYWxpZGF0b3JfODsKLQl9Ci0KLQkvLyBNZXNzYWdpbmcgaGVscGVycyAuLi4KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFZhbGlkYXRvciwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuCi0JICogCi0JICogQHNlZSBKMkVFVmFsaWRhdG9yI2dldE5hbWUKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlKG51bGwsICJ3ZWJBcmNoaXZlVmFsaWRhdG9yLm5hbWUiLCBsb2NhbGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgdmFsaWRhdGVTZWN1cml0eUNvbnN0cmFpbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSHR0cE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0KLQotCQlpZiAoaHR0cE1ldGhvZHMgPT0gbnVsbCkgeyAvLyBOZWVkIHRvIGNvbnN0cnVjdCB0aGUgSGFzaHRhYmxlLCBvbmNlCi0JCQlTdHJpbmdbXSBtTGlzdCA9IHsKLQkJCQkiR0VUIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJQVVQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJIRUFEIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiVFJBQ0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJQT1NUIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiREVMRVRFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiT1BUSU9OUyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkvL1dFQkRBVgotCQkJCSJBQ0siLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJBQ0wiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJCQVNFTElORS1DT05UUk9MIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiQklORCIsICAvLyROT04tTkxTLTEkCi0JCQkJIkJZRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIkNBTkNFTCIsICAvLyROT04tTkxTLTEkCi0JCQkJIkNIRUNLSU4iLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJDSEVDS09VVCIsICAvLyROT04tTkxTLTEkCi0JCQkJIkNPUFkiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJFUlJPUlJFU1BPTlNFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiSU5GTyIsICAvLyROT04tTkxTLTEkCi0JCQkJIklOVklURSIsICAvLyROT04tTkxTLTEkCi0JCQkJIkxBQkVMIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTE9DSyIsICAvLyROT04tTkxTLTEkCi0JCQkJIk1FUkdFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTUVTU0FHRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIk1LQUNUSVZJVFkiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJNS0NPTCIsICAvLyROT04tTkxTLTEkCi0JCQkJIk1LV09SS1NQQUNFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTU9WRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIk5PVElGWSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlBSQUNLIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUFJPUEZJTkQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJQUk9QUEFUQ0giLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJQUk9WSVNJT05BTFJFU1BPTlNFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUFVCTElTSCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFQklORCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFRElSRUNUUkVTUE9OU0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJSRUdJU1RFUiIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFUE9SVCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFUVVFU1QiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJSRVNQT05TRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlNFQVJDSCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlNVQ0NFU1NSRVNQT05TRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlVOQklORCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlVOQ0hFQ0tPVVQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJVTkxPQ0siLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJVUERBVEUiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJWRVJTSU9OLUNPTlRST0wiLy8kTk9OLU5MUy0xJAotCQkJfTsgCi0KLQkJCWh0dHBNZXRob2RzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtTGlzdC5sZW5ndGg7IGkrKykKLQkJCQlodHRwTWV0aG9kcy5wdXQobUxpc3RbaV0sICJibGEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBjb21wYXJlID0gbWV0aG9kLnRyaW0oKTsKLQkJcmV0dXJuIChodHRwTWV0aG9kcy5nZXQoY29tcGFyZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogV0FSIHZhbGlkYXRpb24gaXMgZHJpdmVuIGJ5IDMgcHJvbmcgYXBwcm9hY2g6IG8gWE1ML0RURCB2YWxpZGF0aW9uICh0aGlzIGlzIG5vdyBoYW5kbGVkIGJ5Ci0JICogdGhlIFhNTCBWYWxpZGF0b3IpIG8gQ29uc2lzdGVudCB3ZWIueG1sIGRhdGEgZW50cnkgdmFsaWRhdGlvbiBiZXlvbmQgRFREIGUuZy4sIGR1cGxpY2F0ZQotCSAqIGVudHJpZXMsIG51bGwgZW50cmllcyBldGMuIFRoaXMgaXMgYWxzbyBkcml2ZW4gYnkgdGhpcyB2YWxpZGF0b3IuIG8gd2ViLnhtbCByZWZlcmVuY2UgdG8KLQkgKiByZXNvdXJjZXMgaW4gdGhlICJmaWxlIHN5c3RlbSIuIFRoaXMgd2lsbCBub3QgYmUgcHJvdmlkZWQgYnkgdGhpcyB2YWxpZGF0b3IuIEluIHRoZSB3b3JrYmVuY2gKLQkgKiB0aGlzIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJvdmlkZWQgYnkgdGhlIGxpbmsgYnVpbGRlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVNaW1lTWFwcGluZygpOwotCQl2YWxpZGF0ZUNvbnRleHRQYXJhbWV0ZXJzKCk7Ci0JCXZhbGlkYXRlVGFnTGlicygpOwotCQl2YWxpZGF0ZVNlcnZsZXRNYXBwaW5ncyh3ZWJERC5nZXRTZXJ2bGV0TWFwcGluZ3MoKSk7Ci0JCXZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KHdlYkRELmdldEZpbGVMaXN0KCkpOwotCQl2YWxpZGF0ZUVycm9yUGFnZXMod2ViREQuZ2V0RXJyb3JQYWdlcygpKTsKLQkJdmFsaWRhdGVTZWN1cml0eUFuZFNlcnZsZXRzKCk7Ci0JCXZhbGlkYXRlRmlsdGVycyh3ZWJERC5nZXRGaWx0ZXJzKCkpOwotCQl2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKHdlYkRELmdldEZpbHRlck1hcHBpbmdzKCkpOwotCQl2YWxpZGF0ZVJlZnMoKTsKLQkJdmFsaWRhdGVMb2dpbkNvbmZpZyh3ZWJERC5nZXRMb2dpbkNvbmZpZygpKTsKLQkJdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXMod2ViREQuZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkpOwotCQl2YWxpZGF0ZU90aGVyKCk7Ci0JCXZhbGlkYXRlMTQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUxNCgpIHsKLQkJaW50IHZlcnNpb25JZCA9IHdlYkRELmdldFZlcnNpb25JRCgpOwotCQlpZiAodmVyc2lvbklkID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpIHsKLQkJCXZhbGlkYXRlVXJsUGF0dGVybigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVXJsUGF0dGVybigpIHsKLQkJTGlzdCBzZXJ2bGV0TWFwcGluZ3MgPSB3ZWJERC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0TWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCVNlcnZsZXRNYXBwaW5nIG1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpIHNlcnZsZXRNYXBwaW5ncy5nZXQoaSk7Ci0JCQlTdHJpbmcgdXJsUGF0dGVybiA9IG1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCQkJaW50IG5ld0xpbmVDaGFyID0gdXJsUGF0dGVybi5pbmRleE9mKENoYXJhY3Rlci5MSU5FX1NFUEFSQVRPUik7Ci0JCQlpZiAobmV3TGluZUNoYXIgIT0gLTEpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJcGFybXNbMF0gPSB1cmxQYXR0ZXJuOwotCQkJCXBhcm1zWzFdID0gbWFwcGluZy5nZXRTZXJ2bGV0KCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOLCBwYXJtcywgbWFwcGluZyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgTU9GIG1vZGVsLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gYW5kIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBtYXkgbm90IGJlIG51bGwuIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4KLQkgKiBtYXkgYmUgbnVsbCwgaWYgYSBmdWxsIGJ1aWxkIGlzIGRlc2lyZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+aGVscGVyPC9jb2RlPiBsb2FkcyBhIEVPYmplY3QuIFRoZSBFT2JqZWN0IGlzIHRoZSByb290IG9mIHRoZSBNT0YgbW9kZWwgYWJvdXQgdG8gYmUKLQkgKiB2YWxpZGF0ZWQuIFdoZW4gdGhpcyBvYmplY3QgaXMgdHJhdmVyc2VkLCB5b3UgY2FuIHJlYWNoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIE1PRiBtb2RlbCB3aGljaAotCSAqIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5yZXBvcnRlcjwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IKLQkgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gaXMgYW4gYXJyYXkgb2YgZmlsZSBuYW1lcyB3aGljaCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKLQkgKiB2YWxpZGF0aW9uLiBJZiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+IGlzIG51bGwsIG9yIGlmIGl0IGlzIGFuIGVtcHR5IGFycmF5LCB0aGVuIGEgZnVsbAotCSAqIGJ1aWxkIGlzIHBlcmZvcm1lZC4gT3RoZXJ3aXNlLCB2YWxpZGF0aW9uIG9uIGp1c3QgdGhlIGZpbGVzIGxpc3RlZCBpbiB0aGUgVmVjdG9yIGlzCi0JICogcGVyZm9ybWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7Ci0JfQotCQotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdGF0dXMgPSBzdXBlci52YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJCi0KLQkJLy8gRmlyc3QgcmVtb3ZlIGFsbCBwcmV2aW91cyBtc2cuIGZvciB0aGlzIHByb2plY3QKLQkJX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIG51bGwpOyAvLyBOb3RlIHRoZSBXYXJIZWxwZXIgd2lsbCByZXR1cm4gd2ViLnhtbCB3aXRoIGEKLQkJCQkJCQkJCQkJCQkvLyBudWxsIG9iamVjdCBhcyB3ZWxsCi0KLQkJaWYoICFfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSl7Ci0JCQkKLQkJCXdhckZpbGUgPSAoV0FSRmlsZSkgX2hlbHBlci5sb2FkTW9kZWwoV0FSX01PREVMX05BTUUpOwotCQkJCi0JCQl0cnkgewotCQkJCWlmICh3YXJGaWxlICE9IG51bGwpIHsKLQkJCQkJd2ViREQgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9JTlZBTElEX1dBUl9GSUxFKTsKLQkJCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBlcnJvck1zZy5nZXRUZXh0KCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKSk7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCQl9Ci0JCi0JCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IGUudG9TdHJpbmcoKTsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCwgcGFybXMpOwotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1zZy5nZXRUZXh0KCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKSk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2csIGUpOwotCQkJfQotCQl9ZWxzZXsKLQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uIHdoZW4gdGhlIHJlcG9ydGVyIGFuZCBoZWxwZXIgaGF2ZSBiZWVuIHN1cHBsaWVkIHZpYQotCSAqIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgYVdhckZpbGUpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJd2FyRmlsZSA9IChXQVJGaWxlKSBhV2FyRmlsZTsKLQkJCXdlYkREID0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCQl2YWxpZGF0ZSgpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSBlLnRvU3RyaW5nKCk7Ci0JCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCwgcGFybXMpOwotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMKLQkgKiByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUgbXVzdCBhcHBlYXIgaW4gYSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LiA8IUVMRU1FTlQKLQkgKiBhdXRoLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKik+IFRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICogc2VjdXJpdHkgcm9sZS4gPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+IENyZWF0aW9uIGRhdGU6ICg3LzYvMjAwMSAzOjM5OjM0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhdXRoQ29uc3RyYWludAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50LCBIYXNodGFibGUgc2VjUm9sZXMpIHsKLQotCQlFTGlzdCByb2xlTGlzdCA9IGF1dGhDb25zdHJhaW50LmdldFJvbGVzKCk7Ci0KLQkJaWYgKHJvbGVMaXN0ICE9IG51bGwgJiYgIXJvbGVMaXN0LmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgYXV0aFJvbGVzID0gcm9sZUxpc3QuaXRlcmF0b3IoKTsKLQkJCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQkJCXdoaWxlIChhdXRoUm9sZXMuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHJvbGUgPSAoU3RyaW5nKSBhdXRoUm9sZXMubmV4dCgpOwotCQkJCWlmIChyb2xlID09IG51bGwgfHwgcm9sZS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfUm9sZV9OYW1lXzE5OwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGF1dGhDb25zdHJhaW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChyZW1lbWJlci5nZXQocm9sZS50cmltKCkpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHJvbGU7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIGF1dGhDb25zdHJhaW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChyb2xlLnRyaW0oKSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJdmFsaWRhdGVBdXRoU2VjUm9sZSgiIiwgcm9sZSwgc2VjUm9sZXMsIGF1dGhDb25zdHJhaW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy81LzIwMDEgMjoyMDowMiBQTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbnRleHRQYXJhbWV0ZXJzKCkgewotCi0JCS8vIHdlIG11c3QgdmVyaWZ5IHRoYXQgZXZlcnkgcGFyYW0tbmFtZSBpcyB1bmlxdWU7Ci0JCS8vIHBhcmFtLW5hbWUgYXBwZWFycyBpbiBjb250ZXh0IHBhcmFtZXRlcnMsIGZpbHRlcgotCQkvLyBhbmQgc2VydmxldHMuIFdlIG11c3QgY2hlY2sgZWFjaC4KLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCS8vIGNoZWNrIGNvbnRleHQgcGFyYW1ldGVycyAtIGVhY2ggcGFyYW0tbmFtZSBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCUl0ZXJhdG9yIGNwYXJhbXMgPSB3ZWJERC5nZXRDb250ZXh0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjcGFyYW1zLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlDb250ZXh0UGFyYW0gY29udGV4dCA9IChDb250ZXh0UGFyYW0pIGNwYXJhbXMubmV4dCgpOwotCi0JCQlTdHJpbmcgbmFtZSA9IGNvbnRleHQuZ2V0UGFyYW1OYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNTsKLQotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgY29udGV4dCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyBpZiAocmVtZW1iZXIuZ2V0KG5hbWUgKyB2YWx1ZSkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1ICsgIjogIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCBjb250ZXh0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIHJlbWVtYmVyLnB1dChuYW1lICsgdmFsdWUsICJZZWEiKTsKLQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gY2hlY2sgc2VydmxldCBpbml0LXBhcmFtIC0gZWFjaCBwYXJhbS1uYW1lIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIGEgc2VydmxldAotCQlJdGVyYXRvciBzZXJ2bGV0cyA9IHdlYkRELmdldFNlcnZsZXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHNlcnZsZXRzLmhhc05leHQoKSkgewotCQkJU2VydmxldCBuZXh0U2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0cy5uZXh0KCk7Ci0JCQlJdGVyYXRvciBwYXJhbXMgPSBuZXh0U2VydmxldC5nZXRQYXJhbXMoKS5pdGVyYXRvcigpOwotCQkJcmVtZW1iZXIuY2xlYXIoKTsKLQkJCXdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7Ci0JCQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIHBhcmFtcy5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCQluYW1lID0gbmFtZS50cmltKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzMyOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGluaXRQYXJhbSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1ICsgIjogIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgaW5pdFBhcmFtKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGZpbHRlciBpbml0LXBhcmFtIC0gZWFjaCBwYXJhbS1uYW1lIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIGEgZmlsdGVyCi0JCUl0ZXJhdG9yIGZpbHRlcnMgPSB3ZWJERC5nZXRGaWx0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGZpbHRlcnMuaGFzTmV4dCgpKSB7Ci0JCQlGaWx0ZXIgbmV4dEZpbHRlciA9IChGaWx0ZXIpIGZpbHRlcnMubmV4dCgpOwotCQkJSXRlcmF0b3IgcGFyYW1zID0gbmV4dEZpbHRlci5nZXRJbml0UGFyYW1zKCkuaXRlcmF0b3IoKTsKLQkJCXJlbWVtYmVyLmNsZWFyKCk7Ci0JCQl3aGlsZSAocGFyYW1zLmhhc05leHQoKSkgewotCQkJCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKSBwYXJhbXMubmV4dCgpOwotCQkJCVN0cmluZyBuYW1lID0gaW5pdFBhcmFtLmdldFBhcmFtTmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zOTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBpbml0UGFyYW0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjUgKyAiOiAiICsgbmFtZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgaW5pdFBhcmFtKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgRUpCIHJlZmVyZW5jZXMuCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZnMoRWpiUmVmSW1wbCBlcmVmKSB7Ci0JCS8vIHRyeSB7Ci0KLQkJRUFSRmlsZSBlYXJGaWxlID0gd2FyRmlsZS5nZXRFQVJGaWxlKCk7Ci0JCUVudGVycHJpc2VCZWFuIGViID0gbnVsbDsKLQotCQlpZiAoZWFyRmlsZSAhPSBudWxsKQotCQkJZWIgPSBlYXJGaWxlLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKGVyZWYsIHdhckZpbGUuZ2V0VVJJKCkpOwotCi0JCWlmICghKGViID09IG51bGwpKSB7Ci0JCQlMaXN0IGVqYlJlZnMgPSBlYi5nZXRFamJSZWZzKCk7Ci0KLQkJCWludCBudW1SZWZzID0gZWpiUmVmcy5zaXplKCk7Ci0KLQkJCVNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQotCQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCQlTdHJpbmcgbmV4dE5hbWUgPSAoKEVqYlJlZkltcGwpIChlamJSZWZzLmdldChyZWZObykpKS5nZXROYW1lKCk7Ci0KLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBlYi5nZXROYW1lKCk7Ci0JCQkJaWYgKCEocmVmU2V0LmFkZChuZXh0TmFtZSkpKSB7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTLCBwYXJtcywgZWpiUmVmcy5nZXQocmVmTm8pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB9IGNhdGNoIChVbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24gdWUpIHsKLQkJLy8gU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkvLyBwYXJtc1swXSA9IHdhckZpbGUuZ2V0TmFtZSgpOwotCQkvLyBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OLCBwYXJtcyk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmcyhMaXN0IGVqYlJlZnMpIHsKLQkJaW50IG51bVJlZnMgPSBlamJSZWZzLnNpemUoKTsKLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgbnVtUmVmczsgcmVmTm8rKykgewotCQkJRWpiUmVmSW1wbCBlcmVmID0gKEVqYlJlZkltcGwpIGVqYlJlZnMuZ2V0KHJlZk5vKTsKLQkJCWlmIChlcmVmLmlzU2V0VHlwZSgpKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBlcmVmLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRSwgbnVsbCwgZXJlZik7IC8vIFR5cGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBFTlRJVFkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gRk9PCi0JCQkJfQotCQkJfQotCQkJaWYgKGVyZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJCWlmIChuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX2VqYl9yZWZfbmFtZV80NDsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBlcmVmKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChyZW1lbWJlci5nZXQobmFtZSkgIT0gbnVsbCkgeyAvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gbmFtZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUYsIHBhcm1zLCBlcmVmKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX2VqYl9yZWZfbmFtZV80NDsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGVyZWYpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0KLQkJCXZhbGlkYXRlRUpCUmVmcyhlcmVmKTsKLQkJCXZhbGlkYXRlRUpCUmVmTWFuYWRhdG9yeUVsZW1lbnRzKGVyZWYsIHdlYkRELmdldERpc3BsYXlOYW1lKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiB2YWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTG9jYWxSZWZzKExpc3QgZWpiUmVmcykgewotCQlpbnQgbnVtUmVmcyA9IGVqYlJlZnMuc2l6ZSgpOwotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBudW1SZWZzOyByZWZObysrKSB7Ci0JCQlFSkJMb2NhbFJlZkltcGwgZXJlZiA9IChFSkJMb2NhbFJlZkltcGwpIGVqYlJlZnMuZ2V0KHJlZk5vKTsKLQkJCWlmIChlcmVmLmlzU2V0VHlwZSgpKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBlcmVmLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRSwgbnVsbCwgZXJlZik7IC8vIFR5cGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBFTlRJVFkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gRk9PCi0JCQkJfQotCQkJfQotCQkJaWYgKGVyZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJCWlmIChuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX2VqYl9yZWZfbmFtZV80NDsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBlcmVmKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChyZW1lbWJlci5nZXQobmFtZSkgIT0gbnVsbCkgeyAvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gbmFtZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUYsIHBhcm1zLCBlcmVmKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX2VqYl9yZWZfbmFtZV80NDsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGVyZWYpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0KLQkJCS8vIHZhbGlkYXRlRUpCUmVmcyhlcmVmKTsKLQkJCS8vIHZhbGlkYXRlRUpCUmVmTWFuYWRhdG9yeUVsZW1lbnRzKGVyZWYsIHdlYkRELmdldERpc3BsYXlOYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGluayBidWlsZCBzaG91bGQgdmVyaWZ5IGxvY2F0aW9uIG9mIGV4Y2VwdGlvbiBjbGFzcwotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFcnJvclBhZ2VzKEVMaXN0IGVycm9yUGFnZUxpc3QpIHsKLQkJSXRlcmF0b3IgZXJyb3JQYWdlcyA9IGVycm9yUGFnZUxpc3QuaXRlcmF0b3IoKTsKLQotCQlpZiAoZXJyb3JQYWdlTGlzdCA9PSBudWxsIHx8IGVycm9yUGFnZUxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChlcnJvclBhZ2VzLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlFcnJvclBhZ2UgbmV4dFBhZ2UgPSAoRXJyb3JQYWdlKSBlcnJvclBhZ2VzLm5leHQoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IG5leHRQYWdlLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBuZXh0UGFnZSk7Ci0JCQl9Ci0JCQlpZiAoIWxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ5OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfUEFHRSwgcGFybXMsIG5leHRQYWdlKTsKLQkJCX0KLQotCi0JCQkvLyBjaGVjayBmb3IgdmFsaWQgSFRUUCBlcnJvciBjb2RlIC0gbXVzdCBiZSBhbiBJbnRlZ2VyLCAzIGRpZ2l0cywgYW5kIHRoZSBzdGFydGluZwotCQkJLy8gZGlnaXQgbXVzdCBiZSBhIDEsMiwzLDQsIG9yIDUuCi0JCQlpZiAobmV4dFBhZ2UuaXNFcnJvckNvZGUoKSkgewotCQkJCUVycm9yQ29kZUVycm9yUGFnZSBlY2VwID0gKEVycm9yQ29kZUVycm9yUGFnZSkgbmV4dFBhZ2U7Ci0JCQkJU3RyaW5nIGVycm9yQ29kZSA9IGVjZXAuZ2V0RXJyb3JDb2RlKCk7Ci0KLQkJCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQkJaWYgKGVycm9yQ29kZS5sZW5ndGgoKSA9PSAzKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnRlZ2VyIHRlbXBJbnQgPSBuZXcgSW50ZWdlcihlcnJvckNvZGUpOwotCQkJCQkJLy8gb2ssIGl0J3MgYSB2YWxpZCAzLWRpZ2l0IGludGVnZXIKLQkJCQkJCWludCBjb2RlID0gdGVtcEludC5pbnRWYWx1ZSgpOwotCQkJCQkJaWYgKGNvZGUgPj0gMTAwICYmIGNvZGUgPCA2MDApIHsKLQkJCQkJCQkvLyB2YWxpZCBIVFRQIHN0YXR1cyBjb2RlIC0gc3RhcnRpbmcgZGlnaXQgbXVzdCBiZSBiZXR3ZWVuIDEtNQotCQkJCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJLy8gSWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2YWxpZCkgewotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gZXJyb3JDb2RlOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREUsIHBhcm1zLCBlY2VwKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJLy8gSWYgZXhjZXB0aW9uLXR5cGUuLi4gdGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGJlIG9yIGluaGVyaXQgZnJvbSBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JCQllbHNlIGlmIChuZXh0UGFnZS5pc0V4Y2VwdGlvblR5cGUoKSkgewotCQkJCUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgZXRlcCA9IChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKSBuZXh0UGFnZTsKLQkJCQlKYXZhQ2xhc3MgamF2YVR5cGUgPSBldGVwLmdldEV4Y2VwdGlvblR5cGUoKTsKLQkJCQlTdHJpbmcgZXhjZXB0aW9uVHlwZSA9ICJqYXZhLmxhbmcuVGhyb3dhYmxlIjsvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHNwZWNpZmllZENsYXNzTmFtZSA9IGV0ZXAuZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKTsKLQkJCQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZVNldCBsb29rdXBTZXQgPSBqYXZhVHlwZS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQlpZiAobG9va3VwU2V0ICE9IG51bGwpIHsKLQkJCQkJCWlmICghamF2YVR5cGUuaW5oZXJpdHNGcm9tKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShleGNlcHRpb25UeXBlLCBsb29rdXBTZXQpLmdldFdyYXBwZXIoKSkpIHsKLQkJCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCQkJcGFybXNbMF0gPSBzcGVjaWZpZWRDbGFzc05hbWU7Ci0JCQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRSwgcGFybXMsIGV0ZXApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRSwgcGFybXMsIGV0ZXApOwotCQkJCX0KLQkJCQkvLyBUQkQKLQkJCX0gZWxzZSB7IC8vIEVycm9yIENvZGUKLQkJCQkvLyBUQkQKLQkJCX0KLQotCQkJLy8gVEJEIHJlbWVtYmVyIGxvY2F0aW9uL2NvZGUvZXhjZXB0aW9uIGR1cHMKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGxvZ2luQ29uZmlnIHNlY3Rpb24gaXMgY29ycmVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTG9naW5Db25maWcoTG9naW5Db25maWcgbG9naW5Db25maWcpIHsKLQkJLy8gY29tLmlibS5ldG9vbHMudmFsaWRhdGUuVmFsaWRhdG9yTWFuYWdlci5zZXRSZXNvdXJjZVV0aWxDbGFzcyhjb20uaWJtLmV0b29scy52YWxpZGF0ZS51aS5VSVJlc291cmNlVXRpbC5jbGFzcyk7Ci0KLQkJaWYgKGxvZ2luQ29uZmlnICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdXRoID0gbG9naW5Db25maWcuZ2V0QXV0aE1ldGhvZCgpLmdldE5hbWUoKTsKLQotCQkJaWYgKGF1dGggPT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1swXTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9ELCBwYXJtcywgbG9naW5Db25maWcpOwotCQkJfQotCQkJLy8gR2l2ZSBhIHdhcm5pbmcgaWYgZm9ybSBlbGVtZW50cyBhcmUgc3VwcGxpZWQgYnV0IEZPUk0gYXV0aCBtZXRob2QgaXMgbm90IHVzZWQKLQkJCWVsc2UgaWYgKCFhdXRoLmVxdWFscygiRk9STSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlGb3JtTG9naW5Db25maWcgY2ZnID0gbG9naW5Db25maWcuZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0JCQkJaWYgKGNmZyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBhdXRoOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiwgcGFybXMsIGxvZ2luQ29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgbG9naW5Db25maWcgc2VjdGlvbiBpcyBjb3JyZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXMoRUxpc3QgZW52RW50cmllcykgewotCQlpZiAoZW52RW50cmllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYm9vbGVhbiBpc1ZlcnNpb24yMiA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5pc1ZlcnNpb24yXzJEZXNjcmlwdG9yKCk7Ci0JCUl0ZXJhdG9yIGVudHJpZXMgPSBlbnZFbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCUVudkVudHJ5IGVudHJ5ID0gKEVudkVudHJ5KSBlbnRyaWVzLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRUeXBlKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWSwgbnVsbCwgZW50cnkpOwotCQkJfQotCi0JCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIGVudi1lbnRyeS1uYW1lJ3MKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCWlmIChyZW1lbWJlci5nZXQobmFtZSkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX0Vudl9FbnRyeV9OYW1lX19fODggKyAiOiAiICsgbmFtZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgZW50cnkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy81LzIwMDEgMTI6MTE6MjMgUE0pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNaW1lTWFwcGluZygpIHsKLQotCQlpZiAod2ViREQuZ2V0TWltZU1hcHBpbmdzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIG1pbWVzID0gd2ViREQuZ2V0TWltZU1hcHBpbmdzKCkuaXRlcmF0b3IoKTsKLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXdoaWxlIChtaW1lcy5oYXNOZXh0KCkpIHsKLQkJCQotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwkJCQkKLQkJCX0KLQkJCU1pbWVNYXBwaW5nIG1pbWVNYXAgPSAoTWltZU1hcHBpbmcpIG1pbWVzLm5leHQoKTsKLQotCQkJU3RyaW5nIGV4dCA9IG1pbWVNYXAuZ2V0RXh0ZW5zaW9uKCk7Ci0JCQlTdHJpbmcgbXR5cGUgPSBtaW1lTWFwLmdldE1pbWVUeXBlKCk7Ci0JCQlpZiAoZXh0ICE9IG51bGwpCi0JCQkJZXh0ID0gZXh0LnRyaW0oKTsKLQkJCWlmIChtdHlwZSAhPSBudWxsKQotCQkJCW10eXBlID0gbXR5cGUudHJpbSgpOwotCi0JCQlpZiAoZXh0ID09IG51bGwgfHwgZXh0LmVxdWFscygiIikgfHwgbXR5cGUgPT0gbnVsbCB8fCBtdHlwZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlpZiAoZXh0ID09IG51bGwgfHwgZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX01pbWVfRXh0ZW5zaW9uXzU0OwotCQkJCWVsc2UKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfTWltZV9UeXBlXzU1OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgbWltZU1hcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVtZW1iZXIuZ2V0KGV4dCkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX01pbWVfRXh0ZW5zaW9uX19fNTYgKyAiOiAiICsgZXh0OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIG1pbWVNYXApOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVtZW1iZXIucHV0KGV4dCwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzUvMjAwMSAxMTo0Njo1OCBBTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU90aGVyKCkgewotCi0JCVNlc3Npb25Db25maWcgc2Vzc2lvbkNmZyA9IHdlYkRELmdldFNlc3Npb25Db25maWcoKTsKLQkJaWYgKHNlc3Npb25DZmcgIT0gbnVsbCkgewotCQkJaW50IHRpbWVvdXQgPSBzZXNzaW9uQ2ZnLmdldFNlc3Npb25UaW1lb3V0KCk7Ci0JCQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VULCBudWxsLCBzZXNzaW9uQ2ZnKTsKLQkJCX0KLQkJfQotCi0KLQotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlUmVmcyhXZWJBcHApIC0gdmFsaWRhdGUgRUpCIGFuZCByZXNvdXJjZSByZWZlcmVuY2VzIC0gZGV0YWlscyB0YmQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUmVmcygpIHsKLQkJRUxpc3QgZWpiUmVmcyA9IHdlYkRELmdldEVqYlJlZnMoKTsKLQotCQlpZiAoIWVqYlJlZnMuaXNFbXB0eSgpKQotCQkJdmFsaWRhdGVFSkJSZWZzKGVqYlJlZnMpOwotCi0KLQkJRUxpc3QgZWpibG9jYWxSZWZzID0gd2ViREQuZ2V0RWpiTG9jYWxSZWZzKCk7Ci0KLQkJaWYgKCFlamJsb2NhbFJlZnMuaXNFbXB0eSgpKQotCQkJdmFsaWRhdGVFSkJMb2NhbFJlZnMoZWpibG9jYWxSZWZzKTsKLQotCi0JCUVMaXN0IHJlc291cmNlUmVmcyA9IHdlYkRELmdldFJlc291cmNlUmVmcygpOwotCi0JCWlmICghcmVzb3VyY2VSZWZzLmlzRW1wdHkoKSkgewotCQkJLy8gdmFsaWRhdGVSZXNvdXJjZVJlZnMocmVzb3VyY2VSZWZzKTsgLy8gd2Ugd2FudCB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBoZXJlCi0KLQkJCWludCBudW1SZWZzID0gcmVzb3VyY2VSZWZzLnNpemUoKTsKLQkJCVNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQkJCWJvb2xlYW4gaXNWZXJzaW9uMjIgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQotCQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCQkKLQkJCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQkJfQotCQkJCQotCQkJCVJlc291cmNlUmVmSW1wbCByZWYgPSAoUmVzb3VyY2VSZWZJbXBsKSAocmVzb3VyY2VSZWZzLmdldChyZWZObykpOwotCQkJCVN0cmluZyBhdXRoID0gcmVmLmdldEF1dGgoKS5nZXROYW1lKCk7Ci0KLQkJCQkvLyBDaGVjazogYSByZXMtYXV0aCBlbGVtZW50IGNvbnRhaW5pbmcgQ29udGFpbmVyIG9yIEFwcGxpY2F0aW9uIG11c3QgYmUgc3VwcGxpZWQKLQkJCQlpZiAoYXV0aCA9PSBudWxsIHx8ICFyZWYuaXNTZXRBdXRoKCkpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBtc2dJZCA9IGlzVmVyc2lvbjIyID8gTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiA6IE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjM7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgbXNnSWQsIHBhcm1zLCByZWYpOwotCQkJCQkKLQkJCQl9IGVsc2UgaWYgKGlzVmVyc2lvbjIyICYmIGF1dGguZXF1YWxzKCJBcHBsaWNhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyLCBwYXJtcywgcmVmKTsKLQkJCQl9IGVsc2UgaWYgKCFpc1ZlcnNpb24yMiAmJiBhdXRoLmVxdWFscygiU0VSVkxFVCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIzLCBwYXJtcywgcmVmKTsKLQkJCQl9Ci0KLQkJCQkvLyB2YWxpZGF0ZSByZXMtc2hhcmluZy1zY29wZSBpcyBhbGxvd2FibGUgdmFsdWUKLQkJCQlTdHJpbmcgc2hhcmluZ1Njb3BlID0gcmVmLmdldFJlc1NoYXJpbmdTY29wZSgpLmdldE5hbWUoKTsKLQkJCQlpZiAoIWlzVmVyc2lvbjIyKSB7Ci0JCQkJCWlmIChzaGFyaW5nU2NvcGUgPT0gbnVsbCB8fCAhcmVmLmlzU2V0UmVzU2hhcmluZ1Njb3BlKCkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1swXTsKLQkJCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEUsIHBhcm1zLCByZWYpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQkJaWYgKCEocmVmU2V0LmFkZChyZWZOYW1lKSkpewotCQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX1JFU1JFRiwgcGFybXMsIHJlZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvNi8yMDAxIDQ6MTE6MDkgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVmaW5lUm9sZXMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5IYXNodGFibGUKLQkgKiAKLQkgKiBUaGUgYXV0aC1jb25zdHJhaW50IG9ubHkgbmVlZHMgdG8gaGF2ZSByb2xlLW5hbWUgc3BlY2lmaWVkLiA8YXV0aC1jb25zdHJhaW50PiA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQkgKiA8cm9sZS1uYW1lPmd1ZXN0PC9yb2xlLW5hbWU+IDwvYXV0aC1jb25zdHJhaW50PgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXV0aFNlY1JvbGUoU3RyaW5nIGxpbmssIFN0cmluZyByb2xlLCBIYXNodGFibGUgZGVmaW5lZFJvbGVzLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlTdHJpbmcgck5hbWUgPSByb2xlOwotCQlTdHJpbmcgbE5hbWUgPSBsaW5rOwotCQkvLyBib29sZWFuIHZhbGlkUm9sZSA9IHRydWU7Ci0JCS8vIGJvb2xlYW4gdmFsaWRMaW5rID0gdHJ1ZTsKLQotCQlpZiAock5hbWUgIT0gbnVsbCkKLQkJCXJOYW1lID0gck5hbWUudHJpbSgpOwotCQlpZiAobE5hbWUgIT0gbnVsbCkKLQkJCWxOYW1lID0gbE5hbWUudHJpbSgpOwotCi0JCWlmIChyTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXJOYW1lLmVxdWFscygiKiIpICYmICFyTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQlpZiAoZGVmaW5lZFJvbGVzLmdldChyTmFtZSkgPT0gbnVsbCAmJiBkZWZpbmVkUm9sZXMuZ2V0KGxOYW1lKSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSByTmFtZTsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRSwgcGFybXMsIHRhcmdldE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvNi8yMDAxIDQ6MTE6MDkgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVmaW5lUm9sZXMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5IYXNodGFibGUKLQkgKiAKLQkgKiAKLQkgKiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgbXVzdCBoYXZlIGEgbm9uLW51bGwgcm9sZS1uYW1lIGFuZCB0aGUgcm9sZS1saW5rIG11c3QgY29udGFpbiB0aGUgbmFtZQotCSAqIG9mIGEgcm9sZSBzcGVjaWZpZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgc2VjdGlvbiA8c2VjdXJpdHktcm9sZS1yZWY+IDxyb2xlLW5hbWU+TXlOYW1lPC9yb2xlLW5hbWU+Ci0JICogPHJvbGUtbGluaz5FeGlzdGluZ1JvbGU8L3JvbGUtbGluaz4gPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNlY1JvbGUoU3RyaW5nIGxpbmssIFN0cmluZyByb2xlLCBIYXNodGFibGUgZGVmaW5lZFJvbGVzLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlTdHJpbmcgck5hbWUgPSByb2xlOwotCQlTdHJpbmcgbE5hbWUgPSBsaW5rOwotCQkvLyBib29sZWFuIHZhbGlkUm9sZSA9IHRydWU7Ci0JCS8vIGJvb2xlYW4gdmFsaWRMaW5rID0gdHJ1ZTsKLQotCQlpZiAock5hbWUgIT0gbnVsbCkKLQkJCXJOYW1lID0gck5hbWUudHJpbSgpOwotCQlpZiAobE5hbWUgIT0gbnVsbCkKLQkJCWxOYW1lID0gbE5hbWUudHJpbSgpOwotCi0KLQkJLy8gdGhlIHNlY3VyaXR5IHJvbGUtbmFtZSBjYW5ub3QgYmUgbnVsbAotCQlpZiAoKHJOYW1lID09IG51bGwgfHwgck5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByTmFtZTsKLQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwotCQl9Ci0KLQkJaWYgKHJOYW1lID09IG51bGwgfHwgIXJOYW1lLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQJCQotCQkJLy8gY2hlY2sgdGhhdCBzZWN1cml0eSByb2xlLWxpbmsgbWF0Y2hlcyBhIGRlZmluZXMgc2VjdXJpdHkgcm9sZQotCQkJaWYgKGxOYW1lICE9IG51bGwgJiYgZGVmaW5lZFJvbGVzLmdldChsTmFtZSkgPT0gbnVsbCkgewotCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gbE5hbWU7Ci0JCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEUsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGVTZWN1cml0eShXZWJBcHApIC0gdmFsaWRhdGUgc2VjdXJpdHkgY29uc3RyYWludHMsIHJvbGVzLCBhbmQgc2VjdXJpdHkgcm9sZSByZWZzIC0KLQkgKiBkZXRhaWxzIHRiZAotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eUFuZFNlcnZsZXRzKCkgewotCi0KLQkJRUxpc3Qgd2ViUm9sZXMgPSB3ZWJERC5nZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkJLy8gVmFsaWRhdGUgc2VjdXJpdHkgcm9sZXMKLQkJSGFzaHRhYmxlIHNlY1JvbGVzID0gZ2V0QW5kVmFsaWRhdGVTZWN1cml0eVJvbGVzKHdlYlJvbGVzKTsKLQotCQkvLyBWYWxpZGF0ZSBTZXJ2bGV0cy9KU1BzIGFuZCB0aGVpciByb2xlIHJlZi4KLQkJdmFsaWRhdGVTZXJ2bGV0cyh3ZWJERC5nZXRTZXJ2bGV0cygpLCBzZWNSb2xlcyk7Ci0KLQkJdmFsaWRhdGVTZWN1cml0eUNvbnN0cmFpbnRzKHdlYkRELmdldENvbnN0cmFpbnRzKCksIHNlY1JvbGVzKTsKLQotCQkvLyB0cnkgewotCQlpZiAoISh3ZWJSb2xlcy5pc0VtcHR5KCkpKSB7Ci0JCQlFQVJGaWxlIG1vZHVsZSA9IHdhckZpbGUuZ2V0RUFSRmlsZSgpOwotCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJRUxpc3QgZWFyUm9sZUxpc3QgPSBtb2R1bGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQkJdmFsaWRhdGVXRUJSb2xlc1dpdGhFQVJSb2xlcyhlYXJSb2xlTGlzdCwgd2ViUm9sZXMpOwotCQkJfQotCQl9Ci0JCS8vIH0gY2F0Y2ggKFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbiB1ZSkgewotCQkvLyBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCS8vIHBhcm1zWzBdID0gd2FyRmlsZS5nZXROYW1lKCk7Ci0JCS8vIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04sIHBhcm1zKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIFRoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkgY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZQotCSAqIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucyA8IUVMRU1FTlQgc2VjdXJpdHktY29uc3RyYWludCAod2ViLXJlc291cmNlLWNvbGxlY3Rpb24rLAotCSAqIGF1dGgtY29uc3RyYWludD8sIHVzZXItZGF0YS1jb25zdHJhaW50Pyk+Ci0JICogCi0JICogQHBhcmFtIGNvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMoRUxpc3QgY29uc3RyYWludHMsIEhhc2h0YWJsZSBzZWNSb2xlcykgewotCi0JCWlmIChjb25zdHJhaW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3IgY29uc3RMaXN0ID0gY29uc3RyYWludHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbnN0TGlzdC5oYXNOZXh0KCkpIHsKLQkJCQotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCX0KLQkJCQotCQkJU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoU2VjdXJpdHlDb25zdHJhaW50KSBjb25zdExpc3QubmV4dCgpOwotCi0JCQlFTGlzdCB3ZWJSZXNvdXJjZUxpc3QgPSBjb25zdHJhaW50LmdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQkJCWlmICh3ZWJSZXNvdXJjZUxpc3QgPT0gbnVsbCB8fCB3ZWJSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0OwotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGNvbnN0cmFpbnQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdmFsaWRhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKHdlYlJlc291cmNlTGlzdCk7Ci0KLQkJCUF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gY29uc3RyYWludC5nZXRBdXRoQ29uc3RyYWludCgpOwotCQkJaWYgKGF1dGhDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJdmFsaWRhdGVBdXRoQ29uc3RyYWludChhdXRoQ29uc3RyYWludCwgc2VjUm9sZXMpOwotCi0JCQlVc2VyRGF0YUNvbnN0cmFpbnQgZGF0YUNvbnN0cmFpbnQgPSBjb25zdHJhaW50LmdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCQkJaWYgKGRhdGFDb25zdHJhaW50ICE9IG51bGwgJiYgZGF0YUNvbnN0cmFpbnQuZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgIT0gbnVsbCkgewotCQkJCS8vIDwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4KLQkJCQkvLyBUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0JCQkJLy8gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0JCQkJLy8gQ09ORklERU5USUFMLgotCi0JCQkJLy8gRUVudW1MaXRlcmFsIHRyYW5zcG9ydCA9IGRhdGFDb25zdHJhaW50LmdldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdHJhbnNwb3J0ID0gZGF0YUNvbnN0cmFpbnQuZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQkJaWYgKHRyYW5zcG9ydCA9PSBudWxsIHx8ICFkYXRhQ29uc3RyYWludC5pc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpKSB7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVCwgbmV3IFN0cmluZ1swXSwgZGF0YUNvbnN0cmFpbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmlsdGVycyhFTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCWlmIChmaWx0ZXJMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBmaWx0ZXJzID0gZmlsdGVyTGlzdC5pdGVyYXRvcigpOwotCi0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQl3aGlsZSAoZmlsdGVycy5oYXNOZXh0KCkpIHsKLQkJCQotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCX0KLQkJCQotCQkJRmlsdGVyIG5leHRGaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJzLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gbmV4dEZpbHRlci5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9GaWx0ZXJfTmFtZV82NjsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIG5leHRGaWx0ZXIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gbmFtZTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSLCBwYXJtcywgbmV4dEZpbHRlcik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1lbWJlci5wdXQobmFtZSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKEVsaXN0KEZpbHRlcnMncykpIC0gZm9yIGVhY2ggZmlsdGVyIG1hcHBpbmcsIG1ha2Ugc3VyZSB0aGUgbmFtZWQKLQkgKiBmaWx0ZXIgZXhpc3RzCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaWx0ZXJNYXBwaW5ncyhFTGlzdCBmaWx0ZXJNYXBwaW5nc0xpc3QpIHsKLQotCQlpZiAoZmlsdGVyTWFwcGluZ3NMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBmaWx0ZXJNYXBwaW5ncyA9IGZpbHRlck1hcHBpbmdzTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoZmlsdGVyTWFwcGluZ3MuaGFzTmV4dCgpKSB7Ci0JCQlGaWx0ZXJNYXBwaW5nIG5leHRNYXBwaW5nID0gKEZpbHRlck1hcHBpbmcpIGZpbHRlck1hcHBpbmdzLm5leHQoKTsKLQotCQkJLy8gTWFwcGluZyBjYW4gYmUgZWl0aGVyIHNlcnZsZXQgb3IgdXJsCi0JCQlpZiAobmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJU3RyaW5nIHVybCA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkJCQlwYXJtc1swXSA9IHVybDsKLQkJCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkwsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobmV4dE1hcHBpbmcuZ2V0RmlsdGVyKCkgPT0gbnVsbCB8fCBuZXh0TWFwcGluZy5nZXRGaWx0ZXIoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBJcyBpcyBhIHZhbGlkIFVSSSBub3RhdGlvbiA/Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHVybC5lcXVhbHMoIiIpKQotCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLkludmFsaWRfVVJMXzcwKTsKLQkJCQkJLy8gWW91IGNhbid0IHVzZSBjb20uaWJtLndlYnRvb2xzLlVSSSBoZXJlLi4uCi0JCQkJCS8vIGNvbS5pYm0uaXd0LndlYnRvb2xzLlVSSSB1cmkgPSBuZXcgY29tLmlibS5pd3Qud2VidG9vbHMuVVJJKHVybCkgOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBuZXh0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCk7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChuZXh0TWFwcGluZy5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJU3RyaW5nIHNlcnZsZXROYW1lID0gbmV4dE1hcHBpbmcuZ2V0U2VydmxldE5hbWUoKTsKLQkJCQlwYXJtc1swXSA9IHNlcnZsZXROYW1lOwotCQkJCWlmIChuZXh0TWFwcGluZy5nZXRTZXJ2bGV0KCkgPT0gbnVsbCkgewotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fU0VSVkxFVF9NQVBQSU5HLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRNYXBwaW5nLmdldEZpbHRlcigpID09IG51bGwgfHwgbmV4dE1hcHBpbmcuZ2V0RmlsdGVyKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORywgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyAvLyBvdGhlcndpc2UgbmVpdGhlciBzZXJ2bGV0LW5hbWUgb3IgdXJsLW1hcHBpbmcgaXMgZGVmaW5lZCAtIHRoaXMgZ2V0cyBmbGFnZ2VkIGJ5Ci0JCQkvLyB0aGUgeG1sIHZhbGlkYXRvcgotCQkJLy8gLy8gYXMgdGhpcyBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBEVEQKLQkJCS8vCQkKLQkJCS8vIH0KLQotCi0JCX0KLQotCX0KLQotCi0KLQkvKioKLQkgKiB2YWxpZGF0ZVNlcnZsZXRzKEVsaXN0KFNlcnZsZXQncykpIC0gZm9yIGVhY2ggc2VydmxldCBtYXBwaW5nLCBtYWtlIHN1cmUgdGhlIG5hbWVkIHNlcnZsZXQKLQkgKiBleGlzdHMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2VydmxldE1hcHBpbmdzKEVMaXN0IHNlcnZsZXRNYXBwaW5nc0xpc3QpIHsKLQotCQlpZiAoc2VydmxldE1hcHBpbmdzTGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3Igc2VydmxldE1hcHBpbmdzID0gc2VydmxldE1hcHBpbmdzTGlzdC5pdGVyYXRvcigpOwotCi0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQkJd2hpbGUgKHNlcnZsZXRNYXBwaW5ncy5oYXNOZXh0KCkpIHsKLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCVNlcnZsZXRNYXBwaW5nIG5leHRNYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKSBzZXJ2bGV0TWFwcGluZ3MubmV4dCgpOwotCQkJU3RyaW5nIHVybCA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQotCQkJLy8gQ2hlY2sgZm9yIG51bGwgc2VydmxldCwgaWYgdGhlIG5hbWUgaXMgcmlnaHQgdGhlIHJlZmxlY3Rpb24KLQkJCS8vIGhhcyBhbHJlYWR5IHJlc29sdmVkIGl0LgotCi0JCQlpZiAodXJsICE9IG51bGwpIHsgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBmaXJzdCwgbm8gbmVlZCB0byByZXBlYXQgZWFybGllciBlcnJvciwKLQkJCQl1cmwgPSB1cmwudHJpbSgpOwotCQkJCWlmIChyZW1lbWJlci5nZXQodXJsKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBuZXh0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCk7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQotCQkJaWYgKHVybCA9PSBudWxsIHx8IG5leHRNYXBwaW5nLmdldFNlcnZsZXQoKSA9PSBudWxsIHx8IG5leHRNYXBwaW5nLmdldFNlcnZsZXQoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSB1cmw7Ci0JCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQllbHNlCi0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkcsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIElzIGlzIGEgdmFsaWQgVVJJIG5vdGF0aW9uID8KLQkJCXRyeSB7Ci0JCQkJaWYgKHVybC5lcXVhbHMoIiIpKQotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuSW52YWxpZF9VUkxfNzUpOwotCi0JCQkJLy8KLQkJCQkvLyBUaGUgc3BlYyBkb2VzIG5vdCBwcm9oaWJpdCB3aGl0ZXNwYWNlIGluIHRoZSB1cmwtcGF0dGVybnMKLQkJCQkvLwkgICAKLQkJCQkvLyAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIFVSTC0gaGFzIG5vIHdoaXRlIHNwYWNlCi0JCQkJLy8gY2hhcltdIGNoYXJzID0gdXJsLnRvQ2hhckFycmF5KCk7Ci0JCQkJLy8gaW50IGxlbiA9IGNoYXJzLmxlbmd0aDsKLQkJCQkvLyBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBjaGFycy5sZW5ndGg7IGNudCsrKQotCQkJCS8vIHsKLQkJCQkvLyBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFyc1tjbnRdKSkKLQkJCQkvLyB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIFVSTCIpIDsKLQkJCQkvLyB9Ci0JCQkJLy8gWW91IGNhbid0IHVzZSBjb20uaWJtLndlYnRvb2xzLlVSSSBoZXJlLi4uCi0JCQkJLy8gY29tLmlibS5pd3Qud2VidG9vbHMuVVJJIHVyaSA9IG5ldyBjb20uaWJtLml3dC53ZWJ0b29scy5VUkkodXJsKSA7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkwsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlU2VydmxldHMoRWxpc3QoU2VydmxldCdzKSkgLSBpZiBpdCdzIGEgSlNQLCB2ZXJpZnkgdGhlIGZpbGUgZXhpc3RzIC0gdmFsaWRhdGUKLQkgKiBvcHRpb25hbCBzZWN1cml0eSByb2xlIHJlZnMgZm9yIGV4aXN0ZW5jZSBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZXJ2bGV0cyhFTGlzdCBzZXJ2bGV0TGlzdCwgSGFzaHRhYmxlIHNlY1JvbGVzKSB7Ci0JCWlmIChzZXJ2bGV0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3Igc2VydmxldHMgPSBzZXJ2bGV0TGlzdC5pdGVyYXRvcigpOwotCi0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQl3aGlsZSAoc2VydmxldHMuaGFzTmV4dCgpKSB7Ci0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlTZXJ2bGV0IG5leHRTZXJ2bGV0ID0gKFNlcnZsZXQpIHNlcnZsZXRzLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gbmV4dFNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1NlcnZsZXRfTmFtZV83NzsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIG5leHRTZXJ2bGV0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChyZW1lbWJlci5nZXQobmFtZSkgIT0gbnVsbCkgeyAvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IG5hbWU7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQsIHBhcm1zLCBuZXh0U2VydmxldCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1lbWJlci5wdXQobmFtZSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIFZhbGlkYXRlIHNlcnZsZXQgcm9sZXMKLQkJCUVMaXN0IHJvbGVzTGlzdCA9IG5leHRTZXJ2bGV0LmdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWlmICghcm9sZXNMaXN0LmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIHJvbGVzID0gcm9sZXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHJvbGVzLmhhc05leHQoKSkgewotCQkJCQlTZWN1cml0eVJvbGVSZWYgcm9sZSA9IChTZWN1cml0eVJvbGVSZWYpIHJvbGVzLm5leHQoKTsKLQkJCQkJdmFsaWRhdGVTZWNSb2xlKHJvbGUuZ2V0TGluaygpLCByb2xlLmdldE5hbWUoKSwgc2VjUm9sZXMsIHJvbGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgaXQncyBhIEpTUCwgdGhlIGpzcC1maWxlIGF0dHJpYnV0ZSBNVVNUIGJlIGEgZnVsbC1wYXRoLCBhY2NvcmRpbmcgdG8gdGhlIHNlcnZsZXQKLQkJCS8vIDIuMiBzcGVjCi0JCQlpZiAobmV4dFNlcnZsZXQuZ2V0V2ViVHlwZSgpICE9IG51bGwgJiYgbmV4dFNlcnZsZXQuZ2V0V2ViVHlwZSgpLmlzSnNwVHlwZSgpKSB7Ci0JCQkJSlNQVHlwZSBqc3BUeXBlID0gKEpTUFR5cGUpIChuZXh0U2VydmxldC5nZXRXZWJUeXBlKCkpOwotCi0JCQkJU3RyaW5nIGpzcEZpbGVOYW1lID0ganNwVHlwZS5nZXRKc3BGaWxlKCk7Ci0JCQkJaWYgKGpzcEZpbGVOYW1lID09IG51bGwgfHwgIShqc3BGaWxlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQkJcGFybXNbMF0gPSBqc3BGaWxlTmFtZTsKLQkJCQkJcGFybXNbMV0gPSBuYW1lOwotCQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiwgcGFybXMsIG5leHRTZXJ2bGV0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIE5vIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgSlNQcyBvciBTZXJ2bGV0cy4gdGhlIExpbmtCdWlsZGVyIHdpbGwgZG8gdGhpcyAqLwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRhZ0xpYnMoKSB7Ci0KLQkJaWYgKHdlYkRELmdldFRhZ0xpYnMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3IgdGFncyA9IHdlYkRELmdldFRhZ0xpYnMoKS5pdGVyYXRvcigpOwotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJd2hpbGUgKHRhZ3MuaGFzTmV4dCgpKSB7Ci0KLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCVRhZ0xpYlJlZiB0YWdsaWIgPSAoVGFnTGliUmVmKSB0YWdzLm5leHQoKTsgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uIGF0IHJ1bnRpbWUKLQkJCVN0cmluZyB1cmkgPSB0YWdsaWIuZ2V0VGFnbGliVVJJKCk7Ci0KLQkJCWlmICh1cmkgIT0gbnVsbCkKLQkJCQl1cmkgPSB1cmkudHJpbSgpOwotCi0JCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9UYWdsaWJfODA7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCB0YWdsaWIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHJlbWVtYmVyLmdldCh1cmkpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9UYWdMaWJfX184MSArICI6ICIgKyB1cmk7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgdGFnbGliKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbWVtYmVyLnB1dCh1cmksICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKEVMaXN0IHdlYlJlc291cmNlTGlzdCkgewotCi0KLQkJSXRlcmF0b3IgcmVzb3VyY2VMaXN0ID0gd2ViUmVzb3VyY2VMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZXNvdXJjZUxpc3QuaGFzTmV4dCgpKSB7IC8vIENoZWNrIHRoZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKLQkJCVdlYlJlc291cmNlQ29sbGVjdGlvbiByZXNvdXJjZSA9IChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIHJlc291cmNlTGlzdC5uZXh0KCk7Ci0KLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vIHNob3VsZCBoYXZlIGEgbmFtZSAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgcmVzb3VyY2UpOwotCQkJfQotCi0JCQkvLyBDaGVjayB0aGF0IHRoZSBodHRwIG1ldGhvZHMsIGlmIGFueSBpcyBjb3JyZWN0Ci0JCQlFTGlzdCBodHRwTGlzdCA9IHJlc291cmNlLmdldEhUVFBzKCk7Ci0JCQlpZiAoIWh0dHBMaXN0LmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGh0dHBzID0gaHR0cExpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaHR0cHMuaGFzTmV4dCgpKSB7Ci0JCQkJCUhUVFBNZXRob2RUeXBlIGh0dHBNZXRob2QgPSAoSFRUUE1ldGhvZFR5cGUpIGh0dHBzLm5leHQoKTsKLQkJCQkJU3RyaW5nIG1ldGhvZCA9IGh0dHBNZXRob2QuZ2V0SHR0cE1ldGhvZCgpOwotCi0JCQkJCWlmIChtZXRob2QgPT0gbnVsbCB8fCAhaXNIdHRwTWV0aG9kKG1ldGhvZCkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJCXBhcm1zWzBdID0gbWV0aG9kOwotCQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQsIHBhcm1zLCBodHRwTWV0aG9kKTsKLQkJCQkJfQotCi0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QpIC0gd2FsayB0aHJvdWdoIHRoZSBmaWxlcyBhbmQgdmVyaWZ5IHRoZXkgZXhpc3QKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBmaWxlTGlzdCkgewotCQlpZiAoZmlsZUxpc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBmaWxlcyA9IGZpbGVMaXN0LmdldEZpbGUoKS5pdGVyYXRvcigpOwotCi0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQkJd2hpbGUgKGZpbGVzLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlXZWxjb21lRmlsZSBuZXh0RmlsZSA9IChXZWxjb21lRmlsZSkgZmlsZXMubmV4dCgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gbmV4dEZpbGUuZ2V0V2VsY29tZUZpbGUoKTsKLQotCQkJaWYgKChmaWxlTmFtZSA9PSBudWxsKSB8fCAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMF07Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFLCBwYXJtcywgbmV4dEZpbGUpOwotCQkJfSBlbHNlIGlmICgoZmlsZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB8fCAoZmlsZU5hbWUuZW5kc1dpdGgoIi8iKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFLCBwYXJtcywgbmV4dEZpbGUpOwotCQkJfQotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS50cmltKCk7Ci0JCQlpZiAocmVtZW1iZXIuZ2V0KGZpbGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1dlbGNvbWVfRmlsZV9OYW1lX184NyArICI6ICIgKyBmaWxlTmFtZTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCBuZXh0RmlsZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1lbWJlci5wdXQoZmlsZU5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCV9oZWxwZXIgPSBoZWxwZXI7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQl3YXJGaWxlID0gbnVsbDsKLQkJd2ViREQgPSBudWxsOwotCQlodHRwTWV0aG9kcyA9IG51bGw7Ci0JCXN1cGVyLmNsZWFudXAoIHJlcG9ydGVyICk7Ci0JfQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjhjY2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwNTRFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgcmFyLnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi1FUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFPSJJbnZhbGlkIFJBUiBGaWxlIi4KLUVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRD0iUkFSIFZhbGlkYXRpb24gZmFpbGVkIi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTVhYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZCBhbGwgdGhlIGV4dGVybmFsaXNlZCBzdHJpbmdzIGZvciBlVG9vbHMgV0FSIFZhbGlkYXRpb24gcHJvamVjdAotIyBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgotIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLQotIyAyLUp1bHktMjAwMToKLSMgIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIFByb2Nlc3NNc2dGaWxlIHRvb2wsIHdyaXR0ZW4gYnkKLSMgIEhhbnkgU2FsZW0gYW5kIG93bmVkIGJ5IERlbm5pcyBIZWJlcnQuICBBbnkgZnV0dXJlIGNoYW5nZXMgc2hvdWxkCi0jICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcwotIyAgKGhlYmVydEB1cy5pYm0uY29tIG9yIFQvTCA1NDMtMjUyMCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRD1DSEtKMzAwMEU6IFdBUiBWYWxpZGF0aW9uIEZhaWxlZDogezB9Ci0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM9Q0hLSjEwMDJFOiBEdXBsaWNhdGUgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MH0uCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQPUNIS0ozMDAxRTogVGhlIEpTUCBmaWxlLCB7MH0sIGZvciB0aGUgc2VydmxldCBcInsxfVwiIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTj1DSEtKMzAwMkU6IFRoZSA8c21hbGwtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT049Q0hLSjMwMDNFOiBUaGUgPGxhcmdlLWljb24+IGZpbGUsIHswfSwgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fU0VSVkxFVF9NQVBQSU5HPUNIS0ozMDA0VzogVGhlIHNlcnZsZXQgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIHNlcnZsZXQgdGhhdCBpcyBub3QgZGVmaW5lZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEU9Q0hLSjMwMDVFOiBFbXB0eSB3ZWxjb21lIGZpbGUgbGlzdCBlbnRyeS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dFTENPTUVfRklMRT1DSEtKMzAwNkU6IFdlbGNvbWUgZmlsZSB7MH0gaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRD1DSEtKMzAwN0U6IFRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIEZpbGUsIHswfSwgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfSU5WQUxJRF9XQVJfRklMRT1DSEtKMzAwOEU6IE1pc3Npbmcgb3IgaW52YWxpZCBXQVIgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkc9Q0hLSjMwMDlFOiBUaGUgZmlsdGVyIG1hcHBpbmcgXCJ7MH1cIiByZWZlcnMgdG8gYSBmaWx0ZXIgdGhhdCBpcyBub3QgZGVmaW5lZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRT1DSEtKMzAxMFc6IFdlbGNvbWUgRmlsZXMgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIGEgLy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDlFOiBQYXJzaW5nIEVycm9yOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9QQVJTRV9MSU5FPUNIS0oxMDEwRTogRGVwbG95bWVudCBEZXNjcmlwdG9yIFBhcnNpbmcgZXJyb3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMTFFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX0NBTk5PVF9PUEVOX0REPUNIS0oxMDEyRTogQ2Fubm90IG9wZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVmFsaWRhdGlvbiBjYW5ub3QgY29tcGxldGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkw9Q0hLSjMwMTNFOiBUaGUgVVJMIE1hcHBpbmcgXCJ7MH1cIiBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEU9Q0hLSjMwMTRFOiBJbnZhbGlkIFNlY3VyaXR5IHJvbGUtbGluazogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQ9Q0hLSjMwMTVFOiBJbnZhbGlkIEhUVFAgbWV0aG9kOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQ9Q0hLSjMwMTZFOiBJbnZhbGlkIFRyYW5zcG9ydCBHdXJhcmFudGVlLiAgVmFsaWQgdmFsdWVzIGFyZSBcIk5PTkVcIiwgXCJJTlRFR1JBTFwiLCBvciBcIkNPTkZJREVOVElBTFwiLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSlNQRklMRV9SRUY9Q0hLSjMwMThFOiBUaGUganNwLWZpbGUgXCJ7MH1cIiByZWZlcmVuY2VkIGJ5IHNlcnZsZXQgezF9IG11c3QgYmUgYSBmdWxsIGFic29sdXRlIHBhdGguCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0lOVkFMSURfQ09OVEVYVF9ST09UPUNIS0ozMDE3RTogV2ViIFByb2plY3Q6IHswfSBpcyBtYXBwZWQgdG8gYW4gaW52YWxpZCBDb250ZXh0IHJvb3Q6IHsxfSBpbiBFQVIgUHJvamVjdDogezJ9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfUEFHRT1JV0FFMDAwMUUgQ0hLSjMwMTlFOiBUaGUgTG9jYXRpb24gb2YgdGhlIEVycm9yIFBhZ2UgTXVzdCBCZWdpbiB3aXRoIGEgLy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUU9Q0hLSjMwMjBFOiBJbnZhbGlkIFNlY3VyaXR5IHJvbGUtbmFtZTogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0Q9Q0hLSjMwMjFFOiBJbnZhbGlkIGF1dGggbWV0aG9kLiAgVmFsaWQgdmFsdWVzIGFyZTogXCJCQVNJQ1wiLCBcIkRJR0VTVFwiLCBcIkZPUk1cIiwgb3IgXCJDTElFTlQtQ0VSVFwiLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOPUNIS0ozMDIyRTogIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpcyB7MH0uICBUaGUgZm9ybS1sb2dpbi1jb25maWcgdmFsdWVzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdXNpbmcgRk9STSBhdXRoZW50aWNhdGlvbiBtZXRob2QuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjI9Q0hLSjMwMjNFOiAgUmVzb3VyY2UgcmVmIHswfSBtdXN0IGNvbnRhaW4gcmVzLWF1dGggb2YgIlNFUlZMRVQiIG9yICJDT05UQUlORVIiLgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMz1DSEtKMzAyNEU6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiQXBwbGljYXRpb24iIG9yICJDb250YWluZXIiLgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyPUNIS0ozMDI1RTogIFwiQXBwbGljYXRpb25cIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiU0VSVkxFVFwiIGluc3RlYWQuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjM9Q0hLSjMwMjZFOiAgXCJTRVJWTEVUXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yLnJlcy1hdXRoIGluIGEgMi4yIGxldmVsIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFVzZSBcIkFwcGxpY2F0aW9uXCIgaW5zdGVhZC4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFPUNIS0ozMDI3RTogIEludmFsaWQgRXhjZXB0aW9uIFR5cGUgezB9LiAgVGhlIGV4Y2VwdGlvbiB0eXBlIG11c3QgY29udGFpbiBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkc9Q0hLSjQwMTBXOiBEdXBsaWNhdGUgVVJMIG1hcHBpbmcgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9TRVJWTEVUPUNIS0o0MDExVzogRHVwbGljYXRlIFNlcnZsZXQgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVD1DSEtKNDAxMlc6IFNlc3Npb24gVGltZW91dCBpcyBub3QgdmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZPUNIS0o0MDEzVzogRHVwbGljYXRlIEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWT1DSEtKNDAxNFc6IEVtcHR5IEVudHJ5IHswfS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSPUNIS0o0MDE1VzogRHVwbGljYXRlIEZpbHRlciBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUY9Q0hLSjQwMTZXOiBEdXBsaWNhdGUgZWpiLXJlZiBlbGVtZW50IG5hbWVkIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyBUaGlzIHdhcyBtaXNzaW5nLiAgSXQncyBkZWZpbmVkIGluIGNvbnN0YW50cy4uLgotRVJST1JfRUFSX1VOQ09OVEFJTkVEX01PRFVMRV9GSUxFX0VYQ0VQVElPTj1DSEtKNDAxN1c6IEVSUk9SIEVBUiBVTkNPTlRBSU5FRCBNT0RVTEUgRklMRSBFWENFUFRJT04KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREU9SVdBRTAwMzZFIENIS0o0MDE4VzogVW5rbm93biBFcnJvciBDb2RlOiB7MH0uICBlcnJvci1jb2RlIG11c3QgY29udGFpbiBhIHZhbGlkIEhUVFAgc3RhdHVzIGNvZGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRT1DSEtKNDAxOVc6IEludmFsaWQgcmVzLXNoYXJpbmctc2NvcGU7IHZhbGlkIHZhbHVlcyBhcmUgXCJTaGFyZWFibGVcIiBvciBcIlVuc2hhcmVhYmxlXCIuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZPUNIS0o0MDIwVzogSW52YWxpZCBFbnZpcm9ubWVudCBFbnRyeSBUeXBlLiBWYWxpZCB2YWx1ZXMgYXJlIFwiamF2YS5sYW5nLlRZUEVcIiwgd2hlcmUgVFlQRSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogQm9vbGVhbiwgQnl0ZSwgQ2hhcmFjdGVyLCBTdHJpbmcsIFNob3J0LCBJbnRlZ2VyLCBMb25nLCBGbG9hdCwgb3IgRG91YmxlLiIKLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XTFBfUFJPSkVDVD1DSEtKNDAyMVc6IE1pc3NpbmcgV2ViIExpYnJhcnkgUHJvamVjdCAoezB9KS4gIENoZWNrIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcHJvamVjdCB0byBmaXggdGhpcyBwcm9ibGVtLgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVD1DSEtKNDAyMlc6IFRoZSBXZWIgTGlicmFyeSBQcm9qZWN0IEpBUiAoezB9KSBjb25mbGljdHMgd2l0aCBhbiBhY3R1YWwgSkFSIGluIHRoZSBXRUItSU5GL2xpYiBkaXJlY3RvcnkuCi1NU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSD1DSEtKNDAyM1c6IFRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MX0pIGRvZXMgbm90IG1hdGNoIHRoYXQgb2YgdGhpcyBXZWIgUHJvamVjdCAoezB9KS4gIFJ1biB2YWxpZGF0aW9uIG9uIHRoZSBXZWIgUHJvamVjdCBpZiB5b3UgdGhpbmsgdGhhdCBpcyBub3QgdGhlIGNhc2UuCi1NRVNTQUdFX1VSTF9QQVRURVJOX0VORF9XSVRIX0NBUlJBSUdFX1JFVFVSTj1UaGUgVVJMIHBhdHRlcm4gc3RyaW5nICJ7MH0iIGVuZHMgd2l0aCBhIGludmFsaWQgY2FycmFpZ2UgcmV0dXJuIGZvciBzZXJ2bGV0IHsxfQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFPUNIS0o0MDIzVzogZWpiLXJlZi10eXBlIG11c3QgYmUgJ0VudGl0eScgb3IgJ1Nlc3Npb24nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRT1DSEtKMjgyN1c6ICcnc2VjdXJpdHktcm9sZS1yZWYnJyBlbGVtZW50IHswfSBkZWZpbmVzIHRoZSAnJ3JvbGUtbGluaycnIGVsZW1lbnQgYnV0IG5vICcnc2VjdXJpdHktcm9sZScnIGVsZW1lbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXNjcmlwdG9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1vZl9UeXBlX1NlY3VyaXR5X1JvbGVfTmFtZV82PW9mIFR5cGUgU2VjdXJpdHkgUm9sZSBOYW1lCi1XZWJfQXJjaGl2ZV9WYWxpZGF0b3JfOD1XZWIgQXJjaGl2ZSBWYWxpZGF0b3IKLW9mX1R5cGVfUm9sZV9OYW1lXzE5PW9mIFR5cGUgUm9sZSBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1PW9mIFR5cGUgUGFyYW1ldGVyIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX1ZhbHVlXzI2PW9mIFR5cGUgUGFyYW1ldGVyIFZhbHVlCi1vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzMyPW9mIFR5cGUgUGFyYW1ldGVyIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX1ZhbHVlXzMzPW9mIFR5cGUgUGFyYW1ldGVyIFZhbHVlCi1vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzM5PW9mIFR5cGUgUGFyYW1ldGVyIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX1ZhbHVlXzQwPW9mIFR5cGUgUGFyYW1ldGVyIFZhbHVlCi1vZl9UeXBlX2VqYl9yZWZfbmFtZV80ND1vZiBUeXBlIGVqYi1yZWYtbmFtZQotb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80Nz1vZiBUeXBlIEVycm9yIExvY2F0aW9uCi1vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ5PW9mIFR5cGUgRXJyb3IgTG9jYXRpb24KLW9mX1R5cGVfTWltZV9FeHRlbnNpb25fNTQ9b2YgVHlwZSBNaW1lIEV4dGVuc2lvbgotb2ZfVHlwZV9NaW1lX1R5cGVfNTU9b2YgVHlwZSBNaW1lIFR5cGUKLW9mX1R5cGVfTWltZV9FeHRlbnNpb25fX181Nj1vZiBUeXBlIE1pbWUgRXh0ZW5zaW9uOgotb2ZfVHlwZV9XZWJfUmVzb3VyY2VfQ29sbGVjdGlvbl82ND1vZiBUeXBlIFdlYiBSZXNvdXJjZSBDb2xsZWN0aW9uCi1vZl9UeXBlX0ZpbHRlcl9OYW1lXzY2PW9mIFR5cGUgRmlsdGVyIE5hbWUKLUludmFsaWRfVVJMXzcwPUludmFsaWQgVVJMCi1JbnZhbGlkX1VSTF83NT1JbnZhbGlkIFVSTAotb2ZfVHlwZV9TZXJ2bGV0X05hbWVfNzc9b2YgVHlwZSBTZXJ2bGV0IE5hbWUKLW9mX1R5cGVfVGFnbGliXzgwPW9mIFR5cGUgVGFnbGliCi1vZl9UeXBlX1RhZ0xpYl9fXzgxPW9mIFR5cGUgVGFnTGliOgotb2ZfVHlwZV9XZWJfUmVzb3VyY2VfTmFtZV84ND1vZiBUeXBlIFdlYiBSZXNvdXJjZSBOYW1lCi1vZl9UeXBlX1dlbGNvbWVfRmlsZV9OYW1lX184Nz1vZiBUeXBlIFdlbGNvbWUgRmlsZSBOYW1lCi1vZl9UeXBlX0Vudl9FbnRyeV9OYW1lX19fODg9b2YgVHlwZSBFbnZpcm9ubWVudCBFbnRyeSBOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9BYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvQWJzdHJhY3RKTkRJQmluZGluZ3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzZGU1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9BYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA2IElCTSBDb3Jwb3JhdGlvbgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAgdjEuMAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLmJpbmRpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElKTkRJQmluZGluZ3NIZWxwZXJ9LiBDbGllbnRzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyBmb3IgdGhlaXIKLSAqIGltcGxlbWVudGF0aW9ucy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RKTkRJQmluZGluZ3NIZWxwZXIgaW1wbGVtZW50cyBJSk5ESUJpbmRpbmdzSGVscGVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+b2JqZWN0LnRvU3RyaW5nKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPmJlYW4uZ2V0TmFtZSgpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJcmV0dXJuIGJlYW4uZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5yZXNvdXJjZVJlZi5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoRW50ZXJwcmlzZUJlYW4gYmVhbiwgUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYpIHsKLQkJcmV0dXJuIHJlc291cmNlUmVmLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+cmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKEVudGVycHJpc2VCZWFuIGJlYW4sIFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmKSB7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZi5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnNlY3VyaXR5Um9sZVJlZi5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoRW50ZXJwcmlzZUJlYW4gYmVhbiwgU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZikgewotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+cmVzb3VyY2VSZWYuZ2V0TmFtZSgpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKFdlYkFwcCB3ZWJBcHAsIFJlc291cmNlUmVmIHJlc291cmNlUmVmKSB7Ci0JCXJldHVybiByZXNvdXJjZVJlZi5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnJlc291cmNlRW52UmVmLmdldE5hbWUoKTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihXZWJBcHAgd2ViQXBwLCBSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZikgewotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT4oKEVKQkphcikgYmVhbi5lQ29udGFpbmVyKCkpLmdldERpc3BsYXlOYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JEZWZhdWx0RGF0YVNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW4pIHsKLQkJcmV0dXJuICgoRUpCSmFyKSBiZWFuLmVDb250YWluZXIoKSkuZ2V0RGlzcGxheU5hbWUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9JSk5ESUJpbmRpbmdzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9JSk5ESUJpbmRpbmdzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmE1MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvSUpORElCaW5kaW5nc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwNiBJQk0gQ29ycG9yYXRpb24KLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgIHYxLjAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5iaW5kaW5nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIHRvIGxvYWQgam5kaSBiaW5kaW5ncyBmcm9tIHZhcmlvdXMgSjJFRSBhcnRpZmFjdHMuIENsaWVudHMgc2hvdWxkIGFjcXVpcmUKLSAqIElCaW5kaW5nc0hlbHBlciBmcm9tIHRoZSB7QGxpbmsgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlcn0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpORElCaW5kaW5nc0hlbHBlciB7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUKLQkgKiB7QGxpbmsgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlcn0uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB7QGxpbmsgSUpORElCaW5kaW5nc0hlbHBlcn0gY2FuIGJlIHVzZWQgdG8gbG9hZCBiaW5kaW5ncyBmb3Igc3BlY2lmaWVkCi0JICogICAgICAgICBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUKLQkgKiB7QGxpbmsgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlcn0uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB7QGxpbmsgSUpORElCaW5kaW5nc0hlbHBlcn0gY2FuIGJlIHVzZWQgdG8gbG9hZCBiaW5kaW5ncyBmb3Igc3BlY2lmaWVkCi0JICogICAgICAgICBhcmNoaXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoQXJjaGl2ZSBhcmNoaXZlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBiZWFuJ3MgSk5ESSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIGJlYW4ncyBKTkRJIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpOREkgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBDTVAncyBkZWZhdWx0IGRhdGFzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgQ01QJ3MgZGVmYXVsdCBkYXRhc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JEZWZhdWx0RGF0YVNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW4pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGJlYW4ncyByZXNvdXJjZSByZWZlcmVuY2UncyBKTkRJIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gcmVzb3VyY2VSZWYKLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgYmVhbidzIHJlc291cmNlIHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKEVudGVycHJpc2VCZWFuIGJlYW4sIFJlc291cmNlUmVmIHJlc291cmNlUmVmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlJ3MgSk5ESSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIHJlc291cmNlRW52UmVmCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UncyBKTkRJIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihFbnRlcnByaXNlQmVhbiBiZWFuLCBSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgYmVhbidzIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmMncyBKTkRJIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gc2VjdXJpdHlSb2xlUmVmCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIGJlYW4ncyBzZWN1cml0eSByb2xlIHJlZmVyZW5jJ3MgSk5ESSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoRW50ZXJwcmlzZUJlYW4gYmVhbiwgU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZik7Ci0KLQkvKioKLQkgKiBSZXV0dXJucyB0aGUgc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbidzIHJlc291cmNlIHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViQXBwCi0JICogQHBhcmFtIHJlc291cmNlUmVmCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbidzIHJlc291cmNlIHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKFdlYkFwcCB3ZWJBcHAsIFJlc291cmNlUmVmIHJlc291cmNlUmVmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb24ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UncyBKTkRJIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHdlYkFwcAotCSAqIEBwYXJhbSByZXNvdXJjZUVudlJlZgotCSAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb24ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UncyBKTkRJIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihXZWJBcHAgd2ViQXBwLCBSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgT2JqZWN0J3MgSk5ESSBuYW1lLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIG5vbmUgb2YgdGhlCi0JICogb3RoZXJzIGFwcGx5LCBhcyBpdCB3aWxsIGxpa2VseSBiZSBpbmVmZmljaWVudCBkdWUgdG8gaW5zdGFuY2VvZiBjaGVja3MuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCBPYmplY3QncyBKTkRJIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZShPYmplY3Qgb2JqKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg1Mzg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0pORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgSUJNIENvcnBvcmF0aW9uCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlICB2MS4wCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwuYmluZGluZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZXMKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlciB7Ci0KLQlwcml2YXRlIExpc3QgYWxsSGVscGVyczsKLQlwcml2YXRlIElKTkRJQmluZGluZ3NIZWxwZXIgZGVmYXVsdEhlbHBlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUk9KRUNUID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUkNISVZFID0gMTsKLQotCXByaXZhdGUgc3RhdGljIEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgaGVscGVycyBhcHBsaWNhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuIElmIG5vIHJlZ2lzdGVyZWQKLQkgKiBiaW5kaW5ncyBoZWxwZXJzIGFwcGx5LCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIGEgZGVmYXVsdCBiaW5kaW5ncyBoZWxwZXIuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElKTkRJQmluZGluZ3NIZWxwZXJbXSBnZXRCaW5kaW5nc0hlbHBlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0QmluZGluZ3NIZWxwZXJzKFRZUEVfUFJPSkVDVCwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBoZWxwZXJzIGFwcGxpY2FibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4gSWYgbm8gcmVnaXN0ZXJlZAotCSAqIGJpbmRpbmdzIGhlbHBlcnMgYXBwbHksIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gYSBkZWZhdWx0IGJpbmRpbmdzIGhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUpORElCaW5kaW5nc0hlbHBlcltdIGdldEJpbmRpbmdzSGVscGVycyhBcmNoaXZlIGFyY2hpdmUpIHsKLQkJcmV0dXJuIGdldEJpbmRpbmdzSGVscGVycyhUWVBFX0FSQ0hJVkUsIGFyY2hpdmUpOwotCX0KLQotCXByaXZhdGUgSUpORElCaW5kaW5nc0hlbHBlcltdIGdldEJpbmRpbmdzSGVscGVycyhpbnQgdHlwZSwgT2JqZWN0IG9iaikgewotCQlMaXN0IGhlbHBlcnMgPSBnZXRIZWxwZXJzKCk7Ci0JCUxpc3QgYXBwbGllc0hlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKTkRJQmluZGluZ3NIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWxwZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloZWxwZXIgPSAoSUpORElCaW5kaW5nc0hlbHBlcikgaGVscGVycy5nZXQoaSk7Ci0JCQlpZiAoKFRZUEVfUFJPSkVDVCA9PSB0eXBlICYmIGhlbHBlci5hcHBsaWVzRm9yKChJUHJvamVjdCkgb2JqKSkgfHwgKFRZUEVfQVJDSElWRSA9PSB0eXBlICYmIGhlbHBlci5hcHBsaWVzRm9yKChBcmNoaXZlKSBvYmopKSkgewotCQkJCWFwcGxpZXNIZWxwZXJzLmFkZChoZWxwZXIpOwotCQkJfQotCQl9Ci0JCWlmIChhcHBsaWVzSGVscGVycy5zaXplKCkgPT0gMCkgewotCQkJYXBwbGllc0hlbHBlcnMuYWRkKGdldERlZmF1bHRIZWxwZXIoKSk7Ci0JCX0KLQotCQlJSk5ESUJpbmRpbmdzSGVscGVyW10gaGVscGVyc0FycmF5ID0gbmV3IElKTkRJQmluZGluZ3NIZWxwZXJbYXBwbGllc0hlbHBlcnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWxwZXJzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWhlbHBlcnNBcnJheVtpXSA9IChJSk5ESUJpbmRpbmdzSGVscGVyKSBhcHBsaWVzSGVscGVycy5nZXQoaSk7Ci0JCX0KLQotCQlyZXR1cm4gaGVscGVyc0FycmF5OwotCX0KLQotCXByaXZhdGUgSUpORElCaW5kaW5nc0hlbHBlciBnZXREZWZhdWx0SGVscGVyKCkgewotCQlpZiAobnVsbCA9PSBkZWZhdWx0SGVscGVyKSB7Ci0JCQlkZWZhdWx0SGVscGVyID0gbmV3IEFic3RyYWN0Sk5ESUJpbmRpbmdzSGVscGVyKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoSVByb2plY3QgcHJvamVjdCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhcHBsaWVzRm9yKEFyY2hpdmUgYXJjaGl2ZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBkZWZhdWx0SGVscGVyOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRIZWxwZXJzKCkgewotCQlpZiAobnVsbCA9PSBhbGxIZWxwZXJzKSB7Ci0JCQlCaW5kaW5nc0hlbHBlclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEJpbmRpbmdzSGVscGVyUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LnJlYWRSZWdpc3RyeSgpOwotCQkJYWxsSGVscGVycyA9IHJlZ2lzdHJ5LmdldEhlbHBlcnMoKTsKLQkJfQotCQlyZXR1cm4gYWxsSGVscGVyczsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgVEFHX0oyRUVfQklORElOR1NfSEVMUEVSID0gImpuZGlCaW5kaW5nc0hlbHBlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIEJpbmRpbmdzSGVscGVyUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIFN0cmluZyBUQUdfQklORElOR1NfSEVMUEVSID0gImpuZGlCaW5kaW5nc0hlbHBlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIExpc3QgaGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIEJpbmRpbmdzSGVscGVyUmVnaXN0cnkoKSB7Ci0JCQlzdXBlcihKMkVFQ29yZVBsdWdpbi5QTFVHSU5fSUQsIFRBR19KMkVFX0JJTkRJTkdTX0hFTFBFUik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKFRBR19CSU5ESU5HU19IRUxQRVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCWFkZEhlbHBlcigoSUpORElCaW5kaW5nc0hlbHBlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUykpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0SGVscGVycygpIHsKLQkJCXJldHVybiBoZWxwZXJzOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZEhlbHBlcihJSk5ESUJpbmRpbmdzSGVscGVyIGhlbHBlcikgewotCQkJaGVscGVycy5hZGQoaGVscGVyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MmJlMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbjsKLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MKLSAqIGluIGNvZGUuCi0gKiBUaGUgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUKLSAqIHR5cGUgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZQotICogdGhyb3duIHdoZW4gc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkKLSAqIHVuc3BlY2lmaWVkIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkIG5ldmVyIHJlbHkgb24KLSAqIHRoZXNlIGJlaW5nIHRocm93biAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0KLSAqIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJLy8gbm90IGFsbG93ZWQKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcwotCSAqIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgotCSAqIGlzIHRocm93bi4KLQkgKgotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0JICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcwotCSAqIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgotCSAqIGlzIHRocm93bi4KLQkgKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0JICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcwotCSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMKLQkgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJudWxsIGFyZ3VtZW50OiIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKLQkgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKgotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0JICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcwotCSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KLQkgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDczMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIAotICogb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvIHVuZXhwZWN0ZWQKLSAqIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLSAqIDwvcD4KLSAqLwotLyogcGFja2FnZSAqLwotY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQlzdXBlcihkZXRhaWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQ2F0YWxvZ0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI0YWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyIGV4dGVuZHMgSjJFRVhtbER0REVudGl0eVJlc29sdmVyIHsKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlcigpIHsKLQl9Ci0KLQlwdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotCQlpZiAodXJpUmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJdXJpUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQl9Ci0JCVN0cmluZyB1cmkgPSB1cmlSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCWlmIChudWxsICE9IHVyaSkgewotCQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0JCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSWQpOwotCQkJLy8gZm9yY2UgdGhlIGVuY29kaW5nIHRvIGJlIFVURjgKLQkJCXJlc3VsdC5zZXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0VjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9FY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDUyMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0VjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI5LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIFNvcnRlZFNldCBleHRlbnNpb25IZWxwZXJzOwotICAgIAotICAgIC8qCi0gICAgICogc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTkFNRSA9ICJlIjsgLy8kTk9OLU5MUy0xJCBzdGF0aWMgZmluYWwKLSAgICAgKiBTdHJpbmcgRUxFTUVOVF9KMkVFTU9EVUxFX0VYVEVOU0lPTiA9ICJqMmVlTW9kdWxlRXh0ZW5zaW9uSGVscGVyIjsKLSAgICAgKiAvLyROT04tTkxTLTEkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VYVEVOU0lPTl9DTEFTUyA9Ci0gICAgICogImV4dGVuc2lvbkNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBJTlNUQU5DRSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3IgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9NT0RFTF9FWFRFTkRFUiA9ICJlamJNb2RlbEV4dGVuZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0VKQl9FWFRFTlNJT05fQ0xBU1MgPSAiZXh0ZW5zaW9uQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxvYWRPcmRlckNvdW50ZXIgPSAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGxvYWRPcmRlcjsKLQotICAgICAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0gICAgICAgIHByaXZhdGUgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGluc3RhbmNlOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBBc3NlcnQuaXNMZWdhbChFSkJfTU9ERUxfRVhURU5ERVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHVzZWQgdG8gY3JlYXRlIEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuRGVzY3JpcHRvci4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0gICAgICAgICAgICB0aGlzLmxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlI2dldExvYWRPcmRlcigpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkT3JkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gKEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcikgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfRUpCX0VYVEVOU0lPTl9DTEFTUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoSjJFRUNvcmVQbHVnaW4uUExVR0lOX0lELCBEZXNjcmlwdG9yLkVKQl9NT0RFTF9FWFRFTkRFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotICAgICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcigpOwotICAgICAgICAgICAgSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3LyBhbiBleHRlbnNpb24gbGlrZTogPGVhck1vZHVsZUV4dGVuc2lvbgotICAgICAqIGV4dGVuc2lvbkNsYXNzID0gImNvbS5pYm0uZXRvb2xzLndlYi5wbHVnaW4uV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbCIvPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIGlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERlc2NyaXB0b3IuRUpCX01PREVMX0VYVEVOREVSKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGFkZE1vZHVsZUV4dGVuc2lvbihuZXcgRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZHVsZUV4dGVuc2lvbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZ2V0RXh0ZW5zaW9uSGVscGVycygpLmFkZChkZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyI2dldEVKQk1vZHVsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIC8vSVByb2plY3QgcHJvamVjdCA9IG51bGw7IC8vIFRPRE8gTURFIEdldCB0aGUgcHJvamVjdCB1c2luZyBQcm9qZWN0IFV0aWxpdGllcyAoYWRkIGRlcGVuZCB0byBlbWYud29ya2JlbmNoID8pCi0gICAgCWlmIChnZXRFeHRlbnNpb25IZWxwZXJzKCkuaXNFbXB0eSgpKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKSBnZXRFeHRlbnNpb25IZWxwZXJzKCkuZmlyc3QoKTsKLSAgICAgICAgaWYoZGVzY3JpcHRvciAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciNoYXNFSkJNb2R1bGVFeHRlbnNpb24oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9uSGVscGVycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkU2V0IGdldEV4dGVuc2lvbkhlbHBlcnMoKSB7IAotICAgICAgICBpZiAoZXh0ZW5zaW9uSGVscGVycyA9PSBudWxsKSBleHRlbnNpb25IZWxwZXJzID0gbmV3IFRyZWVTZXQoSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkhlbHBlcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiOTdkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEoyRUVDb3JlUGx1Z2luIGluc3QgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSjJFRUNvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChpbnN0PT1udWxsKSBpbnN0ID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5JTlNUQU5DRS5zZXRQcm92aWRlcihFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmdldEluc3RhbmNlKCkpOwotCQkvLyBObyB0aGF0IHdlIGNhbiByZWdpc3RlciBhZ2FpbnN0IE9TR0kgZGVwZW5kZW5jaWVzIC0gbGV0cyByZS11c2UgdGhlIGNhdGFsb2cgcmVzb2x2ZXIKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLklOU1RBTkNFID0gbmV3IENhdGFsb2dKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIoKTsKLQkJRE9NVXRpbGl0aWVzLnNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0UpOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKMkVFQ29yZVBsdWdpbiBnZXRQbHVnaW4oKXsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldFBsdWdpbklEKCkpOwotCQkJc2V0UmVuZGVyZXIobG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL2VyZWZ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGUxMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL2VyZWZ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBKMkVFIFZhbGlkYXRpb24gcHJvamVjdAotIyBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgotIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcwotIyA6RW5kOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpFbmQ6Ci0jCi0jIDE0LU9jdG9iZXItMjAwMToKLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUU9Q0hLSjMwMDlFOiBJbiBtb2R1bGUgezF9LCAnJ2VqYi1yZWYtbmFtZScnIGVsZW1lbnQgaW4gIGVqYi1yZWY6IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRT1DSEtKMzAxMEU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi10eXBlJycgZWxlbWVudCBpbiBlamItcmVmOiB7MH0gaXMgaW52YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEU9Q0hLSjMwMTRFOiBJbiBtb2R1bGUgezF9LCAnJ2VqYi1yZWYtdHlwZScnIGVsZW1lbnQgaW4gZWpiLXJlZjogezB9IGlzIG1pc3NpbmcuCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUU9Q0hLSjMwMTFFOiBJbiBtb2R1bGUgezF9LCBIb21lIGludGVyZmFjZSBpcyBtaXNzaW5nIGZyb20gZWpiLXJlZjogezB9IGVsZW1lbnQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VSRUZSRU1PVEU9Q0hLSjMwMTJFOiBJbiBtb2R1bGUgezF9LCBSZW1vdGUgaW50ZXJmYWNlIGlzIG1pc3NpbmcgZnJvbSBlamItcmVmOiB7MH0gZWxlbWVudC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEU9Q0hLSjI4MjdXOiAnJ3NlY3VyaXR5LXJvbGUtcmVmJycgZWxlbWVudCB7MH0gZGVmaW5lcyB0aGUgJydyb2xlLWxpbmsnJyBlbGVtZW50IGJ1dCBubyAnJ3NlY3VyaXR5LXJvbGUnJyBlbGVtZW50cyBpbiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUY9Q0hLSjMwMTNFOiBEdXBsaWNhdGUgJydyZXNvdXJjZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyBuZXcgc3RyaW5nIGFkZGVkIGZvciB2ZXJzaW9uIDUgV1NBRAotVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fPUlXQUUwMDM0VyBFSkIgbGluayBlbGVtZW50IHswfSBpcyB1bnJlc29sdmFibGUgaW4gbW9kdWxlIHsxfSBhbmQgRUFSIHsyfS4KLQotRVJST1JfRUFSX0RVUExJQ0FURV9TRVJWSUNFUkVGPUNIS0ozMDE1RTogRHVwbGljYXRlICcnc2VydmljZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfU0VDVVJJVFlST0xFUkVGPUNIS0ozMDE2RTogRHVwbGljYXRlICcnc2VjdXJpdHkgcm9sZS1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfRUpCUkVGPUNIS0ozMDE3RTogRHVwbGljYXRlICcnZWpiLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUY9Q0hLSjMwMThFOiBEdXBsaWNhdGUgJydyZXNvdXJjZSBlbnZpcm9ubWVudC1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9EVVBMSUNBVEVfTUVTU1NBR0VERVNUSU5BVElPTlJFRj1DSEtKMzAxOUU6IER1cGxpY2F0ZSAnJ21lc3NhZ2UgZGVzdGluYXRpb24tcmVmJycgZWxlbWVudCBuYW1lZCB7MH0uCi1FUlJPUl9FQVJfTUlTU0lOR19NRVNTU0FHRURFU1RJTkFUSU9OPU1lc3NhZ2UgZGVzdGluYXRpb24gbGluayAnJ3swfScnIGZvciBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZiAnJ3sxfScnIGlzIHVucmVzb2x2YWJsZSBpbiBtb2R1bGUgJyd7Mn0nJyBhbmQgRUFSICcnezN9JycuCi1FUlJPUl9VTlJFU09MVkVEX01EQl9NSVNTSU5HX01FU1NBR0VfREVTVElOQVRJT049TWVzc2FnZSBkZXN0aW5hdGlvbiBsaW5rICcnezB9Jycgb2YgTURCICcnezF9JycgaXMgdW5yZXNvbHZhYmxlIGluIG1vZHVsZSAnJ3syfScnIGFuZCBFQVIgJyd7M30nJy4KLUVSUk9SX0VBUl9NSVNTSU5HX0VNUFRZX01FU1NTQUdFREVTVElOQVRJT049TWVzc2FnZSBkZXN0aW5hdGlvbiBsaW5rIGlzIGVtcHR5IGZvciBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZiAnJ3swfScnIGluIG1vZHVsZSAnJ3sxfScnIGFuZCBFQVIgJyd7Mn0nJy4KLUVSUk9SX01PRFVMRV9ERF9GSUxFX05PVF9GT1VORD1UaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoZSBtb2R1bGUgJyd7MH0nJyBjYW5ub3QgYmUgbG9hZGVkIG9yIGZvdW5kLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RmYjU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi0gKiAJYXBwbGljYXRpb24uCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRNb2R1bGVzIDxlbT5Nb2R1bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldExpYnJhcnlEaXJlY3RvcnkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0JICogCSAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKYXZhIEVFIG1vZHVsZSBpbiB0aGUKLQkgKiAJICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAqIAkgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaWJyYXJ5IERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbGlicmFyeS1kaXJlY3RvcnkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lCi0JICogCSAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCi0JICogCSAgICB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQWxsIGZpbGVzCi0JICogCSAgICBuYW1lZCAiKi5qYXIiIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgYmUgbWFkZSBhdmFpbGFibGUKLQkgKiAJICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKLQkgKiAJICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBJZiB0aGlzIGVsZW1lbnQgaXNuJ3Qgc3BlY2lmaWVkLAotCSAqIAkgICAgdGhlIGRpcmVjdG9yeSBuYW1lZCAibGliIiBpcyBzZWFyY2hlZC4gIEFuIGVtcHR5IGVsZW1lbnQKLQkgKiAJICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaWJyYXJ5IERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlicmFyeURpcmVjdG9yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TGlicmFyeURpcmVjdG9yeSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaWJyYXJ5RGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiI1IjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDUuCi0JICogCi0JICogCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpCi0JICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIGEgbW9kdWxlIHRvIGZpbmQuCi0JICogQHJldHVybiBUaGUgZmlyc3QgbWF0Y2hpbmcgbW9kdWxlIG9yIG51bGwgaWYgbm8gbW9kdWxlIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBNb2R1bGUgZ2V0Rmlyc3RNb2R1bGUoU3RyaW5nIHVyaSk7Ci0KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpLCBTdHJpbmcgYWx0REQpOwotCi19IC8vIEFwcGxpY2F0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2YWUyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEphdmEgRUUKLQkgKiAJYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqIAotCSAqICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gdmFsdWUpOwotCi19IC8vIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1YTAxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2R1bGUgY3JlYXRlTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWIgY3JlYXRlV2ViKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uUGFja2FnZSBnZXRBcHBsaWNhdGlvblBhY2thZ2UoKTsKLQotfSAvL0FwcGxpY2F0aW9uRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9JQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9JQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjkzOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vSUFwcGxpY2F0aW9uUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcHBsaWNhdGlvblJlc291cmNlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlYXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY5MzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1vZHVsZVR5cGUgZGVmaW5lcyBhIHNpbmdsZSBKYXZhIEVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotICogCWNvbm5lY3RvciwgZWpiLCBqYXZhLCBvciB3ZWIgZWxlbWVudCwgd2hpY2ggaW5kaWNhdGVzIHRoZQotICogCW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLSAqIAlvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0bwotICogCXRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0Q29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEVqYiA8ZW0+RWpiPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRKYXZhIDxlbT5KYXZhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRXZWIgPGVtPldlYjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0QWx0RGQgPGVtPkFsdCBEZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRNb2R1bGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotCSAqIAkgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0JICogCSAgICAgIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQkgKiAKLQkgKiAJICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbm5lY3RvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRNb2R1bGVfQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3RvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0Q29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0b3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICAgIFRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLAotCSAqIAkgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBwYWNrYWdlLgotCSAqIAotCSAqIAkgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZV9FamIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRFamIgPGVtPkVqYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICAgIFRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhCi0JICogCSAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLQkgKiAJICAgICAgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF2YShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRNb2R1bGVfSmF2YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRKYXZhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRKYXZhIDxlbT5KYXZhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlYjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlYihXZWIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRNb2R1bGVfV2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViIGdldFdlYigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0V2ViIDxlbT5XZWI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlYjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWIoV2ViIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdCBEZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUKLQkgKiAJICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogCSAgICBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSmF2YSBFRSBtb2R1bGUuICBUaGUgVVJJIG11c3QKLQkgKiAJICAgIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQKLQkgKiAJICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0JICogCSAgICBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIKLQkgKiAJICAgIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQKLQkgKiAJICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLQkgKiAJICAgIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHQgRGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdERkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZV9BbHREZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHREZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0QWx0RGQgPGVtPkFsdCBEZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0IERkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHREZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0RGQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0TW9kdWxlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCk7Ci0KLX0gLy8gTW9kdWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9XZWIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vV2ViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmYxZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9XZWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLSAqIAlhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldFdlYlVyaSA8ZW0+V2ViIFVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0Q29udGV4dFJvb3QgPGVtPkNvbnRleHQgUm9vdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWIoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgKiAJICAgIGFwcGxpY2F0aW9uIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlCi0JICogCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgVXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXZWJVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViX1dlYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXZWJVcmkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldFdlYlVyaSA8ZW0+V2ViIFVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFVyaTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2ViVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWJVcmkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQgUm9vdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLQkgKiAJICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFJvb3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnRleHRSb290KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldFdlYl9Db250ZXh0Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb250ZXh0Um9vdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0Q29udGV4dFJvb3QgPGVtPkNvbnRleHQgUm9vdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dCBSb290PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb250ZXh0Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGV4dFJvb3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXZWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1YzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pZ2V0TWl4ZWQoKS5nZXQoQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04sIG5ld0FwcGxpY2F0aW9uLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OLCBuZXdBcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTU2OTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25GYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkZhY3RvcnkgdGhlQXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlQXBwbGljYXRpb25GYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQXBwbGljYXRpb25GYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVNb2R1bGUoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKLQkJQXBwbGljYXRpb25JbXBsIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwgYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ldyBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGNyZWF0ZU1vZHVsZSgpIHsKLQkJTW9kdWxlSW1wbCBtb2R1bGUgPSBuZXcgTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWIgY3JlYXRlV2ViKCkgewotCQlXZWJJbXBsIHdlYiA9IG5ldyBXZWJJbXBsKCk7Ci0JCXJldHVybiB3ZWI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uUGFja2FnZSBnZXRBcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzM0Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uLklDb21tb25BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uLklDb21tb25Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldE1vZHVsZXMgPGVtPk1vZHVsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0U2VjdXJpdHlSb2xlcyA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0TGlicmFyeURpcmVjdG9yeSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uLCBJQ29tbW9uQXBwbGljYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZXMoKSA8ZW0+TW9kdWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNb2R1bGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbW9kdWxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVzKCkgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpYnJhcnlEaXJlY3RvcnkgPSBMSUJSQVJZX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlcygpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkgewotCQkJbW9kdWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNb2R1bGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUyk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeURpcmVjdG9yeShTdHJpbmcgbmV3TGlicmFyeURpcmVjdG9yeSkgewotCQlTdHJpbmcgb2xkTGlicmFyeURpcmVjdG9yeSA9IGxpYnJhcnlEaXJlY3Rvcnk7Ci0JCWxpYnJhcnlEaXJlY3RvcnkgPSBuZXdMaWJyYXJ5RGlyZWN0b3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZLCBvbGRMaWJyYXJ5RGlyZWN0b3J5LCBsaWJyYXJ5RGlyZWN0b3J5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24sICFvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyc2lvbigpIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCQl2ZXJzaW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgVkVSU0lPTl9FREVGQVVMVCwgb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TW9kdWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlnZXRNb2R1bGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNb2R1bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZOgotCQkJCXNldExpYnJhcnlEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJZ2V0TW9kdWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWToKLQkJCQlzZXRMaWJyYXJ5RGlyZWN0b3J5KExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXVuc2V0VmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCXJldHVybiBtb2R1bGVzICE9IG51bGwgJiYgIW1vZHVsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZOgotCQkJCXJldHVybiBMSUJSQVJZX0RJUkVDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gbGlicmFyeURpcmVjdG9yeSAhPSBudWxsIDogIUxJQlJBUllfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhsaWJyYXJ5RGlyZWN0b3J5KTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXJldHVybiBpc1NldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxpYnJhcnlEaXJlY3Rvcnk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGlicmFyeURpcmVjdG9yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ZXJzaW9uRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpCi0JICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIGEgbW9kdWxlIHRvIGZpbmQuCi0JICogQHJldHVybiBUaGUgZmlyc3QgbWF0Y2hpbmcgbW9kdWxlIG9yIG51bGwgaWYgbm8gbW9kdWxlIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBNb2R1bGUgZ2V0Rmlyc3RNb2R1bGUoU3RyaW5nIHVyaSl7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBhbGxNb2R1bGVzID0gZ2V0TW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxNb2R1bGVzLmhhc05leHQoKSl7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpYWxsTW9kdWxlcy5uZXh0KCk7Ci0JCQlpZih1cmkuZXF1YWxzKGFNb2R1bGUuZ2V0VXJpKCkpKSByZXR1cm4gYU1vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpLCBTdHJpbmcgYWx0REQpIHsKLQkJTGlzdCBhbGxNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgYWxsTW9kdWxlcy5nZXQoaSk7Ci0JCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBhTW9kdWxlLmdldFVyaSgpKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChhbHRERCwgYU1vZHVsZS5nZXRBbHREZCgpKSkKLQkJCQlyZXR1cm4gYU1vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFQVJNb2R1bGVzKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlcygpOwotCX0KLQotCXB1YmxpYyBJQ29tbW9uTW9kdWxlIGdldEZpcnN0RUFSTW9kdWxlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIChJQ29tbW9uTW9kdWxlKSBnZXRGaXJzdE1vZHVsZSh1cmkpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzEwOGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLm5hbWVzcGFjZS5YTUxOYW1lc3BhY2VQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvblBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQXBwbGljYXRpb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUphdmFlZVBhY2thZ2VJbXBsIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhZWVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgOiBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlID0gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVBcHBsaWNhdGlvblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fTGlicmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0VqYigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1vZHVsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9KYXZhKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlX1dlYigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZHVsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9BbHREZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1vZHVsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1vZHVsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViKCkgewotCQlyZXR1cm4gd2ViRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYl9XZWJVcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJfQ29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXBwbGljYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fSUNPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fTU9EVUxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19WRVJTSU9OKTsKLQotCQlhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04pOwotCi0JCW1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19DT05ORUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19FSkIpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19KQVZBKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fV0VCKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fQUxUX0REKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fSUQpOwotCi0JCXdlYkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkVDbGFzcywgV0VCX19XRUJfVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJFQ2xhc3MsIFdFQl9fQ09OVEVYVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJFQ2xhc3MsIFdFQl9fSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkVDbGFzcywgQXBwbGljYXRpb24uY2xhc3MsICJBcHBsaWNhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksIHRoaXMuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInNlY3VyaXR5Um9sZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fTGlicmFyeURpcmVjdG9yeSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJsaWJyYXJ5RGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXdleVZlcnNpb25UeXBlKCksICJ2ZXJzaW9uIiwgIjUiLCAxLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmNsYXNzLCAiQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpLCB0aGlzLmdldEFwcGxpY2F0aW9uKCksIG51bGwsICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtb2R1bGVFQ2xhc3MsIE1vZHVsZS5jbGFzcywgIk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQ29ubmVjdG9yKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImNvbm5lY3RvciIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0VqYigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamIiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9KYXZhKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImphdmEiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZV9XZWIoKSwgdGhpcy5nZXRXZWIoKSwgbnVsbCwgIndlYiIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQWx0RGQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiYWx0RGQiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdlYkVDbGFzcywgV2ViLmNsYXNzLCAiV2ViIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYl9XZWJVcmkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAid2ViVXJpIiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfQ29udGV4dFJvb3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImNvbnRleHRSb290IiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOyAvLyROT04tTkxTLTEkCQkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2F0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJhcHBsaWNhdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibW9kdWxlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VjdXJpdHktcm9sZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsaWJyYXJ5LWRpcmVjdG9yeSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJtaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICI6bWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInhzaTpzY2hlbWFMb2NhdGlvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFwcGxpY2F0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1vZHVsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibW9kdWxlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX0Nvbm5lY3RvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY29ubmVjdG9yIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9FamIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfSmF2YSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9XZWIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlYiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfQWx0RGQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFsdC1kZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdlYkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAid2ViVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViX1dlYlVyaSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAid2ViLXVyaSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJfQ29udGV4dFJvb3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNvbnRleHQtcm9vdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIyNTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uLklDb21tb25Nb2R1bGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsI2dldENvbm5lY3RvciA8ZW0+Q29ubmVjdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCNnZXRFamIgPGVtPkVqYjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwjZ2V0SmF2YSA8ZW0+SmF2YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwjZ2V0V2ViIDxlbT5XZWI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsI2dldEFsdERkIDxlbT5BbHQgRGQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1vZHVsZSwgSUNvbW1vbk1vZHVsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3RvcigpIDxlbT5Db25uZWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3RvcigpIDxlbT5Db25uZWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0b3IgPSBDT05ORUNUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiKCkgPGVtPkVqYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiKCkgPGVtPkVqYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYiA9IEVKQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhKCkgPGVtPkphdmE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YSgpIDxlbT5KYXZhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmEgPSBKQVZBX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViKCkgPGVtPldlYjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViIHdlYiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0RGQoKSA8ZW0+QWx0IERkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHREZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxUX0REX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdERkKCkgPGVtPkFsdCBEZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0RGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0RGQgPSBBTFRfRERfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1PRFVMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoU3RyaW5nIG5ld0Nvbm5lY3RvcikgewotCQlTdHJpbmcgb2xkQ29ubmVjdG9yID0gY29ubmVjdG9yOwotCQljb25uZWN0b3IgPSBuZXdDb25uZWN0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUiwgb2xkQ29ubmVjdG9yLCBjb25uZWN0b3IpKTsKLQl9Ci0JLy8gUmV0dXJucyB0aGUgdXJpIG9mIHRoZSBnaXZlbiBtb2R1bGUgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlpZiAoZUlzU2V0KEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0VKQikpCi0JCQlyZXR1cm4gZ2V0RWpiKCk7Ci0JCWVsc2UgaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1IpKQotCQkJcmV0dXJuIGdldENvbm5lY3RvcigpOwotCQllbHNlIGlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQSkpCi0JCQlyZXR1cm4gZ2V0SmF2YSgpOwotCQllbHNlIGlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fV0VCKSkKLQkJCXJldHVybiBnZXRXZWIoKS5nZXRXZWJVcmkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiKCkgewotCQlyZXR1cm4gZWpiOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYihTdHJpbmcgbmV3RWpiKSB7Ci0JCVN0cmluZyBvbGRFamIgPSBlamI7Ci0JCWVqYiA9IG5ld0VqYjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fRUpCLCBvbGRFamIsIGVqYikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YSgpIHsKLQkJcmV0dXJuIGphdmE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YShTdHJpbmcgbmV3SmF2YSkgewotCQlTdHJpbmcgb2xkSmF2YSA9IGphdmE7Ci0JCWphdmEgPSBuZXdKYXZhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19KQVZBLCBvbGRKYXZhLCBqYXZhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYiBnZXRXZWIoKSB7Ci0JCXJldHVybiB3ZWI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViKFdlYiBuZXdXZWIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2ViIG9sZFdlYiA9IHdlYjsKLQkJd2ViID0gbmV3V2ViOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUIsIG9sZFdlYiwgbmV3V2ViKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWIoV2ViIG5ld1dlYikgewotCQlpZiAobmV3V2ViICE9IHdlYikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2ViICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdlYikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V2ViICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWIobmV3V2ViLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQiwgbmV3V2ViLCBuZXdXZWIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdERkKCkgewotCQlyZXR1cm4gYWx0RGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx0RGQoU3RyaW5nIG5ld0FsdERkKSB7Ci0JCVN0cmluZyBvbGRBbHREZCA9IGFsdERkOwotCQlhbHREZCA9IG5ld0FsdERkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQsIG9sZEFsdERkLCBhbHREZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SOgotCQkJCXJldHVybiBnZXRDb25uZWN0b3IoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fRUpCOgotCQkJCXJldHVybiBnZXRFamIoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQToKLQkJCQlyZXR1cm4gZ2V0SmF2YSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUI6Ci0JCQkJcmV0dXJuIGdldFdlYigpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIGdldEFsdERkKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUjoKLQkJCQlzZXRDb25uZWN0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19FSkI6Ci0JCQkJc2V0RWpiKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQToKLQkJCQlzZXRKYXZhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fV0VCOgotCQkJCXNldFdlYigoV2ViKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHREZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUjoKLQkJCQlzZXRDb25uZWN0b3IoQ09OTkVDVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0VKQjoKLQkJCQlzZXRFamIoRUpCX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0pBVkE6Ci0JCQkJc2V0SmF2YShKQVZBX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQjoKLQkJCQlzZXRXZWIoKFdlYiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHREZChBTFRfRERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1I6Ci0JCQkJcmV0dXJuIENPTk5FQ1RPUl9FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdG9yICE9IG51bGwgOiAhQ09OTkVDVE9SX0VERUZBVUxULmVxdWFscyhjb25uZWN0b3IpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19FSkI6Ci0JCQkJcmV0dXJuIEVKQl9FREVGQVVMVCA9PSBudWxsID8gZWpiICE9IG51bGwgOiAhRUpCX0VERUZBVUxULmVxdWFscyhlamIpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19KQVZBOgotCQkJCXJldHVybiBKQVZBX0VERUZBVUxUID09IG51bGwgPyBqYXZhICE9IG51bGwgOiAhSkFWQV9FREVGQVVMVC5lcXVhbHMoamF2YSk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQjoKLQkJCQlyZXR1cm4gd2ViICE9IG51bGw7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHREZCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0RGQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbm5lY3RvcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb25uZWN0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmE6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoamF2YSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0RGQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWx0RGQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rvck1vZHVsZSgpIHsKLQkJaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1IpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyogUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQkJaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19FSkIpICkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIAotCSAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YU1vZHVsZSgpIHsKLQkJaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19KQVZBKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIAotCSAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlKCkgewotCQlpZiAoZUlzU2V0KEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0KLX0gLy9Nb2R1bGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTExYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViSW1wbCNnZXRXZWJVcmkgPGVtPldlYiBVcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJJbXBsI2dldENvbnRleHRSb290IDxlbT5Db250ZXh0IFJvb3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlVyaSgpIDxlbT5XZWIgVXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViVXJpKCkgPGVtPldlYiBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3ZWJVcmkgPSBXRUJfVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRSb290KCkgPGVtPkNvbnRleHQgUm9vdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0Um9vdCgpIDxlbT5Db250ZXh0IFJvb3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRSb290ID0gQ09OVEVYVF9ST09UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJVcmkoKSB7Ci0JCXJldHVybiB3ZWJVcmk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViVXJpKFN0cmluZyBuZXdXZWJVcmkpIHsKLQkJU3RyaW5nIG9sZFdlYlVyaSA9IHdlYlVyaTsKLQkJd2ViVXJpID0gbmV3V2ViVXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19XRUJfVVJJLCBvbGRXZWJVcmksIHdlYlVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiBjb250ZXh0Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgbmV3Q29udGV4dFJvb3QpIHsKLQkJU3RyaW5nIG9sZENvbnRleHRSb290ID0gY29udGV4dFJvb3Q7Ci0JCWNvbnRleHRSb290ID0gbmV3Q29udGV4dFJvb3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0NPTlRFWFRfUk9PVCwgb2xkQ29udGV4dFJvb3QsIGNvbnRleHRSb290KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSToKLQkJCQlyZXR1cm4gZ2V0V2ViVXJpKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0NPTlRFWFRfUk9PVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGV4dFJvb3QoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSToKLQkJCQlzZXRXZWJVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19DT05URVhUX1JPT1Q6Ci0JCQkJc2V0Q29udGV4dFJvb3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19XRUJfVVJJOgotCQkJCXNldFdlYlVyaShXRUJfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0NPTlRFWFRfUk9PVDoKLQkJCQlzZXRDb250ZXh0Um9vdChDT05URVhUX1JPT1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19XRUJfVVJJOgotCQkJCXJldHVybiBXRUJfVVJJX0VERUZBVUxUID09IG51bGwgPyB3ZWJVcmkgIT0gbnVsbCA6ICFXRUJfVVJJX0VERUZBVUxULmVxdWFscyh3ZWJVcmkpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19DT05URVhUX1JPT1Q6Ci0JCQkJcmV0dXJuIENPTlRFWFRfUk9PVF9FREVGQVVMVCA9PSBudWxsID8gY29udGV4dFJvb3QgIT0gbnVsbCA6ICFDT05URVhUX1JPT1RfRURFRkFVTFQuZXF1YWxzKGNvbnRleHRSb290KTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3ZWJVcmk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQod2ViVXJpKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb250ZXh0Um9vdDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb250ZXh0Um9vdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XZWJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGMwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgQCgjKWFwcGxpY2F0aW9uXzUueHNkcwkxLjE3IDA4LzA1LzA1Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgCi0gKiAKLSAqIAlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gNSBkZXBsb3ltZW50Ci0gKiAJZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotICogCSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiIGluIHRoZSBhcHBsaWNhdGlvbidzIGVhciBmaWxlLgotICogCUFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLSAqIAl0aGUgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCi0gKiAJYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAqIAl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICogCi0gKiAJICAgICZsdDthcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICogCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gKiAJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIgotICogCSAgICAgIHZlcnNpb249IjUiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L2FwcGxpY2F0aW9uJmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICogCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QKLSAqIAotICogCQotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAotICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlXzUueHNkcwkxLjY1IDA2LzAyLzE3Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLSAqIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotICogaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotICogCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgajJlZSBhcHBsaWNhdGlvbjsKLSAqICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gKiAgICAgd2ViIGFwcGxpY2F0aW9uOwotICogICAgIGVudGVycHJpc2UgYmVhbjsKLSAqICAgICByZXNvdXJjZSBhZGFwdGVyOwotICogCi0gKiBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGVhciBmaWxlOwotICogICAgIHdhciBmaWxlOwotICogICAgIGphciBmaWxlOwotICogICAgIHJhciBmaWxlOwotICogCi0gKiAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2RzCTEuMTkgMDIvMTMvMDYKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICogICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gKiAKLSAqICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQotICogICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAotICogCi0gKiAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCi0gKiAgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCi0gKiAgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCi0gKiAgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCi0gKiAgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6Ci0gKiAKLSAqICAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55Ci0gKiAgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAotICogICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGlmIGRlY2xhcmVkIHRvIGJlIG9mIHR5cGUgSUQuCi0gKiAgICAgICAgICBUaGUgeG1sOmlkIHNwZWNpZmljYXRpb24gaXMgbm90IHlldCBhIFczQyBSZWNvbW1lbmRhdGlvbiwKLSAqICAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uCi0gKiAgICAgICAgICB3aXRoIHRoZSBtZWNoYW5pc21zIGl0IHByb3Bvc2VzLiAgTm90ZSB0aGF0IGl0IGlzIF9ub3RfIGluY2x1ZGVkCi0gKiAgICAgICAgICBpbiB0aGUgc3BlY2lhbEF0dHJzIGF0dHJpYnV0ZSBncm91cC4KLSAqIAotICogICAgIGxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKLSAqICAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKLSAqIAotICogICAgICAgICAgICAgIEluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQgZGVkaWNhdGlvbgotICogICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMAotICogICAgICAgICAgICAgIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eSB0aGUgWE1MIG5hbWUKLSAqICAgICAgICAgICAgICB4bWw6RmF0aGVyCi0gKiAgIAotICogVGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAqICAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICogICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkCi0gKiAgICAgICAgIGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0gKiAKLSAqICAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAqICAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gKiAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAqICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OwotICogCi0gKiAgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICogICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19NT0RVTEVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaWJyYXJ5IERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fSUQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fVkVSU0lPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgPGVtPk1vZHVsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTU9EVUxFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX0NPTk5FQ1RPUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19FSkIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX0pBVkEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9fV0VCID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHQgRGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX0FMVF9ERCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX0lEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViSW1wbCA8ZW0+V2ViPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfX1dFQl9VUkkgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUm9vdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9fQ09OVEVYVF9ST09UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlYjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldE1vZHVsZXMgPGVtPk1vZHVsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZHVsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldE1vZHVsZXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFNlY3VyaXR5Um9sZXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TGlicmFyeURpcmVjdG9yeSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaWJyYXJ5IERpcmVjdG9yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TGlicmFyeURpcmVjdG9yeSgpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX0xpYnJhcnlEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldENvbm5lY3RvciA8ZW0+Q29ubmVjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0Q29ubmVjdG9yKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9Db25uZWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0RWpiIDxlbT5FamI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRFamIoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0VqYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRKYXZhIDxlbT5KYXZhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEphdmEoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0phdmEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0V2ViIDxlbT5XZWI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5XZWI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRXZWIoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TW9kdWxlX1dlYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRBbHREZCA8ZW0+QWx0IERkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0IERkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0QWx0RGQoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0FsdERkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiA8ZW0+V2ViPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0V2ViVXJpIDxlbT5XZWIgVXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2ViIFVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldFdlYlVyaSgpCi0JICogQHNlZSAjZ2V0V2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJfV2ViVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldENvbnRleHRSb290IDxlbT5Db250ZXh0IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250ZXh0IFJvb3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRDb250ZXh0Um9vdCgpCi0JICogQHNlZSAjZ2V0V2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJfQ29udGV4dFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V2ViKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19NT0RVTEVTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlicmFyeSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fTGlicmFyeURpcmVjdG9yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgPGVtPk1vZHVsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1PRFVMRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3RvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1PRFVMRV9fQ09OTkVDVE9SID0gZUlOU1RBTkNFLmdldE1vZHVsZV9Db25uZWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1PRFVMRV9fRUpCID0gZUlOU1RBTkNFLmdldE1vZHVsZV9FamIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0pBVkEgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX0phdmEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1PRFVMRV9fV0VCID0gZUlOU1RBTkNFLmdldE1vZHVsZV9XZWIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdCBEZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1PRFVMRV9fQUxUX0REID0gZUlOU1RBTkNFLmdldE1vZHVsZV9BbHREZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0lEID0gZUlOU1RBTkNFLmdldE1vZHVsZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkltcGwgPGVtPldlYjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2ViKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQiA9IGVJTlNUQU5DRS5nZXRXZWIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfX1dFQl9VUkkgPSBlSU5TVEFOQ0UuZ2V0V2ViX1dlYlVyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBSb290PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX19DT05URVhUX1JPT1QgPSBlSU5TVEFOQ0UuZ2V0V2ViX0NvbnRleHRSb290KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9fSUQgPSBlSU5TVEFOQ0UuZ2V0V2ViX0lkKCk7Ci0KLQl9Ci0KLX0gLy9BcHBsaWNhdGlvblBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI0MzJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWIoV2ViIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiA8ZW0+V2ViPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzFhYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvblJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotLy8JCVhNTE9wdGlvbnMgeG1sT3B0aW9ucyA9IG5ldyBYTUxPcHRpb25zSW1wbCgpOwotLy8KLS8vCQl4bWxPcHRpb25zLnNldFByb2Nlc3NTY2hlbWFMb2NhdGlvbnModHJ1ZSk7Ci0vLwkJICAgIAotLy8JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9PUFRJT05TLCB4bWxPcHRpb25zKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzdmNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLklBcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KRUVYTUxMb2FkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSVJvb3RPYmplY3RSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSUFwcGxpY2F0aW9uUmVzb3VyY2UgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCSByZXR1cm4gbmV3IEpFRVhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgRWFyWE1MSGVscGVySW1wbCh0aGlzKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsLklBcHBsaWNhdGlvblJlc291cmNlI2dldFJvb3RPYmplY3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3Qgcm9vdCA9IGdldENvbnRlbnRzKCkuZ2V0KDApOwotCQlpZihyb290ID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChFT2JqZWN0KSgoQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcilyb290KS5nZXRBcHBsaWNhdGlvbigpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwuSUFwcGxpY2F0aW9uUmVzb3VyY2UjZ2V0QXBwbGljYXRpb24oKQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbilnZXRSb290T2JqZWN0KCk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25SZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTgxNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiB7Ci0JCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoQXBwbGljYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHsKLQkJCQlBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcihhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEU6IHsKLQkJCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlKG1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCOiB7Ci0JCQkJV2ViIHdlYiA9IChXZWIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYih3ZWIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViKFdlYiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQXBwbGljYXRpb25Td2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblhNTFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTQ4NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uWE1MUHJvY2Vzc29yKCkgewotCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvblhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0VhclhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9FYXJYTUxIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2JlZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0VhclhNTEhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KRUVYTUxIZWxwZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgRWFyWE1MSGVscGVySW1wbCBleHRlbmRzIEpFRVhNTEhlbHBlckltcGwgewotCi0JcHVibGljIEVhclhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkKLQkJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFFOYW1lKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCkKLQkgIHsKLQkgICBTdHJpbmcgbnNQcmVmaXggPSBnZXRQcmVmaXgoZVBhY2thZ2UsIG11c3RIYXZlUHJlZml4KTsKLQkvLyBOb3QgdXNpbmcgRUU1IHBhY2thZ2UgbmFtZXNwYWNlIC0gZGVmYXVsdCBqZWU1IG5hbWVzcGFjZSBpcyB1c2VkCi0JICAgaWYgKG5zUHJlZml4LmVxdWFscyhBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1BSRUZJWCkpIAotCSAgICB7Ci0JICAgIAlyZXR1cm4gbmFtZTsKLQkgICAgfQotCSAgICBlbHNlIHJldHVybiBzdXBlci5nZXRRTmFtZShlUGFja2FnZSwgbmFtZSwgbXVzdEhhdmVQcmVmaXgpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOWM5YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRDYWxsYmFja0hhbmRsZXIgPGVtPkNhbGxiYWNrIEhhbmRsZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxsYmFjayBIYW5kbGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBjYWxsYmFjay1oYW5kbGVyIGVsZW1lbnQgbmFtZXMgYSBjbGFzcyBwcm92aWRlZCBieQotCSAqIAkgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLQkgKiAJICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLQkgKiAJICAgIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyCi0JICogCSAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0JICogCSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLQkgKiAJICAgIHRvIGNvbGxlY3QgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlci4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FsbGJhY2tIYW5kbGVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDYWxsYmFja0hhbmRsZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0Q2FsbGJhY2tIYW5kbGVyIDxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWxsYmFja0hhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGxiYWNrSGFuZGxlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgKiAJICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAqIAkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgKiAJICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAqIAkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAqIAkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIAkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgKiAJICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgKiAJICBvZiB0aGUgYXBwbGljYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgKiAJICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgKiAJICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAqIAkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0JICogCi0JICogCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iNSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA1LgotCSAqIAotCSAqIAkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZlcnNpb24oKTsKLQotfSAvLyBBcHBsaWNhdGlvbkNsaWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODM4MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0JICogCWFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGUgYXBwbGljYXRpb24KLQkgKiAJY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzCi0JICogCWFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLQkgKiAJY2xpZW50LgotCSAqIAotCSAqICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb25DbGllbnQgPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgdmFsdWUpOwotCi19IC8vIEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uY2xpZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlYmQ0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uY2xpZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgZ2V0QXBwbGljYXRpb25jbGllbnRQYWNrYWdlKCk7Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2NDE4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0lBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWFyCi0JICovCi0JcHVibGljIGFic3RyYWN0IEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMwZThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0QXBwbGljYXRpb25DbGllbnQgPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgewotCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpZ2V0TWl4ZWQoKS5nZXQoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgbmV3QXBwbGljYXRpb25DbGllbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5ULCBuZXdBcHBsaWNhdGlvbkNsaWVudCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgbmV3QXBwbGljYXRpb25DbGllbnQpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5ULCBuZXdBcHBsaWNhdGlvbkNsaWVudCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgotCQkJCXJldHVybiBiYXNpY1NldEFwcGxpY2F0aW9uQ2xpZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVDoKLQkJCQlzZXRBcHBsaWNhdGlvbkNsaWVudCgoQXBwbGljYXRpb25DbGllbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgotCQkJCXNldEFwcGxpY2F0aW9uQ2xpZW50KChBcHBsaWNhdGlvbkNsaWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9DTElFTlQ6Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmI1N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0Q2FsbGJhY2tIYW5kbGVyIDxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ2xpZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdENvbnN0cnVjdHMoKSA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdENvbnN0cnVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGxiYWNrSGFuZGxlcigpIDxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxsYmFja0hhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExCQUNLX0hBTkRMRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsbGJhY2tIYW5kbGVyKCkgPGVtPkNhbGxiYWNrIEhhbmRsZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGxiYWNrSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYWxsYmFja0hhbmRsZXIgPSBDQUxMQkFDS19IQU5ETEVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSA9IE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNZXRhZGF0YSBDb21wbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiNSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnZFbnRyaWVzKCkgewotCQlpZiAoZW52RW50cmllcyA9PSBudWxsKSB7Ci0JCQllbnZFbnRyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudkVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKLQkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKSB7Ci0JCWlmIChwb3N0Q29uc3RydWN0cyA9PSBudWxsKSB7Ci0JCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJfQotCQlyZXR1cm4gcG9zdENvbnN0cnVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7Ci0JCWlmIChwcmVEZXN0cm95cyA9PSBudWxsKSB7Ci0JCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTKTsKLQkJfQotCQlyZXR1cm4gcHJlRGVzdHJveXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCXJldHVybiBjYWxsYmFja0hhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsbGJhY2tIYW5kbGVyKFN0cmluZyBuZXdDYWxsYmFja0hhbmRsZXIpIHsKLQkJU3RyaW5nIG9sZENhbGxiYWNrSGFuZGxlciA9IGNhbGxiYWNrSGFuZGxlcjsKLQkJY2FsbGJhY2tIYW5kbGVyID0gbmV3Q2FsbGJhY2tIYW5kbGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSLCBvbGRDYWxsYmFja0hhbmRsZXIsIGNhbGxiYWNrSGFuZGxlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld01ldGFkYXRhQ29tcGxldGUpIHsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJbWV0YWRhdGFDb21wbGV0ZSA9IG5ld01ldGFkYXRhQ29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBtZXRhZGF0YUNvbXBsZXRlRVNldDsKLQkJbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgbWV0YWRhdGFDb21wbGV0ZSwgIW9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0ID0gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JCW1ldGFkYXRhQ29tcGxldGUgPSBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQkJbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQsIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uLCAhb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZlcnNpb24oKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkJdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OLCBvbGRWZXJzaW9uLCBWRVJTSU9OX0VERUZBVUxULCBvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZ2V0RW52RW50cmllcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJcmV0dXJuIGdldENhbGxiYWNrSGFuZGxlcigpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzTWV0YWRhdGFDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgotCQkJCXNldENhbGxiYWNrSGFuZGxlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgotCQkJCXNldENhbGxiYWNrSGFuZGxlcihDQUxMQkFDS19IQU5ETEVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgotCQkJCXVuc2V0VmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGVudkVudHJpZXMgIT0gbnVsbCAmJiAhZW52RW50cmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VVbml0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gcG9zdENvbnN0cnVjdHMgIT0gbnVsbCAmJiAhcG9zdENvbnN0cnVjdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIHByZURlc3Ryb3lzICE9IG51bGwgJiYgIXByZURlc3Ryb3lzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlyZXR1cm4gQ0FMTEJBQ0tfSEFORExFUl9FREVGQVVMVCA9PSBudWxsID8gY2FsbGJhY2tIYW5kbGVyICE9IG51bGwgOiAhQ0FMTEJBQ0tfSEFORExFUl9FREVGQVVMVC5lcXVhbHMoY2FsbGJhY2tIYW5kbGVyKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2FsbGJhY2tIYW5kbGVyOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNhbGxiYWNrSGFuZGxlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGFkYXRhQ29tcGxldGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXRhZGF0YUNvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChtZXRhZGF0YUNvbXBsZXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmVyc2lvbkVTZXQpIHJlc3VsdC5hcHBlbmQodmVyc2lvbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uQ2xpZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ4NGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkgdGhlQXBwbGljYXRpb25jbGllbnRGYWN0b3J5ID0gKEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlQXBwbGljYXRpb25jbGllbnRGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQXBwbGljYXRpb25jbGllbnRGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50SW1wbCBhcHBsaWNhdGlvbkNsaWVudCA9IG5ldyBBcHBsaWNhdGlvbkNsaWVudEltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBnZXRBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkYmQ2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC5uYW1lc3BhY2UuWE1MTmFtZXNwYWNlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhdGlvbkNsaWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1BlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IGdldEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0lDT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTik7Ci0KLQkJYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJSmF2YWVlUGFja2FnZSB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAiQXBwbGljYXRpb25DbGllbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJjYWxsYmFja0hhbmRsZXIiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpLCAidmVyc2lvbiIsICI1IiwgMSwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb25DbGllbnQoKSwgdGhpcy5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLCBudWxsLCAiYXBwbGljYXRpb25DbGllbnQiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1jb25zdHJ1Y3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLWRlc3Ryb3kiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjYWxsYmFjay1oYW5kbGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRhZGF0YS1jb21wbGV0ZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAibWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudFdpbGRjYXJkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiOm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uQ2xpZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhcHBsaWNhdGlvbi1jbGllbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2M2NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25jbGllbnRGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgQCgjKWFwcGxpY2F0aW9uLWNsaWVudF81LnhzZHMJMS4yNiAwMi8xNy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIAotICogCi0gKiAJVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCA1Ci0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0Ci0gKiAJYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotICogCWFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotICogCWRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24KLSAqIAljbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCi0gKiAJYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAqIAl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICogCi0gKiAJICAgICZsdDthcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAqIAkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICogCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAJCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiCi0gKiAJICAgICAgdmVyc2lvbj0iNSImZ3Q7Ci0gKiAJICAgICAgLi4uCi0gKiAJICAgICZsdDsvYXBwbGljYXRpb24tY2xpZW50Jmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICogCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkCi0gKiAKLSAqIAkKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gKiAKLSAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAqIAlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICogCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICogCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gKiAJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gKiAJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25jbGllbnRGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImFwcGxpY2F0aW9uY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJhcHBsaWNhdGlvbmNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsbGJhY2sgSGFuZGxlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0lEID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiA9IDE2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RW52RW50cmllcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0VudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RWpiUmVmcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBEZXN0cm95czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UHJlRGVzdHJveXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldENhbGxiYWNrSGFuZGxlciA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGxiYWNrIEhhbmRsZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldENhbGxiYWNrSGFuZGxlcigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb25DbGllbnQgPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IGdldEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FUSU9OX0NMSUVOVCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0lDT05TID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ByZURlc3Ryb3lzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWxsYmFjayBIYW5kbGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9DTElFTlRfX0lEID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBDbGllbnRYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwQ2xpZW50WE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjcxYzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBDbGllbnRYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudFhNTEhlbHBlckltcGwgZXh0ZW5kcyBKRUVYTUxIZWxwZXJJbXBsIHsKLQotCXB1YmxpYyBBcHBDbGllbnRYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JCi0JcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCi0JCQlyZXR1cm4gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRVUkkocHJlZml4KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRRTmFtZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXgpCi0JICB7Ci0JICAgU3RyaW5nIG5zUHJlZml4ID0gZ2V0UHJlZml4KGVQYWNrYWdlLCBtdXN0SGF2ZVByZWZpeCk7Ci0JICAgLy8gTm90IHVzaW5nIEVFNSBwYWNrYWdlIG5hbWVzcGFjZSAtIGRlZmF1bHQgamVlNSBuYW1lc3BhY2UgaXMgdXNlZAotCSAgIGlmIChuc1ByZWZpeC5lcXVhbHMoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19QUkVGSVgpKSAKLQkgICAgewotCSAgICAJcmV0dXJuIG5hbWU7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0UU5hbWUoZVBhY2thZ2UsIG5hbWUsIG11c3RIYXZlUHJlZml4KTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2RmNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbmNsaWVudFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBBcHBsaWNhdGlvbmNsaWVudFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzNjQ2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTE9wdGlvbnNJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlYTUxPcHRpb25zIHhtbE9wdGlvbnMgPSBuZXcgWE1MT3B0aW9uc0ltcGwoKTsKLQotCQl4bWxPcHRpb25zLnNldFByb2Nlc3NTY2hlbWFMb2NhdGlvbnModHJ1ZSk7Ci0JCSAgICAKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fWE1MX09QVElPTlMsIHhtbE9wdGlvbnMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjZjRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkpFRVhNTExvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JUm9vdE9iamVjdFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsLkFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwgZXh0ZW5kcyBKYXZhZWVSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJUm9vdE9iamVjdFJlc291cmNlLCBJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZXsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFwcENsaWVudFhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSNnZXRSb290T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJvb3QgPSBnZXRDb250ZW50cygpLmdldCgwKTsKLQkJaWYocm9vdCA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoRU9iamVjdCkoKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsLklBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpZ2V0Um9vdE9iamVjdCgpOwotCQkKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlZjRjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnQgYXBwbGljYXRpb25DbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50KGFwcGxpY2F0aW9uQ2xpZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yID0gKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uY2xpZW50U3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg0MWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgWE1MIGRvY3VtZW50cwotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBBcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmMyZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotICogCXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotICogCXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLSAqIAlEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0gKiAJdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAlEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi0gKiAJdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotICogCXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLSAqIAljb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0gKiAKLSAqIAlUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAqIAlkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREZXNjcmlwdGlvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREZXNjcmlwdGlvbl9WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0JICogICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCi0JICogICAgICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICBTZWUKLQkgKiAgICAgICAgICBSRkMgMzA2NiBhdCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCBhbmQgdGhlIElBTkEgcmVnaXN0cnkKLQkgKiAgICAgICAgICBhdCBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmctdGFnLWFwcHMuaHRtIGZvcgotCSAqICAgICAgICAgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0JICogCi0JICogICAgICAgICAgVGhlIHVuaW9uIGFsbG93cyBmb3IgdGhlICd1bi1kZWNsYXJhdGlvbicgb2YgeG1sOmxhbmcgd2l0aAotCSAqICAgICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fTGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRGlzcGxheU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyOTYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRGlzcGxheU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotICogCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotICogCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgLi4uCi0gKiAJICAgICAmbHQ7ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiImZ3Q7Ci0gKiAJICAgICAgIEVtcGxveWVlIFNlbGYgU2VydmljZQotICogCSAgICAgJmx0Oy9kaXNwbGF5LW5hbWUmZ3Q7Ci0gKiAKLSAqIAkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERpc3BsYXlOYW1lKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlOYW1lIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERpc3BsYXlOYW1lX1ZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlIHJlbGV2YW50IElTTyAyLSBhbmQgMy1sZXR0ZXIKLQkgKiAgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgaXMgcHJvYmFibHkgbmV2ZXIKLQkgKiAgICAgICAgICBnb2luZyB0byBiZSBhIHJlYWxpc3RpYyBwb3NzaWJpbGl0eS4gIFNlZQotCSAqICAgICAgICAgIFJGQyAzMDY2IGF0IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMwNjYudHh0IGFuZCB0aGUgSUFOQSByZWdpc3RyeQotCSAqICAgICAgICAgIGF0IGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZy10YWctYXBwcy5odG0gZm9yCi0JICogICAgICAgICAgZnVydGhlciBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiAgICAgICAgICBUaGUgdW5pb24gYWxsb3dzIGZvciB0aGUgJ3VuLWRlY2xhcmF0aW9uJyBvZiB4bWw6bGFuZyB3aXRoCi0JICogICAgICAgICAgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFuZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREaXNwbGF5TmFtZV9MYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGlzcGxheU5hbWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJMb2NhbFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZiZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJMb2NhbFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FamIgTG9jYWwgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvcgotICogCXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotICogCWhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICogICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotICogCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gKiAgICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZQotICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAqICAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1sb2NhbC1yZWYgcmVmZXJzCi0gKiAgICAgICAgICAgICAgIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAqIAkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICogCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAgICAgICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAqICAgICAgICAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVqYkxvY2FsUmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiUmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYlJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiUmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkVudGl0eSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkgKiBAc2VlICNpc1NldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYlJlZlR5cGUgZ2V0RWpiUmVmVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWpiUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3NldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWxIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0xvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbEhvbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxIb21lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0xvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYkxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfRWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVqYkxvY2FsUmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDEzZDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWpiIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0gKiAJZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBvcgotICogICAgICAgICB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICogCVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0gKiAJICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotICogCSAgICAgIGJlYW4uCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAgICAgICAgICAgICAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICogICAgICAgICAgICAgICBvciB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi0gKiAgICAgICAgICAgICAgIGJlYW4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAqICAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiAgTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItcmVmCi0gKiAgICAgICAgICAgICAgIHJlZmVycyB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICogCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gKiAJICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAqICAgICAgICAgICAgIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZQotICogICAgICAgICAgICAgICBiZWFuIGludG8gYSBjb21wb25lbnQgZmllbGQgb3IgcHJvcGVydHkKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiUmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYlJlZk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0VqYlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiUmVmTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiUmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkVudGl0eSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkgKiBAc2VlICNpc1NldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJSZWZUeXBlIGdldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkgKiBAc2VlICNpc1NldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWpiUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0hvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG9tZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRIb21lIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb21lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbW90ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfUmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlbW90ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbW90ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9FamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYkxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRWpiUmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDdlODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotICogCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogCi0gKiAJVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLSAqIAl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgRW50aXR5Ci0gKiAJICAgIFNlc3Npb24KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZlR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWpiUmVmVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU5USVRZX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFkgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVNTSU9OX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFTlRJVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVqYlJlZlR5cGUgRU5USVRZX0xJVEVSQUwgPSBuZXcgRWpiUmVmVHlwZShFTlRJVFksICJFbnRpdHkiLCAiRW50aXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVNTSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFNFU1NJT05fTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKFNFU1NJT04sICJTZXNzaW9uIiwgIlNlc3Npb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVqYlJlZlR5cGVbXSB7Ci0JCQlFTlRJVFlfTElURVJBTCwKLQkJCVNFU1NJT05fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlJlZlR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFamJSZWZUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUmVmVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVqYlJlZlR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlJlZlR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEVOVElUWTogcmV0dXJuIEVOVElUWV9MSVRFUkFMOwotCQkJY2FzZSBTRVNTSU9OOiByZXR1cm4gU0VTU0lPTl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFamJSZWZUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9FamJSZWZUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW1wdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW1wdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTcyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VtcHR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtcHR5IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotICogCWVsZW1lbnQgd2hlbiB1c2VkLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW1wdHlUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtcHR5VHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbXB0eVR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRW1wdHlUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW52RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxNTY4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW52RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW52IEVudHJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotICogCWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLSAqIAlkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhIHR5cGUKLSAqIAkob3B0aW9uYWwgaWYgdGhlIHZhbHVlIGlzIGluamVjdGVkLCBvdGhlcndpc2UgcmVxdWlyZWQpLCBhbmQKLSAqIAlhbiBvcHRpb25hbCB2YWx1ZS4KLSAqIAotICogCUl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICogCXRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIAotICogCUlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKLSAqIAlubyBpbmplY3Rpb24gd2lsbCBvY2N1ciBhbmQgbm8gZW50cnkgb2YgdGhlIHNwZWNpZmllZCBuYW1lCi0gKiAJd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgYW4gaW5pdGlhbCB2YWx1ZSB0byBiZQotICogCXNwZWNpZmllZCBpbiB0aGUgc291cmNlIGNvZGUgd2l0aG91dCBiZWluZyBpbmNvcnJlY3RseQotICogCWNoYW5nZWQgd2hlbiBubyBvdmVycmlkZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gKiAKLSAqIAlJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIG5vIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0gKiAJYSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotICogCi0gKiAJVGhpcyB0eXBlIGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeU5hbWUgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VmFsdWUgPGVtPkVudiBFbnRyeSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudkVudHJ5IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICogCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZQotCSAqIAkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAqIAkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKLQkgKiAJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzCi0JICogCSAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0JICogCSAgICAgIGNvbnRleHQuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtlbnYtZW50cnktbmFtZSZndDttaW5BbW91bnQmbHQ7L2Vudi1lbnRyeS1uYW1lJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVudkVudHJ5TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9FbnZFbnRyeU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RW52RW50cnlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlOYW1lIDxlbT5FbnYgRW50cnkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudkVudHJ5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW52RW50cnlOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJqYXZhLmxhbmcuQm9vbGVhbiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIEphdmEgbGFuZ3VhZ2UKLQkgKiAJICAgICAgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkuICBJZiBhbiBpbmplY3Rpb24gdGFyZ2V0Ci0JICogCSAgICAgIGlzIHNwZWNpZmllZCBmb3IgdGhlIGVudmlyb25tZW50IGVudHJ5LCB0aGUgdHlwZSBtYXkKLQkgKiAJICAgICAgYmUgb21pdHRlZCwgb3IgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICogCSAgICAgIHRhcmdldC4gIElmIG5vIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAqIAkgICAgICBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJICAgICAgJmx0O2Vudi1lbnRyeS10eXBlJmd0O2phdmEubGFuZy5JbnRlZ2VyJmx0Oy9lbnYtZW50cnktdHlwZSZndDsKLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAc2VlICNpc1NldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI3NldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnZFbnRyeVR5cGUgZ2V0RW52RW50cnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQotCSAqIEBzZWUgI2lzU2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI3NldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFbnZFbnRyeVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgKiAJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0JICogCSAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0JICogCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgKiAJICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotCSAqIAkgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtlbnYtZW50cnktdmFsdWUmZ3Q7MTAwLjAwJmx0Oy9lbnYtZW50cnktdmFsdWUmZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVudkVudHJ5VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfRW52RW50cnlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFbnZFbnRyeVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlWYWx1ZSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudkVudHJ5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudkVudHJ5VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5X01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRW52RW50cnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW52RW50cnlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW52RW50cnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWYyNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLSAqIAkgIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlCi0gKiAJICBhcHBsaWNhdGlvbidzIGNvZGUuCi0gKiAKLSAqIAkgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZToKLSAqIAotICogCSAgICAgIGphdmEubGFuZy5Cb29sZWFuCi0gKiAJICAgICAgamF2YS5sYW5nLkJ5dGUKLSAqIAkgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gKiAJICAgICAgamF2YS5sYW5nLlN0cmluZwotICogCSAgICAgIGphdmEubGFuZy5TaG9ydAotICogCSAgICAgIGphdmEubGFuZy5JbnRlZ2VyCi0gKiAJICAgICAgamF2YS5sYW5nLkxvbmcKLSAqIAkgICAgICBqYXZhLmxhbmcuRmxvYXQKLSAqIAkgICAgICBqYXZhLmxhbmcuRG91YmxlCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDtlbnYtZW50cnktdHlwZSZndDtqYXZhLmxhbmcuQm9vbGVhbiZsdDsvZW52LWVudHJ5LXR5cGUmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5VHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZFbnRyeVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBCb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgQm9vbGVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX0JPT0xFQU4gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEJ5dGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBCeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19CWVRFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfQllURSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQ2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgQ2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19DSEFSQUNURVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19DSEFSQUNURVIgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIFN0cmluZzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIFN0cmluZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfU1RSSU5HX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfU1RSSU5HID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBTaG9ydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIFNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19TSE9SVF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX1NIT1JUID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBJbnRlZ2VyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgSW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfSU5URUdFUl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX0lOVEVHRVIgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIExvbmc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBMb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19MT05HX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfTE9ORyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBGbG9hdDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfRkxPQVRfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19GTE9BVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRG91YmxlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgRG91YmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19ET1VCTEVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19ET1VCTEUgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEJvb2xlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0JPT0xFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfQk9PTEVBTiwgImphdmFMYW5nQm9vbGVhbiIsICJqYXZhLmxhbmcuQm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBCeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19CWVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0JZVEVfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX0JZVEUsICJqYXZhTGFuZ0J5dGUiLCAiamF2YS5sYW5nLkJ5dGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQ2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19DSEFSQUNURVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfQ0hBUkFDVEVSX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19DSEFSQUNURVIsICJqYXZhTGFuZ0NoYXJhY3RlciIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIFN0cmluZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfU1RSSU5HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX1NUUklOR19MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfU1RSSU5HLCAiamF2YUxhbmdTdHJpbmciLCAiamF2YS5sYW5nLlN0cmluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBTaG9ydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfU0hPUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfU0hPUlRfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX1NIT1JULCAiamF2YUxhbmdTaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgSW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfSU5URUdFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEpBVkFfTEFOR19JTlRFR0VSX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19JTlRFR0VSLCAiamF2YUxhbmdJbnRlZ2VyIiwgImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIExvbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0xPTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfTE9OR19MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfTE9ORywgImphdmFMYW5nTG9uZyIsICJqYXZhLmxhbmcuTG9uZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBGbG9hdDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfRkxPQVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfRkxPQVRfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX0ZMT0FULCAiamF2YUxhbmdGbG9hdCIsICJqYXZhLmxhbmcuRmxvYXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRG91YmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19ET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfRE9VQkxFX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19ET1VCTEUsICJqYXZhTGFuZ0RvdWJsZSIsICJqYXZhLmxhbmcuRG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRW52RW50cnlUeXBlW10gewotCQkJSkFWQV9MQU5HX0JPT0xFQU5fTElURVJBTCwKLQkJCUpBVkFfTEFOR19CWVRFX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfQ0hBUkFDVEVSX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfU1RSSU5HX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfU0hPUlRfTElURVJBTCwKLQkJCUpBVkFfTEFOR19JTlRFR0VSX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfTE9OR19MSVRFUkFMLAotCQkJSkFWQV9MQU5HX0ZMT0FUX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfRE9VQkxFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW52RW50cnlUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRW52RW50cnlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZFbnRyeVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFbnZFbnRyeVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW52RW50cnlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBKQVZBX0xBTkdfQk9PTEVBTjogcmV0dXJuIEpBVkFfTEFOR19CT09MRUFOX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19CWVRFOiByZXR1cm4gSkFWQV9MQU5HX0JZVEVfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX0NIQVJBQ1RFUjogcmV0dXJuIEpBVkFfTEFOR19DSEFSQUNURVJfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX1NUUklORzogcmV0dXJuIEpBVkFfTEFOR19TVFJJTkdfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX1NIT1JUOiByZXR1cm4gSkFWQV9MQU5HX1NIT1JUX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19JTlRFR0VSOiByZXR1cm4gSkFWQV9MQU5HX0lOVEVHRVJfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX0xPTkc6IHJldHVybiBKQVZBX0xBTkdfTE9OR19MSVRFUkFMOwotCQkJY2FzZSBKQVZBX0xBTkdfRkxPQVQ6IHJldHVybiBKQVZBX0xBTkdfRkxPQVRfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX0RPVUJMRTogcmV0dXJuIEpBVkFfTEFOR19ET1VCTEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRW52RW50cnlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9FbnZFbnRyeVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JY29uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ5ZmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkljb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotICogCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiwgSlBFRywKLSAqIAlvciBQTkcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLSAqIAlHVUkgdG9vbC4KLSAqIAotICogCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAqIAlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLSAqIAlieSBkZWZhdWx0LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJY29uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEljb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICogCSAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLQkgKiAJICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0JICogCSAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAJICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAqIAkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJICAgICAgJmx0O3NtYWxsLWljb24mZ3Q7ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnJmx0Oy9zbWFsbC1pY29uJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U21hbGxJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEljb25fU21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgKiAJICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICogCSAgICAgICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUKLQkgKiAJICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotCSAqIAkgICAgICBGaWxlLgotCSAqIAotCSAqIAkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICogCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCSAqIAotCSAqIAkgICAgICBFeGFtcGxlOgotCSAqIAotCSAqIAkgICAgICAmbHQ7bGFyZ2UtaWNvbiZndDtlbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGcmbHQ7L2xhcmdlLWljb24mZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXJnZUljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0SWNvbl9MYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEljb25fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0JICogICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCi0JICogICAgICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICBTZWUKLQkgKiAgICAgICAgICBSRkMgMzA2NiBhdCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCBhbmQgdGhlIElBTkEgcmVnaXN0cnkKLQkgKiAgICAgICAgICBhdCBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmctdGFnLWFwcHMuaHRtIGZvcgotCSAqICAgICAgICAgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0JICogCi0JICogICAgICAgICAgVGhlIHVuaW9uIGFsbG93cyBmb3IgdGhlICd1bi1kZWNsYXJhdGlvbicgb2YgeG1sOmxhbmcgd2l0aAotCSAqICAgICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0SWNvbl9MYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJY29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0luamVjdGlvblRhcmdldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0luamVjdGlvblRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2RlYzQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JbmplY3Rpb25UYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJQW4gaW5qZWN0aW9uIHRhcmdldCBzcGVjaWZpZXMgYSBjbGFzcyBhbmQgYSBuYW1lIHdpdGhpbgotICogCXRoYXQgY2xhc3MgaW50byB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBpbmplY3RlZC4KLSAqIAotICogCVRoZSBpbmplY3Rpb24gdGFyZ2V0IGNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gKiAJY2xhc3MgbmFtZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluamVjdGlvbi4gIFRoZQotICogCUphdmEgRUUgc3BlY2lmaWNhdGlvbnMgZGVzY3JpYmUgd2hpY2ggY2xhc3NlcyBjYW4gYmUgYW4KLSAqIAlpbmplY3Rpb24gdGFyZ2V0LgotICogCi0gKiAJVGhlIGluamVjdGlvbiB0YXJnZXQgbmFtZSBzcGVjaWZpZXMgdGhlIHRhcmdldCB3aXRoaW4KLSAqIAl0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHRhcmdldCBpcyBmaXJzdCBsb29rZWQgZm9yIGFzIGEKLSAqIAlKYXZhQmVhbnMgcHJvcGVydHkgbmFtZS4gIElmIG5vdCBmb3VuZCwgdGhlIHRhcmdldCBpcwotICogCWxvb2tlZCBmb3IgYXMgYSBmaWVsZCBuYW1lLgotICogCi0gKiAJVGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHRhcmdldAotICogCWR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgYnkgZWl0aGVyIGNhbGxpbmcgdGhlCi0gKiAJc2V0IG1ldGhvZCBmb3IgdGhlIHRhcmdldCBwcm9wZXJ0eSBvciBieSBzZXR0aW5nIGEgdmFsdWUKLSAqIAlpbnRvIHRoZSBuYW1lZCBmaWVsZC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcyA8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXROYW1lIDxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEluamVjdGlvblRhcmdldCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbmplY3Rpb25UYXJnZXQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEluamVjdGlvblRhcmdldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0I2dldEluamVjdGlvblRhcmdldENsYXNzIDxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbmplY3Rpb25UYXJnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0I2dldEluamVjdGlvblRhcmdldE5hbWUgPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmplY3Rpb25UYXJnZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5qZWN0aW9uVGFyZ2V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0pFRVNBWFhNTEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVTQVhYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzFkNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0pFRVNBWFhNTEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYWE1JSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEpFRVNBWFhNTEhhbmRsZXIgZXh0ZW5kcyBTQVhYTUlIYW5kbGVyIHsKLQotCXB1YmxpYyBKRUVTQVhYTUxIYW5kbGVyKFhNTFJlc291cmNlIHhtaVJlc291cmNlLCBYTUxIZWxwZXIgaGVscGVyLAotCQkJTWFwPD8sID8+IG9wdGlvbnMpIHsKLQkJc3VwZXIoeG1pUmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRQYWNrYWdlRm9yVVJJKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRVBhY2thZ2UgZGVmUGFja2FnZTsKLQkJLy8gR3JhYiB0aGUgc2NoZW1hIGxvY2F0aW9uIGJlY2F1c2UgYWxsIEpFRSBERCBmaWxlcyBzaGFyZSBhIGNvbW1vbiBuYW1lc3BhY2UKLQkJaWYgKHVyaXNUb0xvY2F0aW9ucyA9PSBudWxsKSB7Ly91cmlNYXAgbm90IGluaXRpYWxpemVkIHlldAotCQkJZGVmUGFja2FnZSA9IHN1cGVyLmdldFBhY2thZ2VGb3JVUkkodXJpU3RyaW5nKTsKLQkJCWlmICh1cmlzVG9Mb2NhdGlvbnMgPT0gbnVsbCkvLyBpZiBzdGlsbCBub3QgaW5pdGlhbGl6ZWQuLiB0aGVuIGp1c3QgcmV0dXJuIGRlZlBhY2thZ2UKLQkJCQlyZXR1cm4gZGVmUGFja2FnZTsKLQkJfQotCQlVUkkgdXJpID0gdXJpc1RvTG9jYXRpb25zLmdldCh1cmlTdHJpbmcpOwotCQlTdHJpbmcgbG9jU3RyaW5nID0gKHVyaSA9PSBudWxsKSA/IHVyaVN0cmluZyA6IHVyaS50b1N0cmluZygpOwotCQlFUGFja2FnZSBlUGFja2FnZSA9IHBhY2thZ2VSZWdpc3RyeS5nZXRFUGFja2FnZShsb2NTdHJpbmcpOwotCQlpZiAoZVBhY2thZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5nZXRQYWNrYWdlRm9yVVJJKGxvY1N0cmluZyk7Ci0JCWVsc2UgcmV0dXJuIGVQYWNrYWdlOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0pFRVhNTExvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjBiNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0pFRVhNTExvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTExvYWRJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBKRUVYTUxMb2FkSW1wbCBleHRlbmRzIFhNTExvYWRJbXBsIHsKLQotCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCQotCQkgcmV0dXJuIG5ldyBKRUVTQVhYTUxIYW5kbGVyKHJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBKRUVYTUxMb2FkSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSmF2YUVFT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSmF2YUVFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDBjN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFFRU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotcHVibGljIGludGVyZmFjZSBKYXZhRUVPYmplY3QgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSmF2YWVlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFlZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZDJjMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFlZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFlZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhZWVGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzcGxheU5hbWUgY3JlYXRlRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiTG9jYWxSZWYgY3JlYXRlRWpiTG9jYWxSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUmVmIGNyZWF0ZUVqYlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbXB0eVR5cGUgY3JlYXRlRW1wdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnZFbnRyeSBjcmVhdGVFbnZFbnRyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JY29uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JY29uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJY29uIGNyZWF0ZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5qZWN0aW9uVGFyZ2V0IGNyZWF0ZUluamVjdGlvblRhcmdldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlmZWN5Y2xlQ2FsbGJhY2sgY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZURlc3RpbmF0aW9uUmVmIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhcmFtVmFsdWUgY3JlYXRlUGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBlcnNpc3RlbmNlQ29udGV4dFJlZiBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXRSZWYgY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHlUeXBlIGNyZWF0ZVByb3BlcnR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZUVudlJlZiBjcmVhdGVSZXNvdXJjZUVudlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2VSZWYgY3JlYXRlUmVzb3VyY2VSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SdW4gQXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJ1bkFzIGNyZWF0ZVJ1bkFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3VyaXR5Um9sZSBjcmVhdGVTZWN1cml0eVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eVJvbGVSZWYgY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmljZVJlZiBjcmVhdGVTZXJ2aWNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWZIYW5kbGVyIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVybFBhdHRlcm5UeXBlIGNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFlZVBhY2thZ2UgZ2V0SmF2YWVlUGFja2FnZSgpOwotCi19IC8vSmF2YWVlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpZmVjeWNsZUNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlmZWN5Y2xlQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NGZlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlmZWN5Y2xlQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBsaWZlY3ljbGUtY2FsbGJhY2sgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotICogCWNsYXNzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbGlmZWN5Y2xlIGV2ZW50IG9jY3Vycy4KLSAqIAlOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sKLSAqICAgICAgICAgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90Ci0gKiAJYmUgb3ZlcmxvYWRlZC4KLSAqIAotICogICAgICAgICBJZiB0aGUgbGlmZWZ5Y2xlLWNhbGxiYWNrLWNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gKiAgICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAqICAgICAgICAgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZSBwbGFjZSBpbiB0aGUgZGVzY3JpcHRvcgotICogICAgICAgICBpbiB3aGljaCB0aGUgY2FsbGJhY2sgZGVmaW5pdGlvbiBhcHBlYXJzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpZmVjeWNsZUNhbGxiYWNrKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpZmVjeWNsZUNhbGxiYWNrIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayNnZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTGlmZWN5Y2xlQ2FsbGJhY2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIzNWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaXN0ZW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLSAqIAlhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRMaXN0ZW5lckNsYXNzIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlzdGVuZXIoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaXN0ZW5lcl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3RlbmVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlCi0JICogCSAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLQkgKiAJICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLQkgKiAJICAgIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlzdGVuZXJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExpc3RlbmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRMaXN0ZW5lckNsYXNzIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpc3RlbmVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpc3RlbmVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlzdGVuZXJfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBMaXN0ZW5lcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1NzA5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLSAqIAkgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotICogCSAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0gKiAKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGljb24KLSAqIAkJICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0gKiAJCSAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotICogCQkgICAgRGVwbG95bWVudCBGaWxlLgotICogCQkgIC0gYW4gb3B0aW9uYWwgbWFwcGVkIG5hbWUKLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24mZ3Q7Ci0gKiAJCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSZndDtDb3Jwb3JhdGVTdG9ja3MKLSAqIAkJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSZndDsKLSAqIAkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbiZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEZXN0aW5hdGlvbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotCSAqIAkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLQkgKiAJICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgbWVzc2FnZSBkZXN0aW5hdGlvbnMKLQkgKiAJICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICogCSAgICAgIHNob3VsZCBiZSBtYXBwZWQgdG8uICBFYWNoIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmCi0JICogCSAgICAgIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbiB3aWxsCi0JICogCSAgICAgIGRlZmluZSBhIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcKLQkgKiAJICAgICAgY29tcG9uZW50LiAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYKLQkgKiAJICAgICAgbmFtZXNwYWNlLikgIE1hbnkgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvCi0JICogCSAgICAgIG1hcCB0aGVzZSBsb2NhbCBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlCi0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwKLQkgKiAJICAgICAgSk5ESSBuYW1lLCBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4gIEVhY2ggb2YgdGhlCi0JICogCSAgICAgIGxvY2FsIG5hbWVzIHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBzYW1lIGdsb2JhbCBuYW1lLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWVzc2FnZURlc3RpbmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIwZjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0gKiAJICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gKiAJICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotICogCQkgIC0gYW4gb3B0aW9uYWwgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLSAqIAkJICAgIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotICogCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aC4KLSAqIAkJICAgIGlmIG5vdCBzcGVjaWZpZWQsICJib3RoIiBpcyBhc3N1bWVkLgotICogCQkgIC0gYW4gb3B0aW9uYWwgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLSAqIAotICogCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotICogCSAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLSAqIAkgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKLSAqIAkgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotICogCSAgdGFyZ2V0LgotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tcmVmJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lJmd0O2ptcy9TdG9ja1F1ZXVlCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUmZ3Q7amF2YXguam1zLlF1ZXVlCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUmZ3Q7Ci0gKiAJCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UmZ3Q7Q29uc3VtZXMKLSAqIAkJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UmZ3Q7Ci0gKiAJCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbGluayZndDtDb3Jwb3JhdGVTdG9ja3MKLSAqIAkJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbGluayZndDsKLSAqIAkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICogCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgKiAJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgKiAJICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAqIAkgICAgdW5pcXVlIHdpdGhpbiBhbiBlamItamFyIChmb3IgZW50ZXJwcmlzZSBiZWFucykgb3IgYQotCSAqIAkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkNvbnN1bWVzIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgI2lzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI3Vuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQHNlZSAjaXNTZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQHNlZSAjdW5zZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VEZXN0aW5hdGlvblJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjMDYzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0gKiAJbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotICogCWluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0gKiAJZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLSAqIAlBc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLSAqIAlvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLSAqIAotICogCVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLSAqIAlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAkgICAgQ29uc3VtZXMKLSAqIAkgICAgUHJvZHVjZXMKLSAqIAkgICAgQ29uc3VtZXNQcm9kdWNlcwotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVU1FUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Qcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPRFVDRVNfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0RVQ0VTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzIFByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lcyBQcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVNfUFJPRFVDRVMgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FUywgIkNvbnN1bWVzIiwgIkNvbnN1bWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPRFVDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBQUk9EVUNFU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShQUk9EVUNFUywgIlByb2R1Y2VzIiwgIlByb2R1Y2VzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfUFJPRFVDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FU19QUk9EVUNFUywgIkNvbnN1bWVzUHJvZHVjZXMiLCAiQ29uc3VtZXNQcm9kdWNlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVbXSB7Ci0JCQlDT05TVU1FU19MSVRFUkFMLAotCQkJUFJPRFVDRVNfTElURVJBTCwKLQkJCUNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09OU1VNRVM6IHJldHVybiBDT05TVU1FU19MSVRFUkFMOwotCQkJY2FzZSBQUk9EVUNFUzogcmV0dXJuIFBST0RVQ0VTX0xJVEVSQUw7Ci0JCQljYXNlIENPTlNVTUVTX1BST0RVQ0VTOiByZXR1cm4gQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QYXJhbVZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGFyYW1WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA4YTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QYXJhbVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gKiAJcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRQYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQYXJhbVZhbHVlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtVmFsdWUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgcGFyYW1ldGVyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9QYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRQYXJhbU5hbWUgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotCSAqIAkgICAgcGFyYW1ldGVyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1WYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQYXJhbVZhbHVlX1BhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBhcmFtVmFsdWVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFBhcmFtVmFsdWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjgyMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGUgcGVyc2lzdGVuY2UtY29udGV4dC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gKiAJICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIHBlcnNpc3RlbmNlIGNvbnRleHQKLSAqIAkgIGFzc29jaWF0ZWQgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQncwotICogCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCQkgIC0gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlIG5hbWUKLSAqIAkJICAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQgbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4KLSAqIAkJICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlcgotICogCQkgICAgdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgdHlwZSBpcyBUcmFuc2FjdGlvbiBvcgotICogCQkgICAgRXh0ZW5kZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBUcmFuc2FjdGlvbiBpcyBhc3N1bWVkLgotICogICAgICAgICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHBlcnNpc3RlbmNlIHByb3BlcnRpZXMKLSAqIAkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gKiAKLSAqIAkgIEV4YW1wbGVzOgotICogCi0gKiAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC1yZWYmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lJmd0O215UGVyc2lzdGVuY2VDb250ZXh0Ci0gKiAgICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSZndDsKLSAqICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYmZ3Q7Ci0gKiAKLSAqICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiZndDsKLSAqICAgICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUmZ3Q7bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS11bml0LW5hbWUmZ3Q7UGVyc2lzdGVuY2VVbml0MQotICogICAgICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtdW5pdC1uYW1lJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC10eXBlJmd0O0V4dGVuZGVkJmx0Oy9wZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlUHJvcGVydGllcyA8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZUNvbnRleHRSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgKiAJICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2U7IGl0cwotCSAqIAkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAqIAkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICogCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKLQkgKiAgICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotCSAqICAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0JICogCi0JICogICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotCSAqICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCi0JICogICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0JICogICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLQkgKiAgICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZQotCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iVHJhbnNhY3Rpb24iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlCi0JICogQHNlZSAjaXNTZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlCi0JICogQHNlZSAjaXNTZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZShQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHByb3BlcnRpZXMgZm9yIHRoZSBjb250YWluZXIgb3IgcGVyc2lzdGVuY2UKLQkgKiAgICAgICAgICAgICBwcm92aWRlci4gIFZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzIG1heSBiZSBpbmNsdWRlZCBpbgotCSAqICAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcy4gIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQKLQkgKiAgICAgICAgICAgICBieSBhIHZlbmRvciBtdXN0IGJlIGlnbm9yZWQuICBFbnRyaWVzIHRoYXQgbWFrZSB1c2Ugb2YgdGhlCi0JICogICAgICAgICAgICAgbmFtZXNwYWNlIGphdmF4LnBlcnNpc3RlbmNlIGFuZCBpdHMgc3VibmFtZXNwYWNlcyBtdXN0IG5vdAotCSAqICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAgVGhlIG5hbWVzcGFjZQotCSAqICAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQZXJzaXN0ZW5jZUNvbnRleHRSZWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhMzgwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0cmFuc2FjdGlvbmFsCi0gKiAJbmF0dXJlIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2UuCi0gKiAKLSAqIAlUaGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSBlbGVtZW50IG11c3QgYmUKLSAqIAlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAkgICAgVHJhbnNhY3Rpb24KLSAqICAgICAgICAgICAgIEV4dGVuZGVkCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFOU0FDVElPTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT04gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kZWQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZGVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVOREVEX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRFRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBUUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoVFJBTlNBQ1RJT04sICJUcmFuc2FjdGlvbiIsICJUcmFuc2FjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZGVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVOREVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIEVYVEVOREVEX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VDb250ZXh0VHlwZShFWFRFTkRFRCwgIkV4dGVuZGVkIiwgIkV4dGVuZGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlW10gewotCQkJVFJBTlNBQ1RJT05fTElURVJBTCwKLQkJCUVYVEVOREVEX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUGVyc2lzdGVuY2VDb250ZXh0VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBUUkFOU0FDVElPTjogcmV0dXJuIFRSQU5TQUNUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIEVYVEVOREVEOiByZXR1cm4gRVhURU5ERURfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGVyc2lzdGVuY2VDb250ZXh0VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUGVyc2lzdGVuY2VDb250ZXh0VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlVW5pdFJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlVW5pdFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDU3ZDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZVVuaXRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSB1bml0Ci0gKiAJICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIAotICogCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkJICAtIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZSBuYW1lCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICogICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0gKiAJCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSZndDtteVBlcnNpc3RlbmNlVW5pdAotICogICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogCi0gKiAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1yZWYmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lJmd0O215UGVyc2lzdGVuY2VVbml0Ci0gKiAgICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1uYW1lJmd0O1BlcnNpc3RlbmNlVW5pdDEKLSAqICAgICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtbmFtZSZndDsKLSAqICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtdW5pdC1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdFJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVVuaXRSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgKiAJICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2U7IGl0cwotCSAqIAkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAqIAkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICogCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKLQkgKiAgICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotCSAqICAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0JICogCi0JICogICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotCSAqICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCi0JICogICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0JICogICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLQkgKiAgICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZQotCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUGVyc2lzdGVuY2VVbml0UmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BvcnRDb21wb25lbnRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qb3J0Q29tcG9uZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWRhMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BvcnRDb21wb25lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotICogCW9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0gKiAJdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotICogCUludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLSAqIAlieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydENvbXBvbmVudFJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAqIAkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgKiAJICAgIFdTREwgcG9ydC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gb24gdGhlIGNsaWVudAotCSAqIAkgICAgc2lkZSBmb3IgYSBwb3J0LWNvbXBvbmVudC4KLQkgKiAKLQkgKiAJICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotCSAqICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlIE10b208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjdW5zZXRFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNzZXRFbmFibGVNdG9tKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRW5hYmxlTXRvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjaXNFbmFibGVNdG9tIDxlbT5FbmFibGUgTXRvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlIE10b208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjdW5zZXRFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNpc0VuYWJsZU10b20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVuYWJsZU10b20oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjaXNFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNzZXRFbmFibGVNdG9tKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFbmFibGVNdG9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNpc0VuYWJsZU10b20oKQotCSAqIEBzZWUgI3NldEVuYWJsZU10b20oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVuYWJsZU10b20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotCSAqIAkgICAgdG8gYSBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZQotCSAqIAkgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiAJICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUKLQkgKiAJICAgIHBvcnQtY29tcG9uZW50LW5hbWUgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUKLQkgKiAJICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKLQkgKiAJICAgIGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheCBkZWZpbmVkIGZvciBlamItbGluawotCSAqIAkgICAgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3J0Q29tcG9uZW50TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0UG9ydENvbXBvbmVudExpbmsgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3J0Q29tcG9uZW50TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0Q29tcG9uZW50UmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Byb3BlcnR5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Byb3BlcnR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzU4YjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qcm9wZXJ0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UHJvcGVydHlUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFByb3BlcnR5VHlwZV9OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQcm9wZXJ0eVR5cGVfVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFByb3BlcnR5VHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eVR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzQXV0aFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNBdXRoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE3ZjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNBdXRoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UmVzIEF1dGggVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci0gKiAJY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvcgotICogCXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLSAqIAlvbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCi0gKiAJdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi0gKiAJRGVwbG95ZXIuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgQXBwbGljYXRpb24KLSAqIAkgICAgQ29udGFpbmVyCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNBdXRoVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FQUExJQ0FUSU9OX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGUgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZShBUFBMSUNBVElPTiwgIkFwcGxpY2F0aW9uIiwgIkFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoVHlwZVtdIHsKLQkJCUFQUExJQ0FUSU9OX0xJVEVSQUwsCi0JCQlDT05UQUlORVJfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXNBdXRoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEFQUExJQ0FUSU9OOiByZXR1cm4gQVBQTElDQVRJT05fTElURVJBTDsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc0F1dGhUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXNBdXRoVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzE5ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotICogCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotICogCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotICogCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIFNoYXJlYWJsZQotICogCSAgICBVbnNoYXJlYWJsZQotICogCi0gKiAJVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNTaGFyaW5nU2NvcGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSEFSRUFCTEVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVJFQUJMRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VbnNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VW5zaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5TSEFSRUFCTEVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0hBUkVBQkxFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSEFSRUFCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShTSEFSRUFCTEUsICJTaGFyZWFibGUiLCAiU2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VW5zaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5TSEFSRUFCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgVU5TSEFSRUFCTEVfTElURVJBTCA9IG5ldyBSZXNTaGFyaW5nU2NvcGVUeXBlKFVOU0hBUkVBQkxFLCAiVW5zaGFyZWFibGUiLCAiVW5zaGFyZWFibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzU2hhcmluZ1Njb3BlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNTaGFyaW5nU2NvcGVUeXBlW10gewotCQkJU0hBUkVBQkxFX0xJVEVSQUwsCi0JCQlVTlNIQVJFQUJMRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNIQVJFQUJMRTogcmV0dXJuIFNIQVJFQUJMRV9MSVRFUkFMOwotCQkJY2FzZSBVTlNIQVJFQUJMRTogcmV0dXJuIFVOU0hBUkVBQkxFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc1NoYXJpbmdTY29wZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1Jlc1NoYXJpbmdTY29wZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNvdXJjZUVudlJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlRW52UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzEzYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlRW52UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIEVudiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi0gKiAJICByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotICogCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotICogCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotICogCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbAotICogCSAgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUKLSAqIAkgIGV4cGVjdGVkIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotICogCi0gKiAJICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAqIAkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIAotICogCSAgVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAqIAkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gKiAJICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gKiAJICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAqIAkgIHRhcmdldC4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlc291cmNlLWVudi1yZWYtbmFtZSZndDtqbXMvU3RvY2tRdWV1ZQotICogCSAgICAgICZsdDsvcmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OwotICogCSAgICAgICZsdDtyZXNvdXJjZS1lbnYtcmVmLXR5cGUmZ3Q7amF2YXguam1zLlF1ZXVlCi0gKiAJICAgICAgJmx0Oy9yZXNvdXJjZS1lbnYtcmVmLXR5cGUmZ3Q7Ci0gKiAJICAmbHQ7L3Jlc291cmNlLWVudi1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lIDxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZlR5cGUgPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRW52UmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICogCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICogCSAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICogCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAqIAkgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0JICogCSAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VFbnZSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZUVudlJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZk5hbWUgPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlRW52UmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLQkgKiAJICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0JICogCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IKLQkgKiAJICAgIGludGVyZmFjZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZUVudlJlZlR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlRW52UmVmVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldFJlc291cmNlRW52UmVmVHlwZSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VFbnZSZWZUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJlc291cmNlRW52UmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZjIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotICogCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0gKiAJICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLSAqIAkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgYW4gb3B0aW9uYWwgaW5kaWNhdGlvbiBvZgotICogCSAgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0gKiAJICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCBhbiBvcHRpb25hbCB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0gKiAJICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLSAqIAkgIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLSAqIAkgIChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotICogCi0gKiAJICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAqIAkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIAotICogCSAgVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0gKiAJICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotICogCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotICogCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0gKiAJICB0YXJnZXQuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDtyZXNvdXJjZS1yZWYmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlcy1yZWYtbmFtZSZndDtqZGJjL0VtcGxveWVlQXBwREImbHQ7L3Jlcy1yZWYtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7cmVzLXR5cGUmZ3Q7amF2YXguc3FsLkRhdGFTb3VyY2UmbHQ7L3Jlcy10eXBlJmd0OwotICogCSAgICAgICZsdDtyZXMtYXV0aCZndDtDb250YWluZXImbHQ7L3Jlcy1hdXRoJmd0OwotICogCSAgICAgICZsdDtyZXMtc2hhcmluZy1zY29wZSZndDtTaGFyZWFibGUmbHQ7L3Jlcy1zaGFyaW5nLXNjb3BlJmd0OwotICogCSAgJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzUmVmTmFtZSA8ZW0+UmVzIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzVHlwZSA8ZW0+UmVzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNBdXRoIDxlbT5SZXMgQXV0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXMgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICogCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0JICogCSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgKiAJICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgKiAJICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX1Jlc1JlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzUmVmTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1JlZk5hbWUgPGVtPlJlcyBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNSZWZOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEKLQkgKiAJICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLQkgKiAJICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICogCSAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX1Jlc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1R5cGUgPGVtPlJlcyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzIEF1dGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQXBwbGljYXRpb24iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzIEF1dGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIEF1dGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQHNlZSAjaXNTZXRSZXNBdXRoKCkKLQkgKiBAc2VlICN1bnNldFJlc0F1dGgoKQotCSAqIEBzZWUgI3NldFJlc0F1dGgoUmVzQXV0aFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzQXV0aFR5cGUgZ2V0UmVzQXV0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc0F1dGggPGVtPlJlcyBBdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgQXV0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkgKiBAc2VlICNpc1NldFJlc0F1dGgoKQotCSAqIEBzZWUgI3Vuc2V0UmVzQXV0aCgpCi0JICogQHNlZSAjZ2V0UmVzQXV0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzQXV0aChSZXNBdXRoVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNBdXRoIDxlbT5SZXMgQXV0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNBdXRoKCkKLQkgKiBAc2VlICNnZXRSZXNBdXRoKCkKLQkgKiBAc2VlICNzZXRSZXNBdXRoKFJlc0F1dGhUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzQXV0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzQXV0aCA8ZW0+UmVzIEF1dGg8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBBdXRoPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXNBdXRoKCkKLQkgKiBAc2VlICNnZXRSZXNBdXRoKCkKLQkgKiBAc2VlICNzZXRSZXNBdXRoKFJlc0F1dGhUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzQXV0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iU2hhcmVhYmxlIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAc2VlICNpc1NldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI3NldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZQotCSAqIEBzZWUgI2lzU2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICN1bnNldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc1NoYXJpbmdTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc1NoYXJpbmdTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSZXNvdXJjZVJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SdW5Bcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1J1bkFzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjIzMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1J1bkFzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLSAqIAl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotICogCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSdW5BcygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSdW5BcyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJ1bkFzX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJ1bkFzX1JvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UnVuQXNfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSdW5BcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxYWMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLSAqIAkgIHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mCi0gKiAJICB0aGUgc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICAgICAmbHQ7c2VjdXJpdHktcm9sZSZndDsKLSAqIAkgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gKiAJCSAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0gKiAJCSAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotICogCSAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gKiAJICAgICAgJmx0O3JvbGUtbmFtZSZndDtlbXBsb3llZSZsdDsvcm9sZS1uYW1lJmd0OwotICogCSAgICAgICZsdDsvc2VjdXJpdHktcm9sZSZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldFJvbGVOYW1lIDxlbT5Sb2xlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlSb2xlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VjdXJpdHlSb2xlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmIxZDdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLSAqIAlzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKLSAqIAlEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotICogCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi0gKiAJY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKLSAqIAlzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotICogCWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTGluayA8ZW0+Um9sZSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlUmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5Um9sZVJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKLQkgKiAJICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICogCSAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotCSAqIAkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKLQkgKiAJICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLQkgKiAJICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgKiAJICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um9sZUxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJvbGVMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldFJvbGVMaW5rIDxlbT5Sb2xlIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGVMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZWN1cml0eVJvbGVSZWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlMDRlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLSAqIAlzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotICogCWljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLSAqIAlhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLSAqIAlvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLSAqIAlhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi0gKiAJYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZUeXBlIDxlbT5TZXJ2aWNlIFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRQb3J0Q29tcG9uZW50UmVmcyA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZVJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotCSAqIAkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgKiAJICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLQkgKiAJICAgICJzZXJ2aWNlLyIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZVJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZOYW1lIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgKiAJICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLgotCSAqIAkgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgKiAJICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtcmVmLXR5cGUgZWxlbWVudCBkZWNsYXJlcyB0aGUgdHlwZSBvZiB0aGUgc2VydmljZS1yZWYKLQkgKiAJICAgIGVsZW1lbnQgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZS4KLQkgKiAJICAgIFRoaXMgbXVzdCBiZSBlaXRoZXIgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBTZXJ2aWNlIGNsYXNzIG9yCi0JICogCSAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2Ygc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MuCi0JICogCSAgICBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIEpBWC1XUyBydW50aW1lIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nCi0JICogCSAgICBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbm90ZSBib3RoIGEgU2VydmljZQotCSAqIAkgICAgb3IgYSBQb3J0LgotCSAqIAotCSAqIAkgICAgSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIG9mIHNlcnZpY2UtcmVmIGVsZW1lbnQKLQkgKiAJICAgIHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUgaXMKLQkgKiAJICAgIGFsd2F5cyBhIFNlcnZpY2UgaW50ZXJmYWNlL2NsYXNzLgotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlUmVmVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZpY2VSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmVHlwZSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VSZWZUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMCi0JICogCSAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdzZGxGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXc2RsRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICogCSAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0JICogCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgKiAJICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQkgKiAKLQkgKiAJICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc2VydmljZS1xbmFtZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBzcGVjaWZpYyBXU0RMIHNlcnZpY2UKLQkgKiAJICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotCSAqIAkgICAgd3NkbC1maWxlIGlzIGRlY2xhcmVkLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlUW5hbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U2VydmljZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZVFuYW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotCSAqIAkgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgKiAJICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgKiAJICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLQkgKiAJICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4KLQkgKiAJCWFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQotCSAqIAkJSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlCi0JICogCQloYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbCBwb3J0cyBvZiB0aGUKLQkgKiAJCXNlcnZpY2UuCi0JICogCi0JICogCQlUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICogCi0JICogCSAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfSGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEhhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkgVG8gYmUgdXNlZCB3aXRoIEpBWC1XUyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICogCSAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfSGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIGdldEhhbmRsZXJDaGFpbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlUmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3YzljZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWYgSGFuZGxlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0gKiAJaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0gKiAJcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotICogCXdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotICogCi0gKiAJVXNlZCBpbjogc2VydmljZS1yZWYKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFBvcnROYW1lcyA8ZW0+UG9ydCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZVJlZkhhbmRsZXIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAqIAkgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFuZGxlck5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyCi0JICogCSAgICBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFuZGxlckNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlckNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Jbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkCi0JICogCSAgICBieSB0aGUgaGFuZGxlci4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNvYXBIZWFkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0Ci0JICogCSAgICB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotCSAqIAkgICAgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3J0TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlUmVmSGFuZGxlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzBiODgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgVGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW4uCi0gKiAgICAgICBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBoYW5kbGVycyBpbiB0aGUKLSAqICAgICAgIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMKLSAqICAgICAgIHBvcnQgb3Igb24gYSBsaXN0IG9mIHByb3RvY29sLWJpbmRpbmdzLiBUaGUgY2hvaWNlIG9mIGVsZW1lbnRzCi0gKiAgICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4gYW5kIHByb3RvY29sLWJpbmRpbmdzCi0gKiAgICAgICBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlCi0gKiAgICAgICBmb3IgYSBzZXJ2aWNlLCBwb3J0IG9yIHByb3RvY29sIGJpbmRpbmcuIElmIG5vbmUgb2YgdGhlc2UKLSAqICAgICAgIGNob2ljZXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgdGhlbiB0aGUKLSAqICAgICAgIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlci1jaGFpbiB3aWxsIGJlIGFwcGxpZWQgb24KLSAqICAgICAgIGV2ZXJ5dGhpbmcuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFBvcnROYW1lUGF0dGVybiA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlUmVmSGFuZGxlckNoYWluIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VOYW1lUGF0dGVybihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VOYW1lUGF0dGVybihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3J0TmFtZVBhdHRlcm4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9ydE5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3J0TmFtZVBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvdG9jb2xCaW5kaW5ncyhMaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcm90b2NvbEJpbmRpbmdzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3RvY29sQmluZGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb3RvY29sQmluZGluZ3MoTGlzdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZVJlZkhhbmRsZXJDaGFpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWlucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Y2E3YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICogICAgICAgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRIYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZVJlZkhhbmRsZXJDaGFpbnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9VcmxQYXR0ZXJuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY2OTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9VcmxQYXR0ZXJuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBQYXR0ZXJuIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgotICogCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotICogCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0gKiAJVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCi0gKiAJSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotICogCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0gKiAJVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0VXJsUGF0dGVyblR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXJsUGF0dGVyblR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0VXJsUGF0dGVyblR5cGVfVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBVcmxQYXR0ZXJuVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODA1NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlzZXRMYW5nKExBTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gTEFOR19FREVGQVVMVCA9PSBudWxsID8gbGFuZyAhPSBudWxsIDogIUxBTkdfRURFRkFVTFQuZXF1YWxzKGxhbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzBlYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERpc3BsYXlOYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc3BsYXlOYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRElTUExBWV9OQU1FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKLQkJCQlyZXR1cm4gTEFOR19FREVGQVVMVCA9PSBudWxsID8gbGFuZyAhPSBudWxsIDogIUxBTkdfRURFRkFVTFQuZXF1YWxzKGxhbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rpc3BsYXlOYW1lSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYkxvY2FsUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiTG9jYWxSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZmM0ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiTG9jYWxSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWpiIExvY2FsIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiTG9jYWxSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFamJMb2NhbFJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZk5hbWUoKSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmTmFtZSgpIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiUmVmTmFtZSA9IEVKQl9SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZUeXBlKCkgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIEVKQl9SRUZfVFlQRV9FREVGQVVMVCA9IEVqYlJlZlR5cGUuRU5USVRZX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZUeXBlKCkgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVqYlJlZlR5cGUgZWpiUmVmVHlwZSA9IEVKQl9SRUZfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWpiIFJlZiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlamJSZWZUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0hPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbEhvbWUgPSBMT0NBTF9IT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsID0gTE9DQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJMaW5rID0gRUpCX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVqYkxvY2FsUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRUpCX0xPQ0FMX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYlJlZk5hbWUoKSB7Ci0JCXJldHVybiBlamJSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlJlZk5hbWUoU3RyaW5nIG5ld0VqYlJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYlJlZk5hbWUgPSBlamJSZWZOYW1lOwotCQllamJSZWZOYW1lID0gbmV3RWpiUmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX05BTUUsIG9sZEVqYlJlZk5hbWUsIGVqYlJlZk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmVHlwZSBnZXRFamJSZWZUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGUgbmV3RWpiUmVmVHlwZSkgewotCQlFamJSZWZUeXBlIG9sZEVqYlJlZlR5cGUgPSBlamJSZWZUeXBlOwotCQllamJSZWZUeXBlID0gbmV3RWpiUmVmVHlwZSA9PSBudWxsID8gRUpCX1JFRl9UWVBFX0VERUZBVUxUIDogbmV3RWpiUmVmVHlwZTsKLQkJYm9vbGVhbiBvbGRFamJSZWZUeXBlRVNldCA9IGVqYlJlZlR5cGVFU2V0OwotCQllamJSZWZUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFLCBvbGRFamJSZWZUeXBlLCBlamJSZWZUeXBlLCAhb2xkRWpiUmVmVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVqYlJlZlR5cGUoKSB7Ci0JCUVqYlJlZlR5cGUgb2xkRWpiUmVmVHlwZSA9IGVqYlJlZlR5cGU7Ci0JCWJvb2xlYW4gb2xkRWpiUmVmVHlwZUVTZXQgPSBlamJSZWZUeXBlRVNldDsKLQkJZWpiUmVmVHlwZSA9IEVKQl9SRUZfVFlQRV9FREVGQVVMVDsKLQkJZWpiUmVmVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRSwgb2xkRWpiUmVmVHlwZSwgRUpCX1JFRl9UWVBFX0VERUZBVUxULCBvbGRFamJSZWZUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWpiUmVmVHlwZSgpIHsKLQkJcmV0dXJuIGVqYlJlZlR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxIb21lKCkgewotCQlyZXR1cm4gbG9jYWxIb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgbmV3TG9jYWxIb21lKSB7Ci0JCVN0cmluZyBvbGRMb2NhbEhvbWUgPSBsb2NhbEhvbWU7Ci0JCWxvY2FsSG9tZSA9IG5ld0xvY2FsSG9tZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FLCBvbGRMb2NhbEhvbWUsIGxvY2FsSG9tZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWwoKSB7Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbChTdHJpbmcgbmV3TG9jYWwpIHsKLQkJU3RyaW5nIG9sZExvY2FsID0gbG9jYWw7Ci0JCWxvY2FsID0gbmV3TG9jYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUwsIG9sZExvY2FsLCBsb2NhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiTGluaygpIHsKLQkJcmV0dXJuIGVqYkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiTGluayhTdHJpbmcgbmV3RWpiTGluaykgewotCQlTdHJpbmcgb2xkRWpiTGluayA9IGVqYkxpbms7Ci0JCWVqYkxpbmsgPSBuZXdFamJMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LLCBvbGRFamJMaW5rLCBlamJMaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewotCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRFamJSZWZOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFOgotCQkJCXJldHVybiBnZXRFamJSZWZUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIGdldExvY2FsKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX0xJTks6Ci0JCQkJcmV0dXJuIGdldEVqYkxpbmsoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX05BTUU6Ci0JCQkJc2V0RWpiUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFOgotCQkJCXNldEVqYlJlZlR5cGUoKEVqYlJlZlR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX05BTUU6Ci0JCQkJc2V0RWpiUmVmTmFtZShFSkJfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX1RZUEU6Ci0JCQkJdW5zZXRFamJSZWZUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJc2V0TG9jYWxIb21lKExPQ0FMX0hPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTDoKLQkJCQlzZXRMb2NhbChMT0NBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoRUpCX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gRUpCX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJSZWZOYW1lICE9IG51bGwgOiAhRUpCX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhlamJSZWZOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0RWpiUmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIExPQ0FMX0hPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsSG9tZSAhPSBudWxsIDogIUxPQ0FMX0hPTUVfRURFRkFVTFQuZXF1YWxzKGxvY2FsSG9tZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIExPQ0FMX0VERUZBVUxUID09IG51bGwgPyBsb2NhbCAhPSBudWxsIDogIUxPQ0FMX0VERUZBVUxULmVxdWFscyhsb2NhbCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX0xJTks6Ci0JCQkJcmV0dXJuIEVKQl9MSU5LX0VERUZBVUxUID09IG51bGwgPyBlamJMaW5rICE9IG51bGwgOiAhRUpCX0xJTktfRURFRkFVTFQuZXF1YWxzKGVqYkxpbmspOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYlJlZk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiUmVmVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVqYlJlZlR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGVqYlJlZlR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2FsSG9tZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbEhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2FsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2FsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamJMaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYkxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FamJMb2NhbFJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDhlOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FamIgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsI2dldEVqYlJlZk5hbWUgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFamJSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZOYW1lKCkgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZk5hbWUoKSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlJlZk5hbWUgPSBFSkJfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmVHlwZSgpIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBFSkJfUkVGX1RZUEVfRURFRkFVTFQgPSBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmVHlwZSgpIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFamJSZWZUeXBlIGVqYlJlZlR5cGUgPSBFSkJfUkVGX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVqYiBSZWYgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWpiUmVmVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvbWUgPSBIT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJMaW5rID0gRUpCX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVqYlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJSZWZOYW1lKCkgewotCQlyZXR1cm4gZWpiUmVmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJSZWZOYW1lKFN0cmluZyBuZXdFamJSZWZOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJSZWZOYW1lID0gZWpiUmVmTmFtZTsKLQkJZWpiUmVmTmFtZSA9IG5ld0VqYlJlZk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9OQU1FLCBvbGRFamJSZWZOYW1lLCBlamJSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZlR5cGUgZ2V0RWpiUmVmVHlwZSgpIHsKLQkJcmV0dXJuIGVqYlJlZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlIG5ld0VqYlJlZlR5cGUpIHsKLQkJRWpiUmVmVHlwZSBvbGRFamJSZWZUeXBlID0gZWpiUmVmVHlwZTsKLQkJZWpiUmVmVHlwZSA9IG5ld0VqYlJlZlR5cGUgPT0gbnVsbCA/IEVKQl9SRUZfVFlQRV9FREVGQVVMVCA6IG5ld0VqYlJlZlR5cGU7Ci0JCWJvb2xlYW4gb2xkRWpiUmVmVHlwZUVTZXQgPSBlamJSZWZUeXBlRVNldDsKLQkJZWpiUmVmVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfVFlQRSwgb2xkRWpiUmVmVHlwZSwgZWpiUmVmVHlwZSwgIW9sZEVqYlJlZlR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFamJSZWZUeXBlKCkgewotCQlFamJSZWZUeXBlIG9sZEVqYlJlZlR5cGUgPSBlamJSZWZUeXBlOwotCQlib29sZWFuIG9sZEVqYlJlZlR5cGVFU2V0ID0gZWpiUmVmVHlwZUVTZXQ7Ci0JCWVqYlJlZlR5cGUgPSBFSkJfUkVGX1RZUEVfRURFRkFVTFQ7Ci0JCWVqYlJlZlR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX1RZUEUsIG9sZEVqYlJlZlR5cGUsIEVKQl9SRUZfVFlQRV9FREVGQVVMVCwgb2xkRWpiUmVmVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVqYlJlZlR5cGUoKSB7Ci0JCXJldHVybiBlamJSZWZUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvbWUoKSB7Ci0JCXJldHVybiBob21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIG5ld0hvbWUpIHsKLQkJU3RyaW5nIG9sZEhvbWUgPSBob21lOwotCQlob21lID0gbmV3SG9tZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19IT01FLCBvbGRIb21lLCBob21lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7Ci0JCXJldHVybiByZW1vdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyBuZXdSZW1vdGUpIHsKLQkJU3RyaW5nIG9sZFJlbW90ZSA9IHJlbW90ZTsKLQkJcmVtb3RlID0gbmV3UmVtb3RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX1JFTU9URSwgb2xkUmVtb3RlLCByZW1vdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkxpbmsoU3RyaW5nIG5ld0VqYkxpbmspIHsKLQkJU3RyaW5nIG9sZEVqYkxpbmsgPSBlamJMaW5rOwotCQllamJMaW5rID0gbmV3RWpiTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfTElOSywgb2xkRWpiTGluaywgZWpiTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0hPTUU6Ci0JCQkJcmV0dXJuIGdldEhvbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJcmV0dXJuIGdldFJlbW90ZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9MSU5LOgotCQkJCXJldHVybiBnZXRFamJMaW5rKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXNldEVqYlJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQlzZXRFamJSZWZUeXBlKChFamJSZWZUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXNldEVqYlJlZk5hbWUoRUpCX1JFRl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9UWVBFOgotCQkJCXVuc2V0RWpiUmVmVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXNldEhvbWUoSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoUkVNT1RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX0xJTks6Ci0JCQkJc2V0RWpiTGluayhFSkJfTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXJldHVybiBFSkJfUkVGX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYlJlZk5hbWUgIT0gbnVsbCA6ICFFSkJfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYlJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRFamJSZWZUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlyZXR1cm4gSE9NRV9FREVGQVVMVCA9PSBudWxsID8gaG9tZSAhPSBudWxsIDogIUhPTUVfRURFRkFVTFQuZXF1YWxzKGhvbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX1JFTU9URToKLQkJCQlyZXR1cm4gUkVNT1RFX0VERUZBVUxUID09IG51bGwgPyByZW1vdGUgIT0gbnVsbCA6ICFSRU1PVEVfRURFRkFVTFQuZXF1YWxzKHJlbW90ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX0xJTks6Ci0JCQkJcmV0dXJuIEVKQl9MSU5LX0VERUZBVUxUID09IG51bGwgPyBlamJMaW5rICE9IG51bGwgOiAhRUpCX0xJTktfRURFRkFVTFQuZXF1YWxzKGVqYkxpbmspOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYlJlZk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiUmVmVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVqYlJlZlR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGVqYlJlZlR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGhvbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaG9tZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtb3RlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlbW90ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiTGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJMaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRWpiUmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VtcHR5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VtcHR5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YTg3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FbXB0eVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbXB0eSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbXB0eVR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVtcHR5VHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW1wdHlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRU1QVFlfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRW1wdHlUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW52RW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDI1NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW52RW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnYgRW50cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsI2dldEVudkVudHJ5TmFtZSA8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0RW52RW50cnlWYWx1ZSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVudkVudHJ5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW52RW50cnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyeU5hbWUoKSA8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJ5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX0VOVFJZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlOYW1lKCkgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW52RW50cnlOYW1lID0gRU5WX0VOVFJZX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlUeXBlKCkgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEVOVl9FTlRSWV9UWVBFX0VERUZBVUxUID0gRW52RW50cnlUeXBlLkpBVkFfTEFOR19CT09MRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyeVR5cGUoKSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJ5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudkVudHJ5VHlwZSBlbnZFbnRyeVR5cGUgPSBFTlZfRU5UUllfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRW52IEVudHJ5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVudkVudHJ5VHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyeVZhbHVlKCkgPGVtPkVudiBFbnRyeSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cnlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJ5VmFsdWUoKSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVudkVudHJ5VmFsdWUgPSBFTlZfRU5UUllfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVudkVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRU5WX0VOVFJZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbnZFbnRyeU5hbWUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52RW50cnlOYW1lKFN0cmluZyBuZXdFbnZFbnRyeU5hbWUpIHsKLQkJU3RyaW5nIG9sZEVudkVudHJ5TmFtZSA9IGVudkVudHJ5TmFtZTsKLQkJZW52RW50cnlOYW1lID0gbmV3RW52RW50cnlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUUsIG9sZEVudkVudHJ5TmFtZSwgZW52RW50cnlOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBnZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSBuZXdFbnZFbnRyeVR5cGUpIHsKLQkJRW52RW50cnlUeXBlIG9sZEVudkVudHJ5VHlwZSA9IGVudkVudHJ5VHlwZTsKLQkJZW52RW50cnlUeXBlID0gbmV3RW52RW50cnlUeXBlID09IG51bGwgPyBFTlZfRU5UUllfVFlQRV9FREVGQVVMVCA6IG5ld0VudkVudHJ5VHlwZTsKLQkJYm9vbGVhbiBvbGRFbnZFbnRyeVR5cGVFU2V0ID0gZW52RW50cnlUeXBlRVNldDsKLQkJZW52RW50cnlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRSwgb2xkRW52RW50cnlUeXBlLCBlbnZFbnRyeVR5cGUsICFvbGRFbnZFbnRyeVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRFbnZFbnRyeVR5cGUgPSBlbnZFbnRyeVR5cGU7Ci0JCWJvb2xlYW4gb2xkRW52RW50cnlUeXBlRVNldCA9IGVudkVudHJ5VHlwZUVTZXQ7Ci0JCWVudkVudHJ5VHlwZSA9IEVOVl9FTlRSWV9UWVBFX0VERUZBVUxUOwotCQllbnZFbnRyeVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFLCBvbGRFbnZFbnRyeVR5cGUsIEVOVl9FTlRSWV9UWVBFX0VERUZBVUxULCBvbGRFbnZFbnRyeVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW52RW50cnlWYWx1ZSgpIHsKLQkJcmV0dXJuIGVudkVudHJ5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52RW50cnlWYWx1ZShTdHJpbmcgbmV3RW52RW50cnlWYWx1ZSkgewotCQlTdHJpbmcgb2xkRW52RW50cnlWYWx1ZSA9IGVudkVudHJ5VmFsdWU7Ci0JCWVudkVudHJ5VmFsdWUgPSBuZXdFbnZFbnRyeVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFLCBvbGRFbnZFbnRyeVZhbHVlLCBlbnZFbnRyeVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RW52RW50cnlOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RW52RW50cnlUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJ5VmFsdWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUU6Ci0JCQkJc2V0RW52RW50cnlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFOgotCQkJCXNldEVudkVudHJ5VHlwZSgoRW52RW50cnlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVkFMVUU6Ci0JCQkJc2V0RW52RW50cnlWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfTkFNRToKLQkJCQlzZXRFbnZFbnRyeU5hbWUoRU5WX0VOVFJZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFOgotCQkJCXVuc2V0RW52RW50cnlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFOgotCQkJCXNldEVudkVudHJ5VmFsdWUoRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUU6Ci0JCQkJcmV0dXJuIEVOVl9FTlRSWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlbnZFbnRyeU5hbWUgIT0gbnVsbCA6ICFFTlZfRU5UUllfTkFNRV9FREVGQVVMVC5lcXVhbHMoZW52RW50cnlOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiBpc1NldEVudkVudHJ5VHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFOgotCQkJCXJldHVybiBFTlZfRU5UUllfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGVudkVudHJ5VmFsdWUgIT0gbnVsbCA6ICFFTlZfRU5UUllfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGVudkVudHJ5VmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVudkVudHJ5TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlbnZFbnRyeU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudkVudHJ5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudkVudHJ5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoZW52RW50cnlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnZFbnRyeVZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVudkVudHJ5VmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FbnZFbnRyeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JY29uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSWNvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMmVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JY29uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkljb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSWNvbkltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSWNvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzbWFsbEljb24gPSBTTUFMTF9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBUkdFX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYXJnZUljb24gPSBMQVJHRV9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYW5nID0gTEFOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJY29uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSUNPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlTdHJpbmcgb2xkU21hbGxJY29uID0gc21hbGxJY29uOwotCQlzbWFsbEljb24gPSBuZXdTbWFsbEljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuSUNPTl9fU01BTExfSUNPTiwgb2xkU21hbGxJY29uLCBzbWFsbEljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlTdHJpbmcgb2xkTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCQlsYXJnZUljb24gPSBuZXdMYXJnZUljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFSR0VfSUNPTiwgb2xkTGFyZ2VJY29uLCBsYXJnZUljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLklDT05fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5JQ09OX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0xBTkc6Ci0JCQkJc2V0TGFuZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNtYWxsSWNvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JY29uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0luamVjdGlvblRhcmdldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0luamVjdGlvblRhcmdldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ZmY0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JbmplY3Rpb25UYXJnZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JbmplY3Rpb25UYXJnZXRJbXBsI2dldEluamVjdGlvblRhcmdldENsYXNzIDxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JbmplY3Rpb25UYXJnZXRJbXBsI2dldEluamVjdGlvblRhcmdldE5hbWUgPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluamVjdGlvblRhcmdldEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluamVjdGlvblRhcmdldCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldENsYXNzKCkgPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkpFQ1RJT05fVEFSR0VUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldENsYXNzKCkgPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluamVjdGlvblRhcmdldENsYXNzID0gSU5KRUNUSU9OX1RBUkdFVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkgPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5KRUNUSU9OX1RBUkdFVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldE5hbWUoKSA8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluamVjdGlvblRhcmdldE5hbWUgPSBJTkpFQ1RJT05fVEFSR0VUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5qZWN0aW9uVGFyZ2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSU5KRUNUSU9OX1RBUkdFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluamVjdGlvblRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoU3RyaW5nIG5ld0luamVjdGlvblRhcmdldENsYXNzKSB7Ci0JCVN0cmluZyBvbGRJbmplY3Rpb25UYXJnZXRDbGFzcyA9IGluamVjdGlvblRhcmdldENsYXNzOwotCQlpbmplY3Rpb25UYXJnZXRDbGFzcyA9IG5ld0luamVjdGlvblRhcmdldENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfQ0xBU1MsIG9sZEluamVjdGlvblRhcmdldENsYXNzLCBpbmplY3Rpb25UYXJnZXRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGluamVjdGlvblRhcmdldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShTdHJpbmcgbmV3SW5qZWN0aW9uVGFyZ2V0TmFtZSkgewotCQlTdHJpbmcgb2xkSW5qZWN0aW9uVGFyZ2V0TmFtZSA9IGluamVjdGlvblRhcmdldE5hbWU7Ci0JCWluamVjdGlvblRhcmdldE5hbWUgPSBuZXdJbmplY3Rpb25UYXJnZXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRSwgb2xkSW5qZWN0aW9uVGFyZ2V0TmFtZSwgaW5qZWN0aW9uVGFyZ2V0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUzoKLQkJCQlzZXRJbmplY3Rpb25UYXJnZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9OQU1FOgotCQkJCXNldEluamVjdGlvblRhcmdldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTOgotCQkJCXNldEluamVjdGlvblRhcmdldENsYXNzKElOSkVDVElPTl9UQVJHRVRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUU6Ci0JCQkJc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShJTkpFQ1RJT05fVEFSR0VUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfQ0xBU1M6Ci0JCQkJcmV0dXJuIElOSkVDVElPTl9UQVJHRVRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluamVjdGlvblRhcmdldENsYXNzICE9IG51bGwgOiAhSU5KRUNUSU9OX1RBUkdFVF9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5qZWN0aW9uVGFyZ2V0Q2xhc3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRToKLQkJCQlyZXR1cm4gSU5KRUNUSU9OX1RBUkdFVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbmplY3Rpb25UYXJnZXROYW1lICE9IG51bGwgOiAhSU5KRUNUSU9OX1RBUkdFVF9OQU1FX0VERUZBVUxULmVxdWFscyhpbmplY3Rpb25UYXJnZXROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluamVjdGlvblRhcmdldENsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGluamVjdGlvblRhcmdldENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbmplY3Rpb25UYXJnZXROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGluamVjdGlvblRhcmdldE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbmplY3Rpb25UYXJnZXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjNkMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YWVlRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKYXZhZWVGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhZWVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhZWVGYWN0b3J5IHRoZUphdmFlZUZhY3RvcnkgPSAoSmF2YWVlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlSmF2YWVlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUphdmFlZUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgSmF2YWVlRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVEaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVFamJMb2NhbFJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVFamJSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRW1wdHlUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRW52RW50cnkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSWNvbigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbmplY3Rpb25UYXJnZXQoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0s6IHJldHVybiAoRU9iamVjdCljcmVhdGVMaWZlY3ljbGVDYWxsYmFjaygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTGlzdGVuZXIoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUG9ydENvbXBvbmVudFJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9wZXJ0eVR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VFbnZSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXNvdXJjZVJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJ1bkFzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfQVVUSF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSZXNBdXRoVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVdFWV9WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURld2V5VmVyc2lvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTElOSzoKLQkJCQlyZXR1cm4gY3JlYXRlRUpCTGlua0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJSZWZOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZlR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkhPTUU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUhvbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX0lERU5USUZJRVI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFJZGVudGlmaWVyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSkFWQV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVKYXZhVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpORElfTkFNRToKLQkJCQlyZXR1cm4gY3JlYXRlSk5ESU5hbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTDoKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTF9IT01FOgotCQkJCXJldHVybiBjcmVhdGVMb2NhbEhvbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVRIX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhdGhUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFTU9URToKLQkJCQlyZXR1cm4gY3JlYXRlUmVtb3RlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc0F1dGhUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJ1ZUZhbHNlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRydWVGYWxzZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVqYlJlZlR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19BVVRIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFV0VZX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERld2V5VmVyc2lvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MSU5LOgotCQkJCXJldHVybiBjb252ZXJ0RUpCTGlua1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFamJSZWZOYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydEVqYlJlZlR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydEVudkVudHJ5VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRGdWxseVF1YWxpZmllZENsYXNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSE9NRToKLQkJCQlyZXR1cm4gY29udmVydEhvbWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfSURFTlRJRklFUjoKLQkJCQlyZXR1cm4gY29udmVydEphdmFJZGVudGlmaWVyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKYXZhVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSk5ESV9OQU1FOgotCQkJCXJldHVybiBjb252ZXJ0Sk5ESU5hbWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxPQ0FMOgotCQkJCXJldHVybiBjb252ZXJ0TG9jYWxUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMb2NhbEhvbWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlyZXR1cm4gY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBVEhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFBhdGhUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVNT1RFOgotCQkJCXJldHVybiBjb252ZXJ0UmVtb3RlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfQVVUSF9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFJlc0F1dGhUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfU0hBUklOR19TQ09QRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJPTEVfTkFNRToKLQkJCQlyZXR1cm4gY29udmVydFJvbGVOYW1lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX0xJU1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9RTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBjb252ZXJ0U2VydmljZVJlZlFuYW1lUGF0dGVyblRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVFJVRV9GQUxTRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJ1ZUZhbHNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVFJVRV9GQUxTRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFRydWVGYWxzZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRpb25JbXBsIGRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BsYXlOYW1lIGNyZWF0ZURpc3BsYXlOYW1lKCkgewotCQlEaXNwbGF5TmFtZUltcGwgZGlzcGxheU5hbWUgPSBuZXcgRGlzcGxheU5hbWVJbXBsKCk7Ci0JCXJldHVybiBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiTG9jYWxSZWYgY3JlYXRlRWpiTG9jYWxSZWYoKSB7Ci0JCUVqYkxvY2FsUmVmSW1wbCBlamJMb2NhbFJlZiA9IG5ldyBFamJMb2NhbFJlZkltcGwoKTsKLQkJcmV0dXJuIGVqYkxvY2FsUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWYgY3JlYXRlRWpiUmVmKCkgewotCQlFamJSZWZJbXBsIGVqYlJlZiA9IG5ldyBFamJSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVtcHR5VHlwZSBjcmVhdGVFbXB0eVR5cGUoKSB7Ci0JCUVtcHR5VHlwZUltcGwgZW1wdHlUeXBlID0gbmV3IEVtcHR5VHlwZUltcGwoKTsKLQkJcmV0dXJuIGVtcHR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW52RW50cnkgY3JlYXRlRW52RW50cnkoKSB7Ci0JCUVudkVudHJ5SW1wbCBlbnZFbnRyeSA9IG5ldyBFbnZFbnRyeUltcGwoKTsKLQkJcmV0dXJuIGVudkVudHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJY29uIGNyZWF0ZUljb24oKSB7Ci0JCUljb25JbXBsIGljb24gPSBuZXcgSWNvbkltcGwoKTsKLQkJcmV0dXJuIGljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluamVjdGlvblRhcmdldCBjcmVhdGVJbmplY3Rpb25UYXJnZXQoKSB7Ci0JCUluamVjdGlvblRhcmdldEltcGwgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEluamVjdGlvblRhcmdldEltcGwoKTsKLQkJcmV0dXJuIGluamVjdGlvblRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlmZWN5Y2xlQ2FsbGJhY2sgY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2soKSB7Ci0JCUxpZmVjeWNsZUNhbGxiYWNrSW1wbCBsaWZlY3ljbGVDYWxsYmFjayA9IG5ldyBMaWZlY3ljbGVDYWxsYmFja0ltcGwoKTsKLQkJcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IExpc3RlbmVySW1wbCgpOwotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgbWVzc2FnZURlc3RpbmF0aW9uID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpIHsKLQkJTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCBtZXNzYWdlRGVzdGluYXRpb25SZWYgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJhbVZhbHVlIGNyZWF0ZVBhcmFtVmFsdWUoKSB7Ci0JCVBhcmFtVmFsdWVJbXBsIHBhcmFtVmFsdWUgPSBuZXcgUGFyYW1WYWx1ZUltcGwoKTsKLQkJcmV0dXJuIHBhcmFtVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFJlZiBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSB7Ci0JCVBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwgcGVyc2lzdGVuY2VDb250ZXh0UmVmID0gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwoKTsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UmVmIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlZigpIHsKLQkJUGVyc2lzdGVuY2VVbml0UmVmSW1wbCBwZXJzaXN0ZW5jZVVuaXRSZWYgPSBuZXcgUGVyc2lzdGVuY2VVbml0UmVmSW1wbCgpOwotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCVBvcnRDb21wb25lbnRSZWZJbXBsIHBvcnRDb21wb25lbnRSZWYgPSBuZXcgUG9ydENvbXBvbmVudFJlZkltcGwoKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb3BlcnR5VHlwZSBjcmVhdGVQcm9wZXJ0eVR5cGUoKSB7Ci0JCVByb3BlcnR5VHlwZUltcGwgcHJvcGVydHlUeXBlID0gbmV3IFByb3BlcnR5VHlwZUltcGwoKTsKLQkJcmV0dXJuIHByb3BlcnR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFbnZSZWYgY3JlYXRlUmVzb3VyY2VFbnZSZWYoKSB7Ci0JCVJlc291cmNlRW52UmVmSW1wbCByZXNvdXJjZUVudlJlZiA9IG5ldyBSZXNvdXJjZUVudlJlZkltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlZiBjcmVhdGVSZXNvdXJjZVJlZigpIHsKLQkJUmVzb3VyY2VSZWZJbXBsIHJlc291cmNlUmVmID0gbmV3IFJlc291cmNlUmVmSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJ1bkFzIGNyZWF0ZVJ1bkFzKCkgewotCQlSdW5Bc0ltcGwgcnVuQXMgPSBuZXcgUnVuQXNJbXBsKCk7Ci0JCXJldHVybiBydW5BczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGNyZWF0ZVNlY3VyaXR5Um9sZSgpIHsKLQkJU2VjdXJpdHlSb2xlSW1wbCBzZWN1cml0eVJvbGUgPSBuZXcgU2VjdXJpdHlSb2xlSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGVSZWYgY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCkgewotCQlTZWN1cml0eVJvbGVSZWZJbXBsIHNlY3VyaXR5Um9sZVJlZiA9IG5ldyBTZWN1cml0eVJvbGVSZWZJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWYgY3JlYXRlU2VydmljZVJlZigpIHsKLQkJU2VydmljZVJlZkltcGwgc2VydmljZVJlZiA9IG5ldyBTZXJ2aWNlUmVmSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkhhbmRsZXIgY3JlYXRlU2VydmljZVJlZkhhbmRsZXIoKSB7Ci0JCVNlcnZpY2VSZWZIYW5kbGVySW1wbCBzZXJ2aWNlUmVmSGFuZGxlciA9IG5ldyBTZXJ2aWNlUmVmSGFuZGxlckltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VSZWZIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKSB7Ci0JCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gPSBuZXcgU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkgewotCQlTZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwgc2VydmljZVJlZkhhbmRsZXJDaGFpbnMgPSBuZXcgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlckNoYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVXJsUGF0dGVyblR5cGUgY3JlYXRlVXJsUGF0dGVyblR5cGUoKSB7Ci0JCVVybFBhdHRlcm5UeXBlSW1wbCB1cmxQYXR0ZXJuVHlwZSA9IG5ldyBVcmxQYXR0ZXJuVHlwZUltcGwoKTsKLQkJcmV0dXJuIHVybFBhdHRlcm5UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRWpiUmVmVHlwZSByZXN1bHQgPSBFamJSZWZUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJSZWZUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBjcmVhdGVFbnZFbnRyeVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRW52RW50cnlUeXBlIHJlc3VsdCA9IEVudkVudHJ5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHJlc3VsdCA9IFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzQXV0aFR5cGUgY3JlYXRlUmVzQXV0aFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmVzQXV0aFR5cGUgcmVzdWx0ID0gUmVzQXV0aFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc3VsdCA9IFJlc1NoYXJpbmdTY29wZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZURld2V5VmVyc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGV3ZXlWZXJzaW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVKQkxpbmtGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RUpCTGlua1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVqYlJlZk5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVqYlJlZk5hbWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGNyZWF0ZUVqYlJlZlR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChFamJSZWZUeXBlKWNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFRl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVqYlJlZlR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydEVqYlJlZlR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUZfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBjcmVhdGVFbnZFbnRyeVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChFbnZFbnRyeVR5cGUpY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVOVl9FTlRSWV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVudkVudHJ5VHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FTlZfRU5UUllfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGdWxseVF1YWxpZmllZENsYXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUhvbWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SG9tZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUphdmFJZGVudGlmaWVyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEphdmFJZGVudGlmaWVyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSmF2YVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SmF2YVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVKTkRJTmFtZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKTkRJTmFtZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUxvY2FsRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExvY2FsVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTG9jYWxIb21lRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExvY2FsSG9tZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uTGlua1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKWNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQYXRoVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQYXRoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSljcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QRVJTSVNURU5DRV9DT05URVhUX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUmVtb3RlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlbW90ZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzQXV0aFR5cGUgY3JlYXRlUmVzQXV0aFR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSZXNBdXRoVHlwZSljcmVhdGVSZXNBdXRoVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNfQVVUSF9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX0FVVEhfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFJlc1NoYXJpbmdTY29wZVR5cGUpY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNfU0hBUklOR19TQ09QRV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJFU19TSEFSSU5HX1NDT1BFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUm9sZU5hbWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Um9sZU5hbWVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCWlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluaXRpYWxWYWx1ZSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgewotCQkJU3RyaW5nIGl0ZW0gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlyZXN1bHQuYWRkKGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSwgaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJaWYgKGluc3RhbmNlVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KWluc3RhbmNlVmFsdWU7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuICIiOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCXJlc3VsdC5hcHBlbmQoY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGkubmV4dCgpKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5BTllfVVJJLCBpbml0aWFsVmFsdWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZURhdGFUeXBlLCByZXN1bHQsIG51bGwsIG51bGwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoU3RyaW5nKWNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwgfHwgZXhjZXB0aW9uID09IG51bGwpIHJldHVybiByZXN1bHQ7Ci0gICAgCi0JCXRocm93IGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCWlmIChpbnN0YW5jZVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKGluc3RhbmNlVmFsdWUpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2YWx1ZSA9IFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLmlzSW5zdGFuY2UoaW5zdGFuY2VWYWx1ZSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiAnIitpbnN0YW5jZVZhbHVlKyInIGZvciBkYXRhdHlwZSA6IitlRGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcnZpY2VSZWZRbmFtZVBhdHRlcm5Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gY3JlYXRlVHJ1ZUZhbHNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJvb2xlYW4pWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQk9PTEVBTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcnVlRmFsc2VUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQk9PTEVBTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gY3JlYXRlVHJ1ZUZhbHNlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJvb2xlYW4pY3JlYXRlVHJ1ZUZhbHNlVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5UUlVFX0ZBTFNFX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJ1ZUZhbHNlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0VHJ1ZUZhbHNlVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuVFJVRV9GQUxTRV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlUGFja2FnZSBnZXRKYXZhZWVQYWNrYWdlKCkgewotCQlyZXR1cm4gKEphdmFlZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YWVlUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vSmF2YWVlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE3NTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFlZVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YWVlUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzcGxheU5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiTG9jYWxSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVtcHR5VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnZFbnRyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpY29uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluamVjdGlvblRhcmdldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaWZlY3ljbGVDYWxsYmFja0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaXN0ZW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcmFtVmFsdWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb3J0Q29tcG9uZW50UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb3BlcnR5VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUVudlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBydW5Bc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlSb2xlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZpY2VSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1cmxQYXR0ZXJuVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVqYlJlZlR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVudkVudHJ5VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXNBdXRoVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWpiTGlua0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlamJSZWZOYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlamJSZWZUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVudkVudHJ5VHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBmdWxseVF1YWxpZmllZENsYXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBob21lRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGphdmFJZGVudGlmaWVyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGphdmFUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpuZGlOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxvY2FsRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxvY2FsSG9tZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtZXNzYWdlRGVzdGluYXRpb25MaW5rRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwYXRoVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJlbW90ZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByZXNBdXRoVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJvbGVOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VydmljZVJlZlFuYW1lUGF0dGVybkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0cnVlRmFsc2VUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEphdmFlZVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFlZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUphdmFlZVBhY2thZ2VJbXBsIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKYXZhZWVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZUphdmFlZVBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gSmF2YWVlVmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKYXZhZWVQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVKYXZhZWVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc3BsYXlOYW1lX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzcGxheU5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzcGxheU5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVqYkxvY2FsUmVmKCkgewotCQlyZXR1cm4gZWpiTG9jYWxSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9FamJSZWZUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0xvY2FsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9FamJMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFamJSZWYoKSB7Ci0JCXJldHVybiBlamJSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9FamJSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9SZW1vdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfRWpiTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVtcHR5VHlwZSgpIHsKLQkJcmV0dXJuIGVtcHR5VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbXB0eVR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbXB0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVudkVudHJ5KCkgewotCQlyZXR1cm4gZW52RW50cnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9FbnZFbnRyeU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X0VudkVudHJ5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRW52RW50cnlWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGljb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvbl9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpY29uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvbl9MYXJnZUljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpY29uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWljb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJY29uX0xhbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpY29uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbmplY3Rpb25UYXJnZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpZmVjeWNsZUNhbGxiYWNrKCkgewotCQlyZXR1cm4gbGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaWZlY3ljbGVDYWxsYmFja0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpc3RlbmVyX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9QYXJhbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9QYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3J0Q29tcG9uZW50UmVmKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvcGVydHlUeXBlKCkgewotCQlyZXR1cm4gcHJvcGVydHlUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5VHlwZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlUeXBlX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlRW52UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlUmVmKCkgewotCQlyZXR1cm4gcmVzb3VyY2VSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJ1bkFzKCkgewotCQlyZXR1cm4gcnVuQXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UnVuQXNfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcnVuQXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSdW5Bc19Sb2xlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJ1bkFzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UnVuQXNfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlydW5Bc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlKCkgewotCQlyZXR1cm4gc2VjdXJpdHlSb2xlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Um9sZVJlZigpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlUmVmKCkgewotCQlyZXR1cm4gc2VydmljZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZlR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9IYW5kbGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9IYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlUmVmSGFuZGxlcigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkgewotCQlyZXR1cm4gc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVcmxQYXR0ZXJuVHlwZSgpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm5UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXJsUGF0dGVyblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RWpiUmVmVHlwZSgpIHsKLQkJcmV0dXJuIGVqYlJlZlR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RW52RW50cnlUeXBlKCkgewotCQlyZXR1cm4gZW52RW50cnlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXNBdXRoVHlwZSgpIHsKLQkJcmV0dXJuIHJlc0F1dGhUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREZXdleVZlcnNpb25UeXBlKCkgewotCQlyZXR1cm4gZGV3ZXlWZXJzaW9uVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVKQkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWpiUmVmTmFtZVR5cGUoKSB7Ci0JCXJldHVybiBlamJSZWZOYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVqYlJlZlR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBlamJSZWZUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RW52RW50cnlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gZW52RW50cnlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZENsYXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEhvbWUoKSB7Ci0JCXJldHVybiBob21lRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SmF2YUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBqYXZhSWRlbnRpZmllckVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gamF2YVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRKTkRJTmFtZSgpIHsKLQkJcmV0dXJuIGpuZGlOYW1lRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TG9jYWwoKSB7Ci0JCXJldHVybiBsb2NhbEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25MaW5rRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBhdGhUeXBlKCkgewotCQlyZXR1cm4gcGF0aFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJlbW90ZSgpIHsKLQkJcmV0dXJuIHJlbW90ZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJlc0F1dGhUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gcmVzQXV0aFR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gcmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJvbGVOYW1lKCkgewotCQlyZXR1cm4gcm9sZU5hbWVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKCkgewotCQlyZXR1cm4gc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm5FRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUcnVlRmFsc2VUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZUZhbHNlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRydWVGYWxzZVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB0cnVlRmFsc2VUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVGYWN0b3J5IGdldEphdmFlZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmF2YWVlRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlkZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19MQU5HKTsKLQotCQlkaXNwbGF5TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNQTEFZX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc3BsYXlOYW1lRUNsYXNzLCBESVNQTEFZX05BTUVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19MQU5HKTsKLQotCQllamJMb2NhbFJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTE9DQUxfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0xPQ0FMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fRUpCX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fSUQpOwotCi0JCWVqYlJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19FSkJfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fRUpCX1JFRl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0hPTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fUkVNT1RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0VKQl9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0lEKTsKLQotCQllbXB0eVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU1QVFlfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW1wdHlUeXBlRUNsYXNzLCBFTVBUWV9UWVBFX19JRCk7Ci0KLQkJZW52RW50cnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU5WX0VOVFJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0lEKTsKLQotCQlpY29uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGljb25FQ2xhc3MsIElDT05fX1NNQUxMX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGljb25FQ2xhc3MsIElDT05fX0xBUkdFX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGljb25FQ2xhc3MsIElDT05fX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpY29uRUNsYXNzLCBJQ09OX19MQU5HKTsKLQotCQlpbmplY3Rpb25UYXJnZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5KRUNUSU9OX1RBUkdFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLCBJTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbmplY3Rpb25UYXJnZXRFQ2xhc3MsIElOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRSk7Ci0KLQkJbGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTElGRUNZQ0xFX0NBTExCQUNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaWZlY3ljbGVDYWxsYmFja0VDbGFzcywgTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzLCBMSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0QpOwotCi0JCWxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJU1RFTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlzdGVuZXJFQ2xhc3MsIExJU1RFTkVSX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0lEKTsKLQotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQpOwotCi0JCW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVVNBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRCk7Ci0KLQkJcGFyYW1WYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQVJBTV9WQUxVRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX1BBUkFNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX0lEKTsKLQotCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSUQpOwotCi0JCXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTSVNURU5DRV9VTklUX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX1JFRl9fSUQpOwotCi0JCXBvcnRDb21wb25lbnRSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9DT01QT05FTlRfUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fSUQpOwotCi0JCXByb3BlcnR5VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eVR5cGVFQ2xhc3MsIFBST1BFUlRZX1RZUEVfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5VHlwZUVDbGFzcywgUFJPUEVSVFlfVFlQRV9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5VHlwZUVDbGFzcywgUFJPUEVSVFlfVFlQRV9fSUQpOwotCi0JCXJlc291cmNlRW52UmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX0VOVl9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fSUQpOwotCi0JCXJlc291cmNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19SRVNfQVVUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fSUQpOwotCi0JCXJ1bkFzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJVTl9BUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocnVuQXNFQ2xhc3MsIFJVTl9BU19fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShydW5Bc0VDbGFzcywgUlVOX0FTX19ST0xFX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJ1bkFzRUNsYXNzLCBSVU5fQVNfX0lEKTsKLQotCQlzZWN1cml0eVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlSb2xlRUNsYXNzLCBTRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVJvbGVFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfX0lEKTsKLQotCQlzZWN1cml0eVJvbGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfUk9MRV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0lEKTsKLQotCQlzZXJ2aWNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1dTRExfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0hBTkRMRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fSUQpOwotCi0JCXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGX0hBTkRMRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX1JPTEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lEKTsKLQotCQlzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19JRCk7Ci0KLQkJc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSUQpOwotCi0JCXVybFBhdHRlcm5UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFVSTF9QQVRURVJOX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVUkxfUEFUVEVSTl9UWVBFX19WQUxVRSk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWVqYlJlZlR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVKQl9SRUZfVFlQRSk7Ci0JCWVudkVudHJ5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRU5WX0VOVFJZX1RZUEUpOwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSk7Ci0JCXBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSk7Ci0JCXJlc0F1dGhUeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfQVVUSF9UWVBFKTsKLQkJcmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJZGV3ZXlWZXJzaW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShERVdFWV9WRVJTSU9OX1RZUEUpOwotCQllamJMaW5rRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9MSU5LKTsKLQkJZWpiUmVmTmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRUpCX1JFRl9OQU1FX1RZUEUpOwotCQllamJSZWZUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9SRUZfVFlQRV9PQkpFQ1QpOwotCQllbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRU5WX0VOVFJZX1RZUEVfT0JKRUNUKTsKLQkJZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEUpOwotCQlob21lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEhPTUUpOwotCQlqYXZhSWRlbnRpZmllckVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKQVZBX0lERU5USUZJRVIpOwotCQlqYXZhVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKQVZBX1RZUEUpOwotCQlqbmRpTmFtZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKTkRJX05BTUUpOwotCQlsb2NhbEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0NBTCk7Ci0JCWxvY2FsSG9tZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0NBTF9IT01FKTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uTGlua0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTkspOwotCQltZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRSk7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEVfT0JKRUNUKTsKLQkJcGF0aFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUEFUSF9UWVBFKTsKLQkJcGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfT0JKRUNUKTsKLQkJcmVtb3RlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJFTU9URSk7Ci0JCXJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJFU19BVVRIX1RZUEVfT0JKRUNUKTsKLQkJcmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRVNfU0hBUklOR19TQ09QRV9UWVBFX09CSkVDVCk7Ci0JCXJvbGVOYW1lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJPTEVfTkFNRSk7Ci0JCXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX0xJU1RfVFlQRSk7Ci0JCXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSk7Ci0JCXNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRSk7Ci0JCXNlcnZpY2VSZWZRbmFtZVBhdHRlcm5FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTik7Ci0JCXRydWVGYWxzZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJVRV9GQUxTRV9UWVBFKTsKLQkJdHJ1ZUZhbHNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUUlVFX0ZBTFNFX1RZUEVfT0JKRUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTE5hbWVzcGFjZVBhY2thZ2UgdGhlWE1MTmFtZXNwYWNlUGFja2FnZSA9IChYTUxOYW1lc3BhY2VQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTE5hbWVzcGFjZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UuZ2V0TGFuZ1R5cGUoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBEaXNwbGF5TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzcGxheU5hbWVfTGFuZygpLCB0aGVYTUxOYW1lc3BhY2VQYWNrYWdlLmdldExhbmdUeXBlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJMb2NhbFJlZkVDbGFzcywgRWpiTG9jYWxSZWYuY2xhc3MsICJFamJMb2NhbFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJMb2NhbFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0VqYlJlZk5hbWUoKSwgdGhpcy5nZXRFamJSZWZOYW1lVHlwZSgpLCAiZWpiUmVmTmFtZSIsIG51bGwsIDEsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJSZWZUeXBlKCksIHRoaXMuZ2V0RWpiUmVmVHlwZSgpLCAiZWpiUmVmVHlwZSIsICJFbnRpdHkiLCAwLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0xvY2FsSG9tZSgpLCB0aGlzLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0xvY2FsKCksIHRoaXMuZ2V0TG9jYWwoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0VqYkxpbmsoKSwgdGhpcy5nZXRFSkJMaW5rKCksICJlamJMaW5rIiwgbnVsbCwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiTG9jYWxSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVqYlJlZkVDbGFzcywgRWpiUmVmLmNsYXNzLCAiRWpiUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRWpiUmVmTmFtZSgpLCB0aGlzLmdldEVqYlJlZk5hbWVUeXBlKCksICJlamJSZWZOYW1lIiwgbnVsbCwgMSwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRWpiUmVmVHlwZSgpLCB0aGlzLmdldEVqYlJlZlR5cGUoKSwgImVqYlJlZlR5cGUiLCAiRW50aXR5IiwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0hvbWUoKSwgdGhpcy5nZXRIb21lKCksICJob21lIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfUmVtb3RlKCksIHRoaXMuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9FamJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCAiZWpiTGluayIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZW1wdHlUeXBlRUNsYXNzLCBFbXB0eVR5cGUuY2xhc3MsICJFbXB0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW1wdHlUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVtcHR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZW52RW50cnlFQ2xhc3MsIEVudkVudHJ5LmNsYXNzLCAiRW52RW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeU5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAiZW52RW50cnlOYW1lIiwgbnVsbCwgMSwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0VudkVudHJ5VHlwZSgpLCB0aGlzLmdldEVudkVudHJ5VHlwZSgpLCAiZW52RW50cnlUeXBlIiwgImphdmEubGFuZy5Cb29sZWFuIiwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeVZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZW52RW50cnlWYWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpY29uRUNsYXNzLCBJY29uLmNsYXNzLCAiSWNvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX1NtYWxsSWNvbigpLCB0aGlzLmdldFBhdGhUeXBlKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX0xhcmdlSWNvbigpLCB0aGlzLmdldFBhdGhUeXBlKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEljb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9MYW5nKCksIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UuZ2V0TGFuZ1R5cGUoKSwgImxhbmciLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLCBJbmplY3Rpb25UYXJnZXQuY2xhc3MsICJJbmplY3Rpb25UYXJnZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldENsYXNzKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImluamVjdGlvblRhcmdldENsYXNzIiwgbnVsbCwgMSwgMSwgSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0TmFtZSgpLCB0aGlzLmdldEphdmFJZGVudGlmaWVyKCksICJpbmplY3Rpb25UYXJnZXROYW1lIiwgbnVsbCwgMSwgMSwgSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAiTGlmZWN5Y2xlQ2FsbGJhY2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJsaWZlY3ljbGVDYWxsYmFja0NsYXNzIiwgbnVsbCwgMCwgMSwgTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCksIHRoaXMuZ2V0SmF2YUlkZW50aWZpZXIoKSwgImxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kIiwgbnVsbCwgMSwgMSwgTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsaXN0ZW5lckVDbGFzcywgTGlzdGVuZXIuY2xhc3MsICJMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlzdGVuZXJfSWNvbnMoKSwgdGhpcy5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImxpc3RlbmVyQ2xhc3MiLCBudWxsLCAxLCAxLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlzdGVuZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25fRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJtZXNzYWdlRGVzdGluYXRpb25OYW1lIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlKCksICJtZXNzYWdlRGVzdGluYXRpb25UeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIiwgIkNvbnN1bWVzIiwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCksICJtZXNzYWdlRGVzdGluYXRpb25MaW5rIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwYXJhbVZhbHVlRUNsYXNzLCBQYXJhbVZhbHVlLmNsYXNzLCAiUGFyYW1WYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1BhcmFtTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGFyYW1OYW1lIiwgbnVsbCwgMSwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1WYWx1ZV9QYXJhbVZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFyYW1WYWx1ZSIsIG51bGwsIDEsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICJQZXJzaXN0ZW5jZUNvbnRleHRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgInBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUiLCBudWxsLCAxLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwZXJzaXN0ZW5jZVVuaXROYW1lIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpLCB0aGlzLmdldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSwgInBlcnNpc3RlbmNlQ29udGV4dFR5cGUiLCAiVHJhbnNhY3Rpb24iLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0UHJvcGVydHlUeXBlKCksIG51bGwsICJwZXJzaXN0ZW5jZVByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcywgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAiUGVyc2lzdGVuY2VVbml0UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIiwgbnVsbCwgMSwgMSwgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGVyc2lzdGVuY2VVbml0TmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIlBvcnRDb21wb25lbnRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9FbmFibGVNdG9tKCksIHRoaXMuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZW5hYmxlTXRvbSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicG9ydENvbXBvbmVudExpbmsiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHByb3BlcnR5VHlwZUVDbGFzcywgUHJvcGVydHlUeXBlLmNsYXNzLCAiUHJvcGVydHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFByb3BlcnR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlUeXBlX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAxLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlc291cmNlRW52UmVmRUNsYXNzLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIlJlc291cmNlRW52UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgInJlc291cmNlRW52UmVmTmFtZSIsIG51bGwsIDEsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAicmVzb3VyY2VFbnZSZWZUeXBlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlc291cmNlUmVmRUNsYXNzLCBSZXNvdXJjZVJlZi5jbGFzcywgIlJlc291cmNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzUmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJyZXNSZWZOYW1lIiwgbnVsbCwgMSwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1R5cGUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAicmVzVHlwZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCksIHRoaXMuZ2V0UmVzQXV0aFR5cGUoKSwgInJlc0F1dGgiLCAiQXBwbGljYXRpb24iLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpLCB0aGlzLmdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSwgInJlc1NoYXJpbmdTY29wZSIsICJTaGFyZWFibGUiLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJ1bkFzRUNsYXNzLCBSdW5Bcy5jbGFzcywgIlJ1bkFzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UnVuQXNfUm9sZU5hbWUoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZU5hbWUiLCBudWxsLCAxLCAxLCBSdW5Bcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UnVuQXNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Um9sZUVDbGFzcywgU2VjdXJpdHlSb2xlLmNsYXNzLCAiU2VjdXJpdHlSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZU5hbWUiLCBudWxsLCAxLCAxLCBTZWN1cml0eVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAiU2VjdXJpdHlSb2xlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfUm9sZU5hbWUoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZU5hbWUiLCBudWxsLCAxLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTGluaygpLCB0aGlzLmdldFJvbGVOYW1lKCksICJyb2xlTGluayIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkVDbGFzcywgU2VydmljZVJlZi5jbGFzcywgIlNlcnZpY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9JY29ucygpLCB0aGlzLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJzZXJ2aWNlUmVmTmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlUmVmVHlwZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0QW55VVJJKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRRTmFtZSgpLCAic2VydmljZVFuYW1lIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCB0aGlzLmdldFBvcnRDb21wb25lbnRSZWYoKSwgbnVsbCwgInBvcnRDb21wb25lbnRSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlckNoYWlucygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCksIG51bGwsICJoYW5kbGVyQ2hhaW5zIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKSwgdGhpcy5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiaGFuZGxlck5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImhhbmRsZXJDbGFzcyIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Jbml0UGFyYW1zKCksIHRoaXMuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwSGVhZGVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRRTmFtZSgpLCAic29hcEhlYWRlcnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Qb3J0TmFtZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBvcnROYW1lcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlckNoYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCksIHRoaXMuZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpLCAic2VydmljZU5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSwgdGhpcy5nZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCksICJwb3J0TmFtZVBhdHRlcm4iLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKSwgInByb3RvY29sQmluZGluZ3MiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0hhbmRsZXJzKCksIHRoaXMuZ2V0U2VydmljZVJlZkhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMSwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcywgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCksIHRoaXMuZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3ModXJsUGF0dGVyblR5cGVFQ2xhc3MsIFVybFBhdHRlcm5UeXBlLmNsYXNzLCAiVXJsUGF0dGVyblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXJsUGF0dGVyblR5cGVfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFVybFBhdHRlcm5UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuY2xhc3MsICJFamJSZWZUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5FTlRJVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuU0VTU0lPTl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5jbGFzcywgIkVudkVudHJ5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfQllURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0NIQVJBQ1RFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX1NUUklOR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX1NIT1JUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfSU5URUdFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0xPTkdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0RPVUJMRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5QUk9EVUNFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5jbGFzcywgIlBlcnNpc3RlbmNlQ29udGV4dFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VDb250ZXh0VHlwZUVFbnVtLCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLlRSQU5TQUNUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VDb250ZXh0VHlwZUVFbnVtLCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLkVYVEVOREVEX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXNBdXRoVHlwZUVFbnVtLCBSZXNBdXRoVHlwZS5jbGFzcywgIlJlc0F1dGhUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlRUVudW0sIFJlc0F1dGhUeXBlLkFQUExJQ0FUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuY2xhc3MsICJSZXNTaGFyaW5nU2NvcGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5TSEFSRUFCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuVU5TSEFSRUFCTEVfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoZGV3ZXlWZXJzaW9uVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRGV3ZXlWZXJzaW9uVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJMaW5rRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFSkJMaW5rIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVqYlJlZk5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFamJSZWZOYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJSZWZUeXBlT2JqZWN0RURhdGFUeXBlLCBFamJSZWZUeXBlLmNsYXNzLCAiRWpiUmVmVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVudkVudHJ5VHlwZU9iamVjdEVEYXRhVHlwZSwgRW52RW50cnlUeXBlLmNsYXNzLCAiRW52RW50cnlUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGhvbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkhvbWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoamF2YUlkZW50aWZpZXJFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkphdmFJZGVudGlmaWVyIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGphdmFUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKYXZhVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShqbmRpTmFtZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSk5ESU5hbWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobG9jYWxFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkxvY2FsIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGxvY2FsSG9tZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTG9jYWxIb21lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocGF0aFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlBhdGhUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RFRGF0YVR5cGUsIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVtb3RlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJSZW1vdGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVzQXV0aFR5cGVPYmplY3RFRGF0YVR5cGUsIFJlc0F1dGhUeXBlLmNsYXNzLCAiUmVzQXV0aFR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShyZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJvbGVOYW1lRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJSb2xlTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZpY2VSZWZRbmFtZVBhdHRlcm5FRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlNlcnZpY2VSZWZRbmFtZVBhdHRlcm4iLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodHJ1ZUZhbHNlVHlwZUVEYXRhVHlwZSwgYm9vbGVhbi5jbGFzcywgIlRydWVGYWxzZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodHJ1ZUZhbHNlVHlwZU9iamVjdEVEYXRhVHlwZSwgQm9vbGVhbi5jbGFzcywgIlRydWVGYWxzZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOyAvLyROT04tTkxTLTEkCQkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRpb25fTGFuZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsYW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXdleVZlcnNpb25UeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJkZXdleS12ZXJzaW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJcXC4/WzAtOV0rKFxcLlswLTldKykqIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGlzcGxheU5hbWVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzcGxheU5hbWVfTGFuZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsYW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJMaW5rRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlamItbGlua1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJMb2NhbFJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLWxvY2FsLXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0VqYlJlZk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0VqYlJlZlR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0xvY2FsSG9tZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWwtaG9tZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0xvY2FsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0VqYkxpbmsoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1saW5rIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiTG9jYWxSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiUmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlamItcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYlJlZl9FamJSZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfRWpiUmVmVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlZi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0hvbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhvbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfUmVtb3RlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZW1vdGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfRWpiTGluaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWxpbmsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJSZWZOYW1lVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlZi1uYW1lVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYlJlZlR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlZi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlZi10eXBlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiZWpiLXJlZi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVtcHR5VHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW1wdHlUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZW1wdHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVtcHR5VHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVudkVudHJ5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbnYtZW50cnlUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudi1lbnRyeS10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudkVudHJ5X0VudkVudHJ5VmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudi1lbnRyeS12YWx1ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudkVudHJ5X0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVudkVudHJ5VHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChmdWxseVF1YWxpZmllZENsYXNzVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGhvbWVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImhvbWVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaWNvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaWNvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEljb25fU21hbGxJY29uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzbWFsbC1pY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEljb25fTGFyZ2VJY29uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsYXJnZS1pY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SWNvbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEljb25fTGFuZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsYW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpbmplY3Rpb25UYXJnZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXRDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldC1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoamF2YUlkZW50aWZpZXJFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImphdmEtaWRlbnRpZmllclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiKCR8X3xcXHB7TH0pKFxccHtMfXxcXHB7TmR9fF98JCkqIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoamF2YVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImphdmEtdHlwZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiW15cXHB7Wn1dKiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGpuZGlOYW1lRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJqbmRpLW5hbWVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxpZmVjeWNsZS1jYWxsYmFja1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGlmZWN5Y2xlLWNhbGxiYWNrLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxpZmVjeWNsZS1jYWxsYmFjay1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobGlzdGVuZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxpc3RlbmVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlzdGVuZXJfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMaXN0ZW5lcl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsaXN0ZW5lci1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExpc3RlbmVyX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobG9jYWxFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvY2FsVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvY2FsSG9tZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibG9jYWwtaG9tZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWVzc2FnZURlc3RpbmF0aW9uTGlua0VEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwYXJhbVZhbHVlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwYXJhbS12YWx1ZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwYXJhbS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBhcmFtVmFsdWVfUGFyYW1WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGFyYW0tdmFsdWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQYXJhbVZhbHVlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGF0aFR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInBhdGhUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlUHJvcGVydGllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtcHJvcGVydHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocG9ydENvbXBvbmVudFJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicG9ydC1jb21wb25lbnQtcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBvcnRDb21wb25lbnRSZWZfRW5hYmxlTXRvbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW5hYmxlLW10b20iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9ydC1jb21wb25lbnQtbGluayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBvcnRDb21wb25lbnRSZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9wZXJ0eVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInByb3BlcnR5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5VHlwZV9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidmFsdWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eVR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZW1vdGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlbW90ZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXNBdXRoVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZXMtYXV0aFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZXMtYXV0aFR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInJlcy1hdXRoVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlc291cmNlRW52UmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1lbnYtcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlRW52UmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VFbnZSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlRW52UmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVzb3VyY2VSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZVJlZl9SZXNSZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXMtcmVmLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfUmVzVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXMtYXV0aCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzLXNoYXJpbmctc2NvcGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlcy1zaGFyaW5nLXNjb3BlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzLXNoYXJpbmctc2NvcGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJyZXMtc2hhcmluZy1zY29wZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlTmFtZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicm9sZS1uYW1lVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJ1bkFzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJydW4tYXNUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSdW5Bc19Sb2xlTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicm9sZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UnVuQXNfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZWN1cml0eVJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyb2xlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUtcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVSZWZfUm9sZU5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJvbGUtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVSZWZfUm9sZUxpbmsoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJvbGUtbGluayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1pbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1yZWYtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ3c2RsLWZpbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiamF4cnBjLW1hcHBpbmctZmlsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1xbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3J0LWNvbXBvbmVudC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaGFuZGxlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX0hhbmRsZXJDaGFpbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhhbmRsZXItY2hhaW5zIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJoYW5kbGVyLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlckNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJoYW5kbGVyLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5pdC1wYXJhbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwSGVhZGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic29hcC1oZWFkZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcFJvbGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzb2FwLXJvbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3J0LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLW5hbWUtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3J0LW5hbWUtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJvdG9jb2wtYmluZGluZ3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0hhbmRsZXJzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJoYW5kbGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaGFuZGxlci1jaGFpbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiaXRlbVR5cGUiLCAic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibWVtYmVyVHlwZXMiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2FueVVSSSBzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX3Byb3RvY29sLVVSSUFsaWFzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICIjIy4rIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlFuYW1lUGF0dGVybkVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJcXCp8KFtcXGktWzpdXVtcXGMtWzpdXSo6KT9bXFxpLVs6XV1bXFxjLVs6XV0qXFwqPyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRydWVGYWxzZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRydWUtZmFsc2VUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNib29sZWFuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiKHRydWV8ZmFsc2UpIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cnVlRmFsc2VUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cnVlLWZhbHNlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAidHJ1ZS1mYWxzZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidXJsLXBhdHRlcm5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRVcmxQYXR0ZXJuVHlwZV9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL0phdmFlZVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpZmVjeWNsZUNhbGxiYWNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY2NmM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpZmVjeWNsZUNhbGxiYWNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpZmVjeWNsZUNhbGxiYWNrSW1wbCNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpZmVjeWNsZUNhbGxiYWNrSW1wbCNnZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpZmVjeWNsZUNhbGxiYWNrSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTGlmZWN5Y2xlQ2FsbGJhY2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPSBMSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPSBMSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpZmVjeWNsZUNhbGxiYWNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuTElGRUNZQ0xFX0NBTExCQUNLOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpIHsKLQkJcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyhTdHJpbmcgbmV3TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcykgewotCQlTdHJpbmcgb2xkTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyA9IGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3M7Ci0JCWxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPSBuZXdMaWZlY3ljbGVDYWxsYmFja0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTLCBvbGRMaWZlY3ljbGVDYWxsYmFja0NsYXNzLCBsaWZlY3ljbGVDYWxsYmFja0NsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpIHsKLQkJcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKFN0cmluZyBuZXdMaWZlY3ljbGVDYWxsYmFja01ldGhvZCkgewotCQlTdHJpbmcgb2xkTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPSBsaWZlY3ljbGVDYWxsYmFja01ldGhvZDsKLQkJbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPSBuZXdMaWZlY3ljbGVDYWxsYmFja01ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0QsIG9sZExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kLCBsaWZlY3ljbGVDYWxsYmFja01ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTOgotCQkJCXNldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRDoKLQkJCQlzZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTOgotCQkJCXNldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EOgotCQkJCXNldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKExJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTOgotCQkJCXJldHVybiBMSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgIT0gbnVsbCA6ICFMSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRDoKLQkJCQlyZXR1cm4gTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgIT0gbnVsbCA6ICFMSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EX0VERUZBVUxULmVxdWFscyhsaWZlY3ljbGVDYWxsYmFja01ldGhvZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsaWZlY3ljbGVDYWxsYmFja0NsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTGlzdGVuZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZmIwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxpc3RlbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCNnZXRMaXN0ZW5lckNsYXNzIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXN0ZW5lckNsYXNzKCkgPGVtPkxpc3RlbmVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXN0ZW5lckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5FUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXN0ZW5lckNsYXNzKCkgPGVtPkxpc3RlbmVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXN0ZW5lckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpc3RlbmVyQ2xhc3MgPSBMSVNURU5FUl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3RlbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuTElTVEVORVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJDbGFzcyhTdHJpbmcgbmV3TGlzdGVuZXJDbGFzcykgewotCQlTdHJpbmcgb2xkTGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7Ci0JCWxpc3RlbmVyQ2xhc3MgPSBuZXdMaXN0ZW5lckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUywgb2xkTGlzdGVuZXJDbGFzcywgbGlzdGVuZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCXJldHVybiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlzZXRMaXN0ZW5lckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlzZXRMaXN0ZW5lckNsYXNzKExJU1RFTkVSX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCXJldHVybiBMSVNURU5FUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gbGlzdGVuZXJDbGFzcyAhPSBudWxsIDogIUxJU1RFTkVSX0NMQVNTX0VERUZBVUxULmVxdWFscyhsaXN0ZW5lckNsYXNzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsaXN0ZW5lckNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxpc3RlbmVyQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTGlzdGVuZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzRiMmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEZXN0aW5hdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uTmFtZSA9IE1FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZShTdHJpbmcgbmV3TWVzc2FnZURlc3RpbmF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZURlc3RpbmF0aW9uTmFtZSA9IG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWU7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPSBuZXdNZXNzYWdlRGVzdGluYXRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fTkFNRSwgb2xkTWVzc2FnZURlc3RpbmF0aW9uTmFtZSwgbWVzc2FnZURlc3RpbmF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUU6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZShNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uTmFtZSAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZURlc3RpbmF0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3NTU0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA9IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25UeXBlID0gTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX0VERUZBVUxUID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA9IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uTGluayA9IE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldHMoKSA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZShTdHJpbmcgbmV3TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA9IG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWU7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPSBuZXdNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FLCBvbGRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lLCBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKFN0cmluZyBuZXdNZXNzYWdlRGVzdGluYXRpb25UeXBlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlRGVzdGluYXRpb25UeXBlID0gbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSwgb2xkTWVzc2FnZURlc3RpbmF0aW9uVHlwZSwgbWVzc2FnZURlc3RpbmF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbmV3TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UpIHsKLQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlID0gbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2U7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlID0gbmV3TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPT0gbnVsbCA/IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfRURFRkFVTFQgOiBuZXdNZXNzYWdlRGVzdGluYXRpb25Vc2FnZTsKLQkJYm9vbGVhbiBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQ7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVVNBR0UsIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlLCBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSwgIW9sZE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA9IG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlOwotCQlib29sZWFuIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCA9IG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldDsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX0VERUZBVUxUOwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFLCBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSwgTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9FREVGQVVMVCwgb2xkTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nIG5ld01lc3NhZ2VEZXN0aW5hdGlvbkxpbmspIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPSBtZXNzYWdlRGVzdGluYXRpb25MaW5rOwotCQltZXNzYWdlRGVzdGluYXRpb25MaW5rID0gbmV3TWVzc2FnZURlc3RpbmF0aW9uTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LLCBvbGRNZXNzYWdlRGVzdGluYXRpb25MaW5rLCBtZXNzYWdlRGVzdGluYXRpb25MaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJfQotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVVNBR0U6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUU6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZShNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFOgotCQkJCXVuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FOgotCQkJCXJldHVybiBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lICE9IG51bGwgOiAhTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlRGVzdGluYXRpb25UeXBlICE9IG51bGwgOiAhTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhtZXNzYWdlRGVzdGluYXRpb25UeXBlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRToKLQkJCQlyZXR1cm4gaXNTZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uTGluayAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uTGluayk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdlRGVzdGluYXRpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VFU2V0KSByZXN1bHQuYXBwZW5kKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdlRGVzdGluYXRpb25MaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNmY5ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQYXJhbVZhbHVlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbU5hbWUoKSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtTmFtZSA9IFBBUkFNX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1WYWx1ZSgpIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1WYWx1ZSgpIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbVZhbHVlID0gUEFSQU1fVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbVZhbHVlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUEFSQU1fVkFMVUU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1OYW1lKCkgewotCQlyZXR1cm4gcGFyYW1OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgbmV3UGFyYW1OYW1lKSB7Ci0JCVN0cmluZyBvbGRQYXJhbU5hbWUgPSBwYXJhbU5hbWU7Ci0JCXBhcmFtTmFtZSA9IG5ld1BhcmFtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fTkFNRSwgb2xkUGFyYW1OYW1lLCBwYXJhbU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIG5ld1BhcmFtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlOwotCQlwYXJhbVZhbHVlID0gbmV3UGFyYW1WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUUsIG9sZFBhcmFtVmFsdWUsIHBhcmFtVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZShQQVJBTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoUEFSQU1fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBQQVJBTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwYXJhbU5hbWUgIT0gbnVsbCA6ICFQQVJBTV9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJhbU5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gUEFSQU1fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVmFsdWUgIT0gbnVsbCA6ICFQQVJBTV9WQUxVRV9FREVGQVVMVC5lcXVhbHMocGFyYW1WYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFyYW1OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BhcmFtVmFsdWVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWFlMGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwjZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzIDxlbT5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlQ29udGV4dFJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lID0gUEVSU0lTVEVOQ0VfVU5JVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX0VERUZBVUxUID0gUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTl9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFBlcnNpc3RlbmNlIENvbnRleHQgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlUHJvcGVydGllcygpIDxlbT5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoU3RyaW5nIG5ld1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgPSBwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lOwotCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lID0gbmV3UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRSwgb2xkUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSwgcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcgbmV3UGVyc2lzdGVuY2VVbml0TmFtZSkgewotCQlTdHJpbmcgb2xkUGVyc2lzdGVuY2VVbml0TmFtZSA9IHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0JCXBlcnNpc3RlbmNlVW5pdE5hbWUgPSBuZXdQZXJzaXN0ZW5jZVVuaXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUsIG9sZFBlcnNpc3RlbmNlVW5pdE5hbWUsIHBlcnNpc3RlbmNlVW5pdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgbmV3UGVyc2lzdGVuY2VDb250ZXh0VHlwZSkgewotCQlQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIG9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlOwotCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gbmV3UGVyc2lzdGVuY2VDb250ZXh0VHlwZSA9PSBudWxsID8gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX0VERUZBVUxUIDogbmV3UGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLQkJYm9vbGVhbiBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCA9IHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0OwotCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSwgb2xkUGVyc2lzdGVuY2VDb250ZXh0VHlwZSwgcGVyc2lzdGVuY2VDb250ZXh0VHlwZSwgIW9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgewotCQlQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIG9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlOwotCQlib29sZWFuIG9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0ID0gcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQ7Ci0JCXBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfRURFRkFVTFQ7Ci0JCXBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFLCBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLCBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfRURFRkFVTFQsIG9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkgewotCQlpZiAocGVyc2lzdGVuY2VQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQcm9wZXJ0eVR5cGUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJfQotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRToKLQkJCQlzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKChQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TmFtZShQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFOgotCQkJCXVuc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRToKLQkJCQlyZXR1cm4gUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSAhPSBudWxsIDogIVBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJcmV0dXJuIFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGVyc2lzdGVuY2VVbml0TmFtZSAhPSBudWxsIDogIVBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVC5lcXVhbHMocGVyc2lzdGVuY2VVbml0TmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlUHJvcGVydGllcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyc2lzdGVuY2VVbml0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwZXJzaXN0ZW5jZVVuaXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQocGVyc2lzdGVuY2VDb250ZXh0VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGM5OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VVbml0UmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXRSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPSBQRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZSA9IFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldHMoKSA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfVU5JVF9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZShTdHJpbmcgbmV3UGVyc2lzdGVuY2VVbml0UmVmTmFtZSkgewotCQlTdHJpbmcgb2xkUGVyc2lzdGVuY2VVbml0UmVmTmFtZSA9IHBlcnNpc3RlbmNlVW5pdFJlZk5hbWU7Ci0JCXBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPSBuZXdQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FLCBvbGRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lLCBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFN0cmluZyBuZXdQZXJzaXN0ZW5jZVVuaXROYW1lKSB7Ci0JCVN0cmluZyBvbGRQZXJzaXN0ZW5jZVVuaXROYW1lID0gcGVyc2lzdGVuY2VVbml0TmFtZTsKLQkJcGVyc2lzdGVuY2VVbml0TmFtZSA9IG5ld1BlcnNpc3RlbmNlVW5pdE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRSwgb2xkUGVyc2lzdGVuY2VVbml0TmFtZSwgcGVyc2lzdGVuY2VVbml0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRToKLQkJCQlzZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlVW5pdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZShQRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRToKLQkJCQlzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FOgotCQkJCXJldHVybiBQRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lICE9IG51bGwgOiAhUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMocGVyc2lzdGVuY2VVbml0UmVmTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRToKLQkJCQlyZXR1cm4gUEVSU0lTVEVOQ0VfVU5JVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwZXJzaXN0ZW5jZVVuaXROYW1lICE9IG51bGwgOiAhUEVSU0lTVEVOQ0VfVU5JVF9OQU1FX0VERUZBVUxULmVxdWFscyhwZXJzaXN0ZW5jZVVuaXROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBlcnNpc3RlbmNlVW5pdFJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcnNpc3RlbmNlVW5pdE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGVyc2lzdGVuY2VVbml0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BlcnNpc3RlbmNlVW5pdFJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZDdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwjaXNFbmFibGVNdG9tIDxlbT5FbmFibGUgTXRvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwjZ2V0UG9ydENvbXBvbmVudExpbmsgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0Q29tcG9uZW50UmVmIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlTXRvbSgpIDxlbT5FbmFibGUgTXRvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbmFibGVNdG9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX01UT01fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlTXRvbSgpIDxlbT5FbmFibGUgTXRvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbmFibGVNdG9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVNdG9tID0gRU5BQkxFX01UT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVuYWJsZSBNdG9tIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVNdG9tRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rID0gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRDb21wb25lbnRSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QT1JUX0NPTVBPTkVOVF9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVNdG9tKCkgewotCQlyZXR1cm4gZW5hYmxlTXRvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVNdG9tKGJvb2xlYW4gbmV3RW5hYmxlTXRvbSkgewotCQlib29sZWFuIG9sZEVuYWJsZU10b20gPSBlbmFibGVNdG9tOwotCQllbmFibGVNdG9tID0gbmV3RW5hYmxlTXRvbTsKLQkJYm9vbGVhbiBvbGRFbmFibGVNdG9tRVNldCA9IGVuYWJsZU10b21FU2V0OwotCQllbmFibGVNdG9tRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTSwgb2xkRW5hYmxlTXRvbSwgZW5hYmxlTXRvbSwgIW9sZEVuYWJsZU10b21FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbmFibGVNdG9tKCkgewotCQlib29sZWFuIG9sZEVuYWJsZU10b20gPSBlbmFibGVNdG9tOwotCQlib29sZWFuIG9sZEVuYWJsZU10b21FU2V0ID0gZW5hYmxlTXRvbUVTZXQ7Ci0JCWVuYWJsZU10b20gPSBFTkFCTEVfTVRPTV9FREVGQVVMVDsKLQkJZW5hYmxlTXRvbUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT00sIG9sZEVuYWJsZU10b20sIEVOQUJMRV9NVE9NX0VERUZBVUxULCBvbGRFbmFibGVNdG9tRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RW5hYmxlTXRvbSgpIHsKLQkJcmV0dXJuIGVuYWJsZU10b21FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydENvbXBvbmVudExpbmsoKSB7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50TGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3J0Q29tcG9uZW50TGluayhTdHJpbmcgbmV3UG9ydENvbXBvbmVudExpbmspIHsKLQkJU3RyaW5nIG9sZFBvcnRDb21wb25lbnRMaW5rID0gcG9ydENvbXBvbmVudExpbms7Ci0JCXBvcnRDb21wb25lbnRMaW5rID0gbmV3UG9ydENvbXBvbmVudExpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LLCBvbGRQb3J0Q29tcG9uZW50TGluaywgcG9ydENvbXBvbmVudExpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NOgotCQkJCXJldHVybiBpc0VuYWJsZU10b20oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TGluaygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTToKLQkJCQlzZXRFbmFibGVNdG9tKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJc2V0UG9ydENvbXBvbmVudExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT006Ci0JCQkJdW5zZXRFbmFibGVNdG9tKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlzZXRQb3J0Q29tcG9uZW50TGluayhQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT006Ci0JCQkJcmV0dXJuIGlzU2V0RW5hYmxlTXRvbSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlyZXR1cm4gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCA9PSBudWxsID8gcG9ydENvbXBvbmVudExpbmsgIT0gbnVsbCA6ICFQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxULmVxdWFscyhwb3J0Q29tcG9uZW50TGluayk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVuYWJsZU10b206ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbmFibGVNdG9tRVNldCkgcmVzdWx0LmFwcGVuZChlbmFibGVNdG9tKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0Q29tcG9uZW50TGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwb3J0Q29tcG9uZW50TGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0Q29tcG9uZW50UmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyMzU0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5VHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5VHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9wZXJ0eVR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMDBlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCNnZXRSZXNvdXJjZUVudlJlZk5hbWUgPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldFJlc291cmNlRW52UmVmVHlwZSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VFbnZSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZk5hbWUoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VOVl9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZk5hbWUoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VFbnZSZWZOYW1lID0gUkVTT1VSQ0VfRU5WX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmVHlwZSgpIDxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU5WX1JFRl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmVHlwZSgpIDxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUVudlJlZlR5cGUgPSBSRVNPVVJDRV9FTlZfUkVGX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlRW52UmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfRU5WX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRW52UmVmTmFtZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUVudlJlZk5hbWUoU3RyaW5nIG5ld1Jlc291cmNlRW52UmVmTmFtZSkgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VFbnZSZWZOYW1lID0gcmVzb3VyY2VFbnZSZWZOYW1lOwotCQlyZXNvdXJjZUVudlJlZk5hbWUgPSBuZXdSZXNvdXJjZUVudlJlZk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FLCBvbGRSZXNvdXJjZUVudlJlZk5hbWUsIHJlc291cmNlRW52UmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VFbnZSZWZUeXBlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlRW52UmVmVHlwZShTdHJpbmcgbmV3UmVzb3VyY2VFbnZSZWZUeXBlKSB7Ci0JCVN0cmluZyBvbGRSZXNvdXJjZUVudlJlZlR5cGUgPSByZXNvdXJjZUVudlJlZlR5cGU7Ci0JCXJlc291cmNlRW52UmVmVHlwZSA9IG5ld1Jlc291cmNlRW52UmVmVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEUsIG9sZFJlc291cmNlRW52UmVmVHlwZSwgcmVzb3VyY2VFbnZSZWZUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewotCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfTkFNRToKLQkJCQlzZXRSZXNvdXJjZUVudlJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfVFlQRToKLQkJCQlzZXRSZXNvdXJjZUVudlJlZlR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX05BTUU6Ci0JCQkJc2V0UmVzb3VyY2VFbnZSZWZOYW1lKFJFU09VUkNFX0VOVl9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfVFlQRToKLQkJCQlzZXRSZXNvdXJjZUVudlJlZlR5cGUoUkVTT1VSQ0VfRU5WX1JFRl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX0VOVl9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VFbnZSZWZOYW1lICE9IG51bGwgOiAhUkVTT1VSQ0VfRU5WX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZUVudlJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gUkVTT1VSQ0VfRU5WX1JFRl9UWVBFX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZUVudlJlZlR5cGUgIT0gbnVsbCA6ICFSRVNPVVJDRV9FTlZfUkVGX1RZUEVfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlRW52UmVmVHlwZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVzb3VyY2VFbnZSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlRW52UmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VFbnZSZWZUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlRW52UmVmVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Jlc291cmNlRW52UmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGRhMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0UmVzUmVmTmFtZSA8ZW0+UmVzIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0UmVzVHlwZSA8ZW0+UmVzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRSZXNBdXRoIDxlbT5SZXMgQXV0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZVJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1JlZk5hbWUoKSA8ZW0+UmVzIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzUmVmTmFtZSgpIDxlbT5SZXMgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc1JlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzUmVmTmFtZSA9IFJFU19SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNUeXBlKCkgPGVtPlJlcyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNUeXBlKCkgPGVtPlJlcyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc1R5cGUgPSBSRVNfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNBdXRoKCkgPGVtPlJlcyBBdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlIFJFU19BVVRIX0VERUZBVUxUID0gUmVzQXV0aFR5cGUuQVBQTElDQVRJT05fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc0F1dGgoKSA8ZW0+UmVzIEF1dGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc0F1dGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXNBdXRoVHlwZSByZXNBdXRoID0gUkVTX0FVVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlcyBBdXRoIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNBdXRoRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1NoYXJpbmdTY29wZSgpIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgPSBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc1NoYXJpbmdTY29wZSA9IFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXMgU2hhcmluZyBTY29wZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzU2hhcmluZ1Njb3BlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzUmVmTmFtZSgpIHsKLQkJcmV0dXJuIHJlc1JlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzUmVmTmFtZShTdHJpbmcgbmV3UmVzUmVmTmFtZSkgewotCQlTdHJpbmcgb2xkUmVzUmVmTmFtZSA9IHJlc1JlZk5hbWU7Ci0JCXJlc1JlZk5hbWUgPSBuZXdSZXNSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1JFRl9OQU1FLCBvbGRSZXNSZWZOYW1lLCByZXNSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNUeXBlKCkgewotCQlyZXR1cm4gcmVzVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNUeXBlKFN0cmluZyBuZXdSZXNUeXBlKSB7Ci0JCVN0cmluZyBvbGRSZXNUeXBlID0gcmVzVHlwZTsKLQkJcmVzVHlwZSA9IG5ld1Jlc1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfVFlQRSwgb2xkUmVzVHlwZSwgcmVzVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNBdXRoVHlwZSBnZXRSZXNBdXRoKCkgewotCQlyZXR1cm4gcmVzQXV0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNBdXRoKFJlc0F1dGhUeXBlIG5ld1Jlc0F1dGgpIHsKLQkJUmVzQXV0aFR5cGUgb2xkUmVzQXV0aCA9IHJlc0F1dGg7Ci0JCXJlc0F1dGggPSBuZXdSZXNBdXRoID09IG51bGwgPyBSRVNfQVVUSF9FREVGQVVMVCA6IG5ld1Jlc0F1dGg7Ci0JCWJvb2xlYW4gb2xkUmVzQXV0aEVTZXQgPSByZXNBdXRoRVNldDsKLQkJcmVzQXV0aEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX0FVVEgsIG9sZFJlc0F1dGgsIHJlc0F1dGgsICFvbGRSZXNBdXRoRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzQXV0aCgpIHsKLQkJUmVzQXV0aFR5cGUgb2xkUmVzQXV0aCA9IHJlc0F1dGg7Ci0JCWJvb2xlYW4gb2xkUmVzQXV0aEVTZXQgPSByZXNBdXRoRVNldDsKLQkJcmVzQXV0aCA9IFJFU19BVVRIX0VERUZBVUxUOwotCQlyZXNBdXRoRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfQVVUSCwgb2xkUmVzQXV0aCwgUkVTX0FVVEhfRURFRkFVTFQsIG9sZFJlc0F1dGhFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNBdXRoKCkgewotCQlyZXR1cm4gcmVzQXV0aEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlKCkgewotCQlyZXR1cm4gcmVzU2hhcmluZ1Njb3BlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlIG5ld1Jlc1NoYXJpbmdTY29wZSkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIG9sZFJlc1NoYXJpbmdTY29wZSA9IHJlc1NoYXJpbmdTY29wZTsKLQkJcmVzU2hhcmluZ1Njb3BlID0gbmV3UmVzU2hhcmluZ1Njb3BlID09IG51bGwgPyBSRVNfU0hBUklOR19TQ09QRV9FREVGQVVMVCA6IG5ld1Jlc1NoYXJpbmdTY29wZTsKLQkJYm9vbGVhbiBvbGRSZXNTaGFyaW5nU2NvcGVFU2V0ID0gcmVzU2hhcmluZ1Njb3BlRVNldDsKLQkJcmVzU2hhcmluZ1Njb3BlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSwgb2xkUmVzU2hhcmluZ1Njb3BlLCByZXNTaGFyaW5nU2NvcGUsICFvbGRSZXNTaGFyaW5nU2NvcGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCVJlc1NoYXJpbmdTY29wZVR5cGUgb2xkUmVzU2hhcmluZ1Njb3BlID0gcmVzU2hhcmluZ1Njb3BlOwotCQlib29sZWFuIG9sZFJlc1NoYXJpbmdTY29wZUVTZXQgPSByZXNTaGFyaW5nU2NvcGVFU2V0OwotCQlyZXNTaGFyaW5nU2NvcGUgPSBSRVNfU0hBUklOR19TQ09QRV9FREVGQVVMVDsKLQkJcmVzU2hhcmluZ1Njb3BlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSwgb2xkUmVzU2hhcmluZ1Njb3BlLCBSRVNfU0hBUklOR19TQ09QRV9FREVGQVVMVCwgb2xkUmVzU2hhcmluZ1Njb3BlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzU2hhcmluZ1Njb3BlKCkgewotCQlyZXR1cm4gcmVzU2hhcmluZ1Njb3BlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVzUmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFJlc1R5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19BVVRIOgotCQkJCXJldHVybiBnZXRSZXNBdXRoKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRToKLQkJCQlzZXRSZXNSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19UWVBFOgotCQkJCXNldFJlc1R5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX0FVVEg6Ci0JCQkJc2V0UmVzQXV0aCgoUmVzQXV0aFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXNldFJlc1NoYXJpbmdTY29wZSgoUmVzU2hhcmluZ1Njb3BlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1JFRl9OQU1FOgotCQkJCXNldFJlc1JlZk5hbWUoUkVTX1JFRl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfVFlQRToKLQkJCQlzZXRSZXNUeXBlKFJFU19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfQVVUSDoKLQkJCQl1bnNldFJlc0F1dGgoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQl1bnNldFJlc1NoYXJpbmdTY29wZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIFJFU19SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzUmVmTmFtZSAhPSBudWxsIDogIVJFU19SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMocmVzUmVmTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfVFlQRToKLQkJCQlyZXR1cm4gUkVTX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc1R5cGUgIT0gbnVsbCA6ICFSRVNfVFlQRV9FREVGQVVMVC5lcXVhbHMocmVzVHlwZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfQVVUSDoKLQkJCQlyZXR1cm4gaXNTZXRSZXNBdXRoKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlyZXR1cm4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXNSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlc1JlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVzVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzQXV0aDogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc0F1dGhFU2V0KSByZXN1bHQuYXBwZW5kKHJlc0F1dGgpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc1NoYXJpbmdTY29wZUVTZXQpIHJlc3VsdC5hcHBlbmQocmVzU2hhcmluZ1Njb3BlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVzb3VyY2VSZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUnVuQXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SdW5Bc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1YjcwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SdW5Bc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UnVuIEFzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJ1bkFzSW1wbCNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUnVuQXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSdW5BcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUnVuQXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SVU5fQVM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGVOYW1lKCkgewotCQlyZXR1cm4gcm9sZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRSb2xlTmFtZSA9IHJvbGVOYW1lOwotCQlyb2xlTmFtZSA9IG5ld1JvbGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJVTl9BU19fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJVTl9BU19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUnVuQXNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjM0MzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZWN1cml0eVJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5Um9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUUsIG9sZFJvbGVOYW1lLCByb2xlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3VyaXR5Um9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGRjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlUmVmSW1wbCNnZXRSb2xlTGluayA8ZW0+Um9sZSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZVJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVMaW5rKCkgPGVtPlJvbGUgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTGluaygpIDxlbT5Sb2xlIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVMaW5rID0gUk9MRV9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlSb2xlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfUk9MRV9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRSwgb2xkUm9sZU5hbWUsIHJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTGluaygpIHsKLQkJcmV0dXJuIHJvbGVMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVMaW5rKFN0cmluZyBuZXdSb2xlTGluaykgewotCQlTdHJpbmcgb2xkUm9sZUxpbmsgPSByb2xlTGluazsKLQkJcm9sZUxpbmsgPSBuZXdSb2xlTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LLCBvbGRSb2xlTGluaywgcm9sZUxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Um9sZU5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LOgotCQkJCXJldHVybiBnZXRSb2xlTGluaygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LOgotCQkJCXNldFJvbGVMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSzoKLQkJCQlzZXRSb2xlTGluayhST0xFX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LOgotCQkJCXJldHVybiBST0xFX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVMaW5rICE9IG51bGwgOiAhUk9MRV9MSU5LX0VERUZBVUxULmVxdWFscyhyb2xlTGluayk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVMaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvbGVMaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3VyaXR5Um9sZVJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlZDAzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsI2dldFBvcnROYW1lUGF0dGVybiA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkgPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lUGF0dGVybiA9IFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lUGF0dGVybigpIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZVBhdHRlcm4oKSA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZVBhdHRlcm4gPSBQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm90b2NvbEJpbmRpbmdzKCkgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3QgUFJPVE9DT0xfQklORElOR1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgcHJvdG9jb2xCaW5kaW5ncyA9IFBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU3RyaW5nIG5ld1NlcnZpY2VOYW1lUGF0dGVybikgewotCQlTdHJpbmcgb2xkU2VydmljZU5hbWVQYXR0ZXJuID0gc2VydmljZU5hbWVQYXR0ZXJuOwotCQlzZXJ2aWNlTmFtZVBhdHRlcm4gPSBuZXdTZXJ2aWNlTmFtZVBhdHRlcm47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk4sIG9sZFNlcnZpY2VOYW1lUGF0dGVybiwgc2VydmljZU5hbWVQYXR0ZXJuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBwb3J0TmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKFN0cmluZyBuZXdQb3J0TmFtZVBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lUGF0dGVybiA9IHBvcnROYW1lUGF0dGVybjsKLQkJcG9ydE5hbWVQYXR0ZXJuID0gbmV3UG9ydE5hbWVQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOLCBvbGRQb3J0TmFtZVBhdHRlcm4sIHBvcnROYW1lUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3RvY29sQmluZGluZ3MoKSB7Ci0JCXJldHVybiBwcm90b2NvbEJpbmRpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sQmluZGluZ3MoTGlzdCBuZXdQcm90b2NvbEJpbmRpbmdzKSB7Ci0JCUxpc3Qgb2xkUHJvdG9jb2xCaW5kaW5ncyA9IHByb3RvY29sQmluZGluZ3M7Ci0JCXByb3RvY29sQmluZGluZ3MgPSBuZXdQcm90b2NvbEJpbmRpbmdzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTLCBvbGRQcm90b2NvbEJpbmRpbmdzLCBwcm90b2NvbEJpbmRpbmdzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SGFuZGxlcnMoKSB7Ci0JCWlmIChoYW5kbGVycyA9PSBudWxsKSB7Ci0JCQloYW5kbGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWVQYXR0ZXJuKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJcmV0dXJuIGdldFByb3RvY29sQmluZGluZ3MoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlcnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXNldFNlcnZpY2VOYW1lUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0UG9ydE5hbWVQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUzoKLQkJCQlzZXRQcm90b2NvbEJpbmRpbmdzKChMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlzZXRQb3J0TmFtZVBhdHRlcm4oUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUzoKLQkJCQlzZXRQcm90b2NvbEJpbmRpbmdzKFBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlTmFtZVBhdHRlcm4gIT0gbnVsbCA6ICFTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHMoc2VydmljZU5hbWVQYXR0ZXJuKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lUGF0dGVybiAhPSBudWxsIDogIVBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZVBhdHRlcm4pOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCXJldHVybiBQUk9UT0NPTF9CSU5ESU5HU19FREVGQVVMVCA9PSBudWxsID8gcHJvdG9jb2xCaW5kaW5ncyAhPSBudWxsIDogIVBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxULmVxdWFscyhwcm90b2NvbEJpbmRpbmdzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gaGFuZGxlcnMgIT0gbnVsbCAmJiAhaGFuZGxlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmljZU5hbWVQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VOYW1lUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWVQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvdG9jb2xCaW5kaW5nczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm90b2NvbEJpbmRpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5MmFjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlckNoYWlucygpIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlckNoYWlucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEhhbmRsZXJDaGFpbnMoKSB7Ci0JCWlmIChoYW5kbGVyQ2hhaW5zID09IG51bGwpIHsKLQkJCWhhbmRsZXJDaGFpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlMpOwotCQl9Ci0JCXJldHVybiBoYW5kbGVyQ2hhaW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlckNoYWlucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDaGFpbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6Ci0JCQkJZ2V0SGFuZGxlckNoYWlucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlckNoYWlucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlnZXRIYW5kbGVyQ2hhaW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJDaGFpbnMgIT0gbnVsbCAmJiAhaGFuZGxlckNoYWlucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNkYWY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRQb3J0TmFtZXMgPGVtPlBvcnQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmSGFuZGxlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VSZWZIYW5kbGVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaGFuZGxlck5hbWUgPSBIQU5ETEVSX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlckNsYXNzKCkgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJDbGFzcyA9IEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBIZWFkZXJzKCkgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwSGVhZGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNvYXBIZWFkZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBSb2xlcygpIDxlbT5Tb2FwIFJvbGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvYXBSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNvYXBSb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZXMoKSA8ZW0+UG9ydCBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3J0TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9IQU5ETEVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJOYW1lKCkgewotCQlyZXR1cm4gaGFuZGxlck5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIG5ld0hhbmRsZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRIYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotCQloYW5kbGVyTmFtZSA9IG5ld0hhbmRsZXJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRSwgb2xkSGFuZGxlck5hbWUsIGhhbmRsZXJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKFN0cmluZyBuZXdIYW5kbGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEhhbmRsZXJDbGFzcyA9IGhhbmRsZXJDbGFzczsKLQkJaGFuZGxlckNsYXNzID0gbmV3SGFuZGxlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1MsIG9sZEhhbmRsZXJDbGFzcywgaGFuZGxlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKLQkJaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJzID0gbmV3IEVEYXRhVHlwZUVMaXN0KE9iamVjdC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCQl9Ci0JCXJldHVybiBzb2FwSGVhZGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTb2FwUm9sZXMoKSB7Ci0JCWlmIChzb2FwUm9sZXMgPT0gbnVsbCkgewotCQkJc29hcFJvbGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc29hcFJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvcnROYW1lcygpIHsKLQkJaWYgKHBvcnROYW1lcyA9PSBudWxsKSB7Ci0JCQlwb3J0TmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1BPUlRfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBwb3J0TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBnZXRIYW5kbGVyTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDbGFzcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiBnZXRTb2FwSGVhZGVycygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNvYXBSb2xlcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1BPUlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldFBvcnROYW1lcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBIZWFkZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1BPUlRfTkFNRVM6Ci0JCQkJZ2V0UG9ydE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKEhBTkRMRVJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJc2V0SGFuZGxlckNsYXNzKEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCWdldFNvYXBIZWFkZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCWdldFBvcnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBIQU5ETEVSX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJOYW1lICE9IG51bGwgOiAhSEFORExFUl9OQU1FX0VERUZBVUxULmVxdWFscyhoYW5kbGVyTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlyZXR1cm4gSEFORExFUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaGFuZGxlckNsYXNzICE9IG51bGwgOiAhSEFORExFUl9DTEFTU19FREVGQVVMVC5lcXVhbHMoaGFuZGxlckNsYXNzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIHNvYXBIZWFkZXJzICE9IG51bGwgJiYgIXNvYXBIZWFkZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCXJldHVybiBzb2FwUm9sZXMgIT0gbnVsbCAmJiAhc29hcFJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBwb3J0TmFtZXMgIT0gbnVsbCAmJiAhcG9ydE5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhhbmRsZXJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYW5kbGVyQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwSGVhZGVyczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzb2FwSGVhZGVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcFJvbGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNvYXBSb2xlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSGFuZGxlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3OTgxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRTZXJ2aWNlUmVmVHlwZSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0UG9ydENvbXBvbmVudFJlZnMgPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmTmFtZSgpIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmTmFtZSgpIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlUmVmTmFtZSA9IFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlID0gU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZlR5cGUoKSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVGX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZlR5cGUoKSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZVJlZlR5cGUgPSBTRVJWSUNFX1JFRl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdzZGxGaWxlID0gV1NETF9GSUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpheHJwY01hcHBpbmdGaWxlKCkgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpheHJwY01hcHBpbmdGaWxlKCkgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGpheHJwY01hcHBpbmdGaWxlID0gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUW5hbWUoKSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTRVJWSUNFX1FOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VRbmFtZSgpIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc2VydmljZVFuYW1lID0gU0VSVklDRV9RTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRSZWZzKCkgPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3J0Q29tcG9uZW50UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVycygpIDxlbT5IYW5kbGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDaGFpbnMoKSA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBoYW5kbGVyQ2hhaW5zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldHMoKSA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSZWZOYW1lKCkgewotCQlyZXR1cm4gc2VydmljZVJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIG5ld1NlcnZpY2VSZWZOYW1lKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlUmVmTmFtZSA9IHNlcnZpY2VSZWZOYW1lOwotCQlzZXJ2aWNlUmVmTmFtZSA9IG5ld1NlcnZpY2VSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FLCBvbGRTZXJ2aWNlUmVmTmFtZSwgc2VydmljZVJlZk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nIG5ld1NlcnZpY2VJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VJbnRlcmZhY2UgPSBzZXJ2aWNlSW50ZXJmYWNlOwotCQlzZXJ2aWNlSW50ZXJmYWNlID0gbmV3U2VydmljZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VJbnRlcmZhY2UsIHNlcnZpY2VJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSZWZUeXBlKCkgewotCQlyZXR1cm4gc2VydmljZVJlZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVJlZlR5cGUoU3RyaW5nIG5ld1NlcnZpY2VSZWZUeXBlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlUmVmVHlwZSA9IHNlcnZpY2VSZWZUeXBlOwotCQlzZXJ2aWNlUmVmVHlwZSA9IG5ld1NlcnZpY2VSZWZUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9UWVBFLCBvbGRTZXJ2aWNlUmVmVHlwZSwgc2VydmljZVJlZlR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlKCkgewotCQlyZXR1cm4gd3NkbEZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIG5ld1dzZGxGaWxlKSB7Ci0JCVN0cmluZyBvbGRXc2RsRmlsZSA9IHdzZGxGaWxlOwotCQl3c2RsRmlsZSA9IG5ld1dzZGxGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUsIG9sZFdzZGxGaWxlLCB3c2RsRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiBqYXhycGNNYXBwaW5nRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgbmV3SmF4cnBjTWFwcGluZ0ZpbGUpIHsKLQkJU3RyaW5nIG9sZEpheHJwY01hcHBpbmdGaWxlID0gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWpheHJwY01hcHBpbmdGaWxlID0gbmV3SmF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUsIG9sZEpheHJwY01hcHBpbmdGaWxlLCBqYXhycGNNYXBwaW5nRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZVFuYW1lKCkgewotCQlyZXR1cm4gc2VydmljZVFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VRbmFtZShPYmplY3QgbmV3U2VydmljZVFuYW1lKSB7Ci0JCU9iamVjdCBvbGRTZXJ2aWNlUW5hbWUgPSBzZXJ2aWNlUW5hbWU7Ci0JCXNlcnZpY2VRbmFtZSA9IG5ld1NlcnZpY2VRbmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSwgb2xkU2VydmljZVFuYW1lLCBzZXJ2aWNlUW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0Q29tcG9uZW50UmVmcygpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZzID09IG51bGwpIHsKLQkJCXBvcnRDb21wb25lbnRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRDb21wb25lbnRSZWYuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRIYW5kbGVycygpIHsKLQkJaWYgKGhhbmRsZXJzID09IG51bGwpIHsKLQkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBnZXRIYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gaGFuZGxlckNoYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG5ld0hhbmRsZXJDaGFpbnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgb2xkSGFuZGxlckNoYWlucyA9IGhhbmRsZXJDaGFpbnM7Ci0JCWhhbmRsZXJDaGFpbnMgPSBuZXdIYW5kbGVyQ2hhaW5zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUywgb2xkSGFuZGxlckNoYWlucywgbmV3SGFuZGxlckNoYWlucyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBuZXdIYW5kbGVyQ2hhaW5zKSB7Ci0JCWlmIChuZXdIYW5kbGVyQ2hhaW5zICE9IGhhbmRsZXJDaGFpbnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhbmRsZXJDaGFpbnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFuZGxlckNoYWlucykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYW5kbGVyQ2hhaW5zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhbmRsZXJDaGFpbnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKG5ld0hhbmRsZXJDaGFpbnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMsIG5ld0hhbmRsZXJDaGFpbnMsIG5ld0hhbmRsZXJDaGFpbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewotCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnRDb21wb25lbnRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBiYXNpY1NldEhhbmRsZXJDaGFpbnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUludGVyZmFjZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9UWVBFOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldFdzZGxGaWxlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VRbmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50UmVmcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlcnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDaGFpbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJc2V0U2VydmljZVJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlSW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRToKLQkJCQlzZXRTZXJ2aWNlUmVmVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXNldFNlcnZpY2VRbmFtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlM6Ci0JCQkJZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRIYW5kbGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlzZXRIYW5kbGVyQ2hhaW5zKChTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJc2V0U2VydmljZVJlZk5hbWUoU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlSW50ZXJmYWNlKFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEU6Ci0JCQkJc2V0U2VydmljZVJlZlR5cGUoU0VSVklDRV9SRUZfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoV1NETF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXNldFNlcnZpY2VRbmFtZShTRVJWSUNFX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlM6Ci0JCQkJZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlM6Ci0JCQkJc2V0SGFuZGxlckNoYWlucygoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlyZXR1cm4gU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZVJlZk5hbWUgIT0gbnVsbCA6ICFTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlUmVmTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXJldHVybiBTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZUludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlSW50ZXJmYWNlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRToKLQkJCQlyZXR1cm4gU0VSVklDRV9SRUZfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZVJlZlR5cGUgIT0gbnVsbCA6ICFTRVJWSUNFX1JFRl9UWVBFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlUmVmVHlwZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRToKLQkJCQlyZXR1cm4gV1NETF9GSUxFX0VERUZBVUxUID09IG51bGwgPyB3c2RsRmlsZSAhPSBudWxsIDogIVdTRExfRklMRV9FREVGQVVMVC5lcXVhbHMod3NkbEZpbGUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBqYXhycGNNYXBwaW5nRmlsZSAhPSBudWxsIDogIUpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlyZXR1cm4gU0VSVklDRV9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZVFuYW1lICE9IG51bGwgOiAhU0VSVklDRV9RTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZVFuYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZnMgIT0gbnVsbCAmJiAhcG9ydENvbXBvbmVudFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gaGFuZGxlcnMgIT0gbnVsbCAmJiAhaGFuZGxlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gaGFuZGxlckNoYWlucyAhPSBudWxsOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VSZWZOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlSW50ZXJmYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VSZWZUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VSZWZUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3c2RsRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF4cnBjTWFwcGluZ0ZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoamF4cnBjTWFwcGluZ0ZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VRbmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlUW5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvVXJsUGF0dGVyblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmNjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvVXJsUGF0dGVyblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBQYXR0ZXJuIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlVybFBhdHRlcm5UeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxQYXR0ZXJuVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFVybFBhdHRlcm5UeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVcmxQYXR0ZXJuVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlVSTF9QQVRURVJOX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1VybFBhdHRlcm5UeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9tZXRhZGF0YS9KYXZhZWVQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvbWV0YWRhdGEvSmF2YWVlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI2ZTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9tZXRhZGF0YS9KYXZhZWVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YWVlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJqYXZhZWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFlZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fTEFORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQTEFZX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTUExBWV9OQU1FX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU1BMQVlfTkFNRV9fTEFORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU1BMQVlfTkFNRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsIDxlbT5FamIgTG9jYWwgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19FSkJfUkVGX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0xPQ0FMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX01BUFBFRF9OQU1FID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fSUQgPSA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9GRUFUVVJFX0NPVU5UID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCA8ZW0+RWpiIFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfUkVGID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fRUpCX1JFRl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19FSkJfUkVGX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19IT01FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19SRU1PVEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fRUpCX0xJTksgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fTUFQUEVEX05BTUUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19JRCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWpiIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgPSA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbXB0eVR5cGVJbXBsIDxlbT5FbXB0eSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW1wdHlUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW1wdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVNUFRZX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU1QVFlfVFlQRV9fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVtcHR5IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU1QVFlfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsIDxlbT5FbnYgRW50cnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVOVl9FTlRSWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fTUFQUEVEX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fSUQgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudiBFbnRyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsIDxlbT5JY29uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSWNvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUNPTiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fX1NNQUxMX0lDT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX19MQVJHRV9JQ09OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9fTEFORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SWNvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JbmplY3Rpb25UYXJnZXRJbXBsIDxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSW5qZWN0aW9uVGFyZ2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOSkVDVElPTl9UQVJHRVQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5KRUNUSU9OX1RBUkdFVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaWZlY3ljbGVDYWxsYmFja0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldExpZmVjeWNsZUNhbGxiYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExJRkVDWUNMRV9DQUxMQkFDSyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0QgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSUZFQ1lDTEVfQ0FMTEJBQ0tfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCA8ZW0+TGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExJU1RFTkVSID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSVNURU5FUl9fSUQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpc3RlbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT04gPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUFQUEVEX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fTUFQUEVEX05BTUUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lEID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUYgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9VTklUX1JFRl9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRiA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5VHlwZUltcGwgPGVtPlByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfVFlQRSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9UWVBFX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX1RZUEVfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX1RZUEVfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCA8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRiA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0lEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCA8ZW0+UmVzb3VyY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUYgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXMgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX1JFU19UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXMgQXV0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fUkVTX0FVVEggPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0lEID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwgPGVtPlJ1biBBczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJ1bkFzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUlVOX0FTID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSVU5fQVNfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUlVOX0FTX19ST0xFX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUlVOX0FTX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UnVuIEFzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Um9sZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRiA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRl9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCA8ZW0+U2VydmljZSBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRiA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1dTRExfRklMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFFuYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0hBTkRMRVJTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19JRCA9IDE0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9DTEFTUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfSEVBREVSUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19JRCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0ZFQVRVUkVfQ09VTlQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbCA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5VcmxQYXR0ZXJuVHlwZUltcGwgPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5VcmxQYXR0ZXJuVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFVybFBhdHRlcm5UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEUgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9SRUZfVFlQRSA9IDI3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9UWVBFID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1RZUEUgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlIDxlbT5SZXMgQXV0aCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc0F1dGhUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX1RZUEUgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGV3ZXkgVmVyc2lvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVdFWV9WRVJTSU9OX1RZUEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RUpCIExpbms8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFSkJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9MSU5LID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVqYiBSZWYgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmTmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9OQU1FX1RZUEUgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWpiIFJlZiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWZUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9SRUZfVFlQRV9PQkpFQ1QgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9UWVBFX09CSkVDVCA9IDM3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkhvbWU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhPTUUgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SmF2YSBJZGVudGlmaWVyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SmF2YUlkZW50aWZpZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSkFWQV9JREVOVElGSUVSID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkphdmEgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEphdmFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpBVkFfVFlQRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KTkRJIE5hbWU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRKTkRJTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKTkRJX05BTUUgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TG9jYWw8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTCA9IDQzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExPQ0FMX0hPTUUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTksgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRSA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRV9PQkpFQ1QgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGF0aCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGF0aFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFUSF9UWVBFID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfT0JKRUNUID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRU1PVEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmVzIEF1dGggVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc0F1dGhUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX1RZUEVfT0JKRUNUID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1QgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9OQU1FID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX0xJU1RfVFlQRSA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTiA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcnVlIEZhbHNlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRUcnVlRmFsc2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSVUVfRkFMU0VfVFlQRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcnVlIEZhbHNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFRydWVGYWxzZVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJVRV9GQUxTRV9UWVBFX09CSkVDVCA9IDU5OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0TGFuZygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldExhbmcoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYgPGVtPkVqYiBMb2NhbCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RWpiTG9jYWxSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFamJMb2NhbFJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYlJlZk5hbWUgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiUmVmTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9FamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvY2FsSG9tZSgpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0xvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWwoKQotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9Mb2NhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJMaW5rKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYgPGVtPkVqYiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVqYlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYlJlZk5hbWUoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0VqYlJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRIb21lIDxlbT5Ib21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SG9tZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtb3RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRSZW1vdGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX1JlbW90ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYkxpbmsoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0VqYkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlIDxlbT5FbXB0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVtcHR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbXB0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVtcHR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW1wdHlUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkgPGVtPkVudiBFbnRyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVudkVudHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeU5hbWUgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlOYW1lKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRW52RW50cnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVZhbHVlIDxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X0VudkVudHJ5VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiA8ZW0+SWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U21hbGwgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0SWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWNvbl9TbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldExhcmdlSWNvbigpCi0JICogQHNlZSAjZ2V0SWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWNvbl9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0SWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWNvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldExhbmcoKQotCSAqIEBzZWUgI2dldEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25fTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCA8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5qZWN0aW9uVGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQjZ2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MgPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpCi0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXROYW1lIDxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0I2dldEluamVjdGlvblRhcmdldE5hbWUoKQotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkKLQkgKiBAc2VlICNnZXRMaWZlY3ljbGVDYWxsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRMaWZlY3ljbGVDYWxsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciA8ZW0+TGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpc3RlbmVyX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRMaXN0ZW5lckNsYXNzIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpc3RlbmVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldExpc3RlbmVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpc3RlbmVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW0gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtTmFtZSgpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9QYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtVmFsdWUoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfUGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldElkKCkKLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQYXJhbVZhbHVlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzIDxlbT5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9ydENvbXBvbmVudFJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmFibGUgTXRvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9FbmFibGVNdG9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUgPGVtPlByb3BlcnR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb3BlcnR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5VHlwZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5VHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eVR5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiA8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lIDxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZlR5cGUgPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYgPGVtPlJlc291cmNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlc291cmNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNSZWZOYW1lIDxlbT5SZXMgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXMgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzUmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc1JlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1R5cGUgPGVtPlJlcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzVHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc0F1dGggPGVtPlJlcyBBdXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzIEF1dGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzQXV0aCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc0F1dGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMgPGVtPlJ1biBBczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SdW4gQXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJ1bkFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UnVuQXNfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldFJvbGVOYW1lKCkKLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UnVuQXNfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldElkKCkKLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UnVuQXNfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUgPGVtPlNlY3VyaXR5IFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXRSb2xlTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5Um9sZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTGluayA8ZW0+Um9sZSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTGluaygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfUm9sZUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiA8ZW0+U2VydmljZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmljZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZUeXBlIDxlbT5TZXJ2aWNlIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRXc2RsRmlsZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFBvcnRDb21wb25lbnRSZWZzIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0UG9ydENvbXBvbmVudFJlZnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhbmRsZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SGFuZGxlcnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciA8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2aWNlUmVmSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEhhbmRsZXJDbGFzcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBIZWFkZXJzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBSb2xlcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRQb3J0TmFtZXMgPGVtPlBvcnQgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlBvcnQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0UG9ydE5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQcm90b2NvbEJpbmRpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhbmRsZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zI2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUgPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VXJsIFBhdHRlcm4gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VXJsUGF0dGVyblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJuVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXJsUGF0dGVyblR5cGVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RW52RW50cnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZSA8ZW0+UmVzIEF1dGggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJlcyBBdXRoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UmVzQXV0aFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGV3ZXkgVmVyc2lvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkVKQiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVKQkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FamIgUmVmIE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWpiIFJlZiBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFamJSZWZOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FamIgUmVmIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVqYlJlZlR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVudiBFbnRyeSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVudkVudHJ5VHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZ1bGx5IFF1YWxpZmllZCBDbGFzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SG9tZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEhvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5KYXZhIElkZW50aWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkphdmEgSWRlbnRpZmllcjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEphdmFJZGVudGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SmF2YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5KYXZhIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRKYXZhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkpOREkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Sk5ESSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Sk5ESU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Mb2NhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMb2NhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMb2NhbEhvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QYXRoIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBhdGggVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBhdGhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlJlbW90ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmVtb3RlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlIDxlbT5SZXMgQXV0aCBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmVzIEF1dGggVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJlc0F1dGhUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Um9sZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIFVSSSBBbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlNlcnZpY2UgUmVmIFFuYW1lIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlcnZpY2UgUmVmIFFuYW1lIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRydWUgRmFsc2UgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFRydWVGYWxzZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuQm9vbGVhbiA8ZW0+VHJ1ZSBGYWxzZSBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUcnVlRmFsc2VUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhZWVGYWN0b3J5IGdldEphdmFlZUZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVElPTl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVElPTl9fTEFORyA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbl9MYW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERpc3BsYXlOYW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU1BMQVlfTkFNRSA9IGVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNQTEFZX05BTUVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTUExBWV9OQU1FX19MQU5HID0gZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX0xhbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCA8ZW0+RWpiIExvY2FsIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYkxvY2FsUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9MT0NBTF9SRUYgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0VqYlJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9FamJSZWZUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fTE9DQUwgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfTG9jYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fRUpCX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfRWpiTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCA8ZW0+RWpiIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX1JFRiA9IGVJTlNUQU5DRS5nZXRFamJSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0VKQl9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfRWpiUmVmTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fRUpCX1JFRl9UWVBFID0gZUlOU1RBTkNFLmdldEVqYlJlZl9FamJSZWZUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fSE9NRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fUkVNT1RFID0gZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fRUpCX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0VqYkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX01hcHBlZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRFamJSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRFamJSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVtcHR5VHlwZUltcGwgPGVtPkVtcHR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbXB0eVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW1wdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVNUFRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW1wdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVNUFRZX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEVtcHR5VHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsIDxlbT5FbnYgRW50cnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFbnZFbnRyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTlZfRU5UUlkgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5WX0VOVFJZX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cnkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRW52RW50cnlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeV9FbnZFbnRyeVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX0lEID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbCA8ZW0+SWNvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SWNvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJQ09OID0gZUlOU1RBTkNFLmdldEljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJQ09OX19TTUFMTF9JQ09OID0gZUlOU1RBTkNFLmdldEljb25fU21hbGxJY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9fTEFSR0VfSUNPTiA9IGVJTlNUQU5DRS5nZXRJY29uX0xhcmdlSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJQ09OX19JRCA9IGVJTlNUQU5DRS5nZXRJY29uX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9fTEFORyA9IGVJTlNUQU5DRS5nZXRJY29uX0xhbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkluamVjdGlvblRhcmdldEltcGwgPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JbmplY3Rpb25UYXJnZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOSkVDVElPTl9UQVJHRVQgPSBlSU5TVEFOQ0UuZ2V0SW5qZWN0aW9uVGFyZ2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaWZlY3ljbGVDYWxsYmFja0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMaWZlY3ljbGVDYWxsYmFjaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMSUZFQ1lDTEVfQ0FMTEJBQ0sgPSBlSU5TVEFOQ0UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTID0gZUlOU1RBTkNFLmdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tfTGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCA8ZW0+TGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMaXN0ZW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMSVNURU5FUiA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSVNURU5FUl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldExpc3RlbmVyX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElTVEVORVJfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElTVEVORVJfX0lDT05TID0gZUlOU1RBTkNFLmdldExpc3RlbmVyX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJU1RFTkVSX19JRCA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9ERVNUSU5BVElPTiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX0lEID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfREVTVElOQVRJT05fUkVGID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQYXJhbVZhbHVlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBUkFNX1ZBTFVFID0gZUlOU1RBTkNFLmdldFBhcmFtVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FID0gZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX1BhcmFtVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEFSQU1fVkFMVUVfX0lEID0gZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQRVJTSVNURU5DRV9DT05URVhUX1JFRiA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVByb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQRVJTSVNURU5DRV9VTklUX1JFRiA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdFJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdFJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnRSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVF9DT01QT05FTlRfUkVGID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfRW5hYmxlTXRvbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlUeXBlSW1wbCA8ZW0+UHJvcGVydHkgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPUEVSVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldFByb3BlcnR5VHlwZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX1RZUEVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFByb3BlcnR5VHlwZV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eVR5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCA8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc291cmNlRW52UmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX0VOVl9SRUYgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9UWVBFID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9FTlZfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsIDxlbT5SZXNvdXJjZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXMgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9SZXNSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fUkVTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfUmVzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzIEF1dGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX1JFU19BVVRIID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX1Jlc0F1dGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJ1bkFzSW1wbCA8ZW0+UnVuIEFzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UnVuQXMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUlVOX0FTID0gZUlOU1RBTkNFLmdldFJ1bkFzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJVTl9BU19fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUlVOX0FTX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UnVuQXNfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUlVOX0FTX19JRCA9IGVJTlNUQU5DRS5nZXRSdW5Bc19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVSZWZfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX0xJTksgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsIDxlbT5TZXJ2aWNlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX1JFRiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX0lDT05TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fV1NETF9GSUxFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFFuYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fSEFORExFUlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVyQ2hhaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX1JFRl9IQU5ETEVSID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX1BvcnROYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0hhbmRsZXJDaGFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5VcmxQYXR0ZXJuVHlwZUltcGwgPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5VcmxQYXR0ZXJuVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRVcmxQYXR0ZXJuVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVUkxfUEFUVEVSTl9UWVBFID0gZUlOU1RBTkNFLmdldFVybFBhdHRlcm5UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZlR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBFSkJfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFbnZFbnRyeVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBFTlZfRU5UUllfVFlQRSA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUgPGVtPlJlcyBBdXRoIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc0F1dGhUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUkVTX0FVVEhfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNBdXRoVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RGV3ZXkgVmVyc2lvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERld2V5VmVyc2lvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgREVXRVlfVkVSU0lPTl9UWVBFID0gZUlOU1RBTkNFLmdldERld2V5VmVyc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVKQiBMaW5rPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVKQkxpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRUpCX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RUpCTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RWpiIFJlZiBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmTmFtZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRUpCX1JFRl9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmTmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVqYiBSZWYgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZlR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRUpCX1JFRl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRFamJSZWZUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVOVl9FTlRSWV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBDbGFzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFID0gZUlOU1RBTkNFLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Ib21lPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEhvbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSE9NRSA9IGVJTlNUQU5DRS5nZXRIb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5KYXZhIElkZW50aWZpZXI8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SmF2YUlkZW50aWZpZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSkFWQV9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldEphdmFJZGVudGlmaWVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5KYXZhIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SmF2YVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSkFWQV9UWVBFID0gZUlOU1RBTkNFLmdldEphdmFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5KTkRJIE5hbWU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0Sk5ESU5hbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSk5ESV9OQU1FID0gZUlOU1RBTkNFLmdldEpORElOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMb2NhbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBMT0NBTCA9IGVJTlNUQU5DRS5nZXRMb2NhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMb2NhbEhvbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTE9DQUxfSE9NRSA9IGVJTlNUQU5DRS5nZXRMb2NhbEhvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1FU1NBR0VfREVTVElOQVRJT05fTElOSyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlBhdGggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQYXRoVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBQQVRIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UGF0aFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5SZW1vdGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVtb3RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFJFTU9URSA9IGVJTlNUQU5DRS5nZXRSZW1vdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlJlcyBBdXRoIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzQXV0aFR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUkVTX0FVVEhfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aFR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFJFU19TSEFSSU5HX1NDT1BFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlJvbGUgTmFtZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSb2xlTmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Um9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBRbmFtZSBQYXR0ZXJuPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5UcnVlIEZhbHNlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRUcnVlRmFsc2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFRSVUVfRkFMU0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRUcnVlRmFsc2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5UcnVlIEZhbHNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRUcnVlRmFsc2VUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFRSVUVfRkFMU0VfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VHJ1ZUZhbHNlVHlwZU9iamVjdCgpOwotCi0JfQotCi19IC8vSmF2YWVlUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSkVFWE1MSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSkVFWE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBjOGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0pFRVhNTEhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgSkVFWE1MSGVscGVySW1wbCBleHRlbmRzIFhNTEhlbHBlckltcGwgewotCi0JcHVibGljIEpFRVhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCX0KLQotCi0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoRUNsYXNzIGNsYXNzMSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLQkJCVN0cmluZyBuYW1lLCBib29sZWFuIGlzRWxlbWVudCkgewotCQkvLyBJZiBub3QgZm91bmQgaW4gY3VycmVudCBuYW1lc3BhY2UgcGFja2FnZSwgZ28gdG8gY29tbW9uIHBhY2thZ2UKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlID0gIHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBuYW1lc3BhY2VVUkksIG5hbWUsIGlzRWxlbWVudCk7Ci0JCWlmIChhRmVhdHVyZSA9PSBudWxsKQotCQkJYUZlYXR1cmUgPSAgc3VwZXIuZ2V0RmVhdHVyZShjbGFzczEsIEphdmFlZVBhY2thZ2UuZU5TX1VSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQlyZXR1cm4gYUZlYXR1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzNGIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFlZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhZWVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YWVlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEphdmFlZVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVqYkxvY2FsUmVmKEVqYkxvY2FsUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFamJMb2NhbFJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVtcHR5VHlwZShFbXB0eVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVtcHR5VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVudkVudHJ5KEVudkVudHJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnZFbnRyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUljb24oSWNvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSWNvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUluamVjdGlvblRhcmdldChJbmplY3Rpb25UYXJnZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluamVjdGlvblRhcmdldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxpZmVjeWNsZUNhbGxiYWNrKExpZmVjeWNsZUNhbGxiYWNrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaWZlY3ljbGVDYWxsYmFja0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaXN0ZW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBhcmFtVmFsdWUoUGFyYW1WYWx1ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUGFyYW1WYWx1ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBlcnNpc3RlbmNlQ29udGV4dFJlZihQZXJzaXN0ZW5jZUNvbnRleHRSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBlcnNpc3RlbmNlVW5pdFJlZihQZXJzaXN0ZW5jZVVuaXRSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRDb21wb25lbnRSZWYoUG9ydENvbXBvbmVudFJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUG9ydENvbXBvbmVudFJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRW52UmVmKFJlc291cmNlRW52UmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUVudlJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJ1bkFzKFJ1bkFzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSdW5Bc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWYoU2VydmljZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVVybFBhdHRlcm5UeXBlKFVybFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVVcmxQYXR0ZXJuVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYgPGVtPkVqYiBMb2NhbCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYkxvY2FsUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmIDxlbT5FamIgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWpiUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlIDxlbT5FbXB0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW1wdHlUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkgPGVtPkVudiBFbnRyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uIDxlbT5JY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUljb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQgPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbmplY3Rpb25UYXJnZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaWZlY3ljbGVDYWxsYmFja0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIDxlbT5MaXN0ZW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlzdGVuZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyYW1WYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiA8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUgPGVtPlByb3BlcnR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiA8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiA8ZW0+UmVzb3VyY2UgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzIDxlbT5SdW4gQXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJ1bkFzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlIDxlbT5TZWN1cml0eSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYgPGVtPlNlcnZpY2UgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciA8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUgPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVybFBhdHRlcm5UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0phdmFlZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjFmY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgSmF2YWVlUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL0phdmFlZVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMmJlZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFlZVJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFlZVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlJRmlsZSBmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKCk7Ci0JCQotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKSByZXR1cm47IC8vIE9ubHkgc2F2ZSBpZiBmaWxlIGV4aXN0ZWQKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCVN0cmluZyBmaWxlU3RyaW5nID0gVVJJLmRlY29kZSh1cmkucGF0aCgpKTsKLQkJCWZpbGVTdHJpbmcgPSBmaWxlU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpICsgMSk7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoZ2V0VVJJKCkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IGdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJVVJJIGNvbnZlcnRlZFVyaSA9IGNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkJCQlpZiAoIXVyaS5lcXVhbHMoY29udmVydGVkVXJpKSkKLQkJCQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShjb252ZXJ0ZWRVcmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoKTsKLQkJaWYgKCFmb3JjZSAmJiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKSkgcmV0dXJuOyAvLyBPbmx5IHNhdmUgaWYgZmlsZSBleGlzdGVkCi0JCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCWlmIChmb3JjZSkgZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUodGhpcyk7IC8vUmVtb3ZlIGluaXRpYWwgcmVzb3VyY2UKLQl9Ci0KLX0gLy9KYXZhZWVSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2VmMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmF2YWVlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFlZVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OOiB7Ci0JCQkJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FOiB7Ci0JCQkJRGlzcGxheU5hbWUgZGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRjogewotCQkJCUVqYkxvY2FsUmVmIGVqYkxvY2FsUmVmID0gKEVqYkxvY2FsUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFamJMb2NhbFJlZihlamJMb2NhbFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUY6IHsKLQkJCQlFamJSZWYgZWpiUmVmID0gKEVqYlJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWpiUmVmKGVqYlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEU6IHsKLQkJCQlFbXB0eVR5cGUgZW1wdHlUeXBlID0gKEVtcHR5VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW1wdHlUeXBlKGVtcHR5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWTogewotCQkJCUVudkVudHJ5IGVudkVudHJ5ID0gKEVudkVudHJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnZFbnRyeShlbnZFbnRyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT046IHsKLQkJCQlJY29uIGljb24gPSAoSWNvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSWNvbihpY29uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVDogewotCQkJCUluamVjdGlvblRhcmdldCBpbmplY3Rpb25UYXJnZXQgPSAoSW5qZWN0aW9uVGFyZ2V0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbmplY3Rpb25UYXJnZXQoaW5qZWN0aW9uVGFyZ2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLOiB7Ci0JCQkJTGlmZWN5Y2xlQ2FsbGJhY2sgbGlmZWN5Y2xlQ2FsbGJhY2sgPSAoTGlmZWN5Y2xlQ2FsbGJhY2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpZmVjeWNsZUNhbGxiYWNrKGxpZmVjeWNsZUNhbGxiYWNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVI6IHsKLQkJCQlMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OOiB7Ci0JCQkJTWVzc2FnZURlc3RpbmF0aW9uIG1lc3NhZ2VEZXN0aW5hdGlvbiA9IChNZXNzYWdlRGVzdGluYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihtZXNzYWdlRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRjogewotCQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiBtZXNzYWdlRGVzdGluYXRpb25SZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYobWVzc2FnZURlc3RpbmF0aW9uUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUU6IHsKLQkJCQlQYXJhbVZhbHVlIHBhcmFtVmFsdWUgPSAoUGFyYW1WYWx1ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGFyYW1WYWx1ZShwYXJhbVZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6IHsKLQkJCQlQZXJzaXN0ZW5jZUNvbnRleHRSZWYgcGVyc2lzdGVuY2VDb250ZXh0UmVmID0gKFBlcnNpc3RlbmNlQ29udGV4dFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGVyc2lzdGVuY2VDb250ZXh0UmVmKHBlcnNpc3RlbmNlQ29udGV4dFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGOiB7Ci0JCQkJUGVyc2lzdGVuY2VVbml0UmVmIHBlcnNpc3RlbmNlVW5pdFJlZiA9IChQZXJzaXN0ZW5jZVVuaXRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBlcnNpc3RlbmNlVW5pdFJlZihwZXJzaXN0ZW5jZVVuaXRSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6IHsKLQkJCQlQb3J0Q29tcG9uZW50UmVmIHBvcnRDb21wb25lbnRSZWYgPSAoUG9ydENvbXBvbmVudFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydENvbXBvbmVudFJlZihwb3J0Q29tcG9uZW50UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRTogewotCQkJCVByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUgPSAoUHJvcGVydHlUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogewotCQkJCVJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmID0gKFJlc291cmNlRW52UmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRjogewotCQkJCVJlc291cmNlUmVmIHJlc291cmNlUmVmID0gKFJlc291cmNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZVJlZihyZXNvdXJjZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BUzogewotCQkJCVJ1bkFzIHJ1bkFzID0gKFJ1bkFzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSdW5BcyhydW5Bcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEU6IHsKLQkJCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlID0gKFNlY3VyaXR5Um9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiB7Ci0JCQkJU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiA9IChTZWN1cml0eVJvbGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZVJlZihzZWN1cml0eVJvbGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRjogewotCQkJCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmKHNlcnZpY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSOiB7Ci0JCQkJU2VydmljZVJlZkhhbmRsZXIgc2VydmljZVJlZkhhbmRsZXIgPSAoU2VydmljZVJlZkhhbmRsZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VSZWZIYW5kbGVyKHNlcnZpY2VSZWZIYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTjogewotCQkJCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gc2VydmljZVJlZkhhbmRsZXJDaGFpbiA9IChTZXJ2aWNlUmVmSGFuZGxlckNoYWluKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWluKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUzogewotCQkJCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zID0gKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyhzZXJ2aWNlUmVmSGFuZGxlckNoYWlucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEU6IHsKLQkJCQlVcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJuVHlwZSA9IChVcmxQYXR0ZXJuVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVXJsUGF0dGVyblR5cGUodXJsUGF0dGVyblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRWpiTG9jYWxSZWYoRWpiTG9jYWxSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVtcHR5IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVtcHR5VHlwZShFbXB0eVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkljb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWNvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSWNvbihJY29uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbmplY3Rpb25UYXJnZXQoSW5qZWN0aW9uVGFyZ2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGlmZWN5Y2xlQ2FsbGJhY2soTGlmZWN5Y2xlQ2FsbGJhY2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGlzdGVuZXIoTGlzdGVuZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQYXJhbVZhbHVlKFBhcmFtVmFsdWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGVyc2lzdGVuY2VDb250ZXh0UmVmKFBlcnNpc3RlbmNlQ29udGV4dFJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eVR5cGUoUHJvcGVydHlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJ1biBBczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUnVuQXMoUnVuQXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlUmVmKFNlY3VyaXR5Um9sZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWluKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVVybFBhdHRlcm5UeXBlKFVybFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhZWVTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNGJhOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlZhbGlkYXRvcjwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YWVlVmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhZWVWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgSmF2YWVlVmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpIHNvdXJjZX0gb2YgZGlhZ25vc3RpYyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpIGNvZGVzfSBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cyBpbiBhIGRlcml2ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElBR05PU1RJQ19DT0RFX0NPVU5UID0gR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgYmFzZSBwYWNrYWdlIHZhbGlkYXRvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MVHlwZVZhbGlkYXRvciB4bWxUeXBlVmFsaWRhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXhtbFR5cGVWYWxpZGF0b3IgPSBYTUxUeXBlVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugb2YgdGhpcyB2YWxpZGF0b3Igc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkgIHJldHVybiBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT52YWxpZGF0ZVhYWDwvY29kZT4gZm9yIHRoZSBjb3JyZXNvbmRpbmcgY2xhc3NpZmllciBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoaW50IGNsYXNzaWZpZXJJRCwgT2JqZWN0IHZhbHVlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FOgotCQkJCXJldHVybiB2YWxpZGF0ZURpc3BsYXlOYW1lKChEaXNwbGF5TmFtZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWpiTG9jYWxSZWYoKEVqYkxvY2FsUmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWYoKEVqYlJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW1wdHlUeXBlKChFbXB0eVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUlk6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW52RW50cnkoKEVudkVudHJ5KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVJY29uKChJY29uKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVJbmplY3Rpb25UYXJnZXQoKEluamVjdGlvblRhcmdldCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVMaWZlY3ljbGVDYWxsYmFjaygoTGlmZWN5Y2xlQ2FsbGJhY2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVMaXN0ZW5lcigoTGlzdGVuZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OOgotCQkJCXJldHVybiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigoTWVzc2FnZURlc3RpbmF0aW9uKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKChNZXNzYWdlRGVzdGluYXRpb25SZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQYXJhbVZhbHVlKChQYXJhbVZhbHVlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmKChQZXJzaXN0ZW5jZUNvbnRleHRSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXRSZWYoKFBlcnNpc3RlbmNlVW5pdFJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQb3J0Q29tcG9uZW50UmVmKChQb3J0Q29tcG9uZW50UmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eVR5cGUoKFByb3BlcnR5VHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VFbnZSZWYoKFJlc291cmNlRW52UmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlUmVmKChSZXNvdXJjZVJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVSdW5BcygoUnVuQXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlY3VyaXR5Um9sZSgoU2VjdXJpdHlSb2xlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VjdXJpdHlSb2xlUmVmKChTZWN1cml0eVJvbGVSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmKChTZXJ2aWNlUmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlcigoU2VydmljZVJlZkhhbmRsZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVybFBhdHRlcm5UeXBlKChVcmxQYXR0ZXJuVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZUeXBlKChFamJSZWZUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW52RW50cnlUeXBlKChFbnZFbnRyeVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19BVVRIX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzQXV0aFR5cGUoKFJlc0F1dGhUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlKChSZXNTaGFyaW5nU2NvcGVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVXRVlfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MSU5LOgotCQkJCXJldHVybiB2YWxpZGF0ZUVKQkxpbmsoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfTkFNRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVqYlJlZk5hbWVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZUVqYlJlZlR5cGVPYmplY3QoKEVqYlJlZlR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW52RW50cnlUeXBlT2JqZWN0KChFbnZFbnRyeVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSE9NRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIb21lKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX0lERU5USUZJRVI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSmF2YUlkZW50aWZpZXIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVKYXZhVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSk5ESV9OQU1FOgotCQkJCXJldHVybiB2YWxpZGF0ZUpORElOYW1lKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2NhbCgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2NhbEhvbWUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25MaW5rKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBVEhfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQYXRoVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KChQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVNT1RFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlbW90ZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzQXV0aFR5cGVPYmplY3QoKFJlc0F1dGhUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCgoUmVzU2hhcmluZ1Njb3BlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJPTEVfTkFNRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSb2xlTmFtZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKChMaXN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVFJVRV9GQUxTRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRydWVGYWxzZVR5cGUoKChCb29sZWFuKXZhbHVlKS5ib29sZWFuVmFsdWUoKSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZU9iamVjdCgoQm9vbGVhbil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJZGVmYXVsdDogCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWRlc2NyaXB0aW9uLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClkaXNwbGF5TmFtZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiTG9jYWxSZWYoRWpiTG9jYWxSZWYgZWpiTG9jYWxSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZWpiTG9jYWxSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZihFamJSZWYgZWpiUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWVqYlJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1wdHlUeXBlKEVtcHR5VHlwZSBlbXB0eVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZW1wdHlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbnZFbnRyeShFbnZFbnRyeSBlbnZFbnRyeSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllbnZFbnRyeSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSWNvbihJY29uIGljb24sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpaWNvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldCBpbmplY3Rpb25UYXJnZXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpaW5qZWN0aW9uVGFyZ2V0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBsaWZlY3ljbGVDYWxsYmFjaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClsaWZlY3ljbGVDYWxsYmFjaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpbGlzdGVuZXIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gbWVzc2FnZURlc3RpbmF0aW9uLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KW1lc3NhZ2VEZXN0aW5hdGlvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBtZXNzYWdlRGVzdGluYXRpb25SZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpbWVzc2FnZURlc3RpbmF0aW9uUmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbVZhbHVlKFBhcmFtVmFsdWUgcGFyYW1WYWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClwYXJhbVZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWYoUGVyc2lzdGVuY2VDb250ZXh0UmVmIHBlcnNpc3RlbmNlQ29udGV4dFJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClwZXJzaXN0ZW5jZUNvbnRleHRSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdFJlZihQZXJzaXN0ZW5jZVVuaXRSZWYgcGVyc2lzdGVuY2VVbml0UmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXBlcnNpc3RlbmNlVW5pdFJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIHBvcnRDb21wb25lbnRSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcG9ydENvbXBvbmVudFJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJvcGVydHlUeXBlKFByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcHJvcGVydHlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClyZXNvdXJjZUVudlJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcmVzb3VyY2VSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJ1bkFzKFJ1bkFzIHJ1bkFzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXJ1bkFzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZWN1cml0eVJvbGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlY3VyaXR5Um9sZVJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZihTZXJ2aWNlUmVmIHNlcnZpY2VSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VydmljZVJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZkhhbmRsZXIoU2VydmljZVJlZkhhbmRsZXIgc2VydmljZVJlZkhhbmRsZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VydmljZVJlZkhhbmRsZXIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBzZXJ2aWNlUmVmSGFuZGxlckNoYWluLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVcmxQYXR0ZXJuVHlwZShVcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJuVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl1cmxQYXR0ZXJuVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmVHlwZShFamJSZWZUeXBlIGVqYlJlZlR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlIGVudkVudHJ5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZShQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNBdXRoVHlwZShSZXNBdXRoVHlwZSByZXNBdXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc1NoYXJpbmdTY29wZVR5cGUoUmVzU2hhcmluZ1Njb3BlVHlwZSByZXNTaGFyaW5nU2NvcGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGV3ZXlWZXJzaW9uVHlwZShTdHJpbmcgZGV3ZXlWZXJzaW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGV3ZXlWZXJzaW9uVHlwZV9QYXR0ZXJuKGRld2V5VmVyc2lvblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURld2V5VmVyc2lvblR5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gREVXRVlfVkVSU0lPTl9UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJcXC4/WzAtOV0rKFxcLlswLTldKykqIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+RGV3ZXkgVmVyc2lvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGV3ZXlWZXJzaW9uVHlwZV9QYXR0ZXJuKFN0cmluZyBkZXdleVZlcnNpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5ERVdFWV9WRVJTSU9OX1RZUEUsIGRld2V5VmVyc2lvblR5cGUsIERFV0VZX1ZFUlNJT05fVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFSkJMaW5rKFN0cmluZyBlamJMaW5rLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmTmFtZVR5cGUoU3RyaW5nIGVqYlJlZk5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmVHlwZU9iamVjdChFamJSZWZUeXBlIGVqYlJlZlR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbnZFbnRyeVR5cGVPYmplY3QoRW52RW50cnlUeXBlIGVudkVudHJ5VHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUhvbWUoU3RyaW5nIGhvbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKYXZhSWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUphdmFJZGVudGlmaWVyX1BhdHRlcm4oamF2YUlkZW50aWZpZXIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUphdmFJZGVudGlmaWVyX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEpBVkFfSURFTlRJRklFUl9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiKCR8X3xcXHB7TH0pKFxccHtMfXxcXHB7TmR9fF98JCkqIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+SmF2YSBJZGVudGlmaWVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YUlkZW50aWZpZXJfUGF0dGVybihTdHJpbmcgamF2YUlkZW50aWZpZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkpBVkFfSURFTlRJRklFUiwgamF2YUlkZW50aWZpZXIsIEpBVkFfSURFTlRJRklFUl9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKYXZhVHlwZShTdHJpbmcgamF2YVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUphdmFUeXBlX1BhdHRlcm4oamF2YVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUphdmFUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEpBVkFfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW15cXHB7Wn1dKiIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPkphdmEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFUeXBlX1BhdHRlcm4oU3RyaW5nIGphdmFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5KQVZBX1RZUEUsIGphdmFUeXBlLCBKQVZBX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSk5ESU5hbWUoU3RyaW5nIGpuZGlOYW1lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWwoU3RyaW5nIGxvY2FsLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxIb21lKFN0cmluZyBsb2NhbEhvbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25MaW5rLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXRoVHlwZShTdHJpbmcgcGF0aFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgcGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlbW90ZShTdHJpbmcgcmVtb3RlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzQXV0aFR5cGVPYmplY3QoUmVzQXV0aFR5cGUgcmVzQXV0aFR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJvbGVOYW1lKFN0cmluZyByb2xlTmFtZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZShMaXN0IHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlX0l0ZW1UeXBlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgSXRlbVR5cGUgY29uc3RyYWludCBvZiAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlX0l0ZW1UeXBlKExpc3Qgc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChJdGVyYXRvciBpID0gc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpICYmIChyZXN1bHQgfHwgZGlhZ25vc3RpY3MgIT0gbnVsbCk7ICkgewotCQkJT2JqZWN0IGl0ZW0gPSBpLm5leHQoKTsKLQkJCWlmIChKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRS5pc0luc3RhbmNlKGl0ZW0pKSB7Ci0JCQkJcmVzdWx0ICY9IHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKFN0cmluZylpdGVtLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlyZXBvcnREYXRhVmFsdWVUeXBlVmlvbGF0aW9uKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFLCBpdGVtLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKFN0cmluZyBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVfTWVtYmVyVHlwZXMoc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1lbWJlclR5cGVzIGNvbnN0cmFpbnQgb2YgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZV9NZW1iZXJUeXBlcyhTdHJpbmcgc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaWYgKGRpYWdub3N0aWNzICE9IG51bGwpIHsKLQkJCUJhc2ljRGlhZ25vc3RpYyB0ZW1wRGlhZ25vc3RpY3MgPSBuZXcgQmFzaWNEaWFnbm9zdGljKCk7Ci0JCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKSkgewotCQkJCWlmICh4bWxUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQW55VVJJKChTdHJpbmcpc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAodmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZylzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSwgdGVtcERpYWdub3N0aWNzLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlMaXN0IGNoaWxkcmVuID0gdGVtcERpYWdub3N0aWNzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJZGlhZ25vc3RpY3MuYWRkKChEaWFnbm9zdGljKWNoaWxkcmVuLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKSkgewotCQkJCWlmICh4bWxUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQW55VVJJKChTdHJpbmcpc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIG51bGwsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLmlzSW5zdGFuY2Uoc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUpKSB7Ci0JCQkJaWYgKHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKChTdHJpbmcpc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIG51bGwsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoU3RyaW5nIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4oc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIiMjLisiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZV9QYXR0ZXJuKFN0cmluZyBzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLCBzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUsIFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oU3RyaW5nIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm5fUGF0dGVybihzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk5fX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlxcKnwoW1xcaS1bOl1dW1xcYy1bOl1dKjopP1tcXGktWzpdXVtcXGMtWzpdXSpcXCo/IikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm5fUGF0dGVybihTdHJpbmcgc2VydmljZVJlZlFuYW1lUGF0dGVybiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTiwgc2VydmljZVJlZlFuYW1lUGF0dGVybiwgU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTl9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcnVlRmFsc2VUeXBlKGJvb2xlYW4gdHJ1ZUZhbHNlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZV9QYXR0ZXJuKHRydWVGYWxzZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVRydWVGYWxzZVR5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gVFJVRV9GQUxTRV9UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIodHJ1ZXxmYWxzZSkiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5UcnVlIEZhbHNlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4oYm9vbGVhbiB0cnVlRmFsc2VUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5UUlVFX0ZBTFNFX1RZUEUsIG5ldyBCb29sZWFuKHRydWVGYWxzZVR5cGUpLCBUUlVFX0ZBTFNFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZU9iamVjdChCb29sZWFuIHRydWVGYWxzZVR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRydWVGYWxzZVR5cGVfUGF0dGVybih0cnVlRmFsc2VUeXBlT2JqZWN0LmJvb2xlYW5WYWx1ZSgpLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vSmF2YWVlVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg4N2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBKYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9KYXZhZWVYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0ODUwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgYWN0aXZhdGlvbi1jb25maWdUeXBlIGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiAJZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0gKiAJaW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uCi0gKiAJYWJvdXQgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQsIG1lc3NhZ2Ugc2VsZWN0b3IsIGV4cGVjdGVkCi0gKiAJZGVzdGluYXRpb24gdHlwZSwgZXRjLgotICogCi0gKiAJVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCi0gKiAJbmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0gKiAKLSAqIAlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAqIAltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uQ29uZmlnIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjBmOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLSAqIAljb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLSAqIAotICogCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotICogCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMKLQkgKiAJICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLQkgKiAJICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiAKLQkgKiAJICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLQkgKiAJICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0JICogCSAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eQotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50Ci0JICogCSAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbgotCSAqIAkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNjdlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUgZGVjbGFyZXMgYW4gYXBwbGljYXRpb24KLSAqICAgICAgICAgZXhjZXB0aW9uLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiAKLSAqICAgICAgICAgICAgIC0gdGhlIGV4Y2VwdGlvbiBjbGFzcy4gV2hlbiB0aGUgY29udGFpbmVyIHJlY2VpdmVzCi0gKiAgICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBvZiB0aGlzIHR5cGUsIGl0IGlzIHJlcXVpcmVkIHRvCi0gKiAgICAgICAgICAgICAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24gYXMgYW4gYXBwbGNhdGlvbiBleGNlcHRpb24KLSAqICAgICAgICAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCi0gKiAgICAgICAgICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIHJvbGxiYWNrIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZm9yZSBmb3J3YXJkaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlCi0gKiAgICAgICAgICAgICAgIGNsaWVudC4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNnZXRFeGNlcHRpb25DbGFzcyA8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNlcHRpb24gQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2VwdGlvbkNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fRXhjZXB0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXhjZXB0aW9uQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldEV4Y2VwdGlvbkNsYXNzIDxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4Y2VwdGlvbkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsYmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sbGJhY2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbGJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI3Vuc2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI3NldFJvbGxiYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uX1JvbGxiYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JvbGxiYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbGJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI3Vuc2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI2lzUm9sbGJhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGxiYWNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSb2xsYmFjaygpCi0JICogQHNlZSAjaXNSb2xsYmFjaygpCi0JICogQHNlZSAjc2V0Um9sbGJhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJvbGxiYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2lzUm9sbGJhY2sgPGVtPlJvbGxiYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsYmFjazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI2lzUm9sbGJhY2soKQotCSAqIEBzZWUgI3NldFJvbGxiYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSb2xsYmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcHBsaWNhdGlvbkV4Y2VwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fyb3VuZEludm9rZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fyb3VuZEludm9rZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyMjA4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRJbnZva2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcm91bmQgSW52b2tlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgICBUaGUgYXJvdW5kLWludm9rZSB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gKiAgICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGFyb3VuZCBpbnZva2UgcG9ydGlvbiBvZiBhbgotICogICAgICAgICBlamIgaW52b2NhdGlvbi4gIE5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lCi0gKiAgICAgICAgIGFyb3VuZCBpbnZva2UgbWV0aG9kIGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdCBiZQotICogICAgICAgICBvdmVybG9hZGVkLgotICogCi0gKiAgICAgICAgIElmIHRoZSBjbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICogICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gKiAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIG9yIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUKLSAqICAgICAgICAgbG9jYXRpb24gaW4gdGhlIGRlc2NyaXB0b3IgaW4gd2hpY2ggdGhlIGFyb3VuZCBpbnZva2UKLSAqICAgICAgICAgZGVmaW5pdGlvbiBhcHBlYXJzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXJvdW5kSW52b2tlVHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcm91bmRJbnZva2VUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXJvdW5kSW52b2tlVHlwZV9DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc18oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFyb3VuZEludm9rZVR5cGVfTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFyb3VuZEludm9rZVR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTkxMTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotICogCWFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotICogCi0gKiAJVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotICogCWZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQotICogCWRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotICogCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotICogCWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLCB0aGUgZGVmaW5pdGlvbgotICogICAgICAgICBvZiBpbnRlcmNlcHRvciBiaW5kaW5ncywgYSBsaXN0IG9mCi0gKiAJbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKLSAqICAgICAgICAgZXhjZXB0aW9uIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4KLSAqIAotICogCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0gKiAJb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0gKiAKLSAqIAlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotICogCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1ldGhvZFBlcm1pc3Npb25zIDxlbT5NZXRob2QgUGVybWlzc2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRJbnRlcmNlcHRvckJpbmRpbmdzIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0RXhjbHVkZUxpc3QgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucyA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibHlEZXNjcmlwdG9yIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfQ29udGFpbmVyVHJhbnNhY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIEJpbmRpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfSW50ZXJjZXB0b3JCaW5kaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGNsdWRlTGlzdCBnZXRFeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEV4Y2x1ZGVMaXN0IDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXNzZW1ibHlEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01QRmllbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWI4MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01QRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q01QIEZpZWxkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgY21wLWZpZWxkVHlwZSBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi0gKiAJY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi0gKiAJYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUEZpZWxkKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUEZpZWxkIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVBGaWVsZF9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICogCSAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQkgKiAKLQkgKiAJICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAqIAkgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotCSAqIAkgICAgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLQkgKiAJICAgIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLQkgKiAJICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotCSAqIAkgICAgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0JICogCi0JICogCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgKiAJICAgIGNtcC12ZXJzaW9uIDEueCBtdXN0IGRlbm90ZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUKLQkgKiAJICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01QRmllbGRfRmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUEZpZWxkX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDTVBGaWVsZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUkZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmZkM2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUkZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNNUiBGaWVsZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGNtci1maWVsZFR5cGUgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZgotICogCWEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi0gKiAJdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi0gKiAJcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQKLSAqIAljb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IKLSAqIAltZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotICogCXVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZQotICogCXR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGROYW1lIDxlbT5DbXIgRmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGRUeXBlIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUkZpZWxkKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUkZpZWxkIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZF9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q21yIEZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgKiAJICAgIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbgotCSAqIAkgICAgY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEKLQkgKiAJICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotCSAqIAkgICAgd2hvc2UgbmFtZXMgY29uc2lzdCBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkgKiAJICAgIHNwZWNpZmllZCBieSBjbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QKLQkgKiAJICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENtckZpZWxkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUkZpZWxkX0NtckZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbXJGaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkTmFtZSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNtciBGaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbXJGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENtckZpZWxkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q21yIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iamF2YS51dGlsLkNvbGxlY3Rpb24iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JICogQHNlZSAjaXNTZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNzZXRDbXJGaWVsZFR5cGUoQ01SRmllbGRUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZF9DbXJGaWVsZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDTVJGaWVsZFR5cGUgZ2V0Q21yRmllbGRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZFR5cGUgPGVtPkNtciBGaWVsZCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbXIgRmllbGQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUKLQkgKiBAc2VlICNpc1NldENtckZpZWxkVHlwZSgpCi0JICogQHNlZSAjdW5zZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI2dldENtckZpZWxkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q21yRmllbGRUeXBlKENNUkZpZWxkVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkVHlwZSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNnZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI3NldENtckZpZWxkVHlwZShDTVJGaWVsZFR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDbXJGaWVsZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGRUeXBlIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENtckZpZWxkVHlwZSgpCi0JICogQHNlZSAjZ2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNzZXRDbXJGaWVsZFR5cGUoQ01SRmllbGRUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q21yRmllbGRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01SRmllbGRfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIENNUkZpZWxkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MjhmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLSAqIAljb2xsZWN0aW9uLXZhbHVlZCBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5Ci0gKiAJYmVhbiBjbGFzcy4gVGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgdXNpbmcgY21yLWZpZWxkLXR5cGVUeXBlCi0gKiAJbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUkZpZWxkVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVJGaWVsZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgVXRpbCBDb2xsZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIFV0aWwgQ29sbGVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfQ09MTEVDVElPTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9VVElMX0NPTExFQ1RJT04gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBVdGlsIFNldDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBVdGlsIFNldDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfU0VUX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1VUSUxfU0VUID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgVXRpbCBDb2xsZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfVVRJTF9DT0xMRUNUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDTVJGaWVsZFR5cGUgSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTCA9IG5ldyBDTVJGaWVsZFR5cGUoSkFWQV9VVElMX0NPTExFQ1RJT04sICJqYXZhVXRpbENvbGxlY3Rpb24iLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgU2V0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfVVRJTF9TRVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENNUkZpZWxkVHlwZSBKQVZBX1VUSUxfU0VUX0xJVEVSQUwgPSBuZXcgQ01SRmllbGRUeXBlKEpBVkFfVVRJTF9TRVQsICJqYXZhVXRpbFNldCIsICJqYXZhLnV0aWwuU2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkNNUiBGaWVsZCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDTVJGaWVsZFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQ01SRmllbGRUeXBlW10gewotCQkJSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTCwKLQkJCUpBVkFfVVRJTF9TRVRfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5DTVIgRmllbGQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDTVJGaWVsZFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlDTVJGaWVsZFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DTVIgRmllbGQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNUkZpZWxkVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUNNUkZpZWxkVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDTVJGaWVsZFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEpBVkFfVVRJTF9DT0xMRUNUSU9OOiByZXR1cm4gSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTDsKLQkJCWNhc2UgSkFWQV9VVElMX1NFVDogcmV0dXJuIEpBVkFfVVRJTF9TRVRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ01SRmllbGRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9DTVJGaWVsZFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NtcFZlcnNpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DbXBWZXJzaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM3ODU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NtcFZlcnNpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNtcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotICogCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLSAqIAljbXAtdmVyc2lvbiBlbGVtZW50cy4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICAxLngKLSAqIAkgICAgMi54Ci0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENtcFZlcnNpb25UeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENtcFZlcnNpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj4xWDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+MVg8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjXzFYX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfMVggPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Mlg8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjJYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18yWF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzJYID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjFYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18xWAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ21wVmVyc2lvblR5cGUgXzFYX0xJVEVSQUwgPSBuZXcgQ21wVmVyc2lvblR5cGUoXzFYLCAiXzFYIiwgIjEueCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjJYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18yWAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ21wVmVyc2lvblR5cGUgXzJYX0xJVEVSQUwgPSBuZXcgQ21wVmVyc2lvblR5cGUoXzJYLCAiXzJYIiwgIjIueCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbXBWZXJzaW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBDbXBWZXJzaW9uVHlwZVtdIHsKLQkJCV8xWF9MSVRFUkFMLAotCQkJXzJYX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENtcFZlcnNpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQ21wVmVyc2lvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ21wVmVyc2lvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlDbXBWZXJzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENtcFZlcnNpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBfMVg6IHJldHVybiBfMVhfTElURVJBTDsKLQkJCWNhc2UgXzJYOiByZXR1cm4gXzJYX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENtcFZlcnNpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9DbXBWZXJzaW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db250YWluZXJUcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MjJhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db250YWluZXJUcmFuc2FjdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotICogCW11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzCi0gKiAJbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi0gKiAJbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlCi0gKiAJdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQKLSAqIAltZXRob2RzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0VHJhbnNBdHRyaWJ1dGUgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnMgQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ik5vdFN1cHBvcnRlZCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3NldFRyYW5zQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX1RyYW5zQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldFRyYW5zQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0VHJhbnNBdHRyaWJ1dGUgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc0F0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0VHJhbnNBdHRyaWJ1dGUgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3NldFRyYW5zQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRUcmFuc0F0dHJpYnV0ZSA8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQHNlZSAjc2V0VHJhbnNBdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb250YWluZXJUcmFuc2FjdGlvblR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQkphci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjExY2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQkphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgSmFyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZWpiLWphclR5cGUgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIKLSAqIAlkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0gKiAKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAqIAkgICAgICBpY29uIGZpbGUgbmFtZQotICogCSAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0gKiAJICAgICAgZW50ZXJwcmlzZSBiZWFucyB0aGF0IGlzIG5vdCBzcGVjaWZpZWQgdGhyb3VnaAotICogICAgICAgICAgICAgICBhbm5vdGF0aW9ucwotICogICAgICAgICAgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGludGVyY2VwdG9yIGNsYXNzZXMKLSAqIAkgICAgLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsCi0gKiAJICAgICAgaWYgYW55LgotICogCSAgICAtIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZQotICogCSAgICAgIGVqYi1qYXIuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0UmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVqYkNsaWVudEphciA8ZW0+RWpiIENsaWVudCBKYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXIoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCSmFyIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnRlcnByaXNlQmVhbnMgZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RW50ZXJwcmlzZUJlYW5zIDxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmNlcHRvcnMoSW50ZXJjZXB0b3JzVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yc1R5cGUgZ2V0SW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SW50ZXJjZXB0b3JzIDxlbT5JbnRlcmNlcHRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmNlcHRvcnMoSW50ZXJjZXB0b3JzVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlbGF0aW9uc2hpcHMoUmVsYXRpb25zaGlwcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWxhdGlvbnNoaXBzIGdldFJlbGF0aW9uc2hpcHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRSZWxhdGlvbnNoaXBzIDxlbT5SZWxhdGlvbnNoaXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCSAqIAkgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotCSAqIAkgICAgcHJvZHVjZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yIDxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIENsaWVudCBKYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAqIAkgICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYQotCSAqIAkgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi0JICogCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJCSAgJmx0O2VqYi1jbGllbnQtamFyJmd0O2VtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgotCSAqIAkJICAmbHQ7L2VqYi1jbGllbnQtamFyJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsaWVudCBKYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYkNsaWVudEphcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9FamJDbGllbnRKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xpZW50SmFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RWpiQ2xpZW50SmFyIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsaWVudCBKYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYkNsaWVudEphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAqIAkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICogCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAqIAkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICogCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICogCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICogCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgKiAJICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAqIAkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAqIAkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiAJICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAqIAkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICogCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiAJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIzLjAiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgKiAJICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0Ci0JICogCSAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICogCSAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0JICogCSAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLQkgKiAJICBzY2hlbWEuCi0JICogCi0JICogCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9WZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmVyc2lvbigpOwotCi19IC8vIEVKQkphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNiNzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRFamJKYXIgPGVtPkVqYiBKYXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZWpiLWphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogCi0JICogICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBKYXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVqYkphcihFSkJKYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX0VqYkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQkphciBnZXRFamJKYXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldEVqYkphciA8ZW0+RWpiIEphcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIEphcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWpiSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJKYXIoRUpCSmFyIHZhbHVlKTsKLQotfSAvLyBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDNjMmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBSZWxhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVqYi1yZWxhdGlvblR5cGUgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCi0gKiAJZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi0gKiAJYnkgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbgotICogCW9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7IGFuZCBleGFjdGx5IHR3bwotICogCXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLSAqIAllamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZQotICogCXJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyCi0gKiAJZmlsZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldEVqYlJlbGF0aW9uTmFtZSA8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVzIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb24oKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCUmVsYXRpb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi0JICogCSAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0JICogCi0JICogCSAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiUmVsYXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYlJlbGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RWpiUmVsYXRpb25OYW1lIDxlbT5FamIgUmVsYXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYlJlbGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiUmVsYXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25zaGlwUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVKQlJlbGF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk4ZWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYQotICogCSAgcmVsYXRpb25zaGlwLiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLgotICogCi0gKiAJICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotICogCSAgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYQotICogCSAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbAotICogCSAgc3BlY2lmaWNhdGlvbiBvZiBjYXNjYWRlLWRlbGV0ZSBmdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsKLSAqIAkgIHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LAotICogCSAgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcwotICogCSAgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlLgotICogCi0gKiAJICBUaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCi0gKiAKLSAqIAkgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eQotICogCSAgYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbAotICogCSAgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYQotICogCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQKLSAqIAkgIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mCi0gKiAJICBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMKLSAqIAkgIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kCi0gKiAJICB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcwotICogCSAgIm5vdCBhd2FyZSIgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O2VqYi1yZWxhdGlvbiZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLXJlbGF0aW9uLW5hbWUmZ3Q7UHJvZHVjdC1MaW5lSXRlbSZsdDsvZWpiLXJlbGF0aW9uLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1yZWxhdGlvbnNoaXAtcm9sZSZndDsKLSAqIAkJICAmbHQ7ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUmZ3Q7cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gKiAJCSAgJmx0Oy9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSZndDsKLSAqIAkJICAmbHQ7bXVsdGlwbGljaXR5Jmd0O09uZSZsdDsvbXVsdGlwbGljaXR5Jmd0OwotICogCQkgICZsdDtyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UmZ3Q7Ci0gKiAJCSAgJmx0O2VqYi1uYW1lJmd0O1Byb2R1Y3RFSkImbHQ7L2VqYi1uYW1lJmd0OwotICogCQkgICZsdDsvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlJmd0OwotICogCSAgICAgICAmbHQ7L2VqYi1yZWxhdGlvbnNoaXAtcm9sZSZndDsKLSAqIAkgICZsdDsvZWpiLXJlbGF0aW9uJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldENhc2NhZGVEZWxldGUgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UgPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRDbXJGaWVsZCA8ZW0+Q21yIEZpZWxkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlJlbGF0aW9uc2hpcFJvbGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotCSAqIAkgICAgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbgotCSAqIAkgICAgZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZQotCSAqIAkgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iT25lIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU11bHRpcGxpY2l0eVR5cGUgZ2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIERlbGV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEKLQkgKiAJICAgIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgKiAJICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLQkgKiAJICAgIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbgotCSAqIAkgICAgb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAqIAkgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLQkgKiAJICAgIHdoaWNoIHRoZSBvdGhlciBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgKiAJICAgIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGVEZWxldGUoRW1wdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbXB0eVR5cGUgZ2V0Q2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRDYXNjYWRlRGVsZXRlIDxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGVEZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVEZWxldGUoRW1wdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZShSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXBSb2xlU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZShSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbXIgRmllbGQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNtciBGaWVsZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbXIgRmllbGQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENtckZpZWxkKENNUkZpZWxkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ01SRmllbGQgZ2V0Q21yRmllbGQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q21yRmllbGQgPGVtPkNtciBGaWVsZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbXJGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q21yRmllbGQoQ01SRmllbGQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRUpCUmVsYXRpb25zaGlwUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VqYkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VqYkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhMjIyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FamJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZyBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25FeGNlcHRpb24gY3JlYXRlQXBwbGljYXRpb25FeGNlcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFyb3VuZEludm9rZVR5cGUgY3JlYXRlQXJvdW5kSW52b2tlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNNUCBGaWVsZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDTVBGaWVsZCBjcmVhdGVDTVBGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ01SRmllbGQgY3JlYXRlQ01SRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250YWluZXJUcmFuc2FjdGlvblR5cGUgY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBKYXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBKYXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQkphciBjcmVhdGVFSkJKYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgUmVsYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBSZWxhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnRlcnByaXNlQmVhbnMgY3JlYXRlRW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eSBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW50aXR5QmVhbiBjcmVhdGVFbnRpdHlCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGNsdWRlTGlzdCBjcmVhdGVFeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbml0TWV0aG9kVHlwZSBjcmVhdGVJbml0TWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBjcmVhdGVJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yT3JkZXJUeXBlIGNyZWF0ZUludGVyY2VwdG9yT3JkZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9ycyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZXJjZXB0b3JzVHlwZSBjcmVhdGVJbnRlcmNlcHRvcnNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yVHlwZSBjcmVhdGVJbnRlcmNlcHRvclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZURyaXZlbkJlYW4gY3JlYXRlTWVzc2FnZURyaXZlbkJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGFyYW1zIGNyZWF0ZU1ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBlcm1pc3Npb24gY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFR5cGUgY3JlYXRlTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBjcmVhdGVOYW1lZE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UXVlcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlRdWVyeSBjcmVhdGVRdWVyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUXVlcnlNZXRob2QgY3JlYXRlUXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSBjcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWxhdGlvbnNoaXBzIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlbW92ZU1ldGhvZFR5cGUgY3JlYXRlUmVtb3ZlTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5VHlwZSBjcmVhdGVTZWN1cml0eUlkZW50aXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXNzaW9uIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlc3Npb24gQmVhbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2Vzc2lvbkJlYW4gY3JlYXRlU2Vzc2lvbkJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCk7Ci0KLX0gLy9FamJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRlcnByaXNlQmVhbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGVycHJpc2VCZWFucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWRkYjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGVycHJpc2VCZWFucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVudGVycHJpc2UtYmVhbnNUeXBlIGRlY2xhcmVzIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLSAqIAliZWFucy4gRWFjaCBiZWFuIGNhbiBiZSBhIHNlc3Npb24sIGVudGl0eSBvciBtZXNzYWdlLWRyaXZlbgotICogCWJlYW4uCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRTZXNzaW9uQmVhbnMgPGVtPlNlc3Npb24gQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRFbnRpdHlCZWFucyA8ZW0+RW50aXR5IEJlYW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0TWVzc2FnZURyaXZlbkJlYW5zIDxlbT5NZXNzYWdlIERyaXZlbiBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnMoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50ZXJwcmlzZUJlYW5zIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5zX0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vzc2lvbiBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlc3Npb24gQmVhbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnNfU2Vzc2lvbkJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXNzaW9uQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudGl0eUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERyaXZlbiBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGVycHJpc2VCZWFuc19NZXNzYWdlRHJpdmVuQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGVycHJpc2VCZWFuc19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVudGVycHJpc2VCZWFucwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGl0eUJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGl0eUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkYTUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRpdHlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZW50aXR5LWJlYW5UeXBlIGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLSAqIAljb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICogCSAgICAgIGljb24gZmlsZSBuYW1lCi0gKiAJICAgIC0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0gKiAJICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICogICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICogICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLiBUaGlzCi0gKiAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgotICogICAgICAgICAgICAgICBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0gKiAJICAgICAgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLSAqIAkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwKLSAqIAkgICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAqIAkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICogCSAgICAtIHRoZSBvcHRpb25hbCBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZS4gSWYKLSAqICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAqIAkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lCi0gKiAJICAgIC0gYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5Ci0gKiAJICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLSAqIAkgICAgICBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncwotICogCSAgICAgIGFic3RyYWN0IHNjaGVtYSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleQotICogCSAgICAgIGZpZWxkCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICogCSAgICAgIGVudHJpZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0gKiAJICAgICAgRUpCIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICogCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotICogCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gKiAJICAgICAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICogCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zCi0gKiAJICAgICAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQotICogCSAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZAotICogCWZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZAotICogCWNtcC12ZXJzaW9uIDIueC4KLSAqIAotICogCVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yCi0gKiAJaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotICogCi0gKiAJVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlCi0gKiAJZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmCi0gKiAJdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KLSAqIAllbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAyLnguCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0gKiAJdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAqIAotICogCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLSAqIAl0aGUgZW50aXR5IGJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKLSAqIAlpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICogCi0gKiAJRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0gKiAJdGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZQotICogCXBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZAotICogCXF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi0gKiAJZm9yIHRoZSBlbnRpdHkgYmVhbi4KLSAqIAotICogCVRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUKLSAqIAlzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KLSAqIAlhcmUgZW1wdHkuCi0gKiAKLSAqIAlBdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQotICogCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZAotICogCXRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlCi0gKiAJZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByaW1LZXlDbGFzcyA8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jaXNSZWVudHJhbnQgPGVtPlJlZW50cmFudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRDbXBWZXJzaW9uIDxlbT5DbXAgVmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRBYnN0cmFjdFNjaGVtYU5hbWUgPGVtPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcEZpZWxkcyA8ZW0+Q21wIEZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmlta2V5RmllbGQgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UXVlcmllcyA8ZW0+UXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHlCZWFuIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0VqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9Ib21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG9tZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1vdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1JlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZW1vdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWxIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9Mb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0xvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQmVhbiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlCi0JICogQHNlZSAjaXNTZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVR5cGUoUGVyc2lzdGVuY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBlcnNpc3RlbmNlVHlwZSBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCSAqIEBzZWUgI2lzU2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJzaXN0ZW5jZVR5cGUoUGVyc2lzdGVuY2VUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlVHlwZShQZXJzaXN0ZW5jZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVR5cGUoUGVyc2lzdGVuY2VUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltIEtleSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUKLQkgKiAJICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JICogCSAgICBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCSAqIAotCSAqIAkgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0JICogCSAgICBkZWZlcnJlZCB0byBkZXBsb3ltZW50IHRpbWUsIHRoZSBwcmltLWtleS1jbGFzcwotCSAqIAkgICAgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltIEtleSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpbUtleUNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9QcmltS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbUtleUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByaW1LZXlDbGFzcyA8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW0gS2V5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmltS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1LZXlDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLQkgKiAJICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLQkgKiAKLQkgKiAJICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0JICogCSAgICBmb2xsb3dpbmc6IHRydWUgb3IgZmFsc2UKLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVlbnRyYW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlZW50cmFudCgpCi0JICogQHNlZSAjdW5zZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jaXNSZWVudHJhbnQgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVlbnRyYW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlZW50cmFudCgpCi0JICogQHNlZSAjdW5zZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWVudHJhbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jaXNSZWVudHJhbnQgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAc2VlICNzZXRSZWVudHJhbnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlZW50cmFudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQHNlZSAjc2V0UmVlbnRyYW50KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEueCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNtcCBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtcCBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JICogQHNlZSAjaXNTZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldENtcFZlcnNpb24oKQotCSAqIEBzZWUgI3NldENtcFZlcnNpb24oQ21wVmVyc2lvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fQ21wVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNtcFZlcnNpb25UeXBlIGdldENtcFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wVmVyc2lvbiA8ZW0+Q21wIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNtcCBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JICogQHNlZSAjaXNTZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldENtcFZlcnNpb24oKQotCSAqIEBzZWUgI2dldENtcFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENtcFZlcnNpb24oQ21wVmVyc2lvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcFZlcnNpb24gPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENtcFZlcnNpb24oKQotCSAqIEBzZWUgI2dldENtcFZlcnNpb24oKQotCSAqIEBzZWUgI3NldENtcFZlcnNpb24oQ21wVmVyc2lvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDbXBWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wVmVyc2lvbiA8ZW0+Q21wIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtcCBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRDbXBWZXJzaW9uKENtcFZlcnNpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q21wVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICogCSAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAqIAkgICAgY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLgotCSAqIAotCSAqIAkgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0JICogCSAgICBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcwotCSAqIAkgICAgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBYnN0cmFjdFNjaGVtYU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0Fic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0QWJzdHJhY3RTY2hlbWFOYW1lIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWJzdHJhY3RTY2hlbWFOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbXAgRmllbGRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q21wIEZpZWxkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtcCBGaWVsZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fQ21wRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRDbXBGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1rZXkgRmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICogCSAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLQkgKiAJICAgIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCSAqIAotCSAqIAkgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotCSAqIAkgICAgaW4gdGhlIGNtcC1maWVsZCBlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCi0JICogCSAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotCSAqIAotCSAqIAkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeQotCSAqIAkgICAga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICogCSAgICAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiAJICAgIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAotCSAqIAkgICAgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZgotCSAqIAkgICAgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWtleSBGaWVsZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpbWtleUZpZWxkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbWtleUZpZWxkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByaW1rZXlGaWVsZCA8ZW0+UHJpbWtleSBGaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWtleSBGaWVsZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJpbWtleUZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmlta2V5RmllbGQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRW52RW50cmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1NlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFbnRpdHlCZWFuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRXhjbHVkZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjhkM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRXhjbHVkZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotICogCXRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLSAqIAotICogCUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi0gKiAJaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotICogCW1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFeGNsdWRlTGlzdCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNsdWRlTGlzdCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFeGNsdWRlTGlzdF9NZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3RfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEV4Y2x1ZGVMaXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSUVKQlJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JRUpCUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwODUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JRUpCUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJRUpCUmVzb3VyY2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFSkJKYXIgZ2V0RWpiSmFyKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Jbml0TWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW5pdE1ldGhvZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyZTEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Jbml0TWV0aG9kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBNZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRDcmVhdGVNZXRob2QgPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW5pdE1ldGhvZFR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5pdE1ldGhvZFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0ZSBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3JlYXRlTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW5pdE1ldGhvZFR5cGVfQ3JlYXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZWRNZXRob2RUeXBlIGdldENyZWF0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0Q3JlYXRlTWV0aG9kIDxlbT5DcmVhdGUgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDcmVhdGVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0ZU1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBnZXRCZWFuTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJlYW5NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJlYW5NZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbml0TWV0aG9kVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5pdE1ldGhvZFR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvckJpbmRpbmdUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvckJpbmRpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZmRhMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgICBUaGUgaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmcgb2YKLSAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3NlcyB0byBiZWFucyB3aXRoaW4gdGhlIGVqYi1qYXIuCi0gKiAgICAgICAgIEl0IGNvbnNpc3RzIG9mIDoKLSAqIAotICogICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gKiAgICAgICAgICAgLSBUaGUgbmFtZSBvZiBhbiBlamIgd2l0aGluIHRoZSBlamItamFyIG9yIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIsCi0gKiAgICAgICAgICAgICB3aGljaCBpcyB1c2VkIHRvIGRlZmluZSBpbnRlcmNlcHRvcnMgdGhhdCBhcmUgYm91bmQgdG8gYWxsCi0gKiAgICAgICAgICAgICBiZWFucyBpbiB0aGUgZWpiLWphci4KLSAqICAgICAgICAgICAtIEEgbGlzdCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZSBjb250ZW50cyBvZgotICogICAgICAgICAgICAgdGhlIGVqYi1uYW1lIGVsZW1lbnQgb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0b3RhbCBvcmRlcmluZwotICogICAgICAgICAgICAgb3ZlciB0aGUgaW50ZXJjZXB0b3JzIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBsZXZlbCBhbmQgYWJvdmUuCi0gKiAgICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAqICAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGRlZmF1bHQgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0bwotICogICAgICAgICAgICAgYSBiZWFuLWNsYXNzIGFuZC9vciBidXNpbmVzcyBtZXRob2QuCi0gKiAgICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gKiAgICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBjbGFzcyBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvCi0gKiAgICAgICAgICAgICBhIGJ1c2luZXNzIG1ldGhvZC4KLSAqICAgICAgICAgICAtIEFuIG9wdGlvbmFsIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIGRlc2NyaWJpbmcgdGhlIG5hbWUvcGFyYW1zCi0gKiAgICAgICAgICAgICBvZiBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvci4KLSAqIAotICogICAgICAgICAgSW50ZXJjZXB0b3JzIGJvdW5kIHRvIGFsbCBjbGFzc2VzIHVzaW5nIHRoZSB3aWxkY2FyZCBzeW50YXgKLSAqICAgICAgICAgICIqIiBhcmUgZGVmYXVsdCBpbnRlcmNlcHRvcnMgZm9yIHRoZSBjb21wb25lbnRzIGluIHRoZSBlamItamFyLgotICogICAgICAgICAgSW4gYWRkaXRpb24sIGludGVyY2VwdG9ycyBtYXkgYmUgYm91bmQgYXQgdGhlIGxldmVsIG9mIHRoZSBiZWFuCi0gKiAgICAgICAgICBjbGFzcyAoY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKSBvciBidXNpbmVzcyBtZXRob2RzIChtZXRob2QtbGV2ZWwKLSAqICAgICAgICAgIGludGVyY2VwdG9ycyApLgotICogCi0gKiAgICAgICAgICBUaGUgYmluZGluZyBvZiBpbnRlcmNlcHRvcnMgdG8gY2xhc3NlcyBpcyBhZGRpdGl2ZS4gIElmIGludGVyY2VwdG9ycwotICogICAgICAgICAgYXJlIGJvdW5kIGF0IHRoZSBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzIHRoZQotICogICAgICAgICAgbWV0aG9kLWxldmVsLCBib3RoIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMKLSAqICAgICAgICAgIG1ldGhvZC1sZXZlbCB3aWxsIGFwcGx5LgotICogCi0gKiAgICAgICAgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIGludGVyY2VwdG9yIGVsZW1lbnQgc3ludGF4IDoKLSAqIAotICogICAgICAgICAgMS4KLSAqICAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gKiAgICAgICAgICAgIDxlamItbmFtZT4qPC9lamItbmFtZT4KLSAqICAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAqICAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAqIAotICogICAgICAgICAgU3BlY2lmeWluZyB0aGUgZWpiLW5hbWUgYXMgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBkZXNpZ25hdGVzCi0gKiAgICAgICAgICBkZWZhdWx0IGludGVyY2VwdG9ycyAoaW50ZXJjZXB0b3JzIHRoYXQgYXBwbHkgdG8gYWxsIHNlc3Npb24gYW5kCi0gKiAgICAgICAgICBtZXNzYWdlLWRyaXZlbiBiZWFucyBjb250YWluZWQgaW4gdGhlIGVqYi1qYXIpLgotICogCi0gKiAgICAgICAgICAyLgotICogICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAqICAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICogICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICogICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICogCi0gKiAgICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gaW50ZXJjZXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqICAgICAgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4oY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKS4KLSAqIAotICogICAgICAgICAgMy4KLSAqICAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gKiAgICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAqICAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAqICAgICAgICAgICAgPG1ldGhvZD4KLSAqICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAqICAgICAgICAgICAgPC9tZXRob2Q+Ci0gKiAgICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gKiAKLSAqICAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aAotICogICAgICAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcwotICogICAgICAgICAgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzCi0gKiAgICAgICAgICB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLiAgTWV0aG9kLWxldmVsCi0gKiAgICAgICAgICBpbnRlcmNlcHRvcnMgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGJ1c2luZXNzIG1ldGhvZHMgb2YgdGhlCi0gKiAgICAgICAgICBiZWFuIGNsYXNzLiAgIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGNhbm5vdCBiZSB1c2VkCi0gKiAgICAgICAgICB0byBzcGVjaWZ5IG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvcnMuCi0gKiAKLSAqICAgICAgICAgIDQuCi0gKiAgICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICogICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gKiAgICAgICAgICAgIDxtZXRob2Q+Ci0gKiAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gKiAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gKiAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICogICAgICAgICAgICAgICAgLi4uCi0gKiAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLU48L21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gKiAgICAgICAgICAgIDwvbWV0aG9kPgotICogICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICogCi0gKiAgICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGgKLSAqICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgVGhpcwotICogICAgICAgICAgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mIG1ldGhvZHMKLSAqICAgICAgICAgIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiAgVGhlIHZhbHVlcyBQQVJBTS0xIHRocm91Z2ggUEFSQU0tTgotICogICAgICAgICAgYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycwotICogICAgICAgICAgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICogICAgICAgICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gKiAgICAgICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAqICAgICAgICAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEludGVyY2VwdG9yQ2xhc3NlcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJbnRlcmNlcHRvck9yZGVyIDxlbT5JbnRlcmNlcHRvciBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcmNlcHRvckJpbmRpbmdUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0VqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEludGVyY2VwdG9yT3JkZXIoSW50ZXJjZXB0b3JPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yT3JkZXJUeXBlIGdldEludGVyY2VwdG9yT3JkZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JPcmRlciA8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmNlcHRvck9yZGVyKEludGVyY2VwdG9yT3JkZXJUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjdW5zZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICN1bnNldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICN1bnNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjdW5zZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lZE1ldGhvZFR5cGUgZ2V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnRlcmNlcHRvckJpbmRpbmdUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JPcmRlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2E0YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAgICAgICAgIFRoZSBpbnRlcmNlcHRvci1vcmRlclR5cGUgZWxlbWVudCBkZXNjcmliZXMgYSB0b3RhbCBvcmRlcmluZwotICogICAgICAgICBvZiBpbnRlcmNlcHRvciBjbGFzc2VzLgotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzIDxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJjZXB0b3JPcmRlclR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyY2VwdG9yQ2xhc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnRlcmNlcHRvck9yZGVyVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YzEwMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyY2VwdG9yIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgICBUaGUgaW50ZXJjZXB0b3JUeXBlIGVsZW1lbnQgZGVjbGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUKLSAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MuICBJdCBjb25zaXN0cyBvZiA6Ci0gKiAKLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gKiAgICAgICAgICAgICAtIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJjZXB0b3IgY2xhc3MuCi0gKiAgICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYXJvdW5kIGludm9rZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICogICAgICAgICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gKiAgICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3QgZW52aXJvbm1lbnQgZGVwZW5kZW5jaWVzIGZvciB0aGUgaW50ZXJjZXB0b3IKLSAqICAgICAgICAgICAgICAgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHBvc3QtYWN0aXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHByZS1wYXNzaXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzIDxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJjZXB0b3JUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW50ZXJjZXB0b3JDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9JbnRlcmNlcHRvckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEludGVyY2VwdG9yQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzIDxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVyY2VwdG9yQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyb3VuZCBJbnZva2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QXJvdW5kSW52b2tlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IEFjdGl2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUG9zdEFjdGl2YXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UG9zdEFjdGl2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGFzc2l2YXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZVBhc3NpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZVBhc3NpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnRlcmNlcHRvclR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvcnNUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvcnNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTE2NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvcnMgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAgICAgICAgIFRoZSBpbnRlcmNlcHRvcnNUeXBlIGVsZW1lbnQgZGVjbGFyZXMgb25lIG9yIG1vcmUgaW50ZXJjZXB0b3IKLSAqICAgICAgICAgY2xhc3NlcyB1c2VkIGJ5IGNvbXBvbmVudHMgd2l0aGluIHRoaXMgZWpiLWphci4gIFRoZSBkZWNsYXJhdGlvbgotICogICAgICAgICBjb25zaXN0cyBvZiA6Ci0gKiAKLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gKiAgICAgICAgICAgICAtIE9uZSBvciBtb3JlIGludGVyY2VwdG9yIGVsZW1lbnRzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVyY2VwdG9yc1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEludGVyY2VwdG9yc1R5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXNzYWdlRHJpdmVuQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWVzc2FnZURyaXZlbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMWZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXNzYWdlRHJpdmVuQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERyaXZlbiBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuCi0gKiAJYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gKiAJICAgICAgaWNvbiBmaWxlIG5hbWUuCi0gKiAJICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLSAqIAkgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gKiAgICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gKiAgICAgICAgICAgICAgIGpuZGktbmFtZSBvZiBkZXN0aW5hdGlvbiBmcm9tIHdoaWNoIHRoaXMgbWVzc2FnZS1kcml2ZW4gYmVhbgotICogICAgICAgICAgICAgICBzaG91bGQgY29uc3VtZS4gIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICAgIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuICBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gKiAJICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nCi0gKiAJICAgICAgdHlwZQotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHRpbWVvdXQgbWV0aG9kLgotICogCSAgICAtIHRoZSBvcHRpb25hbCBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudAotICogICAgICAgICAgICAgICB0eXBlLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gKiAJICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLSAqIAkgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgotICogICAgICAgICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gKiAJICAgICAgZW50cmllcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQgotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiBzZXJ2aWNlCi0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotICogCSAgICAgIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIG1ldGhvZHMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gKiAJICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkKLSAqIAkgICAgICByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICogCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0gKiAJICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnaW5nVHlwZSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRTZWN1cml0eUlkZW50aXR5IDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEcml2ZW5CZWFuIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogICAgICAgICAgICAgIFRoZSBlamItY2xhc3MgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0JICogICAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotCSAqICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQotCSAqICAgICAgICAgICAgICBlamItbmFtZS4KLQkgKiAKLQkgKiAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAqIAkgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVzc2FnaW5nVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnaW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnaW5nVHlwZSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdpbmdUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lb3V0IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZWRNZXRob2RUeXBlIGdldFRpbWVvdXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGltZW91dE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJCZWFuIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1RyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWcgZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0QWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFyb3VuZCBJbnZva2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFyb3VuZEludm9rZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VEcml2ZW5CZWFuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kSW50ZXJmYWNlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kSW50ZXJmYWNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ5YzcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZEludGVyZmFjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8KLSAqIAlkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotICogCXNpZ25hdHVyZSB0aGF0IGFyZSBtdWx0aXBseSBkZWZpbmVkIGFjcm9zcyB0aGUgaG9tZSBhbmQKLSAqIAljb21wb25lbnQgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiAJcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLSAqIAlob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgZXRjLik7IHRoZSBjb21wb25lbnQgYW5kIHdlYgotICogCXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcywgYW5kIHNvIG9uLiBUaGUgTG9jYWwgYXBwbGllcyB0bwotICogICAgICAgICBib3RoIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UgYW5kIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZS4KLSAqICAgICAgICAgU2ltaWxhcmx5LCBSZW1vdGUgYXBwbGllcyB0byBib3RoIHJlbW90ZSBjb21wb25lbnQgaW50ZXJmYWNlCi0gKiAgICAgICAgIGFuZCB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZS4KLSAqIAotICogCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgSG9tZQotICogCSAgICBSZW1vdGUKLSAqIAkgICAgTG9jYWxIb21lCi0gKiAJICAgIExvY2FsCi0gKiAJICAgIFNlcnZpY2VFbmRwb2ludAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RJbnRlcmZhY2VUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZEludGVyZmFjZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSE9NRV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9NRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1PVEVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9URSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0hPTUVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFUlZJQ0VfRU5EUE9JTlRfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfRU5EUE9JTlQgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNIT01FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIEhPTUVfTElURVJBTCA9IG5ldyBNZXRob2RJbnRlcmZhY2VUeXBlKEhPTUUsICJIb21lIiwgIkhvbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIFJFTU9URV9MSVRFUkFMID0gbmV3IE1ldGhvZEludGVyZmFjZVR5cGUoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBMT0NBTF9IT01FX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShMT0NBTF9IT01FLCAiTG9jYWxIb21lIiwgIkxvY2FsSG9tZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIExPQ0FMX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIFNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCA9IG5ldyBNZXRob2RJbnRlcmZhY2VUeXBlKFNFUlZJQ0VfRU5EUE9JTlQsICJTZXJ2aWNlRW5kcG9pbnQiLCAiU2VydmljZUVuZHBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBNZXRob2RJbnRlcmZhY2VUeXBlW10gewotCQkJSE9NRV9MSVRFUkFMLAotCQkJUkVNT1RFX0xJVEVSQUwsCi0JCQlMT0NBTF9IT01FX0xJVEVSQUwsCi0JCQlMT0NBTF9MSVRFUkFMLAotCQkJU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU1ldGhvZEludGVyZmFjZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RJbnRlcmZhY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWV0aG9kSW50ZXJmYWNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSE9NRTogcmV0dXJuIEhPTUVfTElURVJBTDsKLQkJCWNhc2UgUkVNT1RFOiByZXR1cm4gUkVNT1RFX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMX0hPTUU6IHJldHVybiBMT0NBTF9IT01FX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMOiByZXR1cm4gTE9DQUxfTElURVJBTDsKLQkJCWNhc2UgU0VSVklDRV9FTkRQT0lOVDogcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWV0aG9kSW50ZXJmYWNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTWV0aG9kSW50ZXJmYWNlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGFyYW1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQYXJhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjNTY4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQYXJhbXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0gKiAJZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1zKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBhcmFtcyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBwcmltaXRpdmUKLQkgKiAJICAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIGEgbWV0aG9kCi0JICogCSAgICBwYXJhbWV0ZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBhcmFtc19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFBhcmFtcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFBlcm1pc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFBlcm1pc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkOTg2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBlcm1pc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUKLSAqIAlzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotICogCWJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBjb25zaXN0cyBvZiBhbgotICogCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBvciBhbgotICogCWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotICogCWF1dGhvcml6YXRpb24sIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiAJVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZQotICogCW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLSAqIAlkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMKLSAqIAlkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50Ci0gKiAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldFJvbGVOYW1lcyA8ZW0+Um9sZSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBlcm1pc3Npb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Um9sZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmNoZWNrZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLQkgKiAJICAgICAgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gYnkgdGhlIGNvbnRhaW5lcgotCSAqIAkgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5jaGVja2VkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVbmNoZWNrZWQoRW1wdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVtcHR5VHlwZSBnZXRVbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0VW5jaGVja2VkIDxlbT5VbmNoZWNrZWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuY2hlY2tlZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5jaGVja2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbmNoZWNrZWQoRW1wdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFBlcm1pc3Npb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDY1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi0gKiAJICBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0gKiAJICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQotICogCSAgYmVhbidzIG1lc3NhZ2UgbGlzdGVuZXIgbWV0aG9kLCBvciBhIHNldCBvZiBzdWNoCi0gKiAJICBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUKLSAqIAkgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCi0gKiAJICBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLSAqIAkgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIG11bHRpcGx5IGRlZmluZWQKLSAqIAkgIGFjcm9zcyB0aGUgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlCi0gKiAgICAgICAgICAgZW5kcG9pbnQgbnRlcmZhY2VzOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0gKiAgICAgICAgICAgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeQotICogICAgICAgICAgIGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAotICogCSAgbWV0aG9kIG5hbWUuCi0gKiAKLSAqIAkgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50Ci0gKiAJICB3aXRoaW4gYSBtZXRob2QgZWxlbWVudDoKLSAqIAotICogCSAgMS4KLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VKQk5BTUUmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDsqJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZQotICogCSAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gKiAgICAgICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0gKiAKLSAqIAkgIDIuCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFSkJOQU1FJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7TUVUSE9EJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YKLSAqIAkgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAqIAkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mCi0gKiAJICAgICB0aGlzIHN0eWxlIHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZAotICogCSAgICAgbmFtZS4KLSAqIAotICogCSAgMy4KLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VKQk5BTUUmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtNRVRIT0QmbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtcGFyYW1zJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7UEFSQU0tMSZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7UEFSQU0tMiZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgIC4uLgotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7UEFSQU0tbiZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCSAgICAgICZsdDsvbWV0aG9kLXBhcmFtcyZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhCi0gKiAJICAgICBzZXQgb2YgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoCi0gKiAJICAgICBQQVJBTS1uIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlCi0gKiAJICAgICBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dAotICogCSAgICAgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIG5vCi0gKiAJICAgICBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAqIAkgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mCi0gKiAJICAgICBzcXVhcmUgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZQotICogCSAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMKLSAqIAkgICAgIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzLgotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogCSAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotICogCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwKLSAqICAgICAgICAgICBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDsqJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICBTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0gKiAJICBjcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi0gKiAJICBpbnRlcmZhY2UocykuCi0gKiAKLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2NyZWF0ZSZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0gKiAJICBjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0gKiAJICBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtjcmVhdGUmbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtcGFyYW1zJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCSAgICAgICZsdDsvbWV0aG9kLXBhcmFtcyZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotICogCSAgbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotICogCSAgZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLSAqIAkgIG15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0gKiAKLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2Zvb2JhciZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtjaGFyJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtpbnQmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2ludFtdJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtteXBhY2thZ2UuTXlDbGFzcyZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7bXlwYWNrYWdlLk15Q2xhc3NbXVtdJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJICAgICAgJmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIFRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotICogCSAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCB0aGF0IGlzIG11bHRpcGx5Ci0gKiAJICBkZWZpbmVkIGFjcm9zcyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwKLSAqICAgICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0gKiAJICBzaWduYXR1cmUuIEhvd2V2ZXIsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZQotICogICAgICAgICAgIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSwgYW5kIHRoZSBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlLAotICogICAgICAgICAgIHRoZSBzYW1lIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHRoZSBtZXRob2QgZm9yIGJvdGggaW50ZXJmYWNlcy4KLSAqICAgICAgICAgICBMaWtld2lzZSwgaWYgdGhlIHNhbWUgbWV0aG9kIGlzIGEgbWV0aG9kIG9mIGJvdGggdGhlIHJlbW90ZQotICogICAgICAgICAgIGJ1c2luZXNzIGludGVyZmFjZSBhbmQgdGhlIHJlbW90ZSBjb21wb25lbnQgaW50ZXJmYWNlLCB0aGUgc2FtZQotICogICAgICAgICAgIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHRoZSBtZXRob2QgZm9yIGJvdGggaW50ZXJmYWNlcy4KLSAqIAotICogCSAgRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtaW50ZiZndDtSZW1vdGUmbHQ7L21ldGhvZC1pbnRmJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtjcmVhdGUmbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtcGFyYW1zJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCSAgICAgICZsdDsvbWV0aG9kLXBhcmFtcyZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0gKiAJICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZQotICogCSAgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGhvbWUKLSAqIAkgIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtaW50ZiZndDtIb21lJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgYW5kIHRoZSBjcmVhdGUgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgbG9jYWwgaG9tZQotICogCSAgaW50ZXJmYWNlIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLWludGYmZ3Q7TG9jYWxIb21lJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGhyZWUgU3R5bGVzCi0gKiAJICBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgdXNhZ2UuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCi0gKiAJICBtZXRob2QgZWxlbWVudCBleGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZQotICogCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UKLSAqICAgICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0gKiAKLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1pbnRmJmd0O0hvbWUmbHQ7L21ldGhvZC1pbnRmJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDsqJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kSW50ZiA8ZW0+TWV0aG9kIEludGY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFR5cGVfRWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIEludGY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iSG9tZSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEludGY8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIEludGY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCSAqIEBzZWUgI2lzU2V0TWV0aG9kSW50ZigpCi0JICogQHNlZSAjdW5zZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNzZXRNZXRob2RJbnRmKE1ldGhvZEludGVyZmFjZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEludGVyZmFjZVR5cGUgZ2V0TWV0aG9kSW50ZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RJbnRmIDxlbT5NZXRob2QgSW50ZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIEludGY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCSAqIEBzZWUgI2lzU2V0TWV0aG9kSW50ZigpCi0JICogQHNlZSAjdW5zZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNnZXRNZXRob2RJbnRmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RJbnRmKE1ldGhvZEludGVyZmFjZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZEludGYgPGVtPk1ldGhvZCBJbnRmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI2dldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI3NldE1ldGhvZEludGYoTWV0aG9kSW50ZXJmYWNlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1ldGhvZEludGYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RJbnRmIDxlbT5NZXRob2QgSW50ZjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIEludGY8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI2dldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI3NldE1ldGhvZEludGYoTWV0aG9kSW50ZXJmYWNlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1ldGhvZEludGYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhcmFtcyBnZXRNZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL011bHRpcGxpY2l0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL011bHRpcGxpY2l0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4MGMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NdWx0aXBsaWNpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk11bHRpcGxpY2l0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi0gKiAJcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotICogCi0gKiAJVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIE9uZQotICogCSAgICBNYW55Ci0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE11bHRpcGxpY2l0eVR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVsdGlwbGljaXR5VHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T25lPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PbmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT05FX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5ZX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5ZID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eVR5cGUgT05FX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5VHlwZShPTkUsICJPbmUiLCAiT25lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5ZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlUeXBlIE1BTllfTElURVJBTCA9IG5ldyBNdWx0aXBsaWNpdHlUeXBlKE1BTlksICJNYW55IiwgIk1hbnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTXVsdGlwbGljaXR5VHlwZVtdIHsKLQkJCU9ORV9MSVRFUkFMLAotCQkJTUFOWV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpcGxpY2l0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNdWx0aXBsaWNpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNdWx0aXBsaWNpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTXVsdGlwbGljaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNdWx0aXBsaWNpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBPTkU6IHJldHVybiBPTkVfTElURVJBTDsKLQkJCWNhc2UgTUFOWTogcmV0dXJuIE1BTllfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTXVsdGlwbGljaXR5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTXVsdGlwbGljaXR5VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTmFtZWRNZXRob2RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9OYW1lZE1ldGhvZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyNTRkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9OYW1lZE1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIE1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXROYW1lZE1ldGhvZFR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRNZXRob2RUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQYXJhbXMgZ2V0TWV0aG9kUGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE5hbWVkTWV0aG9kVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVkTWV0aG9kVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUGVyc2lzdGVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWU2YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUGVyc2lzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLSAqIAltYW5hZ2VtZW50IHR5cGUuCi0gKiAKLSAqIAlUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIEJlYW4KLSAqIAkgICAgQ29udGFpbmVyCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFBlcnNpc3RlbmNlVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkVBTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVHlwZSBCRUFOX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VUeXBlKEJFQU4sICJCZWFuIiwgIkJlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VUeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFBlcnNpc3RlbmNlVHlwZVtdIHsKLQkJCUJFQU5fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQZXJzaXN0ZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUGVyc2lzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBCRUFOOiByZXR1cm4gQkVBTl9MSVRFUkFMOwotCQkJY2FzZSBDT05UQUlORVI6IHJldHVybiBDT05UQUlORVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGVyc2lzdGVuY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1F1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWEwYjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1F1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLSAqIAlxdWVyeS4gSXQgY29udGFpbnMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKLSAqIAkgICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotICogCSAgICAgIG1ldGhvZCBpdCBpcyB1c2VkIGJ5Ci0gKiAJCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUKLSAqIAkJICBtYXBwaW5nLCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZAotICogCQkgIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUgcmV0dXJuZWQuCi0gKiAJCS0gdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4KLSAqIAotICogCVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLSAqIAllbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5IGlzIG5vdCBleHByZXNzaWJsZQotICogCWluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8KLSAqIAlkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci0gKiAJc2hvdWxkIGJlIGVtcHR5LgotICogCi0gKiAJVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gSXQgY2FuIG9ubHkKLSAqIAliZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotICogCXRoYXQgcmV0dXJucyBlbnRpdHkgb2JqZWN0cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKLSAqIAlyZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgIkxvY2FsIi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRRdWVyeU1ldGhvZCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRSZXN1bHRUeXBlTWFwcGluZyA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RWpiUWwgPGVtPkVqYiBRbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFF1ZXJ5KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeV9EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlfUXVlcnlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlRdWVyeU1ldGhvZCBnZXRRdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UXVlcnlNZXRob2QgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRRdWVyeU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMb2NhbCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQHNlZSAjaXNTZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjdW5zZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjc2V0UmVzdWx0VHlwZU1hcHBpbmcoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeV9SZXN1bHRUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc3VsdFR5cGVNYXBwaW5nVHlwZSBnZXRSZXN1bHRUeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UmVzdWx0VHlwZU1hcHBpbmcgPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQHNlZSAjaXNTZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjdW5zZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VsdFR5cGVNYXBwaW5nKFJlc3VsdFR5cGVNYXBwaW5nVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFJlc3VsdFR5cGVNYXBwaW5nIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3VsdFR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjc2V0UmVzdWx0VHlwZU1hcHBpbmcoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UmVzdWx0VHlwZU1hcHBpbmcgPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3VsdFR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjc2V0UmVzdWx0VHlwZU1hcHBpbmcoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBRbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBRbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiUWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeV9FamJRbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJRbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RWpiUWwgPGVtPkVqYiBRbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJRbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiUWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUXVlcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnlNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1Y2IxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UXVlcnkgTWV0aG9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIHRoZSBtZXRob2QgZm9yIGEgZmluZGVyIG9yIHNlbGVjdAotICogCSAgcXVlcnkuCi0gKiAKLSAqIAkgIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLSAqIAkgIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAqIAotICogCSAgRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLSAqIAkgIG1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLSAqIAotICogCSAgSXQgaXMgdXNlZCBieSB0aGUgcXVlcnktbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDtxdWVyeSZndDsKLSAqIAkgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVycyZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gKiAJICAgICAgJmx0O3F1ZXJ5LW1ldGhvZCZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7ZmluZExhcmdlT3JkZXJzJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAgICAgJmx0Oy9xdWVyeS1tZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1xbCZndDsKLSAqIAkJU0VMRUNUIE9CSkVDVChvKSBGUk9NIE9yZGVyIG8KLSAqIAkJICBXSEVSRSBvLmFtb3VudCAmYW1wO2d0OyAxMDAwCi0gKiAJICAgICAgJmx0Oy9lamItcWwmZ3Q7Ci0gKiAJICAmbHQ7L3F1ZXJ5Jmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeU1ldGhvZCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeU1ldGhvZCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXRob2ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlNZXRob2RfTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlNZXRob2RfTWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGFyYW1zIGdldE1ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFF1ZXJ5TWV0aG9kX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBRdWVyeU1ldGhvZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdkNjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBkZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYQotICogCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLSAqIAlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGlzIHVzZWQgYnkKLSAqIAlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudHMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4KLSAqIAllbnRpdHkgYmVhbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YmU0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSByZWxhdGlvbnNoaXBzVHlwZSBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4KLSAqIAl3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotICogCXBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwc1R5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLSAqIAlkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoCi0gKiAJc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyNnZXRFamJSZWxhdGlvbnMgPGVtPkVqYiBSZWxhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcHMoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwcyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWxhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVsYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSZWxhdGlvbnNoaXBzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVtb3ZlTWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVtb3ZlTWV0aG9kVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJlNDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbW92ZU1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbW92ZSBNZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbW92ZU1ldGhvZFR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVtb3ZlTWV0aG9kVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZWRNZXRob2RUeXBlIGdldEJlYW5NZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjZ2V0QmVhbk1ldGhvZCA8ZW0+QmVhbiBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCZWFuTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXRhaW4gSWYgRXhjZXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI3Vuc2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI3NldFJldGFpbklmRXhjZXB0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbW92ZU1ldGhvZFR5cGVfUmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmV0YWluSWZFeGNlcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjaXNSZXRhaW5JZkV4Y2VwdGlvbiA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQHNlZSAjdW5zZXRSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQHNlZSAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0YWluSWZFeGNlcHRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjaXNSZXRhaW5JZkV4Y2VwdGlvbiA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQHNlZSAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQHNlZSAjc2V0UmV0YWluSWZFeGNlcHRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJldGFpbklmRXhjZXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjaXNSZXRhaW5JZkV4Y2VwdGlvbiA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI2lzUmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI3NldFJldGFpbklmRXhjZXB0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXRhaW5JZkV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbW92ZU1ldGhvZFR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUmVtb3ZlTWV0aG9kVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVzdWx0VHlwZU1hcHBpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODU3ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVzdWx0VHlwZU1hcHBpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvCi0gKiAJc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkKLSAqIAlmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotICogCUVKQk9iamVjdCB0eXBlLgotICogCi0gKiAJVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgTG9jYWwKLSAqIAkgICAgUmVtb3RlCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlc3VsdFR5cGVNYXBwaW5nVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBMT0NBTF9MSVRFUkFMID0gbmV3IFJlc3VsdFR5cGVNYXBwaW5nVHlwZShMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTU9URQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIFJFTU9URV9MSVRFUkFMID0gbmV3IFJlc3VsdFR5cGVNYXBwaW5nVHlwZShSRU1PVEUsICJSZW1vdGUiLCAiUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJlc3VsdFR5cGVNYXBwaW5nVHlwZVtdIHsKLQkJCUxPQ0FMX0xJVEVSQUwsCi0JCQlSRU1PVEVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc3VsdFR5cGVNYXBwaW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc3VsdFR5cGVNYXBwaW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBMT0NBTDogcmV0dXJuIExPQ0FMX0xJVEVSQUw7Ci0JCQljYXNlIFJFTU9URTogcmV0dXJuIFJFTU9URV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXN1bHRUeXBlTWFwcGluZ1R5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2VjdXJpdHlJZGVudGl0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1NlY3VyaXR5SWRlbnRpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjU4NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2VjdXJpdHlJZGVudGl0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlY3VyaXR5LWlkZW50aXR5VHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3MKLSAqIAlzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICogCW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi0gKiAJaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAlhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0VXNlQ2FsbGVySWRlbnRpdHkgPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldFJ1bkFzIDxlbT5SdW4gQXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eUlkZW50aXR5VHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0JICogCSAgICAgIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZQotCSAqIAkgICAgICBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgKiAJICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQkgKiAKLQkgKiAJICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVc2VDYWxsZXJJZGVudGl0eShFbXB0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1VzZUNhbGxlcklkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW1wdHlUeXBlIGdldFVzZUNhbGxlcklkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRVc2VDYWxsZXJJZGVudGl0eSA8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzZUNhbGxlcklkZW50aXR5KEVtcHR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJ1biBBczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SdW4gQXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJ1bkFzKFJ1bkFzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9SdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJ1bkFzIGdldFJ1bkFzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SdW4gQXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJ1bkFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSdW5BcyhSdW5BcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlY3VyaXR5SWRlbnRpdHlUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvbkJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjIwNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2Vzc2lvbiBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotICogCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gKiAJICAgICAgaWNvbiBmaWxlIG5hbWUKLSAqIAkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICogCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gKiAgICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gKiAgICAgICAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUvYnVzaW5lc3MgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwKLSAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLiBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gKiAgICAgICAgICAgICAtIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHJlbW90ZSBvciBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2VzLAotICogICAgICAgICAgICAgICBpZiBhbnkKLSAqIAkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotICogCSAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLSAqIAkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCi0gKiAJICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0gKiAJICAgICAgaW50ZXJmYWNlLCBpZiBhbnkKLSAqIAkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAqIAkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICogICAgICAgICAgICAgICBJZiBpdCBpcyBub3QgcHJlc2VudCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGFuZC9vcgotICogICAgICAgICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gKiAJICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0gKiAJICAgICAgRUpCIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotICogCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotICogCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICogCSAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0gKiAJICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAqIAkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0gKiAKLSAqIAlUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCi0gKiAJdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLSAqIAllbXB0eS4KLSAqIAotICogCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotICogCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUKLSAqIAlzZXNzaW9uIGJlYW4uCi0gKiAKLSAqIAlUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLSAqIAliZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NMb2NhbHMgPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NSZW1vdGVzIDxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJbml0TWV0aG9kcyA8ZW0+SW5pdCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdmVNZXRob2RzIDxlbT5SZW1vdmUgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eUlkZW50aXRpZXMgPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uQmVhbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9Ib21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEhvbWUgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtb3RlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlbW90ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWxIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0xvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJ1c2luZXNzIExvY2FsczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnVzaW5lc3MgTG9jYWxzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnVzaW5lc3MgTG9jYWxzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc0xvY2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QnVzaW5lc3NMb2NhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJ1c2luZXNzIFJlbW90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJ1c2luZXNzIFJlbW90ZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEJ1c2luZXNzUmVtb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAqIAkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotCSAqIAkgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICogCSAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MKLQkgKiAJICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0JICogCSAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZUVuZHBvaW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotCSAqICAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKLQkgKiAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLQkgKiAgICAgICAgICAgICAgZWpiLW5hbWUuCi0JICogCi0JICogICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYkNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iU3RhdGVmdWwiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQHNlZSAjaXNTZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjc2V0U2Vzc2lvblR5cGUoU2Vzc2lvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2Vzc2lvblR5cGUgZ2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lb3V0IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZWRNZXRob2RUeXBlIGdldFRpbWVvdXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGltZW91dE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgaW5pdC1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAqIAkgICAgRUpCIDIueCBzdHlsZSBjcmVhdGUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAqIAkgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwKLQkgKiAgICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbml0TWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3ZlIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHJlbW92ZS1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAqIAkgICAgRUpCIDIueCBzdHlsZSByZW1vdmUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAqIAkgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwKLQkgKiAgICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVtb3ZlTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJCZWFuIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QXJvdW5kSW52b2tlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0VqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0VqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1Jlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1ByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UG9zdEFjdGl2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGFzc2l2YXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UHJlUGFzc2l2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VjdXJpdHlJZGVudGl0aWVzKFNlY3VyaXR5SWRlbnRpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9TZWN1cml0eUlkZW50aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5VHlwZSBnZXRTZWN1cml0eUlkZW50aXRpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlY3VyaXR5SWRlbnRpdGllcyA8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN1cml0eUlkZW50aXRpZXMoU2VjdXJpdHlJZGVudGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXNzaW9uQmVhbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE3MTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotICogCXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLSAqIAlzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgU3RhdGVmdWwKLSAqIAkgICAgU3RhdGVsZXNzCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25UeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlc3Npb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWZ1bDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhdGVmdWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBVEVGVUxfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFRlVMID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXRlbGVzczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFTEVTU19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVMRVNTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFRlVMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUZVTF9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFRlVMLCAiU3RhdGVmdWwiLCAiU3RhdGVmdWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBVEVMRVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUxFU1NfTElURVJBTCA9IG5ldyBTZXNzaW9uVHlwZShTVEFURUxFU1MsICJTdGF0ZWxlc3MiLCAiU3RhdGVsZXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgU2Vzc2lvblR5cGVbXSB7Ci0JCQlTVEFURUZVTF9MSVRFUkFMLAotCQkJU1RBVEVMRVNTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXNzaW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVNlc3Npb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTZXNzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNUQVRFRlVMOiByZXR1cm4gU1RBVEVGVUxfTElURVJBTDsKLQkJCWNhc2UgU1RBVEVMRVNTOiByZXR1cm4gU1RBVEVMRVNTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlc3Npb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9TZXNzaW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxMjQxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotICogCW1hbmFnZSB0aGUgdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QKLSAqIAlpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCi0gKiAJICAgIE5vdFN1cHBvcnRlZAotICogCSAgICBTdXBwb3J0cwotICogCSAgICBSZXF1aXJlZAotICogCSAgICBSZXF1aXJlc05ldwotICogCSAgICBNYW5kYXRvcnkKLSAqIAkgICAgTmV2ZXIKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfU1VQUE9SVEVEX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfU1VQUE9SVEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN1cHBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVVBQT1JUU19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUE9SVFMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVEX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcXVpcmVzIE5ldzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVSVJFU19ORVdfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVTX05FVyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5EQVRPUllfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTkRBVE9SWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OZXZlcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkVWRVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVkVSID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX1NVUFBPUlRFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE5PVF9TVVBQT1JURURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTk9UX1NVUFBPUlRFRCwgIk5vdFN1cHBvcnRlZCIsICJOb3RTdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVVBQT1JUUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFNVUFBPUlRTX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFNVUFBPUlRTLCAiU3VwcG9ydHMiLCAiU3VwcG9ydHMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVSVJFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVELCAiUmVxdWlyZWQiLCAiUmVxdWlyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUlSRVNfTkVXCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRVNfTkVXX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVTX05FVywgIlJlcXVpcmVzTmV3IiwgIlJlcXVpcmVzTmV3Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFuZGF0b3J5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI01BTkRBVE9SWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE1BTkRBVE9SWV9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShNQU5EQVRPUlksICJNYW5kYXRvcnkiLCAiTWFuZGF0b3J5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkVWRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBORVZFUl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShORVZFUiwgIk5ldmVyIiwgIk5ldmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlW10gewotCQkJTk9UX1NVUFBPUlRFRF9MSVRFUkFMLAotCQkJU1VQUE9SVFNfTElURVJBTCwKLQkJCVJFUVVJUkVEX0xJVEVSQUwsCi0JCQlSRVFVSVJFU19ORVdfTElURVJBTCwKLQkJCU1BTkRBVE9SWV9MSVRFUkFMLAotCQkJTkVWRVJfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PVF9TVVBQT1JURUQ6IHJldHVybiBOT1RfU1VQUE9SVEVEX0xJVEVSQUw7Ci0JCQljYXNlIFNVUFBPUlRTOiByZXR1cm4gU1VQUE9SVFNfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRUQ6IHJldHVybiBSRVFVSVJFRF9MSVRFUkFMOwotCQkJY2FzZSBSRVFVSVJFU19ORVc6IHJldHVybiBSRVFVSVJFU19ORVdfTElURVJBTDsKLQkJCWNhc2UgTUFOREFUT1JZOiByZXR1cm4gTUFOREFUT1JZX0xJVEVSQUw7Ci0JCQljYXNlIE5FVkVSOiByZXR1cm4gTkVWRVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTdiMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiAJdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICogCi0gKiAJVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgQmVhbgotICogCSAgICBDb250YWluZXIKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCRUFOX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUFOID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkVBTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIEJFQU5fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblR5cGUoQkVBTiwgIkJlYW4iLCAiQmVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNhY3Rpb25UeXBlW10gewotCQkJQkVBTl9MSVRFUkFMLAotCQkJQ09OVEFJTkVSX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEJFQU46IHJldHVybiBCRUFOX0xJVEVSQUw7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1RyYW5zYWN0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBmZDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvbkNvbmZpZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3RpdmF0aW9uQ29uZmlnSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTExN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPSBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlID0gQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoU3RyaW5nIG5ld0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPSBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lOwotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lID0gbmV3QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRSwgb2xkQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSwgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZShTdHJpbmcgbmV3QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlID0gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWU7Ci0JCWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlID0gbmV3QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFLCBvbGRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSwgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FOgotCQkJCXNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRToKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUU6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZShBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFOgotCQkJCXNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRToKLQkJCQlyZXR1cm4gQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSAhPSBudWxsIDogIUFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQuZXF1YWxzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRToKLQkJCQlyZXR1cm4gQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlICE9IG51bGwgOiAhQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1NzY5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsI2dldEV4Y2VwdGlvbkNsYXNzIDxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsI2lzUm9sbGJhY2sgPGVtPlJvbGxiYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjZXB0aW9uQ2xhc3MoKSA8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNlcHRpb25DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvbkNsYXNzKCkgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXhjZXB0aW9uQ2xhc3MgPSBFWENFUFRJT05fQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsYmFjaygpIDxlbT5Sb2xsYmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSb2xsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJPTExCQUNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JvbGxiYWNrKCkgPGVtPlJvbGxiYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGxiYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByb2xsYmFjayA9IFJPTExCQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSb2xsYmFjayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbGJhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0VYQ0VQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uQ2xhc3MoU3RyaW5nIG5ld0V4Y2VwdGlvbkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRFeGNlcHRpb25DbGFzcyA9IGV4Y2VwdGlvbkNsYXNzOwotCQlleGNlcHRpb25DbGFzcyA9IG5ld0V4Y2VwdGlvbkNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTLCBvbGRFeGNlcHRpb25DbGFzcywgZXhjZXB0aW9uQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxiYWNrKCkgewotCQlyZXR1cm4gcm9sbGJhY2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGJhY2soYm9vbGVhbiBuZXdSb2xsYmFjaykgewotCQlib29sZWFuIG9sZFJvbGxiYWNrID0gcm9sbGJhY2s7Ci0JCXJvbGxiYWNrID0gbmV3Um9sbGJhY2s7Ci0JCWJvb2xlYW4gb2xkUm9sbGJhY2tFU2V0ID0gcm9sbGJhY2tFU2V0OwotCQlyb2xsYmFja0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0ssIG9sZFJvbGxiYWNrLCByb2xsYmFjaywgIW9sZFJvbGxiYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Um9sbGJhY2soKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbGJhY2sgPSByb2xsYmFjazsKLQkJYm9vbGVhbiBvbGRSb2xsYmFja0VTZXQgPSByb2xsYmFja0VTZXQ7Ci0JCXJvbGxiYWNrID0gUk9MTEJBQ0tfRURFRkFVTFQ7Ci0JCXJvbGxiYWNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSywgb2xkUm9sbGJhY2ssIFJPTExCQUNLX0VERUZBVUxULCBvbGRSb2xsYmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJvbGxiYWNrKCkgewotCQlyZXR1cm4gcm9sbGJhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTOgotCQkJCXJldHVybiBnZXRFeGNlcHRpb25DbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0s6Ci0JCQkJcmV0dXJuIGlzUm9sbGJhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTOgotCQkJCXNldEV4Y2VwdGlvbkNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLOgotCQkJCXNldFJvbGxiYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1M6Ci0JCQkJc2V0RXhjZXB0aW9uQ2xhc3MoRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSzoKLQkJCQl1bnNldFJvbGxiYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTOgotCQkJCXJldHVybiBFWENFUFRJT05fQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2VwdGlvbkNsYXNzICE9IG51bGwgOiAhRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxULmVxdWFscyhleGNlcHRpb25DbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSzoKLQkJCQlyZXR1cm4gaXNTZXRSb2xsYmFjaygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleGNlcHRpb25DbGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleGNlcHRpb25DbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbGJhY2s6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyb2xsYmFja0VTZXQpIHJlc3VsdC5hcHBlbmQocm9sbGJhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25FeGNlcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bcm91bmRJbnZva2VUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bcm91bmRJbnZva2VUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFjZTc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kSW52b2tlVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcm91bmQgSW52b2tlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bcm91bmRJbnZva2VUeXBlSW1wbCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFyb3VuZEludm9rZVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcm91bmRJbnZva2VUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NfKCkgPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzXygpIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzXyA9IENMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IE1FVEhPRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFyb3VuZEludm9rZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BUk9VTkRfSU5WT0tFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc18oKSB7Ci0JCXJldHVybiBjbGFzc187Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIG5ld0NsYXNzKSB7Ci0JCVN0cmluZyBvbGRDbGFzcyA9IGNsYXNzXzsKLQkJY2xhc3NfID0gbmV3Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUywgb2xkQ2xhc3MsIGNsYXNzXykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkgewotCQlTdHJpbmcgb2xkTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCW1ldGhvZE5hbWUgPSBuZXdNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUUsIG9sZE1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NfKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUzoKLQkJCQlzZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRToKLQkJCQlzZXRNZXRob2ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUzoKLQkJCQlzZXRDbGFzcyhDTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUzoKLQkJCQlyZXR1cm4gQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzXyAhPSBudWxsIDogIUNMQVNTX0VERUZBVUxULmVxdWFscyhjbGFzc18pOwotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2xhc3NfKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2ROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bcm91bmRJbnZva2VUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDdhNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwjZ2V0TWV0aG9kUGVybWlzc2lvbnMgPGVtPk1ldGhvZCBQZXJtaXNzaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldENvbnRhaW5lclRyYW5zYWN0aW9ucyA8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldEludGVyY2VwdG9yQmluZGluZ3MgPGVtPkludGVyY2VwdG9yIEJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCNnZXRFeGNsdWRlTGlzdCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwjZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzZW1ibHlEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVzKCkgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBlcm1pc3Npb25zKCkgPGVtPk1ldGhvZCBQZXJtaXNzaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQZXJtaXNzaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhaW5lclRyYW5zYWN0aW9ucygpIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhaW5lclRyYW5zYWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRhaW5lclRyYW5zYWN0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkgPGVtPkludGVyY2VwdG9yIEJpbmRpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbnRlcmNlcHRvckJpbmRpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZUxpc3QoKSA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEV4Y2x1ZGVMaXN0IGV4Y2x1ZGVMaXN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFwcGxpY2F0aW9uRXhjZXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BU1NFTUJMWV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9ucygpIHsKLQkJaWYgKG1ldGhvZFBlcm1pc3Npb25zID09IG51bGwpIHsKLQkJCW1ldGhvZFBlcm1pc3Npb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGVybWlzc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkgewotCQlpZiAoY29udGFpbmVyVHJhbnNhY3Rpb25zID09IG51bGwpIHsKLQkJCWNvbnRhaW5lclRyYW5zYWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lclRyYW5zYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkgewotCQlpZiAoaW50ZXJjZXB0b3JCaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQlpbnRlcmNlcHRvckJpbmRpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1MpOwotCQl9Ci0JCXJldHVybiBpbnRlcmNlcHRvckJpbmRpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhjbHVkZUxpc3QgZ2V0RXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiBleGNsdWRlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBuZXdFeGNsdWRlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlFeGNsdWRlTGlzdCBvbGRFeGNsdWRlTGlzdCA9IGV4Y2x1ZGVMaXN0OwotCQlleGNsdWRlTGlzdCA9IG5ld0V4Y2x1ZGVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgb2xkRXhjbHVkZUxpc3QsIG5ld0V4Y2x1ZGVMaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBuZXdFeGNsdWRlTGlzdCkgewotCQlpZiAobmV3RXhjbHVkZUxpc3QgIT0gZXhjbHVkZUxpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4Y2x1ZGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4Y2x1ZGVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4Y2x1ZGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4Y2x1ZGVMaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhjbHVkZUxpc3QobmV3RXhjbHVkZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG5ld0V4Y2x1ZGVMaXN0LCBuZXdFeGNsdWRlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpIHsKLQkJaWYgKGFwcGxpY2F0aW9uRXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlhcHBsaWNhdGlvbkV4Y2VwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2F0aW9uRXhjZXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RQZXJtaXNzaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFeGNsdWRlTGlzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlM6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lOVEVSQ0VQVE9SX0JJTkRJTkdTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlM6Ci0JCQkJZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUzoKLQkJCQlnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlzZXRFeGNsdWRlTGlzdCgoRXhjbHVkZUxpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUzoKLQkJCQlnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUzoKLQkJCQlnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlzZXRFeGNsdWRlTGlzdCgoRXhjbHVkZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlM6Ci0JCQkJZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGVybWlzc2lvbnMgIT0gbnVsbCAmJiAhbWV0aG9kUGVybWlzc2lvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlM6Ci0JCQkJcmV0dXJuIGNvbnRhaW5lclRyYW5zYWN0aW9ucyAhPSBudWxsICYmICFjb250YWluZXJUcmFuc2FjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lOVEVSQ0VQVE9SX0JJTkRJTkdTOgotCQkJCXJldHVybiBpbnRlcmNlcHRvckJpbmRpbmdzICE9IG51bGwgJiYgIWludGVyY2VwdG9yQmluZGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlyZXR1cm4gZXhjbHVkZUxpc3QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TOgotCQkJCXJldHVybiBhcHBsaWNhdGlvbkV4Y2VwdGlvbnMgIT0gbnVsbCAmJiAhYXBwbGljYXRpb25FeGNlcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXNzZW1ibHlEZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEZpZWxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTlmYjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QRmllbGRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q01QIEZpZWxkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEZpZWxkSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEZpZWxkSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBGaWVsZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENNUEZpZWxkIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDTVBGaWVsZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9GSUVMRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVBfRklFTERfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVBfRklFTERfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmllbGROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoRklFTERfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpZWxkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ01QRmllbGRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTIxYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q01SIEZpZWxkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUkZpZWxkSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwjZ2V0Q21yRmllbGROYW1lIDxlbT5DbXIgRmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwjZ2V0Q21yRmllbGRUeXBlIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ01SRmllbGRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDTVJGaWVsZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtckZpZWxkTmFtZSgpIDxlbT5DbXIgRmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q21yRmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTVJfRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXJGaWVsZE5hbWUoKSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtckZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbXJGaWVsZE5hbWUgPSBDTVJfRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXJGaWVsZFR5cGUoKSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtckZpZWxkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDTVJGaWVsZFR5cGUgQ01SX0ZJRUxEX1RZUEVfRURFRkFVTFQgPSBDTVJGaWVsZFR5cGUuSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtckZpZWxkVHlwZSgpIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01SRmllbGRUeXBlIGNtckZpZWxkVHlwZSA9IENNUl9GSUVMRF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDbXIgRmllbGQgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY21yRmllbGRUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01SRmllbGRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DTVJfRklFTEQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENtckZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGNtckZpZWxkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbXJGaWVsZE5hbWUoU3RyaW5nIG5ld0NtckZpZWxkTmFtZSkgewotCQlTdHJpbmcgb2xkQ21yRmllbGROYW1lID0gY21yRmllbGROYW1lOwotCQljbXJGaWVsZE5hbWUgPSBuZXdDbXJGaWVsZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfTkFNRSwgb2xkQ21yRmllbGROYW1lLCBjbXJGaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01SRmllbGRUeXBlIGdldENtckZpZWxkVHlwZSgpIHsKLQkJcmV0dXJuIGNtckZpZWxkVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbXJGaWVsZFR5cGUoQ01SRmllbGRUeXBlIG5ld0NtckZpZWxkVHlwZSkgewotCQlDTVJGaWVsZFR5cGUgb2xkQ21yRmllbGRUeXBlID0gY21yRmllbGRUeXBlOwotCQljbXJGaWVsZFR5cGUgPSBuZXdDbXJGaWVsZFR5cGUgPT0gbnVsbCA/IENNUl9GSUVMRF9UWVBFX0VERUZBVUxUIDogbmV3Q21yRmllbGRUeXBlOwotCQlib29sZWFuIG9sZENtckZpZWxkVHlwZUVTZXQgPSBjbXJGaWVsZFR5cGVFU2V0OwotCQljbXJGaWVsZFR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFLCBvbGRDbXJGaWVsZFR5cGUsIGNtckZpZWxkVHlwZSwgIW9sZENtckZpZWxkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENtckZpZWxkVHlwZSgpIHsKLQkJQ01SRmllbGRUeXBlIG9sZENtckZpZWxkVHlwZSA9IGNtckZpZWxkVHlwZTsKLQkJYm9vbGVhbiBvbGRDbXJGaWVsZFR5cGVFU2V0ID0gY21yRmllbGRUeXBlRVNldDsKLQkJY21yRmllbGRUeXBlID0gQ01SX0ZJRUxEX1RZUEVfRURFRkFVTFQ7Ci0JCWNtckZpZWxkVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEUsIG9sZENtckZpZWxkVHlwZSwgQ01SX0ZJRUxEX1RZUEVfRURFRkFVTFQsIG9sZENtckZpZWxkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENtckZpZWxkVHlwZSgpIHsKLQkJcmV0dXJuIGNtckZpZWxkVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVJfRklFTERfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldENtckZpZWxkTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENtckZpZWxkVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUU6Ci0JCQkJc2V0Q21yRmllbGROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFOgotCQkJCXNldENtckZpZWxkVHlwZSgoQ01SRmllbGRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUU6Ci0JCQkJc2V0Q21yRmllbGROYW1lKENNUl9GSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRToKLQkJCQl1bnNldENtckZpZWxkVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfTkFNRToKLQkJCQlyZXR1cm4gQ01SX0ZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNtckZpZWxkTmFtZSAhPSBudWxsIDogIUNNUl9GSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhjbXJGaWVsZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0Q21yRmllbGRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNtckZpZWxkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjbXJGaWVsZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNtckZpZWxkVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNtckZpZWxkVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoY21yRmllbGRUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NNUkZpZWxkSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTAxMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwjZ2V0VHJhbnNBdHRyaWJ1dGUgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kcygpIDxlbT5NZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc0F0dHJpYnV0ZSgpIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBUUkFOU19BVFRSSUJVVEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNBdHRyaWJ1dGUoKSA8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSB0cmFuc0F0dHJpYnV0ZSA9IFRSQU5TX0FUVFJJQlVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnMgQXR0cmlidXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc0F0dHJpYnV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgewotCQlpZiAobWV0aG9kcyA9PSBudWxsKSB7Ci0JCQltZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0VHJhbnNBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0cmFuc0F0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc0F0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgbmV3VHJhbnNBdHRyaWJ1dGUpIHsKLQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG9sZFRyYW5zQXR0cmlidXRlID0gdHJhbnNBdHRyaWJ1dGU7Ci0JCXRyYW5zQXR0cmlidXRlID0gbmV3VHJhbnNBdHRyaWJ1dGUgPT0gbnVsbCA/IFRSQU5TX0FUVFJJQlVURV9FREVGQVVMVCA6IG5ld1RyYW5zQXR0cmlidXRlOwotCQlib29sZWFuIG9sZFRyYW5zQXR0cmlidXRlRVNldCA9IHRyYW5zQXR0cmlidXRlRVNldDsKLQkJdHJhbnNBdHRyaWJ1dGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fVFJBTlNfQVRUUklCVVRFLCBvbGRUcmFuc0F0dHJpYnV0ZSwgdHJhbnNBdHRyaWJ1dGUsICFvbGRUcmFuc0F0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zQXR0cmlidXRlKCkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNBdHRyaWJ1dGUgPSB0cmFuc0F0dHJpYnV0ZTsKLQkJYm9vbGVhbiBvbGRUcmFuc0F0dHJpYnV0ZUVTZXQgPSB0cmFuc0F0dHJpYnV0ZUVTZXQ7Ci0JCXRyYW5zQXR0cmlidXRlID0gVFJBTlNfQVRUUklCVVRFX0VERUZBVUxUOwotCQl0cmFuc0F0dHJpYnV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEUsIG9sZFRyYW5zQXR0cmlidXRlLCBUUkFOU19BVFRSSUJVVEVfRURFRkFVTFQsIG9sZFRyYW5zQXR0cmlidXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0cmFuc0F0dHJpYnV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fVFJBTlNfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRUcmFuc0F0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURToKLQkJCQlzZXRUcmFuc0F0dHJpYnV0ZSgoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURToKLQkJCQl1bnNldFRyYW5zQXR0cmlidXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc0F0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zQXR0cmlidXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHJhbnNBdHRyaWJ1dGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zQXR0cmlidXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiODViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldEVqYkphciA8ZW0+RWpiIEphcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uLm1hcCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlyZXR1cm4gKEVKQkphcilnZXRNaXhlZCgpLmdldChFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVIsIG5ld0VqYkphciwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSLCBuZXdFamJKYXIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFamJKYXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzQ2NGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBKYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldEVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0UmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldEFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldEVqYkNsaWVudEphciA8ZW0+RWpiIENsaWVudCBKYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkphckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQkphciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGVycHJpc2VCZWFucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudGVycHJpc2VCZWFucyBlbnRlcnByaXNlQmVhbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JzKCkgPGVtPkludGVyY2VwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZXJjZXB0b3JzVHlwZSBpbnRlcmNlcHRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpb25zaGlwcygpIDxlbT5SZWxhdGlvbnNoaXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpIDxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJDbGllbnRKYXIoKSA8ZW0+RWpiIENsaWVudCBKYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkNsaWVudEphcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xpZW50SmFyKCkgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGllbnRKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiQ2xpZW50SmFyID0gRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSA9IE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNZXRhZGF0YSBDb21wbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVKQkphckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbnMgZ2V0RW50ZXJwcmlzZUJlYW5zKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMgbmV3RW50ZXJwcmlzZUJlYW5zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUVudGVycHJpc2VCZWFucyBvbGRFbnRlcnByaXNlQmVhbnMgPSBlbnRlcnByaXNlQmVhbnM7Ci0JCWVudGVycHJpc2VCZWFucyA9IG5ld0VudGVycHJpc2VCZWFuczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBvbGRFbnRlcnByaXNlQmVhbnMsIG5ld0VudGVycHJpc2VCZWFucyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50ZXJwcmlzZUJlYW5zKEVudGVycHJpc2VCZWFucyBuZXdFbnRlcnByaXNlQmVhbnMpIHsKLQkJaWYgKG5ld0VudGVycHJpc2VCZWFucyAhPSBlbnRlcnByaXNlQmVhbnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVudGVycHJpc2VCZWFucyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllbnRlcnByaXNlQmVhbnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGVycHJpc2VCZWFucyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFbnRlcnByaXNlQmVhbnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RW50ZXJwcmlzZUJlYW5zKG5ld0VudGVycHJpc2VCZWFucywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIG5ld0VudGVycHJpc2VCZWFucywgbmV3RW50ZXJwcmlzZUJlYW5zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVyY2VwdG9yc1R5cGUgZ2V0SW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gaW50ZXJjZXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEludGVyY2VwdG9ycyhJbnRlcmNlcHRvcnNUeXBlIG5ld0ludGVyY2VwdG9ycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlJbnRlcmNlcHRvcnNUeXBlIG9sZEludGVyY2VwdG9ycyA9IGludGVyY2VwdG9yczsKLQkJaW50ZXJjZXB0b3JzID0gbmV3SW50ZXJjZXB0b3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUywgb2xkSW50ZXJjZXB0b3JzLCBuZXdJbnRlcmNlcHRvcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyY2VwdG9ycyhJbnRlcmNlcHRvcnNUeXBlIG5ld0ludGVyY2VwdG9ycykgewotCQlpZiAobmV3SW50ZXJjZXB0b3JzICE9IGludGVyY2VwdG9ycykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW50ZXJjZXB0b3JzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWludGVyY2VwdG9ycykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnRlcmNlcHRvcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW50ZXJjZXB0b3JzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW50ZXJjZXB0b3JzKG5ld0ludGVyY2VwdG9ycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUywgbmV3SW50ZXJjZXB0b3JzLCBuZXdJbnRlcmNlcHRvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBzKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZWxhdGlvbnNoaXBzIG9sZFJlbGF0aW9uc2hpcHMgPSByZWxhdGlvbnNoaXBzOwotCQlyZWxhdGlvbnNoaXBzID0gbmV3UmVsYXRpb25zaGlwczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTLCBvbGRSZWxhdGlvbnNoaXBzLCBuZXdSZWxhdGlvbnNoaXBzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwcykgewotCQlpZiAobmV3UmVsYXRpb25zaGlwcyAhPSByZWxhdGlvbnNoaXBzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWxhdGlvbnNoaXBzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlbGF0aW9uc2hpcHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlbGF0aW9uc2hpcHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWxhdGlvbnNoaXBzKG5ld1JlbGF0aW9uc2hpcHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTLCBuZXdSZWxhdGlvbnNoaXBzLCBuZXdSZWxhdGlvbnNoaXBzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIG9sZEFzc2VtYmx5RGVzY3JpcHRvciA9IGFzc2VtYmx5RGVzY3JpcHRvcjsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yID0gbmV3QXNzZW1ibHlEZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG9sZEFzc2VtYmx5RGVzY3JpcHRvciwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikgewotCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IGFzc2VtYmx5RGVzY3JpcHRvcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsaWVudEphcigpIHsKLQkJcmV0dXJuIGVqYkNsaWVudEphcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGllbnRKYXIoU3RyaW5nIG5ld0VqYkNsaWVudEphcikgewotCQlTdHJpbmcgb2xkRWpiQ2xpZW50SmFyID0gZWpiQ2xpZW50SmFyOwotCQllamJDbGllbnRKYXIgPSBuZXdFamJDbGllbnRKYXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIsIG9sZEVqYkNsaWVudEphciwgZWpiQ2xpZW50SmFyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gbmV3TWV0YWRhdGFDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQltZXRhZGF0YUNvbXBsZXRlID0gbmV3TWV0YWRhdGFDb21wbGV0ZTsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCQltZXRhZGF0YUNvbXBsZXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIG1ldGFkYXRhQ29tcGxldGUsICFvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCQltZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0JCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQsIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24sICFvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyc2lvbigpIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCQl2ZXJzaW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgVkVSU0lPTl9FREVGQVVMVCwgb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXJldHVybiBiYXNpY1NldEVudGVycHJpc2VCZWFucyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW50ZXJjZXB0b3JzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvcnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkNsaWVudEphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc01ldGFkYXRhQ29tcGxldGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW5zKChFbnRlcnByaXNlQmVhbnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlM6Ci0JCQkJc2V0SW50ZXJjZXB0b3JzKChJbnRlcmNlcHRvcnNUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUzoKLQkJCQlzZXRSZWxhdGlvbnNoaXBzKChSZWxhdGlvbnNoaXBzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSOgotCQkJCXNldEVqYkNsaWVudEphcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldE1ldGFkYXRhQ29tcGxldGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlzZXRFbnRlcnByaXNlQmVhbnMoKEVudGVycHJpc2VCZWFucyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTOgotCQkJCXNldEludGVyY2VwdG9ycygoSW50ZXJjZXB0b3JzVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUzoKLQkJCQlzZXRSZWxhdGlvbnNoaXBzKChSZWxhdGlvbnNoaXBzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXNldEFzc2VtYmx5RGVzY3JpcHRvcigoQXNzZW1ibHlEZXNjcmlwdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXVuc2V0VmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXJldHVybiBlbnRlcnByaXNlQmVhbnMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGludGVyY2VwdG9ycyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFM6Ci0JCQkJcmV0dXJuIHJlbGF0aW9uc2hpcHMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlyZXR1cm4gRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkNsaWVudEphciAhPSBudWxsIDogIUVKQl9DTElFTlRfSkFSX0VERUZBVUxULmVxdWFscyhlamJDbGllbnRKYXIpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXJldHVybiBpc1NldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYkNsaWVudEphcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJDbGllbnRKYXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YUNvbXBsZXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWV0YWRhdGFDb21wbGV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQobWV0YWRhdGFDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FSkJKYXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTBiYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBSZWxhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsI2dldEVqYlJlbGF0aW9uTmFtZSA8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVzIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQlJlbGF0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVsYXRpb25OYW1lKCkgPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWxhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9SRUxBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlbGF0aW9uTmFtZSgpIDxlbT5FamIgUmVsYXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlJlbGF0aW9uTmFtZSA9IEVKQl9SRUxBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKSA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlbGF0aW9uc2hpcFJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVKQlJlbGF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFTEFUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJSZWxhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBlamJSZWxhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiUmVsYXRpb25OYW1lKFN0cmluZyBuZXdFamJSZWxhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYlJlbGF0aW9uTmFtZSA9IGVqYlJlbGF0aW9uTmFtZTsKLQkJZWpiUmVsYXRpb25OYW1lID0gbmV3RWpiUmVsYXRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUUsIG9sZEVqYlJlbGF0aW9uTmFtZSwgZWpiUmVsYXRpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKSB7Ci0JCWlmIChlamJSZWxhdGlvbnNoaXBSb2xlcyA9PSBudWxsKSB7Ci0JCQllamJSZWxhdGlvbnNoaXBSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVsYXRpb25OYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCXJldHVybiBnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUU6Ci0JCQkJc2V0RWpiUmVsYXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUU6Ci0JCQkJc2V0RWpiUmVsYXRpb25OYW1lKEVKQl9SRUxBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCWdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9SRUxBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJSZWxhdGlvbk5hbWUgIT0gbnVsbCA6ICFFSkJfUkVMQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiUmVsYXRpb25OYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVzICE9IG51bGwgJiYgIWVqYlJlbGF0aW9uc2hpcFJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiUmVsYXRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYlJlbGF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FSkJSZWxhdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTFhMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0Q2FzY2FkZURlbGV0ZSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsI2dldENtckZpZWxkIDxlbT5DbXIgRmllbGQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQlJlbGF0aW9uc2hpcFJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJSZWxhdGlvbnNoaXBSb2xlTmFtZSA9IEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpcGxpY2l0eSgpIDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlUeXBlIE1VTFRJUExJQ0lUWV9FREVGQVVMVCA9IE11bHRpcGxpY2l0eVR5cGUuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdWx0aXBsaWNpdHkoKSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNdWx0aXBsaWNpdHlUeXBlIG11bHRpcGxpY2l0eSA9IE1VTFRJUExJQ0lUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTXVsdGlwbGljaXR5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdWx0aXBsaWNpdHlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlRGVsZXRlKCkgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW1wdHlUeXBlIGNhc2NhZGVEZWxldGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSByZWxhdGlvbnNoaXBSb2xlU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtckZpZWxkKCkgPGVtPkNtciBGaWVsZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q21yRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDTVJGaWVsZCBjbXJGaWVsZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKFN0cmluZyBuZXdFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPSBlamJSZWxhdGlvbnNoaXBSb2xlTmFtZTsKLQkJZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPSBuZXdFamJSZWxhdGlvbnNoaXBSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FLCBvbGRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSwgZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXVsdGlwbGljaXR5VHlwZSBnZXRNdWx0aXBsaWNpdHkoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eVR5cGUgbmV3TXVsdGlwbGljaXR5KSB7Ci0JCU11bHRpcGxpY2l0eVR5cGUgb2xkTXVsdGlwbGljaXR5ID0gbXVsdGlwbGljaXR5OwotCQltdWx0aXBsaWNpdHkgPSBuZXdNdWx0aXBsaWNpdHkgPT0gbnVsbCA/IE1VTFRJUExJQ0lUWV9FREVGQVVMVCA6IG5ld011bHRpcGxpY2l0eTsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsaWNpdHlFU2V0ID0gbXVsdGlwbGljaXR5RVNldDsKLQkJbXVsdGlwbGljaXR5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFksIG9sZE11bHRpcGxpY2l0eSwgbXVsdGlwbGljaXR5LCAhb2xkTXVsdGlwbGljaXR5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TXVsdGlwbGljaXR5KCkgewotCQlNdWx0aXBsaWNpdHlUeXBlIG9sZE11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eTsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsaWNpdHlFU2V0ID0gbXVsdGlwbGljaXR5RVNldDsKLQkJbXVsdGlwbGljaXR5ID0gTVVMVElQTElDSVRZX0VERUZBVUxUOwotCQltdWx0aXBsaWNpdHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSwgb2xkTXVsdGlwbGljaXR5LCBNVUxUSVBMSUNJVFlfRURFRkFVTFQsIG9sZE11bHRpcGxpY2l0eUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE11bHRpcGxpY2l0eSgpIHsKLQkJcmV0dXJuIG11bHRpcGxpY2l0eUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVtcHR5VHlwZSBnZXRDYXNjYWRlRGVsZXRlKCkgewotCQlyZXR1cm4gY2FzY2FkZURlbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYXNjYWRlRGVsZXRlKEVtcHR5VHlwZSBuZXdDYXNjYWRlRGVsZXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUVtcHR5VHlwZSBvbGRDYXNjYWRlRGVsZXRlID0gY2FzY2FkZURlbGV0ZTsKLQkJY2FzY2FkZURlbGV0ZSA9IG5ld0Nhc2NhZGVEZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSwgb2xkQ2FzY2FkZURlbGV0ZSwgbmV3Q2FzY2FkZURlbGV0ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZURlbGV0ZShFbXB0eVR5cGUgbmV3Q2FzY2FkZURlbGV0ZSkgewotCQlpZiAobmV3Q2FzY2FkZURlbGV0ZSAhPSBjYXNjYWRlRGVsZXRlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYXNjYWRlRGVsZXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGVEZWxldGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nhc2NhZGVEZWxldGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FzY2FkZURlbGV0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYXNjYWRlRGVsZXRlKG5ld0Nhc2NhZGVEZWxldGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBuZXdDYXNjYWRlRGVsZXRlLCBuZXdDYXNjYWRlRGVsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSB7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBSb2xlU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgbmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSBvbGRSZWxhdGlvbnNoaXBSb2xlU291cmNlID0gcmVsYXRpb25zaGlwUm9sZVNvdXJjZTsKLQkJcmVsYXRpb25zaGlwUm9sZVNvdXJjZSA9IG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UsIG9sZFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UsIG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgbmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSkgewotCQlpZiAobmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSAhPSByZWxhdGlvbnNoaXBSb2xlU291cmNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWxhdGlvbnNoaXBSb2xlU291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlbGF0aW9uc2hpcFJvbGVTb3VyY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UobmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBuZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlLCBuZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUkZpZWxkIGdldENtckZpZWxkKCkgewotCQlyZXR1cm4gY21yRmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q21yRmllbGQoQ01SRmllbGQgbmV3Q21yRmllbGQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ01SRmllbGQgb2xkQ21yRmllbGQgPSBjbXJGaWVsZDsKLQkJY21yRmllbGQgPSBuZXdDbXJGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgb2xkQ21yRmllbGQsIG5ld0NtckZpZWxkKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbXJGaWVsZChDTVJGaWVsZCBuZXdDbXJGaWVsZCkgewotCQlpZiAobmV3Q21yRmllbGQgIT0gY21yRmllbGQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNtckZpZWxkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNtckZpZWxkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q21yRmllbGQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q21yRmllbGQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENtckZpZWxkKG5ld0NtckZpZWxkLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG5ld0NtckZpZWxkLCBuZXdDbXJGaWVsZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXJldHVybiBiYXNpY1NldENhc2NhZGVEZWxldGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbXJGaWVsZChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXJldHVybiBnZXRNdWx0aXBsaWNpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlRGVsZXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlyZXR1cm4gZ2V0Q21yRmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FOgotCQkJCXNldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQlzZXRNdWx0aXBsaWNpdHkoKE11bHRpcGxpY2l0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXNldENhc2NhZGVEZWxldGUoKEVtcHR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFOgotCQkJCXNldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJc2V0Q21yRmllbGQoKENNUkZpZWxkKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUU6Ci0JCQkJc2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQl1bnNldE11bHRpcGxpY2l0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXNldENhc2NhZGVEZWxldGUoKEVtcHR5VHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0U6Ci0JCQkJc2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJSZWxhdGlvbnNoaXBSb2xlTmFtZSAhPSBudWxsIDogIUVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhlamJSZWxhdGlvbnNoaXBSb2xlTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJcmV0dXJuIGlzU2V0TXVsdGlwbGljaXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlyZXR1cm4gY2FzY2FkZURlbGV0ZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFOgotCQkJCXJldHVybiByZWxhdGlvbnNoaXBSb2xlU291cmNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGNtckZpZWxkICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsaWNpdHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtdWx0aXBsaWNpdHlFU2V0KSByZXN1bHQuYXBwZW5kKG11bHRpcGxpY2l0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjk3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBFamJGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlFamJGYWN0b3J5IHRoZUVqYkZhY3RvcnkgPSAoRWpiRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYiIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZUVqYkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVFamJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVqYkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2YXRpb25Db25maWcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJvdW5kSW52b2tlVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTEQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDTVBGaWVsZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNNUkZpZWxkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRUpCSmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRlcnByaXNlQmVhbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudGl0eUJlYW4oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVFeGNsdWRlTGlzdCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbml0TWV0aG9kVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUludGVyY2VwdG9yQmluZGluZ1R5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSW50ZXJjZXB0b3JPcmRlclR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUludGVyY2VwdG9yc1R5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSW50ZXJjZXB0b3JUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBhcmFtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTmFtZWRNZXRob2RUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVRdWVyeSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVtb3ZlTWV0aG9kVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN1cml0eUlkZW50aXR5VHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlc3Npb25CZWFuKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDbXBWZXJzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDTVJGaWVsZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfSU5URVJGQUNFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEludGVyZmFjZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NVUxUSVBMSUNJVFlfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlwbGljaXR5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlBFUlNJU1RFTkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUcmFuc2FjdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfVkVSU0lPTl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlQ21wVmVyc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9DTEFTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJDbGFzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVNZXRob2ROYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1VTFRJUExJQ0lUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlwbGljaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlBFUlNJU1RFTkNFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENtcFZlcnNpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENNUkZpZWxkVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0lOVEVSRkFDRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TWV0aG9kSW50ZXJmYWNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNdWx0aXBsaWNpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5QRVJTSVNURU5DRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UGVyc2lzdGVuY2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlc3Npb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDbXBWZXJzaW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0Q01SRmllbGRUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfQ0xBU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVqYkNsYXNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVqYk5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfSU5URVJGQUNFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0TWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1ldGhvZE5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NVUxUSVBMSUNJVFlfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5QRVJTSVNURU5DRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFNlc3Npb25UeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25UeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvbkNvbmZpZyBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCkgewotCQlBY3RpdmF0aW9uQ29uZmlnSW1wbCBhY3RpdmF0aW9uQ29uZmlnID0gbmV3IEFjdGl2YXRpb25Db25maWdJbXBsKCk7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgewotCQlBcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwgYXBwbGljYXRpb25FeGNlcHRpb24gPSBuZXcgQXBwbGljYXRpb25FeGNlcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJvdW5kSW52b2tlVHlwZSBjcmVhdGVBcm91bmRJbnZva2VUeXBlKCkgewotCQlBcm91bmRJbnZva2VUeXBlSW1wbCBhcm91bmRJbnZva2VUeXBlID0gbmV3IEFyb3VuZEludm9rZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcm91bmRJbnZva2VUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlBc3NlbWJseURlc2NyaXB0b3JJbXBsIGFzc2VtYmx5RGVzY3JpcHRvciA9IG5ldyBBc3NlbWJseURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUEZpZWxkIGNyZWF0ZUNNUEZpZWxkKCkgewotCQlDTVBGaWVsZEltcGwgY21wRmllbGQgPSBuZXcgQ01QRmllbGRJbXBsKCk7Ci0JCXJldHVybiBjbXBGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01SRmllbGQgY3JlYXRlQ01SRmllbGQoKSB7Ci0JCUNNUkZpZWxkSW1wbCBjbXJGaWVsZCA9IG5ldyBDTVJGaWVsZEltcGwoKTsKLQkJcmV0dXJuIGNtckZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250YWluZXJUcmFuc2FjdGlvblR5cGUgY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkgewotCQlDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSA9IG5ldyBDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBjb250YWluZXJUcmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkphciBjcmVhdGVFSkJKYXIoKSB7Ci0JCUVKQkphckltcGwgZWpiSmFyID0gbmV3IEVKQkphckltcGwoKTsKLQkJcmV0dXJuIGVqYkphcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ldyBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbiBjcmVhdGVFSkJSZWxhdGlvbigpIHsKLQkJRUpCUmVsYXRpb25JbXBsIGVqYlJlbGF0aW9uID0gbmV3IEVKQlJlbGF0aW9uSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVsYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgZWpiUmVsYXRpb25zaGlwUm9sZSA9IG5ldyBFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVsYXRpb25zaGlwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW5zIGNyZWF0ZUVudGVycHJpc2VCZWFucygpIHsKLQkJRW50ZXJwcmlzZUJlYW5zSW1wbCBlbnRlcnByaXNlQmVhbnMgPSBuZXcgRW50ZXJwcmlzZUJlYW5zSW1wbCgpOwotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRpdHlCZWFuIGNyZWF0ZUVudGl0eUJlYW4oKSB7Ci0JCUVudGl0eUJlYW5JbXBsIGVudGl0eUJlYW4gPSBuZXcgRW50aXR5QmVhbkltcGwoKTsKLQkJcmV0dXJuIGVudGl0eUJlYW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2x1ZGVMaXN0IGNyZWF0ZUV4Y2x1ZGVMaXN0KCkgewotCQlFeGNsdWRlTGlzdEltcGwgZXhjbHVkZUxpc3QgPSBuZXcgRXhjbHVkZUxpc3RJbXBsKCk7Ci0JCXJldHVybiBleGNsdWRlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdE1ldGhvZFR5cGUgY3JlYXRlSW5pdE1ldGhvZFR5cGUoKSB7Ci0JCUluaXRNZXRob2RUeXBlSW1wbCBpbml0TWV0aG9kVHlwZSA9IG5ldyBJbml0TWV0aG9kVHlwZUltcGwoKTsKLQkJcmV0dXJuIGluaXRNZXRob2RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlcmNlcHRvckJpbmRpbmdUeXBlIGNyZWF0ZUludGVyY2VwdG9yQmluZGluZ1R5cGUoKSB7Ci0JCUludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsIGludGVyY2VwdG9yQmluZGluZ1R5cGUgPSBuZXcgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwoKTsKLQkJcmV0dXJuIGludGVyY2VwdG9yQmluZGluZ1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVyY2VwdG9yT3JkZXJUeXBlIGNyZWF0ZUludGVyY2VwdG9yT3JkZXJUeXBlKCkgewotCQlJbnRlcmNlcHRvck9yZGVyVHlwZUltcGwgaW50ZXJjZXB0b3JPcmRlclR5cGUgPSBuZXcgSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsKCk7Ci0JCXJldHVybiBpbnRlcmNlcHRvck9yZGVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJjZXB0b3JzVHlwZSBjcmVhdGVJbnRlcmNlcHRvcnNUeXBlKCkgewotCQlJbnRlcmNlcHRvcnNUeXBlSW1wbCBpbnRlcmNlcHRvcnNUeXBlID0gbmV3IEludGVyY2VwdG9yc1R5cGVJbXBsKCk7Ci0JCXJldHVybiBpbnRlcmNlcHRvcnNUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlcmNlcHRvclR5cGUgY3JlYXRlSW50ZXJjZXB0b3JUeXBlKCkgewotCQlJbnRlcmNlcHRvclR5cGVJbXBsIGludGVyY2VwdG9yVHlwZSA9IG5ldyBJbnRlcmNlcHRvclR5cGVJbXBsKCk7Ci0JCXJldHVybiBpbnRlcmNlcHRvclR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5CZWFuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuKCkgewotCQlNZXNzYWdlRHJpdmVuQmVhbkltcGwgbWVzc2FnZURyaXZlbkJlYW4gPSBuZXcgTWVzc2FnZURyaXZlbkJlYW5JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuQmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFyYW1zIGNyZWF0ZU1ldGhvZFBhcmFtcygpIHsKLQkJTWV0aG9kUGFyYW1zSW1wbCBtZXRob2RQYXJhbXMgPSBuZXcgTWV0aG9kUGFyYW1zSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kUGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCU1ldGhvZFBlcm1pc3Npb25JbXBsIG1ldGhvZFBlcm1pc3Npb24gPSBuZXcgTWV0aG9kUGVybWlzc2lvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFR5cGUgY3JlYXRlTWV0aG9kVHlwZSgpIHsKLQkJTWV0aG9kVHlwZUltcGwgbWV0aG9kVHlwZSA9IG5ldyBNZXRob2RUeXBlSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGNyZWF0ZU5hbWVkTWV0aG9kVHlwZSgpIHsKLQkJTmFtZWRNZXRob2RUeXBlSW1wbCBuYW1lZE1ldGhvZFR5cGUgPSBuZXcgTmFtZWRNZXRob2RUeXBlSW1wbCgpOwotCQlyZXR1cm4gbmFtZWRNZXRob2RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeSgpIHsKLQkJUXVlcnlJbXBsIHF1ZXJ5ID0gbmV3IFF1ZXJ5SW1wbCgpOwotCQlyZXR1cm4gcXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFF1ZXJ5TWV0aG9kIGNyZWF0ZVF1ZXJ5TWV0aG9kKCkgewotCQlRdWVyeU1ldGhvZEltcGwgcXVlcnlNZXRob2QgPSBuZXcgUXVlcnlNZXRob2RJbXBsKCk7Ci0JCXJldHVybiBxdWVyeU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKSB7Ci0JCVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCByZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSA9IG5ldyBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwoKTsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWxhdGlvbnNoaXBzIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKSB7Ci0JCVJlbGF0aW9uc2hpcHNJbXBsIHJlbGF0aW9uc2hpcHMgPSBuZXcgUmVsYXRpb25zaGlwc0ltcGwoKTsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlbW92ZU1ldGhvZFR5cGUgY3JlYXRlUmVtb3ZlTWV0aG9kVHlwZSgpIHsKLQkJUmVtb3ZlTWV0aG9kVHlwZUltcGwgcmVtb3ZlTWV0aG9kVHlwZSA9IG5ldyBSZW1vdmVNZXRob2RUeXBlSW1wbCgpOwotCQlyZXR1cm4gcmVtb3ZlTWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eVR5cGUgY3JlYXRlU2VjdXJpdHlJZGVudGl0eVR5cGUoKSB7Ci0JCVNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCBzZWN1cml0eUlkZW50aXR5VHlwZSA9IG5ldyBTZWN1cml0eUlkZW50aXR5VHlwZUltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXNzaW9uQmVhbiBjcmVhdGVTZXNzaW9uQmVhbigpIHsKLQkJU2Vzc2lvbkJlYW5JbXBsIHNlc3Npb25CZWFuID0gbmV3IFNlc3Npb25CZWFuSW1wbCgpOwotCQlyZXR1cm4gc2Vzc2lvbkJlYW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENtcFZlcnNpb25UeXBlIGNyZWF0ZUNtcFZlcnNpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUNtcFZlcnNpb25UeXBlIHJlc3VsdCA9IENtcFZlcnNpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbXBWZXJzaW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDTVJGaWVsZFR5cGUgY3JlYXRlQ01SRmllbGRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUNNUkZpZWxkVHlwZSByZXN1bHQgPSBDTVJGaWVsZFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENNUkZpZWxkVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RJbnRlcmZhY2VUeXBlIGNyZWF0ZU1ldGhvZEludGVyZmFjZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJTWV0aG9kSW50ZXJmYWNlVHlwZSByZXN1bHQgPSBNZXRob2RJbnRlcmZhY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXRob2RJbnRlcmZhY2VUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eVR5cGUgY3JlYXRlTXVsdGlwbGljaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlNdWx0aXBsaWNpdHlUeXBlIHJlc3VsdCA9IE11bHRpcGxpY2l0eVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE11bHRpcGxpY2l0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlQZXJzaXN0ZW5jZVR5cGUgcmVzdWx0ID0gUGVyc2lzdGVuY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQZXJzaXN0ZW5jZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIGNyZWF0ZVJlc3VsdFR5cGVNYXBwaW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXN1bHRUeXBlTWFwcGluZ1R5cGUgcmVzdWx0ID0gUmVzdWx0VHlwZU1hcHBpbmdUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gU2Vzc2lvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlc3Npb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBjcmVhdGVUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHJlc3VsdCA9IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBjcmVhdGVUcmFuc2FjdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFRyYW5zYWN0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENtcFZlcnNpb25UeXBlIGNyZWF0ZUNtcFZlcnNpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQ21wVmVyc2lvblR5cGUpY3JlYXRlQ21wVmVyc2lvblR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01QX1ZFUlNJT05fVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbXBWZXJzaW9uVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0Q21wVmVyc2lvblR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9WRVJTSU9OX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDTVJGaWVsZFR5cGUgY3JlYXRlQ01SRmllbGRUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQ01SRmllbGRUeXBlKWNyZWF0ZUNNUkZpZWxkVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DTVJfRklFTERfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDTVJGaWVsZFR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydENNUkZpZWxkVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRWpiQ2xhc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKUphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJDbGFzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRWpiTmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuTk1UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJOYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLk5NVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RJbnRlcmZhY2VUeXBlIGNyZWF0ZU1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChNZXRob2RJbnRlcmZhY2VUeXBlKWNyZWF0ZU1ldGhvZEludGVyZmFjZVR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0lOVEVSRkFDRV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydE1ldGhvZEludGVyZmFjZVR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9JTlRFUkZBQ0VfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNZXRob2ROYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXRob2ROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXVsdGlwbGljaXR5VHlwZSBjcmVhdGVNdWx0aXBsaWNpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTXVsdGlwbGljaXR5VHlwZSljcmVhdGVNdWx0aXBsaWNpdHlUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLk1VTFRJUExJQ0lUWV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE11bHRpcGxpY2l0eVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydE11bHRpcGxpY2l0eVR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLk1VTFRJUExJQ0lUWV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVHlwZSljcmVhdGVQZXJzaXN0ZW5jZVR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQZXJzaXN0ZW5jZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBjcmVhdGVSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSZXN1bHRUeXBlTWFwcGluZ1R5cGUpY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFJlc3VsdFR5cGVNYXBwaW5nVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTZXNzaW9uVHlwZSljcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2Vzc2lvblR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFNlc3Npb25UeXBlVG9TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKWNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgY3JlYXRlVHJhbnNhY3Rpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVHJhbnNhY3Rpb25UeXBlKWNyZWF0ZVRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5UUkFOU0FDVElPTl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYW5zYWN0aW9uVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5UUkFOU0FDVElPTl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVqYlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vRWpiRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0NmEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC5uYW1lc3BhY2UuWE1MTmFtZXNwYWNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRWpiUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJvdW5kSW52b2tlVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY21wRmllbGRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY21yRmllbGRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkphckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJSZWxhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGVycHJpc2VCZWFuc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnRpdHlCZWFuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2x1ZGVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRNZXRob2RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW50ZXJjZXB0b3JzVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbnRlcmNlcHRvclR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFyYW1zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZE1ldGhvZFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcXVlcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcXVlcnlNZXRob2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVsYXRpb25zaGlwc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZW1vdmVNZXRob2RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlc3Npb25CZWFuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gY21wVmVyc2lvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGNtckZpZWxkVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbXVsdGlwbGljaXR5VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcGVyc2lzdGVuY2VUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHNlc3Npb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zYWN0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNtcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNtckZpZWxkVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlamJDbGFzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWpiTmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtZXRob2ROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFamJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgRWpiRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRWpiUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFamJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVFamJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFjdGl2YXRpb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0V4Y2VwdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJvdW5kSW52b2tlVHlwZSgpIHsKLQkJcmV0dXJuIGFyb3VuZEludm9rZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJvdW5kSW52b2tlVHlwZV9DbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFyb3VuZEludm9rZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcm91bmRJbnZva2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfQ29udGFpbmVyVHJhbnNhY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENNUEZpZWxkKCkgewotCQlyZXR1cm4gY21wRmllbGRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY21wRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDTVBGaWVsZF9GaWVsZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljbXBGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENNUEZpZWxkX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY21wRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENNUkZpZWxkKCkgewotCQlyZXR1cm4gY21yRmllbGRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY21yRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljbXJGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENNUkZpZWxkX0NtckZpZWxkVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNtckZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q01SRmllbGRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljbXJGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9UcmFuc0F0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCSmFyKCkgewotCQlyZXR1cm4gZWpiSmFyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9JbnRlcmNlcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfUmVsYXRpb25zaGlwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJKYXJfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfRWpiSmFyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQlJlbGF0aW9uKCkgewotCQlyZXR1cm4gZWpiUmVsYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWxhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkgewotCQlyZXR1cm4gZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0VqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RW50ZXJwcmlzZUJlYW5zKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuc19Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGVycHJpc2VCZWFuc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50ZXJwcmlzZUJlYW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHlCZWFuKCkgewotCQlyZXR1cm4gZW50aXR5QmVhbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fRWpiTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9Ib21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUmVtb3RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fTG9jYWxIb21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fTG9jYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9FamJDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9QcmltS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUmVlbnRyYW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fQWJzdHJhY3RTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0NtcEZpZWxkcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRW52RW50cmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9FamJSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0VqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1Bvc3RDb25zdHJ1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4Y2x1ZGVMaXN0KCkgewotCQlyZXR1cm4gZXhjbHVkZUxpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXhjbHVkZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeGNsdWRlTGlzdF9NZXRob2RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXhjbHVkZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNsdWRlTGlzdF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbml0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIGluaXRNZXRob2RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdE1ldGhvZFR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JPcmRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JzVHlwZSgpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yc1R5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JzVHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvcnNUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JzVHlwZV9JbnRlcmNlcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvcnNUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JzVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yc1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEludGVyY2VwdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JUeXBlX0ludGVyY2VwdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRWpiTG9jYWxSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Qb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RBY3RpdmF0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZVBhc3NpdmF0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURyaXZlbkJlYW4oKSB7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuQmVhbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdpbmdUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9BY3RpdmF0aW9uQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VudkVudHJpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiBtZXRob2RQYXJhbXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFyYW1zX01ldGhvZFBhcmFtcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhcmFtc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtc19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhcmFtc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGVybWlzc2lvbigpIHsKLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlTmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gbWV0aG9kVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RUeXBlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX0VqYk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9NZXRob2RJbnRmKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZWRNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gbmFtZWRNZXRob2RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZWRNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW5hbWVkTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVkTWV0aG9kVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBxdWVyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRRdWVyeV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfUXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFF1ZXJ5X1Jlc3VsdFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeV9FamJRbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVlcnlfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiBxdWVyeU1ldGhvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRRdWVyeU1ldGhvZF9NZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeU1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFF1ZXJ5TWV0aG9kX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWxhdGlvbnNoaXBzKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlbGF0aW9uc2hpcHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlbGF0aW9uc2hpcHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBzX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIHJlbW92ZU1ldGhvZFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVtb3ZlTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlbW92ZU1ldGhvZFR5cGVfUmV0YWluSWZFeGNlcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZW1vdmVNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVtb3ZlTWV0aG9kVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkgewotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlc3Npb25CZWFuKCkgewotCQlyZXR1cm4gc2Vzc2lvbkJlYW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9FamJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Ib21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9SZW1vdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0xvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fTG9jYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0J1c2luZXNzTG9jYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9FamJDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRWpiUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0VqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVQYXNzaXZhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldENtcFZlcnNpb25UeXBlKCkgewotCQlyZXR1cm4gY21wVmVyc2lvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q01SRmllbGRUeXBlKCkgewotCQlyZXR1cm4gY21yRmllbGRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1ldGhvZEludGVyZmFjZVR5cGUoKSB7Ci0JCXJldHVybiBtZXRob2RJbnRlcmZhY2VUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE11bHRpcGxpY2l0eVR5cGUoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKSB7Ci0JCXJldHVybiByZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0U2Vzc2lvblR5cGUoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDbXBWZXJzaW9uVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIGNtcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q01SRmllbGRUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gY21yRmllbGRUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWpiQ2xhc3NUeXBlKCkgewotCQlyZXR1cm4gZWpiQ2xhc3NUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWpiTmFtZVR5cGUoKSB7Ci0JCXJldHVybiBlamJOYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBtZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TWV0aG9kTmFtZVR5cGUoKSB7Ci0JCXJldHVybiBtZXRob2ROYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE11bHRpcGxpY2l0eVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gcmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2Vzc2lvblR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotCQlyZXR1cm4gKEVqYkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVkFUSU9OX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19JRCk7Ci0KLQkJYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fSUQpOwotCi0JCWFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FUSU9OX0VYQ0VQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcywgQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQpOwotCi0JCWFyb3VuZEludm9rZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJPVU5EX0lOVk9LRV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcm91bmRJbnZva2VUeXBlRUNsYXNzLCBBUk9VTkRfSU5WT0tFX1RZUEVfX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcm91bmRJbnZva2VUeXBlRUNsYXNzLCBBUk9VTkRfSU5WT0tFX1RZUEVfX01FVEhPRF9OQU1FKTsKLQotCQlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19JRCk7Ci0KLQkJY21wRmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ01QX0ZJRUxEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjbXBGaWVsZEVDbGFzcywgQ01QX0ZJRUxEX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtcEZpZWxkRUNsYXNzLCBDTVBfRklFTERfX0ZJRUxEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtcEZpZWxkRUNsYXNzLCBDTVBfRklFTERfX0lEKTsKLQotCQljbXJGaWVsZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDTVJfRklFTEQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNtckZpZWxkRUNsYXNzLCBDTVJfRklFTERfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtckZpZWxkRUNsYXNzLCBDTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbXJGaWVsZEVDbGFzcywgQ01SX0ZJRUxEX19JRCk7Ci0KLQkJY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcywgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcywgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQpOwotCi0JCWVqYkphckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfSkFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0lDT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fSU5URVJDRVBUT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX1JFTEFUSU9OU0hJUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19WRVJTSU9OKTsKLQotCQllamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUik7Ci0KLQkJZWpiUmVsYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFTEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlbGF0aW9uRUNsYXNzLCBFSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19JRCk7Ci0KLQkJZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfUkVMQVRJT05TSElQX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0lEKTsKLQotCQllbnRlcnByaXNlQmVhbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU5URVJQUklTRV9CRUFOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5TX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRlcnByaXNlQmVhbnNFQ2xhc3MsIEVOVEVSUFJJU0VfQkVBTlNfX0VOVElUWV9CRUFOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5TX19JRCk7Ci0KLQkJZW50aXR5QmVhbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfQkVBTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19JQ09OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0VKQl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUkVNT1RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fTE9DQUxfSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0xPQ0FMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fRUpCX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUkVFTlRSQU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fQ01QX1ZFUlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0NNUF9GSUVMRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19QUklNS0VZX0ZJRUxEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19FSkJfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fU0VSVklDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19RVUVSSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fSUQpOwotCi0JCWV4Y2x1ZGVMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQ0xVREVfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShleGNsdWRlTGlzdEVDbGFzcywgRVhDTFVERV9MSVNUX19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleGNsdWRlTGlzdEVDbGFzcywgRVhDTFVERV9MSVNUX19JRCk7Ci0KLQkJaW5pdE1ldGhvZFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5JVF9NRVRIT0RfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdE1ldGhvZFR5cGVFQ2xhc3MsIElOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluaXRNZXRob2RUeXBlRUNsYXNzLCBJTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdE1ldGhvZFR5cGVFQ2xhc3MsIElOSVRfTUVUSE9EX1RZUEVfX0lEKTsKLQotCQlpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRCk7Ci0KLQkJaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URVJDRVBUT1JfT1JERVJfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRCk7Ci0KLQkJaW50ZXJjZXB0b3JzVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTlRFUkNFUFRPUlNfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JzVHlwZUVDbGFzcywgSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JzVHlwZUVDbGFzcywgSU5URVJDRVBUT1JTX1RZUEVfX0lOVEVSQ0VQVE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JzVHlwZUVDbGFzcywgSU5URVJDRVBUT1JTX1RZUEVfX0lEKTsKLQotCQlpbnRlcmNlcHRvclR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URVJDRVBUT1JfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QUkVfUEFTU0lWQVRFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19JRCk7Ci0KLQkJbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9EUklWRU5fQkVBTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19JQ09OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEKTsKLQotCQltZXRob2RQYXJhbXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFyYW1zRUNsYXNzLCBNRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYXJhbXNFQ2xhc3MsIE1FVEhPRF9QQVJBTVNfX0lEKTsKLQotCQltZXRob2RQZXJtaXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QRVJNSVNTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fUk9MRV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1FVEhPRF9QRVJNSVNTSU9OX19JRCk7Ci0KLQkJbWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kVHlwZUVDbGFzcywgTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVHlwZUVDbGFzcywgTUVUSE9EX1RZUEVfX0VKQl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RUeXBlRUNsYXNzLCBNRVRIT0RfVFlQRV9fTUVUSE9EX0lOVEYpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFR5cGVFQ2xhc3MsIE1FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kVHlwZUVDbGFzcywgTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFR5cGVFQ2xhc3MsIE1FVEhPRF9UWVBFX19JRCk7Ci0KLQkJbmFtZWRNZXRob2RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVEX01FVEhPRF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZE1ldGhvZFR5cGVFQ2xhc3MsIE5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobmFtZWRNZXRob2RUeXBlRUNsYXNzLCBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRNZXRob2RUeXBlRUNsYXNzLCBOQU1FRF9NRVRIT0RfVFlQRV9fSUQpOwotCi0JCXF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFFVRVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShxdWVyeUVDbGFzcywgUVVFUllfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShxdWVyeUVDbGFzcywgUVVFUllfX1FVRVJZX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlFQ2xhc3MsIFFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeUVDbGFzcywgUVVFUllfX0VKQl9RTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlFQ2xhc3MsIFFVRVJZX19JRCk7Ci0KLQkJcXVlcnlNZXRob2RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUVVFUllfTUVUSE9EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeU1ldGhvZEVDbGFzcywgUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocXVlcnlNZXRob2RFQ2xhc3MsIFFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlNZXRob2RFQ2xhc3MsIFFVRVJZX01FVEhPRF9fSUQpOwotCi0JCXJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUVDbGFzcywgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRCk7Ci0KLQkJcmVsYXRpb25zaGlwc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUxBVElPTlNISVBTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJFTEFUSU9OU0hJUFNfX0lEKTsKLQotCQlyZW1vdmVNZXRob2RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFTU9WRV9NRVRIT0RfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgUkVNT1ZFX01FVEhPRF9UWVBFX19SRVRBSU5fSUZfRVhDRVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZW1vdmVNZXRob2RUeXBlRUNsYXNzLCBSRU1PVkVfTUVUSE9EX1RZUEVfX0lEKTsKLQotCQlzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9JREVOVElUWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcywgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcywgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0lEKTsKLQotCQlzZXNzaW9uQmVhbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVNTSU9OX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0VKQl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUkVNT1RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19MT0NBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0lEKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJY21wVmVyc2lvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENNUF9WRVJTSU9OX1RZUEUpOwotCQljbXJGaWVsZFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENNUl9GSUVMRF9UWVBFKTsKLQkJbWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oTUVUSE9EX0lOVEVSRkFDRV9UWVBFKTsKLQkJbXVsdGlwbGljaXR5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oTVVMVElQTElDSVRZX1RZUEUpOwotCQlwZXJzaXN0ZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFBFUlNJU1RFTkNFX1RZUEUpOwotCQlyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSk7Ci0JCXNlc3Npb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShTRVNTSU9OX1RZUEUpOwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFKTsKLQkJdHJhbnNhY3Rpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQljbXBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShDTVBfVkVSU0lPTl9UWVBFX09CSkVDVCk7Ci0JCWNtckZpZWxkVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShDTVJfRklFTERfVFlQRV9PQkpFQ1QpOwotCQllamJDbGFzc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRUpCX0NMQVNTX1RZUEUpOwotCQllamJOYW1lVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFSkJfTkFNRV9UWVBFKTsKLQkJbWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNRVRIT0RfSU5URVJGQUNFX1RZUEVfT0JKRUNUKTsKLQkJbWV0aG9kTmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUVUSE9EX05BTUVfVFlQRSk7Ci0JCW11bHRpcGxpY2l0eVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTVVMVElQTElDSVRZX1RZUEVfT0JKRUNUKTsKLQkJcGVyc2lzdGVuY2VUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFBFUlNJU1RFTkNFX1RZUEVfT0JKRUNUKTsKLQkJcmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1QpOwotCQlzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVNTSU9OX1RZUEVfT0JKRUNUKTsKLQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFX09CSkVDVCk7Ci0JCXRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUUkFOU0FDVElPTl9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25Db25maWdfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMSwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUiLCBudWxsLCAxLCAxLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlIiwgbnVsbCwgMSwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcywgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJleGNlcHRpb25DbGFzcyIsIG51bGwsIDEsIDEsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJvbGxiYWNrIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGFyb3VuZEludm9rZVR5cGVFQ2xhc3MsIEFyb3VuZEludm9rZVR5cGUuY2xhc3MsICJBcm91bmRJbnZva2VUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY2xhc3MiLCBudWxsLCAwLCAxLCBBcm91bmRJbnZva2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIEFyb3VuZEludm9rZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIkFzc2VtYmx5RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbigpLCBudWxsLCAibWV0aG9kUGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9Db250YWluZXJUcmFuc2FjdGlvbnMoKSwgdGhpcy5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKSwgbnVsbCwgImNvbnRhaW5lclRyYW5zYWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKSwgdGhpcy5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCksIG51bGwsICJpbnRlcmNlcHRvckJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCksIHRoaXMuZ2V0RXhjbHVkZUxpc3QoKSwgbnVsbCwgImV4Y2x1ZGVMaXN0IiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25FeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhjbXBGaWVsZEVDbGFzcywgQ01QRmllbGQuY2xhc3MsICJDTVBGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDTVBGaWVsZF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENNUEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUEZpZWxkX0ZpZWxkTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJmaWVsZE5hbWUiLCBudWxsLCAxLCAxLCBDTVBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01QRmllbGRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ01QRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQ01SRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01SRmllbGRfQ21yRmllbGROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJjbXJGaWVsZE5hbWUiLCBudWxsLCAxLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCksIHRoaXMuZ2V0Q01SRmllbGRUeXBlKCksICJjbXJGaWVsZFR5cGUiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUkZpZWxkX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfVHJhbnNBdHRyaWJ1dGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKSwgInRyYW5zQXR0cmlidXRlIiwgIk5vdFN1cHBvcnRlZCIsIDEsIDEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVqYkphckVDbGFzcywgRUpCSmFyLmNsYXNzLCAiRUpCSmFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbnMoKSwgbnVsbCwgImVudGVycHJpc2VCZWFucyIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JzVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JzIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9SZWxhdGlvbnNoaXBzKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwcygpLCBudWxsLCAicmVsYXRpb25zaGlwcyIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCksIG51bGwsICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamJDbGllbnRKYXIiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMy4wIiwgMSwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9FamJKYXIoKSwgdGhpcy5nZXRFSkJKYXIoKSwgbnVsbCwgImVqYkphciIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbkVDbGFzcywgRUpCUmVsYXRpb24uY2xhc3MsICJFSkJSZWxhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZWpiUmVsYXRpb25OYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCBudWxsLCAiZWpiUmVsYXRpb25zaGlwUm9sZXMiLCBudWxsLCAyLCAyLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIkVKQlJlbGF0aW9uc2hpcFJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpLCB0aGlzLmdldE11bHRpcGxpY2l0eVR5cGUoKSwgIm11bHRpcGxpY2l0eSIsICJPbmUiLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW1wdHlUeXBlKCksIG51bGwsICJjYXNjYWRlRGVsZXRlIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpLCBudWxsLCAicmVsYXRpb25zaGlwUm9sZVNvdXJjZSIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIG51bGwsICJjbXJGaWVsZCIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbnNFQ2xhc3MsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIkVudGVycHJpc2VCZWFucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbnNfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5zX1Nlc3Npb25CZWFucygpLCB0aGlzLmdldFNlc3Npb25CZWFuKCksIG51bGwsICJzZXNzaW9uQmVhbnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW5zLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpLCB0aGlzLmdldEVudGl0eUJlYW4oKSwgbnVsbCwgImVudGl0eUJlYW5zIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkJlYW4oKSwgbnVsbCwgIm1lc3NhZ2VEcml2ZW5CZWFucyIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZW50aXR5QmVhbkVDbGFzcywgRW50aXR5QmVhbi5jbGFzcywgIkVudGl0eUJlYW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Ib21lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SG9tZSgpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUmVtb3RlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Mb2NhbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZVR5cGUoKSwgInBlcnNpc3RlbmNlVHlwZSIsICJCZWFuIiwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInByaW1LZXlDbGFzcyIsIG51bGwsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUmVlbnRyYW50KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicmVlbnRyYW50IiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKSwgdGhpcy5nZXRDbXBWZXJzaW9uVHlwZSgpLCAiY21wVmVyc2lvbiIsICIxLngiLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9BYnN0cmFjdFNjaGVtYU5hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9DbXBGaWVsZHMoKSwgdGhpcy5nZXRDTVBGaWVsZCgpLCBudWxsLCAiY21wRmllbGRzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInByaW1rZXlGaWVsZCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCksIHRoaXMuZ2V0UXVlcnkoKSwgbnVsbCwgInF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFeGNsdWRlTGlzdC5jbGFzcywgIkV4Y2x1ZGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZFR5cGUoKSwgbnVsbCwgIm1ldGhvZHMiLCBudWxsLCAxLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjbHVkZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGluaXRNZXRob2RUeXBlRUNsYXNzLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIkluaXRNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiY3JlYXRlTWV0aG9kIiwgbnVsbCwgMSwgMSwgSW5pdE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiYmVhbk1ldGhvZCIsIG51bGwsIDEsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEluaXRNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0VqYk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbnRlcmNlcHRvckNsYXNzZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvck9yZGVyKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKSwgbnVsbCwgImludGVyY2VwdG9yT3JkZXIiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2QiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MsIEludGVyY2VwdG9yT3JkZXJUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JPcmRlclR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImludGVyY2VwdG9yQ2xhc3NlcyIsIG51bGwsIDEsIC0xLCBJbnRlcmNlcHRvck9yZGVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JPcmRlclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICJJbnRlcmNlcHRvcnNUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvcnNUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JUeXBlKCksIG51bGwsICJpbnRlcmNlcHRvcnMiLCBudWxsLCAxLCAtMSwgSW50ZXJjZXB0b3JzVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbnRlcmNlcHRvckNsYXNzIiwgbnVsbCwgMSwgMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RBY3RpdmF0ZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZVBhc3NpdmF0ZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5CZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJDbGFzcygpLCB0aGlzLmdldEVqYkNsYXNzVHlwZSgpLCAiZWpiQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnaW5nVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJtZXNzYWdpbmdUeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgInRpbWVvdXRNZXRob2QiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsICJCZWFuIiwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpLCB0aGlzLmdldEFjdGl2YXRpb25Db25maWcoKSwgbnVsbCwgImFjdGl2YXRpb25Db25maWciLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCksIHRoaXMuZ2V0QXJvdW5kSW52b2tlVHlwZSgpLCBudWxsLCAiYXJvdW5kSW52b2tlcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYXJhbXNFQ2xhc3MsIE1ldGhvZFBhcmFtcy5jbGFzcywgIk1ldGhvZFBhcmFtcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbXNfTWV0aG9kUGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YVR5cGUoKSwgIm1ldGhvZFBhcmFtcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYXJhbXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICJNZXRob2RQZXJtaXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAidW5jaGVja2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXRob2RUeXBlRUNsYXNzLCBNZXRob2RUeXBlLmNsYXNzLCAiTWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpLCB0aGlzLmdldE1ldGhvZEludGVyZmFjZVR5cGUoKSwgIm1ldGhvZEludGYiLCAiSG9tZSIsIDAsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgdGhpcy5nZXRNZXRob2ROYW1lVHlwZSgpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAwLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobmFtZWRNZXRob2RUeXBlRUNsYXNzLCBOYW1lZE1ldGhvZFR5cGUuY2xhc3MsICJOYW1lZE1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBOYW1lZE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgdGhpcy5nZXRNZXRob2RQYXJhbXMoKSwgbnVsbCwgIm1ldGhvZFBhcmFtcyIsIG51bGwsIDAsIDEsIE5hbWVkTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhxdWVyeUVDbGFzcywgUXVlcnkuY2xhc3MsICJRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2QoKSwgbnVsbCwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmVzdWx0VHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKSwgInJlc3VsdFR5cGVNYXBwaW5nIiwgIkxvY2FsIiwgMCwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVqYlFsIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhxdWVyeU1ldGhvZEVDbGFzcywgUXVlcnlNZXRob2QuY2xhc3MsICJRdWVyeU1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCksIHRoaXMuZ2V0TWV0aG9kTmFtZVR5cGUoKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlNZXRob2RfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeU1ldGhvZF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmNsYXNzLCAiUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICJSZWxhdGlvbnNoaXBzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgbnVsbCwgImVqYlJlbGF0aW9ucyIsIG51bGwsIDEsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aW9uc2hpcHNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIlJlbW92ZU1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJiZWFuTWV0aG9kIiwgbnVsbCwgMSwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicmV0YWluSWZFeGNlcHRpb24iLCBudWxsLCAwLCAxLCBSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAiU2VjdXJpdHlJZGVudGl0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAidXNlQ2FsbGVySWRlbnRpdHkiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9SdW5BcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJ1bkFzKCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQmVhbkVDbGFzcywgU2Vzc2lvbkJlYW4uY2xhc3MsICJTZXNzaW9uQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEhvbWUoKSwgImhvbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fUmVtb3RlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TG9jYWxIb21lKCksICJsb2NhbEhvbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTG9jYWwoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMb2NhbCgpLCAibG9jYWwiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiYnVzaW5lc3NMb2NhbHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0J1c2luZXNzUmVtb3RlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJidXNpbmVzc1JlbW90ZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgIlN0YXRlZnVsIiwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJ0aW1lb3V0TWV0aG9kIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fSW5pdE1ldGhvZHMoKSwgdGhpcy5nZXRJbml0TWV0aG9kVHlwZSgpLCBudWxsLCAiaW5pdE1ldGhvZHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpLCB0aGlzLmdldFJlbW92ZU1ldGhvZFR5cGUoKSwgbnVsbCwgInJlbW92ZU1ldGhvZHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCAiQmVhbiIsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlQ29udGV4dFJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9Qb3N0QWN0aXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RBY3RpdmF0ZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVQYXNzaXZhdGVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlJZGVudGl0aWVzKCksIHRoaXMuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKSwgbnVsbCwgInNlY3VyaXR5SWRlbnRpdGllcyIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLmNsYXNzLCAiQ21wVmVyc2lvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoY21wVmVyc2lvblR5cGVFRW51bSwgQ21wVmVyc2lvblR5cGUuXzFYX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoY21wVmVyc2lvblR5cGVFRW51bSwgQ21wVmVyc2lvblR5cGUuXzJYX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLmNsYXNzLCAiQ01SRmllbGRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGNtckZpZWxkVHlwZUVFbnVtLCBDTVJGaWVsZFR5cGUuSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLkpBVkFfVVRJTF9TRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5jbGFzcywgIk1ldGhvZEludGVyZmFjZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLkhPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuUkVNT1RFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLmNsYXNzLCAiTXVsdGlwbGljaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXBsaWNpdHlUeXBlRUVudW0sIE11bHRpcGxpY2l0eVR5cGUuT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLk1BTllfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHBlcnNpc3RlbmNlVHlwZUVFbnVtLCBQZXJzaXN0ZW5jZVR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VUeXBlRUVudW0sIFBlcnNpc3RlbmNlVHlwZS5CRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VUeXBlRUVudW0sIFBlcnNpc3RlbmNlVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJlc3VsdFR5cGVNYXBwaW5nVHlwZUVFbnVtLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuY2xhc3MsICJSZXN1bHRUeXBlTWFwcGluZ1R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0sIFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5MT0NBTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc3VsdFR5cGVNYXBwaW5nVHlwZUVFbnVtLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuUkVNT1RFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFRlVMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVMRVNTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk1BTkRBVE9SWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoY21wVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIENtcFZlcnNpb25UeXBlLmNsYXNzLCAiQ21wVmVyc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShjbXJGaWVsZFR5cGVPYmplY3RFRGF0YVR5cGUsIENNUkZpZWxkVHlwZS5jbGFzcywgIkNNUkZpZWxkVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVqYkNsYXNzVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiQ2xhc3NUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVqYk5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFamJOYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlLCBNZXRob2RJbnRlcmZhY2VUeXBlLmNsYXNzLCAiTWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1ldGhvZE5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXRob2ROYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlLCBNdWx0aXBsaWNpdHlUeXBlLmNsYXNzLCAiTXVsdGlwbGljaXR5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZSwgUGVyc2lzdGVuY2VUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuY2xhc3MsICJSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSwgU2Vzc2lvblR5cGUuY2xhc3MsICJTZXNzaW9uVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYWN0aXZhdGlvbi1jb25maWdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2YXRpb25Db25maWdfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZhdGlvbkNvbmZpZ19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fRXhjZXB0aW9uQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImV4Y2VwdGlvbi1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX1JvbGxiYWNrKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyb2xsYmFjayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXJvdW5kSW52b2tlVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXJvdW5kLWludm9rZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJvdW5kSW52b2tlVHlwZV9DbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXNzZW1ibHktZGVzY3JpcHRvclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1wZXJtaXNzaW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY29udGFpbmVyLXRyYW5zYWN0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImludGVyY2VwdG9yLWJpbmRpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXhjbHVkZS1saXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXBwbGljYXRpb24tZXhjZXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY21wRmllbGRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNtcC1maWVsZFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDTVBGaWVsZF9GaWVsZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpZWxkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDTVBGaWVsZF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtcFZlcnNpb25UeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNtcC12ZXJzaW9uVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY21wVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNtcC12ZXJzaW9uVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiY21wLXZlcnNpb25UeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY21yRmllbGRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNtci1maWVsZFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01SRmllbGRfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNtci1maWVsZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjbXItZmllbGQtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENNUkZpZWxkX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY21yRmllbGRUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNtci1maWVsZC10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY21yRmllbGRUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXItZmllbGQtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImNtci1maWVsZC10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9NZXRob2RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfVHJhbnNBdHRyaWJ1dGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRyYW5zLWF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYkNsYXNzVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLWNsYXNzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUjZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYkphckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLWphclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnRlcnByaXNlLWJlYW5zIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0ludGVyY2VwdG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3JzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlbGF0aW9uc2hpcHMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXNzZW1ibHktZGVzY3JpcHRvciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItY2xpZW50LWphciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9NZXRhZGF0YUNvbXBsZXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGFkYXRhLWNvbXBsZXRlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgIm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICI6bWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfRWpiSmFyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItamFyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYk5hbWVUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlamItbmFtZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI05NVE9LRU4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJSZWxhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbnNoaXBSb2xlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uc2hpcC1yb2xlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0VqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtdWx0aXBsaWNpdHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjYXNjYWRlLWRlbGV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVsYXRpb25zaGlwLXJvbGUtc291cmNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY21yLWZpZWxkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVudGVycHJpc2VCZWFuc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW50ZXJwcmlzZS1iZWFuc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50ZXJwcmlzZUJlYW5zX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50ZXJwcmlzZUJlYW5zX1Nlc3Npb25CZWFucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2Vzc2lvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW50aXR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50ZXJwcmlzZUJlYW5zX01lc3NhZ2VEcml2ZW5CZWFucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kcml2ZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRlcnByaXNlQmVhbnNfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnRpdHlCZWFuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbnRpdHktYmVhblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0VqYk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fSG9tZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaG9tZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUmVtb3RlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZW1vdGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWwtaG9tZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fTG9jYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9FamJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9QcmltS2V5Q2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByaW0ta2V5LWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUmVlbnRyYW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZWVudHJhbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNtcC12ZXJzaW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fQWJzdHJhY3RTY2hlbWFOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhYnN0cmFjdC1zY2hlbWEtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fQ21wRmllbGRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjbXAtZmllbGQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByaW1rZXktZmllbGQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0VudkVudHJpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudi1lbnRyeSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1sb2NhbC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1Bvc3RDb25zdHJ1Y3RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3N0LWNvbnN0cnVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9TZWN1cml0eUlkZW50aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1pZGVudGl0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUXVlcmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicXVlcnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhjbHVkZUxpc3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImV4Y2x1ZGUtbGlzdFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4Y2x1ZGVMaXN0X01ldGhvZHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4Y2x1ZGVMaXN0X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpbml0TWV0aG9kVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaW5pdC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY3JlYXRlLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEluaXRNZXRob2RUeXBlX0JlYW5NZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImJlYW4tbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW5pdE1ldGhvZFR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1iaW5kaW5nVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0VqYk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImludGVyY2VwdG9yLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvck9yZGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1vcmRlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX01ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1vcmRlclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW50ZXJjZXB0b3JzVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3JzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvcnNUeXBlX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvcnNUeXBlX0ludGVyY2VwdG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3IiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3ItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXJvdW5kLWludm9rZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWxvY2FsLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfU2VydmljZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1lbnYtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9Qb3N0Q29uc3RydWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1jb25zdHJ1Y3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUG9zdEFjdGl2YXRlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1hY3RpdmF0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtcGFzc2l2YXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2luZ1R5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2luZy10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidGltZW91dC1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9BY3RpdmF0aW9uQ29uZmlnKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhY3RpdmF0aW9uLWNvbmZpZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFyb3VuZC1pbnZva2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJMb2NhbFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1sb2NhbC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlRW52UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1jb25zdHJ1Y3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUHJlRGVzdHJveXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByZS1kZXN0cm95IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LWlkZW50aXR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1ldGhvZC1pbnRmVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWV0aG9kLWludGZUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJtZXRob2QtaW50ZlR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2ROYW1lVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWV0aG9kLW5hbWVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGFyYW1zRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXRob2QtcGFyYW1zVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFyYW1zX01ldGhvZFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kLXBhcmFtIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFyYW1zX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWV0aG9kLXBlcm1pc3Npb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyb2xlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInVuY2hlY2tlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1ldGhvZFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVHlwZV9FamJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kLWludGYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1wYXJhbXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobXVsdGlwbGljaXR5VHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtdWx0aXBsaWNpdHlUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtdWx0aXBsaWNpdHlUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJtdWx0aXBsaWNpdHlUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChuYW1lZE1ldGhvZFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm5hbWVkLW1ldGhvZFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kLXBhcmFtcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVkTWV0aG9kVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBlcnNpc3RlbmNlVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGVyc2lzdGVuY2VUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS10eXBlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAicGVyc2lzdGVuY2UtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChxdWVyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicXVlcnlUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJxdWVyeS1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeV9SZXN1bHRUeXBlTWFwcGluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzdWx0LXR5cGUtbWFwcGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5X0VqYlFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcWwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHF1ZXJ5TWV0aG9kRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJxdWVyeS1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5TWV0aG9kX01ldGhvZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UXVlcnlNZXRob2RfTWV0aG9kUGFyYW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtcGFyYW1zIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UXVlcnlNZXRob2RfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRWpiTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlbGF0aW9uc2hpcHNUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVsYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWxhdGlvbnNoaXBzX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZW1vdmVNZXRob2RUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZW1vdmUtbWV0aG9kVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZW1vdmVNZXRob2RUeXBlX0JlYW5NZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImJlYW4tbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVtb3ZlTWV0aG9kVHlwZV9SZXRhaW5JZkV4Y2VwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmV0YWluLWlmLWV4Y2VwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzdWx0LXR5cGUtbWFwcGluZ1R5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlY3VyaXR5LWlkZW50aXR5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1VzZUNhbGxlcklkZW50aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ1c2UtY2FsbGVyLWlkZW50aXR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJ1bi1hcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2Vzc2lvbkJlYW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlc3Npb24tYmVhblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9FamJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaG9tZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1JlbW90ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVtb3RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbC1ob21lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fTG9jYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImJ1c2luZXNzLWxvY2FsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NSZW1vdGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJidXNpbmVzcy1yZW1vdGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLWVuZHBvaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0VqYkNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2Vzc2lvbi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidGltZW91dC1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fSW5pdE1ldGhvZHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluaXQtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlbW92ZS1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9UcmFuc2FjdGlvblR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhcm91bmQtaW52b2tlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbG9jYWwtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1ByZURlc3Ryb3lzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9Qb3N0QWN0aXZhdGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3N0LWFjdGl2YXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLXBhc3NpdmF0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlJZGVudGl0aWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1pZGVudGl0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2Vzc2lvblR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2Vzc2lvbi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlc3Npb24tdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInNlc3Npb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidHJhbnMtYXR0cmlidXRlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cmFucy1hdHRyaWJ1dGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJ0cmFucy1hdHRyaWJ1dGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodHJhbnNhY3Rpb25UeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uLXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uLXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJ0cmFuc2FjdGlvbi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL0VqYlBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg1NGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRlcnByaXNlIEJlYW5zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwjZ2V0U2Vzc2lvbkJlYW5zIDxlbT5TZXNzaW9uIEJlYW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwjZ2V0RW50aXR5QmVhbnMgPGVtPkVudGl0eSBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsI2dldE1lc3NhZ2VEcml2ZW5CZWFucyA8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlQmVhbnNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnRlcnByaXNlQmVhbnMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnRlcnByaXNlQmVhbnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXNzaW9uQmVhbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTlNfX1NFU1NJT05fQkVBTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudGl0eUJlYW5zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEcml2ZW5CZWFucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2Vzc2lvbkJlYW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnRpdHlCZWFucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TOgotCQkJCXJldHVybiBnZXRTZXNzaW9uQmVhbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlM6Ci0JCQkJcmV0dXJuIGdldEVudGl0eUJlYW5zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX1NFU1NJT05fQkVBTlM6Ci0JCQkJZ2V0U2Vzc2lvbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXNzaW9uQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlM6Ci0JCQkJZ2V0RW50aXR5QmVhbnMoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eUJlYW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlM6Ci0JCQkJZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUzoKLQkJCQlnZXRTZXNzaW9uQmVhbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlM6Ci0JCQkJZ2V0RW50aXR5QmVhbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUzoKLQkJCQlnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TOgotCQkJCXJldHVybiAhZ2V0U2Vzc2lvbkJlYW5zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0VOVElUWV9CRUFOUzoKLQkJCQlyZXR1cm4gIWdldEVudGl0eUJlYW5zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TOgotCQkJCXJldHVybiAhZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRW50ZXJwcmlzZUJlYW5zSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5QmVhbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5QmVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjNzkzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHkgQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRQcmltS2V5Q2xhc3MgPGVtPlByaW0gS2V5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0Q21wVmVyc2lvbiA8ZW0+Q21wIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0QWJzdHJhY3RTY2hlbWFOYW1lIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRDbXBGaWVsZHMgPGVtPkNtcCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UHJpbWtleUZpZWxkIDxlbT5Qcmlta2V5IEZpZWxkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFF1ZXJpZXMgPGVtPlF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5QmVhbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudGl0eUJlYW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBFSkJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvbWUgPSBIT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfSE9NRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsSG9tZSA9IExPQ0FMX0hPTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbCgpIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWwgPSBMT0NBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJDbGFzcygpIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJDbGFzcyA9IEVKQl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVR5cGUoKSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVHlwZSBQRVJTSVNURU5DRV9UWVBFX0VERUZBVUxUID0gUGVyc2lzdGVuY2VUeXBlLkJFQU5fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVHlwZSgpIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVR5cGUgcGVyc2lzdGVuY2VUeXBlID0gUEVSU0lTVEVOQ0VfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVyc2lzdGVuY2UgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdGVuY2VUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1LZXlDbGFzcygpIDxlbT5QcmltIEtleSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbUtleUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0tFWV9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltS2V5Q2xhc3MoKSA8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1LZXlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltS2V5Q2xhc3MgPSBQUklNX0tFWV9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlZW50cmFudCgpIDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVFTlRSQU5UX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlZW50cmFudCgpIDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWVudHJhbnQgPSBSRUVOVFJBTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlZW50cmFudCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVlbnRyYW50RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtcFZlcnNpb24oKSA8ZW0+Q21wIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtcFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ21wVmVyc2lvblR5cGUgQ01QX1ZFUlNJT05fRURFRkFVTFQgPSBDbXBWZXJzaW9uVHlwZS5fMVhfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtcFZlcnNpb24oKSA8ZW0+Q21wIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtcFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDbXBWZXJzaW9uVHlwZSBjbXBWZXJzaW9uID0gQ01QX1ZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENtcCBWZXJzaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbXBWZXJzaW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhYnN0cmFjdFNjaGVtYU5hbWUgPSBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtcEZpZWxkcygpIDxlbT5DbXAgRmllbGRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtcEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNtcEZpZWxkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWtleUZpZWxkKCkgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1rZXlGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUtFWV9GSUVMRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmlta2V5RmllbGQoKSA8ZW0+UHJpbWtleSBGaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbWtleUZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1rZXlGaWVsZCA9IFBSSU1LRVlfRklFTERfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYkxvY2FsUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVJlZnMoKSA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VVbml0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0Q29uc3RydWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVEZXN0cm95cygpIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVEZXN0cm95cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVSZWZzKCkgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eUlkZW50aXR5KCkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyaWVzKCkgPGVtPlF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHF1ZXJpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5QmVhbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVOVElUWV9CRUFOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYk5hbWUoKSB7Ci0JCXJldHVybiBlamJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYk5hbWUoU3RyaW5nIG5ld0VqYk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYk5hbWUgPSBlamJOYW1lOwotCQllamJOYW1lID0gbmV3RWpiTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX05BTUUsIG9sZEVqYk5hbWUsIGVqYk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvbWUoKSB7Ci0JCXJldHVybiBob21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIG5ld0hvbWUpIHsKLQkJU3RyaW5nIG9sZEhvbWUgPSBob21lOwotCQlob21lID0gbmV3SG9tZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSE9NRSwgb2xkSG9tZSwgaG9tZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgbmV3UmVtb3RlKSB7Ci0JCVN0cmluZyBvbGRSZW1vdGUgPSByZW1vdGU7Ci0JCXJlbW90ZSA9IG5ld1JlbW90ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVNT1RFLCBvbGRSZW1vdGUsIHJlbW90ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxIb21lKCkgewotCQlyZXR1cm4gbG9jYWxIb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgbmV3TG9jYWxIb21lKSB7Ci0JCVN0cmluZyBvbGRMb2NhbEhvbWUgPSBsb2NhbEhvbWU7Ci0JCWxvY2FsSG9tZSA9IG5ld0xvY2FsSG9tZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUxfSE9NRSwgb2xkTG9jYWxIb21lLCBsb2NhbEhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIG5ld0xvY2FsKSB7Ci0JCVN0cmluZyBvbGRMb2NhbCA9IGxvY2FsOwotCQlsb2NhbCA9IG5ld0xvY2FsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTCwgb2xkTG9jYWwsIGxvY2FsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJDbGFzcygpIHsKLQkJcmV0dXJuIGVqYkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkNsYXNzKFN0cmluZyBuZXdFamJDbGFzcykgewotCQlTdHJpbmcgb2xkRWpiQ2xhc3MgPSBlamJDbGFzczsKLQkJZWpiQ2xhc3MgPSBuZXdFamJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0NMQVNTLCBvbGRFamJDbGFzcywgZWpiQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VUeXBlIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVR5cGUoUGVyc2lzdGVuY2VUeXBlIG5ld1BlcnNpc3RlbmNlVHlwZSkgewotCQlQZXJzaXN0ZW5jZVR5cGUgb2xkUGVyc2lzdGVuY2VUeXBlID0gcGVyc2lzdGVuY2VUeXBlOwotCQlwZXJzaXN0ZW5jZVR5cGUgPSBuZXdQZXJzaXN0ZW5jZVR5cGUgPT0gbnVsbCA/IFBFUlNJU1RFTkNFX1RZUEVfRURFRkFVTFQgOiBuZXdQZXJzaXN0ZW5jZVR5cGU7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdGVuY2VUeXBlRVNldCA9IHBlcnNpc3RlbmNlVHlwZUVTZXQ7Ci0JCXBlcnNpc3RlbmNlVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9UWVBFLCBvbGRQZXJzaXN0ZW5jZVR5cGUsIHBlcnNpc3RlbmNlVHlwZSwgIW9sZFBlcnNpc3RlbmNlVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJUGVyc2lzdGVuY2VUeXBlIG9sZFBlcnNpc3RlbmNlVHlwZSA9IHBlcnNpc3RlbmNlVHlwZTsKLQkJYm9vbGVhbiBvbGRQZXJzaXN0ZW5jZVR5cGVFU2V0ID0gcGVyc2lzdGVuY2VUeXBlRVNldDsKLQkJcGVyc2lzdGVuY2VUeXBlID0gUEVSU0lTVEVOQ0VfVFlQRV9FREVGQVVMVDsKLQkJcGVyc2lzdGVuY2VUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEUsIG9sZFBlcnNpc3RlbmNlVHlwZSwgUEVSU0lTVEVOQ0VfVFlQRV9FREVGQVVMVCwgb2xkUGVyc2lzdGVuY2VUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1LZXlDbGFzcygpIHsKLQkJcmV0dXJuIHByaW1LZXlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmltS2V5Q2xhc3MoU3RyaW5nIG5ld1ByaW1LZXlDbGFzcykgewotCQlTdHJpbmcgb2xkUHJpbUtleUNsYXNzID0gcHJpbUtleUNsYXNzOwotCQlwcmltS2V5Q2xhc3MgPSBuZXdQcmltS2V5Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTLCBvbGRQcmltS2V5Q2xhc3MsIHByaW1LZXlDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVlbnRyYW50KCkgewotCQlyZXR1cm4gcmVlbnRyYW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZW50cmFudChib29sZWFuIG5ld1JlZW50cmFudCkgewotCQlib29sZWFuIG9sZFJlZW50cmFudCA9IHJlZW50cmFudDsKLQkJcmVlbnRyYW50ID0gbmV3UmVlbnRyYW50OwotCQlib29sZWFuIG9sZFJlZW50cmFudEVTZXQgPSByZWVudHJhbnRFU2V0OwotCQlyZWVudHJhbnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVFTlRSQU5ULCBvbGRSZWVudHJhbnQsIHJlZW50cmFudCwgIW9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlZW50cmFudCgpIHsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnQgPSByZWVudHJhbnQ7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50RVNldCA9IHJlZW50cmFudEVTZXQ7Ci0JCXJlZW50cmFudCA9IFJFRU5UUkFOVF9FREVGQVVMVDsKLQkJcmVlbnRyYW50RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVCwgb2xkUmVlbnRyYW50LCBSRUVOVFJBTlRfRURFRkFVTFQsIG9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlZW50cmFudCgpIHsKLQkJcmV0dXJuIHJlZW50cmFudEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENtcFZlcnNpb25UeXBlIGdldENtcFZlcnNpb24oKSB7Ci0JCXJldHVybiBjbXBWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENtcFZlcnNpb24oQ21wVmVyc2lvblR5cGUgbmV3Q21wVmVyc2lvbikgewotCQlDbXBWZXJzaW9uVHlwZSBvbGRDbXBWZXJzaW9uID0gY21wVmVyc2lvbjsKLQkJY21wVmVyc2lvbiA9IG5ld0NtcFZlcnNpb24gPT0gbnVsbCA/IENNUF9WRVJTSU9OX0VERUZBVUxUIDogbmV3Q21wVmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRDbXBWZXJzaW9uRVNldCA9IGNtcFZlcnNpb25FU2V0OwotCQljbXBWZXJzaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OLCBvbGRDbXBWZXJzaW9uLCBjbXBWZXJzaW9uLCAhb2xkQ21wVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENtcFZlcnNpb24oKSB7Ci0JCUNtcFZlcnNpb25UeXBlIG9sZENtcFZlcnNpb24gPSBjbXBWZXJzaW9uOwotCQlib29sZWFuIG9sZENtcFZlcnNpb25FU2V0ID0gY21wVmVyc2lvbkVTZXQ7Ci0JCWNtcFZlcnNpb24gPSBDTVBfVkVSU0lPTl9FREVGQVVMVDsKLQkJY21wVmVyc2lvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfVkVSU0lPTiwgb2xkQ21wVmVyc2lvbiwgQ01QX1ZFUlNJT05fRURFRkFVTFQsIG9sZENtcFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDbXBWZXJzaW9uKCkgewotCQlyZXR1cm4gY21wVmVyc2lvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0JCXJldHVybiBhYnN0cmFjdFNjaGVtYU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzdHJhY3RTY2hlbWFOYW1lKFN0cmluZyBuZXdBYnN0cmFjdFNjaGVtYU5hbWUpIHsKLQkJU3RyaW5nIG9sZEFic3RyYWN0U2NoZW1hTmFtZSA9IGFic3RyYWN0U2NoZW1hTmFtZTsKLQkJYWJzdHJhY3RTY2hlbWFOYW1lID0gbmV3QWJzdHJhY3RTY2hlbWFOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRSwgb2xkQWJzdHJhY3RTY2hlbWFOYW1lLCBhYnN0cmFjdFNjaGVtYU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbXBGaWVsZHMoKSB7Ci0JCWlmIChjbXBGaWVsZHMgPT0gbnVsbCkgewotCQkJY21wRmllbGRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENNUEZpZWxkLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfRklFTERTKTsKLQkJfQotCQlyZXR1cm4gY21wRmllbGRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWtleUZpZWxkKCkgewotCQlyZXR1cm4gcHJpbWtleUZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1rZXlGaWVsZChTdHJpbmcgbmV3UHJpbWtleUZpZWxkKSB7Ci0JCVN0cmluZyBvbGRQcmlta2V5RmllbGQgPSBwcmlta2V5RmllbGQ7Ci0JCXByaW1rZXlGaWVsZCA9IG5ld1ByaW1rZXlGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRCwgb2xkUHJpbWtleUZpZWxkLCBwcmlta2V5RmllbGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnZFbnRyaWVzKCkgewotCQlpZiAoZW52RW50cmllcyA9PSBudWxsKSB7Ci0JCQllbnZFbnRyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FTlZfRU5UUklFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudkVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKLQkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7Ci0JCWlmIChlamJMb2NhbFJlZnMgPT0gbnVsbCkgewotCQkJZWpiTG9jYWxSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYkxvY2FsUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYkxvY2FsUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKSB7Ci0JCWlmIChwb3N0Q29uc3RydWN0cyA9PSBudWxsKSB7Ci0JCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJfQotCQlyZXR1cm4gcG9zdENvbnN0cnVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7Ci0JCWlmIChwcmVEZXN0cm95cyA9PSBudWxsKSB7Ci0JCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTKTsKLQkJfQotCQlyZXR1cm4gcHJlRGVzdHJveXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUgbmV3U2VjdXJpdHlJZGVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZWN1cml0eUlkZW50aXR5VHlwZSBvbGRTZWN1cml0eUlkZW50aXR5ID0gc2VjdXJpdHlJZGVudGl0eTsKLQkJc2VjdXJpdHlJZGVudGl0eSA9IG5ld1NlY3VyaXR5SWRlbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBvbGRTZWN1cml0eUlkZW50aXR5LCBuZXdTZWN1cml0eUlkZW50aXR5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlIG5ld1NlY3VyaXR5SWRlbnRpdHkpIHsKLQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdHkgIT0gc2VjdXJpdHlJZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjdXJpdHlJZGVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobmV3U2VjdXJpdHlJZGVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbmV3U2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFF1ZXJpZXMoKSB7Ci0JCWlmIChxdWVyaWVzID09IG51bGwpIHsKLQkJCXF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUXVlcnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENtcEZpZWxkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9OQU1FOgotCQkJCXJldHVybiBnZXRFamJOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0hPTUU6Ci0JCQkJcmV0dXJuIGdldEhvbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVNT1RFOgotCQkJCXJldHVybiBnZXRSZW1vdGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0xPQ0FMOgotCQkJCXJldHVybiBnZXRMb2NhbCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbUtleUNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVDoKLQkJCQlyZXR1cm4gaXNSZWVudHJhbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OOgotCQkJCXJldHVybiBnZXRDbXBWZXJzaW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXJldHVybiBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZ2V0Q21wRmllbGRzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQ6Ci0JCQkJcmV0dXJuIGdldFByaW1rZXlGaWVsZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZ2V0RW52RW50cmllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTOgotCQkJCXJldHVybiBnZXRRdWVyaWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTkFNRToKLQkJCQlzZXRFamJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0hPTUU6Ci0JCQkJc2V0SG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0xPQ0FMOgotCQkJCXNldExvY2FsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRToKLQkJCQlzZXRQZXJzaXN0ZW5jZVR5cGUoKFBlcnNpc3RlbmNlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUzoKLQkJCQlzZXRQcmltS2V5Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQ6Ci0JCQkJc2V0UmVlbnRyYW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX1ZFUlNJT046Ci0JCQkJc2V0Q21wVmVyc2lvbigoQ21wVmVyc2lvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJc2V0QWJzdHJhY3RTY2hlbWFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUzoKLQkJCQlnZXRDbXBGaWVsZHMoKS5jbGVhcigpOwotCQkJCWdldENtcEZpZWxkcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNS0VZX0ZJRUxEOgotCQkJCXNldFByaW1rZXlGaWVsZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1FVRVJJRVM6Ci0JCQkJZ2V0UXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoRUpCX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19IT01FOgotCQkJCXNldEhvbWUoSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKFJFTU9URV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZShMT0NBTF9IT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0xPQ0FMOgotCQkJCXNldExvY2FsKExPQ0FMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcyhFSkJfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRToKLQkJCQl1bnNldFBlcnNpc3RlbmNlVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTV9LRVlfQ0xBU1M6Ci0JCQkJc2V0UHJpbUtleUNsYXNzKFBSSU1fS0VZX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVDoKLQkJCQl1bnNldFJlZW50cmFudCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX1ZFUlNJT046Ci0JCQkJdW5zZXRDbXBWZXJzaW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKLQkJCQlzZXRBYnN0cmFjdFNjaGVtYU5hbWUoQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUzoKLQkJCQlnZXRDbXBGaWVsZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRDoKLQkJCQlzZXRQcmlta2V5RmllbGQoUFJJTUtFWV9GSUVMRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5VHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1FVRVJJRVM6Ci0JCQkJZ2V0UXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gRUpCX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYk5hbWUgIT0gbnVsbCA6ICFFSkJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSE9NRToKLQkJCQlyZXR1cm4gSE9NRV9FREVGQVVMVCA9PSBudWxsID8gaG9tZSAhPSBudWxsIDogIUhPTUVfRURFRkFVTFQuZXF1YWxzKGhvbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRU1PVEU6Ci0JCQkJcmV0dXJuIFJFTU9URV9FREVGQVVMVCA9PSBudWxsID8gcmVtb3RlICE9IG51bGwgOiAhUkVNT1RFX0VERUZBVUxULmVxdWFscyhyZW1vdGUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTF9IT01FOgotCQkJCXJldHVybiBMT0NBTF9IT01FX0VERUZBVUxUID09IG51bGwgPyBsb2NhbEhvbWUgIT0gbnVsbCA6ICFMT0NBTF9IT01FX0VERUZBVUxULmVxdWFscyhsb2NhbEhvbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTDoKLQkJCQlyZXR1cm4gTE9DQUxfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsICE9IG51bGwgOiAhTE9DQUxfRURFRkFVTFQuZXF1YWxzKGxvY2FsKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBFSkJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkNsYXNzICE9IG51bGwgOiAhRUpCX0NMQVNTX0VERUZBVUxULmVxdWFscyhlamJDbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTOgotCQkJCXJldHVybiBQUklNX0tFWV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcHJpbUtleUNsYXNzICE9IG51bGwgOiAhUFJJTV9LRVlfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHByaW1LZXlDbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVDoKLQkJCQlyZXR1cm4gaXNTZXRSZWVudHJhbnQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0Q21wVmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKLQkJCQlyZXR1cm4gQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGFic3RyYWN0U2NoZW1hTmFtZSAhPSBudWxsIDogIUFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxULmVxdWFscyhhYnN0cmFjdFNjaGVtYU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfRklFTERTOgotCQkJCXJldHVybiBjbXBGaWVsZHMgIT0gbnVsbCAmJiAhY21wRmllbGRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRDoKLQkJCQlyZXR1cm4gUFJJTUtFWV9GSUVMRF9FREVGQVVMVCA9PSBudWxsID8gcHJpbWtleUZpZWxkICE9IG51bGwgOiAhUFJJTUtFWV9GSUVMRF9FREVGQVVMVC5lcXVhbHMocHJpbWtleUZpZWxkKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGVudkVudHJpZXMgIT0gbnVsbCAmJiAhZW52RW50cmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZVJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZUNvbnRleHRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzICE9IG51bGwgJiYgIXBvc3RDb25zdHJ1Y3RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBwcmVEZXN0cm95cyAhPSBudWxsICYmICFwcmVEZXN0cm95cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUVVFUklFUzoKLQkJCQlyZXR1cm4gcXVlcmllcyAhPSBudWxsICYmICFxdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9tZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChob21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1vdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVtb3RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbEhvbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYWxIb21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcnNpc3RlbmNlVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBlcnNpc3RlbmNlVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQocGVyc2lzdGVuY2VUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmltS2V5Q2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJpbUtleUNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWVudHJhbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZWVudHJhbnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlZW50cmFudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgY21wVmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNtcFZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKGNtcFZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGFic3RyYWN0U2NoZW1hTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhYnN0cmFjdFNjaGVtYU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByaW1rZXlGaWVsZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmlta2V5RmllbGQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRW50aXR5QmVhbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkYmEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkV4Y2x1ZGVMaXN0SW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeGNsdWRlTGlzdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kcygpIDxlbT5NZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4Y2x1ZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRVhDTFVERV9MSVNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gbWV0aG9kcyAhPSBudWxsICYmICFtZXRob2RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeGNsdWRlTGlzdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0luaXRNZXRob2RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Jbml0TWV0aG9kVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MGIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0luaXRNZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IE1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbCNnZXRDcmVhdGVNZXRob2QgPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW5pdE1ldGhvZFR5cGVJbXBsI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0TWV0aG9kVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluaXRNZXRob2RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGVNZXRob2QoKSA8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGNyZWF0ZU1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuTWV0aG9kKCkgPGVtPkJlYW4gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCZWFuTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGJlYW5NZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5pdE1ldGhvZFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5JTklUX01FVEhPRF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0Q3JlYXRlTWV0aG9kKCkgewotCQlyZXR1cm4gY3JlYXRlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENyZWF0ZU1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3Q3JlYXRlTWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU5hbWVkTWV0aG9kVHlwZSBvbGRDcmVhdGVNZXRob2QgPSBjcmVhdGVNZXRob2Q7Ci0JCWNyZWF0ZU1ldGhvZCA9IG5ld0NyZWF0ZU1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9ELCBvbGRDcmVhdGVNZXRob2QsIG5ld0NyZWF0ZU1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdDcmVhdGVNZXRob2QpIHsKLQkJaWYgKG5ld0NyZWF0ZU1ldGhvZCAhPSBjcmVhdGVNZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNyZWF0ZU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljcmVhdGVNZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NyZWF0ZU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDcmVhdGVNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q3JlYXRlTWV0aG9kKG5ld0NyZWF0ZU1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0QsIG5ld0NyZWF0ZU1ldGhvZCwgbmV3Q3JlYXRlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkTWV0aG9kVHlwZSBnZXRCZWFuTWV0aG9kKCkgewotCQlyZXR1cm4gYmVhbk1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdCZWFuTWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU5hbWVkTWV0aG9kVHlwZSBvbGRCZWFuTWV0aG9kID0gYmVhbk1ldGhvZDsKLQkJYmVhbk1ldGhvZCA9IG5ld0JlYW5NZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG9sZEJlYW5NZXRob2QsIG5ld0JlYW5NZXRob2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJlYW5NZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld0JlYW5NZXRob2QpIHsKLQkJaWYgKG5ld0JlYW5NZXRob2QgIT0gYmVhbk1ldGhvZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYmVhbk1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliZWFuTWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmVhbk1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCZWFuTWV0aG9kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuTWV0aG9kKG5ld0JlYW5NZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgbmV3QmVhbk1ldGhvZCwgbmV3QmVhbk1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgotCQkJCXJldHVybiBiYXNpY1NldENyZWF0ZU1ldGhvZChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCZWFuTWV0aG9kKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRlTWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEJlYW5NZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0Q6Ci0JCQkJc2V0Q3JlYXRlTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlzZXRCZWFuTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0Q6Ci0JCQkJc2V0Q3JlYXRlTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgotCQkJCXNldEJlYW5NZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgotCQkJCXJldHVybiBiZWFuTWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luaXRNZXRob2RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiMDBlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsI2dldEludGVyY2VwdG9yQ2xhc3NlcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXRJbnRlcmNlcHRvck9yZGVyIDxlbT5JbnRlcmNlcHRvciBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTmFtZSA9IEVKQl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJjZXB0b3JDbGFzc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yT3JkZXIoKSA8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmNlcHRvck9yZGVyVHlwZSBpbnRlcmNlcHRvck9yZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzID0gRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9ycyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSA8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzID0gRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2QoKSA8ZW0+TWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgbWV0aG9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYk5hbWUoKSB7Ci0JCXJldHVybiBlamJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYk5hbWUoU3RyaW5nIG5ld0VqYk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYk5hbWUgPSBlamJOYW1lOwotCQllamJOYW1lID0gbmV3RWpiTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkgewotCQlpZiAoaW50ZXJjZXB0b3JDbGFzc2VzID09IG51bGwpIHsKLQkJCWludGVyY2VwdG9yQ2xhc3NlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJjZXB0b3JDbGFzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlcmNlcHRvck9yZGVyVHlwZSBnZXRJbnRlcmNlcHRvck9yZGVyKCkgewotCQlyZXR1cm4gaW50ZXJjZXB0b3JPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnRlcmNlcHRvck9yZGVyKEludGVyY2VwdG9yT3JkZXJUeXBlIG5ld0ludGVyY2VwdG9yT3JkZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSW50ZXJjZXB0b3JPcmRlclR5cGUgb2xkSW50ZXJjZXB0b3JPcmRlciA9IGludGVyY2VwdG9yT3JkZXI7Ci0JCWludGVyY2VwdG9yT3JkZXIgPSBuZXdJbnRlcmNlcHRvck9yZGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIsIG9sZEludGVyY2VwdG9yT3JkZXIsIG5ld0ludGVyY2VwdG9yT3JkZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyY2VwdG9yT3JkZXIoSW50ZXJjZXB0b3JPcmRlclR5cGUgbmV3SW50ZXJjZXB0b3JPcmRlcikgewotCQlpZiAobmV3SW50ZXJjZXB0b3JPcmRlciAhPSBpbnRlcmNlcHRvck9yZGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnRlcmNlcHRvck9yZGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWludGVyY2VwdG9yT3JkZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ludGVyY2VwdG9yT3JkZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW50ZXJjZXB0b3JPcmRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnRlcmNlcHRvck9yZGVyKG5ld0ludGVyY2VwdG9yT3JkZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSLCBuZXdJbnRlcmNlcHRvck9yZGVyLCBuZXdJbnRlcmNlcHRvck9yZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKGJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMpIHsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA9IGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzOwotCQlleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA9IG5ld0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzOwotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldCA9IGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldDsKLQkJZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlMsIG9sZEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzLCBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycywgIW9sZEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSB7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMgPSBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yczsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQgPSBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQ7Ci0JCWV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzID0gRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SU19FREVGQVVMVDsKLQkJZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlMsIG9sZEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzLCBFWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTX0VERUZBVUxULCBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyhib29sZWFuIG5ld0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycykgewotCQlib29sZWFuIG9sZEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA9IGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yczsKLQkJZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzID0gbmV3RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzOwotCQlib29sZWFuIG9sZEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yc0VTZXQgPSBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0OwotCQlleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTLCBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMsIGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycywgIW9sZEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpIHsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPSBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnM7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldCA9IGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yc0VTZXQ7Ci0JCWV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA9IEVYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTX0VERUZBVUxUOwotCQlleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTLCBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMsIEVYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTX0VERUZBVUxULCBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSB7Ci0JCXJldHVybiBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0TWV0aG9kKCkgewotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3TWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU5hbWVkTWV0aG9kVHlwZSBvbGRNZXRob2QgPSBtZXRob2Q7Ci0JCW1ldGhvZCA9IG5ld01ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCwgb2xkTWV0aG9kLCBuZXdNZXRob2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3TWV0aG9kKSB7Ci0JCWlmIChuZXdNZXRob2QgIT0gbWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWV0aG9kKG5ld01ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9ELCBuZXdNZXRob2QsIG5ld01ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSOgotCQkJCXJldHVybiBiYXNpY1NldEludGVyY2VwdG9yT3JkZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYk5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldEludGVyY2VwdG9yQ2xhc3NlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVI6Ci0JCQkJcmV0dXJuIGdldEludGVyY2VwdG9yT3JkZXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKLQkJCQlzZXRJbnRlcmNlcHRvck9yZGVyKChJbnRlcmNlcHRvck9yZGVyVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUzoKLQkJCQlzZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZShFSkJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKLQkJCQlnZXRJbnRlcmNlcHRvckNsYXNzZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSOgotCQkJCXNldEludGVyY2VwdG9yT3JkZXIoKEludGVyY2VwdG9yT3JkZXJUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlM6Ci0JCQkJdW5zZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTOgotCQkJCXVuc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gRUpCX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYk5hbWUgIT0gbnVsbCA6ICFFSkJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCXJldHVybiBpbnRlcmNlcHRvckNsYXNzZXMgIT0gbnVsbCAmJiAhaW50ZXJjZXB0b3JDbGFzc2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSOgotCQkJCXJldHVybiBpbnRlcmNlcHRvck9yZGVyICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBpc1NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gaXNTZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRDoKLQkJCQlyZXR1cm4gbWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW50ZXJjZXB0b3JDbGFzc2VzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGludGVyY2VwdG9yQ2xhc3Nlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQpIHJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yczogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yc0VTZXQpIHJlc3VsdC5hcHBlbmQoZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0ludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDA5YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yT3JkZXJUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsI2dldEludGVyY2VwdG9yQ2xhc3NlcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbnRlcmNlcHRvck9yZGVyVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJjZXB0b3JDbGFzc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuSU5URVJDRVBUT1JfT1JERVJfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKSB7Ci0JCWlmIChpbnRlcmNlcHRvckNsYXNzZXMgPT0gbnVsbCkgewotCQkJaW50ZXJjZXB0b3JDbGFzc2VzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJjZXB0b3JDbGFzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVM6Ci0JCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmNlcHRvckNsYXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVM6Ci0JCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGludGVyY2VwdG9yQ2xhc3NlcyAhPSBudWxsICYmICFpbnRlcmNlcHRvckNsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW50ZXJjZXB0b3JDbGFzc2VzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGludGVyY2VwdG9yQ2xhc3Nlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFmNGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvciBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRJbnRlcmNlcHRvckNsYXNzIDxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyY2VwdG9yVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEludGVyY2VwdG9yVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yQ2xhc3MoKSA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSQ0VQVE9SX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yQ2xhc3MoKSA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJjZXB0b3JDbGFzcyA9IElOVEVSQ0VQVE9SX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJvdW5kSW52b2tlcygpIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcm91bmRJbnZva2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJvdW5kSW52b2tlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYkxvY2FsUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVJlZnMoKSA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VVbml0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0Q29uc3RydWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVEZXN0cm95cygpIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVEZXN0cm95cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0QWN0aXZhdGVzKCkgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RBY3RpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0QWN0aXZhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVBhc3NpdmF0ZXMoKSA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlUGFzc2l2YXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZVBhc3NpdmF0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZXJjZXB0b3JUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuSU5URVJDRVBUT1JfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVyY2VwdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBpbnRlcmNlcHRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyY2VwdG9yQ2xhc3MoU3RyaW5nIG5ld0ludGVyY2VwdG9yQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEludGVyY2VwdG9yQ2xhc3MgPSBpbnRlcmNlcHRvckNsYXNzOwotCQlpbnRlcmNlcHRvckNsYXNzID0gbmV3SW50ZXJjZXB0b3JDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUywgb2xkSW50ZXJjZXB0b3JDbGFzcywgaW50ZXJjZXB0b3JDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFyb3VuZEludm9rZXMoKSB7Ci0JCWlmIChhcm91bmRJbnZva2VzID09IG51bGwpIHsKLQkJCWFyb3VuZEludm9rZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXJvdW5kSW52b2tlVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUyk7Ci0JCX0KLQkJcmV0dXJuIGFyb3VuZEludm9rZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgewotCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudkVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKLQkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMpOwotCQl9Ci0JCXJldHVybiBlamJSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYkxvY2FsUmVmcygpIHsKLQkJaWYgKGVqYkxvY2FsUmVmcyA9PSBudWxsKSB7Ci0JCQllamJMb2NhbFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMpOwotCQl9Ci0JCXJldHVybiBlamJMb2NhbFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZUVudlJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgewotCQlpZiAocG9zdENvbnN0cnVjdHMgPT0gbnVsbCkgewotCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJfQotCQlyZXR1cm4gcG9zdENvbnN0cnVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7Ci0JCWlmIChwcmVEZXN0cm95cyA9PSBudWxsKSB7Ci0JCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVMpOwotCQl9Ci0JCXJldHVybiBwcmVEZXN0cm95czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0QWN0aXZhdGVzKCkgewotCQlpZiAocG9zdEFjdGl2YXRlcyA9PSBudWxsKSB7Ci0JCQlwb3N0QWN0aXZhdGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTKTsKLQkJfQotCQlyZXR1cm4gcG9zdEFjdGl2YXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVQYXNzaXZhdGVzKCkgewotCQlpZiAocHJlUGFzc2l2YXRlcyA9PSBudWxsKSB7Ci0JCQlwcmVQYXNzaXZhdGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTKTsKLQkJfQotCQlyZXR1cm4gcHJlUGFzc2l2YXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdEFjdGl2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVQYXNzaXZhdGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEludGVyY2VwdG9yQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gZ2V0QXJvdW5kSW52b2tlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgotCQkJCXJldHVybiBnZXRQb3N0QWN0aXZhdGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJcmV0dXJuIGdldFByZVBhc3NpdmF0ZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTOgotCQkJCXNldEludGVyY2VwdG9yQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCWdldEFyb3VuZEludm9rZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVM6Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTOgotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5jbGVhcigpOwotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUzoKLQkJCQlzZXRJbnRlcmNlcHRvckNsYXNzKElOVEVSQ0VQVE9SX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJZ2V0QXJvdW5kSW52b2tlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUzoKLQkJCQlnZXRQb3N0QWN0aXZhdGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTOgotCQkJCXJldHVybiBJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW50ZXJjZXB0b3JDbGFzcyAhPSBudWxsIDogIUlOVEVSQ0VQVE9SX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnRlcmNlcHRvckNsYXNzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gYXJvdW5kSW52b2tlcyAhPSBudWxsICYmICFhcm91bmRJbnZva2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZW52RW50cmllcyAhPSBudWxsICYmICFlbnZFbnRyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VDb250ZXh0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gcG9zdENvbnN0cnVjdHMgIT0gbnVsbCAmJiAhcG9zdENvbnN0cnVjdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gcHJlRGVzdHJveXMgIT0gbnVsbCAmJiAhcHJlRGVzdHJveXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgotCQkJCXJldHVybiBwb3N0QWN0aXZhdGVzICE9IG51bGwgJiYgIXBvc3RBY3RpdmF0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTOgotCQkJCXJldHVybiBwcmVQYXNzaXZhdGVzICE9IG51bGwgJiYgIXByZVBhc3NpdmF0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW50ZXJjZXB0b3JDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbnRlcmNlcHRvckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0ludGVyY2VwdG9yVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yc1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yc1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjUxOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvcnNUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyY2VwdG9ycyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyY2VwdG9yc1R5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbnRlcmNlcHRvcnNUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvcnMoKSA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyY2VwdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmNlcHRvcnNUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuSU5URVJDRVBUT1JTX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVyY2VwdG9ycygpIHsKLQkJaWYgKGludGVyY2VwdG9ycyA9PSBudWxsKSB7Ci0JCQlpbnRlcmNlcHRvcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMpOwotCQl9Ci0JCXJldHVybiBpbnRlcmNlcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJjZXB0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGdldEludGVyY2VwdG9ycygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgotCQkJCWdldEludGVyY2VwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgotCQkJCWdldEludGVyY2VwdG9ycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gaW50ZXJjZXB0b3JzICE9IG51bGwgJiYgIWludGVyY2VwdG9ycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbnRlcmNlcHRvcnNUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkJlYW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5CZWFuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlkNjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEcml2ZW4gQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTWVzc2FnZURyaXZlbkJlYW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBFSkJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJDbGFzcygpIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJDbGFzcyA9IEVKQl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdpbmdUeXBlKCkgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdJTkdfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdpbmdUeXBlKCkgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2luZ1R5cGUgPSBNRVNTQUdJTkdfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVvdXRNZXRob2QoKSA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVvdXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgdGltZW91dE1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25MaW5rID0gTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWcgYWN0aXZhdGlvbkNvbmZpZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcm91bmRJbnZva2VzKCkgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyb3VuZEludm9rZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcm91bmRJbnZva2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJpZXMoKSA8ZW0+RW52IEVudHJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudkVudHJpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmcygpIDxlbT5FamIgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMb2NhbFJlZnMoKSA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiTG9jYWxSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlUmVmcygpIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RDb25zdHJ1Y3RzKCkgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZURlc3Ryb3lzKCkgPGVtPlByZSBEZXN0cm95czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVEZXN0cm95cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZURlc3Ryb3lzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5SWRlbnRpdHkoKSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5VHlwZSBzZWN1cml0eUlkZW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEcml2ZW5CZWFuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9EUklWRU5fQkVBTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotCQlyZXR1cm4gZWpiTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJOYW1lKFN0cmluZyBuZXdFamJOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJOYW1lID0gZWpiTmFtZTsKLQkJZWpiTmFtZSA9IG5ld0VqYk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUUsIG9sZEVqYk5hbWUsIGVqYk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xhc3MoKSB7Ci0JCXJldHVybiBlamJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhTdHJpbmcgbmV3RWpiQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTLCBvbGRFamJDbGFzcywgZWpiQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2luZ1R5cGUoKSB7Ci0JCXJldHVybiBtZXNzYWdpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2luZ1R5cGUoU3RyaW5nIG5ld01lc3NhZ2luZ1R5cGUpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2luZ1R5cGUgPSBtZXNzYWdpbmdUeXBlOwotCQltZXNzYWdpbmdUeXBlID0gbmV3TWVzc2FnaW5nVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRSwgb2xkTWVzc2FnaW5nVHlwZSwgbWVzc2FnaW5nVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0VGltZW91dE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRpbWVvdXRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3VGltZW91dE1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOYW1lZE1ldGhvZFR5cGUgb2xkVGltZW91dE1ldGhvZCA9IHRpbWVvdXRNZXRob2Q7Ci0JCXRpbWVvdXRNZXRob2QgPSBuZXdUaW1lb3V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBvbGRUaW1lb3V0TWV0aG9kLCBuZXdUaW1lb3V0TWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdUaW1lb3V0TWV0aG9kKSB7Ci0JCWlmIChuZXdUaW1lb3V0TWV0aG9kICE9IHRpbWVvdXRNZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVvdXRNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZW91dE1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RpbWVvdXRNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGltZW91dE1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGltZW91dE1ldGhvZChuZXdUaW1lb3V0TWV0aG9kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG5ld1RpbWVvdXRNZXRob2QsIG5ld1RpbWVvdXRNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlIG5ld1RyYW5zYWN0aW9uVHlwZSkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQl0cmFuc2FjdGlvblR5cGUgPSBuZXdUcmFuc2FjdGlvblR5cGUgPT0gbnVsbCA/IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdUcmFuc2FjdGlvblR5cGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25UeXBlRVNldCA9IHRyYW5zYWN0aW9uVHlwZUVTZXQ7Ci0JCXRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlLCAhb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQsIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKFN0cmluZyBuZXdNZXNzYWdlRGVzdGluYXRpb25UeXBlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlRGVzdGluYXRpb25UeXBlID0gbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFLCBvbGRNZXNzYWdlRGVzdGluYXRpb25UeXBlLCBtZXNzYWdlRGVzdGluYXRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZyBuZXdNZXNzYWdlRGVzdGluYXRpb25MaW5rKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlRGVzdGluYXRpb25MaW5rID0gbWVzc2FnZURlc3RpbmF0aW9uTGluazsKLQkJbWVzc2FnZURlc3RpbmF0aW9uTGluayA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LLCBvbGRNZXNzYWdlRGVzdGluYXRpb25MaW5rLCBtZXNzYWdlRGVzdGluYXRpb25MaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgZ2V0QWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG5ld0FjdGl2YXRpb25Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZyBvbGRBY3RpdmF0aW9uQ29uZmlnID0gYWN0aXZhdGlvbkNvbmZpZzsKLQkJYWN0aXZhdGlvbkNvbmZpZyA9IG5ld0FjdGl2YXRpb25Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcsIG9sZEFjdGl2YXRpb25Db25maWcsIG5ld0FjdGl2YXRpb25Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBuZXdBY3RpdmF0aW9uQ29uZmlnKSB7Ci0JCWlmIChuZXdBY3RpdmF0aW9uQ29uZmlnICE9IGFjdGl2YXRpb25Db25maWcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjdGl2YXRpb25Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWN0aXZhdGlvbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjdGl2YXRpb25Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWN0aXZhdGlvbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhuZXdBY3RpdmF0aW9uQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcsIG5ld0FjdGl2YXRpb25Db25maWcsIG5ld0FjdGl2YXRpb25Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcm91bmRJbnZva2VzKCkgewotCQlpZiAoYXJvdW5kSW52b2tlcyA9PSBudWxsKSB7Ci0JCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOwotCQl9Ci0JCXJldHVybiBhcm91bmRJbnZva2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7Ci0JCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVMpOwotCQl9Ci0JCXJldHVybiBlbnZFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7Ci0JCWlmIChlamJMb2NhbFJlZnMgPT0gbnVsbCkgewotCQkJZWpiTG9jYWxSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYkxvY2FsUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiTG9jYWxSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRW52UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKLQkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgewotCQlpZiAocHJlRGVzdHJveXMgPT0gbnVsbCkgewotCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTKTsKLQkJfQotCQlyZXR1cm4gcHJlRGVzdHJveXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUgbmV3U2VjdXJpdHlJZGVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZWN1cml0eUlkZW50aXR5VHlwZSBvbGRTZWN1cml0eUlkZW50aXR5ID0gc2VjdXJpdHlJZGVudGl0eTsKLQkJc2VjdXJpdHlJZGVudGl0eSA9IG5ld1NlY3VyaXR5SWRlbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG9sZFNlY3VyaXR5SWRlbnRpdHksIG5ld1NlY3VyaXR5SWRlbnRpdHkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUgbmV3U2VjdXJpdHlJZGVudGl0eSkgewotCQlpZiAobmV3U2VjdXJpdHlJZGVudGl0eSAhPSBzZWN1cml0eUlkZW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZWN1cml0eUlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlY3VyaXR5SWRlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY3VyaXR5SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobmV3U2VjdXJpdHlJZGVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBuZXdTZWN1cml0eUlkZW50aXR5LCBuZXdTZWN1cml0eUlkZW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGltZW91dE1ldGhvZChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY3RpdmF0aW9uQ29uZmlnKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXJvdW5kSW52b2tlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYk5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnaW5nVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiBnZXRUaW1lb3V0TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldEFjdGl2YXRpb25Db25maWcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gZ2V0QXJvdW5kSW52b2tlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBnZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlzZXRNZXNzYWdpbmdUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRDoKLQkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnKChBY3RpdmF0aW9uQ29uZmlnKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJZ2V0QXJvdW5kSW52b2tlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJvdW5kSW52b2tlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTkFNRToKLQkJCQlzZXRFamJOYW1lKEVKQl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcyhFSkJfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlzZXRNZXNzYWdpbmdUeXBlKE1FU1NBR0lOR19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXNldEFjdGl2YXRpb25Db25maWcoKEFjdGl2YXRpb25Db25maWcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJOYW1lICE9IG51bGwgOiAhRUpCX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYk5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEVKQl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZWpiQ2xhc3MgIT0gbnVsbCA6ICFFSkJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGVqYkNsYXNzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlyZXR1cm4gTUVTU0FHSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2luZ1R5cGUgIT0gbnVsbCA6ICFNRVNTQUdJTkdfVFlQRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnaW5nVHlwZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIHRpbWVvdXRNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlRGVzdGluYXRpb25UeXBlICE9IG51bGwgOiAhTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhtZXNzYWdlRGVzdGluYXRpb25UeXBlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uTGluayAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uTGluayk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWcgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gYXJvdW5kSW52b2tlcyAhPSBudWxsICYmICFhcm91bmRJbnZva2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZW52RW50cmllcyAhPSBudWxsICYmICFlbnZFbnRyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VDb250ZXh0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gcG9zdENvbnN0cnVjdHMgIT0gbnVsbCAmJiAhcG9zdENvbnN0cnVjdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gcHJlRGVzdHJveXMgIT0gbnVsbCAmJiAhcHJlRGVzdHJveXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBzZWN1cml0eUlkZW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2luZ1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWVzc2FnaW5nVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZURlc3RpbmF0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVzc2FnZURlc3RpbmF0aW9uTGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25MaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VEcml2ZW5CZWFuSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTlmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbXNJbXBsI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbXNJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBhcmFtcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFyYW1zKCkgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQVJBTVM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGFyYW1zKCkgewotCQlpZiAobWV0aG9kUGFyYW1zID09IG51bGwpIHsKLQkJCW1ldGhvZFBhcmFtcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TOgotCQkJCWdldE1ldGhvZFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TOgotCQkJCWdldE1ldGhvZFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBtZXRob2RQYXJhbXMgIT0gbnVsbCAmJiAhbWV0aG9kUGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1ldGhvZFBhcmFtczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQYXJhbXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGFyYW1zSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNjdhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBlcm1pc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwjZ2V0Um9sZU5hbWVzIDxlbT5Sb2xlIE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsI2dldFVuY2hlY2tlZCA8ZW0+VW5jaGVja2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGVybWlzc2lvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBlcm1pc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lcygpIDxlbT5Sb2xlIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmNoZWNrZWQoKSA8ZW0+VW5jaGVja2VkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmNoZWNrZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbXB0eVR5cGUgdW5jaGVja2VkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQZXJtaXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BFUk1JU1NJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVOYW1lcygpIHsKLQkJaWYgKHJvbGVOYW1lcyA9PSBudWxsKSB7Ci0JCQlyb2xlTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbXB0eVR5cGUgZ2V0VW5jaGVja2VkKCkgewotCQlyZXR1cm4gdW5jaGVja2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVuY2hlY2tlZChFbXB0eVR5cGUgbmV3VW5jaGVja2VkLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUVtcHR5VHlwZSBvbGRVbmNoZWNrZWQgPSB1bmNoZWNrZWQ7Ci0JCXVuY2hlY2tlZCA9IG5ld1VuY2hlY2tlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBvbGRVbmNoZWNrZWQsIG5ld1VuY2hlY2tlZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5jaGVja2VkKEVtcHR5VHlwZSBuZXdVbmNoZWNrZWQpIHsKLQkJaWYgKG5ld1VuY2hlY2tlZCAhPSB1bmNoZWNrZWQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuY2hlY2tlZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1bmNoZWNrZWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuY2hlY2tlZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmNoZWNrZWQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VW5jaGVja2VkKG5ld1VuY2hlY2tlZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG5ld1VuY2hlY2tlZCwgbmV3VW5jaGVja2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5jaGVja2VkKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Um9sZU5hbWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gZ2V0VW5jaGVja2VkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVM6Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXNldFVuY2hlY2tlZCgoRW1wdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVM6Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlzZXRVbmNoZWNrZWQoKEVtcHR5VHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVM6Ci0JCQkJcmV0dXJuIHJvbGVOYW1lcyAhPSBudWxsICYmICFyb2xlTmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIHVuY2hlY2tlZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCXJldHVybiBtZXRob2RzICE9IG51bGwgJiYgIW1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGVybWlzc2lvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODdhOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwjZ2V0TWV0aG9kSW50ZiA8ZW0+TWV0aG9kIEludGY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXRob2RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJOYW1lID0gRUpCX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kSW50ZigpIDxlbT5NZXRob2QgSW50ZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kSW50ZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIE1FVEhPRF9JTlRGX0VERUZBVUxUID0gTWV0aG9kSW50ZXJmYWNlVHlwZS5IT01FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RJbnRmKCkgPGVtPk1ldGhvZCBJbnRmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RJbnRmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kSW50ZXJmYWNlVHlwZSBtZXRob2RJbnRmID0gTUVUSE9EX0lOVEZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1ldGhvZCBJbnRmIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRob2RJbnRmRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IE1FVEhPRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFyYW1zKCkgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYk5hbWUoKSB7Ci0JCXJldHVybiBlamJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYk5hbWUoU3RyaW5nIG5ld0VqYk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYk5hbWUgPSBlamJOYW1lOwotCQllamJOYW1lID0gbmV3RWpiTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fRUpCX05BTUUsIG9sZEVqYk5hbWUsIGVqYk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBnZXRNZXRob2RJbnRmKCkgewotCQlyZXR1cm4gbWV0aG9kSW50ZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RJbnRmKE1ldGhvZEludGVyZmFjZVR5cGUgbmV3TWV0aG9kSW50ZikgewotCQlNZXRob2RJbnRlcmZhY2VUeXBlIG9sZE1ldGhvZEludGYgPSBtZXRob2RJbnRmOwotCQltZXRob2RJbnRmID0gbmV3TWV0aG9kSW50ZiA9PSBudWxsID8gTUVUSE9EX0lOVEZfRURFRkFVTFQgOiBuZXdNZXRob2RJbnRmOwotCQlib29sZWFuIG9sZE1ldGhvZEludGZFU2V0ID0gbWV0aG9kSW50ZkVTZXQ7Ci0JCW1ldGhvZEludGZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX0lOVEYsIG9sZE1ldGhvZEludGYsIG1ldGhvZEludGYsICFvbGRNZXRob2RJbnRmRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWV0aG9kSW50ZigpIHsKLQkJTWV0aG9kSW50ZXJmYWNlVHlwZSBvbGRNZXRob2RJbnRmID0gbWV0aG9kSW50ZjsKLQkJYm9vbGVhbiBvbGRNZXRob2RJbnRmRVNldCA9IG1ldGhvZEludGZFU2V0OwotCQltZXRob2RJbnRmID0gTUVUSE9EX0lOVEZfRURFRkFVTFQ7Ci0JCW1ldGhvZEludGZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX0lOVEYsIG9sZE1ldGhvZEludGYsIE1FVEhPRF9JTlRGX0VERUZBVUxULCBvbGRNZXRob2RJbnRmRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWV0aG9kSW50ZigpIHsKLQkJcmV0dXJuIG1ldGhvZEludGZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkgewotCQlTdHJpbmcgb2xkTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCW1ldGhvZE5hbWUgPSBuZXdNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSwgb2xkTWV0aG9kTmFtZSwgbWV0aG9kTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYXJhbXMgZ2V0TWV0aG9kUGFyYW1zKCkgewotCQlyZXR1cm4gbWV0aG9kUGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgbmV3TWV0aG9kUGFyYW1zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU1ldGhvZFBhcmFtcyBvbGRNZXRob2RQYXJhbXMgPSBtZXRob2RQYXJhbXM7Ci0JCW1ldGhvZFBhcmFtcyA9IG5ld01ldGhvZFBhcmFtczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgb2xkTWV0aG9kUGFyYW1zLCBuZXdNZXRob2RQYXJhbXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgbmV3TWV0aG9kUGFyYW1zKSB7Ci0JCWlmIChuZXdNZXRob2RQYXJhbXMgIT0gbWV0aG9kUGFyYW1zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtZXRob2RQYXJhbXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWV0aG9kUGFyYW1zKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01ldGhvZFBhcmFtcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWV0aG9kUGFyYW1zKG5ld01ldGhvZFBhcmFtcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBuZXdNZXRob2RQYXJhbXMsIG5ld01ldGhvZFBhcmFtcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kUGFyYW1zKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0VKQl9OQU1FOgotCQkJCXJldHVybiBnZXRFamJOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGOgotCQkJCXJldHVybiBnZXRNZXRob2RJbnRmKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBnZXRNZXRob2ROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhcmFtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGOgotCQkJCXNldE1ldGhvZEludGYoKE1ldGhvZEludGVyZmFjZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJc2V0TWV0aG9kUGFyYW1zKChNZXRob2RQYXJhbXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19FSkJfTkFNRToKLQkJCQlzZXRFamJOYW1lKEVKQl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGOgotCQkJCXVuc2V0TWV0aG9kSW50ZigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXNldE1ldGhvZFBhcmFtcygoTWV0aG9kUGFyYW1zKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gRUpCX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYk5hbWUgIT0gbnVsbCA6ICFFSkJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGOgotCQkJCXJldHVybiBpc1NldE1ldGhvZEludGYoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBtZXRob2RQYXJhbXMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZEludGY6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXRob2RJbnRmRVNldCkgcmVzdWx0LmFwcGVuZChtZXRob2RJbnRmKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2ROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL05hbWVkTWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTmFtZWRNZXRob2RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzVlNTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTmFtZWRNZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTmFtZWRNZXRob2RUeXBlSW1wbCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5OYW1lZE1ldGhvZFR5cGVJbXBsI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5OYW1lZE1ldGhvZFR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkTWV0aG9kVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5hbWVkTWV0aG9kVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IE1FVEhPRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFyYW1zKCkgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfTUVUSE9EX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBuZXdNZXRob2ROYW1lKSB7Ci0JCVN0cmluZyBvbGRNZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJbWV0aG9kTmFtZSA9IG5ld01ldGhvZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FLCBvbGRNZXRob2ROYW1lLCBtZXRob2ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBhcmFtcyBnZXRNZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiBtZXRob2RQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBuZXdNZXRob2RQYXJhbXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWV0aG9kUGFyYW1zIG9sZE1ldGhvZFBhcmFtcyA9IG1ldGhvZFBhcmFtczsKLQkJbWV0aG9kUGFyYW1zID0gbmV3TWV0aG9kUGFyYW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBvbGRNZXRob2RQYXJhbXMsIG5ld01ldGhvZFBhcmFtcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBuZXdNZXRob2RQYXJhbXMpIHsKLQkJaWYgKG5ld01ldGhvZFBhcmFtcyAhPSBtZXRob2RQYXJhbXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1ldGhvZFBhcmFtcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltZXRob2RQYXJhbXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdNZXRob2RQYXJhbXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWV0aG9kUGFyYW1zKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRNZXRob2RQYXJhbXMobmV3TWV0aG9kUGFyYW1zLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG5ld01ldGhvZFBhcmFtcywgbmV3TWV0aG9kUGFyYW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RQYXJhbXMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXNldE1ldGhvZFBhcmFtcygoTWV0aG9kUGFyYW1zKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoTUVUSE9EX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlzZXRNZXRob2RQYXJhbXMoKE1ldGhvZFBhcmFtcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBtZXRob2RQYXJhbXMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtZXRob2ROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRNZXRob2RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjZjOTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlJbXBsI2dldFF1ZXJ5TWV0aG9kIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlJbXBsI2dldFJlc3VsdFR5cGVNYXBwaW5nIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCNnZXRFamJRbCA8ZW0+RWpiIFFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFF1ZXJ5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeU1ldGhvZCgpIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUXVlcnlNZXRob2QgcXVlcnlNZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFR5cGVNYXBwaW5nKCkgPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBSRVNVTFRfVFlQRV9NQVBQSU5HX0VERUZBVUxUID0gUmVzdWx0VHlwZU1hcHBpbmdUeXBlLkxPQ0FMX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRUeXBlTWFwcGluZygpIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSByZXN1bHRUeXBlTWFwcGluZyA9IFJFU1VMVF9UWVBFX01BUFBJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc3VsdCBUeXBlIE1hcHBpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3VsdFR5cGVNYXBwaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlFsKCkgPGVtPkVqYiBRbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9RTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJRbCgpIDxlbT5FamIgUWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlFsID0gRUpCX1FMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUXVlcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5RVUVSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEZXNjcmlwdGlvbiBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbikgewotCQlpZiAobmV3RGVzY3JpcHRpb24gIT0gZGVzY3JpcHRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc2NyaXB0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Rlc2NyaXB0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT04sIG5ld0Rlc2NyaXB0aW9uLCBuZXdEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBRdWVyeU1ldGhvZCBnZXRRdWVyeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHF1ZXJ5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG5ld1F1ZXJ5TWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVF1ZXJ5TWV0aG9kIG9sZFF1ZXJ5TWV0aG9kID0gcXVlcnlNZXRob2Q7Ci0JCXF1ZXJ5TWV0aG9kID0gbmV3UXVlcnlNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRCwgb2xkUXVlcnlNZXRob2QsIG5ld1F1ZXJ5TWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCkgewotCQlpZiAobmV3UXVlcnlNZXRob2QgIT0gcXVlcnlNZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHF1ZXJ5TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXF1ZXJ5TWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdRdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdRdWVyeU1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRRdWVyeU1ldGhvZChuZXdRdWVyeU1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG5ld1F1ZXJ5TWV0aG9kLCBuZXdRdWVyeU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiByZXN1bHRUeXBlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRUeXBlTWFwcGluZyhSZXN1bHRUeXBlTWFwcGluZ1R5cGUgbmV3UmVzdWx0VHlwZU1hcHBpbmcpIHsKLQkJUmVzdWx0VHlwZU1hcHBpbmdUeXBlIG9sZFJlc3VsdFR5cGVNYXBwaW5nID0gcmVzdWx0VHlwZU1hcHBpbmc7Ci0JCXJlc3VsdFR5cGVNYXBwaW5nID0gbmV3UmVzdWx0VHlwZU1hcHBpbmcgPT0gbnVsbCA/IFJFU1VMVF9UWVBFX01BUFBJTkdfRURFRkFVTFQgOiBuZXdSZXN1bHRUeXBlTWFwcGluZzsKLQkJYm9vbGVhbiBvbGRSZXN1bHRUeXBlTWFwcGluZ0VTZXQgPSByZXN1bHRUeXBlTWFwcGluZ0VTZXQ7Ci0JCXJlc3VsdFR5cGVNYXBwaW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX1JFU1VMVF9UWVBFX01BUFBJTkcsIG9sZFJlc3VsdFR5cGVNYXBwaW5nLCByZXN1bHRUeXBlTWFwcGluZywgIW9sZFJlc3VsdFR5cGVNYXBwaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzdWx0VHlwZU1hcHBpbmcoKSB7Ci0JCVJlc3VsdFR5cGVNYXBwaW5nVHlwZSBvbGRSZXN1bHRUeXBlTWFwcGluZyA9IHJlc3VsdFR5cGVNYXBwaW5nOwotCQlib29sZWFuIG9sZFJlc3VsdFR5cGVNYXBwaW5nRVNldCA9IHJlc3VsdFR5cGVNYXBwaW5nRVNldDsKLQkJcmVzdWx0VHlwZU1hcHBpbmcgPSBSRVNVTFRfVFlQRV9NQVBQSU5HX0VERUZBVUxUOwotCQlyZXN1bHRUeXBlTWFwcGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLlFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HLCBvbGRSZXN1bHRUeXBlTWFwcGluZywgUkVTVUxUX1RZUEVfTUFQUElOR19FREVGQVVMVCwgb2xkUmVzdWx0VHlwZU1hcHBpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXN1bHRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHJlc3VsdFR5cGVNYXBwaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYlFsKCkgewotCQlyZXR1cm4gZWpiUWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiUWwoU3RyaW5nIG5ld0VqYlFsKSB7Ci0JCVN0cmluZyBvbGRFamJRbCA9IGVqYlFsOwotCQllamJRbCA9IG5ld0VqYlFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19FSkJfUUwsIG9sZEVqYlFsLCBlamJRbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldERlc2NyaXB0aW9uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlNZXRob2QobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0UXVlcnlNZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUkVTVUxUX1RZUEVfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXJldHVybiBnZXRFamJRbCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoRGVzY3JpcHRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXNldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFR5cGVNYXBwaW5nKChSZXN1bHRUeXBlTWFwcGluZ1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXNldEVqYlFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXNldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFU1VMVF9UWVBFX01BUFBJTkc6Ci0JCQkJdW5zZXRSZXN1bHRUeXBlTWFwcGluZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXNldEVqYlFsKEVKQl9RTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIHF1ZXJ5TWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFU1VMVF9UWVBFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXJldHVybiBFSkJfUUxfRURFRkFVTFQgPT0gbnVsbCA/IGVqYlFsICE9IG51bGwgOiAhRUpCX1FMX0VERUZBVUxULmVxdWFscyhlamJRbCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVzdWx0VHlwZU1hcHBpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHRUeXBlTWFwcGluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVzdWx0VHlwZU1hcHBpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYlFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYlFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1F1ZXJ5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlNZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI5ODdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlNZXRob2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlF1ZXJ5IE1ldGhvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGwjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBRdWVyeU1ldGhvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IE1FVEhPRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFyYW1zKCkgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUXVlcnlNZXRob2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5RVUVSWV9NRVRIT0Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBuZXdNZXRob2ROYW1lKSB7Ci0JCVN0cmluZyBvbGRNZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJbWV0aG9kTmFtZSA9IG5ld01ldGhvZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRSwgb2xkTWV0aG9kTmFtZSwgbWV0aG9kTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYXJhbXMgZ2V0TWV0aG9kUGFyYW1zKCkgewotCQlyZXR1cm4gbWV0aG9kUGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgbmV3TWV0aG9kUGFyYW1zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU1ldGhvZFBhcmFtcyBvbGRNZXRob2RQYXJhbXMgPSBtZXRob2RQYXJhbXM7Ci0JCW1ldGhvZFBhcmFtcyA9IG5ld01ldGhvZFBhcmFtczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVMsIG9sZE1ldGhvZFBhcmFtcywgbmV3TWV0aG9kUGFyYW1zKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcykgewotCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG1ldGhvZFBhcmFtcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWV0aG9kUGFyYW1zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1ldGhvZFBhcmFtcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdNZXRob2RQYXJhbXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWV0aG9kUGFyYW1zKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWV0aG9kUGFyYW1zKG5ld01ldGhvZFBhcmFtcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUywgbmV3TWV0aG9kUGFyYW1zLCBuZXdNZXRob2RQYXJhbXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kUGFyYW1zKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TOgotCQkJCXNldE1ldGhvZFBhcmFtcygoTWV0aG9kUGFyYW1zKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUzoKLQkJCQlzZXRNZXRob2RQYXJhbXMoKE1ldGhvZFBhcmFtcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gTUVUSE9EX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGhvZE5hbWUgIT0gbnVsbCA6ICFNRVRIT0RfTkFNRV9FREVGQVVMVC5lcXVhbHMobWV0aG9kTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBtZXRob2RQYXJhbXMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWV0aG9kTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXRob2ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1F1ZXJ5TWV0aG9kSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWU4ZjU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTmFtZSA9IEVKQl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotCQlyZXR1cm4gZWpiTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJOYW1lKFN0cmluZyBuZXdFamJOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJOYW1lID0gZWpiTmFtZTsKLQkJZWpiTmFtZSA9IG5ld0VqYk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZShFSkJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FOgotCQkJCXJldHVybiBFSkJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWpiTmFtZSAhPSBudWxsIDogIUVKQl9OQU1FX0VERUZBVUxULmVxdWFscyhlamJOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM1ZDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwjZ2V0RWpiUmVsYXRpb25zIDxlbT5FamIgUmVsYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWxhdGlvbnMoKSA8ZW0+RWpiIFJlbGF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWxhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWxhdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlJFTEFUSU9OU0hJUFM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVsYXRpb25zKCkgewotCQlpZiAoZWpiUmVsYXRpb25zID09IG51bGwpIHsKLQkJCWVqYlJlbGF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFSkJSZWxhdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVsYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWxhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiBnZXRFamJSZWxhdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJZ2V0RWpiUmVsYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCWdldEVqYlJlbGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuIGVqYlJlbGF0aW9ucyAhPSBudWxsICYmICFlamJSZWxhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZWxhdGlvbnNoaXBzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVtb3ZlTWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVtb3ZlTWV0aG9kVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MDI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbW92ZU1ldGhvZFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVtb3ZlIE1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbW92ZU1ldGhvZFR5cGVJbXBsI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbW92ZU1ldGhvZFR5cGVJbXBsI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVtb3ZlTWV0aG9kVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTWV0aG9kVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlbW92ZU1ldGhvZFR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlYW5NZXRob2QoKSA8ZW0+QmVhbiBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJlYW5NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgYmVhbk1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpIDxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVUQUlOX0lGX0VYQ0VQVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpIDxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JZkV4Y2VwdGlvbiA9IFJFVEFJTl9JRl9FWENFUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJldGFpbiBJZiBFeGNlcHRpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbklmRXhjZXB0aW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVtb3ZlTWV0aG9kVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlJFTU9WRV9NRVRIT0RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldEJlYW5NZXRob2QoKSB7Ci0JCXJldHVybiBiZWFuTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJlYW5NZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld0JlYW5NZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTmFtZWRNZXRob2RUeXBlIG9sZEJlYW5NZXRob2QgPSBiZWFuTWV0aG9kOwotCQliZWFuTWV0aG9kID0gbmV3QmVhbk1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9ELCBvbGRCZWFuTWV0aG9kLCBuZXdCZWFuTWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdCZWFuTWV0aG9kKSB7Ci0JCWlmIChuZXdCZWFuTWV0aG9kICE9IGJlYW5NZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJlYW5NZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmVhbk1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmVhbk1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCZWFuTWV0aG9kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEJlYW5NZXRob2QobmV3QmVhbk1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG5ld0JlYW5NZXRob2QsIG5ld0JlYW5NZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JldGFpbklmRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gcmV0YWluSWZFeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0YWluSWZFeGNlcHRpb24oYm9vbGVhbiBuZXdSZXRhaW5JZkV4Y2VwdGlvbikgewotCQlib29sZWFuIG9sZFJldGFpbklmRXhjZXB0aW9uID0gcmV0YWluSWZFeGNlcHRpb247Ci0JCXJldGFpbklmRXhjZXB0aW9uID0gbmV3UmV0YWluSWZFeGNlcHRpb247Ci0JCWJvb2xlYW4gb2xkUmV0YWluSWZFeGNlcHRpb25FU2V0ID0gcmV0YWluSWZFeGNlcHRpb25FU2V0OwotCQlyZXRhaW5JZkV4Y2VwdGlvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTiwgb2xkUmV0YWluSWZFeGNlcHRpb24sIHJldGFpbklmRXhjZXB0aW9uLCAhb2xkUmV0YWluSWZFeGNlcHRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXRhaW5JZkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBvbGRSZXRhaW5JZkV4Y2VwdGlvbiA9IHJldGFpbklmRXhjZXB0aW9uOwotCQlib29sZWFuIG9sZFJldGFpbklmRXhjZXB0aW9uRVNldCA9IHJldGFpbklmRXhjZXB0aW9uRVNldDsKLQkJcmV0YWluSWZFeGNlcHRpb24gPSBSRVRBSU5fSUZfRVhDRVBUSU9OX0VERUZBVUxUOwotCQlyZXRhaW5JZkV4Y2VwdGlvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTiwgb2xkUmV0YWluSWZFeGNlcHRpb24sIFJFVEFJTl9JRl9FWENFUFRJT05fRURFRkFVTFQsIG9sZFJldGFpbklmRXhjZXB0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmV0YWluSWZFeGNlcHRpb24oKSB7Ci0JCXJldHVybiByZXRhaW5JZkV4Y2VwdGlvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCZWFuTWV0aG9kKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0QmVhbk1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTjoKLQkJCQlyZXR1cm4gaXNSZXRhaW5JZkV4Y2VwdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlzZXRCZWFuTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT046Ci0JCQkJc2V0UmV0YWluSWZFeGNlcHRpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgotCQkJCXNldEJlYW5NZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19SRVRBSU5fSUZfRVhDRVBUSU9OOgotCQkJCXVuc2V0UmV0YWluSWZFeGNlcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlyZXR1cm4gYmVhbk1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRSZXRhaW5JZkV4Y2VwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXRhaW5JZkV4Y2VwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJldGFpbklmRXhjZXB0aW9uRVNldCkgcmVzdWx0LmFwcGVuZChyZXRhaW5JZkV4Y2VwdGlvbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZW1vdmVNZXRob2RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQyMGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUlkZW50aXR5VHlwZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsI2dldFVzZUNhbGxlcklkZW50aXR5IDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUlkZW50aXR5VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5SWRlbnRpdHlUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VDYWxsZXJJZGVudGl0eSgpIDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2VDYWxsZXJJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVtcHR5VHlwZSB1c2VDYWxsZXJJZGVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSdW5BcygpIDxlbT5SdW4gQXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJ1bkFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUnVuQXMgcnVuQXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9JREVOVElUWV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbXB0eVR5cGUgZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCXJldHVybiB1c2VDYWxsZXJJZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVc2VDYWxsZXJJZGVudGl0eShFbXB0eVR5cGUgbmV3VXNlQ2FsbGVySWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRW1wdHlUeXBlIG9sZFVzZUNhbGxlcklkZW50aXR5ID0gdXNlQ2FsbGVySWRlbnRpdHk7Ci0JCXVzZUNhbGxlcklkZW50aXR5ID0gbmV3VXNlQ2FsbGVySWRlbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWSwgb2xkVXNlQ2FsbGVySWRlbnRpdHksIG5ld1VzZUNhbGxlcklkZW50aXR5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYWxsZXJJZGVudGl0eShFbXB0eVR5cGUgbmV3VXNlQ2FsbGVySWRlbnRpdHkpIHsKLQkJaWYgKG5ld1VzZUNhbGxlcklkZW50aXR5ICE9IHVzZUNhbGxlcklkZW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1c2VDYWxsZXJJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1c2VDYWxsZXJJZGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VXNlQ2FsbGVySWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VXNlQ2FsbGVySWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VXNlQ2FsbGVySWRlbnRpdHkobmV3VXNlQ2FsbGVySWRlbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZLCBuZXdVc2VDYWxsZXJJZGVudGl0eSwgbmV3VXNlQ2FsbGVySWRlbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXMgZ2V0UnVuQXMoKSB7Ci0JCXJldHVybiBydW5BczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSdW5BcyhSdW5BcyBuZXdSdW5BcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSdW5BcyBvbGRSdW5BcyA9IHJ1bkFzOwotCQlydW5BcyA9IG5ld1J1bkFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUywgb2xkUnVuQXMsIG5ld1J1bkFzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW5BcyhSdW5BcyBuZXdSdW5BcykgewotCQlpZiAobmV3UnVuQXMgIT0gcnVuQXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJ1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJ1bkFzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1J1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1J1bkFzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UnVuQXMobmV3UnVuQXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMsIG5ld1J1bkFzLCBuZXdSdW5BcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VXNlQ2FsbGVySWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTOgotCQkJCXJldHVybiBiYXNpY1NldFJ1bkFzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgotCQkJCXJldHVybiBnZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUzoKLQkJCQlyZXR1cm4gZ2V0UnVuQXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFk6Ci0JCQkJc2V0VXNlQ2FsbGVySWRlbnRpdHkoKEVtcHR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUzoKLQkJCQlzZXRSdW5BcygoUnVuQXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgotCQkJCXNldFVzZUNhbGxlcklkZW50aXR5KChFbXB0eVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUzoKLQkJCQlzZXRSdW5BcygoUnVuQXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHVzZUNhbGxlcklkZW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTOgotCQkJCXJldHVybiBydW5BcyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZWN1cml0eUlkZW50aXR5VHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25CZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQmVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyNDBkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25CZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2Vzc2lvbiBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRCdXNpbmVzc0xvY2FscyA8ZW0+QnVzaW5lc3MgTG9jYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRCdXNpbmVzc1JlbW90ZXMgPGVtPkJ1c2luZXNzIFJlbW90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEluaXRNZXRob2RzIDxlbT5Jbml0IE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFJlbW92ZU1ldGhvZHMgPGVtPlJlbW92ZSBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFByZVBhc3NpdmF0ZXMgPGVtPlByZSBQYXNzaXZhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlY3VyaXR5SWRlbnRpdGllcyA8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkJlYW5JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXNzaW9uQmVhbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTmFtZSA9IEVKQl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvbWUoKSA8ZW0+SG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9NRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG9tZSA9IEhPTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3RlKCkgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3RlKCkgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZSA9IFJFTU9URV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9IT01FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWxIb21lID0gTE9DQUxfSE9NRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbCgpIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbCA9IExPQ0FMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnVzaW5lc3NMb2NhbHMoKSA8ZW0+QnVzaW5lc3MgTG9jYWxzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJ1c2luZXNzTG9jYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYnVzaW5lc3NMb2NhbHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnVzaW5lc3NSZW1vdGVzKCkgPGVtPkJ1c2luZXNzIFJlbW90ZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnVzaW5lc3NSZW1vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYnVzaW5lc3NSZW1vdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnQoKSA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZUVuZHBvaW50ID0gU0VSVklDRV9FTkRQT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJDbGFzcygpIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJDbGFzcyA9IEVKQl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVHlwZSgpIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlIFNFU1NJT05fVFlQRV9FREVGQVVMVCA9IFNlc3Npb25UeXBlLlNUQVRFRlVMX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVHlwZSgpIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUgPSBTRVNTSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNlc3Npb24gVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lb3V0TWV0aG9kKCkgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lb3V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIHRpbWVvdXRNZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdE1ldGhvZHMoKSA8ZW0+SW5pdCBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdE1ldGhvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3ZlTWV0aG9kcygpIDxlbT5SZW1vdmUgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdmVNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVtb3ZlTWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyb3VuZEludm9rZXMoKSA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJvdW5kSW52b2tlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyb3VuZEludm9rZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cmllcygpIDxlbT5FbnYgRW50cmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52RW50cmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxvY2FsUmVmcygpIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdENvbnN0cnVjdHMoKSA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdENvbnN0cnVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdEFjdGl2YXRlcygpIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0QWN0aXZhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdEFjdGl2YXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQYXNzaXZhdGVzKCkgPGVtPlByZSBQYXNzaXZhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVBhc3NpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVQYXNzaXZhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZVJlZnMoKSA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5SWRlbnRpdGllcygpIDxlbT5TZWN1cml0eSBJZGVudGl0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eUlkZW50aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5VHlwZSBzZWN1cml0eUlkZW50aXRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2Vzc2lvbkJlYW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX0JFQU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiTmFtZSgpIHsKLQkJcmV0dXJuIGVqYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiTmFtZShTdHJpbmcgbmV3RWpiTmFtZSkgewotCQlTdHJpbmcgb2xkRWpiTmFtZSA9IGVqYk5hbWU7Ci0JCWVqYk5hbWUgPSBuZXdFamJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUUsIG9sZEVqYk5hbWUsIGVqYk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gaG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBuZXdIb21lKSB7Ci0JCVN0cmluZyBvbGRIb21lID0gaG9tZTsKLQkJaG9tZSA9IG5ld0hvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19IT01FLCBvbGRIb21lLCBob21lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7Ci0JCXJldHVybiByZW1vdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyBuZXdSZW1vdGUpIHsKLQkJU3RyaW5nIG9sZFJlbW90ZSA9IHJlbW90ZTsKLQkJcmVtb3RlID0gbmV3UmVtb3RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1RFLCBvbGRSZW1vdGUsIHJlbW90ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxIb21lKCkgewotCQlyZXR1cm4gbG9jYWxIb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgbmV3TG9jYWxIb21lKSB7Ci0JCVN0cmluZyBvbGRMb2NhbEhvbWUgPSBsb2NhbEhvbWU7Ci0JCWxvY2FsSG9tZSA9IG5ld0xvY2FsSG9tZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMX0hPTUUsIG9sZExvY2FsSG9tZSwgbG9jYWxIb21lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbCgpIHsKLQkJcmV0dXJuIGxvY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsKFN0cmluZyBuZXdMb2NhbCkgewotCQlTdHJpbmcgb2xkTG9jYWwgPSBsb2NhbDsKLQkJbG9jYWwgPSBuZXdMb2NhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMLCBvbGRMb2NhbCwgbG9jYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCdXNpbmVzc0xvY2FscygpIHsKLQkJaWYgKGJ1c2luZXNzTG9jYWxzID09IG51bGwpIHsKLQkJCWJ1c2luZXNzTG9jYWxzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUyk7Ci0JCX0KLQkJcmV0dXJuIGJ1c2luZXNzTG9jYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJ1c2luZXNzUmVtb3RlcygpIHsKLQkJaWYgKGJ1c2luZXNzUmVtb3RlcyA9PSBudWxsKSB7Ci0JCQlidXNpbmVzc1JlbW90ZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyk7Ci0JCX0KLQkJcmV0dXJuIGJ1c2luZXNzUmVtb3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludCgpIHsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnQoU3RyaW5nIG5ld1NlcnZpY2VFbmRwb2ludCkgewotCQlTdHJpbmcgb2xkU2VydmljZUVuZHBvaW50ID0gc2VydmljZUVuZHBvaW50OwotCQlzZXJ2aWNlRW5kcG9pbnQgPSBuZXdTZXJ2aWNlRW5kcG9pbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5ULCBvbGRTZXJ2aWNlRW5kcG9pbnQsIHNlcnZpY2VFbmRwb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xhc3MoKSB7Ci0JCXJldHVybiBlamJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhTdHJpbmcgbmV3RWpiQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXNzaW9uVHlwZSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIG5ld1Nlc3Npb25UeXBlKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCXNlc3Npb25UeXBlID0gbmV3U2Vzc2lvblR5cGUgPT0gbnVsbCA/IFNFU1NJT05fVFlQRV9FREVGQVVMVCA6IG5ld1Nlc3Npb25UeXBlOwotCQlib29sZWFuIG9sZFNlc3Npb25UeXBlRVNldCA9IHNlc3Npb25UeXBlRVNldDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSwgb2xkU2Vzc2lvblR5cGUsIHNlc3Npb25UeXBlLCAhb2xkU2Vzc2lvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTZXNzaW9uVHlwZSgpIHsKLQkJU2Vzc2lvblR5cGUgb2xkU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRTZXNzaW9uVHlwZUVTZXQgPSBzZXNzaW9uVHlwZUVTZXQ7Ci0JCXNlc3Npb25UeXBlID0gU0VTU0lPTl9UWVBFX0VERUZBVUxUOwotCQlzZXNzaW9uVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VTU0lPTl9UWVBFLCBvbGRTZXNzaW9uVHlwZSwgU0VTU0lPTl9UWVBFX0VERUZBVUxULCBvbGRTZXNzaW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNlc3Npb25UeXBlKCkgewotCQlyZXR1cm4gc2Vzc2lvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0VGltZW91dE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRpbWVvdXRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3VGltZW91dE1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOYW1lZE1ldGhvZFR5cGUgb2xkVGltZW91dE1ldGhvZCA9IHRpbWVvdXRNZXRob2Q7Ci0JCXRpbWVvdXRNZXRob2QgPSBuZXdUaW1lb3V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG9sZFRpbWVvdXRNZXRob2QsIG5ld1RpbWVvdXRNZXRob2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld1RpbWVvdXRNZXRob2QpIHsKLQkJaWYgKG5ld1RpbWVvdXRNZXRob2QgIT0gdGltZW91dE1ldGhvZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGltZW91dE1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0aW1lb3V0TWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lb3V0TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVvdXRNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGltZW91dE1ldGhvZChuZXdUaW1lb3V0TWV0aG9kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRCwgbmV3VGltZW91dE1ldGhvZCwgbmV3VGltZW91dE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluaXRNZXRob2RzKCkgewotCQlpZiAoaW5pdE1ldGhvZHMgPT0gbnVsbCkgewotCQkJaW5pdE1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5pdE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMpOwotCQl9Ci0JCXJldHVybiBpbml0TWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZW1vdmVNZXRob2RzKCkgewotCQlpZiAocmVtb3ZlTWV0aG9kcyA9PSBudWxsKSB7Ci0JCQlyZW1vdmVNZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlbW92ZU1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUyk7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZU1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlLCAhb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCwgb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcm91bmRJbnZva2VzKCkgewotCQlpZiAoYXJvdW5kSW52b2tlcyA9PSBudWxsKSB7Ci0JCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyk7Ci0JCX0KLQkJcmV0dXJuIGFyb3VuZEludm9rZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgewotCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTKTsKLQkJfQotCQlyZXR1cm4gZW52RW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgewotCQlpZiAoZWpiUmVmcyA9PSBudWxsKSB7Ci0JCQllamJSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7Ci0JCWlmIChlamJMb2NhbFJlZnMgPT0gbnVsbCkgewotCQkJZWpiTG9jYWxSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYkxvY2FsUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlMpOwotCQl9Ci0JCXJldHVybiBlamJMb2NhbFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlpZiAocGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgewotCQlpZiAocG9zdENvbnN0cnVjdHMgPT0gbnVsbCkgewotCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOwotCQl9Ci0JCXJldHVybiBwb3N0Q29uc3RydWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVEZXN0cm95cygpIHsKLQkJaWYgKHByZURlc3Ryb3lzID09IG51bGwpIHsKLQkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTKTsKLQkJfQotCQlyZXR1cm4gcHJlRGVzdHJveXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdEFjdGl2YXRlcygpIHsKLQkJaWYgKHBvc3RBY3RpdmF0ZXMgPT0gbnVsbCkgewotCQkJcG9zdEFjdGl2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTKTsKLQkJfQotCQlyZXR1cm4gcG9zdEFjdGl2YXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVQYXNzaXZhdGVzKCkgewotCQlpZiAocHJlUGFzc2l2YXRlcyA9PSBudWxsKSB7Ci0JCQlwcmVQYXNzaXZhdGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVMpOwotCQl9Ci0JCXJldHVybiBwcmVQYXNzaXZhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eVR5cGUgZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCkgewotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdGllcyhTZWN1cml0eUlkZW50aXR5VHlwZSBuZXdTZWN1cml0eUlkZW50aXRpZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdXJpdHlJZGVudGl0eVR5cGUgb2xkU2VjdXJpdHlJZGVudGl0aWVzID0gc2VjdXJpdHlJZGVudGl0aWVzOwotCQlzZWN1cml0eUlkZW50aXRpZXMgPSBuZXdTZWN1cml0eUlkZW50aXRpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTLCBvbGRTZWN1cml0eUlkZW50aXRpZXMsIG5ld1NlY3VyaXR5SWRlbnRpdGllcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdXJpdHlJZGVudGl0aWVzKFNlY3VyaXR5SWRlbnRpdHlUeXBlIG5ld1NlY3VyaXR5SWRlbnRpdGllcykgewotCQlpZiAobmV3U2VjdXJpdHlJZGVudGl0aWVzICE9IHNlY3VyaXR5SWRlbnRpdGllcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VjdXJpdHlJZGVudGl0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlY3VyaXR5SWRlbnRpdGllcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZWN1cml0eUlkZW50aXRpZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjdXJpdHlJZGVudGl0aWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0aWVzKG5ld1NlY3VyaXR5SWRlbnRpdGllcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUywgbmV3U2VjdXJpdHlJZGVudGl0aWVzLCBuZXdTZWN1cml0eUlkZW50aXRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGltZW91dE1ldGhvZChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVtb3ZlTWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdEFjdGl2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZVBhc3NpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTOgotCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdGllcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0hPTUU6Ci0JCQkJcmV0dXJuIGdldEhvbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9URToKLQkJCQlyZXR1cm4gZ2V0UmVtb3RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FOgotCQkJCXJldHVybiBnZXRMb2NhbEhvbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMOgotCQkJCXJldHVybiBnZXRMb2NhbCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTOgotCQkJCXJldHVybiBnZXRCdXNpbmVzc0xvY2FscygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUzoKLQkJCQlyZXR1cm4gZ2V0QnVzaW5lc3NSZW1vdGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiBnZXRUaW1lb3V0TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEluaXRNZXRob2RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0UmVtb3ZlTWV0aG9kcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gZ2V0QXJvdW5kSW52b2tlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gZ2V0UHJlRGVzdHJveXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTOgotCQkJCXJldHVybiBnZXRQb3N0QWN0aXZhdGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UHJlUGFzc2l2YXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eUlkZW50aXRpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0hPTUU6Ci0JCQkJc2V0SG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMX0hPTUU6Ci0JCQkJc2V0TG9jYWxIb21lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMOgotCQkJCXNldExvY2FsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUzoKLQkJCQlnZXRCdXNpbmVzc0xvY2FscygpLmNsZWFyKCk7Ci0JCQkJZ2V0QnVzaW5lc3NMb2NhbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVM6Ci0JCQkJZ2V0QnVzaW5lc3NSZW1vdGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRCdXNpbmVzc1JlbW90ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQ6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEU6Ci0JCQkJc2V0U2Vzc2lvblR5cGUoKFNlc3Npb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRDoKLQkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKLQkJCQlnZXRJbml0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTOgotCQkJCWdldFJlbW92ZU1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldFJlbW92ZU1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKChUcmFuc2FjdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCWdldEFyb3VuZEludm9rZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVM6Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVM6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0aWVzKChTZWN1cml0eUlkZW50aXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZShFSkJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSE9NRToKLQkJCQlzZXRIb21lKEhPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoUkVNT1RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZShMT0NBTF9IT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTDoKLQkJCQlzZXRMb2NhbChMT0NBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTOgotCQkJCWdldEJ1c2luZXNzTG9jYWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTOgotCQkJCWdldEJ1c2luZXNzUmVtb3RlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnQoU0VSVklDRV9FTkRQT0lOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKEVKQl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VTU0lPTl9UWVBFOgotCQkJCXVuc2V0U2Vzc2lvblR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRDoKLQkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSU5JVF9NRVRIT0RTOgotCQkJCWdldEluaXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUzoKLQkJCQlnZXRSZW1vdmVNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJZ2V0QXJvdW5kSW52b2tlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKLQkJCQlnZXRQb3N0QWN0aXZhdGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlnZXRQcmVQYXNzaXZhdGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUzoKLQkJCQlzZXRTZWN1cml0eUlkZW50aXRpZXMoKFNlY3VyaXR5SWRlbnRpdHlUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gRUpCX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYk5hbWUgIT0gbnVsbCA6ICFFSkJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19IT01FOgotCQkJCXJldHVybiBIT01FX0VERUZBVUxUID09IG51bGwgPyBob21lICE9IG51bGwgOiAhSE9NRV9FREVGQVVMVC5lcXVhbHMoaG9tZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVEU6Ci0JCQkJcmV0dXJuIFJFTU9URV9FREVGQVVMVCA9PSBudWxsID8gcmVtb3RlICE9IG51bGwgOiAhUkVNT1RFX0VERUZBVUxULmVxdWFscyhyZW1vdGUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gTE9DQUxfSE9NRV9FREVGQVVMVCA9PSBudWxsID8gbG9jYWxIb21lICE9IG51bGwgOiAhTE9DQUxfSE9NRV9FREVGQVVMVC5lcXVhbHMobG9jYWxIb21lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMOgotCQkJCXJldHVybiBMT0NBTF9FREVGQVVMVCA9PSBudWxsID8gbG9jYWwgIT0gbnVsbCA6ICFMT0NBTF9FREVGQVVMVC5lcXVhbHMobG9jYWwpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTOgotCQkJCXJldHVybiBidXNpbmVzc0xvY2FscyAhPSBudWxsICYmICFidXNpbmVzc0xvY2Fscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTOgotCQkJCXJldHVybiBidXNpbmVzc1JlbW90ZXMgIT0gbnVsbCAmJiAhYnVzaW5lc3NSZW1vdGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQ6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludCAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VFbmRwb2ludCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEVKQl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZWpiQ2xhc3MgIT0gbnVsbCA6ICFFSkJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGVqYkNsYXNzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRTZXNzaW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIHRpbWVvdXRNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKLQkJCQlyZXR1cm4gaW5pdE1ldGhvZHMgIT0gbnVsbCAmJiAhaW5pdE1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6Ci0JCQkJcmV0dXJuIHJlbW92ZU1ldGhvZHMgIT0gbnVsbCAmJiAhcmVtb3ZlTWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGFyb3VuZEludm9rZXMgIT0gbnVsbCAmJiAhYXJvdW5kSW52b2tlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZW52RW50cmllcyAhPSBudWxsICYmICFlbnZFbnRyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZVJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZUNvbnRleHRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVVuaXRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gcG9zdENvbnN0cnVjdHMgIT0gbnVsbCAmJiAhcG9zdENvbnN0cnVjdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBwcmVEZXN0cm95cyAhPSBudWxsICYmICFwcmVEZXN0cm95cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gcG9zdEFjdGl2YXRlcyAhPSBudWxsICYmICFwb3N0QWN0aXZhdGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTOgotCQkJCXJldHVybiBwcmVQYXNzaXZhdGVzICE9IG51bGwgJiYgIXByZVBhc3NpdmF0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVSZWZzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0aWVzICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBob21lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZW1vdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2FsSG9tZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbEhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2FsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2FsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBidXNpbmVzc0xvY2FsczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChidXNpbmVzc0xvY2Fscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnVzaW5lc3NSZW1vdGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJ1c2luZXNzUmVtb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2Vzc2lvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHNlc3Npb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvblR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0cmFuc2FjdGlvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXNzaW9uQmVhbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9tZXRhZGF0YS9FamJQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9tZXRhZGF0YS9FamJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDc1MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvbWV0YWRhdGEvRWpiUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVqYkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAgICAgICBAKCMpZWpiLWphcl8zXzAueHNkcwkxLjUxIDAyLzIzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIGphdmFlZSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICAKLSAqIAotICogCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBFSkIgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL2VqYi1qYXIueG1sIiBpbgotICogCXRoZSBFSkIncyBqYXIgZmlsZS4gIEFsbCBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0gKiAJdGhlIGVqYi1qYXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCi0gKiAJYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICogCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0gKiAKLSAqIAkgICAgJmx0O2VqYi1qYXIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAqIAkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICogCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAJCSAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCIKLSAqIAkgICAgICB2ZXJzaW9uPSIzLjAiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L2VqYi1qYXImZ3Q7Ci0gKiAKLSAqIAlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAqIAl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLSAqIAlKYXZhIEVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkCi0gKiAKLSAqIAkKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gKiAKLSAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAqIAlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICogCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICogCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gKiAJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gKiAJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVqYkZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFamJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImVqYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJRyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbCA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sbGJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwgPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXJvdW5kSW52b2tlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUk9VTkRfSU5WT0tFX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUk9VTkRfSU5WT0tFX1RZUEVfX01FVEhPRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJPVU5EX0lOVk9LRV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1IgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBlcm1pc3Npb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIEJpbmRpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwgPGVtPkNNUCBGaWVsZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01QRmllbGRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENNUF9GSUVMRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfRklFTERfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9GSUVMRF9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfRklFTERfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DTVAgRmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0ZJRUxEX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUkZpZWxkSW1wbCA8ZW0+Q01SIEZpZWxkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbXIgRmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DTVIgRmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnMgQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwgPGVtPkVKQiBKYXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9KQVIgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19JTlRFUkNFUFRPUlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19SRUxBVElPTlNISVBTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsaWVudCBKYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19JRCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19NRVRBREFUQV9DT01QTEVURSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX1ZFUlNJT04gPSAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgSmFyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfRkVBVFVSRV9DT1VOVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBKYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsIDxlbT5FSkIgUmVsYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT04gPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgUmVsYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIDxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZWxldGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q21yIEZpZWxkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9GRUFUVVJFX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsIDxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVudGVycHJpc2VCZWFucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTlNfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTlNfX0VOVElUWV9CRUFOUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTlNfX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTlNfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwgPGVtPkVudGl0eSBCZWFuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fRUpCX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0hPTUUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19SRU1PVEUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fTE9DQUxfSE9NRSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fTE9DQUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19FSkJfQ0xBU1MgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW0gS2V5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1JFRU5UUkFOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbXAgRmllbGRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1rZXkgRmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRCA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVMgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0VKQl9SRUZTID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1FVRVJJRVMgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19JRCA9IDMxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudGl0eSBCZWFuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX0ZFQVRVUkVfQ09VTlQgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEV4Y2x1ZGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fTUVUSE9EUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX0xJU1RfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhDTFVERV9MSVNUX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbCA8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW5pdE1ldGhvZFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEluaXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOSVRfTUVUSE9EX1RZUEUgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX01FVEhPRF9UWVBFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX01FVEhPRF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lEID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX09SREVSX1RZUEUgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX09SREVSX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JzVHlwZUltcGwgPGVtPkludGVyY2VwdG9ycyBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvcnNUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvcnNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SU19UWVBFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JTX1RZUEVfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUlNfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsIDxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19JRCA9IDE2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsIDxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTiA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9DTEFTUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnaW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdJTkdfVFlQRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUyA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVMgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19JRCA9IDI1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9GRUFUVVJFX0NPVU5UID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1zSW1wbCA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBUkFNUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQVJBTVNfX01FVEhPRF9QQVJBTVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBUkFNU19fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBUkFNU19GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbCA8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZFBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT04gPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmNoZWNrZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fSUQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsIDxlbT5NZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVFlQRSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVFlQRV9fRUpCX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX19JRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTmFtZWRNZXRob2RUeXBlSW1wbCA8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk5hbWVkTWV0aG9kVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TmFtZWRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVEX01FVEhPRF9UWVBFID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX01FVEhPRF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCA8ZW0+UXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBRVUVSWSA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfX0RFU0NSSVBUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9fUVVFUllfTUVUSE9EID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfX1JFU1VMVF9UWVBFX01BUFBJTkcgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBRbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19FSkJfUUwgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGwgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFF1ZXJ5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRSA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fRUpCX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBzSW1wbCA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBTID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZW1vdmVNZXRob2RUeXBlSW1wbCA8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZW1vdmVNZXRob2RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFTU9WRV9NRVRIT0RfVFlQRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0YWluIElmIEV4Y2VwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRU1PVkVfTUVUSE9EX1RZUEVfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVNT1ZFX01FVEhPRF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCA8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX1RZUEUgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIENhbGxlciBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCA8ZW0+U2Vzc2lvbiBCZWFuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VKQl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0hPTUUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUkVNT1RFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fTE9DQUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJ1c2luZXNzIExvY2FsczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19CVVNJTkVTU19MT0NBTFMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJ1c2luZXNzIFJlbW90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VKQl9DTEFTUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fU0VTU0lPTl9UWVBFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW92ZSBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19FSkJfUkVGUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVMgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IEFjdGl2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUyA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVMgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fSUQgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXNzaW9uIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX0ZFQVRVUkVfQ09VTlQgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUgPGVtPkNtcCBWZXJzaW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENtcFZlcnNpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENNUF9WRVJTSU9OX1RZUEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlIDxlbT5DTVIgRmllbGQgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUkZpZWxkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTVJfRklFTERfVFlQRSA9IDMzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlIDxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfSU5URVJGQUNFX1RZUEUgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZSA8ZW0+TXVsdGlwbGljaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TXVsdGlwbGljaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNVUxUSVBMSUNJVFlfVFlQRSA9IDM1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVFlQRSA9IDM2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZXN1bHRUeXBlTWFwcGluZ1R5cGUgPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlc3VsdFR5cGVNYXBwaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEUgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9UWVBFID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEUgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX1RZUEUgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q21wIFZlcnNpb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDbXBWZXJzaW9uVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTVBfVkVSU0lPTl9UWVBFX09CSkVDVCA9IDQxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DTVIgRmllbGQgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGRUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENNUl9GSUVMRF9UWVBFX09CSkVDVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFamJDbGFzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX0NMQVNTX1RZUEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFamJOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfTkFNRV9UWVBFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0lOVEVSRkFDRV9UWVBFX09CSkVDVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NZXRob2QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2ROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfTkFNRV9UWVBFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk11bHRpcGxpY2l0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TXVsdGlwbGljaXR5VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNVUxUSVBMSUNJVFlfVFlQRV9PQkpFQ1QgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1RZUEVfT0JKRUNUID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZXN1bHRUeXBlTWFwcGluZ1R5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1QgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25UeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFU1NJT05fVFlQRV9PQkpFQ1QgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1QgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX1RZUEVfT0JKRUNUID0gNTI7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldElkKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNnZXRFeGNlcHRpb25DbGFzcyA8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0RXhjZXB0aW9uQ2xhc3MoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGxiYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjaygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX1JvbGxiYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSA8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFyb3VuZEludm9rZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldENsYXNzXygpCi0JICogQHNlZSAjZ2V0QXJvdW5kSW52b2tlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJvdW5kSW52b2tlVHlwZV9DbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldE1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldEFyb3VuZEludm9rZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyb3VuZEludm9rZVR5cGVfTWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yIDxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0U2VjdXJpdHlSb2xlcygpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXRob2RQZXJtaXNzaW9ucyA8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGVybWlzc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWV0aG9kUGVybWlzc2lvbnMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldENvbnRhaW5lclRyYW5zYWN0aW9ucyA8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRJbnRlcmNlcHRvckJpbmRpbmdzIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfSW50ZXJjZXB0b3JCaW5kaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0RXhjbHVkZUxpc3QgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRFeGNsdWRlTGlzdCgpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfQXBwbGljYXRpb25FeGNlcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkIDxlbT5DTVAgRmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENNUEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0Q01QRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENNUEZpZWxkX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRDTVBGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q01QRmllbGRfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENNUEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDTVBGaWVsZF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQgPGVtPkNNUiBGaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q01SRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRDTVJGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkTmFtZSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbXIgRmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkTmFtZSgpCi0JICogQHNlZSAjZ2V0Q01SRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENNUkZpZWxkX0NtckZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZFR5cGUgPGVtPkNtciBGaWVsZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI2dldENNUkZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDTVJGaWVsZF9DbXJGaWVsZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0Q01SRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENNUkZpZWxkX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldE1ldGhvZHMoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldFRyYW5zQXR0cmlidXRlIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX1RyYW5zQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciA8ZW0+RUpCIEphcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFSkJKYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRSZWxhdGlvbnNoaXBzIDxlbT5SZWxhdGlvbnNoaXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9SZWxhdGlvbnNoaXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRBc3NlbWJseURlc2NyaXB0b3IgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRFamJDbGllbnRKYXIgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIENsaWVudCBKYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RWpiQ2xpZW50SmFyKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkphcl9FamJDbGllbnRKYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldElkKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkphcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldEVqYkphciA8ZW0+RWpiIEphcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVqYiBKYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRFamJKYXIoKQotCSAqIEBzZWUgI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9FamJKYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uIDxlbT5FSkIgUmVsYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVKQlJlbGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbk5hbWUgPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbnNoaXBSb2xlcyA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlIDxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q2FzY2FkZURlbGV0ZSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q2FzY2FkZURlbGV0ZSgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRDbXJGaWVsZCA8ZW0+Q21yIEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q21yIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRDbXJGaWVsZCgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zIDxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVudGVycHJpc2VCZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuc19Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRTZXNzaW9uQmVhbnMgPGVtPlNlc3Npb24gQmVhbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlc3Npb24gQmVhbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0U2Vzc2lvbkJlYW5zKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0RW50aXR5QmVhbnMgPGVtPkVudGl0eSBCZWFuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXR5IEJlYW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldEVudGl0eUJlYW5zKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRNZXNzYWdlRHJpdmVuQmVhbnMgPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKQotCSAqIEBzZWUgI2dldEVudGVycHJpc2VCZWFucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5zX01lc3NhZ2VEcml2ZW5CZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVudGVycHJpc2VCZWFucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIDxlbT5FbnRpdHkgQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVudGl0eUJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0VqYk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRIb21lIDxlbT5Ib21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SG9tZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9Ib21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1vdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlbW90ZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9SZW1vdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbEhvbWUoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fTG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldExvY2FsKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0xvY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiQ2xhc3MoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJpbUtleUNsYXNzIDxlbT5QcmltIEtleSBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByaW0gS2V5IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmltS2V5Q2xhc3MoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jaXNSZWVudHJhbnQgPGVtPlJlZW50cmFudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZW50cmFudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wVmVyc2lvbiA8ZW0+Q21wIFZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbXAgVmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wVmVyc2lvbigpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9DbXBWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0QWJzdHJhY3RTY2hlbWFOYW1lIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fQWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRDbXBGaWVsZHMgPGVtPkNtcCBGaWVsZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNtcCBGaWVsZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcEZpZWxkcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9DbXBGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmlta2V5RmllbGQgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcmlta2V5IEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmlta2V5RmllbGQoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52IEVudHJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVudkVudHJpZXMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0VqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRRdWVyaWVzIDxlbT5RdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5RdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1F1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0IDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRFeGNsdWRlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldElkKCkKLQkgKiBAc2VlICNnZXRFeGNsdWRlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXhjbHVkZUxpc3RfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlIDxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5pdE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0Q3JlYXRlTWV0aG9kIDxlbT5DcmVhdGUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldENyZWF0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5pdE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0QmVhbk1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5pdE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluaXRNZXRob2RUeXBlX0JlYW5NZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0SW5pdE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEluaXRNZXRob2RUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEVqYk5hbWUoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRWpiTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzIDxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzZXMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JPcmRlciA8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnRlcmNlcHRvciBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JPcmRlcigpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9NZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yT3JkZXJUeXBlIDxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzZXMgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzZXMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlIDxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEludGVyY2VwdG9yc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JzVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmNlcHRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JzVHlwZV9JbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yc1R5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSA8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbnRlcmNlcHRvclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yVHlwZV9JbnRlcmNlcHRvckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRBcm91bmRJbnZva2VzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRJbnZva2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVqYkxvY2FsUmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQb3N0QWN0aXZhdGVzIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdEFjdGl2YXRlcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUG9zdEFjdGl2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlUGFzc2l2YXRlcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUHJlUGFzc2l2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiA8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW5CZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkNsYXNzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnaW5nVHlwZSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2luZ1R5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lb3V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFyb3VuZEludm9rZXMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudiBFbnRyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RW52RW50cmllcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBEZXN0cm95czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtc19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiA8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRSb2xlTmFtZXMgPGVtPlJvbGUgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGUgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldFJvbGVOYW1lcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlVuY2hlY2tlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0VW5jaGVja2VkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0TWV0aG9kcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQZXJtaXNzaW9uX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlIDxlbT5NZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX0VqYk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RJbnRmIDxlbT5NZXRob2QgSW50ZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBJbnRmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX01ldGhvZEludGYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUgPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lZE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBzZWUgI2dldE5hbWVkTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE5hbWVkTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRNZXRob2RUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSA8ZW0+UXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UXVlcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFF1ZXJ5TWV0aG9kIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRRdWVyeU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFJlc3VsdFR5cGVNYXBwaW5nIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFJlc3VsdFR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlfUmVzdWx0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RWpiUWwgPGVtPkVqYiBRbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBRbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldEVqYlFsKCkKLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlfRWpiUWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRRdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kTmFtZSgpCi0JICogQHNlZSAjZ2V0UXVlcnlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5TWV0aG9kX01ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldE1ldGhvZFBhcmFtcygpCi0JICogQHNlZSAjZ2V0UXVlcnlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldElkKCkKLQkgKiBAc2VlICNnZXRRdWVyeU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlNZXRob2RfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldEVqYk5hbWUoKQotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVsYXRpb25zaGlwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RWpiUmVsYXRpb25zIDxlbT5FamIgUmVsYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVsYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyNnZXRFamJSZWxhdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldElkKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBzX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlIDxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QmVhbiBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldEJlYW5NZXRob2QoKQotCSAqIEBzZWUgI2dldFJlbW92ZU1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlbW92ZU1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNpc1JldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAc2VlICNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZW1vdmVNZXRob2RUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRVc2VDYWxsZXJJZGVudGl0eSA8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRVc2VDYWxsZXJJZGVudGl0eSgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1VzZUNhbGxlcklkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldFJ1bkFzIDxlbT5SdW4gQXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SdW4gQXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRSdW5BcygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1J1bkFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4gPGVtPlNlc3Npb24gQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXNzaW9uIEJlYW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2Vzc2lvbkJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYk5hbWUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9FamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRIb21lIDxlbT5Ib21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEhvbWUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Ib21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtb3RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVtb3RlKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fUmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbEhvbWUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Mb2NhbEhvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0xvY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NMb2NhbHMgPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QnVzaW5lc3MgTG9jYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NMb2NhbHMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc0xvY2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzUmVtb3RlcyA8ZW0+QnVzaW5lc3MgUmVtb3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QnVzaW5lc3MgUmVtb3RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzUmVtb3RlcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0J1c2luZXNzUmVtb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJDbGFzcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0VqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUaW1lb3V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEluaXRNZXRob2RzIDxlbT5Jbml0IE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgTWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEluaXRNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fSW5pdE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdmVNZXRob2RzIDxlbT5SZW1vdmUgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdmVNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFyb3VuZCBJbnZva2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kSW52b2tlcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52IEVudHJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYlJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlRGVzdHJveXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBvc3RBY3RpdmF0ZXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Qb3N0QWN0aXZhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBQYXNzaXZhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlUGFzc2l2YXRlcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1ByZVBhc3NpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlY3VyaXR5SWRlbnRpdGllcyA8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eUlkZW50aXRpZXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZWN1cml0eUlkZW50aXRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlIDxlbT5DbXAgVmVyc2lvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q21wIFZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldENtcFZlcnNpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZSA8ZW0+Q01SIEZpZWxkIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5DTVIgRmllbGQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRDTVJGaWVsZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZSA8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRNZXRob2RJbnRlcmZhY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUgPGVtPk11bHRpcGxpY2l0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TXVsdGlwbGljaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldE11bHRpcGxpY2l0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZXN1bHRUeXBlTWFwcGluZ1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRTZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUgPGVtPkNtcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DbXAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDbXBWZXJzaW9uVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZSA8ZW0+Q01SIEZpZWxkIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DTVIgRmllbGQgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENNUkZpZWxkVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNsYXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFamJDbGFzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVqYk5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZSA8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NZXRob2QgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NZXRob2QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWV0aG9kTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlIDxlbT5NdWx0aXBsaWNpdHkgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk11bHRpcGxpY2l0eSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE11bHRpcGxpY2l0eVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2Vzc2lvbiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXNzaW9uVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWQVRJT05fQ09ORklHID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX0NPTkZJR19fSUQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwgPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUFBMSUNBVElPTl9FWENFUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0V4Y2VwdGlvbkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xsYmFjazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0sgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fUm9sbGJhY2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fRVhDRVBUSU9OX19JRCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bcm91bmRJbnZva2VUeXBlSW1wbCA8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bcm91bmRJbnZva2VUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXJvdW5kSW52b2tlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUk9VTkRfSU5WT0tFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXJvdW5kSW52b2tlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUk9VTkRfSU5WT0tFX1RZUEVfX0NMQVNTID0gZUlOU1RBTkNFLmdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFTU0VNQkxZX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfQ29udGFpbmVyVHJhbnNhY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBCaW5kaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1MgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfQXBwbGljYXRpb25FeGNlcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0lEID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwgPGVtPkNNUCBGaWVsZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01QRmllbGRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVBGaWVsZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTVBfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0Q01QRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ01QX0ZJRUxEX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ01QX0ZJRUxEX19GSUVMRF9OQU1FID0gZUlOU1RBTkNFLmdldENNUEZpZWxkX0ZpZWxkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDTVBfRklFTERfX0lEID0gZUlOU1RBTkNFLmdldENNUEZpZWxkX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUkZpZWxkSW1wbCA8ZW0+Q01SIEZpZWxkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUkZpZWxkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENNUl9GSUVMRCA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDTVJfRklFTERfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ01SX0ZJRUxEX19DTVJfRklFTERfTkFNRSA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRSA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9DbXJGaWVsZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ01SX0ZJRUxEX19JRCA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTID0gZUlOU1RBTkNFLmdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9NZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFucyBBdHRyaWJ1dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fVFJBTlNfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9UcmFuc0F0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwgPGVtPkVKQiBKYXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQkphcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfSkFSID0gZUlOU1RBTkNFLmdldEVKQkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUyA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19JTlRFUkNFUFRPUlMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0ludGVyY2VwdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX1JFTEFUSU9OU0hJUFMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2VtYmx5IERlc2NyaXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGllbnQgSmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfSkFSX19JRCA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfSkFSX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldEVKQkphcl9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVIgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfRWpiSmFyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbCA8ZW0+RUpCIFJlbGF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQlJlbGF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9SRUxBVElPTiA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbnNoaXBSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05fX0lEID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIDxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9SRUxBVElPTlNISVBfUk9MRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgRGVsZXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q21yIEZpZWxkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0lEID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbCA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVOVEVSUFJJU0VfQkVBTlMgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5URVJQUklTRV9CRUFOU19fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5zX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuc19NZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5URVJQUklTRV9CRUFOU19fSUQgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsIDxlbT5FbnRpdHkgQmVhbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVudGl0eUJlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRU5USVRZX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19FSkJfTkFNRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0VqYk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19IT01FID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fSG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX1JFTU9URSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1JlbW90ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19MT0NBTF9IT01FID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fTG9jYWxIb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19MT0NBTCA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0xvY2FsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fRUpCX0NMQVNTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbSBLZXkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fUFJJTV9LRVlfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9QcmltS2V5Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZW50cmFudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19SRUVOVFJBTlQgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9SZWVudHJhbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fQ21wVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9BYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtcCBGaWVsZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19DTVBfRklFTERTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fQ21wRmllbGRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcmlta2V5IEZpZWxkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9FbnZFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0VqYkxvY2FsUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUHJlRGVzdHJveXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19JRCA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkV4Y2x1ZGVMaXN0SW1wbCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEV4Y2x1ZGVMaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVYQ0xVREVfTElTVCA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVYQ0xVREVfTElTVF9fTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdF9NZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYQ0xVREVfTElTVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW5pdE1ldGhvZFR5cGVJbXBsIDxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Jbml0TWV0aG9kVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEluaXRNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOSVRfTUVUSE9EX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW5pdE1ldGhvZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0ZSBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EID0gZUlOU1RBTkNFLmdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJbml0TWV0aG9kVHlwZV9CZWFuTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSVRfTUVUSE9EX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEluaXRNZXRob2RUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUiA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX01ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsIDxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yT3JkZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOVEVSQ0VQVE9SX09SREVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsIDxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JzVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yc1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5URVJDRVBUT1JTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JzVHlwZV9JbnRlcmNlcHRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JTX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yc1R5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOVEVSQ0VQVE9SX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9JbnRlcmNlcHRvckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUG9zdENvbnN0cnVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9QcmVEZXN0cm95cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUGFzc2l2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZVBhc3NpdmF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCA8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVNTQUdFX0RSSVZFTl9CRUFOID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTksgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9BY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0VudkVudHJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtc0ltcGwgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZFBhcmFtcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFSQU1TID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbXNfTWV0aG9kUGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQVJBTVNfX0lEID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtc19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbCA8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QRVJNSVNTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlTmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuY2hlY2tlZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEVSTUlTU0lPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RUeXBlSW1wbCA8ZW0+TWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldE1ldGhvZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVFlQRV9fRUpCX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHlwZV9FamJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9UWVBFX19NRVRIT0RfSU5URiA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlX01ldGhvZEludGYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FID0gZUlOU1RBTkNFLmdldE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TID0gZUlOU1RBTkNFLmdldE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk5hbWVkTWV0aG9kVHlwZUltcGwgPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5OYW1lZE1ldGhvZFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXROYW1lZE1ldGhvZFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfTUVUSE9EX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TID0gZUlOU1RBTkNFLmdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfTUVUSE9EX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldE5hbWVkTWV0aG9kVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwgPGVtPlF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFF1ZXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFFVRVJZID0gZUlOU1RBTkNFLmdldFF1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRRdWVyeV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUVVFUllfX1FVRVJZX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFF1ZXJ5X1Jlc3VsdFR5cGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fRUpCX1FMID0gZUlOU1RBTkNFLmdldFF1ZXJ5X0VqYlFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFVRVJZX19JRCA9IGVJTlNUQU5DRS5nZXRRdWVyeV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGwgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeU1ldGhvZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBRVUVSWV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TID0gZUlOU1RBTkNFLmdldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9NRVRIT0RfX0lEID0gZUlOU1RBTkNFLmdldFF1ZXJ5TWV0aG9kX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0VqYk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsIDxlbT5SZWxhdGlvbnNoaXBzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVsYXRpb25zaGlwcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRUxBVElPTlNISVBTID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFTEFUSU9OU0hJUFNfX0lEID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHNfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVtb3ZlTWV0aG9kVHlwZUltcGwgPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVtb3ZlTWV0aG9kVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbW92ZU1ldGhvZFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVNT1ZFX01FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldFJlbW92ZU1ldGhvZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRSZW1vdmVNZXRob2RUeXBlX0JlYW5NZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldGFpbiBJZiBFeGNlcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UmVtb3ZlTWV0aG9kVHlwZV9SZXRhaW5JZkV4Y2VwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRU1PVkVfTUVUSE9EX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsIDxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUlkZW50aXR5VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX0lERU5USVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIENhbGxlciBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5VHlwZV9SdW5BcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9JREVOVElUWV9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5VHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwgPGVtPlNlc3Npb24gQmVhbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uQmVhbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVNTSU9OX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0VKQl9OQU1FID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0VqYk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19IT01FID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0hvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fUkVNT1RFID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1JlbW90ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Mb2NhbEhvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19MT0NBTCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Mb2NhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnVzaW5lc3MgTG9jYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9CdXNpbmVzc0xvY2FscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnVzaW5lc3MgUmVtb3RlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0J1c2luZXNzUmVtb3RlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TZXJ2aWNlRW5kcG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fRUpCX0NMQVNTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0VqYkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fSW5pdE1ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW92ZSBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19FSkJfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9FamJSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1Jlc291cmNlRW52UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0lEID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZSA8ZW0+Q21wIFZlcnNpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENtcFZlcnNpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQ01QX1ZFUlNJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRDbXBWZXJzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlIDxlbT5DTVIgRmllbGQgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBDTVJfRklFTERfVFlQRSA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUgPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE1FVEhPRF9JTlRFUkZBQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RJbnRlcmZhY2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlIDxlbT5NdWx0aXBsaWNpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TXVsdGlwbGljaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE1VTFRJUExJQ0lUWV9UWVBFID0gZUlOU1RBTkNFLmdldE11bHRpcGxpY2l0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBQRVJTSVNURU5DRV9UWVBFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFID0gZUlOU1RBTkNFLmdldFJlc3VsdFR5cGVNYXBwaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gU0VTU0lPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5DbXAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDbXBWZXJzaW9uVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBDTVBfVkVSU0lPTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRDbXBWZXJzaW9uVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Q01SIEZpZWxkIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZFR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQ01SX0ZJRUxEX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldENNUkZpZWxkVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVqYkNsYXNzVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBFSkJfQ0xBU1NfVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJDbGFzc1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVqYk5hbWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVKQl9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiTmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1FVEhPRF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TWV0aG9kIE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZE5hbWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1FVEhPRF9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kTmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk11bHRpcGxpY2l0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE11bHRpcGxpY2l0eVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTVVMVElQTElDSVRZX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldE11bHRpcGxpY2l0eVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUEVSU0lTVEVOQ0VfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNlc3Npb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvblR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VTU0lPTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBUUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKTsKLQotCX0KLQotfSAvL0VqYlBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwYTAwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRWpiUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVqYlN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBFamJTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkV4Y2VwdGlvbihBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25FeGNlcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcm91bmRJbnZva2VUeXBlKEFyb3VuZEludm9rZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFyb3VuZEludm9rZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBGaWVsZChDTVBGaWVsZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ01QRmllbGRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJUcmFuc2FjdGlvblR5cGUoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJUcmFuc2FjdGlvblR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJKYXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcihFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnRlcnByaXNlQmVhbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHlCZWFuKEVudGl0eUJlYW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUJlYW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0TWV0aG9kVHlwZShJbml0TWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdE1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvckJpbmRpbmdUeXBlKEludGVyY2VwdG9yQmluZGluZ1R5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUludGVyY2VwdG9yQmluZGluZ1R5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvck9yZGVyVHlwZShJbnRlcmNlcHRvck9yZGVyVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW50ZXJjZXB0b3JPcmRlclR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvcnNUeXBlKEludGVyY2VwdG9yc1R5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUludGVyY2VwdG9yc1R5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvclR5cGUoSW50ZXJjZXB0b3JUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbnRlcmNlcHRvclR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuQmVhbihNZXNzYWdlRHJpdmVuQmVhbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkJlYW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQYXJhbXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RUeXBlKE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZE1ldGhvZFR5cGUoTmFtZWRNZXRob2RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZE1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUXVlcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZShSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZU1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUlkZW50aXR5VHlwZShTZWN1cml0eUlkZW50aXR5VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0eVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uQmVhbihTZXNzaW9uQmVhbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25FeGNlcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUgPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyb3VuZEludm9rZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCA8ZW0+Q01QIEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUEZpZWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCA8ZW0+Q01SIEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUkZpZWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJUcmFuc2FjdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciA8ZW0+RUpCIEphcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uIDxlbT5FSkIgUmVsYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUgPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50ZXJwcmlzZUJlYW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIDxlbT5FbnRpdHkgQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eUJlYW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0IDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlIDxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRNZXRob2RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmNlcHRvckJpbmRpbmdUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSA8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmNlcHRvck9yZGVyVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSA8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmNlcHRvcnNUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUgPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVyY2VwdG9yVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4gPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURyaXZlbkJlYW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFyYW1zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uIDxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUgPGVtPk1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlIDxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWRNZXRob2RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSA8ZW0+UXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUgPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbW92ZU1ldGhvZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlIDxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiA8ZW0+U2Vzc2lvbiBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25CZWFuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0VqYkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNkNTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MT3B0aW9uc0ltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5FamJSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEVqYlJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJWE1MT3B0aW9ucyB4bWxPcHRpb25zID0gbmV3IFhNTE9wdGlvbnNJbXBsKCk7Ci0KLQkJeG1sT3B0aW9ucy5zZXRQcm9jZXNzU2NoZW1hTG9jYXRpb25zKHRydWUpOwotCQkgICAgCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9PUFRJT05TLCB4bWxPcHRpb25zKTsKLQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL0VqYlJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhlYTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTExvYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkpFRVhNTExvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSUVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklSb290T2JqZWN0UmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC51dGlsLkVqYlJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlJlc291cmNlSW1wbCBleHRlbmRzIEphdmFlZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElSb290T2JqZWN0UmVzb3VyY2UsIElFSkJSZXNvdXJjZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCSByZXR1cm4gbmV3IEpFRVhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgRWpiWE1MSGVscGVySW1wbCh0aGlzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5JRUpCUmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByb290ID0gZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCWlmKHJvb3QgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpKChFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcilyb290KS5nZXRFamJKYXIoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5JRUpCUmVzb3VyY2UjZ2V0RWpiSmFyKCkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldEVqYkphcigpIHsKLQkJcmV0dXJuIChFSkJKYXIpZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotfSAvL0VqYlJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTE4YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJRzogewotCQkJCUFjdGl2YXRpb25Db25maWcgYWN0aXZhdGlvbkNvbmZpZyA9IChBY3RpdmF0aW9uQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uQ29uZmlnKGFjdGl2YXRpb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogewotCQkJCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPSAoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OOiB7Ci0JCQkJQXBwbGljYXRpb25FeGNlcHRpb24gYXBwbGljYXRpb25FeGNlcHRpb24gPSAoQXBwbGljYXRpb25FeGNlcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uRXhjZXB0aW9uKGFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFOiB7Ci0JCQkJQXJvdW5kSW52b2tlVHlwZSBhcm91bmRJbnZva2VUeXBlID0gKEFyb3VuZEludm9rZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFyb3VuZEludm9rZVR5cGUoYXJvdW5kSW52b2tlVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHsKLQkJCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gKEFzc2VtYmx5RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRDogewotCQkJCUNNUEZpZWxkIGNtcEZpZWxkID0gKENNUEZpZWxkKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDTVBGaWVsZChjbXBGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRDogewotCQkJCUNNUkZpZWxkIGNtckZpZWxkID0gKENNUkZpZWxkKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDTVJGaWVsZChjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFOiB7Ci0JCQkJQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSA9IChDb250YWluZXJUcmFuc2FjdGlvblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZShjb250YWluZXJUcmFuc2FjdGlvblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSOiB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphcihlamJKYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogewotCQkJCUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yID0gKEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcihlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogewotCQkJCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gKEVKQlJlbGF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbihlamJSZWxhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRTogewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgZWpiUmVsYXRpb25zaGlwUm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKGVqYlJlbGF0aW9uc2hpcFJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TOiB7Ci0JCQkJRW50ZXJwcmlzZUJlYW5zIGVudGVycHJpc2VCZWFucyA9IChFbnRlcnByaXNlQmVhbnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFucyhlbnRlcnByaXNlQmVhbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTjogewotCQkJCUVudGl0eUJlYW4gZW50aXR5QmVhbiA9IChFbnRpdHlCZWFuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnRpdHlCZWFuKGVudGl0eUJlYW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1Q6IHsKLQkJCQlFeGNsdWRlTGlzdCBleGNsdWRlTGlzdCA9IChFeGNsdWRlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhjbHVkZUxpc3QoZXhjbHVkZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFOiB7Ci0JCQkJSW5pdE1ldGhvZFR5cGUgaW5pdE1ldGhvZFR5cGUgPSAoSW5pdE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluaXRNZXRob2RUeXBlKGluaXRNZXRob2RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFOiB7Ci0JCQkJSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBpbnRlcmNlcHRvckJpbmRpbmdUeXBlID0gKEludGVyY2VwdG9yQmluZGluZ1R5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yQmluZGluZ1R5cGUoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEU6IHsKLQkJCQlJbnRlcmNlcHRvck9yZGVyVHlwZSBpbnRlcmNlcHRvck9yZGVyVHlwZSA9IChJbnRlcmNlcHRvck9yZGVyVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW50ZXJjZXB0b3JPcmRlclR5cGUoaW50ZXJjZXB0b3JPcmRlclR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRTogewotCQkJCUludGVyY2VwdG9yc1R5cGUgaW50ZXJjZXB0b3JzVHlwZSA9IChJbnRlcmNlcHRvcnNUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbnRlcmNlcHRvcnNUeXBlKGludGVyY2VwdG9yc1R5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFOiB7Ci0JCQkJSW50ZXJjZXB0b3JUeXBlIGludGVyY2VwdG9yVHlwZSA9IChJbnRlcmNlcHRvclR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yVHlwZShpbnRlcmNlcHRvclR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOOiB7Ci0JCQkJTWVzc2FnZURyaXZlbkJlYW4gbWVzc2FnZURyaXZlbkJlYW4gPSAoTWVzc2FnZURyaXZlbkJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEcml2ZW5CZWFuKG1lc3NhZ2VEcml2ZW5CZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNUzogewotCQkJCU1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXMgPSAoTWV0aG9kUGFyYW1zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RQYXJhbXMobWV0aG9kUGFyYW1zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT046IHsKLQkJCQlNZXRob2RQZXJtaXNzaW9uIG1ldGhvZFBlcm1pc3Npb24gPSAoTWV0aG9kUGVybWlzc2lvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGVybWlzc2lvbihtZXRob2RQZXJtaXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEU6IHsKLQkJCQlNZXRob2RUeXBlIG1ldGhvZFR5cGUgPSAoTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kVHlwZShtZXRob2RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEU6IHsKLQkJCQlOYW1lZE1ldGhvZFR5cGUgbmFtZWRNZXRob2RUeXBlID0gKE5hbWVkTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTmFtZWRNZXRob2RUeXBlKG5hbWVkTWV0aG9kVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZOiB7Ci0JCQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVF1ZXJ5KHF1ZXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EOiB7Ci0JCQkJUXVlcnlNZXRob2QgcXVlcnlNZXRob2QgPSAoUXVlcnlNZXRob2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVF1ZXJ5TWV0aG9kKHF1ZXJ5TWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEU6IHsKLQkJCQlSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSByZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSA9IChSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTOiB7Ci0JCQkJUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gKFJlbGF0aW9uc2hpcHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRTogewotCQkJCVJlbW92ZU1ldGhvZFR5cGUgcmVtb3ZlTWV0aG9kVHlwZSA9IChSZW1vdmVNZXRob2RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZW1vdmVNZXRob2RUeXBlKHJlbW92ZU1ldGhvZFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFOiB7Ci0JCQkJU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0eVR5cGUgPSAoU2VjdXJpdHlJZGVudGl0eVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5SWRlbnRpdHlUeXBlKHNlY3VyaXR5SWRlbnRpdHlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOOiB7Ci0JCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbkJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlc3Npb25CZWFuKHNlc3Npb25CZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oQXBwbGljYXRpb25FeGNlcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcm91bmRJbnZva2VUeXBlKEFyb3VuZEludm9rZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVAgRmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBGaWVsZChDTVBGaWVsZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNNUkZpZWxkKENNUkZpZWxkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZShDb250YWluZXJUcmFuc2FjdGlvblR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBKYXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW5zKEVudGVycHJpc2VCZWFucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGl0eSBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGl0eSBCZWFuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHlCZWFuKEVudGl0eUJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5pdE1ldGhvZFR5cGUoSW5pdE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvckJpbmRpbmdUeXBlKEludGVyY2VwdG9yQmluZGluZ1R5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yT3JkZXJUeXBlKEludGVyY2VwdG9yT3JkZXJUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yc1R5cGUoSW50ZXJjZXB0b3JzVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JUeXBlKEludGVyY2VwdG9yVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkJlYW4oTWVzc2FnZURyaXZlbkJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGVybWlzc2lvbihNZXRob2RQZXJtaXNzaW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFR5cGUoTWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZE1ldGhvZFR5cGUoTmFtZWRNZXRob2RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlbGF0aW9uc2hpcHMoUmVsYXRpb25zaGlwcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlbW92ZU1ldGhvZFR5cGUoUmVtb3ZlTWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eVR5cGUoU2VjdXJpdHlJZGVudGl0eVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uQmVhbihTZXNzaW9uQmVhbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vRWpiU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI0ODFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KRUVYTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFamJYTUxIZWxwZXJJbXBsIGV4dGVuZHMgSkVFWE1MSGVscGVySW1wbCB7Ci0KLQlwdWJsaWMgRWpiWE1MSGVscGVySW1wbChYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoIiIpKQotCQkJcmV0dXJuIEVqYlBhY2thZ2UuZU5TX1VSSTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFFOYW1lKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCkKLQkgIHsKLQkgICBTdHJpbmcgbnNQcmVmaXggPSBnZXRQcmVmaXgoZVBhY2thZ2UsIG11c3RIYXZlUHJlZml4KTsKLQkgICAvLyBOb3QgdXNpbmcgRUU1IHBhY2thZ2UgbmFtZXNwYWNlIC0gZGVmYXVsdCBqZWU1IG5hbWVzcGFjZSBpcyB1c2VkCi0JICAgaWYgKG5zUHJlZml4LmVxdWFscyhFamJQYWNrYWdlLmVOU19QUkVGSVgpKSAKLQkgICAgewotCSAgICAJcmV0dXJuIG5hbWU7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0UU5hbWUoZVBhY2thZ2UsIG5hbWUsIG11c3RIYXZlUHJlZml4KTsKLQkgIH0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJYTUxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhNGI4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgWE1MIGRvY3VtZW50cwotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiWE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiWE1MUHJvY2Vzc29yKCkgewotCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKLQkJRWpiUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgRWpiUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IEVqYlJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IEVqYlJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vRWpiWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BDb25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRmNGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLSAqIAlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0gKiAJdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0SnNwUHJvcGVydHlHcm91cHMgPGVtPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwQ29uZmlnKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpzcENvbmZpZyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnIExpYnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWcgTGliczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFRhZ0xpYnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BDb25maWdfSnNwUHJvcGVydHlHcm91cHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEpzcFByb3BlcnR5R3JvdXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwQ29uZmlnX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSnNwQ29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDMzNTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNwRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uZmlnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKc3BDb25maWcgY3JlYXRlSnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwUHJvcGVydHlHcm91cCBjcmVhdGVKc3BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBMaWI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBMaWI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ0xpYiBjcmVhdGVUYWdMaWIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwUGFja2FnZSBnZXRKc3BQYWNrYWdlKCk7Ci0KLX0gLy9Kc3BGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BQcm9wZXJ0eUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BQcm9wZXJ0eUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmVkZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwUHJvcGVydHlHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotICogCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLSAqIAlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCi0gKiAJZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotICogCi0gKiAJICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQuCi0gKiAJICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZC4KLSAqIAkgICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCi0gKiAJICAgIC0gSW5kaWNhdGUgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50IChYTUwpLgotICogCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotICogICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyBhbGxvd2VkCi0gKiAgICAgICAgICAgICAgIHdoZW4gdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLgotICogICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkKLSAqICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNJc1htbCA8ZW0+SXMgWG1sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVQcmVsdWRlcyA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpzcFByb3BlcnR5R3JvdXAgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFVybFBhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbCBJZ25vcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCi0JICogCSAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotCSAqIAkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0JICogCSAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCi0JICogCSAgICBvdGhlcndpc2UuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjc2V0RWxJZ25vcmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VsSWdub3JlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCA8ZW0+RWwgSWdub3JlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWwgSWdub3JlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI3Vuc2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICNpc0VsSWdub3JlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxJZ25vcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBzZWUgI3NldEVsSWdub3JlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWxJZ25vcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBzZWUgI3NldEVsSWdub3JlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWxJZ25vcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWdlIEVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0JICogCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCi0JICogCSAgICB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncwotCSAqIAkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCi0JICogCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiAJICAgIG1hdGNoaW5nIHRoZSBwYWdlLiAgSXQgaXMgYWxzbyBhIHRyYW5zbGF0aW9uLXRpbWUKLQkgKiAJICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCi0JICogCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKLQkgKiAJICAgIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBtYXRjaGluZyB0aGUgZG9jdW1lbnQuCi0JICogCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKLQkgKiAJICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhZ2VFbmNvZGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY3JpcHRpbmcgSW52YWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQotCSAqIAkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0JICogCSAgICBlbmFibGVkLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3NldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NjcmlwdGluZ0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3NldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNjcmlwdGluZ0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBYbWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgKiAJICAgIHRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCSAqIAkgICAgYW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLgotCSAqIAkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JICogCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgotCSAqIAkgICAgcHJvcGVydHkgZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBYbWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNYbWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNYbWwoKQotCSAqIEBzZWUgI3NldElzWG1sKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSXNYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNYbWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNJc1htbCA8ZW0+SXMgWG1sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBYbWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNYbWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNYbWwoKQotCSAqIEBzZWUgI2lzSXNYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzWG1sKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1htbCgpCi0JICogQHNlZSAjaXNJc1htbCgpCi0JICogQHNlZSAjc2V0SXNYbWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNJc1htbCA8ZW0+SXMgWG1sPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBYbWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzWG1sKCkKLQkgKiBAc2VlICNpc0lzWG1sKCkKLQkgKiBAc2VlICNzZXRJc1htbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAqIAkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAqIAkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAqIAkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotCSAqIAkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotCSAqIAkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmNsdWRlUHJlbHVkZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGUgQ29kYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAqIAkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAqIAkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAqIAkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotCSAqIAkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAotCSAqIAkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ29kYXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmNsdWRlQ29kYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgICBUaGUgY2hhcmFjdGVyIHNlcXVlbmNlICN7IGlzIHJlc2VydmVkIGZvciBFTCBleHByZXNzaW9ucy4KLQkgKiAgICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBhIHRyYW5zbGF0aW9uIGVycm9yIG9jY3VycyBpZiB0aGUgI3sKLQkgKiAgICAgICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbCwgdW5sZXNzCi0JICogICAgICAgICAgICAgIHRoaXMgZWxlbWVudCBpcyBlbmFibGVkICh0cnVlKS4gRGlzYWJsZWQgKGZhbHNlKSBieQotCSAqICAgICAgICAgICAgICBkZWZhdWx0LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQHNlZSAjdW5zZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI3NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICN1bnNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQHNlZSAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0ZW1wbGF0ZSB0ZXh0IGNvbnRhaW5pbmcgb25seSB3aGl0ZXNwYWNlcwotCSAqICAgICAgICAgICAgICBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugb3V0cHV0LiBJdCBoYXMgbm8KLQkgKiAgICAgICAgICAgICAgZWZmZWN0IG9uIEpTUCBkb2N1bWVudHMgKFhNTCBzeW50YXgpLiBEaXNhYmxlZCAoZmFsc2UpCi0JICogICAgICAgICAgICAgIGJ5IGRlZmF1bHQuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQHNlZSAjdW5zZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI3NldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI3Vuc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNzZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQHNlZSAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI3NldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBKc3BQcm9wZXJ0eUdyb3VwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9UYWdMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5NGZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9UYWdMaWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0gKiAJdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKLSAqIAlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotICogCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotICogCWZyb20gdGhlIGNvbnRhaW5lci4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYlVyaSA8ZW0+VGFnbGliIFVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0VGFnTGliKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0xpYiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnbGliIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQotCSAqIAkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgKiAJICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAqIAkgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgotCSAqIAkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAqIAkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgVXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWdsaWJVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRUYWdMaWJfVGFnbGliVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhZ2xpYlVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYlVyaSA8ZW0+VGFnbGliIFVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIFVyaTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFnbGliVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJVcmkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICogCSAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JICogCSAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKLQkgKiAJICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldFRhZ0xpYl9UYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJMb2NhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhZ2xpYkxvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0VGFnTGliX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGFnTGliClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BDb25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcENvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMTIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcENvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcENvbmZpZ0ltcGwjZ2V0VGFnTGlicyA8ZW0+VGFnIExpYnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwQ29uZmlnSW1wbCNnZXRKc3BQcm9wZXJ0eUdyb3VwcyA8ZW0+SnNwIFByb3BlcnR5IEdyb3VwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BDb25maWdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcENvbmZpZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpzcENvbmZpZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnTGlicygpIDxlbT5UYWcgTGliczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdMaWJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnTGlicyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BQcm9wZXJ0eUdyb3VwcygpIDxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QganNwUHJvcGVydHlHcm91cHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSnNwQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuSlNQX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYWdMaWJzKCkgewotCQlpZiAodGFnTGlicyA9PSBudWxsKSB7Ci0JCQl0YWdMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhZ0xpYi5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ0xpYnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SnNwUHJvcGVydHlHcm91cHMoKSB7Ci0JCWlmIChqc3BQcm9wZXJ0eUdyb3VwcyA9PSBudWxsKSB7Ci0JCQlqc3BQcm9wZXJ0eUdyb3VwcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFMpOwotCQl9Ci0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdMaWJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SnNwUHJvcGVydHlHcm91cHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIGdldFRhZ0xpYnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiBnZXRKc3BQcm9wZXJ0eUdyb3VwcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJZ2V0VGFnTGlicygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFnTGlicygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJZ2V0SnNwUHJvcGVydHlHcm91cHMoKS5jbGVhcigpOwotCQkJCWdldEpzcFByb3BlcnR5R3JvdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUzoKLQkJCQlnZXRKc3BQcm9wZXJ0eUdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gdGFnTGlicyAhPSBudWxsICYmICF0YWdMaWJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwcyAhPSBudWxsICYmICFqc3BQcm9wZXJ0eUdyb3Vwcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0pzcENvbmZpZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjFiNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKc3BGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKc3BGYWN0b3J5IHRoZUpzcEZhY3RvcnkgPSAoSnNwRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2pzcCIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZUpzcEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKc3BGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzcEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSnNwQ29uZmlnKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSnNwUHJvcGVydHlHcm91cCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUI6IHJldHVybiAoRU9iamVjdCljcmVhdGVUYWdMaWIoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9GSUxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUpzcEZpbGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfRklMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SnNwRmlsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BDb25maWcgY3JlYXRlSnNwQ29uZmlnKCkgewotCQlKc3BDb25maWdJbXBsIGpzcENvbmZpZyA9IG5ldyBKc3BDb25maWdJbXBsKCk7Ci0JCXJldHVybiBqc3BDb25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcFByb3BlcnR5R3JvdXAgY3JlYXRlSnNwUHJvcGVydHlHcm91cCgpIHsKLQkJSnNwUHJvcGVydHlHcm91cEltcGwganNwUHJvcGVydHlHcm91cCA9IG5ldyBKc3BQcm9wZXJ0eUdyb3VwSW1wbCgpOwotCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFnTGliIGNyZWF0ZVRhZ0xpYigpIHsKLQkJVGFnTGliSW1wbCB0YWdMaWIgPSBuZXcgVGFnTGliSW1wbCgpOwotCQlyZXR1cm4gdGFnTGliOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSnNwRmlsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBBVEhfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKc3BGaWxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QQVRIX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BQYWNrYWdlIGdldEpzcFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSnNwUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Kc3BGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE5YjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSnNwUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFnTGliRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpzcEZpbGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEpzcFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBKc3BGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpzcFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEpzcFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKc3BQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUpzcFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUpzcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKc3BDb25maWcoKSB7Ci0JCXJldHVybiBqc3BDb25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BDb25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKc3BDb25maWdfSnNwUHJvcGVydHlHcm91cHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BDb25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BDb25maWdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BDb25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpzcFByb3BlcnR5R3JvdXAoKSB7Ci0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SnNwUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9Jc1htbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnTGliKCkgewotCQlyZXR1cm4gdGFnTGliRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYl9UYWdsaWJVcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEpzcEZpbGVUeXBlKCkgewotCQlyZXR1cm4ganNwRmlsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcEZhY3RvcnkgZ2V0SnNwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChKc3BGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWpzcENvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BDb25maWdFQ2xhc3MsIEpTUF9DT05GSUdfX1RBR19MSUJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BDb25maWdFQ2xhc3MsIEpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcENvbmZpZ0VDbGFzcywgSlNQX0NPTkZJR19fSUQpOwotCi0JCWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1BST1BFUlRZX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lEKTsKLQotCQl0YWdMaWJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFHX0xJQik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliRUNsYXNzLCBUQUdfTElCX19UQUdMSUJfVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1RBR0xJQl9MT0NBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliRUNsYXNzLCBUQUdfTElCX19JRCk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJanNwRmlsZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSlNQX0ZJTEVfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGpzcENvbmZpZ0VDbGFzcywgSnNwQ29uZmlnLmNsYXNzLCAiSnNwQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcENvbmZpZ19UYWdMaWJzKCksIHRoaXMuZ2V0VGFnTGliKCksIG51bGwsICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIEpzcENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRKc3BDb25maWdfSnNwUHJvcGVydHlHcm91cHMoKSwgdGhpcy5nZXRKc3BQcm9wZXJ0eUdyb3VwKCksIG51bGwsICJqc3BQcm9wZXJ0eUdyb3VwcyIsIG51bGwsIDAsIC0xLCBKc3BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwQ29uZmlnX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEpzcENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIkpzcFByb3BlcnR5R3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFVybFBhdHRlcm5UeXBlKCksIG51bGwsICJ1cmxQYXR0ZXJucyIsIG51bGwsIDEsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZWxJZ25vcmVkIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGFnZUVuY29kaW5nIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAic2NyaXB0aW5nSW52YWxpZCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9Jc1htbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImlzWG1sIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJpbmNsdWRlUHJlbHVkZXMiLCBudWxsLCAwLCAtMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh0YWdMaWJFQ2xhc3MsIFRhZ0xpYi5jbGFzcywgIlRhZ0xpYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnbGliVXJpKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJ0YWdsaWJVcmkiLCBudWxsLCAxLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9UYWdsaWJMb2NhdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJ0YWdsaWJMb2NhdGlvbiIsIG51bGwsIDEsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGpzcEZpbGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKc3BGaWxlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoanNwQ29uZmlnRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJqc3AtY29uZmlnVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BDb25maWdfVGFnTGlicygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidGFnbGliIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJqc3AtcHJvcGVydHktZ3JvdXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BDb25maWdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqc3BGaWxlVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAianNwLWZpbGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSNwYXRoVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm5zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ1cmwtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWwtaWdub3JlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGFnZS1lbmNvZGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNjcmlwdGluZy1pbnZhbGlkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfSXNYbWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlzLXhtbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5jbHVkZS1wcmVsdWRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmNsdWRlLWNvZGEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9EZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlZmVycmVkLXN5bnRheC1hbGxvd2VkLWFzLWxpdGVyYWwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRyaW0tZGlyZWN0aXZlLXdoaXRlc3BhY2VzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhZ0xpYkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidGFnbGliVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFnTGliX1RhZ2xpYlVyaSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidGFnbGliLXVyaSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRhZ2xpYi1sb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhZ0xpYl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL0pzcFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFByb3BlcnR5R3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFByb3BlcnR5R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmJkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNJc1htbCA8ZW0+SXMgWG1sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldEluY2x1ZGVQcmVsdWRlcyA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFByb3BlcnR5R3JvdXBJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKc3BQcm9wZXJ0eUdyb3VwIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJucygpIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB1cmxQYXR0ZXJucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbElnbm9yZWQoKSA8ZW0+RWwgSWdub3JlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTF9JR05PUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VsSWdub3JlZCgpIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VsSWdub3JlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxJZ25vcmVkID0gRUxfSUdOT1JFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWwgSWdub3JlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxJZ25vcmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZ2VFbmNvZGluZygpIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfRU5DT0RJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFnZUVuY29kaW5nKCkgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWdlRW5jb2RpbmcgPSBQQUdFX0VOQ09ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2NyaXB0aW5nSW52YWxpZCgpIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2NyaXB0aW5nSW52YWxpZCgpIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzY3JpcHRpbmdJbnZhbGlkID0gU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNjcmlwdGluZyBJbnZhbGlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzY3JpcHRpbmdJbnZhbGlkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNYbWwoKSA8ZW0+SXMgWG1sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfWE1MX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzWG1sKCkgPGVtPklzIFhtbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1htbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYbWwgPSBJU19YTUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFhtbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYbWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlUHJlbHVkZXMoKSA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmNsdWRlUHJlbHVkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmNsdWRlUHJlbHVkZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZUNvZGFzKCkgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZUNvZGFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZUNvZGFzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPSBERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSA8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzID0gVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKc3BQcm9wZXJ0eUdyb3VwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuSlNQX1BST1BFUlRZX0dST1VQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVcmxQYXR0ZXJucygpIHsKLQkJaWYgKHVybFBhdHRlcm5zID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVybFBhdHRlcm5UeXBlLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TKTsKLQkJfQotCQlyZXR1cm4gdXJsUGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbElnbm9yZWQoKSB7Ci0JCXJldHVybiBlbElnbm9yZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxJZ25vcmVkKGJvb2xlYW4gbmV3RWxJZ25vcmVkKSB7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkID0gZWxJZ25vcmVkOwotCQllbElnbm9yZWQgPSBuZXdFbElnbm9yZWQ7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkRVNldCA9IGVsSWdub3JlZEVTZXQ7Ci0JCWVsSWdub3JlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCwgb2xkRWxJZ25vcmVkLCBlbElnbm9yZWQsICFvbGRFbElnbm9yZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbElnbm9yZWQoKSB7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkID0gZWxJZ25vcmVkOwotCQlib29sZWFuIG9sZEVsSWdub3JlZEVTZXQgPSBlbElnbm9yZWRFU2V0OwotCQllbElnbm9yZWQgPSBFTF9JR05PUkVEX0VERUZBVUxUOwotCQllbElnbm9yZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQsIG9sZEVsSWdub3JlZCwgRUxfSUdOT1JFRF9FREVGQVVMVCwgb2xkRWxJZ25vcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWxJZ25vcmVkKCkgewotCQlyZXR1cm4gZWxJZ25vcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIHBhZ2VFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlRW5jb2RpbmcoU3RyaW5nIG5ld1BhZ2VFbmNvZGluZykgewotCQlTdHJpbmcgb2xkUGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nOwotCQlwYWdlRW5jb2RpbmcgPSBuZXdQYWdlRW5jb2Rpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HLCBvbGRQYWdlRW5jb2RpbmcsIHBhZ2VFbmNvZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJcmV0dXJuIHNjcmlwdGluZ0ludmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuIG5ld1NjcmlwdGluZ0ludmFsaWQpIHsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkID0gc2NyaXB0aW5nSW52YWxpZDsKLQkJc2NyaXB0aW5nSW52YWxpZCA9IG5ld1NjcmlwdGluZ0ludmFsaWQ7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQgPSBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQkJc2NyaXB0aW5nSW52YWxpZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQsIG9sZFNjcmlwdGluZ0ludmFsaWQsIHNjcmlwdGluZ0ludmFsaWQsICFvbGRTY3JpcHRpbmdJbnZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkID0gc2NyaXB0aW5nSW52YWxpZDsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkRVNldCA9IHNjcmlwdGluZ0ludmFsaWRFU2V0OwotCQlzY3JpcHRpbmdJbnZhbGlkID0gU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQ7Ci0JCXNjcmlwdGluZ0ludmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElELCBvbGRTY3JpcHRpbmdJbnZhbGlkLCBTQ1JJUFRJTkdfSU5WQUxJRF9FREVGQVVMVCwgb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzWG1sKCkgewotCQlyZXR1cm4gaXNYbWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNYbWwoYm9vbGVhbiBuZXdJc1htbCkgewotCQlib29sZWFuIG9sZElzWG1sID0gaXNYbWw7Ci0JCWlzWG1sID0gbmV3SXNYbWw7Ci0JCWJvb2xlYW4gb2xkSXNYbWxFU2V0ID0gaXNYbWxFU2V0OwotCQlpc1htbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MLCBvbGRJc1htbCwgaXNYbWwsICFvbGRJc1htbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzWG1sKCkgewotCQlib29sZWFuIG9sZElzWG1sID0gaXNYbWw7Ci0JCWJvb2xlYW4gb2xkSXNYbWxFU2V0ID0gaXNYbWxFU2V0OwotCQlpc1htbCA9IElTX1hNTF9FREVGQVVMVDsKLQkJaXNYbWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCwgb2xkSXNYbWwsIElTX1hNTF9FREVGQVVMVCwgb2xkSXNYbWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1htbCgpIHsKLQkJcmV0dXJuIGlzWG1sRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmNsdWRlUHJlbHVkZXMoKSB7Ci0JCWlmIChpbmNsdWRlUHJlbHVkZXMgPT0gbnVsbCkgewotCQkJaW5jbHVkZVByZWx1ZGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMpOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlUHJlbHVkZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5jbHVkZUNvZGFzKCkgewotCQlpZiAoaW5jbHVkZUNvZGFzID09IG51bGwpIHsKLQkJCWluY2x1ZGVDb2RhcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZUNvZGFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkgewotCQlyZXR1cm4gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbChib29sZWFuIG5ld0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCkgewotCQlib29sZWFuIG9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA9IGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbDsKLQkJZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsID0gbmV3RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsOwotCQlib29sZWFuIG9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQgPSBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0OwotCQlkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUwsIG9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCwgZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsLCAhb2xkRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkgewotCQlib29sZWFuIG9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA9IGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbDsKLQkJYm9vbGVhbiBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0ID0gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldDsKLQkJZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsID0gREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTF9FREVGQVVMVDsKLQkJZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMLCBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwsIERFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUxfRURFRkFVTFQsIG9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSB7Ci0JCXJldHVybiB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKGJvb2xlYW4gbmV3VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKSB7Ci0JCWJvb2xlYW4gb2xkVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzID0gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzOwotCQl0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPSBuZXdUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXM7Ci0JCWJvb2xlYW4gb2xkVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldCA9IHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQ7Ci0JCXRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMsIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcywgdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzLCAhb2xkVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkgewotCQlib29sZWFuIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA9IHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlczsKLQkJYm9vbGVhbiBvbGRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0ID0gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldDsKLQkJdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzID0gVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVNfRURFRkFVTFQ7Ci0JCXRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMsIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcywgVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVNfRURFRkFVTFQsIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpIHsKLQkJcmV0dXJuIHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm5zKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc0VsSWdub3JlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldFBhZ2VFbmNvZGluZygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2NyaXB0aW5nSW52YWxpZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlyZXR1cm4gaXNJc1htbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJcmV0dXJuIGdldEluY2x1ZGVQcmVsdWRlcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZUNvZGFzKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMOgotCQkJCXJldHVybiBpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgotCQkJCXJldHVybiBpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TOgotCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQlzZXRFbElnbm9yZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlzZXRQYWdlRW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJc2V0U2NyaXB0aW5nSW52YWxpZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJc2V0SXNYbWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVQcmVsdWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlnZXRJbmNsdWRlQ29kYXMoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVDb2RhcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTDoKLQkJCQlzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVM6Ci0JCQkJc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQl1bnNldEVsSWdub3JlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJc2V0UGFnZUVuY29kaW5nKFBBR0VfRU5DT0RJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXVuc2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQl1bnNldElzWG1sKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJZ2V0SW5jbHVkZUNvZGFzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMOgotCQkJCXVuc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVM6Ci0JCQkJdW5zZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiB1cmxQYXR0ZXJucyAhPSBudWxsICYmICF1cmxQYXR0ZXJucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc1NldEVsSWdub3JlZCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlyZXR1cm4gUEFHRV9FTkNPRElOR19FREVGQVVMVCA9PSBudWxsID8gcGFnZUVuY29kaW5nICE9IG51bGwgOiAhUEFHRV9FTkNPRElOR19FREVGQVVMVC5lcXVhbHMocGFnZUVuY29kaW5nKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXJldHVybiBpc1NldFNjcmlwdGluZ0ludmFsaWQoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlyZXR1cm4gaXNTZXRJc1htbCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlyZXR1cm4gaW5jbHVkZVByZWx1ZGVzICE9IG51bGwgJiYgIWluY2x1ZGVQcmVsdWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCXJldHVybiBpbmNsdWRlQ29kYXMgIT0gbnVsbCAmJiAhaW5jbHVkZUNvZGFzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUw6Ci0JCQkJcmV0dXJuIGlzU2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUzoKLQkJCQlyZXR1cm4gaXNTZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWxJZ25vcmVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZWxJZ25vcmVkRVNldCkgcmVzdWx0LmFwcGVuZChlbElnbm9yZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIHBhZ2VFbmNvZGluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYWdlRW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjcmlwdGluZ0ludmFsaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzY3JpcHRpbmdJbnZhbGlkRVNldCkgcmVzdWx0LmFwcGVuZChzY3JpcHRpbmdJbnZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1htbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzWG1sRVNldCkgcmVzdWx0LmFwcGVuZChpc1htbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZVByZWx1ZGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVQcmVsdWRlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZUNvZGFzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVDb2Rhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCkgcmVzdWx0LmFwcGVuZChkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQpIHJlc3VsdC5hcHBlbmQodHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0pzcFByb3BlcnR5R3JvdXBJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwMGE0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbCNnZXRUYWdsaWJVcmkgPGVtPlRhZ2xpYiBVcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbCNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFnTGliSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGFnTGliIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliVXJpKCkgPGVtPlRhZ2xpYiBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJVcmkoKSA8ZW0+VGFnbGliIFVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhZ2xpYlVyaSA9IFRBR0xJQl9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliTG9jYXRpb24oKSA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkxvY2F0aW9uKCkgPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnbGliTG9jYXRpb24gPSBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYWdMaWJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5UQUdfTElCOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliVXJpKCkgewotCQlyZXR1cm4gdGFnbGliVXJpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYlVyaShTdHJpbmcgbmV3VGFnbGliVXJpKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJVcmkgPSB0YWdsaWJVcmk7Ci0JCXRhZ2xpYlVyaSA9IG5ld1RhZ2xpYlVyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfVVJJLCBvbGRUYWdsaWJVcmksIHRhZ2xpYlVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0YWdsaWJMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgbmV3VGFnbGliTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYkxvY2F0aW9uID0gdGFnbGliTG9jYXRpb247Ci0JCXRhZ2xpYkxvY2F0aW9uID0gbmV3VGFnbGliTG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0xPQ0FUSU9OLCBvbGRUYWdsaWJMb2NhdGlvbiwgdGFnbGliTG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLlRBR19MSUJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gZ2V0VGFnbGliVXJpKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRUYWdsaWJMb2NhdGlvbigpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSToKLQkJCQlzZXRUYWdsaWJVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlzZXRUYWdsaWJMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVyaShUQUdMSUJfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBUQUdMSUJfVVJJX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJVcmkgIT0gbnVsbCA6ICFUQUdMSUJfVVJJX0VERUZBVUxULmVxdWFscyh0YWdsaWJVcmkpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlyZXR1cm4gVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJMb2NhdGlvbiAhPSBudWxsIDogIVRBR0xJQl9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHModGFnbGliTG9jYXRpb24pOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnbGliVXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRhZ2xpYlVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFnbGliTG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFnTGliSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL21ldGFkYXRhL0pzcFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL21ldGFkYXRhL0pzcFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzZjQ4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9tZXRhZGF0YS9Kc3BQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgQCgjKWpzcF8yXzEueHNkcwkxLjUgMDgvMTEvMDUKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4xIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMSBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gKiAgICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAqICAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0gKiAKLSAqICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNS54c2QKLSAqICAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICogCi0gKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAotICogICAgIAotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNwUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qc3AiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwQ29uZmlnSW1wbCA8ZW0+Q29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BDb25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpzcENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfQ09ORklHID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWcgTGliczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJR19fVEFHX0xJQlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJR19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsIDxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsIElnbm9yZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZ2UgRW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjcmlwdGluZyBJbnZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgWG1sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lEID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsIDxlbT5UYWcgTGliPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQUdfTElCID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVEFHTElCX1VSSSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVEFHTElCX0xPQ0FUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWcgTGliPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkZpbGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SnNwRmlsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX0ZJTEVfVFlQRSA9IDM7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyA8ZW0+Q29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWcgTGliczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRUYWdMaWJzKCkKLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpzcENvbmZpZ19UYWdMaWJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldEpzcFByb3BlcnR5R3JvdXBzIDxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldEpzcFByb3BlcnR5R3JvdXBzKCkKLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpzcENvbmZpZ19Kc3BQcm9wZXJ0eUdyb3VwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEpzcENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwQ29uZmlnX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwIDxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpzcFByb3BlcnR5R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SnNwUHJvcGVydHlHcm91cF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVybCBQYXR0ZXJuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCA8ZW0+RWwgSWdub3JlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFBhZ2VFbmNvZGluZyA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFBhZ2VFbmNvZGluZygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNJc1htbCA8ZW0+SXMgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgWG1sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0lzWG1sKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0lzWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlUHJlbHVkZXMgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVQcmVsdWRlcygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcyA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW5jbHVkZSBDb2RhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliIDxlbT5UYWcgTGliPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhZyBMaWI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhZ0xpYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0VGFnbGliVXJpIDxlbT5UYWdsaWIgVXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFnbGliIFVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJVcmkoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ2xpYlVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldElkKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZpbGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RmlsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SnNwRmlsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcEZhY3RvcnkgZ2V0SnNwRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcENvbmZpZ0ltcGwgPGVtPkNvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SnNwQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpTUF9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0SnNwQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWcgTGliczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX0NPTkZJR19fVEFHX0xJQlMgPSBlSU5TVEFOQ0UuZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFMgPSBlSU5TVEFOQ0UuZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9DT05GSUdfX0lEID0gZUlOU1RBTkNFLmdldEpzcENvbmZpZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCA8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpTUF9QUk9QRVJUWV9HUk9VUCA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlMgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWwgSWdub3JlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFnZSBFbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORyA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NyaXB0aW5nIEludmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgWG1sPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9Jc1htbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBQcmVsdWRlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIENvZGFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUwgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9EZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUyA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0lEID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbCA8ZW0+VGFnIExpYjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0VGFnTGliKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBR19MSUIgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0xJQl9fVEFHTElCX1VSSSA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfVGFnbGliVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX19UQUdMSUJfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX1RhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfX0lEID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RmlsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SnNwRmlsZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSlNQX0ZJTEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRKc3BGaWxlVHlwZSgpOwotCi0JfQotCi19IC8vSnNwUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzAxMWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKc3BQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSnNwU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEpzcFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpzcENvbmZpZyhKc3BDb25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpzcENvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpzcFByb3BlcnR5R3JvdXAoSnNwUHJvcGVydHlHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSnNwUHJvcGVydHlHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcgPGVtPkNvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSnNwQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwIDxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpzcFByb3BlcnR5R3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiA8ZW0+VGFnIExpYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pzcEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFhZTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsLkpzcFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEpzcFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9Kc3BSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YzJiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbC5Kc3BSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotfSAvL0pzcFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGFmYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpzcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiB7Ci0JCQkJSnNwQ29uZmlnIGpzcENvbmZpZyA9IChKc3BDb25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpzcENvbmZpZyhqc3BDb25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVA6IHsKLQkJCQlKc3BQcm9wZXJ0eUdyb3VwIGpzcFByb3BlcnR5R3JvdXAgPSAoSnNwUHJvcGVydHlHcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSnNwUHJvcGVydHlHcm91cChqc3BQcm9wZXJ0eUdyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQjogewotCQkJCVRhZ0xpYiB0YWdMaWIgPSAoVGFnTGliKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWIodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSnNwQ29uZmlnKEpzcENvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKc3BQcm9wZXJ0eUdyb3VwKEpzcFByb3BlcnR5R3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pzcFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTFmOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcFhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIEpzcFJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBKc3BSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBKc3BSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL0pzcFhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQXV0aENvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0F1dGhDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDUxMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQXV0aENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAotICogCXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLSAqIAljb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi0gKiAJdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKLSAqIAlkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotICogCXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotICogCWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCi0gKiAJYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotICogCXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLSAqIAl0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKLSAqIAljb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLSAqIAlyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRSb2xlTmFtZXMgPGVtPlJvbGUgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRBdXRoQ29uc3RyYWludCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdXRoQ29uc3RyYWludCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRBdXRoQ29uc3RyYWludF9Sb2xlTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJvbGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEF1dGhDb25zdHJhaW50X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBdXRoQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Rpc3BhdGNoZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9EaXNwYXRjaGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTM5MzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Rpc3BhdGNoZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBkaXNwYXRjaGVyIGhhcyBmb3VyIGxlZ2FsIHZhbHVlczogRk9SV0FSRCwgUkVRVUVTVCwgSU5DTFVERSwKLSAqIAlhbmQgRVJST1IuIEEgdmFsdWUgb2YgRk9SV0FSRCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAotICogCXVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4gIEEgdmFsdWUgb2YgUkVRVUVTVAotICogCW1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0bwotICogCXRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YgSU5DTFVERSBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUKLSAqIAlhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4gIEEgdmFsdWUgb2YKLSAqIAlFUlJPUiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciB0aGUgZXJyb3IgcGFnZQotICogCW1lY2hhbmlzbS4gIFRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKLSAqIAlmaWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlcgotICogCW9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXREaXNwYXRjaGVyVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaXNwYXRjaGVyVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JXQVJEX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5DTFVERV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVFU1RfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1QgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVSUk9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VSUk9SX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GT1JXQVJEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZPUldBUkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIEZPUldBUkRfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShGT1JXQVJELCAiRk9SV0FSRCIsICJGT1JXQVJEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTkNMVURFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBJTkNMVURFX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoSU5DTFVERSwgIklOQ0xVREUiLCAiSU5DTFVERSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUVTVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgUkVRVUVTVF9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKFJFUVVFU1QsICJSRVFVRVNUIiwgIlJFUVVFU1QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFUlJPUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgRVJST1JfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShFUlJPUiwgIkVSUk9SIiwgIkVSUk9SIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRGlzcGF0Y2hlclR5cGVbXSB7Ci0JCQlGT1JXQVJEX0xJVEVSQUwsCi0JCQlJTkNMVURFX0xJVEVSQUwsCi0JCQlSRVFVRVNUX0xJVEVSQUwsCi0JCQlFUlJPUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGF0Y2hlclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEaXNwYXRjaGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BhdGNoZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BhdGNoZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBGT1JXQVJEOiByZXR1cm4gRk9SV0FSRF9MSVRFUkFMOwotCQkJY2FzZSBJTkNMVURFOiByZXR1cm4gSU5DTFVERV9MSVRFUkFMOwotCQkJY2FzZSBSRVFVRVNUOiByZXR1cm4gUkVRVUVTVF9MSVRFUkFMOwotCQkJY2FzZSBFUlJPUjogcmV0dXJuIEVSUk9SX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpc3BhdGNoZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9EaXNwYXRjaGVyVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRXJyb3JQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9FcnJvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhNGRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9FcnJvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXJyb3IgUGFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVycm9yLXBhZ2VUeXBlIGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLSAqIAlvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLSAqIAlhcHBsaWNhdGlvbi4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEVycm9yQ29kZSA8ZW0+RXJyb3IgQ29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEVycm9yUGFnZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFcnJvclBhZ2UgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVycm9yIENvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIENvZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgQ29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXJyb3JDb2RlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEVycm9yUGFnZV9FcnJvckNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVycm9yQ29kZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEVycm9yQ29kZSA8ZW0+RXJyb3IgQ29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgQ29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXJyb3JDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFcnJvckNvZGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNlcHRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAqIAkgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQkgKiAKLQkgKiAJICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4Y2VwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4Y2VwdGlvblR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgKiAJICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQkgKiAJICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0JICogCSAgICBhIGxlYWRpbmcgYC8nLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRFcnJvclBhZ2VfTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRFcnJvclBhZ2VfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFcnJvclBhZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9GaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEwM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWx0ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi0gKiAJYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQotICogCVVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUKLSAqIAlmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLSAqIAlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50Ci0gKiAJZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RmlsdGVyTmFtZSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJDbGFzcyA8ZW0+RmlsdGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbHRlciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbHRlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbHRlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWx0ZXJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmlsdGVyTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbHRlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmlsdGVyQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmlsdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJDbGFzcyA8ZW0+RmlsdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLQkgKiAJICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9Jbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRmlsdGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWVmNGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlck1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpbHRlciBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi0gKiAJYXBwbGljYXRpb24gaXMgZG9uZSBieSB1c2luZyBmaWx0ZXItbWFwcGluZ1R5cGUuCi0gKiAJVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotICogCWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi0gKiAJYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8KLSAqIAlhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi0gKiAJYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi0gKiAJc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZwotICogCWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLSAqIAl3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotICogCWZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLSAqIAlzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLSAqIAlmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLSAqIAlzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSBmaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZQotICogCWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRTZXJ2bGV0TmFtZXMgPGVtPlNlcnZsZXQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0RGlzcGF0Y2hlcnMgPGVtPkRpc3BhdGNoZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbHRlck1hcHBpbmcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmlsdGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWx0ZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmlsdGVyTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfU2VydmxldE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2bGV0TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGV9LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BhdGNoZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGF0Y2hlcnM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwYXRjaGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRmlsdGVyTWFwcGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Zvcm1Mb2dpbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRm9ybUxvZ2luQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTZmYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRm9ybUxvZ2luQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Gb3JtIExvZ2luIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotICogCXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotICogCWF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLSAqIAotICogCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luUGFnZSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUVycm9yUGFnZSA8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGb3JtTG9naW5Db25maWcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gUGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgotCSAqIAkgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotCSAqIAkgICAgZm91bmQuICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgKiAJICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZvcm1Mb2dpblBhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRGb3JtTG9naW5QYWdlIDxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybSBFcnJvciBQYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotCSAqIAkgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKLQkgKiAJICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotCSAqIAkgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICogCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZvcm1FcnJvclBhZ2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGb3JtRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUVycm9yUGFnZSA8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZvcm1FcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZvcm1FcnJvclBhZ2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGb3JtTG9naW5Db25maWdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBGb3JtTG9naW5Db25maWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0lXZWJSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEzZDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0lXZWJSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJSZXNvdXJjZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgd2FyCi0JICovCi0JcHVibGljIGFic3RyYWN0IFdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YjMyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi0gKiAJZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKLSAqIAlzdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotICogCXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRMb2NhbGUgPGVtPkxvY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9jYWxlRW5jb2RpbmdNYXBwaW5nIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBMb2NhbGVFbmNvZGluZ01hcHBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzI0ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi0gKiAJbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9naW5Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvZ2luQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOWE4YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9naW5Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvZ2luIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGxvZ2luLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0gKiAJbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi0gKiAJdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi0gKiAJbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luIG1lY2hhbmlzbS4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldFJlYWxtTmFtZSA8ZW0+UmVhbG0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luQ29uZmlnIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvZ2luQ29uZmlnKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ2luQ29uZmlnIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aE1ldGhvZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhbG0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotCSAqIAkgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhbG0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhbG1OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYWxtTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0UmVhbG1OYW1lIDxlbT5SZWFsbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFsbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFsbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYWxtTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRGb3JtTG9naW5Db25maWcgPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2dpbkNvbmZpZ19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTG9naW5Db25maWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9NaW1lTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTWltZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0YmM1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9NaW1lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWltZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotICogCWFuZCBhIG1pbWUgdHlwZS4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0RXh0ZW5zaW9uIDxlbT5FeHRlbnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNaW1lTWFwcGluZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNaW1lTWFwcGluZyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlbnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRFeHRlbnNpb24gPGVtPkV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW1lIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW1lVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW1lIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE1pbWVNYXBwaW5nX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNaW1lTWFwcGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL051bGxDaGFyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTnVsbENoYXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Njk4N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTnVsbENoYXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk51bGwgQ2hhciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TnVsbENoYXJUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxDaGFyVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjX19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjXwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbENoYXJUeXBlIF9fTElURVJBTCA9IG5ldyBOdWxsQ2hhclR5cGUoXywgIl8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk51bGwgQ2hhciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQ2hhclR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTnVsbENoYXJUeXBlW10gewotCQkJX19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk51bGwgQ2hhciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE51bGxDaGFyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU51bGxDaGFyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk51bGwgQ2hhciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTnVsbENoYXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTnVsbENoYXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE51bGxDaGFyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgXzogcmV0dXJuIF9fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTnVsbENoYXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9OdWxsQ2hhclR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VjdXJpdHlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2IxMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VjdXJpdHlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBzZWN1cml0eS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGFzc29jaWF0ZQotICogCXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi0gKiAJY29sbGVjdGlvbnMKLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldFdlYlJlc291cmNlQ29sbGVjdGlvbnMgPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldEF1dGhDb25zdHJhaW50IDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eUNvbnN0cmFpbnQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFJlc291cmNlIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGggQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF1dGhDb25zdHJhaW50IGdldEF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0QXV0aENvbnN0cmFpbnQgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdXRoQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVXNlckRhdGFDb25zdHJhaW50IGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldFVzZXJEYXRhQ29uc3RyYWludCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlY3VyaXR5Q29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzNTNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2bGV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLSAqIAlJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi0gKiAJc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAKLSAqIAllbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi0gKiAJbG9hZGVkLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0Q2xhc3MgPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SnNwRmlsZSA8ZW0+SnNwIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFJ1bkFzIDxlbT5SdW4gQXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmxldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZsZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlcnZsZXROYW1lIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLQkgKiAJICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmxldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmxldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9TZXJ2bGV0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmxldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlcnZsZXRDbGFzcyA8ZW0+U2VydmxldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmxldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmxldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpzcCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kc3AgRmlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kc3AgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SnNwRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfSnNwRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRKc3BGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEpzcEZpbGUgPGVtPkpzcCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kc3AgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SnNwRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SnNwRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYWQgT24gU3RhcnR1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotCSAqIAkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLQkgKiAJICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0JICogCSAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0JICogCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotCSAqIAkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0JICogCSAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotCSAqIAkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLQkgKiAJICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0JICogCSAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotCSAqIAkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLQkgKiAJICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLQkgKiAJICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLQkgKiAJICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotCSAqIAkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLQkgKiAJICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2FkT25TdGFydHVwKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExvYWRPblN0YXJ0dXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvYWRPblN0YXJ0dXAoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UnVuIEFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJ1biBBczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UnVuQXMoUnVuQXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfUnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSdW5BcyBnZXRSdW5BcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SdW4gQXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJ1bkFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSdW5BcyhSdW5BcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2bGV0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VydmxldE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmM2YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VydmxldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLSAqIAlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRTZXJ2bGV0TmFtZSA8ZW0+U2VydmxldCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldE1hcHBpbmcoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldE1hcHBpbmcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmxldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmxldCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRNYXBwaW5nX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2bGV0TWFwcGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1Nlc3Npb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1Nlc3Npb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0MGIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXNzaW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlc3Npb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotICogCWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRTZXNzaW9uVGltZW91dCA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXNzaW9uQ29uZmlnKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25Db25maWcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlc3Npb24gVGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAotCSAqIAkgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotCSAqIAkgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotCSAqIAkgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgKiAJICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0JICogCSAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotCSAqIAkgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgotCSAqIAkgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVGltZW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2Vzc2lvblRpbWVvdXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVGltZW91dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXNzaW9uQ29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxNzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0gKiAJYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0gKiAJQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90Ci0gKiAJcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLSAqIAl0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLSAqIAljbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZQotICogCWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0gKiAJcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotICogCXByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUKLSAqIAl0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLSAqIAlDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLSAqIAlyZXF1aXJlZC4KLSAqIAotICogCVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHUkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFR1JBTF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdSQUwgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DT05GSURFTlRJQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORklERU5USUFMX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSURFTlRJQUwgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIE5PTkVfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKE5PTkUsICJOT05FIiwgIk5PTkUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFR1JBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBJTlRFR1JBTF9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoSU5URUdSQUwsICJJTlRFR1JBTCIsICJJTlRFR1JBTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkZJREVOVElBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05GSURFTlRJQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgQ09ORklERU5USUFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShDT05GSURFTlRJQUwsICJDT05GSURFTlRJQUwiLCAiQ09ORklERU5USUFMIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlW10gewotCQkJTk9ORV9MSVRFUkFMLAotCQkJSU5URUdSQUxfTElURVJBTCwKLQkJCUNPTkZJREVOVElBTF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORTogcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgSU5URUdSQUw6IHJldHVybiBJTlRFR1JBTF9MSVRFUkFMOwotCQkJY2FzZSBDT05GSURFTlRJQUw6IHJldHVybiBDT05GSURFTlRJQUxfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVXNlckRhdGFDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMzQ2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKLSAqIAlkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLSAqIAlwcm90ZWN0ZWQuCi0gKiAKLSAqIAlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXNlckRhdGFDb25zdHJhaW50IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTk9ORSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3NldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICN1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3NldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFVzZXJEYXRhQ29uc3RyYWludF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFVzZXJEYXRhQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDhkNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGlzdHJpYnV0YWJsZXMgPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0Q29udGV4dFBhcmFtcyA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRGaWx0ZXJzIDxlbT5GaWx0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RmlsdGVyTWFwcGluZ3MgPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExpc3RlbmVycyA8ZW0+TGlzdGVuZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmxldHMgPGVtPlNlcnZsZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2Vzc2lvbkNvbmZpZ3MgPGVtPlNlc3Npb24gQ29uZmlnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1pbWVNYXBwaW5ncyA8ZW0+TWltZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVycm9yUGFnZXMgPGVtPkVycm9yIFBhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SnNwQ29uZmlncyA8ZW0+SnNwIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZWN1cml0eUNvbnN0cmFpbnRzIDxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExvZ2luQ29uZmlncyA8ZW0+TG9naW4gQ29uZmlnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHAoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViQXBwIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzdHJpYnV0YWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzdHJpYnV0YWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotCSAqIAkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQKLQkgKiAJICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRleHQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29udGV4dFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0ZpbHRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEZpbHRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2bGV0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VydmxldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZsZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vzc2lvbiBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2Vzc2lvbkNvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbWUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW1lIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfV2VsY29tZUZpbGVMaXN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V2VsY29tZUZpbGVMaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBQYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpzcCBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9Kc3BDb25maWdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRKc3BDb25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VjdXJpdHlDb25zdHJhaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvZ2luIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTG9naW5Db25maWdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMb2dpbkNvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAqIAkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICogCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAqIAkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICogCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICogCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICogCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgKiAJICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAqIAkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAqIAkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiAJICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAqIAkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICogCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiAJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIyLjUiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUKLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1ZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJBcHBWZXJzaW9uVHlwZSBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJzaW9uKCk7Ci0KLX0gLy8gV2ViQXBwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTZmYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldE1peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLQkgKiAJZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotCSAqIAlvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKLQkgKiAJdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLQkgKiAJc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0JICogCWFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgotCSAqIAlpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLQkgKiAJZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotCSAqIAlqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgotCSAqIAl3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0JICogCW11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCi0JICogCW9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCi0JICogCXRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0JICogCW9uZSBkaXN0cmlidXRhYmxlLgotCSAqIAotCSAqICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXZWJBcHAoV2ViQXBwKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0gLy8gV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBWZXJzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwVmVyc2lvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NTJjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBWZXJzaW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0gKiAJd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0gKiAJdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBWZXJzaW9uVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJBcHBWZXJzaW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+MjU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjI1PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18yNV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzI1ID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjI1PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18yNQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgXzI1X0xJVEVSQUwgPSBuZXcgV2ViQXBwVmVyc2lvblR5cGUoXzI1LCAiXzI1IiwgIjIuNSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJBcHBWZXJzaW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBXZWJBcHBWZXJzaW9uVHlwZVtdIHsKLQkJCV8yNV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkFwcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFwcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcHBWZXJzaW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdlYkFwcFZlcnNpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXBwIFZlcnNpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFwcFZlcnNpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV2ViQXBwVmVyc2lvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFwcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcHBWZXJzaW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgXzI1OiByZXR1cm4gXzI1X0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYkFwcFZlcnNpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9XZWJBcHBWZXJzaW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmE2MDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXV0aENvbnN0cmFpbnQgY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbHRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmlsdGVyIGNyZWF0ZUZpbHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZpbHRlck1hcHBpbmcgY3JlYXRlRmlsdGVyTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZvcm1Mb2dpbkNvbmZpZyBjcmVhdGVGb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NhbGVFbmNvZGluZ01hcHBpbmcgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9naW5Db25maWcgY3JlYXRlTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1pbWVNYXBwaW5nIGNyZWF0ZU1pbWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3VyaXR5Q29uc3RyYWludCBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmxldCBjcmVhdGVTZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2bGV0TWFwcGluZyBjcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlc3Npb25Db25maWcgY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYkFwcCBjcmVhdGVXZWJBcHAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlbGNvbWVGaWxlTGlzdCBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViUGFja2FnZSBnZXRXZWJQYWNrYWdlKCk7Ci0KLX0gLy9XZWJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFjYTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLSAqIAlvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbgotICogCWEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZgotICogCW5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci0gKiAJYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotICogCi0gKiAJVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0V2ViUmVzb3VyY2VOYW1lIDxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2RzIDxlbT5IdHRwIE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlJlc291cmNlQ29sbGVjdGlvbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFJlc291cmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCi0JICogCSAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRXZWJSZXNvdXJjZU5hbWUgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWJSZXNvdXJjZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SHR0cE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXZWJSZXNvdXJjZUNvbGxlY3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWxjb21lRmlsZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlbGNvbWVGaWxlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODcyY2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlbGNvbWVGaWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlbGNvbWUgRmlsZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLSAqIAlmaWxlcyBlbGVtZW50cy4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0I2dldFdlbGNvbWVGaWxlcyA8ZW0+V2VsY29tZSBGaWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWxjb21lRmlsZUxpc3QoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2VsY29tZUZpbGVMaXN0IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCi0JICogCSAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V2VsY29tZUZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2VsY29tZUZpbGVMaXN0X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV2VsY29tZUZpbGVMaXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMWVjYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdXRoIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCNnZXRSb2xlTmFtZXMgPGVtPlJvbGUgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dGhDb25zdHJhaW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXV0aENvbnN0cmFpbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lcygpIDxlbT5Sb2xlIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdXRoQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkFVVEhfQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVOYW1lcygpIHsKLQkJaWYgKHJvbGVOYW1lcyA9PSBudWxsKSB7Ci0JCQlyb2xlTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVM6Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTOgotCQkJCWdldFJvbGVOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVM6Ci0JCQkJcmV0dXJuIHJvbGVOYW1lcyAhPSBudWxsICYmICFyb2xlTmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlTmFtZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0F1dGhDb25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWQ4MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVycm9yIFBhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCNnZXRFcnJvckNvZGUgPGVtPkVycm9yIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVycm9yUGFnZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVycm9yUGFnZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVycm9yQ29kZSgpIDxlbT5FcnJvciBDb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFcnJvckNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFUlJPUl9DT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVycm9yQ29kZSgpIDxlbT5FcnJvciBDb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFcnJvckNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVycm9yQ29kZSA9IEVSUk9SX0NPREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjZXB0aW9uVHlwZSgpIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjZXB0aW9uVHlwZSgpIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGNlcHRpb25UeXBlID0gRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVycm9yUGFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkVSUk9SX1BBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RXJyb3JDb2RlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yQ29kZShCaWdJbnRlZ2VyIG5ld0Vycm9yQ29kZSkgewotCQlCaWdJbnRlZ2VyIG9sZEVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQkJZXJyb3JDb2RlID0gbmV3RXJyb3JDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREUsIG9sZEVycm9yQ29kZSwgZXJyb3JDb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UeXBlKFN0cmluZyBuZXdFeGNlcHRpb25UeXBlKSB7Ci0JCVN0cmluZyBvbGRFeGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLQkJZXhjZXB0aW9uVHlwZSA9IG5ld0V4Y2VwdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUsIG9sZEV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQlsb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlyZXR1cm4gZ2V0RXJyb3JDb2RlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEV4Y2VwdGlvblR5cGUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb24oKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJc2V0RXJyb3JDb2RlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlzZXRFcnJvckNvZGUoRVJST1JfQ09ERV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXNldEV4Y2VwdGlvblR5cGUoRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgotCQkJCXJldHVybiBFUlJPUl9DT0RFX0VERUZBVUxUID09IG51bGwgPyBlcnJvckNvZGUgIT0gbnVsbCA6ICFFUlJPUl9DT0RFX0VERUZBVUxULmVxdWFscyhlcnJvckNvZGUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBFWENFUFRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZXhjZXB0aW9uVHlwZSAhPSBudWxsIDogIUVYQ0VQVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhleGNlcHRpb25UeXBlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVycm9yQ29kZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlcnJvckNvZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2VwdGlvblR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXJyb3JQYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTgxNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWx0ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwjZ2V0RmlsdGVyQ2xhc3MgPGVtPkZpbHRlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRmlsdGVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyTmFtZSgpIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyTmFtZSgpIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWx0ZXJOYW1lID0gRklMVEVSX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyQ2xhc3MoKSA8ZW0+RmlsdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWx0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlckNsYXNzKCkgPGVtPkZpbHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyQ2xhc3MgPSBGSUxURVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZpbHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gZmlsdGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJOYW1lKFN0cmluZyBuZXdGaWx0ZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKLQkJZmlsdGVyTmFtZSA9IG5ld0ZpbHRlck5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfTkFNRSwgb2xkRmlsdGVyTmFtZSwgZmlsdGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBmaWx0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDbGFzcyhTdHJpbmcgbmV3RmlsdGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEZpbHRlckNsYXNzID0gZmlsdGVyQ2xhc3M7Ci0JCWZpbHRlckNsYXNzID0gbmV3RmlsdGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1MsIG9sZEZpbHRlckNsYXNzLCBmaWx0ZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyTmFtZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJDbGFzcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX05BTUU6Ci0JCQkJc2V0RmlsdGVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJc2V0RmlsdGVyQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX05BTUU6Ci0JCQkJc2V0RmlsdGVyTmFtZShGSUxURVJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgotCQkJCXNldEZpbHRlckNsYXNzKEZJTFRFUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9OQU1FOgotCQkJCXJldHVybiBGSUxURVJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmlsdGVyTmFtZSAhPSBudWxsIDogIUZJTFRFUl9OQU1FX0VERUZBVUxULmVxdWFscyhmaWx0ZXJOYW1lKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gRklMVEVSX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBmaWx0ZXJDbGFzcyAhPSBudWxsIDogIUZJTFRFUl9DTEFTU19FREVGQVVMVC5lcXVhbHMoZmlsdGVyQ2xhc3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpbHRlck5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmlsdGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmlsdGVyQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmlsdGVyQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRmlsdGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0MTVhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwjZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCNnZXRTZXJ2bGV0TmFtZXMgPGVtPlNlcnZsZXQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwjZ2V0RGlzcGF0Y2hlcnMgPGVtPkRpc3BhdGNoZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBGaWx0ZXJNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyTmFtZSgpIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyTmFtZSgpIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWx0ZXJOYW1lID0gRklMVEVSX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGF0Y2hlcnMoKSA8ZW0+RGlzcGF0Y2hlcnM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGF0Y2hlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwYXRjaGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGaWx0ZXJNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gZmlsdGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJOYW1lKFN0cmluZyBuZXdGaWx0ZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKLQkJZmlsdGVyTmFtZSA9IG5ld0ZpbHRlck5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FLCBvbGRGaWx0ZXJOYW1lLCBmaWx0ZXJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmxldE5hbWVzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGF0Y2hlcnMoKSB7Ci0JCWlmIChkaXNwYXRjaGVycyA9PSBudWxsKSB7Ci0JCQlkaXNwYXRjaGVycyA9IG5ldyBFRGF0YVR5cGVFTGlzdChEaXNwYXRjaGVyVHlwZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlMpOwotCQl9Ci0JCXJldHVybiBkaXNwYXRjaGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VXJsUGF0dGVybnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FOgotCQkJCXJldHVybiBnZXRGaWx0ZXJOYW1lKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmxldE5hbWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTOgotCQkJCXJldHVybiBnZXREaXNwYXRjaGVycygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRToKLQkJCQlzZXRGaWx0ZXJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5jbGVhcigpOwotCQkJCWdldFVybFBhdHRlcm5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVM6Ci0JCQkJZ2V0U2VydmxldE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2bGV0TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlM6Ci0JCQkJZ2V0RGlzcGF0Y2hlcnMoKS5jbGVhcigpOwotCQkJCWdldERpc3BhdGNoZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FOgotCQkJCXNldEZpbHRlck5hbWUoRklMVEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVM6Ci0JCQkJZ2V0U2VydmxldE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTOgotCQkJCWdldERpc3BhdGNoZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSX05BTUU6Ci0JCQkJcmV0dXJuIEZJTFRFUl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWx0ZXJOYW1lICE9IG51bGwgOiAhRklMVEVSX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpbHRlck5hbWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuICFnZXRVcmxQYXR0ZXJucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUzoKLQkJCQlyZXR1cm4gIWdldFNlcnZsZXROYW1lcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlM6Ci0JCQkJcmV0dXJuIGRpc3BhdGNoZXJzICE9IG51bGwgJiYgIWRpc3BhdGNoZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWx0ZXJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZpbHRlck5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNwYXRjaGVyczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkaXNwYXRjaGVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9GaWx0ZXJNYXBwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDQ4NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Gb3JtIExvZ2luIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsI2dldEZvcm1Mb2dpblBhZ2UgPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsI2dldEZvcm1FcnJvclBhZ2UgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcm1Mb2dpbkNvbmZpZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZvcm1Mb2dpbkNvbmZpZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1Mb2dpblBhZ2UoKSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtTG9naW5QYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybUxvZ2luUGFnZSgpIDxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm1Mb2dpblBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybUxvZ2luUGFnZSA9IEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtRXJyb3JQYWdlKCkgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1FcnJvclBhZ2UoKSA8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtRXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1FcnJvclBhZ2UgPSBGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGb3JtTG9naW5Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5GT1JNX0xPR0lOX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1Mb2dpblBhZ2UoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5QYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1Mb2dpblBhZ2UoU3RyaW5nIG5ld0Zvcm1Mb2dpblBhZ2UpIHsKLQkJU3RyaW5nIG9sZEZvcm1Mb2dpblBhZ2UgPSBmb3JtTG9naW5QYWdlOwotCQlmb3JtTG9naW5QYWdlID0gbmV3Rm9ybUxvZ2luUGFnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFLCBvbGRGb3JtTG9naW5QYWdlLCBmb3JtTG9naW5QYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtRXJyb3JQYWdlKCkgewotCQlyZXR1cm4gZm9ybUVycm9yUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtRXJyb3JQYWdlKFN0cmluZyBuZXdGb3JtRXJyb3JQYWdlKSB7Ci0JCVN0cmluZyBvbGRGb3JtRXJyb3JQYWdlID0gZm9ybUVycm9yUGFnZTsKLQkJZm9ybUVycm9yUGFnZSA9IG5ld0Zvcm1FcnJvclBhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSwgb2xkRm9ybUVycm9yUGFnZSwgZm9ybUVycm9yUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKLQkJCQlyZXR1cm4gZ2V0Rm9ybUxvZ2luUGFnZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0U6Ci0JCQkJcmV0dXJuIGdldEZvcm1FcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXNldEZvcm1Mb2dpblBhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0U6Ci0JCQkJc2V0Rm9ybUVycm9yUGFnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKLQkJCQlzZXRGb3JtTG9naW5QYWdlKEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0U6Ci0JCQkJc2V0Rm9ybUVycm9yUGFnZShGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJcmV0dXJuIEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVCA9PSBudWxsID8gZm9ybUxvZ2luUGFnZSAhPSBudWxsIDogIUZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVC5lcXVhbHMoZm9ybUxvZ2luUGFnZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlyZXR1cm4gRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUID09IG51bGwgPyBmb3JtRXJyb3JQYWdlICE9IG51bGwgOiAhRk9STV9FUlJPUl9QQUdFX0VERUZBVUxULmVxdWFscyhmb3JtRXJyb3JQYWdlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmb3JtTG9naW5QYWdlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZvcm1Mb2dpblBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm1FcnJvclBhZ2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZm9ybUVycm9yUGFnZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Gb3JtTG9naW5Db25maWdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2OGYyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb2NhbGVFbmNvZGluZ01hcHBpbmcgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbGUoKSA8ZW0+TG9jYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbGUoKSA8ZW0+TG9jYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWxlID0gTE9DQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gRU5DT0RJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5MT0NBTEVfRU5DT0RJTkdfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLQkJcmV0dXJuIGxvY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIG5ld0xvY2FsZSkgewotCQlTdHJpbmcgb2xkTG9jYWxlID0gbG9jYWxlOwotCQlsb2NhbGUgPSBuZXdMb2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSwgb2xkTG9jYWxlLCBsb2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIG5ld0VuY29kaW5nKSB7Ci0JCVN0cmluZyBvbGRFbmNvZGluZyA9IGVuY29kaW5nOwotCQllbmNvZGluZyA9IG5ld0VuY29kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORywgb2xkRW5jb2RpbmcsIGVuY29kaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXJldHVybiBnZXRMb2NhbGUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldEVuY29kaW5nKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlzZXRMb2NhbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlzZXRMb2NhbGUoTE9DQUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HOgotCQkJCXNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXJldHVybiBMT0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsZSAhPSBudWxsIDogIUxPQ0FMRV9FREVGQVVMVC5lcXVhbHMobG9jYWxlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIEVOQ09ESU5HX0VERUZBVUxUID09IG51bGwgPyBlbmNvZGluZyAhPSBudWxsIDogIUVOQ09ESU5HX0VERUZBVUxULmVxdWFscyhlbmNvZGluZyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5jb2Rpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1ZGE0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbG9jYWxFbmNvZGluZ01hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpIHsKLQkJaWYgKGxvY2FsRW5jb2RpbmdNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlsb2NhbEVuY29kaW5nTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ3MgIT0gbnVsbCAmJiAhbG9jYWxFbmNvZGluZ01hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0YTM4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2dpbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCNnZXRSZWFsbU5hbWUgPGVtPlJlYWxtIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsI2dldEZvcm1Mb2dpbkNvbmZpZyA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvZ2luQ29uZmlnSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9naW5Db25maWcgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoTWV0aG9kKCkgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoTWV0aG9kKCkgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhNZXRob2QgPSBBVVRIX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFsbU5hbWUoKSA8ZW0+UmVhbG0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhbG1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWxtTmFtZSgpIDxlbT5SZWFsbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFsbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhbG1OYW1lID0gUkVBTE1fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1Mb2dpbkNvbmZpZygpIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybUxvZ2luQ29uZmlnIGZvcm1Mb2dpbkNvbmZpZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2dpbkNvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkxPR0lOX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhNZXRob2QoKSB7Ci0JCXJldHVybiBhdXRoTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhNZXRob2QoU3RyaW5nIG5ld0F1dGhNZXRob2QpIHsKLQkJU3RyaW5nIG9sZEF1dGhNZXRob2QgPSBhdXRoTWV0aG9kOwotCQlhdXRoTWV0aG9kID0gbmV3QXV0aE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9ELCBvbGRBdXRoTWV0aG9kLCBhdXRoTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFsbU5hbWUoKSB7Ci0JCXJldHVybiByZWFsbU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyBuZXdSZWFsbU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJlYWxtTmFtZSA9IHJlYWxtTmFtZTsKLQkJcmVhbG1OYW1lID0gbmV3UmVhbG1OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSwgb2xkUmVhbG1OYW1lLCByZWFsbU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnIGdldEZvcm1Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG5ld0Zvcm1Mb2dpbkNvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlGb3JtTG9naW5Db25maWcgb2xkRm9ybUxvZ2luQ29uZmlnID0gZm9ybUxvZ2luQ29uZmlnOwotCQlmb3JtTG9naW5Db25maWcgPSBuZXdGb3JtTG9naW5Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgb2xkRm9ybUxvZ2luQ29uZmlnLCBuZXdGb3JtTG9naW5Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgbmV3Rm9ybUxvZ2luQ29uZmlnKSB7Ci0JCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gZm9ybUxvZ2luQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChmb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Rm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhuZXdGb3JtTG9naW5Db25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBuZXdGb3JtTG9naW5Db25maWcsIG5ld0Zvcm1Mb2dpbkNvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Rm9ybUxvZ2luQ29uZmlnKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0QXV0aE1ldGhvZCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVhbG1OYW1lKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJc2V0QXV0aE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXNldFJlYWxtTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRGb3JtTG9naW5Db25maWcoKEZvcm1Mb2dpbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXNldEF1dGhNZXRob2QoQVVUSF9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJc2V0UmVhbG1OYW1lKFJFQUxNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXNldEZvcm1Mb2dpbkNvbmZpZygoRm9ybUxvZ2luQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXJldHVybiBBVVRIX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gYXV0aE1ldGhvZCAhPSBudWxsIDogIUFVVEhfTUVUSE9EX0VERUZBVUxULmVxdWFscyhhdXRoTWV0aG9kKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJcmV0dXJuIFJFQUxNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWxtTmFtZSAhPSBudWxsIDogIVJFQUxNX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlYWxtTmFtZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhNZXRob2Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aE1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhbG1OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlYWxtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb2dpbkNvbmZpZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiZjY5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaW1lIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTWltZU1hcHBpbmdJbXBsI2dldEV4dGVuc2lvbiA8ZW0+RXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1pbWVNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5zaW9uKCkgPGVtPkV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5zaW9uKCkgPGVtPkV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbiA9IEVYVEVOU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW1lVHlwZSgpIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IE1JTUVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuTUlNRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgbmV3RXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlbnNpb24gPSBleHRlbnNpb247Ci0JCWV4dGVuc2lvbiA9IG5ld0V4dGVuc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTiwgb2xkRXh0ZW5zaW9uLCBleHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG5ld01pbWVUeXBlKSB7Ci0JCVN0cmluZyBvbGRNaW1lVHlwZSA9IG1pbWVUeXBlOwotCQltaW1lVHlwZSA9IG5ld01pbWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFLCBvbGRNaW1lVHlwZSwgbWltZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGdldE1pbWVUeXBlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXNldEV4dGVuc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJc2V0TWltZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlzZXRFeHRlbnNpb24oRVhURU5TSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJc2V0TWltZVR5cGUoTUlNRV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJcmV0dXJuIEVYVEVOU0lPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZW5zaW9uICE9IG51bGwgOiAhRVhURU5TSU9OX0VERUZBVUxULmVxdWFscyhleHRlbnNpb24pOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXJldHVybiBNSU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbWVUeXBlICE9IG51bGwgOiAhTUlNRV9UWVBFX0VERUZBVUxULmVxdWFscyhtaW1lVHlwZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVuc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlbnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbWVUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01pbWVNYXBwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzY5YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgQ29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbnMgPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsI2dldEF1dGhDb25zdHJhaW50IDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlDb25zdHJhaW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpIDxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdlYlJlc291cmNlQ29sbGVjdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aENvbnN0cmFpbnQoKSA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpIDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewotCQlpZiAod2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMpOwotCQl9Ci0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludCBnZXRBdXRoQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGF1dGhDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG5ld0F1dGhDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF1dGhDb25zdHJhaW50IG9sZEF1dGhDb25zdHJhaW50ID0gYXV0aENvbnN0cmFpbnQ7Ci0JCWF1dGhDb25zdHJhaW50ID0gbmV3QXV0aENvbnN0cmFpbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBvbGRBdXRoQ29uc3RyYWludCwgbmV3QXV0aENvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG5ld0F1dGhDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdBdXRoQ29uc3RyYWludCAhPSBhdXRoQ29uc3RyYWludCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdXRoQ29uc3RyYWludChuZXdBdXRoQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgbmV3QXV0aENvbnN0cmFpbnQsIG5ld0F1dGhDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVzZXJEYXRhQ29uc3RyYWludCBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiB1c2VyRGF0YUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVXNlckRhdGFDb25zdHJhaW50IG9sZFVzZXJEYXRhQ29uc3RyYWludCA9IHVzZXJEYXRhQ29uc3RyYWludDsKLQkJdXNlckRhdGFDb25zdHJhaW50ID0gbmV3VXNlckRhdGFDb25zdHJhaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBvbGRVc2VyRGF0YUNvbnN0cmFpbnQsIG5ld1VzZXJEYXRhQ29uc3RyYWludCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1VzZXJEYXRhQ29uc3RyYWludCAhPSB1c2VyRGF0YUNvbnN0cmFpbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1c2VyRGF0YUNvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVc2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VXNlckRhdGFDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQobmV3VXNlckRhdGFDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIG5ld1VzZXJEYXRhQ29uc3RyYWludCwgbmV3VXNlckRhdGFDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBdXRoQ29uc3RyYWludChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldEF1dGhDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXNldEF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXNldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXNldEF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0VXNlckRhdGFDb25zdHJhaW50KChVc2VyRGF0YUNvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbnMgIT0gbnVsbCAmJiAhd2ViUmVzb3VyY2VDb2xsZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBhdXRoQ29uc3RyYWludCAhPSBudWxsOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiB1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbDsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdXJpdHlDb25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzMWYxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldFNlcnZsZXROYW1lIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0U2VydmxldENsYXNzIDxlbT5TZXJ2bGV0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldEpzcEZpbGUgPGVtPkpzcCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VydmxldCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXROYW1lKCkgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2bGV0TmFtZSgpIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXROYW1lID0gU0VSVkxFVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXRDbGFzcygpIDxlbT5TZXJ2bGV0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldENsYXNzKCkgPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0Q2xhc3MgPSBTRVJWTEVUX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpzcEZpbGUoKSA8ZW0+SnNwIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpzcEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpzcEZpbGUoKSA8ZW0+SnNwIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpzcEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcganNwRmlsZSA9IEpTUF9GSUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFBhcmFtcygpIDxlbT5Jbml0IFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9hZE9uU3RhcnR1cCgpIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExPQURfT05fU1RBUlRVUF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2FkT25TdGFydHVwKCkgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsb2FkT25TdGFydHVwID0gTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVuQXMoKSA8ZW0+UnVuIEFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJ1bkFzIHJ1bkFzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZVJlZnMoKSA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gc2VydmxldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIG5ld1NlcnZsZXROYW1lKSB7Ci0JCVN0cmluZyBvbGRTZXJ2bGV0TmFtZSA9IHNlcnZsZXROYW1lOwotCQlzZXJ2bGV0TmFtZSA9IG5ld1NlcnZsZXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRSwgb2xkU2VydmxldE5hbWUsIHNlcnZsZXROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3MoKSB7Ci0JCXJldHVybiBzZXJ2bGV0Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmxldENsYXNzKFN0cmluZyBuZXdTZXJ2bGV0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZFNlcnZsZXRDbGFzcyA9IHNlcnZsZXRDbGFzczsKLQkJc2VydmxldENsYXNzID0gbmV3U2VydmxldENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfQ0xBU1MsIG9sZFNlcnZsZXRDbGFzcywgc2VydmxldENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCkgewotCQlyZXR1cm4ganNwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBuZXdKc3BGaWxlKSB7Ci0JCVN0cmluZyBvbGRKc3BGaWxlID0ganNwRmlsZTsKLQkJanNwRmlsZSA9IG5ld0pzcEZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VSVkxFVF9fSlNQX0ZJTEUsIG9sZEpzcEZpbGUsIGpzcEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TG9hZE9uU3RhcnR1cCgpIHsKLQkJcmV0dXJuIGxvYWRPblN0YXJ0dXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChPYmplY3QgbmV3TG9hZE9uU3RhcnR1cCkgewotCQlPYmplY3Qgb2xkTG9hZE9uU3RhcnR1cCA9IGxvYWRPblN0YXJ0dXA7Ci0JCWxvYWRPblN0YXJ0dXAgPSBuZXdMb2FkT25TdGFydHVwOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCwgb2xkTG9hZE9uU3RhcnR1cCwgbG9hZE9uU3RhcnR1cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSdW5BcyBnZXRSdW5BcygpIHsKLQkJcmV0dXJuIHJ1bkFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJ1bkFzKFJ1bkFzIG5ld1J1bkFzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJ1bkFzIG9sZFJ1bkFzID0gcnVuQXM7Ci0JCXJ1bkFzID0gbmV3UnVuQXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTLCBvbGRSdW5BcywgbmV3UnVuQXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bkFzKFJ1bkFzIG5ld1J1bkFzKSB7Ci0JCWlmIChuZXdSdW5BcyAhPSBydW5BcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocnVuQXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcnVuQXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UnVuQXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UnVuQXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSdW5BcyhuZXdSdW5BcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbmV3UnVuQXMsIG5ld1J1bkFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSdW5BcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0TmFtZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRDbGFzcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0pTUF9GSUxFOgotCQkJCXJldHVybiBnZXRKc3BGaWxlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJcmV0dXJuIGdldExvYWRPblN0YXJ0dXAoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGdldFJ1bkFzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXNldFNlcnZsZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX0NMQVNTOgotCQkJCXNldFNlcnZsZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSlNQX0ZJTEU6Ci0JCQkJc2V0SnNwRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQlzZXRMb2FkT25TdGFydHVwKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXNldFNlcnZsZXROYW1lKFNFUlZMRVRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfQ0xBU1M6Ci0JCQkJc2V0U2VydmxldENsYXNzKFNFUlZMRVRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19KU1BfRklMRToKLQkJCQlzZXRKc3BGaWxlKEpTUF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQlzZXRMb2FkT25TdGFydHVwKExPQURfT05fU1RBUlRVUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlzZXRSdW5BcygoUnVuQXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6Ci0JCQkJcmV0dXJuIFNFUlZMRVRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmxldE5hbWUgIT0gbnVsbCA6ICFTRVJWTEVUX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZsZXROYW1lKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX0NMQVNTOgotCQkJCXJldHVybiBTRVJWTEVUX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBzZXJ2bGV0Q2xhc3MgIT0gbnVsbCA6ICFTRVJWTEVUX0NMQVNTX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0Q2xhc3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0pTUF9GSUxFOgotCQkJCXJldHVybiBKU1BfRklMRV9FREVGQVVMVCA9PSBudWxsID8ganNwRmlsZSAhPSBudWxsIDogIUpTUF9GSUxFX0VERUZBVUxULmVxdWFscyhqc3BGaWxlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJcmV0dXJuIExPQURfT05fU1RBUlRVUF9FREVGQVVMVCA9PSBudWxsID8gbG9hZE9uU3RhcnR1cCAhPSBudWxsIDogIUxPQURfT05fU1RBUlRVUF9FREVGQVVMVC5lcXVhbHMobG9hZE9uU3RhcnR1cCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXJldHVybiBydW5BcyAhPSBudWxsOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZsZXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2bGV0Q2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VydmxldENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqc3BGaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGpzcEZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvYWRPblN0YXJ0dXA6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9hZE9uU3RhcnR1cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2bGV0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM1MmYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCNnZXRTZXJ2bGV0TmFtZSA8ZW0+U2VydmxldCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0TWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZsZXRNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldE5hbWUoKSA8ZW0+U2VydmxldCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXROYW1lKCkgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmxldE5hbWUgPSBTRVJWTEVUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJucygpIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB1cmxQYXR0ZXJucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0TWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLlNFUlZMRVRfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gc2VydmxldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIG5ld1NlcnZsZXROYW1lKSB7Ci0JCVN0cmluZyBvbGRTZXJ2bGV0TmFtZSA9IHNlcnZsZXROYW1lOwotCQlzZXJ2bGV0TmFtZSA9IG5ld1NlcnZsZXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FLCBvbGRTZXJ2bGV0TmFtZSwgc2VydmxldE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVcmxQYXR0ZXJucygpIHsKLQkJaWYgKHVybFBhdHRlcm5zID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVybFBhdHRlcm5UeXBlLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TKTsKLQkJfQotCQlyZXR1cm4gdXJsUGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVcmxQYXR0ZXJucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VydmxldE5hbWUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUU6Ci0JCQkJc2V0U2VydmxldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRToKLQkJCQlzZXRTZXJ2bGV0TmFtZShTRVJWTEVUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBTRVJWTEVUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZsZXROYW1lICE9IG51bGwgOiAhU0VSVkxFVF9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0TmFtZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIHVybFBhdHRlcm5zICE9IG51bGwgJiYgIXVybFBhdHRlcm5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmxldE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VydmxldE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmxldE1hcHBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmJlZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlc3Npb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2Vzc2lvbkNvbmZpZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkNvbmZpZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Db25maWcgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVGltZW91dCgpIDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlc3Npb25UaW1lb3V0KCkgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHNlc3Npb25UaW1lb3V0ID0gU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2Vzc2lvbkNvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLlNFU1NJT05fQ09ORklHOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFNlc3Npb25UaW1lb3V0KCkgewotCQlyZXR1cm4gc2Vzc2lvblRpbWVvdXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoQmlnSW50ZWdlciBuZXdTZXNzaW9uVGltZW91dCkgewotCQlCaWdJbnRlZ2VyIG9sZFNlc3Npb25UaW1lb3V0ID0gc2Vzc2lvblRpbWVvdXQ7Ci0JCXNlc3Npb25UaW1lb3V0ID0gbmV3U2Vzc2lvblRpbWVvdXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCwgb2xkU2Vzc2lvblRpbWVvdXQsIHNlc3Npb25UaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBnZXRTZXNzaW9uVGltZW91dCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJaWYobmV3VmFsdWUuZ2V0Q2xhc3MoKSA9PSBJbnRlZ2VyLmNsYXNzKSB7Ci0JCQkgICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBuZXdWYWx1ZTsKLQkJCQkgICAgc2V0U2Vzc2lvblRpbWVvdXQoQmlnSW50ZWdlci52YWx1ZU9mKGkpKTsKLQkJCQl9IGVsc2UgaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkgPT0gQmlnSW50ZWdlci5jbGFzcykKLQkJCQkJc2V0U2Vzc2lvblRpbWVvdXQoIChCaWdJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcgaWYgdmFsdWUgaXMgbm90IEludGVnZXIgb3IgQmlnSW50ZWdlci4KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJc2V0U2Vzc2lvblRpbWVvdXQoU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQgPT0gbnVsbCA/IHNlc3Npb25UaW1lb3V0ICE9IG51bGwgOiAhU0VTU0lPTl9USU1FT1VUX0VERUZBVUxULmVxdWFscyhzZXNzaW9uVGltZW91dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2Vzc2lvblRpbWVvdXQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2Vzc2lvblRpbWVvdXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2Vzc2lvbkNvbmZpZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcxYWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVzZXIgRGF0YSBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyRGF0YUNvbnN0cmFpbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBVc2VyRGF0YUNvbnN0cmFpbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVCA9IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuTk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlID0gVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNwb3J0IEd1YXJhbnRlZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuVVNFUl9EQVRBX0NPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGdldFRyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBuZXdUcmFuc3BvcnRHdWFyYW50ZWUpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBvbGRUcmFuc3BvcnRHdWFyYW50ZWUgPSB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZSA9IG5ld1RyYW5zcG9ydEd1YXJhbnRlZSA9PSBudWxsID8gVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVCA6IG5ld1RyYW5zcG9ydEd1YXJhbnRlZTsKLQkJYm9vbGVhbiBvbGRUcmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQkJdHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSwgdHJhbnNwb3J0R3VhcmFudGVlLCAhb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSA9IHRyYW5zcG9ydEd1YXJhbnRlZTsKLQkJYm9vbGVhbiBvbGRUcmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQkJdHJhbnNwb3J0R3VhcmFudGVlID0gVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVDsKLQkJdHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSwgVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVCwgb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQlzZXRUcmFuc3BvcnRHdWFyYW50ZWUoKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXVuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNwb3J0R3VhcmFudGVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHJhbnNwb3J0R3VhcmFudGVlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc3BvcnRHdWFyYW50ZWUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVXNlckRhdGFDb25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTZiZGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJcmV0dXJuIChXZWJBcHApZ2V0TWl4ZWQoKS5nZXQoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQLCBuZXdXZWJBcHAsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCwgbmV3V2ViQXBwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExOWIyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RGlzdHJpYnV0YWJsZXMgPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0Q29udGV4dFBhcmFtcyA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRGaWx0ZXJzIDxlbT5GaWx0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RmlsdGVyTWFwcGluZ3MgPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldExpc3RlbmVycyA8ZW0+TGlzdGVuZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0U2VydmxldHMgPGVtPlNlcnZsZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0U2Vzc2lvbkNvbmZpZ3MgPGVtPlNlc3Npb24gQ29uZmlnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldE1pbWVNYXBwaW5ncyA8ZW0+TWltZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEVycm9yUGFnZXMgPGVtPkVycm9yIFBhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0SnNwQ29uZmlncyA8ZW0+SnNwIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRTZWN1cml0eUNvbnN0cmFpbnRzIDxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldExvZ2luQ29uZmlncyA8ZW0+TG9naW4gQ29uZmlnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYkFwcCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1ldGFkYXRhIENvbXBsZXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBXZWJBcHBWZXJzaW9uVHlwZSBWRVJTSU9OX0VERUZBVUxUID0gV2ViQXBwVmVyc2lvblR5cGUuXzI1X0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXZWJBcHBWZXJzaW9uVHlwZSB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJBcHBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0RFU0NSSVBUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19ESVNQTEFZX05BTUVTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fSUNPTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3RyaWJ1dGFibGVzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19ESVNUUklCVVRBQkxFUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udGV4dFBhcmFtcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlcnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0ZJTFRFUlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19GSUxURVJfTUFQUElOR1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTElTVEVORVJTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2bGV0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VSVkxFVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZsZXRNYXBwaW5ncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2Vzc2lvbkNvbmZpZ3MoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NSU1FX01BUFBJTkdTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWxjb21lRmlsZUxpc3RzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVycm9yUGFnZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0VSUk9SX1BBR0VTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRKc3BDb25maWdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19KU1BfQ09ORklHUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvZ2luQ29uZmlncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTE9HSU5fQ09ORklHUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0VOVl9FTlRSSUVTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FSkJfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZJQ0VfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19SRVNPVVJDRV9SRUZTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVEZXN0cm95cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUFJFX0RFU1RST1lTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLldFQl9BUFBfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiBuZXdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCW1ldGFkYXRhQ29tcGxldGUgPSBuZXdNZXRhZGF0YUNvbXBsZXRlOwotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0ID0gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgbWV0YWRhdGFDb21wbGV0ZSwgIW9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0ID0gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JCW1ldGFkYXRhQ29tcGxldGUgPSBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQkJbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJQYWNrYWdlLldFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCwgb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwVmVyc2lvblR5cGUgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSBuZXdWZXJzaW9uKSB7Ci0JCVdlYkFwcFZlcnNpb25UeXBlIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbiA9PSBudWxsID8gVkVSU0lPTl9FREVGQVVMVCA6IG5ld1ZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24sICFvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyc2lvbigpIHsKLQkJV2ViQXBwVmVyc2lvblR5cGUgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0JCXZlcnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OLCBvbGRWZXJzaW9uLCBWRVJTSU9OX0VERUZBVUxULCBvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzdHJpYnV0YWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbHRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbHRlck1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmxldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlc3Npb25Db25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWltZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWxjb21lRmlsZUxpc3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVycm9yUGFnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SnNwQ29uZmlncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9naW5Db25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRVM6Ci0JCQkJcmV0dXJuIGdldERpc3RyaWJ1dGFibGVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldENvbnRleHRQYXJhbXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTOgotCQkJCXJldHVybiBnZXRTZXNzaW9uQ29uZmlncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldE1pbWVNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1dFTENPTUVfRklMRV9MSVNUUzoKLQkJCQlyZXR1cm4gZ2V0V2VsY29tZUZpbGVMaXN0cygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCXJldHVybiBnZXRFcnJvclBhZ2VzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJR1M6Ci0JCQkJcmV0dXJuIGdldEpzcENvbmZpZ3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJR1M6Ci0JCQkJcmV0dXJuIGdldExvZ2luQ29uZmlncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJpZXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiBnZXRFamJMb2NhbFJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0dST1VQOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRVM6Ci0JCQkJZ2V0RGlzdHJpYnV0YWJsZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3RyaWJ1dGFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJZ2V0RmlsdGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlnZXRGaWx0ZXJNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlnZXRTZXJ2bGV0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmxldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTOgotCQkJCWdldFNlc3Npb25Db25maWdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXNzaW9uQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFM6Ci0JCQkJZ2V0V2VsY29tZUZpbGVMaXN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0V2VsY29tZUZpbGVMaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCWdldEVycm9yUGFnZXMoKS5jbGVhcigpOwotCQkJCWdldEVycm9yUGFnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHUzoKLQkJCQlnZXRKc3BDb25maWdzKCkuY2xlYXIoKTsKLQkJCQlnZXRKc3BDb25maWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6Ci0JCQkJZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJR1M6Ci0JCQkJZ2V0TG9naW5Db25maWdzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb2dpbkNvbmZpZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChXZWJBcHBWZXJzaW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRVM6Ci0JCQkJZ2V0RGlzdHJpYnV0YWJsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlnZXRDb250ZXh0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlnZXRGaWx0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCWdldExpc3RlbmVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCWdldFNlcnZsZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJR1M6Ci0JCQkJZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCWdldE1pbWVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1dFTENPTUVfRklMRV9MSVNUUzoKLQkJCQlnZXRXZWxjb21lRmlsZUxpc3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJZ2V0RXJyb3JQYWdlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUdTOgotCQkJCWdldEpzcENvbmZpZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUzoKLQkJCQlnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHUzoKLQkJCQlnZXRMb2dpbkNvbmZpZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJdW5zZXRWZXJzaW9uKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICFnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gIWdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JQ09OUzoKLQkJCQlyZXR1cm4gIWdldEljb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCXJldHVybiAhZ2V0RGlzdHJpYnV0YWJsZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICFnZXRDb250ZXh0UGFyYW1zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJcmV0dXJuICFnZXRGaWx0ZXJzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gIWdldEZpbHRlck1hcHBpbmdzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gIWdldExpc3RlbmVycygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gIWdldFNlcnZsZXRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICFnZXRTZXJ2bGV0TWFwcGluZ3MoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTOgotCQkJCXJldHVybiAhZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gIWdldE1pbWVNYXBwaW5ncygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFM6Ci0JCQkJcmV0dXJuICFnZXRXZWxjb21lRmlsZUxpc3RzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCXJldHVybiAhZ2V0RXJyb3JQYWdlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHUzoKLQkJCQlyZXR1cm4gIWdldEpzcENvbmZpZ3MoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuICFnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJR1M6Ci0JCQkJcmV0dXJuICFnZXRMb2dpbkNvbmZpZ3MoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICFnZXRTZWN1cml0eVJvbGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAhZ2V0RW52RW50cmllcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gIWdldEVqYlJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAhZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gIWdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gIWdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gIWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAhZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICFnZXRQb3N0Q29uc3RydWN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICFnZXRQcmVEZXN0cm95cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFM6Ci0JCQkJcmV0dXJuICFnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gaXNTZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGFkYXRhQ29tcGxldGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXRhZGF0YUNvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChtZXRhZGF0YUNvbXBsZXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmVyc2lvbkVTZXQpIHJlc3VsdC5hcHBlbmQodmVyc2lvbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dlYkFwcEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTMyY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdlYkZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVdlYkZhY3RvcnkgdGhlV2ViRmFjdG9yeSA9IChXZWJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlV2ViRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVdlYkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgV2ViRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVycm9yUGFnZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZpbHRlcigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRmlsdGVyTWFwcGluZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxvZ2luQ29uZmlnKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWltZU1hcHBpbmcoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlcnZsZXQoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYkFwcCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BhdGNoZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU51bGxDaGFyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXZWJBcHBWZXJzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlRGlzcGF0Y2hlclR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FTkNPRElOR19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFbmNvZGluZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVycm9yQ29kZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh0dHBNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9BRF9PTl9TVEFSVFVQX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvYWRPblN0YXJ0dXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2FsZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWltZVR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTk9OX0VNUFRZX1NUUklOR19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOb25FbXB0eVN0cmluZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5OVUxMX0NIQVJfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZU51bGxDaGFyVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0TmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0FSX1BBVEhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV2FyUGF0aFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREaXNwYXRjaGVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROdWxsQ2hhclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V2ViQXBwVmVyc2lvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBdXRoTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydERpc3BhdGNoZXJUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FTkNPRElOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW5jb2RpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFcnJvckNvZGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RmlsdGVyTmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIdHRwTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9BRF9PTl9TVEFSVFVQX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMb2FkT25TdGFydHVwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMb2NhbGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1pbWVUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTk9OX0VNUFRZX1NUUklOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Tm9uRW1wdHlTdHJpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5OVUxMX0NIQVJfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnROdWxsQ2hhclR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U2VydmxldE5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0FSX1BBVEhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdhclBhdGhUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXZWJBcHBWZXJzaW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF1dGhDb25zdHJhaW50IGNyZWF0ZUF1dGhDb25zdHJhaW50KCkgewotCQlBdXRoQ29uc3RyYWludEltcGwgYXV0aENvbnN0cmFpbnQgPSBuZXcgQXV0aENvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKLQkJRXJyb3JQYWdlSW1wbCBlcnJvclBhZ2UgPSBuZXcgRXJyb3JQYWdlSW1wbCgpOwotCQlyZXR1cm4gZXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQlGaWx0ZXJJbXBsIGZpbHRlciA9IG5ldyBGaWx0ZXJJbXBsKCk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpbHRlck1hcHBpbmcgY3JlYXRlRmlsdGVyTWFwcGluZygpIHsKLQkJRmlsdGVyTWFwcGluZ0ltcGwgZmlsdGVyTWFwcGluZyA9IG5ldyBGaWx0ZXJNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gZmlsdGVyTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpIHsKLQkJRm9ybUxvZ2luQ29uZmlnSW1wbCBmb3JtTG9naW5Db25maWcgPSBuZXcgRm9ybUxvZ2luQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2NhbGVFbmNvZGluZ01hcHBpbmcgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkgewotCQlMb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsIGxvY2FsZUVuY29kaW5nTWFwcGluZyA9IG5ldyBMb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBsb2NhbGVFbmNvZGluZ01hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpIHsKLQkJTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCA9IG5ldyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCgpOwotCQlyZXR1cm4gbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWcgY3JlYXRlTG9naW5Db25maWcoKSB7Ci0JCUxvZ2luQ29uZmlnSW1wbCBsb2dpbkNvbmZpZyA9IG5ldyBMb2dpbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZyBjcmVhdGVNaW1lTWFwcGluZygpIHsKLQkJTWltZU1hcHBpbmdJbXBsIG1pbWVNYXBwaW5nID0gbmV3IE1pbWVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gbWltZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Q29uc3RyYWludCBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKSB7Ci0JCVNlY3VyaXR5Q29uc3RyYWludEltcGwgc2VjdXJpdHlDb25zdHJhaW50ID0gbmV3IFNlY3VyaXR5Q29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldCBjcmVhdGVTZXJ2bGV0KCkgewotCQlTZXJ2bGV0SW1wbCBzZXJ2bGV0ID0gbmV3IFNlcnZsZXRJbXBsKCk7Ci0JCXJldHVybiBzZXJ2bGV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TWFwcGluZyBjcmVhdGVTZXJ2bGV0TWFwcGluZygpIHsKLQkJU2VydmxldE1hcHBpbmdJbXBsIHNlcnZsZXRNYXBwaW5nID0gbmV3IFNlcnZsZXRNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmxldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlc3Npb25Db25maWcgY3JlYXRlU2Vzc2lvbkNvbmZpZygpIHsKLQkJU2Vzc2lvbkNvbmZpZ0ltcGwgc2Vzc2lvbkNvbmZpZyA9IG5ldyBTZXNzaW9uQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVXNlckRhdGFDb25zdHJhaW50IGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJVXNlckRhdGFDb25zdHJhaW50SW1wbCB1c2VyRGF0YUNvbnN0cmFpbnQgPSBuZXcgVXNlckRhdGFDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBcHAgY3JlYXRlV2ViQXBwKCkgewotCQlXZWJBcHBJbXBsIHdlYkFwcCA9IG5ldyBXZWJBcHBJbXBsKCk7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpIHsKLQkJV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCB3ZWJSZXNvdXJjZUNvbGxlY3Rpb24gPSBuZXcgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3QgY3JlYXRlV2VsY29tZUZpbGVMaXN0KCkgewotCQlXZWxjb21lRmlsZUxpc3RJbXBsIHdlbGNvbWVGaWxlTGlzdCA9IG5ldyBXZWxjb21lRmlsZUxpc3RJbXBsKCk7Ci0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BhdGNoZXJUeXBlIGNyZWF0ZURpc3BhdGNoZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IERpc3BhdGNoZXJUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREaXNwYXRjaGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOdWxsQ2hhclR5cGUgY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCU51bGxDaGFyVHlwZSByZXN1bHQgPSBOdWxsQ2hhclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE51bGxDaGFyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSByZXN1bHQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcFZlcnNpb25UeXBlIGNyZWF0ZVdlYkFwcFZlcnNpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVdlYkFwcFZlcnNpb25UeXBlIHJlc3VsdCA9IFdlYkFwcFZlcnNpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWJBcHBWZXJzaW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQXV0aE1ldGhvZFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QXV0aE1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BhdGNoZXJUeXBlIGNyZWF0ZURpc3BhdGNoZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoRGlzcGF0Y2hlclR5cGUpY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRElTUEFUQ0hFUl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERpc3BhdGNoZXJUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnREaXNwYXRjaGVyVHlwZVRvU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRElTUEFUQ0hFUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVuY29kaW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5TVFJJTkcsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RW5jb2RpbmdUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU1RSSU5HLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFcnJvckNvZGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5QT1NJVElWRV9JTlRFR0VSLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVycm9yQ29kZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5QT1NJVElWRV9JTlRFR0VSLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZpbHRlck5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKWNyZWF0ZU5vbkVtcHR5U3RyaW5nVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OT05fRU1QVFlfU1RSSU5HX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RmlsdGVyTmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydE5vbkVtcHR5U3RyaW5nVHlwZVRvU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh0dHBNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh0dHBNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlTG9hZE9uU3RhcnR1cFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCVJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IChPYmplY3QpY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZURhdGFUeXBlLCByZXN1bHQsIG51bGwsIG51bGwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoT2JqZWN0KVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIsIGluaXRpYWxWYWx1ZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShlRGF0YVR5cGUsIHJlc3VsdCwgbnVsbCwgbnVsbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsIHx8IGV4Y2VwdGlvbiA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwotICAgIAotCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMb2FkT25TdGFydHVwVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCWlmIChpbnN0YW5jZVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlpZiAoV2ViUGFja2FnZS5MaXRlcmFscy5OVUxMX0NIQVJfVFlQRS5pc0luc3RhbmNlKGluc3RhbmNlVmFsdWUpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2YWx1ZSA9IGNvbnZlcnROdWxsQ2hhclR5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIuaXNJbnN0YW5jZShpbnN0YW5jZVZhbHVlKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIsIGluc3RhbmNlVmFsdWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgdmFsdWUgPSBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmFsdWU6ICciK2luc3RhbmNlVmFsdWUrIicgZm9yIGRhdGF0eXBlIDoiK2VEYXRhVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTG9jYWxlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5TVFJJTkcsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TG9jYWxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlNUUklORywgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNaW1lVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWltZVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTm9uRW1wdHlTdHJpbmdUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5vbkVtcHR5U3RyaW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTnVsbENoYXJUeXBlIGNyZWF0ZU51bGxDaGFyVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKE51bGxDaGFyVHlwZSljcmVhdGVOdWxsQ2hhclR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTlVMTF9DSEFSX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TnVsbENoYXJUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnROdWxsQ2hhclR5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVNlcnZsZXROYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZyljcmVhdGVOb25FbXB0eVN0cmluZ1R5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcnZsZXROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0Tm9uRW1wdHlTdHJpbmdUeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OT05fRU1QVFlfU1RSSU5HX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKWNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVXYXJQYXRoVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXYXJQYXRoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwVmVyc2lvblR5cGUgY3JlYXRlV2ViQXBwVmVyc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChXZWJBcHBWZXJzaW9uVHlwZSljcmVhdGVXZWJBcHBWZXJzaW9uVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX1ZFUlNJT05fVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWJBcHBWZXJzaW9uVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0V2ViQXBwVmVyc2lvblR5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfVkVSU0lPTl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViUGFja2FnZSBnZXRXZWJQYWNrYWdlKCkgewotCQlyZXR1cm4gKFdlYlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vV2ViRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0MmJjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC5uYW1lc3BhY2UuWE1MTmFtZXNwYWNlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbC5XZWJWYWxpZGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdXRoQ29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlcnJvclBhZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbHRlck1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZm9ybUxvZ2luQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvZ2luQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2bGV0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZsZXRNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlc3Npb25Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdXNlckRhdGFDb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYkFwcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2VsY29tZUZpbGVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZGlzcGF0Y2hlclR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG51bGxDaGFyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gd2ViQXBwVmVyc2lvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhdXRoTWV0aG9kVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkaXNwYXRjaGVyVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbmNvZGluZ1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBmaWx0ZXJOYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBodHRwTWV0aG9kVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsb2NhbGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1pbWVUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbnVsbENoYXJUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcnZsZXROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdhclBhdGhUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYlBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBXZWJGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgV2ViUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVXZWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZVdlYlBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gV2ViVmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXZWJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVXZWJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X1JvbGVOYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JQYWdlKCkgewotCQlyZXR1cm4gZXJyb3JQYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUGFnZV9FcnJvckNvZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUGFnZV9Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUGFnZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsdGVyTWFwcGluZygpIHsKLQkJcmV0dXJuIGZpbHRlck1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkgewotCQlyZXR1cm4gbG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCXJldHVybiBsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNaW1lTWFwcGluZygpIHsKLQkJcmV0dXJuIG1pbWVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0KCkgewotCQlyZXR1cm4gc2VydmxldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9TZXJ2bGV0Q2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Kc3BGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9SdW5BcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0TWFwcGluZygpIHsKLQkJcmV0dXJuIHNlcnZsZXRNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2Vzc2lvbkNvbmZpZygpIHsKLQkJcmV0dXJuIHNlc3Npb25Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQ29uZmlnX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJBcHAoKSB7Ci0JCXJldHVybiB3ZWJBcHBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Nlc3Npb25Db25maWdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0pzcENvbmZpZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRW52RW50cmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9QcmVEZXN0cm95cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWxjb21lRmlsZUxpc3QoKSB7Ci0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlbGNvbWVGaWxlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlbGNvbWVGaWxlTGlzdF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlbGNvbWVGaWxlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREaXNwYXRjaGVyVHlwZSgpIHsKLQkJcmV0dXJuIGRpc3BhdGNoZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE51bGxDaGFyVHlwZSgpIHsKLQkJcmV0dXJuIG51bGxDaGFyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXZWJBcHBWZXJzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHdlYkFwcFZlcnNpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRBdXRoTWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIGF1dGhNZXRob2RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGlzcGF0Y2hlclR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBkaXNwYXRjaGVyVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuIGVuY29kaW5nVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVycm9yQ29kZVR5cGUoKSB7Ci0JCXJldHVybiBlcnJvckNvZGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RmlsdGVyTmFtZVR5cGUoKSB7Ci0JCXJldHVybiBmaWx0ZXJOYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh0dHBNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMb2FkT25TdGFydHVwVHlwZSgpIHsKLQkJcmV0dXJuIGxvYWRPblN0YXJ0dXBUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TG9jYWxlVHlwZSgpIHsKLQkJcmV0dXJuIGxvY2FsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNaW1lVHlwZVR5cGUoKSB7Ci0JCXJldHVybiBtaW1lVHlwZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROb25FbXB0eVN0cmluZ1R5cGUoKSB7Ci0JCXJldHVybiBub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROdWxsQ2hhclR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsQ2hhclR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTZXJ2bGV0TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TmFtZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdhclBhdGhUeXBlKCkgewotCQlyZXR1cm4gd2FyUGF0aFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXZWJBcHBWZXJzaW9uVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJGYWN0b3J5IGdldFdlYkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoV2ViRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhdXRoQ29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fSUQpOwotCi0JCWVycm9yUGFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFUlJPUl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX0VSUk9SX0NPREUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fSUQpOwotCi0JCWZpbHRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUxURVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlckVDbGFzcywgRklMVEVSX19GSUxURVJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0ZJTFRFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fSUQpOwotCi0JCWZpbHRlck1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMVEVSX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fSUQpOwotCi0JCWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGT1JNX0xPR0lOX0NPTkZJRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRk9STV9MT0dJTl9DT05GSUdfX0lEKTsKLQotCQlsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzcywgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzLCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzcywgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEKTsKLQotCQlsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19JRCk7Ci0KLQkJbG9naW5Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9HSU5fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX0lEKTsKLQotCQltaW1lTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fTUlNRV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaW1lTWFwcGluZ0VDbGFzcywgTUlNRV9NQVBQSU5HX19JRCk7Ci0KLQkJc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEKTsKLQotCQlzZXJ2bGV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFUlZMRVRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fU0VSVkxFVF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSlNQX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19MT0FEX09OX1NUQVJUVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1JVTl9BUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19JRCk7Ci0KLQkJc2VydmxldE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVkxFVF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fSUQpOwotCi0JCXNlc3Npb25Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VTU0lPTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19JRCk7Ci0KLQkJdXNlckRhdGFDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFVTRVJfREFUQV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0lEKTsKLQotCQl3ZWJBcHBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX0FQUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19ESVNUUklCVVRBQkxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19DT05URVhUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19GSUxURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19MSVNURU5FUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VSVkxFVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRVNTSU9OX0NPTkZJR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRVJST1JfUEFHRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fSlNQX0NPTkZJR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTE9HSU5fQ09ORklHUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19FTlZfRU5UUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19FSkJfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRVJWSUNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19QT1NUX0NPTlNUUlVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUFJFX0RFU1RST1lTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1ZFUlNJT04pOwotCi0JCXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQKTsKLQotCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1JFU09VUkNFX0NPTExFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRCk7Ci0KLQkJd2VsY29tZUZpbGVMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFTENPTUVfRklMRV9MSVNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWxjb21lRmlsZUxpc3RFQ2xhc3MsIFdFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWxjb21lRmlsZUxpc3RFQ2xhc3MsIFdFTENPTUVfRklMRV9MSVNUX19JRCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWRpc3BhdGNoZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShESVNQQVRDSEVSX1RZUEUpOwotCQludWxsQ2hhclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE5VTExfQ0hBUl9UWVBFKTsKLQkJdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFKTsKLQkJd2ViQXBwVmVyc2lvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFdFQl9BUFBfVkVSU0lPTl9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlhdXRoTWV0aG9kVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShBVVRIX01FVEhPRF9UWVBFKTsKLQkJZGlzcGF0Y2hlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRElTUEFUQ0hFUl9UWVBFX09CSkVDVCk7Ci0JCWVuY29kaW5nVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFTkNPRElOR19UWVBFKTsKLQkJZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFUlJPUl9DT0RFX1RZUEUpOwotCQlmaWx0ZXJOYW1lVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShGSUxURVJfTkFNRV9UWVBFKTsKLQkJaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSFRUUF9NRVRIT0RfVFlQRSk7Ci0JCWxvYWRPblN0YXJ0dXBUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKExPQURfT05fU1RBUlRVUF9UWVBFKTsKLQkJbG9jYWxlVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0NBTEVfVFlQRSk7Ci0JCW1pbWVUeXBlVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShNSU1FX1RZUEVfVFlQRSk7Ci0JCW5vbkVtcHR5U3RyaW5nVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShOT05fRU1QVFlfU1RSSU5HX1RZUEUpOwotCQludWxsQ2hhclR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTlVMTF9DSEFSX1RZUEVfT0JKRUNUKTsKLQkJc2VydmxldE5hbWVUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUlZMRVRfTkFNRV9UWVBFKTsKLQkJdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUKTsKLQkJd2FyUGF0aFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoV0FSX1BBVEhfVFlQRSk7Ci0JCXdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdFQl9BUFBfVkVSU0lPTl9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlKc3BQYWNrYWdlIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIkF1dGhDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVycm9yUGFnZUVDbGFzcywgRXJyb3JQYWdlLmNsYXNzLCAiRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9FcnJvckNvZGUoKSwgdGhpcy5nZXRFcnJvckNvZGVUeXBlKCksICJlcnJvckNvZGUiLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9Mb2NhdGlvbigpLCB0aGlzLmdldFdhclBhdGhUeXBlKCksICJsb2NhdGlvbiIsIG51bGwsIDEsIDEsIEVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JQYWdlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZmlsdGVyRUNsYXNzLCBGaWx0ZXIuY2xhc3MsICJGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKSwgdGhpcy5nZXRGaWx0ZXJOYW1lVHlwZSgpLCAiZmlsdGVyTmFtZSIsIG51bGwsIDEsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImZpbHRlckNsYXNzIiwgbnVsbCwgMSwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZpbHRlck1hcHBpbmcuY2xhc3MsICJGaWx0ZXJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpLCB0aGlzLmdldEZpbHRlck5hbWVUeXBlKCksICJmaWx0ZXJOYW1lIiwgbnVsbCwgMSwgMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFVybFBhdHRlcm5UeXBlKCksIG51bGwsICJ1cmxQYXR0ZXJucyIsIG51bGwsIDAsIC0xLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfU2VydmxldE5hbWVzKCksIHRoaXMuZ2V0U2VydmxldE5hbWVUeXBlKCksICJzZXJ2bGV0TmFtZXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpLCB0aGlzLmdldERpc3BhdGNoZXJUeXBlKCksICJkaXNwYXRjaGVycyIsICJGT1JXQVJEIiwgMCwgNCwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAiRm9ybUxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCksIHRoaXMuZ2V0V2FyUGF0aFR5cGUoKSwgImZvcm1Mb2dpblBhZ2UiLCBudWxsLCAxLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCksIHRoaXMuZ2V0V2FyUGF0aFR5cGUoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAxLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzcywgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAiTG9jYWxlRW5jb2RpbmdNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKSwgdGhpcy5nZXRMb2NhbGVUeXBlKCksICJsb2NhbGUiLCBudWxsLCAxLCAxLCBMb2NhbGVFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpLCB0aGlzLmdldEVuY29kaW5nVHlwZSgpLCAiZW5jb2RpbmciLCBudWxsLCAxLCAxLCBMb2NhbGVFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMb2NhbGVFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICJMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIHRoaXMuZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxvZ2luQ29uZmlnRUNsYXNzLCBMb2dpbkNvbmZpZy5jbGFzcywgIkxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgdGhpcy5nZXRBdXRoTWV0aG9kVHlwZSgpLCAiYXV0aE1ldGhvZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInJlYWxtTmFtZSIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKSwgdGhpcy5nZXRGb3JtTG9naW5Db25maWcoKSwgbnVsbCwgImZvcm1Mb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImV4dGVuc2lvbiIsIG51bGwsIDEsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNaW1lTWFwcGluZ19NaW1lVHlwZSgpLCB0aGlzLmdldE1pbWVUeXBlVHlwZSgpLCAibWltZVR5cGUiLCBudWxsLCAxLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAiU2VjdXJpdHlDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLCB0aGlzLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpLCBudWxsLCAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIsIG51bGwsIDEsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCksIHRoaXMuZ2V0QXV0aENvbnN0cmFpbnQoKSwgbnVsbCwgImF1dGhDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSwgbnVsbCwgInVzZXJEYXRhQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0RUNsYXNzLCBTZXJ2bGV0LmNsYXNzLCAiU2VydmxldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIHRoaXMuZ2V0U2VydmxldE5hbWVUeXBlKCksICJzZXJ2bGV0TmFtZSIsIG51bGwsIDEsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfU2VydmxldENsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInNlcnZsZXRDbGFzcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfSnNwRmlsZSgpLCB0aGVKc3BQYWNrYWdlLmdldEpzcEZpbGVUeXBlKCksICJqc3BGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9Jbml0UGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpLCB0aGlzLmdldExvYWRPblN0YXJ0dXBUeXBlKCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9SdW5BcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJ1bkFzKCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU2VydmxldE1hcHBpbmcuY2xhc3MsICJTZXJ2bGV0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0TmFtZSgpLCB0aGlzLmdldFNlcnZsZXROYW1lVHlwZSgpLCAic2VydmxldE5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAxLCAtMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlc3Npb25Db25maWdFQ2xhc3MsIFNlc3Npb25Db25maWcuY2xhc3MsICJTZXNzaW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50ZWdlcigpLCAic2Vzc2lvblRpbWVvdXQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQ29uZmlnX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAiVXNlckRhdGFDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCksIHRoaXMuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpLCAidHJhbnNwb3J0R3VhcmFudGVlIiwgIk5PTkUiLCAxLCAxLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3ZWJBcHBFQ2xhc3MsIFdlYkFwcC5jbGFzcywgIldlYkFwcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW1wdHlUeXBlKCksIG51bGwsICJkaXN0cmlidXRhYmxlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJjb250ZXh0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsdGVycygpLCB0aGlzLmdldEZpbHRlcigpLCBudWxsLCAiZmlsdGVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIHRoaXMuZ2V0RmlsdGVyTWFwcGluZygpLCBudWxsLCAiZmlsdGVyTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9MaXN0ZW5lcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaXN0ZW5lcigpLCBudWxsLCAibGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VydmxldHMoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpLCB0aGlzLmdldFNlcnZsZXRNYXBwaW5nKCksIG51bGwsICJzZXJ2bGV0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpLCB0aGlzLmdldFNlc3Npb25Db25maWcoKSwgbnVsbCwgInNlc3Npb25Db25maWdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCksIHRoaXMuZ2V0TWltZU1hcHBpbmcoKSwgbnVsbCwgIm1pbWVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgbnVsbCwgIndlbGNvbWVGaWxlTGlzdHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FcnJvclBhZ2VzKCksIHRoaXMuZ2V0RXJyb3JQYWdlKCksIG51bGwsICJlcnJvclBhZ2VzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfSnNwQ29uZmlncygpLCB0aGVKc3BQYWNrYWdlLmdldEpzcENvbmZpZygpLCBudWxsLCAianNwQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgbnVsbCwgInNlY3VyaXR5Q29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Mb2dpbkNvbmZpZ3MoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZygpLCBudWxsLCAibG9naW5Db25maWdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlQ29udGV4dFJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLCB0aGlzLmdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX1ZlcnNpb24oKSwgdGhpcy5nZXRXZWJBcHBWZXJzaW9uVHlwZSgpLCAidmVyc2lvbiIsICIyLjUiLCAxLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3Mod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmNsYXNzLCAiV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCBudWxsLCAid2ViQXBwIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgIndlYlJlc291cmNlTmFtZSIsIG51bGwsIDEsIDEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFVybFBhdHRlcm5UeXBlKCksIG51bGwsICJ1cmxQYXR0ZXJucyIsIG51bGwsIDEsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCksIHRoaXMuZ2V0SHR0cE1ldGhvZFR5cGUoKSwgImh0dHBNZXRob2RzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICJXZWxjb21lRmlsZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndlbGNvbWVGaWxlcyIsIG51bGwsIDEsIC0xLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlTGlzdF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuY2xhc3MsICJEaXNwYXRjaGVyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLlJFUVVFU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5FUlJPUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obnVsbENoYXJUeXBlRUVudW0sIE51bGxDaGFyVHlwZS5jbGFzcywgIk51bGxDaGFyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChudWxsQ2hhclR5cGVFRW51bSwgTnVsbENoYXJUeXBlLl9fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5jbGFzcywgIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuSU5URUdSQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuQ09ORklERU5USUFMX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh3ZWJBcHBWZXJzaW9uVHlwZUVFbnVtLCBXZWJBcHBWZXJzaW9uVHlwZS5jbGFzcywgIldlYkFwcFZlcnNpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHdlYkFwcFZlcnNpb25UeXBlRUVudW0sIFdlYkFwcFZlcnNpb25UeXBlLl8yNV9MSVRFUkFMKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShhdXRoTWV0aG9kVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiQXV0aE1ldGhvZFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZGlzcGF0Y2hlclR5cGVPYmplY3RFRGF0YVR5cGUsIERpc3BhdGNoZXJUeXBlLmNsYXNzLCAiRGlzcGF0Y2hlclR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlbmNvZGluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkVuY29kaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlcnJvckNvZGVUeXBlRURhdGFUeXBlLCBCaWdJbnRlZ2VyLmNsYXNzLCAiRXJyb3JDb2RlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShmaWx0ZXJOYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRmlsdGVyTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkh0dHBNZXRob2RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGxvYWRPblN0YXJ0dXBUeXBlRURhdGFUeXBlLCBPYmplY3QuY2xhc3MsICJMb2FkT25TdGFydHVwVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShsb2NhbGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJMb2NhbGVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1pbWVUeXBlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTWltZVR5cGVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG5vbkVtcHR5U3RyaW5nVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTm9uRW1wdHlTdHJpbmdUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG51bGxDaGFyVHlwZU9iamVjdEVEYXRhVHlwZSwgTnVsbENoYXJUeXBlLmNsYXNzLCAiTnVsbENoYXJUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VydmxldE5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2bGV0TmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEVEYXRhVHlwZSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5jbGFzcywgIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZSh3YXJQYXRoVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiV2FyUGF0aFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUod2ViQXBwVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIFdlYkFwcFZlcnNpb25UeXBlLmNsYXNzLCAiV2ViQXBwVmVyc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImF1dGgtY29uc3RyYWludFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEF1dGhDb25zdHJhaW50X1JvbGVOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicm9sZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXV0aENvbnN0cmFpbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhdXRoTWV0aG9kVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXV0aC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRpc3BhdGNoZXJUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImRpc3BhdGNoZXJUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNwYXRjaGVyVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZGlzcGF0Y2hlclR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImRpc3BhdGNoZXJUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZW5jb2RpbmdUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbmNvZGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIlteXFxzXSsiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlcnJvckNvZGVUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlcnJvci1jb2RlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjcG9zaXRpdmVJbnRlZ2VyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiXFxkezN9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXJyb3JQYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlcnJvci1wYWdlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlcnJvci1jb2RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJleGNlcHRpb24tdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXJyb3JQYWdlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZmlsdGVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJmaWx0ZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpbHRlci1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZmlsdGVyLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9Jbml0UGFyYW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbml0LXBhcmFtIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZmlsdGVyTWFwcGluZ0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZmlsdGVyLW1hcHBpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZmlsdGVyLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJNYXBwaW5nX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXJsLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDoxIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmxldC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGF0Y2hlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlck1hcHBpbmdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChmaWx0ZXJOYW1lVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZmlsdGVyLW5hbWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgIm5vbkVtcHR5U3RyaW5nVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZm9ybS1sb2dpbi1jb25maWdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZm9ybS1sb2dpbi1wYWdlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJmb3JtLWVycm9yLXBhZ2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGb3JtTG9naW5Db25maWdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChodHRwTWV0aG9kVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaHR0cC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIltcXHB7TH0tW1xccHtDY31cXHB7Wn1dXSsiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvYWRPblN0YXJ0dXBUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsb2FkLW9uLXN0YXJ0dXBUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm1lbWJlclR5cGVzIiwgIm51bGwtY2hhclR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVuY29kaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvY2FsZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvY2FsZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIlthLXpdezJ9KF98LSk/KFtcXHB7TH1cXC1cXHB7TmR9XXsyfSk/IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobG9naW5Db25maWdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvZ2luLWNvbmZpZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXV0aC1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZWFsbS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJmb3JtLWxvZ2luLWNvbmZpZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvZ2luQ29uZmlnX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWltZU1hcHBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1pbWUtbWFwcGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJleHRlbnNpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNaW1lTWFwcGluZ19NaW1lVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWltZS10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWltZU1hcHBpbmdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtaW1lVHlwZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1pbWUtdHlwZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiW15cXHB7Q2N9Xlxcc10rL1teXFxwe0NjfV5cXHNdKyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG5vbkVtcHR5U3RyaW5nVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibm9uRW1wdHlTdHJpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJtaW5MZW5ndGgiLCAiMSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobnVsbENoYXJUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm51bGwtY2hhclR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG51bGxDaGFyVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibnVsbC1jaGFyVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAibnVsbC1jaGFyVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VjdXJpdHktY29uc3RyYWludFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhdXRoLWNvbnN0cmFpbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ1c2VyLWRhdGEtY29uc3RyYWludCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Q29uc3RyYWludF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZsZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZsZXRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmxldC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfU2VydmxldENsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2bGV0LWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldF9Kc3BGaWxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJqc3AtZmlsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5pdC1wYXJhbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvYWQtb24tc3RhcnR1cCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfUnVuQXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJ1bi1hcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VjdXJpdHktcm9sZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmxldE1hcHBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZsZXQtbWFwcGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZsZXQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ1cmwtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRNYXBwaW5nX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmxldE5hbWVUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2bGV0LW5hbWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgIm5vbkVtcHR5U3RyaW5nVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlc3Npb25Db25maWdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlc3Npb24tY29uZmlnVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2Vzc2lvbi10aW1lb3V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidHJhbnNwb3J0LWd1YXJhbnRlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVzZXJEYXRhQ29uc3RyYWludF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdhclBhdGhUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3YXItcGF0aFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiLy4qIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3ZWJBcHBFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIndlYi1hcHBUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImdyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXN0cmlidXRhYmxlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjb250ZXh0LXBhcmFtIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpbHRlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZmlsdGVyLW1hcHBpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTGlzdGVuZXJzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9TZXJ2bGV0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmxldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZsZXQtbWFwcGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2Vzc2lvbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtaW1lLW1hcHBpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfV2VsY29tZUZpbGVMaXN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAid2VsY29tZS1maWxlLWxpc3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXJyb3ItcGFnZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9Kc3BDb25maWdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJqc3AtY29uZmlnIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LWNvbnN0cmFpbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTG9naW5Db25maWdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2dpbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VjdXJpdHktcm9sZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9FbnZFbnRyaWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWxvY2FsLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfU2VydmljZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1lbnYtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9Qb3N0Q29uc3RydWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1jb25zdHJ1Y3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1ByZURlc3Ryb3lzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGFkYXRhLWNvbXBsZXRlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAibWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIjptaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlYi1hcHAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViQXBwVmVyc2lvblR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAid2ViLWFwcC12ZXJzaW9uVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViQXBwVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIndlYi1hcHAtdmVyc2lvblR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgIndlYi1hcHAtdmVyc2lvblR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAid2ViLXJlc291cmNlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXJsLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImh0dHAtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2VsY29tZUZpbGVMaXN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3ZWxjb21lLWZpbGUtbGlzdFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlbGNvbWUtZmlsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlbGNvbWVGaWxlTGlzdF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL1dlYlBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE1MDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsI2dldFdlYlJlc291cmNlTmFtZSA8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXRIdHRwTWV0aG9kcyA8ZW0+SHR0cCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlJlc291cmNlTmFtZSgpIDxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdlYlJlc291cmNlTmFtZSA9IFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybnMoKSA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJsUGF0dGVybnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHR0cE1ldGhvZHMoKSA8ZW0+SHR0cCBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh0dHBNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaHR0cE1ldGhvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX1JFU09VUkNFX0NPTExFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiB3ZWJSZXNvdXJjZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZyBuZXdXZWJSZXNvdXJjZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFdlYlJlc291cmNlTmFtZSA9IHdlYlJlc291cmNlTmFtZTsKLQkJd2ViUmVzb3VyY2VOYW1lID0gbmV3V2ViUmVzb3VyY2VOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSwgb2xkV2ViUmVzb3VyY2VOYW1lLCB3ZWJSZXNvdXJjZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VXJsUGF0dGVybnMoKSB7Ci0JCWlmICh1cmxQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQl1cmxQYXR0ZXJucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChVcmxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk5TKTsKLQkJfQotCQlyZXR1cm4gdXJsUGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SHR0cE1ldGhvZHMoKSB7Ci0JCWlmIChodHRwTWV0aG9kcyA9PSBudWxsKSB7Ci0JCQlodHRwTWV0aG9kcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUyk7Ci0JCX0KLQkJcmV0dXJuIGh0dHBNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgotCQkJCXJldHVybiBnZXRIdHRwTWV0aG9kcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlzZXRXZWJSZXNvdXJjZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk5TOgotCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFM6Ci0JCQkJZ2V0SHR0cE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldEh0dHBNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgotCQkJCXNldFdlYlJlc291cmNlTmFtZShXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFM6Ci0JCQkJZ2V0SHR0cE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlyZXR1cm4gV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdlYlJlc291cmNlTmFtZSAhPSBudWxsIDogIVdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxULmVxdWFscyh3ZWJSZXNvdXJjZU5hbWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIHVybFBhdHRlcm5zICE9IG51bGwgJiYgIXVybFBhdHRlcm5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgotCQkJCXJldHVybiBodHRwTWV0aG9kcyAhPSBudWxsICYmICFodHRwTWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod2ViUmVzb3VyY2VOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdlYlJlc291cmNlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHR0cE1ldGhvZHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaHR0cE1ldGhvZHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MThiOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VsY29tZSBGaWxlIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbCNnZXRXZWxjb21lRmlsZXMgPGVtPldlbGNvbWUgRmlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWxjb21lRmlsZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlbGNvbWVGaWxlcygpIDxlbT5XZWxjb21lIEZpbGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlbGNvbWVGaWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdlbGNvbWVGaWxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWxjb21lRmlsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5XRUxDT01FX0ZJTEVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWxjb21lRmlsZXMoKSB7Ci0JCWlmICh3ZWxjb21lRmlsZXMgPT0gbnVsbCkgewotCQkJd2VsY29tZUZpbGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUyk7Ci0JCX0KLQkJcmV0dXJuIHdlbGNvbWVGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTOgotCQkJCXJldHVybiBnZXRXZWxjb21lRmlsZXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUzoKLQkJCQlnZXRXZWxjb21lRmlsZXMoKS5jbGVhcigpOwotCQkJCWdldFdlbGNvbWVGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTOgotCQkJCWdldFdlbGNvbWVGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVM6Ci0JCQkJcmV0dXJuIHdlbGNvbWVGaWxlcyAhPSBudWxsICYmICF3ZWxjb21lRmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlbGNvbWVGaWxlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3ZWxjb21lRmlsZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2VsY29tZUZpbGVMaXN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL21ldGFkYXRhL1dlYlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL21ldGFkYXRhL1dlYlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkMWE0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9tZXRhZGF0YS9XZWJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgICAgIEAoIyl3ZWItYXBwXzJfNS54c2RzCTEuNjIgMDUvMDgvMDYKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICAKLSAqIAotICogCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAJVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJXRUItSU5GL3dlYi54bWwiIGluIHRoZQotICogCXdlYiBhcHBsaWNhdGlvbidzIHdhciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotICogCW11c3QgaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUKLSAqIAluYW1lc3BhY2U6Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAotICogCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAqIAl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICogCi0gKiAJICAgICZsdDt3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gKiAJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAqIAkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLSAqIAkgICAgICB2ZXJzaW9uPSIyLjUiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L3dlYi1hcHAmZ3Q7Ci0gKiAKLSAqIAlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAqIAl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0gKiAJbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QKLSAqIAotICogCQotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAotICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlXzUueHNkcwkxLjY1IDA2LzAyLzE3Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLSAqIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotICogaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotICogCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgajJlZSBhcHBsaWNhdGlvbjsKLSAqICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gKiAgICAgd2ViIGFwcGxpY2F0aW9uOwotICogICAgIGVudGVycHJpc2UgYmVhbjsKLSAqICAgICByZXNvdXJjZSBhZGFwdGVyOwotICogCi0gKiBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGVhciBmaWxlOwotICogICAgIHdhciBmaWxlOwotICogICAgIGphciBmaWxlOwotICogICAgIHJhciBmaWxlOwotICogCi0gKiAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2RzCTEuMTkgMDIvMTMvMDYKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICogICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gKiAKLSAqICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQotICogICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAotICogCi0gKiAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCi0gKiAgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCi0gKiAgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCi0gKiAgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCi0gKiAgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6Ci0gKiAKLSAqICAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55Ci0gKiAgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAotICogICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGlmIGRlY2xhcmVkIHRvIGJlIG9mIHR5cGUgSUQuCi0gKiAgICAgICAgICBUaGUgeG1sOmlkIHNwZWNpZmljYXRpb24gaXMgbm90IHlldCBhIFczQyBSZWNvbW1lbmRhdGlvbiwKLSAqICAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uCi0gKiAgICAgICAgICB3aXRoIHRoZSBtZWNoYW5pc21zIGl0IHByb3Bvc2VzLiAgTm90ZSB0aGF0IGl0IGlzIF9ub3RfIGluY2x1ZGVkCi0gKiAgICAgICAgICBpbiB0aGUgc3BlY2lhbEF0dHJzIGF0dHJpYnV0ZSBncm91cC4KLSAqIAotICogICAgIGxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKLSAqICAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKLSAqIAotICogICAgICAgICAgICAgIEluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQgZGVkaWNhdGlvbgotICogICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMAotICogICAgICAgICAgICAgIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eSB0aGUgWE1MIG5hbWUKLSAqICAgICAgICAgICAgICB4bWw6RmF0aGVyCi0gKiAgIAotICogVGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAqICAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICogICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkCi0gKiAgICAgICAgIGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0gKiAKLSAqICAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAqICAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gKiAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAqICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OwotICogCi0gKiAgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICogICAKLSAqIAotICogICAgICAgQCgjKWpzcF8yXzEueHNkcwkxLjUgMDgvMTEvMDUKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4xIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMSBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gKiAgICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAqICAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0gKiAKLSAqICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNS54c2QKLSAqICAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICogCi0gKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAid2ViIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsIDxlbT5FcnJvciBQYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFUlJPUl9QQUdFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FcnJvciBDb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRV9fRVJST1JfQ09ERSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFUlJPUl9QQUdFX19MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFUlJPUl9QQUdFX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwgPGVtPkZpbHRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklMVEVSID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9fRklMVEVSX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9fRklMVEVSX0NMQVNTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JTklUX1BBUkFNUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0lEID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GaWx0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsIDxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RmlsdGVyTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fRklMVEVSX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX0lEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGb3JtTG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUcgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gUGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm0gRXJyb3IgUGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsIDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsIDxlbT5Mb2dpbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUcgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhbG0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvZ2luIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTWltZU1hcHBpbmdJbXBsIDxlbT5NaW1lIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRNaW1lTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX01BUFBJTkcgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19fRVhURU5TSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgRGF0YSBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fSUQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCA8ZW0+U2VydmxldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWTEVUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fU0VSVkxFVF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fU0VSVkxFVF9DTEFTUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnNwIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19KU1BfRklMRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0lOSVRfUEFSQU1TID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIE9uIFN0YXJ0dXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19MT0FEX09OX1NUQVJUVVAgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX1JVTl9BUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fSUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2bGV0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfRkVBVFVSRV9DT1VOVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCA8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCA8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlc3Npb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUcgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsIDxlbT5BcHA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFQl9BUFAgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fREVTQ1JJUFRJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19ESVNQTEFZX05BTUVTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fSUNPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19ESVNUUklCVVRBQkxFUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19GSUxURVJTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19MSVNURU5FUlMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19TRVJWTEVUUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWltZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZSBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnNwIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0pTUF9DT05GSUdTID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTE9HSU5fQ09ORklHUyA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19TRUNVUklUWV9ST0xFUyA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19FTlZfRU5UUklFUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19FSkJfUkVGUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19FSkJfTE9DQUxfUkVGUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVklDRV9SRUZTID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19QUkVfREVTVFJPWVMgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0lEID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19NRVRBREFUQV9DT01QTEVURSA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19WRVJTSU9OID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfRkVBVFVSRV9DT1VOVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsIDxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWxjb21lRmlsZUxpc3RJbXBsIDxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWxjb21lRmlsZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1QgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQQVRDSEVSX1RZUEUgPSAxODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlIDxlbT5OdWxsIENoYXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE51bGxDaGFyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVUxMX0NIQVJfVFlQRSA9IDE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUgPGVtPkFwcCBWZXJzaW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcFZlcnNpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFQl9BUFBfVkVSU0lPTl9UWVBFID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkF1dGggTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEF1dGhNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFVVEhfTUVUSE9EX1RZUEUgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGlzcGF0Y2hlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldERpc3BhdGNoZXJUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU1BBVENIRVJfVFlQRV9PQkpFQ1QgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RW5jb2RpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVOQ09ESU5HX1RZUEUgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXJyb3IgQ29kZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RXJyb3JDb2RlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFUlJPUl9DT0RFX1RZUEUgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RmlsdGVyIE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RmlsdGVyTmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklMVEVSX05BTUVfVFlQRSA9IDI2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IdHRwIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRIdHRwTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX01FVEhPRF9UWVBFID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxvYWQgT24gU3RhcnR1cCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2FkT25TdGFydHVwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0FEX09OX1NUQVJUVVBfVFlQRSA9IDI4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Mb2NhbGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTEVfVFlQRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NaW1lIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TWltZVR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1JTUVfVFlQRV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5vbiBFbXB0eSBTdHJpbmcgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5PTl9FTVBUWV9TVFJJTkdfVFlQRSA9IDMxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OdWxsIENoYXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TnVsbENoYXJUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5VTExfQ0hBUl9UWVBFX09CSkVDVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXJ2bGV0IE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZMRVRfTkFNRV9UWVBFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5XYXIgUGF0aCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXYXJQYXRoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQVJfUEFUSF9UWVBFID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFwcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUID0gMzY7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50IDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldFJvbGVOYW1lcyA8ZW0+Um9sZSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Um9sZSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldFJvbGVOYW1lcygpCi0JICogQHNlZSAjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X1JvbGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldElkKCkKLQkgKiBAc2VlICNnZXRBdXRoQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSA8ZW0+RXJyb3IgUGFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEVycm9yQ29kZSA8ZW0+RXJyb3IgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVycm9yIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0RXJyb3JDb2RlKCkKLQkgKiBAc2VlICNnZXRFcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yUGFnZV9FcnJvckNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0TG9jYXRpb24oKQotCSAqIEBzZWUgI2dldEVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciA8ZW0+RmlsdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZpbHRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsdGVyX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbHRlciBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlck5hbWUoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlckNsYXNzIDxlbT5GaWx0ZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWx0ZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RmlsdGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJbml0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcgPGVtPkZpbHRlciBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsdGVyTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlsdGVyIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldEZpbHRlck5hbWUoKQotCSAqIEBzZWUgI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVybCBQYXR0ZXJuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldFNlcnZsZXROYW1lcyA8ZW0+U2VydmxldCBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U2VydmxldCBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0U2VydmxldE5hbWVzKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0RGlzcGF0Y2hlcnMgPGVtPkRpc3BhdGNoZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EaXNwYXRjaGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0RGlzcGF0Y2hlcnMoKQotCSAqIEBzZWUgI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZvcm1Mb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luUGFnZSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpblBhZ2UoKQotCSAqIEBzZWUgI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1FcnJvclBhZ2UgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRGb3JtRXJyb3JQYWdlKCkKLQkgKiBAc2VlICNnZXRGb3JtTG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvY2FsZUVuY29kaW5nTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlKCkKLQkgKiBAc2VlICNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuY29kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nKCkKLQkgKiBAc2VlICNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldExvY2FsZUVuY29kaW5nTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcgPGVtPkxvZ2luIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRoIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QoKQotCSAqIEBzZWUgI2dldExvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldFJlYWxtTmFtZSA8ZW0+UmVhbG0gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWxtIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRSZWFsbU5hbWUoKQotCSAqIEBzZWUgI2dldExvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luQ29uZmlnIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAc2VlICNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldExvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcgPGVtPk1pbWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWltZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0RXh0ZW5zaW9uIDxlbT5FeHRlbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRFeHRlbnNpb24oKQotCSAqIEBzZWUgI2dldE1pbWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldE1pbWVUeXBlKCkKLQkgKiBAc2VlICNnZXRNaW1lTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWltZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zIDxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRBdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldEF1dGhDb25zdHJhaW50KCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0VXNlckRhdGFDb25zdHJhaW50IDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgPGVtPlNlcnZsZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZsZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0TmFtZSA8ZW0+U2VydmxldCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmxldCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlcnZsZXRDbGFzcyA8ZW0+U2VydmxldCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlcnZsZXRDbGFzcygpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9TZXJ2bGV0Q2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRKc3BGaWxlIDxlbT5Kc3AgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpzcCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRKc3BGaWxlKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0pzcEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRSdW5BcygpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9SdW5BcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmxldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRVcmxQYXR0ZXJucygpCi0JICogQHNlZSAjZ2V0U2VydmxldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZsZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyA8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlc3Npb24gVGltZW91dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBzZWUgI2dldFNlc3Npb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlc3Npb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCA8ZW0+QXBwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3RyaWJ1dGFibGVzIDxlbT5EaXN0cmlidXRhYmxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGlzdHJpYnV0YWJsZXMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldENvbnRleHRQYXJhbXMgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRDb250ZXh0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEZpbHRlcnMgPGVtPkZpbHRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZpbHRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RmlsdGVycygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRGaWx0ZXJNYXBwaW5ncyA8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RmlsdGVyTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExpc3RlbmVycyA8ZW0+TGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9MaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmxldHMgPGVtPlNlcnZsZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2bGV0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXJ2bGV0cygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZsZXRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlc3Npb25Db25maWdzIDxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlc3Npb24gQ29uZmlnczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXNzaW9uQ29uZmlncygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TWltZU1hcHBpbmdzIDxlbT5NaW1lIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NaW1lIE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1pbWVNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFdlbGNvbWVGaWxlTGlzdHMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RXJyb3JQYWdlcyA8ZW0+RXJyb3IgUGFnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVycm9yIFBhZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVycm9yUGFnZXMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SnNwQ29uZmlncyA8ZW0+SnNwIENvbmZpZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpzcCBDb25maWdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEpzcENvbmZpZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0pzcENvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VjdXJpdHlDb25zdHJhaW50cyA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlY3VyaXR5Q29uc3RyYWludHMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TG9naW5Db25maWdzIDxlbT5Mb2dpbiBDb25maWdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Mb2dpbiBDb25maWdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExvZ2luQ29uZmlncygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9naW5Db25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZWN1cml0eVJvbGVzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9FbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9FamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVqYkxvY2FsUmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9QcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldlYiBBcHA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRXZWJBcHAoKQotCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiA8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFdlYlJlc291cmNlTmFtZSA8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRXZWJSZXNvdXJjZU5hbWUoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVybCBQYXR0ZXJuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRVcmxQYXR0ZXJucygpCi0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZHMgPGVtPkh0dHAgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SHR0cCBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QgPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWxjb21lRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QjZ2V0V2VsY29tZUZpbGVzIDxlbT5XZWxjb21lIEZpbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XZWxjb21lIEZpbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0I2dldFdlbGNvbWVGaWxlcygpCi0JICogQHNlZSAjZ2V0V2VsY29tZUZpbGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWxjb21lRmlsZUxpc3RfV2VsY29tZUZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V2VsY29tZUZpbGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWxjb21lRmlsZUxpc3RfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERpc3BhdGNoZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZSA8ZW0+TnVsbCBDaGFyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5OdWxsIENoYXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXROdWxsQ2hhclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlIDxlbT5BcHAgVmVyc2lvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QXBwIFZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdlYkFwcFZlcnNpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+QXV0aCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXV0aCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEF1dGhNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRpc3BhdGNoZXIgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGlzcGF0Y2hlclR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FbmNvZGluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FbmNvZGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RXJyb3IgQ29kZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVycm9yQ29kZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5GaWx0ZXIgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GaWx0ZXIgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RmlsdGVyTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IdHRwIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IdHRwIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHR0cE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuT2JqZWN0IDxlbT5Mb2FkIE9uIFN0YXJ0dXAgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TG9hZCBPbiBTdGFydHVwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMb2FkT25TdGFydHVwVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkxvY2FsZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Mb2NhbGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExvY2FsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5NaW1lIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWltZSBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNaW1lVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Ob24gRW1wdHkgU3RyaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5vbiBFbXB0eSBTdHJpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5vbkVtcHR5U3RyaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZSA8ZW0+TnVsbCBDaGFyIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OdWxsIENoYXIgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE51bGxDaGFyVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlNlcnZsZXQgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXJ2bGV0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcnZsZXROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+V2FyIFBhdGggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V2FyIFBhdGggVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdhclBhdGhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUgPGVtPkFwcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BcHAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXZWJBcHBWZXJzaW9uVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViRmFjdG9yeSBnZXRXZWJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEF1dGhDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFVVEhfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9Sb2xlTmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSF9DT05TVFJBSU5UX19JRCA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsIDxlbT5FcnJvciBQYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFcnJvclBhZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVJST1JfUEFHRSA9IGVJTlNUQU5DRS5nZXRFcnJvclBhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIENvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFUlJPUl9QQUdFX19FUlJPUl9DT0RFID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9FcnJvckNvZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVJST1JfUEFHRV9fTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVSUk9SX1BBR0VfX0lEID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsIDxlbT5GaWx0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEZpbHRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGSUxURVIgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMVEVSX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX19GSUxURVJfTkFNRSA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfRmlsdGVyTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX19GSUxURVJfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMVEVSX19JTklUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfSW5pdFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfX0lEID0gZUlOU1RBTkNFLmdldEZpbHRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCA8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZJTFRFUl9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9NQVBQSU5HX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZPUk1fTE9HSU5fQ09ORklHID0gZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBQYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBFcnJvciBQYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGT1JNX0xPR0lOX0NPTkZJR19fSUQgPSBlSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwgPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFID0gZUlOU1RBTkNFLmdldExvY2FsZUVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HID0gZUlOU1RBTkNFLmdldExvY2FsZUVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUID0gZUlOU1RBTkNFLmdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19JRCA9IGVJTlNUQU5DRS5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCA8ZW0+TG9naW4gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2dpbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldExvZ2luQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPR0lOX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWxtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0dJTl9DT05GSUdfX1JFQUxNX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gb3JtIExvZ2luIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPR0lOX0NPTkZJR19fSUQgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTWltZU1hcHBpbmdJbXBsIDxlbT5NaW1lIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TWltZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUlNRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTiA9IGVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTUVfTUFQUElOR19fTUlNRV9UWVBFID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTUVfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRoIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIERhdGEgQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfQ09OU1RSQUlOVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsIDxlbT5TZXJ2bGV0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWTEVUID0gZUlOU1RBTkNFLmdldFNlcnZsZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fU0VSVkxFVF9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWTEVUX19TRVJWTEVUX0NMQVNTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VydmxldENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kc3AgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfX0pTUF9GSUxFID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfSnNwRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfSW5pdFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBPbiBTdGFydHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVuIEFzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fUlVOX0FTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfUnVuQXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWTEVUX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCA8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXRNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZMRVRfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCA8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFU1NJT05fQ09ORklHID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gVGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0NPTkZJR19fSUQgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsIDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFVTRVJfREFUQV9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFVTRVJfREFUQV9DT05TVFJBSU5UX19JRCA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCA8ZW0+QXBwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJBcHAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfQVBQX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0lDT05TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzdHJpYnV0YWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0RJU1RSSUJVVEFCTEVTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19GSUxURVJTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9GaWx0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9MaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRVJWTEVUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRVNTSU9OX0NPTkZJR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19NSU1FX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZSBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FcnJvciBQYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRVJST1JfUEFHRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19KU1BfQ09ORklHUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfSnNwQ29uZmlncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2dpbiBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19MT0dJTl9DT05GSUdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2dpbkNvbmZpZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRUNVUklUWV9ST0xFUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0VOVl9FTlRSSUVTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9FbnZFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRUpCX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0VqYlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19FSkJfTE9DQUxfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1JFU09VUkNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1BlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9Qb3N0Q29uc3RydWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19QUkVfREVTVFJPWVMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1ByZURlc3Ryb3lzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9fSUQgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFAgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRCA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbCA8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlbGNvbWVGaWxlTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUxDT01FX0ZJTEVfTElTVCA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VMQ09NRV9GSUxFX0xJU1RfX0lEID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlTGlzdF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldERpc3BhdGNoZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gRElTUEFUQ0hFUl9UWVBFID0gZUlOU1RBTkNFLmdldERpc3BhdGNoZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUgPGVtPk51bGwgQ2hhciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE51bGxDaGFyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE5VTExfQ0hBUl9UWVBFID0gZUlOU1RBTkNFLmdldE51bGxDaGFyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlIDxlbT5BcHAgVmVyc2lvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwVmVyc2lvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBXRUJfQVBQX1ZFUlNJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRXZWJBcHBWZXJzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+QXV0aCBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEF1dGhNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEFVVEhfTUVUSE9EX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXV0aE1ldGhvZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRpc3BhdGNoZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RGlzcGF0Y2hlclR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRElTUEFUQ0hFUl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXREaXNwYXRjaGVyVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEVuY29kaW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBFTkNPRElOR19UWVBFID0gZUlOU1RBTkNFLmdldEVuY29kaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RXJyb3IgQ29kZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEVycm9yQ29kZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRVJST1JfQ09ERV9UWVBFID0gZUlOU1RBTkNFLmdldEVycm9yQ29kZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZpbHRlciBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXJOYW1lVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBGSUxURVJfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldEZpbHRlck5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5IdHRwIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0SHR0cE1ldGhvZFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSFRUUF9NRVRIT0RfVFlQRSA9IGVJTlNUQU5DRS5nZXRIdHRwTWV0aG9kVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2FkT25TdGFydHVwVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBMT0FEX09OX1NUQVJUVVBfVFlQRSA9IGVJTlNUQU5DRS5nZXRMb2FkT25TdGFydHVwVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TG9jYWxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2NhbGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIExPQ0FMRV9UWVBFID0gZUlOU1RBTkNFLmdldExvY2FsZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1pbWUgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TWltZVR5cGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1JTUVfVFlQRV9UWVBFID0gZUlOU1RBTkNFLmdldE1pbWVUeXBlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Tm9uIEVtcHR5IFN0cmluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE5PTl9FTVBUWV9TVFJJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXROb25FbXB0eVN0cmluZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk51bGwgQ2hhciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TnVsbENoYXJUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE5VTExfQ0hBUl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXROdWxsQ2hhclR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlNlcnZsZXQgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldE5hbWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZMRVRfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZsZXROYW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5XYXIgUGF0aCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2FyUGF0aFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgV0FSX1BBVEhfVFlQRSA9IGVJTlNUQU5DRS5nZXRXYXJQYXRoVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+QXBwIFZlcnNpb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KCk7Ci0KLQl9Ci0KLX0gLy9XZWJQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OGM4MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFdlYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXZWJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgV2ViU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyKEZpbHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKExvY2FsZUVuY29kaW5nTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViQXBwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50IDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSA8ZW0+RXJyb3IgUGFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgPGVtPkZpbHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nIDxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nIDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcgPGVtPkxvZ2luIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcgPGVtPk1pbWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50IDxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgPGVtPlNlcnZsZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyA8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnIDxlbT5TZXNzaW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIDxlbT5BcHA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiA8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QgPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2ViQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDAxYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MT3B0aW9uc0ltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbC5XZWJSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFdlYlJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJWE1MT3B0aW9ucyB4bWxPcHRpb25zID0gbmV3IFhNTE9wdGlvbnNJbXBsKCk7Ci0KLQkJeG1sT3B0aW9ucy5zZXRQcm9jZXNzU2NoZW1hTG9jYXRpb25zKHRydWUpOwotCQkgICAgCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9PUFRJT05TLCB4bWxPcHRpb25zKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vV2ViUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGQxYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSkVFWE1MTG9hZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSVJvb3RPYmplY3RSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuV2ViUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSVdlYlJlc291cmNlewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCSByZXR1cm4gbmV3IEpFRVhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgV2ViWE1MSGVscGVySW1wbCh0aGlzKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbC5JV2ViUmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByb290ID0gZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCWlmKHJvb3QgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpKChXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcilyb290KS5nZXRXZWJBcHAoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbC5JV2ViUmVzb3VyY2UjZ2V0V2ViQXBwKCkKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJcmV0dXJuIChXZWJBcHApZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotfSAvL1dlYlJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjg4YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFdlYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV2ViUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlQ6IHsKLQkJCQlBdXRoQ29uc3RyYWludCBhdXRoQ29uc3RyYWludCA9IChBdXRoQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXV0aENvbnN0cmFpbnQoYXV0aENvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFOiB7Ci0JCQkJRXJyb3JQYWdlIGVycm9yUGFnZSA9IChFcnJvclBhZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVycm9yUGFnZShlcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVI6IHsKLQkJCQlGaWx0ZXIgZmlsdGVyID0gKEZpbHRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmlsdGVyKGZpbHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HOiB7Ci0JCQkJRmlsdGVyTWFwcGluZyBmaWx0ZXJNYXBwaW5nID0gKEZpbHRlck1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbHRlck1hcHBpbmcoZmlsdGVyTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHOiB7Ci0JCQkJRm9ybUxvZ2luQ29uZmlnIGZvcm1Mb2dpbkNvbmZpZyA9IChGb3JtTG9naW5Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZvcm1Mb2dpbkNvbmZpZyhmb3JtTG9naW5Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElORzogewotCQkJCUxvY2FsZUVuY29kaW5nTWFwcGluZyBsb2NhbGVFbmNvZGluZ01hcHBpbmcgPSAoTG9jYWxlRW5jb2RpbmdNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmcobG9jYWxlRW5jb2RpbmdNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVDogewotCQkJCUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCA9IChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUc6IHsKLQkJCQlMb2dpbkNvbmZpZyBsb2dpbkNvbmZpZyA9IChMb2dpbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9naW5Db25maWcobG9naW5Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkc6IHsKLQkJCQlNaW1lTWFwcGluZyBtaW1lTWFwcGluZyA9IChNaW1lTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWltZU1hcHBpbmcobWltZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiB7Ci0JCQkJU2VjdXJpdHlDb25zdHJhaW50IHNlY3VyaXR5Q29uc3RyYWludCA9IChTZWN1cml0eUNvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Q29uc3RyYWludChzZWN1cml0eUNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUOiB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXQoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElORzogewotCQkJCVNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0TWFwcGluZyhzZXJ2bGV0TWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHOiB7Ci0JCQkJU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnID0gKFNlc3Npb25Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlc3Npb25Db25maWcoc2Vzc2lvbkNvbmZpZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiB7Ci0JCQkJVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCA9IChVc2VyRGF0YUNvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVzZXJEYXRhQ29uc3RyYWludCh1c2VyRGF0YUNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQOiB7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYkFwcCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogewotCQkJCVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yID0gKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcih3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOiB7Ci0JCQkJV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiA9IChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbih3ZWJSZXNvdXJjZUNvbGxlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDogewotCQkJCVdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QgPSAoV2VsY29tZUZpbGVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWxjb21lRmlsZUxpc3Qod2VsY29tZUZpbGVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIFBhZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXIoRmlsdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2ViU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2OWVjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+VmFsaWRhdG9yPC9iPiBmb3IgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlZhbGlkYXRvciBleHRlbmRzIEVPYmplY3RWYWxpZGF0b3IgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2ViVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IFdlYlZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQSBjb25zdGFudCBmb3IgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRTb3VyY2UoKSBzb3VyY2V9IG9mIGRpYWdub3N0aWMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKSBjb2Rlc30gZnJvbSB0aGlzIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHdpdGggYSBmaXhlZCBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgdmFsdWUgZm9yIGFkZGl0aW9uYWwgaGFuZCB3cml0dGVuIGNvbnN0YW50cyBpbiBhIGRlcml2ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElBR05PU1RJQ19DT0RFX0NPVU5UID0gR0VORVJBVEVEX0RJQUdOT1NUSUNfQ09ERV9DT1VOVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgYmFzZSBwYWNrYWdlIHZhbGlkYXRvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MVHlwZVZhbGlkYXRvciB4bWxUeXBlVmFsaWRhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXhtbFR5cGVWYWxpZGF0b3IgPSBYTUxUeXBlVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugb2YgdGhpcyB2YWxpZGF0b3Igc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkgIHJldHVybiBXZWJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT52YWxpZGF0ZVhYWDwvY29kZT4gZm9yIHRoZSBjb3JyZXNvbmRpbmcgY2xhc3NpZmllciBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoaW50IGNsYXNzaWZpZXJJRCwgT2JqZWN0IHZhbHVlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0U6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXJyb3JQYWdlKChFcnJvclBhZ2UpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRmlsdGVyKChGaWx0ZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElORzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVGaWx0ZXJNYXBwaW5nKChGaWx0ZXJNYXBwaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRm9ybUxvZ2luQ29uZmlnKChGb3JtTG9naW5Db25maWcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElORzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoKExvY2FsZUVuY29kaW5nTWFwcGluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2dpbkNvbmZpZygoTG9naW5Db25maWcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWltZU1hcHBpbmcoKE1pbWVNYXBwaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZWN1cml0eUNvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmxldCgoU2VydmxldCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElORzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2bGV0TWFwcGluZygoU2VydmxldE1hcHBpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXNzaW9uQ29uZmlnKChTZXNzaW9uQ29uZmlnKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVXNlckRhdGFDb25zdHJhaW50KChVc2VyRGF0YUNvbnN0cmFpbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlYkFwcCgoV2ViQXBwKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT046Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWxjb21lRmlsZUxpc3QoKFdlbGNvbWVGaWxlTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkRJU1BBVENIRVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEaXNwYXRjaGVyVHlwZSgoRGlzcGF0Y2hlclR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5OVUxMX0NIQVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOdWxsQ2hhclR5cGUoKE51bGxDaGFyVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGUoKFdlYkFwcFZlcnNpb25UeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVBdXRoTWV0aG9kVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEaXNwYXRjaGVyVHlwZU9iamVjdCgoRGlzcGF0Y2hlclR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FTkNPRElOR19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVuY29kaW5nVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfQ09ERV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVycm9yQ29kZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTkFNRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUZpbHRlck5hbWVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh0dHBNZXRob2RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0FEX09OX1NUQVJUVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2FkT25TdGFydHVwVHlwZSh2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUxvY2FsZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1pbWVUeXBlVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTk9OX0VNUFRZX1NUUklOR19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZU51bGxDaGFyVHlwZU9iamVjdCgoTnVsbENoYXJUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmxldE5hbWVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XQVJfUEFUSF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdhclBhdGhUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKFdlYkFwcFZlcnNpb25UeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQlkZWZhdWx0OiAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpYXV0aENvbnN0cmFpbnQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWVycm9yUGFnZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRmlsdGVyKEZpbHRlciBmaWx0ZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZmlsdGVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClmaWx0ZXJNYXBwaW5nLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIGZvcm1Mb2dpbkNvbmZpZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClmb3JtTG9naW5Db25maWcsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgbG9jYWxlRW5jb2RpbmdNYXBwaW5nLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxvY2FsZUVuY29kaW5nTWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9naW5Db25maWcoTG9naW5Db25maWcgbG9naW5Db25maWcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpbG9naW5Db25maWcsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG1pbWVNYXBwaW5nLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KW1pbWVNYXBwaW5nLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IHNlY3VyaXR5Q29uc3RyYWludCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZWN1cml0eUNvbnN0cmFpbnQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZsZXQoU2VydmxldCBzZXJ2bGV0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZsZXQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZsZXRNYXBwaW5nLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXNzaW9uQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl1c2VyRGF0YUNvbnN0cmFpbnQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYkFwcChXZWJBcHAgd2ViQXBwLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlYkFwcCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Igd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gd2ViUmVzb3VyY2VDb2xsZWN0aW9uLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlYlJlc291cmNlQ29sbGVjdGlvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpd2VsY29tZUZpbGVMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEaXNwYXRjaGVyVHlwZShEaXNwYXRjaGVyVHlwZSBkaXNwYXRjaGVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU51bGxDaGFyVHlwZShOdWxsQ2hhclR5cGUgbnVsbENoYXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJBcHBWZXJzaW9uVHlwZShXZWJBcHBWZXJzaW9uVHlwZSB3ZWJBcHBWZXJzaW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhNZXRob2RUeXBlKFN0cmluZyBhdXRoTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURpc3BhdGNoZXJUeXBlT2JqZWN0KERpc3BhdGNoZXJUeXBlIGRpc3BhdGNoZXJUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW5jb2RpbmdUeXBlKFN0cmluZyBlbmNvZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVuY29kaW5nVHlwZV9QYXR0ZXJuKGVuY29kaW5nVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRW5jb2RpbmdUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEVOQ09ESU5HX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlteXFxzXSsiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5FbmNvZGluZyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW5jb2RpbmdUeXBlX1BhdHRlcm4oU3RyaW5nIGVuY29kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRU5DT0RJTkdfVFlQRSwgZW5jb2RpbmdUeXBlLCBFTkNPRElOR19UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVycm9yQ29kZVR5cGUoQmlnSW50ZWdlciBlcnJvckNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0geG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcl9NaW4oZXJyb3JDb2RlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlpZiAocmVzdWx0IHx8IGRpYWdub3N0aWNzICE9IG51bGwpIHJlc3VsdCAmPSB2YWxpZGF0ZUVycm9yQ29kZVR5cGVfUGF0dGVybihlcnJvckNvZGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFcnJvckNvZGVUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEVSUk9SX0NPREVfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFxkezN9IikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+RXJyb3IgQ29kZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXJyb3JDb2RlVHlwZV9QYXR0ZXJuKEJpZ0ludGVnZXIgZXJyb3JDb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRVJST1JfQ09ERV9UWVBFLCBlcnJvckNvZGVUeXBlLCBFUlJPUl9DT0RFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRmlsdGVyTmFtZVR5cGUoU3RyaW5nIGZpbHRlck5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKGZpbHRlck5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZShTdHJpbmcgaHR0cE1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh0dHBNZXRob2RUeXBlX1BhdHRlcm4oaHR0cE1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUh0dHBNZXRob2RUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEhUVFBfTUVUSE9EX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIltcXHB7TH0tW1xccHtDY31cXHB7Wn1dXSsiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5IdHRwIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHR0cE1ldGhvZFR5cGVfUGF0dGVybihTdHJpbmcgaHR0cE1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLkhUVFBfTUVUSE9EX1RZUEUsIGh0dHBNZXRob2RUeXBlLCBIVFRQX01FVEhPRF9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvYWRPblN0YXJ0dXBUeXBlKE9iamVjdCBsb2FkT25TdGFydHVwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTG9hZE9uU3RhcnR1cFR5cGVfTWVtYmVyVHlwZXMobG9hZE9uU3RhcnR1cFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1lbWJlclR5cGVzIGNvbnN0cmFpbnQgb2YgJzxlbT5Mb2FkIE9uIFN0YXJ0dXAgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvYWRPblN0YXJ0dXBUeXBlX01lbWJlclR5cGVzKE9iamVjdCBsb2FkT25TdGFydHVwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpZiAoZGlhZ25vc3RpY3MgIT0gbnVsbCkgewotCQkJQmFzaWNEaWFnbm9zdGljIHRlbXBEaWFnbm9zdGljcyA9IG5ldyBCYXNpY0RpYWdub3N0aWMoKTsKLQkJCWlmIChXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLmlzSW5zdGFuY2UobG9hZE9uU3RhcnR1cFR5cGUpKSB7Ci0JCQkJaWYgKHZhbGlkYXRlTnVsbENoYXJUeXBlKChOdWxsQ2hhclR5cGUpbG9hZE9uU3RhcnR1cFR5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIuaXNJbnN0YW5jZShsb2FkT25TdGFydHVwVHlwZSkpIHsKLQkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUludGVnZXIoKEJpZ0ludGVnZXIpbG9hZE9uU3RhcnR1cFR5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJTGlzdCBjaGlsZHJlbiA9IHRlbXBEaWFnbm9zdGljcy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCWRpYWdub3N0aWNzLmFkZCgoRGlhZ25vc3RpYyljaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTlVMTF9DSEFSX1RZUEUuaXNJbnN0YW5jZShsb2FkT25TdGFydHVwVHlwZSkpIHsKLQkJCQlpZiAodmFsaWRhdGVOdWxsQ2hhclR5cGUoKE51bGxDaGFyVHlwZSlsb2FkT25TdGFydHVwVHlwZSwgbnVsbCwgY29udGV4dCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIuaXNJbnN0YW5jZShsb2FkT25TdGFydHVwVHlwZSkpIHsKLQkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUludGVnZXIoKEJpZ0ludGVnZXIpbG9hZE9uU3RhcnR1cFR5cGUsIG51bGwsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbGVUeXBlKFN0cmluZyBsb2NhbGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVMb2NhbGVUeXBlX1BhdHRlcm4obG9jYWxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlTG9jYWxlVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBMT0NBTEVfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW2Etel17Mn0oX3wtKT8oW1xccHtMfVxcLVxccHtOZH1dezJ9KT8iKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5Mb2NhbGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZVR5cGVfUGF0dGVybihTdHJpbmcgbG9jYWxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxFX1RZUEUsIGxvY2FsZVR5cGUsIExPQ0FMRV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1pbWVUeXBlVHlwZShTdHJpbmcgbWltZVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNaW1lVHlwZVR5cGVfUGF0dGVybihtaW1lVHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZU1pbWVUeXBlVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBNSU1FX1RZUEVfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW15cXHB7Q2N9Xlxcc10rL1teXFxwe0NjfV5cXHNdKyIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPk1pbWUgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWltZVR5cGVUeXBlX1BhdHRlcm4oU3RyaW5nIG1pbWVUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTUlNRV9UWVBFX1RZUEUsIG1pbWVUeXBlVHlwZSwgTUlNRV9UWVBFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTm9uRW1wdHlTdHJpbmdUeXBlKFN0cmluZyBub25FbXB0eVN0cmluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZV9NaW5MZW5ndGgobm9uRW1wdHlTdHJpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNaW5MZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5vbiBFbXB0eSBTdHJpbmcgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZV9NaW5MZW5ndGgoU3RyaW5nIG5vbkVtcHR5U3RyaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbm9uRW1wdHlTdHJpbmdUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoID49IDE7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWluTGVuZ3RoVmlvbGF0aW9uKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBub25FbXB0eVN0cmluZ1R5cGUsIGxlbmd0aCwgMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTnVsbENoYXJUeXBlT2JqZWN0KE51bGxDaGFyVHlwZSBudWxsQ2hhclR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2bGV0TmFtZVR5cGUoU3RyaW5nIHNlcnZsZXROYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTm9uRW1wdHlTdHJpbmdUeXBlX01pbkxlbmd0aChzZXJ2bGV0TmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2FyUGF0aFR5cGUoU3RyaW5nIHdhclBhdGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXYXJQYXRoVHlwZV9QYXR0ZXJuKHdhclBhdGhUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXYXJQYXRoVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBXQVJfUEFUSF9UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIvLioiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5XYXIgUGF0aCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2FyUGF0aFR5cGVfUGF0dGVybihTdHJpbmcgd2FyUGF0aFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLldBUl9QQVRIX1RZUEUsIHdhclBhdGhUeXBlLCBXQVJfUEFUSF9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KFdlYkFwcFZlcnNpb25UeXBlIHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL1dlYlZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTEhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxZDM4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTEhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgV2ViWE1MSGVscGVySW1wbCBleHRlbmRzIEpFRVhNTEhlbHBlckltcGwgewotCi0JcHVibGljIFdlYlhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkKLQkJCXJldHVybiBXZWJQYWNrYWdlLmVOU19VUkk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRVUkkocHJlZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFFOYW1lKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCkgewotCQlTdHJpbmcgbnNQcmVmaXggPSBnZXRQcmVmaXgoZVBhY2thZ2UsIG11c3RIYXZlUHJlZml4KTsKLQkJLy8gTm90IHVzaW5nIEVFNSBwYWNrYWdlIG5hbWVzcGFjZSAtIGRlZmF1bHQgamVlNSBuYW1lc3BhY2UgaXMgdXNlZAotCQlpZiAobnNQcmVmaXguZXF1YWxzKFdlYlBhY2thZ2UuZU5TX1BSRUZJWCkgfHwgbnNQcmVmaXguZXF1YWxzKEpzcFBhY2thZ2UuZU5TX1BSRUZJWCkpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRRTmFtZShlUGFja2FnZSwgbmFtZSwgbXVzdEhhdmVQcmVmaXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgY2xhc3MxLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0ID0gc3VwZXIuZ2V0RmVhdHVyZShjbGFzczEsIG5hbWVzcGFjZVVSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQkJaWYgKGZlYXQgPT0gbnVsbCkKLQkJCS8vVHJ5IHRvIHVzZSBKU1AgbmFtZXNwYWNlCi0JCQlmZWF0ID0gc3VwZXIuZ2V0RmVhdHVyZShjbGFzczEsIEpzcFBhY2thZ2UuZU5TX1VSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQkJcmV0dXJuIGZlYXQ7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGZmMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCVdlYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIFdlYlJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBXZWJSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBXZWJSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL1dlYlhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2FwcGxpY2F0aW9uLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2FwcGxpY2F0aW9uLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhN2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9hcHBsaWNhdGlvbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImFwcGxpY2F0aW9uIgotICAgIG5zVVJJPSJhcHBsaWNhdGlvbi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYXRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlJiN4RDsmI3hBO2FwcGxpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCAmI3hEOyYjeEE7VGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3VyaXR5Um9sZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2Ygc2VjdXJpdHkgcm9sZXMgd2hpY2ggYXJlJiN4RDsmI3hBO2dsb2JhbCB0byB0aGUgYXBwbGljYXRpb24uICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01vZHVsZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTW9kdWxlL2FwcGxpY2F0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lJiN4RDsmI3hBOyAgICAgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlJiN4RDsmI3hBOyAgICAgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkJiN4RDsmI3hBOyAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2R1bGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbiBvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0REQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLiBUaGUgVVJJIG11c3Qgc3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9BcHBsaWNhdGlvbiIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FwcGxpY2F0aW9uL21vZHVsZXMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViTW9kdWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRleHRSb290IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2xpZW50TW9kdWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVqYk1vZHVsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdG9yTW9kdWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY2xpZW50LmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NsaWVudC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1Y2M4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY2xpZW50LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iY2xpZW50IgotICAgIG5zVVJJPSJjbGllbnQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50Ij4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhdGlvbkNsaWVudCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZVJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnZpcm9ubWVudFByb3BzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9FbnZFbnRyeSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJpZXMuIEVhY2ggZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJSZWZlcmVuY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9FamJSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgYSBsaXN0IG9mIGVqYi1yZWYgZWxlbWVudHMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UmI3hEOyYjeEE7YmVhbidzIGhvbWUuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZUVudlJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCYjeEQ7JiN4QTtkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50JiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O3Jlc291cmNlLWVudi1yZWY+JiN4RDsmI3hBOyAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlJmx0Oy9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZSZsdDsvcmVzb3VyY2UtZW52LXJlZi10eXBlPiYjeEQ7JiN4QTsmbHQ7L3Jlc291cmNlLWVudi1yZWY+JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxsYmFja0hhbmRsZXIiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlJiN4RDsmI3hBOyAgICBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyYjeEQ7JiN4QTsgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUmI3hEOyYjeEE7ICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSYjeEQ7JiN4QTsgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUmI3hEOyYjeEE7ICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VEZXN0aW5hdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXBwbGljYXRpb249MCYjeEQ7JiN4QTtDb250YWluZXI9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQXBwbGljYXRpb24iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNvbnRhaW5lciIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb24uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTJmYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJjb21tb24iCi0gICAgbnNVUkk9ImNvbW1vbi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVqYlJlZiIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUmI3hEOyYjeEE7ZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlJiN4RDsmI3hBO2RlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mJiN4RDsmI3hBOyAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UmI3hEOyYjeEE7ICAgICAgYmVhbiYjeEQ7JiN4QTsgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkJiN4RDsmI3hBOyAgICAgIGVudGVycHJpc2UgYmVhbiYjeEQ7JiN4QTsgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoaXMgaXMgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBzZXJ2bGV0IGNvZGUgdXNlcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4mI3hEOyYjeEE7RXhhbXBsZTogJmx0O2VqYi1yZWYtbmFtZT5lamIvUGF5cm9sbCZsdDsvZWpiLXJlZi1uYW1lPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vRWpiUmVmVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uIFRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiYjeEQ7JiN4QTsmbHQ7ZWpiLXJlZi10eXBlPkVudGl0eSZsdDsvZWpiLXJlZi10eXBlPiYjeEQ7JiN4QTsmbHQ7ZWpiLXJlZi10eXBlPlNlc3Npb24mbHQ7L2VqYi1yZWYtdHlwZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG9tZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW7igJlzIGhvbWUgaW50ZXJmYWNlLiYjeEQ7JiN4QTtFeGFtcGxlOiAmbHQ7aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZSZsdDsvaG9tZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtb3RlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFu4oCZcyByZW1vdGUgaW50ZXJmYWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiAmI3hEOyYjeEE7RXhhbXBsZTogJmx0O2VqYi1saW5rPkVtcGxveWVlUmVjb3JkJmx0Oy9lamItbGluaz4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW52RW50cnkiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MmI3hEOyYjeEE7ZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCYjeEQ7JiN4QTtkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4mI3hEOyYjeEE7b3B0aW9uYWwgdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlJiN4RDsmI3hBO3N1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7SXQgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhJiN4RDsmI3hBOyAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lJiN4RDsmI3hBOyAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYmI3hEOyYjeEE7ICAgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEmI3hEOyYjeEE7ICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MmI3hEOyYjeEE7ICAgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZCYjeEQ7JiN4QTsgICAgICAgIGNvbnRleHQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtlbnYtZW50cnktbmFtZT5taW5BbW91bnQmbHQ7L2Vudi1lbnRyeS1uYW1lPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYSYjeEQ7JiN4QTsgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlJiN4RDsmI3hBOyAgICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSYjeEQ7JiN4QTsgICAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwmI3hEOyYjeEE7ICAgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtlbnYtZW50cnktdmFsdWU+MTAwLjAwJmx0Oy9lbnYtZW50cnktdmFsdWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9FbnZFbnRyeVR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW504oCZcyBjb2RlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kIGphdmEubGFuZy5GbG9hdC4gJiN4RDsmI3hBO0V4YW1wbGU6ICZsdDtlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbiZsdDsvZW52LWVudHJ5LXR5cGU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlUmVmIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQmI3hEOyYjeEE7Y29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyJiN4RDsmI3hBO2Nvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlJiN4RDsmI3hBO3Jlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uJiN4RDsmI3hBOyhBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiYjeEQ7JiN4QTt0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlJiN4RDsmI3hBOyhTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDtyZXNvdXJjZS1yZWY+JiN4RDsmI3hBOyAgICAmbHQ7cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQiZsdDsvcmVzLXJlZi1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0O3Jlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtdHlwZT4mI3hEOyYjeEE7ICAgICZsdDtyZXMtYXV0aD5Db250YWluZXImbHQ7L3Jlcy1hdXRoPiYjeEQ7JiN4QTsgICAgJmx0O3Jlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZSZsdDsvcmVzLXNoYXJpbmctc2NvcGU+JiN4RDsmI3hBOyZsdDsvcmVzb3VyY2UtcmVmPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhJiN4RDsmI3hBOyAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiYjeEQ7JiN4QTsgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSYjeEQ7JiN4QTsgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4mI3hEOyYjeEE7ICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEmI3hEOyYjeEE7ICAgICAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkJiN4RDsmI3hBOyAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UmI3hEOyYjeEE7ICAgICAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGgiIGVUeXBlPSIjLy9SZXNBdXRoVHlwZUJhc2UiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLiAgVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzomI3hEOyYjeEE7Jmx0O3Jlcy1hdXRoPkFwcGxpY2F0aW9uJmx0Oy9yZXMtYXV0aD4mI3hEOyYjeEE7Jmx0O3Jlcy1hdXRoPkNvbnRhaW5lciZsdDsvcmVzLWF1dGg+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzU2hhcmluZ1Njb3BlIiBlVHlwZT0iIy8vUmVzU2hhcmluZ1Njb3BlVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkJiN4RDsmI3hBO3Rocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUmI3hEOyYjeEE7c2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZSYjeEQ7JiN4QTt0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZSYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkVudkVudHJ5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyBhZGRlZCBDaGFyYWN0ZXImI3hEOyYjeEE7U3RyaW5nPTAmI3hEOyYjeEE7SW50ZWdlcj0xJiN4RDsmI3hBO0Jvb2xlYW49MiYjeEQ7JiN4QTtEb3VibGU9MyYjeEQ7JiN4QTtCeXRlPTQmI3hEOyYjeEE7U2hvcnQ9NSYjeEQ7JiN4QTtMb25nPTYmI3hEOyYjeEE7RmxvYXQ9NyYjeEQ7JiN4QTtDaGFyYWN0ZXI9OCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3RyaW5nIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJbnRlZ2VyIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQm9vbGVhbiIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRvdWJsZSIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJ5dGUiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTaG9ydCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvbmciIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJGbG9hdCIgdmFsdWU9IjciLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNoYXJhY3RlciIgdmFsdWU9IjgiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlSb2xlUmVmIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEmI3hEOyYjeEE7c2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50J3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuJiN4RDsmI3hBO29wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlJiN4RDsmI3hBO2NvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlJiN4RDsmI3hBO3NlY3VyaXR5IHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuJiN4RDsmI3hBO2FwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkJiN4RDsmI3hBOyAgICAgICAgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUmI3hEOyYjeEE7ICAgICAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZSYjeEQ7JiN4QTsgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQmI3hEOyYjeEE7ICAgICAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluJiN4RDsmI3hBOyAgICAgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSYjeEQ7JiN4QTsgICAgICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUmVzQXV0aFR5cGVCYXNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDT05UQUlORVI9MCYjeEQ7JiN4QTtDb250YWluZXI9MSYjeEQ7JiN4QTtBcHBsaWNhdGlvbj0yJiN4RDsmI3hBO1NFUlZMRVQ9MyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNvbnRhaW5lciIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQXBwbGljYXRpb24iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTRVJWTEVUIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkVqYlJlZlR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNlc3Npb249MCYjeEQ7JiN4QTtFbnRpdHk9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU2Vzc2lvbiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRW50aXR5IiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN1cml0eVJvbGUiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkmI3hEOyYjeEE7cm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlJiN4RDsmI3hBO3NlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAmbHQ7c2VjdXJpdHktcm9sZT4mI3hEOyYjeEE7ICAgICZsdDtkZXNjcmlwdGlvbj4mI3hEOyYjeEE7ICAgICAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQmI3hEOyYjeEE7ICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uJiN4RDsmI3hBOyAgICAmbHQ7L2Rlc2NyaXB0aW9uPiYjeEQ7JiN4QTsgICAgJmx0O3JvbGUtbmFtZT5lbXBsb3llZSZsdDsvcm9sZS1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0Oy9zZWN1cml0eS1yb2xlPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIFNlZSBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluIGEgbm9uLWVtcHR5IHN0cmluZy4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VFbnZSZWYiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lJiN4RDsmI3hBO3Jlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QmI3hEOyYjeEE7YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MmI3hEOyYjeEE7ZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlJiN4RDsmI3hBO3Jlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiYjeEQ7JiN4QTt0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O3Jlc291cmNlLWVudi1yZWY+JiN4RDsmI3hBOyAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlJiN4RDsmI3hBOyAgICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtbmFtZT4mI3hEOyYjeEE7ICAgICZsdDtyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlJiN4RDsmI3hBOyAgICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtdHlwZT4mI3hEOyYjeEE7Jmx0Oy9yZXNvdXJjZS1lbnYtcmVmPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UgZW52IHJlZi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lJiN4RDsmI3hBOyAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4mI3hEOyYjeEE7ICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSYjeEQ7JiN4QTsgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCYjeEQ7JiN4QTsgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUmI3hEOyYjeEE7ICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc1NoYXJpbmdTY29wZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNoYXJlYWJsZT0wJiN4RDsmI3hBO1Vuc2hhcmVhYmxlPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNoYXJlYWJsZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVW5zaGFyZWFibGUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkxvY2FsUmVmIiBlU3VwZXJUeXBlcz0iIy8vRWpiUmVmIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS4zJiN4RDsmI3hBO1RoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yJiN4RDsmI3hBO3RoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCYjeEQ7JiN4QTtob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQmI3hEOyYjeEE7ICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiYjeEQ7JiN4QTsgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYWxIb21lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2FsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiIGVTdXBlclR5cGVzPSIjLy9TZWN1cml0eUlkZW50aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgICAgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkZW50aXR5IiBlVHlwZT0iIy8vSWRlbnRpdHkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3B0aW9uYWwgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJZGVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcnVuIGFzIGlkZW50aXR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikljb25UeXBlIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzJiN4RDsmI3hBO3RoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvciYjeEQ7JiN4QTtKUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhJiN4RDsmI3hBO0dVSSB0b29sLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZSYjeEQ7JiN4QTtpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgJnF1b3Q7ZW4mcXVvdDsgKEVuZ2xpc2gpJiN4RDsmI3hBO2J5IGRlZmF1bHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNtYWxsSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlJiN4RDsmI3hBOyAgICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZSYjeEQ7JiN4QTsgICAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCYjeEQ7JiN4QTsgICAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4mI3hEOyYjeEE7ICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O3NtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnJmx0Oy9zbWFsbC1pY29uPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXJnZUljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSYjeEQ7JiN4QTsgICAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZSYjeEQ7JiN4QTsgICAgICAgICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUmI3hEOyYjeEE7ICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50JiN4RDsmI3hBOyAgICAgICAgRmlsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4mI3hEOyYjeEE7ICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O2xhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnJmx0Oy9sYXJnZS1pY29uPiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNwbGF5TmFtZSIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCYjeEQ7JiN4QTt0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lJiN4RDsmI3hBO2VsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Li4uJiN4RDsmI3hBOyAgICZsdDtkaXNwbGF5LW5hbWUgeG1sOmxhbmc9JnF1b3Q7ZW4mcXVvdDs+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlJmx0Oy9kaXNwbGF5LW5hbWU+JiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAmcXVvdDtlbiZxdW90OyAoRW5nbGlzaCkgYnkgZGVmYXVsdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb25SZWYiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uJiN4RDsmI3hBO29mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiYjeEQ7JiN4QTthc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzJiN4RDsmI3hBO2Vudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUmI3hEOyYjeEE7ICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUmI3hEOyYjeEE7ICAgICAgICAtIGEgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZSYjeEQ7JiN4QTsgICAgICAgICAgZGVzdGluYXRpb24gaXMgdXNlZCBmb3ImI3hEOyYjeEE7ICAgICAgICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGgmI3hEOyYjeEE7ICAgICAgICAtIGEgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZXM6JiN4RDsmI3hBOyYjeEQ7JiN4QTsmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4mI3hEOyYjeEE7ICAgICAgICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcyYjeEQ7JiN4QTsgICAgICAgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4mI3hEOyYjeEE7ICAgICAgICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcyYjeEQ7JiN4QTsgICAgICAgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPiYjeEQ7JiN4QTsmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2UiIGVUeXBlPSIjLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VEZXN0aW5hdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlJiN4RDsmI3hBO2Rlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcyYjeEQ7JiN4QTtlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZSYjeEQ7JiN4QTsgICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbiYjeEQ7JiN4QTsgICAgICAgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUmI3hEOyYjeEE7ICAgICAgICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lJiN4RDsmI3hBOyAgICAgICAgICBEZXBsb3ltZW50IEZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O21lc3NhZ2UtZGVzdGluYXRpb24+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT5Db3Jwb3JhdGVTdG9ja3MmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4mI3hEOyYjeEE7Jmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhJiN4RDsmI3hBOyAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUmI3hEOyYjeEE7ICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zJiN4RDsmI3hBOyAgICAgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcmFtVmFsdWUiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlJiN4RDsmI3hBO3BhcmFtZXRlci92YWx1ZSBsaXN0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdGlvbkdyb3VwIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkJiN4RDsmI3hBO2VsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaWNvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSWNvblR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc3BsYXlOYW1lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNwbGF5TmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKTkRJRW52UmVmc0dyb3VwIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudCYjeEQ7JiN4QTtyZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnZpcm9ubWVudFByb3BlcnRpZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRW52RW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZVJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FamJSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlRW52UmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZUVudlJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGxpc3Qgb2YgZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZXMgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJMb2NhbFJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRUpCTG9jYWxSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN1cml0eUlkZW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCYjeEQ7JiN4QTtjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVzZUNhbGxlcklkZW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vU2VjdXJpdHlJZGVudGl0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvJiN4RDsmI3hBO3Byb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cyYjeEQ7JiN4QTt0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMmI3hEOyYjeEE7dG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MmI3hEOyYjeEE7RGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSYjeEQ7JiN4QTt0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5JiN4RDsmI3hBO3RoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQmI3hEOyYjeEE7Y29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlJiN4RDsmI3hBO2Rlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDtlbiZxdW90OyAoRW5nbGlzaCkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ29uc3VtZXMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlByb2R1Y2VzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ29uc3VtZXNQcm9kdWNlcyIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUU5hbWUiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhbFBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tYmluZWRRTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRlcm5hbFByZWZpeE9yTnNVUkkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGlzdGVuZXIiIGVTdXBlclR5cGVzPSIjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBtb3ZlZCBmcm9tIHdlYmFwcCYjeEQ7JiN4QTsmI3hEOyYjeEE7RGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic21hbGxJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhcmdlSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKMkVFRU9iamVjdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkoyRUVFQXR0cmlidXRlIiBlU3VwZXJUeXBlcz0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQXR0cmlidXRlIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbkFyY2hpdmUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uQXJjaGl2ZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlNTUzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uQXJjaGl2ZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZSIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIG1vZGVsTmFtZT0iQ29tbW9uQXJjaGl2ZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLnByb3ZpZGVyLkNvbW1vbkFyY2hpdmVFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLnByZXNlbnRhdGlvbi5Db21tb25BcmNoaXZlRWRpdG9yUGx1Z2luIgotICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5yb3NlIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIGoyZWUuZ2VubW9kZWwjLy93c2NsaWVudCBqMmVlLmdlbm1vZGVsIy8vY29tbW9uIGoyZWUuZ2VubW9kZWwjLy93ZWJhcHBsaWNhdGlvbiBqMmVlLmdlbm1vZGVsIy8vZWpiIGoyZWUuZ2VubW9kZWwjLy9qc3AgajJlZS5nZW5tb2RlbCMvL2FwcGxpY2F0aW9uIGoyZWUuZ2VubW9kZWwjLy9jbGllbnQgajJlZS5nZW5tb2RlbCMvL2pjYSAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsIy8vamF2YSI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxjb21tb25BcmNoaXZlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ29tbW9uYXJjaGl2ZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL2xhc3RNb2RpZmllZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9zaXplIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL2RpcmVjdG9yeUVudHJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL29yaWdpbmFsVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL2xvYWRpbmdDb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL2NvbnRhaW5lciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0FyY2hpdmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQXJjaGl2ZS90eXBlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VKQkphckZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUpCSmFyRmlsZS9kZXBsb3ltZW50RGVzY3JpcHRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1dBUkZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vV0FSRmlsZS9kZXBsb3ltZW50RGVzY3JpcHRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VBUkZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VBUkZpbGUvbW9kdWxlUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUFSRmlsZS9kZXBsb3ltZW50RGVzY3JpcHRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50RmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudEZpbGUvZGVwbG95bWVudERlc2NyaXB0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Nb2R1bGVGaWxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Db250YWluZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0NvbnRhaW5lci9maWxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1JlYWRPbmx5RGlyZWN0b3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9SQVJGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1JBUkZpbGUvZGVwbG95bWVudERlc2NyaXB0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Nb2R1bGVSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vTW9kdWxlUmVmL21vZHVsZUZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Nb2R1bGVSZWYvZWFyRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vTW9kdWxlUmVmL21vZHVsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VKQk1vZHVsZVJlZiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vV2ViTW9kdWxlUmVmIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9DbGllbnRNb2R1bGVSZWYiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0Nvbm5lY3Rvck1vZHVsZVJlZiIvPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9Ikxvb3NlY29uZmlnIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUiCi0gICAgICAgIGludGVyZmFjZVBhY2thZ2VTdWZmaXg9ImludGVybmFsIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIgotICAgICAgICBlY29yZVBhY2thZ2U9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWciPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFwcGxpY2F0aW9uIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXBwbGljYXRpb24vbG9vc2VBcmNoaXZlcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUvdXJpIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9iaW5hcmllc1BhdGgiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL3Jlc291cmNlc1BhdGgiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9sb29zZUFwcCIvPgotICAgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUvaXNNb2R1bGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VMaWJyYXJ5Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlTGlicmFyeS9sb29zZVdBUiIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZU1vZHVsZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlTW9kdWxlL2FsdEREIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQ29uZmlndXJhdGlvbiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUNvbmZpZ3VyYXRpb24vYXBwbGljYXRpb25zIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlV0FSRmlsZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZVdBUkZpbGUvbG9vc2VMaWJzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjQxNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbmFyY2hpdmVjb3JlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iY29tbW9uYXJjaGl2ZWNvcmUiCi0gICAgbnNVUkk9ImNvbW1vbmFyY2hpdmUueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZpbGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IlVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0TW9kaWZpZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpcmVjdG9yeUVudHJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmlnaW5hbFVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2FkaW5nQ29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0NvbnRhaW5lciIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbnRhaW5lci9maWxlcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcmNoaXZlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkphckZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgZWpiLmVjb3JlIy8vRUpCSmFyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUFSRmlsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZUZpbGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVSZWZzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01vZHVsZVJlZiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTW9kdWxlUmVmL2VhckZpbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhdGlvbkNsaWVudEZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlRmlsZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BcmNoaXZlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0ZpbGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWxlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9GaWxlL2NvbnRhaW5lciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWFkT25seURpcmVjdG9yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgamNhLmVjb3JlIy8vQ29ubmVjdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZVJlZiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZUZpbGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Nb2R1bGVGaWxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVhckZpbGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FQVJGaWxlIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUFSRmlsZS9tb2R1bGVSZWZzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJNb2R1bGVSZWYiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVSZWYiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJNb2R1bGVSZWYiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVSZWYiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGllbnRNb2R1bGVSZWYiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVSZWYiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25uZWN0b3JNb2R1bGVSZWYiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVSZWYiLz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJsb29zZWNvbmZpZyIgbnNVUkk9ImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWciPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VBcHBsaWNhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9vc2VBcmNoaXZlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL2xvb3NlQXBwIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb29zZUFyY2hpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzTW9kdWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJpbmFyaWVzUGF0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlc1BhdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb29zZUFwcCIgZVR5cGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXBwbGljYXRpb24iCi0gICAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXBwbGljYXRpb24vbG9vc2VBcmNoaXZlcyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb29zZVdBUiIgZVR5cGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlV0FSRmlsZSIKLSAgICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VXQVJGaWxlL2xvb3NlTGlicyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VNb2R1bGUiIGVTdXBlclR5cGVzPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdEREIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb29zZUNvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXBwbGljYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlV0FSRmlsZSIgZVN1cGVyVHlwZXM9IiMvL2xvb3NlY29uZmlnL0xvb3NlTW9kdWxlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb29zZUxpYnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUxpYnJhcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlTGlicmFyeS9sb29zZVdBUiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvZWpiLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2VqYi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlY2IxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvZWpiLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImVqYiIKLSAgICBuc1VSST0iZWpiLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGFpbmVyTWFuYWdlZEVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0VudGl0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBUaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogMS54ICwgMi54JiN4RDsmI3hBO0BkZWZhdWx0IDIueCYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWJzdHJhY3RTY2hlbWFOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0ZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW50QXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9DTVBBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImtleUF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ01QQXR0cmlidXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1F1ZXJ5L2VudGl0eSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgbW92ZWQgZnJvbSBDTUUmI3hEOyYjeEE7VGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IHNlZSBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iQ01QQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NNUEF0dHJpYnV0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltS2V5RmllbGQiIGVUeXBlPSIjLy9DTVBBdHRyaWJ1dGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGVybWlzc2lvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcywgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuICBUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQvb3IgaG9tZSBpbnRlcmZhY2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmNoZWNrZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2VtYmx5RGVzY3JpcHRvciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fzc2VtYmx5RGVzY3JpcHRvciIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0Fzc2VtYmx5RGVzY3JpcHRvci9tZXRob2RQZXJtaXNzaW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NlbWJseURlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLiBBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGVybWlzc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kUGVybWlzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGVybWlzc2lvbi9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kVHJhbnNhY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFRyYW5zYWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RUcmFuc2FjdGlvbi9hc3NlbWJseURlc2NyaXB0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiSmFyIiBlVHlwZT0iIy8vRUpCSmFyIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUpCSmFyL2Fzc2VtYmx5RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4Y2x1ZGVMaXN0IiBlVHlwZT0iIy8vRXhjbHVkZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VEZXN0aW5hdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFRyYW5zYWN0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIgZVR5cGU9IiMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZW1ibHlEZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQXNzZW1ibHlEZXNjcmlwdG9yIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21ldGhvZFRyYW5zYWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2Vzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL0VudGVycHJpc2VCZWFuIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSYjeEQ7JiN4QTtkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlJiN4RDsmI3hBOyAgICAgIGljb24gZmlsZSBuYW1lJiN4RDsmI3hBOyAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kJiN4RDsmI3hBOyAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkmI3hEOyYjeEE7ICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZCYjeEQ7JiN4QTsgICAgICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkmI3hEOyYjeEE7ICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50JiN4RDsmI3hBOyAgICAgIGludGVyZmFjZSwgaWYgYW55JiN4RDsmI3hBOyAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcyYjeEQ7JiN4QTsgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlJiN4RDsmI3hBOyAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBlbnZpcm9ubWVudCBlbnRyaWVzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCYjeEQ7JiN4QTsgICAgICBFSkIgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiYjeEQ7JiN4QTsgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkmI3hEOyYjeEE7ICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSYjeEQ7JiN4QTsgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4mI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlJiN4RDsmI3hBOyAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgJnF1b3Q7b3B0aW9uYWwmcXVvdDsgaW4gdGhlIHNlbnNlJiN4RDsmI3hBO3RoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlJiN4RDsmI3hBO2VtcHR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7RWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoJiN4RDsmI3hBO3RoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUmI3hEOyYjeEE7c2Vzc2lvbiBiZWFuLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlJiN4RDsmI3hBO2JlYW4gaXMgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblR5cGUiIGVUeXBlPSIjLy9UcmFuc2FjdGlvblR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2Vzc2lvblR5cGUiIGVUeXBlPSIjLy9TZXNzaW9uVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnQiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlJiN4RDsmI3hBOyAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYiYjeEQ7JiN4QTsgICAgICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgc2VydmljZS1lbmRwb2ludCYjeEQ7JiN4QTsgICAgICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcyYjeEQ7JiN4QTsgICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhJiN4RDsmI3hBOyAgICAgICAgdmFsaWQgSkFYLVJQQyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vRW50ZXJwcmlzZUJlYW4iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbnRpdHkgZWxlbWVudCBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFu4oCZcyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFu4oCZcyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UsIGlmIGFueTsgdGhlIGVudGl0eSBiZWFu4oCZcyBpbXBsZW1lbnRhdGlvbiBjbGFzczsgdGhlIGVudGl0eSBiZWFu4oCZcyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbuKAmXMgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZTsgYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW7igJlzIHJlZW50cmFuY3k7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFu4oCZcyBjbXAtdmVyc2lvbjsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW7igJlzIGFic3RyYWN0IHNjaGVtYSBuYW1lOyBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQ7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFu4oCZcyBlbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbuKAmXMgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFu4oCZcyBsb2NhbCBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW7igJlzIG1ldGhvZHM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFu4oCZcyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbuKAmXMgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucyBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguJiN4RDsmI3hBO1RoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZCBjbXAtdmVyc2lvbiAyLnguIFRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHnigJlzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR54oCZcyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LiYjeEQ7JiN4QTtUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguJiN4RDsmI3hBO1RoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLiYjeEQ7JiN4QTtUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQgcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoZSBlbnRpdHkgYmVhbi4mI3hEOyYjeEE7VGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAmcXVvdDtvcHRpb25hbCZxdW90OyBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiYjeEQ7JiN4QTt0aGUgZW50aXR54oCZcyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR54oCZcyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZW50cmFudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5IGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXkiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkJiN4RDsmI3hBO2VsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkga2V5IG1hcHMgdG8gbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LiYjeEQ7JiN4QTtFeGFtcGxlczombHQ7cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZyZsdDsvcHJpbS1rZXktY2xhc3M+JiN4RDsmI3hBOyYjeDk7Jmx0O3ByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEJmx0Oy9wcmltLWtleS1jbGFzcz4mI3hEOyYjeEE7JiN4OTsmbHQ7cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdCZsdDsvcHJpbS1rZXktY2xhc3M+JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRlcnByaXNlQmVhbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbnRlcnByaXNlSmF2YUJlYW4gaXMgYSBjbGFzcy4gIEl0IGNhbiBoYXZlIGluc3RhbmNlcywgc29tZW9uZSBjb3VsZCB3cml0ZSBhbiAmI3hEOyYjeEE7aW5zdGFuY2UgZG9jdW1lbnQgY29udGFpbmluZyBEZXBhcnRtZW50cyBhbmQgRW1wbG95ZWVzLiAgSXQgYWxzbyBoYXMgJiN4RDsmI3hBO2F0dHJpYnV0ZXMsIG9wZXJhdGlvbnMsIGFuZCBhc3NvY2lhdGlvbnMuICBUaGVzZSBhcmUgYWN0dWFsbHkgZGVyaXZlZC9maWx0ZXJlZCAmI3hEOyYjeEE7ZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gIEZvciBtYXBwaW5nIGFuZCBicm93c2luZyAmI3hEOyYjeEE7cHVycG9zZXMsIHRob3VnaCwgeW91IHdvdWxkIGxpa2UgdGhlIEVKQiB0byBhcHBlYXIgYXMgYSBjbGFzcy4gICYjeEQ7JiN4QTsmI3hEOyYjeEE7SW4gdGhpcyBsaWdodCwgZXZlbiBTZXNzaW9uIEJlYW5zIGNhbiBoYXZlIGFzc29jaWF0aW9ucyBhbmQgcHJvcGVydGllcyAmI3hEOyYjeEE7aW1wbGVtZW50ZWQgYnkgdGhlaXIgYmVhbi4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBtZWFuaW5nZnVsIHRvIGRlc2NyaWJlICYjeEQ7JiN4QTthc3NvY2lhdGlvbnMgZnJvbSBhIFNlc3Npb24gdG8gdGhlIEVudGl0aWVzIHdoaWNoIGl0IHVzZXMgdG8gcGVyZm9ybSBpdHMgd29yay4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJob21lSW50ZXJmYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbW90ZUludGVyZmFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJKYXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FSkJKYXIiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJKYXIvZW50ZXJwcmlzZUJlYW5zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3VyaXR5SWRlbnRpdHkiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlJZGVudGl0eSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQmI3hEOyYjeEE7Y29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9jYWxIb21lSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvY2FsSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJOb3RTdXBwb3J0ZWQ9MSYjeEQ7JiN4QTtTdXBwb3J0cz0yJiN4RDsmI3hBO1JlcXVpcmVkPTMmI3hEOyYjeEE7UmVxdWlyZXNOZXc9NCYjeEQ7JiN4QTtNYW5kYXRvcnk9NSYjeEQ7JiN4QTtOZXZlcj02JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTdXBwb3J0cyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJlcXVpcmVkIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUmVxdWlyZXNOZXciIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNYW5kYXRvcnkiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOZXZlciIgdmFsdWU9IjUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJUcmFuc2FjdGlvblR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJlYW49MSYjeEQ7JiN4QTtDb250YWluZXI9MiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQmVhbiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNlc3Npb25UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGF0ZWZ1bD0xJiN4RDsmI3hBO1N0YXRlbGVzcz0yIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTdGF0ZWZ1bCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJNZXRob2RDYXRlZ29yeSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsaWQgRUpCIG1ldGhvZCBjYXRlZ29yeSBuYW1lcyBhcmU6IEVKQkhPTUVNRVRIT0QsIEVKQkNSRUFURU1FVEhPRCwgRUpCRklOREVSTUVUSE9ELCBFSkJSRU1PVEVNRVRIT0QuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkphciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUmI3hEOyYjeEE7bmFtZTsgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkIGVudGVycHJpc2UgYmVhbnM7IGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55OyBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yOyBhbmQgYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWpiQ2xpZW50SmFyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLiBUaGUgRGVwbG95ZXIgc2hvdWxkIG1ha2UgdGhlIGVqYi1jbGllbnQgSkFSIGZpbGUgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50J3MgY2xhc3MtbG9hZGVyLiAgRXhhbXBsZTombHQ7ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyJmx0Oy9lamItY2xpZW50LWphcj4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUmI3hEOyYjeEE7ICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QmI3hEOyYjeEE7ICAgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scyYjeEQ7JiN4QTsgICAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50JiN4RDsmI3hBOyAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQiYjeEQ7JiN4QTsgICAgc2NoZW1hLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NlbWJseURlc2NyaXB0b3IiIGVUeXBlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0Fzc2VtYmx5RGVzY3JpcHRvci9lamJKYXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50ZXJwcmlzZUJlYW5zIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VudGVycHJpc2VCZWFuIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FbnRlcnByaXNlQmVhbi9lamJKYXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFucy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVsYXRpb25zaGlwTGlzdCIgZVR5cGU9IiMvL1JlbGF0aW9uc2hpcHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlbGF0aW9uc2hpcHMvZWpiSmFyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbGF0aW9uc2hpcHMgY29sbGVjdGlvbiBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgZW50aXR5IGJlYW5zIGFuZCBkZXBlbmRlbnQgb2JqZWN0cyBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYSBsaXN0IG9mIGVqYi1lbnRpdHktcmVmIGVsZW1lbnRzIChyZWZlcmVuY2VzIHRvIGVudGl0eSBiZWFucyB0aGF0IHBhcnRpY2lwYXRlIGluIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgYnV0IHdob3NlIGFic3RyYWN0IHBlcnNpc3RlbmNlIHNjaGVtYXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZWpiLWphciBmaWxlKTsmI3hEOyYjeEE7YW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UgYmVhbidzJiN4RDsmI3hBO2hvbWUgb3IgcmVtb3RlIGludGVyZmFjZSwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQmI3hEOyYjeEE7bXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gZGVjbGFyZWQgaW4gdGhlJiN4RDsmI3hBO2RlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvJiN4RDsmI3hBO2Rpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBkZWZpbmVkIGluJiN4RDsmI3hBO2JvdGggdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2U7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyYjeEQ7JiN4QTt0aGUgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhJiN4RDsmI3hBO3NpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBzeW50YXg6JiN4RDsmI3hBOyYjeEQ7JiN4QTsxLiAmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RUpCTkFNRSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+KiZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQmI3hEOyYjeEE7ICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTsyLiAmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RUpCTkFNRSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+TUVUSE9EJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmbHQ7L21ldGhvZD4+JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlJiN4RDsmI3hBOyAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgmI3hEOyYjeEE7ICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0byYjeEQ7JiN4QTsgICBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOzMuICYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FSkJOQU1FJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5NRVRIT0QmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+UEFSQU0tMSZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPlBBUkFNLTImbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7ICAgICAgICAgICYjeDk7JiN4OTsmI3g5Oy4uLiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPlBBUkFNLW4mbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmbHQ7bWV0aG9kPiYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZiYjeEQ7JiN4QTsgICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlJiN4RDsmI3hBOyAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZiYjeEQ7JiN4QTsgICB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQmI3hEOyYjeEE7ICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlJiN4RDsmI3hBOyAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZSYjeEQ7JiN4QTsgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiBhbmQgY29udGFpbmVyLXRyYW5zYWN0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YmI3hEOyYjeEE7JiN4OTsmI3g5O3RoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+KiZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7U3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUmI3hEOyYjeEE7JiN4OTsmI3g5O21ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgJiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTtTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUmI3hEOyYjeEE7JiN4OTsgJiN4OTtFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPmNyZWF0ZSZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7VGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgmI3hEOyYjeEE7JiN4OTttb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O2Zvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7bXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpJiN4RDsmI3hBOyAgICAgICAgd291bGQgYmUgc3BlY2lmaWVkIGFzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPmZvb2JhciZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+Y2hhciZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+aW50Jmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5pbnRbXSZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3MmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXSZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7VGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzJiN4RDsmI3hBOyAgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSYjeEQ7JiN4QTsgICBpbnRlcmZhY2UgYW5kIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgaXMmI3hEOyYjeEE7ICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7Rm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudCYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLWludGY+UmVtb3RlJmx0Oy9tZXRob2QtaW50Zj4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPmNyZWF0ZSZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7Y2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QmI3hEOyYjeEE7ICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpJiN4RDsmI3hBOyAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcyYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLWludGY+SG9tZSZsdDsvbWV0aG9kLWludGY+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5jcmVhdGUmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBtZXRob2QsJiN4RDsmI3hBO29yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMgdXNlZCB3aGVuIHRoZSBlbGVtZW50JiN4RDsmI3hBO2Rlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgaG9tZSYjeEQ7JiN4QTtpbnRlcmZhY2VzLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFybXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGEgc3BhY2UgZGVsaW1pdHRlZCBTdHJpbmcuICBBIG51bGwgc3RyaW5nIGluZGljYXRlcyBhIGdlbmVyaWMgbWV0aG9kIGVsZW1lbnQgdGhhdCBjYW4gYXBwbHkgdG8gbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUuICBBbiBlbXB0eSBzdHJpbmcgaW5kaWNhdGVzIGEgbWV0aG9kIHdpdGggemVybyBwYXJhbWV0ZXJzLiAgSW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucyAocG9zdCBWNSksIHRoaXMgZmllbGQgd2lsbCBiZSBkZXByZWNhdGVkIGFuZCBtaWdyYXRlZCB0byB1c2UgdGhlIG11bHRpLXZhbHVlZCBwYXJhbXMgZmllbGQgYW5kIHRoZSBpc1plcm9QYXJhbXMgZmxhZy4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50S2luZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRlcnByaXNlQmVhbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0VudGVycHJpc2VCZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iTWV0aG9kRWxlbWVudEtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgYWRkZWQgU2VydmljZUVuZHBvaW50JiN4RDsmI3hBO1Vuc3BlY2lmaWVkPTAmI3hEOyYjeEE7UmVtb3RlPTEmI3hEOyYjeEE7SG9tZT0yJiN4RDsmI3hBO0xvY2FsPTMmI3hEOyYjeEE7TG9jYWxIb21lPTQmI3hEOyYjeEE7U2VydmljZUVuZHBvaW50PTUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlVuc3BlY2lmaWVkIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSZW1vdGUiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJIb21lIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTG9jYWwiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMb2NhbEhvbWUiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTZXJ2aWNlRW5kcG9pbnQiIHZhbHVlPSI1Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNNUEF0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFQXR0cmlidXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlIGZpZWxkIGVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNtciBmaWVsZC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWxhdGlvbnNoaXBzIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWxhdGlvbnNoaXBzIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJKYXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FSkJKYXIiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJKYXIvcmVsYXRpb25zaGlwTGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJSZWxhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRUpCUmVsYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQlJlbGF0aW9uL3JlbGF0aW9uc2hpcExpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUXVlcnkiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHF1ZXJ5IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5OyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdCBtZXRob2QgaXQgaXMgdXNlZCBieTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXR1cm4gdHlwZSBtYXBwaW5nLCBpZiBhbnksIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kOyBhbmQgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4gUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbCBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5JiN4RDsmI3hBO2lzIG5vdCBleHByZXNzaWJsZSBpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQgc2hvdWxkIGJlIGVtcHR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcXVlcnkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlamJRTCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIFRoaXMgZWxlbWVudCBpcyBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBxdWVyeSBlbGVtZW50IHdob3NlIGNvbnRlbnRzIHNwZWNpZnkgdGhlIGZpbmRlciBvciB0aGUgc2VsZWN0IG1ldGhvZCB0aGF0IHVzZXMgdGhlIHF1ZXJ5LiBUaGUgY29udGVudCBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLiBUaGUgZWpiLXFsIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBxdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTC4mI3hEOyYjeEE7JiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gb3IgZGVwZW5kZW50IG9iamVjdCBjbGFzcyBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4mI3hEOyYjeEE7QGludmFyaWFudCBUaGUgZWpiLXFsIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBxdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTC4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6JiN4RDsmI3hBOyZsdDtxdWVyeT4mI3hEOyYjeEE7Jmx0O3F1ZXJ5LW1ldGhvZD4mI3hEOyYjeEE7Jmx0O21ldGhvZC1uYW1lPmVqYlNlbGVjdFBlbmRpbmdMaW5laXRlbXMmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmbHQ7bWV0aG9kLXBhcmFtcy8+JiN4RDsmI3hBOyZsdDsvcXVlcnktbWV0aG9kPiYjeEQ7JiN4QTsmbHQ7ZWpiLXFsPlNFTEVDVCBFTlRJVFkobCkmI3hEOyYjeEE7RlJPTSBMaW5lSXRlbXMgbCYjeEQ7JiN4QTtXSEVSRSBsLnNoaXBwZWQgaXMgRkFMU0UmI3hEOyYjeEE7Jmx0Oy9lamItcWw+JiN4RDsmI3hBOyZsdDsvcXVlcnk+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldHVyblR5cGVNYXBwaW5nIiBlVHlwZT0iIy8vUmV0dXJuVHlwZU1hcHBpbmciCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8gc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHRoYXQgaXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvciBFSkJPYmplY3QgdHlwZS4gIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50LCBpZiBzcGVjaWZpZWQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icXVlcnlNZXRob2QiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9RdWVyeU1ldGhvZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUXVlcnlNZXRob2QvcXVlcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcXVlcnktbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgKERCL1NSL0NNLSZxdW90O29uIHRoZSBob21lJnF1b3Q7KSBmb3IgYSBmaW5kZXIgb3ImI3hEOyYjeEE7c2VsZWN0IHF1ZXJ5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdCYjeEQ7JiN4QTttZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3Mgb3IgYSBzZWxlY3QgbWV0aG9kIGluJiN4RDsmI3hBO3RoZSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUmI3hEOyYjeEE7bWV0aG9kLXBhcmFtcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcXVlcnkmI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmbHQ7cXVlcnk+JiN4RDsmI3hBOyAgJmx0O2Rlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnMmbHQ7L2Rlc2NyaXB0aW9uPiYjeEQ7JiN4QTsgICZsdDtxdWVyeS1tZXRob2Q+JiN4RDsmI3hBOyAgICAmbHQ7bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7ICAgICZsdDttZXRob2QtcGFyYW1zPiZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7ICAmbHQ7L3F1ZXJ5LW1ldGhvZD4mI3hEOyYjeEE7ICAmbHQ7ZWpiLXFsPlNFTEVDVCBFTlRJVFkobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZhbXA7Z3Q7IDEwMDAmbHQ7L2VqYi1xbD4mI3hEOyYjeEE7Jmx0Oy9xdWVyeT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5IiBlVHlwZT0iIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvcXVlcmllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJSZWxhdGlvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS4zJiN4RDsmI3hBO1RoZSBlamItcmVsYXRpb24gZWxlbWVudCBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UuIEFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7IGFuZCBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZXMuIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4mI3hEOyYjeEE7QGludmFyaWFudCBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzLnNpemUgPT0gMiYjeEQ7JiN4QTtAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMF0ubmFtZSAhPSBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzFdLm5hbWUmI3hEOyYjeEE7JiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xIE1vdmVkIGZyb20gZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCB1bmRlciBlamJleHQ6OkVKQkphckV4dGVuc2lvbiYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIGRlc2NyaXB0aW9uOlN0cmluZyYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIG5hbWU6U3RyaW5nIChNYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIFJlZkJhc2VPYmplY3QgcHJldmlvdXNseSkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGVqYiByZWxhdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBJZiBzcGVjaWZpZWQsIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLiYjeEQ7JiN4QTtAaW52YXJpYW50IHNlbGYubmFtZSB1bmlxdWUgd2l0aGluIFNldCZsdDtjb2xsZWN0KGVqYkphci5lamJSZWxhdGlvbnMubmFtZSk+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbGF0aW9uc2hpcExpc3QiIGVUeXBlPSIjLy9SZWxhdGlvbnNoaXBzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVsYXRpb25zaGlwcy9lamJSZWxhdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVsYXRpb25zaGlwUm9sZXMiIGxvd2VyQm91bmQ9IjIiCi0gICAgICAgIHVwcGVyQm91bmQ9IjIiIGVUeXBlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3JlbGF0aW9uc2hpcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBjb250YWluaW5nIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xIENvbnRhaW5tZW50IHVzZWQgdG8gYmUgYnkgcmVmZXJlbmNlIG9uIHJlbGF0aW9uLS1ub3cgYnkgdmFsdWUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCUmVsYXRpb25zaGlwUm9sZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS4zJiN4RDsmI3hBO1RoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhIHJlbGF0aW9uc2hpcC4mI3hEOyYjeEE7VGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAmcXVvdDtub3QgYXdhcmUmcXVvdDsgb2YgdGhlIHJlbGF0aW9uc2hpcC4mI3hEOyYjeEE7JiN4RDsmI3hBO0BpbnZhcmlhbnQgbXVsdGlwbGljaXR5ICE9IG51bGwmI3hEOyYjeEE7QGludmFyaWFudCByb2xlU291cmNlICE9IG51bGwmI3hEOyYjeEE7QGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IGluIHdoaWNoIHRoZSByb2xlU291cmNlIGVsZW1lbnQgc3BlY2lmaWVzIGEgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4gJiN4RDsmI3hBO0BpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmbHQ7ZWpiLXJlbGF0aW9uPiYjeEQ7JiN4QTsgICZsdDtlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtJmx0Oy9lamItcmVsYXRpb24tbmFtZT4mI3hEOyYjeEE7ICAmbHQ7ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiYjeEQ7JiN4QTsgICAgJmx0O2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcyZsdDsvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7bXVsdGlwbGljaXR5Pk9uZSZsdDsvbXVsdGlwbGljaXR5PiYjeEQ7JiN4QTsgICAgJmx0O3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4mI3hEOyYjeEE7ICAgICAgJmx0O2VqYi1uYW1lPlByb2R1Y3RFSkImbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0Oy9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+JiN4RDsmI3hBOyAgJmx0Oy9lamItcmVsYXRpb25zaGlwLXJvbGU+JiN4RDsmI3hBOy4uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uc2hpcCByb2xlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSByb2xlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGljaXR5IiBlVHlwZT0iIy8vTXVsdGlwbGljaXR5S2luZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6JiN4RDsmI3hBOyAgICAgT25lJiN4RDsmI3hBOyAgICAgTWFueSYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZURlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZSBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIGluIGFuIEVKQnJlbGF0aW9uIGluIHdoaWNoIHRoZSBvdGhlciBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVsYXRpb25zaGlwIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUpCUmVsYXRpb24iIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbi9yZWxhdGlvbnNoaXBSb2xlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlU291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Sb2xlU291cmNlL3JvbGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uJiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xOiB3YXMgaWJtZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlOjpzb3VyY2VFSkJOYW1lLCBidXQgdGhhdCBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIGFzIHRoaXMgY2FuIG5vdyByZWZlciB0byBkZXBlbmRlbnQgY2xhc3MgbmFtZXMgb3IgZWpiIHJlZnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY21yRmllbGQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9DTVJGaWVsZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQ01SRmllbGQvcm9sZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVjbGFyYXRpb24gb2YgdGhlIENNUkZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlJiN4RDsmI3hBOyYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMTogVXNlZCB0byBiZSBoYW5kbGVkIHZpYSBpYm1lamJleHQ6OkVqYlJvbGU6OmF0dHJpYnV0ZXMgbGlzdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNvdXJjZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uJiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIGNvbnRlbnQgb2YgZWFjaCByb2xlLXNvdXJjZSBlbGVtZW50IHNoYWxsIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGVudGl0eSBiZWFuLCBlbnRpdHkgYmVhbiByZWZlcmVuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRUpCUmVsYXRpb25zaGlwUm9sZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUJlYW4iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDTVJGaWVsZCIgZVN1cGVyVHlwZXM9IiMvL0NNUEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyYjeEQ7JiN4QTtEZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6Om5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjp0eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBDTVJGaWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQgKGEgamF2YSBjbGFzcyBuYW1lKS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlIiBlVHlwZT0iIy8vRUpCUmVsYXRpb25zaGlwUm9sZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvY21yRmllbGQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sbGVjdGlvblR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZURyaXZlbiIgZVN1cGVyVHlwZXM9IiMvL0VudGVycHJpc2VCZWFuIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuJiN4RDsmI3hBO2JlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlJiN4RDsmI3hBOyAgICAgIGljb24gZmlsZSBuYW1lLiYjeEQ7JiN4QTsgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiYjeEQ7JiN4QTsgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yJiN4RDsmI3hBOyAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcmI3hEOyYjeEE7ICAgICAgdHlwZSYjeEQ7JiN4QTsgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZSYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzJiN4RDsmI3hBOyAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzJiN4RDsmI3hBOyAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluayYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzJiN4RDsmI3hBOyAgICAgIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQmI3hEOyYjeEE7ICAgICAgZW50cmllcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCJiN4RDsmI3hBOyAgICAgIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZSYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSYjeEQ7JiN4QTsgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MmI3hEOyYjeEE7ICAgICAgbWV0aG9kcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzJiN4RDsmI3hBOyAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5JiN4RDsmI3hBOyAgICAgIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSYjeEQ7JiN4QTsgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UmI3hEOyYjeEE7ICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblR5cGUiIGVUeXBlPSIjLy9UcmFuc2FjdGlvblR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBCZWFuLCBDb250YWluZXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVzc2FnZVNlbGVjdG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2Utc2VsZWN0b3IgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEpNUyBtZXNzYWdlJiN4RDsmI3hBO3NlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbiYjeEQ7JiN4QTtiZWFuIGlzIHRvIHJlY2VpdmUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlIHZhbHVlOiAmI3hEOyYjeEE7Sk1TVHlwZSA9IGBjYXInIEFORCBjb2xvciA9IGBibHVlJyBBTkQgd2VpZ2h0ID4gMjUwMCYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNrbm93bGVkZ2VNb2RlIiBlVHlwZT0iIy8vQWNrbm93bGVkZ2VNb2RlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkIChpZS4gc2VsZi50cmFuc2FjdGlvblR5cGUgPSBCZWFuKSYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGFja25vd2xlZGdlLW1vZGUgc3BlY2lmaWVzIHdoZXRoZXIgSk1TIEFVVE9fQUNLTk9XTEVER0Ugb3IgRFVQU19PS19BQ0tOT1dMRURHRSBtZXNzYWdlIGFja25vd2xlZGdtZW50IHNlbWFudGljcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG9uTWVzc2FnZSBtZXNzYWdlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiB0aGF0IHVzZXMgYmVhbiBtYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGFja25vd2xlZGdlLW1vZGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBBdXRvLWFja25vd2xlZGdlLCBEdXBzLW9rLWFja25vd2xlZGdlJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsmI3g5OyAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluayYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzdGluYXRpb24iIGVUeXBlPSIjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi9iZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGFjdGl2YXRpb25Db25maWcmI3hEOyYjeEE7QW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGludGVuZGVkIGRlc3RpbmF0aW9uIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZhdGlvbkNvbmZpZyIgZVR5cGU9IiMvL0FjdGl2YXRpb25Db25maWciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb24iIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2luZ1R5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZSYjeEQ7JiN4QTsgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4gSWYmI3hEOyYjeEE7ICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyYjeEQ7JiN4QTsgICAgICAgIGFzc3VtZWQgdG8gYmUgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiBlbGVtZW50IHByb3ZpZGVzIGFkdmljZSB0byB0aGUgRGVwbG95ZXIgYXMgdG8gd2hldGhlciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gaXMgaW50ZW5kZWQgZm9yIGEgUXVldWUgb3IgYSBUb3BpYy4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGludGVuZGVkIGRlc3RpbmF0aW9uIGFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB3aGV0aGVyIGEgZHVyYWJsZSBvciBub24tZHVyYWJsZSBzdWJzY3JpcHRpb24gc2hvdWxkIGJlIHVzZWQgaWYgdGhlIGRlc3RpbmF0aW9uLXR5cGUgaXMgamF2YXguam1zLlRvcGljLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vRGVzdGluYXRpb25UeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIEpNUyBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBqYXZheC5qbXMuUXVldWUsIGphdmF4Lmptcy5Ub3BpYyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJzY3JpcHRpb25EdXJhYmlsaXR5IgotICAgICAgICBlVHlwZT0iIy8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZSBvciBub25kdXJhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBEdXJhYmxlLCBOb25EdXJhYmxlJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiZWFuIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTWVzc2FnZURyaXZlbiIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01lc3NhZ2VEcml2ZW4vZGVzdGluYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJBY2tub3dsZWRnZU1vZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkF1dG8tYWNrbm93bGVkZ2U9MCYjeEQ7JiN4QTtEdXBzLW9rLWFja25vd2xlZGdlPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkF1dG9BY2tub3dsZWRnZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRHVwc09rQWNrbm93bGVkZ2UiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkR1cmFibGU9MCYjeEQ7JiN4QTtOb25EdXJhYmxlPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkR1cmFibGUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5vbkR1cmFibGUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUmV0dXJuVHlwZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkxvY2FsPTAmI3hEOyYjeEE7UmVtb3RlPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvY2FsIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSZW1vdGUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4Y2x1ZGVMaXN0IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUXVldWU9MCYjeEQ7JiN4QTtUb3BpYz0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJRdWV1ZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVG9waWMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlF1ZXJ5TWV0aG9kIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJ5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUXVlcnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9RdWVyeS9xdWVyeU1ldGhvZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik11bHRpcGxpY2l0eUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9uZT0wJiN4RDsmI3hBO01hbnk9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT25lIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNYW55IiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZSYjeEQ7JiN4QTtjb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhciYjeEQ7JiN4QTttZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudCYjeEQ7JiN4QTsgICAgICAgIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uJiN4RDsmI3hBOyAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucyYjeEQ7JiN4QTsgICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YmI3hEOyYjeEE7ICAgICAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkmI3hEOyYjeEE7ICAgICAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLCYjeEQ7JiN4QTsgICAgICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2YXRpb25Db25maWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgYWN0aXZhdGlvbi1jb25maWdUeXBlIGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlJiN4RDsmI3hBO2V4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiYjeEQ7JiN4QTtpbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24mI3hEOyYjeEE7YWJvdXQgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQsIG1lc3NhZ2Ugc2VsZWN0b3IsIGV4cGVjdGVkJiN4RDsmI3hBO2Rlc3RpbmF0aW9uIHR5cGUsIGV0Yy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiYjeEQ7JiN4QTtuYW1lL3ZhbHVlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhciYjeEQ7JiN4QTttZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uZmlnUHJvcGVydGllcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qMmVlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2oyZWUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTcyYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2oyZWUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIG1vZGVsTmFtZT0iSjJlZSIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcajJlZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPkQ6XHdvcmtcTTU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ2xpZW50IiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImNsaWVudC5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjbGllbnQuZWNvcmUjLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY2xpZW50LmVjb3JlIy8vUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS9BcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjbGllbnQuZWNvcmUjLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlL0NvbnRhaW5lciIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvcmVzb3VyY2VSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L2Vudmlyb25tZW50UHJvcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvZWpiUmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9yZXNvdXJjZUVudlJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9jYWxsYmFja0hhbmRsZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvc2VydmljZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvbWVzc2FnZURlc3RpbmF0aW9uUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9tZXNzYWdlRGVzdGluYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJBcHBsaWNhdGlvbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJhcHBsaWNhdGlvbi5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi9zZWN1cml0eVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vbW9kdWxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvYWx0REQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvYXBwbGljYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9XZWJNb2R1bGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViTW9kdWxlL2NvbnRleHRSb290Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vSmF2YUNsaWVudE1vZHVsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vRWpiTW9kdWxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9Db25uZWN0b3JNb2R1bGUiLz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJBcHBsaWNhdGlvbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImFwcGxpY2F0aW9uLmVjb3JlIy8iPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbiIgbGFiZWxGZWF0dXJlPSIjLy9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAvZGlzcGxheU5hbWUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi92ZXJzaW9uIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi9zZWN1cml0eVJvbGVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi9tb2R1bGVzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZSIgbGFiZWxGZWF0dXJlPSIjLy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi9Nb2R1bGUvdXJpIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL3VyaSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvYWx0REQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS9hcHBsaWNhdGlvbiIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9XZWJNb2R1bGUiIGxhYmVsRmVhdHVyZT0iIy8vYXBwbGljYXRpb24vYXBwbGljYXRpb24vTW9kdWxlL3VyaSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL1dlYk1vZHVsZS9jb250ZXh0Um9vdCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9KYXZhQ2xpZW50TW9kdWxlIiBsYWJlbEZlYXR1cmU9IiMvL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uL01vZHVsZS91cmkiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vRWpiTW9kdWxlIiBsYWJlbEZlYXR1cmU9IiMvL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uL01vZHVsZS91cmkiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vQ29ubmVjdG9yTW9kdWxlIiBsYWJlbEZlYXR1cmU9IiMvL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uL01vZHVsZS91cmkiLz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDb21tb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iY29tbW9uLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9TdHJpbmciLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0ludGVnZXIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0Jvb2xlYW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0RvdWJsZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvQnl0ZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvU2hvcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0xvbmciLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0Zsb2F0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9DaGFyYWN0ZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNvbW1vbi5lY29yZSMvL1Jlc0F1dGhUeXBlQmFzZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL1Jlc0F1dGhUeXBlQmFzZS9Db250YWluZXIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vUmVzQXV0aFR5cGVCYXNlL0FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL1Jlc0F1dGhUeXBlQmFzZS9TRVJWTEVUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21tb24uZWNvcmUjLy9FamJSZWZUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRWpiUmVmVHlwZS9TZXNzaW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VqYlJlZlR5cGUvRW50aXR5Ii8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21tb24uZWNvcmUjLy9SZXNTaGFyaW5nU2NvcGVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vUmVzU2hhcmluZ1Njb3BlVHlwZS9TaGFyZWFibGUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vUmVzU2hhcmluZ1Njb3BlVHlwZS9VbnNoYXJlYWJsZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlL0NvbnN1bWVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS9Qcm9kdWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUvQ29uc3VtZXNQcm9kdWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRWpiUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL2hvbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvcmVtb3RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vRWpiUmVmL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRW52RW50cnkvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FbnZFbnRyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRW52RW50cnkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FbnZFbnRyeS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0VudkVudHJ5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL2F1dGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvcmVzU2hhcmluZ1Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZS9yb2xlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9FSkJMb2NhbFJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRUpCTG9jYWxSZWYvbG9jYWxIb21lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRUpCTG9jYWxSZWYvbG9jYWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vUnVuQXNTcGVjaWZpZWRJZGVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkvaWRlbnRpdHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vSWRlbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0lkZW50aXR5L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSWRlbnRpdHkvcm9sZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSWRlbnRpdHkvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0ljb25UeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9JY29uVHlwZS9zbWFsbEljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9JY29uVHlwZS9sYXJnZUljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9JY29uVHlwZS9sYW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZS9sYW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmL3VzYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvbi9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uR3JvdXAiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwL2ljb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uR3JvdXAvZGlzcGxheU5hbWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uR3JvdXAvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvZW52aXJvbm1lbnRQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvcmVzb3VyY2VSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvZWpiUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL3Jlc291cmNlRW52UmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL2VqYkxvY2FsUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL21lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9zZXJ2aWNlUmVmcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9TZWN1cml0eUlkZW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eUlkZW50aXR5L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5SWRlbnRpdHkvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1VzZUNhbGxlcklkZW50aXR5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uL2xhbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbi92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUU5hbWUvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUU5hbWUvbG9jYWxQYXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUU5hbWUvY29tYmluZWRRTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1FOYW1lL2ludGVybmFsUHJlZml4T3JOc1VSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9MaXN0ZW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vTGlzdGVuZXIvbGlzdGVuZXJDbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAvc21hbGxJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAvbGFyZ2VJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC9kaXNwbGF5TmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0oyRUVFQXR0cmlidXRlIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkVqYiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJlamIuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL05vdFN1cHBvcnRlZCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvU3VwcG9ydHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL1JlcXVpcmVkIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9SZXF1aXJlc05ldyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvTWFuZGF0b3J5Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9OZXZlciIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25UeXBlL0JlYW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25UeXBlL0NvbnRhaW5lciIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vU2Vzc2lvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9TZXNzaW9uVHlwZS9TdGF0ZWZ1bCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9TZXNzaW9uVHlwZS9TdGF0ZWxlc3MiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudEtpbmQvVW5zcGVjaWZpZWQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudEtpbmQvUmVtb3RlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL0hvbWUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudEtpbmQvTG9jYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudEtpbmQvTG9jYWxIb21lIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL1NlcnZpY2VFbmRwb2ludCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vQWNrbm93bGVkZ2VNb2RlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vQWNrbm93bGVkZ2VNb2RlL0F1dG9BY2tub3dsZWRnZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9BY2tub3dsZWRnZU1vZGUvRHVwc09rQWNrbm93bGVkZ2UiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQvRHVyYWJsZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC9Ob25EdXJhYmxlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJlamIuZWNvcmUjLy9SZXR1cm5UeXBlTWFwcGluZyI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1JldHVyblR5cGVNYXBwaW5nL0xvY2FsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1JldHVyblR5cGVNYXBwaW5nL1JlbW90ZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vRGVzdGluYXRpb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vRGVzdGluYXRpb25UeXBlL1F1ZXVlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL0Rlc3RpbmF0aW9uVHlwZS9Ub3BpYyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vTXVsdGlwbGljaXR5S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL011bHRpcGxpY2l0eUtpbmQvT25lIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL011bHRpcGxpY2l0eUtpbmQvTWFueSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9hYnN0cmFjdFNjaGVtYU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9wZXJzaXN0ZW50QXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkva2V5QXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L3F1ZXJpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L0NNUEF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvcHJpbUtleUZpZWxkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL01ldGhvZFBlcm1pc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01ldGhvZFBlcm1pc3Npb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL3VuY2hlY2tlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL2Fzc2VtYmx5RGVzY3JpcHRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFBlcm1pc3Npb24vcm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi9tZXRob2RFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IvbWV0aG9kUGVybWlzc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21ldGhvZFRyYW5zYWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IvZWpiSmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0Fzc2VtYmx5RGVzY3JpcHRvci9zZWN1cml0eVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0Fzc2VtYmx5RGVzY3JpcHRvci9leGNsdWRlTGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IvbWVzc2FnZURlc3RpbmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXRob2RUcmFuc2FjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vdHJhbnNhY3Rpb25BdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RUcmFuc2FjdGlvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RUcmFuc2FjdGlvbi9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vbWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1Nlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1Nlc3Npb24vdHJhbnNhY3Rpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vU2Vzc2lvbi9zZXNzaW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1Nlc3Npb24vc2VydmljZUVuZHBvaW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRW50aXR5L3JlZW50cmFudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGl0eS9wcmltYXJ5S2V5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4vc2VjdXJpdHlSb2xlUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL2VqYkNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4vaG9tZUludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL3JlbW90ZUludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9lamJKYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4vc2VjdXJpdHlJZGVudGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL2xvY2FsSG9tZUludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL2xvY2FsSW50ZXJmYWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQk1ldGhvZENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vRUpCSmFyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJKYXIvZWpiQ2xpZW50SmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCSmFyL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCSmFyL2Fzc2VtYmx5RGVzY3JpcHRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJKYXIvZW50ZXJwcmlzZUJlYW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQkphci9yZWxhdGlvbnNoaXBMaXN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnQvcGFybXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9lbnRlcnByaXNlQmVhbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9DTVBBdHRyaWJ1dGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0NNUEF0dHJpYnV0ZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9DTVBBdHRyaWJ1dGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUmVsYXRpb25zaGlwcy9lamJKYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUmVsYXRpb25zaGlwcy9lamJSZWxhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUmVsYXRpb25zaGlwcy9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vUXVlcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1F1ZXJ5L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vUXVlcnkvZWpiUUwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9RdWVyeS9yZXR1cm5UeXBlTWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9RdWVyeS9xdWVyeU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9RdWVyeS9lbnRpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnkvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQlJlbGF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vcmVsYXRpb25zaGlwTGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbi9yZWxhdGlvbnNoaXBSb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvcm9sZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL211bHRpcGxpY2l0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvY2FzY2FkZURlbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3JlbGF0aW9uc2hpcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2NtckZpZWxkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1JvbGVTb3VyY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2UvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUm9sZVNvdXJjZS9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUm9sZVNvdXJjZS9lbnRpdHlCZWFuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2UvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0NNUkZpZWxkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ01SRmllbGQvcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NNUkZpZWxkL2NvbGxlY3Rpb25UeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vdHJhbnNhY3Rpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9tZXNzYWdlU2VsZWN0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2Fja25vd2xlZGdlTW9kZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2Rlc3RpbmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vYWN0aXZhdGlvbkNvbmZpZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbWVzc2FnZURlc3RpbmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9tZXNzYWdpbmdUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24vc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24vYmVhbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FeGNsdWRlTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRXhjbHVkZUxpc3QvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRXhjbHVkZUxpc3QvbWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRXhjbHVkZUxpc3QvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1F1ZXJ5TWV0aG9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnlNZXRob2QvcXVlcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9BY3RpdmF0aW9uQ29uZmlnIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZy9jb25maWdQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0FjdGl2YXRpb25Db25maWcvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJUYWdsaWIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGludGVyZmFjZVBhY2thZ2VTdWZmaXg9ImludGVybmFsIiBtZXRhRGF0YVBhY2thZ2VTdWZmaXg9ImludGVybmFsIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiCi0gICAgICB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJ0YWdsaWIuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlL3RhZ2RlcGVuZGVudCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9Cb2R5Q29udGVudFR5cGUvSlNQIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0JvZHlDb250ZW50VHlwZS9lbXB0eSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9Cb2R5Q29udGVudFR5cGUvc2NyaXB0bGVzcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idGFnbGliLmVjb3JlIy8vSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUvTkVTVEVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUvQVRfQkVHSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS9BVF9FTkQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL1RhZ0xpYiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnTGliL3RhZ0xpYlZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvanNwVmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi9zaG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi90YWdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi92YWxpZGF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vVGFnTGliL2xpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvZnVuY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi90YWdsaWJFeHRlbnNpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0pTUFRhZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnL2JvZHlDb250ZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnL2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWcvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy9keW5hbWljQXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWcvYXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWcvdmFyaWFibGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL3RhZ0NsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL3RlaUNsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0pTUFRhZ0F0dHJpYnV0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUvcnRFeHByVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUvZnJhZ21lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL1ZhbGlkYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vVmFsaWRhdG9yL3ZhbGlkYXRvckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1ZhbGlkYXRvci9pbml0UGFyYW1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1ZhbGlkYXRvci9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vSlNQVmFyaWFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL25hbWVHaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL25hbWVGcm9tQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVmFyaWFibGUvZGVjbGFyZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVmFyaWFibGUvdmFyaWFibGVDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vRnVuY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0Z1bmN0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9GdW5jdGlvbi9zaWduYXR1cmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9GdW5jdGlvbi9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vZnVuY3Rpb25DbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9GdW5jdGlvbi9mdW5jdGlvbkV4dGVuc2lvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vVGFnRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnRmlsZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnRmlsZS9wYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnRmlsZS9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvdGFnRXh0ZW5zaW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9UbGRFeHRlbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RsZEV4dGVuc2lvbi9uYW1lc3BhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vVGxkRXh0ZW5zaW9uL2V4dGVuc2lvbkVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vRXh0ZW5zaWJsZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0V4dGVuc2libGVUeXBlL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXZWJhcHBsaWNhdGlvbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Jlc0F1dGhTZXJ2bGV0VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vUmVzQXV0aFNlcnZsZXRUeXBlL0NPTlRBSU5FUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Jlc0F1dGhTZXJ2bGV0VHlwZS9TRVJWTEVUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSFRUUE1ldGhvZFR5cGVFbnVtL0dFVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9QT1NUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSFRUUE1ldGhvZFR5cGVFbnVtL1BVVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9ERUxFVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vSEVBRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9PUFRJT05TIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSFRUUE1ldGhvZFR5cGVFbnVtL1RSQUNFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUvTk9ORSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUvSU5URUdSQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlL0NPTkZJREVOVElBTCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9EaXNwYXRjaGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUvRk9SV0FSRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Rpc3BhdGNoZXJUeXBlL0lOQ0xVREUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9EaXNwYXRjaGVyVHlwZS9SRVFVRVNUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUvRVJST1IiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kL1VOU1BFQ0lGSUVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvQkFTSUMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoTWV0aG9kS2luZC9ESUdFU1QiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoTWV0aG9kS2luZC9GT1JNIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvQ0xJRU5UX0NFUlQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9kaXN0cmlidXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9jb250ZXh0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9lcnJvclBhZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2ZpbGVMaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3RhZ0xpYnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvY29uc3RyYWludHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbG9naW5Db25maWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbWltZU1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3Nlc3Npb25Db25maWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvc2VydmxldE1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3NlcnZsZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3NlY3VyaXR5Um9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZmlsdGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9maWx0ZXJNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9saXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvY29udGV4dFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9qc3BDb25maWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbWVzc2FnZURlc3RpbmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9sb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Db250ZXh0UGFyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQ29udGV4dFBhcmFtL3BhcmFtTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQ29udGV4dFBhcmFtL3BhcmFtVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvc2VydmxldE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvbG9hZE9uU3RhcnR1cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvd2ViQXBwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC93ZWJUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9wYXJhbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3NlY3VyaXR5Um9sZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3J1bkFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9pbml0UGFyYW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldE1hcHBpbmcvdXJsUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldE1hcHBpbmcvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldE1hcHBpbmcvc2VydmxldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Nlc3Npb25Db25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2Vzc2lvbkNvbmZpZy9zZXNzaW9uVGltZW91dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Nlc3Npb25Db25maWcvd2ViQXBwIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTWltZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTWltZU1hcHBpbmcvZXh0ZW5zaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9NaW1lTWFwcGluZy9taW1lVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL01pbWVNYXBwaW5nL3dlYkFwcCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2VsY29tZUZpbGVMaXN0L3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlTGlzdC9maWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRXJyb3JQYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yUGFnZS9sb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yUGFnZS93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UYWdMaWJSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVGFnTGliUmVmL3RhZ2xpYlVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVGFnTGliUmVmL3RhZ2xpYkxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVGFnTGliUmVmL3dlYkFwcCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlY3VyaXR5Q29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQvZGlzcGxheU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQvd2ViQXBwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L3dlYlJlc291cmNlQ29sbGVjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQvYXV0aENvbnN0cmFpbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQvdXNlckRhdGFDb25zdHJhaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L2Rpc3BsYXlOYW1lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vd2ViUmVzb3VyY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi91cmxQYXR0ZXJuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vaHR0cE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9zZWNDb25zdHJhaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL1VSTHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL0hUVFBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aENvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aENvbnN0cmFpbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L3JvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aENvbnN0cmFpbnQvc2VjQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VzZXJEYXRhQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VzZXJEYXRhQ29uc3RyYWludC90cmFuc3BvcnRHdWFyYW50ZWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvc2VjQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VzZXJEYXRhQ29uc3RyYWludC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy9hdXRoTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy9yZWFsbU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvZ2luQ29uZmlnL2F1dGhvcml6YXRpb25NZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy93ZWJBcHAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy9mb3JtTG9naW5Db25maWciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Gb3JtTG9naW5Db25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRm9ybUxvZ2luQ29uZmlnL2Zvcm1Mb2dpblBhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Zvcm1Mb2dpbkNvbmZpZy9mb3JtRXJyb3JQYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRm9ybUxvZ2luQ29uZmlnL2xvZ2luQ29uZmlnIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSW5pdFBhcmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0luaXRQYXJhbS9wYXJhbU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0luaXRQYXJhbS9wYXJhbVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0vZGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlR5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRUeXBlL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0pTUFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSlNQVHlwZS9qc3BGaWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVVJMUGF0dGVyblR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVVJMUGF0dGVyblR5cGUvdXJsUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VSTFBhdHRlcm5UeXBlL3Jlc0NvbGxlY3Rpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Sb2xlTmFtZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vUm9sZU5hbWVUeXBlL3JvbGVOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2VsY29tZUZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2VsY29tZUZpbGUvd2VsY29tZUZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWxjb21lRmlsZS9maWxlTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRXhjZXB0aW9uVHlwZUVycm9yUGFnZS9leGNlcHRpb25UeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRXJyb3JDb2RlRXJyb3JQYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yQ29kZUVycm9yUGFnZS9lcnJvckNvZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXJNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvdXJsUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyTWFwcGluZy9kaXNwYXRjaGVyVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyTWFwcGluZy9maWx0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvc2VydmxldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlci9pbml0UGFyYW1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIvZmlsdGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIvaW5pdFBhcmFtVmFsdWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QvbG9jYWxFbmNvZGluZ01hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmcvbG9jYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2NhbEVuY29kaW5nTWFwcGluZy9lbmNvZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlL2h0dHBNZXRob2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkpjYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJqY2EuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlL0Jhc2ljUGFzc3dvcmQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlL0tlcmJ2NSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamNhLmVjb3JlIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQvTm9UcmFuc2FjdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqY2EuZWNvcmUjLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kL0xvY2FsVHJhbnNhY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamNhLmVjb3JlIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZC9YQVRyYW5zYWN0aW9uIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9Db25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rvci92ZW5kb3JOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdG9yL3NwZWNWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdG9yL2Vpc1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0b3IvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9Db25uZWN0b3IvbGljZW5zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9Db25uZWN0b3IvcmVzb3VyY2VBZGFwdGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL21hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25JbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvY29ubmVjdGlvbkltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci90cmFuc2FjdGlvblN1cHBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvcmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvcmVzb3VyY2VBZGFwdGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL3NlY3VyaXR5UGVybWlzc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvY29uZmlnUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2luYm91bmRSZXNvdXJjZUFkYXB0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2FkbWluT2JqZWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2NyZWRlbnRpYWxJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9jdXN0b21BdXRoTWVjaFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vU2VjdXJpdHlQZXJtaXNzaW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vU2VjdXJpdHlQZXJtaXNzaW9uL3NwZWNpZmljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vU2VjdXJpdHlQZXJtaXNzaW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9MaWNlbnNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9MaWNlbnNlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vTGljZW5zZS9yZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9MaWNlbnNlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vSW5ib3VuZFJlc291cmNlQWRhcHRlci9tZXNzYWdlQWRhcHRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9PdXRib3VuZFJlc291cmNlQWRhcHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIvcmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9PdXRib3VuZFJlc291cmNlQWRhcHRlci90cmFuc2FjdGlvblN1cHBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIvY29ubmVjdGlvbkRlZmluaXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyL2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9NZXNzYWdlQWRhcHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL01lc3NhZ2VBZGFwdGVyL21lc3NhZ2VMaXN0ZW5lcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uL21hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24vY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uL2Nvbm5lY3Rpb25JbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25uZWN0aW9uSW1wbENsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uL2NvbmZpZ1Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQWRtaW5PYmplY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0FkbWluT2JqZWN0L2FkbWluT2JqZWN0SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQWRtaW5PYmplY3QvYWRtaW5PYmplY3RDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9BZG1pbk9iamVjdC9jb25maWdQcm9wZXJ0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL01lc3NhZ2VMaXN0ZW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vTWVzc2FnZUxpc3RlbmVyL21lc3NhZ2VMaXN0ZW5lclR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vTWVzc2FnZUxpc3RlbmVyL2FjdGl2YXRpb25TcGVjIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0FjdGl2YXRpb25TcGVjIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BY3RpdmF0aW9uU3BlYy9hY3RpdmF0aW9uU3BlY0NsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0FjdGl2YXRpb25TcGVjL3JlcXVpcmVkQ29uZmlnUHJvcGVydGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldlYnNlcnZpY2VfY2xpZW50IiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIKLSAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiCi0gICAgICBlY29yZVBhY2thZ2U9IndzY2xpZW50LmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3NlcnZpY2VJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvc2VydmljZVJlZk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvd3NkbEZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvamF4cnBjTWFwcGluZ0ZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3BvcnRDb21wb25lbnRSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZi9oYW5kbGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvc2VydmljZVFuYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY2xpZW50LmVjb3JlIy8vUG9ydENvbXBvbmVudFJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50UmVmL3BvcnRDb21wb25lbnRMaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50UmVmL3NlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vSGFuZGxlci9zb2FwUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvcG9ydE5hbWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL2hhbmRsZXJDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvc29hcEhlYWRlcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NjbGllbnQuZWNvcmUjLy9XZWJTZXJ2aWNlc0NsaWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vV2ViU2VydmljZXNDbGllbnQvY29tcG9uZW50U2NvcGVkUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1dlYlNlcnZpY2VzQ2xpZW50L3NlcnZpY2VSZWZzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY2xpZW50LmVjb3JlIy8vQ29tcG9uZW50U2NvcGVkUmVmcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9Db21wb25lbnRTY29wZWRSZWZzL2NvbXBvbmVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9Db21wb25lbnRTY29wZWRSZWZzL3NlcnZpY2VSZWZzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKc3AiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0ianNwLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpzcC5lY29yZSMvL0pTUENvbmZpZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpzcC5lY29yZSMvL0pTUENvbmZpZy90YWdMaWJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpzcC5lY29yZSMvL0pTUENvbmZpZy9wcm9wZXJ0eUdyb3VwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL2VsSWdub3JlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvcGFnZUVuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC9zY3JpcHRpbmdJbnZhbGlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC9pc1hNTCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvaW5jbHVkZVByZWx1ZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC9pbmNsdWRlQ29kYXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ianNwLmVjb3JlIy8vVGFnTGliUmVmVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vVGFnTGliUmVmVHlwZS90YWdsaWJVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9UYWdMaWJSZWZUeXBlL3RhZ2xpYkxvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXc2NvbW1vbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9IndzY29tbW9uLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY29tbW9uLmVjb3JlIy8vSW5pdFBhcmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NvbW1vbi5lY29yZSMvL0luaXRQYXJhbS9wYXJhbU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NvbW1vbi5lY29yZSMvL0luaXRQYXJhbS9wYXJhbVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vZGVzY3JpcHRpb25UeXBlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL1NPQVBIZWFkZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL1NPQVBSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NvbW1vbi5lY29yZSMvL1NPQVBSb2xlL3NvYXBSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY29tbW9uLmVjb3JlIy8vUG9ydE5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY29tbW9uLmVjb3JlIy8vUG9ydE5hbWUvcG9ydE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvblR5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lVHlwZSIvPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXc2RkIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0id3NkZC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vV2ViU2VydmljZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZXMvd2ViU2VydmljZURlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2pheHJwY01hcHBpbmdGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi93ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi93c2RsRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vc21hbGxJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9sYXJnZUljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9kaXNwbGF5TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL3BvcnRDb21wb25lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vZGVzY3JpcHRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vZGlzcGxheU5hbWVUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vaWNvblR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L3BvcnRDb21wb25lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvc21hbGxJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvbGFyZ2VJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9kaXNwbGF5TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC93c2RsUG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9zZXJ2aWNlSW1wbEJlYW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvaGFuZGxlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvZGVzY3JpcHRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rpc3BsYXlOYW1lVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9pY29uVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vV1NETFBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vU2VydmljZUltcGxCZWFuIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbi9lRUpCTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vU2VydmljZUltcGxCZWFuL2VTZXJ2bGV0TGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vU2VydmljZUltcGxCZWFuL2JlYW5MaW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9TZXJ2bGV0TGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1NlcnZsZXRMaW5rL3NlcnZsZXRMaW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9FSkJMaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vRUpCTGluay9lamJMaW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9IYW5kbGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9IYW5kbGVyL2hhbmRsZXJDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9pbml0UGFyYW1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9IYW5kbGVyL3NvYXBIZWFkZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9IYW5kbGVyL3NvYXBSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vQmVhbkxpbmsiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamF4cnBjbWFwLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pheHJwY21hcC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlYmYxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamF4cnBjbWFwLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImpheHJwY21hcCIKLSAgICBuc1VSST0iamF4cnBjbWFwLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhV1NETE1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIG1hcHBpbmcgdG8gYSBrbm93biBXU0RMIGRvY3VtZW50Lkl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQgWE1MIG5hbWVzcGFjZXMsICYjeEQ7JiN4QTtXU0RMIHJvb3QgdHlwZXMgYW5kIEphdmEgYXJ0aWZhY3RzLCBhbmQgdGhlIHNldCBvZiBtYXBwaW5ncyBmb3Igc2VydmljZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhY2thZ2VNYXBwaW5ncyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QYWNrYWdlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YVhNTFR5cGVNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhWE1MVHlwZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4Y2VwdGlvbk1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4Y2VwdGlvbk1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZU1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ludGVyZmFjZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYWNrYWdlLW1hcHBpbmcgaW5kaWNhdGVzIHRoZSBtYXBwaW5nIGJldHdlZW4gamF2YS1wYWNrYWdlLW5hbWUgYW5kIFhNTCBuYW1lc3BhY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcGFja2FnZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhWE1MVHlwZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgY2xhc3MtdHlwZSB0aGF0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgUU5hbWUgb2YgdGhlIFhNTCByb290IHR5cGUsIHRoZSBXU0RMIHR5cGUgc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgJiN4RDsmI3hBO21hcHBpbmdzIGZvciBlYWNoIHB1YmxpYyB2YXJpYWJsZSB3aXRoaW4gdGhlIEphdmEgY2xhc3MuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY2xhc3MtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icW5hbWVTY29wZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBxbmFtZS1zY29wZSBlbGVtZW50cyBzY29wZXMgdGhlIHJlZmVyZW5jZSBvZiBhIFFOYW1lIHRvIHRoZSBXU0RMIGVsZW1lbnQgdHlwZSBpdCBhcHBsaWVzIHRvLiBUaGUgdmFsdWUgb2YgcW5hbWUtc2NvcGUgbWF5IGJlIHNpbXBsZVR5cGUsIGNvbXBsZXhUeXBlLCBvciBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFub255bW91c1R5cGVRbmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb290VHlwZVFuYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUm9vdFR5cGVRbmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJsZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4Y2VwdGlvbk1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4Y2VwdGlvbi1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbiB0eXBlcyBhbmQgdGhlIHdzZGwgZmF1bHRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlJiN4RDsmI3hBO21hcHBpbmcgYmV0d2VlbiBhIG1ldGhvZCBhbmQgYW4gb3BlcmF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoZSBtYXBwaW5nIGNvbnRleHQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2VwdGlvblR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhjZXB0aW9uLXR5cGUgZWxlbWVudCBkZWZpbmVzIEphdmEgdHlwZSBvZiB0aGUgZXhjZXB0aW9uLiBJdCBtYXkgYmUgYSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO0l0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxNZXNzYWdlUGFydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbE1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIiBlU3VwZXJUeXBlcz0iIy8vSW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGhvdyBhIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG1hcHMgdG8gYSBXU0RMIHNlcnZpY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZUludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UuIEZvciBzdGF0aWMgc2VydmljZXMsIGl0IGlzIGphdmF4LnhtbC5ycGMuU2VydmljZSBpbnRlcmZhY2UuIEZvciBnZW5lcmF0ZWQgc2VydmljZSwgaXQgd291bGQgYmUgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbFNlcnZpY2VOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETFNlcnZpY2VOYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3J0TWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUG9ydE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciIGVTdXBlclR5cGVzPSIjLy9JbnRlcmZhY2VNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUmI3hEOyYjeEE7dG8gc3BlY2lmeSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gV1NETCBwb3J0IHR5cGVzIGFuZCBXU0RMIGJpbmRpbmdzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QW4gaW50ZXJmYWNlIG1heSBiZSBtYXBwZWQgdG8gYSBwb3J0LXR5cGUgYW5kIGJpbmRpbmcgbXVsdGlwbGUgdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbFBvcnRUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETFBvcnRUeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsQmluZGluZyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExCaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb290VHlwZVFuYW1lIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByb290LXR5cGUtcW5hbWUgaWRlbnRpZmllcyB0aGUgV1NETCBRTmFtZSBvZiBhbiBYTUwgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJsZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhYmxlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgSmF2YSBjbGFzcyBkYXRhIG1lbWJlciBvciBKYXZhQmVhbnMgcHJvcGVydHkgdG8gYW4gWE1MIGVsZW1lbnQgbmFtZSBvZiBhbiBYTUwgcm9vdCB0eXBlLiBJZiB0aGUgZGF0YS1tZW1iZXIgZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgcHVibGljIGRhdGEgbWVtYmVyLiAgSWYgZGF0YS1tZW1iZXImI3hEOyYjeEE7aXMgbm90IHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZhcmlhYmxlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvciAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuICYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieG1sRWxlbWVudE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhTWVtYmVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4bWxBdHRyaWJ1dGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbFdpbGRjYXJkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMTWVzc2FnZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1tZXNzYWdlICBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciBlbGVtZW50IGRlZmluZXMgdGhlIG9yZGVyIHRoYXQgY29tcGxleFR5cGUgZWxlbWVudCB2YWx1ZXMgYXJlIGFwcGxpZWQgdG8gYSBKYXZhIGV4Y2VwdGlvbiBjb25zdHJ1Y3Rvci4gRWxlbWVudCBuYW1lcyBhcmUgc3BlY2lmaWVkIGZvciBlYWNoIHBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IsIGluY2x1ZGluZyBlbGVtZW50IG5hbWVzIG9mIGluaGVyaXRlZCB0eXBlcyBpZiBuZWNlc3NhcnkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50TmFtZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRWxlbWVudE5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnROYW1lIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgY29tcGxleFR5cGUgZWxlbWVudCBuYW1lIGF0dHJpYnV0ZSB2YWx1ZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExTZXJ2aWNlTmFtZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1zZXJ2aWNlLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHNlcnZpY2UgbmFtZSBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBzZXJ2aWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0TWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0Jmx0O2phdmEtbmFtZT4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtbmFtZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgbmFtZSBhdHRyaWJ1dGUgb2YgYSBXU0RMIHBvcnQgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGphdmEtcG9ydC1uYW1lIGVsZW1lbnQgaXMgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHBvcnQgbmFtZSBpbiBKYXZhLiAgSXQgaXMgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kJiN4RDsmI3hBO2dldCZsdDtqYXZhLXBvcnQtbmFtZT4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBwb3J0LW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFBvcnRUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlJiN4RDsmI3hBO2J5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHBvcnQgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETEJpbmRpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtYmluZGluZyBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgYmluZGluZyYjeEQ7JiN4QTtieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiBKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkgcW5hbWVzKS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB3c2RsLW9wZXJhdGlvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3J0VHlwZSBhbmQgYmluZGluZyBpbiB3aGljaCB0aGlzIGRlZmluaXRpb24gaXMgZW1iZWRkZWQgd2l0aGluLiBTZWUgdGhlIGRlZmluaXRpb25zIGZvciBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGFuZCAmI3hEOyYjeEE7c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyB0byBhY3F1aXJlIHRoZSBwcm9wZXIgY29udGV4dC4gVGhlIHdyYXBwZWQtZWxlbWVudCBpbmRpY2F0b3Igc2hvdWxkIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gYSBXU0RMIG1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMgbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhTWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLW1ldGhvZC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIEphdmEgbWV0aG9kIHdpdGhpbiBhbiBpbnRlcmZhY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxPcGVyYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1vcGVyYXRpb24gZWxlbWVudCBkZWZpbmVzIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50LiBJdCBtdXN0IGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byBhIHBvcnQgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3JhcHBlZEVsZW1lbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbFJldHVyblZhbHVlTWFwcGluZyIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExPcGVyYXRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxPcGVyYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtUG9zaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlciBzdGFydGluZyBmcm9tIDAuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gSXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsTWVzc2FnZU1hcHBpbmciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExSZXR1cm5WYWx1ZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZS4gSXQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiAgVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5ICYjeEQ7JiN4QTtpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGlzIG5vdCYjeEQ7JiN4QTtzcGVjaWZpZWQgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIG9yIE9VVCBwYXJhbWV0ZXJzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2RSZXR1cm5WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbE1lc3NhZ2VQYXJ0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudCYjeEQ7JiN4QTtuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsTWVzc2FnZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExNZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMTWVzc2FnZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtbWVzc2FnZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkgJiN4RDsmI3hBO2lkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBwYXJhbWV0ZXItbW9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBtYXBwaW5nIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcHBpbmcgd2lsbCBiZSBJTiwgT1VULCBvciBJTk9VVC4uICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNvYXAtaGVhZGVyJiN4RDsmI3hBO2VsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBtYXBwZWQgdG8gYSBzb2FwIGhlYWRlciBvbmx5LiBXaGVuIGFic2VudCwgaXQgbWVhbnMgdGhhdCB0aGUgd3NkbC1tZXNzYWdlIGlzIG1hcHBlZCB0byBhIEphdmEgcGFyYW1ldGVyLiBUaGUgc29hcCBoZWFkZXJzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUmI3hEOyYjeEE7cHJvdmlkZWQgaW4gdGhlIG1hcHBpbmcuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTWVzc2FnZVBhcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW50ZXJwcmV0YXRpb24gb2YgdGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZWxlbWVudCBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IHdyYXBwZWQtZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nLiAgSWYgd3JhcHBlZC1lbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBwYXJ0LiBJdCBzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVyIHdpdGggcmVzcGVjdCB0byBhIHdzZGwtbWVzc2FnZSBlbGVtZW50LiBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIHJlZmVycyB0byBhbiBlbGVtZW50JiN4RDsmI3hBO25hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtZXRlck1vZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW1ldGVyLW1vZGUgIGVsZW1lbnQgZGVmaW5lcyB0aGUgbW9kZSBvZiB0aGUgcGFyYW1ldGVyLiBJdCBjYW4gaGF2ZSBvbmx5IHRocmVlIHZhbHVlcywgSU4sIE9VVCwgSU5PVVQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwSGVhZGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsTWVzc2FnZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExNZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMTWVzc2FnZVBhcnROYW1lIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTWVzc2FnZVBhcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVyZmFjZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qY2EuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamNhLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdlMzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qY2EuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iamNhIgotICAgIG5zVVJJPSJqY2EueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25uZWN0b3IiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlbmRvck5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIG5hbWUgb2YgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuJiN4RDsmI3hBO0V4YW1wbGU6IFdvbWJhdCBDb3JwLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjVmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVpc1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiB0aGUgRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbiBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTIGluZGVwZW5kZW50IG9mIGFueSB2ZXJzaW9uIGluZm8uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoJiN4RDsmI3hBO3RoaXMgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTogMS41Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpY2Vuc2UiIGVUeXBlPSIjLy9MaWNlbnNlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiYjeEQ7JiN4QTtjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlQWRhcHRlciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlQWRhcHRlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VBZGFwdGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cywgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCwgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsJiN4RDsmI3hBO3JlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mJiN4RDsmI3hBO3Jlc291cmNlIGFkYXB0ZXIgZWxlbWVudCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90JiN4RDsmI3hBO3N1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydCYjeEQ7JiN4QTtvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eSYjeEQ7JiN4QTtwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyYjeEQ7JiN4QTtTcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlJiN4RDsmI3hBO1NwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MmI3hEOyYjeEE7U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uSW50ZXJmYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25JbXBsQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25JbXBsQ2xhc3MmI3hEOyYjeEE7U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblN1cHBvcnQiIGVUeXBlPSIjLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLnRyYW5zYWN0aW9uU3VwcG9ydCYjeEQ7JiN4QTtUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24mI3hEOyYjeEE7c3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uLXN1cHBvcnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzomI3hEOyYjeEE7ICBOb1RyYW5zYWN0aW9uJiN4RDsmI3hBOyAgTG9jYWxUcmFuc2FjdGlvbiYjeEQ7JiN4QTsgIFhBVHJhbnNhY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhdXRoZW50aWNhdGlvblN1cHBvcnQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLnJlYXV0aGVudGljYXRpb25TdXBwb3J0JiN4RDsmI3hBO1NwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VBZGFwdGVyQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMmI3hEOyYjeEE7ICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlciYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YmI3hEOyYjeEE7ICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yJiN4RDsmI3hBOyAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiYjeEQ7JiN4QTsgICAgICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlQZXJtaXNzaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN1cml0eVBlcm1pc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXV0aGVudGljYXRpb25NZWNoYW5pc21zIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25maWdQcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRib3VuZFJlc291cmNlQWRhcHRlciIKLSAgICAgICAgZVR5cGU9IiMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSYjeEQ7JiN4QTsgICAgICAgIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLiBNdWx0aXBsZSBjb25uZWN0aW9uLWRlZmluaXRpb25zJiN4RDsmI3hBOyAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgY29ubmVjdGlvbmZhY3RvcnktdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5ib3VuZFJlc291cmNlQWRhcHRlciIKLSAgICAgICAgZVR5cGU9IiMvL0luYm91bmRSZXNvdXJjZUFkYXB0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZG1pbk9iamVjdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQWRtaW5PYmplY3QiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcyBhbnkgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyByZXF1aXJlbWVudCBmb3IgdGhlIHN1cHBvcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4mI3hEOyYjeEE7JiN4RDsmI3hBO05vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZSYjeEQ7JiN4QTtqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIGludGVyZmFjZS4mI3hEOyYjeEE7VGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUmI3hEOyYjeEE7amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiCi0gICAgICAgIGVUeXBlPSIjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUgYXV0aGVudGljYXRpb25NZWNoYW5pc20mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOiYjeEQ7JiN4QTsgIC0gQmFzaWNQYXNzd29yZCYjeEQ7JiN4QTsgIC0gS2VyYnY1JiN4RDsmI3hBOyYjeEQ7JiN4QTtBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUmI3hEOyYjeEE7Q29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlZGVudGlhbEludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkgY29udHJhY3QuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcG9zc2libGUgdmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCYjeEQ7JiN4QTsgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1c3RvbUF1dGhNZWNoVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhpcyBpcyBhbiBpbnRlcm5hbCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBBdGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB3aGVuIGl0IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIEJhc2ljUGFzc3dvcmQgb3IgS2VyYnY1LiAgQXV0aGVudGljYXRpb25NZWNhbmlzbVR5cGUgaXMgc2V0IHRvICdDdXN0b20nIGluIHRob3NlIGNhc2VzLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHJ1bnRpbWUuICBJdCBpcyBvbmx5IHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSBiYWNrIG91dCB0aGUgY3VzdG9tIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YgY3VzdG9tIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSdzLiAgJiN4RDsmI3hBO1RoaXMgdmFyaWFibGUgaXMgaW50ZXJuYWwsIHVzZWQgb25seSBieSB0aGUgcmVhZGVyL3dyaXRlciBjbGFzc2VzLCBhbmQgY2FuIGNoYW5nZSBvciBkaXNhcHBlYXIgd2l0aG91dCBub3RpY2UuICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO0Jhc2ljUGFzc3dvcmQ9MCYjeEQ7JiN4QTtLZXJidjU9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQmFzaWNQYXNzd29yZCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iS2VyYnY1IiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25maWdQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uZmlnIHByb3BlcnR5IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBzaW5nbGUmI3hEOyYjeEE7Y29uZmlndXJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFYWNoIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZSBjcmVhdGVzIGNvbm5lY3Rpb25zIHRvIGEgc3BlY2lmaWMgRUlTIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgb24gdGhlIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgb25seSBvbmNlIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGV2ZW4gdGhvdWdoIGEgcmVzb3VyY2UgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgTWFuYWdlZENvbm5uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2VzICh0aGF0IGNyZWF0ZSBjb25uZWN0aW9ucyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIEVJUykuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsIHR5cGUmI3hEOyYjeEE7YW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZiB0aGUgcmVzb3VyY2UmI3hEOyYjeEE7YWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbiB0aGUgZGVwbG95ZXIgaXMmI3hEOyYjeEE7cmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIHNldCBvZiB3ZWxsLWRlZmluZWQgcHJvcGVydGllcyBhbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMgZm9sbG93czomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgU2VydmVyTmFtZSYjeEQ7JiN4QTsgICAgIFBvcnROdW1iZXImI3hEOyYjeEE7ICAgICBVc2VyTmFtZSYjeEQ7JiN4QTsgICAgIFBhc3N3b3JkJiN4RDsmI3hBOyAgICAgQ29ubmVjdGlvblVSTCYjeEQ7JiN4QTsmI3hEOyYjeEE7QSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMgdW5kZXJseWluZyBFSVMuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkIGJ5IE1hbmFnZWRDb25uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGNvbmZpZy1wcm9wZXJ0eS10eXBlOiYjeEQ7JiN4QTsgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsJiN4RDsmI3hBOyAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsJiN4RDsmI3hBOyAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdmFsdWUgY29udGFpbnMgdGhlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgb2YgYSBjb25maWd1cmF0aW9uIGVudHJ5LiBOb3RlLCBpdCBpcyBwb3NzaWJsZSBmb3IgYSYjeEQ7JiN4QTsgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcyYjeEQ7JiN4QTsgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZHVyaW5nIGRlcGxveW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgJmx0O2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT5Xb21iYXRTZXJ2ZXImbHQ7L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3VyaXR5UGVybWlzc2lvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdG9yIHNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkgcGVybWlzc2lvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgcGVybWlzc2lvbi1zcGVjIHNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlIHN5bnRheC4gJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGljZW5zZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBTcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgUmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGxpY2Vuc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTG9jYWxUcmFuc2FjdGlvbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlhBVHJhbnNhY3Rpb24iIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiYjeEQ7JiN4QTthYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24mI3hEOyYjeEE7c3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyJiN4RDsmI3hBO2xpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VBZGFwdGVyIiBlVHlwZT0iIy8vTWVzc2FnZUFkYXB0ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlJiN4RDsmI3hBOyAgICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzJiN4RDsmI3hBOyAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0JiN4RDsmI3hBO2FuIG91dGJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSYjeEQ7JiN4QTtxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YmI3hEOyYjeEE7dGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3ImI3hEOyYjeEE7Y29ubmVjdGlvbiBtYW5hZ2VtZW50LCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0JiN4RDsmI3hBO3Byb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCYjeEQ7JiN4QTthbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZiYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdCYjeEQ7JiN4QTtzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzJiN4RDsmI3hBO3BhcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyYjeEQ7JiN4QTt0aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXV0aGVudGljYXRpb25TdXBwb3J0IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzJiN4RDsmI3hBOyAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbiYjeEQ7JiN4QTsgICAgICAgIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlJiN4RDsmI3hBOyAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUmI3hEOyYjeEE7ICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZSYjeEQ7JiN4QTsgICAgICAgIGVpdGhlciBhICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zYWN0aW9uU3VwcG9ydCIgZVR5cGU9IiMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29ubmVjdGlvbkRlZmluaXRpb25zIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VBZGFwdGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlJiN4RDsmI3hBO21lc3NhZ2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMmI3hEOyYjeEE7Y29udGFpbnMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlJiN4RDsmI3hBO21lc3NhZ2VsaXN0ZW5lciBlbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlTGlzdGVuZXJzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01lc3NhZ2VMaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdGlvbkRlZmluaXRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSBkZWZpbmVzIGEgc2V0IG9mIGNvbm5lY3Rpb24mI3hEOyYjeEE7aW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBwZXJ0YWluaW5nIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uJiN4RDsmI3hBO3R5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3ImI3hEOyYjeEE7TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcyB0aGF0IG1heSBiZSBwcm9kdWNlZCBvdXQmI3hEOyYjeEE7b2YgdGhpcyBzZXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0JiN4RDsmI3hBOyAgICAgICAgaW1wbGVtZW50cyB0aGUmI3hEOyYjeEE7ICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4mI3hEOyYjeEE7ICAgICAgICBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZSYjeEQ7JiN4QTsgICAgICAgIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlJiN4RDsmI3hBOyAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMmI3hEOyYjeEE7ICAgICAgICBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsgICAgICAgICZsdDttYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+JiN4RDsmI3hBOyAgICAgICAgICAgIGNvbS53b21iYXQuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5SW1wbCYjeEQ7JiN4QTsgICAgICAgICZsdDsvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAmbHQ7Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkmI3hEOyYjeEE7ICAgICAgICAmbHQ7L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgT1ImI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkmI3hEOyYjeEE7ICAgICAgICAmbHQ7L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkmI3hEOyYjeEE7ICAgICAgICBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwmI3hEOyYjeEE7ICAgICAgICAmbHQ7L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25JbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5JiN4RDsmI3hBOyAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCYjeEQ7JiN4QTsgICAgICAgIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAgICAgJmx0O2Nvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uJiN4RDsmI3hBOyAgICAgICAgICAgICZsdDsvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25JbXBsQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5JiN4RDsmI3hBOyAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdCYjeEQ7JiN4QTsgICAgICAgIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uJiN4RDsmI3hBOyAgICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzJiN4RDsmI3hBOyAgICAgICAgZWxlbWVudHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwmI3hEOyYjeEE7ICAgICAgICAgICAgJmx0Oy9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmZpZ1Byb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFkbWluT2JqZWN0IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4mI3hEOyYjeEE7YWRtaW5pc3RlcmVkIG9iamVjdC4gIEFkbWluaXN0ZXJlZCBvYmplY3RzIGFyZSBzcGVjaWZpYyB0byBhJiN4RDsmI3hBO21lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucyYjeEQ7JiN4QTtpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkmI3hEOyYjeEE7YW4gYWRtaW5pc3RlcmVkIG9iamVjdCwgaXRzIEphdmEgY2xhc3MgbmFtZSBhbmQgaXRzJiN4RDsmI3hBO2NvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5PYmplY3RJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlJiN4RDsmI3hBOyAgICAgICAgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgICAmbHQ7YWRtaW5vYmplY3QtaW50ZXJmYWNlPmphdmF4Lmptcy5EZXN0aW5hdGlvbiYjeEQ7JiN4QTsgICAgICAgICAgJmx0Oy9hZG1pbm9iamVjdC1pbnRlcmZhY2U+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkbWluT2JqZWN0Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5JiN4RDsmI3hBOyAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwmI3hEOyYjeEE7ICAgICAgICAgICAgJmx0Oy9hZG1pbm9iamVjdC1jbGFzcz4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uZmlnUHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db25maWdQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZUxpc3RlbmVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEmI3hEOyYjeEE7c3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZyYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlJiN4RDsmI3hBO29mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbiYjeEQ7JiN4QTtzcGVjaWZpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXNzYWdlTGlzdGVuZXJUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgbWVzc2FnZWxpc3RlbmVyLXR5cGUgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlJiN4RDsmI3hBOyAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAgICZsdDttZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyJiN4RDsmI3hBOyAgICAgICAgICAmbHQ7L21lc3NhZ2VsaXN0ZW5lci10eXBlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3RpdmF0aW9uU3BlYyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2YXRpb25TcGVjIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uU3BlYyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBhY3RpdmF0aW9uc3BlY1R5cGUgc3BlY2lmaWVzIGFuIGFjdGl2YXRpb24mI3hEOyYjeEE7c3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQmI3hEOyYjeEE7SmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2YXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgYSBzZXQgb2YmI3hEOyYjeEE7cmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZhdGlvblNwZWNDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkmI3hEOyYjeEE7ICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uJiN4RDsmI3hBOyAgICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUmI3hEOyYjeEE7ICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUmI3hEOyYjeEE7ICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEmI3hEOyYjeEE7ICAgICAgICBKYXZhQmVhbi4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAgICAgJmx0O2FjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsJiN4RDsmI3hBOyAgICAgICAgICAgICZsdDsvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uJiN4RDsmI3hBO29mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhJiN4RDsmI3hBO3JlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZCYjeEQ7JiN4QTtieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT5EZXN0aW5hdGlvbiZsdDsvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qc3AuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvanNwLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EwNDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qc3AuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJqc3AiCi0gICAgbnNVUkk9ImpzcC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUENvbmZpZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24mI3hEOyYjeEE7aW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcyYjeEQ7JiN4QTt0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdMaWJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RhZ0xpYlJlZlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5R3JvdXBzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFByb3BlcnR5R3JvdXAiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFByb3BlcnR5R3JvdXAiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mJiN4RDsmI3hBO2ZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4mI3hEOyYjeEE7QWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gVGhlJiN4RDsmI3hBO2ZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDomI3hEOyYjeEE7JiN4RDsmI3hBOy0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLiAtIENvbnRyb2wgZW5hYmxpbmcmI3hEOyYjeEE7b2YgU2NyaXB0aW5nIGVsZW1lbnRzLiAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyYjeEQ7JiN4QTtpbmZvcm1hdGlvbi4gLSBJbmRpY2F0aW5nIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCYjeEQ7JiN4QTtkb2N1bWVudCAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmxQYXR0ZXJuIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbElnbm9yZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQmI3hEOyYjeEE7JiN4OTtwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwmI3hEOyYjeEE7JiN4OTt0aGUgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWImI3hEOyYjeEE7JiN4OTtBcHBsaWNhdGlvbnMgdXNpbmcgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyJiN4RDsmI3hBOyYjeDk7d2ViLnhtbCwgYW5kIGRpc2FibGVkIG90aGVyd2lzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFnZUVuY29kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbGlkIHZhbHVlcyBvZiBwYWdlLWVuY29kaW5nIGFyZSB0aG9zZSBvZiYjeEQ7JiN4QTsmI3g5O3RoZSBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGEmI3hEOyYjeEE7JiN4OTt0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50JiN4RDsmI3hBOyYjeDk7ZW5jb2RpbmdzIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSYjeEQ7JiN4QTsmI3g5O3BhZ2UgZGlyZWN0aXZlIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQJiN4RDsmI3hBOyYjeDk7Y29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBwYWdlLiBJdCBpcyYjeEQ7JiN4QTsmI3g5O2Fsc28gYSB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50JiN4RDsmI3hBOyYjeDk7ZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cgb2YgYSBkb2N1bWVudCBpbiBYTUwmI3hEOyYjeEE7JiN4OTtzeW50YXggYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudCYjeEQ7JiN4QTsmI3g5O21hdGNoaW5nIHRoZSBkb2N1bWVudC4gSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUmI3hEOyYjeEE7JiN4OTtzYW1lIGVuY29kaW5nIHRocm91Z2ggbXVsaXRwbGUgbWVjaGFuaXNtcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NyaXB0aW5nSW52YWxpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYSYjeEQ7JiN4QTsmI3g5O2dyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzJiN4RDsmI3hBOyYjeDk7ZW5hYmxlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNYTUwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzJiN4RDsmI3hBOyYjeDk7dGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsJiN4RDsmI3hBOyYjeDk7YW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLiYjeEQ7JiN4QTsmI3g5O0lmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdCBiZSYjeEQ7JiN4QTsmI3g5O0pTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyIHByb3BlcnR5JiN4RDsmI3hBOyYjeDk7Z3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNsdWRlUHJlbHVkZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEmI3hEOyYjeEE7JiN4OTtjb250ZXh0LXJlbGF0aXZlIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8mI3hEOyYjeEE7JiN4OTthbiBlbGVtZW50IGluIHRoZSBXZWIgQXBwbGljYXRpb24uIFdoZW4gdGhlJiN4RDsmI3hBOyYjeDk7ZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlJiN4RDsmI3hBOyYjeDk7YXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMgaW4gYW4gaW5jbHVkZSYjeEQ7JiN4QTsmI3g5O2RpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIEpTUCBwYWdlIGluJiN4RDsmI3hBOyYjeDk7dGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVDb2RhcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlJiN4RDsmI3hBOyYjeDk7cGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZSYjeEQ7JiN4QTsmI3g5O1dlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LCYjeEQ7JiN4QTsmI3g5O3RoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCYjeEQ7JiN4QTsmI3g5OyhhcyBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoJiN4RDsmI3hBOyYjeDk7SlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhZ0xpYlJlZlR5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtBIHRhZ2xpYiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGEgdGFnJiN4RDsmI3hBO2xpYnJhcnkgdGhhdCBpcyB1c2VkIGJ5IGEgSlNQIHBhZ2Ugd2l0aGluIHRoZSBXZWImI3hEOyYjeEE7QXBwbGljYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhZ2xpYlVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYSYjeEQ7JiN4QTsgICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5JiN4RDsmI3hBOyAgICAgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuJiN4RDsmI3hBOyAgICAgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLiYjeEQ7JiN4QTsgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUmI3hEOyYjeEE7ICAgICAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhZ2xpYkxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0idGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiYjeEQ7JiN4QTsgICAgICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWImI3hEOyYjeEE7ICAgICAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkmI3hEOyYjeEE7ICAgICAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC90YWdsaWIuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvdGFnbGliLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2M4NGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC90YWdsaWIuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idGFnbGliIgotICAgIG5zVVJJPSJ0YWdsaWIueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdMaWIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6JiN4RDsmI3hBOyYjeEQ7JiN4QTtkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICZxdW90O3VzZSZxdW90OyBvZiB0aGlzIHRhZ2xpYiwmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlJiN4RDsmI3hBOyYjeEQ7JiN4QTtkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIGJ5IHRvb2xzJiN4RDsmI3hBOyYjeEQ7JiN4QTtpY29uICAgICAgICAgICAgb3B0aW9uYWwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzJiN4RDsmI3hBOyYjeEQ7JiN4QTt0bGliLXZlcnNpb24gICAgdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtzaG9ydC1uYW1lICAgICAgYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXgmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzJiN4RDsmI3hBOyYjeEQ7JiN4QTt1cmkgICAgICAgICAgICAgYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWImI3hEOyYjeEE7JiN4RDsmI3hBO3ZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7dGFnICAgICAgICAgICAgIG9uZSBvciBtb3JlIHRhZ3MgaW4gdGhlIHRhZyBsaWJyYXJ5JiN4RDsmI3hBOyYjeEQ7JiN4QTt0YWctZmlsZSAgICAgICAgb25lIG9yIG1vcmUgdGFnIGZpbGVzIGluIHRoZSB0YWcgbGlicmFyeSYjeEQ7JiN4QTsmI3hEOyYjeEE7ZnVuY3Rpb24gICAgICAgIHplcm8gb3IgbW9yZSBFTCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzJiN4RDsmI3hBOyAgICAgICAgICAgICAgICB0YWcgbGlicmFyeSYjeEQ7JiN4QTsmI3hEOyYjeEE7dGFnbGliLWV4dGVuc2lvbiB6ZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEmI3hEOyYjeEE7JiN4OTsmI3g5O2luZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnbGliLCBmb3IgdG9vbCYjeEQ7JiN4QTsmI3g5OyYjeDk7Y29uc3VtcHRpb24iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnTGliVmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGlzIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0YWcgbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkuJiN4RDsmI3hBO0ByZWdleHAgWzAtOV0qeyAmcXVvdDsuJnF1b3Q7WzAtOV0gfTAuLjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ianNwVmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWcgbGlicmFyeSByZXF1aXJlcyBpbiBvcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMiYjeEQ7JiN4QTtAcmVnZXhwIFswLTldKnsgJnF1b3Q7LiZxdW90O1swLTldIH0wLi4zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNob3J0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgc2hvcnQtbmFtZSBlbGVtZW50IGlzIGEgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSB1cmkgZWxlbWVudCBpcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBleGFjdCBzZW1hbnRpY3Mgb2YgdGhpcyB0YWdsaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdzIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFRhZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRhdG9yIiBlVHlwZT0iIy8vVmFsaWRhdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlzdGVuZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9MaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZnVuY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Z1bmN0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnbGliRXh0ZW5zaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFRhZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWcgZWxlbWVudCBkZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5LiBUaGUgdGFnIGVsZW1lbnQgaGFzIG9uZSBhdHRyaWJ1dGUsIGlkLiYjeEQ7JiN4QTtUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzomI3hEOyYjeEE7bmFtZSAtLSBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lJiN4RDsmI3hBO3RhZy1jbGFzcyAtLSBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcmI3hEOyYjeEE7dGVpLWNsYXNzIC0tIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8mI3hEOyYjeEE7Ym9keS1jb250ZW50IC0tIFRoZSBib2R5IGNvbnRlbnQgdHlwZSYjeEQ7JiN4QTtkaXNwbGF5LW5hbWUgLS0gQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzJiN4RDsmI3hBO3NtYWxsLWljb24gLS0gT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzJiN4RDsmI3hBO2xhcmdlLWljb24gLS0gT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzJiN4RDsmI3hBO2Rlc2NyaXB0aW9uIC0tIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbiYjeEQ7JiN4QTt2YXJpYWJsZSAtLSBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24mI3hEOyYjeEE7YXR0cmlidXRlIC0tIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uJiN4RDsmI3hBO2V4YW1wbGUgLS0gT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGFjdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHlDb250ZW50IiBlVHlwZT0iIy8vQm9keUNvbnRlbnRUeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkgaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLlRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDomI3hEOyYjeEE7JiN4RDsmI3hBO3RhZ2RlcGVuZGVudCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZyBpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhJiN4OTsmI3g5O2RpZmZlcmVudCAmcXVvdDtsYW5nYWdlJnF1b3Q7LCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtKU1AgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4JiN4RDsmI3hBOyYjeEQ7JiN4QTtlbXB0eSAtIFRoZSBib2R5IG11c3QgYmUgZW1wdHlUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUCNQQ0RBVEEgOjo9ICB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4YW1wbGUgZWxlbWVudCBwcm92aWRlcyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHluYW1pY0F0dHJpYnV0ZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSlNQVGFnQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSlNQVmFyaWFibGUiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhYmxlIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4mI3hEOyYjeEE7SXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGFuIGFjdGlvbiB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4mI3hEOyYjeEE7VGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybTomI3hEOyYjeEE7bmFtZS1naXZlbiAtLSBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50JiN4RDsmI3hBO25hbWUtZnJvbS1hdHRyaWJ1dGUgLS0gVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuJiN4RDsmI3hBO3ZhcmlhYmxlLWNsYXNzIC0tIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4gamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LiYjeEQ7JiN4QTtkZWNsYXJlIC0tIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG9yIG5vdC4gVHJ1ZSBpcyB0aGUgZGVmYXVsdC4mI3hEOyYjeEE7c2NvcGUgLS0gVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4gTkVTVEVEIGlzIGRlZmF1bHQuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWctY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gVGhpcyBlbGVtZW50IGlzIHJlcXVpcmVkLiYjeEQ7JiN4QTtAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlaUNsYXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRlaS1jbGFzcyBlbGVtZW50IGluZGljYXRlcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IgdGhpcyB0YWcuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4gVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsLiYjeEQ7JiN4QTtAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSlNQVGFnQXR0cmlidXRlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkIChyZXF1aXJlZCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJydEV4cHJWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb250aW1lLiAob3B0aW9uYWwpJiN4RDsmI3hBO0RlZmF1bHQgPSBmYWxzZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcmFnbWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHR5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4mI3hEOyYjeEE7Rm9yIHN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzIGphdmEubGFuZy5TdHJpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkJvZHlDb250ZW50VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCwgYWRkZWQgVEFHREVQRU5ERU5ULEVNUFRZLHNjcmlwdGxlc3MsU0NSSVBUTEVTUyYjeEQ7JiN4QTtQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuJiN4RDsmI3hBO1ByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDomI3hEOyYjeEE7JiN4RDsmI3hBO3RhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5JiN4RDsmI3hBOyAgICAgICAgICAgICAgICBpbiBhIGRpZmZlcmVudCAmcXVvdDtsYW5nYWdlJnF1b3Q7LCBlLmcgZW1iZWRkZWQgU1FMJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgc3ludGF4LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkmI3hEOyYjeEE7JiN4RDsmI3hBO3NjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIEV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuJiN4RDsmI3hBO0pTUD0wJiN4RDsmI3hBO2VtcHR5PTEmI3hEOyYjeEE7dGFnZGVwZW5kZW50PTImI3hEOyYjeEE7VEFHREVQRU5ERU5UPTMmI3hEOyYjeEE7RU1QVFk9NCYjeEQ7JiN4QTtzY3JpcHRsZXNzPTUmI3hEOyYjeEE7U0NSSVBUTEVTUz02Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0YWdkZXBlbmRlbnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkpTUCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVtcHR5IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic2NyaXB0bGVzcyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsaWRhdG9yIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRhdG9yQ2xhc3MiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJkZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlJiN4RDsmI3hBO3VzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BWYXJpYWJsZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZUdpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUtZ2l2ZW4gZWxlbWVudCBwcm92aWRlcyB0aGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO09uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVGcm9tQXR0cmlidXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWNsYXJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgZGVjbGFyZSBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZCBvciBub3QuIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuJiN4RDsmI3hBO1RoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIGRlZmF1bHQgaXMgdHJ1ZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJsZUNsYXNzIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTkVTVEVEPTAmI3hEOyYjeEE7QVRfQkVHSU49MSYjeEQ7JiN4QTtBVF9FTkQ9MiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTkVTVEVEIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBVF9CRUdJTiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFUX0VORCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRnVuY3Rpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoJiN4RDsmI3hBO2Z1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzomI3hEOyYjeEE7JiN4RDsmI3hBO2Rlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ5IHRvb2xzJiN4RDsmI3hBOyYjeEQ7JiN4QTtpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgYnkgdG9vbHMmI3hEOyYjeEE7JiN4RDsmI3hBO25hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24mI3hEOyYjeEE7JiN4RDsmI3hBO2Z1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpZ25hdHVyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhIExhbmd1YWdlJiN4RDsmI3hBOyAgICAgICAgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIHN0YXRpYyBKYXZhIG1ldGhvZCB0aGF0IGlzJiN4RDsmI3hBOyAgICAgICAgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmdW5jdGlvbkNsYXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhJiN4RDsmI3hBOyAgICAgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVuY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZ1bmN0aW9uRXh0ZW5zaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhZ0ZpbGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO0RlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZCYjeEQ7JiN4QTthcyBhIC50YWcgZmlsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6JiN4RDsmI3hBOyYjeEQ7JiN4QTtuYW1lICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUmI3hEOyYjeEE7JiN4RDsmI3hBO3BhdGggICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzJiN4RDsmI3hBOyAgICAgICAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIG9yJiN4RDsmI3hBOyYjeDk7dGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluJiN4RDsmI3hBOyYjeDk7YSBKQVIuICBUaGlzIG11c3QgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZSAudGFnJiN4RDsmI3hBOyYjeDk7ZmlsZSByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZSAudGFnJiN4RDsmI3hBOyYjeDk7ZmlsZSByZXNpZGVzIGluIGEgSkFSLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdFeHRlbnNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RsZEV4dGVuc2lvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGxkRXh0ZW5zaW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5zaW9uRWxlbWVudHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXh0ZW5zaWJsZVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYmFwcGxpY2F0aW9uLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYmFwcGxpY2F0aW9uLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q2MGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJhcHBsaWNhdGlvbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3ZWJhcHBsaWNhdGlvbiIKLSAgICBuc1VSST0id2ViYXBwbGljYXRpb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYkFwcCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3ImI3hEOyYjeEE7YSB3ZWIgYXBwbGljYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3RyaWJ1dGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpc3RyaWJ1dGFibGUgZWxlbWVudCwgYnkgaXRzIHByZXNlbmNlIGluIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0IGNvbnRhaW5lciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRleHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRleHRQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQ29udGV4dFBhcmFtL3dlYkFwcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIHNlZSBjb250ZXh0UGFyYW1zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVycm9yUGFnZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXJyb3JQYWdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FcnJvclBhZ2Uvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbGVMaXN0IiBlVHlwZT0iIy8vV2VsY29tZUZpbGVMaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWxjb21lRmlsZUxpc3Qvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhZ0xpYnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGFnTGliUmVmIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UYWdMaWJSZWYvd2ViQXBwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25zdHJhaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN1cml0eUNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC93ZWJBcHAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9naW5Db25maWciIGVUeXBlPSIjLy9Mb2dpbkNvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTG9naW5Db25maWcvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1pbWVNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NaW1lTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWltZU1hcHBpbmcvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlc3Npb25Db25maWciIGVUeXBlPSIjLy9TZXNzaW9uQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZXNzaW9uQ29uZmlnL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0TWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VydmxldE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlcnZsZXRNYXBwaW5nL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2bGV0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZXJ2bGV0L3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbHRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmlsdGVyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXJNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWx0ZXJNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaXN0ZW5lcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0xpc3RlbmVyIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0ZW5lcnMgY29sbGVjdGlvbiBjb250YWlucyBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW5zIGluIHRoZSB3ZWIgYXBwLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZXh0UGFyYW1zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqc3BDb25maWciIGVUeXBlPSJlY29yZTpFQ2xhc3MganNwLmVjb3JlIy8vSlNQQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIKLSAgICAgICAgZVR5cGU9IiMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGV4dFBhcmFtIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCYjeEQ7JiN4QTtUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCYjeEQ7JiN4QTtUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9jb250ZXh0cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2bGV0IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYSBzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmxldE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBzZXJ2bGV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2FkT25TdGFydHVwIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50ZWdlck9iamVjdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UgZWxlbWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIgaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCBpdCBhdCBhbnkgdGltZSBpbiB0aGUgc3RhcnR1cCBzZXF1ZW5jZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9zZXJ2bGV0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV2ViVHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgaW5pdFBhcmFtcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVJvbGVSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJ1bkFzIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgZGVmaW5lZCBmb3IgYSBzZXJ2bGV0LCBvdmVycmlkZXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHVzZWQgdG8gY2FsbCBhbiBFSkIgYnkgdGhhdCBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgcm9sZS1uYW1lIGlzIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmxldE1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVybFBhdHRlcm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUmI3hEOyYjeEE7c2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViJiN4RDsmI3hBO2FwcGxpY2F0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvc2VydmxldE1hcHBpbmdzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZsZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2bGV0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlc3Npb25Db25maWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2Vzc2lvblRpbWVvdXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCYjeEQ7JiN4QTsgICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQmI3hEOyYjeEE7ICAgICAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0JiN4RDsmI3hBOyAgICAgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4mI3hEOyYjeEE7ICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lJiN4RDsmI3hBOyAgICAgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciYjeEQ7JiN4QTsgICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvc2Vzc2lvbkNvbmZpZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaW1lTWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24gYW5kIGEgbWltZSB0eXBlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZW5zaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gZXh0ZW5zaW9uLiBleGFtcGxlOiAmcXVvdDt0eHQmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWltZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZTogJnF1b3Q7dGV4dC9wbGFpbiZxdW90OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvbWltZU1hcHBpbmdzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlbGNvbWVGaWxlTGlzdCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9maWxlTGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dlbGNvbWVGaWxlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWxjb21lRmlsZS9maWxlTGlzdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFcnJvclBhZ2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvZXJyb3JQYWdlcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdMaWJSZWYiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGpzcDo6VGFnTGliUmVmJiN4RDsmI3hBO1RoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYi54bWwgZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJMb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIFNlZSBqc3A6OlRhZ0xpYlJlZiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL3RhZ0xpYnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkgY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzcGxheU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGlzcGxheU5hbWVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9jb25zdHJhaW50cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dlYlJlc291cmNlQ29sbGVjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL3NlY0NvbnN0cmFpbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXV0aENvbnN0cmFpbnQiIGVUeXBlPSIjLy9BdXRoQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXV0aENvbnN0cmFpbnQvc2VjQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ1c2VyRGF0YUNvbnN0cmFpbnQiIGVUeXBlPSIjLy9Vc2VyRGF0YUNvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1VzZXJEYXRhQ29uc3RyYWludC9zZWNDb25zdHJhaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc3BsYXlOYW1lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYlJlc291cmNlQ29sbGVjdGlvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWJSZXNvdXJjZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh0dHBNZXRob2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSFRUUE1ldGhvZFR5cGVFbnVtIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNDb25zdHJhaW50IiBlVHlwZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50L3dlYlJlc291cmNlQ29sbGVjdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVVJMcyIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9VUkxQYXR0ZXJuVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVVJMUGF0dGVyblR5cGUvcmVzQ29sbGVjdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyB1cmxQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJIVFRQcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9IVFRQTWV0aG9kVHlwZSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgaHR0cE1ldGhvZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdXRoQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCYjeEQ7JiN4QTtzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlJiN4RDsmI3hBO2NvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQmI3hEOyYjeEE7dG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMmI3hEOyYjeEE7ZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkmI3hEOyYjeEE7cmVzZXJ2ZWQgcm9sZS1uYW1lICZxdW90OyomcXVvdDsgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvciYjeEQ7JiN4QTtpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICZxdW90OyomcXVvdDsmI3hEOyYjeEE7YW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbCYjeEQ7JiN4QTtyb2xlcy4gIElmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzJiN4RDsmI3hBO3RvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZSYjeEQ7JiN4QTtjb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMmI3hEOyYjeEE7cm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcgYWNjZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7QSBkZXNjcmlwdGlvbiBvZiB0aGUgYXV0aCBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGxpc3Qgb2Ygcm9sZSBuYW1lcyBmb3IgdGhlIGF1dGggY29uc3RyYWludC4gIEVhY2ggZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlIChhIFN0cmluZykuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNDb25zdHJhaW50IiBlVHlwZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50L2F1dGhDb25zdHJhaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVc2VyRGF0YUNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7QSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVzZXIgZGF0YSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc3BvcnRHdWFyYW50ZWUiIGVUeXBlPSIjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IgQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55JiN4RDsmI3hBO3RyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yIENPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjQ29uc3RyYWludCIgZVR5cGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC91c2VyRGF0YUNvbnN0cmFpbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvZ2luQ29uZmlnIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4mI3hEOyYjeEE7bWVjaGFuaXNtLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoTWV0aG9kIiBlVHlwZT0iIy8vQXV0aE1ldGhvZEtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40ICBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbVZhbHVlcyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgJnF1b3Q7QkFTSUMmcXVvdDssICZxdW90O0RJR0VTVCZxdW90OywgJnF1b3Q7Rk9STSZxdW90Oywgb3IgJnF1b3Q7Q0xJRU5ULUNFUlQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWxtTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yaXphdGlvbk1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL2xvZ2luQ29uZmlnIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZvcm1Mb2dpbkNvbmZpZyIgZVR5cGU9IiMvL0Zvcm1Mb2dpbkNvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRm9ybUxvZ2luQ29uZmlnL2xvZ2luQ29uZmlnIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZvcm1Mb2dpbkNvbmZpZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmb3JtTG9naW5QYWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmb3JtRXJyb3JQYWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvZ2luQ29uZmlnIiBlVHlwZT0iIy8vTG9naW5Db25maWciCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Mb2dpbkNvbmZpZy9mb3JtTG9naW5Db25maWciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5pdFBhcmFtIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCYjeEQ7JiN4QTtUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc0F1dGhTZXJ2bGV0VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ09OVEFJTkVSPTAmI3hEOyYjeEE7U0VSVkxFVD0xJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09OVEFJTkVSIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTRVJWTEVUIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmxldFR5cGUiIGVTdXBlclR5cGVzPSIjLy9XZWJUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFR5cGUiIGVTdXBlclR5cGVzPSIjLy9XZWJUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ianNwRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVSTFBhdHRlcm5UeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmxQYXR0ZXJuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc0NvbGxlY3Rpb24iIGVUeXBlPSIjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vVVJMcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkhUVFBNZXRob2RUeXBlRW51bSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJHRVQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUE9TVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBVVCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRFTEVURSIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkhFQUQiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPUFRJT05TIiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVFJBQ0UiIHZhbHVlPSI2Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVOYW1lVHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2VsY29tZUZpbGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWxjb21lRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlTGlzdCIgZVR5cGU9IiMvL1dlbGNvbWVGaWxlTGlzdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlbGNvbWVGaWxlTGlzdC9maWxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHJhbnNwb3J0R3VhcmFudGVlVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTk9ORT0xJiN4RDsmI3hBO0lOVEVHUkFMPTImI3hEOyYjeEE7Q09ORklERU5USUFMPTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVEVHUkFMIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09ORklERU5USUFMIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIiBlU3VwZXJUeXBlcz0iIy8vRXJyb3JQYWdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjZXB0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXJyb3JDb2RlRXJyb3JQYWdlIiBlU3VwZXJUeXBlcz0iIy8vRXJyb3JQYWdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXJyb3JDb2RlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWx0ZXJNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwgYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEgc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlIGZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSAmbHQ7ZmlsdGVybmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgJmx0O2ZpbHRlcj4gZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgRmlsdGVyOjpuYW1lIG9mIG9uZSBvZiB0aGUgRmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwYXRjaGVyVHlwZSIgdXBwZXJCb3VuZD0iNCIKLSAgICAgICAgZVR5cGU9IiMvL0Rpc3BhdGNoZXJUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbHRlciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpbHRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWx0ZXIgYmVpbmcgbWFwcGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZsZXQiIGVUeXBlPSIjLy9TZXJ2bGV0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3B0aW9uYWwgc2VydmxldCB0aGF0IGlzIG1hcHBlZCBieSBhIGZpbHRlciBtYXBwaW5nLiAgc2VydmxldE5hbWUgaXMgdXNlZCB0byByZXNvbHZlIHRoZSBzZXJ2bGV0IHJlZmVyZW5jZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmlsdGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlIGZpbHRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbVZhbHVlcyYjeEQ7JiN4QTtUaGUgaW5pdC1wYXJhbXMgY29udGFpbiBhIG5hbWUvdmFsdWUgcGFpcnMgYXMgaW5pdGlhbGl6YXRpb24gcGFyYW1zIGZvciB0aGUgZmlsdGVyJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXJDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbVZhbHVlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMmI3hEOyYjeEE7ICAgICAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRGlzcGF0Y2hlclR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRk9SV0FSRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5DTFVERSIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFUVVFU1QiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJFUlJPUiIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2NhbEVuY29kaW5nTWFwcGluZ3MiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTG9jYWxFbmNvZGluZ01hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUE1ldGhvZFR5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh0dHBNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJBdXRoTWV0aG9kS2luZCI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJVTlNQRUNJRklFRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQkFTSUMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJESUdFU1QiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJGT1JNIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0xJRU5UX0NFUlQiIHZhbHVlPSI0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJzZXJ2aWNlLWoyZWUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2Vic2VydmljZS1qMmVlLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNjM2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJzZXJ2aWNlLWoyZWUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIG1vZGVsTmFtZT0iV2Vic2VydmljZS1qMmVlIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIKLSAgICB1c2VkR2VuUGFja2FnZXM9ImoyZWUuZ2VubW9kZWwjLy9jbGllbnQgajJlZS5nZW5tb2RlbCMvL2FwcGxpY2F0aW9uIGoyZWUuZ2VubW9kZWwjLy9jb21tb24gajJlZS5nZW5tb2RlbCMvL2VqYiBqMmVlLmdlbm1vZGVsIy8vd2ViYXBwbGljYXRpb24gajJlZS5nZW5tb2RlbCMvL3dzY2xpZW50IGoyZWUuZ2VubW9kZWwjLy9qc3AgajJlZS5nZW5tb2RlbCMvL3dzY29tbW9uIGoyZWUuZ2VubW9kZWwjLy93c2RkIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2Vcd2Vic2VydmljZS1qMmVlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+RDpcd29ya1xNNTwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKYXhycGNtYXAiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJqYXhycGNtYXAuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhV1NETE1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL3BhY2thZ2VNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhV1NETE1hcHBpbmcvamF2YVhNTFR5cGVNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhV1NETE1hcHBpbmcvZXhjZXB0aW9uTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2ludGVyZmFjZU1hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1BhY2thZ2VNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9QYWNrYWdlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BhY2thZ2VNYXBwaW5nL3BhY2thZ2VUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUGFja2FnZU1hcHBpbmcvbmFtZXNwYWNlVVJJIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL2NsYXNzVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9xbmFtZVNjb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL2Fub255bW91c1R5cGVRbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmcvcm9vdFR5cGVRbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmcvdmFyaWFibGVNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9FeGNlcHRpb25NYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9FeGNlcHRpb25NYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZy9leGNlcHRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZy93c2RsTWVzc2FnZVBhcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvd3NkbE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZy9jb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nL3NlcnZpY2VJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUludGVyZmFjZU1hcHBpbmcvd3NkbFNlcnZpY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nL3BvcnRNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy93c2RsUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy93c2RsQmluZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nL3NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1Jvb3RUeXBlUW5hbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy9qYXZhVmFyaWFibGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nL3htbEVsZW1lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nL2RhdGFNZW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcveG1sQXR0cmlidXRlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy94bWxXaWxkY2FyZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci9lbGVtZW50TmFtZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vRWxlbWVudE5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0VsZW1lbnROYW1lL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vRWxlbWVudE5hbWUvdGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMU2VydmljZU5hbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9Qb3J0TWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUG9ydE1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9Qb3J0TWFwcGluZy9wb3J0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BvcnRNYXBwaW5nL2phdmFQb3J0TmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMUG9ydFR5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMQmluZGluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nL2phdmFNZXRob2ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy93c2RsT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy93cmFwcGVkRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nL21ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nL3dzZGxSZXR1cm5WYWx1ZU1hcHBpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETE9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE9wZXJhdGlvbi9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExPcGVyYXRpb24vd3NkbE9wZXJhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZy9wYXJhbVBvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcvcGFyYW1UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nL3dzZGxNZXNzYWdlTWFwcGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZy9tZXRob2RSZXR1cm5WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcvd3NkbE1lc3NhZ2VQYXJ0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nL3dzZGxNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VNYXBwaW5nL3dzZGxNZXNzYWdlUGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmcvcGFyYW1ldGVyTW9kZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy9zb2FwSGVhZGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy93c2RsTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZVBhcnROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZVBhcnROYW1lL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VQYXJ0TmFtZS93c2RsTWVzc2FnZVBhcnROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0ludGVyZmFjZU1hcHBpbmciLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3NjbGllbnQuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3NjbGllbnQuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjdmODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY2xpZW50LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9IndzY2xpZW50IgotICAgIG5zVVJJPSJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50Ij4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlUmVmIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViJiN4RDsmI3hBOyAgICBzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZCYjeEQ7JiN4QTsgICAgaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLCYjeEQ7JiN4QTsgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0JiN4RDsmI3hBOyAgICBvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwmI3hEOyYjeEE7ICAgIGFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQmI3hEOyYjeEE7ICAgIGJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VJbnRlcmZhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzJiN4RDsmI3hBOyAgICAgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uJiN4RDsmI3hBOyAgICAgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMmI3hEOyYjeEE7ICAgICAgICBnZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgY2xhc3MgbWF5IGFsc28gYmUgc3BlY2lmaWVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlUmVmTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlJiN4RDsmI3hBOyAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQmI3hEOyYjeEE7ICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoJiN4RDsmI3hBOyAgICAgICAgJnF1b3Q7c2VydmljZS8mcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETCBmaWxlLiBUaGUmI3hEOyYjeEE7ICAgICAgICBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXhycGNNYXBwaW5nRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQmI3hEOyYjeEE7ICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5JiN4RDsmI3hBOyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlJiN4RDsmI3hBOyAgICAgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3J0Q29tcG9uZW50UmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0Q29tcG9uZW50UmVmIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5JiN4RDsmI3hBOyAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UmI3hEOyYjeEE7ICAgICAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50JiN4RDsmI3hBOyAgICAgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZCYjeEQ7JiN4QTsgICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlJiN4RDsmI3hBOyAgICAgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmJiN4RDsmI3hBOyAgICAgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCYjeEQ7JiN4QTsgICAgICAgIHdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlUW5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnRDb21wb25lbnRSZWYiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kmI3hEOyYjeEE7ICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlJiN4RDsmI3hBOyAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50JiN4RDsmI3hBOyAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkJiN4RDsmI3hBOyAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnRDb21wb25lbnRMaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZiB0byBhJiN4RDsmI3hBOyAgICAgICAgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUgYnkgYSBzZXJ2aWNlJiN4RDsmI3hBOyAgICAgICAgcmVmZXJlbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlIHBvcnQtY29tcG9uZW50LW5hbWUmI3hEOyYjeEE7ICAgICAgICBvZiBhIHBvcnQtY29tcG9uZW50IGluIHRoZSBzYW1lIG1vZHVsZSBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZSYjeEQ7JiN4QTsgICAgICAgIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXggZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4JiN4RDsmI3hBOyAgICAgICAgZGVmaW5lZCBmb3IgZWpiLWxpbmsgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCYjeEQ7JiN4QTsgICAgICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhJiN4RDsmI3hBOyAgICAgICAgV1NETCBwb3J0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIYW5kbGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSYjeEQ7JiN4QTsgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmJiN4RDsmI3hBOyAgICBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkJiN4RDsmI3hBOyAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBVc2VkIGluOiBzZXJ2aWNlLXJlZiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGVyTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbW9kdWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwUm9sZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoYW5kbGVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0UGFyYW1zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb2FwSGVhZGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYlNlcnZpY2VzQ2xpZW50IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRTY29wZWRSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbXBvbmVudFNjb3BlZFJlZnMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvbmVudFNjb3BlZFJlZnMiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBvbmVudE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZVJlZnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VydmljZVJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY29tbW9uLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY29tbW9uLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2UxNzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NvbW1vbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9IndzY29tbW9uIgotICAgIG5zVVJJPSJ3c2NvbW1vbi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbml0UGFyYW0iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9uVHlwZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb25UeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlci4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBSb2xlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwUm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0TmFtZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRpb25UeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNwbGF5TmFtZVR5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZSIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzZGQuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDAwZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzZGQuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0id3NkZCIKLSAgICBuc1VSST0id3NkZC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYlNlcnZpY2VzIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2YgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEoyRUUgQXBwbGljYXRpb24gU2VydmVyIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYlNlcnZpY2VEZXNjcmlwdGlvbnMiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV2ViU2VydmljZURlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0FsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGRlZmluZWQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3ZWJzZXJ2aWNlcyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF4cnBjTWFwcGluZ0ZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbEZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlIG1vZHVsZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzbWFsbEljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFyZ2VJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvcnRDb21wb25lbnRzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvcnRDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzcGxheU5hbWVUeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWVUeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpY29uVHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9JY29uVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydENvbXBvbmVudCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSBXZWIgc2VydmljZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydENvbXBvbmVudE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MgbmFtZS4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzbWFsbEljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFyZ2VJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxQb3J0IiBlVHlwZT0iIy8vV1NETFBvcnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VJbXBsQmVhbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZpY2VJbXBsQmVhbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNwbGF5TmFtZVR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZVR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imljb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsU2VydmljZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExTZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmFibGVNdG9tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm90b2NvbEJpbmRpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlckNoYWlucyIgZVR5cGU9IiMvL0hhbmRsZXJzQ2hhaW5zIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMUG9ydCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZpY2VJbXBsQmVhbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi5BIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViIGNvbXBvbmVudC4gRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIFdlYiBzZXJ2aWNlIHVzaW5nIGFuIGVqYi1saW5rLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcG9ydC1jb21wb25lbnQmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVFSkJMaW5rIiBlVHlwZT0iIy8vRUpCTGluayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVNlcnZsZXRMaW5rIiBlVHlwZT0iIy8vU2VydmxldExpbmsiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJlYW5MaW5rIiBlVHlwZT0iIy8vQmVhbkxpbmsiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZsZXRMaW5rIiBlU3VwZXJUeXBlcz0iIy8vQmVhbkxpbmsiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmxldExpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCTGluayIgZVN1cGVyVHlwZXM9IiMvL0JlYW5MaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlczomI3hEOyYjeEE7Jmx0O2VqYi1saW5rPkVtcGxveWVlUmVjb3JkJmx0Oy9lamItbGluaz4mI3hEOyYjeEE7JiN4OTsmbHQ7ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQiZsdDsvZWpiLWxpbms+JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlamJMaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhhbmRsZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcG9ydC1jb21wb25lbnQmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZXJOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZXJDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0UGFyYW1zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL0luaXRQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic29hcEhlYWRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vU09BUEhlYWRlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic29hcFJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL1NPQVBSb2xlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCZWFuTGluayIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFNlcnZpY2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIYW5kbGVyQ2hhaW4iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcG9ydC1jb21wb25lbnQmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZpY2VOYW1lUGF0dGVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZVBhdHRlcm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdG9jb2xCaW5kaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlcnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSGFuZGxlcnNDaGFpbnMiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIFdlYiBTZXJ2aWNlIEVuZHBvaW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZXM6JiN4RDsmI3hBOyZsdDtlamItbGluaz5FbXBsb3llZVJlY29yZCZsdDsvZWpiLWxpbms+JiN4RDsmI3hBOyYjeDk7Jmx0O2VqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkImbHQ7L2VqYi1saW5rPiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlckNoYWluIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0hhbmRsZXJDaGFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvZWpiLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9lamIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyMmNiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9lamIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRWpiX3Byb3ZpZGVyX3BsdWdpbl9wcm9iPUVqYiBwcm92aWRlciBwbHVnaW4gc3RhcnR1cCAtIFByb2JsZW0gaW5pdGlhbGl6aW5nIHBsdWdpbgotRWpiZXh0X3Byb3ZpZGVyX3BsdWdpbl9wcm9iPUVqYmV4dCBwcm92aWRlciBwbHVnaW4gc3RhcnR1cCAtIFByb2JsZW0gaW5pdGlhbGl6aW5nIHBsdWdpbgotRUpCX1VJX1NUQVJUVVA9RUpCIFVJIFNUQVJUVVAKLUVKQl9QYXRoX189RUpCIFBhdGg6Ci1TaXplX189U2l6ZToKLUVkaXRfdGhlX2JlYW5fY2xhc3M9RWRpdCB0aGUgYmVhbiBjbGFzcwotRUpCX1RyZWU9RUpCIFRyZWUKLUVKQl9KYXJfQ29tcG9uZW50cz1FSkIgSkFSIENvbXBvbmVudHMKLUVKQl9Nb2RlbHM9RUpCIE1vZGVscwotRUpCX0ZlYXR1cmVzPUVKQiBGZWF0dXJlcwotRXhjZXB0aW9uX2xvYWRpbmdfcGx1Z2luPUV4Y2VwdGlvbiBsb2FkaW5nIHBsdWdpbgotQ3JlYXRlPUNyZWF0ZQotQ3JlYXRlX0F0dHJpYnV0ZS4uLj1DcmVhdGUgQXR0cmlidXRlLi4uCi1jcmVhdGVBdHRyaWJ1dGU9Y3JlYXRlQXR0cmlidXRlCi1FZGl0PUVkaXQKLUFkZF9Ub19LZXk9QWRkIFRvIEtleQotZGVsZXRlPWRlbGV0ZQotVW5rbm93bj1Vbmtub3duCi1SZW1vdmVfRnJvbV9LZXk9UmVtb3ZlIEZyb20gS2V5Ci1EZWxldGU9RGVsZXRlCi1EZWxldGVfQXR0cmlidXRlLi4uPURlbGV0ZSBBdHRyaWJ1dGUuLi4KLWFkZGl0aW9ucz1hZGRpdGlvbnMKLUNNRFNfQ2Fubm90X3JlZmxlY3RfSmF2YUNsYXNzX0VSUk9SXz1JV0FFMDA2OEUgQ2Fubm90IHJlZmxlY3QgSmF2YUNsYXNzIGJlY2F1c2UgaXRzIG5hbWUgaXMgbm90IHNldCBmb3IKLUNNRFNfQ0xBU1NfU0VUX0ZBSUxFRF9TVFJJTkdfRVJST1JfPUlXQUUwMDY5RSBUaGUgSmF2YSB0eXBlIG5hbWVkIHswfSBjb3VsZCBub3QgYmUgc2V0IGZvciB0aGUgezF9IGJlY2F1c2UgaXRzIEVKQiBpcyBudWxsLgotQ01EU19DYW5ub3RfcGVyZm9ybV9JTkZPXz1JV0FFMDA3MEkgQ2Fubm90IHBlcmZvcm0gdGhlIGNvbW1hbmQgcmVxdWVzdCBiZWNhdXNlIHRoZSBFSkIgaXMgbnVsbCBmb3IgdGhlIGNvbW1hbmQ6Ci1DTURTX0Nhbm5vdF9hZGRfdGhlX2ZlYXRfSU5GT189SVdBRTAwNzFJIENhbm5vdCBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIGtleSBiZWNhdXNlIHRoZSBmZWF0dXJlIGlzIG51bGwgZm9yIHRoZSBjb21tYW5kOgotQ01EU19DYW5ub3RfcmVtb3ZlX3RoZV9JTkZPXz1JV0FFMDA3MkkgQ2Fubm90IHJlbW92ZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBrZXkgYmVjYXVzZSB0aGUgZmVhdHVyZSBpcyBudWxsIGZvciB0aGUgY29tbWFuZDoKLUNNRFNfSW5pdGlhbGl6aW5nX1VJXz1Jbml0aWFsaXppbmcuLi4KLUNNRFNfR2VuZXJhdGluZ19VSV89R2VuZXJhdGluZy4uLgotQ01EU19GaW5pc2hpbmdfVUlfPUZpbmlzaGluZy4uLgotQ01EU19BbmFseXppbmdfVUlfPUFuYWx5emluZy4uLgotQ01EU19DYW5jZWxsZWRfV0FSTklOR189Q2FuY2VsbGVkCi1DTURTX011bHRpcGxlX0VudGVycHJpc2VCZWFuX1VwX0lORk9fPUlXQUUwMDczSSBNdWx0aXBsZSBFbnRlcnByaXNlQmVhbiBVcGRhdGVzCi1DTURTX0NSRUFUSU5HX1RBU0tfVUlfPUNyZWF0aW5nIGJlYW4gbmFtZWQgInswfSIKLUNNRFNfVVBEQVRJTkdfVEFTS19VSV89VXBkYXRpbmcgYmVhbiBuYW1lZCAiezB9IgotQ01EU19ERUxFVElOR19UQVNLX1VJXz1EZWxldGluZyBiZWFuIG5hbWVkICJ7MH0iCi1DTURTX1VwZGF0aW5nX01ldGFkYXRhLi4uX1VJXz0tLSBVcGRhdGluZyBNZXRhZGF0YS4uLgotVXBkYXRpbmc9VXBkYXRpbmcKLU5ld19rZXlfYXR0cmlidXRlX2FkZGVkX3dpPU5ldyBrZXkgYXR0cmlidXRlIGFkZGVkIHdpdGhvdXQgYXR0cmlidXRlIGhlbHBlci4KLUVycm9yX2hhc19vY2N1cnJlZD1FcnJvciBoYXMgb2NjdXJyZWQKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvajJlZXBsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvajJlZXBsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTMxOTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWVwbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNvdWxkX25vdF9maW5kX3Jvb3Rfb2JqZWN0X0VSUk9SXz1JV0FFMDA3NEUgQ291bGQgbm90IGZpbmQgcm9vdCBvYmplY3QgaW4gcmVzb3VyY2U6IHswfQotQW5fZXJyb3Jfb2NjdXJyZWRfd2hpbGVfc2FfRVJST1JfPUlXQUUwMDc1RSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcuCi1DYW5ub3RfcnVuX0oyRUVVSVdvcmtpbmdDb19FUlJPUl89SVdBRTAwNzZFIENhbm5vdCBydW4gSjJFRVVJV29ya2luZ0NvcHlNYW5hZ2VyIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSBXb3Jrc3BhY2UgdHJlZSBpcyBsb2NrZWQuCi1VbmFibGVfdG9fc2F2ZV9yZWFkLW9ubHlfZl9FUlJPUl89SVdBRTAwNzdFIFVuYWJsZSB0byBzYXZlIHJlYWQtb25seSBmaWxlOiB7MH0KLVRoZV9mb2xsb3dpbmdfcmVzb3VyY2VzX25lX1VJXz1UaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIHNhdmVkIGJ1dCBhcmUgY3VycmVudGx5IHNoYXJlZCwgZG8geW91IHdhbnQgdG8gc2F2ZSBub3c/Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWV4bWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWV4bWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YTdiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVleG1sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXJhcl9kdGRfbm90X2ZvdW5kX0VYQ189SVdBRTAwNzhFIFJBUiBmaWxlIHN1cHBvcnQ6IERURCBmaWxlIG5vdCBmb3VuZDogezB9Ci1pb19leF9zYXZpbmdfRVhDXz1JV0FFMDA3OUUgSU9FeGNlcHRpb24gb2NjdXJyZWQgc2F2aW5nIHswfQotY291bGRfbm90X2NyZWF0ZV9maWxlX0VYQ189SVdBRTAwODBFIENvdWxkIG5vdCBjcmVhdGUgdGhlIGZpbGUgbmFtZWQgezB9Ci11bnN1cHBvcnRlZF9lbmNvZGluZ19FWENfPUlXQUUwMDgxRSB7MH0gaXMgbm90IGEgc3VwcG9ydGVkIGVuY29kaW5nIG9uIHRoaXMgcGxhdGZvcm0KLXVuc3VwcG9ydGVkX3R5cGVfRVhDXz1JV0FFMDA4MkUgVHlwZSBpcyB1bnJlY29nbml6ZWQgb3Igbm90IHlldCBzdXBwb3J0ZWQ6IFBVQkxJQ19JRD17MH0gU1lTVEVNX0lEPXsxfQotZHRkX25vdF9mb3VuZF9FWENfPUlXQUUwMDgzRSBDb3VsZCBub3QgcGFyc2UgeG1sIGJlY2F1c2UgdGhlIHJlc29sdmVkIHJlc291cmNlICJ7MH0iIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBjbGFzc3BhdGgKLW11c3RfYmVfYm9vbGVhbl9FWENfPUlXQUUwMDg0RSBFeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB7MH0uICBWYWx1ZSBtdXN0IGJlIGEgYm9vbGVhbjogU3RyaW5nIHZhbHVlID0gezF9Ci1tdXN0X2JlX2ludF9FWENfPUlXQUUwMDg1RSBFeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB7MH0uICBWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXI6IFN0cmluZyB2YWx1ZSA9IHsxfQotZW1wdHlfY29sbGVjdGlvbl9FWENfPUlXQUUwMDg2RSBFbXB0eSBjb2xsZWN0aW9uIGZvciB7MH0gaW4gezF9Ci1taXNzaW5nX3JlcV9maWVsZF9FWENfPUlXQUUwMDg3RSBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkIHswfSBpbiB7MX0KLUFuX0V4Y2VwdGlvbl9vY2N1cnJlZF93aGlsX0VYQ189SVdBRTAwODhFIEFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHhtbAotTm90X3N1cHBvcnRlZF9pbl90aGlzX3JlbGVfRVhDXz1JV0FFMDA4OUUgTm90IHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UKLVJBUl9maWxlX3N1cHBvcnRfX0lPX2V4Y2VwX0VYQ189SVdBRTAwOTBFIFJBUiBmaWxlIHN1cHBvcnQ6IElPIGV4Y2VwdGlvbiBpbiBjdXN0b20gRFREIHJlc29sdmVyLgotQW5fSU9fRXhjZXB0aW9uX29jY3VycmVkX3dfRVhDXz1JV0FFMDA5MUUgQW4gSU8gRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgeG1sCi1GYWlsdXJlX29jY3VycmVkX3JlYWRpbmdfeF9FWENfPUlXQUUwMDkyRSBGYWlsdXJlIG9jY3VycmVkIHJlYWRpbmcgeG1sOgotSW52YWxpZF92YWx1ZV9mb3JfX0VYQ189SVdBRTAwOTNFIEludmFsaWQgdmFsdWUgZm9yCi1WYWxpZF92YWx1ZXNfYXJlX19fRVhDXz1JV0FFMDA5NEUgVmFsaWQgdmFsdWVzIGFyZToKLUtleTE9Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL21vZmoyZWUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL21vZmoyZWUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmOTQwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlPVN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1FUlJPUj1FcnJvcjoKLVdBUk5JTkc9V2FybmluZzoKLUlORk89SW5mbzoKLURFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0c9TWlncmF0aW9uIHdhcyBjb21wbGV0ZWQgZm9yIHswfS4KLURFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgbm90IHJlcXVpcmVkIGZvciB7MH0uCi1ERUZBVUxUX05PVF9QT1NTSUJMRV9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgbm90IHBvc3NpYmxlIGZvciB7MH0uCi1ERUZBVUxUX0VSUk9SX1NUQVRVU19NU0c9SVdBRTAxMDBFIEVycm9yIG1pZ3JhdGluZyB7MH0uCi1SRU1PVkVEX0xPQ0FMX0NMSUVOVF9NU0c9UmVtb3ZlZCBsb2NhbCBjbGllbnQgdmlldyBmb3IgRUpCIHswfS4KLVJFTU9WRURfQUNDRVNTX0lOVEVOVFNfTVNHPVJlbW92ZWQgezB9IDEuMSBtZXRob2QgYWNjZXNzIGludGVudChzKSBmcm9tIENNUCBiZWFuIHsxfS4KLVJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0c9UmVtb3ZlZCB7MH0gMS4xIG1ldGhvZCBpc29sYXRpb24gbGV2ZWwocykgZnJvbSBDTVAgYmVhbiB7MX0uCi1DT05WRVJURURfRklOREVSX01TRz1Db252ZXJ0ZWQgZmluZGVyIGRlc2NyaXB0ZXIgZm9yIHswfSBpbiBDTVAgYmVhbiB7MX0uICBVc2UgdGhlIEVKQiBlZGl0b3IgdG8gdXBkYXRlIHRoZSBxdWVyeSBFSkIgUUwuCi1VTk5BTUVEX0VKQj08VW5uYW1lZCBDTVAgYmVhbj4KLUNPTlZFUlRFRF9RVUVSWV9ERVNDUklQVElPTj1Db252ZXJ0ZWQgZnJvbSBJQk0gdmVyc2lvbiAxLjEgZXh0ZW5zaW9ucy4KLU1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9KQVJfTVNHPU1pZ3JhdGVkIGRlZmF1bHQgRGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcgZm9yIEVKQiBKQVIgXCJ7MH1cIi4KLU1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0c9TWlncmF0ZWQgZGVmYXVsdCBEYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZyBmb3IgRUpCIEpBUi4KLUoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SPVVuYWJsZSB0byBnZXQgSmF2YSBFRSB2ZXJzaW9uIG9mIG9iamVjdCBiZWNhdXNlIGl0IGlzIG5vdCBjb250YWluZWQgYnkgYSBkb2N1bWVudC4KLUoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUj1VbmFibGUgdG8gZ2V0IEphdmEgRUUgdmVyc2lvbiBvZiByZWZlcmVuY2VkIG9iamVjdCBiZWNhdXNlIHRoZSBwcm94eSBjYW5ub3QgYmUgcmVzb2x2ZWQuICBDaGVjayB0aGUgaWRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuICBIUkVGID0gezB9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzI3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb24gZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0KLQotLyoqCi0gKiBAcGFyYW0gbmFtZSAtIFN0cmluZyByb2xlIG5hbWUKLSAqIEByZXR1cm4gaWYgY29udGFpbnMgdGhlIHJvbGUKLSAqLwotcHVibGljIGJvb2xlYW4gY29udGFpbnNTZWN1cml0eVJvbGUoU3RyaW5nIG5hbWUpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkgYW5kIGFsdERECi0gKiBAcGFyYW0gdXJpIC0gU3RyaW5nIGFVUkkKLSAqIEBwYXJhbSBhbHRERCAtIFN0cmluZyBhbHRERAotICogQHJldHVybiB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpIGFuZCBhbHRERAotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpLCBTdHJpbmcgYWx0REQpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICogQGRlcHJlY2F0ZWQgcHJlZmVyYWJseSB1c2Uge0BsaW5rICNnZXRNb2R1bGUoU3RyaW5nLCBTdHJpbmcpfSBvciB7QGxpbmsgI2dldEZpcnN0TW9kdWxlKFN0cmluZyl9Ci0gKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgbW9kdWxlcyB3aXRoIHRoZSBzYW1lIHVyaSBidXQgZGlmZmVyZW50IGFsdC1kZHMKLSAqCi0gKiBAcGFyYW0gdXJpIC0gU3RyaW5nIHVyaQotICogQHJldHVybiB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpCi0gKi8KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmkpOwotLyoqCi0gKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLSAqCi0gKiBAcmV0dXJuIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZAotICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSBXaGVuIHJlc291cmNlIGlzIHByb3h5Ci0gKi8KLQotcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0vKioKLSAqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICoKLSAqIEByZXR1cm4gcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gV2hlbiByZXNvdXJjZSBpcyBwcm94eQotICovCi1wdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICoKLSAqIEBwYXJhbSB1cmkgLSBTdHJpbmcgdXJpIHBhdGgKLSAqIEByZXR1cm4gdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICovCi1wdWJsaWMgTW9kdWxlIGdldEZpcnN0TW9kdWxlKFN0cmluZyB1cmkpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBtb2R1bGUgd2hlcmUgdGhlIGFsdCBkZCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdXJpCi0gKgotICogQHBhcmFtIHVyaSAtIFN0cmluZyB1cmkgcGF0aAotICogQHJldHVybiB0aGUgZmlyc3QgbW9kdWxlIHdoZXJlIHRoZSBhbHQgZGQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHVyaQotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZUhhdmluZ0FsdEREKFN0cmluZyB1cmkpOwotLyoqCi0gKiBAcGFyYW0gbmFtZSAtIFN0cmluZyByb2xlIG5hbWUKLSAqIEByZXR1cm4gc2VjdXJpdHkgcm9sZSB3aXRoIG5hbWUKLSAqLwotcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGNhdGlvbjEuMiBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICoKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uMS4zIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IAotCSAqIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVzIHJlZmVyZW5jZXMKLQkgKiBDb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2Ygc2VjdXJpdHkgcm9sZXMgd2hpY2ggYXJlCi0JICogZ2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gCi0JICovCi0KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1vZHVsZXMgcmVmZXJlbmNlcwotCSAqLwotCi0JRUxpc3QgZ2V0TW9kdWxlcygpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRmOGE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25GYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uIHZhbHVlCi0JICovCi0JQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTW9kdWxlIHZhbHVlCi0JICovCi0JTW9kdWxlIGNyZWF0ZU1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWJNb2R1bGUgdmFsdWUKLQkgKi8KLQlXZWJNb2R1bGUgY3JlYXRlV2ViTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGllbnRNb2R1bGUgdmFsdWUKLQkgKi8KLQlKYXZhQ2xpZW50TW9kdWxlIGNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRWpiTW9kdWxlIHZhbHVlCi0JICovCi0JRWpiTW9kdWxlIGNyZWF0ZUVqYk1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb25uZWN0b3JNb2R1bGUgdmFsdWUKLQkgKi8KLQlDb25uZWN0b3JNb2R1bGUgY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uUGFja2FnZSBnZXRBcHBsaWNhdGlvblBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNjlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT04gPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX01PRFVMRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfX1VSSSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfX0FMVF9ERCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfX0FQUExJQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfX1VSSSA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9fQUxUX0REID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX19BUFBMSUNBVElPTiA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlYiBNb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9GRUFUVVJFX0NPVU5UID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMSUVOVF9NT0RVTEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMSUVOVF9NT0RVTEVfX1VSSSA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFX19BTFRfREQgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xJRU5UX01PRFVMRV9fQVBQTElDQVRJT04gPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIENsaWVudCBNb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEUgPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfX0FMVF9ERCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9fQVBQTElDQVRJT04gPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FamIgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEUgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfX0FMVF9ERCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9fQVBQTElDQVRJT04gPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbm5lY3RvciBNb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9GRUFUVVJFX0NPVU5UID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiYXBwbGljYXRpb24ueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXBwbGljYXRpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1vZHVsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9VcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0FsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZV9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWJNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFdlYk1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJNb2R1bGVfQ29udGV4dFJvb3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUNsaWVudE1vZHVsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUNsaWVudE1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFamJNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVqYk1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb25uZWN0b3JNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19NT0RVTEVTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCA8ZW0+TW9kdWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldE1vZHVsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX1VSSSA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHQgREQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0FMVF9ERCA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfQWx0REQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1PRFVMRV9fQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYk1vZHVsZUltcGwgPGVtPldlYiBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYk1vZHVsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2ViTW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0V2ViTW9kdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFJvb3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfTU9EVUxFX19DT05URVhUX1JPT1QgPSBlSU5TVEFOQ0UuZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkphdmFDbGllbnRNb2R1bGVJbXBsIDxlbT5KYXZhIENsaWVudCBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkphdmFDbGllbnRNb2R1bGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEphdmFDbGllbnRNb2R1bGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9DTElFTlRfTU9EVUxFID0gZUlOU1RBTkNFLmdldEphdmFDbGllbnRNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRWpiTW9kdWxlSW1wbCA8ZW0+RWpiIE1vZHVsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRWpiTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRFamJNb2R1bGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX01PRFVMRSA9IGVJTlNUQU5DRS5nZXRFamJNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQ29ubmVjdG9yTW9kdWxlSW1wbCA8ZW0+Q29ubmVjdG9yIE1vZHVsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQ29ubmVjdG9yTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRDb25uZWN0b3JNb2R1bGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OTkVDVE9SX01PRFVMRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JNb2R1bGUoKTsKLQotCX0KLQotfSAvL0FwcGxpY2F0aW9uUGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2VhYmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotLyoqCi0gKiBUaGUgcmVwcmVzZW50cyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoZSBFQVIuCi0KLSAqIEBzaW5jZSAxLjAgKi8KLQotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvblJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UgewotCQotCSAgLyoqCi0JICAgKiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIAotCSAgICogQHNpbmNlIDEuMAotCSAgICogQHJldHVybiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoZSBFQVIsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAgICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Db25uZWN0b3JNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0Nvbm5lY3Rvck1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FiMjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0Nvbm5lY3Rvck1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JNb2R1bGUgZXh0ZW5kcyBNb2R1bGV7Ci0JLy9Db25uZWN0b3JNb2R1bGUKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9FamJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0VqYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFiYjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0VqYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGVqYi1qYXIsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVqYk1vZHVsZSBleHRlbmRzIE1vZHVsZXsKLQkvL0VqYk1vZHVsZQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0phdmFDbGllbnRNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0phdmFDbGllbnRNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZjA2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9KYXZhQ2xpZW50TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotCi0vKioKLSAqIHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ2xpZW50TW9kdWxlIGV4dGVuZHMgTW9kdWxlewotCS8vSmF2YUNsaWVudE1vZHVsZQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTEwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbiBvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBDb25uZWN0b3JNb2R1bGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rvck1vZHVsZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBpZiB0aGlzIE1vZHVsZSByZXByZXNlbnRzIGEgRWpiTW9kdWxlCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFamJNb2R1bGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgaWYgdGhpcyBNb2R1bGUgcmVwcmVzZW50cyBhIEphdmFDbGllbnRNb2R1bGUoQXBwbGljYXRpb25DbGllbnQpCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKYXZhTW9kdWxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBXZWJNb2R1bGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZSgpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0JICogcGFja2FnZS4KLQotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBbHRERCBhdHRyaWJ1dGUKLQkgKiBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mCi0JICogdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuIFRoZSBVUkkgbXVzdAotCSAqIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZQotCSAqIGFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdAotCSAqIHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgCi0JICogYnkgdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLQkgKi8KLQlTdHJpbmcgZ2V0QWx0REQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBbHRERCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEFsdEREKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBBcHBsaWNhdGlvbiByZWZlcmVuY2UKLQkgKi8KLQlBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFwcGxpY2F0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vV2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9XZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwNDAwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9XZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQ29udGFpbnMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYk1vZHVsZSBleHRlbmRzIE1vZHVsZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENvbnRleHRSb290IGF0dHJpYnV0ZQotCSAqIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbgotCi0JICovCi0JU3RyaW5nIGdldENvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29udGV4dFJvb3QgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1OTNjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25GYWN0b3J5IHsKLSAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbkZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uRmFjdG9yeSB0aGVBcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJhcHBsaWNhdGlvbi54bWkiKTsgCi0JCQlpZiAodGhlQXBwbGljYXRpb25GYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQXBwbGljYXRpb25GYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT046IHJldHVybiBjcmVhdGVBcHBsaWNhdGlvbigpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFOiByZXR1cm4gY3JlYXRlTW9kdWxlKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFOiByZXR1cm4gY3JlYXRlV2ViTW9kdWxlKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEU6IHJldHVybiBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFOiByZXR1cm4gY3JlYXRlRWpiTW9kdWxlKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFOiByZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChBcHBsaWNhdGlvbkZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCkgewotCQlBcHBsaWNhdGlvbkltcGwgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGNyZWF0ZU1vZHVsZSgpIHsKLQkJTW9kdWxlSW1wbCBtb2R1bGUgPSBuZXcgTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGUgY3JlYXRlV2ViTW9kdWxlKCkgewotCQlXZWJNb2R1bGVJbXBsIHdlYk1vZHVsZSA9IG5ldyBXZWJNb2R1bGVJbXBsKCk7Ci0JCXJldHVybiB3ZWJNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFDbGllbnRNb2R1bGUgY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpIHsKLQkJSmF2YUNsaWVudE1vZHVsZUltcGwgamF2YUNsaWVudE1vZHVsZSA9IG5ldyBKYXZhQ2xpZW50TW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gamF2YUNsaWVudE1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRWpiTW9kdWxlIGNyZWF0ZUVqYk1vZHVsZSgpIHsKLQkJRWpiTW9kdWxlSW1wbCBlamJNb2R1bGUgPSBuZXcgRWpiTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gZWpiTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGUgY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCkgewotCQlDb25uZWN0b3JNb2R1bGVJbXBsIGNvbm5lY3Rvck1vZHVsZSA9IG5ldyBDb25uZWN0b3JNb2R1bGVJbXBsKCk7Ci0JCXJldHVybiBjb25uZWN0b3JNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uUGFja2FnZSBnZXRBcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiNmVlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5TdHJpbmdVdGlsOwotCi0KLS8qKgotICogVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbiwgSUNvbW1vbkFwcGxpY2F0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtb2R1bGVzID0gbnVsbDsKLQlwdWJsaWMgQXBwbGljYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTjsKLQl9Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSkgIT0gbnVsbDsKLX0KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmkpIHsKLQlyZXR1cm4gZ2V0Rmlyc3RNb2R1bGUodXJpKTsKLX0KLQotcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHVyaSwgU3RyaW5nIGFsdEREKSB7Ci0JTGlzdCBhbGxNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTW9kdWxlcy5zaXplKCk7IGkrKykgewotCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIGFsbE1vZHVsZXMuZ2V0KGkpOwotCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBhTW9kdWxlLmdldFVyaSgpKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChhbHRERCwgYU1vZHVsZS5nZXRBbHRERCgpKSkKLQkJCXJldHVybiBhTW9kdWxlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgYSBtb2R1bGUgdG8gZmluZC4KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUgb3IgbnVsbCBpZiBubyBtb2R1bGUgaXMgZm91bmQuCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRGaXJzdE1vZHVsZShTdHJpbmcgdXJpKXsKLQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGFsbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbE1vZHVsZXMuaGFzTmV4dCgpKXsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSlhbGxNb2R1bGVzLm5leHQoKTsKLQkJCWlmKHVyaS5lcXVhbHMoYU1vZHVsZS5nZXRVcmkoKSkpIHJldHVybiBhTW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZUhhdmluZ0FsdEREKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JaWYgKHVyaSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlMaXN0IGFNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBhTW9kdWxlcy5nZXQoaSk7Ci0JCWlmICh1cmkuZXF1YWxzKGFNb2R1bGUuZ2V0QWx0REQoKSkpCi0JCQlyZXR1cm4gYU1vZHVsZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyByb2xlTmFtZSkgewotCWphdmEudXRpbC5MaXN0IHRlbXBSb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQlTZWN1cml0eVJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBSb2xlcy5zaXplKCk7IGkrKykgewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgdGVtcFJvbGVzLmdldChpKTsKLQkJaWYgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZU5hbWUpKQotCQkJcmV0dXJuIHJvbGU7Ci0JfQotCXJldHVybiBudWxsOwotfQotCQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxjYXRpb24xLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMik7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGljYXRpb24xLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMyk7Ci19Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCVRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBzZWN1cml0eSByb2xlcyB3aGljaCBhcmUKLQkgKiBnbG9iYWwgdG8gdGhlIGFwcGxpY2F0aW9uLiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNb2R1bGVzKCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTW9kdWxlLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TW9kdWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCXJldHVybiBnZXRNb2R1bGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCWdldE1vZHVsZXMoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlnZXRNb2R1bGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gbW9kdWxlcyAhPSBudWxsICYmICFtb2R1bGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIExpc3QgZ2V0RUFSTW9kdWxlcygpIHsKLQkJcmV0dXJuIGdldE1vZHVsZXMoKTsKLQl9Ci0JcHVibGljIElDb21tb25Nb2R1bGUgZ2V0Rmlyc3RFQVJNb2R1bGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gKElDb21tb25Nb2R1bGUpZ2V0Rmlyc3RNb2R1bGUodXJpKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjZlMGIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJNb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUNsaWVudE1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJNb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29ubmVjdG9yTW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQXBwbGljYXRpb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBBcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVBcHBsaWNhdGlvblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfQWx0REQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVfQXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYk1vZHVsZSgpIHsKLQkJcmV0dXJuIHdlYk1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJNb2R1bGVfQ29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJNb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFDbGllbnRNb2R1bGUoKSB7Ci0JCXJldHVybiBqYXZhQ2xpZW50TW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWpiTW9kdWxlKCkgewotCQlyZXR1cm4gZWpiTW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdG9yTW9kdWxlKCkgewotCQlyZXR1cm4gY29ubmVjdG9yTW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhcHBsaWNhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX01PRFVMRVMpOwotCi0JCW1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19BTFRfREQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19BUFBMSUNBVElPTik7Ci0KLQkJd2ViTW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9NT0RVTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYk1vZHVsZUVDbGFzcywgV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UKTsKLQotCQlqYXZhQ2xpZW50TW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfQ0xJRU5UX01PRFVMRSk7Ci0KLQkJZWpiTW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9NT0RVTEUpOwotCi0JCWNvbm5lY3Rvck1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05ORUNUT1JfTU9EVUxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQltb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd2ViTW9kdWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldE1vZHVsZSgpKTsKLQkJamF2YUNsaWVudE1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0JCWVqYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0JCWNvbm5lY3Rvck1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkVDbGFzcywgQXBwbGljYXRpb24uY2xhc3MsICJBcHBsaWNhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldE1vZHVsZSgpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGVfQXBwbGljYXRpb24oKSwgIm1vZHVsZXMiLCBudWxsLCAxLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtb2R1bGVFQ2xhc3MsIE1vZHVsZS5jbGFzcywgIk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQWx0REQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFsdEREIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVfQXBwbGljYXRpb24oKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0QXBwbGljYXRpb24oKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCAiYXBwbGljYXRpb24iLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJNb2R1bGVFQ2xhc3MsIFdlYk1vZHVsZS5jbGFzcywgIldlYk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb250ZXh0Um9vdCIsIG51bGwsIDAsIDEsIFdlYk1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFDbGllbnRNb2R1bGVFQ2xhc3MsIEphdmFDbGllbnRNb2R1bGUuY2xhc3MsICJKYXZhQ2xpZW50TW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZWpiTW9kdWxlRUNsYXNzLCBFamJNb2R1bGUuY2xhc3MsICJFamJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb25uZWN0b3JNb2R1bGVFQ2xhc3MsIENvbm5lY3Rvck1vZHVsZS5jbGFzcywgIkNvbm5lY3Rvck1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvblBhY2thZ2VJbXBsCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmZlZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgcmVnaXN0ZXJEdGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSB7Ci0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMiwgImFwcGxpY2F0aW9uXzFfMi5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8yLCAiYXBwbGljYXRpb25fMS4yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMywgImFwcGxpY2F0aW9uXzFfMy5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zLCAiYXBwbGljYXRpb25fMS4zLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfMV80LCAiYXBwbGljYXRpb25fMV80LnhzZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG1vdmVkIHRvIHRoZSB3ZWIgc3ZjcyBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NDSEVNQV9MT0NfMV8xLCAiajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5KMkVFXzFfNF9YU0RfU0hPUlRfTkFNRSwgSjJFRUNvbnN0YW50cy5KMkVFXzFfNF9YU0RfU0hPUlRfTkFNRSk7IAotCX0KLQotCQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotICAgIH0KLQkKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotICAgICAgICBzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotICAgIH0KLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSV9PQkopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRkYWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb24uQXBwbGljYXRpb25UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25SZXNvdXJjZSB7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBhUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlcihhUmVuZGVyZXIpOwotICAgIH0KLQkvKioKLQkqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbikgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gQVBQTElDQVRJT05fVFlQRTsKLQl9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsKLSAgICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgkKLQkJCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0gICAgfQotCS8qIEFwcCB2ZXJzaW9uIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgSjJFRSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotICAgIHB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25UcmFuc2xhdG9yLklOU1RBTkNFOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8yOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8yOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8zOwotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JCS8qCi0JCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uKFNhbWUgYXMgSjJFRSBWZXJzaW9uIGZvciBBcHBsaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXByaW1TZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkJfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewotCQlBcHBsaWNhdGlvbiBhcHAgPSBnZXRBcHBsaWNhdGlvbigpOwotCQlpZiAoYXBwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgdmVyc2lvbiA9IGFwcC5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJYXBwLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjIzYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JNb2R1bGVJbXBsIGV4dGVuZHMgTW9kdWxlSW1wbCBpbXBsZW1lbnRzIENvbm5lY3Rvck1vZHVsZSB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQ09OTkVDVE9SX01PRFVMRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yTW9kdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRWpiTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2VlMTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRWpiTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGVqYi1qYXIsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJNb2R1bGVJbXBsIGV4dGVuZHMgTW9kdWxlSW1wbCBpbXBsZW1lbnRzIEVqYk1vZHVsZSB7Ci0KLQlwdWJsaWMgRWpiTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRUpCX01PRFVMRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzRWpiTW9kdWxlKCkgewotCXJldHVybiB0cnVlOwotfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSmF2YUNsaWVudE1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSmF2YUNsaWVudE1vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhMDMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLQotLyoqCi0gKiBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFDbGllbnRNb2R1bGVJbXBsIGV4dGVuZHMgTW9kdWxlSW1wbCBpbXBsZW1lbnRzIEphdmFDbGllbnRNb2R1bGUgewotCi0JcHVibGljIEphdmFDbGllbnRNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5KQVZBX0NMSUVOVF9NT0RVTEU7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzMTEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOwotCi0vKioKLSAqIFRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kdWxlLCBJQ29tbW9uTW9kdWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRk9SV0FSRF9TTEFTSCA9ICcvJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1dBUkRfU0xBU0ggPSAnXFwnOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRERCgpIDxlbT5BbHQgREQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQlwdWJsaWMgTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0gKgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKiAKLSAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogCi0gKiBSZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLSAqLwotcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdBcHBsaWNhdGlvbiwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewotCQlpZiAobmV3QXBwbGljYXRpb24gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04gJiYgbmV3QXBwbGljYXRpb24gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdBcHBsaWNhdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0FwcGxpY2F0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FwcGxpY2F0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFwcGxpY2F0aW9uKG5ld0FwcGxpY2F0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBuZXdBcHBsaWNhdGlvbiwgbmV3QXBwbGljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldEFwcGxpY2F0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUywgQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gZ2V0QWx0REQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdEREOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRERCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYmUzYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci0KLQotLyoqCi0gKiBDb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZUltcGwgZXh0ZW5kcyBNb2R1bGVJbXBsIGltcGxlbWVudHMgV2ViTW9kdWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0Um9vdCgpIDxlbT5Db250ZXh0IFJvb3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JPT1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0Um9vdCA9IENPTlRFWFRfUk9PVF9FREVGQVVMVDsKLQlwdWJsaWMgV2ViTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VCX01PRFVMRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIGNvbnRleHRSb290OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHRSb290KFN0cmluZyBuZXdDb250ZXh0Um9vdCkgewotCQlTdHJpbmcgb2xkQ29udGV4dFJvb3QgPSBjb250ZXh0Um9vdDsKLQkJY29udGV4dFJvb3QgPSBuZXdDb250ZXh0Um9vdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCwgb2xkQ29udGV4dFJvb3QsIGNvbnRleHRSb290KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgotCQkJCXJldHVybiBnZXRDb250ZXh0Um9vdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1Q6Ci0JCQkJc2V0Q29udGV4dFJvb3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVDoKLQkJCQlzZXRDb250ZXh0Um9vdChDT05URVhUX1JPT1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgotCQkJCXJldHVybiBDT05URVhUX1JPT1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRleHRSb290ICE9IG51bGwgOiAhQ09OVEVYVF9ST09UX0VERUZBVUxULmVxdWFscyhjb250ZXh0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0Um9vdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uU3dpdGNoIHN3ID0gbmV3IEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xpZW50TW9kdWxlKEphdmFDbGllbnRNb2R1bGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSmF2YUNsaWVudE1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVqYk1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xpZW50TW9kdWxlKEphdmFDbGllbnRNb2R1bGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbl9Nb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViTW9kdWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YUNsaWVudE1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYk1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uX01vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWIxZDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT046IHsKLQkJCQlBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChBcHBsaWNhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFOiB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRTogewotCQkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoV2ViTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJNb2R1bGUod2ViTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUod2ViTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRTogewotCQkJCUphdmFDbGllbnRNb2R1bGUgamF2YUNsaWVudE1vZHVsZSA9IChKYXZhQ2xpZW50TW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhQ2xpZW50TW9kdWxlKGphdmFDbGllbnRNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uX01vZHVsZShqYXZhQ2xpZW50TW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqYXZhQ2xpZW50TW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFOiB7Ci0JCQkJRWpiTW9kdWxlIGVqYk1vZHVsZSA9IChFamJNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVqYk1vZHVsZShlamJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uX01vZHVsZShlamJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRTogewotCQkJCUNvbm5lY3Rvck1vZHVsZSBjb25uZWN0b3JNb2R1bGUgPSAoQ29ubmVjdG9yTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25uZWN0b3JNb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb25uZWN0b3JNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGllbnQgTW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xpZW50IE1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUNsaWVudE1vZHVsZShKYXZhQ2xpZW50TW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0b3IgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uX01vZHVsZShNb2R1bGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ZiYWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVudGVycHJpc2UgQXBwbGljYXRpb24gbW9kZWwgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgajJlZSBBcHBsaWNhdGlvbiBtb2R1bGUgbW9kZWwgYXBpLiBVc2luZyB0aGlzIGFwaSB0aGUgYXJ0aWZhY3RzIG9mIGFuIEFwcGxpY2F0aW9uCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjFlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNsaWVudCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIFJldHVybnMgdGhlIFN0cmluZyBuYW1lIG9mIHRoZSBjYWxsIGJhY2sgaGFuZGxlcgotICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY2FsbGJhY2sgaGFuZGxlcgotICovCi1wdWJsaWMgU3RyaW5nIGdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gQ2xpZW50IHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIGNsaWVudCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGljYXRpb24gQ2xpZW50IDEuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCk7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBjbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjQgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzREZXNjcmlwdG9yKCk7Ci0vKioKLSAqIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIAotICogYW5kIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuCi0gKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgQ2FsbGJhY2tIYW5kbGVyIHJlZmVyZW5jZQotICovCi1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZVJlZnMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKgotCSAqIEByZXR1cm4gdGhlIGludCByZXByZXNlbnRpbmcgdGhlIGFwcCBjbGllbnQgbW9kdWxlIHZlcnNpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHdoZW4gRU1GIHJlc291cmNlIGlzIG5vdCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCS8qKgotCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAotCSAqIEByZXR1cm4gdGhlIGludCByZXByZXNlbnRpbmcgdGhlIEoyRUUgc3BlYyB2ZXJzaW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gd2hlbiBFTUYgcmVzb3VyY2UgaXMgbm90IGxvYWRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFbnZpcm9ubWVudFByb3BzIHJlZmVyZW5jZXMKLQkgKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogZW52aXJvbm1lbnQgZW50cmllcy4gRWFjaCBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0JICogbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLQkgKi8KLQlFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlZmVyZW5jZXMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotCSAqIGFuIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgaG9tZS4gCi0JICovCi0JRUxpc3QgZ2V0RWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZUVudlJlZnMgcmVmZXJlbmNlcwotCSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQkgKiBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUKLQkgKiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0JICogCi0JICogVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cmVzb3VyY2UtZW52LXJlZj4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0JICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENhbGxiYWNrSGFuZGxlciByZWZlcmVuY2UKLQkgKiBBIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIAotCSAqIGFuZCBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgaW50ZXJmYWNlLiAgCi0JICogVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5Ci0JICogdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICovCi0JSmF2YUNsYXNzIGdldENhbGxiYWNrSGFuZGxlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENhbGxiYWNrSGFuZGxlciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENhbGxiYWNrSGFuZGxlcihKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0JICogICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICogICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICogICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotCSAqICAgICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzcxNDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogRU1GIFJlc291cmNlIGNsYXNzIHRoZSBjb250cmFpbnMgQXBwIENsaWVudCBkb2N1bWVudAotICoJQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZSB7Ci0vKioKLSAqIFJldHVybnMgdGhlIG9uZSBjb250YWluZWQgb2JqZWN0IGluIHRoaXMgcmVzb3VyY2UncyBjb2xsZWN0aW9uIG9mIHJvb3Qgb2JqZWN0cwotICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudCwgdGhlIHJvb3Qgb2JqZWN0IGZvciB0aGUgQXBwIENsaWVudCBkb2N1bWVudC4KLSAqLwotcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU5MTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xpZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNsaWVudEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50RmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudCB2YWx1ZQotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKiBAcmV0dXJuIENsaWVudFBhY2thZ2UgdmFsdWUKLQkgKi8KLQlDbGllbnRQYWNrYWdlIGdldENsaWVudFBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU3MjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlQgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGUgPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbCNnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUgPSAxOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjbGllbnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2xpZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSA8ZW0+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDbGllbnRGYWN0b3J5IGdldENsaWVudEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT05fQ0xJRU5UID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudmlyb25tZW50IFByb3BzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZmVyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FsbGJhY2sgSGFuZGxlcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGUgPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGwjZ2V0UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSgpOwotCi0JfQotCi19IC8vQ2xpZW50UGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9SZXNBdXRoQXBwbGljYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDIxOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkFwcGxpY2F0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnRhaW5lciIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBBUFBMSUNBVElPTl9MSVRFUkFMID0gbmV3IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIsICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoQXBwbGljYXRpb25UeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlW10gewotCQkJQVBQTElDQVRJT05fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhBcHBsaWNhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBBcHBsaWNhdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhBcHBsaWNhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoQXBwbGljYXRpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNBdXRoQXBwbGljYXRpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDY2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52aXJvbm1lbnRQcm9wcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZmVyZW5jZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ2xpZW50UGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JfQotCi0vKioKLSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpIHsKLQlnZXRDYWxsYmFja0hhbmRsZXIoKTsKLQlyZXR1cm4gKGNhbGxiYWNrSGFuZGxlciA9PSBudWxsKSA/IG51bGwgOiBjYWxsYmFja0hhbmRsZXIuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gQ2xpZW50IHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMik7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBjbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKTsKLX0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV80RGVzY3JpcHRvcigpIHsKLQlyZXR1cm4gdmVyc2lvbiAhPSBudWxsICYmIEoyRUVDb25zdGFudHMuSjJFRV8xXzRfVEVYVC5lcXVhbHModmVyc2lvbik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSkgewotCWVTZXQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIGNyZWF0ZUNsYXNzUmVmKGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSkpOwotfQotLyoqCi0gKlRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLX0KLS8qKgotICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0gKi8KLXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwotfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyaWVzLiBFYWNoIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BzKCkgewotCQlpZiAoZW52aXJvbm1lbnRQcm9wcyA9PSBudWxsKSB7Ci0JCQllbnZpcm9ubWVudFByb3BzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFMpOwotCQl9Ci0JCXJldHVybiBlbnZpcm9ubWVudFByb3BzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotCSAqIGFuIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgaG9tZS4gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYlJlZmVyZW5jZXMoKSB7Ci0JCWlmIChlamJSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWVqYlJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBlamJSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQkgKiBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUKLQkgKiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0JICogCi0JICogVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cmVzb3VyY2UtZW52LXJlZj4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0JICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgY2xhc3MgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCWlmIChjYWxsYmFja0hhbmRsZXIgIT0gbnVsbCAmJiBjYWxsYmFja0hhbmRsZXIuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENhbGxiYWNrSGFuZGxlciA9IChJbnRlcm5hbEVPYmplY3QpY2FsbGJhY2tIYW5kbGVyOwotCQkJY2FsbGJhY2tIYW5kbGVyID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZENhbGxiYWNrSGFuZGxlcik7Ci0JCQlpZiAoY2FsbGJhY2tIYW5kbGVyICE9IG9sZENhbGxiYWNrSGFuZGxlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSLCBvbGRDYWxsYmFja0hhbmRsZXIsIGNhbGxiYWNrSGFuZGxlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYWxsYmFja0hhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldENhbGxiYWNrSGFuZGxlcigpIHsKLQkJcmV0dXJuIGNhbGxiYWNrSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXIoSmF2YUNsYXNzIG5ld0NhbGxiYWNrSGFuZGxlcikgewotCQlpZiAoKGNhbGxiYWNrSGFuZGxlciA9PSBudWxsIHx8IGNhbGxiYWNrSGFuZGxlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0gbnVsbCkKLQkJCQkmJiAobmV3Q2FsbGJhY2tIYW5kbGVyID09IG51bGwgfHwgbmV3Q2FsbGJhY2tIYW5kbGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFDbGFzcyBvbGRDYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFja0hhbmRsZXI7Ci0JCWNhbGxiYWNrSGFuZGxlciA9IG5ld0NhbGxiYWNrSGFuZGxlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIsIG9sZENhbGxiYWNrSGFuZGxlciwgY2FsbGJhY2tIYW5kbGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcHMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRFamJSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUzoKLQkJCQlnZXRFamJSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTOgotCQkJCWdldEVudmlyb25tZW50UHJvcHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCWdldEVqYlJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcHMgIT0gbnVsbCAmJiAhZW52aXJvbm1lbnRQcm9wcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZWpiUmVmZXJlbmNlcyAhPSBudWxsICYmICFlamJSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJcmV0dXJuIGNhbGxiYWNrSGFuZGxlciAhPSBudWxsOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9ucyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJkNGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIsICJhcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMiwgImFwcGxpY2F0aW9uLWNsaWVudF8xLjIuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMsICJhcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMywgImFwcGxpY2F0aW9uLWNsaWVudF8xLjMuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzFfNCwgImFwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIik7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxNjI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEFQUF9DTElFTlRfVFlQRTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8zOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qIEFwcCBjbGllbnQgdmVyc2lvbiBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JCS8qCi0JCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uKFNhbWUgYXMgSjJFRSBWZXJzaW9uIGZvciBBcHAgY2xpZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQkJcHJpbVNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJfQotCQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkJfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGNsdCA9IGdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCWlmIChjbHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJU3RyaW5nIHZlcnNpb24gPSBjbHQuZ2V0VmVyc2lvbigpOwotCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKTsKLQkJaWYgKCFuZXdWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKLQkJCWNsdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMmY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDbGllbnRGYWN0b3J5IHsKLSAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGllbnRGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlDbGllbnRGYWN0b3J5IHRoZUNsaWVudEZhY3RvcnkgPSAoQ2xpZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY2xpZW50LnhtaSIpOyAKLQkJCWlmICh0aGVDbGllbnRGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQ2xpZW50RmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbGllbnRGYWN0b3J5SW1wbCgpOwotCX0KLQotCXB1YmxpYyBDbGllbnRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlQ6IHJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5SRVNfQVVUSF9BUFBMSUNBVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSZXNBdXRoQXBwbGljYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLlJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoQXBwbGljYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIHN0YXRpYyBDbGllbnRGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChDbGllbnRGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJQXBwbGljYXRpb25DbGllbnRJbXBsIGFwcGxpY2F0aW9uQ2xpZW50ID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50SW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgY3JlYXRlUmVzQXV0aEFwcGxpY2F0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXNBdXRoQXBwbGljYXRpb25UeXBlIHJlc3VsdCA9IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhBcHBsaWNhdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50UGFja2FnZSBnZXRDbGllbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gKENsaWVudFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsaWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTUzMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ2xpZW50UGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQ2xpZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENsaWVudEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsaWVudFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDbGllbnRQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ2xpZW50UGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ2xpZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZpcm9ubWVudFByb3BzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCkgewotCQlyZXR1cm4gcmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDbGllbnRGYWN0b3J5IGdldENsaWVudEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ2xpZW50RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTl9DTElFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52aXJvbm1lbnRQcm9wcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiY2FsbGJhY2tIYW5kbGVyIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0ocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLmNsYXNzLCAiUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLkFQUExJQ0FUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vQ2xpZW50UGFja2FnZUltcGwKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ3MGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotcHVibGljIGNsYXNzIENsaWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIENsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENsaWVudEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChDbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xpZW50U3dpdGNoIHN3ID0gbmV3IENsaWVudFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xpZW50U3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENsaWVudFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ2xpZW50QWRhcHRlckZhY3RvcnkKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNkMTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsaWVudFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcGxpY2F0aW9uQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudChhcHBsaWNhdGlvbkNsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoYXBwbGljYXRpb25DbGllbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoYXBwbGljYXRpb25DbGllbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFwcGxpY2F0aW9uQ2xpZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9DbGllbnRTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMWY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGoyZWUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYW4gQXBwbGljYXRpb24gQ2xpZW50IGFwcAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbW1vbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmNzY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vbkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUmVmIGNyZWF0ZUVqYlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW52RW50cnkgY3JlYXRlRW52RW50cnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlUmVmIGNyZWF0ZVJlc291cmNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlSb2xlUmVmIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eVJvbGUgY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlRW52UmVmIGNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQkxvY2FsUmVmIGNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWRlbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlkZW50aXR5IGNyZWF0ZUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJY29uVHlwZSBjcmVhdGVJY29uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzcGxheU5hbWUgY3JlYXRlRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb25SZWYgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VEZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJhbVZhbHVlIGNyZWF0ZVBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVXNlQ2FsbGVySWRlbnRpdHkgY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVFOYW1lIGNyZWF0ZVFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUoyRUVFT2JqZWN0IGNyZWF0ZUoyRUVFT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKMkVFRUF0dHJpYnV0ZSBjcmVhdGVKMkVFRUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25QYWNrYWdlIGdldENvbW1vblBhY2thZ2UoKTsKLQotfSAvL0NvbW1vbkZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODNmZmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImNvbW1vbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGID0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUYgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFkgPSAxNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVNFX0NBTExFUl9JREVOVElUWSA9IDE3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJREVOVElUWSA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUYgPSA1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSWNvblR5cGVJbXBsIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElDT05fVFlQRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQTEFZX05BTUUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0dST1VQID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVAgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT04gPSAxODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsIDxlbT5RTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUU5BTUUgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsIDxlbT5MaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTElTVEVORVIgPSAyMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVGX1RZUEUgPSAyNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX1RZUEUgPSAyNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTX0FVVEhfVFlQRV9CQVNFID0gMjU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSAyNzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSA9IDI4OwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb24ueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tbW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKMkVFRV9PQkpFQ1QgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX1RZUEUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX0hPTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX1JFTU9URSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fTElOSyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVqYiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWV9fTkFNRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19WQUxVRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19UWVBFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudiBFbnRyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fVFlQRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19BVVRIID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0xJTksgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19OQU1FID0gRUpCX1JFRl9fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fVFlQRSA9IEVKQl9SRUZfX1RZUEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0hPTUUgPSBFSkJfUkVGX19IT01FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19SRU1PVEUgPSBFSkJfUkVGX19SRU1PVEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0xJTksgPSBFSkJfUkVGX19MSU5LOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTiA9IEVKQl9SRUZfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyA9IEVKQl9SRUZfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSA9IEVKQl9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19MT0NBTCA9IEVKQl9SRUZfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIExvY2FsIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX0ZFQVRVUkVfQ09VTlQgPSBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19ERVNDUklQVElPTiA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFkgPSBTRUNVUklUWV9JREVOVElUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBTRUNVUklUWV9JREVOVElUWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJREVOVElUWV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElERU5USVRZX19ST0xFX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJREVOVElUWV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElERU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fVFlQRV9fU01BTExfSUNPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFX19MQVJHRV9JQ09OID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX1RZUEVfX0xBTkcgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX0xBTkcgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX1ZBTFVFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUyA9IERFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgPSBERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04gPSBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fU01BTExfSUNPTiA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0xBUkdFX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUUgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX05BTUUgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9GRUFUVVJFX0NPVU5UID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUVfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fVkFMVUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0lDT05TID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1NNQUxMX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19MQVJHRV9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OID0gU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFX0NBTExFUl9JREVOVElUWV9fREVTQ1JJUFRJT05TID0gU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRV9DQUxMRVJfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IFNFQ1VSSVRZX0lERU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fTEFORyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19WQUxVRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRTkFNRV9fTkFNRVNQQUNFX1VSSSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUU5BTUVfX0xPQ0FMX1BBUlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRTkFNRV9fQ09NQklORURfUU5BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19JQ09OUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ESVNQTEFZX05BTUVTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19TTUFMTF9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0xBUkdFX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RJU1BMQVlfTkFNRSA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGlzdGVuZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfRkVBVFVSRV9DT1VOVCA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFQXR0cmlidXRlSW1wbCA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRUF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEUgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX01BTlkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlcml2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0RFUklWRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19JRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Um9sZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc291cmNlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfQXV0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFamJSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVqYlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfSG9tZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfUmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCTG9jYWxSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmI2dldExvY2FsSG9tZSgpCi0JICogQHNlZSAjZ2V0RUpCTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYjZ2V0TG9jYWwoKQotCSAqIEBzZWUgI2dldEVKQkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJMb2NhbFJlZl9Mb2NhbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFbnZFbnRyeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RW52RW50cnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Um9sZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5SWRlbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVzZUNhbGxlcklkZW50aXR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRRTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBzZWUgI2dldFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRTmFtZV9OYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldExvY2FsUGFydCA8ZW0+TG9jYWwgUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsIFBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0KCkKLQkgKiBAc2VlICNnZXRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UU5hbWVfTG9jYWxQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUoKQotCSAqIEBzZWUgI2dldFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRTmFtZV9Db21iaW5lZFFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpCi0JICogQHNlZSAjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyIDxlbT5MaXN0ZW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyI2dldExpc3RlbmVyQ2xhc3MgPGVtPkxpc3RlbmVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcygpCi0JICogQHNlZSAjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U21hbGwgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24oKQotCSAqIEBzZWUgI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhcmdlIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAc2VlICNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SjJFRUVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZSA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SjJFRUVBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSWRlbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldElkZW50aXR5X1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEljb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25UeXBlX1NtYWxsSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhbmcoKQotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFVzYWdlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Vc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb25Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKTkRJRW52UmVmc0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzIDxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYkxvY2FsUmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEpORElFbnZSZWZzR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc291cmNlRW52UmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRWpiUmVmVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudkVudHJ5VHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRFbnZFbnRyeVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVzQXV0aFR5cGVCYXNlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFJlc0F1dGhUeXBlQmFzZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNTaGFyaW5nU2NvcGVUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNvbW1vbkZhY3RvcnkgZ2V0Q29tbW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCA8ZW0+RWpiIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRFamJSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX1JFRiA9IGVJTlNUQU5DRS5nZXRFamJSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19OQU1FID0gZUlOU1RBTkNFLmdldEVqYlJlZl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX1JFTU9URSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fTElOSyA9IGVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRFamJSZWZfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCA8ZW0+RW52IEVudHJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RW52RW50cnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRU5WX0VOVFJZID0gZUlOU1RBTkNFLmdldEVudkVudHJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5WX0VOVFJZX19UWVBFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5WX0VOVFJZX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwgPGVtPlJlc291cmNlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFJlc291cmNlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX1JFRiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19OQU1FID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fQVVUSCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9BdXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19MSU5LID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9SRUZfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9ST0xFX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRSZXNvdXJjZUVudlJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9FTlZfUkVGID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVKQkxvY2FsUmVmSW1wbCA8ZW0+RUpCIExvY2FsIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVKQkxvY2FsUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEVKQkxvY2FsUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9MT0NBTF9SRUYgPSBlSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FID0gZUlOU1RBTkNFLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19MT0NBTCA9IGVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwgPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZID0gZUlOU1RBTkNFLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLklkZW50aXR5SW1wbCA8ZW0+SWRlbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JZGVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRJZGVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJREVOVElUWSA9IGVJTlNUQU5DRS5nZXRJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJREVOVElUWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElERU5USVRZX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSWNvblR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0SWNvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSUNPTl9UWVBFID0gZUlOU1RBTkNFLmdldEljb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9UWVBFX19TTUFMTF9JQ09OID0gZUlOU1RBTkNFLmdldEljb25UeXBlX1NtYWxsSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElDT05fVFlQRV9fTEFSR0VfSUNPTiA9IGVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYXJnZUljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJQ09OX1RZUEVfX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0SWNvblR5cGVfTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNQTEFZX05BTUVfX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVfTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNQTEFZX05BTUVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0UgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xJTksgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVNTQUdFX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UGFyYW1WYWx1ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEFSQU1fVkFMVUVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVElPTl9HUk9VUCA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsIDxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpORElfRU5WX1JFRlNfR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eUltcGwgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX0lERU5USVRZID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuVXNlQ2FsbGVySWRlbnRpdHlJbXBsIDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuVXNlQ2FsbGVySWRlbnRpdHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVVNFX0NBTExFUl9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRJT05fX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVElPTl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCA8ZW0+UU5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRRTmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBRTkFNRSA9IGVJTlNUQU5DRS5nZXRRTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19MT0NBTF9QQVJUID0gZUlOU1RBTkNFLmdldFFOYW1lX0xvY2FsUGFydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRTkFNRV9fQ09NQklORURfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0UU5hbWVfQ29tYmluZWRRTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gZUlOU1RBTkNFLmdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsIDxlbT5MaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldExpc3RlbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJU1RFTkVSID0gZUlOU1RBTkNFLmdldExpc3RlbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTiA9IGVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGwgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEoyRUVFT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEoyRUVFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRKMkVFRU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVBdHRyaWJ1dGVJbXBsIDxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRUF0dHJpYnV0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRUF0dHJpYnV0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKMkVFRV9BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0SjJFRUVBdHRyaWJ1dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gRU5WX0VOVFJZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlIDxlbT5SZXMgQXV0aCBUeXBlIEJhc2U8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2UKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRSZXNBdXRoVHlwZUJhc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBSRVNfQVVUSF9UWVBFX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aFR5cGVCYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEVqYlJlZlR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBFSkJfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpOwotCi0JfQotCi19IC8vQ29tbW9uUGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMGQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U21hbGxJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U21hbGxJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgU21hbGwgSWNvbiBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTbWFsbEljb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgTGFyZ2UgSWNvbgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBMYXJnZSBJY29uCi0JICovCi0Jdm9pZCBzZXRMYXJnZUljb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBEaXNwbGF5IE5hbWUKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGlzcGxheSBOYW1lCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5TmFtZUdlbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0RlcGxveW1lbnRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmY2IwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVwbG95bWVudCBFeHRlbnNpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlcGxveW1lbnRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2lzTXVzdFVuZGVyc3RhbmQgPGVtPk11c3QgVW5kZXJzdGFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlcGxveW1lbnRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVwbG95bWVudEV4dGVuc2lvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnRFeHRlbnNpb24gZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX05hbWVzcGFjZSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVwbG95bWVudEV4dGVuc2lvbiNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVzdCBVbmRlcnN0YW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXN0IFVuZGVyc3RhbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9NdXN0VW5kZXJzdGFuZCgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTXVzdFVuZGVyc3RhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2lzTXVzdFVuZGVyc3RhbmQgPGVtPk11c3QgVW5kZXJzdGFuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc011c3RVbmRlcnN0YW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FeHRlbnNpYmxlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX0V4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuc2lvbkVsZW1lbnRzKCk7Ci0KLX0gLy8gRGVwbG95bWVudEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlOWM3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotICogcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCi0gKiB0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0gKiB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotICogRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotICogdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotICogdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotICogY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotICogCi0gKiBUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAqIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uX0xhbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EZXNjcmlwdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGYyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLSAqIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uR3JvdXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIERlc2NyaXB0aW9uR3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EaXNwbGF5TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rpc3BsYXlOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOGE2ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rpc3BsYXlOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGRpc3BsYXktbmFtZSB0eXBlIGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi0gKiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lCi0gKiBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotICogCi0gKiBFeGFtcGxlOgotICogCi0gKiAuLi4KLSAqICAgIDxkaXNwbGF5LW5hbWUgeG1sOmxhbmc9ImVuIj5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLSAqIAotICogVGhlIHZhbHVlIG9mIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgaXMgImVuIiAoRW5nbGlzaCkgYnkgZGVmYXVsdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERpc3BsYXlOYW1lX0xhbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWVfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEaXNwbGF5TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VKQkxvY2FsUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2NTMzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0KLQotLyoqCi0gKiBUaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiBVc2VkIGluOiBlbnRpdHksIHNlc3Npb24sIG1lc3NhZ2UtZHJpdmVuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkxvY2FsUmVmIGV4dGVuZHMgRWpiUmVmewotCi0JLyoqCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvY2FsIGF0dHJpYnV0ZQotCSAqIFRoZSBMb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWwoKTsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqIFRoZSBsb2NhbCBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQkgKiBFeGFtcGxlOiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvL2hvbWU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWUoKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWwgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIHZhbHVlKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgdmFsdWUpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwZGM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRWpiUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCAgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFamJSZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0TGlua2VkRWpiKEVKQkphciBlamJKYXIpOy8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovICAKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIG5hbWUsIGhvbWUsIHJlbW90ZSwgYW5kIGxpbmsgYXJlIGVxdWl2YWxlbnQuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KEVqYlJlZiBhbkVqYlJlZikgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlZmVyZW5jZSBpcyBwaHlzaWNhbGx5IGxpbmtlZCB0bwotICogQGFuRUpCLgotICovCi1ib29sZWFuIGlzTGlua2VkKEVudGVycHJpc2VCZWFuIGFuRUpCKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KLSAqLwotYm9vbGVhbiBpc0xvY2FsKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoaXMgaXMgdGhlCi0JICogSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLgotCSAqIEV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiLy9QYXlyb2xsPC8vZWpiLXJlZi1uYW1lPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZAotCSAqIGVudGVycHJpc2UgYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogPGVqYi1yZWYtdHlwZT5FbnRpdHk8Ly9lamItcmVmLXR5cGU+Ci0JICogPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC8vZWpiLXJlZi10eXBlPgotCSAqLwotCUVqYlJlZlR5cGUgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoRWpiUmVmVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKEVqYlJlZlR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEhvbWUgYXR0cmlidXRlCi0JICogVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JICogaG9tZSBpbnRlcmZhY2UuCi0JICogRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8Ly9ob21lPgotCSAqLwotCVN0cmluZyBnZXRIb21lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSG9tZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZW1vdGUgYXR0cmlidXRlCi0JICogVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLQkgKiByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCVN0cmluZyBnZXRSZW1vdGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZW1vdGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqIFRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCCi0JICogcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uCi0JICogcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICogZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gCi0JICogRXhhbXBsZTogPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC8vZWpiLWxpbms+Ci0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VqYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmJlNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VqYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEVqYlJlZlR5cGUge30KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVqYlJlZlR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTj0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFk9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXNzaW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVNTSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFNFU1NJT05fTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKFNFU1NJT04sICJTZXNzaW9uIiwgIlNlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOVElUWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBFTlRJVFlfTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKEVOVElUWSwgIkVudGl0eSIsICJFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBFamJSZWZUeXBlW10gewotCQkJU0VTU0lPTl9MSVRFUkFMLAotCQkJRU5USVRZX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUmVmVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVqYlJlZlR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJSZWZUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRWpiUmVmVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUmVmVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU0VTU0lPTjogcmV0dXJuIFNFU1NJT05fTElURVJBTDsKLQkJCWNhc2UgRU5USVRZOiByZXR1cm4gRU5USVRZX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVqYlJlZlR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0VqYlJlZlR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2Q0YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cmllcy4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW52RW50cnkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyeS4gCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFZhbHVlIGF0dHJpYnV0ZQotCSAqIFRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIGNvbnN0cnVjdG9yIAotCSAqIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIuCi0JICogVXNlZCBpbjogZW52LWVudHJ5Ci0JICogRXhhbXBsZToKLQkgKiA8ZW52LWVudHJ5LXZhbHVlPi8vZGF0YXNvdXJjZXMvL015RGF0YWJhc2U8Ly9lbnYtZW50cnktdmFsdWU+Ci0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICogVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICogZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZS4gVGhlCi0JICogZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sCi0JICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLAotCSAqIGphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuIAotCSAqIEV4YW1wbGU6IDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvL2Vudi1lbnRyeS10eXBlPgotCSAqLwotCUVudkVudHJ5VHlwZSBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoRW52RW50cnlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKEVudkVudHJ5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM5ZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEVudkVudHJ5VHlwZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW52RW50cnlUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklORz0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU49IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEU9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlQ9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9ORz0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVD0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVI9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RSSU5HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgU1RSSU5HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKFNUUklORywgIlN0cmluZyIsICJTdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkludGVnZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIElOVEVHRVJfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSU5URUdFUiwgIkludGVnZXIiLCAiSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Cb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qm9vbGVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCT09MRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQk9PTEVBTl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShCT09MRUFOLCAiQm9vbGVhbiIsICJCb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBET1VCTEVfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoRE9VQkxFLCAiRG91YmxlIiwgIkRvdWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qnl0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCWVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQllURV9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShCWVRFLCAiQnl0ZSIsICJCeXRlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hPUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBTSE9SVF9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShTSE9SVCwgIlNob3J0IiwgIlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBMT05HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKExPTkcsICJMb25nIiwgIkxvbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GbG9hdDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGTE9BVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEZMT0FUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEZMT0FULCAiRmxvYXQiLCAiRmxvYXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIQVJBQ1RFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIENIQVJBQ1RFUl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShDSEFSQUNURVIsICJDaGFyYWN0ZXIiLCAiQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVudkVudHJ5VHlwZVtdIHsKLQkJCVNUUklOR19MSVRFUkFMLAotCQkJSU5URUdFUl9MSVRFUkFMLAotCQkJQk9PTEVBTl9MSVRFUkFMLAotCQkJRE9VQkxFX0xJVEVSQUwsCi0JCQlCWVRFX0xJVEVSQUwsCi0JCQlTSE9SVF9MSVRFUkFMLAotCQkJTE9OR19MSVRFUkFMLAotCQkJRkxPQVRfTElURVJBTCwKLQkJCUNIQVJBQ1RFUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZFbnRyeVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFbnZFbnRyeVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVudkVudHJ5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZFbnRyeVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNUUklORzogcmV0dXJuIFNUUklOR19MSVRFUkFMOwotCQkJY2FzZSBJTlRFR0VSOiByZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotCQkJY2FzZSBCT09MRUFOOiByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCQkJY2FzZSBET1VCTEU6IHJldHVybiBET1VCTEVfTElURVJBTDsKLQkJCWNhc2UgQllURTogcmV0dXJuIEJZVEVfTElURVJBTDsKLQkJCWNhc2UgU0hPUlQ6IHJldHVybiBTSE9SVF9MSVRFUkFMOwotCQkJY2FzZSBMT05HOiByZXR1cm4gTE9OR19MSVRFUkFMOwotCQkJY2FzZSBGTE9BVDogcmV0dXJuIEZMT0FUX0xJVEVSQUw7Ci0JCQljYXNlIENIQVJBQ1RFUjogcmV0dXJuIENIQVJBQ1RFUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFbnZFbnRyeVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0VudkVudHJ5VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0V4dGVuc2libGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRXh0ZW5zaWJsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiNzlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRXh0ZW5zaWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmxlVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5zaWJsZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JY29uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0ljb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZGFkNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0ljb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotICogdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi0gKiBKUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi0gKiBHVUkgdG9vbC4KLSAqIAotICogVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotICogaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi0gKiBieSBkZWZhdWx0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRJY29uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJY29uVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICogICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICogICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgKiAgICAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0JICogICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRJY29uVHlwZV9TbWFsbEljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAqICAgICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICogICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICogICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0JICogICAgICAgICBGaWxlLgotCSAqIAotCSAqICAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgKiAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAgICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEljb25UeXBlX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SWNvblR5cGVfTGFuZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEljb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSWRlbnRpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFlYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aXR5IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBydW4gYXMgaWRlbnRpdHkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFQXR0cmlidXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSjJFRUVBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0OTUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSjJFRUVBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KMkVFRSBBdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SjJFRUVBdHRyaWJ1dGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRUVBdHRyaWJ1dGUgZXh0ZW5kcyBFQXR0cmlidXRlIHsKLX0gLy8gSjJFRUVBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9KMkVFRU9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmI5YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SjJFRUUgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEoyRUVFT2JqZWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVFT2JqZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci19IC8vIEoyRUVFT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSk5ESUVudlJlZnNHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0pORElFbnZSZWZzR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNDFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSk5ESUVudlJlZnNHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sk5ESSBFbnYgUmVmcyBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotICogcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMgPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSk5ESUVudlJlZnNHcm91cCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGxpc3Qgb2YgZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZXMgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi19IC8vIEpORElFbnZSZWZzR3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzE4N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0vKioKLSAqIERlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIEdldCB0aGUgSmF2YUNsYXNzIGZvciB0aGUgbGlzdGVuZXIuCi0gKi8KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMaXN0ZW5lckNsYXNzIHJlZmVyZW5jZQotCSAqIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUKLQkgKiByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0JICovCi0JSmF2YUNsYXNzIGdldExpc3RlbmVyQ2xhc3MoKTsKLQotLyoqCi0gKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgbGlzdGVuZXIuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzc05hbWUoKTsKLS8qKgotICogU2V0cyB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgc2V0TGlzdGVuZXJDbGFzc05hbWUoU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaXN0ZW5lckNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TGlzdGVuZXJDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU4YWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotICogZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0gKiBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLSAqIAotICogVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLSAqIAotICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbgotICogICAgICAgICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0gKiAgICAgICAgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICBEZXBsb3ltZW50IEZpbGUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiAKLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KLSAqIDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGVzdGluYXRpb24gZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgKiAgICAgICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCi0JICogICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0JICogICAgICAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlRGVzdGluYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNTAxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotICogZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqICAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotICogICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUKLSAqICAgICAgICAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUKLSAqICAgICAgICAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotICogICAgICAgICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGgKLSAqICAgICAgICAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAqIAotICogRXhhbXBsZXM6Ci0gKiAKLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLSAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLSAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLSAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKLSAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcwotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KLSAqIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldExpbmsgPGVtPkxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGVzdGluYXRpb25SZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAc2VlICNzZXRVc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0VXNhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMaW5rIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIE1lc3NhZ2VEZXN0aW5hdGlvblJlZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTlmNmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJDb25zdW1lcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVU1FUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Qcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST0RVQ0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iUHJvZHVjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRFVDRVMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnN1bWVzUHJvZHVjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVNfUFJPRFVDRVMgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIENPTlNVTUVTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKENPTlNVTUVTLCAiQ29uc3VtZXMiLCAiQ29uc3VtZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Qcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9EVUNFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFBST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKFBST0RVQ0VTLCAiUHJvZHVjZXMiLCAiUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lcyBQcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19QUk9EVUNFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKENPTlNVTUVTX1BST0RVQ0VTLCAiQ29uc3VtZXNQcm9kdWNlcyIsICJDb25zdW1lc1Byb2R1Y2VzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVbXSB7Ci0JCQlDT05TVU1FU19MSVRFUkFMLAotCQkJUFJPRFVDRVNfTElURVJBTCwKLQkJCUNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJCWNhc2UgUFJPRFVDRVM6IHJldHVybiBQUk9EVUNFU19MSVRFUkFMOwotCQkJY2FzZSBDT05TVU1FU19QUk9EVUNFUzogcmV0dXJuIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUGFyYW1WYWx1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1BhcmFtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExMDBiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUGFyYW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gKiBwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRQYXJhbVZhbHVlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtVmFsdWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFBhcmFtVmFsdWVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfSAvLyBQYXJhbVZhbHVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUU5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9RTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMwNjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9RTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0Q29tYmluZWRRTmFtZSA8ZW0+Q29tYmluZWQgUU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFFOYW1lIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX05hbWVzcGFjZVVSSSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIFBhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsUGFydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRRTmFtZV9Mb2NhbFBhcnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxQYXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbFBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsUGFydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21iaW5lZFFOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX0NvbWJpbmVkUU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tYmluZWRRTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21iaW5lZCBRTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tYmluZWRRTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCl9LgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjc2V0VmFsdWVzKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVybmFsUHJlZml4T3JOc1VSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyBhbGwgdGhlIHZhbHVlcyBmb3IgdGhpcyBxTmFtZQotCSAqIEBwYXJhbSBwcmVmaXggICAgLSBUaGUgbmFtZXNwYWNlIHByZWZpeAotCSAqIEBwYXJhbSBuc1VSSSAgICAgLSBUaGUgbmFtZXNwYWNlIFVSSQotCSAqIEBwYXJhbSBsb2NhbFBhcnQgLSBUaGUgbG9jYWwgcGFydAotCSAqLwotCXZvaWQgc2V0VmFsdWVzKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsUGFydCk7Ci0JCi0KLX0gLy8gUU5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2ZTRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzQXV0aFR5cGVCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ09OVEFJTkVSPTAKLSAqIENvbnRhaW5lcj0xCi0gKiBBcHBsaWNhdGlvbj0yCi0gKiBTRVJWTEVUPTMKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNBdXRoVHlwZUJhc2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoVHlwZUJhc2UgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnRhaW5lciIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkFwcGxpY2F0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUlZMRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWTEVUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FQUExJQ0FUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIsICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgU0VSVkxFVF9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShTRVJWTEVULCAiU0VSVkxFVCIsICJTRVJWTEVUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoVHlwZUJhc2VbXSB7Ci0JCQlDT05UQUlORVJfTElURVJBTCwKLQkJCUFQUExJQ0FUSU9OX0xJVEVSQUwsCi0JCQlTRVJWTEVUX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGVCYXNlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGVCYXNlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoVHlwZUJhc2UgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZMRVQ6IHJldHVybiBTRVJWTEVUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc0F1dGhUeXBlQmFzZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUmVzQXV0aFR5cGVCYXNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgUmVzU2hhcmluZ1Njb3BlVHlwZSB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzU2hhcmluZ1Njb3BlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFSRUFCTEU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TSEFSRUFCTEU9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VbnNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFVOU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShVTlNIQVJFQUJMRSwgIlVuc2hhcmVhYmxlIiwgIlVuc2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJlc1NoYXJpbmdTY29wZVR5cGVbXSB7Ci0JCQlTSEFSRUFCTEVfTElURVJBTCwKLQkJCVVOU0hBUkVBQkxFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNIQVJFQUJMRTogcmV0dXJuIFNIQVJFQUJMRV9MSVRFUkFMOwotCQkJY2FzZSBVTlNIQVJFQUJMRTogcmV0dXJuIFVOU0hBUkVBQkxFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc1NoYXJpbmdTY29wZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1Jlc1NoYXJpbmdTY29wZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZUVudlJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlRW52UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDVhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlRW52UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogPHJlc291cmNlLWVudi1yZWY+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gKiA8Ly9yZXNvdXJjZS1lbnYtcmVmPgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUVudlJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgZm9yIHRoZSB0eXBlCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIHNldHMgdGhlIG5hbWUgZm9yIHRoZSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIHJlc291cmNlIGVudiByZWYuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgKiBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFR5cGUgcmVmZXJlbmNlCi0JICogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgU2VlIHRoZSBjbGFzcwotCSAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgotCSAqLwotCUphdmFDbGFzcyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTdhMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFwcGxpY2F0aW9uIGNsaWVudHMncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZSwgYW5kIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChiZWFuIG9yIGNvbnRhaW5lcikuCi0gKiBFeGFtcGxlOgotICogPHJlc291cmNlLXJlZj4KLSAqIDxyZXMtcmVmLW5hbWU+RW1wbG95ZWVBcHBEQjwvL3Jlcy1yZWYtbmFtZT4KLSAqIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvL3Jlcy10eXBlPgotICogPHJlcy1hdXRoPkNvbnRhaW5lcjwvL3Jlcy1hdXRoPgotICogPC8vcmVzb3VyY2UtcmVmPgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZQotCSAqIG5hbWUuIFRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAqIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEKLQkgKiBzb3VyY2UuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICogVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLQkgKiBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIChvciBjbGFzcykgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlCi0JICogZGF0YSBzb3VyY2UuCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEF1dGggYXR0cmlidXRlCi0JICogVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uCi0JICogcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiAKLQkgKiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCi0JICogQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUgRGVwbG95ZXIuICBUaGUgdmFsdWUgb2YgdGhpcyAKLQkgKiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCSAqIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvL3Jlcy1hdXRoPgotCSAqIDxyZXMtYXV0aD5Db250YWluZXI8Ly9yZXMtYXV0aD4KLQkgKi8KLQlSZXNBdXRoVHlwZUJhc2UgZ2V0QXV0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldEF1dGggPGVtPkF1dGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZQotCSAqIEBzZWUgI2lzU2V0QXV0aCgpCi0JICogQHNlZSAjdW5zZXRBdXRoKCkKLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoKFJlc0F1dGhUeXBlQmFzZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXRBdXRoIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dGgoKQotCSAqIEBzZWUgI2dldEF1dGgoKQotCSAqIEBzZWUgI3NldEF1dGgoUmVzQXV0aFR5cGVCYXNlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0QXV0aCA8ZW0+QXV0aDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0aCgpCi0JICogQHNlZSAjZ2V0QXV0aCgpCi0JICogQHNlZSAjc2V0QXV0aChSZXNBdXRoVHlwZUJhc2UpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGluayBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TGluaygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVzU2hhcmluZ1Njb3BlIGF0dHJpYnV0ZQotCSAqIFRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCi0JICogdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotCSAqIHNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiB0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZQotCSAqIAotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotCSAqLwotCVJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAc2VlICNpc1NldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRmZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCAgICBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBJZGVudGl0eSByZWZlcmVuY2UKLQkgKiBPcHRpb25hbCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZQotCSAqIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCSAqLwotCUlkZW50aXR5IGdldElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSWRlbnRpdHkgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1NlY3VyaXR5SWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwZDFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlJZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5SWRlbnRpdHkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JYm9vbGVhbiBpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBDYWxsZXIgSWRlbnRpdHkKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExOWQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0vKioKLSAqIEEgc2VtYW50aWMgZ3JvdXBpbmcgb2Ygb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBwZXJmb3JtZWQgYnkgYSBzdWJqZWN0LgotICogVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eSByb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVJvbGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluIGEKLQkgKiBub24tZW1wdHkgc3RyaW5nLgotCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYTJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVJvbGVSZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAqIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Vc2VDYWxsZXJJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjU1MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBVc2VDYWxsZXJJZGVudGl0eSBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHl7Ci0JLy9Vc2VDYWxsZXJJZGVudGl0eQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tbW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJQ29tbW9uRmFjdG9yeSB0aGVDb21tb25GYWN0b3J5ID0gKENvbW1vbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImNvbW1vbi54bWkiKTsgCi0JCQlpZiAodGhlQ29tbW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUNvbW1vbkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbW9uRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUY6IHJldHVybiBjcmVhdGVFamJSZWYoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUlk6IHJldHVybiBjcmVhdGVFbnZFbnRyeSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRjogcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUY6IHJldHVybiBjcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogcmV0dXJuIGNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRjogcmV0dXJuIGNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTogcmV0dXJuIGNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWTogcmV0dXJuIGNyZWF0ZUlkZW50aXR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFOiByZXR1cm4gY3JlYXRlSWNvblR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUU6IHJldHVybiBjcmVhdGVEaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOiByZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFOiByZXR1cm4gY3JlYXRlUGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFk6IHJldHVybiBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRTogcmV0dXJuIGNyZWF0ZVFOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVI6IHJldHVybiBjcmVhdGVMaXN0ZW5lcigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVA6IHJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVDogcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlSjJFRUVBdHRyaWJ1dGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19BVVRIX1RZUEVfQkFTRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFR5cGVCYXNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNfQVVUSF9UWVBFX0JBU0U6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoVHlwZUJhc2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVqYlJlZlR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZiBjcmVhdGVFamJSZWYoKSB7Ci0JCUVqYlJlZkltcGwgZWpiUmVmID0gbmV3IEVqYlJlZkltcGwoKTsKLQkJcmV0dXJuIGVqYlJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW52RW50cnkgY3JlYXRlRW52RW50cnkoKSB7Ci0JCUVudkVudHJ5SW1wbCBlbnZFbnRyeSA9IG5ldyBFbnZFbnRyeUltcGwoKTsKLQkJcmV0dXJuIGVudkVudHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlZiBjcmVhdGVSZXNvdXJjZVJlZigpIHsKLQkJUmVzb3VyY2VSZWZJbXBsIHJlc291cmNlUmVmID0gbmV3IFJlc291cmNlUmVmSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZVJlZiBjcmVhdGVTZWN1cml0eVJvbGVSZWYoKSB7Ci0JCVNlY3VyaXR5Um9sZVJlZkltcGwgc2VjdXJpdHlSb2xlUmVmID0gbmV3IFNlY3VyaXR5Um9sZVJlZkltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGNyZWF0ZVNlY3VyaXR5Um9sZSgpIHsKLQkJU2VjdXJpdHlSb2xlSW1wbCBzZWN1cml0eVJvbGUgPSBuZXcgU2VjdXJpdHlSb2xlSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUVudlJlZiBjcmVhdGVSZXNvdXJjZUVudlJlZigpIHsKLQkJUmVzb3VyY2VFbnZSZWZJbXBsIHJlc291cmNlRW52UmVmID0gbmV3IFJlc291cmNlRW52UmVmSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkxvY2FsUmVmIGNyZWF0ZUVKQkxvY2FsUmVmKCkgewotCQlFSkJMb2NhbFJlZkltcGwgZWpiTG9jYWxSZWYgPSBuZXcgRUpCTG9jYWxSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJMb2NhbFJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlSdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbCBydW5Bc1NwZWNpZmllZElkZW50aXR5ID0gbmV3IFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBydW5Bc1NwZWNpZmllZElkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZGVudGl0eSBjcmVhdGVJZGVudGl0eSgpIHsKLQkJSWRlbnRpdHlJbXBsIGlkZW50aXR5ID0gbmV3IElkZW50aXR5SW1wbCgpOwotCQlyZXR1cm4gaWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEljb25UeXBlIGNyZWF0ZUljb25UeXBlKCkgewotCQlJY29uVHlwZUltcGwgaWNvblR5cGUgPSBuZXcgSWNvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBpY29uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWUgY3JlYXRlRGlzcGxheU5hbWUoKSB7Ci0JCURpc3BsYXlOYW1lSW1wbCBkaXNwbGF5TmFtZSA9IG5ldyBEaXNwbGF5TmFtZUltcGwoKTsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWYgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIG1lc3NhZ2VEZXN0aW5hdGlvblJlZiA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgbWVzc2FnZURlc3RpbmF0aW9uID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyYW1WYWx1ZSBjcmVhdGVQYXJhbVZhbHVlKCkgewotCQlQYXJhbVZhbHVlSW1wbCBwYXJhbVZhbHVlID0gbmV3IFBhcmFtVmFsdWVJbXBsKCk7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCURlc2NyaXB0aW9uR3JvdXBJbXBsIGRlc2NyaXB0aW9uR3JvdXAgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHkgY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJU2VjdXJpdHlJZGVudGl0eUltcGwgc2VjdXJpdHlJZGVudGl0eSA9IG5ldyBTZWN1cml0eUlkZW50aXR5SW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVXNlQ2FsbGVySWRlbnRpdHkgY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCVVzZUNhbGxlcklkZW50aXR5SW1wbCB1c2VDYWxsZXJJZGVudGl0eSA9IG5ldyBVc2VDYWxsZXJJZGVudGl0eUltcGwoKTsKLQkJcmV0dXJuIHVzZUNhbGxlcklkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRpb25JbXBsIGRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lIGNyZWF0ZVFOYW1lKCkgewotCQlRTmFtZUltcGwgcU5hbWUgPSBuZXcgUU5hbWVJbXBsKCk7Ci0JCXJldHVybiBxTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKSB7Ci0JCUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lckltcGwoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpIHsKLQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gbmV3IENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCgpOwotCQlyZXR1cm4gY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEoyRUVFT2JqZWN0IGNyZWF0ZUoyRUVFT2JqZWN0KCkgewotCQlKMkVFRU9iamVjdEltcGwgajJFRUVPYmplY3QgPSBuZXcgSjJFRUVPYmplY3RJbXBsKCk7Ci0JCXJldHVybiBqMkVFRU9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSjJFRUVBdHRyaWJ1dGUgY3JlYXRlSjJFRUVBdHRyaWJ1dGUoKSB7Ci0JCUoyRUVFQXR0cmlidXRlSW1wbCBqMkVFRUF0dHJpYnV0ZSA9IG5ldyBKMkVFRUF0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGoyRUVFQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVR5cGUgY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUVudkVudHJ5VHlwZSByZXN1bHQgPSBFbnZFbnRyeVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNBdXRoVHlwZUJhc2UgY3JlYXRlUmVzQXV0aFR5cGVCYXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVJlc0F1dGhUeXBlQmFzZSByZXN1bHQgPSBSZXNBdXRoVHlwZUJhc2UuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhUeXBlQmFzZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRWpiUmVmVHlwZSByZXN1bHQgPSBFamJSZWZUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJSZWZUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc3VsdCA9IFJlc1NoYXJpbmdTY29wZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGFja2FnZSBnZXRDb21tb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vQ29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTljMGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENvbW1vblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnZFbnRyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVJvbGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlRW52UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkxvY2FsUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlJZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpY29uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNwbGF5TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcmFtVmFsdWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqbmRpRW52UmVmc0dyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZUNhbGxlcklkZW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHFOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGoyRUVFT2JqZWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGoyRUVFQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZW52RW50cnlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXNBdXRoVHlwZUJhc2VFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVqYlJlZlR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQ29tbW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tbW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ29tbW9uUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Um9sZSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZVJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9BdXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFamJSZWYoKSB7Ci0JCXJldHVybiBlamJSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9Ib21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX1JlbW90ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCTG9jYWxSZWYoKSB7Ci0JCXJldHVybiBlamJMb2NhbFJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVudkVudHJ5KCkgewotCQlyZXR1cm4gZW52RW50cnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlUmVmKCkgewotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlyZXR1cm4gcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gdXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX0xhbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFFOYW1lKCkgewotCQlyZXR1cm4gcU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcU5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRTmFtZV9Mb2NhbFBhcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxTmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxTmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXFOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCXJldHVybiBjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEoyRUVFT2JqZWN0KCkgewotCQlyZXR1cm4gajJFRUVPYmplY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKMkVFRUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGoyRUVFQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBpZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJZGVudGl0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJY29uVHlwZSgpIHsKLQkJcmV0dXJuIGljb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25UeXBlX1NtYWxsSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWljb25UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNwbGF5TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKTkRJRW52UmVmc0dyb3VwKCkgewotCQlyZXR1cm4gam5kaUVudlJlZnNHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upam5kaUVudlJlZnNHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFamJSZWZUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aFR5cGVCYXNlKCkgewotCQlyZXR1cm4gcmVzQXV0aFR5cGVCYXNlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tbW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQllamJSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19SRU1PVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVudkVudHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVl9FTlRSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19ERVNDUklQVElPTlMpOwotCi0JCXJlc291cmNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0FVVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCXNlY3VyaXR5Um9sZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9ST0xFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2VjdXJpdHlSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eVJvbGVFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJcmVzb3VyY2VFbnZSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfRU5WX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVqYkxvY2FsUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9MT0NBTF9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTE9DQUwpOwotCi0JCXJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcywgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFkpOwotCi0JCWlkZW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElERU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaWRlbnRpdHlFQ2xhc3MsIElERU5USVRZX19ERVNDUklQVElPTlMpOwotCi0JCWljb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElDT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFORyk7Ci0KLQkJZGlzcGxheU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19MQU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19WQUxVRSk7Ci0KLQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfREVTVElOQVRJT05fUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKLQotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FKTsKLQotCQlwYXJhbVZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUkFNX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCi0JCWRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT05fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpcHRpb25Hcm91cEVDbGFzcywgREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMpOwotCi0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSk5ESV9FTlZfUkVGU19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MsIEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMpOwotCi0JCXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfSURFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJdXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVNFX0NBTExFUl9JREVOVElUWSk7Ci0KLQkJZGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fTEFORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19WQUxVRSk7Ci0KLQkJcU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUU5BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHFOYW1lRUNsYXNzLCBRTkFNRV9fTkFNRVNQQUNFX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocU5hbWVFQ2xhc3MsIFFOQU1FX19MT0NBTF9QQVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0NPTUJJTkVEX1FOQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkpOwotCi0JCWxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJU1RFTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTKTsKLQotCQljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcywgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRSk7Ci0KLQkJajJFRUVPYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSjJFRUVfT0JKRUNUKTsKLQotCQlqMkVFRUF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKMkVFRV9BVFRSSUJVVEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQllbnZFbnRyeVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVOVl9FTlRSWV9UWVBFKTsKLQkJcmVzQXV0aFR5cGVCYXNlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfQVVUSF9UWVBFX0JBU0UpOwotCQllamJSZWZUeXBlRUVudW0gPSBjcmVhdGVFRW51bShFSkJfUkVGX1RZUEUpOwotCQlyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfU0hBUklOR19TQ09QRV9UWVBFKTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQllamJSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZW52RW50cnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlY3VyaXR5Um9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVqYlJlZigpKTsKLQkJcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWlkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWljb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJc2VjdXJpdHlJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQl1c2VDYWxsZXJJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXFOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJajJFRUVBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBdHRyaWJ1dGUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhlamJSZWZFQ2xhc3MsIEVqYlJlZi5jbGFzcywgIkVqYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9UeXBlKCksIHRoaXMuZ2V0RWpiUmVmVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfSG9tZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1JlbW90ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZW52RW50cnlFQ2xhc3MsIEVudkVudHJ5LmNsYXNzLCAiRW52RW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9UeXBlKCksIHRoaXMuZ2V0RW52RW50cnlUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlc291cmNlUmVmRUNsYXNzLCBSZXNvdXJjZVJlZi5jbGFzcywgIlJlc291cmNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0F1dGgoKSwgdGhpcy5nZXRSZXNBdXRoVHlwZUJhc2UoKSwgImF1dGgiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpLCB0aGlzLmdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSwgInJlc1NoYXJpbmdTY29wZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIlNlY3VyaXR5Um9sZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJlc291cmNlRW52UmVmLmNsYXNzLCAiUmVzb3VyY2VFbnZSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0eXBlIiwgbnVsbCwgMSwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJMb2NhbFJlZkVDbGFzcywgRUpCTG9jYWxSZWYuY2xhc3MsICJFSkJMb2NhbFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbEhvbWUiLCBudWxsLCAwLCAxLCBFSkJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgRUpCTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLCBSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzLCAiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpLCB0aGlzLmdldElkZW50aXR5KCksIG51bGwsICJpZGVudGl0eSIsIG51bGwsIDAsIDEsIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpZGVudGl0eUVDbGFzcywgSWRlbnRpdHkuY2xhc3MsICJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldElkZW50aXR5X1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaWNvblR5cGVFQ2xhc3MsIEljb25UeXBlLmNsYXNzLCAiSWNvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25SZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJ1c2FnZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcmFtVmFsdWVFQ2xhc3MsIFBhcmFtVmFsdWUuY2xhc3MsICJQYXJhbVZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiRGVzY3JpcHRpb25Hcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpLCB0aGlzLmdldEljb25UeXBlKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAiSk5ESUVudlJlZnNHcm91cCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpLCB0aGlzLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZpcm9ubWVudFByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSwgdGhpcy5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpLCB0aGlzLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpLCB0aGlzLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSwgdGhpcy5nZXRFSkJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5SWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1c2VDYWxsZXJJZGVudGl0eUVDbGFzcywgVXNlQ2FsbGVySWRlbnRpdHkuY2xhc3MsICJVc2VDYWxsZXJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocU5hbWVFQ2xhc3MsIFFOYW1lLmNsYXNzLCAiUU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0xvY2FsUGFydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxQYXJ0IiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbWJpbmVkUU5hbWUiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbnRlcm5hbFByZWZpeE9yTnNVUkkiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxpc3RlbmVyRUNsYXNzLCBMaXN0ZW5lci5jbGFzcywgIkxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibGlzdGVuZXJDbGFzcyIsIG51bGwsIDEsIDEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGoyRUVFT2JqZWN0RUNsYXNzLCBKMkVFRU9iamVjdC5jbGFzcywgIkoyRUVFT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoajJFRUVBdHRyaWJ1dGVFQ2xhc3MsIEoyRUVFQXR0cmlidXRlLmNsYXNzLCAiSjJFRUVBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuU1RSSU5HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5ET1VCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkJZVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLlNIT1JUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5MT05HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuQ0hBUkFDVEVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLmNsYXNzLCAiUmVzQXV0aFR5cGVCYXNlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlQmFzZUVFbnVtLCBSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLlNFUlZMRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5TRVNTSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5VTlNIQVJFQUJMRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9Db21tb25QYWNrYWdlSW1wbAotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjOGQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01BTExfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNtYWxsSWNvbiA9IFNNQUxMX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSR0VfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhcmdlSWNvbiA9IExBUkdFX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7IAotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpZiAoZ2V0SWNvbnMoKS5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoKEljb25UeXBlKWdldEljb25zKCkuZ2V0KDApKS5nZXRTbWFsbEljb24oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlpbnRlcm5hbFNldFNtYWxsSWNvbkluTGlzdChuZXdTbWFsbEljb24pOyAKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0U21hbGxJY29uSW5MaXN0KG5ld1NtYWxsSWNvbik7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5ld1NtYWxsSWNvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0U21hbGxJY29uSW5MaXN0KFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJSWNvblR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXRJY29ucygpLnNpemUoKSA+IDApIHsKLQkJCW5ld1ZhbHVlID0gKEljb25UeXBlKSBnZXRJY29ucygpLmdldCgwKTsKLQkJCW5ld1ZhbHVlLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0U21hbGxJY29uKG5ld1NtYWxsSWNvbik7Ci0JCQlnZXRJY29ucygpLmFkZChuZXdWYWx1ZSk7IAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb25HZW4oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uR2VuKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJU3RyaW5nIG9sZFNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQkJc21hbGxJY29uID0gbmV3U21hbGxJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotCQkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOwotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldEljb25zKCkuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKChJY29uVHlwZSlnZXRJY29ucygpLmdldCgwKSkuZ2V0TGFyZ2VJY29uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCXNldExhcmdlSWNvbkdlbihuZXdMYXJnZUljb24pOwotCQkJaW50ZXJuYWxTZXRMYXJnZUljb25Jbkxpc3QobmV3TGFyZ2VJY29uKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0TGFyZ2VJY29uSW5MaXN0KG5ld0xhcmdlSWNvbik7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TGFyZ2VJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRMYXJnZUljb25Jbkxpc3QoU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlJY29uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldEljb25zKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoSWNvblR5cGUpIGdldEljb25zKCkuZ2V0KDApOwotCQkJbmV3VmFsdWUuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRMYXJnZUljb24obmV3TGFyZ2VJY29uKTsKLQkJCWdldEljb25zKCkuYWRkKG5ld1ZhbHVlKTsgCi0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb25HZW4oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uR2VuKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsKLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldERlc2NyaXB0aW9ucygpLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuICgoRGVzY3JpcHRpb24pZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotCQkJaW50ZXJuYWxTZXREZXNjcmlwdGlvbkluTGlzdChuZXdEZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpbnRlcm5hbFNldERlc2NyaXB0aW9uSW5MaXN0KG5ld0Rlc2NyaXB0aW9uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzY3JpcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldERlc2NyaXB0aW9uSW5MaXN0KFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlEZXNjcmlwdGlvbiBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldERlc2NyaXB0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCW5ld1ZhbHVlID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCQlnZXREZXNjcmlwdGlvbnMoKS5hZGQobmV3VmFsdWUpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkdlbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVHZW4oKTsgCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDoKLQkJCWlmIChnZXREaXNwbGF5TmFtZXMoKS5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoKERpc3BsYXlOYW1lKWdldERpc3BsYXlOYW1lcygpLmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI3NldERpc3BsYXlOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCXNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCWludGVybmFsU2V0RGlzcGxheU5hbWVJbkxpc3QobmV3RGlzcGxheU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlzZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaW50ZXJuYWxTZXREaXNwbGF5TmFtZUluTGlzdChuZXdEaXNwbGF5TmFtZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEaXNwbGF5TmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RGlzcGxheU5hbWVJbkxpc3QoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCURpc3BsYXlOYW1lIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0RGlzcGxheU5hbWVzKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoRGlzcGxheU5hbWUpIGdldERpc3BsYXlOYW1lcygpLmdldCgwKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rpc3BsYXlOYW1lKTsKLQkJfQotCQllbHNlICB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEaXNwbGF5TmFtZSk7Ci0JCQlnZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3VmFsdWUpOwotCQl9CQkJICAKLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUdlbigpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lR2VuKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlTdHJpbmcgb2xkRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJZGlzcGxheU5hbWUgPSBuZXdEaXNwbGF5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc21hbGxJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2IyZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0KLQotLyoqCi0JICogQGF1dGhvciBjYnJpZGdoYQotCSAqCi0JICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0JICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCkgfHwKLQkJCQkJbXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYXJnZUljb24oKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEljb25UeXBlX1NtYWxsSWNvbigpKSB7Ci0JCQkJCXN5bmNoSWNvbnMoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCWVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpIHsKLQkJCQkJc3luY2hEZXNjcmlwdGlvbigpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpIHx8Ci0JCQkJCW1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSkgewotCQkJCQlzeW5jaERpc3BsYXlOYW1lKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzeW5jaERlc2NyaXB0aW9uKCkgewotCQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgbXlUYXJnZXQgPSAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAobXlUYXJnZXQuZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKQotCQkJCW15VGFyZ2V0LnNldERlc2NyaXB0aW9uR2VuKG51bGwpOwotCQkJZWxzZSB7Ci0JCQkJRGVzY3JpcHRpb24gYURlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKW15VGFyZ2V0LmdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCQlpZiAoIWFEZXNjcmlwdGlvbi5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQkJYURlc2NyaXB0aW9uLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQllbHNlIAotCQkJCQlteVRhcmdldC5zZXREZXNjcmlwdGlvbkdlbihhRGVzY3JpcHRpb24uZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc3luY2hEaXNwbGF5TmFtZSgpIHsKLQkJCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG15VGFyZ2V0ID0gKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKWdldFRhcmdldCgpOwotCQkJaWYgKG15VGFyZ2V0LmdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKSkKLQkJCQlteVRhcmdldC5zZXREaXNwbGF5TmFtZUdlbihudWxsKTsKLQkJCWVsc2UgewotCQkJCURpc3BsYXlOYW1lIGFEaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSlteVRhcmdldC5nZXREaXNwbGF5TmFtZXMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhRGlzcGxheU5hbWUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFEaXNwbGF5TmFtZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJbXlUYXJnZXQuc2V0RGlzcGxheU5hbWVHZW4oYURpc3BsYXlOYW1lLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNoSWNvbnMoKSB7Ci0JCQlDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBteVRhcmdldCA9IChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cClnZXRUYXJnZXQoKTsKLQkJCWlmIChteVRhcmdldC5nZXRJY29ucygpLmlzRW1wdHkoKSkgewotCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihudWxsKTsKLQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4obnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJY29uVHlwZSBhbkljb24gPSAoSWNvblR5cGUpbXlUYXJnZXQuZ2V0SWNvbnMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhbkljb24uZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFuSWNvbi5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihhbkljb24uZ2V0TGFyZ2VJY29uKCkpOwotCQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4oYW5JY29uLmdldFNtYWxsSWNvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKQotCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTJlOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0SWNvbnMoKSBAZ2VuZXJhdGVkIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpIEBnZW5lcmF0ZWQgQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkgQGdlbmVyYXRlZCBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uR3JvdXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uVHlwZS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRKMkVFVmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9Ci0JCQotCX0KLQotfSAvL0Rlc2NyaXB0aW9uR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEwYTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsYW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGQwMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBEaXNwbGF5TmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRJU1BMQVlfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rpc3BsYXlOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRUpCTG9jYWxSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4MTMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLQotLyoqCi0gKiBUaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiBVc2VkIGluOiBlbnRpdHksIHNlc3Npb24sIG1lc3NhZ2UtZHJpdmVuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMb2NhbFJlZkltcGwgZXh0ZW5kcyBFamJSZWZJbXBsIGltcGxlbWVudHMgRUpCTG9jYWxSZWYgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0hPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbEhvbWUgPSBMT0NBTF9IT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsID0gTE9DQUxfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRUpCTG9jYWxSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRUpCX0xPQ0FMX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSwgb2xkTG9jYWxIb21lLCBsb2NhbEhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIG5ld0xvY2FsKSB7Ci0JCVN0cmluZyBvbGRMb2NhbCA9IGxvY2FsOwotCQlsb2NhbCA9IG5ld0xvY2FsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMLCBvbGRMb2NhbCwgbG9jYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIGdldExvY2FsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZShMT0NBTF9IT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoTE9DQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIExPQ0FMX0hPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsSG9tZSAhPSBudWxsIDogIUxPQ0FMX0hPTUVfRURFRkFVTFQuZXF1YWxzKGxvY2FsSG9tZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIExPQ0FMX0VERUZBVUxUID09IG51bGwgPyBsb2NhbCAhPSBudWxsIDogIUxPQ0FMX0VERUZBVUxULmVxdWFscyhsb2NhbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhbEhvbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsSG9tZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpewotCXJldHVybiB0cnVlOwotfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FamJSZWYjZ2V0UmVtb3RlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZSgpIHsKLQkJcmV0dXJuIGdldExvY2FsKCk7IC8vZm9yd2FyZCB0byB0aGUgbG9jYWwKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNzZXRSZW1vdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldExvY2FsKHZhbHVlKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRWpiUmVmI2dldEhvbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGdldExvY2FsSG9tZSgpOyAvL2ZvcndhcmQgdG8gdGhlIGxvY2FsIGhvbWUKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNzZXRIb21lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0TG9jYWxIb21lKHZhbHVlKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbCBob21lCi0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNTlmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLS8qKgotICogVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCAgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVqYlJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFRZUEVfRURFRkFVTFQgPSBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFamJSZWZUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob21lID0gSE9NRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3RlKCkgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRWpiUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUY7Ci0JfQotCi0vKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gKiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIAotICogcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldExpbmtlZEVqYihFSkJKYXIgZWpiSmFyKSB7Ci0JaWYgKGdldExpbmsoKSA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gZWpiSmFyLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKHRoaXMpOwotfS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovICAKLXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChFamJSZWYgYW5FamJSZWYpIHsKLQlpZiAoYW5FamJSZWYgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCWJvb2xlYW4gZXF1aXYgPSB0cnVlOwotCWVxdWl2ID0gZ2V0TmFtZSgpID09IGFuRWpiUmVmLmdldE5hbWUoKSB8fCAoZ2V0TmFtZSgpICE9IG51bGwgJiYgZ2V0TmFtZSgpLmVxdWFscyhhbkVqYlJlZi5nZXROYW1lKCkpKTsKLQlpZiAoZXF1aXYpCi0JCWVxdWl2ID0gZ2V0SG9tZSgpID09IGFuRWpiUmVmLmdldEhvbWUoKSB8fCAoZ2V0SG9tZSgpICE9IG51bGwgJiYgZ2V0SG9tZSgpLmVxdWFscyhhbkVqYlJlZi5nZXRIb21lKCkpKTsKLQlpZiAoZXF1aXYpCi0JCWVxdWl2ID0gZ2V0UmVtb3RlKCkgPT0gYW5FamJSZWYuZ2V0UmVtb3RlKCkgfHwgKGdldFJlbW90ZSgpICE9IG51bGwgJiYgZ2V0UmVtb3RlKCkuZXF1YWxzKGFuRWpiUmVmLmdldFJlbW90ZSgpKSk7Ci0JaWYgKGVxdWl2KQotCQllcXVpdiA9IGdldExpbmsoKSA9PSBhbkVqYlJlZi5nZXRMaW5rKCkgfHwgKGdldExpbmsoKSAhPSBudWxsICYmIGdldExpbmsoKS5lcXVhbHMoYW5FamJSZWYuZ2V0TGluaygpKSk7Ci0JcmV0dXJuIGVxdWl2OwotfQotcHVibGljIGJvb2xlYW4gaXNMaW5rZWQoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlpZiAoZ2V0TGluaygpID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gZ2V0TGluaygpLmVxdWFscyhhbkVKQi5nZXROYW1lKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWpicmVmIGlzIGZvciBhIGxvY2FsIGVqYiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoaXMgaXMgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBzZXJ2bGV0IGNvZGUgdXNlcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLQkgKiBFeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi8vUGF5cm9sbDwvL2VqYi1yZWYtbmFtZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogPGVqYi1yZWYtdHlwZT5FbnRpdHk8Ly9lamItcmVmLXR5cGU+Ci0JICogPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC8vZWpiLXJlZi10eXBlPgotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoRWpiUmVmVHlwZSBuZXdUeXBlKSB7Ci0JCUVqYlJlZlR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlID09IG51bGwgPyBUWVBFX0VERUZBVUxUIDogbmV3VHlwZTsKLQkJYm9vbGVhbiBvbGRUeXBlRVNldCA9IHR5cGVFU2V0OwotCQl0eXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSwgIW9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUeXBlKCkgewotCQlFamJSZWZUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRSwgb2xkVHlwZSwgVFlQRV9FREVGQVVMVCwgb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICogRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8Ly9ob21lPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGhvbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgbmV3SG9tZSkgewotCQlTdHJpbmcgb2xkSG9tZSA9IGhvbWU7Ci0JCWhvbWUgPSBuZXdIb21lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0hPTUUsIG9sZEhvbWUsIGhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgbmV3UmVtb3RlKSB7Ci0JCVN0cmluZyBvbGRSZW1vdGUgPSByZW1vdGU7Ci0JCXJlbW90ZSA9IG5ld1JlbW90ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19SRU1PVEUsIG9sZFJlbW90ZSwgcmVtb3RlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiAKLQkgKiBFeGFtcGxlOiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8Ly9lamItbGluaz4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LLCBvbGRMaW5rLCBsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gVGhlCi0JICogICAgICAgICAgICBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0bwotCSAqICAgICAgICAgICAgcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZQotCSAqICAgICAgICAgICAgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZQotCSAqICAgICAgICAgICAgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4KLQkgKiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCWlmICghZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIAlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0gICAgICAgIAlpZiAoZCAhPSBudWxsKQotICAgICAgICAJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0JCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBnZXRSZW1vdGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKChFamJSZWZUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXNldExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXVuc2V0VHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXNldEhvbWUoSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoUkVNT1RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKExJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBIT01FX0VERUZBVUxUID09IG51bGwgPyBob21lICE9IG51bGwgOiAhSE9NRV9FREVGQVVMVC5lcXVhbHMoaG9tZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBSRU1PVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlbW90ZSAhPSBudWxsIDogIVJFTU9URV9FREVGQVVMVC5lcXVhbHMocmVtb3RlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXJldHVybiBMSU5LX0VERUZBVUxUID09IG51bGwgPyBsaW5rICE9IG51bGwgOiAhTElOS19FREVGQVVMVC5lcXVhbHMobGluayk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtb3RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FbnZFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmNzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZTsKLQotLyoqCi0gKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnZFbnRyeSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBUWVBFX0VERUZBVUxUID0gRW52RW50cnlUeXBlLlNUUklOR19MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVudkVudHJ5VHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRW52RW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRU5WX0VOVFJZOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlci4KLQkgKiBVc2VkIGluOiBlbnYtZW50cnkKLQkgKiBFeGFtcGxlOgotCSAqIDxlbnYtZW50cnktdmFsdWU+Ly9kYXRhc291cmNlcy8vTXlEYXRhYmFzZTwvL2Vudi1lbnRyeS12YWx1ZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kIGphdmEubGFuZy5GbG9hdC4gCi0JICogRXhhbXBsZTogPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC8vZW52LWVudHJ5LXR5cGU+Ci0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEVudkVudHJ5VHlwZSBuZXdUeXBlKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEUsIG9sZFR5cGUsIHR5cGUsICFvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHlwZSgpIHsKLQkJRW52RW50cnlUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFLCBvbGRUeXBlLCBUWVBFX0VERUZBVUxULCBvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVFlQRToKLQkJCQlzZXRUeXBlKChFbnZFbnRyeVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEU6Ci0JCQkJdW5zZXRUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JY29uVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY0NjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSWNvblR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSWNvblR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc21hbGxJY29uID0gU01BTExfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEljb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSUNPTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gc21hbGxJY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCVN0cmluZyBvbGRTbWFsbEljb24gPSBzbWFsbEljb247Ci0JCXNtYWxsSWNvbiA9IG5ld1NtYWxsSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFSR0VfSUNPTiwgb2xkTGFyZ2VJY29uLCBsYXJnZUljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORzoKLQkJCQlyZXR1cm4gTEFOR19FREVGQVVMVCA9PSBudWxsID8gbGFuZyAhPSBudWxsIDogIUxBTkdfRURFRkFVTFQuZXF1YWxzKGxhbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc21hbGxJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSWNvblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JZGVudGl0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2M5ZWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBJZGVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBJZGVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5JREVOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBydW4gYXMgaWRlbnRpdHkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFQXR0cmlidXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTEzMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkoyRUVFIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFQXR0cmlidXRlSW1wbCBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgSjJFRUVBdHRyaWJ1dGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKMkVFRUF0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkoyRUVFX0FUVFJJQlVURTsKLQl9Ci0KLX0gLy9KMkVFRUF0dHJpYnV0ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFT2JqZWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVPYmplY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjk0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SjJFRUUgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVPYmplY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEoyRUVFT2JqZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSjJFRUVfT0JKRUNUOwotCX0KLQotfSAvL0oyRUVFT2JqZWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTBhNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTEsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSBleHRlbmRzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0gICAgcHVibGljIHN0YXRpYyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkoKTsKLQotICAgIHB1YmxpYyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5pdFJlZ2lzdHJhdGlvbigpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJlZ2lzdHJhdGlvbigpIHsKLSAgICAJRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUsIG5ldyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9TSE9SVF9OQU1FLCBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLlJBUl9TSE9SVF9OQU1FLCBuZXcgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSwgbmV3IFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQl9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI1OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyU0FYUmVuZGVyZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeQotICAgICAgICBleHRlbmRzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0UmVnaXN0cmF0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0UmVnaXN0cmF0aW9uKCkgewotICAgIAlFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBuZXcgRUpCSmFyUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfU0hPUlRfTkFNRSwgbmV3IFdlYkFwcFJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FLCBuZXcgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuUkFSX1NIT1JUX05BTUUsIG5ldyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FLCBuZXcgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyOWFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgewotCQotCXB1YmxpYyBzdGF0aWMgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCi0JcHVibGljIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCWlmIChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UgPT0gdGhpcykKLQkJCXJldHVybiBzdXBlci5kZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeSh1cmkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSk5ESUVudlJlZnNHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5YjhlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpOREkgRW52IFJlZnMgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldEVudmlyb25tZW50UHJvcGVydGllcyA8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSk5ESUVudlJlZnNHcm91cEltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBKTkRJRW52UmVmc0dyb3VwIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSA8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZpcm9ubWVudFByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMb2NhbFJlZnMoKSA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiTG9jYWxSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKTkRJRW52UmVmc0dyb3VwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSk5ESV9FTlZfUkVGU19HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkgewotCQlpZiAoZW52aXJvbm1lbnRQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWVudmlyb25tZW50UHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRW52UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFSkJMb2NhbFJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYkxvY2FsUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWVudmlyb25tZW50UHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiBlamJMb2NhbFJlZnMgIT0gbnVsbCAmJiAhZWpiTG9jYWxSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0pORElFbnZSZWZzR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhiYTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotCi0KLS8qKgotICogRGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBsaXN0ZW5lckNsYXNzID0gbnVsbDsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgTGlzdGVuZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5MSVNURU5FUjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCWlmIChsaXN0ZW5lckNsYXNzICE9IG51bGwgJiYgbGlzdGVuZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTGlzdGVuZXJDbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpbGlzdGVuZXJDbGFzczsKLQkJCWxpc3RlbmVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkTGlzdGVuZXJDbGFzcyk7Ci0JCQlpZiAobGlzdGVuZXJDbGFzcyAhPSBvbGRMaXN0ZW5lckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1MsIG9sZExpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJDbGFzcyhKYXZhQ2xhc3MgbmV3TGlzdGVuZXJDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkTGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7Ci0JCWxpc3RlbmVyQ2xhc3MgPSBuZXdMaXN0ZW5lckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUywgb2xkTGlzdGVuZXJDbGFzcywgbGlzdGVuZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlzdGVuZXJDbGFzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCXNldExpc3RlbmVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJc2V0TGlzdGVuZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlyZXR1cm4gbGlzdGVuZXJDbGFzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLS8qKgotICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLS8qKgotICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGxpc3RlbmVyLgotICovCi1wdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCWdldExpc3RlbmVyQ2xhc3MoKTsKLQlyZXR1cm4gKGxpc3RlbmVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGxpc3RlbmVyIGNsYXNzIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3NOYW1lKFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSkgewotCWVTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihsaXN0ZW5lckNsYXNzTmFtZSkpOwotfQotfSAvL0xpc3RlbmVySW1wbAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJkYzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkYWVkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldFVzYWdlIDxlbT5Vc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZSgpIDxlbT5Vc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFVTQUdFX0VERUZBVUxUID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZSgpIDxlbT5Vc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgdXNhZ2UgPSBVU0FHRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlRVNldCA9IGZhbHNlOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldFVzYWdlKCkgewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2UoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG5ld1VzYWdlKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBvbGRVc2FnZSA9IHVzYWdlOwotCQl1c2FnZSA9IG5ld1VzYWdlID09IG51bGwgPyBVU0FHRV9FREVGQVVMVCA6IG5ld1VzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSwgb2xkVXNhZ2UsIHVzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVzYWdlKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgb2xkVXNhZ2UgPSB1c2FnZTsKLQkJYm9vbGVhbiBvbGRVc2FnZUVTZXQgPSB1c2VFU2V0OwotCQl1c2FnZSA9IFVTQUdFX0VERUZBVUxUOwotCQl1c2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0UsIG9sZFVzYWdlLCBVU0FHRV9FREVGQVVMVCwgb2xkVXNhZ2VFU2V0KSk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVc2UoKSB7Ci0JCXJldHVybiB1c2VFU2V0OwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSywgb2xkTGluaywgbGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRToKLQkJCQlyZXR1cm4gZ2V0VXNhZ2UoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXNldFVzYWdlKChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRToKLQkJCQlzZXRVc2FnZShVU0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXJldHVybiB1c2FnZSAhPSBVU0FHRV9FREVGQVVMVDsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDIyN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBhcmFtVmFsdWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbVZhbHVlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUEFSQU1fVkFMVUU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGFyYW1WYWx1ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1FOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWU5NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRMb2NhbFBhcnQgPGVtPkxvY2FsIFBhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFFOYW1lSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFFOYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxQYXJ0KCkgPGVtPkxvY2FsIFBhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbFBhcnQoKSA8ZW0+TG9jYWwgUGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsUGFydCA9IExPQ0FMX1BBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tYmluZWRRTmFtZSgpIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklORURfUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tYmluZWRRTmFtZSgpIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lZFFOYW1lID0gQ09NQklORURfUU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGludGVybmFsUHJlZml4T3JOc1VSSSA9IElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUU5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5RTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSUdlbigpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIG5hbWVzcGFjZVVSSTsKLQkJU3RyaW5nIHJlc29sdmVkID0gTmFtZXNwYWNlQWRhcHRlci5nZXRSZXNvbHZlZE5hbWVzcGFjZVVSSShpbnRlcm5hbFByZWZpeE9yTnNVUkksIHRoaXMpOwotCQlyZXR1cm4gcmVzb2x2ZWQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSA6IHJlc29sdmVkOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUklHZW4oU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQluYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpIHsKLQkgICAgU3RyaW5nIHByZWZpeCA9IGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCSAgICBTdHJpbmcgb2xkTnNVUkkgPSBnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKTsKLQkgICAgaWYgKCFTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChwcmVmaXgsIG9sZE5zVVJJKSkKLQkgICAgICAgIHNldFZhbHVlcyhwcmVmaXgsIG5ld05hbWVzcGFjZVVSSSwgZ2V0TG9jYWxQYXJ0KCkpOwotCSAgICBlbHNlIHsKLQkgICAgICAgIHNldE5hbWVzcGFjZVVSSUdlbihuZXdOYW1lc3BhY2VVUkkpOwotCSAgICAgICAgc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKG5ld05hbWVzcGFjZVVSSSk7Ci0JICAgIH0KLQkJCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgewotCQlyZXR1cm4gbG9jYWxQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsUGFydEdlbihTdHJpbmcgbmV3TG9jYWxQYXJ0KSB7Ci0JCVN0cmluZyBvbGRMb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0JCWxvY2FsUGFydCA9IG5ld0xvY2FsUGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVCwgb2xkTG9jYWxQYXJ0LCBsb2NhbFBhcnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbFBhcnQoU3RyaW5nIG5ld0xvY2FsUGFydCkgewotCQlzZXRMb2NhbFBhcnRHZW4obmV3TG9jYWxQYXJ0KTsKLQkJdXBkYXRlQ29tYmluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tYmluZWRRTmFtZSgpIHsKLQkJcmV0dXJuIGNvbWJpbmVkUU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tYmluZWRRTmFtZUdlbihTdHJpbmcgbmV3Q29tYmluZWRRTmFtZSkgewotCQlTdHJpbmcgb2xkQ29tYmluZWRRTmFtZSA9IGNvbWJpbmVkUU5hbWU7Ci0JCWNvbWJpbmVkUU5hbWUgPSBuZXdDb21iaW5lZFFOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRSwgb2xkQ29tYmluZWRRTmFtZSwgY29tYmluZWRRTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbWJpbmVkUU5hbWUoU3RyaW5nIG5ld0NvbWJpbmVkUU5hbWUpIHsKLQkJc2V0Q29tYmluZWRRTmFtZUdlbihuZXdDb21iaW5lZFFOYW1lKTsKLQkJdXBkYXRlUGFyc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvbWJpbmVkIG5hbWUgaW50byB0aGUgY29tcG9uZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJzZSgpIHsKLQkJU3RyaW5nIG5zID0gbnVsbDsKLQkJU3RyaW5nIGxwID0gbnVsbDsKLQkJaWYgKGNvbWJpbmVkUU5hbWUgIT0gbnVsbCB8fCBjb21iaW5lZFFOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaW50IGluZGV4ID0gY29tYmluZWRRTmFtZS5sYXN0SW5kZXhPZignOicpOwotCQkJCi0JCQlpZiAoaW5kZXggPCAwKSB7IC8vTm8gc2VwYXJhdG9yCi0JCQkJbnMgPSBjb21iaW5lZFFOYW1lOwotCQkJfSBlbHNlIGlmIChpbmRleCA9PSAwKSB7IC8vRmlyc3QgY2hhcgotCQkJCWxwID0gY29tYmluZWRRTmFtZS5zdWJzdHJpbmcoMSk7IAotCQkJfSBlbHNlIGlmIChpbmRleCA9PSBjb21iaW5lZFFOYW1lLmxlbmd0aCgpLTEpIHsgLy9MYXN0IGNoYXIKLQkJCQlucyA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCX0gZWxzZSB7IC8vSW4gdGhlIG1pZGRsZSwgd2hpY2ggaXMgd2hhdCBpdCBzaG91bGQgYmUKLQkJCQlucyA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlscCA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKGluZGV4KzEsIGNvbWJpbmVkUU5hbWUubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JCXNldEludGVybmFsUHJlZml4T3JOc1VSSUdlbihucyk7Ci0JCXNldExvY2FsUGFydEdlbihscCk7Ci0JfQotCQkKLQkvKioKLQkgKiB1cGRhdGVzIHRoZSBjb21iaW5lZCBuYW1lIGZyb20gdGhlIGNvbXBvbmVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29tYmluZSgpIHsKLQkJU3RyaW5nIGNuID0gbnVsbDsKLQkJaWYgKGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIHx8IGxvY2FsUGFydCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbnMgPSBpbnRlcm5hbFByZWZpeE9yTnNVUkkgPT0gbnVsbCA/ICIiIDogaW50ZXJuYWxQcmVmaXhPck5zVVJJOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbHAgPSBsb2NhbFBhcnQgPT0gbnVsbCA/ICIiIDogbG9jYWxQYXJ0OyAvLyROT04tTkxTLTEkCi0JCQljbiA9IG5zKyc6JytscDsKLQkJfQotCQlzZXRDb21iaW5lZFFOYW1lR2VuKGNuKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQkJcmV0dXJuIGludGVybmFsUHJlZml4T3JOc1VSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFByZWZpeE9yTnNVUklHZW4oU3RyaW5nIG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSkgewotCQlTdHJpbmcgb2xkSW50ZXJuYWxQcmVmaXhPck5zVVJJID0gaW50ZXJuYWxQcmVmaXhPck5zVVJJOwotCQlpbnRlcm5hbFByZWZpeE9yTnNVUkkgPSBuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkksIG9sZEludGVybmFsUHJlZml4T3JOc1VSSSwgaW50ZXJuYWxQcmVmaXhPck5zVVJJKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKFN0cmluZyBuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkkpIHsKLQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJR2VuKG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCXVwZGF0ZUNvbWJpbmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxQYXJ0KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBnZXRDb21iaW5lZFFOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydChMT0NBTF9QQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXNldENvbWJpbmVkUU5hbWUoQ09NQklORURfUU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgOiAhSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVC5lcXVhbHMoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBlSXNTZXQgZm9yIG5hbWVzcGFjZSB1cmkgbXVzdCBiZSBkZXJpdmVkIGlmIG51bGwgc28gbmFtZXNwYWNlVVJJICEgPSBudWxsIGFuZCBpbnRlcm5hbFByZWZpeE9yTnNVUkkgIT0gbnVsbCBtdXN0IGJvdGggYmUgY2hlY2suCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gKG5hbWVzcGFjZVVSSSAhPSBudWxsIHx8IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsKSA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBMT0NBTF9QQVJUX0VERUZBVUxUID09IG51bGwgPyBsb2NhbFBhcnQgIT0gbnVsbCA6ICFMT0NBTF9QQVJUX0VERUZBVUxULmVxdWFscyhsb2NhbFBhcnQpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gQ09NQklORURfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbWJpbmVkUU5hbWUgIT0gbnVsbCA6ICFDT01CSU5FRF9RTkFNRV9FREVGQVVMVC5lcXVhbHMoY29tYmluZWRRTmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIDogIUlOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQuZXF1YWxzKGludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lc3BhY2VVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWxQYXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhbFBhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbWJpbmVkUU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbWJpbmVkUU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVybmFsUHJlZml4T3JOc1VSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlFOYW1lI3NldFZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgbnNVUkksIFN0cmluZyBsb2NhbFBhcnQpIHsKLQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJR2VuKHByZWZpeCk7Ci0JCXNldExvY2FsUGFydEdlbihsb2NhbFBhcnQpOwotCQlTdHJpbmcgZXhpc3RpbmdVUkkgPSBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgdGhpcyk7Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQlpZiAoZXhpc3RpbmdVUkkgIT0gbnVsbCAmJiAhZXhpc3RpbmdVUkkuZXF1YWxzKG5zVVJJKSkgewotCQkJTmFtZXNwYWNlQWRhcHRlci5yZW1vdmVOYW1lc3BhY2UocHJlZml4LCB0aGlzKTsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9IAotCQlpZiAoZXhpc3RpbmdVUkkgPT0gbnVsbCB8fCByZW1vdmVkKQotCQkJTmFtZXNwYWNlQWRhcHRlci5hZGROYW1lc3BhY2UocHJlZml4LCBuc1VSSSwgdGhpcyk7Ci0JCXVwZGF0ZUNvbWJpbmUoKTsKLQl9Ci0KLQotfSAvL1FOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyYjcyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogPHJlc291cmNlLWVudi1yZWY+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gKiA8Ly9yZXNvdXJjZS1lbnYtcmVmPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWZJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VFbnZSZWYgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHR5cGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBSZXNvdXJjZUVudlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9FTlZfUkVGOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJZ2V0VHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBudWxsID8gbnVsbCA6IHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZVNldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9UeXBlKCksIGNyZWF0ZUNsYXNzUmVmKGNsYXNzTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJfQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMKLQkgKiAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGVudGVycHJpc2UKLQkgKiAgICAgICAgICAgIGJlYW4gY29kZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVHlwZSA9IChJbnRlcm5hbEVPYmplY3QpdHlwZTsKLQkJCXR5cGUgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkVHlwZSk7Ci0JCQlpZiAodHlwZSAhPSBvbGRUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoSmF2YUNsYXNzIG5ld1R5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmN2U5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci0KLS8qKgotICogVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4gb3IgY29udGFpbmVyKS4KLSAqIEV4YW1wbGU6Ci0gKiA8cmVzb3VyY2UtcmVmPgotICogPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC8vcmVzLXJlZi1uYW1lPgotICogPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC8vcmVzLXR5cGU+Ci0gKiA8cmVzLWF1dGg+Q29udGFpbmVyPC8vcmVzLWF1dGg+Ci0gKiA8Ly9yZXNvdXJjZS1yZWY+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlZkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZVJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aCgpIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBBVVRIX0VERUZBVUxUID0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc0F1dGhUeXBlQmFzZSBhdXRoID0gQVVUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dGhFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGluayA9IExJTktfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1NoYXJpbmdTY29wZSgpIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgPSBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlID0gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXMgU2hhcmluZyBTY29wZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzU2hhcmluZ1Njb3BlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFJlc291cmNlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX1JFRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChnZXREZXNjcmlwdGlvbnMoKSAhPSBudWxsICYmICFnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCURlc2NyaXB0aW9uIGQgPSAoRGVzY3JpcHRpb24pIGdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCWlmIChkICE9IG51bGwpCi0JCQkJZC5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZS4gVGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4gIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JICogPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC8vcmVzLWF1dGg+Ci0JICogPHJlcy1hdXRoPkNvbnRhaW5lcjwvL3Jlcy1hdXRoPgotCSAqLwotCXB1YmxpYyBSZXNBdXRoVHlwZUJhc2UgZ2V0QXV0aCgpIHsKLQkJcmV0dXJuIGF1dGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aChSZXNBdXRoVHlwZUJhc2UgbmV3QXV0aCkgewotCQlSZXNBdXRoVHlwZUJhc2Ugb2xkQXV0aCA9IGF1dGg7Ci0JCWF1dGggPSBuZXdBdXRoID09IG51bGwgPyBBVVRIX0VERUZBVUxUIDogbmV3QXV0aDsKLQkJYm9vbGVhbiBvbGRBdXRoRVNldCA9IGF1dGhFU2V0OwotCQlhdXRoRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRILCBvbGRBdXRoLCBhdXRoLCAhb2xkQXV0aEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dGgoKSB7Ci0JCVJlc0F1dGhUeXBlQmFzZSBvbGRBdXRoID0gYXV0aDsKLQkJYm9vbGVhbiBvbGRBdXRoRVNldCA9IGF1dGhFU2V0OwotCQlhdXRoID0gQVVUSF9FREVGQVVMVDsKLQkJYXV0aEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSCwgb2xkQXV0aCwgQVVUSF9FREVGQVVMVCwgb2xkQXV0aEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dGgoKSB7Ci0JCXJldHVybiBhdXRoRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xJTkssIG9sZExpbmssIGxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotCSAqIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLQkgKiBzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogdHdvIGZvbGxvd2luZzogIFNoYXJlYWJsZSwgVW5zaGFyZWFibGUKLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLQkgKi8KLQlwdWJsaWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgbmV3UmVzU2hhcmluZ1Njb3BlKSB7Ci0JCVJlc1NoYXJpbmdTY29wZVR5cGUgb2xkUmVzU2hhcmluZ1Njb3BlID0gcmVzU2hhcmluZ1Njb3BlOwotCQlyZXNTaGFyaW5nU2NvcGUgPSBuZXdSZXNTaGFyaW5nU2NvcGUgPT0gbnVsbCA/IFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUIDogbmV3UmVzU2hhcmluZ1Njb3BlOwotCQlib29sZWFuIG9sZFJlc1NoYXJpbmdTY29wZUVTZXQgPSByZXNTaGFyaW5nU2NvcGVFU2V0OwotCQlyZXNTaGFyaW5nU2NvcGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFLCBvbGRSZXNTaGFyaW5nU2NvcGUsIHJlc1NoYXJpbmdTY29wZSwgIW9sZFJlc1NoYXJpbmdTY29wZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJUmVzU2hhcmluZ1Njb3BlVHlwZSBvbGRSZXNTaGFyaW5nU2NvcGUgPSByZXNTaGFyaW5nU2NvcGU7Ci0JCWJvb2xlYW4gb2xkUmVzU2hhcmluZ1Njb3BlRVNldCA9IHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JCXJlc1NoYXJpbmdTY29wZSA9IFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUOwotCQlyZXNTaGFyaW5nU2NvcGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFLCBvbGRSZXNTaGFyaW5nU2NvcGUsIFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxULCBvbGRSZXNTaGFyaW5nU2NvcGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQlyZXR1cm4gZ2V0QXV0aCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJcmV0dXJuIGdldFJlc1NoYXJpbmdTY29wZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRIOgotCQkJCXNldEF1dGgoKFJlc0F1dGhUeXBlQmFzZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXNldFJlc1NoYXJpbmdTY29wZSgoUmVzU2hhcmluZ1Njb3BlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQl1bnNldEF1dGgoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQlyZXR1cm4gaXNTZXRBdXRoKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19MSU5LOgotCQkJCXJldHVybiBMSU5LX0VERUZBVUxUID09IG51bGwgPyBsaW5rICE9IG51bGwgOiAhTElOS19FREVGQVVMVC5lcXVhbHMobGluayk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlyZXR1cm4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGg6ICIpOwotCQlpZiAoYXV0aEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7Ci0JCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmMzBjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgICAgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUltcGwgaW1wbGVtZW50cyBSdW5Bc1NwZWNpZmllZElkZW50aXR5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJZGVudGl0eSBpZGVudGl0eSA9IG51bGw7Ci0JcHVibGljIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBPcHRpb25hbCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0JICovCi0JcHVibGljIElkZW50aXR5IGdldElkZW50aXR5KCkgewotCQlyZXR1cm4gaWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWRlbnRpdHkoSWRlbnRpdHkgbmV3SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSWRlbnRpdHkgb2xkSWRlbnRpdHkgPSBpZGVudGl0eTsKLQkJaWRlbnRpdHkgPSBuZXdJZGVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWSwgb2xkSWRlbnRpdHksIG5ld0lkZW50aXR5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSBuZXdJZGVudGl0eSkgewotCQlpZiAobmV3SWRlbnRpdHkgIT0gaWRlbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldElkZW50aXR5KG5ld0lkZW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFksIG5ld0lkZW50aXR5LCBuZXdJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJZGVudGl0eShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgotCQkJCXJldHVybiBnZXRJZGVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFk6Ci0JCQkJc2V0SWRlbnRpdHkoKElkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgotCQkJCXNldElkZW50aXR5KChJZGVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gaWRlbnRpdHkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjY2OGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotCSAqLwotCXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkpIHsKLQkJCQkJc3luY2hEaXNwbGF5TmFtZSgpOwotCQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpIHsKLQkJCQkJc3luY2hEaXNwbGF5TmFtZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNoRGlzcGxheU5hbWUoKSB7Ci0JCQlTZWN1cml0eUNvbnN0cmFpbnQgbXlUYXJnZXQgPSAoU2VjdXJpdHlDb25zdHJhaW50KWdldFRhcmdldCgpOwotCQkJaWYgKG15VGFyZ2V0LmdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKSkKLQkJCQlteVRhcmdldC5zZXREaXNwbGF5TmFtZShudWxsKTsKLQkJCWVsc2UgewotCQkJCURpc3BsYXlOYW1lIGFEaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSlteVRhcmdldC5nZXREaXNwbGF5TmFtZXMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhRGlzcGxheU5hbWUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFEaXNwbGF5TmFtZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJbXlUYXJnZXQuc2V0RGlzcGxheU5hbWUoYURpc3BsYXlOYW1lLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCWlmIChuZXdUYXJnZXQgaW5zdGFuY2VvZiBTZWN1cml0eUNvbnN0cmFpbnQpCi0JCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1MzY1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdAotICogY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlJZGVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfSURFTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2lzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1VzZUNhbGxlcklkZW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThhYTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5Xb3JrYmVuY2hVdGlsOwotCi0vKioKLSAqIEEgc2VtYW50aWMgZ3JvdXBpbmcgb2Ygb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBwZXJmb3JtZWQgYnkgYSBzdWJqZWN0LgotICogVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eSByb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQlzdGF0aWMgYm9vbGVhbiBpbkVjbGlwc2UgPSBXb3JrYmVuY2hVdGlsLndvcmtiZW5jaElzUnVubmluZygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5Um9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9ST0xFOwotCX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JaWYgKGluRWNsaXBzZSkKLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLQkJCi0JaWYgKG8gaW5zdGFuY2VvZiBTZWN1cml0eVJvbGVJbXBsKSB7Ci0JCVN0cmluZyByMSA9IGdldFJvbGVOYW1lKCk7Ci0JCVN0cmluZyByMiA9ICgoU2VjdXJpdHlSb2xlKSBvKS5nZXRSb2xlTmFtZSgpOwotCQlpZiAoKHIxICE9IG51bGwpICYmIChyMiAhPSBudWxsKSkgewotCQkJaWYgKHIxLmVxdWFscyhyMikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyMSA9PSBudWxsICYmIHIyID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCWlmIChpbkVjbGlwc2UgfHwgZ2V0Um9sZU5hbWUoKSA9PSBudWxsKQotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQlyZXR1cm4gZ2V0Um9sZU5hbWUoKS5oYXNoQ29kZSgpOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmcgbmFtZSA9IGdldFJvbGVOYW1lKCkgPT0gbnVsbCA/ICI8dW5rbm93bj4iIDogZ2V0Um9sZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIG5hbWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwpIHsKLQkJCWlmIChnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlEZXNjcmlwdGlvbiBkID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZChkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25HZW4oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiBUaGUKLQkgKiAgICAgICAgICAgIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZS4gVGhpcyBlbGVtZW50Ci0JICogICAgICAgICAgICBtdXN0IGNvbnRhaW4gYSBub24tZW1wdHkgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmZkMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZVJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gTElOS19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQl9Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBsaW5rIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbmV3TGluaykgewotCQlTdHJpbmcgb2xkTGluayA9IGxpbms7Ci0JCWxpbmsgPSBuZXdMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LLCBvbGRMaW5rLCBsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvVXNlQ2FsbGVySWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NDQzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZSBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5SW1wbCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGltcGxlbWVudHMgVXNlQ2FsbGVySWRlbnRpdHkgewotCi0JcHVibGljIFVzZUNhbGxlcklkZW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlVTRV9DQUxMRVJfSURFTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1VzZUNhbGxlcklkZW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjliN2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNpbmNlIDQvMjIvMjAwMwotICogVGhpcyBpcyByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIGltcGxlbWVudGVycyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnl9Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotLyoqCi0gKiBFSkJKYXJSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFhNTFJlc291cmNlRmFjdG9yeSgpIHsKLQkvL1RPRE86IERlbGV0ZSB0aGlzIGNsYXNzCi0Jc3VwZXIoKTsKLX0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsI2NyZWF0ZVJlc291cmNlKFVSSSkKLSAqLwotcHVibGljIGZpbmFsIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9IHByaW1DcmVhdGVSZXNvdXJjZSh1cmkpOwotCXJlc291cmNlLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgcmVzb3VyY2UuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX0xJTkVfV0lEVEgsIG5ldyBJbnRlZ2VyKDgwKSk7Ci0gICAgcmV0dXJuIHJlc291cmNlOwotfQotCi0vKioKLSAqIE1ldGhvZCBwcmltQ3JlYXRlUmVzb3VyY2UuCi0gKiBAcGFyYW0gdXJpCi0gKiBAcmV0dXJuIFhNTFJlc291cmNlCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBYTUxSZXNvdXJjZSBwcmltQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgOwotCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDgwY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MUmVzb3VyY2VJbXBsIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFhNTFJlc291cmNlLEoyRUVWZXJzaW9uUmVzb3VyY2UgewotCS8qKiBJbmRpY2F0b3IgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcmVzb3VyY2Ugd2FzIGxvYWRlZCBhcyBhbiBhbHQtZGQgKGZyb20gYW4gZWFyKSwKLQkgICogZGVmYXVsdCBpcyBmYWxzZSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWx0ID0gZmFsc2U7Ci0JLyoqIFRoZSBhcHBsaWNhdGlvbiB3aGljaCBkZWNsYXJlZCB0aGUgYWx0LWRkIGZvciB0aGlzIHJlc291cmNlOyBleGlzdHMgb25seSBpZiB0aGlzIHJlc291cmNlIGlzIGFuZAotCSAgKiBhbHQgZGQgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXcgPSB0cnVlOwotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3RWZXJzaW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX1RZUEUgPSBSb290VmVyc2lvbkFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJFU09VUkNFX19DT05URU5UUyAmJgotCQkJCW1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkJCSgoWE1MUmVzb3VyY2VJbXBsKW1zZy5nZXROb3RpZmllcigpKS5zeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCQkJCQkoKE5vdGlmaWVyKW1zZy5nZXROb3RpZmllcigpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJfQotCQl9Ci0JCQotCQkKLQotCQotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI5LzIwMDMgLSB1c2VkIGZvciBjb21wYXRpYmlsaXR5Ci0JICogU3ViY2xhc3NlcyBzaG91bGQgYmUgdXNpbmcgdGhlIFJlbmRlcmVycyBhbmQgdHJhbnNsYXRvciBmcmFtZXdvcmsgCi0JICovCi0JcHVibGljIFhNTFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI5LzIwMDMgLSB1c2VkIGZvciBjb21wYXRpYmlsaXR5Ci0JICogU3ViY2xhc3NlcyBzaG91bGQgYmUgdXNpbmcgdGhlIFJlbmRlcmVycyBhbmQgdHJhbnNsYXRvciBmcmFtZXdvcmsgCi0JICovCi0JcHVibGljIFhNTFJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCQotCXB1YmxpYyBYTUxSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgWE1MUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNpbml0aWFsaXplQ29udGVudHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb250ZW50cygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgUm9vdFZlcnNpb25BZGFwdGVyKCkpOwotCX0KLQotCQotCS8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsdCgpIHsKLQkJcmV0dXJuIGlzQWx0OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCX0KLQkvKioKLQkgKiBJcyB0aGlzIGEgcmVzb3VyY2UgbG9hZGVkIGFzIGFuIGFsdGVybmF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I/Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBbHQoYm9vbGVhbiBpc0FsdGVybmF0ZUREKSB7Ci0JCWlzQWx0ID0gaXNBbHRlcm5hdGVERDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gSjJFRV8xXzRfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKiBUaGlzIGlzIHNldHRpbmcgdGhlIG1vZHVsZSB2ZXJzaW9uIG9uIHRoZSByZXNvdXJjZSwgd2hlcmUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgdGhhdCB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaW50IHZlcnNpb24gPSBKMkVFXzFfNF9JRDsKLQkJaWYgKHN5c3RlbUlkID09IG51bGwpIAotCQkJdmVyc2lvbiA9IEoyRUVfMV80X0lEOwotCQllbHNlIGlmIChzeXN0ZW1JZC5lcXVhbHMoZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSkgfHwgc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpKSkKLQkJCXZlcnNpb24gPSBKMkVFXzFfM19JRDsKLQkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpIHx8IHN5c3RlbUlkLmVxdWFscyhnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSkpCi0JCQl2ZXJzaW9uID0gSjJFRV8xXzJfSUQ7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJc2V0SjJFRVZlcnNpb25JRCh2ZXJzaW9uKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3VzZXNEVEQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVzZXNEVEQoKSB7Ci0JCXJldHVybiAoZ2V0VmVyc2lvbklEKCkgPT0gSjJFRV8xXzJfSUQpIHx8IChnZXRWZXJzaW9uSUQoKSA9PSBKMkVFXzFfM19JRCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpCi0JICogQGRlcHJlY2F0ZWQsIFVzZSBzZXRKMkVFVmVyc2lvbklEKCkgdG8gc2V0IG1vZHVsZSB2ZXJzaW9uIGJhc2VkIG9uIGoyZWUgdmVyc2lvbgotCSAqKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXNldEoyRUVWZXJzaW9uSUQoaWQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2V0VmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoYVB1YmxpY0lkLGFTeXN0ZW1JZCk7Ci0JfQotCS8qCi0JICogU2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gYmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKTsKLQkvKgotCSAqIFNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGRpcmVjdGx5Ci0JICogKi8KLQkgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuWE1MUmVzb3VyY2UjaXNKMkVFMV8zKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0oyRUUxXzMoKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uSUQoKSA9PSBKMkVFXzFfM19JRDsKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LCAKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgaWQpIHsKLQkJc2V0RG9jdHlwZVZhbHVlcyhpZCwgZ2V0U3lzdGVtSWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpfSwKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHB1YmxpYyBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgaWQpIHsKLQkJc2V0RG9jdHlwZVZhbHVlcyhnZXRQdWJsaWNJZCgpLCBpZCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCkgewotCQlzd2l0Y2ggKGdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCXJldHVybiBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpOwotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIGdldEoyRUVfMV8zX1B1YmxpY0lEKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQkKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJc3dpdGNoIChnZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQlyZXR1cm4gZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKTsKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKTsKLQkKLQkvKioKLQkgKiBCeSBkZWZhdWx0IGp1c3QgcmV0dXJuIHRoZSBwcm9wZXIgMS4yIHN5c3RlbSBJRCwgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLQkgKiBAcmV0dXJuIGFsdGVybmF0ZSBzdHJpbmcgZm9yIHN5c3RlbSBJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKTsKLQkKLQkvKioKLQkgKiBCeSBkZWZhdWx0IGp1c3QgcmV0dXJuIHRoZSBwcm9wZXIgMS4zIHN5c3RlbSBJRCwgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLQkgKiBAcmV0dXJuIGFsdGVybmF0ZSBzdHJpbmcgZm9yIHN5c3RlbSBJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVzb3VyY2VTZXQoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBOb3RpZmljYXRpb25DaGFpbiBub3RpZmljYXRpb25zKSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgPT0gbnVsbCAmJiB0aGlzLnJlc291cmNlU2V0ICE9IG51bGwpCi0JCQlwcmVEZWxldGUoKTsKLQkJcmV0dXJuIHN1cGVyLmJhc2ljU2V0UmVzb3VyY2VTZXQoYVJlc291cmNlU2V0LCBub3RpZmljYXRpb25zKTsKLQl9Ci0JCQotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRKMkVFVmVyc2lvbklEKCkgYW5kIGdldE1vZHVsZVZlcnNpb25JRCgpCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBnZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCXB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRTsKLQl9CQotCS8qIEFsbCBzdWJjbGFzc2VzIHdpbGwgZGVyaXZlIHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlaXIgbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldEoyRUVWZXJzaW9uSUQoKTsKLQotCQotCi0JLyogVGhpcyB3aWxsIGJlIGNvbXB1dGVkIGR1cmluZyBsb2FkcyBvZiB0aGUgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vZHVsZVZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZlcnNpb25JRCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpIHsKLQkJCi0JCWludCB2ZXIgPSBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKFN0cmluZy52YWx1ZU9mKHZlcikpLm1vdmVQb2ludExlZnQoMSkudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTk2NWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi0KLQotcHVibGljIGNsYXNzIENvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENvbW1vbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUVudlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ29tbW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlRWpiUmVmKEVqYlJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWpiUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlUmVmKFNlY3VyaXR5Um9sZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRW52UmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTG9jYWxSZWYoRUpCTG9jYWxSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUnVuQXNTcGVjaWZpZWRJZGVudGl0eShSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSWRlbnRpdHkoSWRlbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSWNvblR5cGUoSWNvblR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUljb25UeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uKE1lc3NhZ2VEZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXNlQ2FsbGVySWRlbnRpdHkoVXNlQ2FsbGVySWRlbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTGlzdGVuZXIoTGlzdGVuZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVBdHRyaWJ1dGUoSjJFRUVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYlJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lciA8ZW0+TGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZSA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQgPGVtPkVNb2RlbCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50IDxlbT5FTmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudCA8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSA8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgPGVtPkVBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUljb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyYW1WYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwIDxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpORElFbnZSZWZzR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUVudlJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbW1vbkFkYXB0ZXJGYWN0b3J5Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25Td2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyY2Q2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25Td2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tb25Td2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGOiB7Ci0JCQkJRWpiUmVmIGVqYlJlZiA9IChFamJSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVqYlJlZihlamJSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWTogewotCQkJCUVudkVudHJ5IGVudkVudHJ5ID0gKEVudkVudHJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnZFbnRyeShlbnZFbnRyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZW52RW50cnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUY6IHsKLQkJCQlSZXNvdXJjZVJlZiByZXNvdXJjZVJlZiA9IChSZXNvdXJjZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VSZWYocmVzb3VyY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJlc291cmNlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUY6IHsKLQkJCQlTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmID0gKFNlY3VyaXR5Um9sZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlSb2xlUmVmKHNlY3VyaXR5Um9sZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VjdXJpdHlSb2xlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRTogewotCQkJCVNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUgPSAoU2VjdXJpdHlSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZWN1cml0eVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGOiB7Ci0JCQkJUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYgPSAoUmVzb3VyY2VFbnZSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZXNvdXJjZUVudlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUY6IHsKLQkJCQlFSkJMb2NhbFJlZiBlamJMb2NhbFJlZiA9IChFSkJMb2NhbFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCTG9jYWxSZWYoZWpiTG9jYWxSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVqYlJlZihlamJMb2NhbFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiTG9jYWxSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZOiB7Ci0JCQkJUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBydW5Bc1NwZWNpZmllZElkZW50aXR5ID0gKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkocnVuQXNTcGVjaWZpZWRJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2VjdXJpdHlJZGVudGl0eShydW5Bc1NwZWNpZmllZElkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChydW5Bc1NwZWNpZmllZElkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFk6IHsKLQkJCQlJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSWRlbnRpdHkoaWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGlkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFOiB7Ci0JCQkJSWNvblR5cGUgaWNvblR5cGUgPSAoSWNvblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUljb25UeXBlKGljb25UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChpY29uVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRTogewotCQkJCURpc3BsYXlOYW1lIGRpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZGlzcGxheU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRjogewotCQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiBtZXNzYWdlRGVzdGluYXRpb25SZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYobWVzc2FnZURlc3RpbmF0aW9uUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtZXNzYWdlRGVzdGluYXRpb25SZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OOiB7Ci0JCQkJTWVzc2FnZURlc3RpbmF0aW9uIG1lc3NhZ2VEZXN0aW5hdGlvbiA9IChNZXNzYWdlRGVzdGluYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihtZXNzYWdlRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKG1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChtZXNzYWdlRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFOiB7Ci0JCQkJUGFyYW1WYWx1ZSBwYXJhbVZhbHVlID0gKFBhcmFtVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocGFyYW1WYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQOiB7Ci0JCQkJRGVzY3JpcHRpb25Hcm91cCBkZXNjcmlwdGlvbkdyb3VwID0gKERlc2NyaXB0aW9uR3JvdXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVA6IHsKLQkJCQlKTkRJRW52UmVmc0dyb3VwIGpuZGlFbnZSZWZzR3JvdXAgPSAoSk5ESUVudlJlZnNHcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSk5ESUVudlJlZnNHcm91cChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGpuZGlFbnZSZWZzR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGpuZGlFbnZSZWZzR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWTogewotCQkJCVNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9IChTZWN1cml0eUlkZW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5KHNlY3VyaXR5SWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlY3VyaXR5SWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZOiB7Ci0JCQkJVXNlQ2FsbGVySWRlbnRpdHkgdXNlQ2FsbGVySWRlbnRpdHkgPSAoVXNlQ2FsbGVySWRlbnRpdHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVzZUNhbGxlcklkZW50aXR5KHVzZUNhbGxlcklkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5KHVzZUNhbGxlcklkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh1c2VDYWxsZXJJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OOiB7Ci0JCQkJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChkZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FOiB7Ci0JCQkJUU5hbWUgcU5hbWUgPSAoUU5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVFOYW1lKHFOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChxTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSOiB7Ci0JCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChsaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChsaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobGlzdGVuZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQOiB7Ci0JCQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVDogewotCQkJCUoyRUVFT2JqZWN0IGoyRUVFT2JqZWN0ID0gKEoyRUVFT2JqZWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqMkVFRU9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURTogewotCQkJCUoyRUVFQXR0cmlidXRlIGoyRUVFQXR0cmlidXRlID0gKEoyRUVFQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKMkVFRUF0dHJpYnV0ZShqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGoyRUVFQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGoyRUVFQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGoyRUVFQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGoyRUVFQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFamJSZWYoRWpiUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVJvbGVSZWYoU2VjdXJpdHlSb2xlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCTG9jYWxSZWYoRUpCTG9jYWxSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSWRlbnRpdHkoSWRlbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJY29uVHlwZShJY29uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VDYWxsZXJJZGVudGl0eShVc2VDYWxsZXJJZGVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFQXR0cmlidXRlKEoyRUVFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbW1vblN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQxMDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLk1PRkoyRUVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25VdGlsIHsKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChFT2JqZWN0IG8pIHsKLQlyZXR1cm4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QobywgdHJ1ZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoRU9iamVjdCBvLCBib29sZWFuIGluY2x1ZGVFYXJzKSB7Ci0JRU9iamVjdCBtZXRhID0gby5lQ2xhc3MoKTsKLQlyZXR1cm4gKGluY2x1ZGVFYXJzICYmIG1ldGEgPT0gZUNsYXNzQXBwbGljYXRpb24oKSkgfHwKLQkJbWV0YSA9PSBlQ2xhc3NBcHBsaWNhdGlvbkNsaWVudCgpIHx8Ci0JCW1ldGEgPT0gZUNsYXNzRUpCSmFyKCkgfHwKLQkJbWV0YSA9PSBlQ2xhc3NXZWJBcHAoKSB8fAotCQltZXRhID09IGVDbGFzc0Nvbm5lY3RvcigpOwotfQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvKSB7Ci0JcmV0dXJuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8sIHRydWUpOwotfQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvLCBib29sZWFuIGluY2x1ZGVFQVJzKSB7Ci0JaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KQotCQlyZXR1cm4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKEVPYmplY3QpbywgaW5jbHVkZUVBUnMpOwotCXJldHVybiBmYWxzZTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgRUNsYXNzIGVDbGFzc0FwcGxpY2F0aW9uKCkgewotCXJldHVybiBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBcHBsaWNhdGlvbigpOwotfQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzQXBwbGljYXRpb25DbGllbnQoKSB7Ci0JcmV0dXJuIENsaWVudEZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotfQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzRUpCSmFyKCkgewotCXJldHVybiBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RUpCSmFyKCk7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIEVDbGFzcyBlQ2xhc3NXZWJBcHAoKSB7Ci0JcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldFdlYkFwcCgpOwotfQotCi1wcm90ZWN0ZWQgc3RhdGljIEVDbGFzcyBlQ2xhc3NDb25uZWN0b3IoKSB7Ci0JcmV0dXJuIEpjYUZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRDb25uZWN0b3IoKTsKLX0KLS8qKgotICogU2FmZXR5IGNoZWNrIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUgZGQgb2JqZWN0IGNhbiBiZSBjb21wdXRlZC4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRERPYmplY3RGb3JWZXJzaW9uKEVPYmplY3QgZGQpIHsKLQlpZiAoZGQuZUlzUHJveHkoKSkgewotCQlTdHJpbmcgcHJveHlVcmkgPSAoKEludGVybmFsRU9iamVjdClkZCkuZVByb3h5VVJJKCkudG9TdHJpbmcoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUiwgbmV3IE9iamVjdFtde3Byb3h5VXJpfSk7IAotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UpOwotCX0gZWxzZSBpZiAoZGQuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuSjJFRV9WRVJTSU9OX05VTExfRVJST1I7IAotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UpOwotCX0KLX0KLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMWVlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLS8qKgotICogSW50ZXJmYWNlIHVzZWQgZm9yIG9iamVjdHMgdGhhdCBjYW4gYmUgImZsdWZmZWQgdXAiIG9uIGRlbWFuZCwgYnV0IG5vdCBzZXJpYWxpemVkIHVubGVzcyBtb2RpZmllZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0YWJsZSBleHRlbmRzIE5vdGlmaWVyIHsKLXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRlZEFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU0MDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRlZEFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAzLzIyLzAxIDEwOjU0OjIyIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmYXVsdGVkQWRhcHRlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX0tFWSA9ICJERUZBVUxURURfQURBUFRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTm90aWZ5ID0gdHJ1ZTsKLS8qKgotICogRGVmYXVsdGVkQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgRGVmYXVsdGVkQWRhcHRlckltcGwoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBhYnN0cmFjdCBFT2JqZWN0IGRlZmF1bHRDb250YWluZXIoKTsKLXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotfQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVmYXVsdChEZWZhdWx0YWJsZSBvYmplY3QpIHsKLQlEZWZhdWx0b3IgZGVmYXVsdG9yID0gKERlZmF1bHRvcikgcmV0cmlldmVEZWZhdWx0Q29udGFpbmVyRm9yKG9iamVjdCk7Ci0JcmV0dXJuIGRlZmF1bHRvciAhPSBudWxsICYmIGRlZmF1bHRvci5pc0RlZmF1bHQob2JqZWN0KTsKLX0KLQkJCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzEzLzIwMDEgODo0Mzo0MSBQTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICovCi1wdWJsaWMgYm9vbGVhbiBpc05vdGlmeSgpIHsKLQlyZXR1cm4gZk5vdGlmeTsKLX0KLXB1YmxpYyBzdGF0aWMgRGVmYXVsdGVkQWRhcHRlckltcGwgcmV0cmlldmVBZGFwdGVyRm9yKERlZmF1bHRhYmxlIG5vdGlmaWVyKSB7Ci0JcmV0dXJuIChEZWZhdWx0ZWRBZGFwdGVySW1wbClFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG5vdGlmaWVyLEFEQVBURVJfS0VZKTsKLX0KLXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXRyaWV2ZURlZmF1bHRDb250YWluZXJGb3IoRGVmYXVsdGFibGUgbm90aWZpZXIpIHsKLQlEZWZhdWx0ZWRBZGFwdGVySW1wbCBhZGFwdGVyID0gcmV0cmlldmVBZGFwdGVyRm9yKG5vdGlmaWVyKTsKLQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZGVmYXVsdENvbnRhaW5lcigpOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAxIDg6NDM6NDEgUE0pCi0gKiBAcGFyYW0gbmV3Tm90aWZ5IGJvb2xlYW4KLSAqLwotcHVibGljIHZvaWQgc2V0Tm90aWZ5KGJvb2xlYW4gbmV3Tm90aWZ5KSB7Ci0JZk5vdGlmeSA9IG5ld05vdGlmeTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFkZWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzE1LzIwMDEgNDo1ODoxNSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdG9yIHsKLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0cyBjcmVhdGUgQGFEZWZhdWx0YWJsZSBhbmQgaXQgaXMgc3RpbGwKLSAqIGN1cnJlbnRseSBkZWZhdWx0IGFuZCBub3QgY29udGFpbmVkLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTUvMjAwMSA0OjU5OjI4IFBNKQotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gYURlZmF1bHRhYmxlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi51dGlsLkRlZmF1bHRhYmxlCi0gKi8KLWJvb2xlYW4gaXNEZWZhdWx0KERlZmF1bHRhYmxlIGFEZWZhdWx0YWJsZSk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvSURVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9JRFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiY2RkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9JRFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgc2V0dGluZyB1bmlxdWUgaWQncyBmb3IgcmVmIG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiBhIHJlc291cmNlLiAgVGhpcyBpcyBuZWVkZWQKLSAqIHNvbWV0aW1lcyB3aGVuIGEgcmVmb2JqZWN0IGlzIHJlZmVyZW5jZWQgYnkgYW4gb2JqZWN0IGluIGEgc2VwYXJhdGUgcmVzb3VyY2UuICBUaGlzIHV0aWxpdHkgd2lsbCBmb3JjZSB0aGUgcmVmb2JqZWN0IAotICogdG8gbm90aWZ5IGFmdGVyIHRoZSBpZCBnZXRzIHNldCwgdXNpbmcgdGhlIHN0YXRpYyBmZWF0dXJlIG9uIHRoaXMgY2xhc3MuICBUaGUgb2JqZWN0IG11c3QgYmUgY29udGFpbmVkIGluIGEgcmVzb3VyY2UKLSAqIGZvciB0aGUgdXRpbGl0eSBtZXRob2RzIHRvIHdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBJRFV0aWxpdHkgewotCi0vKioKLSAqIElEVXRpbGl0eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSURVdGlsaXR5KCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEdlbmVyYXRlIGEgZGVmYXVsdCBpZCBhbmQgbm90aWZ5LgotICovCi1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwcmltU2V0RGVmYXVsdElEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIElEVXRpbC5nZXRPckFzc2lnbklEKG9iamVjdCk7Ci19Ci0JCi0vKioKLSAqIEdlbmVyYXRlIGEgZGVmYXVsdCBpZCBhbmQgbm90aWZ5LgotICogSGVscGVyIGZvciBkZWZhdWx0IGlkIGdlbmVyYXRpb24gdG8gc3VwcG9ydCBjcm9zcyBkb2N1bWVudCByZWZlcmVuY2VzIHRvIG5vbiB4bWkgcmVzb3VyY2VzCi0gKiAoZWcsIHhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzKTsgY2FsbGVkIGZyb20gb3ZlcnJpZGVuIGFjY2Vzc29ycyBpbiBzZWxlY3RlZCBvYmplY3RzOyAgCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRJRChFT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHByaW1TZXREZWZhdWx0SUQob2JqZWN0KTsKLX0KLQkKLS8qKgotICogR2VuZXJhdGUgYSBkZWZhdWx0IGlkIGFuZCBub3RpZnksIGZvciB0aGlzIG9iamVjdCBhbmQgZm9yIGFsbCByZWZlcmVuY2VkIG9iamVjdHMgdGhhdCBhcmUgY29udGFpbmVkCi0gKiB3aXRoaW4gdGhlIHNhbWUgcmVzb3VyY2UuICBIZWxwZXIgZm9yIGRlZmF1bHQgaWQgZ2VuZXJhdGlvbiB0byBzdXBwb3J0IGNyb3NzIGRvY3VtZW50IHJlZmVyZW5jZXMgdG8gbm9uIHhtaSByZXNvdXJjZXMKLSAqIChlZywgeG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMpOyB1c2VmdWwgZm9yIHBvc3QgY29weS9hZGQgIAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0SUQoRU9iamVjdCBvYmplY3QsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JU3RyaW5nIHJlc3VsdCA9IHByaW1TZXREZWZhdWx0SUQob2JqZWN0KTsKLQotCWlmIChyZWN1cnNlQ2hpbGRyZW4pCi0JCXNldERlZmF1bHRJREZvckNoaWxkcmVuKG9iamVjdCk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJREZvckNoaWxkcmVuKEVPYmplY3Qgb2JqZWN0KSB7Ci0KLQlMaXN0IG9iamVjdHMgPSBvYmplY3QuZUNvbnRlbnRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLnNpemUoKTsgaSsrKXsKLQkJRU9iamVjdCBvID0gKEVPYmplY3Qpb2JqZWN0cy5nZXQoaSk7Ci0JCXByaW1TZXREZWZhdWx0SUQobyk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9YbWxTcGVjaWZpZWREYXRhQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMTkzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9YbWxTcGVjaWZpZWREYXRhQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwNi8wNC8wMSA3OjU2OjIyIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX0tFWSA9ICJYTUxfU1BFQ0lGSUVEX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0vKioKLSAqIFhtbFNwZWNpZmllZERhdGFBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBYbWxTcGVjaWZpZWREYXRhQWRhcHRlcigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiBBREFQVEVSX0tFWS5lcXVhbHModHlwZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ5MWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyBhcGkgdGhlIGNvbW1vbiBtb2RlbCBhcnRpZmFjdHMgdGhhdCBpbmNsdWRlIChSZXNvdXJjZSBSZWZlcmVuY2VzLCBFSkIgUmVmZXJlbmNlcywgRGlzcGxheSBOYW1lLCBEZXNjcmlwdGlvbiBHcm91cCwgU2VjdXJpdHkgcm9sZXMsIEVudmlyb25tZW50IHZhcmlhYmxlcykuIAotICAgICAgICAgVXNpbmcgdGhpcyBhcGkgdGhlIGNvbW1vbiBtb2RlbCBhcnRpZmFjdHMgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkIGluIGFueSBqMmVlIG1vZHVsZXMgKEVudGVycHJpc2UgQXBwbGljYXRpb24sIEFwcGxpY2F0aW9uIENsaWVudCwgV2ViIEFwcCwgRUpCIEFwcCwgQ29ubmVjdG9ycykuCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY2tub3dsZWRnZU1vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY2tub3dsZWRnZU1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwMmM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWNrbm93bGVkZ2VNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBBY2tub3dsZWRnZU1vZGUge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFja25vd2xlZGdlTW9kZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0FDS05PV0xFREdFPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUFNfT0tfQUNLTk9XTEVER0U9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BdXRvIEFja25vd2xlZGdlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QXV0byBBY2tub3dsZWRnZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVVRPX0FDS05PV0xFREdFCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFja25vd2xlZGdlTW9kZSBBVVRPX0FDS05PV0xFREdFX0xJVEVSQUwgPSBuZXcgQWNrbm93bGVkZ2VNb2RlKEFVVE9fQUNLTk9XTEVER0UsICJBdXRvLWFja25vd2xlZGdlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkR1cHMgT2sgQWNrbm93bGVkZ2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EdXBzIE9rIEFja25vd2xlZGdlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RVUFNfT0tfQUNLTk9XTEVER0UKLQkgKlRPRE86IGdlbmVyYXRlIGNvcnJlY3RseQotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY2tub3dsZWRnZU1vZGUgRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMID0gbmV3IEFja25vd2xlZGdlTW9kZShEVVBTX09LX0FDS05PV0xFREdFLCAiRHVwcy1vay1hY2tub3dsZWRnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+QWNrbm93bGVkZ2UgTW9kZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNrbm93bGVkZ2VNb2RlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEFja25vd2xlZGdlTW9kZVtdIHsKLQkJCUFVVE9fQUNLTk9XTEVER0VfTElURVJBTCwKLQkJCURVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFja25vd2xlZGdlTW9kZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUFja25vd2xlZGdlTW9kZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY2tub3dsZWRnZU1vZGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBY2tub3dsZWRnZU1vZGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY2tub3dsZWRnZU1vZGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEFVVE9fQUNLTk9XTEVER0U6IHJldHVybiBBVVRPX0FDS05PV0xFREdFX0xJVEVSQUw7Ci0JCQljYXNlIERVUFNfT0tfQUNLTk9XTEVER0U6IHJldHVybiBEVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFja25vd2xlZGdlTW9kZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi0JcHJpdmF0ZSBBY2tub3dsZWRnZU1vZGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHZhbHVlLCBuYW1lLCBuYW1lKTsKLQl9Ci0KLX0gLy9BY2tub3dsZWRnZU1vZGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWN0aXZhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI5ZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIGV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotICogaW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uCi0gKiBhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKLSAqIGRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLSAqIAotICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCi0gKiBuYW1lL3ZhbHVlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAqIAotICogVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBtZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbmZpZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZiYjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLSAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotICogCi0gKiBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAqIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50Ci0JICogICAgICAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0JICogICAgICAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0JICogICAgICAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0JICogCi0JICogICAgICAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0JICogICAgICAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAotCSAqICAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NjBhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci0KLS8qKgotICogVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLiBBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibHlEZXNjcmlwdG9yIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBtZXRob2QgcGVybWlzc2lvbiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgcm9sZXMgaW4gc2VjdXJpdHlSb2xlcyBhbmQKLQkgKiBpcyB0aGUgc2FtZSBzaXplCi0JICogQHBhcmFtICBzZWN1cml0eVJvbGVzIHRoZSBsaXN0IG9mIFNlY3VyaXR5Um9sZQotCSAqIEByZXR1cm4gVGhlIE1ldGhvZFBlcm1pc3Npb24KLQkgKi8KLQlNZXRob2RQZXJtaXNzaW9uIGdldE1ldGhvZFBlcm1pc3Npb24oTGlzdCBzZWN1cml0eVJvbGVzKTsKLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIGZvciBAYW5FSkIgZ29pbmcKLQkgKiB0aHJvdWdoIHRoZSBNZXRob2RQZXJtaXNzaW9ucy4KLQkgKiBAcGFyYW0gYW5FSkIgdGhlIEVudGVycHJpc2UgQmVhbiBtb2RlbAotCSAqIEByZXR1cm4gTGlzdCBvZiBNZXRob2RFbGVtZW50Ci0JICovCi0JTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIGZvciBAYW5FSkIgZ29pbmcKLQkgKiB0aHJvdWdoIHRoZSBNZXRob2RUcmFuc2FjdGlvbnMuCi0JICogQHBhcmFtIGFuRUpCIHRoZSBFbnRlcnByaXNlIEJlYW4gbW9kZWwKLQkgKiBAcmV0dXJuIExpc3Qgb2YgTWV0aG9kRWxlbWVudAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgU2VjdXJpdHlSb2xlIGdpdmVuIGEgcm9sZU5hbWUKLQkgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvbGUKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Um9sZQotCSAqLwkKLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyByb2xlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUsIGlmIGl0IGV4aXN0cwotCSAqIEBwYXJhbSBleGlzdGluZ1JvbGVOYW1lIHRoZSBleGlzdGluZyByb2xlIG5hbWUKLQkgKiBAcGFyYW0gbmV3Um9sZU5hbWUgdGhlIG5ldyByb2xlIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RQZXJtaXNzaW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kVHJhbnNhY3Rpb25zIHJlZmVyZW5jZXMKLQkgKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotCSAqIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZQotCSAqIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQlFSkJKYXIgZ2V0RWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlY3VyaXR5Um9sZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEV4Y2x1ZGVMaXN0IHJlZmVyZW5jZQotCSAqLwotCUV4Y2x1ZGVMaXN0IGdldEV4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXhjbHVkZUxpc3QgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBNZXRob2RFbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2luZyBAYW5FSkIuCi0JICogQHBhcmFtIGFuRUpCIHRoZSBFbnRlcnByaXNlIEJlYW4gbW9kZWwKLQkgKi8KLQl2b2lkIHJlbW92ZURhdGEoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9DTVBBdHRyaWJ1dGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9DTVBBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlZDY1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01QQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZTsKLS8qKgotICogRGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01QQXR0cmlidXRlIGV4dGVuZHMgSjJFRUVBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBXaXRoIEVKQiAyLjAsIGFzc3VtaW5nIGEgSmF2YSBmaWVsZCBpcyBubyBsb25nZXIgc2FmZS4KLQkgKiAJCVVzZSBnZXRUeXBlKCkgYW5kIGdldE5hbWUoKSB0byBnZXQgdGhlIG1vc3QgY29tbW9uIGZpZWxkIGluZm8uCi0JICoJCU9yIHVzZSBnZXRFamJDbGFzcygpIHRvIGdldCBhZGRpdGlvbmFsIEphdmEgaW5mby4KLQkgKkByZXR1cm4gdGhlIEZpZWxkIHZhbHVlCi0JICovCi0KLQlGaWVsZCBnZXRGaWVsZCgpIDsKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYXR0cnJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZQotCSAqLwotCVN0cmluZyBnZXRHZXR0ZXJOYW1lKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYXR0cmlidXRlIGluIGl0cyBvcmlnaW5hbCBmb3JtIChpLmUuLCB1bndyYXBwZWQgaWYKLQkgKiB0aGUgdHlwZSBoYXMgYmVlbiB3cmFwcGVkKS4KLQkgKiBAcmV0dXJuIEphdmFIZWxwZXJzIHZhbHVlCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldE9yaWdpbmF0aW5nVHlwZSgpIDsKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYXR0cnJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZQotCSAqLwotCVN0cmluZyBnZXRTZXR0ZXJOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBUeXBlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBKYXZhSGVscGVycwotCSAqLwotCUphdmFIZWxwZXJzIGdldFR5cGUoKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYSBDTVIgZmllbGQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzQ01SRmllbGQoKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdGhlIGtleSBmaWVsZCBvZiB0aGUgYmVhbgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaXNLZXkoKSA7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaXMgYSBwcmlta2V5LWZpZWxkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltS2V5RmllbGQoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBvcmlnaW5hdGluZyBKYXZhIHR5cGUKLQkgKiBAcGFyYW0gbmV3T3JpZ2luYXRpbmdUeXBlIHRoZSBKYXZhSGVscGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yaWdpbmF0aW5nVHlwZShKYXZhSGVscGVycyBuZXdPcmlnaW5hdGluZ1R5cGUpIDsKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgY21yIGZpZWxkLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSB0YXJnZXRBdHRyaWJ1dGUgZXhpc3RzLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaXNEZXJpdmVkKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlIGFzIGEgZGVyaXZlZCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYUJvb2xlYW4gdGhlIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQl2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBhQm9vbGVhbik7Ci0JCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01SRmllbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9DTVJGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmMyMTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9DTVJGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6Om5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjp0eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBDTVJGaWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQgKGEgamF2YSBjbGFzcyBuYW1lKS4KLSAqIAotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBDTVJGaWVsZCBleHRlbmRzIENNUEF0dHJpYnV0ZXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmEgQ29sbGVjdGlvblR5cGUgbmFtZQotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGphdmEgY29sbGVjdGlvbiB0eXBlCi0JICovCi0JcHVibGljICBTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7ICAKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBqYXZhIGNvbGxlY3Rpb24gdHlwZSBuYW1lCi0JICogQHBhcmFtIHR5cGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGNvbGxlY3Rpb24gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25UeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJvbGUgcmVmZXJlbmNlCi0JICovCi0JRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBDb2xsZWN0aW9uVHlwZSByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0Q29sbGVjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb2xsZWN0aW9uVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENvbGxlY3Rpb25UeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzczMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzI2LzIwMDEgOToyNDoyNyBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uUmVsYXRpb25zaGlwIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgRUxpc3Qgb2YgdGhlIGNvbW1vbiByb2xlcwotCSAqIEByZXR1cm4gRUxpc3QgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbW1vblJvbGVzKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgY29tbW9uIHJvbGUKLQkgKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Rmlyc3RDb21tb25Sb2xlKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2Vjb25kIGNvbW1vbiByb2xlCi0JICogQHJldHVybiBDb21tb25SZWxhdGlvbnNoaXBSb2xlCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kQ29tbW9uUm9sZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIENvbW1vblJlbGF0aW9uc2hpcAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgQ29tbW9uUmVsYXRpb25zaGlwCi0JICogQHBhcmFtIHZhbHVlIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyNWNiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8yNi8yMDAxIDk6MjQ6MjcgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZXh0ZW5kcyBFT2JqZWN0IHsKLS8qKgotICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlcyBmcm9tIG15IEVudGl0eSB0aGF0IGFyZSB1c2VkCi0gKiBieSB0aGlzIHJvbGUuCi0gKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBDb21tb25SZWxhdGlvbnNoaXBSb2xlCi0gKi8KLQotcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZXMoKTsKLS8qKgotICogUmV0dXJuIG91ciBwYXJlbnQgcmVsYXRpb25zaGlwIGFzIGEgQ29tbW9uUmVsYXRpb25zaGlwCi0gKiBAcmV0dXJuIHRoZSBDb21tb25SZWxhdGlvbnNoaXAgcmVmZXJlbmNlCi0gKi8KLQotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcCBnZXRDb21tb25SZWxhdGlvbnNoaXAoKTsKLQotCi0vKioKLQotICogRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIGEgcm9sZS4KLSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIGFjdHVhbCBuYW1lIG9mIHRoaXMgcm9sZS4gIFRoaXMgaXMgdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgRGVwbG95bWVudAotICogRGVzY3JpcHRvci4gIFlvdSBzaG91bGQgdXNlIDxjb2RlPmdldE5hbWUoKTwvY29kZT4gZm9yIHRoZSBuYW1lIHRvIHVzZSBpbiBjb2RlCi0gKiBnZW5lcmF0aW9uLgotICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSAKLSAqLwotU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLSAqIEByZXR1cm4gQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByZWZlcmVuY2UKLSAqLwotCi1Db21tb25SZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgOwotLyoqCi0gKiBAcmV0dXJuIFRoZSBTb3VyY2UgZWpiCi0gKiBDb21wdXRlIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLgotICogQHJldHVybiAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSByZWZlcmVuY2UKLSAqLwotcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0U291cmNlRW50aXR5KCk7Ci0KLS8qKgotICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgdHlwZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuCi0gKiBAcmV0dXJuIFRoZSB0eXBlIGVqYiAKLSAqLwotcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0VHlwZUVudGl0eSgpOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc0ZvcndhcmQgYXR0cmlidXRlCi0qIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcm9sZSBzaG91bGQgYmUgbWFwcGVkIHRvIGEgcGVyc2lzdGVudCByZWZlcmVuY2UsIHN1Y2ggYXMgYSBmb3JlaWduIGtleS4KLSovCi1wdWJsaWMgYm9vbGVhbiBpc0ZvcndhcmQoKTsKLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGtleSAKLSAqIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIGlzS2V5Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzS2V5KCk7Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYXMgYSBoaW50IGFib3V0IHRoZSBrZXkgc3RhdHVzIG9mIHRoZSByb2xlLgotICogQHBhcmFtIGFCb29sZWFuIHRoZSBib29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyB2b2lkIHNldEtleShib29sZWFuIGFCb29sZWFuKSA7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgaXNNYW55Ci0qIFJldHVybnMgd2hldGhlciB0aGUgdXBwZXIgbGltaXQgb2Ygb3VyIG11bHRpcGxpY2l0eSBpcyA+IDEKLSovCi1wdWJsaWMgYm9vbGVhbiBpc01hbnkoKTsKLQotLyoqCi0qIAotKiBzZXRzIHRoZSB1cHBlciBsaW1pdCBvZiBvdXIgbXVsdGlwbGljaXR5Ci0qIEBwYXJhbSB1cHBlckJvdW5kIHRoZSBpbnQgdmFsdWUgb2YgdGhlIG11bHRpcGxpY2l0eQotKi8KLXB1YmxpYyB2b2lkIHNldFVwcGVyKGludCB1cHBlckJvdW5kKTsKLQotLyoqCi0qIAotKiBzZXRzIHRoZSBsb3dlciBsaW1pdCBvZiBvdXIgbXVsdGlwbGljaXR5Ci0qIEBwYXJhbSBsb3dlckJvdW5kIHRoZSBpbnQgdmFsdWUgaWYgdGhlIG11bHRpcGxpY2l0eQotKi8KLXB1YmxpYyB2b2lkIHNldExvd2VyKGludCBsb3dlckJvdW5kKTsKLQotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc05hdmlnYWJsZSBhdHRyaWJ1dGUKLSogU3BlY2lmaWVzIHRoYXQgYWNjZXNzb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgcmVsYXRpb25zaGlwIHJvbGUuCi0qLwotcHVibGljIGJvb2xlYW4gaXNOYXZpZ2FibGUoKTsKLQotLyoqCi0gKiBHZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhIGdpdmVuIENNUEF0dHJpYnV0ZQotICogQHBhcmFtIHJvbGVBdHRyaWJ1dGUgdGhlIENNUEF0dHJpYnV0ZQotICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0QXR0cmlidXRlCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QXR0cmlidXRlTmFtZShDTVBBdHRyaWJ1dGUgcm9sZUF0dHJpYnV0ZSk7Ci0KLS8qKgotICogQ29sbGVjdHMgdGhlIGF0dHJpYnV0ZXMKLSAqCi0gKi8KLXZvaWQgcmVjb25jaWxlQXR0cmlidXRlcygpOwotCS8qKgotCSAqIE1ldGhvZCBpc1JlcXVpcmVkLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaXNSZXF1aXJlZCgpOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOWJkMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZXh0ZW5kcyBFbnRpdHl7Ci0KLQkvKioKLQkgKiBEZW5vdGVzIDEueCB2ZXJzaW9uIG9mIHRoZSBDTVAgQmVhbgotCSAqLwotCVN0cmluZyBWRVJTSU9OXzFfWCA9ICIxLngiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRGVub3RlcyAyLnggdmVyc2lvbiBvZiB0aGUgQ01QIEJlYW4KLQkgKi8KLQlTdHJpbmcgVkVSU0lPTl8yX1ggPSAiMi54IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBXQVNfR0VORVJBVEVEX1NUUklOR19LRVkgPSAiY29tLmlibS53cy5lamJwZXJzaXN0ZW5jZS5kYXRhYWNjZXNzLkdlbmVyYXRlZFN0cmluZ1BLIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBXQVNfR0VORVJBVEVEX1NUUklOR19GSUVMRCA9ICJ3YXNHZW5Vbmtub3dua2V5VmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2V0IHRvIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlTdHJpbmcgVU5LTk9XTl9QUklNQVJZX0tFWSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNldCB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIEpBVkFfTEFOR19TVFJJTkcgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgREVSSVZFRF9GTEFHX0NIQU5HRSA9IDMwMTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQ01QQXR0cmlidXRlIHdpdGggYU5hbWUgYW5kIGFkZCBpdCB0byB0aGUga2V5QXR0cmlidXRlcyAgICAgCi0JICogb2YgdGhlIGJlYW4KLQkgKiBAcGFyYW0gYU5hbWUgdGhlIG5hbWUgb2YgdGhlIGtleSBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBDTVBBdHRyaWJ1dGUgYWRkS2V5QXR0cmlidXRlTmFtZShTdHJpbmcgYU5hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuYW1lIGZvciBhRmllbGQuCi0JICogQHBhcmFtIGFGaWVsZCBhIHJlZmVyZW5jZSBvZiB0eXBlIEZpZWxkCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ01QQXR0cmlidXRlIGFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoRmllbGQgYUZpZWxkKSA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIENNUEF0dHJpYnV0ZSB3aXRoIGFOYW1lIGFuZCBhZGQgaXQgdG8gdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBhTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDTVBBdHRyaWJ1dGUgYWRkUGVyc2lzdGVudEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGFOYW1lKSA7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXlBdHRyaWJ1dGUgd2l0aCBhTmFtZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC84LzIwMDAgOToyNToyNyBQTSkKLQkgKiBAcmV0dXJuIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JQ01QQXR0cmlidXRlIGdldEtleUF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIDsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgd2l0aCBhTmFtZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC84LzIwMDAgOToyNToyNyBQTSkKLQkgKiBAcmV0dXJuIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JQ01QQXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSA7Ci0JLyoqCi0JICogSWYgYSBwcmltYXJ5IGtleSBleGlzdHMsIHJldHVybiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGU7IHRoZSBwcmltYXJ5IGtleSBpcyBkZWZpbmVkIGFzIG9uZSBhbmQgb25seSBvbmUKLQkgKiBrZXkgYXR0cmlidXRlLCB3aG9zZSB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBrZXkgY2xhc3MKLQkgKiBAcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBDTVBBdHRyaWJ1dGUKLQkgKiBAZGVwcmVjYXRlZCAtIFVzZSBnZXRQcmltS2V5RmllbGQoKQotCSAqLwotCUNNUEF0dHJpYnV0ZSBnZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgd2hlbiBpbnZva2VkIG9uIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlICAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNUCBpcyBvZiB2ZXJzaW9uIDEuWAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfWCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01QIGlzIG9mIHZlcnNpb24gMi5YCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuQXR0cmlidXRlIGlzIGEga2V5IGF0dHJpYnV0ZSBvZiB0aGUgQ01QCi0JICogQHBhcmFtIGFuQXR0cmlidXRlIGEgYXR0cmlidXRlIG9mIHRoZSBDTVAgb2YgdHlwZSBDTVBBdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0tleUF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgYmVhbiByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIHRoZSAidW5rbm93biBwcmltYXJ5IGtleSIgY2FzZQotCSAqIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoaXMgaXMgaWRlbnRpZmllZCBieSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MKLQkgKiBiZWluZyBzcGVjaWZpZWQgYXMgImphdmEubGFuZy5PYmplY3QiLgotCSAqIEluIG9yZGVyIHRvIGRlcGxveSBhbiB1bmtub3duIHByaW1hcnkga2V5IGJlYW4sIHdlIG11c3Qgc3Vic3RpdHV0ZSBhIHJlYWwga2V5LAotCSAqIGFuZCBhZGQgYSBjb3JyZXNwb25kaW5nIGZpZWxkLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5rbm93blByaW1hcnlLZXkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIFBlcnNpc3RlbnQgRmllbGQgTmFtZXMKLQkgKiBAcmV0dXJuIGFuIFN0cmluZyBhcnJheSBvZiBuYW1lcyAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gbGlzdFBlcnNpc3RlbnRGaWVsZE5hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBhRmllbGQgZnJvbSB0aGUgbGlzdCBvZiBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gYUZpZWxkIHRoZSBGaWVsZCByZWZlcmVuY2UKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZSByZWZlcmVuY2UKLQkgKi8KLQotCUNNUEF0dHJpYnV0ZSByZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKEZpZWxkIGFGaWVsZCkgOwotCS8qKgotCSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lZCBhTmFtZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yLzIwMDAgODo1OTozMiBQTSkKLQkgKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gQ01QQXR0cmlidXRlIHJlZmVyZW5jZQotCSAqLwotCUNNUEF0dHJpYnV0ZSByZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IDEueCAsIDIueAotCSAqIEBkZWZhdWx0IDIueAotCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93cyB0aGlzIGV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGluIGdldHRpbmcgdmVyc2lvbiBvZiB0aGUgQ01QCi0JKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIENNUCByZXByZXNlbnRlZCBpbiBpbnQgdHlwZSAKLQkqLwotCXB1YmxpYyBpbnQgZ2V0Q01QVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEFic3RyYWN0U2NoZW1hTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIAotCSAqIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZQotCSAqIGlzIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCSAqIAotCi0JICovCi0JU3RyaW5nIGdldEFic3RyYWN0U2NoZW1hTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFic3RyYWN0U2NoZW1hTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEFic3RyYWN0U2NoZW1hTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQZXJzaXN0ZW50QXR0cmlidXRlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgS2V5QXR0cmlidXRlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0S2V5QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IG1vdmVkIGZyb20gQ01FCi0JICogVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0JICogCi0JICogQGludmFyaWFudCBzZWUgZGVzY3JpcHRpb24KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0RW50aXR5Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSIgb3Bwb3NpdGU9ImVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNNUCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9DTVBBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDTVBBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW0gS2V5IEZpZWxkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltIEtleSBGaWVsZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltIEtleSBGaWVsZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJpbUtleUZpZWxkKENNUEF0dHJpYnV0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUHJpbUtleUZpZWxkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ01QQXR0cmlidXRlIGdldFByaW1LZXlGaWVsZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0UHJpbUtleUZpZWxkIDxlbT5QcmltIEtleSBGaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByaW1LZXlGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpbUtleUZpZWxkKENNUEF0dHJpYnV0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIFF1ZXJ5IG1ldGhvZHMgZm9yIHRoZSBIb21lIGFuZCBMb2NhbCBIb21lIGludGVyZmFjZXMuCi0JICogQHJldHVybiBMaXN0IG9mIEZpbmQgUXVlcnkgTWV0aG9kcwotCSAqLwotCUxpc3QgZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpIDsKLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIFF1ZXJ5IG1ldGhvZHMgZm9yIHRoZSBCZWFuIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdCBvZiBTZWxlY3QgUXVlcnkgTWV0aG9kcwotCSAqLwotCUxpc3QgZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCwgc29ydGVkIGJ5IHNpZ25hdHVyZSwgb2YgYWxsIHRoZSBhdmFpbGFibGUgUXVlcnkgbWV0aG9kcyAKLQkgKiBvbiB0aGUgcmVtb3RlIEhvbWUsIGxvY2FsIEhvbWUsIG9yIGVqYlNlbGVjdCBtZXRob2RzIG9uIHRoZSBiZWFuIGNsYXNzCi0JICogQHJldHVybiBMaXN0IG9mIFF1ZXJ5IG1ldGhvZHMKLQkgKi8KLQlMaXN0IGdldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgRUpCRXh0ZW5zaW9uRmlsdGVyCi0JICogQHBhcmFtIGFGaWx0ZXIgYSByZWZlcmVuY2Ugb2YgdHlwZSBFSkJFeHRlbnNpb25GaWx0ZXIKLQkgKiBAcmV0dXJuIExpc3Qgb2YgZmlsdGVyZWQgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEZlYXR1cmVzKEVKQkV4dGVuc2lvbkZpbHRlciBhRmlsdGVyKTsKLQkKLQkvKioKLQkgKiBNYWtlcyB0aGUgcHJpbWFyeSBLZXkgRmllbGQgcHJveHkuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYWtlUHJpbUtleUZpZWxkUHJveHkoKTsKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIENNUiBGaWVsZHMKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGFsbCBDTVIgZmllbGRzIGZvciB0aGlzIGJlYW4uCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q01SRmllbGRzKCk7Ci0JLyoqCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgcm9sZXMgd2hlcmUgdGhpcyBiZWFuIGlzIHRoZSBzb3VyY2UuCi0JICogQGxpbmsgQ29tbW9uUmVsYXRpb25zaGlwUm9sZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzcGVjaWZpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHdoaWNoIGhhcyBhIG5hbWVkIHJvbGUKLQkgKiB0aGF0IGlzIGVxdWFsIHRvIDxjb2RlPnJvbGVOYW1lPC9jb2RlPi4KLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLQkgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIHJvbGUgbmFtZSAKLQkgKiBAcmV0dXJuIGEgcmVmZXJlbmNlIHRvIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKFN0cmluZyByb2xlTmFtZSk7Ci0JCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRGVzdGluYXRpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRGVzdGluYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmIzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgRGVzdGluYXRpb25UeXBlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXN0aW5hdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFVUU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QSUM9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5RdWV1ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlF1ZXVlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1FVRVVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZXN0aW5hdGlvblR5cGUgUVVFVUVfTElURVJBTCA9IG5ldyBEZXN0aW5hdGlvblR5cGUoUVVFVUUsICJRdWV1ZSIsICJRdWV1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ub3BpYzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRvcGljPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RPUElDCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZXN0aW5hdGlvblR5cGUgVE9QSUNfTElURVJBTCA9IG5ldyBEZXN0aW5hdGlvblR5cGUoVE9QSUMsICJUb3BpYyIsICJUb3BpYyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IERlc3RpbmF0aW9uVHlwZVtdIHsKLQkJCVFVRVVFX0xJVEVSQUwsCi0JCQlUT1BJQ19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVzdGluYXRpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGVzdGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlc3RpbmF0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURlc3RpbmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlc3RpbmF0aW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgUVVFVUU6IHJldHVybiBRVUVVRV9MSVRFUkFMOwotCQkJY2FzZSBUT1BJQzogcmV0dXJuIFRPUElDX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlc3RpbmF0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vRGVzdGluYXRpb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCRXh0ZW5zaW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCRXh0ZW5zaW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDIxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkV4dGVuc2lvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzE6NTMgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkV4dGVuc2lvbkZpbHRlciB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBvbmUgb2YgdGhlIHByb3BlcnRpZXMgdXNpbmcgYSBGaWx0ZXIKLQkgKiBAcGFyYW0gZWpiIHJlZmVyZW5jZSB0byB0aGUgRW50ZXJwcmlzZSBCZWFuIG1vZGVsCi0JICogQHJldHVybiBMaXN0Ci0JICovCQotCUxpc3QgZmlsdGVyKEVudGVycHJpc2VCZWFuIGVqYikgOwotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJKYXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhZGVhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCSmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotCi0vKioKLSAqIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGU7IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZQotICogbmFtZTsgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkIGVudGVycHJpc2UgYmVhbnM7IGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55OyBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yOyBhbmQgYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCSmFyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB7Ci0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBib29sZWFuIHZhbHVlCi0gKi8KLWJvb2xlYW4gY29udGFpbnNDb250YWluZXJNYW5hZ2VkQmVhbnMoKSA7Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHNlY3VyaXR5IHJvbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50Ci0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICogQHJldHVybiBib29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQmVhbk1hbmFnZWQgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLUxpc3QgZ2V0QmVhbk1hbmFnZWRCZWFucygpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKSA7Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAxLjEgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgRUpCIDIuMCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgOwotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBNZXNzYWdlRHJpdmVuIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldE1lc3NhZ2VEcml2ZW5CZWFucygpIDsKLS8qKgotICogQHJldHVybiBUaGUgbGlzdCBvZiBFamJSZWxhdGlvbnMgcmVmZXJlbmNlcwotICogQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLSAqLwotcHVibGljIExpc3QgZ2V0RWpiUmVsYXRpb25zKCk7Ci0vKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiAgVGhlIGVqYi1saW5rIHZhbHVlCi0gKiBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuCi0gKiBudWxsCi0gKiBAcGFyYW0gcmVmIHJlZmVyZW5jZSB0byB0aGUgRWpiUmVmCi0gKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgRW50ZXJwcmlzZUJlYW4gbW9kZWwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpOwotCi0vKioKLSAqIFJldHVybiB0aGUgZW50ZXJwcmlzZSBiZWFuIG1vZGVsIHdoaWNoIGhhcyB0aGUgYmVhbiBuYW1lIG9mIGVqYk5hbWUKLSAqIEBwYXJhbSBlamJOYW1lIHRoZSBuYW1lIG9mIHRoZSBFbnRlcnByaXNlIEJlYW4KLSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBFbnRlcnByaXNlQmVhbiBtb2RlbAotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChTdHJpbmcgZWpiTmFtZSk7Ci0vKioKLSAqIFJldHVybiBBTEwgRW50ZXJwcmlzZUJlYW4ocykgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFKYXZhQ2xhc3MgYXMgYQotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKiBAcGFyYW0gYUphdmFDbGFzcyBhIHJlZmVyZW5jZSBvZiB0eXBlIEphdmFDbGFzcwotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbgotICovCi1MaXN0IGdldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLS8qKgotICogUmV0dXJuIHRoZSAqRklSU1QqIEVudGVycHJpc2VCZWFuIHRoYXQgaXMgcmVmZXJlbmNpbmcgQGFKYXZhQ2xhc3MgYXMgaXRzCi0gKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLSAqIEBwYXJhbSBhSmF2YUNsYXNzIGEgcmVmZXJuY2Ugb2YgdHlwZSBKYXZhQ2xhc3MKLSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIEVudGVycHJpc2VCZWFuIG1vZGVsCi0gKi8KLUVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuV2l0aFJlZmVyZW5jZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgOwotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBTZXNzaW9uIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbgotICovCi1MaXN0IGdldFNlc3Npb25CZWFucygpIDsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEVKQiBKQVIgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEVKQiAxLjEgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1ib29sZWFuIGlzVmVyc2lvbjFfMURlc2NyaXB0b3IoKSA7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBFSkIgSkFSIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBFSkIgMi4wIGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotYm9vbGVhbiBpc1ZlcnNpb24yXzBEZXNjcmlwdG9yKCkgOwotLyoqCi0gKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgY29udGFpbmVkIGluIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yOyBmb3IgZWFjaCBlbnRlcnByaXNlIGJlYW4sIGZpeCB0aGUgcm9sZS1saW5rIG9uIGFueSBjb250YWluZWQgcm9sZQotICogcmVmcwotICogQHBhcmFtIGV4aXN0aW5nUm9sZU5hbWUgdGhlIG9sZCBuYW1lIG9mIHRoZSBTZWN1cml0eSBSb2xlCi0gKiBAcGFyYW0gbmV3Um9sZU5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBTZWN1cml0eSBSb2xlCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKTsKLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKkB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgZ2V0dGluZyB0aGUgdmVyc2lvbgotCSAqQHJldHVybiB0aGUgajJlZSB2ZXJzaW9uIG9mIHRoZSBFbnRlcnByaXNlIEJlYW4gaW4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRWpiQ2xpZW50SmFyIGF0dHJpYnV0ZQotCSAqIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlCi0JICogY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbgotCSAqIHRoZSBlamItamFyIGZpbGUuIFRoZSBEZXBsb3llciBzaG91bGQgbWFrZSB0aGUgZWpiLWNsaWVudCBKQVIgZmlsZSBhY2Nlc3NpYmxlCi0JICogdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gCi0JICogRXhhbXBsZTo8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyPC8vZWpiLWNsaWVudC1qYXI+Ci0KLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xpZW50SmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiQ2xpZW50SmFyIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICogICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLQkgKiAgICAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICogICAgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotCSAqICAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotCSAqICAgICBzY2hlbWEuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX1ZlcnNpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZSBnZXR0aW5nIHRoZSBzcGVjIHZlcnNpb24gb2YgdGhlIGJlYW4gCi0JICogQHJldHVybiB0aGUgc3BlYyB2ZXJzaW9uIG9mIHRoZSBFbnRlcnByaXNlQmVhbiwgMTEsIDIwLCAyMSAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBBc3NlbWJseURlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFbnRlcnByaXNlQmVhbnMgcmVmZXJlbmNlcwotCSAqIFRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotCSAqIGVudGVycHJpc2UgYmVhbnMuCi0JICovCi0JRUxpc3QgZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqIFRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lcgotCSAqIG1hbmFnZWQgcGVyc2lzdGVuY2UgZW50aXR5IGJlYW5zIGFuZCBkZXBlbmRlbnQgb2JqZWN0cyBwYXJ0aWNpcGF0ZS4gVGhlCi0JICogcmVsYXRpb25zaGlwcyBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhIGxpc3Qgb2YKLQkgKiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbgotCSAqIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgYnV0IHdob3NlIGFic3RyYWN0IHBlcnNpc3RlbmNlIHNjaGVtYXMgYXJlIG5vdAotCSAqIGluY2x1ZGVkIGluIHRoZSBlamItamFyIGZpbGUpOwotCSAqIGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZAotCSAqIHJlbGF0aW9uc2hpcHMuCi0JICovCi0JUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVsYXRpb25zaGlwTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEVKQlJlbGF0aW9uc2hpcFJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIDxjb2RlPmFSb2xlTmFtZTwvY29kZT4KLQkgKiB0aGF0IGhhcyA8Y29kZT5zb3VyY2VDTVA8L2NvZGU+IGFzIGl0cyBzb3VyY2UgYmVhbi4KLQkgKiBAcGFyYW0gYVJvbGVOYW1lIHRoZSByb2xlIG5hbWUKLQkgKiBAcGFyYW0gc291cmNlQ01QIHJlZmVyZW5jZSB0byBDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JICogQHJldHVybiBhIHJlZmVyZW5jZSB0byBFSkJSZWxhdGlvbnNoaXBSb2xlCi0JICovCi0JRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSZWxhdGlvbnNoaXBSb2xlKFN0cmluZyBhUm9sZU5hbWUsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc291cmNlQ01QKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBFSkJSZWxhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgPGNvZGU+YVJlbGF0aW9uTmFtZTwvY29kZT4uCi0JICogQHBhcmFtIGFSZWxhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uCi0JICogQHJldHVybiBhIHJlZmVyZW5jZSB0byBFSkJSZWxhdGlvbgotCSAqLwotCUVKQlJlbGF0aW9uIGdldEVKQlJlbGF0aW9uKFN0cmluZyBhUmVsYXRpb25OYW1lKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBFSkJSZWxhdGlvbiBvYmplY3RzIHRoYXQgaGF2ZSBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggYQotCSAqIHNvdXJjZSBFSkIgb2YgPGNvZGU+Y21wPC9jb2RlPi4KLQkgKiBAcGFyYW0gY21wIHJlZmVyZW5jZSB0byBDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JICogQHJldHVybiBMaXN0IG9mIEVKQlJlbGF0aW9uCi0JICovCi0JTGlzdCBnZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApOwotCQotCS8qKgotCSAqIFJldHVybiBhbGwgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3RzIHRoYXQgaGF2ZSBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggYQotCSAqIHR5cGUgRUpCIG9mIDxjb2RlPmNtcDwvY29kZT4uCi0JICogQHBhcmFtIGNtcCByZWZlcmVuY2UgdG8gQ29udGFpbmVyTWFuYWdlZEVudGl0Ci0JICogQHJldHVybiBMaXN0IG9mIEVKQlJlbGF0aW9uc2hpcFJvbGUKLQkgKi8KLQlMaXN0IGdldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgOwotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQk1ldGhvZENhdGVnb3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCTWV0aG9kQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkMWY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCTWV0aG9kQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFSkJNZXRob2RDYXRlZ29yeSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvL0VKQk1ldGhvZENhdGVnb3J5Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyZjQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlLiBBbiBlamItcmVsYXRpb24gZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVzLiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIAotICogQGludmFyaWFudCBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlcy5zaXplID09IDIKLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1swXS5uYW1lICE9IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMV0ubmFtZQotICogCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBNb3ZlZCBmcm9tIGVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgdW5kZXIgZWpiZXh0OjpFSkJKYXJFeHRlbnNpb24KLSAqIEBtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgZGVzY3JpcHRpb246U3RyaW5nCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIG5hbWU6U3RyaW5nIChNYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIEVPYmplY3QgcHJldmlvdXNseSkKLSAqIEBzaW5jZSAxLjAgCi0gKiBAZ2VuZXJhdGVkCi0gKiBAZXh0ZW5kcyBDb21tb25SZWxhdGlvbnNoaXAKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJSZWxhdGlvbiBleHRlbmRzIEoyRUVFT2JqZWN0LCBDb21tb25SZWxhdGlvbnNoaXAgewotCi1ib29sZWFuIGNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSA7Ci1FSkJSZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Um9sZSgpIDsKLS8qKgotICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotICovCi0KLUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGVSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIDsKLUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kUm9sZSgpIDsKLS8qKgotICogU2V0IHRoZSBmb3J3YXJkIHJvbGUuCi0gKi8KLQotdm9pZCBzZXRGb3dhcmQoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBlamIgcmVsYXRpb24uCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBJZiBzcGVjaWZpZWQsIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotCSAqIGZpbGUuCi0JICogQGludmFyaWFudCBzZWxmLm5hbWUgdW5pcXVlIHdpdGhpbiBTZXQ8Y29sbGVjdChlamJKYXIuZWpiUmVsYXRpb25zLm5hbWUpPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJlbGF0aW9uc2hpcExpc3QgcmVmZXJlbmNlCi0JICovCi0JUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUmVsYXRpb25zaGlwUm9sZXMgcmVmZXJlbmNlcwotCSAqIEEgY29sbGVjdGlvbiBjb250YWluaW5nIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlcy4KLQkgKiAKLQkgKiBAbWlncmF0aW9uIEVKQjEuMSBDb250YWlubWVudCB1c2VkIHRvIGJlIGJ5IHJlZmVyZW5jZSBvbiByZWxhdGlvbi0tbm93IGJ5IHZhbHVlLgotCi0JICovCi0JRUxpc3QgZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyA8Y29kZT5hUm9sZU5hbWU8L2NvZGU+LgotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lKSA7Ci19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYzc4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYSByZWxhdGlvbnNoaXAuCi0gKiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7IHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4gVGhlIG11bHRpcGxpY2l0eSBhbmQgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4gVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5LWJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZiBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhhdCBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAKLSAqIEBpbnZhcmlhbnQgbXVsdGlwbGljaXR5ICE9IG51bGwKLSAqIEBpbnZhcmlhbnQgcm9sZVNvdXJjZSAhPSBudWxsCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHJvbGVTb3VyY2UgZWxlbWVudCBzcGVjaWZpZXMgYSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLiAKLSAqIEBpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiA8ZWpiLXJlbGF0aW9uPgotICogICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvL2VqYi1yZWxhdGlvbi1uYW1lPgotICogICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICogICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXM8Ly9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAqICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvL211bHRpcGxpY2l0eT4KLSAqICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICAgICAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8Ly9lamItbmFtZT4KLSAqICAgICA8Ly9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gKiAgIDwvL2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqIC4uLgotICogQHNpbmNlIDEuMCAKLSAqIEBnZW5lcmF0ZWQKLSAqIEBleHRlbmRzIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJSZWxhdGlvbnNoaXBSb2xlIGV4dGVuZHMgSjJFRUVPYmplY3QsIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgewotCi0vKioKLSAqIEByZXR1cm4gVGhlIGxvZ2ljYWwgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbmFtaW5nIHRoaXMgcm9sZS4KLSAqIFJlcXVpcmVkIHRvIGJlIHVuaXF1ZSB3aXRoaW4gYSBKQVIuCi0gKiBJZiBhIGNtci1maWVsZCBpcyBkZWZpbmVkLCB0aGVuIGEgbmFtZSBpbiB0aGUgZm9ybSAlc291cmNlLWVqYi1uYW1lJV8lY21yLWZpZWxkLW5hbWUlIGlzIGNvbXB1dGVkLgotICogT3RoZXJ3aXNlIGEgZGVmYXVsdCBJRCBpcyBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbE5hbWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotICovCi0KLUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGUoKSA7Ci0vKioKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyB0aGUgdW5pcXVlIG5hbWUgZm9yIHRoaXMgcm9sZQotICogKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKTsKLS8qKgotICogQHJldHVybiBUaGUgU291cmNlIGVqYgotICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gCi0gKi8KLXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldFNvdXJjZUVudGl0eSgpOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc0ZvcndhcmQgYXR0cmlidXRlCi0qIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcm9sZSBzaG91bGQgYmUgbWFwcGVkIHRvIGEgcGVyc2lzdGVudCByZWZlcmVuY2UsIHN1Y2ggYXMgYSBmb3JlaWduIGtleS4KLSovCi1wdWJsaWMgYm9vbGVhbiBpc0ZvcndhcmQoKTsKLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBpc01hbnkKLSogUmV0dXJucyB3aGV0aGVyIHRoZSB1cHBlciBsaW1pdCBvZiBvdXIgbXVsdGlwbGljaXR5IGlzID4gMQotKi8KLXB1YmxpYyBib29sZWFuIGlzTWFueSgpOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc05hdmlnYWJsZSBhdHRyaWJ1dGUKLSogU3BlY2lmaWVzIHRoYXQgYWNjZXNzb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgcmVsYXRpb25zaGlwIHJvbGUuCi0qLwotcHVibGljIGJvb2xlYW4gaXNOYXZpZ2FibGUoKTsKLS8qKgotICogU2V0IHRoaXMgcm9sZSB0byBiZSB0aGUgZm9yd2FyZCByb2xlLgotICovCi0KLXZvaWQgc2V0Rm93YXJkKCkgOwotCi1wdWJsaWMgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgdW5pcXVlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIGVqYiByZWxhdGlvbnNoaXAgcm9sZS4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKiBEZWZpbmVzIGEgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudAotCSAqIHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQkgKiAKLQkgKiBUaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JICogICAgICBPbmUKLQkgKiAgICAgIE1hbnkKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kCi0JICogQHNlZSAjaXNTZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXVsdGlwbGljaXR5S2luZCBnZXRNdWx0aXBsaWNpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQKLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNdWx0aXBsaWNpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ2FzY2FkZURlbGV0ZSBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZQotCSAqIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlCi0JICogY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4gQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbgotCSAqIEVKQlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIGluIGFuIEVKQnJlbGF0aW9uIGluIHdoaWNoIHRoZSBvdGhlcgotCSAqIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCSAqIAotCSAqIAotCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVEZWxldGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDYXNjYWRlRGVsZXRlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZURlbGV0ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjaXNDYXNjYWRlRGVsZXRlIDxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q2FzY2FkZURlbGV0ZSgpCi0JICogQHNlZSAjaXNDYXNjYWRlRGVsZXRlKCkKLQkgKiBAc2VlICNzZXRDYXNjYWRlRGVsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0Q2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNpc0Nhc2NhZGVEZWxldGUgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENhc2NhZGVEZWxldGUoKQotCSAqIEBzZWUgI2lzQ2FzY2FkZURlbGV0ZSgpCi0JICogQHNlZSAjc2V0Q2FzY2FkZURlbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldENhc2NhZGVEZWxldGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJlbGF0aW9uc2hpcCByZWZlcmVuY2UKLQkgKi8KLQlFSkJSZWxhdGlvbiBnZXRSZWxhdGlvbnNoaXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlbGF0aW9uc2hpcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJlbGF0aW9uc2hpcChFSkJSZWxhdGlvbiB2YWx1ZSk7Ci0KLQl2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gaXNSZXF1aXJlZCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU291cmNlIHJlZmVyZW5jZQotCSAqIERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLQkgKiByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLgotCSAqIEBtaWdyYXRpb24gRUpCMS4xOiB3YXMgaWJtZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlOjpzb3VyY2VFSkJOYW1lLCBidXQgdGhhdAotCSAqIG1heSBub3QgYmUgc3VmZmljaWVudCwgYXMgdGhpcyBjYW4gbm93IHJlZmVyIHRvIGRlcGVuZGVudCBjbGFzcyBuYW1lcyBvciBlamIKLQkgKiByZWZzCi0JICovCi0JUm9sZVNvdXJjZSBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShSb2xlU291cmNlIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENtckZpZWxkIHJlZmVyZW5jZQotCSAqIEEgZGVjbGFyYXRpb24gb2YgdGhlIENNUkZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZQotCSAqIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UKLQkgKiAKLQkgKiBAbWlncmF0aW9uIEVKQjEuMTogVXNlZCB0byBiZSBoYW5kbGVkIHZpYSBpYm1lamJleHQ6OkVqYlJvbGU6OmF0dHJpYnV0ZXMgbGlzdAotCSAqLwotCUNNUkZpZWxkIGdldENtckZpZWxkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDbXJGaWVsZCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENtckZpZWxkKENNUkZpZWxkIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHJvbGUgaXMgcGFydCBvZiB0aGUga2V5IG9mIHRoZSBzb3VyY2UgRUpCLgotCSAqLwotCWJvb2xlYW4gaXNLZXkoKTsKLQkKLQkvKioKLQkgKiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBSb2xlIGFzIGJlaW5nIGtleSBzbyBpdCB3aWxsCi0JICogbm90IHRyYXZlcnNlIGl0IGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGtleS4KLQkgKi8KLQl2b2lkIHNldEtleShib29sZWFuIGFCb29sZWFuKSA7Ci0JCi0Jdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKCkgOwotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhMWI0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZSB7Ci0JRUpCSmFyIGdldEVKQkphcigpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2Ugc3VwcG9ydHMgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKi8KLQlib29sZWFuIGlzRUpCMV8xKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBzdXBwb3J0cyB0aGUgRUpCIDIuMCBzcGVjLgotCSAqLwotCWJvb2xlYW4gaXNFSkIyXzAoKTsKLQkvKioKLQkgKiBTZXRzIHRoZSBiYXRjaE1vZGUuCi0JICogQHBhcmFtIGJhdGNoTW9kZSBUaGUgYmF0Y2hNb2RlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpOwotCS8qKgotCSAqIEdldHMgdGhlIGJhdGNobW9kZSAtIGZyb20gdGhlIHJlbmRlcmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZWQzOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFamJGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBNZXRob2RFbGVtZW50IGZyb20gdGhlIGdpdmVuIHNpZ25hdHVyZQotCSAqIEBwYXJhbSBhU2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgb2YgdGhlIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQgcmVmZXJlbmNlCi0JICovCi0JTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KFN0cmluZyBhU2lnbmF0dXJlKSA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIE1ldGhvZEVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9mIGEgTWV0aG9kCi0JICogQHBhcmFtIG1ldGhvZCB0aGUgcmVmZXJlbmNlIG9mIGEgTWV0aG9kCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHJlZmVyZW5jZQotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oTWV0aG9kIG1ldGhvZCkgOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBNZXRob2RFbGVtZW50IGZyb20gdGhlIGdpdmVuIHJlZmVyZW5jZSBvZiBhIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotCSAqIEBwYXJhbSBtZXRob2QgcmVmZXJlbmNlIG9mIGEgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHJlZmVyZW5jZQotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kUGVybWlzc2lvbiB2YWx1ZQotCSAqLwotCU1ldGhvZFBlcm1pc3Npb24gY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZFRyYW5zYWN0aW9uIHZhbHVlCi0JICovCi0JTWV0aG9kVHJhbnNhY3Rpb24gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRW50aXR5IHZhbHVlCi0JICovCi0JRW50aXR5IGNyZWF0ZUVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250YWluZXJNYW5hZ2VkRW50aXR5IHZhbHVlCi0JICovCi0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCUNNUEF0dHJpYnV0ZSBjcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ01SRmllbGQgdmFsdWUKLQkgKi8KLQlDTVJGaWVsZCBjcmVhdGVDTVJGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJSZWxhdGlvbnNoaXBSb2xlIHZhbHVlCi0JICovCi0JRUpCUmVsYXRpb25zaGlwUm9sZSBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQlJlbGF0aW9uIHZhbHVlCi0JICovCi0JRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVsYXRpb25zaGlwcyB2YWx1ZQotCSAqLwotCVJlbGF0aW9uc2hpcHMgY3JlYXRlUmVsYXRpb25zaGlwcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJKYXIgdmFsdWUKLQkgKi8KLQlFSkJKYXIgY3JlYXRlRUpCSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVTb3VyY2UgdmFsdWUKLQkgKi8KLQlSb2xlU291cmNlIGNyZWF0ZVJvbGVTb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUXVlcnkgdmFsdWUKLQkgKi8KLQlRdWVyeSBjcmVhdGVRdWVyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBRdWVyeU1ldGhvZCB2YWx1ZQotCSAqLwotCVF1ZXJ5TWV0aG9kIGNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHZhbHVlCi0JICovCi0JTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2x1ZGVMaXN0IHZhbHVlCi0JICovCi0JRXhjbHVkZUxpc3QgY3JlYXRlRXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvbiB2YWx1ZQotCSAqLwotCVNlc3Npb24gY3JlYXRlU2Vzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXNzYWdlRHJpdmVuIHZhbHVlCi0JICovCi0JTWVzc2FnZURyaXZlbiBjcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiB2YWx1ZQotCSAqLwotCU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCTWV0aG9kQ2F0ZWdvcnkgdmFsdWUKLQkgKi8KLQlFSkJNZXRob2RDYXRlZ29yeSBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJQYWNrYWdlIGdldEVqYlBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjllODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgSW50ZXJmYWNlIHR5cGUgSE9NRQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgSE9NRSA9IE1ldGhvZEVsZW1lbnRLaW5kLkhPTUU7Ci0JLyoqCi0JICogU3BlY2lmaWVzIHRoZSBJbnRlcmZhY2UgdHlwZSBSRU1PVEUKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IFJFTU9URSA9IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URTsKLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIEludGVyZmFjZSB0eXBlIExPQ0FMX0hPTUUKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUUgPSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FOwotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgSW50ZXJmYWNlIHR5cGUgTE9DQUwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUw7Ci0JLyoqCi0JICogVGhlIEludGVyZmFjZSB0eXBlIGlzIHVuc3BlY2lmaWVkCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRCA9IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yLgotCSAqLwotCXB1YmxpYyBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gYXJndW1lbnRzIGZvciBvcmRlci4KLQkgKiBAc2VlIENvbXBhcmF0b3IjY29tcGFyZShPYmplY3QsIE9iamVjdCkKLQkgKkBwYXJhbSBvMSB0aGUgZmlyc3Qgb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0JICpAcGFyYW0gMDIgdGhlIHNlY29uZCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKkByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIGNvbXBhcmUoKE1ldGhvZEVsZW1lbnQpIG8xLCAoTWV0aG9kRWxlbWVudCkgbzIpOwotCX0KLQkvKioKLQkgKiBTb3J0IGJ5IHR5cGUgZmlyc3QgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkgKiBIb21lLCBSZW1vdGUsIExvY2FsSG9tZSwgTG9jYWwsIFVuc3BlY2lmaWVkCi0JICogVGhlbiBhbHBoYWJldGljYWxseSBvcmRlci4KLQkgKgotCSAqIEBwYXJhbSBtZTEgdGhlIGZpcnN0IG9iamVjdCB0byBiZSBjb21wYXJlZAotCSAqIEBwYXJhbSBtZTIgdGhlIHNlY29uZCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyCi0JICovCi0JcHJvdGVjdGVkIGludCBjb21wYXJlKE1ldGhvZEVsZW1lbnQgbWUxLCBNZXRob2RFbGVtZW50IG1lMikgewotCQlpbnQgdHlwZTEsIHR5cGUyOwotCQl0eXBlMSA9IG1lMS5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJdHlwZTIgPSBtZTIuZ2V0VHlwZSgpLmdldFZhbHVlKCk7Ci0JCWlmICh0eXBlMSA9PSB0eXBlMikKLQkJCXJldHVybiBjb21wYXJlU2lnbmF0dXJlcyhtZTEsIG1lMik7Ci0JCXJldHVybiBjb21wYXJlVHlwZXModHlwZTEsIHR5cGUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZTEgdGhlIGZpcnN0IG9iamVjdCB0byBiZSBjb21wYXJlZAotCSAqIEBwYXJhbSB0eXBlMiB0aGUgc2Vjb25kIG9iamVjdCB0byBiZSBjb21wYXJlZAotCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXBhcmVUeXBlcyhpbnQgdHlwZTEsIGludCB0eXBlMikgewotCQlpZiAodHlwZTEgPT0gSE9NRSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHR5cGUxID09IFJFTU9URSkgewotCQkJaWYgKHR5cGUyID09IEhPTUUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHR5cGUxID09IExPQ0FMX0hPTUUpIHsKLQkJCWlmICh0eXBlMiA9PSBIT01FIHx8IHR5cGUyID09IFJFTU9URSkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodHlwZTEgPT0gTE9DQUwpIHsKLQkJCWlmICh0eXBlMiA9PSBIT01FIHx8IHR5cGUyID09IFJFTU9URSB8fCB0eXBlMiA9PSBMT0NBTF9IT01FKQotCQkJCXJldHVybiAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICh0eXBlMSA9PSBVTlNQRUNJRklFRCkgewotCQkJaWYgKHR5cGUyID09IEhPTUUgfHwgdHlwZTIgPT0gUkVNT1RFIHx8IHR5cGUyID09IExPQ0FMX0hPTUUgfHwgdHlwZTIgPT0gTE9DQUwpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gbWUxIHRoZSBmaXJzdCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKiBAcGFyYW0gbWUyIHRoZSBzZWNvbmQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0JICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlcgotCSAqLwotCXByb3RlY3RlZCBpbnQgY29tcGFyZVNpZ25hdHVyZXMoTWV0aG9kRWxlbWVudCBtZTEsIE1ldGhvZEVsZW1lbnQgbWUyKSB7Ci0JCVN0cmluZyBzaWcxLCBzaWcyOwotCQlzaWcxID0gbWUxLmdldFNpZ25hdHVyZSgpOwotCQlzaWcyID0gbWUyLmdldFNpZ25hdHVyZSgpOwotCQlyZXR1cm4gc2lnMS5jb21wYXJlVG8oc2lnMik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1YjI1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogQHNpbmNlIDEuMAotICogVXNlZCB0byBzb3J0IGFuZCBmaWx0ZXIgbWV0aG9kIGVsZW1lbnQgbGlzdHMKLSAqLwotcHVibGljIGNsYXNzIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIgewotCS8qKgotCSAqIFVzZWQgdG8gZmlsdGVyIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfTUVUSE9EUyA9IDA7Ci0JLyoqCi0JICogVXNlZCB0byBmaWx0ZXIgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTUVfTUVUSE9EUyA9IDE7Ci0JLyoqCi0JICogVXNlZCB0byBmaWx0ZXIgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NRVRIT0RTID0gMjsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFX01FVEhPRFMgPSAzOwotCS8qKgotCSAqIFVzZWQgdG8gZmlsdGVyIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9NRVRIT0RTID0gNDsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfSE9NRV9NRVRIT0RTID0gNTsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVNT1RFX01FVEhPRFMgPSA2OwotCS8qKgotCSAqIGEgTWV0aG9kRWxlbWVudCBjb21wYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGRlZmF1bHRNRUNvbXBhcmF0b3I7Ci0JLyoqCi0JICogYSBNZXRob2RFbGVtZW50IGNvbXBhcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yOwotCXByaXZhdGUgc3RhdGljIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIgc2luZ2xldG9uOwotCS8qKgotCSAqIFVzZWQgdG8gZmlsdGVyIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVEhPRF9OQU1FID0gIioiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VMRU1FTlRfTkFNRSA9ICJNZXRob2RFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBoZWxwZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgRWpiTWV0aG9kRWxlbWVudEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGhlbHBlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiTWV0aG9kRWxlbWVudEhlbHBlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBFamJNZXRob2RFbGVtZW50SGVscGVyKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kRWxlbWVudHNFcXVhbChNZXRob2RFbGVtZW50IG1lMSwgTWV0aG9kRWxlbWVudCBtZTIpIHsKLQkJcmV0dXJuIChtZTEuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKG1lMi5nZXRTaWduYXR1cmUoKSkgCi0JCQkJJiYgbWUxLmdldEVudGVycHJpc2VCZWFuKCkgPT0gbWUyLmdldEVudGVycHJpc2VCZWFuKCkgCi0JCQkJJiYgbWUxLmdldE1ldGhvZFBhcmFtcygpLmVxdWFscyhtZTIuZ2V0TWV0aG9kUGFyYW1zKCkpIAotCQkJCSYmIG1lMS5nZXRUeXBlKCkgPT0gbWUyLmdldFR5cGUoKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kRWxlbWVudGluTGlzdChMaXN0IG1lTGlzdCwgT2JqZWN0IG1lKSB7Ci0JCWlmICghIChtZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lTGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKG1lTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1lTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKGlzTWV0aG9kRWxlbWVudHNFcXVhbChlbGVtZW50LCAoTWV0aG9kRWxlbWVudCltZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBhIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGdldERlZmF1bHRNRUNvbXBhcmF0b3IoKSB7Ci0JCWlmIChkZWZhdWx0TUVDb21wYXJhdG9yID09IG51bGwpCi0JCQlkZWZhdWx0TUVDb21wYXJhdG9yID0gbmV3IEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBkZWZhdWx0TUVDb21wYXJhdG9yOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIGEgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkgewotCQlpZiAoZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID09IG51bGwpCi0JCQlkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3IgPSBuZXcgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBzb21lUXVlcmllcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4Y2x1ZGVRdWVyeU1ldGhvZHMoTGlzdCByZXN1bHQsIExpc3Qgc29tZVF1ZXJpZXMpIHsKLQkJaWYgKHNvbWVRdWVyaWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBzb21lUXVlcmllcy5zaXplKCk7Ci0JCUxpc3QgbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCVF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXF1ZXJ5ID0gKFF1ZXJ5KSBzb21lUXVlcmllcy5nZXQoaSk7Ci0JCQltZXRob2RzLmFkZChxdWVyeS5nZXRRdWVyeU1ldGhvZCgpKTsKLQkJfQotCQlleGNsdWRlTWV0aG9kRWxlbWVudHMocmVzdWx0LCBtZXRob2RzKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNtcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHNFeGNsdWRpbmdFeGlzdGluZyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZiAoY21wID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBjbXAuZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0JCUxpc3QgZXhpc3RpbmcgPSBjbXAuZ2V0UXVlcmllcygpOwotCQlleGNsdWRlUXVlcnlNZXRob2RzKHJlc3VsdCwgZXhpc3RpbmcpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHVybiBmaW5kZXIgbWV0aG9kcyB3aXRoIGZpbHRlcgotCSAqIEBwYXJhbSBjbXAgYmVhbiB0byBleGNsdWRlCi0JICogQHJldHVybiBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHNFeGNsdWRpbmdFeGlzdGluZyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZiAoY21wID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBjbXAuZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpOwotCQlMaXN0IGV4aXN0aW5nID0gY21wLmdldFF1ZXJpZXMoKTsKLQkJZXhjbHVkZVF1ZXJ5TWV0aG9kcyhyZXN1bHQsIGV4aXN0aW5nKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBiZWFuIHVzZWQgdG8gc2VhcmNoCi0JICogQHJldHVybiBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4aXN0aW5nT3JBdmFpbGFibGVUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKEVPYmplY3Qgb2JqZWN0LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZU1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhiZWFuKSk7Ci0JCXVuaW9uTWV0aG9kRWxlbWVudHMocmVzdWx0LCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKG9iamVjdCwgYmVhbikpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgZ2V0RGVmYXVsdE1FQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHJlZk9iamVjdAotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nTWV0aG9kRWxlbWVudHMoRU9iamVjdCByZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKHJlZk9iamVjdCAhPSBudWxsKSB7Ci0JCQlFamJQYWNrYWdlIHBhY2sgPSBnZXRFamJQYWNrYWdlKCk7Ci0JCQlpZiAocmVmT2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKSkKLQkJCQlyZXR1cm4gKChNZXRob2RUcmFuc2FjdGlvbikgcmVmT2JqZWN0KS5nZXRNZXRob2RFbGVtZW50cyhiZWFuKTsKLQkJCWlmIChyZWZPYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2RQZXJtaXNzaW9uKCkpCi0JCQkJcmV0dXJuICgoTWV0aG9kUGVybWlzc2lvbikgcmVmT2JqZWN0KS5nZXRNZXRob2RFbGVtZW50cyhiZWFuKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNvdXJjZU1ldGhvZEVsZW1lbnRzCi0JICogQHBhcmFtIGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaW9uTWV0aG9kRWxlbWVudHMoTGlzdCBzb3VyY2VNZXRob2RFbGVtZW50cywgTGlzdCBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgYWRkaXRpb25hbE1FOwotCQlpbnQgc291cmNlU2l6ZSwgYWRkU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJYWRkU2l6ZSA9IGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkU2l6ZSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRTaXplOyBpKyspIHsKLQkJCWZvdW5kID0gZmFsc2U7Ci0JCQlhZGRpdGlvbmFsTUUgPSAoTWV0aG9kRWxlbWVudCkgYWRkaXRpb25hbE1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCXNvdXJjZU1FID0gbnVsbDsKLQkJCWZvciAoaW50IGlpID0gMDsgaWkgPCBzb3VyY2VTaXplOyBpaSsrKSB7Ci0JCQkJc291cmNlTUUgPSAoTWV0aG9kRWxlbWVudCkgc291cmNlTWV0aG9kRWxlbWVudHMuZ2V0KGlpKTsKLQkJCQlpZiAoc291cmNlTUUuaXNFcXVpdmFsZW50KGFkZGl0aW9uYWxNRSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpCi0JCQkJZm91bmRFbGVtZW50cy5hZGQoc291cmNlTUUpOwotCQl9Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLnJlbW92ZUFsbChmb3VuZEVsZW1lbnRzKTsKLQkJc291cmNlTWV0aG9kRWxlbWVudHMuYWRkQWxsKGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cyk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZU1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbHRlcmVkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJaWYgKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgZ2V0RW50aXR5TWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZE1ldGhvZHMoKEVudGl0eSkgYmVhbiwgUkVNT1RFX01FVEhPRFMpKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMLCBiZWFuKSk7Ci0JCQl9Ci0JCQlpZiAoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKChFbnRpdHkpIGJlYW4sIEhPTUVfTUVUSE9EUykpOwotCQkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTWV0aG9kRWxlbWVudHMoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoZmlsdGVyZWRNZXRob2RzKSwgTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMLCBiZWFuKSk7Ci0JCQl9Ci0JCQlpZiAoYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJlZE1ldGhvZHMgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkuZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgZ2V0RW50aXR5TWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZE1ldGhvZHMoKEVudGl0eSkgYmVhbiwgTE9DQUxfTUVUSE9EUykpOwotCQkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTWV0aG9kRWxlbWVudHMoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoZmlsdGVyZWRNZXRob2RzKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpKTsKLQkJfSBlbHNlIGlmIChiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQlpZiAoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJZmlsdGVyZWRNZXRob2RzID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKS5nZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhnZXRTZXNzaW9uTWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZENsYXNzZXMoKFNlc3Npb24pIGJlYW4sIFJFTU9URV9NRVRIT0RTKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVNZXRob2RFbGVtZW50cyhnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhmaWx0ZXJlZE1ldGhvZHMpLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJZmlsdGVyZWRNZXRob2RzID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKGdldFNlc3Npb25NZXRob2RUcmFuc2FjdGlvbkV4Y2x1ZGVkQ2xhc3NlcygoU2Vzc2lvbikgYmVhbiwgTE9DQUxfTUVUSE9EUyksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTWV0aG9kRWxlbWVudHMoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoZmlsdGVyZWRNZXRob2RzKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJcmVzdWx0LmFkZChiZWFuLmdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKS5nZXQoMCkpOwotCQl9IGVsc2UgaWYgKGJlYW4uaXNNZXNzYWdlRHJpdmVuKCkpIHsKLQkJCWZpbHRlcmVkTWV0aG9kcyA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde2dldE1ldGhvZChiZWFuLmdldEVqYkNsYXNzKCksIGdldE1EQk1ldGhvZF9TaWcoKSl9KTsKLQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5jcmVhdGVNZXRob2RFbGVtZW50cyhmaWx0ZXJlZE1ldGhvZHMsIGJlYW4uZ2V0RWpiQ2xhc3MoKSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKExpc3QgbWV0aG9kcykgewotCQlMaXN0IHNpZ25hdHVyZXMsIHNhbWVOYW1lczsKLQkJc2FtZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSArIDEpOwotCQlzaWduYXR1cmVzLmFkZChERUZBVUxUX01FVEhPRF9OQU1FKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChzYW1lTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAoIXNpZ25hdHVyZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJCXNpZ25hdHVyZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJfSBlbHNlCi0JCQkJc2FtZU5hbWVzLmFkZChtZXRob2ROYW1lKTsKLQkJCXNpZ25hdHVyZXMuYWRkKGFNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIG1ldGhvZCBlbGVtZW50cyBvbiBFSkIKLQkgKiBAcGFyYW0gc2lnbmF0dXJlcyAtIExpc3Qgb2YgbWV0aG9kIHNpZ3MKLQkgKiBAcGFyYW0gYVR5cGUgLSBUaGUgZW51bSB0eXBlCi0JICogQHBhcmFtIGJlYW4gLSBFSkIgYmVhbiBwYXNzZWQKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNpZ25hdHVyZXMsIEVudW1lcmF0b3IgYVR5cGUsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNpZ25hdHVyZXMsIGFUeXBlLCBiZWFuKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFamJQYWNrYWdlIGdldEVqYlBhY2thZ2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotCQlyZXR1cm4gKChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBtZXRob2QgZWxlbWVudHMgd2l0aCBNRSB0eXBlIG5hbWUKLQkgKiBAcGFyYW0gbWVUeXBlTmFtZSBUaGUgTUUgdHlwZQotCSAqIEBwYXJhbSBzaWduYXR1cmVzIGxpc3Qgb2YgbWV0aG9kIHNpZ25hdHVyZXMKLQkgKiBAcGFyYW0gYVR5cGUgLSBlbnVtIHR5cGUKLQkgKiBAcGFyYW0gYmVhbiAtIEVKQiBiZWFuCi0JICogQHJldHVybiBMaXN0IG9mIGNyZWF0ZWQgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhTdHJpbmcgbWVUeXBlTmFtZSwgTGlzdCBzaWduYXR1cmVzLCBFbnVtZXJhdG9yIGFUeXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWludCBzaXplID0gc2lnbmF0dXJlcy5zaXplKCk7Ci0JCUxpc3QgbWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlTdHJpbmcgc2lnbmF0dXJlOwotCQlNZXRob2RFbGVtZW50IG1lOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc2lnbmF0dXJlID0gKFN0cmluZykgc2lnbmF0dXJlcy5nZXQoaSk7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlKChFQ2xhc3MpIGdldEVqYlBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihtZVR5cGVOYW1lKSk7Ci0JCQltZS5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotCQkJbWUuc2V0RW50ZXJwcmlzZUJlYW4oYmVhbik7Ci0JCQltZS5zZXRUeXBlKChNZXRob2RFbGVtZW50S2luZCkgYVR5cGUpOwotCQkJbWV0aG9kRWxlbWVudHMuYWRkKG1lKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCS8qKgotCSAqIEdldCBsaXN0IG9mIE1URSdzIGV4Y2x1ZGluZyBiZWFuCi0JICogQHBhcmFtIGVudGl0eSAtIGV4Y2x1ZGVkIGJlYW4KLQkgKiBAcGFyYW0gdHlwZSAtIGZpbHRlciBvbiBtZXRob2QgdHlwZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIExpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RW50aXR5TWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZE1ldGhvZHMoRW50aXR5IGVudGl0eSwgaW50IHR5cGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAoUkVNT1RFX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCUphdmFDbGFzcyBhQ2xhc3MgPSBnZXRFSkJPYmplY3RDbGFzcyhlbnRpdHkpOwotCQkJCQlhQ2xhc3MuZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChleGNsdWRlTWV0aG9kcyhhQ2xhc3MsIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde2dldE1ldGhvZChhQ2xhc3MsIGdldFJlbW90ZVJlbW92ZU1ldGhvZF9TaWcoKSl9KSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlIChIT01FX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCUphdmFDbGFzcyBhQ2xhc3MgPSBnZXRFSkJIb21lQ2xhc3MoZW50aXR5KTsKLQkJCQkJYUNsYXNzLmdldENsYXNzSW1wb3J0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117Z2V0TWV0aG9kKGFDbGFzcywgZ2V0RWpiR2V0TWV0YURhdGFNZXRob2RfU2lnKCkpLCBnZXRNZXRob2QoYUNsYXNzLCBnZXRFamJHZXRIb21lSGFuZGxlTWV0aG9kX1NpZygpKX0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSAoTE9DQUxfTUVUSE9EUykgOgotCQkJCXsKLQkJCQkJSmF2YUNsYXNzIGFDbGFzcyA9IGdldEVKQkxvY2FsT2JqZWN0Q2xhc3MoZW50aXR5KTsKLQkJCQkJYUNsYXNzLmdldENsYXNzSW1wb3J0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZXhjbHVkZU1ldGhvZHMoYUNsYXNzLCBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtnZXRNZXRob2QoYUNsYXNzLCBnZXRMb2NhbFJlbW92ZU1ldGhvZF9TaWcoKSl9KSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogR2V0IFNlc3Npb24gTUUgbGlzdCBleGNsdXNpbmcgc2Vzc2lvbiBiZWFucwotCSAqIEBwYXJhbSBzZXNzaW9uIC0gZXhjbHVkbmcgYmVhbnMKLQkgKiBAcGFyYW0gdHlwZSAtIEludGVyZmFjZSB0eXBlCi0JICogQHJldHVybiAtIGxpc3Qgb2YgTUUncwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlc3Npb25NZXRob2RUcmFuc2FjdGlvbkV4Y2x1ZGVkQ2xhc3NlcyhTZXNzaW9uIHNlc3Npb24sIGludCB0eXBlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBhbGxJbnRlcmZhY2VzOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgKFJFTU9URV9NRVRIT0RTKSA6Ci0JCQkJewotCQkJCQljbGFzc05hbWUgPSBnZXRFSkJPYmplY3RDbGFzc05hbWUoKTsKLQkJCQkJYWxsSW50ZXJmYWNlcyA9IHNlc3Npb24uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS50b0FycmF5KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0SW50ZXJmYWNlcyhhbGxJbnRlcmZhY2VzLCBjbGFzc05hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSAoTE9DQUxfTUVUSE9EUykgOgotCQkJCXsKLQkJCQkJY2xhc3NOYW1lID0gZ2V0RUpCTG9jYWxPYmplY3RDbGFzc05hbWUoKTsKLQkJCQkJYWxsSW50ZXJmYWNlcyA9IHNlc3Npb24uZ2V0TG9jYWxJbnRlcmZhY2UoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnRvQXJyYXkoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRJbnRlcmZhY2VzKGFsbEludGVyZmFjZXMsIGNsYXNzTmFtZSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGFDbGFzcwotCSAqIEBwYXJhbSBtZXRob2RzCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGV4Y2x1ZGVNZXRob2RzKEphdmFDbGFzcyBhQ2xhc3MsIExpc3QgbWV0aG9kcykgewotCQlMaXN0IGN1cnJlbnRNZXRob2RzID0gYUNsYXNzLmdldE1ldGhvZHMoKTsKLQkJTGlzdCByZXN1bHRNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoIW1ldGhvZHMuY29udGFpbnMoY3VycmVudE1ldGhvZHMuZ2V0KGkpKSkKLQkJCQlyZXN1bHRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kcy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRNZXRob2RzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoSmF2YUNsYXNzIGFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJTGlzdCBjdXJyZW50TWV0aG9kcyA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudE1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBjdXJyZW50TWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kTmFtZS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgTWV0aG9kIGdldE1ldGhvZFVzaW5nTWV0aG9kU2lnKEphdmFDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCUxpc3QgY3VycmVudE1ldGhvZHMgPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgY3VycmVudE1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZE5hbWUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpCi0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogVXNlZCB0byBjb2xsZWN0IG1hdGNoZWQgaW50ZXJmYWNlcyBmb3IgZWpicwotCSAqIEBwYXJhbSBpbnRlcmZhY2VzIGZvciBmaWx0ZXJpbmcKLQkgKiBAcGFyYW0gYUVqYk9iamVjdENsYXNzTmFtZSAtIHRoZSBlamIgbmFtZQotCSAqIEByZXR1cm4gbGlzdCBvZiBpbnRlcmZhY2VzCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlcyhPYmplY3RbXSBpbnRlcmZhY2VzLCBTdHJpbmcgYUVqYk9iamVjdENsYXNzTmFtZSkgewotCQlMaXN0IGV4dHJhY3RlZEludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCgoSmF2YUNsYXNzKSBpbnRlcmZhY2VzW2ldKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFFamJPYmplY3RDbGFzc05hbWUpKQotCQkJCWV4dHJhY3RlZEludGVyZmFjZXMuYWRkKGludGVyZmFjZXNbaV0pOwotCQl9Ci0JCXJldHVybiBleHRyYWN0ZWRJbnRlcmZhY2VzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWpiCi0JICogQHBhcmFtIHNvbWVNZXRob2RFbGVtZW50T3duZXJzCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UKLQkgKiBAcGFyYW0gdXNhZ2VGbGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoRW50ZXJwcmlzZUJlYW4gZWpiLCBMaXN0IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBFUmVmZXJlbmNlIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UsIGludCB1c2FnZUZsYWcpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoZWpiLCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgZ2V0RGVmYXVsdE1FQ29tcGFyYXRvcigpLCB1c2FnZUZsYWcpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWpiCi0JICogQHBhcmFtIHNvbWVNZXRob2RFbGVtZW50T3duZXJzCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhFbnRlcnByaXNlQmVhbiBlamIsIExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhlamIsIHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBnZXREZWZhdWx0TUVDb21wYXJhdG9yKCkpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWpiCi0JICogQHBhcmFtIHNvbWVNZXRob2RFbGVtZW50T3duZXJzCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UKLQkgKiBAcGFyYW0gY29tcGFyYXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKEVudGVycHJpc2VCZWFuIGVqYiwgTGlzdCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgRVJlZmVyZW5jZSBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoZWpiLCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgY29tcGFyYXRvciwgQUxMX01FVEhPRFMpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc29tZU1ldGhvZEVsZW1lbnRPd25lcnMKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudFJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSkgewotCQlpZiAoc29tZU1ldGhvZEVsZW1lbnRPd25lcnMgPT0gbnVsbCB8fCBzb21lTWV0aG9kRWxlbWVudE93bmVycy5pc0VtcHR5KCkgfHwgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSA9PSBudWxsIHx8ICFtZXRob2RFbGVtZW50UmVmZXJlbmNlLmlzTWFueSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLnNpemUoKTsKLQkJRU9iamVjdCBvd25lciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlvd25lciA9IChFT2JqZWN0KSBzb21lTWV0aG9kRWxlbWVudE93bmVycy5nZXQoaSk7Ci0JCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvd25lci5lR2V0KG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWpiCi0JICogQHBhcmFtIHNvbWVNZXRob2RFbGVtZW50T3duZXJzCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UKLQkgKiBAcGFyYW0gY29tcGFyYXRvcgotCSAqIEBwYXJhbSB1c2FnZUZsYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhFbnRlcnByaXNlQmVhbiBlamIsIExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgQ29tcGFyYXRvciBjb21wYXJhdG9yLCBpbnQgdXNhZ2VGbGFnKSB7Ci0JCWlmIChlamIgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBzaG93SG9tZXMgPSB1c2FnZUZsYWcgPT0gQUxMX01FVEhPRFMgfHwgdXNhZ2VGbGFnID09IEhPTUVfTUVUSE9EUzsKLQkJYm9vbGVhbiBzaG93Q2xpZW50cyA9IHVzYWdlRmxhZyA9PSBBTExfTUVUSE9EUyB8fCB1c2FnZUZsYWcgPT0gQ0xJRU5UX01FVEhPRFM7Ci0JCWlmIChzaG93SG9tZXMpCi0JCQlyZXN1bHQuYWRkQWxsKGVqYi5nZXRBdmFpbGFibGVIb21lTWV0aG9kRWxlbWVudHMoKSk7Ci0JCWlmIChzaG93Q2xpZW50cykKLQkJCXJlc3VsdC5hZGRBbGwoZWpiLmdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlpZiAoc2hvd0hvbWVzKQotCQkJcmVzdWx0LmFkZEFsbChlamIuZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSk7Ci0JCWlmIChzaG93Q2xpZW50cykKLQkJCXJlc3VsdC5hZGRBbGwoZWpiLmdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZWpiLmdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSk7Ci0JCWV4Y2x1ZGVNZXRob2RFbGVtZW50cyhyZXN1bHQsIGdldEV4aXN0aW5nTWV0aG9kRWxlbWVudHMoc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc291cmNlTWV0aG9kRWxlbWVudHMKLQkgKiBAcGFyYW0gZXhpc3RpbmdNZXRob2RFbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4Y2x1ZGVNZXRob2RFbGVtZW50cyhMaXN0IHNvdXJjZU1ldGhvZEVsZW1lbnRzLCBMaXN0IGV4aXN0aW5nTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgZXhpc3RpbmdNRTsKLQkJaW50IHNvdXJjZVNpemUsIGV4aXN0aW5nU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJZXhpc3RpbmdTaXplID0gZXhpc3RpbmdNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZXhpc3RpbmdTaXplKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nU2l6ZTsgaSsrKSB7Ci0JCQlmb3VuZCA9IGZhbHNlOwotCQkJZXhpc3RpbmdNRSA9IChNZXRob2RFbGVtZW50KSBleGlzdGluZ01ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCXNvdXJjZU1FID0gbnVsbDsKLQkJCWZvciAoaW50IGlpID0gMDsgaWkgPCBzb3VyY2VTaXplOyBpaSsrKSB7Ci0JCQkJc291cmNlTUUgPSAoTWV0aG9kRWxlbWVudCkgc291cmNlTWV0aG9kRWxlbWVudHMuZ2V0KGlpKTsKLQkJCQlpZiAoZXhpc3RpbmdNRSAhPSBudWxsICYmIGV4aXN0aW5nTUUuZ2V0TmFtZSgpICE9IG51bGwgJiYgc291cmNlTUUuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKGV4aXN0aW5nTUUuZ2V0U2lnbmF0dXJlKCkpICYmIHNvdXJjZU1FLmdldFR5cGVKYXZhQ2xhc3MoKSA9PSBleGlzdGluZ01FLmdldFR5cGVKYXZhQ2xhc3MoKSkgewotCQkJCQlpZiAoc291cmNlTUUuZ2V0VHlwZUphdmFDbGFzcygpICE9IG51bGwpIHsgLy9pdCByZXR1cm5zCi0JCQkJCQkvLyBudWxsIGlmIHRoZQotCQkJCQkJLy8gbWV0aG9kIGlzICoKLQkJCQkJCS8vIGFuZCBpdCBpcyBub3QKLQkJCQkJCS8vIGEgbWVzc2FnZQotCQkJCQkJLy8gYmVhbgotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoc291cmNlTUUuZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpID09IGV4aXN0aW5nTUUuZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkKLQkJCQlmb3VuZEVsZW1lbnRzLmFkZChzb3VyY2VNRSk7Ci0JCX0KLQkJc291cmNlTWV0aG9kRWxlbWVudHMucmVtb3ZlQWxsKGZvdW5kRWxlbWVudHMpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRFamJHZXRIb21lSGFuZGxlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3QgamF2YXguZWpiLkhvbWVIYW5kbGUgamF2YXguZWpiLkVKQkhvbWUuZ2V0SG9tZUhhbmRsZSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldEVqYkdldE1ldGFEYXRhTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3QgamF2YXguZWpiLkVKQk1ldGFEYXRhIGphdmF4LmVqYi5FSkJIb21lLmdldEVKQk1ldGFEYXRhKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVtb3RlUmVtb3ZlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3Qgdm9pZCBqYXZheC5lamIuRUpCT2JqZWN0LnJlbW92ZSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24samF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiI7IC8vbm9uLW5scyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsUmVtb3ZlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3Qgdm9pZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QucmVtb3ZlKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbixqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIjsgLy9ub24tbmxzIC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0TURCTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoamF2YXguam1zLk1lc3NhZ2UgbXNnKSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUpCT2JqZWN0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gImphdmF4LmVqYi5FSkJPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldEVKQkxvY2FsT2JqZWN0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gImphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBKYXZhQ2xhc3MgZ2V0RUpCT2JqZWN0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlSZXNvdXJjZSByZXMgPSBiZWFuLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSByZXMgIT0gbnVsbCA/IHJlcy5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YXguZWpiIiwgIkVKQk9iamVjdCIsIHNldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwcml2YXRlIEphdmFDbGFzcyBnZXRFSkJMb2NhbE9iamVjdENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJUmVzb3VyY2UgcmVzID0gYmVhbi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzICE9IG51bGwgPyByZXMuZ2V0UmVzb3VyY2VTZXQoKSA6IG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmF4LmVqYiIsICJFSkJMb2NhbE9iamVjdCIsIHNldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwcml2YXRlIEphdmFDbGFzcyBnZXRFSkJIb21lQ2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlSZXNvdXJjZSByZXMgPSBiZWFuLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSByZXMgIT0gbnVsbCA/IHJlcy5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YXguZWpiIiwgIkVKQkhvbWUiLCBzZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ODY3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFamJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImVqYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOID0gNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19TRVJWSUNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX05BTUUgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19SRU1PVEVfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZID0gNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fSUNPTlMgPSBFTlRFUlBSSVNFX0JFQU5fX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fRElTUExBWV9OQU1FUyA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fREVTQ1JJUFRJT05TID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19TTUFMTF9JQ09OID0gRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0xBUkdFX0lDT04gPSBFTlRFUlBSSVNFX0JFQU5fX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fREVTQ1JJUFRJT04gPSBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0RJU1BMQVlfTkFNRSA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBFTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fUkVTT1VSQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19FSkJfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VKQl9MT0NBTF9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX19TRVJWSUNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fRUpCX0NMQVNTID0gRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fRUpCX0pBUiA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19TRUNVUklUWV9JREVOVElUWSA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWVudHJhbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX1JFRU5UUkFOVCA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1BSSU1BUllfS0VZID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fSUNPTlMgPSBFTlRJVFlfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRElTUExBWV9OQU1FUyA9IEVOVElUWV9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fREVTQ1JJUFRJT05TID0gRU5USVRZX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TTUFMTF9JQ09OID0gRU5USVRZX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xBUkdFX0lDT04gPSBFTlRJVFlfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fREVTQ1JJUFRJT04gPSBFTlRJVFlfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRSA9IEVOVElUWV9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBFTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfUkVGUyA9IEVOVElUWV9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfUkVGUyA9IEVOVElUWV9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBFTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9MT0NBTF9SRUZTID0gRU5USVRZX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IEVOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRVJWSUNFX1JFRlMgPSBFTlRJVFlfX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX05BTUUgPSBFTlRJVFlfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTID0gRU5USVRZX19TRUNVUklUWV9ST0xFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0NMQVNTID0gRU5USVRZX19FSkJfQ0xBU1M7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRJVFlfX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0UgPSBFTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0pBUiA9IEVOVElUWV9fRUpCX0pBUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRUNVUklUWV9JREVOVElUWSA9IEVOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBFTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRSA9IEVOVElUWV9fTE9DQUxfSU5URVJGQUNFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWVudHJhbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFRU5UUkFOVCA9IEVOVElUWV9fUkVFTlRSQU5UOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTUFSWV9LRVkgPSBFTlRJVFlfX1BSSU1BUllfS0VZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT04gPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUUgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNNUCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURSA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltIEtleSBGaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGFpbmVyIE1hbmFnZWQgRW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19ST0xFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgVHJhbnNhY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVBfQVRUUklCVVRFID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUl9GSUVMRCA9IDE2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEUgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OID0gMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFMgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUiA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFID0gMTU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZID0gMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRCA9IDIwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0xVREVfTElTVCA9IDE5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OID0gNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX0lDT05TID0gRU5URVJQUklTRV9CRUFOX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19ESVNQTEFZX05BTUVTID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9fREVTQ1JJUFRJT05TID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fU01BTExfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fTEFSR0VfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fREVTQ1JJUFRJT04gPSBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19ESVNQTEFZX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IEVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fUkVTT1VSQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRUpCX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19SRVNPVVJDRV9FTlZfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0VKQl9MT0NBTF9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX1NFUlZJQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19FSkJfQ0xBU1MgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19SRU1PVEVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19SRU1PVEVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19FSkJfSkFSID0gRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19TRUNVUklUWV9JREVOVElUWSA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fTE9DQUxfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1NFU1NJT05fVFlQRSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2Vzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU4gPSAxNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT04gPSAxODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01FVEhPRF9DQVRFR09SWSA9IDc7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBNZXRob2QgQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX01FVEhPRF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBKYXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19QQVJNUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fT1JERVJFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1VOSVFVRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19MT1dFUl9CT1VORCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19NQU5ZID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19SRVFVSVJFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0VUWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19DSEFOR0VBQkxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0NIQU5HRUFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19WT0xBVElMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19UUkFOU0lFTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlcml2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19ERVJJVkVEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0RFUklWRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IENNUF9BVFRSSUJVVEVfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0VKQl9KQVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBTX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfX0VKQl9RTCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fUVVFUllfTUVUSE9EID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX19FTlRJVFkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgUmVsYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUk9MRV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ST0xFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19FTlRJVFlfQkVBTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU09VUkNFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fRUFOTk9UQVRJT05TID0gQ01QX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUl9GSUVMRF9fTkFNRSA9IENNUF9BVFRSSUJVVEVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX09SREVSRUQgPSBDTVBfQVRUUklCVVRFX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fVU5JUVVFID0gQ01QX0FUVFJJQlVURV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19MT1dFUl9CT1VORCA9IENNUF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19VUFBFUl9CT1VORCA9IENNUF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX01BTlkgPSBDTVBfQVRUUklCVVRFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19SRVFVSVJFRCA9IENNUF9BVFRSSUJVVEVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19FVFlQRSA9IENNUF9BVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0NIQU5HRUFCTEUgPSBDTVBfQVRUUklCVVRFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19WT0xBVElMRSA9IENNUF9BVFRSSUJVVEVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fVFJBTlNJRU5UID0gQ01QX0FUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFRkFVTFRfVkFMVUUgPSBDTVBfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX1VOU0VUVEFCTEUgPSBDTVBfQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlcml2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFUklWRUQgPSBDTVBfQVRUUklCVVRFX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBDTVBfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ01SX0ZJRUxEX19JRCA9IENNUF9BVFRSSUJVVEVfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fRUFUVFJJQlVURV9UWVBFID0gQ01QX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUl9GSUVMRF9fREVTQ1JJUFRJT04gPSBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFU0NSSVBUSU9OUyA9IENNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX1JPTEUgPSBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRSA9IENNUF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNNUiBGaWVsZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfRkVBVFVSRV9DT1VOVCA9IENNUF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19JQ09OUyA9IEVOVEVSUFJJU0VfQkVBTl9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RJU1BMQVlfTkFNRVMgPSBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fREVTQ1JJUFRJT05TID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1NNQUxMX0lDT04gPSBFTlRFUlBSSVNFX0JFQU5fX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19MQVJHRV9JQ09OID0gRU5URVJQUklTRV9CRUFOX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fREVTQ1JJUFRJT04gPSBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fRElTUExBWV9OQU1FID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gRU5URVJQUklTRV9CRUFOX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fUkVTT1VSQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0VKQl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX0VOVl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0VKQl9MT0NBTF9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fU0VSVklDRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19TRUNVUklUWV9ST0xFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0VKQl9DTEFTUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fUkVNT1RFX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0VKQl9KQVIgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19TRUNVUklUWV9JREVOVElUWSA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19MT0NBTF9IT01FX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19MT0NBTF9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19MSU5LID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRHJpdmVuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0ZFQVRVUkVfQ09VTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fUEFSTVMgPSBNRVRIT0RfRUxFTUVOVF9fUEFSTVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fVFlQRSA9IE1FVEhPRF9FTEVNRU5UX19UWVBFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX0VOVEVSUFJJU0VfQkVBTiA9IE1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OUyA9IE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19RVUVSWSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUcgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFID0gMjM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1VTFRJUExJQ0lUWV9LSU5EID0gMzE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFVFVSTl9UWVBFX01BUFBJTkcgPSAyOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfS0lORCA9IDI2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUUkFOU0FDVElPTl9UWVBFID0gMjQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFDS05PV0xFREdFX01PREUgPSAyNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgREVTVElOQVRJT05fVFlQRSA9IDMwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9LSU5EID0gMjg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fVFlQRSA9IDI1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImVqYi54bWkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kUGVybWlzc2lvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kVHJhbnNhY3Rpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9NZXRob2RFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEVudGVycHJpc2VCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRlcnByaXNlQmVhbl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fRWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHkjaXNSZWVudHJhbnQgPGVtPlJlZW50cmFudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZW50cmFudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHkjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5X1JlZW50cmFudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlfUHJpbWFyeUtleSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1BlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfS2V5QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFF1ZXJpZXMgPGVtPlF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRDTVBBdHRyaWJ1dGUgPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRDTVBBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFByaW1LZXlGaWVsZCA8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmltIEtleSBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFByaW1LZXlGaWVsZCgpCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ01QQXR0cmlidXRlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDTVBBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldENNUEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDTVJGaWVsZCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q01SRmllbGQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfUm9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Sb2xlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQlJlbGF0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJSZWxhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVsYXRpb25zaGlwcyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVsYXRpb25zaGlwcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCSmFyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJKYXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkphcl9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSb2xlU291cmNlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNvdXJjZV9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJvbGVTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFF1ZXJ5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRRdWVyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRdWVyeV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRdWVyeV9FamJRTCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeV9RdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeV9FbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUXVlcnlNZXRob2Qgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFF1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5TWV0aG9kX1F1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1Bhcm1zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFeGNsdWRlTGlzdCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3QjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEV4Y2x1ZGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2Vzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBzZWUgI2dldFNlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1lc3NhZ2VEcml2ZW4gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9UcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9BY2tub3dsZWRnZU1vZGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TGluaygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCTWV0aG9kQ2F0ZWdvcnkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQk1ldGhvZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTXVsdGlwbGljaXR5S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRNdWx0aXBsaWNpdHlLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJldHVyblR5cGVNYXBwaW5nIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnRLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldE1ldGhvZEVsZW1lbnRLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRyYW5zYWN0aW9uVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQWNrbm93bGVkZ2VNb2RlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEFja25vd2xlZGdlTW9kZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBEZXN0aW5hdGlvblR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0RGVzdGluYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlc3Npb25UeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsIDxlbT5Db250YWluZXIgTWFuYWdlZCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9BYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbnQgQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fS0VZX0FUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9RdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DTVAgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9DTVBBdHRyaWJ1dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW0gS2V5IEZpZWxkPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwgPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QRVJNSVNTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuY2hlY2tlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2VtYmx5IERlc2NyaXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVNTRU1CTFlfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFRyYW5zYWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0VqYkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFRyYW5zYWN0aW9uSW1wbCA8ZW0+TWV0aG9kIFRyYW5zYWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHJhbnNhY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1RSQU5TQUNUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uSW1wbCA8ZW0+U2Vzc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVNTSU9OID0gZUlOU1RBTkNFLmdldFNlc3Npb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX19TRVNTSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbl9TZXNzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUltcGwgPGVtPkVudGl0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRU5USVRZID0gZUlOU1RBTkNFLmdldEVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX19SRUVOVFJBTlQgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5X1JlZW50cmFudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfX1BSSU1BUllfS0VZID0gZUlOU1RBTkNFLmdldEVudGl0eV9QcmltYXJ5S2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbkltcGwgPGVtPkVudGVycHJpc2UgQmVhbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVudGVycHJpc2VCZWFuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVOVEVSUFJJU0VfQkVBTiA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVEVSUFJJU0VfQkVBTl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib21lIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVtb3RlIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBKYXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5URVJQUklTRV9CRUFOX19FSkJfSkFSID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0VqYkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWUgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJNZXRob2RDYXRlZ29yeUltcGwgPGVtPkVKQiBNZXRob2QgQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJNZXRob2RDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJNZXRob2RDYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfTUVUSE9EX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEVKQk1ldGhvZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsIDxlbT5FSkIgSmFyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQkphcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfSkFSID0gZUlOU1RBTkNFLmdldEVKQkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsaWVudCBKYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUiA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUyA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXAgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUID0gZUlOU1RBTkNFLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFybXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fUEFSTVMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19UWVBFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEF0dHJpYnV0ZUltcGwgPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBBdHRyaWJ1dGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01QQXR0cmlidXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENNUF9BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0Q01QQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcHMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVMQVRJT05TSElQUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBKYXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQU19fRUpCX0pBUiA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCA8ZW0+UXVlcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBRVUVSWSA9IGVJTlNUQU5DRS5nZXRRdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBRTDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFVRVJZX19FSkJfUUwgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfRWpiUUwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUVVFUllfX1FVRVJZX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX19FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfRW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwgPGVtPkVKQiBSZWxhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQlJlbGF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9SRUxBVElPTiA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OX19OQU1FID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcCBMaXN0PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIDxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX1JFTEFUSU9OU0hJUF9ST0xFID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q21yIEZpZWxkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUm9sZVNvdXJjZUltcGwgPGVtPlJvbGUgU291cmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUm9sZVNvdXJjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSb2xlU291cmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU09VUkNFID0gZUlOU1RBTkNFLmdldFJvbGVTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TT1VSQ0VfX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNvdXJjZV9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQmVhbjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU09VUkNFX19FTlRJVFlfQkVBTiA9IGVJTlNUQU5DRS5nZXRSb2xlU291cmNlX0VudGl0eUJlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsIDxlbT5DTVIgRmllbGQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTVJfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ01SX0ZJRUxEX19ST0xFID0gZUlOU1RBTkNFLmdldENNUkZpZWxkX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbGxlY3Rpb24gVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuSW1wbCA8ZW0+TWVzc2FnZSBEcml2ZW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEcml2ZW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9EUklWRU4gPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIFNlbGVjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1IgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX19MSU5LID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzdGluYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCA8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsIDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFeGNsdWRlTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWENMVURFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhDTFVERV9MSVNUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUyA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UXVlcnlNZXRob2QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUVVFUllfTUVUSE9EID0gZUlOU1RBTkNFLmdldFF1ZXJ5TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBRVUVSWV9NRVRIT0RfX1FVRVJZID0gZUlOU1RBTkNFLmdldFF1ZXJ5TWV0aG9kX1F1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWQVRJT05fQ09ORklHID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ19Db25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFNFU1NJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kIDxlbT5NZXRob2QgRWxlbWVudCBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE1FVEhPRF9FTEVNRU5UX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY2tub3dsZWRnZU1vZGUgPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY2tub3dsZWRnZU1vZGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY2tub3dsZWRnZU1vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBBQ0tOT1dMRURHRV9NT0RFID0gZUlOU1RBTkNFLmdldEFja25vd2xlZGdlTW9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIDxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZyA8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBSRVRVUk5fVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRGVzdGluYXRpb25UeXBlIDxlbT5EZXN0aW5hdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRGVzdGluYXRpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RGVzdGluYXRpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gREVTVElOQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXREZXN0aW5hdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kIDxlbT5NdWx0aXBsaWNpdHkgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNdWx0aXBsaWNpdHlLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gTVVMVElQTElDSVRZX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlwbGljaXR5S2luZCgpOwotCi0JfQotCi19IC8vRWpiUGFja2FnZQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FbnRlcnByaXNlQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGVycHJpc2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWQ1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGVycHJpc2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEVudGVycHJpc2VKYXZhQmVhbiBpcyBhIGNsYXNzLiAgSXQgY2FuIGhhdmUgaW5zdGFuY2VzLCBzb21lb25lIGNvdWxkIHdyaXRlIGFuIGluc3RhbmNlIGRvY3VtZW50IGNvbnRhaW5pbmcgRGVwYXJ0bWVudHMgYW5kIEVtcGxveWVlcy4gIEl0IGFsc28gaGFzIGF0dHJpYnV0ZXMsIG9wZXJhdGlvbnMsIGFuZCBhc3NvY2lhdGlvbnMuICBUaGVzZSBhcmUgYWN0dWFsbHkgZGVyaXZlZC8vZmlsdGVyZWQgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gIEZvciBtYXBwaW5nIGFuZCBicm93c2luZyBwdXJwb3NlcywgdGhvdWdoLCB5b3Ugd291bGQgbGlrZSB0aGUgRUpCIHRvIGFwcGVhciBhcyBhIGNsYXNzLiAgCi0gKiAKLSAqIEluIHRoaXMgbGlnaHQsIGV2ZW4gU2Vzc2lvbiBCZWFucyBjYW4gaGF2ZSBhc3NvY2lhdGlvbnMgYW5kIHByb3BlcnRpZXMgaW1wbGVtZW50ZWQgYnkgdGhlaXIgYmVhbi4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBtZWFuaW5nZnVsIHRvIGRlc2NyaWJlIGFzc29jaWF0aW9ucyBmcm9tIGEgU2Vzc2lvbiB0byB0aGUgRW50aXRpZXMgd2hpY2ggaXQgdXNlcyB0byBwZXJmb3JtIGl0cyB3b3JrLgotICogQGV4dGVuZHMgRU5hbWVkRWxlbWVudAotICoKLSAqKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGVycHJpc2VCZWFuIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cCwgRU5hbWVkRWxlbWVudHsKLQotLyoqCi0gKiBDcmVhdGVzIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHJlcHJlc2VudCB0aGUKLSAqIE1ldGhvZHMgZnJvbSBAc29tZU1ldGhvZHMgcG9pbnRpbmcgdG8gdGhpcyBFSkIuICBJdCBpcwotICogYXNzdW1lZCB0aGF0IGFsbCBvZiB0aGUgbWV0aG9kcyBiZWxvbmcgdG8gQGFuSW50ZXJmYWNlLgotICovCi1MaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKExpc3Qgc29tZU1ldGhvZHMsIEphdmFDbGFzcyBhbkludGVyZmFjZSkgOwotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKiBAZGVwcmVjYXRlZCB1c2VkIGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMKLSAqLwotTGlzdCBnZXRBdmFpbGFibGVDb21tb25NZXRob2RFbGVtZW50cygpIDsKLQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuCi0gKiBAZGVwcmVjYXRlZCB1c2VkIGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMKLSAqLwotTGlzdCBnZXRBdmFpbGFibGVDb21tb25NZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogZm9yIHRoZSBIb21lIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkgOwotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBmb3IgdGhlIExvY2FsIEhvbWUgaW50ZXJmYWNlLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLSAqLwotTGlzdCBnZXRBdmFpbGFibGVMb2NhbEhvbWVNZXRob2RFbGVtZW50cygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogZm9yIHRoZSBMb2NhbCBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICovCi1MaXN0IGdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBuZXdseSBjcmVhdGVkIE1ldGhvZEVsZW1lbnRzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGZvciB0aGUgUmVtb3RlIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFJldHVybiBhIExpc3Qgb2YgYWxsIGF2YWlsYWJsZSBNZXRob2RFbGVtZW50cyBmb3IgYWxsIHR5cGVzIGFzIHdlbGwgYXMgdGhlCi0gKiBleGlzdGluZyBNZXRob2RFbGVtZW50cyBmcm9tIHRoZSA8Y29kZT5yZWZPYmplY3Q8L2NvZGU+LiAgVGhlIHBhcmFtZXRlcgotICogd2lsbCBiZSBlaXRoZXIgYSBNZXRob2RUcmFuc2FjdGlvbiBvciBhIE1ldGhvZFBlcm1pc3Npb24uICBUaGUgTGlzdCB3aWxsIGJlCi0gKiBzb3J0ZWQgYmFzZWQgb24gdGhlIHBhc3NlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcgotICovCi1wdWJsaWMgTGlzdCBnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCByZWZPYmplY3QsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgOwotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCBhdmFpbGFibGUgTWV0aG9kRWxlbWVudHMgZm9yIGFsbCB0eXBlcyBhcyB3ZWxsIGFzIHRoZQotICogZXhpc3RpbmcgTWV0aG9kRWxlbWVudHMgZnJvbSB0aGUgPGNvZGU+cmVmT2JqZWN0PC9jb2RlPi4gIFRoZSBwYXJhbWV0ZXIKLSAqIHdpbGwgYmUgZWl0aGVyIGEgTWV0aG9kVHJhbnNhY3Rpb24gb3IgYSBNZXRob2RQZXJtaXNzaW9uLiAgVGhlIExpc3Qgd2lsbCBiZQotICogc29ydGVkIGJhc2VkIG9uIHRoZSBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcgotICovCi1wdWJsaWMgTGlzdCBnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCByZWZPYmplY3QpIDsKLXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xhc3NOYW1lKCk7Ci0vKioKLSAqIFJldHVybiBhbiBFamJSZWYgY29udGFpbmVkIGJ5IHRoaXMgYmVhbiB3aGljaCBpcwotICogZXF1aXZhbGVudCB0byBAYW5FamJSZWYuCi0gKi8KLUVqYlJlZiBnZXRFcXVpdmFsZW50RWpiUmVmKEVqYlJlZiBhbkVqYlJlZikgOwotLyoqCi0gKiBNZXRob2QgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmLgotICogQHBhcmFtIGFuRWpiTG9jYWxSZWYKLSAqIEByZXR1cm4gRUpCTG9jYWxSZWYKLSAqLwotRUpCTG9jYWxSZWYgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIGFuRWpiTG9jYWxSZWYpOwotCi1wdWJsaWMgU3RyaW5nIGdldEhvbWVJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgTWV0aG9kW10gZ2V0SG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCk7Ci0vKioKLSAqIFJldHVybiBhbiBFamJSZWYgdGhhdCBpcyBwaHlzaWNhbGx5IGxpbmtlZCB0byBAYW5FSkIuCi0gKi8KLUVqYlJlZiBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLS8qKgotICogUmV0dXJuIGFuIEVKQkxvY2FsUmVmIHRoYXQgaXMgcGh5c2ljYWxseSBsaW5rZWQgdG8gQGFuRUpCLgotICovCi1FSkJMb2NhbFJlZiBnZXRMaW5rZWRFSkJMb2NhbFJlZmVyZW5jZShFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgTWV0aG9kW10gZ2V0TG9jYWxIb21lTWV0aG9kc0ZvckRlcGxveW1lbnQoKTsKLXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgU3RyaW5nIGdldFJlbW90ZUludGVyZmFjZU5hbWUoKTsKLXB1YmxpYyBNZXRob2RbXSBnZXRSZW1vdGVNZXRob2RzRm9yRGVwbG95bWVudCgpOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICovCi1ib29sZWFuIGhhc0phdmFSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBlamIgaGFzIEJlYW5NYW5hZ2VkUGVyc2lzdGFuY2UuCi0gKi8KLWJvb2xlYW4gaXNCZWFuTWFuYWdlZEVudGl0eSgpIDsKLXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotcHVibGljIGJvb2xlYW4gaXNFbnRpdHkoKTsKLXB1YmxpYyBib29sZWFuIGlzTWVzc2FnZURyaXZlbigpOwotcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uKCk7Ci0KLS8qKgotICogcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgYmVhbiBpbiB0aGUgRUpCSmFyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBVc2Uge0BsaW5rICNnZXRWZXJzaW9uSUQoKX0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHMKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gVXNlIHtAbGluayAjZ2V0VmVyc2lvbklEKCl9Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfWCgpIDsKLQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UgYW5kIGEgbG9jYWwgaG9tZQotICogaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNMb2NhbENsaWVudCgpOwotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgRUpCIGhhcyBhIHJlbW90ZSBpbnRlcmZhY2UgYW5kIGEgaG9tZQotICogaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNSZW1vdGVDbGllbnQoKTsKLQotLyoqCi0gKiBGaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUgcmVmcwotICovCi1wdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRFamJDbGFzc05hbWUoU3RyaW5nIGVqYkNsYXNzTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRIb21lSW50ZXJmYWNlTmFtZShTdHJpbmcgaG9tZUludGVyZmFjZU5hbWUpOwotcHVibGljIHZvaWQgc2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZShTdHJpbmcgbG9jYWxIb21lSW50ZXJmYWNlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRMb2NhbEludGVyZmFjZU5hbWUoU3RyaW5nIGxvY2FsSW50ZXJmYWNlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRSZW1vdGVJbnRlcmZhY2VOYW1lKFN0cmluZyByZW1vdGVJbnRlcmZhY2VOYW1lKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVSZWZzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEhvbWVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRIb21lSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZW1vdGVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldFJlbW90ZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVtb3RlSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldEVqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWN1cml0eUlkZW50aXR5IHJlZmVyZW5jZQotCSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eQotCSAqIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvcgotCSAqIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLQkgKiBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAqIHRvIGJlIHVzZWQuCi0JICovCi0JU2VjdXJpdHlJZGVudGl0eSBnZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZWN1cml0eUlkZW50aXR5IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIExvY2FsSG9tZUludGVyZmFjZSByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb2NhbEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2NhbEhvbWVJbnRlcmZhY2UoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIExvY2FsSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRMb2NhbEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9jYWxJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2NhbEludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTlhZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotLyoqCi0gKiBUaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnk7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UsIGlmIGFueTsgdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3M7IHRoZSBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZTsgYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5OyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGFic3RyYWN0IHNjaGVtYSBuYW1lOyBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQ7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucyBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gKiBUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQgY21wLXZlcnNpb24gMi54LiBUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIFRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotICogVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotICogVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0gKiBUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQgcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoZSBlbnRpdHkgYmVhbi4KLSAqIFRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZgotICogdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGl0eSBleHRlbmRzIEVudGVycHJpc2VCZWFuewotCi1wdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlOYW1lKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQotcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU5hbWUoU3RyaW5nIHByaW1hcnlLZXlOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNSZWVudHJhbnQgYXR0cmlidXRlCi0JICogVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgKi8KLQlib29sZWFuIGlzUmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVlbnRyYW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldFJlZW50cmFudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWVudHJhbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFJlZW50cmFudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUHJpbWFyeUtleSByZWZlcmVuY2UKLQkgKiBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQKLQkgKiBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlCi0JICogb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZAotCSAqIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gCi0JICogVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0byBtdWx0aXBsZQotCSAqIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIAotCSAqIHRvIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCSAqIEV4YW1wbGVzOjxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC8vcHJpbS1rZXktY2xhc3M+Ci0JICogCTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvL3ByaW0ta2V5LWNsYXNzPgotCSAqIAk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvL3ByaW0ta2V5LWNsYXNzPgotCi0JICovCi0JSmF2YUNsYXNzIGdldFByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFByaW1hcnlLZXkgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRQcmltYXJ5S2V5KEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTI5N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLgotICogCi0gKiBJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgbXVzdCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4Y2x1ZGVMaXN0IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkqIFJldHVybiBhIExpc3Qgb2YgTWV0aG9kRWxlbWVudHMgdGhhdCBwb2ludCB0bwotCSogQGFuRUpCLgotCSovCi0JTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQik7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9JUm9sZVNoYXBlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9JUm9sZVNoYXBlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZWRmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvSVJvbGVTaGFwZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvNi8yMDAwIDExOjQwOjE2IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBJUm9sZVNoYXBlU3RyYXRlZ3kgewotCVN0cmluZyBBVFRSSUJVVEVfTkFNRV9KT0lORVIgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUk9MRV9HRVRfUFJFRklYID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUk9MRV9TRVRfUFJFRklYID0gInNldCI7IC8vJE5PTi1OTFMtMSQKLWJvb2xlYW4gaXNGbGF0KCk7Ci1ib29sZWFuIGlzUm91bmQoKTsKLXZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhMaXN0IHJvbGVBdHRyaWJ1dGVzKSA7Ci1ib29sZWFuIHVzZXNBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXNzYWdlRHJpdmVuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWVzc2FnZURyaXZlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRlY2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXNzYWdlRHJpdmVuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEcml2ZW4gZXh0ZW5kcyBFbnRlcnByaXNlQmVhbnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHJhbnNhY3Rpb25UeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIHRyYW5zYWN0aW9uCi0JICogbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCSAqIFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IEJlYW4sIENvbnRhaW5lcgotCSAqLwotCVRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE1lc3NhZ2VTZWxlY3RvciBhdHRyaWJ1dGUKLQkgKiBUaGUgbWVzc2FnZS1zZWxlY3RvciBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgSk1TIG1lc3NhZ2UKLQkgKiBzZWxlY3RvciB0byBiZSB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoIG1lc3NhZ2VzIGEgbWVzc2FnZS1kcml2ZW4KLQkgKiBiZWFuIGlzIHRvIHJlY2VpdmUuCi0JICogCi0JICogRXhhbXBsZSB2YWx1ZTogCi0JICogSk1TVHlwZSA9IGBjYXInIEFORCBjb2xvciA9IGBibHVlJyBBTkQgd2VpZ2h0ID4gMjUwMAotCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VTZWxlY3RvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE1lc3NhZ2VTZWxlY3RvciBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VTZWxlY3RvcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEFja25vd2xlZGdlTW9kZSBhdHRyaWJ1dGUKLQkgKiBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYWNrbm93bGVkZ21lbnQgbW9kZSBmb3IgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQkgKiBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZCAoaWUuIHNlbGYudHJhbnNhY3Rpb25UeXBlID0KLQkgKiBCZWFuKQotCSAqIAotCSAqIFRoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yCi0JICogRFVQU19PS19BQ0tOT1dMRURHRSBtZXNzYWdlIGFja25vd2xlZGdtZW50IHNlbWFudGljcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCi0JICogb25NZXNzYWdlIG1lc3NhZ2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIHRoYXQgdXNlcyBiZWFuIG1hbmFnZWQgdHJhbnNhY3Rpb24KLQkgKiBkZW1hcmNhdGlvbi4KLQkgKiAKLQkgKiBUaGUgYWNrbm93bGVkZ2UtbW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIEF1dG8tYWNrbm93bGVkZ2UsCi0JICogRHVwcy1vay1hY2tub3dsZWRnZQotCi0JICovCi0JQWNrbm93bGVkZ2VNb2RlIGdldEFja25vd2xlZGdlTW9kZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0QWNrbm93bGVkZ2VNb2RlIDxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY2tub3dsZWRnZU1vZGUKLQkgKiBAc2VlICNpc1NldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjdW5zZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI2dldEFja25vd2xlZGdlTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWNrbm93bGVkZ2VNb2RlKEFja25vd2xlZGdlTW9kZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFja25vd2xlZGdlTW9kZSA8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI2dldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjc2V0QWNrbm93bGVkZ2VNb2RlKEFja25vd2xlZGdlTW9kZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFja25vd2xlZGdlTW9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY2tub3dsZWRnZU1vZGUgPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICNzZXRBY2tub3dsZWRnZU1vZGUoQWNrbm93bGVkZ2VNb2RlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBEZXN0aW5hdGlvbiByZWZlcmVuY2UKLQkgKiBBbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgaW50ZW5kZWQgZGVzdGluYXRpb24gdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4KLQkgKiBiZWFuCi0JICovCi0JTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIGdldERlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzdGluYXRpb24gcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5fQWN0aXZhdGlvbkNvbmZpZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3RpdmF0aW9uQ29uZmlnIGdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb24oSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRNZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgKiAJICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldExpbmsgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlCi0JICogICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIElmCi0JICogICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotCSAqICAgICAgICAgYXNzdW1lZCB0byBiZSBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWVzc2FnaW5nVHlwZShKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0TWVzc2FnaW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnaW5nVHlwZSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdpbmdUeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMTFmZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gZWxlbWVudCBwcm92aWRlcyBhZHZpY2UgdG8gdGhlIERlcGxveWVyIGFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEgVG9waWMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbnRlbmRlZCBkZXN0aW5hdGlvbiBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2Ygd2hldGhlciBhIGR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBkZXN0aW5hdGlvbi10eXBlIGlzIGphdmF4Lmptcy5Ub3BpYy4KLSAqIEBzaW5jZSAxLjAgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMgZGVzdGluYXRpb24uIFRoZQotCSAqIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUKLQkgKiBkZXN0aW5hdGlvbi4KLQkgKiAKLQkgKiBUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBqYXZheC5qbXMuUXVldWUsIAotCSAqIGphdmF4Lmptcy5Ub3BpYwotCSAqLwotCURlc3RpbmF0aW9uVHlwZSBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKERlc3RpbmF0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKERlc3RpbmF0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKERlc3RpbmF0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5IGF0dHJpYnV0ZQotCSAqIFRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGEgSk1TIHRvcGljIHN1YnNjcmlwdGlvbgotCSAqIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4KLQkgKiAKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIER1cmFibGUsIAotCSAqIE5vbkR1cmFibGUKLQotCSAqLwotCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZAotCSAqIEBzZWUgI2lzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjdW5zZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkKLQkgKiBAc2VlICNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5IDxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkKLQkgKiBAc2VlICNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkKLQkgKiBAc2VlICNzZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPGVtPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eShTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEJlYW4gcmVmZXJlbmNlCi0JICovCi0JTWVzc2FnZURyaXZlbiBnZXRCZWFuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQmVhbiByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEJlYW4oTWVzc2FnZURyaXZlbiB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2Y2FjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIG1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiBob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50Ci0gKiBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiBkZWNsYXJlZCBpbiB0aGUKLSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvCi0gKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgZGVmaW5lZCBpbgotICogYm90aCB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZTsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gKiB0aGUgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi0gKiBzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLgotICogCi0gKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBzeW50YXg6Ci0gKiAKLSAqIDEuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+RUpCTkFNRTwvL2VqYi1uYW1lPgotICogICAgCQk8bWV0aG9kLW5hbWU+KjwvL21ldGhvZC1uYW1lPgotICogCTwvL21ldGhvZD4KLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkCi0gKiAgICBlbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy4KLSAqIAotICogMi4gCTxtZXRob2Q+Ci0gKiAJCTxlamItbmFtZT5FSkJOQU1FPC8vZWpiLW5hbWU+Ci0gKiAgICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8Ly9tZXRob2QtbmFtZT4KLSAqIAk8Ly9tZXRob2Q+PgotICogCi0gKiAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlCi0gKiAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoCi0gKiAgICB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzIHRvCi0gKiAgICBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLgotICogCi0gKiAKLSAqIAotICogCi0gKiAKLSAqIDMuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+RUpCTkFNRTwvL2VqYi1uYW1lPgotICogICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCTxtZXRob2QtcGFyYW1zPgotICogICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC8vbWV0aG9kLXBhcmFtPgotICogICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC8vbWV0aG9kLXBhcmFtPgotICogICAgICAgICAgIAkJCS4uLgotICogICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC8vbWV0aG9kLXBhcmFtPgotICogCQk8Ly9tZXRob2QtcGFyYW1zPgotICogCTxtZXRob2Q+CQotICogCi0gKiAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZgotICogICAgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoIFBBUkFNLW4gYXJlIHRoZQotICogICAgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmCi0gKiAgICB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAqICAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICogICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gKiAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLSAqIAotICogCi0gKiBVc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiBhbmQgY29udGFpbmVyLXRyYW5zYWN0aW9uCi0gKiAKLSAqIEV4YW1wbGVzOgotICogCi0gKiAgICAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIG9mCi0gKiAJCXRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOgotICogCi0gKiAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+KjwvL21ldGhvZC1uYW1lPgotICogCQk8Ly9tZXRob2Q+Ci0gKiAKLSAqIAlTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIGNyZWF0ZQotICogCQltZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotICogCi0gKiAgICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQk8Ly9tZXRob2Q+Ci0gKiAKLSAqIAlTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLSAqIAkJY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotICogCSAJRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLSAqIAotICogICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJCTxtZXRob2QtcGFyYW1zPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQk8Ly9tZXRob2QtcGFyYW1zPgotICogCQk8Ly9tZXRob2Q+Ci0gKiAKLSAqIAkKLSAqIAlUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotICogCW1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLSAqIAkJCWZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0gKiAJCQkJbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpCi0gKiAgICAgICAgIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLSAqIAotICogICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT5mb29iYXI8Ly9tZXRob2QtbmFtZT4KLSAqIAkJCTxtZXRob2QtcGFyYW1zPgotICogCQkJCTxtZXRob2QtcGFyYW0+Y2hhcjwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmludDwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmludFtdPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQk8Ly9tZXRob2QtcGFyYW1zPgotICogCQk8Ly9tZXRob2Q+Ci0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLSAqICAgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZQotICogICAgaW50ZXJmYWNlIGFuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGlzCi0gKiAgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotICogCi0gKiAJRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotICogCi0gKiAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLWludGY+UmVtb3RlPC8vbWV0aG9kLWludGY+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QKLSAqICAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotICogICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0gKiAKLSAqICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtaW50Zj5Ib21lPC8vbWV0aG9kLWludGY+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUklHSFRfUEFSRU4gPSAiKCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUZUX1BBUkVOID0gIikiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgdm9pZCBhZGRNZXRob2RQYXJhbXMoU3RyaW5nIHBhcmFtKTsKLS8qKgotICogU2V0IHRoZSBwYXJhbXMgZm9yIHRoaXMgbWV0aG9kIGVsZW1lbnQgdG8gYW4gZW1wdHkgYXJyYXksIGFzIG9wcG9zZWQKLSAqIHRvIG51bGwuCi0gKi8KLXB1YmxpYyB2b2lkIGFwcGx5WmVyb1BhcmFtcygpOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgYW5kIEBhbm90aGVyTWV0aG9kRWxlbWVudAotICogaGF2ZSB0aGUgc2FtZSBuYW1lLCBwYXJhbWV0ZXJzLCBhbmQgdHlwZS4KLSAqLwotYm9vbGVhbiBlcXVhbFNpZ25hdHVyZShNZXRob2RFbGVtZW50IGFub3RoZXJNZXRob2RFbGVtZW50KSA7Ci0JamF2YS51dGlsLkxpc3QgZ2V0TWV0aG9kUGFyYW1zKCkgOy8qKgotICogQW5zd2VyIHdoZXRoZXIgbWV0aG9kIHBhcmFtcyBhcHBseSB0byB0aGlzIG1ldGhvZCwgZS5nLiwgaXQgaXMgc3BlY2lmaWMgdG8gb25lCi0gKiBvdmVybG9hZGVkIG1ldGhvZCwgZXZlbiBpZiB0aGUgbWV0aG9kIGlzIGEgemVybyBwYXJhbWV0ZXIgbWV0aG9kLiAgQW5zd2VyIGZhbHNlIGlmIG5vCi0gKiBwYXJhbWV0ZXJzIGFwcGx5LCB0aGF0IGlzLCB0aGUgbWV0aG9kIGVsZW1lbnQgYXBwbGllcyB0byBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIHdpdGggdGhpcyBuYW1lCi0gKi8gCi0vKioKLSAqIEFuc3dlciBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMuICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkOgotICoKLSAqIDEpICBJZiB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyB1bnNwZWNpZmllZCwgdGhlIG1ldGhvZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIGVqYjsKLSAqCQlJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpcyB1c2VkCi0gKgotICogMikgIElmIHRoZSBtZXRob2QgbmFtZSA9ICIqIiwgdGhlbiBhbGwgdGhlIFBVQkxJQyBtZXRob2RzIGZvciB0aGF0IGludGVyZmFjZSBhcmUgcmV0dXJuZWQKLSAqCi0gKiAzKSAgSWYgdGhlIG1ldGhvZCBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIG5vIG1ldGhvZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhbGwgcHVibGljIG1ldGhvZHMgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgaGF2aW5nIHRoZSBzYW1lIG5hbWUgYXJlIHJldHVybmVkLgotICoKLSAqIDQpICBJZiB0aGUgbWV0aG9kIG5hbWUgYW5kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGEgemVybyBvciBvbmUgZWxlbWVudCBhcnJheSBpcyByZXR1cm5lZCwgY29udGFpbmluZyB0aGUgb25lIGFuZCBvbmx5IG1ldGhvZAotICogICAgICBvbiB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgaWYgaXQgZXhpc3RzCi0gKi8KLXB1YmxpYyBNZXRob2RbXSBnZXRNZXRob2RzKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgTWV0aG9kRWxlbWVudCB0aGF0IGlzIG1vc3Qgc3BlY2lmaWMuCi0gKi8KLU1ldGhvZEVsZW1lbnQgZ2V0TW9zdFNwZWNpZmljKE1ldGhvZEVsZW1lbnQgYU1ldGhvZEVsZW1lbnQsIEphdmFDbGFzcyBhSmF2YUNsYXNzKTsKLS8qKgotICogUmV0dXJuIHRoZSBzaWduYXR1cmUuCi0gKiBGb3IgZXhhbXBsZTogIHNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLVN0cmluZyBnZXRTaWduYXR1cmUoKSA7Ci0vKioKLSAqIFJldHVybiB0aGUgdHlwZSBjYXN0IHRvIGEgSmF2YUNsYXNzLgotICovCi1KYXZhQ2xhc3MgZ2V0VHlwZUphdmFDbGFzcygpIDsKLXB1YmxpYyBib29sZWFuIGhhc01ldGhvZFBhcmFtcygpOwotLyoqCi0gKiBQYXJzZSBAYVNpZ25hdHVyZSBzZXR0aW5nIHRoZSBuYW1lIGFuZCB0aGUgcGFyYW1zLgotICogQSBzaWduYXR1cmUgZXhhbXBsZTogIHNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXZvaWQgaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoU3RyaW5nIGFTaWduYXR1cmUpIDsKLWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCBhbmQgQGFub3RoZXJNZXRob2RFbGVtZW50Ci0gKiByZXByZXNlbnQgdGhlIHNhbWUgZXhhY3QgbWV0aG9kcy4KLSAqLwotYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWV0aG9kRWxlbWVudCBhbm90aGVyTWV0aG9kRWxlbWVudCkgOwotYm9vbGVhbiBpc0hvbWUoKSA7Ci1ib29sZWFuIGlzUmVtb3RlKCkgOwotYm9vbGVhbiBpc1Vuc3BlY2lmaWVkKCkgOwotYm9vbGVhbiBpc0xvY2FsSG9tZSgpIDsKLWJvb2xlYW4gaXNMb2NhbCgpIDsKLWJvb2xlYW4gaXNTZXJ2aWNlKCk7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzIG9uZSBvciBtb3JlCi0gKiBtZXRob2RzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgaGFzIHRoZSBzYW1lIGJhc2ljIHNpZ25hdHVyZSBhcwotICogQGFNZXRob2QsIGlnbm9yaW5nIHRoZSByZXR1cm4gdHlwZSwgdGhyb3duIGV4Y2VwdGlvbnMsIGFuZCBkZWNsYXJpbmcgY2xhc3Mgb2YgCi0gKiB0aGlzIGluc3RhbmNlIG9yIEBhTWV0aG9kLiAgUmV0dXJuIGZhbHNlLCBpZiBwYXJhbXMgaXMgbnVsbAotICovCi1wdWJsaWMgYm9vbGVhbiBuYW1lQW5kUGFyYW1zRXF1YWxzKE1ldGhvZCBhTWV0aG9kKTsKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXRob2RQYXJhbXMoU3RyaW5nIHBhcmFtKTsKLWJvb2xlYW4gcmVwcmVzZW50cyhNZXRob2QgYU1ldGhvZCk7Ci1wdWJsaWMgdm9pZCBzZXRJZFRvUmVhZGFibGVTdHJpbmcoKTsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMKLSAqIEBhTWV0aG9kLiAgUmV0dXJuIGZhbHNlLCBldmVuIGlmIHRoZSBNZXRob2RFbGVtZW50IHJlcHJlc2VudHMKLSAqIEBhTWV0aG9kIChpLmUuLCBAYU1ldGhvZCBpcyBjb250YWluZWQgaW4gaXRzIGxpc3Qgb2YgbWV0aG9kcykuCi0gKi8KLWJvb2xlYW4gdW5pcXVlbHlJZGVudGlmaWVzKE1ldGhvZCBhTWV0aG9kKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwKLQkgKiBvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudAotCSAqIGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgaG9tZQotCSAqIGludGVyZmFjZXMuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUGFybXMgYXR0cmlidXRlCi0JICogVGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUKLQkgKiBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGEgc3BhY2UKLQkgKiBkZWxpbWl0dGVkIFN0cmluZy4gIEEgbnVsbCBzdHJpbmcgaW5kaWNhdGVzIGEgZ2VuZXJpYyBtZXRob2QgZWxlbWVudCB0aGF0IGNhbgotCSAqIGFwcGx5IHRvIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgQW4gZW1wdHkgc3RyaW5nIGluZGljYXRlcyBhCi0JICogbWV0aG9kIHdpdGggemVybyBwYXJhbWV0ZXJzLiAgCi0JICovCi0JU3RyaW5nIGdldFBhcm1zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFybXMgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJtcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICovCi0JTWV0aG9kRWxlbWVudEtpbmQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQKLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShNZXRob2RFbGVtZW50S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShNZXRob2RFbGVtZW50S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShNZXRob2RFbGVtZW50S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVudGVycHJpc2VCZWFuIHJlZmVyZW5jZQotCSAqLwotCUVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFbnRlcnByaXNlQmVhbiByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2VCZWFuKEVudGVycHJpc2VCZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnRLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwZDJkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIE1ldGhvZEVsZW1lbnRLaW5kIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RFbGVtZW50S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRCA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfSE9NRSA9IDQ7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFUlZJQ0VfRU5EUE9JTlRfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJTZXJ2aWNlRW5kcG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9FTkRQT0lOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VbnNwZWNpZmllZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVuc3BlY2lmaWVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU1BFQ0lGSUVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBVTlNQRUNJRklFRF9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKFVOU1BFQ0lGSUVELCAiVW5zcGVjaWZpZWQiLCAiVW5zcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTU9URQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgUkVNT1RFX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNIT01FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBIT01FX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoSE9NRSwgIkhvbWUiLCAiSG9tZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBMT0NBTF9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKExPQ0FMLCAiTG9jYWwiLCAiTG9jYWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgTE9DQUxfSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKExPQ0FMX0hPTUUsICJMb2NhbEhvbWUiLCAiTG9jYWxIb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFUlZJQ0VfRU5EUE9JTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIFNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChTRVJWSUNFX0VORFBPSU5ULCAiU2VydmljZUVuZHBvaW50IiwgIlNlcnZpY2VFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTWV0aG9kRWxlbWVudEtpbmRbXSB7Ci0JCQlVTlNQRUNJRklFRF9MSVRFUkFMLAotCQkJUkVNT1RFX0xJVEVSQUwsCi0JCQlIT01FX0xJVEVSQUwsCi0JCQlMT0NBTF9MSVRFUkFMLAotCQkJTE9DQUxfSE9NRV9MSVRFUkFMLAotCQkJU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudEtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNZXRob2RFbGVtZW50S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50S2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU1ldGhvZEVsZW1lbnRLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVOU1BFQ0lGSUVEOiByZXR1cm4gVU5TUEVDSUZJRURfTElURVJBTDsKLQkJCWNhc2UgUkVNT1RFOiByZXR1cm4gUkVNT1RFX0xJVEVSQUw7Ci0JCQljYXNlIEhPTUU6IHJldHVybiBIT01FX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMOiByZXR1cm4gTE9DQUxfTElURVJBTDsKLQkJCWNhc2UgTE9DQUxfSE9NRTogcmV0dXJuIExPQ0FMX0hPTUVfTElURVJBTDsKLQkJCWNhc2UgU0VSVklDRV9FTkRQT0lOVDogcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWV0aG9kRWxlbWVudEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRLaW5kCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZFBlcm1pc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGFhZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZFBlcm1pc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLQotLyoqCi0gKiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcywgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuICBUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQvL29yIGhvbWUgaW50ZXJmYWNlcy4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGVybWlzc2lvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgcG9pbnQgdG8KLSAqIEBhbkVKQi4KLSAqLwotTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotLyoqCi0gKiBSZXR1cm4gdGhlIFNlY3VyaXR5Um9sZSBuYW1lZCBAYVJvbGVOYW1lLgotICovCi1TZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlKFN0cmluZyBhUm9sZU5hbWUpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBwZXJtaXNzaW9uIGNvbnRhaW5zIEBhU2VjdXJpdHlSb2xlCi0gKi8KLWJvb2xlYW4gaGFzU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBhU2VjdXJpdHlSb2xlKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcGVybWlzc2lvbiBjb250YWlucyBhIFNlY3VyaXR5Um9sZQotICogbmFtZWQgQGFSb2xlTmFtZS4KLSAqLwotYm9vbGVhbiBoYXNTZWN1cml0eVJvbGUoU3RyaW5nIGFSb2xlTmFtZSkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZFBlcm1pc3Npb24gYW5kIEBhbm90aGVyTWV0aG9kUGVybWlzc2lvbgotICogaGF2ZSB0aGUgc2FtZSByb2xlcy4KLSAqLwotYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWV0aG9kUGVybWlzc2lvbiBhbm90aGVyTWV0aG9kUGVybWlzc2lvbikgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVbmNoZWNrZWQgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1VuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVuY2hlY2tlZCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVuY2hlY2tlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jaXNVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVbmNoZWNrZWQoKQotCSAqIEBzZWUgI2lzVW5jaGVja2VkKCkKLQkgKiBAc2VlICNzZXRVbmNoZWNrZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNpc1VuY2hlY2tlZCA8ZW0+VW5jaGVja2VkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmNoZWNrZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFVuY2hlY2tlZCgpCi0JICogQHNlZSAjaXNVbmNoZWNrZWQoKQotCSAqIEBzZWUgI3NldFVuY2hlY2tlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VW5jaGVja2VkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBBc3NlbWJseURlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFJvbGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RFbGVtZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kVHJhbnNhY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RUcmFuc2FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIzY2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RUcmFuc2FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RUcmFuc2FjdGlvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgcG9pbnQgdG8KLSAqIEBhbkVKQi4KLSAqLwotTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotTWV0aG9kRWxlbWVudCBnZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KE1ldGhvZCBhTWV0aG9kKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGFyZSB0aGUgc2FtZS4KLSAqLwotYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWV0aG9kVHJhbnNhY3Rpb24gYW5vdGhlck1ldGhvZFRyYW5zYWN0aW9uKSA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uQXR0cmlidXRlIGF0dHJpYnV0ZQotCSAqIFRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlCi0JICogdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QgaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlCi0JICogYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotCSAqLwotCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RFbGVtZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL011bHRpcGxpY2l0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTc0YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL011bHRpcGxpY2l0eUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIE11bHRpcGxpY2l0eUtpbmQge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpcGxpY2l0eUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTlk9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PbmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PbmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE9ORV9MSVRFUkFMID0gbmV3IE11bHRpcGxpY2l0eUtpbmQoT05FLCAiT25lIiwgIk9uZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5ZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE1BTllfTElURVJBTCA9IG5ldyBNdWx0aXBsaWNpdHlLaW5kKE1BTlksICJNYW55IiwgIk1hbnkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE11bHRpcGxpY2l0eUtpbmRbXSB7Ci0JCQlPTkVfTElURVJBTCwKLQkJCU1BTllfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXVsdGlwbGljaXR5S2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU11bHRpcGxpY2l0eUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNdWx0aXBsaWNpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE9ORTogcmV0dXJuIE9ORV9MSVRFUkFMOwotCQkJY2FzZSBNQU5ZOiByZXR1cm4gTUFOWV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNdWx0aXBsaWNpdHlLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9NdWx0aXBsaWNpdHlLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2MzNWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogVGhlIHF1ZXJ5IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5OyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdCBtZXRob2QgaXQgaXMgdXNlZCBieTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXR1cm4gdHlwZSBtYXBwaW5nLCBpZiBhbnksIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kOyBhbmQgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4gUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbCBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5Ci0gKiBpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50IHNob3VsZCBiZSBlbXB0eS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgZm9yIFJldHVyblR5cGVNYXBwaW5nLCBjaGVja3MgaWYgaXQgaXMgb2YgdHlwZSBSZXR1cm5UeXBlTWFwcGluZy5MT0NBTAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxSZXN1bHRNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGZvciBSZXR1cm5UeXBlTWFwcGluZywgY2hlY2tzIGlmIGl0IGlzIG9mIHR5cGUgUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZW1vdGVSZXN1bHRNYXBwaW5nKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIHF1ZXJ5LgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEVqYlFMIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIFRoaXMKLQkgKiBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHF1ZXJ5IGVsZW1lbnQgd2hvc2UgY29udGVudHMgc3BlY2lmeQotCSAqIHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QgdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhCi0JICogdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLiAKLQkgKiBUaGUgZWpiLXFsIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBxdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluCi0JICogRUpCIFFMLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gb3IgCi0JICogZGVwZW5kZW50IG9iamVjdCBjbGFzcyBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4KLQkgKiBAaW52YXJpYW50IFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUKLQkgKiBleHByZXNzaWJsZSBpbiBFSkIgUUwuCi0JICogCi0JICogRXhhbXBsZToKLQkgKiA8cXVlcnk+Ci0JICogPHF1ZXJ5LW1ldGhvZD4KLQkgKiA8bWV0aG9kLW5hbWU+ZWpiU2VsZWN0UGVuZGluZ0xpbmVpdGVtczwvL21ldGhvZC1uYW1lPgotCSAqIDxtZXRob2QtcGFyYW1zLy8+Ci0JICogPC8vcXVlcnktbWV0aG9kPgotCSAqIDxlamItcWw+U0VMRUNUIEVOVElUWShsKQotCSAqIEZST00gTGluZUl0ZW1zIGwKLQkgKiBXSEVSRSBsLnNoaXBwZWQgaXMgRkFMU0UKLQkgKiA8Ly9lamItcWw+Ci0JICogPC8vcXVlcnk+Ci0JICovCi0JU3RyaW5nIGdldEVqYlFMKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiUUwgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRFamJRTChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJldHVyblR5cGVNYXBwaW5nIGF0dHJpYnV0ZQotCSAqIFRoZSByZXR1cm4tdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0byBzcGVjaWZ5IHdoZXRoZXIgCi0JICogYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgdGhhdCBpcyByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8KLQkgKiBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlCi0JICogcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50LCBpZiBzcGVjaWZpZWQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4KLQkgKi8KLQlSZXR1cm5UeXBlTWFwcGluZyBnZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldFJldHVyblR5cGVNYXBwaW5nIDxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZwotCSAqIEBzZWUgI2lzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXRSZXR1cm5UeXBlTWFwcGluZyA8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3NldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldFJldHVyblR5cGVNYXBwaW5nIDxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3NldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFF1ZXJ5TWV0aG9kIHJlZmVyZW5jZQotCSAqIFRoZSBxdWVyeS1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1ldGhvZCAoREIvL1NSLy9DTS0ib24gdGhlCi0JICogaG9tZSIpIGZvciBhIGZpbmRlciBvcgotCSAqIHNlbGVjdCBxdWVyeS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICogbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbgotCSAqIHRoZSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLgotCSAqIAotCSAqIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICogbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCSAqIAotCSAqIFVzZWQgaW46IHF1ZXJ5Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIDxxdWVyeT4KLQkgKiAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC8vZGVzY3JpcHRpb24+Ci0JICogICA8cXVlcnktbWV0aG9kPgotCSAqICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC8vbWV0aG9kLW5hbWU+Ci0JICogICAgIDxtZXRob2QtcGFyYW1zPjwvL21ldGhvZC1wYXJhbXM+Ci0JICogICA8Ly9xdWVyeS1tZXRob2Q+Ci0JICogICA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMDwvL2VqYi1xbD4KLQkgKiA8Ly9xdWVyeT4KLQkgKi8KLQlRdWVyeU1ldGhvZCBnZXRRdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFF1ZXJ5TWV0aG9kIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRW50aXR5IHJlZmVyZW5jZQotCSAqLwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1F1ZXJ5TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmZhODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1F1ZXJ5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlNZXRob2QgZXh0ZW5kcyBNZXRob2RFbGVtZW50ewotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9QUkVGSVggPSAiZWpiU2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfUFJFRklYID0gImZpbmQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUXVlcnkgcmVmZXJlbmNlCi0JICovCi0JUXVlcnkgZ2V0UXVlcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBRdWVyeSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5KFF1ZXJ5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBKYXZhQ2xhc3NlcyBvZiBhbGwgdGhlIGludGVyZmFjZXMgb3IgYmVhbiBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIHByZXNlbnRlZAotCSAqIHRvIGEgY2xpZW50LiAgSWYgaXQgaXMgYW4gZWpiU2VsZWN0Li4uIG9uIHRoZSBiZWFuIGNsYXNzIHdpbGwgYmUgcmV0dXJuZWQgYW5kIGlmCi0JICogaXQgaWYgYSBmaW5kIGJvdGggaG9tZSBpbnRlcmZhY2VzIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhleSBleGlzdC4KLQkgKiAKLQkgKiBNYXkgcmV0dXJuIG51bGwuCi0JICogQHJldHVybiBhcnJheSBvZiBKYXZhQ2xhc3MKLQkgKi8KLQlKYXZhQ2xhc3NbXSBnZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKSA7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JlbGF0aW9uc2hpcHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZGI4NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JlbGF0aW9uc2hpcHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSByZWxhdGlvbnNoaXBzIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcHMgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIGNvbGxlY3Rpb24gb2YgcmVsYXRpb25zaGlwcy4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQlFSkJKYXIgZ2V0RWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlbGF0aW9ucyByZWZlcmVuY2VzCi0JICogQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQKLQkgKiByZWxhdGlvbnNoaXBzLgotCSAqLwotCUVMaXN0IGdldEVqYlJlbGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JldHVyblR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTQyZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JldHVyblR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBSZXR1cm5UeXBlTWFwcGluZyB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmV0dXJuVHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUw9IDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEU9IDE7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV0dXJuVHlwZU1hcHBpbmcgTE9DQUxfTElURVJBTCA9IG5ldyBSZXR1cm5UeXBlTWFwcGluZyhMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1PVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nIFJFTU9URV9MSVRFUkFMID0gbmV3IFJldHVyblR5cGVNYXBwaW5nKFJFTU9URSwgIlJlbW90ZSIsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJldHVyblR5cGVNYXBwaW5nW10gewotCQkJTE9DQUxfTElURVJBTCwKLQkJCVJFTU9URV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV0dXJuVHlwZU1hcHBpbmcgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXR1cm5UeXBlTWFwcGluZyByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXR1cm5UeXBlTWFwcGluZyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJldHVyblR5cGVNYXBwaW5nIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV0dXJuVHlwZU1hcHBpbmcgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIExPQ0FMOiByZXR1cm4gTE9DQUxfTElURVJBTDsKLQkJCWNhc2UgUkVNT1RFOiByZXR1cm4gUkVNT1RFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJldHVyblR5cGVNYXBwaW5nKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXR1cm5UeXBlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JvbGVTb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Sb2xlU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTE4NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JvbGVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4KLSAqIEBpbnZhcmlhbnQgVGhlIGNvbnRlbnQgb2YgZWFjaCByb2xlLXNvdXJjZSBlbGVtZW50IHNoYWxsIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGVudGl0eSBiZWFuLCBlbnRpdHkgYmVhbiByZWZlcmVuY2UuCi0gKiBAc2luY2UgMS4wIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTb3VyY2UgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJvbGUgcmVmZXJlbmNlCi0JICovCi0JRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFbnRpdHlCZWFuIHJlZmVyZW5jZQotCSAqLwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0RW50aXR5QmVhbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2UjZ2V0RW50aXR5QmVhbiA8ZW0+RW50aXR5IEJlYW48L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBCZWFuPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHlCZWFuKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAxN2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotCi0KLQotLyoqCi0gKiBUaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZAotICogdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uIGV4dGVuZHMgRW50ZXJwcmlzZUJlYW57Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbgotCSAqIG1hbmFnZW1lbnQgdHlwZS4KLQkgKiAKLQotCSAqLwotCVRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNlc3Npb25UeXBlIGF0dHJpYnV0ZQotCSAqLwotCVNlc3Npb25UeXBlIGdldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQHNlZSAjaXNTZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICogICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0JICogICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLQkgKiAgICAgICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAqICAgICAgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLQkgKiAgICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludChKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnQoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gc2V0IEphdmEgQ2xhc3MgbmFtZSB2aWEgU3RyaW5nCi0JICogQHBhcmFtIHNlcnZpY2VFbmRwb2ludE5hbWUgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2VFbmRwb2ludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludE5hbWUoU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgU2Vzc2lvbiBiZWFuIGhhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCi0JICogaW50ZXJmYWNlLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1NlcnZpY2VFbmRwb2ludCgpIDsKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCBKYXZhIENsYXNzIG5hbWUgCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludE5hbWUoKTsKLQkKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTkxYzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgU2Vzc2lvblR5cGUge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlc3Npb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFRlVMPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTEVTUz0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhdGVmdWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBVEVGVUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlIFNUQVRFRlVMX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVGVUwsICJTdGF0ZWZ1bCIsICJTdGF0ZWZ1bCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBVEVMRVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUxFU1NfTElURVJBTCA9IG5ldyBTZXNzaW9uVHlwZShTVEFURUxFU1MsICJTdGF0ZWxlc3MiLCAiU3RhdGVsZXNzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFNlc3Npb25UeXBlW10gewotCQkJU1RBVEVGVUxfTElURVJBTCwKLQkJCVNUQVRFTEVTU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlc3Npb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXNzaW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVNlc3Npb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXNzaW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU1RBVEVGVUw6IHJldHVybiBTVEFURUZVTF9MSVRFUkFMOwotCQkJY2FzZSBTVEFURUxFU1M6IHJldHVybiBTVEFURUxFU1NfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2Vzc2lvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1Nlc3Npb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M4ZTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUkFCTEU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OX0RVUkFCTEU9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EdXJhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNEVVJBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBEVVJBQkxFX0xJVEVSQUwgPSBuZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoRFVSQUJMRSwgIkR1cmFibGUiLCAiRHVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ob24gRHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vbiBEdXJhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTl9EVVJBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBOT05fRFVSQUJMRV9MSVRFUkFMID0gbmV3IFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKE5PTl9EVVJBQkxFLCAiTm9uRHVyYWJsZSIsICJOb25EdXJhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZFtdIHsKLQkJCURVUkFCTEVfTElURVJBTCwKLQkJCU5PTl9EVVJBQkxFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRFVSQUJMRTogcmV0dXJuIERVUkFCTEVfTElURVJBTDsKLQkJCWNhc2UgTk9OX0RVUkFCTEU6IHJldHVybiBOT05fRFVSQUJMRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOGVhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfU1VQUE9SVEVEPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBPUlRTPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVTX05FVz0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5EQVRPUlk9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVI9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ob3QgU3VwcG9ydGVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfU1VQUE9SVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTk9UX1NVUFBPUlRFRF9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShOT1RfU1VQUE9SVEVELCAiTm90U3VwcG9ydGVkIiwgIk5vdFN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN1cHBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NVUFBPUlRTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgU1VQUE9SVFNfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoU1VQUE9SVFMsICJTdXBwb3J0cyIsICJTdXBwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoUkVRVUlSRUQsICJSZXF1aXJlZCIsICJSZXF1aXJlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUlSRVNfTkVXCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRVNfTkVXX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVTX05FVywgIlJlcXVpcmVzTmV3IiwgIlJlcXVpcmVzTmV3Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5EQVRPUlkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBNQU5EQVRPUllfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTUFOREFUT1JZLCAiTWFuZGF0b3J5IiwgIk1hbmRhdG9yeSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OZXZlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5ldmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05FVkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTkVWRVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTkVWRVIsICJOZXZlciIsICJOZXZlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVbXSB7Ci0JCQlOT1RfU1VQUE9SVEVEX0xJVEVSQUwsCi0JCQlTVVBQT1JUU19MSVRFUkFMLAotCQkJUkVRVUlSRURfTElURVJBTCwKLQkJCVJFUVVJUkVTX05FV19MSVRFUkFMLAotCQkJTUFOREFUT1JZX0xJVEVSQUwsCi0JCQlORVZFUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PVF9TVVBQT1JURUQ6IHJldHVybiBOT1RfU1VQUE9SVEVEX0xJVEVSQUw7Ci0JCQljYXNlIFNVUFBPUlRTOiByZXR1cm4gU1VQUE9SVFNfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRUQ6IHJldHVybiBSRVFVSVJFRF9MSVRFUkFMOwotCQkJY2FzZSBSRVFVSVJFU19ORVc6IHJldHVybiBSRVFVSVJFU19ORVdfTElURVJBTDsKLQkJCWNhc2UgTUFOREFUT1JZOiByZXR1cm4gTUFOREFUT1JZX0xJVEVSQUw7Ci0JCQljYXNlIE5FVkVSOiByZXR1cm4gTkVWRVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3M2M5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBUcmFuc2FjdGlvblR5cGUge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUFOPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUj0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBCRUFOX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKEJFQU4sICJCZWFuIiwgIkJlYW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uVHlwZShDT05UQUlORVIsICJDb250YWluZXIiLCAiQ29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNhY3Rpb25UeXBlW10gewotCQkJQkVBTl9MSVRFUkFMLAotCQkJQ09OVEFJTkVSX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBCRUFOOiByZXR1cm4gQkVBTl9MSVRFUkFMOwotCQkJY2FzZSBDT05UQUlORVI6IHJldHVybiBDT05UQUlORVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Y2ZkYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQkvKioKLQkgKiBBYnN0cmFjdFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0U291cmNlUm9sZXMoY21wKS5pdGVyYXRvcigpOwotCQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotCQkJYXR0cmlidXRlcy5hZGRBbGwocm9sZS5nZXRBdHRyaWJ1dGVzKCkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2Ygcm9sZXMgZnJvbSBjbXBFeHQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKAotCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXBFeHQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjVlYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8xNS8yMDAxIDExOjM3OjE5IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLS8qKgotICogQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci1wcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgYWxsUm9sZXMgPSBnZXRSb2xlc1RvRmlsdGVyKGNtcCk7Ci0JQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBhbGxSb2xlcy5nZXQoaSk7Ci0JCWlmIChzaG91bGRBZGRGaWx0ZXJlZFJlc3VsdChyb2xlKSkKLQkJCXJvbGVzLmFkZChyb2xlKTsKLQl9Ci0JcmV0dXJuIHJvbGVzOwotfQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFJvbGVzVG9GaWx0ZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIG11bHRpcGxpY2l0eSBmb3IgQGFSb2xlIGlzIHJlcXVpcmVkLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBZGRGaWx0ZXJlZFJlc3VsdChDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JYm9vbGVhbiByZXF1aXJlZCA9IGFSb2xlLmlzUmVxdWlyZWQoKTsKLQlpZiAocmVxdWlyZWQpIHsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBvcHBvc2l0ZSA9IGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0JCWlmIChvcHBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGUuaXNSZXF1aXJlZCgpICYmICFhUm9sZS5pc0tleSgpKSB7Ci0JCQkJaWYgKG9wcG9zaXRlLmlzS2V5KCkgfHwgYVJvbGUuaXNNYW55KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIW9wcG9zaXRlLmlzTWFueSgpKQotCQkJCQkvL2JvdGggYXJlIHNpbmdsZSBhbmQgbm90IGtleQotCQkJCQlyZXR1cm4gYVJvbGUuaXNGb3J3YXJkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlcXVpcmVkOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWNlNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFjdGl2YXRpb25Db25maWcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnRpZXMoKSA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmZpZ1Byb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpIHsKLQkJaWYgKGNvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25maWdQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gY29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQWN0aXZhdGlvbkNvbmZpZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2YmFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGI4YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0KLS8qKgotICogVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLiBBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VtYmx5RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBBc3NlbWJseURlc2NyaXB0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEV4Y2x1ZGVMaXN0IGV4Y2x1ZGVMaXN0ID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQVNTRU1CTFlfREVTQ1JJUFRPUjsKLQl9Ci0KLS8qKgotICogUmV0dXJuIHRoZSBmaXJzdCBtZXRob2QgcGVybWlzc2lvbiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgcm9sZXMgaW4gc2VjdXJpdHlSb2xlcyBhbmQKLSAqIGlzIHRoZSBzYW1lIHNpemUKLSAqLwotCi1wdWJsaWMgTWV0aG9kUGVybWlzc2lvbiBnZXRNZXRob2RQZXJtaXNzaW9uKExpc3Qgc2VjdXJpdHlSb2xlc0xpc3QpIHsKLQlMaXN0IHBlcm1pc3Npb25zID0gZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQlNZXRob2RQZXJtaXNzaW9uIHRlbXAgPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGVybWlzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJdGVtcCA9IChNZXRob2RQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQoaSk7Ci0JCWlmICh0ZW1wLmdldFJvbGVzKCkuY29udGFpbnNBbGwoc2VjdXJpdHlSb2xlc0xpc3QpICYmIHRlbXAuZ2V0Um9sZXMoKS5zaXplKCkgPT0gc2VjdXJpdHlSb2xlc0xpc3Quc2l6ZSgpKQotCQkJcmV0dXJuIHRlbXA7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIExpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JTGlzdCBhbGxNZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlMaXN0IHBlcm1pc3Npb25zID0gZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQlNZXRob2RQZXJtaXNzaW9uIHBlcm1pc3Npb247Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtaXNzaW9ucy5zaXplKCk7IGkrKyl7Ci0JCXBlcm1pc3Npb24gPSAoTWV0aG9kUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KGkpOwotCQlhbGxNZXRob2RFbGVtZW50cy5hZGRBbGwocGVybWlzc2lvbi5nZXRNZXRob2RFbGVtZW50cyhhbkVKQikpOyAKLQl9Ci0JcmV0dXJuIGFsbE1ldGhvZEVsZW1lbnRzOwotfQotCQotCi1wdWJsaWMgTGlzdCBnZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JTGlzdCBhbGxNZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlMaXN0IHRyYW5zYWN0aW9ucyA9IGdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCU1ldGhvZFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25zLnNpemUoKTsgaSsrKXsKLQkJdHJhbnNhY3Rpb24gPSAoTWV0aG9kVHJhbnNhY3Rpb24pIHRyYW5zYWN0aW9ucy5nZXQoaSk7Ci0JCWFsbE1ldGhvZEVsZW1lbnRzLmFkZEFsbCh0cmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cyhhbkVKQikpOyAKLQl9Ci0JcmV0dXJuIGFsbE1ldGhvZEVsZW1lbnRzOwotfQotCQotcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgcm9sZU5hbWUpIHsKLQlqYXZhLnV0aWwuTGlzdCB0ZW1wUm9sZXMgPSBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JU2VjdXJpdHlSb2xlIHJvbGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wUm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJcm9sZSA9IChTZWN1cml0eVJvbGUpIHRlbXBSb2xlcy5nZXQoaSk7Ci0JCWlmIChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGVOYW1lKSkKLQkJCXJldHVybiByb2xlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IKLSAqLwotcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgamF2YS5sYW5nLlN0cmluZyBuZXdSb2xlTmFtZSkgewotCVNlY3VyaXR5Um9sZSByb2xlID0gZ2V0U2VjdXJpdHlSb2xlTmFtZWQoZXhpc3RpbmdSb2xlTmFtZSk7Ci0Jcm9sZS5zZXRSb2xlTmFtZShuZXdSb2xlTmFtZSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZFBlcm1pc3Npb25zKCkgewotCQlpZiAobWV0aG9kUGVybWlzc2lvbnMgPT0gbnVsbCkgewotCQkJbWV0aG9kUGVybWlzc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlCi0JICogYmVhbidzIG1ldGhvZCBpbnZvY2F0aW9ucy4gIFRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi0JICogbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlCi0JICogaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RUcmFuc2FjdGlvbnMoKSB7Ci0JCWlmIChtZXRob2RUcmFuc2FjdGlvbnMgPT0gbnVsbCkgewotCQkJbWV0aG9kVHJhbnNhY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTWV0aG9kVHJhbnNhY3Rpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUywgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQl9Ci0JCXJldHVybiBtZXRob2RUcmFuc2FjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUpCSmFyKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphcikgewotCQlpZiAobmV3RWpiSmFyICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiAmJiBuZXdFamJKYXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFamJKYXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFamJKYXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFamJKYXIobmV3RWpiSmFyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgbmV3RWpiSmFyLCBuZXdFamJKYXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdCBnZXRFeGNsdWRlTGlzdCgpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG5ld0V4Y2x1ZGVMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4Y2x1ZGVMaXN0IG9sZEV4Y2x1ZGVMaXN0ID0gZXhjbHVkZUxpc3Q7Ci0JCWV4Y2x1ZGVMaXN0ID0gbmV3RXhjbHVkZUxpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNULCBvbGRFeGNsdWRlTGlzdCwgbmV3RXhjbHVkZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG5ld0V4Y2x1ZGVMaXN0KSB7Ci0JCWlmIChuZXdFeGNsdWRlTGlzdCAhPSBleGNsdWRlTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhjbHVkZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhjbHVkZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhjbHVkZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhjbHVkZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeGNsdWRlTGlzdChuZXdFeGNsdWRlTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbmV3RXhjbHVkZUxpc3QsIG5ld0V4Y2x1ZGVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RUcmFuc2FjdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcigoRUpCSmFyKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFeGNsdWRlTGlzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TOgotCQkJCWdldE1ldGhvZFRyYW5zYWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJc2V0RXhjbHVkZUxpc3QoKEV4Y2x1ZGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TOgotCQkJCWdldE1ldGhvZFRyYW5zYWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJc2V0RXhjbHVkZUxpc3QoKEV4Y2x1ZGVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25zICE9IG51bGwgJiYgIW1ldGhvZFBlcm1pc3Npb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiBtZXRob2RUcmFuc2FjdGlvbnMgIT0gbnVsbCAmJiAhbWV0aG9kVHJhbnNhY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlyZXR1cm4gZXhjbHVkZUxpc3QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9ucyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBNZXRob2RFbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2luZyBAYW5FSkIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGF0YShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoYW5FSkIgIT0gbnVsbCkgewotCQkJcmVtb3ZlTWV0aG9kUGVybWlzc2lvbkRhdGEoYW5FSkIpOwotCQkJcmVtb3ZlTWV0aG9kVHJhbnNhY3Rpb25EYXRhKGFuRUpCKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jaW5nIEBhbkVKQi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNZXRob2RQZXJtaXNzaW9uRGF0YShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlMaXN0IG1lcyA9IGdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCU1ldGhvZFBlcm1pc3Npb24gbXA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzLnNpemUoKTsgaSsrKXsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIG1lcy5nZXQoaSk7Ci0JCQltcCA9IChNZXRob2RQZXJtaXNzaW9uKW1lLmVDb250YWluZXIoKTsKLQkJCWlmIChtcC5nZXRNZXRob2RFbGVtZW50cygpLnNpemUoKSA9PSAxKXsKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShtcCwgbXAuZVJlc291cmNlKCkpOwotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkucmVtb3ZlKG1wKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkobWUsIG1lLmVSZXNvdXJjZSgpKTsKLQkJCQltcC5nZXRNZXRob2RFbGVtZW50cygpLnJlbW92ZShtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmVtb3ZlIHRoZSBNZXRob2RFbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2luZyBAYW5FSkIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWV0aG9kVHJhbnNhY3Rpb25EYXRhKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCUxpc3QgbWVzID0gZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uIG10OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lcy5zaXplKCk7IGkrKyl7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBtZXMuZ2V0KGkpOwotCQkJbXQgPSAoTWV0aG9kVHJhbnNhY3Rpb24pbWUuZUNvbnRhaW5lcigpOwotCQkJaWYgKG10LmdldE1ldGhvZEVsZW1lbnRzKCkuc2l6ZSgpID09IDEpewotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmJlY29tZVByb3h5KG10LCBtdC5lUmVzb3VyY2UoKSk7Ci0JCQkJZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkucmVtb3ZlKG10KTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkobWUsIG1lLmVSZXNvdXJjZSgpKTsJCi0JCQkJbXQuZ2V0TWV0aG9kRWxlbWVudHMoKS5yZW1vdmUobWUpOwotCQkJfQotCQl9Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QQXR0cmlidXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzY2OGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUF0dHJpYnV0ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlIGZpZWxkIGVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgRUF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBDTVBBdHRyaWJ1dGUsIEVBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBKYXZhSGVscGVycyBvcmlnaW5hdGluZ1R5cGU7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBDTVBBdHRyaWJ1dGUgdGFyZ2V0QXR0cmlidXRlOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVkOwotCQotCXB1YmxpYyBDTVBBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01QX0FUVFJJQlVURTsKLQl9Ci0KLXByb3RlY3RlZCBGaWVsZCBmaW5kRXhpc3RpbmdGaWVsZCgpIHsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0RWpiQ2xhc3MoKTsKLQlpZiAoamF2YUNsYXNzICE9IG51bGwpCi0JCXJldHVybiBqYXZhQ2xhc3MuZ2V0RmllbGRFeHRlbmRlZChnZXROYW1lKCkpOwotCXJldHVybiBudWxsOwotfQotcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllciBnZXRBY2Nlc3NvclR5cGUoKSB7Ci0JaWYgKGdldEVqYkNsYXNzKCkgIT0gbnVsbCkgewotCQlNZXRob2QgZ2V0dGVyID0gZ2V0RWpiQ2xhc3MoKS5nZXRNZXRob2RFeHRlbmRlZChnZXRHZXR0ZXJOYW1lKCksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQlpZiAoZ2V0dGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRDTVBFbnRpdHkoKSB7Ci0JcmV0dXJuIChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBlQ29udGFpbmVyKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgRWpiQ2xhc3MgZnJvbSB0aGUgQ01QIEVudGl0eS4KLSAqLwotCi1wcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEVqYkNsYXNzKCkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZWpiID0gZ2V0Q01QRW50aXR5KCk7Ci0JcmV0dXJuIGVqYiA9PSBudWxsID8gbnVsbCA6IGVqYi5nZXRFamJDbGFzcygpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIEtleUNsYXNzIGZyb20gdGhlIENNUCBFbnRpdHkuCi0gKi8KLQotcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRLZXlDbGFzcygpIHsKLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVqYiA9IGdldENNUEVudGl0eSgpOwotCXJldHVybiBlamIgPT0gbnVsbCA/IG51bGwgOiBlamIuZ2V0UHJpbWFyeUtleSgpOwotfQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIFdpdGggRUpCIDIuMCwgYXNzdW1pbmcgYSBKYXZhIGZpZWxkIGlzIG5vIGxvbmdlciBzYWZlLgotICogCQlVc2UgZ2V0VHlwZSgpIGFuZCBnZXROYW1lKCkgdG8gZ2V0IHRoZSBtb3N0IGNvbW1vbiBmaWVsZCBpbmZvLgotICoJCU9yIHVzZSBnZXRFamJDbGFzcygpIHRvIGdldCBhZGRpdGlvbmFsIEphdmEgaW5mby4KLSAqLwotCi0gcHVibGljIEZpZWxkIGdldEZpZWxkKCkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZWpiID0gZ2V0Q01QRW50aXR5KCk7Ci0JCi0JaWYoZWpiID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCi0JRmllbGQgZmllbGQgPSBudWxsOwotCXN3aXRjaChlamIuZ2V0VmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQlmaWVsZCA9IGZpbmRFeGlzdGluZ0ZpZWxkKCk7Ci0JCQkvL1NldCB0aGUgZmllbGQgdHlwZSBiYXNlZCBvbiB0aGUgYXR0cmlidXRlIHR5cGUgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoZmllbGQgIT0gbnVsbCAmJiBnZXRFVHlwZSgpICE9IG51bGwgJiYgZmllbGQuZ2V0RVR5cGUoKSA9PSBudWxsKQotCQkJCWZpZWxkLnNldEVUeXBlKGdldEVUeXBlKCkpOyAKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDogZGVmYXVsdDoKLQkJCWZpZWxkID0gKChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKSkuZ2V0SmF2YVJlZkZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotCQkJZmllbGQuc2V0TmFtZShnZXROYW1lKCkpOwotCQkJZmllbGQuc2V0RVR5cGUoZ2V0QWNjZXNzb3JUeXBlKCkpOwotCQkJYnJlYWs7IAotCX0KLQlyZXR1cm4gZmllbGQ7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldEdldHRlck5hbWUoKSB7Ci0JaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoImdldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG5hbWUuY2hhckF0KDApKSkuYXBwZW5kKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpbiBpdHMgb3JpZ2luYWwgZm9ybSAoaS5lLiwgdW53cmFwcGVkIGlmCi0gKiB0aGUgdHlwZSBoYXMgYmVlbiB3cmFwcGVkKS4KLSAqLwotcHVibGljIEphdmFIZWxwZXJzIGdldE9yaWdpbmF0aW5nVHlwZSgpIHsKLQlyZXR1cm4gb3JpZ2luYXRpbmdUeXBlOwotfQotcHVibGljIFN0cmluZyBnZXRTZXR0ZXJOYW1lKCkgewotCXJldHVybiAic2V0IiArIENoYXJhY3Rlci50b1VwcGVyQ2FzZShnZXROYW1lKCkuY2hhckF0KDApKSArIChnZXROYW1lKCkubGVuZ3RoKCkgPiAxID8gZ2V0TmFtZSgpLnN1YnN0cmluZygxKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi19Ci1wdWJsaWMgSmF2YUhlbHBlcnMgZ2V0VHlwZSgpIHsKLQlpZiAoZ2V0RVR5cGUoKSAhPSBudWxsKQotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRFVHlwZSgpOwotCS8vIEJlIHNlbnNpdGl2ZSB0byBDTVAgMi4wIGJlYW5zLCBnZXQgdHlwZSBmcm9tIGZpZWxkIG9yIGdldCBhY2Nlc3NvciB0eXBlCi0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlamIgPSBnZXRDTVBFbnRpdHkoKTsKLQlSZXNvdXJjZSByZXMgPSBlUmVzb3VyY2UoKTsKLQlib29sZWFuIG1vZEZsYWcgPSByZXMgPT0gbnVsbCA/IGZhbHNlIDogcmVzLmlzTW9kaWZpZWQoKTsKLQlib29sZWFuIGRlbGl2ZXJ5RmxhZyA9IGVEZWxpdmVyKCk7Ci0JdHJ5IHsKLQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQlpZihlamIgIT0gbnVsbCkgewotCQkJc3dpdGNoKGVqYi5nZXRWZXJzaW9uSUQoKSkgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJCXNldEVUeXBlKGdldFR5cGVGcm9tQmVhbkZpZWxkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCQkJCQlzZXRFVHlwZShnZXQyMFR5cGUoKSk7Ci0JCQkJCWJyZWFrOyAKLQkJCX0gCi0JCX0KLQl9IGZpbmFsbHkgewotCQllU2V0RGVsaXZlcihkZWxpdmVyeUZsYWcpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSkKLQkJCXJlcy5zZXRNb2RpZmllZChtb2RGbGFnKTsKLQl9Ci0JcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLX0KLXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUeXBlRnJvbUJlYW5GaWVsZCgpIHsKLQlFQ2xhc3NpZmllciB0eXBlID0gbnVsbDsKLQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkKCk7Ci0JaWYgKGZpZWxkICE9IG51bGwpCi0JCXR5cGUgPSBmaWVsZC5nZXRFVHlwZSgpOwotCWlmICh0eXBlID09IG51bGwpCi0JCXR5cGUgPSBnZXRLZXlGaWVsZFR5cGVGcm9tS2V5Q2xhc3MoKTsKLQlyZXR1cm4gdHlwZTsKLX0KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXQyMFR5cGUoKSB7Ci0JRUNsYXNzaWZpZXIgdHlwZSA9IG51bGw7Ci0JaWYgKGdldEVqYkNsYXNzKCkgIT0gbnVsbCkgewotCQlTdHJpbmcgZ2V0dGVyTmFtZSA9IGdldEdldHRlck5hbWUoKTsKLQkJaWYgKGdldHRlck5hbWUgIT0gbnVsbCAmJiBnZXR0ZXJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJTWV0aG9kIGdldHRlciA9IGdldEVqYkNsYXNzKCkuZ2V0TWV0aG9kRXh0ZW5kZWQoZ2V0dGVyTmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQlpZiAoZ2V0dGVyICE9IG51bGwpCi0JCQkJdHlwZSA9IGdldHRlci5nZXRSZXR1cm5UeXBlKCk7Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgPT0gbnVsbCkKLQkJdHlwZSA9IGdldEtleUZpZWxkVHlwZUZyb21LZXlDbGFzcygpOwotCXJldHVybiB0eXBlOwkKLX0KLS8qKgotICogQHJldHVybgotICovCi1wcml2YXRlIEVDbGFzc2lmaWVyIGdldEtleUZpZWxkVHlwZUZyb21LZXlDbGFzcygpIHsKLQlpZiAoaXNLZXkoKSkgewotCQlKYXZhQ2xhc3Mga2V5ID0gZ2V0Q01QRW50aXR5KCkuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmdldFF1YWxpZmllZE5hbWUoKSAhPSBudWxsICYmICFrZXkuZ2V0UXVhbGlmaWVkTmFtZSgpLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGZpZWxkID0ga2V5LmdldEZpZWxkRXh0ZW5kZWQoZ2V0TmFtZSgpKTsKLQkJCWlmIChmaWVsZCAhPSBudWxsKQotCQkJCXJldHVybiBmaWVsZC5nZXRFVHlwZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBrZXk7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIGJvb2xlYW4gaXNDTVJGaWVsZCgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0tleSgpIHsKLQlyZXR1cm4gZ2V0Q01QRW50aXR5KCkgPT0gbnVsbCA/IGZhbHNlIDogZ2V0Q01QRW50aXR5KCkuaXNLZXlBdHRyaWJ1dGUodGhpcyk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbUtleUZpZWxkKCl7Ci0JcmV0dXJuIGdldENNUEVudGl0eSgpID09IG51bGwgPyBmYWxzZSA6IGdldENNUEVudGl0eSgpLmdldFByaW1LZXlGaWVsZCgpID09IHRoaXM7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE9yaWdpbmF0aW5nVHlwZShKYXZhSGVscGVycyBuZXdPcmlnaW5hdGluZ1R5cGUpIHsKLQlvcmlnaW5hdGluZ1R5cGUgPSBuZXdPcmlnaW5hdGluZ1R5cGU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY21yIGZpZWxkLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIDo6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgdGFyZ2V0QXR0cmlidXRlIGlzIGJlaW5nIHVzZWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLQkJcmV0dXJuIGRlcml2ZWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAoYUJvb2xlYW4gJiYgZ2V0RVR5cGUoKSA9PSBudWxsKQotCQkJZ2V0VHlwZSgpOyAvL1RoaXMgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGlzIHNldC4KLQkJZGVyaXZlZCA9IGFCb29sZWFuOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDUyYTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6Om5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjp0eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBDTVJGaWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQgKGEgamF2YSBjbGFzcyBuYW1lKS4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ01SRmllbGRJbXBsIGV4dGVuZHMgQ01QQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIENNUkZpZWxkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY29sbGVjdGlvblR5cGUgPSBudWxsOwotCXB1YmxpYyBDTVJGaWVsZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DTVJfRklFTEQ7Ci0JfQotCi0vKioKLSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQlnZXRDb2xsZWN0aW9uVHlwZSgpOwotCXJldHVybiBjb2xsZWN0aW9uVHlwZSA9PSBudWxsID8gbnVsbCA6IGNvbGxlY3Rpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLX0gICAgICAgICAgCi0KLXB1YmxpYyBib29sZWFuIGlzUHJpbUtleUZpZWxkKCl7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NNUkZpZWxkKCkgewotCXJldHVybiB0cnVlOwotfQotcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSwgY3JlYXRlQ2xhc3NSZWYodHlwZU5hbWUpKTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUpCUmVsYXRpb25zaGlwUm9sZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQkJaWYgKG5ld1JvbGUgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUgJiYgbmV3Um9sZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1JvbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdSb2xlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um9sZShuZXdSb2xlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFLCBuZXdSb2xlLCBuZXdSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDb2xsZWN0aW9uVHlwZSgpIHsKLQkJaWYgKGNvbGxlY3Rpb25UeXBlICE9IG51bGwgJiYgY29sbGVjdGlvblR5cGUuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvbGxlY3Rpb25UeXBlID0gKEludGVybmFsRU9iamVjdCljb2xsZWN0aW9uVHlwZTsKLQkJCWNvbGxlY3Rpb25UeXBlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZENvbGxlY3Rpb25UeXBlKTsKLQkJCWlmIChjb2xsZWN0aW9uVHlwZSAhPSBvbGRDb2xsZWN0aW9uVHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEUsIG9sZENvbGxlY3Rpb25UeXBlLCBjb2xsZWN0aW9uVHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2xsZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0Q29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZShKYXZhQ2xhc3MgbmV3Q29sbGVjdGlvblR5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZENvbGxlY3Rpb25UeXBlID0gY29sbGVjdGlvblR5cGU7Ci0JCWNvbGxlY3Rpb25UeXBlID0gbmV3Q29sbGVjdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEUsIG9sZENvbGxlY3Rpb25UeXBlLCBjb2xsZWN0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFJvbGUoKEVKQlJlbGF0aW9uc2hpcFJvbGUpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCXJldHVybiBiYXNpY1NldFJvbGUobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldENvbGxlY3Rpb25UeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q29sbGVjdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKLQkJCQlzZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29sbGVjdGlvblR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29sbGVjdGlvblR5cGUoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFOgotCQkJCXJldHVybiBjb2xsZWN0aW9uVHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEF0dHJpYnV0ZUltcGwjZ2V0Q01QRW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRDTVBFbnRpdHkoKSB7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IGdldFJvbGUoKTsKLQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCXJldHVybiByb2xlLmdldFNvdXJjZUVudGl0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdkNzk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklFSkJNb2RlbEV4dGVuZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgaW1wbGVtZW50cyBFSkJFeHRlbnNpb25GaWx0ZXIgewotIAkKLQlwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxDTVBDYWNoZT4gX2NhY2hlID0gbmV3IFRocmVhZExvY2FsPENNUENhY2hlPigpOwotCi0gICAgcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKXsKLSAgICAJTGlzdCBsaXN0ID0gZ2V0Q2FjaGUodGhpcywgY21wKTsKLSAgICAJaWYgKGxpc3QgIT0gbnVsbClyZXR1cm4gbGlzdDsKLSAgICAJCi0gICAgCWxpc3QgPSBmaWx0ZXJOb3RjYWNoZWQoY21wKTsKLSAgICAJc2V0Q2FjaGUodGhpcywgY21wLCBsaXN0KTsKLSAgICAJcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgdGhhdCBkb24ndCBpbXBsZW1lbnQgdGhlIGZpbHRlciBtZXRob2QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCAKLSAgICAgKiB0byBwcm92aWRlZCB0aGUgZmlsdGVyZWQgcmVzdWx0cy4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKXsKLSAgICAJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgQ01QQXR0cmlidXRlRmlsdGVycyBvbmx5IG9wZXJhdGUgb24gQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbgotICAgICAqIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZmlsdGVyKEVudGVycHJpc2VCZWFuIGVqYikgewotICAgICAgICBpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpIGVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHJldHVybiBmaWx0ZXIoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGVqYik7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsdGVyUm9sZUF0dHJpYnV0ZXNCeU5hbWUoTGlzdCBhbGxBdHRyaWJ1dGVzLCBMaXN0IHJvbGVBdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmICghcm9sZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgYWxsU2l6ZSwgcm9sZVNpemU7Ci0gICAgICAgICAgICByb2xlU2l6ZSA9IHJvbGVBdHRyaWJ1dGVzLnNpemUoKTsKLSAgICAgICAgICAgIENNUEF0dHJpYnV0ZSByb2xlQXR0LCBhbGxBdHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICByb2xlQXR0ID0gKENNUEF0dHJpYnV0ZSkgcm9sZUF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGFsbFNpemUgPSBhbGxBdHRyaWJ1dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gYWxsU2l6ZSAtIDE7IGogIT0gLTE7IGotLSkgewotICAgICAgICAgICAgICAgICAgICBhbGxBdHQgPSAoQ01QQXR0cmlidXRlKSBhbGxBdHRyaWJ1dGVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVBdHQgPT0gYWxsQXR0IHx8IHJvbGVBdHQuZ2V0TmFtZSgpLmVxdWFscyhhbGxBdHQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxsQXR0cmlidXRlcy5yZW1vdmUoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RWpiTW9kdWxlRXh0SGVscGVyKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZGVsRXh0ZW5kZXIgPSBudWxsOwotICAgICAgICBpZiAoY21wLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpCi0gICAgICAgICAgICByZXR1cm4gY21wLmdldFJvbGVzKCk7Ci0gICAgICAgIGVsc2UgaWYgKCAobW9kZWxFeHRlbmRlciA9IGdldEVqYk1vZHVsZUV4dEhlbHBlcihjbXApKSAhPSBudWxsICl7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWxFeHRlbmRlci5nZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzX2NtcDExKGNtcCk7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRSZWxhdGlvbnNoaXBSb2xlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgeyAKLSAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0gICAgICAgIGNvbGxlY3RSZWxhdGlvbnNoaXBSb2xlcyhjbXAsIGdldEVqYk1vZHVsZUV4dEhlbHBlcihjbXApLCByb2xlcyk7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJvbGVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29sbGVjdFJlbGF0aW9uc2hpcFJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5zaW9uSGVscGVyLCBMaXN0IGNvbnRhaW5lckxpc3QpIHsKLSAgICAgICAgaWYoY21wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNvbnRhaW5lckxpc3QuYWRkQWxsKGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKSk7Ci0gICAgICAgIGlmKGV4dGVuc2lvbkhlbHBlciAhPSBudWxsKQotICAgICAgICAgICAgY29sbGVjdFJlbGF0aW9uc2hpcFJvbGVzKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBleHRlbnNpb25IZWxwZXIuZ2V0U3VwZXJUeXBlKGNtcCksIGV4dGVuc2lvbkhlbHBlciwgY29udGFpbmVyTGlzdCk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGNhY2hlIGFuZCB0dXJuIG9mZiBjYWNoaW5nLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKXsKLQkJaWYgKF9jYWNoZSA9PSBudWxsKXJldHVybjsKLQkJZ2V0Q2FjaGUoKS5jbGVhcigpOwotCQlnZXRDYWNoZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoZShDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIGZpbHRlciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIExpc3QgbGlzdCkgewotCQlnZXRDYWNoZSgpLnNldChmaWx0ZXIsIGNtcCwgbGlzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDYWNoZShDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIGZpbHRlciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJcmV0dXJuIGdldENhY2hlKCkuZ2V0KGZpbHRlciwgY21wKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBDTVBDYWNoZSBmb3IgdGhpcyB0aHJlYWQuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ01QQ2FjaGUgZ2V0Q2FjaGUoKXsKLQkJQ01QQ2FjaGUgY2FjaGUgPSBfY2FjaGUuZ2V0KCk7Ci0JCWlmIChjYWNoZSA9PSBudWxsKXsKLQkJCWNhY2hlID0gbmV3IENNUENhY2hlKCk7Ci0JCQlfY2FjaGUuc2V0KGNhY2hlKTsKLQkJfQotCQlyZXR1cm4gY2FjaGU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCAod2l0aCB0aGUgcGFyYW1ldGVyIHRydWUpIGlmIHlvdSB3aXNoIHRoZSAKLQkgKiBmaWx0ZXIgcmVzdWx0cyB0byBiZSBjYWNoZWQuIEJ5IGRlZmF1bHQgdGhlIHJlc3VsdHMgYXJlIG5vdCBjYWNoZWQuCi0JICogPHA+Ci0JICogVGhlIGNhY2hlIGlzIHRocmVhZCBiYXNlZC4gV2hlbiBkb25lIHRoZSBjbGVhckNhY2hlIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBpc0VuYWJsZWQgc2V0IHRoaXMgdG8gdHJ1ZSB0byBoYXZlIHRoZSBmaWx0ZXIgcmVzdWx0cyBjYWNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlQ2FjaGUoYm9vbGVhbiBpc0VuYWJsZWQpewotCQlnZXRDYWNoZSgpLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIGEgdGhyZWFkIGxvY2FsIGNhY2hlIG9mIGZpbHRlcmVkIHJlc3VsdHMuCi0gICAgICogQGF1dGhvciBrYXJhc2l1awotICAgICAqCi0gICAgICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ01QQ2FjaGUgewotCQkKLQkJLyoKLQkJICogV2UgZGlzY292ZXJlZCBzb21lIHZlcnkgZGVlcCBjb2RlIHBhdGhzIHdoZW4gdmFsaWRhdGluZyBFSkJzLiBJbiBvbmUgZXhhbXBsZSBwcm9qZWN0IHRoYXQgCi0JCSAqIG9ubHkgaGFkIGEgZmV3IGJlYW5zLCBpdCB0b29rIDEyIGhvdXJzIHRvIHZhbGlkYXRlLiBLZWVwaW5nIGEgY2FjaGUgZHVyaW5nIHZhbGlkYXRpb24KLQkJICogcmVkdWNlZCB0aGUgdGltZSB0byBzZWNvbmRzLgotCQkgKi8KLQkJCi0JCXByaXZhdGUgTWFwIAkJX21hcCA9IG5ldyBIYXNoTWFwKDMwKTsKLQkJCi0JCS8qKiBJcyB0aGUgY2FjaGUgdHVybmVkIG9uLCBieSBkZWZhdWx0IGl0IGlzIG5vdC4gKi8KLQkJcHJpdmF0ZSBib29sZWFuCQlfZW5hYmxlZDsKLQkJCi0JCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpewotCQkJX2VuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXQoQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciBmaWx0ZXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCQlpZiAoIV9lbmFibGVkKXJldHVybiBudWxsOwotCQkJCi0JCQlNYXAgbWFwID0gKE1hcClfbWFwLmdldChmaWx0ZXIpOwotCQkJaWYgKG1hcCA9PSBudWxsKXsKLQkJCQltYXAgPSBuZXcgSGFzaE1hcCgxMDApOwotCQkJCV9tYXAucHV0KGZpbHRlciwgbWFwKTsKLQkJCX0KLQkJCXJldHVybiAoTGlzdCltYXAuZ2V0KGNtcCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXQoQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciBmaWx0ZXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBMaXN0IGxpc3QpIHsKLQkJCWlmICghX2VuYWJsZWQpcmV0dXJuOyAKLQkJCQotCQkJTWFwIG1hcCA9IChNYXApX21hcC5nZXQoZmlsdGVyKTsKLQkJCWlmIChtYXAgPT0gbnVsbCl7Ci0JCQkJbWFwID0gbmV3IEhhc2hNYXAoMTAwKTsKLQkJCQlfbWFwLnB1dChmaWx0ZXIsIG1hcCk7Ci0JCQl9Ci0JCQkKLQkJCW1hcC5wdXQoY21wLCBsaXN0KTsJCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKXsKLQkJCV9tYXAuY2xlYXIoKTsKLQkJfQotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWJmMGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwgZXh0ZW5kcyBFbnRpdHlJbXBsIGltcGxlbWVudHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiAKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMS54IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGZHZW5lcmF0ZWRJZFR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNfRkVBVFVSRV9DSE5HX05PVElGSUVSID0gIlBlcnNpc3RlbnRGZWF0dXJlQ2hhbmdlTm90aWZpY2F0aW9uQWRhcHRlciI7CSAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTUVUSE9EX05BTUUgPSAiUXVlcnlNZXRob2QiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORF9CWV9QUklNX0tFWV9NRVRIT0RfTkFNRSA9ICJmaW5kQnlQcmltYXJ5S2V5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFic3RyYWN0U2NoZW1hTmFtZSA9IEFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGtleUF0dHJpYnV0ZXMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJpZXMoKSA8ZW0+UXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcXVlcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDTVBBdHRyaWJ1dGUoKSA8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDTVBBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjbXBBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbUtleUZpZWxkKCkgPGVtPlByaW0gS2V5IEZpZWxkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltS2V5RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDTVBBdHRyaWJ1dGUgcHJpbUtleUZpZWxkID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTsKLQl9Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF0dHJpYnV0ZUV4dG4gd2l0aCBhTmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBrZXlGZWF0dXJlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzIvMjAwMCA5OjExOjEzIFBNKQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqIEByZXR1cm4gQ01QQXR0cmlidXRlCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgYWRkS2V5QXR0cmlidXRlTmFtZShTdHJpbmcgYU5hbWUpIHsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhTmFtZSk7Ci0JaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCUxpc3Qga2V5cyA9IGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJQ01QQXR0cmlidXRlIGtleTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlrZXkgPSAoQ01QQXR0cmlidXRlKSBrZXlzLmdldChpKTsKLQkJCWlmIChhTmFtZS5lcXVhbHMoa2V5LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQkJfQotCQlrZXlzLmFkZChhdHRyaWJ1dGUpOwotCX0KLQlyZXR1cm4gYXR0cmlidXRlOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIG9uZSBvZiB0aGUgcHJvcGVydGllcyB1c2luZyBhRmlsdGVyLgotKi8KLXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkRmVhdHVyZXMoRUpCRXh0ZW5zaW9uRmlsdGVyIGFGaWx0ZXIpIHsKLQkJcmV0dXJuIGFGaWx0ZXIuZmlsdGVyKHRoaXMpOwotCX0KLS8qKgotICogQWRkIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuYW1lIGZvciBhRmllbGQuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8zLzIwMDAgODozMDo0MiBBTSkKLSAqIEBwYXJhbSBhRmllbGQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuRmllbGQKLSAqIEByZXR1cm4gQ01QQXR0cmlidXRlCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgYWRkUGVyc2lzdGVudEF0dHJpYnV0ZShGaWVsZCBhRmllbGQpIHsKLQlpZiAoYUZpZWxkID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCXJldHVybiBhZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZShhRmllbGQuZ2V0TmFtZSgpKTsKLX0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF0dHJpYnV0ZUV4dG4gd2l0aCBhTmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBwZXJzaXN0ZW50RmVhdHVyZXMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8yLzIwMDAgOToxMToxMyBQTSkKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKiBAcmV0dXJuIENNUEF0dHJpYnV0ZQotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhTmFtZSkgewotCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKGFOYW1lKTsKLQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJYXR0cmlidXRlID0gY3JlYXRlUGVyc2lzdGVudEF0dHJpYnV0ZShhTmFtZSk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JfQotCXJldHVybiBhdHRyaWJ1dGU7Ci19Ci1wcm90ZWN0ZWQgQ01QQXR0cmlidXRlIGNyZWF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSA9ICgoRWpiUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JYXR0cmlidXRlLnNldE5hbWUoYU5hbWUpOwotCXJldHVybiBhdHRyaWJ1dGU7Ci19Ci1wdWJsaWMgTGlzdCBnZXRBbGxBdmFpbGFibGVRdWVyeU1ldGhvZHMoKSB7Ci0JU2V0IHNpZ3MgPSBuZXcgSGFzaFNldCgpOwotCUxpc3QgamF2YU1ldGhvZHMgPSBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeUphdmFNZXRob2RzKCk7Ci0Jc2lncy5hZGRBbGwoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoamF2YU1ldGhvZHMpKTsKLQlqYXZhTWV0aG9kcyA9IGdldEF2YWlsYWJsZUxvY2FsUXVlcnlKYXZhTWV0aG9kcygpOwotCXNpZ3MuYWRkQWxsKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGphdmFNZXRob2RzKSk7Ci0JamF2YU1ldGhvZHMgPSBnZXRBdmFpbGFibGVSZW1vdGVRdWVyeUphdmFNZXRob2RzKCk7Ci0Jc2lncy5hZGRBbGwoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoamF2YU1ldGhvZHMpKTsKLQlMaXN0IHNpZ25hdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHNpZ3MpOwotCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZHMoc2lnbmF0dXJlcyk7Ci19Ci1wcm90ZWN0ZWQgTGlzdCBjcmVhdGVRdWVyeU1ldGhvZHMoTGlzdCBzaWduYXR1cmVzKSB7Ci0JQ29sbGVjdGlvbnMuc29ydChzaWduYXR1cmVzKTsKLQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMOwotCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50cyhRVUVSWV9NRVRIT0RfTkFNRSwgc2lnbmF0dXJlcywgZW51bWVyYXRvcik7Ci19Ci0KLXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5TWV0aG9kcygpIHsKLQlMaXN0IG1ldGhvZHMgPSBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeUphdmFNZXRob2RzKCk7Ci0JTGlzdCBzaWdzID0gZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMobWV0aG9kcyk7Ci0JcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kcyhzaWdzKTsKLX0KLXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5SmF2YU1ldGhvZHMoKSB7Ci0JSmF2YUNsYXNzIGJlYW4gPSBnZXRFamJDbGFzcygpOwotCWlmIChiZWFuID09IG51bGwpCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCXJldHVybiBiZWFuLmdldE9ubHlTcGVjaWZpY01ldGhvZHMoImVqYlNlbGVjdCIsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwkgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzKCkgewotCVNldCBzaWdzID0gbmV3IEhhc2hTZXQoKTsKLQlMaXN0IGphdmFNZXRob2RzID0gZ2V0QXZhaWxhYmxlUmVtb3RlUXVlcnlKYXZhTWV0aG9kcygpOwotCXNpZ3MuYWRkQWxsKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGphdmFNZXRob2RzKSk7Ci0JamF2YU1ldGhvZHMgPSBnZXRBdmFpbGFibGVMb2NhbFF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlzaWdzLmFkZEFsbChnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhqYXZhTWV0aG9kcykpOwotCUxpc3Qgc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Qoc2lncyk7Ci0JcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kcyhzaWduYXR1cmVzKTsKLX0KLXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUxvY2FsUXVlcnlKYXZhTWV0aG9kcygpIHsKLQlyZXR1cm4gZ2V0QXZhaWxhYmxlUXVlcnlKYXZhTWV0aG9kcyhnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci19Ci0vKioKLSogVGhpcyByZXR1cm5zIHRoZSBDTVAgdmVyc2lvbiBpZCBieSB1c2luZyB0aGUgbW9kdWxlIGlkIGFuZCB0aGUgPGNtcC12ZXJzaW9uPi4gCi0qIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgQ01QIGxldmVsCi0qIFRoaXMgd2lsbCBoZWxwIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAyLjAsMi4xLC4uLiAgIHJhdGhlciB0aGFuICIyLngiCi0qLwotcHVibGljIGludCBnZXRDTVBWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkvKiBJZiByZXNvdXJjZSBpcyBudWxsIHdlIHdpbGwgcmV0dXJuIGJhc2VkIG9uIENNUCB2ZXJzaW9uLi4uLiovCi0JaWYgKHJlcyA9PSBudWxsKSB7Ci0JCWlmIChnZXRWZXJzaW9uKCkuZXF1YWxzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCX0KLQlpbnQgY21wVmVyc2lvbjsKLQlzd2l0Y2ggKHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQgOgotCQkJaWYgKGdldFZlcnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKFZFUlNJT05fMl9YKSkKLQkJCQljbXBWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCWVsc2UKLQkJCQljbXBWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQgOgotCQkJCQlpZiAoZ2V0VmVyc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoVkVSU0lPTl8yX1gpKQotCQkJCQkJY21wVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWNtcFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJCQlicmVhazsKLQotCQlkZWZhdWx0IDoKLQkJCWNtcFZlcnNpb24gPSByZXMuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotCXJldHVybiBjbXBWZXJzaW9uOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiNnZXRWZXJzaW9uSUQoKQotICovCi1wdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQlyZXR1cm4gZ2V0Q01QVmVyc2lvbklEKCk7Ci19cHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlUXVlcnlKYXZhTWV0aG9kcygpIHsKLQlyZXR1cm4gZ2V0QXZhaWxhYmxlUXVlcnlKYXZhTWV0aG9kcyhnZXRIb21lSW50ZXJmYWNlKCkpOwotfQotCi1wcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVRdWVyeUphdmFNZXRob2RzKEphdmFDbGFzcyBob21lKSB7Ci0JaWYgKGhvbWUgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JTGlzdCBleGNsdWRlZCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JZXhjbHVkZWQuYWRkKCJmaW5kQnlQcmltYXJ5S2V5Iik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaG9tZS5nZXRPbmx5U3BlY2lmaWNNZXRob2RzKCJmaW5kIiwgZXhjbHVkZWQpOyAvLyROT04tTkxTLTEkCi19Ci0KLXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRHZW5lcmF0ZWRJZFR5cGUoKSB7Ci0JaWYgKGZHZW5lcmF0ZWRJZFR5cGUgPT0gbnVsbCkgewotCQlmR2VuZXJhdGVkSWRUeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKEpBVkFfTEFOR19TVFJJTkcsIHRoaXMpOwotCX0KLQlyZXR1cm4gZkdlbmVyYXRlZElkVHlwZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXlBdHRyaWJ1dGUgd2l0aCBhTmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzgvMjAwMCA5OjI1OjI3IFBNKQotICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgZ2V0S2V5QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCWlmIChhTmFtZSAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0S2V5QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNNUEF0dHJpYnV0ZSBuZXh0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJaWYgKGFOYW1lLmVxdWFscyhuZXh0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSB3aXRoIGFOYW1lLgotICogQ3JlYXRpb24gZGF0ZTogKDgvOC8yMDAwIDk6MjU6MjcgUE0pCi0gKiBAcmV0dXJuIEVTdHJ1Y3R1cmFsRmVhdHVyZQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCWlmIChhTmFtZSAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlDTVBBdHRyaWJ1dGUgbmV4dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmV4dCA9IChDTVBBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCWlmIChhTmFtZS5lcXVhbHMobmV4dC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBuZXh0OwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIElmIGEgcHJpbWFyeSBrZXkgZXhpc3RzLCByZXR1cm4gdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlOyB0aGUgcHJpbWFyeSBrZXkgaXMgZGVmaW5lZCBhcyBvbmUgYW5kIG9ubHkgb25lCi0gKiBrZXkgYXR0cmlidXRlLCB3aG9zZSB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBrZXkgY2xhc3MKLSAqIEBkZXByZWNhdGVkIHVzZSBnZXRQcmltS2V5RmllbGQoKQotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKSB7Ci0JcmV0dXJuIGdldFByaW1LZXlGaWVsZCgpOwotfQotCi0KLS8qKgotICogaXNDb250YWluZXJNYW5hZ2VkRW50aXR5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0tleUF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQlqYXZhLnV0aWwuTGlzdCBhdHRyaWJ1dGVzID0gZ2V0S2V5QXR0cmlidXRlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKyl7Ci0JCWlmIChhdHRyaWJ1dGVzLmdldChpKSA9PSBhbkF0dHJpYnV0ZSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKgotICogUmV0dXJuIHdoZXRoZXIgdGhpcyBiZWFuIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgdGhlICJ1bmtub3duIHByaW1hcnkga2V5IiBjYXNlCi0gKiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIGlkZW50aWZpZWQgYnkgdGhlIHByaW1hcnkga2V5IGNsYXNzCi0gKiBiZWluZyBzcGVjaWZpZWQgYXMgImphdmEubGFuZy5PYmplY3QiLgotICogSW4gb3JkZXIgdG8gZGVwbG95IGFuIHVua25vd24gcHJpbWFyeSBrZXkgYmVhbiwgd2UgbXVzdCBzdWJzdGl0dXRlIGEgcmVhbCBrZXksCi0gKiBhbmQgYWRkIGEgY29ycmVzcG9uZGluZyBmaWVsZC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNVbmtub3duUHJpbWFyeUtleSgpIHsKLQlTdHJpbmcga2V5TmFtZSA9IGdldFByaW1hcnlLZXlOYW1lKCk7Ci0JaWYgKGtleU5hbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vdGVzdCB3aGV0aGVyIGl0IGlzIHVua25vd24gb3Igd2UgaGF2ZSB0aGUgV0FTIGdlbmVyYXRlZCBrZXkgZm9yIHRoZSB1bmtub3duIHByaW0ga2V5Ci0JYm9vbGVhbiBnZW5UZXN0ID0ga2V5TmFtZS5lcXVhbHMoVU5LTk9XTl9QUklNQVJZX0tFWSkgfHwga2V5TmFtZS5lcXVhbHMoV0FTX0dFTkVSQVRFRF9TVFJJTkdfS0VZKTsKLQlpZiAoZ2VuVGVzdCkgcmV0dXJuIHRydWU7Ci0JLy9MYXN0bHksIHRlc3QgZm9yIHRoZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgbWV0aG9kIG9uIHRoZSBob21lLgotCUphdmFDbGFzcyBob21lID0gZ2V0SG9tZUludGVyZmFjZSgpOwotCWlmIChob21lID09IG51bGwpCi0JCWhvbWUgPSBnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQlpZiAoaG9tZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JTGlzdCBwYXJtVHlwZSA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgcGFybVR5cGUuYWRkKFVOS05PV05fUFJJTUFSWV9LRVkpOwotICAgCXJldHVybiBob21lLmdldE1ldGhvZEV4dGVuZGVkKEZJTkRfQllfUFJJTV9LRVlfTUVUSE9EX05BTUUsIHBhcm1UeXBlKSAhPSBudWxsOwotfQotLyoqCi0gKiBpc1ZlcnNpb24xX1ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfWCgpIHsKLQlyZXR1cm4gZ2V0VmVyc2lvbigpLmVxdWFscyhDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKLX0KLS8qKgotICogaXNWZXJzaW9uMl9YIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yX1goKSB7Ci0JcmV0dXJuIGdldFZlcnNpb24oKS5lcXVhbHMoQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWCk7Ci19Ci0vKiAKLSAqIGxpc3RQZXJzaXN0ZW50RmllbGROYW1lcyAtIHJldHVybiB0aGUgbmFtZXMgb2Ygb3VyIENNUCBmaWVsZHMuIGRlcml2ZWQgZnJvbSBwZXJzaXN0ZW50RmVhdHVyZXMKLSAqLwotcHVibGljIFN0cmluZ1tdIGxpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpIHsKLQlqYXZhLnV0aWwuTGlzdCBhdHRyaWJ1dGVzID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbYXR0cmlidXRlcy5zaXplKCldOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQluYW1lc1tpXSA9ICgoQ01QQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKSkuZ2V0TmFtZSgpOwotCX0KLQlyZXR1cm4gbmFtZXM7Ci19Ci0KLS8qKgotICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgRmllbGQncyBuYW1lLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMy8yMDAwIDg6MzM6MDEgQU0pCi0gKiBAcGFyYW0gYUZpZWxkIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkZpZWxkCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShGaWVsZCBhRmllbGQpIHsKLQlpZiAoYUZpZWxkICE9IG51bGwpCi0JCXJldHVybiByZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKGFGaWVsZC5nZXROYW1lKCkpOwotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSZW1vdmUgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZWQgYU5hbWUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8yLzIwMDAgODo1OTozMiBQTSkKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQlpZiAoYU5hbWUgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpdCA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJQ01QQXR0cmlidXRlIG5leHQ7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5leHQgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYU5hbWUuZXF1YWxzKG5leHQuZ2V0TmFtZSgpKSkgewotCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkucmVtb3ZlKG5leHQpOwotCQkJCXJldHVybiBuZXh0OwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0JICogCi0JICogQGludmFyaWFudCBUaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogMS54ICwgMi54Ci0JICogQGRlZmF1bHQgMi54Ci0JICogUmV0dXJucyAiMS54IiBpZiBpbiBhIDEuMSBKYXIgKEZvciBjb21wYXRpYmlsaXR5KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCSAqIAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0JCXJldHVybiBhYnN0cmFjdFNjaGVtYU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzdHJhY3RTY2hlbWFOYW1lKFN0cmluZyBuZXdBYnN0cmFjdFNjaGVtYU5hbWUpIHsKLQkJU3RyaW5nIG9sZEFic3RyYWN0U2NoZW1hTmFtZSA9IGFic3RyYWN0U2NoZW1hTmFtZTsKLQkJYWJzdHJhY3RTY2hlbWFOYW1lID0gbmV3QWJzdHJhY3RTY2hlbWFOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUUsIG9sZEFic3RyYWN0U2NoZW1hTmFtZSwgYWJzdHJhY3RTY2hlbWFOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgewotCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ01QQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFic3RyYWN0U2NoZW1hTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWJzdHJhY3RTY2hlbWFOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEtleUF0dHJpYnV0ZXNHZW4oKSB7Ci0JCWlmIChrZXlBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWtleUF0dHJpYnV0ZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENNUEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4ga2V5QXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0S2V5QXR0cmlidXRlcygpIHsKLQkgICAgaWYoa2V5QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCSAgICBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyIHN5bmNBZGFwdGVyID0gKENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIpICBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMsIENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIuQURBUFRFUl9UWVBFKTsKLQkJCWlmKHN5bmNBZGFwdGVyICE9IG51bGwpIAotCQkJICAgIHN5bmNBZGFwdGVyLmluaXRpYWxpemVLZXlBdHRyaWJ1dGVzKCk7IAotCSAgICB9Ci0JCXJldHVybiBnZXRLZXlBdHRyaWJ1dGVzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Q2hhbmdlIGZvciBidWd6aWxsYSAxNzczOTcuICBQcm92aWRlIGFjY2VzcyB0byB0aGUKLQkgKiBpbml0aWFsaXphdGlvbiBzdGF0ZSBvZiB0aGUga2V5IGF0dHJpYnV0ZXMgYXR0cmlidXRlLjwvcD4KLQkgKiAKLQkgKiA8cD5UaGUgaW5pdGlhbGl6YXRpb24gc3RhdGUgaXMgdXNlZCB3aGlsZSBjb3B5aW5nIHRoZQotCSAqIHJlY2VpdmVyLiAgSWYgdGhlIGtleSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZSBoYXMgbm90IGJlZW4KLQkgKiBpbml0aWFsaXplZCwgdGhlbiB0aGUgY29weSBkb2VzIG5vdCBuZWVkIHRvIGRlc2NlbmQgaW50byB0aGUKLQkgKiBrZXkgYXR0cmlidXRlcy48L3A+Ci0JICogCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBrZXkgYXR0cmlidXRlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogICAgICAgICBPdGhlcndpc2UsIGZhbHNlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNJbml0aWFsaXplZEtleUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoa2V5QXR0cmlidXRlcyA9PSBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFF1ZXJpZXMoKSB7Ci0JCWlmIChxdWVyaWVzID09IG51bGwpIHsKLQkJCXF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChRdWVyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMsIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIHF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENNUEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGNtcEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQljbXBBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENNUEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBjbXBBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUEF0dHJpYnV0ZSBnZXRQcmltS2V5RmllbGQoKSB7Ci0JCWlmIChwcmltS2V5RmllbGQgIT0gbnVsbCAmJiBwcmltS2V5RmllbGQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByaW1LZXlGaWVsZCA9IChJbnRlcm5hbEVPYmplY3QpcHJpbUtleUZpZWxkOwotCQkJcHJpbUtleUZpZWxkID0gKENNUEF0dHJpYnV0ZSllUmVzb2x2ZVByb3h5KG9sZFByaW1LZXlGaWVsZCk7Ci0JCQlpZiAocHJpbUtleUZpZWxkICE9IG9sZFByaW1LZXlGaWVsZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCwgb2xkUHJpbUtleUZpZWxkLCBwcmltS2V5RmllbGQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJpbUtleUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VQcmltS2V5RmllbGRQcm94eSgpIHsKLQkJaWYgKHByaW1LZXlGaWVsZCA9PSBudWxsKSByZXR1cm47Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBwcmltS2V5RmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoZmllbGROYW1lID09IG51bGwpIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXByaW1LZXlGaWVsZCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQkoKEludGVybmFsRU9iamVjdClwcmltS2V5RmllbGQpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKGZpZWxkTmFtZSkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01QQXR0cmlidXRlIGJhc2ljR2V0UHJpbUtleUZpZWxkKCkgewotCQlyZXR1cm4gcHJpbUtleUZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUgbmV3UHJpbUtleUZpZWxkKSB7Ci0JCUNNUEF0dHJpYnV0ZSBvbGRQcmltS2V5RmllbGQgPSBwcmltS2V5RmllbGQ7Ci0JCXByaW1LZXlGaWVsZCA9IG5ld1ByaW1LZXlGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxELCBvbGRQcmltS2V5RmllbGQsIHByaW1LZXlGaWVsZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRRdWVyaWVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKLQkJCQlyZXR1cm4gZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0UXVlcmllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0Q01QQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByaW1LZXlGaWVsZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFByaW1LZXlGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJc2V0QWJzdHJhY3RTY2hlbWFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUzoKLQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTOgotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJZ2V0UXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURToKLQkJCQlnZXRDTVBBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldENNUEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQ6Ci0JCQkJc2V0UHJpbUtleUZpZWxkKChDTVBBdHRyaWJ1dGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJc2V0QWJzdHJhY3RTY2hlbWFOYW1lKEFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTOgotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJZ2V0UXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURToKLQkJCQlnZXRDTVBBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEOgotCQkJCXNldFByaW1LZXlGaWVsZCgoQ01QQXR0cmlidXRlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJcmV0dXJuIEFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBhYnN0cmFjdFNjaGVtYU5hbWUgIT0gbnVsbCA6ICFBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVC5lcXVhbHMoYWJzdHJhY3RTY2hlbWFOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhcGVyc2lzdGVudEF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fS0VZX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGtleUF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAha2V5QXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCXJldHVybiBxdWVyaWVzICE9IG51bGwgJiYgIXF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gY21wQXR0cmlidXRlICE9IG51bGwgJiYgIWNtcEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRDoKLQkJCQlyZXR1cm4gcHJpbUtleUZpZWxkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldENNUkZpZWxkcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q01SRmllbGRzKCkgewotCQlMaXN0IG15Um9sZXMgPSBnZXRSb2xlcygpOwotCQlMaXN0IGNtckZpZWxkcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChteVJvbGVzICE9IG51bGwgJiYgIW15Um9sZXMuaXNFbXB0eSgpKSB7Ci0JCQljbXJGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpID0gbXlSb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIGkubmV4dCgpOwotCQkJCUNNUkZpZWxkIGZpZWxkID0gcm9sZS5nZXRDbXJGaWVsZCgpOwotCQkJCWlmIChmaWVsZCAhPSBudWxsKQotCQkJCQljbXJGaWVsZHMuYWRkKGZpZWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21yRmllbGRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VsZlJlZmVyZW5jaW5nKEVKQlJlbGF0aW9uIHJlbCkgewotCQlpZiAocmVsLmdldFNlY29uZFJvbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHJlbC5nZXRGaXJzdFJvbGUoKS5nZXRTb3VyY2VFbnRpdHkoKSA9PSB0aGlzKSAmJgotCQkJKHJlbC5nZXRTZWNvbmRSb2xlKCkuZ2V0U291cmNlRW50aXR5KCkgPT0gdGhpcyk7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0Um9sZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVzKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGFsbFJvbGVzID0gZ2V0RWpiSmFyKCkuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCUxpc3QgbXlSb2xlcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChhbGxSb2xlcyAhPSBudWxsICYmICFhbGxSb2xlcy5pc0VtcHR5KCkpIHsKLQkJCW15Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpID0gYWxsUm9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUVKQlJlbGF0aW9uIHJlbCA9IChFSkJSZWxhdGlvbikgaS5uZXh0KCk7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gcmVsLmdldEZpcnN0Um9sZSgpOwotCQkJCWlmIChpc1NlbGZSZWZlcmVuY2luZyhyZWwpKSB7Ci0JCQkJCW15Um9sZXMuYWRkKHJlbC5nZXRGaXJzdFJvbGUoKSk7Ci0JCQkJCW15Um9sZXMuYWRkKHJlbC5nZXRTZWNvbmRSb2xlKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgocm9sZSAhPSBudWxsKSAmJiByb2xlLmdldFNvdXJjZUVudGl0eSgpID09IHRoaXMpIHsKLQkJCQkJbXlSb2xlcy5hZGQocm9sZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcm9sZSA9IHJlbC5nZXRTZWNvbmRSb2xlKCk7Ci0JCQkJCWlmICgocm9sZSAhPSBudWxsKSAmJiAocm9sZS5nZXRTb3VyY2VFbnRpdHkoKSA9PSB0aGlzKSkKLQkJCQkJCW15Um9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlSb2xlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRSb2xlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZShTdHJpbmcgcm9sZU5hbWUpIHsKLQkJTGlzdCByb2xlcyA9IGdldFJvbGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyb2xlcy5zaXplKCk7IGkrKykgewotCQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0TmFtZSgpLmVxdWFscyhyb2xlTmFtZSkpCi0JCQkJcmV0dXJuIHJvbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMGY0MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLklSb2xlU2hhcGVTdHJhdGVneTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzYvMjAwMCAxMTo0MTozMyBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3kgZXh0ZW5kcyBSb2xlU2hhcGVTdHJhdGVneSB7Ci0JLyoqCi0JICogRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCXN1cGVyKGFSb2xlKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQ29udGludWUoKSB7Ci0JCXJldHVybiAhYnVzeSAmJiByb2xlLmdldE5hbWUoKSAhPSBudWxsICYmIChyb2xlLmlzRm9yd2FyZCgpIHx8Ci0JCQkocm9sZS5pc01hbnkoKSAmJiAocm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpID09IG51bGwgfHwKLQkJCXJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKS5pc01hbnkoKSkpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdXNlc0F0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZihJUm9sZVNoYXBlU3RyYXRlZ3kuQVRUUklCVVRFX05BTUVfSk9JTkVSKTsKLQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJcmV0dXJuIGdldFJvbGUoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJvbGVTaGFwZVN0cmF0ZWd5I3JlY29uY2lsZUF0dHJpYnV0ZXMoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSwgU3RyaW5nLCBMaXN0LCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgYUxpc3QsIExpc3QgY29tcHV0ZWROYW1lcykgewotCQkKLQkJUmVzb3VyY2UgcmVzID0gYVJvbGUuZVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gcmVzICE9IG51bGwgPyByZXMuaXNNb2RpZmllZCgpIDogZmFsc2U7Ci0JCXRyeSB7CQkKLQkJCWlmIChhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpICE9IG51bGwpIHsKLQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuZ2V0U291cmNlRW50aXR5KCk7Ci0JCS8vCUNvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gcm9sZVR5cGUgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbilnZXRUeXBlRXh0ZW5zaW9uKGFSb2xlKTsKLQkJCWlmIChlbnRpdHkgIT0gbnVsbCkKLQkJCQljb2xsZWN0QXR0cmlidXRlcyhlbnRpdHksIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXJlcy5zZXRNb2RpZmllZChkaXJ0eUZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLkZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5I3NldERlcml2ZWRBdHRyaWJ1dGVUeXBlKENNUEF0dHJpYnV0ZSwgSmF2YUhlbHBlcnMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVyaXZlZEF0dHJpYnV0ZVR5cGUoQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSwgQ01QQXR0cmlidXRlIHRhcmdldEF0dHJpYnV0ZSwgYm9vbGVhbiBpc05ldykgewotCQlpZiAodGFyZ2V0QXR0cmlidXRlID09IG51bGwpIHJldHVybjsKLQkJSmF2YUhlbHBlcnMgZmllbGRUeXBlID0gdGFyZ2V0QXR0cmlidXRlLmdldFR5cGUoKTsKLQkJaWYgKGZpZWxkVHlwZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2luZ2xlUm9sZU5hbWVTaXplID0gZ2V0Um9sZSgpLmdldE5hbWUoKS5sZW5ndGgoKSArIHRhcmdldEF0dHJpYnV0ZS5nZXROYW1lKCkubGVuZ3RoKCkgKyAxOyAvL29uZSBmb3IgdGhlIHVuZGVyc2NvcmUKLQkJCWlmICghKGF0dHJpYnV0ZS5nZXROYW1lKCkubGVuZ3RoKCkgPiBzaW5nbGVSb2xlTmFtZVNpemUpKSAvL2Rvbid0IHNldCB0aGUgb3JpZ2luYXRpbmcgdHlwZSBzaW5jZSB3ZSBhcmUgZGVyaXZlZCBmcm9tIGFub3RoZXIgZGVyaXZlZCBhdHRyaWJ1dGUKLQkJCQlhdHRyaWJ1dGUuc2V0T3JpZ2luYXRpbmdUeXBlKGZpZWxkVHlwZSk7Ci0JCQlhdHRyaWJ1dGUuc2V0RVR5cGUoZmllbGRUeXBlLmdldFdyYXBwZXIoKSk7Ci0JCX0KLQkJaWYgKGlzTmV3ICYmICFnZXRSb2xlKCkuaXNLZXkoKSkKLQkJCWF0dHJpYnV0ZS5zZXREZXJpdmVkKHRydWUpOwotCX0KLQkvKioKLQkgKiBnZXRGaWVsZHMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSB0eXBlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCWNvbGxlY3RLZXlNb2RlbGxlZEF0dHJpYnV0ZXModHlwZSwgYXR0cmlidXRlTmFtZSwgYUxpc3QsIGNvbXB1dGVkTmFtZXMpOwotCQljb2xsZWN0S2V5Um9sZUF0dHJpYnV0ZXModHlwZSwgYXR0cmlidXRlTmFtZSwgYUxpc3QsIGNvbXB1dGVkTmFtZXMpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0byBiZSBzYWZlLCByZWFsbHkgc2hvdWxkIHVzZSBjb2xsZWN0QXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSwgQ01QQXR0cmlidXRlIHR5cGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSBhTGlzdAotCSAqIEBwYXJhbSBjb21wdXRlZE5hbWVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEF0dHJpYnV0ZXMoQ01QQXR0cmlidXRlIHR5cGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvZGUgZ2VuZXJhdGlvbgotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSB0eXBlLmVDb250YWluZXIoKTsKLQkJY29sbGVjdEF0dHJpYnV0ZXMoZW50aXR5LCB0eXBlLCBhdHRyaWJ1dGVOYW1lLCBhTGlzdCwgY29tcHV0ZWROYW1lcyk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBDTVBBdHRyaWJ1dGUgdHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgYUxpc3QsIExpc3QgY29tcHV0ZWROYW1lcykgewotCQlib29sZWFuIGlzTmV3QXR0cmlidXRlID0gZmFsc2U7Ci0JCWF0dHJpYnV0ZU5hbWUgPSBhcHBlbmROYW1lKGF0dHJpYnV0ZU5hbWUsIHR5cGUuZ2V0TmFtZSgpKTsKLQkJY29tcHV0ZWROYW1lcy5hZGQoYXR0cmlidXRlTmFtZSk7Ci0JCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRDTVBFbnRpdHkoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZSA9IGNyZWF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCQlpc05ld0F0dHJpYnV0ZSA9IHRydWU7Ci0JCX0KLQkJaWYgKGVudGl0eSAhPSBudWxsKQotCQkJc2V0RGVyaXZlZEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlLCB0eXBlLCBpc05ld0F0dHJpYnV0ZSk7Ci0JCWlmIChpc05ld0F0dHJpYnV0ZSkgewotCQkJaWYgKGdldFJvbGUoKS5pc0tleSgpKQotCQkJCWdldENNUEVudGl0eSgpLmdldEtleUF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJCWFMaXN0LmFkZChhdHRyaWJ1dGUpOwotCQkJZ2V0Q01QRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghYUxpc3QuY29udGFpbnMoYXR0cmlidXRlKSkKLQkJCQlhTGlzdC5hZGQoYXR0cmlidXRlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ01QQXR0cmlidXRlIGNyZWF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQlhdHRyaWJ1dGUuc2V0TmFtZShhTmFtZSk7Ci0JCWF0dHJpYnV0ZS5zZXREZXNjcmlwdGlvbigiR2VuZXJhdGVkIHRvIHN1cHBvcnQgcmVsYXRpb25zaGlwcy4gIERvIE5PVCBkZWxldGUuIik7Ci0JCXJldHVybiBhdHRyaWJ1dGU7Ci0JfQotCS8qKgotCSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0S2V5TW9kZWxsZWRBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGVudGl0eS5nZXRGaWx0ZXJlZEZlYXR1cmVzKE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKS5pdGVyYXRvcigpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQljb2xsZWN0QXR0cmlidXRlcyhlbnRpdHksIGF0dHJpYnV0ZSwgYXR0cmlidXRlTmFtZSwgYUxpc3QsIGNvbXB1dGVkTmFtZXMpOwotCQl9Ci0JfQotCS8qKgotCSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0S2V5Um9sZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHksIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJaWYodmlzaXRlZEtleVR5cGVzLmNvbnRhaW5zKGVudGl0eSkpewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSByb2xlIGN5Y2xlIGRldGVjdGVkIik7Ci0JCX0KLQkJdmlzaXRlZEtleVR5cGVzLmFkZChlbnRpdHkpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBlbnRpdHkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhLZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLnNpbmdsZXRvbigpKS5pdGVyYXRvcigpOwotCQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhUm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0TmFtZSA9IGFwcGVuZE5hbWUoYXR0cmlidXRlTmFtZSwgYVJvbGUuZ2V0TmFtZSgpKTsKLQkJCXJlY29uY2lsZUF0dHJpYnV0ZXMoYVJvbGUsIGF0dE5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRDTVBFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRSb2xlKCkuZ2V0U291cmNlRW50aXR5KCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3YTcwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci0KLS8qKgotICogVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZTsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlCi0gKiBuYW1lOyBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQgZW50ZXJwcmlzZSBiZWFuczsgYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLCBpZiBhbnk7IGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3I7IGFuZCBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZSBlamItamFyLgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEVKQkphciB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xpZW50SmFyKCkgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGllbnRKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DTElFTlRfSkFSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiQ2xpZW50SmFyID0gRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudGVycHJpc2VCZWFucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwTGlzdCA9IG51bGw7Ci0JcHVibGljIEVKQkphckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0vLwkJc2V0UmVmSWQoY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlQ29uc3RhbnRzLkVKQkpBUl9JRCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKi8KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVKQkphcgotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlBc3NlbWJseURlc2NyaXB0b3IgYWQgPSBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQlyZXR1cm4gKGFkICE9IG51bGwpICYmIChhZC5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKSAhPSBudWxsKTsKLX0KLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQk1QIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRCZWFuTWFuYWdlZEJlYW5zKCkgewotCUxpc3QgYWxsQmVhbnMsIGJlYW5zOwotCWFsbEJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JaW50IHNpemUgPSBhbGxCZWFucy5zaXplKCk7Ci0JYmVhbnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCUVudGVycHJpc2VCZWFuIGVqYjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pIGFsbEJlYW5zLmdldChpKTsKLQkJaWYgKGVqYi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpCi0JCQliZWFucy5hZGQoZWpiKTsKLQl9Ci0JcmV0dXJuIGJlYW5zOwotfQotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCi0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAxLjEgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0RUpCMTFDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBlamIuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCi0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAyLjAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBlamIuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCS8qCi0JICogQHNlZSBFSkJKYXIjZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSB7Ci0JCUxpc3QgZWpicyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCQlpbnQgc2l6ZSA9IGVqYnMuc2l6ZSgpOwotCQlMaXN0IG1kYnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlFbnRlcnByaXNlQmVhbiBlamI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pZWpicy5nZXQoaSk7Ci0JCQlpZiAoZWpiLmlzTWVzc2FnZURyaXZlbigpKQotCQkJCW1kYnMuYWRkKGVqYik7Ci0JCX0KLQkJcmV0dXJuIG1kYnM7Ci0JfQotLyoqCi0gKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlbGF0aW9ucyByZWZlcmVuY2VzCi0gKiBBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICovCi1wdWJsaWMgTGlzdCBnZXRFamJSZWxhdGlvbnMoKSB7Ci0JcmV0dXJuIGdldFJlbGF0aW9uc2hpcExpc3QoKSA9PSBudWxsID8gbnVsbCA6IGdldFJlbGF0aW9uc2hpcExpc3QoKS5nZXRFamJSZWxhdGlvbnMoKTsKLX0KLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuICBUaGUgZWpiLWxpbmsgdmFsdWUKLSAqIG9mIHRoZSByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4KLSAqIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpIHsKLQlTdHJpbmcgbGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JaWYgKGxpbmsgPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGdldEVudGVycHJpc2VCZWFuTmFtZWQobGluayk7Ci19Ci1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChTdHJpbmcgZWpiTmFtZSkgewotCWlmIChlamJOYW1lID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCUVMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbjsKLQlmb3IgKGludCBpID0gMDsgaSA8IGJlYW5zLnNpemUoKTsgaSsrKSB7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGVqYk5hbWUuZXF1YWxzKGJlYW4uZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBiZWFuOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIEFMTCBFbnRlcnByaXNlQmVhbihzKSB0aGF0IGFyZSByZWZlcmVuY2luZyBAYUphdmFDbGFzcyBhcyBhCi0gKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLSAqLwotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQlMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKyl7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGJlYW4uaGFzSmF2YVJlZmVyZW5jZShhSmF2YUNsYXNzKSkKLQkJCXJlc3VsdC5hZGQoYmVhbik7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgKkZJUlNUKiBFbnRlcnByaXNlQmVhbiB0aGF0IGlzIHJlZmVyZW5jaW5nIEBhSmF2YUNsYXNzIGFzIGl0cwotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKi8KLXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQlMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKyl7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGJlYW4uaGFzSmF2YVJlZmVyZW5jZShhSmF2YUNsYXNzKSkKLQkJCXJldHVybiBiZWFuOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIExpc3Qgb2YgU2Vzc2lvbiBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0U2Vzc2lvbkJlYW5zKCkgewotCUxpc3QgYWxsQmVhbnMsIGJlYW5zOwotCWFsbEJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JaW50IHNpemUgPSBhbGxCZWFucy5zaXplKCk7Ci0JYmVhbnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCUVudGVycHJpc2VCZWFuIGVqYjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pIGFsbEJlYW5zLmdldChpKTsKLQkJaWYgKGVqYi5pc1Nlc3Npb24oKSkKLQkJCWJlYW5zLmFkZChlamIpOwotCX0KLQlyZXR1cm4gYmVhbnM7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBFSkIgSkFSIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBFSkIgMS4xIGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8xRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCUVKQlJlc291cmNlIGVqYlJlcyA9IChFSkJSZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JcmV0dXJuIGVqYlJlcy5pc0VKQjFfMSgpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgRUpCIEpBUiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gRUpCIDIuMCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfMERlc2NyaXB0b3IoKSAgewotCUNvbW1vblV0aWwuY2hlY2tERE9iamVjdEZvclZlcnNpb24odGhpcyk7Ci0JRUpCUmVzb3VyY2UgZWpiUmVzID0gKEVKQlJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQlyZXR1cm4gZWpiUmVzLmlzRUpCMl8wKCk7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVKQkphcgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JQXNzZW1ibHlEZXNjcmlwdG9yIGFkID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JaWYgKGFkICE9IG51bGwpCi0JCWFkLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JTGlzdCBlamJzID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0JCUVudGVycHJpc2VCZWFuIGVqYiA9IChFbnRlcnByaXNlQmVhbikgZWpicy5nZXQoaSk7Ci0JCWVqYi5yZVN5bmNTZWN1cml0eVJvbGVSZWYoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCX0KLX0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUiBmaWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gIEV4YW1wbGU6PGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvL2VqYi1jbGllbnQtamFyPgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJDbGllbnRKYXIoKSB7Ci0JCXJldHVybiBlamJDbGllbnRKYXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyBuZXdFamJDbGllbnRKYXIpIHsKLQkJU3RyaW5nIG9sZEVqYkNsaWVudEphciA9IGVqYkNsaWVudEphcjsKLQkJZWpiQ2xpZW50SmFyID0gbmV3RWpiQ2xpZW50SmFyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSLCBvbGRFamJDbGllbnRKYXIsIGVqYkNsaWVudEphcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlKMkVFVmVyc2lvblJlc291cmNlIGVqYlJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKGVqYlJlcyA9PSBudWxsKSB7Ci0JCQkvLyBmaXggZGVmZWN0IDMyNzYsIHdoZW4gcmVzb3VyY2UgaXMgdW5sb2FkZWQKLQkJCWlmICh2ZXJzaW9uID09IG51bGwpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4xIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4wIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMS4xIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMS4wIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDsKLQkJfQotCQlyZXR1cm4gZWpiUmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWE1MUmVzb3VyY2UgaXMgbnVsbCIpOwotCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBvbGRBc3NlbWJseURlc2NyaXB0b3IgPSBhc3NlbWJseURlc2NyaXB0b3I7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvciA9IG5ld0Fzc2VtYmx5RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBvbGRBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBhc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUKLQkgKiBlbnRlcnByaXNlIGJlYW5zLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRlcnByaXNlQmVhbnMoKSB7Ci0JCWlmIChlbnRlcnByaXNlQmVhbnMgPT0gbnVsbCkgewotCQkJZW50ZXJwcmlzZUJlYW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRW50ZXJwcmlzZUJlYW4uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUywgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIpOwotCQl9Ci0JCXJldHVybiBlbnRlcnByaXNlQmVhbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlbGF0aW9uc2hpcHMgY29sbGVjdGlvbiBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgZW50aXR5IGJlYW5zIGFuZCBkZXBlbmRlbnQgb2JqZWN0cyBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYSBsaXN0IG9mIGVqYi1lbnRpdHktcmVmIGVsZW1lbnRzIChyZWZlcmVuY2VzIHRvIGVudGl0eSBiZWFucyB0aGF0IHBhcnRpY2lwYXRlIGluIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgYnV0IHdob3NlIGFic3RyYWN0IHBlcnNpc3RlbmNlIHNjaGVtYXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZWpiLWphciBmaWxlKTsKLQkgKiBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZWxhdGlvbnNoaXBzIG9sZFJlbGF0aW9uc2hpcExpc3QgPSByZWxhdGlvbnNoaXBMaXN0OwotCQlyZWxhdGlvbnNoaXBMaXN0ID0gbmV3UmVsYXRpb25zaGlwTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgb2xkUmVsYXRpb25zaGlwTGlzdCwgbmV3UmVsYXRpb25zaGlwTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QpIHsKLQkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gcmVsYXRpb25zaGlwTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVsYXRpb25zaGlwTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWxhdGlvbnNoaXBMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIsIFJlbGF0aW9uc2hpcHMuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwTGlzdCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QobmV3UmVsYXRpb25zaGlwTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNULCBuZXdSZWxhdGlvbnNoaXBMaXN0LCBuZXdSZWxhdGlvbnNoaXBMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXNzZW1ibHlEZXNjcmlwdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvcilvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudGVycHJpc2VCZWFucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJaWYgKHJlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlbGF0aW9uc2hpcExpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNULCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnRlcnByaXNlQmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJZ2V0RW50ZXJwcmlzZUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRlcnByaXNlQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSOgotCQkJCXNldEVqYkNsaWVudEphcihFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlnZXRFbnRlcnByaXNlQmVhbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSOgotCQkJCXJldHVybiBFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVCA9PSBudWxsID8gZWpiQ2xpZW50SmFyICE9IG51bGwgOiAhRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQuZXF1YWxzKGVqYkNsaWVudEphcik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGFzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuIGVudGVycHJpc2VCZWFucyAhPSBudWxsICYmICFlbnRlcnByaXNlQmVhbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiByZWxhdGlvbnNoaXBMaXN0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJDbGllbnRKYXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVqYkNsaWVudEphcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJlbGF0aW9uc2hpcFJvbGUoU3RyaW5nIGFSb2xlTmFtZSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzb3VyY2VDTVApIHsKLQkJaWYgKGFSb2xlTmFtZSA9PSBudWxsIHx8IHNvdXJjZUNNUCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gbnVsbDsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcExpc3QoKSAhPSBudWxsKSB7Ci0JCQlMaXN0IHJlbGF0aW9ucyA9IGdldFJlbGF0aW9uc2hpcExpc3QoKS5nZXRFamJSZWxhdGlvbnMoKTsKLQkJCWludCBzaXplID0gcmVsYXRpb25zLnNpemUoKTsKLQkJCUVKQlJlbGF0aW9uIHJlbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlbCA9IChFSkJSZWxhdGlvbikgcmVsYXRpb25zLmdldChpKTsKLQkJCQlyb2xlID0gcmVsLmdldFJlbGF0aW9uc2hpcFJvbGUoYVJvbGVOYW1lKTsKLQkJCQlpZiAocm9sZSAhPSBudWxsICYmIHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gc291cmNlQ01QKQotCQkJCQlyZXR1cm4gcm9sZTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBFSkJSZWxhdGlvbiBnZXRFSkJSZWxhdGlvbihTdHJpbmcgYVJlbGF0aW9uTmFtZSkgewotCQlSZWxhdGlvbnNoaXBzIHJlbExpc3QgPSBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCWlmIChyZWxMaXN0ICE9IG51bGwpIHsKLQkJCUxpc3QgcmVscyA9IHJlbExpc3QuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCQlpbnQgc2l6ZSA9IHJlbHMuc2l6ZSgpOwotCQkJRUpCUmVsYXRpb24gcmVsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcmVsID0gKEVKQlJlbGF0aW9uKSByZWxzLmdldChpKTsKLQkJCQlpZiAocmVsID09IG51bGwpIGNvbnRpbnVlOwotCQkJCWlmIChhUmVsYXRpb25OYW1lLmVxdWFscyhyZWwuZ2V0TmFtZSgpKSkKLQkJCQkJcmV0dXJuIHJlbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBFSkJKYXIjZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsTGlzdCA9IGdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAocmVsTGlzdCAhPSBudWxsKSB7Ci0JCQlMaXN0IHJlbHMgPSByZWxMaXN0LmdldEVqYlJlbGF0aW9ucygpOwotCQkJaW50IHNpemUgPSByZWxzLnNpemUoKTsKLQkJCUVKQlJlbGF0aW9uIHJlbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlbCA9IChFSkJSZWxhdGlvbikgcmVscy5nZXQoaSk7Ci0JCQkJaWYgKHJlbCA9PSBudWxsKSBjb250aW51ZTsKLQkJCQlMaXN0IHJvbGVzID0gcmVsLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9sZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKSByb2xlcy5nZXQoaik7Ci0JCQkJCWlmIChyb2xlLmdldFNvdXJjZUVudGl0eSgpID09IGNtcCkgewotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJlc3VsdC5hZGQocmVsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlSZWxhdGlvbnNoaXBzIHJlbExpc3QgPSBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlbExpc3QgIT0gbnVsbCkgewotCQkJTGlzdCByZWxzID0gcmVsTGlzdC5nZXRFamJSZWxhdGlvbnMoKTsKLQkJCWludCBzaXplID0gcmVscy5zaXplKCk7Ci0JCQlFSkJSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZWwgPSAoRUpCUmVsYXRpb24pIHJlbHMuZ2V0KGkpOwotCQkJCWlmIChyZWwgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJTGlzdCByb2xlcyA9IHJlbC5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJvbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJCXJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGopOwotCQkJCQlpZiAoY21wLmVxdWFscygoKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIHJvbGUpLmdldFR5cGVFbnRpdHkoKSkpIHsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlyZXN1bHQuYWRkKHJvbGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFyUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNDJlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSwgImVqYi1qYXJfMV8xLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xLCAiZWpiLWphcl8xLjEuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMCwgImVqYi1qYXJfMl8wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMl8wLCAiZWpiLWphcl8yLjAuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuRUpCX0pBUl9TQ0hFTUFfTE9DXzJfMSwgImVqYi1qYXJfMl8xLnhzZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqICAKLQkgKi8KLQlwdWJsaWMgRUpCSmFyUmVzb3VyY2VGYWN0b3J5KCkgewotCQlzdXBlcihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IEVKQlJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSV9PQkopOwotCX0KLQkKLQkvKioKLQkgKiByZWdpc3RlciB1c2luZyB0aGUgZGVmYXVsdCByZW5kZXJlciBmYWN0b3J5LgotCSAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkgewotCQlyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQk1ldGhvZENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGM0ODdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQk1ldGhvZENhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTWV0aG9kQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRUpCTWV0aG9kQ2F0ZWdvcnkgewotCi0JcHVibGljIEVKQk1ldGhvZENhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9NRVRIT0RfQ0FURUdPUlk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MGY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlLiBBbiBlamItcmVsYXRpb24gZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVzLiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIAotICogQGludmFyaWFudCBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlcy5zaXplID09IDIKLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1swXS5uYW1lICE9IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMV0ubmFtZQotICogCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBNb3ZlZCBmcm9tIGVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgdW5kZXIgZWpiZXh0OjpFSkJKYXJFeHRlbnNpb24KLSAqIEBtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgZGVzY3JpcHRpb246U3RyaW5nCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIG5hbWU6U3RyaW5nIChNYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIEVPYmplY3QgcHJldmlvdXNseSkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQlJlbGF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlbGF0aW9uc2hpcFJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRUpCUmVsYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFTEFUSU9OOwotCX0KLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKS5jb250YWlucyhhUm9sZSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcm9sZXMuCi0gKi8KLXB1YmxpYyBFTGlzdCBnZXRDb21tb25Sb2xlcygpIHsKLQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBmaXJzdCByb2xlLgotICovCi1wdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRGaXJzdENvbW1vblJvbGUoKSB7Ci0JcmV0dXJuIGdldEZpcnN0Um9sZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IHJvbGUuCi0gKi8KLXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Um9sZSgpIHsKLQlMaXN0IGxpc3QgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCWlmIChsaXN0LnNpemUoKSA9PSAwKQotCQlyZXR1cm4gbnVsbDsKLQlyZXR1cm4gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIGxpc3QuZ2V0KDApOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0gKi8KLXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlICE9IG51bGwpIHsKLQkJaWYgKGFSb2xlID09IGdldEZpcnN0Um9sZSgpKQotCQkJcmV0dXJuIGdldFNlY29uZFJvbGUoKTsKLQkJaWYgKGFSb2xlID09IGdldFNlY29uZFJvbGUoKSkKLQkJCXJldHVybiBnZXRGaXJzdFJvbGUoKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgZmlyc3Qgcm9sZS4KLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kQ29tbW9uUm9sZSgpIHsKLQlyZXR1cm4gZ2V0U2Vjb25kUm9sZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZCByb2xlLgotICovCi1wdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRTZWNvbmRSb2xlKCkgewotCUxpc3QgbGlzdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JaWYgKGxpc3Quc2l6ZSgpIDwgMikKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIChFSkJSZWxhdGlvbnNoaXBSb2xlKSBsaXN0LmdldCgxKTsKLX0KLS8qKgotICogU2V0IHRoZSBmb3J3YXJkIHJvbGUuICBJbXBsZW1lbnRlZCBieSBlbnN1cmluZyB0aGF0IHRoZSBwYXNzZWQgcm9sZSBpcyB0aGUgZmlyc3Qgcm9sZSAKLSAqIHdoaWNoIGlzIHRoZSAidGllYnJlYWtlciIgaW4gY2FzZSBvZiB1bmNsZWFyIHJlbGF0aW9uc2hpcHMsIHN1Y2ggYXMgMToxLgotICovCi1wdWJsaWMgdm9pZCBzZXRGb3dhcmQoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQotCUVMaXN0IHJvbGVzID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQlpbnQgY3VycmVudEluZGV4ID0gcm9sZXMuaW5kZXhPZihhUm9sZSk7Ci0JaWYgKGN1cnJlbnRJbmRleCAhPSAwKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPiAtMSkKLQkJCXJvbGVzLm1vdmUoMCwgYVJvbGUpOwotCQllbHNlCi0JCQlyb2xlcy5zZXQoMCwgYVJvbGUpOwotCX0KLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBlamIgcmVsYXRpb24uCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIElmIHNwZWNpZmllZCwgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0JICogQGludmFyaWFudCBzZWxmLm5hbWUgdW5pcXVlIHdpdGhpbiBTZXQ8Y29sbGVjdChlamJKYXIuZWpiUmVsYXRpb25zLm5hbWUpPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBSZWxhdGlvbnNoaXBzIGdldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVsYXRpb25zaGlwcyllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcExpc3QsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0KSB7Ci0JCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCAmJiBuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVsYXRpb25zaGlwTGlzdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwTGlzdCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QobmV3UmVsYXRpb25zaGlwTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QsIG5ld1JlbGF0aW9uc2hpcExpc3QsIG5ld1JlbGF0aW9uc2hpcExpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGNvbGxlY3Rpb24gY29udGFpbmluZyBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZXMuCi0JICogCi0JICogQG1pZ3JhdGlvbiBFSkIxLjEgQ29udGFpbm1lbnQgdXNlZCB0byBiZSBieSByZWZlcmVuY2Ugb24gcmVsYXRpb24tLW5vdyBieSB2YWx1ZS4KLQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZWxhdGlvbnNoaXBSb2xlcygpIHsKLQkJaWYgKHJlbGF0aW9uc2hpcFJvbGVzID09IG51bGwpIHsKLQkJCXJlbGF0aW9uc2hpcFJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlbGF0aW9uc2hpcFJvbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlbGF0aW9uc2hpcFJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUywgUmVsYXRpb25zaGlwcy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJZ2V0UmVsYXRpb25zaGlwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFJlbGF0aW9uc2hpcFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXNldFJlbGF0aW9uc2hpcExpc3QoKFJlbGF0aW9uc2hpcHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCWdldFJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcExpc3QoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCXJldHVybiByZWxhdGlvbnNoaXBSb2xlcyAhPSBudWxsICYmICFyZWxhdGlvbnNoaXBSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lKSB7Ci0JCWlmIChhUm9sZU5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3Qgcm9sZXMgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlyb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIHJvbGVzLmdldChpKTsKLQkJCWlmIChhUm9sZU5hbWUuZXF1YWxzKHJvbGUuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gcm9sZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQkKLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQ1ZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLklSb2xlU2hhcGVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYSByZWxhdGlvbnNoaXAuCi0gKiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7IHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4gVGhlIG11bHRpcGxpY2l0eSBhbmQgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4gVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5LWJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZiBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhhdCBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAKLSAqIEBpbnZhcmlhbnQgbXVsdGlwbGljaXR5ICE9IG51bGwKLSAqIEBpbnZhcmlhbnQgcm9sZVNvdXJjZSAhPSBudWxsCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHJvbGVTb3VyY2UgZWxlbWVudCBzcGVjaWZpZXMgYSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLiAKLSAqIEBpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJSZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiA8ZWpiLXJlbGF0aW9uPgotICogICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvL2VqYi1yZWxhdGlvbi1uYW1lPgotICogICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICogICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXM8Ly9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAqICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvL211bHRpcGxpY2l0eT4KLSAqICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICAgICAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8Ly9lamItbmFtZT4KLSAqICAgICA8Ly9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gKiAgIDwvL2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqIC4uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJSZWxhdGlvbnNoaXBSb2xlIHsKLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVMaXN0IEVNUFRZX0VMSVNUID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0KDApOwotCi0JLy8gTmVlZCB0byBjYWNoZSB0aGUgY29tcHV0ZWQgYXR0cmlidXRlcyBzbyB0aGF0IHRoZXkgbWFpbnRhaW4gaWRlbnRpdHkKLQlwcm90ZWN0ZWQgRUxpc3QgZkF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBJUm9sZVNoYXBlU3RyYXRlZ3kgcm9sZVNoYXBlU3RyYXRlZ3k7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU1RSQVRFR1lfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fUk9MRV9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIENsYXNzIENPTU1PTl9ST0xFX0NMQVNTOwotCXByaXZhdGUgc3RhdGljIENsYXNzIFJPTEVfU1RSQVRFR1lfQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgUk9MRV9TVFJBVEVHWV9DT05TVFJVQ1RPUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUZGSVggPSAiSW52ZXJzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gdG9TdHJpbmdHdWFyZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpcGxpY2l0eSgpIDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE1VTFRJUExJQ0lUWV9FREVGQVVMVCA9IE11bHRpcGxpY2l0eUtpbmQuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlwbGljaXR5S2luZCBtdWx0aXBsaWNpdHkgPSBNVUxUSVBMSUNJVFlfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsaWNpdHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxpY2l0eUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVEZWxldGUoKSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZURlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfREVMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlRGVsZXRlID0gQ0FTQ0FERV9ERUxFVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYXNjYWRlIERlbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlRGVsZXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTb3VyY2Ugc291cmNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ01SRmllbGQgY21yRmllbGQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB3YXNGb3J3YXJkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHdhc01hbnkgPSBmYWxzZTsKLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gaXNLZXlTZXQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4ga2V5ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSB0cmFuc2llbnQgQm9vbGVhbiByZXF1aXJlZCA9IG51bGw7Ci0KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfUkVMQVRJT05TSElQX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlcyBmcm9tIG15IEVudGl0eSB0aGF0IGFyZSB1c2VkCi0JICogYnkgdGhpcyByb2xlLgotCSAqLwotCQotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZXMgPSBuZXcgQmFzaWNFTGlzdCgxKTsKLQkJfQotCQlpZiAoZkF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXRSb2xlU2hhcGVTdHJhdGVneSgpLnJlY29uY2lsZUF0dHJpYnV0ZXMoZkF0dHJpYnV0ZXMpOwotCQl9Ci0JCXJldHVybiBmQXR0cmlidXRlczsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIG91ciBwYXJlbnQgcmVsYXRpb25zaGlwIGFzIGEgQ29tbW9uUmVsYXRpb25zaGlwCi0JICovCi0KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwIGdldENvbW1vblJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQlwcm90ZWN0ZWQgSVJvbGVTaGFwZVN0cmF0ZWd5IGdldERlZmF1bHRSb2xlU2hhcGVTdHJhdGVneSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVJvbGVTaGFwZVN0cmF0ZWd5KSBnZXRSb2xlU3RyYXRlZ3lDb25zdHJ1Y3Rvcih0aGlzKS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyB0aGlzIH0pOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbDpDb3VsZCBub3QgaW5zdGFudGlhdGUgcm9sZSBzaGFwZSBzdHJhdGVneTsgdGhpcyByZXF1aXJlcyBleHRlbnNpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih0KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGxvZ2ljYWwgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbmFtaW5nIHRoaXMgcm9sZS4KLQkgKiBSZXF1aXJlZCB0byBiZSB1bmlxdWUgd2l0aGluIGEgSkFSLgotCSAqIElmIGEgY21yLWZpZWxkIGlzIGRlZmluZWQsIHRoZW4gYSBuYW1lIGluIHRoZSBmb3JtICVzb3VyY2UtZWpiLW5hbWUlXyVjbXItZmllbGQtbmFtZSUgaXMgY29tcHV0ZWQuCi0JICogT3RoZXJ3aXNlIGEgZGVmYXVsdCBJRCBpcyBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBxdWFsaWZpZXIgPSBnZXRDbXJGaWVsZCgpLmdldE5hbWUoKTsKLQkJaWYgKHF1YWxpZmllciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTb3VyY2UoKS5nZXRFbnRpdHlCZWFuKCkuZ2V0TmFtZSgpICsgIl8iICsgcXVhbGlmaWVyOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQkvLyBBcHBseSBhIGRlZmF1bHQgSUQKLQkJCXJlc3VsdCA9IElEVXRpbC5nZXRPckFzc2lnbklEKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gVGhlIG5hbWUgZm9yIHRoaXMgcm9sZSwgZGVyaXZlZCBmcm9tIHRoZSBDTVItZmllbGQgbmFtZQotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIHVzZWQgaW4gcXVlcnlpbmcgdGhpcyByb2xlIGFzIHdlbGwgYXMgdGhlIGFjY2Vzc29yIG1ldGhvZCBuYW1lcyB3aGljaCBpbXBsZW1lbnQgaXQuCi0JICogTm90ZTogbWF5IHJldHVybiB0aGUgWE1JIElEIGZvciBub24tbmF2aWdhYmxlIHJvbGVzLCBpZSAtIHdoZXJlIHRoZXJlIGlzIG5vIENNUi1maWVsZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChmTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0Q21yRmllbGQoKSAhPSBudWxsKQotCQkJCWZOYW1lID0gZ2V0Q21yRmllbGQoKS5nZXROYW1lKCk7Ci0JCQllbHNlIGlmIChnZXRPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIG9wID0gZ2V0T3Bwb3NpdGUoKTsKLQkJCQlpZiAob3AuZ2V0Q21yRmllbGQoKSAhPSBudWxsKQotCQkJCQlmTmFtZSA9IG9wLmdldENtckZpZWxkKCkuZ2V0TmFtZSgpICsgb3AuZ2V0U291cmNlRW50aXR5KCkuZ2V0TmFtZSgpICsgTkFNRV9TVUZGSVg7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlR2V0SWQoKSA9PSBudWxsKSAKLQkJCQkJZVNldElkKCk7Ci0JCQkJZk5hbWUgPSBlR2V0SWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZSgpIHsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwKCkuZ2V0T3Bwb3NpdGVSb2xlKHRoaXMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotCSAqLwotCXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgewotCQlyZXR1cm4gZ2V0T3Bwb3NpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzE1LzIwMDAgNjo1MDozMCBQTSkKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuSVJvbGVTaGFwZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIElSb2xlU2hhcGVTdHJhdGVneSBnZXRSb2xlU2hhcGVTdHJhdGVneSgpIHsKLQkJaWYgKHJvbGVTaGFwZVN0cmF0ZWd5ID09IG51bGwpCi0JCQlyb2xlU2hhcGVTdHJhdGVneSA9IGdldERlZmF1bHRSb2xlU2hhcGVTdHJhdGVneSgpOwotCQlyZXR1cm4gcm9sZVNoYXBlU3RyYXRlZ3k7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSBlamIKLQkgKiBDb21wdXRlIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiAKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRTb3VyY2VFbnRpdHkoKSB7Ci0JCWlmKG51bGwgPT0gZ2V0U291cmNlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRTb3VyY2UoKS5nZXRFbnRpdHlCZWFuKCk7Ci0JfQotCS8qKgotCSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIGlzRm9yd2FyZCBhdHRyaWJ1dGUKLQkqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcm9sZSBzaG91bGQgYmUgbWFwcGVkIHRvIGEgcGVyc2lzdGVudCByZWZlcmVuY2UsIHN1Y2ggYXMgYSBmb3JlaWduIGtleS4KLQkqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzOgotCSogLSBpZiB0aGUgcm9sZSBpcyBtYW55LCBpdCBjYW5ub3QgYmUgZm9yd2FyZAotCSogLSBpZiB0aGUgcm9sZSBpcyBzaW5nbGUgYW5kIG5vdCBuYXZpZ2FibGUsIGl0IGNhbm5vdCBiZSBmb3J3YXJkCi0JKiAtIGFsbCBvdGhlciB0aGluZ3MgYmVpbmcgZXF1YWwsIHRoZSBmaXJzdCByb2xlIGlzIGNvbnNpZGVyZWQgdG8gYmUgZm9yd2FyZAotCSogLSBjbGllbnRzIGNhbiBtYW5pcHVsYXRlIHRoaXMgYnkgc2V0dGluZyBhbiBhbWJpZ3VvdXMgcm9sZSB0byBiZSBmd2QgKGJ5IG1hbmlwdWxhdGluZyB0aGUgcm9sZSBvcmRlciB1bmRlciB0aGUgY292ZXJzKS4KLQkqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yd2FyZCgpIHsKLQkJaWYgKHRoaXMuaXNNYW55KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpID09IG51bGwpCi0JCQlyZXR1cm4gd2FzRm9yd2FyZDsKLQkJaWYgKGdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNNYW55KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkgICAvLyBpZiAoIXRoaXMuaXNOYXZpZ2FibGUoKSkgIHJlbW92ZWQgdG8gYWxsb3cgbm9uLW5hdmlnYWJsZSByb2xlIGluIGtleQotCSAgIC8vICAgIHJldHVybiBmYWxzZTsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpID09IG51bGwpCi0JCQlyZXR1cm4gd2FzRm9yd2FyZDsKLQkJcmV0dXJuIChnZXRSZWxhdGlvbnNoaXAoKS5nZXRGaXJzdFJvbGUoKSA9PSB0aGlzKTsKLQl9Ci0JLyoqCi0JKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBpc0tleQotCSovCi0JcHVibGljIGJvb2xlYW4gaXNLZXkoKSB7Ci0JCWlmIChpc0tleVNldCkKLQkJCXJldHVybiBrZXk7Ci0JCXJldHVybiBpc0tleUZyb21BdHRyaWJ1dGVzKCk7Ci0JfQotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGlzS2V5RnJvbUF0dHJpYnV0ZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJQ01QQXR0cmlidXRlIGF0dHJpYnV0ZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJaWYgKCFhdHRyaWJ1dGUuaXNLZXkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIFJvbGUgYXMgYmVpbmcga2V5IHNvIGl0IHdpbGwKLQkgKiBub3QgdHJhdmVyc2UgaXQgYXR0cmlidXRlcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMga2V5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShib29sZWFuIGFCb29sZWFuKSB7Ci0JCWtleSA9IGFCb29sZWFuOwotCQlpc0tleVNldCA9IHRydWU7Ci0JfSAKLSAKLQkvKioKLQkgKiBIYW5kd3JpdHRlbiB2ZXJzaW9uIG9mIGlzTWFueSgpOgotCSAqLwotIAotIAotCXB1YmxpYyBib29sZWFuIGlzTWFueSgpICB7IAotCQlpZiAoZ2V0T3Bwb3NpdGUoKSA9PSBudWxsKSAKLQkJCSByZXR1cm4gd2FzTWFueTsgIAotCQlyZXR1cm4gZ2V0T3Bwb3NpdGUoKS5nZXRNdWx0aXBsaWNpdHkoKSA9PSBNdWx0aXBsaWNpdHlLaW5kLk1BTllfTElURVJBTDsgIAotCX0gCi0gCi0gICAgICAgICAKLQotCS8qKgotCSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIGlzTmF2aWdhYmxlIGF0dHJpYnV0ZQotCSogU3BlY2lmaWVzIHRoYXQgYWNjZXNzb3JzIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgcmVsYXRpb25zaGlwIHJvbGUuCi0JKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIHRlc3Qgd2hldGhlciBvciBub3QgYSBDTVIgZmllbGQgZXhpc3RzLgotCSovCi0JcHVibGljIGJvb2xlYW4gaXNOYXZpZ2FibGUoKSB7Ci0JCXJldHVybiBnZXRDbXJGaWVsZCgpICE9IG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCWdldFJvbGVTaGFwZVN0cmF0ZWd5KCkucmVjb25jaWxlQXR0cmlidXRlcyhmQXR0cmlidXRlcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhpcyByb2xlIHRvIGJlIHRoZSBmb3J3YXJkIHJvbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm93YXJkKCkgewotCQlnZXRSZWxhdGlvbnNoaXAoKS5zZXRGb3dhcmQodGhpcyk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE5hbWUoamF2YS5sYW5nLlN0cmluZyB1bmlxdWVOYW1lKSB7Ci0JCWZOYW1lID0gdW5pcXVlTmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHRvU3RyaW5nR3VhcmQpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCQl0cnkgewotCQkJdG9TdHJpbmdHdWFyZCA9IHRydWU7Ci0JCQlTdHJpbmcgb3Bwb3NpdGVUeXBlID0gZ2V0T3Bwb3NpdGUoKSAhPSBudWxsID8gZ2V0VHlwZUVudGl0eSgpLmdldE5hbWUoKSA6ICI8PHVua25vd24+PiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXROYW1lKCkgKyAiKCIgKyBvcHBvc2l0ZVR5cGUgKyAiKSIgKyAoaXNNYW55KCkgPyAiICoiIDogIiAxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBlLnRvU3RyaW5nKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0b1N0cmluZ0d1YXJkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRDb21tb25Sb2xlQ2xhc3MoT2JqZWN0IGNhbGxlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0JCWlmIChDT01NT05fUk9MRV9DTEFTUyA9PSBudWxsKSB7Ci0JCQlDT01NT05fUk9MRV9DTEFTUyA9IGxvYWRDbGFzcyhDT01NT05fUk9MRV9DTEFTU19OQU1FLCBjYWxsZXIpOwotCQl9Ci0JCXJldHVybiBDT01NT05fUk9MRV9DTEFTUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIE9iamVjdCBjYWxsZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQ2xhc3NMb2FkZXIgY2wgPSBjYWxsZXIuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlpZiAoY2wgIT0gbnVsbCkKLQkJCXJldHVybiBjbC5sb2FkQ2xhc3MobmFtZSk7Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENsYXNzIGdldFJvbGVTdHJhdGVneUNsYXNzKE9iamVjdCBjYWxsZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKFJPTEVfU1RSQVRFR1lfQ0xBU1MgPT0gbnVsbCkKLQkJCVJPTEVfU1RSQVRFR1lfQ0xBU1MgPSBsb2FkQ2xhc3MoUk9MRV9TVFJBVEVHWV9DTEFTU19OQU1FLCBjYWxsZXIpOwotCQlyZXR1cm4gUk9MRV9TVFJBVEVHWV9DTEFTUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3RvciBnZXRSb2xlU3RyYXRlZ3lDb25zdHJ1Y3RvcihPYmplY3QgY2FsbGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJaWYgKFJPTEVfU1RSQVRFR1lfQ09OU1RSVUNUT1IgPT0gbnVsbCkgewotCQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IGdldENvbW1vblJvbGVDbGFzcyhjYWxsZXIpfTsKLQkJCVJPTEVfU1RSQVRFR1lfQ09OU1RSVUNUT1IgPSBnZXRSb2xlU3RyYXRlZ3lDbGFzcyhjYWxsZXIpLmdldENvbnN0cnVjdG9yKHBhcm1UeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIFJPTEVfU1RSQVRFR1lfQ09OU1RSVUNUT1I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgZWpiIHJlbGF0aW9uc2hpcCByb2xlLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZWZpbmVzIGEgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudAotCSAqIHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGVOYW1lKCkgewotCQlyZXR1cm4gcm9sZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRSb2xlTmFtZSA9IHJvbGVOYW1lOwotCQlyb2xlTmFtZSA9IG5ld1JvbGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXVsdGlwbGljaXR5S2luZCBnZXRNdWx0aXBsaWNpdHkoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQgbmV3TXVsdGlwbGljaXR5KSB7Ci0JCU11bHRpcGxpY2l0eUtpbmQgb2xkTXVsdGlwbGljaXR5ID0gbXVsdGlwbGljaXR5OwotCQltdWx0aXBsaWNpdHkgPSBuZXdNdWx0aXBsaWNpdHkgPT0gbnVsbCA/IE1VTFRJUExJQ0lUWV9FREVGQVVMVCA6IG5ld011bHRpcGxpY2l0eTsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsaWNpdHlFU2V0ID0gbXVsdGlwbGljaXR5RVNldDsKLQkJbXVsdGlwbGljaXR5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFksIG9sZE11bHRpcGxpY2l0eSwgbXVsdGlwbGljaXR5LCAhb2xkTXVsdGlwbGljaXR5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TXVsdGlwbGljaXR5KCkgewotCQlNdWx0aXBsaWNpdHlLaW5kIG9sZE11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eTsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsaWNpdHlFU2V0ID0gbXVsdGlwbGljaXR5RVNldDsKLQkJbXVsdGlwbGljaXR5ID0gTVVMVElQTElDSVRZX0VERUZBVUxUOwotCQltdWx0aXBsaWNpdHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSwgb2xkTXVsdGlwbGljaXR5LCBNVUxUSVBMSUNJVFlfRURFRkFVTFQsIG9sZE11bHRpcGxpY2l0eUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE11bHRpcGxpY2l0eSgpIHsKLQkJcmV0dXJuIG11bHRpcGxpY2l0eUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgKiBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZQotCSAqIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuIENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4KLQkgKiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIKLQkgKiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQkgKiAKLQkgKiAKLQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIGNhc2NhZGVEZWxldGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZURlbGV0ZShib29sZWFuIG5ld0Nhc2NhZGVEZWxldGUpIHsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlRGVsZXRlID0gY2FzY2FkZURlbGV0ZTsKLQkJY2FzY2FkZURlbGV0ZSA9IG5ld0Nhc2NhZGVEZWxldGU7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZURlbGV0ZUVTZXQgPSBjYXNjYWRlRGVsZXRlRVNldDsKLQkJY2FzY2FkZURlbGV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUsIG9sZENhc2NhZGVEZWxldGUsIGNhc2NhZGVEZWxldGUsICFvbGRDYXNjYWRlRGVsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRDYXNjYWRlRGVsZXRlKCkgewotCQlib29sZWFuIG9sZENhc2NhZGVEZWxldGUgPSBjYXNjYWRlRGVsZXRlOwotCQlib29sZWFuIG9sZENhc2NhZGVEZWxldGVFU2V0ID0gY2FzY2FkZURlbGV0ZUVTZXQ7Ci0JCWNhc2NhZGVEZWxldGUgPSBDQVNDQURFX0RFTEVURV9FREVGQVVMVDsKLQkJY2FzY2FkZURlbGV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUsIG9sZENhc2NhZGVEZWxldGUsIENBU0NBREVfREVMRVRFX0VERUZBVUxULCBvbGRDYXNjYWRlRGVsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRDYXNjYWRlRGVsZXRlKCkgewotCQlyZXR1cm4gY2FzY2FkZURlbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUpCUmVsYXRpb24pZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlbGF0aW9uc2hpcChFSkJSZWxhdGlvbiBuZXdSZWxhdGlvbnNoaXAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXAoRUpCUmVsYXRpb24gbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgPT0gbnVsbCAmJiBnZXRSZWxhdGlvbnNoaXAoKSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVDYWNoZWRTZXR0aW5ncygpOwotCQkJRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgcm9sZU9wcG9zaXRlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsKSBnZXRPcHBvc2l0ZSgpOwotCQkJaWYgKHJvbGVPcHBvc2l0ZSAhPSBudWxsKQotCQkJCXJvbGVPcHBvc2l0ZS51cGRhdGVDYWNoZWRTZXR0aW5ncygpOwotCQl9IGVsc2UKLQkJCXdhc0ZvcndhcmQgPSBmYWxzZTsKLQkJc2V0UmVsYXRpb25zaGlwR2VuKG5ld0NvbnRhaW5lcik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlI2dldFRhcmdldEF0dHJpYnV0ZU5hbWUob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNNUEF0dHJpYnV0ZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEF0dHJpYnV0ZU5hbWUoQ01QQXR0cmlidXRlIHJvbGVBdHRyaWJ1dGUpIHsKLQkJaW50IHJvbGVOYW1lU2l6ZSA9IGdldE5hbWUoKS5sZW5ndGgoKTsKLQkJcmV0dXJuIHJvbGVBdHRyaWJ1dGUuZ2V0TmFtZSgpLnN1YnN0cmluZyhyb2xlTmFtZVNpemUgKyAxKTsKLQl9Ci0JLyoqCi0JICogTWV0aG9kIHVwZGF0ZUNhY2hlZFNldHRpbmdzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhY2hlZFNldHRpbmdzKCkgewotCQl3YXNGb3J3YXJkID0gaXNGb3J3YXJkKCk7Ci0JCXdhc01hbnkgPSBpc01hbnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBCi0JICogcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4KLQkgKiBAbWlncmF0aW9uIEVKQjEuMTogd2FzIGlibWVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZTo6c291cmNlRUpCTmFtZSwgYnV0IHRoYXQKLQkgKiBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIGFzIHRoaXMgY2FuIG5vdyByZWZlciB0byBkZXBlbmRlbnQgY2xhc3MgbmFtZXMgb3IgZWpiCi0JICogcmVmcwotCSAqLwotCXB1YmxpYyBSb2xlU291cmNlIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTb3VyY2UoUm9sZVNvdXJjZSBuZXdTb3VyY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUm9sZVNvdXJjZSBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCXNvdXJjZSA9IG5ld1NvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSwgb2xkU291cmNlLCBuZXdTb3VyY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShSb2xlU291cmNlIG5ld1NvdXJjZSkgewotCQlpZiAobmV3U291cmNlICE9IHNvdXJjZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZSkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSwgUm9sZVNvdXJjZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U291cmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NvdXJjZSkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSwgUm9sZVNvdXJjZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTb3VyY2UobmV3U291cmNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0UsIG5ld1NvdXJjZSwgbmV3U291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQSBkZWNsYXJhdGlvbiBvZiB0aGUgQ01SRmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlCi0JICogcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZQotCSAqIAotCSAqIEBtaWdyYXRpb24gRUpCMS4xOiBVc2VkIHRvIGJlIGhhbmRsZWQgdmlhIGlibWVqYmV4dDo6RWpiUm9sZTo6YXR0cmlidXRlcyBsaXN0Ci0JICovCi0JcHVibGljIENNUkZpZWxkIGdldENtckZpZWxkKCkgewotCQlyZXR1cm4gY21yRmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q21yRmllbGQoQ01SRmllbGQgbmV3Q21yRmllbGQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ01SRmllbGQgb2xkQ21yRmllbGQgPSBjbXJGaWVsZDsKLQkJY21yRmllbGQgPSBuZXdDbXJGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgb2xkQ21yRmllbGQsIG5ld0NtckZpZWxkKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbXJGaWVsZChDTVJGaWVsZCBuZXdDbXJGaWVsZCkgewotCQlpZiAobmV3Q21yRmllbGQgIT0gY21yRmllbGQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNtckZpZWxkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNtckZpZWxkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgQ01SRmllbGQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0NtckZpZWxkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NtckZpZWxkKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgQ01SRmllbGQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q21yRmllbGQobmV3Q21yRmllbGQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgbmV3Q21yRmllbGQsIG5ld0NtckZpZWxkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZWxhdGlvbnNoaXAoKEVKQlJlbGF0aW9uKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzb3VyY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UoKFJvbGVTb3VyY2Upb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCWlmIChjbXJGaWVsZCAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY21yRmllbGQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbXJGaWVsZCgoQ01SRmllbGQpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbXJGaWVsZChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTLCBFSkJSZWxhdGlvbi5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXJldHVybiBnZXRNdWx0aXBsaWNpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXJldHVybiBpc0Nhc2NhZGVEZWxldGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlyZXR1cm4gZ2V0Q21yRmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJc2V0TXVsdGlwbGljaXR5KChNdWx0aXBsaWNpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlRGVsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlzZXRSZWxhdGlvbnNoaXAoKEVKQlJlbGF0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChSb2xlU291cmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJc2V0Q21yRmllbGQoKENNUkZpZWxkKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKFJPTEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXVuc2V0TXVsdGlwbGljaXR5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJdW5zZXRDYXNjYWRlRGVsZXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCXNldFJlbGF0aW9uc2hpcCgoRUpCUmVsYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoUm9sZVNvdXJjZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJc2V0Q21yRmllbGQoKENNUkZpZWxkKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQlyZXR1cm4gaXNTZXRNdWx0aXBsaWNpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXJldHVybiBpc1NldENhc2NhZGVEZWxldGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGNtckZpZWxkICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11bHRpcGxpY2l0eTogIik7Ci0JCWlmIChtdWx0aXBsaWNpdHlFU2V0KSByZXN1bHQuYXBwZW5kKG11bHRpcGxpY2l0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVEZWxldGU6ICIpOwotCQlpZiAoY2FzY2FkZURlbGV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoY2FzY2FkZURlbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSNnZXRUeXBlRW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRUeXBlRW50aXR5KCkgewotCQlpZiAoZ2V0T3Bwb3NpdGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldE9wcG9zaXRlKCkuZ2V0U291cmNlRW50aXR5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSNpc1JlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlpZiAocmVxdWlyZWQhPW51bGwpCi0JCQlyZXR1cm4gcmVxdWlyZWQuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiBpc0tleSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGlzUmVxdWlyZWQgZmxhZyBmb3IgYm90dG9tIHVwCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiBpc1JlcXVpcmVkKSB7Ci0JCXJlcXVpcmVkID0gaXNSZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBHZW4oRUpCUmVsYXRpb24gbmV3UmVsYXRpb25zaGlwKSB7Ci0JCWlmIChuZXdSZWxhdGlvbnNoaXAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCAmJiBuZXdSZWxhdGlvbnNoaXAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSZWxhdGlvbnNoaXApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTLCBFSkJSZWxhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWxhdGlvbnNoaXAobmV3UmVsYXRpb25zaGlwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAsIG5ld1JlbGF0aW9uc2hpcCwgbmV3UmVsYXRpb25zaGlwKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZSNzZXRMb3dlcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG93ZXIoaW50IGxvd2VyQm91bmQpIHsKLQkJLy8gRG8gbm90aGluZy4uLiAgT25seSB1cHBlcmJvdW5kIGlzIHJlbGV2YW50IGhlcmUKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlI3NldFVwcGVyKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcHBlcihpbnQgdXBwZXJCb3VuZCkgewotCQlzd2l0Y2ggKHVwcGVyQm91bmQpIHsKLQkJCWNhc2UgTXVsdGlwbGljaXR5S2luZC5PTkUgOgotCQkJCXNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kLk1BTllfTElURVJBTCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICBHZXRzIHRoZSBNT0YgWE1JIHJlZiBpZCBmb3IgdGhpcyBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZUdldElkKCkgewotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVzLmdldElEKHRoaXMpOwotCX0KLQotCQotCS8qKgotCSAqIFNldCBhbmQgcmV0dXJuIFRoZSBpZCBvZiB0aGlzIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlU2V0SWQoKSB7Ci0KLQotCQlJRFV0aWwuZ2V0T3JBc3NpZ25JRCh0aGlzKTsKLQotCQlyZXR1cm4gZUdldElkKCk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWU1ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5FSkJKYXJUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBFSkJSZXNvdXJjZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBFSkJSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlbmRlcmVyCi0JICovCi0JcHVibGljIEVKQlJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUpCUmVzb3VyY2UjaXNFSkIxXzEoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCMV8xKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gRUpCXzFfMV9JRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUpCUmVzb3VyY2UjaXNFSkIyXzAoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCMl8wKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gRUpCXzJfMF9JRDsKLQl9Ci0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBYTUxSZXNvdXJjZS5FSkJfVFlQRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0RPQ1RZUEU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzFfMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMl8wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMl8wOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8yXzA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gRUpCSmFyVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JCi0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJc3dpdGNoIChnZXRNb2R1bGVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFSkJKYXIoKSB7Ci0JCXJldHVybiAoRUpCSmFyKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQkJcmVuZGVyZXIuc2V0QmF0Y2hNb2RlKGlzQmF0Y2gpOwotCi0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChFSkJfM18xX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzNfMV9JRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEVKQl8zXzBfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfM18wX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoRUpCXzJfMV9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8yXzFfSUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChFSkJfMl8wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEVKQl8xXzFfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoRUpCXzFfMF9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCQkKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyoKLQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3dpdGNoIChpZCkgewotCQljYXNlIChKRUVfNl8wX0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8zXzFfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSkVFXzVfMF9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfM18wX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8yXzFfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzJfMF9JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfMV8xX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gRUpCXzJfMV9JRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJRUpCSmFyIGVqYkphciA9IGdldEVKQkphcigpOwotCQlpZiAoZWpiSmFyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgdmVyc2lvbiA9IGVqYkphci5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJZWpiSmFyLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7Ci0JCXJldHVybiByZW5kZXJlci5pc0JhdGNoTW9kZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCQotCQlpbnQgbXlWZXJzaW9uID0gSjJFRV8xXzRfSUQ7Ci0JCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQlteVZlcnNpb24gPSBwcmltR2V0VmVyc2lvbklEKCk7Ci0JCQlzZXRNb2R1bGVWZXJzaW9uSUQobXlWZXJzaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQotfQotCi1wcml2YXRlIGludCBwcmltR2V0VmVyc2lvbklEKCkgewotCUlGaWxlIGFmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh0aGlzKTsKLQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG51bGw7Ci0JaWYgKGFmaWxlICE9IG51bGwgJiYgYWZpbGUuZXhpc3RzKCkpIHsKLQkJdHJ5IHsKLQkJCWluID0gYWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7Ci0JfQotCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1NDlhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRGVzdGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5BZGFwdGVyRmFjdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEVqYkZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYkZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUVqYkZhY3RvcnkgdGhlRWpiRmFjdG9yeSA9IChFamJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJlamIueG1pIik7IAotCQkJaWYgKHRoZUVqYkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVFamJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVqYkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBDTVBfQURBUFRFUl9GQUNUT1JJRVMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgQ01QX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBFSkJfUkVMQVRJT05fQURBUFRFUl9GQUNUT1JJRVMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SSUVTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JZX0RFU0NSSVBUT1JTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNTV9WRVJTSU9OID0gIjEuMSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZWRBZGFwdGVyRmFjdG9yaWVzID0gZmFsc2U7Ci0KLQlwdWJsaWMgRWpiRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTogcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTjogcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SOiByZXR1cm4gY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OOiByZXR1cm4gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OOiByZXR1cm4gY3JlYXRlU2Vzc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWTogcmV0dXJuIGNyZWF0ZUVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9NRVRIT0RfQ0FURUdPUlk6IHJldHVybiBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVI6IHJldHVybiBjcmVhdGVFSkJKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQUzogcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWTogcmV0dXJuIGNyZWF0ZVF1ZXJ5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OOiByZXR1cm4gY3JlYXRlRUpCUmVsYXRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEU6IHJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0U6IHJldHVybiBjcmVhdGVSb2xlU291cmNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEOiByZXR1cm4gY3JlYXRlQ01SRmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVDogcmV0dXJuIGNyZWF0ZUV4Y2x1ZGVMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EOiByZXR1cm4gY3JlYXRlUXVlcnlNZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHOiByZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNLTk9XTEVER0VfTU9ERToKLQkJCQlyZXR1cm4gY3JlYXRlQWNrbm93bGVkZ2VNb2RlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBjcmVhdGVSZXR1cm5UeXBlTWFwcGluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkRFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc3RpbmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1VTFRJUExJQ0lUWV9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVNdWx0aXBsaWNpdHlLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydE1ldGhvZEVsZW1lbnRLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXJldHVybiBjb252ZXJ0QWNrbm93bGVkZ2VNb2RlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFVFVSTl9UWVBFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXR1cm5UeXBlTWFwcGluZ1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlc3RpbmF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNdWx0aXBsaWNpdHlLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIE1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudChTdHJpbmcgYVNpZ25hdHVyZSkgewotCU1ldGhvZEVsZW1lbnQgbWUgPSBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JbWUuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoYVNpZ25hdHVyZSk7Ci0JcmV0dXJuIG1lOwotfQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIE1ldGhvZEVsZW1lbnQgZnJvbSBhIGphdmEgbWV0aG9kLiAgIERlZmF1bHRzIHRoZSB0eXBlIHRvICJVbnNwZWNpZmllZCIuCi0gKi8KLXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKAotCU1ldGhvZCBtZXRob2QpIHsKLQotCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQllbGVtZW50LnNldE5hbWUobWV0aG9kLmdldE5hbWUoKSk7Ci0JZWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCi0JSmF2YVBhcmFtZXRlcltdIHBhcmFtcyA9IAotCQltZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkKLQkJZWxlbWVudC5hcHBseVplcm9QYXJhbXMoKTsKLQllbHNlIHsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyBoZWxwZXIgPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tpXS5nZXRFVHlwZSgpOwotCQkJZWxlbWVudC5hZGRNZXRob2RQYXJhbXMoaGVscGVyLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVsZW1lbnQ7Ci19IAotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIHJlZmxlY3QgdGhlIG1ldGhvZCBhbmQgY3JlYXRlIGEgTWV0aG9kRWxlbWVudC4gIElmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbCwgY3JlYXRlcyBhbiBlbGVtZW50Ci0gKiB3aXRoIGEgbmFtZSBvZiAiKiIuICBEZWZhdWx0cyB0aGUgdHlwZSB0byAiVW5zcGVjaWZpZWQiLgotICovCi1wdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50RnJvbShqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kKSB7Ci0KLQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZCA9PSBudWxsID8gIioiIDogbWV0aG9kLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCU1ldGhvZEVsZW1lbnQgbWUgPSBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JbWUuc2V0TmFtZShtZXRob2ROYW1lKTsKLQltZS5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQlDbGFzc1tdIHR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW1lLmFkZE1ldGhvZFBhcmFtcyhnZXRUeXBlTmFtZSh0eXBlc1tpXSkpOwotCQl9Ci0JfQotCXJldHVybiBtZTsKLX0KLXB1YmxpYyBzdGF0aWMgRWpiRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoRWpiRmFjdG9yeSkgZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLX0KLS8qCi0gKiBVdGlsaXR5IHJvdXRpbmUgdG8gcGFwZXIgb3ZlciBhcnJheSB0eXBlIG5hbWVzCi0gKiBCb3Jyb3dlZCBmcm9tIGEgcGFja2FnZS12aXNpYmlsaXR5IGhlbHBlciBvbiBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZAotICovCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKENsYXNzIHR5cGUpIHsKLQlpZiAodHlwZS5pc0FycmF5KCkpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsID0gdHlwZTsKLQkJCWludCBkaW1lbnNpb25zID0gMDsKLQkJCXdoaWxlIChjbC5pc0FycmF5KCkpIHsKLQkJCQlkaW1lbnNpb25zKys7Ci0JCQkJY2wgPSBjbC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQl9Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoY2wuZ2V0TmFtZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKCJbXSIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeyAvKkZBTExUSFJVKi8KLQkJfQotCX0KLQlyZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci19Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCU1ldGhvZFBlcm1pc3Npb25JbXBsIG1ldGhvZFBlcm1pc3Npb24gPSBuZXcgTWV0aG9kUGVybWlzc2lvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFzc2VtYmx5RGVzY3JpcHRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvckltcGwgYXNzZW1ibHlEZXNjcmlwdG9yID0gbmV3IEFzc2VtYmx5RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGFzc2VtYmx5RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb24gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uSW1wbCBtZXRob2RUcmFuc2FjdGlvbiA9IG5ldyBNZXRob2RUcmFuc2FjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFRyYW5zYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFbnRpdHkgY3JlYXRlRW50aXR5KCkgewotCQlFbnRpdHlJbXBsIGVudGl0eSA9IG5ldyBFbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUdlbigpIHsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwgY29udGFpbmVyTWFuYWdlZEVudGl0eSA9IG5ldyBDb250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCgpOwotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQl9Ci0KLSAgCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0gIAkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5R2VuKCk7Ci0gIAkJYWRhcHROZXcoY21wLCBDTVBfQURBUFRFUl9GQUNUT1JJRVMpOwotICAJCWFkZEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIoY21wKTsKLSAgCQlyZXR1cm4gY21wOwotICAJfQotICAJCi0JLyoqCi0JICogQHBhcmFtIGNtcAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCUNNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIgY21wQWRhcHRlciA9IG5ldyBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKGNtcCk7Ci0JCUFkYXB0ZXIgbG9hZGluZ0FkYXB0ZXIgPSBFeHRlbmRlZEVjb3JlVXRpbC5jcmVhdGVBZGFwdGVyRm9yTG9hZGluZyhjbXBBZGFwdGVyLGNtcCk7Ci0JCWNtcC5lQWRhcHRlcnMoKS5hZGQobG9hZGluZ0FkYXB0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ01QQXR0cmlidXRlIGNyZWF0ZUNNUEF0dHJpYnV0ZSgpIHsKLQkJQ01QQXR0cmlidXRlSW1wbCBjbXBBdHRyaWJ1dGUgPSBuZXcgQ01QQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gY21wQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDTVJGaWVsZCBjcmVhdGVDTVJGaWVsZCgpIHsKLQkJQ01SRmllbGRJbXBsIGNtckZpZWxkID0gbmV3IENNUkZpZWxkSW1wbCgpOwotCQlyZXR1cm4gY21yRmllbGQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgZWpiUmVsYXRpb25zaGlwUm9sZSA9IG5ldyBFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVsYXRpb25zaGlwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb25HZW4oKSB7Ci0JCUVKQlJlbGF0aW9uSW1wbCBlamJSZWxhdGlvbiA9IG5ldyBFSkJSZWxhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uOwotCX0KLQotICAJcHVibGljIEVKQlJlbGF0aW9uIGNyZWF0ZUVKQlJlbGF0aW9uKCkgewotICAJCUVKQlJlbGF0aW9uIHJlbCA9IGNyZWF0ZUVKQlJlbGF0aW9uR2VuKCk7Ci0gIAkJYWRhcHROZXcocmVsLCBFSkJfUkVMQVRJT05fQURBUFRFUl9GQUNUT1JJRVMpOwotICAJCXJldHVybiByZWw7Ci0gIAl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBjcmVhdGVSZWxhdGlvbnNoaXBzR2VuKCkgewotCQlSZWxhdGlvbnNoaXBzSW1wbCByZWxhdGlvbnNoaXBzID0gbmV3IFJlbGF0aW9uc2hpcHNJbXBsKCk7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBzOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBzIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsID0gY3JlYXRlUmVsYXRpb25zaGlwc0dlbigpOwotCQlhZGFwdE5ldyhyZWwsIFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JJRVMpOwotCQlyZXR1cm4gcmVsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGNyZWF0ZUVKQkphcigpIHsKLQkJRUpCSmFySW1wbCBlamJKYXIgPSBuZXcgRUpCSmFySW1wbCgpOwotCQlyZXR1cm4gZWpiSmFyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSb2xlU291cmNlIGNyZWF0ZVJvbGVTb3VyY2UoKSB7Ci0JCVJvbGVTb3VyY2VJbXBsIHJvbGVTb3VyY2UgPSBuZXcgUm9sZVNvdXJjZUltcGwoKTsKLQkJcmV0dXJuIHJvbGVTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFF1ZXJ5IGNyZWF0ZVF1ZXJ5KCkgewotCQlRdWVyeUltcGwgcXVlcnkgPSBuZXcgUXVlcnlJbXBsKCk7Ci0JCXJldHVybiBxdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2QgY3JlYXRlUXVlcnlNZXRob2QoKSB7Ci0JCVF1ZXJ5TWV0aG9kSW1wbCBxdWVyeU1ldGhvZCA9IG5ldyBRdWVyeU1ldGhvZEltcGwoKTsKLQkJcmV0dXJuIHF1ZXJ5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZ0ltcGwgYWN0aXZhdGlvbkNvbmZpZyA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gU2Vzc2lvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlc3Npb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRLaW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnRLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIHJlc3VsdCA9IE1ldGhvZEVsZW1lbnRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXRob2RFbGVtZW50S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY2tub3dsZWRnZU1vZGUgY3JlYXRlQWNrbm93bGVkZ2VNb2RlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUFja25vd2xlZGdlTW9kZSByZXN1bHQgPSBBY2tub3dsZWRnZU1vZGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFja25vd2xlZGdlTW9kZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBjcmVhdGVTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCByZXN1bHQgPSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV0dXJuVHlwZU1hcHBpbmcgY3JlYXRlUmV0dXJuVHlwZU1hcHBpbmdGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgcmVzdWx0ID0gUmV0dXJuVHlwZU1hcHBpbmcuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJldHVyblR5cGVNYXBwaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uVHlwZSBjcmVhdGVEZXN0aW5hdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRGVzdGluYXRpb25UeXBlIHJlc3VsdCA9IERlc3RpbmF0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGVzdGluYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eUtpbmQgY3JlYXRlTXVsdGlwbGljaXR5S2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlNdWx0aXBsaWNpdHlLaW5kIHJlc3VsdCA9IE11bHRpcGxpY2l0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE11bHRpcGxpY2l0eUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCkgewotCQlNZXRob2RFbGVtZW50SW1wbCBtZXRob2RFbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdCBjcmVhdGVFeGNsdWRlTGlzdCgpIHsKLQkJRXhjbHVkZUxpc3RJbXBsIGV4Y2x1ZGVMaXN0ID0gbmV3IEV4Y2x1ZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gZXhjbHVkZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbigpIHsKLQkJU2Vzc2lvbkltcGwgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURyaXZlbiBjcmVhdGVNZXNzYWdlRHJpdmVuKCkgewotCQlNZXNzYWdlRHJpdmVuSW1wbCBtZXNzYWdlRHJpdmVuID0gbmV3IE1lc3NhZ2VEcml2ZW5JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCkgewotCQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiA9IG5ldyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQk1ldGhvZENhdGVnb3J5IGNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5KCkgewotCQlFSkJNZXRob2RDYXRlZ29yeUltcGwgZWpiTWV0aG9kQ2F0ZWdvcnkgPSBuZXcgRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBlamJNZXRob2RDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVqYlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbFJlZ2lzdGVyQ01QQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGNvbmZpZykgewotCQlDTVBfQURBUFRFUl9GQUNUT1JZX0RFU0NSSVBUT1JTLmFkZChjb25maWcpOwotCQkKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsUmVnaXN0ZXJFSkJSZWxhdGlvbkFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBjb25maWcpIHsKLQkJRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUy5hZGQoY29uZmlnKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsUmVnaXN0ZXJSZWxhdGlvbnNoaXBzQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGNvbmZpZykgewotCQlSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUy5hZGQoY29uZmlnKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWNyZWF0ZWRBZGFwdGVyRmFjdG9yaWVzID0gdHJ1ZTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoQ01QX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUywgQ01QX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUywgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoUkVMQVRJT05TSElQU19BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMsIFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JJRVMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRhcHROZXcoTm90aWZpZXIgbm90aWZpZXIsIExpc3QgZmFjdG9yaWVzKSB7Ci0JCWlmICghY3JlYXRlZEFkYXB0ZXJGYWN0b3JpZXMpCi0JCQljcmVhdGVBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5VXRpbC5hZGFwdE5ldyhub3RpZmllciwgZmFjdG9yaWVzKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkyNGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIEVqYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRWpiUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGVybWlzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2Vzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50ZXJwcmlzZUJlYW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiSmFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY21wQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlbGF0aW9uc2hpcHNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcXVlcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU291cmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNtckZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VEcml2ZW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2x1ZGVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHF1ZXJ5TWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc2FjdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHNlc3Npb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBtZXRob2RFbGVtZW50S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYWNrbm93bGVkZ2VNb2RlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmV0dXJuVHlwZU1hcHBpbmdFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRlc3RpbmF0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbXVsdGlwbGljaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgRWpiUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEVqYkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBFamJQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWpiUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlRWpiUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0JCXJldHVybiBtZXRob2RUcmFuc2FjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRlcnByaXNlQmVhbigpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiBlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5X1JlZW50cmFudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eV9QcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9BYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0tleUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9RdWVyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUHJpbUtleUZpZWxkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q01QQXR0cmlidXRlKCkgewotCQlyZXR1cm4gY21wQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNtcEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbXBBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENNUkZpZWxkKCkgewotCQlyZXR1cm4gY21yRmllbGRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNtckZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbXJGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCUmVsYXRpb24oKSB7Ci0JCXJldHVybiBlamJSZWxhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWxhdGlvbnNoaXBzKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCSmFyKCkgewotCQlyZXR1cm4gZWpiSmFyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9FamJDbGllbnRKYXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJKYXJfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTb3VyY2UoKSB7Ci0JCXJldHVybiByb2xlU291cmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNvdXJjZV9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upcm9sZVNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVTb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVTb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gcXVlcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFF1ZXJ5X0VqYlFMKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfUXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFF1ZXJ5X0VudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5TWV0aG9kKCkgewotCQlyZXR1cm4gcXVlcnlNZXRob2RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeU1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiBleGNsdWRlTGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlleGNsdWRlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gc2Vzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURyaXZlbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEcml2ZW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9UcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9BY2tub3dsZWRnZU1vZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9TdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQk1ldGhvZENhdGVnb3J5KCkgewotCQlyZXR1cm4gZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNdWx0aXBsaWNpdHlLaW5kKCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHJldHVyblR5cGVNYXBwaW5nRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1ldGhvZEVsZW1lbnRLaW5kKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEFja25vd2xlZGdlTW9kZSgpIHsKLQkJcmV0dXJuIGFja25vd2xlZGdlTW9kZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREZXN0aW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoKSB7Ci0JCXJldHVybiBzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChFamJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEFJTkVSX01BTkFHRURfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcywgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCk7Ci0KLQkJbWV0aG9kUGVybWlzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEVSTUlTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQotCQlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0KLQkJbWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1RSQU5TQUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLCBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLCBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2Vzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uRUNsYXNzLCBTRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uRUNsYXNzLCBTRVNTSU9OX19TRVNTSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25FQ2xhc3MsIFNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQpOwotCi0JCWVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUVDbGFzcywgRU5USVRZX19SRUVOVFJBTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUVDbGFzcywgRU5USVRZX19QUklNQVJZX0tFWSk7Ci0KLQkJZW50ZXJwcmlzZUJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU5URVJQUklTRV9CRUFOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5FQ2xhc3MsIEVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5FQ2xhc3MsIEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFKTsKLQotCQllamJNZXRob2RDYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTUVUSE9EX0NBVEVHT1JZKTsKLQotCQllamJKYXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19QQVJNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJY21wQXR0cmlidXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENNUF9BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQotCQlyZWxhdGlvbnNoaXBzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFTEFUSU9OU0hJUFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19FSkJfSkFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCi0JCXF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFFVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeUVDbGFzcywgUVVFUllfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeUVDbGFzcywgUVVFUllfX0VKQl9RTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlFQ2xhc3MsIFFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShxdWVyeUVDbGFzcywgUVVFUllfX1FVRVJZX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocXVlcnlFQ2xhc3MsIFFVRVJZX19FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHF1ZXJ5RUNsYXNzLCBRVUVSWV9fREVTQ1JJUFRJT05TKTsKLQotCQllamJSZWxhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfUkVMQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlbGF0aW9uRUNsYXNzLCBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMpOwotCi0JCWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFTEFUSU9OU0hJUF9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQotCQlyb2xlU291cmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU291cmNlRUNsYXNzLCBST0xFX1NPVVJDRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTb3VyY2VFQ2xhc3MsIFJPTEVfU09VUkNFX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlU291cmNlRUNsYXNzLCBST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTb3VyY2VFQ2xhc3MsIFJPTEVfU09VUkNFX19ERVNDUklQVElPTlMpOwotCi0JCWNtckZpZWxkRUNsYXNzID0gY3JlYXRlRUNsYXNzKENNUl9GSUVMRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFKTsKLQotCQltZXNzYWdlRHJpdmVuRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfRFJJVkVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEUpOwotCi0JCW1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4pOwotCi0JCWV4Y2x1ZGVMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQ0xVREVfTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKLQotCQlxdWVyeU1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhRVUVSWV9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHF1ZXJ5TWV0aG9kRUNsYXNzLCBRVUVSWV9NRVRIT0RfX1FVRVJZKTsKLQotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FKTsKLQotCQlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWQVRJT05fQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFKTsKLQkJdHJhbnNhY3Rpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9UWVBFKTsKLQkJc2Vzc2lvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNFU1NJT05fVFlQRSk7Ci0JCW1ldGhvZEVsZW1lbnRLaW5kRUVudW0gPSBjcmVhdGVFRW51bShNRVRIT0RfRUxFTUVOVF9LSU5EKTsKLQkJYWNrbm93bGVkZ2VNb2RlRUVudW0gPSBjcmVhdGVFRW51bShBQ0tOT1dMRURHRV9NT0RFKTsKLQkJc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0tJTkQpOwotCQlyZXR1cm5UeXBlTWFwcGluZ0VFbnVtID0gY3JlYXRlRUVudW0oUkVUVVJOX1RZUEVfTUFQUElORyk7Ci0JCWRlc3RpbmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oREVTVElOQVRJT05fVFlQRSk7Ci0JCW11bHRpcGxpY2l0eUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKE1VTFRJUExJQ0lUWV9LSU5EKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2UgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50aXR5KCkpOwotCQltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7Ci0JCWVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVudGVycHJpc2VCZWFuKCkpOwotCQllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7Ci0JCWVqYk1ldGhvZENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYkphckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNtcEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFQXR0cmlidXRlKCkpOwotCQlyZWxhdGlvbnNoaXBzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcm9sZVNvdXJjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQljbXJGaWVsZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENNUEF0dHJpYnV0ZSgpKTsKLQkJbWVzc2FnZURyaXZlbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVudGVycHJpc2VCZWFuKCkpOwotCQltZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXhjbHVkZUxpc3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsICIyLngiLCAwLCAxLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpLCB0aGlzLmdldENNUEF0dHJpYnV0ZSgpLCBudWxsLCAicGVyc2lzdGVudEF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJrZXlBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIHRoaXMuZ2V0UXVlcnlfRW50aXR5KCksICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJDTVBBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgInByaW1LZXlGaWVsZCIsIG51bGwsIDAsIDEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAiTWV0aG9kUGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuY2hlY2tlZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInJvbGVzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAiQXNzZW1ibHlEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgdGhpcy5nZXRNZXRob2RQZXJtaXNzaW9uKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgIm1ldGhvZFBlcm1pc3Npb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpLCB0aGlzLmdldE1ldGhvZFRyYW5zYWN0aW9uKCksIHRoaXMuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fQXNzZW1ibHlEZXNjcmlwdG9yKCksICJtZXRob2RUcmFuc2FjdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAiZWpiSmFyIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCB0aGlzLmdldEV4Y2x1ZGVMaXN0KCksIG51bGwsICJleGNsdWRlTGlzdCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAiTWV0aG9kVHJhbnNhY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlc3Npb25FQ2xhc3MsIFNlc3Npb24uY2xhc3MsICJTZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludCIsIG51bGwsIDAsIDEsIFNlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRpdHlFQ2xhc3MsIEVudGl0eS5jbGFzcywgIkVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5X1JlZW50cmFudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlZW50cmFudCIsIG51bGwsIDAsIDEsIEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlfUHJpbWFyeUtleSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInByaW1hcnlLZXkiLCBudWxsLCAxLCAxLCBFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbkVDbGFzcywgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICJFbnRlcnByaXNlQmVhbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZWpiQ2xhc3MiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImhvbWVJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicmVtb3RlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlJZGVudGl0eSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEhvbWVJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MsIEVKQk1ldGhvZENhdGVnb3J5LmNsYXNzLCAiRUpCTWV0aG9kQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlamJKYXJFQ2xhc3MsIEVKQkphci5jbGFzcywgIkVKQkphciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiQ2xpZW50SmFyIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCB0aGlzLmdldEVudGVycHJpc2VCZWFuKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiSmFyKCksICJlbnRlcnByaXNlQmVhbnMiLCBudWxsLCAxLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCAicmVsYXRpb25zaGlwTGlzdCIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1Bhcm1zKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJtcyIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfVHlwZSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRLaW5kKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbigpLCBudWxsLCAiZW50ZXJwcmlzZUJlYW4iLCBudWxsLCAxLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QQXR0cmlidXRlLmNsYXNzLCAiQ01QQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ01QQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDTVBBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWxhdGlvbnNoaXBzRUNsYXNzLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAiUmVsYXRpb25zaGlwcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCksICJlamJKYXIiLCBudWxsLCAxLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpLCAiZWpiUmVsYXRpb25zIiwgbnVsbCwgMCwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRTCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiUUwiLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXR1cm5UeXBlTWFwcGluZygpLCAicmV0dXJuVHlwZU1hcHBpbmciLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCB0aGlzLmdldFF1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0VudGl0eSgpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgdGhpcy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSwgImVudGl0eSIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQlJlbGF0aW9uLmNsYXNzLCAiRUpCUmVsYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcExpc3QoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSwgInJlbGF0aW9uc2hpcExpc3QiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXAoKSwgInJlbGF0aW9uc2hpcFJvbGVzIiwgbnVsbCwgMiwgMiwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAiRUpCUmVsYXRpb25zaGlwUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCksIHRoaXMuZ2V0TXVsdGlwbGljaXR5S2luZCgpLCAibXVsdGlwbGljaXR5IiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjYXNjYWRlRGVsZXRlIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgInJlbGF0aW9uc2hpcCIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCksIHRoaXMuZ2V0Um9sZVNvdXJjZSgpLCB0aGlzLmdldFJvbGVTb3VyY2VfUm9sZSgpLCAic291cmNlIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIHRoaXMuZ2V0Q01SRmllbGRfUm9sZSgpLCAiY21yRmllbGQiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTb3VyY2VFQ2xhc3MsIFJvbGVTb3VyY2UuY2xhc3MsICJSb2xlU291cmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJvbGVTb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpLCAicm9sZSIsIG51bGwsIDEsIDEsIFJvbGVTb3VyY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgbnVsbCwgImVudGl0eUJlYW4iLCBudWxsLCAxLCAxLCBSb2xlU291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUm9sZVNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9Sb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSwgInJvbGUiLCBudWxsLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjb2xsZWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURyaXZlbkVDbGFzcywgTWVzc2FnZURyaXZlbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXNzYWdlU2VsZWN0b3IiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpLCB0aGlzLmdldEFja25vd2xlZGdlTW9kZSgpLCAiYWNrbm93bGVkZ2VNb2RlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKSwgImRlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLCBudWxsLCAiYWN0aXZhdGlvbkNvbmZpZyIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnaW5nVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSwgdGhpcy5nZXREZXN0aW5hdGlvblR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSwgdGhpcy5nZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpLCAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW4oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksICJiZWFuIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjbHVkZUxpc3RFQ2xhc3MsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAiRXhjbHVkZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRzIiwgbnVsbCwgMSwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlNZXRob2RFQ2xhc3MsIFF1ZXJ5TWV0aG9kLmNsYXNzLCAiUXVlcnlNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5TWV0aG9kX1F1ZXJ5KCksIHRoaXMuZ2V0UXVlcnkoKSwgdGhpcy5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAxLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuY2xhc3MsICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk1BTkRBVE9SWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFTEVTU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuY2xhc3MsICJNZXRob2RFbGVtZW50S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5jbGFzcywgIkFja25vd2xlZGdlTW9kZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5EVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5jbGFzcywgIlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuTk9OX0RVUkFCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLmNsYXNzLCAiUmV0dXJuVHlwZU1hcHBpbmciKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmV0dXJuVHlwZU1hcHBpbmdFRW51bSwgUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLmNsYXNzLCAiRGVzdGluYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLlFVRVVFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGVzdGluYXRpb25UeXBlRUVudW0sIERlc3RpbmF0aW9uVHlwZS5UT1BJQ19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLmNsYXNzLCAiTXVsdGlwbGljaXR5S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG11bHRpcGxpY2l0eUtpbmRFRW51bSwgTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9FamJQYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWM5MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogRW50ZXJwcmlzZUphdmFCZWFuIGlzIGEgY2xhc3MuICBJdCBjYW4gaGF2ZSBpbnN0YW5jZXMsIHNvbWVvbmUgY291bGQgd3JpdGUgYW4gaW5zdGFuY2UgZG9jdW1lbnQgY29udGFpbmluZyBEZXBhcnRtZW50cyBhbmQgRW1wbG95ZWVzLiAgSXQgYWxzbyBoYXMgYXR0cmlidXRlcywgb3BlcmF0aW9ucywgYW5kIGFzc29jaWF0aW9ucy4gIFRoZXNlIGFyZSBhY3R1YWxseSBkZXJpdmVkLy9maWx0ZXJlZCBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgRm9yIG1hcHBpbmcgYW5kIGJyb3dzaW5nIHB1cnBvc2VzLCB0aG91Z2gsIHlvdSB3b3VsZCBsaWtlIHRoZSBFSkIgdG8gYXBwZWFyIGFzIGEgY2xhc3MuICAKLSAqIAotICogSW4gdGhpcyBsaWdodCwgZXZlbiBTZXNzaW9uIEJlYW5zIGNhbiBoYXZlIGFzc29jaWF0aW9ucyBhbmQgcHJvcGVydGllcyBpbXBsZW1lbnRlZCBieSB0aGVpciBiZWFuLiAgRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlIG1lYW5pbmdmdWwgdG8gZGVzY3JpYmUgYXNzb2NpYXRpb25zIGZyb20gYSBTZXNzaW9uIHRvIHRoZSBFbnRpdGllcyB3aGljaCBpdCB1c2VzIHRvIHBlcmZvcm0gaXRzIHdvcmsuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRlcnByaXNlQmVhbkltcGwgZXh0ZW5kcyBKTkRJRW52UmVmc0dyb3VwSW1wbCBpbXBsZW1lbnRzIEVudGVycHJpc2VCZWFuIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgTWV0aG9kW10gRU1QVFlfTUVUSE9EX0FSUkFZID0gbmV3IE1ldGhvZFswXTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRUxFTUVOVF9OQU1FID0gIk1ldGhvZEVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBlamJDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBob21lSW50ZXJmYWNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHJlbW90ZUludGVyZmFjZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBsb2NhbEhvbWVJbnRlcmZhY2UgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbG9jYWxJbnRlcmZhY2UgPSBudWxsOwotCXByb3RlY3RlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JcHVibGljIEVudGVycHJpc2VCZWFuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTjsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDbGFzc1JlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBKYXZhIGNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gZ2V0SmF2YVJlZkZhY3RvcnkoKS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNpZ25hdHVyZXMsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTWV0aG9kRWxlbWVudHMoU3RyaW5nIG1lVHlwZU5hbWUsIExpc3Qgc2lnbmF0dXJlcywgRW51bWVyYXRvciBhVHlwZSkgewotCQlpbnQgc2l6ZSA9IHNpZ25hdHVyZXMuc2l6ZSgpOwotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJU3RyaW5nIHNpZ25hdHVyZTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXNpZ25hdHVyZSA9IChTdHJpbmcpIHNpZ25hdHVyZXMuZ2V0KGkpOwotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZSgoRUNsYXNzKWdldEVqYlBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihtZVR5cGVOYW1lKSk7Ci0JCQltZS5zZXRFbnRlcnByaXNlQmVhbih0aGlzKTsKLQkJCW1lLnNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKWFUeXBlKTsKLQkJCW1lLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0JCQltZXRob2RFbGVtZW50cy5hZGQobWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNvbWVNZXRob2RzLCBhbkludGVyZmFjZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKFN0cmluZyBtZVR5cGVOYW1lLCBMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoc29tZU1ldGhvZHMpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBnZXRNZXRob2RFbGVtZW50S2luZExpdGVyYWwoYW5JbnRlcmZhY2UpOwotCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudHMobWVUeXBlTmFtZSwgc2lnbmF0dXJlcywgZW51bWVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtZXJhdG9yIGdldE1ldGhvZEVsZW1lbnRLaW5kTGl0ZXJhbChKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQkJaWYgKGFuSW50ZXJmYWNlID09IGdldEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldFJlbW90ZUludGVyZmFjZSgpKQotCQkJZW51bWVyYXRvciA9IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMOwotCQllbHNlIGlmIChhbkludGVyZmFjZSA9PSBnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldExvY2FsSW50ZXJmYWNlKCkpCi0JCQllbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTDsKLQkJcmV0dXJuIGVudW1lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKExpc3Qgc29tZU1ldGhvZHMpIHsKLQkJaW50IHNpemUgPSBzb21lTWV0aG9kcy5zaXplKCk7Ci0JCUxpc3Qgc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBzb21lTWV0aG9kcy5nZXQoaSk7Ci0JCQlzaWduYXR1cmVzLmFkZChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLQkgKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLQkgKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSB7Ci0JCUxpc3QgY29tbW9uU2lncyA9IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGNvbW1vblNpZ3MsIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCX0KLQlwcm90ZWN0ZWQgTGlzdCBnYXRoZXJDb21tb25TaWduYXR1cmVzKExpc3Qgc2lnQ29sbGVjdGlvbnMpIHsKLQkJaWYgKHNpZ0NvbGxlY3Rpb25zLmlzRW1wdHkoKSkgcmV0dXJuIHNpZ0NvbGxlY3Rpb25zOwotCQlMaXN0IGZpcnN0ID0gKExpc3Qpc2lnQ29sbGVjdGlvbnMuZ2V0KDApOwotCQlpZiAoc2lnQ29sbGVjdGlvbnMuc2l6ZSgpID09IDEpIHJldHVybiBmaXJzdDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGZpcnN0LnNpemUoKSk7Ci0JCXNpZ0NvbGxlY3Rpb25zLnJlbW92ZSgwKTsKLQkJU3RyaW5nIHNpZyA9IG51bGw7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdC5zaXplKCk7IGkrKykgewotCQkJY29udGFpbnMgPSBmYWxzZTsKLQkJCXNpZyA9IChTdHJpbmcpIGZpcnN0LmdldChpKTsKLQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpZ0NvbGxlY3Rpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJbGlzdCA9IChMaXN0KSBzaWdDb2xsZWN0aW9ucy5nZXQoaik7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMoc2lnKSkKLQkJCQkJY29udGFpbnMgPSB0cnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5zKQotCQkJCXJlc3VsdC5hZGQoc2lnKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHNldCBmb3IgYSBwYXJ0aWN1bGFyIEVPYmplY3QKLQkgKiB3aGljaCBjYW4gYmUgYSBNZXRob2RUcmFuc2FjdGlvbiBvciBhIE1ldGhvZFBlcm1pc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCUVqYlBhY2thZ2UgcGFjayA9IGdldEVqYlBhY2thZ2UoKTsKLQkJCWlmIChyZWZPYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2RUcmFuc2FjdGlvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFRyYW5zYWN0aW9uKXJlZk9iamVjdCkuZ2V0TWV0aG9kRWxlbWVudHModGhpcyk7Ci0JCQlpZiAocmVmT2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kUGVybWlzc2lvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFBlcm1pc3Npb24pcmVmT2JqZWN0KS5nZXRNZXRob2RFbGVtZW50cyh0aGlzKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgTWV0aG9kRWxlbWVudHMgc2lnbmF0dXJlcwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSB7Ci0JCUxpc3Qgc2lnQ29sbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRIb21lSW50ZXJmYWNlKCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSk7Ci0JCWlmIChnZXRSZW1vdGVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJc2lnQ29sbGVjdGlvbnMuYWRkKGdldFJlbW90ZUludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwotCQlpZiAoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKS5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpKTsKLQkJaWYgKGdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwkKLQkJcmV0dXJuIGdhdGhlckNvbW1vblNpZ25hdHVyZXMoc2lnQ29sbGVjdGlvbnMpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0SG9tZUludGVyZmFjZSgpLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgTG9jYWwgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIExvY2FsIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKXsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKGdldFNlcnZpY2VFbmRwb2ludCgpLCBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhKYXZhQ2xhc3MgYW5JbnRlcmZhY2UsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gYW5JbnRlcmZhY2UuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIFJlbW90ZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRSZW1vdGVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwpOwotCX0KLQkKLQkvKgotCSAqIFNlZSBFbnRlcnByaXNlQmVhbiNnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCwgQ29tcGFyYXRvcik7Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpKTsKLQkJCi0JCUxpc3QgbGlzdCA9IGdldEVqYkNsYXNzKCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKCBpdC5oYXNOZXh0KCkpewotCQkJSmF2YUNsYXNzICBpbnRlcmZhY2VDbGFzcyA9IChKYXZhQ2xhc3MpaXQubmV4dCgpOwotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlpZiggIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuTWVzc2FnZURyaXZlbkJlYW4iKSAmJiAKLQkJCQkJIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuRW50aXR5QmVhbiIpJiYKLQkJCQkJIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuU2Vzc2lvbkJlYW4iKSl7Ci0JCQkJcmVzdWx0LmFkZEFsbCggZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoaW50ZXJmYWNlQ2xhc3MsIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpKTsKLQkJCX0KLQkJfQotCQkKLQkJdW5pb25NZXRob2RFbGVtZW50cyhyZXN1bHQsIGdldEV4aXN0aW5nTWV0aG9kRWxlbWVudHMocmVmT2JqZWN0KSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoKLQkgKiBTZWUgRW50ZXJwcmlzZUJlYW4jZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4aXN0aW5nT3JBdmFpbGFibGVNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKHJlZk9iamVjdCwgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGdldERlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpIHsKLQkJaWYgKGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID0gbmV3IEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHVuaW9uTWV0aG9kRWxlbWVudHMoTGlzdCBzb3VyY2VNZXRob2RFbGVtZW50cywgTGlzdCBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgYWRkaXRpb25hbE1FOwotCQlpbnQgc291cmNlU2l6ZSwgYWRkU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJYWRkU2l6ZSA9IGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkU2l6ZSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRTaXplOyBpKyspewotCQkJZm91bmQgPSBmYWxzZTsKLQkJCWFkZGl0aW9uYWxNRSA9IChNZXRob2RFbGVtZW50KSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMuZ2V0KGkpOwotCQkJc291cmNlTUUgPSBudWxsOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHNvdXJjZVNpemU7IGlpKyspewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKHNvdXJjZU1FLmlzRXF1aXZhbGVudChhZGRpdGlvbmFsTUUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKQotCQkJCWZvdW5kRWxlbWVudHMuYWRkKHNvdXJjZU1FKTsKLQkJfQotCQlzb3VyY2VNZXRob2RFbGVtZW50cy5yZW1vdmVBbGwoZm91bmRFbGVtZW50cyk7Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLmFkZEFsbChhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzTmFtZSgpIHsKLQkJZ2V0RWpiQ2xhc3MoKTsKLQkJcmV0dXJuIChlamJDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBlamJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCXByb3RlY3RlZCBFamJQYWNrYWdlIGdldEVqYlBhY2thZ2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCXByb3RlY3RlZCBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQlwdWJsaWMgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmKSB7Ci0JCXJldHVybiBnZXRFcXVpdmFsZW50RWpiUmVmKGFuRWpiUmVmLCBnZXRFamJSZWZzKCkpOwotCX0KLQlwdWJsaWMgRUpCTG9jYWxSZWYgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIGFuRWpiTG9jYWxSZWYpIHsKLQkJcmV0dXJuIChFSkJMb2NhbFJlZikgZ2V0RXF1aXZhbGVudEVqYlJlZihhbkVqYkxvY2FsUmVmLCBnZXRFamJMb2NhbFJlZnMoKSk7Ci0JfQotCXByaXZhdGUgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVqYlJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0VxdWl2YWxlbnQoYW5FamJSZWYpKQotCQkJCXJldHVybiByZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZUludGVyZmFjZU5hbWUoKSB7Ci0JCWdldEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBob21lSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogU2VlIDxjb2RlPmdldE1ldGhvZHM8Y29kZT4gZm9yIGNvbW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gZ2V0SG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldEhvbWVJbnRlcmZhY2UoKSAhPSBudWxsID8gZ2V0TWV0aG9kcyhnZXRIb21lSW50ZXJmYWNlKCkpIDogRU1QVFlfTUVUSE9EX0FSUkFZKTsKLQl9Ci0JcHJpdmF0ZSBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhUmVmRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXJldHVybiBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYlJlZnMoKSk7Ci0JfQotCXB1YmxpYyBFSkJMb2NhbFJlZiBnZXRMaW5rZWRFSkJMb2NhbFJlZmVyZW5jZShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlyZXR1cm4gKEVKQkxvY2FsUmVmKSBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYkxvY2FsUmVmcygpKTsKLQl9Ci0JcHJpdmF0ZSBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVKQiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0xpbmtlZChhbkVKQikpCi0JCQkJcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZSA9PSBudWxsID8gbnVsbCA6IGxvY2FsSG9tZUludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFNlZSA8Y29kZT5nZXRNZXRob2RzPGNvZGU+IGZvciBjb21tZW50Ci0JICovCi0JcHVibGljIE1ldGhvZFtdIGdldExvY2FsSG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwgPyBnZXRNZXRob2RzKGdldExvY2FsSG9tZUludGVyZmFjZSgpKSA6IEVNUFRZX01FVEhPRF9BUlJBWSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEludGVyZmFjZSgpOwotCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBsb2NhbEludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFJldHJpZXZlIGFuIG9yZGVyZWQgbGlzdCBvZiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gSmF2YUNsYXNzLgotCSAqIFRoZSBsaXN0IHNob3VsZCBpbmNsdWRlIGFsbCBub24tc3RhdGljLCBwdWJsaWMgbWV0aG9kcyB0aGF0IGFyZQotCSAqIG5vdCBpbmhlcml0ZWQgZnJvbSBqYXZheC5lamIuRUpCT2JqZWN0Ci0JICogVGhpcyB1c2VzIHRoZSBhbGdvcml0aG0gdGhhdCB3ZWIgc3BoZXJlIGN1cnJlbnRseSB1c2VzLCBhbmQgY291bGQKLQkgKiBiZSBzdWJqZWN0IHRvIGNoYW5nZQotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIxLzAwIDE6NDE6MDMgUE0pCi0JICogQHBhcmFtIGludGYgSmF2YUNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBnZXRNZXRob2RzKEphdmFDbGFzcyBpbnRmKSB7Ci0JCU1ldGhvZFtdIGFsbE1ldGhvZHMgPSBpbnRmLmxpc3RNZXRob2RFeHRlbmRlZCgpOwotCQlqYXZhLnV0aWwuVmVjdG9yIHJlc3VsdFZlY3RvciA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKGFsbE1ldGhvZHMubGVuZ3RoKTsKLQkJamF2YS51dGlsLkhhc2h0YWJsZSBtZXRob2ROYW1lVGFibGUgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBJdGVyYXRlIG92ZXIgdGhlIGxpc3QgcmV0dXJuZWQgYnkgImxpc3RNZXRob2RFeHRlbmRlZCIgYW5kCi0JCS8vIGZpbHRlciBvdXQgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlIEVKQk9iamVjdCBpbnRlcmZhY2UKLQkJLy8gYW5kIG1ldGhvZCBzeW5vbnltcy4gCi0JCS8vCi0JCS8vIE1ldGhvZCBzeW5vbnltcyBjb3JyZXNwb25kIHRvIG92ZXJyaWRlcy4gRm9yIGFsbCBzeW5vbnltcwotCQkvLyBrZWVwIHRoZSBtZXRob2QgaW5zdGFuY2UgZGVjbGFyZWQgb24gdGhlIG1vc3Qgc3BlY2lmaWMgY2xhc3MuIAotCQkvLyBIb3cgZG8geW91IGRldGVybWluZSB0aGUgbW9zdCBzcGVjaWZpYyBjbGFzcz8gRG9uJ3Qga25vdy4KLQkJLy8gRm9yIG5vdywgaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBvbiB0aGUgaW50ZXJmYWNlIGNsYXNzCi0JCS8vIGl0IGFsd2F5cyBvdmVycmlkZXMgb3RoZXJzLgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlNZXRob2RbXSByZXN1bHQgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG0gPSBhbGxNZXRob2RzW2ldOwotCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gRmlsdGVyIG91dCBzdGF0aWMgbWV0aG9kcwotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQkJaWYgKG0uaXNTdGF0aWMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgbUtleSA9IG1ldGhvZEtleShtKTsKLQotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJaWYgKCFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLkVKQk9iamVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2Qgc3lub255bSA9IChNZXRob2QpIG1ldGhvZE5hbWVUYWJsZS5nZXQobUtleSk7Ci0JCQkJaWYgKHN5bm9ueW0gPT0gbnVsbCkgewotCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQlyZXN1bHRWZWN0b3IuYWRkRWxlbWVudChtKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCQkvLyBNZXRob2QgZGVjbGFyZWQgb24gbW9zdCBzcGVjaWZpYyBjbGFzcyB3aW5zCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCUphdmFDbGFzcyBtQ2xhc3MgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCQkJSmF2YUNsYXNzIHNDbGFzcyA9IHN5bm9ueW0uZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJCQlpZiAoc0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UobUNsYXNzKSkgewotCQkJCQkJcmVzdWx0VmVjdG9yLnJlbW92ZUVsZW1lbnQoc3lub255bSk7Ci0JCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQkJcmVzdWx0VmVjdG9yLmFkZEVsZW1lbnQobSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXN1bHQgPSBuZXcgTWV0aG9kW3Jlc3VsdFZlY3Rvci5zaXplKCldOwotCQlyZXN1bHRWZWN0b3IuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHNvcnRNZXRob2RzKHJlc3VsdCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpIHsKLQkJZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCXJldHVybiByZW1vdGVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiByZW1vdGVJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkvKioKLQkgKiBTZWUgPGNvZGU+Z2V0TWV0aG9kczxjb2RlPiBmb3IgY29tbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RbXSBnZXRSZW1vdGVNZXRob2RzRm9yRGVwbG95bWVudCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZHMoZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLQkgKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCXJldHVybiBhSmF2YUNsYXNzLmVxdWFscyhnZXRFamJDbGFzcygpKXx8Ci0JCQkJCWFKYXZhQ2xhc3MuZXF1YWxzKGdldFJlbW90ZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0SG9tZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSkgfHwKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBlamIgaGFzIEJlYW5NYW5hZ2VkUGVyc2lzdGFuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuTWFuYWdlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGlzRW50aXR5KCkgJiYgIWlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQkvKioKLQkgKiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvL1JldHVybiBmYWxzZSBieSBkZWZhdWx0Ci0JcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlRHJpdmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24xX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFamJKYXIoKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQlSZXZpc2l0LnJldmlzaXQoKTsgLy9qc2hvbGwgdGhpcyBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uLiBpZiB0aGVyZSBpcyBub3QgSkFSIHRoZW4gdGhlIHZlcnNpb24gaXMgdW5kZWZpbmVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24yX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVqYkphcigpLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCX0KLQkJUmV2aXNpdC5yZXZpc2l0KCk7IC8vanNob2xsIHRoaXMgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbi4gaWYgdGhlcmUgaXMgbm90IEpBUiB0aGVuIHRoZSB2ZXJzaW9uIGlzIHVuZGVmaW5lZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkKLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jaGFzTG9jYWxDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsICYmIGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2hhc1JlbW90ZUNsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCAmJiBnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogIEdldCBtZXRob2QgbmFtZSBzdHJpbmcgb2YgZm9ybTogCi0JICogIG1ldGhvZE5hbWUoY2xhc3MgbmFtZSBvZiBhcmcxLGNsYXNzIG5hbWUgb2YgYXJnMiwuLi4pCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjQvMDAgMToyMToxMCBQTSkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBtIE1ldGhvZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXRob2RLZXkoTWV0aG9kIG0pIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobS5nZXROYW1lKCkpOwotCi0JCXJlc3VsdC5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEudXRpbC5MaXN0IGFyZ3MgPSBtLmdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBhcmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJYXJnID0gKEphdmFQYXJhbWV0ZXIpIGFyZ3MuZ2V0KGkpOwotCQkJcmVzdWx0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBhcmcuZ2V0RVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXN1bHQuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoKChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZSkuZ2V0RmVhdHVyZUlEKCksICgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTiA6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUUgOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlMgOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCUxpc3Qgcm9sZVJlZnMgPSBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiByb2xlUmVmID0gKFNlY3VyaXR5Um9sZVJlZikgcm9sZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJvbGVSZWYuZ2V0TGluaygpICE9IG51bGwgJiYgcm9sZVJlZi5nZXRMaW5rKCkuZXF1YWxzKGV4aXN0aW5nUm9sZU5hbWUpKQotCQkJCXJvbGVSZWYuc2V0TGluayhuZXdSb2xlTmFtZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0RWpiQ2xhc3NOYW1lKFN0cmluZyBlamJDbGFzc05hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihlamJDbGFzc05hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZU5hbWUoU3RyaW5nIGhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihob21lSW50ZXJmYWNlTmFtZSkpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCksIGNyZWF0ZUNsYXNzUmVmKGxvY2FsSG9tZUludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TG9jYWxJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEludGVyZmFjZU5hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihsb2NhbEludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlTmFtZShTdHJpbmcgcmVtb3RlSW50ZXJmYWNlTmFtZSkgewotCQllU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihyZW1vdGVJbnRlcmZhY2VOYW1lKSk7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8wMCAxOjMyOjEzIFBNKQotCSAqIEByZXR1cm4gTWV0aG9kW10KLQkgKiBAcGFyYW0gbWV0aG9kcyBNZXRob2RbXQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZFtdIHNvcnRNZXRob2RzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJTWV0aG9kIHJlc3VsdFtdID0gbmV3IE1ldGhvZFttZXRob2RzLmxlbmd0aF07Ci0KLQkJLyoqCi0JCSAqICBJbnNlcnQgZWFjaCBlbGVtZW50IG9mIGdpdmVuIGxpc3Qgb2YgbWV0aG9kcyBpbnRvIHJlc3VsdAotCQkgKiAgYXJhcnkgaW4gc29ydGVkIG9yZGVyCi0JCSAqLwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIGN1cnJNZXRob2QgPSBtZXRob2RzW2ldOwotCQkJU3RyaW5nIGN1cnJNZXRob2ROYW1lID0gY3Vyck1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJCWludCBpbnNlcnRJbmRleCA9IDA7Ci0JCQl3aGlsZSAoaW5zZXJ0SW5kZXggPCBpKSB7Ci0JCQkJaWYgKGN1cnJNZXRob2ROYW1lLmNvbXBhcmVUbyhyZXN1bHRbaW5zZXJ0SW5kZXhdLmdldFNpZ25hdHVyZSgpKSA8PSAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnNlcnRJbmRleCsrOwotCQkJfQotCi0JCQlmb3IgKGludCBqID0gaW5zZXJ0SW5kZXg7IGogPD0gaTsgaisrKSB7Ci0JCQkJTWV0aG9kIHRtcE1ldGhvZCA9IHJlc3VsdFtqXTsKLQkJCQlyZXN1bHRbal0gPSBjdXJyTWV0aG9kOwotCQkJCWN1cnJNZXRob2QgPSB0bXBNZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZzOwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmR3cml0dGVuIHZlcnNpb24gb2YgZ2V0RWpiQ2xhc3MoKToKLSAgICAgKi8KLSAKLSAKLSAgICBwdWJsaWMgSmF2YUNsYXNzIGdldEVqYkNsYXNzKCkgIHsgCi0gICAgICAgaWYgKGVqYkNsYXNzICE9IG51bGwgJiYgZWpiQ2xhc3MuZUlzUHJveHkoKSkgeyAKLSAgICAgICAgICBKYXZhQ2xhc3Mgb2xkRWpiQ2xhc3MgPSBlamJDbGFzczsgCi0gICAgICAgICAgSmF2YUNsYXNzIHJlc29sdmVkID0gKEphdmFDbGFzcylFY29yZVV0aWwucmVzb2x2ZShlamJDbGFzcywgdGhpcyk7IAotICAgICAgICAgIHJlc29sdmVkKHRoaXMuZWpiQ2xhc3MsIHJlc29sdmVkKTsKLSAgICAgICAgICB0aGlzLmVqYkNsYXNzID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgaWYgKGVqYkNsYXNzICE9IG9sZEVqYkNsYXNzKSB7IAotICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgCi0gICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOyAKLSAgICAgICAgICB9IAotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIGVqYkNsYXNzOyAKLSAgICB9IAotIAotICAgICAgICAgCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhKYXZhQ2xhc3MgbmV3RWpiQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SG9tZUludGVyZmFjZSgpIHsKLQkJaWYgKGhvbWVJbnRlcmZhY2UgIT0gbnVsbCAmJiBob21lSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRIb21lSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClob21lSW50ZXJmYWNlOwotCQkJaG9tZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRIb21lSW50ZXJmYWNlKTsKLQkJCWlmIChob21lSW50ZXJmYWNlICE9IG9sZEhvbWVJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaG9tZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0SG9tZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3SG9tZUludGVyZmFjZSkgewotCQlKYXZhQ2xhc3Mgb2xkSG9tZUludGVyZmFjZSA9IGhvbWVJbnRlcmZhY2U7Ci0JCWhvbWVJbnRlcmZhY2UgPSBuZXdIb21lSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFJlbW90ZUludGVyZmFjZSgpIHsKLQkJaWYgKHJlbW90ZUludGVyZmFjZSAhPSBudWxsICYmIHJlbW90ZUludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVtb3RlSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClyZW1vdGVJbnRlcmZhY2U7Ci0JCQlyZW1vdGVJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkUmVtb3RlSW50ZXJmYWNlKTsKLQkJCWlmIChyZW1vdGVJbnRlcmZhY2UgIT0gb2xkUmVtb3RlSW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW90ZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0UmVtb3RlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3UmVtb3RlSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRSZW1vdGVJbnRlcmZhY2UgPSByZW1vdGVJbnRlcmZhY2U7Ci0JCXJlbW90ZUludGVyZmFjZSA9IG5ld1JlbW90ZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJKYXIpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFamJKYXIsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJaWYgKG5ld0VqYkphciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiAmJiBuZXdFamJKYXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFamJKYXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFamJKYXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFamJKYXIobmV3RWpiSmFyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSLCBuZXdFamJKYXIsIG5ld0VqYkphcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdAotCSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHkgZ2V0U2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG5ld1NlY3VyaXR5SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdXJpdHlJZGVudGl0eSBvbGRTZWN1cml0eUlkZW50aXR5ID0gc2VjdXJpdHlJZGVudGl0eTsKLQkJc2VjdXJpdHlJZGVudGl0eSA9IG5ld1NlY3VyaXR5SWRlbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgb2xkU2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG5ld1NlY3VyaXR5SWRlbnRpdHkpIHsKLQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdHkgIT0gc2VjdXJpdHlJZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY3VyaXR5SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShuZXdTZWN1cml0eUlkZW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbmV3U2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgewotCQlpZiAobG9jYWxIb21lSW50ZXJmYWNlICE9IG51bGwgJiYgbG9jYWxIb21lSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRMb2NhbEhvbWVJbnRlcmZhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KWxvY2FsSG9tZUludGVyZmFjZTsKLQkJCWxvY2FsSG9tZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRMb2NhbEhvbWVJbnRlcmZhY2UpOwotCQkJaWYgKGxvY2FsSG9tZUludGVyZmFjZSAhPSBvbGRMb2NhbEhvbWVJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UsIG9sZExvY2FsSG9tZUludGVyZmFjZSwgbG9jYWxIb21lSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxIb21lSW50ZXJmYWNlKEphdmFDbGFzcyBuZXdMb2NhbEhvbWVJbnRlcmZhY2UpIHsKLQkJSmF2YUNsYXNzIG9sZExvY2FsSG9tZUludGVyZmFjZSA9IGxvY2FsSG9tZUludGVyZmFjZTsKLQkJbG9jYWxIb21lSW50ZXJmYWNlID0gbmV3TG9jYWxIb21lSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UsIG9sZExvY2FsSG9tZUludGVyZmFjZSwgbG9jYWxIb21lSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRMb2NhbEludGVyZmFjZSgpIHsKLQkJaWYgKGxvY2FsSW50ZXJmYWNlICE9IG51bGwgJiYgbG9jYWxJbnRlcmZhY2UuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZExvY2FsSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClsb2NhbEludGVyZmFjZTsKLQkJCWxvY2FsSW50ZXJmYWNlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZExvY2FsSW50ZXJmYWNlKTsKLQkJCWlmIChsb2NhbEludGVyZmFjZSAhPSBvbGRMb2NhbEludGVyZmFjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0UsIG9sZExvY2FsSW50ZXJmYWNlLCBsb2NhbEludGVyZmFjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TG9jYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEludGVyZmFjZShKYXZhQ2xhc3MgbmV3TG9jYWxJbnRlcmZhY2UpIHsKLQkJSmF2YUNsYXNzIG9sZExvY2FsSW50ZXJmYWNlID0gbG9jYWxJbnRlcmZhY2U7Ci0JCWxvY2FsSW50ZXJmYWNlID0gbmV3TG9jYWxJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0UsIG9sZExvY2FsSW50ZXJmYWNlLCBsb2NhbEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcigoRUpCSmFyKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCXNldEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVqYkNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmVzZXJ2ZSBhZGFwdGVycyB3aGVuIG9iamVjdCBpcyByZXNvbHZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlZChFT2JqZWN0IG9yaWdpbmFsT2JqZWN0LCBFT2JqZWN0IHJlc29sdmVkT2JqZWN0KSB7Ci0JCWlmIChvcmlnaW5hbE9iamVjdCAhPSBudWxsICYmIHJlc29sdmVkT2JqZWN0ICE9IG51bGwgJiYgb3JpZ2luYWxPYmplY3QgIT0gcmVzb2x2ZWRPYmplY3QpIHsKLQkJCUNvbGxlY3Rpb24gY29sID0gb3JpZ2luYWxPYmplY3QuZUFkYXB0ZXJzKCk7Ci0JCQlpZiAoIWNvbC5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBpdCA9IGNvbC5pdGVyYXRvcigpOwotCQkJCUFkYXB0ZXIgYTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWEgPSAoQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCQlpZiAoYSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJcmVzb2x2ZWRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEVqYkNsYXNzR2VuKCkgewotCQlpZiAoZWpiQ2xhc3MgIT0gbnVsbCAmJiBlamJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWpiQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWVqYkNsYXNzOwotCQkJZWpiQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkRWpiQ2xhc3MpOwotCQkJaWYgKGVqYkNsYXNzICE9IG9sZEVqYkNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUywgb2xkRWpiQ2xhc3MsIGVqYkNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVqYkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRFamJDbGFzcygpIHsKLQkJcmV0dXJuIGVqYkNsYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50I2dldEVBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVBbm5vdGF0aW9uIGdldEVBbm5vdGF0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCNnZXRFQW5ub3RhdGlvbnMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFQW5ub3RhdGlvbnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODEyMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLS8qKgotICogVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLCBpZiBhbnk7IHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbjsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdCBzY2hlbWEgbmFtZTsgYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotICogVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4gVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAqIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAqIFRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICogVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0gKiBUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLSAqIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5SW1wbCBleHRlbmRzIEVudGVycHJpc2VCZWFuSW1wbCBpbXBsZW1lbnRzIEVudGl0eSwgRW50ZXJwcmlzZUJlYW4gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVlbnRyYW50KCkgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUVOVFJBTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVlbnRyYW50KCkgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZW50cmFudCA9IFJFRU5UUkFOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVlbnRyYW50IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlZW50cmFudEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IG51bGw7Ci0JcHVibGljIEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FTlRJVFk7Ci0JfQotCi1wdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlOYW1lKCkgewotCWdldFByaW1hcnlLZXkoKTsKLQlyZXR1cm4gcHJpbWFyeUtleSA9PSBudWxsID8gbnVsbCA6IHByaW1hcnlLZXkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JYm9vbGVhbiByZXN1bHQgPSBzdXBlci5oYXNKYXZhUmVmZXJlbmNlKGFKYXZhQ2xhc3MpOwotCWlmICghcmVzdWx0ICYmIGFKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJcmVzdWx0ID0gYUphdmFDbGFzcy5lcXVhbHMoZ2V0UHJpbWFyeUtleSgpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotLy9SZXR1cm4gZmFsc2UgYnkgZGVmYXVsdAotcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzRW50aXR5KCkgewotCXJldHVybiB0cnVlOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUdldElzUmVlbnRyYW50KCkgewotICAgcmV0dXJuIGlzUmVlbnRyYW50KCk7Ci19Ci1wcm90ZWN0ZWQgSmF2YUNsYXNzIHByaW1HZXRQcmltYXJ5S2V5KCkgewotCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci19Ci0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpIHsKLQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRCgoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5nZXRGZWF0dXJlSUQoKSwgKChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZSkuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOiByZXR1cm4gbmV3IEJvb2xlYW4oaXNSZWVudHJhbnQoKSk7Ci0JCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZOiByZXR1cm4gZ2V0UHJpbWFyeUtleSgpOwotCX0KLQlyZXR1cm4gc3VwZXIucHJpbVJlZlZhbHVlKGZlYXR1cmUpOwotfQotcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU5hbWUoU3RyaW5nIHByaW1hcnlLZXlOYW1lKSB7Ci0JZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpLCBjcmVhdGVDbGFzc1JlZihwcmltYXJ5S2V5TmFtZSkpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWVudHJhbnQoKSB7Ci0JCXJldHVybiByZWVudHJhbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVlbnRyYW50KGJvb2xlYW4gbmV3UmVlbnRyYW50KSB7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50ID0gcmVlbnRyYW50OwotCQlyZWVudHJhbnQgPSBuZXdSZWVudHJhbnQ7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50RVNldCA9IHJlZW50cmFudEVTZXQ7Ci0JCXJlZW50cmFudEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5ULCBvbGRSZWVudHJhbnQsIHJlZW50cmFudCwgIW9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0UmVlbnRyYW50KCkgewotCQlib29sZWFuIG9sZFJlZW50cmFudCA9IHJlZW50cmFudDsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnRFU2V0ID0gcmVlbnRyYW50RVNldDsKLQkJcmVlbnRyYW50ID0gUkVFTlRSQU5UX0VERUZBVUxUOwotCQlyZWVudHJhbnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfX1JFRU5UUkFOVCwgb2xkUmVlbnRyYW50LCBSRUVOVFJBTlRfRURFRkFVTFQsIG9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0UmVlbnRyYW50KCkgewotCQlyZXR1cm4gcmVlbnRyYW50RVNldDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kd3JpdHRlbiB2ZXJzaW9uIG9mIGdldFByaW1hcnlLZXkoKToKLSAgICAgKi8KLSAKLSAKLSAgICBwdWJsaWMgSmF2YUNsYXNzIGdldFByaW1hcnlLZXkoKSAgeyAKLSAgICAgICBpZiAocHJpbWFyeUtleSAhPSBudWxsICYmIHByaW1hcnlLZXkuZUlzUHJveHkoKSkgeyAKLSAgICAgICAgICBKYXZhQ2xhc3Mgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7IAotICAgICAgICAgIEphdmFDbGFzcyByZXNvbHZlZCA9IChKYXZhQ2xhc3MpRWNvcmVVdGlsLnJlc29sdmUocHJpbWFyeUtleSwgdGhpcyk7IAotICAgICAgICAgIHJlc29sdmVkKHRoaXMucHJpbWFyeUtleSwgcmVzb2x2ZWQpOwotICAgICAgICAgIHRoaXMucHJpbWFyeUtleSA9IHJlc29sdmVkOwotICAgICAgICAgIGlmIChwcmltYXJ5S2V5ICE9IG9sZFByaW1hcnlLZXkpIHsgCi0gICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSAKLSAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUywgb2xkUHJpbWFyeUtleSwgcHJpbWFyeUtleSkpOyAKLSAgICAgICAgICB9IAotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIHByaW1hcnlLZXk7IAotICAgIH0gCi0gCi0gICAgICAgICAKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoSmF2YUNsYXNzIG5ld1ByaW1hcnlLZXkpIHsKLQkJSmF2YUNsYXNzIG9sZFByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OwotCQlwcmltYXJ5S2V5ID0gbmV3UHJpbWFyeUtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXJldHVybiBpc1JlZW50cmFudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJpbWFyeUtleSgpOwotCQkJCXJldHVybiBiYXNpY0dldFByaW1hcnlLZXkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXNldFJlZW50cmFudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJdW5zZXRSZWVudHJhbnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVlbnRyYW50KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVlbnRyYW50OiAiKTsKLQkJaWYgKHJlZW50cmFudEVTZXQpIHJlc3VsdC5hcHBlbmQocmVlbnRyYW50KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCSAqIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUKLQkgKiBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi0JICogZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAKLQkgKiBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvIG11bHRpcGxlCi0JICogY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAqIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZCB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgCi0JICogdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0JICogRXhhbXBsZXM6PHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8Ly9wcmltLWtleS1jbGFzcz4KLQkgKiAJPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC8vcHJpbS1rZXktY2xhc3M+Ci0JICogCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC8vcHJpbS1rZXktY2xhc3M+Ci0KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFByaW1hcnlLZXlHZW4oKSB7Ci0JCWlmIChwcmltYXJ5S2V5ICE9IG51bGwgJiYgcHJpbWFyeUtleS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJpbWFyeUtleSA9IChJbnRlcm5hbEVPYmplY3QpcHJpbWFyeUtleTsKLQkJCXByaW1hcnlLZXkgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkUHJpbWFyeUtleSk7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBvbGRQcmltYXJ5S2V5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiBwcmltYXJ5S2V5OwotCX0KLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhkYmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgZXhjbHVkZSBsaXN0IGVsZW1lbnQgZGVmaW5lcyBhIHNldCBvZiBtZXRob2RzIHdoaWNoIHRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4gSXQgY29udGFpbnMgb25lIG9yIG1vcmUgbWV0aG9kcy4KLSAqIAotICogSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUxpc3RJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjbHVkZUxpc3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RFbGVtZW50cyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEV4Y2x1ZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVYQ0xVREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RFbGVtZW50cygpIHsKLQkJaWYgKG1ldGhvZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZEVsZW1lbnQuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzICE9IG51bGwgJiYgIW1ldGhvZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoYW5FSkIgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChhbkVKQi5lcXVhbHMobWUuZ2V0RW50ZXJwcmlzZUJlYW4oKSkpCi0JCQkJcmVzdWx0LmFkZChtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0MzZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGtleUF0dHJpYnV0ZXMgKHRoaXMgaW5jbHVkZXMgaW5oZXJpdGVkIAotICoga2V5IGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGtleSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgcG9pbnRlZCB0byBieSBhbiBFamJSZWxhdGlvbnNoaXBSb2xlLgotICogVGh1cywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGtleSBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgaW5oZXJpdGVkIGtleSBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDc6MjM6MjIgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlyZXR1cm4gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5zaW5nbGV0b24oKSk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2NiNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHJlbGF0aW9uc2hpcFJvbGVzICh0aGlzIGluY2x1ZGVzCi0gKiBpbmhlcml0ZWQgRWpiUmVsYXRpb25zaGlwUm9sZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24KLSAqIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLiBJdCB3aWxsIHJlbW92ZSBhbnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGUgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUga2V5LiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMAotICogNzoxNDo1NyBQTSkgQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBrZXlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocm9sZS5pc0tleSgpKSBrZXlSb2xlcy5hZGQocm9sZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbigpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKSBzaW5nbGV0b24gPSBuZXcgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgwYmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGtleUF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGtleVBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBhbnkgc3VwZXJ0eXBlcy4KLSAqIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YgQ01QQXR0cmlidXRlcyB3aWxsIGJlIGtleSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGxvY2FsbHkKLSAqIGZvciB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHBsdXMga2V5IGF0dHJpYnV0ZXMKLSAqIHRoYXQgd2VyZSBhZGRlZCBmcm9tIEVqYlJlbGF0aW9uc2hpcFJvbGVzIHRoYXQgYXJlIGhlbGQgYnkgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA2OjI0OjMzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxLZXlBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBTdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIExvY2FsS2V5QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCXJldHVybiBuZXcgQXJyYXlMaXN0KGNtcC5nZXRLZXlBdHRyaWJ1dGVzKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUgc3VwZXJFbnRpdHkuCi0gKiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQlDTVBBdHRyaWJ1dGUgZm91bmQgPSBzdXBlckVudGl0eS5nZXRLZXlBdHRyaWJ1dGUoYW5BdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gZm91bmQgIT0gbnVsbDsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIExvY2FsS2V5QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCXNpbmdsZXRvbiA9IG5ldyBMb2NhbEtleUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk1MzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUKLSAqIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlcgotICogbWV0aG9kLiBJdCB3aWxsIHJlbW92ZSBhbnkgaW5oZXJpdGVkIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGFuZCBhbnkKLSAqIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGhlbGQgYnkgRWpiUmVsYXRpb25zaGlwUm9sZSBvYmplY3RzIChpbmNsdWRpbmcKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlIGF0dHJpYnV0ZXMpLiBUaGF0IG1lYW5zIHRoZSByZXR1cm5lZCBsaXN0IG9mCi0gKiBDTVBBdHRyaWJ1dGVzIHdpbGwgYmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBsb2NhbGx5IG1pbnVzIGFsbAotICogaW5oZXJpdGVkIGF0dHJpYnV0ZXMgYW5kIG1pbnVzIGFueSBhdHRyaWJ1dGVzIHBvaW50ZWQgdG8gYnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGVzLCB0aHVzIHRoZSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZQotICogZGVmaW5lZCBsb2NhbGx5IGJ5IHRoZSB1c2VyLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjMxOjQyIFBNKSBAYXV0aG9yOgotICogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBTdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuIFJldHVybiBsb2NhbAotCSAqIGF0dHJpYnV0ZXMgbWludXMgdGhvc2UgYWRkZWQgZHVlIHRvIFJlbGF0aW9uc2hpcCBSb2xlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlqYXZhLnV0aWwuTGlzdCBsb2NhbCA9IG51bGwsIGxvY2FsUm9sZUF0dHJpYnV0ZXM7IAotCQlsb2NhbCA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JCWxvY2FsUm9sZUF0dHJpYnV0ZXMgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuc2luZ2xldG9uKCkpOwotCQlpZihsb2NhbCAhPSBudWxsKQotCQkgIGxvY2FsLnJlbW92ZUFsbChsb2NhbFJvbGVBdHRyaWJ1dGVzKTsKLQkJcmV0dXJuIGxvY2FsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUKLQkgKiBzdXBlckVudGl0eS4gRm9yIHRoaXMgZmlsdGVyLCBvbmx5IHRoZSBuYW1lIGhhcyB0byBiZSB0aGUgc2FtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQkJQ01QQXR0cmlidXRlIGZvdW5kID0gc3VwZXJFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhbkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZm91bmQgIT0gbnVsbDsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwCi0JICogUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLkxvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFkMzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcmVsYXRpb25zaGlwUm9sZXMgKHRoaXMgaW5jbHVkZXMKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlcykgZnJvbSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbgotICogdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlciBtZXRob2QuIEl0IHdpbGwgcmVtb3ZlIGFueQotICogRWpiUmVsYXRpb25zaGlwUm9sZSB0aGF0IGlzIGluaGVyaXRlZCBhbmQgaXQgd2lsbCByZXR1cm4gdGhlIG9wcG9zaXRlIHJvbGUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjE0OjU3IFBNKSBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgTGlzdCB3aXRoIHRoZSBvcHBvc2l0ZSByb2xlcyBmb3IgdGhlIGxvY2FsIHJlbGF0aW9uc2hpcCByb2xlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBvcHBvc2l0ZVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUsIG9wcG9zaXRlOwotICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgb3Bwb3NpdGUgPSByb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0gICAgICAgICAgICBpZiAob3Bwb3NpdGUgIT0gbnVsbCkgb3Bwb3NpdGVSb2xlcy5hZGQob3Bwb3NpdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcHBvc2l0ZVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHNpbmdsZXRvbiA9IG5ldyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzU1YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBhbnkgc3VwZXJ0eXBlcy4KLSAqIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YgQ01QQXR0cmlidXRlcyB3aWxsIGJlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGRlZmluZWQgbG9jYWxseQotICogZm9yIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGhlbGQgYnkgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gcGx1cyBhdHRyaWJ1dGVzCi0gKiB0aGF0IHdlcmUgYWRkZWQgZnJvbSBFamJSZWxhdGlvbnNoaXBSb2xlcyB0aGF0IGFyZSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNTowMyBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCXJldHVybiBuZXcgQXJyYXlMaXN0KGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLX0KLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW5BdHRyaWJ1dGUgYWxzbyBleGlzdHMgaW4gdGhlIHN1cGVyRW50aXR5LgotICogRm9yIHRoaXMgZmlsdGVyLCBvbmx5IHRoZSBuYW1lIGhhcyB0byBiZSB0aGUgc2FtZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBlcnR5cGVBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzdXBlckVudGl0eSwgQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0JQ01QQXR0cmlidXRlIGZvdW5kID0gc3VwZXJFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhbkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3VuZCAhPSBudWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwIFBNKQotICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLkxvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllZTIxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGZyb20gdGhlIAotICogQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyIG1ldGhvZC4KLSAqIEl0IHdpbGwgcmVtb3ZlIGFueSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgcG9pbnRlZCB0byBieSBhbiBFamJSZWxhdGlvbnNoaXBSb2xlIGFuZAotICogaXQgd2lsbCBmdXJ0aGVyIHJlbW92ZSBhdHRyaWJ1dGVzIHBvaW50ZWQgdG8gYnkgaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGVzLgotICogVGh1cywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGF0dHJpYnV0ZXMgdGhhdCBvbmx5IGJlbG9uZyB0byBsb2NhbAotICogRWpiUmVsYXRpb25zaGlwUm9sZXMgKG5vdCBpbmNsdWRpbmcgaWhlcml0ZWQgcm9sZXMpLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNjo0NjowOCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0gICByZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoY21wKTsgCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCXNpbmdsZXRvbiA9IG5ldyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE1YjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi1wdWJsaWMgc3RhdGljIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLQotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlJdGVyYXRvciBpdCA9IGdldFNvdXJjZVJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLQkJaWYgKHJvbGUuaXNLZXkoKSkKLQkJCWF0dHJpYnV0ZXMuYWRkQWxsKHJvbGUuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JcmV0dXJuIGF0dHJpYnV0ZXM7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWYwMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5EZXN0aW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQ7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRZUEVfRURFRkFVTFQgPSBEZXN0aW5hdGlvblR5cGUuUVVFVUVfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEZXN0aW5hdGlvblR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQgPSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCSAqIAotCSAqIFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IGphdmF4Lmptcy5RdWV1ZSwgamF2YXguam1zLlRvcGljCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKERlc3RpbmF0aW9uVHlwZSBuZXdUeXBlKSB7Ci0JCURlc3RpbmF0aW9uVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSwgIW9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUeXBlKCkgewotCQlEZXN0aW5hdGlvblR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JCXR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSwgb2xkVHlwZSwgVFlQRV9FREVGQVVMVCwgb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZSBvciBub25kdXJhYmxlLgotCSAqIAotCSAqIFRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgRHVyYWJsZSwgTm9uRHVyYWJsZQotCi0JICovCi0JcHVibGljIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSB7Ci0JCXJldHVybiBzdWJzY3JpcHRpb25EdXJhYmlsaXR5OwotCX0KLQotCS8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZCBOT1QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG5ld1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkpIHsKLSAgICAJU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk7Ci0gICAgCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBuZXdTdWJzY3JpcHRpb25EdXJhYmlsaXR5ID09IG51bGwgPyBudWxsIDogbmV3U3Vic2NyaXB0aW9uRHVyYWJpbGl0eTsKLSAgICAJYm9vbGVhbiBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0OwotICAgIAlzdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCA9IHRydWU7Ci0gICAgCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZLCBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5LCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5LCAhb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpKTsKLSAgICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSB7Ci0JCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBzdWJzY3JpcHRpb25EdXJhYmlsaXR5OwotCQlib29sZWFuIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQ7Ci0JCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9FREVGQVVMVDsKLQkJc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSwgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSwgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQsIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlyZXR1cm4gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW4gZ2V0QmVhbigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoTWVzc2FnZURyaXZlbillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmVhbihNZXNzYWdlRHJpdmVuIG5ld0JlYW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0JlYW4sIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWFuKE1lc3NhZ2VEcml2ZW4gbmV3QmVhbikgewotCQlpZiAobmV3QmVhbiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOICYmIG5ld0JlYW4gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdCZWFuKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3QmVhbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCZWFuKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiwgTWVzc2FnZURyaXZlbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuKG5ld0JlYW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTiwgbmV3QmVhbiwgbmV3QmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmVhbigoTWVzc2FnZURyaXZlbilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCZWFuKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIE1lc3NhZ2VEcml2ZW4uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZ2V0QmVhbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoRGVzdGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU46Ci0JCQkJc2V0QmVhbigoTWVzc2FnZURyaXZlbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXVuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlzZXRCZWFuKChNZXNzYWdlRHJpdmVuKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFk6Ci0JCQkJcmV0dXJuIGlzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOOgotCQkJCXJldHVybiBnZXRCZWFuKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk6ICIpOwotCQlpZiAoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpIHJlc3VsdC5hcHBlbmQoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZGE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuSW1wbCBleHRlbmRzIEVudGVycHJpc2VCZWFuSW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEcml2ZW4gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uVHlwZSgpIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb24gVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VTZWxlY3RvcigpIDxlbT5NZXNzYWdlIFNlbGVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlU2VsZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlU2VsZWN0b3IgPSBNRVNTQUdFX1NFTEVDVE9SX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2tub3dsZWRnZU1vZGUoKSA8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFja25vd2xlZGdlTW9kZSBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxUID0gQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBY2tub3dsZWRnZU1vZGUgYWNrbm93bGVkZ2VNb2RlID0gQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFja25vd2xlZGdlIE1vZGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFja25vd2xlZGdlTW9kZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBkZXN0aW5hdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWcgYWN0aXZhdGlvbkNvbmZpZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIG1lc3NhZ2VEZXN0aW5hdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdpbmdUeXBlKCkgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIG1lc3NhZ2luZ1R5cGUgPSBudWxsOwotCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9EUklWRU47Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW4oKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCSAqIFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IEJlYW4sIENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVRyYW5zYWN0aW9uVHlwZSBvbGRUcmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7Ci0JCXRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA6IG5ld1RyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlLCAhb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZQotCSAqIHNlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbgotCSAqIGJlYW4gaXMgdG8gcmVjZWl2ZS4KLQkgKiAKLQkgKiBFeGFtcGxlIHZhbHVlOiAKLQkgKiBKTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgPiAyNTAwCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VTZWxlY3RvcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VTZWxlY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlU2VsZWN0b3IoU3RyaW5nIG5ld01lc3NhZ2VTZWxlY3RvcikgewotCQlTdHJpbmcgb2xkTWVzc2FnZVNlbGVjdG9yID0gbWVzc2FnZVNlbGVjdG9yOwotCQltZXNzYWdlU2VsZWN0b3IgPSBuZXdNZXNzYWdlU2VsZWN0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1IsIG9sZE1lc3NhZ2VTZWxlY3RvciwgbWVzc2FnZVNlbGVjdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkIChpZS4gc2VsZi50cmFuc2FjdGlvblR5cGUgPSBCZWFuKQotCSAqIAotCSAqIFRoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQkgKiAKLQkgKiBUaGUgYWNrbm93bGVkZ2UtbW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIEF1dG8tYWNrbm93bGVkZ2UsIER1cHMtb2stYWNrbm93bGVkZ2UKLQotCSAqLwotCXB1YmxpYyBBY2tub3dsZWRnZU1vZGUgZ2V0QWNrbm93bGVkZ2VNb2RlKCkgewotCQlyZXR1cm4gYWNrbm93bGVkZ2VNb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFja25vd2xlZGdlTW9kZShBY2tub3dsZWRnZU1vZGUgbmV3QWNrbm93bGVkZ2VNb2RlKSB7Ci0JCUFja25vd2xlZGdlTW9kZSBvbGRBY2tub3dsZWRnZU1vZGUgPSBhY2tub3dsZWRnZU1vZGU7Ci0JCWFja25vd2xlZGdlTW9kZSA9IG5ld0Fja25vd2xlZGdlTW9kZSA9PSBudWxsID8gQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVCA6IG5ld0Fja25vd2xlZGdlTW9kZTsKLQkJYm9vbGVhbiBvbGRBY2tub3dsZWRnZU1vZGVFU2V0ID0gYWNrbm93bGVkZ2VNb2RlRVNldDsKLQkJYWNrbm93bGVkZ2VNb2RlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUsIG9sZEFja25vd2xlZGdlTW9kZSwgYWNrbm93bGVkZ2VNb2RlLCAhb2xkQWNrbm93bGVkZ2VNb2RlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QWNrbm93bGVkZ2VNb2RlKCkgewotCQlBY2tub3dsZWRnZU1vZGUgb2xkQWNrbm93bGVkZ2VNb2RlID0gYWNrbm93bGVkZ2VNb2RlOwotCQlib29sZWFuIG9sZEFja25vd2xlZGdlTW9kZUVTZXQgPSBhY2tub3dsZWRnZU1vZGVFU2V0OwotCQlhY2tub3dsZWRnZU1vZGUgPSBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxUOwotCQlhY2tub3dsZWRnZU1vZGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERSwgb2xkQWNrbm93bGVkZ2VNb2RlLCBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxULCBvbGRBY2tub3dsZWRnZU1vZGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBY2tub3dsZWRnZU1vZGUoKSB7Ci0JCXJldHVybiBhY2tub3dsZWRnZU1vZGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBnZXREZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBuZXdEZXN0aW5hdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2xkRGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJZGVzdGluYXRpb24gPSBuZXdEZXN0aW5hdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIG9sZERlc3RpbmF0aW9uLCBuZXdEZXN0aW5hdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG5ld0Rlc3RpbmF0aW9uKSB7Ci0JCWlmIChuZXdEZXN0aW5hdGlvbiAhPSBkZXN0aW5hdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzdGluYXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVzdGluYXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZXN0aW5hdGlvbihuZXdEZXN0aW5hdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiwgbmV3RGVzdGluYXRpb24sIG5ld0Rlc3RpbmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgZ2V0QWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG5ld0FjdGl2YXRpb25Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZyBvbGRBY3RpdmF0aW9uQ29uZmlnID0gYWN0aXZhdGlvbkNvbmZpZzsKLQkJYWN0aXZhdGlvbkNvbmZpZyA9IG5ld0FjdGl2YXRpb25Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHLCBvbGRBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgbmV3QWN0aXZhdGlvbkNvbmZpZykgewotCQlpZiAobmV3QWN0aXZhdGlvbkNvbmZpZyAhPSBhY3RpdmF0aW9uQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY3RpdmF0aW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjdGl2YXRpb25Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWN0aXZhdGlvbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY3RpdmF0aW9uQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhuZXdBY3RpdmF0aW9uQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHLCBuZXdBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb24gIT0gbnVsbCAmJiBtZXNzYWdlRGVzdGluYXRpb24uZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE1lc3NhZ2VEZXN0aW5hdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZURlc3RpbmF0aW9uOwotCQkJbWVzc2FnZURlc3RpbmF0aW9uID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZE1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uICE9IG9sZE1lc3NhZ2VEZXN0aW5hdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT04sIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbiwgbWVzc2FnZURlc3RpbmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TWVzc2FnZURlc3RpbmF0aW9uKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbihKYXZhQ2xhc3MgbmV3TWVzc2FnZURlc3RpbmF0aW9uKSB7Ci0JCUphdmFDbGFzcyBvbGRNZXNzYWdlRGVzdGluYXRpb24gPSBtZXNzYWdlRGVzdGluYXRpb247Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvbiA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTiwgb2xkTWVzc2FnZURlc3RpbmF0aW9uLCBtZXNzYWdlRGVzdGluYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTElOSywgb2xkTGluaywgbGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TWVzc2FnaW5nVHlwZSgpIHsKLQkJaWYgKG1lc3NhZ2luZ1R5cGUgIT0gbnVsbCAmJiBtZXNzYWdpbmdUeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRNZXNzYWdpbmdUeXBlID0gKEludGVybmFsRU9iamVjdCltZXNzYWdpbmdUeXBlOwotCQkJbWVzc2FnaW5nVHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRNZXNzYWdpbmdUeXBlKTsKLQkJCWlmIChtZXNzYWdpbmdUeXBlICE9IG9sZE1lc3NhZ2luZ1R5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSwgb2xkTWVzc2FnaW5nVHlwZSwgbWVzc2FnaW5nVHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZXNzYWdpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRNZXNzYWdpbmdUeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnaW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdpbmdUeXBlKEphdmFDbGFzcyBuZXdNZXNzYWdpbmdUeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRNZXNzYWdpbmdUeXBlID0gbWVzc2FnaW5nVHlwZTsKLQkJbWVzc2FnaW5nVHlwZSA9IG5ld01lc3NhZ2luZ1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFLCBvbGRNZXNzYWdpbmdUeXBlLCBtZXNzYWdpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc3RpbmF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldERlc3RpbmF0aW9uKChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldERlc3RpbmF0aW9uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY3RpdmF0aW9uQ29uZmlnKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SOgotCQkJCXJldHVybiBnZXRNZXNzYWdlU2VsZWN0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERToKLQkJCQlyZXR1cm4gZ2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIGdldERlc3RpbmF0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TWVzc2FnaW5nVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKChUcmFuc2FjdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlzZXRNZXNzYWdlU2VsZWN0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXNldEFja25vd2xlZGdlTW9kZSgoQWNrbm93bGVkZ2VNb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJc2V0TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCXNldERlc3RpbmF0aW9uKChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvbigoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFOgotCQkJCXNldE1lc3NhZ2luZ1R5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlzZXRNZXNzYWdlU2VsZWN0b3IoTUVTU0FHRV9TRUxFQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXVuc2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQlzZXREZXN0aW5hdGlvbigoTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlzZXRNZXNzYWdpbmdUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1I6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VTZWxlY3RvciAhPSBudWxsIDogIU1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VTZWxlY3Rvcik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREU6Ci0JCQkJcmV0dXJuIGlzU2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJcmV0dXJuIExJTktfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmsgIT0gbnVsbCA6ICFMSU5LX0VERUZBVUxULmVxdWFscyhsaW5rKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIGRlc3RpbmF0aW9uICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlyZXR1cm4gbWVzc2FnaW5nVHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25UeXBlOiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVzc2FnZVNlbGVjdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlU2VsZWN0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFja25vd2xlZGdlTW9kZTogIik7Ci0JCWlmIChhY2tub3dsZWRnZU1vZGVFU2V0KSByZXN1bHQuYXBwZW5kKGFja25vd2xlZGdlTW9kZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlTG9jYWxNZXRob2RFbGVtZW50cygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxNZXRob2RFbGVtZW50cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2dldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSZW1vdGVNZXRob2RFbGVtZW50cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuSW1wbCNnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQkvL1RoZXJlIGlzIG9ubHkgdGhlIG9uTWVzc2FnZSBtZXRob2QKLQkJTGlzdCBzaWdzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJc2lncy5hZGQoIm9uTWVzc2FnZShqYXZheC5qbXMuTWVzc2FnZSkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2lnczsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4NDliZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLk1ldGhvZEVsZW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudAotICogbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gZGVjbGFyZWQgaW4gdGhlCi0gKiBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bwotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4KLSAqIGJvdGggdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2U7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotICogdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotICogc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4KLSAqIAotICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OgotICogCi0gKiAxLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAk8Ly9tZXRob2Q+Ci0gKiAKLSAqICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZAotICogICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAKLSAqIDIuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+RUpCTkFNRTwvL2VqYi1uYW1lPgotICogICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC8vbWV0aG9kLW5hbWU+Ci0gKiAJPC8vbWV0aG9kPj4KLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQotICogICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aAotICogICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0bwotICogICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4KLSAqIAotICogCi0gKiAKLSAqIAotICogCi0gKiAzLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvL21ldGhvZC1uYW1lPgotICogCQk8bWV0aG9kLXBhcmFtcz4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMTwvL21ldGhvZC1wYXJhbT4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMjwvL21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAJCQkuLi4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tbjwvL21ldGhvZC1wYXJhbT4KLSAqIAkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAk8bWV0aG9kPgkKLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YKLSAqICAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUKLSAqICAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZgotICogICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gKiAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAqICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICogICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0gKiAKLSAqIAotICogVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24gYW5kIGNvbnRhaW5lci10cmFuc2FjdGlvbgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotICogCQl0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczoKLSAqIAotICogCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUKLSAqIAkJbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqIAotICogICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0gKiAJCWNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLSAqIAkgCUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJCi0gKiAJVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAqIAltb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0gKiAJCQlmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotICogCQkJCW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKQotICogICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmNoYXI8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnQ8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0gKiAgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUKLSAqICAgIGludGVyZmFjZSBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBpcwotICogICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLSAqIAotICogCUZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0gKiAgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAqICAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotICogCi0gKiAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLWludGY+SG9tZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWV0aG9kRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcm1zKCkgPGVtPlBhcm1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJtcyA9IFBBUk1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBUWVBFX0VERUZBVUxUID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50S2luZCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVudGVycHJpc2VCZWFuIGVudGVycHJpc2VCZWFuID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBhcmFtcyhTdHJpbmcgcGFyYW0pIHsgCi0JU3RyaW5nIG9sZFBhcm1zID0gZ2V0UGFybXMoKTsKLQlpZiAob2xkUGFybXMgPT0gbnVsbCkgewotCQlzZXRQYXJtcyhwYXJhbSk7Ci0JfSBlbHNlIHsKLQkJc2V0UGFybXMob2xkUGFybXMuY29uY2F0KCIgIikuY29uY2F0KHBhcmFtKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0vKioKLSAqIFNldCB0aGUgcGFyYW1zIGZvciB0aGlzIG1ldGhvZCBlbGVtZW50IHRvIGFuIGVtcHR5IGFycmF5LCBhcyBvcHBvc2VkCi0gKiB0byBudWxsLgotICovCi1wdWJsaWMgdm9pZCBhcHBseVplcm9QYXJhbXMoKSB7Ci0Jc2V0UGFybXMoIiIpOyAvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgYm9vbGVhbiBlcXVhbFNpZ25hdHVyZShNZXRob2RFbGVtZW50IGFub3RoZXJNZXRob2RFbGVtZW50KSB7Ci0JYm9vbGVhbiBlcXVhbCA9IGdldE5hbWUoKS5lcXVhbHMoYW5vdGhlck1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQlpZiAoZXF1YWwpIHsKLQkJZXF1YWwgPSBwYXJtc0VxdWFsKGFub3RoZXJNZXRob2RFbGVtZW50KTsKLQkJaWYgKGVxdWFsKSB7Ci0JCQlpZiAoZ2V0VHlwZSgpID09IG51bGwpCi0JCQkJZXF1YWwgPSBhbm90aGVyTWV0aG9kRWxlbWVudC5nZXRUeXBlKCkgPT0gbnVsbDsKLQkJCWVsc2UKLQkJCQllcXVhbCA9IGdldFR5cGUoKS5lcXVhbHMoYW5vdGhlck1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQkJfQotCX0KLQlyZXR1cm4gZXF1YWw7Ci19Ci1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TWV0aG9kUGFyYW1zKCkgeyAKLQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gZ2V0TWV0aG9kUGFyYW1zVG9rZW5pemVyKCk7Ci0JamF2YS51dGlsLkxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQlqYXZhLnV0aWwuTGlzdCBwYXJhbXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZyBjdXJyZW50ID0gbnVsbDsKLQlpZiAodG9rICE9IG51bGwpIHsKLQkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCB8fCB0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgcGVlayA9IG51bGw7Ci0JCQlpZiAoY3VycmVudCA9PSBudWxsKQotCQkJCWN1cnJlbnQgPSB0b2submV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXBlZWsgPSB0b2submV4dFRva2VuKCk7Ci0JCQkJaWYgKHBlZWsuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3VycmVudCArPSBwZWVrOwotCQkJCQlwZWVrID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQl2LmFkZChjdXJyZW50KTsKLQkJCWlmIChwZWVrICE9IG51bGwpCi0JCQkJY3VycmVudCA9IHBlZWs7Ci0JCQllbHNlCi0JCQkJY3VycmVudCA9IG51bGw7Ci0JCX0KLQotCX0KLQkKLQkvKgotCQkgKiBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBmb3Igb2xkIFhNSSBnZW5lcmF0ZWQgZmlsZXMsIHRoYXQgdmVuIGlmIHRoZXJlIHdhcyAnLCcgc2VwYXJhdGVkIAotCQkgKiBwYXJhbXMsIGl0IHBhcnNlcyB0aGVtIGJhY2sgb3V0IHJpZ2h0LiAgVG8gc3VwcG9ydCA0LjAuWCBBQVQgZ2VuZXJhdGVkIFhNSSBmaWxlcyB3aXRoIHJ1bkFzIHJvbGVzIAotCQkgKiBmb3IgbWV0aG9kcy4KLQkJICovCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKQotCXsKLQkJdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcigoU3RyaW5nKXYuZ2V0KGkpLCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRvayAhPSBudWxsKQotCQl7Ci0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCXsKLQkJCQlwYXJhbXNMaXN0LmFkZCh0b2submV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBwYXJhbXNMaXN0OwotfQotcHJpdmF0ZSBTdHJpbmdUb2tlbml6ZXIgZ2V0TWV0aG9kUGFyYW1zVG9rZW5pemVyKCkgewotCS8vVGhpcyBtZXRob2QgaXMgYSBoYWNrIGZvciBub3c7IHRoZSBjYXJkaW5hbGl0eSBpcyB3cm9uZyBmb3IgdGhlIHBhcmFtcwotCVN0cmluZyBhUGFybXMgPSBnZXRQYXJtcygpOwotCWlmIChhUGFybXMgPT0gbnVsbCB8fCBhUGFybXMubGVuZ3RoKCkgPT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0UGFybXMoKSk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMuICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkOgotICoKLSAqIDEpICBJZiB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyB1bnNwZWNpZmllZCwgdGhlIG1ldGhvZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIGVqYjsKLSAqCQlJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpcyB1c2VkCi0gKgotICogMikgIElmIHRoZSBtZXRob2QgbmFtZSA9ICIqIiwgdGhlbiBhbGwgdGhlIFBVQkxJQyBtZXRob2RzIGZvciB0aGF0IGludGVyZmFjZSBhcmUgcmV0dXJuZWQKLSAqCi0gKiAzKSAgSWYgdGhlIG1ldGhvZCBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIG5vIG1ldGhvZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhbGwgcHVibGljIG1ldGhvZHMgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgaGF2aW5nIHRoZSBzYW1lIG5hbWUgYXJlIHJldHVybmVkLgotICoKLSAqIDQpICBJZiB0aGUgbWV0aG9kIG5hbWUgYW5kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGEgemVybyBvciBvbmUgZWxlbWVudCBhcnJheSBpcyByZXR1cm5lZCwgY29udGFpbmluZyB0aGUgb25lIGFuZCBvbmx5IG1ldGhvZAotICogICAgICBvbiB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgaWYgaXQgZXhpc3RzCi0gKi8KLXB1YmxpYyBNZXRob2RbXSBnZXRNZXRob2RzKCkgewotCUVudGVycHJpc2VCZWFuIGVqYiA9IGdldEVudGVycHJpc2VCZWFuKCk7Ci0JaWYoZWpiID09IG51bGwpCi0JICAgIHJldHVybiBuZXcgTWV0aG9kWzBdOwotCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQlzd2l0Y2ggKGdldFR5cGUoKS5nZXRWYWx1ZSgpKSB7Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuSE9NRSA6Ci0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWV0aG9kcyhlamIuZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5SRU1PVEUgOgotCQkJewotCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FIDoKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNZXRob2RzKGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUwgOgotCQkJewotCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIE1ldGhvZEVsZW1lbnRLaW5kLlNFUlZJQ0VfRU5EUE9JTlQgOgotCQkgICB7Ci0JCSAgICAJaWYoZWpiLmlzU2Vzc2lvbigpKSB7Ci0JCSAgICAJICAgIHJlc3VsdCA9IGdldE1ldGhvZHMoKChTZXNzaW9uKWVqYikuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQkgICAgCSAgICBicmVhazsKLQkJICAgIAl9Ci0JCSAgIH0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRCA6Ci0JCQl7Ci0JCQkJaWYgKGVqYi5pc01lc3NhZ2VEcml2ZW4oKSkKLQkJCQkJcmVzdWx0ID0gZ2V0TWV0aG9kcyhlamIuZ2V0RWpiQ2xhc3MoKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRNZXRob2RzKGVqYi5nZXRIb21lSW50ZXJmYWNlKCkpKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRNZXRob2RzKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKSkpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGdldE1ldGhvZHMoZWpiLmdldExvY2FsSG9tZUludGVyZmFjZSgpKSk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0TWV0aG9kcyhlamIuZ2V0TG9jYWxJbnRlcmZhY2UoKSkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JcmV0dXJuIChNZXRob2RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1ldGhvZFtyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMuICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkOgotICoKLSAqIDEpICBJZiB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyB1bnNwZWNpZmllZCwgdGhlIG1ldGhvZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIGVqYjsKLSAqCQlJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpcyB1c2VkCi0gKgotICogMikgIElmIHRoZSBtZXRob2QgbmFtZSA9ICIqIiwgdGhlbiBhbGwgdGhlIFBVQkxJQyBtZXRob2RzIGZvciB0aGF0IGludGVyZmFjZSBhcmUgcmV0dXJuZWQKLSAqCi0gKiAzKSAgSWYgdGhlIG1ldGhvZCBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIG5vIG1ldGhvZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhbGwgcHVibGljIG1ldGhvZHMgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgaGF2aW5nIHRoZSBzYW1lIG5hbWUgYXJlIHJldHVybmVkLgotICoKLSAqIDQpICBJZiB0aGUgbWV0aG9kIG5hbWUgYW5kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGEgemVybyBvciBvbmUgZWxlbWVudCBhcnJheSBpcyByZXR1cm5lZCwgY29udGFpbmluZyB0aGUgb25lIGFuZCBvbmx5IG1ldGhvZAotICogICAgICBvbiB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgaWYgaXQgZXhpc3RzCi0gKi8KLXByaXZhdGUgTGlzdCBnZXRNZXRob2RzKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQlpZiAoamF2YUNsYXNzID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldE5hbWUoKS50cmltKCk7Ci0JaWYgKG5hbWUuZXF1YWxzKCIqIikpICAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQllbHNlIGlmIChoYXNNZXRob2RQYXJhbXMoKSkgewotCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkKG1ldGhvZCk7Ci0JfSBlbHNlCi0gCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQobWV0aG9kTmFtZSk7Ci0gCi0gCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgTWV0aG9kRWxlbWVudCB0aGF0IGlzIG1vc3Qgc3BlY2lmaWMuCi0gKi8KLXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpYyhNZXRob2RFbGVtZW50IGFNZXRob2RFbGVtZW50LCBKYXZhQ2xhc3MgYUNsYXNzKSB7Ci0JaWYgKGFNZXRob2RFbGVtZW50ID09IG51bGwpIHJldHVybiB0aGlzOwotCWlmIChhTWV0aG9kRWxlbWVudC5pc0RlZmF1bHQoKSAmJiAhaXNEZWZhdWx0KCkpCi0JCXJldHVybiB0aGlzOwotCWlmICghYU1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCkgJiYgaXNEZWZhdWx0KCkpCi0JCXJldHVybiBhTWV0aG9kRWxlbWVudDsKLQlpZiAoYU1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCkgJiYgIWhhc01ldGhvZFBhcmFtcygpKQotCQlyZXR1cm4gYU1ldGhvZEVsZW1lbnQ7Ci0JaWYgKCFhTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKSAmJiBoYXNNZXRob2RQYXJhbXMoKSkKLQkJcmV0dXJuIHRoaXM7Ci0JaWYgKGlzVW5zcGVjaWZpZWQoKSAmJiAhYU1ldGhvZEVsZW1lbnQuaXNVbnNwZWNpZmllZCgpKQotCQlyZXR1cm4gYU1ldGhvZEVsZW1lbnQ7Ci0JcmV0dXJuIHRoaXM7Ci19Ci1wdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChMaXN0IG1ldGhvZEVsZW1lbnRzLCBNZXRob2QgYU1ldGhvZCkgewotCU1ldGhvZEVsZW1lbnQgc3BlY2lmaWNNRSA9IG51bGw7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpdCA9IG1ldGhvZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmIChtZS5yZXByZXNlbnRzKGFNZXRob2QpKSB7Ci0JCQkJaWYgKG1lLnVuaXF1ZWx5SWRlbnRpZmllcyhhTWV0aG9kKSkKLQkJCQkJcmV0dXJuIG1lOwotCQkJCWVsc2UgaWYgKHNwZWNpZmljTUUgPT0gbnVsbCkKLQkJCQkJc3BlY2lmaWNNRSA9IG1lOwotCQkJCWVsc2UKLQkJCQkJc3BlY2lmaWNNRSA9IHNwZWNpZmljTUUuZ2V0TW9zdFNwZWNpZmljKG1lLCBhTWV0aG9kLmdldEphdmFDbGFzcygpKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gc3BlY2lmaWNNRTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFybXNTdHJpbmcoKSB7Ci0JU3RyaW5nIHBhcm1TdHJpbmcgPSBnZXRQYXJtcygpOwotCWlmIChwYXJtU3RyaW5nID09IG51bGwpCi0JCXBhcm1TdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBwYXJtU3RyaW5nOwotfQotLyoqCi0gKiBSZXR1cm4gYSBTdHJpbmcgYXJyYXkgZm9yIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50IHR5cGUgbmFtZXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UG9zc2libGVUeXBlTmFtZXMoKSB7Ci0JRWpiUGFja2FnZSBwYWNrID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCUxpc3QgbGl0ZXJhbHMgPSBwYWNrLmdldE1ldGhvZEVsZW1lbnRLaW5kKCkuZ2V0RUxpdGVyYWxzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2xpdGVyYWxzLnNpemUoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaXRlcmFscy5zaXplKCk7IGkrKykKLQkJbmFtZXNbaV0gPSBsaXRlcmFscy5nZXQoaSkudG9TdHJpbmcoKTsKLQlyZXR1cm4gbmFtZXM7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2lnbmF0dXJlLgotICogRm9yIGV4YW1wbGU6ICBzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQlpZiAoaXNEZWZhdWx0KCkpCi0JCXJldHVybiBnZXROYW1lKCk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWYuYXBwZW5kKGdldE5hbWUoKSk7Ci0JaWYgKGhhc01ldGhvZFBhcmFtcygpKXsKLQkJYnVmLmFwcGVuZChSSUdIVF9QQVJFTik7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBnZXRNZXRob2RQYXJhbXNUb2tlbml6ZXIoKTsKLQkJaWYgKHRvayAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWJ1Zi5hcHBlbmQodG9rLm5leHRUb2tlbigpKTsKLQkJCQlpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCQkJYnVmLmFwcGVuZChDT01NQSk7CQkKLQkJCX0JCQkKLQkJfQotCQlidWYuYXBwZW5kKExFRlRfUEFSRU4pOwotCX0KLQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci19Ci0vLyBSZXR1cm5zIG51bGwgaWYgdGhlIEVFbnVtIGlzIFVOU1BFQ0lGSUVECi0vLyB1bmxlc3MgaXQgaXMgYSBNZXNzYWdlRHJpdmVuIGJlYW4uCi1wdWJsaWMgSmF2YUNsYXNzIGdldFR5cGVKYXZhQ2xhc3MoKSB7Ci0JaWYgKGlzSG9tZSgpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNSZW1vdGUoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNMb2NhbEhvbWUoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNMb2NhbCgpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRMb2NhbEludGVyZmFjZSgpOwotCWVsc2UgaWYgKGlzVW5zcGVjaWZpZWQoKSAmJiBnZXRFbnRlcnByaXNlQmVhbigpLmlzTWVzc2FnZURyaXZlbigpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpOwotCWVsc2UKLQkJcmV0dXJuIG51bGw7Ci19Ci0JLyoqCi0gKiBBbnN3ZXIgd2hldGhlciBtZXRob2QgcGFyYW1zIGFwcGx5IHRvIHRoaXMgbWV0aG9kLCBlLmcuLCBpdCBpcyBzcGVjaWZpYyB0byBvbmUKLSAqIG92ZXJsb2FkZWQgbWV0aG9kLCBldmVuIGlmIHRoZSBtZXRob2QgaXMgYSB6ZXJvIHBhcmFtZXRlciBtZXRob2QuICBBbnN3ZXIgZmFsc2UgaWYgbm8KLSAqIHBhcmFtZXRlcnMgYXBwbHksIHRoYXQgaXMsIHRoZSBtZXRob2QgZWxlbWVudCBhcHBsaWVzIHRvIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgd2l0aCB0aGlzIG5hbWUKLSAqLwotcHVibGljIGJvb2xlYW4gaGFzTWV0aG9kUGFyYW1zKCkgewotCXJldHVybiBnZXRQYXJtcygpICE9IG51bGw7Ci19Ci0vKioKLSAqIFBhcnNlIEBhU2lnbmF0dXJlIHNldHRpbmcgdGhlIG5hbWUgYW5kIHRoZSBwYXJhbXMuCi0gKiBBIHNpZ25hdHVyZSBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoU3RyaW5nIGFTaWduYXR1cmUpIHsKLQlwYXJzZVNpZ25hdHVyZShhU2lnbmF0dXJlKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLSAgICByZXR1cm4gSmF2YUNsYXNzLkRFRkFVTFRfTUVUSE9EX05BTUUuZXF1YWxzKGdldE5hbWUoKSk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCBhbmQgQGFub3RoZXJNZXRob2RFbGVtZW50Ci0gKiByZXByZXNlbnQgdGhlIHNhbWUgZXhhY3QgbWV0aG9kcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZEVsZW1lbnQgYW5vdGhlck1ldGhvZEVsZW1lbnQpIHsKLQlib29sZWFuIGVxdWFsID0gZXF1YWxTaWduYXR1cmUoYW5vdGhlck1ldGhvZEVsZW1lbnQpOwotCWlmIChlcXVhbCkKLQkJZXF1YWwgPSBnZXRFbnRlcnByaXNlQmVhbigpID09IGFub3RoZXJNZXRob2RFbGVtZW50LmdldEVudGVycHJpc2VCZWFuKCk7Ci0JcmV0dXJuIGVxdWFsOwotfQotcHVibGljIGJvb2xlYW4gaXNIb21lKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5IT01FOwotfQotcHVibGljIGJvb2xlYW4gaXNSZW1vdGUoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URTsKLX0KLXB1YmxpYyBib29sZWFuIGlzVW5zcGVjaWZpZWQoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEOwotfQotcHVibGljIGJvb2xlYW4gaXNMb2NhbEhvbWUoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5MT0NBTDsKLX0KLXB1YmxpYyBib29sZWFuIGlzU2VydmljZSgpIHsKLQlyZXR1cm4gZ2V0VHlwZSgpLmdldFZhbHVlKCkgPT0gTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVDsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IHJlcHJlc2VudHMgb25lIG9yIG1vcmUKLSAqIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JcmV0dXJuIGdldE1ldGhvZHMoKS5sZW5ndGggPiAwOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBvbmx5IGlmIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgQGFNZXRob2QKLSAqIG1hdGNoZXMgdGhlIG5hbWVzIGluIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gKi8KLXB1YmxpYyBib29sZWFuIG1hdGNoZXNQYXJhbXMoTWV0aG9kIGFNZXRob2QpIHsKLQlpZiAoYU1ldGhvZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JTGlzdCBwYXJhbXMgPSBnZXRNZXRob2RQYXJhbXMoKTsKLQlKYXZhUGFyYW1ldGVyW10gbWV0aG9kUGFyYW1zID0gYU1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQlpZiAocGFyYW1zLnNpemUoKSAhPSBtZXRob2RQYXJhbXMubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RQYXJhbXMubGVuZ3RoOyBpKyspewotCQlTdHJpbmcgcGFyYW1ldGVyVHlwZSA9ICgoSmF2YUhlbHBlcnMpbWV0aG9kUGFyYW1zW2ldLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKCFwYXJhbXMuZ2V0KGkpLmVxdWFscyhwYXJhbWV0ZXJUeXBlKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgaGFzIHRoZSBzYW1lIGJhc2ljIHNpZ25hdHVyZSBhcwotICogQGFNZXRob2QsIGlnbm9yaW5nIHRoZSByZXR1cm4gdHlwZSwgdGhyb3duIGV4Y2VwdGlvbnMsIGFuZCBkZWNsYXJpbmcgY2xhc3Mgb2YgCi0gKiB0aGlzIGluc3RhbmNlIG9yIEBhTWV0aG9kLiAgUmV0dXJuIGZhbHNlLCBpZiBwYXJhbXMgaXMgbnVsbAotICovCi1wdWJsaWMgYm9vbGVhbiBuYW1lQW5kUGFyYW1zRXF1YWxzKE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkgewotCQlpZiAoZ2V0TmFtZSgpLmVxdWFscyhhTWV0aG9kLmdldE5hbWUoKSkpIHsKLQkJCWlmIChoYXNNZXRob2RQYXJhbXMoKSkKLQkJCQlyZXR1cm4gbWF0Y2hlc1BhcmFtcyhhTWV0aG9kKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBwYXJtc0VxdWFsKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQlpZiAobWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCUxpc3QgbXlQYXJtcywgb3RoZXJQYXJtczsKLQlteVBhcm1zID0gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0Jb3RoZXJQYXJtcyA9IG1lLmdldE1ldGhvZFBhcmFtcygpOwotCWlmIChteVBhcm1zLnNpemUoKSAhPSBvdGhlclBhcm1zLnNpemUoKSkgcmV0dXJuIGZhbHNlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlQYXJtcy5zaXplKCk7IGkrKyl7Ci0JCWlmICghbXlQYXJtcy5nZXQoaSkuZXF1YWxzKG90aGVyUGFybXMuZ2V0KGkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogUGFyc2UgQGFTaWduYXR1cmUgc2V0dGluZyB0aGUgbmFtZSBhbmQgdGhlIHBhcmFtcy4KLQkgKiBBIHNpZ25hdHVyZSBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZVNpZ25hdHVyZShTdHJpbmcgYVNpZ25hdHVyZSkgewotCQlpbnQgaW5kZXggPSBhU2lnbmF0dXJlLmluZGV4T2YoUklHSFRfUEFSRU4pOwotCi0JCWludCBlbmRJbmRleCA9IGFTaWduYXR1cmUuaW5kZXhPZihMRUZUX1BBUkVOKTsKLQkJaWYgKGVuZEluZGV4IDwgMCkgewotCQkJZW5kSW5kZXggPSBhU2lnbmF0dXJlLmxlbmd0aCgpIC0gMTsKLQkJfQotCi0JCWlmIChpbmRleCA8IDApIHsKLQkJCXNldE5hbWUoYVNpZ25hdHVyZSk7Ci0JCQlzZXRQYXJtcyhudWxsKTsgLy8gVGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgaW4gdGhlIHNpZyBzbyBzZXQgdG8gbnVsbAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHNpZ05hbWUgPSBhU2lnbmF0dXJlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCXNldE5hbWUoc2lnTmFtZSk7Ci0JCQlTdHJpbmcgc2lnUGFybXMgPSBhU2lnbmF0dXJlLnN1YnN0cmluZyhpbmRleCArIDEsIGVuZEluZGV4KTsKLQotCQkJaWYgKHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0ZXN0UGFyZW50ID0gc2lnUGFybXMuc3Vic3RyaW5nKDAsIHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNMb3dlckNhc2UodGVzdFBhcmVudC5zdWJzdHJpbmcodGVzdFBhcmVudC5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGVzdFBhcmVudC5sZW5ndGgoKSkuY2hhckF0KDApKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNsYXNzIE15VHlwZU5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBUeXBlTmFtZVJlcXVlc3RvciB7Ci0JCQkJCQlib29sZWFuIGlzTmVzdGVkID0gZmFsc2U7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoaW50IG1vZGlmaWVycywgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpIHsKLQkJCQkJCQlpc05lc3RlZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQkJCQkJCXJldHVybiBpc05lc3RlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChnZXRFbnRlcnByaXNlQmVhbigpLmVSZXNvdXJjZSgpKSk7Ci0JCQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudHNbXSA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCQkJCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGphdmFFbGVtZW50cywgdHJ1ZSk7Ci0JCQotCQkJCQlTdHJpbmcgbmV3U3RyaW5nID0gc2lnUGFybXMuc3Vic3RyaW5nKHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikgKyAxLCBzaWdQYXJtcy5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQl3aGlsZSAodGVzdFBhcmVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCVN0cmluZyB0ZW1wID0gbnVsbDsKLQkJCQkJCXRlbXAgPSB0ZXN0UGFyZW50LnN1YnN0cmluZyh0ZXN0UGFyZW50Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0ZXN0UGFyZW50Lmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkKLQkJCQkJCU15VHlwZU5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IE15VHlwZU5hbWVSZXF1ZXN0b3IoKTsKLQkJCQkJCWludCBtYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkU7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgbWF0Y2hNb2RlLCB0ZW1wLnRvQ2hhckFycmF5KCksIG1hdGNoTW9kZSwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgc2NvcGUsIHJlcXVlc3RvciwKLQkJCQkJCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQlpZiAocmVxdWVzdG9yLmlzTmVzdGVkKCkpIHsKLQkJCQkJCQkJbmV3U3RyaW5nID0gdGVtcCArICIkIiArIG5ld1N0cmluZzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW5ld1N0cmluZyA9IHRlbXAgKyAiLiIgKyBuZXdTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHRlc3RQYXJlbnQubGFzdEluZGV4T2YoIi4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0ZXN0UGFyZW50ID0gdGVzdFBhcmVudC5zdWJzdHJpbmcoMCwgdGVzdFBhcmVudC5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVsc2UKLQkJCQkJCQkJdGVzdFBhcmVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNpZ1Bhcm1zID0gbmV3U3RyaW5nOwotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoc2lnUGFybXMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY2hhciBjb21tYUNoYXIgPSBDT01NQS5jaGFyQXQoMCk7Ci0JCQkJY2hhcltdIHNpZ1Bhcm1zQ2hhcnMgPSBzaWdQYXJtcy50b0NoYXJBcnJheSgpOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWdQYXJtc0NoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaWdQYXJtc0NoYXJzW2ldICE9IGNvbW1hQ2hhcikgewotCQkJCQkJYnVmLmFwcGVuZChzaWdQYXJtc0NoYXJzW2ldKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFkZE1ldGhvZFBhcmFtcyhidWYudG9TdHJpbmcoKSk7Ci0JCQkJCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWRkTWV0aG9kUGFyYW1zKGJ1Zi50b1N0cmluZygpKTsKLQkJCX0gZWxzZQotCQkJCWFwcGx5WmVyb1BhcmFtcygpOwotCQl9Ci0JfQotcHVibGljIHZvaWQgcmVtb3ZlTWV0aG9kUGFyYW1zKFN0cmluZyBwYXJhbSkgeyAKLQlTdHJpbmcgbXlQYXJhbXMgPSBnZXRQYXJtcygpOwotCWlmIChteVBhcmFtcyA9PSBudWxsIHx8IG15UGFyYW1zLmxlbmd0aCgpID09IDApIHsKLQkJcmV0dXJuOwotCX0KLQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihteVBhcmFtcyk7Ci0JU3RyaW5nQnVmZmVyIG5ld1Bhcm1zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdoaWxlICh0b2suaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJU3RyaW5nIHRva2VuID0gdG9rLm5leHRUb2tlbigpOwotCQlpZiAoIXRva2VuLmVxdWFscyhwYXJhbSkpIHsKLQkJCW5ld1Bhcm1zLmFwcGVuZCh0b2tlbik7Ci0JCQluZXdQYXJtcy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXNldFBhcm1zKG5ld1Bhcm1zLnRvU3RyaW5nKCkudHJpbSgpKTsKLX0KLS8qKgotICogcmVwcmVzZW50cyBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gcmVwcmVzZW50cyhNZXRob2QgYU1ldGhvZCkgewotCWlmIChhTWV0aG9kICE9IG51bGwpIHsKLQkJaWYgKGlzVW5zcGVjaWZpZWQoKSB8fCB0eXBlQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKGFNZXRob2QuZ2V0SmF2YUNsYXNzKCkpKSB7Ci0JCQlpZiAoaXNEZWZhdWx0KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlIAotCQkJCWlmIChnZXROYW1lKCkuZXF1YWxzKGFNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQkJCQlyZXR1cm4gbWF0Y2hlc1BhcmFtcyhhTWV0aG9kKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JfQkJCQkJCi0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBTZXRzIHRoZSBpZCB0byBiZSBbTWV0aG9kVHJhbnNhY3Rpb25JRHwgTWV0aG9kUGVybWlzc2lvbklEXV9FSkJOQU1FX01ldGhvZE5hbWUsCi0gKiBvciBbTWV0aG9kVHJhbnNhY3Rpb25JRHwgTWV0aG9kUGVybWlzc2lvbklEXV9FSkJOQU1FX01ldGhvZE5hbWVfUGFybXMsIGlmIHBhcm1zIGV4aXN0Ci0gKi8KLXB1YmxpYyB2b2lkIHNldElkVG9SZWFkYWJsZVN0cmluZygpIHsgCi0JU3RyaW5nIGFQYXJtcyA9IGdldFBhcm1zKCkgPT0gbnVsbCA/ICIiIDogIl8iK2dldFBhcm1zKCkucmVwbGFjZSgnICcsICdfJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCVN0cmluZyBwcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN3aXRjaCAoTWV0aG9kRWxlbWVudEhlbHBlci5nZXRDb250YWluZWRUeXBlKHRoaXMpKSB7Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEhlbHBlci5NRVRIT0RfUEVSTUlTU0lPTiA6CQotCQkJcHJlZml4ID0gKChYTUlSZXNvdXJjZSllQ29udGFpbmVyLmVSZXNvdXJjZSgpKS5nZXRJRChlQ29udGFpbmVyKTsKLQkJCWJyZWFrOwotCQljYXNlIE1ldGhvZEVsZW1lbnRIZWxwZXIuTUVUSE9EX1RSQU5TQUNUSU9OIDoKLQkJCXByZWZpeCA9ICgoWE1JUmVzb3VyY2UpZUNvbnRhaW5lci5lUmVzb3VyY2UoKSkuZ2V0SUQoZUNvbnRhaW5lcik7Ci0JCQlicmVhazsKLQl9Ci0JKChYTUlSZXNvdXJjZSllUmVzb3VyY2UoKSkuc2V0SUQodGhpcyxwcmVmaXggKyAiXyIgKyBnZXRFbnRlcnByaXNlQmVhbigpLmdldE5hbWUoKSArICJfIiArIGdldE5hbWUoKSArIGFQYXJtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQlpZiAoZ2V0VHlwZUphdmFDbGFzcygpID09IG51bGwgfHwgYW5JbnRlcmZhY2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCXJldHVybiBnZXRUeXBlSmF2YUNsYXNzKCkuaW1wbGVtZW50c0ludGVyZmFjZShhbkludGVyZmFjZSk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzCi0gKiBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgZXZlbiBpZiB0aGUgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzCi0gKiBAYU1ldGhvZCAoaS5lLiwgQGFNZXRob2QgaXMgY29udGFpbmVkIGluIGl0cyBsaXN0IG9mIG1ldGhvZHMpLgotICovCi1wdWJsaWMgYm9vbGVhbiB1bmlxdWVseUlkZW50aWZpZXMoTWV0aG9kIGFNZXRob2QpIHsKLQlpZiAoYU1ldGhvZCAhPSBudWxsKSB7Ci0JCWlmIChnZXRUeXBlSmF2YUNsYXNzKCkgIT0gbnVsbCAmJiAKLQkgICAgICAgIHR5cGVDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoYU1ldGhvZC5nZXRKYXZhQ2xhc3MoKSkgJiYgCi0JICAgICAgICBnZXROYW1lKCkuZXF1YWxzKGFNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGhhc01ldGhvZFBhcmFtcygpKQotCQkJCXJldHVybiBtYXRjaGVzUGFyYW1zKGFNZXRob2QpOwotCQkJcmV0dXJuIGFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoPT0wOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwKLQkgKiBvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudAotCSAqIGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgaG9tZQotCSAqIGludGVyZmFjZXMuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFybXMoKSB7Ci0JCXJldHVybiBwYXJtczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJtcyhTdHJpbmcgbmV3UGFybXMpIHsKLQkJU3RyaW5nIG9sZFBhcm1zID0gcGFybXM7Ci0JCXBhcm1zID0gbmV3UGFybXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TLCBvbGRQYXJtcywgcGFybXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEtpbmQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShNZXRob2RFbGVtZW50S2luZCBuZXdUeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFLCBvbGRUeXBlLCB0eXBlLCAhb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFR5cGUoKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEUsIG9sZFR5cGUsIFRZUEVfRURFRkFVTFQsIG9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0JCWlmIChlbnRlcnByaXNlQmVhbiAhPSBudWxsICYmIGVudGVycHJpc2VCZWFuLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbnRlcnByaXNlQmVhbiA9IChJbnRlcm5hbEVPYmplY3QpZW50ZXJwcmlzZUJlYW47Ci0JCQllbnRlcnByaXNlQmVhbiA9IChFbnRlcnByaXNlQmVhbillUmVzb2x2ZVByb3h5KG9sZEVudGVycHJpc2VCZWFuKTsKLQkJCWlmIChlbnRlcnByaXNlQmVhbiAhPSBvbGRFbnRlcnByaXNlQmVhbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTiwgb2xkRW50ZXJwcmlzZUJlYW4sIGVudGVycHJpc2VCZWFuKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBiYXNpY0dldEVudGVycHJpc2VCZWFuKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gbmV3RW50ZXJwcmlzZUJlYW4pIHsKLQkJRW50ZXJwcmlzZUJlYW4gb2xkRW50ZXJwcmlzZUJlYW4gPSBlbnRlcnByaXNlQmVhbjsKLQkJZW50ZXJwcmlzZUJlYW4gPSBuZXdFbnRlcnByaXNlQmVhbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOLCBvbGRFbnRlcnByaXNlQmVhbiwgZW50ZXJwcmlzZUJlYW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXJldHVybiBnZXRQYXJtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbnRlcnByaXNlQmVhbigpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGVycHJpc2VCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVM6Ci0JCQkJc2V0UGFybXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOgotCQkJCXNldEVudGVycHJpc2VCZWFuKChFbnRlcnByaXNlQmVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXNldFBhcm1zKFBBUk1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEU6Ci0JCQkJdW5zZXRUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW4oKEVudGVycHJpc2VCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVM6Ci0JCQkJcmV0dXJuIFBBUk1TX0VERUZBVUxUID09IG51bGwgPyBwYXJtcyAhPSBudWxsIDogIVBBUk1TX0VERUZBVUxULmVxdWFscyhwYXJtcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOgotCQkJCXJldHVybiBlbnRlcnByaXNlQmVhbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFybXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcm1zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJaWYgKHR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQZXJtaXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzBiNjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci0KLS8qKgotICogVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kLy9vciBob21lIGludGVyZmFjZXMuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQZXJtaXNzaW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBlcm1pc3Npb24gewotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5jaGVja2VkKCkgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVbmNoZWNrZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkNIRUNLRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVuY2hlY2tlZCA9IFVOQ0hFQ0tFRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuY2hlY2tlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5jaGVja2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kRWxlbWVudHMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QRVJNSVNTSU9OOwotCX0KLQotcHVibGljIExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlpZiAoYW5FSkIgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JTGlzdCBlbGVtZW50cyA9IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JTWV0aG9kRWxlbWVudCBtZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKXsKLQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQlpZiAoYW5FSkIuZXF1YWxzKG1lLmdldEVudGVycHJpc2VCZWFuKCkpKQotCQkJcmVzdWx0LmFkZChtZSk7CQkJCi0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSB7Ci0JaWYgKGFSb2xlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlMaXN0IG15Um9sZXMgPSBnZXRSb2xlcygpOwotCWludCBzaXplID0gbXlSb2xlcy5zaXplKCk7Ci0JU2VjdXJpdHlSb2xlIHJvbGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgbXlSb2xlcy5nZXQoaSk7Ci0JCWlmIChhUm9sZU5hbWUuZXF1YWxzKHJvbGUuZ2V0Um9sZU5hbWUoKSkpCi0JCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcGVybWlzc2lvbiBjb250YWlucyBAYVNlY3VyaXR5Um9sZQotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIGFTZWN1cml0eVJvbGUpIHsKLQlpZiAoYVNlY3VyaXR5Um9sZSA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JTGlzdCBteVJvbGVzID0gZ2V0Um9sZXMoKTsKLQlpbnQgc2l6ZSA9IG15Um9sZXMuc2l6ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWlmIChhU2VjdXJpdHlSb2xlID09IG15Um9sZXMuZ2V0KGkpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGhhc1NlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSB7Ci0JcmV0dXJuIGdldFNlY3VyaXR5Um9sZShhUm9sZU5hbWUpICE9IG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kUGVybWlzc2lvbiBhbmQgQGFub3RoZXJNZXRob2RQZXJtaXNzaW9uCi0gKiBoYXZlIHRoZSBzYW1lIHJvbGVzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWV0aG9kUGVybWlzc2lvbiBhbm90aGVyTWV0aG9kUGVybWlzc2lvbikgewotCWlmIChhbm90aGVyTWV0aG9kUGVybWlzc2lvbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGdldFJvbGVzKCkuc2l6ZSgpID09IGFub3RoZXJNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuc2l6ZSgpICYmCi0JCQlnZXRSb2xlcygpLmNvbnRhaW5zQWxsKGFub3RoZXJNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmNoZWNrZWQoKSB7Ci0JCXJldHVybiB1bmNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5jaGVja2VkKGJvb2xlYW4gbmV3VW5jaGVja2VkKSB7Ci0JCWJvb2xlYW4gb2xkVW5jaGVja2VkID0gdW5jaGVja2VkOwotCQl1bmNoZWNrZWQgPSBuZXdVbmNoZWNrZWQ7Ci0JCWJvb2xlYW4gb2xkVW5jaGVja2VkRVNldCA9IHVuY2hlY2tlZEVTZXQ7Ci0JCXVuY2hlY2tlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG9sZFVuY2hlY2tlZCwgdW5jaGVja2VkLCAhb2xkVW5jaGVja2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VW5jaGVja2VkKCkgewotCQlib29sZWFuIG9sZFVuY2hlY2tlZCA9IHVuY2hlY2tlZDsKLQkJYm9vbGVhbiBvbGRVbmNoZWNrZWRFU2V0ID0gdW5jaGVja2VkRVNldDsKLQkJdW5jaGVja2VkID0gVU5DSEVDS0VEX0VERUZBVUxUOwotCQl1bmNoZWNrZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBvbGRVbmNoZWNrZWQsIFVOQ0hFQ0tFRF9FREVGQVVMVCwgb2xkVW5jaGVja2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VW5jaGVja2VkKCkgewotCQlyZXR1cm4gdW5jaGVja2VkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXNzZW1ibHlEZXNjcmlwdG9yKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SICYmIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SLCBuZXdBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlcygpIHsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCXJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCkgewotCQlpZiAobWV0aG9kRWxlbWVudHMgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kRWxlbWVudC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcigoQXNzZW1ibHlEZXNjcmlwdG9yKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gaXNVbmNoZWNrZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0Um9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXNldFVuY2hlY2tlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJdW5zZXRVbmNoZWNrZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFUzoKLQkJCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0VW5jaGVja2VkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTOgotCQkJCXJldHVybiByb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gbWV0aG9kRWxlbWVudHMgIT0gbnVsbCAmJiAhbWV0aG9kRWxlbWVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bmNoZWNrZWQ6ICIpOwotCQlpZiAodW5jaGVja2VkRVNldCkgcmVzdWx0LmFwcGVuZCh1bmNoZWNrZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHJhbnNhY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlOGU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLQotLyoqCi0gKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFRyYW5zYWN0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFRyYW5zYWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBUUkFOU0FDVElPTl9BVFRSSUJVVEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSB0cmFuc2FjdGlvbkF0dHJpYnV0ZSA9IFRSQU5TQUNUSU9OX0FUVFJJQlVURV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZEVsZW1lbnRzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1RSQU5TQUNUSU9OOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5ncyBmb3IgYWxsIHRoZSBFRW51bUxpdGVyYWwgdmFsdWVzCi0gKiBmb3IgdGhlIHRyYW5zYWN0aW9uQXR0cmlidXRlIGVudW1lcmF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVRyYW5zYWN0aW9uQXR0cmlidXRlTmFtZXMoKSB7Ci0JTGlzdCBsID0gZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2wuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGwuc2l6ZSgpOyBpKyspCi0JCW5hbWVzW2ldID0gKChFRW51bUxpdGVyYWwpbC5nZXQoaSkpLnRvU3RyaW5nKCk7Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIHRoZSBhbGwgdGhlIEVFbnVtTGl0ZXJhbCB2YWx1ZXMKLSAqIGZvciB0aGUgdHJhbnNhY3Rpb25BdHRyaWJ1dGUgZW51bWVyYXRpb24uCi0gKiBUaGUgdG9TdHJpbmcoKSBtZXRob2QgZm9yIGEgRUVudW1MaXRlcmFsIHdpbGwgZGlzcGxheQotICogdGhlIFN0cmluZyB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uIHZhbHVlLgotICovCi1wdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCkgewotCUVqYlBhY2thZ2UgcGFjayA9IChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0JcmV0dXJuIHBhY2suZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkuZ2V0RUxpdGVyYWxzKCk7Ci19Ci1wdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgZWxlbWVudHMgPSBnZXRNZXRob2RFbGVtZW50cygpOwotCU1ldGhvZEVsZW1lbnQgbWU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKyl7Ci0JCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJaWYgKG1lLmdldEVudGVycHJpc2VCZWFuKCkgIT0gbnVsbCAmJiBtZS5nZXRFbnRlcnByaXNlQmVhbigpLmVxdWFscyhhbkVKQikpCi0JCQlyZXN1bHQuYWRkKG1lKTsJCQkKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoTWV0aG9kIGFNZXRob2QpIHsKLSAgIHJldHVybiBNZXRob2RFbGVtZW50SW1wbC5nZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KGdldE1ldGhvZEVsZW1lbnRzKCksIGFNZXRob2QpOwotfQotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFRyYW5zYWN0aW9uIGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbikgewotCXJldHVybiBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpID09IGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0ID0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgdHJhbnNhY3Rpb25BdHRyaWJ1dGUsICFvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQ7Ci0JCXRyYW5zYWN0aW9uQXR0cmlidXRlID0gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXNzZW1ibHlEZXNjcmlwdG9yKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IgJiYgbmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RFbGVtZW50LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3Ipb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgotCQkJCXNldFRyYW5zYWN0aW9uQXR0cmlidXRlKChUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURToKLQkJCQl1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBnZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBtZXRob2RFbGVtZW50cyAhPSBudWxsICYmICFtZXRob2RFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25BdHRyaWJ1dGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uQXR0cmlidXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGEzZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBrZXlBdHRyaWJ1dGVzIGZyb20gdGhlCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIKLSAqIG1ldGhvZC4gSXQgd2lsbCByZW1vdmUgYW55IGtleUF0dHJpYnV0ZXMgdGhhdCBhcmUgaGVsZCBieSBFamJSZWxhdGlvbnNoaXBSb2xlCi0gKiBvYmplY3RzIChpbmNsdWRpbmcgaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGUgYXR0cmlidXRlcykuIFRoYXQgbWVhbnMgdGhlCi0gKiByZXR1cm5lZCBsaXN0IG9mIENNUEF0dHJpYnV0ZXMgd2lsbCBiZSBrZXkgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZAotICogbG9jYWxseSBhbmQgYWxsIGluaGVyaXRlZCBrZXkgYXR0cmlidXRlcyBtaW51cyBhbnkga2V5IGF0dHJpYnV0ZXMgcG9pbnRlZCB0bwotICogYnkgRWpiUmVsYXRpb25zaGlwUm9sZXMsIHRodXMgdGhlIGtleSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZSBrZXkgYXR0cmlidXRlcwotICogdGhhdCB3ZXJlIGRlZmluZWQgYnkgdGhlIHVzZXIuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDg6MDk6MTAgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LiBSZXR1cm4gYWxsIGF0dHJpYnV0ZXMKLQkgKiBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJTGlzdCBhbGwsIGxvY2FsUm9sZUtleUF0dHJpYnV0ZXM7Ci0JCWFsbCA9IG5ldyBBcnJheUxpc3QoY21wLmdldEtleUF0dHJpYnV0ZXMoKSk7Ci0JCWxvY2FsUm9sZUtleUF0dHJpYnV0ZXMgPSBjbXAKLQkJCQkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0JCQkJCQkuc2luZ2xldG9uKCkpOwotCQlmaWx0ZXJSb2xlQXR0cmlidXRlc0J5TmFtZShhbGwsIGxvY2FsUm9sZUtleUF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gYWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMAotCSAqIFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Nb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIoKTsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQzOGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGZyb20gdGhlCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIKLSAqIG1ldGhvZC4gSXQgd2lsbCByZW1vdmUgYW55IHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGhlbGQgYnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0cyAoaW5jbHVkaW5nIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlCi0gKiBhdHRyaWJ1dGVzKS4gVGhhdCBtZWFucyB0aGUgcmV0dXJuZWQgbGlzdCBvZiBDTVBBdHRyaWJ1dGVzIHdpbGwgYmUgYXR0cmlidXRlcwotICogdGhhdCB3ZXJlIGRlZmluZWQgbG9jYWxseSBhbmQgYWxsIGluaGVyaXRlZCBhdHRyaWJ1dGVzIG1pbnVzIGFueSBhdHRyaWJ1dGVzCi0gKiBwb2ludGVkIHRvIGJ5IEVqYlJlbGF0aW9uc2hpcFJvbGVzLCB0aHVzIHRoZSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZQotICogYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBieSB0aGUgdXNlci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LiBSZXR1cm4gYWxsIGF0dHJpYnV0ZXMKLQkgKiBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJTGlzdCBhbGwsIHJvbGVBdHRyaWJ1dGVzOwotCQlhbGwgPSBuZXcgQXJyYXlMaXN0KGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQkJcm9sZUF0dHJpYnV0ZXMgPSBjbXAKLQkJCQkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0JCQkJCQkuc2luZ2xldG9uKCkpOwotCQlmaWx0ZXJSb2xlQXR0cmlidXRlc0J5TmFtZShhbGwsIHJvbGVBdHRyaWJ1dGVzKTsKLQkJcmV0dXJuIGFsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2YzAyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotcHVibGljIGNsYXNzIE5vbktleVJlcXVpcmVkUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyIHNpbmdsZXRvbjsKLQotICAgIHByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLSAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmICghcm9sZS5pc0tleSgpICYmIHJvbGUuaXNSZXF1aXJlZCgpKSByb2xlcy5hZGQocm9sZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOb25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIgc2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHNpbmdsZXRvbiA9IG5ldyBOb25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA2OGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nOwotCi0vKioKLSAqIFRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeQotICogaXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBRdWVyeSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlFMKCkgPGVtPkVqYiBRTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUUwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9RTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlFMID0gRUpCX1FMX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5UeXBlTWFwcGluZygpIDxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZyBSRVRVUk5fVFlQRV9NQVBQSU5HX0VERUZBVUxUID0gUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUxfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSZXR1cm5UeXBlTWFwcGluZyByZXR1cm5UeXBlTWFwcGluZyA9IFJFVFVSTl9UWVBFX01BUFBJTkdfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXR1cm4gVHlwZSBNYXBwaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBRdWVyeU1ldGhvZCBxdWVyeU1ldGhvZCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFF1ZXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlFVRVJZOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSB7Ci0JLy8gb3ZlcnJpZGUgYnVnIGluIHRoZSBtb2RlbCB3aGljaCBtYWRlIFJlbW90ZSB0aGUgZGVmYXVsdAotCXJldHVybiBnZXRSZXR1cm5UeXBlTWFwcGluZygpLmdldFZhbHVlKCkgPT0gUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUw7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVJlc3VsdE1hcHBpbmcoKSB7Ci0JcmV0dXJuIGdldFJldHVyblR5cGVNYXBwaW5nKCkuZ2V0VmFsdWUoKSA9PSBSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcXVlcnkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcyBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHF1ZXJ5IGVsZW1lbnQgd2hvc2UgY29udGVudHMgc3BlY2lmeSB0aGUgZmluZGVyIG9yIHRoZSBzZWxlY3QgbWV0aG9kIHRoYXQgdXNlcyB0aGUgcXVlcnkuIFRoZSBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuIFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gb3IgZGVwZW5kZW50IG9iamVjdCBjbGFzcyBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4KLQkgKiBAaW52YXJpYW50IFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogPHF1ZXJ5PgotCSAqIDxxdWVyeS1tZXRob2Q+Ci0JICogPG1ldGhvZC1uYW1lPmVqYlNlbGVjdFBlbmRpbmdMaW5laXRlbXM8Ly9tZXRob2QtbmFtZT4KLQkgKiA8bWV0aG9kLXBhcmFtcy8vPgotCSAqIDwvL3F1ZXJ5LW1ldGhvZD4KLQkgKiA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobCkKLQkgKiBGUk9NIExpbmVJdGVtcyBsCi0JICogV0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFCi0JICogPC8vZWpiLXFsPgotCSAqIDwvL3F1ZXJ5PgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiUUwoKSB7Ci0JCXJldHVybiBlamJRTDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJRTChTdHJpbmcgbmV3RWpiUUwpIHsKLQkJU3RyaW5nIG9sZEVqYlFMID0gZWpiUUw7Ci0JCWVqYlFMID0gbmV3RWpiUUw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTCwgb2xkRWpiUUwsIGVqYlFMKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuCi0JICovCi0JcHVibGljIFJldHVyblR5cGVNYXBwaW5nIGdldFJldHVyblR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gcmV0dXJuVHlwZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcgbmV3UmV0dXJuVHlwZU1hcHBpbmcpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgb2xkUmV0dXJuVHlwZU1hcHBpbmcgPSByZXR1cm5UeXBlTWFwcGluZzsKLQkJcmV0dXJuVHlwZU1hcHBpbmcgPSBuZXdSZXR1cm5UeXBlTWFwcGluZyA9PSBudWxsID8gUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVCA6IG5ld1JldHVyblR5cGVNYXBwaW5nOwotCQlib29sZWFuIG9sZFJldHVyblR5cGVNYXBwaW5nRVNldCA9IHJldHVyblR5cGVNYXBwaW5nRVNldDsKLQkJcmV0dXJuVHlwZU1hcHBpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORywgb2xkUmV0dXJuVHlwZU1hcHBpbmcsIHJldHVyblR5cGVNYXBwaW5nLCAhb2xkUmV0dXJuVHlwZU1hcHBpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgb2xkUmV0dXJuVHlwZU1hcHBpbmcgPSByZXR1cm5UeXBlTWFwcGluZzsKLQkJYm9vbGVhbiBvbGRSZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSByZXR1cm5UeXBlTWFwcGluZ0VTZXQ7Ci0JCXJldHVyblR5cGVNYXBwaW5nID0gUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVDsKLQkJcmV0dXJuVHlwZU1hcHBpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORywgb2xkUmV0dXJuVHlwZU1hcHBpbmcsIFJFVFVSTl9UWVBFX01BUFBJTkdfRURFRkFVTFQsIG9sZFJldHVyblR5cGVNYXBwaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiByZXR1cm5UeXBlTWFwcGluZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIChEQi8vU1IvL0NNLSJvbiB0aGUgaG9tZSIpIGZvciBhIGZpbmRlciBvcgotCSAqIHNlbGVjdCBxdWVyeS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICogbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbgotCSAqIHRoZSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLgotCSAqIAotCSAqIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICogbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCSAqIAotCSAqIFVzZWQgaW46IHF1ZXJ5Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIDxxdWVyeT4KLQkgKiAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC8vZGVzY3JpcHRpb24+Ci0JICogICA8cXVlcnktbWV0aG9kPgotCSAqICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC8vbWV0aG9kLW5hbWU+Ci0JICogICAgIDxtZXRob2QtcGFyYW1zPjwvL21ldGhvZC1wYXJhbXM+Ci0JICogICA8Ly9xdWVyeS1tZXRob2Q+Ci0JICogICA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMDwvL2VqYi1xbD4KLQkgKiA8Ly9xdWVyeT4KLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2QgZ2V0UXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiBxdWVyeU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlRdWVyeU1ldGhvZCBvbGRRdWVyeU1ldGhvZCA9IHF1ZXJ5TWV0aG9kOwotCQlxdWVyeU1ldGhvZCA9IG5ld1F1ZXJ5TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG9sZFF1ZXJ5TWV0aG9kLCBuZXdRdWVyeU1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QgbmV3UXVlcnlNZXRob2QpIHsKLQkJaWYgKG5ld1F1ZXJ5TWV0aG9kICE9IHF1ZXJ5TWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeU1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZLCBRdWVyeU1ldGhvZC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3UXVlcnlNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgUXVlcnlNZXRob2QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UXVlcnlNZXRob2QobmV3UXVlcnlNZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBuZXdRdWVyeU1ldGhvZCwgbmV3UXVlcnlNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgbmV3RW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFbnRpdHksIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSAmJiBuZXdFbnRpdHkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFbnRpdHkpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbnRpdHkobmV3RW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSwgbmV3RW50aXR5LCBuZXdFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcXVlcnlNZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KChDb250YWluZXJNYW5hZ2VkRW50aXR5KW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlNZXRob2QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFk6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXJldHVybiBnZXRFamJRTCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBnZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FSkJfUUw6Ci0JCQkJc2V0RWpiUUwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXNldFJldHVyblR5cGVNYXBwaW5nKChSZXR1cm5UeXBlTWFwcGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJc2V0UXVlcnlNZXRob2QoKFF1ZXJ5TWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlzZXRFbnRpdHkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FSkJfUUw6Ci0JCQkJc2V0RWpiUUwoRUpCX1FMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFVFVSTl9UWVBFX01BUFBJTkc6Ci0JCQkJdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXNldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlzZXRFbnRpdHkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gRUpCX1FMX0VERUZBVUxUID09IG51bGwgPyBlamJRTCAhPSBudWxsIDogIUVKQl9RTF9FREVGQVVMVC5lcXVhbHMoZWpiUUwpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBpc1NldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlyZXR1cm4gcXVlcnlNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCXJldHVybiBnZXRFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamJRTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWpiUUwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldHVyblR5cGVNYXBwaW5nOiAiKTsKLQkJaWYgKHJldHVyblR5cGVNYXBwaW5nRVNldCkgcmVzdWx0LmFwcGVuZChyZXR1cm5UeXBlTWFwcGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODIxNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBRdWVyeU1ldGhvZCB7Ci0KLQlwdWJsaWMgUXVlcnlNZXRob2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUVVFUllfTUVUSE9EOwotCX0KLQotLyoqCi0gKiBGb3IgUXVlcnkgbWV0aG9kcywgdGhlaXIgZW50ZXJwcmlzZSBiZWFuIG11c3QgYmUgZGVyaXZlZC4KLSAqIEl0IGlzIHRoZSBFbnRpdHkgd2hpY2ggY29udGFpbnMgdGhlIFF1ZXJ5LgotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0JaWYgKGVudGVycHJpc2VCZWFuID09IG51bGwpIHsKLQkJaWYgKGdldFF1ZXJ5KCkgIT0gbnVsbCkKLQkJCWVudGVycHJpc2VCZWFuID0gZ2V0UXVlcnkoKS5nZXRFbnRpdHkoKTsKLQl9Ci0JcmV0dXJuIGVudGVycHJpc2VCZWFuOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzIGluIHRoZSBIT01FIElOVEVSRkFDRS4KLSAqLwotcHJvdGVjdGVkIE1ldGhvZCBnZXRIb21lTWV0aG9kKCkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRFbnRlcnByaXNlQmVhbigpLmdldEhvbWVJbnRlcmZhY2UoKTsKLQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXROYW1lKCkudHJpbSgpOwotCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobWV0aG9kTmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCQllbHNlIHsKLQkJCUxpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChtZXRob2ROYW1lKTsKLQkJCWlmICghbWV0aG9kcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0ID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGVsZW1lbnQgYXBwbGllcyBpbiB0aGUgTE9DQUwgSE9NRSBJTlRFUkZBQ0UuCi0gKi8KLXByb3RlY3RlZCBNZXRob2QgZ2V0TG9jYWxIb21lTWV0aG9kKCkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRFbnRlcnByaXNlQmVhbigpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldE5hbWUoKS50cmltKCk7Ci0JCWlmIChoYXNNZXRob2RQYXJhbXMoKSkKLQkJCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBnZXRNZXRob2RQYXJhbXMoKSk7Ci0JCWVsc2UgewotCQkJTGlzdCBtZXRob2RzID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKG1ldGhvZE5hbWUpOwotCQkJaWYgKCFtZXRob2RzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQgPSAoTWV0aG9kKSBtZXRob2RzLmdldCgwKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLQotcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kSWZOb3ROdWxsKExpc3QgYUxpc3QsIE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkKLQkJYUxpc3QuYWRkKGFNZXRob2QpOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHplcm8tbGVuZ3RoIE1ldGhvZFtdIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIG1ldGhvZAotICogb24gdGhlIGhvbWUsIGxvY2FsIGhvbWUsIG9yIGJlYW4gY2xhc3MuICBJdCB3aWxsIHJldHVybiBleGFjdGx5IG9uZSBtZXRob2QKLSAqIGZvciBlamJTZWxlY3QsIGFuZCBvbmUgb3IgdHdvIG1ldGhvZHMgZm9yIGZpbmRlcnMuICBUaGUgdHdvIG1ldGhvZCBjYXNlIG9jY3VycwotICogd2hlbiB0aGUgc2FtZSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgZXhpc3RzIG9uIGJvdGggdGhlIGhvbWUgYW5kCi0gKiBsb2NhbCBob21lLgotICovCi1wdWJsaWMgTWV0aG9kW10gZ2V0TWV0aG9kcygpIHsKLQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JaWYgKGdldE5hbWUoKS5zdGFydHNXaXRoKCJlamJTZWxlY3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCWFkZE1ldGhvZElmTm90TnVsbChyZXN1bHQsIGdldFNlbGVjdE1ldGhvZCgpKTsKLQl9IGVsc2UgewotCQlhZGRNZXRob2RJZk5vdE51bGwocmVzdWx0LCBnZXRIb21lTWV0aG9kKCkpOwotCQlhZGRNZXRob2RJZk5vdE51bGwocmVzdWx0LCBnZXRMb2NhbEhvbWVNZXRob2QoKSk7Ci0JfQotCXJldHVybiAoTWV0aG9kW10pcmVzdWx0LnRvQXJyYXkobmV3IE1ldGhvZFtyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgbWV0aG9kIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMgaW4gdGhlIEhPTUUgSU5URVJGQUNFLgotICovCi1wcm90ZWN0ZWQgTWV0aG9kIGdldFNlbGVjdE1ldGhvZCgpIHsKLQlNZXRob2QgcmVzdWx0ID0gbnVsbDsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpOwotCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0TmFtZSgpLnRyaW0oKTsKLQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RFeHRlbmRlZChuYW1lLCBnZXRNZXRob2RQYXJhbXMoKSk7Ci0JZWxzZSB7Ci0JCUxpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChtZXRob2ROYW1lKTsKLQkJaWYgKCFtZXRob2RzLmlzRW1wdHkoKSkKLQkJCXJlc3VsdCA9IChNZXRob2QpIG1ldGhvZHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlkpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFF1ZXJ5KWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeShRdWVyeSBuZXdRdWVyeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnksIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFF1ZXJ5IG5ld1F1ZXJ5KSB7Ci0JCWlmIChuZXdRdWVyeSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlkgJiYgbmV3UXVlcnkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdRdWVyeSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1F1ZXJ5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1F1ZXJ5KS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIFF1ZXJ5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5KG5ld1F1ZXJ5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbmV3UXVlcnksIG5ld1F1ZXJ5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5KChRdWVyeSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIFF1ZXJ5LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChRdWVyeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChRdWVyeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBnZXRRdWVyeSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFlvdSBzaG91bGQgdXNlIGdldENsaWVudFR5cGVKYXZhQ2xhc3NlcyB0byBlbnN1cmUgeW91IHBpY2sgdXAgYm90aCBob21lIGludGVyZmFjZXMKLQkgKiBpZiB0aGV5IGV4aXN0LgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VHlwZUphdmFDbGFzcygpIHsKLQkJSmF2YUNsYXNzW10gcmVzdWx0ID0gZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkKLQkJCXJldHVybiByZXN1bHRbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgSmF2YUNsYXNzZXMgb2YgYWxsIHRoZSBpbnRlcmZhY2VzIG9yIGJlYW4gY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBwcmVzZW50ZWQKLQkgKiB0byBhIGNsaWVudC4gIElmIGl0IGlzIGFuIGVqYlNlbGVjdC4uLiBvbiB0aGUgYmVhbiBjbGFzcyB3aWxsIGJlIHJldHVybmVkIGFuZCBpZgotCSAqIGl0IGlmIGEgZmluZCBib3RoIGhvbWUgaW50ZXJmYWNlcyB3aWxsIGJlIHJldHVybmVkIGlmIHRoZXkgZXhpc3QuCi0JICogCi0JICogTWF5IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NbXSBnZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCB8fCBnZXRFbnRlcnByaXNlQmVhbigpID09IG51bGwpIHJldHVybiBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBlamIgPSBnZXRFbnRlcnByaXNlQmVhbigpOwotCQlpZiAoZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoU0VMRUNUX1BSRUZJWCkpCi0JCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2VqYi5nZXRFamJDbGFzcygpfTsKLQkJLy9OZXh0IGNhc2UgaXMgdG91Z2hlciBzaW5jZSB5b3UgY291bGQgaGF2ZSBib3RoIGEgcmVtb3ZlIGFuZCBsb2NhbCBjbGllbnQKLQkJLy9XZSB3YW50IHRvIHJldHVybiB0aGUgaG9tZSBpbnRlcmZhY2UgaW4gdGhpcyBjYXNlLgotCQlpZiAoZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRklORF9QUkVGSVgpKSB7Ci0JCQlpZiAoZWpiLmhhc0xvY2FsQ2xpZW50KCkgJiYgIWVqYi5oYXNSZW1vdGVDbGllbnQoKSkKLQkJCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2dldEVudGVycHJpc2VCZWFuKCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCl9OwotCQkJaWYgKGVqYi5oYXNSZW1vdGVDbGllbnQoKSAmJiAhZWpiLmhhc0xvY2FsQ2xpZW50KCkpCi0JCQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NbXXtlamIuZ2V0SG9tZUludGVyZmFjZSgpfTsKLQkJCWlmIChlamIuaGFzUmVtb3RlQ2xpZW50KCkgJiYgZWpiLmhhc0xvY2FsQ2xpZW50KCkpCi0JCQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NbXXtlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCksIGVqYi5nZXRIb21lSW50ZXJmYWNlKCl9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZiODRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzICh0aGlzIGluY2x1ZGVzIGluaGVyaXRlZCAKLSAqIGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBwb2ludGVkIHRvIGJ5IGFuIEVqYlJlbGF0aW9uc2hpcFJvbGUuCi0gKiBUaHVzLCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGNvbnRhaW4gYXR0cmlidXRlcyAoaW5jbHVkaW5nIGluaGVyaXRlZCBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDY6NDY6MDggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7IAotCSAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTVmM2I2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBUaGUgcmVsYXRpb25zaGlwcyBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwc0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBzIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVsYXRpb25zID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRUxBVElPTlNISVBTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNvbGxlY3Rpb24gb2YgcmVsYXRpb25zaGlwcy4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQkphcillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphciwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJaWYgKG5ld0VqYkphciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWpiSmFyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgRUpCSmFyLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVqYkphcihuZXdFamJKYXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBuZXdFamJKYXIsIG5ld0VqYkphcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkCi0JICogcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWpiUmVsYXRpb25zKCkgewotCQlpZiAoZWpiUmVsYXRpb25zID09IG51bGwpIHsKLQkJCWVqYlJlbGF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEVKQlJlbGF0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlbGF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcigoRUpCSmFyKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RWpiSmFyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWxhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1QsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiBnZXRFamJSZWxhdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCWdldEVqYlJlbGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVsYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuIGVqYlJlbGF0aW9ucyAhPSBudWxsICYmICFlamJSZWxhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3Y2I5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzE1LzIwMDEgMTE6MzU6MDAgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0Um9sZXNUb0ZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXIgPSBnZXRFamJNb2R1bGVFeHRIZWxwZXIoY21wKTsKLQlpZihtb2RIZWxwZXIgIT0gbnVsbCkKLQkgIHJldHVybiBtb2RIZWxwZXIuZ2V0TG9jYWxSZWxhdGlvbnNoaXBSb2xlc19jbXAxMShjbXApOwotCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC82LzIwMDEgMTE6Mjc6MjUgQU0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIKLSAqLwotcHVibGljIHN0YXRpYyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNlODIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQocm9sZSkpIHJvbGVzLmFkZChyb2xlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9sZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIG11bHRpcGxpY2l0eSBmb3IgQGFSb2xlIGlzIHJlcXVpcmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEZpbHRlcmVkUmVzdWx0KENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLSAgICAgICAgcmV0dXJuIGFSb2xlLmlzUmVxdWlyZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzYvMjAwMSAxMToyNzoyNQotICAgICAqIEFNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkgc2luZ2xldG9uID0gbmV3IFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTaGFwZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Sb2xlU2hhcGVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk1YzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTaGFwZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuSVJvbGVTaGFwZVN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS82LzIwMDAgMTE6NDE6MzMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSb2xlU2hhcGVTdHJhdGVneSBpbXBsZW1lbnRzIElSb2xlU2hhcGVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYnVzeSA9IGZhbHNlOwotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCB2aXNpdGVkS2V5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotLyoqCi0gKiBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCXN1cGVyKCk7Ci0Jc2V0Um9sZShhUm9sZSk7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIGFwcGVuZE5hbWUoU3RyaW5nIGZ1bGxOYW1lLCBTdHJpbmcgYWRkaXRpb25hbE5hbWUpIHsKLQlyZXR1cm4gZnVsbE5hbWUgKyBBVFRSSUJVVEVfTkFNRV9KT0lORVIgKyBhZGRpdGlvbmFsTmFtZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewotCXJldHVybiAhYnVzeSAmJiByb2xlLmlzRm9yd2FyZCgpICYmIHJvbGUuZ2V0TmFtZSgpICE9IG51bGw7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db21wdXRlTmFtZXMoKSB7Ci0JLy9yZXR1cm4gZ2V0Um9sZSgpLmdldE9wcG9zaXRlKCkgIT0gbnVsbDsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQlyZXR1cm4gcm9sZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotCi1wdWJsaWMgYm9vbGVhbiBpc0ZsYXQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUm91bmQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogQ3JlYXRlcyBhbiBhcHBlbmRlZCBuYW1lIHdoaWxlIHVwcGVyY2FzaW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHNlY29uZE5hbWUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VKYXZhTmFtZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgc2Vjb25kTmFtZSkgewotCVN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdE5hbWUpOwotCW5hbWVCdWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzZWNvbmROYW1lLmNoYXJBdCgwKSkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgc2Vjb25kTmFtZS5sZW5ndGgoKTsgaSsrKQotCQluYW1lQnVmZmVyLmFwcGVuZChzZWNvbmROYW1lLmNoYXJBdChpKSk7Ci0JcmV0dXJuIG5hbWVCdWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoTGlzdCByb2xlQXR0cmlidXRlcykgewotCWlmIChjYW5Db250aW51ZSgpKSB7Ci0JCWJ1c3kgPSB0cnVlOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGdldFJvbGUoKS5nZXROYW1lKCk7Ci0JCUxpc3QgY29tcHV0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNhbkNvbXB1dGVOYW1lcygpKXsKLQkJCXZpc2l0ZWRLZXlUeXBlcy5jbGVhcigpOwotCQkJcmVjb25jaWxlQXR0cmlidXRlcyhnZXRSb2xlKCksIGF0dHJpYnV0ZU5hbWUsIHJvbGVBdHRyaWJ1dGVzLCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCQlyZW1vdmVFeHRyYUF0dHJpYnV0ZXMoY29tcHV0ZWROYW1lcyk7Ci0JCWJ1c3kgPSBmYWxzZTsKLQl9Ci19Ci0vKioKLSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKTsKLS8qKgotICogUmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSBvdXIgcm9sZSB3aG9zZSBuYW1lIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YKLSAqIEBjb21wdXRlZE5hbWVzLiAgQWxzbywgcmVtb3ZlIGZyb20gdGhlIHJvbGUncyBzb3VyY2UgRUpCLgotICovCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHRyYUF0dHJpYnV0ZXMoTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JaWYgKCFnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLmlzRW1wdHkoKSkgewotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gZ2V0Um9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tcHV0ZWROYW1lcy5jb250YWlucyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCWl0LnJlbW92ZSgpOwotCQkJY21wLmdldEtleUF0dHJpYnV0ZXMoKS5yZW1vdmUoYXR0cmlidXRlKTsKLQkJCWNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLnJlbW92ZShhdHRyaWJ1dGUpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMTYvMDAgOToxOToyNyBQTSkKLSAqIEBwYXJhbSBuZXdSb2xlIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LkVqYlJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIHZvaWQgc2V0Um9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQlyb2xlID0gbmV3Um9sZTsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGVlYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLQotLyoqCi0gKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0gKiBAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNvdXJjZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSb2xlU291cmNlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUm9sZVNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5ST0xFX1NPVVJDRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUpCUmVsYXRpb25zaGlwUm9sZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEUsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgbmV3Um9sZSkgewotCQlpZiAobmV3Um9sZSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSb2xlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Um9sZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb2xlKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvbGUobmV3Um9sZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFLCBuZXdSb2xlLCBuZXdSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0RW50aXR5QmVhbigpIHsKLQkJaWYgKGVudGl0eUJlYW4gIT0gbnVsbCAmJiBlbnRpdHlCZWFuLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbnRpdHlCZWFuID0gKEludGVybmFsRU9iamVjdCllbnRpdHlCZWFuOwotCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWVSZXNvbHZlUHJveHkob2xkRW50aXR5QmVhbik7Ci0JCQlpZiAoZW50aXR5QmVhbiAhPSBvbGRFbnRpdHlCZWFuKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4sIG9sZEVudGl0eUJlYW4sIGVudGl0eUJlYW4pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5QmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiYXNpY0dldEVudGl0eUJlYW4oKSB7Ci0JCXJldHVybiBlbnRpdHlCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUJlYW4oQ29udGFpbmVyTWFuYWdlZEVudGl0eSBuZXdFbnRpdHlCZWFuKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2xkRW50aXR5QmVhbiA9IGVudGl0eUJlYW47Ci0JCWVudGl0eUJlYW4gPSBuZXdFbnRpdHlCZWFuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTiwgb2xkRW50aXR5QmVhbiwgZW50aXR5QmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXJldHVybiBiYXNpY1NldFJvbGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVudGl0eUJlYW4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXNldFJvbGUoKEVKQlJlbGF0aW9uc2hpcFJvbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU46Ci0JCQkJc2V0RW50aXR5QmVhbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0VOVElUWV9CRUFOOgotCQkJCXNldEVudGl0eUJlYW4oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlyZXR1cm4gZW50aXR5QmVhbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWNlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBUaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZAotICogdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBTZXNzaW9uLCBFbnRlcnByaXNlQmVhbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblR5cGUoKSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTRVNTSU9OX1RZUEVfRURFRkFVTFQgPSBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25UeXBlIHNlc3Npb25UeXBlID0gU0VTU0lPTl9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2Vzc2lvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50ID0gbnVsbDsKLQotCXB1YmxpYyBTZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlNFU1NJT047Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZXNzaW9uVHlwZSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIG5ld1Nlc3Npb25UeXBlKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCXNlc3Npb25UeXBlID0gbmV3U2Vzc2lvblR5cGUgPT0gbnVsbCA/IFNFU1NJT05fVFlQRV9FREVGQVVMVCA6IG5ld1Nlc3Npb25UeXBlOwotCQlib29sZWFuIG9sZFNlc3Npb25UeXBlRVNldCA9IHNlc3Npb25UeXBlRVNldDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBzZXNzaW9uVHlwZSwgIW9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblR5cGVFU2V0ID0gc2Vzc2lvblR5cGVFU2V0OwotCQlzZXNzaW9uVHlwZSA9IFNFU1NJT05fVFlQRV9FREVGQVVMVDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBTRVNTSU9OX1RZUEVfRURFRkFVTFQsIG9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2Vzc2lvblR5cGUoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZpY2VFbmRwb2ludCA9IChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50OwotCQkJc2VydmljZUVuZHBvaW50ID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFNlcnZpY2VFbmRwb2ludCk7Ci0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG9sZFNlcnZpY2VFbmRwb2ludCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KEphdmFDbGFzcyBuZXdTZXJ2aWNlRW5kcG9pbnQpIHsKLQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsKLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQsIG9sZFNlcnZpY2VFbmRwb2ludCwgc2VydmljZUVuZHBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VTU0lPTl9UWVBFOgotCQkJCXNldFNlc3Npb25UeXBlKChTZXNzaW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQ6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50KChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEU6Ci0JCQkJdW5zZXRTZXNzaW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VTU0lPTl9UWVBFOgotCQkJCXJldHVybiBpc1NldFNlc3Npb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0cmFuc2FjdGlvblR5cGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uVHlwZTogIik7Ci0JCWlmIChzZXNzaW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoc2Vzc2lvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLlNlc3Npb24jc2V0U2VydmljZUVuZHBvaW50TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludE5hbWUoU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUpIHsKLSAgICAgICAgZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpLCBjcmVhdGVDbGFzc1JlZihzZXJ2aWNlRW5kcG9pbnROYW1lKSk7Ci0gICAgfQotCS8qCi0JICogQHNlZSBFbnRlcnByaXNlQmVhbiNoYXNMb2NhbENsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmljZUVuZHBvaW50KCkgewotCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkgewotCQlnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludCA9PSBudWxsID8gbnVsbCA6IHNlcnZpY2VFbmRwb2ludC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1N1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTIzNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0vKioKLSAqIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci0KLXByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJ0eXBlID0gbnVsbDsKLQlFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5zaW9uSGVscGVyID0gZ2V0RWpiTW9kdWxlRXh0SGVscGVyKGNtcCk7Ci0JaWYoZXh0ZW5zaW9uSGVscGVyICE9IG51bGwpCi0JICAgc3VwZXJ0eXBlID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpZXh0ZW5zaW9uSGVscGVyLmdldFN1cGVyVHlwZShjbXApOwotCWlmIChzdXBlcnR5cGUgPT0gbnVsbCkKLQkJcmV0dXJuIGdldFNvdXJjZUF0dHJpYnV0ZXMoY21wKTsKLQlyZXR1cm4gZmlsdGVyVXNpbmdTdXBlcnR5cGUoY21wLCBzdXBlcnR5cGUpOwotfQotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXByb3RlY3RlZCBMaXN0IGZpbHRlclVzaW5nU3VwZXJ0eXBlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVydHlwZSkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHkgPSBzdXBlcnR5cGU7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQlpZiAoIWlzU3VwZXJ0eXBlQXR0cmlidXRlKHN1cGVyRW50aXR5LCBhdHRyaWJ1dGUpKQotCQkJcmVzdWx0LmFkZChhdHRyaWJ1dGUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIDsKLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW5BdHRyaWJ1dGUgYWxzbyBleGlzdHMgaW4gdGhlIHN1cGVyRW50aXR5LgotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QRmllbGREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBGaWVsZERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2ZDA2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBGaWVsZERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEEgcGFyYW1ldGVyIGRlc2NyaXB0b3IgaXMgdXNlZCB0byBkZXNjcmliZSBhIG1ldGhvZCBwYXJhbWV0ZXIuCi0gKiBJdCBob2xkcyB0aGUgcGFyYW1ldGVyIG5hbWUgYW5kIHR5cGUuICBUaGUgdHlwZSBpcyBoZWxkIGluCi0gKiBKYXZhIHJlYWRhYmxlIGZvcm0gKG5vdCBhIHNpZ25hdHVyZSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBGaWVsZERlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0vKioKLSAqIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBDTVBGaWVsZERlc2NyaXB0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWUuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQlyZXR1cm4gZk5hbWU7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlLgotICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHR5cGUgaW4gSmF2YSByZWFkYWJsZSBmb3JtIChub3QgYSBzaWduYXR1cmUpCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQlyZXR1cm4gZlR5cGU7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHBhcmFtZXRlciBuYW1lLgotICovCi1wdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JZk5hbWUgPSAobmV3TmFtZSA9PSBudWxsKSA/IG51bGwgOiBuZXdOYW1lLnRyaW0oKTsKLX0KLS8qKgotICogU2V0cyB0aGUgcGFyYW1ldGVyIHR5cGUuCi0gKiBAcGFyYW0gbmV3VHlwZSBUaGUgcGFyYW1ldGVyIG5hbWUgaW4gSmF2YSByZWFkYWJsZSBmb3JtIChub3QgYSBzaWduYXR1cmUpCi0gKi8KLXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQlmVHlwZSA9IChuZXdUeXBlID09IG51bGwpID8gbnVsbCA6IG5ld1R5cGUudHJpbSgpOwotfQotLyoqCi0gKiBSZXR1cm5zICJ0eXBlIG5hbWUiLiAgVGhlIHtAbGluayBKYXZhUGFyYW1ldGVyRGVzY3JpcHRvciNnZXRUeXBlKCl9Ci0gKiBhbmQge0BsaW5rIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yI2dldE5hbWUoKX0gbWV0aG9kcyBhcmUgdXNlZAotICogdG8gYnVpbGQgdGhlIHJlc3VsdC4KLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0Jc2IuYXBwZW5kKGdldFR5cGUoKSk7Ci0Jc2IuYXBwZW5kKCcgJyk7Ci0Jc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzQ1YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQ01QSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wYXJhdG9yIG1ldGhvZENvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlNZXRob2QgbTEgPSAoTWV0aG9kKSBvMTsKLQkJCU1ldGhvZCBtMiA9IChNZXRob2QpIG8yOwotCQkJU3RyaW5nIHMxID0gbTEuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHMyID0gbTIuZ2V0TmFtZSgpOwotCQkJaWYgKHMxID09IG51bGwpCi0JCQkJcmV0dXJuICIiLmNvbXBhcmVUbyhzMik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzMS5jb21wYXJlVG8oczIpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENNUEZpZWxkRXhpc3RUZXN0ZXIgewotCQlib29sZWFuIGlzRXhpc3RpbmcoRmllbGQgYUZpZWxkKTsKLQkJYm9vbGVhbiBpc0V4aXN0aW5nKE1ldGhvZCBhTWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01QSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDIuMCBiZWFucywgdGhlIGJlYW4gY2xhc3MgaXMgYWJzdHJhY3QgYW5kCi0JICogY29udGFpbnMgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIGZvciB0aGUgZmllbGRzCi0JICogVGhpcyBpbmZlcnMgdGhlIHRob3NlIGZpZWxkcyBiYXNlZCBvbiB0aGUgZ2V0L3NldCBtZXRob2RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVAyMEZpZWxkRGVzY3JpcHRvcnMoSmF2YUNsYXNzIGJlYW5DbGFzcykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ01QMjBGaWVsZERlc2NyaXB0b3JzKGJlYW5DbGFzcywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEZvciBDTVAgMi4wIGJlYW5zLCB0aGUgYmVhbiBjbGFzcyBpcyBhYnN0cmFjdCBhbmQKLQkgKiBjb250YWlucyBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgZm9yIHRoZSBmaWVsZHMKLQkgKiBUaGlzIGluZmVycyB0aGUgdGhvc2UgZmllbGRzIGJhc2VkIG9uIHRoZSBnZXQvc2V0IG1ldGhvZHMKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhKYXZhQ2xhc3MgYmVhbkNsYXNzLCBDTVBIZWxwZXIuQ01QRmllbGRFeGlzdFRlc3RlciBmaWVsZFRlc3RlcikgewotCQlpZiAoYmVhbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBnZXR0ZXJzID0gbmV3IEhhc2hNYXAoKTsJCi0JCUxpc3QgbWV0aG9kcyA9IGJlYW5DbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RzLCBtZXRob2RDb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgYU1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKGlzR2V0dGVyKGFNZXRob2QpICYmIGFNZXRob2QuaXNBYnN0cmFjdCgpICYmICFhTWV0aG9kLmlzU3RhdGljKCkgJiYgCi0JCQkJKGZpZWxkVGVzdGVyID09IG51bGwgfHwgZmllbGRUZXN0ZXIuaXNFeGlzdGluZyhhTWV0aG9kKSkpIAotCQkJCWdldHRlcnMucHV0KGdldEZpZWxkTmFtZShhTWV0aG9kKSwgYU1ldGhvZCk7Ci0JCQllbHNlIGlmIChpc1NldHRlcihhTWV0aG9kKSAmJiBhTWV0aG9kLmlzQWJzdHJhY3QoKSAmJiAhYU1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShhTWV0aG9kKTsKLQkJCQlNZXRob2QgZ2V0dGVyID0gKE1ldGhvZCkgZ2V0dGVycy5nZXQoZmllbGROYW1lKTsKLQkJCQlpZiAodHlwZXNBZ3JlZShnZXR0ZXIsIGFNZXRob2QpKSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFJldHVyblR5cGVOYW1lKGdldHRlcik7Ci0JCQkJCWlmICh0eXBlTmFtZSAhPSBudWxsICYmIChmaWVsZFRlc3RlciA9PSBudWxsIHx8IGZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoZ2V0dGVyKSkpCi0JCQkJCQlyZXN1bHQuYWRkKGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihmaWVsZE5hbWUsIHR5cGVOYW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MsIENNUEhlbHBlci5DTVBGaWVsZEV4aXN0VGVzdGVyIGZpZWxkVGVzdGVyKSB7Ci0JCWlmIChiZWFuQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGZpZWxkcyA9IGJlYW5DbGFzcy5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGFGaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCWlmICghaXNQdWJsaWMoYUZpZWxkKSB8fCBhRmllbGQuaXNTdGF0aWMoKSB8fCBhRmllbGQuaXNUcmFuc2llbnQoKSB8fAotCQkJKGZpZWxkVGVzdGVyICE9IG51bGwgJiYgIWZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoYUZpZWxkKSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbmFtZSA9IGFGaWVsZC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShhRmllbGQpOwotCQkJaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQoY3JlYXRlRmllbGREZXNjcmlwdG9yKG5hbWUsIHR5cGVOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotCQotCS8qKgotCSAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNtcCBmaWVsZHMgZm9yIHRoZSBDTVAgYmVhbjsgaWYgdGhlIGJlYW4KLQkgKiBpcyB2MS4xLCB0aGlzIGlzIHRoZSBmaWVsZHMgb24gdGhlIGJlYW4gY2xhc3M7IGlmIGl0IGlzIDIuMCwgdGhpcyAKLQkgKiBpcyBkZWZpbmVkIGJ5IHRoZSBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgb24gdGhlIGJlYW4gY2xhc3MKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUEZpZWxkRGVzY3JpcHRvcnMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXBCZWFuKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKGNtcEJlYW4sIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjbXAgZmllbGRzIGZvciB0aGUgQ01QIGJlYW47IGlmIHRoZSBiZWFuCi0JICogaXMgdjEuMSwgdGhpcyBpcyB0aGUgZmllbGRzIG9uIHRoZSBiZWFuIGNsYXNzOyBpZiBpdCBpcyAyLjAsIHRoaXMgCi0JICogaXMgZGVmaW5lZCBieSB0aGUgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIG9uIHRoZSBiZWFuIGNsYXNzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wQmVhbiwgQ01QSGVscGVyLkNNUEZpZWxkRXhpc3RUZXN0ZXIgZmllbGRUZXN0ZXIpIHsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGNtcEJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYgKGJlYW5DbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXN3aXRjaChjbXBCZWFuLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCX0gIAotCX0KLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIHplcm8gYXJnCi0JICogbWV0aG9kLCB0aGF0IGRvZXMgbm90IHJldHVybiB2b2lkPwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0dldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoR0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoPT0wICYmCi0JCQkhYU1ldGhvZC5pc1ZvaWQoKTsJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIG9uZSBhcmcKLQkgKiBtZXRob2QsIHRoYXQgaXMgdm9pZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1NldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoU0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDEgJiYKLQkJCWFNZXRob2QuaXNWb2lkKCk7Ci0JfQotCQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKE1ldGhvZCBhTWV0aG9kKSB7Ci0JCWlmIChhTWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gZ2V0RmllbGROYW1lKGFNZXRob2QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWlmIChtZXRob2ROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRob2ROYW1lKTsKLQkJc2IuZGVsZXRlKDAsIDMpOwotCQljaGFyIGxvd2VyID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNiLmNoYXJBdCgwKSk7Ci0JCXNiLnNldENoYXJBdCgwLCBsb3dlcik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZXR1cm5UeXBlTmFtZShNZXRob2QgZ2V0dGVyKSB7Ci0JCWlmIChnZXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlKYXZhSGVscGVycyByZXRUeXBlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKHJldFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShGaWVsZCBhRmllbGQpIHsKLQkJaWYgKGFGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUphdmFIZWxwZXJzIHR5cGUgPSAoSmF2YUhlbHBlcnMpYUZpZWxkLmdldEVUeXBlKCk7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSh0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoSmF2YUhlbHBlcnMgaGVscGVycykgewotCQlpZiAoaGVscGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBoZWxwZXJzLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogUHJlY29uZGl0aW9uOiBzZXR0ZXIgbXVzdCB0YWtlIG9uZSBwYXJhbWV0ZXIsIGFuZCBnZXR0ZXIgbXVzdCByZXR1cm4KLQkgKiBhIHR5cGUsIG5vdCB2b2lkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHR5cGVzQWdyZWUoTWV0aG9kIGdldHRlciwgTWV0aG9kIHNldHRlcikgewotCQlpZiAoZ2V0dGVyID09IG51bGwgfHwgZ2V0dGVyLmlzVm9pZCgpIHx8IHNldHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gc2V0dGVyLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1ldGVyc1swXTsKLQkJcmV0dXJuIHBhcmFtLmdldEVUeXBlKCkgIT0gbnVsbCAmJgotCQkJCXBhcmFtLmdldEVUeXBlKCkgPT0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsJCQkJCQkJCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgQ01QRmllbGREZXNjcmlwdG9yIGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUNNUEZpZWxkRGVzY3JpcHRvciBkZXNjID0gbmV3IENNUEZpZWxkRGVzY3JpcHRvcigpOwotCQlkZXNjLnNldE5hbWUobmFtZSk7Ci0JCWRlc2Muc2V0VHlwZSh0eXBlTmFtZSk7Ci0JCXJldHVybiBkZXNjOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWMoRmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMLmdldFZhbHVlKCkgPT0gZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCQotCQkKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjRiMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfVFlQRSA9IENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQgPSB0cnVlOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNtcCA9IGNtcDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUga2V5QXR0cmlidXRlcyBsaXN0IGlzIGVtcHR5LCB0cnkgdG8gcmVmbGVjdAotCSAqIHRoZSBrZXlBdHRyaWJ1dGVzIGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeUtleSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplS2V5QXR0cmlidXRlcygpIHsKLQkgICAgaWYoY21wID09IG51bGwgfHwgaW5pdGlhbGl6ZWQpCi0JICAgICAgICByZXR1cm47Ci0JICAgIC8vRGlzYWJsZSBub3RpZmljYXRpb25zIHdoaWxlIHdlIGluaXRpYWxpemUKLQkgICAgY21wLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkgICAgdHJ5IHsKLQkJICAgIFJlc291cmNlIHJlcyA9IGNtcC5lUmVzb3VyY2UoKTsKLQkJICAgIGlmKHJlcyA9PSBudWxsKQotCQkgICAgICAgIHJldHVybjsKLQkJICAgIGJvb2xlYW4gY2FjaGVkSXNNb2RpZmllZCA9IHJlcy5pc01vZGlmaWVkKCk7IAotCQkgICAgdHJ5IHsKLQkJCQkvLyBIYW5kbGUgcHJpbWtleWZpZWxkIHNjZW5hcmlvCi0JCQkJaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKSE9bnVsbCkKLQkJCQkJaW5pdGlhbGl6ZUZvclByaW1LZXkoKTsKLQkJCQkvLyBIYW5kbGUgY29tcG91bmQga2V5IHNjZW5hcmlvCi0JCQkJZWxzZSAKLQkJCQkJaW5pdGlhbGl6ZUZvckNvbXBvdW5kS2V5KCk7Ci0JCSAgICB9IGZpbmFsbHkgewotCQkgICAgICAgIHJlcy5zZXRNb2RpZmllZChjYWNoZWRJc01vZGlmaWVkKTsKLQkJICAgIH0KLQkgICAgfSBmaW5hbGx5IHsKLQkgICAgCWNtcC5lU2V0RGVsaXZlcih0cnVlKTsKLQkgICAgCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkgICAgfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRm9yUHJpbUtleSgpIHsgCi0JCS8vIEVuc3VyZSB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdCBjb250YWlucyBvbmx5IHRoZSBwcmltS2V5RmllbGQgYXR0cmlidXRlCi0JCWlmICghKGdldEtleUF0dHJpYnV0ZXMoKS5zaXplKCk9PTEgJiYgZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKGNtcC5nZXRQcmltS2V5RmllbGQoKSkpKQotCQkJcHJpbUtleUZpZWxkQ2hhbmdlZChjbXAuZ2V0UHJpbUtleUZpZWxkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRm9yQ29tcG91bmRLZXkoKSB7IAotCQlMaXN0IGtleXMgPSBnZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCS8vIGNsZWFyIGtleSBsaXN0Ci0JCWtleXMuY2xlYXIoKTsKLQkJLy9lbnN1cmUgdGhlIGtleSBjbGFzcyBpcyBub3QgbnVsbAotCQlKYXZhQ2xhc3Mga2V5Q2xhc3MgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5Q2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJa2V5Q2xhc3MuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkKLQkJLy8gcmVmbGVjdCBrZXkgZmllbGRzIGludG8ga2V5IGF0dHJpYnV0ZXMgbGlzdAotCQlMaXN0IGtleUZpZWxkcyA9IGtleUNsYXNzLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5RmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IChGaWVsZCkga2V5RmllbGRzLmdldChpKTsKLQkJCWlmIChmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCkgeyAvL29ubHkgcHVibGljIGZpZWxkcwotCQkJCUNNUEF0dHJpYnV0ZSBrZXlBdHRyaWJ1dGUgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShmaWVsZC5nZXROYW1lKCkpOwotCQkJCWlmIChrZXlBdHRyaWJ1dGUgIT0gbnVsbCkKLQkJCQkJa2V5cy5hZGQoa2V5QXR0cmlidXRlKTsKLQkJCX0JCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChpc1VwZGF0aW5nIHx8ICFpc0VuYWJsZWQpIHJldHVybjsgLy93ZSBkb24ndCB3YW50IHRvIHJlYWN0IHRvIG91ciBvd24gY2hhbmdlcwotCQl0cnkgewotCQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCQlFQ2xhc3MgZmVhdHVyZUNsYXNzID0gKChFT2JqZWN0KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5lQ2xhc3MoKTsKLQkJCWlmIChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZXF1YWxzKGZlYXR1cmVDbGFzcykpIHsJCQkKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcykpIHsKLQkJCQkJLy8gaGFuZGxlIGlmIGNtcCBhdHRyaWJ1dGUgaXMgdXBkYXRlZCwgYWRkZWQsIHJlbW92ZWQKLQkJCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTIDogewotCQkJCQkJaGFuZGxlQ01QQXR0cmlidXRlRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJCQkJCWJyZWFrOwkKLQkJCQkJfQotCQkJCQkvLyBoYW5kbGUgdGhlIGtleSBhdHRyaWJ1dGVzIGxpc3QgaXMgdXBkYXRlZCBwcm9ncmFtYXRpY2FsbHkKLQkJCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fS0VZX0FUVFJJQlVURVMgOiB7Ci0JCQkJCQloYW5kbGVDTVBBdHRyaWJ1dGVFdmVudChub3RpZmljYXRpb24pOwotCQkJCQkJYnJlYWs7CQotCQkJCQl9CQotCQkJCQkvLyBoYW5kbGUgaWYgdGhlIGtleSBjbGFzcyBpcyBjaGFuZ2VkLGFkZGVkLCByZW1vdmVkCi0JCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1BUllfS0VZIDogewotCQkJCQkJaGFuZGxlS2V5Q2xhc3NFdmVudChub3RpZmljYXRpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gaGFuZGxlIHByaW0ga2V5IGZpZWxkIHNldHMsIGFkZHMsIHJlbW92ZXMKLQkJCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQgOiB7Ci0JCQkJCQloYW5kbGVQcmltS2V5RmllbGRFdmVudChub3RpZmljYXRpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENNUEF0dHJpYnV0ZSgpLmVxdWFscyhmZWF0dXJlQ2xhc3MpKSB7Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENNUEF0dHJpYnV0ZS5jbGFzcykpIHsKLQkJCQkJLy8gaGFuZGxlIGEgc2V0IG9yIGNoYW5nZSBvZiBhbiBhdHRyaWJ1dGUgbmFtZQotCQkJCQljYXNlIChFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX05BTUUpIDogewotCQkJCQkJaGFuZGxlQ01QQXR0cmlidXRlUmVuYW1lRXZlbnQoKENNUEF0dHJpYnV0ZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7CQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgeyAKLQkJCS8vIHJlc3RvcmUgaW5pdGlhbCBub3RpZmljYXRpb24gc3RhdGUKLQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDTVBBdHRyaWJ1dGVSZW5hbWVFdmVudChDTVBBdHRyaWJ1dGUgYXR0cmlidXRlLCBPYmplY3Qgb2xkVmFsdWUpIHsKLQkJLy8gaWYgcmVuYW1lZCBhdHRyaWJ1dGUgd2FzIGluIGtleSBhbmQgaXMgbm90IGFueW1vcmUsIHJlbW92ZSBpdCBmcm9tIGtleSBsaXN0Ci0JCWlmIChnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoYXR0cmlidXRlKSkgewotCQkJaWYgKCFpc0F0dHJpYnV0ZUtleUNsYXNzRmllbGQoYXR0cmlidXRlLmdldE5hbWUoKSkpCi0JCQkJcmVtb3ZlS2V5QXR0cmlidXRlKGF0dHJpYnV0ZSwoU3RyaW5nKW9sZFZhbHVlKTsKLQkJfQotCQkvLyBpZiByZW5hbWVkIGF0dHJpYnV0ZSBpcyBub3cgcGFydCBvZiB0aGUga2V5LCBhZGQgaXQgdG8gdGhlIGtleSBsaXN0CQkKLQkJZWxzZQotCQkJYXR0cmlidXRlQWRkZWQoYXR0cmlidXRlKTsJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVQcmltS2V5RmllbGRFdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCUVPYmplY3QgbmV3UHJpbUtleUZpZWxkID0gKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCWNtcC5zZXRQcmltS2V5RmllbGQoKENNUEF0dHJpYnV0ZSluZXdQcmltS2V5RmllbGQpOwotCQkvLyBpZiBwcmltS2V5RmllbGQgaXMgcmVtb3ZlZCBvciBhIHByb3h5LCByZWNvbXB1dGUga2V5IGF0dHJpYnV0ZXMgYmFzZWQgb24ga2V5IGNsYXNzCi0JCWlmIChuZXdQcmltS2V5RmllbGQgPT0gbnVsbCB8fCBuZXdQcmltS2V5RmllbGQuZUlzUHJveHkoKSkgewotCQkJQ01QQXR0cmlidXRlIHByaW1GaWVsZCA9IChDTVBBdHRyaWJ1dGUpbmV3UHJpbUtleUZpZWxkOwotCQkJaWYgKHByaW1GaWVsZCE9bnVsbCAmJiBwcmltRmllbGQuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlwcmltRmllbGQuc2V0TmFtZSgoKEludGVybmFsRU9iamVjdClwcmltRmllbGQpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCkpOwotCQkJCW1ha2VQcmltS2V5RmllbGRQcm94eShwcmltRmllbGQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJlbW92ZUFsbEtleUF0dHJpYnV0ZXMoKTsKLQkJCWluaXRpYWxpemVkID0gZmFsc2U7Ci0JCQlpbml0aWFsaXplS2V5QXR0cmlidXRlcygpOwotCQl9Ci0JCS8vIEVuc3VyZSB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdCBjb250YWlucyBvbmx5IHRoZSBwcmltS2V5RmllbGQgYXR0cmlidXRlCi0JCWVsc2UgaWYgKCEoZ2V0S2V5QXR0cmlidXRlcygpLnNpemUoKT09MSAmJiBnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMobmV3UHJpbUtleUZpZWxkKSkpIHsKLQkJCXByaW1LZXlGaWVsZENoYW5nZWQobmV3UHJpbUtleUZpZWxkKTsKLQkJfQkJCi0JCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUtleUNsYXNzRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBpZiBwcmlta2V5IG51bGwgb3IgcHJveHksIGNsZWFyIGtleSBmaWVsZHMgYW5kIHJlaW5pdGlhbGl6ZSBpZiBrZXkgY2xhc3Mgbm90IG51bGwKLQkJaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKT09bnVsbCB8fCBjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJa2V5Q2xhc3NDaGFuZ2VkKCk7Ci0JCX0KLQkJLy8gaWYgcHJpbWtleSBpcyBub3QgbnVsbCwgdGhlbiBkbyBub3RoaW5nCi0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ01QQXR0cmlidXRlRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkvLyBoYW5kbGUgYSBDTVBBdHRyaWJ1dGUgYWRkZWQKLQkJIGlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJIGF0dHJpYnV0ZUFkZGVkKChDTVBBdHRyaWJ1dGUpbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOwotCQkgfQotCQkgLy8gaGFuZGxlIGEgQ01QQXR0cmlidXRlIHJlbW92ZWQKLQkJIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCSAJQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkvLyByZW1vdmUgdGhpcyBhZGFwdGVyIGZyb20gdGhlIGRlbGV0ZWQgYXR0cmlidXRlCi0JCQlhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJcmVtb3ZlS2V5QXR0cmlidXRlKGF0dHJpYnV0ZSwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkKLQkJIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVLZXlBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIG9sZE5hbWUpIHsKLQkJCi0JCS8vIGlmIGF0dHJpYnV0ZSB3YXMgYSBrZXkgYXR0cmlidXRlIGl0IHdpbGwgYmUgcmVtb3ZlZCwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcKLQkJZ2V0S2V5QXR0cmlidXRlcygpLnJlbW92ZShhdHRyaWJ1dGUpOwotCQkKLQkJLy8gaWYgaXQgaXMgdGhlIHByaW0ga2V5IGF0dHJpYnV0ZSwgdGhlbiBtYWtlIHRoZSBwcmltIGtleSBhdHRyaWJ1dGUgYSBwcm94eQotCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpIT1udWxsICYmIGNtcC5nZXRQcmltS2V5RmllbGQoKS5lcXVhbHMoYXR0cmlidXRlKSkgewotCQkJbWFrZVByaW1LZXlGaWVsZFByb3h5KG9sZE5hbWUpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZVByaW1LZXlGaWVsZFByb3h5KFN0cmluZyBvbGROYW1lKSB7Ci0JCWlmIChjbXAuZ2V0UHJpbUtleUZpZWxkKCkgPT0gbnVsbCkgcmV0dXJuOwotCQljbXAuc2V0UHJpbUtleUZpZWxkKEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpKTsKLQkJY21wLmdldFByaW1LZXlGaWVsZCgpLnNldE5hbWUob2xkTmFtZSk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KWNtcC5nZXRQcmltS2V5RmllbGQoKSkuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkob2xkTmFtZSkpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsS2V5QXR0cmlidXRlcygpIHsKLQkJLy8gY2xlYXIga2V5IGF0dHJpYnV0ZXMgbGlzdCBvbiBjbXAKLQkJZ2V0S2V5QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEtleUF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQotCQlDTVBBdHRyaWJ1dGUgcHJpbUtleUZpZWxkID0gY21wLmdldFByaW1LZXlGaWVsZCgpOwotCQkvLyBpZiBwcmltIGtleSBpcyBudWxsIGFkZCBhdHRyaWJ1dGUgdG8ga2V5IGxpc3QKLQkJaWYgKHByaW1LZXlGaWVsZD09bnVsbCB8fCBwcmltS2V5RmllbGQuZUlzUHJveHkoKSkgewotCQkJaWYgKCFnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoYXR0cmlidXRlKSkKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkvLyBpZiBhdHQgaXMgb25seSBrZXkgYXR0LCBhbmQgdHlwZSBpcyB0aGUga2V5IGNsYXNzIHR5cGUsIHNldCB0aGUgcHJpbSBrZXkgZmllbGQKLQkJCWlmIChnZXRLZXlBdHRyaWJ1dGVzKCkuc2l6ZSgpPT0xICYmIGF0dHJpYnV0ZS5nZXRUeXBlKCkuZXF1YWxzKGNtcC5nZXRQcmltYXJ5S2V5KCkpKQotCQkJCWNtcC5zZXRQcmltS2V5RmllbGQoYXR0cmlidXRlKTsKLQkJfQotCQkvLyBpZiBwcmlta2V5IHNldCArIHByaW1rZXlmaWVsZCBpcyB0aGUgbmV3IGF0dHJpYnV0ZSBlbnN1cmUgaXRzIHRoZSBvbmx5IG9uZQotCQllbHNlIGlmIChwcmltS2V5RmllbGQuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCWlmICghKGdldEtleUF0dHJpYnV0ZXMoKS5zaXplKCk9PTEgJiYgZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKGF0dHJpYnV0ZSkpKSB7Ci0JCQkJZ2V0S2V5QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0S2V5QXR0cmlidXRlcygpLmFkZChhdHRyaWJ1dGUpOwotCQkJfQkKLQkJfQotCQkvLyBpZiBwcmlta2V5IHNldCxuZXcgYXR0cmlidXRlIG5vdCBwcmltIGtleSwga2V5IGF0dHMgPiAxLCByZW1vdmUgcHJpbWtleSBmaWVsZAotCQllbHNlIHsKLQkJCWNtcC5zZXRQcmltS2V5RmllbGQobnVsbCk7Ci0JCQlpZiAoIWdldEtleUF0dHJpYnV0ZXMoKS5jb250YWlucyhhdHRyaWJ1dGUpKQotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGF0dHJpYnV0ZUFkZGVkKENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJLy9NYWtlIHN1cmUgY21wIGtleSBhZGFwdGVycyBhcmUgaW5pdGlhbGl6ZWQgaWYgbmVlZGVkCi0JCWNtcC5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQotCQkvLyBhZGQgdGhpcyBhcyBhIGxpc3RlbmVyIHRvIG5hbWUgY2hhbmdlcyBvbiB0aGlzIGF0dHJpYnV0ZQotCQlpZiAoIWF0dHJpYnV0ZS5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCWF0dHJpYnV0ZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQotCQlpZiAoYXR0cmlidXRlLmdldE5hbWUoKSA9PW51bGwpIHJldHVybjsKLQkJLy8gYWRkIGl0IHRvIHRoZSBrZXkgbGlzdCBpZiBhcHBsaWNhYmxlIGFuZCBzb3J0IHRoZSBrZXkgbGlzdAotCQlpZiAoaXNBdHRyaWJ1dGVLZXlDbGFzc0ZpZWxkKGF0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQlhZGRLZXlBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQkJCXNvcnRLZXlBdHRyaWJ1dGVMaXN0KCk7Ci0JCX0KLQkJLy8gaWYgbmV3IGF0dHJpYnV0ZSBuYW1lIGlzIG5vdyBwcmltIGtleSBuYW1lLCBmaXggdXAgcHJpbSBrZXkgZmllbGQKLQkJZWxzZSBpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpIT1udWxsICYmIGNtcC5nZXRQcmltS2V5RmllbGQoKS5lSXNQcm94eSgpICYmIGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGNtcC5nZXRQcmltS2V5RmllbGQoKS5nZXROYW1lKCkpKSB7Ci0JCQljbXAuc2V0UHJpbUtleUZpZWxkKGF0dHJpYnV0ZSk7Ci0JCQlwcmltS2V5RmllbGRDaGFuZ2VkKGF0dHJpYnV0ZSk7Ci0JCX0JCi0JfQotCQotCi0JLyoqCi0JICogSXMgdGhlIGNtcCBhdHRyaWJ1dGUgYWxzbyBhIGZpZWxkIGluIHRoZSBrZXkgY2xhc3M/Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBdHRyaWJ1dGVLZXlDbGFzc0ZpZWxkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCS8vIGVuc3VyZSBrZXkgY2xhc3MgaXMgbm90IG51bGwKLQkJSmF2YUNsYXNzIGtleUNsYXNzID0gY21wLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKGtleUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHNlZSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgbWF0Y2hzIGFueSBvZiB0aGUgcmVmbGVjdGVkIGtleSBjbGFzcyBwdWJsaWMgZmllbGQgbmFtZXMKLQkJTGlzdCBrZXlGaWVsZHMgPSBrZXlDbGFzcy5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleUZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJRmllbGQgZmllbGQgPSAoRmllbGQpIGtleUZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpIHsKLQkJCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIGxpc3Qgb2YgdGhlIGtleSBhdHRyaWJ1dGVzIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGUga2V5IGNsYXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNvcnRLZXlBdHRyaWJ1dGVMaXN0KCkgewotCQkKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUphdmFDbGFzcyBrZXlDbGFzcyA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChrZXlDbGFzcyA9PSBudWxsKSByZXR1cm47Ci0JCUxpc3Qga2V5RmllbGRzID0ga2V5Q2xhc3MuZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQkJTGlzdCBjdXJyZW50S2V5cyA9IGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCi0JCS8vIGNyZWF0ZSBhIG5ldyBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIGluIG9yZGVyIG9mIGtleSBjbGFzcyBmaWVsZHMuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5RmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IChGaWVsZCkga2V5RmllbGRzLmdldChpKTsKLQkJCWlmIChmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCkgeyAvL29ubHkgcHVibGljIGZpZWxkcwotCQkJCWZvciAoaW50IGo9MDsgajxjdXJyZW50S2V5cy5zaXplKCk7IGorKykgewotCQkJCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgY3VycmVudEtleXMuZ2V0KGopOwotCQkJCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cmlidXRlKTsJCi0JCQkJfQkJCQotCQkJfQkKLQkJfQotCQkvL2NsZWFyIGxpc3QgYW5kIHNldCB0aGUgbmV3IGtleSBhdHRyaWJ1dGUgb3JkZXIgb24gdGhlIGNtcAotCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJZ2V0S2V5QXR0cmlidXRlcygpLmFkZEFsbChyZXN1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBrZXlDbGFzc0NoYW5nZWQoKSB7Ci0JCUphdmFDbGFzcyBrZXkgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5ICE9bnVsbCkKLQkJCWtleS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCS8vIGlmIG5vdCBwcmltIGtleSBjbGFzcywgY2xlYXIga2V5IGF0dHJpYnV0ZSBsaXN0Ci0JCXJlbW92ZUFsbEtleUF0dHJpYnV0ZXMoKTsKLQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJaW5pdGlhbGl6ZUtleUF0dHJpYnV0ZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUtleUZpZWxkQ2hhbmdlZChFT2JqZWN0IHByaW1LZXlGaWVsZCkgewotCQkvLyBpZiBhIHByaW1LZXlGaWVsZCBpcyBhZGRlZCwgZG8gYSByZW1vdmUgYWxsIGFuZCBhbiBhZGQKLQkJcmVtb3ZlQWxsS2V5QXR0cmlidXRlcygpOwotCQkKLQkJaWYgKHByaW1LZXlGaWVsZCAhPSBudWxsICYmICFwcmltS2V5RmllbGQuZUlzUHJveHkoKSkgewotCQkJaWYgKCFwcmltS2V5RmllbGQuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJcHJpbUtleUZpZWxkLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGQocHJpbUtleUZpZWxkKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEVMaXN0IGdldEtleUF0dHJpYnV0ZXMoKSB7Ci0JICAgIHJldHVybiAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsKWNtcCkuZ2V0S2V5QXR0cmlidXRlc0dlbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCXN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOyAKLQl9Ci0JCi0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFLmVxdWFscyh0eXBlKTsKLSAgICB9Ci0gICAgLy9UbyB0dXJuIHN5bmMgb24gb3Igb2ZmCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpewotICAgIAlpc0VuYWJsZWQgPSBlbmFibGVkOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDU2YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgRUpCX1BBQ0sgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCWFkZGVkTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCXJlbW92ZWROb3RpZmljYXRpb24obXNnKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZE5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gRUpCX1BBQ0suZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCkpCi0JCQlhZGRlZEtleUF0dHJpYnV0ZSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbXNnLmdldE5vdGlmaWVyKCksIChDTVBBdHRyaWJ1dGUpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBzU0YoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKSkKLQkJCWFkZGVkKCk7Ci0JCWVsc2UgaWYgKGlzUmVsYXRpb25zaGlwUm9sZXNTRigoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpKQotCQkJYWRkZWRSb2xlKChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZWROb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IEVKQl9QQUNLLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfS2V5QXR0cmlidXRlcygpKQotCQkJcmVtb3ZlZEtleUF0dHJpYnV0ZSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbXNnLmdldE5vdGlmaWVyKCksIChDTVBBdHRyaWJ1dGUpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBzU0YoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKSkKLQkJCXJlbW92ZWQoKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBSb2xlc1NGKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkpCi0JCQlyZW1vdmVkUm9sZSgoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgbXNnLmdldE9sZFZhbHVlKCkpOwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCBzZik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBzU0YoRU9iamVjdCBzZik7Ci0JLy9TYW1lIGFzIHRoZSBhZGQKLQlwcml2YXRlIHZvaWQgcmVtb3ZlZEtleUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGFDTVBFbnRpdHksIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUpIHsKLQkJYWRkZWRLZXlBdHRyaWJ1dGUoYUNNUEVudGl0eSwgY21wQXR0cmlidXRlKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkZWRLZXlBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBhQ01QRW50aXR5LCBDTVBBdHRyaWJ1dGUgbmV3QXR0cmlidXRlKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSwgaW52ZXJzZTsKLQkJcm9sZSA9IGdldFJvbGUoYUNNUEVudGl0eSk7Ci0JCWlmIChyb2xlICE9IG51bGwgJiYgIXJvbGUuaXNGb3J3YXJkKCkpIHsKLQkJCWludmVyc2UgPSByb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0JCQlpZiAoaW52ZXJzZSAhPSBudWxsKQotCQkJCWludmVyc2UucmVjb25jaWxlQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldFJvbGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBhQ01QRW50aXR5KSB7Ci0JICAgIENvbW1vblJlbGF0aW9uc2hpcCByZWxhdGlvbiA9IGdldFJlbGF0aW9uc2hpcCgpOwotCSAgICBpZiAocmVsYXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3Qgcm9sZXMgPSByZWxhdGlvbi5nZXRDb21tb25Sb2xlcygpOwotCQlpZiAocm9sZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gYUNNUEVudGl0eSkKLQkJCQlyZXR1cm4gcm9sZTsKLQkJfQotCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcHJvdGVjdGVkIENvbW1vblJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiAgKENvbW1vblJlbGF0aW9uc2hpcCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlY29uY2lsZVJvbGVBdHRyaWJ1dGVzKCkgewotCQlMaXN0IHJvbGVzID0gZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q29tbW9uUm9sZXMoKTsKLQkJaWYgKHJvbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5zaXplKCk7IGkrKykgewotCQkJcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSByb2xlcy5nZXQoaSk7Ci0JCQlyb2xlLnJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZCgpIHsKLQkJcmVjb25jaWxlUm9sZUF0dHJpYnV0ZXMoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlZCgpIHsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCkuc2l6ZSgpID4gMSkgewotCQkJLy9yZW1vdmUgb25lIGZvcmNlIGEgZGlzY29ubmVjdAotCQkJZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q29tbW9uUm9sZXMoKS5yZW1vdmUoMCk7Ci0JCX0KLQl9Ci0JLyoqCi0JKiBBZGQgdGhpcyBBZGFwdGVyIHRvIEBhUm9sZSBhbmQgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkKLQkqIHRoYXQgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gY29udGFpbmVyIGlzIHBvaW50aW5nIHRvLgotCSogVGhpcyBvbmx5IHdvcmtzIGlmIEBhUm9sZSBpcyBjb250YWluZWQuCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGFwdG9ycyhDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCXJlbW92ZUFkYXB0b3JzKGFSb2xlKTsgLy90byBlbnN1cmUgdGhpcyBhZGFwdGVyIGlzIG5vdCBhZGRlZCB0d2ljZQotCQlhUm9sZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gYVJvbGUuZ2V0U291cmNlRW50aXR5KCk7Ci0JCWlmIChjbXAgIT0gbnVsbCkKLQkJCWNtcC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZSB0aGlzIEFkYXB0ZXIgZnJvbSBAYVJvbGUgYW5kIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JICogdGhhdCB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiBjb250YWluZXIgaXMgcG9pbnRpbmcgdG8uCi0JICogVGhpcyBvbmx5IHdvcmtzIGlmIEBhUm9sZSBpcyBjb250YWluZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWRhcHRvcnMoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlhUm9sZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gYVJvbGUuZ2V0U291cmNlRW50aXR5KCk7Ci0JCWlmIChjbXAgIT0gbnVsbCkKLQkJCWNtcC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZGVkUm9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCWFkZEFkYXB0b3JzKGFSb2xlKTsKLQkJaWYgKChnZXRSZWxhdGlvbnNoaXAoKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgJiYgcm9sZXNGdWxseVJlZmxlY3RlZCgpKQotCQkJcmVjb25jaWxlUm9sZUF0dHJpYnV0ZXMoKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sZXNGdWxseVJlZmxlY3RlZCgpIHsKLQkJTGlzdCByb2xlcyA9IGdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCk7Ci0JCWlmIChyb2xlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVkUm9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCXJlbW92ZUFkYXB0b3JzKGFSb2xlKTsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlhUm9sZS5yZWNvbmNpbGVBdHRyaWJ1dGVzKCk7Ci0JCQlyZWNvbmNpbGVSb2xlQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBub3RpZmllcikgewotCQkvL09ubHkgc2V0IHRoZSB0YXJnZXQgaWYgaXQgaXMgYSBDb21tb25SZWxhdGlvbnNoaXAKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgbm90aWZpZXIgaW5zdGFuY2VvZiBDb21tb25SZWxhdGlvbnNoaXApCi0JCQlzdXBlci5zZXRUYXJnZXQobm90aWZpZXIpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db252ZXJ0ZWRFSkJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db252ZXJ0ZWRFSkJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYWM3N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29udmVydGVkRUpCQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydGVkRUpCQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfS0VZID0gIkNvbnZlcnRlZEVKQkFkcGF0ZXIiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8wID0gMTsKLQkKLQlwcm90ZWN0ZWQgaW50IHZlcnNpb24gPSAtMTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb252ZXJ0ZWRFSkJBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBDb252ZXJ0ZWRFSkJBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZlcnNpb24uICBUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzdGF0aWMgY29uc3RhbnRzLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmVyc2lvbi4gIFRoaXMgc2hvdWxkIGJlIG9uZSBvZiB0aGUgc3RhdGljIGNvbnN0YW50cy4KLQkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVhZE9ubHkuCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWFkT25seS4KLQkgKiBAcGFyYW0gcmVhZE9ubHkgVGhlIHJlYWRPbmx5IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Zyb21WZXJzaW9uMV8wKCkgewotCQlyZXR1cm4gdmVyc2lvbiA9PSBWRVJTSU9OXzFfMDsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTU1NTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLQotcHVibGljIGNsYXNzIEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBFamJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9LRVkgPSAiRUpCQXR0cmlidXRlTWFpbnRlbmFuY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi51dGlsLkVqYkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFkYXB0ZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJQWRhcHRlciB0YXJnZXRBZGFwdGVyID0gKEFkYXB0ZXIpIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JCXJldHVybiBFeHRlbmRlZEVjb3JlVXRpbC5jcmVhdGVBZGFwdGVyRm9yTG9hZGluZyh0YXJnZXRBZGFwdGVyLCAoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gQURBUFRFUl9LRVkgPT0gdHlwZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmNzE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgZXh0ZW5kcyBDb21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci4KLQkgKiBAcGFyYW0gYVJlbGF0aW9uc2hpcAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciNpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCBzZikgewotCQlyZXR1cm4gc2YgPT0gRUpCX1BBQ0suZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciNpc1JlbGF0aW9uc2hpcHNTRihFT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVsYXRpb25zaGlwc1NGKEVPYmplY3Qgc2YpIHsKLQkJcmV0dXJuIHNmID09IEVKQl9QQUNLLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuQURBUFRFUl9LRVkgPT0gdHlwZTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZGU4OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBFamJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFamJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQlwdWJsaWMgRWpiQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKEVqYlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByb3RlY3RlZCBFamJTd2l0Y2ggc3cgPSBuZXcgRWpiU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RUcmFuc2FjdGlvbihNZXRob2RUcmFuc2FjdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RUcmFuc2FjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFbnRlcnByaXNlQmVhbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHkoRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJNYW5hZ2VkRW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNNUEF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDTVJGaWVsZEFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVKQkphckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU291cmNlKFJvbGVTb3VyY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVRdWVyeUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZEFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFeGNsdWRlTGlzdEFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uKFNlc3Npb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuKE1lc3NhZ2VEcml2ZW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNZXRob2RDYXRlZ29yeShFSkJNZXRob2RDYXRlZ29yeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBzdy5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMKLQkgKiBhbnl3YXkuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50ZXJwcmlzZUJlYW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ01QQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUkZpZWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJKYXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRdWVyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRdWVyeU1ldGhvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEVqYlN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RUcmFuc2FjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb24oU2Vzc2lvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVudGl0eShFbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVudGVycHJpc2VCZWFuKEVudGVycHJpc2VCZWFuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnRlcnByaXNlQmVhbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1ldGhvZENhdGVnb3J5KEVKQk1ldGhvZENhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkphckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNNUEF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNNUEF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlbGF0aW9uc2hpcHMoUmVsYXRpb25zaGlwcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRdWVyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uKEVKQlJlbGF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTb3VyY2UoUm9sZVNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNNUkZpZWxkKENNUkZpZWxkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDTVJGaWVsZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW4oTWVzc2FnZURyaXZlbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeGNsdWRlTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFQXR0cmlidXRlKEoyRUVFQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzCi0JICogYW55d2F5LgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRlcnByaXNlQmVhbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVBBdHRyaWJ1dGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVJGaWVsZEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJKYXJBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU291cmNlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRdWVyeU1ldGhvZEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEcml2ZW5BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZSA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudCA8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0VqYkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc1ZmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRWpiUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTogewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY29udGFpbmVyTWFuYWdlZEVudGl0eSA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250YWluZXJNYW5hZ2VkRW50aXR5KGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVudGl0eShjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoY29udGFpbmVyTWFuYWdlZEVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29udGFpbmVyTWFuYWdlZEVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OOiB7Ci0JCQkJTWV0aG9kUGVybWlzc2lvbiBtZXRob2RQZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBlcm1pc3Npb24obWV0aG9kUGVybWlzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWV0aG9kUGVybWlzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHsKLQkJCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gKEFzc2VtYmx5RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OOiB7Ci0JCQkJTWV0aG9kVHJhbnNhY3Rpb24gbWV0aG9kVHJhbnNhY3Rpb24gPSAoTWV0aG9kVHJhbnNhY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFRyYW5zYWN0aW9uKG1ldGhvZFRyYW5zYWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtZXRob2RUcmFuc2FjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT046IHsKLQkJCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2Vzc2lvbihzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2Vzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2Vzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWTogewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnRpdHkoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU46IHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlbnRlcnByaXNlQmVhbiA9IChFbnRlcnByaXNlQmVhbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW50ZXJwcmlzZUJlYW4oZW50ZXJwcmlzZUJlYW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAoZW50ZXJwcmlzZUJlYW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlbnRlcnByaXNlQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9NRVRIT0RfQ0FURUdPUlk6IHsKLQkJCQlFSkJNZXRob2RDYXRlZ29yeSBlamJNZXRob2RDYXRlZ29yeSA9IChFSkJNZXRob2RDYXRlZ29yeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoZWpiTWV0aG9kQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYk1ldGhvZENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUjogewotCQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXIoZWpiSmFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChlamJKYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZWpiSmFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlamJKYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogewotCQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFOiB7Ci0JCQkJQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNNUEF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFQXR0cmlidXRlKGNtcEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGNtcEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTOiB7Ci0JCQkJUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gKFJlbGF0aW9uc2hpcHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocmVsYXRpb25zaGlwcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZOiB7Ci0JCQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVF1ZXJ5KHF1ZXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChxdWVyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogewotCQkJCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gKEVKQlJlbGF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbihlamJSZWxhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiUmVsYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEU6IHsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIGVqYlJlbGF0aW9uc2hpcFJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShlamJSZWxhdGlvbnNoaXBSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlamJSZWxhdGlvbnNoaXBSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0U6IHsKLQkJCQlSb2xlU291cmNlIHJvbGVTb3VyY2UgPSAoUm9sZVNvdXJjZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZVNvdXJjZShyb2xlU291cmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyb2xlU291cmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEOiB7Ci0JCQkJQ01SRmllbGQgY21yRmllbGQgPSAoQ01SRmllbGQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNNUkZpZWxkKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDTVBBdHRyaWJ1dGUoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFQXR0cmlidXRlKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQXR0cmlidXRlKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTjogewotCQkJCU1lc3NhZ2VEcml2ZW4gbWVzc2FnZURyaXZlbiA9IChNZXNzYWdlRHJpdmVuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRHJpdmVuKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFuKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAobWVzc2FnZURyaXZlbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAobWVzc2FnZURyaXZlbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT046IHsKLQkJCQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uID0gKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUOiB7Ci0JCQkJRXhjbHVkZUxpc3QgZXhjbHVkZUxpc3QgPSAoRXhjbHVkZUxpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2x1ZGVMaXN0KGV4Y2x1ZGVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChleGNsdWRlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRDogewotCQkJCVF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gKFF1ZXJ5TWV0aG9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRdWVyeU1ldGhvZChxdWVyeU1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChxdWVyeU1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocXVlcnlNZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogewotCQkJCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPSAoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJRzogewotCQkJCUFjdGl2YXRpb25Db25maWcgYWN0aXZhdGlvbkNvbmZpZyA9IChBY3RpdmF0aW9uQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uQ29uZmlnKGFjdGl2YXRpb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFjdGl2YXRpb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250YWluZXIgTWFuYWdlZCBFbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIE1hbmFnZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJNYW5hZ2VkRW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGVybWlzc2lvbihNZXRob2RQZXJtaXNzaW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFRyYW5zYWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBUcmFuc2FjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVHJhbnNhY3Rpb24oTWV0aG9kVHJhbnNhY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb24oU2Vzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVudGl0eShFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRlcnByaXNlIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50ZXJwcmlzZSBCZWFuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBNZXRob2QgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIE1ldGhvZCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoRUpCTWV0aG9kQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBKYXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU291cmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU291cmNlKFJvbGVTb3VyY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRHJpdmVuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuKE1lc3NhZ2VEcml2ZW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbiBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbiBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKTkRJRW52UmVmc0dyb3VwKEpORElFbnZSZWZzR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFQXR0cmlidXRlKEoyRUVFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9FamJTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkMjNhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAzMCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFzaE1hcCBhY3RpdmF0aW9uQ29uZmlnTWFwOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGFja01vZGVLZXkgPSAiYWNrbm93bGVkZ2VNb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVzdGluYXRpb25UeXBlS2V5ID0gImRlc3RpbmF0aW9uVHlwZSI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZHVyYWJpbGl0eUtleSA9ICJzdWJzY3JpcHRpb25EdXJhYmlsaXR5IjsvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtZXNzYWdlU2VsZWN0b3JLZXkgPSAibWVzc2FnZVNlbGVjdG9yIjsvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGFja01vZGVWYWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiQXV0by1hY2tub3dsZWRnZSIsICJEdXBzLW9rLWFja25vd2xlZGdlIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGVzdGluYXRpb25UeXBlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgImphdmF4Lmptcy5RdWV1ZSIsICJqYXZheC5qbXMuVG9waWMiIH07Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGR1cmFiaWxpdHlWYWx1ZSA9IG5ldyBTdHJpbmdbXSB7ICJEdXJhYmxlIiwgIk5vbkR1cmFibGUiIH07Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFzaE1hcCBjcmVhdGVTdGFuZGFyZEFjdGl2YXRpb25Db25maWdNYXAoKSB7Ci0gICAgICAgIGFjdGl2YXRpb25Db25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBhY3RpdmF0aW9uQ29uZmlnTWFwLnB1dChhY2tNb2RlS2V5LCBhY2tNb2RlVmFsdWVzKTsKLSAgICAgICAgYWN0aXZhdGlvbkNvbmZpZ01hcC5wdXQoZGVzdGluYXRpb25UeXBlS2V5LCBkZXN0aW5hdGlvblR5cGVWYWx1ZXMpOwotICAgICAgICBhY3RpdmF0aW9uQ29uZmlnTWFwLnB1dChkdXJhYmlsaXR5S2V5LCBkdXJhYmlsaXR5VmFsdWUpOwotICAgICAgICBhY3RpdmF0aW9uQ29uZmlnTWFwLnB1dChtZXNzYWdlU2VsZWN0b3JLZXksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ01hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01ldGhvZEVsZW1lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01ldGhvZEVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4ZWM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NZXRob2RFbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1BFUk1JU1NJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9UUkFOU0FDVElPTiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTFVERV9MSVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGludCBnZXRDb250YWluZWRUeXBlKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBtZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBOT05FOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikKLQkJCXJldHVybiBNRVRIT0RfUEVSTUlTU0lPTjsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFRyYW5zYWN0aW9uKQotCQkJcmV0dXJuIE1FVEhPRF9UUkFOU0FDVElPTjsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KQotCQkJcmV0dXJuIEVYQ0xVREVfTElTVDsKLQkJcmV0dXJuIE5PTkU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGVybWlzc2lvbiBnZXRNZXRob2RQZXJtaXNzaW9uKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKE1FVEhPRF9QRVJNSVNTSU9OID09IGdldENvbnRhaW5lZFR5cGUobWUpKQotCQkJcmV0dXJuIChNZXRob2RQZXJtaXNzaW9uKSBtZS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFRyYW5zYWN0aW9uIGdldE1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKE1FVEhPRF9UUkFOU0FDVElPTiA9PSBnZXRDb250YWluZWRUeXBlKG1lKSkKLQkJCXJldHVybiAoTWV0aG9kVHJhbnNhY3Rpb24pIG1lLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgRXhjbHVkZUxpc3QgZ2V0RXhjbHVkZUxpc3QoTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAoRVhDTFVERV9MSVNUID09IGdldENvbnRhaW5lZFR5cGUobWUpKQotCQkJcmV0dXJuIChFeGNsdWRlTGlzdCkgbWUuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL1JlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL1JlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwYWU4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkpIHsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJYWRkZWRFSkJSZWxhdGlvbigoRUpCUmVsYXRpb24pIG1zZy5nZXROZXdWYWx1ZSgpLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCQlyZW1vdmVkRUpCUmVsYXRpb24oKEVKQlJlbGF0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSwgKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHJlbW92ZWRFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBhUmVsYXRpb24sIEVPYmplY3Qgc2YpIHsKLQkJQWRhcHRlciBhID0gZ2V0QWRhcHRlcihhUmVsYXRpb24pOwotCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQlOb3RpZmljYXRpb24gbm90ID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpYVJlbGF0aW9uLCBOb3RpZmljYXRpb24uUkVNT1ZFLChFU3RydWN0dXJhbEZlYXR1cmUpIHNmLCBhUmVsYXRpb24sIG51bGwsIE5vdGlmaWNhdGlvbi5OT19JTkRFWCk7Ci0JCQlhLm5vdGlmeUNoYW5nZWQobm90KTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgYWRkZWRFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBhUmVsYXRpb24sIEVPYmplY3Qgc2YpIHsKLQkJQWRhcHRlciBhID0gZ2V0QWRhcHRlcihhUmVsYXRpb24pOwotCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQlOb3RpZmljYXRpb24gbm90ID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpYVJlbGF0aW9uLCBOb3RpZmljYXRpb24uQURELChFU3RydWN0dXJhbEZlYXR1cmUpIHNmLCBudWxsLCBhUmVsYXRpb24sIE5vdGlmaWNhdGlvbi5OT19JTkRFWCk7Ci0JCQlhLm5vdGlmeUNoYW5nZWQobm90KTsKLQkJfQotCX0KLQlwcml2YXRlIEFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiBFY29yZVV0aWwuZ2V0QWRhcHRlcihhbk9iamVjdC5lQWRhcHRlcnMoKSxFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLkFEQVBURVJfS0VZKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjYTc5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgZW50ZXJwcmlzZSBiZWFuIG1vZHVsZSBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGFwcAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9EZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9EZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjE0NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBpbXBsZW1lbnRzIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgewotICAgIAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQkKLQl9Ci0JCi0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIjZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyI2hhc0VKQk1vZHVsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0VKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpICE9IG51bGw7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmU4ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciBpbXBsZW1lbnRzIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciB7IAotCi0gICAgcHJpdmF0ZSBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBTaG91bGQgdXNlIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5JTlNUQU5DRS5nZXRFSkJNb2R1bGVFeHRlbnNpb24obnVsbCk7Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLmdldEVKQk1vZHVsZUV4dGVuc2lvbihudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldEVKQk1vZHVsZUV4dGVuc2lvbihjb250ZXh0KSAhPSBudWxsOwotICAgIH0gCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciNzZXRQcm92aWRlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciNpc1Byb3ZpZGVyU2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyU2V0KCkgewotICAgICAgICByZXR1cm4gISh0aGlzLnByb3ZpZGVyIGluc3RhbmNlb2YgRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FamJNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNDI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FamJNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgaGVscGVyIHVzZWQgZm9yIGRlcml2aW5nIHRoZSBKTkRJIG5hbWUgb2YgZW50ZXJwcmlzZSBiZWFucywKLSAqIGFuZCBmb3IgaW5oZXJpdGFuY2Ugc3VwcG9ydC4gIFRoZSBoZWxwZXIgY2FuIGJlIHBsdWdnZWQgaW4gYnkgYXBwbGljYXRpb24KLSAqIHNlcnZlciB2ZW5kb3JzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGV4dGVuZHMgSjJFRU1vZHVsZUV4dGVuc2lvbkhlbHBlciB7Ci0JTGlzdCBnZXRTdWJ0eXBlcyhFbnRlcnByaXNlQmVhbiBhbkVKQik7Ci0JRW50ZXJwcmlzZUJlYW4gZ2V0U3VwZXJUeXBlKEVudGVycHJpc2VCZWFuIGFuRUpCKTsKLQlMaXN0IGdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKTsKLQlTdHJpbmcgZ2V0RUpCSW5oZXJpdGFuY2VGaWxlTmFtZSgpOwotCVN0cmluZyBnZXRKTkRJTmFtZShFSkJKYXIgamFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKTsgCi0JTGlzdCBnZXRSZWxhdGlvbnNoaXBzX2NtcDExKEVKQkphciBqYXIpOwotCUxpc3QgZ2V0TG9jYWxSZWxhdGlvbnNoaXBSb2xlc19jbXAxMShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCk7Ci0JYm9vbGVhbiBpc0VKQkluaGVyaXRhbmNlU3VwcG9ydGVkKCk7Ci0JU3RyaW5nIGdldEphdmFFRUpORElOYW1lKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciBqYXIsIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIGJlYW4sIFN0cmluZyBpbnRlcmZhY2VDbGFzc05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkN2QwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElXcmFwcGVkRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IZWxwZXIgewotLyoqCi0gKiBVdGlsaXR5IGNsYXNzOyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0gKi8KLXByaXZhdGUgRXhjZXB0aW9uSGVscGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSBAZXhjZXB0aW9uIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotICovCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCg0KTsKLQltZXNzYWdlcy5hZGQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JRXhjZXB0aW9uIG5lc3RlZCA9IGV4Y2VwdGlvbi5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQl3aGlsZSAobmVzdGVkICE9IG51bGwpIHsKLQkJbWVzc2FnZXMuYWRkKG5lc3RlZC5nZXRNZXNzYWdlKCkpOwotCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pIAotCQkJbmVzdGVkID0gKChJV3JhcHBlZEV4Y2VwdGlvbiluZXN0ZWQpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQllbHNlCi0JCQluZXN0ZWQgPSBudWxsOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXNzYWdlcy5zaXplKCldKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIEBleGNlcHRpb24gYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LAotICogY29uY2F0ZW5hdGVkIGFzIG9uZQotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQlTdHJpbmdbXSBtZXNzYWdlcyA9IGdldEFsbE1lc3NhZ2VzKGV4Y2VwdGlvbik7Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspewotCQlzYi5hcHBlbmQobWVzc2FnZXNbaV0pOwotCQlpZiAoaSA8IG1lc3NhZ2VzLmxlbmd0aC0xKQotCQkJc2IuYXBwZW5kKCdcbicpOwotCX0KLQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiMmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIFRoZSBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIgcmVwbGFjZXMgdGhlIGZvcm1lciBKMkVFTW9kdWxlRXh0ZW5zaW9uTWFuYWdlciBhbmQgYWN0cwotICogYXMgYSBmYWNhZGUgZm9yIGEgc2luZ2xlIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuIFRoZSBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHdpbGwKLSAqIHByb3ZpZGUgdGhlIGNvcnJlY3QgZXh0ZW5zaW9uIGhlbHBlciBiYXNlZCBvbiBhIGdpdmVuIGNvbnRleHQgKEBzZWUgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcikuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciBleHRlbmRzIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgewotCi0gICAgSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3ZpZGVyIGZvciB3aGljaCB0aGUgbWFuYWdlciBpcyBhIGZhY2FkZSBoYXMgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzUHJvdmlkZXJTZXQoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgbWFuYWdlciB3aWxsIGFjdCBhcyBhIGZhY2FkZSB0byB0aGUgZ2l2ZW4gcHJvdmlkZXIKLSAgICAgKi8KLSAgICB2b2lkIHNldFByb3ZpZGVyKElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgcHJvdmlkZXIpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjI4NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IGEgc3VwcGxpZWQgb2JqZWN0IHRvIGRldGVybWluZSB0aGUgY29udGV4dCAoZS5nLiBJUHJvamVjdCBpZiBhdmFpbGFibGUpCi0gICAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG9yIDxiPm51bGw8L2I+IGlmIG5vbmUgZXhpc3RzCi0gICAgICovCi0gICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBhIHN1cHBsaWVkIG9iamVjdCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgKGUuZy4gSVByb2plY3QgaWYgYXZhaWxhYmxlKQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29udGV4dCBoYXMgYW4gZXh0ZW5zaW9uIAotICAgICAqLwotICAgIGJvb2xlYW4gaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTAyMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSVdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgV3JhcHBlZFJ1bnRpbWUgYW5kIFdyYXBwZWQgZXhjZXB0aW9ucywgd2hpY2ggY2FuIGNvbnRhaW4gbmVzdGVkIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKTsKLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LAotICogY29uY2F0ZW5hdGVkIGFzIG9uZQotICovCi1wdWJsaWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCk7Ci1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxMThiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gYnVnIDIwNzgyNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotCi0KLS8qKgotICogVGhpcyBpcyBhIGNhdGFsb2cgb2YgdXNlZnVsIGNvbnN0YW50cyBmb3IgdGhlIGFyY2hpdmUgc3VwcG9ydC4gIENhbiBiZSB1c2VkIHRvCi0gKiBzdG9yZSByZWxhdGl2ZSBwYXRocyB0byBzcGVjaWZpYyB4bWwgYW5kIHhtaSByZXNvdXJjZXMuICAKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFQ29uc3RhbnRzIGV4dGVuZHMgSjJFRVZlcnNpb25Db25zdGFudHMgewotICAgIC8vU3RhbmRhcmQgSmFyIGluZm8KLSAgICAgICAgICAgIC8qKiAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIE1BTklGRVNUX1VSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgTUFOSUZFU1RfVVJJX09CSiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoTUFOSUZFU1RfVVJJKTsKLSAgICBTdHJpbmcgTUFOSUZFU1RfU0hPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJNQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgLyoqICJNRVRBLUlORiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBNRVRBX0lORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiV0VCLUlORiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgV0VCX0lORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfSU5GX0NMQVNTRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIldFQi1JTkYvY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX0lORl9MSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJXRUItSU5GL2xpYiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIkFMVC1JTkYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFMVF9JTkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiQUxULUlORiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvL0FwcGxpY2F0aW9uIGNsaWVudCBpbmZvCi0gICAgLyoqICJBcHBsaWNhdGlvbi1jbGllbnRfSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICJBcHBsaWNhdGlvbi1jbGllbnRfSUQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBBUFBfQ0xJRU5UX0REX1VSSSAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIEFQUF9DTElFTlRfRERfVVJJX09CSiAgICAgICAgICAgICAgID0gICAgICAgVVJJLmNyZWF0ZVVSSShBUFBfQ0xJRU5UX0REX1VSSSk7Ci0gICAgLyoqICJhcHBsaWNhdGlvbi1jbGllbnQueG1sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSAgICAgICAgID0gICAgICAgImFwcGxpY2F0aW9uLWNsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERvYyB0eXBlIGZvciBhcHAgY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9ET0NUWVBFICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJhcHBsaWNhdGlvbi1jbGllbnQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfUFVCTElDSURfMV8yICAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMi8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfUFVCTElDSURfMV8zICAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfU1lTVEVNSURfMV8yICAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzIgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbi1jbGllbnRfMS4yLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMgICAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMyAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xLjMuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV8xXzQgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfNSAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgLy8gVGhlIGZvbGxvd2luZyBpcyBzdGlsbCBzZXQgdG8gdGhlIEphdmEgRUUgNSBzY2hlbWEsIGJlY2F1c2UgdG8gZGF0ZSB0aGUgSmF2YSBFRSA2IG9uZSBpcyBub3QgeWV0IGRlZmluZWQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfNiAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiOyAvLyROT04tTkxTLTEkIC8vIEVKQjMKLSAgICAKLSAgICAvL0FwcGxpY2F0aW9uIGNvbnN0YW50cwotICAgIC8qKiAiQXBwbGljYXRpb25fSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFQUExfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJBcHBsaWNhdGlvbl9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQVBQTElDQVRJT05fRERfVVJJICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIEFQUExJQ0FUSU9OX0REX1VSSV9PQkogICAgICAgICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKEFQUExJQ0FUSU9OX0REX1VSSSk7Ci0gICAgLyoqICJhcHBsaWNhdGlvbi54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSAgICAgICAgPSAgICAgICAiYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFQVJfRklMRV9FWFQgPSAiLmVhciI7IC8vLy8kTk9OLU5MUy0xJAotICAgIC8qKiBEb2MgdHlwZSBmb3IgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotICAgIFN0cmluZyBBUFBMSUNBVElPTl9ET0NUWVBFICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9QVUJMSUNJRF8xXzIgICAgICAgICA9ICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMi8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMyAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQTElDQVRJT05fUFVCTElDSURfMV80ICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjQvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TWVNURU1JRF8xXzIgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbl8xXzIuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8yICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbl8xLjIuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TWVNURU1JRF8xXzMgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xLjMuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TWVNURU1JRF8xXzQgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzQuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV80ID0gICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzQuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfMV80ICAgICAgID0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfNSAgICAgICAgID0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgc3RpbGwgc2V0IHRvIHRoZSBKYXZhIEVFIDUgc2NoZW1hLCBiZWNhdXNlIHRvIGRhdGUgdGhlIEphdmEgRUUgNiBvbmUgaXMgbm90IHlldCBkZWZpbmVkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV82ICAgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiOyAvLyROT04tTkxTLTEkIAotICAgIAotICAgIC8vRUpCIEphciBDb25zdGFudHMKLSAgICAvKiogImVqYi1qYXJfSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEVKQkpBUl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJlamItamFyX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiQXNzZW1ibHlEZXNjcmlwdG9yX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFTU0VNQkxZREVTQ1JJUFRPUl9JRCAgICAgICAgPSAgICJBc3NlbWJseURlc2NyaXB0b3JfSUQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJlamItamFyLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBFSkJKQVJfRERfU0hPUlRfTkFNRSAgICAgICAgID0gICAiZWpiLWphci54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJNRVRBLUlORi9lamItamFyLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgRUpCSkFSX0REX1VSSSAgICAgICAgICAgICAgICA9ICAgIk1FVEEtSU5GL2VqYi1qYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFVSSSBFSkJKQVJfRERfVVJJX09CSiAgICAgICAgICAgICAgID0gICBVUkkuY3JlYXRlVVJJKEVKQkpBUl9ERF9VUkkpOwotICAgIC8qKiAiTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBFSkJKQVJfRE9DVFlQRSAgICAgICAgICAgICAgID0gICAgICAgImVqYi1qYXIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9QVUJMSUNJRF8xXzEgICAgICA9ICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfUFVCTElDSURfMl8wICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgRUpCSkFSX1NZU1RFTUlEXzFfMSAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvZWpiLWphcl8xXzEuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfQUxUX1NZU1RFTUlEXzFfMSAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9lamItamFyXzEuMS5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9TWVNURU1JRF8yXzAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgRUpCSkFSX0FMVF9TWVNURU1JRF8yXzAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yLjAuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzJfMSAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9TQ0hFTUFfMl8xX05TICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9TQ0hFTUFfM18wICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAKLSAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8zXzBfTlMgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBhcmUgc3RpbGwgc2V0IHRvIHRoZSBFSkIgMy4wIHNjaGVtYSwgYmVjYXVzZSB0byBkYXRlIHRoZSBFSkIgMy4xIG9uZSBpcyBub3QgeWV0IGRlZmluZWQKLSAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8zXzEgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiOyAvLyROT04tTkxTLTEkIAotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMV9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAKLSAgICAKLSAgICAvLyBFQVIgY29uc3RhbnRzCi0gICAgCi0gICAgU3RyaW5nIEVBUl9ST09UX0RJUgkJCQk9CSIvIjsKLSAgICBTdHJpbmcgRUFSX0RFRkFVTFRfTElCX0RJUgkJPQkiL2xpYiI7Ci0gICAgCi0gICAgLy9XZWIgYXBwIENvbnN0YW50cwotICAgIC8qKiAiV2ViQXBwX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgV0VCQVBQX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIldlYkFwcF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIldFQi1JTkYvd2ViLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBXRUJBUFBfRERfVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIldFQi1JTkYvd2ViLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgV0VCQVBQX0REX1VSSV9PQkogICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoV0VCQVBQX0REX1VSSSk7Ci0gICAgLyoqICJ3ZWIueG1sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBXRUJBUFBfRERfU0hPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIndlYi54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJXRUItSU5GL2libS13ZWItYm5kLnhtaSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqIERvYyB0eXBlIGZvciB3ZWIgYXBwIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLSAgICBTdHJpbmcgV0VCQVBQX0RPQ1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJ3ZWItYXBwIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBDT05URVhUUk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAiY29udGV4dC1yb290IjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJBUFBfUFVCTElDSURfMl8yICAgICAgICAgICAgICA9ICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX1BVQkxJQ0lEXzJfMyAgICAgICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQkFQUF9TWVNURU1JRF8yXzIgICAgICAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMl8yLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX0FMVF9TWVNURU1JRF8yXzIgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX1NZU1RFTUlEXzJfMyAgICAgICAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJBUFBfQUxUX1NZU1RFTUlEXzJfMyAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yLjMuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJBUFBfU0NIRU1BXzJfNCAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQkFQUF9TQ0hFTUFfMl81ICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIjsvLyROT04tTkxTLTEkCi0gICAgLy8gVGhlIGZvbGxvd2luZyBpcyBzdGlsbCBzZXQgdG8gdGhlIFNlcnZsZXQgMi41IHNjaGVtYSwgYmVjYXVzZSB0byBkYXRlIHRoZSBTZXJ2bGV0IDMuMCBvbmUgaXMgbm90IHlldCBkZWZpbmVkCi0gICAgU3RyaW5nIFdFQkFQUF9TQ0hFTUFfM18wICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIjsvLyROT04tTkxTLTEkCi0gICAgLy9KMkMgUmVzb3VyY2UgQWRhcHRlciBDb25zdGFudHMKLSAgICAvKiogIkoyQ1Jlc291cmNlQWRhcHRlcl9JRCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBSQVJfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiSjJDUmVzb3VyY2VBZGFwdGVyX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiTUVUQS1JTkYvcmEueG1sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIFJBUl9ERF9VUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJNRVRBLUlORi9yYS54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIFJBUl9ERF9VUklfT0JKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoUkFSX0REX1VSSSk7Ci0gICAgU3RyaW5nIFJBUl9TSE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAicmEueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vTmVlZCBjb25uZWN0b3IgY29uc3RhbnQuCi0gICAgU3RyaW5nIENPTk5FQ1RPUl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJDb25uZWN0b3JfSUQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqIERvYyB0eXBlIGZvciBjb25uZWN0b3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotICAgIFN0cmluZyBDT05ORUNUT1JfRE9DVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgImNvbm5lY3RvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCAgICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIENPTk5FQ1RPUl9TWVNURU1JRF8xXzAgICAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBDT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMS4wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQ09OTkVDVE9SX1NDSEVNQV8xXzUgICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBDT05ORUNUT1JfU0NIRU1BXzFfNiAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9jb25uZWN0b3JfMV82LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIC8vV2ViIFNlcnZpY2VzIENvbnN0YW50cwotICAgIC8qKiBEb2MgdHlwZSBmb3Igd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX0RPQ1RZUEUgICAgICA9ICJ3ZWJzZXJ2aWNlc2NsaWVudCI7ICAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfUFVCTElDSURfMV8wID0gIi0vL0lCTSBDb3Jwb3JhdGlvbiwgSW5jLi8vRFREIEoyRUUgV2ViIHNlcnZpY2VzIGNsaWVudCAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1NZU1RFTUlEXzFfMCA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJCAgCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfTE9DXzFfMSA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSAgICA9ICJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfRERfVVJJICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJICAgICAgPSAgICJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUkkgICAgICAgPSAgICJXRUItSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgV0VCX1NFUlZJQ0VTX0NMSUVOVF9ERF9VUklfT0JKICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfQ0xJRU5UX0REX1VSSSk7Ci0gICAgVVJJIFdFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJX09CSiAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJKTsKLSAgICBVUkkgV0VCX1NFUlZJQ0VTX0NMSUVOVF9XRUJfSU5GX0REX1VSSV9PQkogICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoV0VCX1NFUlZJQ0VTX0NMSUVOVF9XRUJfSU5GX0REX1VSSSk7Ci0gICAgCi0gICAgLyoqIERvYyB0eXBlIGZvciB3ZWJzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19ET0NUWVBFICAgICAgCQk9ICJ3ZWJzZXJ2aWNlcyI7ICAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19ERF9VUkkgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAid2Vic2VydmljZXMueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJICAgICA9ICAgIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX1dFQl9JTkZfRERfVVJJICAgICAgPSAgICJXRUItSU5GL3dlYnNlcnZpY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgV0VCX1NFUlZJQ0VTX0REX1VSSV9PQkogICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoV0VCX1NFUlZJQ0VTX0REX1VSSSk7Ci0gICAgVVJJIFdFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKICAgID0gVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJKTsKLSAgICBVUkkgV0VCX1NFUlZJQ0VTX1dFQl9JTkZfRERfVVJJX09CSiAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSSk7Ci0gICAgU3RyaW5nIFdFQlNFUlZJQ0VfU1lTVEVNSUQgICAgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJTRVJWSUNFX1BVQkxJQ0lEID0gIi0vL0lCTSBDb3Jwb3JhdGlvbiwgSW5jLi8vRFREIEoyRUUgV2ViIHNlcnZpY2VzIDEuMC8vRU4iOyAvLyROT04tTkxTLTEkICAKLSAgICBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfMV8xID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8xID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV8xXzIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vTWlzY2VsbGFuZW91cyBjb25zdGFudHMKLSAgICAvKiogIlVURi04IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgREVGQVVMVF9YTUxfRU5DT0RJTkcgICAgICAgICAgICAgPSAgICAgICAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICIxLjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIERFRkFVTFRfWE1MX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiMS4wIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBKQVZBX1NVTl9DT01fVVJMICAgICAgICAgICAgICAgICAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbSI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV1dXX1czX09SR19VUkwgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgImh0dHA6Ly93d3cudzMub3JnIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXV1dfSUJNX0NPTV9VUkwgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAiaHR0cDovL3d3dy5pYm0uY29tIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIFN0cmluZyBKMkVFX05TX1VSTCAgICAgICAgICAgICAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBKQVZBRUVfTlNfVVJMICAgICAgICAgICAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiOyAvLyROT04tTkxTLTEkIC8vRUpCMwotICAgIFN0cmluZyBKMkVFXzFfNF9YU0RfU0hPUlRfTkFNRSAgICAgICAgICA9ICJqMmVlXzFfNC54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEpBVkFFRV81X1hTRF9TSE9SVF9OQU1FICAgICAgICAgID0gImphdmFlZV81LnhzZCI7IC8vJE5PTi1OTFMtMSQgIC8vRUpCMwotICAgIFN0cmluZyBYU0lfTlNfVVJMICAgICAgICAgICAgICAgICAgICAgICA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQgCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfMV80ICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQTElDQVRJT05fU0NIRU1BX0xPQ181ICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIjsgLy8kTk9OLU5MUy0xJCAgICAgICAgLy8gRUpCMwotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV9MT0NfMV80ICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV9MT0NfNSAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIjsgLy8kTk9OLU5MUy0xJCAvL0VKQjMKLSAgICBTdHJpbmcgRUpCX0pBUl9TQ0hFTUFfTE9DXzJfMSAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQl9KQVJfU0NIRU1BX0xPQ18zXzAgICAgCQk9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAvLyBFSkIzCi0gICAgU3RyaW5nIENPTk5FQ1RPUl9TQ0hFTUFfTE9DXzFfNSAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9BUFBfU0NIRU1BX0xPQ18yXzQgICAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfQVBQX1NDSEVNQV9MT0NfMl81ICAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIjsgLy8kTk9OLU5MUy0xJCAvL0VKQjMKLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TQ0hFTUFfTE9DXzFfMSA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBKU1BfU0NIRU1BX0xPQ18yXzAgICAgICAgICAgICAgICA9ICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qc3BfMl8wLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgSlNQX1NDSEVNQV9MT0NfMl8xICAgICAgICAgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qc3BfMl8xLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX01PREVMX05BTUUgPSAiRUFSX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMWM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFWE1JUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJBcHBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkVuY29kZXJEZWNvZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QYXNzd29yZEVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMy8yMDAwIDM6MDc6MzcgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFSW5pdCB7Ci0JCi0JCi0Jc3RhdGljIHsKLQkJdHJ5IHsgCi0JCQlpZihCb29sZWFuLmdldEJvb2xlYW4oIkxPR19YRVJDRVNfVkVSU0lPTiIpKSB7CQkJCSAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3MgY2x6ID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUueGVyY2VzLmltcGwuVmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kIG1haW4gPSBjbHouZ2V0RGVjbGFyZWRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7IFN0cmluZ1tdLmNsYXNzIH0gKTsgLy8kTk9OLU5MUy0xJAotCQkJCU9iamVjdCB2ZXJzaW9uID0gY2x6Lm5ld0luc3RhbmNlKCk7Ci0JCQkJbWFpbi5pbnZva2UodmVyc2lvbiwgbmV3IE9iamVjdFtdIHsgbmV3IFN0cmluZ1tdIHt9IH0pOyAKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2x6LmdldFJlc291cmNlKCJWZXJzaW9uLmNsYXNzIikpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gd2hpbGUgbG9nZ2luZyB2ZXJzaW9uICIgKyB0KTsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCk7Ci0JCQlET01VdGlsaXRpZXMuc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRSk7Ci0JCQlvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0LkphdmFJbml0LmluaXQoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyk7Ci0JCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykKLQkJCQlwcmVSZWdpc3RlclBhY2thZ2VzKCk7Ci0JCQlpbml0UmVzb3VyY2VGYWN0b3JpZXMoKTsKLQkJCUVqYkZhY3RvcnlJbXBsLmludGVybmFsUmVnaXN0ZXJFSkJSZWxhdGlvbkFkYXB0ZXJGYWN0b3J5KG5ldyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoKSB7Ci0JCQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQkJCQlyZXR1cm4gbmV3IEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUVqYkZhY3RvcnlJbXBsLmludGVybmFsUmVnaXN0ZXJSZWxhdGlvbnNoaXBzQWRhcHRlckZhY3RvcnkobmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcigpIHsKLQkJCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQkJCXJldHVybiBuZXcgRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbCgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCX0KLQl9Ci0KLQkvKiogCi0JICogSWYgdGhlIGN1cnJlbnRseSBkZWZhdWx0ZWQgZW5jb2RlciBpcyB0aGUgaW5pdGlhbCBwYXNzIHRocnUgZW5jb2RlciwKLQkgKiB0aGVuIHJlZ2lzdGVyIGEgUGFzc3dvcmQgZW5jb2RlciBmb3Igc2VjdXJpdHk7IG90aGVyd2lzZSBpZiBhIG1vcmUgc29waGlzdGljYXRlZAotCSAqIGVuY29kZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGVuIGRvIG5vdGhpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCUVuY29kZXJEZWNvZGVyUmVnaXN0cnkgcmVnID0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZy5nZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSA9PSBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LklOSVRJQUxfREVGQVVMVF9FTkNPREVSKSB7Ci0JCQlyZWcuc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKG5ldyBQYXNzd29yZEVuY29kZXJEZWNvZGVyKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2VzKCkgewotCQkvL2NvbW1vbgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImNvbW1vbi54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2FwcGxpY2F0aW9uCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiYXBwbGljYXRpb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vY2xpZW50Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiY2xpZW50LnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBDbGllbnRGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vd2ViYXBwbGljYXRpb24KLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJ3ZWJhcHBsaWNhdGlvbi54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9lamIKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJlamIueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9qY2EKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJqY2EueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIEpjYUZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy93ZWJzZXJ2aWNlc2NsaWVudAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndlYnNlcnZpY2VfY2xpZW50LnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL3dlYnNlcnZpY2VzY29tbW9uCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgid3Njb21tb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vd2Vic2VydmljZXNkZAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndzZGQueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBXc2RkRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2pheHJwY21hcAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImpheHJwY21hcC54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwkJCi0vLwkJanNwCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgianNwLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBKc3BGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vdGFnbGliCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgidGFnbGliLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBUYWdsaWJGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7CQotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlRmFjdG9yaWVzKCkgewotCQkvL01ha2UgcHJvdGVjdGVkCQotCQlSZXZpc2l0LnJldmlzaXQoKTsKLQotCQkvLyBPbmx5IHJlZ2lzdGVyIHRoZSBkZWZhdWx0IGZhY3RvcmllcyBpZiBhbm90aGVyIHNldCBoYXMgbm90Ci0JCS8vIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLgotCi0JCVJlc291cmNlLkZhY3RvcnkgajJlZSA9IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSV9PQkopOwotCQlSZXNvdXJjZS5GYWN0b3J5IGRlZmF1bHRGYWN0ID0gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKSk7Ci0JCWlmIChqMmVlID09IGRlZmF1bHRGYWN0KSB7Ci0JCQlFSkJKYXJSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCVdlYkFwcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCUFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCVdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXc2RkUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQkvL3JlZ2lzdGVyKCkgaXMgbm90IGNhbGxlZCBvbiB0aGUgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5IGJlY2F1c2UKLQkJCS8vdGhlIGpheHByYy1tYXBwaW5nIGRlc2NyaXB0b3IgZG9lcyBub3QgaGF2ZSBhIHN0YW5kYXJkIHNob3J0IG5hbWUuCi0JCQkvL1RoZSBzaG9ydCBuYW1lcyBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgb25jZSB0aGV5IGFyZSBrbm93bi4KLQkJCUoyRUVYTUlSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJfQotCQlFSkJKYXJSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JCVdlYkFwcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JCUFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlXc2RkUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbHVnaW5Jbml0KGJvb2xlYW4gYlBsdWdpbkluaXQpIHsKLQkJLy8gSGVyZSdzIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd291bGQgYmUgcmVhZC4KLQkJcGx1Z2luX2luaXRpYWxpemVkID0gYlBsdWdpbkluaXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU1vZHVsZUV4dGVuc2lvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU1vZHVsZUV4dGVuc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjhiODRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIgewotCVN0cmluZyBnZXREb2NUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTXVsdGlTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNdWx0aVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY5MWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNdWx0aVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTXVsdGlTdGF0dXMgZXh0ZW5kcyBKMkVFU3RhdHVzIHsKLQlwcml2YXRlIEoyRUVTdGF0dXNbXSBjaGlsZHJlbiA9IG5ldyBKMkVFU3RhdHVzWzBdOwotCi0JcHVibGljIHZvaWQgYWRkKEoyRUVTdGF0dXMgc3RhdHVzKSB7Ci0JCUoyRUVTdGF0dXNbXSByZXN1bHQgPQotCQkJbmV3IEoyRUVTdGF0dXNbY2hpbGRyZW4ubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIHJlc3VsdCwgMCwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHN0YXR1czsKLQkJY2hpbGRyZW4gPSByZXN1bHQ7Ci0JCWludCBuZXdTZXYgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaW50IGN1cnJlbnRTZXYgPSBnZXRTZXZlcml0eSgpOwotCQkvKiBJZiBhbGwgdGhlIHN0YXR1c2VzIGFyZSBOT1RfTkVFREVEIE9SIE5PVF9QT1NTSUJMRSwgeW91IHdhbnQgdGhlIGNvbWJpbmVkIHN0YXR1cyB0byBiZSB0aGUgaGlnaGVzdCBzZXZlcml0eQotCQkgKiBob3dldmVyLCBpZiBhbGwgYnV0IG9uZSBzdGF0dXMgYXJlIE5PVF9ORUVERUQgb3IgTk9UX1BPU1NJQkxFLCBhbmQgb25lIHN0YXR1cyBjb21wbGV0ZWQsIHRoZW4gdGhlIGNvbWJpbmVkIHN0YXR1cwotCQkgKiBzaG91bGQgYmUgT0suICBJZiB0aGVyZSBpcyBhIHdhcm5pbmcgb3IgZXJyb3IsIHRoZW4gdGhleSB0YWtlIHByZWNlZGVuY2UKLQkJICovCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSkKLQkJCXNldFNldmVyaXR5KG5ld1Nldik7Ci0JCWVsc2UgaWYgKGN1cnJlbnRTZXYgPiBDT01QTEVURURfT0sgJiYgY3VycmVudFNldiA8IFdBUk5JTkcgJiYgbmV3U2V2ID09IENPTVBMRVRFRF9PSykKLQkJCXNldFNldmVyaXR5KG5ld1Nldik7Ci0JCWVsc2UgaWYgKG5ld1NldiA+IGN1cnJlbnRTZXYgJiYgKGN1cnJlbnRTZXYgIT0gQ09NUExFVEVEX09LIHx8IG5ld1NldiA+PSBXQVJOSU5HKSApCi0JCQlzZXRTZXZlcml0eShuZXdTZXYpOwotCi0JfQotCS8qKgotCSAqIEFkZHMgYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gc3RhdHVzIHRvIHRoaXMgbXVsdGktc3RhdHVzLgotCSAqIERvZXMgbm90aGluZyBpZiB0aGUgZ2l2ZW4gc3RhdHVzIGhhcyBubyBjaGlsZHJlbiAod2hpY2ggaW5jbHVkZXMKLQkgKiB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgYSBtdWx0aS1zdGF0dXMpLgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHdob3NlIGNoaWxkcmVuIGFyZSB0byBiZSBhZGRlZCB0byB0aGlzIG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbChKMkVFU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUoyRUVTdGF0dXNbXSBzdGF0dXNlcyA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGQoc3RhdHVzZXNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIEoyRUVTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBNZXJnZXMgdGhlIGdpdmVuIHN0YXR1cyBpbnRvIHRoaXMgbXVsdGktc3RhdHVzLgotCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+YWRkKHN0YXR1cyk8L2NvZGU+IGlmIHRoZQotCSAqIGdpdmVuIHN0YXR1cyBpcyBub3QgYSBtdWx0aS1zdGF0dXMuIAotCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+YWRkQWxsKHN0YXR1cyk8L2NvZGU+IGlmIHRoZQotCSAqIGdpdmVuIHN0YXR1cyBpcyBhIG11bHRpLXN0YXR1cy4gCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgdG8gbWVyZ2UgaW50byB0aGlzIG9uZQotCSAqIEBzZWUgI2FkZAotCSAqIEBzZWUgI2FkZEFsbAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlKEoyRUVTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlhZGQoc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWFkZEFsbChzdGF0dXMpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cywgc3VpdGFibGUgCi0JICogZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWYuYXBwZW5kKCIgY2hpbGRyZW49eyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlidWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWYuYXBwZW5kKGNoaWxkcmVuW2ldLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmhlbHBlci5KMkVFU3RhdHVzI2FwcGVuZChKMkVFU3RhdHVzKQotCSAqLwotCXB1YmxpYyBKMkVFU3RhdHVzIGFwcGVuZChKMkVFU3RhdHVzIGFTdGF0dXMpIHsKLQkJaWYgKGFTdGF0dXMgIT0gbnVsbCkKLQkJCW1lcmdlKGFTdGF0dXMpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA9PSAwOwotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTcGVjaWZpY2F0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3BlY2lmaWNhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM2MDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTcGVjaWZpY2F0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRVNwZWNpZmljYXRpb25Db25zdGFudHMgewotCVN0cmluZyBKMkVFX1ZFUlNJT05fMV8yID0gIkoyRUVfMS4yIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMyA9ICJKMkVFXzEuMyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzQgPSAiSjJFRV8xLjQiOyAgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkRFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0c7IAotCVN0cmluZyBERUZBVUxUX05PVF9ORUVERURfU1RBVFVTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0c7IAotCVN0cmluZyBERUZBVUxUX05PVF9QT1NTSUJMRV9TVEFUVVNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5ERUZBVUxUX05PVF9QT1NTSUJMRV9TVEFUVVNfTVNHOyAKLQlTdHJpbmcgREVGQVVMVF9FUlJPUl9TVEFUVVNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5ERUZBVUxUX0VSUk9SX1NUQVRVU19NU0c7IAotCQotCVN0cmluZyBSRU1PVkVEX0xPQ0FMX0NMSUVOVF9NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlJFTU9WRURfTE9DQUxfQ0xJRU5UX01TRzsgCi0JU3RyaW5nIFJFTU9WRURfQUNDRVNTX0lOVEVOVFNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5SRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRzsgCi0JU3RyaW5nIFJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0c7IAotCVN0cmluZyBDT05WRVJURURfRklOREVSX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuQ09OVkVSVEVEX0ZJTkRFUl9NU0c7IAotCVN0cmluZyBVTk5BTUVEX0VKQiA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuVU5OQU1FRF9FSkI7IAotCVN0cmluZyBDT05WRVJURURfUVVFUllfREVTQ1JJUFRJT04gPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkNPTlZFUlRFRF9RVUVSWV9ERVNDUklQVElPTjsgCi0JU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9KQVJfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfSkFSX01TRzsgCi0JU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0cgCSAgID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHOyAKLQlTdHJpbmcgRVJST1JfVEVYVCA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuRVJST1I7IAotCVN0cmluZyBXQVJOSU5HX1RFWFQgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLldBUk5JTkc7IAotCVN0cmluZyBJTkZPX1RFWFQgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLklORk87IAotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5YjJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVN0YXR1cyBpbXBsZW1lbnRzIEoyRUVTcGVjaWZpY2F0aW9uQ29uc3RhbnRzIHsgCi0gICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVEX09LID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfTkVFREVEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfUE9TU0lCTEUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsgCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEoyRUVTdGF0dXMgT0tfU1RBVFVTID0gbmV3IEoyRUVTdGF0dXMoQ09NUExFVEVEX09LLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEoyRUVTdGF0dXNbXSBFbXB0eVN0YXR1c0FycmF5ID0gbmV3IEoyRUVTdGF0dXNbMF07Ci0KLQlwcml2YXRlIGludCBzZXZlcml0eTsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCXByaXZhdGUgWE1MUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldE9iamVjdDsKLQkKLQlwdWJsaWMgSjJFRVN0YXR1cygpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHVibGljIEoyRUVTdGF0dXMoaW50IGFTZXZlcml0eSwgU3RyaW5nIGFNZXNzYWdlKSB7Ci0JCXRoaXMoYVNldmVyaXR5LCAoRU9iamVjdCludWxsLCBhTWVzc2FnZSk7Ci0JfQotCXB1YmxpYyBKMkVFU3RhdHVzKGludCBhU2V2ZXJpdHksIFhNTFJlc291cmNlIHhtbFJlc291cmNlKSB7Ci0JCXRoaXMoYVNldmVyaXR5LCB4bWxSZXNvdXJjZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKMkVFU3RhdHVzKGludCBhU2V2ZXJpdHksIEVPYmplY3QgYW5PYmplY3QpIHsKLQkJdGhpcyhhU2V2ZXJpdHksIGFuT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSwgU3RyaW5nIGFNZXNzYWdlKSB7Ci0JCXNldmVyaXR5ID0gYVNldmVyaXR5OwotCQlyZXNvdXJjZSA9IHhtbFJlc291cmNlOwotCQltZXNzYWdlID0gYU1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBKMkVFU3RhdHVzKGludCBhU2V2ZXJpdHksIEVPYmplY3QgYW5PYmplY3QsIFN0cmluZyBhTWVzc2FnZSkgewotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJdGFyZ2V0T2JqZWN0ID0gYW5PYmplY3Q7Ci0JCW1lc3NhZ2UgPSBhTWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGFQYXR0ZXJuLCBTdHJpbmcgYXJnMSkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoYVBhdHRlcm4sIG5ldyBTdHJpbmdbXXthcmcxfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gY3JlYXRlRGVmYXVsdE1lc3NhZ2UoKTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUZvckRpc3BsYXkoKSB7Ci0JCXJldHVybiBnZXRTZXZlcml0eVRleHQoKSsiICIrZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2V2ZXJpdHlUZXh0KCkgewotCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQljYXNlIEVSUk9SOgotCQkJCXJldHVybiBFUlJPUl9URVhUOwotCQkJY2FzZSBXQVJOSU5HOgotCQkJCXJldHVybiBXQVJOSU5HX1RFWFQ7Ci0JCQljYXNlIE5PVF9ORUVERUQ6Ci0JCQljYXNlIE5PVF9QT1NTSUJMRToKLQkJCQlyZXR1cm4gSU5GT19URVhUOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjcmVhdGVEZWZhdWx0TWVzc2FnZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURlZmF1bHRNZXNzYWdlKCkgewotCQlTdHJpbmcgb2JqRGVzYzsKLQkJaWYgKGdldFJlc291cmNlKCkgIT0gbnVsbCkKLQkJCW9iakRlc2MgPSBnZXRSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgaWYgKGdldFRhcmdldE9iamVjdCgpICE9IG51bGwgJiYgZ2V0VGFyZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBFTmFtZWRFbGVtZW50KQotCQkJb2JqRGVzYyA9ICgoRU5hbWVkRWxlbWVudCkgZ2V0VGFyZ2V0T2JqZWN0KCkpLmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCXN3aXRjaCAoZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBDT01QTEVURURfT0sgOgotCQkJCXJldHVybiBmb3JtYXQoREVGQVVMVF9DT01QTEVURURfU1RBVFVTX01TRywgb2JqRGVzYyk7Ci0JCQljYXNlIE5PVF9ORUVERUQgOgotCQkJCXJldHVybiBmb3JtYXQoREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQkJY2FzZSBOT1RfUE9TU0lCTEUgOgotCQkJCXJldHVybiBmb3JtYXQoREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRywgb2JqRGVzYyk7Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfRVJST1JfU1RBVFVTX01TRywgb2JqRGVzYyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWlncmF0aW9uIHdhcyBjb21wbGV0ZWQgZmluZSBvciB3YXMgbm90IG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09LKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gQ09NUExFVEVEX09LIHx8IHNldmVyaXR5ID09IE5PVF9ORUVERUQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZXJyb3Igb2N1cnJlZCBkdXJpbmcgbWlncmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiBzZXZlcml0eSA9PSBFUlJPUjsKLQl9Ci0JCi0JLyoqCi0JICogQSB3YXJuaW5nIG9jdXJyZWQgZHVyaW5nIG1pZ3JhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiBzZXZlcml0eSA9PSBXQVJOSU5HOwotCX0KLQotCS8qKgotCSAqIFRoZSBtaWdyYXRpb24gd2FzIG5vdCByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE5lZWRlZCgpIHsKLQkJcmV0dXJuIHNldmVyaXR5ID09IE5PVF9ORUVERUQ7Ci0JfQotCS8qKgotCSAqIFRoZSBtaWdyYXRpb24gd2FzIG5vdCBwb3NzaWJsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc3NpYmxlKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gTk9UX1BPU1NJQkxFOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXZlcml0eS4KLQkgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIEoyRUVTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIEVtcHR5U3RhdHVzQXJyYXk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgWE1MUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIk1pZ3JhdGlvblN0YXR1cyAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2V2ZXJpdHkgPT0gQ09NUExFVEVEX09LKSB7Ci0JCQlidWYuYXBwZW5kKCJDb21wbGV0ZWQgT0siKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IEVSUk9SKSB7Ci0JCQlidWYuYXBwZW5kKCJFUlJPUiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gV0FSTklORykgewotCQkJYnVmLmFwcGVuZCgiV0FSTklORyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gTk9UX05FRURFRCkgewotCQkJYnVmLmFwcGVuZCgiTm90IE5lZWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gTk9UX1BPU1NJQkxFKSB7Ci0JCQlidWYuYXBwZW5kKCJOb3QgUG9zc2libGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgic2V2ZXJpdHk9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoc2V2ZXJpdHkpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJYnVmLmFwcGVuZChtZXNzYWdlKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgdGhlIHBhcmFtYXRlciB0byB0aGlzIHN0YXR1cywgYW5kIHJldHVybiB0aGUgcmVzdWx0YW50IHN0YXR1czsKLQkgKiBjbGllbnRzIG11c3QgYmUgY2FyZWZ1bCB0byBzZXQgdGhlaXIgY2FjaGVkIHN0YXR1cyB0byB0aGUgcmV0dXJuIHZhbHVlLCAKLQkgKiBhcyBpdCBtYXkgYmUgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEoyRUVTdGF0dXMgYXBwZW5kKEoyRUVTdGF0dXMgYVN0YXR1cykgewotCQlpZiAoYVN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIHRoaXM7Ci0JCUoyRUVNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBKMkVFTXVsdGlTdGF0dXMoKTsKLQkJbXVsdGkubWVyZ2UodGhpcyk7Ci0JCW11bHRpLm1lcmdlKGFTdGF0dXMpOwotCQlyZXR1cm4gbXVsdGk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFVmVyc2lvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliOTUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFVmVyc2lvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTYsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHdpdGggdGhlIFhNTFJlc291cmNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRVZlcnNpb25Db25zdGFudHMgewotCQotCXB1YmxpYyBpbnQgVU5LTk9XTiA9IC0xOwotCXB1YmxpYyBpbnQgRUpCX1RZUEUgPSAwOwotCXB1YmxpYyBpbnQgQVBQTElDQVRJT05fVFlQRSA9IDE7Ci0JcHVibGljIGludCBDT05ORUNUT1JfVFlQRSA9IDI7Ci0JcHVibGljIGludCBBUFBMSUNBVElPTl9DTElFTlRfVFlQRSA9IDM7Ci0JcHVibGljIGludCBXRUJfVFlQRSA9IDQ7Ci0JcHVibGljIGludCBXRUJTRVJWSUNFU19UWVBFID0gNTsKLQkKLQlwdWJsaWMgaW50IEoyRUVfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKMkVFXzFfM19JRCA9IDEzOwotCXB1YmxpYyBpbnQgSjJFRV8xXzRfSUQgPSAxNDsKLQlwdWJsaWMgaW50IEpFRV81XzBfSUQgPSA1MDsKLQlwdWJsaWMgaW50IEpFRV82XzBfSUQgPSA2MDsKLQlwdWJsaWMgaW50IEVKQl8xXzBfSUQgPSAxMDsJCi0JcHVibGljIGludCBFSkJfMV8xX0lEID0gMTE7CQotCXB1YmxpYyBpbnQgRUpCXzJfMF9JRCA9IDIwOwkKLQlwdWJsaWMgaW50IEVKQl8yXzFfSUQgPSAyMTsJCi0JcHVibGljIGludCBFSkJfM18wX0lEID0gMzA7Ci0JcHVibGljIGludCBFSkJfM18xX0lEID0gMzE7Ci0JcHVibGljIGludCBXRUJfMl8yX0lEID0gMjI7Ci0JcHVibGljIGludCBXRUJfMl8zX0lEID0gMjM7Ci0JcHVibGljIGludCBXRUJfMl80X0lEID0gMjQ7Ci0JcHVibGljIGludCBXRUJfMl81X0lEID0gMjU7Ci0JcHVibGljIGludCBXRUJfM18wX0lEID0gMzA7Ci0JcHVibGljIGludCBUQUdMSUJfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBUQUdMSUJfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBUQUdMSUJfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBKU1BfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBKU1BfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKU1BfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBTRVJWTEVUXzJfMiA9IDIyOwotCXB1YmxpYyBpbnQgU0VSVkxFVF8yXzMgPSAyMzsKLQlwdWJsaWMgaW50IFNFUlZMRVRfMl80ID0gMjQ7Ci0JcHVibGljIGludCBTRVJWTEVUXzJfNSA9IDI1OwotCXB1YmxpYyBpbnQgU0VSVkxFVF8zXzAgPSAzMDsKLQlwdWJsaWMgaW50IEpDQV8xXzBfSUQgPSAxMDsKLQlwdWJsaWMgaW50IEpDQV8xXzVfSUQgPSAxNTsKLQlwdWJsaWMgaW50IEpDQV8xXzZfSUQgPSAxNjsKLQlwdWJsaWMgaW50IFdFQlNFUlZJQ0VTXzFfMF9JRCA9IDEwOwotCXB1YmxpYyBpbnQgV0VCU0VSVklDRVNfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBXRUJTRVJWSUNFU18xXzJfSUQgPSAxMjsKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMV80X1RFWFQgCQk9ICIxLjQiOyAvLyROT04tTkxTLTEkCi0JCi0KLQotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzAgPSAxMDsJCi0JcHVibGljIGludCBWRVJTSU9OXzFfMSA9IDExOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMV8yID0gMTI7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzMgPSAxMzsJCi0JcHVibGljIGludCBWRVJTSU9OXzFfNCA9IDE0OwotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzUgPSAxNTsKLQlwdWJsaWMgaW50IFZFUlNJT05fMV82ID0gMTY7Ci0JcHVibGljIGludCBWRVJTSU9OXzJfMCA9IDIwOwotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzEgPSAyMTsJCi0JcHVibGljIGludCBWRVJTSU9OXzJfMiA9IDIyOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMl8zID0gMjM7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzQgPSAyNDsJCi0JcHVibGljIGludCBWRVJTSU9OXzJfNSA9IDI1OyAKLQlwdWJsaWMgaW50IFZFUlNJT05fM18wID0gMzA7IAotCXB1YmxpYyBpbnQgVkVSU0lPTl8zXzEgPSAzMTsgCi0JcHVibGljIGludCBWRVJTSU9OXzVfMCA9IDUwOyAKLQlwdWJsaWMgaW50IFZFUlNJT05fNl8wID0gNjA7IAotCQotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzBfVEVYVAkJPSAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzFfVEVYVCAgICAJPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzJfVEVYVAkJPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzNfVEVYVAkJPSAiMS4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzRfVEVYVAkJPSAiMS40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzVfVEVYVAkJPSAiMS41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzZfVEVYVAkJPSAiMS42IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzBfVEVYVAkJPSAiMi4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzFfVEVYVAkJPSAiMi4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzJfVEVYVAkJPSAiMi4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzNfVEVYVAkJPSAiMi4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzRfVEVYVAkJPSAiMi40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzVfVEVYVAkJPSAiMi41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8zXzBfVEVYVAkJPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8zXzFfVEVYVAkJPSAiMy4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81XzBfVEVYVAkJPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl82XzBfVEVYVAkJPSAiNi4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81X1RFWFQgICAgICAgID0gIjUiOyAgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDgzOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTU9GSjJFRVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1vZmoyZWUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTU9GSjJFRVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0VSUk9SX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFRF9MT0NBTF9DTElFTlRfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRURfQUNDRVNTX0lOVEVOVFNfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVkVSVEVEX0ZJTkRFUl9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU5OQU1FRF9FSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVkVSVEVEX1FVRVJZX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9KQVJfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OX05VTExfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OX1BST1hZX0VSUk9SOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTU9GSjJFRVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMjEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMsIHdoZXJlIGEgY2F1Z2h0IGV4Y2VwdGlvbgotICogY2F1c2VzIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRocm93bgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBleGNlcHRpb24gKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbjsKLQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIoKTsKLQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci19Ci1wdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIocyk7Ci0Jc2V0TmVzdGVkRXhjZXB0aW9uKGUpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpIHsKLQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldEFsbE1lc3NhZ2VzKHRoaXMpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsCi0gKiBjb25jYXRlbmF0ZWQgYXMgb25lCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkgewotCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXModGhpcyk7Ci19Ci1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKSB7Ci0JcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLX0KLS8qKgotICogQWRkZWQgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciB0aGUgSmF2YSAxLjQuMiBhZGRpdGlvbiBvZgotICogPGNvZGU+VGhyb3dhYmxlLmdldENhdXNlKCk8L2NvZGU+LgotICovCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpIHsKLQlyZXR1cm4gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci19Ci0vKioKLSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotICovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotfQotLyoqCi0qIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCi0qIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0qLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQlzLnByaW50bG4odGhpcyk7Ci0JCXMucHJpbnRsbihNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlKTsgLy8gPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfSBlbHNlIHsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCX0KLX0KLS8qKgotKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgotKiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJcy5wcmludGxuKHRoaXMpOwotCQlzLnByaW50bG4oTU9GSjJFRVJlc291cmNlSGFuZGxlci5TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZSk7IC8vID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCX0gZWxzZSB7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBzZXROZXN0ZWRFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbiBuZXdOZXN0ZWRFeGNlcHRpb24pIHsKLQluZXN0ZWRFeGNlcHRpb24gPSBuZXdOZXN0ZWRFeGNlcHRpb247Ci0gICAgaW5pdENhdXNlKG5ld05lc3RlZEV4Y2VwdGlvbik7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2ExYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLQotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTI2NzUzMDgyNzIxMjcxMDIxTDsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBydW50aW1lIGV4Y2VwdGlvbiwgaWYgb25lIGV4aXN0cyAqLwotCXByb3RlY3RlZCBFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uOwotcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQlzdXBlcigpOwotCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLX0KLXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCXN1cGVyKHMpOwotCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKSB7Ci0JcmV0dXJuIEV4Y2VwdGlvbkhlbHBlci5nZXRBbGxNZXNzYWdlcyh0aGlzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LAotICogY29uY2F0ZW5hdGVkIGFzIG9uZQotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpIHsKLQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKHRoaXMpOwotfQotLyoqCi0gKiBAcmV0dXJuIGphdmEubGFuZy5FeGNlcHRpb24KLSAqLwotcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCkgewotCXJldHVybiBuZXN0ZWRFeGNlcHRpb247Ci19Ci0vKioKLSAqIEFkZGVkIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgdGhlIEphdmEgMS40LjIgYWRkaXRpb24gb2YKLSAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPi4KLSAqIEByZXR1cm4gVGhlIG5lc3RlZCBleGNlcHRpb24gaGVsZCBieSB0aGUgcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkgewotCXJldHVybiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLX0KLS8qKgotICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0gKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci19Ci0vKioKLSogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KLSogSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLSovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCXMucHJpbnRsbih0aGlzKTsKLQkJcy5wcmludGxuKE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2UpOyAvLyA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQl9IGVsc2UgewotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfQotfQotLyoqCi0qIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCi0qIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0qLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgewotCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQlzLnByaW50bG4odGhpcyk7Ci0JCXMucHJpbnRsbihNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlKTsgLy8gPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfSBlbHNlIHsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCX0KLX0KLS8qKgotICogQHBhcmFtIG5ld05lc3RlZEV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHNldE5lc3RlZEV4Y2VwdGlvbihqYXZhLmxhbmcuRXhjZXB0aW9uIG5ld05lc3RlZEV4Y2VwdGlvbikgewotCW5lc3RlZEV4Y2VwdGlvbiA9IG5ld05lc3RlZEV4Y2VwdGlvbjsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVWZXJzaW9uUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5MWY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDb21tb24gSW50ZXJmYWNlIHVzZWQgdG8gY2hlY2sgdmVyc2lvbiBvZiBKMkVFIG1vZGVsIHJlc291cmNlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVWZXJzaW9uUmVzb3VyY2UgewotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpOwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMTU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGw7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgcmVxdWlyZWQgLSBjaGFuZ2UgdG8gZXh0ZW5kIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwKLSAqLwotcHVibGljIGNsYXNzIEoyRUVYTUlSZXNvdXJjZSBleHRlbmRzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBKMkVFVmVyc2lvblJlc291cmNlewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVYTUlSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSjJFRVhNSVJlc291cmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFWE1JUmVzb3VyY2UuCi0JICogQHBhcmFtIHVyaQotCSAqLwotCXB1YmxpYyBKMkVFWE1JUmVzb3VyY2UoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRKMkVFVmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRNb2R1bGVWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbklEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU2MmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeTsKLQotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG5zc2hldGgKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFWE1JUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgSjJFRVhNSVJlc291cmNlRmFjdG9yeSgpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OLCBJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJSjJFRVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEoyRUVYTUlSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1hNTFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjYjk1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFJlc291cmNlIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlLCBKMkVFVmVyc2lvbkNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVF9UWVBFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9UWVBFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJfVFlQRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX0FQUF9UWVBFID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVJfVFlQRSA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9UWVBFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQlib29sZWFuIGlzQWx0KCk7Ci0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCk7Ci0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCk7Ci0JLyoqCi0JICogVXNlZCBvbmx5IGlmIHRoaXMgcmVzb3VyY2UgaXMgYW4gYWx0OyByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGRlY2xhcmVzIGl0Ci0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gbmV3QXBwbGljYXRpb24pOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFZlcnNpb25JRCgpfQotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlib29sZWFuIGlzSjJFRTFfMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIEoyRUUgWE1MUmVzb3VyY2UuCi0JICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB1c2luZyBpbnN0YW5jZW9mLgotCSAqIEBzZWUgWE1MUmVzb3VyY2UjQVBQX0NMSUVOVF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNBUFBMSUNBVElPTl9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNFSkJfVFlQRQotCSAqIEBzZWUgWE1MUmVzb3VyY2UjV0VCX0FQUF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNSQVJfVFlQRQotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0JIC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQl2b2lkIHNldElzQWx0KGJvb2xlYW4gaXNBbHRlcm5hdGVERCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LCAKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LAotCSAqIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcsIFN0cmluZyl9Ci0JICogU2V0cyB0aGUgcHVibGljIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHNlZSBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXZvaWQgc2V0UHVibGljSWQoU3RyaW5nIGlkKTsKLQotCS8vVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB0byBzdXBwb3J0IFJlZmVyZW5jZWRSZXNvdXJjZSB3aXRob3V0IGhhdmluZyBhbiBhY3R1YWwKLQkvL1RoaXMgbWF5IGJlIGp1c3QgYSBzdWJzZXQgb2Ygd2hhdCBpcyBhdmFpbGFibGUgaW4gUmVmZXJlbmNlZFJlc291cmNlCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0Jdm9pZCBwcmVEZWxldGUoKTsKLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0JYm9vbGVhbiBpc05ldygpOwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg1ZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLCBKMkVFQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBBcHBsaWNhdGlvblRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQlwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgQVBQTElDQVRJT05fUEtHID0gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkKLSAgICBwdWJsaWMgQXBwbGljYXRpb25UcmFuc2xhdG9yKCkgewotCQlzdXBlcihBUFBMSUNBVElPTiwgQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbigpKTsKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAgbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihJQ09OKyIvIitTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IE1vZHVsZVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMyhBUFBMSUNBVElPTl9QS0cuZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIEFQUExJQ0FUSU9OX1BLRy5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytBUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzFfNCksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBNb2R1bGVUcmFuc2xhdG9yKCksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoQVBQTElDQVRJT05fUEtHLmdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSksCi0JCX07Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vTW9kdWxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZkMWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vTW9kdWxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlYWRBaGVhZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFwcGxpY2F0aW9uUGFja2FnZSBBUFBMSUNBVElPTl9QS0cgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBBTFRfRERfVFJBTlNMQVRPUiA9IGNyZWF0ZUFsdEREVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBXRUJfVFJBTlNMQVRPUlMgPSBjcmVhdGVXZWJNb2R1bGVUcmFuc2xhdG9ycygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFSkJfVFJBTlNMQVRPUlMgPSBjcmVhdGVFSkJNb2R1bGVUcmFuc2xhdG9ycygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBKQVZBX1RSQU5TTEFUT1JTID0gY3JlYXRlSmF2YU1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIENPTk5FQ1RPUl9UUkFOU0xBVE9SUyA9IGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCAgCi0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIE1vZHVsZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKE1PRFVMRSwgQVBQTElDQVRJT05fUEtHLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSk7Ci0JCWFkZFJlYWRBaGVhZEhlbHBlcihuZXcgUmVhZEFoZWFkSGVscGVyKE1PRFVMRSwgbmV3IFN0cmluZ1tdIHsgRUpCLCBKQVZBLCBXRUIsIENPTk5FQ1RPUiB9LCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVDb25uZWN0b3JNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVE9SLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUphdmFNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQSwgQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9VcmkoKSksCi0JCQlBTFRfRERfVFJBTlNMQVRPUiwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9FeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVFSkJNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZVdlYk1vZHVsZVRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihXRUIgKyAiLyIgKyBXRUJfVVJJLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoV0VCICsgIi8iICsgQ09OVEVYVF9ST09ULCBBUFBMSUNBVElPTl9QS0cuZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCkpLCAvLyROT04tTkxTLTEkCi0JCQlBTFRfRERfVFJBTlNMQVRPUiwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9FeHRlbnNpb25zKCkpCi0JCX07Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUFsdEREVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEFMVF9ERCwgQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVfQWx0REQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkgCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWVsc2UgaWYgKCgoTW9kdWxlKSBvKS5pc0VqYk1vZHVsZSgpKQotCQkJcmV0dXJuIEVKQl9UUkFOU0xBVE9SUzsKLQkJZWxzZSBpZiAoKChNb2R1bGUpIG8pLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQlyZXR1cm4gQ09OTkVDVE9SX1RSQU5TTEFUT1JTOwotCQllbHNlIGlmICgoKE1vZHVsZSkgbykuaXNXZWJNb2R1bGUoKSkKLQkJCXJldHVybiBXRUJfVFJBTlNMQVRPUlM7Ci0JCWVsc2UgaWYgKCgoTW9kdWxlKSBvKS5pc0phdmFNb2R1bGUoKSkKLQkJCXJldHVybiBKQVZBX1RSQU5TTEFUT1JTOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogTW9kdWxlIFR5cGUgZXhjZXB0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQkJaWYgKEVKQi5lcXVhbHMocmVhZEFoZWFkTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVFamJNb2R1bGUoKTsKLQkJZWxzZSBpZiAoV0VCLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVdlYk1vZHVsZSgpOwotCQllbHNlIGlmIChKQVZBLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQkJZWxzZSBpZiAoQ09OTkVDVE9SLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVNb2R1bGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc01hbmFnZWRCeVBhcmVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjFmNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uRW52RW50cnlUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEJBQ0tfSEFORExFUiA9ICJjYWxsYmFjay1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0NMSUVOVCA9ICJhcHBsaWNhdGlvbi1jbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQVBQTElDQVRJT05fQ0xJRU5ULCBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBFbnZFbnRyeVRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRW52aXJvbm1lbnRQcm9wcygpLCB0cnVlLCBmYWxzZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpKSwKLQkJCS8vSjJFRSAxLjMKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKENBTExCQUNLX0hBTkRMRVIsIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0FQUF9DTElFTlRfU0NIRU1BX0xPQ18xXzQpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgRW52RW50cnlUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdHJ1ZSwgdHJ1ZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZUVudlJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihDQUxMQkFDS19IQU5ETEVSLCBlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0RlcGxveW1lbnRFeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWY0YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQm9vbGVhblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEJPT0xFQU5fTE9XRVJDQVNFKTsKLQl9Ci0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHN0clZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJZWxzZSBpZiAoc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIjEiKSB8fCBzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpLmVxdWFscygiWUVTIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJZWxzZSAKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyVmFsdWUpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQ29tbW9uVHJhbnNsYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmNzIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRGVwZW5kZW5jeVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQSBzdGF0aWMgaGVscGVyIGZvciBjcmVhdGluZyBHZW5lcmljIGNvbW1vbiBKMkVFIHRyYW5zbGF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UcmFuc2xhdG9ycyBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgV0VCU0VSVklDRV9QS0cgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEVNUFRZX0NISUxEUkVOID0gbmV3IFRyYW5zbGF0b3JbXSB7fTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVKQl9SRUZfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX1JFRl9OQU1FLCBDT01NT05fUEtHLmdldEVqYlJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUpCX1JFRl9UWVBFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihFSkJfUkVGX1RZUEUsIENPTU1PTl9QS0cuZ2V0RWpiUmVmX1R5cGUoKSk7CQkvL0VudW1lcmF0aW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBFSkJfTElOS19UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX0xJTkssIENPTU1PTl9QS0cuZ2V0RWpiUmVmX0xpbmsoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfUkVGX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU19SRUZfTkFNRSwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZVJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU19UWVBFLCBDT01NT05fUEtHLmdldFJlc291cmNlUmVmX1R5cGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfQVVUSF9UUkFOU0xBVE9SID0gbmV3IFJlc0F1dGhUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfU0hBUklOR19TQ09QRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUkVTX1NIQVJJTkdfU0NPUEUsIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX0VOVl9SRUZfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUkVTT1VSQ0VfRU5WX1JFRl9OQU1FLCBDT01NT05fUEtHLmdldFJlc291cmNlRW52UmVmX05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfRU5WX1JFRl9UWVBFX1RSQU5TTEFUT1IgPSBuZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihSRVNPVVJDRV9FTlZfUkVGX1RZUEUsIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfVHlwZSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ19SRUZfUk9MRV9OQU1FX1RSQU5TQUxUT1IgPSBuZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRUNfUkVGX1JPTEVfTElOS19UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9MSU5LLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUlVOQVNfUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgRGVwZW5kZW5jeVRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldElkZW50aXR5X1JvbGVOYW1lKCksIENPTU1PTl9QS0cuZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ1VSSVRZX1JPTEVfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IgPSBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRElTUExBWU5BTUVTX1RSQU5TTEFUT1IgPSBjcmVhdGVEaXNwbGF5TmFtZVRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSUNPTlNfVFJBTlNMQVRPUiA9IGNyZWF0ZUljb25UcmFuc2xhdG9yKCk7Ci0JCi0JLy9UaGUgT2ZmaWNpYWwgQ29uY2VwdCBvZiBKTkRJRW52UmVmR3JvdXAgRk9SIEoyRUUgMS40Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzQgPSBuZXcgRW52RW50cnlUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VKQl9SRUZfMV80ID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZUVKQkxvY2FsUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCkpOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV80ID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTQoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfTUVTU0FHRV9ERVNUX1JFRl8xXzQgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQotCS8vVGhlIHVub2ZmaWNpYWwgY29uY2VwdCBvZiBKTkRJRW52UmVmR3JvdXAgRk9SIEoyRUUgMS4zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzMgPSBuZXcgRW52RW50cnlUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKSwgdHJ1ZSwgZmFsc2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfMyA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxMyhDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzMgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJMb2NhbFJlZlRyYW5zbGF0b3IxMyhDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiTG9jYWxSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV8zID0gIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV8zID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTMoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTElTVEVORVJfQ0xBU1NfVFJBTlNMQVRPUiA9IG5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKExJU1RFTkVSX0NMQVNTLCBDT01NT05fUEtHLmdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSk7Ci0JCi0JcHJpdmF0ZSBDb21tb25UcmFuc2xhdG9ycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEVfUkVGLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVNFQ19SRUZfUk9MRV9OQU1FX1RSQU5TQUxUT1IsIAotCQkJU0VDX1JFRl9ST0xFX0xJTktfVFJBTlNMQVRPUiAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSksIAotCQkJU0VDX1JFRl9ST0xFX05BTUVfVFJBTlNBTFRPUiwKLQkJCVNFQ19SRUZfUk9MRV9MSU5LX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZXNvdXJjZUVudlJlZlRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VfRU5WX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbigpKSwgCi0JCQlSRVNfRU5WX1JFRl9OQU1FX1RSQU5TTEFUT1IsIAotCQkJUkVTX0VOVl9SRUZfVFlQRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX0VOVl9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsIAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCkpLCAKLQkJCVJFU19FTlZfUkVGX05BTUVfVFJBTlNMQVRPUiwgCi0JCQlSRVNfRU5WX1JFRl9UWVBFX1RSQU5TTEFUT1IsCi0JCQkvL0oyRUUxLjQgQWRkZWQKLQkJLy8JY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRSZXNvdXJjZUVudlJlZl9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwJCQotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb24oKSksCi0JCQlSRVNfUkVGX05BTUVfVFJBTlNMQVRPUiwKLQkJCVJFU19UWVBFX1RSQU5TTEFUT1IsCi0JCQlSRVNfQVVUSF9UUkFOU0xBVE9SLAotCQkJLy9FSkIgMi4wIEFkZGVkCi0JCQlSRVNfU0hBUklOR19TQ09QRV9UUkFOU0xBVE9SLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VfUkVGLCBmZWF0dXJlKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkKLQkJCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSksCi0JCQkJUkVTX1JFRl9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJUkVTX1RZUEVfVFJBTlNMQVRPUiwKLQkJCQlSRVNfQVVUSF9UUkFOU0xBVE9SLAotCQkJCS8vRUpCIDIuMCBBZGRlZAotCQkJCVJFU19TSEFSSU5HX1NDT1BFX1RSQU5TTEFUT1IsCi0JCQkKLQkJCQkvL0oyRUUxLjQgQWRkZWQKLQkJCS8vCWNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfRXh0ZW5zaW9ucygpKQotCQkJfSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpKSwgCi0JCQlTRUNVUklUWV9ST0xFX05BTUVfVFJBTlNMQVRPUiAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBmZWF0dXJlKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQkJU0VDVVJJVFlfUk9MRV9OQU1FX1RSQU5TTEFUT1IgCi0JCQl9KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZmVhdHVyZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCTG9jYWxSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxMyhmZWF0dXJlLCB0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbG9jYWwgPyBFSkJfTE9DQUxfUkVGIDogRUpCX1JFRjsKLQkJU3RyaW5nIGhvbWVUYWcgPSBsb2NhbCA/IExPQ0FMX0hPTUUgOiBIT01FOwotCQlTdHJpbmcgcmVtb3RlVGFnID0gbG9jYWwgPyBMT0NBTCA6IFJFTU9URTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGhvbWVGZWF0dXJlID0gbG9jYWwgPyBDT01NT05fUEtHLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfSG9tZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfUmVtb3RlKCk7Ci0JCQotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3Iobm9kZU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkJCQotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCkpLAotCQkJRUpCX1JFRl9OQU1FX1RSQU5TTEFUT1IsCi0JCQlFSkJfUkVGX1RZUEVfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKGhvbWVUYWcsIGhvbWVGZWF0dXJlKSwKLQkJCW5ldyBUcmFuc2xhdG9yKHJlbW90ZVRhZywgcmVtb3RlRmVhdHVyZSksCi0JCQlFSkJfTElOS19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZmVhdHVyZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCTG9jYWxSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxNChmZWF0dXJlLCB0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbG9jYWwgPyBFSkJfTE9DQUxfUkVGIDogRUpCX1JFRjsKLQkJU3RyaW5nIGhvbWVUYWcgPSBsb2NhbCA/IExPQ0FMX0hPTUUgOiBIT01FOwotCQlTdHJpbmcgcmVtb3RlVGFnID0gbG9jYWwgPyBMT0NBTCA6IFJFTU9URTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGhvbWVGZWF0dXJlID0gbG9jYWwgPyBDT01NT05fUEtHLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfSG9tZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfUmVtb3RlKCk7Ci0JCQotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3Iobm9kZU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkJCQotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpKSwKLQkJCUVKQl9SRUZfTkFNRV9UUkFOU0xBVE9SLAotCQkJRUpCX1JFRl9UWVBFX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihob21lVGFnLCBob21lRmVhdHVyZSksCi0JCQluZXcgVHJhbnNsYXRvcihyZW1vdGVUYWcsIHJlbW90ZUZlYXR1cmUpLAotCQkJRUpCX0xJTktfVFJBTlNMQVRPUiwKLQkJLy8JY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRFamJSZWZfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSVU5fQVMsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJLy9uZXcgRGVwZW5kZW5jeVRyYW5zbGF0b3IoREVTLCkKLQkJCVJVTkFTX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSVU5fQVMsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpKSwKLQkJCVJVTkFTX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljICBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZlRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX1JFRixmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9SRUZfTkFNRSxDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX1RZUEUsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9VU0FHRSxDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Vc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9MSU5LLENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKSksCi0JCQkvL2NyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0V4dGVuc2lvbnMoKSkJCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSl7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVNTQUdFX0RFU1QsZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCURFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlJQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX05BTUUsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpKSwKLQkJCS8vY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25fRXh0ZW5zaW9ucygpKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUlDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX1JFRl9OQU1FLCBXRUJTRVJWSUNFX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfRklMRSwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IoU0VSVklDRV9RTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSksCi0JCQljcmVhdGVQb3J0Q29tcG9uZW50UmVmVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yKCksCi0JCX0pOwotCQkKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVRTmFtZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9Db21iaW5lZFFOYW1lKCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHdhcyBtb2RlbCBmcm9tIFdlYnNwaGVyZSBXZWJzZXJ2aWNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSEFORExFUiwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW117Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCURJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKEhBTkRMRVJfTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEhBTkRMRVJfQ0xBU1MsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkpLAotCQkJY3JlYXRlUGFyYW1WYWx1ZVR5cGUoSEFORExFUl9JTklUX1BBUkFNLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IoU09BUF9IRUFERVIsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTT0FQX1JPTEUsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX1BvcnROYW1lcygpKQotCQl9KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5UX1JFRiwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV0VCU0VSVklDRV9QS0cuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9MSU5LICwgV0VCU0VSVklDRV9QS0cuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoREVTQ1JJUFRJT04sIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIENPTU1PTl9QS0cuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSkgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURpc3BsYXlOYW1lVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREaXNwbGF5TmFtZV9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUljb25UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSUNPTiwgQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldEljb25UeXBlX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfU21hbGxJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8JCXJldHVybiBjcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihERVBMT1lfRVhULCBmZWF0dXJlKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotLy8JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLS8vCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFLCBDT01NT05fUEtHLmdldERlcGxveW1lbnRFeHRlbnNpb25fTmFtZXNwYWNlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0vLwkJCW5ldyBUcmFuc2xhdG9yKE1VU1RVTkRFUlNUQU5ELCBDT01NT05fUEtHLmdldERlcGxveW1lbnRFeHRlbnNpb25fTXVzdFVuZGVyc3RhbmQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLS8vCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotLy8JCQlUcmFuc2xhdG9yLmNyZWF0ZVBhcmVudEFuZFRleHRBdHRyaWJ1dGVUcmFuc2xhdG9yKEVYVF9FTEVNRU5ULCBDT01NT05fUEtHLmdldERlcGxveW1lbnRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKSwgQ09NTU9OX1BLRy5nZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpKQotLy8JCX0pOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBhcmFtVmFsdWVUeXBlKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSl7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9OQU1FLCBDT01NT05fUEtHLmdldFBhcmFtVmFsdWVfTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBDT01NT05fUEtHLmdldFBhcmFtVmFsdWVfVmFsdWUoKSksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZlYzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVudkVudHJ5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgYm9vbGVhbiBpc0oyRUUxNDsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIHJlb3JkZXJlZENoaWxkcmVuOwotCS8vSGFja3MgYmVjYXVzZSBvZiBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIHNlcnZsZXQgc3BlYwotCWJvb2xlYW4gdHlwZUJlZm9yZVZhbHVlID0gdHJ1ZTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW52RW50cnlUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBib29sZWFuIHdyaXRlVHlwZUJlZm9yZVZhbHVlLCBib29sZWFuIGlzSjJFRTE0KSB7Ci0JCXN1cGVyKEVOVl9FTlRSWSwgYUZlYXR1cmUpOwotCQl0eXBlQmVmb3JlVmFsdWUgPSB3cml0ZVR5cGVCZWZvcmVWYWx1ZTsKLQkJdGhpcy5pc0oyRUUxNCA9IGlzSjJFRTE0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgaW50IHZlcnNpb25JRCkgewotCQkvL0hhdmEgdG8geW91IGNyZWF0ZSBhIGRpZmZlcmVudCBvbmUgZWFjaCB0aW1lCi0JCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJc2V0UmVvcmRlcmVkQ2hpbGRyZW4oKTsKLQkJCi0JCWlmICh0eXBlQmVmb3JlVmFsdWUpCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQotCQlyZXR1cm4gcmVvcmRlcmVkQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJQ29tbW9uUGFja2FnZSBlUGFja2FnZUNvbW1vbiA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQlUcmFuc2xhdG9yIGRlc2NyaXB0aW9uVHJhbnNsYXRvcjsKLQkJaWYgKGlzSjJFRTE0KQotCQkJZGVzY3JpcHRpb25UcmFuc2xhdG9yID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ29tbW9uLmdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpKTsgCi0JCWVsc2UgCi0JCQlkZXNjcmlwdGlvblRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgZVBhY2thZ2VDb21tb24uZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSk7Ci0JCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAkJCQkKLQkJCWRlc2NyaXB0aW9uVHJhbnNsYXRvciwKLQkJCW5ldyBUcmFuc2xhdG9yKEVOVl9FTlRSWV9OQU1FLCBlUGFja2FnZUNvbW1vbi5nZXRFbnZFbnRyeV9OYW1lKCkpLAotCQkJbmV3IEVudkVudHJ5VHlwZVRyYW5zbGF0b3IoKSwgCi0JCQluZXcgVHJhbnNsYXRvcihFTlZfRU5UUllfVkFMVUUsIGVQYWNrYWdlQ29tbW9uLmdldEVudkVudHJ5X1ZhbHVlKCkpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFJlb3JkZXJlZENoaWxkcmVuKCkgewotCQlyZW9yZGVyZWRDaGlsZHJlbiA9IG5ldyBUcmFuc2xhdG9yW2NoaWxkcmVuLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIHJlb3JkZXJlZENoaWxkcmVuLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlUcmFuc2xhdG9yIHRlbXAgPSByZW9yZGVyZWRDaGlsZHJlblszXTsKLQkJcmVvcmRlcmVkQ2hpbGRyZW5bM10gPSByZW9yZGVyZWRDaGlsZHJlbls0XTsKLQkJcmVvcmRlcmVkQ2hpbGRyZW5bNF0gPSB0ZW1wOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWNkNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeVR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFORz0gImphdmEubGFuZy4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQlNUUklOR19MRU5HVEggPSBKQVZBX0xBTkcubGVuZ3RoKCk7Ci0JcHVibGljIEVudkVudHJ5VHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVl9FTlRSWV9UWVBFLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnZFbnRyeV9UeXBlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewkJCi0JCWlmIChzdHJWYWx1ZSAhPSBudWxsICYmIHN0clZhbHVlLnN0YXJ0c1dpdGgoSkFWQV9MQU5HKSkgCi0JCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUuc3Vic3RyaW5nKFNVQlNUUklOR19MRU5HVEgpLCBvd25lcik7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIAotCQkJcmV0dXJuIEpBVkFfTEFORyArICgoRW51bWVyYXRvcil2YWx1ZSkuZ2V0TmFtZSgpOyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQyNGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0phdmFDbGFzc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotcHVibGljIGNsYXNzIEphdmFDbGFzc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFDbGFzc1RyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRocwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHBhdGhzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lLCBTdHJpbmcgdmFsdWUsIE5vdGlmaWVyIG93bmVyKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29udmVydFN0cmluZ1RvVmFsdWUodmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpIHsKLQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gcmVtb3ZlUHJlY2VlZGluZ0FuZFRyYWlsaW5nUGVyaW9kcyhzdHJWYWx1ZS50cmltKCkpOwkJCi0JCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIG93bmVyUmVzID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYgKG93bmVyUmVzICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VTZXQgcnMgPSBvd25lclJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQlpZiAocnMgIT0gbnVsbCkgewotCQkJCQkJLy9UcnkgdG8gcmVmbGVjdCB0aGUgdHlwZSBkaXJlY3RseS4gIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQKLQkJCQkJCS8vb3IgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gYSBwcm94eS4KLQkJCQkJCU9iamVjdCBqYXZhQ2xhc3MgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlqYXZhQ2xhc3MgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocXVhbGlmaWVkTmFtZSwgcnMpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKQotCQkJCQkJCXJldHVybiBqYXZhQ2xhc3M7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIFN0cmluZyByZW1vdmVQcmVjZWVkaW5nQW5kVHJhaWxpbmdQZXJpb2RzKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCWNoYXJbXSBjaGFyYWN0ZXJzID0gcXVhbGlmaWVkTmFtZS50b0NoYXJBcnJheSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCWZvciAoOyBzdGFydEluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggJiYgY2hhcmFjdGVyc1tzdGFydEluZGV4XSA9PSAnLic7IHN0YXJ0SW5kZXgrKyk7Ci0JCWludCBxdWFsaWZpZWROYW1lRW5kID0gcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWludCBlbmRJbmRleCA9IHF1YWxpZmllZE5hbWVFbmQ7Ci0JCWZvciAoOyBlbmRJbmRleCA+IC0xICYmIGNoYXJhY3RlcnNbZW5kSW5kZXhdID09ICcuJzsgZW5kSW5kZXgtLSkKLQkJaWYgKHN0YXJ0SW5kZXggPT0gMCAmJiBlbmRJbmRleCA9PSBxdWFsaWZpZWROYW1lRW5kKQotCQkJcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCArIDEpOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiAoKEphdmFDbGFzcykgdmFsdWUpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vUmVzQXV0aFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOGI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc0F1dGhUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0FVVEggPSAiQ09OVEFJTkVSIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0FVVEggPSAiU0VSVkxFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgUmVzQXV0aFRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFJFU19BVVRILCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9BdXRoKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChpc1dlYigoUmVzb3VyY2VSZWYpb3duZXIpKQotCQkJcmV0dXJuIGNvbnZlcnRXZWJTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JCQotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHN0clZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGNvbnZlcnRXZWJTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoU0VSVkxFVF9BVVRILmVxdWFscyhzdHJWYWx1ZSkpIAotCQkJcmV0dXJuIFJlc0F1dGhUeXBlQmFzZS5BUFBMSUNBVElPTl9MSVRFUkFMOwotCQllbHNlIGlmIChDT05UQUlORVJfQVVUSC5lcXVhbHMoc3RyVmFsdWUpKSAKLQkJCXJldHVybiBSZXNBdXRoVHlwZUJhc2UuQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoaXNXZWIyMigoKFJlc291cmNlUmVmKW93bmVyKSkpCi0JCQlyZXR1cm4gY29udmVydFdlYlZhbHVlVG9TdHJpbmcodmFsdWUsIG93bmVyKTsKLQkJIAotCQlyZXR1cm4gc3VwZXIuY29udmVydFZhbHVlVG9TdHJpbmcodmFsdWUsIG93bmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydFdlYlZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTCA9PSB2YWx1ZSkKLQkJCXJldHVybiBTRVJWTEVUX0FVVEg7Ci0JCWVsc2UgaWYgKFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTCA9PSB2YWx1ZSkKLQkJCXJldHVybiBDT05UQUlORVJfQVVUSDsKLQkJZWxzZSAKLQkJCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV2ViKFJlc291cmNlUmVmIHJlZikgewotCQlFT2JqZWN0IG93bmVyID0gcmVmLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIChvd25lciBpbnN0YW5jZW9mIFdlYkFwcCk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzV2ViMjIoUmVzb3VyY2VSZWYgcmVmKSB7IAotCQlyZXR1cm4gaXNXZWIocmVmKSAmJiAoKFdlYkFwcClyZWYuZUNvbnRhaW5lcigpKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2Nvbm5lY3Rvci9Db25uZWN0b3JUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2Nvbm5lY3Rvci9Db25uZWN0b3JUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjE2YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb25uZWN0b3IvQ29ubmVjdG9yVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29ubmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5SYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBSYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBDb25uZWN0b3JUcmFuc2xhdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gImNvbm5lY3RvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBKY2FQYWNrYWdlIENPTk5FQ1RPUl9QS0cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFZFTkRPUl9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihWRU5ET1JfTkFNRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVJU19UWVBFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihFSVNfVFlQRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfRWlzVHlwZSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENPTkZJR19QUk9QRVJUWV9OQU1FX1RSQU5TTEFUT1I9IG5ldyBUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWV9OQU1FLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDT05GSUdfUFJPUEVSVFlfVFlQRV9UUkFOU0xBVE9SPSBuZXcgVHJhbnNsYXRvcihDT05GSUdfUFJPUEVSVFlfVFlQRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25maWdQcm9wZXJ0eV9UeXBlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ09ORklHX1BST1BFUlRZX1ZBTFVFX1RSQU5TTEFUT1I9IG5ldyBUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWV9WQUxVRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQ19UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDLCBDT05ORUNUT1JfUEtHLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQVVUSF9NRUNIX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEFVVEhfTUVDSF9UWVBFLCBDT05ORUNUT1JfUEtHLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENSRURFTlRJQUxfSU5URVJGQUNFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihDUkVERU5USUFMX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5UcmFuc2xhdG9yIExJQ0VOU0VfUkVRVUlSRURfVFJBTlNMQVRPUiA9IG5ldyBCb29sZWFuVHJhbnNsYXRvcihMSUNFTlNFX1JFUVVJUkVELCBDT05ORUNUT1JfUEtHLmdldExpY2Vuc2VfUmVxdWlyZWQoKSk7Ci0JCi0JcHVibGljIENvbm5lY3RvclRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKENPTk5FQ1RPUiwgSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OyAKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpICksCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKElDT04rIi8iK1NNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkgKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSApLCAvLyROT04tTkxTLTEkCi0JCQlWRU5ET1JfTkFNRV9UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoU1BFQ19WRVJTSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpICksCi0JCQlFSVNfVFlQRV9UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfVmVyc2lvbigpICksCi0JCQljcmVhdGVMaWNlbnNlVHJhbnNsYXRvcjEzKCksCi0JCQljcmVhdGVSZXNvdXJjZUFkYXB0ZXJUcmFuc2xhdG9yMTMoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytDT05ORUNUT1JfU0NIRU1BX0xPQ18xXzUpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQlWRU5ET1JfTkFNRV9UUkFOU0xBVE9SLAotCQkJRUlTX1RZUEVfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUl9WRVJTSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9WZXJzaW9uKCkpLAotCQkJY3JlYXRlTGljZW5zZVRyYW5zbGF0b3IxNCgpLAotCQkJY3JlYXRlUmVzb3VyY2VBZGFwdGVyVHJhbnNsYXRvcjE0KCksCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlQWRhcHRlclRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihSRVNPVVJDRUFEQVBURVJfQ0xBU1MsQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSksCi0JCQljcmVhdGVDb25maWd1cmF0aW9uUHJvcGVydHlUcmFuc2xhdG9yMTQoQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpKSwKLQkJCWNyZWF0ZU91dGJvdW5kVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5ib3VuZFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUFkbWluT2JqZWN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uc1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3V0Ym91bmRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlQ29ubmVjdGlvbkRlZmluYXRpb25UcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9TVVBQT1JULCBDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpKSwKLQkJCWNyZWF0ZUF1dGhNZWNoYW5pc21UcmFuc2xhdG9yMTQoQ09OTkVDVE9SX1BLRy5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSksCi0JCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSW5ib3VuZFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTkJPVU5EX1JFU09VUkNFQURBUFRFUiwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlTWVzc2FnZUFkYXB0ZXJUcmFuc2xhdG9yKCkKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FU1NBR0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZU1lc3NhZ2VMaXN0ZW5lclRyYW5zbGF0b3IoKSwKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXNzYWdlTGlzdGVuZXJUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRUxJU1RFTkVSLCBDT05ORUNUT1JfUEtHLmdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VMSVNURU5FUl9UWVBFLCBDT05ORUNUT1JfUEtHLmdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCkpLAotCQkJY3JlYXRlQWN0aXZhdGlvblNwZWNUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjdGl2YXRpb25TcGVjVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFDVElWQVRJT05TUEVDLCBDT05ORUNUT1JfUEtHLmdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQUNUSVZBVElPTlNQRUNfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpKSwKLQkJCWNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVRVUlSRURfQ09ORklHX1BST1BFUlRZLCBDT05ORUNUT1JfUEtHLmdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTk5FQ1RPUl9QS0cuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZX05BTUUsIENPTk5FQ1RPUl9QS0cuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFkbWluT2JqZWN0VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFETUlOT0JKRUNULCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEFETUlOT0JKRUNUX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEFETUlOT0JKRUNUX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSksCi0JCQljcmVhdGVDb25maWd1cmF0aW9uUHJvcGVydHlUcmFuc2xhdG9yMTQoQ09OTkVDVE9SX1BLRy5nZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkpCi0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbmF0aW9uVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTk5FQ1RJT05fREVGSU5JVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKE1BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9ORkFDVE9SWV9JTVBMX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTlRFUkZBQ0UsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05fSU1QTF9DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRVNPVVJDRUFEQVBURVIsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpICksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05fSU5URVJGQUNFLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTVBMX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoVFJBTlNBQ1RJT05fU1VQUE9SVCwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxMyhDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpLAotCQkJY3JlYXRlQXV0aE1lY2hhbmlzbVRyYW5zbGF0b3IxMyhDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSksCi0JCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpKSwKLQkJCWNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbnNUcmFuc2xhdG9yKCkKLQkJCQotCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25zVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1BFUk1JU1NJT04sIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT05ORUNUT1JfUEtHLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpKSwKLQkJCVNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQ19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVBdXRoTWVjaGFuaXNtVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQVVUSF9NRUNIQU5JU00sIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTk5FQ1RPUl9QS0cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSksIAotCQkJQVVUSF9NRUNIX1RZUEVfVFJBTlNMQVRPUiwKLQkJCUNSRURFTlRJQUxfSU5URVJGQUNFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUF1dGhNZWNoYW5pc21UcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBVVRIX01FQ0hBTklTTSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09OTkVDVE9SX1BLRy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKSksIAotCQkJQVVUSF9NRUNIX1RZUEVfVFJBTlNMQVRPUiwKLQkJCUNSRURFTlRJQUxfSU5URVJGQUNFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpKSwKLQkJCUNPTkZJR19QUk9QRVJUWV9OQU1FX1RSQU5TTEFUT1IsCi0JCQlDT05GSUdfUFJPUEVSVFlfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ09ORklHX1BST1BFUlRZX1ZBTFVFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09OTkVDVE9SX1BLRy5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSksCi0JCQlDT05GSUdfUFJPUEVSVFlfTkFNRV9UUkFOU0xBVE9SLAotCQkJQ09ORklHX1BST1BFUlRZX1RZUEVfVFJBTlNMQVRPUiwKLQkJCUNPTkZJR19QUk9QRVJUWV9WQUxVRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVMaWNlbnNlVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTElDRU5TRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfTGljZW5zZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTk5FQ1RPUl9QS0cuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpKSwgCi0JCQlMSUNFTlNFX1JFUVVJUkVEX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUxpY2Vuc2VUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMSUNFTlNFLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9MaWNlbnNlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09OTkVDVE9SX1BLRy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlMSUNFTlNFX1JFUVVJUkVEX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQWJzdHJhY3RFSkJUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BYnN0cmFjdEVKQlRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZDRhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BYnN0cmFjdEVKQlRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFic3RyYWN0RUpCVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEVKQl9QS0cuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCVRyYW5zbGF0b3JbXSBzdGFydCA9IGdldENvbW1vbkJlZ2luTWFwczEzKCk7Ci0JCVRyYW5zbGF0b3JbXSBtaWRkbGUgPSBnZXRTcGVjaWZpY01hcHMoSjJFRV8xXzNfSUQpOwotCQlUcmFuc2xhdG9yW10gZW5kID0gZ2V0RW5kTWFwczEzKCk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3RhcnQsIGNvbmNhdChtaWRkbGUsIGVuZCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCQlUcmFuc2xhdG9yW10gc3RhcnQgPSBnZXRDb21tb25CZWdpbk1hcHMxNCgpOwotCQkJVHJhbnNsYXRvcltdIG1pZGRsZSA9IGdldFNwZWNpZmljTWFwcyhKMkVFXzFfNF9JRCk7Ci0JCQlUcmFuc2xhdG9yW10gZW5kID0gZ2V0RW5kTWFwczE0KCk7Ci0JCQkvL1RyYW5zbGF0b3JbXSBkZXBsb3ltZW50RXh0ID0gZ2V0RGVwbG95bWVudEV4dGVuc2lvbk1hcHMoKTsKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3RhcnQsIGNvbmNhdChtaWRkbGUsIGVuZCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENvbW1vbkJlZ2luTWFwczEzKCkgewotCQkKLQkJVHJhbnNsYXRvcltdIGJlZ2luTWFwcyA9ICBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX05hbWUoKSkKLQkJfTsKLQkJCi0JCWlmICh1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChjb25jYXQoYmVnaW5NYXBzLCBnZXRIb21lUmVtb3RlTWFwcygpKSwgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChiZWdpbk1hcHMsIGdldEVKQkNsYXNzTWFwKCkpOwotCX0KLQkKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q29tbW9uQmVnaW5NYXBzMTQoKSB7Ci0JCQotCQlUcmFuc2xhdG9yW10gYmVnaW5NYXBzID0gIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihFSkJfTkFNRSwgRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCkpCi0JCX07Ci0JCWlmICh1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChjb25jYXQoYmVnaW5NYXBzLCBnZXRIb21lUmVtb3RlTWFwcygpKSwgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChiZWdpbk1hcHMsIGdldEVKQkNsYXNzTWFwKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEhvbWVSZW1vdGVNYXBzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihIT01FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihSRU1PVEUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpLAotCQkJLy9CZWdpbiBFSkIgMi4wCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihMT0NBTF9IT01FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKExPQ0FMLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpCi0JCQkvL0VuZCBFSkIgMi4wCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFSkJDbGFzc01hcCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRUpCX0NMQVNTLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSksCi0JCQluZXcgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfMwotCQl9OwotCi0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxNCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRU5WX0VOVFJZXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9TRVJWSUNFX1JFRl8xXzQsCQotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfTUVTU0FHRV9ERVNUX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTQoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eVJvbGVSZWZzKCkpLAotCQkJbmV3IFNlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yKCksCi0JCX07Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKTsKLQotLy8JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXREZXBsb3ltZW50RXh0ZW5zaW9uTWFwcygpewotLy8JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLS8vCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9FeHRlbnNpb25zKCkpCi0vLwkJfTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZWYyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0FDS05PV0xFREdFID0gIkF1dG8tYWNrbm93bGVkZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQU19PS19BQ0tOT1dMRURHRSA9ICJEdXBzLW9rLWFja25vd2xlZGdlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihBQ0tOT1dMRURHRV9NT0RFLCBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKEFVVE9fQUNLTk9XTEVER0UuZXF1YWxzSWdub3JlQ2FzZShzdHJWYWx1ZSkpCi0JCQlyZXR1cm4gQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTDsKLQkJZWxzZSBpZiAoRFVQU19PS19BQ0tOT1dMRURHRS5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKLQkJCXJldHVybiBBY2tub3dsZWRnZU1vZGUuRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMOwotCQllbHNlIAotCQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUwuZXF1YWxzKHZhbHVlKSkgCi0JCQlyZXR1cm4gQVVUT19BQ0tOT1dMRURHRTsKLQkJZWxzZSBpZiAoQWNrbm93bGVkZ2VNb2RlLkRVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuIERVUFNfT0tfQUNLTk9XTEVER0U7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBGaWVsZFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYxYTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgYWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBGaWVsZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCXB1YmxpYyBDTVBGaWVsZFRyYW5zbGF0b3IoKXsKLQkJc3VwZXIoQ01QX0ZJRUxELCBFSkJfUEtHLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKXsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihGSUVMRF9OQU1FLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpKQkKLQkJfTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJc3dpdGNoKCgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpLmdldFZlcnNpb25JRCgpKSB7ICAKLQkJCQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQotCQkJCXJldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCQkJCQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCQotCQkJCXJldHVybiBnZXQyMENNUEF0dHJpYnV0ZXMoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbW9mT2JqZWN0KTsKLQkJfSAgCi0JfQotCQotCXB1YmxpYyBMaXN0IGdldDIwQ01QQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlMaXN0IGFsbEF0dHJpYnV0ZXMsIHJlbW92ZWQsIHJlc3VsdDsKLQkJcmVtb3ZlZCA9IG51bGw7Ci0JCWFsbEF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBhbGxBdHRyaWJ1dGVzLnNpemUoKTsKLQkJQ01QQXR0cmlidXRlIGF0dCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhdHQgPSAoQ01QQXR0cmlidXRlKSBhbGxBdHRyaWJ1dGVzLmdldChpKTsKLQkJCWlmIChhdHQuaXNEZXJpdmVkKCkpIHsKLQkJCQlpZiAocmVtb3ZlZCA9PSBudWxsKQotCQkJCQlyZW1vdmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlbW92ZWQuYWRkKGF0dCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCXJlc3VsdC5hZGRBbGwoYWxsQXR0cmlidXRlcyk7Ci0JCQlyZXN1bHQucmVtb3ZlQWxsKHJlbW92ZWQpOwotCQl9IGVsc2UKLQkJCXJlc3VsdCA9IGFsbEF0dHJpYnV0ZXM7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBWZXJzaW9uVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ01QVmVyc2lvblRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NDNjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBWZXJzaW9uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ01QVmVyc2lvblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgQ01QVmVyc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKENNUF9WRVJTSU9OLCBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlFSkJKYXIgcGFyZW50ID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCkuZ2V0RWpiSmFyKCk7Ci0JCWlmIChwYXJlbnQuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkKLQkJCXJldHVybiBzdXBlci5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDdhMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgRW50aXR5VHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotCS8vVE9ETyBVbmNvbW1lbnQgYWxsIGNvbW1lbnRlZCBjb2RlIGFuZCBmaXgKLQkvKgotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFN0cmluZ1ZhbHVlKE1hcEluZm8gbWFwLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTUtFWV9GSUVMRCkpIHsJCi0JCQlDTVBBdHRyaWJ1dGUgYXR0ciA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0JCQlyZXR1cm4gYXR0ciA9PSBudWxsID8gZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZSgpIDogYXR0ci5nZXROYW1lKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHN1cGVyLmV4dHJhY3RTdHJpbmdWYWx1ZShtYXAsIG1vZk9iamVjdCk7Ci0JCi0JfSAKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIENNUFNwZWNBZGFwdGVyLmdldFNwZWNpZmllZFByaW1LZXlGaWVsZE5hbWUoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpKTsKLQl9Ci0JKi8KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OyAKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gQ09OVEFJTkVSOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5FbnRpdHlUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlUcmFuc2xhdG9yW10gY21wVHJhbnNsYXRvcnMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCS8vQmVnaW4gRUpCIDIuMCBhZGRlZAotCQkJbmV3IENNUFZlcnNpb25UcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihBQlNUUkFDVF9TQ0hFTUFfTkFNRSwgRUpCX1BLRy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpKSwKLQkJCS8vRW5kIEVKQiAyLjAgYWRkZWQKLQkJCi0JCQluZXcgQ01QRmllbGRUcmFuc2xhdG9yKCksCi0JCQluZXcgUHJpbUtleUZpZWxkVHJhbnNsYXRvcigpLAotCQl9OwotCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldFNwZWNpZmljTWFwcyh2ZXJzaW9uSUQpLCBjbXBUcmFuc2xhdG9ycyk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQkvL0FkZGVkIGZvciBFSkIgMi4wCi0JCVRyYW5zbGF0b3JbXSBxdWVyeVQgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVF1ZXJ5VHJhbnNsYXRvcnMoKQotCQl9OwotCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldEVuZE1hcHMxMygpLCBxdWVyeVQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxNCgpIHsKLQkJCS8vQWRkZWQgZm9yIEVKQiAyLjAKLQkJCVRyYW5zbGF0b3JbXSBxdWVyeVQgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQljcmVhdGVRdWVyeVRyYW5zbGF0b3JzKCkKLQkJCX07Ci0JCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldEVuZE1hcHMxNCgpLCBxdWVyeVQpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVF1ZXJ5VHJhbnNsYXRvcnMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihRVUVSWSwgRUpCX1BLRy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCkpLAotCQkJY3JlYXRlUXVlcnlNZXRob2RUcmFuc2xhdG9ycygpLAotCQkJbmV3IFRyYW5zbGF0b3IoUkVTVUxUX1RZUEVfTUFQUElORywgRUpCX1BLRy5nZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9RTCwgRUpCX1BLRy5nZXRRdWVyeV9FamJRTCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVF1ZXJ5TWV0aG9kVHJhbnNsYXRvcnMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihRVUVSWV9NRVRIT0QsIEVKQl9QS0cuZ2V0UXVlcnlfUXVlcnlNZXRob2QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEhPRF9OQU1FLCBFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfTmFtZSgpKSwKLQkJCW5ldyBNZXRob2RQYXJhbXNUcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpKQotCQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUZlYXR1cmUoTWFwSW5mbyBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKG1hcCA9PSBub0ZlYXR1cmVQcmltS2V5TWFwSW5mbykKLQkJCXJldHVybjsKLQkJaWYgKG1hcC5nZXRET01OYW1lKCkuZXF1YWxzKENNUF9WRVJTSU9OKSkgewotCQkJdXBkYXRlRE9NQ21wVmVyc2lvbklmTmVjZXNzYXJ5KG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCS8vSWYgdGhlIHByaW1hcnkga2V5IGNsYXNzIGhhcyBjaGFuZ2VkLCB0aGlzIHdpbGwgaW1wYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTV9LRVlfQ0xBU1MpKSB7Ci0JCQlTdHJpbmcgc3BlY2lmaWVkUHJpbUtleUZpZWxkID0gQ01QU3BlY0FkYXB0ZXIuZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCQkJdHJ5IHsKLQkJCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJQ01QU3BlY0FkYXB0ZXIuc2V0UHJpbUtleUZpZWxkRnJvbVhtbChzcGVjaWZpZWRQcmltS2V5RmllbGQsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01DbXBWZXJzaW9uSWZOZWNlc3NhcnkoTWFwSW5mbyBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCEobW9mT2JqZWN0IGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkpIAotCQkJcmV0dXJuOwotCQkKLQkJRUpCSmFyIHBhcmVudCA9ICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpLmdldEVqYkphcigpOwotCQlpZiAocGFyZW50LmlzVmVyc2lvbjJfMERlc2NyaXB0b3IoKSkKLQkJCXN1cGVyLnByaW1VcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwID09IGZlYXR1cmVQcmltS2V5TWFwSW5mbykgCi0JCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSwgbW9mT2JqZWN0KTsKLQkJZWxzZSAKLQkJCXN1cGVyLnByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltVXBkYXRlTU9GRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlib29sZWFuIGhhc0NoYW5nZWQgPSBzdXBlci5wcmltVXBkYXRlTU9GRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCS8vSWYgdGhlIGtleSBjbGFzcyBoYXMgY2hhbmdlZCwgZnJvbSB0aGUgeG1sIHNpZGUsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2Ugc3RhbXAgdGhlIHByaW1rZXkgZmllbGQKLQkJLy9hcyBiZWluZyBzcGVjaWZpZWQgZnJvbSB4bWwsIHNpbmNlIHdlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoYXQgbm9kZQotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTV9LRVlfQ0xBU1MpKSB7Ci0JCQl1cGRhdGVYbWxLZXlGaWVsZChub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSk7Ci0JCQlpZiAoaGFzQ2hhbmdlZCkKLQkJCQl1cGRhdGVNT0ZQcmltS2V5RmllbGRGZWF0dXJlKGZlYXR1cmVQcmltS2V5TWFwSW5mbywgZ2V0Tm9kZSgpLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gaGFzQ2hhbmdlZDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwID09IG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvKQotCQkJcmV0dXJuOwotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTUtFWV9GSUVMRCkpIHsKLQkJCXVwZGF0ZU1PRlByaW1LZXlGaWVsZEZlYXR1cmUobWFwLCBub2RlLCBmYWxzZSk7Ci0JCX0gZWxzZSBpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoQ01QX0ZJRUxEKSkgewotCQkJLy9jYWNoZSB0aGUgb2xkIGxpc3Qgb2YgY21wIGF0dHJpYnV0ZXMgYmVmb3JlIHVwZGF0ZQotCQkJTGlzdCBjbXBBdHRyaWJ1dGVzTGlzdENPUFkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljbXBBdHRyaWJ1dGVzTGlzdENPUFkuYWRkQWxsKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQkJCi0JCQkvL2RvIHRoZSB1cGRhdGUKLQkJCXN1cGVyLnByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCi0JCQlMaXN0IG5ld0NtcEF0dHJpYnV0ZUxpc3QgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCS8va2V5IHRoZSBjbXAgYXR0cmlidXRlIGxpc3QgYW5kIHRoZSBrZXkgYXR0cmlidXRlIGxpc3QuCi0JCQlwZXJmb3JtS2V5U3luY2hyb25pemF0aW9uKGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSwgbmV3Q21wQXR0cmlidXRlTGlzdCk7Ci0JCX0gZWxzZSAKLQkJCXN1cGVyLnByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCBzeW5jaHJvbml6aWVzIHRoZSBsaXN0IG9mIGNtcCBhdHRyaWJ1dGVzIHRoYXQgYXJlIGtleXMgd2l0aCB0aGUga2V5IGF0dHJpYnV0ZSBsaXN0LgotCSAqIFdoZW4ga2V5cyBhcmUgYWRkZWQgYW5kIGRlbGV0ZWQgZnJvbSB0aGUgY21wIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSAtIENvcHkgb2YgdGhlIGNtcCBhdHRyaWJ1dGUgbGlzdCBiZWZvcmUgYW55IGF0dHJpYnV0ZXMgd2hlcmUgYWRkZWQKLQkgKiAJCQkJCQkJCQkJb3IgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gTGlzdCBuZXdDbXBBdHRyaWJ1dGVMaXN0IC0gTGlzdCBvZiBjbXAgYXR0cmlidXRlcyBhZnRlciBhIG1vZGlmaWNhdGlvbiBoYXMgb2NjdXJlZC4KLQkgKi8KLQkgLyoKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtS2V5U3luY2hyb25pemF0aW9uKCBMaXN0IGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSwgTGlzdCBuZXdDbXBBdHRyaWJ1dGVMaXN0ICkgewkKLQkJaWYoIGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSAhPSBudWxsICYmIG5ld0NtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCApIHsJCi0KLQkJCS8vYWRkIGFuZCByZW1vdmVzIGtleXMgYmFzZWQgb24gd2hhdCB0aGUgYWRhcHRlcnMgZ2l2ZSBiYWNrCi0JCQotCQkJTGlzdCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgPSBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0KCBjbXBBdHRyaWJ1dGVzTGlzdENPUFksIG5ld0NtcEF0dHJpYnV0ZUxpc3QgKTsKLQkJCWlmKCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhYWRkZWRDbXBBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsJCQkJCQotCQkJCS8vZGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgYWRkZWQgYXR0cmlidXRlcyBhcmUga2V5cywgaWYgc28gZ2V0IGEgbGlzdCBvZiB0aGVtLgotCQkJCUxpc3QgYWRkZWRLZXlBdHRyaWJ1dGVMaXN0ID0gZ2V0S2V5QXR0cmlidXRlc0Zyb21MaXN0KCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5KCkgKTsKLQkJCQkvL25vdywgYWRkIHRoZSBrZXlzIHRvIHRoZSBsaXN0LgotCQkJCWFkZEtleXNUb0tleUF0dHJpYnV0ZUxpc3QoIGFkZGVkS2V5QXR0cmlidXRlTGlzdCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpICk7Ci0JCQl9Ly8gaWYKLQkJCi0JCQlMaXN0IHN1YnRyYWN0ZWRDbXBBdHRyaWJ1dGVMaXN0ID0gZ2V0Q21wQXR0cmlidXRlc0RlbHRhTGlzdCggbmV3Q21wQXR0cmlidXRlTGlzdCwgY21wQXR0cmlidXRlc0xpc3RDT1BZICk7Ci0JCQlpZiggc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QuaXNFbXB0eSgpICkgewotCQkJCS8vZGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgc3VidHJhY3RlZCBhdHRyaWJ1dGVzIGFyZSBrZXlzLCBpZiBzbyBnZXQgYSBsaXN0IG9mIHRoZW0uCi0JCQkJTGlzdCBzdWJ0cmFjdGVkS2V5QXR0cmlidXRlTGlzdCA9IGdldEtleUF0dHJpYnV0ZXNGcm9tTGlzdCggc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5KCkgKTsKLQkJCQkvL25vdywgc3VidHJhY3QgdGhlIGtleXMgZnJvbSB0aGUgbGlzdC4KLQkJCQlyZW1vdmVLZXlzRnJvbUtleUF0dHJpYnV0ZUxpc3QoIHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgKTsKLQkJCX0vLyBpZgkJCi0JCQotCQl9Ly8gaWYJCi0JfS8vIHBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24KLQotCS8qKgotCSAqIFJlbW92ZSBhIGJ1bmNoIG9mIGtleXMgZnJvbSB0aGUgY3VycmVudCBrZXkgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIExpc3Qgc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QgLSBUaGUgbGlzdCBvZiBrZXlzIHRvIHN1YnRyYWN0IGZyb20gdGhlIGtleSBhdHRyaWJ1dGVzIGxpc3QuCi0JICogQHBhcmFtIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wIC0gVGhlIGN1cnJlbnQgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5LgotCSAqLwotCSAKLQkgLyoKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlS2V5c0Zyb21LZXlBdHRyaWJ1dGVMaXN0KCBMaXN0IHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCApIHsKLQkJaWYoIHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIXN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsKLQkJCS8vU3VidHJhY3QgdGhlIGtleSBhdHRyaWJ1dGVzIGZyb20gdGhlIGNvbnRhaW5lciBtYW5hZ2VkIGVudGl0eQotCQkJSXRlcmF0b3Iga2xpID0gc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCQl3aGlsZSgga2xpLmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlrbGkubmV4dCgpOwotCQkJCVN0cmluZyBjbXBBdHRyaWJ1dGVOYW1lID0gY21wQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQlpZiggY21wQXR0cmlidXRlTmFtZSAhPSBudWxsICkgewotCQkJCQlpZiggY21wICE9IG51bGwgJiYgY21wLmdldEtleUF0dHJpYnV0ZXMoKSAhPSBudWxsICkgewotCQkJCQkJTGlzdCBrZXlBdHRyaWJ1dGVMaXN0ID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCQkJCWtleUF0dHJpYnV0ZUxpc3QucmVtb3ZlKCBjbXBBdHRyaWJ1dGUgKTsKLQkJCQkJfS8vIGlmCi0JCQkJfS8vIGlmCi0JCQl9Ly8gd2hpbGUKLQkJfS8vIGlmCi0JfS8vIHBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24KLQotCS8qKgotCSAqIEFkZHMgYSBidW5jaCBvZiBrZXlzIHRvIHRoZSBjdXJyZW50IGtleSBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgLSBUaGUgbGlzdCBvZiBrZXlzIHRvIGFkZCB0byB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdC4KLQkgKiBAcGFyYW0gQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgLSBUaGUgY3VycmVudCBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkuCi0JICovCi0JIAotCSAvKgotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRLZXlzVG9LZXlBdHRyaWJ1dGVMaXN0KCBMaXN0IGFkZGVkS2V5QXR0cmlidXRlTGlzdCwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgKSB7Ci0JCWlmKCBhZGRlZEtleUF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhYWRkZWRLZXlBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsKLQkJCS8vQWRkIHRoZSBrZXkgYXR0cmlidXRlcyB0byB0aGUgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5Ci0JCQlJdGVyYXRvciBrbGkgPSBhZGRlZEtleUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCQl3aGlsZSgga2xpLmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlrbGkubmV4dCgpOwotCQkJCVN0cmluZyBjbXBBdHRyaWJ1dGVOYW1lID0gY21wQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQlpZiggY21wQXR0cmlidXRlTmFtZSAhPSBudWxsICkgewotCQkJCQlpZiggY21wICE9IG51bGwgJiYgY21wLmdldEtleUF0dHJpYnV0ZXMoKSAhPSBudWxsICkKLQkJCQkJCWNtcC5hZGRLZXlBdHRyaWJ1dGVOYW1lKCBjbXBBdHRyaWJ1dGVOYW1lICk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gd2hpbGUKLQkJfS8vIGlmCi0JfS8vIGFkZEtleXNUb0tleUF0dHJpYnV0ZUxpc3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGtleSBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBhdHRyaWJ1dGVMaXN0IC0gTGlzdCBvZiBhdHRyaWJ1dGVzLgotCSAqIEBwYXJhbSBKYXZhQ2xhc3MgcHJpbWFyeUtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgY21wLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCSAKLQkgLyoKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0S2V5QXR0cmlidXRlc0Zyb21MaXN0KCAgTGlzdCBhdHRyaWJ1dGVMaXN0LCBKYXZhQ2xhc3MgcHJpbWFyeUtleSApIHsKLQkJaWYgKHByaW1hcnlLZXkgPT0gbnVsbCB8fCBhdHRyaWJ1dGVMaXN0ID09IG51bGwgfHwgYXR0cmlidXRlTGlzdC5pc0VtcHR5KCkpIAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQotCQlMaXN0IGZvdW5kS2V5QXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoIGl0Lmhhc05leHQoKSApIHsJCi0JCQlDTVBBdHRyaWJ1dGUgY21wQXR0ciA9IChDTVBBdHRyaWJ1dGUpaXQubmV4dCgpOwkJCQotCQkJaWYoIGNtcEF0dHIgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgY21wQXR0cmlidXRlTmFtZSA9IGNtcEF0dHIuZ2V0TmFtZSgpOwotCQkJCWlmIChjbXBBdHRyaWJ1dGVOYW1lICE9IG51bGwpIHsJCQkKLQkJCQkJRmllbGQga2V5RmllbGQgPSBwcmltYXJ5S2V5LmdldEZpZWxkKGNtcEF0dHJpYnV0ZU5hbWUpOwkKLQkJCQkJaWYgKGtleUZpZWxkICE9IG51bGwpIAkJCQkKLQkJCQkJCWZvdW5kS2V5QXR0cmlidXRlTGlzdC5hZGQoY21wQXR0cik7Ci0JCQkJfS8vIGlmCi0JCQl9IC8vaWYKLQkJfS8vIHdoaWxlCQotCQlyZXR1cm4gZm91bmRLZXlBdHRyaWJ1dGVMaXN0OwotCX0vLyBnZXRLZXlBdHRyaWJ1dGVzRnJvbUxpc3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlbHRhIGVsZW1lbnRzIG9mIHR3byBsaXN0cwotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGZpcnN0TGlzdCAtIFRoZSBsaXN0IHRoYXQgaXMgYmVpbmcgY29tcGFyZWQgdG9vLgotCSAqIEBwYXJhbSBMaXN0IHNlY29uZExpc3QgLSBUaGUgbGlzdCB0byBjaGVjayB0aGUgZGlmZmVyZW5jZSBvZi4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkgCi0JIC8qCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q21wQXR0cmlidXRlc0RlbHRhTGlzdCggTGlzdCBmaXJzdExpc3QsIExpc3Qgc2Vjb25kTGlzdCApIHsKLQkJTGlzdCBkaWZmQXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJaWYoIGZpcnN0TGlzdCAhPSBudWxsICYmIHNlY29uZExpc3QgIT0gbnVsbCApIHsKLQkJCUl0ZXJhdG9yIGl0ID0gc2Vjb25kTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlpdC5uZXh0KCk7Ci0JCQkJaWYoIGNtcEF0dHJpYnV0ZSAhPSBudWxsICYmICFmaXJzdExpc3QuY29udGFpbnMoIGNtcEF0dHJpYnV0ZSApICkgewotCQkJCQlkaWZmQXR0cmlidXRlTGlzdC5hZGQoIGNtcEF0dHJpYnV0ZSApOwotCQkJCX0vLyBpZgotCQkJfS8vIHdoaWxlCi0JCQlyZXR1cm4gZGlmZkF0dHJpYnV0ZUxpc3Q7Ci0JCX0vLyBpZgkKLQkJcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0vLyBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZQcmltS2V5RmllbGRGZWF0dXJlKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUsIGJvb2xlYW4gZm9yY2UpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0RU9iamVjdCgpLmVSZXNvdXJjZSgpOwotCQlib29sZWFuIG1vZEZsYWcgPSByZXMgPT0gbnVsbCA/IGZhbHNlIDogcmVzLmlzTW9kaWZpZWQoKTsKLQkJU3RyaW5nIGtleUZpZWxkID0gZ2V0RE9NVGV4dChtYXAsIG5vZGUpOwotCQkvL0RldGVybWluZSBpZiB0aGUgcHJpbS1rZXkgZmllbGQgaGFzIGNoYW5nZWQuICBJZiBzbywgdGhlbiByZWNvbXB1dGUgdGhlIGtleXM7IG90aGVyd2lzZSBsZWF2ZSAKLQkJLy9pdCBhbG9uZQotCQlpZiAoa2V5RmllbGQgIT0gbnVsbCkKLQkJCWtleUZpZWxkID0ga2V5RmllbGQudHJpbSgpOwotCQlDTVBBdHRyaWJ1dGUgZXhpc3RpbmdLZXlBdHQgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgZXhpc3RpbmdLZXlGaWVsZCA9IGV4aXN0aW5nS2V5QXR0ID09IG51bGwgPyBudWxsIDogZXhpc3RpbmdLZXlBdHQuZ2V0TmFtZSgpOwotCQlpZiAoIWZvcmNlIAotCQkJJiYgKChrZXlGaWVsZCA9PSBudWxsICYmIGV4aXN0aW5nS2V5RmllbGQgPT0gbnVsbCkgCi0JCQkJfHwgKGtleUZpZWxkICE9IG51bGwgJiYga2V5RmllbGQuZXF1YWxzKGV4aXN0aW5nS2V5RmllbGQpKQotCQkJCXx8IChleGlzdGluZ0tleUZpZWxkICE9IG51bGwgJiYgZXhpc3RpbmdLZXlGaWVsZC5lcXVhbHMoa2V5RmllbGQpKSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmNsZWFyS2V5QXR0cmlidXRlcygpOyAvL25lY2Vzc2FyeSB0byBjbGVhciByZWZsZWN0ZWQgZmxhZwotCQkJQ01QQXR0cmlidXRlIGtleUF0dCA9IG51bGw7Ci0JCQlDTVBTcGVjQWRhcHRlci5zZXRQcmltS2V5RmllbGRGcm9tWG1sKGtleUZpZWxkLCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCQkJaWYgKGtleUZpZWxkICE9IG51bGwpIHsKLQkJCQlrZXlBdHQgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuYWRkS2V5QXR0cmlidXRlTmFtZShrZXlGaWVsZCwgZmFsc2UpOwotCQkJCWlmIChrZXlBdHQgIT0gbnVsbCkgewotCQkJCQkvL1RoaXMgaXMgYW4gaW52YWxpZCBzdGF0ZS4KLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5TmFtZSgpOwotCQkJCQlKYXZhQ2xhc3MgcmVmID0gbnVsbDsKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCQkJcmVmID0gSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZihjbGFzc05hbWUpOwotCQkJCQlrZXlBdHQuc2V0RVR5cGUocmVmKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vSGFjayB0byBmb3JjZSB0aGUgVUkgdG8gcmVmcmVzaAotCQkJCUVMaXN0IGtleXMgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJCWlmICgha2V5cy5pc0VtcHR5KCkpCi0JCQkJCWtleXMuc2V0KDAsIGtleXMuZ2V0KDApKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNUcmFja2luZ01vZGlmaWNhdGlvbigpKQotCQkJCXJlcy5zZXRNb2RpZmllZChtb2RGbGFnKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxLZXlGaWVsZChNYXBJbmZvIG1hcCwgTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBrZXlGaWVsZCA9IGdldERPTVRleHQobWFwLCBub2RlKTsKLQkJQ01QU3BlY0FkYXB0ZXIuc2V0UHJpbUtleUZpZWxkRnJvbVhtbChrZXlGaWVsZCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpKTsKLQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIEFic3RyYWN0RE9NTm9kZUFkYXB0ZXIjZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCwgTWFwSW5mbykKLQkJICovCi0JCSAvKgotCQlwcm90ZWN0ZWQgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCwgTWFwSW5mbyBtYXApIHsKLQkJCWlmIChnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuaXNWZXJzaW9uMl9YKCkgJiYgQ01QX0ZJRUxELmVxdWFscyhtYXAuZ2V0RE9NTmFtZSgpKSkKLQkJCQlyZXR1cm4gZ2V0MjBDTVBBdHRyaWJ1dGVzKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCwgbWFwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBNZXRob2QgZ2V0MjBDTVBBdHRyaWJ1dGVzLgotCQkgKiBAcGFyYW0gY29udGFpbmVyTWFuYWdlZEVudGl0eQotCQkgKiBAcmV0dXJuIExpc3QKLQkJICovCi0JCSAKLQkJIC8qCi0JCXByaXZhdGUgTGlzdCBnZXQyMENNUEF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJCUxpc3QgYWxsQXR0cmlidXRlcywgcmVtb3ZlZCwgcmVzdWx0OwotCQkJcmVtb3ZlZCA9IG51bGw7Ci0JCQlhbGxBdHRyaWJ1dGVzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IGFsbEF0dHJpYnV0ZXMuc2l6ZSgpOwotCQkJQ01QQXR0cmlidXRlIGF0dCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWF0dCA9IChDTVBBdHRyaWJ1dGUpIGFsbEF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmIChhdHQuaXNEZXJpdmVkKCkpIHsKLQkJCQkJaWYgKHJlbW92ZWQgPT0gbnVsbCkKLQkJCQkJCXJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJlbW92ZWQuYWRkKGF0dCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZWQgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChhbGxBdHRyaWJ1dGVzKTsKLQkJCQlyZXN1bHQucmVtb3ZlQWxsKHJlbW92ZWQpOwotCQkJfSBlbHNlCi0JCQkJcmVzdWx0ID0gYWxsQXR0cmlidXRlczsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BYnN0cmFjdERPTU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpTm90aWZpZXIsIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkJICovCi0JCSAKLQkJIC8qCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBDb250YWluZXJNYW5hZ2VkRW50aXR5LkRFUklWRURfRkxBR19DSEFOR0UpCi0JCQkJdXBkYXRlRE9NRmVhdHVyZShnZXRNYXAoQ01QX0ZJRUxEKSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJZWxzZQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCXByaXZhdGUgTWFwSW5mbyBnZXRNYXAoU3RyaW5nIGFOb2RlTmFtZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWFwcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhTm9kZU5hbWUuZXF1YWxzKGZNYXBzW2ldLmdldERPTU5hbWUoKSkpCi0JCQkJCXJldHVybiBmTWFwc1tpXTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCSovCi0JfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhZmQ1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FSkJKYXJUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlNvdXJjZUxpbmtUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLCBKMkVFQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwdWJsaWMgc3RhdGljIEVKQkphclRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgRUpCSmFyVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yUGF0aCBFTlRFUlBSSVNFX0JFQU5fTkFNRV9UUkFOU0xBVE9SX1BBVEggPQotCQkJbmV3IFRyYW5zbGF0b3JQYXRoKAotCQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCQluZXcgVHJhbnNsYXRvcihFSkJfSkFSLCBST09UX0ZFQVRVUkUpLAotCQkJCQluZXcgVHJhbnNsYXRvcihFbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yLkVOVEVSUFJJU0VfQkVBTlNfUEFUSCwgRUpCX1BLRy5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkpLAotCQkJCQluZXcgVHJhbnNsYXRvcihFSkJfTkFNRSwgRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCkpfSk7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ01SX0ZJRUxEX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKENNUl9GSUVMRF9OQU1FLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENNUl9GSUVMRF9UWVBFX1RSQU5TTEFUT1IgPSBuZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihDTVJfRklFTERfVFlQRSwgRUpCX1BLRy5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJPTEVfU09VUkNFX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiA9IG5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihFSkJfTkFNRSwgRUpCX1BLRy5nZXRSb2xlU291cmNlX0VudGl0eUJlYW4oKSwgRU5URVJQUklTRV9CRUFOX05BTUVfVFJBTlNMQVRPUl9QQVRIKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTVVMVElQTElDSVRZX1RSQU5TTEFUT1IgPSBuZXcgTXVsdGlwbGljaXR5VHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ0FTQ0FERV9ERUxFVEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKENBU0NBREVfREVMRVRFLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBFSkJfUkVMQVRJT05fTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX1JFTEFUSU9OX05BTUUsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFVOQ0hFQ0tFRF9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoVU5DSEVDS0VELCBFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1FVEhPRF9QRVJNSVNTSU9OX1JPTEVfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IgPSBuZXcgU291cmNlTGlua1RyYW5zbGF0b3IoUk9MRV9OQU1FLEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpLG5ldyBUcmFuc2xhdG9yUGF0aCgKLQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihBU1NFTUJMWV9ERVNDUklQVE9SLCBDT05UQUlORVJfRkVBVFVSRSksCi0JCQluZXcgVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSkKLQkJfSkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VDX1JPTEVfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSwJbmV3IFRyYW5zbGF0b3JQYXRoKAotCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKEFTU0VNQkxZX0RFU0NSSVBUT1IsIENPTlRBSU5FUl9GRUFUVVJFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEhPRF9QRVJNSVNTSU9OLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEUsIEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpCi0JCX0pKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFRSQU5TX0FUVFJJQlVURV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoVFJBTlNfQVRUUklCVVRFLCBFSkJfUEtHLmdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUVUSE9EX0VMRU1FTlRfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SID0gbmV3IFNvdXJjZUxpbmtUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSwgRUpCSmFyVHJhbnNsYXRvci5FTlRFUlBSSVNFX0JFQU5fTkFNRV9UUkFOU0xBVE9SX1BBVEgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUVUSE9EX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKE1FVEhPRF9OQU1FLCBFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1FVEhPRF9QQVJBTV9UUkFOU0xBVE9SID0gbmV3IE1ldGhvZFBhcmFtc1RyYW5zbGF0b3IoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X1Bhcm1zKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUVUSE9EX0VMRU1FTlRfS0lORF9UUkFOU0xBVE9SID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvcigpOwotCQotCXB1YmxpYyBFSkJKYXJUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFSkJfSkFSLCBFSkJfUEtHLmdldEVKQkphcigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OyAKLQkJfQotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLAotCQkJbmV3IEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVJlbGF0aW9uc2hpcHNUcmFuc2xhdG9yMTMoKSwKLQkJCWNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvclRyYW5zbGF0b3IxMygpLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCX0NMSUVOVF9KQVIsIEVKQl9QS0cuZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybgluZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIEVKQl9QS0cuZ2V0RUpCSmFyX1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0VKQl9KQVJfU0NIRU1BX0xPQ18yXzEpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVsYXRpb25zaGlwc1RyYW5zbGF0b3IxNCgpLAotCQkJY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yVHJhbnNsYXRvcjE0KCksCi0JCQluZXcgVHJhbnNsYXRvcihFSkJfQ0xJRU5UX0pBUiwgRUpCX1BLRy5nZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCkpLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVKQkphcl9FeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlbGF0aW9uc2hpcHNUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRUxBVElPTlNISVBTLCBFSkJfUEtHLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbigpKSwKLQkJCQljcmVhdGVFSkJSZWxhdGlvbnNUcmFuc2xhdG9yMTMoKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWxhdGlvbnNUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFSkJfUkVMQVRJT04sIEVKQl9QS0cuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpKSwKLQkJCQlFSkJfUkVMQVRJT05fTkFNRV9UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVUcmFuc2xhdG9yMTMoKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRUpCX1JFTEFUSU9OU0hJUF9ST0xFLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcFJvbGVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpKSwKLQkJCQlFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9UUkFOU0xBVE9SLAotCQkJCU1VTFRJUExJQ0lUWV9UUkFOU0xBVE9SLAotCQkJCUNBU0NBREVfREVMRVRFX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVRyYW5zbGF0b3IxMygpLAotCQkJCWNyZWF0ZUNNUkZpZWxkVHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKSksCi0JCQkJUk9MRV9TT1VSQ0VfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUNNUkZpZWxkVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ01SX0ZJRUxELCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKSksCi0JCQkJQ01SX0ZJRUxEX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlDTVJfRklFTERfVFlQRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogSjJFRSAxLjQgUmVsYXRpb25zaGlwCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlbGF0aW9uc2hpcHNUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRUxBVElPTlNISVBTLCBFSkJfUEtHLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKSksCi0JCQkJY3JlYXRlRUpCUmVsYXRpb25zVHJhbnNsYXRvcjE0KCksCi0JCS8vCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldFJlbGF0aW9uc2hpcHNfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlbGF0aW9uc1RyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVKQl9SRUxBVElPTiwgRUpCX1BLRy5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlFSkJfUkVMQVRJT05fTkFNRV9UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVUcmFuc2xhdG9yMTQoKSwKLQkJLy8JCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFSkJfUkVMQVRJT05TSElQX1JPTEUsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9UUkFOU0xBVE9SLAotCQkJCU1VTFRJUExJQ0lUWV9UUkFOU0xBVE9SLAotCQkJCUNBU0NBREVfREVMRVRFX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVRyYW5zbGF0b3IxNCgpLAotCQkJCWNyZWF0ZUNNUkZpZWxkVHJhbnNsYXRvcjE0KCksCi0JCS8vCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlST0xFX1NPVVJDRV9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVDTVJGaWVsZFRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENNUl9GSUVMRCwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlDTVJfRklFTERfTkFNRV9UUkFOU0xBVE9SLAotCQkJCUNNUl9GSUVMRF9UWVBFX1RSQU5TTEFUT1IsCi0JCS8vCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldENNUEF0dHJpYnV0ZV9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogPD0gSjJFRSAxLjMgQXNzZW1ibHkgRGVzY3JpcHRvciAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQVNTRU1CTFlfREVTQ1JJUFRPUiwgRUpCX1BLRy5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjEzKCksCi0JCQkJY3JlYXRlTWV0aG9kUGVybWlzc2lvblRyYW5zbGF0b3IxMygpLAotCQkJCWNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uVHJhbnNsYXRvcjEzKCksCi0JCQkJY3JlYXRlRXhjbHVkZXNMaXN0VHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9EX1BFUk1JU1NJT04sIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbigpKSwKLQkJCQlVTkNIRUNLRURfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfUEVSTUlTU0lPTl9ST0xFX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczEzKEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vVE9ETzogTkVFRCBUTyBGSUdVUkUgT1VUIFNFQ1VSSVRZIFBBVEgJCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpKSwKLQkJCQlTRUNfUk9MRV9OQU1FX1RSQU5TTEFUT1IKLQkJCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09OVEFJTkVSX1RSQU5TQUNUSU9OLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbigpKSwKLQkJCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxMyhFSkJfUEtHLmdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCkpLAotCQkJCVRSQU5TX0FUVFJJQlVURV9UUkFOU0xBVE9SCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUV4Y2x1ZGVzTGlzdFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVYQ0xVREVfTElTVCwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigJbmV3IFRyYW5zbGF0b3JbXSB7IAotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9uKCkpLCAKLQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczEzKEVKQl9QS0cuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9ELCBlRmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCkpLAotCQkJCU1FVEhPRF9FTEVNRU5UX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfRUxFTUVOVF9LSU5EX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfUEFSQU1fVFJBTlNMQVRPUgotCQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8qCi0JICogSjJFRSAxLjQgQXNzZW1ibHkgRGVzY3JpcHRvciAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQVNTRU1CTFlfREVTQ1JJUFRPUiwgRUpCX1BLRy5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjE0KCksCi0JCQkJY3JlYXRlTWV0aG9kUGVybWlzc2lvblRyYW5zbGF0b3IxNCgpLAotCQkJCWNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uVHJhbnNsYXRvcjE0KCksCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCkpLAotCQkJCWNyZWF0ZUV4Y2x1ZGVzTGlzdFRyYW5zbGF0b3IxNCgpLAotCQkvLwkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kUGVybWlzc2lvblRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRF9QRVJNSVNTSU9OLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkpLAotCQkJCVVOQ0hFQ0tFRF9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9QRVJNSVNTSU9OX1JPTEVfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTQoRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCkpCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy9UT0RPOiBORUVEIFRPIEZJR1VSRSBPVVQgU0VDVVJJVFkgUEFUSAkJCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEUsIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlTRUNfUk9MRV9OQU1FX1RSQU5TTEFUT1IKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25UcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05UQUlORVJfVFJBTlNBQ1RJT04sIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxNChFSkJfUEtHLmdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCkpLAotCQkJCVRSQU5TX0FUVFJJQlVURV9UUkFOU0xBVE9SCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUV4Y2x1ZGVzTGlzdFRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVYQ0xVREVfTElTVCwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigJbmV3IFRyYW5zbGF0b3JbXSB7IAotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLCAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpKSwgCi0JCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxNChFSkJfUEtHLmdldEV4Y2x1ZGVMaXN0X01ldGhvZEVsZW1lbnRzKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxNChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRCwgZUZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbnMoKSksCi0JCQkJTUVUSE9EX0VMRU1FTlRfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9FTEVNRU5UX0tJTkRfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfTkFNRV9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9QQVJBTV9UUkFOU0xBVE9SCi0JCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlMDNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuTXVsdGlPYmplY3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlYWRBaGVhZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IgZXh0ZW5kcyBNdWx0aU9iamVjdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVEVSUFJJU0VfQkVBTlNfUEFUSCA9IEVOVEVSUFJJU0VfQkVBTlMrJy8nK0VOVElUWSsnLCcrU0VTU0lPTisnLCcrTUVTU0FHRV9EUklWRU47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Vzc2lvblRyYW5zbGF0b3IgU0VTU0lPTl9UUkFOU0xBVE9SID0gbmV3IFNlc3Npb25UcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW50aXR5VHJhbnNsYXRvciBCTVBfVFJBTlNMQVRPUiA9IG5ldyBFbnRpdHlUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IgQ01QX1RSQU5TTEFUT1I9IG5ldyBDb250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VEcml2ZW5UcmFuc2xhdG9yIE1FU1NBR0VfRFJJVkVOX1RSQU5TTEFUT1IgPSBuZXcgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgZGVsZWdhdGVzOwotCXN0YXRpYyB7Ci0JCWRlbGVnYXRlcyA9IG5ldyBIYXNoTWFwKDcpOwotCQlkZWxlZ2F0ZXMucHV0KFNFU1NJT04sIFNFU1NJT05fVFJBTlNMQVRPUik7Ci0JCWRlbGVnYXRlcy5wdXQoQkVBTiwgQk1QX1RSQU5TTEFUT1IpOwotCQlkZWxlZ2F0ZXMucHV0KENPTlRBSU5FUiwgQ01QX1RSQU5TTEFUT1IpOwotCQlkZWxlZ2F0ZXMucHV0KE1FU1NBR0VfRFJJVkVOLCBNRVNTQUdFX0RSSVZFTl9UUkFOU0xBVE9SKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTlRFUlBSSVNFX0JFQU5TX1BBVEgsIEVKQl9QS0cuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpKTsKLQkJYWRkUmVhZEFoZWFkSGVscGVyKG5ldyBSZWFkQWhlYWRIZWxwZXIoRU5USVRZLCBuZXcgU3RyaW5nW10ge0JFQU4sIENPTlRBSU5FUn0sIFBFUlNJU1RFTkNFX1RZUEUgKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5NdWx0aU9iamVjdFRyYW5zbGF0b3IjZ2V0RGVsZWdhdGVGb3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoRU9iamVjdCBvKSB7Ci0JCXN3aXRjaCAoby5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT04gOgotCQkJCXJldHVybiBTRVNTSU9OX1RSQU5TTEFUT1I7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZOgotCQkJCXJldHVybiBCTVBfVFJBTlNMQVRPUjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFk6Ci0JCQkJcmV0dXJuIENNUF9UUkFOU0xBVE9SOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOOgotCQkJCXJldHVybiBNRVNTQUdFX0RSSVZFTl9UUkFOU0xBVE9SOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJlYW4gdHlwZSBkZWxlZ2F0ZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoU3RyaW5nIGRvbU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVRyYW5zbGF0b3IgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlYWRBaGVhZE5hbWUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IChUcmFuc2xhdG9yKSBkZWxlZ2F0ZXMuZ2V0KHJlYWRBaGVhZE5hbWUpOwotCQllbHNlIAotCQkJcmVzdWx0ID0gKFRyYW5zbGF0b3IpIGRlbGVnYXRlcy5nZXQoZG9tTmFtZSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50aXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50aXR5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA1YWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGl0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eVRyYW5zbGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlRyYW5zbGF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0KLQlwcml2YXRlIGNsYXNzIFBlcnNpc3RlbmNlVHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCQlwdWJsaWMgUGVyc2lzdGVuY2VUeXBlVHJhbnNsYXRvcigpIHsKLQkJCXN1cGVyKFBFUlNJU1RFTkNFX1RZUEUsIChFU3RydWN0dXJhbEZlYXR1cmUpIG51bGwpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2V4dHJhY3RTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZ1ZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JCQkgICAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0UGVyc2lzdGVuY2VUeXBlKCkpOwotCQl9Ci0KLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gQkVBTjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVEVSUFJJU0VfQkVBTlMgKyAnLycgKyBFTlRJVFkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRTcGVjaWZpY01hcHMoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0U3BlY2lmaWNNYXBzKGludCB2ZXJzaW9uSUQpIHsKLQkJVHJhbnNsYXRvciByZWVudHJhbnRUcmFuc2xhdG9yID0gbnVsbDsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgSjJFRV8xXzJfSUQgOgotCQkJY2FzZSBKMkVFXzFfM19JRCA6Ci0JCQkJcmVlbnRyYW50VHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKFJFRU5UUkFOVCwgRUpCX1BLRy5nZXRFbnRpdHlfUmVlbnRyYW50KCksIFVOU0VUX0lGX05VTEwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFXzFfNF9JRCA6Ci0JCQkJcmVlbnRyYW50VHJhbnNsYXRvciA9IG5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUVOVFJBTlQsIEVKQl9QS0cuZ2V0RW50aXR5X1JlZW50cmFudCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsgbmV3IFBlcnNpc3RlbmNlVHlwZVRyYW5zbGF0b3IoKSwgbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoUFJJTV9LRVlfQ0xBU1MsIEVKQl9QS0cuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSksIHJlZW50cmFudFRyYW5zbGF0b3IgfTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW50aXR5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UeXBlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0OTAyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9KTVMgPSAiamF2YXguam1zLiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihERVNUSU5BVElPTl9UWVBFLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9UeXBlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKXsKLQkJCUVudW1lcmF0b3IgZW51bWVyYXRvciA9IChFbnVtZXJhdG9yKSB2YWx1ZTsKLQkJCWlmIChlbnVtZXJhdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIEpBVkFYX0pNUyArIGVudW1lcmF0b3IudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY29udmVydFZhbHVlVG9TdHJpbmcodmFsdWUsIG93bmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCVN0cmluZyBjb3JyZWN0ID0gc3RyVmFsdWU7Ci0JCWlmIChzdHJWYWx1ZSAhPSBudWxsKQotCQkJY29ycmVjdCA9IHN0clZhbHVlLnN1YnN0cmluZyhKQVZBWF9KTVMubGVuZ3RoKCkpOwotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWM3NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VEcml2ZW5UcmFuc2xhdG9yIGV4dGVuZHMgQWJzdHJhY3RFSkJUcmFuc2xhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIFRSQU5TQUNUSU9OX1RZUEVfWExBVE9SID0gbmV3IFRyYW5zbGF0b3IoVFJBTlNBQ1RJT05fVFlQRSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX1RyYW5zYWN0aW9uVHlwZSgpKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVEVSUFJJU0VfQkVBTlMrJy8nK01FU1NBR0VfRFJJVkVOKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRTcGVjaWZpY01hcHMoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0U3BlY2lmaWNNYXBzKGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgSjJFRV8xXzRfSUQ6Ci0JCQkJcmV0dXJuIGdldFNwZWNpZmljTWFwczE0KCk7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBnZXRTcGVjaWZpY01hcHMxMygpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0U3BlY2lmaWNNYXBzMTMoKSB7Ci0JCi0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCVRSQU5TQUNUSU9OX1RZUEVfWExBVE9SLAotCQkJCi0JCQkvL0VKQiAyLjAgUEFUSAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9TRUxFQ1RPUiwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2VTZWxlY3RvcigpKSwKLQkJCW5ldyBBY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UcmFuc2xhdG9yKCksCi0JCQkKLQkJfTsgCi0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMxNCgpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkvL0VKQiAyLjEgT25seQotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoTUVTU0FHSU5HX1RZUEUsIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCkpLAotCQkJLy9Cb3RoCi0JCQlUUkFOU0FDVElPTl9UWVBFX1hMQVRPUiwKLQkJCS8vRUpCIDIuMSBQQVRICi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihNRVNTQUdFX0RFU1RfVFlQRSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2VEZXN0aW5hdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9MSU5LLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fTGluaygpKSwKLQkJCWNyZWF0ZUFjdGl2YXRpb25Db25maWd1cmF0aW9uTWFwcygpLAotCQl9OyAKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlndXJhdGlvbk1hcHMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBQ1RJVkFUSU9OX0NPTkYsIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXXsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCkpLAotCQkJY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXNNYXAoKSwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRBY3RpdmF0aW9uQ29uZmlnX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllc01hcCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFDVElWQVRJT05fQ09ORl9QUk9QRVJUWSwgRUpCX1BLRy5nZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKEFDVElWQVRJT05fQ09ORl9QUk9QRVJUWV9OQU1FLCBFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQUNUSVZBVElPTl9DT05GX1BST1BFUlRZX1ZBTFVFLCBFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpKQotCQl9KTsJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTixFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbiggbmV3IFRyYW5zbGF0b3JbXXsKLQkJCW5ldyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UeXBlVHJhbnNsYXRvcigpLAotCQkJbmV3IFRyYW5zbGF0b3IoU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFksIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjZ2V0RW5kTWFwczEzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxMygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRU5WX0VOVFJZXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9SRUZfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzMsCi0JCQluZXcgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfMwotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxNCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRU5WX0VOVFJZXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9TRVJWSUNFX1JFRl8xXzQsCQotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfTUVTU0FHRV9ERVNUX1JFRl8xXzQsCi0JCQluZXcgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI3VzZXNIb21lUmVtb3RlQXR0cmlidXRlcygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg3MzVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0gICAgICogQHBhcmFtIGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IoKXsKLQkJc3VwZXIoTUVUSE9EX0lOVEYsIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCkpOwotICAgIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlPYmplY3Qgb2JqID0gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQkJaWYob2JqICE9IG51bGwpCi0JCQlyZXR1cm4gb2JqOwotCQlTdHJpbmcgY29ycmVjdCA9IHN0clZhbHVlOwotCQlpZiAoc3RyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiSE9NRSIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIlJFTU9URSIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIlJlbW90ZSI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoc3RyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiTE9DQUxIT01FIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTG9jYWxIb21lIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChzdHJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJMT0NBTCIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIkxvY2FsIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLSAgICAgICAgaWYgKCgoTWV0aG9kRWxlbWVudCllbWZPYmplY3QpLmdldFR5cGUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKQotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNTZXRNT0ZWYWx1ZShlbWZPYmplY3QpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCWlmKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiAwKSB7Ci0JCQlNZXRob2RFbGVtZW50S2luZCBtZXRob2RJbnRmID0gKE1ldGhvZEVsZW1lbnRLaW5kKSByZXN1bHQuZ2V0KDApOwotCQkJaWYobWV0aG9kSW50Zi5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEKSAKLQkJCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4MjUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RQYXJhbXNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbXNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCi0JLy9wcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZTsKLQotICAgIHB1YmxpYyBNZXRob2RQYXJhbXNUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotICAgICAgICBzdXBlcihNRVRIT0RfUEFSQU1TKycvJytNRVRIT0RfUEFSQU0gLCBlRmVhdHVyZSk7Ci0gICAgICAgIC8vdGhpcy5lRmVhdHVyZSA9IGVGZWF0dXJlOwotICAgICAgICB0aGlzLmZTdHlsZSB8PSBUcmFuc2xhdG9yLkVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQ7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLSAJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpbW9mT2JqZWN0KS5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQlMaXN0IG1ldGhvZFBhcmFtcyA9ICgoTWV0aG9kRWxlbWVudCltb2ZPYmplY3QpLmdldE1ldGhvZFBhcmFtcygpOwotCQkKLSAgICAJaWYodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsgIAotICAgIAkJaWYobWV0aG9kUGFyYW1zID09IG51bGwgfHwgbWV0aG9kUGFyYW1zLnNpemUoKSA9PSAwICkgewotICAgIAkJCXNldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChtb2ZPYmplY3QpOwotCQkJfQotICAgIAl9IGVsc2UgewotCQkJKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuYWRkTWV0aG9kUGFyYW1zKChTdHJpbmcpdmFsdWUpOwotICAgIAl9Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCSgoTWV0aG9kRWxlbWVudClvd25lcikuYWRkTWV0aG9kUGFyYW1zKChTdHJpbmcpdmFsdWUpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NsZWFyTGlzdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3QoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuZVVuc2V0KGZlYXR1cmUpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzaG91bGRSZW5kZXJFbXB0eURPTVBhdGgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCQlNZXRob2RFbGVtZW50IG1lID0gKChNZXRob2RFbGVtZW50KWVPYmplY3QpOwotCQlyZXR1cm4gbWUuaGFzTWV0aG9kUGFyYW1zKCkgJiYgbWUuZ2V0TWV0aG9kUGFyYW1zKCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCQkoKE1ldGhvZEVsZW1lbnQpZU9iamVjdCkuYXBwbHlaZXJvUGFyYW1zKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTXVsdGlwbGljaXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTXVsdGlwbGljaXR5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGQxYjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL011bHRpcGxpY2l0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgYWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBsaWNpdHlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySXsKLQkKLQlwdWJsaWMgTXVsdGlwbGljaXR5VHJhbnNsYXRvcigpewotCQlzdXBlcihNVUxUSVBMSUNJVFksRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCVN0cmluZyBjb3JyZWN0ID0gc3RyVmFsdWU7Ci0JCWlmIChzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpLmVxdWFscygiT05FIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiT25lIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpLmVxdWFscygiTUFOWSIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIk1hbnkiOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNvcnJlY3QsIG93bmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMzEyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9QcmltS2V5RmllbGRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlNvdXJjZUxpbmtUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltS2V5RmllbGRUcmFuc2xhdG9yIGV4dGVuZHMgU291cmNlTGlua1RyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKiBAcGFyYW0gVHJhbnNsYXRvclBhdGgKLQkgKi8KLQlwdWJsaWMgUHJpbUtleUZpZWxkVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUFJJTUtFWV9GSUVMRCwgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSxuZXcgVHJhbnNsYXRvclBhdGgoCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQluZXcgVHJhbnNsYXRvcihDTVBfRklFTEQsIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSksCi0JCQkJbmV3IFRyYW5zbGF0b3IoRklFTERfTkFNRSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSkKLQkJCX0pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjaWZpZWRQcmltS2V5RmllbGROYW1lKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJLy8gdHJ5IGFuZCBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gYSBjbXAgYXR0cmlidXRlLCBvdGhlcndpc2UgY3JlYXRlIGEgcHJveHkKLQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQgPT0gc3RyVmFsdWUgLypyZWZlcmVuY2UgY2hlY2sgaXMgdmFsaWQgaGVyZSovKSB7Ci0JCQlyZXN1bHQgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJCWlmIChzdHJWYWx1ZSA9PSBudWxsKSBzdHJWYWx1ZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCSgoSW50ZXJuYWxFT2JqZWN0KXJlc3VsdCkuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoc3RyVmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1NlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTliNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlYWRBaGVhZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIFJVTl9BU19UUkFOU0xBVE9SUyA9IGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcnMoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gVVNFX0NBTExFUl9UUkFOU0xBVE9SUyA9IGNyZWF0ZVVzZUNhbGxlclRyYW5zbGF0b3JzKCk7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcnMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJ1bkFzVHJhbnNsYXRvciA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSVU5fQVMsIENPTU1PTl9QS0cuZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpKTsKLQkJcnVuQXNUcmFuc2xhdG9yLnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENPTU1PTl9QS0cuZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSksCi0JCQlydW5Bc1RyYW5zbGF0b3IKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZVVzZUNhbGxlclRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoVVNFX0NBTExFUl9JREVOVElUWSwgbnVsbCwgRU1QVFlfVEFHKQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoU0VDVVJJVFlfSURFTlRJVFksIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWFkZFJlYWRBaGVhZEhlbHBlcihuZXcgUmVhZEFoZWFkSGVscGVyKFNFQ1VSSVRZX0lERU5USVRZLCBuZXcgU3RyaW5nW10ge1JVTl9BUywgVVNFX0NBTExFUl9JREVOVElUWX0sIG51bGwpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQkJaWYgKCgoU2VjdXJpdHlJZGVudGl0eSlvKS5pc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSkKLQkJCXJldHVybiBSVU5fQVNfVFJBTlNMQVRPUlM7Ci0JCWVsc2UgaWYgKCgoU2VjdXJpdHlJZGVudGl0eSlvKS5pc1VzZUNhbGxlcklkZW50aXR5KCkpCi0JCQlyZXR1cm4gVVNFX0NBTExFUl9UUkFOU0xBVE9SUzsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IFNlY3VyaXR5IElkZW50aXR5IFR5cGUgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJQ29tbW9uRmFjdG9yeSBmYWN0ID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0U7IAotCQlpZiAoUlVOX0FTLmVxdWFscyhyZWFkQWhlYWROYW1lKSkgewotCQkJUnVuQXNTcGVjaWZpZWRJZGVudGl0eSByZXN1bHQgPSBmYWN0LmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQkJCXJlc3VsdC5zZXRJZGVudGl0eShmYWN0LmNyZWF0ZUlkZW50aXR5KCkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIGlmIChVU0VfQ0FMTEVSX0lERU5USVRZLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2Vzc2lvblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1Nlc3Npb25UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2Q0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2Vzc2lvblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25UcmFuc2xhdG9yIGV4dGVuZHMgQWJzdHJhY3RFSkJUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBTZXNzaW9uVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRU5URVJQUklTRV9CRUFOUysnLycrU0VTU0lPTik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihTRVNTSU9OX1RZUEUsIEVKQl9QS0cuZ2V0U2Vzc2lvbl9TZXNzaW9uVHlwZSgpLCBVTlNFVF9JRl9OVUxMKSwgCQkvL0VudW1lcmF0aW9uCi0JCQluZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9UWVBFLCBFSkJfUEtHLmdldFNlc3Npb25fVHJhbnNhY3Rpb25UeXBlKCksIFVOU0VUX0lGX05VTEwpIAkJLy9FbnVtZXJhdGlvbgotCQl9OwotCX0KLQkJCi0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRFSkJDbGFzc01hcCgpCi0JICogCi0JICogU3VwcG9ydCAxLjQgYW5kIDEuMwotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RUpCQ2xhc3NNYXAoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsJCQkKLQkJCS8vSjJFRSAxLjQKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFNFUlZJQ0VfRU5EUE9JTlQsRUpCX1BLRy5nZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpKSwKLQkJCS8vSjJFRSAxLjMKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEVKQl9DTEFTUywgRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpKQotCQl9OwotCQkKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OyAKLQkJfQotCX0KLQkKLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzA1NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5KYXZhQ2xhc3NUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5XYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVhZEFoZWFkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JQYWdlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBFUlJPUl9DT0RFX1hMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJbmV3IFRyYW5zbGF0b3IoRVJST1JfQ09ERSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCkpLAotCQluZXcgVHJhbnNsYXRvcihMT0NBVElPTiwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSkKLQl9OwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBFWENFUFRJT05fVFlQRV9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEVYQ0VQVElPTl9UWVBFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpKSwKLQkJbmV3IFRyYW5zbGF0b3IoTE9DQVRJT04sIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCkpCi0JfTsKLQkKLQlwdWJsaWMgRXJyb3JQYWdlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRVJST1JfUEFHRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfRXJyb3JQYWdlcygpKTsKLQkJYWRkUmVhZEFoZWFkSGVscGVyKG5ldyBSZWFkQWhlYWRIZWxwZXIoRVJST1JfUEFHRSwgbmV3IFN0cmluZ1tdIHtFUlJPUl9DT0RFLCBFWENFUFRJT05fVFlQRX0sIG51bGwpKTsKLQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZmFjdCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JCWlmIChFUlJPUl9DT0RFLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCQllbHNlIGlmIChFWENFUFRJT05fVFlQRS5lcXVhbHMocmVhZEFoZWFkTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCQlpZiAoKChFcnJvclBhZ2UpbykuaXNFcnJvckNvZGUoKSkKLQkJCXJldHVybiBFUlJPUl9DT0RFX1hMQVRPUlM7Ci0JCWVsc2UgaWYgKCgoRXJyb3JQYWdlKW8pLmlzRXhjZXB0aW9uVHlwZSgpKQotCQkJcmV0dXJuIEVYQ0VQVElPTl9UWVBFX1hMQVRPUlM7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBFcnJvckNvZGUgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYkFwcFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViQXBwVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQyNmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViQXBwVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYmFwcGxpY2F0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uRW52RW50cnlUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Tb3VyY2VMaW5rVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBXRUJBUFBfUEtHID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBKc3BQYWNrYWdlIEpTUF9QS0cgPSBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQlwdWJsaWMgc3RhdGljIFdlYkFwcFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgV2ViQXBwVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VSVkxFVF9NQVBQSU5HX1RSQU5TTEFUT1IgPSBjcmVhdGVTZXJ2bGV0TWFwcGluZ1RyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFU1NJT05fQ09ORklHX1RSQU5TTEFUT1IgPSBjcmVhdGVTZXNzaW9uQ29uZmlnVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiA9IGNyZWF0ZUZpbGVMaXN0VHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUlNRV9NQVBQSU5HX1RSQU5TTEFUT1IgPSBjcmVhdGVNaW1lTWFwcGluZ1RyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVSUk9SX1BBR0VfVFJBTlNMQVRPUiA9IG5ldyBFcnJvclBhZ2VUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBMT0dJTl9DT05GSUdfVFJBTlNMQVRPUiA9IGNyZWF0ZUxvZ2luQ29uZmlnVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRElTVFJJQlVUQUJMRSwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpLCBFTVBUWV9UQUcpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgV0VCX1JFU09VUkNFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9OQU1FLCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSk7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVVJMX1BBVFRFUk5fVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFVSTF9QQVRURVJOLCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSFRUUF9NRVRIT0RfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEhUVFBfTUVUSE9ELCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIFdFQkFQUF9QS0cuZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBUUkFOU1BPUlRfR1VBUkFOVEVFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihUUkFOU1BPUlRfR1VBUkFOVEVFLCBXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSk7Ci0KLQkKLQlwcm90ZWN0ZWQgV2ViQXBwVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRXZWJBcHAoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SLAotCQkJY3JlYXRlQ29udGV4dFBhcmFtMTNUcmFuc2xhdG9yKCksCSAKLQkJCWNyZWF0ZUZpbHRlcjEzVHJhbnNsYXRvcigpLAkgCi0JCQljcmVhdGVGaWx0ZXJNYXBwaW5nMTNUcmFuc2xhdG9yKCksCSAKLQkJCWNyZWF0ZUxpc3RlbmVyMTNUcmFuc2xhdG9yKCksIAotCQkJY3JlYXRlU2VydmxldDEzVHJhbnNsYXRvcigpLCAKLQkJCVNFUlZMRVRfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlTRVNTSU9OX0NPTkZJR19UUkFOU0xBVE9SLAkgCi0JCQlNSU1FX01BUFBJTkdfVFJBTlNMQVRPUiwJIAotCQkJV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiwgCi0JCQlFUlJPUl9QQUdFX1RSQU5TTEFUT1IsIAotCQkJY3JlYXRlVGFnTGliVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1RhZ0xpYnMoKSksIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzMsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMywKLQkJCWNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludFRyYW5zbGF0b3IxMygpLAotCQkJTE9HSU5fQ09ORklHX1RSQU5TTEFUT1IsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSksIAotCQkJbmV3IEVudkVudHJ5VHJhbnNsYXRvcihDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIGZhbHNlLCBmYWxzZSksIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzMgCi0JCX07Ci0JfQotCQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxNENoaWxkcmVuKCkgewotCQlUcmFuc2xhdG9yW10gYmVnaW4gPSAgbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytXRUJfQVBQX1NDSEVNQV9MT0NfMl80KSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUGFyYW1WYWx1ZVR5cGUoQ09OVEVYVF9QQVJBTSwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpKSwKLQkJCWNyZWF0ZUZpbHRlcjE0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRmlsdGVyTWFwcGluZzE0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTGlzdGVuZXIxNFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcnZsZXQxNFRyYW5zbGF0b3IoKSwKLQkJCVNFUlZMRVRfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlTRVNTSU9OX0NPTkZJR19UUkFOU0xBVE9SLAkgCi0JCQlNSU1FX01BUFBJTkdfVFJBTlNMQVRPUiwJIAotCQkJV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiwgCi0JCQlFUlJPUl9QQUdFX1RSQU5TTEFUT1IsCi0JCQljcmVhdGVKU1BDb25maWdUcmFuc2xhdG9ycygpLAotCQkJY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50VHJhbnNsYXRvcnMxNCgpLAotCQkJTE9HSU5fQ09ORklHX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpKQotCQl9OwotCQlUcmFuc2xhdG9yW10gZW5kID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCQljcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0VHJhbnNsYXRvcigpLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFdlYkFwcF9FeHRlbnNpb25zKCkpCi0JCX07Ci0JCQotCQkKLQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGJlZ2luLGNvbmNhdChjcmVhdGVKTkRJRW52aXJvbm1lbnRSZWZzR3JvdXBUcmFuc2xhdG9yKCksIGVuZCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50VHJhbnNsYXRvcnMxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEaXNwbGF5TmFtZVRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkpLAotCQkJY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uVHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxNCgpLAotCQkJY3JlYXRlVXNlckRhdGFDb25zdHJhaW50VHJhbnNsYXRvcjE0KCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvblRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OLCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlXRUJfUkVTT1VSQ0VfTkFNRV9UUkFOU0xBVE9SLCAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSksIAotCQkJVVJMX1BBVFRFUk5fVFJBTlNMQVRPUiwKLQkJCUhUVFBfTUVUSE9EX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQXV0aENvbnN0cmFpbnRUcmFuc2xhdG9yMTQoKSB7IAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQVVUSF9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkpLCAKLQkJCVJPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludFRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFVTRVJfREFUQV9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSksIAotCQkJVFJBTlNQT1JUX0dVQVJBTlRFRV9UUkFOU0xBVE9SIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKU1BDb25maWdUcmFuc2xhdG9ycygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEpTUF9DT05GSUcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0pzcENvbmZpZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlVGFnTGliVHJhbnNsYXRvcjE0KEpTUF9QS0cuZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKSksCi0JCQljcmVhdGVKU1BQcm9wZXJ0eUdyb3VwVHJhbnNsYXRvcigpCi0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSlNQUHJvcGVydHlHcm91cFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKU1BfUFJPUEVSVFlfR1JPVVAsIEpTUF9QS0cuZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFVSTF9QQVRURVJOLCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihFTF9JR05PUkVELCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFHRV9FTkNPRElORywgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihTQ1JJUFRJTkdfSU5WQUxJRCwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSksCi0JCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoSVNfWE1MLEpTUF9QS0cuZ2V0SlNQUHJvcGVydHlHcm91cF9Jc1hNTCgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKElOQ0xVREVfUFJFTFVERSwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKElOQ0xVREVfQ09EQSwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpKQotCQl9KTsJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQkKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxFLCBXRUJBUFBfUEtHLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihFTkNPRElORywgV0VCQVBQX1BLRy5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjcmVhdGVKTkRJRW52aXJvbm1lbnRSZWZzR3JvdXBUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCwJCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9NRVNTQUdFX0RFU1RfUkVGXzFfNAotCQl9OwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVGaWx0ZXJNYXBwaW5nMTRUcmFuc2xhdG9yKCkgewotCQlUcmFuc2xhdG9yIGRpc3BhdGNoZXIgPSBuZXcgVHJhbnNsYXRvcihESVNQQVRDSEVSLCBXRUJBUFBfUEtHLmdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKSk7Ci0JCXJldHVybiBHZW5lcmljVHJhbnNsYXRvci5hcHBlbmRDaGlsZCgoR2VuZXJpY1RyYW5zbGF0b3IpY3JlYXRlRmlsdGVyTWFwcGluZzEzVHJhbnNsYXRvcigpLGRpc3BhdGNoZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQ29udGV4dFBhcmFtMTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09OVEVYVF9QQVJBTSwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfQ29udGV4dHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIFdFQkFQUF9QS0cuZ2V0Q29udGV4dFBhcmFtX1BhcmFtTmFtZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgV0VCQVBQX1BLRy5nZXRDb250ZXh0UGFyYW1fUGFyYW1WYWx1ZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV0VCQVBQX1BLRy5nZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSksIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZpbHRlcjEzVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEZJTFRFUiwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKEZJTFRFUl9OQU1FLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9OYW1lKCksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQkJfSkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEZJTFRFUl9DTEFTUywgV0VCQVBQX1BLRy5nZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSksIAotCQkJY3JlYXRlSW5pdFBhcmFtVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldEZpbHRlcl9Jbml0UGFyYW1zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRmlsdGVyMTRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRklMVEVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKEZJTFRFUl9OQU1FLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9OYW1lKCksIAotCQkJCQkJLy9UT0RPOiBNYWtlIHN1cmUgdGhlIHBhdGggaXMgc3RpbGwgdmFsaWQKLQkJCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihXRUJfQVBQLCBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpLCAKLQkJCQkJCX0pKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEZJTFRFUl9DTEFTUywgV0VCQVBQX1BLRy5nZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSksIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUGFyYW1WYWx1ZVR5cGUoSU5JVF9QQVJBTSxXRUJBUFBfUEtHLmdldEZpbHRlcl9Jbml0UGFyYW1WYWx1ZXMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVGaWx0ZXJNYXBwaW5nMTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRklMVEVSX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgU291cmNlTGlua1RyYW5zbGF0b3IoRklMVEVSX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXIoKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvclBhdGgobmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgVHJhbnNsYXRvci5DT05UQUlORVJfRkVBVFVSRSksIAotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKEZJTFRFUiwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVycygpKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyX05hbWUoKSkKLQkJCQkJCX0pKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFVSTF9QQVRURVJOLCBXRUJBUFBfUEtHLmdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybigpKSwgCi0JCQluZXcgU291cmNlTGlua1RyYW5zbGF0b3IoU0VSVkxFVF9OQU1FLCBXRUJBUFBfUEtHLmdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCAKLQkJCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihXRUJfQVBQLCBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VydmxldHMoKSksIAotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCkpIAotCQkJCQkJfSksIFRyYW5zbGF0b3IuU1RSSU5HX1JFU1VMVF9PSyksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlSW5pdFBhcmFtVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSU5JVF9QQVJBTSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIFdFQkFQUF9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgV0VCQVBQX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV0VCQVBQX1BLRy5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSksIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUxpc3RlbmVyMTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTElTVEVORVIsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0xpc3RlbmVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuTElTVEVORVJfQ0xBU1NfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUxpc3RlbmVyMTRUcmFuc2xhdG9yKCkgewotCQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKExJU1RFTkVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9MaXN0ZW5lcnMoKSk7Ci0JCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5MSVNURU5FUl9DTEFTU19UUkFOU0xBVE9SCi0JCQl9KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZXJ2bGV0MTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVkxFVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VydmxldHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCAKLQkJCQluZXcgVHJhbnNsYXRvclBhdGhbXSB7Ci0JCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9XZWJBcHAoKSksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVF9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9XZWJBcHAoKSksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpLCAKLQkJCQkJfSksIAotCQkJCX0pLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCW5ldyBXZWJUeXBlVHJhbnNsYXRvcigpLCAvL3NlcnZsZXQtY2xhc3Mgb3IganNwLWZpbGUgIAotCQkJY3JlYXRlSW5pdFBhcmFtVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFNlcnZsZXRfUGFyYW1zKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKExPQURfT05fU1RBUlRVUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSdW5Bc1RyYW5zbGF0b3IxMyhXRUJBUFBfUEtHLmdldFNlcnZsZXRfUnVuQXMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTMoV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKSkgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZsZXQxNFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWTEVULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCAKLQkJCQluZXcgVHJhbnNsYXRvclBhdGhbXSB7Ci0JCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9XZWJBcHAoKSksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVF9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9XZWJBcHAoKSksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpLCAKLQkJCQkJfSksIAotCQkJCX0pLAotCQkJbmV3IFdlYlR5cGVUcmFuc2xhdG9yKCksIC8vc2VydmxldC1jbGFzcyBvciBqc3AtZmlsZSAgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVQYXJhbVZhbHVlVHlwZShJTklUX1BBUkFNLFdFQkFQUF9QS0cuZ2V0U2VydmxldF9Jbml0UGFyYW1zKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKExPQURfT05fU1RBUlRVUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSdW5Bc1RyYW5zbGF0b3IxNChXRUJBUFBfUEtHLmdldFNlcnZsZXRfUnVuQXMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTQoV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKSksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0U2VydmxldF9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmxldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVkxFVF9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldCgpLCAKLQkJCQluZXcgVHJhbnNsYXRvclBhdGgobmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIENPTlRBSU5FUl9GRUFUVVJFKSwgCi0JCQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRzKCkpLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVF9OQU1FLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKSkgCi0JCQkJfSkpLAotCQkJbmV3IFRyYW5zbGF0b3IoVVJMX1BBVFRFUk4sIFdFQkFQUF9QS0cuZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZXNzaW9uQ29uZmlnVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFU1NJT05fQ09ORklHLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihTRVNTSU9OX1RJTUVPVVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWltZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUlNRV9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKEVYVEVOU0lPTiwgV0VCQVBQX1BLRy5nZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTUlNRV9UWVBFLCBXRUJBUFBfUEtHLmdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkpLCAKLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZpbGVMaXN0VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFTENPTUVfRklMRV9MSVNULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWxlTGlzdCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoV0VMQ09NRV9GSUxFLCBXRUJBUFBfUEtHLmdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksIFdFQkFQUF9QS0cuZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVUYWdMaWJUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFRBR0xJQiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFRBR0xJQl9VUkksIEpTUF9QS0cuZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoVEFHTElCX0xPQ0FUSU9OLCBKU1BfUEtHLmdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSkgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlVGFnTGliVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihUQUdMSUIsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihUQUdMSUJfVVJJLCBXRUJBUFBfUEtHLmdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoVEFHTElCX0xPQ0FUSU9OLCBXRUJBUFBfUEtHLmdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Db25zdHJhaW50cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpKSwKLQkJCWNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvblRyYW5zbGF0b3IxMygpLAotCQkJY3JlYXRlQXV0aENvbnN0cmFpbnRUcmFuc2xhdG9yMTMoKSwKLQkJCWNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludFRyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25UcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiwgV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJV0VCX1JFU09VUkNFX05BTUVfVFJBTlNMQVRPUiwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTixXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbigpKSwgCi0JCQlVUkxfUEFUVEVSTl9UUkFOU0xBVE9SLAotCQkJSFRUUF9NRVRIT0RfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxMygpIHsgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBVVRIX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV0VCQVBQX1BLRy5nZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbigpKSwgCi0JCQlST0xFX05BTUVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihVU0VSX0RBVEFfQ09OU1RSQUlOVCwgV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV0VCQVBQX1BLRy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSksIAotCQkJVFJBTlNQT1JUX0dVQVJBTlRFRV9UUkFOU0xBVE9SIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUxvZ2luQ29uZmlnVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKExPR0lOX0NPTkZJRywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfTG9naW5Db25maWcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKEFVVEhfTUVUSE9ELCBXRUJBUFBfUEtHLmdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgVHJhbnNsYXRvci5FTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TKSwgCi0JCQluZXcgVHJhbnNsYXRvcihSRUFMTV9OQU1FLCBXRUJBUFBfUEtHLmdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpKSwgCi0JCQljcmVhdGVGb3JtTG9naW5Db25maWdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVGb3JtTG9naW5Db25maWdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRk9STV9MT0dJTl9DT05GSUcsICBXRUJBUFBfUEtHLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoRk9STV9MT0dJTl9QQUdFLCBXRUJBUFBfUEtHLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKEZPUk1fRVJST1JfUEFHRSwgV0VCQVBQX1BLRy5nZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDI3YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYmFwcGxpY2F0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFdlYlR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFUlZMRVRfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSkKLQl9OwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBKU1BfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BUeXBlX0pzcEZpbGUoKSkKLQl9OwotCQotCXB1YmxpYyBXZWJUeXBlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoU0VSVkxFVF9DTEFTUysnLCcrSlNQX0ZJTEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldF9XZWJUeXBlKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQkJaWYgKCgoV2ViVHlwZSlvKS5pc0pzcFR5cGUoKSkKLQkJCXJldHVybiBKU1BfWExBVE9SUzsKLQkJZWxzZSBpZiAoKChXZWJUeXBlKW8pLmlzU2VydmxldFR5cGUoKSkKLQkJCXJldHVybiBTRVJWTEVUX1hMQVRPUlM7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBXZWIgVHlwZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCgoV2ViVHlwZSl2YWx1ZSkuaXNKc3BUeXBlKCkpCi0JCQlyZXR1cm4gSlNQX0ZJTEU7Ci0JCWVsc2UgaWYgKCgoV2ViVHlwZSl2YWx1ZSkuaXNTZXJ2bGV0VHlwZSgpKQotCQkJcmV0dXJuIFNFUlZMRVRfQ0xBU1M7Ci0JCWVsc2UgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogV2ViIFR5cGUgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZmFjdCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JCWlmIChTRVJWTEVUX0NMQVNTLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQllbHNlIGlmIChKU1BfRklMRS5lcXVhbHMobm9kZU5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlSlNQVHlwZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlNmQ4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VKQkxpbmtUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRUpCTGlua1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgV3NkZFhtbE1hcHBlckkgewotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBFSkJfTElOS19YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTGlua19FamJMaW5rKCkpCi0JfTsKLQkKLQlwdWJsaWMgRUpCTGlua1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVKQl9MSU5LLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQotCQlyZXR1cm4gRUpCX0xJTktfWExBVE9SUzsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCSAgcmV0dXJuIEVKQl9MSU5LOwotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlXc2RkRmFjdG9yeSBmYWN0ID0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdzZGRGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0LmNyZWF0ZUVKQkxpbmsoKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VsZW1lbnROYW1lVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FbGVtZW50TmFtZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzOTEzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VsZW1lbnROYW1lVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnROYW1lVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBKYXhycGNtYXBYbWxNYXBwZXJJIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gICBFTEVNRU5UX05BTUVfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWVfVGV4dCgpKQotCX07Ci0JCi0JcHVibGljIEVsZW1lbnROYW1lVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRUxFTUVOVF9OQU1FLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0KLQkJcmV0dXJuIEVMRU1FTlRfTkFNRV9YTEFUT1JTOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JICByZXR1cm4gRUxFTUVOVF9OQU1FOwotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlKYXhycGNtYXBGYWN0b3J5IGZhY3QgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXhycGNtYXBGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0LmNyZWF0ZUVsZW1lbnROYW1lKCk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9JbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9JbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWJkNGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBKYXhycGNtYXBYbWxNYXBwZXJJIHsKLQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBTRVJWSUNFX0lOVEVSRkFDRV8xMFhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKSksCi0gICAgIGNyZWF0ZTEwV1NETFNlcnZpY2VOYW1lVHJhbnNsYXRvcigpLAotICAgICBjcmVhdGVQb3J0TWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU0VSVklDRV9JTlRFUkZBQ0VfMTFYTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0gICAgIG5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfSU5URVJGQUNFLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9TRVJWSUNFX05BTUUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpKSwKLSAgICAgY3JlYXRlUG9ydE1hcHBpbmdUcmFuc2xhdG9yKCkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFSV8xMFhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotICAgICAgY3JlYXRlMTBXU0RMUG9ydFR5cGVUcmFuc2xhdG9yKCksCi0gICAgICBjcmVhdGUxMFdTRExCaW5kaW5nVHJhbnNsYXRvcigpLAotICAgICAgY3JlYXRlMTBTRU1ldGhvZE1hcHBpbmdUcmFuc2xhdG9yKCkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFSV8xMVhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9QT1JUX1RZUEUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9CSU5ESU5HLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpLAotICAgICBjcmVhdGUxMVNFTWV0aG9kTWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0JCi0JcHVibGljIEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HKycsJytTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCQlpZiAobyBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIGdldFNlcnZpY2VJbnRlcmZhY2VUcmFuc2xhdG9yKHZlcnNpb25JRCk7Ci0JCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIGdldFNFSVRyYW5zbGF0b3IodmVyc2lvbklEKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEludGVyZmFjZU1hcHBpbmcgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkc7Ci0JCWVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZykKLQkJCXJldHVybiBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HOwotCQllbHNlIAotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEludGVyZmFjZU1hcHBpbmcgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlKYXhycGNtYXBGYWN0b3J5IGZhY3QgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXhycGNtYXBGYWN0b3J5KCk7Ci0JCWlmIChTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpOwotCQllbHNlIGlmIChTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotICAgcHJpdmF0ZSBUcmFuc2xhdG9yW10gZ2V0U2VydmljZUludGVyZmFjZVRyYW5zbGF0b3IoaW50IHZlcnNpb25JRCkKLSAgIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfSU5URVJGQUNFXzEwWExBVE9SUzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfMTFYTEFUT1JTOyAKLQkJfQotICAgIAotICAgfQotCi0gICBwcml2YXRlIFRyYW5zbGF0b3JbXSBnZXRTRUlUcmFuc2xhdG9yKGludCB2ZXJzaW9uSUQpCi0gICB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJCXJldHVybiBTRUlfMTBYTEFUT1JTOwkKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBTRUlfMTFYTEFUT1JTOyAKLQkJfQotICAgIAotICAgfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMU2VydmljZU5hbWVUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX1NFUlZJQ0VfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBvcnRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1BPUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkvKgotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBQb3J0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFBvcnRNYXBwaW5nX1BvcnROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9QT1JUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JKi8KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMUG9ydFR5cGVUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUE9SVF9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExCaW5kaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JICAgIENvbW1vblBhY2thZ2UgY29tbW9uUGFja2FnZSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwkgICAgCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfQklORElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFNFTWV0aG9kTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX01FVEhPRF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX09QRVJBVElPTiwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihXUkFQUEVEX0VMRU1FTlQsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCQljcmVhdGUxME1ldGhvZFBhcmFtUGFydHNNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExU0VNZXRob2RNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfTUVUSE9EX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfT1BFUkFUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdSQVBQRURfRUxFTUVOVCwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJCWNyZWF0ZTExTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1BPU0lUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpKSwKLQkJCWNyZWF0ZTEwV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9QT1NJVElPTiwgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSksCi0JCQljcmVhdGUxMVdTRExNZXNzYWdlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExNZXNzYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9NRVNTQUdFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0gICAgICAgICAgY3JlYXRlMTBXU0RMTWVzc2FnZVRyYW5zbGF0b3IoamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1FVEVSX01PREUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTT0FQX0hFQURFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLSAgICAgICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9NRVNTQUdFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9QQVJUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTUVURVJfTU9ERSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMTWVzc2FnZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkgICAgLy9KYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CSAgICAJICAgIAkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihNRVRIT0RfUkVUVVJOX1ZBTFVFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSksCi0JCQljcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcihqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihNRVRIT0RfUkVUVVJOX1ZBTFVFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSksCi0gICAgICAgICAgQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfTUVTU0FHRSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9KYXhycGNtYXBUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiZWU0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLQotcHVibGljIGNsYXNzIEpheHJwY21hcFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIEpheHJwY21hcFhtbE1hcHBlckksIEoyRUVDb25zdGFudHN7Ci0JcHVibGljIHN0YXRpYyBKYXhycGNtYXBUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IEpheHJwY21hcFRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMDsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMTsKLQlwcml2YXRlIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZTsKLQlwcml2YXRlIENvbW1vblBhY2thZ2UgY29tbW9uUGFja2FnZTsKLQkKLQkKLQlwcm90ZWN0ZWQgSmF4cnBjbWFwVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoSkFWQV9XU0RMX01BUFBJTkcsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkgICAgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQljb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEwID09IG51bGwpCi0JCQkJewotCQkJCQljaGlsZHJlbjEwID0gY3JlYXRlMTBDaGlsZHJlbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4xMDsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xMSA9PSBudWxsKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4xMSA9IGNyZWF0ZTExQ2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTE7IAotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEwQ2hpbGRyZW4oKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVQYWNrYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZTEwSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJbmV3IEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTExQ2hpbGRyZW4oKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK1dlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX1NDSEVNQV9MT0MpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihWRVJTSU9OLCBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8xKSwJCQkgIAkJCSAgCi0JCQljcmVhdGVQYWNrYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZTExSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTFFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJbmV3IEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVQYWNrYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUEFDS0FHRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBQ0tBR0VfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKQVZBX1hNTF9UWVBFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKENMQVNTX1RZUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpKSwKLQkJCWNyZWF0ZTEwUm9vdFR5cGVRbmFtZVRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFFOQU1FX1NDT1BFLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCkpLAotCQkJY3JlYXRlMTBWYXJpYWJsZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKQVZBX1hNTF9UWVBFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQU5PTllNT1VTX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihST09UX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSksCi0JCQkvL2NyZWF0ZTEwUm9vdFR5cGVRbmFtZVRyYW5zbGF0b3IoKSwgIC8vUm9vdFR5cGVRTmFtZSBpcyBzdGlsbCBnb2luZyB0byB3b3JrIHRoZSBvbGQgKDEuMykgd2F5IGJlY2F1c2Ugb2YgYW5vbnltb3VzIHR5cGVzLgotCQkJbmV3IFRyYW5zbGF0b3IoUU5BTUVfU0NPUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKSksCi0JCQljcmVhdGUxMVZhcmlhYmxlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFWENFUFRJT05fTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVYQ0VQVElPTl9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpKSwKLQkJCWNyZWF0ZTEwV1NETE1lc3NhZ2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb25zdHJ1Y3RvclBhcmFtT3JkZXJUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExRXhjZXB0aW9uTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRVhDRVBUSU9OX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihFWENFUFRJT05fVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9NRVNTQUdFLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKSwKLQkJCWNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1PcmRlclRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBQ0tBR0VfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBSb290VHlwZVFuYW1lVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihST09UX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFZhcmlhYmxlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoVkFSSUFCTEVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfVmFyaWFibGVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9WQVJJQUJMRV9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoREFUQV9NRU1CRVIsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpLAotCQkJbmV3IFRyYW5zbGF0b3IoWE1MX0VMRU1FTlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExVmFyaWFibGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihWQVJJQUJMRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1ZBUklBQkxFX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihEQVRBX01FTUJFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCQluZXcgVHJhbnNsYXRvcihYTUxfQVRUUklCVVRFX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihYTUxfRUxFTUVOVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFhNTF9XSUxEQ0FSRCwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBjb21tb25QYWNrYWdlLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1PcmRlclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgRWxlbWVudE5hbWVUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9KYXhycGNtYXBYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmYzg3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0vL2ltcG9ydHMgZm9yIEoyRUUgY29yZSBjbGFzc2VzCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gd2ViIHNlcnZpY2UgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4cnBjbWFwWG1sTWFwcGVySSBleHRlbmRzIFdlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJCi17Ci0gIHB1YmxpYyBTdHJpbmcgSkFWQV9XU0RMX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgID0iamF2YS13c2RsLW1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgQ0xBU1NfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iY2xhc3MtdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJqYXZhLXR5cGUiOyAgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiAgICAgICAgICAgICA9ImNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIERBVEFfTUVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ImRhdGEtbWVtYmVyIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iZWxlbWVudC1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgRVhDRVBUSU9OX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgID0iZXhjZXB0aW9uLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBFWENFUFRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSJleGNlcHRpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfTUVUSE9EX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtbWV0aG9kLW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBKQVZBX1BPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSJqYXZhLXBvcnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfVkFSSUFCTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtdmFyaWFibGUtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfWE1MX1RZUEVfTUFQUElORyAgICAgICAgICAgICAgICAgICA9ImphdmEteG1sLXR5cGUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HICAgICAgICAgICAgICA9Im1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgTUVUSE9EX1JFVFVSTl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0ibWV0aG9kLXJldHVybi12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBQ0tBR0VfTUFQUElORyAgICAgICAgICAgICAgICAgICAgICAgICA9InBhY2thZ2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBQ0tBR0VfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9InBhY2thZ2UtdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBUkFNRVRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9InBhcmFtZXRlci1tb2RlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUEFSQU1fUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0icGFyYW0tcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQQVJBTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJwYXJhbS10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUE9SVF9NQVBQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgID0icG9ydC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUU5BTUVfU0NPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0icW5hbWUtc2NvcGUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBBTk9OWU1PVVNfVFlQRV9RTkFNRSAgICAgICAgICAgICA9ICJhbm9ueW1vdXMtdHlwZS1xbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFJPT1RfVFlQRV9RTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICA9InJvb3QtdHlwZS1xbmFtZSI7Ly8kTk9OLU5MUy0xJAotICAvL3B1YmxpYyBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgICAgICAgICAgICAgID0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiOwotICBwdWJsaWMgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcgICAgICA9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HICAgICAgICAgPSJzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIC8vcHVibGljIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgPSJzZXJ2aWNlLWludGVyZmFjZSI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORyAgICAgICAgICAgICAgID0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICAvL3B1YmxpYyBTdHJpbmcgU09BUF9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ic29hcF9oZWFkZXIiOwotICBwdWJsaWMgU3RyaW5nIFZBUklBQkxFX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgICA9InZhcmlhYmxlLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXUkFQUEVEX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3cmFwcGVkLWVsZW1lbnQiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLWJpbmRpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW1lc3NhZ2UiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX01FU1NBR0VfTUFQUElORyAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUUgICAgICAgICAgICAgICAgICA9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW9wZXJhdGlvbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtcG9ydC10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyAgICAgICAgICAgICAgID0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfU0VSVklDRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtc2VydmljZS1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgWE1MX0FUVFJJQlVURV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgPSJ4bWwtYXR0cmlidXRlLW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgPSJ4bWwtZWxlbWVudC1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgWE1MX1dJTERDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9InhtbC13aWxkY2FyZCI7Ly8kTk9OLU5MUy0xJAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TT0FQUm9sZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwYTM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBTT0FQUm9sZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgV3NkZFhtbE1hcHBlckkgewotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBTT0FQX1JPTEVfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQUm9sZV9Tb2FwUm9sZSgpKQotCX07Ci0JCi0JcHVibGljIFNPQVBSb2xlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoU09BUF9ST0xFLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCi0JCXJldHVybiBTT0FQX1JPTEVfWExBVE9SUzsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCSAgcmV0dXJuIFNPQVBfUk9MRTsKLQl9Ci0KLQkJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJV3Njb21tb25GYWN0b3J5IGZhY3QgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdC5jcmVhdGVTT0FQUm9sZSgpOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU2VydmxldExpbmtUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NlcnZsZXRMaW5rVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNhYmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU2VydmxldExpbmtUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0TGlua1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgV3NkZFhtbE1hcHBlckkgewotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBTRVJWTEVUX0xJTktfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCkpCi0JfTsKLQkKLQlwdWJsaWMgU2VydmxldExpbmtUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTRVJWTEVUX0xJTkssIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQotCQlyZXR1cm4gU0VSVkxFVF9MSU5LX1hMQVRPUlM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkgIHJldHVybiBTRVJWTEVUX0xJTks7Ci0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdzZGRGYWN0b3J5IGZhY3QgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3QuY3JlYXRlU2VydmxldExpbmsoKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjY4YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlQ29tbW9uWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLS8vaW1wb3J0cyBmb3IgSjJFRSBjb3JlIGNsYXNzZXMKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gd2ViIHNlcnZpY2UgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkKLXsKLS8vICBwdWJsaWMgU3RyaW5nIFdTRExfRklMRSAgICAgICAgICAgICAgICAgICAgICAgPSAid3NkbC1maWxlIjsKLS8vICBwdWJsaWMgU3RyaW5nIEpBWFJQQ19NQVBQSU5HX0ZJTEUgICAgICAgICAgICAgPSAiamF4cnBjLW1hcHBpbmctZmlsZSI7Ci0gIHB1YmxpYyBTdHJpbmcgTkFNRVNQQUNFVVJJICAgICAgICAgICAgICAgICAgICA9ICJuYW1lc3BhY2VVUkkiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBMT0NBTFBBUlQgICAgICAgICAgICAgICAgICAgICAgID0gImxvY2FscGFydCI7Ly8kTk9OLU5MUy0xJAotLy8gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgICAgICAgICAgICAgICA9ICJzZXJ2aWNlLWludGVyZmFjZSI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgICAgICA9ICJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotLy8gIHB1YmxpYyBTdHJpbmcgSEFORExFUiAgICAgICAgICAgICAgICAgICAgICAgICA9ICJoYW5kbGVyIjsKLS8vICBwdWJsaWMgU3RyaW5nIEhBTkRMRVJfTkFNRSAgICAgICAgICAgICAgICAgICAgPSAiaGFuZGxlci1uYW1lIjsKLS8vICBwdWJsaWMgU3RyaW5nIEhBTkRMRVJfQ0xBU1MgICAgICAgICAgICAgICAgICAgPSAiaGFuZGxlci1jbGFzcyI7Ci0gIHB1YmxpYyBTdHJpbmcgSU5JVF9QQVJBTSAgICAgICAgICAgICAgICAgICAgICA9ICJpbml0LXBhcmFtIjsvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIFN0cmluZyBQQVJBTV9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gInBhcmFtLW5hbWUiOwotLy8gIHB1YmxpYyBTdHJpbmcgUEFSQU1fVkFMVUUgICAgICAgICAgICAgICAgICAgICA9ICJwYXJhbS12YWx1ZSI7Ci0vLyAgcHVibGljIFN0cmluZyBTT0FQX0hFQURFUiAgICAgICAgICAgICAgICAgICAgID0gInNvYXAtaGVhZGVyIjsKLS8vICBwdWJsaWMgU3RyaW5nIFNPQVBfUk9MRSAgICAgICAgICAgICAgICAgICAgICAgPSAic29hcC1yb2xlIjsKLS8vICBwdWJsaWMgU3RyaW5nIFBPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgPSAicG9ydC1uYW1lIjsKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZTFhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySXsKLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VzVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXZWJTZXJ2aWNlc1RyYW5zbGF0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU0NMSUVOVCA9IFdFQl9TRVJWSUNFU19DTElFTlQ7IAotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBXRUJTRVJWSUNFQ0xJRU5UX1BLRyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0gICAgCi0JcHVibGljIFdlYlNlcnZpY2VzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoV0VCU0VSVklDRVNDTElFTlQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnQoKSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQlyZXR1cm4gY2hpbGRyZW4xMzsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxM0NoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVTZXJ2aWNlUmVmR3JvdXBUcmFuc2xhdG9yMTMobnVsbCksCi0JCQljcmVhdGVDb21wb25lbnRTY29wZWRSZWZzMTMoKQotCQl9OwotCX0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHdhcyBtb2RlbCBmcm9tIFdlYnNwaGVyZSBXZWJzZXJ2aWNlcwotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJZmVhdHVyZSA9IFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbiggbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX1JFRl9OQU1FLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfRklMRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IxMChTRVJWSUNFX1FOQU1FLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVBvcnRDb21wb25lbnRSZWZUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVTZXJ2aWNlUmVmSGFuZGxlclRyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHdhcyBtb2RlbCBmcm9tIFdlYnNwaGVyZSBXZWJzZXJ2aWNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXXsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEhBTkRMRVJfTkFNRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEhBTkRMRVJfQ0xBU1MsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkpLAotCQkJY3JlYXRlUGFyYW1WYWx1ZVR5cGUxMyhIQU5ETEVSX0lOSVRfUEFSQU0sIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKSwKLQkJCWNyZWF0ZVFOYW1lVHJhbnNsYXRvcjEwKFNPQVBfSEVBREVSLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU09BUF9ST0xFLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX1NvYXBSb2xlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfTkFNRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKSkKLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTVBfU0NPUEVEX1JFRlMsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTVBfQ09NUE9ORU5UX05BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldENvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50TmFtZSgpKSwgCi0JCQljcmVhdGVTZXJ2aWNlUmVmR3JvdXBUcmFuc2xhdG9yMTMoV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVFOYW1lVHJhbnNsYXRvcjEwKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBDT01NT05fUEtHLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgQ09NTU9OX1BLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyYW1WYWx1ZVR5cGUxMyhTdHJpbmcgZG9tTmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoZG9tTmFtZSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjdhNWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV3NkZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC5XZWJTZXJ2aWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBXc2RkVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgV3NkZFhtbE1hcHBlckksIEoyRUVDb25zdGFudHN7Ci0JcHVibGljIHN0YXRpYyBXc2RkVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXc2RkVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEwOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjExOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEyOwotCi0JcHJpdmF0ZSBzdGF0aWMgV3NkZFBhY2thZ2UgV1NERF9QS0cgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgV3Njb21tb25QYWNrYWdlIFdTQ09NTU9OX1BLRyA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JcHJvdGVjdGVkIFdzZGRUcmFuc2xhdG9yKCkgewotCQlzdXBlcihXRUJTRVJWSUNFUywgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCSAgICAKLQkJCi0KLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEwID09IG51bGwpCi0JCQkJewotCQkJCQljaGlsZHJlbjEwID0gY3JlYXRlMTBDaGlsZHJlbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4xMDsJCi0JCQljYXNlIChKMkVFXzFfNF9JRCkgOgotCQkJCWlmIChjaGlsZHJlbjExID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCWNoaWxkcmVuMTEgPSBjcmVhdGUxMUNoaWxkcmVuKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuMTE7IAotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTIgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWNoaWxkcmVuMTIgPSBjcmVhdGUxMkNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbjEyOyAKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCQkJCi0JCQljcmVhdGUxMFdlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMUNoaWxkcmVuKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ18xXzEpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihWRVJTSU9OLCBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8xKSwJCQkgIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCQkJCi0JCQljcmVhdGUxMVdlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMkNoaWxkcmVuKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEpBVkFFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSkFWQUVFX05TX1VSTCsnICcrV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9MT0NfMV8yKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoVkVSU0lPTiwgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9WRVJTSU9OXzFfMiksCQkJICAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAkJCQotCQkJY3JlYXRlMTJXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSksCQkJCQkJCi0JCQluZXcgVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihKQVhSUENfTUFQUElOR19GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSksCQkJCi0JCQljcmVhdGUxMFBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkJCQkgIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpKSwKLQkJCWNyZWF0ZTExRGlzcGxheU5hbWVUcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSksCQkJCi0JCQljcmVhdGUxMUljb25UcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpKSwJCQkKLQkJCWNyZWF0ZTExUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKQkJCSAgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JCi1wdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMldlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGUxMURlc2NyaXB0aW9uVHJhbnNsYXRvcihXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkpLAotCQkJY3JlYXRlMTFEaXNwbGF5TmFtZVRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpKSwJCQkKLQkJCWNyZWF0ZTExSWNvblRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTl9OQU1FLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfRklMRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoSkFYUlBDX01BUFBJTkdfRklMRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCkpLAkJCQotCQkJY3JlYXRlMTJQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpCQkJICAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCi0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9DT01QT05FTlQsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCkpLAkJCQkJCQotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9DT01QT05FTlRfTkFNRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpKSwKLQkJCWNyZWF0ZTEwV3NkbFBvcnRUcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX0VOUE9JTlRfSU5URVJGQUNFLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSwKLQkJCWNyZWF0ZVNlcnZpY2VJbXBsQmVhblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUhhbmRsZXIxMFRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5ULCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpKSwJCQkJCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfUE9SVCwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfRU5QT0lOVF9JTlRFUkZBQ0UsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotCQkJY3JlYXRlU2VydmljZUltcGxCZWFuVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSGFuZGxlcjExVHJhbnNsYXRvcihXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTJQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5ULCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpKSwJCQkJCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfU0VSVklDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Xc2RsU2VydmljZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX1BPUlQsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSksCi0JCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoRU5BQkxFX01UT00sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRW5hYmxlTXRvbSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBST1RPQ09MX0JJTkRJTkcsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0JCQljcmVhdGVTZXJ2aWNlSW1wbEJlYW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSksCi0JCQljcmVhdGVIYW5kbGVyQ2hhaW5zMTJUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV3NkbFBvcnRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9QT1JULCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIENPTU1PTl9QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBDT01NT05fUEtHLmdldFFOYW1lX0xvY2FsUGFydCgpKQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VJbXBsQmVhblRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0lNUExfQkVBTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBTZXJ2bGV0TGlua1RyYW5zbGF0b3IoKSwKLQkJCW5ldyBFSkJMaW5rVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUhhbmRsZXIxMFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdTRERfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXU0REX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwJCQkKLQkJCWNyZWF0ZTEwSW5pdFBhcmFtVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBTT0FQSGVhZGVyVHJhbnNsYXRvcigpLAotCQkJbmV3IFNPQVBSb2xlVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKEVSZWZlcmVuY2UgcmVmVHlwZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSEFORExFUiwgcmVmVHlwZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoSEFORExFUl9OQU1FLCBXU0REX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSEFORExFUl9DTEFTUywgV1NERF9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSksCQkJCi0JCQljcmVhdGUxMUluaXRQYXJhbVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihTT0FQX0hFQURFUiwgV1NERF9QS0cuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKSwKLQkJCW5ldyBTT0FQUm9sZVRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUhhbmRsZXJDaGFpbnMxMlRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSX0NIQUlOUywgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7CQotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlSGFuZGxlckNoYWluMTJUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVIYW5kbGVyQ2hhaW4xMlRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSX0NIQUlOLCBXU0REX1BLRy5nZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsJCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX05BTUVfUEFUVEVSTiwgV1NERF9QS0cuZ2V0SGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfTkFNRV9QQVRURVJOLCBXU0REX1BLRy5nZXRIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUFJPVE9DT0xfQklORElOR1MsIFdTRERfUEtHLmdldEhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCkpLAotCQkJY3JlYXRlSGFuZGxlcjExVHJhbnNsYXRvcihXU0REX1BLRy5nZXRIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwSW5pdFBhcmFtVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKElOSVRfUEFSQU0sIFdTRERfUEtHLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExSW5pdFBhcmFtVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKElOSVRfUEFSQU0sIFdTRERfUEtHLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkpLAkJCQkJCSAgCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9OQU1FLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMkluaXRQYXJhbVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTklUX1BBUkFNLCBXU0REX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZTExRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpKSwJCQkJCQkgIAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwU09BUEhlYWRlclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTT0FQX0hFQURFUiwgV1NERF9QS0cuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBDT01NT05fUEtHLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgQ09NTU9OX1BLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoREVTQ1JJUFRJT04sIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbl9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgIFRyYW5zbGF0b3IgY3JlYXRlMTFEaXNwbGF5TmFtZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREaXNwbGF5TmFtZV9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGUxMUljb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSUNPTiwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldEljb25UeXBlX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwJCSAgCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldEljb25UeXBlX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc0YWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV3NkZFhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0vL2ltcG9ydHMgZm9yIEoyRUUgY29yZSBjbGFzc2VzCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gd2ViIHNlcnZpY2UgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZFhtbE1hcHBlckkgZXh0ZW5kcyBXZWJTZXJ2aWNlQ29tbW9uWG1sTWFwcGVySQotewotICBwdWJsaWMgU3RyaW5nIFdFQlNFUlZJQ0VTICAgICAgICAgICAgICAgICAgICAgPSAid2Vic2VydmljZXMiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXRUJTRVJWSUNFX0RFU0NSSVBUSU9OICAgICAgICAgID0gIndlYnNlcnZpY2UtZGVzY3JpcHRpb24iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXRUJTRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgICAgID0gIndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBPUlRfQ09NUE9ORU5UICAgICAgICAgICAgICAgICAgPSAicG9ydC1jb21wb25lbnQiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9OQU1FICAgICAgICAgICAgID0gInBvcnQtY29tcG9uZW50LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX1BPUlQgICAgICAgICAgICAgICAgICAgICAgID0gIndzZGwtcG9ydCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfU0VSVklDRSAgICAgICAgICAgICAgICAgICAgPSAid3NkbC1zZXJ2aWNlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9JTVBMX0JFQU4gICAgICAgICAgICAgICA9ICJzZXJ2aWNlLWltcGwtYmVhbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFNFUlZMRVRfTElOSyAgICAgICAgICAgICAgICAgICAgPSAic2VydmxldC1saW5rIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgRU5BQkxFX01UT00JCQkJCQk9ICJlbmFibGUtbXRvbSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBST1RPQ09MX0JJTkRJTkcJCQkJPSAicHJvdG9jb2wtYmluZGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEhBTkRMRVJfQ0hBSU5TCQkJCQk9ICJoYW5kbGVyLWNoYWlucyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEhBTkRMRVJfQ0hBSU4JCQkJCT0gImhhbmRsZXItY2hhaW4iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQUk9UT0NPTF9CSU5ESU5HUwkJCQk9ICJwcm90b2NvbC1iaW5kaW5ncyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFNFUlZJQ0VfTkFNRV9QQVRURVJOCQkJPSAic2VydmljZS1uYW1lLXBhdHRlcm4iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQT1JUX05BTUVfUEFUVEVSTgkJCQk9ICJwb3J0LW5hbWUtcGF0ZXJuIjsvLyROT04tTkxTLTEkCi0gIC8vRUpCX0xJTksgaXMgZGVmaW5lZCBpbiBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkKLSAgLy9wdWJsaWMgU3RyaW5nIEVKQl9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgPSAiZWpiLWxpbmsiOwotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Db2xsZWN0aW5nRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvQ29sbGVjdGluZ0Vycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMzN2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Db2xsZWN0aW5nRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDExOjEwOjM4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGluZ0Vycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0JcHJvdGVjdGVkIExpc3QgY2F1Z2h0RXhjZXB0aW9uczsKLS8qKgotICogQ29sbGVjdGluZ0Vycm9ySGFuZGxlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgQ29sbGVjdGluZ0Vycm9ySGFuZGxlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi1wdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCWdldENhdWdodEV4Y2VwdGlvbnMoKS5hZGQoZXhjZXB0aW9uKTsKLX0KLS8qKgotICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCWdldENhdWdodEV4Y2VwdGlvbnMoKS5hZGQoZXhjZXB0aW9uKTsKLX0KLXB1YmxpYyBMaXN0IGdldENhdWdodEV4Y2VwdGlvbnMoKSB7Ci0JaWYgKGNhdWdodEV4Y2VwdGlvbnMgPT0gbnVsbCkgewotCQljYXVnaHRFeGNlcHRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQlyZXR1cm4gY2F1Z2h0RXhjZXB0aW9uczsKLX0KLQotLyoqCi0gKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi1wdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLmFkZChleGNlcHRpb24pOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMThkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2F0YWxvZyBvZiBhbGwgdGhlIHRhZyBuYW1lcyB3aGljaCBtYXkgYmUgc2hhcmVkIGluIAotICogYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIEVKQkphcnMsIGVhcnMsIGFuZCB3YXJzLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9MSU5LID0gImVqYi1saW5rIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVl9FTlRSWSA9ICJlbnYtZW50cnkiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5WX0VOVFJZX05BTUUgPSAiZW52LWVudHJ5LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5WX0VOVFJZX1RZUEUgPSAiZW52LWVudHJ5LXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5WX0VOVFJZX1ZBTFVFID0gImVudi1lbnRyeS12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfTE9DQUxfUkVGID0gImVqYi1sb2NhbC1yZWYiOwkvLyROT04tTkxTLTEkCQkJCS8vIEoyRUUxLjMKLQlTdHJpbmcgRUpCX1JFRiA9ICJlamItcmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9SRUZfTkFNRSA9ICJlamItcmVmLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX1JFRl9UWVBFID0gImVqYi1yZWYtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBIT01FID0gImhvbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSUNPTiA9ICJpY29uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElEID0gImlkIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIExBUkdFX0lDT04gPSAibGFyZ2UtaWNvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMQVJHRV9JQ09OX1BBVEggPSAiaWNvbi9sYXJnZS1pY29uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIExPQ0FMID0gImxvY2FsIjsvLyROT04tTkxTLTEkCQkJCQkJCQkJLy8gSjJFRTEuMwotCVN0cmluZyBMT0NBTF9IT01FID0gImxvY2FsLWhvbWUiOy8vJE5PTi1OTFMtMSQJCQkJCQkvLyBKMkVFMS4zCi0JU3RyaW5nIFJFTU9URSA9ICJyZW1vdGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTX0FVVEggPSAicmVzLWF1dGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTX1JFRl9OQU1FID0gInJlcy1yZWYtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVNfU0hBUklOR19TQ09QRSA9ICJyZXMtc2hhcmluZy1zY29wZSI7Ly8kTk9OLU5MUy0xJCAJCS8vIEoyRUUxLjMgCi0JU3RyaW5nIFJFU19UWVBFID0gInJlcy10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU09VUkNFX0VOVl9SRUYgPSAicmVzb3VyY2UtZW52LXJlZiI7IC8vJE5PTi1OTFMtMSQJCQkvLyBKMkVFMS4zCi0JU3RyaW5nIFJFU09VUkNFX0VOVl9SRUZfTkFNRSA9ICJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiOy8vJE5PTi1OTFMtMSQgLy8gSjJFRTEuMwotCVN0cmluZyBSRVNPVVJDRV9FTlZfUkVGX1RZUEUgPSAicmVzb3VyY2UtZW52LXJlZi10eXBlIjsvLyROT04tTkxTLTEkIC8vIEoyRUUxLjMKLQlTdHJpbmcgUkVTT1VSQ0VfUkVGID0gInJlc291cmNlLXJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBST0xFX0xJTksgPSAicm9sZS1saW5rIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJPTEVfTkFNRSA9ICJyb2xlLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUlVOX0FTID0gInJ1bi1hcyI7CS8vJE5PTi1OTFMtMSQJCQkJCQkJLy8gSjJFRTEuMwotCVN0cmluZyBTRUNVUklUWV9JREVOVElUWSA9ICJzZWN1cml0eS1pZGVudGl0eSI7CS8vJE5PTi1OTFMtMSQJCS8vIEoyRUUxLjMKLQlTdHJpbmcgU0VDVVJJVFlfUk9MRSA9ICJzZWN1cml0eS1yb2xlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFQ1VSSVRZX1JPTEVfUkVGID0gInNlY3VyaXR5LXJvbGUtcmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNNQUxMX0lDT04gPSAic21hbGwtaWNvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTTUFMTF9JQ09OX1BBVEggPSAiaWNvbi9zbWFsbC1pY29uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9DQUxMRVJfSURFTlRJVFkgPSAidXNlLWNhbGxlci1pZGVudGl0eSI7Ly8kTk9OLU5MUy0xJAkJLy8gSjJFRTEuMwotCQotCQotCS8vCUoyRUUgMS40Ci0JU3RyaW5nIExBTkcgPSAieG1sOmxhbmciOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVQTE9ZX0VYVCA9ICJkZXBsb3ltZW50LWV4dGVuc2lvbiI7CQkvLyROT04tTkxTLTEkCQkvLyBKMkVFMS40Ci0JU3RyaW5nIEVYVF9FTEVNRU5UID0gImV4dGVuc2lvbi1lbGVtZW50IjsJLy8kTk9OLU5MUy0xJAkJCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX1JFRiA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiI7Ly8kTk9OLU5MUy0xJAkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9SRUZfTkFNRSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIjsvLyROT04tTkxTLTEkCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX1RZUEUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIjsvLyROT04tTkxTLTEkCQkJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfTElOSyA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiOwkvLyROT04tTkxTLTEkCQkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9VU0FHRSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIjsvLyROT04tTkxTLTEkCQkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVCA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uIjsJLy8kTk9OLU5MUy0xJAkJCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX05BTUUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIjsJLy8kTk9OLU5MUy0xJAkJCS8vIEoyRUUxLjQKLQlTdHJpbmcgU0VSVklDRV9SRUYgPSAic2VydmljZS1yZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VSVklDRV9SRUZfTkFNRSA9ICJzZXJ2aWNlLXJlZi1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gInNlcnZpY2UtaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdTRExfRklMRSA9ICJ3c2RsLWZpbGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRSA9ICJqYXhycGMtbWFwcGluZy1maWxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFUlZJQ0VfUU5BTUUgPSAic2VydmljZS1xbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQT1JUX0NPTVBPTkVOVF9SRUYgPSAicG9ydC1jb21wb25lbnQtcmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhBTkRMRVIgPSAiaGFuZGxlciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVJWSUNFX0VOUE9JTlRfSU5URVJGQUNFID0gInNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPUlRfQ09NUE9ORU5UX0xJTksgPSAicG9ydC1jb21wb25lbnQtbGluayI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBIQU5ETEVSX05BTUUgPSAiaGFuZGxlci1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhBTkRMRVJfQ0xBU1MgPSAiaGFuZGxlci1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBIQU5ETEVSX0lOSVRfUEFSQU0gPSAiaW5pdC1wYXJhbSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTT0FQX0hFQURFUiA9ICJzb2FwLWhlYWRlciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTT0FQX1JPTEUgPSAic29hcC1yb2xlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPUlRfTkFNRSA9ICJwb3J0LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9OUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfTlNfWFNJID0gInhtbG5zOnhzaSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYU0lfU0NIRU1BX0xPQ0FUSU9OID0gInhzaTpzY2hlbWFMb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBOQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1VU1RVTkRFUlNUQU5EID0gIm11c3RVbmRlcnN0YW5kIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBUkFNX05BTUUgPSAicGFyYW0tbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVJBTV9WQUxVRSA9ICJwYXJhbS12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMSVNURU5FUl9DTEFTUyA9ICJsaXN0ZW5lci1jbGFzcyI7Ly8kTk9OLU5MUy0xJAkvLyBTZXJ2bGV0Mi4zCi0JCi0JCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWM4MmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gRUFSIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSW50ZXJmYWNlIHNoYXJlZCBieSByZWFkZXJzIGFuZCAKLSAqIHdyaXRlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gY29tbW9uIGNvbnN0YW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JU3RyaW5nIEFMVF9ERCA9ICJhbHQtZGQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVEVYVF9ST09UID0gImNvbnRleHQtcm9vdCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkIgPSAiZWpiIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkEgPSAiamF2YSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNT0RVTEUgPSAibW9kdWxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQiA9ICJ3ZWIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCX1VSSSA9ICJ3ZWItdXJpIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTk5FQ1RPUiA9ICJjb25uZWN0b3IiOy8vJE5PTi1OTFMtMSQKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1N2VjYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiBFSkIgSmFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSW50ZXJmYWNlIHNoYXJlZCBieSByZWFkZXJzIGFuZCAKLSAqIHdyaXRlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gY29tbW9uIGNvbnN0YW50cwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIGV4dGVuZHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlTdHJpbmcgQUJTVFJBQ1RfU0NIRU1BX05BTUUgPSAiYWJzdHJhY3Qtc2NoZW1hLW5hbWUiOyAvLyROT04tTkxTLTEkCS8vIEVKQjIuMAotCVN0cmluZyBBQ0tOT1dMRURHRV9NT0RFID0gImFja25vd2xlZGdlLW1vZGUiOy8vJE5PTi1OTFMtMSQgCQkJLy8gRUpCMi4wCi0JU3RyaW5nIEFTU0VNQkxZX0RFU0NSSVBUT1IgPSAiYXNzZW1ibHktZGVzY3JpcHRvciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBCRUFOID0gIkJlYW4iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERV9ERUxFVEUgPSAiY2FzY2FkZS1kZWxldGUiOy8vJE5PTi1OTFMtMSQgCQkJCS8vIEVKQjIuMAotCVN0cmluZyBDTVBfRklFTEQgPSAiY21wLWZpZWxkIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENNUF9WRVJTSU9OID0gImNtcC12ZXJzaW9uIjsJCS8vJE5PTi1OTFMtMSQJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIENNUl9GSUVMRCA9ICJjbXItZmllbGQiOwkJLy8kTk9OLU5MUy0xJAkJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIENNUl9GSUVMRF9OQU1FID0gImNtci1maWVsZC1uYW1lIjsvLyROT04tTkxTLTEkCQkJCS8vIEVKQjIuMAotCVN0cmluZyBDTVJfRklFTERfVFlQRSA9ICJjbXItZmllbGQtdHlwZSI7Ly8kTk9OLU5MUy0xJAkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQ09OVEFJTkVSID0gIkNvbnRhaW5lciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05UQUlORVJfVFJBTlNBQ1RJT04gPSAiY29udGFpbmVyLXRyYW5zYWN0aW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFU1RJTkFUSU9OX1RZUEUgPSAiZGVzdGluYXRpb24tdHlwZSI7CS8vJE5PTi1OTFMtMSQJCS8vIEVKQjIuMAotCVN0cmluZyBFSkJfQ0xBU1MgPSAiZWpiLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9DTElFTlRfSkFSID0gImVqYi1jbGllbnQtamFyIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9KQVIgPSAiZWpiLWphciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfTkFNRSA9ICJlamItbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfUUwgPSAiZWpiLXFsIjsJCS8vJE5PTi1OTFMtMSQJCQkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgRUpCX1JFTEFUSU9OID0gImVqYi1yZWxhdGlvbiI7Ly8kTk9OLU5MUy0xJAkJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIEVKQl9SRUxBVElPTl9OQU1FID0gImVqYi1yZWxhdGlvbi1uYW1lIjsJLy8kTk9OLU5MUy0xJAkJLy8gRUpCMi4wCi0JU3RyaW5nIEVKQl9SRUxBVElPTlNISVBfUk9MRSA9ICJlamItcmVsYXRpb25zaGlwLXJvbGUiOy8vJE5PTi1OTFMtMSQJLy8gRUpCMi4wCi0JU3RyaW5nIEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FID0gImVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIjsvLyROT04tTkxTLTEkIC8vIEVKQjIuMAotCVN0cmluZyBFTlRFUlBSSVNFX0JFQU5TID0gImVudGVycHJpc2UtYmVhbnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5USVRZID0gImVudGl0eSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFWENMVURFX0xJU1QgPSAiZXhjbHVkZS1saXN0IjsJLy8kTk9OLU5MUy0xJC8vIEVKQjIuMCAtIE1PREVMRUQ/Pz8KLQlTdHJpbmcgRklFTERfTkFNRSA9ICJmaWVsZC1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FU1NBR0VfRFJJVkVOID0gIm1lc3NhZ2UtZHJpdmVuIjsJLy8kTk9OLU5MUy0xJAkJCS8vIEVKQjIuMAotCVN0cmluZyBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTiA9ICJtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiI7IC8vJE5PTi1OTFMtMSQvLyBFSkIyLjAKLQlTdHJpbmcgTUVTU0FHRV9TRUxFQ1RPUiA9ICJtZXNzYWdlLXNlbGVjdG9yIjsJLy8kTk9OLU5MUy0xJAkJLy8gRUpCMi4wCi0JU3RyaW5nIE1FVEhPRCA9ICJtZXRob2QiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX0lOVEYgPSAibWV0aG9kLWludGYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX05BTUUgPSAibWV0aG9kLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX1BBUkFNID0gIm1ldGhvZC1wYXJhbSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfUEFSQU1TID0gIm1ldGhvZC1wYXJhbXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX1BFUk1JU1NJT04gPSAibWV0aG9kLXBlcm1pc3Npb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTVVMVElQTElDSVRZID0gIm11bHRpcGxpY2l0eSI7Ly8kTk9OLU5MUy0xJAkJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIFBFUlNJU1RFTkNFX1RZUEUgPSAicGVyc2lzdGVuY2UtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQUklNX0tFWV9DTEFTUyA9ICJwcmltLWtleS1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQUklNS0VZX0ZJRUxEID0gInByaW1rZXktZmllbGQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVFTlRSQU5UID0gInJlZW50cmFudCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UgPSAicmVsYXRpb25zaGlwLXJvbGUtc291cmNlIjsvLyROT04tTkxTLTEkIC8vIEVKQjIuMAotCVN0cmluZyBSRUxBVElPTlNISVBTID0gInJlbGF0aW9uc2hpcHMiOyAJLy8kTk9OLU5MUy0xJAkJCS8vIEVKQjIuMAotCVN0cmluZyBSRVNVTFRfVFlQRV9NQVBQSU5HID0gInJlc3VsdC10eXBlLW1hcHBpbmciOwkvLyROT04tTkxTLTEkCS8vIEVKQjIuMAotCVN0cmluZyBRVUVSWSA9ICJxdWVyeSI7CQkJLy8kTk9OLU5MUy0xJAkJCQkJCS8vIEVKQjIuMAotCVN0cmluZyBRVUVSWV9NRVRIT0QgPSAicXVlcnktbWV0aG9kIjsJLy8kTk9OLU5MUy0xJAkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgU0VTU0lPTiA9ICJzZXNzaW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFU1NJT05fVFlQRSA9ICJzZXNzaW9uLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFkgPSAic3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkiOy8vJE5PTi1OTFMtMSQgLy8gRUpCMi4wCi0JU3RyaW5nIFRSQU5TX0FUVFJJQlVURSA9ICJ0cmFucy1hdHRyaWJ1dGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFJBTlNBQ1RJT05fVFlQRSA9ICJ0cmFuc2FjdGlvbi10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOQ0hFQ0tFRCA9ICJ1bmNoZWNrZWQiOwkJCS8vJE5PTi1OTFMtMSQJCQkJLy8gRUpCMi4wCi0KLQkvL0VKQiAyLjEJCi0JU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlQgPSAic2VydmljZS1lbmRwb2ludCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVNTQUdJTkdfVFlQRSA9ICJtZXNzYWdpbmctdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVNTQUdFX0RFU1RfVFlQRSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX0xJTksgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFDVElWQVRJT05fQ09ORiA9ICJhY3RpdmF0aW9uLWNvbmZpZyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ1RJVkFUSU9OX0NPTkZfUFJPUEVSVFkgPSAiYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHkiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUNUSVZBVElPTl9DT05GX1BST1BFUlRZX05BTUUgPSAiYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ1RJVkFUSU9OX0NPTkZfUFJPUEVSVFlfVkFMVUUgPSAiYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiOy8vJE5PTi1OTFMtMSQKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmE5N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0dlbmVyYWxYbWxEb2N1bWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDExOjU4OjUwIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyCi17Ci0gICAgcHJvdGVjdGVkIElucHV0U291cmNlIGlucHV0U291cmNlOwotICAgIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcjsKLSAgICBwcm90ZWN0ZWQgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1ZhbGlkYXRlID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9BbGxvd0phdmFFbmNvZGluZ3MgPSBmYWxzZTsKLQotLyoqCi0gKiBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotICAgIHB1YmxpYyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIoKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotLyoqCi0gKiBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotICAgIHB1YmxpYyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldElucHV0U291cmNlKHNvdXJjZSk7Ci0gICAgfQotLyoqCi0gKiBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotICAgIHB1YmxpYyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlLCBFbnRpdHlSZXNvbHZlciByZXNvbHZlciwgRXJyb3JIYW5kbGVyIGhhbmRsZXIpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0SW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgc2V0RW50aXR5UmVzb2x2ZXIocmVzb2x2ZXIpOwotICAgICAgICBzZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7Ci0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHJldHVybiBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi0gICAgcHJvdGVjdGVkIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGNyZWF0ZURlZmF1bHRFbnRpdHlSZXNvbHZlcigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHJldHVybiBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotICAgIHByb3RlY3RlZCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgY3JlYXRlRGVmYXVsdEVycm9ySGFuZGxlcigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgIAkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQl9Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJdGhyb3cgZXhjZXB0aW9uOwotCQkJfQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGV4Y2VwdGlvbik7Ci0JCQl9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIHByb3RlY3RlZCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgY3JlYXRlTmV3RE9NUGFyc2VyKCkgCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBzZXRGZWF0dXJlcyhkYmYpOwotICAgICAgICAgICAgcmV0dXJuIGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gaWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhYTUxQYXJzZVJlc291cmNlSGFuZGxlci5mYWlsZWRfaW5zdGFudGlhdGluZ19FWENfLCAobmV3IE9iamVjdFtdIHsiRmFpbGVkIHRvIGluc3RhbnRpYXRlIHBhcnNlciJ9KSksIGllKTsgLy8kTk9OLU5MUy0xJCAvLyA9ICJGYWlsZWQgaW5zdGFudGlhdGluZzogIgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICovCi0gICAgcHVibGljIGJvb2xlYW4gZG9BbGxvd0phdmFFbmNvZGluZ3MoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb0FsbG93SmF2YUVuY29kaW5nczsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDE6MzQgUE0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvVmFsaWRhdGUoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb1ZhbGlkYXRlOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxOjM0OjE0IFBNKQotICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLSAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSAKLSAgICB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY2wgPT0gbnVsbCkKLSAgICAgICAgICAgIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGNsID09IG51bGwpCi0gICAgICAgICAgICBjbCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXJzZURvY3VtZW50KCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZG9tUGFyc2VyKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb21QYXJzZXIubmV3RG9jdW1lbnQoKTsKLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHJldHVybiBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi0gICAgcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgCi0gICAgewotICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGVudGl0eVJlc29sdmVyID0gY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCk7Ci0gICAgICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi0gICAgcHVibGljIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKSAKLSAgICB7Ci0gICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gY3JlYXRlRGVmYXVsdEVycm9ySGFuZGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnJvckhhbmRsZXI7Ci0gICAgfQotCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LklucHV0U291cmNlCi0gKi8KLSAgICBwdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgZ2V0SW5wdXRTb3VyY2UoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSAKLSAgICB7Ci0gICAgICAgIGlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaW52b2NhdGlvbkV4ID0KLSAgICAgICAgICAgIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBhbkV4Y2VwdGlvbjsKLSAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uRXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIGludm9jYXRpb25FeC5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbUhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgYW5FeGNlcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgcGFyc2UoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRvbVBhcnNlciwgSW5wdXRTb3VyY2UgaXMpIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb21QYXJzZXIucGFyc2UoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhYTUxQYXJzZVJlc291cmNlSGFuZGxlci5mYWlsZWRfaW5zdGFudGlhdGluZ19FWENfLCAobmV3IE9iamVjdFtdIHsiU0FYIFBhcnNlciBlcnJvciJ9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCAvLyA9ICJGYWlsZWQgaW5zdGFudGlhdGluZzogIgotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhYTUxQYXJzZVJlc291cmNlSGFuZGxlci5mYWlsZWRfaW5zdGFudGlhdGluZ19FWENfLCAobmV3IE9iamVjdFtdIHsiSU8gRXhjZXB0aW9uIG9uIGlucHV0IHN0cmVhbSJ9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCAvLyA9ICJGYWlsZWQgaW5zdGFudGlhdGluZzogIgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIERvY3VtZW50IHBhcnNlRG9jdW1lbnQoKSAKLSAgICB7Ci0gICAgCUNsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGNyZWF0ZU5ld0RPTVBhcnNlcigpOwotICAgICAgICAJc2V0RW50aXR5UmVzb2x2ZXIocGFyc2VyKTsKLSAgICAgICAgCXNldEVycm9ySGFuZGxlcihwYXJzZXIpOwotICAgICAgICAJcmV0dXJuIHBhcnNlKHBhcnNlciwgZ2V0SW5wdXRTb3VyY2UoKSk7Ci0JfSBmaW5hbGx5IHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0JfQotICAgIAkKLSAgICAJCi0gICAgCQotICAgIAkKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByaW1IYW5kbGVFeGNlcHRpb24oU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgYW5FeGNlcHRpb24pIAotICAgIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihhbkV4Y2VwdGlvbik7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFNZXNzYWdlKTsKLQotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEBwYXJhbSBuZXdBbGxvd0phdmFFbmNvZGluZ3MgYm9vbGVhbgotICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dKYXZhRW5jb2RpbmdzKGJvb2xlYW4gbmV3QWxsb3dKYXZhRW5jb2RpbmdzKSAKLSAgICB7Ci0gICAgICAgIGRvQWxsb3dKYXZhRW5jb2RpbmdzID0gbmV3QWxsb3dKYXZhRW5jb2RpbmdzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZG9tUGFyc2VyKSAKLSAgICB7Ci0gICAgICAgIGlmIChnZXRFbnRpdHlSZXNvbHZlcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvbVBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcGFyYW0gbmV3RW50aXR5UmVzb2x2ZXIgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIG5ld0VudGl0eVJlc29sdmVyKSAKLSAgICB7Ci0gICAgICAgIGVudGl0eVJlc29sdmVyID0gbmV3RW50aXR5UmVzb2x2ZXI7Ci0gICAgfQotICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JIYW5kbGVyKGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkb21QYXJzZXIpIAotICAgIHsKLSAgICAgICAgaWYgKGdldEVycm9ySGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvbVBhcnNlci5zZXRFcnJvckhhbmRsZXIoZ2V0RXJyb3JIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEBwYXJhbSBuZXdFcnJvckhhbmRsZXIgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIob3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIG5ld0Vycm9ySGFuZGxlcikgCi0gICAgewotICAgICAgICBlcnJvckhhbmRsZXIgPSBuZXdFcnJvckhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RmVhdHVyZXMoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21QYXJzZXIpIAotICAgIHsKLSAgICAgICAgdHJ5IHsKLQkJCWRvbVBhcnNlci5zZXRWYWxpZGF0aW5nKGRvVmFsaWRhdGUoKSk7Ci0JICAgICAgICBkb21QYXJzZXIuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCBuZXcgQm9vbGVhbihkb0FsbG93SmF2YUVuY29kaW5ncygpKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGRvbVBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKHRydWUpOwotCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0gICAgfQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEBwYXJhbSBuZXdJbnB1dFNvdXJjZSBvcmcueG1sLnNheC5JbnB1dFNvdXJjZQotICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRTb3VyY2Uob3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgbmV3SW5wdXRTb3VyY2UpIAotICAgIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXdJbnB1dFNvdXJjZTsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDE6MzQgUE0pCi0gKiBAcGFyYW0gbmV3VmFsaWRhdGUgYm9vbGVhbgotICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiBuZXdWYWxpZGF0ZSkgCi0gICAgewotICAgICAgICBkb1ZhbGlkYXRlID0gbmV3VmFsaWRhdGU7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvSjJFRVhNTFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY4MDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSjJFRVhNTFJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImoyZWV4bWwiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSjJFRVhNTFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRfdmFsdWVzX2FyZV9fX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkFSX2ZpbGVfc3VwcG9ydF9fSU9fZXhjZXBfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGYWlsdXJlX29jY3VycmVkX3JlYWRpbmdfeF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdfcmVxX2ZpZWxkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fSU9fRXhjZXB0aW9uX29jY3VycmVkX3dfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtdXN0X2JlX2Jvb2xlYW5fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZF9lbmNvZGluZ19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJhcl9kdGRfbm90X2ZvdW5kX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlfY29sbGVjdGlvbl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG11c3RfYmVfaW50X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF92YWx1ZV9mb3JfX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fRXhjZXB0aW9uX29jY3VycmVkX3doaWxfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdGRfbm90X2ZvdW5kX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm90X3N1cHBvcnRlZF9pbl90aGlzX3JlbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19leF9zYXZpbmdfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZF9ub3RfY3JlYXRlX2ZpbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZF90eXBlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS2V5MTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2YjY0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIHsKLQotCS8qKiBBbGwgdGhlIGR0ZHMgdGhhdCB0aGlzIHJlc29sdmVyIGtub3dzIGFib3V0OyBpbXBvcnQgc3RyYXRlZ2llcyByZWdpc3RlciB0aGVzZQotCSAqIGF0IHN0YXJ0dXAgKi8gCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgc3VwcG9ydGVkRHREczsKLQlzdGF0aWMgewotCQlyZWdpc3RlckR0RCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIiwgInhtbC54c2QiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWdpc3RlckR0RCgiWE1MU2NoZW1hLmR0ZCIsICJYTUxTY2hlbWEuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWdpc3RlckR0RCgiZGF0YXR5cGVzLmR0ZCIsICJkYXRhdHlwZXMuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgc3RhdGljIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlciBJTlNUQU5DRSA9IG5ldyBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIoKTsKLS8qKgotICogRWpiWG1sRW50aXR5UmVzb2x2ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIHN0YXRpYyBNYXAgZ2V0U3VwcG9ydGVkRHREcygpIHsKLQlpZiAoc3VwcG9ydGVkRHREcyA9PSBudWxsKQotCQlzdXBwb3J0ZWREdERzID0gbmV3IEhhc2hNYXAoKTsKLQlyZXR1cm4gc3VwcG9ydGVkRHREczsKLX0KLS8qKgotICogTWFwcyB0aGUgc3lzdGVtIGlkIGZvciB0aGUgZHRkIHRvIGEgbG9jYWwgaWQgdG8gYmUgcmV0cmlldmVkIGxvYWRlZCBmcm9tIHRoZSBjbGFzcyBwYXRoCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0RChTdHJpbmcgc3lzdGVtSUQsIFN0cmluZyBsb2NhbElEKSB7IAotICAgIC8vTWFrZSBzdXJlIGxvY2FsIGZpbGUgZXhpc3RzIG9uIGNsYXNzcGF0aCBmaXJzdC4KLQkKLQlDbGFzc0xvYWRlciBsb2FkZXIgPSBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQlVUkwgdXJsID0gbnVsbDsKLQlpZiAobG9hZGVyID09IG51bGwpIHsJICAgIAotCQl1cmwgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhbElEKTsKLQl9IGVsc2UgewkgICAgCi0JCXVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShsb2NhbElEKTsKLQl9Ci0JaWYgKHVybCA9PSBudWxsKSB7Ci0JCXJldHVybjsKLQl9Ci0JZ2V0U3VwcG9ydGVkRHREcygpLnB1dChzeXN0ZW1JRCwgbG9jYWxJRCk7Ci0JZ2V0U3VwcG9ydGVkRHREcygpLnB1dChnZXRTaG9ydE5hbWUoc3lzdGVtSUQpLCBsb2NhbElEKTsKLX0KLS8qKgotICogZm9yIGEgc3lzdGVtIGlkIHdpdGggYSBVUkwgdGhhdCBiZWdpbnMgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iLCBjaGVjayB0byBzZWUgaWYgdGhhdCBpcyBhIHJlY29nbml6ZWQgZHRkOwotICogaWYgc28sIGxvYWQgdGhlIGR0ZCBmcm9tIHRoZSBjbGFzcyBwYXRoIHVzaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXJlZCBkdGQuCi0gKgotICogQHJldHVybiBhbiBJbnB1dCBzb3VyY2Ugb24gYSBsb2NhbGx5IHJlc29sdmVkIGR0ZCwgb3IgbnVsbCBvZiB0aGUgc3lzdGVtaWQgZG9lcyBub3Qgc3RhcnQgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iCi0gKiAKLSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdpdGggYSBuZXN0ZWQgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBkdGQgaXMgbm90IHJlY29nbml6ZWQKLSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSByZXNvbHZlZCBkdGQgY2Fubm90IGJlIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGgKLSAqLwotcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotCVN0cmluZyBsb2NhbFJlc291cmNlTmFtZSA9IG51bGw7Ci0JLy9ib29sZWFuIGlzSmF2YVN5dGVtSWQgPSBmYWxzZTsKLQlpZiAoc2hvdWxkQmVSZWdpc3RlcmVkKHN5c3RlbUlkKSkgewotCQlsb2NhbFJlc291cmNlTmFtZSA9IChTdHJpbmcpZ2V0U3VwcG9ydGVkRHREcygpLmdldChzeXN0ZW1JZCk7Ci0JCS8vaXNKYXZhU3l0ZW1JZCA9IHRydWU7CQotCX0gZWxzZSB7Ci0JCVN0cmluZyBzaG9ydE5hbWUgPSBnZXRTaG9ydE5hbWUoc3lzdGVtSWQpOwotCQlsb2NhbFJlc291cmNlTmFtZSA9IChTdHJpbmcpZ2V0U3VwcG9ydGVkRHREcygpLmdldChzaG9ydE5hbWUpOwotCQlpZiAobG9jYWxSZXNvdXJjZU5hbWUgIT0gbnVsbCkKLQkJCXN5c3RlbUlkID0gbG9jYWxSZXNvdXJjZU5hbWU7Ci0JfQotCQkKLQlpZiAobG9jYWxSZXNvdXJjZU5hbWUgPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9IAotCUNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQlVUkwgdXJsID0gbnVsbDsKLQlpZiAobG9hZGVyID09IG51bGwpIHsJICAgIAotCQl1cmwgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhbFJlc291cmNlTmFtZSk7Ci0JfSBlbHNlIHsJICAgIAotCQl1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UobG9jYWxSZXNvdXJjZU5hbWUpOwotCX0KLQkKLQkKLQlpZiAodXJsID09IG51bGwpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmR0ZF9ub3RfZm91bmRfRVhDXywgKG5ldyBPYmplY3RbXSB7bG9jYWxSZXNvdXJjZU5hbWV9KSk7Ly8gPSAiQ291bGQgbm90IHBhcnNlIHhtbCBiZWNhdXNlIHRoZSByZXNvbHZlZCByZXNvdXJjZSAiezB9IiBjb3VsZCBub3QgYmUgZm91bmQgaW4gY2xhc3NwYXRoIgotCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSk7Ci0JfQotCQotCUlucHV0U291cmNlIHJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSk7Ci0JcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lkKTsJCi0JLy8gZm9yY2UgdGhlIGVuY29kaW5nIHRvIGJlIFVURjgKLQlyZXN1bHQuc2V0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkKLQlyZXR1cm4gcmVzdWx0OwotfQotcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQmVSZWdpc3RlcmVkKFN0cmluZyBzeXN0ZW1JZCkgewotCQotCXJldHVybiBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuSkFWQV9TVU5fQ09NX1VSTCkgCi0JCXx8IHN5c3RlbUlkLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5XV1dfVzNfT1JHX1VSTCkKLQkJfHwgc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldXV19JQk1fQ09NX1VSTCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgdXJpLCBvciB0aGUgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0gKi8KLXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaG9ydE5hbWUoU3RyaW5nIHVyaSkgewotCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQl3aGlsZSAodGVtcFVSSS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCXRlbXBVUkkgPSB0ZW1wVVJJLnN1YnN0cmluZygwLCB0ZW1wVVJJLmxlbmd0aCgpLTEpOwotCWludCBsYXN0SW5kZXggPSB0ZW1wVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJcmV0dXJuIHVyaTsKLQlyZXR1cm4gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXgrMSwgdGVtcFVSSS5sZW5ndGgoKSk7Ci19Ci19Ci0KLQotCi0gCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL01pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxZjIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMDEwMzk4NTQ1NDI1NjEzMDRMOwotLyoqCi0gKiBNaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBNaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIE1pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIE1pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQlzdXBlcihzKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjVkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gewotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM1MzU1OTQ3MjA5ODc1OTgxOTZMOwotLyoqCi0gKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBlIGphdmEubGFuZy5FeGNlcHRpb24KLSAqLwotcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCXN1cGVyKGUpOwotfQotLyoqCi0gKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotLyoqCi0gKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLSAqIEBwYXJhbSBlIGphdmEubGFuZy5FeGNlcHRpb24KLSAqLwotcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQlzdXBlcihzLCBlKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvUmFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvUmFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTkzY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1JhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiBSQVIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIGV4dGVuZHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwdWJsaWMgU3RyaW5nIEFVVEhfTUVDSEFOSVNNID0gImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVVUSF9NRUNIX1RZUEUgPSAiYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTkZJR19QUk9QRVJUWSA9ICJjb25maWctcHJvcGVydHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTkZJR19QUk9QRVJUWV9OQU1FID0gImNvbmZpZy1wcm9wZXJ0eS1uYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05GSUdfUFJPUEVSVFlfVkFMVUUgPSAiY29uZmlnLXByb3BlcnR5LXZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05GSUdfUFJPUEVSVFlfVFlQRSA9ICJjb25maWctcHJvcGVydHktdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SID0gImNvbm5lY3RvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFID0gImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTUyA9ICJjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUSU9OX0lOVEVSRkFDRSA9ICJjb25uZWN0aW9uLWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gImNvbm5lY3Rpb24taW1wbC1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSAiY3JlZGVudGlhbC1pbnRlcmZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVJU19UWVBFID0gImVpcy10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMSUNFTlNFID0gImxpY2Vuc2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExJQ0VOU0VfUkVRVUlSRUQgPSAibGljZW5zZS1yZXF1aXJlZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTID0gIm1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUID0gInJlYXV0aGVudGljYXRpb24tc3VwcG9ydCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUkVTT1VSQ0VBREFQVEVSID0gInJlc291cmNlYWRhcHRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VDVVJJVFlfUEVSTUlTU0lPTiA9ICJzZWN1cml0eS1wZXJtaXNzaW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMgPSAic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTUEVDX1ZFUlNJT04gPSAic3BlYy12ZXJzaW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBUUkFOU0FDVElPTl9TVVBQT1JUID0gInRyYW5zYWN0aW9uLXN1cHBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFZFTkRPUl9OQU1FID0gInZlbmRvci1uYW1lIjsvLyROT04tTkxTLTEkCi0JLy9KQ0EgMS41Ci0JcHVibGljIFN0cmluZyBSRVNPVVJDRUFEQVBURVJfVkVSU0lPTiA9ICJyZXNvdXJjZWFkYXB0ZXItdmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUkVTT1VSQ0VBREFQVEVSX0NMQVNTID0gInJlc291cmNlYWRhcHRlci1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSID0gIm91dGJvdW5kLXJlc291cmNlYWRhcHRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSU5CT1VORF9SRVNPVVJDRUFEQVBURVIgPSAiaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RJT05fREVGSU5JVElPTiA9ICJjb25uZWN0aW9uLWRlZmluaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1FU1NBR0VBREFQVEVSID0gIm1lc3NhZ2VhZGFwdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNRVNTQUdFTElTVEVORVIgPSAibWVzc2FnZWxpc3RlbmVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNRVNTQUdFTElTVEVORVJfVFlQRSA9ICJtZXNzYWdlbGlzdGVuZXItdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQUNUSVZBVElPTlNQRUMgPSAiYWN0aXZhdGlvbnNwZWMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFDVElWQVRJT05TUEVDX0NMQVNTID0gImFjdGl2YXRpb25zcGVjLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFkgPSAicmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFN0cmluZyBBRE1JTk9CSkVDVCA9ICJhZG1pbm9iamVjdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQURNSU5PQkpFQ1RfQ0xBU1MgPSAiYWRtaW5vYmplY3QtY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFETUlOT0JKRUNUX0lOVEVSRkFDRSA9ICJhZG1pbm9iamVjdC1pbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjBlYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiBXQVIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIGV4dGVuZHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwdWJsaWMgU3RyaW5nIEFVVEhfQ09OU1RSQUlOVCA9ICJhdXRoLWNvbnN0cmFpbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFVVEhfTUVUSE9EID0gImF1dGgtbWV0aG9kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05URVhUX1BBUkFNID0gImNvbnRleHQtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERJU1RSSUJVVEFCTEUgPSAiZGlzdHJpYnV0YWJsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRVJST1JfQ09ERSA9ICJlcnJvci1jb2RlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFUlJPUl9QQUdFID0gImVycm9yLXBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVYQ0VQVElPTl9UWVBFID0gImV4Y2VwdGlvbi10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFWFRFTlNJT04gPSAiZXh0ZW5zaW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBGSUxURVIgPSAiZmlsdGVyIjsJCQkvLyROT04tTkxTLTEkCQkvLyBTZXJ2bGV0Mi4zCi0JcHVibGljIFN0cmluZyBGSUxURVJfTUFQUElORyA9ICJmaWx0ZXItbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAkvLyBTZXJ2bGV0Mi4zCi0JcHVibGljIFN0cmluZyBGSUxURVJfTkFNRSA9ICJmaWx0ZXItbmFtZSI7CQkvLyROT04tTkxTLTEkCS8vIFNlcnZsZXQyLjMKLQlwdWJsaWMgU3RyaW5nIEZJTFRFUl9DTEFTUyA9ICJmaWx0ZXItY2xhc3MiOy8vJE5PTi1OTFMtMSQJCS8vIFNlcnZsZXQyLjMKLQlwdWJsaWMgU3RyaW5nIEZPUk1fRVJST1JfUEFHRSA9ICJmb3JtLWVycm9yLXBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEZPUk1fTE9HSU5fQ09ORklHID0gImZvcm0tbG9naW4tY29uZmlnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBGT1JNX0xPR0lOX1BBR0UgPSAiZm9ybS1sb2dpbi1wYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBIVFRQX01FVEhPRCA9ICJodHRwLW1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSU5JVF9QQVJBTSA9ICJpbml0LXBhcmFtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKU1BfRklMRSA9ICJqc3AtZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTElTVEVORVIgPSAibGlzdGVuZXIiOwkvLyROT04tTkxTLTEkCQkJLy8gU2VydmxldDIuMwotCXB1YmxpYyBTdHJpbmcgTE9BRF9PTl9TVEFSVFVQID0gImxvYWQtb24tc3RhcnR1cCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9DQVRJT04gPSAibG9jYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPR0lOX0NPTkZJRyA9ICJsb2dpbi1jb25maWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1JTUVfTUFQUElORyA9ICJtaW1lLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1JTUVfVFlQRSA9ICJtaW1lLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFJFQUxNX05BTUUgPSAicmVhbG0tbmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VDVVJJVFlfQ09OU1RSQUlOVCA9ICJzZWN1cml0eS1jb25zdHJhaW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVJWTEVUID0gInNlcnZsZXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFUlZMRVRfQ0xBU1MgPSAic2VydmxldC1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HID0gInNlcnZsZXQtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VSVkxFVF9OQU1FID0gInNlcnZsZXQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VTU0lPTl9DT05GSUcgPSAic2Vzc2lvbi1jb25maWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFU1NJT05fVElNRU9VVCA9ICJzZXNzaW9uLXRpbWVvdXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFRBR0xJQiA9ICJ0YWdsaWIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFRBR0xJQl9MT0NBVElPTiA9ICJ0YWdsaWItbG9jYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFRBR0xJQl9VUkkgPSAidGFnbGliLXVyaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVFJBTlNQT1JUX0dVQVJBTlRFRSA9ICJ0cmFuc3BvcnQtZ3VhcmFudGVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBVUkxfUEFUVEVSTiA9ICJ1cmwtcGF0dGVybiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSAidXNlci1kYXRhLWNvbnN0cmFpbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9BUFAgPSAid2ViLWFwcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCX1JFU09VUkNFX0NPTExFQ1RJT04gPSAid2ViLXJlc291cmNlLWNvbGxlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9SRVNPVVJDRV9OQU1FID0gIndlYi1yZXNvdXJjZS1uYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUxDT01FX0ZJTEUgPSAid2VsY29tZS1maWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUxDT01FX0ZJTEVfTElTVCA9ICJ3ZWxjb21lLWZpbGUtbGlzdCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBTdHJpbmcgRElTUEFUQ0hFUiA9ICJkaXNwYXRjaGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUID0gImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HID0gImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0NBTEUgPSAibG9jYWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFTkNPRElORyA9ICJlbmNvZGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSlNQX0NPTkZJRyA9ICJqc3AtY29uZmlnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKU1BfUFJPUEVSVFlfR1JPVVAgPSAianNwLXByb3BlcnR5LWdyb3VwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFTF9JR05PUkVEID0gImVsLWlnbm9yZWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFBBR0VfRU5DT0RJTkcgPSAicGFnZS1lbmNvZGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0NSSVBUSU5HX0lOVkFMSUQgPSAic2NyaXB0aW5nLWludmFsaWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElTX1hNTCA9ICJpcy14bWwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElOQ0xVREVfUFJFTFVERSA9ICJpbmNsdWRlLXByZWx1ZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElOQ0xVREVfQ09EQSA9ICJpbmNsdWRlLWNvZGEiOy8vJE5PTi1OTFMtMSQKLQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2ViU2VydmljZXNEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg2OGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySXsKLQkvLzEuMyBzcGVjaWZpYyBXZWJTZXJ2aWNlcyBERAotCXB1YmxpYyBTdHJpbmcgQ09NUF9TQ09QRURfUkVGUyA9ICJjb21wb25lbnQtc2NvcGVkLXJlZnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTVBfQ09NUE9ORU5UX05BTUUgPSAiY29tcG9uZW50LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlQgPSAid2Vic2VydmljZXNjbGllbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPQ0FMUEFSVCA9ICJsb2NhbHBhcnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE5BTUVTUEFDRVVSSSA9ICJuYW1lc3BhY2VVUkkiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YTUxQYXJzZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1hNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZWY3YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1hNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ4bWxwYXJzZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBYTUxQYXJzZVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kX2ludm9rZV9mYWlsZWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfdG9fbG9hZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZF9ub3RfZm91bmRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfaW5zdGFudGlhdGluZ19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlX2V4Y2VwdGlvbl9vY2N1cmVkX0VYQ187Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxQYXJzZVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YbWxEb2N1bWVudFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1htbERvY3VtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzU3NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1htbERvY3VtZW50UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8yMS8wMSA0OjM0OjEzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRSZWFkZXIgZXh0ZW5kcyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgewotLyoqCi0gKiBYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWG1sRG9jdW1lbnRSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlKSB7Ci0Jc3VwZXIoc291cmNlKTsKLQlzZXRGbGFnRGVmYXVsdHMoKTsKLX0KLS8qKgotICogWG1sRG9jdW1lbnRSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFhtbERvY3VtZW50UmVhZGVyKElucHV0U291cmNlIHNvdXJjZSwgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIEVycm9ySGFuZGxlciBoYW5kbGVyKSB7Ci0Jc3VwZXIoc291cmNlLCByZXNvbHZlciwgaGFuZGxlcik7Ci0Jc2V0RmxhZ0RlZmF1bHRzKCk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMDoxMzoyNiBBTSkKLSAqIEByZXR1cm4gb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKLSAqLwotcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGNyZWF0ZURlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLQlyZXR1cm4gSjJFRVhtbER0REVudGl0eVJlc29sdmVyLklOU1RBTkNFOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgYW5FeGNlcHRpb24pIHsKLQlpZiAoYW5FeGNlcHRpb24gaW5zdGFuY2VvZiBTQVhQYXJzZUV4Y2VwdGlvbikgCi0JCWhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgKFNBWFBhcnNlRXhjZXB0aW9uKSBhbkV4Y2VwdGlvbik7Ci0JZWxzZQotCQlzdXBlci5oYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIGFuRXhjZXB0aW9uKTsKLX0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFNBWFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uKSB7Ci0JcHJpbUhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhYTUxQYXJzZVJlc291cmNlSGFuZGxlci5wYXJzZV9leGNlcHRpb25fb2NjdXJlZF9FWENfLCAobmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihwYXJzZUV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCkpLCBuZXcgSW50ZWdlcihwYXJzZUV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSkgfSkpLCBwYXJzZUV4Y2VwdGlvbik7ICAKLQkvLyROT04tTkxTLTEkID0gIkFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHhtbDogezB9IExpbmUgIzogezF9IDpDb2x1bW4gIzogIgotfQotcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCWlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKLQkJdGhyb3cgbmV3IFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKGFNZXNzYWdlLCAoRXhjZXB0aW9uKWFuRXhjZXB0aW9uKTsKLQlzdXBlci5wcmltSGFuZGxlRXhjZXB0aW9uKGFNZXNzYWdlLCBhbkV4Y2VwdGlvbik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRGbGFnRGVmYXVsdHMoKSB7Ci0Jc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCXNldFZhbGlkYXRlKHRydWUpOwotfQotICAgcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgcmVhZERvY3VtZW50VHlwZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHVyaSkgewotICAgIAlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotICAgIAlHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgYVJlYWRlciA9ICBuZXcgWG1sRG9jdW1lbnRSZWFkZXIoc291cmNlKTsKLSAgICAJYVJlYWRlci5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0gICAgCURvY3VtZW50IGFEb2N1bWVudCA9IGFSZWFkZXIucGFyc2VEb2N1bWVudCgpOwotICAgIAlpZiAoYURvY3VtZW50ICE9IG51bGwpCi0gICAgCQlyZXR1cm4gYURvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQWN0aXZhdGlvblNwZWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE2MWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotICogc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLSAqIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi0gKiByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBY3RpdmF0aW9uU3BlYygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uU3BlYyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBhY3RpdmF0aW9uc3BlYy1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uCi0JICogICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotCSAqICAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLkFjdGl2YXRpb25TcGVjIGludGVyZmFjZS4gVGhlCi0JICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEKLQkgKiAgICAgICAgIEphdmFCZWFuLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLQkgKiAgICAgICAgICAgICA8L2FjdGl2YXRpb25zcGVjLWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2YXRpb25TcGVjQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcyA8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25TcGVjQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotfSAvLyBBY3RpdmF0aW9uU3BlYwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0FkbWluT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQWRtaW5PYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3Y2VmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQWRtaW5PYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZG1pbiBPYmplY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgYWRtaW5vYmplY3RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbgotICogYWRtaW5pc3RlcmVkIG9iamVjdC4gIEFkbWluaXN0ZXJlZCBvYmplY3RzIGFyZSBzcGVjaWZpYyB0byBhCi0gKiBtZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieQotICogYW4gYWRtaW5pc3RlcmVkIG9iamVjdCwgaXRzIEphdmEgY2xhc3MgbmFtZSBhbmQgaXRzCi0gKiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0SW50ZXJmYWNlIDxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RDbGFzcyA8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFkbWluT2JqZWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFkbWluT2JqZWN0IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUKLQkgKiAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlCi0JICogICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0JICogICAgICAgICAgIDwvYWRtaW5vYmplY3QtaW50ZXJmYWNlPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBZG1pbk9iamVjdEludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0SW50ZXJmYWNlIDxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgKiAgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICAgICAgPGFkbWlub2JqZWN0LWNsYXNzPmNvbS53b21iYXQuRGVzdGluYXRpb25JbXBsCi0JICogICAgICAgICAgICAgPC9hZG1pbm9iamVjdC1jbGFzcz4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBZG1pbk9iamVjdENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWRtaW5PYmplY3RDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0Q2xhc3MgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pbk9iamVjdENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotfSAvLyBBZG1pbk9iamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMTAzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotICogCi0gKiBOb3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotICogVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCSAqIAotCSAqIFRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0JICogICAtIEJhc2ljUGFzc3dvcmQKLQkgKiAgIC0gS2VyYnY1Ci0JICogCi0JICogQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCi0JICogQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKLQkgKiBAc2VlICNpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjdW5zZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICNzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI3NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDcmVkZW50aWFsSW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZm9yCi0JICogdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjcmVkZW50aWFscy4gVGhpcyBlbGVtZW50IHNob3VsZCBiZSB1c2VkIGJ5Ci0JICogYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQKLQkgKiBvZiB0aGUgc2VjdXJpdHkgY29udHJhY3QuCi0JICogCi0JICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0JICogICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotCSAqICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAotCi0JICovCi0JU3RyaW5nIGdldENyZWRlbnRpYWxJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDcmVkZW50aWFsSW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q3JlZGVudGlhbEludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEN1c3RvbUF1dGhNZWNoVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIEF0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHdoZW4KLQkgKiBpdCBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBCYXNpY1Bhc3N3b3JkIG9yIEtlcmJ2NS4gIEF1dGhlbnRpY2F0aW9uTWVjYW5pc21UeXBlIAotCSAqIGlzIHNldCB0byAnQ3VzdG9tJyBpbiB0aG9zZSBjYXNlcy4gIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBieQotCSAqIHJ1bnRpbWUuICBJdCBpcyBvbmx5IHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSBiYWNrIG91dCB0aGUgY3VzdG9tCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHN0cmluZyBpbiB0aGUgY2FzZSBvZiBjdXN0b20KLQkgKiBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUncy4gIAotCSAqIFRoaXMgdmFyaWFibGUgaXMgaW50ZXJuYWwsIHVzZWQgb25seSBieSB0aGUgcmVhZGVyLy93cml0ZXIgY2xhc3NlcywgYW5kIGNhbgotCSAqIGNoYW5nZSBvciBkaXNhcHBlYXIgd2l0aG91dCBub3RpY2UuICAKLQkgKi8KLQlTdHJpbmcgZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ3VzdG9tQXV0aE1lY2hUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q3VzdG9tQXV0aE1lY2hUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDAzNTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0lDX1BBU1NXT1JEPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFUkJWNT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJhc2ljIFBhc3N3b3JkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QmFzaWMgUGFzc3dvcmQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkFTSUNfUEFTU1dPUkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBCQVNJQ19QQVNTV09SRF9MSVRFUkFMID0gbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShCQVNJQ19QQVNTV09SRCwgIkJhc2ljUGFzc3dvcmQiLCAiQmFzaWNQYXNzd29yZCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPktlcmJ2NTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPktlcmJ2NTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNLRVJCVjUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBLRVJCVjVfTElURVJBTCA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoS0VSQlY1LCAiS2VyYnY1IiwgIktlcmJ2NSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVtdIHsKLQkJCUJBU0lDX1BBU1NXT1JEX0xJVEVSQUwsCi0JCQlLRVJCVjVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBCQVNJQ19QQVNTV09SRDogcmV0dXJuIEJBU0lDX1BBU1NXT1JEX0xJVEVSQUw7Ci0JCQljYXNlIEtFUkJWNTogcmV0dXJuIEtFUkJWNV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0NvbmZpZ1Byb3BlcnR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29uZmlnUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmNTlkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29uZmlnUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgY29uZmlnIHByb3BlcnR5IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBzaW5nbGUKLSAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLgotICogCi0gKiBFYWNoIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZSBjcmVhdGVzIGNvbm5lY3Rpb25zIHRvIGEgc3BlY2lmaWMgRUlTIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgb24gdGhlIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgb25seSBvbmNlIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGV2ZW4gdGhvdWdoIGEgcmVzb3VyY2UgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgTWFuYWdlZENvbm5uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2VzICh0aGF0IGNyZWF0ZSBjb25uZWN0aW9ucyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIEVJUykuCi0gKiAKLSAqIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwgdHlwZQotICogYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZiB0aGUgcmVzb3VyY2UKLSAqIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLSAqIAotICogQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24uCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ1Byb3BlcnR5IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZCBwcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIAotCSAqIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcyBmb2xsb3dzOgotCSAqIAotCSAqICAgICAgU2VydmVyTmFtZQotCSAqICAgICAgUG9ydE51bWJlcgotCSAqICAgICAgVXNlck5hbWUKLQkgKiAgICAgIFBhc3N3b3JkCi0JICogICAgICBDb25uZWN0aW9uVVJMCi0JICogCi0JICogQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZSBwcm9wZXJ0aWVzCi0JICogc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIEVJUy4KLQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZAotCSAqIGJ5IE1hbmFnZWRDb25uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToKLQkgKiAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICogICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLQkgKiAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFZhbHVlIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0aW9uRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3Rpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjA5MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3Rpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi0gKiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLSAqIHR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLSAqIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci0gKiBvZiB0aGlzIHNldC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uRGVmaW5pdGlvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcwotCSAqICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkgKiAgICAgICAgIGltcGxlbWVudHMgdGhlCi0JICogICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKiAgICAgICAgIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlCi0JICogICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQotCSAqICAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLQkgKiAgICAgICAgIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqICAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLQkgKiAgICAgICAgICAgICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwKLQkgKiAgICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotCSAqICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotCSAqICAgICAgICAgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKLQkgKiAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCSAqIAotCSAqICAgICAgICAgT1IKLQkgKiAKLQkgKiAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5Ci0JICogICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBzcGVjaWZpZXMKLQkgKiAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLQkgKiAgICAgICAgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCi0JICogICAgICAgICBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqIAotCSAqICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLQkgKiAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbm5lY3Rpb24taW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotCSAqICAgICAgICAgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqIAotCSAqICAgICAgICAgICAgIDxjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbgotCSAqICAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzc1R5cGUgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotCSAqICAgICAgICAgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb24KLQkgKiAgICAgICAgIGludGVyZmFjZS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzcwotCSAqICAgICAgICAgZWxlbWVudHMuCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqIAotCSAqICAgICAgICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uSW1wbAotCSAqICAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCi19IC8vIENvbm5lY3Rpb25EZWZpbml0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmZhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLS8qKgotICogVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4KLQotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3IgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQotCi0JLyoqCi0JKiBUaGlzIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkLiAgQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBmYWlscwotCSogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgSjJDIG1vZHVsZSAKLQkqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmVuZG9yTmFtZSBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0JICogRXhhbXBsZTogV29tYmF0IENvcnAuCi0JICovCi0JU3RyaW5nIGdldFZlbmRvck5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWZW5kb3JOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VmVuZG9yTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNwZWNWZXJzaW9uIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMKLQkgKiBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95ZXIgdG8KLQkgKiBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cwotCSAqIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCVN0cmluZyBnZXRTcGVjVmVyc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNwZWNWZXJzaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U3BlY1ZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBFaXNUeXBlIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgCi0JICogY2FuIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24gaW5mby4KLQkgKiAKLQkgKiBUaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoCi0JICogdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotCi0JICovCi0JU3RyaW5nIGdldEVpc1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFaXNUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RWlzVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIHZlcnNpb25zCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UKLQkgKiBhZGFwdGVyIHByb3ZpZGVyLgotCSAqIAotCSAqIEV4YW1wbGU6IDEuMAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIExpY2Vuc2UgcmVmZXJlbmNlCi0JICogU3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gVGhpcyBlbGVtZW50Ci0JICogc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UKLQkgKiBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIAotCSAqIG9mIGxpY2Vuc2UsIG51bWJlciBvZgotCSAqIGNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4KLQkgKi8KLQlMaWNlbnNlIGdldExpY2Vuc2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaWNlbnNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TGljZW5zZShMaWNlbnNlIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJlc291cmNlQWRhcHRlciByZWZlcmVuY2UKLQkgKi8KLQlSZXNvdXJjZUFkYXB0ZXIgZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVzb3VyY2VBZGFwdGVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3JSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3RvclJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGU1NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3RvclJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG1vZGVsCi0JICogQHJldHVybiBDb25uZWN0b3IKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSW5ib3VuZFJlc291cmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdiMGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uCi0gKiBhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24KLSAqIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlcgotICogbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgbWVzc2FnZWFkYXB0ZXIgZWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0JICogICAgICAgICB1bmlxdWUgaW4gdGhlIG1lc3NhZ2VhZGFwdGVyLiBTZXZlcmFsIG1lc3NhZ2VsaXN0ZW5lcnMKLQkgKiAgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VBZGFwdGVyKE1lc3NhZ2VBZGFwdGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlQWRhcHRlciBnZXRNZXNzYWdlQWRhcHRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0TWVzc2FnZUFkYXB0ZXIgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgdmFsdWUpOwotCi19IC8vIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9KY2FGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSmNhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGFmMmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9KY2FGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEpjYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpjYUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhRmFjdG9yeUltcGwuaW5pdCgpOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbm5lY3RvciB2YWx1ZQotCSAqLwotCUNvbm5lY3RvciBjcmVhdGVDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTGljZW5zZSB2YWx1ZQotCSAqLwotCUxpY2Vuc2UgY3JlYXRlTGljZW5zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5ib3VuZFJlc291cmNlQWRhcHRlciBjcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29ubmVjdGlvbkRlZmluaXRpb24gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFkbWluT2JqZWN0IGNyZWF0ZUFkbWluT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VMaXN0ZW5lciBjcmVhdGVNZXNzYWdlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25TcGVjIGNyZWF0ZUFjdGl2YXRpb25TcGVjKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVzb3VyY2VBZGFwdGVyIHZhbHVlCi0JICovCi0JUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZVJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eVBlcm1pc3Npb24gdmFsdWUKLQkgKi8KLQlTZWN1cml0eVBlcm1pc3Npb24gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHZhbHVlCi0JICovCi0JQXV0aGVudGljYXRpb25NZWNoYW5pc20gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29uZmlnUHJvcGVydHkgdmFsdWUKLQkgKi8KLQlDb25maWdQcm9wZXJ0eSBjcmVhdGVDb25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKY2FQYWNrYWdlIGdldEpjYVBhY2thZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9KY2FQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2VmZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKY2FQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImpjYSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUiA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fRUlTX1RZUEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19MSUNFTlNFID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMSUNFTlNFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUEVSTUlTU0lPTiA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU00gPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWSA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORCA9IDE1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA9IDE0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImpjYS54bWkiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmNhUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX19OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05GSUdfUFJPUEVSVFlfX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMSUNFTlNFX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMSUNFTlNFX19SRVFVSVJFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJQ0VOU0VfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpY2Vuc2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElDRU5TRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbCA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRNZXNzYWdlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0FEQVBURVIgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfQURBUFRFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCA8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT04gPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBZG1pbk9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1QgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1RfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsIDxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvblNwZWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9TUEVDID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX1NQRUNfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9FaXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9MaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTGljZW5zZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TGljZW5zZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExpY2Vuc2VfUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2UjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRMaWNlbnNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBzZWUgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucygpCi0JICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkKLQkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXIgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyI2dldE1lc3NhZ2VMaXN0ZW5lcnMgPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlciNnZXRNZXNzYWdlTGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKQotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29uZmlnUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFkbWluIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWRtaW5PYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0SW50ZXJmYWNlIDxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbk9iamVjdENsYXNzIDxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RDbGFzcygpCi0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyIDxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlIDxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uU3BlYyA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uU3BlYygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFJlc291cmNlQWRhcHRlckNsYXNzIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0QWRtaW5PYmplY3RzIDxlbT5BZG1pbiBPYmplY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZG1pbiBPYmplY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRBZG1pbk9iamVjdHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eVBlcm1pc3Npb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5UGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbmZpZ1Byb3BlcnR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUpjYUZhY3RvcnkgZ2V0SmNhRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCA8ZW0+Q29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbm5lY3RvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05ORUNUT1IgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZW5kb3IgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9fVkVORE9SX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNwZWMgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWlzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05ORUNUT1JfX0VJU19UWVBFID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9FaXNUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaWNlbnNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OTkVDVE9SX19MSUNFTlNFID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9MaWNlbnNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlc291cmNlQWRhcHRlckltcGwgPGVtPlJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFBlcm1pc3Npb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNID0gZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNID0gZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVkZW50aWFsIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tIEF1dGggTWVjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3VzdG9tQXV0aE1lY2hUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsIDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25maWdQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05GSUdfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTkZJR19QUk9QRVJUWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19UWVBFID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5UGVybWlzc2lvbkltcGwgPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVBlcm1pc3Npb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX1BFUk1JU1NJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkxpY2Vuc2VJbXBsIDxlbT5MaWNlbnNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTGljZW5zZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRMaWNlbnNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJQ0VOU0UgPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSUNFTlNFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJQ0VOU0VfX1JFUVVJUkVEID0gZUlOU1RBTkNFLmdldExpY2Vuc2VfUmVxdWlyZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElDRU5TRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUID0gZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyA9IGVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VBZGFwdGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlQWRhcHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05ORUNUSU9OX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTID0gZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsIDxlbT5BZG1pbiBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBZG1pbk9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBRE1JTl9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTID0gZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwgPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfTElTVEVORVIgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvblNwZWMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZBVElPTl9TUEVDID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydCBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBUUkFOU0FDVElPTl9TVVBQT1JUX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNhY3Rpb25TdXBwb3J0S2luZCgpOwotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKTsKLQotfSAvL0pjYVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9MaWNlbnNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTGljZW5zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU5NDUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9MaWNlbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBTcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0gKiBAc2luY2UgMS4wIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpY2Vuc2UgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2UjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlcXVpcmVkKCkKLQkgKiBAc2VlICNpc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNkYzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBtZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzCi0gKiBjb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiByZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0gKiBtZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXIjZ2V0TWVzc2FnZUxpc3RlbmVycyA8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VBZGFwdGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VBZGFwdGVyIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZUxpc3RlbmVycygpOwotCi19IC8vIE1lc3NhZ2VBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjY2MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL01lc3NhZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBtZXNzYWdlbGlzdGVuZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhCi0gKiBzcGVjaWZpYyBtZXNzYWdlIGxpc3RlbmVyIHN1cHBvcnRlZCBieSB0aGUgbWVzc2FnaW5nCi0gKiByZXNvdXJjZSBhZGFwdGVyLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlCi0gKiBvZiB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpbnRlcmZhY2UgYW5kIGFuIGFjdGl2YXRpb24KLSAqIHNwZWNpZmljYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlIDxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0QWN0aXZhdGlvblNwZWMgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQotCSAqICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAgICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLQkgKiAgICAgICAgICAgPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlTGlzdGVuZXJUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25TcGVjIGdldEFjdGl2YXRpb25TcGVjKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldEFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlTGlzdGVuZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9PdXRib3VuZFJlc291cmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGRkYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dAotICogYW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5Ci0gKiBxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YKLSAqIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yCi0gKiBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQKLSAqIHByb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZAotICogYW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0gKiAKLSAqIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICogcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLSAqIHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMKLSAqIHBhcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcwotICogdGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCBzcGVjaWZpZXMKLQkgKiAgICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLQkgKiAgICAgICAgIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtIENvbm5lY3Rpb24KLQkgKiAgICAgICAgIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlCi0JICogICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoaXMgZWxlbWVudCBtdXN0IGhhdmUKLQkgKiAgICAgICAgIGVpdGhlciBhICJ0cnVlIiBvciAiZmFsc2UiIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICN1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZAotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZAotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCi19IC8vIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjk0MDQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gKiBvZiBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYQotICogcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkCi0gKiBieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiAKLSAqIDxyZXF1aXJlZC1jb25maWctcHJvcGVydHk+RGVzdGluYXRpb248L3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2NhYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1Jlc291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzcy8vaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvciBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbAotICogcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0gKiAKLSAqIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICogcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLSAqIHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydAotICogb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkKLSAqIHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQotCSAqIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzCi0JICogcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSAKLQkgKiBzcGVjaWZpZWQgY29udHJhY3RzLgotCi0JICovCi0JU3RyaW5nIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgCi0JICogYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgY2xhc3MgdGhhdAotCSAqIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25JbnRlcmZhY2UgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25JbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uSW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25JbXBsQ2xhc3MgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSAKLQkgKiByZXNvdXJjZSBhZGFwdGVyLgotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc2FjdGlvblN1cHBvcnQgYXR0cmlidXRlCi0JICogVGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uCi0JICogc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKiBUaGUgdmFsdWUgb2YgdHJhbnNhY3Rpb24tc3VwcG9ydCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqICAgTm9UcmFuc2FjdGlvbgotCSAqICAgTG9jYWxUcmFuc2FjdGlvbgotCSAqICAgWEFUcmFuc2FjdGlvbgotCSAqLwotCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZAotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLQkgKiByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLUNvbm5lY3Rpb24gaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzCi0JICogaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQotCSAqIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLgotCSAqLwotCWJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlYXV0aGVudGljYXRpb25TdXBwb3J0IGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQotCSAqICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotCSAqICAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLQkgKiAgICAgICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLQkgKiAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IKLQkgKiAgICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLQkgKiAgICAgICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlQWRhcHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFJlc291cmNlQWRhcHRlckNsYXNzIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlQZXJtaXNzaW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBDb25maWdQcm9wZXJ0aWVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0JICogICAgICAgICB1bmlxdWUgaW4gdGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlci4gTXVsdGlwbGUgY29ubmVjdGlvbi1kZWZpbml0aW9ucwotCSAqICAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgY29ubmVjdGlvbmZhY3RvcnktdHlwZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5ib3VuZFJlc291cmNlQWRhcHRlciBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFkbWluT2JqZWN0cygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDg0ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogU3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0gKiAKLSAqIFRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdG9yIHNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkgcGVybWlzc2lvbi4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlQZXJtaXNzaW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNwZWNpZmljYXRpb24gYXR0cmlidXRlCi0JICogVGhlIGVsZW1lbnQgcGVybWlzc2lvbi1zcGVjIHNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gYmFzZWQgb24gdGhlCi0JICogU2VjdXJpdHkgcG9saWN5IGZpbGUgc3ludGF4LiAKLQotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU3BlY2lmaWNhdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFNwZWNpZmljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9UcmFuc2FjdGlvblN1cHBvcnRLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTc2NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVFJBTlNBQ1RJT049IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfVFJBTlNBQ1RJT049IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWEFfVFJBTlNBQ1RJT049IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ObyBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PX1RSQU5TQUNUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIE5PX1RSQU5TQUNUSU9OX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25TdXBwb3J0S2luZChOT19UUkFOU0FDVElPTiwgIk5vVHJhbnNhY3Rpb24iLCAiTm9UcmFuc2FjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfVFJBTlNBQ1RJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgTE9DQUxfVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKExPQ0FMX1RSQU5TQUNUSU9OLCAiTG9jYWxUcmFuc2FjdGlvbiIsICJMb2NhbFRyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WEEgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5YQSBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNYQV9UUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBYQV9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoWEFfVFJBTlNBQ1RJT04sICJYQVRyYW5zYWN0aW9uIiwgIlhBVHJhbnNhY3Rpb24iKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmRbXSB7Ci0JCQlOT19UUkFOU0FDVElPTl9MSVRFUkFMLAotCQkJTE9DQUxfVFJBTlNBQ1RJT05fTElURVJBTCwKLQkJCVhBX1RSQU5TQUNUSU9OX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9fVFJBTlNBQ1RJT046IHJldHVybiBOT19UUkFOU0FDVElPTl9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9UUkFOU0FDVElPTjogcmV0dXJuIExPQ0FMX1RSQU5TQUNUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFhBX1RSQU5TQUNUSU9OOiByZXR1cm4gWEFfVFJBTlNBQ1RJT05fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25TdXBwb3J0S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvblNwZWNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZDk1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcyA8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIDxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25TcGVjSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFjdGl2YXRpb25TcGVjIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRJT05fU1BFQ19DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmF0aW9uU3BlY0NsYXNzID0gQUNUSVZBVElPTl9TUEVDX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvblNwZWNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX1NQRUM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvblNwZWNDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uU3BlY0NsYXNzKFN0cmluZyBuZXdBY3RpdmF0aW9uU3BlY0NsYXNzKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmF0aW9uU3BlY0NsYXNzID0gYWN0aXZhdGlvblNwZWNDbGFzczsKLQkJYWN0aXZhdGlvblNwZWNDbGFzcyA9IG5ld0FjdGl2YXRpb25TcGVjQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1MsIG9sZEFjdGl2YXRpb25TcGVjQ2xhc3MsIGFjdGl2YXRpb25TcGVjQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAocmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUzoKLQkJCQlzZXRBY3RpdmF0aW9uU3BlY0NsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXNldEFjdGl2YXRpb25TcGVjQ2xhc3MoQUNUSVZBVElPTl9TUEVDX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXJldHVybiBBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2YXRpb25TcGVjQ2xhc3MgIT0gbnVsbCA6ICFBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGFjdGl2YXRpb25TcGVjQ2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvblNwZWNDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZhdGlvblNwZWNDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2YXRpb25TcGVjSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQWRtaW5PYmplY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNWQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWRtaW4gT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCNnZXRBZG1pbk9iamVjdENsYXNzIDxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFkbWluT2JqZWN0SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFkbWluT2JqZWN0IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKSA8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX09CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKSA8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWRtaW5PYmplY3RJbnRlcmZhY2UgPSBBRE1JTl9PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWluT2JqZWN0Q2xhc3MoKSA8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9PQkpFQ1RfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RDbGFzcygpIDxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWRtaW5PYmplY3RDbGFzcyA9IEFETUlOX09CSkVDVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnRpZXMoKSA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmZpZ1Byb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFkbWluT2JqZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQURNSU5fT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBhZG1pbk9iamVjdEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pbk9iamVjdEludGVyZmFjZShTdHJpbmcgbmV3QWRtaW5PYmplY3RJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZEFkbWluT2JqZWN0SW50ZXJmYWNlID0gYWRtaW5PYmplY3RJbnRlcmZhY2U7Ci0JCWFkbWluT2JqZWN0SW50ZXJmYWNlID0gbmV3QWRtaW5PYmplY3RJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFLCBvbGRBZG1pbk9iamVjdEludGVyZmFjZSwgYWRtaW5PYmplY3RJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkbWluT2JqZWN0Q2xhc3MoKSB7Ci0JCXJldHVybiBhZG1pbk9iamVjdENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nIG5ld0FkbWluT2JqZWN0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZEFkbWluT2JqZWN0Q2xhc3MgPSBhZG1pbk9iamVjdENsYXNzOwotCQlhZG1pbk9iamVjdENsYXNzID0gbmV3QWRtaW5PYmplY3RDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUywgb2xkQWRtaW5PYmplY3RDbGFzcywgYWRtaW5PYmplY3RDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoY29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQljb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uZmlnUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEFkbWluT2JqZWN0Q2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTOgotCQkJCXNldEFkbWluT2JqZWN0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoQURNSU5fT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTOgotCQkJCXNldEFkbWluT2JqZWN0Q2xhc3MoQURNSU5fT0JKRUNUX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIEFETUlOX09CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGFkbWluT2JqZWN0SW50ZXJmYWNlICE9IG51bGwgOiAhQURNSU5fT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoYWRtaW5PYmplY3RJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTOgotCQkJCXJldHVybiBBRE1JTl9PQkpFQ1RfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGFkbWluT2JqZWN0Q2xhc3MgIT0gbnVsbCA6ICFBRE1JTl9PQkpFQ1RfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGFkbWluT2JqZWN0Q2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZG1pbk9iamVjdEludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRtaW5PYmplY3RJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluT2JqZWN0Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkbWluT2JqZWN0Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BZG1pbk9iamVjdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjI1NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotICogCi0gKiBOb3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotICogVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFX0VERUZBVUxUID0gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLkJBU0lDX1BBU1NXT1JEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkgPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWRlbnRpYWxJbnRlcmZhY2UgPSBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCkgPGVtPkN1c3RvbSBBdXRoIE1lY2ggVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21BdXRoTWVjaFR5cGUgPSBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSB7Ci0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShTdHJpbmcgbmV3QXV0aGVudGljYXRpb25NZWNoYW5pc20pIHsKLQkJU3RyaW5nIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gYXV0aGVudGljYXRpb25NZWNoYW5pc207Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gbmV3QXV0aGVudGljYXRpb25NZWNoYW5pc207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00sIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0JICogCi0JICogVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLQkgKiAgIC0gQmFzaWNQYXNzd29yZAotCSAqICAgLSBLZXJidjUKLQkgKiAKLQkgKiBBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBDb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIG5ld0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSkgewotCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPT0gbnVsbCA/IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFX0VERUZBVUxUIDogbmV3QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCQlib29sZWFuIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0OwotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFLCBvbGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSwgIW9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLQkJYm9vbGVhbiBvbGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0ID0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldDsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQ7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUsIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSwgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQsIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmb3IKLQkgKiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgYnkKLQkgKiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydAotCSAqIG9mIHRoZSBzZWN1cml0eSBjb250cmFjdC4KLQkgKiAKLQkgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKLQkgKiAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0JICogICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWRlbnRpYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjcmVkZW50aWFsSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWRlbnRpYWxJbnRlcmZhY2UoU3RyaW5nIG5ld0NyZWRlbnRpYWxJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UgPSBjcmVkZW50aWFsSW50ZXJmYWNlOwotCQljcmVkZW50aWFsSW50ZXJmYWNlID0gbmV3Q3JlZGVudGlhbEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFLCBvbGRDcmVkZW50aWFsSW50ZXJmYWNlLCBjcmVkZW50aWFsSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aGVudGljYXRpb25NZWNoYW5pc206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU6ICIpOwotCQlpZiAoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCkgcmVzdWx0LmFwcGVuZChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVkZW50aWFsSW50ZXJmYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVkZW50aWFsSW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXN0b21BdXRoTWVjaFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1c3RvbUF1dGhNZWNoVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgQXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgd2hlbgotCSAqIGl0IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIEJhc2ljUGFzc3dvcmQgb3IgS2VyYnY1LiAgQXV0aGVudGljYXRpb25NZWNhbmlzbVR5cGUgCi0JICogaXMgc2V0IHRvICdDdXN0b20nIGluIHRob3NlIGNhc2VzLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5Ci0JICogcnVudGltZS4gIEl0IGlzIG9ubHkgdXNlZCBieSB0aGUgd3JpdGVyIHRvIHdyaXRlIGJhY2sgb3V0IHRoZSBjdXN0b20KLQkgKiBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgc3RyaW5nIGluIHRoZSBjYXNlIG9mIGN1c3RvbQotCSAqIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSdzLiAgCi0JICogVGhpcyB2YXJpYWJsZSBpcyBpbnRlcm5hbCwgdXNlZCBvbmx5IGJ5IHRoZSByZWFkZXIvL3dyaXRlciBjbGFzc2VzLCBhbmQgY2FuCi0JICogY2hhbmdlIG9yIGRpc2FwcGVhciB3aXRob3V0IG5vdGljZS4gIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCkgewotCQlyZXR1cm4gY3VzdG9tQXV0aE1lY2hUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbUF1dGhNZWNoVHlwZShTdHJpbmcgbmV3Q3VzdG9tQXV0aE1lY2hUeXBlKSB7Ci0JCVN0cmluZyBvbGRDdXN0b21BdXRoTWVjaFR5cGUgPSBjdXN0b21BdXRoTWVjaFR5cGU7Ci0JCWN1c3RvbUF1dGhNZWNoVHlwZSA9IG5ld0N1c3RvbUF1dGhNZWNoVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NVU1RPTV9BVVRIX01FQ0hfVFlQRSwgb2xkQ3VzdG9tQXV0aE1lY2hUeXBlLCBjdXN0b21BdXRoTWVjaFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKLQkJCQlyZXR1cm4gZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEN1c3RvbUF1dGhNZWNoVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOgotCQkJCXNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgoQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRToKLQkJCQlzZXRDcmVkZW50aWFsSW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NVU1RPTV9BVVRIX01FQ0hfVFlQRToKLQkJCQlzZXRDdXN0b21BdXRoTWVjaFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKLQkJCQlzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXVuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q3JlZGVudGlhbEludGVyZmFjZShDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFOgotCQkJCXNldEN1c3RvbUF1dGhNZWNoVHlwZShDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006Ci0JCQkJcmV0dXJuIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVCA9PSBudWxsID8gYXV0aGVudGljYXRpb25NZWNoYW5pc20gIT0gbnVsbCA6ICFBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQuZXF1YWxzKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBjcmVkZW50aWFsSW50ZXJmYWNlICE9IG51bGwgOiAhQ1JFREVOVElBTF9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKGNyZWRlbnRpYWxJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFOgotCQkJCXJldHVybiBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbUF1dGhNZWNoVHlwZSAhPSBudWxsIDogIUNVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVC5lcXVhbHMoY3VzdG9tQXV0aE1lY2hUeXBlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25maWdQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3NWI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25maWdQcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBjb25maWcgcHJvcGVydHkgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotICogY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuCi0gKiAKLSAqIEVhY2ggTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlIGNyZWF0ZXMgY29ubmVjdGlvbnMgdG8gYSBzcGVjaWZpYyBFSVMgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBvbiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLiBUaGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBvbmx5IG9uY2UgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZXZlbiB0aG91Z2ggYSByZXNvdXJjZSBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSBNYW5hZ2VkQ29ubm5lY3Rpb24tRmFjdG9yeSBpbnN0YW5jZXMgKHRoYXQgY3JlYXRlIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgRUlTKS4KLSAqIAotICogVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlCi0gKiBhbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmIHRoZSByZXNvdXJjZQotICogYWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbiB0aGUgZGVwbG95ZXIgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotICogCi0gKiBBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbi4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbmZpZ1Byb3BlcnR5IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlnUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ09ORklHX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCSAqIAotCSAqIFRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzIGZvbGxvd3M6Ci0JICogCi0JICogICAgICBTZXJ2ZXJOYW1lCi0JICogICAgICBQb3J0TnVtYmVyCi0JICogICAgICBVc2VyTmFtZQotCSAqICAgICAgUGFzc3dvcmQKLQkgKiAgICAgIENvbm5lY3Rpb25VUkwKLQkgKiAKLQkgKiBBIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIEVJUy4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZCBieSBNYW5hZ2VkQ29ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlLgotCSAqIAotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgY29uZmlnLXByb3BlcnR5LXR5cGU6Ci0JICogICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotCSAqICAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0JICogICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJlMTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbm5lY3Rpb25JbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25uZWN0aW9uRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzID0gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW50ZXJmYWNlID0gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW1wbENsYXNzID0gQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydGllcygpIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5DT05ORUNUSU9OX0RFRklOSVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKFN0cmluZyBuZXdNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcykgewotCQlTdHJpbmcgb2xkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPSBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczsKLQkJbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPSBuZXdNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTLCBvbGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcywgbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA9IGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOwotCQljb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA9IG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSwgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UsIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZyBuZXdDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcykgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczsKLQkJY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBuZXdDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTLCBvbGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcywgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25JbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JbnRlcmZhY2UoU3RyaW5nIG5ld0Nvbm5lY3Rpb25JbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25JbnRlcmZhY2UgPSBjb25uZWN0aW9uSW50ZXJmYWNlOwotCQljb25uZWN0aW9uSW50ZXJmYWNlID0gbmV3Q29ubmVjdGlvbkludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uSW50ZXJmYWNlLCBjb25uZWN0aW9uSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkltcGxDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uSW1wbENsYXNzKFN0cmluZyBuZXdDb25uZWN0aW9uSW1wbENsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uSW1wbENsYXNzID0gY29ubmVjdGlvbkltcGxDbGFzczsKLQkJY29ubmVjdGlvbkltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25JbXBsQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MsIG9sZENvbm5lY3Rpb25JbXBsQ2xhc3MsIGNvbm5lY3Rpb25JbXBsQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpIHsKLQkJaWYgKGNvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDb25maWdQcm9wZXJ0eS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkltcGxDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzICE9IG51bGwgOiAhTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gY29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmN2RjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBUaGUgY29ubmVjdG9yIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IgbmFtZSwgdmVyc2lvbiwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIHN1cHBvcnRlZCwgaWNvbiAtICBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZW5kb3JOYW1lKCkgPGVtPlZlbmRvciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZW5kb3JOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlbmRvck5hbWUgPSBWRU5ET1JfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY1ZlcnNpb24oKSA8ZW0+U3BlYyBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcGVjVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ19WRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3BlY1ZlcnNpb24gPSBTUEVDX1ZFUlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVpc1R5cGUoKSA8ZW0+RWlzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVpc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVJU19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWlzVHlwZSA9IEVJU19UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTGljZW5zZSBsaWNlbnNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbm5lY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5DT05ORUNUT1I7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQkgKiBFeGFtcGxlOiBXb21iYXQgQ29ycC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiB2ZW5kb3JOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlbmRvck5hbWUoU3RyaW5nIG5ld1ZlbmRvck5hbWUpIHsKLQkJU3RyaW5nIG9sZFZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOwotCQl2ZW5kb3JOYW1lID0gbmV3VmVuZG9yTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FLCBvbGRWZW5kb3JOYW1lLCB2ZW5kb3JOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZSBhZGFwdGVyIHRvIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjVmVyc2lvbigpIHsKLQkJcmV0dXJuIHNwZWNWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWNWZXJzaW9uKFN0cmluZyBuZXdTcGVjVmVyc2lvbikgewotCQlTdHJpbmcgb2xkU3BlY1ZlcnNpb24gPSBzcGVjVmVyc2lvbjsKLQkJc3BlY1ZlcnNpb24gPSBuZXdTcGVjVmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTiwgb2xkU3BlY1ZlcnNpb24sIHNwZWNWZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCSAqIAotCSAqIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGgKLQkgKiB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVpc1R5cGUoKSB7Ci0JCXJldHVybiBlaXNUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVpc1R5cGUoU3RyaW5nIG5ld0Vpc1R5cGUpIHsKLQkJU3RyaW5nIG9sZEVpc1R5cGUgPSBlaXNUeXBlOwotCQllaXNUeXBlID0gbmV3RWlzVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFLCBvbGRFaXNUeXBlLCBlaXNUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4KLQkgKiAKLQkgKiBFeGFtcGxlOiAxLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YKLQkgKiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0JICovCi0JcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpIHsKLQkJcmV0dXJuIGxpY2Vuc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TGljZW5zZShMaWNlbnNlIG5ld0xpY2Vuc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTGljZW5zZSBvbGRMaWNlbnNlID0gbGljZW5zZTsKLQkJbGljZW5zZSA9IG5ld0xpY2Vuc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBvbGRMaWNlbnNlLCBuZXdMaWNlbnNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgbmV3TGljZW5zZSkgewotCQlpZiAobmV3TGljZW5zZSAhPSBsaWNlbnNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxpY2Vuc2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TGljZW5zZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMaWNlbnNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TGljZW5zZShuZXdMaWNlbnNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBuZXdMaWNlbnNlLCBuZXdMaWNlbnNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlciBnZXRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciBuZXdSZXNvdXJjZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVzb3VyY2VBZGFwdGVyIG9sZFJlc291cmNlQWRhcHRlciA9IHJlc291cmNlQWRhcHRlcjsKLQkJcmVzb3VyY2VBZGFwdGVyID0gbmV3UmVzb3VyY2VBZGFwdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiwgb2xkUmVzb3VyY2VBZGFwdGVyLCBuZXdSZXNvdXJjZUFkYXB0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgbmV3UmVzb3VyY2VBZGFwdGVyKSB7Ci0JCWlmIChuZXdSZXNvdXJjZUFkYXB0ZXIgIT0gcmVzb3VyY2VBZGFwdGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Jlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXNvdXJjZUFkYXB0ZXIobmV3UmVzb3VyY2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSLCBuZXdSZXNvdXJjZUFkYXB0ZXIsIG5ld1Jlc291cmNlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TGljZW5zZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVzb3VyY2VBZGFwdGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKLQkJCQlyZXR1cm4gZ2V0VmVuZG9yTmFtZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRTcGVjVmVyc2lvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVpc1R5cGUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6Ci0JCQkJcmV0dXJuIGdldExpY2Vuc2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKLQkJCQlzZXRWZW5kb3JOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTjoKLQkJCQlzZXRTcGVjVmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRToKLQkJCQlzZXRFaXNUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFOgotCQkJCXNldExpY2Vuc2UoKExpY2Vuc2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0UmVzb3VyY2VBZGFwdGVyKChSZXNvdXJjZUFkYXB0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKLQkJCQlzZXRWZW5kb3JOYW1lKFZFTkRPUl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT046Ci0JCQkJc2V0U3BlY1ZlcnNpb24oU1BFQ19WRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRToKLQkJCQlzZXRFaXNUeXBlKEVJU19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlzZXRMaWNlbnNlKChMaWNlbnNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0UmVzb3VyY2VBZGFwdGVyKChSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKLQkJCQlyZXR1cm4gVkVORE9SX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHZlbmRvck5hbWUgIT0gbnVsbCA6ICFWRU5ET1JfTkFNRV9FREVGQVVMVC5lcXVhbHModmVuZG9yTmFtZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFNQRUNfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gc3BlY1ZlcnNpb24gIT0gbnVsbCA6ICFTUEVDX1ZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHNwZWNWZXJzaW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgotCQkJCXJldHVybiBFSVNfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWlzVHlwZSAhPSBudWxsIDogIUVJU19UWVBFX0VERUZBVUxULmVxdWFscyhlaXNUeXBlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6Ci0JCQkJcmV0dXJuIGxpY2Vuc2UgIT0gbnVsbDsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIHJlc291cmNlQWRhcHRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVuZG9yTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVuZG9yTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3BlY1ZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNwZWNWZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlaXNUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlaXNUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzZDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wLCAiY29ubmVjdG9yXzFfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCwgImNvbm5lY3Rvcl8xLjAuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV9MT0NfMV81LCAiY29ubmVjdG9yXzFfNS54c2QiKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0JCi0KLQkgCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbm5lY3RvclJlc291cmNlRmFjdG9yeS4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLSAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvclJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5SQVJfU0hPUlRfTkFNRSwgbmV3IENvbm5lY3RvclJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuUkFSX1NIT1JUX05BTUUsIG5ldyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUklfT0JKKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzhkNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3IuQ29ubmVjdG9yVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBDb25uZWN0b3JSZXNvdXJjZXsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC4KLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsLgotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCi0JCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gUkFSX1RZUEU7Ci0JfQotCi0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9BTFRfU1lTVEVNSURfMV8wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0FMVF9TWVNURU1JRF8xXzA7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIFRoaXMgaXMgc2V0dGluZyB0aGUgbW9kdWxlIHZlcnNpb24gb24gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaW50IHZlcnNpb24gPSBKQ0FfMV81X0lEOwotCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgCi0JCQl2ZXJzaW9uID0gSkNBXzFfNV9JRDsKLQkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpKQotCQkJdmVyc2lvbiA9IEpDQV8xXzBfSUQ7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKHZlcnNpb24pOwotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoSkNBXzFfNV9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChKQ0FfMV8wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCQkvKgotCQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3dpdGNoIChpZCkgewotCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV81X0lEKTsKLQkJCQkJCWJyZWFrOwotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV8wX0lEKTsKLQkJCQkJCWJyZWFrOwotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV8wX0lEKTsKLQkJCQl9Ci0JCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCQl9Ci0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDb25uZWN0b3JUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV82X0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIEpDQV8xXzVfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCUNvbm5lY3RvciBjb25uID0gZ2V0Q29ubmVjdG9yKCk7Ci0JCWlmIChjb25uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVN0cmluZyB2ZXJzaW9uID0gY29ubi5nZXRTcGVjVmVyc2lvbigpOwotCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKTsKLQkJaWYgKCFuZXdWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKLQkJCWNvbm4uc2V0U3BlY1ZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwZjA5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldE1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VBZGFwdGVyKCkgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlciBtZXNzYWdlQWRhcHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUFkYXB0ZXIgZ2V0TWVzc2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBtZXNzYWdlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBuZXdNZXNzYWdlQWRhcHRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNZXNzYWdlQWRhcHRlciBvbGRNZXNzYWdlQWRhcHRlciA9IG1lc3NhZ2VBZGFwdGVyOwotCQltZXNzYWdlQWRhcHRlciA9IG5ld01lc3NhZ2VBZGFwdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSLCBvbGRNZXNzYWdlQWRhcHRlciwgbmV3TWVzc2FnZUFkYXB0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VBZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIG5ld01lc3NhZ2VBZGFwdGVyKSB7Ci0JCWlmIChuZXdNZXNzYWdlQWRhcHRlciAhPSBtZXNzYWdlQWRhcHRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWVzc2FnZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZUFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdNZXNzYWdlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNZXNzYWdlQWRhcHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWVzc2FnZUFkYXB0ZXIobmV3TWVzc2FnZUFkYXB0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiwgbmV3TWVzc2FnZUFkYXB0ZXIsIG5ld01lc3NhZ2VBZGFwdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE1lc3NhZ2VBZGFwdGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKLQkJCQlzZXRNZXNzYWdlQWRhcHRlcigoTWVzc2FnZUFkYXB0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6Ci0JCQkJc2V0TWVzc2FnZUFkYXB0ZXIoKE1lc3NhZ2VBZGFwdGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgotCQkJCXJldHVybiBtZXNzYWdlQWRhcHRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZGIyOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmNhRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKY2FGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYUZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUpjYUZhY3RvcnkgdGhlSmNhRmFjdG9yeSA9IChKY2FGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqY2EueG1pIik7IAotCQkJaWYgKHRoZUpjYUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKY2FGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpjYUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHVibGljIEpjYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUjogcmV0dXJuIGNyZWF0ZUNvbm5lY3RvcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVI6IHJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU006IHJldHVybiBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTjogcmV0dXJuIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0U6IHJldHVybiBjcmVhdGVMaWNlbnNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOiByZXR1cm4gY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6IHJldHVybiBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OOiByZXR1cm4gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1Q6IHJldHVybiBjcmVhdGVBZG1pbk9iamVjdCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVI6IHJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUM6IHJldHVybiBjcmVhdGVBY3RpdmF0aW9uU3BlYygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFOiByZXR1cm4gY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25TdXBwb3J0S2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0S2luZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcigpIHsKLQkJQ29ubmVjdG9ySW1wbCBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9ySW1wbCgpOwotCQlyZXR1cm4gY29ubmVjdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMaWNlbnNlIGNyZWF0ZUxpY2Vuc2UoKSB7Ci0JCUxpY2Vuc2VJbXBsIGxpY2Vuc2UgPSBuZXcgTGljZW5zZUltcGwoKTsKLQkJcmV0dXJuIGxpY2Vuc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IG5ldyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpOwotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCBvdXRib3VuZFJlc291cmNlQWRhcHRlciA9IG5ldyBPdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwoKTsKLQkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpIHsKLQkJTWVzc2FnZUFkYXB0ZXJJbXBsIG1lc3NhZ2VBZGFwdGVyID0gbmV3IE1lc3NhZ2VBZGFwdGVySW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25EZWZpbml0aW9uIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCkgewotCQlDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwgY29ubmVjdGlvbkRlZmluaXRpb24gPSBuZXcgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRtaW5PYmplY3QgY3JlYXRlQWRtaW5PYmplY3QoKSB7Ci0JCUFkbWluT2JqZWN0SW1wbCBhZG1pbk9iamVjdCA9IG5ldyBBZG1pbk9iamVjdEltcGwoKTsKLQkJcmV0dXJuIGFkbWluT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlTGlzdGVuZXIgY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCkgewotCQlNZXNzYWdlTGlzdGVuZXJJbXBsIG1lc3NhZ2VMaXN0ZW5lciA9IG5ldyBNZXNzYWdlTGlzdGVuZXJJbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25TcGVjIGNyZWF0ZUFjdGl2YXRpb25TcGVjKCkgewotCQlBY3RpdmF0aW9uU3BlY0ltcGwgYWN0aXZhdGlvblNwZWMgPSBuZXcgQWN0aXZhdGlvblNwZWNJbXBsKCk7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSB7Ci0JCVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSA9IG5ldyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwoKTsKLQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSByZXN1bHQgPSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGNyZWF0ZVRyYW5zYWN0aW9uU3VwcG9ydEtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCByZXN1bHQgPSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvblN1cHBvcnRLaW5kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCVJlc291cmNlQWRhcHRlckltcGwgcmVzb3VyY2VBZGFwdGVyID0gbmV3IFJlc291cmNlQWRhcHRlckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlQZXJtaXNzaW9uIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpIHsKLQkJU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCBzZWN1cml0eVBlcm1pc3Npb24gPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCgpOwotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc207Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbmZpZ1Byb3BlcnR5IGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkgewotCQlDb25maWdQcm9wZXJ0eUltcGwgY29uZmlnUHJvcGVydHkgPSBuZXcgQ29uZmlnUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmNhUGFja2FnZSBnZXRKY2FQYWNrYWdlKCkgewotCQlyZXR1cm4gKEpjYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDE2NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIEpjYVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmNhUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbm5lY3RvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uZmlnUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpY2Vuc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlQWRhcHRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhZG1pbk9iamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlTGlzdGVuZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZhdGlvblNwZWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEpjYVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBKY2FGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKY2FQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSmNhUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUpjYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUpjYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBjb25uZWN0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfRWlzVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaWNlbnNlKCkgewotCQlyZXR1cm4gbGljZW5zZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpY2Vuc2VfUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaWNlbnNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGljZW5zZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaWNlbnNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VBZGFwdGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFkbWluT2JqZWN0KCkgewotCQlyZXR1cm4gYWRtaW5PYmplY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3RpdmF0aW9uU3BlYygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3RpdmF0aW9uU3BlY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFjdGl2YXRpb25TcGVjRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5UGVybWlzc2lvbigpIHsKLQkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uZmlnUHJvcGVydHkoKSB7Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKY2FGYWN0b3J5IGdldEpjYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmNhRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQljb25uZWN0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fVkVORE9SX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19FSVNfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19MSUNFTlNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUik7Ci0KLQkJcmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX0FEQVBURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMpOwotCi0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUyk7Ci0KLQkJY29uZmlnUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09ORklHX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25maWdQcm9wZXJ0eUVDbGFzcywgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fVkFMVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1BFUk1JU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMpOwotCi0JCWxpY2Vuc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTElDRU5TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGljZW5zZUVDbGFzcywgTElDRU5TRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGxpY2Vuc2VFQ2xhc3MsIExJQ0VOU0VfX1JFUVVJUkVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaWNlbnNlRUNsYXNzLCBMSUNFTlNFX19ERVNDUklQVElPTlMpOwotCi0JCWluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUik7Ci0KLQkJb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyk7Ci0KLQkJbWVzc2FnZUFkYXB0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9BREFQVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlQWRhcHRlckVDbGFzcywgTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUyk7Ci0KLQkJY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVElPTl9ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTKTsKLQotCQlhZG1pbk9iamVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBRE1JTl9PQkpFQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGFkbWluT2JqZWN0RUNsYXNzLCBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGFkbWluT2JqZWN0RUNsYXNzLCBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWRtaW5PYmplY3RFQ2xhc3MsIEFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMpOwotCi0JCW1lc3NhZ2VMaXN0ZW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVNTQUdFX0xJU1RFTkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlTGlzdGVuZXJFQ2xhc3MsIE1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUxpc3RlbmVyRUNsYXNzLCBNRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMpOwotCi0JCWFjdGl2YXRpb25TcGVjRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWQVRJT05fU1BFQyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZhdGlvblNwZWNFQ2xhc3MsIEFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3RpdmF0aW9uU3BlY0VDbGFzcywgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyk7Ci0KLQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MsIFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFKTsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNvbm5lY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxpY2Vuc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlTGlzdGVuZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGNvbm5lY3RvckVDbGFzcywgQ29ubmVjdG9yLmNsYXNzLCAiQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVuZG9yTmFtZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzcGVjVmVyc2lvbiIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVpc1R5cGUiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JfTGljZW5zZSgpLCB0aGlzLmdldExpY2Vuc2UoKSwgbnVsbCwgImxpY2Vuc2UiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRSZXNvdXJjZUFkYXB0ZXIoKSwgbnVsbCwgInJlc291cmNlQWRhcHRlciIsIG51bGwsIDEsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlc291cmNlQWRhcHRlckVDbGFzcywgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkludGVyZmFjZSIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCksICJ0cmFuc2FjdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZUFkYXB0ZXJDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSwgdGhpcy5nZXRTZWN1cml0eVBlcm1pc3Npb24oKSwgbnVsbCwgInNlY3VyaXR5UGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgbnVsbCwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAib3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIHRoaXMuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAiaW5ib3VuZFJlc291cmNlQWRhcHRlciIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpLCB0aGlzLmdldEFkbWluT2JqZWN0KCksIG51bGwsICJhZG1pbk9iamVjdHMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAiQXV0aGVudGljYXRpb25NZWNoYW5pc20iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc20iLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjcmVkZW50aWFsSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0N1c3RvbUF1dGhNZWNoVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3VzdG9tQXV0aE1lY2hUeXBlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICJTZWN1cml0eVBlcm1pc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzcGVjaWZpY2F0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsaWNlbnNlRUNsYXNzLCBMaWNlbnNlLmNsYXNzLCAiTGljZW5zZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaWNlbnNlX1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSwgdGhpcy5nZXRNZXNzYWdlQWRhcHRlcigpLCBudWxsLCAibWVzc2FnZUFkYXB0ZXIiLCBudWxsLCAwLCAxLCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCksICJ0cmFuc2FjdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSwgdGhpcy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpLCBudWxsLCAiY29ubmVjdGlvbkRlZmluaXRpb25zIiwgbnVsbCwgMCwgLTEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgdGhpcy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBudWxsLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIiwgbnVsbCwgMCwgLTEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAiTWVzc2FnZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSwgdGhpcy5nZXRNZXNzYWdlTGlzdGVuZXIoKSwgbnVsbCwgIm1lc3NhZ2VMaXN0ZW5lcnMiLCBudWxsLCAxLCAtMSwgTWVzc2FnZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICJDb25uZWN0aW9uRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkludGVyZmFjZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFkbWluT2JqZWN0RUNsYXNzLCBBZG1pbk9iamVjdC5jbGFzcywgIkFkbWluT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWRtaW5PYmplY3RJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWRtaW5PYmplY3RDbGFzcyIsIG51bGwsIDAsIDEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlTGlzdGVuZXJFQ2xhc3MsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIk1lc3NhZ2VMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2VMaXN0ZW5lclR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpLCB0aGlzLmdldEFjdGl2YXRpb25TcGVjKCksIG51bGwsICJhY3RpdmF0aW9uU3BlYyIsIG51bGwsIDEsIDEsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBY3RpdmF0aW9uU3BlYy5jbGFzcywgIkFjdGl2YXRpb25TcGVjIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhY3RpdmF0aW9uU3BlY0NsYXNzIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCksIG51bGwsICJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcywgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICJSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmNsYXNzLCAiQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLkJBU0lDX1BBU1NXT1JEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5LRVJCVjVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5jbGFzcywgIlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5OT19UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5MT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5YQV9UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3VzdG9tQXV0aE1lY2hUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotfSAvL0pjYVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9MaWNlbnNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTGljZW5zZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNDMzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9MaWNlbnNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBTcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExpY2Vuc2UgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVRVUlSRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTGljZW5zZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5MSUNFTlNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIG5ld1JlcXVpcmVkKSB7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZEVTZXQgPSByZXF1aXJlZEVTZXQ7Ci0JCXJlcXVpcmVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQsIG9sZFJlcXVpcmVkLCByZXF1aXJlZCwgIW9sZFJlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVxdWlyZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZEVTZXQgPSByZXF1aXJlZEVTZXQ7Ci0JCXJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCXJlcXVpcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQsIG9sZFJlcXVpcmVkLCBSRVFVSVJFRF9FREVGQVVMVCwgb2xkUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRDoKLQkJCQl1bnNldFJlcXVpcmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1NldFJlcXVpcmVkKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVxdWlyZWQ6ICIpOwotCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyYmEyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwjZ2V0TWVzc2FnZUxpc3RlbmVycyA8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlQWRhcHRlciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZUxpc3RlbmVycygpIDxlbT5NZXNzYWdlIExpc3RlbmVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZUxpc3RlbmVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0FEQVBURVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChtZXNzYWdlTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VMaXN0ZW5lcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZUxpc3RlbmVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCWdldE1lc3NhZ2VMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQlnZXRNZXNzYWdlTGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCXJldHVybiBtZXNzYWdlTGlzdGVuZXJzICE9IG51bGwgJiYgIW1lc3NhZ2VMaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9NZXNzYWdlQWRhcHRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2YmQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlIDxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwjZ2V0QWN0aXZhdGlvblNwZWMgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0ZW5lckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9MSVNURU5FUl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VMaXN0ZW5lclR5cGUgPSBNRVNTQUdFX0xJU1RFTkVSX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uU3BlYygpIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvblNwZWMgYWN0aXZhdGlvblNwZWMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VMaXN0ZW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfTElTVEVORVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTGlzdGVuZXJUeXBlKFN0cmluZyBuZXdNZXNzYWdlTGlzdGVuZXJUeXBlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlTGlzdGVuZXJUeXBlID0gbWVzc2FnZUxpc3RlbmVyVHlwZTsKLQkJbWVzc2FnZUxpc3RlbmVyVHlwZSA9IG5ld01lc3NhZ2VMaXN0ZW5lclR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFLCBvbGRNZXNzYWdlTGlzdGVuZXJUeXBlLCBtZXNzYWdlTGlzdGVuZXJUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25TcGVjIGdldEFjdGl2YXRpb25TcGVjKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvblNwZWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMgbmV3QWN0aXZhdGlvblNwZWMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZhdGlvblNwZWMgb2xkQWN0aXZhdGlvblNwZWMgPSBhY3RpdmF0aW9uU3BlYzsKLQkJYWN0aXZhdGlvblNwZWMgPSBuZXdBY3RpdmF0aW9uU3BlYzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMsIG9sZEFjdGl2YXRpb25TcGVjLCBuZXdBY3RpdmF0aW9uU3BlYyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMgbmV3QWN0aXZhdGlvblNwZWMpIHsKLQkJaWYgKG5ld0FjdGl2YXRpb25TcGVjICE9IGFjdGl2YXRpb25TcGVjKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY3RpdmF0aW9uU3BlYyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY3RpdmF0aW9uU3BlYykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY3RpdmF0aW9uU3BlYyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY3RpdmF0aW9uU3BlYykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjdGl2YXRpb25TcGVjKG5ld0FjdGl2YXRpb25TcGVjLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDLCBuZXdBY3RpdmF0aW9uU3BlYywgbmV3QWN0aXZhdGlvblNwZWMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXJldHVybiBiYXNpY1NldEFjdGl2YXRpb25TcGVjKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uU3BlYygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlzZXRBY3RpdmF0aW9uU3BlYygoQWN0aXZhdGlvblNwZWMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoTUVTU0FHRV9MSVNURU5FUl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXNldEFjdGl2YXRpb25TcGVjKChBY3RpdmF0aW9uU3BlYyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZUxpc3RlbmVyVHlwZSAhPSBudWxsIDogIU1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZUxpc3RlbmVyVHlwZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXJldHVybiBhY3RpdmF0aW9uU3BlYyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZUxpc3RlbmVyVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZUxpc3RlbmVyVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VMaXN0ZW5lckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjk0MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpIDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUID0gVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5OT19UUkFOU0FDVElPTl9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgdHJhbnNhY3Rpb25TdXBwb3J0ID0gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb24gU3VwcG9ydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29ubmVjdGlvbkRlZmluaXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuIG5ld1JlYXV0aGVudGljYXRpb25TdXBwb3J0KSB7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSBuZXdSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgcmVhdXRoZW50aWNhdGlvblN1cHBvcnQsICFvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0LCBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG5ld1RyYW5zYWN0aW9uU3VwcG9ydCkgewotCQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCA9IHRyYW5zYWN0aW9uU3VwcG9ydDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0ID0gbmV3VHJhbnNhY3Rpb25TdXBwb3J0ID09IG51bGwgPyBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCQl0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JULCBvbGRUcmFuc2FjdGlvblN1cHBvcnQsIHRyYW5zYWN0aW9uU3VwcG9ydCwgIW9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvbGRUcmFuc2FjdGlvblN1cHBvcnQgPSB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCwgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAoY29ubmVjdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKLQkJCWNvbm5lY3Rpb25EZWZpbml0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TKTsKLQkJfQotCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSB7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPT0gbnVsbCkgewotCQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMpOwotCQl9Ci0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXNldFRyYW5zYWN0aW9uU3VwcG9ydCgoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQl1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUzoKLQkJCQlnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgotCQkJCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbnMgIT0gbnVsbCAmJiAhY29ubmVjdGlvbkRlZmluaXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgIT0gbnVsbCAmJiAhYXV0aGVudGljYXRpb25NZWNoYW5pc21zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uU3VwcG9ydDogIik7Ci0JCWlmICh0cmFuc2FjdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlN2RjNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDkwNDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZDsKLQotCi0vKioKLSAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzcy8vaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvciBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbAotICogcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0gKiAKLSAqIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICogcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLSAqIHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydAotICogb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkKLSAqIHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBZGFwdGVySW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW50ZXJmYWNlID0gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW1wbENsYXNzID0gQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA9IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUFkYXB0ZXJDbGFzcyA9IFJFU09VUkNFX0FEQVBURVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlQZXJtaXNzaW9ucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmZpZ1Byb3BlcnRpZXMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RzKCkgPGVtPkFkbWluIE9iamVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWRtaW5PYmplY3RzID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfQURBUFRFUjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKFN0cmluZyBuZXdNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcykgewotCQlTdHJpbmcgb2xkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPSBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczsKLQkJbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPSBuZXdNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUywgb2xkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MsIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSwgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UsIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyhTdHJpbmcgbmV3Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzID0gY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M7Ci0JCWNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzID0gbmV3Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MsIG9sZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkludGVyZmFjZSA9IGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25JbnRlcmZhY2UgPSBuZXdDb25uZWN0aW9uSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uSW50ZXJmYWNlLCBjb25uZWN0aW9uSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25JbXBsQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgbmV3Q29ubmVjdGlvbkltcGxDbGFzcykgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkltcGxDbGFzcyA9IGNvbm5lY3Rpb25JbXBsQ2xhc3M7Ci0JCWNvbm5lY3Rpb25JbXBsQ2xhc3MgPSBuZXdDb25uZWN0aW9uSW1wbENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUywgb2xkQ29ubmVjdGlvbkltcGxDbGFzcywgY29ubmVjdGlvbkltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiB0cmFuc2FjdGlvbgotCSAqIHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0JICogVGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uLXN1cHBvcnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgKiAgIE5vVHJhbnNhY3Rpb24KLQkgKiAgIExvY2FsVHJhbnNhY3Rpb24KLQkgKiAgIFhBVHJhbnNhY3Rpb24KLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgbmV3VHJhbnNhY3Rpb25TdXBwb3J0KSB7Ci0JCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgb2xkVHJhbnNhY3Rpb25TdXBwb3J0ID0gdHJhbnNhY3Rpb25TdXBwb3J0OwotCQl0cmFuc2FjdGlvblN1cHBvcnQgPSBuZXdUcmFuc2FjdGlvblN1cHBvcnQgPT0gbnVsbCA/IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQgOiBuZXdUcmFuc2FjdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCwgdHJhbnNhY3Rpb25TdXBwb3J0LCAhb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCA9IHRyYW5zYWN0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0ID0gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0LCBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbiBuZXdSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCkgewotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gbmV3UmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQsIHJlYXV0aGVudGljYXRpb25TdXBwb3J0LCAhb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiByZXNvdXJjZUFkYXB0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhTdHJpbmcgbmV3UmVzb3VyY2VBZGFwdGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZFJlc291cmNlQWRhcHRlckNsYXNzID0gcmVzb3VyY2VBZGFwdGVyQ2xhc3M7Ci0JCXJlc291cmNlQWRhcHRlckNsYXNzID0gbmV3UmVzb3VyY2VBZGFwdGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUywgb2xkUmVzb3VyY2VBZGFwdGVyQ2xhc3MsIHJlc291cmNlQWRhcHRlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5UGVybWlzc2lvbnMoKSB7Ci0JCWlmIChzZWN1cml0eVBlcm1pc3Npb25zID09IG51bGwpIHsKLQkJCXNlY3VyaXR5UGVybWlzc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgewotCQlpZiAoYXV0aGVudGljYXRpb25NZWNoYW5pc21zID09IG51bGwpIHsKLQkJCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TKTsKLQkJfQotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoY29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQljb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlPdXRib3VuZFJlc291cmNlQWRhcHRlciBvbGRPdXRib3VuZFJlc291cmNlQWRhcHRlciA9IG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCQlvdXRib3VuZFJlc291cmNlQWRhcHRlciA9IG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG9sZE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLCBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJaWYgKG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvdXRib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvdXRib3VuZFJlc291cmNlQWRhcHRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIobmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSLCBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlciwgbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5ib3VuZFJlc291cmNlQWRhcHRlciBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9sZEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG9sZEluYm91bmRSZXNvdXJjZUFkYXB0ZXIsIG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoSW5ib3VuZFJlc291cmNlQWRhcHRlciBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKSB7Ci0JCWlmIChuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IGluYm91bmRSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5ib3VuZFJlc291cmNlQWRhcHRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIsIG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWRtaW5PYmplY3RzKCkgewotCQlpZiAoYWRtaW5PYmplY3RzID09IG51bGwpIHsKLQkJCWFkbWluT2JqZWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBZG1pbk9iamVjdC5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTKTsKLQkJfQotCQlyZXR1cm4gYWRtaW5PYmplY3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5UGVybWlzc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uZmlnUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QWRtaW5PYmplY3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXJldHVybiBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25JbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTOgotCQkJCXJldHVybiBnZXRBZG1pbk9iamVjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXNldENvbm5lY3Rpb25JbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJc2V0VHJhbnNhY3Rpb25TdXBwb3J0KChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTOgotCQkJCXNldFJlc291cmNlQWRhcHRlckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUzoKLQkJCQlnZXRTZWN1cml0eVBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVBlcm1pc3Npb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5jbGVhcigpOwotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKChPdXRib3VuZFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUzoKLQkJCQlnZXRBZG1pbk9iamVjdHMoKS5jbGVhcigpOwotCQkJCWdldEFkbWluT2JqZWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTOgotCQkJCXNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKENPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZShDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhSRVNPVVJDRV9BREFQVEVSX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigoSW5ib3VuZFJlc291cmNlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUzoKLQkJCQlnZXRBZG1pbk9iamVjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXJldHVybiBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgIT0gbnVsbCA6ICFNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVC5lcXVhbHMobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkludGVyZmFjZSAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uSW50ZXJmYWNlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTOgotCQkJCXJldHVybiBSRVNPVVJDRV9BREFQVEVSX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZUFkYXB0ZXJDbGFzcyAhPSBudWxsIDogIVJFU09VUkNFX0FEQVBURVJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlQWRhcHRlckNsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9ucyAhPSBudWxsICYmICFzZWN1cml0eVBlcm1pc3Npb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgIT0gbnVsbCAmJiAhYXV0aGVudGljYXRpb25NZWNoYW5pc21zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gY29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJcmV0dXJuIGFkbWluT2JqZWN0cyAhPSBudWxsICYmICFhZG1pbk9iamVjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ6ICIpOwotCQlpZiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlYXV0aGVudGljYXRpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VBZGFwdGVyQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlQWRhcHRlckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVBlcm1pc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVBlcm1pc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmRkMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0vKioKLSAqIFNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlciBjb2RlLgotICogCi0gKiBUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcmUgb25lcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUgZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvciBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMgcmVhc29uIHRoYXQgcmVzb3VyY2UgYWRhcHRlciByZXF1aXJlcyBhIGdpdmVuIHNlY3VyaXR5IHBlcm1pc3Npb24uCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVBlcm1pc3Npb25JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlQZXJtaXNzaW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWNhdGlvbigpIDxlbT5TcGVjaWZpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcGVjaWZpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWNhdGlvbiA9IFNQRUNJRklDQVRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIFNlY3VyaXR5UGVybWlzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9QRVJNSVNTSU9OOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguIAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gc3BlY2lmaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uKFN0cmluZyBuZXdTcGVjaWZpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjsKLQkJc3BlY2lmaWNhdGlvbiA9IG5ld1NwZWNpZmljYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTiwgb2xkU3BlY2lmaWNhdGlvbiwgc3BlY2lmaWNhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuIGdldFNwZWNpZmljYXRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT046Ci0JCQkJc2V0U3BlY2lmaWNhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTjoKLQkJCQlzZXRTcGVjaWZpY2F0aW9uKFNQRUNJRklDQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiBTUEVDSUZJQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBzcGVjaWZpY2F0aW9uICE9IG51bGwgOiAhU1BFQ0lGSUNBVElPTl9FREVGQVVMVC5lcXVhbHMoc3BlY2lmaWNhdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3BlY2lmaWNhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3BlY2lmaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSkNBRGVzY3JpcHRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pDQURlc2NyaXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmU0ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSkNBRGVzY3JpcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ0FEZXNjcmlwdGlvbkhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKENvbmZpZ1Byb3BlcnR5IHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oQ29uZmlnUHJvcGVydHkgcHJvcGVydHksaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXJldHVybiBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCQkJIEVMaXN0IGxvY2FsaXplZERlc2NyaXB0aW9ucyA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpOwotCQkJCSBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPT0gbnVsbCB8fCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMuc2l6ZSgpID09IDApCi0JCQkJIAlyZXR1cm4gbnVsbDsKLQkJCSAgICAgRGVzY3JpcHRpb24gbG9jYWxpemVkRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbG9jYWxpemVkRGVzY3JpcHRpb25zLmdldCgwKTsKLQkJCSAgICAgaWYobG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCQkgICAgfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU2VjdXJpdHlQZXJtaXNzaW9uIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oU2VjdXJpdHlQZXJtaXNzaW9uIHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKExpY2Vuc2UgcHJvcGVydHksIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXByb3BlcnR5LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJICAgIAlicmVhazsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShkZXNjcmlwdGlvbik7Ci0JCQkJcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkJICAgIH0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihMaWNlbnNlIHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oQXV0aGVudGljYXRpb25NZWNoYW5pc20gcHJvcGVydHksaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXJldHVybiBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCQkJIEVMaXN0IGxvY2FsaXplZERlc2NyaXB0aW9ucyA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpOwotCQkJCSBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPT0gbnVsbCB8fCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMuc2l6ZSgpID09IDApCi0JCQkJIAlyZXR1cm4gbnVsbDsKLQkJCSAgICAgRGVzY3JpcHRpb24gbG9jYWxpemVkRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbG9jYWxpemVkRGVzY3JpcHRpb25zLmdldCgwKTsKLQkJCSAgICAgaWYobG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCQkgICAgfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgcHJvcGVydHksIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGpjYVZlcnNpb25JRCkgewotCQlpZihqY2FWZXJzaW9uSUQgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCkgewotCSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkgICAgfQotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBwcm9wZXJ0eSxpbnQgamNhVmVyc2lvbklEKSB7Ci0JCWlmKGpjYVZlcnNpb25JRCA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0JCQkgRUxpc3QgbG9jYWxpemVkRGVzY3JpcHRpb25zID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJIAlyZXR1cm4gbnVsbDsKLQkJICAgICBEZXNjcmlwdGlvbiBsb2NhbGl6ZWREZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsb2NhbGl6ZWREZXNjcmlwdGlvbnMuZ2V0KDApOwotCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCSAgICB9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRlMThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBKY2FBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBKY2FQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBKY2FBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoSmNhUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEpjYVN3aXRjaCBzdyA9IG5ldyBKY2FTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3RvcihDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxpY2Vuc2UoTGljZW5zZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVMaWNlbnNlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eVBlcm1pc3Npb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOyAvLyBzdwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpjYVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKY2FTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0aW9uRGVmaW5pdGlvbihDb25uZWN0aW9uRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWRtaW5PYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvblNwZWNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZShSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24gPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciA8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmNhQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSmNhU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDJmZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSmNhU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmNhUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpjYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUjogewotCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSAoQ29ubmVjdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChjb25uZWN0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoY29ubmVjdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb25uZWN0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSOiB7Ci0JCQkJUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IChSZXNvdXJjZUFkYXB0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlQWRhcHRlcihyZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJlc291cmNlQWRhcHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTTogewotCQkJCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFk6IHsKLQkJCQlDb25maWdQcm9wZXJ0eSBjb25maWdQcm9wZXJ0eSA9IChDb25maWdQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29uZmlnUHJvcGVydHkoY29uZmlnUHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTjogewotCQkJCVNlY3VyaXR5UGVybWlzc2lvbiBzZWN1cml0eVBlcm1pc3Npb24gPSAoU2VjdXJpdHlQZXJtaXNzaW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oc2VjdXJpdHlQZXJtaXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZWN1cml0eVBlcm1pc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFOiB7Ci0JCQkJTGljZW5zZSBsaWNlbnNlID0gKExpY2Vuc2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpY2Vuc2UobGljZW5zZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobGljZW5zZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogewotCQkJCUluYm91bmRSZXNvdXJjZUFkYXB0ZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKGluYm91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGluYm91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOiB7Ci0JCQkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChvdXRib3VuZFJlc291cmNlQWRhcHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUjogewotCQkJCU1lc3NhZ2VBZGFwdGVyIG1lc3NhZ2VBZGFwdGVyID0gKE1lc3NhZ2VBZGFwdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlQWRhcHRlcihtZXNzYWdlQWRhcHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWVzc2FnZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT046IHsKLQkJCQlDb25uZWN0aW9uRGVmaW5pdGlvbiBjb25uZWN0aW9uRGVmaW5pdGlvbiA9IChDb25uZWN0aW9uRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29ubmVjdGlvbkRlZmluaXRpb24oY29ubmVjdGlvbkRlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbm5lY3Rpb25EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUOiB7Ci0JCQkJQWRtaW5PYmplY3QgYWRtaW5PYmplY3QgPSAoQWRtaW5PYmplY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFkbWluT2JqZWN0KGFkbWluT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhZG1pbk9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVI6IHsKLQkJCQlNZXNzYWdlTGlzdGVuZXIgbWVzc2FnZUxpc3RlbmVyID0gKE1lc3NhZ2VMaXN0ZW5lcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZUxpc3RlbmVyKG1lc3NhZ2VMaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWVzc2FnZUxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDOiB7Ci0JCQkJQWN0aXZhdGlvblNwZWMgYWN0aXZhdGlvblNwZWMgPSAoQWN0aXZhdGlvblNwZWMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2YXRpb25TcGVjKGFjdGl2YXRpb25TcGVjKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhY3RpdmF0aW9uU3BlYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFOiB7Ci0JCQkJUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgPSAoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3RvcihDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGljZW5zZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaWNlbnNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0aW9uRGVmaW5pdGlvbihDb25uZWN0aW9uRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkbWluIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFkbWluT2JqZWN0KEFkbWluT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KY2FTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4ODk3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgY29ubmVjdG9yIG1vZHVsZSBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYW4gY29ubmVjdG9yIGFwcAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmJiZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLSAqIGluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKLSAqIHR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyNnZXRQcm9wZXJ0eUdyb3VwcyA8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BDb25maWcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQ29uZmlnIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnIExpYnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWcgTGliczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUENvbmZpZ19UYWdMaWJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYWdMaWJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb3BlcnR5R3JvdXBzKCk7Ci0KLX0gLy8gSlNQQ29uZmlnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQUHJvcGVydHlHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUFByb3BlcnR5R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3YWZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQUHJvcGVydHlHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KU1AgUHJvcGVydHkgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mCi0gKiBmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0gKiBBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiBUaGUKLSAqIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLSAqIAotICogLSBDb250cm9sIGVuYWJsaW5nIG9mIEVMIGV2YWx1YXRpb24uIC0gQ29udHJvbCBlbmFibGluZwotICogb2YgU2NyaXB0aW5nIGVsZW1lbnRzLiAtIEluZGljYXRlIHBhZ2VFbmNvZGluZwotICogaW5mb3JtYXRpb24uIC0gSW5kaWNhdGluZyB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AKLSAqIGRvY3VtZW50IC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQUHJvcGVydHlHcm91cCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFVybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsIElnbm9yZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWwgSWdub3JlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMSWdub3JlZAotCSAqIAlwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwKLQkgKiAJdGhlIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViCi0JICogCUFwcGxpY2F0aW9ucyB1c2luZyBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIKLQkgKiAJd2ViLnhtbCwgYW5kIGRpc2FibGVkIG90aGVyd2lzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWwgSWdub3JlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI3Vuc2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICNzZXRFbElnbm9yZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VsSWdub3JlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsSWdub3JlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICNpc0VsSWdub3JlZCgpCi0JICogQHNlZSAjc2V0RWxJZ25vcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFbElnbm9yZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBzZWUgI3NldEVsSWdub3JlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWxJZ25vcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWdlIEVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YKLQkgKiAJdGhlIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gSXQgaXMgYQotCSAqIAl0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50Ci0JICogCWVuY29kaW5ncyBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUKLQkgKiAJcGFnZSBkaXJlY3RpdmUgb2YgYSBKU1AgcGFnZSBhbmQgaW4gYSBKU1AKLQkgKiAJY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBwYWdlLiBJdCBpcwotCSAqIAlhbHNvIGEgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudAotCSAqIAllbmNvZGluZ3MgaW4gdGhlIHByb2xvZyBvZiBhIGRvY3VtZW50IGluIFhNTAotCSAqIAlzeW50YXggYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIAltYXRjaGluZyB0aGUgZG9jdW1lbnQuIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlCi0JICogCXNhbWUgZW5jb2RpbmcgdGhyb3VnaCBtdWxpdHBsZSBtZWNoYW5pc21zLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWdlRW5jb2RpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFnZUVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY3JpcHRpbmcgSW52YWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQotCSAqIAlncm91cCBvZiBKU1AgcGFnZXMuIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcwotCSAqIAllbmFibGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3NldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3NldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNjcmlwdGluZ0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgWE1MPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBYTUw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgKiAJdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0JICogCWFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgKiAJSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90IGJlCi0JICogCUpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyIHByb3BlcnR5Ci0JICogCWdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWE1MPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzWE1MKCkKLQkgKiBAc2VlICN1bnNldElzWE1MKCkKLQkgKiBAc2VlICNzZXRJc1hNTChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0SlNQUHJvcGVydHlHcm91cF9Jc1hNTCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNYTUwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWE1MPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzWE1MKCkKLQkgKiBAc2VlICN1bnNldElzWE1MKCkKLQkgKiBAc2VlICNpc0lzWE1MKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1hNTChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNJc1hNTCA8ZW0+SXMgWE1MPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzWE1MKCkKLQkgKiBAc2VlICNpc0lzWE1MKCkKLQkgKiBAc2VlICNzZXRJc1hNTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNYTUwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNJc1hNTCA8ZW0+SXMgWE1MPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBYTUw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzWE1MKCkKLQkgKiBAc2VlICNpc0lzWE1MKCkKLQkgKiBAc2VlICNzZXRJc1hNTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNYTUwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYQotCSAqIAljb250ZXh0LXJlbGF0aXZlIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8KLQkgKiAJYW4gZWxlbWVudCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBXaGVuIHRoZQotCSAqIAllbGVtZW50IGlzIHByZXNlbnQsIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUKLQkgKiAJYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMgaW4gYW4gaW5jbHVkZQotCSAqIAlkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBKU1AgcGFnZSBpbgotCSAqIAl0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlIENvZGFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlIENvZGFzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAqIAlwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0JICogCVdlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAqIAl0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQKLQkgKiAJKGFzIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgKiAJSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ29kYXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEluY2x1ZGVDb2RhcygpOwotCi19IC8vIEpTUFByb3BlcnR5R3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ0NmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKc3BGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpTUENvbmZpZyBjcmVhdGVKU1BDb25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpTUFByb3BlcnR5R3JvdXAgY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdMaWJSZWZUeXBlIGNyZWF0ZVRhZ0xpYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwUGFja2FnZSBnZXRKc3BQYWNrYWdlKCk7Ci0KLX0gLy9Kc3BGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pzcFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkYTBiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiAvKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKc3BQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImpzcCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJqc3AueG1pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUENvbmZpZ0ltcGwgPGVtPkpTUCBDb25maWc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKU1BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJRyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfX1RBR19MSUJTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KU1AgQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsIElnbm9yZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFnZSBFbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY3JpcHRpbmcgSW52YWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgWE1MPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBQcmVsdWRlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgQ29kYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliUmVmVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldFRhZ0xpYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnIDxlbT5KU1AgQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkpTUCBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKU1BDb25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWcgTGliczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0VGFnTGlicygpCi0JICogQHNlZSAjZ2V0SlNQQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BDb25maWdfVGFnTGlicygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0UHJvcGVydHlHcm91cHMgPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyNnZXRQcm9wZXJ0eUdyb3VwcygpCi0JICogQHNlZSAjZ2V0SlNQQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwIDxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpTUFByb3BlcnR5R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRVcmxQYXR0ZXJuIDxlbT5VcmwgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VXJsIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldFBhZ2VFbmNvZGluZyA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFhNTDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlUHJlbHVkZXMgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlUHJlbHVkZXMoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlIENvZGFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUgPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYWdMaWJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYlVSSSA8ZW0+VGFnbGliIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhZ2xpYiBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkoKQotCSAqIEBzZWUgI2dldFRhZ0xpYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFnTGliUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwRmFjdG9yeSBnZXRKc3BGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsIDxlbT5KU1AgQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpTUENvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKU1BfQ09ORklHID0gZUlOU1RBTkNFLmdldEpTUENvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9DT05GSUdfX1RBR19MSUJTID0gZUlOU1RBTkNFLmdldEpTUENvbmZpZ19UYWdMaWJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUyA9IGVJTlNUQU5DRS5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsIDxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX1BST1BFUlRZX0dST1VQID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWwgSWdub3JlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFnZSBFbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORyA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NyaXB0aW5nIEludmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgWE1MPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwgPSBlSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9Jc1hNTCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBQcmVsdWRlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIENvZGFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMgPSBlSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliUmVmVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRUYWdMaWJSZWZUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBR19MSUJfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkkgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCk7Ci0KLQl9Ci0KLX0gLy9Kc3BQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvVGFnTGliUmVmVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL1RhZ0xpYlJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MzcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvVGFnTGliUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFnIExpYiBSZWYgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIEEgdGFnbGliIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gYSB0YWcKLSAqIGxpYnJhcnkgdGhhdCBpcyB1c2VkIGJ5IGEgSlNQIHBhZ2Ugd2l0aGluIHRoZSBXZWIKLSAqIEFwcGxpY2F0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYlVSSSA8ZW0+VGFnbGliIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0VGFnTGliUmVmVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdMaWJSZWZUeXBlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZ2xpYiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZ2xpYiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0JICogICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQotCSAqICAgICAgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0JICogICAgICAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0JICogICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCi0JICogICAgICAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhZ2xpYlVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJVUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYlVSSSA8ZW0+VGFnbGliIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFnbGliVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJVUkkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24KLQkgKiAgICAgICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkgKiAgICAgICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQotCSAqICAgICAgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhZ2xpYkxvY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhZ2xpYkxvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGFnTGliUmVmVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ0Mzc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUENvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KU1AgQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsI2dldFByb3BlcnR5R3JvdXBzIDxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb25maWdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSlNQQ29uZmlnIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdMaWJzKCkgPGVtPlRhZyBMaWJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ0xpYnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YWdMaWJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5R3JvdXBzKCkgPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0eUdyb3VwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnR5R3JvdXBzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKU1BDb25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5KU1BfQ09ORklHOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdMaWJzKCkgewotCQlpZiAodGFnTGlicyA9PSBudWxsKSB7Ci0JCQl0YWdMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhZ0xpYlJlZlR5cGUuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlMpOwotCQl9Ci0JCXJldHVybiB0YWdMaWJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9wZXJ0eUdyb3VwcygpIHsKLQkJaWYgKHByb3BlcnR5R3JvdXBzID09IG51bGwpIHsKLQkJCXByb3BlcnR5R3JvdXBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlHcm91cHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJvcGVydHlHcm91cHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIGdldFRhZ0xpYnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnR5R3JvdXBzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdMaWJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTOgotCQkJCWdldFByb3BlcnR5R3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0eUdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTOgotCQkJCWdldFByb3BlcnR5R3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gdGFnTGlicyAhPSBudWxsICYmICF0YWdMaWJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJcmV0dXJuIHByb3BlcnR5R3JvdXBzICE9IG51bGwgJiYgIXByb3BlcnR5R3JvdXBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vSlNQQ29uZmlnSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQUHJvcGVydHlHcm91cEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUFByb3BlcnR5R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MjBkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQUHJvcGVydHlHcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIFByb3BlcnR5IEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRVcmxQYXR0ZXJuIDxlbT5VcmwgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsI2dldFBhZ2VFbmNvZGluZyA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwjaXNJc1hNTCA8ZW0+SXMgWE1MPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJbmNsdWRlUHJlbHVkZXMgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsI2dldEluY2x1ZGVDb2RhcyA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFByb3BlcnR5R3JvdXBJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgSlNQUHJvcGVydHlHcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybigpIDxlbT5VcmwgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJsUGF0dGVybiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbElnbm9yZWQoKSA8ZW0+RWwgSWdub3JlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTF9JR05PUkVEX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWxJZ25vcmVkKCkgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbElnbm9yZWQgPSBFTF9JR05PUkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbCBJZ25vcmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbElnbm9yZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFnZUVuY29kaW5nKCkgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9FTkNPRElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWdlRW5jb2RpbmcoKSA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFnZUVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhZ2VFbmNvZGluZyA9IFBBR0VfRU5DT0RJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY3JpcHRpbmdJbnZhbGlkKCkgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTQ1JJUFRJTkdfSU5WQUxJRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjcmlwdGluZ0ludmFsaWQoKSA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NyaXB0aW5nSW52YWxpZCA9IFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTY3JpcHRpbmcgSW52YWxpZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NyaXB0aW5nSW52YWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzWE1MKCkgPGVtPklzIFhNTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1hNTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1hNTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1hNTCgpIDxlbT5JcyBYTUw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNYTUwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MID0gSVNfWE1MX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBYTUwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZVByZWx1ZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVDb2RhcygpIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVDb2RhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVDb2RhcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQUHJvcGVydHlHcm91cEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLkxpdGVyYWxzLkpTUF9QUk9QRVJUWV9HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VXJsUGF0dGVybigpIHsKLQkJaWYgKHVybFBhdHRlcm4gPT0gbnVsbCkgewotCQkJdXJsUGF0dGVybiA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTik7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbElnbm9yZWQoKSB7Ci0JCXJldHVybiBlbElnbm9yZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxJZ25vcmVkKGJvb2xlYW4gbmV3RWxJZ25vcmVkKSB7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkID0gZWxJZ25vcmVkOwotCQllbElnbm9yZWQgPSBuZXdFbElnbm9yZWQ7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkRVNldCA9IGVsSWdub3JlZEVTZXQ7Ci0JCWVsSWdub3JlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCwgb2xkRWxJZ25vcmVkLCBlbElnbm9yZWQsICFvbGRFbElnbm9yZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbElnbm9yZWQoKSB7Ci0JCWJvb2xlYW4gb2xkRWxJZ25vcmVkID0gZWxJZ25vcmVkOwotCQlib29sZWFuIG9sZEVsSWdub3JlZEVTZXQgPSBlbElnbm9yZWRFU2V0OwotCQllbElnbm9yZWQgPSBFTF9JR05PUkVEX0VERUZBVUxUOwotCQllbElnbm9yZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQsIG9sZEVsSWdub3JlZCwgRUxfSUdOT1JFRF9FREVGQVVMVCwgb2xkRWxJZ25vcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWxJZ25vcmVkKCkgewotCQlyZXR1cm4gZWxJZ25vcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIHBhZ2VFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlRW5jb2RpbmcoU3RyaW5nIG5ld1BhZ2VFbmNvZGluZykgewotCQlTdHJpbmcgb2xkUGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nOwotCQlwYWdlRW5jb2RpbmcgPSBuZXdQYWdlRW5jb2Rpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HLCBvbGRQYWdlRW5jb2RpbmcsIHBhZ2VFbmNvZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJcmV0dXJuIHNjcmlwdGluZ0ludmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuIG5ld1NjcmlwdGluZ0ludmFsaWQpIHsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkID0gc2NyaXB0aW5nSW52YWxpZDsKLQkJc2NyaXB0aW5nSW52YWxpZCA9IG5ld1NjcmlwdGluZ0ludmFsaWQ7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQgPSBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQkJc2NyaXB0aW5nSW52YWxpZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQsIG9sZFNjcmlwdGluZ0ludmFsaWQsIHNjcmlwdGluZ0ludmFsaWQsICFvbGRTY3JpcHRpbmdJbnZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkID0gc2NyaXB0aW5nSW52YWxpZDsKLQkJYm9vbGVhbiBvbGRTY3JpcHRpbmdJbnZhbGlkRVNldCA9IHNjcmlwdGluZ0ludmFsaWRFU2V0OwotCQlzY3JpcHRpbmdJbnZhbGlkID0gU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQ7Ci0JCXNjcmlwdGluZ0ludmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElELCBvbGRTY3JpcHRpbmdJbnZhbGlkLCBTQ1JJUFRJTkdfSU5WQUxJRF9FREVGQVVMVCwgb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzWE1MKCkgewotCQlyZXR1cm4gaXNYTUw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNYTUwoYm9vbGVhbiBuZXdJc1hNTCkgewotCQlib29sZWFuIG9sZElzWE1MID0gaXNYTUw7Ci0JCWlzWE1MID0gbmV3SXNYTUw7Ci0JCWJvb2xlYW4gb2xkSXNYTUxFU2V0ID0gaXNYTUxFU2V0OwotCQlpc1hNTEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MLCBvbGRJc1hNTCwgaXNYTUwsICFvbGRJc1hNTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzWE1MKCkgewotCQlib29sZWFuIG9sZElzWE1MID0gaXNYTUw7Ci0JCWJvb2xlYW4gb2xkSXNYTUxFU2V0ID0gaXNYTUxFU2V0OwotCQlpc1hNTCA9IElTX1hNTF9FREVGQVVMVDsKLQkJaXNYTUxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCwgb2xkSXNYTUwsIElTX1hNTF9FREVGQVVMVCwgb2xkSXNYTUxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1hNTCgpIHsKLQkJcmV0dXJuIGlzWE1MRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5jbHVkZVByZWx1ZGVzKCkgewotCQlpZiAoaW5jbHVkZVByZWx1ZGVzID09IG51bGwpIHsKLQkJCWluY2x1ZGVQcmVsdWRlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZVByZWx1ZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbmNsdWRlQ29kYXMoKSB7Ci0JCWlmIChpbmNsdWRlQ29kYXMgPT0gbnVsbCkgewotCQkJaW5jbHVkZUNvZGFzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMpOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlQ29kYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJcmV0dXJuIGlzRWxJZ25vcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlyZXR1cm4gZ2V0UGFnZUVuY29kaW5nKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRDoKLQkJCQlyZXR1cm4gaXNTY3JpcHRpbmdJbnZhbGlkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXJldHVybiBpc0lzWE1MKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZVByZWx1ZGVzKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCXJldHVybiBnZXRJbmNsdWRlQ29kYXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk46Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQlzZXRFbElnbm9yZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlzZXRQYWdlRW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJc2V0U2NyaXB0aW5nSW52YWxpZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJc2V0SXNYTUwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVQcmVsdWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlnZXRJbmNsdWRlQ29kYXMoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVDb2RhcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgotCQkJCWdldFVybFBhdHRlcm4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJdW5zZXRFbElnbm9yZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXNldFBhZ2VFbmNvZGluZyhQQUdFX0VOQ09ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRDoKLQkJCQl1bnNldFNjcmlwdGluZ0ludmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJdW5zZXRJc1hNTCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCWdldEluY2x1ZGVDb2RhcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gdXJsUGF0dGVybiAhPSBudWxsICYmICF1cmxQYXR0ZXJuLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RWxJZ25vcmVkKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXJldHVybiBQQUdFX0VOQ09ESU5HX0VERUZBVUxUID09IG51bGwgPyBwYWdlRW5jb2RpbmcgIT0gbnVsbCA6ICFQQUdFX0VOQ09ESU5HX0VERUZBVUxULmVxdWFscyhwYWdlRW5jb2RpbmcpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXJldHVybiBpc1NldElzWE1MKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTOgotCQkJCXJldHVybiBpbmNsdWRlUHJlbHVkZXMgIT0gbnVsbCAmJiAhaW5jbHVkZVByZWx1ZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJcmV0dXJuIGluY2x1ZGVDb2RhcyAhPSBudWxsICYmICFpbmNsdWRlQ29kYXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWxJZ25vcmVkOiAiKTsKLQkJaWYgKGVsSWdub3JlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZWxJZ25vcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFnZUVuY29kaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWdlRW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjcmlwdGluZ0ludmFsaWQ6ICIpOwotCQlpZiAoc2NyaXB0aW5nSW52YWxpZEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NyaXB0aW5nSW52YWxpZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzWE1MOiAiKTsKLQkJaWYgKGlzWE1MRVNldCkgcmVzdWx0LmFwcGVuZChpc1hNTCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVQcmVsdWRlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5jbHVkZVByZWx1ZGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbmNsdWRlQ29kYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVDb2Rhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0pTUFByb3BlcnR5R3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNWM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEpzcEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpzcEZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUpzcEZhY3RvcnkgdGhlSnNwRmFjdG9yeSA9IChKc3BGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqc3AueG1pIik7IAotCQkJaWYgKHRoZUpzcEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKc3BGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzcEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiByZXR1cm4gY3JlYXRlSlNQQ29uZmlnKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQOiByZXR1cm4gY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEU6IHJldHVybiBjcmVhdGVUYWdMaWJSZWZUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQQ29uZmlnIGNyZWF0ZUpTUENvbmZpZygpIHsKLQkJSlNQQ29uZmlnSW1wbCBqc3BDb25maWcgPSBuZXcgSlNQQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4ganNwQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKU1BQcm9wZXJ0eUdyb3VwIGNyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKSB7Ci0JCUpTUFByb3BlcnR5R3JvdXBJbXBsIGpzcFByb3BlcnR5R3JvdXAgPSBuZXcgSlNQUHJvcGVydHlHcm91cEltcGwoKTsKLQkJcmV0dXJuIGpzcFByb3BlcnR5R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYlJlZlR5cGUgY3JlYXRlVGFnTGliUmVmVHlwZSgpIHsKLQkJVGFnTGliUmVmVHlwZUltcGwgdGFnTGliUmVmVHlwZSA9IG5ldyBUYWdMaWJSZWZUeXBlSW1wbCgpOwotCQlyZXR1cm4gdGFnTGliUmVmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwUGFja2FnZSBnZXRKc3BQYWNrYWdlKCkgewotCQlyZXR1cm4gKEpzcFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnNwUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vSnNwRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDVhZGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKc3BQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqc3BDb25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwUHJvcGVydHlHcm91cEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YWdMaWJSZWZUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKc3BQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSnNwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKc3BQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSnNwUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUpzcFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUpzcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKU1BDb25maWcoKSB7Ci0JCXJldHVybiBqc3BDb25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BDb25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BDb25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFByb3BlcnR5R3JvdXAoKSB7Ci0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9Jc1hNTCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhZ0xpYlJlZlR5cGUoKSB7Ci0JCXJldHVybiB0YWdMaWJSZWZUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliUmVmVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJSZWZUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcEZhY3RvcnkgZ2V0SnNwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChKc3BGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWpzcENvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BDb25maWdFQ2xhc3MsIEpTUF9DT05GSUdfX1RBR19MSUJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BDb25maWdFQ2xhc3MsIEpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUyk7Ci0KLQkJanNwUHJvcGVydHlHcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfUFJPUEVSVFlfR1JPVVApOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMpOwotCi0JCXRhZ0xpYlJlZlR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFHX0xJQl9SRUZfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliUmVmVHlwZUVDbGFzcywgVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliUmVmVHlwZUVDbGFzcywgVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWpzcENvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXRhZ0xpYlJlZlR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGpzcENvbmZpZ0VDbGFzcywgSlNQQ29uZmlnLmNsYXNzLCAiSlNQQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BDb25maWdfVGFnTGlicygpLCB0aGlzLmdldFRhZ0xpYlJlZlR5cGUoKSwgbnVsbCwgInRhZ0xpYnMiLCBudWxsLCAwLCAtMSwgSlNQQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSwgdGhpcy5nZXRKU1BQcm9wZXJ0eUdyb3VwKCksIG51bGwsICJwcm9wZXJ0eUdyb3VwcyIsIG51bGwsIDAsIC0xLCBKU1BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAiSlNQUHJvcGVydHlHcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZWxJZ25vcmVkIiwgInRydWUiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYWdlRW5jb2RpbmciLCBudWxsLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzY3JpcHRpbmdJbnZhbGlkIiwgInRydWUiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1hNTCIsICJmYWxzZSIsIDAsIDEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluY2x1ZGVQcmVsdWRlcyIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YWdMaWJSZWZUeXBlRUNsYXNzLCBUYWdMaWJSZWZUeXBlLmNsYXNzLCAiVGFnTGliUmVmVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ2xpYlVSSSIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZlR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ2xpYkxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vSnNwUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYlJlZlR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGEyNDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYlJlZlR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWIgUmVmIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsI2dldFRhZ2xpYlVSSSA8ZW0+VGFnbGliIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliUmVmVHlwZUltcGwjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZlR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVGFnTGliUmVmVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYlVSSSgpIDxlbT5UYWdsaWIgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliVVJJKCkgPGVtPlRhZ2xpYiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYlVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJVUkkgPSBUQUdMSUJfVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkxvY2F0aW9uKCkgPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJMb2NhdGlvbigpIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhZ2xpYkxvY2F0aW9uID0gVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhZ0xpYlJlZlR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5UQUdfTElCX1JFRl9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliVVJJKCkgewotCQlyZXR1cm4gdGFnbGliVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYlVSSShTdHJpbmcgbmV3VGFnbGliVVJJKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJVUkkgPSB0YWdsaWJVUkk7Ci0JCXRhZ2xpYlVSSSA9IG5ld1RhZ2xpYlVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJLCBvbGRUYWdsaWJVUkksIHRhZ2xpYlVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0YWdsaWJMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgbmV3VGFnbGliTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYkxvY2F0aW9uID0gdGFnbGliTG9jYXRpb247Ci0JCXRhZ2xpYkxvY2F0aW9uID0gbmV3VGFnbGliTG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OLCBvbGRUYWdsaWJMb2NhdGlvbiwgdGFnbGliTG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gZ2V0VGFnbGliVVJJKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRUYWdsaWJMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSToKLQkJCQlzZXRUYWdsaWJVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlzZXRUYWdsaWJMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVVJJKFRBR0xJQl9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBUQUdMSUJfVVJJX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJVUkkgIT0gbnVsbCA6ICFUQUdMSUJfVVJJX0VERUZBVUxULmVxdWFscyh0YWdsaWJVUkkpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlyZXR1cm4gVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJMb2NhdGlvbiAhPSBudWxsIDogIVRBR0xJQl9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHModGFnbGliTG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnbGliVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWdsaWJVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhZ2xpYkxvY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWdsaWJMb2NhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RhZ0xpYlJlZlR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4Mzc5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpzcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKc3BTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSnNwU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQQ29uZmlnKEpTUENvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQUHJvcGVydHlHcm91cChKU1BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKU1BQcm9wZXJ0eUdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmVHlwZShUYWdMaWJSZWZUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYWdMaWJSZWZUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcgPGVtPkpTUCBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BDb25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwIDxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUgPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Kc3BBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2ZTIwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpzcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiB7Ci0JCQkJSlNQQ29uZmlnIGpzcENvbmZpZyA9IChKU1BDb25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUENvbmZpZyhqc3BDb25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGpzcENvbmZpZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUDogewotCQkJCUpTUFByb3BlcnR5R3JvdXAganNwUHJvcGVydHlHcm91cCA9IChKU1BQcm9wZXJ0eUdyb3VwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BQcm9wZXJ0eUdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoanNwUHJvcGVydHlHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoanNwUHJvcGVydHlHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEU6IHsKLQkJCQlUYWdMaWJSZWZUeXBlIHRhZ0xpYlJlZlR5cGUgPSAoVGFnTGliUmVmVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFnTGliUmVmVHlwZSh0YWdMaWJSZWZUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh0YWdMaWJSZWZUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BDb25maWcoSlNQQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQUHJvcGVydHlHcm91cChKU1BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWZUeXBlKFRhZ0xpYlJlZlR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Kc3BTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmYWE4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgSlNQIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGFydGlmYWN0cyBvZiBhIEpTUCBhbmQgVGFnTGliIHJlZgotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvQm9keUNvbnRlbnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvQm9keUNvbnRlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWE0YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEJvZHlDb250ZW50VHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdERVBFTkRFTlQgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpTUCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAyOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNjcmlwdGxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTQ1JJUFRMRVNTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0ic2NyaXB0bGVzcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JJUFRMRVNTID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRhZ2RlcGVuZGVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRhZ2RlcGVuZGVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUdERVBFTkRFTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBUQUdERVBFTkRFTlRfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoVEFHREVQRU5ERU5ULCAidGFnZGVwZW5kZW50IiwgInRhZ2RlcGVuZGVudCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpTUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpTUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKU1AKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBKU1BfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoSlNQLCAiSlNQIiwgIkpTUCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVtcHR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW1wdHk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU1QVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBFTVBUWV9MSVRFUkFMID0gbmV3IEJvZHlDb250ZW50VHlwZShFTVBUWSwgImVtcHR5IiwgImVtcHR5Iik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2NyaXB0bGVzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNjcmlwdGxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0NSSVBUTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlIFNDUklQVExFU1NfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoU0NSSVBUTEVTUywgInNjcmlwdGxlc3MiLCAic2NyaXB0bGVzcyIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEJvZHlDb250ZW50VHlwZVtdIHsKLQkJCVRBR0RFUEVOREVOVF9MSVRFUkFMLAotCQkJSlNQX0xJVEVSQUwsCi0JCQlFTVBUWV9MSVRFUkFMLAotCQkJU0NSSVBUTEVTU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJvZHkgQ29udGVudCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCb2R5Q29udGVudFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlCb2R5Q29udGVudFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvZHlDb250ZW50VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUJvZHlDb250ZW50VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCb2R5Q29udGVudFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFRBR0RFUEVOREVOVDogcmV0dXJuIFRBR0RFUEVOREVOVF9MSVRFUkFMOwotCQkJY2FzZSBKU1A6IHJldHVybiBKU1BfTElURVJBTDsKLQkJCWNhc2UgRU1QVFk6IHJldHVybiBFTVBUWV9MSVRFUkFMOwotCQkJY2FzZSBTQ1JJUFRMRVNTOiByZXR1cm4gU0NSSVBUTEVTU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBCb2R5Q29udGVudFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0JvZHlDb250ZW50VHlwZQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0V4dGVuc2libGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvRXh0ZW5zaWJsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiNjJhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvRXh0ZW5zaWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEV4dGVuc2libGVUeXBlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmxlVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5zaWJsZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9GdW5jdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0Z1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjAxNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0Z1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdW5jdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCi0gKiBmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4KLSAqIAotICogVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLSAqIAotICogZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAqIAotICogZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotICogICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKLSAqIAotICogaWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotICogICAgICAgICAgICAgICAgICAgICBieSB0b29scwotICogCi0gKiBuYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqIAotICogZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uCi0gKiAKLSAqIGZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKLSAqICAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmEKLSAqICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uLgotICogCi0gKiBleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0gKiAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0U2lnbmF0dXJlIDxlbT5TaWduYXR1cmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25DbGFzcyA8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkV4dGVuc2lvbnMgPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEZ1bmN0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZ1bmN0aW9uIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEZ1bmN0aW9uX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpZ25hdHVyZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2lnbmF0dXJlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhIExhbmd1YWdlCi0JICogICAgICAgICBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKLQkgKiAgICAgICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaWduYXR1cmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpZ25hdHVyZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbl9TaWduYXR1cmUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0U2lnbmF0dXJlIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpZ25hdHVyZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4YW1wbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fRXhhbXBsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhhbXBsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb24gQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YQotCSAqICAgICAgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKLQkgKiAgICAgICAgIHRoZSBmdW5jdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEZ1bmN0aW9uQ2xhc3MoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RnVuY3Rpb25DbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GdW5jdGlvbiBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RnVuY3Rpb25DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnVuY3Rpb25DbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb24gRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCk7Ci0KLX0gLy8gRnVuY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBlYjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVNURUQgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUX0JFR0lOID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9FTkQgPSAyOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5FU1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5FU1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNORVNURUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgTkVTVEVEX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShORVNURUQsICJORVNURUQiLCAiTkVTVEVEIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVQgQkVHSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVCBCRUdJTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVF9CRUdJTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBBVF9CRUdJTl9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoQVRfQkVHSU4sICJBVF9CRUdJTiIsICJBVF9CRUdJTiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFUIEVORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFUIEVORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVF9FTkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgQVRfRU5EX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShBVF9FTkQsICJBVF9FTkQiLCAiQVRfRU5EIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZVtdIHsKLQkJCU5FU1RFRF9MSVRFUkFMLAotCQkJQVRfQkVHSU5fTElURVJBTCwKLQkJCUFUX0VORF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBORVNURUQ6IHJldHVybiBORVNURURfTElURVJBTDsKLQkJCWNhc2UgQVRfQkVHSU46IHJldHVybiBBVF9CRUdJTl9MSVRFUkFMOwotCQkJY2FzZSBBVF9FTkQ6IHJldHVybiBBVF9FTkRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2E3NmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotCi0KLS8qKgotICogVGhlIHRhZyBlbGVtZW50IGRlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkuIFRoZSB0YWcgZWxlbWVudCBoYXMgb25lIGF0dHJpYnV0ZSwgaWQuCi0gKiBUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLSAqIG5hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotICogdGFnLWNsYXNzIC0tIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotICogdGVpLWNsYXNzIC0tIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLSAqIGJvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUKLSAqIGRpc3BsYXktbmFtZSAtLSBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLSAqIHNtYWxsLWljb24gLS0gT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0gKiBsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotICogZGVzY3JpcHRpb24gLS0gT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiB2YXJpYWJsZSAtLSBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLSAqIGF0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgotICogZXhhbXBsZSAtLSBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgYWN0aW9uLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVGFnIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEJvZHlDb250ZW50IGF0dHJpYnV0ZQotCSAqIFByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkCi0JICogZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLlRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQkgKiAKLQkgKiB0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24KLQkgKiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JICogc3RhdGVtZW50cy4KLQkgKiAKLQkgKiBKU1AgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0JICogCi0JICogZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAKLQkgKiB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCSAqLwotCUJvZHlDb250ZW50VHlwZSBnZXRCb2R5Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRCb2R5Q29udGVudCA8ZW0+Qm9keSBDb250ZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb2R5IENvbnRlbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZQotCSAqIEBzZWUgI2lzU2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI3Vuc2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI2dldEJvZHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb2R5Q29udGVudChCb2R5Q29udGVudFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEJvZHlDb250ZW50IDxlbT5Cb2R5IENvbnRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI2dldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNzZXRCb2R5Q29udGVudChCb2R5Q29udGVudFR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCb2R5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEJvZHlDb250ZW50IDxlbT5Cb2R5IENvbnRlbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvZHkgQ29udGVudDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI2dldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNzZXRCb2R5Q29udGVudChCb2R5Q29udGVudFR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCb2R5Q29udGVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEV4YW1wbGUgYXR0cmlidXRlCi0JICogVGhlIGV4YW1wbGUgZWxlbWVudCBwcm92aWRlcyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2UKLQkgKiBvZiBhIHRhZy4KLQkgKi8KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEV4YW1wbGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0SlNQVGFnX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EeW5hbWljIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER5bmFtaWNBdHRyaWJ1dGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRKU1BUYWdfRHluYW1pY0F0dHJpYnV0ZXMoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRHluYW1pY0F0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjaXNEeW5hbWljQXR0cmlidXRlcyA8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRHluYW1pY0F0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBBdHRyaWJ1dGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFZhcmlhYmxlcyByZWZlcmVuY2VzCi0JICogVGhlIHZhcmlhYmxlIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSAKLQkgKiB0aGlzIHRhZy4KLQkgKiBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYW4gYWN0aW9uIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCi0JICogc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCi0JICogVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKLQkgKiBuYW1lLWdpdmVuIC0tIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQkgKiBuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUKLQkgKiB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lZnJvbS1hdHRyaWJ1dGUgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiB2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMKLQkgKiBkZWZhdWx0LgotCSAqIGRlY2xhcmUgLS0gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LiBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqIHNjb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0LgotCi0JICovCi0JRUxpc3QgZ2V0VmFyaWFibGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBUYWdDbGFzcyByZWZlcmVuY2UKLQkgKiBUaGUgdGFnLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnCi0JICogdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gVGhpcyBlbGVtZW50IGlzCi0JICogcmVxdWlyZWQuCi0JICogQHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VGFnQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRhZ0NsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VGFnQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFRlaUNsYXNzIHJlZmVyZW5jZQotCSAqIFRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IgdGhpcyB0YWcuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKLQkgKiBhdCB0cmFuc2xhdGlvbiB0aW1lLiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwuCi0JICogQHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0JICovCi0JSmF2YUNsYXNzIGdldFRlaUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUZWlDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFRlaUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnQXR0cmlidXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDVlYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZ0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BUYWdBdHRyaWJ1dGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQgKHJlcXVpcmVkKS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUnRFeHByVmFsdWUgYXR0cmlidXRlCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzYSB2YWx1ZSwgaS5lCi0JICogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWRhdCByZXF1ZXN0IHRpbWUsIGFzCi0JICogb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9udGltZS4gKG9wdGlvbmFsKQotCSAqIERlZmF1bHQgPSBmYWxzZQotCSAqLwotCWJvb2xlYW4gaXNSdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJ0RXhwclZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UnRFeHByVmFsdWUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSdEV4cHJWYWx1ZSgpCi0JICogQHNlZSAjaXNSdEV4cHJWYWx1ZSgpCi0JICogQHNlZSAjc2V0UnRFeHByVmFsdWUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJ0RXhwclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI2lzUnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI3NldFJ0RXhwclZhbHVlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJhZ21lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJhZ21lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyYWdtZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNGcmFnbWVudCA8ZW0+RnJhZ21lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZyYWdtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcmFnbWVudChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFR5cGUgcmVmZXJlbmNlCi0JICogVGhlIHZhbHVlIG9mIHRoZSB0eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuCi0JICogRm9yIHN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzCi0JICogamF2YS5sYW5nLlN0cmluZy4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BWYXJpYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGE0ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFZhcmlhYmxlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lR2l2ZW4gYXR0cmlidXRlCi0JICogVGhlIG5hbWUtZ2l2ZW4gZWxlbWVudCBwcm92aWRlcyB0aGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KLQkgKiAKLQkgKiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotCSAqLwotCVN0cmluZyBnZXROYW1lR2l2ZW4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lR2l2ZW4gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lR2l2ZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lRnJvbUF0dHJpYnV0ZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAqIHRoZSB2YXJpYWJsZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lRnJvbUF0dHJpYnV0ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWVGcm9tQXR0cmlidXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVjbGFyZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIAotCSAqIGJlIGRlZmluZWQgb3Igbm90LiBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgotCSAqIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQotCSAqLwotCWJvb2xlYW4gaXNEZWNsYXJlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVjbGFyZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlY2xhcmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU2NvcGUgYXR0cmlidXRlCi0JICovCi0JSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBnZXRTY29wZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUKLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBWYXJpYWJsZUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRWYXJpYWJsZUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWYXJpYWJsZUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VmFyaWFibGVDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEpTUFZhcmlhYmxlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ0ZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDQ0ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ0ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFnIEZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKLSAqIGFzIGEgLnRhZyBmaWxlLgotICogCi0gKiBUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOgotICogCi0gKiBuYW1lICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLSAqIAotICogcGF0aCAgICBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMKLSAqICAgICAgICAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIG9yCi0gKiAJdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluCi0gKiAJYSBKQVIuICBUaGlzIG11c3QgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZSAudGFnCi0gKiAJZmlsZSByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZSAudGFnCi0gKiAJZmlsZSByZXNpZGVzIGluIGEgSkFSLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFBhdGggPGVtPlBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFRhZ0V4dGVuc2lvbnMgPGVtPlRhZyBFeHRlbnNpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0ZpbGUgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnRmlsZV9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGF0aChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlX1BhdGgoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGF0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGFtcGxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRhZ0ZpbGVfRXhhbXBsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWcgRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRhZ0ZpbGVfVGFnRXh0ZW5zaW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYWdFeHRlbnNpb25zKCk7Ci0KLX0gLy8gVGFnRmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ0xpYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ0xpYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU5ODcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdMaWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi0vKioKLSAqIFRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnTGliIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCB1c2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSB2ZXJzaW9ucwotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUYWdMaWJWZXJzaW9uIGF0dHJpYnV0ZQotCSAqIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0YWcgbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkuCi0JICogQHJlZ2V4cCBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0JICovCi0JU3RyaW5nIGdldFRhZ0xpYlZlcnNpb24oKTsKLQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVGFnTGliVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFRhZ0xpYlZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKc3BWZXJzaW9uIGF0dHJpYnV0ZQotCSAqIERlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWcgbGlicmFyeSByZXF1aXJlcyBpbiBvcmRlciB0bwotCSAqIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKS4gIERlZmF1bHQgaXMgMS4yCi0JICogQHJlZ2V4cCBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0JICovCi0JU3RyaW5nIGdldEpzcFZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBKc3BWZXJzaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0SnNwVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNob3J0TmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHNob3J0LW5hbWUgZWxlbWVudCBpcyBhIG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5IGEgSlNQCi0JICogYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZQotCSAqIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gRG8gbm90IHVzZSB3aGl0ZSBzcGFjZSwgCi0JICogYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTaG9ydE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTaG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICogVGhlIHZhbHVlIG9mIHRoZSB1cmkgZWxlbWVudCBpcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBleGFjdCAKLQkgKiBzZW1hbnRpY3Mgb2YgdGhpcyB0YWdsaWJyYXJ5LgotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVGFncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0VGFncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVmFsaWRhdG9yIHJlZmVyZW5jZQotCSAqIFRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgCi0JICogdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgotCi0JICovCi0JVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsaWRhdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIExpc3RlbmVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GdW5jdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVuY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdW5jdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdMaWJfRnVuY3Rpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RnVuY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWdsaWIgRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgRXh0ZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhZ2xpYkV4dGVuc2lvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZkNWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnbGliRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ2xpYkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdMaWIgY3JlYXRlVGFnTGliKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBUYWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBUYWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpTUFRhZyBjcmVhdGVKU1BUYWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIFRhZyBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBUYWcgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BUYWdBdHRyaWJ1dGUgY3JlYXRlSlNQVGFnQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbGlkYXRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsaWRhdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBWYXJpYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIFZhcmlhYmxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BWYXJpYWJsZSBjcmVhdGVKU1BWYXJpYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdW5jdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RnVuY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnRmlsZSBjcmVhdGVUYWdGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRsZEV4dGVuc2lvbiBjcmVhdGVUbGRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnbGliUGFja2FnZSBnZXRUYWdsaWJQYWNrYWdlKCk7Ci0KLX0gLy9UYWdsaWJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4M2U4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ2xpYlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidGFnbGliIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAidGFnbGliLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdsaWJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnTGliSW1wbCA8ZW0+VGFnIExpYjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQUdfTElCID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWcgTGliIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19UQUdfTElCX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnNwIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19KU1BfVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fU0hPUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19VUkkgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVEFHUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19WQUxJREFUT1IgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19MSVNURU5FUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVuY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19GVU5DVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1RBR0xJQl9FWFRFTlNJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhZyBMaWI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdJbXBsIDxlbT5KU1AgVGFnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0SlNQVGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9UQUcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19JQ09OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvZHkgQ29udGVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0JPRFlfQ09OVEVOVCA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0VYQU1QTEUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19OQU1FID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EeW5hbWljIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0FUVFJJQlVURVMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fVkFSSUFCTEVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWcgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19UQUdfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlaSBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX1RFSV9DTEFTUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SlNQIFRhZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdBdHRyaWJ1dGVJbXBsIDxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFRhZ0F0dHJpYnV0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdCBFeHByIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmFnbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURV9fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkpTUCBUYWcgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVmFsaWRhdG9ySW1wbCA8ZW0+VmFsaWRhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVmFsaWRhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VmFsaWRhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTElEQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdG9yIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMSURBVE9SX19JTklUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMSURBVE9SX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5WYWxpZGF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMSURBVE9SX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVmFyaWFibGVJbXBsIDxlbT5KU1AgVmFyaWFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BWYXJpYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9WQVJJQUJMRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZSBHaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWUgRnJvbSBBdHRyaWJ1dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNsYXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19ERUNMQVJFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfX1NDT1BFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFibGUgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkpTUCBWYXJpYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwgPGVtPkZ1bmN0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGVU5DVElPTiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19JQ09OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19OQU1FID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaWduYXR1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fU0lHTkFUVVJFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX0VYQU1QTEUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdW5jdGlvbiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RnVuY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsIDxlbT5UYWcgRmlsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRUYWdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBR19GSUxFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX0lDT05TID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX05BTUUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfRklMRV9fUEFUSCA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19FWEFNUExFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWcgRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWcgRmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfRklMRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbCA8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRsZEV4dGVuc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFRsZEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUTERfRVhURU5TSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUTERfRVhURU5TSU9OX19OQU1FU1BBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb24gRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVExEX0VYVEVOU0lPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkV4dGVuc2libGVUeXBlSW1wbCA8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRFeHRlbnNpYmxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTlNJQkxFX1RZUEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5TSUJMRV9UWVBFX19WQUxVRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTlNJQkxFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlIDxlbT5Cb2R5IENvbnRlbnQgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0Qm9keUNvbnRlbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPRFlfQ09OVEVOVF9UWVBFID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgPGVtPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9TQ1JJUFRJTkdfVkFSSUFCTEVfU0NPUEUgPSAxMDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiA8ZW0+VGFnIExpYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFnTGliKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFnTGliVmVyc2lvbiA8ZW0+VGFnIExpYiBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFnIExpYiBWZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRUYWdMaWJWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYl9UYWdMaWJWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0SnNwVmVyc2lvbiA8ZW0+SnNwIFZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Kc3AgVmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0SnNwVmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfSnNwVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFNob3J0TmFtZSA8ZW0+U2hvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNob3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFNob3J0TmFtZSgpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfU2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRUYWdzIDxlbT5UYWdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRUYWdzKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9UYWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VmFsaWRhdG9yIDxlbT5WYWxpZGF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWxpZGF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFZhbGlkYXRvcigpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdMaWJfVmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRMaXN0ZW5lcnMgPGVtPkxpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliX0xpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0RnVuY3Rpb25zIDxlbT5GdW5jdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZ1bmN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0RnVuY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9GdW5jdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFRhZ2xpYkV4dGVuc2lvbnMgPGVtPlRhZ2xpYiBFeHRlbnNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWdsaWIgRXh0ZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFnbGliRXh0ZW5zaW9ucygpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyA8ZW0+SlNQIFRhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KU1AgVGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0Qm9keUNvbnRlbnQgPGVtPkJvZHkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvZHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnX0JvZHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnX0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0SlNQVGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2lzRHluYW1pY0F0dHJpYnV0ZXMgPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjaXNEeW5hbWljQXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0SlNQVGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdfRHluYW1pY0F0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnX0F0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFZhcmlhYmxlcyA8ZW0+VmFyaWFibGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYXJpYWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFZhcmlhYmxlcygpCi0JICogQHNlZSAjZ2V0SlNQVGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BUYWdfVmFyaWFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0VGFnQ2xhc3MgPGVtPlRhZyBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhZyBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0VGFnQ2xhc3MoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnX1RhZ0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0VGVpQ2xhc3MgPGVtPlRlaSBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRlaSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0VGVpQ2xhc3MoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnX1RlaUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlIDxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpTUFRhZ0F0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXF1aXJlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNpc1J0RXhwclZhbHVlIDxlbT5SdCBFeHByIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSgpCi0JICogQHNlZSAjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfUnRFeHByVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNpc0ZyYWdtZW50IDxlbT5GcmFnbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyYWdtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNpc0ZyYWdtZW50KCkKLQkgKiBAc2VlICNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciA8ZW0+VmFsaWRhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbGlkYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yI2dldFZhbGlkYXRvckNsYXNzIDxlbT5WYWxpZGF0b3IgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WYWxpZGF0b3IgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yI2dldFZhbGlkYXRvckNsYXNzKCkKLQkgKiBAc2VlICNnZXRWYWxpZGF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9WYWxpZGF0b3JDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciNnZXRJbml0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRWYWxpZGF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFZhbGlkYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlIDxlbT5KU1AgVmFyaWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SlNQIFZhcmlhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKU1BWYXJpYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0TmFtZUdpdmVuIDxlbT5OYW1lIEdpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZSBHaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXROYW1lR2l2ZW4oKQotCSAqIEBzZWUgI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldE5hbWVGcm9tQXR0cmlidXRlIDxlbT5OYW1lIEZyb20gQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZSBGcm9tIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXROYW1lRnJvbUF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0SlNQVmFyaWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX05hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNpc0RlY2xhcmUgPGVtPkRlY2xhcmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWNsYXJlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2lzRGVjbGFyZSgpCi0JICogQHNlZSAjZ2V0SlNQVmFyaWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX0RlY2xhcmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldFNjb3BlKCkKLQkgKiBAc2VlICNnZXRKU1BWYXJpYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldFZhcmlhYmxlQ2xhc3MgPGVtPlZhcmlhYmxlIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VmFyaWFibGUgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0VmFyaWFibGVDbGFzcygpCi0JICogQHNlZSAjZ2V0SlNQVmFyaWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFZhcmlhYmxlX1ZhcmlhYmxlQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiA8ZW0+RnVuY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RnVuY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZ1bmN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0U2lnbmF0dXJlIDxlbT5TaWduYXR1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaWduYXR1cmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0U2lnbmF0dXJlKCkKLQkgKiBAc2VlICNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRFeGFtcGxlKCkKLQkgKiBAc2VlICNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25DbGFzcyA8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5GdW5jdGlvbiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkNsYXNzKCkKLQkgKiBAc2VlICNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkV4dGVuc2lvbnMgPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkKLQkgKiBAc2VlICNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RnVuY3Rpb25fRnVuY3Rpb25FeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSA8ZW0+VGFnIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFnIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFnRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFRhZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0ZpbGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFBhdGgoKQotCSAqIEBzZWUgI2dldFRhZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0ZpbGVfUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldFRhZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0ZpbGVfRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFRhZ0V4dGVuc2lvbnMgPGVtPlRhZyBFeHRlbnNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFRhZ0V4dGVuc2lvbnMoKQotCSAqIEBzZWUgI2dldFRhZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0ZpbGVfVGFnRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiA8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGxkRXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldE5hbWVzcGFjZSgpCi0JICogQHNlZSAjZ2V0VGxkRXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiNnZXRFeHRlbnNpb25FbGVtZW50cyA8ZW0+RXh0ZW5zaW9uIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldEV4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRUbGRFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlIDxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbnNpYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuc2libGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlIDxlbT5Cb2R5IENvbnRlbnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkJvZHkgQ29udGVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRCb2R5Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgPGVtPkpTUCBTY3JpcHRpbmcgVmFyaWFibGUgU2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnbGliRmFjdG9yeSBnZXRUYWdsaWJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwgPGVtPlRhZyBMaWI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VGFnTGliKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBR19MSUIgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWcgTGliIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX19UQUdfTElCX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX1RhZ0xpYlZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpzcCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0xJQl9fSlNQX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX0pzcFZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNob3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX19TSE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9TaG9ydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfX1VSSSA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX19UQUdTID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9UYWdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX19WQUxJREFUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX1ZhbGlkYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX0xpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVuY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX19GVU5DVElPTlMgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX0Z1bmN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBR19MSUJfX1RBR0xJQl9FWFRFTlNJT05TID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdJbXBsIDxlbT5KU1AgVGFnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEpTUFRhZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKU1BfVEFHID0gZUlOU1RBTkNFLmdldEpTUFRhZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19fQk9EWV9DT05URU5UID0gZUlOU1RBTkNFLmdldEpTUFRhZ19Cb2R5Q29udGVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9UQUdfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnX0V4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVEFHX19OQU1FID0gZUlOU1RBTkNFLmdldEpTUFRhZ19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EeW5hbWljIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfVEFHX19BVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldEpTUFRhZ19BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9UQUdfX1ZBUklBQkxFUyA9IGVJTlNUQU5DRS5nZXRKU1BUYWdfVmFyaWFibGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWcgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfVEFHX19UQUdfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnX1RhZ0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZWkgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfVEFHX19URUlfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnX1RlaUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdBdHRyaWJ1dGVJbXBsIDxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFRhZ0F0dHJpYnV0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX1RBR19BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19BVFRSSUJVVEVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnQgRXhwciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnJhZ21lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlX0ZyYWdtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1RBR19BVFRSSUJVVEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRKU1BUYWdBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5WYWxpZGF0b3JJbXBsIDxlbT5WYWxpZGF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5WYWxpZGF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VmFsaWRhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFZBTElEQVRPUiA9IGVJTlNUQU5DRS5nZXRWYWxpZGF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRvciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTID0gZUlOU1RBTkNFLmdldFZhbGlkYXRvcl9WYWxpZGF0b3JDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFZBTElEQVRPUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0VmFsaWRhdG9yX0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkFMSURBVE9SX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVmFyaWFibGVJbXBsIDxlbT5KU1AgVmFyaWFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BWYXJpYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BWYXJpYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKU1BfVkFSSUFCTEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVmFyaWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWUgR2l2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVkFSSUFCTEVfX05BTUVfR0lWRU4gPSBlSU5TVEFOQ0UuZ2V0SlNQVmFyaWFibGVfTmFtZUdpdmVuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lIEZyb20gQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlX05hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWNsYXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1ZBUklBQkxFX19ERUNMQVJFID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlX0RlY2xhcmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1ZBUklBQkxFX19TQ09QRSA9IGVJTlNUQU5DRS5nZXRKU1BWYXJpYWJsZV9TY29wZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFibGUgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlX1ZhcmlhYmxlQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0SlNQVmFyaWFibGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwgPGVtPkZ1bmN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0RnVuY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRlVOQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0RnVuY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGVU5DVElPTl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRGdW5jdGlvbl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaWduYXR1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGVU5DVElPTl9fU0lHTkFUVVJFID0gZUlOU1RBTkNFLmdldEZ1bmN0aW9uX1NpZ25hdHVyZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZVTkNUSU9OX19FWEFNUExFID0gZUlOU1RBTkNFLmdldEZ1bmN0aW9uX0V4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTID0gZUlOU1RBTkNFLmdldEZ1bmN0aW9uX0Z1bmN0aW9uQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TID0gZUlOU1RBTkNFLmdldEZ1bmN0aW9uX0Z1bmN0aW9uRXh0ZW5zaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwgPGVtPlRhZyBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRUYWdGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBR19GSUxFID0gZUlOU1RBTkNFLmdldFRhZ0ZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfRklMRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRUYWdGaWxlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfRklMRV9fUEFUSCA9IGVJTlNUQU5DRS5nZXRUYWdGaWxlX1BhdGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfRklMRV9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRUYWdGaWxlX0V4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZyBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfRklMRV9fVEFHX0VYVEVOU0lPTlMgPSBlSU5TVEFOQ0UuZ2V0VGFnRmlsZV9UYWdFeHRlbnNpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UbGRFeHRlbnNpb25JbXBsIDxlbT5UbGQgRXh0ZW5zaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFRsZEV4dGVuc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUTERfRVhURU5TSU9OID0gZUlOU1RBTkNFLmdldFRsZEV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldFRsZEV4dGVuc2lvbl9OYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTID0gZUlOU1RBTkNFLmdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsIDxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmxlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRFeHRlbnNpYmxlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWFRFTlNJQkxFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJsZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhURU5TSUJMRV9UWVBFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZSA8ZW0+Qm9keSBDb250ZW50IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRCb2R5Q29udGVudFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBCT0RZX0NPTlRFTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRCb2R5Q29udGVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIDxlbT5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBKU1BfU0NSSVBUSU5HX1ZBUklBQkxFX1NDT1BFID0gZUlOU1RBTkNFLmdldEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoKTsKLQotCX0KLQotfSAvL1RhZ2xpYlBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UbGRFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UbGRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExYmQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGxkRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UbGQgRXh0ZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGxkRXh0ZW5zaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRsZEV4dGVuc2lvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5zaW9uIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbnNpb25FbGVtZW50cygpOwotCi19IC8vIFRsZEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhlZWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRvciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBWYWxpZGF0b3JDbGFzcyByZWZlcmVuY2UKLQkgKiBkZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlCi0JICogdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgotCSAqLwotCUphdmFDbGFzcyBnZXRWYWxpZGF0b3JDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsaWRhdG9yQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBJbml0UGFyYW1zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRWYWxpZGF0b3JfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZkOGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmxlVHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaWJsZVR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuc2libGVUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuRVhURU5TSUJMRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5FWFRFTlNJQkxFX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuc2libGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9GdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwMjQyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9GdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZ1bmN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldFNpZ25hdHVyZSA8ZW0+U2lnbmF0dXJlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwjZ2V0RnVuY3Rpb25FeHRlbnNpb25zIDxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25JbXBsIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBGdW5jdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2lnbmF0dXJlKCkgPGVtPlNpZ25hdHVyZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2lnbmF0dXJlKCkgPGVtPlNpZ25hdHVyZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpZ25hdHVyZSA9IFNJR05BVFVSRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlKCkgPGVtPkV4YW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4YW1wbGUgPSBFWEFNUExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVuY3Rpb25DbGFzcygpIDxlbT5GdW5jdGlvbiBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVuY3Rpb25DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBmdW5jdGlvbkNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucygpIDxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZ1bmN0aW9uRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRnVuY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5GVU5DVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlyZXR1cm4gc2lnbmF0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZShTdHJpbmcgbmV3U2lnbmF0dXJlKSB7Ci0JCVN0cmluZyBvbGRTaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0JCXNpZ25hdHVyZSA9IG5ld1NpZ25hdHVyZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fU0lHTkFUVVJFLCBvbGRTaWduYXR1cmUsIHNpZ25hdHVyZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgbmV3RXhhbXBsZSkgewotCQlTdHJpbmcgb2xkRXhhbXBsZSA9IGV4YW1wbGU7Ci0JCWV4YW1wbGUgPSBuZXdFeGFtcGxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19FWEFNUExFLCBvbGRFeGFtcGxlLCBleGFtcGxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRGdW5jdGlvbkNsYXNzKCkgewotCQlpZiAoZnVuY3Rpb25DbGFzcyAhPSBudWxsICYmIGZ1bmN0aW9uQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEZ1bmN0aW9uQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWZ1bmN0aW9uQ2xhc3M7Ci0JCQlmdW5jdGlvbkNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZEZ1bmN0aW9uQ2xhc3MpOwotCQkJaWYgKGZ1bmN0aW9uQ2xhc3MgIT0gb2xkRnVuY3Rpb25DbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTLCBvbGRGdW5jdGlvbkNsYXNzLCBmdW5jdGlvbkNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZ1bmN0aW9uQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldEZ1bmN0aW9uQ2xhc3MoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZ1bmN0aW9uQ2xhc3MoSmF2YUNsYXNzIG5ld0Z1bmN0aW9uQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEZ1bmN0aW9uQ2xhc3MgPSBmdW5jdGlvbkNsYXNzOwotCQlmdW5jdGlvbkNsYXNzID0gbmV3RnVuY3Rpb25DbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fQ0xBU1MsIG9sZEZ1bmN0aW9uQ2xhc3MsIGZ1bmN0aW9uQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkgewotCQlpZiAoZnVuY3Rpb25FeHRlbnNpb25zID09IG51bGwpIHsKLQkJCWZ1bmN0aW9uRXh0ZW5zaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUbGRFeHRlbnNpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlMpOwotCQl9Ci0JCXJldHVybiBmdW5jdGlvbkV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX1NJR05BVFVSRToKLQkJCQlyZXR1cm4gZ2V0U2lnbmF0dXJlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGdW5jdGlvbkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RnVuY3Rpb25DbGFzcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCXJldHVybiBnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19TSUdOQVRVUkU6Ci0JCQkJc2V0U2lnbmF0dXJlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRVhBTVBMRToKLQkJCQlzZXRFeGFtcGxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fQ0xBU1M6Ci0JCQkJc2V0RnVuY3Rpb25DbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX1NJR05BVFVSRToKLQkJCQlzZXRTaWduYXR1cmUoU0lHTkFUVVJFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZShFWEFNUExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCXNldEZ1bmN0aW9uQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19TSUdOQVRVUkU6Ci0JCQkJcmV0dXJuIFNJR05BVFVSRV9FREVGQVVMVCA9PSBudWxsID8gc2lnbmF0dXJlICE9IG51bGwgOiAhU0lHTkFUVVJFX0VERUZBVUxULmVxdWFscyhzaWduYXR1cmUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19FWEFNUExFOgotCQkJCXJldHVybiBFWEFNUExFX0VERUZBVUxUID09IG51bGwgPyBleGFtcGxlICE9IG51bGwgOiAhRVhBTVBMRV9FREVGQVVMVC5lcXVhbHMoZXhhbXBsZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCXJldHVybiBmdW5jdGlvbkNsYXNzICE9IG51bGw7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIGZ1bmN0aW9uRXh0ZW5zaW9ucyAhPSBudWxsICYmICFmdW5jdGlvbkV4dGVuc2lvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2lnbmF0dXJlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaWduYXR1cmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4YW1wbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9GdW5jdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0F0dHJpYnV0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0F0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNDlkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ0F0dHJpYnV0ZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBKU1BUYWdBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVRVUlSRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSdEV4cHJWYWx1ZSgpIDxlbT5SdCBFeHByIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1J0RXhwclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUlRfRVhQUl9WQUxVRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnRFeHByVmFsdWUgPSBSVF9FWFBSX1ZBTFVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUnQgRXhwciBWYWx1ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnRFeHByVmFsdWVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGcmFnbWVudCgpIDxlbT5GcmFnbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGcmFnbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSQUdNRU5UX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZyYWdtZW50KCkgPGVtPkZyYWdtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZyYWdtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmcmFnbWVudCA9IEZSQUdNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyB0eXBlID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQVGFnQXR0cmlidXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLkpTUF9UQUdfQVRUUklCVVRFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkIChyZXF1aXJlZCkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiBuZXdSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXJlcXVpcmVkID0gbmV3UmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWRFU2V0ID0gcmVxdWlyZWRFU2V0OwotCQlyZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIHJlcXVpcmVkLCAhb2xkUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZCA9IHJlcXVpcmVkOwotCQlib29sZWFuIG9sZFJlcXVpcmVkRVNldCA9IHJlcXVpcmVkRVNldDsKLQkJcmVxdWlyZWQgPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJcmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQsIG9sZFJlcXVpcmVkLCBSRVFVSVJFRF9FREVGQVVMVCwgb2xkUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXNhIHZhbHVlLCBpLmUKLQkgKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZGF0IHJlcXVlc3QgdGltZSwgYXMKLQkgKiBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb250aW1lLiAob3B0aW9uYWwpCi0JICogRGVmYXVsdCA9IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdEV4cHJWYWx1ZSgpIHsKLQkJcmV0dXJuIHJ0RXhwclZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ0RXhwclZhbHVlKGJvb2xlYW4gbmV3UnRFeHByVmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRSdEV4cHJWYWx1ZSA9IHJ0RXhwclZhbHVlOwotCQlydEV4cHJWYWx1ZSA9IG5ld1J0RXhwclZhbHVlOwotCQlib29sZWFuIG9sZFJ0RXhwclZhbHVlRVNldCA9IHJ0RXhwclZhbHVlRVNldDsKLQkJcnRFeHByVmFsdWVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUlRfRVhQUl9WQUxVRSwgb2xkUnRFeHByVmFsdWUsIHJ0RXhwclZhbHVlLCAhb2xkUnRFeHByVmFsdWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSdEV4cHJWYWx1ZSgpIHsKLQkJYm9vbGVhbiBvbGRSdEV4cHJWYWx1ZSA9IHJ0RXhwclZhbHVlOwotCQlib29sZWFuIG9sZFJ0RXhwclZhbHVlRVNldCA9IHJ0RXhwclZhbHVlRVNldDsKLQkJcnRFeHByVmFsdWUgPSBSVF9FWFBSX1ZBTFVFX0VERUZBVUxUOwotCQlydEV4cHJWYWx1ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFLCBvbGRSdEV4cHJWYWx1ZSwgUlRfRVhQUl9WQUxVRV9FREVGQVVMVCwgb2xkUnRFeHByVmFsdWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSdEV4cHJWYWx1ZSgpIHsKLQkJcmV0dXJuIHJ0RXhwclZhbHVlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoYm9vbGVhbiBuZXdGcmFnbWVudCkgewotCQlib29sZWFuIG9sZEZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0JCWZyYWdtZW50ID0gbmV3RnJhZ21lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5ULCBvbGRGcmFnbWVudCwgZnJhZ21lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHR5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4KLQkgKiBGb3Igc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKSB0aGUgdHlwZSBpcyBhbHdheXMKLQkgKiBqYXZhLmxhbmcuU3RyaW5nLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUeXBlID0gKEludGVybmFsRU9iamVjdCl0eXBlOwotCQkJdHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRUeXBlKTsKLQkJCWlmICh0eXBlICE9IG9sZFR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoSmF2YUNsYXNzIG5ld1R5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUU6Ci0JCQkJcmV0dXJuIGlzUnRFeHByVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UOgotCQkJCXJldHVybiBpc0ZyYWdtZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFR5cGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUU6Ci0JCQkJc2V0UnRFeHByVmFsdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVDoKLQkJCQlzZXRGcmFnbWVudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQ6Ci0JCQkJdW5zZXRSZXF1aXJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUlRfRVhQUl9WQUxVRToKLQkJCQl1bnNldFJ0RXhwclZhbHVlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVDoKLQkJCQlzZXRGcmFnbWVudChGUkFHTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFOgotCQkJCXNldFR5cGUoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1NldFJlcXVpcmVkKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUU6Ci0JCQkJcmV0dXJuIGlzU2V0UnRFeHByVmFsdWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQ6Ci0JCQkJcmV0dXJuIGZyYWdtZW50ICE9IEZSQUdNRU5UX0VERUZBVUxUOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IG51bGw7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXF1aXJlZDogIik7Ci0JCWlmIChyZXF1aXJlZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVxdWlyZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBydEV4cHJWYWx1ZTogIik7Ci0JCWlmIChydEV4cHJWYWx1ZUVTZXQpIHJlc3VsdC5hcHBlbmQocnRFeHByVmFsdWUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmcmFnbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYWRhYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdGFnIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeS4gVGhlIHRhZyBlbGVtZW50IGhhcyBvbmUgYXR0cmlidXRlLCBpZC4KLSAqIFRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotICogbmFtZSAtLSBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0gKiB0YWctY2xhc3MgLS0gVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCi0gKiB0ZWktY2xhc3MgLS0gQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotICogYm9keS1jb250ZW50IC0tIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotICogZGlzcGxheS1uYW1lIC0tIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotICogc21hbGwtaWNvbiAtLSBPcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLSAqIGxhcmdlLWljb24gLS0gT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0gKiBkZXNjcmlwdGlvbiAtLSBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAqIHZhcmlhYmxlIC0tIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgotICogYXR0cmlidXRlIC0tIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uCi0gKiBleGFtcGxlIC0tIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBhY3Rpb24uCi0KLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ0ltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEpTUFRhZyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keUNvbnRlbnQoKSA8ZW0+Qm9keSBDb250ZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgQk9EWV9DT05URU5UX0VERUZBVUxUID0gQm9keUNvbnRlbnRUeXBlLlRBR0RFUEVOREVOVF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEJvZHlDb250ZW50VHlwZSBib2R5Q29udGVudCA9IEJPRFlfQ09OVEVOVF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJvZHkgQ29udGVudCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYm9keUNvbnRlbnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXhhbXBsZSA9IEVYQU1QTEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEeW5hbWljQXR0cmlidXRlcygpIDxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRHluYW1pY0F0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBEWU5BTUlDX0FUVFJJQlVURVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRHluYW1pY0F0dHJpYnV0ZXMoKSA8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkeW5hbWljQXR0cmlidXRlcyA9IERZTkFNSUNfQVRUUklCVVRFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFyaWFibGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHRhZ0NsYXNzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHRlaUNsYXNzID0gbnVsbDsKLQlwdWJsaWMgSlNQVGFnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLkpTUF9UQUc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkgaW50ZW5kZWQKLQkgKiBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOgotCSAqIAotCSAqIHRhZ2RlcGVuZGVudCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZyBpbXBsZW1lbnRhdGlvbgotCSAqIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEJCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwKLQkgKiBzdGF0ZW1lbnRzLgotCSAqIAotCSAqIEpTUCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgKLQkgKiAKLQkgKiBlbXB0eSAtIFRoZSBib2R5IG11c3QgYmUgZW1wdHlUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUCNQQ0RBVEEgOjo9IAotCSAqIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5Ci0JICovCi0JcHVibGljIEJvZHlDb250ZW50VHlwZSBnZXRCb2R5Q29udGVudCgpIHsKLQkJcmV0dXJuIGJvZHlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvZHlDb250ZW50KEJvZHlDb250ZW50VHlwZSBuZXdCb2R5Q29udGVudCkgewotCQlCb2R5Q29udGVudFR5cGUgb2xkQm9keUNvbnRlbnQgPSBib2R5Q29udGVudDsKLQkJYm9keUNvbnRlbnQgPSBuZXdCb2R5Q29udGVudCA9PSBudWxsID8gQk9EWV9DT05URU5UX0VERUZBVUxUIDogbmV3Qm9keUNvbnRlbnQ7Ci0JCWJvb2xlYW4gb2xkQm9keUNvbnRlbnRFU2V0ID0gYm9keUNvbnRlbnRFU2V0OwotCQlib2R5Q29udGVudEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVCwgb2xkQm9keUNvbnRlbnQsIGJvZHlDb250ZW50LCAhb2xkQm9keUNvbnRlbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCb2R5Q29udGVudCgpIHsKLQkJQm9keUNvbnRlbnRUeXBlIG9sZEJvZHlDb250ZW50ID0gYm9keUNvbnRlbnQ7Ci0JCWJvb2xlYW4gb2xkQm9keUNvbnRlbnRFU2V0ID0gYm9keUNvbnRlbnRFU2V0OwotCQlib2R5Q29udGVudCA9IEJPRFlfQ09OVEVOVF9FREVGQVVMVDsKLQkJYm9keUNvbnRlbnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQsIG9sZEJvZHlDb250ZW50LCBCT0RZX0NPTlRFTlRfRURFRkFVTFQsIG9sZEJvZHlDb250ZW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Qm9keUNvbnRlbnQoKSB7Ci0JCXJldHVybiBib2R5Q29udGVudEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGV4YW1wbGUgZWxlbWVudCBwcm92aWRlcyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2UKLQkgKiBvZiBhIHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIG5ld0V4YW1wbGUpIHsKLQkJU3RyaW5nIG9sZEV4YW1wbGUgPSBleGFtcGxlOwotCQlleGFtcGxlID0gbmV3RXhhbXBsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19FWEFNUExFLCBvbGRFeGFtcGxlLCBleGFtcGxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRHluYW1pY0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBkeW5hbWljQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlcyhib29sZWFuIG5ld0R5bmFtaWNBdHRyaWJ1dGVzKSB7Ci0JCWJvb2xlYW4gb2xkRHluYW1pY0F0dHJpYnV0ZXMgPSBkeW5hbWljQXR0cmlidXRlczsKLQkJZHluYW1pY0F0dHJpYnV0ZXMgPSBuZXdEeW5hbWljQXR0cmlidXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVMsIG9sZER5bmFtaWNBdHRyaWJ1dGVzLCBkeW5hbWljQXR0cmlidXRlcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5KU1BfVEFHX19BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFyaWFibGUgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IAotCSAqIHRoaXMgdGFnLgotCSAqIEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQkgKiBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KLQkgKiBUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGUgYXJlIG9mIHRoZSBmb3JtOgotCSAqIG5hbWUtZ2l2ZW4gLS0gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCSAqIG5hbWUtZnJvbS1hdHRyaWJ1dGUgLS0gVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZQotCSAqIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWVmcm9tLWF0dHJpYnV0ZSBpcwotCSAqIHJlcXVpcmVkLgotCSAqIHZhcmlhYmxlLWNsYXNzIC0tIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4gamF2YS5sYW5nLlN0cmluZyBpcwotCSAqIGRlZmF1bHQuCi0JICogZGVjbGFyZSAtLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuIFRydWUgaXMgdGhlIGRlZmF1bHQuCi0JICogc2NvcGUgLS0gVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4gTkVTVEVEIGlzIGRlZmF1bHQuCi0KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFyaWFibGVzKCkgewotCQlpZiAodmFyaWFibGVzID09IG51bGwpIHsKLQkJCXZhcmlhYmxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKU1BWYXJpYWJsZS5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVMpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRhZy1jbGFzcyBlbGVtZW50IGluZGljYXRlcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZwotCSAqIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIFRoaXMgZWxlbWVudCBpcwotCSAqIHJlcXVpcmVkLgotCSAqIEByZWdleHAgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUYWdDbGFzcygpIHsKLQkJaWYgKHRhZ0NsYXNzICE9IG51bGwgJiYgdGFnQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhZ0NsYXNzID0gKEludGVybmFsRU9iamVjdCl0YWdDbGFzczsKLQkJCXRhZ0NsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFRhZ0NsYXNzKTsKLQkJCWlmICh0YWdDbGFzcyAhPSBvbGRUYWdDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTLCBvbGRUYWdDbGFzcywgdGFnQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFRhZ0NsYXNzKCkgewotCQlyZXR1cm4gdGFnQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnQ2xhc3MoSmF2YUNsYXNzIG5ld1RhZ0NsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRUYWdDbGFzcyA9IHRhZ0NsYXNzOwotCQl0YWdDbGFzcyA9IG5ld1RhZ0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUywgb2xkVGFnQ2xhc3MsIHRhZ0NsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRlaS1jbGFzcyBlbGVtZW50IGluZGljYXRlcyB0aGUgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvciB0aGlzIHRhZy4gVGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZAotCSAqIGF0IHRyYW5zbGF0aW9uIHRpbWUuIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4KLQkgKiBAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFRlaUNsYXNzKCkgewotCQlpZiAodGVpQ2xhc3MgIT0gbnVsbCAmJiB0ZWlDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGVpQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KXRlaUNsYXNzOwotCQkJdGVpQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkVGVpQ2xhc3MpOwotCQkJaWYgKHRlaUNsYXNzICE9IG9sZFRlaUNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1MsIG9sZFRlaUNsYXNzLCB0ZWlDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZWlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0VGVpQ2xhc3MoKSB7Ci0JCXJldHVybiB0ZWlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZWlDbGFzcyhKYXZhQ2xhc3MgbmV3VGVpQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZFRlaUNsYXNzID0gdGVpQ2xhc3M7Ci0JCXRlaUNsYXNzID0gbmV3VGVpQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEVJX0NMQVNTLCBvbGRUZWlDbGFzcywgdGVpQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhcmlhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6Ci0JCQkJcmV0dXJuIGdldEJvZHlDb250ZW50KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlyZXR1cm4gZ2V0RXhhbXBsZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGlzRHluYW1pY0F0dHJpYnV0ZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGFnQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUYWdDbGFzcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRlaUNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VGVpQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVDoKLQkJCQlzZXRCb2R5Q29udGVudCgoQm9keUNvbnRlbnRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlzZXRFeGFtcGxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0RZTkFNSUNfQVRUUklCVVRFUzoKLQkJCQlzZXREeW5hbWljQXR0cmlidXRlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTOgotCQkJCWdldFZhcmlhYmxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFyaWFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCXNldFRhZ0NsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJc2V0VGVpQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6Ci0JCQkJdW5zZXRCb2R5Q29udGVudCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19FWEFNUExFOgotCQkJCXNldEV4YW1wbGUoRVhBTVBMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTOgotCQkJCXNldER5bmFtaWNBdHRyaWJ1dGVzKERZTkFNSUNfQVRUUklCVVRFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlnZXRWYXJpYWJsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19UQUdfQ0xBU1M6Ci0JCQkJc2V0VGFnQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEVJX0NMQVNTOgotCQkJCXNldFRlaUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQk9EWV9DT05URU5UOgotCQkJCXJldHVybiBpc1NldEJvZHlDb250ZW50KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlyZXR1cm4gRVhBTVBMRV9FREVGQVVMVCA9PSBudWxsID8gZXhhbXBsZSAhPSBudWxsIDogIUVYQU1QTEVfRURFRkFVTFQuZXF1YWxzKGV4YW1wbGUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGR5bmFtaWNBdHRyaWJ1dGVzICE9IERZTkFNSUNfQVRUUklCVVRFU19FREVGQVVMVDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlyZXR1cm4gdmFyaWFibGVzICE9IG51bGwgJiYgIXZhcmlhYmxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCXJldHVybiB0YWdDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUzoKLQkJCQlyZXR1cm4gdGVpQ2xhc3MgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJvZHlDb250ZW50OiAiKTsKLQkJaWYgKGJvZHlDb250ZW50RVNldCkgcmVzdWx0LmFwcGVuZChib2R5Q29udGVudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4YW1wbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR5bmFtaWNBdHRyaWJ1dGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkeW5hbWljQXR0cmlidXRlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFZhcmlhYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDUzNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVmFyaWFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQVmFyaWFibGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSlNQVmFyaWFibGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVHaXZlbigpIDxlbT5OYW1lIEdpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lR2l2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfR0lWRU5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lR2l2ZW4gPSBOQU1FX0dJVkVOX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIDxlbT5OYW1lIEZyb20gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lRnJvbUF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlID0gTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWNsYXJlKCkgPGVtPkRlY2xhcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVjbGFyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQ0xBUkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlY2xhcmUgPSBERUNMQVJFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBTQ09QRV9FREVGQVVMVCA9IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuTkVTVEVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBzY29wZSA9IFNDT1BFX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdmFyaWFibGVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEpTUFZhcmlhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLkpTUF9WQVJJQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbmFtZS1naXZlbiBlbGVtZW50IHByb3ZpZGVzIHRoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLgotCSAqIAotCSAqIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lR2l2ZW4oKSB7Ci0JCXJldHVybiBuYW1lR2l2ZW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyBuZXdOYW1lR2l2ZW4pIHsKLQkJU3RyaW5nIG9sZE5hbWVHaXZlbiA9IG5hbWVHaXZlbjsKLQkJbmFtZUdpdmVuID0gbmV3TmFtZUdpdmVuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTiwgb2xkTmFtZUdpdmVuLCBuYW1lR2l2ZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAqIHRoZSB2YXJpYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVGcm9tQXR0cmlidXRlKCkgewotCQlyZXR1cm4gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZUZyb21BdHRyaWJ1dGUoU3RyaW5nIG5ld05hbWVGcm9tQXR0cmlidXRlKSB7Ci0JCVN0cmluZyBvbGROYW1lRnJvbUF0dHJpYnV0ZSA9IG5hbWVGcm9tQXR0cmlidXRlOwotCQluYW1lRnJvbUF0dHJpYnV0ZSA9IG5ld05hbWVGcm9tQXR0cmlidXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURSwgb2xkTmFtZUZyb21BdHRyaWJ1dGUsIG5hbWVGcm9tQXR0cmlidXRlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJlIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byAKLQkgKiBiZSBkZWZpbmVkIG9yIG5vdC4gU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4KLQkgKiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuCi0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xhcmUoKSB7Ci0JCXJldHVybiBkZWNsYXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmUoYm9vbGVhbiBuZXdEZWNsYXJlKSB7Ci0JCWJvb2xlYW4gb2xkRGVjbGFyZSA9IGRlY2xhcmU7Ci0JCWRlY2xhcmUgPSBuZXdEZWNsYXJlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVDTEFSRSwgb2xkRGVjbGFyZSwgZGVjbGFyZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBuZXdTY29wZSkgewotCQlKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIG9sZFNjb3BlID0gc2NvcGU7Ci0JCXNjb3BlID0gbmV3U2NvcGUgPT0gbnVsbCA/IFNDT1BFX0VERUZBVUxUIDogbmV3U2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRSwgb2xkU2NvcGUsIHNjb3BlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRWYXJpYWJsZUNsYXNzKCkgewotCQlpZiAodmFyaWFibGVDbGFzcyAhPSBudWxsICYmIHZhcmlhYmxlQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhcmlhYmxlQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KXZhcmlhYmxlQ2xhc3M7Ci0JCQl2YXJpYWJsZUNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmxlQ2xhc3MpOwotCQkJaWYgKHZhcmlhYmxlQ2xhc3MgIT0gb2xkVmFyaWFibGVDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUywgb2xkVmFyaWFibGVDbGFzcywgdmFyaWFibGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJsZUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRWYXJpYWJsZUNsYXNzKCkgewotCQlyZXR1cm4gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUNsYXNzKEphdmFDbGFzcyBuZXdWYXJpYWJsZUNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRWYXJpYWJsZUNsYXNzID0gdmFyaWFibGVDbGFzczsKLQkJdmFyaWFibGVDbGFzcyA9IG5ld1ZhcmlhYmxlQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUywgb2xkVmFyaWFibGVDbGFzcywgdmFyaWFibGVDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfR0lWRU46Ci0JCQkJcmV0dXJuIGdldE5hbWVHaXZlbigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFQ0xBUkU6Ci0JCQkJcmV0dXJuIGlzRGVjbGFyZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1NDT1BFOgotCQkJCXJldHVybiBnZXRTY29wZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRWYXJpYWJsZUNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFibGVDbGFzcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTjoKLQkJCQlzZXROYW1lR2l2ZW4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURToKLQkJCQlzZXROYW1lRnJvbUF0dHJpYnV0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFOgotCQkJCXNldERlY2xhcmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fU0NPUEU6Ci0JCQkJc2V0U2NvcGUoKEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTOgotCQkJCXNldFZhcmlhYmxlQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTjoKLQkJCQlzZXROYW1lR2l2ZW4oTkFNRV9HSVZFTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURToKLQkJCQlzZXROYW1lRnJvbUF0dHJpYnV0ZShOQU1FX0ZST01fQVRUUklCVVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFOgotCQkJCXNldERlY2xhcmUoREVDTEFSRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fU0NPUEU6Ci0JCQkJc2V0U2NvcGUoU0NPUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTOgotCQkJCXNldFZhcmlhYmxlQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfR0lWRU46Ci0JCQkJcmV0dXJuIE5BTUVfR0lWRU5fRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVHaXZlbiAhPSBudWxsIDogIU5BTUVfR0lWRU5fRURFRkFVTFQuZXF1YWxzKG5hbWVHaXZlbik7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFOgotCQkJCXJldHVybiBOQU1FX0ZST01fQVRUUklCVVRFX0VERUZBVUxUID09IG51bGwgPyBuYW1lRnJvbUF0dHJpYnV0ZSAhPSBudWxsIDogIU5BTUVfRlJPTV9BVFRSSUJVVEVfRURFRkFVTFQuZXF1YWxzKG5hbWVGcm9tQXR0cmlidXRlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFQ0xBUkU6Ci0JCQkJcmV0dXJuIGRlY2xhcmUgIT0gREVDTEFSRV9FREVGQVVMVDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1NDT1BFOgotCQkJCXJldHVybiBzY29wZSAhPSBTQ09QRV9FREVGQVVMVDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTOgotCQkJCXJldHVybiB2YXJpYWJsZUNsYXNzICE9IG51bGw7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZUdpdmVuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lR2l2ZW4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWVGcm9tQXR0cmlidXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lRnJvbUF0dHJpYnV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVjbGFyZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVjbGFyZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODY0MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgRmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0VGFnRXh0ZW5zaW9ucyA8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdGaWxlSW1wbCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgVGFnRmlsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGF0aCgpIDxlbT5QYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlKCkgPGVtPkV4YW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4YW1wbGUgPSBFWEFNUExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnRXh0ZW5zaW9ucygpIDxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdFeHRlbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFnRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLlRBR19GSUxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBuZXdQYXRoKSB7Ci0JCVN0cmluZyBvbGRQYXRoID0gcGF0aDsKLQkJcGF0aCA9IG5ld1BhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1BBVEgsIG9sZFBhdGgsIHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIG5ld0V4YW1wbGUpIHsKLQkJU3RyaW5nIG9sZEV4YW1wbGUgPSBleGFtcGxlOwotCQlleGFtcGxlID0gbmV3RXhhbXBsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRVhBTVBMRSwgb2xkRXhhbXBsZSwgZXhhbXBsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdFeHRlbnNpb25zKCkgewotCQlpZiAodGFnRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQl0YWdFeHRlbnNpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRsZEV4dGVuc2lvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlMpOwotCQl9Ci0JCXJldHVybiB0YWdFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdFeHRlbnNpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFBhdGgoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRVhBTVBMRToKLQkJCQlyZXR1cm4gZ2V0RXhhbXBsZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0VGFnRXh0ZW5zaW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1BBVEg6Ci0JCQkJc2V0UGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCWdldFRhZ0V4dGVuc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldFRhZ0V4dGVuc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1BBVEg6Ci0JCQkJc2V0UGF0aChQQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZShFWEFNUExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCWdldFRhZ0V4dGVuc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1BBVEg6Ci0JCQkJcmV0dXJuIFBBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHBhdGggIT0gbnVsbCA6ICFQQVRIX0VERUZBVUxULmVxdWFscyhwYXRoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRVhBTVBMRToKLQkJCQlyZXR1cm4gRVhBTVBMRV9FREVGQVVMVCA9PSBudWxsID8gZXhhbXBsZSAhPSBudWxsIDogIUVYQU1QTEVfRURFRkFVTFQuZXF1YWxzKGV4YW1wbGUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gdGFnRXh0ZW5zaW9ucyAhPSBudWxsICYmICF0YWdFeHRlbnNpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4YW1wbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYWdGaWxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZiMTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotCi0KLS8qKgotICogVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QuCi0KLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBUYWdMaWIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ0xpYlZlcnNpb24oKSA8ZW0+VGFnIExpYiBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdMaWJWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTElCX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdMaWJWZXJzaW9uID0gVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BWZXJzaW9uKCkgPGVtPkpzcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGpzcFZlcnNpb24gPSBKU1BfVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hvcnROYW1lKCkgPGVtPlNob3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNob3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0TmFtZSA9IFNIT1JUX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YWdzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGxpc3RlbmVycyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVuY3Rpb25zKCkgPGVtPkZ1bmN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdW5jdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmdW5jdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliRXh0ZW5zaW9ucygpIDxlbT5UYWdsaWIgRXh0ZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJFeHRlbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnbGliRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgVGFnTGliSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLlRBR19MSUI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRhZyBsaWJyYXJ5IChkZXdleSBkZWNpbWFsKS4KLQkgKiBAcmVnZXhwIFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ0xpYlZlcnNpb24oKSB7Ci0JCXJldHVybiB0YWdMaWJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ0xpYlZlcnNpb24oU3RyaW5nIG5ld1RhZ0xpYlZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ0xpYlZlcnNpb24gPSB0YWdMaWJWZXJzaW9uOwotCQl0YWdMaWJWZXJzaW9uID0gbmV3VGFnTGliVmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdfTElCX1ZFUlNJT04sIG9sZFRhZ0xpYlZlcnNpb24sIHRhZ0xpYlZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8KLQkgKiBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwVmVyc2lvbigpIHsKLQkJcmV0dXJuIGpzcFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwVmVyc2lvbihTdHJpbmcgbmV3SnNwVmVyc2lvbikgewotCQlTdHJpbmcgb2xkSnNwVmVyc2lvbiA9IGpzcFZlcnNpb247Ci0JCWpzcFZlcnNpb24gPSBuZXdKc3BWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OLCBvbGRKc3BWZXJzaW9uLCBqc3BWZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbHVlIG9mIHRoZSBzaG9ydC1uYW1lIGVsZW1lbnQgaXMgYSBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUAotCSAqIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUKLQkgKiB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIAotCSAqIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHNob3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydE5hbWUoU3RyaW5nIG5ld1Nob3J0TmFtZSkgewotCQlTdHJpbmcgb2xkU2hvcnROYW1lID0gc2hvcnROYW1lOwotCQlzaG9ydE5hbWUgPSBuZXdTaG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRSwgb2xkU2hvcnROYW1lLCBzaG9ydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHVyaSBlbGVtZW50IGlzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGV4YWN0IAotCSAqIHNlbWFudGljcyBvZiB0aGlzIHRhZ2xpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCVRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdzKCkgewotCQlpZiAodGFncyA9PSBudWxsKSB7Ci0JCQl0YWdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEpTUFRhZy5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTKTsKLQkJfQotCQlyZXR1cm4gdGFnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIAotCSAqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbGlkYXRvcihWYWxpZGF0b3IgbmV3VmFsaWRhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVZhbGlkYXRvciBvbGRWYWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXZhbGlkYXRvciA9IG5ld1ZhbGlkYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1IsIG9sZFZhbGlkYXRvciwgbmV3VmFsaWRhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIG5ld1ZhbGlkYXRvcikgewotCQlpZiAobmV3VmFsaWRhdG9yICE9IHZhbGlkYXRvcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsaWRhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbGlkYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWxpZGF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsaWRhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsaWRhdG9yKG5ld1ZhbGlkYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1ZBTElEQVRPUiwgbmV3VmFsaWRhdG9yLCBuZXdWYWxpZGF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaXN0ZW5lci5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlMpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZ1bmN0aW9ucygpIHsKLQkJaWYgKGZ1bmN0aW9ucyA9PSBudWxsKSB7Ci0JCQlmdW5jdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRnVuY3Rpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gZnVuY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdsaWJFeHRlbnNpb25zKCkgewotCQlpZiAodGFnbGliRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQl0YWdsaWJFeHRlbnNpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRsZEV4dGVuc2lvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ2xpYkV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VmFsaWRhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExpc3RlbmVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RnVuY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhZ2xpYkV4dGVuc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgotCQkJCXJldHVybiBnZXRUYWdMaWJWZXJzaW9uKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fSlNQX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldEpzcFZlcnNpb24oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TSE9SVF9OQU1FOgotCQkJCXJldHVybiBnZXRTaG9ydE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR1M6Ci0JCQkJcmV0dXJuIGdldFRhZ3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJcmV0dXJuIGdldFZhbGlkYXRvcigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCXJldHVybiBnZXRGdW5jdGlvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0VGFnbGliRXh0ZW5zaW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgotCQkJCXNldFRhZ0xpYlZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OOgotCQkJCXNldEpzcFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1NIT1JUX05BTUU6Ci0JCQkJc2V0U2hvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTOgotCQkJCWdldFRhZ3MoKS5jbGVhcigpOwotCQkJCWdldFRhZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJc2V0VmFsaWRhdG9yKChWYWxpZGF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19GVU5DVElPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRGdW5jdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlnZXRUYWdsaWJFeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdsaWJFeHRlbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR19MSUJfVkVSU0lPTjoKLQkJCQlzZXRUYWdMaWJWZXJzaW9uKFRBR19MSUJfVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OOgotCQkJCXNldEpzcFZlcnNpb24oSlNQX1ZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TSE9SVF9OQU1FOgotCQkJCXNldFNob3J0TmFtZShTSE9SVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTOgotCQkJCWdldFRhZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJc2V0VmFsaWRhdG9yKChWYWxpZGF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQlnZXRMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19GVU5DVElPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0VGFnbGliRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgotCQkJCXJldHVybiBUQUdfTElCX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHRhZ0xpYlZlcnNpb24gIT0gbnVsbCA6ICFUQUdfTElCX1ZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHRhZ0xpYlZlcnNpb24pOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OOgotCQkJCXJldHVybiBKU1BfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8ganNwVmVyc2lvbiAhPSBudWxsIDogIUpTUF9WRVJTSU9OX0VERUZBVUxULmVxdWFscyhqc3BWZXJzaW9uKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TSE9SVF9OQU1FOgotCQkJCXJldHVybiBTSE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzaG9ydE5hbWUgIT0gbnVsbCA6ICFTSE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhzaG9ydE5hbWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKLQkJCQlyZXR1cm4gdGFncyAhPSBudWxsICYmICF0YWdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJcmV0dXJuIHZhbGlkYXRvciAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gbGlzdGVuZXJzICE9IG51bGwgJiYgIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCXJldHVybiBmdW5jdGlvbnMgIT0gbnVsbCAmJiAhZnVuY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gdGFnbGliRXh0ZW5zaW9ucyAhPSBudWxsICYmICF0YWdsaWJFeHRlbnNpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhZ0xpYlZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhZ0xpYlZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpzcFZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpzcFZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNob3J0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2hvcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cmk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ3MzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBUYWdsaWJGYWN0b3J5IHsKLSAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWdsaWJGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlUYWdsaWJGYWN0b3J5IHRoZVRhZ2xpYkZhY3RvcnkgPSAoVGFnbGliRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgidGFnbGliLnhtaSIpOyAKLQkJCWlmICh0aGVUYWdsaWJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlVGFnbGliRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBUYWdsaWJGYWN0b3J5SW1wbCgpOwotCX0KLQotCXB1YmxpYyBUYWdsaWJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCOiByZXR1cm4gY3JlYXRlVGFnTGliKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBRzogcmV0dXJuIGNyZWF0ZUpTUFRhZygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlSlNQVGFnQXR0cmlidXRlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SOiByZXR1cm4gY3JlYXRlVmFsaWRhdG9yKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFOiByZXR1cm4gY3JlYXRlSlNQVmFyaWFibGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTjogcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEU6IHJldHVybiBjcmVhdGVUYWdGaWxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTjogcmV0dXJuIGNyZWF0ZVRsZEV4dGVuc2lvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5CT0RZX0NPTlRFTlRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQm9keUNvbnRlbnRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRToKLQkJCQlyZXR1cm4gY3JlYXRlSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5CT0RZX0NPTlRFTlRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJvZHlDb250ZW50VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRToKLQkJCQlyZXR1cm4gY29udmVydEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi1wdWJsaWMgc3RhdGljIFRhZ2xpYkZhY3RvcnkgZ2V0QWN0aXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gKFRhZ2xpYkZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFRhZ0xpYiBjcmVhdGVUYWdMaWIoKSB7Ci0JCVRhZ0xpYkltcGwgdGFnTGliID0gbmV3IFRhZ0xpYkltcGwoKTsKLQkJcmV0dXJuIHRhZ0xpYjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLQkJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9ySW1wbCgpOwotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKU1BUYWcgY3JlYXRlSlNQVGFnKCkgewotCQlKU1BUYWdJbXBsIGpzcFRhZyA9IG5ldyBKU1BUYWdJbXBsKCk7Ci0JCXJldHVybiBqc3BUYWc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEpTUFRhZ0F0dHJpYnV0ZSBjcmVhdGVKU1BUYWdBdHRyaWJ1dGUoKSB7Ci0JCUpTUFRhZ0F0dHJpYnV0ZUltcGwganNwVGFnQXR0cmlidXRlID0gbmV3IEpTUFRhZ0F0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGpzcFRhZ0F0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSlNQVmFyaWFibGUgY3JlYXRlSlNQVmFyaWFibGUoKSB7Ci0JCUpTUFZhcmlhYmxlSW1wbCBqc3BWYXJpYWJsZSA9IG5ldyBKU1BWYXJpYWJsZUltcGwoKTsKLQkJcmV0dXJuIGpzcFZhcmlhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdW5jdGlvbiBjcmVhdGVGdW5jdGlvbigpIHsKLQkJRnVuY3Rpb25JbXBsIGZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uSW1wbCgpOwotCQlyZXR1cm4gZnVuY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0ZpbGUgY3JlYXRlVGFnRmlsZSgpIHsKLQkJVGFnRmlsZUltcGwgdGFnRmlsZSA9IG5ldyBUYWdGaWxlSW1wbCgpOwotCQlyZXR1cm4gdGFnRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGxkRXh0ZW5zaW9uIGNyZWF0ZVRsZEV4dGVuc2lvbigpIHsKLQkJVGxkRXh0ZW5zaW9uSW1wbCB0bGRFeHRlbnNpb24gPSBuZXcgVGxkRXh0ZW5zaW9uSW1wbCgpOwotCQlyZXR1cm4gdGxkRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb2R5Q29udGVudFR5cGUgY3JlYXRlQm9keUNvbnRlbnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUJvZHlDb250ZW50VHlwZSByZXN1bHQgPSBCb2R5Q29udGVudFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvZHlDb250ZW50VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIGNyZWF0ZUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSByZXN1bHQgPSBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFRhZ2xpYlBhY2thZ2UgZ2V0VGFnbGliUGFja2FnZSgpIHsKLQkJcmV0dXJuIChUYWdsaWJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWdsaWJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDlmMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBUYWdsaWJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFRhZ2xpYlBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YWdMaWJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwVGFnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWxpZGF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwVmFyaWFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZnVuY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFnRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0bGRFeHRlbnNpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5zaWJsZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBib2R5Q29udGVudFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIFRhZ2xpYlBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBUYWdsaWJGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWdsaWJQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChUYWdsaWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgVGFnbGliUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVRhZ2xpYlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVRhZ2xpYlBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYWdMaWIoKSB7Ci0JCXJldHVybiB0YWdMaWJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ0xpYlZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfSnNwVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYl9TaG9ydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX1RhZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJfVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0xpYl9GdW5jdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9WYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXZhbGlkYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9Jbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdmFsaWRhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXZhbGlkYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQVGFnKCkgewotCQlyZXR1cm4ganNwVGFnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ19Cb2R5Q29udGVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ19FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVGFnX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdfRHluYW1pY0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFRhZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFRhZ19WYXJpYWJsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfVGFnQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfVGVpQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFRhZ0F0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGpzcFRhZ0F0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVGFnQXR0cmlidXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVGFnQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQVmFyaWFibGUoKSB7Ci0JCXJldHVybiBqc3BWYXJpYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX05hbWVGcm9tQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9EZWNsYXJlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfVmFyaWFibGVDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZ1bmN0aW9uKCkgewotCQlyZXR1cm4gZnVuY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZ1bmN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGdW5jdGlvbl9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmdW5jdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnRmlsZSgpIHsKLQkJcmV0dXJuIHRhZ0ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0ZpbGVfUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX0V4YW1wbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnRmlsZV9UYWdFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGxkRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gdGxkRXh0ZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRsZEV4dGVuc2lvbl9OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2libGVUeXBlKCkgewotCQlyZXR1cm4gZXh0ZW5zaWJsZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlbnNpYmxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRCb2R5Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBib2R5Q29udGVudFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSgpIHsKLQkJcmV0dXJuIGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGFnbGliRmFjdG9yeSBnZXRUYWdsaWJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFRhZ2xpYkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJdGFnTGliRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19MSUIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX0pTUF9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1NIT1JUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVVJJKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1RBR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVkFMSURBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnTGliRUNsYXNzLCBUQUdfTElCX19GVU5DVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlMpOwotCi0JCWpzcFRhZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfVEFHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX0JPRFlfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX0FUVFJJQlVURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fVkFSSUFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX1RBR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19URUlfQ0xBU1MpOwotCi0JCWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfVEFHX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlMpOwotCi0JCXZhbGlkYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhWQUxJREFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZhbGlkYXRvckVDbGFzcywgVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZhbGlkYXRvckVDbGFzcywgVkFMSURBVE9SX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmFsaWRhdG9yRUNsYXNzLCBWQUxJREFUT1JfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJanNwVmFyaWFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1ZBUklBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19ERUNMQVJFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19TQ09QRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJZnVuY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRlVOQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19TSUdOQVRVUkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19GVU5DVElPTl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TKTsKLQotCQl0YWdGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdGaWxlRUNsYXNzLCBUQUdfRklMRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnRmlsZUVDbGFzcywgVEFHX0ZJTEVfX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0ZpbGVFQ2xhc3MsIFRBR19GSUxFX19FWEFNUExFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdGaWxlRUNsYXNzLCBUQUdfRklMRV9fVEFHX0VYVEVOU0lPTlMpOwotCi0JCXRsZEV4dGVuc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUTERfRVhURU5TSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0bGRFeHRlbnNpb25FQ2xhc3MsIFRMRF9FWFRFTlNJT05fX05BTUVTUEFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGxkRXh0ZW5zaW9uRUNsYXNzLCBUTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFMpOwotCi0JCWV4dGVuc2libGVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJsZVR5cGVFQ2xhc3MsIEVYVEVOU0lCTEVfVFlQRV9fVkFMVUUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlib2R5Q29udGVudFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEJPRFlfQ09OVEVOVF9UWVBFKTsKLQkJanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtID0gY3JlYXRlRUVudW0oSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUphdmFSZWZQYWNrYWdlIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl0YWdMaWJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJanNwVGFnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJanNwVGFnQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXZhbGlkYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlmdW5jdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXh0ZW5zaWJsZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHRhZ0xpYkVDbGFzcywgVGFnTGliLmNsYXNzLCAiVGFnTGliIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnTGliVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnTGliVmVyc2lvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0pzcFZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcFZlcnNpb24iLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9TaG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNob3J0TmFtZSIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVGFncygpLCB0aGlzLmdldEpTUFRhZygpLCBudWxsLCAidGFncyIsIG51bGwsIDEsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9WYWxpZGF0b3IoKSwgdGhpcy5nZXRWYWxpZGF0b3IoKSwgbnVsbCwgInZhbGlkYXRvciIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX0xpc3RlbmVycygpLCB0aGVDb21tb25QYWNrYWdlLmdldExpc3RlbmVyKCksIG51bGwsICJsaXN0ZW5lcnMiLCBudWxsLCAwLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfRnVuY3Rpb25zKCksIHRoaXMuZ2V0RnVuY3Rpb24oKSwgbnVsbCwgImZ1bmN0aW9ucyIsIG51bGwsIDAsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJ0YWdsaWJFeHRlbnNpb25zIiwgbnVsbCwgMCwgLTEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFRhZ0VDbGFzcywgSlNQVGFnLmNsYXNzLCAiSlNQVGFnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfQm9keUNvbnRlbnQoKSwgdGhpcy5nZXRCb2R5Q29udGVudFR5cGUoKSwgImJvZHlDb250ZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ19FeGFtcGxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZHluYW1pY0F0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0SlNQVGFnQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1ZhcmlhYmxlcygpLCB0aGlzLmdldEpTUFZhcmlhYmxlKCksIG51bGwsICJ2YXJpYWJsZXMiLCBudWxsLCAwLCAtMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdfVGFnQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0YWdDbGFzcyIsIG51bGwsIDEsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1RlaUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidGVpQ2xhc3MiLCBudWxsLCAxLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIkpTUFRhZ0F0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJ0RXhwclZhbHVlIiwgImZhbHNlIiwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZyYWdtZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdBdHRyaWJ1dGVfVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInR5cGUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHZhbGlkYXRvckVDbGFzcywgVmFsaWRhdG9yLmNsYXNzLCAiVmFsaWRhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ2YWxpZGF0b3JDbGFzcyIsIG51bGwsIDAsIDEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VmFsaWRhdG9yX0luaXRQYXJhbXMoKSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBWYWxpZGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BWYXJpYWJsZS5jbGFzcywgIkpTUFZhcmlhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVHaXZlbiIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZUZyb21BdHRyaWJ1dGUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfRGVjbGFyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlY2xhcmUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfU2NvcGUoKSwgdGhpcy5nZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCksICJzY29wZSIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidmFyaWFibGVDbGFzcyIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZnVuY3Rpb25FQ2xhc3MsIEZ1bmN0aW9uLmNsYXNzLCAiRnVuY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaWduYXR1cmUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZnVuY3Rpb25DbGFzcyIsIG51bGwsIDEsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgImZ1bmN0aW9uRXh0ZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0ZpbGVFQ2xhc3MsIFRhZ0ZpbGUuY2xhc3MsICJUYWdGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX1BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhdGgiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX0V4YW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgInRhZ0V4dGVuc2lvbnMiLCBudWxsLCAwLCAtMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRsZEV4dGVuc2lvbkVDbGFzcywgVGxkRXh0ZW5zaW9uLmNsYXNzLCAiVGxkRXh0ZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2libGVUeXBlKCksIG51bGwsICJleHRlbnNpb25FbGVtZW50cyIsIG51bGwsIDEsIC0xLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleHRlbnNpYmxlVHlwZUVDbGFzcywgRXh0ZW5zaWJsZVR5cGUuY2xhc3MsICJFeHRlbnNpYmxlVHlwZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5jbGFzcywgIkJvZHlDb250ZW50VHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5UQUdERVBFTkRFTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLkpTUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJvZHlDb250ZW50VHlwZUVFbnVtLCBCb2R5Q29udGVudFR5cGUuRU1QVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLlNDUklQVExFU1NfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5jbGFzcywgIkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5ORVNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfQkVHSU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfRU5EX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9UYWdsaWJQYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UbGRFeHRlbnNpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UbGRFeHRlbnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTFkOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGxkRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGxkIEV4dGVuc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbCNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbCNnZXRFeHRlbnNpb25FbGVtZW50cyA8ZW0+RXh0ZW5zaW9uIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGxkRXh0ZW5zaW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRsZEV4dGVuc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZSgpIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZSgpIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2UgPSBOQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbnNpb25FbGVtZW50cygpIDxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbnNpb25FbGVtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGxkRXh0ZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuVExEX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5ld05hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFLCBvbGROYW1lc3BhY2UsIG5hbWVzcGFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbnNpb25FbGVtZW50cygpIHsKLQkJaWYgKGV4dGVuc2lvbkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWV4dGVuc2lvbkVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuc2libGVUeXBlLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuc2lvbkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbnNpb25FbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRToKLQkJCQlzZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUzoKLQkJCQlnZXRFeHRlbnNpb25FbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFOgotCQkJCXNldE5hbWVzcGFjZShOQU1FU1BBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRToKLQkJCQlyZXR1cm4gTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2UgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgotCQkJCXJldHVybiBleHRlbnNpb25FbGVtZW50cyAhPSBudWxsICYmICFleHRlbnNpb25FbGVtZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lc3BhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RsZEV4dGVuc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1ZhbGlkYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1ZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhNDZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci0KLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyB2YWxpZGF0b3JDbGFzcyA9IG51bGw7Ci0JcHVibGljIFZhbGlkYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5WQUxJREFUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgdmFsaWRhdG9yQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZhbGlkYXRvckNsYXNzID0gKEludGVybmFsRU9iamVjdCl2YWxpZGF0b3JDbGFzczsKLQkJCXZhbGlkYXRvckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFZhbGlkYXRvckNsYXNzKTsKLQkJCWlmICh2YWxpZGF0b3JDbGFzcyAhPSBvbGRWYWxpZGF0b3JDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MsIG9sZFZhbGlkYXRvckNsYXNzLCB2YWxpZGF0b3JDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhKYXZhQ2xhc3MgbmV3VmFsaWRhdG9yQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZFZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0JCXZhbGlkYXRvckNsYXNzID0gbmV3VmFsaWRhdG9yQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MsIG9sZFZhbGlkYXRvckNsYXNzLCB2YWxpZGF0b3JDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluaXRQYXJhbS5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRWYWxpZGF0b3JDbGFzcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlzZXRWYWxpZGF0b3JDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6Ci0JCQkJc2V0VmFsaWRhdG9yQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXM9bnVsbDsKLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0VmFsaWRhdG9yQ2xhc3M9ZmFsc2U7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0NDA2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGFnbGliQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgVGFnbGliUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgVGFnbGliQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBUYWdsaWJTd2l0Y2ggc3cgPSBuZXcgVGFnbGliU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3IoVmFsaWRhdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhbGlkYXRvckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWcoSlNQVGFnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0FkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGUoSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZShKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYWdsaWJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgVGFnbGliU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliKFRhZ0xpYiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnTGliQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnKEpTUFRhZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQVGFnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnQXR0cmlidXRlKEpTUFRhZ0F0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQVGFnQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yKFZhbGlkYXRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVmFyaWFibGUoSlNQVmFyaWFibGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFZhcmlhYmxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRnVuY3Rpb24oRnVuY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnRmlsZShUYWdGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYWdGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGxkRXh0ZW5zaW9uKFRsZEV4dGVuc2lvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGxkRXh0ZW5zaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJsZVR5cGUoRXh0ZW5zaWJsZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2libGVUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBdHRyaWJ1dGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uIDxlbT5GdW5jdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRnVuY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlIDxlbT5UYWcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIDxlbT5UbGQgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGxkRXh0ZW5zaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUgPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJsZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVGFnbGliQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYlN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWJkODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBUYWdsaWJTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFnbGliUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRhZ2xpYkZhY3RvcnkgZmFjdG9yeTsKLQotCXB1YmxpYyBUYWdsaWJTd2l0Y2goKSB7Ci0JCWZhY3RvcnkgPSAoVGFnbGliRmFjdG9yeSlUYWdsaWJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQltb2RlbFBhY2thZ2UgPSBUYWdsaWJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCSAgICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgICBpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSAhPSBtb2RlbFBhY2thZ2UpIHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgCi0JCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQjoKLQkJCSAgICB7Ci0JCQkJVGFnTGliIGNhc3RlZE9iamVjdCA9IChUYWdMaWIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0xpYihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SOgotCQkJICAgIHsKLQkJCQlWYWxpZGF0b3IgY2FzdGVkT2JqZWN0ID0gKFZhbGlkYXRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsaWRhdG9yKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJICAgIH0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHOgotCQkJICAgIHsKLQkJCQlKU1BUYWcgY2FzdGVkT2JqZWN0ID0gKEpTUFRhZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQVGFnKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJICAgIH0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURToKLQkJCSAgICB7Ci0JCQkJSlNQVGFnQXR0cmlidXRlIGNhc3RlZE9iamVjdCA9IChKU1BUYWdBdHRyaWJ1dGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFRhZ0F0dHJpYnV0ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFOgotCQkJICAgIHsKLQkJCQlKU1BWYXJpYWJsZSBjYXN0ZWRPYmplY3QgPSAoSlNQVmFyaWFibGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFZhcmlhYmxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJICAgIH0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0gLy8gZG9Td2l0Y2gKLQotCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZVZhbGlkYXRvcihWYWxpZGF0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZyhKU1BUYWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZ0F0dHJpYnV0ZShKU1BUYWdBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUpTUFZhcmlhYmxlKEpTUFZhcmlhYmxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoR2VuKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQjogewotCQkJCVRhZ0xpYiB0YWdMaWIgPSAoVGFnTGliKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWIodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCh0YWdMaWIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh0YWdMaWIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHOiB7Ci0JCQkJSlNQVGFnIGpzcFRhZyA9IChKU1BUYWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFRhZyhqc3BUYWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoanNwVGFnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqc3BUYWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURTogewotCQkJCUpTUFRhZ0F0dHJpYnV0ZSBqc3BUYWdBdHRyaWJ1dGUgPSAoSlNQVGFnQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUYWdBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqc3BUYWdBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1I6IHsKLQkJCQlWYWxpZGF0b3IgdmFsaWRhdG9yID0gKFZhbGlkYXRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodmFsaWRhdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFOiB7Ci0JCQkJSlNQVmFyaWFibGUganNwVmFyaWFibGUgPSAoSlNQVmFyaWFibGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFZhcmlhYmxlKGpzcFZhcmlhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqc3BWYXJpYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OOiB7Ci0JCQkJRnVuY3Rpb24gZnVuY3Rpb24gPSAoRnVuY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZ1bmN0aW9uKGZ1bmN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGZ1bmN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChmdW5jdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFOiB7Ci0JCQkJVGFnRmlsZSB0YWdGaWxlID0gKFRhZ0ZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0ZpbGUodGFnRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cCh0YWdGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh0YWdGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTjogewotCQkJCVRsZEV4dGVuc2lvbiB0bGRFeHRlbnNpb24gPSAoVGxkRXh0ZW5zaW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUbGRFeHRlbnNpb24odGxkRXh0ZW5zaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh0bGRFeHRlbnNpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5FWFRFTlNJQkxFX1RZUEU6IHsKLQkJCQlFeHRlbnNpYmxlVHlwZSBleHRlbnNpYmxlVHlwZSA9IChFeHRlbnNpYmxlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZVR5cGUoZXh0ZW5zaWJsZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGV4dGVuc2libGVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJHZW4oVGFnTGliIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3JHZW4oVmFsaWRhdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdHZW4oSlNQVGFnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGVHZW4oSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZUdlbihKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGdW5jdGlvbihGdW5jdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdGaWxlKFRhZ0ZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRsZEV4dGVuc2lvbihUbGRFeHRlbnNpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlVHlwZShFeHRlbnNpYmxlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2VHZW4oRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVGFnbGliU3dpdGNoCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aENvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTI1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4gVGhlIHJvbGUgdXNlZCBoZXJlIG11c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdXRoQ29uc3RyYWludCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgYXV0aCBjb25zdHJhaW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlcyBhdHRyaWJ1dGUKLQkgKiBBIGxpc3Qgb2Ygcm9sZSBuYW1lcyBmb3IgdGhlIGF1dGggY29uc3RyYWludC4gIEVhY2ggZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgKiBvZiBhIHNlY3VyaXR5IHJvbGUgKGEgU3RyaW5nKS4KLQotCSAqLwotCUVMaXN0IGdldFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCVNlY3VyaXR5Q29uc3RyYWludCBnZXRTZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhNZXRob2RLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFhYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhNZXRob2RLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLS8qKgotICogCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEF1dGhNZXRob2RLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNJQyA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHRVNUID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfQ0VSVCA9IDQ7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+VU5TUEVDSUZJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTlNQRUNJRklFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTlNQRUNJRklFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgVU5TUEVDSUZJRURfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChVTlNQRUNJRklFRCwgIlVOU1BFQ0lGSUVEIiwgIlVOU1BFQ0lGSUVEIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QkFTSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CQVNJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCQVNJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQkFTSUNfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChCQVNJQywgIkJBU0lDIiwgIkJBU0lDIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RElHRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RElHRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RJR0VTVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgRElHRVNUX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoRElHRVNULCAiRElHRVNUIiwgIkRJR0VTVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZPUk08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GT1JNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZPUk0KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIEZPUk1fTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChGT1JNLCAiRk9STSIsICJGT1JNIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xJRU5UIENFUlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DTElFTlQgQ0VSVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDTElFTlRfQ0VSVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQ0xJRU5UX0NFUlRfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChDTElFTlRfQ0VSVCwgIkNMSUVOVF9DRVJUIiwgIkNMSUVOVF9DRVJUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEF1dGhNZXRob2RLaW5kW10gewotCQkJVU5TUEVDSUZJRURfTElURVJBTCwKLQkJCUJBU0lDX0xJVEVSQUwsCi0JCQlESUdFU1RfTElURVJBTCwKLQkJCUZPUk1fTElURVJBTCwKLQkJCUNMSUVOVF9DRVJUX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2QgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2QgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoTWV0aG9kS2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUF1dGhNZXRob2RLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2QgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhNZXRob2RLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQXV0aE1ldGhvZEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoTWV0aG9kS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6IHJldHVybiBVTlNQRUNJRklFRF9MSVRFUkFMOwotCQkJY2FzZSBCQVNJQzogcmV0dXJuIEJBU0lDX0xJVEVSQUw7Ci0JCQljYXNlIERJR0VTVDogcmV0dXJuIERJR0VTVF9MSVRFUkFMOwotCQkJY2FzZSBGT1JNOiByZXR1cm4gRk9STV9MSVRFUkFMOwotCQkJY2FzZSBDTElFTlRfQ0VSVDogcmV0dXJuIENMSUVOVF9DRVJUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEF1dGhNZXRob2RLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9BdXRoTWV0aG9kS2luZAotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQ29udGV4dFBhcmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Db250ZXh0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYTU4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Db250ZXh0UGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotICogQHNpbmNlIDEuMAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRQYXJhbSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUGFyYW1OYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFBhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFBhcmFtTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtVmFsdWUgYXR0cmlidXRlCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCVN0cmluZyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFyYW1WYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRGlzcGF0Y2hlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDA2YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRGlzcGF0Y2hlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXREaXNwYXRjaGVyVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpc3BhdGNoZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZPUldBUkRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOQ0xVREVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUVTVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVFU1RfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1QgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFUlJPUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRk9SV0FSRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgRk9SV0FSRF9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKEZPUldBUkQsICJGT1JXQVJEIiwgIkZPUldBUkQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTkNMVURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTkNMVURFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBJTkNMVURFX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoSU5DTFVERSwgIklOQ0xVREUiLCAiSU5DTFVERSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVFU1QKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIFJFUVVFU1RfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShSRVFVRVNULCAiUkVRVUVTVCIsICJSRVFVRVNUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFUlJPUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgRVJST1JfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShFUlJPUiwgIkVSUk9SIiwgIkVSUk9SIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRGlzcGF0Y2hlclR5cGVbXSB7Ci0JCQlGT1JXQVJEX0xJVEVSQUwsCi0JCQlJTkNMVURFX0xJVEVSQUwsCi0JCQlSRVFVRVNUX0xJVEVSQUwsCi0JCQlFUlJPUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BhdGNoZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRk9SV0FSRDogcmV0dXJuIEZPUldBUkRfTElURVJBTDsKLQkJCWNhc2UgSU5DTFVERTogcmV0dXJuIElOQ0xVREVfTElURVJBTDsKLQkJCWNhc2UgUkVRVUVTVDogcmV0dXJuIFJFUVVFU1RfTElURVJBTDsKLQkJCWNhc2UgRVJST1I6IHJldHVybiBFUlJPUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXNwYXRjaGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vRGlzcGF0Y2hlclR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yQ29kZUVycm9yUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXJyb3JDb2RlRXJyb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjA1MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXJyb3JDb2RlRXJyb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JDb2RlRXJyb3JQYWdlIGV4dGVuZHMgRXJyb3JQYWdlewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBFcnJvckNvZGUgYXR0cmlidXRlCi0JICogVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLQkgKi8KLQlTdHJpbmcgZ2V0RXJyb3JDb2RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXJyb3JDb2RlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RXJyb3JDb2RlKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZiYTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZSBvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFcnJvclBhZ2UgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLXB1YmxpYyBib29sZWFuIGlzRXJyb3JDb2RlKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvblR5cGUoKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTG9jYXRpb24gYXR0cmlidXRlCi0JICogVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgd2ViCi0JICogYXBwbGljYXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb2NhdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FeGNlcHRpb25UeXBlRXJyb3JQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FeGNlcHRpb25UeXBlRXJyb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTBmYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgZXh0ZW5kcyBFcnJvclBhZ2UgewotCi0KLQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvblR5cGVOYW1lKCkgOwotdm9pZCBzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcgZXhjZXB0aW9uVHlwZU5hbWUpIDsKLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIEBsaW5reyNzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcpfQotICovCi12b2lkIHNldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSwgUmVzb3VyY2VTZXQgY29udGV4dCkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEV4Y2VwdGlvblR5cGUgcmVmZXJlbmNlCi0JICogVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbgotCSAqIHR5cGUuCi0JICovCi0JSmF2YUNsYXNzIGdldEV4Y2VwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEV4Y2VwdGlvblR5cGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFeGNlcHRpb25UeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiNmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQotcHVibGljIFN0cmluZyBnZXRGaWx0ZXJDbGFzc05hbWUoKTsKLXB1YmxpYyB2b2lkIHNldEZpbHRlckNsYXNzTmFtZShTdHJpbmcgZmlsdGVyQ2xhc3NOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW5pdFBhcmFtcyByZWZlcmVuY2VzCi0JICogVGhlIGluaXQtcGFyYW1zIGNvbnRhaW4gYSBuYW1lLy92YWx1ZSBwYWlycyBhcyBpbml0aWFsaXphdGlvbiBwYXJhbXMgZm9yIHRoZQotCSAqIGZpbHRlcgotCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRmlsdGVyQ2xhc3MgcmVmZXJlbmNlCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RmlsdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEZpbHRlckNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RmlsdGVyQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW0gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbSBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAqICAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtIFZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlck1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlck1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDY1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXJNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgPGZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIDxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCi0gKiBAaW52YXJpYW50IFRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgRmlsdGVyOjpuYW1lIG9mIG9uZSBvZiB0aGUgRmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbHRlck1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCB0aGF0IHRoaXMgbWFwcGluZyBhcHBsaWVzIHRvLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCk7Ci0vKioKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHNlcnZsZXROYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCVN0cmluZyBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlfS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSIgdXBwZXI9IjQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpc3BhdGNoZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBGaWx0ZXIgcmVmZXJlbmNlCi0JICogVGhlIGZpbHRlciBiZWluZyBtYXBwZWQKLQkgKi8KLQlGaWx0ZXIgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWx0ZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICogQW4gb3B0aW9uYWwgc2VydmxldCB0aGF0IGlzIG1hcHBlZCBieSBhIGZpbHRlciBtYXBwaW5nLiAgc2VydmxldE5hbWUgaXMgdXNlZCB0byAKLQkgKiByZXNvbHZlIHRoZSBzZXJ2bGV0IHJlZmVyZW5jZS4KLQkgKi8KLQlTZXJ2bGV0IGdldFNlcnZsZXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRm9ybUxvZ2luQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Gb3JtTG9naW5Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmMTUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Gb3JtTG9naW5Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvcm1Mb2dpbkNvbmZpZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRm9ybUxvZ2luUGFnZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAgd2hlcmUgdGhlIHBhZ2UKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybUxvZ2luUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEZvcm1Mb2dpblBhZ2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRGb3JtTG9naW5QYWdlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRm9ybUVycm9yUGFnZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIAotCSAqIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEZvcm1FcnJvclBhZ2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRGb3JtRXJyb3JQYWdlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NDRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqICBAZGVwcmVjYXRlZCBzaW5jZSA0LzI1LzIwMDMgdXNlIGxpc3Qgb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn0KLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZSNnZXRIdHRwTWV0aG9kIDxlbT5IdHRwIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldEhUVFBNZXRob2RUeXBlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQTWV0aG9kVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh0dHBNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHR0cE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGUjZ2V0SHR0cE1ldGhvZCA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIdHRwTWV0aG9kKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSFRUUE1ldGhvZFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0hUVFBNZXRob2RUeXBlRW51bS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGVFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDU3NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRUUE1ldGhvZFR5cGVFbnVtIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjR0VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UE9TVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BPU1RfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1QgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVVQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREVMRVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEVBRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hFQURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQUQgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU9OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09QVElPTlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTlMgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VFJBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0UgPSA2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNMID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFTElORV9DT05UUk9MID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5EID0gOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS0lOID0gMTA7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLT1VUID0gMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUwgPSAxMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVJHRSA9IDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1LQUNUSVZJVFkgPSAxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNS1dPUktTUEFDRSA9IDE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQklORCA9IDE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9SVCA9IDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSCA9IDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQklORCA9IDE5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ0hFQ0tPVVQgPSAyMDsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFID0gMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9DT05UUk9MID0gMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNLID0gMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllFID0gMjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMID0gMjU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09QWSA9IDI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SUkVTUE9OU0UgPSAyNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WSVRFID0gMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DSyA9IDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgPSAzMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNS0NPTCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkUgPSAzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RJRlkgPSAzNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkFDSyA9IDM1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BGSU5EID0gMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUFBBVENIID0gMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVklTSU9OQUxSRVNQT05TRSA9IDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0ggPSAzOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURJUkVDVFJFU1BPTlNFID0gNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHSVNURVIgPSA0MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUID0gNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0UgPSA0MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTUkVTUE9OU0UgPSA0NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkxPQ0sgPSA0NTsKLQkKLQkKLQkKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5HRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjR0VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gR0VUX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEdFVCwgIkdFVCIsICJHRVQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QT1NUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UE9TVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQT1NUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUE9TVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQT1NULCAiUE9TVCIsICJQT1NUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BVVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBVVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQVVQsICJQVVQiLCAiUFVUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RFTEVURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIERFTEVURV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShERUxFVEUsICJERUxFVEUiLCAiREVMRVRFIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkhFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSEVBRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEhFQURfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oSEVBRCwgIkhFQUQiLCAiSEVBRCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJT05TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09QVElPTlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBPUFRJT05TX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE9QVElPTlMsICJPUFRJT05TIiwgIk9QVElPTlMiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UUkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRSQUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RSQUNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gVFJBQ0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oVFJBQ0UsICJUUkFDRSIsICJUUkFDRSIpOy8vJE5PTi1OTFMtMSQKLQotCS8vV0VCREFWIHN1cHBvcnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBBQ0tfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQUNLLCAiQUNLIiwgIkFDSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBBQ0xfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQUNMLCAiQUNMIiwgIkFDTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBCQVNFTElORV9DT05UUk9MX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEJBU0VMSU5FX0NPTlRST0wsICJCQVNFTElORS1DT05UUk9MIiwgIkJBU0VMSU5FLUNPTlRST0wiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gQklORF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShCSU5ELCAiQklORCIsICJCSU5EIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEJZRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShCWUUsICJCWUUiLCAiQllFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIENBTkNFTF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShDQU5DRUwsICJDQU5DRUwiLCAiQ0FOQ0VMIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIENIRUNLSU5fTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQ0hFQ0tJTiwgIkNIRUNLSU4iLCAiQ0hFQ0tJTiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBDSEVDS09VVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShDSEVDS09VVCwgIkNIRUNLT1VUIiwgIkNIRUNLT1VUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEVSUk9SUkVTUE9OU0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oRVJST1JSRVNQT05TRSwgIkVSUk9SUkVTUE9OU0UiLCAiRVJST1JSRVNQT05TRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBJTkZPX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKElORk8sICJJTkZPIiwgIklORk8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gSU5WSVRFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKElOVklURSwgIklOVklURSIsICJJTlZJVEUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTEFCRUxfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oTEFCRUwsICJMQUJFTCIsICJMQUJFTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBMT0NLX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKExPQ0ssICJMT0NLIiwgIkxPQ0siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTUVSR0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oTUVSR0UsICJNRVJHRSIsICJNRVJHRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBNRVNTQUdFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE1FU1NBR0UsICJNRVNTQUdFIiwgIk1FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTUtBQ1RJVklUWV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShNS0FDVElWSVRZLCAiTUtBQ1RJVklUWSIsICJNS0FDVElWSVRZIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIE1LQ09MX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE1LQ09MLCAiTUtDT0wiLCAiTUtDT0wiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTUtXT1JLU1BBQ0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oTUtXT1JLU1BBQ0UsICJNS1dPUktTUEFDRSIsICJNS1dPUktTUEFDRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBNT1ZFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE1PVkUsICJNT1ZFIiwgIk1PVkUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTk9USUZZX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE5PVElGWSwgIk5PVElGWSIsICJOT1RJRlkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUFJBQ0tfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFJBQ0ssICJQUkFDSyIsICJQUkFDSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQUk9QRklORF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQUk9QRklORCwgIlBST1BGSU5EIiwgIlBST1BGSU5EIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBST1BQQVRDSF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQUk9QUEFUQ0gsICJQUk9QUEFUQ0giLCAiUFJPUFBBVENIIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBST1ZJU0lPTkFMUkVTUE9OU0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFJPVklTSU9OQUxSRVNQT05TRSwgIlBST1ZJU0lPTkFMUkVTUE9OU0UiLCAiUFJPVklTSU9OQUxSRVNQT05TRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQVUJMSVNIX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFBVQkxJU0gsICJQVUJMSVNIIiwgIlBVQkxJU0giKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUkVCSU5EX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFJFQklORCwgIlJFQklORCIsICJSRUJJTkQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUkVESVJFQ1RSRVNQT05TRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRURJUkVDVFJFU1BPTlNFLCAiUkVESVJFQ1RSRVNQT05TRSIsICJSRURJUkVDVFJFU1BPTlNFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFR0lTVEVSX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFJFR0lTVEVSLCAiUkVHSVNURVIiLCAiUkVHSVNURVIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUkVQT1JUX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFJFUE9SVCwgIlJFUE9SVCIsICJSRVBPUlQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUkVRVUVTVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRVFVRVNULCAiUkVRVUVTVCIsICJSRVFVRVNUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFU1BPTlNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFJFU1BPTlNFLCAiUkVTUE9OU0UiLCAiUkVTUE9OU0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gU0VBUkNIX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFNFQVJDSCwgIlNFQVJDSCIsICJTRUFSQ0giKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gU1VDQ0VTU1JFU1BPTlNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFNVQ0NFU1NSRVNQT05TRSwgIlNVQ0NFU1NSRVNQT05TRSIsICJTVUNDRVNTUkVTUE9OU0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gVU5CSU5EX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFVOQklORCwgIlVOQklORCIsICJVTkJJTkQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gVU5DSEVDS09VVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShVTkNIRUNLT1VULCAiVU5DSEVDS09VVCIsICJVTkNIRUNLT1VUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFVOTE9DS19MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShVTkxPQ0ssICJVTkxPQ0siLCAiVU5MT0NLIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFVQREFURV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShVUERBVEUsICJVUERBVEUiLCAiVVBEQVRFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFZFUlNJT05fQ09OVFJPTF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShWRVJTSU9OX0NPTlRST0wsICJWRVJTSU9OLUNPTlRST0wiLCAiVkVSU0lPTi1DT05UUk9MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIENPUFlfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQ09QWSwgIkNPUFkiLCAiQ09QWSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBIVFRQTWV0aG9kVHlwZUVudW1bXSB7Ci0JCQlHRVRfTElURVJBTCwKLQkJCVBPU1RfTElURVJBTCwKLQkJCVBVVF9MSVRFUkFMLAotCQkJREVMRVRFX0xJVEVSQUwsCi0JCQlIRUFEX0xJVEVSQUwsCi0JCQlPUFRJT05TX0xJVEVSQUwsCi0JCQlUUkFDRV9MSVRFUkFMLAotCQkJLy9XRUJEQVYgc3VwcG9ydAotCQkJQUNLX0xJVEVSQUwsCi0JCQlBQ0xfTElURVJBTCwKLQkJCUJBU0VMSU5FX0NPTlRST0xfTElURVJBTCwKLQkJCUJJTkRfTElURVJBTCwKLQkJCUJZRV9MSVRFUkFMLAotCQkJQ0FOQ0VMX0xJVEVSQUwsCi0JCQlDSEVDS0lOX0xJVEVSQUwsCi0JCQlDSEVDS09VVF9MSVRFUkFMLAotCQkJQ09QWV9MSVRFUkFMLAotCQkJRVJST1JSRVNQT05TRV9MSVRFUkFMLAotCQkJSU5GT19MSVRFUkFMLAotCQkJSU5WSVRFX0xJVEVSQUwsCi0JCQlMQUJFTF9MSVRFUkFMLAotCQkJTE9DS19MSVRFUkFMLAotCQkJTUVSR0VfTElURVJBTCwKLQkJCU1FU1NBR0VfTElURVJBTCwKLQkJCU1LQUNUSVZJVFlfTElURVJBTCwKLQkJCU1LQ09MX0xJVEVSQUwsCi0JCQlNS1dPUktTUEFDRV9MSVRFUkFMLAotCQkJTU9WRV9MSVRFUkFMLAotCQkJTk9USUZZX0xJVEVSQUwsCi0JCQlQUkFDS19MSVRFUkFMLAotCQkJUFJPUEZJTkRfTElURVJBTCwKLQkJCVBST1BQQVRDSF9MSVRFUkFMLAotCQkJUFJPVklTSU9OQUxSRVNQT05TRV9MSVRFUkFMLAotCQkJUFVCTElTSF9MSVRFUkFMLAotCQkJUkVCSU5EX0xJVEVSQUwsCi0JCQlSRURJUkVDVFJFU1BPTlNFX0xJVEVSQUwsCi0JCQlSRUdJU1RFUl9MSVRFUkFMLAotCQkJUkVQT1JUX0xJVEVSQUwsCi0JCQlSRVFVRVNUX0xJVEVSQUwsCi0JCQlSRVNQT05TRV9MSVRFUkFMLAotCQkJU0VBUkNIX0xJVEVSQUwsCi0JCQlTVUNDRVNTUkVTUE9OU0VfTElURVJBTCwKLQkJCVVOQklORF9MSVRFUkFMLAotCQkJVU5DSEVDS09VVF9MSVRFUkFMLAotCQkJVU5MT0NLX0xJVEVSQUwsCi0JCQlVUERBVEVfTElURVJBTCwKLQkJCVZFUlNJT05fQ09OVFJPTF9MSVRFUkFMCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRUUE1ldGhvZFR5cGVFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSFRUUE1ldGhvZFR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRUUE1ldGhvZFR5cGVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSFRUUE1ldGhvZFR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBIVFRQTWV0aG9kVHlwZUVudW0gZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEdFVDogcmV0dXJuIEdFVF9MSVRFUkFMOwotCQkJY2FzZSBQT1NUOiByZXR1cm4gUE9TVF9MSVRFUkFMOwotCQkJY2FzZSBQVVQ6IHJldHVybiBQVVRfTElURVJBTDsKLQkJCWNhc2UgREVMRVRFOiByZXR1cm4gREVMRVRFX0xJVEVSQUw7Ci0JCQljYXNlIEhFQUQ6IHJldHVybiBIRUFEX0xJVEVSQUw7Ci0JCQljYXNlIE9QVElPTlM6IHJldHVybiBPUFRJT05TX0xJVEVSQUw7Ci0JCQljYXNlIFRSQUNFOiByZXR1cm4gVFJBQ0VfTElURVJBTDsKLQkJCS8vV0VCREFWIHN1cHBvcnQKLQkJCWNhc2UgQUNLIDogcmV0dXJuIEFDS19MSVRFUkFMOyAKLQkJCWNhc2UgQUNMIDogcmV0dXJuIEFDTF9MSVRFUkFMOwotCQkJY2FzZSBCQVNFTElORV9DT05UUk9MIDogcmV0dXJuIEJBU0VMSU5FX0NPTlRST0xfTElURVJBTDsKLQkJCWNhc2UgQklORCA6IHJldHVybiBCSU5EX0xJVEVSQUw7Ci0JCQljYXNlIEJZRSA6IHJldHVybiBCWUVfTElURVJBTDsKLQkJCWNhc2UgQ0FOQ0VMIDogcmV0dXJuIENBTkNFTF9MSVRFUkFMOwotCQkJY2FzZSBDSEVDS0lOIDogcmV0dXJuIENIRUNLSU5fTElURVJBTDsKLQkJCWNhc2UgQ0hFQ0tPVVQgOiByZXR1cm4gQ0hFQ0tPVVRfTElURVJBTDsKLQkJCWNhc2UgQ09QWSA6IHJldHVybiBDT1BZX0xJVEVSQUw7ICAKLQkJCWNhc2UgRVJST1JSRVNQT05TRSA6IHJldHVybiBFUlJPUlJFU1BPTlNFX0xJVEVSQUw7Ci0JCQljYXNlIElORk8gOiByZXR1cm4gSU5GT19MSVRFUkFMOwotCQkJY2FzZSBJTlZJVEUgOiByZXR1cm4gSU5WSVRFX0xJVEVSQUw7Ci0JCQljYXNlIExBQkVMIDogcmV0dXJuIExBQkVMX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0sgOiByZXR1cm4gTE9DS19MSVRFUkFMOwkJCSAKLQkJCWNhc2UgTUVSR0UgOiByZXR1cm4gTUVSR0VfTElURVJBTDsKLQkJCWNhc2UgTUVTU0FHRSA6IHJldHVybiBNRVNTQUdFX0xJVEVSQUw7Ci0JCQljYXNlIE1LQUNUSVZJVFkgOiByZXR1cm4gTUtBQ1RJVklUWV9MSVRFUkFMOwotCQkJY2FzZSBNS0NPTCA6IHJldHVybiBNS0NPTF9MSVRFUkFMOwkJCSAKLQkJCWNhc2UgTUtXT1JLU1BBQ0UgOiByZXR1cm4gTUtXT1JLU1BBQ0VfTElURVJBTDsKLQkJCWNhc2UgTU9WRSA6IHJldHVybiBNT1ZFX0xJVEVSQUw7CQkgCi0JCQljYXNlIE5PVElGWSA6IHJldHVybiBOT1RJRllfTElURVJBTDsKLQkJCWNhc2UgUFJBQ0sgOiByZXR1cm4gUFJBQ0tfTElURVJBTDsKLQkJCWNhc2UgUFJPUEZJTkQgOiByZXR1cm4gUFJPUEZJTkRfTElURVJBTDsKLQkJCWNhc2UgUFJPUFBBVENIIDogcmV0dXJuIFBST1BQQVRDSF9MSVRFUkFMOwotCQkJY2FzZSBQUk9WSVNJT05BTFJFU1BPTlNFIDogcmV0dXJuIFBST1ZJU0lPTkFMUkVTUE9OU0VfTElURVJBTDsKLQkJCWNhc2UgUFVCTElTSCA6IHJldHVybiBQVUJMSVNIX0xJVEVSQUw7Ci0JCQljYXNlIFJFQklORCA6IHJldHVybiBSRUJJTkRfTElURVJBTDsKLQkJCWNhc2UgUkVESVJFQ1RSRVNQT05TRSA6IHJldHVybiBSRURJUkVDVFJFU1BPTlNFX0xJVEVSQUw7Ci0JCQljYXNlIFJFR0lTVEVSIDogcmV0dXJuIFJFR0lTVEVSX0xJVEVSQUw7Ci0JCQljYXNlIFJFUE9SVCA6IHJldHVybiBSRVBPUlRfTElURVJBTDsKLQkJCWNhc2UgUkVRVUVTVCA6IHJldHVybiBSRVFVRVNUX0xJVEVSQUw7Ci0JCQljYXNlIFJFU1BPTlNFIDogcmV0dXJuIFJFU1BPTlNFX0xJVEVSQUw7Ci0JCQljYXNlIFNFQVJDSCA6IHJldHVybiBTRUFSQ0hfTElURVJBTDsKLQkJCWNhc2UgU1VDQ0VTU1JFU1BPTlNFIDogcmV0dXJuIFNVQ0NFU1NSRVNQT05TRV9MSVRFUkFMOwotCQkJY2FzZSBVTkJJTkQgOiByZXR1cm4gVU5CSU5EX0xJVEVSQUw7Ci0JCQljYXNlIFVOQ0hFQ0tPVVQgOiByZXR1cm4gVU5DSEVDS09VVF9MSVRFUkFMOwotCQkJY2FzZSBVTkxPQ0sgOiByZXR1cm4gVU5MT0NLX0xJVEVSQUw7IAotCQkJY2FzZSBVUERBVEUgOiByZXR1cm4gVVBEQVRFX0xJVEVSQUw7Ci0JCQljYXNlIFZFUlNJT05fQ09OVFJPTCA6IHJldHVybiBWRVJTSU9OX0NPTlRST0xfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSFRUUE1ldGhvZFR5cGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9IVFRQTWV0aG9kVHlwZUVudW0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0luaXRQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSW5pdFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDM4YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSW5pdFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0UGFyYW0gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtTmFtZSBhdHRyaWJ1dGUKLQkgKiAKLQkgKiAKLQotCSAqLwotCVN0cmluZyBnZXRQYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQYXJhbU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbVZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFyYW1WYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9KU1BUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9KU1BUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyM2Y0ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSlNQVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVHlwZSBleHRlbmRzIFdlYlR5cGV7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEpzcEZpbGUgYXR0cmlidXRlCi0JICogVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbiB0aGUgd2ViCi0JICogYXBwbGljYXRpb24uCi0KLQkgKi8KLQlTdHJpbmcgZ2V0SnNwRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEpzcEZpbGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRKc3BGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2NhbEVuY29kaW5nTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkZjM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2NhbEVuY29kaW5nTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvY2FsRW5jb2RpbmdNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRMb2NhbGUgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbmNvZGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIExvY2FsRW5jb2RpbmdNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI1Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0I2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0KLX0gLy8gTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2dpbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9naW5Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5YmQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2dpbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLSAqIG1lY2hhbmlzbS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dpbkNvbmZpZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQXV0aE1ldGhvZCBhdHRyaWJ1dGUKLQkgKiBUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGZvcgotCSAqIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzCi0JICogd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUKLQkgKiBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIAotCSAqICJCQVNJQyIsICJESUdFU1QiLCAiRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0JICovCi0JQXV0aE1ldGhvZEtpbmQgZ2V0QXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kCi0JICogQHNlZSAjaXNTZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldEF1dGhNZXRob2QoKQotCSAqIEBzZWUgI2dldEF1dGhNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhNZXRob2QoQXV0aE1ldGhvZEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZyNnZXRBdXRoTWV0aG9kIDxlbT5BdXRoIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZyNnZXRBdXRoTWV0aG9kIDxlbT5BdXRoIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF1dGhNZXRob2QoKQotCSAqIEBzZWUgI2dldEF1dGhNZXRob2QoKQotCSAqIEBzZWUgI3NldEF1dGhNZXRob2QoQXV0aE1ldGhvZEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRoTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVhbG1OYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQIEJhc2ljCi0JICogYXV0aG9yaXphdGlvbgotCSAqLwotCVN0cmluZyBnZXRSZWFsbU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZWFsbU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZWFsbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcml6YXRpb24gTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRob3JpemF0aW9uTWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2dpbkNvbmZpZ19BdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcml6YXRpb25NZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnI2dldEF1dGhvcml6YXRpb25NZXRob2QgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9yaXphdGlvbk1ldGhvZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRm9ybUxvZ2luQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCUZvcm1Mb2dpbkNvbmZpZyBnZXRGb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEZvcm1Mb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTWltZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL01pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjlkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTWltZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24gYW5kIGEgbWltZSB0eXBlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1pbWVNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBFeHRlbnNpb24gYXR0cmlidXRlCi0JICogVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCSAqLwotCVN0cmluZyBnZXRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFeHRlbnNpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBNaW1lVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZTogInRleHQvL3BsYWluIgotCSAqLwotCVN0cmluZyBnZXRNaW1lVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE1pbWVUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9SZXNBdXRoU2VydmxldFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Jlc0F1dGhTZXJ2bGV0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQwOWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Jlc0F1dGhTZXJ2bGV0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoU2VydmxldFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWTEVUID0gMTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05UQUlORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DT05UQUlORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoU2VydmxldFR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFNlcnZsZXRUeXBlKENPTlRBSU5FUiwgIkNPTlRBSU5FUiIsICJDT05UQUlORVIiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoU2VydmxldFR5cGUgU0VSVkxFVF9MSVRFUkFMID0gbmV3IFJlc0F1dGhTZXJ2bGV0VHlwZShTRVJWTEVULCAiU0VSVkxFVCIsICJTRVJWTEVUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aFNlcnZsZXRUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJlc0F1dGhTZXJ2bGV0VHlwZVtdIHsKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQkJU0VSVkxFVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggU2VydmxldCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhTZXJ2bGV0VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhTZXJ2bGV0VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhTZXJ2bGV0VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhTZXJ2bGV0VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggU2VydmxldCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFNlcnZsZXRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBDT05UQUlORVI6IHJldHVybiBDT05UQUlORVJfTElURVJBTDsKLQkJCWNhc2UgU0VSVkxFVDogcmV0dXJuIFNFUlZMRVRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzQXV0aFNlcnZsZXRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXNBdXRoU2VydmxldFR5cGUKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1JvbGVOYW1lVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUm9sZU5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDI5NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUm9sZU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlTmFtZVR5cGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJvbGVOYW1lIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJvbGVOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VjdXJpdHlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZWVhMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VjdXJpdHlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlDb25zdHJhaW50IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkaXNwbGF5TmFtZXMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFdlYlJlc291cmNlQ29sbGVjdGlvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEF1dGhDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCUF1dGhDb25zdHJhaW50IGdldEF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQXV0aENvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBVc2VyRGF0YUNvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0JVXNlckRhdGFDb25zdHJhaW50IGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVzZXJEYXRhQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDNjZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLQotLyoqCi0gKiBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIHRoZSBtYXBwaW5ncyB0aGF0IHRoaXMKLQkgKiBzZXJ2bGV0IHBhcnRpY2lwYXRlcyBpbi4gIFNpbmNlIHNlcnZsZXRNYXBwaW5ncyBpcyBub3QKLQkgKiBhIGJpLWRpcmVjdGlvbmFsIGF0dHJpYnV0ZSwgaWYgeW91IHdhbnQgdG8gYWRkIG9yIGRlbGV0ZSBhCi0JICogbWFwcGluZywgdGhpcyBtdXN0IGJlIGRvbmUgaW4gdGhlIHdlYi1hcHAuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1hcHBpbmdzKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgU2VydmxldCBwYXJhbWV0ZXJzIGluICBqYXZhLnV0aWwuUHJvcGVydGllcwotCSAqIEByZXR1cm4gamF2YS51dGlsLlByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQYXJhbXNBc1Byb3BlcnRpZXMoKSA7Ci0JLyoqCi0JICogRml4IHRoZSByb2xlLWxpbmsgb24gYW55IGNvbnRhaW5lZCByb2xlIHJlZnMKLQkgKiBAcGFyYW0gZXhpc3RpbmdSb2xlTmFtZSBleGlzdGluZyByb2xlIG5hbWUKLQkgKiBAcGFyYW0gbmV3Um9sZU5hbWUgbmV3IHJvbGUgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlU3luY1NlY3VyaXR5Um9sZVJlZihTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU2VydmxldE5hbWUgYXR0cmlidXRlCi0JICogVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgc2VydmxldC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmxldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZXJ2bGV0TmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTG9hZE9uU3RhcnR1cCBhdHRyaWJ1dGUKLQkgKiBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgb24gdGhlIAotCSAqIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlIGVsZW1lbnQgbXVzdCBiZQotCSAqIGEgcG9zaXRpdmUgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLgotCSAqIExvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIGhpZ2hlciBpbnRlZ2Vycy4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCBvcgotCSAqIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgCi0JICogaXQgYXQgYW55IHRpbWUgaW4gdGhlIHN0YXJ0dXAgc2VxdWVuY2UuCi0KLQkgKi8KLQlJbnRlZ2VyIGdldExvYWRPblN0YXJ0dXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjdW5zZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2FkT25TdGFydHVwKEludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldExvYWRPblN0YXJ0dXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCNnZXRMb2FkT25TdGFydHVwIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI3NldExvYWRPblN0YXJ0dXAoSW50ZWdlcikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViVHlwZSByZWZlcmVuY2UKLQkgKi8KLQlXZWJUeXBlIGdldFdlYlR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJUeXBlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViVHlwZShXZWJUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGFyYW1zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlSb2xlUmVmcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUnVuQXMgcmVmZXJlbmNlCi0JICogSWYgZGVmaW5lZCBmb3IgYSBzZXJ2bGV0LCBvdmVycmlkZXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHVzZWQgdG8gY2FsbCBhbiBFSkIKLQkgKiBieSB0aGF0IHNlcnZsZXQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSByb2xlLW5hbWUgaXMgb25lIG9mIHRoZSBzZWN1cml0eQotCSAqIHJvbGVzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0JICovCi0JUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBnZXRSdW5BcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJ1bkFzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UnVuQXMoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0U2VydmxldF9Jbml0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGphdmEgc2VydmxldCBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2bGV0Ci0JICogQHJldHVybiByZWZlcmVuY2UgdG8gSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2bGV0Q2xhc3MoKTsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0TWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMjA3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4KLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2bGV0TWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCVN0cmluZyBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi0JICogc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JICogYXBwbGljYXRpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFNlcnZsZXRNYXBwaW5nX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICovCi0JU2VydmxldCBnZXRTZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VydmxldCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlcnZsZXQoU2VydmxldCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MmMyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldFR5cGUgZXh0ZW5kcyBXZWJUeXBlewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDbGFzc05hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENsYXNzTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2Vzc2lvbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2Vzc2lvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE5NGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Nlc3Npb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgc2Vzc2lvbi1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICogQHNpbmNlIDEuMAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25Db25maWcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNlc3Npb25UaW1lb3V0IGF0dHJpYnV0ZQotCSAqIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IKLQkgKiBhbGwgc2Vzc2lvbnMgY3JlYXRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUKLQkgKiBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgKi8KLQlpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZXNzaW9uVGltZW91dCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25UaW1lb3V0KGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVGltZW91dChpbnQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0U2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZyNnZXRTZXNzaW9uVGltZW91dCA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVGltZW91dCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UaW1lb3V0KGludCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRTZXNzaW9uVGltZW91dCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RhZ0xpYlJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVGFnTGliUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjFiNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVGFnTGliUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCi0gKiBAdmVyc2lvbiBzaW5jZSBKMkVFMS40IGRlcHJlY2F0ZWQsIHVzZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qc3AuVGFnTGliUmVmCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnTGliUmVmIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUYWdsaWJVUkkgYXR0cmlidXRlCi0JICogVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgd2ViLnhtbCAKLQkgKiBkb2N1bWVudCwgaWRlbnRpZnlpbmcgYSBUYWcgTGlicmFyeSB1c2VkIGluIHRoZSBXZWIgQXBwbGljYXRpb24uCi0JICovCi0JU3RyaW5nIGdldFRhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRhZ2xpYlVSSSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFRhZ2xpYlVSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRhZ2xpYkxvY2F0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8KLQkgKiB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUKLQkgKiBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRhZ2xpYkxvY2F0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXZWJBcHAoV2ViQXBwKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFRhZ0xpYlJlZl9XZWJBcHAoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFRhZ0xpYnMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InRhZ0xpYnMiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZiNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5ZmY2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotLyoqCi0gKkBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR1JBTCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklERU5USUFMID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIE5PTkVfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKE5PTkUsICJOT05FIiwgIk5PTkUiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVHUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVHUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIElOVEVHUkFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShJTlRFR1JBTCwgIklOVEVHUkFMIiwgIklOVEVHUkFMIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTkZJREVOVElBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBDT05GSURFTlRJQUxfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKENPTkZJREVOVElBTCwgIkNPTkZJREVOVElBTCIsICJDT05GSURFTlRJQUwiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVbXSB7Ci0JCQlOT05FX0xJVEVSQUwsCi0JCQlJTlRFR1JBTF9MSVRFUkFMLAotCQkJQ09ORklERU5USUFMX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORTogcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgSU5URUdSQUw6IHJldHVybiBJTlRFR1JBTF9MSVRFUkFMOwotCQkJY2FzZSBDT05GSURFTlRJQUw6IHJldHVybiBDT05GSURFTlRJQUxfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVVJMUGF0dGVyblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1VSTFBhdHRlcm5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjRjM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVVJMUGF0dGVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjUvMjAwMyB1c2UgbGlzdCBvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9ufSAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlI2dldFVybFBhdHRlcm4gPGVtPlVybCBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZSNnZXRSZXNDb2xsZWN0aW9uIDxlbT5SZXMgQ29sbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFVSTFBhdHRlcm5UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSTFBhdHRlcm5UeXBlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVcmxQYXR0ZXJuIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJlc0NvbGxlY3Rpb24gcmVmZXJlbmNlCi0JICovCi0JV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGdldFJlc0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZXNDb2xsZWN0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVzQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVXNlckRhdGFDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMzY3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotICogQHNpbmNlIDEuMAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJEYXRhQ29uc3RyYWludCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVzZXIgZGF0YSBjb25zdHJhaW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc3BvcnRHdWFyYW50ZWUgYXR0cmlidXRlCi0JICogVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNsaWVudCAKLQkgKiBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IgQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlCi0JICogYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkKLQkgKiB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcwotCSAqIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdAotCSAqIGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzCi0JICogdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tCi0JICogb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlCi0JICogSU5URUdSQUwgb3IgQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLgotCSAqLwotCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlY0NvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0JU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWJhZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci0KLS8qKgotICogVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgotICogYSB3ZWIgYXBwbGljYXRpb24uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViQXBwIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIFNlY3VyaXR5Um9sZSB3aXRoIHRoZSBuYW1lIHBhc3NlZAotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIFNlY3VyaXR5Um9sZQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVycm9yUGFnZSBpZiBpdCBoYXMgdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlCi0JICogQHBhcmFtIGNvZGUgdGhlIGVycm9yIGNvZGUKLQkgKiBAcmV0dXJuIHJlZmVybmNlIHRvIEVycm9yUGFnZQotCSAqLwotCUVycm9yUGFnZSBnZXRFcnJvclBhZ2VCeUNvZGUoSW50ZWdlciBjb2RlKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBFcnJvclBhZ2UgZ2l2ZW4gYW4gZXhjZXB0aW9uVHlwZQotCSAqIEBwYXJhbSBleGNlcHRpb25UeXBlIHRoZSBqYXZhIEV4Y2VwdGlvbiBUeXBlCi0JICogQHJldHVybiByZWZlcm5jZSB0byBFcnJvclBhZ2UKLQkgKi8KLQlFcnJvclBhZ2UgZ2V0RXJyb3JQYWdlQnlFeGNlcHRpb25UeXBlKFN0cmluZyBleGNlcHRpb25UeXBlKSA7Ci0JLyoqCi0JICogRmluZHMgYSBmaWx0ZXIgbWFwcGluZyBmb3IgYSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEBwYXJhbSBhRmlsdGVyIFRoZSBmaWx0ZXIgdG8gZmluZCB0aGUgbWFwcGluZ3MgZm9yLgotCSAqIEByZXR1cm4gVGhlIGZpbHRlciBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciwgb3IgbnVsbCBpZiBubwotCSAqIG1hcHBpbmcgZXhpc3RzIGZvciB0aGUgZmlsdGVyLgotCSAqLwotCi0JRmlsdGVyTWFwcGluZyBnZXRGaWx0ZXJNYXBwaW5nKEZpbHRlciBhRmlsdGVyKTsKLQkKLQkvKioKLQkgKiBHZXRzIHJlZmVybmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBGaWx0ZXIgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBGaWx0ZXIgdG8gbG9vayBmb3IKLQkgKiBAcmV0dXJuIHJlZmVybmNlIHRvIHRlaCBGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGdldEZpbHRlck5hbWVkKFN0cmluZyBuYW1lKTsKLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiB0aGUgZmlsdGVycyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBmaWx0ZXIgbmFtZXMgKFN0cmluZ3MpLgotCSAqLwotCi0JTGlzdCBnZXRGaWx0ZXJOYW1lcygpIDsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGV4dGVuc2lvbiB0byBmaW5kIHRoZSBtaW1lIHR5cGUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlCi0JICovCi0JU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBleHRlbnNpb24pOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNlY3VyaXR5Um9sZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqIEBwYXJhbSByb2xlTmFtZSB0aGUgbmFtZSBvZiB0aGUgU2VjdXJpdHlSb2xlIHRvIGJlIHNlYXJjaGVkIGZvcgotCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgU2VjdXJpdHlSb2xlCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgcm9sZU5hbWUpOwotCQotCS8qKgotCSAqIEZpbmRzIGEgc2VydmxldCBtYXBwaW5nIGZvciBhIHNwZWNpZmllZCBzZXJ2bGV0LgotCSAqIEBwYXJhbSBhU2VydmxldCBUaGUgc2VydmxldCB0byBmaW5kIHRoZSBtYXBwaW5ncyBmb3IuCi0JICogQHJldHVybiBUaGUgc2VydmxldCBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZsZXQsIG9yIG51bGwgaWYgbm8KLQkgKiBtYXBwaW5nIGV4aXN0cyBmb3IgdGhlIHNlcnZsZXQuCi0JICovCi0JU2VydmxldE1hcHBpbmcgZ2V0U2VydmxldE1hcHBpbmcoU2VydmxldCBhU2VydmxldCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIFNlcnZsZXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIFNlcnZsZXQgdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgU2VydmxldAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXROYW1lZChTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgdGhlIHNlcnZsZXRzIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIHNlcnZsZXQgbmFtZXMgKFN0cmluZ3MpLgotCSAqLwotCUxpc3QgZ2V0U2VydmxldE5hbWVzKCkgOwotCS8qKgotCSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBXZWIgQXBwIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBTZXJ2bGV0Mi4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yXzJEZXNjcmlwdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFdlYiBBcHAgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIFNlcnZsZXQyLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfM0Rlc2NyaXB0b3IoKTsKLQkvKioKLQkgKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgaWYgaXQgZXhpc3RzOyBmb3IgZWFjaCBzZXJ2bGV0LCBmaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUKLQkgKiByZWZzCi0JICogQHBhcmFtIGV4aXN0aW5nUm9sZU5hbWUgY3VyZW50IHNlY3VyaXR5IHJvbGUgbmFtZQotCSAqIEBwYXJhbSBuZXdSb2xlTmFtZSBuZXcgc2VjdXJpdHkgcm9sZSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZQotCSAqIFRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvCi0JICogYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQgY29udGFpbmVyCi0JICovCi0JYm9vbGVhbiBpc0Rpc3RyaWJ1dGFibGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2lzRGlzdHJpYnV0YWJsZSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREaXN0cmlidXRhYmxlKCkKLQkgKiBAc2VlICNpc0Rpc3RyaWJ1dGFibGUoKQotCSAqIEBzZWUgI3NldERpc3RyaWJ1dGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERpc3RyaWJ1dGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2lzRGlzdHJpYnV0YWJsZSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGlzdHJpYnV0YWJsZSgpCi0JICogQHNlZSAjaXNEaXN0cmlidXRhYmxlKCkKLQkgKiBAc2VlICNzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREaXN0cmlidXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYkFwcF9WZXJzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKkB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZCBpbiBmaW5kaW5nIHRoZSAKLQkgKm1vZHVsZSB2ZXJzaW9uLiAJKiAKLQkqIEByZXR1cm4gdGhlIG1vZHVsZSB2ZXJzaW9uIGlkIHJlcHJlc2VudGVkIGluIHRoZSBpbnQgZS5nLiAyMiwgMjMsIDI0Ci0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCS8qKgotCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAotCSAqQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgYSBwcm9ibGVtIGlzIGVuY291bnRlcmVkIGluIGZpbmRpbmcgdGhlIAotCSAqajJlZSB2ZXJzaW9uLiAKLQkgKkByZXR1cm4gdGhlIGoyZWUgdmVyc2lvbiByZXByZXNlbnRlZCBpbiB0aGUgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ29udGV4dHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbnRleHRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVycm9yUGFnZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEVycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEZpbGVMaXN0IHJlZmVyZW5jZQotCSAqLwotCVdlbGNvbWVGaWxlTGlzdCBnZXRGaWxlTGlzdCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgOiBVc2UgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byBFTGlzdAotCSAqLwotCUVMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFRhZ0xpYnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFRhZ0xpYnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ29uc3RyYWludHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvZ2luQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNaW1lTWFwcGluZ3MgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1pbWVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU2Vzc2lvbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlTZXNzaW9uQ29uZmlnIGdldFNlc3Npb25Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZXNzaW9uQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VydmxldE1hcHBpbmdzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VydmxldHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFNlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlY3VyaXR5Um9sZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmlsdGVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RmlsdGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBGaWx0ZXJNYXBwaW5ncyByZWZlcmVuY2VzCi0JICogRmlsdGVyIG1hcHBpbmdzIGRlZmluZWQgZm9yIHRoZSB3ZWIgYXBwCi0JICovCi0JRUxpc3QgZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTGlzdGVuZXJzIHJlZmVyZW5jZXMKLQkgKiBUaGUgbGlzdGVuZXJzIGNvbGxlY3Rpb24gY29udGFpbnMgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYiBhcHBsaWNhdGlvbgotCSAqIGxpc3RlbmVyIGJlYW5zIGluIHRoZSB3ZWIgYXBwLgotCSAqLwotCUVMaXN0IGdldExpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGV4dCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRleHQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYkFwcF9Db250ZXh0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb250ZXh0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kc3AgQ29uZmlnPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SnNwQ29uZmlnKEpTUENvbmZpZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJBcHBfSnNwQ29uZmlnKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpTUENvbmZpZyBnZXRKc3BDb25maWcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRKc3BDb25maWcgPGVtPkpzcCBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpzcCBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpzcENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SnNwQ29uZmlnKEpTUENvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHBSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc3NzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViQXBwUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG1vZGVsIG9iamVjdCBXZWJBcHAKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byAgbW9kZWwgb2JqZWN0IFdlYkFwcAotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIHN1cHBvcnRzIHRoZSBXZWIgMi4yIHNwZWMuCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JYm9vbGVhbiBpc1dlYjJfMigpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2Ugc3VwcG9ydHMgdGhlIFdlYiAyLjMgc3BlYy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzV2ViMl8zKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBzdXBwb3J0cyB0aGUgV2ViIDIuNCBzcGVjLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaXNXZWIyXzQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNjg1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIFRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQgb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBBZGRzIGluc3RhbmNlIG9mIEhUVFBNZXRob2RUeXBlCi0JICogQHBhcmFtIGh0dHBNZXRob2QgbmFtZSBvZiB0aGUgaHR0cE1ldGhvZCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIVFRQKFN0cmluZyBodHRwTWV0aG9kKTsKLQkKLQkvKioKLQkgKiBBZGRzIGluc3RhbmNlIG9mIFVSTFBhdHRlcm5UeXBlCi0JICogQHBhcmFtIHVybFBhdHRlcm4gbmFtZSBvZiB0aGUgdXJsIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFVSTChTdHJpbmcgdXJsUGF0dGVybik7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFdlYlJlc291cmNlTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbgotCSAqLwotCVN0cmluZyBnZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJSZXNvdXJjZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRXZWJSZXNvdXJjZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFVybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtfS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEh0dHBNZXRob2QoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIDogVXNlIGdldEh0dHBNZXRob2QoKTsKLQkgKiBAcmV0dXJuIExpc3Qgb2YgSHR0cE1ldGhvZHMKLQkgKi8KLQlFTGlzdCBnZXRIVFRQcygpOwotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlY0NvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0JCi0JCi0JU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBVUkxzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRVUkxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU4N2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBkZW5vdGVzIGEgSlNQCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKc3BUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGRlbm90ZXMgYSBzZXJ2bGV0Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSgpOwotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjUwMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViQXBwIHZhbHVlCi0JICovCi0JV2ViQXBwIGNyZWF0ZVdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250ZXh0UGFyYW0gdmFsdWUKLQkgKi8KLQlDb250ZXh0UGFyYW0gY3JlYXRlQ29udGV4dFBhcmFtKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVycm9yUGFnZSB2YWx1ZQotCSAqLwotCUVycm9yUGFnZSBjcmVhdGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXhjZXB0aW9uVHlwZUVycm9yUGFnZSB2YWx1ZQotCSAqLwotCUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFcnJvckNvZGVFcnJvclBhZ2UgdmFsdWUKLQkgKi8KLQlFcnJvckNvZGVFcnJvclBhZ2UgY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlbGNvbWVGaWxlTGlzdCB2YWx1ZQotCSAqLwotCVdlbGNvbWVGaWxlTGlzdCBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2VsY29tZUZpbGUgdmFsdWUKLQkgKi8KLQlXZWxjb21lRmlsZSBjcmVhdGVXZWxjb21lRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUYWdMaWJSZWYgdmFsdWUKLQkgKi8KLQlUYWdMaWJSZWYgY3JlYXRlVGFnTGliUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Q29uc3RyYWludCB2YWx1ZQotCSAqLwotCVNlY3VyaXR5Q29uc3RyYWludCBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHZhbHVlCi0JICovCi0JV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBVUkxQYXR0ZXJuVHlwZSB2YWx1ZQotCSAqLwotCVVSTFBhdHRlcm5UeXBlIGNyZWF0ZVVSTFBhdHRlcm5UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEF1dGhDb25zdHJhaW50IHZhbHVlCi0JICovCi0JQXV0aENvbnN0cmFpbnQgY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVXNlckRhdGFDb25zdHJhaW50IHZhbHVlCi0JICovCi0JVXNlckRhdGFDb25zdHJhaW50IGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBMb2dpbkNvbmZpZyB2YWx1ZQotCSAqLwotCUxvZ2luQ29uZmlnIGNyZWF0ZUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZvcm1Mb2dpbkNvbmZpZyB2YWx1ZQotCSAqLwotCUZvcm1Mb2dpbkNvbmZpZyBjcmVhdGVGb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWltZU1hcHBpbmcgdmFsdWUKLQkgKi8KLQlNaW1lTWFwcGluZyBjcmVhdGVNaW1lTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXNzaW9uQ29uZmlnIHZhbHVlCi0JICovCi0JU2Vzc2lvbkNvbmZpZyBjcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlcnZsZXRNYXBwaW5nIHZhbHVlCi0JICovCi0JU2VydmxldE1hcHBpbmcgY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VydmxldCB2YWx1ZQotCSAqLwotCVNlcnZsZXQgY3JlYXRlU2VydmxldCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0VHlwZSB2YWx1ZQotCSAqLwotCVNlcnZsZXRUeXBlIGNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpTUFR5cGUgdmFsdWUKLQkgKi8KLQlKU1BUeXBlIGNyZWF0ZUpTUFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSW5pdFBhcmFtIHZhbHVlCi0JICovCi0JSW5pdFBhcmFtIGNyZWF0ZUluaXRQYXJhbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWx0ZXIgdmFsdWUKLQkgKi8KLQlGaWx0ZXIgY3JlYXRlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpbHRlck1hcHBpbmcgdmFsdWUKLQkgKi8KLQlGaWx0ZXJNYXBwaW5nIGNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9jYWxFbmNvZGluZ01hcHBpbmcgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SFRUUCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SFRUUCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUE1ldGhvZFR5cGUgY3JlYXRlSFRUUE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUm9sZU5hbWVUeXBlIHZhbHVlCi0JICovCi0JUm9sZU5hbWVUeXBlIGNyZWF0ZVJvbGVOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgZ2V0V2ViYXBwbGljYXRpb25QYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMmFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoJQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ3ZWJhcHBsaWNhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFAgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1JFU09VUkNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0VKQl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0VKQl9MT0NBTF9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0RJU1RSSUJVVEFCTEUgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0NPTlRFWFRTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19FUlJPUl9QQUdFUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRklMRV9MSVNUID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19UQUdfTElCUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fQ09OU1RSQUlOVFMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0xPR0lOX0NPTkZJRyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19TRVJWTEVUUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRklMVEVSUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0xJU1RFTkVSUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19DT05URVhUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnNwIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0pTUF9DT05GSUcgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRleHQgUGFyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVJST1JfUEFHRSA9IDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0UgPSAyMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9FUlJPUl9QQUdFID0gMjM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUID0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFID0gMjE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfUkVGID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVCA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEUgPSAxOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRSA9IDI4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UID0gMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UID0gMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPR0lOX0NPTkZJRyA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJRyA9IDE0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNSU1FX01BUFBJTkcgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJRyA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElORyA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVQgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19TRVJWTEVUX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fV0VCX1RZUEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19SVU5fQVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0lOSVRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZsZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19fRVhURU5TSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19fTUlNRV9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbWUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUX19GSUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX1BBR0VfX0xPQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX1BBR0VfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FcnJvciBQYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVSUk9SX1BBR0VfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfUkVGX19UQUdMSUJfVVJJID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IVFQgUHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX1JPTEVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JpemF0aW9uIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0QgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvZ2luIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9UWVBFID0gMTY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfVFlQRSA9IDE3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKU1BfVFlQRSA9IDE4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUX1BBUkFNID0gMTU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRfUEFSQU1fX1BBUkFNX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FID0gV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfVFlQRV9GRUFUVVJFX0NPVU5UID0gV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RZUEVfX0pTUF9GSUxFID0gV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SlNQIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RZUEVfRkVBVFVSRV9DT1VOVCA9IFdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VVJMIFBhdHRlcm4gVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVIgPSAyNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkcgPSAyNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUk9MRV9OQU1FX1RZUEUgPSAyMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgTmFtZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTkFNRV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0xPQ0FUSU9OID0gRVJST1JfUEFHRV9fTE9DQVRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX1dFQl9BUFAgPSBFUlJPUl9QQUdFX19XRUJfQVBQOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFID0gRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRV9fTE9DQVRJT04gPSBFUlJPUl9QQUdFX19MT0NBVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQID0gRVJST1JfUEFHRV9fV0VCX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREUgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FcnJvciBDb2RlIEVycm9yIFBhZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9FUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fRklMVEVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19TRVJWTEVUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0lOSVRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0ZJTFRFUl9DTEFTUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GaWx0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZSA8ZW0+UmVzIEF1dGggU2VydmxldCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRSZXNBdXRoU2VydmxldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTX0FVVEhfU0VSVkxFVF9UWVBFID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bSA8ZW0+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRIVFRQTWV0aG9kVHlwZUVudW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRV9FTlVNID0gMzA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFID0gMzE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldERpc3BhdGNoZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU1BBVENIRVJfVFlQRSA9IDMyOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kIDxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEF1dGhNZXRob2RLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFVVEhfTUVUSE9EX0tJTkQgPSAzMzsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAid2ViYXBwbGljYXRpb24ueG1pIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViYXBwbGljYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYkFwcCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJBcHBfVmVyc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnRleHRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRXJyb3JQYWdlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfVGFnTGlicygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldENvbnRleHRQYXJhbXMgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRDb250ZXh0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRKc3BDb25maWcgPGVtPkpzcCBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Kc3AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldEpzcENvbmZpZygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfSnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250ZXh0UGFyYW0gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbnRleHRQYXJhbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBOYW1lCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuIFZhbHVlCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fUGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBEZXNjcmlwdGlvbgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuIFdlYkFwcAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFcnJvclBhZ2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBMb2NhdGlvbgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuIFdlYkFwcAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXJyb3JQYWdlX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFeGNlcHRpb25UeXBlRXJyb3JQYWdlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFcnJvckNvZGVFcnJvclBhZ2Ugb2JqZWN0Ci0JICovCi0JLyoqCi0JICogQHJldHVybiBFcnJvckNvZGVFcnJvclBhZ2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVycm9yQ29kZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBFcnJvckNvZGUKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2VsY29tZUZpbGVMaXN0IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWxjb21lRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVMaXN0X1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWxjb21lRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGFnTGliUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRUYWdMaWJSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZfVGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZiNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+V2ViIEFwcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZiNnZXRXZWJBcHAoKQotCSAqIEBzZWUgI2dldFRhZ0xpYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliUmVmX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVybFBhdHRlcm4oKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZCA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2QoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VVJMcyA8ZW0+VVIgTHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yNS8yMDAzIHVzZSB7QGxpbmsgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCl9Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVSIExzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVSTHMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRIVFRQcyA8ZW0+SFRUIFBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjUvMjAwMyB1c2Uge0BsaW5rICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpfQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IVFQgUHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SFRUUHMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0hUVFBzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVSTFBhdHRlcm5UeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRVUkxQYXR0ZXJuVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSFRUUE1ldGhvZFR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEhUVFBNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZSNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRIVFRQTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBdXRoQ29uc3RyYWludCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gRGVzY3JpcHRpb24KLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuIFJvbGVzCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBTZWNDb25zdHJhaW50IG9iamVjdAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEF1dGhDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVXNlckRhdGFDb25zdHJhaW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBMb2dpbkNvbmZpZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCA8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnI2dldEF1dGhvcml6YXRpb25NZXRob2QoKQotCSAqIEBzZWUgI2dldExvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19BdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvZ2luQ29uZmlnX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRm9ybUxvZ2luQ29uZmlnIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1pbWVNYXBwaW5nIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNaW1lTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWltZU1hcHBpbmdfV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlc3Npb25Db25maWcgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlc3Npb25Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQ29uZmlnX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0TWFwcGluZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmxldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZsZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlcnZsZXQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlcnZsZXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9XZWJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfUGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1J1bkFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0I2dldEluaXRQYXJhbXMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfSW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWJUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlcnZsZXRUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2bGV0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlNQVHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUeXBlX0pzcEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSW5pdFBhcmFtIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRJbml0UGFyYW0oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmlsdGVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWx0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyI2dldEluaXRQYXJhbVZhbHVlcyA8ZW0+SW5pdCBQYXJhbSBWYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgUGFyYW0gVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyI2dldEluaXRQYXJhbVZhbHVlcygpCi0JICogQHNlZSAjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpbHRlck1hcHBpbmcgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEZpbHRlck1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZyNnZXREaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nI2dldERpc3BhdGNoZXJUeXBlKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRMb2NhbGUoKQotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5jb2Rpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZygpCi0JICogQHNlZSAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZSA8ZW0+UmVzIEF1dGggU2VydmxldCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVzIEF1dGggU2VydmxldCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUmVzQXV0aFNlcnZsZXRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFJlc0F1dGhTZXJ2bGV0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0gPGVtPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRIVFRQTWV0aG9kVHlwZUVudW0oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUm9sZU5hbWVUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSb2xlTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RGlzcGF0Y2hlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQgPGVtPkF1dGggTWV0aG9kIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0QXV0aE1ldGhvZEtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCA8ZW0+V2ViIEFwcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRXZWJBcHAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfQVBQX19ESVNUUklCVVRBQkxFID0gZUlOU1RBTkNFLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0NPTlRFWFRTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9Db250ZXh0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19GSUxFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbGVMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWcgTGliczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fVEFHX0xJQlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1RhZ0xpYnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19DT05TVFJBSU5UUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfQ29uc3RyYWludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0xPR0lOX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbWUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX01JTUVfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRVNTSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VSVkxFVFMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0ZJTFRFUlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0xpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fSlNQX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfSnNwQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkNvbnRleHRQYXJhbUltcGwgPGVtPkNvbnRleHQgUGFyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkNvbnRleHRQYXJhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0Q29udGV4dFBhcmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFWFRfUEFSQU0gPSBlSU5TVEFOQ0UuZ2V0Q29udGV4dFBhcmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRSA9IGVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URVhUX1BBUkFNX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2VydmxldEltcGwgPGVtPlNlcnZsZXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFNlcnZsZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVkxFVCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWTEVUX19TRVJWTEVUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBPbiBTdGFydHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1dFQl9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfV2ViVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9QYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVuIEFzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fUlVOX0FTID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfUnVuQXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19JTklUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2VydmxldE1hcHBpbmdJbXBsIDxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRTZXJ2bGV0TWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWTEVUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9NQVBQSU5HX19OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfTUFQUElOR19fU0VSVkxFVCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsIDxlbT5TZXNzaW9uIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2Vzc2lvbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0U2Vzc2lvbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVNTSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTWltZU1hcHBpbmdJbXBsIDxlbT5NaW1lIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRNaW1lTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSU1FX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTUVfTUFQUElOR19fRVhURU5TSU9OID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUlNRV9NQVBQSU5HX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWxjb21lRmlsZUxpc3RJbXBsIDxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRXZWxjb21lRmlsZUxpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VMQ09NRV9GSUxFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFTENPTUVfRklMRV9MSVNUX19GSUxFID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVycm9yUGFnZUltcGwgPGVtPkVycm9yIFBhZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVycm9yUGFnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RXJyb3JQYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVSUk9SX1BBR0UgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVSUk9SX1BBR0VfX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9Mb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFUlJPUl9QQUdFX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuVGFnTGliUmVmSW1wbCA8ZW0+VGFnIExpYiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0VGFnTGliUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBR19MSUJfUkVGID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfUkVGX19UQUdMSUJfVVJJID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBR19MSUJfUkVGX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZl9XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCA8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFJlc291cmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWMgQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVSIExzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IVFQgUHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0hUVFBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0QXV0aENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVVUSF9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBVVRIX0NPTlNUUkFJTlRfX1JPTEVTID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X1JvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWMgQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVU0VSX0RBVEFfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFID0gZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlYyBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsIDxlbT5Mb2dpbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRMb2dpbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFsbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9HSU5fQ09ORklHX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Gb3JtTG9naW5Db25maWdJbXBsIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRGb3JtTG9naW5Db25maWcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRk9STV9MT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gb3JtIExvZ2luIFBhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFID0gZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gb3JtIEVycm9yIFBhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFID0gZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbCA8ZW0+SW5pdCBQYXJhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRJbml0UGFyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5JVF9QQVJBTSA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUX1BBUkFNX19QQVJBTV9OQU1FID0gZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYlR5cGVJbXBsIDxlbT5XZWIgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2ViVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfVFlQRSA9IGVJTlNUQU5DRS5nZXRXZWJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRUeXBlSW1wbCA8ZW0+U2VydmxldCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5TZXJ2bGV0VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0U2VydmxldFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVkxFVF9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZsZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZsZXRUeXBlX0NsYXNzTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5KU1BUeXBlSW1wbCA8ZW0+SlNQIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkpTUFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEpTUFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SnNwIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVFlQRV9fSlNQX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVHlwZV9Kc3BGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlVSTFBhdHRlcm5UeXBlSW1wbCA8ZW0+VVJMIFBhdHRlcm4gVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuVVJMUGF0dGVyblR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFVSTFBhdHRlcm5UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFVSTF9QQVRURVJOX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VVJMUGF0dGVyblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzIENvbGxlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0VVJMUGF0dGVyblR5cGVfUmVzQ29sbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Sb2xlTmFtZVR5cGVJbXBsIDxlbT5Sb2xlIE5hbWUgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuUm9sZU5hbWVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRSb2xlTmFtZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZU5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FID0gZUlOU1RBTkNFLmdldFJvbGVOYW1lVHlwZV9Sb2xlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWxjb21lRmlsZUltcGwgPGVtPldlbGNvbWUgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlbGNvbWVGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFTENPTUVfRklMRSA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2VsY29tZSBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGUgTGlzdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCA8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFID0gZUlOU1RBTkNFLmdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVycm9yQ29kZUVycm9yUGFnZUltcGwgPGVtPkVycm9yIENvZGUgRXJyb3IgUGFnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRXJyb3JDb2RlRXJyb3JQYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRFcnJvckNvZGVFcnJvclBhZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVJST1JfQ09ERV9FUlJPUl9QQUdFID0gZUlOU1RBTkNFLmdldEVycm9yQ29kZUVycm9yUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgQ29kZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERSA9IGVJTlNUQU5DRS5nZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsIDxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RmlsdGVyTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGSUxURVJfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfTUFQUElOR19fRklMVEVSID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMVEVSX01BUFBJTkdfX1NFUlZMRVQgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwgPGVtPkZpbHRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRmlsdGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRGaWx0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMVEVSID0gZUlOU1RBTkNFLmdldEZpbHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fRklMVEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbSBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IGVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9DQUxfRU5DT0RJTkdfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFID0gZUlOU1RBTkNFLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORyA9IGVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5IVFRQTWV0aG9kVHlwZUltcGwgPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkhUVFBNZXRob2RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRIVFRQTWV0aG9kVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBIVFRQX01FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EID0gZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZSA8ZW0+UmVzIEF1dGggU2VydmxldCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0UmVzQXV0aFNlcnZsZXRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUkVTX0FVVEhfU0VSVkxFVF9UWVBFID0gZUlOU1RBTkNFLmdldFJlc0F1dGhTZXJ2bGV0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtIDxlbT5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRIVFRQTWV0aG9kVHlwZUVudW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBIVFRQX01FVEhPRF9UWVBFX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIERJU1BBVENIRVJfVFlQRSA9IGVJTlNUQU5DRS5nZXREaXNwYXRjaGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQgPGVtPkF1dGggTWV0aG9kIEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEF1dGhNZXRob2RLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQVVUSF9NRVRIT0RfS0lORCA9IGVJTlNUQU5DRS5nZXRBdXRoTWV0aG9kS2luZCgpOwotCi0JfQotCi19IC8vV2ViYXBwbGljYXRpb25QYWNrYWdlCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4YmIzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotICogQHNpbmNlIDEuMAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlbGNvbWVGaWxlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBXZWxjb21lRmlsZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0V2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWxjb21lRmlsZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFdlbGNvbWVGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQlXZWxjb21lRmlsZUxpc3QgZ2V0RmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFlOThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2VsY29tZUZpbGVMaXN0IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogQWRkcyB0aGUgZmlsZSB3aG9zZSBuYW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGaWxlTmFtZWQoU3RyaW5nIG5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpbGUgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbGUoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmViMmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4gVGhlIHJvbGUgdXNlZCBoZXJlIG11c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dGhDb25zdHJhaW50SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF1dGhDb25zdHJhaW50IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgcm9sZXMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBdXRoQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFVVEhfQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhdXRoIGNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgbGlzdCBvZiByb2xlIG5hbWVzIGZvciB0aGUgYXV0aCBjb25zdHJhaW50LiAgRWFjaCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAqIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLgotCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzKCkgewotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJcm9sZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjQ29uc3RyYWludChuZXdTZWNDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBuZXdTZWNDb25zdHJhaW50LCBuZXdTZWNDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBiYXNpY1NldFNlY0NvbnN0cmFpbnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFJvbGVzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRTZWNDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUzoKLQkJCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUzoKLQkJCQlyZXR1cm4gcm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29udGV4dFBhcmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db250ZXh0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDcyNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db250ZXh0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFBhcmFtSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbnRleHRQYXJhbSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtTmFtZSA9IFBBUkFNX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1WYWx1ZSA9IFBBUkFNX1ZBTFVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgQ29udGV4dFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVYVF9QQVJBTTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1OYW1lKCkgewotCQlyZXR1cm4gcGFyYW1OYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgbmV3UGFyYW1OYW1lKSB7Ci0JCVN0cmluZyBvbGRQYXJhbU5hbWUgPSBwYXJhbU5hbWU7Ci0JCXBhcmFtTmFtZSA9IG5ld1BhcmFtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUsIG9sZFBhcmFtTmFtZSwgcGFyYW1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgbmV3UGFyYW1WYWx1ZSkgewotCQlTdHJpbmcgb2xkUGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWU7Ci0JCXBhcmFtVmFsdWUgPSBuZXdQYXJhbVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUUsIG9sZFBhcmFtVmFsdWUsIHBhcmFtVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCwgbmV3V2ViQXBwLCBuZXdXZWJBcHApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1OYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoUEFSQU1fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZShQQVJBTV9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBQQVJBTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwYXJhbU5hbWUgIT0gbnVsbCA6ICFQQVJBTV9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJhbU5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIFBBUkFNX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVZhbHVlICE9IG51bGwgOiAhUEFSQU1fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVmFsdWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFyYW1OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvckNvZGVFcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZGVkMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvckNvZGVFcnJvclBhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckNvZGVFcnJvclBhZ2VJbXBsIGV4dGVuZHMgRXJyb3JQYWdlSW1wbCBpbXBsZW1lbnRzIEVycm9yQ29kZUVycm9yUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JDb2RlKCkgPGVtPkVycm9yIENvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVycm9yQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQ09ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yQ29kZSA9IEVSUk9SX0NPREVfRURFRkFVTFQ7Ci0JcHVibGljIEVycm9yQ29kZUVycm9yUGFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVSUk9SX0NPREVfRVJST1JfUEFHRTsKLQl9Ci0KLS8qKgotICogaXNFcnJvckNvZGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXJyb3JDb2RlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvckNvZGUoKSB7Ci0JCXJldHVybiBlcnJvckNvZGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDb2RlKFN0cmluZyBuZXdFcnJvckNvZGUpIHsKLQkJU3RyaW5nIG9sZEVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQkJZXJyb3JDb2RlID0gbmV3RXJyb3JDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFLCBvbGRFcnJvckNvZGUsIGVycm9yQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlyZXR1cm4gZ2V0RXJyb3JDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlzZXRFcnJvckNvZGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlzZXRFcnJvckNvZGUoRVJST1JfQ09ERV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJcmV0dXJuIEVSUk9SX0NPREVfRURFRkFVTFQgPT0gbnVsbCA/IGVycm9yQ29kZSAhPSBudWxsIDogIUVSUk9SX0NPREVfRURFRkFVTFQuZXF1YWxzKGVycm9yQ29kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlcnJvckNvZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVycm9yQ29kZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODVkZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUgb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclBhZ2VJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRXJyb3JQYWdlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgRXJyb3JQYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRVJST1JfUEFHRTsKLQl9Ci0KLS8qKgotICogaXNFcnJvckNvZGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXJyb3JDb2RlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogaXNFeGNlcHRpb25UeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvblR5cGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQlTdHJpbmcgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjZTIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsIGV4dGVuZHMgRXJyb3JQYWdlSW1wbCBpbXBsZW1lbnRzIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBleGNlcHRpb25UeXBlID0gbnVsbDsKLQlwdWJsaWMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0U7Ci0JfQotCi0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gc2V0IHRoZSBFeGNlcHRpb25UeXBlIHRvIGEgSmF2YUNsYXNzIGhhdmluZyBhIGZ1bGx5IHF1YWxpZmllZAotICogbmFtZSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlcgotICovCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvblR5cGVOYW1lKCkgewotCWdldEV4Y2VwdGlvblR5cGUoKTsKLQlyZXR1cm4gZXhjZXB0aW9uVHlwZSA9PSBudWxsID8gbnVsbCA6IGV4Y2VwdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfS8qKgotICogSGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIEV4Y2VwdGlvblR5cGUgdG8gYSBKYXZhQ2xhc3MgaGF2aW5nIGEgZnVsbHkgcXVhbGlmaWVkCi0gKiBuYW1lIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyCi0gKi8gCi1wdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvblR5cGUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcgZXhjZXB0aW9uVHlwZU5hbWUpIHsKLQlzZXRFeGNlcHRpb25UeXBlKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihleGNlcHRpb25UeXBlTmFtZSkpOwotfQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQGxpbmt7I3NldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyl9Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSwgUmVzb3VyY2VTZXQgY29udGV4dCkgewotCXNldEV4Y2VwdGlvblR5cGVOYW1lKGV4Y2VwdGlvblR5cGVOYW1lKTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRFeGNlcHRpb25UeXBlKCkgewotCQlpZiAoZXhjZXB0aW9uVHlwZSAhPSBudWxsICYmIGV4Y2VwdGlvblR5cGUuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEV4Y2VwdGlvblR5cGUgPSAoSW50ZXJuYWxFT2JqZWN0KWV4Y2VwdGlvblR5cGU7Ci0JCQlleGNlcHRpb25UeXBlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZEV4Y2VwdGlvblR5cGUpOwotCQkJaWYgKGV4Y2VwdGlvblR5cGUgIT0gb2xkRXhjZXB0aW9uVHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSwgb2xkRXhjZXB0aW9uVHlwZSwgZXhjZXB0aW9uVHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBleGNlcHRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRFeGNlcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UeXBlKEphdmFDbGFzcyBuZXdFeGNlcHRpb25UeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRFeGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLQkJZXhjZXB0aW9uVHlwZSA9IG5ld0V4Y2VwdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSwgb2xkRXhjZXB0aW9uVHlwZSwgZXhjZXB0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RXhjZXB0aW9uVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEV4Y2VwdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGV4Y2VwdGlvblR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThlYTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgRmlsdGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZmlsdGVyQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbVZhbHVlcygpIDxlbT5Jbml0IFBhcmFtIFZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1WYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1WYWx1ZXMgPSBudWxsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJvdGVjdGVkIEZpbHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlci4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZSBmaWx0ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIGdldEluaXRQYXJhbXMoKSBpcyB1c2VkIGZvciBKMkVFMS4zCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluaXRQYXJhbS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRGaWx0ZXJDbGFzcygpIHsKLQkJaWYgKGZpbHRlckNsYXNzICE9IG51bGwgJiYgZmlsdGVyQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEZpbHRlckNsYXNzID0gKEludGVybmFsRU9iamVjdClmaWx0ZXJDbGFzczsKLQkJCWZpbHRlckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZEZpbHRlckNsYXNzKTsKLQkJCWlmIChmaWx0ZXJDbGFzcyAhPSBvbGRGaWx0ZXJDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUywgb2xkRmlsdGVyQ2xhc3MsIGZpbHRlckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbHRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRGaWx0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIGZpbHRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlckNsYXNzKEphdmFDbGFzcyBuZXdGaWx0ZXJDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkRmlsdGVyQ2xhc3MgPSBmaWx0ZXJDbGFzczsKLQkJZmlsdGVyQ2xhc3MgPSBuZXdGaWx0ZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTLCBvbGRGaWx0ZXJDbGFzcywgZmlsdGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIGdldEluaXRQYXJhbVZhbHVlcygpIGlzIHVzZWQgZm9yIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluaXRQYXJhbVZhbHVlcygpIHsKLQkJaWYgKGluaXRQYXJhbVZhbHVlcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1WYWx1ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVMpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbVZhbHVlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGaWx0ZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEZpbHRlckNsYXNzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlzZXRGaWx0ZXJDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTOgotCQkJCWdldEluaXRQYXJhbVZhbHVlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtVmFsdWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlzZXRGaWx0ZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVM6Ci0JCQkJZ2V0SW5pdFBhcmFtVmFsdWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgotCQkJCXJldHVybiBmaWx0ZXJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtVmFsdWVzICE9IG51bGwgJiYgIWluaXRQYXJhbVZhbHVlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLQotCi1wdWJsaWMgU3RyaW5nIGdldEZpbHRlckNsYXNzTmFtZSgpIHsKLQlnZXRGaWx0ZXJDbGFzcygpOwotCXJldHVybiAoZmlsdGVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogZmlsdGVyQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQotcHVibGljIHZvaWQgc2V0RmlsdGVyQ2xhc3NOYW1lKFN0cmluZyBmaWx0ZXJDbGFzc05hbWUpIHsKLQllU2V0KFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCksIGNyZWF0ZUNsYXNzUmVmKGZpbHRlckNsYXNzTmFtZSkpOwotfQotfSAvL0ZpbHRlckltcGwKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2N2E4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LCBhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0byBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbiBzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYSBzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIDxmaWx0ZXJuYW1lPiBzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSA8ZmlsdGVyPiBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAotICogQGludmFyaWFudCBUaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlcjo6bmFtZSBvZiBvbmUgb2YgdGhlIEZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRmlsdGVyTWFwcGluZyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybigpIDxlbT5VcmwgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgc2VydmxldE5hbWU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmxQYXR0ZXJuID0gVVJMX1BBVFRFUk5fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGF0Y2hlclR5cGUoKSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BhdGNoZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGF0Y2hlclR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEZpbHRlciBmaWx0ZXIgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0IHNlcnZsZXQgPSBudWxsOwotCXB1YmxpYyBGaWx0ZXJNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkc7Ci0JfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotCXB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXQoKXsKLQlTZXJ2bGV0IGxzZXJ2bGV0ID0gdGhpcy5nZXRTZXJ2bGV0R2VuKCk7Ci0JaWYgKGxzZXJ2bGV0ID09IG51bGwgJiYgc2VydmxldE5hbWUgIT0gbnVsbCl7Ci0JCVdlYkFwcCB3ZWJhcHAgPSAoV2ViQXBwKWVDb250YWluZXIoKTsKLQkJaWYgKHdlYmFwcCAhPSBudWxsKXsKLQkJCWxzZXJ2bGV0PXdlYmFwcC5nZXRTZXJ2bGV0TmFtZWQoc2VydmxldE5hbWUpOwotCQkJaWYgKGxzZXJ2bGV0ICE9IG51bGwpIAotCQkJCXNldFNlcnZsZXQobHNlcnZsZXQpOwotCQl9Ci0JfQotCXJldHVybiBsc2VydmxldDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCB0aGF0IHRoaXMgbWFwcGluZyBhcHBsaWVzIHRvLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCl7Ci0JU3RyaW5nIHJldCA9IG51bGw7Ci0JaWYgKHNlcnZsZXROYW1lICE9IG51bGwpCi0JCXJldCA9ICBzZXJ2bGV0TmFtZTsKLQotCVNlcnZsZXQgbHNlcnZsZXQgPSBnZXRTZXJ2bGV0KCk7Ci0JaWYgKGxzZXJ2bGV0ICE9IG51bGwpCi0JCXJldCA9IGxzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCk7Ci0JcmV0dXJuIHJldDsKLX0KLS8qKgotICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCB0aGF0IHRoaXMgbWFwcGluZyBhcHBsaWVzIHRvLgotICovCi1wdWJsaWMgdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgc2VydmxldE5hbWUpewotCXRoaXMuc2VydmxldE5hbWUgPSBzZXJ2bGV0TmFtZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgbmV3VXJsUGF0dGVybikgewotCQlTdHJpbmcgb2xkVXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCXVybFBhdHRlcm4gPSBuZXdVcmxQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOLCBvbGRVcmxQYXR0ZXJuLCB1cmxQYXR0ZXJuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERpc3BhdGNoZXJUeXBlKCkgewotCQlpZiAoZGlzcGF0Y2hlclR5cGUgPT0gbnVsbCkgewotCQkJZGlzcGF0Y2hlclR5cGUgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoRGlzcGF0Y2hlclR5cGUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFKTsKLQkJfQotCQlyZXR1cm4gZGlzcGF0Y2hlclR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGZpbHRlciBiZWluZyBtYXBwZWQKLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRmlsdGVyID0gKEludGVybmFsRU9iamVjdClmaWx0ZXI7Ci0JCQlmaWx0ZXIgPSAoRmlsdGVyKWVSZXNvbHZlUHJveHkob2xkRmlsdGVyKTsKLQkJCWlmIChmaWx0ZXIgIT0gb2xkRmlsdGVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVIsIG9sZEZpbHRlciwgZmlsdGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGJhc2ljR2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihGaWx0ZXIgbmV3RmlsdGVyKSB7Ci0JCUZpbHRlciBvbGRGaWx0ZXIgPSBmaWx0ZXI7Ci0JCWZpbHRlciA9IG5ld0ZpbHRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVIsIG9sZEZpbHRlciwgZmlsdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmxldChTZXJ2bGV0IGwpIHsKLQkJc2VydmxldE5hbWUgPSBudWxsOwotCQlzZXRTZXJ2bGV0R2VuKGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXRHZW4oU2VydmxldCBuZXdTZXJ2bGV0KSB7Ci0JCVNlcnZsZXQgb2xkU2VydmxldCA9IHNlcnZsZXQ7Ci0JCXNlcnZsZXQgPSBuZXdTZXJ2bGV0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQsIG9sZFNlcnZsZXQsIHNlcnZsZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERpc3BhdGNoZXJUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmlsdGVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RmlsdGVyKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZsZXQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2bGV0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJZ2V0RGlzcGF0Y2hlclR5cGUoKS5jbGVhcigpOwotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXNldEZpbHRlcigoRmlsdGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlzZXRTZXJ2bGV0KChTZXJ2bGV0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oVVJMX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJZ2V0RGlzcGF0Y2hlclR5cGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVI6Ci0JCQkJc2V0RmlsdGVyKChGaWx0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJc2V0U2VydmxldCgoU2VydmxldCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gVVJMX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHVybFBhdHRlcm4gIT0gbnVsbCA6ICFVUkxfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHModXJsUGF0dGVybik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBkaXNwYXRjaGVyVHlwZSAhPSBudWxsICYmICFkaXNwYXRjaGVyVHlwZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXJldHVybiBmaWx0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXJldHVybiBzZXJ2bGV0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIChSZW1vdmVkIEdlbmVyYXRlZCBmbGFnIHRvIHByZXNlcnZlIG92ZXJyaWRlIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgTk9UIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJZ2V0RGlzcGF0Y2hlclR5cGUoKS5jbGVhcigpOwotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXNldEZpbHRlcigoRmlsdGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgICAgICAgICAgICAgc2V0U2VydmxldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JICAgICAgICAgICAgZWxzZQotCSAgICAgICAgICAgICAgICBzZXRTZXJ2bGV0KChTZXJ2bGV0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGF0Y2hlclR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BhdGNoZXJUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQW4gb3B0aW9uYWwgc2VydmxldCB0aGF0IGlzIG1hcHBlZCBieSBhIGZpbHRlciBtYXBwaW5nLiAgc2VydmxldE5hbWUgaXMgdXNlZCB0byByZXNvbHZlIHRoZSBzZXJ2bGV0IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0R2VuKCkgewotCQlpZiAoc2VydmxldCAhPSBudWxsICYmIHNlcnZsZXQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZsZXQgPSAoSW50ZXJuYWxFT2JqZWN0KXNlcnZsZXQ7Ci0JCQlzZXJ2bGV0ID0gKFNlcnZsZXQpZVJlc29sdmVQcm94eShvbGRTZXJ2bGV0KTsKLQkJCWlmIChzZXJ2bGV0ICE9IG9sZFNlcnZsZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQsIG9sZFNlcnZsZXQsIHNlcnZsZXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldCBiYXNpY0dldFNlcnZsZXQoKSB7Ci0JCXJldHVybiBzZXJ2bGV0OwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOWQ1NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtTG9naW5Db25maWdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRm9ybUxvZ2luQ29uZmlnIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtTG9naW5QYWdlKCkgPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9MT0dJTl9QQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybUxvZ2luUGFnZSA9IEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybUVycm9yUGFnZSgpIDxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm1FcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fRVJST1JfUEFHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1FcnJvclBhZ2UgPSBGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQ7Ci0JcHVibGljIEZvcm1Mb2dpbkNvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPUk1fTE9HSU5fQ09ORklHOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgcGFnZQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxvZ2luUGFnZSgpIHsKLQkJcmV0dXJuIGZvcm1Mb2dpblBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcgbmV3Rm9ybUxvZ2luUGFnZSkgewotCQlTdHJpbmcgb2xkRm9ybUxvZ2luUGFnZSA9IGZvcm1Mb2dpblBhZ2U7Ci0JCWZvcm1Mb2dpblBhZ2UgPSBuZXdGb3JtTG9naW5QYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSwgb2xkRm9ybUxvZ2luUGFnZSwgZm9ybUxvZ2luUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgCi0JICogcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGZvcm1FcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybUVycm9yUGFnZShTdHJpbmcgbmV3Rm9ybUVycm9yUGFnZSkgewotCQlTdHJpbmcgb2xkRm9ybUVycm9yUGFnZSA9IGZvcm1FcnJvclBhZ2U7Ci0JCWZvcm1FcnJvclBhZ2UgPSBuZXdGb3JtRXJyb3JQYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSwgb2xkRm9ybUVycm9yUGFnZSwgZm9ybUVycm9yUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvZ2luQ29uZmlnKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBuZXdMb2dpbkNvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3TG9naW5Db25maWcsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgbmV3TG9naW5Db25maWcpIHsKLQkJaWYgKG5ld0xvZ2luQ29uZmlnICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHICYmIG5ld0xvZ2luQ29uZmlnICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3TG9naW5Db25maWcpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdMb2dpbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb2dpbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcsIExvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvZ2luQ29uZmlnKG5ld0xvZ2luQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHLCBuZXdMb2dpbkNvbmZpZywgbmV3TG9naW5Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBiYXNpY1NldExvZ2luQ29uZmlnKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBMb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJcmV0dXJuIGdldEZvcm1Mb2dpblBhZ2UoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0U6Ci0JCQkJcmV0dXJuIGdldEZvcm1FcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldExvZ2luQ29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJc2V0Rm9ybUxvZ2luUGFnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXNldEZvcm1Mb2dpblBhZ2UoRk9STV9MT0dJTl9QQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCXNldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJcmV0dXJuIEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVCA9PSBudWxsID8gZm9ybUxvZ2luUGFnZSAhPSBudWxsIDogIUZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVC5lcXVhbHMoZm9ybUxvZ2luUGFnZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXJldHVybiBGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm1FcnJvclBhZ2UgIT0gbnVsbCA6ICFGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQuZXF1YWxzKGZvcm1FcnJvclBhZ2UpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0TG9naW5Db25maWcoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZm9ybUxvZ2luUGFnZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZm9ybUxvZ2luUGFnZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZm9ybUVycm9yUGFnZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZm9ybUVycm9yUGFnZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSFRUUE1ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU2MGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSFRUUE1ldGhvZFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSFRUUE1ldGhvZFR5cGVJbXBsI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSFRUUE1ldGhvZFR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIdHRwTWV0aG9kKCkgPGVtPkh0dHAgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIdHRwTWV0aG9kKCkgPGVtPkh0dHAgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh0dHBNZXRob2QgPSBIVFRQX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQTWV0aG9kVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuSFRUUF9NRVRIT0RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh0dHBNZXRob2QoKSB7Ci0JCXJldHVybiBodHRwTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBNZXRob2QoU3RyaW5nIG5ld0h0dHBNZXRob2QpIHsKLQkJU3RyaW5nIG9sZEh0dHBNZXRob2QgPSBodHRwTWV0aG9kOwotCQlodHRwTWV0aG9kID0gbmV3SHR0cE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9ELCBvbGRIdHRwTWV0aG9kLCBodHRwTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEh0dHBNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6Ci0JCQkJc2V0SHR0cE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6Ci0JCQkJc2V0SHR0cE1ldGhvZChIVFRQX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRDoKLQkJCQlyZXR1cm4gSFRUUF9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGh0dHBNZXRob2QgIT0gbnVsbCA6ICFIVFRQX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoaHR0cE1ldGhvZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChodHRwTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChodHRwTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSFRUUE1ldGhvZFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzhiNjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS8vdmFsdWUgcGFpciBhcyBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFBhcmFtSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluaXRQYXJhbSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtTmFtZSA9IFBBUkFNX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1WYWx1ZSA9IFBBUkFNX1ZBTFVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgSW5pdFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuSU5JVF9QQVJBTTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiAKLQkgKiAKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1OYW1lKCkgewotCQlyZXR1cm4gcGFyYW1OYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgbmV3UGFyYW1OYW1lKSB7Ci0JCVN0cmluZyBvbGRQYXJhbU5hbWUgPSBwYXJhbU5hbWU7Ci0JCXBhcmFtTmFtZSA9IG5ld1BhcmFtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUUsIG9sZFBhcmFtTmFtZSwgcGFyYW1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gcGFyYW1WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyBuZXdQYXJhbVZhbHVlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVZhbHVlID0gcGFyYW1WYWx1ZTsKLQkJcGFyYW1WYWx1ZSA9IG5ld1BhcmFtVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSwgb2xkUGFyYW1WYWx1ZSwgcGFyYW1WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1OYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKFBBUkFNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoUEFSQU1fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIFBBUkFNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtTmFtZSAhPSBudWxsIDogIVBBUkFNX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtTmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gUEFSQU1fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVmFsdWUgIT0gbnVsbCA6ICFQQVJBTV9WQUxVRV9FREVGQVVMVC5lcXVhbHMocGFyYW1WYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0pTUFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0pTUFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjJjNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVJbXBsIGV4dGVuZHMgV2ViVHlwZUltcGwgaW1wbGVtZW50cyBKU1BUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BGaWxlKCkgPGVtPkpzcCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGpzcEZpbGUgPSBKU1BfRklMRV9FREVGQVVMVDsKLQlwdWJsaWMgSlNQVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkpTUF9UWVBFOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNKc3BUeXBlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCkgewotCQlyZXR1cm4ganNwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBuZXdKc3BGaWxlKSB7Ci0JCVN0cmluZyBvbGRKc3BGaWxlID0ganNwRmlsZTsKLQkJanNwRmlsZSA9IG5ld0pzcEZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEUsIG9sZEpzcEZpbGUsIGpzcEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpzcEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFOgotCQkJCXNldEpzcEZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRToKLQkJCQlzZXRKc3BGaWxlKEpTUF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRToKLQkJCQlyZXR1cm4gSlNQX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IGpzcEZpbGUgIT0gbnVsbCA6ICFKU1BfRklMRV9FREVGQVVMVC5lcXVhbHMoanNwRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChqc3BGaWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqc3BGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmQ1MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvY2FsRW5jb2RpbmdNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsZSA9IExPQ0FMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZygpIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5MT0NBTF9FTkNPRElOR19NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlKCkgewotCQlyZXR1cm4gbG9jYWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsZShTdHJpbmcgbmV3TG9jYWxlKSB7Ci0JCVN0cmluZyBvbGRMb2NhbGUgPSBsb2NhbGU7Ci0JCWxvY2FsZSA9IG5ld0xvY2FsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSwgb2xkTG9jYWxlLCBsb2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIG5ld0VuY29kaW5nKSB7Ci0JCVN0cmluZyBvbGRFbmNvZGluZyA9IGVuY29kaW5nOwotCQllbmNvZGluZyA9IG5ld0VuY29kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcsIG9sZEVuY29kaW5nLCBlbmNvZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlyZXR1cm4gZ2V0RW5jb2RpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXNldExvY2FsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXNldExvY2FsZShMT0NBTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HOgotCQkJCXNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlyZXR1cm4gTE9DQUxFX0VERUZBVUxUID09IG51bGwgPyBsb2NhbGUgIT0gbnVsbCA6ICFMT0NBTEVfRURFRkFVTFQuZXF1YWxzKGxvY2FsZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlyZXR1cm4gRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGVuY29kaW5nICE9IG51bGwgOiAhRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKGVuY29kaW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOWZhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGxvY2FsRW5jb2RpbmdNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpIHsKLQkJaWYgKGxvY2FsRW5jb2RpbmdNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlsb2NhbEVuY29kaW5nTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5ncyAhPSBudWxsICYmICFsb2NhbEVuY29kaW5nTWFwcGluZ3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmOGY0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGxvZ2luLWNvbmZpZyBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgotICogbWVjaGFuaXNtLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTG9naW5Db25maWdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9naW5Db25maWcgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhNZXRob2QoKSA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQVVUSF9NRVRIT0RfRURFRkFVTFQgPSBBdXRoTWV0aG9kS2luZC5VTlNQRUNJRklFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEF1dGhNZXRob2RLaW5kIGF1dGhNZXRob2QgPSBBVVRIX01FVEhPRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggTWV0aG9kIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRoTWV0aG9kRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWxtTmFtZSgpIDxlbT5SZWFsbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFsbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFsbU5hbWUgPSBSRUFMTV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcml6YXRpb25NZXRob2QgPSBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBGb3JtTG9naW5Db25maWcgZm9ybUxvZ2luQ29uZmlnID0gbnVsbDsKLQlwdWJsaWMgTG9naW5Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5MT0dJTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBmb3IKLQkgKiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcwotCSAqIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlCi0JICogYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAKLQkgKiAiQkFTSUMiLCAiRElHRVNUIiwgIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCSAqLwotCXB1YmxpYyBBdXRoTWV0aG9kS2luZCBnZXRBdXRoTWV0aG9kKCkgewotCQlyZXR1cm4gYXV0aE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kIG5ld0F1dGhNZXRob2QpIHsKLQkJQXV0aE1ldGhvZEtpbmQgb2xkQXV0aE1ldGhvZCA9IGF1dGhNZXRob2Q7Ci0JCWF1dGhNZXRob2QgPSBuZXdBdXRoTWV0aG9kID09IG51bGwgPyBBVVRIX01FVEhPRF9FREVGQVVMVCA6IG5ld0F1dGhNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkQXV0aE1ldGhvZEVTZXQgPSBhdXRoTWV0aG9kRVNldDsKLQkJYXV0aE1ldGhvZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCwgb2xkQXV0aE1ldGhvZCwgYXV0aE1ldGhvZCwgIW9sZEF1dGhNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdXRoTWV0aG9kKCkgewotCQlBdXRoTWV0aG9kS2luZCBvbGRBdXRoTWV0aG9kID0gYXV0aE1ldGhvZDsKLQkJYm9vbGVhbiBvbGRBdXRoTWV0aG9kRVNldCA9IGF1dGhNZXRob2RFU2V0OwotCQlhdXRoTWV0aG9kID0gQVVUSF9NRVRIT0RfRURFRkFVTFQ7Ci0JCWF1dGhNZXRob2RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QsIG9sZEF1dGhNZXRob2QsIEFVVEhfTUVUSE9EX0VERUZBVUxULCBvbGRBdXRoTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0aE1ldGhvZCgpIHsKLQkJcmV0dXJuIGF1dGhNZXRob2RFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQIEJhc2ljCi0JICogYXV0aG9yaXphdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhbG1OYW1lKCkgewotCQlyZXR1cm4gcmVhbG1OYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxtTmFtZShTdHJpbmcgbmV3UmVhbG1OYW1lKSB7Ci0JCVN0cmluZyBvbGRSZWFsbU5hbWUgPSByZWFsbU5hbWU7Ci0JCXJlYWxtTmFtZSA9IG5ld1JlYWxtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSwgb2xkUmVhbG1OYW1lLCByZWFsbU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcml6YXRpb25NZXRob2QoKSB7Ci0JCXJldHVybiBhdXRob3JpemF0aW9uTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcml6YXRpb25NZXRob2QoU3RyaW5nIG5ld0F1dGhvcml6YXRpb25NZXRob2QpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcml6YXRpb25NZXRob2QgPSBhdXRob3JpemF0aW9uTWV0aG9kOwotCQlhdXRob3JpemF0aW9uTWV0aG9kID0gbmV3QXV0aG9yaXphdGlvbk1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0QsIG9sZEF1dGhvcml6YXRpb25NZXRob2QsIGF1dGhvcml6YXRpb25NZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWJBcHAobmV3V2ViQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEZvcm1Mb2dpbkNvbmZpZyBnZXRGb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Rm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBuZXdGb3JtTG9naW5Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRm9ybUxvZ2luQ29uZmlnIG9sZEZvcm1Mb2dpbkNvbmZpZyA9IGZvcm1Mb2dpbkNvbmZpZzsKLQkJZm9ybUxvZ2luQ29uZmlnID0gbmV3Rm9ybUxvZ2luQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgb2xkRm9ybUxvZ2luQ29uZmlnLCBuZXdGb3JtTG9naW5Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgbmV3Rm9ybUxvZ2luQ29uZmlnKSB7Ci0JCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gZm9ybUxvZ2luQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChmb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Rm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhuZXdGb3JtTG9naW5Db25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcsIG5ld0Zvcm1Mb2dpbkNvbmZpZywgbmV3Rm9ybUxvZ2luQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCWlmIChmb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZvcm1Mb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRGb3JtTG9naW5Db25maWcoKEZvcm1Mb2dpbkNvbmZpZylvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEF1dGhNZXRob2QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVhbG1OYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXJldHVybiBnZXRBdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJc2V0QXV0aE1ldGhvZCgoQXV0aE1ldGhvZEtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlzZXRSZWFsbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRDoKLQkJCQlzZXRBdXRob3JpemF0aW9uTWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRGb3JtTG9naW5Db25maWcoKEZvcm1Mb2dpbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJdW5zZXRBdXRoTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXNldFJlYWxtTmFtZShSRUFMTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXNldEF1dGhvcml6YXRpb25NZXRob2QoQVVUSE9SSVpBVElPTl9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXNldEZvcm1Mb2dpbkNvbmZpZygoRm9ybUxvZ2luQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRBdXRoTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJcmV0dXJuIFJFQUxNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWxtTmFtZSAhPSBudWxsIDogIVJFQUxNX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlYWxtTmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXJldHVybiBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gYXV0aG9yaXphdGlvbk1ldGhvZCAhPSBudWxsIDogIUFVVEhPUklaQVRJT05fTUVUSE9EX0VERUZBVUxULmVxdWFscyhhdXRob3JpemF0aW9uTWV0aG9kKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0aE1ldGhvZDogIik7Ci0JCWlmIChhdXRoTWV0aG9kRVNldCkgcmVzdWx0LmFwcGVuZChhdXRoTWV0aG9kKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhbG1OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFsbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcml6YXRpb25NZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcml6YXRpb25NZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhMjRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24gYW5kIGEgbWltZSB0eXBlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWltZU1hcHBpbmcgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuc2lvbigpIDxlbT5FeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uID0gRVhURU5TSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW1lVHlwZSgpIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IE1JTUVfVFlQRV9FREVGQVVMVDsKLQlwdWJsaWMgTWltZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5NSU1FX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgbmV3RXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlbnNpb24gPSBleHRlbnNpb247Ci0JCWV4dGVuc2lvbiA9IG5ld0V4dGVuc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OLCBvbGRFeHRlbnNpb24sIGV4dGVuc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOiAidGV4dC8vcGxhaW4iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIG1pbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBuZXdNaW1lVHlwZSkgewotCQlTdHJpbmcgb2xkTWltZVR5cGUgPSBtaW1lVHlwZTsKLQkJbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFLCBvbGRNaW1lVHlwZSwgbWltZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1MsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXJldHVybiBnZXRFeHRlbnNpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXJldHVybiBnZXRNaW1lVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJc2V0RXh0ZW5zaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXNldE1pbWVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXNldEV4dGVuc2lvbihFWFRFTlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXNldE1pbWVUeXBlKE1JTUVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJcmV0dXJuIEVYVEVOU0lPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZW5zaW9uICE9IG51bGwgOiAhRVhURU5TSU9OX0VERUZBVUxULmVxdWFscyhleHRlbnNpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJcmV0dXJuIE1JTUVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gbWltZVR5cGUgIT0gbnVsbCA6ICFNSU1FX1RZUEVfRURFRkFVTFQuZXF1YWxzKG1pbWVUeXBlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVuc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5zaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW1lVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWltZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1JvbGVOYW1lVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvUm9sZU5hbWVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg0YTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvUm9sZU5hbWVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTmFtZVR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUm9sZU5hbWVUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQlwdWJsaWMgUm9sZU5hbWVUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9OQU1FX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUUsIG9sZFJvbGVOYW1lLCByb2xlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWMyYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlDb25zdHJhaW50IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5Q29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FLCBvbGREaXNwbGF5TmFtZSwgZGlzcGxheU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSB7Ci0JCWlmICh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID09IG51bGwpIHsKLQkJCXdlYlJlc291cmNlQ29sbGVjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQpOwotCQl9Ci0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludCBnZXRBdXRoQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGF1dGhDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG5ld0F1dGhDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF1dGhDb25zdHJhaW50IG9sZEF1dGhDb25zdHJhaW50ID0gYXV0aENvbnN0cmFpbnQ7Ci0JCWF1dGhDb25zdHJhaW50ID0gbmV3QXV0aENvbnN0cmFpbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG9sZEF1dGhDb25zdHJhaW50LCBuZXdBdXRoQ29uc3RyYWludCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgbmV3QXV0aENvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld0F1dGhDb25zdHJhaW50ICE9IGF1dGhDb25zdHJhaW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdXRoQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdXRoQ29uc3RyYWludCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIEF1dGhDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdBdXRoQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBdXRoQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIEF1dGhDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF1dGhDb25zdHJhaW50KG5ld0F1dGhDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG5ld0F1dGhDb25zdHJhaW50LCBuZXdBdXRoQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBVc2VyRGF0YUNvbnN0cmFpbnQgZ2V0VXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgbmV3VXNlckRhdGFDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVVzZXJEYXRhQ29uc3RyYWludCBvbGRVc2VyRGF0YUNvbnN0cmFpbnQgPSB1c2VyRGF0YUNvbnN0cmFpbnQ7Ci0JCXVzZXJEYXRhQ29uc3RyYWludCA9IG5ld1VzZXJEYXRhQ29uc3RyYWludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBvbGRVc2VyRGF0YUNvbnN0cmFpbnQsIG5ld1VzZXJEYXRhQ29uc3RyYWludCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1VzZXJEYXRhQ29uc3RyYWludCAhPSB1c2VyRGF0YUNvbnN0cmFpbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1c2VyRGF0YUNvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3VXNlckRhdGFDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VzZXJEYXRhQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludChuZXdVc2VyRGF0YUNvbnN0cmFpbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQsIG5ld1VzZXJEYXRhQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlpZiAoYXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWF1dGhDb25zdHJhaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXV0aENvbnN0cmFpbnQoKEF1dGhDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCWlmICh1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVzZXJEYXRhQ29uc3RyYWludCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VXNlckRhdGFDb25zdHJhaW50KChVc2VyRGF0YUNvbnN0cmFpbnQpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBiYXNpY1NldEF1dGhDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VXNlckRhdGFDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRBdXRoQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXNldEF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0VXNlckRhdGFDb25zdHJhaW50KChVc2VyRGF0YUNvbnN0cmFpbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0QXV0aENvbnN0cmFpbnQoKEF1dGhDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXNldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9ucyAhPSBudWxsICYmICF3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiB1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlzcGxheU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgxM2E2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYSBzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgU2VydmxldCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldE5hbWUoKSA8ZW0+U2VydmxldCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmxldE5hbWUgPSBTRVJWTEVUX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWRPblN0YXJ0dXAoKSA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGxvYWRPblN0YXJ0dXAgPSBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMb2FkIE9uIFN0YXJ0dXAgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZE9uU3RhcnR1cEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBXZWJUeXBlIHdlYlR5cGUgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwYXJhbXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBydW5BcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFBhcmFtcygpIDxlbT5Jbml0IFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0KLQlwdWJsaWMgU2VydmxldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFUlZMRVQ7Ci0JfQotCi0vKioKLSAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhlIG1hcHBpbmdzIHRoYXQgdGhpcwotICogc2VydmxldCBwYXJ0aWNpcGF0ZXMgaW4uICBTaW5jZSBzZXJ2bGV0TWFwcGluZ3MgaXMgbm90Ci0gKiBhIGJpLWRpcmVjdGlvbmFsIGF0dHJpYnV0ZSwgaWYgeW91IHdhbnQgdG8gYWRkIG9yIGRlbGV0ZSBhCi0gKiBtYXBwaW5nLCB0aGlzIG11c3QgYmUgZG9uZSBpbiB0aGUgd2ViLWFwcC4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0TWFwcGluZ3MoKSB7Ci0JV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGVDb250YWluZXIoKTsKLQlpZiAod2ViQXBwID09IG51bGwpIHJldHVybiBuZXcgQmFzaWNFTGlzdCgwKTsKLQkKLQlFTGlzdCBhbGxNYXBwaW5ncyA9IHdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQlJdGVyYXRvciBpID0gYWxsTWFwcGluZ3MuaXRlcmF0b3IoKTsKLQlMaXN0IG1hcHBpbmdzID0gbmV3IFZlY3RvcigpOwotCXdoaWxlIChpLmhhc05leHQoKSkgewotCQlTZXJ2bGV0TWFwcGluZyBtYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKSBpLm5leHQoKTsKLQkJaWYgKG1hcHBpbmcuZ2V0U2VydmxldCgpID09IHRoaXMpCi0JCQltYXBwaW5ncy5hZGQobWFwcGluZyk7Ci0JfQotCXJldHVybiBtYXBwaW5nczsKLX0KLS8qKgotICogZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgUHJvcGVydGllcyBnZXRQYXJhbXNBc1Byb3BlcnRpZXMoKSB7Ci0JUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JTGlzdCBscGFyYW1zID0gZ2V0UGFyYW1zKCk7Ci0JSW5pdFBhcmFtIHBhcmFtOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbHBhcmFtcy5zaXplKCk7IGkrKykgewotCQlwYXJhbSA9IChJbml0UGFyYW0pIGxwYXJhbXMuZ2V0KGkpOwotCQlwcm9wcy5zZXRQcm9wZXJ0eShwYXJhbS5nZXRQYXJhbU5hbWUoKSwgcGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQl9Ci0JcmV0dXJuIHByb3BzOwotfQotLyoqCi0gKiBAc2VlIFNlcnZsZXQKLSAqLwotcHVibGljIHZvaWQgcmVTeW5jU2VjdXJpdHlSb2xlUmVmKGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgamF2YS5sYW5nLlN0cmluZyBuZXdSb2xlTmFtZSkgewotCUxpc3Qgcm9sZVJlZnMgPSBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlUmVmcy5zaXplKCk7IGkrKykgewotCQlTZWN1cml0eVJvbGVSZWYgcm9sZVJlZiA9IChTZWN1cml0eVJvbGVSZWYpIHJvbGVSZWZzLmdldChpKTsKLQkJaWYgKHJvbGVSZWYuZ2V0TGluaygpICE9IG51bGwgJiYgcm9sZVJlZi5nZXRMaW5rKCkuZXF1YWxzKGV4aXN0aW5nUm9sZU5hbWUpKQotCQkJcm9sZVJlZi5zZXRMaW5rKG5ld1JvbGVOYW1lKTsKLQl9Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgc2VydmxldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gc2VydmxldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIG5ld1NlcnZsZXROYW1lKSB7Ci0JCVN0cmluZyBvbGRTZXJ2bGV0TmFtZSA9IHNlcnZsZXROYW1lOwotCQlzZXJ2bGV0TmFtZSA9IG5ld1NlcnZsZXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FLCBvbGRTZXJ2bGV0TmFtZSwgc2VydmxldE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UgZWxlbWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIgaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCBpdCBhdCBhbnkgdGltZSBpbiB0aGUgc3RhcnR1cCBzZXF1ZW5jZS4KLQotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldExvYWRPblN0YXJ0dXAoKSB7Ci0JCXJldHVybiBsb2FkT25TdGFydHVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRPblN0YXJ0dXAoSW50ZWdlciBuZXdMb2FkT25TdGFydHVwKSB7Ci0JCUludGVnZXIgb2xkTG9hZE9uU3RhcnR1cCA9IGxvYWRPblN0YXJ0dXA7Ci0JCWxvYWRPblN0YXJ0dXAgPSBuZXdMb2FkT25TdGFydHVwOwotCQlib29sZWFuIG9sZExvYWRPblN0YXJ0dXBFU2V0ID0gbG9hZE9uU3RhcnR1cEVTZXQ7Ci0JCWxvYWRPblN0YXJ0dXBFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCwgb2xkTG9hZE9uU3RhcnR1cCwgbG9hZE9uU3RhcnR1cCwgIW9sZExvYWRPblN0YXJ0dXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldExvYWRPblN0YXJ0dXAoKSB7Ci0JCUludGVnZXIgb2xkTG9hZE9uU3RhcnR1cCA9IGxvYWRPblN0YXJ0dXA7Ci0JCWJvb2xlYW4gb2xkTG9hZE9uU3RhcnR1cEVTZXQgPSBsb2FkT25TdGFydHVwRVNldDsKLQkJbG9hZE9uU3RhcnR1cCA9IExPQURfT05fU1RBUlRVUF9FREVGQVVMVDsKLQkJbG9hZE9uU3RhcnR1cEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQLCBvbGRMb2FkT25TdGFydHVwLCBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQsIG9sZExvYWRPblN0YXJ0dXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NldExvYWRPblN0YXJ0dXAoKSB7Ci0JCXJldHVybiBsb2FkT25TdGFydHVwRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYlR5cGUgZ2V0V2ViVHlwZSgpIHsKLQkJcmV0dXJuIHdlYlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViVHlwZShXZWJUeXBlIG5ld1dlYlR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2ViVHlwZSBvbGRXZWJUeXBlID0gd2ViVHlwZTsKLQkJd2ViVHlwZSA9IG5ld1dlYlR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRSwgb2xkV2ViVHlwZSwgbmV3V2ViVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViVHlwZShXZWJUeXBlIG5ld1dlYlR5cGUpIHsKLQkJaWYgKG5ld1dlYlR5cGUgIT0gd2ViVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2ViVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3ZWJUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXZWJUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYlR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViVHlwZShuZXdXZWJUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRSwgbmV3V2ViVHlwZSwgbmV3V2ViVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0UGFyYW1zKCkgaXMgdXNlZCBmb3IgSjJFRTEuNAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1zKCkgewotCQlpZiAocGFyYW1zID09IG51bGwpIHsKLQkJCXBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBwYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJZiBkZWZpbmVkIGZvciBhIHNlcnZsZXQsIG92ZXJyaWRlcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdXNlZCB0byBjYWxsIGFuIEVKQiBieSB0aGF0IHNlcnZsZXQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSByb2xlLW5hbWUgaXMgb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBhbHJlYWR5IGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGdldFJ1bkFzKCkgewotCQlyZXR1cm4gcnVuQXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UnVuQXMoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBuZXdSdW5BcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9sZFJ1bkFzID0gcnVuQXM7Ci0JCXJ1bkFzID0gbmV3UnVuQXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG9sZFJ1bkFzLCBuZXdSdW5Bcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVuQXMoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBuZXdSdW5BcykgewotCQlpZiAobmV3UnVuQXMgIT0gcnVuQXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJ1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJ1bkFzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UnVuQXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UnVuQXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJ1bkFzKG5ld1J1bkFzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG5ld1J1bkFzLCBuZXdSdW5BcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0SW5pdFBhcmFtcygpIGlzIHVzZWQgZm9yIEoyRUUxLjMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSdW5BcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXROYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJcmV0dXJuIGdldExvYWRPblN0YXJ0dXAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFdlYlR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlyZXR1cm4gZ2V0UnVuQXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlzZXRTZXJ2bGV0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJc2V0TG9hZE9uU3RhcnR1cCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJc2V0V2ViVHlwZSgoV2ViVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TOgotCQkJCWdldFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXNldFJ1bkFzKChSdW5Bc1NwZWNpZmllZElkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXNldFNlcnZsZXROYW1lKFNFUlZMRVRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXVuc2V0TG9hZE9uU3RhcnR1cCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJc2V0V2ViVHlwZSgoV2ViVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJZ2V0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXNldFJ1bkFzKChSdW5Bc1NwZWNpZmllZElkZW50aXR5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBTRVJWTEVUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZsZXROYW1lICE9IG51bGwgOiAhU0VSVkxFVF9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0TmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJcmV0dXJuIGlzU2V0TG9hZE9uU3RhcnR1cCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXJldHVybiB3ZWJUeXBlICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJcmV0dXJuIHBhcmFtcyAhPSBudWxsICYmICFwYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVSZWZzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXJldHVybiBydW5BcyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2bGV0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmxldE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvYWRPblN0YXJ0dXA6ICIpOwotCQlpZiAobG9hZE9uU3RhcnR1cEVTZXQpIHJlc3VsdC5hcHBlbmQobG9hZE9uU3RhcnR1cCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiogCi0JICogcmV0dXJuIHRoZSBqYXZhIHNlcnZsZXQgY2xhc3MgZm9yIHRoaXMgc2VydmxldAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmxldENsYXNzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSBudWxsOwotCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCWlmIChnZXRXZWJUeXBlKCkuaXNTZXJ2bGV0VHlwZSgpKQotCQkJamF2YUNsYXNzTmFtZSA9ICgoU2VydmxldFR5cGUpZ2V0V2ViVHlwZSgpKS5nZXRDbGFzc05hbWUoKTsKLQkJLy9IYW5kbGUgdGhlIEpTUCBjYXNlCi0JCWVsc2UgewotCQkJU3RyaW5nIHJlbFBhdGggPSAoKEpTUFR5cGUpZ2V0V2ViVHlwZSgpKS5nZXRKc3BGaWxlKCk7Ci0JCQlVUkkgd2ViQXBwVVJJID0gZ2V0V2ViQXBwKCkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlqYXZhQ2xhc3NOYW1lID0gd2ViQXBwVVJJLnNlZ21lbnQoMSkrIi8iK3dlYkFwcFVSSS5zZWdtZW50KDIpK3JlbFBhdGg7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShqYXZhQ2xhc3NOYW1lLHRoaXMpOwotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjRkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZsZXRNYXBwaW5nIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJuKCkgPGVtPlVybCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVybFBhdHRlcm4gPSBVUkxfUEFUVEVSTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0IHNlcnZsZXQgPSBudWxsOwotCXB1YmxpYyBTZXJ2bGV0TWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFUlZMRVRfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgbmV3VXJsUGF0dGVybikgewotCQlTdHJpbmcgb2xkVXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCXVybFBhdHRlcm4gPSBuZXdVcmxQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTiwgb2xkVXJsUGF0dGVybiwgdXJsUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCwgbmV3V2ViQXBwLCBuZXdXZWJBcHApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCkgewotCQlpZiAoc2VydmxldCAhPSBudWxsICYmIHNlcnZsZXQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZsZXQgPSAoSW50ZXJuYWxFT2JqZWN0KXNlcnZsZXQ7Ci0JCQlzZXJ2bGV0ID0gKFNlcnZsZXQpZVJlc29sdmVQcm94eShvbGRTZXJ2bGV0KTsKLQkJCWlmIChzZXJ2bGV0ICE9IG9sZFNlcnZsZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZsZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZsZXQgYmFzaWNHZXRTZXJ2bGV0KCkgewotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgbmV3U2VydmxldCkgewotCQlTZXJ2bGV0IG9sZFNlcnZsZXQgPSBzZXJ2bGV0OwotCQlzZXJ2bGV0ID0gbmV3U2VydmxldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVCwgb2xkU2VydmxldCwgc2VydmxldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZsZXQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2bGV0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlzZXRTZXJ2bGV0KChTZXJ2bGV0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKFVSTF9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXNldFNlcnZsZXQoKFNlcnZsZXQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBVUkxfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gdXJsUGF0dGVybiAhPSBudWxsIDogIVVSTF9QQVRURVJOX0VERUZBVUxULmVxdWFscyh1cmxQYXR0ZXJuKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXJldHVybiBzZXJ2bGV0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1cmxQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmxQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjM3MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldFR5cGVJbXBsIGV4dGVuZHMgV2ViVHlwZUltcGwgaW1wbGVtZW50cyBTZXJ2bGV0VHlwZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7Ci0JcHVibGljIFNlcnZsZXRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuU0VSVkxFVF9UWVBFOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkgewotCQlTdHJpbmcgb2xkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQljbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYyNDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgc2Vzc2lvbi1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkNvbmZpZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXNzaW9uQ29uZmlnIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVGltZW91dCgpIDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGludCBzZXNzaW9uVGltZW91dCA9IFNFU1NJT05fVElNRU9VVF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNlc3Npb24gVGltZW91dCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVGltZW91dEVTZXQgPSBmYWxzZTsKLQotCXB1YmxpYyBTZXNzaW9uQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuU0VTU0lPTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvcgotCSAqIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZQotCSAqIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKSB7Ci0JCXJldHVybiBzZXNzaW9uVGltZW91dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uVGltZW91dChpbnQgbmV3U2Vzc2lvblRpbWVvdXQpIHsKLQkJaW50IG9sZFNlc3Npb25UaW1lb3V0ID0gc2Vzc2lvblRpbWVvdXQ7Ci0JCXNlc3Npb25UaW1lb3V0ID0gbmV3U2Vzc2lvblRpbWVvdXQ7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblRpbWVvdXRFU2V0ID0gc2Vzc2lvblRpbWVvdXRFU2V0OwotCQlzZXNzaW9uVGltZW91dEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCwgb2xkU2Vzc2lvblRpbWVvdXQsIHNlc3Npb25UaW1lb3V0LCAhb2xkU2Vzc2lvblRpbWVvdXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldFNlc3Npb25UaW1lb3V0KCkgewotCQlpbnQgb2xkU2Vzc2lvblRpbWVvdXQgPSBzZXNzaW9uVGltZW91dDsKLQkJYm9vbGVhbiBvbGRTZXNzaW9uVGltZW91dEVTZXQgPSBzZXNzaW9uVGltZW91dEVTZXQ7Ci0JCXNlc3Npb25UaW1lb3V0ID0gU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUOwotCQlzZXNzaW9uVGltZW91dEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCwgb2xkU2Vzc2lvblRpbWVvdXQsIFNFU1NJT05fVElNRU9VVF9FREVGQVVMVCwgb2xkU2Vzc2lvblRpbWVvdXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NldFNlc3Npb25UaW1lb3V0KCkgewotCQlyZXR1cm4gc2Vzc2lvblRpbWVvdXRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcCgoV2ViQXBwKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNlc3Npb25UaW1lb3V0KCkpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXNldFNlc3Npb25UaW1lb3V0KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXVuc2V0U2Vzc2lvblRpbWVvdXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJcmV0dXJuIGlzU2V0U2Vzc2lvblRpbWVvdXQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2Vzc2lvblRpbWVvdXQ6ICIpOwotCQlpZiAoc2Vzc2lvblRpbWVvdXRFU2V0KSByZXN1bHQuYXBwZW5kKHNlc3Npb25UaW1lb3V0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVGFnTGliUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjhhZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYWdMaWJSZWYgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYlVSSSgpIDxlbT5UYWdsaWIgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJVUkkgPSBUQUdMSUJfVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJMb2NhdGlvbigpIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJMb2NhdGlvbiA9IFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgVGFnTGliUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQl9SRUY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgd2ViLnhtbCAKLQkgKiBkb2N1bWVudCwgaWRlbnRpZnlpbmcgYSBUYWcgTGlicmFyeSB1c2VkIGluIHRoZSBXZWIgQXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdsaWJVUkkoKSB7Ci0JCXJldHVybiB0YWdsaWJVUkk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnbGliVVJJKFN0cmluZyBuZXdUYWdsaWJVUkkpIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYlVSSSA9IHRhZ2xpYlVSSTsKLQkJdGFnbGliVVJJID0gbmV3VGFnbGliVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkksIG9sZFRhZ2xpYlVSSSwgdGFnbGliVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0bwotCSAqIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJhcnkgRGVzY3JpcHRpb24gZmlsZQotCSAqIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdsaWJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRhZ2xpYkxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYkxvY2F0aW9uKFN0cmluZyBuZXdUYWdsaWJMb2NhdGlvbikgewotCQlTdHJpbmcgb2xkVGFnbGliTG9jYXRpb24gPSB0YWdsaWJMb2NhdGlvbjsKLQkJdGFnbGliTG9jYXRpb24gPSBuZXdUYWdsaWJMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04sIG9sZFRhZ2xpYkxvY2F0aW9uLCB0YWdsaWJMb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcCgoV2ViQXBwKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBnZXRUYWdsaWJVUkkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYkxvY2F0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVVJJKFRBR0xJQl9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBUQUdMSUJfVVJJX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJVUkkgIT0gbnVsbCA6ICFUQUdMSUJfVVJJX0VERUZBVUxULmVxdWFscyh0YWdsaWJVUkkpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlyZXR1cm4gVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB0YWdsaWJMb2NhdGlvbiAhPSBudWxsIDogIVRBR0xJQl9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHModGFnbGliTG9jYXRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YWdsaWJVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhZ2xpYlVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFnbGliTG9jYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhZ2xpYkxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9VUkxQYXR0ZXJuVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVVJMUGF0dGVyblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Mjg0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9VUkxQYXR0ZXJuVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVVJMUGF0dGVyblR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVVJMUGF0dGVyblR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJsUGF0dGVybiA9IFVSTF9QQVRURVJOX0VERUZBVUxUOwotCXB1YmxpYyBVUkxQYXR0ZXJuVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlVSTF9QQVRURVJOX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gdXJsUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyBuZXdVcmxQYXR0ZXJuKSB7Ci0JCVN0cmluZyBvbGRVcmxQYXR0ZXJuID0gdXJsUGF0dGVybjsKLQkJdXJsUGF0dGVybiA9IG5ld1VybFBhdHRlcm47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTiwgb2xkVXJsUGF0dGVybiwgdXJsUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZ2V0UmVzQ29sbGVjdGlvbigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc0NvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG5ld1Jlc0NvbGxlY3Rpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc0NvbGxlY3Rpb24sIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc0NvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG5ld1Jlc0NvbGxlY3Rpb24pIHsKLQkJaWYgKG5ld1Jlc0NvbGxlY3Rpb24gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OICYmIG5ld1Jlc0NvbGxlY3Rpb24gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSZXNDb2xsZWN0aW9uKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3UmVzQ29sbGVjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXNDb2xsZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVzQ29sbGVjdGlvbihuZXdSZXNDb2xsZWN0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiwgbmV3UmVzQ29sbGVjdGlvbiwgbmV3UmVzQ29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNDb2xsZWN0aW9uKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNDb2xsZWN0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFJlc0NvbGxlY3Rpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlzZXRSZXNDb2xsZWN0aW9uKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKFVSTF9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlzZXRSZXNDb2xsZWN0aW9uKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gVVJMX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHVybFBhdHRlcm4gIT0gbnVsbCA6ICFVUkxfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHModXJsUGF0dGVybik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVzQ29sbGVjdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1cmxQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmxQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MzZjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdGVjdGVkCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyRGF0YUNvbnN0cmFpbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVXNlckRhdGFDb25zdHJhaW50IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc3BvcnQgR3VhcmFudGVlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgVXNlckRhdGFDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVVNFUl9EQVRBX0NPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVzZXIgZGF0YSBjb25zdHJhaW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgCi0JICogYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZQotCSAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Ci0JICogdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMKLQkgKiB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQKLQkgKiBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcwotCSAqIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbQotCSAqIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZQotCSAqIElOVEVHUkFMIG9yIENPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSB7Ci0JCXJldHVybiB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgbmV3VHJhbnNwb3J0R3VhcmFudGVlKSB7Ci0JCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgb2xkVHJhbnNwb3J0R3VhcmFudGVlID0gdHJhbnNwb3J0R3VhcmFudGVlOwotCQl0cmFuc3BvcnRHdWFyYW50ZWUgPSBuZXdUcmFuc3BvcnRHdWFyYW50ZWUgPT0gbnVsbCA/IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQgOiBuZXdUcmFuc3BvcnRHdWFyYW50ZWU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSwgdHJhbnNwb3J0R3VhcmFudGVlLCAhb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSA9IHRyYW5zcG9ydEd1YXJhbnRlZTsKLQkJYm9vbGVhbiBvbGRUcmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQkJdHJhbnNwb3J0R3VhcmFudGVlID0gVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVDsKLQkJdHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSwgb2xkVHJhbnNwb3J0R3VhcmFudGVlLCBUUkFOU1BPUlRfR1VBUkFOVEVFX0VERUZBVUxULCBvbGRUcmFuc3BvcnRHdWFyYW50ZWVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSB7Ci0JCXJldHVybiB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU2VjdXJpdHlDb25zdHJhaW50KWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50LCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCkgewotCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZWNDb25zdHJhaW50KG5ld1NlY0NvbnN0cmFpbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCwgbmV3U2VjQ29uc3RyYWludCwgbmV3U2VjQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWNDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXJldHVybiBnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQlzZXRUcmFuc3BvcnRHdWFyYW50ZWUoKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlzZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXVuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNwb3J0R3VhcmFudGVlOiAiKTsKLQkJaWYgKHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0R3VhcmFudGVlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjVmMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotCi0vKioKLSAqIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLSAqIGEgd2ViIGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwSW1wbCBleHRlbmRzIEpORElFbnZSZWZzR3JvdXBJbXBsIGltcGxlbWVudHMgV2ViQXBwIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rpc3RyaWJ1dGFibGUoKSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEaXN0cmlidXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRElTVFJJQlVUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzdHJpYnV0YWJsZSA9IERJU1RSSUJVVEFCTEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXN0cmlidXRhYmxlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGV4dHMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlcnJvclBhZ2VzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgV2VsY29tZUZpbGVMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnTGlicyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnN0cmFpbnRzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9naW5Db25maWcgbG9naW5Db25maWcgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtaW1lTWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2bGV0TWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2bGV0cyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWx0ZXJzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmlsdGVyTWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsaXN0ZW5lcnMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRQYXJhbXMoKSA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRleHRQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwQ29uZmlnKCkgPGVtPkpzcCBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpzcENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbmZpZyBqc3BDb25maWcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbnVsbDsKLQotCXB1YmxpYyBXZWJBcHBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQOwotCX0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYkFwcAotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSkgIT0gbnVsbDsKLX0KLXB1YmxpYyBFcnJvclBhZ2UgZ2V0RXJyb3JQYWdlQnlDb2RlKEludGVnZXIgY29kZSkgewotCUxpc3QgbGVycm9yUGFnZXMgPSBnZXRFcnJvclBhZ2VzKCk7Ci0JU3RyaW5nIGNvZGVTdHJpbmcgPSBjb2RlLnRvU3RyaW5nKCk7Ci0JSXRlcmF0b3IgaWUgPSBsZXJyb3JQYWdlcy5pdGVyYXRvcigpOwotCXdoaWxlIChpZS5oYXNOZXh0KCkpIHsKLQkJRXJyb3JQYWdlIGVwID0gKEVycm9yUGFnZSkgaWUubmV4dCgpOwotCQlpZiAoZXAuaXNFcnJvckNvZGUoKSkgewotCQkJRXJyb3JDb2RlRXJyb3JQYWdlIGVjZXAgPSAoRXJyb3JDb2RlRXJyb3JQYWdlKSBlcDsKLQkJCWlmIChjb2RlU3RyaW5nLmVxdWFscyhlY2VwLmdldEVycm9yQ29kZSgpKSkKLQkJCQlyZXR1cm4gZWNlcDsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBFcnJvclBhZ2UgZ2V0RXJyb3JQYWdlQnlFeGNlcHRpb25UeXBlKFN0cmluZyBleGNlcHRpb25UeXBlKSB7Ci0JaWYgKGV4Y2VwdGlvblR5cGUgIT0gbnVsbCkgewotCQlMaXN0IGxlcnJvclBhZ2VzID0gZ2V0RXJyb3JQYWdlcygpOwotCQlJdGVyYXRvciBpZSA9IGxlcnJvclBhZ2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpZS5oYXNOZXh0KCkpIHsKLQkJCUVycm9yUGFnZSBlcCA9IChFcnJvclBhZ2UpIGllLm5leHQoKTsKLQkJCWlmIChlcC5pc0V4Y2VwdGlvblR5cGUoKSkgewotCQkJCUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgZXRlcCA9IChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKSBlcDsKLQkJCQlpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoZXRlcC5nZXRFeGNlcHRpb25UeXBlTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGV0ZXA7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEZpbmRzIGEgZmlsdGVyIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWVkIGZpbHRlci4KLSAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBmaW5kIHRoZSBtYXBwaW5nIGZvci4KLSAqIEByZXR1cm4gVGhlIGZpcnN0IGZpbHRlciBtYXBwaW5nIGZvdW5kIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciwgb3IgbnVsbCBpZiBubwotICogbWFwcGluZyBleGlzdHMgZm9yIHRoZSBmaWx0ZXIuCi0gKi8KLXB1YmxpYyBGaWx0ZXJNYXBwaW5nIGdldEZpbHRlck1hcHBpbmcoCi0JRmlsdGVyIGFGaWx0ZXIpIHsKLQlpZiAoYUZpbHRlciAhPSBudWxsKSB7Ci0JCUxpc3QgbWFwcGluZ3MgPSBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQlGaWx0ZXJNYXBwaW5nIG1hcHBpbmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCW1hcHBpbmcgPSAoRmlsdGVyTWFwcGluZykgbWFwcGluZ3MuZ2V0KGkpOwotCQkJaWYgKGFGaWx0ZXIuZXF1YWxzKG1hcHBpbmcuZ2V0RmlsdGVyKCkpKSAKLQkJCQlyZXR1cm4gbWFwcGluZzsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogZ2V0RmlsdGVyTmFtZWQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBGaWx0ZXIgZ2V0RmlsdGVyTmFtZWQoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JTGlzdCBsZmlsdGVycyA9IGdldEZpbHRlcnMoKTsKLQlpZiAobGZpbHRlcnMgPT0gbnVsbCB8fCBsZmlsdGVycy5zaXplKCkgPT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JRmlsdGVyIG5leHQ7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZmlsdGVycy5zaXplKCk7IGkrKykgewotCQluZXh0ID0gKEZpbHRlcikgbGZpbHRlcnMuZ2V0KGkpOwotCQlpZiAobmV4dC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBMaXN0IGdldEZpbHRlck5hbWVzKCkgewotCUxpc3QgbmFtZXMsIGxmaWx0ZXJzID0gZ2V0RmlsdGVycygpOwotCW5hbWVzID0gbmV3IEFycmF5TGlzdChsZmlsdGVycy5zaXplKCkpOwotCUZpbHRlciBuZXh0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJbmV4dCA9IChGaWx0ZXIpIGxmaWx0ZXJzLmdldChpKTsKLQkJbmFtZXMuYWRkKG5leHQuZ2V0TmFtZSgpKTsKLQl9Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uCi0gKiBAcGFyYW0gQW4gZXh0ZW5zaW9uIHRvIGZpbmQgdGhlIG1pbWUgdHlwZSBmb3IuCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1pbWVUeXBlKGphdmEubGFuZy5TdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCUxpc3QgbWFwcGluZ3MgPSBnZXRNaW1lTWFwcGluZ3MoKTsKLQkJTWltZU1hcHBpbmcgbWFwcGluZzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5zaXplKCk7IGkrKykgewotCQkJbWFwcGluZyA9IChNaW1lTWFwcGluZykgbWFwcGluZ3MuZ2V0KGkpOwotCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHMobWFwcGluZy5nZXRFeHRlbnNpb24oKSkpCi0JCQkJcmV0dXJuIG1hcHBpbmcuZ2V0TWltZVR5cGUoKTsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIHJvbGVOYW1lKSB7Ci0JamF2YS51dGlsLkxpc3QgdGVtcFJvbGVzID0gZ2V0U2VjdXJpdHlSb2xlcygpOwotCVNlY3VyaXR5Um9sZSByb2xlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcFJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSB0ZW1wUm9sZXMuZ2V0KGkpOwotCQlpZiAocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhyb2xlTmFtZSkpCi0JCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEZpbmRzIGEgc2VydmxldCBtYXBwaW5nIGZvciBhIHNwZWNpZmllZCBzZXJ2bGV0LgotICogQHBhcmFtIHNlcnZsZXQgVGhlIHNlcnZsZXQgdG8gZmluZCB0aGUgbWFwcGluZ3MgZm9yLgotICogQHJldHVybiBUaGUgc2VydmxldCBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZsZXQsIG9yIG51bGwgaWYgbm8KLSAqIG1hcHBpbmcgZXhpc3RzIGZvciB0aGUgc2VydmxldC4KLSAqLwotcHVibGljIFNlcnZsZXRNYXBwaW5nIGdldFNlcnZsZXRNYXBwaW5nKAotCVNlcnZsZXQgYVNlcnZsZXQpIHsKLQlpZiAoYVNlcnZsZXQgIT0gbnVsbCkgewotCQlMaXN0IG1hcHBpbmdzID0gZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JCVNlcnZsZXRNYXBwaW5nIG1hcHBpbmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCW1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpIG1hcHBpbmdzLmdldChpKTsKLQkJCWlmIChhU2VydmxldC5lcXVhbHMobWFwcGluZy5nZXRTZXJ2bGV0KCkpKSAKLQkJCQlyZXR1cm4gbWFwcGluZzsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogZ2V0U2VydmxldE5hbWVkIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0TmFtZWQoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JTGlzdCBsc2VydmxldHMgPSBnZXRTZXJ2bGV0cygpOwotCWlmIChsc2VydmxldHMgPT0gbnVsbCB8fCBsc2VydmxldHMuc2l6ZSgpID09IDApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCVNlcnZsZXQgbmV4dDsKLQlTdHJpbmcgbmV4dE5hbWU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJbmV4dCA9IChTZXJ2bGV0KSBsc2VydmxldHMuZ2V0KGkpOwotCQluZXh0TmFtZSA9IG5leHQuZ2V0U2VydmxldE5hbWUoKTsKLQkJaWYgKG5leHROYW1lICE9IG51bGwgJiYgbmV4dE5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBMaXN0IGdldFNlcnZsZXROYW1lcygpIHsKLQlMaXN0IG5hbWVzLCBsc2VydmxldHMgPSBnZXRTZXJ2bGV0cygpOwotCW5hbWVzID0gbmV3IEFycmF5TGlzdChsc2VydmxldHMuc2l6ZSgpKTsKLQlTZXJ2bGV0IG5leHQ7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJbmV4dCA9IChTZXJ2bGV0KSBsc2VydmxldHMuZ2V0KGkpOwotCQluYW1lcy5hZGQobmV4dC5nZXRTZXJ2bGV0TmFtZSgpKTsKLQl9Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgV2ViIEFwcCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gU2VydmxldDIuMiBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yXzJEZXNjcmlwdG9yKCkgewotCUNvbW1vblV0aWwuY2hlY2tERE9iamVjdEZvclZlcnNpb24odGhpcyk7Ci0JU3RyaW5nIHN5c3RlbUlkID0gKChYTUxSZXNvdXJjZSllUmVzb3VyY2UoKSkuZ2V0U3lzdGVtSWQoKTsKLQlyZXR1cm4gc3lzdGVtSWQgPT0gbnVsbCA/IGZhbHNlIDogc3lzdGVtSWQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMik7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBXZWIgQXBwIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBTZXJ2bGV0Mi4zIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfM0Rlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zKTsKLX0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHAKLSAqLwotcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgamF2YS5sYW5nLlN0cmluZyBuZXdSb2xlTmFtZSkgewotCVNlY3VyaXR5Um9sZSByb2xlID0gZ2V0U2VjdXJpdHlSb2xlTmFtZWQoZXhpc3RpbmdSb2xlTmFtZSk7Ci0JaWYgKHJvbGUgIT0gbnVsbCkKLQkJcm9sZS5zZXRSb2xlTmFtZShuZXdSb2xlTmFtZSk7Ci0JTGlzdCB0aGVTZXJ2bGV0cyA9IGdldFNlcnZsZXRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVTZXJ2bGV0cy5zaXplKCk7IGkrKyl7Ci0JCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXRoZVNlcnZsZXRzLmdldChpKTsKLQkJc2VydmxldC5yZVN5bmNTZWN1cml0eVJvbGVSZWYoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCX0KLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzIHByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0bwotCSAqIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzdHJpYnV0YWJsZSgpIHsKLQkJcmV0dXJuIGRpc3RyaWJ1dGFibGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIG5ld0Rpc3RyaWJ1dGFibGUpIHsKLQkJYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlID0gZGlzdHJpYnV0YWJsZTsKLQkJZGlzdHJpYnV0YWJsZSA9IG5ld0Rpc3RyaWJ1dGFibGU7Ci0JCWJvb2xlYW4gb2xkRGlzdHJpYnV0YWJsZUVTZXQgPSBkaXN0cmlidXRhYmxlRVNldDsKLQkJZGlzdHJpYnV0YWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRSwgb2xkRGlzdHJpYnV0YWJsZSwgZGlzdHJpYnV0YWJsZSwgIW9sZERpc3RyaWJ1dGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREaXN0cmlidXRhYmxlKCkgewotCQlib29sZWFuIG9sZERpc3RyaWJ1dGFibGUgPSBkaXN0cmlidXRhYmxlOwotCQlib29sZWFuIG9sZERpc3RyaWJ1dGFibGVFU2V0ID0gZGlzdHJpYnV0YWJsZUVTZXQ7Ci0JCWRpc3RyaWJ1dGFibGUgPSBESVNUUklCVVRBQkxFX0VERUZBVUxUOwotCQlkaXN0cmlidXRhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFLCBvbGREaXN0cmlidXRhYmxlLCBESVNUUklCVVRBQkxFX0VERUZBVUxULCBvbGREaXN0cmlidXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGlzdHJpYnV0YWJsZSgpIHsKLQkJcmV0dXJuIGRpc3RyaWJ1dGFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRleHRzKCkgewotCQlpZiAoY29udGV4dHMgPT0gbnVsbCkgewotCQkJY29udGV4dHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChDb250ZXh0UGFyYW0uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBjb250ZXh0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXJyb3JQYWdlcygpIHsKLQkJaWYgKGVycm9yUGFnZXMgPT0gbnVsbCkgewotCQkJZXJyb3JQYWdlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEVycm9yUGFnZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIGVycm9yUGFnZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdCBnZXRGaWxlTGlzdCgpIHsKLQkJcmV0dXJuIGZpbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBuZXdGaWxlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXZWxjb21lRmlsZUxpc3Qgb2xkRmlsZUxpc3QgPSBmaWxlTGlzdDsKLQkJZmlsZUxpc3QgPSBuZXdGaWxlTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVCwgb2xkRmlsZUxpc3QsIG5ld0ZpbGVMaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgbmV3RmlsZUxpc3QpIHsKLQkJaWYgKG5ld0ZpbGVMaXN0ICE9IGZpbGVMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChmaWxlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmaWxlTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0ZpbGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ZpbGVMaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRGaWxlTGlzdChuZXdGaWxlTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBuZXdGaWxlTGlzdCwgbmV3RmlsZUxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFnTGlicygpIHsKLQkJaWYgKHRhZ0xpYnMgPT0gbnVsbCkgewotCQkJdGFnTGlicyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KFRhZ0xpYlJlZi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiB0YWdMaWJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25zdHJhaW50cygpIHsKLQkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIHsKLQkJCWNvbnN0cmFpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gY29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JKiBUaGlzIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSovCi0JCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJLy8gZml4IGRlZmVjdCAzMjc2LCB3aGVuIHJlc291cmNlIGlzIHVubG9hZGVkCi0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkKLQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuNCIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIyLjMiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4yIikpLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCQotCQl9Ci0JCXJldHVybiByZXMuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIExvZ2luQ29uZmlnIGdldExvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gbG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9naW5Db25maWcoTG9naW5Db25maWcgbmV3TG9naW5Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTG9naW5Db25maWcgb2xkTG9naW5Db25maWcgPSBsb2dpbkNvbmZpZzsKLQkJbG9naW5Db25maWcgPSBuZXdMb2dpbkNvbmZpZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRywgb2xkTG9naW5Db25maWcsIG5ld0xvZ2luQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBuZXdMb2dpbkNvbmZpZykgewotCQlpZiAobmV3TG9naW5Db25maWcgIT0gbG9naW5Db25maWcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxvZ2luQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBMb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3TG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9naW5Db25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFAsIExvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvZ2luQ29uZmlnKG5ld0xvZ2luQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIG5ld0xvZ2luQ29uZmlnLCBuZXdMb2dpbkNvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCWlmIChtaW1lTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbWltZU1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTWltZU1hcHBpbmcuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gbWltZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ29uZmlnIGdldFNlc3Npb25Db25maWcoKSB7Ci0JCXJldHVybiBzZXNzaW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBuZXdTZXNzaW9uQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlc3Npb25Db25maWcgb2xkU2Vzc2lvbkNvbmZpZyA9IHNlc3Npb25Db25maWc7Ci0JCXNlc3Npb25Db25maWcgPSBuZXdTZXNzaW9uQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcsIG9sZFNlc3Npb25Db25maWcsIG5ld1Nlc3Npb25Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBuZXdTZXNzaW9uQ29uZmlnKSB7Ci0JCWlmIChuZXdTZXNzaW9uQ29uZmlnICE9IHNlc3Npb25Db25maWcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlc3Npb25Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2Vzc2lvbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdTZXNzaW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Nlc3Npb25Db25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXNzaW9uQ29uZmlnKG5ld1Nlc3Npb25Db25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBuZXdTZXNzaW9uQ29uZmlnLCBuZXdTZXNzaW9uQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlcnZsZXRNYXBwaW5ncygpIHsKLQkJaWYgKHNlcnZsZXRNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0TWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChTZXJ2bGV0TWFwcGluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBzZXJ2bGV0TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlcnZsZXRzKCkgewotCQlpZiAoc2VydmxldHMgPT0gbnVsbCkgewotCQkJc2VydmxldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChTZXJ2bGV0LmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gc2VydmxldHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWx0ZXJzKCkgewotCQlpZiAoZmlsdGVycyA9PSBudWxsKSB7Ci0JCQlmaWx0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEZpbHRlci5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWx0ZXJNYXBwaW5ncygpIHsKLQkJaWYgKGZpbHRlck1hcHBpbmdzID09IG51bGwpIHsKLQkJCWZpbHRlck1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEZpbHRlck1hcHBpbmcuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbGlzdGVuZXJzIGNvbGxlY3Rpb24gY29udGFpbnMgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYiBhcHBsaWNhdGlvbgotCSAqIGxpc3RlbmVyIGJlYW5zIGluIHRoZSB3ZWIgYXBwLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpc3RlbmVyLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTKTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZXh0UGFyYW1zKCkgewotCQlpZiAoY29udGV4dFBhcmFtcyA9PSBudWxsKSB7Ci0JCQljb250ZXh0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQ6IFVzZSBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnZFbnRyaWVzKCkgewotCQkKLQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKU1BDb25maWcgZ2V0SnNwQ29uZmlnKCkgewotCQlyZXR1cm4ganNwQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEpzcENvbmZpZyhKU1BDb25maWcgbmV3SnNwQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUpTUENvbmZpZyBvbGRKc3BDb25maWcgPSBqc3BDb25maWc7Ci0JCWpzcENvbmZpZyA9IG5ld0pzcENvbmZpZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUcsIG9sZEpzcENvbmZpZywgbmV3SnNwQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3BDb25maWcoSlNQQ29uZmlnIG5ld0pzcENvbmZpZykgewotCQlpZiAobmV3SnNwQ29uZmlnICE9IGpzcENvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoanNwQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpzcENvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKc3BDb25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SnNwQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SnNwQ29uZmlnKG5ld0pzcENvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRywgbmV3SnNwQ29uZmlnLCBuZXdKc3BDb25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IG9sZExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA9IGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQkJbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNULCBvbGRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QsIG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpIHsKLQkJaWYgKG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCAhPSBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QobmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QsIG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCwgbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZXh0cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVycm9yUGFnZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCWlmIChmaWxlTGlzdCAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZmlsZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnN0cmFpbnRzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlpZiAobG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxvZ2luQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9naW5Db25maWcoKExvZ2luQ29uZmlnKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaW1lTWFwcGluZ3MoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJaWYgKHNlc3Npb25Db25maWcgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlc3Npb25Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFNlc3Npb25Db25maWcoKFNlc3Npb25Db25maWcpb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRNYXBwaW5ncygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZXh0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVycm9yUGFnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCXJldHVybiBiYXNpY1NldEZpbGVMaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdMaWJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uc3RyYWludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBiYXNpY1NldExvZ2luQ29uZmlnKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1pbWVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXNzaW9uQ29uZmlnKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsdGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWx0ZXJNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZXh0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SnNwQ29uZmlnKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJcmV0dXJuIGlzRGlzdHJpYnV0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCXJldHVybiBnZXRDb250ZXh0cygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuIGdldEVycm9yUGFnZXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gZ2V0RmlsZUxpc3QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCXJldHVybiBnZXRUYWdMaWJzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludHMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0TG9naW5Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldE1pbWVNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldFNlc3Npb25Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVycygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRMaXN0ZW5lcnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRDb250ZXh0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXJldHVybiBnZXRKc3BDb25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFOgotCQkJCXNldERpc3RyaWJ1dGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCWdldENvbnRleHRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZXh0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJZ2V0RXJyb3JQYWdlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXJyb3JQYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCXNldEZpbGVMaXN0KChXZWxjb21lRmlsZUxpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCWdldFRhZ0xpYnMoKS5jbGVhcigpOwotCQkJCWdldFRhZ0xpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTOgotCQkJCWdldENvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXNldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldE1pbWVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJc2V0U2Vzc2lvbkNvbmZpZygoU2Vzc2lvbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCWdldEZpbHRlcnMoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlnZXRGaWx0ZXJNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlnZXRMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCWdldExpc3RlbmVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRzoKLQkJCQlzZXRKc3BDb25maWcoKEpTUENvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXNldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKLQkJCQl1bnNldERpc3RyaWJ1dGFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJZ2V0Q29udGV4dHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCWdldEVycm9yUGFnZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCWdldFRhZ0xpYnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTOgotCQkJCWdldENvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUc6Ci0JCQkJc2V0TG9naW5Db25maWcoKExvZ2luQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRzoKLQkJCQlzZXRTZXNzaW9uQ29uZmlnKChTZXNzaW9uQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlnZXRTZXJ2bGV0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlnZXRGaWx0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlnZXRMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJc2V0SnNwQ29uZmlnKChKU1BDb25maWcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXNldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKLQkJCQlyZXR1cm4gaXNTZXREaXN0cmlidXRhYmxlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUzoKLQkJCQlyZXR1cm4gY29udGV4dHMgIT0gbnVsbCAmJiAhY29udGV4dHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuIGVycm9yUGFnZXMgIT0gbnVsbCAmJiAhZXJyb3JQYWdlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIGZpbGVMaXN0ICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gdGFnTGlicyAhPSBudWxsICYmICF0YWdMaWJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiBjb25zdHJhaW50cyAhPSBudWxsICYmICFjb25zdHJhaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGxvZ2luQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiBtaW1lTWFwcGluZ3MgIT0gbnVsbCAmJiAhbWltZU1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCXJldHVybiBzZXNzaW9uQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCXJldHVybiBzZXJ2bGV0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc2VydmxldE1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCXJldHVybiBzZXJ2bGV0cyAhPSBudWxsICYmICFzZXJ2bGV0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJcmV0dXJuIGZpbHRlcnMgIT0gbnVsbCAmJiAhZmlsdGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGZpbHRlck1hcHBpbmdzICE9IG51bGwgJiYgIWZpbHRlck1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gbGlzdGVuZXJzICE9IG51bGwgJiYgIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlyZXR1cm4gY29udGV4dFBhcmFtcyAhPSBudWxsICYmICFjb250ZXh0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJcmV0dXJuIGpzcENvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlzdHJpYnV0YWJsZTogIik7Ci0JCWlmIChkaXN0cmlidXRhYmxlRVNldCkgcmVzdWx0LmFwcGVuZChkaXN0cmlidXRhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI3OWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgewotCi0JLyoqCi0JICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yLCAid2ViLWFwcF8yXzIuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzIsICJ3ZWItYXBwXzIuMi5kdGQiKTsJLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zLCAid2ViLWFwcF8yXzMuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzMsICJ3ZWItYXBwXzIuMy5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfQVBQX1NDSEVNQV9MT0NfMl80LCAid2ViLWFwcF8yXzQueHNkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuSlNQX1NDSEVNQV9MT0NfMl8wLCAianNwXzJfMC54c2QiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwUmVzb3VyY2VGYWN0b3J5KCkgewotCQlzdXBlcihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsgCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViQXBwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOyAKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgV2ViQXBwUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7IAotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfU0hPUlRfTkFNRSwgbmV3IFdlYkFwcFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpc3RlciB1c2luZyB0aGUgZGVmYXVsdCByZW5kZXJlciBmYWN0b3J5LgotCSAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7CQkKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUsIG5ldyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0KLQkJU3lzdGVtLmVyci5wcmludGxuKCJmZXRjaGluZyByZWdpc3RlcmVkIGZhY3RvcnkgZm9yIHdlYiBhcHAgdXJpIik7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjdhYmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJhcHBsaWNhdGlvbi5XZWJBcHBUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgV2ViQXBwUmVzb3VyY2UgewotCi0JCi0JcHVibGljIFdlYkFwcFJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotCXB1YmxpYyBXZWJBcHBSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCXJldHVybiAoV2ViQXBwKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfQUxUX1NZU1RFTUlEXzJfMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzM7Ci0JfQotCS8qCi0JICogQHNlZSBXZWJBcHBSZXNvdXJjZSNpc1dlYjJfMigpCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0TW9kdWxlVmVyc2lvbklEKCkgYW5kIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWIyXzIoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKSA9PSBXRUJfMl8yX0lEOwotCX0KLQkvKgotCSAqIEBzZWUgV2ViQXBwUmVzb3VyY2UjaXNXZWIyXzMoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViMl8zKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gV0VCXzJfM19JRDsKLQl9Ci0JLyoKLQkgKiBAc2VlIFdlYkFwcFJlc291cmNlI2lzV2ViMl80KCkKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRNb2R1bGVWZXJzaW9uSUQoKSBhbmQgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYjJfNCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpID09IFdFQl8yXzRfSUQ7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0RG9jdHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBXRUJfQVBQX1RZUEU7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBXZWJBcHBUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIChXRUJfMl80X0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdFQl8yXzNfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoV0VCXzJfMl9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkKLQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdFQl8yXzRfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCXzJfM19JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJfMl8yX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV0VCXzJfNF9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJV2ViQXBwIGFwcCA9IGdldFdlYkFwcCgpOwotCQlpZiAoYXBwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVN0cmluZyB2ZXJzaW9uID0gYXBwLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBnZXRNb2R1bGVWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmICghbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpCi0JCQlhcHAuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmNmY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlJlc291cmNlQ29sbGVjdGlvbiwgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd2ViUmVzb3VyY2VOYW1lID0gV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHVybFBhdHRlcm4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHR0cE1ldGhvZCgpIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaHR0cE1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJMcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SFRUUHMoKSA8ZW0+SFRUIFBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhUVFBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaHR0UHMgPSBudWxsOwotCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOwotCX0KLQotLyoqCi0gKiBhZGRIVFRQIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhZGRIVFRQKGphdmEubGFuZy5TdHJpbmcgYWh0dHBNZXRob2QpIHsKLQlIVFRQTWV0aG9kVHlwZSBodHRwID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0JaHR0cC5zZXRIdHRwTWV0aG9kKGFodHRwTWV0aG9kKTsKLQlnZXRIVFRQcygpLmFkZChodHRwKTsKLX0KLS8qKgotICogYWRkVVJMIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhZGRVUkwoamF2YS5sYW5nLlN0cmluZyBhdXJsUGF0dGVybikgewotCVVSTFBhdHRlcm5UeXBlIHVybCA9IGdldEZhY3RvcnkoKS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotCXVybC5zZXRVcmxQYXR0ZXJuKGF1cmxQYXR0ZXJuKTsKLQlnZXRVUkxzKCkuYWRkKHVybCk7Ci19Ci1wdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JcmV0dXJuICgoV2ViYXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSkuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYlJlc291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIHdlYlJlc291cmNlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJSZXNvdXJjZU5hbWUoU3RyaW5nIG5ld1dlYlJlc291cmNlTmFtZSkgewotCQlTdHJpbmcgb2xkV2ViUmVzb3VyY2VOYW1lID0gd2ViUmVzb3VyY2VOYW1lOwotCQl3ZWJSZXNvdXJjZU5hbWUgPSBuZXdXZWJSZXNvdXJjZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUUsIG9sZFdlYlJlc291cmNlTmFtZSwgd2ViUmVzb3VyY2VOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFVybFBhdHRlcm4oKSB7Ci0JCWlmICh1cmxQYXR0ZXJuID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm4gPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOKTsKLQkJfQotCQlyZXR1cm4gdXJsUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SHR0cE1ldGhvZCgpIHsKLQkJaWYgKGh0dHBNZXRob2QgPT0gbnVsbCkgewotCQkJaHR0cE1ldGhvZCA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChIVFRQTWV0aG9kVHlwZUVudW0uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0QpOwotCQl9Ci0JCXJldHVybiBodHRwTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU2VjdXJpdHlDb25zdHJhaW50KWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50LCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCkgewotCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjQ29uc3RyYWludChuZXdTZWNDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQsIG5ld1NlY0NvbnN0cmFpbnQsIG5ld1NlY0NvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIHVzZSBnZXRVcmxQYXR0ZXJuKCkKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFVSTHMoKSB7Ci0JCWlmICh1ckxzID09IG51bGwpIHsKLQkJCXVyTHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChVUkxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gdXJMczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIHVzZSBnZXRIdHRwTWV0aG9kcygpCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRIVFRQcygpIHsKLQkJaWYgKGh0dFBzID09IG51bGwpIHsKLQkJCWh0dFBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEhUVFBNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUyk7Ci0JCX0KLQkJcmV0dXJuIGh0dFBzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVSTHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VjQ29uc3RyYWludChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVSTHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SFRUUHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgotCQkJCXJldHVybiBnZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EOgotCQkJCXJldHVybiBnZXRIdHRwTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQlyZXR1cm4gZ2V0VVJMcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTOgotCQkJCXJldHVybiBnZXRIVFRQcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJc2V0V2ViUmVzb3VyY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk46Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EOgotCQkJCWdldEh0dHBNZXRob2QoKS5jbGVhcigpOwotCQkJCWdldEh0dHBNZXRob2QoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlzZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQlnZXRVUkxzKCkuY2xlYXIoKTsKLQkJCQlnZXRVUkxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTOgotCQkJCWdldEhUVFBzKCkuY2xlYXIoKTsKLQkJCQlnZXRIVFRQcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlzZXRXZWJSZXNvdXJjZU5hbWUoV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOOgotCQkJCWdldFVybFBhdHRlcm4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlnZXRIdHRwTWV0aG9kKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQlnZXRVUkxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQlnZXRIVFRQcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJcmV0dXJuIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3ZWJSZXNvdXJjZU5hbWUgIT0gbnVsbCA6ICFXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMod2ViUmVzb3VyY2VOYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gdXJsUGF0dGVybiAhPSBudWxsICYmICF1cmxQYXR0ZXJuLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlyZXR1cm4gaHR0cE1ldGhvZCAhPSBudWxsICYmICFodHRwTWV0aG9kLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuIHVyTHMgIT0gbnVsbCAmJiAhdXJMcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFM6Ci0JCQkJcmV0dXJuIGh0dFBzICE9IG51bGwgJiYgIWh0dFBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlYlJlc291cmNlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2ViUmVzb3VyY2VOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVybFBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVybFBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh0dHBNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh0dHBNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzg5NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdlYlR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViVHlwZSB7Ci0KLQlwdWJsaWMgV2ViVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLldFQl9UWVBFOwotCX0KLQotLyoqCi0gKiBpc0pzcFR5cGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzSnNwVHlwZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIGlzU2VydmxldFR5cGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzU2VydmxldFR5cGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjAyYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSB7Ci0gCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgdGhlV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gKFdlYmFwcGxpY2F0aW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid2ViYXBwbGljYXRpb24ueG1pIik7IAotCQkJaWYgKHRoZVdlYmFwcGxpY2F0aW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVdlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBXZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU1fVkVSU0lPTiA9ICIxLjEiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUDogcmV0dXJuIGNyZWF0ZVdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTTogcmV0dXJuIGNyZWF0ZUNvbnRleHRQYXJhbSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVDogcmV0dXJuIGNyZWF0ZVNlcnZsZXQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJRzogcmV0dXJuIGNyZWF0ZVNlc3Npb25Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElORzogcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDogcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRTogcmV0dXJuIGNyZWF0ZUVycm9yUGFnZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUY6IHJldHVybiBjcmVhdGVUYWdMaWJSZWYoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlQ6IHJldHVybiBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOiByZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlQ6IHJldHVybiBjcmVhdGVBdXRoQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlQ6IHJldHVybiBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJRzogcmV0dXJuIGNyZWF0ZUxvZ2luQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogcmV0dXJuIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTTogcmV0dXJuIGNyZWF0ZUluaXRQYXJhbSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFOiByZXR1cm4gY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFOiByZXR1cm4gY3JlYXRlSlNQVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRTogcmV0dXJuIGNyZWF0ZVVSTFBhdHRlcm5UeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRTogcmV0dXJuIGNyZWF0ZVJvbGVOYW1lVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFOiByZXR1cm4gY3JlYXRlV2VsY29tZUZpbGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0U6IHJldHVybiBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0U6IHJldHVybiBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HOiByZXR1cm4gY3JlYXRlRmlsdGVyTWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSOiByZXR1cm4gY3JlYXRlRmlsdGVyKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6IHJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkc6IHJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRTogcmV0dXJuIGNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUkVTX0FVVEhfU0VSVkxFVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSZXNBdXRoU2VydmxldFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfRU5VTToKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUE1ldGhvZFR5cGVFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkRJU1BBVENIRVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfTUVUSE9EX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhNZXRob2RLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUkVTX0FVVEhfU0VSVkxFVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UmVzQXV0aFNlcnZsZXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfRU5VTToKLQkJCQlyZXR1cm4gY29udmVydEhUVFBNZXRob2RUeXBlRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkRJU1BBVENIRVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERpc3BhdGNoZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfTUVUSE9EX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBdXRoTWV0aG9kS2luZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLXB1YmxpYyBzdGF0aWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChXZWJhcHBsaWNhdGlvbkZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYkFwcCBjcmVhdGVXZWJBcHAoKSB7Ci0JCVdlYkFwcEltcGwgd2ViQXBwID0gbmV3IFdlYkFwcEltcGwoKTsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFBhcmFtIGNyZWF0ZUNvbnRleHRQYXJhbSgpIHsKLQkJQ29udGV4dFBhcmFtSW1wbCBjb250ZXh0UGFyYW0gPSBuZXcgQ29udGV4dFBhcmFtSW1wbCgpOwotCQlyZXR1cm4gY29udGV4dFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCkgewotCQlFcnJvclBhZ2VJbXBsIGVycm9yUGFnZSA9IG5ldyBFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBlcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYlJlZiBjcmVhdGVUYWdMaWJSZWYoKSB7Ci0JCVRhZ0xpYlJlZkltcGwgdGFnTGliUmVmID0gbmV3IFRhZ0xpYlJlZkltcGwoKTsKLQkJcmV0dXJuIHRhZ0xpYlJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkgewotCQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCBleGNlcHRpb25UeXBlRXJyb3JQYWdlID0gbmV3IEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBleGNlcHRpb25UeXBlRXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGVFcnJvclBhZ2UgY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCkgewotCQlFcnJvckNvZGVFcnJvclBhZ2VJbXBsIGVycm9yQ29kZUVycm9yUGFnZSA9IG5ldyBFcnJvckNvZGVFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBlcnJvckNvZGVFcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdCBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKSB7Ci0JCVdlbGNvbWVGaWxlTGlzdEltcGwgd2VsY29tZUZpbGVMaXN0ID0gbmV3IFdlbGNvbWVGaWxlTGlzdEltcGwoKTsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGUgY3JlYXRlV2VsY29tZUZpbGUoKSB7Ci0JCVdlbGNvbWVGaWxlSW1wbCB3ZWxjb21lRmlsZSA9IG5ldyBXZWxjb21lRmlsZUltcGwoKTsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCkgewotCQlTZWN1cml0eUNvbnN0cmFpbnRJbXBsIHNlY3VyaXR5Q29uc3RyYWludCA9IG5ldyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0JCVdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgd2ViUmVzb3VyY2VDb2xsZWN0aW9uID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVVJMUGF0dGVyblR5cGUgY3JlYXRlVVJMUGF0dGVyblR5cGUoKSB7Ci0JCVVSTFBhdHRlcm5UeXBlSW1wbCB1cmxQYXR0ZXJuVHlwZSA9IG5ldyBVUkxQYXR0ZXJuVHlwZUltcGwoKTsKLQkJcmV0dXJuIHVybFBhdHRlcm5UeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludCBjcmVhdGVBdXRoQ29uc3RyYWludCgpIHsKLQkJQXV0aENvbnN0cmFpbnRJbXBsIGF1dGhDb25zdHJhaW50ID0gbmV3IEF1dGhDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCVVzZXJEYXRhQ29uc3RyYWludEltcGwgdXNlckRhdGFDb25zdHJhaW50ID0gbmV3IFVzZXJEYXRhQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWcgY3JlYXRlTG9naW5Db25maWcoKSB7Ci0JCUxvZ2luQ29uZmlnSW1wbCBsb2dpbkNvbmZpZyA9IG5ldyBMb2dpbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGb3JtTG9naW5Db25maWcgY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCkgewotCQlGb3JtTG9naW5Db25maWdJbXBsIGZvcm1Mb2dpbkNvbmZpZyA9IG5ldyBGb3JtTG9naW5Db25maWdJbXBsKCk7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1pbWVNYXBwaW5nIGNyZWF0ZU1pbWVNYXBwaW5nKCkgewotCQlNaW1lTWFwcGluZ0ltcGwgbWltZU1hcHBpbmcgPSBuZXcgTWltZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBtaW1lTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkNvbmZpZyBjcmVhdGVTZXNzaW9uQ29uZmlnKCkgewotCQlTZXNzaW9uQ29uZmlnSW1wbCBzZXNzaW9uQ29uZmlnID0gbmV3IFNlc3Npb25Db25maWdJbXBsKCk7Ci0JCXJldHVybiBzZXNzaW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TWFwcGluZyBjcmVhdGVTZXJ2bGV0TWFwcGluZygpIHsKLQkJU2VydmxldE1hcHBpbmdJbXBsIHNlcnZsZXRNYXBwaW5nID0gbmV3IFNlcnZsZXRNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmxldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlcnZsZXQgY3JlYXRlU2VydmxldCgpIHsKLQkJU2VydmxldEltcGwgc2VydmxldCA9IG5ldyBTZXJ2bGV0SW1wbCgpOwotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VydmxldFR5cGUgY3JlYXRlU2VydmxldFR5cGUoKSB7Ci0JCVNlcnZsZXRUeXBlSW1wbCBzZXJ2bGV0VHlwZSA9IG5ldyBTZXJ2bGV0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXRUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKU1BUeXBlIGNyZWF0ZUpTUFR5cGUoKSB7Ci0JCUpTUFR5cGVJbXBsIGpzcFR5cGUgPSBuZXcgSlNQVHlwZUltcGwoKTsKLQkJcmV0dXJuIGpzcFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKSB7Ci0JCUluaXRQYXJhbUltcGwgaW5pdFBhcmFtID0gbmV3IEluaXRQYXJhbUltcGwoKTsKLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKLQkJRmlsdGVySW1wbCBmaWx0ZXIgPSBuZXcgRmlsdGVySW1wbCgpOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJNYXBwaW5nIGNyZWF0ZUZpbHRlck1hcHBpbmcoKSB7Ci0JCUZpbHRlck1hcHBpbmdJbXBsIGZpbHRlck1hcHBpbmcgPSBuZXcgRmlsdGVyTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGZpbHRlck1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbmV3IExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwoKTsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmcgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKSB7Ci0JCUxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCBsb2NhbEVuY29kaW5nTWFwcGluZyA9IG5ldyBMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQTWV0aG9kVHlwZSBjcmVhdGVIVFRQTWV0aG9kVHlwZSgpIHsKLQkJSFRUUE1ldGhvZFR5cGVJbXBsIGh0dHBNZXRob2RUeXBlID0gbmV3IEhUVFBNZXRob2RUeXBlSW1wbCgpOwotCQlyZXR1cm4gaHR0cE1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc0F1dGhTZXJ2bGV0VHlwZSBjcmVhdGVSZXNBdXRoU2VydmxldFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmVzQXV0aFNlcnZsZXRUeXBlIHJlc3VsdCA9IFJlc0F1dGhTZXJ2bGV0VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmVzQXV0aFNlcnZsZXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBNZXRob2RUeXBlRW51bSBjcmVhdGVIVFRQTWV0aG9kVHlwZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJSFRUUE1ldGhvZFR5cGVFbnVtIHJlc3VsdCA9IEhUVFBNZXRob2RUeXBlRW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SFRUUE1ldGhvZFR5cGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgY3JlYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHJlc3VsdCA9IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGF0Y2hlclR5cGUgY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gRGlzcGF0Y2hlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERpc3BhdGNoZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF1dGhNZXRob2RLaW5kIGNyZWF0ZUF1dGhNZXRob2RLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUF1dGhNZXRob2RLaW5kIHJlc3VsdCA9IEF1dGhNZXRob2RLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRoTWV0aG9kS2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSb2xlTmFtZVR5cGUgY3JlYXRlUm9sZU5hbWVUeXBlKCkgewotCQlSb2xlTmFtZVR5cGVJbXBsIHJvbGVOYW1lVHlwZSA9IG5ldyBSb2xlTmFtZVR5cGVJbXBsKCk7Ci0JCXJldHVybiByb2xlTmFtZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBnZXRXZWJhcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoV2ViYXBwbGljYXRpb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmFjY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJhcHBsaWNhdGlvblBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJBcHBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGV4dFBhcmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZsZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmxldE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2Vzc2lvbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWxjb21lRmlsZUxpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXJyb3JQYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhZ0xpYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF1dGhDb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2dpbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmb3JtTG9naW5Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5pdFBhcmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYlR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmxldFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1cmxQYXR0ZXJuVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlTmFtZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2VsY29tZUZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsdGVyTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWx0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBNZXRob2RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzQXV0aFNlcnZsZXRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBodHRwTWV0aG9kVHlwZUVudW1FRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRpc3BhdGNoZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBhdXRoTWV0aG9kS2luZEVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJBcHAoKSB7Ci0JCXJldHVybiB3ZWJBcHBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9FcnJvclBhZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbGVMaXN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1RhZ0xpYnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfSnNwQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZXh0UGFyYW0oKSB7Ci0JCXJldHVybiBjb250ZXh0UGFyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX1BhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGV4dFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGV4dFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JQYWdlKCkgewotCQlyZXR1cm4gZXJyb3JQYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUGFnZV9Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVycm9yUGFnZV9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKSB7Ci0JCXJldHVybiBleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVycm9yQ29kZUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGVycm9yQ29kZUVycm9yUGFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWxjb21lRmlsZUxpc3QoKSB7Ci0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVMaXN0X1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlbGNvbWVGaWxlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2VsY29tZUZpbGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWxjb21lRmlsZSgpIHsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2VsY29tZUZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlbGNvbWVGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYWdMaWJSZWYoKSB7Ci0JCXJldHVybiB0YWdMaWJSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0xpYlJlZl9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVVJMcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSFRUUHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVSTFBhdHRlcm5UeXBlKCkgewotCQlyZXR1cm4gdXJsUGF0dGVyblR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVybFBhdHRlcm5UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VVJMUGF0dGVyblR5cGVfUmVzQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXVybFBhdHRlcm5UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQTWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIGh0dHBNZXRob2RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlodHRwTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiB1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVzZXJEYXRhQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBsb2dpbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvZ2luQ29uZmlnX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZvcm1Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNaW1lTWFwcGluZygpIHsKLQkJcmV0dXJuIG1pbWVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXNzaW9uQ29uZmlnKCkgewotCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25Db25maWdfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldE1hcHBpbmcoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldCgpIHsKLQkJcmV0dXJuIHNlcnZsZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9XZWJUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfUGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1J1bkFzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYlR5cGUoKSB7Ci0JCXJldHVybiB3ZWJUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldFR5cGUoKSB7Ci0JCXJldHVybiBzZXJ2bGV0VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQVHlwZSgpIHsKLQkJcmV0dXJuIGpzcFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVHlwZV9Kc3BGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5pdFBhcmFtKCkgewotCQlyZXR1cm4gaW5pdFBhcmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlcl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWx0ZXJNYXBwaW5nKCkgewotCQlyZXR1cm4gZmlsdGVyTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKSB7Ci0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aFNlcnZsZXRUeXBlKCkgewotCQlyZXR1cm4gcmVzQXV0aFNlcnZsZXRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEhUVFBNZXRob2RUeXBlRW51bSgpIHsKLQkJcmV0dXJuIGh0dHBNZXRob2RUeXBlRW51bUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZU5hbWVUeXBlKCkgewotCQlyZXR1cm4gcm9sZU5hbWVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVOYW1lVHlwZV9Sb2xlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVOYW1lVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREaXNwYXRjaGVyVHlwZSgpIHsKLQkJcmV0dXJuIGRpc3BhdGNoZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEF1dGhNZXRob2RLaW5kKCkgewotCQlyZXR1cm4gYXV0aE1ldGhvZEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChXZWJhcHBsaWNhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJd2ViQXBwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9BUFApOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRElTVFJJQlVUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0NPTlRFWFRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0VSUk9SX1BBR0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0ZJTEVfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19UQUdfTElCUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19DT05TVFJBSU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19MT0dJTl9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRVNTSU9OX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFUlZMRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0ZJTFRFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19DT05URVhUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19KU1BfQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCk7Ci0KLQkJY29udGV4dFBhcmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFWFRfUEFSQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRleHRQYXJhbUVDbGFzcywgQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGV4dFBhcmFtRUNsYXNzLCBDT05URVhUX1BBUkFNX19QQVJBTV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGV4dFBhcmFtRUNsYXNzLCBDT05URVhUX1BBUkFNX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGV4dFBhcmFtRUNsYXNzLCBDT05URVhUX1BBUkFNX19XRUJfQVBQKTsKLQotCQlzZXJ2bGV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFUlZMRVRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19XRUJfQVBQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19XRUJfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fUEFSQU1TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1JVTl9BUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSU5JVF9QQVJBTVMpOwotCi0JCXNlcnZsZXRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX1dFQl9BUFApOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQpOwotCi0JCXNlc3Npb25Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VTU0lPTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19XRUJfQVBQKTsKLQotCQltaW1lTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fTUlNRV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtaW1lTWFwcGluZ0VDbGFzcywgTUlNRV9NQVBQSU5HX19XRUJfQVBQKTsKLQotCQl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VMQ09NRV9GSUxFX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFApOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEUpOwotCi0JCWVycm9yUGFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFUlJPUl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX1dFQl9BUFApOwotCi0JCXRhZ0xpYlJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUdfTElCX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliUmVmRUNsYXNzLCBUQUdfTElCX1JFRl9fVEFHTElCX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliUmVmRUNsYXNzLCBUQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJSZWZFQ2xhc3MsIFRBR19MSUJfUkVGX19XRUJfQVBQKTsKLQotCQlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwotCi0JCXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMpOwotCi0JCWF1dGhDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFVVEhfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKLQotCQl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVNFUl9EQVRBX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKLQotCQlsb2dpbkNvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0dJTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fV0VCX0FQUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcpOwotCi0JCWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGT1JNX0xPR0lOX0NPTkZJRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRyk7Ci0KLQkJaW5pdFBhcmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRfUEFSQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19QQVJBTV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19ERVNDUklQVElPTik7Ci0KLQkJd2ViVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfVFlQRSk7Ci0KLQkJc2VydmxldFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVkxFVF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0VHlwZUVDbGFzcywgU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FKTsKLQotCQlqc3BUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpTUF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUeXBlRUNsYXNzLCBKU1BfVFlQRV9fSlNQX0ZJTEUpOwotCi0JCXVybFBhdHRlcm5UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFVSTF9QQVRURVJOX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodXJsUGF0dGVyblR5cGVFQ2xhc3MsIFVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OKTsKLQotCQlyb2xlTmFtZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9OQU1FX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVOYW1lVHlwZUVDbGFzcywgUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRSk7Ci0KLQkJd2VsY29tZUZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VMQ09NRV9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWxjb21lRmlsZUVDbGFzcywgV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlbGNvbWVGaWxlRUNsYXNzLCBXRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCk7Ci0KLQkJZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSk7Ci0KLQkJZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVSUk9SX0NPREVfRVJST1JfUEFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLCBFUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREUpOwotCi0JCWZpbHRlck1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMVEVSX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX0ZJTFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX1NFUlZMRVQpOwotCi0JCWZpbHRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUxURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlckVDbGFzcywgRklMVEVSX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fSU5JVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19GSUxURVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUyk7Ci0KLQkJbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTKTsKLQotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0NBTF9FTkNPRElOR19NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcywgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcywgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcpOwotCi0JCWh0dHBNZXRob2RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfTUVUSE9EX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBNZXRob2RUeXBlRUNsYXNzLCBIVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oUkVTX0FVVEhfU0VSVkxFVF9UWVBFKTsKLQkJaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0gPSBjcmVhdGVFRW51bShIVFRQX01FVEhPRF9UWVBFX0VOVU0pOwotCQl0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUpOwotCQlkaXNwYXRjaGVyVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRElTUEFUQ0hFUl9UWVBFKTsKLQkJYXV0aE1ldGhvZEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKEFVVEhfTUVUSE9EX0tJTkQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKc3BQYWNrYWdlIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXdlYkFwcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7Ci0JCWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2bGV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd2VsY29tZUZpbGVMaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVycm9yUGFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl0YWdMaWJSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWluaXRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3ZWJUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlcnZsZXRUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2ViVHlwZSgpKTsKLQkJanNwVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdlYlR5cGUoKSk7Ci0JCXVybFBhdHRlcm5UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXJvbGVOYW1lVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3ZWxjb21lRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXJyb3JQYWdlKCkpOwotCQllcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFcnJvclBhZ2UoKSk7Ci0JCWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZmlsdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlodHRwTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGlzdHJpYnV0YWJsZSIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRzKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpLCAiY29udGV4dHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCB0aGlzLmdldEVycm9yUGFnZV9XZWJBcHAoKSwgImVycm9yUGFnZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWJSZWYoKSwgdGhpcy5nZXRUYWdMaWJSZWZfV2ViQXBwKCksICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpLCAiY29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpLCAibG9naW5Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgdGhpcy5nZXRNaW1lTWFwcGluZygpLCB0aGlzLmdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCAibWltZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIHRoaXMuZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKSwgInNlc3Npb25Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZygpLCB0aGlzLmdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpLCAic2VydmxldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRzKCksIHRoaXMuZ2V0U2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXRfV2ViQXBwKCksICJzZXJ2bGV0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlcnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSwgdGhpcy5nZXRGaWx0ZXJNYXBwaW5nKCksIG51bGwsICJmaWx0ZXJNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9MaXN0ZW5lcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRMaXN0ZW5lcigpLCBudWxsLCAibGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJjb250ZXh0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0pzcENvbmZpZygpLCB0aGVKc3BQYWNrYWdlLmdldEpTUENvbmZpZygpLCBudWxsLCAianNwQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgdGhpcy5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRleHRQYXJhbUVDbGFzcywgQ29udGV4dFBhcmFtLmNsYXNzLCAiQ29udGV4dFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZXh0UGFyYW1fV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0NvbnRleHRzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0RUNsYXNzLCBTZXJ2bGV0LmNsYXNzLCAiU2VydmxldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0cygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9XZWJUeXBlKCksIHRoaXMuZ2V0V2ViVHlwZSgpLCBudWxsLCAid2ViVHlwZSIsIG51bGwsIDEsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUGFyYW1zKCksIHRoaXMuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJwYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIlNlcnZsZXRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldE1hcHBpbmdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0IiwgbnVsbCwgMSwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic2Vzc2lvblRpbWVvdXQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleHRlbnNpb24iLCBudWxsLCAwLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICJXZWxjb21lRmlsZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfRmlsZUxpc3QoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgdGhpcy5nZXRXZWxjb21lRmlsZSgpLCB0aGlzLmdldFdlbGNvbWVGaWxlX0ZpbGVMaXN0KCksICJmaWxlIiwgbnVsbCwgMCwgLTEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVycm9yUGFnZUVDbGFzcywgRXJyb3JQYWdlLmNsYXNzLCAiRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFcnJvclBhZ2VfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0xpYlJlZkVDbGFzcywgVGFnTGliUmVmLmNsYXNzLCAiVGFnTGliUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYlJlZl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfVGFnTGlicygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICJTZWN1cml0eUNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fU2VjQ29uc3RyYWludCgpLCAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIsIG51bGwsIDEsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIHRoaXMuZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAiYXV0aENvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAidXNlckRhdGFDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIldlYlJlc291cmNlQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViUmVzb3VyY2VOYW1lIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDEsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpLCB0aGlzLmdldEhUVFBNZXRob2RUeXBlRW51bSgpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCksIHRoaXMuZ2V0VVJMUGF0dGVyblR5cGUoKSwgdGhpcy5nZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksICJVUkxzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSFRUUHMoKSwgdGhpcy5nZXRIVFRQTWV0aG9kVHlwZSgpLCBudWxsLCAiSFRUUHMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAiQXV0aENvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9sZXMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBBdXRoQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAiVXNlckRhdGFDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCksIHRoaXMuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpLCAidHJhbnNwb3J0R3VhcmFudGVlIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpLCAic2VjQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobG9naW5Db25maWdFQ2xhc3MsIExvZ2luQ29uZmlnLmNsYXNzLCAiTG9naW5Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgdGhpcy5nZXRBdXRoTWV0aG9kS2luZCgpLCAiYXV0aE1ldGhvZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVhbG1OYW1lIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImF1dGhvcml6YXRpb25NZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCksICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAiRm9ybUxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZm9ybUxvZ2luUGFnZSIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksICJsb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViVHlwZUVDbGFzcywgV2ViVHlwZS5jbGFzcywgIldlYlR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRUeXBlRUNsYXNzLCBTZXJ2bGV0VHlwZS5jbGFzcywgIlNlcnZsZXRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZsZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwVHlwZUVDbGFzcywgSlNQVHlwZS5jbGFzcywgIkpTUFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFR5cGVfSnNwRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAianNwRmlsZSIsIG51bGwsIDAsIDEsIEpTUFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMUGF0dGVyblR5cGUuY2xhc3MsICJVUkxQYXR0ZXJuVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIDEsIFVSTFBhdHRlcm5UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKSwgInJlc0NvbGxlY3Rpb24iLCBudWxsLCAwLCAxLCBVUkxQYXR0ZXJuVHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVOYW1lVHlwZUVDbGFzcywgUm9sZU5hbWVUeXBlLmNsYXNzLCAiUm9sZU5hbWVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgUm9sZU5hbWVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVFQ2xhc3MsIFdlbGNvbWVGaWxlLmNsYXNzLCAiV2VsY29tZUZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3ZWxjb21lRmlsZSIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcywgRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5jbGFzcywgIkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAxLCAxLCBFeGNlcHRpb25UeXBlRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLCBFcnJvckNvZGVFcnJvclBhZ2UuY2xhc3MsICJFcnJvckNvZGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVycm9yQ29kZSIsIG51bGwsIDAsIDEsIEVycm9yQ29kZUVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZpbHRlck1hcHBpbmcuY2xhc3MsICJGaWx0ZXJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVybFBhdHRlcm4iLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCksIHRoaXMuZ2V0RGlzcGF0Y2hlclR5cGUoKSwgImRpc3BhdGNoZXJUeXBlIiwgbnVsbCwgMCwgNCwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXIoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlciIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXQoKSwgbnVsbCwgInNlcnZsZXQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZmlsdGVyRUNsYXNzLCBGaWx0ZXIuY2xhc3MsICJGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImZpbHRlckNsYXNzIiwgbnVsbCwgMSwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtVmFsdWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIsIG51bGwsIDEsIC0xLCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICJMb2NhbEVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbGUiLCBudWxsLCAwLCAxLCBMb2NhbEVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVuY29kaW5nIiwgbnVsbCwgMCwgMSwgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwTWV0aG9kVHlwZUVDbGFzcywgSFRUUE1ldGhvZFR5cGUuY2xhc3MsICJIVFRQTWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIDEsIEhUVFBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLmNsYXNzLCAiUmVzQXV0aFNlcnZsZXRUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtLCBSZXNBdXRoU2VydmxldFR5cGUuU0VSVkxFVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5jbGFzcywgIkhUVFBNZXRob2RUeXBlRW51bSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5HRVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBPU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBVVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uREVMRVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5IRUFEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5PUFRJT05TX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5UUkFDRV9MSVRFUkFMKTsKLQkJLy9XRUJEQVYgc3VwcG9ydAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5BQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkFDTF9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkJBU0VMSU5FX0NPTlRST0xfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CSU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CWUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNBTkNFTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ0hFQ0tJTl9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNIRUNLT1VUX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ09QWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uRVJST1JSRVNQT05TRV9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLklORk9fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLklOVklURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTEFCRUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkxPQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1FUkdFX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUVTU0FHRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUtBQ1RJVklUWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUtDT0xfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LV09SS1NQQUNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5NT1ZFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5OT1RJRllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBSQUNLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9QRklORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFJPUFBBVENIX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9WSVNJT05BTFJFU1BPTlNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QVUJMSVNIX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRUJJTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFRElSRUNUUkVTUE9OU0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFR0lTVEVSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVBPUlRfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVFVRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVNQT05TRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uU0VBUkNIX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uU1VDQ0VTU1JFU1BPTlNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkJJTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlVOQ0hFQ0tPVVRfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkxPQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlVQREFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVkVSU0lPTl9DT05UUk9MX0xJVEVSQUwpOyAKLQotCi0JCQotCQkKLQkJaW5pdEVFbnVtKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5jbGFzcywgIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLklOVEVHUkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLkNPTkZJREVOVElBTF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuY2xhc3MsICJEaXNwYXRjaGVyVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLmNsYXNzLCAiQXV0aE1ldGhvZEtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuQkFTSUNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5ESUdFU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5GT1JNX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuQ0xJRU5UX0NFUlRfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWM1MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLS8qKgotICogVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWxjb21lRmlsZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2VsY29tZUZpbGUoKSA8ZW0+V2VsY29tZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWxjb21lRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd2VsY29tZUZpbGUgPSBXRUxDT01FX0ZJTEVfRURFRkFVTFQ7Ci0JcHVibGljIFdlbGNvbWVGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VMQ09NRV9GSUxFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2VsY29tZUZpbGUoKSB7Ci0JCXJldHVybiB3ZWxjb21lRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWxjb21lRmlsZShTdHJpbmcgbmV3V2VsY29tZUZpbGUpIHsKLQkJU3RyaW5nIG9sZFdlbGNvbWVGaWxlID0gd2VsY29tZUZpbGU7Ci0JCXdlbGNvbWVGaWxlID0gbmV3V2VsY29tZUZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRSwgb2xkV2VsY29tZUZpbGUsIHdlbGNvbWVGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdCBnZXRGaWxlTGlzdCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWxjb21lRmlsZUxpc3QpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBuZXdGaWxlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3RmlsZUxpc3QsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBuZXdGaWxlTGlzdCkgewotCQlpZiAobmV3RmlsZUxpc3QgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUICYmIG5ld0ZpbGVMaXN0ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RmlsZUxpc3QpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdGaWxlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGaWxlTGlzdCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RmlsZUxpc3QobmV3RmlsZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNULCBuZXdGaWxlTGlzdCwgbmV3RmlsZUxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RmlsZUxpc3QoKFdlbGNvbWVGaWxlTGlzdClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXJldHVybiBiYXNpY1NldEZpbGVMaXN0KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEUsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFOgotCQkJCXJldHVybiBnZXRXZWxjb21lRmlsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEZpbGVMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFOgotCQkJCXNldFdlbGNvbWVGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXNldEZpbGVMaXN0KChXZWxjb21lRmlsZUxpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKLQkJCQlzZXRXZWxjb21lRmlsZShXRUxDT01FX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXNldEZpbGVMaXN0KChXZWxjb21lRmlsZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKLQkJCQlyZXR1cm4gV0VMQ09NRV9GSUxFX0VERUZBVUxUID09IG51bGwgPyB3ZWxjb21lRmlsZSAhPSBudWxsIDogIVdFTENPTUVfRklMRV9FREVGQVVMVC5lcXVhbHMod2VsY29tZUZpbGUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEZpbGVMaXN0KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlbGNvbWVGaWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3ZWxjb21lRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTMxN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0vKioKLSAqIFRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcyBlbGVtZW50cy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVGaWxlTGlzdEltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWxjb21lRmlsZUxpc3QgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpbGUgPSBudWxsOwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUxDT01FX0ZJTEVfTElTVDsKLQl9Ci0KLS8qKgotICogYWRkRmlsZU5hbWVkIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhZGRGaWxlTmFtZWQoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JV2VsY29tZUZpbGUgbGZpbGUgPSAoKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0JbGZpbGUuc2V0V2VsY29tZUZpbGUobmFtZSk7Ci0JZ2V0RmlsZSgpLmFkZChsZmlsZSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbGUoKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCWZpbGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChXZWxjb21lRmlsZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlyZXR1cm4gZ2V0RmlsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJZ2V0RmlsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFOgotCQkJCWdldEZpbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlyZXR1cm4gZmlsZSAhPSBudWxsICYmICFmaWxlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlMDBhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvblN3aXRjaCBzdyA9IG5ldyBXZWJhcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWJBcHBBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGV4dFBhcmFtKENvbnRleHRQYXJhbSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uVHlwZUVycm9yUGFnZShFeGNlcHRpb25UeXBlRXJyb3JQYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGUoV2VsY29tZUZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmKFRhZ0xpYlJlZiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYWdMaWJSZWZBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlVVJMUGF0dGVyblR5cGUoVVJMUGF0dGVyblR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVVJMUGF0dGVyblR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSFRUUE1ldGhvZFR5cGUoSFRUUE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTG9naW5Db25maWdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWltZU1hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlV2ViVHlwZShXZWJUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldFR5cGUoU2VydmxldFR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VydmxldFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSlNQVHlwZShKU1BUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUpTUFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyKEZpbHRlciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGaWx0ZXJBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZU5hbWVUeXBlKFJvbGVOYW1lVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlTmFtZVR5cGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmcoTG9jYWxFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViQXBwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGV4dFBhcmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYmFwcGxpY2F0aW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFdlYmFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViQXBwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGV4dFBhcmFtKENvbnRleHRQYXJhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGV4dFBhcmFtQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmKFRhZ0xpYlJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViVHlwZShXZWJUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldFR5cGUoU2VydmxldFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVHlwZShKU1BUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKU1BUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVVJMUGF0dGVyblR5cGUoVVJMUGF0dGVyblR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUm9sZU5hbWVUeXBlKFJvbGVOYW1lVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGUoV2VsY29tZUZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uVHlwZUVycm9yUGFnZShFeGNlcHRpb25UeXBlRXJyb3JQYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyKEZpbHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmcoTG9jYWxFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUE1ldGhvZFR5cGUoSFRUUE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBNZXRob2RUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBcHBBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2VsY29tZUZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJSZWZUeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJMUGF0dGVyblR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWltZU1hcHBpbmdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViVHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlTmFtZVR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYWE5OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvblN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvblN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJhcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQOiB7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYkFwcCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU06IHsKLQkJCQlDb250ZXh0UGFyYW0gY29udGV4dFBhcmFtID0gKENvbnRleHRQYXJhbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGV4dFBhcmFtKGNvbnRleHRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29udGV4dFBhcmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUOiB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXQoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChzZXJ2bGV0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2bGV0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6IHsKLQkJCQlTZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA9IChTZXJ2bGV0TWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmxldE1hcHBpbmcoc2VydmxldE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZsZXRNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJRzogewotCQkJCVNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZyA9IChTZXNzaW9uQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXNzaW9uQ29uZmlnKHNlc3Npb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlc3Npb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElORzogewotCQkJCU1pbWVNYXBwaW5nIG1pbWVNYXBwaW5nID0gKE1pbWVNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNaW1lTWFwcGluZyhtaW1lTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWltZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUOiB7Ci0JCQkJV2VsY29tZUZpbGVMaXN0IHdlbGNvbWVGaWxlTGlzdCA9IChXZWxjb21lRmlsZUxpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlbGNvbWVGaWxlTGlzdCh3ZWxjb21lRmlsZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlbGNvbWVGaWxlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRTogewotCQkJCUVycm9yUGFnZSBlcnJvclBhZ2UgPSAoRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFcnJvclBhZ2UoZXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGOiB7Ci0JCQkJVGFnTGliUmVmIHRhZ0xpYlJlZiA9IChUYWdMaWJSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0xpYlJlZih0YWdMaWJSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHRhZ0xpYlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVDogewotCQkJCVNlY3VyaXR5Q29uc3RyYWludCBzZWN1cml0eUNvbnN0cmFpbnQgPSAoU2VjdXJpdHlDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoc2VjdXJpdHlDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZWN1cml0eUNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOiB7Ci0JCQkJV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiA9IChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbih3ZWJSZXNvdXJjZUNvbGxlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlYlJlc291cmNlQ29sbGVjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOiB7Ci0JCQkJQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSAoQXV0aENvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUF1dGhDb25zdHJhaW50KGF1dGhDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhdXRoQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlQ6IHsKLQkJCQlVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gKFVzZXJEYXRhQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVXNlckRhdGFDb25zdHJhaW50KHVzZXJEYXRhQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodXNlckRhdGFDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUc6IHsKLQkJCQlMb2dpbkNvbmZpZyBsb2dpbkNvbmZpZyA9IChMb2dpbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9naW5Db25maWcobG9naW5Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogewotCQkJCUZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSAoRm9ybUxvZ2luQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGb3JtTG9naW5Db25maWcoZm9ybUxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChmb3JtTG9naW5Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU06IHsKLQkJCQlJbml0UGFyYW0gaW5pdFBhcmFtID0gKEluaXRQYXJhbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5pdFBhcmFtKGluaXRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaW5pdFBhcmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfVFlQRTogewotCQkJCVdlYlR5cGUgd2ViVHlwZSA9IChXZWJUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJUeXBlKHdlYlR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlYlR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRTogewotCQkJCVNlcnZsZXRUeXBlIHNlcnZsZXRUeXBlID0gKFNlcnZsZXRUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0VHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VydmxldFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFOiB7Ci0JCQkJSlNQVHlwZSBqc3BUeXBlID0gKEpTUFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFR5cGUoanNwVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2ViVHlwZShqc3BUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqc3BUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFOiB7Ci0JCQkJVVJMUGF0dGVyblR5cGUgdXJsUGF0dGVyblR5cGUgPSAoVVJMUGF0dGVyblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVSTFBhdHRlcm5UeXBlKHVybFBhdHRlcm5UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh1cmxQYXR0ZXJuVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEU6IHsKLQkJCQlSb2xlTmFtZVR5cGUgcm9sZU5hbWVUeXBlID0gKFJvbGVOYW1lVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZU5hbWVUeXBlKHJvbGVOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qocm9sZU5hbWVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEU6IHsKLQkJCQlXZWxjb21lRmlsZSB3ZWxjb21lRmlsZSA9IChXZWxjb21lRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2VsY29tZUZpbGUod2VsY29tZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlbGNvbWVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFOiB7Ci0JCQkJRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBleGNlcHRpb25UeXBlRXJyb3JQYWdlID0gKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoZXhjZXB0aW9uVHlwZUVycm9yUGFnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRTogewotCQkJCUVycm9yQ29kZUVycm9yUGFnZSBlcnJvckNvZGVFcnJvclBhZ2UgPSAoRXJyb3JDb2RlRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFcnJvckNvZGVFcnJvclBhZ2UoZXJyb3JDb2RlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFcnJvclBhZ2UoZXJyb3JDb2RlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlcnJvckNvZGVFcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HOiB7Ci0JCQkJRmlsdGVyTWFwcGluZyBmaWx0ZXJNYXBwaW5nID0gKEZpbHRlck1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbHRlck1hcHBpbmcoZmlsdGVyTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZmlsdGVyTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSOiB7Ci0JCQkJRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbHRlcihmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGZpbHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGZpbHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOiB7Ci0JCQkJTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA9IChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElORzogewotCQkJCUxvY2FsRW5jb2RpbmdNYXBwaW5nIGxvY2FsRW5jb2RpbmdNYXBwaW5nID0gKExvY2FsRW5jb2RpbmdNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhsb2NhbEVuY29kaW5nTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobG9jYWxFbmNvZGluZ01hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6IHsKLQkJCQlIVFRQTWV0aG9kVHlwZSBodHRwTWV0aG9kVHlwZSA9IChIVFRQTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUE1ldGhvZFR5cGUoaHR0cE1ldGhvZFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGh0dHBNZXRob2RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIEFwcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgQXBwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJBcHAoV2ViQXBwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGV4dCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZXh0IFBhcmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZXh0UGFyYW0oQ29udGV4dFBhcmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0KFNlcnZsZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TWFwcGluZyhTZXJ2bGV0TWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNaW1lTWFwcGluZyhNaW1lTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvclBhZ2UoRXJyb3JQYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZihUYWdMaWJSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYlR5cGUoV2ViVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRUeXBlKFNlcnZsZXRUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpTUFR5cGUoSlNQVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSTCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VVJMIFBhdHRlcm4gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVVJMUGF0dGVyblR5cGUoVVJMUGF0dGVyblR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZU5hbWVUeXBlKFJvbGVOYW1lVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlKFdlbGNvbWVGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNlcHRpb24gVHlwZSBFcnJvciBQYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNlcHRpb25UeXBlRXJyb3JQYWdlKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBDb2RlIEVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgQ29kZSBFcnJvciBQYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvckNvZGVFcnJvclBhZ2UoRXJyb3JDb2RlRXJyb3JQYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhMb2NhbEVuY29kaW5nTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SFRUUCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUE1ldGhvZFR5cGUoSFRUUE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKTkRJRW52UmVmc0dyb3VwKEpORElFbnZSZWZzR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dlYmFwcGxpY2F0aW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU4ZTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIEVKQkFydGlmYWN0RWRpdCBhcGkuIFRoaXMgYXBpIGlzIHVzZWQgdG8gd29yayB3aXRoIHRoZSBlbWYgbW9kZWwKLSAgICAgICAgb2YgYSBmbGV4aWJsZSBlamIgbW9kdWxlLiBJdCBjb250YWlucyBhcGkgdG8gcmVhZCBhbmQgc2VyaWFsaXplIG91dCB0aGUgZW1mIG1vZGVsLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxNjU2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FICAgPSAid2Vic2VydmljZXMueG1sIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNJRCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfRE9DVFlQRSA9ICJ3ZWJzZXJ2aWNlcyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfMV8xID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiOy8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFQ0xJRU5UX0REX1NIT1JUX05BTUUgICA9ICJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VDTElFTlRfU1lTVEVNSUQgICAgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9QVUJMSUNJRCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyBjbGllbnQgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFQ0xJRU5UX0RPQ1RZUEUgPSAid2Vic2VydmljZXNjbGllbnQiOy8vJE5PTi1OTFMtMSQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9URU1QX0REX1NIT1JUX05BTUUgPSAid2Vic2VydmljZXMtdGVtcC54bWwiOy8vJE5PTi1OTFMtMSQKLQotICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ01BUF9ERF9TSE9SVF9OQU1FICAgPSAibWFwcGluZy54bWwiOyAvLyROT04tTkxTLTEkICEhV2UgZG9uJ3QgaGF2ZSBhIHN0YW5kYXJkIG5hbWUhIQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfU1lTVEVNSUQgICAgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX2pheHJwY19tYXBwaW5nXzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ01BUF9QVUJMSUNJRCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIEpBWC1SUEMgbWFwcGluZyAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ01BUF9ET0NUWVBFID0gImphdmEtd3NkbC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ01BUF9TQ0hFTUFfTE9DID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ01BUF9TQ0hFTUFfTE9DX1NVTiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAKLSAgCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzBfSUQgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzFfSUQgPSAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzJfSUQgPSAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTl8xXzEgPSAiMS4xIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8yID0gIjEuMiI7Ly8kTk9OLU5MUy0xJAotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUluaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxODYzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsOwotCi0KLQotLyoqCi0qIEluaXRpYWxpemVyIGNsYXNzIHRvIHByZXJlZ2lzdGVyIHBhY2thZ2VzLCByZWdpc3RlciByZXNvdXJjZSBmYWN0b3JpZXMsIGFuZCBkdGRzIGZvciB0aGUgd2ViIHNlcnZpY2VzIG1vZGVscy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUluaXQKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKQotICB7Ci0KLSAgICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEVjb3JlIHBhY2thZ2UuCi0gICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICBKMkVFSW5pdC5pbml0KCk7ICAgIAotCi0gICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlcwotICAgIEpheHJwY21hcFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCi0gICAgLy8gUmVnaXN0ZXIgcmVzb3VyY2UgZmFjdG9yaWVzIGZvciB4bWwgZGVzY3JpcHRvcnMKLQotCi0gICAgLy8gTm90IGNhbGxpbmcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCkgYmVjYXVzZSBpdCBkb2VzIG5vdGhpbmcuIFJlZ2lzdHJhdGlvbiBtdXN0IGJlIGRvbmUgZm9yIGVhY2ggZmlsZW5hbWUgYXMgZm9sbG93czoKLSAgICAvLyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoZmlsZW5hbWUsIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOyAgCi0gICAgLy8gd2hlcmUgZmlsZW5hbWUgaXMgYSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgb2YgdGhlIG1hcHBpbmcgZmlsZQotCi0gICAgLy9SZWdpc3RlciBEVERzCi0gICAgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCi0KLSAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0KLQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxM2M1YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLQotCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEhlbHBlcgotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VmFsdWVzKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlcyh3ZWJTZXJ2aWNlcywgaXRlbSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFZhbHVlcyhXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgYm9vbGVhbiBnZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKXdlYlNlcnZpY2VzLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9ucyh3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIGdldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZXMod2ViU2VydmljZXMsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbnMod2ViU2VydmljZXMsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldExhcmdlSWNvbnMod2ViU2VydmljZXMsIGlzSjJFRTE0LCBnZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgCi0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREZXNjcmlwdGlvbnMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotCi0gIAlTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBkZXNjcmlwdGlvbnMgPSB3ZWJTZXJ2aWNlcy5nZXREZXNjcmlwdGlvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0aW9ucy5sZW5ndGhdOwotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgIAl2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIC8vcmV0dXJuIG51bGwgc2luY2UgbGFuZ3VhZ2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKMkVFIDEuMy4KLSAgICAgICAgdmFsdWVzWzBdID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzWzBdID0gd2ViU2VydmljZXMuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldERpc3BsYXlOYW1lcyhXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZXMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2Rpc3BsYXlOYW1lcy5sZW5ndGhdOyAgICAgIAotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkaXNwbGF5TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkaXNwbGF5TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1tpXSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFNtYWxsSWNvbnMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gaWNvbnMgPSB3ZWJTZXJ2aWNlcy5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIC8vcmV0dXJuIG51bGwgc2luY2UgbGFuZ3VhZ2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKMkVFIDEuMy4KLSAgICAgICAgdmFsdWVzWzBdID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzWzBdID0gd2ViU2VydmljZXMuZ2V0U21hbGxJY29uKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldExhcmdlSWNvbnMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gaWNvbnMgPSB3ZWJTZXJ2aWNlcy5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFyZ2VJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldExhcmdlSWNvbigpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotCi0gIC8vV2ViU2VydmljZXNEZXNjcmlwdGlvbiBtZXRob2RzCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlKHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGl0ZW0sIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSl3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uKHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUod2ViU2VydmljZXNEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIGdldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgotICAgICAgICByZXR1cm4gZ2V0U21hbGxJY29uKHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldExhcmdlSWNvbih3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpc0oyRUUxNCwgZ2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgRGVzY3JpcHRpb25UeXBlIGRlc2NUeXBlID0gd2ViU2VydmljZXNEZXNjcmlwdGlvbi5nZXREZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgIGlmIChkZXNjVHlwZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhbmcpCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkZXNjVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZGVzY1R5cGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewkKLSAgCi0JCWlmKCAhbGFuZyApCi0JCXsKLQkJCXJldCA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBEaXNwbGF5TmFtZVR5cGUgZG5UeXBlID0gd2ViU2VydmljZXNEZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgIGlmIChkblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZG5UeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkblR5cGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgICByZXQgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U21hbGxJY29uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBJY29uVHlwZSBpY29uVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0SWNvblR5cGUoKTsKLSAgICAgIGlmIChpY29uVHlwZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhbmcpCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBpY29uVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmKCAhbGFuZykKLSAgICAgIHsKLSAgICAgIAlyZXQgPSAgd2ViU2VydmljZXNEZXNjcmlwdGlvbi5nZXRTbWFsbEljb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXJnZUljb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAgIFN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBJY29uVHlwZSBpY29uVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0SWNvblR5cGUoKTsKLSAgICAgIGlmIChpY29uVHlwZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhbmcpCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBpY29uVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0TGFyZ2VJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0TGFyZ2VJY29uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICAvL1BvcnRDb21wb25lbnQgbWV0aG9kcwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0pCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWUocG9ydENvbXBvbmVudCwgaXRlbSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSlwb3J0Q29tcG9uZW50LmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIGdldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgotICAgICAgICByZXR1cm4gZ2V0U21hbGxJY29uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldExhcmdlSWNvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgZ2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjVHlwZSA9IHBvcnRDb21wb25lbnQuZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgICBpZiAoZGVzY1R5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZGVzY1R5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRlc2NUeXBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gIHBvcnRDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIERpc3BsYXlOYW1lVHlwZSBkblR5cGUgPSBwb3J0Q29tcG9uZW50LmdldERpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgaWYgKGRuVHlwZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhbmcpCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRuVHlwZS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgCXJldCA9ICBwb3J0Q29tcG9uZW50LmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U21hbGxJY29uKFBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSBwb3J0Q29tcG9uZW50LmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRTbWFsbEljb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYoICFsYW5nICkKLSAgICAgIHsKLSAgICAgIAlyZXQgPSBwb3J0Q29tcG9uZW50LmdldFNtYWxsSWNvbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhcmdlSWNvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAgIFN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBJY29uVHlwZSBpY29uVHlwZSA9IHBvcnRDb21wb25lbnQuZ2V0SWNvblR5cGUoKTsKLSAgICAgIGlmIChpY29uVHlwZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhbmcpCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9IGljb25UeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9IGljb25UeXBlLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoICFsYW5nICkKLSAgICAgIHsKLSAgICAgIAlyZXQgPSBwb3J0Q29tcG9uZW50LmdldExhcmdlSWNvbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoSGFuZGxlciBoYW5kbGVyLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlcyhoYW5kbGVyLCBpdGVtLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VmFsdWVzKEhhbmRsZXIgaGFuZGxlciwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgYm9vbGVhbiBnZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKWhhbmRsZXIuZVJlc291cmNlKCk7Ci0gICAgYm9vbGVhbiBpc0oyRUUxND1mYWxzZTsKLSAgICBpZiAocmVzLmdldEoyRUVWZXJzaW9uSUQoKT09SjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0gICAgewotICAgICAgaXNKMkVFMTQgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGl0ZW0uZ2V0VmFsdWUoKSkKLSAgICB7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRFU0NSSVBUSU9OOgotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25zKGhhbmRsZXIsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVzKGhhbmRsZXIsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbnMoaGFuZGxlciwgaXNKMkVFMTQsIGdldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5MQVJHRV9JQ09OOgotICAgICAgICByZXR1cm4gZ2V0TGFyZ2VJY29ucyhoYW5kbGVyLCBpc0oyRUUxNCwgZ2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldERlc2NyaXB0aW9ucyhIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotCi0gIAlTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBkZXNjcmlwdGlvbnMgPSBoYW5kbGVyLmdldERlc2NyaXB0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRpb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGVzY3JpcHRpb24pZGVzY3JpcHRpb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGVzY3JpcHRpb24pZGVzY3JpcHRpb25zW2ldKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIC8vcmV0dXJuIG51bGwgc2luY2UgbGFuZ3VhZ2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKMkVFIDEuMy4KLSAgICAgICAgdmFsdWVzWzBdID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzWzBdID0gaGFuZGxlci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREaXNwbGF5TmFtZXMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGRpc3BsYXlOYW1lcyA9IGhhbmRsZXIuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tkaXNwbGF5TmFtZXMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0U21hbGxJY29ucyhIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gaWNvbnMgPSBoYW5kbGVyLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tpY29ucy5sZW5ndGhdOyAgICAgIAotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRTbWFsbEljb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIC8vcmV0dXJuIG51bGwgc2luY2UgbGFuZ3VhZ2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKMkVFIDEuMy4KLSAgICAgICAgdmFsdWVzWzBdID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzWzBdID0gaGFuZGxlci5nZXRTbWFsbEljb24oKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0TGFyZ2VJY29ucyhIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gIG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gaGFuZGxlci5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFyZ2VJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0TGFyZ2VJY29uKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIC8vU2V0dGVyIGZvciBXZWJTZXJ2aWNlcwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKHdlYlNlcnZpY2VzLCBpdGVtLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKXdlYlNlcnZpY2VzLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgc2V0RGVzY3JpcHRpb24od2ViU2VydmljZXMsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgc2V0RGlzcGxheU5hbWUod2ViU2VydmljZXMsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHNldFNtYWxsSWNvbih3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgc2V0TGFyZ2VJY29uKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7ICAgICAgICAKLSAgICAgIGRlZmF1bHQ6Ly9kbyBub3RoaW5nIDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERlc2NyaXB0aW9uIG9iamVjdAotICAgICAgT2JqZWN0W10gZGVzY3JpcHRpb25zID0gd2ViU2VydmljZXMuZ2V0RGVzY3JpcHRpb25zKCkudG9BcnJheSgpOwotICAgICAgRGVzY3JpcHRpb24gZmlyc3REZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGVzY3JpcHRpb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiA9IGZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2ViU2VydmljZXMuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3REZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERlc2NyaXB0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZXMuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGlzcGxheU5hbWUoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGlzcGxheU5hbWUgb2JqZWN0Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZXMoKS50b0FycmF5KCk7Ci0gICAgICBEaXNwbGF5TmFtZSBmaXJzdERpc3BsYXlOYW1lID0gbnVsbDsKLSAgICAgIGlmIChkaXNwbGF5TmFtZXMubGVuZ3RoIDwgMSkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYSBEaXNwbGF5TmFtZQotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIERpc3BsYXlOYW1lIG5ld0Rpc3BsYXlOYW1lID0gZmFjdG9yeS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIG5ld0Rpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0Rpc3BsYXlOYW1lLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdlYlNlcnZpY2VzLmdldERpc3BsYXlOYW1lcygpLmFkZChuZXdEaXNwbGF5TmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0RGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VzLnNldERpc3BsYXlOYW1lKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNtYWxsSWNvbihXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgT2JqZWN0W10gaWNvbnMgPSB3ZWJTZXJ2aWNlcy5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIEljb25UeXBlIGZpcnN0SWNvbiA9IG51bGw7Ci0gICAgICBpZiAoaWNvbnMubGVuZ3RoIDwgMSkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIG5ld0ljb24gPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2ViU2VydmljZXMuZ2V0SWNvbnMoKS5hZGQobmV3SWNvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0SWNvbiA9IChJY29uVHlwZSlpY29uc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VzLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMYXJnZUljb24oV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICBJY29uVHlwZSBmaXJzdEljb24gPSBudWxsOwotICAgICAgaWYgKGljb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBuZXdJY29uID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VzLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlcy5zZXRMYXJnZUljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0KLS8vU2V0dGVycyBmb3IgV2ViU2VydmljZURlc2NyaXB0aW9ucwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUod2ViU2VydmljZURlc2NyaXB0aW9uLCBpdGVtLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2Upd2ViU2VydmljZURlc2NyaXB0aW9uLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgc2V0RGVzY3JpcHRpb24od2ViU2VydmljZURlc2NyaXB0aW9uLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHNldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgc2V0U21hbGxJY29uKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgc2V0TGFyZ2VJY29uKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOyAgICAgICAgCi0gICAgICBkZWZhdWx0OgotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICAKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBEZXNjcmlwdGlvbiBvYmplY3QKLSAgICAgIAotICAgICAgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uID0gd2ViU2VydmljZURlc2NyaXB0aW9uLmdldERlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGVzY3JpcHRpb25UeXBlCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uTmV3ID0gZmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKLQotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgZGVzY3JpcHRpb25OZXcuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0RGVzY3JpcHRpb25UeXBlKGRlc2NyaXB0aW9uTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERpc3BsYXlOYW1lKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGlzcGxheU5hbWUgb2JqZWN0Ci0gICAgICAKLSAgICAgIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZSA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERpc3BsYXlOYW1lVHlwZQotICAgICAgICBXc2NvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZU5ldyA9IGZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZGlzcGxheU5hbWVOZXcuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGlzcGxheU5hbWVOZXcuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXREaXNwbGF5TmFtZVR5cGUoZGlzcGxheU5hbWVOZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldERpc3BsYXlOYW1lKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNtYWxsSWNvbihXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZURlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBJY29uVHlwZSBpY29uID0gd2ViU2VydmljZURlc2NyaXB0aW9uLmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgaWNvbk5ldyA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGljb25OZXcuc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXRJY29uVHlwZShpY29uTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMYXJnZUljb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgSWNvblR5cGUgaWNvbiA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0SWNvblR5cGUoaWNvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0KLS8vU2V0dGVycyBmb3IgUG9ydENvbXBvbmVudHMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBzZXRWYWx1ZShwb3J0Q29tcG9uZW50LCBpdGVtLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSlwb3J0Q29tcG9uZW50LmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgc2V0RGVzY3JpcHRpb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICBzZXREaXNwbGF5TmFtZShwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgotICAgICAgICBzZXRTbWFsbEljb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgc2V0TGFyZ2VJY29uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsgICAgICAgIAotICAgICAgZGVmYXVsdDogCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgCi0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGVzY3JpcHRpb24gb2JqZWN0Ci0gICAgICAKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvbiA9IHBvcnRDb21wb25lbnQuZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYSBEZXNjcmlwdGlvblR5cGUKLSAgICAgICAgV3Njb21tb25GYWN0b3J5IGZhY3RvcnkgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb25OZXcgPSBmYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREZXNjcmlwdGlvblR5cGUoZGVzY3JpcHRpb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREaXNwbGF5TmFtZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGlzcGxheU5hbWUgb2JqZWN0Ci0gICAgICAKLSAgICAgIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZSA9IHBvcnRDb21wb25lbnQuZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYSBEaXNwbGF5TmFtZVR5cGUKLSAgICAgICAgV3Njb21tb25GYWN0b3J5IGZhY3RvcnkgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVOZXcgPSBmYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldERpc3BsYXlOYW1lVHlwZShkaXNwbGF5TmFtZU5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZGlzcGxheU5hbWUuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldERpc3BsYXlOYW1lKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNtYWxsSWNvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIEljb25UeXBlIGljb24gPSBwb3J0Q29tcG9uZW50LmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgaWNvbk5ldyA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGljb25OZXcuc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0SWNvblR5cGUoaWNvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldExhcmdlSWNvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIEljb25UeXBlIGljb24gPSBwb3J0Q29tcG9uZW50LmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgaWNvbk5ldyA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGljb25OZXcuc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0SWNvblR5cGUoaWNvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvL1NldHRlciBmb3IgSGFuZGxlcnMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEhhbmRsZXIgaGFuZGxlciwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoaGFuZGxlciwgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEhhbmRsZXIgaGFuZGxlciwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpaGFuZGxlci5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgc2V0RGlzcGxheU5hbWUoaGFuZGxlciwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgc2V0U21hbGxJY29uKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbihoYW5kbGVyLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7ICAgICAgICAKLSAgICAgIGRlZmF1bHQ6Ly9kbyBub3RoaW5nIDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBEZXNjcmlwdGlvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGRlc2NyaXB0aW9ucyA9IGhhbmRsZXIuZ2V0RGVzY3JpcHRpb25zKCkudG9BcnJheSgpOwotICAgICAgRGVzY3JpcHRpb24gZmlyc3REZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGVzY3JpcHRpb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiA9IGZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlci5nZXREZXNjcmlwdGlvbnMoKS5hZGQobmV3RGVzY3JpcHRpb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERlc2NyaXB0aW9uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGVzY3JpcHRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERpc3BsYXlOYW1lKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBEaXNwbGF5TmFtZSBvYmplY3QKLSAgICAgIE9iamVjdFtdIGRpc3BsYXlOYW1lcyA9IGhhbmRsZXIuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgRGlzcGxheU5hbWUgZmlyc3REaXNwbGF5TmFtZSA9IG51bGw7Ci0gICAgICBpZiAoZGlzcGxheU5hbWVzLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGlzcGxheU5hbWUKLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZSBuZXdEaXNwbGF5TmFtZSA9IGZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyLmdldERpc3BsYXlOYW1lcygpLmFkZChuZXdEaXNwbGF5TmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0RGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIGhhbmRsZXIuc2V0RGlzcGxheU5hbWUodmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0U21hbGxJY29uKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgT2JqZWN0W10gaWNvbnMgPSBoYW5kbGVyLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgSWNvblR5cGUgZmlyc3RJY29uID0gbnVsbDsKLSAgICAgIGlmIChpY29ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgbmV3SWNvbiA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMYXJnZUljb24oSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBPYmplY3RbXSBpY29ucyA9IGhhbmRsZXIuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICBJY29uVHlwZSBmaXJzdEljb24gPSBudWxsOwotICAgICAgaWYgKGljb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBuZXdJY29uID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZXIuZ2V0SWNvbnMoKS5hZGQobmV3SWNvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0SWNvbiA9IChJY29uVHlwZSlpY29uc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIGhhbmRsZXIuc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEl0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM1OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwSXRlbSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDUklQVElPTiA9IDA7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9OQU1FID0gMTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTUFMTF9JQ09OID0gMjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVJHRV9JQ09OID0gMzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIERlc2NyaXB0aW9uR3JvdXBJdGVtIERFU0NSSVBUSU9OX0xJVEVSQUwgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEl0ZW0oREVTQ1JJUFRJT04sICJkZXNjcmlwdGlvbiIpOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBESVNQTEFZX05BTUVfTElURVJBTCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbShESVNQTEFZX05BTUUsICJkaXNwbGF5LW5hbWUiKTsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gU01BTExfSUNPTl9MSVRFUkFMID0gbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtKFNNQUxMX0lDT04sICJzbWFsbC1pY29uIik7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIERlc2NyaXB0aW9uR3JvdXBJdGVtIExBUkdFX0lDT05fTElURVJBTCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbShMQVJHRV9JQ09OLCAibGFyZ2UtaWNvbiIpOy8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZXNjcmlwdGlvbkdyb3VwSXRlbVtdIFZBTFVFU19BUlJBWSA9Ci0gICAgbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtW10KLSAgICB7Ci0gICAgICBERVNDUklQVElPTl9MSVRFUkFMLAotICAgICAgRElTUExBWV9OQU1FX0xJVEVSQUwsCi0gICAgICBTTUFMTF9JQ09OX0xJVEVSQUwsCi0gICAgICBMQVJHRV9JQ09OX0xJVEVSQUwKLSAgICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLSAgLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLiAKLQkgKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBEZXNjcmlwdGlvbkdyb3VwSXRlbSBnZXQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBEZXNjcmlwdGlvbkdyb3VwSXRlbSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlcGVuZGVuY3kgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuIAotCSAqICA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRpb25Hcm91cEl0ZW0gZ2V0KGludCB2YWx1ZSkKLSAgewotICAgIHN3aXRjaCAodmFsdWUpCi0gICAgewotICAgICAgY2FzZSBERVNDUklQVElPTjogcmV0dXJuIERFU0NSSVBUSU9OX0xJVEVSQUw7Ci0gICAgICBjYXNlIERJU1BMQVlfTkFNRTogcmV0dXJuIERJU1BMQVlfTkFNRV9MSVRFUkFMOwotICAgICAgY2FzZSBTTUFMTF9JQ09OOiByZXR1cm4gU01BTExfSUNPTl9MSVRFUkFMOwotICAgICAgY2FzZSBMQVJHRV9JQ09OOiByZXR1cm4gTEFSR0VfSUNPTl9MSVRFUkFMOyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsJCi0gIH0KLQotICBwcml2YXRlIERlc2NyaXB0aW9uR3JvdXBJdGVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcih2YWx1ZSwgbmFtZSk7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvUU5hbWVIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9RTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWU3YzZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9RTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0KLQotLyoqCi0qIEpTUi0xMDkgdjEuMSBjaGFuZ2VkIHRoZSB3YXkgcXVhbGlmaWVkIG5hbWVzIGFyZSByZXByZXNlbnRlZC4gQXMgYSByZXN1bHQgdGhlIEVNRiBtb2RlbCBjaGFuZ2VkIGFzIHdlbGwuIAotKiBUaGUgbmV3IG1vZGVsIGlzIGNhcGFibGUgb2YgcmVhZGluZy93cml0aW5nIGJvdGggdjEuMCBhbmQgdjEuMSBkZXNjcmlwdG9ycyBidXQgdGhlIFFOYW1lIEFQSXMgd29yayBkaWZmZXJlbnRseQotKiBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0b3IuIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgdG8gc2V0IHZhbHVlcyBvbiBRTmFtZSdzIGluIG9yZGVyCi0qIHRvIGhpZGUgYW5kIGlzb2xhdGUgdGhlIHZlcnNpb24gY2hlY2tpbmcgbG9naWMuCi0qLwotcHVibGljIGNsYXNzIFFOYW1lSGVscGVyCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUFJFRklYPSJwZngiOy8vJE5PTi1OTFMtMSQKLQotICAvKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSBhbmQgdGhlIGxvY2FscGFydCBvbiB0aGUgc3VwcGxpZWQgUU5hbWUgdG8gdGhlIHN1cHBsaWVkIHZhbHVlcyByZXNwZWN0aXZlbHkuCi0gICogQHBhcmFtIHFuYW1lRU9iamVjdCBUaGUgcHJvcGVydGllcyBvbiB0aGlzIFFOYW1lIHdpbGwgYmUgc2V0LiBJZiB0aGUgUU5hbWUgZG9lcyBub3QgYmVsb25nIHRvIGEgUmVzb3VyY2UsCi0gICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBpcyBhc3N1bWVkIHRvIGJlIEoyRUUgMS40LgotICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZVVSSQotICAqIEBwYXJhbSBsb2NhbFBhcnQgVGhlIGxvY2FsUGFydAotICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm5zIHRydWUgaWYgdmFsdWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4gRmFsc2Ugb3RoZXJ3aXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UU5hbWVOYW1lc3BhY2VVUkkoUU5hbWUgcW5hbWVFT2JqZWN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIGxvY2FscGFydCA9IHFuYW1lRU9iamVjdC5nZXRMb2NhbFBhcnQoKTsKLSAgICBzZXRRTmFtZVZhbHVlKHFuYW1lRU9iamVjdCwgbmFtZXNwYWNlVVJJLCBsb2NhbHBhcnQpOyAgICAKLSAgfQotICAKLSAgLyoKLSAgKiBTZXRzIHRoZSBuYW1lc3BhY2VVUkkgYW5kIHRoZSBsb2NhbHBhcnQgb24gdGhlIHN1cHBsaWVkIFFOYW1lIHRvIHRoZSBzdXBwbGllZCB2YWx1ZXMgcmVzcGVjdGl2ZWx5LgotICAqIEBwYXJhbSBxbmFtZUVPYmplY3QgVGhlIHByb3BlcnRpZXMgb24gdGhpcyBRTmFtZSB3aWxsIGJlIHNldC4gSWYgdGhlIFFOYW1lIGRvZXMgbm90IGJlbG9uZyB0byBhIFJlc291cmNlLAotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSBKMkVFIDEuNC4KLSAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIFRoZSBuYW1lc3BhY2VVUkkKLSAgKiBAcGFyYW0gbG9jYWxQYXJ0IFRoZSBsb2NhbFBhcnQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlmIHZhbHVlcyB3ZXJlIHNldCBzdWNjZXNzZnVsbHkuIEZhbHNlIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgcW5hbWVFT2JqZWN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KQotICB7Ci0gICAgc2V0UU5hbWVWYWx1ZShxbmFtZUVPYmplY3QsIG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0LCAiIik7IC8vJE5PTi1OTFMtMSQgICAKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSwgbG9jYWxwYXJ0LCBhbmQgcHJlZml4IG9uIHRoZSBzdXBwbGllZCBRTmFtZSB0byB0aGUgc3VwcGxpZWQgdmFsdWVzIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gcW5hbWVFT2JqZWN0IFRoZSBwcm9wZXJ0aWVzIG9uIHRoaXMgUU5hbWUgd2lsbCBiZSBzZXQuIElmIHRoZSBRTmFtZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBSZXNvdXJjZSwKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIGlzIGFzc3VtZWQgdG8gYmUgSjJFRSAxLjQuCi0gICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlVVJJCi0gICogQHBhcmFtIGxvY2FsUGFydCBUaGUgbG9jYWxQYXJ0Ci0gICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4LiBVc2VkIGluIEpTUi0xMDkgdjEuMSBvbmx5LiBUaGlzIGlzIHRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBwcmVmaXggaXMgbnVsbCBvciBvZiBsZW5ndGggMCwgdGhlIGV4aXN0aW5nIHByZWZpeCBpcyB1c2VkLiBJZiBubyBwcmVmaXggZXhpc3RzLCBhbmQgdGhpcwotICAqICAgICAgICAgICAgICAgICAgICAgICBpcyBhIEpTUi0xMDkgdjEuMSBkZXNjcmlwdG9yIHRoZSBkZWZhdWx0IHByZWZpeCBkZWZpbmVkIGluIERFRkFVTFRfUFJFRklYIGlzIHVzZWQuCi0gICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZXMgd2VyZSBzZXQgc3VjY2Vzc2Z1bGx5LiBGYWxzZSBvdGhlcndpc2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIHFuYW1lRU9iamVjdCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGludCB2ZXJzaW9uSUQ7Ci0gICAgCi0gICAgLy9HZXQgdGhlIHZlcnNpb25JRCBmcm9tIHRoZSBRTmFtZSdzIFJlc291cmNlIGlmIGF2YWlsYWJsZQotICAgIEoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcW5hbWVFT2JqZWN0LmVSZXNvdXJjZSgpOwotICAgIGlmIChyZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3VzZSBhIEoyRUUgMS40IHZlcnNpb24gSUQgYXMgdGhlIGRlZmF1bHQKLSAgICAgIHZlcnNpb25JRCA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmVyc2lvbklEID0gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAgICB9Ci0KLSAgICBzZXRRTmFtZVZhbHVlKHFuYW1lRU9iamVjdCwgbmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQsIHByZWZpeCwgdmVyc2lvbklEKTsKLSAgICAKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSwgbG9jYWxwYXJ0LCBhbmQgcHJlZml4IG9uIHRoZSBzdXBwbGllZCBRTmFtZSB0byB0aGUgc3VwcGxpZWQgdmFsdWVzIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gcW5hbWVFT2JqZWN0IFRoZSBwcm9wZXJ0aWVzIG9uIHRoaXMgUU5hbWUgd2lsbCBiZSBzZXQuCi0gICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlVVJJCi0gICogQHBhcmFtIGxvY2FsUGFydCBUaGUgbG9jYWxQYXJ0Ci0gICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4LiBVc2VkIGluIEpTUi0xMDkgdjEuMSBvbmx5LiBUaGlzIGlzIHRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBwcmVmaXggaXMgbnVsbCBvciBvZiBsZW5ndGggMCwgdGhlIGV4aXN0aW5nIHByZWZpeCBpcyB1c2VkLiBJZiBubyBwcmVmaXggZXhpc3RzLCBhbmQgdGhpcwotICAqICAgICAgICAgICAgICAgICAgICAgICBpcyBhIEpTUi0xMDkgdjEuMSBkZXNjcmlwdG9yIHRoZSBkZWZhdWx0IHByZWZpeCBkZWZpbmVkIERFRkFVTFRfUFJFRklYIGlzIHVzZWQuCi0gICpAcGFyYW0gdmVyc2lvbklEIFRoZSBKMkVFIHZlcnNpb24uIFNob3VsZCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2ZXJzaW9uIElEcyBkZWZpbmVkIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzLgotICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm5zIHRydWUgaWYgdmFsdWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4gRmFsc2Ugb3RoZXJ3aXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBxbmFtZUVPYmplY3QsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBwcmVmaXgsIGludCB2ZXJzaW9uSUQpCi0gIHsgICAgICAKLQotICAgIGlmICh2ZXJzaW9uSUQ9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKQotICAgIHsKLSAgICAgIC8vaWdub3JlIHRoZSBwcmVmaXggYW5kIHNldCB0aGluZ3MgdGhlIG9sZCB3YXkKLSAgICAgIHFuYW1lRU9iamVjdC5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKTsKLSAgICAgIHFuYW1lRU9iamVjdC5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0KTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL3Jlc291cmNlIGlzIEoyRUUgMS40Ci0gICAgICBpZiAocHJlZml4PT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCkKLSAgICAgIHsKLSAgICAgICAgLy91c2UgdGhlIGV4aXN0aW5nIHByZWZpeAotICAgICAgICBwcmVmaXggPSBxbmFtZUVPYmplY3QuZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0gICAgICAgIGlmIChwcmVmaXg9PW51bGwgfHwgcHJlZml4Lmxlbmd0aCgpPT0wKQotICAgICAgICB7Ci0gICAgICAgICAgLy91c2UgdGhlIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgICAgcHJlZml4ID0gbmV3IFN0cmluZyhERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHFuYW1lRU9iamVjdC5zZXRWYWx1ZXMocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsUGFydCk7Ci0gICAgCi0gICAgfQotICAgIAotICB9Ci0gIAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC93c2RkL1dzZGRSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYjFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBXc2RkUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeQotewotCQotCSAgLyoqCi0JICAqIFdzZGRSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgICovCi0JICBwdWJsaWMgV3NkZFJlc291cmNlRmFjdG9yeSgpIAotCSAgewotCQkgIHN1cGVyKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCSAgfQotCQotICAvKioKLSAgKiBXc2RkUmVzb3VyY2VGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICovCi0gIHB1YmxpYyBXc2RkUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSAKLSAgewotCSAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgV3NkZFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotICAJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0gIAlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1RFTVBfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9URU1QX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLSAgfQotCQotICAvKioKLSAgICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLSAgICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLSAgCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgcmVnaXN0ZXJEdGRzLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgCi0gIHsKLSAgICAvL2h0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZAotICAJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRCwgImoyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQiKTsvLyROT04tTkxTLTEkCi0JSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMSwgImoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8xLCAiajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIpOyAvLyROT04tTkxTLTEkCQotICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ18xXzIsICJqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8yLCAiamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIik7IC8vJE5PTi1OTFMtMSQJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvQ29tcG9uZW50U2NvcGVkUmVmcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Db21wb25lbnRTY29wZWRSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmN2MxODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Db21wb25lbnRTY29wZWRSZWZzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldENvbXBvbmVudE5hbWUgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRTY29wZWRSZWZzIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tcG9uZW50TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldENvbXBvbmVudE5hbWUgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotfSAvLyBDb21wb25lbnRTY29wZWRSZWZzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE5YzU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0gKiAgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0gKiAgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotICogICAgIHdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotICogCi0gKiAgICAgVXNlZCBpbjogc2VydmljZS1yZWYKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFBvcnROYW1lcyA8ZW0+UG9ydCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIYW5kbGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXJfSGFuZGxlck5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXJfU29hcEhlYWRlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTb2FwSGVhZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBSb2xlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX1NvYXBSb2xlcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFNvYXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQb3J0TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFuZGxlckNsYXNzKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRIYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlckNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX0luaXRQYXJhbXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEluaXRQYXJhbXMoKTsKLQotfSAvLyBIYW5kbGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1BvcnRDb21wb25lbnRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvUG9ydENvbXBvbmVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmIzYTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvUG9ydENvbXBvbmVudFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotICogICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0gKiAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotICogICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLSAqICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0Q29tcG9uZW50UmVmIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZiB0byBhCi0JICogICAgICAgICBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZSBieSBhIHNlcnZpY2UKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUgcG9ydC1jb21wb25lbnQtbmFtZQotCSAqICAgICAgICAgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUKLQkgKiAgICAgICAgIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXggZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4Ci0JICogICAgICAgICBkZWZpbmVkIGZvciBlamItbGluayBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3J0Q29tcG9uZW50TGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYjZ2V0UG9ydENvbXBvbmVudExpbmsgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3J0Q29tcG9uZW50TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgKiAgICAgICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi0JICogICAgICAgICBXU0RMIHBvcnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19IC8vIFBvcnRDb21wb25lbnRSZWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvU2VydmljZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9TZXJ2aWNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTgxOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9TZXJ2aWNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0gKiAgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLSAqICAgICBpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0gKiAgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0gKiAgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0gKiAgICAgYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotICogICAgIGJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRQb3J0Q29tcG9uZW50UmVmcyA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlUmVmIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgKiAgICAgICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci0JICogICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi0JICogICAgICAgICAic2VydmljZS8iLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZpY2VSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETCBmaWxlLiBUaGUKLQkgKiAgICAgICAgIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbEZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXc2RsRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdzZGxGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXhycGMgTWFwcGluZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgKiAgICAgICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgKiAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZQotCSAqICAgICAgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgKiAgICAgICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLgotCSAqICAgICAgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgKiAgICAgICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlSW50ZXJmYWNlKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZUludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgKiAgICAgICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICogICAgICAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JICogICAgICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICogICAgICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UG9ydENvbXBvbmVudFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCSAqICAgICAgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0JICogICAgICAgICBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0JICogICAgICAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUW5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VydmljZVFuYW1lKFFOYW1lKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVFOYW1lIGdldFNlcnZpY2VRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlUW5hbWUoUU5hbWUgdmFsdWUpOwotCi19IC8vIFNlcnZpY2VSZWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2ViU2VydmljZXNDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2ViU2VydmljZXNDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhODMxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIFNlcnZpY2VzIENsaWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcyA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VzQ2xpZW50IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUxpc3QgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotfSAvLyBXZWJTZXJ2aWNlc0NsaWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0MzQyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXNSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlewotCQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgV2ViU2VydmljZXNDbGllbnQKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwgb2JqZWN0IFdlYlNlcnZpY2VzQ2xpZW50Ci0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwMDQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmljZVJlZiBjcmVhdGVTZXJ2aWNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSGFuZGxlciBjcmVhdGVIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFdlYlNlcnZpY2VzQ2xpZW50IGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBDb21wb25lbnRTY29wZWRSZWZzIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIGdldFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSgpOwotCi19IC8vV2Vic2VydmljZV9jbGllbnRGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1MTZjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoJCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAid3NjbGllbnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAid2Vic2VydmljZV9jbGllbnQueG1pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCA8ZW0+U2VydmljZSBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUYgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1dTRExfRklMRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXhycGMgTWFwcGluZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19IQU5ETEVSUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFFuYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCA8ZW0+SGFuZGxlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIQU5ETEVSID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19IQU5ETEVSX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fU09BUF9ST0xFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19QT1JUX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19JTklUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX1NPQVBfSEVBREVSUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5IYW5kbGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRJbXBsIDxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0V2ViU2VydmljZXNDbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBXRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFdFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRTY29wZWRSZWZzSW1wbCA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFNjb3BlZFJlZnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IENPTVBPTkVOVF9TQ09QRURfUkVGUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBDT01QT05FTlRfU0NPUEVEX1JFRlNfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYgPGVtPlNlcnZpY2UgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2aWNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0UG9ydENvbXBvbmVudFJlZnMgPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0UG9ydENvbXBvbmVudFJlZnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRIYW5kbGVycygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9IYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvcnRDb21wb25lbnRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNvYXAgSGVhZGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRTb2FwSGVhZGVycygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlNvYXAgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0U29hcFJvbGVzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX1NvYXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRQb3J0TmFtZXMgPGVtPlBvcnQgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlBvcnQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0UG9ydE5hbWVzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX1BvcnROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRJbml0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQgPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCNnZXRDb21wb25lbnRTY29wZWRSZWZzIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZXNDbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlc0NsaWVudF9TZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRDb21wb25lbnROYW1lIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbXBvbmVudCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldENvbXBvbmVudE5hbWUoKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldENvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBnZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCA8ZW0+U2VydmljZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfUkVGID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fSEFORExFUlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnRSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVF9DT01QT05FTlRfUkVGID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwgPGVtPkhhbmRsZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEhBTkRMRVIgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSEFORExFUl9fSEFORExFUl9OQU1FID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfX1NPQVBfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfX1BPUlRfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSEFORExFUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJfX1NPQVBfSEVBREVSUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRJbXBsIDxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9TRVJWSUNFU19DTElFTlQgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRTY29wZWRSZWZzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NUE9ORU5UX1NDT1BFRF9SRUZTID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpOwotCi0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRTY29wZWRSZWZzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTYzMzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRTY29wZWRSZWZzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwjZ2V0Q29tcG9uZW50TmFtZSA8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRTY29wZWRSZWZzSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb21wb25lbnRTY29wZWRSZWZzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50TmFtZSgpIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50TmFtZSgpIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wb25lbnROYW1lID0gQ09NUE9ORU5UX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9ORU5UX1NDT1BFRF9SRUZTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgbmV3Q29tcG9uZW50TmFtZSkgewotCQlTdHJpbmcgb2xkQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0JCWNvbXBvbmVudE5hbWUgPSBuZXdDb21wb25lbnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSwgb2xkQ29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgotCQkJCXJldHVybiBnZXRDb21wb25lbnROYW1lKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRToKLQkJCQlzZXRDb21wb25lbnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0Q29tcG9uZW50TmFtZShDT01QT05FTlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRToKLQkJCQlyZXR1cm4gQ09NUE9ORU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBvbmVudE5hbWUgIT0gbnVsbCA6ICFDT01QT05FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoY29tcG9uZW50TmFtZSk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tcG9uZW50TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcG9uZW50TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbXBvbmVudFNjb3BlZFJlZnNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM5ZjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhhbmRsZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0UG9ydE5hbWVzIDxlbT5Qb3J0IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBIYW5kbGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaGFuZGxlck5hbWUgPSBIQU5ETEVSX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZXMoKSA8ZW0+U29hcCBSb2xlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzb2FwUm9sZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWVzKCkgPGVtPlBvcnQgTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDbGFzcygpIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgaGFuZGxlckNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbXMoKSA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEhlYWRlcnMoKSA8ZW0+U29hcCBIZWFkZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvYXBIZWFkZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc29hcEhlYWRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkhBTkRMRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIGhhbmRsZXJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyBuZXdIYW5kbGVyTmFtZSkgewotCQlTdHJpbmcgb2xkSGFuZGxlck5hbWUgPSBoYW5kbGVyTmFtZTsKLQkJaGFuZGxlck5hbWUgPSBuZXdIYW5kbGVyTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSwgb2xkSGFuZGxlck5hbWUsIGhhbmRsZXJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNvYXBIZWFkZXJzKCkgewotCQlpZiAoc29hcEhlYWRlcnMgPT0gbnVsbCkgewotCQkJc29hcEhlYWRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUU5hbWUuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCQl9Ci0JCXJldHVybiBzb2FwSGVhZGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U29hcEhlYWRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJOYW1lKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCXJldHVybiBnZXRTb2FwUm9sZXMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldFBvcnROYW1lcygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEhhbmRsZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEhhbmRsZXJDbGFzcygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlyZXR1cm4gZ2V0U29hcEhlYWRlcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTb2FwUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVM6Ci0JCQkJZ2V0UG9ydE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJc2V0SGFuZGxlckNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJc2V0SGFuZGxlck5hbWUoSEFORExFUl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCWdldFNvYXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fUE9SVF9OQU1FUzoKLQkJCQlnZXRQb3J0TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJc2V0SGFuZGxlckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCWdldFNvYXBIZWFkZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gSEFORExFUl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGVyTmFtZSAhPSBudWxsIDogIUhBTkRMRVJfTkFNRV9FREVGQVVMVC5lcXVhbHMoaGFuZGxlck5hbWUpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gc29hcFJvbGVzICE9IG51bGwgJiYgIXNvYXBSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBwb3J0TmFtZXMgIT0gbnVsbCAmJiAhcG9ydE5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGhhbmRsZXJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIHNvYXBIZWFkZXJzICE9IG51bGwgJiYgIXNvYXBIZWFkZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNvYXBSb2xlcygpIHsKLQkJaWYgKHNvYXBSb2xlcyA9PSBudWxsKSB7Ci0JCQlzb2FwUm9sZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNvYXBSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UG9ydE5hbWVzKCkgewotCQlpZiAocG9ydE5hbWVzID09IG51bGwpIHsKLQkJCXBvcnROYW1lcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gcG9ydE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SGFuZGxlckNsYXNzKCkgewotCQlpZiAoaGFuZGxlckNsYXNzICE9IG51bGwgJiYgaGFuZGxlckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRIYW5kbGVyQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWhhbmRsZXJDbGFzczsKLQkJCWhhbmRsZXJDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRIYW5kbGVyQ2xhc3MpOwotCQkJaWYgKGhhbmRsZXJDbGFzcyAhPSBvbGRIYW5kbGVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUywgb2xkSGFuZGxlckNsYXNzLCBoYW5kbGVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRIYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKEphdmFDbGFzcyBuZXdIYW5kbGVyQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEhhbmRsZXJDbGFzcyA9IGhhbmRsZXJDbGFzczsKLQkJaGFuZGxlckNsYXNzID0gbmV3SGFuZGxlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUywgb2xkSGFuZGxlckNsYXNzLCBoYW5kbGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChoYW5kbGVyTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlck5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBSb2xlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc29hcFJvbGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0hhbmRsZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2I5Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRSZWZJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydENvbXBvbmVudFJlZiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rID0gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9DT01QT05FTlRfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydENvbXBvbmVudExpbmsoKSB7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50TGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3J0Q29tcG9uZW50TGluayhTdHJpbmcgbmV3UG9ydENvbXBvbmVudExpbmspIHsKLQkJU3RyaW5nIG9sZFBvcnRDb21wb25lbnRMaW5rID0gcG9ydENvbXBvbmVudExpbms7Ci0JCXBvcnRDb21wb25lbnRMaW5rID0gbmV3UG9ydENvbXBvbmVudExpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTkssIG9sZFBvcnRDb21wb25lbnRMaW5rLCBwb3J0Q29tcG9uZW50TGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlR2VuKCkgewotCQlpZiAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwgJiYgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSwgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlR2VuKCk7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UhPW51bGwpIHsKLQkJCS8vIFZlcmlmeSB0aGUgaW50ZXJmYWNlIHR5cGUgaXMgc2V0IGNvcnJlY3RseSBvbiB0aGUgU0VJCi0JCQlUeXBlS2luZCB0eXBlS2luZCA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5nZXRLaW5kKCk7Ci0JCQlpZiAodHlwZUtpbmQgPT0gbnVsbCB8fCAhdHlwZUtpbmQuZXF1YWxzKFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKSkKLQkJCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uuc2V0S2luZChUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShKYXZhQ2xhc3MgbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TGluaygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJc2V0UG9ydENvbXBvbmVudExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlzZXRQb3J0Q29tcG9uZW50TGluayhQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXJldHVybiBQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUID09IG51bGwgPyBwb3J0Q29tcG9uZW50TGluayAhPSBudWxsIDogIVBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQuZXF1YWxzKHBvcnRDb21wb25lbnRMaW5rKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocG9ydENvbXBvbmVudExpbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocG9ydENvbXBvbmVudExpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0Q29tcG9uZW50UmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MzUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFBvcnRDb21wb25lbnRSZWZzIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHNlcnZpY2VJbnRlcmZhY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZOYW1lKCkgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZOYW1lKCkgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VSZWZOYW1lID0gU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGUoKSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZSA9IFdTRExfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqYXhycGNNYXBwaW5nRmlsZSA9IEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50UmVmcygpIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUW5hbWUoKSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUU5hbWUgc2VydmljZVFuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSZWZOYW1lKCkgewotCQlyZXR1cm4gc2VydmljZVJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIG5ld1NlcnZpY2VSZWZOYW1lKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlUmVmTmFtZSA9IHNlcnZpY2VSZWZOYW1lOwotCQlzZXJ2aWNlUmVmTmFtZSA9IG5ld1NlcnZpY2VSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUsIG9sZFNlcnZpY2VSZWZOYW1lLCBzZXJ2aWNlUmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbEZpbGUoKSB7Ci0JCXJldHVybiB3c2RsRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZShTdHJpbmcgbmV3V3NkbEZpbGUpIHsKLQkJU3RyaW5nIG9sZFdzZGxGaWxlID0gd3NkbEZpbGU7Ci0JCXdzZGxGaWxlID0gbmV3V3NkbEZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFLCBvbGRXc2RsRmlsZSwgd3NkbEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIG5ld0pheHJwY01hcHBpbmdGaWxlKSB7Ci0JCVN0cmluZyBvbGRKYXhycGNNYXBwaW5nRmlsZSA9IGpheHJwY01hcHBpbmdGaWxlOwotCQlqYXhycGNNYXBwaW5nRmlsZSA9IG5ld0pheHJwY01hcHBpbmdGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUsIG9sZEpheHJwY01hcHBpbmdGaWxlLCBqYXhycGNNYXBwaW5nRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZSgpIHsKLQkJaWYgKHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbCAmJiBzZXJ2aWNlSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZXJ2aWNlSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClzZXJ2aWNlSW50ZXJmYWNlOwotCQkJc2VydmljZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRTZXJ2aWNlSW50ZXJmYWNlKTsKLQkJCWlmIChzZXJ2aWNlSW50ZXJmYWNlICE9IG9sZFNlcnZpY2VJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFLCBvbGRTZXJ2aWNlSW50ZXJmYWNlLCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2UoSmF2YUNsYXNzIG5ld1NlcnZpY2VJbnRlcmZhY2UpIHsKLQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VJbnRlcmZhY2UgPSBzZXJ2aWNlSW50ZXJmYWNlOwotCQlzZXJ2aWNlSW50ZXJmYWNlID0gbmV3U2VydmljZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSwgb2xkU2VydmljZUludGVyZmFjZSwgc2VydmljZUludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQb3J0Q29tcG9uZW50UmVmcygpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZzID09IG51bGwpIHsKLQkJCXBvcnRDb21wb25lbnRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRDb21wb25lbnRSZWYuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRIYW5kbGVycygpIHsKLQkJaWYgKGhhbmRsZXJzID09IG51bGwpIHsKLQkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEhhbmRsZXIuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlMpOwotCQl9Ci0JCXJldHVybiBoYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUU5hbWUgZ2V0U2VydmljZVFuYW1lKCkgewotCQlyZXR1cm4gc2VydmljZVFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcnZpY2VRbmFtZShRTmFtZSBuZXdTZXJ2aWNlUW5hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUU5hbWUgb2xkU2VydmljZVFuYW1lID0gc2VydmljZVFuYW1lOwotCQlzZXJ2aWNlUW5hbWUgPSBuZXdTZXJ2aWNlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSwgb2xkU2VydmljZVFuYW1lLCBuZXdTZXJ2aWNlUW5hbWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VRbmFtZShRTmFtZSBuZXdTZXJ2aWNlUW5hbWUpIHsKLQkJaWYgKG5ld1NlcnZpY2VRbmFtZSAhPSBzZXJ2aWNlUW5hbWUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcnZpY2VRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlUW5hbWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NlcnZpY2VRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXJ2aWNlUW5hbWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VydmljZVFuYW1lKG5ld1NlcnZpY2VRbmFtZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG5ld1NlcnZpY2VRbmFtZSwgbmV3U2VydmljZVFuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3J0Q29tcG9uZW50UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlUW5hbWUobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldFdzZGxGaWxlKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50UmVmcygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCXJldHVybiBnZXRIYW5kbGVycygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VRbmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlzZXRTZXJ2aWNlUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXNldFdzZGxGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRIYW5kbGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJc2V0U2VydmljZVFuYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJc2V0U2VydmljZVJlZk5hbWUoU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZShXU0RMX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXNldFNlcnZpY2VRbmFtZSgoUU5hbWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXJldHVybiBTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlUmVmTmFtZSAhPSBudWxsIDogIVNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VSZWZOYW1lKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIFdTRExfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBqYXhycGNNYXBwaW5nRmlsZSAhPSBudWxsIDogIUpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCXJldHVybiBwb3J0Q29tcG9uZW50UmVmcyAhPSBudWxsICYmICFwb3J0Q29tcG9uZW50UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJzICE9IG51bGwgJiYgIWhhbmRsZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXJldHVybiBzZXJ2aWNlUW5hbWUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VSZWZOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXhycGNNYXBwaW5nRmlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF4cnBjTWFwcGluZ0ZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRlMTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXMgQ2xpZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRJbXBsI2dldENvbXBvbmVudFNjb3BlZFJlZnMgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNDbGllbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZXNDbGllbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKSA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBFTGlzdCBjb21wb25lbnRTY29wZWRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBXZWJTZXJ2aWNlc0NsaWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuV0VCX1NFUlZJQ0VTX0NMSUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUxpc3QgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpIHsKLQkJaWYgKGNvbXBvbmVudFNjb3BlZFJlZnMgPT0gbnVsbCkgewotCQkJY29tcG9uZW50U2NvcGVkUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUxpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6Ci0JCQkJZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlnZXRDb21wb25lbnRTY29wZWRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTOgotCQkJCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzICE9IG51bGwgJiYgIWNvbXBvbmVudFNjb3BlZFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dlYlNlcnZpY2VzQ2xpZW50SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4YmViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5Ci0gICAgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQkKLQkvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0gICAgfQotCQotCQkvKioKLQkJICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSB7Ci0JCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NZU1RFTUlEXzFfMCwgImoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzAuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0NIRU1BX0xPQ18xXzEsICJqMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotICAgICAgICBzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdlYlNlcnZpY2VzUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0JICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FLCBuZXcgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCSAgfQotICAgIAotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSwgbmV3IFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9ERF9VUklfT0JKKTsKLQl9Ci0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjVjMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXMuV2ViU2VydmljZXNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1Jlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VzUmVzb3VyY2UgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBhUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VzUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlcihhUmVuZGVyZXIpOwotICAgIH0KLQotCQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudCBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpIHsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlc0NsaWVudCkgZ2V0Um9vdE9iamVjdCgpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBXRUJfU0VSVklDRVNfQ0xJRU5UX1RZUEU7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzA7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU1lTVEVNSURfMV8wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfUFVCTElDSURfMV8wOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1BVQkxJQ0lEXzFfMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIFRoaXMgaXMgc2V0dGluZyB0aGUgbW9kdWxlIHZlcnNpb24gb24gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaW50IHZlcnNpb24gPSBXRUJTRVJWSUNFU18xXzBfSUQ7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKHZlcnNpb24pOwotCX0KLQkJLyogCi0JICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgKFdFQlNFUlZJQ0VTXzFfMF9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdFQlNFUlZJQ0VTXzFfMF9JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJTRVJWSUNFU18xXzBfSUQpOwotCQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfMF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZXNUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBXRUJTRVJWSUNFU18xXzBfSUQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCS8vbm90IG1vZGVsIGZvciBKMkVFIDEuNCBzbyBubyBvcGVyYXRpb24gcmVxdWlyZWQuCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkZWQyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgdGhlV2Vic2VydmljZV9jbGllbnRGYWN0b3J5ID0gKFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid2Vic2VydmljZV9jbGllbnQueG1pIik7IAotCQkJaWYgKHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUY6IHJldHVybiBjcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6IHJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSOiByZXR1cm4gY3JlYXRlSGFuZGxlcigpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVDogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlM6IHJldHVybiBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZiBjcmVhdGVTZXJ2aWNlUmVmKCkgewotCQlTZXJ2aWNlUmVmSW1wbCBzZXJ2aWNlUmVmID0gbmV3IFNlcnZpY2VSZWZJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCVBvcnRDb21wb25lbnRSZWZJbXBsIHBvcnRDb21wb25lbnRSZWYgPSBuZXcgUG9ydENvbXBvbmVudFJlZkltcGwoKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHsKLQkJSGFuZGxlckltcGwgaGFuZGxlciA9IG5ldyBIYW5kbGVySW1wbCgpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNDbGllbnQgY3JlYXRlV2ViU2VydmljZXNDbGllbnQoKSB7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50SW1wbCB3ZWJTZXJ2aWNlc0NsaWVudCA9IG5ldyBXZWJTZXJ2aWNlc0NsaWVudEltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBDb21wb25lbnRTY29wZWRSZWZzIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMoKSB7Ci0JCUNvbXBvbmVudFNjb3BlZFJlZnNJbXBsIGNvbXBvbmVudFNjb3BlZFJlZnMgPSBuZXcgQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwoKTsKLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMTY2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb3J0Q29tcG9uZW50UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGhhbmRsZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd2ViU2VydmljZXNDbGllbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VSZWYoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3J0Q29tcG9uZW50UmVmKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SGFuZGxlcigpIHsKLQkJcmV0dXJuIGhhbmRsZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfU29hcFJvbGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfUG9ydE5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNDbGllbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBnZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoV2Vic2VydmljZV9jbGllbnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXNlcnZpY2VSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0hBTkRMRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSk7Ci0KLQkJcG9ydENvbXBvbmVudFJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX0NPTVBPTkVOVF9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSk7Ci0KLQkJaGFuZGxlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIQU5ETEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19IQU5ETEVSX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1NPQVBfUk9MRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1BPUlRfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCi0JCXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9TRVJWSUNFU19DTElFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCi0JCWNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9ORU5UX1NDT1BFRF9SRUZTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUphdmFSZWZQYWNrYWdlIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJc2VydmljZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWhhbmRsZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJd2ViU2VydmljZXNDbGllbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkVDbGFzcywgU2VydmljZVJlZi5jbGFzcywgIlNlcnZpY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlUmVmTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCksIHRoaXMuZ2V0UG9ydENvbXBvbmVudFJlZigpLCBudWxsLCAicG9ydENvbXBvbmVudFJlZnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSwgbnVsbCwgInNlcnZpY2VRbmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAiUG9ydENvbXBvbmVudFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydENvbXBvbmVudExpbmsiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDEsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhoYW5kbGVyRUNsYXNzLCBIYW5kbGVyLmNsYXNzLCAiSGFuZGxlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaGFuZGxlck5hbWUiLCBudWxsLCAwLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX1NvYXBSb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfUG9ydE5hbWVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpLCBudWxsLCAic29hcEhlYWRlcnMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIldlYlNlcnZpY2VzQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCksIHRoaXMuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLCBudWxsLCAiY29tcG9uZW50U2NvcGVkUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MsIENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsICJDb21wb25lbnRTY29wZWRSZWZzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbXBvbmVudE5hbWUiLCBudWxsLCAwLCAxLCBDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCksIHRoaXMuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAxLCAtMSwgQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODkzNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vic2VydmljZV9jbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgV2Vic2VydmljZV9jbGllbnRTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlc0NsaWVudChXZWJTZXJ2aWNlc0NsaWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZXNDbGllbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRTY29wZWRSZWZzKENvbXBvbmVudFNjb3BlZFJlZnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIDxlbT5TZXJ2aWNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCA8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGOiB7Ci0JCQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VSZWYoc2VydmljZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoc2VydmljZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChzZXJ2aWNlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2aWNlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6IHsKLQkJCQlQb3J0Q29tcG9uZW50UmVmIHBvcnRDb21wb25lbnRSZWYgPSAoUG9ydENvbXBvbmVudFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydENvbXBvbmVudFJlZihwb3J0Q29tcG9uZW50UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChwb3J0Q29tcG9uZW50UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSOiB7Ci0JCQkJSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChoYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChoYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UOiB7Ci0JCQkJV2ViU2VydmljZXNDbGllbnQgd2ViU2VydmljZXNDbGllbnQgPSAoV2ViU2VydmljZXNDbGllbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlNlcnZpY2VzQ2xpZW50KHdlYlNlcnZpY2VzQ2xpZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJTZXJ2aWNlc0NsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTOiB7Ci0JCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjb21wb25lbnRTY29wZWRSZWZzID0gKENvbXBvbmVudFNjb3BlZFJlZnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBvbmVudFNjb3BlZFJlZnMoY29tcG9uZW50U2NvcGVkUmVmcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29tcG9uZW50U2NvcGVkUmVmcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhhbmRsZXIoSGFuZGxlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXNDbGllbnQoV2ViU2VydmljZXNDbGllbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRTY29wZWRSZWZzKENvbXBvbmVudFNjb3BlZFJlZnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9XZWJzZXJ2aWNlX2NsaWVudFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzdlMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSB3ZWIgc2VydmljZXMgY2xpZW50IG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGFydGlmYWN0cyBvZiBhIHdlYiBzZXJ2aWNlcyBjbGllbnQKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9EZXNjcmlwdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGVzY3JpcHRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OGI4OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9EZXNjcmlwdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaXB0aW9uVHlwZSBleHRlbmRzIERlc2NyaXB0aW9uIHsKLS8vIERlc2NyaXB0aW9uVHlwZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9EaXNwbGF5TmFtZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGlzcGxheU5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzQxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9EaXNwbGF5TmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldERpc3BsYXlOYW1lVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwbGF5TmFtZVR5cGUgZXh0ZW5kcyBEaXNwbGF5TmFtZSB7Ci0vLyBEaXNwbGF5TmFtZVR5cGUKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vSW5pdFBhcmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0luaXRQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTEzMmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vSW5pdFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgUGFyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvblR5cGVzIDxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0SW5pdFBhcmFtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRQYXJhbSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbV9QYXJhbU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1WYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldERlc2NyaXB0aW9uVHlwZXMoKTsKLQotfSAvLyBJbml0UGFyYW0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vUG9ydE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vUG9ydE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiNmE1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1BvcnROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRQb3J0TmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0TmFtZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQSGVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1NPQVBIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZjE0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1NPQVBIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgSGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBoYW5kbGVyLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0U09BUEhlYWRlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyIGV4dGVuZHMgUU5hbWUgewotLy8gU09BUEhlYWRlcgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZmOTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vU09BUFJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFNPQVBSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBSb2xlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIFJvbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBSb2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTb2FwUm9sZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRTT0FQUm9sZV9Tb2FwUm9sZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U29hcFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUjZ2V0U29hcFJvbGUgPGVtPlNvYXAgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U29hcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTb2FwUm9sZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNPQVBSb2xlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkYTBkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdzY29tbW9uRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3Njb21tb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vbkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBIZWFkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU09BUFJvbGUgY3JlYXRlU09BUFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUG9ydE5hbWUgY3JlYXRlUG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEZXNjcmlwdGlvblR5cGUgY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEaXNwbGF5TmFtZVR5cGUgY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2NvbW1vblBhY2thZ2UgZ2V0V3Njb21tb25QYWNrYWdlKCk7Ci0KLX0gLy9Xc2NvbW1vbkZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vV3Njb21tb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg3ZmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vV3Njb21tb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiAqKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCQotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3Njb21tb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5BTUUgPSAid3Njb21tb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1VSSSA9ICJ3c2NvbW1vbi54bWkiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzY29tbW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsIDxlbT5Jbml0IFBhcmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRJbml0UGFyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU0gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fX1BBUkFNX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBJTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluaXQgUGFyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBJTklUX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsIDxlbT5TT0FQIEhlYWRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNPQVBfSEVBREVSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUl9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUl9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U09BUCBIZWFkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbCA8ZW0+U09BUCBSb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFNPQVBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTT0FQX1JPTEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9ST0xFX19TT0FQX1JPTEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TT0FQIFJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX1JPTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuUG9ydE5hbWVJbXBsIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlBvcnROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBPUlRfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX05BTUVfX1BPUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTkFNRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvblR5cGVJbXBsIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IERFU0NSSVBUSU9OX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IERFU0NSSVBUSU9OX1RZUEVfX0xBTkcgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBERVNDUklQVElPTl9UWVBFX19WQUxVRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBERVNDUklQVElPTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVUeXBlSW1wbCA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgRElTUExBWV9OQU1FX1RZUEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IERJU1BMQVlfTkFNRV9UWVBFX19MQU5HID0gQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IERJU1BMQVlfTkFNRV9UWVBFX19WQUxVRSA9IENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IERJU1BMQVlfTkFNRV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0gPGVtPkluaXQgUGFyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEluaXRQYXJhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbU5hbWUgPGVtPlBhcmFtIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW0gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtTmFtZSgpCi0JICogQHNlZSAjZ2V0SW5pdFBhcmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtVmFsdWUoKQotCSAqIEBzZWUgI2dldEluaXRQYXJhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRJbml0UGFyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvblR5cGVzIDxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uIFR5cGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb25UeXBlcygpCi0JICogQHNlZSAjZ2V0SW5pdFBhcmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlciA8ZW0+U09BUCBIZWFkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U09BUEhlYWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSA8ZW0+U09BUCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TT0FQIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U09BUFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSNnZXRTb2FwUm9sZSA8ZW0+U29hcCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUjZ2V0U29hcFJvbGUoKQotCSAqIEBzZWUgI2dldFNPQVBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U09BUFJvbGVfU29hcFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lI2dldFBvcnROYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnROYW1lX1BvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3Njb21tb25GYWN0b3J5IGdldFdzY29tbW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwgPGVtPkluaXQgUGFyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldEluaXRQYXJhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTklUX1BBUkFNID0gZUlOU1RBTkNFLmdldEluaXRQYXJhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSVRfUEFSQU1fX1BBUkFNX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUX1BBUkFNX19QQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUX1BBUkFNX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsIDxlbT5TT0FQIEhlYWRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU09BUF9IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0U09BUEhlYWRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbCA8ZW0+U09BUCBSb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFNPQVBSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNPQVBfUk9MRSA9IGVJTlNUQU5DRS5nZXRTT0FQUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU09BUF9ST0xFX19TT0FQX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUFJvbGVfU29hcFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwgPGVtPlBvcnQgTmFtZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRQb3J0TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT1JUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UG9ydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfTkFNRV9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldFBvcnROYW1lX1BvcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25UeXBlSW1wbCA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvblR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVUeXBlSW1wbCA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNQTEFZX05BTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZVR5cGUoKTsKLQotCX0KLQotfSAvL1dzY29tbW9uUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmU0MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UeXBlSW1wbCBleHRlbmRzIERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIERlc2NyaXB0aW9uVHlwZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERlc2NyaXB0aW9uVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9UWVBFOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE3OTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZVR5cGVJbXBsIGV4dGVuZHMgRGlzcGxheU5hbWVJbXBsIGltcGxlbWVudHMgRGlzcGxheU5hbWVUeXBlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRGlzcGxheU5hbWVUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLkRJU1BMQVlfTkFNRV9UWVBFOwotCX0KLQotfSAvL0Rpc3BsYXlOYW1lVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQyYmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBQYXJhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbCNnZXRQYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbCNnZXREZXNjcmlwdGlvblR5cGVzIDxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRQYXJhbUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbml0UGFyYW0KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbU5hbWUgPSBQQVJBTV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1WYWx1ZSgpIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVmFsdWUgPSBQQVJBTV9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVHlwZXMoKSA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVHlwZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25UeXBlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBJbml0UGFyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSU5JVF9QQVJBTTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1OYW1lKCkgewotCQlyZXR1cm4gcGFyYW1OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyBuZXdQYXJhbU5hbWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtTmFtZSA9IHBhcmFtTmFtZTsKLQkJcGFyYW1OYW1lID0gbmV3UGFyYW1OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSwgb2xkUGFyYW1OYW1lLCBwYXJhbU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyBuZXdQYXJhbVZhbHVlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVZhbHVlID0gcGFyYW1WYWx1ZTsKLQkJcGFyYW1WYWx1ZSA9IG5ld1BhcmFtVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSwgb2xkUGFyYW1WYWx1ZSwgcGFyYW1WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9uVHlwZXMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvblR5cGVzID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uVHlwZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb25UeXBlLmNsYXNzLCB0aGlzLCBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25UeXBlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtTmFtZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVHlwZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQlnZXREZXNjcmlwdGlvblR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvblR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoUEFSQU1fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZShQQVJBTV9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTOgotCQkJCWdldERlc2NyaXB0aW9uVHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gUEFSQU1fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1OYW1lICE9IG51bGwgOiAhUEFSQU1fTkFNRV9FREVGQVVMVC5lcXVhbHMocGFyYW1OYW1lKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXJldHVybiBQQVJBTV9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1WYWx1ZSAhPSBudWxsIDogIVBBUkFNX1ZBTFVFX0VERUZBVUxULmVxdWFscyhwYXJhbVZhbHVlKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZXMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25UeXBlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Jbml0UGFyYW1JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvUG9ydE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvUG9ydE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjEzNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnROYW1lSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcnROYW1lCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZSA9IFBPUlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFBvcnROYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLlBPUlRfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBwb3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgewotCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0TmFtZTsKLQkJcG9ydE5hbWUgPSBuZXdQb3J0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FLCBvbGRQb3J0TmFtZSwgcG9ydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUU6Ci0JCQkJc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwb3J0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0TmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODQ5MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgSGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU09BUEhlYWRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5TT0FQX0hFQURFUjsKLQl9Ci0KLX0gLy9TT0FQSGVhZGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MxMDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U09BUCBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuU09BUFJvbGVJbXBsI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUm9sZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBTT0FQUm9sZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZSgpIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZSgpIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc29hcFJvbGUgPSBTT0FQX1JPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBTT0FQUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5TT0FQX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNvYXBSb2xlKCkgewotCQlyZXR1cm4gc29hcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTb2FwUm9sZShTdHJpbmcgbmV3U29hcFJvbGUpIHsKLQkJU3RyaW5nIG9sZFNvYXBSb2xlID0gc29hcFJvbGU7Ci0JCXNvYXBSb2xlID0gbmV3U29hcFJvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRSwgb2xkU29hcFJvbGUsIHNvYXBSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFNvYXBSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgotCQkJCXNldFNvYXBSb2xlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRToKLQkJCQlzZXRTb2FwUm9sZShTT0FQX1JPTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJcmV0dXJuIFNPQVBfUk9MRV9FREVGQVVMVCA9PSBudWxsID8gc29hcFJvbGUgIT0gbnVsbCA6ICFTT0FQX1JPTEVfRURFRkFVTFQuZXF1YWxzKHNvYXBSb2xlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc29hcFJvbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvYXBSb2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU09BUFJvbGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViOWEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2NvbW1vbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgV3Njb21tb25GYWN0b3J5Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV3Njb21tb25GYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlXc2NvbW1vbkZhY3RvcnkgdGhlV3Njb21tb25GYWN0b3J5ID0gKFdzY29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid3Njb21tb24ueG1pIik7IAotCQkJaWYgKHRoZVdzY29tbW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVdzY29tbW9uRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBXc2NvbW1vbkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2NvbW1vbkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU06IHJldHVybiBjcmVhdGVJbml0UGFyYW0oKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSOiByZXR1cm4gY3JlYXRlU09BUEhlYWRlcigpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFOiByZXR1cm4gY3JlYXRlU09BUFJvbGUoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRTogcmV0dXJuIGNyZWF0ZVBvcnROYW1lKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9UWVBFOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfVFlQRTogcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSW5pdFBhcmFtIGNyZWF0ZUluaXRQYXJhbSgpIHsKLQkJSW5pdFBhcmFtSW1wbCBpbml0UGFyYW0gPSBuZXcgSW5pdFBhcmFtSW1wbCgpOwotCQlyZXR1cm4gaW5pdFBhcmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNPQVBIZWFkZXIgY3JlYXRlU09BUEhlYWRlcigpIHsKLQkJU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbCgpOwotCQlyZXR1cm4gc29hcEhlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTT0FQUm9sZSBjcmVhdGVTT0FQUm9sZSgpIHsKLQkJU09BUFJvbGVJbXBsIHNvYXBSb2xlID0gbmV3IFNPQVBSb2xlSW1wbCgpOwotCQlyZXR1cm4gc29hcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgUG9ydE5hbWUgY3JlYXRlUG9ydE5hbWUoKSB7Ci0JCVBvcnROYW1lSW1wbCBwb3J0TmFtZSA9IG5ldyBQb3J0TmFtZUltcGwoKTsKLQkJcmV0dXJuIHBvcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERlc2NyaXB0aW9uVHlwZSBjcmVhdGVEZXNjcmlwdGlvblR5cGUoKSB7Ci0JCURlc2NyaXB0aW9uVHlwZUltcGwgZGVzY3JpcHRpb25UeXBlID0gbmV3IERlc2NyaXB0aW9uVHlwZUltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEaXNwbGF5TmFtZVR5cGUgY3JlYXRlRGlzcGxheU5hbWVUeXBlKCkgewotCQlEaXNwbGF5TmFtZVR5cGVJbXBsIGRpc3BsYXlOYW1lVHlwZSA9IG5ldyBEaXNwbGF5TmFtZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25QYWNrYWdlIGdldFdzY29tbW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChXc2NvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vV3Njb21tb25GYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2Q4MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdzY29tbW9uUGFja2FnZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgaW5pdFBhcmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgc29hcEhlYWRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNvYXBSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgcG9ydE5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBkZXNjcmlwdGlvblR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBkaXNwbGF5TmFtZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgV3Njb21tb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdzY29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXc2NvbW1vblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlV3Njb21tb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVXc2NvbW1vblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEluaXRQYXJhbSgpIHsKLQkJcmV0dXJuIGluaXRQYXJhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFNPQVBIZWFkZXIoKSB7Ci0JCXJldHVybiBzb2FwSGVhZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTT0FQUm9sZSgpIHsKLQkJcmV0dXJuIHNvYXBSb2xlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUFJvbGVfU29hcFJvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzb2FwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHBvcnROYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldERpc3BsYXlOYW1lVHlwZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2NvbW1vbkZhY3RvcnkgZ2V0V3Njb21tb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKFdzY29tbW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJaW5pdFBhcmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRfUEFSQU0pOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19QQVJBTV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyk7Ci0KLQkJc29hcEhlYWRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUik7Ci0KLQkJc29hcFJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzb2FwUm9sZUVDbGFzcywgU09BUF9ST0xFX19TT0FQX1JPTEUpOwotCi0JCXBvcnROYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydE5hbWVFQ2xhc3MsIFBPUlRfTkFNRV9fUE9SVF9OQU1FKTsKLQotCQlkZXNjcmlwdGlvblR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT05fVFlQRSk7Ci0KLQkJZGlzcGxheU5hbWVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU1BMQVlfTkFNRV9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc29hcEhlYWRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQlzb2FwUm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlwb3J0TmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlkZXNjcmlwdGlvblR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpKTsKLQkJZGlzcGxheU5hbWVUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhpbml0UGFyYW1FQ2xhc3MsIEluaXRQYXJhbS5jbGFzcywgIkluaXRQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1OYW1lIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1WYWx1ZSIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKSwgdGhpcy5nZXREZXNjcmlwdGlvblR5cGUoKSwgbnVsbCwgImRlc2NyaXB0aW9uVHlwZXMiLCBudWxsLCAwLCAtMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc29hcEhlYWRlckVDbGFzcywgU09BUEhlYWRlci5jbGFzcywgIlNPQVBIZWFkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhzb2FwUm9sZUVDbGFzcywgU09BUFJvbGUuY2xhc3MsICJTT0FQUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUFJvbGVfU29hcFJvbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvYXBSb2xlIiwgbnVsbCwgMCwgMSwgU09BUFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0TmFtZUVDbGFzcywgUG9ydE5hbWUuY2xhc3MsICJQb3J0TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdGlvblR5cGVFQ2xhc3MsIERlc2NyaXB0aW9uVHlwZS5jbGFzcywgIkRlc2NyaXB0aW9uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lVHlwZUVDbGFzcywgRGlzcGxheU5hbWVUeXBlLmNsYXNzLCAiRGlzcGxheU5hbWVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9Xc2NvbW1vblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNjFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdzY29tbW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV3Njb21tb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgV3Njb21tb25Td2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyKFNPQVBIZWFkZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQUm9sZShTT0FQUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU09BUFJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0TmFtZShQb3J0TmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvblR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNwbGF5TmFtZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSA8ZW0+SW5pdCBQYXJhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIgPGVtPlNPQVAgSGVhZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSA8ZW0+U09BUCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzcGxheU5hbWVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dzY29tbW9uQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmNlMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzY29tbW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTTogewotCQkJCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbml0UGFyYW0oaW5pdFBhcmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChpbml0UGFyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSOiB7Ci0JCQkJU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXIoc29hcEhlYWRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUoc29hcEhlYWRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc29hcEhlYWRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFOiB7Ci0JCQkJU09BUFJvbGUgc29hcFJvbGUgPSAoU09BUFJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBSb2xlKHNvYXBSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzb2FwUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FOiB7Ci0JCQkJUG9ydE5hbWUgcG9ydE5hbWUgPSAoUG9ydE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnROYW1lKHBvcnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChwb3J0TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fVFlQRTogewotCQkJCURlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvblR5cGUgPSAoRGVzY3JpcHRpb25UeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvblR5cGUoZGVzY3JpcHRpb25UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGRlc2NyaXB0aW9uVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEU6IHsKLQkJCQlEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVUeXBlID0gKERpc3BsYXlOYW1lVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzcGxheU5hbWVUeXBlKGRpc3BsYXlOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzcGxheU5hbWUoZGlzcGxheU5hbWVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChkaXNwbGF5TmFtZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09BUCBIZWFkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09BUCBIZWFkZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyKFNPQVBIZWFkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TT0FQIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU09BUFJvbGUoU09BUFJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydE5hbWUoUG9ydE5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dzY29tbW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2ZmZjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIHdlYiBzZXJ2aWNlcyBjb21tb24gbW9kZWwgYXBpLiBVc2luZyB0aGlzIGFwaSB0aGUgY29tbW9uIHdlYiBzZXJ2aWNlcyBtb2RlbCBhcnRpZmFjdHMgKFNvYXBIZWFkZXJzLCBQb3J0cywgRGlzcGxheU5hbWUsIEluaXRQYXJhbXMgZXRjLikgCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9CZWFuTGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0JlYW5MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzVkZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0JlYW5MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJlYW4gTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0QmVhbkxpbmsoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbkxpbmsgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0gLy8gQmVhbkxpbmsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9FSkJMaW5rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvRUpCTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDU0MTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9FSkJMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYSBXZWIgU2VydmljZSBFbmRwb2ludC4KLSAqIAotICogVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0gKiAKLSAqIEV4YW1wbGVzOgotICogPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLSAqIAk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEVKQkxpbmsoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCTGluayBleHRlbmRzIEJlYW5MaW5rIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiTGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0RUpCTGlua19FamJMaW5rKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRFamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RWpiTGluayhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVKQkxpbmsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU5NmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotICogCi0gKiBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIYW5kbGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEhhbmRsZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfU29hcEhlYWRlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0U29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFNvYXBSb2xlcygpOwotCi19IC8vIEhhbmRsZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyQ2hhaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3OTBhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlckNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBIYW5kbGVyQ2hhaW4uamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyIENoYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotICogCi0gKiBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4gPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFBvcnROYW1lUGF0dGVybiA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0UHJvdG9jb2xCaW5kaW5ncyA8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlckNoYWluKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJDaGFpbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VOYW1lUGF0dGVybihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZU5hbWVQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnROYW1lUGF0dGVybihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3J0TmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0UG9ydE5hbWVQYXR0ZXJuIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb3RvY29sQmluZGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRIYW5kbGVycygpOwotCi19IC8vIEhhbmRsZXJDaGFpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0hhbmRsZXJzQ2hhaW5zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlcnNDaGFpbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiZTBiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlcnNDaGFpbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSGFuZGxlcnNDaGFpbnMuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVycyBDaGFpbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuCi0gKiAKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotICogCi0gKiBFeGFtcGxlczoKLSAqIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0gKiAJPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zI2dldEhhbmRsZXJDaGFpbiA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJzQ2hhaW5zKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJzQ2hhaW5zIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJzQ2hhaW5zX0hhbmRsZXJDaGFpbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRIYW5kbGVyQ2hhaW4oKTsKLQotfSAvLyBIYW5kbGVyc0NoYWlucwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1BvcnRDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMmU3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1BvcnRDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGFzc29jaWF0ZXMgYSBXU0RMIHBvcnQgd2l0aCBhIFdlYiBzZXJ2aWNlIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24uICBJdCBkZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGFzIGEgY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMgcmVwcmVzZW50YXRpb25zLCBXU0RMIHBvcnQgUU5hbWUsIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLCBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQb3J0Q29tcG9uZW50TmFtZSA8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0V3NkbFBvcnQgPGVtPldzZGwgUG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUltcGxCZWFuIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxTZXJ2aWNlIDxlbT5Xc2RsIFNlcnZpY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFByb3RvY29sQmluZGluZyA8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnRDb21wb25lbnQgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydCBjb21wb25lbnQncyBuYW1lLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3J0Q29tcG9uZW50TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFBvcnRDb21wb25lbnROYW1lIDxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQb3J0Q29tcG9uZW50TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbFBvcnQoV1NETFBvcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFBvcnQgZ2V0V3NkbFBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFBvcnQoV1NETFBvcnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBJbXBsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTZXJ2aWNlSW1wbEJlYW4gZ2V0U2VydmljZUltcGxCZWFuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEhhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEZXNjcmlwdGlvblR5cGUgZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIERpc3BsYXlOYW1lVHlwZSBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJY29uVHlwZShJY29uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBJY29uVHlwZSBnZXRJY29uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIFNlcnZpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgU2VydmljZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxTZXJ2aWNlKFdTRExTZXJ2aWNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfV3NkbFNlcnZpY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdTRExTZXJ2aWNlIGdldFdzZGxTZXJ2aWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsU2VydmljZSA8ZW0+V3NkbCBTZXJ2aWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxTZXJ2aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXc2RsU2VydmljZShXU0RMU2VydmljZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmFibGUgTXRvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbmFibGVNdG9tKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRW5hYmxlTXRvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjaXNFbmFibGVNdG9tIDxlbT5FbmFibGUgTXRvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlIE10b208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW5hYmxlTXRvbShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvdG9jb2xCaW5kaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1Byb3RvY29sQmluZGluZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm90b2NvbEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFByb3RvY29sQmluZGluZyA8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvdG9jb2xCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm90b2NvbEJpbmRpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFuZGxlckNoYWlucyhIYW5kbGVyc0NoYWlucykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSGFuZGxlcnNDaGFpbnMgZ2V0SGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYW5kbGVyQ2hhaW5zKEhhbmRsZXJzQ2hhaW5zIHZhbHVlKTsKLQotfSAvLyBQb3J0Q29tcG9uZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvU2VydmljZUltcGxCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvU2VydmljZUltcGxCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTMyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZpY2VJbXBsQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBJbXBsIEJlYW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi5BIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViIGNvbXBvbmVudC4gRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIFdlYiBzZXJ2aWNlIHVzaW5nIGFuIGVqYi1saW5rLgotICogCi0gKiBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFRUpCTGluayA8ZW0+RUVKQiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVTZXJ2bGV0TGluayA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRCZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0U2VydmljZUltcGxCZWFuKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VJbXBsQmVhbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRUpCIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUVKQiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVFSkIgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RUVKQkxpbmsoRUpCTGluaykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVKQkxpbmsgZ2V0RUVKQkxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RUVKQkxpbmsgPGVtPkVFSkIgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVFSkIgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RUVKQkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRFRUpCTGluayhFSkJMaW5rIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVTZXJ2bGV0IExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVNlcnZsZXQgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FU2VydmxldCBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFU2VydmxldExpbmsoU2VydmxldExpbmspCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmxldExpbmsgZ2V0RVNlcnZsZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVTZXJ2bGV0TGluayA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVTZXJ2bGV0IExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEVTZXJ2bGV0TGluayhTZXJ2bGV0TGluayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CZWFuIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmVhbiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmVhbkxpbmsoQmVhbkxpbmspCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBCZWFuTGluayBnZXRCZWFuTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRCZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCZWFuTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEJlYW5MaW5rKEJlYW5MaW5rIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlSW1wbEJlYW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9TZXJ2bGV0TGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZsZXRMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NzJjM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZsZXRMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLSAqIAotICogVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsjZ2V0U2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZsZXRMaW5rKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRMaW5rIGV4dGVuZHMgQmVhbkxpbmsgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXQgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2bGV0TGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNlcnZsZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsjZ2V0U2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTZXJ2bGV0TGluayhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlcnZsZXRMaW5rCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV1NETFBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XU0RMUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODEyZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XU0RMUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXU0RMUG9ydCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUG9ydCBleHRlbmRzIFFOYW1lIHsKLSAvLyBXU0RMUG9ydAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV1NETFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhOTNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV1NETFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV1NETFNlcnZpY2UuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFNlcnZpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXU0RMU2VydmljZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMU2VydmljZSBleHRlbmRzIFFOYW1lIHsKLX0gLy8gV1NETFNlcnZpY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XZWJTZXJ2aWNlRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XZWJTZXJ2aWNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0ZDBlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbiBlbGVtZW50IGRlZmluZXMgYSBXU0RMIGRvY3VtZW50IGZpbGUgYW5kIHRoZSBzZXQgb2YgUG9ydCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV1NETCBwb3J0cyBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb25zIGRlZmluZWQgd2l0aGluIGEgbW9kdWxlLgotICogCi0gKiBBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudCBkZWZpbmVkLgotICogCi0gKiBVc2VkIGluOiB3ZWJzZXJ2aWNlcwotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRQb3J0Q29tcG9uZW50cyA8ZW0+UG9ydCBDb21wb25lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZURlc2NyaXB0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mIHBvcnQtY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggYSBXU0RMIGZpbGUgYW5kIEpBWC1SUEMgbWFwcGluZy4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlIG1vZHVsZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbEZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbEZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhcmdlSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFBvcnRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIERlc2NyaXB0aW9uVHlwZSBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIERpc3BsYXlOYW1lVHlwZSBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEljb25UeXBlKEljb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSWNvblR5cGUgZ2V0SWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gV2ViU2VydmljZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XZWJTZXJ2aWNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2I2YjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XZWJTZXJ2aWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQgc2VydmljZXMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucyA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZXMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXMgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpOwotCi19IC8vIFdlYlNlcnZpY2VzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODlmN2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXc2RkRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3NkZEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV2ViU2VydmljZXMgY3JlYXRlV2ViU2VydmljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFBvcnRDb21wb25lbnQgY3JlYXRlUG9ydENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFBvcnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMUG9ydCBjcmVhdGVXU0RMUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmljZUltcGxCZWFuIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTZXJ2bGV0TGluayBjcmVhdGVTZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUpCTGluayBjcmVhdGVFSkJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSGFuZGxlciBjcmVhdGVIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCZWFuTGluayBjcmVhdGVCZWFuTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFNlcnZpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgU2VydmljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV1NETFNlcnZpY2UgY3JlYXRlV1NETFNlcnZpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSGFuZGxlckNoYWluIGNyZWF0ZUhhbmRsZXJDaGFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXJzIENoYWluczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSGFuZGxlcnNDaGFpbnMgY3JlYXRlSGFuZGxlcnNDaGFpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzZGRQYWNrYWdlIGdldFdzZGRQYWNrYWdlKCk7Ci0KLX0gLy9Xc2RkRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyNTBjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIC8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTkFNRSA9ICJ3c2RkIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAid3NkZC54bWkiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3NkZFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZXNJbXBsIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0V2ViU2VydmljZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwgPGVtPlBvcnQgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbXBsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGUgTXRvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkcgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydEltcGwgPGVtPldTREwgUG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXU0RMUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9QT1JUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgUG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTVBMX0JFQU4gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFSkIgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTZXJ2bGV0IExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkJlYW5MaW5rSW1wbCA8ZW0+QmVhbiBMaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkJlYW5MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldEJlYW5MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBCRUFOX0xJTksgPSA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJlYW4gTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEJFQU5fTElOS19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZsZXRMaW5rSW1wbCA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZsZXRMaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTRVJWTEVUX0xJTksgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTksgPSBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVkxFVF9MSU5LX0ZFQVRVUkVfQ09VTlQgPSBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkVKQkxpbmtJbXBsIDxlbT5FSkIgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldEVKQkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEVKQl9MSU5LID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRUpCX0xJTktfX0VKQl9MSU5LID0gQkVBTl9MSU5LX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRUpCX0xJTktfRkVBVFVSRV9DT1VOVCA9IEJFQU5fTElOS19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwgPGVtPkhhbmRsZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBIQU5ETEVSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fSEFORExFUl9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fSU5JVF9QQVJBTVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX1NPQVBfSEVBREVSUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX1NPQVBfUk9MRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SGFuZGxlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZUltcGwgPGVtPldTREwgU2VydmljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdTRExTZXJ2aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdTRExfU0VSVklDRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdTRExfU0VSVklDRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdTRExfU0VSVklDRV9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0VfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdTRExfU0VSVklDRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBTZXJ2aWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdTRExfU0VSVklDRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckNoYWluSW1wbCA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSEFORExFUl9DSEFJTiA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0NIQUlOX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlcnNDaGFpbnNJbXBsIDxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyc0NoYWluc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyc0NoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIQU5ETEVSU19DSEFJTlMgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUlNfQ0hBSU5TX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdlYlNlcnZpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlcyNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24gPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXc2RsRmlsZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNtYWxsIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0UG9ydENvbXBvbmVudHMgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0UG9ydENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SWNvblR5cGUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQgPGVtPlBvcnQgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0UG9ydENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQb3J0Q29tcG9uZW50TmFtZSA8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UG9ydENvbXBvbmVudE5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U21hbGwgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBQb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0V3NkbFBvcnQoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhbmRsZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlcnMoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SWNvblR5cGUoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxTZXJ2aWNlIDxlbT5Xc2RsIFNlcnZpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFNlcnZpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsU2VydmljZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9Xc2RsU2VydmljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5hYmxlIE10b208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNpc0VuYWJsZU10b20oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRW5hYmxlTXRvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQcm90b2NvbEJpbmRpbmcgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UHJvdG9jb2xCaW5kaW5nKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1Byb3RvY29sQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlckNoYWlucygpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQgPGVtPldTREwgUG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETFBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2aWNlSW1wbEJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFRUpCTGluayA8ZW0+RUVKQiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVFSkIgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RUVKQkxpbmsoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVTZXJ2bGV0TGluayA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FU2VydmxldCBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFU2VydmxldExpbmsoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRCZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0QmVhbkxpbmsoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFNlcnZsZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayNnZXRTZXJ2bGV0TGluayA8ZW0+U2VydmxldCBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayNnZXRTZXJ2bGV0TGluaygpCi0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsgPGVtPkVKQiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0RUpCTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rI2dldEVqYkxpbmsoKQotCSAqIEBzZWUgI2dldEVKQkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRFSkJMaW5rX0VqYkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyIDxlbT5IYW5kbGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRTb2FwSGVhZGVycygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcFJvbGVzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CZWFuIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRCZWFuTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlIDxlbT5XU0RMIFNlcnZpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXU0RMU2VydmljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SGFuZGxlckNoYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFBvcnROYW1lUGF0dGVybiA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0UHJvdG9jb2xCaW5kaW5ncygpCi0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMoKQotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SGFuZGxlckNoYWluX0hhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnMgPGVtPkhhbmRsZXJzIENoYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhhbmRsZXJzQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zI2dldEhhbmRsZXJDaGFpbiA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWlucyNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBzZWUgI2dldEhhbmRsZXJzQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3NkZEZhY3RvcnkgZ2V0V3NkZEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbCA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZXNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9TRVJWSUNFUyA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsIDxlbT5Qb3J0IENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVF9DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04gPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTiA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW1wbCBCZWFuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmFibGUgTXRvbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0VuYWJsZU10b20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORyA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1Byb3RvY29sQmluZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydEltcGwgPGVtPldTREwgUG9ydDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldTRExQb3J0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXU0RMUG9ydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0V1NETFBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwgPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9JTVBMX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FRUpCIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RVNlcnZsZXQgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTksgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TGlua0ltcGwgPGVtPlNlcnZsZXQgTGluazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZsZXRMaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRTZXJ2bGV0TGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWTEVUX0xJTksgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldExpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LID0gZUlOU1RBTkNFLmdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbCA8ZW0+RUpCIExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRFSkJMaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9MSU5LID0gZUlOU1RBTkNFLmdldEVKQkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xJTktfX0VKQl9MSU5LID0gZUlOU1RBTkNFLmdldEVKQkxpbmtfRWpiTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwgPGVtPkhhbmRsZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEhBTkRMRVIgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSEFORExFUl9fSEFORExFUl9OQU1FID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSEFORExFUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJfX1NPQVBfSEVBREVSUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBIQU5ETEVSX19TT0FQX1JPTEVTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5CZWFuTGlua0ltcGwgPGVtPkJlYW4gTGluazwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkJlYW5MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRCZWFuTGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCRUFOX0xJTksgPSBlSU5TVEFOQ0UuZ2V0QmVhbkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlSW1wbCA8ZW0+V1NETCBTZXJ2aWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdTRExTZXJ2aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfU0VSVklDRSA9IGVJTlNUQU5DRS5nZXRXU0RMU2VydmljZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckNoYWluSW1wbCA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlckNoYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEhBTkRMRVJfQ0hBSU4gPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlckNoYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOID0gZUlOU1RBTkNFLmdldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZSBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSEFORExFUl9DSEFJTl9fSEFORExFUlMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlckNoYWluX0hhbmRsZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyc0NoYWluc0ltcGwgPGVtPkhhbmRsZXJzIENoYWluczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJzQ2hhaW5zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRIYW5kbGVyc0NoYWlucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBIQU5ETEVSU19DSEFJTlMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcnNDaGFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTiA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKTsKLQotCX0KLQotfSAvL1dzZGRQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQwOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZFJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UKLXsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQl9TRVJWSUNFX1RZUEUgPSA2OwotCi0JLyoqCi0JICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG1vZGVsIG9iamVjdCBXZWJTZXJ2aWNlcwotCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgV2ViU2VydmljZXMgCi0JICovCi0JV2ViU2VydmljZXMgZ2V0V2ViU2VydmljZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlNlcnZpY2UgaXMgb2YgdmVyc2lvbiAxLjAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzAoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlNlcnZpY2UgaXMgb2YgdmVyc2lvbiAxLjEKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzEoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlNlcnZpY2UgaXMgb2YgdmVyc2lvbiAxLjIKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzIoKTsKLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0JlYW5MaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGNiODU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0JlYW5MaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CZWFuIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTGlua0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBCZWFuTGluawotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEJlYW5MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuQkVBTl9MSU5LOwotCX0KLQotfSAvL0JlYW5MaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvRUpCTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0VKQkxpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjViMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvRUpCTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkVKQkxpbmtJbXBsI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTGlua0ltcGwgZXh0ZW5kcyBCZWFuTGlua0ltcGwgaW1wbGVtZW50cyBFSkJMaW5rCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVqYkxpbmsgPSBFSkJfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVKQkxpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5FSkJfTElOSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWpiTGluaygpIHsKLQkJcmV0dXJuIGVqYkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRFamJMaW5rKFN0cmluZyBuZXdFamJMaW5rKSB7Ci0JCVN0cmluZyBvbGRFamJMaW5rID0gZWpiTGluazsKLQkJZWpiTGluayA9IG5ld0VqYkxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSywgb2xkRWpiTGluaywgZWpiTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXJldHVybiBnZXRFamJMaW5rKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoRUpCX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTks6Ci0JCQkJcmV0dXJuIEVKQl9MSU5LX0VERUZBVUxUID09IG51bGwgPyBlamJMaW5rICE9IG51bGwgOiAhRUpCX0xJTktfRURFRkFVTFQuZXF1YWxzKGVqYkxpbmspOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJMaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlamJMaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRUpCTGlua0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJDaGFpbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJDaGFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NzQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyQ2hhaW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBIYW5kbGVyQ2hhaW5JbXBsLmphdmEsdiAxLjEgMjAwNy8xMi8xMiAyMjo1NzoxMyBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhhbmRsZXIgQ2hhaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwjZ2V0U2VydmljZU5hbWVQYXR0ZXJuIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckNoYWluSW1wbCNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyQ2hhaW5JbXBsI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyQ2hhaW5JbXBsI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBIYW5kbGVyQ2hhaW4gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkgPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZU5hbWVQYXR0ZXJuID0gU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkgPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lUGF0dGVybigpIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lUGF0dGVybiA9IFBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJvdG9jb2xCaW5kaW5nczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJzKCkgPGVtPkhhbmRsZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlcnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSGFuZGxlckNoYWluSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLkhBTkRMRVJfQ0hBSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWVQYXR0ZXJuKFN0cmluZyBuZXdTZXJ2aWNlTmFtZVBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VOYW1lUGF0dGVybiA9IHNlcnZpY2VOYW1lUGF0dGVybjsKLQkJc2VydmljZU5hbWVQYXR0ZXJuID0gbmV3U2VydmljZU5hbWVQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTiwgb2xkU2VydmljZU5hbWVQYXR0ZXJuLCBzZXJ2aWNlTmFtZVBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIHBvcnROYW1lUGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZVBhdHRlcm4oU3RyaW5nIG5ld1BvcnROYW1lUGF0dGVybikgewotCQlTdHJpbmcgb2xkUG9ydE5hbWVQYXR0ZXJuID0gcG9ydE5hbWVQYXR0ZXJuOwotCQlwb3J0TmFtZVBhdHRlcm4gPSBuZXdQb3J0TmFtZVBhdHRlcm47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOLCBvbGRQb3J0TmFtZVBhdHRlcm4sIHBvcnROYW1lUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm90b2NvbEJpbmRpbmdzKCkgewotCQlpZiAocHJvdG9jb2xCaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQlwcm90b2NvbEJpbmRpbmdzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1MpOwotCQl9Ci0JCXJldHVybiBwcm90b2NvbEJpbmRpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRIYW5kbGVycygpIHsKLQkJaWYgKGhhbmRsZXJzID09IG51bGwpIHsKLQkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEhhbmRsZXIuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZVBhdHRlcm4oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJcmV0dXJuIGdldFByb3RvY29sQmluZGluZ3MoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0U2VydmljZU5hbWVQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0UG9ydE5hbWVQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJZ2V0UHJvdG9jb2xCaW5kaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvdG9jb2xCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXNldFNlcnZpY2VOYW1lUGF0dGVybihTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlzZXRQb3J0TmFtZVBhdHRlcm4oUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJZ2V0UHJvdG9jb2xCaW5kaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZU5hbWVQYXR0ZXJuICE9IG51bGwgOiAhU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VOYW1lUGF0dGVybik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gcG9ydE5hbWVQYXR0ZXJuICE9IG51bGwgOiAhUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHBvcnROYW1lUGF0dGVybik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCXJldHVybiBwcm90b2NvbEJpbmRpbmdzICE9IG51bGwgJiYgIXByb3RvY29sQmluZGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gaGFuZGxlcnMgIT0gbnVsbCAmJiAhaGFuZGxlcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmljZU5hbWVQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlTmFtZVBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWVQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm90b2NvbEJpbmRpbmdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm90b2NvbEJpbmRpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSGFuZGxlckNoYWluSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGQ5NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEhhbmRsZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJOYW1lID0gSEFORExFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDbGFzcygpIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlckNsYXNzID0gSEFORExFUl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbXMoKSA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBIZWFkZXJzKCkgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcEhlYWRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3Qgc29hcEhlYWRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZXMoKSA8ZW0+U29hcCBSb2xlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHNvYXBSb2xlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEhhbmRsZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5IQU5ETEVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIGhhbmRsZXJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIG5ld0hhbmRsZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRIYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotCQloYW5kbGVyTmFtZSA9IG5ld0hhbmRsZXJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUsIG9sZEhhbmRsZXJOYW1lLCBoYW5kbGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIG5ld0hhbmRsZXJDbGFzcykgewotCQlTdHJpbmcgb2xkSGFuZGxlckNsYXNzID0gaGFuZGxlckNsYXNzOwotCQloYW5kbGVyQ2xhc3MgPSBuZXdIYW5kbGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MsIG9sZEhhbmRsZXJDbGFzcywgaGFuZGxlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKLQkJaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNPQVBIZWFkZXIuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyk7Ci0JCX0KLQkJcmV0dXJuIHNvYXBIZWFkZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFNvYXBSb2xlcygpIHsKLQkJaWYgKHNvYXBSb2xlcyA9PSBudWxsKSB7Ci0JCQlzb2FwUm9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU09BUFJvbGUuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzb2FwUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTb2FwSGVhZGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTb2FwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlck5hbWUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlckNsYXNzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlyZXR1cm4gZ2V0U29hcEhlYWRlcnMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U29hcFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKEhBTkRMRVJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXNldEhhbmRsZXJDbGFzcyhIQU5ETEVSX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCWdldFNvYXBIZWFkZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBIQU5ETEVSX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJOYW1lICE9IG51bGwgOiAhSEFORExFUl9OQU1FX0VERUZBVUxULmVxdWFscyhoYW5kbGVyTmFtZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJDbGFzcyAhPSBudWxsIDogIUhBTkRMRVJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGhhbmRsZXJDbGFzcyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIHNvYXBIZWFkZXJzICE9IG51bGwgJiYgIXNvYXBIZWFkZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gc29hcFJvbGVzICE9IG51bGwgJiYgIXNvYXBSb2xlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFuZGxlckNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9IYW5kbGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyc0NoYWluc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxNzRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyc0NoYWluc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEhhbmRsZXJzQ2hhaW5zSW1wbC5qYXZhLHYgMS4xIDIwMDcvMTIvMTIgMjI6NTc6MTMgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcnMgQ2hhaW5zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyc0NoYWluc0ltcGwjZ2V0SGFuZGxlckNoYWluIDxlbT5IYW5kbGVyIENoYWluPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlcnNDaGFpbnNJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSGFuZGxlcnNDaGFpbnMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDaGFpbigpIDxlbT5IYW5kbGVyIENoYWluPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJDaGFpbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVyc0NoYWluc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5IQU5ETEVSU19DSEFJTlM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEhhbmRsZXJDaGFpbigpIHsKLQkJaWYgKGhhbmRsZXJDaGFpbiA9PSBudWxsKSB7Ci0JCQloYW5kbGVyQ2hhaW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSGFuZGxlckNoYWluLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU4pOwotCQl9Ci0JCXJldHVybiBoYW5kbGVyQ2hhaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU46Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVyQ2hhaW4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTjoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlckNoYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOOgotCQkJCWdldEhhbmRsZXJDaGFpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlckNoYWluKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU46Ci0JCQkJZ2V0SGFuZGxlckNoYWluKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOOgotCQkJCXJldHVybiBoYW5kbGVyQ2hhaW4gIT0gbnVsbCAmJiAhaGFuZGxlckNoYWluLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vSGFuZGxlcnNDaGFpbnNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxNGI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWluczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRXc2RsU2VydmljZSA8ZW0+V3NkbCBTZXJ2aWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRQcm90b2NvbEJpbmRpbmcgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudEltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0Q29tcG9uZW50Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnROYW1lKCkgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfQ09NUE9ORU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydENvbXBvbmVudE5hbWUoKSA8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwb3J0Q29tcG9uZW50TmFtZSA9IFBPUlRfQ09NUE9ORU5UX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNtYWxsSWNvbiA9IFNNQUxMX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsYXJnZUljb24gPSBMQVJHRV9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxQb3J0KCkgPGVtPldzZGwgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExQb3J0IHdzZGxQb3J0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUltcGxCZWFuKCkgPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVycygpIDxlbT5IYW5kbGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblR5cGUoKSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb25UeXBlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVUeXBlKCkgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZVR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29uVHlwZSgpIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBJY29uVHlwZSBpY29uVHlwZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxTZXJ2aWNlKCkgPGVtPldzZGwgU2VydmljZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFNlcnZpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMU2VydmljZSB3c2RsU2VydmljZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZU10b20oKSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRV9NVE9NX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZU10b20oKSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTXRvbSA9IEVOQUJMRV9NVE9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sQmluZGluZygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0JJTkRJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2xCaW5kaW5nKCkgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3RvY29sQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbEJpbmRpbmcgPSBQUk9UT0NPTF9CSU5ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlckNoYWlucygpIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJzQ2hhaW5zIGhhbmRsZXJDaGFpbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBQb3J0Q29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9DT01QT05FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0Q29tcG9uZW50TmFtZShTdHJpbmcgbmV3UG9ydENvbXBvbmVudE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnRDb21wb25lbnROYW1lID0gcG9ydENvbXBvbmVudE5hbWU7Ci0JCXBvcnRDb21wb25lbnROYW1lID0gbmV3UG9ydENvbXBvbmVudE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FLCBvbGRQb3J0Q29tcG9uZW50TmFtZSwgcG9ydENvbXBvbmVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCVN0cmluZyBvbGRTbWFsbEljb24gPSBzbWFsbEljb247Ci0JCXNtYWxsSWNvbiA9IG5ld1NtYWxsSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCVN0cmluZyBvbGRMYXJnZUljb24gPSBsYXJnZUljb247Ci0JCWxhcmdlSWNvbiA9IG5ld0xhcmdlSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JCWRpc3BsYXlOYW1lID0gbmV3RGlzcGxheU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExQb3J0IGdldFdzZGxQb3J0KCkgewotCQlyZXR1cm4gd3NkbFBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsUG9ydChXU0RMUG9ydCBuZXdXc2RsUG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMUG9ydCBvbGRXc2RsUG9ydCA9IHdzZGxQb3J0OwotCQl3c2RsUG9ydCA9IG5ld1dzZGxQb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JULCBvbGRXc2RsUG9ydCwgbmV3V3NkbFBvcnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFBvcnQoV1NETFBvcnQgbmV3V3NkbFBvcnQpIHsKLQkJaWYgKG5ld1dzZGxQb3J0ICE9IHdzZGxQb3J0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsUG9ydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsUG9ydCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxQb3J0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUG9ydChuZXdXc2RsUG9ydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JULCBuZXdXc2RsUG9ydCwgbmV3V3NkbFBvcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlSW1wbEJlYW4gZ2V0U2VydmljZUltcGxCZWFuKCkgewotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VydmljZUltcGxCZWFuKFNlcnZpY2VJbXBsQmVhbiBuZXdTZXJ2aWNlSW1wbEJlYW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VydmljZUltcGxCZWFuIG9sZFNlcnZpY2VJbXBsQmVhbiA9IHNlcnZpY2VJbXBsQmVhbjsKLQkJc2VydmljZUltcGxCZWFuID0gbmV3U2VydmljZUltcGxCZWFuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4sIG9sZFNlcnZpY2VJbXBsQmVhbiwgbmV3U2VydmljZUltcGxCZWFuKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4gbmV3U2VydmljZUltcGxCZWFuKSB7Ci0JCWlmIChuZXdTZXJ2aWNlSW1wbEJlYW4gIT0gc2VydmljZUltcGxCZWFuKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUltcGxCZWFuKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VydmljZUltcGxCZWFuKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcnZpY2VJbXBsQmVhbihuZXdTZXJ2aWNlSW1wbEJlYW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBuZXdTZXJ2aWNlSW1wbEJlYW4sIG5ld1NlcnZpY2VJbXBsQmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEhhbmRsZXJzKCkgewotCQlpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotCQkJaGFuZGxlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSGFuZGxlci5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGVzY3JpcHRpb25UeXBlIGdldERlc2NyaXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURlc2NyaXB0aW9uVHlwZSBvbGREZXNjcmlwdGlvblR5cGUgPSBkZXNjcmlwdGlvblR5cGU7Ci0JCWRlc2NyaXB0aW9uVHlwZSA9IG5ld0Rlc2NyaXB0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUsIG9sZERlc2NyaXB0aW9uVHlwZSwgbmV3RGVzY3JpcHRpb25UeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlKSB7Ci0JCWlmIChuZXdEZXNjcmlwdGlvblR5cGUgIT0gZGVzY3JpcHRpb25UeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZXNjcmlwdGlvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzY3JpcHRpb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rlc2NyaXB0aW9uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNjcmlwdGlvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUobmV3RGVzY3JpcHRpb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFLCBuZXdEZXNjcmlwdGlvblR5cGUsIG5ld0Rlc2NyaXB0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERpc3BsYXlOYW1lVHlwZSBnZXREaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG5ld0Rpc3BsYXlOYW1lVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaXNwbGF5TmFtZVR5cGUgb2xkRGlzcGxheU5hbWVUeXBlID0gZGlzcGxheU5hbWVUeXBlOwotCQlkaXNwbGF5TmFtZVR5cGUgPSBuZXdEaXNwbGF5TmFtZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSwgb2xkRGlzcGxheU5hbWVUeXBlLCBuZXdEaXNwbGF5TmFtZVR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBuZXdEaXNwbGF5TmFtZVR5cGUpIHsKLQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBkaXNwbGF5TmFtZVR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKG5ld0Rpc3BsYXlOYW1lVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG5ld0Rpc3BsYXlOYW1lVHlwZSwgbmV3RGlzcGxheU5hbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSWNvblR5cGUgZ2V0SWNvblR5cGUoKSB7Ci0JCXJldHVybiBpY29uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEljb25UeXBlKEljb25UeXBlIG5ld0ljb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUljb25UeXBlIG9sZEljb25UeXBlID0gaWNvblR5cGU7Ci0JCWljb25UeXBlID0gbmV3SWNvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUsIG9sZEljb25UeXBlLCBuZXdJY29uVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSBuZXdJY29uVHlwZSkgewotCQlpZiAobmV3SWNvblR5cGUgIT0gaWNvblR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGljb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWljb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWNvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWNvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEljb25UeXBlKG5ld0ljb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUsIG5ld0ljb25UeXBlLCBuZXdJY29uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMU2VydmljZSBnZXRXc2RsU2VydmljZSgpIHsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxTZXJ2aWNlKFdTRExTZXJ2aWNlIG5ld1dzZGxTZXJ2aWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExTZXJ2aWNlIG9sZFdzZGxTZXJ2aWNlID0gd3NkbFNlcnZpY2U7Ci0JCXdzZGxTZXJ2aWNlID0gbmV3V3NkbFNlcnZpY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UsIG9sZFdzZGxTZXJ2aWNlLCBuZXdXc2RsU2VydmljZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2UoV1NETFNlcnZpY2UgbmV3V3NkbFNlcnZpY2UpIHsKLQkJaWYgKG5ld1dzZGxTZXJ2aWNlICE9IHdzZGxTZXJ2aWNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsU2VydmljZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsU2VydmljZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxTZXJ2aWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxTZXJ2aWNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsU2VydmljZShuZXdXc2RsU2VydmljZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFLCBuZXdXc2RsU2VydmljZSwgbmV3V3NkbFNlcnZpY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZU10b20oKSB7Ci0JCXJldHVybiBlbmFibGVNdG9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZU10b20oYm9vbGVhbiBuZXdFbmFibGVNdG9tKSB7Ci0JCWJvb2xlYW4gb2xkRW5hYmxlTXRvbSA9IGVuYWJsZU10b207Ci0JCWVuYWJsZU10b20gPSBuZXdFbmFibGVNdG9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT00sIG9sZEVuYWJsZU10b20sIGVuYWJsZU10b20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sQmluZGluZygpIHsKLQkJcmV0dXJuIHByb3RvY29sQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEJpbmRpbmcoU3RyaW5nIG5ld1Byb3RvY29sQmluZGluZykgewotCQlTdHJpbmcgb2xkUHJvdG9jb2xCaW5kaW5nID0gcHJvdG9jb2xCaW5kaW5nOwotCQlwcm90b2NvbEJpbmRpbmcgPSBuZXdQcm90b2NvbEJpbmRpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QUk9UT0NPTF9CSU5ESU5HLCBvbGRQcm90b2NvbEJpbmRpbmcsIHByb3RvY29sQmluZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIYW5kbGVyc0NoYWlucyBnZXRIYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gaGFuZGxlckNoYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKEhhbmRsZXJzQ2hhaW5zIG5ld0hhbmRsZXJDaGFpbnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSGFuZGxlcnNDaGFpbnMgb2xkSGFuZGxlckNoYWlucyA9IGhhbmRsZXJDaGFpbnM7Ci0JCWhhbmRsZXJDaGFpbnMgPSBuZXdIYW5kbGVyQ2hhaW5zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMsIG9sZEhhbmRsZXJDaGFpbnMsIG5ld0hhbmRsZXJDaGFpbnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbnMoSGFuZGxlcnNDaGFpbnMgbmV3SGFuZGxlckNoYWlucykgewotCQlpZiAobmV3SGFuZGxlckNoYWlucyAhPSBoYW5kbGVyQ2hhaW5zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChoYW5kbGVyQ2hhaW5zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWhhbmRsZXJDaGFpbnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhbmRsZXJDaGFpbnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFuZGxlckNoYWlucykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKG5ld0hhbmRsZXJDaGFpbnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TLCBuZXdIYW5kbGVyQ2hhaW5zLCBuZXdIYW5kbGVyQ2hhaW5zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxQb3J0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VydmljZUltcGxCZWFuKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJY29uVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsU2VydmljZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBiYXNpY1NldEhhbmRsZXJDaGFpbnMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBvcnRDb21wb25lbnROYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJcmV0dXJuIGdldFdzZGxQb3J0KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUltcGxCZWFuKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlcnMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVHlwZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lVHlwZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFOgotCQkJCXJldHVybiBnZXRJY29uVHlwZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFOgotCQkJCXJldHVybiBnZXRXc2RsU2VydmljZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT006Ci0JCQkJcmV0dXJuIGlzRW5hYmxlTXRvbSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkc6Ci0JCQkJcmV0dXJuIGdldFByb3RvY29sQmluZGluZygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDaGFpbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRToKLQkJCQlzZXRQb3J0Q29tcG9uZW50TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVDoKLQkJCQlzZXRXc2RsUG9ydCgoV1NETFBvcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXNldFNlcnZpY2VJbXBsQmVhbigoU2VydmljZUltcGxCZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJc2V0RGVzY3JpcHRpb25UeXBlKChEZXNjcmlwdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXNldERpc3BsYXlOYW1lVHlwZSgoRGlzcGxheU5hbWVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEU6Ci0JCQkJc2V0SWNvblR5cGUoKEljb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0U6Ci0JCQkJc2V0V3NkbFNlcnZpY2UoKFdTRExTZXJ2aWNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTToKLQkJCQlzZXRFbmFibGVNdG9tKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkc6Ci0JCQkJc2V0UHJvdG9jb2xCaW5kaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXNldEhhbmRsZXJDaGFpbnMoKEhhbmRsZXJzQ2hhaW5zKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRToKLQkJCQlzZXRQb3J0Q29tcG9uZW50TmFtZShQT1JUX0NPTVBPTkVOVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJc2V0V3NkbFBvcnQoKFdTRExQb3J0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXNldFNlcnZpY2VJbXBsQmVhbigoU2VydmljZUltcGxCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXNldERlc2NyaXB0aW9uVHlwZSgoRGVzY3JpcHRpb25UeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXNldERpc3BsYXlOYW1lVHlwZSgoRGlzcGxheU5hbWVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlzZXRJY29uVHlwZSgoSWNvblR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFOgotCQkJCXNldFdzZGxTZXJ2aWNlKChXU0RMU2VydmljZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTToKLQkJCQlzZXRFbmFibGVNdG9tKEVOQUJMRV9NVE9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QUk9UT0NPTF9CSU5ESU5HOgotCQkJCXNldFByb3RvY29sQmluZGluZyhQUk9UT0NPTF9CSU5ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlzZXRIYW5kbGVyQ2hhaW5zKChIYW5kbGVyc0NoYWlucyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIFBPUlRfQ09NUE9ORU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnRDb21wb25lbnROYW1lICE9IG51bGwgOiAhUE9SVF9DT01QT05FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydENvbXBvbmVudE5hbWUpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVDoKLQkJCQlyZXR1cm4gd3NkbFBvcnQgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXJldHVybiBzZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCXJldHVybiBoYW5kbGVycyAhPSBudWxsICYmICFoYW5kbGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBkZXNjcmlwdGlvblR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gaWNvblR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRToKLQkJCQlyZXR1cm4gd3NkbFNlcnZpY2UgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0VOQUJMRV9NVE9NOgotCQkJCXJldHVybiBlbmFibGVNdG9tICE9IEVOQUJMRV9NVE9NX0VERUZBVUxUOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORzoKLQkJCQlyZXR1cm4gUFJPVE9DT0xfQklORElOR19FREVGQVVMVCA9PSBudWxsID8gcHJvdG9jb2xCaW5kaW5nICE9IG51bGwgOiAhUFJPVE9DT0xfQklORElOR19FREVGQVVMVC5lcXVhbHMocHJvdG9jb2xCaW5kaW5nKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBoYW5kbGVyQ2hhaW5zICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBvcnRDb21wb25lbnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3J0Q29tcG9uZW50TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNtYWxsSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhcmdlSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNwbGF5TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzcGxheU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVuYWJsZU10b206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVuYWJsZU10b20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sQmluZGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvdG9jb2xCaW5kaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9ydENvbXBvbmVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsQmVhbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsQmVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5YjljMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEltcGwgQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCNnZXRFRUpCTGluayA8ZW0+RUVKQiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsI2dldEVTZXJ2bGV0TGluayA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCNnZXRCZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUltcGxCZWFuSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VJbXBsQmVhbgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVFSkJMaW5rKCkgPGVtPkVFSkIgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVFSkJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVKQkxpbmsgZUVKQkxpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2VydmxldExpbmsoKSA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2bGV0TGluayBlU2VydmxldExpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuTGluaygpIDxlbT5CZWFuIExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCZWFuTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBCZWFuTGluayBiZWFuTGluazsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsQmVhbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfSU1QTF9CRUFOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVKQkxpbmsgZ2V0RUVKQkxpbmsoKSB7Ci0JCXJldHVybiBlRUpCTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVFSkJMaW5rKEVKQkxpbmsgbmV3RUVKQkxpbmssIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRUpCTGluayBvbGRFRUpCTGluayA9IGVFSkJMaW5rOwotCQllRUpCTGluayA9IG5ld0VFSkJMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LLCBvbGRFRUpCTGluaywgbmV3RUVKQkxpbmspOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RUVKQkxpbmsoRUpCTGluayBuZXdFRUpCTGluaykgewotCQlpZiAobmV3RUVKQkxpbmsgIT0gZUVKQkxpbmspIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVFSkJMaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVFSkJMaW5rKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RUVKQkxpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUVKQkxpbmspLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVFSkJMaW5rKG5ld0VFSkJMaW5rLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTkssIG5ld0VFSkJMaW5rLCBuZXdFRUpCTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZsZXRMaW5rIGdldEVTZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIGVTZXJ2bGV0TGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVTZXJ2bGV0TGluayhTZXJ2bGV0TGluayBuZXdFU2VydmxldExpbmssIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VydmxldExpbmsgb2xkRVNlcnZsZXRMaW5rID0gZVNlcnZsZXRMaW5rOwotCQllU2VydmxldExpbmsgPSBuZXdFU2VydmxldExpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LLCBvbGRFU2VydmxldExpbmssIG5ld0VTZXJ2bGV0TGluayk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRFU2VydmxldExpbmsoU2VydmxldExpbmsgbmV3RVNlcnZsZXRMaW5rKSB7Ci0JCWlmIChuZXdFU2VydmxldExpbmsgIT0gZVNlcnZsZXRMaW5rKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlU2VydmxldExpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZVNlcnZsZXRMaW5rKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VTZXJ2bGV0TGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFU2VydmxldExpbmspLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFU2VydmxldExpbmsobmV3RVNlcnZsZXRMaW5rLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LLCBuZXdFU2VydmxldExpbmssIG5ld0VTZXJ2bGV0TGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEJlYW5MaW5rIGdldEJlYW5MaW5rKCkgewotCQlyZXR1cm4gYmVhbkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCZWFuTGluayhCZWFuTGluayBuZXdCZWFuTGluaywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlCZWFuTGluayBvbGRCZWFuTGluayA9IGJlYW5MaW5rOwotCQliZWFuTGluayA9IG5ld0JlYW5MaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LLCBvbGRCZWFuTGluaywgbmV3QmVhbkxpbmspOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0QmVhbkxpbmsoQmVhbkxpbmsgbmV3QmVhbkxpbmspIHsKLQkJaWYgKG5ld0JlYW5MaW5rICE9IGJlYW5MaW5rKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiZWFuTGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliZWFuTGluaykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JlYW5MaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JlYW5MaW5rKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuTGluayhuZXdCZWFuTGluaywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LLCBuZXdCZWFuTGluaywgbmV3QmVhbkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTks6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RUVKQkxpbmsobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LOgotCQkJCXJldHVybiBiYXNpY1NldEVTZXJ2bGV0TGluayhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCZWFuTGluayhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXJldHVybiBnZXRFRUpCTGluaygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gZ2V0RVNlcnZsZXRMaW5rKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJcmV0dXJuIGdldEJlYW5MaW5rKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlzZXRFRUpCTGluaygoRUpCTGluayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQlzZXRFU2VydmxldExpbmsoKFNlcnZsZXRMaW5rKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJc2V0QmVhbkxpbmsoKEJlYW5MaW5rKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXNldEVFSkJMaW5rKChFSkJMaW5rKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTks6Ci0JCQkJc2V0RVNlcnZsZXRMaW5rKChTZXJ2bGV0TGluayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJc2V0QmVhbkxpbmsoKEJlYW5MaW5rKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXJldHVybiBlRUpCTGluayAhPSBudWxsOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gZVNlcnZsZXRMaW5rICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJcmV0dXJuIGJlYW5MaW5rICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1NlcnZpY2VJbXBsQmVhbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmxldExpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTk1YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmxldExpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZsZXRMaW5rSW1wbCNnZXRTZXJ2bGV0TGluayA8ZW0+U2VydmxldCBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldExpbmtJbXBsIGV4dGVuZHMgQmVhbkxpbmtJbXBsIGltcGxlbWVudHMgU2VydmxldExpbmsKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldExpbmsoKSA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldExpbmsoKSA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXRMaW5rID0gU0VSVkxFVF9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmxldExpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX0xJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRMaW5rKCkgewotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0TGluayhTdHJpbmcgbmV3U2VydmxldExpbmspIHsKLQkJU3RyaW5nIG9sZFNlcnZsZXRMaW5rID0gc2VydmxldExpbms7Ci0JCXNlcnZsZXRMaW5rID0gbmV3U2VydmxldExpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LLCBvbGRTZXJ2bGV0TGluaywgc2VydmxldExpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0TGluaygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LOgotCQkJCXNldFNlcnZsZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LOgotCQkJCXNldFNlcnZsZXRMaW5rKFNFUlZMRVRfTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LOgotCQkJCXJldHVybiBTRVJWTEVUX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZsZXRMaW5rICE9IG51bGwgOiAhU0VSVkxFVF9MSU5LX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0TGluayk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXRMaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2bGV0TGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZsZXRMaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFBvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMGE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBQb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETFBvcnQKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLldTRExfUE9SVDsKLQl9Ci0KLX0gLy9XU0RMUG9ydEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYzgwNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdTRExTZXJ2aWNlSW1wbC5qYXZhLHYgMS4xIDIwMDcvMTIvMTIgMjI6NTc6MTMgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBTZXJ2aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMU2VydmljZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5XU0RMX1NFUlZJQ0U7Ci0JfQotCi19IC8vV1NETFNlcnZpY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDIzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0UG9ydENvbXBvbmVudHMgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VEZXNjcmlwdGlvbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpheHJwY01hcHBpbmdGaWxlKCkgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgamF4cnBjTWFwcGluZ0ZpbGUgPSBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZSA9IFdTRExfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNtYWxsSWNvbiA9IFNNQUxMX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsYXJnZUljb24gPSBMQVJHRV9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRzKCkgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblR5cGUoKSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb25UeXBlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVUeXBlKCkgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZVR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29uVHlwZSgpIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBJY29uVHlwZSBpY29uVHlwZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXhycGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIGpheHJwY01hcHBpbmdGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIG5ld0pheHJwY01hcHBpbmdGaWxlKSB7Ci0JCVN0cmluZyBvbGRKYXhycGNNYXBwaW5nRmlsZSA9IGpheHJwY01hcHBpbmdGaWxlOwotCQlqYXhycGNNYXBwaW5nRmlsZSA9IG5ld0pheHJwY01hcHBpbmdGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSwgb2xkSmF4cnBjTWFwcGluZ0ZpbGUsIGpheHJwY01hcHBpbmdGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZShTdHJpbmcgbmV3V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWU7Ci0JCXdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPSBuZXdXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSwgb2xkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSwgd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsRmlsZSgpIHsKLQkJcmV0dXJuIHdzZGxGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIG5ld1dzZGxGaWxlKSB7Ci0JCVN0cmluZyBvbGRXc2RsRmlsZSA9IHdzZGxGaWxlOwotCQl3c2RsRmlsZSA9IG5ld1dzZGxGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFLCBvbGRXc2RsRmlsZSwgd3NkbEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uR2VuKCkgewotCQlyZXR1cm4gc21hbGxJY29uOwotCX0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLSAgCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotICAJCXJldHVybiBnZXRTbWFsbEljb25HZW4oKTsKLSAgCQotICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0gIAkJcmV0dXJuIGdldFNtYWxsSWNvbkdlbigpOyAKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotICAJZGVmYXVsdCA6Ci0gIAkJaWYgKGdldEljb25UeXBlKCkgIT0gbnVsbCkKLSAgCQkJcmV0dXJuIGdldEljb25UeXBlKCkuZ2V0U21hbGxJY29uKCk7Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTbWFsbEljb25HZW4oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlTdHJpbmcgb2xkU21hbGxJY29uID0gc21hbGxJY29uOwotCQlzbWFsbEljb24gPSBuZXdTbWFsbEljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OLCBvbGRTbWFsbEljb24sIHNtYWxsSWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYXJnZUljb25HZW4oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotICAJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0gIAkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOwotICAJCi0gIAlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLSAgCQlyZXR1cm4gZ2V0TGFyZ2VJY29uR2VuKCk7IAotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0gIAlkZWZhdWx0IDoKLSAgCQlpZiAoZ2V0SWNvblR5cGUoKSAhPSBudWxsKQotICAJCQlyZXR1cm4gZ2V0SWNvblR5cGUoKS5nZXRMYXJnZUljb24oKTsKLSAgCX0KLSAgCXJldHVybiBudWxsOwotICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbkdlbihTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCVN0cmluZyBvbGRMYXJnZUljb24gPSBsYXJnZUljb247Ci0JCWxhcmdlSWNvbiA9IG5ld0xhcmdlSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0SjJFRVZlcnNpb25JRCgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotICAJaWYgKHJlcyA9PSBudWxsKQotICAJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwotICB9Ci0gIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbkdlbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsgCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDoKLQkJCWlmIChnZXREZXNjcmlwdGlvblR5cGUoKSAhPSBudWxsKQotCQkJCXJldHVybiAoKERlc2NyaXB0aW9uKWdldERlc2NyaXB0aW9uVHlwZSgpKS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25HZW4oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLSAgCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLSAgCQlzZXREZXNjcmlwdGlvbkdlbihuZXdEZXNjcmlwdGlvbik7Ci0gIAkJaW50ZXJuYWxTZXREZXNjcmlwdGlvblR5cGUobmV3RGVzY3JpcHRpb24pOwotICAJCXJldHVybjsKLSAgCX0KLSAgCQotICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0gIAkJc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotICAJCWJyZWFrOwotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0gIAlkZWZhdWx0IDoKLSAgCQlpbnRlcm5hbFNldERlc2NyaXB0aW9uVHlwZShuZXdEZXNjcmlwdGlvbik7IAotICAJCWJyZWFrOwotICAJfQotICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWVHZW4oKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZTsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotICAJCXJldHVybiBnZXREaXNwbGF5TmFtZUdlbigpOwotICAJCi0gIAlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLSAgCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVHZW4oKTsgCi0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLSAgCWRlZmF1bHQgOgotICAJCWlmIChnZXREaXNwbGF5TmFtZVR5cGUoKSAhPSBudWxsKQotICAJCQlyZXR1cm4gKChEaXNwbGF5TmFtZSlnZXREaXNwbGF5TmFtZVR5cGUoKSkuZ2V0VmFsdWUoKTsKLSAgCX0KLSAgCXJldHVybiBudWxsOwotICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lR2VuKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlTdHJpbmcgb2xkRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJZGlzcGxheU5hbWUgPSBuZXdEaXNwbGF5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRSwgb2xkRGlzcGxheU5hbWUsIGRpc3BsYXlOYW1lKSk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotICAJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotICAJCXNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLSAgCQlpbnRlcm5hbFNldERpc3BsYXlOYW1lVHlwZShuZXdEaXNwbGF5TmFtZSk7Ci0gIAkJcmV0dXJuOwotICAJfQotICAJCi0gIAlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLSAgCQlzZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0gIAkJYnJlYWs7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLSAgCWRlZmF1bHQgOgotICAJCWludGVybmFsU2V0RGlzcGxheU5hbWVUeXBlKG5ld0Rpc3BsYXlOYW1lKTsKLSAgCQlicmVhazsKLSAgCX0KLSAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0UG9ydENvbXBvbmVudHMoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50cyA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0Q29tcG9uZW50LmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTKTsKLQkJfQotCQlyZXR1cm4gcG9ydENvbXBvbmVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGVzY3JpcHRpb25UeXBlIGdldERlc2NyaXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURlc2NyaXB0aW9uVHlwZSBvbGREZXNjcmlwdGlvblR5cGUgPSBkZXNjcmlwdGlvblR5cGU7Ci0JCWRlc2NyaXB0aW9uVHlwZSA9IG5ld0Rlc2NyaXB0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUsIG9sZERlc2NyaXB0aW9uVHlwZSwgbmV3RGVzY3JpcHRpb25UeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlKSB7Ci0JCWlmIChuZXdEZXNjcmlwdGlvblR5cGUgIT0gZGVzY3JpcHRpb25UeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZXNjcmlwdGlvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzY3JpcHRpb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rlc2NyaXB0aW9uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNjcmlwdGlvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUobmV3RGVzY3JpcHRpb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFLCBuZXdEZXNjcmlwdGlvblR5cGUsIG5ld0Rlc2NyaXB0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERpc3BsYXlOYW1lVHlwZSBnZXREaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG5ld0Rpc3BsYXlOYW1lVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaXNwbGF5TmFtZVR5cGUgb2xkRGlzcGxheU5hbWVUeXBlID0gZGlzcGxheU5hbWVUeXBlOwotCQlkaXNwbGF5TmFtZVR5cGUgPSBuZXdEaXNwbGF5TmFtZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSwgb2xkRGlzcGxheU5hbWVUeXBlLCBuZXdEaXNwbGF5TmFtZVR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBuZXdEaXNwbGF5TmFtZVR5cGUpIHsKLQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBkaXNwbGF5TmFtZVR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKG5ld0Rpc3BsYXlOYW1lVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUsIG5ld0Rpc3BsYXlOYW1lVHlwZSwgbmV3RGlzcGxheU5hbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSWNvblR5cGUgZ2V0SWNvblR5cGUoKSB7Ci0JCXJldHVybiBpY29uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEljb25UeXBlKEljb25UeXBlIG5ld0ljb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUljb25UeXBlIG9sZEljb25UeXBlID0gaWNvblR5cGU7Ci0JCWljb25UeXBlID0gbmV3SWNvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUsIG9sZEljb25UeXBlLCBuZXdJY29uVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSBuZXdJY29uVHlwZSkgewotCQlpZiAobmV3SWNvblR5cGUgIT0gaWNvblR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGljb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWljb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWNvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWNvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEljb25UeXBlKG5ld0ljb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUsIG5ld0ljb25UeXBlLCBuZXdJY29uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnRDb21wb25lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RGVzY3JpcHRpb25UeXBlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldEljb25UeXBlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBnZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFOgotCQkJCXJldHVybiBnZXRXc2RsRmlsZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50cygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEljb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRToKLQkJCQlzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTOgotCQkJCWdldFBvcnRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0Q29tcG9uZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlzZXREZXNjcmlwdGlvblR5cGUoKERlc2NyaXB0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJc2V0RGlzcGxheU5hbWVUeXBlKChEaXNwbGF5TmFtZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlzZXRJY29uVHlwZSgoSWNvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUU6Ci0JCQkJc2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZShXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoV1NETF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTOgotCQkJCWdldFBvcnRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXNldERlc2NyaXB0aW9uVHlwZSgoRGVzY3JpcHRpb25UeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXNldERpc3BsYXlOYW1lVHlwZSgoRGlzcGxheU5hbWVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlzZXRJY29uVHlwZSgoSWNvblR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBqYXhycGNNYXBwaW5nRmlsZSAhPSBudWxsIDogIUpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgIT0gbnVsbCA6ICFXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxULmVxdWFscyh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRToKLQkJCQlyZXR1cm4gV1NETF9GSUxFX0VERUZBVUxUID09IG51bGwgPyB3c2RsRmlsZSAhPSBudWxsIDogIVdTRExfRklMRV9FREVGQVVMVC5lcXVhbHMod3NkbEZpbGUpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTOgotCQkJCXJldHVybiBwb3J0Q29tcG9uZW50cyAhPSBudWxsICYmICFwb3J0Q29tcG9uZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBkZXNjcmlwdGlvblR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gaWNvblR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoamF4cnBjTWFwcGluZ0ZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbEZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNtYWxsSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhcmdlSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNwbGF5TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzcGxheU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzY3JpcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldERlc2NyaXB0aW9uVHlwZShTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJRGVzY3JpcHRpb25UeXBlIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0RGVzY3JpcHRpb25UeXBlKCkgIT0gbnVsbCkgewotCQkJbmV3VmFsdWUgPSBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld1ZhbHVlID0gV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJCXNldERlc2NyaXB0aW9uVHlwZShuZXdWYWx1ZSk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rpc3BsYXlOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXREaXNwbGF5TmFtZVR5cGUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCURpc3BsYXlOYW1lVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldERpc3BsYXlOYW1lVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEaXNwbGF5TmFtZSk7Ci0JCX0KLQkJZWxzZSAgewotCQkJbmV3VmFsdWUgPSBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0VmFsdWUobmV3RGlzcGxheU5hbWUpOwotCQkJc2V0RGlzcGxheU5hbWVUeXBlKG5ld1ZhbHVlKTsKLQkJfQkJCSAgCi0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdMYXJnZUljb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldExhcmdlSWNvblR5cGUoU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlJY29uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldEljb25UeXBlKCkgIT0gbnVsbCkgewotCQkJbmV3VmFsdWUgPSBnZXRJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRMYXJnZUljb24obmV3TGFyZ2VJY29uKTsKLQkJCXNldEljb25UeXBlKG5ld1ZhbHVlKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U21hbGxJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRTbWFsbEljb25UeXBlKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJSWNvblR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXRJY29uVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0SWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0U21hbGxJY29uKG5ld1NtYWxsSWNvbik7Ci0JCQlzZXRJY29uVHlwZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlzZXRMYXJnZUljb25HZW4obmV3TGFyZ2VJY29uKTsKLQkJCWludGVybmFsU2V0TGFyZ2VJY29uVHlwZShuZXdMYXJnZUljb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlzZXRMYXJnZUljb25HZW4obmV3TGFyZ2VJY29uKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6IAotCQkJaW50ZXJuYWxTZXRMYXJnZUljb25UeXBlKG5ld0xhcmdlSWNvbik7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlzZXRTbWFsbEljb25HZW4obmV3U21hbGxJY29uKTsKLQkJCWludGVybmFsU2V0U21hbGxJY29uVHlwZShuZXdTbWFsbEljb24pOyAKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0U21hbGxJY29uVHlwZShuZXdTbWFsbEljb24pOyAKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi19IC8vV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkNGMwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZXNJbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzSW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VzCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3Qgd2ViU2VydmljZURlc2NyaXB0aW9uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuV0VCX1NFUlZJQ0VTOwotCX0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotICAJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotICB9Ci0gIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlM6Ci0JCQkJZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlM6Ci0JCQkJZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zICE9IG51bGwgJiYgIXdlYlNlcnZpY2VEZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9XZWJTZXJ2aWNlc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWNjZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXc2RkRmFjdG9yeQotewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdzZGRGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlXc2RkRmFjdG9yeSB0aGVXc2RkRmFjdG9yeSA9IChXc2RkRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid3NkZC54bWkiKTsgCi0JCQlpZiAodGhlV3NkZEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVXc2RkRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBXc2RkRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzZGRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFUzogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OOiByZXR1cm4gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UOiByZXR1cm4gY3JlYXRlUG9ydENvbXBvbmVudCgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlQ6IHJldHVybiBjcmVhdGVXU0RMUG9ydCgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTjogcmV0dXJuIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTks6IHJldHVybiBjcmVhdGVTZXJ2bGV0TGluaygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOSzogcmV0dXJuIGNyZWF0ZUVKQkxpbmsoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUjogcmV0dXJuIGNyZWF0ZUhhbmRsZXIoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuQkVBTl9MSU5LOiByZXR1cm4gY3JlYXRlQmVhbkxpbmsoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9TRVJWSUNFOiByZXR1cm4gY3JlYXRlV1NETFNlcnZpY2UoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTjogcmV0dXJuIGNyZWF0ZUhhbmRsZXJDaGFpbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlM6IHJldHVybiBjcmVhdGVIYW5kbGVyc0NoYWlucygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV2ViU2VydmljZXMgY3JlYXRlV2ViU2VydmljZXMoKSB7Ci0JCVdlYlNlcnZpY2VzSW1wbCB3ZWJTZXJ2aWNlcyA9IG5ldyBXZWJTZXJ2aWNlc0ltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwgd2ViU2VydmljZURlc2NyaXB0aW9uID0gbmV3IFdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBQb3J0Q29tcG9uZW50IGNyZWF0ZVBvcnRDb21wb25lbnQoKSB7Ci0JCVBvcnRDb21wb25lbnRJbXBsIHBvcnRDb21wb25lbnQgPSBuZXcgUG9ydENvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFBvcnQgY3JlYXRlV1NETFBvcnQoKSB7Ci0JCVdTRExQb3J0SW1wbCB3c2RsUG9ydCA9IG5ldyBXU0RMUG9ydEltcGwoKTsKLQkJcmV0dXJuIHdzZGxQb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZpY2VJbXBsQmVhbiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbkltcGwgc2VydmljZUltcGxCZWFuID0gbmV3IFNlcnZpY2VJbXBsQmVhbkltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2bGV0TGluayBjcmVhdGVTZXJ2bGV0TGluaygpIHsKLQkJU2VydmxldExpbmtJbXBsIHNlcnZsZXRMaW5rID0gbmV3IFNlcnZsZXRMaW5rSW1wbCgpOwotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUpCTGluayBjcmVhdGVFSkJMaW5rKCkgewotCQlFSkJMaW5rSW1wbCBlamJMaW5rID0gbmV3IEVKQkxpbmtJbXBsKCk7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHsKLQkJSGFuZGxlckltcGwgaGFuZGxlciA9IG5ldyBIYW5kbGVySW1wbCgpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbkxpbmsgY3JlYXRlQmVhbkxpbmsoKSB7Ci0JCUJlYW5MaW5rSW1wbCBiZWFuTGluayA9IG5ldyBCZWFuTGlua0ltcGwoKTsKLQkJcmV0dXJuIGJlYW5MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMU2VydmljZSBjcmVhdGVXU0RMU2VydmljZSgpIHsKLQkJV1NETFNlcnZpY2VJbXBsIHdzZGxTZXJ2aWNlID0gbmV3IFdTRExTZXJ2aWNlSW1wbCgpOwotCQlyZXR1cm4gd3NkbFNlcnZpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJDaGFpbiBjcmVhdGVIYW5kbGVyQ2hhaW4oKSB7Ci0JCUhhbmRsZXJDaGFpbkltcGwgaGFuZGxlckNoYWluID0gbmV3IEhhbmRsZXJDaGFpbkltcGwoKTsKLQkJcmV0dXJuIGhhbmRsZXJDaGFpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlcnNDaGFpbnMgY3JlYXRlSGFuZGxlcnNDaGFpbnMoKSB7Ci0JCUhhbmRsZXJzQ2hhaW5zSW1wbCBoYW5kbGVyc0NoYWlucyA9IG5ldyBIYW5kbGVyc0NoYWluc0ltcGwoKTsKLQkJcmV0dXJuIGhhbmRsZXJzQ2hhaW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzZGRQYWNrYWdlIGdldFdzZGRQYWNrYWdlKCkgewotCQlyZXR1cm4gKFdzZGRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3NkZFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Xc2RkRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MGE4N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzZGRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdzZGRQYWNrYWdlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3ZWJTZXJ2aWNlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHBvcnRDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZpY2VJbXBsQmVhbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZsZXRMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgZWpiTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGhhbmRsZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBiZWFuTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3c2RsU2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBoYW5kbGVyQ2hhaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaGFuZGxlcnNDaGFpbnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIFdzZGRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFdzZGRQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChXc2RkUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgV3NkZFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVdzZGRQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVXc2RkUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V2ViU2VydmljZXMoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0VuYWJsZU10b20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMUG9ydCgpIHsKLQkJcmV0dXJuIHdzZGxQb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCXJldHVybiBzZXJ2aWNlSW1wbEJlYW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VJbXBsQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIHNlcnZsZXRMaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0TGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRFSkJMaW5rKCkgewotCQlyZXR1cm4gZWpiTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkxpbmtfRWpiTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0SGFuZGxlcigpIHsKLQkJcmV0dXJuIGhhbmRsZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEJlYW5MaW5rKCkgewotCQlyZXR1cm4gYmVhbkxpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXU0RMU2VydmljZSgpIHsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SGFuZGxlckNoYWluKCkgewotCQlyZXR1cm4gaGFuZGxlckNoYWluRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSloYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSloYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSloYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhhbmRsZXJzQ2hhaW5zKCkgewotCQlyZXR1cm4gaGFuZGxlcnNDaGFpbnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcnNDaGFpbnNfSGFuZGxlckNoYWluKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlcnNDaGFpbnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkRmFjdG9yeSBnZXRXc2RkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChXc2RkRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJd2ViU2VydmljZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1NFUlZJQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlc0VDbGFzcywgV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCi0JCXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfU0VSVklDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUpOwotCi0JCXBvcnRDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0VOQUJMRV9NVE9NKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TKTsKLQotCQl3c2RsUG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX1BPUlQpOwotCi0JCXNlcnZpY2VJbXBsQmVhbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX0lNUExfQkVBTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUltcGxCZWFuRUNsYXNzLCBTRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MsIFNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MsIFNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTkspOwotCi0JCXNlcnZsZXRMaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVRfTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldExpbmtFQ2xhc3MsIFNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LKTsKLQotCQllamJMaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMaW5rRUNsYXNzLCBFSkJfTElOS19fRUpCX0xJTkspOwotCi0JCWhhbmRsZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSEFORExFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSEFORExFUl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19TT0FQX1JPTEVTKTsKLQotCQliZWFuTGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCRUFOX0xJTkspOwotCi0JCXdzZGxTZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfU0VSVklDRSk7Ci0KLQkJaGFuZGxlckNoYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhBTkRMRVJfQ0hBSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJDaGFpbkVDbGFzcywgSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJDaGFpbkVDbGFzcywgSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJDaGFpbkVDbGFzcywgSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJDaGFpbkVDbGFzcywgSEFORExFUl9DSEFJTl9fSEFORExFUlMpOwotCi0JCWhhbmRsZXJzQ2hhaW5zRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhBTkRMRVJTX0NIQUlOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlcnNDaGFpbnNFQ2xhc3MsIEhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlXc2NvbW1vblBhY2thZ2UgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXdlYlNlcnZpY2VzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXNlcnZpY2VJbXBsQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2bGV0TGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJlYW5MaW5rKCkpOwotCQllamJMaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmVhbkxpbmsoKSk7Ci0JCWhhbmRsZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJYmVhbkxpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbFNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWhhbmRsZXJzQ2hhaW5zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh3ZWJTZXJ2aWNlc0VDbGFzcywgV2ViU2VydmljZXMuY2xhc3MsICJXZWJTZXJ2aWNlcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpLCB0aGlzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpLCBudWxsLCAid2ViU2VydmljZURlc2NyaXB0aW9ucyIsIG51bGwsIDEsIC0xLCBXZWJTZXJ2aWNlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAiV2ViU2VydmljZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpLCB0aGlzLmdldFBvcnRDb21wb25lbnQoKSwgbnVsbCwgInBvcnRDb21wb25lbnRzIiwgbnVsbCwgMSwgLTEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25UeXBlKCksIG51bGwsICJkZXNjcmlwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lVHlwZSgpLCBudWxsLCAiZGlzcGxheU5hbWVUeXBlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0Q29tcG9uZW50RUNsYXNzLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAiUG9ydENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydENvbXBvbmVudE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNtYWxsSWNvbiIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpLCB0aGlzLmdldFdTRExQb3J0KCksIG51bGwsICJ3c2RsUG9ydCIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCksIHRoaXMuZ2V0U2VydmljZUltcGxCZWFuKCksIG51bGwsICJzZXJ2aWNlSW1wbEJlYW4iLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCksIHRoaXMuZ2V0SGFuZGxlcigpLCBudWxsLCAiaGFuZGxlcnMiLCBudWxsLCAwLCAtMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lVHlwZSgpLCBudWxsLCAiZGlzcGxheU5hbWVUeXBlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldEljb25UeXBlKCksIG51bGwsICJpY29uVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfV3NkbFNlcnZpY2UoKSwgdGhpcy5nZXRXU0RMU2VydmljZSgpLCBudWxsLCAid3NkbFNlcnZpY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0VuYWJsZU10b20oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJlbmFibGVNdG9tIiwgIiIsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcm90b2NvbEJpbmRpbmciLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKSwgdGhpcy5nZXRIYW5kbGVyc0NoYWlucygpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsUG9ydEVDbGFzcywgV1NETFBvcnQuY2xhc3MsICJXU0RMUG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VJbXBsQmVhbkVDbGFzcywgU2VydmljZUltcGxCZWFuLmNsYXNzLCAiU2VydmljZUltcGxCZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSwgdGhpcy5nZXRFSkJMaW5rKCksIG51bGwsICJlRUpCTGluayIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpLCB0aGlzLmdldFNlcnZsZXRMaW5rKCksIG51bGwsICJlU2VydmxldExpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCB0aGlzLmdldEJlYW5MaW5rKCksIG51bGwsICJiZWFuTGluayIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRMaW5rRUNsYXNzLCBTZXJ2bGV0TGluay5jbGFzcywgIlNlcnZsZXRMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldExpbmsiLCBudWxsLCAwLCAxLCBTZXJ2bGV0TGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYkxpbmtFQ2xhc3MsIEVKQkxpbmsuY2xhc3MsICJFSkJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMaW5rX0VqYkxpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVqYkxpbmsiLCBudWxsLCAwLCAxLCBFSkJMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckVDbGFzcywgSGFuZGxlci5jbGFzcywgIkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMCwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJDbGFzcyIsIG51bGwsIDAsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldFNPQVBIZWFkZXIoKSwgbnVsbCwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcFJvbGVzKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXRTT0FQUm9sZSgpLCBudWxsLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhiZWFuTGlua0VDbGFzcywgQmVhbkxpbmsuY2xhc3MsICJCZWFuTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdzZGxTZXJ2aWNlRUNsYXNzLCBXU0RMU2VydmljZS5jbGFzcywgIldTRExTZXJ2aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckNoYWluRUNsYXNzLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICJIYW5kbGVyQ2hhaW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VOYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvdG9jb2xCaW5kaW5ncyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMSwgLTEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGhhbmRsZXJzQ2hhaW5zRUNsYXNzLCBIYW5kbGVyc0NoYWlucy5jbGFzcywgIkhhbmRsZXJzQ2hhaW5zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKSwgdGhpcy5nZXRIYW5kbGVyQ2hhaW4oKSwgbnVsbCwgImhhbmRsZXJDaGFpbiIsIG51bGwsIDAsIC0xLCBIYW5kbGVyc0NoYWlucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vV3NkZFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOWIzNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzLldzZGRUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBXc2RkUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgV3NkZFJlc291cmNlCi17Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdzZGRSZXNvdXJjZUltcGwuCi0JICovCi0JcHVibGljIFdzZGRSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgV3NkZFJlc291cmNlSW1wbC4KLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHVibGljIFdzZGRSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXMgZ2V0V2ViU2VydmljZXMoKSB7Ci0JCXJldHVybiAoV2ViU2VydmljZXMpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gV3NkZFRyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gV0VCX1NFUlZJQ0VfVFlQRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSAKLQl7Ci0JICBzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgCi0JICB7Ci0JICAgIGNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JICAgIGNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCSAgICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRE9DVFlQRTsKLQkgICAgZGVmYXVsdCA6Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotCX0KLQotICAgcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8wKCkKLSAgIHsKLSAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzEoKQotICAgewotICAgICAgcmV0dXJuIChnZXRNb2R1bGVWZXJzaW9uSUQoKT09V2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCk7ICAKLSAgIH0KLSAgIHB1YmxpYyBib29sZWFuIGlzV2ViU2VydmljZTFfMigpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEKTsgIAotICAgfQotCi0JLyogCi0JICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKLQkvL3N1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0Jc3dpdGNoIChpZCkgewotCQkJY2FzZSAoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMl9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQlicmVhazsJCQkKLQkJfQotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIAotICB7Ci0gICAgc3dpdGNoIChpZCkgewotCSAgICBjYXNlIChKRUVfNV8wX0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQpOwotCQkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCk7Ci0gICAgCQkJCWJyZWFrOwotICAgIAljYXNlIChKMkVFXzFfM19JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgIAkJfQotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JICByZXR1cm4gIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1BVQkxJQ0lEOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQ7Ci0JfQotCi0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJZGVmYXVsdCA6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQ7Ci0JfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotICB7Ci0gICAgLy9EbyBub3RoaW5nIGZvciBub3cgc2luY2UgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSB2ZXJzaW9uLgotICB9Ci0KLQotcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQotCQlpbnQgbXlWZXJzaW9uID0gSjJFRV8xXzRfSUQ7Ci0JCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQlteVZlcnNpb24gPSBwcmltR2V0VmVyc2lvbklEKCk7Ci0JCQlzZXRNb2R1bGVWZXJzaW9uSUQobXlWZXJzaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQotfQotCi1wcml2YXRlIGludCBwcmltR2V0VmVyc2lvbklEKCkgewotCUlGaWxlIGFmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh0aGlzKTsKLQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG51bGw7Ci0JaWYgKGFmaWxlICE9IG51bGwgJiYgYWZpbGUuZXhpc3RzKCkpIHsKLQkJdHJ5IHsKLQkJCWluID0gYWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOwotCX0gZWxzZXsKLQkJU3RyaW5nIHBhdGggPSBnZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLQotCQkJCQlxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGluKTsKLQkJCQkJcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZTEpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwotfQotCi0gIAotICAgIAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI5NzQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV3NkZFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzZGRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXc2RkU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFdzZGRTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlcyhXZWJTZXJ2aWNlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlRGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50KFBvcnRDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMUG9ydChXU0RMUG9ydCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TGluayhTZXJ2bGV0TGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldExpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJMaW5rKEVKQkxpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCZWFuTGluayhCZWFuTGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmVhbkxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMU2VydmljZShXU0RMU2VydmljZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFNlcnZpY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyQ2hhaW4oSGFuZGxlckNoYWluIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQ2hhaW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyc0NoYWlucyhIYW5kbGVyc0NoYWlucyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSGFuZGxlcnNDaGFpbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50IDxlbT5Qb3J0IENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0IDxlbT5XU0RMIFBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMUG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayA8ZW0+RUpCIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyIDxlbT5IYW5kbGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJlYW5MaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFNlcnZpY2UgPGVtPldTREwgU2VydmljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFNlcnZpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFNlcnZpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4gPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQ2hhaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWlucyA8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWlucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyc0NoYWluc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVRTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Xc2RkQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NTI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdzZGRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdzZGRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFUzogewotCQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gKFdlYlNlcnZpY2VzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJTZXJ2aWNlcyh3ZWJTZXJ2aWNlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAod2ViU2VydmljZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAod2ViU2VydmljZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlYlNlcnZpY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlNlcnZpY2VEZXNjcmlwdGlvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdlYlNlcnZpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVDogewotCQkJCVBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCA9IChQb3J0Q29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0Q29tcG9uZW50KHBvcnRDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHBvcnRDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUOiB7Ci0JCQkJV1NETFBvcnQgd3NkbFBvcnQgPSAoV1NETFBvcnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExQb3J0KHdzZGxQb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZSh3c2RsUG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod3NkbFBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU46IHsKLQkJCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gKFNlcnZpY2VJbXBsQmVhbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUltcGxCZWFuKHNlcnZpY2VJbXBsQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VydmljZUltcGxCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOSzogewotCQkJCVNlcnZsZXRMaW5rIHNlcnZsZXRMaW5rID0gKFNlcnZsZXRMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0TGluayhzZXJ2bGV0TGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmVhbkxpbmsoc2VydmxldExpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZsZXRMaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LOiB7Ci0JCQkJRUpCTGluayBlamJMaW5rID0gKEVKQkxpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkxpbmsoZWpiTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmVhbkxpbmsoZWpiTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSOiB7Ci0JCQkJSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChoYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChoYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkJFQU5fTElOSzogewotCQkJCUJlYW5MaW5rIGJlYW5MaW5rID0gKEJlYW5MaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCZWFuTGluayhiZWFuTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYmVhbkxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9TRVJWSUNFOiB7Ci0JCQkJV1NETFNlcnZpY2Ugd3NkbFNlcnZpY2UgPSAoV1NETFNlcnZpY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExTZXJ2aWNlKHdzZGxTZXJ2aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZSh3c2RsU2VydmljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod3NkbFNlcnZpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTjogewotCQkJCUhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW4gPSAoSGFuZGxlckNoYWluKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIYW5kbGVyQ2hhaW4oaGFuZGxlckNoYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChoYW5kbGVyQ2hhaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TOiB7Ci0JCQkJSGFuZGxlcnNDaGFpbnMgaGFuZGxlcnNDaGFpbnMgPSAoSGFuZGxlcnNDaGFpbnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhhbmRsZXJzQ2hhaW5zKGhhbmRsZXJzQ2hhaW5zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChoYW5kbGVyc0NoYWlucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXMoV2ViU2VydmljZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlRGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudChQb3J0Q29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIFBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIFBvcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMUG9ydChXU0RMUG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRMaW5rKFNlcnZsZXRMaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRUpCTGluayhFSkJMaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUhhbmRsZXIoSGFuZGxlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmVhbkxpbmsoQmVhbkxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV1NETFNlcnZpY2UoV1NETFNlcnZpY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyQ2hhaW4oSGFuZGxlckNoYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhhbmRsZXJzQ2hhaW5zKEhhbmRsZXJzQ2hhaW5zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Xc2RkU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYmE5NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIHdlYiBzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY29tbW9uIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlICB3ZWIgc2VydmljZXMgZGVwb2x5bWVudCBkZXNjcmlwdG9yIG1vZGVsIGFydGlmYWN0cyAoUG9ydENvbXBvbmVudHMsIEhhbmRsZXJzLCBXU0RMUG9ydHMsIFdlYlNlcnZpY2VzIERlc2NyaXB0aW9uIGV0Yy4pIAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FwcGxpY2F0aW9uL0lDb21tb25BcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2plZS9hcHBsaWNhdGlvbi9JQ29tbW9uQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyM2FhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FwcGxpY2F0aW9uL0lDb21tb25BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25BcHBsaWNhdGlvbiB7Ci0JCi0JcHVibGljIElDb21tb25Nb2R1bGUgZ2V0Rmlyc3RFQVJNb2R1bGUoU3RyaW5nIHVyaSk7Ci0JcHVibGljIExpc3QgZ2V0RUFSTW9kdWxlcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FwcGxpY2F0aW9uL0lDb21tb25Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXBwbGljYXRpb24vSUNvbW1vbk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGE2NTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXBwbGljYXRpb24vSUNvbW1vbk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1vbk1vZHVsZSB7Ci0JCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotCVN0cmluZyBnZXRVcmkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgaWYgdGhpcyBNb2R1bGUgcmVwcmVzZW50cyBhIENvbm5lY3Rvck1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yTW9kdWxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBFamJNb2R1bGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBpZiB0aGlzIE1vZHVsZSByZXByZXNlbnRzIGEgSmF2YUNsaWVudE1vZHVsZShBcHBsaWNhdGlvbkNsaWVudCkKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgaWYgdGhpcyBNb2R1bGUgcmVwcmVzZW50cyBhIFdlYk1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS94bWxwYXJzZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUveG1scGFyc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3OTllOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS94bWxwYXJzZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1tZXRob2RfaW52b2tlX2ZhaWxlZF9FWENfPUlXQUUwMDk1RSBGYWlsZWQgdG8gaW52b2tlIHRoZSBtZXRob2QgbmFtZWQ6IHswfQotZmFpbGVkX3RvX2xvYWRfRVhDXz1JV0FFMDA5NkUgRmFpbGVkIHRvIGxvYWQ6IHswfQotbWV0aG9kX25vdF9mb3VuZF9FWENfPUlXQUUwMDk3RSBDb3VsZCBub3QgZmluZCB0aGUgZm9sbG93aW5nIG1ldGhvZCBuYW1lZDogezB9Ci1mYWlsZWRfaW5zdGFudGlhdGluZ19FWENfPUlXQUUwMDk4RSBGYWlsZWQgaW5zdGFudGlhdGluZzogezB9Ci1wYXJzZV9leGNlcHRpb25fb2NjdXJlZF9FWENfPUlXQUUwMDk5RSBBbiBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB4bWw6IExpbmUgIzogezB9IDpDb2x1bW4gIzogezF9Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGY1NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1MWExNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlamJNb2RlbEV4dGVuZGVyIiBuYW1lPSJlamJNb2RlbEV4dGVuZGVyIiBzY2hlbWE9InNjaGVtYS9lamJNb2RlbEV4dGVuZGVyLmV4c2QiLz4KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iam5kaUJpbmRpbmdzSGVscGVycyIgbmFtZT0iam5kaUJpbmRpbmdzSGVscGVycyIgc2NoZW1hPSJzY2hlbWEvam5kaUJpbmRpbmdzSGVscGVycy5leHNkIi8+Ci0KLTwhLS1KMkVFSW5pdC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSjJFRSBDb3JlIEV4dGVuc2lvbiBQb2ludCBSZWdpc3RyeS0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY29tbW9uLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0id2ViYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iZWpiLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iamNhLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0ianNwLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0id2Vic2VydmljZV9jbGllbnQueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJ3c2NvbW1vbi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9IndzZGQueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAuMi93c2NvbW1vbi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wLjIvd3NkZC54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLUFyY2hpdmVJbml0LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImNvbW1vbmFyY2hpdmUueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gYSBwbGFjZSBob2xkZXIgZm9yIHRoZSBmdXR1cmUuICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBTZXZlcmFsIHRoYXQgaGF2ZSBub3QgY2hhbmdlZCBhcmUgc3RpbGwgcmVnaXN0ZXJlZCBhcyAgLS0+Ci08IS0tIFJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLnBhY2thZ2VVUklNYXAiPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJjb21tb24ueG1pIgotICAgICAgICAgICAgcHJlZml4PSJjb21tb24iPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iYXBwbGljYXRpb24iPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImNsaWVudC54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImNsaWVudCI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0id2ViYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgcHJlZml4PSJ3ZWJhcHBsaWNhdGlvbiI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iZWpiLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iZWpiIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJqY2EueG1pIgotICAgICAgICAgICAgcHJlZml4PSJqY2EiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9InRhZ2xpYi54bWkiCi0gICAgICAgICAgICBwcmVmaXg9InRhZ2xpYiI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0ianNwLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0ianNwIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJjb21tb25hcmNoaXZlLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iY29tbW9uYXJjaGl2ZSI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWciPgotICAgICAgPC9tYXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJqMmVlQXBwbGljYXRpb25FcnJvckN1c3RvbWl6ZXIiCi0gICAgICAgICBuYW1lPSIlSjJFRUFwcGxpY2F0aW9uRXJyb3JDdXN0b21pemVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiPgotICAgICAgPGVycm9yQ3VzdG9taXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWxlcnJvcmN1c3RvbWl6YXRpb24uSjJFRUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIiCi0gICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAKLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIj4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJBcHBSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0id2ViLnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgIAkgIAljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJERCI+Ci0gICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICA8L3Jlc291cmNlRmFjdG9yeT4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9ImVqYi1qYXIueG1sIj4KLSAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamJERCI+Ci0gICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICA8L3Jlc291cmNlRmFjdG9yeT4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0iYXBwbGljYXRpb24tY2xpZW50LnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwY2xpZW50REQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0iYXBwbGljYXRpb24ueG1sIj4KLSAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJERCI+Ci0gICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICA8L3Jlc291cmNlRmFjdG9yeT4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9InJhLnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29ubmVjdG9yREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyODk1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L21vZmoyZWUiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9tb2ZqMmVlIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9jb21tb25BcmNoaXZlIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vY29tbW9uQXJjaGl2ZSI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vajJlZS12YWxpZGF0aW9uIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vajJlZS12YWxpZGF0aW9uIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvYXBwbGljYXRpb24uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvYXBwbGljYXRpb24uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdiOWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2FwcGxpY2F0aW9uLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDkwMSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYXBwbGljYXRpb24iDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4N2YzZTAwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJhcHBsaWNhdGlvbi54bWkiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiQXBwbGljYXRpb24iKSkpDQotICAgIHF1aWQgICAgICAgCSIzOEMwMzAwODAxNEUiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODdmM2UwMC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEZGM0MxMDAyQTgiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkFwcGxpY2F0aW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg3ZjNlMDAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAzMEE4MDNCMSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUNCi18YXBwbGljYXRpb24uDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNBRTkzMDA5NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUzRjg1ODAwRjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgDQotfFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJNb2R1bGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbiBvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1cmkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzJCMjAyREEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWx0REQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzJFMDAyMDQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuIFRoZSBVUkkgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290IGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llciBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50IHNwZWNpZmljYXRpb24uDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXZWJNb2R1bGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTA0ODYwRDAyN0IiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwNC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDg2QUUwMUM5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRleHRSb290Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwNS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDg2MTQwMzU4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJKYXZhQ2xpZW50TW9kdWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkwNDg2NzMwMDE1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDctMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NkIyMDFGNiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVqYk1vZHVsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDA4LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NjgzMDI1MyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGVqYi1qYXIsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwOS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDg2QjYwMzc5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQ29ubmVjdG9yTW9kdWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk1QkMwMDIyNyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk1QkNBMDIxOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwYS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMzNGODAwQjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzM0Y5MDE3QyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQGRlcHJlY2F0ZWQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkFwcGxpY2F0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlSb2xlcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzM0Y5MDE3RCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHNlY3VyaXR5IHJvbGVzIHdoaWNoIGFyZQ0KLXxnbG9iYWwgdG8gdGhlIGFwcGxpY2F0aW9uLiANCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkic2VjdXJpdHlSb2xlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDM0MDAwM0MxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImFwcGxpY2F0aW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwZS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDM0MDEwMkU2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJhcHBsaWNhdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6QXBwbGljYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMEE4MDNCMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwZi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDM0MDEwMkU3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUNCi18ICAgICAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUNCi18ICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQNCi18ICAgICAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246Ok1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMyMkMwMDA2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJBcHBsaWNhdGlvbiBEaWFncmFtIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAzMjU5MDBCRiINCi0JICAgIHRpdGxlICAgICAgCSJBcHBsaWNhdGlvbiBEaWFncmFtIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpXZWJNb2R1bGUiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDE2MDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgxNDIsIDE1MDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODYwRDAyN0IiDQotCQkgICAgd2lkdGggICAgICAJMzk0DQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpKYXZhQ2xpZW50TW9kdWxlIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjc4LCAxNTc3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoNTc4LCAxNTAxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsaWVudE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NjczMDAxNSINCi0JCSAgICB3aWR0aCAgICAgIAkyMTgNCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkVqYk1vZHVsZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyMiwgMTU3NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDg0MSwgMTQ5OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYk1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NjgzMDI1MyINCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkNvbm5lY3Rvck1vZHVsZSIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDExNTAsIDE1NzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxMDQ5LCAxNDk5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29ubmVjdG9yTW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk1QkMwMDIyNyINCi0JCSAgICB3aWR0aCAgICAgIAkyMjANCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA5NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDE1NjIsIDYzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTE4DQotCQkJbWF4X3dpZHRoICAJMTA0MA0KLQkJCWxhYmVsICAgICAgCQ0KLXxUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZToNCi18DQotfC0gSW4gZWxlbWVudHMgdGhhdCBjb250YWluIFBDREFUQSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiB0aGUgZGF0YSBtYXkgZSBpZ25vcmVkLg0KLXwNCi18LSBJbiBlbGVtZW50cyB3aG9zZSB2YWx1ZSBpcyBhbiAgImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcyBjYXNlIHNlbnNpdGl2ZS4NCi18DQotfC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNlcnZsZXQgQVBJLg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMTAwDQotCQkgICAgaGVpZ2h0ICAgICAJOTM3KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEzNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoODA5LCA1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzAwLCAxMTAxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTIyLCA5NDcpDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMzMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbiIgQDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2NywgNDM5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgNCi0JCQlsb2NhdGlvbiAgIAkoMTE0LCAyMzMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTA2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMEE4MDNCMSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjQNCi0JCSAgICBoZWlnaHQgICAgIAk0MzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDc5NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzNGODAwQjIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNCwgLTMwOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgyMTQsIDY5NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjMxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC43MzU0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAzM0Y5MDE3QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTYsIDc5NSkNCi0JCQkJKDM1NiwgNjU3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1NiwgNzk1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU2LCA2NTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDQyMywgNjkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NDg4NzkNCi0JCQkJaGVpZ2h0ICAgICAJNjcNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5Um9sZXMiIEAxMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDQsIC0zMDkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjEyLCA5MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5Um9sZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNzUzNjIzDQotCQkJCWhlaWdodCAgICAgCTE0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzNGOTAxN0QiDQotCQkJICAgIGNsaWVudCAgICAgCUA5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU2LCA3OTUpDQotCQkJCSgzNTYsIDkzNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTYsIDc5NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgOTM0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzDQotCQkJCWxvY2F0aW9uICAgCSg0MTIsIDkwMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzc1MzYyDQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIiBAMTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgzMywgMTA3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCWxvY2F0aW9uICAgCSg3MDIsIDk3MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQlsb2NhdGlvbiAgIAkoNzAyLCAxMDMxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjk0KQ0KLQkJICAgIHdpZHRoICAgICAgCTI4MA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxNw0KLQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY2MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzQwMDAzQzEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXBwbGljYXRpb24iIEAxOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjU4LCAtNDkxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDc1OCwgNTU4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjMxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithcHBsaWNhdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC41ODQ2MTUNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDM0MDEwMkU2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NzgsIDY2MSkNCi0JCQkJKDg3OCwgNjAxKQ0KLQkJCQkoNjI5LCA2MDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODc4LCA2NjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MjksIDYwMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNzIzLCA2NDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5NTM4NQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlcyIgQDIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NTgsIC00OTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUzLCA5MTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODUxNDQ5DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzQwMTAyRTciDQotCQkJICAgIGNsaWVudCAgICAgCUAxNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NzgsIDY2MSkNCi0JCQkJKDg3OCwgOTU3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg3OCwgNjYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc4LCA5NTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQkJbG9jYXRpb24gICAJKDk0OCwgOTE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NjIzMTkNCi0JCQkJaGVpZ2h0ICAgICAJNzANCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjQNCi0JCSAgICBsb2NhdGlvbiAgIAkoODMzLCAxMzI1KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4MzMsIDEzMjUpDQotCQkJKDgzMywgMTE4NikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODZCNjAzNzkiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTIyLCAxNDg3KQ0KLQkJCSg5MjIsIDEzMjUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkyMiwgMTQ4NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIyLCAxMzI1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODZBRTAxQzkiDQotCQkgICAgY2xpZW50ICAgICAJQDENCi0JCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDE5LCAxNDkyKQ0KLQkJCSg0MTksIDEzMjUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQxOSwgMTQ5MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE5LCAxMzI1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODZCMjAxRjYiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNjc4LCAxNDg5KQ0KLQkJCSg2NzgsIDEzMjUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3OCwgMTQ4OSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjc4LCAxMzI1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTVCQ0EwMjE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDExNDEsIDE0ODcpDQotCQkJKDExNDEsIDEzMDYpDQotCQkJKDg5NCwgMTMwNikNCi0JCQkoODk0LCAxMTg2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQxLCAxNDg3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTQsIDExODYpKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jbGllbnQuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY2xpZW50LmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyMzc3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jbGllbnQuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTU3NiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY2xpZW50Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIklETCINCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiY2xpZW50LnhtaSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJDbGllbnQiKSkpDQotICAgIHF1aWQgICAgICAgCSIzOEMwMjgwNzAwQzAiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEZGM0MxODAzMzYiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNBRUZDMDAwOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU1OUVFQTAyNDEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlJlc0F1dGhBcHBsaWNhdGlvblR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwNy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTBDMjAxQTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QXBwbGljYXRpb249MA0KLXxDb250YWluZXI9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwOS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMkE1QjAyMTEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAyQTVEMDAwMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicmVzb3VyY2VSZWZzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwYi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDJBNUQwMDBDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudHMncyByZWZlcmVuY2VzIHRvIGFuIGV4dGVybmFsIHJlc291cmNlcy4iDQotCQkgICAgbGFiZWwgICAgICAJInJlc291cmNlUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc5MzAzQzYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAwYy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMkI0NTAxRDUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAyQjQ2MDIxQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW52aXJvbm1lbnRQcm9wcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAyQjQ2MDIyNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyaWVzLiBFYWNoIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4iDQotCQkgICAgbGFiZWwgICAgICAJImVudmlyb25tZW50UHJvcHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFbnZFbnRyeSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3NzgwMEUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDJCNEIwMDExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDEwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMkI0QzAwNDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYlJlZmVyZW5jZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDExLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMkI0QzAwNDUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlDQotfGJlYW4ncyBob21lLiANCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiUmVmZXJlbmNlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk1RThFMDBGRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXNvdXJjZUVudlJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk1RThGMDMzQSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsDQotfGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuDQotfA0KLXxVc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQNCi18DQotfEV4YW1wbGU6DQotfA0KLXw8cmVzb3VyY2UtZW52LXJlZj4NCi18ICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4NCi18ICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+DQotfDwvcmVzb3VyY2UtZW52LXJlZj4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInJlc291cmNlRW52UmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA3MjAwRDMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NUU4RjAzNEUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk1RjNEMDI5QSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjYWxsYmFja0hhbmRsZXIgIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NUYzRTAxRjEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkEgY2xhc3MgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuIg0KLQkJICAgIGxhYmVsICAgICAgCSJjYWxsYmFja0hhbmRsZXIgIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk1RjNFMDIyMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNTNGNEFDMDA1RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y0QUMwMkY0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNGNEFDMDMwOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNTNGNTA3MDFEMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUzRjUwODAwQjEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlDQotfCAgICBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcw0KLXwgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUNCi18ICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQ0KLXwgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUNCi18ICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb25SZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMxRjUyMDI4QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUzRjUwODAwQkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTUzRjVEQjAzNzIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y1REQwMDNGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y1REQwMDUzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQ2xpZW50IERpYWdyYW0iDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDI4QzYwMEVEIg0KLQkgICAgdGl0bGUgICAgICAJIkNsaWVudCBEaWFncmFtIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ1MywgNzI5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgyNzUsIDY1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VSZWYiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDk2LCAyMDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTYxOSwgMTgxMCkNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk5NTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkJICAgIHdpZHRoICAgICAgCTk3Mg0KLQkJICAgIGhlaWdodCAgICAgCTUzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVudkVudHJ5IiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNCwgMjAxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDc3OCwgMTgxMikNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudkVudHJ5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3NzgwMEUyIg0KLQkJICAgIHdpZHRoICAgICAgCTUxMA0KLQkJICAgIGhlaWdodCAgICAgCTQzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NTYsIDIwNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxMjI0LCAxODEwKQ0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQ2NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRWpiUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIHdpZHRoICAgICAgCTQ4Mg0KLQkJICAgIGhlaWdodCAgICAgCTUzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIiBANQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OCwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMTk1MSwgNDg2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTY3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzb3VyY2VFbnZSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTE2Mzg0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwNzIwMEQzIg0KLQkJICAgIHdpZHRoICAgICAgCTY5Mg0KLQkJICAgIGhlaWdodCAgICAgCTMzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzgyLCAyMTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSg2ODksIDEzOSkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMyLCAyMDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMzM2LCAxOTQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCINCi0JCSAgICB3aWR0aCAgICAgIAkyMTANCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb25SZWYiIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDcyLCA2NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOA0KLQkJCWxvY2F0aW9uICAgCSg2MzcsIDQ2NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4NzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMxRjUyMDI4QyINCi0JCSAgICB3aWR0aCAgICAgIAk4ODgNCi0JCSAgICBoZWlnaHQgICAgIAkzNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb24iIEA5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA0OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgxMzI5LCAzOTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCQkgICAgd2lkdGggICAgICAJNDk2DQotCQkgICAgaGVpZ2h0ICAgICAJMjMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiIEAxMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCAxMjY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJbG9jYXRpb24gICAJKDEzMSwgMTA1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uQ2xpZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIHdpZHRoICAgICAgCTUyNA0KLQkJICAgIGhlaWdodCAgICAgCTQzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY0LCAxMzMwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQTVCMDIxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwOCwgMjc0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDgzMSwgMTI4OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkE1RDAwMDIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTY0LCAxMzMwKQ0KLQkJCQkoNjQ2LCAxMzMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NjQsIDEzMzApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDYsIDEzMzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTMwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODUwMTA3DQotCQkJCWhlaWdodCAgICAgCTI3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXNvdXJjZVJlZnMiIEAxNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzA4LCAyNzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1NSwgMTYzOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyNjYwNw0KLQkJCQloZWlnaHQgICAgIAkxNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDJBNUQwMDBDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTENCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTY0LCAxMzMwKQ0KLQkJCQkoMjAxMywgMTMzMCkNCi0JCQkJKDIwMTMsIDE3OTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU2NCwgMTMzMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTMsIDE3OTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjcsIDE3MDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTkzLCAxNDU0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQjQ1MDFENSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCA0MTQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE1LCAxNDEzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQjQ2MDIxQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk5MywgMTQ1NCkNCi0JCQkJKDY0NiwgMTQ1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5OTMsIDE0NTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDYsIDE0NTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQkJbG9jYXRpb24gICAJKDczNSwgMTM5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzQ2MTA4DQotCQkJCWhlaWdodCAgICAgCTY1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnZpcm9ubWVudFByb3BzIiBAMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCA0MTQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0MiwgMTUyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM0OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW52aXJvbm1lbnRQcm9wcyINCi0JCQkJcGN0RGlzdCAgICAJMC4zMjA4OTYNCi0JCQkJaGVpZ2h0ICAgICAJMTg5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQjQ2MDIyNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4DQotCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTkzLCAxNDU0KQ0KLQkJCQkoMTA1MywgMTQ1NCkNCi0JCQkJKDEwNTMsIDE4MDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTkzLCAxNDU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA1MywgMTgwMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzMSwgMTcxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzg2MDI1DQotCQkJCWhlaWdodCAgICAgCTc4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAyNQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjMzLCAxNDE1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQjRCMDAxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM1MSwgMzI3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3DQotCQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQkJbG9jYXRpb24gICAJKDc2NCwgMTM3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0QzAwNDQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMzLCAxNDE1KQ0KLQkJCQkoNjQ2LCAxNDE1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzMsIDE0MTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDYsIDE0MTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQkJbG9jYXRpb24gICAJKDcwNiwgMTM2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJSZWZlcmVuY2VzIiBAMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM1MSwgMzI3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwDQotCQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQkJbG9jYXRpb24gICAJKDE2MTksIDE1ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYlJlZmVyZW5jZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjM4MTMyDQotCQkJCWhlaWdodCAgICAgCTE4Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0QzAwNDUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMzMsIDE0MTUpDQotCQkJCSgxNDM3LCAxNDE1KQ0KLQkJCQkoMTQzNywgMTc5OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMzLCAxNDE1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzNywgMTc5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNCwgMTcxOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODY0NjY4DQotCQkJCWhlaWdodCAgICAgCTk3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAzMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTQ5LCAxMjY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTE2Mzg0DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk1RThFMDBGRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXNvdXJjZUVudlJlZnMiIEAzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTY1LCAxMDEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDIxNjksIDk5NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMzOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VFbnZSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4OTU4OA0KLQkJCQloZWlnaHQgICAgIAkxNzkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTVFOEYwMzNBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTQ5LCAxMjY4KQ0KLQkJCQkoMTk5MCwgMTI2OCkNCi0JCQkJKDE5OTAsIDgwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ5LCAxMjY4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MCwgODA2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgyMDM4LCA5MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3OTM3Nw0KLQkJCQloZWlnaHQgICAgIAk0OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzINCi0JCQkgICAgbG9jYXRpb24gICAJKDExNjUsIDEwMTIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTVFOEYwMzRFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU0OSwgMTI2OCkNCi0JCQkJKDY0NiwgMTI2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ5LCAxMjY4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxMjY4KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAzNw0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODEsIDc2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NUYzRDAyOUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY2FsbGJhY2tIYW5kbGVyICIgQDM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzcNCi0JCQkgICAgbG9jYXRpb24gICAJKDM5NywgNTA0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5DQotCQkJCVBhcmVudF9WaWV3IAlAMzgNCi0JCQkJbG9jYXRpb24gICAJKDk4NCwgMzU1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjYWxsYmFja0hhbmRsZXIgIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5OTIwOQ0KLQkJCQloZWlnaHQgICAgIAkyMDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTVGM0UwMUYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3ODEsIDc2MCkNCi0JCQkJKDc4MSwgMzA5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4MSwgNzYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAzMDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwDQotCQkJCVBhcmVudF9WaWV3IAlAMzgNCi0JCQkJbG9jYXRpb24gICAJKDcxOCwgMzUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDUxMzgNCi0JCQkJaGVpZ2h0ICAgICAJNjQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEA0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzOTcsIDUwNCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NUYzRTAyMjMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3ODEsIDc2MCkNCi0JCQkJKDc4MSwgMTA3NikNCi0JCQkJKDY0NiwgMTA3NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODEsIDc2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NiwgMTA3NikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDQyDQotCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTcwNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNEFDMDA1RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlUmVmcyIgQDQzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNzEsIDEwMjcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2LCAxODQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC42MzkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNEFDMDJGNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzI5LCAxNzA1KQ0KLQkJCQkoMzI5LCAxOTI4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyOSwgMTcwNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyOSwgMTkyOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNDAzLCAxODUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NjM5MzQNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBANDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE3MSwgMTAyNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTUzRjRBQzAzMDgiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjksIDE3MDUpDQotCQkJCSgzMjksIDE0ODIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzI5LCAxNzA1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI5LCAxNDgyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBANDcNCi0JCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxMDgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y1MDcwMUQyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiIEA0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzOTYsIDQwMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCWxvY2F0aW9uICAgCSgxMTQ2LCA4NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2VEZXN0aW5hdGlvblJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuODA4NzY1DQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTUzRjUwODAwQjEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg5NiwgMTA4MCkNCi0JCQkJKDg5NiwgODI3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg5NiwgMTA4MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgODI3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MA0KLQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDg3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODA4NzY1DQotCQkJCWhlaWdodCAgICAgCTY1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDM5NiwgNDAyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNTA4MDBCQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg5NiwgMTA4MCkNCi0JCQkJKDg5NiwgMTE0MCkNCi0JCQkJKDY0NiwgMTE0MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4OTYsIDEwODApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDYsIDExNDApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEA1Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDAxLCAxMjAyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y1REIwMzcyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiIEA1Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDIzLCAtNjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2NywgNjkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NzU2Nw0KLQkJCQloZWlnaHQgICAgIAkyMDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y1REQwMDNGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDAxLCAxMjAyKQ0KLQkJCQkoMTU2NiwgMTIwMikNCi0JCQkJKDE1NjYsIDYxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDAxLCAxMjAyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgNjEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJCWxvY2F0aW9uICAgCSgxNDgzLCA2NzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxODk4Nw0KLQkJCQloZWlnaHQgICAgIAk4NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEA1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDIzLCAtNjApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y1REQwMDUzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQwMSwgMTIwMikNCi0JCQkJKDY0NiwgMTIwMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDAxLCAxMjAyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxMjAyKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJyZXNBdXRoIFJlbGF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBMEIxMDA2MCINCi0JICAgIHRpdGxlICAgICAgCSJyZXNBdXRoIFJlbGF0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNsaWVudDo6UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIgQDU3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzUsIDczNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCWxvY2F0aW9uICAgCSgzMSwgNzA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU3DQotCQkJbG9jYXRpb24gICAJKDMxLCA2NTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMEMyMDFBNSINCi0JCSAgICB3aWR0aCAgICAgIAk1MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNBdXRoVHlwZUJhc2UiIEA1OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAyNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTgNCi0JCQlsb2NhdGlvbiAgIAkoOTQsIDkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzQXV0aFR5cGVCYXNlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTgNCi0JCQlsb2NhdGlvbiAgIAkoOTQsIDQzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUzDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOUVENDAwQjQiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJNDE4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb24uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNlNDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2Mjg3ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb24iDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJjb21tb24ueG1pIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkNvbW1vbiIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM4QzA4RjBGMDM4RCINCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0DQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzOUI3RTQ4QzAwNjciDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamIiDQotCSAgICBxdWlkdSAgICAgIAkiMzc4MEUyNzIwMzJEIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjM5QUIyQkYxMDBGQSINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uIg0KLQkgICAgcXVpZHUgICAgICAJIjM4QzAzMDA4MDE0RSIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJFamJSZWYiDQotCSAgICBxdWlkICAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZQ0KLXxkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUNCi18ZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6DQotfA0KLXwgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbg0KLXwgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YNCi18ICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQ0KLXwgICAgICBiZWFuDQotfCAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQNCi18ICAgICAgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlDQotfCAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDQwMDAxODUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGlzIGlzIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgc2VydmxldCBjb2RlIHVzZXMgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4uDQotfEV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ0MTMwMThDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCi18PGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4NCi18PGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIkVqYlJlZlR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyNkZCMDA4MSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhvbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENDI1MDMyRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbpJzIGhvbWUgaW50ZXJmYWNlLg0KLXxFeGFtcGxlOiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVtb3RlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDQyRTAwNzMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbpJzIHJlbW90ZSBpbnRlcmZhY2UuIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDQ1QjAyOEEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gDQotfEV4YW1wbGU6IDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJERDg3NjAyRTUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRW52RW50cnkiDQotCSAgICBxdWlkICAgICAgIAkiMzcxQkM3NzgwMEUyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzDQotfGVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwNCi18ZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuDQotfG9wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZQ0KLXxzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4NCi18DQotfEl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJEMzcxMDM5MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJEMzc4MDExMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQ0KLXwgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZQ0KLXwgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52DQotfCAgICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhDQotfCAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzDQotfCAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQNCi18ICAgICAgICBjb250ZXh0Lg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJEMzgwMDNBOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhDQotfCAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlDQotfCAgICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUNCi18ICAgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhDQotfCAgICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLA0KLXwgICAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCREQ4MzQwMDkxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50knMgY29kZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZTogamF2YS5sYW5nLkJvb2wtZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuIA0KLXxFeGFtcGxlOiA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJFbnZFbnRyeVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QkREN0E2MDMxNSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJSZXNvdXJjZVJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzNzFCQzc5MzAzQzYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhDQotfERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdA0KLXxjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXINCi18Y29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUNCi18cmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUNCi18RGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24NCi18KEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mDQotfHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UNCi18KFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuDQotfA0KLXxFeGFtcGxlOg0KLXwNCi18PHJlc291cmNlLXJlZj4NCi18ICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+DQotfCAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPg0KLXwgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+DQotfCAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4NCi18PC9yZXNvdXJjZS1yZWY+DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ1NTgwMzM4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ1NUYwMzEwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGENCi18ICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuDQotfCAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlDQotfCAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0Lg0KLXwgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ1NzUwMjRBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGENCi18ICAgICAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkDQotfCAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UNCi18ICAgICAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF1dGgiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkREOEQ5MDBBQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4gIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6DQotfDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+DQotfDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJSZXNBdXRoVHlwZUJhc2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA5RUQ0MDBCNCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDNzQzMDAwOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNTaGFyaW5nU2NvcGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyN0ZDMDNEQiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQNCi18dGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQ0KLXxzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlDQotfHR3byBmb2xsb3dpbmc6ICBTaGFyZWFibGUsIFVuc2hhcmVhYmxlDQotfA0KLXxUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJSZXNTaGFyaW5nU2NvcGVUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjg4QzAwQTMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRW52RW50cnlUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QkREN0E2MDMxNSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS4zIGFkZGVkIENoYXJhY3Rlcg0KLXxTdHJpbmc9MA0KLXxJbnRlZ2VyPTENCi18Qm9vbGVhbj0yDQotfERvdWJsZT0zDQotfEJ5dGU9NA0KLXxTaG9ydD01DQotfExvbmc9Ng0KLXxGbG9hdD03DQotfENoYXJhY3Rlcj04DQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTdHJpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0Q4MDBDQiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkludGVnZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0RCMDA5RCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkJvb2xlYW4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0UyMDBFRCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkRvdWJsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBOUM3RTQwMUMzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQnl0ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBOUM3RTYwMEU5Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU2hvcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0VGMDJGRiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxvbmciDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0YxMDNENCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkZsb2F0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdGMzAyRjEiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDaGFyYWN0ZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2QUREMDNBOCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlY3VyaXR5Um9sZVJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQ0KLXxzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGENCi18RGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4NCi18b3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUNCi18Y29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUNCi18c2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4NCi18YXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENEJDMDEzNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZA0KLXwgICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlDQotfCAgICAgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUNCi18ICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJERDg5RDAxQzgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJERDhBQzAxMzQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQNCi18ICAgICAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluDQotfCAgICAgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZQ0KLXwgICAgICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUmVzQXV0aFR5cGVCYXNlIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA5RUQ0MDBCNCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDT05UQUlORVI9MA0KLXxDb250YWluZXI9MQ0KLXxBcHBsaWNhdGlvbj0yDQotfFNFUlZMRVQ9Mw0KLXwNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNvbnRhaW5lciINCi0JCSAgICBxdWlkICAgICAgIAkiM0VBNkQ4RjMwMUU3Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQXBwbGljYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNFQTZEOTAwMDE3OCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlNFUlZMRVQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQUZFRDhCMDEzOCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVqYlJlZlR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTI2RkIwMDgxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNlc3Npb249MA0KLXxFbnRpdHk9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU2Vzc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBOUM3QzYwMUQzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRW50aXR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdDRDAyNDIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZWN1cml0eVJvbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkNCi18cm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlDQotfHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLg0KLXwNCi18RXhhbXBsZToNCi18DQotfCAgICA8c2VjdXJpdHktcm9sZT4NCi18ICAgIDxkZXNjcmlwdGlvbj4NCi18ICAgICAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQNCi18ICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uDQotfCAgICA8L2Rlc2NyaXB0aW9uPg0KLXwgICAgPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPg0KLXwgICAgPC9zZWN1cml0eS1yb2xlPg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzMjY5MDE1OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQGRlcHJlY2F0ZWQgU2VlIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicm9sZU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzMjdEMDE0RCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZS4gVGhpcyBlbGVtZW50IG11c3QgY29udGFpbiBhIG5vbi1lbXB0eSBzdHJpbmcuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJSZXNvdXJjZUVudlJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMjA3MjAwRDMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lDQotfHJlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhDQotfERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QNCi18YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MNCi18ZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlDQotfHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZg0KLXx0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlDQotfERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuDQotfA0KLXxFeGFtcGxlOg0KLXwNCi18PHJlc291cmNlLWVudi1yZWY+DQotfCAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlDQotfCAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4NCi18ICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlDQotfCAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4NCi18PC9yZXNvdXJjZS1lbnYtcmVmPg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyMUMyMDE3NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSByZXNvdXJjZSBlbnYgcmVmLg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjIxQ0QwM0MxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lDQotfCAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcw0KLXwgICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4NCi18ICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQ0KLXwgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdA0KLXwgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJlc1NoYXJpbmdTY29wZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjI4OEMwMEEzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNoYXJlYWJsZT0wDQotfFVuc2hhcmVhYmxlPTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlNoYXJlYWJsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjI4QUUwMEEyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVW5zaGFyZWFibGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyOEIwMDI3QyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJFSkJMb2NhbFJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzOTg4NjJFMjAxMDEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuMw0KLXxUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvcg0KLXx0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwNCi18aG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOg0KLXwNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24NCi18ICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50DQotfCAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4NCi18ICAgIC0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlDQotfCAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlDQotfCAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNFOTFFNjZBMDM3NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYWxIb21lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRCRTlFMTAzNUQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2FsIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRCRTlFQzAwQjkiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJSdW5Bc1NwZWNpZmllZElkZW50aXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyQzlFMDJDOCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgICAgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyRDBGMDEzMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5SWRlbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzA0MDI0NSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSWRlbnRpdHkiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjJEQTQwMDU4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjJEREMwMEIzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHJ1biBhcyBpZGVudGl0eS4NCi18DQotfFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJvbGVOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkRFQjAwRjEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuDQotfA0KLXxUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJJY29uVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBOTlFRTAwM0EiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMNCi18dGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yDQotfEpQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGENCi18R1VJIHRvb2wuDQotfA0KLXxUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlDQotfGljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQ0KLXxieSBkZWZhdWx0Lg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic21hbGxJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOUExNjAyN0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlDQotfCAgICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQ0KLXwgICAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudA0KLXwgICAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4NCi18DQotfCAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4NCi18ICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXJnZUljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5QTFEMDBFMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUNCi18ICAgICAgICBjb250YWluaW5nIGEgbGFyZ2UNCi18ICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlDQotfCAgICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudA0KLXwgICAgICAgIEZpbGUuDQotfA0KLXwgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuDQotfCAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4NCi18DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5QUMxMDFDNCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRpc3BsYXlOYW1lIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEE5OTIyMDAwRSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZA0KLXx0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lDQotfGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuDQotfA0KLXxFeGFtcGxlOg0KLXwNCi18Li4uDQotfCAgIDxkaXNwbGF5LW5hbWUgeG1sOmxhbmc9ImVuIj5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4NCi18DQotfFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOTkzQzAxMDYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOTk1MTAzNDEiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlRGVzdGluYXRpb25SZWYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QzFGNTIwMjhDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbg0KLXxvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24NCi18YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncw0KLXxlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6DQotfA0KLXwgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24NCi18ICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lDQotfCAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlDQotfCAgICAgICAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUNCi18ICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yDQotfCAgICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoDQotfCAgICAgICAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24NCi18DQotfEV4YW1wbGVzOg0KLXwNCi18PG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPg0KLXwgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlDQotfCAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPg0KLXwgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlDQotfCAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+DQotfCAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMNCi18ICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+DQotfCAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MNCi18ICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4NCi18PC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMxRjdDMDFEOCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzFGOTEwMDAyIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzFGOUUwMkFBIg0KLQkJICAgIHR5cGUgICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFQUVEMUMyMDBBOCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMxRkJGMDBFRSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VEZXN0aW5hdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQ0KLXxkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMNCi18ZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuDQotfA0KLXxUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOg0KLXwNCi18ICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUNCi18ICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24NCi18ICAgICAgICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlDQotfCAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQ0KLXwgICAgICAgICAgRGVwbG95bWVudCBGaWxlLg0KLXwNCi18RXhhbXBsZToNCi18DQotfDxtZXNzYWdlLWRlc3RpbmF0aW9uPg0KLXwgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzDQotfCAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+DQotfDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0U5RDVGQzYwMTFDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyQ0ZDMDNDRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhDQotfCAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUNCi18ICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zDQotfCAgICAgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJQYXJhbVZhbHVlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUNCi18cGFyYW1ldGVyL3ZhbHVlIGxpc3RzLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIyNDMwMjE3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MjZEMDNDNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNzg2OEJFMDIzNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRlc2NyaXB0aW9uR3JvdXAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkDQotfGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4NCi0JICAgICkNCi0JKG9iamVjdCBDbGFzcyAiSk5ESUVudlJlZnNHcm91cCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTM5NTAzNDkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQNCi18cmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0IxRjgwMDZDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiU2VjdXJpdHlJZGVudGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMkMwNDAyNDUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0DQotfGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg3MUMyMDI3OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlVzZUNhbGxlcklkZW50aXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyQzkwMDJGMCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZSBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyRDBBMDA3RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5SWRlbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzA0MDI0NSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGVzY3JpcHRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8NCi18cHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzDQotfHRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUNCi18RGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cw0KLXx0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncw0KLXxEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlDQotfHRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkNCi18dGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdA0KLXxjb250YWlucyB0aGUgZGVzY3JpcHRpb24uDQotfA0KLXxUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUNCi18ZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFuZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTk4RTAwMUFFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTk4RTkwMERGIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFQUVEMUMyMDBBOCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDb25zdW1lcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VBRUQxREQwMTZGIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUHJvZHVjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQUVEMUY0MDE5MCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNvbnN1bWVzUHJvZHVjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQUVEMUY5MDMzMiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJRTmFtZSINCi0JICAgIHF1aWQgICAgICAgCSIzRjNCRUY1RDAyQzAiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjNCRUY3MDAwREQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2FsUGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0YzQkVGREUwMjMwIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21iaW5lZFFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOTFEMTAwRkEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImludGVybmFsUHJlZml4T3JOc1VSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzdERDIwM0I2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTGlzdGVuZXIiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgbW92ZWQgZnJvbSB3ZWJhcHANCi18DQotfERlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDU4QUU3OTAxNDEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpKQ0KLQkob2JqZWN0IENsYXNzICJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JICAgIHF1aWQgICAgICAgCSI0MDIzQURGMjAxOTciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUU4NzAxRDgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzbWFsbEljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNBRTEzMDE0NSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFyZ2VJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUUxRDAwOUYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUUyNTAyOUYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc3BsYXlOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUUzMDAxQzkiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ2MzJBMDA1QyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIvbGlua2VkU2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NjMyQjAxNkMiDQotCQkgICAgbGFiZWwgICAgICAJIi9saW5rZWRTZWN1cml0eVJvbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMUZFMDEyRCINCi0JCSAgICBrZXlzICAgICAgIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjA1NDAxRDMiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NjMyQjAxQkMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDN0EwMDI1QyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIHF1aWQgICAgICAgCSIzOThFRDI5ODAyODUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiL2xpbmtlZEVKQiINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4RUQyOUEwMEIxIg0KLQkJICAgIGxhYmVsICAgICAgCSIvbGlua2VkRUpCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICBrZXlzICAgICAgIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjA2QTAxMTYiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOThFRDI5QTAxNTEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzOTk3ODRBNzAyQkEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQ0KLXwgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlDQotfCAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yDQotfCAgICAgICAgaW50ZXJmYWNlLg0KLQkgICAgDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5Nzg0QTgwMkE3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlDQotfCAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUNCi18ICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3INCi18ICAgICAgICBpbnRlcmZhY2UuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5Nzg0QTgwMkQwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VFbnZSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMkRCNTAyM0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaWRlbnRpdHkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyREI2MDFEMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiT3B0aW9uYWwgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiINCi0JCSAgICBsYWJlbCAgICAgIAkiaWRlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEQTQwMDU4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjJEQjYwMUQyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UnVuQXNTcGVjaWZpZWRJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOUUwMkM4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzMyMDE1MiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJpY29ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzMzUwMDE2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJpY29ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Okljb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTlFRTAwM0EiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDMzNTAwMkEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzU0MDEzMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkaXNwbGF5TmFtZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzU1MDE1MiINCi0JCSAgICBsYWJlbCAgICAgIAkiZGlzcGxheU5hbWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OTIyMDAwRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDM1NTAxNjYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzREMDI1NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzRFMDEyQSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDM0RTAxNTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMyM0VEMDBDNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMyM0VFMDE1MyINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjNFRTAxNjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMEIzNzAwNUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMEIzODAwODQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzBCMzgwMDhFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RW52RW50cnkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiM0U1M0VEOTAwMjg5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0VEOTEwMUVBIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNFRDkxMDI2MiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjZEQzAzRTYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjZERTAyREIiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI2REUwMzAzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMyMzgwMDI5NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMyMzgyMDExQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjM4MjAxMkYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZUVudlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwNzIwMEQzIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJkZXNjcmlwdGlvbnMiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QzA5NzgwMjJFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzA5NzkwMjMwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMwOTc5MDIzQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjAyMTAwMzEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjAyMTAxQ0MiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIwMjEwMUUwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMUY1MjAyOEMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNTY3OUZFMDA4NyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTY3OUZFMDM0NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2NzlGRTAzNjIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eUlkZW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMyMjI3MDA5MCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMyMjI3MDNDNSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjIyNzAzRDkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIg0KLQkgICAgcXVpZCAgICAgICAJIjNFOTVDQTY2MDA2NSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U5NUNBNjYwMzJDIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFOTVDQTY2MDM1RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OklkZW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkRBNDAwNTgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlJlZnMgdG8gUmVzb3VyY2VzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ0Rjg0MDJFNSINCi0JICAgIHRpdGxlICAgICAgCSJSZWZzIHRvIFJlc291cmNlcyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMjcyMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWZUeXBlIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU0NSwgNDQxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjM4MiwgMzU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRWpiUmVmVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjM4MiwgMzA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzIzDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTI2RkIwMDgxIg0KLQkJICAgIHdpZHRoICAgICAgCTM0NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMg0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDMyLCAyMTQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTcwMywgMTg5NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTEwDQotCQkJbWF4X3dpZHRoICAJMTQyMg0KLQkJCWxhYmVsICAgICAgCQ0KLXxAdmVyc2lvbiBKMkVFMS4zIA0KLXxBRERFRCByZXNTaGFyaW5nU2NvcGU6UmVzU2hhcmluZ1Njb3BlVHlwZQ0KLXwNCi18VGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6DQotfCAgICAgU2hhcmVhYmxlDQotfCAgICAgVW5zaGFyZWFibGUNCi18ICAgIA0KLXxUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHdpZHRoICAgICAgCTE0ODINCi0JCSAgICBoZWlnaHQgICAgIAk1MTkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzU2hhcmluZ1Njb3BlVHlwZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ3MiwgMjI1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDI0OSwgMjE2OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc1NoYXJpbmdTY29wZVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDI0OSwgMjExOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjI4OEMwMEEzIg0KLQkJICAgIHdpZHRoICAgICAgCTQ2NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE2OTAsIDIyNjEpDQotCQkJKDcwNCwgMjI2MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMjI2MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA0LCAyMjYxKSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2MywgMTY5MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDE0MDAsIDE1OTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMTA5MA0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGVkOg0KLXxkZXNjcmlwdGlvbiBiZWNvbWVzIGRlc2NyaXB0aW9uczpMaXN0PERlc2NyaXB0aW9uVHlwZT4NCi18bGluayBiZWNvbWVzID8/DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTExNTANCi0JCSAgICBoZWlnaHQgICAgIAkyMDApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAxNDUxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTUxOCwgMTM3NSkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlUmVmIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjYyNCwgMTQyNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDI0NDYsIDEyOTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA2MywgMTQ1NCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQTAwNUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL2xpbmtlZFNlY3VyaXR5Um9sZSIgQDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTUxLCAxNzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTANCi0JCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJCWxvY2F0aW9uICAgCSgxOTEyLCAxNDk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbGlua2VkU2VjdXJpdHlSb2xlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQwNDYyNA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQjAxNkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA2MywgMTQ1NCkNCi0JCQkJKDE2ODksIDE0NTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA2MywgMTQ1NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2ODksIDE0NTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTczOSwgMTQwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODY3MDUyDQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTUxLCAxNzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2MSwgMTQxMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMUJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNjMsIDE0NTQpDQotCQkJCSgyNDM3LCAxNDU0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNjMsIDE0NTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDM3LCAxNDU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJCWxvY2F0aW9uICAgCSgyMjk1LCAxNDU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJNQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIm5hbWUgOiBTdHJpbmciDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTEyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVKQkxvY2FsUmVmIiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDczNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSgxMDksIDYwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkxvY2FsUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg2MkUyMDEwMSINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAyNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJbG9jYXRpb24gICAJKDEyMTQsIDI2MDIpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTI0Ng0KLQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIiBAMTcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQxNiwgMjYwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCWxvY2F0aW9uICAgCSgxNTEsIDI0ODEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNvdXJjZUVudlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQ3LCAyNjgxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OTc4NEE3MDJCQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0eXBlIiBAMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA3NzcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyNiwgMjczNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTYzMzUNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5Nzg0QTgwMkE3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTQ3LCAyNjgxKQ0KLQkJCQkoMTIwNSwgMjY4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDcsIDI2ODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCAyNjgxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJCWxvY2F0aW9uICAgCSgxMTQ5LCAyNjI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43ODM2OTENCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDc3NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk3ODRBODAyRDAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NDcsIDI2ODEpDQotCQkJCSg2OTAsIDI2ODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQ3LCAyNjgxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjkwLCAyNjgxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDI0MTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMNCi0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgMjMxNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBAMjQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAxMiwgMjUxOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjM4MDAyOTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEAyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTcxLCAxOTk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2DQotCQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQkJbG9jYXRpb24gICAJKDc1NSwgMjQ3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzODIwMTJGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAxMiwgMjUxOCkNCi0JCQkJKDY5MCwgMjUxOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDEyLCAyNTE4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjkwLCAyNTE4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTcxLCAxOTk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDEwNjIsIDI0ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC4xNTg0MTYNCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzODIwMTFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAxMiwgMjUxOCkNCi0JCQkJKDEzMzUsIDI1MTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAxMiwgMjUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMzUsIDI1MTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDEyNzUsIDI0ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgxODQ4Mg0KLQkJCQloZWlnaHQgICAgIAkzMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZVJlZiIgQDMwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDE3MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQlsb2NhdGlvbiAgIAkoMTAxLCAxNTA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTc5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzb3VyY2VSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc5MzAzQzYiDQotCQkgICAgd2lkdGggICAgICAJODA4DQotCQkgICAgaGVpZ2h0ICAgICAJNDY2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDMxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUAzMA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjkwLCAxODk3KQ0KLQkJCSg5MDAsIDE4OTcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE4OTcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTg5NykpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDMyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzANCi0JCSAgICBzdXBwbGllciAgIAlANQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5MDAsIDE3MTYpDQotCQkJKDEzODcsIDE3MDQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAzMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYwMCwgNTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDE0NzIsIDQxMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBAMzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoODE1LCA3MzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjNFRDAwQzUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMzUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA3LCAtMTA4NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDM1DQotCQkJCWxvY2F0aW9uICAgCSgxMjIxLCA1ODIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42ODEzNDcNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzRUUwMTUzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODE1LCA3MzUpDQotCQkJCSg4MTUsIDYyMikNCi0JCQkJKDE0NjMsIDYyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTUsIDczNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjMsIDYyMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5MiwgNTg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDgwMzENCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBAMzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA3LCAtMTA4NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjNFRTAxNjciDQotCQkJICAgIGNsaWVudCAgICAgCUAzNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MTUsIDczNSkNCi0JCQkJKDgxNSwgMTQ5NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTUsIDczNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMTQ5NCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDM5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE2NDgsIDE5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJbG9jYXRpb24gICAJKDE1NTQsIDg4KQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNg0KLQkJICAgIGhlaWdodCAgICAgCTIzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiIgQDQwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MA0KLQkJCWxvY2F0aW9uICAgCSgxMTAsIDc2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRWpiUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTQxNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImRlc2NyaXB0aW9ucyIgQDQxDQotCQkgICAgbG9jYXRpb24gICAJKDk2OSwgNDAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzA5NzgwMjJFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDQyDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKDY4MSwgMTQ0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzDQotCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJbG9jYXRpb24gICAJKDEyNzAsIDM2NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwODYwMg0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMDk3OTAyMzAiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NjksIDQwMCkNCi0JCQkJKDE0NjMsIDQwMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDQwMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjMsIDQwMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3NSwgMzYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMS4wMjU4MDYNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0IiBANDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjgxLCAxNDQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzA5NzkwMjNBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTY5LCA0MDApDQotCQkJCSg0NzUsIDQwMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjksIDQwMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ3NSwgNDAwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA0Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDEwLCAxNDEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4RUQyOTgwMjg1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9saW5rZWRFSkIiIEA0Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MzgsIC0yMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMzNiwgMTAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbGlua2VkRUpCIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYxMTI3Ng0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOThFRDI5QTAwQjEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDEwLCAxNDEpDQotCQkJCSgxNTQ1LCAxNDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAxMCwgMTQxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0NSwgMTQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ3DQotCQkJCWxvY2F0aW9uICAgCSgxNDUwLCAxNjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyNDYwNw0KLQkJCQloZWlnaHQgICAgIAkyMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDYNCi0JCQkgICAgbG9jYXRpb24gICAJKDczOCwgLTIxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OEVEMjlBMDE1MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ2DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMTAsIDE0MSkNCi0JCQkJKDQ3NSwgMTQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMTAsIDE0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ3NSwgMTQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDUwDQotCQkJCWxvY2F0aW9uICAgCSg2MTYsIDE0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTUNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJuYW1lIDogU3RyaW5nIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U5MUU2NkEwMzc0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyODgsIDU5NikNCi0JCQkoMjg4LCA0ODApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlY3VyaXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCNzk1MUY4MDE4RCINCi0JICAgIHRpdGxlICAgICAgCSJTZWN1cml0eSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhDQotfCAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lDQotfCAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYNCi18ICAgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGENCi18ICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MNCi18ICAgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZA0KLXwgICAgICAgIGNvbnRleHQuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgIDxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPg0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTgzNw0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpVc2VDYWxsZXJJZGVudGl0eSIgQDUzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDIxMTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQlsb2NhdGlvbiAgIAkoNDExLCAyMDQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVXNlQ2FsbGVySWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkM5MDAyRjAiDQotCQkgICAgd2lkdGggICAgICAJMjIwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEA1NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDE2LCAxMjMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTQNCi0JCQlsb2NhdGlvbiAgIAkoMTY1LCAxMDI4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50ZXJwcmlzZUJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgd2lkdGggICAgICAJNTIwDQotCQkgICAgaGVpZ2h0ICAgICAJNDMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0IiBANTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE2NjQsIDE1MDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQlsb2NhdGlvbiAgIAkoMTI4MSwgMTI3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3NjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgd2lkdGggICAgICAJNzg0DQotCQkgICAgaGVpZ2h0ICAgICAJNDgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlJZGVudGl0eSIgQDU2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4NjQsIDE2NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQlsb2NhdGlvbiAgIAkoNjg2LCAxNTg2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlJZGVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzA0MDI0NSINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEMEEwMDdGIg0KLQkJICAgIGNsaWVudCAgICAgCUA1Mw0KLQkJICAgIHN1cHBsaWVyICAgCUA1Ng0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg1ODAsIDIwMjgpDQotCQkJKDc5MiwgMTc1NCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEA1OA0KLQkJICAgIGxvY2F0aW9uICAgCSg3MDUsIDE1MTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMUYwMThGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTgNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTksIC0yNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MA0KLQkJCQlQYXJlbnRfVmlldyAJQDU5DQotCQkJCWxvY2F0aW9uICAgCSg2MjUsIDE0OTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzIwMDI2NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDU4DQotCQkJICAgIHN1cHBsaWVyICAgCUA1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcwNSwgMTUxMCkNCi0JCQkJKDY0MSwgMTQ0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlJZGVudGl0eSIgQDYxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANTgNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTksIC0yNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJCWxvY2F0aW9uICAgCSg1NjYsIDE1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5SWRlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCS0wLjYwMzc0Ng0KLQkJCQloZWlnaHQgICAgIAkxNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMjAwMjYzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzA1LCAxNTEwKQ0KLQkJCQkoNzcwLCAxNTczKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJCWxvY2F0aW9uICAgCSg4MTQsIDE1MTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4OTU3Ng0KLQkJCQloZWlnaHQgICAgIAk3Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiIEA2NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCAzMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQlsb2NhdGlvbiAgIAkoMTU4LCAyMTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIiBANjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1ODQsIDMwNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCWxvY2F0aW9uICAgCSgxNDA2LCAyMDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDY2DQotCQkgICAgbG9jYXRpb24gICAJKDk2MCwgMjgxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MzJBMDA1QyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBANjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM4MSwgLTEwNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJCWxvY2F0aW9uICAgCSg3MDUsIDIwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC41ODUwNTINCi0JCQkJaGVpZ2h0ICAgICAJNzgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMUJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTYwLCAyODEpDQotCQkJCSg1MjMsIDI4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjAsIDI4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMywgMjgxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJCWxvY2F0aW9uICAgCSg2NjQsIDI4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTUNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJuYW1lIDogU3RyaW5nIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL2xpbmtlZFNlY3VyaXR5Um9sZSIgQDcwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANjYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zODEsIC0xMDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzENCi0JCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3MiwgMjM4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbGlua2VkU2VjdXJpdHlSb2xlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ4NzExMw0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQjAxNkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NjAsIDI4MSkNCi0JCQkJKDEzOTcsIDI4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjAsIDI4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTcsIDI4MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMzQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTY5MDcNCi0JCQkJaGVpZ2h0ICAgICAJNjENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UnVuQXNTcGVjaWZpZWRJZGVudGl0eSIgQDczDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCAyMTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDczDQotCQkJbG9jYXRpb24gICAJKDg5NCwgMjA3OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkM5RTAyQzgiDQotCQkgICAgd2lkdGggICAgICAJNDcwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBANzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMywgMTkwNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJFMDI1NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEA3NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc0DQotCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIC0xNjgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5MywgMTc1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkYwMThFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxMywgMTkwNSkNCi0JCQkJKDE0NTAsIDE3NDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJ1bkFzIiBANzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCAtMTY4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4DQotCQkJCVBhcmVudF9WaWV3IAlANzcNCi0JCQkJbG9jYXRpb24gICAJKDExNzIsIDE5ODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3J1bkFzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxNzM2MA0KLQkJCQloZWlnaHQgICAgIAk1Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRjAxODQiDQotCQkJICAgIGNsaWVudCAgICAgCUA3NA0KLQkJCSAgICBzdXBwbGllciAgIAlANzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzEzLCAxOTA1KQ0KLQkJCQkoMTE3MywgMjA2NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NiwgMjAxMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNDM3OTYzDQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkQwRjAxMzAiDQotCQkgICAgY2xpZW50ICAgICAJQDczDQotCQkgICAgc3VwcGxpZXIgICAJQDU2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEwODUsIDIwNjUpDQotCQkJKDkxNCwgMTc1NCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDgxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCA4ODApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODENCi0JCQlsb2NhdGlvbiAgIAkoOTkyLCA3NzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDgyDQotCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTI4MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTY3OUZFMDA4NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA4Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjAsIC0zODQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4MSwgMTEwNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1MDQwMw0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1Njc5RkUwMzQ0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODINCi0JCQkgICAgc3VwcGxpZXIgICAJQDgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTg3LCAxMjgzKQ0KLQkJCQkoMTA4MCwgOTk0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDgzDQotCQkJCWxvY2F0aW9uICAgCSgxMDA3LCAxMDQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NzM3NTgNCi0JCQkJaGVpZ2h0ICAgICAJNTcNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAODYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwLCAtMzg0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTY3OUZFMDM2MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDgyDQotCQkJICAgIHN1cHBsaWVyICAgCUA1Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk4NywgMTI4MykNCi0JCQkJKDg5MiwgMTU3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDg3DQotCQkgICAgbG9jYXRpb24gICAJKDQ4MiwgODY5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1M0VEOTAwMjg5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDg4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkgICAgbG9jYXRpb24gICAJKDc2LCA1MTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQlsb2NhdGlvbiAgIAkoODE0LCA4MzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42NjIwODgNCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0VEOTEwMUVBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDgyLCA4NjkpDQotCQkJCSg5ODMsIDg2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0ODIsIDg2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4MywgODY5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MA0KLQkJCQlQYXJlbnRfVmlldyAJQDg4DQotCQkJCWxvY2F0aW9uICAgCSg5MTksIDkyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODcyODQ1DQotCQkJCWhlaWdodCAgICAgCTUxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkgICAgbG9jYXRpb24gICAJKDc2LCA1MTMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0VEOTEwMjYyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDgyLCA4NjkpDQotCQkJCSgzNzgsIDg2OSkNCi0JCQkJKDM3OCwgNDczKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ4MiwgODY5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzc4LCA0NzMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEA5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjM0LCA3NTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2REMwM0U2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxIiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2NCwgLTg5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDE1OTMsIDQ4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2REUwMzAzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYzNCwgNzUxKQ0KLQkJCQkoMTYzNCwgNDE3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzQsIDQxNykpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2NCwgLTg5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDMsIDc3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU3NTAwMA0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjZERTAyREIiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjM0LCA3NTEpDQotCQkJCSgxNjM0LCA4MTEpDQotCQkJCSgxMjU3LCA4MTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYzNCwgNzUxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1NywgODExKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA4NDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMTA3NQ0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJZGVudGl0eSIgQDk4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDMyLCAyMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJbG9jYXRpb24gICAJKDE3NjcsIDIwMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJZGVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyREE0MDA1OCINCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAOTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1NiwgMjExOSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkRCNTAyM0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDEwMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjgyLCA5MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDANCi0JCQkJbG9jYXRpb24gICAJKDEzOTUsIDIwODEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYyREI2MDFEMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NTYsIDIxMTkpDQotCQkJCSgxMzU1LCAyMTIyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eSIgQDEwMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjgyLCA5MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJbG9jYXRpb24gICAJKDE2NTMsIDIwNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2lkZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjQ4MzUyOA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkRCNjAxRDEiDQotCQkJICAgIGNsaWVudCAgICAgCUA5OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAOTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTU2LCAyMTE5KQ0KLQkJCQkoMTc1NywgMjExNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0DQotCQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJCWxvY2F0aW9uICAgCSgxNjk5LCAyMTU5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MTAzMjcNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjEyMiwgMTA1NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFOTVDQTY2MDA2NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAxMDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDg4LCAtMTA1NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQkJbG9jYXRpb24gICAJKDE0MTEsIDEwMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44Mzc2MDcNCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U5NUNBNjYwMzJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA1DQotCQkJICAgIHN1cHBsaWVyICAgCUA4MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIxMjIsIDEwNTcpDQotCQkJCSgyMTIyLCA5ODIpDQotCQkJCSgxMjU3LCA5ODIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjEyMiwgMTA1NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTcsIDk4MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4DQotCQkJCVBhcmVudF9WaWV3IAlAMTA2DQotCQkJCWxvY2F0aW9uICAgCSgxMzAyLCA5MjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MTgyNg0KLQkJCQloZWlnaHQgICAgIAk2Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxMDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDg4LCAtMTA1NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTk1Q0E2NjAzNUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjEyMiwgMTA1NykNCi0JCQkJKDIxMjIsIDE5OTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjEyMiwgMTA1NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjIsIDE5OTgpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVudiBFbnRyaWVzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5OTgyNUQ5MDIyOCINCi0JICAgIHRpdGxlICAgICAgCSJFbnYgRW50cmllcyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bw0KLXxwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMNCi18dGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQ0KLXxEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzDQotfHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzDQotfERlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUNCi18dG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQ0KLXx0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0DQotfGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4NCi18DQotfFRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQ0KLXxkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuDQotCSAgICANCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxODYzDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVudkVudHJ5VHlwZSIgQDExMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNCwgMTkyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQlsb2NhdGlvbiAgIAkoOTcxLCAxNjY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW52RW50cnlUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJbG9jYXRpb24gICAJKDk3MSwgMTYxOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyMw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhCREQ3QTYwMzE1Ig0KLQkJICAgIHdpZHRoICAgICAgCTM0NA0KLQkJICAgIGhlaWdodCAgICAgCTY0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTExDQotCQkgICAgbG9jYXRpb24gICAJKDIwMzQsIDE4OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTExDQotCQkJbG9jYXRpb24gICAJKDE1OTYsIDE4MTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJODQwDQotCQkJbGFiZWwgICAgICAJDQotfEB2ZXJzaW9uIEoyRUUxLjMNCi18QURERUQgamF2YS5sYW5nLkNoYXJhY3RlciB0byBFbnZFbnRyeVR5cGUNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHdpZHRoICAgICAgCTkwMA0KLQkJICAgIGhlaWdodCAgICAgCTE2OSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTEyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgY2xpZW50ICAgICAJQDExMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMTANCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTU4MywgMTg5NCkNCi0JCQkoMTMwNiwgMTg5NCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU4MywgMTg5NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNiwgMTg5NCkpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQwLCA5NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJbG9jYXRpb24gICAJKDM4MCwgODcyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTEwODQNCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRlZDoNCi18ZGVzY3JpcHRpb24gYmVjb21lcyBkZXNjcmlwdGlvbnM6TGlzdDxEZXNjcmlwdGlvblR5cGU+DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTExNDQNCi0JCSAgICBoZWlnaHQgICAgIAkxNTcpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxMTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJbG9jYXRpb24gICAJKDEzMTIsIDExMTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFbnZFbnRyeSIgQDExNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCAxMzI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExNQ0KLQkJCWxvY2F0aW9uICAgCSgxOTMsIDExNTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzgyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnZFbnRyeSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JCSAgICB3aWR0aCAgICAgIAk0MDANCi0JCSAgICBoZWlnaHQgICAgIAkzNzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTE2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4MjYsIDEwMjIpDQotCQkJKDU4NCwgMTE4OSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDExNw0KLQkJICAgIGxvY2F0aW9uICAgCSg5NDMsIDEyNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMEIzNzAwNUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzgsIDEwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE1NywgMTE5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYxMjEwMA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMEIzODAwODQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MywgMTI2OCkNCi0JCQkJKDEzMDIsIDEyMjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDExOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyOSwgMTI4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzgzODM3DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDEyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDc4LCAxMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMEIzODAwOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MywgMTI2OCkNCi0JCQkJKDU4NCwgMTMwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTmV3IEoyRUUxLjQgRGF0YXR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEJFNTYxMDEwNyINCi0JICAgIHRpdGxlICAgICAgCSJOZXcgSjJFRTEuNCBEYXRhdHlwZXMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3INCi18dGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsDQotfGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoNCi18DQotfCAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudA0KLXwgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4NCi18ICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQ0KLXwgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQ0KLXwgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMjcyNA0KLQkgICAgb3JpZ2luX3kgICAJNDgxDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBMYWJlbCBAMTIyDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODUsIDMxNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxNA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCBCbGFjayINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMg0KLQkJICAgIG1heF93aWR0aCAgCTE2NjMNCi0JCSAgICBsYWJlbCAgICAgIAkNCi18TmV3IHR5cGVzIGFuZCBkYXRhdHlwZXMgaW50cm9kdWNlZCBmb3IgSjJFRTEuNA0KLXwoQ29ycmVzcG9uZHMgdG8gajJlZV8xXzQueHNkKQ0KLQkJICAgICkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiIEAxMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4OTgsIDE5MDMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTIzDQotCQkJbG9jYXRpb24gICAJKDI1OTUsIDE3OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjA2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQlsb2NhdGlvbiAgIAkoMjU5NSwgMTc0NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0VBRUQxQzIwMEE4Ig0KLQkJICAgIHdpZHRoICAgICAgCTYyNA0KLQkJICAgIGhlaWdodCAgICAgCTM0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMTI0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTY4LCAyNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCWxvY2F0aW9uICAgCSgxNjIyLCAyMjYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc0NDcwMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiDQotCQkgICAgd2lkdGggICAgICAJNzEwDQotCQkgICAgaGVpZ2h0ICAgICAJMzM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uUmVmIiBAMTI1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTY4LCAxODg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCWxvY2F0aW9uICAgCSgxNTE1LCAxNzMyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTkwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzFGNTIwMjhDIg0KLQkJICAgIHdpZHRoICAgICAgCTkyNA0KLQkJICAgIGhlaWdodCAgICAgCTMzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxMjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMyMDIsIDY0NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQlsb2NhdGlvbiAgIAkoMzAyMywgNTk2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDEyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQyNCwgMTAwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQlsb2NhdGlvbiAgIAkoMzI1NSwgOTAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIHdpZHRoICAgICAgCTM1Ng0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1IiBAMTI4DQotCQkgICAgbG9jYXRpb24gICAJKDI3NDUsIDE0MTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjAyMTAwMzEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDMsIC03NzcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwDQotCQkJCVBhcmVudF9WaWV3IAlAMTI5DQotCQkJCWxvY2F0aW9uICAgCSgzMDIyLCAxMTkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjA2NzE3DQotCQkJCWhlaWdodCAgICAgCTUyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMDIxMDFDQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTI3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc0NSwgMTQxNykNCi0JCQkJKDMyNDUsIDExMTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzEyNCwgMTI0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzExNTY0DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDEzMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAzLCAtNzc3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMDIxMDFFMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTI1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc0NSwgMTQxNykNCi0JCQkJKDIyNDIsIDE3MTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAxMzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzI5NSwgNzk4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzREMDI1NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDEzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMywgLTc0NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJbG9jYXRpb24gICAJKDMyMTYsIDc0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzNEUwMTUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjk1LCA3OTgpDQotCQkJCSgzMjM5LCA3MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDEzNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMywgLTc0NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzYNCi0JCQkJbG9jYXRpb24gICAJKDMzMDUsIDg5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM0RTAxMkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMyOTUsIDc5OCkNCi0JCQkJKDMzNTEsIDg4OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCVBhcmVudF9WaWV3IAlAMTM2DQotCQkJCWxvY2F0aW9uICAgCSgzMzkxLCA4NTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIiBAMTM5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNDg4LCAxNTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzOQ0KLQkJCWxvY2F0aW9uICAgCSgzMjU2LCAxNDA1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFyYW1WYWx1ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDE0MA0KLQkJICAgIGxvY2F0aW9uICAgCSgzNDU0LCAxMjU5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMjcwMDkwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDE0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAtMTA1NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJbG9jYXRpb24gICAJKDMzMTcsIDExOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42Mzc1NzkNCi0JCQkJaGVpZ2h0ICAgICAJMTI5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjI3MDNDNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTI3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzQ1NCwgMTI1OSkNCi0JCQkJKDM0MzgsIDExMjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzQ5NCwgMTEzNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDE0NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAtMTA1NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIyNzAzRDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDANCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM0NTQsIDEyNTkpDQotCQkJCSgzNDcwLCAxMzkyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvbiIgQDE0NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjYwNSwgMTEzNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQlsb2NhdGlvbiAgIAkoMjQzMCwgMTAyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMTEwMDFDRiINCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpMaXN0ZW5lciIgQDE0Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA0OCwgMTA4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDYNCi0JCQlsb2NhdGlvbiAgIAkoMTk1NywgMTAzOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxpc3RlbmVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NDQ3MDMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkJICAgIHdpZHRoICAgICAgCTIwMA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxNDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCA4MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ3DQotCQkJbG9jYXRpb24gICAJKDE0MDYsIDc0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyNDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAxNDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5NCwgOTQ5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkMwMzVBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDE0OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgODI5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MA0KLQkJCQlQYXJlbnRfVmlldyAJQDE0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNywgOTgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0U2RDAyQ0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTQsIDk0OSkNCi0JCQkJKDE5NDcsIDEwMzEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxpc3RlbmVyQ2xhc3MiIEAxNTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDgyOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTENCi0JCQkJbG9jYXRpb24gICAJKDE2NTMsIDkyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkQwMkE3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzk0LCA5NDkpDQotCQkJCSgxNjQzLCA4NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4MiwgODI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMTU0DQotCQkgICAgbG9jYXRpb24gICAJKDI5NzYsIDE0NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTU0DQotCQkJbG9jYXRpb24gICAJKDI3OTksIDE0MDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJqYXZhIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTU0DQotCQkJbG9jYXRpb24gICAJKDI3OTksIDEzNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiDQotCQkgICAgd2lkdGggICAgICAJMzY2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIiBAMTU1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjk2LCA3MDMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTU1DQotCQkJbG9jYXRpb24gICAJKDE5NTAsIDU0NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3Ig0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTMzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FFODcwMUQ4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNTUNCi0JCSAgICBzdXBwbGllciAgIAlAMTI2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI2NTEsIDY3OSkNCi0JCQkoMzAxMywgNjU3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDA1OEFFNzkwMTQxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxNDYNCi0JCSAgICBzdXBwbGllciAgIAlAMTU1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIwODcsIDEwMjUpDQotCQkJKDIxODcsIDg3MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFOUQ1RkM2MDExQyINCi0JCSAgICBjbGllbnQgICAgIAlAMTQ1DQotCQkgICAgc3VwcGxpZXIgICAJQDE1NQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNTE5LCAxMDE1KQ0KLQkJCSgyNDE2LCA4NzEpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkoyRUUxLjQgRGVzY3JpcHRpb24gR3JvdXBzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NTgwMDNBOSINCi0JICAgIHRpdGxlICAgICAgCSJKMkVFMS40IERlc2NyaXB0aW9uIEdyb3VwcyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAk2NjkNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IExhYmVsIEAxNTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoODgsIDIwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxNA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTYwMA0KLQkJICAgIGxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiBHcm91cHMiKQ0KLQkJKG9iamVjdCBMYWJlbCBAMTYwDQotCQkgICAgbG9jYXRpb24gICAJKDEwMywgMzM0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMg0KLQkJICAgIG1heF93aWR0aCAgCTEyODENCi0JCSAgICBsYWJlbCAgICAgIAkiQW4gYWJzdHJhY3QgbWl4aW4gY2xhc3MgZm9yIGNvbW1vbmx5IHVzZWQgZGlzcGxheSBhbmQgZGVzY3JpcHRpb24gYXR0cmlidXRlcyIpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiIEAxNjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIzMzAsIDY3NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjENCi0JCQlsb2NhdGlvbiAgIAkoMjExNCwgNTczKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGlzcGxheU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWNvblR5cGUiIEAxNjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNjg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Mg0KLQkJCWxvY2F0aW9uICAgCSg0MzEsIDU1OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkljb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIHdpZHRoICAgICAgCTUyOA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMTYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY5LCA2NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYzDQotCQkJbG9jYXRpb24gICAJKDE0NDEsIDU3MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxNjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MDEsIDExNDEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY0DQotCQkJbG9jYXRpb24gICAJKDEyMjIsIDEwOTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDE2NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDg3LCAxMTUwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzU0MDEzMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkaXNwbGF5TmFtZXMiIEAxNjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3MzUsIDU3NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJbG9jYXRpb24gICAJKDIwNDMsIDg3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGlzcGxheU5hbWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgxODY2Mg0KLQkJCQloZWlnaHQgICAgIAkxODINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzNTUwMTUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTY1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDg3LCAxMTUwKQ0KLQkJCQkoMjIyNCwgMTE1MCkNCi0JCQkJKDIyMjQsIDc4OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDg3LCAxMTUwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNCwgNzg5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJbG9jYXRpb24gICAJKDIxNzEsIDgzOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDE2OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNSwgNTc0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzU1MDE2NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA4NywgMTE1MCkNCi0JCQkJKDE1ODksIDExNTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA4NywgMTE1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODksIDExNTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDE3MA0KLQkJICAgIGxvY2F0aW9uICAgCSg5MzcsIDEwODMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzMzIwMTUyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImljb25zIiBAMTcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODUsIDUwNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJbG9jYXRpb24gICAJKDEwNDksIDg0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraWNvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTEzNjY5DQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDMzNTAwMTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzNywgMTA4MykNCi0JCQkJKDkzNywgODIwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTA4MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkzNywgODIwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgODQzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MjA4NjMNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEAxNzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDU4NSwgNTA3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzM1MDAyQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTM3LCAxMDgzKQ0KLQkJCQkoOTM3LCAxMTQzKQ0KLQkJCQkoMTIxMywgMTE0MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDEwODMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEzLCAxMTQzKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTc1DQotCQkgICAgbG9jYXRpb24gICAJKDE1NzUsIDkzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM0RDAyNTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTc2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTc1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjIzLCAzNTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc3DQotCQkJCVBhcmVudF9WaWV3IAlAMTc2DQotCQkJCWxvY2F0aW9uICAgCSgxNDA3LCA4NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42MDgzOTINCi0JCQkJaGVpZ2h0ICAgICAJMTY5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzRFMDEyQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU3NSwgOTMyKQ0KLQkJCQkoMTU3NSwgNzg2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzUsIDkzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzUsIDc4NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc4DQotCQkJCVBhcmVudF9WaWV3IAlAMTc2DQotCQkJCWxvY2F0aW9uICAgCSgxNTIyLCA4MDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAxNzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyMjMsIDM1NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM0RTAxNTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzUsIDkzMikNCi0JCQkJKDE1NzUsIDEwNzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU3NSwgOTMyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3NSwgMTA3OSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIgQDE4MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyNiwgMTYwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODANCi0JCQlsb2NhdGlvbiAgIAkoMTA4MCwgMTQ1MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NDQ3MDMNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3Ig0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTMzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FFODcwMUQ4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxODANCi0JCSAgICBzdXBwbGllciAgIAlAMTY0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE0MTYsIDE0MzkpDQotCQkJKDE0MDQsIDEyMDMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkoyRUUxLjQgSk5ESSBFbnYgUmVmcyBHcm91cCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTQ3MDAxQkQiDQotCSAgICB0aXRsZSAgICAgIAkiSjJFRTEuNCBKTkRJIEVudiBSZWZzIEdyb3VwIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTE5NTYNCi0JICAgIG9yaWdpbl95ICAgCTIxNTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAxODINCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQ2MSwgMjEwNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODINCi0JCQlsb2NhdGlvbiAgIAkoMzEyMywgMTk4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk2NDANCi0JCQlsYWJlbCAgICAgIAkNCi18U2VlIGNvbW1vbiAiU2VjdXJpdHkiIGRpYWdyYW0NCi18Zm9yIG1vcmUgZGV0YWlscy4gIFRoaXMgZWxlbWVudCBpcyBub3cgY29tbW9uIHRvIG1vcmUgdGhhbiBqdXN0IHRoZSBlamIgc3BlYy4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNzAwDQotCQkgICAgaGVpZ2h0ICAgICAJMjU2KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxODMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NDQsIDI4MTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgzDQotCQkJbG9jYXRpb24gICAJKDE1NjUsIDI3NjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTM3Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5SWRlbnRpdHkiIEAxODQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjg4LCAyMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4NA0KLQkJCWxvY2F0aW9uICAgCSgyNTMyLCAyMDY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlJZGVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzA0MDI0NSINCi0JCSAgICB3aWR0aCAgICAgIAkzMzANCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTg1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMTgyDQotCQkgICAgc3VwcGxpZXIgICAJQDE4NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMTEwLCAyMTA4KQ0KLQkJCSgyODUzLCAyMTEwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIgQDE4Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4MTYsIDI2MjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTg2DQotCQkJbG9jYXRpb24gICAJKDI2OTcsIDI1NzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjM4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI1Ng0KLQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvblJlZiIgQDE4Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODQ4LCAyMzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4Nw0KLQkJCWxvY2F0aW9uICAgCSgyNjE3LCAyMzM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzFGNTIwMjhDIg0KLQkJICAgIHdpZHRoICAgICAgCTQ4MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIiBAMTg4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyMCwgMTg1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODgNCi0JCQlsb2NhdGlvbiAgIAkoMjU1NywgMTgxMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlRW52UmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwNzIwMEQzIg0KLQkJICAgIHdpZHRoICAgICAgCTM0NA0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlUmVmIiBAMTg5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc1MiwgMTYzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODkNCi0JCQlsb2NhdGlvbiAgIAkoMjYxOSwgMTU4NikNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjY2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNvdXJjZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzkzMDNDNiINCi0JCSAgICB3aWR0aCAgICAgIAkyODQNCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFbnZFbnRyeSIgQDE5MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MzYsIDE0MjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTkwDQotCQkJbG9jYXRpb24gICAJKDI2NDAsIDEzNzgpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW52RW50cnkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc3ODAwRTIiDQotCQkgICAgd2lkdGggICAgICAJMjEwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RUpCTG9jYWxSZWYiIEAxOTENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5MQ0KLQkJCWxvY2F0aW9uICAgCSgyNTg2LCAxMTcwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCTG9jYWxSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODYyRTIwMTAxIg0KLQkJICAgIHdpZHRoICAgICAgCTI4Ng0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiIgQDE5Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MzYsIDk3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOTINCi0JCQlsb2NhdGlvbiAgIAkoMjY1NSwgOTMwKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc4MjAyQjMiDQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCIgQDE5Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMjUyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCWxvY2F0aW9uICAgCSgxNTUzLCAyNDc4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM4Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSk5ESUVudlJlZnNHcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICB3aWR0aCAgICAgIAk0MDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAxOTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMxNiwgMjU4NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkZBOTAxQzkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVJlZnMiIEAxOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIDE2NTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2DQotCQkJCVBhcmVudF9WaWV3IAlAMTk1DQotCQkJCWxvY2F0aW9uICAgCSgyNTMyLCAyNjQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC41ODI1NTUNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGQUEwMkM1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxODYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzE2LCAyNTg3KQ0KLQkJCQkoMjY4OCwgMjU4NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzE2LCAyNTg3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4OCwgMjU4NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk3DQotCQkJCVBhcmVudF9WaWV3IAlAMTk1DQotCQkJCWxvY2F0aW9uICAgCSgyNjUwLCAyNTM0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDE5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgMTY1MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkZBQTAyQ0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzMTYsIDI1ODcpDQotCQkJCSgxOTQ0LCAyNTg3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTYsIDI1ODcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQ0LCAyNTg3KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDE5OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjEzLCAyMzQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyM0FBMDI0RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiBAMjAwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTk5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTk1LCAxNDEwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMjI5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZURlc3RpbmF0aW9uUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC4zMTQ0MzMNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDIzQUQwMUFBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxODcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjEzLCAyMzQ3KQ0KLQkJCQkoMjYwOCwgMjM0NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEzLCAyMzQ3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwOCwgMjM0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAyDQotCQkJCVBhcmVudF9WaWV3IAlAMjAwDQotCQkJCWxvY2F0aW9uICAgCSgyNTY3LCAyNDAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDIwMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NSwgMTQxMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjNBRDAxQjQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyMTMsIDIzNDcpDQotCQkJCSgxOTM2LCAyMzQ3KQ0KLQkJCQkoMTkzNiwgMjQ2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEzLCAyMzQ3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkzNiwgMjQ2NikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyMDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk1MSwgMTg1MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA5RjAwQzQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBAMjA1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAxMjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA2DQotCQkJCVBhcmVudF9WaWV3IAlAMjA1DQotCQkJCWxvY2F0aW9uICAgCSgxOTMzLCAyMzMwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA5RjAzOTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NTEsIDE4NTApDQotCQkJCSgxODkxLCAxODUwKQ0KLQkJCQkoMTg5MSwgMjQ2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUxLCAxODUwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMjQ2NikpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzb3VyY2VFbnZSZWZzIiBAMjA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAxMjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4DQotCQkJCVBhcmVudF9WaWV3IAlAMjA3DQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxODkzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzM4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZXNvdXJjZUVudlJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjk4MTEzDQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDlGMDM5NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk1MSwgMTg1MCkNCi0JCQkJKDI1NDgsIDE4NTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MSwgMTg1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI1NDgsIDE4NTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ4OCwgMTc5NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDIxMA0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxNjU4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjExDQotCQkJUGFyZW50X1ZpZXcgCUAyMTANCi0JCQlsb2NhdGlvbiAgIAkoMTg0MiwgMTY5NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQloaWRkZW4gICAgIAlUUlVFDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIiINCi0JCQlwY3REaXN0ICAgIAkwLjI1MDAwMA0KLQkJCWhlaWdodCAgICAgCTM2DQotCQkJb3JpZW50YXRpb24gCTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTM5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlUmVmcyIgQDIxMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTI5LCAxNDgyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ3MywgMTY0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzMDg3NQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxM0IiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4NTcsIDE2NTgpDQotCQkJCSgxODU3LCAxNTk4KQ0KLQkJCQkoMjYxMCwgMTU5OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODU3LCAxNjU4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYxMCwgMTU5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE0DQotCQkJCVBhcmVudF9WaWV3IAlAMjEyDQotCQkJCWxvY2F0aW9uICAgCSgyNTU5LCAxNTUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MzgwNTMNCi0JCQkJaGVpZ2h0ICAgICAJNDYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDIxNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTI5LCAxNDgyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkxNiwgMjQwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyNTAyMA0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxM0EiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4NTcsIDE2NTgpDQotCQkJCSgxODU3LCAyNDY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTcsIDE2NTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU3LCAyNDY2KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDIxNw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzk2LCAxNTA4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE4DQotCQkJUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQlsb2NhdGlvbiAgIAkoMTU4OCwgMTU0NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQloaWRkZW4gICAgIAlUUlVFDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIiINCi0JCQlwY3REaXN0ICAgIAktMi45NjY2NjcNCi0JCQloZWlnaHQgICAgIAkzNg0KLQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDEyRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnZpcm9ubWVudFByb3BlcnRpZXMiIEAyMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDQyMCwgOTQ4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDIxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2MSwgMTQ0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxODM2Nw0KLQkJCQloZWlnaHQgICAgIAk2Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxMkYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTYsIDE1MDgpDQotCQkJCSgxNzk2LCAxMzg2KQ0KLQkJCQkoMjYzMSwgMTM4NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxNTA4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzMSwgMTM4NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIxDQotCQkJCVBhcmVudF9WaWV3IAlAMjE5DQotCQkJCWxvY2F0aW9uICAgCSgyNTQwLCAxMzMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDYwNDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDIyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjIyDQotCQkJCWxvY2F0aW9uICAgCSgxNzA5LCAyNDAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuOTMyNjUzDQotCQkJCWhlaWdodCAgICAgCTg4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDEyRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc5NiwgMTUwOCkNCi0JCQkJKDE3OTYsIDI0NjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTUwOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDI0NjUpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMjI0DQotCQkgICAgbG9jYXRpb24gICAJKDE3NDAsIDE0MTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODYzODQwMTcyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYkxvY2FsUmVmcyIgQDIyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMTA3NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjUNCi0JCQkJbG9jYXRpb24gICAJKDIzNzIsIDExNDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYkxvY2FsUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDU2MzANCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODYzODUwMkFBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzQwLCAxNDExKQ0KLQkJCQkoMTc0MCwgMTE5NCkNCi0JCQkJKDI1NzcsIDExOTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc0MCwgMTQxMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI1NzcsIDExOTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ3MSwgMTI0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyMjgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDEwNzUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODYzODUwMkI0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzQwLCAxNDExKQ0KLQkJCQkoMTc0MCwgMjQ2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzQwLCAxNDExKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0MCwgMjQ2NikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY3NywgMTI0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMA0KLQkJCVBhcmVudF9WaWV3IAlAMjI5DQotCQkJbG9jYXRpb24gICAJKDE2NzcsIDExODkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSIiDQotCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQloZWlnaHQgICAgIAk2MA0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ1QUU0MDFGMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJSZWZzIiBAMjMxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzMsIDEwMDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMyDQotCQkJCVBhcmVudF9WaWV3IAlAMjMxDQotCQkJCWxvY2F0aW9uICAgCSgyNDM3LCA5NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYlJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuODI4MTk0DQotCQkJCWhlaWdodCAgICAgCTI0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ1QUU1MDMwMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY3NywgMTI0OCkNCi0JCQkJKDE2NzcsIDEwMDApDQotCQkJCSgyNjQ2LCAxMDAwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NzcsIDEyNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjQ2LCAxMDAwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzENCi0JCQkJbG9jYXRpb24gICAJKDI1NDcsIDEwNDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxOTIzNg0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBAMjM0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzMsIDEwMDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM1DQotCQkJCVBhcmVudF9WaWV3IAlAMjM0DQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMzI3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODg2MDk1DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ1QUU1MDA4MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDIyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY3NywgMTI0OCkNCi0JCQkJKDE2NzcsIDI0NjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY3NywgMTI0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDI0NjUpKSkpKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbkFyY2hpdmUubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY29tbW9uQXJjaGl2ZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTJiYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY29tbW9uQXJjaGl2ZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NDI4ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiSURFIg0KLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpKQ0KLSAgICBxdWlkICAgICAgIAkiM0EwQjI0NzQwMjVGIg0KLSAgICBlbmZvcmNlQ2xvc3VyZUF1dG9Mb2FkIAlGQUxTRQ0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjZBIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzM5Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2OSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQTBCMjQ3NDAyN0QiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJhcHBsaWNhdGlvbiINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxhcHBsaWNhdGlvbi5jYXQiDQotCQlxdWlkICAgICAgIAkiMzhDMDMwMDgwMTRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImNsaWVudCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxjbGllbnQuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzAyODA3MDBDMCIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlamIiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcZWpic2NoZW1hLmNhdCINCi0JCXF1aWQgICAgICAgCSIzNzgwRTI3MjAzMkQiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid2ViYXBwbGljYXRpb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcd2ViYXBwbGljYXRpb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzA3NkQ2MDNERCIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb25BcmNoaXZlQ29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxjb21tb25BcmNoaXZlQ29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiM0EwREI2OEIwMDQ2IikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY29tbW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwOEYwRjAzOEQiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamNhIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGpjYTFfMC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0M2MDkwNDIwMEJCIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY2xpZW50Ig0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYnNlcnZpY2VzX2NsaWVudF8xXzAuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNFNEQyRjRCMDJBQSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqc3AiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcanNwXzJfMC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0U0RDRGNjkwMzZCIikpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzYwIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJNjUwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSgxMTA0LCAxNjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYwLCA3NikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQ0KLQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbiIgQDINCi0JCQlsb2NhdGlvbiAgIAkoMTkwNCwgODE2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDczMikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiYXBwbGljYXRpb24iKQ0KLQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzhDMDMwMDgwMTRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpjbGllbnQiIEAzDQotCQkJbG9jYXRpb24gICAJKDIzNjgsIDExMDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMTAyMCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiY2xpZW50IikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzAyODA3MDBDMCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWpiIiBANA0KLQkJCWxvY2F0aW9uICAgCSg3NTIsIDg0OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTgsIDgxMykNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZWpiIikNCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDU5OCwgNzYzKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM3ODBFMjcyMDMyRCINCi0JCQl3aWR0aCAgICAgIAkzMjANCi0JCQloZWlnaHQgICAgIAkxODIpDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb24iIEA1DQotCQkJbG9jYXRpb24gICAJKDEyMTYsIDg4MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDcyLCA3OTYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIndlYmFwcGxpY2F0aW9uIikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzA3NkQ2MDNERCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amF2YSIgQDYNCi0JCQlsb2NhdGlvbiAgIAkoNjQwLCA0MTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg2LCAzODEpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImphdmEiKQ0KLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg2LCAzMzEpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiDQotCQkJd2lkdGggICAgICAJMzIwDQotCQkJaGVpZ2h0ICAgICAJMTgyKQ0KLQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANw0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUJEMzY2MDAwRkUiDQotCQkJY2xpZW50ICAgICAJQDYNCi0JCQlzdXBwbGllciAgIAlAMQ0KLQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSAgICAoNzY4LCAyNzApDQotCQkJICAgICg3NjgsIDE1OSkNCi0JCQkgICAgKDk1MywgMTU5KSkNCi0JCQlsaW5lX3N0eWxlIAkzDQotCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NjgsIDI3MCkNCi0JCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTUzLCAxNTkpKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmNvbW1vbiIgQDgNCi0JCQlsb2NhdGlvbiAgIAkoMTIwMCwgNDMyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDM0OCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiY29tbW9uIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlxdWlkdSAgICAgIAkiMzhGRjNDMTUwMTUxIg0KLQkJCWNsaWVudCAgICAgCUA1DQotCQkJc3VwcGxpZXIgICAJQDgNCi0JCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkgICAgKDEyMTAsIDczNSkNCi0JCQkgICAgKDEyMDMsIDUyMikpDQotCQkJbGluZV9zdHlsZSAJMCkNCi0JCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDEwDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJcXVpZHUgICAgICAJIjM4RkYzQzEwMDJBOCINCi0JCQljbGllbnQgICAgIAlAMg0KLQkJCXN1cHBsaWVyICAgCUA4DQotCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJICAgICgxNzU2LCA2NzEpDQotCQkJICAgICgxNzU2LCA1MTMpDQotCQkJICAgICgxMzUwLCA1MTMpKQ0KLQkJCWxpbmVfc3R5bGUgCTMNCi0JCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDY3MSkNCi0JCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgNTEzKSkNCi0JCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDExDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJcXVpZHUgICAgICAJIjM4MDU2N0Y1MDM4NCINCi0JCQljbGllbnQgICAgIAlANA0KLQkJCXN1cHBsaWVyICAgCUA2DQotCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJICAgICg3NTIsIDcwMikNCi0JCQkgICAgKDc1MiwgNTA3KSkNCi0JCQlsaW5lX3N0eWxlIAkzDQotCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDcwMikNCi0JCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCA1MDcpKQ0KLQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMTINCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlxdWlkdSAgICAgIAkiMzhGRjNDMUMwMjU2Ig0KLQkJCWNsaWVudCAgICAgCUA0DQotCQkJc3VwcGxpZXIgICAJQDgNCi0JCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkgICAgKDg2MywgNzAyKQ0KLQkJCSAgICAoODYzLCA0MDYpDQotCQkJICAgICgxMDQ5LCA0MDYpKQ0KLQkJCWxpbmVfc3R5bGUgCTMNCi0JCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2MywgNzAyKQ0KLQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ5LCA0MDYpKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmpjYSIgQDEzDQotCQkJbG9jYXRpb24gICAJKDE2ODAsIDE5MikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzNiwgMTA4KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJqY2EiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQzYwOTA0MjAwQkIiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZyIgQDE0DQotCQkJbG9jYXRpb24gICAJKDE3NDQsIDExNTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MDAsIDEwNjgpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJNDg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImxvb3NlY29uZmlnIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0M3MTE0N0UwMzNEIg0KLQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudCIgQDE1DQotCQkJbG9jYXRpb24gICAJKDIwNDgsIDMzNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMjUyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2NsaWVudCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNFNEQyRjRCMDJBQSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6anNwIiBAMTYNCi0JCQlsb2NhdGlvbiAgIAkoMjQ0OCwgMzM2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2DQotCQkJICAgIGxvY2F0aW9uICAgCSgyMzA0LCAyNTIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImpzcCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNFNEQ0RjY5MDM2QiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAxNw0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEZGM0MxODAzMzYiDQotCQkJY2xpZW50ICAgICAJQDMNCi0JCQlzdXBwbGllciAgIAlAOA0KLQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSAgICAoMjIxOSwgOTU5KQ0KLQkJCSAgICAoMjIxOSwgNDYyKQ0KLQkJCSAgICAoMTM1MCwgNDYyKSkNCi0JCQlsaW5lX3N0eWxlIAkzDQotCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA5NTkpDQotCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDQ2MikpDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmUiIEAxOA0KLQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMTg0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4DQotCQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDExMDApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImNvbW1vbkFyY2hpdmVDb3JlIikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBMERCNjhCMDA0NiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjdEIg0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzM4Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkNCi0JY2F0ZWdvcnkgICAJIkxvZ2ljYWwgVmlldyINCi0JcXVpZHUgICAgICAJIjQzMEE4Nzc0MDIyQyIpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjdFIg0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyOTEiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJyb3NlSWQiDQotCQl2YWx1ZSAgICAgIAkiNzUzMTE3NTQwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQotCQkJdmFsdWUgICAgICAJOCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAktMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjEiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMiINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjQiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZUJhY2t1cEZpbGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlJldmVyc2UgZW5naW5lZXJpbmcgb25seSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfCI9Ig0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5jb21wbGV0ZVR5cGVTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmtub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiS25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluZGVmaW5pdGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFVzZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEQk1TIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGNoYXJzZXRzLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGpjZS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxqc3NlLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHJ0LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHN1bnJzYXNpZ24uamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxkbnNucy5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxleHRcXGxkYXBzZWMuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxsb2NhbGVkYXRhLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGV4dFxcc3VuamNlX3Byb3ZpZGVyLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHNlY3VyaXR5XFxsb2NhbF9wb2xpY3kuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcc2VjdXJpdHlcXFVTX2V4cG9ydF9wb2xpY3kuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxsaWJcXGR0LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcbGliXFxodG1sY29udmVydGVyLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcbGliXFx0b29scy5qYXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiSUJNIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGdW5kYW1lbnRhbFR5cGUiDQotCQkJdmFsdWUgICAgICAJImJvb2xlYW47IGNoYXI7IGJ5dGU7IHNob3J0OyBpbnQ7IGxvbmc7IGZsb2F0OyBkb3VibGU7IEJvb2xlYW47IEJ5dGU7IENoYXJhY3RlcjsgRG91YmxlOyBGbG9hdDsgSW50ZWdlcjsgTG9uZzsgT2JqZWN0OyBTaG9ydDsgU3RyaW5nOyBTdHJpbmdCdWZmZXI7IFZvaWQ7IGphdmEubWF0aC5CaWdEZWNpbWFsOyBqYXZhLm1hdGguQmlnSW50ZWdlcjsgamF2YS5zcWwuRGF0ZTsgamF2YS5zcWwuVGltZTsgamF2YS5zcWwuVGltZXN0YW1wOyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0O2phdmEudXRpbC5BYnN0cmFjdE1hcDsgamF2YS51dGlsLkFic3RyYWN0U2VxdWVudGlhbExpc3Q7IGphdmEudXRpbC5BYnN0cmFjdFNldDsgamF2YS51dGlsLkFycmF5TGlzdDsgamF2YS51dGlsLkFycmF5czsgamF2YS51dGlsLkJpdFNldDsgamF2YS51dGlsLkNhbGVuZGFyOyBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7IGphdmEudXRpbC5EYXRlOyBqYXZhLnV0aWwuRGF0ZTsgamF2YS51dGlsLkRpY3Rpb25hcnk7IGphdmEudXRpbC5FdmVudE9iamVjdDsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOyBqYXZhLnV0aWwuSGFzaE1hcDsgamF2YS51dGlsLkhhc2hTZXQ7IGphdmEudXRpbC5IYXNodGFibGU7IGphdmEudXRpbC5MaW5rZWRMaXN0OyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuTG9jYWxlOyBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsgamF2YS51dGlsLlByb3BlcnRpZXM7IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuUmFuZG9tOyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7IGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZTsgamF2YS51dGlsLlN0YWNrOyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOyBqYXZhLnV0aWwuVGltZXI7IGphdmEudXRpbC5UaW1lclRhc2s7IGphdmEudXRpbC5UaW1lWm9uZTsgamF2YS51dGlsLlRyZWVNYXA7IGphdmEudXRpbC5UcmVlU2V0OyBqYXZhLnV0aWwuVmVjdG9yOyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTY1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNvREEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQotCQkJdmFsdWUgICAgICAJOCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAktMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjMyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIzMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbCINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyaWNGb3JtYWxTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGlvbk1hcHBpbmciDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY2lhdGlvbk1hcHBpbmdTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT2JqZWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJpY0Zvcm1hbFNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZyINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jaWF0aW9uTWFwcGluZ1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPYmplY3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRpb25NYXBwaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTmFtZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMikpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRlcGxveSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIgMTAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1EaXJlY3Rpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW4iDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW5vdXQiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkib3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKSkNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RiIpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbkFyY2hpdmVDb3JlLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbkFyY2hpdmVDb3JlLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlOWQxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb25BcmNoaXZlQ29yZS5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NjE2ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb25BcmNoaXZlQ29yZSINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJDb21tb25hcmNoaXZlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiY29tbW9uYXJjaGl2ZS54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVBIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjM5QUE4NjY2MDE5MCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUIiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBleHQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCNTM0RkQwMjRDIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QyINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjBGQzAzQ0EiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY0Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTA2MDEwNyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjUiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnRibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxNEYwMzFGIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NiINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjNBMjJFNjA4MDMwMyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjciDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjExNTAyQTQiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY4Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ajJjYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MzJFMDM4QyIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJGaWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMERCNzVCMDBFNSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMTAxMkQ5MDBBQSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFzdE1vZGlmaWVkIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQTEwMTMzMDAxNjMiDQotCQkgICAgdHlwZSAgICAgICAJImxvbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaXplIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQTEwMTMzOTAwOEEiDQotCQkgICAgdHlwZSAgICAgICAJImxvbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXJlY3RvcnlFbnRyeSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0EzMTUwNjQwMDkyIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JpZ2luYWxVUkkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCSAgICBxdWlkICAgICAgIAkiM0E0MjM2NDAwMzJDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJBcmNoaXZlIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMERCNzVGMDE3NyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBNTRCRjVEMDE4QyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q29udGFpbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkU1NTAxNkUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0ZBMTdCNTMwMDM5Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRUpCSmFyRmlsZSINCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQkIyNTAwMjIiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTBEQzI3RDAzQkUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZUZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXQVJGaWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0EwREJCNDkwMThDIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0EwREMyOTAwM0U0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzEyMzAxMzYiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRUFSRmlsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNBMERCQjc5MDA3RCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBMzY0NTIwMDBERSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNBMERCQjgxMDEyOCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBMERDMjc5MDIxNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1vZHVsZUZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQzEyMzAxMzYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTBEQzJDRTAwQUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkFyY2hpdmUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCNzVGMDE3NyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJDb250YWluZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0E1NEJFNTUwMTZFIg0KLQkgICAgc3RlcmVvdHlwZSAJImFic3RyYWN0Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0E1NEMxNjgwMUZDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQjc1QjAwRTUiKSkNCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIlJlYWRPbmx5RGlyZWN0b3J5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBNTRCRUIwMDA0RCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBNTRCRjc1MDI5NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q29udGFpbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkU1NTAxNkUiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJBUkZpbGUiDQotCSAgICBxdWlkICAgICAgIAkiM0E2REVCQ0YwM0M1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0E2REVCRTcwMUNCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzEyMzAxMzYiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1vZHVsZVJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMUUzMDAxMTUiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJFSkJNb2R1bGVSZWYiDQotCSAgICBxdWlkICAgICAgIAkiM0M3MTI1QTgwMkE1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTJBMUQwMTY1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiV2ViTW9kdWxlUmVmIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNzEyNUIxMDI5MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDNzEyQTIwMDFFQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUUzMDAxMTUiKSkpDQotCShvYmplY3QgQ2xhc3MgIkNsaWVudE1vZHVsZVJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMjVCOTAyNTkiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQzcxMkEyMzAzMUMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFMzAwMTE1IikpKQ0KLQkob2JqZWN0IENsYXNzICJDb25uZWN0b3JNb2R1bGVSZWYiDQotCSAgICBxdWlkICAgICAgIAkiM0M3MTI1QzYwMEU1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTJBMkIwMjVGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQzIzQzAyNzAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiL21vZHVsZUZpbGVzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNBMERDMjNEMDE0RiINCi0JCSAgICBsYWJlbCAgICAgIAkiL21vZHVsZUZpbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzEyMzAxMzYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWFyRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwREMyM0QwMkZFIg0KLQkJICAgIGxhYmVsICAgICAgCSJlYXJGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFQVJGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI3OTAwN0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgcXVpZCAgICAgICAJIjNBM0E5NTNFMDBBOSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsb2FkaW5nQ29udGFpbmVyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTNBOTUzRjAwODIiDQotCQkgICAgbGFiZWwgICAgICAJImxvYWRpbmdDb250YWluZXIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNvbnRhaW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJFNTUwMTZFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiDQotCQkgICAgcXVpZCAgICAgICAJIjNBM0E5NTNGMDBBQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREI3NUIwMEU1IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBNTRCRjRFMDAyMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb250YWluZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjNBNTRCRjRFMDAyMyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGFpbmVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpDb250YWluZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRTU1MDE2RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJmaWxlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0E1NEJGNEUwMDI0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJmaWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREI3NUIwMEU1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDNzExRUY5MDJGNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzcxMUVGQTAyNEMiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZUZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZUZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzcxMUVGQTAyNEUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFMzAwMTE1Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDNzEyMjIzMDE5QiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVSZWZzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzcxMjIyNDAyNDYiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFMzAwMTE1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWFyRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTIyMjQwMjQ4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlYXJGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFQVJGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI3OTAwN0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGMjk3RDUwMDI3OCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3YXJGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0Q1MDAyNzkiDQotCQkgICAgbGFiZWwgICAgICAJIndhckZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OldBUkZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjQ5MDE4QyIpDQotCQkob2JqZWN0IFJvbGUgImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0Q1MDAyN0EiDQotCQkgICAgbGFiZWwgICAgICAJImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBxdWlkICAgICAgIAkiM0YyOTdFMjgwMEI1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVqYkphckZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk3RTI4MDBCNiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiSmFyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUpCSmFyRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCMjUwMDIyIikNCi0JCShvYmplY3QgUm9sZSAiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk3RTI4MDBCNyINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJKYXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCSAgICBxdWlkICAgICAgIAkiM0YyOTdGNkUwMjQ1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVhckZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk3RjZFMDI0NiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWFyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUFSRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNzkwMDdEIikNCi0JCShvYmplY3QgUm9sZSAiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk3RjZFMDI0NyINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkFwcGxpY2F0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRjI5ODMyMTAzNUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk4MzIyMDI4NCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MDkxMDEwRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0YyOTgzMjIwMjk4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpSQVJGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTZERUJDRjAzQzUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjNGMjk4NDYyMDM5RCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0YyOTg0NjIwMzlFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpBcHBsaWNhdGlvbkNsaWVudEZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjgxMDEyOCIpDQotCQkob2JqZWN0IFJvbGUgImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5ODQ2MjAzOUYiDQotCQkgICAgbGFiZWwgICAgICAJImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0Ig0KLQkgICAgcXVpZCAgICAgICAJIjQzMEE5MjUyMDEyNyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjQzMEE5MjUzMDE0NyINCi0JCSAgICBsYWJlbCAgICAgIAkibW9kdWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSINCi0JCSAgICBxdWlkICAgICAgIAkiNDMwQTkyNTMwMTQ5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSIpKSkNCi0JKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibG9vc2Vjb25maWciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJMb29zZWNvbmZpZyIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZSIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMTQ3RTAzM0QiDQotCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkgICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3MgIkxvb3NlQXBwbGljYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDNTZFQjRFMDA2QSINCi0JCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNzUzREVFMDBFQSINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFyY2hpdmUiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUFBRjAwNkMiKSkpDQotCQkob2JqZWN0IENsYXNzICJMb29zZUFyY2hpdmUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNTZFQUFGMDA2QyINCi0JCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJKG9iamVjdCBPcGVyYXRpb24gImlzTW9kdWxlIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1QUJGQzMwM0RFIg0KLQkJCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiINCi0JCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkJICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJpIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkVCOUMwMUEzIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJiaW5hcmllc1BhdGgiDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzU2RUJBOTAwQkIiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlc1BhdGgiDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzcxMUREMzAyMEIiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzcyAiTG9vc2VMaWJyYXJ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzVBRjdBQzAwMjgiDQotCQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzVBRjdDMjAzN0MiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VBcmNoaXZlIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVBQUYwMDZDIikpKQ0KLQkJKG9iamVjdCBDbGFzcyAiTG9vc2VNb2R1bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNUFCRUZFMDI5MCINCi0JCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNUFDMDM5MDBFRSINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFyY2hpdmUiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUFBRjAwNkMiKSkNCi0JCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsdEREIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1QUJGRkEwMjFBIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJKG9iamVjdCBDbGFzcyAiTG9vc2VDb25maWd1cmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzU2RTkyQzAwQkYiKQ0KLQkJKG9iamVjdCBDbGFzcyAiTG9vc2VXQVJGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzVBRjdEQjAxOEUiDQotCQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzVBRjdGNTAyOEYiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VNb2R1bGUiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBQkVGRTAyOTAiKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1NkZERTYwMTczIg0KLQkJICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCShvYmplY3QgUm9sZSAiYXBwbGljYXRpb25zIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkZERTcwMkREIg0KLQkJCSAgICBsYWJlbCAgICAgIAkiYXBwbGljYXRpb25zIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlQXBwbGljYXRpb24iDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUI0RTAwNkEiDQotCQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzU2RkRFNzAyREYiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VDb25maWd1cmF0aW9uIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkU5MkMwMEJGIg0KLQkJCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzU2RkRFRjAwMTgiDQotCQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJKG9iamVjdCBSb2xlICJsb29zZUFyY2hpdmVzIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkZERjAwMDIzIg0KLQkJCSAgICBsYWJlbCAgICAgIAkibG9vc2VBcmNoaXZlcyINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFyY2hpdmUiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUFBRjAwNkMiDQotCQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCShvYmplY3QgUm9sZSAibG9vc2VBcHAiDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzU2RkRGMDAwMjUiDQotCQkJICAgIGxhYmVsICAgICAgCSJsb29zZUFwcCINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFwcGxpY2F0aW9uIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVCNEUwMDZBIg0KLQkJCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1QUY4MDIwMERGIg0KLQkJICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCShvYmplY3QgUm9sZSAibG9vc2VMaWJzIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1QUY4MDMwMDg3Ig0KLQkJCSAgICBsYWJlbCAgICAgIAkibG9vc2VMaWJzIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlTGlicmFyeSINCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNUFGN0FDMDAyOCINCi0JCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJKG9iamVjdCBSb2xlICJsb29zZVdBUiINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNUFGODAzMDA4OSINCi0JCQkgICAgbGFiZWwgICAgICAJImxvb3NlV0FSIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlV0FSRmlsZSINCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNUFGN0RCMDE4RSINCi0JCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0JICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQkgICAgcXVpZCAgICAgICAJIjNDNTZFOTEyMDE3MyINCi0JCSAgICB0aXRsZSAgICAgIAkiTWFpbiINCi0JCSAgICB6b29tICAgICAgIAkxMDANCi0JCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkJICAgIG1heF93aWR0aCAgCTIxNjAwDQotCQkgICAgb3JpZ2luX3ggICAJMA0KLQkJICAgIG9yaWdpbl95ICAgCTANCi0JCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUNvbmZpZ3VyYXRpb24iIEAxDQotCQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzg0LCAxNjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJCWxvY2F0aW9uICAgCSgxNjIsIDExMCkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiTG9vc2VDb25maWd1cmF0aW9uIikNCi0JCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZFOTJDMDBCRiINCi0JCQkgICAgd2lkdGggICAgICAJNDYyDQotCQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJCSAgICBhbm5vdGF0aW9uIAk4DQotCQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlQXJjaGl2ZSIgQDINCi0JCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzEyLCAyMjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQlQYXJlbnRfVmlldyAJQDINCi0JCQkJbG9jYXRpb24gICAJKDExNDEsIDE3NCkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiTG9vc2VBcmNoaXZlIikNCi0JCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZFQUFGMDA2QyINCi0JCQkgICAgd2lkdGggICAgICAJMzYwDQotCQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJCSAgICBhbm5vdGF0aW9uIAk4DQotCQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlQXBwbGljYXRpb24iIEAzDQotCQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCA4NDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJCWxvY2F0aW9uICAgCSgxNjEsIDc5OCkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0MTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiTG9vc2VBcHBsaWNhdGlvbiIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUI0RTAwNkEiDQotCQkJICAgIHdpZHRoICAgICAgCTQzMg0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDI4MSwgNTAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkZERTYwMTczIg0KLQkJCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJKG9iamVjdCBSb2xlVmlldyAiYXBwbGljYXRpb25zIiBANQ0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwMywgMzc1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY5NCkNCi0JCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQlhbmNob3IgICAgIAkxDQotCQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCQlubGluZXMgICAgIAkxDQotCQkJCQltYXhfd2lkdGggIAkyNDcNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIrYXBwbGljYXRpb25zIg0KLQkJCQkJcGN0RGlzdCAgICAJMC42Nzk2ODgNCi0JCQkJCWhlaWdodCAgICAgCTEzOQ0KLQkJCQkJb3JpZW50YXRpb24gCTEpDQotCQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkZERTcwMkREIg0KLQkJCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSgyODEsIDUwMykNCi0JCQkJCSgyODEsIDc4NikpDQotCQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI4MSwgNTAzKQ0KLQkJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4MSwgNzg2KQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCA2NDkpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMg0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQkJcGN0RGlzdCAgICAJMC41MTY4NTQNCi0JCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBAOA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwMywgMzc1KQ0KLQkJCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkgICAgcXVpZHUgICAgICAJIjNDNTZGREU3MDJERiINCi0JCQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkJCSAgICBzdXBwbGllciAgIAlAMQ0KLQkJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkoMjgxLCA1MDMpDQotCQkJCQkoMjgxLCAyMjEpKQ0KLQkJCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyODEsIDUwMykNCi0JCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDIyMSkpKSkNCi0JCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NDYsIDI4NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZGREVGMDAxOCINCi0JCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCShvYmplY3QgUm9sZVZpZXcgImxvb3NlQXJjaGl2ZXMiIEAxMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyLCAtMzI0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgMjQ1KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTENCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTI4NQ0KLQkJCQkJanVzdGlmeSAgICAJMA0KLQkJCQkJbGFiZWwgICAgICAJIitsb29zZUFyY2hpdmVzIg0KLQkJCQkJcGN0RGlzdCAgICAJMC42NzYyNDUNCi0JCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RkRGMDAwMjMiDQotCQkJCSAgICBjbGllbnQgICAgIAlAOQ0KLQkJCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJKDU0NiwgMjg0KQ0KLQkJCQkJKDExMzIsIDI4NCkpDQotCQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU0NiwgMjg0KQ0KLQkJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMzIsIDI4NCkNCi0JCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTk1LCAzMjQpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMg0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQkJcGN0RGlzdCAgICAJMC43NjYyODQNCi0JCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJCShvYmplY3QgUm9sZVZpZXcgImxvb3NlQXBwIiBAMTMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MiwgLTMyNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMNCi0JCQkJCWxvY2F0aW9uICAgCSg1NjYsIDYxMikNCi0JCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQlhbmNob3IgICAgIAkxDQotCQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCQlubGluZXMgICAgIAkxDQotCQkJCQltYXhfd2lkdGggIAkyMDgNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIrbG9vc2VBcHAiDQotCQkJCQlwY3REaXN0ICAgIAkwLjcwMjQ5NQ0KLQkJCQkJaGVpZ2h0ICAgICAJMTAzDQotCQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RkRGMDAwMjUiDQotCQkJCSAgICBjbGllbnQgICAgIAlAOQ0KLQkJCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJKDU0NiwgMjg0KQ0KLQkJCQkJKDQ2MywgMjg0KQ0KLQkJCQkJKDQ2MywgNzg2KSkNCi0JCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTQ2LCAyODQpDQotCQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYzLCA3ODYpKSkpDQotCQkJKG9iamVjdCBOb3RlVmlldyBAMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMTY4MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJCWxvY2F0aW9uICAgCSg0NCwgMTU0MykNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJNQ0KLQkJCQltYXhfd2lkdGggIAk3NzINCi0JCQkJbGFiZWwgICAgICAJIkFzc3VtcHRpb246ICBGb3IgYSBnaXZlbiBydW5uaW5nIHNlcnZlciwgdGhlcmUgZXhpc3RzIG9ubHkgb25lIGNvbmZpZyB3aXRoIGEgc2V0IG9mIGFwcGxpY2F0aW9ucyIpDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgd2lkdGggICAgICAJODMyDQotCQkJICAgIGhlaWdodCAgICAgCTI4NykNCi0JCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VNb2R1bGUiIEAxNg0KLQkJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDg5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJCWxvY2F0aW9uICAgCSgxNDY2LCA4NDYpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlTW9kdWxlIikNCi0JCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNUFCRUZFMDI5MCINCi0JCQkgICAgd2lkdGggICAgICAJMzUwDQotCQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJCSAgICBhbm5vdGF0aW9uIAk4DQotCQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlTGlicmFyeSIgQDE3DQotCQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTI4LCA5MTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCA4NjIpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlTGlicmFyeSIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjdBQzAwMjgiDQotCQkJICAgIHdpZHRoICAgICAgCTMyNA0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZVdBUkZpbGUiIEAxOA0KLQkJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE2NDgsIDEzMjgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgMTI3OCkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiTG9vc2VXQVJGaWxlIikNCi0JCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNUFGN0RCMDE4RSINCi0JCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJCSAgICBhbm5vdGF0aW9uIAk4DQotCQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMDYsIDEzMTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjgwMjAwREYiDQotCQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkob2JqZWN0IFJvbGVWaWV3ICJsb29zZUxpYnMiIEAyMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKC02NDIsIC0xMjgpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTEwDQotCQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJY29sb3IgICAgICAJMA0KLQkJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJCQlsb2NhdGlvbiAgIAkoNzkxLCAxMDE3KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTENCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTE5Ng0KLQkJCQkJanVzdGlmeSAgICAJMA0KLQkJCQkJbGFiZWwgICAgICAJIitsb29zZUxpYnMiDQotCQkJCQlwY3REaXN0ICAgIAkwLjkwNTk2Mw0KLQkJCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjgwMzAwODciDQotCQkJCSAgICBjbGllbnQgICAgIAlAMTkNCi0JCQkJICAgIHN1cHBsaWVyICAgCUAxNw0KLQkJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkoMTAwNiwgMTMxMikNCi0JCQkJCSg4OTcsIDEzMTIpDQotCQkJCQkoODk3LCA5NzQpKQ0KLQkJCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDA2LCAxMzEyKQ0KLQkJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg5NywgOTc0KQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjANCi0JCQkJCWxvY2F0aW9uICAgCSg5NTEsIDEwMTkpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMg0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJCShvYmplY3QgUm9sZVZpZXcgImxvb3NlV0FSIiBAMjMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgtNjQyLCAtMTI4KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMw0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTEsIDEyNzIpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMQ0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiK2xvb3NlV0FSIg0KLQkJCQkJcGN0RGlzdCAgICAJMC42ODM5NzMNCi0JCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjgwMzAwODkiDQotCQkJCSAgICBjbGllbnQgICAgIAlAMTkNCi0JCQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkoMTAwNiwgMTMxMikNCi0JCQkJCSgxNDUzLCAxMzEyKSkNCi0JCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAwNiwgMTMxMikNCi0JCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDUzLCAxMzEyKSkpKQ0KLQkJCShvYmplY3QgTm90ZVZpZXcgQDI1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAzMjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1NSwgMTMzKQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlubGluZXMgICAgIAk3DQotCQkJCW1heF93aWR0aCAgCTM1OQ0KLQkJCQlsYWJlbCAgICAgIAkNCi18dXJpIGlzIGVpdGhlciByZWxhdGl2ZSB0byB0aGUgRUFSIHJvb3Qgb3IgV0VCLUlORi9saWIuDQotfGJpbmFyaWVzUGF0aCBhbmQgcmVzb3VyY2VzUGF0aCBhcmUgYWJzb2x1dGUNCi0JCQkJKQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHdpZHRoICAgICAgCTQxOQ0KLQkJCSAgICBoZWlnaHQgICAgIAkzODcpDQotCQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjdGNTAyOEYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjA2LCAxMjY2KQ0KLQkJCQkoMTYwNiwgOTU4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MDYsIDEyNjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjA2LCA5NTgpKQ0KLQkJCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgNzAzKQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxMiwgNzAzKQ0KLQkJCQkoMTMxMiwgMjg2KSkpDQotCQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjgNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBQzAzOTAwRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2NTAsIDgzNCkNCi0JCQkJKDE2NTAsIDcwMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjUwLCA4MzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjUwLCA3MDMpDQotCQkJICAgIGRyYXdTdXBwbGllciAJQDI3KQ0KLQkJCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5DQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY3QzIwMzdDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MTMsIDg1MCkNCi0JCQkJKDkxMywgNzAzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxMywgODUwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTEzLCA3MDMpDQotCQkJICAgIGRyYXdTdXBwbGllciAJQDI3KQ0KLQkJCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMwDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M3NTNERUUwMEVBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUxMywgNzg2KQ0KLQkJCQkoNTEzLCA3MDMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTEzLCA3ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTMsIDcwMykNCi0JCQkgICAgZHJhd1N1cHBsaWVyIAlAMjcpKSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJjb21tb24gYXJjaGl2ZSINCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQjc1MTAwRTEiDQotCSAgICB0aXRsZSAgICAgIAkiY29tbW9uIGFyY2hpdmUiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJOTE5DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUpCSmFyRmlsZSIgQDMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDE3OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMTMyMSwgMTc0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphckZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCMjUwMDIyIg0KLQkJICAgIHdpZHRoICAgICAgCTI1Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6QXBwbGljYXRpb25DbGllbnRGaWxlIiBAMzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTc5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMg0KLQkJCWxvY2F0aW9uICAgCSgxNjIwLCAxNzQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXBwbGljYXRpb25DbGllbnRGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjgxMDEyOCINCi0JCSAgICB3aWR0aCAgICAgIAk0MjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDMzDQotCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCWxvY2F0aW9uICAgCSg5MDYsIDExOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTYNCi0JCQltYXhfd2lkdGggIAk4MDgNCi0JCQlsYWJlbCAgICAgIAkiVGhlIGxvYWRpbmcgY29udGFpbmVyIGlzIHRoZSBvcmlnaW5hbCBjb250YWluZXIgZnJvbSB3aGljaCB0aGUgZmlsZSB3YXMgb3BlbmVkLiAgSWYgdGhlIGZpbGUgaXMgY29waWVkIGFuZCB0aGUgY29weSBhZGRlZCB0byBhIG5ldyBhcmNoaXZlLCB0aGUgbmV3IGZpbGUgY2FuIHN0aWxsIGdldCBhbiBpbnB1dCBzdHJlYW0gb24gaXRzZWxmIGZyb20gdGhlIGxvYWRpbmcgY29udGFpbmVyLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJODY4DQotCQkgICAgaGVpZ2h0ICAgICAJMzE5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6UmVhZE9ubHlEaXJlY3RvcnkiIEAzNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxMTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJbG9jYXRpb24gICAJKDcwNCwgMTA4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlYWRPbmx5RGlyZWN0b3J5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJFQjAwMDREIg0KLQkJICAgIHdpZHRoICAgICAgCTQwMg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q29udGFpbmVyIiBAMzUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgODMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQlsb2NhdGlvbiAgIAkoMzE1LCA4MDQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb250YWluZXIiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCWxvY2F0aW9uICAgCSgzMTUsIDc1NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxhYnN0cmFjdD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJFNTUwMTZFIg0KLQkJICAgIHdpZHRoICAgICAgCTM0OA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RmlsZSIgQDM2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCWxvY2F0aW9uICAgCSgyNTQsIDIwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREI3NUIwMEU1Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCWxvY2F0aW9uICAgCSgyNTQsIDI2NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTQ4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk1MDINCi0JCSAgICBoZWlnaHQgICAgIAkzODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzLCA2MDEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJGNEUwMDIyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbGVzIiBAMzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU5MSwgLTEwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJCWxvY2F0aW9uICAgCSgxNzQsIDI3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODMwNTMyDQotCQkJCWhlaWdodCAgICAgCTUwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRjRFMDAyNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDM3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMywgNjAxKQ0KLQkJCQkoMTEzLCAzMjEpDQotCQkJCSgyNDUsIDMyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTMsIDYwMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NSwgMzIxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MA0KLQkJCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJCWxvY2F0aW9uICAgCSgyMDMsIDM3NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250YWluZXIiIEA0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTkxLCAtMTAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyDQotCQkJCVBhcmVudF9WaWV3IAlANDENCi0JCQkJbG9jYXRpb24gICAJKDE5MywgODYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTk0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250YWluZXIiDQotCQkJCXBjdERpc3QgICAgCTAuNzI1MzUyDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRjRFMDAyMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMywgNjAxKQ0KLQkJCQkoMTEzLCA4MTkpDQotCQkJCSgzMDYsIDgxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTMsIDYwMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMwNiwgODE5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDQxDQotCQkJCWxvY2F0aW9uICAgCSgyNDUsIDc3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODU0NDYwDQotCQkJCWhlaWdodCAgICAgCTQ5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA0NA0KLQkJICAgIGxvY2F0aW9uICAgCSg4MjgsIDY3OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTNBOTUzRTAwQTkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9hZGluZ0NvbnRhaW5lciIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMzMiwgMjk0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDMsIDc1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9hZGluZ0NvbnRhaW5lciINCi0JCQkJcGN0RGlzdCAgICAJMC4yNDkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTc1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBM0E5NTNGMDA4MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgyOCwgNjc4KQ0KLQkJCQkoODI4LCA4MjEpDQotCQkJCSg2NTQsIDgyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MjgsIDY3OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1NCwgODIxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSg2ODYsIDg3NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBANDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzMyLCAyOTQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0EzQTk1M0YwMEFBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODI4LCA2NzgpDQotCQkJCSg4MjgsIDQ0MSkNCi0JCQkJKDc0NywgNDQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgyOCwgNjc4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzQ3LCA0NDEpKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQ5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzMNCi0JCSAgICBzdXBwbGllciAgIAlANDQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTEzMCwgNDMxKQ0KLQkJCSg4MjgsIDY3OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEMxNjgwMUZDIg0KLQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODMsIDc0MSkNCi0JCQkoNDg5LCA1NzcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpBcmNoaXZlIiBANTENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCWxvY2F0aW9uICAgCSg5NCwgMTEzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFyY2hpdmUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREI3NUYwMTc3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCWxvY2F0aW9uICAgCSg5NCwgMTE5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQ4MikNCi0JCSAgICB3aWR0aCAgICAgIAk1MDINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1Mg0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDEwMTMpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDM1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQ4MCwgMTAxMykNCi0JCQkoNDgwLCA5MjIpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJGNzUwMjk1Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzNA0KLQkJICAgIHN1cHBsaWVyICAgCUAzNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4NTEsIDEwNzMpDQotCQkJKDg1MSwgMTAxMykpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODUxLCAxMDczKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTEsIDEwMTMpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRjVEMDE4QyINCi0JCSAgICBjbGllbnQgICAgIAlANTENCi0JCSAgICBzdXBwbGllciAgIAlAMzUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjY2LCAxMTIzKQ0KLQkJCSgyNjYsIDEwMTMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2NiwgMTEyMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY2LCAxMDEzKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6V0FSRmlsZSIgQDU1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDE3OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQlsb2NhdGlvbiAgIAkoMTA2NCwgMTc0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNDkwMThDIg0KLQkJICAgIHdpZHRoICAgICAgCTIyNg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6UkFSRmlsZSIgQDU2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDE3OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQlsb2NhdGlvbiAgIAkoODM2LCAxNzQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUkFSRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNkRFQkNGMDNDNSINCi0JCSAgICB3aWR0aCAgICAgIAkyMDINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDE1MTApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDUxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDMzNiwgMTUxMCkNCi0JCQkoMzM2LCAxMzA5KSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIiBANTgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMTUzNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJbG9jYXRpb24gICAJKDgxNywgMTQ4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZUZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2Ig0KLQkJICAgIHdpZHRoICAgICAgCTI0MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDU5DQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMTcwNikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTI4LCAxNzA2KQ0KLQkJCSg5MjgsIDE1OTkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyN0QwM0JFIg0KLQkJICAgIGNsaWVudCAgICAgCUAzMQ0KLQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDI1LCAxNzI5KQ0KLQkJCSgxNDI1LCAxNzA2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI1LCAxNzI5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI1LCAxNzA2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU5KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzI3OTAyMTQiDQotCQkgICAgY2xpZW50ICAgICAJQDMyDQotCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE2MTEsIDE3MjkpDQotCQkJKDE2MTEsIDE3MDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTEsIDE3MjkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDE3MDYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMkNFMDBBRSINCi0JCSAgICBjbGllbnQgICAgIAlANTgNCi0JCSAgICBzdXBwbGllciAgIAlANTENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoODE3LCAxNTM2KQ0KLQkJCSg4MTcsIDE1MTApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxNywgMTUzNikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODE3LCAxNTEwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU3KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzI5MDAzRTQiDQotCQkgICAgY2xpZW50ICAgICAJQDU1DQotCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDExNjgsIDE3MjkpDQotCQkJKDExNjgsIDE3MDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDE3MjkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDE3MDYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNkRFQkU3MDFDQiINCi0JCSAgICBjbGllbnQgICAgIAlANTYNCi0JCSAgICBzdXBwbGllciAgIAlANTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTI5LCAxNzI5KQ0KLQkJCSg5MjksIDE3MDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkyOSwgMTcyOSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI5LCAxNzA2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUFSRmlsZSIgQDY1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3MzYsIDE5ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjUNCi0JCQlsb2NhdGlvbiAgIAkoNjQ0LCAxOTMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUFSRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI3OTAwN0QiDQotCQkgICAgd2lkdGggICAgICAJMjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDY2DQotCQkgICAgbG9jYXRpb24gICAJKDY0NywgMTcyMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzIzQzAyNzAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL21vZHVsZUZpbGVzIiBANjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE2OSwgNzYwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4DQotCQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQkJbG9jYXRpb24gICAJKDYyMSwgMTgzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL21vZHVsZUZpbGVzIg0KLQkJCQlwY3REaXN0ICAgIAktMC4zODMzMzMNCi0JCQkJaGVpZ2h0ICAgICAJMjcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0EwREMyM0QwMTRGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjQ3LCAxNzIwKQ0KLQkJCQkoNjQ3LCAxNjYwKQ0KLQkJCQkoODIxLCAxNjYwKQ0KLQkJCQkoODIxLCAxNTk5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NywgMTcyMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgyMSwgMTU5OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzE0LCAxNjkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC40MzI1MTUNCi0JCQkJaGVpZ2h0ICAgICAJMzENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVhckZpbGUiIEA3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY5LCA3NjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzIzRDAyRkUiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NDcsIDE3MjApDQotCQkJCSg2NDcsIDE5MjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQ3LCAxNzIwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ3LCAxOTIxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDE4OTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4NDE2MQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EzNjQ1MjAwMERFIg0KLQkJICAgIGNsaWVudCAgICAgCUA2NQ0KLQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg3NjksIDE5MjEpDQotCQkJKDc2OSwgMTcwNikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzY5LCAxOTIxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjksIDE3MDYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbiIgQDczDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzMNCi0JCQlsb2NhdGlvbiAgIAkoMTkwOCwgMTk1MykNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzEyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgd2lkdGggICAgICAJMzMwDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDc0DQotCQkgICAgbG9jYXRpb24gICAJKDEzNjgsIDIwMTUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBANzUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjMyLCAzMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDc1DQotCQkJCWxvY2F0aW9uICAgCSgxNzkzLCAxOTc0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDIzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM2OCwgMjAxNSkNCi0JCQkJKDE4OTksIDIwMTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMjAxNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDIwMTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3DQotCQkJCVBhcmVudF9WaWV3IAlANzUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDYsIDIwNjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWFyRmlsZSIgQDc4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMiwgMzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoOTQzLCAxOTc0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlYXJGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0Y2RTAyNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUA3NA0KLQkJCSAgICBzdXBwbGllciAgIAlANjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzY4LCAyMDE1KQ0KLQkJCQkoODM3LCAyMDE1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDIwMTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzcsIDIwMTUpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiIEA4MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjI0LCAyMzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQlsb2NhdGlvbiAgIAkoNTE0LCAyMzMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFMzAwMTE1Ig0KLQkJICAgIHdpZHRoICAgICAgCTIzOA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEA4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NDEsIDE4MzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGOTAyRjQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlRmlsZSIgQDgyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEyMSwgLTUzMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCWxvY2F0aW9uICAgCSg2MTIsIDE1NjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZUZpbGUiDQotCQkJCXBjdERpc3QgICAgCTAuNjgxOTIyDQotCQkJCWhlaWdodCAgICAgCTI1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNzExRUZBMDI0QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgxDQotCQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ0MSwgMTgzNSkNCi0JCQkJKDQ0MSwgMTU4NSkNCi0JCQkJKDgwOCwgMTU4NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDEsIDE4MzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDgsIDE1ODUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJCVBhcmVudF9WaWV3IAlAODINCi0JCQkJbG9jYXRpb24gICAJKDczMSwgMTYyMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODc2NDgxDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAODUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxLCAtNTMzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNzExRUZBMDI0RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDgxDQotCQkJICAgIHN1cHBsaWVyICAgCUA4MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ0MSwgMTgzNSkNCi0JCQkJKDQ0MSwgMjM4OCkNCi0JCQkJKDUwNSwgMjM4OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDEsIDE4MzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDUsIDIzODgpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDg2DQotCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMjE4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyMjIzMDE5QiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVSZWZzIiBAODcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyLCA0MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OA0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSg4NTcsIDIyNzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZVJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjM1MDM2DQotCQkJCWhlaWdodCAgICAgCTE0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMjIyNDAyNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAODANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MTYsIDIxODQpDQotCQkJCSg3MTYsIDIzMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzE2LCAyMTg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzE2LCAyMzIxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSg2NzAsIDIyODEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxNTczNg0KLQkJCQloZWlnaHQgICAgIAk0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWFyRmlsZSIgQDkwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDI1MiwgNDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTENCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoODAzLCAyMTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlYXJGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMwMTQ3MQ0KLQkJCQloZWlnaHQgICAgIAk4Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMjIyNDAyNDgiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MTYsIDIxODQpDQotCQkJCSg3MTYsIDIwNDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzE2LCAyMTg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzE2LCAyMDQ3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSg3NTUsIDIwNjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1NDYyNg0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246Ok1vZHVsZSIgQDkzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDQ4LCAyMzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJbG9jYXRpb24gICAJKDE5MTcsIDIzMzQpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiINCi0JCSAgICB3aWR0aCAgICAgIAkyODANCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEA5NA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjIyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzNDAwMDNDMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVzIiBAOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc4LCAxNDg2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDE5OTksIDIyNzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNDg0ODQ4DQotCQkJCWhlaWdodCAgICAgCTEwNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzQwMTAyRTciDQotCQkJICAgIGNsaWVudCAgICAgCUA5NA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMTAyLCAyMjIyKQ0KLQkJCQkoMjEwMiwgMjMyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTAyLCAyMjIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjMyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1NywgMjI4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjc4MDEwDQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhcHBsaWNhdGlvbiIgQDk4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3OCwgMTQ4NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAzNDAxMDJFNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk0DQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIxMDIsIDIyMjIpDQotCQkJCSgyMTAyLCAyMTIzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMDIsIDIyMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyMTIzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSgyMTU2LCAyMTMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxMDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyNSwgMjM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQzMEE5MjUyMDEyNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGUiIEAxMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDANCi0JCQkgICAgbG9jYXRpb24gICAJKDcwMSwgMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDE3OTEsIDIzNDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDMwQTkyNTMwMTQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTAwDQotCQkJICAgIHN1cHBsaWVyICAgCUA5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjUsIDIzODQpDQotCQkJCSgxOTA3LCAyMzg0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDE4NDksIDI0MzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEAxMDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDANCi0JCQkgICAgbG9jYXRpb24gICAJKDcwMSwgMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MzBBOTI1MzAxNDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDANCi0JCQkgICAgc3VwcGxpZXIgICAJQDgwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyNSwgMjM4NCkNCi0JCQkJKDc0MywgMjM4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiZGVzY3JpcHRvcnMiDQotCSAgICBxdWlkICAgICAgIAkiM0ExMDE1RDcwMjUwIg0KLQkgICAgdGl0bGUgICAgICAJImRlc2NyaXB0b3JzIg0KLQkgICAgem9vbSAgICAgICAJODkNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMTM3DQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6V0FSRmlsZSIgQDEwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2LCAxNjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCWxvY2F0aW9uICAgCSgxMzksIDE1NjMpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIzNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV0FSRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI0OTAxOEMiDQotCQkgICAgd2lkdGggICAgICAJMjUyDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0IiBAMTA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MDgsIDE4NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA2DQotCQkJbG9jYXRpb24gICAJKDEyMjMsIDE3NjMpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgd2lkdGggICAgICAJMzg4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiIEAxMDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDA4LCAxMzkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgxMjQ3LCAxMzM5KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldlYkFwcCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgxMjQ3LCAxMjg5KQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxjb21wb25lbnQ+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgd2lkdGggICAgICAJMzQwDQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDEwOA0KLQkJICAgIGxvY2F0aW9uICAgCSg4MDksIDE1MDgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTdENTAwMjc4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBAMTA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MywgLTMxNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJbG9jYXRpb24gICAJKDEwNzgsIDE0MTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2RlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0OTIyMg0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0Q1MDAyN0EiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgwOSwgMTUwOCkNCi0JCQkJKDEyMzcsIDE0MjQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMywgMTQ4NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3YXJGaWxlIiBAMTEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MywgLTMxNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0Q1MDAyNzkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgwOSwgMTUwOCkNCi0JCQkJKDM4MiwgMTU5MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAxMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMTYyOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyMzAxMjAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmxldHMiIEAxMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDU2LCAtMTAyOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDEzNjcsIDE3MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZsZXRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyNDAyRTQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MDgsIDE2MjgpDQotCQkJCSgxNDA4LCAxNzUwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NjIsIDE3MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViQXBwIiBAMTE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA1NiwgLTEwMjgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSgxMzY3LCAxNTMxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjE2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDI0MDJEQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQwOCwgMTYyOCkNCi0JCQkJKDE0MDgsIDE1MDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgMTUxOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIiBAMTIwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyODgsIDEwODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjANCi0JCQlsb2NhdGlvbiAgIAkoMjEwMywgMTAxMSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgd2lkdGggICAgICAJMzg4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIiBAMTIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgMTA3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQlsb2NhdGlvbiAgIAkoNjI4LCAxMDE2KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphciIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCWxvY2F0aW9uICAgCSg2MjgsIDk2NikNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8Y29tcG9uZW50Pj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM1NUQwMUUxIg0KLQkJICAgIHdpZHRoICAgICAgCTM5NA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImVqYkphclRvRW50ZXJwcmlzZUJlYW5zIiBAMTIyDQotCQkgICAgbG9jYXRpb24gICAJKDE1NTMsIDEwNzkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQlQYXJlbnRfVmlldyAJQDEyMg0KLQkJCWxvY2F0aW9uICAgCSgxNTUzLCAxMDIwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZWpiSmFyVG9FbnRlcnByaXNlQmVhbnMiDQotCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQloZWlnaHQgICAgIAk2MA0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4RkYzRDFGMDAzQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJKYXIiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjINCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDg3LCAtNTA1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMSwgMTExNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiSmFyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0QxRjAzQ0IiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjINCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NTMsIDEwNzkpDQotCQkJCSgxMDEzLCAxMDczKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDEwNjgsIDEwMjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50ZXJwcmlzZUJlYW5zIiBAMTI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA4NywgLTUwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJbG9jYXRpb24gICAJKDE5ODUsIDExMjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0MTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGVycHJpc2VCZWFucyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhGRjNEMUYwMzdBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTUzLCAxMDc5KQ0KLQkJCQkoMjA5MywgMTA4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5DQotCQkJCVBhcmVudF9WaWV3IAlAMTI3DQotCQkJCWxvY2F0aW9uICAgCSgyMDM5LCAxMDMxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFSkJKYXJGaWxlIiBAMTMwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDcwNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQlsb2NhdGlvbiAgIAkoMjAxLCA2NTEpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCSmFyRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkIyNTAwMjIiDQotCQkgICAgd2lkdGggICAgICAJMjg4DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDEzMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NDEsIDg2MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0UyODAwQjUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVwbG95bWVudERlc2NyaXB0b3IiIEAxMzINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzENCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzksIC03NzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzDQotCQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJCWxvY2F0aW9uICAgCSg2NDcsIDg3NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU0Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuNjE3OTE1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RTI4MDBCNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTQxLCA4NjEpDQotCQkJCSg2NjIsIDk1MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0DQotCQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJCWxvY2F0aW9uICAgCSg2OTAsIDkwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTUzMDUyDQotCQkJCWhlaWdodCAgICAgCTU5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJKYXJGaWxlIiBAMTM1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzM5LCAtNzcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDIxLCA4MjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYkphckZpbGUiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RTI4MDBCNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTMwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTQxLCA4NjEpDQotCQkJCSg0MjEsIDc2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIgQDEzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTc2LCA2NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJbG9jYXRpb24gICAJKDczNSwgNTg3KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI4MTAxMjgiDQotCQkgICAgd2lkdGggICAgICAJNTAwDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiIEAxMzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyMCwgNzA0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzOA0KLQkJCWxvY2F0aW9uICAgCSgyMTIxLCA2MjcpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXBwbGljYXRpb25DbGllbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIHdpZHRoICAgICAgCTQxNg0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTM5DQotCQkgICAgbG9jYXRpb24gICAJKDE2NjksIDY2MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjI5ODQ2MjAzOUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAxNDANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKC03OTUsIDEwMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDENCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkJbG9jYXRpb24gICAJKDE0MDcsIDY1NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5MTgwOQ0KLQkJCQloZWlnaHQgICAgIAk2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk4NDYyMDM5RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTM3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY2OSwgNjYwKQ0KLQkJCQkoMTIyNiwgNjYwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NjksIDY2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjYsIDY2MCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVwbG95bWVudERlc2NyaXB0b3IiIEAxNDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKC03OTUsIDEwMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDINCi0JCQkJbG9jYXRpb24gICAJKDIwMjIsIDYxOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU0Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk4NDYyMDM5RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTM4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY2OSwgNjYwKQ0KLQkJCQkoMjExMiwgNjYwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NjksIDY2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTIsIDY2MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0DQotCQkJCVBhcmVudF9WaWV3IAlAMTQyDQotCQkJCWxvY2F0aW9uICAgCSgyMDY4LCA3MTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OlJBUkZpbGUiIEAxNDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDE2MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ1DQotCQkJbG9jYXRpb24gICAJKDE3NzYsIDE1NDcpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUkFSRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjNBNkRFQkNGMDNDNSINCi0JCSAgICB3aWR0aCAgICAgIAkyNDINCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0b3IiIEAxNDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU0NCwgMTY0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDYNCi0JCQlsb2NhdGlvbiAgIAkoMjQxMywgMTU3MSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb25uZWN0b3IiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTA5MTAxMEYiDQotCQkgICAgd2lkdGggICAgICAJMjgwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEAxNDcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIwNiwgMTYxMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjI5ODMyMTAzNUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEAxNDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzgsIC0zNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkJbG9jYXRpb24gICAJKDIwNDksIDE1NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk4MzIyMDI5OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQ1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjIwNiwgMTYxMikNCi0JCQkJKDIwMDksIDE2MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDksIDE2MTIpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBAMTUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzM4LCAtMzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxDQotCQkJCVBhcmVudF9WaWV3IAlAMTUwDQotCQkJCWxvY2F0aW9uICAgCSgyMzYzLCAxNTcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTgzMjIwMjg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjA2LCAxNjEyKQ0KLQkJCQkoMjQwNCwgMTYxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwNCwgMTYxMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUyDQotCQkJCVBhcmVudF9WaWV3IAlAMTUwDQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxNjY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbiIgQDE1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjA4LCAzNTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUzDQotCQkJbG9jYXRpb24gICAJKDI0NTYsIDI3NSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzA0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgd2lkdGggICAgICAJMzIyDQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFQVJGaWxlIiBAMTU0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzODQsIDQwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTQNCi0JCQlsb2NhdGlvbiAgIAkoMjcyLCAzNDgpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUFSRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI3OTAwN0QiDQotCQkgICAgd2lkdGggICAgICAJMjQyDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDE1NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDc2LCAzNDgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBAMTU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU1DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NjAsIC02MTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU3DQotCQkJCVBhcmVudF9WaWV3IAlAMTU2DQotCQkJCWxvY2F0aW9uICAgCSgyMDk4LCAzMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2RlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0MTU3MQ0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0Y2RTAyNDciDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0NzYsIDM0OCkNCi0JCQkJKDI0NDcsIDM0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDc2LCAzNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDQ3LCAzNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjMxMywgMzg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjIwNjENCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVhckZpbGUiIEAxNTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDY2MCwgLTYxMikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0Y2RTAyNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0NzYsIDM0OCkNCi0JCQkJKDUwNSwgMzQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzYsIDM0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUwNSwgMzQ4KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNb2R1bGVSZWZzIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNzEyNTgyMDA1MSINCi0JICAgIHRpdGxlICAgICAgCSJNb2R1bGVSZWZzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFSkJNb2R1bGVSZWYiIEAxNjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc2OCwgNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2MA0KLQkJCWxvY2F0aW9uICAgCSg1OTMsIDM2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQk1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyNUE4MDJBNSINCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OldlYk1vZHVsZVJlZiIgQDE2MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTYwLCA1OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYxDQotCQkJbG9jYXRpb24gICAJKDc3OSwgNTQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViTW9kdWxlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTI1QjEwMjkzIg0KLQkJICAgIHdpZHRoICAgICAgCTM4MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q2xpZW50TW9kdWxlUmVmIiBAMTYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCA3ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYyDQotCQkJbG9jYXRpb24gICAJKDkzMSwgNzMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ2xpZW50TW9kdWxlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTI1QjkwMjU5Ig0KLQkJICAgIHdpZHRoICAgICAgCTM5Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q29ubmVjdG9yTW9kdWxlUmVmIiBAMTYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjE2LCAxMDA4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Mw0KLQkJCWxvY2F0aW9uICAgCSg5NzIsIDk1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbm5lY3Rvck1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyNUM2MDBFNSINCi0JCSAgICB3aWR0aCAgICAgIAk1MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OldlYk1vZHVsZSIgQDE2NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2NA0KLQkJCWxvY2F0aW9uICAgCSgxNTE2LCA2NDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODYwRDAyN0IiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpKYXZhQ2xpZW50TW9kdWxlIiBAMTY1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDAwLCAxMDI0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCWxvY2F0aW9uICAgCSgxODIzLCA5NDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xpZW50TW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2NzMwMDE1Ig0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6RWpiTW9kdWxlIiBAMTY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjE2LCA1MTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDQzMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYk1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NjgzMDI1MyINCi0JCSAgICB3aWR0aCAgICAgIAkzMzANCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkNvbm5lY3Rvck1vZHVsZSIgQDE2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMTI5NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjcNCi0JCQlsb2NhdGlvbiAgIAkoMjA0NCwgMTIxNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbm5lY3Rvck1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk1QkMwMDIyNyINCi0JCSAgICB3aWR0aCAgICAgIAkzNzgNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OldBUkZpbGUiIEAxNjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgNTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2OA0KLQkJCWxvY2F0aW9uICAgCSgxMzMsIDQ5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI0OTAxOEMiDQotCQkgICAgd2lkdGggICAgICAJMjY0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpBcHBsaWNhdGlvbkNsaWVudEZpbGUiIEAxNjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgNzM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2OQ0KLQkJCWxvY2F0aW9uICAgCSgxMjgsIDY4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjgxMDEyOCINCi0JCSAgICB3aWR0aCAgICAgIAk0OTgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OlJBUkZpbGUiIEAxNzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgOTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3MA0KLQkJCWxvY2F0aW9uICAgCSg0OTksIDg5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTZERUJDRjAzQzUiDQotCQkgICAgd2lkdGggICAgICAJMjM2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpFSkJKYXJGaWxlIiBAMTcxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDM1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQlsb2NhdGlvbiAgIAkoMzYsIDMwMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphckZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkIyNTAwMjIiDQotCQkgICAgd2lkdGggICAgICAJMjk4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiIEAxNzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5NjgsIDE2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzINCi0JCQlsb2NhdGlvbiAgIAkoMTc5MywgMzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE3Mg0KLQkJCWxvY2F0aW9uICAgCSgxODg3LCAyMDMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkwKQ0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE3Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTY4LCAzOTYpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDE3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxOTY4LCAzOTYpDQotCQkJKDE5NjgsIDMwMSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2QjYwMzc5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNjYNCi0JCSAgICBzdXBwbGllciAgIAlAMTcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE2NzUsIDQyMSkNCi0JCQkoMTY3NSwgMzk2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc1LCA0MjEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzUsIDM5NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNzMpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODZBRTAxQzkiDQotCQkgICAgY2xpZW50ICAgICAJQDE2NA0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTc2NiwgNjM2KQ0KLQkJCSgxNzY2LCAzOTYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NjYsIDYzNikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2NiwgMzk2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE3MykNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3Ng0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NkIyMDFGNiINCi0JCSAgICBjbGllbnQgICAgIAlAMTY1DQotCQkgICAgc3VwcGxpZXIgICAJQDE3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMDAwLCA5MzMpDQotCQkJKDIwMDAsIDM5NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjAwMCwgOTMzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAwLCAzOTYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTczKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTVCQ0EwMjE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNjcNCi0JCSAgICBzdXBwbGllciAgIAlAMTcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIzNTAsIDEyMDQpDQotCQkJKDIzNTAsIDM5NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM1MCwgMTIwNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1MCwgMzk2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE3MykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZVJlZiIgQDE3OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAxMTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzgNCi0JCQlsb2NhdGlvbiAgIAkoNzk4LCA2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSINCi0JCSAgICB3aWR0aCAgICAgIAkyNzgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZUZpbGUiIEAxNzkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc5DQotCQkJbG9jYXRpb24gICAJKDE0MSwgNjEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNb2R1bGVGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2Ig0KLQkJICAgIHdpZHRoICAgICAgCTI4MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE4MA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDI2NikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI3MiwgMjY2KQ0KLQkJCSgyNzIsIDE3NSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyOTAwM0U0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNjgNCi0JCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDMxOSwgNDgxKQ0KLQkJCSgzMTksIDI2NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzE5LCA0ODEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMxOSwgMjY2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE4MCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMjc5MDIxNCINCi0JCSAgICBjbGllbnQgICAgIAlAMTY5DQotCQkgICAgc3VwcGxpZXIgICAJQDE3OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzODQsIDY3MykNCi0JCQkoMzg0LCAyNjYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM4NCwgNjczKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODQsIDI2NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxODApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzI3RDAzQkUiDQotCQkgICAgY2xpZW50ICAgICAJQDE3MQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjI1LCAyODgpDQotCQkJKDIyNSwgMjY2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjUsIDI4OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAyNjYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTgwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E2REVCRTcwMUNCIg0KLQkJICAgIGNsaWVudCAgICAgCUAxNzANCi0JCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDYwMCwgODgxKQ0KLQkJCSg2MDAsIDI2NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAwLCA4ODEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMCwgMjY2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE4MCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMTg1DQotCQkgICAgbG9jYXRpb24gICAJKDYwMCwgMTEyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRUY5MDJGNCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMTg2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1DQotCQkJICAgIGxvY2F0aW9uICAgCSgzNjAsIC0xMTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3DQotCQkJCVBhcmVudF9WaWV3IAlAMTg2DQotCQkJCWxvY2F0aW9uICAgCSg3NTAsIDcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGQTAyNEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxODUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDYwMCwgMTEyKQ0KLQkJCQkoNzg4LCAxMTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1vZHVsZUZpbGUiIEAxODgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkgICAgbG9jYXRpb24gICAJKDM2MCwgLTExMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODgNCi0JCQkJbG9jYXRpb24gICAJKDQ4OSwgNzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZUZpbGUiDQotCQkJCXBjdERpc3QgICAgCTAuNTk0NTU3DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNzExRUZBMDI0QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjAwLCAxMTIpDQotCQkJCSg0MTIsIDExMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkwDQotCQkJCVBhcmVudF9WaWV3IAlAMTg4DQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE2NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE5MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDI5NykNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMTc4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkyOCwgMjk3KQ0KLQkJCSg5MjgsIDE3NSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTkyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTJBMUQwMTY1Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNjANCi0JCSAgICBzdXBwbGllciAgIAlAMTc4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDgwOSwgMzUzKQ0KLQkJCSg4MDksIDI5NykpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODA5LCAzNTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgMjk3KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE5MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyQTIwMDFFQiINCi0JCSAgICBjbGllbnQgICAgIAlAMTYxDQotCQkgICAgc3VwcGxpZXIgICAJQDE3OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5NzUsIDUyOCkNCi0JCQkoOTc1LCAyOTcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk3NSwgNTI4KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzUsIDI5NykNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxOTEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMkEyQjAyNUYiDQotCQkgICAgY2xpZW50ICAgICAJQDE2Mw0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTM1MCwgOTQ0KQ0KLQkJCSgxMzUwLCAyOTcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTAsIDk0NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgMjk3KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE5MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyQTIzMDMxQyINCi0JCSAgICBjbGllbnQgICAgIAlAMTYyDQotCQkgICAgc3VwcGxpZXIgICAJQDE3OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMjAwLCA3MjApDQotCQkJKDEyMDAsIDI5NykpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIwMCwgNzIwKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjAwLCAyOTcpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTkxKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9lamJzY2hlbWEuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvZWpic2NoZW1hLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmMDk0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9lamJzY2hlbWEuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTM1NzYgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVqYiINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJJREwiDQotCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImVqYi54bWkiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRWpiIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzc4MEUyNzIwMzJEIg0KLSAgICBzdGVyZW90eXBlIAkibWV0YW1vZGVsIg0KLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzgwNTY3RjUwMzg0Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YSINCi0JICAgIHF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwMi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEZGM0MxQzAyNTYiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwNC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTc1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTY5NzAzNTEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMDM5RjAxQ0QiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLg0KLXwNCi18QGludmFyaWFudCBUaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogMS54ICwgMi54DQotfEBkZWZhdWx0IDIueA0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGluaXR2ICAgICAgCSIyLngiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdFNjaGVtYU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxRjIzMDJDNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4NCi18DQotfEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4NCi18DQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHlCZWFuIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzYzMDA5RiINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kUGVybWlzc2lvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDA1LTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kL29yIGhvbWUgaW50ZXJmYWNlcy4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDA2LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDM5OTAzMEUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmNoZWNrZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTZCNTJDMDIwOSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OmVCQUZNb2RlbHM6OkVKQlNjaGVtYTo6TWV0aG9kUGVybWlzc2lvbiINCi0JICAgIHF1aWR1ICAgICAgCSIzNzgwRTM2MzAwQTAiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkFzc2VtYmx5RGVzY3JpcHRvciINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDA3LTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgZWxlbWVudCBjb250YWlucyBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLiBBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4iDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OmVCQUZNb2RlbHM6OkVKQlNjaGVtYTo6QXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzVCMDJDNSINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kVHJhbnNhY3Rpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwOC0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMERFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwREYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzlGNjM0NTAzQzAiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMGEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1QzA1MDI5NiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OmVCQUZNb2RlbHM6OkVKQlNjaGVtYTo6TWV0aG9kVHJhbnNhY3Rpb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNjMwMEExIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXNzaW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEU1RjkwMUVCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZXNzaW9uLWJlYW5UeXBlIGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlDQotfGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOg0KLXwNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24NCi18ICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lDQotfCAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UNCi18ICAgICAgaWNvbiBmaWxlIG5hbWUNCi18ICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4NCi18ICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb24NCi18ICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQNCi18ICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQ0KLXwgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kDQotfCAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQ0KLXwgICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQNCi18ICAgICAgaW50ZXJmYWNlLCBpZiBhbnkNCi18ICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzDQotfCAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUNCi18ICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQ0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzDQotfCAgICAgIGVudmlyb25tZW50IGVudHJpZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsDQotfCAgICAgIEVKQiByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViDQotfCAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQ0KLXwgICAgICByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQ0KLXwgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlDQotfCAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQ0KLXwgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLg0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UNCi18ICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcw0KLXwNCi18VGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQ0KLXx0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZQ0KLXxlbXB0eS4NCi18DQotfEVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aA0KLXx0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlDQotfHNlc3Npb24gYmVhbi4NCi18DQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZQ0KLXxiZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEyMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2FjdGlvblR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDBkLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEU2MjQwM0NFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuDQotfA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiVHJhbnNhY3Rpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0ZDQTQ4NzAyRUYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXNzaW9uVHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTY1QjAzN0QiDQotCQkgICAgdHlwZSAgICAgICAJIlNlc3Npb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQ0EwNzAxMEMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6OlNlc3Npb25CZWFuIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFODFBMDE1OSINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEU2OTcwMzUxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbnRpdHkgZWxlbWVudCBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuknMgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbpJzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZSwgaWYgYW55OyB0aGUgZW50aXR5IGJlYW6ScyBpbXBsZW1lbnRhdGlvbiBjbGFzczsgdGhlIGVudGl0eSBiZWFuknMgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlOyB0aGUgZW50aXR5IGJlYW6ScyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lOyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbpJzIHJlZW50cmFuY3k7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuknMgY21wLXZlcnNpb247IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuknMgYWJzdHJhY3Qgc2NoZW1hIG5hbWU7IGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZDsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW6ScyBlbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbpJzIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbpJzIGxvY2FsIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbpJzIG1ldGhvZHM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuknMgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW6ScyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBzZXQgb2YgcXVlcnkgZGVjbGFyYXRpb25zIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4NCi18VGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4gVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eZJzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5knMgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4NCi18VGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54Lg0KLXxUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4NCi18VGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uDQotfFRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZg0KLXx0aGUgZW50aXR5knMgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlIGVudGl0eZJzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFODA4MDA5NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZWVudHJhbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDAzLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEU2QTIwMzFCIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5IGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6OkVudGl0eUJlYW4iDQotCSAgICBxdWlkdSAgICAgIAkiMzc4MEU4MUEwMTVBIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFbnRlcnByaXNlQmVhbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDA0LTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkgICAgdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RW50ZXJwcmlzZUphdmFCZWFuIGlzIGEgY2xhc3MuICBJdCBjYW4gaGF2ZSBpbnN0YW5jZXMsIHNvbWVvbmUgY291bGQgd3JpdGUgYW4gDQotfGluc3RhbmNlIGRvY3VtZW50IGNvbnRhaW5pbmcgRGVwYXJ0bWVudHMgYW5kIEVtcGxveWVlcy4gIEl0IGFsc28gaGFzIA0KLXxhdHRyaWJ1dGVzLCBvcGVyYXRpb25zLCBhbmQgYXNzb2NpYXRpb25zLiAgVGhlc2UgYXJlIGFjdHVhbGx5IGRlcml2ZWQvZmlsdGVyZWQgDQotfGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuICBGb3IgbWFwcGluZyBhbmQgYnJvd3NpbmcgDQotfHB1cnBvc2VzLCB0aG91Z2gsIHlvdSB3b3VsZCBsaWtlIHRoZSBFSkIgdG8gYXBwZWFyIGFzIGEgY2xhc3MuICANCi18DQotfEluIHRoaXMgbGlnaHQsIGV2ZW4gU2Vzc2lvbiBCZWFucyBjYW4gaGF2ZSBhc3NvY2lhdGlvbnMgYW5kIHByb3BlcnRpZXMgDQotfGltcGxlbWVudGVkIGJ5IHRoZWlyIGJlYW4uICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgbWVhbmluZ2Z1bCB0byBkZXNjcmliZSANCi18YXNzb2NpYXRpb25zIGZyb20gYSBTZXNzaW9uIHRvIHRoZSBFbnRpdGllcyB3aGljaCBpdCB1c2VzIHRvIHBlcmZvcm0gaXRzIHdvcmsuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NEMzMDA5MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFODg1RDQ5MDI5MCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIG1vZHVsZSAgICAgCSJDb21wb25lbnQgVmlldzo6ZUJBRk1vZGVsczo6RUpCU2NoZW1hOjpFbnRlcnByaXNlSmF2YUJlYW4iDQotCSAgICBxdWlkdSAgICAgIAkiMzc4MEU4MUEwMTVCIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAwYi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzlGNjM0NTAzQzAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Tm90U3VwcG9ydGVkPTENCi18U3VwcG9ydHM9Mg0KLXxSZXF1aXJlZD0zDQotfFJlcXVpcmVzTmV3PTQNCi18TWFuZGF0b3J5PTUNCi18TmV2ZXI9Ng0KLXwNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5vdFN1cHBvcnRlZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1NzNDMDA3RCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlN1cHBvcnRzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAwZC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwNTU3NEYwMzczIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUmVxdWlyZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDBlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTc1NDAxN0MiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSZXF1aXJlc05ldyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMGYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1NzVEMDFCMSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk1hbmRhdG9yeSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTAtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1NzYxMDFBQyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5ldmVyIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAxMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwNTU3NjkwMTIyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiVHJhbnNhY3Rpb25UeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTItMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdGQ0E0ODcwMkVGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEJlYW49MQ0KLXxDb250YWluZXI9Mg0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQmVhbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1MUQzMDE1MyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNvbnRhaW5lciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1MURDMDEzOCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlc3Npb25UeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzcxQkNBMDcwMTBDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFN0YXRlZnVsPTENCi18U3RhdGVsZXNzPTINCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlN0YXRlZnVsIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAxNi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkNBMTUwMDgwIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU3RhdGVsZXNzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAxNy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkNBMjIwMTE1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVKQk1ldGhvZENhdGVnb3J5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTgtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzgxMEQwMzgwMzQ0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWxpZCBFSkIgbWV0aG9kIGNhdGVnb3J5IG5hbWVzIGFyZTogRUpCSE9NRU1FVEhPRCwgRUpCQ1JFQVRFTUVUSE9ELCBFSkJGSU5ERVJNRVRIT0QsIEVKQlJFTU9URU1FVEhPRC4iDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVKQkphciINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDE5LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUNCi18bmFtZTsgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkIGVudGVycHJpc2UgYmVhbnM7IGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55OyBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yOyBhbmQgYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4NCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImNvbXBvbmVudCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMTU4MDM0NyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlamJDbGllbnRKYXIiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDFlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJEQThCMDAwRTAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUiBmaWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gIEV4YW1wbGU6PGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvZWpiLWNsaWVudC1qYXI+DQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU1QUUzQjAyMTciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQ0KLXwgICAgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgbXVzdA0KLXwgICAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzDQotfCAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQNCi18ICAgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCDQotfCAgICBzY2hlbWEuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXRob2RFbGVtZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMWYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncw0KLXxob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50DQotfG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIGRlY2xhcmVkIGluIHRoZQ0KLXxkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bw0KLXxkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgZGVmaW5lZCBpbg0KLXxib3RoIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMNCi18dGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQ0KLXxzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLg0KLXwNCi18VGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4Og0KLXwNCi18MS4gCTxtZXRob2Q+DQotfAkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPg0KLXwgICAJCTxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4NCi18CTwvbWV0aG9kPg0KLXwNCi18ICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkDQotfCAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLg0KLXwNCi18Mi4gCTxtZXRob2Q+DQotfAkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPg0KLXwgICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPg0KLXwJPC9tZXRob2Q+Pg0KLXwNCi18ICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQ0KLXwgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoDQotfCAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8NCi18ICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4NCi18DQotfA0KLXwNCi18DQotfA0KLXwzLiAJPG1ldGhvZD4NCi18CQk8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+DQotfCAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+DQotfAkJPG1ldGhvZC1wYXJhbXM+DQotfCAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPg0KLXwgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4NCi18ICAgICAgICAgIAkJCS4uLg0KLXwgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4NCi18CQk8L21ldGhvZC1wYXJhbXM+DQotfAk8bWV0aG9kPgkNCi18DQotfCAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mDQotfCAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUNCi18ICAgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmDQotfCAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudA0KLXwgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUNCi18ICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlDQotfCAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLg0KLXwNCi18DQotfFVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uIGFuZCBjb250YWluZXItdHJhbnNhY3Rpb24NCi18DQotfEV4YW1wbGVzOg0KLXwNCi18ICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZg0KLXwJCXRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOg0KLXwNCi18CQk8bWV0aG9kPg0KLXwJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4NCi18CQkJPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPg0KLXwJCTwvbWV0aG9kPg0KLXwNCi18CVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlDQotfAkJbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZToNCi18DQotfCAgICAJCTxtZXRob2Q+DQotfAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPg0KLXwJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4NCi18CQk8L21ldGhvZD4NCi18DQotfAlTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUNCi18CQljcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlDQotfAkgCUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuDQotfA0KLXwgICAgCQk8bWV0aG9kPg0KLXwJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4NCi18CQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+DQotfAkJCTxtZXRob2QtcGFyYW1zPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4NCi18CQkJPC9tZXRob2QtcGFyYW1zPg0KLXwJCTwvbWV0aG9kPg0KLXwNCi18CQ0KLXwJVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgNCi18CW1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QNCi18CQkJZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwNCi18CQkJCW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKQ0KLXwgICAgICAgIHdvdWxkIGJlIHNwZWNpZmllZCBhczoNCi18DQotfCAgICAJCTxtZXRob2Q+DQotfAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPg0KLXwJCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4NCi18CQkJPG1ldGhvZC1wYXJhbXM+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4NCi18CQkJCTxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPg0KLXwJCQk8L21ldGhvZC1wYXJhbXM+DQotfAkJPC9tZXRob2Q+DQotfA0KLXwJVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzDQotfCAgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZQ0KLXwgICBpbnRlcmZhY2UgYW5kIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgaXMNCi18ICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4NCi18DQotfAlGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50DQotfA0KLXwgICAJCTxtZXRob2Q+DQotfAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPg0KLXwJCQk8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4NCi18CQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+DQotfAkJCTxtZXRob2QtcGFyYW1zPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4NCi18CQkJPC9tZXRob2QtcGFyYW1zPg0KLXwJCTwvbWV0aG9kPg0KLXwNCi18CWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kDQotfCAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQ0KLXwgICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMNCi18DQotfCAgIAkJPG1ldGhvZD4NCi18CQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+DQotfAkJCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4NCi18CQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+DQotfAkJCTxtZXRob2QtcGFyYW1zPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4NCi18CQkJPC9tZXRob2QtcGFyYW1zPg0KLXwJCTwvbWV0aG9kPg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDIwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDI2NDAzNzgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gbWV0aG9kLA0KLXxvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudA0KLXxkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUNCi18aW50ZXJmYWNlcy4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcm1zIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQyNjQwMzk2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGEgc3BhY2UgZGVsaW1pdHRlZCBTdHJpbmcuICBBIG51bGwgc3RyaW5nIGluZGljYXRlcyBhIGdlbmVyaWMgbWV0aG9kIGVsZW1lbnQgdGhhdCBjYW4gYXBwbHkgdG8gbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUuICBBbiBlbXB0eSBzdHJpbmcgaW5kaWNhdGVzIGEgbWV0aG9kIHdpdGggemVybyBwYXJhbWV0ZXJzLiAgSW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucyAocG9zdCBWNSksIHRoaXMgZmllbGQgd2lsbCBiZSBkZXByZWNhdGVkIGFuZCBtaWdyYXRlZCB0byB1c2UgdGhlIG11bHRpLXZhbHVlZCBwYXJhbXMgZmllbGQgYW5kIHRoZSBpc1plcm9QYXJhbXMgZmxhZy4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDIyLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQyNjQwM0I0Ig0KLQkJICAgIHR5cGUgICAgICAgCSJNZXRob2RFbGVtZW50S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyRTcwMjQwIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDIzLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NDZDMjAzNzAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kRWxlbWVudEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyNC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTJFRDJFNzAyNDAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBhZGRlZCBTZXJ2aWNlRW5kcG9pbnQNCi18VW5zcGVjaWZpZWQ9MA0KLXxSZW1vdGU9MQ0KLXxIb21lPTINCi18TG9jYWw9Mw0KLXxMb2NhbEhvbWU9NA0KLXxTZXJ2aWNlRW5kcG9pbnQ9NQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVW5zcGVjaWZpZWQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQjQ3QTI4MDE4MCIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSZW1vdGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDI2LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDMxMTAyNEEiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSG9tZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0NCNDdBNzMwMTg4IikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxvY2FsIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NkUwRDAzMDEiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTG9jYWxIb21lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NkUwRjAyMDkiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU2VydmljZUVuZHBvaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjhBMTAzMzMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkNNUEF0dHJpYnV0ZSINCi0JICAgIHF1aWQgICAgICAgCSIzQTIyODg2MzAwMDMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBMjI4ODc3MDM0MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5OUFCQzE1MDBGMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBjbXIgZmllbGQuDQotfA0KLXxUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUmVsYXRpb25zaGlwcyINCi0JICAgIHF1aWQgICAgICAgCSIzOUJFRjgxNzAzQjMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJlbGF0aW9uc2hpcHMgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIHBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwcyBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwOTY3MDIzOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHJlbGF0aW9uc2hpcHMuDQotfA0KLXxUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUXVlcnkiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeQ0KLXxpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50IHNob3VsZCBiZSBlbXB0eS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMDUwRDAwNEQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcXVlcnkuDQotfA0KLXxUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlamJRTCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjA1OEMwMzk5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5IHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QgdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4gVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuDQotfA0KLXxAaW52YXJpYW50IFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIG9yIGRlcGVuZGVudCBvYmplY3QgY2xhc3MgZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuDQotfEBpbnZhcmlhbnQgVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuDQotfA0KLXxFeGFtcGxlOg0KLXw8cXVlcnk+DQotfDxxdWVyeS1tZXRob2Q+DQotfDxtZXRob2QtbmFtZT5lamJTZWxlY3RQZW5kaW5nTGluZWl0ZW1zPC9tZXRob2QtbmFtZT4NCi18PG1ldGhvZC1wYXJhbXMvPg0KLXw8L3F1ZXJ5LW1ldGhvZD4NCi18PGVqYi1xbD5TRUxFQ1QgRU5USVRZKGwpDQotfEZST00gTGluZUl0ZW1zIGwNCi18V0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFDQotfDwvZWpiLXFsPg0KLXw8L3F1ZXJ5Pg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXR1cm5UeXBlTWFwcGluZyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODcxMDcwMkNBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8gc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHRoYXQgaXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvciBFSkJPYmplY3QgdHlwZS4gIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50LCBpZiBzcGVjaWZpZWQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4iDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlJldHVyblR5cGVNYXBwaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NzBEMzAyNzYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRUpCUmVsYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjBDMDIwM0JGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjMNCi18VGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZS4gQW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlcy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuDQotfA0KLXxAaW52YXJpYW50IFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLg0KLXxAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXMuc2l6ZSA9PSAyDQotfEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1swXS5uYW1lICE9IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMV0ubmFtZQ0KLXwNCi18QG1pZ3JhdGlvbiBFSkIxLjEgTW92ZWQgZnJvbSBlamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIHVuZGVyIGVqYmV4dDo6RUpCSmFyRXh0ZW5zaW9uDQotfEBtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgZGVzY3JpcHRpb246U3RyaW5nDQotfEBtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgbmFtZTpTdHJpbmcgKE1heSBoYXZlIGJlZW4gaW5oZXJpdGVkIGZyb20gUmVmQmFzZU9iamVjdCBwcmV2aW91c2x5KQ0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwRDRBMDJCQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBlamIgcmVsYXRpb24uDQotfA0KLXxUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMEQ2RjAzN0UiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIElmIHNwZWNpZmllZCwgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuDQotfEBpbnZhcmlhbnQgc2VsZi5uYW1lIHVuaXF1ZSB3aXRoaW4gU2V0PGNvbGxlY3QoZWpiSmFyLmVqYlJlbGF0aW9ucy5uYW1lKT4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVKQlJlbGF0aW9uc2hpcFJvbGUiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjBERDAwMjNEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjMNCi18VGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEgcmVsYXRpb25zaGlwLg0KLXxUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7IHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4gVGhlIG11bHRpcGxpY2l0eSBhbmQgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4gVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5LWJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZiBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhhdCBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuDQotfA0KLXxAaW52YXJpYW50IG11bHRpcGxpY2l0eSAhPSBudWxsDQotfEBpbnZhcmlhbnQgcm9sZVNvdXJjZSAhPSBudWxsDQotfEBpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBpbiB3aGljaCB0aGUgcm9sZVNvdXJjZSBlbGVtZW50IHNwZWNpZmllcyBhIGRlcGVuZGVudCBvYmplY3QgY2xhc3MuIA0KLXxAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLg0KLXwNCi18RXhhbXBsZToNCi18PGVqYi1yZWxhdGlvbj4NCi18ICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvZWpiLXJlbGF0aW9uLW5hbWU+DQotfCAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4NCi18ICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPg0KLXwgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4NCi18ICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+DQotfCAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4NCi18ICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPg0KLXwgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPg0KLXwuLi4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMTAyNjAxQjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uc2hpcCByb2xlLg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicm9sZU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxMTU4MDA1MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIGEgcm9sZS4NCi18DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm11bHRpcGxpY2l0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjEyRTkwMkNGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxEZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLg0KLXwNCi18VGhlIG11bHRpcGxpY2l0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOg0KLXwgICAgIE9uZQ0KLXwgICAgIE1hbnkNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIk11bHRpcGxpY2l0eUtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFFQkNCMDJCNyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNhc2NhZGVEZWxldGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxNjFFMDJFRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18U3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4gQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuDQotfA0KLXwNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUm9sZVNvdXJjZSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMTQ3NTAwRTQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLg0KLXxAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg4NDkxMDJFQiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkNNUkZpZWxkIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYxODEwMDA0QiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS4zDQotfERlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YgYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhIHJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6bmFtZSBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvciBtZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6OnR5cGUgZWxlbWVudCBpcyB1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIENNUkZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZCAoYSBqYXZhIGNsYXNzIG5hbWUpLg0KLXwNCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5OUFENDY5MDE3MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNNUEF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NjMwMDAzIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlRHJpdmVuIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYzMjQ4MDEwQiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuDQotfGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoNCi18DQotfCAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQ0KLXwgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlDQotfCAgICAgIGljb24gZmlsZSBuYW1lLg0KLXwgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbg0KLXwgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yDQotfCAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcNCi18ICAgICAgdHlwZQ0KLXwgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQ0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzDQotfCAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQ0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzDQotfCAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzDQotfCAgICAgIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQNCi18ICAgICAgZW50cmllcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCDQotfCAgICAgIHJlZmVyZW5jZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQ0KLXwgICAgICByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQ0KLXwgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MNCi18ICAgICAgbWV0aG9kcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzDQotfCAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5DQotfCAgICAgIHJlZmVyZW5jZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQ0KLXwgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLg0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UNCi18ICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcw0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzI1MzAyNkYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNhY3Rpb25UeXBlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzM4NzAxNjQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4NCi18DQotfFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IEJlYW4sIENvbnRhaW5lcg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJUcmFuc2FjdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RkNBNDg3MDJFRiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2VTZWxlY3RvciINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjMzOTYwMTMzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWVzc2FnZS1zZWxlY3RvciBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgSk1TIG1lc3NhZ2UNCi18c2VsZWN0b3IgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBtZXNzYWdlcyBhIG1lc3NhZ2UtZHJpdmVuDQotfGJlYW4gaXMgdG8gcmVjZWl2ZS4NCi18DQotfEV4YW1wbGUgdmFsdWU6IA0KLXxKTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgPiAyNTAwDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhY2tub3dsZWRnZU1vZGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzM0FFMDE2MCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18YW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkIChpZS4gc2VsZi50cmFuc2FjdGlvblR5cGUgPSBCZWFuKQ0KLXwNCi18VGhlIGFja25vd2xlZGdlLW1vZGUgc3BlY2lmaWVzIHdoZXRoZXIgSk1TIEFVVE9fQUNLTk9XTEVER0Ugb3IgRFVQU19PS19BQ0tOT1dMRURHRSBtZXNzYWdlIGFja25vd2xlZGdtZW50IHNlbWFudGljcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG9uTWVzc2FnZSBtZXNzYWdlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiB0aGF0IHVzZXMgYmVhbiBtYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLg0KLXwNCi18VGhlIGFja25vd2xlZGdlLW1vZGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBBdXRvLWFja25vd2xlZGdlLCBEdXBzLW9rLWFja25vd2xlZGdlDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJBY2tub3dsZWRnZU1vZGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzNkQ3MDNFNCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjQwNTdBNTI1MDA4QSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18IC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncw0KLXwJICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYzM0YxMDA0NCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gZWxlbWVudCBwcm92aWRlcyBhZHZpY2UgdG8gdGhlIERlcGxveWVyIGFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEgVG9waWMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbnRlbmRlZCBkZXN0aW5hdGlvbiBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2Ygd2hldGhlciBhIGR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBkZXN0aW5hdGlvbi10eXBlIGlzIGphdmF4Lmptcy5Ub3BpYy4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM4NkIwMDJEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4NCi18DQotfFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IGphdmF4Lmptcy5RdWV1ZSwgamF2YXguam1zLlRvcGljDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIkRlc3RpbmF0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5NzhGNUMwMTA2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM4OUIwMDg3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZSBvciBub25kdXJhYmxlLg0KLXwNCi18VGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBEdXJhYmxlLCBOb25EdXJhYmxlDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjM4RjAwMjlDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkFja25vd2xlZGdlTW9kZSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMzZENzAzRTQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QXV0by1hY2tub3dsZWRnZT0wDQotfER1cHMtb2stYWNrbm93bGVkZ2U9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQXV0b0Fja25vd2xlZGdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzZGQTAzQkMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJEdXBzT2tBY2tub3dsZWRnZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM3MDEwMzhBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYzOEYwMDI5QyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxEdXJhYmxlPTANCi18Tm9uRHVyYWJsZT0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJEdXJhYmxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzkxQjAxQUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOb25EdXJhYmxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzkxRDAyREMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUmV0dXJuVHlwZU1hcHBpbmciDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODcwRDMwMjc2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfExvY2FsPTANCi18UmVtb3RlPTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxvY2FsIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NzBFNDAyRTgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSZW1vdGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFOUIwQjRGMDAyQSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJFeGNsdWRlTGlzdCINCi0JICAgIHF1aWQgICAgICAgCSIzOTk3MjE2RTAxNDciDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGV4Y2x1ZGUgbGlzdCBlbGVtZW50IGRlZmluZXMgYSBzZXQgb2YgbWV0aG9kcyB3aGljaCB0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuIEl0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG1ldGhvZHMuDQotfA0KLXxJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgbXVzdCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTcyMUExMDBBMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRlc3RpbmF0aW9uVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTk3OEY1QzAxMDYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18UXVldWU9MA0KLXxUb3BpYz0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJRdWV1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5NzhGNjgwMzUyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVG9waWMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTc4RjdDMDAyNiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJRdWVyeU1ldGhvZCINCi0JICAgIHF1aWQgICAgICAgCSIzOTlBQ0Q5QzAyREYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRDIzODAyQTkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiKSkpDQotCShvYmplY3QgQ2xhc3MgIk11bHRpcGxpY2l0eUtpbmQiDQotCSAgICBxdWlkICAgICAgIAkiMzk5QUVCQ0IwMkI3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE9uZT0wDQotfE1hbnk9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiT25lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRUJFQTAwMzAiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJNYW55Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRUJFRTAzNzUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxQTFBMDBCRiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlDQotfGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLg0KLXwNCi18VGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyDQotfG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQTM2MDM0QSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQNCi18ICAgICAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbg0KLXwgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFBNDkwMjREIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zDQotfCAgICAgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZg0KLXwgICAgICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4NCi18DQotfCAgICAgICAgRm9yIEpNUyBtZXNzYWdlLWRyaXZlbiBiZWFucywgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eQ0KLXwgICAgICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsDQotfCAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkFjdGl2YXRpb25Db25maWciDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDFBN0UwMTMxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXxleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4NCi18aW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uDQotfGFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZA0KLXxkZXN0aW5hdGlvbiB0eXBlLCBldGMuDQotfA0KLXxUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YNCi18bmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuDQotfA0KLXxUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXINCi18bWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuDQotCSAgICApDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyOC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxMkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMjktMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEyRSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudmlyb25tZW50UHJvcGVydGllcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMmEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEyRiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RW52RW50cnkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDJiLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEzOSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyYy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTNBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicmVzb3VyY2VSZWZzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyZC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTNCIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJFamJUb1JvbGVzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMmUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTQ0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDJmLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxNDUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlSb2xlUmVmcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzAtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDE0NiINCi0JCSAgICBsYWJlbCAgICAgIAkic2VjdXJpdHlSb2xlUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJBc3NlbWJseURlc2NyaXB0b3JUb01ldGhvZFBlcm1pc3Npb25zIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEQxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBEMiINCi0JCSAgICBsYWJlbCAgICAgIAkiYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAibWV0aG9kUGVybWlzc2lvbnMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDMzLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDMiDQotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZFBlcm1pc3Npb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kUGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJNZXRob2RQZXJtaXNzaW9uVG9NZXRob2RzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEVBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9tZXRob2RzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzNS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEVCIg0KLQkJICAgIGxhYmVsICAgICAgCSIvbWV0aG9kcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIvbWV0aG9kUGVybWlzc2lvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFQyINCi0JCSAgICBsYWJlbCAgICAgIAkiL21ldGhvZFBlcm1pc3Npb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RQZXJtaXNzaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpDQotCSAgICBkZXJpdmVkICAgIAlUUlVFKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJBc3NlbWJseURlc2NyaXB0b3JUb01ldGhvZFRyYW5zYWN0aW9ucyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDM3LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBENSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDM4LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDYiDQotCQkgICAgbGFiZWwgICAgICAJImFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZFRyYW5zYWN0aW9ucyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzktMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBENyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZCBpbnZvY2F0aW9ucy4gIFRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuIg0KLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2RUcmFuc2FjdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RUcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMERFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2EtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEUwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9tZXRob2RzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzYi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEUxIg0KLQkJICAgIGxhYmVsICAgICAgCSIvbWV0aG9kcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIvdHJhbnNhY3Rpb25zIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzYy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEUyIg0KLQkJICAgIGxhYmVsICAgICAgCSIvdHJhbnNhY3Rpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kVHJhbnNhY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBERSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gImVqYkNsYXNzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2QtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzgwRkRDMzQwMkM3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBlamItY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLiAgRXhhbXBsZTogPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlamJDbGFzcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2UtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzM1MDFFQyINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiQ2xhc3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzZi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRkRDMzUwMUY2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlamIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJob21lSW50ZXJmYWNlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDAtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzgwRkRDMzcwMUM3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4iDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaG9tZUludGVyZmFjZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzQ0MDE0MyINCi0JCSAgICBsYWJlbCAgICAgIAkiaG9tZUludGVyZmFjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlamIiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGREM0NDAxNEQiDQotCQkgICAgbGFiZWwgICAgICAJImVqYiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gInJlbW90ZUludGVyZmFjZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQzLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzQ2MDA2QSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLg0KLXxFeGFtcGxlOgk8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4NCi18DQotCSAgICANCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZW1vdGVJbnRlcmZhY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQ0LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGREM0NzAxNjYiDQotCQkgICAgbGFiZWwgICAgICAJInJlbW90ZUludGVyZmFjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlamIiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQ1LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGREM0NzAxNjciDQotCQkgICAgbGFiZWwgICAgICAJImVqYiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gInByaW1hcnlLZXkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0Ni0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODBGRERERjAwNkIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicHJpbWFyeUtleSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDctMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MEZEREUwMDExNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZA0KLXxlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4NCi18RXhhbXBsZXM6PHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPg0KLXwJPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC9wcmltLWtleS1jbGFzcz4NCi18CTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC9wcmltLWtleS1jbGFzcz4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInByaW1hcnlLZXkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0OC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRkRERTAwMTIxIg0KLQkJICAgIGxhYmVsICAgICAgCSJlamIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNjk3MDM1MSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiamFyVG9Bc3NlbWJseURlc2NyaXB0b3IiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0OS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEZGM0NGODAxRUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0YS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhGRjNDRjkwMjQ5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJhc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpBc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYkphciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4RkYzQ0Y5MDI2NyINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiSmFyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzU1RDAxRTEiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gImVqYkphclRvRW50ZXJwcmlzZUJlYW5zIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhGRjNEMUYwMDNCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGVycHJpc2VCZWFucyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4RkYzRDFGMDM3QSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbnMuIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRlcnByaXNlQmVhbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiSmFyIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0ZS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhGRjNEMUYwM0NCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlamJKYXIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJKYXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0Zi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTJFRDE4OTAwRkMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicm9sZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDUwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDE4QTAyOEUiDQotCQkgICAgbGFiZWwgICAgICAJInJvbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNTEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVEMThBMDJENCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFBlcm1pc3Npb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjg4MDA3NyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXRob2RFbGVtZW50cyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjg5MDAxRSINCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kRWxlbWVudHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwMi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQyODkwMDI4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kUGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDAzLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MkVENDA5MDBENCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXRob2RFbGVtZW50cyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVENDBBMDE4QSINCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kRWxlbWVudHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVENDBBMDE5RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFRyYW5zYWN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwREUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkzN0Q2RkYwMTFEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGVycHJpc2VCZWFuIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwNy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkzN0Q3MDAwMTc4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRlcnByaXNlQmVhbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAibWV0aG9kRWxlbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDgtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MzdENzAwMDIxOCINCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kRWxlbWVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMjJEMDA4QSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkzRUJGQzUwMEI0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlY3VyaXR5Um9sZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDBhLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTNFQkZDNjAwODMiDQotCQkgICAgbGFiZWwgICAgICAJInNlY3VyaXR5Um9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMUZFMDEyRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwYi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkzRUJGQzYwMEMwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkwNDVBRTQwMUYxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwZC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDVBRTUwMDgwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiUmVmcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMGUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ1QUU1MDMwMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVqYlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDBmLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5ODgzMUMzMDI0NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwZXJzaXN0ZW50QXR0cmlidXRlcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMTAtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODgzMUM1MDE1NyINCi0JCSAgICBsYWJlbCAgICAgIAkicGVyc2lzdGVudEF0dHJpYnV0ZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVBBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMTEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODgzMUM1MDE3RiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDEyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5ODgzMjNCMDM1NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJrZXlBdHRyaWJ1dGVzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAxMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODMyM0QwMjVFIg0KLQkJICAgIGxhYmVsICAgICAgCSJrZXlBdHRyaWJ1dGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTIyODg2MzAwMDMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAxNC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODMyM0QwMjdDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDb250YWluZXJNYW5hZ2VkRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkVGODg3MDM3OCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZWxhdGlvbnNoaXBMaXN0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJFRjg4OTAwM0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGVudGl0eSBiZWFucyBhbmQgZGVwZW5kZW50IG9iamVjdHMgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGEgbGlzdCBvZiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzIGJ1dCB3aG9zZSBhYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGVqYi1qYXIgZmlsZSk7DQotfGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJyZWxhdGlvbnNoaXBMaXN0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6UmVsYXRpb25zaGlwcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4MTcwM0IzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiSmFyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJFRjg4OTAwM0QiDQotCQkgICAgbGFiZWwgICAgICAJImVqYkphciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQkphciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM1NUQwMUUxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjA1NjcwMkNEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInF1ZXJ5TWV0aG9kIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMDU2OTAxRUEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBxdWVyeS1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1ldGhvZCAoREIvU1IvQ00tIm9uIHRoZSBob21lIikgZm9yIGEgZmluZGVyIG9yDQotfHNlbGVjdCBxdWVyeS4NCi18DQotfFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QNCi18bWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbg0KLXx0aGUgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4NCi18DQotfEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlDQotfG1ldGhvZC1wYXJhbXMgZWxlbWVudC4NCi18DQotfFVzZWQgaW46IHF1ZXJ5DQotfA0KLXxFeGFtcGxlOg0KLXwNCi18RXhhbXBsZToNCi18PHF1ZXJ5Pg0KLXwgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4NCi18ICA8cXVlcnktbWV0aG9kPg0KLXwgICAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+DQotfCAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+DQotfCAgPC9xdWVyeS1tZXRob2Q+DQotfCAgPGVqYi1xbD5TRUxFQ1QgRU5USVRZKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4NCi18PC9xdWVyeT4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkicXVlcnlNZXRob2QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeU1ldGhvZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUNEOUMwMkRGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicXVlcnkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwNTY5MDFGNCINCi0JCSAgICBsYWJlbCAgICAgIAkicXVlcnkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjBDNDAwMTQ3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVqYlJlbGF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjBDNDEwMDFDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiUmVsYXRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwQzAyMDNCRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJlbGF0aW9uc2hpcExpc3QiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwQzQxMDAxRCINCi0JCSAgICBsYWJlbCAgICAgIAkicmVsYXRpb25zaGlwTGlzdCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlJlbGF0aW9uc2hpcHMiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODE3MDNCMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwREUzMDEzNiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZWxhdGlvbnNoaXBSb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjBERTMwM0Q1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxBIGNvbGxlY3Rpb24gY29udGFpbmluZyBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZXMuDQotfA0KLXxAbWlncmF0aW9uIEVKQjEuMSBDb250YWlubWVudCB1c2VkIHRvIGJlIGJ5IHJlZmVyZW5jZSBvbiByZWxhdGlvbi0tbm93IGJ5IHZhbHVlLg0KLXwNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkicmVsYXRpb25zaGlwUm9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjIiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJyZWxhdGlvbnNoaXAiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwREUzMDNENiINCi0JCSAgICBsYWJlbCAgICAgIAkicmVsYXRpb25zaGlwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwQzAyMDNCRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYxNEVBMDJGRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzb3VyY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxNEVDMDA1OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLg0KLXxAbWlncmF0aW9uIEVKQjEuMTogd2FzIGlibWVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZTo6c291cmNlRUpCTmFtZSwgYnV0IHRoYXQgbWF5IG5vdCBiZSBzdWZmaWNpZW50LCBhcyB0aGlzIGNhbiBub3cgcmVmZXIgdG8gZGVwZW5kZW50IGNsYXNzIG5hbWVzIG9yIGVqYiByZWZzDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInNvdXJjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlJvbGVTb3VyY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxNDc1MDBFNCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJvbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxNEVDMDA1QSINCi0JCSAgICBsYWJlbCAgICAgIAkicm9sZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uc2hpcFJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREQwMDIzRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYxODIwMDFDMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjbXJGaWVsZCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjE4MjEwMEQyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxBIGRlY2xhcmF0aW9uIG9mIHRoZSBDTVJGaWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZQ0KLXwNCi18QG1pZ3JhdGlvbiBFSkIxLjE6IFVzZWQgdG8gYmUgaGFuZGxlZCB2aWEgaWJtZWpiZXh0OjpFamJSb2xlOjphdHRyaWJ1dGVzIGxpc3QNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkiY21yRmllbGQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVJGaWVsZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MTAwMDRCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicm9sZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjE4MjEwMERDIg0KLQkJICAgIGxhYmVsICAgICAgCSJyb2xlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb25zaGlwUm9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERDAwMjNEIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMUJCRDAyRUQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiL29wcG9zaXRlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMUJDMDAzOUMiDQotCQkgICAgbGFiZWwgICAgICAJIi9vcHBvc2l0ZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uc2hpcFJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREQwMDIzRCINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMUJDMDAzQTYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyMDlGMDBDNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXNvdXJjZUVudlJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyMDlGMDM5NSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QSBsaXN0IG9mIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VzIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLg0KLXwNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkicmVzb3VyY2VFbnZSZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VFbnZSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMjA5RjAzOTYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyQzFGMDE4RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWN1cml0eUlkZW50aXR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkMyMDAyNjMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdA0KLXxjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eUlkZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMDQwMjQ1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyQzIwMDI2NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYzNDA4MDFGRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXN0aW5hdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM0MDkwMDUyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgYWN0aXZhdGlvbkNvbmZpZw0KLXxBbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgaW50ZW5kZWQgZGVzdGluYXRpb24gdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJkZXN0aW5hdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMzRjEwMDQ0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYmVhbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM0MDkwMDVDIg0KLQkJICAgIGxhYmVsICAgICAgCSJiZWFuIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMyNDgwMTBCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODYzODQwMTcyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVqYkxvY2FsUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODYzODUwMkFBIg0KLQkJICAgIGxhYmVsICAgICAgCSJlamJMb2NhbFJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFSkJMb2NhbFJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODYyRTIwMTAxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2Mzg1MDJCNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAibG9jYWxIb21lSW50ZXJmYWNlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODg2QzJCMDE4QiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbpJzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLiAgDQotfFRoaXMgcmVmZXJlbmNlIGlzIG9ubHkgdXNlZCBmb3IgRW50aXR5IGFuZCBTZXNzaW9uIGJlYW5zLiAgTWVzc2FnZSBEcml2ZW4gYmVhbnMgaWdub3JlIHRoZSBsb2NhbEhvbWVJbnRlcmZhY2UgaWYgc3BlY2lmaWVkLg0KLQkgICAgDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibG9jYWxIb21lSW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NkMyQzAyQUYiDQotCQkgICAgbGFiZWwgICAgICAJImxvY2FsSG9tZUludGVyZmFjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZDMkMwMkQ3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAibG9jYWxJbnRlcmZhY2UiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODZDQzIwMjgzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuknMgbG9jYWwgaW50ZXJmYWNlLiAgDQotfFRoaXMgcmVmZXJlbmNlIGlzIG9ubHkgdXNlZCBmb3IgRW50aXR5IGFuZCBTZXNzaW9uIGJlYW5zLiAgTWVzc2FnZSBEcml2ZW4gYmVhbnMgaWdub3JlIHRoZSBsb2NhbEludGVyZmFjZSBpZiBzcGVjaWZpZWQuDQotCSAgICANCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsb2NhbEludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZDQzYwMEVFIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2NhbEludGVyZmFjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZDQzYwMTIwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzYiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODg0QzIwMzZFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGl0eUJlYW4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg4NEMzMDI3RiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5QmVhbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODg0QzMwMjg5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Um9sZVNvdXJjZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0NzUwMEU0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOCINCi0JICAgIHF1aWQgICAgICAgCSIzOTg4ODZGNTAzQkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiL3JvbGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4ODZGNjAyRDgiDQotCQkgICAgbGFiZWwgICAgICAJIi9yb2xlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uc2hpcFJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREQwMDIzRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODg2RjYwMkUyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MCINCi0JICAgIHF1aWQgICAgICAgCSIzOTk3MjFCNjAyRjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZXhjbHVkZUxpc3QiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTcyMUI3MDIzQyINCi0JCSAgICBsYWJlbCAgICAgIAkiZXhjbHVkZUxpc3QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFeGNsdWRlTGlzdCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5NzIxNkUwMTQ3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDEiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTcyMUI3MDI0NiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MiINCi0JICAgIHF1aWQgICAgICAgCSIzOTk3MjI2NTAxQTYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWV0aG9kRWxlbWVudHMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTcyMjY2MDI4NCINCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kRWxlbWVudHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5NzIyNjYwMjk4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RXhjbHVkZUxpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMTZFMDE0NyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDQiDQotCSAgICBxdWlkICAgICAgIAkiMzk5QUUwRkIwM0QzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbGxlY3Rpb25UeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRTBGQzAzOEYiDQotCQkgICAgbGFiZWwgICAgICAJImNvbGxlY3Rpb25UeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRTBGQzAzQjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVJGaWVsZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MTAwMDRCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NiINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUFFMjAxNUQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFBRTIwMzMzIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUExQTAwQkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFBRTIwMzM1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBN0UwMTMxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OCINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUIwNTAxNDkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYWN0aXZhdGlvbkNvbmZpZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFCMDcwMEEyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJhY3RpdmF0aW9uQ29uZmlnIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBN0UwMTMxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQjA3MDBBNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1lc3NhZ2VEcml2ZW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzMjQ4MDEwQiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDFCRjQwMkU3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQkY2MDBCOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQkY2MDBDMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MiINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjNBQTAyNEYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDIzQUQwMUFBIg0KLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlRGVzdGluYXRpb25SZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMUY1MjAyOEMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDIzQUQwMUI0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NCINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjVENjAwRjAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjVENjAwRjEiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJxdWVyaWVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjVENjAwRjIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgbW92ZWQgZnJvbSBDTUUNCi18VGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uDQotfA0KLXxAaW52YXJpYW50IHNlZSBkZXNjcmlwdGlvbg0KLXwNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkicXVlcmllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlF1ZXJ5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDI3MTAzMjciDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQyOTgyMDFFMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlRGVzdGluYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyOTgzMDI3MCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZURlc3RpbmF0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjk4MzAyN0EiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI0ODAxMEIiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkE5MDFDOSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDJGQUEwMkM1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkFBMDJDRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDJGRTEwMUZDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlcnZpY2VJbnRlcmZhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkU0MDEyRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcw0KLXwgICAgICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLg0KLXwgICAgICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDDQotfCAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZUludGVyZmFjZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDJGRTQwMTRDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNTYyRDlFMDI1NCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdpbmdUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2MkQ5RjAxODMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlDQotfCAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZg0KLXwgICAgICAgIHRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzDQotfCAgICAgICAgYXNzdW1lZCB0byBiZSBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdpbmdUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2MkQ5RjAxOTciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI0ODAxMEIiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxQUFEMDBBQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQUFEMDNBNSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUFBRDAzQ0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpBY3RpdmF0aW9uQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUE3RTAxMzEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxRkNCMDFBQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxRkNDMDBDNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUZDQzAwRTMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBDMDIwM0JGIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NyINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjg2MDAyMTgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjg2MjAxNTIiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI4NjIwMTk4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjEwMzAwQ0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjEwNTAyRUMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDIxMDUwMzBBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Um9sZVNvdXJjZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0NzUwMEU0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUQxRjAxNjEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUQyMDAxREEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFEMjAwMUVFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTIyODg2MzAwMDMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDczIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxRkJGMDFDQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxRkMxMDAxRiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUZDMTAwNDciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpSZWxhdGlvbnNoaXBzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJFRjgxNzAzQjMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQyNkJCMDBGQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyNkJDMDJGMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjZCQzAzMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RQZXJtaXNzaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDAiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQyMEMxMDJDNiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyMEM0MDBDQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjBDNDAwRUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxRjIzMDA5MCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxRjIzMDNEOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUYyNDAwMEYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RUcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMERFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjY2ODAzMTciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjY2QTAwRDUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI2NkEwMEYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RXhjbHVkZUxpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMTZFMDE0NyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODMiDQotCSAgICBxdWlkICAgICAgIAkiM0U1NjUwMEQwMjU5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NjUwMEUwMTQyIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkODQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTY1MDBFMDE3NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlF1ZXJ5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDI3MTAzMjciDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNTY3Q0EyMDA3RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlRW5kcG9pbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTY3Q0EzMDIyNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZQ0KLXwgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWINCi18ICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQNCi18ICAgICAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MNCi18ICAgICAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQ0KLXwgICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VFbmRwb2ludCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NjdDQTMwMjQzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6U2Vzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU1RjkwMUVCIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NyINCi0JICAgIHF1aWQgICAgICAgCSIzRkE2ODg2MjAyNjciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkODgiDQotCQkgICAgcXVpZCAgICAgICAJIjNGQTY4ODY2MDM1RCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNNUEF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NjMwMDAzIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkODkiDQotCQkgICAgcXVpZCAgICAgICAJIjNGQTY4ODY2MDM1RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTAiDQotCSAgICBxdWlkICAgICAgIAkiM0ZBNjk1ODkwMjQwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInByaW1LZXlGaWVsZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0ZBNjk1OEIwMDA4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJwcmltS2V5RmllbGQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVBBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgcXVpZCAgICAgICAJIjNGQTY5NThCMDAxMiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFSkIgSmFyIg0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMjg3MDI1MSINCi0JICAgIHRpdGxlICAgICAgCSJFSkIgSmFyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEJhc2VkIG9uIHRoZSBNb3Njb25lIERELCB0cmFuc2xhdGluZyBjbGFzcyBuYW1lIGVsZW1lbnRzIHRvIGNsYXNzIHJlZmVyZW5jZXMuDQotfA0KLXxOb3RlIHRoYXQgRUpCLWxpbmtzIG9ubHkgYXBwZWFyIGluIHRoZSBkZXBsb3ltZW50IG1vZGVsLCBhdCBhbmx5c2lzL2Rlc2lnbiB0aW1lLCB0aGV5IG1pZ2h0IGJlIGRlcml2ZWQgZnJvbSB0aGUgYXNzb2NpYXRpb24gcm9sZXMgZm9yIHRoZSBFSkIuDQotfA0KLXxBbHNvLCBzZWUgbm90ZXMgb24gRW50ZXJwcmlzZUphdmFCZWFuLg0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMjM2Mw0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpTZXNzaW9uIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzMywgMTc1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDc2NiwgMTYyNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk3MzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlc3Npb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgZmlsbF9jb2xvciAJMTQ0NzI2NDkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU1RjkwMUVCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDc2NiwgMTY4NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTYzMSkNCi0JCSAgICB3aWR0aCAgICAgIAk3NTINCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGl0eSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NzYsIDE3NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCAxNjUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNjk3MDM1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCAxNzExKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzQ2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQyMA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IExhYmVsIEAzDQotCQkgICAgbG9jYXRpb24gICAJKDE1OSwgNDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTINCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAkxMzAwDQotCQkgICAgbGFiZWwgICAgICAJIkVKQiAyLjEgTW9kZWwgKEVKQjIuMCAmIDEuMSBCYWNrd2FyZCBDb21wYXRpYmxlKSIpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA0DQotCQkgICAgbG9jYXRpb24gICAJKDUyNiwgMjA2NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJbG9jYXRpb24gICAJKDI2MCwgMjAwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0OTYNCi0JCQlsYWJlbCAgICAgIAkiU2VlIGRldGFpbCBvbiBzZXBhcmF0ZSBjbGFzcyBkaWFncmFtcy4uLiIpDQotCQkgICAgZmlsbF9jb2xvciAJMTQ2Nzk4MDcNCi0JCSAgICB3aWR0aCAgICAgIAk1NTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNDMpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgQDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzczLCAyMTQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMTUzNywgMjA5OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgZmlsbF9jb2xvciAJMTQ0NzI2NDkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ5MA0KLQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzUiDQotCQkgICAgY2xpZW50ICAgICAJQDUNCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNzc1LCAyMDg3KQ0KLQkJCSgxNzc1LCAxODc0KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDg3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxODc0KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyNzUsIDE2ODMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgyMTE5LCAxNjQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURyaXZlbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzMjQ4MDEwQiINCi0JCSAgICB3aWR0aCAgICAgIAkzMzANCi0JCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgMTk3MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDIyMTgsIDE4NjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzkwDQotCQkJbGFiZWwgICAgICAJIlNlZSBFSkIyLjAgTWVzc2FnZSBEcml2ZW4gQmVhbiBkaWFncmFtIGZvciBkZXRhaWxzLiIpDQotCQkgICAgZmlsbF9jb2xvciAJMTQ2Nzk4MDcNCi0JCSAgICB3aWR0aCAgICAgIAk0NTANCi0JCSAgICBoZWlnaHQgICAgIAkyMjUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCSAgICBzdXBwbGllciAgIAlANw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMzY5LCAxODU4KQ0KLQkJCSgyMzAzLCAxNzM2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5NywgMjQxMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCWxvY2F0aW9uICAgCSgxMzk0LCAyMzA2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM3MQ0KLQkJCWxhYmVsICAgICAgCSJTZWUgQ29udGFpbmVyIE1hbmFnZWQgRW50aXR5IGRpYWdyYW0gZm9yIGRldGFpbHMuIikNCi0JCSAgICBmaWxsX2NvbG9yIAkxNDY3OTgwNw0KLQkJICAgIHdpZHRoICAgICAgCTQzMQ0KLQkJICAgIGhlaWdodCAgICAgCTIyNSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkgICAgc3VwcGxpZXIgICAJQDUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTY2OSwgMjI5OSkNCi0JCQkoMTczOCwgMjE5MykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDEyDQotCQkgICAgbG9jYXRpb24gICAJKDg0NSwgMTM4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCWxvY2F0aW9uICAgCSg2MTcsIDEzMDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDIxDQotCQkJbGFiZWwgICAgICAJIkFkZGVkIGVqYkphciBiYWNrIHJlZmVyZW5jZSIpDQotCQkgICAgZmlsbF9jb2xvciAJMTQ2Nzk4MDcNCi0JCSAgICB3aWR0aCAgICAgIAk0ODENCi0JCSAgICBoZWlnaHQgICAgIAkxNzUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgzODEsIDM3OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCWxvY2F0aW9uICAgCSg2MiwgMTM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJOQ0KLQkJCW1heF93aWR0aCAgCTYwMw0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGlvbnM6DQotfEVKQkphcjo6ZGVzY3JpcHRpb24NCi18RUpCSmFyOjpkaXNwbGF5TmFtZQ0KLXxFSkJKYXI6OnNtYWxsSWNvbg0KLXxFSkJKYXI6OmxhcmdlSWNvbg0KLXxFbnRlcnByaXNlQmVhbjo6ZGVzY3JpcHRpb24NCi18RW50ZXJwcmlzZUJlYW46OmRpc3BsYXlOYW1lDQotfEVudGVycHJpc2VCZWFuOjpzbWFsbEljb24NCi18RW50ZXJwcmlzZUJlYW46OmxhcmdlSWNvbg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk2NjMNCi0JCSAgICBoZWlnaHQgICAgIAk1MDApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDE0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjUwLCAxMDQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQlsb2NhdGlvbiAgIAkoMjA3MiwgOTYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpBc3NlbWJseURlc2NyaXB0b3IiIEAxNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzMjIsIDg0MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSgxMjEyLCA3NzYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBc3NlbWJseURlc2NyaXB0b3IiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgZmlsbF9jb2xvciAJMTQ0NzI2NDkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIHdpZHRoICAgICAgCTIzOA0KLQkJICAgIGhlaWdodCAgICAgCTE1Nw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlJlbGF0aW9uc2hpcHMiIEAxNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNCwgMTc0MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCWxvY2F0aW9uICAgCSgyNTMsIDE2NzYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZWxhdGlvbnNoaXBzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4MTcwM0IzIg0KLQkJICAgIGhlaWdodCAgICAgCTE1Nw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAxNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODQsIDE5OTUpDQotCQkJKDM4MCwgMTgyMCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDE4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDA0LCAxMjU5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQlsb2NhdGlvbiAgIAkoMTE4MiwgMTA3OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQlsb2NhdGlvbiAgIAkoMTE4MiwgMTEzOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjUzKQ0KLQkJICAgIHdpZHRoICAgICAgCTQ2Mg0KLQkJICAgIGhlaWdodCAgICAgCTM4Ng0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwNCwgMTU0NykNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE0MDQsIDE1NDcpDQotCQkJKDE0MDQsIDE0NTIpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFODA4MDA5NSINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxODQ3LCAxNjM3KQ0KLQkJCSgxODQ3LCAxNTQ3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQ3LCAxNjM3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQ3LCAxNTQ3KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE5KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTIwIg0KLQkJICAgIGNsaWVudCAgICAgCUAxDQotCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDExNTMsIDE2MTMpDQotCQkJKDExNTMsIDE1NDcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNTMsIDE2MTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNTMsIDE1NDcpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIiBAMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2NywgOTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDEzMCwgNzUyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCSmFyIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCA3MDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8Y29tcG9uZW50Pj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgZmlsbF9jb2xvciAJMTQ0NzI2NDkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM1NUQwMUUxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgxMzAsIDgxMykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQxMikNCi0JCSAgICB3aWR0aCAgICAgIAk0OTINCi0JCSAgICBoZWlnaHQgICAgIAk0OTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJqYXJUb0Fzc2VtYmx5RGVzY3JpcHRvciIgQDIzDQotCQkgICAgbG9jYXRpb24gICAJKDkwOCwgODEwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0NGODAxRUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXNzZW1ibHlEZXNjcmlwdG9yIiBAMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg0LCA1NzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwNywgNzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzgzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithc3NlbWJseURlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuMzM1Mzg1DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4RkYzQ0Y5MDI0OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkwOCwgODEwKQ0KLQkJCQkoMTIwMywgODEwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkwOCwgODEwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMywgODEwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDI0DQotCQkJCWxvY2F0aW9uICAgCSgxMTQzLCA4NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NTEwNw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiSmFyIiBAMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg0LCA1NzApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhGRjNDRjkwMjY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTA4LCA4MTApDQotCQkJCSg2MTMsIDgxMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDgsIDgxMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYxMywgODEwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc4LCAxNDIyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4ODcwMzc4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbGF0aW9uc2hpcExpc3QiIEAyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTgsIDEwMjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzANCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDUwLCAxNTY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWxhdGlvbnNoaXBMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjU5NzUxMA0KLQkJCQloZWlnaHQgICAgIAkxNzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4ODkwMDNDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc4LCAxNDIyKQ0KLQkJCQkoMjc4LCAxNjYzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3OCwgMTQyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3OCwgMTY2MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzQ4LCAxNjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDUwMzENCi0JCQkJaGVpZ2h0ICAgICAJNzANCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYkphciIgQDMyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01OCwgMTAyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDEyNTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYkphciINCi0JCQkJcGN0RGlzdCAgICAJMC43MDc2MDINCi0JCQkJaGVpZ2h0ICAgICAJMTA2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg5MDAzRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3OCwgMTQyMikNCi0JCQkJKDI3OCwgMTE4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzgsIDE0MjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzgsIDExODIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQkJbG9jYXRpb24gICAJKDMzMiwgMTIwNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImVqYkphclRvRW50ZXJwcmlzZUJlYW5zIiBAMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODkzLCAxMTIyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0QxRjAwM0IiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50ZXJwcmlzZUJlYW5zIiBAMzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCA4ODIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwNSwgMTE1OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMzNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50ZXJwcmlzZUJlYW5zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQwMzI3OQ0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0QxRjAzN0EiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4OTMsIDExMjIpDQotCQkJCSgxMTczLCAxMTIyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg5MywgMTEyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNzMsIDExMjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4DQotCQkJCVBhcmVudF9WaWV3IAlAMzYNCi0JCQkJbG9jYXRpb24gICAJKDEwODAsIDEwODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2NjExMw0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiSmFyIiBAMzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCA4ODIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDANCi0JCQkJUGFyZW50X1ZpZXcgCUAzOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjY5LCAxMDgxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJKYXIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4RkYzRDFGMDNDQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg5MywgMTEyMikNCi0JCQkJKDYxMywgMTEyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4OTMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MTMsIDExMjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxDQotCQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQkJbG9jYXRpb24gICAJKDY0MiwgMTE3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBjbGllbnQgICAgIAlAMTINCi0JCSAgICBzdXBwbGllciAgIAlANDANCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNzk0LCAxMzAwKQ0KLQkJCSg2ODQsIDExMDcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzMjUzMDI2RiINCi0JCSAgICBjbGllbnQgICAgIAlANw0KLQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMjY5LCAxNjMwKQ0KLQkJCSgyMjY5LCAxNTE5KQ0KLQkJCSgxMzk3LCAxNTE5KQ0KLQkJCSgxMzk3LCAxNDUyKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjY5LCAxNjMwKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDUyKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRW50ZXJwcmlzZSBCZWFuIg0KLQkgICAgcXVpZCAgICAgICAJIjM4MDU1MzFEMDJDMyINCi0JICAgIHRpdGxlICAgICAgCSJFbnRlcnByaXNlIEJlYW4iDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Um9sZXMgYXJlIHNoYXJlZCBieSBtdWx0aXBsZSBFSkJzLg0KLXwNCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTIzODgNCi0JICAgIG9yaWdpbl95ICAgCTY1Ng0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIiBANDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ3OCwgNDE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDQNCi0JCQlsb2NhdGlvbiAgIAkoMjgxLCAzMzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKTkRJRW52UmVmc0dyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQxMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZVJlZiIgQDQ1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg2OCwgNzY1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJbG9jYXRpb24gICAJKDI2NDYsIDY4MCkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCQkgICAgd2lkdGggICAgICAJNDYyDQotCQkgICAgaGVpZ2h0ICAgICAJMTk0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDQ2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjgxNywgMzg5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQ2DQotCQkJbG9jYXRpb24gICAJKDI3MDMsIDMzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyNDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDQ3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDkyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQ3DQotCQkJbG9jYXRpb24gICAJKDc5MSwgODUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50ZXJwcmlzZUJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQ3DQotCQkJbG9jYXRpb24gICAJKDc5MSwgOTExKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyNDQpDQotCQkgICAgd2lkdGggICAgICAJMzI0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJFamJUb1JvbGVzIiBANDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg3MSwgODQxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkNCi0JCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJbG9jYXRpb24gICAJKDE4NjcsIDc1MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYlRvUm9sZXMiDQotCQkJcGN0RGlzdCAgICAJMC40NTAwMDANCi0JCQloZWlnaHQgICAgIAk5MQ0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE0NCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZWN1cml0eVJvbGVSZWZzIiBANTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTkxLCAyOTcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJUGFyZW50X1ZpZXcgCUA1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2NywgODAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDU0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVJvbGVSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0ODUyOQ0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OA0KLQkJCSAgICBzdXBwbGllciAgIAlANDUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODcxLCA4NDEpDQotCQkJCSgyNjM3LCA4NDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg3MSwgODQxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgODQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUwDQotCQkJCWxvY2F0aW9uICAgCSgyNTM3LCA4NzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MDYyOQ0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDUzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDk5MSwgMjk3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0DQotCQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQkJbG9jYXRpb24gICAJKDEyNTksIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNDUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OA0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODcxLCA4NDEpDQotCQkJCSgxMTA2LCA4NDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg3MSwgODQxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEwNiwgODQxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImVqYkNsYXNzIiBANTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5MSwgNTM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYNCi0JCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJbG9jYXRpb24gICAJKDE3OTEsIDQ3OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVqYkNsYXNzIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGREMzNDAyQzciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiIiBANTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMSwgLTU3MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDU3DQotCQkJCWxvY2F0aW9uICAgCSgxMDgzLCA2MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREMzNTAxRjYiDQotCQkJICAgIGNsaWVudCAgICAgCUA1NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzkxLCA1MzgpDQotCQkJCSgxMDQxLCA1MzgpDQotCQkJCSgxMDQxLCA4MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5MSwgNTM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0MSwgODM4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJDbGFzcyIgQDU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MjEsIC01NzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYzMCwgNTgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzUwMUVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc5MSwgNTM4KQ0KLQkJCQkoMjc1NywgNTM4KQ0KLQkJCQkoMjc1NywgNDU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3OTEsIDUzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NTcsIDQ1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjENCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjczNCwgNDg1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiaG9tZUludGVyZmFjZSIgQDYyDQotCQkgICAgbG9jYXRpb24gICAJKDE5OTEsIDYzNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYzDQotCQkJUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTkxLCA1NzUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJob21lSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGREMzNzAxQzciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiIiBANjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyMSwgLTQ3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSgxMTE2LCA2NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NDAxNEQiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTkxLCA2MzQpDQotCQkJCSgxMTAwLCA2MzQpDQotCQkJCSgxMTAwLCA4MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk5MSwgNjM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEwMCwgODM4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJob21lSW50ZXJmYWNlIiBANjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyMSwgLTQ3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJCWxvY2F0aW9uICAgCSgyNzMyLCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2hvbWVJbnRlcmZhY2UiDQotCQkJCXBjdERpc3QgICAgCTAuOTQ4NjE3DQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NDAxNDMiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTkxLCA2MzQpDQotCQkJCSgyOTA3LCA2MzQpDQotCQkJCSgyOTA3LCA0NTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk5MSwgNjM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkwNywgNDU1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJCWxvY2F0aW9uICAgCSgyODU0LCA1NjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJyZW1vdGVJbnRlcmZhY2UiIEA2OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjExLCA0MDYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MA0KLQkJCVBhcmVudF9WaWV3IAlANjkNCi0JCQlsb2NhdGlvbiAgIAkoMTYxMSwgMzQ3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkicmVtb3RlSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NjAwNkEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiIiBANzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MSwgLTcwNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJCWxvY2F0aW9uICAgCSgxMDAyLCA2MjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NzAxNjciDQotCQkJICAgIGNsaWVudCAgICAgCUA2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjExLCA0MDYpDQotCQkJCSg5NjAsIDQwNikNCi0JCQkJKDk2MCwgODM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTEsIDQwNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk2MCwgODM4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZW1vdGVJbnRlcmZhY2UiIEA3Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzQxLCAtNzA0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0DQotCQkJCVBhcmVudF9WaWV3IAlANzMNCi0JCQkJbG9jYXRpb24gICAJKDI0NzYsIDQ0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVtb3RlSW50ZXJmYWNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NzAxNjYiDQotCQkJICAgIGNsaWVudCAgICAgCUA2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjExLCA0MDYpDQotCQkJCSgyNjk0LCA0MDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYxMSwgNDA2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NCwgNDA2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDczDQotCQkJCWxvY2F0aW9uICAgCSgyNTg2LCAzNTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJsb2NhbEhvbWVJbnRlcmZhY2UiIEA3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCVBhcmVudF9WaWV3IAlANzYNCi0JCQlsb2NhdGlvbiAgIAkoMTU1NCwgMTk3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkibG9jYWxIb21lSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQjAxOEIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjg0LCAtODU0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDk2NywgNTk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQzAyRDciDQotCQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTU0LCAyNTYpDQotCQkJCSg5MjUsIDI1NikNCi0JCQkJKDkyNSwgODM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NTQsIDI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsb2NhbEhvbWVJbnRlcmZhY2UiIEA4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjg0LCAtODU0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxDQotCQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQkJbG9jYXRpb24gICAJKDI1MjIsIDI5OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9jYWxIb21lSW50ZXJmYWNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQzAyQUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTU0LCAyNTYpDQotCQkJCSgyNjk4LCAyNTYpDQotCQkJCSgyNjk4LCAzMjMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU1NCwgMjU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5OCwgMzIzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDgwDQotCQkJCWxvY2F0aW9uICAgCSgyNjQzLCAyMDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJsb2NhbEludGVyZmFjZSIgQDgzDQotCQkgICAgbG9jYXRpb24gICAJKDE2MDksIDExMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCWxvY2F0aW9uICAgCSgxNjA5LCA1NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImxvY2FsSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkNDMjAyODMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEA4NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzM5LCAtOTk3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2DQotCQkJCVBhcmVudF9WaWV3IAlAODUNCi0JCQkJbG9jYXRpb24gICAJKDkzMCwgNTQ5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkNDNjAxMjAiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjA5LCAxMTMpDQotCQkJCSg4ODgsIDExMykNCi0JCQkJKDg4OCwgODM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MDksIDExMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4OCwgODM4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsb2NhbEludGVyZmFjZSIgQDg3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEzMzksIC05OTcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjc2NiwgMTU1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsb2NhbEludGVyZmFjZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzYwMEVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYwOSwgMTEzKQ0KLQkJCQkoMjg0NSwgMTEzKQ0KLQkJCQkoMjg0NSwgMzIzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MDksIDExMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4NDUsIDMyMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjg5OSwgMTc4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTRDMzAwOTAiDQotCQkgICAgY2xpZW50ICAgICAJQDQ3DQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDg2MCwgODM3KQ0KLQkJCSg1NjEsIDUwOSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eUlkZW50aXR5IiBAOTENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjUsIDEzNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOTENCi0JCQlsb2NhdGlvbiAgIAkoMTU0NywgMTI2MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5SWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJbG9jYXRpb24gICAJKDE1NDcsIDEzNzcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzOTEpDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEA5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMTM5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzFGMDE4RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTINCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMTQsIC02NzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyOCwgMTA3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMjAwMjY0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMSwgMTEzOSkNCi0JCQkJKDExMDUsIDEwMTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5SWRlbnRpdHkiIEA5NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTE0LCAtNjcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDEyNjgsIDEzNDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5SWRlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuMjE5NjQ0DQotCQkJCWhlaWdodCAgICAgCTIwNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMyMDAyNjMiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAOTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzIxLCAxMTM5KQ0KLQkJCQkoMTUzNywgMTI2MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2NiwgMTE4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTU3MDYyDQotCQkJCWhlaWdodCAgICAgCTgxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJDb250YWluZXIgTWFuYWdlZCBFbnRpdHkiDQotCSAgICBxdWlkICAgICAgIAkiMzgwNTU1MEMwMDhBIg0KLQkgICAgdGl0bGUgICAgICAJIkNvbnRhaW5lciBNYW5hZ2VkIEVudGl0eSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuDQotfA0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAk5NQ0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxMTk4DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAOTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OCwgNDAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJbG9jYXRpb24gICAJKDE5MzIsIDIxNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2NzcNCi0JCQlsYWJlbCAgICAgIAkiVGhlIGtleUZlYXR1cmVzIHJlbGF0aW9uc2hpcCBhbHNvIGRldGVybWluZXMgdGhlIHByaW1rZXktZmllbGQgc2V0dGluZy4gIElmIHRoZXJlIGlzIGEgc2luZ2xlIGtleSBmZWF0dXJlLCB3ZSB3aWxsIGRlcGxveSB0aGF0IHVzaW5nIHByaW1rZXktZmllbGQuICBDb252ZXJzZWx5LCBpZiBhIGRlc2NyaXB0b3IgdXNlcyBwcmlta2V5LWZpZWxkLCB3ZSB3aWxsIHNldCBhIHNpbmdsZSBrZXlGZWF0dXJlLiAgKD8gQk1QIGNhc2UgPykiKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTczNw0KLQkJICAgIGhlaWdodCAgICAgCTM4MSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDk5DQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDE1NjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOTkNCi0JCQlsb2NhdGlvbiAgIAkoMTA3MCwgMTM5MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk3NjkNCi0JCQlsYWJlbCAgICAgIAkiV2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIGV4cGxpY2l0bHkgcmVmZXJyaW5nIGZyb20gYW4gRW50aXR5IHRvIGl0cyBKYXZhIEZpZWxkcyB0byBkZXJpdmluZyB0aGF0IGZyb20gaXRzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9uIGVuZHMuICBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHN0aWxsIHN1cHBvcnQgbGlzdGluZyB0aGUga2V5IGZpZWxkcyBhbmQgcGVyc2lzdGVudCBmaWVsZHMsIGJ1dCBub3QgYWRkaW5nIG9yIHJlbW92aW5nIHRoZW0uIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk4MjkNCi0JCSAgICBoZWlnaHQgICAgIAkzNjkpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMDANCi0JCSAgICBsb2NhdGlvbiAgIAkoNjA4LCAxNjAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMA0KLQkJCWxvY2F0aW9uICAgCSgxODksIDE0NjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJODAyDQotCQkJbGFiZWwgICAgICAJIkxlYXZpbmcgdGhlIGtleUF0dHJpYnV0ZXMgYW5kIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHJlbGF0aW9uc2hpcHMgdHlwZWQgdG8gZUF0dHJpYnV0ZSBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy4gIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIHR5cGVkIHRvIENNUEF0dHJpYnV0ZS4iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTg2Mg0KLQkJICAgIGhlaWdodCAgICAgCTI4MykNCi0JCShvYmplY3QgTm90ZVZpZXcgQDEwMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDExNTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJbG9jYXRpb24gICAJKDY1LCA5OTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJNzk1DQotCQkJbGFiZWwgICAgICAJDQotfEVKQjIuMCAtIA0KLXwgIEFkZGVkIHZlcnNpb246U3RyaW5nDQotfCAgQWRkZWQgYWJzdHJhY3RTY2hlbWFOYW1lOlN0cmluZw0KLXxUT0RPOiBPdGhlciBuZXcgYXR0cnM6DQotfCAgU2VjdXJpdHlJZGVudGl0eQ0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAk4NTUNCi0JCSAgICBoZWlnaHQgICAgIAkzMzYpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMDINCi0JCSAgICBsb2NhdGlvbiAgIAkoNjI0LCA4MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJbG9jYXRpb24gICAJKDQyNiwgNzQzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM2MQ0KLQkJCWxhYmVsICAgICAgCSJTZWUgZnVydGhlciBkZXRhaWwgaW4gRUpCMi4wIC0gUXVlcnkgZGlhZ3JhbSIpDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgd2lkdGggICAgICAJNDIxDQotCQkgICAgaGVpZ2h0ICAgICAJMTkxKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlF1ZXJ5IiBAMTAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA1NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAzDQotCQkJbG9jYXRpb24gICAJKDM2NywgNTI1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUXVlcnkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDI3MTAzMjciDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDEwNA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgY2xpZW50ICAgICAJQDEwMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNTU4LCA3MzYpDQotCQkJKDQ5MSwgNjM5KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSIgQDEwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU4MSwgMjMzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCWxvY2F0aW9uICAgCSgxMzY5LCA3NykNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQlsb2NhdGlvbiAgIAkoMTM2OSwgMTkxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI3NSkNCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVJGaWVsZCIgQDEwNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5NSwgOTI5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNg0KLQkJCWxvY2F0aW9uICAgCSgxNDg1LCA4NzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDTVJGaWVsZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTgxMDAwNEIiDQotCQkgICAgd2lkdGggICAgICAJMjM4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDEwNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE2MDAsIDEyMzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA3DQotCQkJbG9jYXRpb24gICAJKDE1MDMsIDExNTQpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTIxMg0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ0IiBAMTA4DQotCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEwNjYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUUwRkIwM0QzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ1IiBAMTA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNCwgLTE2NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJbG9jYXRpb24gICAJKDE1NTQsIDEwMDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OUFFMEZDMDNCNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU5NiwgMTA2NikNCi0JCQkJKDE1OTUsIDk5MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29sbGVjdGlvblR5cGUiIEAxMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC00LCAtMTY2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMg0KLQkJCQlQYXJlbnRfVmlldyAJQDExMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzMiwgMTExMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI5MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29sbGVjdGlvblR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNTk3MjI3DQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRTBGQzAzOEYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1OTYsIDEwNjYpDQotCQkJCSgxNTk3LCAxMTQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTENCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDExMTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5OTM2MA0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDExNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg3MSwgNzI5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCWxvY2F0aW9uICAgCSgyNzA0LCA1OTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJbG9jYXRpb24gICAJKDI3MDQsIDcxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI4MykNCi0JCSAgICB3aWR0aCAgICAgIAkzNTINCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVBBdHRyaWJ1dGUiIEAxMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1ODEsIDYzMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQlsb2NhdGlvbiAgIAkoMTI5NywgNTI2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ01QQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NjMwMDAzIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQlsb2NhdGlvbiAgIAkoMTI5NywgNTg2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTY1KQ0KLQkJICAgIHdpZHRoICAgICAgCTU4Ng0KLQkJICAgIGhlaWdodCAgICAgCTIzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NzcwMzQxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTUNCi0JCSAgICBzdXBwbGllciAgIAlAMTA1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1MzYsIDUxNCkNCi0JCQkoMTUzNiwgNDAwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM2LCA1MTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzYsIDQwMCkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUQ0NjkwMTcwIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMDYNCi0JCSAgICBzdXBwbGllciAgIAlAMTE1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1NjMsIDg2NikNCi0JCQkoMTU2MywgNzQ1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCA4NjYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjMsIDc0NSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzEiIEAxMTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4NCwgNjc0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRDFGMDE2MSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAxMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDY3NCwgNTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwDQotCQkJCVBhcmVudF9WaWV3IAlAMTE5DQotCQkJCWxvY2F0aW9uICAgCSgyNTY5LCA3MzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42OTUxMzYNCi0JCQkJaGVpZ2h0ICAgICAJNjANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFEMjAwMURBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg0LCA2NzQpDQotCQkJCSgyNjk1LCA2NzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNjc0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NSwgNjc0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJbG9jYXRpb24gICAJKDI1NjIsIDYxMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjc3Mjc2DQotCQkJCWhlaWdodCAgICAgCTY0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MiIgQDEyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjc0LCA1MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUQyMDAxRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyODQsIDY3NCkNCi0JCQkJKDE4NzQsIDY3NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA2NzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc0LCA2NzQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgQDEyMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ3LCAxNzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTIzDQotCQkJbG9jYXRpb24gICAJKDc2LCA3MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3NDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCWxvY2F0aW9uICAgCSg3NiwgMTMzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNzM5KQ0KLQkJICAgIHdpZHRoICAgICAgCTc2MA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDEyNA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgY2xpZW50ICAgICAJQDEwMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMjMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTcxLCA5ODMpDQotCQkJKDE3MSwgMjkxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzEsIDk4MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxLCAyOTEpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBAMTI1DQotCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNzA5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzMUMzMDI0NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwZXJzaXN0ZW50QXR0cmlidXRlcyIgQDEyNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDA3LCAtNDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3DQotCQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJCWxvY2F0aW9uICAgCSg5NTksIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcGVyc2lzdGVudEF0dHJpYnV0ZXMiDQotCQkJCXBjdERpc3QgICAgCTAuMzc4NjAxDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODgzMUM1MDE1NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzU5LCA3MDkpDQotCQkJCSgxMjg4LCA3MDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzU5LCA3MDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg4LCA3MDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzOCwgNzQ3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDUzNDANCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDEyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDA3LCAtNDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4MzFDNTAxN0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc1OSwgNzA5KQ0KLQkJCQkoNjQ4LCA3MDkpDQotCQkJCSg2NDgsIDI5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTksIDcwOSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0OCwgMjkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkwIiBAMTMwDQotCQkgICAgbG9jYXRpb24gICAJKDkzOSwgNTI3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZBNjk1ODkwMjQwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInByaW1LZXlGaWVsZCIgQDEzMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkyLCAzNTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCVBhcmVudF9WaWV3IAlAMTMxDQotCQkJCWxvY2F0aW9uICAgCSgxMDk5LCA0ODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3ByaW1LZXlGaWVsZCINCi0JCQkJcGN0RGlzdCAgICAJMC40NjIwNDYNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZBNjk1OEIwMDA4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzksIDUyNykNCi0JCQkJKDEyODgsIDUyNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzksIDUyNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyODgsIDUyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzDQotCQkJCVBhcmVudF9WaWV3IAlAMTMxDQotCQkJCWxvY2F0aW9uICAgCSgxMjI4LCA1NjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzMTY4Mw0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMTM0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTIsIDM1MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGQTY5NThCMDAxMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTM5LCA1MjcpDQotCQkJCSg4MjUsIDUyNykNCi0JCQkJKDgyNSwgMjkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzOSwgNTI3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODI1LCAyOTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODQ0LCA2MzIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODMyM0IwMzU1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImtleUF0dHJpYnV0ZXMiIEAxMzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MiwgNDA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwMCwgNjAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitrZXlBdHRyaWJ1dGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU3OTA3MA0KLQkJCQloZWlnaHQgICAgIAkzMQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4MzIzRDAyNUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg0NCwgNjMyKQ0KLQkJCQkoMTI4OCwgNjMyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg0NCwgNjMyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4OCwgNjMyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzYNCi0JCQkJbG9jYXRpb24gICAJKDEyMzYsIDY2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODg1OTQyDQotCQkJCWhlaWdodCAgICAgCTMxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAxMzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MiwgNDA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODMyM0QwMjdDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTM1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NDQsIDYzMikNCi0JCQkJKDc0MCwgNjMyKQ0KLQkJCQkoNzQwLCAyOTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODQ0LCA2MzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NDAsIDI5MSkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQXNzZW1ibHkiDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUyOEUwMUIxIg0KLQkgICAgdGl0bGUgICAgICAJIkFzc2VtYmx5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEkga2VwdCB0aGlzIHBvcnRpb24gb2YgdGhlIG1vZGVsIHNlcGFyYXRlIHRvIHJlZmxlY3QgdGhlIHNwZWMuICBJdCBtaWdodCBiZSBlYXNpZXIgdG8gd29yayB3aXRoIGlmIHdlIGludGVncmF0ZWQgaXQgbW9yZSBjbG9zZWx5IHdpdGggdGhlIGJlYW5zIHdlIGFyZSBhc3NlbWJsaW5nLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoaXMgc2VwYXJhdGlvbiBzdXBwb3J0cyBzcGxpdHRpbmcgdGhlIGNyZWF0aW9uIGFuZCBhc3NlbWJseSByb2xlcy4NCi18DQotfEFuIGFzc2VtYmx5IGRlc2NyaXB0b3IgYmFzaWNhbGx5IGNvbnRhaW5zIG1ldGhvZCBwZXJtaXNzaW9ucyBhbmQgIkNvbnRhaW5lciBUcmFuc2FjdGlvbnMiLiAgDQotfA0KLXxJbiBvcmRlciB0byBzdXBwb3J0IHRoZSBmdWxsIHBvd2VyIG9mIHRoZSBtZXRob2QgZWxlbWVudCBpbiB0aGUgWE1MIERELCB3ZSBuZWVkIHRvIGhvbGQgdGhlc2UgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIGFjdHVhbCBtZXRob2RzIHdpbGwgYmUgZGVyaXZlZC4gIEtlZXBpbmcgd2l0aCB0aGUgbWV0aG9kIGVsZW1lbnQsIGFsbCBtZXRob2Qgd2lsbCBiZSBkZXNpZ25hdGVkIGJ5IHRoZSBuYW1lICIqIi4NCi18DQotfFRoZSBtZXRob2RzIHJlbGF0aW9uc2hpcCBmcm9tIE1ldGhvZFBlcm1pc3Npb24gYW5kIE1ldGhvZFRyYW5zYWN0aW9uIHdpbGwgYmUgZGVyaXZlZCBpbiBoZWxwZXIgbWV0aG9kcy4NCi18DQotfA0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAk4Nw0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxODM0DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIgQDE0MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE0NywgMjAxOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQlsb2NhdGlvbiAgIAkoMTg2NiwgMTgxOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCWxvY2F0aW9uICAgCSgxODY2LCAxNzY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzlGNjM0NTAzQzAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCWxvY2F0aW9uICAgCSgxODY2LCAxODg0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJMjU2KQ0KLQkJICAgIHdpZHRoICAgICAgCTU4MA0KLQkJICAgIGhlaWdodCAgICAgCTUyNA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudEtpbmQiIEAxNDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyMzksIDI0NDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJbG9jYXRpb24gICAJKDEwMDMsIDIyNDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXRob2RFbGVtZW50S2luZCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCWxvY2F0aW9uICAgCSgxMDAzLCAyMTk1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyRTcwMjQwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQlsb2NhdGlvbiAgIAkoMTAwMywgMjMxMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTMwMCkNCi0JCSAgICB3aWR0aCAgICAgIAk0OTANCi0JCSAgICBoZWlnaHQgICAgIAk1MjQNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTQyDQotCQkgICAgbG9jYXRpb24gICAJKDM0MDcsIDgwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDINCi0JCQlsb2NhdGlvbiAgIAkoMzExNywgNzI4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTU0NA0KLQkJCWxhYmVsICAgICAgCSJUaGlzIGlzIHRoZSBjb250YWluZXItdHJhbnNhY3Rpb24gZWxlbWVudCIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNjA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTcyKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTQzDQotCQkgICAgbG9jYXRpb24gICAJKDU5NCwgMjI2NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDMNCi0JCQlsb2NhdGlvbiAgIAkoMjQ3LCAyMTczKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTY1OQ0KLQkJCWxhYmVsICAgICAgCSJMb2NhbCwgTG9jYWxIb21lIGhhdmUgYmVlbiBhZGRlZCBmb3IgRUpCMi4wLiAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgdmFsaWQgdmFsdWVzIGZvciB0aGUgbWV0aG9kSW50ZiAobWV0aG9kVHlwZSkgZmllbGQuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgd2lkdGggICAgICAJNzE5DQotCQkgICAgaGVpZ2h0ICAgICAJMjAxKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNDQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBjbGllbnQgICAgIAlAMTQzDQotCQkgICAgc3VwcGxpZXIgICAJQDE0MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5NTMsIDIzMzUpDQotCQkJKDk5NCwgMjMzNSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTUzLCAyMzM1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTQsIDIzMzUpKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTQ1DQotCQkgICAgbG9jYXRpb24gICAJKDY3NSwgMTk3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQlsb2NhdGlvbiAgIAkoNDI1LCAxOTE0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQ2NA0KLQkJCWxhYmVsICAgICAgCSJFSkIyLjAgcGZkIDIgYWRkZWQgdW5jaGVja2VkIGF0dHJpYnV0ZS4iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAk1MjQNCi0JCSAgICBoZWlnaHQgICAgIAkxMzcpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxNDYNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMxLCAyNjI2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCWxvY2F0aW9uICAgCSgxNDEsIDI1MDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNTQ0DQotCQkJbGFiZWwgICAgICAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgDQotfA0KLXxBZGRlZCBTZXJ2aWNlRW5kcG9pbnQNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHdpZHRoICAgICAgCTYwNA0KLQkJICAgIGhlaWdodCAgICAgCTI1OCkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTQ3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMTQ2DQotCQkgICAgc3VwcGxpZXIgICAJQDE0MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg3MzMsIDI1NTcpDQotCQkJKDk5MywgMjQ5OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDE0OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA2LCAyMDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ4DQotCQkJbG9jYXRpb24gICAJKDM4LCA3NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQlsb2NhdGlvbiAgIAkoMzgsIDE5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTMwOCkNCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb24iIEAxNDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI5NDUsIDQyNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDkNCi0JCQlsb2NhdGlvbiAgIAkoMjczOSwgMzE3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNDkNCi0JCQlsb2NhdGlvbiAgIAkoMjczOSwgNDM2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzE5KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzMA0KLQkJICAgIGhlaWdodCAgICAgCTIzOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSIgQDE1MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwMjgsIDc4NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTANCi0JCQlsb2NhdGlvbiAgIAkoODYwLCA3MzMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIHdpZHRoICAgICAgCTM1NA0KLQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIiBAMTUxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NzAsIDc2NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1MQ0KLQkJCWxvY2F0aW9uICAgCSgxMzYwLCA2OTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgd2lkdGggICAgICAJMjM4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kUGVybWlzc2lvbiIgQDE1Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDY3LCAxMTIyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCWxvY2F0aW9uICAgCSgyNTYsIDk5NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1ldGhvZFBlcm1pc3Npb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCWxvY2F0aW9uICAgCSgyNTYsIDEwNTkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NjcpDQotCQkgICAgd2lkdGggICAgICAJNDQwDQotCQkgICAgaGVpZ2h0ICAgICAJMjgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE1Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGNsaWVudCAgICAgCUAxNDUNCi0JCSAgICBzdXBwbGllciAgIAlAMTUyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDUzNSwgMTkwNykNCi0JCQkoNTM1LCAxMjYyKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzUsIDE5MDcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUzNSwgMTI2MikpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDE1NA0KLQkJICAgIGxvY2F0aW9uICAgCSg2NDAsIDg0MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDE4OTAwRkMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicm9sZXMiIEAxNTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMyMCwgMzMwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzQ1LCA4NzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDE4QTAyOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0MCwgODQyKQ0KLQkJCQkoODUxLCA4NDIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQwLCA4NDIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTEsIDg0MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU3DQotCQkJCVBhcmVudF9WaWV3IAlAMTU1DQotCQkJCWxvY2F0aW9uICAgCSg3NzAsIDgwNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjIwNjkwDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBAMTU4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDMzMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkJbG9jYXRpb24gICAJKDUyOCwgOTM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMThBMDJENCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjQwLCA4NDIpDQotCQkJCSg1NjksIDg0MikNCi0JCQkJKDU2OSwgOTgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MCwgODQyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTY5LCA5ODIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzUiIEAxNjANCi0JCSAgICBsb2NhdGlvbiAgIAkoNjgsIDgyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjZCQjAwRkEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTYxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzk5LCAtMjk0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE2MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1LCAzOTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC45MTcxODQNCi0JCQkJaGVpZ2h0ICAgICAJMTQ3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNkJDMDJGMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQ4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjgsIDgyOCkNCi0JCQkJKDY4LCAzNTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjgsIDgyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY4LCAzNTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE2MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0LCA0NDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwNzQ1Mw0KLQkJCQloZWlnaHQgICAgIAk2Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzYiIEAxNjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjANCi0JCQkgICAgbG9jYXRpb24gICAJKC0zOTksIC0yOTQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2QkMwMzE4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTYwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2OCwgODI4KQ0KLQkJCQkoNjgsIDExMjcpDQotCQkJCSgyNDcsIDExMjcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjgsIDgyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NywgMTEyNykpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFeGNsdWRlTGlzdCIgQDE2NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk0MCwgNjU5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCWxvY2F0aW9uICAgCSgxNzQ4LCA1NTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFeGNsdWRlTGlzdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjE2RTAxNDciDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCWxvY2F0aW9uICAgCSgxNzQ4LCA2MjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MjMpDQotCQkgICAgd2lkdGggICAgICAJNDAyDQotCQkgICAgaGVpZ2h0ICAgICAJMjMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDE2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzI5LCAxODI2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCWxvY2F0aW9uICAgCSgxMDM0LCAxNTUxKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1OTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJbG9jYXRpb24gICAJKDEwMzQsIDE2NzApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk5DQotCQkJbWF4X3dpZHRoICAJNjQ2KQ0KLQkJICAgIHdpZHRoICAgICAgCTYwOA0KLQkJICAgIGhlaWdodCAgICAgCTU3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIk1ldGhvZFBlcm1pc3Npb25Ub01ldGhvZHMiIEAxNjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjI0LCAxNjEyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBFQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvbWV0aG9kcyIgQDE2OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjk5LCAxMTcyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE2OA0KLQkJCQlsb2NhdGlvbiAgIAkoNzYxLCAxNTY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbWV0aG9kcyINCi0JCQkJcGN0RGlzdCAgICAJMC4zNDIxMDUNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEVCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTY3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2MjQsIDE2MTIpDQotCQkJCSgxMDI1LCAxNjEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYyNCwgMTYxMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjUsIDE2MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MA0KLQkJCQlQYXJlbnRfVmlldyAJQDE2OA0KLQkJCQlsb2NhdGlvbiAgIAkoOTUzLCAxNjcwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MjI2ODANCi0JCQkJaGVpZ2h0ICAgICAJNTgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9tZXRob2RQZXJtaXNzaW9uIiBAMTcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTY3DQotCQkJICAgIGxvY2F0aW9uICAgCSgyOTksIDExNzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDYyNCwgMTYxMikNCi0JCQkJKDU2NCwgMTYxMikNCi0JCQkJKDU2NCwgMTI2MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MjQsIDE2MTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjQsIDEyNjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTI4LCAxMzMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MjY5MjMNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6QXNzZW1ibHlEZXNjcmlwdG9yIiBAMTczDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTcyLCA0MTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTczDQotCQkJbG9jYXRpb24gICAJKDk3MSwgMzY4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXNzZW1ibHlEZXNjcmlwdG9yIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIHdpZHRoICAgICAgCTQyMA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUwIiBAMTc0DQotCQkgICAgbG9jYXRpb24gICAJKDIwNTYsIDM4MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUJGNDAyRTciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnZURlc3RpbmF0aW9ucyIgQDE3NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0OCwgMjUzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjUyMywgMzM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5Mjc2Mg0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUJGNjAwQjkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNTYsIDM4MSkNCi0JCQkJKDI3MzAsIDM4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDU2LCAzODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMwLCAzODEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY2MiwgNDM1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUxIiBAMTc4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ4LCAyNTMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFCRjYwMEMzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTc0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDU2LCAzODEpDQotCQkJCSgxMzgyLCAzODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA1NiwgMzgxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM4MiwgMzgxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTc5DQotCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDYwMSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTNFQkZDNTAwQjQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlSb2xlcyIgQDE4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4LCA0NzMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgxDQotCQkJCVBhcmVudF9WaWV3IAlAMTgwDQotCQkJCWxvY2F0aW9uICAgCSg5NjksIDY3NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjdXJpdHlSb2xlcyINCi0JCQkJcGN0RGlzdCAgICAJMC42MTcyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTQ4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5M0VCRkM2MDA4MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTExNiwgNjAxKQ0KLQkJCQkoMTExNiwgNzIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMTYsIDYwMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTYsIDcyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgyDQotCQkJCVBhcmVudF9WaWV3IAlAMTgwDQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCA2ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcwMzcwNA0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwOCwgNDczKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NSwgNTA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5M0VCRkM2MDBDMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTExNiwgNjAxKQ0KLQkJCQkoMTExNiwgNDgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMTYsIDYwMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTYsIDQ4MikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJBc3NlbWJseURlc2NyaXB0b3JUb01ldGhvZFBlcm1pc3Npb25zIiBAMTg1DQotCQkgICAgbG9jYXRpb24gICAJKDM5OSwgNDUxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhc3NlbWJseURlc2NyaXB0b3IiIEAxODYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJbG9jYXRpb24gICAJKDYzMiwgMzQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTEyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithc3NlbWJseURlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuNDcxNTY0DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk5LCA0NTEpDQotCQkJCSgzOTksIDM5MSkNCi0JCQkJKDk2MiwgMzkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNDUxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTYyLCAzOTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoODk5LCA0NDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kUGVybWlzc2lvbnMiIEAxODkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJbG9jYXRpb24gICAJKDM4OCwgOTA3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTA4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RQZXJtaXNzaW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44NTkxNTUNCi0JCQkJaGVpZ2h0ICAgICAJMTINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzOTksIDQ1MSkNCi0JCQkJKDM5OSwgOTgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNDUxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk5LCA5ODIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyOTU3Nw0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MCIgQDE5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDk4LCA1ODkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5NzIxQjYwMkY5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImV4Y2x1ZGVMaXN0IiBAMTkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTAsIDQ2MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJbG9jYXRpb24gICAJKDE2MjYsIDU0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZXhjbHVkZUxpc3QiDQotCQkJCXBjdERpc3QgICAgCTAuNTMwMTIwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMUI3MDIzQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ5OCwgNTg5KQ0KLQkJCQkoMTczOSwgNTg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDU4OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzksIDU4OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1DQotCQkJCVBhcmVudF9WaWV3IAlAMTkzDQotCQkJCWxvY2F0aW9uICAgCSgxNjgzLCA2MjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2NzA2OA0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDEiIEAxOTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTINCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgNDYxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMUI3MDI0NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ5OCwgNTg5KQ0KLQkJCQkoMTM2NCwgNTg5KQ0KLQkJCQkoMTM2NCwgNDgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDU4OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjQsIDQ4MikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50IiBAMTk3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjcwLCAxMjIzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMDcyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTM3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNTY3KQ0KLQkJICAgIHdpZHRoICAgICAgCTU0Mg0KLQkJICAgIGhlaWdodCAgICAgCTMyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTk4DQotCQkgICAgbG9jYXRpb24gICAJKDEzNTYsIDk1NykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTM3RDZGRjAxMUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50ZXJwcmlzZUJlYW4iIEAxOTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjgsIDQ4MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MzdENzAwMDE3OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM1NiwgOTU3KQ0KLQkJCQkoMTM1NiwgODU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDk1NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDg1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAwDQotCQkJCVBhcmVudF9WaWV3IAlAMTk5DQotCQkJCWxvY2F0aW9uICAgCSgxMzk2LCA4OTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0ODY0OQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kRWxlbWVudCIgQDIwMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ2OCwgNDgwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkzN0Q3MDAwMjE4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzU2LCA5NTcpDQotCQkJCSgxMzU2LCAxMDYwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDk1NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDEwNjApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyOCwgMTAyNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjkzMzMzDQotCQkJCWhlaWdodCAgICAgCTcyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAyMDMNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNDI4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMjg4MDA3NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RFbGVtZW50cyIgQDIwNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxOTE2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgMjM4OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQzMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kRWxlbWVudHMiDQotCQkJCXBjdERpc3QgICAgCTAuMTc5Njg4DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMjg5MDAxRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTk3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTM2LCAyNDI4KQ0KLQkJCQkoMTMxMSwgMjQyOCkNCi0JCQkJKDEzMTEsIDEzODYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTM2LCAyNDI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxMSwgMTM4NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA2DQotCQkJCVBhcmVudF9WaWV3IAlAMjA0DQotCQkJCWxvY2F0aW9uICAgCSgxMzU3LCAxNzU3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43Mzg2MzYNCi0JCQkJaGVpZ2h0ICAgICAJNDYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEAyMDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTkxNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDI4OTAwMjgiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzNiwgMjQyOCkNCi0JCQkJKDY4NSwgMjQyOCkNCi0JCQkJKDY4NSwgMTI2MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzYsIDI0MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODUsIDEyNjIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDIiIEAyMDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1MywgMTAzNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjI2NTAxQTYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kRWxlbWVudHMiIEAyMDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDc3LCA2NjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEwDQotCQkJCVBhcmVudF9WaWV3IAlAMjA5DQotCQkJCWxvY2F0aW9uICAgCSgxNzY0LCAxMTM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDMzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RFbGVtZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC40MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5NzIyNjYwMjg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjA4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODUzLCAxMDM3KQ0KLQkJCQkoMTg1MywgMTA5NykNCi0JCQkJKDE1NDEsIDEwOTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1MywgMTAzNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDEsIDEwOTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMCwgMTA3MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzYxNzE5DQotCQkJCWhlaWdodCAgICAgCTI1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MyIgQDIxMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzcsIDY2OSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjI2NjAyOTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4NTMsIDEwMzcpDQotCQkJCSgxODUzLCA3NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1MywgMTAzNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTMsIDc3NSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDIxMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc4MiwgMTY5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMTMNCi0JCQlsb2NhdGlvbiAgIAkoMjYxNCwgMTU2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMTMNCi0JCQlsb2NhdGlvbiAgIAkoMjYxNCwgMTY4MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTMwOSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NyIgQDIxNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTUzLCAxNjIzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyODYwMDIxOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDY0OSwgNDM4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ3NSwgMTU4MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjg2MjAxNTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NTMsIDE2MjMpDQotCQkJCSgyNjA1LCAxNjIzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NTMsIDE2MjMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA1LCAxNjIzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTUNCi0JCQkJbG9jYXRpb24gICAJKDI1NDAsIDE2NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjgiIEAyMTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDY0OSwgNDM4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyODYyMDE5OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTk3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk1MywgMTYyMykNCi0JCQkJKDE4MTAsIDE2MjMpDQotCQkJCSgxODEwLCAxMzgzKQ0KLQkJCQkoMTU0MSwgMTM4MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUzLCAxNjIzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0MSwgMTM4MykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MSIgQDIxOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODc0LCA3MzcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2NjgwMzE3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDIyMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTM0LCA3OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjANCi0JCQkJbG9jYXRpb24gICAJKDMwMTcsIDE0OTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC45MzI0MzINCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNjZBMDBENSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjg3NCwgNzM3KQ0KLQkJCQkoMjg3NCwgMTU0OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyODc0LCA3MzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODc0LCAxNTQ5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjANCi0JCQkJbG9jYXRpb24gICAJKDI5MjgsIDE0NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODIiIEAyMjMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDkzNCwgNzgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2NkEwMEYzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjE5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyODc0LCA3MzcpDQotCQkJCSgyODc0LCA2NTkpDQotCQkJCSgyMTQxLCA2NTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjg3NCwgNzM3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE0MSwgNjU5KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFRyYW5zYWN0aW9uIiBAMjI0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzUyLCAxMTU5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNA0KLQkJCWxvY2F0aW9uICAgCSgyMzA1LCAxMDMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTg5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kVHJhbnNhY3Rpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwREUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIyNA0KLQkJCWxvY2F0aW9uICAgCSgyMzA1LCAxMDk2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJOTUyKQ0KLQkJICAgIHdpZHRoICAgICAgCTkxMg0KLQkJICAgIGhlaWdodCAgICAgCTI4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyMjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI5MywgMTYxMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRTAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL21ldGhvZHMiIEAyMjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU0OCwgMTI0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJbG9jYXRpb24gICAJKDIwNjAsIDE1NjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiKy9tZXRob2RzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM1NTI2Mw0KLQkJCQloZWlnaHQgICAgIAk1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyOTMsIDE2MTIpDQotCQkJCSgxNjMzLCAxNjEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyOTMsIDE2MTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMzLCAxNjEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJbG9jYXRpb24gICAJKDE4MDUsIDE2NjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczODc3NQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3RyYW5zYWN0aW9ucyIgQDIyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTQ4LCAxMjQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjI1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjkzLCAxNjEyKQ0KLQkJCQkoMjY0MCwgMTYxMikNCi0JCQkJKDI2NDAsIDEyOTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI5MywgMTYxMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NDAsIDEyOTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU4NywgMTM5NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODU4MDg2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAyMzENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAxNDINCi0JCSAgICBzdXBwbGllciAgIAlAMjI0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDMyNDQsIDg5NCkNCi0JCQkoMzAxMCwgMTAxOCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJBc3NlbWJseURlc2NyaXB0b3JUb01ldGhvZFRyYW5zYWN0aW9ucyIgQDIzMg0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzE4LCA0NTYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImFzc2VtYmx5RGVzY3JpcHRvciIgQDIzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTczLCA4NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzMNCi0JCQkJbG9jYXRpb24gICAJKDE4MTgsIDQxNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUxMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUzNTUxOQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzMTgsIDQ1NikNCi0JCQkJKDEzODIsIDQ1NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzE4LCA0NTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzgyLCA0NTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3NiwgNTEwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZFRyYW5zYWN0aW9ucyIgQDIzNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTczLCA4NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzYNCi0JCQkJbG9jYXRpb24gICAJKDI5MjMsIDk0NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kVHJhbnNhY3Rpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyMzY4NA0KLQkJCQloZWlnaHQgICAgIAkyMzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMyDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzE4LCA0NTYpDQotCQkJCSgyNjkxLCA0NTYpDQotCQkJCSgyNjkxLCAxMDE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTgsIDQ1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTEsIDEwMTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzOA0KLQkJCQlQYXJlbnRfVmlldyAJQDIzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMjYwMywgOTYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MzgzMjYNCi0JCQkJaGVpZ2h0ICAgICAJODkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEAyMzkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgMTI2MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDQwOTAwRDQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kRWxlbWVudHMiIEAyNDANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDk0LCA3ODEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQxDQotCQkJCVBhcmVudF9WaWV3IAlAMjQwDQotCQkJCWxvY2F0aW9uICAgCSgxOTA2LCAxMjIzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDMzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RFbGVtZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC4wMzUyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyRUQ0MEEwMThBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjM5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTE4LCAxMjYxKQ0KLQkJCQkoMTU0MSwgMTI2MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTE4LCAxMjYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0MSwgMTI2MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQyDQotCQkJCVBhcmVudF9WaWV3IAlAMjQwDQotCQkJCWxvY2F0aW9uICAgCSgxNjczLCAxMzE0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NTM4NDYNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBAMjQzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjM5DQotCQkJICAgIGxvY2F0aW9uICAgCSg5NCwgNzgxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MkVENDBBMDE5RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjI0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTkxOCwgMTI2MSkNCi0JCQkJKDIyOTYsIDEyNjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkxOCwgMTI2MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTYsIDEyNjEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzkiIEAyNDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzExOSwgMTQ4NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUYyMzAwOTAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMjQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDI5OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJbG9jYXRpb24gICAJKDMwMzEsIDE0MDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42Nzc5NjYNCi0JCQkJaGVpZ2h0ICAgICAJMTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRjIzMDNEOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzExOSwgMTQ4NSkNCi0JCQkJKDMxMTksIDE1NDUpDQotCQkJCSgyOTU5LCAxNTQ1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMxMTksIDE0ODUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTU5LCAxNTQ1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJbG9jYXRpb24gICAJKDMwMzEsIDE2MTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3NTIxNA0KLQkJCQloZWlnaHQgICAgIAk2OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODAiIEAyNDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDc3OSwgMjk4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRjI0MDAwRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjI0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzExOSwgMTQ4NSkNCi0JCQkJKDMxMTksIDEyOTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzExOSwgMTQ4NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMxMTksIDEyOTkpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVKQiBJbXBsZW1lbnRhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzODBGREI3QjAxREEiDQotCSAgICB0aXRsZSAgICAgIAkiRUpCIEltcGxlbWVudGF0aW9uIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiwgb3Igc3RhdGVsZXNzIHNlc3Npb24uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTE2MzENCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCTWV0aG9kQ2F0ZWdvcnkiIEAyNDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwNiwgMjYxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCWxvY2F0aW9uICAgCSgxOTMsIDE4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQk1ldGhvZENhdGVnb3J5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzgxMEQwMzgwMzQ0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI0NA0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGl0eSIgQDI1MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzcxLCAxNzYxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI1MA0KLQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU2OTcwMzUxIg0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIiBAMjUxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk4MiwgMTE5NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCWxvY2F0aW9uICAgCSg4MjgsIDExNDQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICB3aWR0aCAgICAgIAkzMjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTINCi0JCSAgICBsb2NhdGlvbiAgIAkoOTgyLCAxNDgxKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTgyLCAxNDgxKQ0KLQkJCSg5ODIsIDEyNTYpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFODA4MDA5NSINCi0JCSAgICBjbGllbnQgICAgIAlAMjUwDQotCQkgICAgc3VwcGxpZXIgICAJQDI1MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNzEzLCAxNjczKQ0KLQkJCSgxNzEzLCAxNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzEzLCAxNjczKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzEzLCAxNDgxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI1MikNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMjU0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDU0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQlsb2NhdGlvbiAgIAkoODgxLCAzOTApDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQlsb2NhdGlvbiAgIAkoODgxLCA1MDUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzM1KQ0KLQkJICAgIHdpZHRoICAgICAgCTMyNg0KLQkJICAgIGhlaWdodCAgICAgCTMzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgInByaW1hcnlLZXkiIEAyNTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyMCwgNzUzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU2DQotCQkJUGFyZW50X1ZpZXcgCUAyNTUNCi0JCQlsb2NhdGlvbiAgIAkoMTkzNywgNDE0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkicHJpbWFyeUtleSINCi0JCQlwY3REaXN0ICAgIAkyLjQ1MDAwMA0KLQkJCWhlaWdodCAgICAgCTM0MA0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4MEZERERGMDA2QiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwcmltYXJ5S2V5IiBAMjU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjU1DQotCQkJICAgIGxvY2F0aW9uICAgCSgzNjQsIC03NTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGRERFMDAxMTciDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4MjAsIDc1MykNCi0JCQkJKDE4MjAsIDQ1NSkNCi0JCQkJKDExOTgsIDQ1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODIwLCA3NTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk4LCA0NTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5MCwgNDAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDI1OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzY0LCAtNzUxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4MEZEREUwMDEyMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjUwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTgyMCwgNzUzKQ0KLQkJCQkoMTgyMCwgMTY3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODIwLCA3NTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODIwLCAxNjczKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgInJlbW90ZUludGVyZmFjZSIgQDI2MA0KLQkJICAgIGxvY2F0aW9uICAgCSg5MzQsIDkyMSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQ0KLQkJCVBhcmVudF9WaWV3IAlAMjYwDQotCQkJbG9jYXRpb24gICAJKDk3NCwgOTIwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkicmVtb3RlSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTEuMTgzMzMzDQotCQkJaGVpZ2h0ICAgICAJMg0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzQ2MDA2QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZW1vdGVJbnRlcmZhY2UiIEAyNjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMTkyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDcwMTY2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzQsIDkyMSkNCi0JCQkJKDkzNCwgNzExKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzNCwgOTIxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM0LCA3MTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoODgxLCA3MzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiIiBAMjY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDE5MikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NzAxNjciDQotCQkJICAgIGNsaWVudCAgICAgCUAyNjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzNCwgOTIxKQ0KLQkJCQkoOTM0LCAxMTMyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzNCwgOTIxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM0LCAxMTMyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImhvbWVJbnRlcmZhY2UiIEAyNjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODE5LCA4NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjYNCi0JCQlQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCWxvY2F0aW9uICAgCSg4NDEsIDEwMTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJob21lSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCTAuODgzMzMzDQotCQkJaGVpZ2h0ICAgICAJMTQ5DQotCQkJb3JpZW50YXRpb24gCTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzcwMUM3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImhvbWVJbnRlcmZhY2UiIEAyNjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMTI4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDQwMTQzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjY1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MTksIDg2NCkNCi0JCQkJKDgxOSwgODA0KQ0KLQkJCQkoNzY2LCA4MDQpDQotCQkJCSg3NjYsIDY5OSkNCi0JCQkJKDg3MiwgNjk5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxOSwgODY0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODcyLCA2OTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoODMzLCA2NjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4MTkxOQ0KLQkJCQloZWlnaHQgICAgIAkzMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiIiBAMjY5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjY1DQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDEyOCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NDAxNEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgxOSwgODY0KQ0KLQkJCQkoODE5LCAxMTMyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxOSwgODY0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODE5LCAxMTMyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImVqYkNsYXNzIiBAMjcwDQotCQkgICAgbG9jYXRpb24gICAJKDExMzEsIDkyMSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQ0KLQkJCVBhcmVudF9WaWV3IAlAMjcwDQotCQkJbG9jYXRpb24gICAJKDExMjUsIDEwMzEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTU3DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlamJDbGFzcyINCi0JCQlwY3REaXN0ICAgIAkwLjQwMDAwMA0KLQkJCWhlaWdodCAgICAgCTExMA0KLQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzM0MDJDNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJDbGFzcyIgQDI3Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCAxODUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGREMzNTAxRUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMzEsIDkyMSkNCi0JCQkJKDExMzEsIDcxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTMxLCA5MjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA3MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTA5MSwgNzQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NzA1NTANCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDI3NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCAxODUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzUwMUY2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTMxLCA5MjEpDQotCQkJCSgxMTMxLCAxMTMxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMzEsIDkyMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDExMzEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAibG9jYWxIb21lSW50ZXJmYWNlIiBAMjc1DQotCQkgICAgbG9jYXRpb24gICAJKDE0MzEsIDk0MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Ng0KLQkJCVBhcmVudF9WaWV3IAlAMjc1DQotCQkJbG9jYXRpb24gICAJKDEzODUsIDk3OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTMyNzY4DQotCQkJICAgIGRlZmF1bHRfY29sb3IgCUZBTFNFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkibG9jYWxIb21lSW50ZXJmYWNlIg0KLQkJCXBjdERpc3QgICAgCS0wLjI2NjY2Nw0KLQkJCWhlaWdodCAgICAgCTM3DQotCQkJb3JpZW50YXRpb24gCTEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTE2Mzg0DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg2QzJCMDE4QiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsb2NhbEhvbWVJbnRlcmZhY2UiIEAyNzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQzOSwgLTI3NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2QzJDMDJBRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQzMSwgOTQxKQ0KLQkJCQkoMTQzMSwgNjI1KQ0KLQkJCQkoMTE5OCwgNjI1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDk0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExOTgsIDYyNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc4DQotCQkJCVBhcmVudF9WaWV3IAlAMjc3DQotCQkJCWxvY2F0aW9uICAgCSgxMjkwLCA2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkzMjc2OA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJRkFMU0UpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODM0NzQ2DQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDI3OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDM5LCAtMjc1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2QzJDMDJENyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjUxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQzMSwgOTQxKQ0KLQkJCQkoMTQzMSwgMTIwNCkNCi0JCQkJKDExNDUsIDEyMDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgOTQxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NSwgMTIwNCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJsb2NhbEludGVyZmFjZSIgQDI4MA0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODEsIDg3NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4MQ0KLQkJCVBhcmVudF9WaWV3IAlAMjgwDQotCQkJbG9jYXRpb24gICAJKDQ1MCwgODMxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMzI3NjgNCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJRkFMU0UpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQzDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJsb2NhbEludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAktMC4wMTY2NjcNCi0JCQloZWlnaHQgICAgIAk0NA0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkNDMjAyODMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxJbnRlcmZhY2UiIEAyODINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODANCi0JCQkgICAgbG9jYXRpb24gICAJKC01MTEsIC0zNDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkNDNjAwRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ4MSwgODc0KQ0KLQkJCQkoNDgxLCA2MDYpDQotCQkJCSg4NzIsIDYwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0ODEsIDg3NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg3MiwgNjA2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJbG9jYXRpb24gICAJKDczNiwgNjQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMzI3NjgNCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCUZBTFNFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5MzM3NQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEAyODQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODANCi0JCQkgICAgbG9jYXRpb24gICAJKC01MTEsIC0zNDIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzYwMTIwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0ODEsIDg3NCkNCi0JCQkJKDQ4MSwgMTE5NCkNCi0JCQkJKDgxOSwgMTE5NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0ODEsIDg3NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxOSwgMTE5NCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpTZXNzaW9uIiBAMjg1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2OTYsIDE3NjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjg1DQotCQkJbG9jYXRpb24gICAJKDM3MSwgMTY2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlc3Npb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTVGOTAxRUIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCWxvY2F0aW9uICAgCSgzNzEsIDE3MjEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk2NzIpDQotCQkgICAgd2lkdGggICAgICAJNjY4DQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyODYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxMjAiDQotCQkgICAgY2xpZW50ICAgICAJQDI4NQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNzE5LCAxNjQ4KQ0KLQkJCSg3MTksIDE0ODEpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTY0OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzE5LCAxNDgxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI1MikNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NSIgQDI4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg5NywgODYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1NjdDQTIwMDdGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VFbmRwb2ludCIgQDI4OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTYzMCwgLTY4NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJbG9jYXRpb24gICAJKDcwMSwgNDc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzEwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlRW5kcG9pbnQiDQotCQkJCXBjdERpc3QgICAgCTAuODQ3ODI2DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTY3Q0EzMDIyNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTcsIDg2MCkNCi0JCQkJKDk3LCA1MTkpDQotCQkJCSg4NzIsIDUxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NywgODYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODcyLCA1MTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MA0KLQkJCQlQYXJlbnRfVmlldyAJQDI4OA0KLQkJCQlsb2NhdGlvbiAgIAkoNzcxLCA1NTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwOTQyMA0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODYiIEAyOTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkgICAgbG9jYXRpb24gICAJKC02MzAsIC02ODYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2N0NBMzAyNDMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk3LCA4NjApDQotCQkJCSg5NywgMTcxMSkNCi0JCQkJKDM2MiwgMTcxMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NywgODYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzYyLCAxNzExKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJEYXRhIFR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjM4MTBENjlDMDFFNCINCi0JICAgIHRpdGxlICAgICAgCSJEYXRhIFR5cGVzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6U2Vzc2lvblR5cGUiIEAyOTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5Mg0KLQkJCWxvY2F0aW9uICAgCSgxMDksIDkyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2Vzc2lvblR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTINCi0JCQlsb2NhdGlvbiAgIAkoMTA5LCA0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkNBMDcwMTBDIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOTINCi0JCQlsb2NhdGlvbiAgIAkoMTA5LCAxNTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyMzEpDQotCQkgICAgd2lkdGggICAgICAJMzQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6VHJhbnNhY3Rpb25UeXBlIiBAMjkzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3MDQsIDE5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTMNCi0JCQlsb2NhdGlvbiAgIAkoNTQxLCAxMDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc2FjdGlvblR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTMNCi0JCQlsb2NhdGlvbiAgIAkoNTQxLCA1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdGQ0E0ODcwMkVGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOTMNCi0JCQlsb2NhdGlvbiAgIAkoNTQxLCAxNjkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyMzEpDQotCQkgICAgd2lkdGggICAgICAJMzQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIiBAMjk0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjE2LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk0DQotCQkJbG9jYXRpb24gICAJKDk3OCwgODgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTQNCi0JCQlsb2NhdGlvbiAgIAkoOTc4LCAzOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc5RjYzNDUwM0MwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOTQNCi0JCQlsb2NhdGlvbiAgIAkoOTc4LCAxNDkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAkzMDYpDQotCQkgICAgd2lkdGggICAgICAJNDk0DQotCQkgICAgaGVpZ2h0ICAgICAJNDkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVKQjIuMSAtIFJlbGF0aW9uc2hpcHMiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRUY5QzQwMzlDIg0KLQkgICAgdGl0bGUgICAgICAJIkVKQjIuMSAtIFJlbGF0aW9uc2hpcHMiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTg3Ng0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTGFiZWwgQDI5NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMSwgMzEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTINCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAk2MDANCi0JCSAgICBsYWJlbCAgICAgIAkiRUpCIDIuMSBSZWxhdGlvbnNoaXBzIikNCi0JCShvYmplY3QgTGFiZWwgQDI5Ng0KLQkJICAgIGxvY2F0aW9uICAgCSg5MCwgMzA0MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTM5DQotCQkgICAgbWF4X3dpZHRoICAJMTkyNQ0KLQkJICAgIGxhYmVsICAgICAgCQ0KLXxBbiBlbnRpdHkgYmVhbiBtYXkgaGF2ZSByZWxhdGlvbnNoaXBzIHdpdGggb3RoZXIgZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UuDQotfFJlbGF0aW9uc2hpcHMgbWF5IGJlIG9uZS10by1vbmUsIG9uZS10by1tYW55LCBvciBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwcy4NCi18Q29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcyBjYW4gZXhpc3Qgb25seSBhbW9uZyBlbnRpdHkgYmVhbnMgd2l0aGluIHRoZSBzYW1lIGxvY2FsIHJlbGF0aW9uc2hpcA0KLXxzY29wZSwgYXMgZGVmaW5lZCBieSB0aGUgcmVsYXRpb25zaGlwcyBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIENvbnRhaW5lciBtYW5hZ2VkDQotfHJlbGF0aW9uc2hpcHMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlbGF0ZWQgYmVhbnMuDQotfA0KLXxSZWxhdGlvbnNoaXBzIG1heSBiZSBlaXRoZXIgYmlkaXJlY3Rpb25hbCBvciB1bmlkaXJlY3Rpb25hbC4gSWYgYSByZWxhdGlvbnNoaXAgaXMgYmlkaXJlY3Rpb25hbCwgaXQgY2FuIGJlDQotfG5hdmlnYXRlZCBpbiBib3RoIGRpcmVjdGlvbnMsIHdoZXJlYXMgYSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgY2FuIGJlIG5hdmlnYXRlZCBpbiBvbmUgZGlyZWN0aW9uDQotfG9ubHkuDQotfA0KLXxBIHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgY21yLWZpZWxkIG9uIHRoZSBlbnRpdHkgYmVhbiBpbnN0YW5jZSBmcm9tIHdoaWNoDQotfG5hdmlnYXRpb24gY2FuIHRha2UgcGxhY2UsIGFuZCBubyByZWxhdGVkIGNtci1maWVsZCBvbiB0aGUgZW50aXR5IGJlYW4gaW5zdGFuY2UgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQ0KLXxyZWxhdGlvbnNoaXAuIFVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIEJlYW4gUHJvdmlkZXIgd2lzaGVzIHRvIHJlc3RyaWN0DQotfHRoZSB2aXNpYmlsaXR5IG9mIGEgcmVsYXRpb25zaGlwLg0KLXwNCi18QW4gZW50aXR5IGJlYW4gdGhhdCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlIGNhbiBoYXZlIG9ubHkgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBmcm9tIGl0c2VsZg0KLXx0byBvdGhlciBlbnRpdHkgYmVhbnMuIFRoZSBsYWNrIG9mIGEgbG9jYWwgaW50ZXJmYWNlIHByZXZlbnRzIG90aGVyIGVudGl0eSBiZWFucyBmcm9tIGhhdmluZyBhIHJlbGF0aW9uc2hpcA0KLXx0byBpdC4NCi18DQotfFRoZSBiZWFuIGRldmVsb3BlciBuYXZpZ2F0ZXMgb3IgbWFuaXB1bGF0ZXMgbG9naWNhbCByZWxhdGlvbnNoaXBzIGJ5IHVzaW5nIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3Nvcg0KLXxtZXRob2RzIGZvciB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwIGZpZWxkcyBhbmQgdGhlIGphdmEudXRpbC5Db2xsZWN0aW9uIEFQSSBmb3INCi18Y29sbGVjdGlvbi12YWx1ZWQgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwIGZpZWxkcy4NCi18DQotfFRoZSBiZWFuIHByb3ZpZGVyIG11c3QgY29uc2lkZXIgdGhlIHR5cGUgYW5kIGNhcmRpbmFsaXR5IG9mIHJlbGF0aW9uc2hpcHMgd2hlbiB0aGUgZW50aXR5IGJlYW4gY2xhc3Nlcw0KLXxhcmUgcHJvZ3JhbW1lZC4gVGhlIGdldCBtZXRob2QgZm9yIGEgY21yLWZpZWxkIG11c3QgcmV0dXJuIGVpdGhlciB0aGUgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSBlbnRpdHkgYmVhbg0KLXxvciBhIGNvbGxlY3Rpb24gKG1vcmUgcHJlY2lzZWx5LCBlaXRoZXIgamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldCkgb2YgdGhlDQotfHNhbWUuIFRoZSBzZXQgbWV0aG9kIGZvciB0aGUgcmVsYXRpb25zaGlwIG11c3QgdGFrZSBhcyBhbiBhcmd1bWVudCB0aGUgZW50aXR5IGJlYW6ScyBsb2NhbCBpbnRlcmZhY2Ugb3IgYQ0KLXxjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLg0KLQkJICAgICkNCi0JCShvYmplY3QgTGFiZWwgQDI5Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg5MCwgMjk2MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMg0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTYwMA0KLQkJICAgIGxhYmVsICAgICAgCSJSZWdhcmRpbmcgUmVsYXRpb25zaGlwcyIpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIiBAMjk4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDI4MTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk4DQotCQkJbG9jYXRpb24gICAJKDYxNSwgMjcxMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNNUEF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjk4DQotCQkJbG9jYXRpb24gICAJKDYxNSwgMjc3NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU3MikNCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNdWx0aXBsaWNpdHlLaW5kIiBAMjk5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjkwLCAxNTMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCWxvY2F0aW9uICAgCSgyNTI4LCAxNDQ4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTXVsdGlwbGljaXR5S2luZCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCWxvY2F0aW9uICAgCSgyNTI4LCAxMzk4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzIxDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUVCQ0IwMkI3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOTkNCi0JCQlsb2NhdGlvbiAgIAkoMjUyOCwgMTUwOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTE1OSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNDINCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDMwMA0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzM5LCAyMDE1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwMA0KLQkJCWxvY2F0aW9uICAgCSgyNTgzLCAxODcxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTE0NzcNCi0JCQlsYWJlbCAgICAgIAkiQ0NNIC0gVGhpcyB3YXMgb3JpZ2luYWxseSBtb2RlbGVkIGFzIGFuIGVNdWx0aXBsaWNpdHksIGJ1dCBoYXMgYmVlbiBzaW1wbGlmaWVkIHRvIGEgc3BlY2lmaWMgc2V0IG9mIGVudW0gdmFsdWVzLiAgVGhlIGVudW1lcmF0aW9uIHR5cGUgaXMgZGlmZmVyZW50IGZyb20gZU11bHRpcGxpY2l0eSwgd2hpY2ggY2FwdHVyZXMgbXVjaCBtb3JlIGluZm9ybWF0aW9uLCBsaWtlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMuICBJZiB3ZSBmaW5kIHRoYXQgdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY2FwdHVyZWQgYnkgZU11bHRpcGxpY2l0eSBpcyByZXF1aXJlZCwgaXQgY2FuIGJlIGFkZGVkIGluIGFuIGV4dGVuc2lvbiB0byBSZWxhdGlvbnNoaXBSb2xlLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHdpZHRoICAgICAgCTE1MzcNCi0JCSAgICBoZWlnaHQgICAgIAkzMDApDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzMDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyNCwgMjQyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDENCi0JCQlsb2NhdGlvbiAgIAkoMTM2NywgMjE1NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTEwDQotCQkJbWF4X3dpZHRoICAJMTA3OA0KLQkJCWxhYmVsICAgICAgCQ0KLXxUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4NCi18DQotfEBpbnZhcmlhbnQgVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMTM4DQotCQkgICAgaGVpZ2h0ICAgICAJNTU2KQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMDINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzMDANCi0JCSAgICBzdXBwbGllciAgIAlAMjk5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI3NDgsIDE4NjQpDQotCQkJKDI3NDgsIDE2NzgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NDgsIDE4NjQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NDgsIDE2NzgpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAzMDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDI2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzAzDQotCQkJbG9jYXRpb24gICAJKDMyMywgMjU3NykNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIiBAMzA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCAyNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA0DQotCQkJbG9jYXRpb24gICAJKDM4NCwgMjMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCSmFyIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA0DQotCQkJbG9jYXRpb24gICAJKDM4NCwgMTgzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzE3DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGNvbXBvbmVudD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM1NUQwMUUxIg0KLQkJICAgIHdpZHRoICAgICAgCTMzOA0KLQkJICAgIGhlaWdodCAgICAgCTE3MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkNNUkZpZWxkIiBAMzA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MzIsIDIzMDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJbG9jYXRpb24gICAJKDMyOCwgMjI1NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNNUkZpZWxkIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MTAwMDRCIg0KLQkJICAgIHdpZHRoICAgICAgCTIyNg0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzA2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFENDY5MDE3MCINCi0JCSAgICBjbGllbnQgICAgIAlAMzA1DQotCQkgICAgc3VwcGxpZXIgICAJQDI5OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODYsIDIzNjYpDQotCQkJKDc3OCwgMjcwMCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NCIgQDMwNw0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDI0NjUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUUwRkIwM0QzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbGxlY3Rpb25UeXBlIiBAMzA4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzA3DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCA1OTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA5DQotCQkJCVBhcmVudF9WaWV3IAlAMzA4DQotCQkJCWxvY2F0aW9uICAgCSgyNDcsIDI1MjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbGxlY3Rpb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY1MDgxMw0KLQkJCQloZWlnaHQgICAgIAkxNzANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5QUUwRkMwMzhGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzA3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMDMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0MTYsIDI0NjUpDQotCQkJCSg0MTYsIDI1NjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDE2LCAyNDY1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE2LCAyNTY1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDgNCi0JCQkJbG9jYXRpb24gICAJKDQ3MSwgMjU0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzQ3NDc1DQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NSIgQDMxMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgNTkzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OUFFMEZDMDNCNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDE2LCAyNDY1KQ0KLQkJCQkoNDE2LCAyMzY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQxNiwgMjQ2NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNiwgMjM2NikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbiIgQDMxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjE2LCA5OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzEyDQotCQkJbG9jYXRpb24gICAJKDM1MSwgODY1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCUmVsYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEMwMjAzQkYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMxMg0KLQkJCWxvY2F0aW9uICAgCSgzNTEsIDkyNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTU3MikNCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpSZWxhdGlvbnNoaXBzIiBAMzEzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDU3NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMTMNCi0JCQlsb2NhdGlvbiAgIAkoMjYzLCA0OTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZWxhdGlvbnNoaXBzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4MTcwM0IzIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMTMNCi0JCQlsb2NhdGlvbiAgIAkoMjYzLCA1NjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAzMTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTUwLCA0MTMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg3MDM3OCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJKYXIiIEAzMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDU0LCAxMDkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE2DQotCQkJCVBhcmVudF9WaWV3IAlAMzE1DQotCQkJCWxvY2F0aW9uICAgCSg2NTMsIDM2OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiSmFyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwODEwOA0KLQkJCQloZWlnaHQgICAgIAkxMDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4ODkwMDNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzE0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1NTAsIDQxMykNCi0JCQkJKDU1MCwgMzQwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU1MCwgNDEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzNDApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDkzLCAzNjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3NTY3Ng0KLQkJCQloZWlnaHQgICAgIAk1OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVsYXRpb25zaGlwTGlzdCIgQDMxOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTQsIDEwOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJbG9jYXRpb24gICAJKDcyNSwgNDU5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWxhdGlvbnNoaXBMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjYzNzM2Mw0KLQkJCQloZWlnaHQgICAgIAkxNzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4ODkwMDNDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzE0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1NTAsIDQxMykNCi0JCQkJKDU1MCwgNDg3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU1MCwgNDEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCA0ODcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNDg3LCA0NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3MDMzMA0KLQkJCQloZWlnaHQgICAgIAk2NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMyMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2NDEsIDc1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwQzQwMDE0NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJSZWxhdGlvbnMiIEAzMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkgICAgbG9jYXRpb24gICAJKDI3MywgNTAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMyMg0KLQkJCQlsb2NhdGlvbiAgIAkoNDkyLCA3OTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYlJlbGF0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC4zNzkzMTANCi0JCQkJaGVpZ2h0ICAgICAJMTUwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYwQzQxMDAxQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjQxLCA3NTkpDQotCQkJCSg2NDEsIDg1MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDEsIDc1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0MSwgODUyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjINCi0JCQkJbG9jYXRpb24gICAJKDY5NywgODA1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbGF0aW9uc2hpcExpc3QiIEAzMjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkgICAgbG9jYXRpb24gICAJKDI3MywgNTAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQwLCA3MDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlbGF0aW9uc2hpcExpc3QiDQotCQkJCXBjdERpc3QgICAgCTAuNjIyMjIyDQotCQkJCWhlaWdodCAgICAgCTE5OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEM0MTAwMUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0MSwgNzU5KQ0KLQkJCQkoNjQxLCA2NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQxLCA3NTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDY2NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI3DQotCQkJCVBhcmVudF9WaWV3IAlAMzI1DQotCQkJCWxvY2F0aW9uICAgCSg1NjgsIDY5NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzExMTExDQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uc2hpcFJvbGUiIEAzMjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUzNywgMTU2OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQlsb2NhdGlvbiAgIAkoMjcyLCAxNDIwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCUmVsYXRpb25zaGlwUm9sZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREQwMDIzRCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzI4DQotCQkJbG9jYXRpb24gICAJKDI3MiwgMTQ4MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU3MikNCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkzMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDMyOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDEsIDE5MTApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMUJCRDAyRUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL29wcG9zaXRlIiBAMzMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDExLCA3NzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMxDQotCQkJCVBhcmVudF9WaWV3IAlAMzMwDQotCQkJCWxvY2F0aW9uICAgCSg0OTMsIDE3ODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiKy9vcHBvc2l0ZSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDUxOTINCi0JCQkJaGVpZ2h0ICAgICAJMTI0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYxQkMwMDM5QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAxLCAxOTEwKQ0KLQkJCQkoMTAxLCAxOTcwKQ0KLQkJCQkoMzY5LCAxOTcwKQ0KLQkJCQkoMzY5LCAxNzMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMSwgMTkxMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2OSwgMTczMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEAzMzINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTEsIDc3NCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMUJDMDAzQTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMSwgMTkxMCkNCi0JCQkJKDEwMSwgMTU5MCkNCi0JCQkJKDI2MywgMTU5MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDEsIDE5MTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjMsIDE1OTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEAzMzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxOTg2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MjAwMUMxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNtckZpZWxkIiBAMzM0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzMzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIsIDg1MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzQNCi0JCQkJbG9jYXRpb24gICAJKDM4MywgMjE5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY21yRmllbGQiDQotCQkJCXBjdERpc3QgICAgCTAuODA5NTI0DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTgyMTAwRDIiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUwMCwgMTk4NikNCi0JCQkJKDUwMCwgMjI0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDAsIDE5ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDIyNDIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDMzNA0KLQkJCQlsb2NhdGlvbiAgIAkoNTM5LCAyMTc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NTIyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJvbGUiIEAzMzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMiwgODUwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCQlsb2NhdGlvbiAgIAkoNTcyLCAxNzgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityb2xlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwNTcxNA0KLQkJCQloZWlnaHQgICAgIAk3Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTgyMTAwREMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUwMCwgMTk4NikNCi0JCQkJKDUwMCwgMTczMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDAsIDE5ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDE3MzApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEAzMzkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAxMjY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERTMwMTM2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbGF0aW9uc2hpcFJvbGVzIiBAMzQwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzM5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTEsIDU2NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDENCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDANCi0JCQkJbG9jYXRpb24gICAJKDQ2MCwgMTM2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMzMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVsYXRpb25zaGlwUm9sZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjg1MTg1DQotCQkJCWhlaWdodCAgICAgCTE4OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMERFMzAzRDUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0NywgMTI2OCkNCi0JCQkJKDY0NywgMTQwNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDcsIDEyNjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDcsIDE0MDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDM0MA0KLQkJCQlsb2NhdGlvbiAgIAkoNjg0LCAxMzc0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMiINCi0JCQkJcGN0RGlzdCAgICAJMC43NjE5MDUNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbGF0aW9uc2hpcCIgQDM0Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxLCA1NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0DQotCQkJCVBhcmVudF9WaWV3IAlAMzQzDQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDExOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlbGF0aW9uc2hpcCINCi0JCQkJcGN0RGlzdCAgICAJMC41NzUzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREUzMDNENiINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjQ3LCAxMjY4KQ0KLQkJCQkoNjQ3LCAxMTMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NywgMTI2OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NywgMTEzMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ1DQotCQkJCVBhcmVudF9WaWV3IAlAMzQzDQotCQkJCWxvY2F0aW9uICAgCSg2ODYsIDExNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5ODYzMA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDM0Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgNDcxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCWxvY2F0aW9uICAgCSgxNDY4LCAzNDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ2DQotCQkJbG9jYXRpb24gICAJKDE0NjgsIDQ1NykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI4NSkNCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NSIgQDM0Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCA2MTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFGQ0IwMUFBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDM0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCAtMzc5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMCwgNTk3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjQ1NjIxDQotCQkJCWhlaWdodCAgICAgCTE3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRkNDMDBDNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA0MiwgNjEzKQ0KLQkJCQkoMTQ1OSwgNjEzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDIsIDYxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTksIDYxMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUwDQotCQkJCVBhcmVudF9WaWV3IAlAMzQ4DQotCQkJCWxvY2F0aW9uICAgCSgxMzY2LCA2NTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NTk2Nw0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjYiIEAzNTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzMSwgLTM3OSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUZDQzAwRTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNDIsIDYxMykNCi0JCQkJKDg2NSwgNjEzKQ0KLQkJCQkoODY1LCA4NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0MiwgNjEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY1LCA4NTMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzMiIEAzNTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzMCwgNTA2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRkJGMDFDQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAzNTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgLTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5OSwgNDYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNTEyOTAzDQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRkMxMDAxRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTEzMCwgNTA2KQ0KLQkJCQkoMTQ1OSwgNTA2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMzAsIDUwNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTksIDUwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU1DQotCQkJCVBhcmVudF9WaWV3IAlAMzUzDQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA1NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY1NDgzOQ0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzQiIEAzNTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgLTcwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRkMxMDA0NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTEzMCwgNTA2KQ0KLQkJCQkoODAyLCA1MDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzMCwgNTA2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODAyLCA1MDYpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzciIEAzNTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI4NSwgMTE2OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjBDMTAyQzYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMzU4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NDgsIC00MDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCVBhcmVudF9WaWV3IAlAMzU4DQotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCA3MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44NjE1OTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyMEM0MDBDQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI4NSwgMTE2OSkNCi0JCQkJKDE1MzMsIDExNjkpDQotCQkJCSgxNTMzLCA2MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI4NSwgMTE2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzMsIDYxMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYwDQotCQkJCVBhcmVudF9WaWV3IAlAMzU4DQotCQkJCWxvY2F0aW9uICAgCSgxNDgxLCA2NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyMTQ0Ng0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzgiIEAzNjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDc0OCwgLTQwMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjBDNDAwRUEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyODUsIDExNjkpDQotCQkJCSg3MTksIDExNjkpDQotCQkJCSg3MTksIDE0MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI4NSwgMTE2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxOSwgMTQwOCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBAMzYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzIxLCAxMTM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTQ5LCAxMDM2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTc0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29udGFpbmVyTWFuYWdlZEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzYyDQotCQkJbG9jYXRpb24gICAJKDE5NDksIDEwOTcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk3NzkpDQotCQkgICAgd2lkdGggICAgICAJNzYyDQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzgiIEAzNjMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5MCwgMTIzMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODZGNTAzQkQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3JvbGVzIiBAMzY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTY2LCAtMTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM2NA0KLQkJCQlsb2NhdGlvbiAgIAkoODgyLCAxMzYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvcm9sZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODkyODU3DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg4NkY2MDJEOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDM2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI5MCwgMTIzMykNCi0JCQkJKDEwNzksIDEyMzMpDQotCQkJCSgxMDc5LCAxNDAzKQ0KLQkJCQkoODExLCAxNDAzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTAsIDEyMzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTEsIDE0MDMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDM2NA0KLQkJCQlsb2NhdGlvbiAgIAkoODc1LCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDA3OTQNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM5IiBAMzY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTY2LCAtMTQzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg4NkY2MDJFMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzYyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI5MCwgMTIzMykNCi0JCQkJKDE5NDAsIDEyMzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI5MCwgMTIzMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyMzMpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Um9sZVNvdXJjZSIgQDM2OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NiwgMTgwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQlsb2NhdGlvbiAgIAkoMTI3OCwgMTcwNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJvbGVTb3VyY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTQ3NTAwRTQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM2OA0KLQkJCWxvY2F0aW9uICAgCSgxMjc4LCAxNzY2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAMzY5DQotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDE3MTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTRFQTAyRkYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic291cmNlIiBAMzcwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzY5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDU4MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzNzANCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDE2NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NvdXJjZSINCi0JCQkJcGN0RGlzdCAgICAJMC42NTkzODkNCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0RUMwMDU5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzY5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDQwLCAxNzE3KQ0KLQkJCQkoMTI2OSwgMTcxNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQwLCAxNzE3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2OSwgMTcxNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcyDQotCQkJCVBhcmVudF9WaWV3IAlAMzcwDQotCQkJCWxvY2F0aW9uICAgCSgxMjQ1LCAxNzcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJvbGUiIEAzNzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDUyOCwgNTgxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODg4LCAxNjYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityb2xlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2Mzc1NQ0KLQkJCQloZWlnaHQgICAgIAk1Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTRFQzAwNUEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNDAsIDE3MTcpDQotCQkJCSg4MTEsIDE3MTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0MCwgMTcxNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxMSwgMTcxNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc1DQotCQkJCVBhcmVudF9WaWV3IAlAMzczDQotCQkJCWxvY2F0aW9uICAgCSg4MzUsIDE3NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2OSIgQDM3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAxMTUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyMTAzMDBDRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAzNzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4OCwgLTY1NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJbG9jYXRpb24gICAJKDE3OTcsIDcyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5MDY1Nw0KLQkJCQloZWlnaHQgICAgIAkxNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDIxMDUwMkVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzc2DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjQ0LCAxMTUyKQ0KLQkJCQkoMTY0NCwgNjEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NDQsIDExNTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjQ0LCA2MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5OCwgNjY3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcwIiBAMzgwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODgsIC02NTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDIxMDUwMzBBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzc2DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjQ0LCAxMTUyKQ0KLQkJCQkoMTY0NCwgMTY5MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQ0LCAxMTUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY0NCwgMTY5MykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNiIgQDM4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTQyLCAxNjUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg4NEMyMDM2RSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHlCZWFuIiBAMzgyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDI2MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzODINCi0JCQkJbG9jYXRpb24gICAJKDE5NjQsIDE5MTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eUJlYW4iDQotCQkJCXBjdERpc3QgICAgCS0wLjY2NDYzNA0KLQkJCQloZWlnaHQgICAgIAkyMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODRDMzAyN0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAzODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDM2Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NDIsIDE2NTIpDQotCQkJCSgxOTQyLCAxMjUyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDIsIDE2NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQyLCAxMjUyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzODINCi0JCQkJbG9jYXRpb24gICAJKDE5OTYsIDEyOTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzciIEAzODUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzODENCi0JCQkgICAgbG9jYXRpb24gICAJKDcxMCwgMjYwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg4NEMzMDI4OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk0MiwgMTY1MikNCi0JCQkJKDE5NDIsIDE3NTQpDQotCQkJCSgxNjQzLCAxNzU0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDIsIDE2NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjQzLCAxNzU0KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFSkIyLjEgLSBRdWVyeSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMjQxRTAxOTMiDQotCSAgICB0aXRsZSAgICAgIAkiRUpCMi4xIC0gUXVlcnkiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMzM4DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlJldHVyblR5cGVNYXBwaW5nIiBAMzg2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDE4OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzg2DQotCQkJbG9jYXRpb24gICAJKDE2OCwgMTgwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJldHVyblR5cGVNYXBwaW5nIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzg2DQotCQkJbG9jYXRpb24gICAJKDE2OCwgMTc1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg3MEQzMDI3NiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzg2DQotCQkJbG9jYXRpb24gICAJKDE2OCwgMTg2OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTIwMCkNCi0JCSAgICB3aWR0aCAgICAgIAk0MTgNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTGFiZWwgQDM4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTksIDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTE0DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCVRSVUUNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkgICAgbGFiZWwgICAgICAJIkVKQjIuMSBRdWVyeSIpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCIgQDM4OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc1NCwgMTA2MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzODgNCi0JCQlsb2NhdGlvbiAgIAkoMTUwNSwgOTE0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMjJEMDA4QSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzg4DQotCQkJbG9jYXRpb24gICAJKDE1MDUsIDk3NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTUzMikNCi0JCSAgICB3aWR0aCAgICAgIAk1MTYNCi0JCSAgICBoZWlnaHQgICAgIAkzMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDM4OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA3MiwgOTgzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzg5DQotCQkJbG9jYXRpb24gICAJKDI4NTgsIDgwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzODkNCi0JCQlsb2NhdGlvbiAgIAkoMjg1OCwgODYzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzMDMpDQotCQkgICAgd2lkdGggICAgICAJNDQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMzg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAzOTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ0NiwgOTQ1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MzdENkZGMDExRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RFbGVtZW50IiBAMzkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY0LCA0NjUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkyDQotCQkJCVBhcmVudF9WaWV3IAlAMzkxDQotCQkJCWxvY2F0aW9uICAgCSgyMTk4LCA5MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZEVsZW1lbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjAwOTk4DQotCQkJCWhlaWdodCAgICAgCTQ3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MzdENzAwMDIxOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDM5MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjQ0NiwgOTQ1KQ0KLQkJCQkoMjQ0NiwgOTc4KQ0KLQkJCQkoMjAxMiwgOTc4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI0NDYsIDk0NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDk3OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkzDQotCQkJCVBhcmVudF9WaWV3IAlAMzkxDQotCQkJCWxvY2F0aW9uICAgCSgyMDgzLCAxMDI5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NTAzNzQNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGVycHJpc2VCZWFuIiBAMzk0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY0LCA0NjUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk1DQotCQkJCVBhcmVudF9WaWV3IAlAMzk0DQotCQkJCWxvY2F0aW9uICAgCSgyNjczLCA4NjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGVycHJpc2VCZWFuIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5OTUwMw0KLQkJCQloZWlnaHQgICAgIAk0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTM3RDcwMDAxNzgiDQotCQkJICAgIGNsaWVudCAgICAgCUAzOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDM4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0NDYsIDk0NSkNCi0JCQkJKDI0NDYsIDkxMikNCi0JCQkJKDI4NDksIDkxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDQ2LCA5NDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQ5LCA5MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDM5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjgwNCwgOTY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50aXR5IiBAMzk3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTkxLCAzNjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzk3DQotCQkJbG9jYXRpb24gICAJKDE0MDgsIDI1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNjk3MDM1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzk3DQotCQkJbG9jYXRpb24gICAJKDE0MDgsIDMxOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM4OCkNCi0JCSAgICB3aWR0aCAgICAgIAkzODQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFODA4MDA5NSINCi0JCSAgICBjbGllbnQgICAgIAlAMzk3DQotCQkgICAgc3VwcGxpZXIgICAJQDM4OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNzgzLCA0NDApDQotCQkJKDI4NDgsIDg4OSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeU1ldGhvZCIgQDM5OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk4NCwgMTQ4MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOTkNCi0JCQlsb2NhdGlvbiAgIAkoMTg5NiwgMTQwNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlF1ZXJ5TWV0aG9kIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFDRDlDMDJERiINCi0JCSAgICB3aWR0aCAgICAgIAkxOTQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwMA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRDIzODAyQTkiDQotCQkgICAgY2xpZW50ICAgICAJQDM5OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzODgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTk1MywgMTM5MikNCi0JCQkoMTk1MywgMTIyNCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MywgMTM5MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MywgMTIyNCkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEA0MDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxOCwgMjAzNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MDENCi0JCQlsb2NhdGlvbiAgIAkoNzkwLCAxOTA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQwMQ0KLQkJCWxvY2F0aW9uICAgCSg3OTAsIDIwMjIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODUpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjg0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgQDQwMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjYwLCAzOTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDAyDQotCQkJbG9jYXRpb24gICAJKDI4OCwgMjcwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTc0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29udGFpbmVyTWFuYWdlZEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDAyDQotCQkJbG9jYXRpb24gICAJKDI4OCwgMzMxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNzc5KQ0KLQkJICAgIHdpZHRoICAgICAgCTc2Mg0KLQkJICAgIGhlaWdodCAgICAgCTI3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc1Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0MDINCi0JCSAgICBzdXBwbGllciAgIAlAMzk3DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEwNDEsIDM2NikNCi0JCQkoMTM5OSwgMzY2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQxLCAzNjYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTksIDM2NikpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6UXVlcnkiIEA0MDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc4MiwgMTQ3OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MDQNCi0JCQlsb2NhdGlvbiAgIAkoMzA1LCAxMzUzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTk1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUXVlcnkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDI3MTAzMjciDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQwNA0KLQkJCWxvY2F0aW9uICAgCSgzMDUsIDE0MTQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk5NzMpDQotCQkgICAgd2lkdGggICAgICAJOTcyDQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEA0MDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU3NywgMTQ3NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwNTY3MDJDRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJxdWVyeU1ldGhvZCIgQDQwNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NywgMTMxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwNw0KLQkJCQlQYXJlbnRfVmlldyAJQDQwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgMTQzOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcXVlcnlNZXRob2QiDQotCQkJCXBjdERpc3QgICAgCTAuNDkxNTI1DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYwNTY5MDFFQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQwNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzk5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU3NywgMTQ3NSkNCi0JCQkJKDE4ODcsIDE0NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU3NywgMTQ3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODcsIDE0NzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDQwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NSwgMTUyOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJxdWVyeSIgQDQwOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NywgMTMxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDQwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMzMCwgMTQzNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcXVlcnkiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYwNTY5MDFGNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQwNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDA0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU3NywgMTQ3NSkNCi0JCQkJKDEyNjgsIDE0NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU3NywgMTQ3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjgsIDE0NzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5OSwgMTUyOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgzIiBANDEyDQotCQkgICAgbG9jYXRpb24gICAJKDg0OSwgMTc1NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTY1MDBEMDI1OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA0MTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MTINCi0JCQkgICAgbG9jYXRpb24gICAJKDY3LCAyNzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDE0DQotCQkJCVBhcmVudF9WaWV3IAlANDEzDQotCQkJCWxvY2F0aW9uICAgCSgxMDE1LCAxODQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODc0NDA4DQotCQkJCWhlaWdodCAgICAgCTE0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2NTAwRTAxNDIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg0OSwgMTc1NCkNCi0JCQkJKDg4MywgMTg5NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDE1DQotCQkJCVBhcmVudF9WaWV3IAlANDEzDQotCQkJCWxvY2F0aW9uICAgCSg4MTgsIDE4NTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwNzQ2Mw0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODQiIEA0MTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MTINCi0JCQkgICAgbG9jYXRpb24gICAJKDY3LCAyNzYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1NjUwMEUwMTc0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDEyDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NDksIDE3NTQpDQotCQkJCSg4MTUsIDE2MTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTQiIEA0MTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjM4LCAxMDEzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjVENjAwRjAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBANDE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIC0xNzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDE5DQotCQkJCVBhcmVudF9WaWV3IAlANDE4DQotCQkJCWxvY2F0aW9uICAgCSg2OTYsIDU3MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkzODI3Mg0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI1RDYwMEYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDE3DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2MzgsIDEwMTMpDQotCQkJCSg1NzgsIDEwMTMpDQotCQkJCSg1NzgsIDUzNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzgsIDEwMTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzgsIDUzNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDIwDQotCQkJCVBhcmVudF9WaWV3IAlANDE4DQotCQkJCWxvY2F0aW9uICAgCSg1MDksIDU3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTM0NTY4DQotCQkJCWhlaWdodCAgICAgCTcwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJxdWVyaWVzIiBANDIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIC0xNzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDIyDQotCQkJCVBhcmVudF9WaWV3IAlANDIxDQotCQkJCWxvY2F0aW9uICAgCSg5MTAsIDEyODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3F1ZXJpZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODgzOTUxDQotCQkJCWhlaWdodCAgICAgCTExMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjVENjAwRjIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDYzOCwgMTAxMykNCi0JCQkJKDc5NywgMTAxMykNCi0JCQkJKDc5NywgMTM0MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzgsIDEwMTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEzNDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgzLCAxMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45NTgwMjUNCi0JCQkJaGVpZ2h0ICAgICAJODYNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVKQjIuMSAtIE1lc3NhZ2UgRHJpdmVuIEJlYW4iDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjI3NDkwMzBDIg0KLQkgICAgdGl0bGUgICAgICAJIkVKQjIuMSAtIE1lc3NhZ2UgRHJpdmVuIEJlYW4iDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UNCi18ICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIElmDQotfCAgICAgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMNCi18ICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuDQotCSAgICANCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxOTMxDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBMYWJlbCBANDI0DQotCQkgICAgbG9jYXRpb24gICAJKDUwLCA0MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMg0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTc2Mg0KLQkJICAgIGxhYmVsICAgICAgCSJFSkIyLjEgTWVzc2FnZSBEcml2ZW4gQmVhbiIpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEA0MjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTYsIDM2MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyNQ0KLQkJCWxvY2F0aW9uICAgCSgyNDIsIDMxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIHdpZHRoICAgICAgCTMyNg0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlRyYW5zYWN0aW9uVHlwZSIgQDQyNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNSwgNDk3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyNg0KLQkJCWxvY2F0aW9uICAgCSgxNjU5LCA0MTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc2FjdGlvblR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MjYNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OSwgMzYzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0ZDQTQ4NzAyRUYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQyNg0KLQkJCWxvY2F0aW9uICAgCSgxNjU5LCA0NzQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyMzEpDQotCQkgICAgd2lkdGggICAgICAJMzUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA0MjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgODk3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyNw0KLQkJCWxvY2F0aW9uICAgCSgxNDg4LCA3OTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJbGFiZWwgICAgICAJIldhcyBhbHJlYWR5IHVzZWQvZGVmaW5lZCBieSBTZXNzaW9uIGJlYW4iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTMwMA0KLQkJICAgIGhlaWdodCAgICAgCTIxMikNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANDI4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlANDI3DQotCQkgICAgc3VwcGxpZXIgICAJQDQyNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjc4LCA3OTApDQotCQkJKDE3NTEsIDY0MykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpBY2tub3dsZWRnZU1vZGUiIEA0MjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTE2OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MjkNCi0JCQlsb2NhdGlvbiAgIAkoNTY0LCAxMDg1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ0MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQWNrbm93bGVkZ2VNb2RlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDI5DQotCQkJbG9jYXRpb24gICAJKDU2NCwgMTAzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ0MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjM2RDcwM0U0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MjkNCi0JCQlsb2NhdGlvbiAgIAkoNTY0LCAxMTQ2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDQ2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1OA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIiBANDMwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAxOTY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzMA0KLQkJCWxvY2F0aW9uICAgCSg4MDUsIDE4ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzMA0KLQkJCWxvY2F0aW9uICAgCSg4MDUsIDE4MzQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzOEYwMDI5QyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDMwDQotCQkJbG9jYXRpb24gICAJKDgwNSwgMTk0NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI2OCkNCi0JCSAgICB3aWR0aCAgICAgIAk1MjANCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpEZXN0aW5hdGlvblR5cGUiIEA0MzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU0NCwgMTk2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MzENCi0JCQlsb2NhdGlvbiAgIAkoMzc2LCAxODg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzdGluYXRpb25UeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDMxDQotCQkJbG9jYXRpb24gICAJKDM3NiwgMTgzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5OTc4RjVDMDEwNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDMxDQotCQkJbG9jYXRpb24gICAJKDM3NiwgMTk0NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTE3OCkNCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24iIEA0MzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU2OCwgMTYxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MzINCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxNDg5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTkxMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMzRjEwMDQ0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MzINCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxNTUwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJOTUxKQ0KLQkJICAgIHdpZHRoICAgICAgCTkzMA0KLQkJICAgIGhlaWdodCAgICAgCTI3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA0MzMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI4LCA1NDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDMzDQotCQkJbG9jYXRpb24gICAJKDEzMDMsIDQ1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTENCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyNjkNCi0JCSAgICBoZWlnaHQgICAgIAkyMTkNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiIEA0MzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI2MjAsIDE3OTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDM0DQotCQkJbG9jYXRpb24gICAJKDI0ODgsIDE2NzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBMUEwMEJGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MzQNCi0JCQlsb2NhdGlvbiAgIAkoMjQ4OCwgMTc4MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI5NCkNCi0JCSAgICB3aWR0aCAgICAgIAkyODINCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuIiBANDM1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NjQsIDc5OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MzUNCi0JCQlsb2NhdGlvbiAgIAkoMTA0LCA2NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJOTIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRHJpdmVuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMyNDgwMTBCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MzUNCi0JCQlsb2NhdGlvbiAgIAkoMTA0LCA3MTEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk5NDQpDQotCQkgICAgd2lkdGggICAgICAJOTM4DQotCQkgICAgaGVpZ2h0ICAgICAJMzIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI1MzAyNkYiDQotCQkgICAgY2xpZW50ICAgICAJQDQzNQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0MjUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDA2LCA2MzcpDQotCQkJKDQwNiwgNDE5KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDYsIDYzNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDA2LCA0MTkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBANDM3DQotCQkgICAgbG9jYXRpb24gICAJKDM1MywgMTIxOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzNDA4MDFGRiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXN0aW5hdGlvbiIgQDQzOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ3LCA0MTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM5DQotCQkJCVBhcmVudF9WaWV3IAlANDM4DQotCQkJCWxvY2F0aW9uICAgCSg1MDIsIDE0MzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc3RpbmF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0OTgxNw0KLQkJCQloZWlnaHQgICAgIAkxNDkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjM0MDkwMDUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDM3DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MzINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTMsIDEyMTgpDQotCQkJCSgzNTMsIDE0NzYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCAxMjE4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUzLCAxNDc2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDANCi0JCQkJUGFyZW50X1ZpZXcgCUA0MzgNCi0JCQkJbG9jYXRpb24gICAJKDMxNiwgMTQyMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzkwOTg0DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJiZWFuIiBANDQxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDcsIDQxOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDINCi0JCQkJUGFyZW50X1ZpZXcgCUA0NDENCi0JCQkJbG9jYXRpb24gICAJKDQ0MCwgOTk4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitiZWFuIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1NzE0Mw0KLQkJCQloZWlnaHQgICAgIAk4Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzQwOTAwNUMiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1MywgMTIxOCkNCi0JCQkJKDM1MywgOTYwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgMTIxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgOTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NDENCi0JCQkJbG9jYXRpb24gICAJKDI5NiwgMTAwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODQ1ODY1DQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBANDQ0DQotCQkgICAgbG9jYXRpb24gICAJKDk1MSwgMzQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyOTgyMDFFMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlRGVzdGluYXRpb24iIEA0NDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ1NCwgLTQ2MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NDUNCi0JCQkJbG9jYXRpb24gICAJKDExNzksIDI5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM5Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZURlc3RpbmF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQyNDE3Ng0KLQkJCQloZWlnaHQgICAgIAk0OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjk4MzAyNzAiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk1MSwgMzQwKQ0KLQkJCQkoMTM5MywgMzQwKQ0KLQkJCQkoMTM5MywgNDM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MSwgMzQwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5MywgNDM4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NDUNCi0JCQkJbG9jYXRpb24gICAJKDEzNDAsIDM4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDQ0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDU0LCAtNDYwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyOTgzMDI3QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0NA0KLQkJCSAgICBzdXBwbGllciAgIAlANDM1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTUxLCAzNDApDQotCQkJCSg3MDgsIDM0MCkNCi0JCQkJKDcwOCwgNjM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MSwgMzQwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA4LCA2MzgpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEA0NDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3NywgNTg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTYyRDlFMDI1NCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdpbmdUeXBlIiBANDUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODAsIC0yMTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUxDQotCQkJCVBhcmVudF9WaWV3IAlANDUwDQotCQkJCWxvY2F0aW9uICAgCSgxMTI5LCA1NTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2luZ1R5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuMjQ1NDU1DQotCQkJCWhlaWdodCAgICAgCTMzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTYyRDlGMDE4MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDMzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA3NywgNTg0KQ0KLQkJCQkoMTI5NCwgNTg0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNzcsIDU4NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTQsIDU4NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUyDQotCQkJCVBhcmVudF9WaWV3IAlANDUwDQotCQkJCWxvY2F0aW9uICAgCSgxMjQzLCA2MzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2ODE4Mg0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjIiIEA0NTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDU4MCwgLTIxNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2MkQ5RjAxOTciDQotCQkJICAgIGNsaWVudCAgICAgCUA0NDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNzcsIDU4NCkNCi0JCQkJKDkxNCwgNTg0KQ0KLQkJCQkoOTE0LCA2MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA3NywgNTg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTE0LCA2MzgpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEA0NTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0OTAsIDY4NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0NTQNCi0JCQlsb2NhdGlvbiAgIAkoMjM2MiwgNTU4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQ1NA0KLQkJCWxvY2F0aW9uICAgCSgyMzYyLCA2NzMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODUpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZyIgQDQ1NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg0OCwgMTM4NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0NTUNCi0JCQlsb2NhdGlvbiAgIAkoMTc1MiwgMTMxMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFjdGl2YXRpb25Db25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBN0UwMTMxIg0KLQkJICAgIHdpZHRoICAgICAgCTIxMA0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ2IiBANDU2DQotCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE3MTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBRTIwMTVEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbmZpZ1Byb3BlcnRpZXMiIEA0NTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5NiwgMzI2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjI5OSwgMTc3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29uZmlnUHJvcGVydGllcyINCi0JCQkJcGN0RGlzdCAgICAJMC41ODU0ODANCi0JCQkJaGVpZ2h0ICAgICAJNjMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBRTIwMzMzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDU2DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MzQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDQ0LCAxNzEzKQ0KLQkJCQkoMjQ3OSwgMTcxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQ0LCAxNzEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ3OSwgMTcxMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU5DQotCQkJCVBhcmVudF9WaWV3IAlANDU3DQotCQkJCWxvY2F0aW9uICAgCSgyMzIyLCAxNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NDExNjQNCi0JCQkJaGVpZ2h0ICAgICAJNTgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ3IiBANDYwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDU2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTYsIDMyNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUFFMjAzMzUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NTYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNDQsIDE3MTMpDQotCQkJCSgxODQ3LCAxNzEzKQ0KLQkJCQkoMTg0NywgMTQ3NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQ0LCAxNzEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NywgMTQ3NSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OCIgQDQ2MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAxMTQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQjA1MDE0OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhY3RpdmF0aW9uQ29uZmlnIiBANDYyDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDM0NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJbG9jYXRpb24gICAJKDE1NzQsIDEzMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2FjdGl2YXRpb25Db25maWciDQotCQkJCXBjdERpc3QgICAgCTAuNzM3NjMxDQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQjA3MDBBMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ2MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDU1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxOCwgMTE0NSkNCi0JCQkJKDEzMTgsIDEzNjIpDQotCQkJCSgxNzQzLCAxMzYyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMTgsIDExNDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQzLCAxMzYyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJbG9jYXRpb24gICAJKDE2NzksIDE0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDkiIEA0NjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NjENCi0JCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzQ1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQjA3MDBBNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ2MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDM1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxOCwgMTE0NSkNCi0JCQkJKDEzMTgsIDc4NykNCi0JCQkJKDEwMzMsIDc4NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE4LCAxMTQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzMywgNzg3KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBANDY2DQotCQkgICAgbG9jYXRpb24gICAJKDE5NDksIDgwNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUFBRDAwQUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBANDY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDY2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDEsIC01ODApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY4DQotCQkJCVBhcmVudF9WaWV3IAlANDY3DQotCQkJCWxvY2F0aW9uICAgCSgyMjAwLCA2NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42OTEwMjMNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBQUQwM0E1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDY2DQotCQkJICAgIHN1cHBsaWVyICAgCUA0NTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTQ5LCA4MDcpDQotCQkJCSgxOTQ5LCA3MTgpDQotCQkJCSgyMzUzLCA3MTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk0OSwgODA3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1MywgNzE4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjkNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NjcNCi0JCQkJbG9jYXRpb24gICAJKDIyOTAsIDc3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODcyNjUxDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDQ3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxLCAtNTgwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQUFEMDNDRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ2Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDU1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk0OSwgODA3KQ0KLQkJCQkoMTk0OSwgMTI5OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQ5LCA4MDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQ5LCAxMjk5KSkpKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2oyZWUubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGFhNGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2oyZWUubWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTgzNCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JICAgIHZhbHVlICAgICAgCSIiKSkNCi0gICAgcXVpZCAgICAgICAJIjM5RUUwRTdGMDE0QyINCi0gICAgZW5mb3JjZUNsb3N1cmVBdXRvTG9hZCAJRkFMU0UNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlGQUxTRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzOUVFMEU3RjAxNEUiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUVFMEU4MDAxRjkiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFRTBFN0YwMTREIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjM5RUUwRTdGMDE0RiINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjbGllbnQiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY2xpZW50LmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwMjgwNzAwQzAiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYXBwbGljYXRpb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcYXBwbGljYXRpb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzAzMDA4MDE0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY29tbW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwOEYwRjAzOEQiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWpiIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGVqYnNjaGVtYS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzc4MEUyNzIwMzJEIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInRhZ2xpYiINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx0YWdsaWJfMV8xLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOUE2QkE1RjAwNzAiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid2ViYXBwbGljYXRpb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcd2ViYXBwbGljYXRpb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzA3NkQ2MDNERCIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqY2EiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcamNhMV8wLmNhdCINCi0JCXF1aWQgICAgICAgCSIzQzYwOTA0MjAwQkIiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NjbGllbnQiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcd2Vic2VydmljZXNfY2xpZW50XzFfMC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0U0RDJGNEIwMkFBIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpzcCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxqc3BfMl8wLmNhdCINCi0JCXF1aWQgICAgICAgCSIzRTRENEY2OTAzNkIiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3Njb21tb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcd3Njb21tb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNFMTVCNEMwMDE2RiIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RkIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdzZGQuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNFMTA5RUFEMDMxOSIpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RUUwRTgwMDFGQSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAxDQotCQkJbG9jYXRpb24gICAJKDIyNSwgMjE4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkgICAgbG9jYXRpb24gICAJKDgxLCAxMzQpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMg0KLQkJCWxvY2F0aW9uICAgCSg2ODcsIDIyMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzMsIDE4NykNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiamF2YSIpDQotCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzMsIDEzNykNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM2NTQ5RjJDMDA0RSINCi0JCQl3aWR0aCAgICAgIAkzMjANCi0JCQloZWlnaHQgICAgIAkxODIpDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6Y2xpZW50IiBAMw0KLQkJCWxvY2F0aW9uICAgCSgxMTA5LCAyMzEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTY1LCAxNDcpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImNsaWVudCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzAyODA3MDBDMCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb24iIEA0DQotCQkJbG9jYXRpb24gICAJKDE1NDMsIDIyMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzk5LCAxMzgpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImFwcGxpY2F0aW9uIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzhDMDMwMDgwMTRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpjb21tb24iIEA1DQotCQkJbG9jYXRpb24gICAJKDE5NjUsIDIxOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMzQpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImNvbW1vbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzA4RjBGMDM4RCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWpiIiBANg0KLQkJCWxvY2F0aW9uICAgCSgxMTg5LCA2MDkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgNTc0KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJlamIiKQ0KLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgNTI0KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzc4MEUyNzIwMzJEIg0KLQkJCXdpZHRoICAgICAgCTMyMA0KLQkJCWhlaWdodCAgICAgCTE4MikNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp0YWdsaWIiIEA3DQotCQkJbG9jYXRpb24gICAJKDE2MjEsIDYxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDc3LCA1MjgpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJInRhZ2xpYiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QTZCQTVGMDA3MCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb24iIEA4DQotCQkJbG9jYXRpb24gICAJKDMwMywgNjE0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1OSwgNTMwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3ZWJhcHBsaWNhdGlvbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzA3NkQ2MDNERCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amNhIiBAOQ0KLQkJCWxvY2F0aW9uICAgCSg3MzcsIDYyNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTMsIDU0MykNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiamNhIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0M2MDkwNDIwMEJCIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudCIgQDEwDQotCQkJbG9jYXRpb24gICAJKDIwMDksIDYxOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2NSwgNTM0KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2NsaWVudCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNFNEQyRjRCMDJBQSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3Njb21tb24iIEAxMQ0KLQkJCWxvY2F0aW9uICAgCSgzMjUsIDkzNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxLCA4NTApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIndzY29tbW9uIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0UxNUI0QzAwMTZGIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RkIiBAMTINCi0JCQlsb2NhdGlvbiAgIAkoNzUwLCA5NDApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTINCi0JCQkgICAgbG9jYXRpb24gICAJKDYwNiwgODU2KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0UxMDlFQUQwMzE5Ig0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzOUVFMEU3RjAxNEYiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUVFMEU4MDAxRjgiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKQ0KLQljYXRlZ29yeSAgIAkiTG9naWNhbCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiNDMwNzg2MUUwMjM4IikNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzOUVFMEU3RjAxNTAiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjM5RUUwRTdGMDE1MiINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRlbnRLaW5kIiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiQ29udGVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiRW1wdHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQotCQkJdmFsdWUgICAgICAJOCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAktMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZUJhY2t1cEZpbGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIzMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWwiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmljRm9ybWFsU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRpb25NYXBwaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NpYXRpb25NYXBwaW5nU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk9iamVjdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGlvbk1hcHBpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJOYW1lIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5jb21wbGV0ZVR5cGVTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwiPSINCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk1peGluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhc2siDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmtub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiS25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluZGVmaW5pdGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFVzZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTIyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTIzMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJpY0Zvcm1hbFNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZyINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jaWF0aW9uTWFwcGluZ1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPYmplY3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRpb25NYXBwaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTmFtZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMikpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIgMTAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1EaXJlY3Rpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW4iDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW5vdXQiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkib3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJIk5vbmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRlcGxveSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNIg0KLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcY2hhcnNldHMuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcamNlLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGpzc2UuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxccnQuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcc3VucnNhc2lnbi5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxleHRcXGRuc25zLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGV4dFxcbGRhcHNlYy5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxleHRcXGxvY2FsZWRhdGEuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxzdW5qY2VfcHJvdmlkZXIuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcc2VjdXJpdHlcXGxvY2FsX3BvbGljeS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxzZWN1cml0eVxcVVNfZXhwb3J0X3BvbGljeS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGxpYlxcZHQuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxsaWJcXGh0bWxjb252ZXJ0ZXIuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxsaWJcXHRvb2xzLmphciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGdW5kYW1lbnRhbFR5cGUiDQotCQkJdmFsdWUgICAgICAJImJvb2xlYW47IGNoYXI7IGJ5dGU7IHNob3J0OyBpbnQ7IGxvbmc7IGZsb2F0OyBkb3VibGU7IEJvb2xlYW47IEJ5dGU7IENoYXJhY3RlcjsgRG91YmxlOyBGbG9hdDsgSW50ZWdlcjsgTG9uZzsgT2JqZWN0OyBTaG9ydDsgU3RyaW5nOyBTdHJpbmdCdWZmZXI7IFZvaWQ7IGphdmEubWF0aC5CaWdEZWNpbWFsOyBqYXZhLm1hdGguQmlnSW50ZWdlcjsgamF2YS5zcWwuRGF0ZTsgamF2YS5zcWwuVGltZTsgamF2YS5zcWwuVGltZXN0YW1wOyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0O2phdmEudXRpbC5BYnN0cmFjdE1hcDsgamF2YS51dGlsLkFic3RyYWN0U2VxdWVudGlhbExpc3Q7IGphdmEudXRpbC5BYnN0cmFjdFNldDsgamF2YS51dGlsLkFycmF5TGlzdDsgamF2YS51dGlsLkFycmF5czsgamF2YS51dGlsLkJpdFNldDsgamF2YS51dGlsLkNhbGVuZGFyOyBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7IGphdmEudXRpbC5EYXRlOyBqYXZhLnV0aWwuRGF0ZTsgamF2YS51dGlsLkRpY3Rpb25hcnk7IGphdmEudXRpbC5FdmVudE9iamVjdDsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOyBqYXZhLnV0aWwuSGFzaE1hcDsgamF2YS51dGlsLkhhc2hTZXQ7IGphdmEudXRpbC5IYXNodGFibGU7IGphdmEudXRpbC5MaW5rZWRMaXN0OyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuTG9jYWxlOyBqYXZhLnV0aWwuT2JzZXJ2YWJsZTsgamF2YS51dGlsLlByb3BlcnRpZXM7IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuUmFuZG9tOyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7IGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZTsgamF2YS51dGlsLlN0YWNrOyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOyBqYXZhLnV0aWwuVGltZXI7IGphdmEudXRpbC5UaW1lclRhc2s7IGphdmEudXRpbC5UaW1lWm9uZTsgamF2YS51dGlsLlRyZWVNYXA7IGphdmEudXRpbC5UcmVlU2V0OyBqYXZhLnV0aWwuVmVjdG9yOyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JcXVpZCAgICAgICAJIjM5RUUwRTdGMDE1MSIpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2oyZWVfY29kZWdlbi5zY3JhcGJvb2sgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlX2NvZGVnZW4uc2NyYXBib29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA1N2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2oyZWVfY29kZWdlbi5zY3JhcGJvb2sKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vL1dlYlNwaGVyZSBDb25maWcgTW9kZWwgZ2VuZXJhdGlvbg0KLVN0cmluZ1tdIGFyZ3MgPSB7IlIyWCIsIA0KLSIoLWZpbGUiLCAiajJlZS5tZGwiLCANCi0iLXhtaURpciIsICJ1bWx4bWkiLCANCi0iLW5hbWV1dWlkIiwgInRydWUiLCANCi0iLWV4dGVuc2lvbnMiLCAidHJ1ZSIsDQotIi1wYXRoTWFwIiwgIkVDTElQU0VfUkVTT1VSQ0VTPUM6L2Rldi9lY2xpcHNlMzUvSURFL3Byb2plY3RfcmVzb3VyY2VzKSJ9Ow0KLS8vU3RyaW5nW10gYXJncyA9IHsiPyJ9Ow0KLWNvbS5pYm0uZXRvb2xzLmphdmEuaW5pdC5KYXZhSW5pdC5leGVjdXRlVG9vbGtpdChhcmdzKQ0KLQ0KLS8vIENvcHkgZmlsZXMgdXAgb25lIGRpciB0aGVuIGV4ZWN1dGUuLi4NCi0NCi1TdHJpbmdbXSBhcmdzID0gew0KLSItbW9kZWxQcmVmaXgiLCJKYXZhUmVmIiwiamF2YSIsDQotIi1tb2RlbCIsICJqMmVlLnhtbCIsIA0KLSItZGlyIiwgIkM6L2Rldi9lY2xpcHNlMzUvSURFL3Byb2plY3RfcmVzb3VyY2VzL2VUb29scyBFSkIgTGlicmFyaWVzL3NyYyIsIA0KLSItcGFja2FnZSIsICJjb20uaWJtLmV0b29scyIsIA0KLS8vIExvZ2ljYWwgbmFtZXMgb2YgbGV2ZWwtMSBwYWNrYWdlcyB3aXRoaW4gdGhlIG1vZGVsIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkLiAgTmVzdGluZyBub3Qgc3VwcG9ydGVkLg0KLSItZ2VuQWRhcHRlcnMiLCANCi0iLWdlblBhY2thZ2UiLCAiY29tbW9uIiwgImNvbS5pYm0uZXRvb2xzLmoyZWUiLCJjb21tb24iLCJjb21tb24ueG1pIiwNCi0iLWdlblBhY2thZ2UiLCAiZWpiIiwiY29tLmlibS5ldG9vbHMiLCAiZWpiIiwiZWpiLnhtaSIsDQotIi1nZW5QYWNrYWdlIiwgImNsaWVudCIsImNvbS5pYm0uZXRvb2xzIiwiY2xpZW50IiwiY2xpZW50LnhtaSIsDQotIi1nZW5QYWNrYWdlIiwgImFwcGxpY2F0aW9uIiwiY29tLmlibS5ldG9vbHMiLCJhcHBsaWNhdGlvbiIsImFwcGxpY2F0aW9uLnhtaSIsDQotIi1nZW5QYWNrYWdlIiwgIndlYmFwcGxpY2F0aW9uIiwiY29tLmlibS5ldG9vbHMiLCJ3ZWJhcHBsaWNhdGlvbiIsIndlYmFwcGxpY2F0aW9uLnhtaSIsDQotIi1nZW5QYWNrYWdlIiwgInRhZ2xpYiIsImNvbS5pYm0uZXRvb2xzIiwidGFnbGliIiwidGFnbGliLnhtaSIsDQotIi1yZWZQYWNrYWdlIiwgImVjb3JlIiwgImNvbS5pYm0uZXRvb2xzLmVtZiIsIA0KLSItNCJ9Ow0KLWNvbS5pYm0uZXRvb2xzLmphdmEuaW5pdC5KYXZhSW5pdC5leGVjdXRlVTJNKGFyZ3MpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvamF4cnBjbWFwLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2pheHJwY21hcC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTFhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvamF4cnBjbWFwLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MjggKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpheHJwY21hcCIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJKYXhycGNtYXAiKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImpheHJwY21hcC54bWkiKSkpCi0gICAgcXVpZCAgICAgICAJIjNFMTYxRkE5MDI2NiIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiSmF2YVdTRExNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIxQzMwMTY4IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBwYWNrYWdlIG5hbWVzIGFuZCBYTUwgbmFtZXNwYWNlcywgCi18V1NETCByb290IHR5cGVzIGFuZCBKYXZhIGFydGlmYWN0cywgYW5kIHRoZSBzZXQgb2YgbWFwcGluZ3MgZm9yIHNlcnZpY2VzLgotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI2QTgwMEY0IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBhY2thZ2VNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIxREIwMzYwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcGFja2FnZS1tYXBwaW5nIGluZGljYXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGphdmEtcGFja2FnZS1uYW1lIGFuZCBYTUwgbmFtZXNwYWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LgotfAotfFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjZCMTAxQTEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhY2thZ2VUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI4M0I1MDE3NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgotfAotfFVzZWQgaW46IHBhY2thZ2UtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCODNDMTAwRDEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVhNTFR5cGVNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIxRUIwMTZEIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgamF2YS14bWwtdHlwZS1tYXBwaW5nIGVsZW1lbnQgY29udGFpbnMgYSBjbGFzcy10eXBlIHRoYXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCBRTmFtZSBvZiB0aGUgWE1MIHJvb3QgdHlwZSwgdGhlIFdTREwgdHlwZSBzY29wZSB0aGUgUU5hbWUgYXBwbGllcyB0byBhbmQgdGhlIHNldCBvZiB2YXJpYWJsZSAKLXxtYXBwaW5ncyBmb3IgZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLgotfAotfFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjZCRTAwNjgiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNsYXNzVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCODRENTAwRUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgY2xhc3MtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MuCi18Ci18VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicW5hbWVTY29wZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCODUyODAyOTAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETCBlbGVtZW50IHR5cGUgaXQgYXBwbGllcyB0by4gVGhlIHZhbHVlIG9mIHFuYW1lLXNjb3BlIG1heSBiZSBzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4KLXwKLXxVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm9ueW1vdXNUeXBlUW5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y5RUZDNEMwMEZGIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkV4Y2VwdGlvbk1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjIwMDAxQzYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBleGNlcHRpb24tbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24gdHlwZXMgYW5kIHRoZSB3c2RsIGZhdWx0cy4KLXwKLXxUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUKLXxtYXBwaW5nIGJldHdlZW4gYSBtZXRob2QgYW5kIGFuIG9wZXJhdGlvbiB3aGljaCBwcm92aWRlcyB0aGUgbWFwcGluZyBjb250ZXh0LgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNkU0MDEwQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjZXB0aW9uVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOEI5NjAyRjEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZXhjZXB0aW9uLXR5cGUgZWxlbWVudCBkZWZpbmVzIEphdmEgdHlwZSBvZiB0aGUgZXhjZXB0aW9uLiBJdCBtYXkgYmUgYSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbi4KLXwKLXxJdCBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi18Ci18VXNlZCBpbjogZXhjZXB0aW9uLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsTWVzc2FnZVBhcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNGNzVFNjVGMDMwMyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMjJEMDA5QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGhvdyBhIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG1hcHMgdG8gYSBXU0RMIHNlcnZpY2UuCi18Ci18VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLXwKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOUI2NzAzMjUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjJCQzIwMEREIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNkVCMDFBQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmljZUludGVyZmFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOUQzRjAzM0MiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlLiBGb3Igc3RhdGljIHNlcnZpY2VzLCBpdCBpcyBqYXZheC54bWwucnBjLlNlcnZpY2UgaW50ZXJmYWNlLiBGb3IgZ2VuZXJhdGVkIHNlcnZpY2UsIGl0IHdvdWxkIGJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIG5hbWUuCi18Ci18VGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotfAotfFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjIzODAyNTkiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGRlZmluZXMgYSB0dXBsZQotfHRvIHNwZWNpZnkgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIFdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4KLXwKLXxBbiBpbnRlcmZhY2UgbWF5IGJlIG1hcHBlZCB0byBhIHBvcnQtdHlwZSBhbmQgYmluZGluZyBtdWx0aXBsZSB0aW1lcy4gVGhpcyBoYXBwZW5zIHJhcmVseS4KLXwKLXxVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNUI5QzkyMDJFRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MkJDMjAwREQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3MTMwMkY5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QjlGQzUwMURFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi18Ci18VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiUGFja2FnZVR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjI2OTAwRjciCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzFCMDA1QiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFja2FnZVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUIyMUMwMjNBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkNsYXNzVHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMjdDMDA1RCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3MjEwMjRFIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjbGFzc1R5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUIyNjYwMEQzIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlJvb3RUeXBlUW5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjI5QjAwQzMiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSByb290LXR5cGUtcW5hbWUgaWRlbnRpZmllcyB0aGUgV1NETCBRTmFtZSBvZiBhbiBYTUwgdHlwZS4KLXwKLXxVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzQ0QTAyN0MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiUW5hbWVTY29wZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMkFBMDI3MyIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3MzIwMDVEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxbmFtZVNjb3BlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCMkFBMDNFMyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJWYXJpYWJsZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjJCOTAzM0IiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB2YXJpYWJsZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBhIEphdmEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgSmF2YUJlYW5zIHByb3BlcnR5IHRvIGFuIFhNTCBlbGVtZW50IG5hbWUgb2YgYW4gWE1MIHJvb3QgdHlwZS4gSWYgdGhlIGRhdGEtbWVtYmVyIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZSBpcyBhIHB1YmxpYyBkYXRhIG1lbWJlci4gIElmIGRhdGEtbWVtYmVyCi18aXMgbm90IHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuCi18Ci18VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjczOTAwNDgiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFWYXJpYWJsZU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Qjg2MUQwMzQ2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGphdmEtdmFyaWFibGUtbmFtZSBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgcHVibGljIGRhdGEgbWVtYmVyIG9yICBKYXZhQmVhbnMgcHJvcGVydHkgd2l0aGluIGEgSmF2YSBjbGFzcy4gCi18Ci18VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZwotfAotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInhtbEVsZW1lbnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI4NjMwMDAzNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB4bWwtZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyBuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIFdTREwgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuCi18Ci18VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRhdGFNZW1iZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3NTE4MDI5QyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInhtbEF0dHJpYnV0ZU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NUU5MjkwMEE3IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ4bWxXaWxkY2FyZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NUVBMDIwMkIyIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJFeGNlcHRpb25UeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyRDMwMUUyIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjczRjAxN0QiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUI1NzEwMjJEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIldTRExNZXNzYWdlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyRTAwMkJEIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1tZXNzYWdlICBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4KLXwKLXxVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3MjJCMDNDQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJTdGF0aWMiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRFeHRlbmRzIgotCQkgICAgdmFsdWUgICAgICAJIiIpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkSW1wbGVtZW50cyIKLQkJICAgIHZhbHVlICAgICAgCSIiKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJICAgIHZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkpCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjJFQzAxQTEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlciB0aGF0IGNvbXBsZXhUeXBlIGVsZW1lbnQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGEgSmF2YSBleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZiBpbmhlcml0ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5LgotfAotfFVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2Mjc0RjAyM0QiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVZhcmlhYmxlTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMzVDMDI2MiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3NTYwMzlCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhVmFyaWFibGVOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCMzYyMDI5QSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJYTUxFbGVtZW50TmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyM0ExMDM5RCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3NjIwMzY2IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ4bWxFbGVtZW50TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QjM3RDAzOUIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRWxlbWVudE5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjNCOTAwNkIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBlbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgY29tcGxleFR5cGUgZWxlbWVudCBuYW1lIGF0dHJpYnV0ZSB2YWx1ZS4KLXwKLXxVc2VkIGluOiBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzY4MDExNSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGV4dCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QjVBMjAyRDQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETFNlcnZpY2VOYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI0MjkwM0FEIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1zZXJ2aWNlLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHNlcnZpY2UgbmFtZSBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBzZXJ2aWNlLgotfAotfFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzJBNzAxNDMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiUG9ydE1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjQzRTAzQTIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUgYXR0cmlidXRlIHRvIHRoZSBKYXZhIG5hbWUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZCBnZXQ8amF2YS1uYW1lPi4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2Mjc3MjAzMEQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI5RUM3MDJFQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwb3J0LW5hbWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG5hbWUgYXR0cmlidXRlIG9mIGEgV1NETCBwb3J0IGVsZW1lbnQuCi18Ci18VXNlZCBpbjogcG9ydC1tYXBwaW5nCi18Ci0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVBvcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI5RUNFMDA3NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBqYXZhLXBvcnQtbmFtZSBlbGVtZW50IGlzIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBwb3J0IG5hbWUgaW4gSmF2YS4gIEl0IGlzIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZAotfGdldDxqYXZhLXBvcnQtbmFtZT4uCi18Ci18VXNlZCBpbjogcG9ydC1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKYXZhUG9ydE5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjRBMzAxQzkiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzc4MDA2MyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVBvcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlDMDk4MDBFOSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJXU0RMUG9ydFR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjRFQjAzMjYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlCi18YnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgcG9ydCB0eXBlLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzJDNDAwODMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETEJpbmRpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjUwNjAyQTEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB3c2RsLWJpbmRpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIGJpbmRpbmcKLXxieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzM3QTAwMzMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNTE0MDEyNCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIEphdmEgbWV0aG9kcyB0byBvcGVyYXRpb25zICh3aGljaCBhcmUgbm90IHVuaXF1ZWx5IHF1YWxpZmllZCBieSBxbmFtZXMpLgotfAotfFRoZSB3c2RsLW9wZXJhdGlvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3J0VHlwZSBhbmQgYmluZGluZyBpbiB3aGljaCB0aGlzIGRlZmluaXRpb24gaXMgZW1iZWRkZWQgd2l0aGluLiBTZWUgdGhlIGRlZmluaXRpb25zIGZvciBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGFuZCAKLXxzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIHRvIGFjcXVpcmUgdGhlIHByb3BlciBjb250ZXh0LiBUaGUgd3JhcHBlZC1lbGVtZW50IGluZGljYXRvciBzaG91bGQgb25seSBiZSBzcGVjaWZpZWQgd2hlbiBhIFdTREwgbWVzc2FnZSB3cmFwcyBhbiBlbGVtZW50IHR5cGUuICBUaGUgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyBpcyBub3Qgc3BlY2lmaWVkIGZvciBvbmUtd2F5IG9wZXJhdGlvbnMuCi18Ci18VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3OEEwMzFBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhTWV0aG9kTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTE1RDAwNzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgamF2YS1tZXRob2QtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBKYXZhIG1ldGhvZCB3aXRoaW4gYW4gaW50ZXJmYWNlLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBMTY1MDJGOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB3c2RsLW9wZXJhdGlvbiBlbGVtZW50IGRlZmluZXMgYW4gb3BlcmF0aW9uIHdpdGhpbiBhIFdTREwgZG9jdW1lbnQuIEl0IG11c3QgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIGEgcG9ydCB0eXBlLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3cmFwcGVkRWxlbWVudCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0Njc1QkYwMjc0IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKYXZhTWV0aG9kTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNTI5MDBCRSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3OTAwMzBFIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhTWV0aG9kTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QzMxMTAxMjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETE9wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNTM2MDNDOSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3OTcwMzQwIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlDMkI0MDE5QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNTZBMDE3MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuCi18Ci18VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3QTcwM0JBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbVBvc2l0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBMjYwMDJDMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwYXJhbS1wb3NpdGlvbiBlbGVtZW50IGRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIGEgcGFyYW1ldGVyIHdpdGhpbiBhIEphdmEgbWV0aG9kLiAgSXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHN0YXJ0aW5nIGZyb20gMC4KLXwKLXxVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTI2OTAzNjYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcGFyYW0tdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gSXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcy4KLXwKLXxVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotfAotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETFJldHVyblZhbHVlTWFwcGluZyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiU3RhdGljIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkRXh0ZW5kcyIKLQkJICAgIHZhbHVlICAgICAgCSIiKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEltcGxlbWVudHMiCi0JCSAgICB2YWx1ZSAgICAgIAkiIikKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCSAgICB2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpKQotCSAgICBxdWlkICAgICAgIAkiM0UxNjI1ODcwMjQzIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyAgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGZvciB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLiBJdCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQgaXRzIHBhcnQuICBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkgCi18aWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLiBUaGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBpcyBub3QKLXxzcGVjaWZpZWQgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIG9yIE9VVCBwYXJhbWV0ZXJzLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0FEMDE3NCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWV0aG9kUmV0dXJuVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QkE0RjYwMUU5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIG1ldGhvZC1yZXR1cm4tdmFsdWUgIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHZvaWQgdHlwZSBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSB0eXBlLgotfAotfFVzZWQgaW46IHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsTWVzc2FnZVBhcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBNDFEMDJCMiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudAotfG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLXwKLXxVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiUGFyYW1Qb3NpdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNUNGMDJGNiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3QjMwMEQyIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbVBvc2l0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlDNDExMDA1OSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJQYXJhbVR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjVFMjAwODUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0JDMDFDNCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlDNDFBMDNDMiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJXU0RMTWVzc2FnZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjVGQTAzOEIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSB3c2RsLW1lc3NhZ2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5IAotfGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4KLXwKLXxUaGUgcGFyYW1ldGVyLW1vZGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBtYXBwaW5nIHdpbGwgYmUgSU4sIE9VVCwgb3IgSU5PVVQuLiAgVGhlIHByZXNlbmNlIG9mIHRoZSBzb2FwLWhlYWRlcgotfGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBtYXBwZWQgdG8gYSBzb2FwIGhlYWRlciBvbmx5LiBXaGVuIGFic2VudCwgaXQgbWVhbnMgdGhhdCB0aGUgd3NkbC1tZXNzYWdlIGlzIG1hcHBlZCB0byBhIEphdmEgcGFyYW1ldGVyLiBUaGUgc29hcCBoZWFkZXJzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKLXxwcm92aWRlZCBpbiB0aGUgbWFwcGluZy4KLXwKLXxVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3QzMwMDBCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsTWVzc2FnZVBhcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBMkFEMDE5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudAotfG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLXwKLXxVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlck1vZGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QkEzMkYwMUM0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBhcmFtZXRlci1tb2RlICBlbGVtZW50IGRlZmluZXMgdGhlIG1vZGUgb2YgdGhlIHBhcmFtZXRlci4gSXQgY2FuIGhhdmUgb25seSB0aHJlZSB2YWx1ZXMsIElOLCBPVVQsIElOT1VULgotfAotfFVzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic29hcEhlYWRlciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0Njc2NUIwMENCIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJXU0RMTWVzc2FnZVBhcnROYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI2MjUwMzk0IgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjdEQTAxQzUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndzZGxNZXNzYWdlUGFydE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUI0QjMwMDRDIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBhcmFtZXRlck1vZGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjY0ODAwQzEiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0UxMDE2MSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1ldGVyTW9kZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QjRDQjAxOTAiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kUmV0dXJuVmFsdWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjY3QTAyRjAiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0YwMDJDQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWV0aG9kUmV0dXJuVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUMzMzYwMTE3IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkludGVyZmFjZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MkJDMjAwREQiCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0UxODhCMEUwMzcxIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYWNrYWdlTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODhCMTAwMkFDIgotCQkgICAgbGFiZWwgICAgICAJInBhY2thZ2VNYXBwaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6UGFja2FnZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxREIwMzYwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSIxIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4QjEwMDJCNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OEVBRjAxRjYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJvb3RUeXBlUW5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODhFQjAwM0E2IgotCQkgICAgbGFiZWwgICAgICAJInJvb3RUeXBlUW5hbWUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlJvb3RUeXBlUW5hbWUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyOUIwMEMzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29uc3RyYWludHMgCSIyIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4RUIwMDNBOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVhNTFR5cGVNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUVCMDE2RCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OEVDNTAwODQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInZhcmlhYmxlTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODhFQzcwMjcxIgotCQkgICAgbGFiZWwgICAgICAJInZhcmlhYmxlTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlZhcmlhYmxlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJCOTAzM0IiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIjQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODhFQzcwMjczIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhWE1MVHlwZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxRUIwMTZEIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiIKLQkgICAgcXVpZCAgICAgICAJIjNFMTg5MTk0MDBCOSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiamF2YVhNTFR5cGVNYXBwaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4OTE5NTAzODIiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YVhNTFR5cGVNYXBwaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVhNTFR5cGVNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUVCMDE2RCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMiIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4OTE5NTAzODQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFXU0RMTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBxdWlkICAgICAgIAkiM0UxOEExQUUwMEVCIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJleGNlcHRpb25NYXBwaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTFBRjAwMUEiCi0JCSAgICBsYWJlbCAgICAgIAkiZXhjZXB0aW9uTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkV4Y2VwdGlvbk1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMDAwMUM2IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSIzIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5IgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBMUFGMDAxQyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIgotCSAgICBxdWlkICAgICAgIAkiM0UxOEExQjUwMTlGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTFCNjAyMEUiCi0JCSAgICBsYWJlbCAgICAgIAkid3NkbE1lc3NhZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMiIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExQjYwMjEwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpFeGNlcHRpb25NYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjAwMDFDNiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIgotCSAgICBxdWlkICAgICAgIAkiM0UxOEExQkIwM0UyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBMUJEMDAzNyIKLQkJICAgIGxhYmVsICAgICAgCSJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkVDMDFBMSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExQkQwMDM5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpFeGNlcHRpb25NYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjAwMDFDNiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0IgotCSAgICBxdWlkICAgICAgIAkiM0UxOEExRDgwMDY2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlbGVtZW50TmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExREEwMDIzIgotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnROYW1lcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6RWxlbWVudE5hbWUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIzQjkwMDZCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTFEQTAwMjUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyRUMwMUExIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTU0MzAyNEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImludGVyZmFjZU1hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTQ0MDMyMiIKLQkJICAgIGxhYmVsICAgICAgCSJpbnRlcmZhY2VNYXBwaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MkJDMjAwREQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIjQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3IgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTQ0MDMyNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4IgotCSAgICBxdWlkICAgICAgIAkiM0UxOEE1NjgwMDk2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsU2VydmljZU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1NjgwM0FEIgotCQkgICAgbGFiZWwgICAgICAJIndzZGxTZXJ2aWNlTmFtZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETFNlcnZpY2VOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNDI5MDNBRCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMiIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1NjgwM0FGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIyRDAwOUIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBNTc1MDA0RSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicG9ydE1hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTc2MDAxRCIKLQkJICAgIGxhYmVsICAgICAgCSJwb3J0TWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlBvcnRNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNDNFMDNBMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1NzYwMDI3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIyRDAwOUIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBNTgzMDIyRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAid3NkbFBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTg3MDE0RCIKLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsUG9ydFR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExQb3J0VHlwZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjRFQjAzMjYiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjIiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTg3MDE1NyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIzODAyNTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBNUJEMDM2RCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAid3NkbEJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1QkUwMzhEIgotCQkgICAgbGFiZWwgICAgICAJIndzZGxCaW5kaW5nIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMQmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjUwNjAyQTEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjMiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1IgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNUJFMDM5NyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIzODAyNTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBNUUzMDM1MSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1RTUwMkQyIgotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTE0MDEyNCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiNCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEE1RTUwMkRDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjM4MDI1OSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4IgotCSAgICBxdWlkICAgICAgIAkiM0UxOUEwOUUwMDVEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUEwOUYwMDRBIgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1NkEwMTcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSI0IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTA5RjAwNEMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MTQwMTI0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAiCi0JICAgIHF1aWQgICAgICAgCSIzRTE5QTBBMzAyOEEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUEwQTQwMzU0IgotCQkgICAgbGFiZWwgICAgICAJIndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExSZXR1cm5WYWx1ZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1ODcwMjQzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29uc3RyYWludHMgCSI1IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTBBNDAzNUUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MTQwMTI0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiCi0JICAgIHF1aWQgICAgICAgCSIzRTE5QTEyMTAwOEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndzZGxNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlBMTIyMDAxNyIKLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsTWVzc2FnZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyRTAwMkJEIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29uc3RyYWludHMgCSIyIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTEyMjAwMjIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExSZXR1cm5WYWx1ZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1ODcwMjQzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiCi0JICAgIHF1aWQgICAgICAgCSIzRTE5QTVENDAxQ0EiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndzZGxNZXNzYWdlTWFwcGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTVENTAwOEIiCi0JCSAgICBsYWJlbCAgICAgIAkid3NkbE1lc3NhZ2VNYXBwaW5nIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1RkEwMzhCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29uc3RyYWludHMgCSIzIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTVENTAwOEQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6Ok1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTZBMDE3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM2IgotCSAgICBxdWlkICAgICAgIAkiM0UxOUE1REIwMDExIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTVEQjAzODMiCi0JCSAgICBsYWJlbCAgICAgIAkid3NkbE1lc3NhZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMSIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUE1REIwMzhFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1RkEwMzhCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQYWNrYWdlTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTg4QTVBMDJDQiIKLQkgICAgdGl0bGUgICAgICAJIlBhY2thZ2VNYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpQYWNrYWdlTWFwcGluZyIgQDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMjA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSg4MjYsIDEwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYWNrYWdlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxREIwMzYwIgotCQkgICAgd2lkdGggICAgICAJNDc4Ci0JCSAgICBoZWlnaHQgICAgIAkyMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhV1NETE1hcHBpbmciIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgMjA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxMDksIDE0MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhV1NETE1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkJICAgIHdpZHRoICAgICAgCTQwOAotCQkgICAgaGVpZ2h0ICAgICAJMTU0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDMKLQkJICAgIGxvY2F0aW9uICAgCSg2NjIsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTg4QjBFMDM3MSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFja2FnZU1hcHBpbmdzIiBANAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSgzNjIsIDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Ci0JCQkJUGFyZW50X1ZpZXcgCUA0Ci0JCQkJbG9jYXRpb24gICAJKDcxNiwgODcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjk0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFja2FnZU1hcHBpbmdzIgotCQkJCXBjdERpc3QgICAgCTAuMzQ5NzI3Ci0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODhCMTAwMkFDIgotCQkJICAgIGNsaWVudCAgICAgCUAzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANgotCQkJCVBhcmVudF9WaWV3IAlANAotCQkJCWxvY2F0aW9uICAgCSg3NDQsIDE1MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjUzNTUxOQotCQkJCWhlaWdodCAgICAgCTU4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANwotCQkJCVBhcmVudF9WaWV3IAlANAotCQkJCWxvY2F0aW9uICAgCSg3ODYsIDI1MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezF9IgotCQkJCXBjdERpc3QgICAgCTAuODE0MjA4Ci0JCQkJaGVpZ2h0ICAgICAJNDUKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSgzNjIsIDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEIxMDAyQjYiCi0JCQkgICAgY2xpZW50ICAgICAJQDMKLQkJCSAgICBzdXBwbGllciAgIAlAMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ci0JCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQkJbG9jYXRpb24gICAJKDUyMywgMjYyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAxMDk5Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKYXZhWE1MVHlwZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OEJGMDAxNEEiCi0JICAgIHRpdGxlICAgICAgCSJKYXZhWE1MVHlwZU1hcHBpbmciCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlJvb3RUeXBlUW5hbWUiIEAxMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTg0LCA3MjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSgxMDE4LCA2NzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUm9vdFR5cGVRbmFtZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyOUIwMEMzIgotCQkgICAgd2lkdGggICAgICAJMzUwCi0JCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpWYXJpYWJsZU1hcHBpbmciIEAxMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTg0LCAxMjMyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExCi0JCQlsb2NhdGlvbiAgIAkoOTIzLCAxMDYzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlZhcmlhYmxlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyQjkwMzNCIgotCQkgICAgd2lkdGggICAgICAJNTQwCi0JCSAgICBoZWlnaHQgICAgIAkzNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhWE1MVHlwZU1hcHBpbmciIEAxMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDg0OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDE0LCA3MjApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjEyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVhNTFR5cGVNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFFQjAxNkQiCi0JCSAgICB3aWR0aCAgICAgIAk2MzAKLQkJICAgIGhlaWdodCAgICAgCTI3NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxMwotCQkgICAgbG9jYXRpb24gICAJKDgyMSwgNzczKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxODhFQUYwMUY2IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZVFuYW1lIiBAMTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzCi0JCQkgICAgbG9jYXRpb24gICAJKDUwNSwgLTc1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUKLQkJCQlQYXJlbnRfVmlldyAJQDE0Ci0JCQkJbG9jYXRpb24gICAJKDg5MCwgNzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI2MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3Jvb3RUeXBlUW5hbWUiCi0JCQkJcGN0RGlzdCAgICAJMC40MDMyMzAKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTg4RUIwMDNBNiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYKLQkJCQlQYXJlbnRfVmlldyAJQDE0Ci0JCQkJbG9jYXRpb24gICAJKDk1NiwgNjkwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNzY3MzYwCi0JCQkJaGVpZ2h0ICAgICAJNjQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNwotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoOTg0LCA2ODIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsyfSIKLQkJCQlwY3REaXN0ICAgIAkwLjkyNTMwNAotCQkJCWhlaWdodCAgICAgCTY4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDE4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIC03NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTg4RUIwMDNBOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTIKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkKLQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJbG9jYXRpb24gICAJKDY2MywgODUxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk2MDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAyMAotCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTg4RUM1MDA4NCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAidmFyaWFibGVNYXBwaW5ncyIgQDIxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJICAgIGxvY2F0aW9uICAgCSg0NTAsIDE5OSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQotCQkJCWxvY2F0aW9uICAgCSg4MTIsIDExNDkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrdmFyaWFibGVNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjUxMDY0OAotCQkJCWhlaWdodCAgICAgCTc2Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODhFQzcwMjcxIgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoODQ3LCAxMTAzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNTk0ODc0Ci0JCQkJaGVpZ2h0ICAgICAJMjAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNAotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoNzk0LCAxMTE3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7NH0iCi0JCQkJcGN0RGlzdCAgICAJMC4zMTA4NjMKLQkJCQloZWlnaHQgICAgIAk1NQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCAxOTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEVDNzAyNzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDIwCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSg2NjYsIDk0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjMxMgotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhV1NETE1hcHBpbmciIEAyNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDE2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNwotCQkJbG9jYXRpb24gICAJKDc3LCA5MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhV1NETE1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkJICAgIHdpZHRoICAgICAgCTQwOAotCQkgICAgaGVpZ2h0ICAgICAJMTU0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDI4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjkzLCA0NzMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OTE5NDAwQjkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFYTUxUeXBlTWFwcGluZ3MiIEAyOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjEsIDMyMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgyNjcsIDY2NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitqYXZhWE1MVHlwZU1hcHBpbmdzIgotCQkJCXBjdERpc3QgICAgCTAuNzk3NzUzCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OTE5NTAzODIiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgzNjIsIDY4MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5ODg3NgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDQxNiwgNjc3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7Mn0iCi0JCQkJcGN0RGlzdCAgICAJMC44OTg4NzYKLQkJCQloZWlnaHQgICAgIAkxMDgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBAMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDIxLCAzMjApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OTE5NTAzODQiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJCWxvY2F0aW9uICAgCSgzMzMsIDI1OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5ODQ5NgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDM1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExODQsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNQotCQkJbG9jYXRpb24gICAJKDg5OCwgNzcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUU5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIHdpZHRoICAgICAgCTU5MAotCQkgICAgaGVpZ2h0ICAgICAJMzE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDY3NDRBMDI3QyIKLQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkgICAgc3VwcGxpZXIgICAJQDM1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4Y2VwdGlvbk1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OTM0QjAzOUYiCi0JICAgIHRpdGxlICAgICAgCSJFeGNlcHRpb25NYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhV1NETE1hcHBpbmciIEAzNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJbG9jYXRpb24gICAJKDEwOSwgNjEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVdTRExNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICB3aWR0aCAgICAgIAk0MDgKLQkJICAgIGhlaWdodCAgICAgCTE1NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExNZXNzYWdlIiBAMzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM4Ci0JCQlsb2NhdGlvbiAgIAkoOTIzLCA2MTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETE1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIHdpZHRoICAgICAgCTMxNgotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6RXhjZXB0aW9uTWFwcGluZyIgQDM5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQlsb2NhdGlvbiAgIAkoNywgNTQ4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4Y2VwdGlvbk1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjAwMDFDNiIKLQkJICAgIHdpZHRoICAgICAgCTYxMgotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDQwCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCAzNzEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFBRTAwRUIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImV4Y2VwdGlvbk1hcHBpbmdzIiBANDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQwCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIDI1MCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyCi0JCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJCWxvY2F0aW9uICAgCSgyNjUsIDQ3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjMKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitleGNlcHRpb25NYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjYzMTAxNgotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQUYwMDFBIgotCQkJICAgIGNsaWVudCAgICAgCUA0MAotCQkJICAgIHN1cHBsaWVyICAgCUAzOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MwotCQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCQlsb2NhdGlvbiAgIAkoMzU4LCA1MTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44OTMwNDgKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Ci0JCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJCWxvY2F0aW9uICAgCSg0MTIsIDUxOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezN9IgotCQkJCXBjdERpc3QgICAgCTAuODkzMDQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOSIgQDQ1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAyNTApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFBRjAwMUMiCi0JCQkgICAgY2xpZW50ICAgICAJQDQwCi0JCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJCWxvY2F0aW9uICAgCSgzNTgsIDIyMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MjQ3MwotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDQ3Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzYxLCA2NTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCNTAxOUYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxNZXNzYWdlIiBANDgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgLTYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQotCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCA2MTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3NkbE1lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC4xNTY0NjMKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBMUI2MDIwRSIKLQkJCSAgICBjbGllbnQgICAgIAlANDcKLQkJCSAgICBzdXBwbGllciAgIAlAMzgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDg5NiwgNzEwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk2NTUyCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQotCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQlsb2NhdGlvbiAgIAkoODYyLCA3MDEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsyfSIKLQkJCQlwY3REaXN0ICAgIAkwLjY2NjY2NwotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEA1MgotCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCAtNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBMUI2MDIxMCIKLQkJCSAgICBjbGllbnQgICAgIAlANDcKLQkJCSAgICBzdXBwbGllciAgIAlAMzkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDYyNiwgNzEwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk4NjM1Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkVsZW1lbnROYW1lIiBANTQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NAotCQkJbG9jYXRpb24gICAJKDE3MzgsIDEzMzYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRWxlbWVudE5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyM0I5MDA2QiIKLQkJICAgIHdpZHRoICAgICAgCTMxOAotCQkgICAgaGVpZ2h0ICAgICAJMTk2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIgQDU1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDEwODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCWxvY2F0aW9uICAgCSg5MDIsIDEwMjEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyRUMwMUExIgotCQkgICAgd2lkdGggICAgICAJNTE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDU2Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzY4LCA4OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCQjAzRTIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiIEA1NwotCQkJICAgIFBhcmVudF9WaWV3IAlANTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDYzLCAyMzUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OAotCQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5OTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDIyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLQkJCQlwY3REaXN0ICAgIAktMC4xMDIwMDMKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCRDAwMzciCi0JCQkgICAgY2xpZW50ICAgICAJQDU2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5Ci0JCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJCWxvY2F0aW9uICAgCSgxMDM5LCA5ODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMS4wODIxMzEKLQkJCQloZWlnaHQgICAgIAk0NQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJCWxvY2F0aW9uICAgCSg5ODMsIDk0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezN9IgotCQkJCXBjdERpc3QgICAgCTAuODE3Njc3Ci0JCQkJaGVpZ2h0ICAgICAJNTUKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDYxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJICAgIGxvY2F0aW9uICAgCSg0NjMsIDIzNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBMUJEMDAzOSIKLQkJCSAgICBjbGllbnQgICAgIAlANTYKLQkJCSAgICBzdXBwbGllciAgIAlAMzkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjIKLQkJCQlQYXJlbnRfVmlldyAJQDYxCi0JCQkJbG9jYXRpb24gICAJKDU4NCwgNzM5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk2MTk0Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSgxNTI1LCAxMjU3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEExRDgwMDY2IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50TmFtZXMiIEA2NAotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzIzLCAtMTY3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDE3MTgsIDEyNjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudE5hbWVzIgotCQkJCXBjdERpc3QgICAgCTAuODA0NzgyCi0JCQkJaGVpZ2h0ICAgICAJNzUKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFEQTAwMjMiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDU0Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxNjcyLCAxMzc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODEwNTgyCi0JCQkJaGVpZ2h0ICAgICAJNDYKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNSIgQDY3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgzMjMsIC0xNjcpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFEQTAwMjUiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDU1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NwotCQkJCWxvY2F0aW9uICAgCSgxMzIxLCAxMjIzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAyMjU2Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBANjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYwMCwgMTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQlsb2NhdGlvbiAgIAkoMTMxNCwgNDUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUU5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIHdpZHRoICAgICAgCTU5MAotCQkgICAgaGVpZ2h0ICAgICAJMzE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDY3MjJCMDNDQiIKLQkJICAgIGNsaWVudCAgICAgCUAzOAotCQkgICAgc3VwcGxpZXIgICAJQDY5Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkludGVyZmFjZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTNGNTAwMDIiCi0JICAgIHRpdGxlICAgICAgCSJJbnRlcmZhY2VNYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMjAwMQotCSAgICBvcmlnaW5feSAgIAkxNjY5Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiBANzEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjExMiwgMjMzNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MQotCQkJbG9jYXRpb24gICAJKDE4MDYsIDIyMDgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjEyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MTQwMTI0IgotCQkgICAgd2lkdGggICAgICAJNjMwCi0JCSAgICBoZWlnaHQgICAgIAkyNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMUG9ydFR5cGUiIEA3MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxNTA0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcyCi0JCQlsb2NhdGlvbiAgIAkoMTkwOSwgMTQ2MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMUG9ydFR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNEVCMDMyNiIKLQkJICAgIHdpZHRoICAgICAgCTMyOAotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETEJpbmRpbmciIEA3MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxODg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDczCi0JCQlsb2NhdGlvbiAgIAkoMTkyMSwgMTg0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMQmluZGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MDYwMkExIgotCQkgICAgd2lkdGggICAgICAJMzA0Ci0JCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIiBANzQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgMTUwNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJbG9jYXRpb24gICAJKDgwMSwgMTQxNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIzODAyNTkiCi0JCSAgICB3aWR0aCAgICAgIAk2NTYKLQkJICAgIGhlaWdodCAgICAgCTE5NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2IiBANzUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTkyLCAxODk5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1RTMwMzUxIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIgQDc2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzksIDM5NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NgotCQkJCWxvY2F0aW9uICAgCSgxNjcyLCAyMTk0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIgotCQkJCXBjdERpc3QgICAgCTAuNTQzMDA2Ci0JCQkJaGVpZ2h0ICAgICAJMTc1Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1RTUwMkQyIgotCQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkJICAgIHN1cHBsaWVyICAgCUA3MQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OAotCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQlsb2NhdGlvbiAgIAkoMTY5MiwgMjE1OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjUyMjgzNgotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NgotCQkJCWxvY2F0aW9uICAgCSgxODQzLCAyMTUyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7NH0iCi0JCQkJcGN0RGlzdCAgICAJMC43NjU2OTEKLQkJCQloZWlnaHQgICAgIAkzMwotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3IiBAODAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ3OSwgMzk0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1RTUwMkRDIgotCQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkJICAgIHN1cHBsaWVyICAgCUA3NAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoMTMwOCwgMTU5NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NTU4MgotCQkJCWhlaWdodCAgICAgCTUyCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMiIgQDgyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMTUwNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTgzMDIyRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAid3NkbFBvcnRUeXBlIiBAODMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDgyCi0JCQkgICAgbG9jYXRpb24gICAJKDU0NywgMikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0Ci0JCQkJUGFyZW50X1ZpZXcgCUA4MwotCQkJCWxvY2F0aW9uICAgCSgxODQzLCAxNDMzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzMQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxQb3J0VHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjc1NTE4NwotCQkJCWhlaWdodCAgICAgCTcyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1ODcwMTREIgotCQkJICAgIGNsaWVudCAgICAgCUA4MgotCQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQotCQkJCVBhcmVudF9WaWV3IAlAODMKLQkJCQlsb2NhdGlvbiAgIAkoMTg3NywgMTU0MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwNjcwNAotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYKLQkJCQlQYXJlbnRfVmlldyAJQDgzCi0JCQkJbG9jYXRpb24gICAJKDE4MzksIDE0NzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsyfSIKLQkJCQlwY3REaXN0ICAgIAkwLjczNDAxNgotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEA4NwotCQkJICAgIFBhcmVudF9WaWV3IAlAODIKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTQ3LCAyKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1ODcwMTU3IgotCQkJICAgIGNsaWVudCAgICAgCUA4MgotCQkJICAgIHN1cHBsaWVyICAgCUA3NAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OAotCQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MSwgMTQ1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMTk2MQotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDg5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTY0OCwgMTcxOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MAotCQkJUGFyZW50X1ZpZXcgCUA4OQotCQkJbG9jYXRpb24gICAJKDE2NDgsIDE2NTkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiIgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTYwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTVCRDAzNkQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxCaW5kaW5nIiBAOTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgMjIxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDIwNTEsIDE3OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3NkbEJpbmRpbmciCi0JCQkJcGN0RGlzdCAgICAJMS4yOTc4NDcKLQkJCQloZWlnaHQgICAgIAk4NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNUJFMDM4RCIKLQkJCSAgICBjbGllbnQgICAgIAlAODkKLQkJCSAgICBzdXBwbGllciAgIAlANzMKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE4NDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44Njk2OTQKLQkJCQloZWlnaHQgICAgIAkzMAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0Ci0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxODkxLCAxNzgyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7M30iCi0JCQkJcGN0RGlzdCAgICAJMC44MDE1ODIKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1IiBAOTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ci0JCQkgICAgbG9jYXRpb24gICAJKDUyMCwgMjIxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1QkUwMzk3IgotCQkJICAgIGNsaWVudCAgICAgCUA4OQotCQkJICAgIHN1cHBsaWVyICAgCUA3NAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NgotCQkJCVBhcmVudF9WaWV3IAlAOTUKLQkJCQlsb2NhdGlvbiAgIAkoMTQxMywgMTU2NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MTY0MAotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpJbnRlcmZhY2VNYXBwaW5nIiBAOTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCAxMDg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQlsb2NhdGlvbiAgIAkoMTEzLCAxMDQ2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM1MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkludGVyZmFjZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyQkMyMDBERCIKLQkJICAgIHdpZHRoICAgICAgCTM2OAotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIiBAOTgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCAxMjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOTgKLQkJCWxvY2F0aW9uICAgCSg5MywgNjEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVdTRExNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICB3aWR0aCAgICAgIAk0MDgKLQkJICAgIGhlaWdodCAgICAgCTE1NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBAOTkKLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDYyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTQzMDI0RSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW50ZXJmYWNlTWFwcGluZ3MiIEAxMDAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkgICAgbG9jYXRpb24gICAJKDAsIDQ5NikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMQotCQkJCVBhcmVudF9WaWV3IAlAMTAwCi0JCQkJbG9jYXRpb24gICAJKDI0OCwgOTUxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ludGVyZmFjZU1hcHBpbmdzIgotCQkJCXBjdERpc3QgICAgCTAuNzk4NTI2Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU0NDAzMjIiCi0JCQkgICAgY2xpZW50ICAgICAJQDk5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDk3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMgotCQkJCVBhcmVudF9WaWV3IAlAMTAwCi0JCQkJbG9jYXRpb24gICAJKDM0MiwgOTkzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODk5MjYzCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSgzOTYsIDk5MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezR9IgotCQkJCXBjdERpc3QgICAgCTAuODk5MjYzCi0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEAxMDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkgICAgbG9jYXRpb24gICAJKDAsIDQ5NikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTQ0MDMyNCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTkKLQkJCSAgICBzdXBwbGllciAgIAlAOTgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQlsb2NhdGlvbiAgIAkoMzQyLCAyNDcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTkyNjMKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETFNlcnZpY2VOYW1lIiBAMTA2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5ODQsIDczNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDYKLQkJCWxvY2F0aW9uICAgCSgxNzk1LCA2OTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETFNlcnZpY2VOYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjQyOTAzQUQiCi0JCSAgICB3aWR0aCAgICAgIAkzOTYKLQkJICAgIGhlaWdodCAgICAgCTEwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlBvcnRNYXBwaW5nIiBAMTA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDEwNzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA3Ci0JCQlsb2NhdGlvbiAgIAkoMTY5OCwgOTY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjQzRTAzQTIiCi0JCSAgICB3aWR0aCAgICAgIAk0NjIKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIiBAMTA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDczNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDgKLQkJCWxvY2F0aW9uICAgCSg3OTksIDY0OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMkQwMDlCIgotCQkgICAgd2lkdGggICAgICAJNTAwCi0JCSAgICBoZWlnaHQgICAgIAkxOTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDEwOQotCQkgICAgbG9jYXRpb24gICAJKDE1MzcsIDczNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTY4MDA5NiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAid3NkbFNlcnZpY2VOYW1lIiBAMTEwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg3LCAwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxTZXJ2aWNlTmFtZSIKLQkJCQlwY3REaXN0ICAgIAkwLjc4ODU0NgotCQkJCWhlaWdodCAgICAgCTEwNQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTY4MDNBRCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEwNgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIKLQkJCQlQYXJlbnRfVmlldyAJQDExMAotCQkJCWxvY2F0aW9uICAgCSgxNzU4LCA3OTApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTM3NTAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMwotCQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQkJbG9jYXRpb24gICAJKDE3NDEsIDcwMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezJ9IgotCQkJCXBjdERpc3QgICAgCTAuODI4MTk0Ci0JCQkJaGVpZ2h0ICAgICAJMzUKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDExNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ4NywgMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTY4MDNBRiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTA5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEwOAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSgxMzE2LCA3OTApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTkzNzEKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEAxMTYKLQkJICAgIGxvY2F0aW9uICAgCSgxNDg5LCA5MDYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU3NTAwNEUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBvcnRNYXBwaW5ncyIgQDExNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ1NiwgMTY4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTY2MCwgOTMwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyMQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BvcnRNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5MzgwNAotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1NzYwMDFEIgotCQkJICAgIGNsaWVudCAgICAgCUAxMTYKLQkJCSAgICBzdXBwbGllciAgIAlAMTA3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQotCQkJCVBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJbG9jYXRpb24gICAJKDE2NDksIDEwMjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44OTkzMjIKLQkJCQloZWlnaHQgICAgIAk1MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMAotCQkJCVBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJbG9jYXRpb24gICAJKDE2MzAsIDEwNzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInszfSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTUxNgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxIiBAMTIxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDU2LCAxNjgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU3NjAwMjciCi0JCQkgICAgY2xpZW50ICAgICAJQDExNgotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjEKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOSwgNzkxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk4MDA0Ci0JCQkJaGVpZ2h0ICAgICAJNTIKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTIzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1QjlCNjcwMzI1IgotCQkgICAgY2xpZW50ICAgICAJQDEwOAotCQkgICAgc3VwcGxpZXIgICAJQDk3Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTVCOUM5MjAyRUQiCi0JCSAgICBjbGllbnQgICAgIAlANzQKLQkJICAgIHN1cHBsaWVyICAgCUA5NwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMTI1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5ODQsIDI0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMjUKLQkJCWxvY2F0aW9uICAgCSgxNjk3LCA5MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJRTmFtZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIgotCQkgICAgd2lkdGggICAgICAJNTkyCi0JCSAgICBoZWlnaHQgICAgIAkzMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDY3MkE3MDE0MyIKLQkJICAgIGNsaWVudCAgICAgCUAxMDYKLQkJICAgIHN1cHBsaWVyICAgCUAxMjUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDY3MkM0MDA4MyIKLQkJICAgIGNsaWVudCAgICAgCUA3MgotCQkgICAgc3VwcGxpZXIgICAJQDEyNQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMjIyOCwgMTUwNCkKLQkJCSgyNjg2LCAxNTA0KQotCQkJKDI2NzksIDIzOCkKLQkJCSgyMjgwLCAyMzkpKQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y0NjczN0EwMDMzIgotCQkgICAgY2xpZW50ICAgICAJQDczCi0JCSAgICBzdXBwbGllciAgIAlAMTI1Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgyMjE2LCAxODg3KQotCQkJKDI1ODYsIDE4ODcpCi0JCQkoMjU4NiwgMjM3KQotCQkJKDIyODAsIDIzOCkpCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE5OUM1MTAwMDkiCi0JICAgIHRpdGxlICAgICAgCSJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMTU4OQotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIgQDEyOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTI5Ci0JCQlsb2NhdGlvbiAgIAkoMTQ3OCwgNDY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjU2QTAxNzEiCi0JCSAgICB3aWR0aCAgICAgIAk1NTAKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciIEAxMzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzY4LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTMwCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDQ0OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjUxNDAxMjQiCi0JCSAgICB3aWR0aCAgICAgIAk2MzAKLQkJICAgIGhlaWdodCAgICAgCTI3NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4IiBAMTMxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOUEwOUUwMDVEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiIEAxMzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTksIC0zMDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMKLQkJCQlQYXJlbnRfVmlldyAJQDEzMgotCQkJCWxvY2F0aW9uICAgCSgxMDIwLCA1OTQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDUxCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIgotCQkJCXBjdERpc3QgICAgCS0wLjE0NDE2MAotCQkJCWhlaWdodCAgICAgCTE4Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOUEwOUYwMDRBIgotCQkJICAgIGNsaWVudCAgICAgCUAxMzEKLQkJCSAgICBzdXBwbGllciAgIAlAMTI5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNAotCQkJCVBhcmVudF9WaWV3IAlAMTMyCi0JCQkJbG9jYXRpb24gICAJKDE0MDAsIDYwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjgzMDUwOAotCQkJCWhlaWdodCAgICAgCTMyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzIKLQkJCQlsb2NhdGlvbiAgIAkoMTA3MywgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7NH0iCi0JCQkJcGN0RGlzdCAgICAJLTAuMDA2NzY4Ci0JCQkJaGVpZ2h0ICAgICAJMTcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDEzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkgICAgbG9jYXRpb24gICAJKDY5OSwgLTMwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMDlGMDA0QyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSg3MjMsIDUyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDEwMAotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZSIgQDEzOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCAxNjY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzOAotCQkJbG9jYXRpb24gICAJKDE2MjcsIDE2MjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETE1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIHdpZHRoICAgICAgCTMxNgotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETFJldHVyblZhbHVlTWFwcGluZyIgQDEzOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTM5Ci0JCQlsb2NhdGlvbiAgIAkoMTQ3OSwgODg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExSZXR1cm5WYWx1ZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTg3MDI0MyIKLQkJICAgIHdpZHRoICAgICAgCTYxMgotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEAxNDAKLQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCA3ODQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTBBMzAyOEEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciIEAxNDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAotCQkJICAgIGxvY2F0aW9uICAgCSg3MTUsIC04OSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MgotCQkJCVBhcmVudF9WaWV3IAlAMTQxCi0JCQkJbG9jYXRpb24gICAJKDEwMjksIDgzMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIit3c2RsUmV0dXJuVmFsdWVNYXBwaW5nIgotCQkJCXBjdERpc3QgICAgCS0wLjA4MjAxNgotCQkJCWhlaWdodCAgICAgCTU4Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOUEwQTQwMzU0IgotCQkJICAgIGNsaWVudCAgICAgCUAxNDAKLQkJCSAgICBzdXBwbGllciAgIAlAMTM5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MwotCQkJCVBhcmVudF9WaWV3IAlAMTQxCi0JCQkJbG9jYXRpb24gICAJKDEzMzQsIDkwMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY4MzM1MwotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTIzOSwgODk5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7NX0iCi0JCQkJcGN0RGlzdCAgICAJMC40NTk2OTkKLQkJCQloZWlnaHQgICAgIAk2NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxIiBAMTQ1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzE1LCAtODkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTBBNDAzNUUiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MAotCQkJICAgIHN1cHBsaWVyICAgCUAxMzAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNDUKLQkJCQlsb2NhdGlvbiAgIAkoNzM5LCA2MzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTg1OTYKLQkJCQloZWlnaHQgICAgIAk1MgotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzIiIEAxNDcKLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCAxMzYwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOUExMjEwMDhFIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsTWVzc2FnZSIgQDE0OAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkgICAgbG9jYXRpb24gICAJKDExNiwgLTQzMikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OQotCQkJCVBhcmVudF9WaWV3IAlAMTQ4Ci0JCQkJbG9jYXRpb24gICAJKDE4MTcsIDE1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3NkbE1lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC43OTgxNjUKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMTIyMDAxNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEzOAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAKLQkJCQlQYXJlbnRfVmlldyAJQDE0OAotCQkJCWxvY2F0aW9uICAgCSgxNzIzLCAxNTg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk2MDI0Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTEKLQkJCQlQYXJlbnRfVmlldyAJQDE0OAotCQkJCWxvY2F0aW9uICAgCSgxNjY5LCAxNTg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7Mn0iCi0JCQkJcGN0RGlzdCAgICAJMC44OTYwMjQKLQkJCQloZWlnaHQgICAgIAkxMDgKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDE1MgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkgICAgbG9jYXRpb24gICAJKDExNiwgLTQzMikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMTIyMDAyMiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEzOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTMKLQkJCQlQYXJlbnRfVmlldyAJQDE1MgotCQkJCWxvY2F0aW9uICAgCSgxNzIzLCAxMTM2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk2MDI0Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTlBNEVGMDA3MyIKLQkgICAgdGl0bGUgICAgICAJIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAk0MzEKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6Ok1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiBAMTU0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1NAotCQkJbG9jYXRpb24gICAJKDcwLCA1NjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTZBMDE3MSIKLQkJICAgIHdpZHRoICAgICAgCTU1MAotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2UiIEAxNTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1NQotCQkJbG9jYXRpb24gICAJKDE5MTUsIDY0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMTWVzc2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyRTAwMkJEIgotCQkgICAgd2lkdGggICAgICAJMzE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZU1hcHBpbmciIEAxNTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgOTEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1NgotCQkJbG9jYXRpb24gICAJKDkzNSwgNzg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExNZXNzYWdlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1RkEwMzhCIgotCQkgICAgd2lkdGggICAgICAJNjEyCi0JCSAgICBoZWlnaHQgICAgIAkyNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNCIgQDE1NwotCQkgICAgbG9jYXRpb24gICAJKDc2OCwgNzg3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOUE1RDQwMUNBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsTWVzc2FnZU1hcHBpbmciIEAxNTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NwotCQkJICAgIGxvY2F0aW9uICAgCSg0MzEsIDExNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OQotCQkJCVBhcmVudF9WaWV3IAlAMTU4Ci0JCQkJbG9jYXRpb24gICAJKDcyOCwgODUyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxNZXNzYWdlTWFwcGluZyIKLQkJCQlwY3REaXN0ICAgIAktMC4xNDQ2NjAKLQkJCQloZWlnaHQgICAgIAk3NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBNUQ1MDA4QiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTU3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1NgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjAKLQkJCQlQYXJlbnRfVmlldyAJQDE1OAotCQkJCWxvY2F0aW9uICAgCSg5MjQsIDc3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTAyNAotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTgKLQkJCQlsb2NhdGlvbiAgIAkoODkzLCA3NzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInszfSIKLQkJCQlwY3REaXN0ICAgIAkwLjcyMDcxNQotCQkJCWhlaWdodCAgICAgCTQ2Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEAxNjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NwotCQkJICAgIGxvY2F0aW9uICAgCSg0MzEsIDExNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBNUQ1MDA4RCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTU3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1NAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMKLQkJCQlQYXJlbnRfVmlldyAJQDE2MgotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDcwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MzExNQotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNiIgQDE2NAotCQkgICAgbG9jYXRpb24gICAJKDE3MjEsIDc3OSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTlBNURCMDAxMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAid3NkbE1lc3NhZ2UiIEAxNjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJICAgIGxvY2F0aW9uICAgCSg3ODIsIC0xMTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjYKLQkJCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJCWxvY2F0aW9uICAgCSgxNzc1LCA2OTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3NkbE1lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC4zNzg4ODUKLQkJCQloZWlnaHQgICAgIAk2NQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBNURCMDM4MyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTY0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1NQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjcKLQkJCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJCWxvY2F0aW9uICAgCSgxODgyLCA2NzgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45NTI1MjIKLQkJCQloZWlnaHQgICAgIAk1NwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OAotCQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQkJbG9jYXRpb24gICAJKDE3ODksIDY1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezF9IgotCQkJCXBjdERpc3QgICAgCTAuNTEyMzI3Ci0JCQkJaGVpZ2h0ICAgICAJMTAyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzciIEAxNjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJICAgIGxvY2F0aW9uICAgCSg3ODIsIC0xMTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTVEQjAzOEUiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NAotCQkJICAgIHN1cHBsaWVyICAgCUAxNTYKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjkKLQkJCQlsb2NhdGlvbiAgIAkoMTU3MywgODc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODkyNDg5Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qY2ExXzAuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvamNhMV8wLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlMGJmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qY2ExXzAuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNDM1MyArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamNhIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiamNhLnhtaSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJKY2EiKSkpDQotICAgIHF1aWQgICAgICAgCSIzQzYwOTA0MjAwQkIiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkNvbm5lY3RvciINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTA5MTAxMEYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMDc5MDEzNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZW5kb3JOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTBGMzAyMUUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4NCi18RXhhbXBsZTogV29tYmF0IENvcnAuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNwZWNWZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTBGQzAxOUYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVpc1R5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MTAwMDEyMyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLg0KLXwNCi18VGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aA0KLXx0aGlzIHJlc291cmNlIGFkYXB0ZXIuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTEwNjAxMEQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGZyb20gdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIuDQotfA0KLXxFeGFtcGxlOiAxLjUNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJlc291cmNlQWRhcHRlciINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18U3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3ZpZGVkLCBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcywgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQgYW5kIGFkZGl0aW9uYWwNCi18cmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuDQotfA0KLXxJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YNCi18cmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QNCi18c3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0DQotfG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMgdGhlIHNlY3VyaXR5DQotfHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTM2MDAzREEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMubWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MNCi18U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTM2QzAwQzAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UNCi18U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTM3NTAxM0IiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MNCi18U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uSW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTM3RTAyMUEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkludGVyZmFjZSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29ubmVjdGlvbkltcGxDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzOTUwM0Q2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25JbXBsQ2xhc3MNCi18U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2FjdGlvblN1cHBvcnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MzlGMDNEQSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLnRyYW5zYWN0aW9uU3VwcG9ydA0KLXxUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24NCi18c3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4NCi18VGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uLXN1cHBvcnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCi18ICBOb1RyYW5zYWN0aW9uDQotfCAgTG9jYWxUcmFuc2FjdGlvbg0KLXwgIFhBVHJhbnNhY3Rpb24NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiVHJhbnNhY3Rpb25TdXBwb3J0S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk4QzgwMzk0Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5M0E4MDMxRiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLnJlYXV0aGVudGljYXRpb25TdXBwb3J0DQotfFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlQWRhcHRlckNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUQzMzAyREMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlDQotfCAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cw0KLXwgICAgICAgIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuUmVzb3VyY2VBZGFwdGVyDQotfCAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZg0KLXwgICAgICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3INCi18ICAgICAgICBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uDQotfCAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQXV0aGVudGljYXRpb25NZWNoYW5pc20iDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkxNDAwM0NFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLg0KLXwNCi18Tm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlDQotfGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLg0KLXxUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQ0KLXxqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwgaW50ZXJmYWNlLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTE3NjAzNzEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTk4RjAzNjgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkxODIwMDU3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZCBTZWUgYXV0aGVudGljYXRpb25NZWNoYW5pc20NCi18DQotfFRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uDQotfA0KLXxUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOg0KLXwgIC0gQmFzaWNQYXNzd29yZA0KLXwgIC0gS2VyYnY1DQotfA0KLXxBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUNCi18Q29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTFDMzAyQTkiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjcmVkZW50aWFsSW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTFBQTAzODAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkgY29udHJhY3QuDQotfA0KLXxUaGUgcG9zc2libGUgdmFsdWVzIGFyZToNCi18ICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbA0KLXwgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImN1c3RvbUF1dGhNZWNoVHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRDk5RTIwODAzOEEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEBkZXByZWNhdGVkDQotfFRoaXMgaXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgQXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgd2hlbiBpdCBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBCYXNpY1Bhc3N3b3JkIG9yIEtlcmJ2NS4gIEF1dGhlbnRpY2F0aW9uTWVjYW5pc21UeXBlIGlzIHNldCB0byAnQ3VzdG9tJyBpbiB0aG9zZSBjYXNlcy4gIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBieSBydW50aW1lLiAgSXQgaXMgb25seSB1c2VkIGJ5IHRoZSB3cml0ZXIgdG8gd3JpdGUgYmFjayBvdXQgdGhlIGN1c3RvbSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgc3RyaW5nIGluIHRoZSBjYXNlIG9mIGN1c3RvbSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUncy4gIA0KLXxUaGlzIHZhcmlhYmxlIGlzIGludGVybmFsLCB1c2VkIG9ubHkgYnkgdGhlIHJlYWRlci93cml0ZXIgY2xhc3NlcywgYW5kIGNhbiBjaGFuZ2Ugb3IgZGlzYXBwZWFyIHdpdGhvdXQgbm90aWNlLiAgDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkxQzMwMkE5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18QmFzaWNQYXNzd29yZD0wDQotfEtlcmJ2NT0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJCYXNpY1Bhc3N3b3JkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTFEMDAwREMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJLZXJidjUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MUQ1MDExRiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJDb25maWdQcm9wZXJ0eSINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTIyQzAxODgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGNvbmZpZyBwcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlDQotfGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLg0KLXwNCi18RWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmljIEVJUyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIG9uIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhIHJlc291cmNlIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG11bHRpcGxlIE1hbmFnZWRDb25ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBFSVMpLg0KLXwNCi18VGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlDQotfGFuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYgdGhlIHJlc291cmNlDQotfGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzDQotfHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5Lg0KLXwNCi18QW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24uDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MjMyMDNCNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkyM0YwMTk5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDb250YWlucyB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuDQotfA0KLXxUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZCBwcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcyBmb2xsb3dzOg0KLXwNCi18ICAgICBTZXJ2ZXJOYW1lDQotfCAgICAgUG9ydE51bWJlcg0KLXwgICAgIFVzZXJOYW1lDQotfCAgICAgUGFzc3dvcmQNCi18ICAgICBDb25uZWN0aW9uVVJMDQotfA0KLXxBIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIEVJUy4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MjQ1MDE5OCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkIGJ5IE1hbmFnZWRDb25uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2UuDQotfA0KLXxUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGNvbmZpZy1wcm9wZXJ0eS10eXBlOg0KLXwgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsDQotfCAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsDQotfCAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXINCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MjQ4MDJERCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZQ0KLXwgICAgICAgIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4gTm90ZSwgaXQgaXMgcG9zc2libGUgZm9yIGENCi18ICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGRlcGxveWVyIHRvIG92ZXJyaWRlIHRoaXMNCi18ICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50Lg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJTZWN1cml0eVBlcm1pc3Npb24iDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkzQzEwMEY0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlciBjb2RlLg0KLXwNCi18VGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlIGRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eSBwZXJtaXNzaW9uLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTdFOTAxNjIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNwZWNpZmljYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5N0Y1MDNDQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgcGVybWlzc2lvbi1zcGVjIHNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlIHN5bnRheC4gDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTGljZW5zZSINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTUyOTAwOEUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiU3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gU3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk1M0UwMDg0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZCBSZXBsYWNlZCB3aXRoIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgbGljZW5zZS4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5NTlGMDE3RSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5OEM4MDM5NCINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOb1RyYW5zYWN0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOThEMjAxRkUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMb2NhbFRyYW5zYWN0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOThENjAyMzUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJYQVRyYW5zYWN0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOThEQjAyMzMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSW5ib3VuZFJlc291cmNlQWRhcHRlciINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTFERDAyNTciDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbg0KLXxhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24NCi18c3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyDQotfGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuDQotCSAgICApDQotCShvYmplY3QgQ2xhc3MgIk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBMUU2MDIzQyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dA0KLXxhbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkNCi18cXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzZXMvaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mDQotfHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yDQotfGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydA0KLXxwcm92aWRlZCwgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQNCi18YW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuDQotfA0KLXxJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YNCi18cmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QNCi18c3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcw0KLXxwYXJ0IG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMNCi18dGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNUJBMDAzQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcw0KLXwgICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMNCi18ICAgICAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uDQotfCAgICAgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUNCi18ICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQ0KLXwgICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlDQotfCAgICAgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2FjdGlvblN1cHBvcnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBODYyMDI2QiINCi0JCSAgICB0eXBlICAgICAgIAkiVHJhbnNhY3Rpb25TdXBwb3J0S2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk4QzgwMzk0Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VBZGFwdGVyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBMkQ2MDFGMSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXxtZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzDQotfGNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCi18cmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQ0KLXxtZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4NCi0JICAgICkNCi0JKG9iamVjdCBDbGFzcyAiQ29ubmVjdGlvbkRlZmluaXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUE0Q0YwMEYyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uDQotfGludGVyZmFjZXMgYW5kIGNsYXNzZXMgcGVydGFpbmluZyB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbg0KLXx0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yDQotfE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0DQotfG9mIHRoaXMgc2V0Lg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNkMyMDNBRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcw0KLXwgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0DQotfCAgICAgICAgaW1wbGVtZW50cyB0aGUNCi18ICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4NCi18ICAgICAgICBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZQ0KLXwgICAgICAgIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlDQotfCAgICAgICAgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMNCi18ICAgICAgICBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwgICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+DQotfCAgICAgICAgICAgIGNvbS53b21iYXQuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5SW1wbA0KLXwgICAgICAgIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE3NDgwMzg4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzDQotfCAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQ0KLXwgICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfCAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5DQotfCAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+DQotfA0KLXwgICAgICAgIE9SDQotfA0KLXwgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5DQotfCAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTc1MDAxODAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzDQotfCAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQ0KLXwgICAgICAgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyDQotfCAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbA0KLXwgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29ubmVjdGlvbkludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE3NUUwMUJEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5DQotfCAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZA0KLXwgICAgICAgIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uDQotfCAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25JbXBsQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNzc3MDExOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzc1R5cGUgc3BlY2lmaWVzIHRoZSBmdWxseQ0KLXwgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzIHRoYXQNCi18ICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbg0KLXwgICAgICAgIGludGVyZmFjZS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzcw0KLXwgICAgICAgIGVsZW1lbnRzLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsDQotfCAgICAgICAgICAgIDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQWRtaW5PYmplY3QiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFERDYwMDRCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4NCi18YWRtaW5pc3RlcmVkIG9iamVjdC4gIEFkbWluaXN0ZXJlZCBvYmplY3RzIGFyZSBzcGVjaWZpYyB0byBhDQotfG1lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucw0KLXxpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkNCi18YW4gYWRtaW5pc3RlcmVkIG9iamVjdCwgaXRzIEphdmEgY2xhc3MgbmFtZSBhbmQgaXRzDQotfGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFkbWluT2JqZWN0SW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQjEyQjAxODgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlDQotfCAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUNCi18ICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18ICAgICAgICAgIDxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uDQotfCAgICAgICAgICA8L2FkbWlub2JqZWN0LWludGVyZmFjZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWRtaW5PYmplY3RDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUIxMzEwMDAwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5DQotfCAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0Lg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwgICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwNCi18ICAgICAgICAgICAgPC9hZG1pbm9iamVjdC1jbGFzcz4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VMaXN0ZW5lciINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUVDMTAyRkMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgbWVzc2FnZWxpc3RlbmVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYQ0KLXxzcGVjaWZpYyBtZXNzYWdlIGxpc3RlbmVyIHN1cHBvcnRlZCBieSB0aGUgbWVzc2FnaW5nDQotfHJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUNCi18b2YgdGhlIG1lc3NhZ2UgbGlzdGVuZXIgaW50ZXJmYWNlIGFuZCBhbiBhY3RpdmF0aW9uDQotfHNwZWNpZmljYXRpb24uDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlTGlzdGVuZXJUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUVGOTAxQTgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IG1lc3NhZ2VsaXN0ZW5lci10eXBlIHNwZWNpZmllcyB0aGUgZnVsbHkNCi18ICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQ0KLXwgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgICA8bWVzc2FnZWxpc3RlbmVyLXR5cGU+amF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lcg0KLXwgICAgICAgICAgPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkFjdGl2YXRpb25TcGVjIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRjMyMDA0MiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBhY3RpdmF0aW9uc3BlY1R5cGUgc3BlY2lmaWVzIGFuIGFjdGl2YXRpb24NCi18c3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQNCi18SmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2YXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgYSBzZXQgb2YNCi18cmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lcy4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFjdGl2YXRpb25TcGVjQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRjk0MDNBQSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgYWN0aXZhdGlvbnNwZWMtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQ0KLXwgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2YXRpb24NCi18ICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQ0KLXwgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5BY3RpdmF0aW9uU3BlYyBpbnRlcmZhY2UuIFRoZQ0KLXwgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYQ0KLXwgICAgICAgIEphdmFCZWFuLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwgICAgICAgICAgICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwNCi18ICAgICAgICAgICAgPC9hY3RpdmF0aW9uc3BlYy1jbGFzcz4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkQ2MDFBNiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24NCi18b2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGENCi18cmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkDQotfGJ5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4NCi18DQotfEV4YW1wbGU6DQotfA0KLXw8cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQjAxRjAxQkYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5M0NDMDAxRSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWN1cml0eVBlcm1pc3Npb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTNDQzAzNjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eVBlcm1pc3Npb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6U2VjdXJpdHlQZXJtaXNzaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTNDMTAwRjQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTNDQzAzNjkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTQxMjAwMjgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTQxMjAzOTAiDQotCQkgICAgbGFiZWwgICAgICAJImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTE0MDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTQxMjAzOTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTQ0QzAwRDYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk0NEQwMTk2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29uZmlnUHJvcGVydHkiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MjJDMDE4OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5NDREMDE5OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5NTMxMDE4MCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsaWNlbnNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTUzMjAwMEUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZg0KLXxjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJImxpY2Vuc2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpMaWNlbnNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTUyOTAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTUzMjAwMTAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MDkxMDEwRiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTk4OTAwQzAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTk4OTAyQUIiDQotCQkgICAgbGFiZWwgICAgICAJInJlc291cmNlQWRhcHRlciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk5ODkwMkI1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTA5MTAxMEYiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBMzYzMDMwMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJvdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUEzNjUwMzY5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgZWxlbWVudCBjb250ZW50IG11c3QgYmUNCi18ICAgICAgICB1bmlxdWUgaW4gdGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlci4gTXVsdGlwbGUgY29ubmVjdGlvbi1kZWZpbml0aW9ucw0KLXwgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIGNvbm5lY3Rpb25mYWN0b3J5LXR5cGUuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJIm91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMUU2MDIzQyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTM2NTAzNkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUE0REMwMjZFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbm5lY3Rpb25EZWZpbml0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE0REQwMDVDIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb25uZWN0aW9uRGVmaW5pdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0aW9uRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE0Q0YwMEYyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNEREMDA2NiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6Ok91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTFFNjAyM0MiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBNTQ0MDBGQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNTQ1MDI4RCINCi0JCSAgICBsYWJlbCAgICAgIAkiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6QXV0aGVudGljYXRpb25NZWNoYW5pc20iDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTQwMDNDRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTU0NTAyOEYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpPdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUExRTYwMjNDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTZGMjAxMTciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE2RjMwMTY5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29uZmlnUHJvcGVydHkiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MjJDMDE4OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTZGMzAxNzMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0aW9uRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE0Q0YwMEYyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQURDRDAzNkEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5ib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFEQ0YwMzEyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJpbmJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6SW5ib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUExREQwMjU3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRENGMDMxNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUUwMjAzMjAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYWRtaW5PYmplY3RzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUUwNDAxNjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImFkbWluT2JqZWN0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkFkbWluT2JqZWN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQURENjAwNEIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFFMDQwMTZCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6UmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRTM4MDI1RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlQWRhcHRlciINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFFMzkwMDk0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWVzc2FnZWxpc3RlbmVyLXR5cGUgZWxlbWVudCBjb250ZW50IG11c3QgYmUNCi18ICAgICAgICB1bmlxdWUgaW4gdGhlIG1lc3NhZ2VhZGFwdGVyLiBTZXZlcmFsIG1lc3NhZ2VsaXN0ZW5lcnMNCi18ICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZUFkYXB0ZXIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpNZXNzYWdlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUEyRDYwMUYxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRTM5MDA5RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMUREMDI1NyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFFQ0MwMDc3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2VMaXN0ZW5lcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRUNDMDNBMiINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZUxpc3RlbmVycyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6Ok1lc3NhZ2VMaXN0ZW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFQzEwMkZDIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRUNDMDNBNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6Ok1lc3NhZ2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTJENjAxRjEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRjQ4MDAxMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhY3RpdmF0aW9uU3BlYyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFGNDkwMTAzIg0KLQkJICAgIGxhYmVsICAgICAgCSJhY3RpdmF0aW9uU3BlYyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkFjdGl2YXRpb25TcGVjIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUYzMjAwNDIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFGNDkwMTA1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6TWVzc2FnZUxpc3RlbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUVDMTAyRkMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkFBMDI3RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkFCMDM0OSINCi0JCSAgICBsYWJlbCAgICAgIAkicmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkQ2MDFBNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUZBQjAzNTMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpBY3RpdmF0aW9uU3BlYyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGMzIwMDQyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQjE0QTAyQjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUIxNEIwMzQ3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29uZmlnUHJvcGVydHkiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MjJDMDE4OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQjE0QjAzNTEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpBZG1pbk9iamVjdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFERDYwMDRCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQThBMjAwMUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQThBMzAwMzMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE4QTMwMDNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6QXV0aGVudGljYXRpb25NZWNoYW5pc20iDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTQwMDNDRSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QTlDODYwMDJBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTlDODYwM0IwIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5Qzg2MDNCMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkxpY2Vuc2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NTI5MDA4RSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFGRUMwMUJDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFGRjQwMDE5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkY0MDAyNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZENjAxQTYiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBQjVBMDM0QSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBQjYxMDBCRiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUI2MTAwQzkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpDb25maWdQcm9wZXJ0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkyMkMwMTg4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUEzMjAyRkUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUEzNDAwMTIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFBMzQwMDFDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6U2VjdXJpdHlQZXJtaXNzaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTNDMTAwRjQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkNvbm5lY3RvciBEZXRhaWxzIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5MDVFMDBFNCINCi0JICAgIHRpdGxlICAgICAgCSJDb25uZWN0b3IgRGV0YWlscyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxODA4DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBMYWJlbCBAMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MywgNDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTINCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAk5ODENCi0JCSAgICBsYWJlbCAgICAgIAkiSkNBIDEuNSBEZXBsb3ltZW50IERlc2NyaXB0b3IiKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMg0KLQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDM2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDcxLCAxODcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJMTU2NQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGVkOiAoTm90ZTogdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBiZWNvbWVzIHZvbGF0aWxlIGFuZCBnZXRzIGltcGxlbWVudGF0aW9uIHJlZGlyZWN0ZWQgaW50byBsaXN0IHdpdGggbmV3IEoyRUUgdHlwZSkNCi18ZGlzcGxheU5hbWUgcmVwbGFjZWQgd2l0aCBkaXNwbGF5TmFtZXM6TGlzdDxEaXNwbGF5TmFtZT4NCi18ZGVzY3JpcHRpb24gcmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnM6TGlzdDxEZXNjcmlwdGlvblR5cGU+DQotfHNtYWxsSWNvbiByZXBsYWNlZCB3aXRoIGljb25zOkxpc3Q8SWNvblR5cGU+DQotfGxhcmdlSWNvbiByZXBsYWNlZCB3aXRoIGljb25zOkxpc3Q8SWNvblR5cGU+DQotfHZlcnNpb24gcmVwbGFjZWQgd2l0aCByZXNvdXJjZVZlcnNpb246U3RyaW5nDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTE2MjUNCi0JCSAgICBoZWlnaHQgICAgIAkzNzUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzDQotCQkgICAgbG9jYXRpb24gICAJKDEzNTAsIDE2MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg4NDMsIDE1MTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJOTc4DQotCQkJbGFiZWwgICAgICAJIlRoZSByZWFsIFhNTCB0YWcgZm9yIHNwZWNWZXJzaW9uIGluIEpDQTEuNSBpcyA8dmVyc2lvbj4uIEluIEpDQTEuMCBpdCB3YXMgPHNwZWMtdmVyc2lvbj4uICBJbiBvdGhlciB3b3JkcywgSkNBMS41IHZlcnNpb24gZWxlbWVudHMgd2lsbCBkZXNlcmlhbGl6ZSBpbnRvIHRoZSBzcGVjVmVyc2lvbiBhdHRyaWJ1dGUuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMDM4DQotCQkgICAgaGVpZ2h0ICAgICAJMjM3KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjAwLCAzNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxNzA5LCAyNDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJOTQ2DQotCQkJbGFiZWwgICAgICAJDQotfERlcHJlY2F0ZWQ6IChOb3RlOiB0aGUgZGVwcmVjYXRlZCB2ZXJzaW9uIGJlY29tZXMgdm9sYXRpbGUgYW5kIGdldHMgaW1wbGVtZW50YXRpb24gcmVkaXJlY3RlZCBpbnRvIGxpc3QgdmVyc2lvbikNCi18ZGVzY3JpcHRpb24gcmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnM6TGlzdDxTdHJpbmc+DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTEwMDYNCi0JCSAgICBoZWlnaHQgICAgIAkyNDQpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA1DQotCQkgICAgbG9jYXRpb24gICAJKDI0MjEsIDEyNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDE3MDgsIDM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTEzOTANCi0JCQlsYWJlbCAgICAgIAkiTWFueSBkZXNjcmlwdGl2ZSBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvICduJyBtdWx0aXBsaWNpdHkgdG8gc3VwcG9ydCBsb2NhbGl6YXRpb24gb2YgdGV4dCBhbmQgaWNvbnMiKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTE0NTANCi0JCSAgICBoZWlnaHQgICAgIAkxOTQpDQotCQkob2JqZWN0IExhYmVsIEA2DQotCQkgICAgbG9jYXRpb24gICAJKDE2MywgMjA4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTMNCi0JCSAgICBtYXhfd2lkdGggIAk4OTQNCi0JCSAgICBsYWJlbCAgICAgIAkNCi18U0VFICJSRVNPVVJDRUFEQVBURVIgREVUQUlMUyIgRElBR1JBTQ0KLQkJICAgICkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc0OSwgOTczKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxNTcxLCA4OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciIgQDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc3LCAxOTY3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgNCi0JCQlsb2NhdGlvbiAgIAkoNDAyLCAxOTE2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzb3VyY2VBZGFwdGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkNvbm5lY3RvciIgQDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTA1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJbG9jYXRpb24gICAJKDMwOSwgODAzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYxNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29ubmVjdG9yIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkwOTEwMTBGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJbG9jYXRpb24gICAJKDMwOSwgODY0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNDI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTYzMg0KLQkJICAgIGhlaWdodCAgICAgCTUzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAOQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4MDEsIDU1NSkNCi0JCQkoNzE0LCA3OTApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUA5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDExOTgsIDE1MDkpDQotCQkJKDkzMiwgMTMwMykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTINCi0JCSAgICBsb2NhdGlvbiAgIAkoNTIyLCAxNjE1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk5ODkwMEMwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlQWRhcHRlciIgQDEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTINCi0JCQkgICAgbG9jYXRpb24gICAJKC0yMiwgMTAyMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEzDQotCQkJCWxvY2F0aW9uICAgCSgzMjUsIDE2ODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlQWRhcHRlciINCi0JCQkJcGN0RGlzdCAgICAJMC4yNTY4ODENCi0JCQkJaGVpZ2h0ICAgICAJMTk4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OTg5MDJBQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyDQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTIyLCAxNjE1KQ0KLQkJCQkoNTIyLCAxOTA0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyMiwgMTYxNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMiwgMTkwNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCQlsb2NhdGlvbiAgIAkoNTYxLCAxNzE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC4zNTA4NzcNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEAxNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjIsIDEwMjMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk5ODkwMkI1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MjIsIDE2MTUpDQotCQkJCSg1MjIsIDEzMjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTIyLCAxNjE1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIyLCAxMzI2KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMTcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI2MjQsIDcwNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCWxvY2F0aW9uICAgCSgyNDgwLCA1NTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQlsb2NhdGlvbiAgIAkoMjQ4MCwgNjU3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjg1KQ0KLQkJICAgIHdpZHRoICAgICAgCTMwNg0KLQkJICAgIGhlaWdodCAgICAgCTMzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkxpY2Vuc2UiIEAxOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgxMCwgNzAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJbG9jYXRpb24gICAJKDE1MjIsIDU5NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxpY2Vuc2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTUyOTAwOEUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJbG9jYXRpb24gICAJKDE1MjIsIDY1NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTU3MikNCi0JCSAgICB3aWR0aCAgICAgIAk1OTQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIwNTksIDQ3OCkNCi0JCQkoMTk0MiwgNTgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAyMA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjIyLCA3OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTUzMTAxODAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibGljZW5zZSIgQDIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMzQ4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyDQotCQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQkJbG9jYXRpb24gICAJKDEzNTQsIDc1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGljZW5zZSINCi0JCQkJcGN0RGlzdCAgICAJMC40NTc0NDcNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk1MzIwMDBFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIyMiwgNzk2KQ0KLQkJCQkoMTUxMywgNzk2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMjIsIDc5NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTMsIDc5NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2NiwgODUwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NDE1NDkNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEAyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwDQotCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDM0OCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTUzMjAwMTAiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMjIsIDc5NikNCi0JCQkJKDkzMiwgNzk2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMjIsIDc5NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkzMiwgNzk2KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM0IiBAMjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OSwgNjUzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTlDODYwMDJBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDI2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ3MywgLTUwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3DQotCQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQkJbG9jYXRpb24gICAJKDIzNTQsIDYwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM1Njg4Ng0KLQkJCQloZWlnaHQgICAgIAk1MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOUM4NjAzQjAiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg5LCA2NTMpDQotCQkJCSgyNDcxLCA2NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgNjUzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ3MSwgNjUzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJCWxvY2F0aW9uICAgCSgyNDI5LCA3MDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2NzEyMw0KLQkJCQloZWlnaHQgICAgIAk1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEAyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzMsIC01MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOUM4NjAzQjIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg5LCA2NTMpDQotCQkJCSgyMTA3LCA2NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4OSwgNjUzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwNywgNjUzKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJSZXNvdXJjZSBBZGFwdGVyIERldGFpbHMiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUIyMTkwMUIzIg0KLQkgICAgdGl0bGUgICAgICAJIlJlc291cmNlIEFkYXB0ZXIgRGV0YWlscyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAk3MzA1DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSIgQDMwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzY1LCAxMzc5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJbG9jYXRpb24gICAJKDMwNzAsIDEyOTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTkwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCWxvY2F0aW9uICAgCSgzMDcwLCAxMjQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTkwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTFDMzAyQTkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJbG9jYXRpb24gICAJKDMwNzAsIDEzNTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNDApDQotCQkgICAgd2lkdGggICAgICAJNjA4DQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6VHJhbnNhY3Rpb25TdXBwb3J0S2luZCIgQDMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzQ4LCAyMzM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDMxMTgsIDIyMjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMzExOCwgMjE3OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk4QzgwMzk0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCWxvY2F0aW9uICAgCSgzMTE4LCAyMjkwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzY1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ3OA0KLQkJICAgIGhlaWdodCAgICAgCTM0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBMYWJlbCBAMzINCi0JCSAgICBsb2NhdGlvbiAgIAkoNTMsIDQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEyDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCVRSVUUNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJOTgxDQotCQkgICAgbGFiZWwgICAgICAJDQotfEpDQSAxLjUgRGVwbG95bWVudCBEZXNjcmlwdG9yDQotfFJlc291cmNlIEFkYXB0ZXIgRGV0YWlscw0KLQkJICAgICkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDMzDQotCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMzYyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDc1LCAxODEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJMTU2NQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGVkOiAoTm90ZTogdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBiZWNvbWVzIHZvbGF0aWxlIGFuZCBnZXRzIGltcGxlbWVudGF0aW9uIHJlZGlyZWN0ZWQgaW50byBsaXN0IHdpdGggbmV3IEoyRUUgdHlwZSkNCi18ZGlzcGxheU5hbWUgcmVwbGFjZWQgd2l0aCBkaXNwbGF5TmFtZXM6TGlzdDxEaXNwbGF5TmFtZT4NCi18ZGVzY3JpcHRpb24gcmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnM6TGlzdDxEZXNjcmlwdGlvblR5cGU+DQotfHNtYWxsSWNvbiByZXBsYWNlZCB3aXRoIGljb25zOkxpc3Q8SWNvblR5cGU+DQotfGxhcmdlSWNvbiByZXBsYWNlZCB3aXRoIGljb25zOkxpc3Q8SWNvblR5cGU+DQotfHZlcnNpb24gcmVwbGFjZWQgd2l0aCByZXNvdXJjZVZlcnNpb246U3RyaW5nDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTE2MjUNCi0JCSAgICBoZWlnaHQgICAgIAkzNzUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzNA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjAwLCAzNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQlsb2NhdGlvbiAgIAkoMTcwOSwgMjQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTk0Ng0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGVkOiAoTm90ZTogdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBiZWNvbWVzIHZvbGF0aWxlIGFuZCBnZXRzIGltcGxlbWVudGF0aW9uIHJlZGlyZWN0ZWQgaW50byBsaXN0IHZlcnNpb24pDQotfGRlc2NyaXB0aW9uIHJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zOkxpc3Q8U3RyaW5nPg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMDA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjQ0KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQyMSwgMTI1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM1DQotCQkJbG9jYXRpb24gICAJKDE3MDgsIDM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTEzOTANCi0JCQlsYWJlbCAgICAgIAkiTWFueSBkZXNjcmlwdGl2ZSBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvICduJyBtdWx0aXBsaWNpdHkgdG8gc3VwcG9ydCBsb2NhbGl6YXRpb24gb2YgdGV4dCBhbmQgaWNvbnMiKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTE0NTANCi0JCSAgICBoZWlnaHQgICAgIAkxOTQpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzNg0KLQkJICAgIGxvY2F0aW9uICAgCSg0MDE3LCAxODQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2DQotCQkJbG9jYXRpb24gICAJKDM3ODIsIDE3MjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNDM0DQotCQkJbGFiZWwgICAgICAJIk5lZWQgdG8gY2hlY2sgY29sbGFwc2VXaGl0ZXNwYWNlIGF0dHJpYnV0ZSIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNDk0DQotCQkgICAgaGVpZ2h0ICAgICAJMjQ0KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjEzMiwgMjA4MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCWxvY2F0aW9uICAgCSgxOTAzLCAxOTQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTQyMg0KLQkJCWxhYmVsICAgICAgCQ0KLXxOZWVkIGJhc2ljIHR5cGUsIEFueVVSSSAocGxhY2UgdGhpcyBpbiBzYW1lIHBhY2thZ2UgYXMgbmV3IFBhc3N3b3JkLS1tYXliZSAiY29tbW9uLWRhdGF0eXBlcyIpDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTQ4Mg0KLQkJICAgIGhlaWdodCAgICAgCTI4NykNCi0JCShvYmplY3QgTm90ZVZpZXcgQDM4DQotCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDQ3NTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzgNCi0JCQlsb2NhdGlvbiAgIAkoMTc4LCA0NTE0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJOQ0KLQkJCW1heF93aWR0aCAgCTE5NTkNCi0JCQlsYWJlbCAgICAgIAkNCi18bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgaXMgcmVwbGFjZWQgYnkgcmEub3V0Ym91bmRSQS5jb25uZWN0aW9uRGVmaW5pdGlvbnMubWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MNCi18Y29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgaXMgcmVwbGFjZWQgYnkgcmEub3V0Ym91bmRSQS5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UNCi18Y29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgaXMgcmVwbGFjZWQgYnkgcmEub3V0Ym91bmRSQS5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MNCi18dHJhbnNhY3Rpb25TdXBwb3J0IGlzIHJlcGxhY2VkIGJ5IHJhLm91dGJvdW5kUkEudHJhbnNhY3Rpb25TdXBwb3J0IA0KLXxjb25uZWN0aW9uSW50ZXJmYWNlIGlzIHJlcGxhY2VkIGJ5IHJhLm91dGJvdW5kUkEuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25JbnRlcmZhY2UNCi18Y29ubmVjdGlvbkltcGxDbGFzcyBpcyByZXBsYWNlZCBieSByYS5vdXRib3VuZFJBLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uSW1wbENsYXNzDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTIwMTkNCi0JCSAgICBoZWlnaHQgICAgIAk1MDApDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTU2LCA1MTc1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJbG9jYXRpb24gICAJKDM0LCA1MDk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTIyMDkNCi0JCQlsYWJlbCAgICAgIAkiUmVhZGVycyB3aWxsIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdHJpbmcgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBkYXRhdHlwZSBzcGVjaWZpZWQuIFNlZSB0aGUgc3BlYy4gT3IgbWF5YmUgaW5zdGVhZCBwcm92aWRlIGhlbHBlcnMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGU/IikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkyMjY5DQotCQkgICAgaGVpZ2h0ICAgICAJMTY5KQ0KLQkJKG9iamVjdCBMYWJlbCBANDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ0LCAyMzUzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJICAgIG1heF93aWR0aCAgCTQ4OA0KLQkJICAgIGxhYmVsICAgICAgCSJUaGVyZSBhcmUgc29tZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnRzIHRoYXQgbXVzdCBiZSB2YWxpZGF0ZWQgaGVyZS4iKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM4NiwgNjI1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQxDQotCQkJbG9jYXRpb24gICAJKDI3MTcsIDUyMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkxMzAzDQotCQkJbGFiZWwgICAgICAJDQotfERlcHJlY2F0aW9ucw0KLXxjdXN0b21BdXRoTWVjaFR5cGUgcmVwbGFjZWQgYnkgYXV0aGVudGljYXRpb25NZWNoYW5pc20NCi18YXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHJlcGxhY2VkIGJ5IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtDQotfGRlc2NyaXB0aW9uIHJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zOkxpc3Q8RGVzY3JpcHRpb25UeXBlPg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMzYzDQotCQkgICAgaGVpZ2h0ICAgICAJMjE5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6Ok1lc3NhZ2VMaXN0ZW5lciIgQDQyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzc0LCAzNTM3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJbG9jYXRpb24gICAJKDI0NzcsIDM0NTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlTGlzdGVuZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFQzEwMkZDIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgyNDc3LCAzNTE3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTYxMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6Ok1lc3NhZ2VBZGFwdGVyIiBANDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3OTIsIDMxMzkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDMNCi0JCQlsb2NhdGlvbiAgIAkoMjYyNSwgMzA4OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VBZGFwdGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMkQ2MDFGMSINCi0JCSAgICB3aWR0aCAgICAgIAkzNTINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDQ0DQotCQkgICAgbG9jYXRpb24gICAJKDI3NDYsIDMzMjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFQ0MwMDc3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2VMaXN0ZW5lcnMiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzEsIC00NDYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjUzNCwgMzQwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZUxpc3RlbmVycyINCi0JCQkJcGN0RGlzdCAgICAJMC42NjY2NjcNCi0JCQkJaGVpZ2h0ICAgICAJMjEzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRUNDMDNBMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NDYsIDMzMjIpDQotCQkJCSgyNzQ2LCAzNDQ0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NDYsIDMzMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzQ2LCAzNDQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgyODM4LCAzNDA1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42Nzc3NzgNCi0JCQkJaGVpZ2h0ICAgICAJOTINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1IiBANDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMxLCAtNDQ2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRUNDMDNBNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NDYsIDMzMjIpDQotCQkJCSgyNzQ2LCAzMjAxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NDYsIDMzMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzQ2LCAzMjAxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkFjdGl2YXRpb25TcGVjIiBANDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3NDksIDM5NTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDkNCi0JCQlsb2NhdGlvbiAgIAkoMjQ2OCwgMzg3OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFjdGl2YXRpb25TcGVjIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRjMyMDA0MiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDkNCi0JCQlsb2NhdGlvbiAgIAkoMjQ2OCwgMzkzOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU2MCkNCi0JCSAgICB3aWR0aCAgICAgIAk1ODANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNiIgQDUwDQotCQkgICAgbG9jYXRpb24gICAJKDI3NTMsIDM3NDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGNDgwMDExIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImFjdGl2YXRpb25TcGVjIiBANTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg3LCAtMzcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyDQotCQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQkJbG9jYXRpb24gICAJKDI1NzgsIDM4MzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2FjdGl2YXRpb25TcGVjIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc0MTY1Nw0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGNDkwMTAzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc1MywgMzc0NykNCi0JCQkJKDI3NTMsIDM4NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc1MywgMzc0NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NTMsIDM4NjYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzDQotCQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQkJbG9jYXRpb24gICAJKDI4MDEsIDM4MzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2MTkwNQ0KLQkJCQloZWlnaHQgICAgIAk0OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjciIEA1NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtODcsIC0zNzEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGNDkwMTA1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc1MywgMzc0NykNCi0JCQkJKDI3NTMsIDM2MjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc1MywgMzc0NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NTMsIDM2MjkpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdGlvbkRlZmluaXRpb24iIEA1NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzAyMSwgMTkxNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCWxvY2F0aW9uICAgCSgyNjE4LCAxNzM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTgwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29ubmVjdGlvbkRlZmluaXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE0Q0YwMEYyIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCWxvY2F0aW9uICAgCSgyNjE4LCAxNzk1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJODAzKQ0KLQkJICAgIHdpZHRoICAgICAgCTgyNA0KLQkJICAgIGhlaWdodCAgICAgCTM4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiIEA1Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyMCwgMzEyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCWxvY2F0aW9uICAgCSgxNDc1LCAzMDc1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSW5ib3VuZFJlc291cmNlQWRhcHRlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTFERDAyNTciDQotCQkgICAgd2lkdGggICAgICAJNTA4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA1Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjk1LCAzMTM0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRTM4MDI1RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlQWRhcHRlciIgQDU4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDMxNywgLTYzNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJCWxvY2F0aW9uICAgCSgyNDMxLCAzMDkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdlQWRhcHRlciINCi0JCQkJcGN0RGlzdCAgICAJMC40MjUwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFMzkwMDk0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI5NSwgMzEzNCkNCi0JCQkJKDI2MTYsIDMxMzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI5NSwgMzEzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MTYsIDMxMzQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCVBhcmVudF9WaWV3IAlANTgNCi0JCQkJbG9jYXRpb24gICAJKDI1NjcsIDMxNzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1MTgwMw0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEA2MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTcsIC02MzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzOCwgMzA5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUUzOTAwOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUA1Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjk1LCAzMTM0KQ0KLQkJCQkoMTk3NCwgMzEzNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjk1LCAzMTM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk3NCwgMzEzNCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpBZG1pbk9iamVjdCIgQDYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDI2LCA0MDYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJbG9jYXRpb24gICAJKDczNywgMzk1NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFkbWluT2JqZWN0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBREQ2MDA0QiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQlsb2NhdGlvbiAgIAkoNzM3LCA0MDE1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNTc1KQ0KLQkJICAgIHdpZHRoICAgICAgCTU5Ng0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIiBANjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM3OTgsIDM5MTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQlsb2NhdGlvbiAgIAkoMzUyNywgMzgzMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkQ2MDFBNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQlsb2NhdGlvbiAgIAkoMzUyNywgMzg5MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI5NCkNCi0JCSAgICB3aWR0aCAgICAgIAk1NjANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDY1DQotCQkgICAgbG9jYXRpb24gICAJKDMyNzgsIDM5ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGQUEwMjdGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyIgQDY2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQyMiwgLTU5NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJCWxvY2F0aW9uICAgCSgzMzEyLCAzOTM4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiDQotCQkJCXBjdERpc3QgICAgCTAuMTQ1Njk1DQotCQkJCWhlaWdodCAgICAgCTQ3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkFCMDM0OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDY1DQotCQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMyNzgsIDM5ODQpDQotCQkJCSgzNTE4LCAzOTg0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyNzgsIDM5ODQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTE4LCAzOTg0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJCWxvY2F0aW9uICAgCSgzNDcwLCA0MDMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDEzMjQNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5IiBANjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDIyLCAtNTk3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkFCMDM1MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDY1DQotCQkJICAgIHN1cHBsaWVyICAgCUA0OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMyNzgsIDM5ODQpDQotCQkJCSgzMDM5LCAzOTg0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyNzgsIDM5ODQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDM5LCAzOTg0KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkNvbmZpZ1Byb3BlcnR5IiBANzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM0NiwgMzc3NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCWxvY2F0aW9uICAgCSg1OCwgMzYyMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbmZpZ1Byb3BlcnR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkyMkMwMTg4Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCWxvY2F0aW9uICAgCSg1OCwgMzY4MikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU3MikNCi0JCSAgICB3aWR0aCAgICAgIAk1OTQNCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDcxDQotCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTkwMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTZGMjAxMTciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29uZmlnUHJvcGVydGllcyIgQDcyDQotCQkJICAgIFBhcmVudF9WaWV3IAlANzENCi0JCQkgICAgbG9jYXRpb24gICAJKC0yMTU5LCAtMTUyOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJCWxvY2F0aW9uICAgCSg1NzgsIDMzODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbmZpZ1Byb3BlcnRpZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODgxODUzDQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNkYzMDE2OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDcxDQotCQkJICAgIHN1cHBsaWVyICAgCUA3MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcyMywgMTkwMykNCi0JCQkJKDU0MiwgMTkwMykNCi0JCQkJKDU0MiwgMzYwOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjMsIDE5MDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDIsIDM2MDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0DQotCQkJCVBhcmVudF9WaWV3IAlANzINCi0JCQkJbG9jYXRpb24gICAJKDU5NiwgMzQxOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDc1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzENCi0JCQkgICAgbG9jYXRpb24gICAJKC0yMTU5LCAtMTUyOSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTZGMzAxNzMiDQotCQkJICAgIGNsaWVudCAgICAgCUA3MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MjMsIDE5MDMpDQotCQkJCSgyNjA5LCAxOTAzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcyMywgMTkwMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDksIDE5MDMpKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDc2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzkNCi0JCSAgICBzdXBwbGllciAgIAlANzANCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTI1LCA1MDkwKQ0KLQkJCSgxMjUsIDM5NDQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNSwgNTA5MCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1LCAzOTQ0KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMCIgQDc3DQotCQkgICAgbG9jYXRpb24gICAJKDQ5MSwgNDA3MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQjE0QTAyQjkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29uZmlnUHJvcGVydGllcyIgQDc4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MDQsIC0xNDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoNTQ2LCA0MDMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb25maWdQcm9wZXJ0aWVzIg0KLQkJCQlwY3REaXN0ICAgIAktMC4yNDA4NzYNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUIxNEIwMzQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDkxLCA0MDcxKQ0KLQkJCQkoMzgxLCA0MDcxKQ0KLQkJCQkoMzgxLCAzOTQ1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ5MSwgNDA3MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM4MSwgMzk0NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODANCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoNDM1LCAzOTY5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxIiBAODENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQwNCwgLTE0MykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQjE0QjAzNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANjMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0OTEsIDQwNzEpDQotCQkJCSg3MjgsIDQwNzEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDkxLCA0MDcxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzI4LCA0MDcxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OlNlY3VyaXR5UGVybWlzc2lvbiIgQDgyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAyNTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJbG9jYXRpb24gICAJKDE0OTQsIDI0MjIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVBlcm1pc3Npb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTNDMTAwRjQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJbG9jYXRpb24gICAJKDE0OTQsIDI0ODMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTkyDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiIEA4Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4MSwgMTY1NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCWxvY2F0aW9uICAgCSgxNDUwLCAxNTUxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUExRTYwMjNDIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCWxvY2F0aW9uICAgCSgxNDUwLCAxNjEyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJODYwKQ0KLQkJICAgIHdpZHRoICAgICAgCTg4MA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAODQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU4MSwgMTYyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTREQzAyNkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29ubmVjdGlvbkRlZmluaXRpb25zIiBAODUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTI1LCAtMTgwNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDg1DQotCQkJCWxvY2F0aW9uICAgCSgyNjQ4LCAxNTgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDIwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb25uZWN0aW9uRGVmaW5pdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuMjYyNTQ4DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNEREMDA1QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDg0DQotCQkJICAgIHN1cHBsaWVyICAgCUA1NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI1ODEsIDE2MjIpDQotCQkJCSgyNzQwLCAxNjIyKQ0KLQkJCQkoMjc0MCwgMTcyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTgxLCAxNjIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc0MCwgMTcyMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcNCi0JCQkJUGFyZW50X1ZpZXcgCUA4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY5NCwgMTY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNDM5NTE2DQotCQkJCWhlaWdodCAgICAgCTM0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDg4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODQNCi0JCQkgICAgbG9jYXRpb24gICAJKDkyNSwgLTE4MDcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUE0REQwMDY2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjU4MSwgMTYyMikNCi0JCQkJKDIzMjEsIDE2MjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjU4MSwgMTYyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMjEsIDE2MjIpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6UmVzb3VyY2VBZGFwdGVyIiBAODkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYxMiwgMTA0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCWxvY2F0aW9uICAgCSgxODEsIDc4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlQWRhcHRlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAODkNCi0JCQlsb2NhdGlvbiAgIAkoMTgxLCA4NTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTkNCi0JCQltYXhfd2lkdGggIAk4NjApDQotCQkgICAgd2lkdGggICAgICAJODgwDQotCQkgICAgaGVpZ2h0ICAgICAJNTM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA5MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDYwLCAxNjQzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMzYzMDMwMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJvdXRib3VuZFJlc291cmNlQWRhcHRlciIgQDkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTANCi0JCQkgICAgbG9jYXRpb24gICAJKDQ4MywgLTMyNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxNzQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTAwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitvdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JCQkJcGN0RGlzdCAgICAJMC4yODM0NjUNCi0JCQkJaGVpZ2h0ICAgICAJOTgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUEzNjUwMzY5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDgzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA2MCwgMTY0MykNCi0JCQkJKDE0NDEsIDE2NDMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2MCwgMTY0MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NDEsIDE2NDMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzDQotCQkJCVBhcmVudF9WaWV3IAlAOTENCi0JCQkJbG9jYXRpb24gICAJKDE0MDMsIDE2OTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEA5NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwDQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODMsIC0zMjQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUEzNjUwMzZCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA2MCwgMTY0MykNCi0JCQkJKDEwMDAsIDE2NDMpDQotCQkJCSgxMDAwLCAxMzEzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjAsIDE2NDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAwLCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA5NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDM4DQotCQkgICAgc3VwcGxpZXIgICAJQDg5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI5MSwgNDUwNykNCi0JCQkoMjkxLCAxMzEzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTEsIDQ1MDcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5MSwgMTMxMykpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA5Ng0KLQkJICAgIGxvY2F0aW9uICAgCSg4MzQsIDI1MzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQURDRDAzNkEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5ib3VuZFJlc291cmNlQWRhcHRlciIgQDk3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTYNCi0JCQkgICAgbG9jYXRpb24gICAJKDI1NywgNTY4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4DQotCQkJCVBhcmVudF9WaWV3IAlAOTcNCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDMwNzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0ODkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2luYm91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkJCXBjdERpc3QgICAgCTAuNzgxNzM5DQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRENGMDMxMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk2DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgzNCwgMjUzNSkNCi0JCQkJKDgzNCwgMzEyNCkNCi0JCQkJKDE0NjYsIDMxMjQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODM0LCAyNTM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NiwgMzEyNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0MywgMzE3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDEwMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk2DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTcsIDU2OCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQURDRjAzMTQiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MzQsIDI1MzUpDQotCQkJCSg4MzQsIDEzMTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODM0LCAyNTM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODM0LCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBAMTAxDQotCQkgICAgbG9jYXRpb24gICAJKDc4NywgMjYyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRTAyMDMyMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhZG1pbk9iamVjdHMiIEAxMDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkgICAgbG9jYXRpb24gICAJKDIxMCwgNjU5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithZG1pbk9iamVjdHMiDQotCQkJCXBjdERpc3QgICAgCTAuOTY2NDcyDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUUwNDAxNjAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzg3LCAyNjI2KQ0KLQkJCQkoNzg3LCAzOTQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMjYyNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc4NywgMzk0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0DQotCQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDM5MTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk3ODg2Mw0KLQkJCQloZWlnaHQgICAgIAk2MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEiIEAxMDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkgICAgbG9jYXRpb24gICAJKDIxMCwgNjU5KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRTA0MDE2QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3ODcsIDI2MjYpDQotCQkJCSg3ODcsIDEzMTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAyNjI2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg3LCAxMzEyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAxMDYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ0LCAyNDYxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk0NEMwMEQ2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbmZpZ1Byb3BlcnRpZXMiIEAxMDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNDgsIDEyNDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4DQotCQkJCVBhcmVudF9WaWV3IAlAMTA3DQotCQkJCWxvY2F0aW9uICAgCSgyNDYsIDM0MDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbmZpZ1Byb3BlcnRpZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODIzNzgyDQotCQkJCWhlaWdodCAgICAgCTINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk0NEQwMTk2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0NCwgMjQ2MSkNCi0JCQkJKDI0NCwgMzYwOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDQsIDI0NjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDQsIDM2MDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAzNDk0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTk3MjcNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAxMTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNDgsIDEyNDUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk0NEQwMTk4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA2DQotCQkJICAgIHN1cHBsaWVyICAgCUA4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0NCwgMjQ2MSkNCi0JCQkJKDI0NCwgMTMxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDQsIDI0NjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDQsIDEzMTMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDExMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MzEsIDIxNzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTNDQzAwMUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlQZXJtaXNzaW9ucyIgQDExMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzM5LCA5NTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCWxvY2F0aW9uICAgCSgxMjcxLCAyNDQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDA3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVBlcm1pc3Npb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1MjY4OA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTNDQzAzNjciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTENCi0JCQkgICAgc3VwcGxpZXIgICAJQDgyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTMxLCAyMTc0KQ0KLQkJCQkoOTMxLCAyNDgwKQ0KLQkJCQkoMTQ4NSwgMjQ4MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDIxNzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg1LCAyNDgwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDI1MzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDExNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzM5LCA5NTgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQ0MwMzY5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTExDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzMSwgMjE3NCkNCi0JCQkJKDkzMSwgMTMxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDIxNzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDEzMTMpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxMTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3NzUsIDI2NjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJbG9jYXRpb24gICAJKDI2MzEsIDI1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJbG9jYXRpb24gICAJKDI2MzEsIDI2NDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODQpDQotCQkgICAgd2lkdGggICAgICAJMzA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzYiIEAxMTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg1NiwgMjc4NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZFQzAxQkMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMzc1LCAtMjMwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkJbG9jYXRpb24gICAJKDMwNjYsIDI3MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44Njc5MDYNCi0JCQkJaGVpZ2h0ICAgICAJMzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGRjQwMDE5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzODU2LCAyNzg2KQ0KLQkJCQkoMzg1NiwgMjY4MCkNCi0JCQkJKDI5MjgsIDI2ODApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzg1NiwgMjc4NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDI2ODApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDExOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjk5MCwgMjc1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTQxMjkyDQotCQkJCWhlaWdodCAgICAgCTc4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNyIgQDEyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzM3NSwgLTIzMDgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGRjQwMDI0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE3DQotCQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM4NTYsIDI3ODYpDQotCQkJCSgzODU2LCAzODIwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM4NTYsIDI3ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODU2LCAzODIwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM4IiBAMTIyDQotCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI3MzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUI1QTAzNEEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTIzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyDQotCQkJICAgIGxvY2F0aW9uICAgCSg4ODcsIC0xMDQwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgMjYzNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4OTA0NA0KLQkJCQloZWlnaHQgICAgIAkxMDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFCNjEwMEJGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTkzLCAyNzM0KQ0KLQkJCQkoMjYyMiwgMjczNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkzLCAyNzM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYyMiwgMjczNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1DQotCQkJCVBhcmVudF9WaWV3IAlAMTIzDQotCQkJCWxvY2F0aW9uICAgCSgyNTUwLCAyNzg1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDk3NTYNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM5IiBAMTI2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyDQotCQkJICAgIGxvY2F0aW9uICAgCSg4ODcsIC0xMDQwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBQjYxMDBDOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMg0KLQkJCSAgICBzdXBwbGllciAgIAlANzANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTkzLCAyNzM0KQ0KLQkJCQkoNjQwLCAyNzM0KQ0KLQkJCQkoNjQwLCAzNjA5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExOTMsIDI3MzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDAsIDM2MDkpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDAiIEAxMjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM0OSwgMjYwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUEzMjAyRkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTI4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MzgsIC0yNDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5DQotCQkJCVBhcmVudF9WaWV3IAlAMTI4DQotCQkJCWxvY2F0aW9uICAgCSgzMDgxLCAyNTgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTIuNjg0OTgyDQotCQkJCWhlaWdodCAgICAgCTIxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBQTM0MDAxMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjM0OSwgMjYwMCkNCi0JCQkJKDI2MjIsIDI2MDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0OSwgMjYwMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MjIsIDI2MDApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2MywgMjU1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzgzODgzDQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MSIgQDEzMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM4LCAtMjQwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBQTM0MDAxQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNw0KLQkJCSAgICBzdXBwbGllciAgIAlAODINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzQ5LCAyNjAwKQ0KLQkJCQkoMjA3NywgMjYwMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ5LCAyNjAwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA3NywgMjYwMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIgQDEzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIzMSwgMTA0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzINCi0JCQlsb2NhdGlvbiAgIAkoMTYzMywgODU5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTExOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxNDAwM0NFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMzINCi0JCQlsb2NhdGlvbiAgIAkoMTYzMywgOTIwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJMTE5NCkNCi0JCSAgICB3aWR0aCAgICAgIAkxMjE0DQotCQkgICAgaGVpZ2h0ICAgICAJMzg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDEzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDMzDQotCQkgICAgc3VwcGxpZXIgICAJQDEzMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMjUwLCA1NDkpDQotCQkJKDE4NDYsIDg0NikpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDEzNA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDQxLCAxMzg2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE1NDQwMEZCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIgQDEzNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzg1LCAtMjA0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTksIDEzMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MDkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyINCi0JCQkJcGN0RGlzdCAgICAJMC40NDQ0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMzE4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNTQ1MDI4RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTMyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA0MSwgMTM4NikNCi0JCQkJKDIwNDEsIDEyMzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA0MSwgMTM4NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNDEsIDEyMzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0MiwgMTI1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODM0MzcwDQotCQkJCWhlaWdodCAgICAgCTEwMQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEAxMzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NSwgLTIwNDMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUE1NDUwMjhGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTM0DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNDEsIDEzODYpDQotCQkJCSgyMDQxLCAxNTM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNDEsIDEzODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDQxLCAxNTM5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxMzkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMzOCwgMTA1MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NDEyMDAyOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiIEAxNDANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDc0NiwgLTE2NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDENCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkJbG9jYXRpb24gICAJKDE0MTAsIDEwMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MDkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyINCi0JCQkJcGN0RGlzdCAgICAJMC4yNTMzOTQNCi0JCQkJaGVpZ2h0ICAgICAJMzMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk0MTIwMzkwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTM5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzM4LCAxMDUwKQ0KLQkJCQkoMTYyNCwgMTA1MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzM4LCAxMDUwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyNCwgMTA1MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyDQotCQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJCWxvY2F0aW9uICAgCSgxNTk1LCAxMTA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTg2MDENCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxNDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDc0NiwgLTE2NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTQxMjAzOTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMzOCwgMTA1MCkNCi0JCQkJKDEwNTIsIDEwNTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMzOCwgMTA1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNTIsIDEwNTApKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE0NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkgICAgc3VwcGxpZXIgICAJQDEzMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMDc4LCA3MzQpDQotCQkJKDI3NjUsIDg0NikpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDE0NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNzM0LCAxNzAzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBOEEyMDAxRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAxNDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIC04MDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3DQotCQkJCVBhcmVudF9WaWV3IAlAMTQ2DQotCQkJCWxvY2F0aW9uICAgCSgwLCAyODMwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTYuNTYwOTc2DQotCQkJCWhlaWdodCAgICAgCTIwNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQThBMzAwMzMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM3MzQsIDE3MDMpDQotCQkJCSgzNzM0LCAyNjI1KQ0KLQkJCQkoMjkyOCwgMjYyNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzM0LCAxNzAzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkyOCwgMjYyNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4DQotCQkJCVBhcmVudF9WaWV3IAlAMTQ2DQotCQkJCWxvY2F0aW9uICAgCSgyOTkzLCAyNTE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45NjIxMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTExDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDE0OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MywgLTgwMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQThBMzAwM0QiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM3MzQsIDE3MDMpDQotCQkJCSgzNzM0LCA4NzEpDQotCQkJCSgyODM4LCA4NzEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzczNCwgMTcwMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4MzgsIDg3MSkpKSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvanNwXzJfMC5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qc3BfMl8wLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2ZWI3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qc3BfMl8wLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQ3DQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAianNwIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJKc3AiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImpzcC54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzRTRENEY2OTAzNkIiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkpTUENvbmZpZyINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENEEzQTAxQzgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uDQotfGluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMNCi18dHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4NCi0JICAgICkNCi0JKG9iamVjdCBDbGFzcyAiSlNQUHJvcGVydHlHcm91cCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENEE5NzAzNTMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mDQotfGZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4NCi18QWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gVGhlDQotfGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoNCi18DQotfC0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLiAtIENvbnRyb2wgZW5hYmxpbmcNCi18b2YgU2NyaXB0aW5nIGVsZW1lbnRzLiAtIEluZGljYXRlIHBhZ2VFbmNvZGluZw0KLXxpbmZvcm1hdGlvbi4gLSBJbmRpY2F0aW5nIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUA0KLXxkb2N1bWVudCAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENENDRDAxNDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJsUGF0dGVybiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDREMwMjM2Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbElnbm9yZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0Q0UzMDJCOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQNCi18CXByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiBCeSBkZWZhdWx0LA0KLXwJdGhlIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViDQotfAlBcHBsaWNhdGlvbnMgdXNpbmcgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyDQotfAl3ZWIueG1sLCBhbmQgZGlzYWJsZWQgb3RoZXJ3aXNlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFnZUVuY29kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEQzMzAxMEUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YNCi18CXRoZSBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGENCi18CXRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQNCi18CWVuY29kaW5ncyBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUNCi18CXBhZ2UgZGlyZWN0aXZlIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQDQotfAljb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHBhZ2UuIEl0IGlzDQotfAlhbHNvIGEgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudA0KLXwJZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cgb2YgYSBkb2N1bWVudCBpbiBYTUwNCi18CXN5bnRheCBhbmQgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50DQotfAltYXRjaGluZyB0aGUgZG9jdW1lbnQuIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlDQotfAlzYW1lIGVuY29kaW5nIHRocm91Z2ggbXVsaXRwbGUgbWVjaGFuaXNtcy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NyaXB0aW5nSW52YWxpZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRENTgwM0UzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQ0KLXwJZ3JvdXAgb2YgSlNQIHBhZ2VzLiBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMNCi18CWVuYWJsZWQuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgaW5pdHYgICAgICAJInRydWUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpc1hNTCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDREQkEwMDE4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcw0KLXwJdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsDQotfAlhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuDQotfAlJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QgYmUNCi18CUpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyIHByb3BlcnR5DQotfAlncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgaW5pdHYgICAgICAJImZhbHNlIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVkZVByZWx1ZGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEUxNzAwRUUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhDQotfAljb250ZXh0LXJlbGF0aXZlIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8NCi18CWFuIGVsZW1lbnQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUNCi18CWVsZW1lbnQgaXMgcHJlc2VudCwgdGhlIGdpdmVuIHBhdGggd2lsbCBiZQ0KLXwJYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMgaW4gYW4gaW5jbHVkZQ0KLXwJZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggSlNQIHBhZ2UgaW4NCi18CXRoaXMganNwLXByb3BlcnR5LWdyb3VwLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdWRlQ29kYXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0RTM3MDIzNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQ0KLXwJcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQ0KLXwJV2ViIEFwcGxpY2F0aW9uLiBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsDQotfAl0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQNCi18CShhcyBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoDQotfAlKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlRhZ0xpYlJlZlR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRDMzcwMTQ4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18QSB0YWdsaWIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhIHRhZw0KLXxsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBhIEpTUCBwYWdlIHdpdGhpbiB0aGUgV2ViDQotfEFwcGxpY2F0aW9uLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFnbGliVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEM0QTAyQ0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfCBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQ0KLXwgICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5DQotfCAgICAgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuDQotfCAgICAgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLg0KLXwgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUNCi18ICAgICAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhZ2xpYkxvY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEM0RjAzQjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24NCi18ICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViDQotfCAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5DQotfCAgICAgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENEI1NjAyNDkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidGFnTGlicyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRCNTcwMDc0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJ0YWdMaWJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpzcDo6VGFnTGliUmVmVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRDMzcwMTQ4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRCNTcwMDc2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpzcDo6SlNQQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEEzQTAxQzgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRDOUQwM0RBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInByb3BlcnR5R3JvdXBzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEM5RTAzNEYiDQotCQkgICAgbGFiZWwgICAgICAJInByb3BlcnR5R3JvdXBzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpzcDo6SlNQUHJvcGVydHlHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBOTcwMzUzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDOUUwMzUxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpzcDo6SlNQQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEEzQTAxQzgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkpTUF8yXzAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRGQTIwM0E5Ig0KLQkgICAgdGl0bGUgICAgICAJIkpTUF8yXzAiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJNTMxDQotCSAgICBvcmlnaW5feSAgIAkxNjg0DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUFByb3BlcnR5R3JvdXAiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAxNzkxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNTkxLCAxNTYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTkzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQUHJvcGVydHlHcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEE5NzAzNTMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNTkxLCAxNjIxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJODAwKQ0KLQkJICAgIHdpZHRoICAgICAgCTk0OA0KLQkJICAgIGhlaWdodCAgICAgCTQ4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpqc3A6OlRhZ0xpYlJlZlR5cGUiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDAwLCAxNjgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTczNywgMTU3NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlRhZ0xpYlJlZlR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRDMzcwMTQ4Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE3MzcsIDE2MzUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NDQpDQotCQkgICAgd2lkdGggICAgICAJNTQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpzcDo6SlNQQ29uZmlnIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTE4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDEzODMsIDExMzMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKU1BDb25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA0DQotCQkgICAgbG9jYXRpb24gICAJKDEwNTQsIDExNjgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzlEMDNEQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBANQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3MywgLTE2MTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANg0KLQkJCQlQYXJlbnRfVmlldyAJQDUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTAsIDExMjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzlFMDM1MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNTQsIDExNjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxMTY4KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwcm9wZXJ0eUdyb3VwcyIgQDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzMsIC0xNjEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgNCi0JCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJCWxvY2F0aW9uICAgCSg4MTksIDE1MDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Byb3BlcnR5R3JvdXBzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5OTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDRDOUUwMzRGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANA0KLQkJCSAgICBzdXBwbGllciAgIAlAMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNTQsIDExNjgpDQotCQkJCSg5OTQsIDExNjgpDQotCQkJCSg5OTQsIDE1NDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA1NCwgMTE2OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk5NCwgMTU0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDcNCi0JCQkJbG9jYXRpb24gICAJKDEwNjEsIDE1MDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMjA2MA0KLQkJCQloZWlnaHQgICAgIAk2Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTIyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEI1NjAyNDkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidGFnTGlicyIgQDExDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDkxNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDExDQotCQkJCWxvY2F0aW9uICAgCSgxOTAxLCAxNTE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0YWdMaWJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2Njk5NQ0KLQkJCQloZWlnaHQgICAgIAkxMDYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDRCNTcwMDc0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMDYsIDEyMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDA2LCAxNTYyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDExDQotCQkJCWxvY2F0aW9uICAgCSgyMDcwLCAxNTE0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NTk2MDYNCi0JCQkJaGVpZ2h0ICAgICAJNjQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAxNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA5MTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDRCNTcwMDc2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDA2LCAxMjIyKQ0KLQkJCQkoMjAwNiwgMTE2MikNCi0JCQkJKDE2NjYsIDExNjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjAwNiwgMTIyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDExNjIpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiIEAxNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDExLCAxMjMzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJbG9jYXRpb24gICAJKDY1LCAxMDU0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJbG9jYXRpb24gICAJKDY1LCAxMTU5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNDM3KQ0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTM4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRDQ0QwMTQ0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxDQotCQkgICAgc3VwcGxpZXIgICAJQDE1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDU4MiwgMTU0OCkNCi0JCQkoNTA5LCAxNTQ4KQ0KLQkJCSg1MDksIDE0MjQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU4MiwgMTU0OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTA5LCAxNDI0KSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGFnbGliXzFfMS5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS90YWdsaWJfMV8xLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjZDU4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS90YWdsaWJfMV8xLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0NDYgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Nw0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInRhZ2xpYiINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgInRhZ2xpYi54bWkiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiVGFnbGliIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMDcwIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJUYWdMaWIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDBFOCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoNCi18DQotfGRlc2NyaXB0aW9uICAgICBhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsDQotfCAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQ0KLXwNCi18ZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhDQotfCAgICAgICAgICAgICAgICBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkDQotfCAgICAgICAgICAgICAgICBieSB0b29scw0KLXwNCi18aWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scw0KLXwNCi18dGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbg0KLXwNCi18c2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlDQotfCAgICAgICAgICAgICAgICB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZQ0KLXwgICAgICAgICAgICAgICAgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwNCi18ICAgICAgICAgICAgICAgIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4DQotfCAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcw0KLXwNCi18dXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliDQotfA0KLXx2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbg0KLXwNCi18bGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24NCi18DQotfHRhZyAgICAgICAgICAgICBvbmUgb3IgbW9yZSB0YWdzIGluIHRoZSB0YWcgbGlicmFyeQ0KLXwNCi18dGFnLWZpbGUgICAgICAgIG9uZSBvciBtb3JlIHRhZyBmaWxlcyBpbiB0aGUgdGFnIGxpYnJhcnkNCi18DQotfGZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcw0KLXwgICAgICAgICAgICAgICAgdGFnIGxpYnJhcnkNCi18DQotfHRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhDQotfAkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWdsaWIsIGZvciB0b29sDQotfAkJY29uc3VtcHRpb24NCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImNvbXBvbmVudCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMTIxMDFGMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YWdMaWJWZXJzaW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkgICAgbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSINCi0JCQkgICAgdmFsdWUgICAgICAJIiNJTVBMSUVEIikpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDE2MCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzY3JpYmVzIHRoaXMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRhZyBsaWJyYXJ5IChkZXdleSBkZWNpbWFsKS4NCi18QHJlZ2V4cCBbMC05XSp7ICIuIlswLTldIH0wLi4zDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImpzcFZlcnNpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZDNUZBMDIyMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZyBsaWJyYXJ5IHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKS4gIERlZmF1bHQgaXMgMS4yDQotfEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMw0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaG9ydE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZDNjAwMDFBNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHZhbHVlIG9mIHRoZSBzaG9ydC1uYW1lIGVsZW1lbnQgaXMgYSBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gRG8gbm90IHVzZSB3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJpIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QzYwNjAwQzkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgaXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZXhhY3Qgc2VtYW50aWNzIG9mIHRoaXMgdGFnbGlicmFyeS4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OndlYi1qc3B0YWdsaWJyYXJ5XzFfMSINCi0JICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwQzEiDQotCSAgICBsYW5ndWFnZSAgIAkiWE1MX0RURCIpDQotCShvYmplY3QgQ2xhc3MgIkpTUFRhZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMTA4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0YWcgZWxlbWVudCBkZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5LiBUaGUgdGFnIGVsZW1lbnQgaGFzIG9uZSBhdHRyaWJ1dGUsIGlkLg0KLXxUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoNCi18bmFtZSAtLSBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lDQotfHRhZy1jbGFzcyAtLSBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcNCi18dGVpLWNsYXNzIC0tIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8NCi18Ym9keS1jb250ZW50IC0tIFRoZSBib2R5IGNvbnRlbnQgdHlwZQ0KLXxkaXNwbGF5LW5hbWUgLS0gQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzDQotfHNtYWxsLWljb24gLS0gT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzDQotfGxhcmdlLWljb24gLS0gT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzDQotfGRlc2NyaXB0aW9uIC0tIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbg0KLXx2YXJpYWJsZSAtLSBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24NCi18YXR0cmlidXRlIC0tIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uDQotfGV4YW1wbGUgLS0gT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGFjdGlvbi4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5NzhFMDBDQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJvZHlDb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QzkwNDAxNkIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy5UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6DQotfA0KLXx0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQkJZGlmZmVyZW50ICJsYW5nYWdlIiwgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLg0KLXwNCi18SlNQIC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheA0KLXwNCi18ZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiQm9keUNvbnRlbnRUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUFCRTk3NDAyN0QiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGFtcGxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5Njc5OTAxODgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTk3RDUwMTI3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkeW5hbWljQXR0cmlidXRlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTlBMTEwMDlEIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIG1vZHVsZSAgICAgCSJDb21wb25lbnQgVmlldzo6d2ViLWpzcHRhZ2xpYnJhcnlfMV8xIg0KLQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDBDMSINCi0JICAgIGxhbmd1YWdlICAgCSJYTUxfRFREIikNCi0JKG9iamVjdCBDbGFzcyAiSlNQVGFnQXR0cmlidXRlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxMTQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZyINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2Qzc2RTAxRjMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkRlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkIChyZXF1aXJlZCkuIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkM3NzIwMTgxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4iDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJydEV4cHJWYWx1ZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkM3NzYwMjA5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXNhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWRhdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbnRpbWUuIChvcHRpb25hbCkNCi18RGVmYXVsdCA9IGZhbHNlDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgaW5pdHYgICAgICAJImZhbHNlIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZnJhZ21lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdCOEFFMDA5NSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OndlYi1qc3B0YWdsaWJyYXJ5XzFfMSINCi0JICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwQzEiDQotCSAgICBsYW5ndWFnZSAgIAkiWE1MX0RURCIpDQotCShvYmplY3QgQ2xhc3MgIkJvZHlDb250ZW50VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOUFCRTk3NDAyN0QiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCwgYWRkZWQgVEFHREVQRU5ERU5ULEVNUFRZLHNjcmlwdGxlc3MsU0NSSVBUTEVTUw0KLXxQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuDQotfFByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuDQotfA0KLXxUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoNCi18DQotfHRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcNCi18ICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5DQotfCAgICAgICAgICAgICAgICBpbiBhIGRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwNCi18ICAgICAgICAgICAgICAgIHN0YXRlbWVudHMuDQotfA0KLXxKU1AgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQDQotfCAgICAgICAgICAgICAgICBzeW50YXguDQotfA0KLXxlbXB0eSAgICAgICAgICAgVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQ0KLXwNCi18c2NyaXB0bGVzcyAgICAgIFRoZSBib2R5IGFjY2VwdHMgb25seSB0ZW1wbGF0ZSB0ZXh0LCBFTA0KLXwgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMsIGFuZCBKU1AgYWN0aW9uIGVsZW1lbnRzLiAgTm8NCi18ICAgICAgICAgICAgICAgIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgYWxsb3dlZC4NCi18SlNQPTANCi18ZW1wdHk9MQ0KLXx0YWdkZXBlbmRlbnQ9Mg0KLXxUQUdERVBFTkRFTlQ9Mw0KLXxFTVBUWT00DQotfHNjcmlwdGxlc3M9NQ0KLXxTQ1JJUFRMRVNTPTYNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhZ2RlcGVuZGVudCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDI4MDcwMkIwIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkpTUCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDI4MTUwMDk0IikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVtcHR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMjgxQTAwMDUiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NyaXB0bGVzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDI4MjAwMkMwIikpKQ0KLQkob2JqZWN0IENsYXNzICJWYWxpZGF0b3IiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTYyQ0EwMTRDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Lg0KLXwNCi0JICAgICkNCi0JKG9iamVjdCBDbGFzcyAiSlNQVmFyaWFibGUiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY1QTkwMEIzIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVHaXZlbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY3RjgwMzg0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbmFtZS1naXZlbiBlbGVtZW50IHByb3ZpZGVzIHRoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLg0KLXwNCi18T25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZUZyb21BdHRyaWJ1dGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2ODQ0MDEzNCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVjbGFyZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY4Q0EwMjk1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQgb3Igbm90LiBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLg0KLXxUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NvcGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTJBMDNBQyINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTY4RkQwMjVEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY4RkQwMjVEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE5FU1RFRD0wDQotfEFUX0JFR0lOPTENCi18QVRfRU5EPTINCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5FU1RFRCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY5MTAwMTA1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQVRfQkVHSU4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTEzMDE2NCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkFUX0VORCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY5MTcwMkQyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkZ1bmN0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNUE4NzU0MDBFNSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoDQotfGZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLg0KLXwNCi18VGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoNCi18DQotfGRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uDQotfA0KLXxkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlDQotfCAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ5IHRvb2xzDQotfA0KLXxpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkDQotfCAgICAgICAgICAgICAgICAgICAgYnkgdG9vbHMNCi18DQotfG5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbg0KLXwNCi18ZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0DQotfCAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24NCi18DQotfGZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmENCi18ICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQ0KLXwgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50DQotfCAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uLg0KLXwNCi18ZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbg0KLXwgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBODc2QTAzNDAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBODc4NzAwNjYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpZ25hdHVyZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTg5OEIwMzlFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YSBMYW5ndWFnZQ0KLXwgICAgICAgIFNwZWNpZmljYXRpb24sIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcw0KLXwgICAgICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhhbXBsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QThBQUUwMzA2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uDQotfCAgICAgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJUYWdGaWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNUE5NkRFMDI5RSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfERlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZA0KLXxhcyBhIC50YWcgZmlsZS4NCi18DQotfFRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6DQotfA0KLXxuYW1lICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUNCi18DQotfHBhdGggICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzDQotfCAgICAgICAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIG9yDQotfAl0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEgdGFnIGxpYnJhcnkgcGFja2FnZWQgaW4NCi18CWEgSkFSLiAgVGhpcyBtdXN0IGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZw0KLXwJZmlsZSByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZSAudGFnDQotfAlmaWxlIHJlc2lkZXMgaW4gYSBKQVIuDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyREU0MDExRSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5NkY4MDNDOCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTk3MEUwMEU0Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGFtcGxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkRGRjAyMkIiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJUbGRFeHRlbnNpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJBOEQwMTZGIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJDRDIwMkM5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJDMkEwMEYxIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkMzODAxRTEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJ0YWciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDE1NiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxNTciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUYWdMaWIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDBFOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInRhZ3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDE1OCINCi0JCSAgICBsYWJlbCAgICAgIAkidGFncyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFRhZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTA4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJhdHRyaWJ1dGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDFCQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxQkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMUJDIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMTQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTYyRTMwMDNBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInZhbGlkYXRvciINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTYyRTMwMzNEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInZhbGlkYXRvciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlZhbGlkYXRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyQ0EwMTRDIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTYyRTMwMzQ3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnTGliIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwRTgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTYzMkUwMUEwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInZhbGlkYXRvckNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjMyRTAzOUYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfGRlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUNCi18dXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Lg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ2YWxpZGF0b3JDbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjMyRTAzRDEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpWYWxpZGF0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NjNGNDAwODIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTYzRjQwMzJCIg0KLQkJICAgIGxhYmVsICAgICAgCSJpbml0UGFyYW1zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpJbml0UGFyYW0iDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA4RTlEMDMyNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2M0Y0MDMyQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlZhbGlkYXRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyQ0EwMTRDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2NEU4MDMyMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsaXN0ZW5lcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2NEU5MDI3OSINCi0JCSAgICBsYWJlbCAgICAgIAkibGlzdGVuZXJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TGlzdGVuZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2NEU5MDI4MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0xpYiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEU4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NjVCRTAwRjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidmFyaWFibGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjVCRjAwRTciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB2YXJpYWJsZSBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGRlZmluZWQgYnkgdGhpcyB0YWcuDQotfEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuDQotfFRoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06DQotfG5hbWUtZ2l2ZW4gLS0gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudA0KLXxuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLg0KLXx2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4NCi18ZGVjbGFyZSAtLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuIFRydWUgaXMgdGhlIGRlZmF1bHQuDQotfHNjb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0Lg0KLXwNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkidmFyaWFibGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVmFyaWFibGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NUE5MDBCMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjVCRjAwRTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QTMwMzFGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInRhZ0NsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjZBNDAyOEEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0YWctY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gVGhpcyBlbGVtZW50IGlzIHJlcXVpcmVkLg0KLXxAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUNCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInRhZ0NsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjZBNDAyQzciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QzIwMTc1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInRlaUNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjZDMzAwNUUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yIHRoaXMgdGFnLiBUaGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4NCi18QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInRlaUNsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjZDMzAwOUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY4OEEwMzY2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4NCi18VGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsOyB0aGUgZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLg0KLXwNCi0JICAgIA0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInZhcmlhYmxlQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2ODhEMDAyQiINCi0JCSAgICBsYWJlbCAgICAgIAkidmFyaWFibGVDbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY4OEQwMDY3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVmFyaWFibGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NUE5MDBCMyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY5OTEwMjczIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTkyMDBFRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHZhbHVlIG9mIHRoZSB0eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuDQotfEZvciBzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ0eXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5Njk5MjAxM0UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWdBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDExNCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNUE4N0NFMDNDNiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJmdW5jdGlvbkNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBODdDRjAzNEYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YQ0KLXwgICAgICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzDQotfCAgICAgICAgdGhlIGZ1bmN0aW9uLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJmdW5jdGlvbkNsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBODdDRjAzNkQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpGdW5jdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3NTQwMEU1Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTVBOTg4MTAwMEMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBOTg4MTAyNUEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTk4ODEwMjgyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMTQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNjdCMzkxMDI3RCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJmdW5jdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdCMzkyMDMyOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZnVuY3Rpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RnVuY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE4NzU0MDBFNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTY3QjM5MjAzMkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUYWdMaWIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDBFOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYiDQotCSAgICBxdWlkICAgICAgIAkiM0U2N0I5RkUwMzRCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U2N0I5RkYwMzkyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdCOUZGMDNCMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlZhbGlkYXRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyQ0EwMTRDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTY3QkFBNDAyQjMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTY3QkFBNTAyOTciDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U2N0JBQTUwMkI1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVmFyaWFibGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NUE5MDBCMyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAiDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJDOTcwMDExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImV4dGVuc2lvbkVsZW1lbnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkM5NzAxQ0EiDQotCQkgICAgbGFiZWwgICAgICAJImV4dGVuc2lvbkVsZW1lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RXh0ZW5zaWJsZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyQzJBMDBGMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkM5NzAxQ0MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUbGRFeHRlbnNpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyQThEMDE2RiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJENTcwMURBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZ1bmN0aW9uRXh0ZW5zaW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJENTgwMTZEIg0KLQkJICAgIGxhYmVsICAgICAgCSJmdW5jdGlvbkV4dGVuc2lvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUbGRFeHRlbnNpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyQThEMDE2RiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkQ1ODAxNzgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpGdW5jdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3NTQwMEU1Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNCINCi0JICAgIHF1aWQgICAgICAgCSIzRUNEMkU1NDAzQzgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidGFnRXh0ZW5zaW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJFNTkwMDcyIg0KLQkJICAgIGxhYmVsICAgICAgCSJ0YWdFeHRlbnNpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGxkRXh0ZW5zaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkE4RDAxNkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJFNTkwMDdDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1QTk2REUwMjlFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNiINCi0JICAgIHF1aWQgICAgICAgCSIzRUNEMkVFMzAwM0YiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidGFnbGliRXh0ZW5zaW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJFRTUwM0QxIg0KLQkJICAgIGxhYmVsICAgICAgCSJ0YWdsaWJFeHRlbnNpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGxkRXh0ZW5zaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkE4RDAxNkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJFRTUwM0RCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnTGliIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwRTgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlRhZ0xpYiINCi0JICAgIHF1aWQgICAgICAgCSIzOUE2QkE4MTAxNTUiDQotCSAgICB0aXRsZSAgICAgIAkiVGFnTGliIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTE5NjINCi0JICAgIG9yaWdpbl95ICAgCTEzMTgNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6Qm9keUNvbnRlbnRUeXBlIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU4OSwgMzY2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjM3NCwgMjMyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQm9keUNvbnRlbnRUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgyMzc0LCAxODIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QUJFOTc0MDI3RCINCi0JCSAgICB3aWR0aCAgICAgIAk0NDgNCi0JCSAgICBoZWlnaHQgICAgIAkzOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzI1NCwgMjIyNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDI5ODMsIDIxMjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgyOTgzLCAyMDc0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTY4RkQwMjVEIg0KLQkJICAgIHdpZHRoICAgICAgCTU2MA0KLQkJICAgIGhlaWdodCAgICAgCTMzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODQsIDU3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTA2LCA0OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkluaXRQYXJhbSIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxNCwgMTk2NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJbG9jYXRpb24gICAJKDY3MCwgMTc4OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkluaXRQYXJhbSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA4RTlEMDMyNSINCi0JCSAgICB3aWR0aCAgICAgIAk1MDYNCi0JCSAgICBoZWlnaHQgICAgIAkzODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyOTUsIDI0MTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgxMTI2LCAyMjg5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgd2lkdGggICAgICAJMzU2DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzgxLCAxNDUzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTI2OCwgMTM3MSkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTI0NA0KLQkJICAgIGhlaWdodCAgICAgCTE4OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFRhZ0F0dHJpYnV0ZSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwMjQsIDE3MjMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxNTc5LCAxNTY3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQVGFnQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTE0Ig0KLQkJICAgIHdpZHRoICAgICAgCTkwOA0KLQkJICAgIGhlaWdodCAgICAgCTMzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBAOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjk3LCAxOTQ5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE5ODgxMDAwQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTcyNywgMjI2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzMCwgMjE1MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYxNTg1NA0KLQkJCQloZWlnaHQgICAgIAkxMzMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1QTk4ODEwMjVBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMTk0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDIyNzcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMjE1NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjI1MDAwDQotCQkJCWhlaWdodCAgICAgCTUwDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMyIgQDEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTcyNywgMjI2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNUE5ODgxMDI4MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjk3LCAxOTQ5KQ0KLQkJCQkoMTI5NywgMTg4OSkNCi0JCQkJKDE1NzAsIDE4ODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMTk0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzAsIDE4ODkpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCAxNzQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2OTkxMDI3MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0eXBlIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE5NywgMjQxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NzQsIDE2MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3R5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNTUxNTg3DQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2OTkyMDBFRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDAzLCAxNzQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwMywgMTU0NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NywgMTU2NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xOTcsIDI0MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2OTkyMDEzRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQwMywgMTc0NSkNCi0JCQkJKDE0MDMsIDE4MDUpDQotCQkJCSgxNTcwLCAxODA1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MDMsIDE3NDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcwLCAxODA1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJLTcuOTI5NTc3DQotCQkJCWhlaWdodCAgICAgCTEwNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BWYXJpYWJsZSIgQDE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDkzLCAxNzEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDI1NzgsIDE1MzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTAzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQVmFyaWFibGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTY1QTkwMEIzIg0KLQkJICAgIHdpZHRoICAgICAgCTEwNDgNCi0JCSAgICBoZWlnaHQgICAgIAkzODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDIwDQotCQkgICAgbG9jYXRpb24gICAJKDIzODcsIDIzNTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U2N0JBQTQwMkIzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjANCi0JCQkgICAgbG9jYXRpb24gICAJKC01OTMsIDYzOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJCWxvY2F0aW9uICAgCSgxNzE1LCAyMzA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNzM2NzM0DQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNjdCQUE1MDI5NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwDQotCQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzg3LCAyMzUxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MywgMjM1MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2NCwgMjQwNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjANCi0JCQkgICAgbG9jYXRpb24gICAJKC01OTMsIDYzOSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTY3QkFBNTAyQjUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzg3LCAyMzUxKQ0KLQkJCQkoMjg1NiwgMjM1MSkNCi0JCQkJKDI4NTYsIDE5MDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM4NywgMjM1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4NTYsIDE5MDUpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEAyNQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU5LCAyMDAyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2ODhBMDM2NiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ2YXJpYWJsZUNsYXNzIiBAMjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxMywgNTMwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3DQotCQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQkJbG9jYXRpb24gICAJKDExOTIsIDE2MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3ZhcmlhYmxlQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuOTMwMTU1DQotCQkJCWhlaWdodCAgICAgCTEzNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njg4RDAwMkIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4NTksIDIwMDIpDQotCQkJCSgxMzI4LCAyMDAyKQ0KLQkJCQkoMTMyOCwgMTU0NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODU5LCAyMDAyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTU0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4NywgMTY2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODg1ODA5DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTMsIDUzMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njg4RDAwNjciDQotCQkJICAgIGNsaWVudCAgICAgCUAyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODU5LCAyMDAyKQ0KLQkJCQkoMjc0OSwgMjAwMikNCi0JCQkJKDI3NDksIDE5MDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1OSwgMjAwMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NDksIDE5MDUpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RXh0ZW5zaWJsZVR5cGUiIEAzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODg3LCAyNTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQlsb2NhdGlvbiAgIAkoNzA2LCAyNDYzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZVR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkMyQTAwRjEiDQotCQkgICAgd2lkdGggICAgICAJMzgwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnRmlsZSIgQDMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTQ2LCAyNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMTYzNCwgMTA5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVGFnRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE5NkRFMDI5RSINCi0JCSAgICB3aWR0aCAgICAgIAk2NDINCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJERTQwMTFFIg0KLQkJICAgIGNsaWVudCAgICAgCUAzMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE2MjUsIDE2MikNCi0JCQkoNDE3LCAxNjIpDQotCQkJKDQxNywgNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI1LCAxNjIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNywgNDgxKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpMaXN0ZW5lciIgQDMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzEyLCAxMDczKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDExODAsIDk3NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyNjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxpc3RlbmVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkJICAgIHdpZHRoICAgICAgCTI4Mg0KLQkJICAgIGhlaWdodCAgICAgCTIyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDM0DQotCQkgICAgbG9jYXRpb24gICAJKDE0MjUsIDEyNzEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkMwMzVBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDM1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNDEsIC0xNjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4NCwgMTIwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkQwMkNGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQyNSwgMTI3MSkNCi0JCQkJKDE0NDEsIDEyNzEpDQotCQkJCSgxNDQxLCAxMTg0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MjUsIDEyNzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQxLCAxMTg0KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsaXN0ZW5lckNsYXNzIiBAMzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MSwgLTE2OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOA0KLQkJCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJCWxvY2F0aW9uICAgCSgxNTEzLCAxMzI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsaXN0ZW5lckNsYXNzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwODY5Ng0KLQkJCQloZWlnaHQgICAgIAk4OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0U2RDAyQTciDQotCQkJICAgIGNsaWVudCAgICAgCUAzNA0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQyNSwgMTI3MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjUsIDEzNTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5DQotCQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQkJbG9jYXRpb24gICAJKDE0NjMsIDEzMDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMzNTQwNA0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpGdW5jdGlvbiIgQDQwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjEsIDE0MTUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoOSwgMTI4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZ1bmN0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3NTQwMEU1Ig0KLQkJICAgIHdpZHRoICAgICAgCTY0Mg0KLQkJICAgIGhlaWdodCAgICAgCTI4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBODc2QTAzNDAiDQotCQkgICAgY2xpZW50ICAgICAJQDQwDQotCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyODEsIDEyNzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4MSwgNjYzKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMCIgQDQyDQotCQkgICAgbG9jYXRpb24gICAJKDk1MCwgMTQ4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE4N0NFMDNDNiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmdW5jdGlvbkNsYXNzIiBANDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjI4LCA3NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDQzDQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAxNDQzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmdW5jdGlvbkNsYXNzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTVBODdDRjAzNEYiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTUwLCAxNDg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1OSwgMTQ4NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyOCwgMTUzOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMSIgQDQ2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkgICAgbG9jYXRpb24gICAJKDYyOCwgNzUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3Q0YwMzZEIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTAsIDE0ODQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDIsIDE0ODQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VmFsaWRhdG9yIiBANDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg0OCwgMTI1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCWxvY2F0aW9uICAgCSg3MzQsIDEyMDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJWYWxpZGF0b3IiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyQ0EwMTRDIg0KLQkJICAgIHdpZHRoICAgICAgCTI0Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA0OA0KLQkJICAgIGxvY2F0aW9uICAgCSg5NTMsIDE1NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYzRjQwMDgyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRQYXJhbXMiIEA0OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSg0MDksIDQ5MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MA0KLQkJCQlQYXJlbnRfVmlldyAJQDQ5DQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE3NDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2luaXRQYXJhbXMiDQotCQkJCXBjdERpc3QgICAgCTAuODUyNzYxDQotCQkJCWhlaWdodCAgICAgCTEzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjNGNDAzMkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OA0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTUzLCAxNTQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTUzLCAxNzc1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ5DQotCQkJCWxvY2F0aW9uICAgCSgxMDA3LCAxNzUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA1Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSg0MDksIDQ5MikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjNGNDAzMkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OA0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MywgMTU0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk1MywgMTMyMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBANTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNSwgMTIyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjMyRTAxQTAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidmFsaWRhdG9yQ2xhc3MiIEA1NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NzEsIDE2NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJCWxvY2F0aW9uICAgCSgxMjMzLCAxMzA5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjkxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit2YWxpZGF0b3JDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC4wNzgwNjcNCi0JCQkJaGVpZ2h0ICAgICAJODcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTYzMkUwMzlGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjE1LCAxMjIyKQ0KLQkJCQkoMTMyMiwgMTIyMikNCi0JCQkJKDEzMjIsIDEzNTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxNSwgMTIyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjIsIDEzNTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2DQotCQkJCVBhcmVudF9WaWV3IAlANTQNCi0JCQkJbG9jYXRpb24gICAJKDEyOTEsIDEyODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5MjU2OA0KLQkJCQloZWlnaHQgICAgIAkzMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDY3MSwgMTY2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MzJFMDNEMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDUzDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Nw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxNSwgMTIyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk3MSwgMTIyMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNiIgQDU4DQotCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDE2OTQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U2N0I5RkUwMzRCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDI2NCwgNDM1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCVBhcmVudF9WaWV3IAlANTkNCi0JCQkJbG9jYXRpb24gICAJKDEwMjksIDIyMzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC45Mjg0NjANCi0JCQkJaGVpZ2h0ICAgICAJMTQ0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNjdCOUZGMDM5MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDU4DQotCQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTExMiwgMTY5NCkNCi0JCQkJKDExNzIsIDE2OTQpDQotCQkJCSgxMTcyLCAyMjc3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMTIsIDE2OTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTcyLCAyMjc3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDU5DQotCQkJCWxvY2F0aW9uICAgCSgxMjI2LCAyMjEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3IiBANjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjY0LCA0MzUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U2N0I5RkYwM0IwIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTExMiwgMTY5NCkNCi0JCQkJKDg5NCwgMTY5NCkNCi0JCQkJKDg5NCwgMTMyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCAxNjk0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk0LCAxMzIyKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFRhZyIgQDYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTk4LCAxMDIxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJbG9jYXRpb24gICAJKDE1MTYsIDg2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFRhZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICB3aWR0aCAgICAgIAk5ODINCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDY0DQotCQkgICAgbG9jYXRpb24gICAJKDE3NjIsIDEzOTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjZBMzAzMUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidGFnQ2xhc3MiIEA2NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzgsIDU5OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDY1DQotCQkJCWxvY2F0aW9uICAgCSgxNjg5LCAxNDMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0YWdDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC4yODMyNjINCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY2QTQwMjhBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDEzOTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzk4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDY1DQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxNDMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzE5MzANCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBANjgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4LCA1OTgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY2QTQwMkM3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANjQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc2MiwgMTM5OCkNCi0JCQkJKDE4MjIsIDEzOTgpDQotCQkJCSgxODIyLCAxMTg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDEzOTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODIyLCAxMTg5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBANjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1OCwgMTQ4MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NkMyMDE3NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0ZWlDbGFzcyIgQDcwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NCwgNjgxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxDQotCQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQkJbG9jYXRpb24gICAJKDE2NDksIDE1MzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNzgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3RlaUNsYXNzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU4OTI4Ng0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjZDMzAwNUUiDQotCQkJICAgIGNsaWVudCAgICAgCUA2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1OCwgMTQ4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDE0ODEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyDQotCQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQkJbG9jYXRpb24gICAJKDE1MzksIDE1MzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEA3Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzQsIDY4MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjZDMzAwOUEiDQotCQkJICAgIGNsaWVudCAgICAgCUA2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODU4LCAxNDgxKQ0KLQkJCQkoMTkyMiwgMTQ4MSkNCi0JCQkJKDE5MjIsIDExODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1OCwgMTQ4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MjIsIDExODkpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE5NzhFMDBDQSINCi0JCSAgICBjbGllbnQgICAgIAlANjMNCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTYyLCA4NTMpDQotCQkJKDE1NjIsIDEwOSkNCi0JCQkoMjg3LCAxMDkpDQotCQkJKDI4NywgNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYyLCA4NTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgNDgxKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJhdHRyaWJ1dGUiIEA3NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDMxLCAxMzcxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMUJBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZXMiIEA3Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDM2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJCWxvY2F0aW9uICAgCSgyMTUxLCAxNTE0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4MDQ4OA0KLQkJCQloZWlnaHQgICAgIAkxMjANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMUJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMzEsIDEzNzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDMxLCAxNTU1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJCWxvY2F0aW9uICAgCSgxOTc4LCAxNTM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEA3OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDM2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MA0KLQkJCQlQYXJlbnRfVmlldyAJQDc5DQotCQkJCWxvY2F0aW9uICAgCSgyMDczLCAxMjI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA3NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMzEsIDEzNzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDMxLCAxMTg4KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAODENCi0JCSAgICBsb2NhdGlvbiAgIAkoMjk0NiwgMTEwNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVCRTAwRjkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidmFyaWFibGVzIiBAODINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MiwgMzA0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzDQotCQkJCVBhcmVudF9WaWV3IAlAODINCi0JCQkJbG9jYXRpb24gICAJKDMxMjgsIDE0NDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3ZhcmlhYmxlcyINCi0JCQkJcGN0RGlzdCAgICAJMC44NTQ2NzENCi0JCQkJaGVpZ2h0ICAgICAJMTIyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NUJGMDBFNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgxDQotCQkJICAgIHN1cHBsaWVyICAgCUAxOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI5NDYsIDExMDQpDQotCQkJCSgzMDA2LCAxMTA0KQ0KLQkJCQkoMzAwNiwgMTUxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ2LCAxMTA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzAwNiwgMTUxOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMzA3NiwgMTM4OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzI2NjQ0DQotCQkJCWhlaWdodCAgICAgCTcwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDg1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDMwNCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVCRjAwRTgiDQotCQkJICAgIGNsaWVudCAgICAgCUA4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NDYsIDExMDQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDg5LCAxMTA0KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRsZEV4dGVuc2lvbiIgQDg2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDIyMjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODYNCi0JCQlsb2NhdGlvbiAgIAkoMzIsIDIxNDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUbGRFeHRlbnNpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkE4RDAxNkYiDQotCQkgICAgd2lkdGggICAgICAJNDk2DQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEA4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg1ODAsIDIzODIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkM5NzAwMTEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZXh0ZW5zaW9uRWxlbWVudHMiIEA4OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDE2MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg4DQotCQkJCWxvY2F0aW9uICAgCSg5MDUsIDI0MDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2V4dGVuc2lvbkVsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkyLjAzNDM0Ng0KLQkJCQloZWlnaHQgICAgIAkxMzENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJDOTcwMUNBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTANCi0JCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjQxLCAyNDcwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC42Mzk5MTMNCi0JCQkJaGVpZ2h0ICAgICAJNTANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxIiBAOTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAxNjEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJDOTcwMUNDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg2DQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDkyDQotCQkgICAgbG9jYXRpb24gICAJKDI5MywgMTg0MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRDU3MDFEQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmdW5jdGlvbkV4dGVuc2lvbnMiIEA5Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTksIDQyNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxOTQsIDIwMjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Z1bmN0aW9uRXh0ZW5zaW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42NDM0OTMNCi0JCQkJaGVpZ2h0ICAgICAJODkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJENTgwMTZEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDg2DQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0LCAyMDc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44MzQxMTENCi0JCQkJaGVpZ2h0ICAgICAJNjYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMzIiBAOTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE5LCA0MjcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJENTgwMTc4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNCIgQDk3DQotCQkgICAgbG9jYXRpb24gICAJKDY4NCwgODMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJFNTQwM0M4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInRhZ0V4dGVuc2lvbnMiIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTI2MiwgNTkyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDQ4NCwgMjIyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFnRXh0ZW5zaW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMS4wMjI5NzINCi0JCQkJaGVpZ2h0ICAgICAJMQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkU1OTAwNzIiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAODYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2ODQsIDgzMikNCi0JCQkJKDY4NCwgMjIyNSkNCi0JCQkJKDUxOSwgMjIyNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODQsIDgzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUxOSwgMjIyNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwDQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMjIwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTQyODM5DQotCQkJCWhlaWdodCAgICAgCTI2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNSIgQDEwMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTI2MiwgNTkyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRTU5MDA3QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY4NCwgODMyKQ0KLQkJCQkoNjg0LCAyMTYpDQotCQkJCSgxNjI1LCAyMTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjg0LCA4MzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjI1LCAyMTYpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnTGliIiBAMTAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjI4LCA1MzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJbG9jYXRpb24gICAJKDk2NywgMzAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVGFnTGliIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJbG9jYXRpb24gICAJKDk2NywgMjUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGNvbXBvbmVudD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEU4Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDINCi0JCQlsb2NhdGlvbiAgIAkoOTY3LCAzNjEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAkwKQ0KLQkJICAgIHdpZHRoICAgICAgCTU0MA0KLQkJICAgIGhlaWdodCAgICAgCTU5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxMDMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMSwgODk1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NEU4MDMyMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsaXN0ZW5lcnMiIEAxMDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDUyNywgNTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1MCwgOTAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTg2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsaXN0ZW5lcnMiDQotCQkJCXBjdERpc3QgICAgCTAuMTAzNDQ4DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjRFOTAyNzkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCA4OTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCA5NjEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4NywgOTQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MTIxMjENCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEAxMDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDUyNywgNTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgODQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMDANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjRFOTAyODMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgODk1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgODI5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0IiBAMTA5DQotCQkgICAgbG9jYXRpb24gICAJKDUwMywgNzU1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U2N0IzOTEwMjdEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZ1bmN0aW9ucyIgQDExMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTcyNSwgMjU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExMA0KLQkJCQlsb2NhdGlvbiAgIAkoNDEwLCAxMTU3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmdW5jdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODAyNDQ0DQotCQkJCWhlaWdodCAgICAgCTM0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNjdCMzkyMDMyOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MDMsIDc1NSkNCi0JCQkJKDQ0MywgNzU1KQ0KLQkJCQkoNDQzLCAxMjcyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUwMywgNzU1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQzLCAxMjcyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJbG9jYXRpb24gICAJKDQ5NywgMTIxNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNSIgQDExMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTcyNSwgMjU1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNjdCMzkyMDMyQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTAyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDMsIDc1NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk1OCwgNzU1KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxMTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoODY5LCA5NTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyRTMwMDNBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInZhbGlkYXRvciIgQDExNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA2MDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTE1DQotCQkJCWxvY2F0aW9uICAgCSg3NTEsIDExMjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3ZhbGlkYXRvciINCi0JCQkJcGN0RGlzdCAgICAJMC43MTY3NjMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkUzMDMzRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDExNA0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg2OSwgOTUzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY5LCAxMTk2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQkJbG9jYXRpb24gICAJKDk1MywgMTE0NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODAzNDY4DQotCQkJCWhlaWdodCAgICAgCTg0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjUsIDYwMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjJFMzAzNDciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg2OSwgOTUzKQ0KLQkJCQkoODY5LCA3OTkpDQotCQkJCSg5NTgsIDc5OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjksIDk1MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk1OCwgNzk5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgInRhZyIgQDExOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA1MTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjANCi0JCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCWxvY2F0aW9uICAgCSgxOTEwLCA0NTkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJ0YWciDQotCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQloZWlnaHQgICAgIAk2MA0KLQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDE1NiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0YWdzIiBAMTIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjM4LCAtMjM0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA1OSwgODExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTA4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0YWdzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODE5MA0KLQkJCQloZWlnaHQgICAgIAk3Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxNTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTkxMCwgNTE4KQ0KLQkJCQkoMTk4NywgNTE4KQ0KLQkJCQkoMTk4NywgODUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MTAsIDUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODcsIDg1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgxOTMzLCA4MTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwNzI0MA0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMCIgQDEyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOCwgLTIzNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDE1ODEsIDQ3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTU3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MTAsIDUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTgsIDUxOCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNiIgQDEyNg0KLQkJICAgIGxvY2F0aW9uICAgCSg2NjUsIDE0NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkVFMzAwM0YiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidGFnbGliRXh0ZW5zaW9ucyIgQDEyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU2MywgOTIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoNTgxLCAyMDU3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzI1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0YWdsaWJFeHRlbnNpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyMjc0Mg0KLQkJCQloZWlnaHQgICAgIAkxNjMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJFRTUwM0QxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY2NSwgMTQ1NikNCi0JCQkJKDY2NSwgMTc4MSkNCi0JCQkJKDQxOCwgMTc4MSkNCi0JCQkJKDQxOCwgMjEyOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjUsIDE0NTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTgsIDIxMjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMzgwLCAyMDY5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45MzU4MDANCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM3IiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTYzLCA5MjIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJFRTUwM0RCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI2DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NjUsIDE0NTYpDQotCQkJCSg2NjUsIDgzMSkNCi0JCQkJKDk1OCwgODMxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY2NSwgMTQ1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk1OCwgODMxKSkpKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS90Y2cucHR5IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGNnLnB0eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MjNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS90Y2cucHR5CisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLiBBTEwgUklHSFRTIFJFU0VSVkVECi0jIFRoaW4gQ2xpZW50IEdlbmVyYXRvciAoVENHKSBwcm9wZXJ0aWVzIGZpbGUKLSMKLShvYmplY3QgUGV0YWwgdmVyc2lvbiA0MikKLQotKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUQ0ciCi0JCW5hbWUgICAgICAgCSJyb3NlSWQiCi0JCXZhbHVlICAgICAgCSI4MzcyNjM2MzYiCi0JKQotCShvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUQ0ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiOTg0NzQ3Mzk0IgotCSkKLQkjCi0JIyBDbGFzcyBwcm9wZXJ0aWVzCi0JIwkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVENHIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSMgQSBkZXNjcmlwdGlvbiB0byB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoaXMgY2xhc3MnIG5hbWUgb24gcGFuZWxzIG9yIHdpdGhpbiB0ZXh0LgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJEaXNwbGF5TmFtZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHVzZXIgcm9sZXMgd2hpY2ggdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJBcHBsaWVzVG9Sb2xlcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIGNsYXNzaWZpY2F0aW9uIG9mIHVzZXIgZXhwZXJpZW5jZSBsZXZlbCB3aGljaCB3b3VsZCB1c2UgdGhpcyB0eXBlCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlVzZXJFeHBlcmllbmNlTGV2ZWwiCi0JCQkJdmFsdWUgICAgICAJKCJVc2VyRXhwTGV2ZWxfU2V0IiAxMDApCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIlVzZXJFeHBMZXZlbF9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQkFTSUMiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDAKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJBRFZBTkNFRCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkVYUEVSVCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMgotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJIyBBIGRlc2NyaXB0aW9uIHRvIHVzZSBmb3IgdGhlIHRpdGxlIG9mIGRldGFpbCBwYW5lbHMgY29udGFpbmluZyBhbiBvYmplY3Qgb2YgdGhpcyBjbGFzcy4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU3RkRGV0YWlsUGFuZWxUaXRsZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBDb250YWlucyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZSBpZCdzIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBhcHBlYXIgb24gdGhlCi0JCQkjIGRlZmF1bHQgZGV0YWlsIHBhbmVsIGZvciB0aGlzIGNsYXNzLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTdGREZXRhaWxQYW5lbEZpZWxkc0luT3JkZXIiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIHRoZSB0aXRsZSBvZiBjb2xsZWN0aW9uIHBhbmVscyBjb250YWluaW5nIGVsZW1lbnRzIG9mIHRoaXMgY2xhc3MuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlN0ZENvbGxlY3Rpb25QYW5lbFRpdGxlIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIENvbnRhaW5zIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlIGlkJ3MgaW4gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIGFwcGVhciBvbiB0aGUKLQkJCSMgZGVmYXVsdCBjb2xsZWN0aW9uIHBhbmVsIGZvciB0aGlzIGNsYXNzLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTdGRDb2xsZWN0aW9uUGFuZWxGaWVsZHNJbk9yZGVyIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEEgc3RyaW5nIGNvbnRhaW5pbmcgYXR0cmlidXRlIG5hbWUgcGFyYW1ldGVyIHNsb3RzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdmFsdWVzIGZyb20gdGhlIGF0dHJpYnV0ZXMuCi0JCQkjIFR5cGljYWxseSB1c2VkIHRvIGNhbGN1bGF0ZSBhIHRyZWUgbm9kZSBkZXNjcmlwdGlvbiBmb3IgYW4gb2JqZWN0LgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJEZXNjcmlwdGlvblBhdHRlcm4iCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSB1cmkgdG8gY29udGVudCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGp1c3QgYWJvdmUgdGhlIGRlc2NyaXB0aW9uIGFyZWEgb2YgdGhlIGRldGFpbCBwYWdlIGZvciB0aGlzIGNsYXNzCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlByZURlc2NyaXB0aW9uSW5jbHVkZVVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIHVyaSB0byBjb250ZW50IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQganVzdCBhYm92ZSB0aGUgZm9ybSBhcmVhIG9mIHRoZSBkZXRhaWwgcGFnZSBmb3IgdGhpcyBjbGFzcwotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJQcmVGb3JtSW5jbHVkZVVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIHVyaSB0byBjb250ZW50IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZvb3RlciBhcmVhIG9mIHRoZSBkZXRhaWwgcGFnZSBmb3IgdGhpcyBjbGFzcwotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJGb290ZXJJbmNsdWRlVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIFdoZXRoZXIgdmlld3Mgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyB0eXBlCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNraXBWaWV3R2VuZXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAlGQUxTRQotCQkJKQotCQkJIyBUaGUgaWNvbiBmaWxlIHVyaSBmb3Igc21hbGwgMTZ4MTYgaWNvbiByZXByZXNlbnRpbmcgdGhpcyBjbGFzcy4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU21hbGxJY29uIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIFRoZSBpY29uIGZpbGUgdXJpIGZvciBsYXJnZSAzMngzMiBpY29uIHJlcHJlc2VudGluZyB0aGlzIGNsYXNzLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJMYXJnZUljb24iCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQW4gYWx0ZXJuYXRlIHVyaSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gd2ViIGFwcCByb290KSB0byBpbmNsdWRlIGFzIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgCi0JCQkjIGRldGFpbCBwYW5lbC4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQWx0RGVzY3JpcHRpb25VUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJKQotCSkKLQkjCi0JIyBDbGFzcyBBdHRyaWJ1dGUgUHJvcGVydGllcwotCSMKLQkob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVENHIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkjIFRoZSBsYWJlbCB0ZXh0IHRvIHVzZSB3aGVuIGRpc3BsYXlpbmcgdGhpcyBhdHRyaWJ1dGUgKHdpdGhvdXQgJzonKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJEaXNwbGF5TmFtZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJJc1JlcXVpcmVkIgotCQkJCXZhbHVlICAgICAgCVRSVUUKLQkJCSkKLQkJCSMgQSBzdHJpbmcgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ3JvdXAgdGhpcyBmaWVsZCB3aXRoIG90aGVyIGZpZWxkcyB3aXRoIHRoZSBzYW1lIGNhdGVnb3J5SWQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQ2F0ZWdvcnlJZCIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHVzZXIgcm9sZXMgd2hpY2ggdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJBcHBsaWVzVG9Sb2xlcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIGNsYXNzaWZpY2F0aW9uIG9mIHVzZXIgZXhwZXJpZW5jZSBsZXZlbCB3aGljaCB3b3VsZCB1c2UgdGhpcyB0eXBlCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlVzZXJFeHBlcmllbmNlTGV2ZWwiCi0JCQkJdmFsdWUgICAgICAJKCJVc2VyRXhwTGV2ZWxfU2V0IiAxMDApCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIlVzZXJFeHBMZXZlbF9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQkFTSUMiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDAKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJBRFZBTkNFRCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkVYUEVSVCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMgotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZFR5cGUiCi0JCQkJdmFsdWUgICAgICAJKCJGaWVsZFR5cGVfU2V0IiA3MSkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbAkJIlRDRyIKLQkJCQluYW1lCQkiRmllbGRUeXBlX1NldCIKLQkJCQl2YWx1ZQkJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJURVhUX0ZJRUxEIgotCQkJCQkJdmFsdWUgICAgICAJNzEKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJURVhUX0FSRUEiCi0JCQkJCQl2YWx1ZSAgICAgIAk3MgotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkNPTUJPX0JPWCIKLQkJCQkJCXZhbHVlICAgICAgCTczCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiTElTVF9CT1giCi0JCQkJCQl2YWx1ZSAgICAgIAk3NAotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkNIRUNLX0JPWCIKLQkJCQkJCXZhbHVlICAgICAgCTc1Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiT1BUSU9OIgotCQkJCQkJdmFsdWUgICAgICAJNzYKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJURVhUX1JFQURfT05MWSIKLQkJCQkJCXZhbHVlICAgICAgCTc3Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQ1VTVE9NIgotCQkJCQkJdmFsdWUgICAgICAJNzgKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJGSUxFIgotCQkJCQkJdmFsdWUgICAgICAJNzkKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJVUkkiCi0JCQkJCQl2YWx1ZSAgICAgIAk4MAotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlBBU1NXT1JEIgotCQkJCQkJdmFsdWUgICAgICAJODEKLQkJCQkJKQotCQkJCSkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiTWF4TGVuZ3RoIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkJvb2xlYW5WYWx1ZUtpbmQiCi0JCQkJdmFsdWUgICAgICAJKCJCb29sZWFuVmFsdWVLaW5kX1NldCIgOTEpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIkJvb2xlYW5WYWx1ZUtpbmRfU2V0IgotCQkJCXZhbHVlCQkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlRSVUVfRkFMU0UiCi0JCQkJCQl2YWx1ZSAgICAgIAk5MQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkVOQUJMRV9ESVNBQkxFIgotCQkJCQkJdmFsdWUgICAgICAJOTIKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJZRVNfTk8iCi0JCQkJCQl2YWx1ZSAgICAgIAk5MwotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIk9OX09GRiIKLQkJCQkJCXZhbHVlICAgICAgCTk0Ci0JCQkJCSkKLQkJCQkpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkNvbHVtbldpZHRoUGVyY2VudCIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJWaXNpYmxlU2l6ZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQWN0aW9uVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkluY2x1ZGVKU1BVUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQWx0RGVzY3JpcHRpb25VUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmFsaWRhdGlvbk1pblZhbHVlIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlZhbGlkYXRpb25NYXhWYWx1ZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJWYWxpZGF0aW9uUGF0dGVybiIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIHRleHQgZGVzY3JpcHRpb24gb2Ygc3BlY2lhbCB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFwcGx5IHRvIHRoaXMgZmllbGQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU3BlY2lhbFZhbGlkYXRpb25SZXFzIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIFRoZSB2YWxpZGF0aW9uIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpYWwgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMgZm9yIHRoaXMgZmllbGQuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNwZWNpYWxWYWxpZGF0aW9uQ2xhc3MiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJKQotCSkKLQkKLQkjCi0JIyBSb2xlIFByb3BlcnRpZXMKLQkjCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRDRyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSMgVGhlIGxhYmVsIHRleHQgdG8gdXNlIHdoZW4gZGlzcGxheWluZyB0aGlzIGF0dHJpYnV0ZSAod2l0aG91dCAnOicpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkRpc3BsYXlOYW1lIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIFNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQgc2hvdWxkIG5vdCBhcHBlYXIgaW4gYW55IHZpZXdzCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNraXBHZW5lcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCUZBTFNFCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIklzUmVxdWlyZWQiCi0JCQkJdmFsdWUgICAgICAJVFJVRQotCQkJKQotCQkJIyBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoaXMgZmllbGQgaW4gdGhlIHRyZWUgaWYgaXQgaXMgYSBjb21wb3NpdGUgZmllbGQgd2l0aCBjYXJkIDAuLjEgb3IgMQotCQkJIyBXaGVuIEZBTFNFLCB0aGUgY29kZSBnZW5lcmF0b3Igc2hvdWxkIGVtYmVkIHRoZSBkZXRhaWwgcGFnZSBvZiB0aGUgY29udGFpbmVkIHR5cGUgd2l0aGluCi0JCQkjIHRoZSBkZXRhaWwgcGFnZSBvZiB0aGUgY29udGFpbmVyIHR5cGUuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNob3dDb21wb3NpdGVJblRyZWUiCi0JCQkJdmFsdWUgICAgICAJVFJVRQotCQkJKQotCQkJIyBXaGVuIFRSVUUsIHRoZSBjb2RlIGdlbmVyYXRvciBzaG91bGQgZW1iZWQgdGhlIGNvbGxlY3Rpb24gcGFnZSBvZiB0aGUgY29udGFpbmVkIHR5cGVzIHdpdGhpbgotCQkJIyB0aGUgcHJvcGVydGllcyBwYWdlIG9mIHRoZSBkZXRhaWwgcGFnZSBvZiB0aGUgY29udGFpbmVyIHR5cGUuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNob3dBc1Byb3BlcnRpZXNQYWdlIgotCQkJCXZhbHVlICAgICAgCUZBTFNFCi0JCQkpCi0JCQkjIEEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgdXNlciByb2xlcyB3aGljaCB0aGlzIGZpZWxkIGlzIHVzZWQgYnkgCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkFwcGxpZXNUb1JvbGVzIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEEgY2xhc3NpZmljYXRpb24gb2YgdXNlciBleHBlcmllbmNlIGxldmVsIHdoaWNoIHdvdWxkIHVzZSB0aGlzIHR5cGUKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVXNlckV4cGVyaWVuY2VMZXZlbCIKLQkJCQl2YWx1ZSAgICAgIAkoIlVzZXJFeHBMZXZlbF9TZXQiIDEwMCkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbAkJIlRDRyIKLQkJCQluYW1lCQkiVXNlckV4cExldmVsX1NldCIKLQkJCQl2YWx1ZQkJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJCQVNJQyIKLQkJCQkJCXZhbHVlICAgICAgCTEwMAotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkFEVkFOQ0VEIgotCQkJCQkJdmFsdWUgICAgICAJMTAxCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiRVhQRVJUIgotCQkJCQkJdmFsdWUgICAgICAJMTAyCi0JCQkJCSkKLQkJCQkpCi0JCQkpCi0JCQkjIEEgc3RyaW5nIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHRoaXMgZmllbGQgd2l0aCBvdGhlciBmaWVsZHMgd2l0aCB0aGUgc2FtZSBjYXRlZ29yeUlkCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkNhdGVnb3J5SWQiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRUeXBlIgotCQkJCXZhbHVlICAgICAgCSgiRmllbGRUeXBlX1NldCIgNzEpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIkZpZWxkVHlwZV9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9GSUVMRCIKLQkJCQkJCXZhbHVlICAgICAgCTcxCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9BUkVBIgotCQkJCQkJdmFsdWUgICAgICAJNzIKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJDT01CT19CT1giCi0JCQkJCQl2YWx1ZSAgICAgIAk3MwotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkxJU1RfQk9YIgotCQkJCQkJdmFsdWUgICAgICAJNzQKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJDSEVDS19CT1giCi0JCQkJCQl2YWx1ZSAgICAgIAk3NQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIk9QVElPTiIKLQkJCQkJCXZhbHVlICAgICAgCTc2Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9SRUFEX09OTFkiCi0JCQkJCQl2YWx1ZSAgICAgIAk3NwotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkNVU1RPTSIKLQkJCQkJCXZhbHVlICAgICAgCTc4Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiRklMRSIKLQkJCQkJCXZhbHVlICAgICAgCTc5Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVVJJIgotCQkJCQkJdmFsdWUgICAgICAJODAKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJQQVNTV09SRCIKLQkJCQkJCXZhbHVlICAgICAgCTgxCi0JCQkJCSkKLQkJCQkpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIk1heExlbmd0aCIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJCb29sZWFuVmFsdWVLaW5kIgotCQkJCXZhbHVlICAgICAgCSgiQm9vbGVhblZhbHVlS2luZF9TZXQiIDkxKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sCQkiVENHIgotCQkJCW5hbWUJCSJCb29sZWFuVmFsdWVLaW5kX1NldCIKLQkJCQl2YWx1ZQkJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJUUlVFX0ZBTFNFIgotCQkJCQkJdmFsdWUgICAgICAJOTEKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJFTkFCTEVfRElTQUJMRSIKLQkJCQkJCXZhbHVlICAgICAgCTkyCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiWUVTX05PIgotCQkJCQkJdmFsdWUgICAgICAJOTMKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJPTl9PRkYiCi0JCQkJCQl2YWx1ZSAgICAgIAk5NAotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJDb2x1bW5XaWR0aFBlcmNlbnQiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmlzaWJsZVNpemUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiSW5jbHVkZUFjdGlvblVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJJbmNsdWRlSlNQVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkFsdERlc2NyaXB0aW9uVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlZhbGlkYXRpb25NaW5WYWx1ZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJWYWxpZGF0aW9uTWF4VmFsdWUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmFsaWRhdGlvblBhdHRlcm4iCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHNwZWNpYWwgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMgdGhhdCBhcHBseSB0byB0aGlzIGZpZWxkCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNwZWNpYWxWYWxpZGF0aW9uUmVxcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBUaGUgdmFsaWRhdGlvbiBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGlzIGZpZWxkLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTcGVjaWFsVmFsaWRhdGlvbkNsYXNzIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCSkKLQkpCi0pCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJhcHBsaWNhdGlvbi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJhcHBsaWNhdGlvbi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTFlMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2ViYXBwbGljYXRpb24uY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTAzNDcgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndlYmFwcGxpY2F0aW9uIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAid2ViYXBwbGljYXRpb24ueG1pIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldlYmFwcGxpY2F0aW9uIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzhDMDc2RDYwM0REIg0KLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjM4RkYzQzE1MDE1MSINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbiINCi0JICAgIHF1aWR1ICAgICAgCSIzOEMwOEYwRjAzOEQiKSkNCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiV2ViQXBwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3INCi18YSB3ZWIgYXBwbGljYXRpb24uDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJjb21wb25lbnQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTVDQTAzRTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXN0cmlidXRhYmxlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzgyRDAyMzEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzIHByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldCBjb250YWluZXIiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCQkgICAgbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCQkgICAgbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJICAgIHZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJCSAgICBuYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQkgICAgdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU3QzIwMTc5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJDb250ZXh0UGFyYW0iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwNzhCNjAyQTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkDQotfFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3OEM2MDJGMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQNCi18VGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDc4REIwMzlBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZA0KLXxUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzhFQTAzMTkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXJ2bGV0Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYSBzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjEwNDAzMDAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmxldE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3OTMwMDA2NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgc2VydmxldC4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvYWRPblN0YXJ0dXAiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3OTU1MDE0NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZSBlbGVtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIExvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIGhpZ2hlciBpbnRlZ2Vycy4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIGl0IGF0IGFueSB0aW1lIGluIHRoZSBzdGFydHVwIHNlcXVlbmNlLg0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiSW50ZWdlciINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlcnZsZXRNYXBwaW5nIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDc5QkQwMkI5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1cmxQYXR0ZXJuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzlERDAzOTEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U2N0MyN0EwMEQ3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlDQotfHNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYg0KLXxhcHBsaWNhdGlvbi4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2Vzc2lvbkNvbmZpZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QTUzMDFCRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2Vzc2lvbi1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXNzaW9uVGltZW91dCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdBNUIwMjA1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdA0KLXwgICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQNCi18ICAgICAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0DQotfCAgICAgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4NCi18ICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcw0KLXwgICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lDQotfCAgICAgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcg0KLXwgICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJpbnQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJNaW1lTWFwcGluZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QTc1MDBGRSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24gYW5kIGEgbWltZSB0eXBlLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdBODMwMDE3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbiBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1pbWVUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0E4QzAxQkYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOiAidGV4dC9wbGFpbiINCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV2VsY29tZUZpbGVMaXN0Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDdBQUQwMUE4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcyBlbGVtZW50cy4iDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVycm9yUGFnZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QUNGMDNFMiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUgb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0FFQjAyQUMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiVGFnTGliUmVmIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDdCMzAwMkU3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBqc3A6OlRhZ0xpYlJlZg0KLXxUaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhZ2xpYlVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdCMzcwMEEyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYNCi18DQotfFRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYi54bWwgZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YWdsaWJMb2NhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdCNEIwMzE4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYNCi18DQotfFRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlY3VyaXR5Q29uc3RyYWludCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QjZBMDJBRSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc3BsYXlOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTg5RDdFODAxMkQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkaXNwbGF5TmFtZXMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIldlYlJlc291cmNlQ29sbGVjdGlvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3Qjg3MDNBQiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2ViUmVzb3VyY2VOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0JBMzAzRDMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdCQjgwMTUyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1cmxQYXR0ZXJuIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTFFQTAzNDUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgc3RlcmVvdHlwZSAJIjEuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImh0dHBNZXRob2QiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MjAyMDEyMyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiSFRUUE1ldGhvZFR5cGVFbnVtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTJFMjAwQzYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJBdXRoQ29uc3RyYWludCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QzgwMDFBMCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdA0KLXxzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlDQotfGNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQNCi18dG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMNCi18ZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkNCi18cmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yDQotfGluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiDQotfGFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwNCi18cm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2Vzcw0KLXx0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUNCi18Y29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzDQotfHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0M5NzAzQjYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18QSBkZXNjcmlwdGlvbiBvZiB0aGUgYXV0aCBjb25zdHJhaW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDN0FBOTQwM0Q5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxBIGxpc3Qgb2Ygcm9sZSBuYW1lcyBmb3IgdGhlIGF1dGggY29uc3RyYWludC4gIEVhY2ggZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlIChhIFN0cmluZykuDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJVc2VyRGF0YUNvbnN0cmFpbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0NCODAwQjAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdDQzYwMDJFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNwb3J0R3VhcmFudGVlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0NEODAzNUYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQ0KLXx0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvciBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MUE5MDE4RiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkxvZ2luQ29uZmlnIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDdEMEYwMDZGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4NCi18bWVjaGFuaXNtLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXV0aE1ldGhvZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdEMTcwMDY2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40ICBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbVZhbHVlcw0KLXwNCi18DQotfFRoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgIkJBU0lDIiwgIkRJR0VTVCIsICJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiQXV0aE1ldGhvZEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFRTBBMkQ4MDI5QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlYWxtTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdEMjYwMzREIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdXRob3JpemF0aW9uTWV0aG9kIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUUwQTQzMDAwMTQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkZvcm1Mb2dpbkNvbmZpZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3RDM5MDI5NiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtTG9naW5QYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0Q0NDAxN0EiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm1FcnJvclBhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3RDU3MDIzNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJJbml0UGFyYW0iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkDQotfFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDhFQjMwMzMwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDhFQzcwMjIxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAZGVwcmVjYXRlZCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA4RUQ5MDFENyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQGRlcHJlY2F0ZWQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlJlc0F1dGhTZXJ2bGV0VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwOUVFQTAyNjUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q09OVEFJTkVSPTANCi18U0VSVkxFVD0xDQotfA0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09OVEFJTkVSIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTkzMDE5NjAyMjYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTRVJWTEVUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTkzMDE5ODAwMEMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXZWJUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEExRjcwMjk0Ig0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJTZXJ2bGV0VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTIzMjAzMTEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwQTI4QzAyQUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMUY3MDI5NCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNsYXNzTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDYwNDIwMEQ1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJKU1BUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBMjY0MDI3MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzBBMjkwMDI1OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEExRjcwMjk0IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAianNwRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMEEyNzYwMzU1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJVUkxQYXR0ZXJuVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBMkM1MDA0MiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1cmxQYXR0ZXJuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwQTJDRjAxMzYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkhUVFBNZXRob2RUeXBlRW51bSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTJFMjAwQzYiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiR0VUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwQTJGQzAwNEIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCAoR0VUIHwgUE9TVCB8Li4uKSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBPU1QiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MjM4MDEzNCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBVVCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUyMzkwMzUyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiREVMRVRFIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTIzQjAwREUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJIRUFEIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTIzQzAzOTMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJPUFRJT05TIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTIzRjAwMTIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJUUkFDRSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUyNDAwMUNDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUm9sZU5hbWVUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBMzQwMDEzOSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyb2xlTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMEEzNDcwMDNGIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV2VsY29tZUZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTVBODAwRTkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2VsY29tZUZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzBBNUIxMDE2RSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiVHJhbnNwb3J0R3VhcmFudGVlVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTA0NjFBOTAxOEYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Tk9ORT0xDQotfElOVEVHUkFMPTINCi18Q09ORklERU5USUFMPTMNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5PTkUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTMwMTgyMDIxNCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOVEVHUkFMIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTkzMDE4MzAzMkQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT05GSURFTlRJQUwiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTMwMThFMDBFNCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODgzRTExMDE1NCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODgzRTNBMDA1OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXJyb3JQYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FDRjAzRTIiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVycm9yQ29kZUVycm9yUGFnZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTg4M0U2QzAyMDkiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4M0U5NDAwQTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkVycm9yUGFnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQ0YwM0UyIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3JDb2RlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4M0U4MjAyQUIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkZpbHRlck1hcHBpbmciDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkIxNEMwM0REIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwgYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEgc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlIGZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSA8ZmlsdGVybmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgPGZpbHRlcj4gZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuDQotfA0KLXxAaW52YXJpYW50IFRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgRmlsdGVyOjpuYW1lIG9mIG9uZSBvZiB0aGUgRmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVybFBhdHRlcm4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCMTg5MDIzNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwYXRjaGVyVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQ0N0UwMzc2Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi40Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEaXNwYXRjaGVyVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ0NUIwMzc2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkZpbHRlciINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGQjE1NTAzQ0MiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVjbGFyZXMgYSBmaWx0ZXIgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMDhFMDM3OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjFCQzAzMkEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlci4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZSBmaWx0ZXIuIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGlzcGF0Y2hlclR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDQ0NUIwMzc2Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkZPUldBUkQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NDY0MDBCQyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOQ0xVREUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NDY3MDNBNSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJFUVVFU1QiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NDY5MDJBRSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVSUk9SIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDQ2QjAxNTIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NkRBMDIzRSIpDQotCShvYmplY3QgQ2xhc3MgIkxvY2FsRW5jb2RpbmdNYXBwaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NkYyMDE3MCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzA1MDFGMCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzA4MDI3NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkhUVFBNZXRob2RUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0U5MzBCMDUwMDY1Ig0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImh0dHBNZXRob2QiDQotCQkgICAgcXVpZCAgICAgICAJIjNFOTMwQjA1MDA2NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQXV0aE1ldGhvZEtpbmQiDQotCSAgICBxdWlkICAgICAgIAkiM0VFMEEyRDgwMjlBIg0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVOU1BFQ0lGSUVEIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUUwQTJGRTAzN0IiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJCQVNJQyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEEzMEYwMzNBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRElHRVNUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUUwQTMxMzAyM0IiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJGT1JNIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUUwQTMxODAxRjIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDTElFTlRfQ0VSVCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEEzMUEwMzkwIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRTYwMjEzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRTgwMDBEIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNvbnRleHRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUNFODAwMEUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIHNlZSBjb250ZXh0UGFyYW1zIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZXh0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6Q29udGV4dFBhcmFtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzhCNjAyQTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRjMwMUEzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRjQwMjZEIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVycm9yUGFnZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0Y0MDI3NyINCi0JCSAgICBsYWJlbCAgICAgIAkiZXJyb3JQYWdlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXJyb3JQYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FDRjAzRTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRjcwMzRFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRjgwM0IzIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImZpbGVMaXN0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUNGODAzQjQiDQotCQkgICAgbGFiZWwgICAgICAJImZpbGVMaXN0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWxjb21lRmlsZUxpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QUFEMDFBOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUNGQjAyODEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTE0IGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IHRhZ0xpYlJlZnMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViQXBwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUNGRDAwQTMiDQotCQkgICAgbGFiZWwgICAgICAJIndlYkFwcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAidGFnTGlicyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRkQwMEE0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYNCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInRhZ0xpYnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlRhZ0xpYlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCMzAwMkU3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExRDAwMDEzNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDAxMDE4RiINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb25zdHJhaW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMDEwMTk5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb25zdHJhaW50cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VjdXJpdHlDb25zdHJhaW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I2QTAyQUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExRDExMDE4OCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDEyMDA2NyINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJsb2dpbkNvbmZpZyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMTIwMDcxIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2dpbkNvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TG9naW5Db25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDBGMDA2RiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUQxNTAxQzAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViQXBwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQxNzAyM0IiDQotCQkgICAgbGFiZWwgICAgICAJIndlYkFwcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAibWltZU1hcHBpbmdzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQxNzAyNDUiDQotCQkgICAgbGFiZWwgICAgICAJIm1pbWVNYXBwaW5ncyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TWltZU1hcHBpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QTc1MDBGRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUQxQjAzMjciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViQXBwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQxQzAxRjIiDQotCQkgICAgbGFiZWwgICAgICAJIndlYkFwcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2Vzc2lvbkNvbmZpZyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMUMwMUYzIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZXNzaW9uQ29uZmlnIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXNzaW9uQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0E1MzAxQkQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMUYwMkFCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjAwMjk4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInNlcnZsZXRNYXBwaW5ncyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjAwMkEyIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0TWFwcGluZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXRNYXBwaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzlCRDAyQjkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjMwMTIwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjQwMkRBIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInNlcnZsZXRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQyNDAyRTQiDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZsZXRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExRDI3MDFEQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjgwMkMyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJzZWN1cml0eVJvbGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQyODAyQ0MiDQotCQkgICAgbGFiZWwgICAgICAJInNlY3VyaXR5Um9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMUZFMDEyRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTIxRUQwMkQ2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlY0NvbnN0cmFpbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUVFMDFFNyINCi0JCSAgICBsYWJlbCAgICAgIAkic2VjQ29uc3RyYWludCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VjdXJpdHlDb25zdHJhaW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I2QTAyQUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIxRUUwMUYxIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJSZXNvdXJjZUNvbGxlY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3Qjg3MDNBQiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTIxRjIwMEU5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlY0NvbnN0cmFpbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUYzMDM5RCINCi0JCSAgICBsYWJlbCAgICAgIAkic2VjQ29uc3RyYWludCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VjdXJpdHlDb25zdHJhaW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I2QTAyQUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiYXV0aENvbnN0cmFpbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUYzMDNBNyINCi0JCSAgICBsYWJlbCAgICAgIAkiYXV0aENvbnN0cmFpbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkF1dGhDb25zdHJhaW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0M4MDAxQTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUY3MDIwOCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWNDb25zdHJhaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjFGODAxRUMiDQotCQkgICAgbGFiZWwgICAgICAJInNlY0NvbnN0cmFpbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInVzZXJEYXRhQ29uc3RyYWludCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIxRjgwMUVEIg0KLQkJICAgIGxhYmVsICAgICAgCSJ1c2VyRGF0YUNvbnN0cmFpbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlVzZXJEYXRhQ29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDQjgwMEIwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMjJBQzAxNEEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmxldCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQUQwMDAxIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJ3ZWJUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjJBRDAwMTUiDQotCQkgICAgbGFiZWwgICAgICAJIndlYlR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMUY3MDI5NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQjUwMUJCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjJCNjAxNDUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJwYXJhbXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMkI2MDE1OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbXMiDQotCQkgICAgbGFiZWwgICAgICAJInBhcmFtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SW5pdFBhcmFtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyMkMwMDE5OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQzEwMjhCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJzZWN1cml0eVJvbGVSZWZzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjJDMTAyOUYiDQotCQkgICAgbGFiZWwgICAgICAJInNlY3VyaXR5Um9sZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDN0EwMDI1QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTIzQUYwMkM0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZpbGVMaXN0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjNCMzAxMTEiDQotCQkgICAgbGFiZWwgICAgICAJImZpbGVMaXN0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWxjb21lRmlsZUxpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QUFEMDFBOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJmaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjNCMzAxMUIiDQotCQkgICAgbGFiZWwgICAgICAJImZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlbGNvbWVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTVBODAwRTkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyNDA5MDE3OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXNDb2xsZWN0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjQwQTAyNTYiDQotCQkgICAgbGFiZWwgICAgICAJInJlc0NvbGxlY3Rpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlJlc291cmNlQ29sbGVjdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCODcwM0FCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIlVSTHMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyNDBBMDI2MCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIHVybFBhdHRlcm4iDQotCQkgICAgbGFiZWwgICAgICAJIlVSTHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlVSTFBhdHRlcm5UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTJDNTAwNDIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyNDg5MDBCRSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsb2dpbkNvbmZpZyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTI0ODkwMzAzIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2dpbkNvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TG9naW5Db25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDBGMDA2RiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJmb3JtTG9naW5Db25maWciDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyNDg5MDMwRCINCi0JCSAgICBsYWJlbCAgICAgIAkiZm9ybUxvZ2luQ29uZmlnIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGb3JtTG9naW5Db25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDM5MDI5NiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiDQotCSAgICBxdWlkICAgICAgIAkiMzkwNDVFNzIwMjA0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImV4Y2VwdGlvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ1RTczMDM2NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLiINCi0JCSAgICBsYWJlbCAgICAgIAkiZXhjZXB0aW9uVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlcnJvclBhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ1RTc0MDFDMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZXJyb3JQYWdlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpFeGNlcHRpb25UeXBlRXJyb3JQYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4M0UxMTAxNTQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ2MEFBMDE4OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2bGV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NjBBQjAyMzQiDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZsZXQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDYwQUIwMkI2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0TWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5QkQwMkI5IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGQjNCMTAxQ0MiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZmlsdGVycyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRkIzQjIwMTIzIg0KLQkJICAgIGxhYmVsICAgICAgCSJmaWx0ZXJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjNCMjAxMkQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOCINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGQjQxNTAyOTgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZmlsdGVyTWFwcGluZ3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCNDE2MDEyNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRmlsdGVyIG1hcHBpbmdzIGRlZmluZWQgZm9yIHRoZSB3ZWIgYXBwIg0KLQkJICAgIGxhYmVsICAgICAgCSJmaWx0ZXJNYXBwaW5ncyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyTWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIxNEMwM0REIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCNDE2MDEyOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkZCNTREMDFFQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsaXN0ZW5lcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCNTRFMDIxNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3RlbmVycyBjb2xsZWN0aW9uIGNvbnRhaW5zIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbnMgaW4gdGhlIHdlYiBhcHAuIg0KLQkJICAgIGxhYmVsICAgICAgCSJsaXN0ZW5lcnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpMaXN0ZW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCNTRFMDIyMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QzAwMjZFMDJEMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJpbml0UGFyYW1zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwMDI2RjAxNjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1WYWx1ZXMNCi18VGhlIGluaXQtcGFyYW1zIGNvbnRhaW4gYSBuYW1lL3ZhbHVlIHBhaXJzIGFzIGluaXRpYWxpemF0aW9uIHBhcmFtcyBmb3IgdGhlIGZpbHRlcg0KLXwNCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SW5pdFBhcmFtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDAyNkYwMTZBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiDQotCSAgICBxdWlkICAgICAgIAkiMzlDMDA1NkEwMjkzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZpbHRlciINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDA1NkIwMzIxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZmlsdGVyIGJlaW5nIG1hcHBlZCINCi0JCSAgICBsYWJlbCAgICAgIAkiZmlsdGVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDA1NkIwMzJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXJNYXBwaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE0QzAzREQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM2Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QzAwNUJCMDBCOSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2bGV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwMDVCQzAwNEQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkFuIG9wdGlvbmFsIHNlcnZsZXQgdGhhdCBpcyBtYXBwZWQgYnkgYSBmaWx0ZXIgbWFwcGluZy4gIHNlcnZsZXROYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmxldCByZWZlcmVuY2UuIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzciDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAwNUJDMDA2MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyTWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIxNEMwM0REIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOCINCi0JICAgIHF1aWQgICAgICAgCSIzOUMwM0MyODAzNTYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZmlsdGVyQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAzQzI5MDI2NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4iDQotCQkgICAgbGFiZWwgICAgICAJImZpbHRlckNsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwM0MyOTAyOEYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZpbHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIxNTUwM0NDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MCINCi0JICAgIHF1aWQgICAgICAgCSIzOUMwM0U2QzAzNUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibGlzdGVuZXJDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDNFNkQwMkE3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4iDQotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVyQ2xhc3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDEiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAzRTZEMDJDRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Okxpc3RlbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjI2MDAxQkQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5OTgyQTJFMDI1NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJydW5BcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5ODJBMkYwMTg0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJJZiBkZWZpbmVkIGZvciBhIHNlcnZsZXQsIG92ZXJyaWRlcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdXNlZCB0byBjYWxsIGFuIEVKQiBieSB0aGF0IHNlcnZsZXQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSByb2xlLW5hbWUgaXMgb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBhbHJlYWR5IGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiINCi0JCSAgICBsYWJlbCAgICAgIAkicnVuQXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSdW5Bc1NwZWNpZmllZElkZW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkM5RTAyQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5ODJBMkYwMThFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MkNBMDI3RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb250ZXh0UGFyYW1zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDJDQjAxMTgiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRleHRQYXJhbXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQyQ0IwMTIyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDQzQUEwMDBBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImluaXRQYXJhbVZhbHVlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzQUEwMjQ1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMNCi18ICAgICAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJImluaXRQYXJhbVZhbHVlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDNBQTAyNEYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZpbHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIxNTUwM0NDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDZFNzAzODciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQ2RTkwMDA1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJpbml0UGFyYW1zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NkU5MDAxOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENEJGRjAxQzAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAianNwQ29uZmlnIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEMwMDAyMjUiDQotCQkgICAgbGFiZWwgICAgICAJImpzcENvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUENvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QzAwMDIyNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTAxMDI2NCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkaXNwbGF5TmFtZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTAyMDI1QiINCi0JCSAgICBsYWJlbCAgICAgIAkiZGlzcGxheU5hbWVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OTIyMDAwRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTEwMjAyNjUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTZBNTAyMjQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU2QTYwMjU3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU2QTYwMjYxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDU3MTQwMzc4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU3MTUwMTM1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJsb2NhbEVuY29kaW5nTWFwcGluZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvY2FsRW5jb2RpbmdNYXBwaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTZGMjAxNzAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU3MTUwMTNGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkRBMDIzRSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTgiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDU3MkMwMDgzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU3MkMwMkRDIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU2REEwMjNFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzJDMDJERSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTUwMDFCRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTUxMDFCRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTE1MTAxREMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlVzZXJEYXRhQ29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDQjgwMEIwIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTE0RDAzMTciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTE0RTAxMDYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEUwMTI0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpBdXRoQ29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDODAwMUEwIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTE0QjAwODkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTE0QjAzQUEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEIwM0M4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJSZXNvdXJjZUNvbGxlY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3Qjg3MDNBQiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjYiDQotCSAgICBxdWlkICAgICAgIAkiM0U5MzBCMTEwMzBCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIkhUVFBzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTkzMEIxMjAwREMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBodHRwTWV0aG9kIg0KLQkJICAgIGxhYmVsICAgICAgCSJIVFRQcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SFRUUE1ldGhvZFR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFOTMwQjA1MDA2NSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJlc0NvbGxlY3Rpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNFOTMwQjEyMDBFNiINCi0JCSAgICBsYWJlbCAgICAgIAkicmVzQ29sbGVjdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViUmVzb3VyY2VDb2xsZWN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJXZWIgQXBwbGljYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDhDODgwMjkyIg0KLQkgICAgdGl0bGUgICAgICAJIldlYiBBcHBsaWNhdGlvbiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAxDQotCQkgICAgbG9jYXRpb24gICAJKDc4MSwgMzExMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDQ1NSwgMjk4NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk2MTcNCi0JCQlsYWJlbCAgICAgIAkNCi18dGhlIHNlcnZsZXQgY2xhc3MgcmVmZXJlbmNlIGlzIHJlc29sdmVkIHZpYSBCZWFucy5pbnN0YW50aWF0ZSgpLA0KLXx0aGlzIGlzIHByb2JhYmx5IGEgcmVmZXJlbmNlIHRvIGEgSmF2YUJlYW4gb2JqZWN0DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTY3Nw0KLQkJICAgIGhlaWdodCAgICAgCTI2NCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXRUeXBlIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMjgzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDEzMjAsIDI3NTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2bGV0VHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjMyMDMxMSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxMzIwLCAyODEyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzk3KQ0KLQkJICAgIHdpZHRoICAgICAgCTQxOA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SlNQVHlwZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwMDAsIDI4MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxODQzLCAyNzUxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjY0MDI3MyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxODQzLCAyODEyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzEzKQ0KLQkJICAgIHdpZHRoICAgICAgCTMzMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXJyb3JDb2RlRXJyb3JQYWdlIiBANA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCA5NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgzOSwgODc5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXJyb3JDb2RlRXJyb3JQYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzRTZDMDIwOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgzOSwgOTQwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzY5KQ0KLQkJICAgIHdpZHRoICAgICAgCTQyMA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTI1LCAxNDMxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoODM0LCAxMzY4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU0Ng0KLQkJCWxhYmVsICAgICAgCQ0KLXxERVBSRUNBVEVEOg0KLXxDb250ZXh0UGFyYW0NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHdpZHRoICAgICAgCTYwNg0KLQkJICAgIGhlaWdodCAgICAgCTEzOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjk4NywgODQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgyNzkwLCA3NjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKTkRJRW52UmVmc0dyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQxMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDE1MjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSg1NzYsIDE0NDMpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXhjZXB0aW9uVHlwZUVycm9yUGFnZSIgQDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDIwNSwgMTE2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODNFMTEwMTU0Ig0KLQkJICAgIHdpZHRoICAgICAgCTUwNA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAOQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1ODgsIDEzNTQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDVFNzIwMjA0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImV4Y2VwdGlvblR5cGUiIEAxMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzIsIDQxMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSg0MTcsIDEzOTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0ODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2V4Y2VwdGlvblR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNTU1NTU2DQotCQkJCWhlaWdodCAgICAgCTE3Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NUU3MzAzNjQiDQotCQkJICAgIGNsaWVudCAgICAgCUA5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTg4LCAxMzU0KQ0KLQkJCQkoNTg4LCAxNDMxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU4OCwgMTM1NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMTQzMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxNDIzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVycm9yUGFnZSIgQDEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMiwgNDEwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ1RTc0MDFDMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1ODgsIDEzNTQpDQotCQkJCSg1ODgsIDEyNzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTg4LCAxMzU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg4LCAxMjc4KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6Rm9ybUxvZ2luQ29uZmlnIiBAMTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM5MzYsIDI0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQlsb2NhdGlvbiAgIAkoMzcwNCwgMjM0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZvcm1Mb2dpbkNvbmZpZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDM5MDI5NiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQlsb2NhdGlvbiAgIAkoMzcwNCwgMjQwMykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ2MykNCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlR5cGUiIEAxNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgMjQ4MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJbG9jYXRpb24gICAJKDE2NzQsIDI0MjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEExRjcwMjk0Ig0KLQkJICAgIHdpZHRoICAgICAgCTIyMg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE2DQotCQkgICAgbG9jYXRpb24gICAJKDE3NzYsIDI2MzUpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDE1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE3NzYsIDI2MzUpDQotCQkJKDE3NzYsIDI1NDMpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyOTAwMjU4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDE1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE5NDksIDI3MzkpDQotCQkJKDE5NDksIDI2MzUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDksIDI3MzkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDksIDI2MzUpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTYpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjhDMDJBRCINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTE5LCAyNzM5KQ0KLQkJCSgxNTE5LCAyNjM1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTE5LCAyNzM5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE5LCAyNjM1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE2KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZVJlZiIgQDE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDE3ODIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQlsb2NhdGlvbiAgIAkoNDQsIDE2MDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDQ0LCAxNzA4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTQxMg0KLQkJICAgIGhlaWdodCAgICAgCTM4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TG9jYWxFbmNvZGluZ01hcHBpbmciIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzI0OCwgMjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJbG9jYXRpb24gICAJKDMwMjIsIDE1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxvY2FsRW5jb2RpbmdNYXBwaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkYyMDE3MCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjANCi0JCQlsb2NhdGlvbiAgIAkoMzAyMiwgMjExKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzU2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ3MA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6Q29udGV4dFBhcmFtIiBAMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxMjk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJbG9jYXRpb24gICAJKDk0MywgMTI1NSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjkwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb250ZXh0UGFyYW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzhCNjAyQTYiDQotCQkgICAgd2lkdGggICAgICAJMzA4DQotCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpFcnJvclBhZ2UiIEAyMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCA1OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQlsb2NhdGlvbiAgIAkoMTM2LCA1MTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFcnJvclBhZ2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FDRjAzRTIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDEzNiwgNTcyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzM1KQ0KLQkJICAgIHdpZHRoICAgICAgCTM1NA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDIzDQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgODAwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMDQsIDgwMCkNCi0JCQkoMzA0LCA2ODUpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODNFM0EwMDU4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQ0NywgMTE1MykNCi0JCQkoNDQ3LCA4MDApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTE1MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCA4MDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzRTk0MDBBOCINCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMDksIDg2NykNCi0JCQkoMjA5LCA4MDApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwOSwgODY3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDksIDgwMCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlbGNvbWVGaWxlTGlzdCIgQDI2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAzMjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQlsb2NhdGlvbiAgIAkoMTAwLCAyNzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWxjb21lRmlsZUxpc3QiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FBRDAxQTgiDQotCQkgICAgd2lkdGggICAgICAJMzYyDQotCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpUYWdMaWJSZWYiIEAyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI4MCwgMTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDEwNTcsIDM4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVGFnTGliUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCMzAwMkU3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSgxMDU3LCA5OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ0NCkNCi0JCSAgICB3aWR0aCAgICAgIAk0NjQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCIgQDI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcxMiwgMTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI4DQotCQkJbG9jYXRpb24gICAJKDE1MjgsIDg3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlDb25zdHJhaW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIHdpZHRoICAgICAgCTM4Ng0KLQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TG9naW5Db25maWciIEAyOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0MCwgMTc5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCWxvY2F0aW9uICAgCSgzNDY5LCAxNjYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTc0Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTG9naW5Db25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QwRjAwNkYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI5DQotCQkJbG9jYXRpb24gICAJKDM0NjksIDE3MjIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk3NDEpDQotCQkgICAgd2lkdGggICAgICAJNzYwDQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEAzMA0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTE4LCAyMTMyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyNDg5MDBCRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmb3JtTG9naW5Db25maWciIEAzMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJICAgIGxvY2F0aW9uICAgCSgyOTEsIDI2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJCWxvY2F0aW9uICAgCSg0MTAzLCAyMjYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzI3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmb3JtTG9naW5Db25maWciDQotCQkJCXBjdERpc3QgICAgCTAuNjcxNDk4DQotCQkJCWhlaWdodCAgICAgCTE4NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQ4OTAzMEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzOTE4LCAyMTMyKQ0KLQkJCQkoMzkxOCwgMjMyOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTE4LCAyMTMyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzkxOCwgMjMyOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzk3MiwgMjMwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsb2dpbkNvbmZpZyIgQDM0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzANCi0JCQkgICAgbG9jYXRpb24gICAJKDI5MSwgMjYzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1DQotCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJbG9jYXRpb24gICAJKDQwODksIDIwMzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvZ2luQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMDEzOQ0KLQkJCQloZWlnaHQgICAgIAkxNzENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0ODkwMzAzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzkxOCwgMjEzMikNCi0JCQkJKDM5MTgsIDE5MzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzkxOCwgMjEzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5MTgsIDE5MzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2DQotCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJbG9jYXRpb24gICAJKDM5OTIsIDE5NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyMDc3Nw0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246Ok1pbWVNYXBwaW5nIiBAMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4NDgsIDE4ODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTc4MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1pbWVNYXBwaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBNzUwMEZFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxODQzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzgxKQ0KLQkJICAgIHdpZHRoICAgICAgCTQwMg0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2Vzc2lvbkNvbmZpZyIgQDM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjQwLCAyMzA0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJbG9jYXRpb24gICAJKDI0MzEsIDIyMjMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXNzaW9uQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBNTMwMUJEIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCWxvY2F0aW9uICAgCSgyNDMxLCAyMjg0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDE2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzNg0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldE1hcHBpbmciIEAzOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMjE5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOQ0KLQkJCWxvY2F0aW9uICAgCSgxNzgyLCAyMDg2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldE1hcHBpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzlCRDAyQjkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJbG9jYXRpb24gICAJKDE3ODIsIDIxNDcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNjkpDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0IiBANDANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMjQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MA0KLQkJCWxvY2F0aW9uICAgCSg2NjYsIDIzMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2bGV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MA0KLQkJCWxvY2F0aW9uICAgCSg2NjYsIDIzNzEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk2NTApDQotCQkgICAgd2lkdGggICAgICAJNjcwDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEA0MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDk2LCAyNDc1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkFDMDE0QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJUeXBlIiBANDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzYwLCAxNzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMywgMjUwOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC4xNjY2NjcNCi0JCQkJaGVpZ2h0ICAgICAJMzQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQUQwMDE1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ5NiwgMjQ3NSkNCi0JCQkJKDE2NjUsIDI0NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NiwgMjQ3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjUsIDI0NzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJbG9jYXRpb24gICAJKDE2NDcsIDI1MjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmxldCIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKDc2MCwgMTcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQUQwMDAxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ5NiwgMjQ3NSkNCi0JCQkJKDEzMjcsIDI0NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NiwgMjQ3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjcsIDI0NzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDI1MjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2MzYzNg0KLQkJCQloZWlnaHQgICAgIAk1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDQ3DQotCQkgICAgbG9jYXRpb24gICAJKDE2MDksIDIzNTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDYwQUEwMTg5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXQiIEA0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzksIDE0NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCWxvY2F0aW9uICAgCSgxNDU3LCAyMzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQ1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjU0MzQ3OA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjBBQjAyMzQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANDANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjA5LCAyMzUyKQ0KLQkJCQkoMTMyNywgMjM1MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjA5LCAyMzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyNywgMjM1MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMjQwNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNSIgQDUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zOSwgMTQ0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MEFCMDJCNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MDksIDIzNTIpDQotCQkJCSgxODQ4LCAyMzUyKQ0KLQkJCQkoMTg0OCwgMjMxMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjA5LCAyMzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0OCwgMjMxMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDUyDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMjI5MykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMDAxOTkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlSb2xlUmVmcyIgQDUzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANTINCi0JCQkgICAgbG9jYXRpb24gICAJKC02ODgsIC0xMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NA0KLQkJCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJCWxvY2F0aW9uICAgCSg1NTEsIDIwNDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5Um9sZVJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNzcwNDkyDQotCQkJCWhlaWdodCAgICAgCTE4Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMTAyOUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA1Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNjgsIDIyOTMpDQotCQkJCSgzNjgsIDE5NzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzY4LCAyMjkzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY4LCAxOTczKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJCWxvY2F0aW9uICAgCSg0MzksIDIxNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM3NzA0OQ0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEA1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjg4LCAtMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoNDY3LCAyMjU3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ1NTI4NQ0KLQkJCQloZWlnaHQgICAgIAk5Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMTAyOEIiDQotCQkJICAgIGNsaWVudCAgICAgCUA1Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANDANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNjgsIDIyOTMpDQotCQkJCSgzNjgsIDIzNTMpDQotCQkJCSg2NTcsIDIzNTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzY4LCAyMjkzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU3LCAyMzUzKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSIgQDU4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCAxNzcwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJbG9jYXRpb24gICAJKDEwNDEsIDE2NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eVJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJbG9jYXRpb24gICAJKDEwNDEsIDE3NDYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzOTEpDQotCQkgICAgd2lkdGggICAgICAJNDEyDQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBANTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzE2LCAxODM1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MzJBMDA1QyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEA2MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzcyLCAxMzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjENCi0JCQkJUGFyZW50X1ZpZXcgCUA2MA0KLQkJCQlsb2NhdGlvbiAgIAkoNTQxLCAxNzg5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MDUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3MTE0MQ0KLQkJCQloZWlnaHQgICAgIAk2Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQjAxQkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA1OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MTYsIDE4MzUpDQotCQkJCSg3MTYsIDE4NTEpDQotCQkJCSg0NDcsIDE4NTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzE2LCAxODM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxODUxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDYwDQotCQkJCWxvY2F0aW9uICAgCSg1ODgsIDE4NTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAk1DQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkibmFtZSA6IFN0cmluZyINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9saW5rZWRTZWN1cml0eVJvbGUiIEA2Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzcyLCAxMzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjQNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODY2LCAxNzI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjAyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbGlua2VkU2VjdXJpdHlSb2xlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk5Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQjAxNkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA1OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MTYsIDE4MzUpDQotCQkJCSg3MTYsIDE4MTkpDQotCQkJCSgxMDMyLCAxODE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxNiwgMTgzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzIsIDE4MTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1DQotCQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQkJbG9jYXRpb24gICAJKDk5OSwgMTg3MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiIEA2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzc4LCA5NjkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjYNCi0JCQlsb2NhdGlvbiAgIAkoNTgxLCA4MTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJhbVZhbHVlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCWxvY2F0aW9uICAgCSg1ODEsIDkyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM5MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MTINCi0JCSAgICBoZWlnaHQgICAgIAkzMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6anNwOjpKU1BDb25maWciIEA2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjg4LCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQlsb2NhdGlvbiAgIAkoNTUxLCAxMTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKU1BDb25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEEzQTAxQzgiDQotCQkgICAgd2lkdGggICAgICAJMjkyDQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uIiBANjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwNDAsIDExNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjgNCi0JCQlsb2NhdGlvbiAgIAkoMjgzNywgMTA2NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMTEwMDFDRiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANjgNCi0JCQlsb2NhdGlvbiAgIAkoMjgzNywgMTE2OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI5NCkNCi0JCSAgICB3aWR0aCAgICAgIAk0MjQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgQDY5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDMyLCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjkNCi0JCQlsb2NhdGlvbiAgIAkoMTc2OSwgMjIxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzExOTM1DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkRBMDIzRSINCi0JCSAgICB3aWR0aCAgICAgIAk1NDQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NiIgQDcwDQotCQkgICAgbG9jYXRpb24gICAJKDI2NTgsIDI2MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTcxNDAzNzgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxFbmNvZGluZ01hcHBpbmdzIiBANzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA0LCAxMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJCWxvY2F0aW9uICAgCSgyNzA0LCAyMDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvY2FsRW5jb2RpbmdNYXBwaW5ncyINCi0JCQkJcGN0RGlzdCAgICAJMC4xMzAyNTINCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDU3MTUwMTM1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjY1OCwgMjYzKQ0KLQkJCQkoMzAxMiwgMjU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJCWxvY2F0aW9uICAgCSgyOTI2LCAzMTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1NTYzMw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTciIEA3NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDQsIDEzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NzE1MDEzRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDcwDQotCQkJICAgIHN1cHBsaWVyICAgCUA2OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI2NTgsIDI2MykNCi0JCQkJKDIzMDQsIDI2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCIgQDc1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAxMTY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc1DQotCQkJbG9jYXRpb24gICAJKDE2NzksIDEwODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJBcHAiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCWxvY2F0aW9uICAgCSgxNjc5LCAxMDM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGNvbXBvbmVudD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCWxvY2F0aW9uICAgCSgxNjc5LCAxMTQ1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDQ3KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ2OA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDU1LCAxMjM3KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0U2MDIxMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEA3Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTM1LCAtMTU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4DQotCQkJCVBhcmVudF9WaWV3IAlANzcNCi0JCQkJbG9jYXRpb24gICAJKDE2MjIsIDExNjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRTgwMDBEIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ1NSwgMTIzNykNCi0JCQkJKDE2NjksIDEyMDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzcNCi0JCQkJbG9jYXRpb24gICAJKDE2NTUsIDEyNjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGV4dHMiIEA4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTM1LCAtMTU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxDQotCQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQkJbG9jYXRpb24gICAJKDEzNjMsIDEyMDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRleHRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM5Njg4Ng0KLQkJCQloZWlnaHQgICAgIAk0OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNFODAwMEUiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDU1LCAxMjM3KQ0KLQkJCQkoMTI0MiwgMTI3MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODINCi0JCQkJUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTMwNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzA3NzUxDQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA4Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA4NjkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRjMwMUEzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDg0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkgICAgbG9jYXRpb24gICAJKDcwNywgLTc1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1DQotCQkJCVBhcmVudF9WaWV3IAlAODQNCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEwMDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRjQwMjZEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA3NSwgODY5KQ0KLQkJCQkoMTY2OSwgMTA4MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYNCi0JCQkJUGFyZW50X1ZpZXcgCUA4NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU5MSwgMTExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlcnJvclBhZ2VzIiBAODcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzA3LCAtNzUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjE1LCA2NTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Vycm9yUGFnZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0Y0MDI3NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNzUsIDg2OSkNCi0JCQkJKDQ4MSwgNjU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSg1MjUsIDcyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDIxLCA3MDkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRjcwMzRFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTANCi0JCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTQ5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyDQotCQkJCVBhcmVudF9WaWV3IAlAOTENCi0JCQkJbG9jYXRpb24gICAJKDE1NTgsIDk0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViQXBwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGODAzQjMiDQotCQkJICAgIGNsaWVudCAgICAgCUA5MA0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDIxLCA3MDkpDQotCQkJCSgxNjY5LCAxMDQ1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJCWxvY2F0aW9uICAgCSgxNTc5LCAxMDU5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbGVMaXN0IiBAOTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxNDkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NA0KLQkJCQlsb2NhdGlvbiAgIAkoNTIzLCA0MDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbGVMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGODAzQjQiDQotCQkJICAgIGNsaWVudCAgICAgCUA5MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDIxLCA3MDkpDQotCQkJCSgzNzQsIDM3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMzg2LCA0MjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1NDk5Mw0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAOTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU4MiwgNjQxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0ZCMDI4MSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDg2LCA0MDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwMywgOTI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0ZEMDBBMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1ODIsIDY0MSkNCi0JCQkJKDE4MTMsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSgxNzQ1LCAxMDExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInRhZ0xpYnMiIEAxMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NiwgNDAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzNCwgMzE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0YWdMaWJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTY0OA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGRDAwQTQiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTgyLCA2NDEpDQotCQkJCSgxMzUxLCAyNjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOSwgMzI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDEwNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA2MDEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMDAwMTM0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDEwNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzMjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2DQotCQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJCWxvY2F0aW9uICAgCSgxODIxLCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMDEwMThGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTksIDYwMSkNCi0JCQkJKDE4NzcsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyMiwgOTY5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnN0cmFpbnRzIiBAMTA4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDMyOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDE4NjksIDM0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29uc3RyYWludHMiDQotCQkJCXBjdERpc3QgICAgCTAuNTU4MDc0DQotCQkJCWhlaWdodCAgICAgCTExNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQwMTAxOTkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc5OSwgNjAxKQ0KLQkJCQkoMTcyMSwgMTgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDE4MzcsIDQwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNDQ5MzU2DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDE4NTQsIDI5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuNjk3MzE3DQotCQkJCWhlaWdodCAgICAgCTExMQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAMTEyDQotCQkgICAgbG9jYXRpb24gICAJKDI3OTgsIDE0NTYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTEwMTg4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDExMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIC00OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJbG9jYXRpb24gICAJKDIyODMsIDEyNDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTIwMDY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEyDQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3OTgsIDE0NTYpDQotCQkJCSgyMTM4LCAxMjQzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJbG9jYXRpb24gICAJKDIxODgsIDEzMTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9naW5Db25maWciIEAxMTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkgICAgbG9jYXRpb24gICAJKDMwLCAtNDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJCWxvY2F0aW9uICAgCSgzMzM5LCAxNTg3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzY5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsb2dpbkNvbmZpZyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTIwMDcxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEyDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3OTgsIDE0NTYpDQotCQkJCSgzNDU5LCAxNjY5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTYNCi0JCQkJbG9jYXRpb24gICAJKDMzNzYsIDE2OTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTE5DQotCQkgICAgbG9jYXRpb24gICAJKDIzOTQsIDE1NDEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTUwMUMwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDEyMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI2MiwgLTQxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJbG9jYXRpb24gICAJKDIxODAsIDEzMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTcwMjNCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzOTQsIDE1NDEpDQotCQkJCSgyMDk1LCAxMzE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJbG9jYXRpb24gICAJKDIwOTQsIDEzODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWltZU1hcHBpbmdzIiBAMTIzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjYyLCAtNDExKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjg2OSwgMTcyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWltZU1hcHBpbmdzIg0KLQkJCQlwY3REaXN0ICAgIAkxLjMwODMxMQ0KLQkJCQloZWlnaHQgICAgIAkxNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMTcwMjQ1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzOTQsIDE1NDEpDQotCQkJCSgyNjkzLCAxNzY5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkJbG9jYXRpb24gICAJKDI2MTUsIDE3NzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzOTgwOA0KLQkJCQloZWlnaHQgICAgIAk1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAMTI2DQotCQkgICAgbG9jYXRpb24gICAJKDIyODgsIDE3NjIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMUIwMzI3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDEyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAtNjIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAyMywgMTQyNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViQXBwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQxQzAxRjIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4OCwgMTc2MikNCi0JCQkJKDE5OTgsIDEzMTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjA3MiwgMTMzMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXNzaW9uQ29uZmlnIiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIC02MjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgyMzYxLCAyMTQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXNzaW9uQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2ODg2Mg0KLQkJCQloZWlnaHQgICAgIAkxNDYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMUMwMUYzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI2DQotCQkJICAgIHN1cHBsaWVyICAgCUAzOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyODgsIDE3NjIpDQotCQkJCSgyNTc5LCAyMjEwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDI0MzcsIDIwODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2NTQ3Nw0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTMzDQotCQkgICAgbG9jYXRpb24gICAJKDE5MzYsIDE2OTMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMUYwMkFCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDEzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDk2LCAtNzIzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3NywgMTM5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViQXBwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyMDAyOTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTkzNiwgMTY5MykNCi0JCQkJKDE5MTMsIDEzMTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OSwgMTM1MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2bGV0TWFwcGluZ3MiIEAxMzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgLTcyMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJbG9jYXRpb24gICAJKDE3ODcsIDIwMzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZsZXRNYXBwaW5ncyINCi0JCQkJcGN0RGlzdCAgICAJMC44NTk3NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTcxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDIwMDJBMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTM2LCAxNjkzKQ0KLQkJCQkoMTk2MCwgMjA3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5DQotCQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJCWxvY2F0aW9uICAgCSgxOTE2LCAxOTc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NDU3MTUNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDE0MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDM3LCAxODA1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDIzMDEyMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxNDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDYzNywgLTY0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJbG9jYXRpb24gICAJKDE2OTEsIDEzODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjQwMkRBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQwDQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzcsIDE4MDUpDQotCQkJCSgxNzk3LCAxMzE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJbG9jYXRpb24gICAJKDE4MDUsIDEzOTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmxldHMiIEAxNDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDYzNywgLTY0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJbG9jYXRpb24gICAJKDEyMzMsIDIyMDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZsZXRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczMDM3OQ0KLQkJCQloZWlnaHQgICAgIAk3Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyNDAyRTQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDANCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQzNywgMTgwNSkNCi0JCQkJKDEwNzcsIDIyOTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NSwgMjI1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODMzMzkwDQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAMTQ3DQotCQkgICAgbG9jYXRpb24gICAJKDE1NjYsIDE0NzEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjcwMURBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBAMTQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTk4LCAtNDE3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3NywgMTMxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjgwMkMyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NjYsIDE0NzEpDQotCQkJCSgxNzQwLCAxMzE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTgsIDEzNzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlSb2xlcyIgQDE1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5OCwgLTQxNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTENCi0JCQkJbG9jYXRpb24gICAJKDE0MDEsIDE1NjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5Um9sZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDI4MDJDQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTY2LCAxNDcxKQ0KLQkJCQkoMTM5MiwgMTYyOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUzDQotCQkJCVBhcmVudF9WaWV3IAlAMTUxDQotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxNjUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDQiIEAxNTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyNiwgMTA2NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MkNBMDI3RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZXh0UGFyYW1zIiBAMTU1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc3LCAtMTAyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NiwgOTgxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZXh0UGFyYW1zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQzNzQzMA0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDJDQjAxMTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyNiwgMTA2NSkNCi0JCQkJKDk4NCwgMTAwNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU3DQotCQkJCVBhcmVudF9WaWV3IAlAMTU1DQotCQkJCWxvY2F0aW9uICAgCSgxMDExLCAxMDYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ1IiBAMTU4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc3LCAtMTAyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MkNCMDEyMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1NA0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzI2LCAxMDY1KQ0KLQkJCQkoMTY2OSwgMTEyNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MCIgQDE1OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjYxLCA2NTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRCRkYwMUMwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImpzcENvbmZpZyIgQDE2MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0MiwgLTUxNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjANCi0JCQkJbG9jYXRpb24gICAJKDgyNywgMzgyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitqc3BDb25maWciDQotCQkJCXBjdERpc3QgICAgCTAuODYxNTE2DQotCQkJCWhlaWdodCAgICAgCTYyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzAwMDIyNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjYxLCA2NTEpDQotCQkJCSg4MDAsIDI4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYyDQotCQkJCVBhcmVudF9WaWV3IAlAMTYwDQotCQkJCWxvY2F0aW9uICAgCSg3NjAsIDMyMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTEuMDEyNDQ3DQotCQkJCWhlaWdodCAgICAgCTU3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MSIgQDE2Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0MiwgLTUxNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEMwMDAyMjciDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI2MSwgNjUxKQ0KLQkJCQkoMTcyMiwgMTAyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE2NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTVDQTAzRTIiDQotCQkgICAgY2xpZW50ICAgICAJQDc1DQotCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjEzOCwgMTA5OCkNCi0JCQkoMjc4MCwgOTA4KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU0IiBAMTY1DQotCQkgICAgbG9jYXRpb24gICAJKDI0ODIsIDExNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU2QTUwMjI0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiIEAxNjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU3OSwgMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJbG9jYXRpb24gICAJKDI1NjIsIDExMjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0MjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2VEZXN0aW5hdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuMjMxODU5DQotCQkJCWhlaWdodCAgICAgCTQ3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkE2MDI1NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDgyLCAxMTY4KQ0KLQkJCQkoMjgyNywgMTE2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY4DQotCQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJCWxvY2F0aW9uICAgCSgyNzY4LCAxMjE5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjc4NTYNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU1IiBAMTY5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDU2QTYwMjYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTY1DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0ODIsIDExNjgpDQotCQkJCSgyMTM4LCAxMTY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU4IiBAMTcwDQotCQkgICAgbG9jYXRpb24gICAJKDE5NzQsIDY3OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTcyQzAwODMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiBAMTcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgLTQ4OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJbG9jYXRpb24gICAJKDIzMDAsIDM3MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ5Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkxLjAxNTM3NA0KLQkJCQloZWlnaHQgICAgIAkyNzkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDU3MkMwMkRDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcwDQotCQkJICAgIHN1cHBsaWVyICAgCUA2OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NzQsIDY3OCkNCi0JCQkJKDIwMjMsIDMzNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJCWxvY2F0aW9uICAgCSgxOTUzLCAzNzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2MTA0NQ0KLQkJCQloZWlnaHQgICAgIAk2NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTkiIEAxNzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDcxLCAtNDg5KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NzJDMDJERSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MA0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTc0LCA2NzgpDQotCQkJCSgxOTI1LCAxMDIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTZWN1cml0eSBDb25zdHJhaW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA4RENCMDIwQSINCi0JICAgIHRpdGxlICAgICAgCSJTZWN1cml0eSBDb25zdHJhaW50Ig0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpIVFRQTWV0aG9kVHlwZUVudW0iIEAxNzUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgMTg0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQlsb2NhdGlvbiAgIAkoNzQsIDE2NDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQTWV0aG9kVHlwZUVudW0iKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQlsb2NhdGlvbiAgIAkoNzQsIDE1OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTJFMjAwQzYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE3NQ0KLQkJCWxvY2F0aW9uICAgCSg3NCwgMTcwNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOA0KLQkJCW1heF93aWR0aCAgCTIyOCkNCi0JCSAgICB3aWR0aCAgICAgIAk0NzgNCi0JCSAgICBoZWlnaHQgICAgIAk1MTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDE3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzQsIDExODcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc2DQotCQkJbG9jYXRpb24gICAJKDU2LCAxMDA5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTMyMQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfHVybFBhdHRlcm4NCi18aHR0cE1ldGhvZA0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgd2lkdGggICAgICAJMzgxDQotCQkgICAgaGVpZ2h0ICAgICAJMzY5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6VHJhbnNwb3J0R3VhcmFudGVlVHlwZSIgQDE3Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc1MiwgNjg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCWxvY2F0aW9uICAgCSgyNTE0LCA1ODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc3DQotCQkJbG9jYXRpb24gICAJKDI1MTQsIDUzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDYxQTkwMThGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQlsb2NhdGlvbiAgIAkoMjUxNCwgNjQ2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzM4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ5NA0KLQkJICAgIGhlaWdodCAgICAgCTMzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIiBAMTc4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTAzLCAxNzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc4DQotCQkJbG9jYXRpb24gICAJKDIyODcsIDQ2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGlzcGxheU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE3OA0KLQkJCWxvY2F0aW9uICAgCSgyMjg3LCAxNjEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NjYpDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpVc2VyRGF0YUNvbnN0cmFpbnQiIEAxNzkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyMDgsIDEyNDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc5DQotCQkJbG9jYXRpb24gICAJKDE3NzIsIDExNDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJVc2VyRGF0YUNvbnN0cmFpbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0NCODAwQjAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE3OQ0KLQkJCWxvY2F0aW9uICAgCSgxNzcyLCAxMjA4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJODc4KQ0KLQkJICAgIHdpZHRoICAgICAgCTg5MA0KLQkJICAgIGhlaWdodCAgICAgCTIyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6QXV0aENvbnN0cmFpbnQiIEAxODANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDgzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODANCi0JCQlsb2NhdGlvbiAgIAkoMTI4MCwgNzMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXV0aENvbnN0cmFpbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0M4MDAxQTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE4MA0KLQkJCWxvY2F0aW9uICAgCSgxMjgwLCA3OTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NTYpDQotCQkgICAgd2lkdGggICAgICAJNDM0DQotCQkgICAgaGVpZ2h0ICAgICAJMjI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZWN1cml0eUNvbnN0cmFpbnQiIEAxODENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDEyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODENCi0JCQlsb2NhdGlvbiAgIAkoODkwLCA1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5Q29uc3RyYWludCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjZBMDJBRSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTgxDQotCQkJbG9jYXRpb24gICAJKDg5MCwgMTExKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQxNA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUyIiBAMTgyDQotCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTAxMDI2NCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkaXNwbGF5TmFtZXMiIEAxODMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODINCi0JCQkgICAgbG9jYXRpb24gICAJKDY5OCwgLTQwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjExOCwgNDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rpc3BsYXlOYW1lcyINCi0JCQkJcGN0RGlzdCAgICAJMC42NzU1MTANCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxMDIwMjVCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzg2LCA4OCkNCi0JCQkJKDIyNzgsIDg4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODYsIDg4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI3OCwgODgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyOCwgMTQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUzIiBAMTg2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTgsIC00MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTEwMjAyNjUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxODINCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3ODYsIDg4KQ0KLQkJCQkoMTI5NSwgODgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc4NiwgODgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCA4OCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDE4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDk3LCAyMzQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRjcwMjA4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY0NvbnN0cmFpbnQiIEAxODgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODcNCi0JCQkgICAgbG9jYXRpb24gICAJKDI1NywgLTU4MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODgNCi0JCQkJbG9jYXRpb24gICAJKDE1OTksIDIwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjQ29uc3RyYWludCINCi0JCQkJcGN0RGlzdCAgICAJMC42NjIxOTINCi0JCQkJaGVpZ2h0ICAgICAJNzMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRjgwMUVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDk3LCAyMzQpDQotCQkJCSgyMDk3LCAxMzUpDQotCQkJCSgxMjk1LCAxMzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA5NywgMjM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NSwgMTM1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxODgNCi0JCQkJbG9jYXRpb24gICAJKDE0NzksIDEyMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzk2NDIxDQotCQkJCWhlaWdodCAgICAgCTE1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ1c2VyRGF0YUNvbnN0cmFpbnQiIEAxOTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODcNCi0JCQkgICAgbG9jYXRpb24gICAJKDI1NywgLTU4MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTENCi0JCQkJbG9jYXRpb24gICAJKDIyOTYsIDk1OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdXNlckRhdGFDb25zdHJhaW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwNTM2OQ0KLQkJCQloZWlnaHQgICAgIAkxOTkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRjgwMUVEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDk3LCAyMzQpDQotCQkJCSgyMDk3LCAxMTM1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwOTcsIDIzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTcsIDExMzUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1MSwgMTA0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTk0DQotCQkgICAgbG9jYXRpb24gICAJKDE0MTIsIDQyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjFGMjAwRTkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjQ29uc3RyYWludCIgQDE5NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzI0LCAtMzYyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU0MCwgMjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWNDb25zdHJhaW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY0ODA2OQ0KLQkJCQloZWlnaHQgICAgIAkxNDkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRjMwMzlEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDEyLCA0MjIpDQotCQkJCSgxMzkxLCA0MjIpDQotCQkJCSgxMzkxLCAxODgpDQotCQkJCSgxMjk1LCAxODgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxMiwgNDIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NSwgMTg4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTUNCi0JCQkJbG9jYXRpb24gICAJKDEzMzAsIDEzNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdXRoQ29uc3RyYWludCIgQDE5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzI0LCAtMzYyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NiwgNjEwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdXRoQ29uc3RyYWludCINCi0JCQkJcGN0RGlzdCAgICAJMC42NjIzOTMNCi0JCQkJaGVpZ2h0ICAgICAJMTUyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUYzMDNBNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQxMiwgNDIyKQ0KLQkJCQkoMTQzNCwgNDIyKQ0KLQkJCQkoMTQzNCwgNzE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTIsIDQyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzQsIDcxOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAwDQotCQkJCVBhcmVudF9WaWV3IAlAMTk4DQotCQkJCWxvY2F0aW9uICAgCSgxNDg4LCA2ODcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDIwMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0NywgMTY5NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQlsb2NhdGlvbiAgIAkoMTExOSwgMTU2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQlsb2NhdGlvbiAgIAkoMTExOSwgMTY4MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI4NCkNCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MCIgQDIwMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxODYwLCAxNjI1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNTAwMUJEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDIwMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ0LCA4ODkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA0DQotCQkJCVBhcmVudF9WaWV3IAlAMjAzDQotCQkJCWxvY2F0aW9uICAgCSgxNjE1LCAxNjk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNTE2MjI0DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTUxMDFCRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMjAxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg2MCwgMTYyNSkNCi0JCQkJKDEzODQsIDE2MjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg2MCwgMTYyNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzODQsIDE2MjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzMiwgMTY3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MSIgQDIwNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ0LCA4ODkpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNTEwMURDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjAyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODYwLCAxNjI1KQ0KLQkJCQkoMjA3MSwgMTYyNSkNCi0JCQkJKDIwNzEsIDEzNjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg2MCwgMTYyNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNzEsIDEzNjEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjIiIEAyMDcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMzMSwgMTI2MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTREMDMxNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyMDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5NSwgNDk1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE0OSwgMTQzNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0OTAwNw0KLQkJCQloZWlnaHQgICAgIAkxNDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNEUwMTA2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjA3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMDENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzMxLCAxMjYzKQ0KLQkJCQkoMTI5MSwgMTI2MykNCi0JCQkJKDEyOTEsIDE1NTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMzMSwgMTI2MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTEsIDE1NTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDIwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM3MiwgMTQ2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzIxODU0DQotCQkJCWhlaWdodCAgICAgCTgxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MyIgQDIxMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCA0OTUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNEUwMTI0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjA3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxODANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzMxLCAxMjYzKQ0KLQkJCQkoMTM3MSwgMTI2MykNCi0JCQkJKDEzNzEsIDk0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzMxLCAxMjYzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgOTQ1KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViUmVzb3VyY2VDb2xsZWN0aW9uIiBAMjEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDcyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMTINCi0JCQlsb2NhdGlvbiAgIAkoMTU4LCA1NzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODY4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJSZXNvdXJjZUNvbGxlY3Rpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIxMg0KLQkJCWxvY2F0aW9uICAgCSgxNTgsIDYzMykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTg5NCkNCi0JCSAgICB3aWR0aCAgICAgIAk4ODYNCi0JCSAgICBoZWlnaHQgICAgIAkzMjANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDIxMw0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDExMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjFFRDAyRDYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjQ29uc3RyYWludCIgQDIxNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAtNjU4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQlsb2NhdGlvbiAgIAkoNzcwLCA3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjQ29uc3RyYWludCINCi0JCQkJcGN0RGlzdCAgICAJMC43MTU3MTkNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRUUwMUU3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0OTQsIDExMCkNCi0JCQkJKDg4MSwgMTEwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTEwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODgxLCAxMTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQlsb2NhdGlvbiAgIAkoODQyLCAxNjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIgQDIxNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAtNjU4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNw0KLQkJCQlsb2NhdGlvbiAgIAkoNjg1LCA1MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYlJlc291cmNlQ29sbGVjdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTM5NjU1DQotCQkJCWhlaWdodCAgICAgCTI1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjFFRTAxRjEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ5NCwgMTEwKQ0KLQkJCQkoNDM0LCAxMTApDQotCQkJCSg0MzQsIDU2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDExMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQzNCwgNTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkJbG9jYXRpb24gICAJKDUwMSwgNDgxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NDc3NjkNCi0JCQkJaGVpZ2h0ICAgICAJNjcNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDIyMA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDE3Ng0KLQkJICAgIHN1cHBsaWVyICAgCUAyMTINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMzczLCAxMDAyKQ0KLQkJCSg0NjYsIDg4MCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NCIgQDIyMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2OTEsIDE0NzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTE0QjAwODkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMjIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDcsIDcyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjINCi0JCQkJbG9jYXRpb24gICAJKDg4OSwgMTYxMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYyNzIwNA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTE0QjAzQUEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY5MSwgMTQ3NCkNCi0JCQkJKDY5MSwgMTY0OCkNCi0JCQkJKDExMTAsIDE2NDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjkxLCAxNDc0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMCwgMTY0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI0DQotCQkJCVBhcmVudF9WaWV3IAlAMjIyDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxNjkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjg3MTUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY1IiBAMjI1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDcsIDcyMikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTE0QjAzQzgiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY5MSwgMTQ3NCkNCi0JCQkJKDY5MSwgODgwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY5MSwgMTQ3NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY5MSwgODgwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTZXJ2bGV0IERlc2NyaXB0b3JzIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA4RTVDMDFGNSINCi0JICAgIHRpdGxlICAgICAgCSJTZXJ2bGV0IERlc2NyaXB0b3JzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkxMjIwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAyMjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgzNywgMjA0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNg0KLQkJCWxvY2F0aW9uICAgCSg2NTksIDE5NzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldFR5cGUiIEAyMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwMDAsIDk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNw0KLQkJCWxvY2F0aW9uICAgCSgxODE4LCAxOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXRUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyMzIwMzExIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMjcNCi0JCQlsb2NhdGlvbiAgIAkoMTgxOCwgNzkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzOTcpDQotCQkgICAgd2lkdGggICAgICAJMzgyDQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpKU1BUeXBlIiBAMjI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxMTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjI4DQotCQkJbG9jYXRpb24gICAJKDEyODYsIDM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjY0MDI3MyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjI4DQotCQkJbG9jYXRpb24gICAJKDEyODYsIDk1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzEzKQ0KLQkJICAgIHdpZHRoICAgICAgCTI5NA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SW5pdFBhcmFtIiBAMjI5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDExMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjI5DQotCQkJbG9jYXRpb24gICAJKDk0LCAxMDExKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkluaXRQYXJhbSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA4RTlEMDMyNSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjI5DQotCQkJbG9jYXRpb24gICAJKDk0LCAxMDcyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTQxMykNCi0JCSAgICB3aWR0aCAgICAgIAk0MDYNCi0JCSAgICBoZWlnaHQgICAgIAkyNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiIEAyMzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMzANCi0JCQlsb2NhdGlvbiAgIAkoMTY0NiwgNTc0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMzANCi0JCQlsb2NhdGlvbiAgIAkoMTY0NiwgNjg5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTM4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViVHlwZSIgQDIzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5MiwgNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMxDQotCQkJbG9jYXRpb24gICAJKDE2OTAsIDM2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldlYlR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTFGNzAyOTQiDQotCQkgICAgd2lkdGggICAgICAJMjIyDQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTI4QzAyQUQiDQotCQkgICAgY2xpZW50ICAgICAJQDIyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMzENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTk0MSwgMTg2KQ0KLQkJCSgxODMyLCAzNTMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTI5MDAyNTgiDQotCQkgICAgY2xpZW50ICAgICAJQDIyOA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMzENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTUzMywgMjAyKQ0KLQkJCSgxNzE2LCAzNTMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UnVuQXNTcGVjaWZpZWRJZGVudGl0eSIgQDIzNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTE2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMzQNCi0JCQlsb2NhdGlvbiAgIAkoMTYyMiwgMTA1NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkM5RTAyQzgiDQotCQkgICAgd2lkdGggICAgICAJNDY4DQotCQkgICAgaGVpZ2h0ICAgICAJMjQyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSIgQDIzNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg0LCAxNjM3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzNQ0KLQkJCWxvY2F0aW9uICAgCSgzMDcsIDE0ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJhbVZhbHVlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMzUNCi0JCQlsb2NhdGlvbiAgIAkoMzA3LCAxNTk5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTMzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDIzNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCAzMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjM2DQotCQkJbG9jYXRpb24gICAJKDE4NiwgMjM1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjM2DQotCQkJbG9jYXRpb24gICAJKDE4NiwgMjk2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNjUwKQ0KLQkJICAgIHdpZHRoICAgICAgCTYzOA0KLQkJICAgIGhlaWdodCAgICAgCTIyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBAMjM3DQotCQkgICAgbG9jYXRpb24gICAJKDM5MywgNzIzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkI1MDFCQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDIzOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIC00MTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5DQotCQkJCVBhcmVudF9WaWV3IAlAMjM4DQotCQkJCWxvY2F0aW9uICAgCSgzMDksIDUzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC42OTg3MTgNCi0JCQkJaGVpZ2h0ICAgICAJODUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQjYwMTQ1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjM3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMzYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzOTMsIDcyMykNCi0JCQkJKDM5MywgNDQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5MywgNzIzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzkzLCA0NDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MA0KLQkJCQlQYXJlbnRfVmlldyAJQDIzOA0KLQkJCQlsb2NhdGlvbiAgIAkoNDY1LCA1MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5ODcxOA0KLQkJCQloZWlnaHQgICAgIAk3Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyYW1zIiBAMjQxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjM3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MywgLTQxMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJbG9jYXRpb24gICAJKDQ4NiwgOTE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJhbXMiDQotCQkJCXBjdERpc3QgICAgCTAuNzA3MTgyDQotCQkJCWhlaWdodCAgICAgCTkzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkI2MDE1OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzkzLCA3MjMpDQotCQkJCSgzOTMsIDk5OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTMsIDcyMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5MywgOTk4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJbG9jYXRpb24gICAJKDM1MCwgOTE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MDA2MzcNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAyNDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMCwgMzk2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkMwMDE5OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDI0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU5NCwgLTc3MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJbG9jYXRpb24gICAJKDg5NywgMzYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODM2NDQ5DQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkMxMDI4QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxMCwgMzk2KQ0KLQkJCQkoODE1LCAzOTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMxMCwgMzk2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODE1LCAzOTYpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5Um9sZVJlZnMiIEAyNDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC01OTQsIC03NzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ4DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ3DQotCQkJCWxvY2F0aW9uICAgCSgxNTczLCAzNjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5Um9sZVJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNTMzODE2DQotCQkJCWhlaWdodCAgICAgCTMyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkMxMDI5RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjMwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxMCwgMzk2KQ0KLQkJCQkoMTYzOSwgMzk2KQ0KLQkJCQkoMTYzOSwgNTYyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMTAsIDM5NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzksIDU2MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ5DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ3DQotCQkJCWxvY2F0aW9uICAgCSgxNjAzLCA0NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MDUzMQ0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDI1MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ4LCAzNTkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQUMwMTRBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYlR5cGUiIEAyNTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTANCi0JCQkgICAgbG9jYXRpb24gICAJKDExMiwgMzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUyDQotCQkJCVBhcmVudF9WaWV3IAlAMjUxDQotCQkJCWxvY2F0aW9uICAgCSgxNTYyLCA0MDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYlR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzI0MzkwDQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkFEMDAxNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjMxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI0OCwgMzU5KQ0KLQkJCQkoMTY4MSwgMzU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNDgsIDM1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2ODEsIDM1OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUzDQotCQkJCVBhcmVudF9WaWV3IAlAMjUxDQotCQkJCWxvY2F0aW9uICAgCSgxNjM3LCAzMDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmxldCIgQDI1NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyLCAzOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJbG9jYXRpb24gICAJKDkwMywgNDAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJBRDAwMDEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyNDgsIDM1OSkNCi0JCQkJKDgxNSwgMzU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNDgsIDM1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMzU5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJbG9jYXRpb24gICAJKDg3NywgMzIyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NTg1MzcNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDIiIEAyNTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzQ2LCAxMTY5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJFMDI1NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MyIgQDI1OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzNCwgMjM5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI1OA0KLQkJCQlsb2NhdGlvbiAgIAkoNTU4LCA2MjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJGMDE4RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzQ2LCAxMTY5KQ0KLQkJCQkoNTk5LCAxMTY5KQ0KLQkJCQkoNTk5LCA0NDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzQ2LCAxMTY5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTk5LCA0NDkpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJ1bkFzIiBAMjYwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzM0LCAyMzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYxDQotCQkJCVBhcmVudF9WaWV3IAlAMjYwDQotCQkJCWxvY2F0aW9uICAgCSgxNTE2LCAxMjIzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitydW5BcyINCi0JCQkJcGN0RGlzdCAgICAJMC44ODk4NDMNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkYwMTg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjU3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMzQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3NDYsIDExNjkpDQotCQkJCSgxNjEzLCAxMTY5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc0NiwgMTE2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTMsIDExNjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU0MywgMTEyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTE5ODg2DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ4IiBAMjYzDQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgOTYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NkU3MDM4NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1zIiBAMjY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNCwgNTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI2NA0KLQkJCQlsb2NhdGlvbiAgIAkoNDA0LCAxNDA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpbml0UGFyYW1zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MTYyMg0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ2RTkwMDA1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MjgsIDk2MCkNCi0JCQkJKDUyOCwgMTQ3MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjgsIDk2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyOCwgMTQ3MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY2DQotCQkJCVBhcmVudF9WaWV3IAlAMjY0DQotCQkJCWxvY2F0aW9uICAgCSg1ODIsIDE0MjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDkiIEAyNjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE0LCA1NzApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ2RTkwMDE5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMzYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MjgsIDk2MCkNCi0JCQkJKDUyOCwgNDQ5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyOCwgOTYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTI4LCA0NDkpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIldlbGNvbWVGaWxlIFJlbGF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBODIxMDI4NyINCi0JICAgIHRpdGxlICAgICAgCSJXZWxjb21lRmlsZSBSZWxhdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2VsY29tZUZpbGVMaXN0IiBAMjY4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjY4DQotCQkJbG9jYXRpb24gICAJKDk0OCwgMTQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2VsY29tZUZpbGVMaXN0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQUQwMUE4Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2Mg0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2VsY29tZUZpbGUiIEAyNjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDY3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNjkNCi0JCQlsb2NhdGlvbiAgIAkoODk0LCA1OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWxjb21lRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBNUE4MDBFOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjY5DQotCQkJbG9jYXRpb24gICAJKDg5NCwgNjU1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDE5KQ0KLQkJICAgIHdpZHRoICAgICAgCTQwNg0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBAMjcwDQotCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDQxNykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjNBRjAyQzQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmlsZUxpc3QiIEAyNzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzANCi0JCQkgICAgbG9jYXRpb24gICAJKC02OSwgLTE5MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzINCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzENCi0JCQkJbG9jYXRpb24gICAJKDg5OSwgMjg3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmaWxlTGlzdCINCi0JCQkJcGN0RGlzdCAgICAJMC43OTcxMDENCi0JCQkJaGVpZ2h0ICAgICAJMTA1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyM0IzMDExMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAwMywgNDE3KQ0KLQkJCQkoMTAwMywgMjU0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMDMsIDQxNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDMsIDI1NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjczDQotCQkJCVBhcmVudF9WaWV3IAlAMjcxDQotCQkJCWxvY2F0aW9uICAgCSgxMDc0LCAyOTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NTM2Mg0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmlsZSIgQDI3NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY5LCAtMTkxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI3NA0KLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA1NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIzQjMwMTFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDAzLCA0MTcpDQotCQkJCSgxMDAzLCA1ODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAwMywgNDE3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwMywgNTgxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzQNCi0JCQkJbG9jYXRpb24gICAJKDEwNTgsIDU0MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzc2OTc4DQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJXZWJSZXNvdXJjZUNvbGxlY3Rpb24gUmVsYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEE4NjAwMjQxIg0KLQkgICAgdGl0bGUgICAgICAJIldlYlJlc291cmNlQ29sbGVjdGlvbiBSZWxhdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkxNzUNCi0JICAgIG9yaWdpbl95ICAgCTEwNg0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkhUVFBNZXRob2RUeXBlRW51bSIgQDI3Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgNjg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCWxvY2F0aW9uICAgCSgxNjU4LCA0NzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQTWV0aG9kVHlwZUVudW0iKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OCwgNDI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTJFMjAwQzYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCWxvY2F0aW9uICAgCSgxNjU4LCA1NDApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTgNCi0JCQltYXhfd2lkdGggIAkyMjgpDQotCQkgICAgd2lkdGggICAgICAJNDc4DQotCQkgICAgaGVpZ2h0ICAgICAJNTQyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpVUkxQYXR0ZXJuVHlwZSIgQDI3OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjU2LCA4NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjc4DQotCQkJbG9jYXRpb24gICAJKDQ3MCwgNzgzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVVJMUGF0dGVyblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTJDNTAwNDIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI3OA0KLQkJCWxvY2F0aW9uICAgCSg0NzAsIDg0NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM2OSkNCi0JCSAgICB3aWR0aCAgICAgIAkzOTANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkhUVFBNZXRob2RUeXBlIiBAMjc5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzc2LCA4MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjc5DQotCQkJbG9jYXRpb24gICAJKDExNzYsIDc1MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBNZXRob2RUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U5MzBCMDUwMDY1Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNzkNCi0JCQlsb2NhdGlvbiAgIAkoMTE3NiwgODEyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzk3KQ0KLQkJICAgIHdpZHRoICAgICAgCTQxOA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViUmVzb3VyY2VDb2xsZWN0aW9uIiBAMjgwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAyNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjgwDQotCQkJbG9jYXRpb24gICAJKDU5MiwgODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJSZXNvdXJjZUNvbGxlY3Rpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI4MA0KLQkJCWxvY2F0aW9uICAgCSg1OTIsIDE0NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTg5NCkNCi0JCSAgICB3aWR0aCAgICAgIAk5MTQNCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MjQsIDU4OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQwOTAxNzkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzQ29sbGVjdGlvbiIgQDI4Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAtMTE1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNzUwLCA0NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc0NvbGxlY3Rpb24iDQotCQkJCXBjdERpc3QgICAgCTAuMjg5NTg5DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQwQTAyNTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgyNCwgNTg5KQ0KLQkJCQkoOTM1LCA0MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NA0KLQkJCQlQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoODEwLCA1MTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI3NDczMw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiVVJMcyIgQDI4NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAtMTE1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI3LCA3MTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK1VSTHMiDQotCQkJCXBjdERpc3QgICAgCTAuOTc2MjI5DQotCQkJCWhlaWdodCAgICAgCTEwNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQwQTAyNjAiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgyNCwgNTg5KQ0KLQkJCQkoNzEzLCA3NzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAyLCA3MzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2MzMyMA0KLQkJCQloZWlnaHQgICAgIAk2MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NiIgQDI4OA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjI4LCA1NzMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTkzMEIxMTAzMEIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiSFRUUHMiIEAyODkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MywgMzI4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MA0KLQkJCQlQYXJlbnRfVmlldyAJQDI4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4OSwgNjc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitIVFRQcyINCi0JCQkJcGN0RGlzdCAgICAJMC4zODEwMTANCi0JCQkJaGVpZ2h0ICAgICAJODcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U5MzBCMTIwMERDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjg4DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjI4LCA1NzMpDQotCQkJCSgxMzIyLCA3MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1OSwgNjk1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc0NvbGxlY3Rpb24iIEAyOTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MywgMzI4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTMzMiwgNDY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjU3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZXNDb2xsZWN0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjIxODE2Mw0KLQkJCQloZWlnaHQgICAgIAkxNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U5MzBCMTIwMEU2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjg4DQotCQkJICAgIHN1cHBsaWVyICAgCUAyODANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjI4LCA1NzMpDQotCQkJCSgxMTM1LCA0MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDI5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwMCwgNDY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjc1NzMNCi0JCQkJaGVpZ2h0ICAgICAJNjANCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gImxvZ2luQ29uZmlnIFJlbGF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBOEJGMDNFMiINCi0JICAgIHRpdGxlICAgICAgCSJsb2dpbkNvbmZpZyBSZWxhdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxMw0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvZ2luQ29uZmlnIiBAMjk1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCAyMDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk1DQotCQkJbG9jYXRpb24gICAJKDc1MywgODMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMb2dpbkNvbmZpZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDBGMDA2RiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjk1DQotCQkJbG9jYXRpb24gICAJKDc1MywgMTQ0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNzQyKQ0KLQkJICAgIHdpZHRoICAgICAgCTcyMA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6Rm9ybUxvZ2luQ29uZmlnIiBAMjk2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCA4OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk2DQotCQkJbG9jYXRpb24gICAJKDkxNywgNzk1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRm9ybUxvZ2luQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdEMzkwMjk2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQlsb2NhdGlvbiAgIAkoOTE3LCA4NTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NjMpDQotCQkgICAgd2lkdGggICAgICAJNDU2DQotCQkgICAgaGVpZ2h0ICAgICAJMjI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEAyOTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgNTY0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyNDg5MDBCRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsb2dpbkNvbmZpZyIgQDI5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTMzMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTgNCi0JCQkJbG9jYXRpb24gICAJKDEwMDQsIDM2OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9naW5Db25maWciDQotCQkJCXBjdERpc3QgICAgCTAuODkyOTUyDQotCQkJCWhlaWdodCAgICAgCTEzMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQ4OTAzMDMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMzYsIDU2NCkNCi0JCQkJKDExMzYsIDM0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTM2LCA1NjQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTM2LCAzNDUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDI5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMzY3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZvcm1Mb2dpbkNvbmZpZyIgQDMwMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTMzMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJbG9jYXRpb24gICAJKDk2OCwgNzQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzI3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmb3JtTG9naW5Db25maWciDQotCQkJCXBjdERpc3QgICAgCTAuODQ0MDczDQotCQkJCWhlaWdodCAgICAgCTE2OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQ4OTAzMEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMzYsIDU2NCkNCi0JCQkJKDExMzYsIDc4MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTM2LCA1NjQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTM2LCA3ODMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgNzYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpBdXRoTWV0aG9kS2luZCIgQDMwNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzY4LCA2NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA0DQotCQkJbG9jYXRpb24gICAJKDE5MCwgNDkwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXV0aE1ldGhvZEtpbmQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDQNCi0JCQlsb2NhdGlvbiAgIAkoMTkwLCA0NDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTMNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFRTBBMkQ4MDI5QSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzA0DQotCQkJbG9jYXRpb24gICAJKDE5MCwgNTUxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJMzE5KQ0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTQyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJkYXRhIHR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ4QTI0MDMyMSINCi0JICAgIHRpdGxlICAgICAgCSJkYXRhIHR5cGVzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIiBAMzA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDQzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQlsb2NhdGlvbiAgIAkoMTE0LCAzMjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJbG9jYXRpb24gICAJKDExNCwgMjc5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjFBOTAxOEYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCWxvY2F0aW9uICAgCSgxMTQsIDM5MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTMzOCkNCi0JCSAgICB3aWR0aCAgICAgIAk0OTQNCi0JCSAgICBoZWlnaHQgICAgIAkzMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNBdXRoVHlwZUJhc2UiIEAzMDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNg0KLQkJCWxvY2F0aW9uICAgCSg3NTUsIDEwOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc0F1dGhUeXBlQmFzZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNg0KLQkJCWxvY2F0aW9uICAgCSg3NTUsIDU4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzc4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOUVENDAwQjQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMwNg0KLQkJCWxvY2F0aW9uICAgCSg3NTUsIDIyMykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTI1OSkNCi0JCSAgICB3aWR0aCAgICAgIAkzOTYNCi0JCSAgICBoZWlnaHQgICAgIAkzODgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlJlc0F1dGhTZXJ2bGV0VHlwZSIgQDMwNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA3MzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA3DQotCQkJbG9jYXRpb24gICAJKDc0MSwgNjU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzQXV0aFNlcnZsZXRUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA3DQotCQkJbG9jYXRpb24gICAJKDc0MSwgNjA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDA2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOUVFQTAyNjUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMwNw0KLQkJCWxvY2F0aW9uICAgCSg3NDEsIDcxOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MjQNCi0JCSAgICBoZWlnaHQgICAgIAkyODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU2VydmxldDIuNCAtIEZpbHRlcnMiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkIxM0UwMjFBIg0KLQkgICAgdGl0bGUgICAgICAJIlNlcnZsZXQyLjQgLSBGaWx0ZXJzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAzMDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA3MCwgMjAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMTY3NzcyMTUNCi0JCQlkZWZhdWx0X2NvbG9yIAlGQUxTRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA4DQotCQkJbG9jYXRpb24gICAJKDI2OTEsIDgxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTcyMg0KLQkJCWxhYmVsICAgICAgCSJUT0RPOiBJbXBsZW1lbnQgaGVscGVycyBmb3IgcmVzb2x1dGlvbiBvZiBTZXJ2bGV0IGFuZCBGaWx0ZXIgZm9yIEZpbHRlck1hcHBpbmcgYnkgc2VydmxldE5hbWUgYW5kIG5hbWUuICBTaW5jZSB3ZSBoYXZlIHJlZnMsIHdlIG1heSB3YW50IHRvIHJlbW92ZSB0aGUgbmFtZXMuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMjU1DQotCQkgICAgd2lkdGggICAgICAJNzgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjUwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDMwOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIxNjAsIDU0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDkNCi0JCQlsb2NhdGlvbiAgIAkoMjA3OSwgNDk4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpMaXN0ZW5lciIgQDMxMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI2NywgMTE1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxMA0KLQkJCWxvY2F0aW9uICAgCSgyMTQ3LCAzNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxpc3RlbmVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkJICAgIHdpZHRoICAgICAgCTI1OA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzMDgNCi0JCSAgICBzdXBwbGllciAgIAlAMzEwDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI2NzgsIDE1NykNCi0JCQkoMjM5NiwgMTI3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SW5pdFBhcmFtIiBAMzEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTE2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMTINCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDEwNjcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbml0UGFyYW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMxMg0KLQkJCWxvY2F0aW9uICAgCSg2MiwgMTEyOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQxMykNCi0JCSAgICB3aWR0aCAgICAgIAk0MDYNCi0JCSAgICBoZWlnaHQgICAgIAkyMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZpbHRlck1hcHBpbmciIEAzMTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MDgsIDU3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMTMNCi0JCQlsb2NhdGlvbiAgIAkoMTAxMSwgNDc1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTc5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRmlsdGVyTWFwcGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTRDMDNERCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzEzDQotCQkJbG9jYXRpb24gICAJKDEwMTEsIDUzNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTgyNikNCi0JCSAgICB3aWR0aCAgICAgIAk4MTINCi0JCSAgICBoZWlnaHQgICAgIAkyMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNiIgQDMxNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTQyLCA1MzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlDMDA1QkIwMEI5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXQiIEAzMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDY5NCwgLTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE2DQotCQkJCVBhcmVudF9WaWV3IAlAMzE1DQotCQkJCWxvY2F0aW9uICAgCSgyMDA2LCA0OTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZsZXQiDQotCQkJCXBjdERpc3QgICAgCTAuNDk3MDQxDQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAwNUJDMDA0RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzA5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk0MiwgNTM4KQ0KLQkJCQkoMjA3MCwgNTM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDIsIDUzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNzAsIDUzOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE3DQotCQkJCVBhcmVudF9WaWV3IAlAMzE1DQotCQkJCWxvY2F0aW9uICAgCSgyMDM0LCA1OTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxNTk3Ng0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzciIEAzMTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDY5NCwgLTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDA1QkMwMDYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzE0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTQyLCA1MzgpDQotCQkJCSgxODE0LCA1MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk0MiwgNTM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxNCwgNTM4KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIiBAMzE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAxMTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzE5DQotCQkJbG9jYXRpb24gICAJKDgxOCwgNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJBcHAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJOb25lIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgd2lkdGggICAgICAJMjA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgiIEAzMjANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMywgMjA3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCNDE1MDI5OCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWx0ZXJNYXBwaW5ncyIgQDMyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzIxLCA5NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJbG9jYXRpb24gICAJKDEzOTgsIDQwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsdGVyTWFwcGluZ3MiDQotCQkJCXBjdERpc3QgICAgCTAuNzU3ODEzDQotCQkJCWhlaWdodCAgICAgCTE2NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjQxNjAxMjciDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMzMsIDIwNykNCi0JCQkJKDEyMzMsIDQ2MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMzLCAyMDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMzLCA0NjMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3OSwgMzkzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MjY1NjMNCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5IiBAMzI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMjEsIDk1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTg5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkZCNDE2MDEyOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzMywgMjA3KQ0KLQkJCQkoMTIzMywgMTQ3KQ0KLQkJCQkoMTAxNSwgMTQ3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzMsIDIwNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTUsIDE0NykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMCIgQDMyNg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTc2LCAxMTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkI1NEQwMUVDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxpc3RlbmVycyIgQDMyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjY0LCA3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTkxNSwgMTc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTg2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsaXN0ZW5lcnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjA1NzM1DQotCQkJCWhlaWdodCAgICAgCTYwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkZCNTRFMDIxNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU3NiwgMTE5KQ0KLQkJCQkoMjEzOCwgMTE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzYsIDExOSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMzgsIDExOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5DQotCQkJCVBhcmVudF9WaWV3IAlAMzI3DQotCQkJCWxvY2F0aW9uICAgCSgyMDgzLCA0OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTA0NDEyDQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDMzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjY0LCA3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkZCNTRFMDIyMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU3NiwgMTE5KQ0KLQkJCQkoMTAxNSwgMTE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzYsIDExOSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTUsIDExOSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMzMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI1OCwgOTIyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzMQ0KLQkJCWxvY2F0aW9uICAgCSgyMTY1LCA4NDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDAiIEAzMzINCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyOCwgNTE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZDMDM1QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsaXN0ZW5lckNsYXNzIiBAMzMzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzMyDQotCQkJICAgIGxvY2F0aW9uICAgCSg0MjQsIDM1OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzMNCi0JCQkJbG9jYXRpb24gICAJKDIxOTEsIDc4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC44NTYyNjkNCi0JCQkJaGVpZ2h0ICAgICAJMTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZEMDJBNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzMxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMyOCwgNTE4KQ0KLQkJCQkoMjMyOCwgODMxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMjgsIDUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMjgsIDgzMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM1DQotCQkJCVBhcmVudF9WaWV3IAlAMzMzDQotCQkJCWxvY2F0aW9uICAgCSgyMzgyLCA3NzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyMTkxOA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDEiIEAzMzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMzINCi0JCQkgICAgbG9jYXRpb24gICAJKDQyNCwgMzU4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZEMDJDRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMyOCwgNTE4KQ0KLQkJCQkoMjMyOCwgMjA1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMjgsIDUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMjgsIDIwNSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIiBAMzM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzODQsIDE1MzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzM3DQotCQkJbG9jYXRpb24gICAJKDIwNywgMTM4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBhcmFtVmFsdWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCWxvY2F0aW9uICAgCSgyMDcsIDE1MDApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzOTEpDQotCQkgICAgd2lkdGggICAgICAJMzcyDQotCQkgICAgaGVpZ2h0ICAgICAJMzMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiIEAzMzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgNTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzOA0KLQkJCWxvY2F0aW9uICAgCSgyMzcsIDQ5OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZpbHRlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzM4DQotCQkJbG9jYXRpb24gICAJKDIzNywgNTU5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjk0KQ0KLQkJICAgIHdpZHRoICAgICAgCTI4MA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyIiBAMzM5DQotCQkgICAgbG9jYXRpb24gICAJKDI2NSwgODYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAwMjZFMDJEMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1zIiBAMzQwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzM5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtODcsIDI4NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDENCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDANCi0JCQkJbG9jYXRpb24gICAJKDEyMiwgOTc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpbml0UGFyYW1zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxNDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDAyNkYwMTYwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzM5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNjUsIDg2MCkNCi0JCQkJKDI2NSwgMTA1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjUsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NSwgMTA1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyDQotCQkJCVBhcmVudF9WaWV3IAlAMzQwDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDk3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDM0Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg3LCAyODQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDAyNkYwMTZBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzM5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNjUsIDg2MCkNCi0JCQkJKDI2NSwgNjY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2NSwgODYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY1LCA2NjYpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzQiIEAzNDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzU1LCA1MzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlDMDA1NkEwMjkzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbHRlciIgQDM0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ5MywgLTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ2DQotCQkJCVBhcmVudF9WaWV3IAlAMzQ1DQotCQkJCWxvY2F0aW9uICAgCSg2MTYsIDQ5OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsdGVyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU2NjE3Ng0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwMDU2QjAzMjEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc1NSwgNTM4KQ0KLQkJCQkoNTA4LCA1MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzU1LCA1MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDgsIDUzOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ3DQotCQkJCVBhcmVudF9WaWV3IAlAMzQ1DQotCQkJCWxvY2F0aW9uICAgCSg1NjEsIDU5MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzg2NzY1DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNSIgQDM0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ5MywgLTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDA1NkIwMzJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3NTUsIDUzOCkNCi0JCQkJKDEwMDIsIDUzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTUsIDUzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDIsIDUzOCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNiIgQDM0OQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NzUsIDExMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjNCMTAxQ0MiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmlsdGVycyIgQDM1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQzNywgMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTENCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTANCi0JCQkJbG9jYXRpb24gICAJKDUwMiwgNDM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmaWx0ZXJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5Mzg5MQ0KLQkJCQloZWlnaHQgICAgIAk4Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjNCMjAxMjMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ3NSwgMTEyKQ0KLQkJCQkoNDE1LCAxMTIpDQotCQkJCSg0MTUsIDQ4NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzUsIDExMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNSwgNDg2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTINCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTANCi0JCQkJbG9jYXRpb24gICAJKDM1OCwgNDM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTM4OTENCi0JCQkJaGVpZ2h0ICAgICAJNTgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3IiBAMzUzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDM3LCAwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCA3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU4OTM0Mg0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjNCMjAxMkQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ3NSwgMTEyKQ0KLQkJCQkoODA5LCAxMTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCAxMTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDExMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOCIgQDM1NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjExLCA4NzEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlDMDNDMjgwMzU2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbHRlckNsYXNzIiBAMzU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI5NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTYNCi0JCQkJbG9jYXRpb24gICAJKDE4ODYsIDkyNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsdGVyQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuNzE0NTQyDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzQzI5MDI2NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzMxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIxMSwgODcxKQ0KLQkJCQkoMjE1NiwgODcxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTEsIDg3MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTYsIDg3MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4DQotCQkJCVBhcmVudF9WaWV3IAlAMzU2DQotCQkJCWxvY2F0aW9uICAgCSgyMDYxLCA5MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzkiIEAzNTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMjk1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzQzI5MDI4RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzM4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIxMSwgODcxKQ0KLQkJCQkoOTIyLCA4NzEpDQotCQkJCSg5MjIsIDYyOSkNCi0JCQkJKDUwOCwgNjI5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTEsIDg3MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUwOCwgNjI5KSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzNjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzMDgNCi0JCSAgICBzdXBwbGllciAgIAlAMzM4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI2NzgsIDI1MykNCi0JCQkoNTA4LCA1NTUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDYiIEAzNjENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCAxMDE5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0M0FBMDAwQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1WYWx1ZXMiIEAzNjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNjENCi0JCQkgICAgbG9jYXRpb24gICAJKDMyLCA0NDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYzDQotCQkJCVBhcmVudF9WaWV3IAlAMzYyDQotCQkJCWxvY2F0aW9uICAgCSgyMTksIDEzMTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2luaXRQYXJhbVZhbHVlcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MjU0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTY2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0M0FBMDI0NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM2MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzM3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzg0LCAxMDE5KQ0KLQkJCQkoMzg0LCAxMzczKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM4NCwgMTAxOSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM4NCwgMTM3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY0DQotCQkJCVBhcmVudF9WaWV3IAlAMzYyDQotCQkJCWxvY2F0aW9uICAgCSg0MzgsIDEzMzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDciIEAzNjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNjENCi0JCQkgICAgbG9jYXRpb24gICAJKDMyLCA0NDMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzQUEwMjRGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzYxDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzODQsIDEwMTkpDQotCQkJCSgzODQsIDY2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzODQsIDEwMTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODQsIDY2NikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkRpc3BhdGNoZXJUeXBlIiBAMzY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzM2LCA2MjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY2DQotCQkJbG9jYXRpb24gICAJKDI1NTgsIDQ5OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BhdGNoZXJUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY2DQotCQkJbG9jYXRpb24gICAJKDI1NTgsIDQ0OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NDVCMDM3NiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzY2DQotCQkJbG9jYXRpb24gICAJKDI1NTgsIDU1OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTI2MCkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkzNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMzY3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTUzLCAxMTg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY3DQotCQkJbG9jYXRpb24gICAJKDEzNzQsIDExMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU2VydmxldDIuNCAtIFNlY3VyaXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5OTgyOUNEMDE5NyINCi0JICAgIHRpdGxlICAgICAgCSJTZXJ2bGV0Mi40IC0gU2VjdXJpdHkiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTm90ZVZpZXcgQDM2OA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA3MDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY4DQotCQkJbG9jYXRpb24gICAJKDgyNSwgNjQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUyMg0KLQkJCWxhYmVsICAgICAgCSJTZWUgY29tbW9uOjpTZWN1cml0eSBkaWFncmFtIGZvciBmdXJ0aGVyIGRldGFpbHMuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAk1ODINCi0JCSAgICBoZWlnaHQgICAgIAkxMzgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UnVuQXNTcGVjaWZpZWRJZGVudGl0eSIgQDM2OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDM2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNjkNCi0JCQlsb2NhdGlvbiAgIAkoOTE5LCAyODkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOUUwMkM4Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzNzANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzNjgNCi0JCSAgICBzdXBwbGllciAgIAlAMzY5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEwOTMsIDYzNCkNCi0JCQkoMTA2OCwgNDU5KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDM3MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMyMCwgMzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM3MQ0KLQkJCWxvY2F0aW9uICAgCSgyMzksIDMwNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDIiIEAzNzINCi0JCSAgICBsb2NhdGlvbiAgIAkoNjYwLCAzNDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkUwMjU1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJ1bkFzIiBAMzczDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzcyDQotCQkJICAgIGxvY2F0aW9uICAgCSgzNDAsIC01KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODAzLCAzMDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3J1bkFzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU3MjgxNg0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRjAxODQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDM2OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY2MCwgMzQ3KQ0KLQkJCQkoOTEwLCAzNDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjYwLCAzNDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MTAsIDM0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc1DQotCQkJCVBhcmVudF9WaWV3IAlAMzczDQotCQkJCWxvY2F0aW9uICAgCSg4NDcsIDM4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzQ3NTczDQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MyIgQDM3Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzQwLCAtNSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRjAxOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDM3MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY2MCwgMzQ3KQ0KLQkJCQkoNDEwLCAzNDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjYwLCAzNDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTAsIDM0NykpKSkNCi0JCShvYmplY3QgTGFiZWwgQDM3Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJMTE3Mw0KLQkJICAgIGxhYmVsICAgICAgCSJTZXJ2bGV0IDIuMyBoYXMgaW50cm9kdWNlZCBSdW5BcyBzZWN1cml0eSBpZGVudGl0eSBmb3IgU2VydmxldHM6IikpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZS1qMmVlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dlYnNlcnZpY2UtajJlZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzAwM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZS1qMmVlLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDg5MjggKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJJREUiCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JICAgIHZhbHVlICAgICAgCSIiKSkKLSAgICBxdWlkICAgICAgIAkiM0UxMDlFODgwMzBGIgotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCVRSVUUKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzRTEwOUU4ODAzMTEiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzRTEwOUU4QTAxNzgiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiM0UxMDlFODgwMzEwIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiM0UxMDlFODgwMzEyIgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY29tbW9uIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdzY29tbW9uLmNhdCIKLQkJcXVpZCAgICAgICAJIjNFMTVCNEMwMDE2RiIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpheHJwY21hcCIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxqYXhycGNtYXAuY2F0IgotCQlxdWlkICAgICAgIAkiM0UxNjFGQTkwMjY2IikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkZCIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3c2RkLmNhdCIKLQkJcXVpZCAgICAgICAJIjNFMTA5RUFEMDMxOSIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImNvbW1vbiIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxjb21tb24uY2F0IgotCQlxdWlkICAgICAgIAkiMzhDMDhGMEYwMzhEIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qZW1cXHJvc2VcXGVkb2NqYXZhMi5jYXQiCi0JCXF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXHNyYy1lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlamIiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcZWpic2NoZW1hLmNhdCIKLQkJcXVpZCAgICAgICAJIjM3ODBFMjcyMDMyRCIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndlYmFwcGxpY2F0aW9uIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYmFwcGxpY2F0aW9uLmNhdCIKLQkJcXVpZCAgICAgICAJIjM4QzA3NkQ2MDNERCIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY2xpZW50IgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYnNlcnZpY2VzX2NsaWVudF8xXzAuY2F0IgotCQlxdWlkICAgICAgIAkiM0U0RDJGNEIwMkFBIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAianNwIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGpzcF8yXzAuY2F0IgotCQlxdWlkICAgICAgIAkiM0U0RDRGNjkwMzZCIikpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0UxNUI0N0QwMkUwIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6Y29tbW9uIiBAMQotCQkJbG9jYXRpb24gICAJKDY4OCwgNzY4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDU0NCwgNjg0KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiY29tbW9uIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOEMwOEYwRjAzOEQiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMgotCQkJbG9jYXRpb24gICAJKDExMDQsIDQ5NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJICAgIGxvY2F0aW9uICAgCSg5NjAsIDQxMikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVqYiIgQDMKLQkJCWxvY2F0aW9uICAgCSgxMTA0LCA0OTYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYwLCA0NjIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlamIiKQotCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYwLCA0MTIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM3ODBFMjcyMDMyRCIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzRTEwOUU4ODAzMTIiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNFMTA5RThBMDE3NyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjNFMTA5RTg4MDMxMyIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiM0UxMDlFODgwMzE1IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZUJhY2t1cEZpbGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMgc3luY2hyb25pemUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIHN5bmNocm9uaXplIgotCQkJCXZhbHVlICAgICAgCTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5IgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIzMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIgotCQkJCXZhbHVlICAgICAgCTIwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjMyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyMzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSIKLQkJCQl2YWx1ZSAgICAgIAkyMzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIgotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiCi0JCQkJdmFsdWUgICAgICAJMjMzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJBZnRlciIKLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIgotCQkJCXZhbHVlICAgICAgCTIzMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTIxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTWl4aW4iCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhc2siCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIgotCQkJCXZhbHVlICAgICAgCTIwOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTIxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTIyOCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyIKLQkJCQl2YWx1ZSAgICAgIAkyMjkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJJbmNvbXBsZXRlVHlwZVNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJOb0Rpc2NyaW1pbmFudFBhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5rbm93bkRpc2NyaW1pbmFudFBhcnQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiS25vd25EaXNjcmltaW5hbnRQYXJ0IgotCQkJCXZhbHVlICAgICAgCTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIzMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiCi0JCQkJdmFsdWUgICAgICAJMjMyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIgotCQkJCXZhbHVlICAgICAgCTIzMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiCi0JCQkJdmFsdWUgICAgICAJMjMzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBZnRlciIKLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSIKLQkJCQl2YWx1ZSAgICAgIAkyMzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIgotCQkJCXZhbHVlICAgICAgCTIzNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgY29kZS93ZWJzZXJ2aWNlL3dlYnNlcnZpY2UtajJlZS5tZGwsIFdDQ00uSjJFRS5XRUJTRVJWSUNFUywgV0NDTSwgNi4wLjAtdGQtaCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIGNvZGUvd2Vic2VydmljZS93ZWJzZXJ2aWNlLWoyZWUubWRsLCBXQ0NNLkoyRUUuV0VCU0VSVklDRVMsIFdDQ00sIDYuMC4wLXRkLWgiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkicHJvamVjdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRCTVMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm93IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKLQkJCXZhbHVlICAgICAgCSJTUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRlcGxveSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk0iCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIklCTSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJtXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJzXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVG9wTGluayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZW51bSIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibW9kdWxlIgotCQkJCXZhbHVlICAgICAgCTEwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiCi0JCQkJdmFsdWUgICAgICAJMTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQkJdmFsdWUgICAgICAJMTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkidW5pb24iCi0JCQkJdmFsdWUgICAgICAJMTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibWF4IgotCQkJCXZhbHVlICAgICAgCTEwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxjaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjAiCi0JCQkJdmFsdWUgICAgICAJMjIzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMSIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyIKLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlWYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU29EQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBjb2RlL3dlYnNlcnZpY2Uvd2Vic2VydmljZS1qMmVlLm1kbCwgV0NDTS5KMkVFLldFQlNFUlZJQ0VTLCBXQ0NNNjBURCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBjb2RlL3dlYnNlcnZpY2Uvd2Vic2VydmljZS1qMmVlLm1kbCwgV0NDTS5KMkVFLldFQlNFUlZJQ0VTLCBXQ0NNNjBURCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiaW4iCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJpbm91dCIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIm91dCIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikpCi0JcXVpZCAgICAgICAJIjNFMTA5RTg4MDMxNCIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZXNfY2xpZW50XzFfMC5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0MGNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4MTUgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY2xpZW50IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJInByZWZpeCIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldlYnNlcnZpY2VfY2xpZW50IikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkibnNVUkkiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiKSkpCi0gICAgcXVpZCAgICAgICAJIjNFNEQyRjRCMDJBQSIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiU2VydmljZVJlZiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLXwgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLXwgICAgaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLAotfCAgICBhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLXwgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi18ICAgIGFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQKLXwgICAgYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUYyQzAwMUMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIgotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXJ2aWNlUmVmTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMkZEMzAxQTEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotfCAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLXwgICAgICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLXwgICAgICAgICJzZXJ2aWNlLyIuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbEZpbGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMwMDUwMTk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18IFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETCBmaWxlLiBUaGUKLXwgICAgICAgIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXhycGNNYXBwaW5nRmlsZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzAxQzAzQ0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci18ICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci18ICAgICAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLXwgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQb3J0Q29tcG9uZW50UmVmIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMwRDkwM0E3IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotfCAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotfCAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci18ICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLXwgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydENvbXBvbmVudExpbmsiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMjIwMzQ4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZiB0byBhCi18ICAgICAgICBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZSBieSBhIHNlcnZpY2UKLXwgICAgICAgIHJlZmVyZW5jZS4KLXwKLXwgICAgICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUgcG9ydC1jb21wb25lbnQtbmFtZQotfCAgICAgICAgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUKLXwgICAgICAgIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXggZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4Ci18ICAgICAgICBkZWZpbmVkIGZvciBlamItbGluayBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkgICAgCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkhhbmRsZXIiCi0JICAgIHF1aWQgICAgICAgCSIzRTREMzE2NDAwNzIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotfCAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLXwgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLXwKLXwgICAgVXNlZCBpbjogc2VydmljZS1yZWYKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjAwODAwMDUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIgotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzFFRDAwOTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBtb2R1bGUuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb2FwUm9sZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMyNjYwMjg1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnROYW1lcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzI4QTAzMzEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYSBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJXZWJTZXJ2aWNlc0NsaWVudCIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCMzA5MDI2NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIpCi0JKG9iamVjdCBDbGFzcyAiQ29tcG9uZW50U2NvcGVkUmVmcyIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9uZW50TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjQ1NDAxNUYiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMDcwMEU2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMDgwMzU0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotfCAgICAgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLXwgICAgICAgIFdTREwgcG9ydC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTA4MDM3MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpQb3J0Q29tcG9uZW50UmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMEQ5MDNBNyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxM0MwMzlGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwb3J0Q29tcG9uZW50UmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzEzRDAyNTYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotfCAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLXwgICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLXwgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLXwgICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInBvcnRDb21wb25lbnRSZWZzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlBvcnRDb21wb25lbnRSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMwRDkwM0E3IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTNEMDI2MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIHF1aWQgICAgICAgCSIzRTREMzE2RTAzMUYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImhhbmRsZXJzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTZGMDI1OCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfCBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLXwgICAgICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotfCAgICAgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICAgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJoYW5kbGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpIYW5kbGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTY0MDA3MiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzE2RjAyNjIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxRjkwMTJBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJoYW5kbGVyQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxRkEwMjgwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uIgotCQkgICAgbGFiZWwgICAgICAJImhhbmRsZXJDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3IgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMUZBMDJBOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpIYW5kbGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTY0MDA3MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMyMjEwMDJEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbml0UGFyYW1zIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMjIxMDFFNiIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0UGFyYW1zIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzIyMTAxRTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNDhFMDI3MSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjQ5MTAyNzUiCi0JCSAgICBsYWJlbCAgICAgIAkiY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI0OTEwMjc3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OldlYlNlcnZpY2VzQ2xpZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCMzA5MDI2NyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIgotCSAgICBxdWlkICAgICAgIAkiM0YyRUI1MjQwM0Q1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjUyNzAxNTgiCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIgotCQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTI3MDE2QyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0IgotCSAgICBxdWlkICAgICAgIAkiM0YyRUI1OUIwMDZGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjU5QjAzNTQiCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1IgotCQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTlCMDM2OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpXZWJTZXJ2aWNlc0NsaWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjMwOTAyNjciCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiIKLQkgICAgcXVpZCAgICAgICAJIjNGNDM5MkNDMDJGQSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZVFuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNGNDM5MkNEMDJGMSIKLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlUW5hbWUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzkyQ0QwMkZCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiCi0JICAgIHF1aWQgICAgICAgCSIzRjQzOTMzQzAyQTAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNvYXBIZWFkZXJzIgotCQkgICAgcXVpZCAgICAgICAJIjNGNDM5MzNEMDE5MyIKLQkJICAgIGxhYmVsICAgICAgCSJzb2FwSGVhZGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOTMzRDAxOUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlcnZpY2UgUmVmIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMwQTIwMTMxIgotCSAgICB0aXRsZSAgICAgIAkiU2VydmljZSBSZWYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotfCAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLXwgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLXwKLXwgICAgVXNlZCBpbjogc2VydmljZS1yZWYKLQkgICAgCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkxMDUwCi0JICAgIG9yaWdpbl95ICAgCTEzOAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IExhYmVsIEAxCi0JCSAgICBsb2NhdGlvbiAgIAkoNTMsIDU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxNAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJVFJVRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIG5saW5lcyAgICAgCTEKLQkJICAgIG1heF93aWR0aCAgCTEwMDYKLQkJICAgIGxhYmVsICAgICAgCSJXZWIgU2VydmljZXMgQ2xpZW50IEREIFYxLjEiKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjgyMCwgMTkxOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMjY0MiwgMTgzOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYKLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiCi0JCSAgICB3aWR0aCAgICAgIAkzNzQKLQkJICAgIGhlaWdodCAgICAgCTE4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6UG9ydENvbXBvbmVudFJlZiIgQDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTYwNywgNDE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRDb21wb25lbnRSZWYiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMEQ5MDNBNyIKLQkJICAgIHdpZHRoICAgICAgCTQ1MgotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIiBANAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDExMzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSgyMTIsIDEwODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ29tcG9uZW50U2NvcGVkUmVmcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2NzQ1NzI3Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0MkEwMEFBIgotCQkgICAgd2lkdGggICAgICAJNTU0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OldlYlNlcnZpY2VzQ2xpZW50IiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDMwNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDM1MiwgMjU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldlYlNlcnZpY2VzQ2xpZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NDU3MjcKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjMwOTAyNjciCi0JCSAgICB3aWR0aCAgICAgIAk0NjYKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBANgotCQkgICAgbG9jYXRpb24gICAJKDUyNywgNzE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OEUwMjcxIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRTY29wZWRSZWZzIiBANwotCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY4NywgMjkxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOAotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDk5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OTEwMjc1IgotCQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg1NDQsIDEwNDMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDEwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xNjg3LCAyOTEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQotCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQlsb2NhdGlvbiAgIAkoNTE5LCA0MzMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OTEwMjc3IgotCQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJbG9jYXRpb24gICAJKDYxOCwgNDA4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzY3LCA4NjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzCi0JCQlsb2NhdGlvbiAgIAkoMjYzMywgODE4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjg2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTQKLQkJICAgIGxvY2F0aW9uICAgCSgyNTU4LCA0OTEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwNzAwRTYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgQDE1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCAtOTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCQlsb2NhdGlvbiAgIAkoMjk5OSwgNjk4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCQkJcGN0RGlzdCAgICAJMC43ODYwNzAKLQkJCQloZWlnaHQgICAgIAkyNDkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwODAzNTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEzCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDI1NTgsIDQ5MSkKLQkJCQkoMjc1MCwgNDkxKQotCQkJCSgyNzUwLCA4MDYpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI1NTgsIDQ5MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1MCwgODA2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJCWxvY2F0aW9uICAgCSgyNzE4LCA2OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNzc2MTE5Ci0JCQkJaGVpZ2h0ICAgICAJMzMKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ci0JCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIC05MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwODAzNzIiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTU4LCA0OTEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTAsIDQ5MSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiIEAxOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODg3LCAyNTcwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJbG9jYXRpb24gICAJKDE2NTUsIDI0MTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFyYW1WYWx1ZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIgotCQkgICAgd2lkdGggICAgICAJNDgyCi0JCSAgICBoZWlnaHQgICAgIAkzMzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiIEAyMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCAxMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJbG9jYXRpb24gICAJKDE2OTQsIDEwNzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZVJlZiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCWxvY2F0aW9uICAgCSgxNjk0LCAxMTMxKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTApCi0JCSAgICB3aWR0aCAgICAgIAkyNzgKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAyMQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDc5MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTNDMDM5RiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicG9ydENvbXBvbmVudFJlZnMiIEAyMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAtMzg3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE2MTgsIDYyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzgwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcG9ydENvbXBvbmVudFJlZnMiCi0JCQkJcGN0RGlzdCAgICAJMC42NDMwODAKLQkJCQloZWlnaHQgICAgIAkyMDcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEzRDAyNTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE4OTIsIDU5OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43MjYwODAKLQkJCQloZWlnaHQgICAgIAk2OAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAtMzg3KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTNEMDI2MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjEKLQkJCSAgICBzdXBwbGllciAgIAlAMjAKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyNgotCQkgICAgbG9jYXRpb24gICAJKDIzNzAsIDEwNjApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGRTEwMUZDIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzUwLCA5NDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOAotCQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCQlsb2NhdGlvbiAgIAkoMjA0NSwgMTAxOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkZFNDAxNEMiCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM3MCwgMTA2MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk2MywgMTA2MCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlSW50ZXJmYWNlIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkgICAgbG9jYXRpb24gICAJKDc1MCwgOTQwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDIyOTYsIDExNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VJbnRlcmZhY2UiCi0JCQkJcGN0RGlzdCAgICAJLTAuMTg1NDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGRTQwMTJFIgotCQkJICAgIGNsaWVudCAgICAgCUAyNgotCQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzcwLCAxMDYwKQotCQkJCSgyNjQ3LCAxMDYwKQotCQkJCSgyNjQ3LCA5MzApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNzAsIDEwNjApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NDcsIDkzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMjcwMSwgOTcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDMyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIyMCwgMTEyNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTI0MDNENSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVJlZnMiIEAzMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1ODEsIC0yMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJCWxvY2F0aW9uICAgCSgxNTkwLCAxMDgxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlUmVmcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1MjcwMTU4IgotCQkJICAgIGNsaWVudCAgICAgCUAzMgotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTYzOSwgMTE3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTgxLCAtMjApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoODUxLCAxMDkwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTI3MDE2QyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlANAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOAotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoODA1LCAxMTg1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDM5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTE5OSwgNzExKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1OUIwMDZGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlUmVmcyIgQDQwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzOQotCQkJICAgIGxvY2F0aW9uICAgCSg4NDMsIDQyNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxCi0JCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJCWxvY2F0aW9uICAgCSgxNjQ1LCA5NTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VSZWZzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjU5QjAzNTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDM5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyCi0JCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJCWxvY2F0aW9uICAgCSgxNjQ2LCAxMDY3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEA0MwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzkKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQzLCA0MjQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCQlsb2NhdGlvbiAgIAkoNzU1LCA0NzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1OUIwMzY4IgotCQkJICAgIGNsaWVudCAgICAgCUAzOQotCQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1Ci0JCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJCWxvY2F0aW9uICAgCSg3NTQsIDM1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiIEA0NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5MzQsIDE4MTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ2Ci0JCQlsb2NhdGlvbiAgIAkoNTg3LCAxNjM0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlFOYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiCi0JCSAgICB3aWR0aCAgICAgIAk3MTIKLQkJICAgIGhlaWdodCAgICAgCTM4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBANDcKLQkJICAgIGxvY2F0aW9uICAgCSgxMTgzLCAxMTg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkyQ0MwMkZBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlUW5hbWUiIEA0OAotCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0NywgNjMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQotCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQlsb2NhdGlvbiAgIAkoMTA3OCwgMTUyMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZVFuYW1lIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTJDRDAyRjEiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDExODMsIDExODQpCi0JCQkJKDExMTksIDExODQpCi0JCQkJKDExMTksIDE2MjIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExODMsIDExODQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDE2MjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDExNTAsIDE0NTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNjc1Mjk5Ci0JCQkJaGVpZ2h0ICAgICAJMzEKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDUxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NwotCQkJICAgIGxvY2F0aW9uICAgCSgtNjQ3LCA2MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTJDRDAyRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE4MywgMTE4NCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY4NSwgMTE4NCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIgQDUyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDE5NTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUyCi0JCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTkwMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIYW5kbGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJbG9jYXRpb24gICAJKDE3NTQsIDE5NjMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJMCkKLQkJICAgIHdpZHRoICAgICAgCTIyMgotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDUzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM4NSwgMTQ0NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMUY5MDEyQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaGFuZGxlckNsYXNzIiBANTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MDcsIC01OTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQotCQkJCVBhcmVudF9WaWV3IAlANTQKLQkJCQlsb2NhdGlvbiAgIAkoMjYxMywgMTAyNSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjc2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraGFuZGxlckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuODk1NDA0Ci0JCQkJaGVpZ2h0ICAgICAJMTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxRkEwMjgwIgotCQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzg1LCAxNDQ3KQotCQkJCSgyNzY2LCAxNDQ3KQotCQkJCSgyNzY2LCA5MzApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzODUsIDE0NDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NjYsIDkzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NgotCQkJCVBhcmVudF9WaWV3IAlANTQKLQkJCQlsb2NhdGlvbiAgIAkoMjgyMCwgMTAyMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA1NwotCQkJICAgIFBhcmVudF9WaWV3IAlANTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNywgLTU5NCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzFGQTAyQTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDUzCi0JCQkgICAgc3VwcGxpZXIgICAJQDUyCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIzODUsIDE0NDcpCi0JCQkJKDE5MzAsIDE0NDcpCi0JCQkJKDE5MzAsIDE4OTApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzODUsIDE0NDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzAsIDE4OTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBANTgKLQkJICAgIGxvY2F0aW9uICAgCSgxODg1LCAyMjA5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMyMjEwMDJEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1zIiBANTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDkwNywgMTY4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE3NTcsIDIzMDkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luaXRQYXJhbXMiCi0JCQkJcGN0RGlzdCAgICAJMC41MTUxNTIKLQkJCQloZWlnaHQgICAgIAkxMjkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzIyMTAxRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg4NSwgMjIwOSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4NSwgMjQwNCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoMTk1OCwgMjM0NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC42OTc5ODcKLQkJCQloZWlnaHQgICAgIAk3MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTA3LCAxNjgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMyMjEwMUU4IgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA1MgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4ODUsIDIyMDkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODUsIDIwMTQpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxNTM1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNkUwMzFGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJoYW5kbGVycyIgQDY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDM1NykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxNjA3LCAxNzc4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitoYW5kbGVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjY4NTE4NQotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTZGMDI1OCIKLQkJCSAgICBjbGllbnQgICAgIAlANjMKLQkJCSAgICBzdXBwbGllciAgIAlANTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCAxNTM1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxODg5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxODE3LCAxNzk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc0MDc0MQotCQkJCWhlaWdodCAgICAgCTY3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDY3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDM1NykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2RjAyNjIiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgMTUzNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTE4MSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBANjgKLQkJICAgIGxvY2F0aW9uICAgCSgxMTk0LCAyMDA3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkzM0MwMkEwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb2FwSGVhZGVycyIgQDY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNjY4LCA1NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDIxMjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI3MQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvYXBIZWFkZXJzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTMzRDAxOTMiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDExOTQsIDIwMDcpCi0JCQkJKDExMzQsIDIwMDcpCi0JCQkJKDExMzQsIDIxNTkpCi0JCQkJKDkwNiwgMjE1OSkKLQkJCQkoOTA2LCAyMDA0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk0LCAyMDA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDYsIDIwMDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDk2MCwgMjA2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBANzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKC02NjgsIDU0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNDM5MzNEMDE5RCIKLQkJCSAgICBjbGllbnQgICAgIAlANjgKLQkJCSAgICBzdXBwbGllciAgIAlANTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk0LCAyMDA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ1LCAyMDA3KSkpKSkpKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzY29tbW9uLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzY29tbW9uLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMWI3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2NvbW1vbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY29tbW9uIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiV3Njb21tb24iKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3c2NvbW1vbi54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzRTE1QjRDMDAxNkYiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkluaXRQYXJhbSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzU4MDM1NSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZDNUQwMDEzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZDNjMwMTdBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFDOTkwMjJGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlci4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3MTg3MDA0OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUFJvbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb2FwUm9sZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUU5QUQwMkQ3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJQb3J0TmFtZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTE1QkJDOTAyMDkiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTVFNEY3MDA3NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRGVzY3JpcHRpb25UeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQjdFMDBDMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRpc3BsYXlOYW1lVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkM3ODAyMzYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREI4MjAzM0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIikpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2RkLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzZGQuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQ1NTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzZGQuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNDAxMSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkZCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldzZGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3c2RkLnhtaSIpKSkNCi0gICAgcXVpZCAgICAgICAJIjNFMTA5RUFEMDMxOSINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiV2ViU2VydmljZXMiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwOUVFRjAxMkYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBXZWIgc2VydmljZSBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXIgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0IwREQwMEREIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4NCi18DQotfEFsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGRlZmluZWQuDQotfA0KLXxVc2VkIGluOiB3ZWJzZXJ2aWNlcw0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImpheHJwY01hcHBpbmdGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkE4MTAxMEMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZBOEYwMjFBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4NCi18DQotfA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbEZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QUEyMDM5MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgV1NETCBmaWxlIGluIHRoZSBtb2R1bGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic21hbGxJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDOTE4MjAwMjMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhcmdlSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1QzkxOTMwMjc2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0U1MjYwMTYzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0U1MzEwMDNDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJQb3J0Q29tcG9uZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGFzc29jaWF0ZXMgYSBXU0RMIHBvcnQgd2l0aCBhIFdlYiBzZXJ2aWNlIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24uICBJdCBkZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGFzIGEgY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMgcmVwcmVzZW50YXRpb25zLCBXU0RMIHBvcnQgUU5hbWUsIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLCBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4uDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydENvbXBvbmVudE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QjExMDM0NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzIG5hbWUuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuDQotfA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkIxODAxNzciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZS4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNtYWxsSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1QzkxRDEwMzhEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXJnZUljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUM5MUUzMDE5RiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFODU5MDJCQyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzcGxheU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFODYyMDA3MCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV1NETFBvcnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOEM4OTAzNjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlcnZpY2VJbXBsQmVhbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzBBMDAxNiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi5BIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViIGNvbXBvbmVudC4gRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIFdlYiBzZXJ2aWNlIHVzaW5nIGFuIGVqYi1saW5rLg0KLXwNCi18VXNlZCBpbjogcG9ydC1jb21wb25lbnQNCi18DQotCSAgICANCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2VydmxldExpbmsiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkRXh0ZW5kcyINCi0JCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRJbXBsZW1lbnRzIg0KLQkJICAgIHZhbHVlICAgICAgCSIiKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCSAgICB2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuDQotfA0KLXxUaGUgdmFsdWUgb2YgdGhlIHNlcnZsZXQtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIHNlcnZsZXQtbmFtZSBvZiBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4NCi18DQotfFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkgICAgcXVpZCAgICAgICAJIjNFMzk1M0E1MDEwQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpCZWFuTGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmxldExpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFFOTM1MDM5QiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRUpCTGluayINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiU3RhdGljIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRFeHRlbmRzIg0KLQkJICAgIHZhbHVlICAgICAgCSIiKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEltcGxlbWVudHMiDQotCQkgICAgdmFsdWUgICAgICAJIiIpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJICAgIHZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzIwMDI4RCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuDQotfA0KLXxUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4NCi18DQotfFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuDQotfA0KLXxFeGFtcGxlczoNCi18PGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4NCi18CTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCSAgICBxdWlkICAgICAgIAkiM0UzOTUzOEIwMTRCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTJFNzAwRUMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlamJMaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExRTkyNDAwOTUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkhhbmRsZXIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLg0KLXwNCi18VXNlZCBpbjogcG9ydC1jb21wb25lbnQNCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNBRkEwMDA3RCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZCRkUwMzQ4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzA1MDEwMyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmVhbkxpbmsiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTM5NTJFNzAwRUMiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUJENjkwMEU4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndzZGxQb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ2QTAzNEMiDQotCQkgICAgbGFiZWwgICAgICAJIndzZGxQb3J0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldTRExQb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ2QTAzNTYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQkQ3NDAyOUMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ3NjAyRjgiDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2aWNlSW1wbEJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzBBMDAxNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDc2MDJGQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDgwMDM3RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJoYW5kbGVycyAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDg0MDI5MyINCi0JCSAgICBsYWJlbCAgICAgIAkiaGFuZGxlcnMgIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDg0MDI5NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzcxMDNDRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlRUpCTGluayINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUMzNzMwMTVCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlRUpCTGluayINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpFSkJMaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMyMDAyOEQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQzM3MzAxNUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzc5MDM4QSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlU2VydmxldExpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzdDMDBEMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZVNlcnZsZXRMaW5rIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZsZXRMaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQzM3QzAwREMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQ0E3MzAzQzUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViU2VydmljZURlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMENBNzYwMzUxIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTBDQTc2MDM1QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlcyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMDlFRUYwMTJGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUI3QzgwMzNGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBvcnRDb21wb25lbnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQjdDQzAyQzMiDQotCQkgICAgbGFiZWwgICAgICAJInBvcnRDb21wb25lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQjdDQzAyQ0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQ0VERTAzMUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUUwMDM3MSINCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDNkUwMjgwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUUwMDM3MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQ0VFODAwMDEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic29hcEhlYWRlcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUVBMDI5OCINCi0JCSAgICBsYWJlbCAgICAgIAkic29hcEhlYWRlcnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBIZWFkZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzk5MDIyRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQ0VFQTAyQTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiM0UzOTUzMDIwMTg5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImJlYW5MaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTM5NTMwNTAwMDciDQotCQkgICAgbGFiZWwgICAgICAJImJlYW5MaW5rIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTJFNzAwRUMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UzOTUzMDUwMDExIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMEEwMDE2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzYwMjkzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNvYXBSb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzgwMjI3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzb2FwUm9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzgwMjMxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUExMDIzNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUEyMDBEOCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkVBMjAwRTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JFQTcwMEMxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRpc3BsYXlOYW1lVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JFQTgwMzFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJkaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRpc3BsYXlOYW1lVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNzgwMjM2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUE4MDMyNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkY4QTAxMTQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25UeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JGOEIwMDc1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvblR5cGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkY4QjAwODkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDNkUwMjgwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1RERCQjcwMzExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERCQjgwMjU1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRlc2NyaXB0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQkI4MDI2OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBMTUwMDMxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUREQkJFMDM5RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQkJGMDMwOSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGlzcGxheU5hbWVUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREJCRjAzMTMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMiINCi0JICAgIHF1aWQgICAgICAgCSIzRjVEREM0NTAwRjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaWNvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQzQ2MDA0NiINCi0JCSAgICBsYWJlbCAgICAgIAkiaWNvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQzQ2MDA1MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBMTUwMDMxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGNURERTk1MDEyMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJpY29uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERFOTYwMTZBIg0KLQkJICAgIGxhYmVsICAgICAgCSJpY29uVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Okljb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTlFRTAwM0EiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERFOTYwMTdFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnRDb21wb25lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUJBRDkwMkEzIg0KLQkgICAgdGl0bGUgICAgICAJIlBvcnRDb21wb25lbnQiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6RUpCTGluayIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMjczNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNzI1LCAyNjYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCTGluayIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzIwMDI4RCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg3MjUsIDI3MTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI4NikNCi0JCSAgICB3aWR0aCAgICAgIAkzMDgNCi0JCSAgICBoZWlnaHQgICAgIAkxNjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmxldExpbmsiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY3LCAyNzE5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxMzkwLCAyNjQ2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldExpbmsiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTM5MCwgMjY5OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzUwKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTE2Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NiwgNjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCA1MDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJRTmFtZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCA2MDIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU1OCkNCi0JCSAgICB3aWR0aCAgICAgIAk1ODANCi0JCSAgICBoZWlnaHQgICAgIAkzNTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTI5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg2NCwgMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg2NCwgMTA2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNTMpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2NDAsIDEyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoNDI0LCAxMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDQyNCwgMTA2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0MjgpDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0MSwgMjQyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTE1NCwgMjM4MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJlYW5MaW5rIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIg0KLQkJICAgIHdpZHRoICAgICAgCTE5Mg0KLQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzhCMDE0QiINCi0JCSAgICBjbGllbnQgICAgIAlAMQ0KLQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDk2OCwgMjY1MCkNCi0JCQkoMTE3MiwgMjQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTNBNTAxMEEiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlANg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDc0LCAyNjM1KQ0KLQkJCSgxMzAyLCAyNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIiBAOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCAyMjM5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgxMTksIDIwNjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIYW5kbGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJbG9jYXRpb24gICAJKDExOSwgMjEyMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzc1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1Mg0KLQkJICAgIGhlaWdodCAgICAgCTM2MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXU0RMUG9ydCIgQDEwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODM5LCAxMDM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQlsb2NhdGlvbiAgIAkoMTc0NywgOTkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV1NETFBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCQkgICAgd2lkdGggICAgICAJMjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNDM4Qzg5MDM2MyINCi0JCSAgICBjbGllbnQgICAgIAlAMTANCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxODQxLCA5ODMpDQotCQkJKDE4NDEsIDg0OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgOTgzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQxLCA4NDgpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2aWNlSW1wbEJlYW4iIEAxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMSwgMTQwOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJbG9jYXRpb24gICAJKDEwODgsIDEzNjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlSW1wbEJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgd2lkdGggICAgICAJMzA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjM1LCAxOTE3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUzMDIwMTg5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImJlYW5MaW5rIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTksIDEyMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgxMTAyLCAyMTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2JlYW5MaW5rIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU1OTQ0MQ0KLQkJCQloZWlnaHQgICAgIAkxMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UzOTUzMDUwMDA3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjM1LCAxOTE3KQ0KLQkJCQkoMTI0MCwgMjM3MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyNSwgMjI3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43ODMyMTcNCi0JCQkJaGVpZ2h0ICAgICAJODYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTksIDEyMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzA1MDAxMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMzUsIDE5MTcpDQotCQkJCSgxMjMxLCAxNDY0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxMjg1LCAxNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NTEwNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRlc2NyaXB0aW9uVHlwZSIgQDE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDQ2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDU1LCAzOTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgd2lkdGggICAgICAJMjkyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEaXNwbGF5TmFtZVR5cGUiIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCA0NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSg0OTEsIDM5NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSIgQDIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjE2LCA0MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjEsIDI1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkljb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjEsIDM1MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNTA2KQ0KLQkJICAgIHdpZHRoICAgICAgCTUyOA0KLQkJICAgIGhlaWdodCAgICAgCTMwNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50IiBAMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMTA0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDMyLCA4NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0Q29tcG9uZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgzMiwgOTAyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2MDQpDQotCQkgICAgd2lkdGggICAgICAJNjI2DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDIzDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMTY0OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDgwMDM3RSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJoYW5kbGVycyAiIEAyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMTU0MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI0DQotCQkJCWxvY2F0aW9uICAgCSgyOTYsIDE5NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraGFuZGxlcnMgIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTA4Mg0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ4NDAyOTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMzNiwgMTY0OSkNCi0JCQkJKDMzNiwgMjA1OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMzkwLCAyMDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDExNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ4LCAxNTQxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJEODQwMjk1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzM2LCAxNjQ5KQ0KLQkJCQkoMzM2LCAxMjQwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgzOTAsIDEyODIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMTE1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAyOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxMDM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENjkwMEU4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxQb3J0IiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTA5LCA5MjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyMiwgMTA4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3c2RsUG9ydCINCi0JCQkJcGN0RGlzdCAgICAJMC40MjEyOTYNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENkEwMzRDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTE5MywgMTAzOCkNCi0JCQkJKDE3MzcsIDEwMzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDE3MzcsIDk5OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMS4wMDM2MjMNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSg5MDksIDkyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDZBMDM1NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExOTMsIDEwMzgpDQotCQkJCSg2NDksIDEwMzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDcwNywgOTg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NDczNw0KLQkJCQloZWlnaHQgICAgIAk1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODc0LCAxMjYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENzQwMjlDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VJbXBsQmVhbiIgQDM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU5MSwgMTE0NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNw0KLQkJCQlQYXJlbnRfVmlldyAJQDM2DQotCQkJCWxvY2F0aW9uICAgCSg5NzEsIDE1MzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZUltcGxCZWFuIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NzUwNw0KLQkJCQloZWlnaHQgICAgIAkyMjINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENzYwMkY4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODc0LCAxMjYwKQ0KLQkJCQkoMTEwMCwgMTM1MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTA2NywgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MTM1NzENCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAzOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTEsIDExNDQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ3NjAyRkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NzQsIDEyNjApDQotCQkJCSg2NDksIDExNjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwDQotCQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQkJbG9jYXRpb24gICAJKDY5MiwgMTEyOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTc1OTUNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA0MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDY5MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUExMDIzNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvblR5cGUiIEA0Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNzIsIC0xMzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5LCA2MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMTMyMA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBMjAwRDgiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDgsIDY5MCkNCi0JCQkJKDIxMSwgNTQyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCWxvY2F0aW9uICAgCSgyNjcsIDU4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjY4OTk1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMyIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKC03MiwgLTEzMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUEyMDBFMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0OCwgNjkwKQ0KLQkJCQkoMjg1LCA4MzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDMzMywgODExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5MDk1NA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDQ3DQotCQkgICAgbG9jYXRpb24gICAJKDUxOSwgNjkwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTcwMEMxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRpc3BsYXlOYW1lVHlwZSIgQDQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MiwgLTEyNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDY2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkaXNwbGF5TmFtZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuMTk0Njc0DQotCQkJCWhlaWdodCAgICAgCTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTgwMzFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTE5LCA2OTApDQotCQkJCSg1OTgsIDU0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjUyLCA2MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3ODUyNw0KLQkJCQloZWlnaHQgICAgIAk4MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIC0xMjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBODAzMjUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MTksIDY5MCkNCi0JCQkJKDQ0MSwgODM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSg0OTcsIDg0OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTgyNzYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzQiIEA1Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDY5NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNURERTk1MDEyMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpY29uVHlwZSIgQDU0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ3NCwgLTM0NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJCWxvY2F0aW9uICAgCSg5NDEsIDU1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpY29uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTkzMjkNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERFOTYwMTZBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODA3LCA2OTYpDQotCQkJCSgxMDAzLCA1NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2DQotCQkJCVBhcmVudF9WaWV3IAlANTQNCi0JCQkJbG9jYXRpb24gICAJKDEwMTUsIDYxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDA1NzUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBANTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDc0LCAtMzQ1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERFOTYwMTdFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODA3LCA2OTYpDQotCQkJCSg2MTEsIDgzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjYzLCA4NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCN0UwMEMxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxOQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE5MiwgMzg1KQ0KLQkJCSgxOTIsIDI1OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCODIwMzNEIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMA0KLQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDY0MCwgMzg1KQ0KLQkJCSg2NDAsIDI1OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViU2VydmljZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMDlFOEEwMTgxIg0KLQkgICAgdGl0bGUgICAgICAJIldlYlNlcnZpY2VzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiIgQDYxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODQsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCWxvY2F0aW9uICAgCSgxNDIsIDEwMDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJbG9jYXRpb24gICAJKDE0MiwgMTA1NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJNjgxKQ0KLQkJICAgIHdpZHRoICAgICAgCTcwMg0KLQkJICAgIGhlaWdodCAgICAgCTQ0OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlcyIgQDYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDY5MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYyDQotCQkJbG9jYXRpb24gICAJKDM3NCwgNjQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViU2VydmljZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwOUVFRjAxMkYiDQotCQkgICAgd2lkdGggICAgICAJMjQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA2Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDg2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBDQTczMDNDNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIiBANjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMywgNTYzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1DQotCQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQkJbG9jYXRpb24gICAJKDIzOSwgOTgyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYlNlcnZpY2VEZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTM4NDE2DQotCQkJCWhlaWdodCAgICAgCTI0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQ0E3NjAzNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0ODUsIDg2OCkNCi0JCQkJKDQ4NCwgOTkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSg1MzgsIDk3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTg4MjcNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBANjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMywgNTYzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMENBNzYwMzVCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDg1LCA4NjgpDQotCQkJCSg0ODYsIDc0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNTQwLCA3NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk4Njc4DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIiBANjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4NywgMjgxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE0MSwgMTAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE0MSwgMjE3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNDM3KQ0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTM4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQjBERDAwREQiDQotCQkgICAgY2xpZW50ICAgICAJQDYyDQotCQkgICAgc3VwcGxpZXIgICAJQDY5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQ4NywgNjM0KQ0KLQkJCSg0ODcsIDQ3MikpDQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBENjZCMDJFQSINCi0JICAgIHRpdGxlICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMjYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiIEA3MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE3NiwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzENCi0JCQlsb2NhdGlvbiAgIAkoMTk2MCwgNTIxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGlzcGxheU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJbG9jYXRpb24gICAJKDE5NjAsIDYxNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBANzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwOTYsIDMyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyOTcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI1MykNCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCIgQDczDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDE2MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCWxvY2F0aW9uICAgCSg5MSwgMTQzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBvcnRDb21wb25lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDczDQotCQkJbG9jYXRpb24gICAJKDkxLCAxNDgzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2MDQpDQotCQkgICAgd2lkdGggICAgICAJNjI2DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiIEA3NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMzIwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MSwgMjUyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE1Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREI3RTAwQzEiDQotCQkgICAgY2xpZW50ICAgICAJQDc0DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1NTQsIDMyMCkNCi0JCQkoMTk1OCwgMzIwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGlzcGxheU5hbWVUeXBlIiBANzYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDY0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJbG9jYXRpb24gICAJKDEyNzUsIDU3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCODIwMzNEIg0KLQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA3MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTgyLCA2NDApDQotCQkJKDE5NTAsIDY0MCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSIgQDc4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCA5OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCWxvY2F0aW9uICAgCSgxMjMzLCA4NDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJY29uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OUVFMDAzQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQlsb2NhdGlvbiAgIAkoMTIzMywgOTQ1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk1MDYpDQotCQkgICAgd2lkdGggICAgICAJNTI4DQotCQkgICAgaGVpZ2h0ICAgICAJMzA2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiIgQDc5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDY0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc5DQotCQkJbG9jYXRpb24gICAJKDUzLCA0MzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDc5DQotCQkJbG9jYXRpb24gICAJKDUzLCA0ODIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOA0KLQkJCW1heF93aWR0aCAgCTY4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk3MDINCi0JCSAgICBoZWlnaHQgICAgIAk0NDgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDgwDQotCQkgICAgbG9jYXRpb24gICAJKDM5NSwgMTE0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCN0M4MDMzRiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwb3J0Q29tcG9uZW50cyIgQDgxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNywgOTgzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCVBhcmVudF9WaWV3IAlAODENCi0JCQkJbG9jYXRpb24gICAJKDM1NSwgMTM2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwb3J0Q29tcG9uZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC43OTc5MjANCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUI3Q0MwMkMzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODANCi0JCQkgICAgc3VwcGxpZXIgICAJQDczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk1LCAxMTQ0KQ0KLQkJCQkoMzk1LCAxNDIwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDgxDQotCQkJCWxvY2F0aW9uICAgCSg0NDksIDEzOTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk4OTYwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDg0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNywgOTgzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUI3Q0MwMkNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODANCi0JCQkgICAgc3VwcGxpZXIgICAJQDc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk1LCAxMTQ0KQ0KLQkJCQkoMzk1LCA4NjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1DQotCQkJCVBhcmVudF9WaWV3IAlAODQNCi0JCQkJbG9jYXRpb24gICAJKDQ0OSwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDI5OA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDg2DQotCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkI3MDMxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvblR5cGUiIEA4Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDgsIC0xODkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5OCwgMzQ2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTY1MzINCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCQjgwMjU1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAwMywgNDQ4KQ0KLQkJCQkoMTI2MSwgMzY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSgxMjUxLCA0MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk2NDE2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDkwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDY0OCwgLTE4OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkI4MDI2OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDMsIDQ0OCkNCi0JCQkJKDc0NiwgNTMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSg3ODksIDU3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTQ4NzUNCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEA5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCA2NDEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCRTAzOUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGlzcGxheU5hbWVUeXBlIiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ5LCAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMTEsIDYwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkaXNwbGF5TmFtZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzk2OTkyDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkJGMDMwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA3Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDUsIDY0MSkNCi0JCQkJKDEyNjUsIDY0MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzOCwgNjk0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODQ5Ng0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEiIEA5Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDksIDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCRjAzMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDA1LCA2NDEpDQotCQkJCSg3NDYsIDY0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCQlsb2NhdGlvbiAgIAkoNzcyLCA2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk4NDk2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyIiBAOTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTg0LCA4MzApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREM0NTAwRjkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaWNvblR5cGUiIEA5OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk4DQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzEsIDE4NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDANCi0JCQkJUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NywgODUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ljb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NTAwMw0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREM0NjAwNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUA5OA0KLQkJCSAgICBzdXBwbGllciAgIAlANzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5ODQsIDgzMCkNCi0JCQkJKDEyMjMsIDkwNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxDQotCQkJCVBhcmVudF9WaWV3IAlAOTkNCi0JCQkJbG9jYXRpb24gICAJKDExODMsIDk1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDE5NDYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMzIiBAMTAyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMSwgMTg1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERDNDYwMDUwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTg0LCA4MzApDQotCQkJCSg3NDYsIDc1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJCWxvY2F0aW9uICAgCSg3NTgsIDgxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODk5MTgNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkhhbmRsZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUNDNTAwMzA0Ig0KLQkgICAgdGl0bGUgICAgICAJIkhhbmRsZXIiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNjk0DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMTA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODM2LCAxMDEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA0DQotCQkJbG9jYXRpb24gICAJKDE1NTUsIDg0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlFOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQlsb2NhdGlvbiAgIAkoMTU1NSwgOTQyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1NTgpDQotCQkgICAgd2lkdGggICAgICAJNTgwDQotCQkgICAgaGVpZ2h0ICAgICAJMzUyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpTT0FQSGVhZGVyIiBAMTA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxNDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJbG9jYXRpb24gICAJKDk3NSwgMTM3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBIZWFkZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUM5OTAyMkYiDQotCQkgICAgd2lkdGggICAgICAJMjQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzE4NzAwNDkiDQotCQkgICAgY2xpZW50ICAgICAJQDEwNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTIxMCwgMTM4MikNCi0JCQkoMTU0NSwgMTE4MykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBSb2xlIiBAMTA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDE4NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMzQ4LCAxNzM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUFJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgzNDgsIDE4MzApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMxMikNCi0JCSAgICB3aWR0aCAgICAgIAkzNzgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciIgQDEwOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjgxLCA4ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDc1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhhbmRsZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCWxvY2F0aW9uICAgCSg2MiwgODA5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNzUpDQotCQkgICAgd2lkdGggICAgICAJNDU2DQotCQkgICAgaGVpZ2h0ICAgICAJMjc1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEAxMDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzE5LCAxMTk1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUNFRTgwMDAxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNvYXBIZWFkZXJzIiBAMTEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODIsIDEwOTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExDQotCQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJCWxvY2F0aW9uICAgCSg4OTIsIDEzNjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc29hcEhlYWRlcnMiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5OTcwDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUVBMDI5OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE5LCAxMTk1KQ0KLQkJCQkoOTY1LCAxMzY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJbG9jYXRpb24gICAJKDk3MCwgMTMwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDEyNjANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBAMTEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODIsIDEwOTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VFQTAyQTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcxOSwgMTE5NSkNCi0JCQkJKDQ3NSwgMTAyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSg1MzAsIDk5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTc5NTkNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEAxMTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDA2LCAxMzcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzYwMjkzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNvYXBSb2xlcyIgQDExNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0MTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJCWxvY2F0aW9uICAgCSgzNzUsIDE2NTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc29hcFJvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczMjk2OA0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzgwMjI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0MDYsIDEzNzIpDQotCQkJCSg0OTcsIDE3MjMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQlsb2NhdGlvbiAgIAkoNTc0LCAxNjgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MDA4Ng0KLQkJCQloZWlnaHQgICAgIAk4Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEiIEAxMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDEzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzgwMjMxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0MDYsIDEzNzIpDQotCQkJCSgzMTUsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzc2LCAxMDQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiIEAxMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDUyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCWxvY2F0aW9uICAgCSgxNTkxLCA0NjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgd2lkdGggICAgICAJMjkyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpJbml0UGFyYW0iIEAxMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDk2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMg0KLQkJCWxvY2F0aW9uICAgCSg4NTAsIDgxMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkluaXRQYXJhbSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTIyDQotCQkJbG9jYXRpb24gICAJKDg1MCwgOTA5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzNTYpDQotCQkgICAgd2lkdGggICAgICAJNDMwDQotCQkgICAgaGVpZ2h0ICAgICAJMzE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxMjMNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjc0LCA5MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VERTAzMUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtcyAiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzNywgODA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoNjk2LCA5NDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraW5pdFBhcmFtcyAiDQotCQkJCXBjdERpc3QgICAgCTAuMTQzNTkwDQotCQkJCWhlaWdodCAgICAgCTI2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUUwMDM3MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjc0LCA5MjEpDQotCQkJCSg4NDAsIDkzNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSg4MjgsIDg4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkzNTkNCi0JCQkJaGVpZ2h0ICAgICAJNTINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBAMTI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzcsIDgwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUUwMDM3MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjc0LCA5MjEpDQotCQkJCSg1MDksIDkwNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4DQotCQkJCVBhcmVudF9WaWV3IAlAMTI3DQotCQkJCWxvY2F0aW9uICAgCSg1MzIsIDg1NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkxMjUNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEAxMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQzOCwgNzEzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JGOEEwMTE0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9uVHlwZXMiIEAxMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NiwgLTI0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDU5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvblR5cGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMzY5Mg0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkY4QjAwNzUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzgsIDcxMykNCi0JCQkJKDE2MDUsIDYwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxNjE1LCA2NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk1MjkwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNyIgQDEzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzg2LCAtMjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JGOEIwMDg5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDM4LCA3MTMpDQotCQkJCSgxMjcxLCA4MjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgODU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5MTUwOA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDEzNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM2OCwgNTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJbG9jYXRpb24gICAJKDIyNDAsIDQwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQlsb2NhdGlvbiAgIAkoMjI0MCwgNTA1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNTMpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDEzNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA0OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzYNCi0JCQlsb2NhdGlvbiAgIAkoODIsIDQyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREI3RTAwQzEiDQotCQkgICAgY2xpZW50ICAgICAJQDEyMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg3NCwgNTI4KQ0KLQkJCSgyMjMwLCA1MjgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9zY2hlbWEvZWpiTW9kZWxFeHRlbmRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3NjaGVtYS9lamJNb2RlbEV4dGVuZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDE0YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3NjaGVtYS9lamJNb2RlbEV4dGVuZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgaWQ9ImVqYk1vZGVsRXh0ZW5kZXIiIG5hbWU9IkVKQiBNb2RlbCBFeHRlbmRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgZm9yIGEgaGVscGVyIHRvIGJlIGNvbnRyaWJ1dGVkIGZvciBkZXJpdmluZyB0aGUgSk5ESSBuYW1lIG9mIGVudGVycHJpc2UgYmVhbnMsIGFuZCBmb3IgaW5oZXJpdGFuY2Ugc3VwcG9ydC4gIFRoZSBoZWxwZXIgY2FuIGJlIHBsdWdnZWQgaW4gYnkgYXBwbGljYXRpb24KLXNlcnZlciB2ZW5kb3JzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlamJNb2RlbEV4dGVuZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWpiTW9kZWxFeHRlbmRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGV4dGVuZGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0byB1c2UgdG8gZXh0ZW5kIHRoZSBFSkIgbW9kZWwKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3NjaGVtYS9qbmRpQmluZGluZ3NIZWxwZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvc2NoZW1hL2puZGlCaW5kaW5nc0hlbHBlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjMDQxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvc2NoZW1hL2puZGlCaW5kaW5nc0hlbHBlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiBpZD0iam5kaUJpbmRpbmdzSGVscGVycyIgbmFtZT0iam5kaUJpbmRpbmdzSGVscGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgZm9yIGEgaGVscGVyIHRvIGJlIGNvbnRyaWJ1dGVkIGZvciBkZXJpdmluZyB0aGUgSk5ESSBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciBlbnRlcnByaXNlIGJlYW5zLiAgVGhlIGhlbHBlciBjYW4gYmUgcGx1Z2dlZCBpbiBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdmVuZG9ycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iam5kaUJpbmRpbmdzSGVscGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpuZGlCaW5kaW5nc0hlbHBlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBiaW5kaW5ncyBoZWxwZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoZWxwZXIgY2xhc3MgdXNlcyBpbiB0aGlzIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5iaW5kaW5ncy5BYnN0cmFjdEJpbmRpbmdzSGVscGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWFhMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciBlbGVtZW50IGRlZmluZXMgdGhlIG9yZGVyIHRoYXQgY29tcGxleFR5cGUgZWxlbWVudCB2YWx1ZXMgYXJlIGFwcGxpZWQgdG8gYSBKYXZhIGV4Y2VwdGlvbiBjb25zdHJ1Y3Rvci4gRWxlbWVudCBuYW1lcyBhcmUgc3BlY2lmaWVkIGZvciBlYWNoIHBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IsIGluY2x1ZGluZyBlbGVtZW50IG5hbWVzIG9mIGluaGVyaXRlZCB0eXBlcyBpZiBuZWNlc3NhcnkuCi0gKiAKLSAqIFVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0RWxlbWVudE5hbWVzIDxlbT5FbGVtZW50IE5hbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEVsZW1lbnROYW1lcygpOwotCi19IC8vIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FbGVtZW50TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0VsZW1lbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmNhMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0VsZW1lbnROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBjb21wbGV4VHlwZSBlbGVtZW50IG5hbWUgYXR0cmlidXRlIHZhbHVlLgotICogCi0gKiBVc2VkIGluOiBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldFRleHQgPGVtPlRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RWxlbWVudE5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RWxlbWVudE5hbWVfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFbGVtZW50TmFtZV9UZXh0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRUZXh0IDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFbGVtZW50TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0V4Y2VwdGlvbk1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FeGNlcHRpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzBlZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0V4Y2VwdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB0aGUgd3NkbCBmYXVsdHMuCi0gKiAKLSAqIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotICogbWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlIG1hcHBpbmcgY29udGV4dC4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25NYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNlcHRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhjZXB0aW9uLXR5cGUgZWxlbWVudCBkZWZpbmVzIEphdmEgdHlwZSBvZiB0aGUgZXhjZXB0aW9uLiBJdCBtYXkgYmUgYSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBJdCBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0JICogCi0JICogVXNlZCBpbjogZXhjZXB0aW9uLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2VwdGlvblR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEV4Y2VwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0RXhjZXB0aW9uVHlwZSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEV4Y2VwdGlvblR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgdmFsdWUpOwotCi19IC8vIEV4Y2VwdGlvbk1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9JbnRlcmZhY2VNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSW50ZXJmYWNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA1NDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9JbnRlcmZhY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRJbnRlcmZhY2VNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZU1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0gLy8gSW50ZXJmYWNlTWFwcGluZwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFXU0RMTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFXU0RMTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTM5YTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXZhV1NETE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgV1NETCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIG1hcHBpbmcgdG8gYSBrbm93biBXU0RMIGRvY3VtZW50Lkl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQgWE1MIG5hbWVzcGFjZXMsIAotICogV1NETCByb290IHR5cGVzIGFuZCBKYXZhIGFydGlmYWN0cywgYW5kIHRoZSBzZXQgb2YgbWFwcGluZ3MgZm9yIHNlcnZpY2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRQYWNrYWdlTWFwcGluZ3MgPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0RXhjZXB0aW9uTWFwcGluZ3MgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEludGVyZmFjZU1hcHBpbmdzIDxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFXU0RMTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFBhY2thZ2VNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNlcHRpb24gTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEV4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEludGVyZmFjZU1hcHBpbmdzKCk7Ci0KLX0gLy8gSmF2YVdTRExNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVhNTFR5cGVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVhNTFR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTcxYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFYTUxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgY2xhc3MtdHlwZSB0aGF0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgUU5hbWUgb2YgdGhlIFhNTCByb290IHR5cGUsIHRoZSBXU0RMIHR5cGUgc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgCi0gKiBtYXBwaW5ncyBmb3IgZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLgotICogCi0gKiBVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRDbGFzc1R5cGUgPGVtPkNsYXNzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRWYXJpYWJsZU1hcHBpbmdzIDxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVhNTFR5cGVNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjbGFzcy10eXBlIGVsZW1lbnQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBjbGFzcy4KLQkgKiAKLQkgKiBVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0Q2xhc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Q2xhc3NUeXBlIDxlbT5DbGFzcyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0Q2xhc3NUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RbmFtZSBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RbmFtZSBTY29wZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETCBlbGVtZW50IHR5cGUgaXQgYXBwbGllcyB0by4gVGhlIHZhbHVlIG9mIHFuYW1lLXNjb3BlIG1heSBiZSBzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4KLQkgKiAKLQkgKiBVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFFuYW1lU2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UW5hbWVTY29wZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFFuYW1lU2NvcGUgPGVtPlFuYW1lIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFFuYW1lU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRRbmFtZVNjb3BlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QW5vbnltb3VzVHlwZVFuYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0QW5vbnltb3VzVHlwZVFuYW1lIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFub255bW91cyBUeXBlIFFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRBbm9ueW1vdXNUeXBlUW5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvb3QgVHlwZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb290VHlwZVFuYW1lKFJvb3RUeXBlUW5hbWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUm9vdFR5cGVRbmFtZSBnZXRSb290VHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Um9vdFR5cGVRbmFtZSA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSb290VHlwZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0VmFyaWFibGVNYXBwaW5ncygpOwotCi19IC8vIEphdmFYTUxUeXBlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDMxNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4cnBjbWFwRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSmF4cnBjbWFwRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEphdmFXU0RMTWFwcGluZyBjcmVhdGVKYXZhV1NETE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUGFja2FnZU1hcHBpbmcgY3JlYXRlUGFja2FnZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSmF2YVhNTFR5cGVNYXBwaW5nIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRXhjZXB0aW9uTWFwcGluZyBjcmVhdGVFeGNlcHRpb25NYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmljZUludGVyZmFjZU1hcHBpbmcgY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUm9vdFR5cGVRbmFtZSBjcmVhdGVSb290VHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgVmFyaWFibGVNYXBwaW5nIGNyZWF0ZVZhcmlhYmxlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZSBjcmVhdGVXU0RMTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRWxlbWVudE5hbWUgY3JlYXRlRWxlbWVudE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFNlcnZpY2UgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExTZXJ2aWNlTmFtZSBjcmVhdGVXU0RMU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUG9ydE1hcHBpbmcgY3JlYXRlUG9ydE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExQb3J0VHlwZSBjcmVhdGVXU0RMUG9ydFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETEJpbmRpbmcgY3JlYXRlV1NETEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIGNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExPcGVyYXRpb24gY3JlYXRlV1NETE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExNZXNzYWdlTWFwcGluZyBjcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZVBhcnROYW1lIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEludGVyZmFjZU1hcHBpbmcgY3JlYXRlSW50ZXJmYWNlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSmF4cnBjbWFwUGFja2FnZSBnZXRKYXhycGNtYXBQYWNrYWdlKCk7Ci0KLX0gLy9KYXhycGNtYXBGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlOGI4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheHJwY21hcFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTkFNRSA9ICJqYXhycGNtYXAiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1VSSSA9ICJqYXhycGNtYXAueG1pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSmF4cnBjbWFwUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsIDxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFXU0RMTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElORyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbCA8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFBhY2thZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBQQUNLQUdFX01BUFBJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQQUNLQUdFX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElORyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RbmFtZSBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFub255bW91cyBUeXBlIFFuYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0FOT05ZTU9VU19UWVBFX1FOQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9vdCBUeXBlIFFuYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsIDxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEV4Y2VwdGlvbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSU5URVJGQUNFX01BUFBJTkcgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgU2VydmljZSBOYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUyA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgUG9ydCBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUm9vdFR5cGVRbmFtZUltcGwgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlJvb3RUeXBlUW5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFJvb3RUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFJPT1RfVFlQRV9RTkFNRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCA8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIFZhcmlhYmxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBFbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YbWwgQXR0cmlidXRlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBXaWxkY2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlSW1wbCA8ZW0+V1NETCBNZXNzYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0UgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkVsZW1lbnROYW1lSW1wbCA8ZW0+RWxlbWVudCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRWxlbWVudE5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRUxFTUVOVF9OQU1FX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVMRU1FTlRfTkFNRV9fVEVYVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVMRU1FTlRfTkFNRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VOYW1lSW1wbCA8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExTZXJ2aWNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUUgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwgPGVtPlBvcnQgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBvcnRNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRQb3J0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgUE9SVF9NQVBQSU5HID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElOR19fUE9SVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBQb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3J0IE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExQb3J0VHlwZUltcGwgPGVtPldTREwgUG9ydCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFBvcnRUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMUG9ydFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX1RZUEVfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX1RZUEVfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX1RZUEVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETEJpbmRpbmdJbXBsIDxlbT5XU0RMIEJpbmRpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMQmluZGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElORyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElOR19fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElOR19fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsIDxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgTWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XcmFwcGVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgT3BlcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORyA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBQb3NpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFJldHVybiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsIDxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElORyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwgPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZVBhcnROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyA8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0SmF2YVdTRExNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEphdmFXU0RMTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRQYWNrYWdlTWFwcGluZ3MgPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldFBhY2thZ2VNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRKYXZhV1NETE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRFeGNlcHRpb25NYXBwaW5ncyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEV4Y2VwdGlvbk1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRKYXZhV1NETE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SW50ZXJmYWNlTWFwcGluZ3MgPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRJbnRlcmZhY2VNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyA8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFBhY2thZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlIDxlbT5QYWNrYWdlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0UGFja2FnZVR5cGUoKQotCSAqIEBzZWUgI2dldFBhY2thZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UGFja2FnZU1hcHBpbmdfUGFja2FnZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBzZWUgI2dldFBhY2thZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UGFja2FnZU1hcHBpbmdfTmFtZXNwYWNlVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEphdmFYTUxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Q2xhc3NUeXBlIDxlbT5DbGFzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Q2xhc3NUeXBlKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RbmFtZSBTY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0QW5vbnltb3VzVHlwZVFuYW1lIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBzZWUgI2dldEphdmFYTUxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Um9vdFR5cGVRbmFtZSgpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0VmFyaWFibGVNYXBwaW5ncyA8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRWYXJpYWJsZU1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfVmFyaWFibGVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEV4Y2VwdGlvbk1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXhjZXB0aW9uTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRFeGNlcHRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotCSAqIEBzZWUgI2dldEV4Y2VwdGlvbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIDxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsU2VydmljZU5hbWUgPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFNlcnZpY2VOYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvcnQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRQb3J0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFBvcnRUeXBlIDxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFBvcnRUeXBlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsQmluZGluZyA8ZW0+V3NkbCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbEJpbmRpbmcoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRSb290VHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcgPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRWYXJpYWJsZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldEphdmFWYXJpYWJsZU5hbWUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEVsZW1lbnROYW1lKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBNZW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNEYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sQXR0cmlidXRlTmFtZSA8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfWG1sQXR0cmlidXRlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhtbCBXaWxkY2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlIDxlbT5XU0RMIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgTWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldElkKCkKLQkgKiBAc2VlICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0RWxlbWVudE5hbWVzIDxlbT5FbGVtZW50IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWxlbWVudCBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0RWxlbWVudE5hbWVzKCkKLQkgKiBAc2VlICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0RWxlbWVudE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RWxlbWVudE5hbWVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0VGV4dCgpCi0JICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRFbGVtZW50TmFtZV9UZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWUgPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIFNlcnZpY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExTZXJ2aWNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcgPGVtPlBvcnQgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRQb3J0TWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UG9ydE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldFBvcnROYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRNYXBwaW5nX1BvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldEphdmFQb3J0TmFtZSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRKYXZhUG9ydE5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGUgPGVtPldTREwgUG9ydCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExQb3J0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmcgPGVtPldTREwgQmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRKYXZhTWV0aG9kTmFtZSA8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRKYXZhTWV0aG9kTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24gPGVtPldTREwgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V1NETE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExPcGVyYXRpb25fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQHNlZSAjZ2V0V1NETE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW0gUG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRQYXJhbVBvc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1UeXBlIDxlbT5QYXJhbSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRQYXJhbVR5cGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFdzZGxNZXNzYWdlTWFwcGluZyA8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldE1ldGhvZFJldHVyblZhbHVlIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldE1ldGhvZFJldHVyblZhbHVlKCkKLQkgKiBAc2VlICNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyA8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRQYXJhbWV0ZXJNb2RlIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRQYXJhbWV0ZXJNb2RlKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEhlYWRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNpc1NvYXBIZWFkZXIoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lIDxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldElkKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQHNlZSAjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlUGFydE5hbWVfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZyA8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSmF4cnBjbWFwRmFjdG9yeSBnZXRKYXhycGNtYXBGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFXU0RMTWFwcGluZ0ltcGwgPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRKYXZhV1NETE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9XU0RMX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfV1NETF9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbCA8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFBhY2thZ2VNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBQ0tBR0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQUNLQUdFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9YTUxfVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSA9IGVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RbmFtZSBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUgPSBlSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFub255bW91cyBUeXBlIFFuYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSA9IGVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSA9IGVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFibGUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWENFUFRJT05fTUFQUElORyA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYQ0VQVElPTl9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsIDxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBQb3J0IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBCaW5kaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlJvb3RUeXBlUW5hbWVJbXBsIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlJvb3RUeXBlUW5hbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRSb290VHlwZVFuYW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPT1RfVFlQRV9RTkFNRSA9IGVJTlNUQU5DRS5nZXRSb290VHlwZVFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwgPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFZhcmlhYmxlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBWQVJJQUJMRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgVmFyaWFibGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WG1sIEVsZW1lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSID0gZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YbWwgQXR0cmlidXRlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhtbCBXaWxkY2FyZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCA9IGVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VJbXBsIDxlbT5XU0RMIE1lc3NhZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE1lc3NhZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV1NETF9NRVNTQUdFID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA9IGVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTID0gZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkVsZW1lbnROYW1lSW1wbCA8ZW0+RWxlbWVudCBOYW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEVsZW1lbnROYW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTEVNRU5UX05BTUVfX0lEID0gZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxFTUVOVF9OQU1FX19URVhUID0gZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX1RleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VOYW1lSW1wbCA8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlTmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExTZXJ2aWNlTmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX1NFUlZJQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRXU0RMU2VydmljZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBvcnRNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0UG9ydE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfTUFQUElOR19fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX1BvcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExQb3J0VHlwZUltcGwgPGVtPldTREwgUG9ydCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMUG9ydFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV1NETF9QT1JUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V1NETFBvcnRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExCaW5kaW5nSW1wbCA8ZW0+V1NETCBCaW5kaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMQmluZGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExCaW5kaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfQklORElORyA9IGVJTlNUQU5DRS5nZXRXU0RMQmluZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgTWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgT3BlcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XcmFwcGVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbCA8ZW0+V1NETCBPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMT3BlcmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfT1BFUkFUSU9OID0gZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9PUEVSQVRJT05fX0lEID0gZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgT3BlcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OID0gZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsIDxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFJldHVybiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgPSBlSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsIDxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfTUVTU0FHRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXU0RMX01FU1NBR0VfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUiA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwgPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRCA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5JbnRlcmZhY2VNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SW50ZXJmYWNlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTlRFUkZBQ0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQl9Ci0KLX0gLy9KYXhycGNtYXBQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA3ZDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBKYXhycGNtYXBSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBWFJQQ19NQVBfVFlQRSA9IDg7Ci0KLSAgSmF2YVdTRExNYXBwaW5nIGdldEphdmFXU0RMTWFwcGluZygpOwotICBwdWJsaWMgYm9vbGVhbiBpc0pheHJwY21hcDFfMCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc0pheHJwY21hcDFfMSgpOwotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3MWM3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5Ci17Ci0gIC8qKgotICAqIEpheHJwY21hcFJlc291cmNlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICAqLwotICBwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSAKLSAgewotCSAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBKYXhycGNtYXBSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgICAvL0RvIG5vdGhpbmcgc2luY2UgdGhlIGpheHJwYyBtYXBwaW5nIGZpbGUgaGFzIG5vIHN0YW5kYXJkIG5hbWUuCi0gIAkvL0oyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotICB9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkgICAgLy9EbyBub3RoaW5nIHNpbmNlIHRoZSBqYXhycGMgbWFwcGluZyBmaWxlIGhhcyBubyBzdGFuZGFyZCBuYW1lLgotCQkvL3JlZ2lzdGVyV2l0aChFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsKLQl9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSAKLSAgewotICAJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX1NZU1RFTUlELCAiajJlZV9qYXhycGNfbWFwcGluZ18xXzAuZHRkIik7Ly8kTk9OLU5MUy0xJAotCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TQ0hFTUFfTE9DLCAiajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQgIAkKLQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU0NIRU1BX0xPQ19TVU4sICJqMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJCAgCQkJCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiZmQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYSBKYXZhIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCBhIHdzZGwtbWVzc2FnZS4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtVHlwZSA8ZW0+UGFyYW0gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbSBQb3NpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlciBzdGFydGluZyBmcm9tIDAuCi0JICogCi0JICogVXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtUG9zaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQYXJhbVBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRQYXJhbVBvc2l0aW9uIDxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbVBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFyYW1Qb3NpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwYXJhbS10eXBlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIGEgcGFyYW1ldGVyIHdpdGhpbiBhIEphdmEgbWV0aG9kLiBJdCBtdXN0IGJlIGRlZmluZWQgYnkgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzLgotCSAqIAotCSAqIFVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRQYXJhbVR5cGUgPGVtPlBhcmFtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQYXJhbVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZU1hcHBpbmcgZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRXc2RsTWVzc2FnZU1hcHBpbmcgPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlTWFwcGluZyhXU0RMTWVzc2FnZU1hcHBpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUGFja2FnZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9QYWNrYWdlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThkMTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9QYWNrYWdlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcGFja2FnZS1tYXBwaW5nIGluZGljYXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGphdmEtcGFja2FnZS1uYW1lIGFuZCBYTUwgbmFtZXNwYWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LgotICogCi0gKiBVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0UGFja2FnZVR5cGUgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFBhY2thZ2VNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2VNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFBhY2thZ2VNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhY2thZ2UtdHlwZSBpbmRpY2F0ZXMgdGhlIEphdmEgcGFja2FnZSBuYW1lLiBJdCBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogVXNlZCBpbjogcGFja2FnZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFja2FnZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlIDxlbT5QYWNrYWdlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFja2FnZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUGFja2FnZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Qb3J0TWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1BvcnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTIzMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1BvcnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUgYXR0cmlidXRlIHRvIHRoZSBKYXZhIG5hbWUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZCBnZXQ8amF2YS1uYW1lPi4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SmF2YVBvcnROYW1lIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0TWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LW5hbWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG5hbWUgYXR0cmlidXRlIG9mIGEgV1NETCBwb3J0IGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogcG9ydC1tYXBwaW5nCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphdmEgUG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXZhLXBvcnQtbmFtZSBlbGVtZW50IGlzIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBwb3J0IG5hbWUgaW4gSmF2YS4gIEl0IGlzIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZAotCSAqIGdldDxqYXZhLXBvcnQtbmFtZT4uCi0JICogCi0JICogVXNlZCBpbjogcG9ydC1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhUG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEphdmFQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SmF2YVBvcnROYW1lIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhUG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXZhUG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0TWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1Jvb3RUeXBlUW5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Sb290VHlwZVFuYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmFmMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1Jvb3RUeXBlUW5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcm9vdC10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4gWE1MIHR5cGUuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0Um9vdFR5cGVRbmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb290VHlwZVFuYW1lIGV4dGVuZHMgUU5hbWUgewotLy8gUm9vdFR5cGVRbmFtZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzEzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGRlZmluZXMgYSB0dXBsZQotICogdG8gc3BlY2lmeSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gV1NETCBwb3J0IHR5cGVzIGFuZCBXU0RMIGJpbmRpbmdzLgotICogCi0gKiBBbiBpbnRlcmZhY2UgbWF5IGJlIG1hcHBlZCB0byBhIHBvcnQtdHlwZSBhbmQgYmluZGluZyBtdWx0aXBsZSB0aW1lcy4gVGhpcyBoYXBwZW5zIHJhcmVseS4KLSAqIAotICogVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbEJpbmRpbmcgPGVtPldzZGwgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIGV4dGVuZHMgSW50ZXJmYWNlTWFwcGluZyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgUG9ydCBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgUG9ydCBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgUG9ydCBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsUG9ydFR5cGUoV1NETFBvcnRUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExQb3J0VHlwZSBnZXRXc2RsUG9ydFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFBvcnRUeXBlIDxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgUG9ydCBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsUG9ydFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsUG9ydFR5cGUoV1NETFBvcnRUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIEJpbmRpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBCaW5kaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsQmluZGluZyhXU0RMQmluZGluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExCaW5kaW5nIGdldFdzZGxCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxCaW5kaW5nIDxlbT5Xc2RsIEJpbmRpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEJpbmRpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbEJpbmRpbmcoV1NETEJpbmRpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKTsKLQotfSAvLyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTI3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiBKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkgcW5hbWVzKS4KLSAqIAotICogVGhlIHdzZGwtb3BlcmF0aW9uIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5nIGluIHdoaWNoIHRoaXMgZGVmaW5pdGlvbiBpcyBlbWJlZGRlZCB3aXRoaW4uIFNlZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcgYW5kIAotICogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyB0byBhY3F1aXJlIHRoZSBwcm9wZXIgY29udGV4dC4gVGhlIHdyYXBwZWQtZWxlbWVudCBpbmRpY2F0b3Igc2hvdWxkIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gYSBXU0RMIG1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMgbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjaXNXcmFwcGVkRWxlbWVudCA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXZhIE1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGphdmEtbWV0aG9kLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgSmF2YSBtZXRob2Qgd2l0aGluIGFuIGludGVyZmFjZS4KLQkgKiAKLQkgKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEphdmFNZXRob2ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SmF2YU1ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEphdmFNZXRob2ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd3NkbC1vcGVyYXRpb24gZWxlbWVudCBkZWZpbmVzIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50LiBJdCBtdXN0IGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byBhIHBvcnQgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsT3BlcmF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxPcGVyYXRpb24gPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsT3BlcmF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XcmFwcGVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjdW5zZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjc2V0V3JhcHBlZEVsZW1lbnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzV3JhcHBlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjaXNXcmFwcGVkRWxlbWVudCA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICN1bnNldFdyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3JhcHBlZEVsZW1lbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjaXNXcmFwcGVkRWxlbWVudCA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjc2V0V3JhcHBlZEVsZW1lbnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRXcmFwcGVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2lzV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3NldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0V3JhcHBlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGdldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgdmFsdWUpOwotCi19IC8vIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2IyZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgaG93IGEgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZSBpbnRlcmZhY2UgbWFwcyB0byBhIFdTREwgc2VydmljZS4KLSAqIAotICogVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxTZXJ2aWNlTmFtZSA8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBleHRlbmRzIEludGVyZmFjZU1hcHBpbmcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UuIEZvciBzdGF0aWMgc2VydmljZXMsIGl0IGlzIGphdmF4LnhtbC5ycGMuU2VydmljZSBpbnRlcmZhY2UuIEZvciBnZW5lcmF0ZWQgc2VydmljZSwgaXQgd291bGQgYmUgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgbmFtZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0JICogCi0JICogVXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZUludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIFNlcnZpY2UgTmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFNlcnZpY2VOYW1lIGdldFdzZGxTZXJ2aWNlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFNlcnZpY2VOYW1lIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsU2VydmljZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsU2VydmljZU5hbWUoV1NETFNlcnZpY2VOYW1lIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRQb3J0TWFwcGluZ3MoKTsKLQotfSAvLyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1ZhcmlhYmxlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1ZhcmlhYmxlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2ZiYmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9WYXJpYWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFyaWFibGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB2YXJpYWJsZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBhIEphdmEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgSmF2YUJlYW5zIHByb3BlcnR5IHRvIGFuIFhNTCBlbGVtZW50IG5hbWUgb2YgYW4gWE1MIHJvb3QgdHlwZS4gSWYgdGhlIGRhdGEtbWVtYmVyIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZSBpcyBhIHB1YmxpYyBkYXRhIG1lbWJlci4gIElmIGRhdGEtbWVtYmVyCi0gKiBpcyBub3QgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZSBpcyBhIEphdmFCZWFucyBwcm9wZXJ0eS4KLSAqIAotICogVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldEphdmFWYXJpYWJsZU5hbWUgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEVsZW1lbnROYW1lIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFyaWFibGVNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBWYXJpYWJsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgamF2YS12YXJpYWJsZS1uYW1lIGRlZmluZXMgdGhlIG5hbWUgb2YgYSBwdWJsaWMgZGF0YSBtZW1iZXIgb3IgIEphdmFCZWFucyBwcm9wZXJ0eSB3aXRoaW4gYSBKYXZhIGNsYXNzLiAKLQkgKiAKLQkgKiBVc2VkIGluOiB2YXJpYWJsZS1tYXBwaW5nCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF2YVZhcmlhYmxlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SmF2YVZhcmlhYmxlTmFtZSA8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SmF2YVZhcmlhYmxlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WG1sIEVsZW1lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB4bWwtZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyBuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIFdTREwgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuCi0JICogCi0JICogVXNlZCBpbjogdmFyaWFibGUtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRYbWxFbGVtZW50TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0WG1sRWxlbWVudE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0WG1sRWxlbWVudE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgTWVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI3Vuc2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjc2V0RGF0YU1lbWJlcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzRGF0YU1lbWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICN1bnNldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI2lzRGF0YU1lbWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERhdGFNZW1iZXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc0RhdGFNZW1iZXIgPGVtPkRhdGEgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNpc0RhdGFNZW1iZXIoKQotCSAqIEBzZWUgI3NldERhdGFNZW1iZXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXREYXRhTWVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc0RhdGFNZW1iZXIgPGVtPkRhdGEgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBNZW1iZXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI2lzRGF0YU1lbWJlcigpCi0JICogQHNlZSAjc2V0RGF0YU1lbWJlcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldERhdGFNZW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRYbWxBdHRyaWJ1dGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFhtbEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxBdHRyaWJ1dGVOYW1lIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRYbWxBdHRyaWJ1dGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YbWwgV2lsZGNhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WG1sIFdpbGRjYXJkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBXaWxkY2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjdW5zZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjc2V0WG1sV2lsZGNhcmQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNYbWxXaWxkY2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBXaWxkY2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjdW5zZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjaXNYbWxXaWxkY2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFhtbFdpbGRjYXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjaXNYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjc2V0WG1sV2lsZGNhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRYbWxXaWxkY2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIFdpbGRjYXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjaXNYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjc2V0WG1sV2lsZGNhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRYbWxXaWxkY2FyZCgpOwotCi19IC8vIFZhcmlhYmxlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExCaW5kaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzODNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIEJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1iaW5kaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBiaW5kaW5nCi0gKiBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMQmluZGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMQmluZGluZyBleHRlbmRzIFFOYW1lIHsKLS8vIFdTRExCaW5kaW5nCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODIxYjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLW1lc3NhZ2UgIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBieSBhIFFOQU1FLgotICogCi0gKiBVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1lc3NhZ2UgZXh0ZW5kcyBRTmFtZSB7Ci0vLyBXU0RMTWVzc2FnZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDI4MzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1tZXNzYWdlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQgaXRzIHBhcnQuIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAKLSAqIGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4KLSAqIAotICogVGhlIHBhcmFtZXRlci1tb2RlIGlzIGRlZmluZWQgYnkgdGhlIG1hcHBpbmcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbWFwcGluZyB3aWxsIGJlIElOLCBPVVQsIG9yIElOT1VULi4gIFRoZSBwcmVzZW5jZSBvZiB0aGUgc29hcC1oZWFkZXIKLSAqIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBtYXBwZWQgdG8gYSBzb2FwIGhlYWRlciBvbmx5LiBXaGVuIGFic2VudCwgaXQgbWVhbnMgdGhhdCB0aGUgd3NkbC1tZXNzYWdlIGlzIG1hcHBlZCB0byBhIEphdmEgcGFyYW1ldGVyLiBUaGUgc29hcCBoZWFkZXJzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKLSAqIHByb3ZpZGVkIGluIHRoZSBtYXBwaW5nLgotICogCi0gKiBVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNpc1NvYXBIZWFkZXIgPGVtPlNvYXAgSGVhZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1lc3NhZ2VNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudAotCSAqIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwYXJhbWV0ZXItbW9kZSAgZWxlbWVudCBkZWZpbmVzIHRoZSBtb2RlIG9mIHRoZSBwYXJhbWV0ZXIuIEl0IGNhbiBoYXZlIG9ubHkgdGhyZWUgdmFsdWVzLCBJTiwgT1VULCBJTk9VVC4KLQkgKiAKLQkgKiBVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1ldGVyTW9kZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQYXJhbWV0ZXJNb2RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVyTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhcmFtZXRlck1vZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNvYXBIZWFkZXIoKQotCSAqIEBzZWUgI3Vuc2V0U29hcEhlYWRlcigpCi0JICogQHNlZSAjc2V0U29hcEhlYWRlcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU29hcEhlYWRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2lzU29hcEhlYWRlciA8ZW0+U29hcCBIZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICN1bnNldFNvYXBIZWFkZXIoKQotCSAqIEBzZWUgI2lzU29hcEhlYWRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNvYXBIZWFkZXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNpc1NvYXBIZWFkZXIgPGVtPlNvYXAgSGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNpc1NvYXBIZWFkZXIoKQotCSAqIEBzZWUgI3NldFNvYXBIZWFkZXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRTb2FwSGVhZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNpc1NvYXBIZWFkZXIgPGVtPlNvYXAgSGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNvYXBIZWFkZXIoKQotCSAqIEBzZWUgI2lzU29hcEhlYWRlcigpCi0JICogQHNlZSAjc2V0U29hcEhlYWRlcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFNvYXBIZWFkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIHZhbHVlKTsKLQotfSAvLyBXU0RMTWVzc2FnZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZVBhcnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VQYXJ0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZkMGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZVBhcnROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlUGFydE5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1lc3NhZ2VQYXJ0TmFtZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZVBhcnROYW1lX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV1NETE1lc3NhZ2VQYXJ0TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yzg3N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMT3BlcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExPcGVyYXRpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE9wZXJhdGlvbl9JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgT3BlcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsT3BlcmF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE9wZXJhdGlvbl9Xc2RsT3BlcmF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldFdzZGxPcGVyYXRpb24gPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsT3BlcmF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV1NETE9wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExQb3J0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQzYzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFBvcnQgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlCi0gKiBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBwb3J0IHR5cGUuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExQb3J0VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUG9ydFR5cGUgZXh0ZW5kcyBRTmFtZSB7Ci0vLwkgV1NETFBvcnRUeXBlCi19IApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNmQwNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nICBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUuIEl0IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAKLSAqIGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4gVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgaXMgbm90Ci0gKiBzcGVjaWZpZWQgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIG9yIE9VVCBwYXJhbWV0ZXJzLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0TWV0aG9kUmV0dXJuVmFsdWUgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFJldHVyblZhbHVlTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFJldHVybiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZFJldHVyblZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0TWV0aG9kUmV0dXJuVmFsdWUgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldE1ldGhvZFJldHVyblZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW50ZXJwcmV0YXRpb24gb2YgdGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZWxlbWVudCBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IHdyYXBwZWQtZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nLiAgSWYgd3JhcHBlZC1lbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBwYXJ0LiBJdCBzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVyIHdpdGggcmVzcGVjdCB0byBhIHdzZGwtbWVzc2FnZSBlbGVtZW50LiBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIHJlZmVycyB0byBhbiBlbGVtZW50Ci0JICogbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotCSAqIAotCSAqIFVzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZSBnZXRXc2RsTWVzc2FnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIHZhbHVlKTsKLQotfSAvLyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFNlcnZpY2VOYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFNlcnZpY2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDI2OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExTZXJ2aWNlTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgU2VydmljZSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdzZGwtc2VydmljZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBzZXJ2aWNlIG5hbWUgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgc2VydmljZS4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFNlcnZpY2VOYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExTZXJ2aWNlTmFtZSBleHRlbmRzIFFOYW1lIHsKLQkvL0RlZmF1bHQKLX0gLy8gV1NETFNlcnZpY2VOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwOGZhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwjZ2V0RWxlbWVudE5hbWVzIDxlbT5FbGVtZW50IE5hbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudE5hbWVzKCkgPGVtPkVsZW1lbnQgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVsZW1lbnROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBlbGVtZW50TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEVsZW1lbnROYW1lcygpIHsKLQkJaWYgKGVsZW1lbnROYW1lcyA9PSBudWxsKSB7Ci0JCQllbGVtZW50TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWxlbWVudE5hbWUuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbGVtZW50TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnROYW1lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCWdldEVsZW1lbnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWxlbWVudE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVM6Ci0JCQkJZ2V0RWxlbWVudE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUzoKLQkJCQlyZXR1cm4gZWxlbWVudE5hbWVzICE9IG51bGwgJiYgIWVsZW1lbnROYW1lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FbGVtZW50TmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0VsZW1lbnROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU0OGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0VsZW1lbnROYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkVsZW1lbnROYW1lSW1wbCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5hbWVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRWxlbWVudE5hbWUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dCA9IFRFWFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFbGVtZW50TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuRUxFTUVOVF9OQU1FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0OwotCQl0ZXh0ID0gbmV3VGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQsIG9sZFRleHQsIHRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJcmV0dXJuIGdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVDoKLQkJCQlzZXRUZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVDoKLQkJCQlzZXRUZXh0KFRFWFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhUOgotCQkJCXJldHVybiBURVhUX0VERUZBVUxUID09IG51bGwgPyB0ZXh0ICE9IG51bGwgOiAhVEVYVF9FREVGQVVMVC5lcXVhbHModGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGV4dCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VsZW1lbnROYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvbk1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODhlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGNlcHRpb24gTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0RXhjZXB0aW9uVHlwZSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNlcHRpb25UeXBlKCkgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvblR5cGUoKSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNlcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBleGNlcHRpb25UeXBlID0gRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZSgpIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZSB3c2RsTWVzc2FnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEV4Y2VwdGlvbk1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkVYQ0VQVElPTl9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvblR5cGUoKSB7Ci0JCXJldHVybiBleGNlcHRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcgbmV3RXhjZXB0aW9uVHlwZSkgewotCQlTdHJpbmcgb2xkRXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7Ci0JCWV4Y2VwdGlvblR5cGUgPSBuZXdFeGNlcHRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSwgb2xkRXhjZXB0aW9uVHlwZSwgZXhjZXB0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIG5ld1dzZGxNZXNzYWdlUGFydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUgPSB3c2RsTWVzc2FnZVBhcnROYW1lOwotCQl3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSwgd3NkbE1lc3NhZ2VQYXJ0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMTWVzc2FnZSBvbGRXc2RsTWVzc2FnZSA9IHdzZGxNZXNzYWdlOwotCQl3c2RsTWVzc2FnZSA9IG5ld1dzZGxNZXNzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG9sZFdzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSkgewotCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gd3NkbE1lc3NhZ2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxNZXNzYWdlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsTWVzc2FnZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsTWVzc2FnZShuZXdXc2RsTWVzc2FnZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG5ld1dzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG9sZENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPSBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyID0gbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSLCBvbGRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLCBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSB7Ci0JCWlmIChuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyICE9IGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIobmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIsIG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsTWVzc2FnZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRFeGNlcHRpb25UeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVI6Ci0JCQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXNldEV4Y2VwdGlvblR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjoKLQkJCQlzZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRToKLQkJCQlzZXRFeGNlcHRpb25UeXBlKEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVI6Ci0JCQkJc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBFWENFUFRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZXhjZXB0aW9uVHlwZSAhPSBudWxsIDogIUVYQ0VQVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhleGNlcHRpb25UeXBlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbE1lc3NhZ2VQYXJ0TmFtZSAhPSBudWxsIDogIVdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjoKLQkJCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2VwdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2VwdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeGNlcHRpb25NYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0ludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMWRjYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSW50ZXJmYWNlTWFwcGluZwotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEludGVyZmFjZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLklOVEVSRkFDRV9NQVBQSU5HOwotCX0KLQotfSAvL0ludGVyZmFjZU1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhV1NETE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhV1NETE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmM5N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIFdTREwgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldFBhY2thZ2VNYXBwaW5ncyA8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldEphdmFYTUxUeXBlTWFwcGluZ3MgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCNnZXRFeGNlcHRpb25NYXBwaW5ncyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFXU0RMTWFwcGluZ0ltcGwjZ2V0SW50ZXJmYWNlTWFwcGluZ3MgPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFXU0RMTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBKYXZhV1NETE1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdlTWFwcGluZ3MoKSA8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHBhY2thZ2VNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFYTUxUeXBlTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgamF2YVhNTFR5cGVNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNlcHRpb25NYXBwaW5ncygpIDxlbT5FeGNlcHRpb24gTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvbk1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGV4Y2VwdGlvbk1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZU1hcHBpbmdzKCkgPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgaW50ZXJmYWNlTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSmF2YVdTRExNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5KQVZBX1dTRExfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFBhY2thZ2VNYXBwaW5ncygpIHsKLQkJaWYgKHBhY2thZ2VNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFja2FnZU1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBwYWNrYWdlTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpIHsKLQkJaWYgKGphdmFYTUxUeXBlTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJamF2YVhNTFR5cGVNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBqYXZhWE1MVHlwZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEV4Y2VwdGlvbk1hcHBpbmdzKCkgewotCQlpZiAoZXhjZXB0aW9uTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJZXhjZXB0aW9uTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKSB7Ci0JCWlmIChpbnRlcmZhY2VNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQYWNrYWdlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4Y2VwdGlvbk1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlTWFwcGluZ3MoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEV4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1M6Ci0JCQkJZ2V0UGFja2FnZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYWNrYWdlTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQlnZXRFeGNlcHRpb25NYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTOgotCQkJCWdldEludGVyZmFjZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmZhY2VNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUzoKLQkJCQlnZXRQYWNrYWdlTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQlnZXRFeGNlcHRpb25NYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1M6Ci0JCQkJZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gcGFja2FnZU1hcHBpbmdzICE9IG51bGwgJiYgIXBhY2thZ2VNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZ3MgIT0gbnVsbCAmJiAhamF2YVhNTFR5cGVNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ3MgIT0gbnVsbCAmJiAhZXhjZXB0aW9uTWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGludGVyZmFjZU1hcHBpbmdzICE9IG51bGwgJiYgIWludGVyZmFjZU1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSmF2YVdTRExNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVhNTFR5cGVNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVhNTFR5cGVNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTIwZDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFYTUxUeXBlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldENsYXNzVHlwZSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldFFuYW1lU2NvcGUgPGVtPlFuYW1lIFNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFYTUxUeXBlTWFwcGluZ0ltcGwjZ2V0QW5vbnltb3VzVHlwZVFuYW1lIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldFJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldFZhcmlhYmxlTWFwcGluZ3MgPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEphdmFYTUxUeXBlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc1R5cGUoKSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NUeXBlKCkgPGVtPkNsYXNzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzVHlwZSA9IENMQVNTX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UW5hbWVTY29wZSgpIDxlbT5RbmFtZSBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFFuYW1lU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9TQ09QRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRbmFtZVNjb3BlKCkgPGVtPlFuYW1lIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UW5hbWVTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcW5hbWVTY29wZSA9IFFOQU1FX1NDT1BFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFub255bW91c1R5cGVRbmFtZSgpIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFub255bW91c1R5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFub255bW91c1R5cGVRbmFtZSgpIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFub255bW91c1R5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYW5vbnltb3VzVHlwZVFuYW1lID0gQU5PTllNT1VTX1RZUEVfUU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb290VHlwZVFuYW1lKCkgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvb3RUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZSByb290VHlwZVFuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmxlTWFwcGluZ3MoKSA8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmxlTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgdmFyaWFibGVNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBKYXZhWE1MVHlwZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkpBVkFfWE1MX1RZUEVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NUeXBlKCkgewotCQlyZXR1cm4gY2xhc3NUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NUeXBlKFN0cmluZyBuZXdDbGFzc1R5cGUpIHsKLQkJU3RyaW5nIG9sZENsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLQkJY2xhc3NUeXBlID0gbmV3Q2xhc3NUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSwgb2xkQ2xhc3NUeXBlLCBjbGFzc1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UW5hbWVTY29wZSgpIHsKLQkJcmV0dXJuIHFuYW1lU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRRbmFtZVNjb3BlKFN0cmluZyBuZXdRbmFtZVNjb3BlKSB7Ci0JCVN0cmluZyBvbGRRbmFtZVNjb3BlID0gcW5hbWVTY29wZTsKLQkJcW5hbWVTY29wZSA9IG5ld1FuYW1lU2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSwgb2xkUW5hbWVTY29wZSwgcW5hbWVTY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKSB7Ci0JCXJldHVybiBhbm9ueW1vdXNUeXBlUW5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXNUeXBlUW5hbWUoU3RyaW5nIG5ld0Fub255bW91c1R5cGVRbmFtZSkgewotCQlTdHJpbmcgb2xkQW5vbnltb3VzVHlwZVFuYW1lID0gYW5vbnltb3VzVHlwZVFuYW1lOwotCQlhbm9ueW1vdXNUeXBlUW5hbWUgPSBuZXdBbm9ueW1vdXNUeXBlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSwgb2xkQW5vbnltb3VzVHlwZVFuYW1lLCBhbm9ueW1vdXNUeXBlUW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBSb290VHlwZVFuYW1lIGdldFJvb3RUeXBlUW5hbWUoKSB7Ci0JCXJldHVybiByb290VHlwZVFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG5ld1Jvb3RUeXBlUW5hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUm9vdFR5cGVRbmFtZSBvbGRSb290VHlwZVFuYW1lID0gcm9vdFR5cGVRbmFtZTsKLQkJcm9vdFR5cGVRbmFtZSA9IG5ld1Jvb3RUeXBlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUsIG9sZFJvb3RUeXBlUW5hbWUsIG5ld1Jvb3RUeXBlUW5hbWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG5ld1Jvb3RUeXBlUW5hbWUpIHsKLQkJaWYgKG5ld1Jvb3RUeXBlUW5hbWUgIT0gcm9vdFR5cGVRbmFtZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocm9vdFR5cGVRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyb290VHlwZVFuYW1lKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Um9vdFR5cGVRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb290VHlwZVFuYW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb290VHlwZVFuYW1lKG5ld1Jvb3RUeXBlUW5hbWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbmV3Um9vdFR5cGVRbmFtZSwgbmV3Um9vdFR5cGVRbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFZhcmlhYmxlTWFwcGluZ3MoKSB7Ci0JCWlmICh2YXJpYWJsZU1hcHBpbmdzID09IG51bGwpIHsKLQkJCXZhcmlhYmxlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVmFyaWFibGVNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb290VHlwZVFuYW1lKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYXJpYWJsZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFOgotCQkJCXJldHVybiBnZXRDbGFzc1R5cGUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFOgotCQkJCXJldHVybiBnZXRRbmFtZVNjb3BlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldFJvb3RUeXBlUW5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRWYXJpYWJsZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEU6Ci0JCQkJc2V0Q2xhc3NUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFOgotCQkJCXNldFFuYW1lU2NvcGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJc2V0QW5vbnltb3VzVHlwZVFuYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlzZXRSb290VHlwZVFuYW1lKChSb290VHlwZVFuYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUzoKLQkJCQlnZXRWYXJpYWJsZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRWYXJpYWJsZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEU6Ci0JCQkJc2V0Q2xhc3NUeXBlKENMQVNTX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFOgotCQkJCXNldFFuYW1lU2NvcGUoUU5BTUVfU0NPUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0FOT05ZTU9VU19UWVBFX1FOQU1FOgotCQkJCXNldEFub255bW91c1R5cGVRbmFtZShBTk9OWU1PVVNfVFlQRV9RTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FOgotCQkJCXNldFJvb3RUeXBlUW5hbWUoKFJvb3RUeXBlUW5hbWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJZ2V0VmFyaWFibGVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEU6Ci0JCQkJcmV0dXJuIENMQVNTX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzVHlwZSAhPSBudWxsIDogIUNMQVNTX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNsYXNzVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRToKLQkJCQlyZXR1cm4gUU5BTUVfU0NPUEVfRURFRkFVTFQgPT0gbnVsbCA/IHFuYW1lU2NvcGUgIT0gbnVsbCA6ICFRTkFNRV9TQ09QRV9FREVGQVVMVC5lcXVhbHMocW5hbWVTY29wZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gQU5PTllNT1VTX1RZUEVfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGFub255bW91c1R5cGVRbmFtZSAhPSBudWxsIDogIUFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxULmVxdWFscyhhbm9ueW1vdXNUeXBlUW5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FOgotCQkJCXJldHVybiByb290VHlwZVFuYW1lICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gdmFyaWFibGVNYXBwaW5ncyAhPSBudWxsICYmICF2YXJpYWJsZU1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjbGFzc1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcW5hbWVTY29wZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocW5hbWVTY29wZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYW5vbnltb3VzVHlwZVFuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbm9ueW1vdXNUeXBlUW5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2YTMxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKYXhycGNtYXBGYWN0b3J5Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4cnBjbWFwRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJSmF4cnBjbWFwRmFjdG9yeSB0aGVKYXhycGNtYXBGYWN0b3J5ID0gKEpheHJwY21hcEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpheHJwY21hcC54bWkiKTsgCi0JCQlpZiAodGhlSmF4cnBjbWFwRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUpheHJwY21hcEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgSmF4cnBjbWFwRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElORzogcmV0dXJuIGNyZWF0ZUphdmFXU0RMTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVBhY2thZ2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkc6IHJldHVybiBjcmVhdGVFeGNlcHRpb25NYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUU6IHJldHVybiBjcmVhdGVSb290VHlwZVFuYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElORzogcmV0dXJuIGNyZWF0ZVZhcmlhYmxlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRTogcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOiByZXR1cm4gY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRTogcmV0dXJuIGNyZWF0ZUVsZW1lbnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUU6IHJldHVybiBjcmVhdGVXU0RMU2VydmljZU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkc6IHJldHVybiBjcmVhdGVQb3J0TWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFOiByZXR1cm4gY3JlYXRlV1NETFBvcnRUeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HOiByZXR1cm4gY3JlYXRlV1NETEJpbmRpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HOiByZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlV1NETE9wZXJhdGlvbigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HOiByZXR1cm4gY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRTogcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEphdmFXU0RMTWFwcGluZyBjcmVhdGVKYXZhV1NETE1hcHBpbmcoKSB7Ci0JCUphdmFXU0RMTWFwcGluZ0ltcGwgamF2YVdTRExNYXBwaW5nID0gbmV3IEphdmFXU0RMTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBQYWNrYWdlTWFwcGluZyBjcmVhdGVQYWNrYWdlTWFwcGluZygpIHsKLQkJUGFja2FnZU1hcHBpbmdJbXBsIHBhY2thZ2VNYXBwaW5nID0gbmV3IFBhY2thZ2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSmF2YVhNTFR5cGVNYXBwaW5nIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZygpIHsKLQkJSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCBqYXZhWE1MVHlwZU1hcHBpbmcgPSBuZXcgSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gamF2YVhNTFR5cGVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEV4Y2VwdGlvbk1hcHBpbmcgY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpIHsKLQkJRXhjZXB0aW9uTWFwcGluZ0ltcGwgZXhjZXB0aW9uTWFwcGluZyA9IG5ldyBFeGNlcHRpb25NYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpIHsKLQkJU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkgewotCQlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nID0gbmV3IFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFJvb3RUeXBlUW5hbWUgY3JlYXRlUm9vdFR5cGVRbmFtZSgpIHsKLQkJUm9vdFR5cGVRbmFtZUltcGwgcm9vdFR5cGVRbmFtZSA9IG5ldyBSb290VHlwZVFuYW1lSW1wbCgpOwotCQlyZXR1cm4gcm9vdFR5cGVRbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBWYXJpYWJsZU1hcHBpbmcgY3JlYXRlVmFyaWFibGVNYXBwaW5nKCkgewotCQlWYXJpYWJsZU1hcHBpbmdJbXBsIHZhcmlhYmxlTWFwcGluZyA9IG5ldyBWYXJpYWJsZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2UgY3JlYXRlV1NETE1lc3NhZ2UoKSB7Ci0JCVdTRExNZXNzYWdlSW1wbCB3c2RsTWVzc2FnZSA9IG5ldyBXU0RMTWVzc2FnZUltcGwoKTsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIHsKLQkJQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IG5ldyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCgpOwotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFbGVtZW50TmFtZSBjcmVhdGVFbGVtZW50TmFtZSgpIHsKLQkJRWxlbWVudE5hbWVJbXBsIGVsZW1lbnROYW1lID0gbmV3IEVsZW1lbnROYW1lSW1wbCgpOwotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFNlcnZpY2VOYW1lIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZSgpIHsKLQkJV1NETFNlcnZpY2VOYW1lSW1wbCB3c2RsU2VydmljZU5hbWUgPSBuZXcgV1NETFNlcnZpY2VOYW1lSW1wbCgpOwotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFBvcnRNYXBwaW5nIGNyZWF0ZVBvcnRNYXBwaW5nKCkgewotCQlQb3J0TWFwcGluZ0ltcGwgcG9ydE1hcHBpbmcgPSBuZXcgUG9ydE1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBwb3J0TWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUG9ydFR5cGUgY3JlYXRlV1NETFBvcnRUeXBlKCkgewotCQlXU0RMUG9ydFR5cGVJbXBsIHdzZGxQb3J0VHlwZSA9IG5ldyBXU0RMUG9ydFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3c2RsUG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETEJpbmRpbmcgY3JlYXRlV1NETEJpbmRpbmcoKSB7Ci0JCVdTRExCaW5kaW5nSW1wbCB3c2RsQmluZGluZyA9IG5ldyBXU0RMQmluZGluZ0ltcGwoKTsKLQkJcmV0dXJuIHdzZGxCaW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpIHsKLQkJU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwgc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMT3BlcmF0aW9uIGNyZWF0ZVdTRExPcGVyYXRpb24oKSB7Ci0JCVdTRExPcGVyYXRpb25JbXBsIHdzZGxPcGVyYXRpb24gPSBuZXcgV1NETE9wZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdzZGxPcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKSB7Ci0JCU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCBtZXRob2RQYXJhbVBhcnRzTWFwcGluZyA9IG5ldyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZygpIHsKLQkJV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgd3NkbFJldHVyblZhbHVlTWFwcGluZyA9IG5ldyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZU1hcHBpbmcgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCkgewotCQlXU0RMTWVzc2FnZU1hcHBpbmdJbXBsIHdzZGxNZXNzYWdlTWFwcGluZyA9IG5ldyBXU0RMTWVzc2FnZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2VQYXJ0TmFtZSBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lKCkgewotCQlXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCB3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3IFdTRExNZXNzYWdlUGFydE5hbWVJbXBsKCk7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEludGVyZmFjZU1hcHBpbmcgY3JlYXRlSW50ZXJmYWNlTWFwcGluZygpIHsKLQkJSW50ZXJmYWNlTWFwcGluZ0ltcGwgaW50ZXJmYWNlTWFwcGluZyA9IG5ldyBJbnRlcmZhY2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXhycGNtYXBQYWNrYWdlIGdldEpheHJwY21hcFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF4cnBjbWFwUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEpheHJwY21hcFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0pheHJwY21hcEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZThlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXhycGNtYXBQYWNrYWdlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBqYXZhV1NETE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBwYWNrYWdlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyByb290VHlwZVFuYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgdmFyaWFibGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbE1lc3NhZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudE5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsU2VydmljZU5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBwb3J0TWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxQb3J0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxCaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgaW50ZXJmYWNlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEpheHJwY21hcFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXhycGNtYXBQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXhycGNtYXBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpheHJwY21hcFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKYXhycGNtYXBQYWNrYWdlSW1wbCB0aGVKYXhycGNtYXBQYWNrYWdlID0gKEpheHJwY21hcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEpheHJwY21hcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSmF4cnBjbWFwUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUVqYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSmF4cnBjbWFwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUpheHJwY21hcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF4cnBjbWFwUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSmF4cnBjbWFwUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVdTRExNYXBwaW5nKCkgewotCQlyZXR1cm4gamF2YVdTRExNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YVdTRExNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVdTRExNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFXU0RMTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVdTRExNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhV1NETE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0UGFja2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBwYWNrYWdlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFja2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFja2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhY2thZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEphdmFYTUxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfVmFyaWFibGVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRFeGNlcHRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleGNlcHRpb25NYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleGNlcHRpb25NYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleGNlcHRpb25NYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpIHsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRSb290VHlwZVFuYW1lKCkgewotCQlyZXR1cm4gcm9vdFR5cGVRbmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0VmFyaWFibGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdmFyaWFibGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdmFyaWFibGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdmFyaWFibGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkgewotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEVsZW1lbnROYW1lX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWxlbWVudE5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEVsZW1lbnROYW1lX1RleHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbGVtZW50TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMU2VydmljZU5hbWUoKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFBvcnRNYXBwaW5nKCkgewotCQlyZXR1cm4gcG9ydE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMUG9ydFR5cGUoKSB7Ci0JCXJldHVybiB3c2RsUG9ydFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdTRExCaW5kaW5nKCkgewotCQlyZXR1cm4gd3NkbEJpbmRpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdTRExPcGVyYXRpb24oKSB7Ci0JCXJldHVybiB3c2RsT3BlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETE9wZXJhdGlvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdzZGxPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdzZGxPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKSB7Ci0JCXJldHVybiBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEludGVyZmFjZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBpbnRlcmZhY2VNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcEZhY3RvcnkgZ2V0SmF4cnBjbWFwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChKYXhycGNtYXBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlqYXZhV1NETE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9XU0RMX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFXU0RMTWFwcGluZ0VDbGFzcywgSkFWQV9XU0RMX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFXU0RMTWFwcGluZ0VDbGFzcywgSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUyk7Ci0KLQkJcGFja2FnZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYWNrYWdlTWFwcGluZ0VDbGFzcywgUEFDS0FHRV9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFja2FnZU1hcHBpbmdFQ2xhc3MsIFBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYWNrYWdlTWFwcGluZ0VDbGFzcywgUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJKTsKLQotCQlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9YTUxfVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MsIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MsIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTKTsKLQotCQlleGNlcHRpb25NYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQ0VQVElPTl9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFWENFUFRJT05fTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MsIEVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXhjZXB0aW9uTWFwcGluZ0VDbGFzcywgRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MsIEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MsIEVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIpOwotCi0JCXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTKTsKLQotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MpOwotCi0JCXJvb3RUeXBlUW5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9PVF9UWVBFX1FOQU1FKTsKLQotCQl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVkFSSUFCTEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWQVJJQUJMRV9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEKTsKLQotCQl3c2RsTWVzc2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX01FU1NBR0UpOwotCi0JCWNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVMpOwotCi0JCWVsZW1lbnROYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxlbWVudE5hbWVFQ2xhc3MsIEVMRU1FTlRfTkFNRV9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsZW1lbnROYW1lRUNsYXNzLCBFTEVNRU5UX05BTUVfX1RFWFQpOwotCi0JCXdzZGxTZXJ2aWNlTmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX1NFUlZJQ0VfTkFNRSk7Ci0KLQkJcG9ydE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0TWFwcGluZ0VDbGFzcywgUE9SVF9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydE1hcHBpbmdFQ2xhc3MsIFBPUlRfTUFQUElOR19fUE9SVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0TWFwcGluZ0VDbGFzcywgUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSk7Ci0KLQkJd3NkbFBvcnRUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfUE9SVF9UWVBFKTsKLQotCQl3c2RsQmluZGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX0JJTkRJTkcpOwotCi0JCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyk7Ci0KLQkJd3NkbE9wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX09QRVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE9wZXJhdGlvbkVDbGFzcywgV1NETF9PUEVSQVRJT05fX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsT3BlcmF0aW9uRUNsYXNzLCBXU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04pOwotCi0JCW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcywgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcywgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcywgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLCBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcpOwotCi0JCXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcywgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSk7Ci0KLQkJd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfTUVTU0FHRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MsIFdTRExfTUVTU0FHRV9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLCBXU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLCBXU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcywgV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MsIFdTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UpOwotCi0JCXdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9NRVNTQUdFX1BBUlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcywgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MsIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUpOwotCi0JCWludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URVJGQUNFX01BUFBJTkcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWphdmFXU0RMTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlwYWNrYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEludGVyZmFjZU1hcHBpbmcoKSk7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJbnRlcmZhY2VNYXBwaW5nKCkpOwotCQlyb290VHlwZVFuYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsTWVzc2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVsZW1lbnROYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxTZXJ2aWNlTmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQlwb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsUG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJd3NkbEJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJaW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoamF2YVdTRExNYXBwaW5nRUNsYXNzLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICJKYXZhV1NETE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFXU0RMTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSwgdGhpcy5nZXRQYWNrYWdlTWFwcGluZygpLCBudWxsLCAicGFja2FnZU1hcHBpbmdzIiwgbnVsbCwgMSwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSwgdGhpcy5nZXRKYXZhWE1MVHlwZU1hcHBpbmcoKSwgbnVsbCwgImphdmFYTUxUeXBlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSwgdGhpcy5nZXRFeGNlcHRpb25NYXBwaW5nKCksIG51bGwsICJleGNlcHRpb25NYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpLCB0aGlzLmdldEludGVyZmFjZU1hcHBpbmcoKSwgbnVsbCwgImludGVyZmFjZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhY2thZ2VNYXBwaW5nRUNsYXNzLCBQYWNrYWdlTWFwcGluZy5jbGFzcywgIlBhY2thZ2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYWNrYWdlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBQYWNrYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFja2FnZU1hcHBpbmdfUGFja2FnZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhY2thZ2VUeXBlIiwgbnVsbCwgMCwgMSwgUGFja2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUGFja2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIkphdmFYTUxUeXBlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY2xhc3NUeXBlIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicW5hbWVTY29wZSIsIG51bGwsIDAsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYW5vbnltb3VzVHlwZVFuYW1lIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpLCB0aGlzLmdldFJvb3RUeXBlUW5hbWUoKSwgbnVsbCwgInJvb3RUeXBlUW5hbWUiLCBudWxsLCAxLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCksIHRoaXMuZ2V0VmFyaWFibGVNYXBwaW5nKCksIG51bGwsICJ2YXJpYWJsZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICJFeGNlcHRpb25NYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNlcHRpb25NYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhjZXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZSgpLCBudWxsLCAid3NkbE1lc3NhZ2UiLCBudWxsLCAxLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgdGhpcy5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIG51bGwsICJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUludGVyZmFjZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSwgdGhpcy5nZXRXU0RMU2VydmljZU5hbWUoKSwgbnVsbCwgIndzZGxTZXJ2aWNlTmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSwgdGhpcy5nZXRQb3J0TWFwcGluZygpLCBudWxsLCAicG9ydE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCksIHRoaXMuZ2V0V1NETFBvcnRUeXBlKCksIG51bGwsICJ3c2RsUG9ydFR5cGUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCksIHRoaXMuZ2V0V1NETEJpbmRpbmcoKSwgbnVsbCwgIndzZGxCaW5kaW5nIiwgbnVsbCwgMSwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLCB0aGlzLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb290VHlwZVFuYW1lRUNsYXNzLCBSb290VHlwZVFuYW1lLmNsYXNzLCAiUm9vdFR5cGVRbmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAiVmFyaWFibGVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVZhcmlhYmxlTmFtZSIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ4bWxFbGVtZW50TmFtZSIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkYXRhTWVtYmVyIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ4bWxBdHRyaWJ1dGVOYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4bWxXaWxkY2FyZCIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbE1lc3NhZ2VFQ2xhc3MsIFdTRExNZXNzYWdlLmNsYXNzLCAiV1NETE1lc3NhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAiQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpLCB0aGlzLmdldEVsZW1lbnROYW1lKCksIG51bGwsICJlbGVtZW50TmFtZXMiLCBudWxsLCAxLCAtMSwgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVsZW1lbnROYW1lRUNsYXNzLCBFbGVtZW50TmFtZS5jbGFzcywgIkVsZW1lbnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbGVtZW50TmFtZV9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBFbGVtZW50TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWxlbWVudE5hbWVfVGV4dCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGV4dCIsIG51bGwsIDAsIDEsIEVsZW1lbnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbFNlcnZpY2VOYW1lRUNsYXNzLCBXU0RMU2VydmljZU5hbWUuY2xhc3MsICJXU0RMU2VydmljZU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0TWFwcGluZ0VDbGFzcywgUG9ydE1hcHBpbmcuY2xhc3MsICJQb3J0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRNYXBwaW5nX1BvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZSIsIG51bGwsIDAsIDEsIFBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFQb3J0TmFtZSIsIG51bGwsIDAsIDEsIFBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbFBvcnRUeXBlRUNsYXNzLCBXU0RMUG9ydFR5cGUuY2xhc3MsICJXU0RMUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsQmluZGluZ0VDbGFzcywgV1NETEJpbmRpbmcuY2xhc3MsICJXU0RMQmluZGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFNZXRob2ROYW1lIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsT3BlcmF0aW9uIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIndyYXBwZWRFbGVtZW50IiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLCB0aGlzLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCksIG51bGwsICJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCksIHRoaXMuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpLCBudWxsLCAid3NkbFJldHVyblZhbHVlTWFwcGluZyIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsT3BlcmF0aW9uRUNsYXNzLCBXU0RMT3BlcmF0aW9uLmNsYXNzLCAiV1NETE9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE9wZXJhdGlvbl9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxPcGVyYXRpb24iLCBudWxsLCAwLCAxLCBXU0RMT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAiTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVBvc2l0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1UeXBlIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpLCB0aGlzLmdldFdTRExNZXNzYWdlTWFwcGluZygpLCBudWxsLCAid3NkbE1lc3NhZ2VNYXBwaW5nIiwgbnVsbCwgMSwgMSwgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAiV1NETFJldHVyblZhbHVlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX01ldGhvZFJldHVyblZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXRob2RSZXR1cm5WYWx1ZSIsIG51bGwsIDAsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIsIG51bGwsIDAsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZSgpLCBudWxsLCAid3NkbE1lc3NhZ2UiLCBudWxsLCAxLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICJXU0RMTWVzc2FnZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1ldGVyTW9kZSIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzb2FwSGVhZGVyIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCB0aGlzLmdldFdTRExNZXNzYWdlKCksIG51bGwsICJ3c2RsTWVzc2FnZSIsIG51bGwsIDEsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MsIFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MsICJXU0RMTWVzc2FnZVBhcnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZVBhcnROYW1lX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlUGFydE5hbWVfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiSW50ZXJmYWNlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vSmF4cnBjbWFwUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzhmZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlcy5KYXhycGNtYXBUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEpheHJwY21hcFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIEpheHJwY21hcFJlc291cmNlCi17Ci0JcHVibGljIEpheHJwY21hcFJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExNYXBwaW5nIGdldEphdmFXU0RMTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhV1NETE1hcHBpbmcpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSkFYUlBDX01BUF9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIAotCXsKLQkgIHN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSAKLQkgIHsKLQkgICAgY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkgICAgY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX0RPQ1RZUEU7Ci0JICAgIGRlZmF1bHQgOgotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0JfQotCi0KLSAgIHB1YmxpYyBib29sZWFuIGlzSmF4cnBjbWFwMV8wKCkKLSAgIHsKLSAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBpc0pheHJwY21hcDFfMSgpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKSA7ICAgCi0gICB9Ci0KLQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCWJyZWFrOwkJCQotCQl9Ci0JfQotCS8qCi0JICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgCi0gIHsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOwotICAgIAkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCk7Ci0gICAgCQkJCWJyZWFrOwotICAgIAljYXNlIChKMkVFXzFfMl9JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgICAJCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCSAgcmV0dXJuICBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TWVNURU1JRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU1lTVEVNSUQ7Ci0JfQotCi0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQlkZWZhdWx0IDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRDsKLQl9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotICB7Ci0gICAgLy9EbyBub3RoaW5nIGZvciBub3cgc2luY2UgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSB2ZXJzaW9uLgotICB9Ci0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNGMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCNnZXRQYXJhbVBvc2l0aW9uIDxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwjZ2V0UGFyYW1UeXBlIDxlbT5QYXJhbSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZU1hcHBpbmcgPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1Qb3NpdGlvbigpIDxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QT1NJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVBvc2l0aW9uKCkgPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1Qb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1Qb3NpdGlvbiA9IFBBUkFNX1BPU0lUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVHlwZSgpIDxlbT5QYXJhbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVR5cGUoKSA8ZW0+UGFyYW0gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1UeXBlID0gUEFSQU1fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlTWFwcGluZygpIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZU1hcHBpbmcgd3NkbE1lc3NhZ2VNYXBwaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbVBvc2l0aW9uKCkgewotCQlyZXR1cm4gcGFyYW1Qb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtUG9zaXRpb24oU3RyaW5nIG5ld1BhcmFtUG9zaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBhcmFtUG9zaXRpb24gPSBwYXJhbVBvc2l0aW9uOwotCQlwYXJhbVBvc2l0aW9uID0gbmV3UGFyYW1Qb3NpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT04sIG9sZFBhcmFtUG9zaXRpb24sIHBhcmFtUG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1UeXBlKCkgewotCQlyZXR1cm4gcGFyYW1UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1UeXBlKFN0cmluZyBuZXdQYXJhbVR5cGUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVHlwZSA9IHBhcmFtVHlwZTsKLQkJcGFyYW1UeXBlID0gbmV3UGFyYW1UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFLCBvbGRQYXJhbVR5cGUsIHBhcmFtVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlTWFwcGluZyBnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIG5ld1dzZGxNZXNzYWdlTWFwcGluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMTWVzc2FnZU1hcHBpbmcgb2xkV3NkbE1lc3NhZ2VNYXBwaW5nID0gd3NkbE1lc3NhZ2VNYXBwaW5nOwotCQl3c2RsTWVzc2FnZU1hcHBpbmcgPSBuZXdXc2RsTWVzc2FnZU1hcHBpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HLCBvbGRXc2RsTWVzc2FnZU1hcHBpbmcsIG5ld1dzZGxNZXNzYWdlTWFwcGluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIG5ld1dzZGxNZXNzYWdlTWFwcGluZykgewotCQlpZiAobmV3V3NkbE1lc3NhZ2VNYXBwaW5nICE9IHdzZGxNZXNzYWdlTWFwcGluZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbE1lc3NhZ2VNYXBwaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxNZXNzYWdlTWFwcGluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsTWVzc2FnZU1hcHBpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbE1lc3NhZ2VNYXBwaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbE1lc3NhZ2VNYXBwaW5nKG5ld1dzZGxNZXNzYWdlTWFwcGluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORywgbmV3V3NkbE1lc3NhZ2VNYXBwaW5nLCBuZXdXc2RsTWVzc2FnZU1hcHBpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxNZXNzYWdlTWFwcGluZyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT046Ci0JCQkJcmV0dXJuIGdldFBhcmFtUG9zaXRpb24oKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1UeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OOgotCQkJCXNldFBhcmFtUG9zaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFOgotCQkJCXNldFBhcmFtVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXNldFdzZGxNZXNzYWdlTWFwcGluZygoV1NETE1lc3NhZ2VNYXBwaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTjoKLQkJCQlzZXRQYXJhbVBvc2l0aW9uKFBBUkFNX1BPU0lUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJc2V0UGFyYW1UeXBlKFBBUkFNX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkc6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKChXU0RMTWVzc2FnZU1hcHBpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTjoKLQkJCQlyZXR1cm4gUEFSQU1fUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtUG9zaXRpb24gIT0gbnVsbCA6ICFQQVJBTV9QT1NJVElPTl9FREVGQVVMVC5lcXVhbHMocGFyYW1Qb3NpdGlvbik7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJcmV0dXJuIFBBUkFNX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVHlwZSAhPSBudWxsIDogIVBBUkFNX1RZUEVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmcgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVBvc2l0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVBvc2l0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9QYWNrYWdlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxZjQ1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9QYWNrYWdlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwjZ2V0UGFja2FnZVR5cGUgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUGFja2FnZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZVR5cGUoKSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZVR5cGUoKSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VUeXBlID0gUEFDS0FHRV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFBhY2thZ2VNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VUeXBlKCkgewotCQlyZXR1cm4gcGFja2FnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlVHlwZShTdHJpbmcgbmV3UGFja2FnZVR5cGUpIHsKLQkJU3RyaW5nIG9sZFBhY2thZ2VUeXBlID0gcGFja2FnZVR5cGU7Ci0JCXBhY2thZ2VUeXBlID0gbmV3UGFja2FnZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUsIG9sZFBhY2thZ2VUeXBlLCBwYWNrYWdlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQluYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVUkksIG5hbWVzcGFjZVVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFOgotCQkJCXJldHVybiBnZXRQYWNrYWdlVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRToKLQkJCQlzZXRQYWNrYWdlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRToKLQkJCQlzZXRQYWNrYWdlVHlwZShQQUNLQUdFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIFBBQ0tBR0VfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnZVR5cGUgIT0gbnVsbCA6ICFQQUNLQUdFX1RZUEVfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2VUeXBlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhY2thZ2VUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lc3BhY2VVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BhY2thZ2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Qb3J0TWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmNzIyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Qb3J0TWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwjZ2V0SmF2YVBvcnROYW1lIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcnRNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZSA9IFBPUlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhUG9ydE5hbWUoKSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhUG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BPUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhUG9ydE5hbWUoKSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhUG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFQb3J0TmFtZSA9IEpBVkFfUE9SVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgUG9ydE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLlBPUlRfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBwb3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgewotCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0TmFtZTsKLQkJcG9ydE5hbWUgPSBuZXdQb3J0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRSwgb2xkUG9ydE5hbWUsIHBvcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEphdmFQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIGphdmFQb3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFQb3J0TmFtZShTdHJpbmcgbmV3SmF2YVBvcnROYW1lKSB7Ci0JCVN0cmluZyBvbGRKYXZhUG9ydE5hbWUgPSBqYXZhUG9ydE5hbWU7Ci0JCWphdmFQb3J0TmFtZSA9IG5ld0phdmFQb3J0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FLCBvbGRKYXZhUG9ydE5hbWUsIGphdmFQb3J0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIGdldEphdmFQb3J0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUU6Ci0JCQkJc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJc2V0SmF2YVBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJc2V0SmF2YVBvcnROYW1lKEpBVkFfUE9SVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gSkFWQV9QT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFQb3J0TmFtZSAhPSBudWxsIDogIUpBVkFfUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhqYXZhUG9ydE5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YVBvcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXZhUG9ydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0TWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1Jvb3RUeXBlUW5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Sb290VHlwZVFuYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBiNjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1Jvb3RUeXBlUW5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290VHlwZVFuYW1lSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFJvb3RUeXBlUW5hbWUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBSb290VHlwZVFuYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5ST09UX1RZUEVfUU5BTUU7Ci0JfQotCi19IC8vUm9vdFR5cGVRbmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzFkZWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0V3NkbEJpbmRpbmcgPGVtPldzZGwgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJbXBsIGltcGxlbWVudHMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFBvcnRUeXBlKCkgPGVtPldzZGwgUG9ydCBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFBvcnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExQb3J0VHlwZSB3c2RsUG9ydFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEJpbmRpbmcoKSA8ZW0+V3NkbCBCaW5kaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETEJpbmRpbmcgd3NkbEJpbmRpbmcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nIG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFBvcnRUeXBlIGdldFdzZGxQb3J0VHlwZSgpIHsKLQkJcmV0dXJuIHdzZGxQb3J0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxQb3J0VHlwZShXU0RMUG9ydFR5cGUgbmV3V3NkbFBvcnRUeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExQb3J0VHlwZSBvbGRXc2RsUG9ydFR5cGUgPSB3c2RsUG9ydFR5cGU7Ci0JCXdzZGxQb3J0VHlwZSA9IG5ld1dzZGxQb3J0VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSwgb2xkV3NkbFBvcnRUeXBlLCBuZXdXc2RsUG9ydFR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFBvcnRUeXBlKFdTRExQb3J0VHlwZSBuZXdXc2RsUG9ydFR5cGUpIHsKLQkJaWYgKG5ld1dzZGxQb3J0VHlwZSAhPSB3c2RsUG9ydFR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxQb3J0VHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsUG9ydFR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsUG9ydFR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbFBvcnRUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUG9ydFR5cGUobmV3V3NkbFBvcnRUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUsIG5ld1dzZGxQb3J0VHlwZSwgbmV3V3NkbFBvcnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETEJpbmRpbmcgZ2V0V3NkbEJpbmRpbmcoKSB7Ci0JCXJldHVybiB3c2RsQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxCaW5kaW5nKFdTRExCaW5kaW5nIG5ld1dzZGxCaW5kaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExCaW5kaW5nIG9sZFdzZGxCaW5kaW5nID0gd3NkbEJpbmRpbmc7Ci0JCXdzZGxCaW5kaW5nID0gbmV3V3NkbEJpbmRpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBvbGRXc2RsQmluZGluZywgbmV3V3NkbEJpbmRpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbEJpbmRpbmcoV1NETEJpbmRpbmcgbmV3V3NkbEJpbmRpbmcpIHsKLQkJaWYgKG5ld1dzZGxCaW5kaW5nICE9IHdzZGxCaW5kaW5nKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsQmluZGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsQmluZGluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsQmluZGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsQmluZGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxCaW5kaW5nKG5ld1dzZGxCaW5kaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBuZXdXc2RsQmluZGluZywgbmV3V3NkbEJpbmRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbFBvcnRUeXBlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsQmluZGluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0V3NkbFBvcnRUeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HOgotCQkJCXJldHVybiBnZXRXc2RsQmluZGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEU6Ci0JCQkJc2V0V3NkbFBvcnRUeXBlKChXU0RMUG9ydFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJc2V0V3NkbEJpbmRpbmcoKFdTRExCaW5kaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1M6Ci0JCQkJZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEU6Ci0JCQkJc2V0V3NkbFBvcnRUeXBlKChXU0RMUG9ydFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORzoKLQkJCQlzZXRXc2RsQmluZGluZygoV1NETEJpbmRpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTOgotCQkJCWdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXJldHVybiB3c2RsUG9ydFR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJcmV0dXJuIHdzZGxCaW5kaW5nICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzICE9IG51bGwgJiYgIXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkMDg4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjaXNXcmFwcGVkRWxlbWVudCA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YU1ldGhvZE5hbWUoKSA8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhTWV0aG9kTmFtZSgpIDxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YU1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFNZXRob2ROYW1lID0gSkFWQV9NRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfT1BFUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxPcGVyYXRpb24oKSA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsT3BlcmF0aW9uID0gV1NETF9PUEVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNXcmFwcGVkRWxlbWVudCgpIDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSQVBQRURfRUxFTUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNXcmFwcGVkRWxlbWVudCgpIDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3JhcHBlZEVsZW1lbnQgPSBXUkFQUEVEX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdyYXBwZWQgRWxlbWVudCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB3cmFwcGVkRWxlbWVudEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygpIDxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEphdmFNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gamF2YU1ldGhvZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhTWV0aG9kTmFtZShTdHJpbmcgbmV3SmF2YU1ldGhvZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEphdmFNZXRob2ROYW1lID0gamF2YU1ldGhvZE5hbWU7Ci0JCWphdmFNZXRob2ROYW1lID0gbmV3SmF2YU1ldGhvZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRSwgb2xkSmF2YU1ldGhvZE5hbWUsIGphdmFNZXRob2ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxPcGVyYXRpb24oKSB7Ci0JCXJldHVybiB3c2RsT3BlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcgbmV3V3NkbE9wZXJhdGlvbikgewotCQlTdHJpbmcgb2xkV3NkbE9wZXJhdGlvbiA9IHdzZGxPcGVyYXRpb247Ci0JCXdzZGxPcGVyYXRpb24gPSBuZXdXc2RsT3BlcmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OLCBvbGRXc2RsT3BlcmF0aW9uLCB3c2RsT3BlcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZWRFbGVtZW50KCkgewotCQlyZXR1cm4gd3JhcHBlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVkRWxlbWVudChib29sZWFuIG5ld1dyYXBwZWRFbGVtZW50KSB7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnQgPSB3cmFwcGVkRWxlbWVudDsKLQkJd3JhcHBlZEVsZW1lbnQgPSBuZXdXcmFwcGVkRWxlbWVudDsKLQkJYm9vbGVhbiBvbGRXcmFwcGVkRWxlbWVudEVTZXQgPSB3cmFwcGVkRWxlbWVudEVTZXQ7Ci0JCXdyYXBwZWRFbGVtZW50RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5ULCBvbGRXcmFwcGVkRWxlbWVudCwgd3JhcHBlZEVsZW1lbnQsICFvbGRXcmFwcGVkRWxlbWVudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0V3JhcHBlZEVsZW1lbnQoKSB7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnQgPSB3cmFwcGVkRWxlbWVudDsKLQkJYm9vbGVhbiBvbGRXcmFwcGVkRWxlbWVudEVTZXQgPSB3cmFwcGVkRWxlbWVudEVTZXQ7Ci0JCXdyYXBwZWRFbGVtZW50ID0gV1JBUFBFRF9FTEVNRU5UX0VERUZBVUxUOwotCQl3cmFwcGVkRWxlbWVudEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCwgb2xkV3JhcHBlZEVsZW1lbnQsIFdSQVBQRURfRUxFTUVOVF9FREVGQVVMVCwgb2xkV3JhcHBlZEVsZW1lbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NldFdyYXBwZWRFbGVtZW50KCkgewotCQlyZXR1cm4gd3JhcHBlZEVsZW1lbnRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpIHsKLQkJaWYgKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQltZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygpIHsKLQkJcmV0dXJuIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG9sZFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPSB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nOwotCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HLCBvbGRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nLCBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZyBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKSB7Ci0JCWlmIChuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nICE9IHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbFJldHVyblZhbHVlTWFwcGluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbFJldHVyblZhbHVlTWFwcGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcobmV3V3NkbFJldHVyblZhbHVlTWFwcGluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcsIG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBnZXRKYXZhTWV0aG9kTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OOgotCQkJCXJldHVybiBnZXRXc2RsT3BlcmF0aW9uKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UOgotCQkJCXJldHVybiBpc1dyYXBwZWRFbGVtZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUU6Ci0JCQkJc2V0SmF2YU1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OOgotCQkJCXNldFdzZGxPcGVyYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVDoKLQkJCQlzZXRXcmFwcGVkRWxlbWVudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTOgotCQkJCWdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRToKLQkJCQlzZXRKYXZhTWV0aG9kTmFtZShKQVZBX01FVEhPRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT046Ci0JCQkJc2V0V3NkbE9wZXJhdGlvbihXU0RMX09QRVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVDoKLQkJCQl1bnNldFdyYXBwZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOgotCQkJCXNldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gSkFWQV9NRVRIT0RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gamF2YU1ldGhvZE5hbWUgIT0gbnVsbCA6ICFKQVZBX01FVEhPRF9OQU1FX0VERUZBVUxULmVxdWFscyhqYXZhTWV0aG9kTmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT046Ci0JCQkJcmV0dXJuIFdTRExfT1BFUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsT3BlcmF0aW9uICE9IG51bGwgOiAhV1NETF9PUEVSQVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxPcGVyYXRpb24pOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gaXNTZXRXcmFwcGVkRWxlbWVudCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzICE9IG51bGwgJiYgIW1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFNZXRob2ROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXZhTWV0aG9kTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbE9wZXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3JhcHBlZEVsZW1lbnQ6ICIpOwotCQlpZiAod3JhcHBlZEVsZW1lbnRFU2V0KSByZXN1bHQuYXBwZW5kKHdyYXBwZWRFbGVtZW50KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDczM2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRXc2RsU2VydmljZU5hbWUgPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRQb3J0TWFwcGluZ3MgPGVtPlBvcnQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnRlcmZhY2UgPSBTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxTZXJ2aWNlTmFtZSgpIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxTZXJ2aWNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMU2VydmljZU5hbWUgd3NkbFNlcnZpY2VOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRNYXBwaW5ncygpIDxlbT5Qb3J0IE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgcG9ydE1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlSW50ZXJmYWNlID0gc2VydmljZUludGVyZmFjZTsKLQkJc2VydmljZUludGVyZmFjZSA9IG5ld1NlcnZpY2VJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VJbnRlcmZhY2UsIHNlcnZpY2VJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMU2VydmljZU5hbWUgZ2V0V3NkbFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBuZXdXc2RsU2VydmljZU5hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETFNlcnZpY2VOYW1lIG9sZFdzZGxTZXJ2aWNlTmFtZSA9IHdzZGxTZXJ2aWNlTmFtZTsKLQkJd3NkbFNlcnZpY2VOYW1lID0gbmV3V3NkbFNlcnZpY2VOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FLCBvbGRXc2RsU2VydmljZU5hbWUsIG5ld1dzZGxTZXJ2aWNlTmFtZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZU5hbWUoV1NETFNlcnZpY2VOYW1lIG5ld1dzZGxTZXJ2aWNlTmFtZSkgewotCQlpZiAobmV3V3NkbFNlcnZpY2VOYW1lICE9IHdzZGxTZXJ2aWNlTmFtZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbFNlcnZpY2VOYW1lICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxTZXJ2aWNlTmFtZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxTZXJ2aWNlTmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsU2VydmljZU5hbWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxTZXJ2aWNlTmFtZShuZXdXc2RsU2VydmljZU5hbWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSwgbmV3V3NkbFNlcnZpY2VOYW1lLCBuZXdXc2RsU2VydmljZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRQb3J0TWFwcGluZ3MoKSB7Ci0JCWlmIChwb3J0TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJcG9ydE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBwb3J0TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxTZXJ2aWNlTmFtZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9ydE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdzZGxTZXJ2aWNlTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFBvcnRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FOgotCQkJCXNldFdzZGxTZXJ2aWNlTmFtZSgoV1NETFNlcnZpY2VOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlnZXRQb3J0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFBvcnRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VJbnRlcmZhY2UoU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKLQkJCQlzZXRXc2RsU2VydmljZU5hbWUoKFdTRExTZXJ2aWNlTmFtZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlnZXRQb3J0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXJldHVybiBTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZUludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlSW50ZXJmYWNlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKLQkJCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gcG9ydE1hcHBpbmdzICE9IG51bGwgJiYgIXBvcnRNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmljZUludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvVmFyaWFibGVNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvVmFyaWFibGVNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ2NmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFyaWFibGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldEphdmFWYXJpYWJsZU5hbWUgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldFhtbEVsZW1lbnROYW1lIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmxlTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYXJpYWJsZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVZhcmlhYmxlTmFtZSgpIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFWYXJpYWJsZU5hbWUoKSA8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVZhcmlhYmxlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgamF2YVZhcmlhYmxlTmFtZSA9IEpBVkFfVkFSSUFCTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYbWxFbGVtZW50TmFtZSgpIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WG1sRWxlbWVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhtbEVsZW1lbnROYW1lKCkgPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgeG1sRWxlbWVudE5hbWUgPSBYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF0YU1lbWJlcigpIDxlbT5EYXRhIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGF0YU1lbWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQVRBX01FTUJFUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXRhTWVtYmVyKCkgPGVtPkRhdGEgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXRhTWVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGF0YU1lbWJlciA9IERBVEFfTUVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEYXRhIE1lbWJlciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhTWVtYmVyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhtbEF0dHJpYnV0ZU5hbWUoKSA8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHhtbEF0dHJpYnV0ZU5hbWUgPSBYTUxfQVRUUklCVVRFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYbWxXaWxkY2FyZCgpIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1htbFdpbGRjYXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhNTF9XSUxEQ0FSRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYbWxXaWxkY2FyZCgpIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1htbFdpbGRjYXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4geG1sV2lsZGNhcmQgPSBYTUxfV0lMRENBUkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFhtbCBXaWxkY2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB4bWxXaWxkY2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFZhcmlhYmxlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCTEVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEphdmFWYXJpYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBqYXZhVmFyaWFibGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVZhcmlhYmxlTmFtZShTdHJpbmcgbmV3SmF2YVZhcmlhYmxlTmFtZSkgewotCQlTdHJpbmcgb2xkSmF2YVZhcmlhYmxlTmFtZSA9IGphdmFWYXJpYWJsZU5hbWU7Ci0JCWphdmFWYXJpYWJsZU5hbWUgPSBuZXdKYXZhVmFyaWFibGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSwgb2xkSmF2YVZhcmlhYmxlTmFtZSwgamF2YVZhcmlhYmxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYbWxFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0WG1sRWxlbWVudE5hbWUoU3RyaW5nIG5ld1htbEVsZW1lbnROYW1lKSB7Ci0JCVN0cmluZyBvbGRYbWxFbGVtZW50TmFtZSA9IHhtbEVsZW1lbnROYW1lOwotCQl4bWxFbGVtZW50TmFtZSA9IG5ld1htbEVsZW1lbnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUUsIG9sZFhtbEVsZW1lbnROYW1lLCB4bWxFbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEYXRhTWVtYmVyKCkgewotCQlyZXR1cm4gZGF0YU1lbWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERhdGFNZW1iZXIoYm9vbGVhbiBuZXdEYXRhTWVtYmVyKSB7Ci0JCWJvb2xlYW4gb2xkRGF0YU1lbWJlciA9IGRhdGFNZW1iZXI7Ci0JCWRhdGFNZW1iZXIgPSBuZXdEYXRhTWVtYmVyOwotCQlib29sZWFuIG9sZERhdGFNZW1iZXJFU2V0ID0gZGF0YU1lbWJlckVTZXQ7Ci0JCWRhdGFNZW1iZXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUiwgb2xkRGF0YU1lbWJlciwgZGF0YU1lbWJlciwgIW9sZERhdGFNZW1iZXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldERhdGFNZW1iZXIoKSB7Ci0JCWJvb2xlYW4gb2xkRGF0YU1lbWJlciA9IGRhdGFNZW1iZXI7Ci0JCWJvb2xlYW4gb2xkRGF0YU1lbWJlckVTZXQgPSBkYXRhTWVtYmVyRVNldDsKLQkJZGF0YU1lbWJlciA9IERBVEFfTUVNQkVSX0VERUZBVUxUOwotCQlkYXRhTWVtYmVyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIsIG9sZERhdGFNZW1iZXIsIERBVEFfTUVNQkVSX0VERUZBVUxULCBvbGREYXRhTWVtYmVyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXREYXRhTWVtYmVyKCkgewotCQlyZXR1cm4gZGF0YU1lbWJlckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhtbEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0WG1sQXR0cmlidXRlTmFtZShTdHJpbmcgbmV3WG1sQXR0cmlidXRlTmFtZSkgewotCQlTdHJpbmcgb2xkWG1sQXR0cmlidXRlTmFtZSA9IHhtbEF0dHJpYnV0ZU5hbWU7Ci0JCXhtbEF0dHJpYnV0ZU5hbWUgPSBuZXdYbWxBdHRyaWJ1dGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRSwgb2xkWG1sQXR0cmlidXRlTmFtZSwgeG1sQXR0cmlidXRlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNYbWxXaWxkY2FyZCgpIHsKLQkJcmV0dXJuIHhtbFdpbGRjYXJkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0WG1sV2lsZGNhcmQoYm9vbGVhbiBuZXdYbWxXaWxkY2FyZCkgewotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkID0geG1sV2lsZGNhcmQ7Ci0JCXhtbFdpbGRjYXJkID0gbmV3WG1sV2lsZGNhcmQ7Ci0JCWJvb2xlYW4gb2xkWG1sV2lsZGNhcmRFU2V0ID0geG1sV2lsZGNhcmRFU2V0OwotCQl4bWxXaWxkY2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCwgb2xkWG1sV2lsZGNhcmQsIHhtbFdpbGRjYXJkLCAhb2xkWG1sV2lsZGNhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldFhtbFdpbGRjYXJkKCkgewotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkID0geG1sV2lsZGNhcmQ7Ci0JCWJvb2xlYW4gb2xkWG1sV2lsZGNhcmRFU2V0ID0geG1sV2lsZGNhcmRFU2V0OwotCQl4bWxXaWxkY2FyZCA9IFhNTF9XSUxEQ0FSRF9FREVGQVVMVDsKLQkJeG1sV2lsZGNhcmRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQsIG9sZFhtbFdpbGRjYXJkLCBYTUxfV0lMRENBUkRfRURFRkFVTFQsIG9sZFhtbFdpbGRjYXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRYbWxXaWxkY2FyZCgpIHsKLQkJcmV0dXJuIHhtbFdpbGRjYXJkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXJldHVybiBnZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0WG1sRWxlbWVudE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUjoKLQkJCQlyZXR1cm4gaXNEYXRhTWVtYmVyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0WG1sQXR0cmlidXRlTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQlyZXR1cm4gaXNYbWxXaWxkY2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUU6Ci0JCQkJc2V0SmF2YVZhcmlhYmxlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlzZXRYbWxFbGVtZW50TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVI6Ci0JCQkJc2V0RGF0YU1lbWJlcigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FOgotCQkJCXNldFhtbEF0dHJpYnV0ZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQlzZXRYbWxXaWxkY2FyZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXNldEphdmFWYXJpYWJsZU5hbWUoSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlzZXRYbWxFbGVtZW50TmFtZShYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVI6Ci0JCQkJdW5zZXREYXRhTWVtYmVyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlzZXRYbWxBdHRyaWJ1dGVOYW1lKFhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQl1bnNldFhtbFdpbGRjYXJkKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXJldHVybiBKQVZBX1ZBUklBQkxFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFWYXJpYWJsZU5hbWUgIT0gbnVsbCA6ICFKQVZBX1ZBUklBQkxFX05BTUVfRURFRkFVTFQuZXF1YWxzKGphdmFWYXJpYWJsZU5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUU6Ci0JCQkJcmV0dXJuIFhNTF9FTEVNRU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHhtbEVsZW1lbnROYW1lICE9IG51bGwgOiAhWE1MX0VMRU1FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoeG1sRWxlbWVudE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSOgotCQkJCXJldHVybiBpc1NldERhdGFNZW1iZXIoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUU6Ci0JCQkJcmV0dXJuIFhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8geG1sQXR0cmlidXRlTmFtZSAhPSBudWxsIDogIVhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoeG1sQXR0cmlidXRlTmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEOgotCQkJCXJldHVybiBpc1NldFhtbFdpbGRjYXJkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YVZhcmlhYmxlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZhcmlhYmxlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeG1sRWxlbWVudE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHhtbEVsZW1lbnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXRhTWVtYmVyOiAiKTsKLQkJaWYgKGRhdGFNZW1iZXJFU2V0KSByZXN1bHQuYXBwZW5kKGRhdGFNZW1iZXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB4bWxBdHRyaWJ1dGVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh4bWxBdHRyaWJ1dGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB4bWxXaWxkY2FyZDogIik7Ci0JCWlmICh4bWxXaWxkY2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQoeG1sV2lsZGNhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFyaWFibGVNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMzVmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIEJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMQmluZGluZ0ltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBXU0RMQmluZGluZwotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExCaW5kaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX0JJTkRJTkc7Ci0JfQotCi19IC8vV1NETEJpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY2YjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExNZXNzYWdlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfTUVTU0FHRTsKLQl9Ci0KLX0gLy9XU0RMTWVzc2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkMjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwjZ2V0UGFyYW1ldGVyTW9kZSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCNpc1NvYXBIZWFkZXIgPGVtPlNvYXAgSGVhZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMTWVzc2FnZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVyTW9kZSgpIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlck1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTU9ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJNb2RlKCkgPGVtPlBhcmFtZXRlciBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVyTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1ldGVyTW9kZSA9IFBBUkFNRVRFUl9NT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcEhlYWRlcigpIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU29hcEhlYWRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTT0FQX0hFQURFUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTb2FwSGVhZGVyKCkgPGVtPlNvYXAgSGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTb2FwSGVhZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc29hcEhlYWRlciA9IFNPQVBfSEVBREVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTb2FwIEhlYWRlciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzb2FwSGVhZGVyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2UoKSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2Ugd3NkbE1lc3NhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX01FU1NBR0VfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIG5ld1dzZGxNZXNzYWdlUGFydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUgPSB3c2RsTWVzc2FnZVBhcnROYW1lOwotCQl3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSwgd3NkbE1lc3NhZ2VQYXJ0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJNb2RlKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlck1vZGUoU3RyaW5nIG5ld1BhcmFtZXRlck1vZGUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtZXRlck1vZGUgPSBwYXJhbWV0ZXJNb2RlOwotCQlwYXJhbWV0ZXJNb2RlID0gbmV3UGFyYW1ldGVyTW9kZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREUsIG9sZFBhcmFtZXRlck1vZGUsIHBhcmFtZXRlck1vZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU29hcEhlYWRlcigpIHsKLQkJcmV0dXJuIHNvYXBIZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTb2FwSGVhZGVyKGJvb2xlYW4gbmV3U29hcEhlYWRlcikgewotCQlib29sZWFuIG9sZFNvYXBIZWFkZXIgPSBzb2FwSGVhZGVyOwotCQlzb2FwSGVhZGVyID0gbmV3U29hcEhlYWRlcjsKLQkJYm9vbGVhbiBvbGRTb2FwSGVhZGVyRVNldCA9IHNvYXBIZWFkZXJFU2V0OwotCQlzb2FwSGVhZGVyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSLCBvbGRTb2FwSGVhZGVyLCBzb2FwSGVhZGVyLCAhb2xkU29hcEhlYWRlckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0U29hcEhlYWRlcigpIHsKLQkJYm9vbGVhbiBvbGRTb2FwSGVhZGVyID0gc29hcEhlYWRlcjsKLQkJYm9vbGVhbiBvbGRTb2FwSGVhZGVyRVNldCA9IHNvYXBIZWFkZXJFU2V0OwotCQlzb2FwSGVhZGVyID0gU09BUF9IRUFERVJfRURFRkFVTFQ7Ci0JCXNvYXBIZWFkZXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIsIG9sZFNvYXBIZWFkZXIsIFNPQVBfSEVBREVSX0VERUZBVUxULCBvbGRTb2FwSGVhZGVyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRTb2FwSGVhZGVyKCkgewotCQlyZXR1cm4gc29hcEhlYWRlckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExNZXNzYWdlIG9sZFdzZGxNZXNzYWdlID0gd3NkbE1lc3NhZ2U7Ci0JCXdzZGxNZXNzYWdlID0gbmV3V3NkbE1lc3NhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgb2xkV3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlKSB7Ci0JCWlmIChuZXdXc2RsTWVzc2FnZSAhPSB3c2RsTWVzc2FnZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbE1lc3NhZ2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxNZXNzYWdlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxNZXNzYWdlKG5ld1dzZGxNZXNzYWdlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbmV3V3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbE1lc3NhZ2UobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlck1vZGUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVI6Ci0JCQkJcmV0dXJuIGlzU29hcEhlYWRlcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREU6Ci0JCQkJc2V0UGFyYW1ldGVyTW9kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSOgotCQkJCXNldFNvYXBIZWFkZXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERToKLQkJCQlzZXRQYXJhbWV0ZXJNb2RlKFBBUkFNRVRFUl9NT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSOgotCQkJCXVuc2V0U29hcEhlYWRlcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXNldFdzZGxNZXNzYWdlKChXU0RMTWVzc2FnZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxNZXNzYWdlUGFydE5hbWUgIT0gbnVsbCA6ICFXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREU6Ci0JCQkJcmV0dXJuIFBBUkFNRVRFUl9NT0RFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbWV0ZXJNb2RlICE9IG51bGwgOiAhUEFSQU1FVEVSX01PREVfRURFRkFVTFQuZXF1YWxzKHBhcmFtZXRlck1vZGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUjoKLQkJCQlyZXR1cm4gaXNTZXRTb2FwSGVhZGVyKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gd3NkbE1lc3NhZ2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJNb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJNb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwSGVhZGVyOiAiKTsKLQkJaWYgKHNvYXBIZWFkZXJFU2V0KSByZXN1bHQuYXBwZW5kKHNvYXBIZWFkZXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV1NETE1lc3NhZ2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTIxNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExNZXNzYWdlUGFydE5hbWUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX01FU1NBR0VfUEFSVF9OQU1FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyBuZXdXc2RsTWVzc2FnZVBhcnROYW1lKSB7Ci0JCVN0cmluZyBvbGRXc2RsTWVzc2FnZVBhcnROYW1lID0gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IG5ld1dzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSwgd3NkbE1lc3NhZ2VQYXJ0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbE1lc3NhZ2VQYXJ0TmFtZSAhPSBudWxsIDogIVdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XU0RMTWVzc2FnZVBhcnROYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmM5YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgT3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbCNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExPcGVyYXRpb25JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETE9wZXJhdGlvbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfT1BFUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxPcGVyYXRpb24oKSA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsT3BlcmF0aW9uID0gV1NETF9PUEVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMT3BlcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX09QRVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxPcGVyYXRpb24oU3RyaW5nIG5ld1dzZGxPcGVyYXRpb24pIHsKLQkJU3RyaW5nIG9sZFdzZGxPcGVyYXRpb24gPSB3c2RsT3BlcmF0aW9uOwotCQl3c2RsT3BlcmF0aW9uID0gbmV3V3NkbE9wZXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04sIG9sZFdzZGxPcGVyYXRpb24sIHdzZGxPcGVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0V3NkbE9wZXJhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT046Ci0JCQkJc2V0V3NkbE9wZXJhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTjoKLQkJCQlzZXRXc2RsT3BlcmF0aW9uKFdTRExfT1BFUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OOgotCQkJCXJldHVybiBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbE9wZXJhdGlvbiAhPSBudWxsIDogIVdTRExfT1BFUkFUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsT3BlcmF0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsT3BlcmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsT3BlcmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV1NETE9wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExQb3J0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExQb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzYWE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgUG9ydCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRUeXBlSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExQb3J0VHlwZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExQb3J0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9QT1JUX1RZUEU7Ci0JfQotCi19IC8vV1NETFBvcnRUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzhkNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0TWV0aG9kUmV0dXJuVmFsdWUgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFJldHVyblZhbHVlKCkgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9SRVRVUk5fVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKSA8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFJldHVyblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXRob2RSZXR1cm5WYWx1ZSA9IE1FVEhPRF9SRVRVUk5fVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZSgpIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZSB3c2RsTWVzc2FnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKSB7Ci0JCXJldHVybiBtZXRob2RSZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZFJldHVyblZhbHVlKFN0cmluZyBuZXdNZXRob2RSZXR1cm5WYWx1ZSkgewotCQlTdHJpbmcgb2xkTWV0aG9kUmV0dXJuVmFsdWUgPSBtZXRob2RSZXR1cm5WYWx1ZTsKLQkJbWV0aG9kUmV0dXJuVmFsdWUgPSBuZXdNZXRob2RSZXR1cm5WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFLCBvbGRNZXRob2RSZXR1cm5WYWx1ZSwgbWV0aG9kUmV0dXJuVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyBuZXdXc2RsTWVzc2FnZVBhcnROYW1lKSB7Ci0JCVN0cmluZyBvbGRXc2RsTWVzc2FnZVBhcnROYW1lID0gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IG5ld1dzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSwgd3NkbE1lc3NhZ2VQYXJ0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMTWVzc2FnZSBvbGRXc2RsTWVzc2FnZSA9IHdzZGxNZXNzYWdlOwotCQl3c2RsTWVzc2FnZSA9IG5ld1dzZGxNZXNzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgb2xkV3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlKSB7Ci0JCWlmIChuZXdXc2RsTWVzc2FnZSAhPSB3c2RsTWVzc2FnZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbE1lc3NhZ2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbE1lc3NhZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsTWVzc2FnZShuZXdXc2RsTWVzc2FnZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbmV3V3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsTWVzc2FnZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFJldHVyblZhbHVlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFOgotCQkJCXNldE1ldGhvZFJldHVyblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFOgotCQkJCXNldE1ldGhvZFJldHVyblZhbHVlKE1FVEhPRF9SRVRVUk5fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRToKLQkJCQlyZXR1cm4gTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kUmV0dXJuVmFsdWUgIT0gbnVsbCA6ICFNRVRIT0RfUkVUVVJOX1ZBTFVFX0VERUZBVUxULmVxdWFscyhtZXRob2RSZXR1cm5WYWx1ZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbE1lc3NhZ2VQYXJ0TmFtZSAhPSBudWxsIDogIVdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gd3NkbE1lc3NhZ2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RSZXR1cm5WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0aG9kUmV0dXJuVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNlYzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBTZXJ2aWNlIE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VydmljZU5hbWVJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2VOYW1lCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFNlcnZpY2VOYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX1NFUlZJQ0VfTkFNRTsKLQl9Ci0KLX0gLy9XU0RMU2VydmljZU5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0OGRlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSmF4cnBjbWFwUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBKYXhycGNtYXBTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSmF4cnBjbWFwU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YVdTRExNYXBwaW5nKEphdmFXU0RMTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVdTRExNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUGFja2FnZU1hcHBpbmcoUGFja2FnZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YVhNTFR5cGVNYXBwaW5nKEphdmFYTUxUeXBlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uTWFwcGluZyhFeGNlcHRpb25NYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25NYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUludGVyZmFjZU1hcHBpbmcoU2VydmljZUludGVyZmFjZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyhTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUm9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFyaWFibGVNYXBwaW5nKFZhcmlhYmxlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFyaWFibGVNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2UoV1NETE1lc3NhZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRWxlbWVudE5hbWUoRWxlbWVudE5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnROYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFNlcnZpY2VOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydE1hcHBpbmcoUG9ydE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnRUeXBlKFdTRExQb3J0VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETEJpbmRpbmcoV1NETEJpbmRpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExCaW5kaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyhTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETE9wZXJhdGlvbihXU0RMT3BlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMT3BlcmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMUmV0dXJuVmFsdWVNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2VQYXJ0TmFtZShXU0RMTWVzc2FnZVBhcnROYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJmYWNlTWFwcGluZyhJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nIDxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFXU0RMTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcgPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nIDxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGNlcHRpb25NYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZSA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvb3RUeXBlUW5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyA8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2UgPGVtPldTREwgTWVzc2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lIDxlbT5XU0RMIFNlcnZpY2UgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcgPGVtPlBvcnQgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZSA8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMUG9ydFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nIDxlbT5XU0RMIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExCaW5kaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIDxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24gPGVtPldTREwgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nIDxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nIDxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVRTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXhycGNtYXBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYmMyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSmF4cnBjbWFwUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSmF4cnBjbWFwU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElORzogewotCQkJCUphdmFXU0RMTWFwcGluZyBqYXZhV1NETE1hcHBpbmcgPSAoSmF2YVdTRExNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhV1NETE1hcHBpbmcoamF2YVdTRExNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqYXZhV1NETE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkc6IHsKLQkJCQlQYWNrYWdlTWFwcGluZyBwYWNrYWdlTWFwcGluZyA9IChQYWNrYWdlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGFja2FnZU1hcHBpbmcocGFja2FnZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHBhY2thZ2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HOiB7Ci0JCQkJSmF2YVhNTFR5cGVNYXBwaW5nIGphdmFYTUxUeXBlTWFwcGluZyA9IChKYXZhWE1MVHlwZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFYTUxUeXBlTWFwcGluZyhqYXZhWE1MVHlwZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGphdmFYTUxUeXBlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HOiB7Ci0JCQkJRXhjZXB0aW9uTWFwcGluZyBleGNlcHRpb25NYXBwaW5nID0gKEV4Y2VwdGlvbk1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2VwdGlvbk1hcHBpbmcoZXhjZXB0aW9uTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZXhjZXB0aW9uTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkc6IHsKLQkJCQlTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA9IChTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUludGVyZmFjZU1hcHBpbmcoc2VydmljZUludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVyZmFjZU1hcHBpbmcoc2VydmljZUludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElORzogewotCQkJCVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyA9IChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVyZmFjZU1hcHBpbmcoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRTogewotCQkJCVJvb3RUeXBlUW5hbWUgcm9vdFR5cGVRbmFtZSA9IChSb290VHlwZVFuYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb290VHlwZVFuYW1lKHJvb3RUeXBlUW5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVFOYW1lKHJvb3RUeXBlUW5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJvb3RUeXBlUW5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HOiB7Ci0JCQkJVmFyaWFibGVNYXBwaW5nIHZhcmlhYmxlTWFwcGluZyA9IChWYXJpYWJsZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhcmlhYmxlTWFwcGluZyh2YXJpYWJsZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHZhcmlhYmxlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRTogewotCQkJCVdTRExNZXNzYWdlIHdzZGxNZXNzYWdlID0gKFdTRExNZXNzYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMTWVzc2FnZSh3c2RsTWVzc2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbE1lc3NhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxNZXNzYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOiB7Ci0JCQkJQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyID0gKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRTogewotCQkJCUVsZW1lbnROYW1lIGVsZW1lbnROYW1lID0gKEVsZW1lbnROYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWxlbWVudE5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1NFUlZJQ0VfTkFNRTogewotCQkJCVdTRExTZXJ2aWNlTmFtZSB3c2RsU2VydmljZU5hbWUgPSAoV1NETFNlcnZpY2VOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMU2VydmljZU5hbWUod3NkbFNlcnZpY2VOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZSh3c2RsU2VydmljZU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxTZXJ2aWNlTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElORzogewotCQkJCVBvcnRNYXBwaW5nIHBvcnRNYXBwaW5nID0gKFBvcnRNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0TWFwcGluZyhwb3J0TWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocG9ydE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRTogewotCQkJCVdTRExQb3J0VHlwZSB3c2RsUG9ydFR5cGUgPSAoV1NETFBvcnRUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMUG9ydFR5cGUod3NkbFBvcnRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZSh3c2RsUG9ydFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxQb3J0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfQklORElORzogewotCQkJCVdTRExCaW5kaW5nIHdzZGxCaW5kaW5nID0gKFdTRExCaW5kaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMQmluZGluZyh3c2RsQmluZGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbEJpbmRpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxCaW5kaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORzogewotCQkJCVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA9IChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTjogewotCQkJCVdTRExPcGVyYXRpb24gd3NkbE9wZXJhdGlvbiA9IChXU0RMT3BlcmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMT3BlcmF0aW9uKHdzZGxPcGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxPcGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORzogewotCQkJCU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nID0gKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RQYXJhbVBhcnRzTWFwcGluZyhtZXRob2RQYXJhbVBhcnRzTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOiB7Ci0JCQkJV1NETFJldHVyblZhbHVlTWFwcGluZyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcod3NkbFJldHVyblZhbHVlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod3NkbFJldHVyblZhbHVlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HOiB7Ci0JCQkJV1NETE1lc3NhZ2VNYXBwaW5nIHdzZGxNZXNzYWdlTWFwcGluZyA9IChXU0RMTWVzc2FnZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExNZXNzYWdlTWFwcGluZyh3c2RsTWVzc2FnZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxNZXNzYWdlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUU6IHsKLQkJCQlXU0RMTWVzc2FnZVBhcnROYW1lIHdzZGxNZXNzYWdlUGFydE5hbWUgPSAoV1NETE1lc3NhZ2VQYXJ0TmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETE1lc3NhZ2VQYXJ0TmFtZSh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSU5URVJGQUNFX01BUFBJTkc6IHsKLQkJCQlJbnRlcmZhY2VNYXBwaW5nIGludGVyZmFjZU1hcHBpbmcgPSAoSW50ZXJmYWNlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW50ZXJmYWNlTWFwcGluZyhpbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChpbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VKYXZhV1NETE1hcHBpbmcoSmF2YVdTRExNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBhY2thZ2VNYXBwaW5nKFBhY2thZ2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUphdmFYTUxUeXBlTWFwcGluZyhKYXZhWE1MVHlwZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvbk1hcHBpbmcoRXhjZXB0aW9uTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyhTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVZhcmlhYmxlTWFwcGluZyhWYXJpYWJsZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIE1lc3NhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2UoV1NETE1lc3NhZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnROYW1lKEVsZW1lbnROYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMU2VydmljZU5hbWUoV1NETFNlcnZpY2VOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRNYXBwaW5nKFBvcnRNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMUG9ydFR5cGUoV1NETFBvcnRUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExCaW5kaW5nKFdTRExCaW5kaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyhTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMT3BlcmF0aW9uKFdTRExPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2VQYXJ0TmFtZShXU0RMTWVzc2FnZVBhcnROYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmZhY2VNYXBwaW5nKEludGVyZmFjZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXhycGNtYXBTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzUwNzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYV91aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwZDY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamNhdWkuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlYzlkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjhhYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jVGh1IE1heSAxMCAxODozNTowNCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE5ZWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5wbHVnaW4uSkNBVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzU4NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gamNhX3VpLyxcCi0gICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWM2YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9FeHBvcnRSQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9FeHBvcnRSQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MGYyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvRXhwb3J0UkFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UkFSQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbCA9IEpDQVVJTWVzc2FnZXMuY29ubmVjdG9yX2V4cG9ydF9hY3Rpb25fbGFiZWxfdWlfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImV4cG9ydF9yYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEV4cG9ydFJBUkFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChsYWJlbCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IENvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCgpOwotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3MocGx1Z2luLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM1ZmM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLQotCi0vKioKLSAqIERlZmluZXMgY29uc3RhbnRzIGZvciBDb25uZWN0b3IgQXJjaGl2ZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzIHsKLQotCS8vQWN0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9FWFBPUlRfQUNUSU9OX0xBQkVMID0gIiVjb25uZWN0b3IuZXhwb3J0LmFjdGlvbi5sYWJlbF91aV8iOyAvLyROT04tTkxTLTEkCi0KLQkvL0dlbmVyYWwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfUFJPSkVDVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfUHJvamVjdF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9GSUxFX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9GaWxlX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfQ09OTkVDVE9SX0ZJTEVfTkFNRVNfSUQgPSAiRUpCSW1wb3J0V2l6YXJkUGFnZTEuU1RPUkVfQ09OTkVDVE9SX0ZJTEVfTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfQ09OTkVDVE9SX0VYUE9SVF9GSUxFX05BTUVTID0gIkNvbmVuY3RvckV4cG9ydFdpemFyZFBhZ2UxLlNUT1JFX0NPTk5FQ1RPUl9FWFBPUlRfRklMRV9OQU1FUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpfSU1BR0UgPSAiY29ubmVjdG9yX2ltcG9ydF93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSX0JST1dTRV9CVVRUT05fRklMVEVSID0gIioucmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FWFRFTlNJT04gPSAicmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJZZXNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJOb19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVNUSU9OX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlF1ZXN0aW9uX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfX1VJXyA9ICJSZXNvdXJjZV97MH1fYWxyZWFkeV9leGlzdHMuX19Xb3VsZF95b3VfbGlrZV90b19vdmVyd3JpdGVfaXRfVUlfIjsgLy8kTk9OLU5MUy0xJAotCS8vSW1wb3J0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9BX0NPTk5FQ1RPUl9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfYV9Db25uZWN0b3JfcHJvamVjdF9mcm9tX3RoZV9maWxlX3N5c3RlbV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9JTlRPX05FV19PUl9FWElTVElOR19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfaW50b19uZXdfb3JfZXhpc3RpbmdfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9wcm9qZWN0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lNUE9SVF9JRF8gPSAiQ29ubmVjdG9yUHJvamVjdEltcG9ydFBhZ2UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9JTVBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0ltcG9ydF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElSQVIxMDAwID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuaXJhcjEwMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvL0V4cG9ydAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9FWFBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0V4cG9ydF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9DT05ORUNUT1JfX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkV4cG9ydF9Db25uZWN0b3JfUHJvamVjdF90b190aGVfbG9jYWxfZmlsZV9zeXN0ZW1fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLQkVOQ0hfSUQgPSAiQ29ubmVjdG9yRXhwb3J0UGFnZTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkV4cG9ydF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYX1dJWl9JTUFHRSA9ICJjb25uZWN0b3JfZXhwb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUkFSMTAwMCA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmVyYXIxMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9FcnJvcnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkFCTEVfVE9fQ09NUExFVEVfVEhFX09QRU5fRVJST1JfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVW5hYmxlX3RvX2NvbXBsZXRlX3RoZV9vcGVyYXRpb25kdW1wX2NhdXNlZF9ieV90aGlzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1BST0JMRU1TX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9Qcm9ibGVtc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9JTVBPUlRfX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9JbXBvcnRfRXJyb3JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRVJST1JfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X0Vycm9yX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFX0pBUl9GSUxFX0RPRVNfTk9UX0VYSVNUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9qYXJfZmlsZV9kb2VzX25vdF9leGlzdF9vcl9jYW5ub3RfYmVfb3BlbmVkLF9VSV8iKSArIC8vJE5PTi1OTFMtMSQKLQkJCQlSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDbGlja19icm93c2VfdG9fc2VsZWN0X2FfdmFsaWRfamFyX29yX2VudGVyX2FfdmFsaWRfamFyX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VYUE9SVF9FUlJPUl9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfRXhwb3J0X0Vycm9yX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOTk9UX0VYUE9SVF9DTE9TRURfUFJPSkVDVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYW5ub3RfZXhwb3J0X2Nsb3NlZF9wcm9qZWN0c19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJhcl9GaWxlX05hbWVfTmVlZGVkX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJhcl9GaWxlX05hbWVfTmVlZGVkX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLX0vLyBJQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydFJBUkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydFJBUkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2QwZDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRSQVJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1JBUiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiaW1wb3J0X3Jhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0UkFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkJhc2VBY3Rpb24jcHJpbVJ1bihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0KLQkJQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQoKTsKLQotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL05ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL05ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRhMmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvclByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0KLS8qKgotICogQ3JlYXRlcyBhbiBhY3Rpb24gZm9yIHRoZSBDb25uZWN0b3IgcHJvamVjdAotICovCi1wdWJsaWMgY2xhc3MgTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSkNBVUlNZXNzYWdlcy5KQ0FfTU9EVUxFX1dJWl9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJuZXdlYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBOZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24oKSB7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0vLyBOZXdDb25uZWN0b3JQcm9qZWN0QWN0aW9uCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gSVdvcmtiZW5jaAotCSAqICAgICAgICAgICAgd29ya2JlbmNoIC0gV29ya2JlbmNoIHRvIGFkZCB0byB0aGlzIHdpemFyZCB0b28uCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgbGFiZWwgLSBMYWJlbCBmb3IgcHJvamVjdC4KLQkgKiBAcGFyYW0gQ2xhc3NbXQotCSAqICAgICAgICAgICAgYWNjZXB0ZWRUeXBlcyAtIExpc3Qgb2YgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoaXMgd2l6YXJkCi0JICovCi0JcHVibGljIE5ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjY2VwdGVkVHlwZXMpIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0ZWRUeXBlcywgZmFsc2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0vLyBOZXdDb25uZWN0b3JQcm9qZWN0QWN0aW9uCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIFdpemFyZAotCSAqLwotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvclByb2plY3RXaXphcmQoKTsKLQl9Ly8gY3JlYXRlV2l6YXJkCi0KLQkvKioKLQkgKiBzaG91bGRBY2NlcHRFbGVtZW50IC0gQWx3YXlzIHRydWUKLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmoKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2NlcHRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7IC8qIE5ld0dyb3VwLmlzT25CdWlsZFBhdGgob2JqKSAmJiAhTmV3R3JvdXAuaXNJbkFyY2hpdmUob2JqKTsgKi8KLQl9Ly8gc2hvdWxkQWNjZXB0RWxlbWVudAotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ly8gTmV3Q29ubmVjdG9yUHJvamVjdEFjdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL1JBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL1JBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE3OTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9SQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJyYXJhcmNoaXZldWkiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3BsdWdpbi9KQ0FVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9wbHVnaW4vSkNBVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzYTQyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3BsdWdpbi9KQ0FVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ0FVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8JVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKQ0FVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpDQVVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpDQVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC91dGlsL0pDQVVJTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvdXRpbC9KQ0FVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzQ3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC91dGlsL0pDQVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotcHVibGljIGNsYXNzIEpDQVVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpjYV91aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKQ0FVSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0b3JfZXhwb3J0X2FjdGlvbl9sYWJlbF91aV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpDQVVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xPQURfRVJST1IgPSBfMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX1dJWl9USVRMRSA9IF8xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9WRVJTSU9OX0xCTCA9IF8yOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9NT0RVTEVfTUFJTl9QR19USVRMRSA9IF8zOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9NT0RVTEVfTUFJTl9QR19ERVNDID0gXzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0lNUE9SVF9NQUlOX1BHX0RFU0MgPSBfNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfSU1QT1JUX01BSU5fUEdfVElUTEUgPSBfNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRklMRV9MQkwgPSBfNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX0xCTCA9IF84OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9FWFBPUlRfTUFJTl9QR19USVRMRSA9IF85OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9FWFBPUlRfTUFJTl9QR19ERVNDID0gXzEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9GQUNFVF9DT05GSUdVUkFUSU9OPSBfMTE7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJlYTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBleHBvcnQgSjJFRSBDb25uZWN0b3IgbW9kdWxlIHN0cnVjdHVyZXMgCi0gKiBmcm9tIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB0byBhIGRlcGxveWFibGUgQ29ubmVjdG9yIAotICogQXJjaGl2ZSAqLnJhciBmaWxlLiAgCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCAKLQkgKiBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCAKLQkgKiBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scwotCSAqIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogCTxsaT4ge0BsaW5rIFJBUkV4cG9ydFBhZ2V9IGFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KSAKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBSQVJFeHBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHLCBnZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30gICAKLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLiAKLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9IAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNlODRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVJbXBvcnRQYWdlIHsKLQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9JTVBPUlRfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX0lNUE9SVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKQ0FVSU1lc3NhZ2VzLkpDQV9GSUxFX0xCTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5yYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJSQVIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9MQkw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX1JBUl9XSVpBUkRfUEFHRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCl7Ci0JCXJldHVybiBJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMzk0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gaW1wb3J0IEoyRUUgQ29ubmVjdG9yIG1vZHVsZSBzdHJ1Y3R1cmVzIGludG8gdGhlIEVjbGlwc2UgV29ya2JlbmNoIGZyb20gYW4KLSAqIGV4aXN0aW5nIENvbm5lY3RvciAqLnJhciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhbiB7QGxpbmsgUkFSSW1wb3J0UGFnZX0gYXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSU1QT1JUX1dJWl9USVRMRSkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJLy8gdXBkYXRlRUFSVG9Nb2RlbEZyb21TZWxlY3Rpb24oZ2V0U3BlY2lmaWNEYXRhTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uLlVJQ29ubmVjdG9yVmFsaWRhdG9yIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0pDQSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWVlNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50RmFjZXRDcmVhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0NPTk5FQ1RPUl9XSVpBUkRfUDEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpIHsKLQkJcmV0dXJuIElKMkVFRmFjZXRDb25zdGFudHMuSkNBOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQzMDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvclByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQotCXB1YmxpYyBDb25uZWN0b3JQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfV0laX1RJVExFKTsKLQl9Ci0JCi0JcHVibGljIENvbm5lY3RvclByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC5jb25uZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0pDQSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjYzNDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL1JBUkV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlRXhwb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFJBUkV4cG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRXhwb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFJBUkV4cG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9FWFBPUlRfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX0VYUE9SVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KQ0FfUFJPSl9MQkwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLnJhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBDb25uZWN0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0SW5mb3BvcElEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLkVYUE9SVF9SQVJfV0laQVJEX1BBR0U7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotICAgICAgICByZXR1cm4gIkpTVF9DT05ORUNUT1IiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5NjYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVdUUCBKQ0EgVUkgUGx1Zy1pbgotamNhLm1vZHVsZV91aV89Q29ubmVjdG9yIE1vZHVsZQotbmV3LmpjYS5tb2R1bGUuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIENvbm5lY3RvciBtb2R1bGUKLWNvbm5lY3Rvci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBDb25uZWN0b3IgUkFSIGZpbGUgaW50byBhIENvbm5lY3RvciBwcm9qZWN0Ci1jb25uZWN0b3IuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgYSBDb25uZWN0b3IgcHJvamVjdCBpbnRvIGEgQ29ubmVjdG9yIFJBUiBmaWxlCi1jb25uZWN0b3IuamFyLmZpbGVfdWlfPVJBUiBmaWxlCi1jb25uZWN0b3IubW9kdWxlX3VpXz1Db25uZWN0b3IgTW9kdWxlCi1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgQ29ubmVjdG9yIHByb2plY3QKLWNvbm5lY3Rvci5pbXBvcnQuYWN0aW9uLmxhYmVsX3VpXz1JbXBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvci5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXz1FeHBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvcl9tb2R1bGVfdWlfPUNvbm5lY3RvciBQcm9qZWN0Ci1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgSjJFRSBjb25uZWN0b3IgcHJvamVjdAotY29ubmVjdG9ycy5hY3Rpb25TZXQ9SjJDCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5ZTNkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8IS0tIENvbm5lY3RvciBNb2R1bGUgV2l6YXJkIC0tPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJKMkVFVUlQcm9qZWN0V2l6YXJkcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3JfbW9kdWxlX3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZXByb2plY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjUwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVuZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotICAgICAgPC93aXphcmQ+Ci0gICAgPC9leHRlbnNpb24+Ci08IS0tIEpDQSBJbXBvcnQgV2l6YXJkIC0tPiAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3IuamFyLmZpbGVfdWlfIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb25uZWN0b3IuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICAgPC93aXphcmQ+Ci0gICAgIDwvZXh0ZW5zaW9uPgotCi08IS0tIEpDQSBFeHBvcnQgV2l6YXJkIC0tPiAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgIDx3aXphcmQKLSAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICBuYW1lPSIlY29ubmVjdG9yLmphci5maWxlX3VpXyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29ubmVjdG9yLmV4cG9ydC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgIDwvd2l6YXJkPgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcHJvcGVydHlfZmlsZXMvamNhX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZjVmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotXzA9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgotXzE9TmV3IENvbm5lY3RvciBQcm9qZWN0Ci1fMj1KMkMgdmVyc2lvbjoKLV8zPUNvbm5lY3RvciBQcm9qZWN0Ci1fND1DcmVhdGUgYSBzdGFuZGFsb25lIENvbm5lY3RvciBtb2R1bGUgb3IgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4KLV81PUltcG9ydCBhIENvbm5lY3RvciBtb2R1bGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLV82PUNvbm5lY3RvciBJbXBvcnQKLV83PUNvbm5lY3RvciBmaWxlOgotXzg9Q29ubmVjdG9yIG1vZHVsZToKLV85PUNvbm5lY3RvciBFeHBvcnQKLV8xMD1FeHBvcnQgQ29ubmVjdG9yIG1vZHVsZSB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1fMTE9Q29uZmlndXJlIENvbm5lY3RvciBtb2R1bGUgc2V0dGluZ3MuCi1jb25uZWN0b3JfZXhwb3J0X2FjdGlvbl9sYWJlbF91aV89RXhwb3J0IFJBUiBGaWxlLi4uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlYjgzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InJhcnByb2plY3QvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhZWRpdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqY2EtdmFsaWRhdGlvbi8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWIzNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg1YWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuamNhPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5YTgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NmViZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLm1vZHVsZS51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJkYjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gamNhLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmFycHJvamVjdC8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIGpjYWVkaXQvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqY2EtdmFsaWRhdGlvbi8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gLgotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjcwZWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ09OVEFDVD1kYW5iZXJnQHVzLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT1lamIKLUNvbXBvbmVudEZ1bGxOYW1lPUVKQgotQ29tcG9uZW50Q29tcGV0ZW5jeT1FTUYKLUphdmFDb21waWxlLjE9c3JjamFyCi1CdWlsZFZlcmlmaWNhdGlvbi4xPWRpcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0ZDJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2giIGRlZmF1bHQ9InBhY2thZ2luZ1BsdWdpbiIgYmFzZWRpcj0iLi8uLiI+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2VEaXIiIHZhbHVlPSIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kaXJlY3RvcnkiICB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmlkIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuZWpiIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4udmVyc2lvbiIgIHZhbHVlPSIiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InBhY2thZ2luZ1BsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IiR7cGx1Z2luLmlkfSIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtwYWNrYWdlRGlyfS9wbHVnaW5zLyR7cGx1Z2luLmlkfV8ke3BsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luLmRpcmVjdG9yeX0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InBsdWdpbi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL2VqYi5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvd3NCdWlsZC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC93c0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMGI4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSIke2RlZmF1bHRqYXJuYW1lfSIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofSIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3M2UxZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZhdGlvblNwZWNfcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3RpdmF0aW9uU3BlY19yZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXNfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmYxNDMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3RpdmF0aW9uU3BlY19yZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXNfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFkbWluT2JqZWN0X2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFkbWluT2JqZWN0X2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg3YjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBZG1pbk9iamVjdF9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMmIxZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2Y0ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZTA1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZGZmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25fY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25fY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2VmZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9saWNlbnNlX0xpY2Vuc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9saWNlbnNlX0xpY2Vuc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZmNDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfbGljZW5zZV9MaWNlbnNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfcmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX3Jlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJiYzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfcmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMzhmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzM2Q0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUxY2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzMwYmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU4OGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX21lc3NhZ2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX21lc3NhZ2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwMWUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcl9tZXNzYWdlQWRhcHRlcl9NZXNzYWdlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3ZWVlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMTg4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlQWRhcHRlcl9tZXNzYWdlTGlzdGVuZXJzX01lc3NhZ2VMaXN0ZW5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUFkYXB0ZXJfbWVzc2FnZUxpc3RlbmVyc19NZXNzYWdlTGlzdGVuZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTUwNTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlQWRhcHRlcl9tZXNzYWdlTGlzdGVuZXJzX01lc3NhZ2VMaXN0ZW5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUxpc3RlbmVyX2FjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlTGlzdGVuZXJfYWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2YzMDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlTGlzdGVuZXJfYWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0Y2FhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRGVmaW5pdGlvbnNfQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25EZWZpbml0aW9uc19Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDYxMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25EZWZpbml0aW9uc19Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdlZWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQxODg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYWRtaW5PYmplY3RzX0FkbWluT2JqZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYWRtaW5PYmplY3RzX0FkbWluT2JqZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxOTJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2FkbWluT2JqZWN0c19BZG1pbk9iamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTQ2NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTE0OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfaW5ib3VuZFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfaW5ib3VuZFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2RlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2luYm91bmRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX291dGJvdW5kUmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRhMTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9zZWN1cml0eVBlcm1pc3Npb25zX1NlY3VyaXR5UGVybWlzc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX3NlY3VyaXR5UGVybWlzc2lvbnNfU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NGFmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX3NlY3VyaXR5UGVybWlzc2lvbnNfU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyNWJlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyOGY0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FjdGl2YXRpb25TcGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FjdGl2YXRpb25TcGVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWRtaW5PYmplY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BZG1pbk9iamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjQzZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BZG1pbk9iamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0NvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlM2NmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0NvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjI0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODc0NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGZiOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTGljZW5zZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0xpY2Vuc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE0ZmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTGljZW5zZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ1NTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlTGlzdGVuZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlTGlzdGVuZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIyNDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjgyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE0ZmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI0ZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlQZXJtaXNzaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5UGVybWlzc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vQ29ubmVjdG9ySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9Db25uZWN0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkYzllZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9Db25uZWN0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtCi0gKiBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5Db25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckhlbHBlciBleHRlbmRzIEoyRUVWYWxpZGF0aW9uSGVscGVyIHsKLQlwcm90ZWN0ZWQgUkFSRmlsZSByYXJGaWxlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lzdGVyTW9kZWwoQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5DT05ORUNUT1JfTU9ERUxfTkFNRSwgImxvYWRSYXJGaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFJhciBmaWxlIGZvciB2YWxpZGF0aW9uCi0JICovCi0JcHVibGljIEVPYmplY3QgbG9hZFJhckZpbGUoKSB7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSk7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCQotCQl0cnkgewotCQkJcmFyRmlsZSA9IChSQVJGaWxlKSgoQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KSBlZGl0KS5hc0FyY2hpdmUoZmFsc2UpOwotCQkJcmV0dXJuIHJhckZpbGU7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUxKTsKLQkJfWZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCQotCS8qKgotCSAqIEdpdmVuIGEgcmVzb3VyY2UsIHJldHVybiBpdHMgbm9uLWVjbGlwc2Utc3BlY2lmaWMgbG9jYXRpb24uIElmIHRoaXMgcmVzb3VyY2UsIG9yIHR5cGUgb2YKLQkgKiByZXNvdXJjZSwgaXNuJ3QgaGFuZGxlZCBieSB0aGlzIGhlbHBlciwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gInJhci54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyB2b2lkIGNsZWFudXAoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYocmFyRmlsZSAhPSBudWxsKXsKLQkJCXJhckZpbGUuY2xvc2UoKTsKLQkJCXJhckZpbGUgPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9VSUNvbm5lY3RvclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vVUlDb25uZWN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzMTA2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9VSUNvbm5lY3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5Db25uZWN0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVJQ29ubmVjdG9yVmFsaWRhdG9yIGV4dGVuZHMgQ29ubmVjdG9yVmFsaWRhdG9yIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFVJQ29ubmVjdG9yVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uewotCQkKLQkJSVByb2plY3QgcHJvaiA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCB3Yk1vZHVsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotCQkKLSAgICAgICAgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2opKSB7Ci0JCQlJVmlydHVhbEZpbGUgcmFyREQgPSB3Yk1vZHVsZS5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOwotCQkJaWYoIHJhckRELmV4aXN0cygpKSB7CQkJCi0JCQkJc3RhdHVzID0gIHN1cGVyLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCQl9ZWxzZXsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUpOwotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggZXJyb3JNc2cuZ2V0VGV4dCggZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJfQotCQkJLy92YWxpZGF0ZUoyRUUxNERvY1R5cGUoaGVscGVyLCBlZGl0TW9kZWwpOwotCQl9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0JfQotCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIG5hdHVyZSBpcyBjb25zaXN0ZW50IHdpdGggZG9jIHR5cGUuCi0JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUoyRUUxNERvY1R5cGUoQ29ubmVjdG9ySGVscGVyIGhlbHBlciwgQ29ubmVjdG9yRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotLy8KLS8vCQlpZiAoZWRpdE1vZGVsLmdldENvbm5lY3Rvck5hdHVyZSgpLmdldEoyRUVWZXJzaW9uKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgJiYgZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpIHsKLS8vCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLS8vCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzQ7Ci0vLwkJCXBhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotLy8JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMzsKLS8vCQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfLCBwYXJhbXMpOwotLy8JCX0gZWxzZSBpZiAoZWRpdE1vZGVsLmdldENvbm5lY3Rvck5hdHVyZSgpLmdldEoyRUVWZXJzaW9uKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgJiYgZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEKSB7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0vLwkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV8zOwotLy8JCQlwYXJhbXNbMV0gPSBoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLS8vCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzQ7Ci0vLwkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLS8vCQl9Ly8gaWYKLS8vCX0vLyB2YWxpZGF0ZURvY1R5cGVWc05hdHVyZQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjg2NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5JQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9JRCkpIHsKLQkJCXJldHVybiBKQ0E7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5KQ0FfQ09OVEVOVF9GT0xERVIpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTU9EVUxFX1VSSSkpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkucmVwbGFjZSgnICcsJ18nKTsKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQ7IAotCQl9IGVsc2UgaWYocHJvcGVydHlOYW1lLmVxdWFscyhHRU5FUkFURV9ERCkpewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgY29udmVydEZhY2V0VmVyc2lvblRvSjJFRVZlcnNpb24oSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHNvdXJjZUZvbGRlcgotICAgICAgICAgICAgICAgICAgICA9IHByb3BlcnR5VmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5zZXRTb3VyY2VGb2xkZXIoIHNvdXJjZUZvbGRlciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KQ0FSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pDQVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQyOWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pDQVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkNBUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJyYXIiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSkNBUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaWNlbnNlSXRlbVByb3ZpZGVyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0luYm91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWVzc2FnZUFkYXB0ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FjdGl2YXRpb25TcGVjX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FkbWluT2JqZWN0X3R5cGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQ0FSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGYyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEpjYU1vZHVsZUV4dGVuc2lvbkltcGwgZXh0ZW5kcyBFYXJNb2R1bGVFeHRlbnNpb25JbXBsIGltcGxlbWVudHMgSmNhTW9kdWxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbiNjcmVhdGVQcm9qZWN0SW5mbygpCi0JICovCi0JLy8JcHVibGljIEoyRUVKYXZhUHJvamVjdEluZm8gY3JlYXRlUHJvamVjdEluZm8oKSB7Ci0JLy8JCXJldHVybiBuZXcgQ29ubmVjdG9yUHJvamVjdEluZm8oKTsKLQkvLwl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uSmNhTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZUltcG9ydE9wZXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLlJBUkZpbGUpCi0JICovCi0JLy8JcHVibGljIEoyRUVJbXBvcnRPcGVyYXRpb24gY3JlYXRlSW1wb3J0T3BlcmF0aW9uKElQcm9qZWN0IHByb2osIFJBUkZpbGUgcmFyRmlsZSl7Ci0JLy8JCXJldHVybiBuZXcgUkFSSW1wb3J0T3BlcmF0aW9uKHByb2osIHJhckZpbGUpOwotCS8vCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZVByb2plY3REYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZVByb2plY3REYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlSW1wb3J0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBjcmVhdGVJbXBvcnREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OTcwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhpcyBpcyBhIHRvcC1sZXZlbCBjbGFzcyBvZiB0aGUgajJlZSBwbHVnaW4uCi0gKiAKLSAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBVSSBwbHVnaW5zCi0gKi8KLQotcHVibGljIGNsYXNzIEpjYVBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiBpbXBsZW1lbnRzIFJlc291cmNlTG9jYXRvciB7Ci0JLy8gRGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKLQlwcml2YXRlIHN0YXRpYyBKY2FQbHVnaW4gaW5zdDsKLQlwcm90ZWN0ZWQgZmluYWwgSVBhdGggaWNvbnNGb2xkZXIgPSBuZXcgUGF0aChQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKS5nZXRFbnRyeSgiaWNvbnMiKS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIjsgLy8kTk9OLU5MUy0xJAotCS8vIFZhbGlkYXRpb24gcGFydCBvZiB0aGUgcGx1Z2luCi0JLy9HbG9iYWwgUmVzb3VyY2VTZXQgKHNvbWV3aGF0IGdsb2JhbCkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSUNPTl9ESVJTID0gbmV3IFN0cmluZ1tdeyJpY29ucy9mdWxsL29iajE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N2aWV3MTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jbGNsMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvb3ZyMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvd2l6YmFuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSjJFRSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIEpjYVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSmNhUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlyZXR1cm4gZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRJbWFnZVVSTChrZXksIGdldEJ1bmRsZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmNhUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGxvY2F0aW9uLSB0aGUgZGlyZWN0b3J5IHRoYXQgYWxsIHRoZSBwbHVnaW5zIGFyZSBsb2NhdGVkIGluIChpLmUuCi0JICogZDpcaW5zdGFsbGRpclxwbHVnaW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbihTdHJpbmcgcGx1Z2luSWQpIHsKLS8vCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlQYXRoIGluc3RhbGxQYXRoID0gbmV3IFBhdGgoYnVuZGxlLmdldEVudHJ5KCIvIikudG9FeHRlcm5hbEZvcm0oKSkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBpbnN0YWxsU3RyID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGluc3RhbGxQYXRoLnRvU3RyaW5nKCkpKS5nZXRGaWxlKCk7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKGluc3RhbGxTdHIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRCdW5kbGUoKSwga2V5KTsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbiNnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUNvbm5lY3RvclJlc291cmNlRmFjdG9yeS5yZWdpc3RlcihXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JfQkKLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1MmIxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdhcyBub3QgaW50ZW5kZWQgdG8gYmUgcHVibGljIEFQSS4gIFBsZWFzZSB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0LklDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzfSAKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgewotCXB1YmxpYyBDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjYjFlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuV3RwVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JGYWNldEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzEwCQk9ICJyYXJ0cDEwLnhtbCI7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xNQkJPSAicmFydHAxNS54bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotCi0JCQlmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJCS8vIEFkZCBXVFAgbmF0dXJlcy4KLQotCQkJV3RwVXRpbHMuYWRkTmF0dXJlcyhwcm9qZWN0KTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotCi0JCQlmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJZmluYWwgSVBhdGggcGpwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCi0JCQkvLyBTZXR1cCB0aGUgZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmUuCi0KLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBmYWxzZSk7Ci0KLQkJCWMuY3JlYXRlKDAsIG51bGwpOwotCQkJc2V0T3V0cHV0Rm9sZGVyKG1vZGVsLCBjKTsKLQotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBudWxsOwotCQkJU3RyaW5nIGNvbmZpZ0ZvbGRlciA9IG51bGw7Ci0JCQljb25maWdGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7Ci0JCQlyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgY29uZmlnRm9sZGVyKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBjb25maWdGb2xkZXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQkJSVBhdGggY29uZmlnRm9sZGVycGF0aCA9IHBqcGF0aC5hcHBlbmQoY29uZmlnRm9sZGVyTmFtZSk7Ci0JCQlzb3VyY2VGb2xkZXIgPSB3cy5nZXRSb290KCkuZ2V0Rm9sZGVyKGNvbmZpZ0ZvbGRlcnBhdGgpOwotCi0JCQlpZiAoIXNvdXJjZUZvbGRlci5nZXRGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgdmVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUik7Ci0JCQkJaW50IG5WZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXIpOwotCQkJCQotCQkJCUlGaWxlIGFGaWxlID0gc291cmNlRm9sZGVyLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKSk7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oYUZpbGUpOwotCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IG5WZXIgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRAotCQkJCQkJPyBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzEwCi0JCQkJCQk6IENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTU7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGUpOwotCQkJCWlmIChpbiAhPSBudWxsICYgb3V0ICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGlvZSk7Ci0JCQkJCX0gZmluYWxseXsKLQkJCQkJCXRyeXsKLQkJCQkJCQlpZihudWxsICE9IG91dCl7Ci0JCQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQkJCX0gaWYobnVsbCAhPSBpbil7Ci0JCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaW9lKTsKLQkJCQkJCX0gCi0JCQkJCX0KLQkJCQkJCi0JCQkJCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCXRyeXsKLQkJCQkJCWlmKCBlZGl0ICE9IG51bGwgKXsKLQkJCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gZWRpdC5nZXRDb25uZWN0b3IoKTsKLQkJCQkJCQljb25uZWN0b3Iuc2V0RGlzcGxheU5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJfQotCQkJCQl9ZmluYWxseXsKLQkJCQkJCWlmKCBlZGl0ICE9IG51bGwgKXsKLQkJCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vd2l0aG91dCBhIHRlbXBsYXRlCi0JCQkJCUNvbm5lY3RvckFydGlmYWN0RWRpdC5jcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBuVmVyKTsKLQkJCQl9IC8vIGlmCQkJCQotCQkJfQotCQkJCi0JCQkvLyBhZGQgc291cmNlIGZvbGRlciBtYXBzCi0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFtpXTsKLQkJCQlpZiAoY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCXJvb3QuY3JlYXRlTGluayhjcGUuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIDAsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVZpcnR1YWxGaWxlIHZmID0gYy5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQkJSUZpbGUgbWFuaWZlc3RtZiA9IHZmLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQlpZiAobWFuaWZlc3RtZiA9PSBudWxsIHx8ICFtYW5pZmVzdG1mLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY3JlYXRlTWFuaWZlc3QocHJvamVjdCwgYy5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gU2V0dXAgdGhlIGNsYXNzcGF0aC4KLQkJCUNsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KTsKLQotCQkJaWYgKCFDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmdikpIHsKLQkJCQkvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0JCQkJLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotCQkJfQotCi0JCQlpZihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0RGVmYXVsdFVzZUVBUkxpYnJhcmllcygpKXsKLQkJCQlmaW5hbCBJUGF0aCBlYXJMaWJDb250YWluZXIgPSBuZXcgUGF0aChKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLkNPTlRBSU5FUl9JRCk7Ci0JCQkJYWRkVG9DbGFzc3BhdGgoanByb2osIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVhckxpYkNvbnRhaW5lcikpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCSgoSURhdGFNb2RlbE9wZXJhdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OKSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTQxZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUgZXh0ZW5kcyBKMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xMAkJPSAicmFydHAxMC54bWwiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTUJCT0gInJhcnRwMTUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKLQotCQkJLy8gQXNzb2NpYXRlIHdpdGggYW4gRUFSLCBpZiBuZWNlc3NhcnkuCi0KLQkJCWZpbmFsIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIpKSB7Ci0JCQkJaWYgKGVhclByb2plY3ROYW1lICE9IG51bGwgJiYgIWVhclByb2plY3ROYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCVN0cmluZyB2ZXIgPSBmdi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBqMmVlVmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZwotCQkJCQkoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcikpOwotCQkJCQkKLQkJCQkJZmluYWwgU3RyaW5nIG1vZHVsZVVSSSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YwotICAgICAgICAgICAgICAgICAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIG1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0JCQkJCQotCQkJCQlpbnN0YWxsQW5kQWRkTW9kdWxldG9FQVIoIGoyZWVWZXJzaW9uVGV4dCwKLQkJCQkJCQkJZWFyUHJvamVjdE5hbWUsCi0JCQkJCQkJCWZwandjLmdldFByaW1hcnlSdW50aW1lKCksCi0JCQkJCQkJCXByb2plY3QsCi0JCQkJCQkJCW1vZHVsZVVSSSwKLQkJCQkJCQkJbW9uaXRvciApOwotCi0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ5ZDVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0gICAgICAgIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuSkNBX0ZBQ0VUKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQkJCi0JCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKLQkJSURhdGFNb2RlbCBqYXZhRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVC5nZXRJZCgpKTsKLQkJSURhdGFNb2RlbCBqY2FGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQV9GQUNFVC5nZXRJZCgpKTsKLQkJU3RyaW5nIGpjYVJvb3QgPSBqY2FGYWNldC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIGpjYVJvb3QpOwotCQkvLyBJZiB1c2luZyBvcHRpbWl6ZWQgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBzZXQgdGhlIG91dHB1dCBmb2xkZXIgdG8gdGhlIGNvbnRlbnQgZm9sZGVyCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCi0JCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCBqY2FSb290KTsKLQkJamNhRmFjZXQuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWlmIChpc1Byb3BlcnR5U2V0KEVBUl9QUk9KRUNUX05BTUUpKQotCQkJCQkJc2V0UHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCX1lbHNlIGlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCXNldFByb3BlcnR5KEFERF9UT19FQVIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBNT0RVTEVfVVJJICkpewotCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQkJSURhdGFNb2RlbCByYXJGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSUoyRUVGYWNldENvbnN0YW50cy5KQ0EgKTsJCi0JCQlyYXJGYWNldC5zZXRQcm9wZXJ0eSggSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksIHByb3BlcnR5VmFsdWUgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0lDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwMTQwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gZXh0ZW5kcyBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxMC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNWJjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI+Ci08Y29ubmVjdG9yPgotCTxkaXNwbGF5LW5hbWU+PC9kaXNwbGF5LW5hbWU+Ci0JPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCTx2ZW5kb3ItbmFtZT48L3ZlbmRvci1uYW1lPgotICAJPHNwZWMtdmVyc2lvbj48L3NwZWMtdmVyc2lvbj4KLSAgCTxlaXMtdHlwZT48L2Vpcy10eXBlPgotICAJPHZlcnNpb24+PC92ZXJzaW9uPgotICAJPGxpY2Vuc2U+Ci0gIAkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+ICAgCi0gICAgCTxsaWNlbnNlLXJlcXVpcmVkPmZhbHNlPC9saWNlbnNlLXJlcXVpcmVkPiAgIAotICAgIDwvbGljZW5zZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJPHJlc291cmNlYWRhcHRlcj4KLSAgCQk8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPjwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAJCTxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+PC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgCTxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPjwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAJPGNvbm5lY3Rpb24taW50ZXJmYWNlPjwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgCTxjb25uZWN0aW9uLWltcGwtY2xhc3M+PC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgCTx0cmFuc2FjdGlvbi1zdXBwb3J0PjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgCQk8Y29uZmlnLXByb3BlcnR5PgotICAgICAJCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgICAgCQk8Y29uZmlnLXByb3BlcnR5LW5hbWU+PC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgIAkJPGNvbmZpZy1wcm9wZXJ0eS10eXBlPjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAJCTxjb25maWctcHJvcGVydHktdmFsdWU+PC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgCSA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAJPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgIAkgCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgICAgCSAJPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPjwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgIAkgCTxjcmVkZW50aWFsLWludGVyZmFjZT48L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgIAk8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAJPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD5mYWxzZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgIAk8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAJCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgIAkJPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgIAkJPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgCTwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgCTwvcmVzb3VyY2VhZGFwdGVyPgotPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxNS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTU2MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb25uZWN0b3IgaWQ9IkNvbm5lY3Rvcl9JRCIgdmVyc2lvbj0iMS41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiPiAKLQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQk8ZGlzcGxheS1uYW1lPjwvZGlzcGxheS1uYW1lPgotIAk8dmVuZG9yLW5hbWU+PC92ZW5kb3ItbmFtZT4KLSAgCTxlaXMtdHlwZT48L2Vpcy10eXBlPgotICAJPHJlc291cmNlYWRhcHRlci12ZXJzaW9uPjwvcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJPHJlc291cmNlYWRhcHRlcj4KLSAgCTwvcmVzb3VyY2VhZGFwdGVyPgotPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmYzZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4cG9ydCgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgRVhQT1JUX1dPUkspOwotCQl0cnkgewotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY2FmID0gKChDb21tb25hcmNoaXZlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCQlDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxzID0gbmV3IENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoZ2V0Q29tcG9uZW50KCkpOwotCQkJbHMuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwotCQkJc2V0TW9kdWxlRmlsZShjYWYub3BlblJBUkZpbGUobHMsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotCQkJbHMuc2V0UHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IpOwotCQkJZ2V0TW9kdWxlRmlsZSgpLnNhdmVBc05vUmVvcGVuKGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlU3RyaW5nKCkgewotCQkvL1RPRE8gZmlsbCBpbiBzdHJpbmcKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjIzN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbXBvbmVudExvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCXByaXZhdGUgaW50IGRvdEphdmFMZW5ndGggPSBBcmNoaXZlVXRpbC5ET1RfSkFWQS5sZW5ndGgoKTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeUluZGV4ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBNYXAgY2xhc3Nlc01hcDsKLQlwcml2YXRlIElGaWxlIGtub3duREQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGtub3duTGliRXh0ZW5zaW9ucyA9IHsiLmphciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnppcCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnNvIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIubyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnNsIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIuZGxsIiwgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXRoaXModkNvbXBvbmVudCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwkJCi0JCWtub3duREQgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaWxlcygpIHsKLQkJYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpOwotCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOwotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VSb290cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnModkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlOwotCQkJdHJ5IHsKLQkJCQlhRmlsZSA9IGdldE5lc3RlZEphcihzb3VyY2VSb290c1tpXSk7Ci0JCQkJaWYgKG51bGwgIT0gYUZpbGUpIHsKLQkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShhRmlsZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCi0JcHJpdmF0ZSBGaWxlIGdldE5lc3RlZEphcihJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggb3V0cHV0UGF0aCA9IHNvdXJjZVJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0UGF0aCA9PSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIob3V0cHV0UGF0aCk7Ci0JCWluZGV4Q2xhc3Nlc0Zvck91dHB1dEZvbGRlcihqYXZhT3V0cHV0Rm9sZGVyKTsKLQkJSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSAoSUNvbnRhaW5lcikgc291cmNlUm9vdC5nZXRSZXNvdXJjZSgpOwotCi0JCWludCBzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQgPSBzb3VyY2VDb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCQlib29sZWFuIGlzTW9kdWxlUm9vdCA9IGtub3duREQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChzb3VyY2VDb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlTZXQgaUZpbGVzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJYm9vbGVhbiBmb3VuZEphdmEgPSBnYXRoZXJGaWxlc0ZvckpBUihpRmlsZXNTZXQsIHNvdXJjZUNvbnRhaW5lciwgaXNNb2R1bGVSb290LCBmYWxzZSwgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KTsKLQkJaWYgKCFpc01vZHVsZVJvb3QgfHwgZm91bmRKYXZhKSB7Ci0JCQlMaXN0IGlGaWxlc0xpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGlGaWxlc1NldCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpRmlsZXNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJZmlsZXNIb2xkZXIucmVtb3ZlSUZpbGUoKElGaWxlKSBpRmlsZXNMaXN0LmdldChpKSk7Ci0JCQl9Ci0JCQlGaWxlIG5lc3RlZEFyY2hpdmUgPSBjcmVhdGVOZXN0ZWRBcmNoaXZlKGlGaWxlc0xpc3QsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2F0aGVyRmlsZXNGb3JKQVIoQ29sbGVjdGlvbiBpRmlsZXMsIElDb250YWluZXIgY3VycmVudCwgYm9vbGVhbiBpc01vZHVsZVJvb3QsIGJvb2xlYW4gZm91bmRKYXZhLCBpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCXRyeSB7Ci0JCQltZW1iZXJzID0gY3VycmVudC5tZW1iZXJzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGNvcmUpOwotCQl9Ci0JCQotCQlJQ29udGFpbmVyIGRkRm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07Ci0JCQlpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJaWYgKCFkZEZvbGRlci5lcXVhbHMocmVzKSkgey8vaWYgaXQncyBub3QgdGhlIGRkIGZvbGRlcgotCQkJCQlmb3VuZEphdmEgPSBnYXRoZXJGaWxlc0ZvckpBUihpRmlsZXMsIChJRm9sZGVyKSByZXMsIGlzTW9kdWxlUm9vdCwgZm91bmRKYXZhLCBzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQpIHx8IGZvdW5kSmF2YTsKLQkJCQl9Ci0JCQl9IGVsc2Ugey8vIGl0IG11c3QgYmUgYSBmaWxlCi0JCQkJSUZpbGUgc3JjRmlsZSA9IChJRmlsZSkgcmVzOwotCQkJCWlmIChiZWxvbmdzSW5OZXN0ZWRKQVIoc3JjRmlsZSwgaXNNb2R1bGVSb290KSkgewotCQkJCQlpZiAoaXNKYXZhKHNyY0ZpbGUpKSB7Ci0JCQkJCQlpZiAoZXhwb3J0U291cmNlKSB7Ci0JCQkJCQkJaUZpbGVzLmFkZChzcmNGaWxlKTsgLy9kb24ndCBuZWVkIHRvIGNoZWNrIGR1cGxpY2F0ZXMgaGVyZQotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyY0ZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KS50b1N0cmluZygpOwotCQkJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGVuZ3RoKCkgLSBkb3RKYXZhTGVuZ3RoKTsKLQkJCQkJCUxpc3QgY2xhc3NlcyA9IHJldHJpZXZlQ2xhc3NlcyhjbGFzc05hbWUpOwotCQkJCQkJaWYgKG51bGwgIT0gY2xhc3NlcykgewotCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3Nlcy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJSUZpbGUgY2xhenogPSAoSUZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoIWlGaWxlcy5jb250YWlucyhjbGF6eikpewotCQkJCQkJCQkJLy8uY2xhc3MgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQkJCQlpRmlsZXMuYWRkKGNsYXp6KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZighaUZpbGVzLmNvbnRhaW5zKHNyY0ZpbGUpKXsKLQkJCQkJCQkvL2lmIGl0J3Mgbm90IHNyYywgdGhlbiBpdCBjb3VsZCBiZSAuY2xhc3MgYW5kIG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJCWlGaWxlcy5hZGQoc3JjRmlsZSk7Ci0JCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaXNNb2R1bGVSb290KQotCQkJCQkJZm91bmRKYXZhID0gZm91bmRKYXZhIHx8IGlzSmF2YShzcmNGaWxlKSB8fCBpc0NsYXNzKHNyY0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRKYXZhOwotCX0KLQotCXByaXZhdGUgRmlsZSBjcmVhdGVOZXN0ZWRBcmNoaXZlKExpc3QgZmlsZXMsIElDb250YWluZXIgc291cmNlQ29udGFpbmVyLCBJRm9sZGVyIGphdmFPdXRwdXRGb2xkZXIpIHsKLQkJQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbCBsb2FkZXIgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbChmaWxlcywgc291cmNlQ29udGFpbmVyLCBqYXZhT3V0cHV0Rm9sZGVyKTsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9ICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKS5jbG9uZVdpdGgobG9hZGVyKTsKLQkJU3RyaW5nIHVyaSA9IGNvbXB1dGVVbmlxdWVBcmNoaXZlVVJJKHNvdXJjZUNvbnRhaW5lcik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlVW5pcXVlQXJjaGl2ZVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IGluY3JlbWVudCA9IDA7Ci0JCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBudWxsOwotCQlkbyB7Ci0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSArIDUpOwotCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQlzYi5hcHBlbmQobmFtZSk7Ci0JCQlpZiAoaW5jcmVtZW50ID4gMCkKLQkJCQlzYi5hcHBlbmQoaW5jcmVtZW50KTsKLQkJCXNiLmFwcGVuZCgiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQlpbmNyZW1lbnQrKzsKLQkJfSB3aGlsZSAoZmlsZXNIb2xkZXIuY29udGFpbnMoc2IudG9TdHJpbmcoKSkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmVsb25nc0luTmVzdGVkSkFSKElGaWxlIGlGaWxlLCBib29sZWFuIGlzTW9kdWxlUm9vdCkgewotCQlpZiAoaXNNb2R1bGVSb290ICYmIGlzRGVwbG95bWVudERlc2NyaXB0b3IoaUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bkxpYkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChoYXNFeHRlbnNpb24oaUZpbGUsIGtub3duTGliRXh0ZW5zaW9uc1tpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlpZihhcnRpZmFjdEVkaXQgPT0gbnVsbCl7Ci0JCQlhcnRpZmFjdEVkaXQgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGUoSVZpcnR1YWxDb250YWluZXIgdkNvbnRhaW5lcikgewotCQlib29sZWFuIGlzRERGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoSjJFRUNvbnN0YW50cy5NRVRBX0lORikuZXF1YWxzKHZDb250YWluZXIpOwotCQlyZXR1cm4gaXNEREZvbGRlciB8fCAhaW5KYXZhU3JjKHZDb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfQ0xBU1MpICYmICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgdGhlIC5jbGFzcyBmaWxlcyBhbmQgaW5kZXggdGhlbSBzbyBpbm5lciBjbGFzc2VzIGNhbiBiZSBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCWlmIChudWxsID09IGphdmFPdXRwdXRGb2xkZXIgfHwgYWxyZWFkeUluZGV4ZWQuY29udGFpbnMoamF2YU91dHB1dEZvbGRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhbHJlYWR5SW5kZXhlZC5hZGQoamF2YU91dHB1dEZvbGRlcik7Ci0JCWludCBzZWdtZW50Q291bnQgPSBqYXZhT3V0cHV0Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJaW5kZXhDbGFzc2VzKGphdmFPdXRwdXRGb2xkZXIsIHNlZ21lbnRDb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3NlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQlpbmRleENsYXNzKChJRmlsZSkgcmVzb3VyY2UsIGphdmFPdXRwdXRTZWdtZW50Q291bnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJRm9sZGVyKSByZXNvdXJjZSkubWVtYmVycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWluZGV4Q2xhc3NlcyhtZW1iZXJzW2ldLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3MoSUZpbGUgaUZpbGUsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCWlmICghaXNDbGFzcyhpRmlsZSkpCi0JCQlyZXR1cm47Ci0JCWlmIChjbGFzc2VzTWFwID09IG51bGwpCi0JCQljbGFzc2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCUlQYXRoIHJlbFBhdGggPSBpRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJU3RyaW5nIGtleSA9IHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJaWYgKG5hbWUuaW5kZXhPZignJCcpICE9IC0xKSB7Ci0JCQlrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCckJykpOwotCQl9IGVsc2UgewotCQkJa2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignLicpKTsKLQkJfQotCQlMaXN0IGlubmVycyA9IChMaXN0KSBjbGFzc2VzTWFwLmdldChrZXkpOwotCQlpZiAoaW5uZXJzID09IG51bGwpIHsKLQkJCWlubmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljbGFzc2VzTWFwLnB1dChrZXksIGlubmVycyk7Ci0JCX0KLQkJaW5uZXJzLmFkZChpRmlsZSk7Ci0JfQotCi0JcHVibGljIExpc3QgcmV0cmlldmVDbGFzc2VzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGNsYXNzZXNNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKExpc3QpIGNsYXNzZXNNYXAuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YShJRmlsZSBpRmlsZSkgewotCQlyZXR1cm4gaGFzRXh0ZW5zaW9uKGlGaWxlLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3MoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihpRmlsZSwgQXJjaGl2ZVV0aWwuRE9UX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0V4dGVuc2lvbihJRmlsZSBpRmlsZSwgU3RyaW5nIGV4dCkgewotCQlTdHJpbmcgbmFtZSA9IGlGaWxlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihuYW1lLCBleHQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0KSB7Ci0JCWludCBvZmZzZXQgPSBleHQubGVuZ3RoKCk7Ci0JCXJldHVybiBuYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgbmFtZS5sZW5ndGgoKSAtIG9mZnNldCwgZXh0LCAwLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yKElGaWxlIGlGaWxlKSB7Ci0JCXJldHVybiBrbm93bkRELmVxdWFscyhpRmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDQ1MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3lJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgTG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQlwcml2YXRlIExpc3QgZmlsZXM7Ci0JcHJpdmF0ZSBpbnQgc291cmNlU2VnbWVudENvdW50OwotCXByaXZhdGUgaW50IG91dHB1dFNlZ21lbnRDb3VudDsKLQlwcml2YXRlIE1hcCB1cmlzVG9JRmlsZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbChMaXN0IGZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmlsZXMgPSBmaWxlczsKLQkJc291cmNlU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJb3V0cHV0U2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbCNwcmltQ29udGFpbnMoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCS8vIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgZGlzY3JpbWluYXRvcnMsIGFuZCB3ZSBkb24ndCBkaXNjcmltaW5hdGUgdGhlc2UgYXJjaGl2ZXMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbCNnZXRGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCXVyaXNUb0lGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWxlIGlGaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlJUGF0aCByZWxQYXRoOwotCQkJaWYoQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5pc0NsYXNzKGlGaWxlKSl7Ci0JCQkJcmVsUGF0aCA9IGdldFJlbGF0aXZlUGF0aChpRmlsZSwgb3V0cHV0U2VnbWVudENvdW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVsUGF0aCA9IGdldFJlbGF0aXZlUGF0aChpRmlsZSwgc291cmNlU2VnbWVudENvdW50KTsKLQkJCX0KLQkJCWFkZEZpbGUoaUZpbGUsIHJlbFBhdGgsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKElGaWxlIGlGaWxlLCBJUGF0aCByZWxQYXRoLCBMaXN0IHJlc3VsdCkgewotCQlGaWxlIGNGaWxlID0gY3JlYXRlRmlsZShpRmlsZSwgcmVsUGF0aCk7Ci0JCXJlc3VsdC5hZGQoY0ZpbGUpOwotCQl1cmlzVG9JRmlsZXMucHV0KGNGaWxlLmdldFVSSSgpLCBpRmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKElSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGFSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCXByaXZhdGUgRmlsZSBjcmVhdGVGaWxlKElGaWxlIGlGaWxlLCBJUGF0aCByZWxQYXRoKSB7Ci0JCUZpbGUgY0ZpbGUgPSBjcmVhdGVGaWxlKHJlbFBhdGgudG9TdHJpbmcoKSk7Ci0JCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQoaUZpbGUpKTsKLQkJcmV0dXJuIGNGaWxlOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0UmVsYXRpdmVQYXRoKElGaWxlIGZpbGUsIGludCBwYXJlbnRTZWdtZW50Q291bnQpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMocGFyZW50U2VnbWVudENvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5I2dldElucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAobnVsbCA9PSB1cmlzVG9JRmlsZXMpIHsKLQkJCWdldEZpbGVzKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgdXJpc1RvSUZpbGVzLmdldCh1cmkpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24odXJpLCBjb3JlKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWN0aXZhdGlvblNwZWNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NThkNDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBY3RpdmF0aW9uU3BlY0NsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3RpdmF0aW9uIFNwZWMgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZhdGlvblNwZWNDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWN0aXZhdGlvblNwZWNfYWN0aXZhdGlvblNwZWNDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3RpdmF0aW9uU3BlY19hY3RpdmF0aW9uU3BlY0NsYXNzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2YXRpb25TcGVjX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZhdGlvblNwZWMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBY3RpdmF0aW9uU3BlYykgb2JqZWN0KS5nZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX0FjdGl2YXRpb25TcGVjX3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BY3RpdmF0aW9uU3BlY190eXBlICsgIiAiICsgbGFiZWw7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2YXRpb25TcGVjLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BZG1pbk9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIwY2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BZG1pbk9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFkbWluT2JqZWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRtaW5PYmplY3RDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQWRtaW5PYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkbWluT2JqZWN0Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RDbGFzc19mZWF0dXJlIiwgIl9VSV9BZG1pbk9iamVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBZG1pbk9iamVjdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FkbWluT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFkbWluT2JqZWN0KSBvYmplY3QpLmdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX0FkbWluT2JqZWN0X3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BZG1pbk9iamVjdF90eXBlICsgIiAiICsgbGFiZWw7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFkbWluT2JqZWN0LmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg2MzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBmb3IgY29ubmVjdG9yIHByb2VqY3RzLgotICovCi1wdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gQWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXV0aGVudGljYXRpb25NZWNoYW5pc21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3JlZGVudGlhbEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3VzdG9tQXV0aE1lY2hUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENyZWRlbnRpYWwgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENyZWRlbnRpYWxJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2NyZWRlbnRpYWxJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fY3JlZGVudGlhbEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1c3RvbSBBdXRoIE1lY2ggVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21BdXRoTWVjaFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2N1c3RvbUF1dGhNZWNoVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9jdXN0b21BdXRoTWVjaFR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc20gZl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9ICgoQXV0aGVudGljYXRpb25NZWNoYW5pc20pb2JqZWN0KTsKLQkgKiBKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJBdXRoZW50aWNhdGlvbgotCSAqIE1lY2hhbmlzbSBUeXBlIiwgIlRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdHlwZSBwcm9wZXJ0eSBvZiB0aGUgYXV0aGVudGljYXRpb24KLQkgKiBtZWNoYW5pc20iLCBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjcmVkZW50aWFsSW50ZXJmYWNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ3JlZGVudGlhbCBJbnRlcmZhY2UiLAotCSAqICJUaGUgY3JlZGVudGlhbCBpbnRlcmZhY2UgcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYgcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9hdXRoX21lY2hhbmlzbV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc20gYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBvYmplY3QpOwotCQlyZXR1cm4gIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtICIgKyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5nZXREZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2NhZDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIENvbmZpZyBwcm9wZXJ0eSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEFkYXB0IGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfbmFtZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlX2ZlYXR1cmUiLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIENvbmZpZ1Byb3BlcnR5IGZfY29uZmlnUHJvcGVydHkgPSAoKENvbmZpZ1Byb3BlcnR5KW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0KLQkgKiBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkgKiAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIG5hbWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJOYW1lIiwgIlRoZSBuYW1lCi0JICogcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB0eXBlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVHlwZSIsICJUaGUgdHlwZQotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdmFsdWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJWYWx1ZSIsICJUaGUgdmFsdWUKLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQ29uZmlnUHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uZmlnUHJvcGVydHkuZ2lmLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9jb25maWdfcHJvcF9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRleHQgYmFzZSBvbiB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbmZpZ1Byb3BlcnR5IGNvbmZpZ1Byb3BlcnR5ID0gKChDb25maWdQcm9wZXJ0eSkgb2JqZWN0KTsKLQkJaWYgKGNvbmZpZ1Byb3BlcnR5LmdldE5hbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wOyAKLQkJcmV0dXJuICJDb25maWdQcm9wZXJ0eTogIiArIGNvbmZpZ1Byb3BlcnR5LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29uZmlnUHJvcGVydHkuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpIHsKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDMxZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkRlZmluaXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uSW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbXBsIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkltcGxDbGFzc19mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25uZWN0aW9uRGVmaW5pdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25uZWN0aW9uRGVmaW5pdGlvbikgb2JqZWN0KS5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZmlnUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjgwZjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgQ29uZW5jdG9yIHByb2plY3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gQW4gYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBDb25uZWN0b3JJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmVuZG9yTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3BlY1ZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVpc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlbmRvciBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlbmRvck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rvcl92ZW5kb3JOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rvcl92ZW5kb3JOYW1lX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTcGVjIFZlcnNpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY1ZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rvcl9zcGVjVmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3Jfc3BlY1ZlcnNpb25fZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFaXMgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFaXNUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfZWlzVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfZWlzVHlwZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfRWlzVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVyc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgY3VycmVudCBwcm9wZXJ0eQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JICogCi0JICogaWYoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeyBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogQ29ubmVjdG9yIGZfY29ubmVjdG9yID0gKChDb25uZWN0b3Ipb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMKLQkgKiBpcyBmb3IgdGhlIGRpc3BsYXlOYW1lIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRpc3BsYXkgTmFtZSIsICJUaGUKLQkgKiBkaXNwbGF5IG5hbWUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRGlzcGxheU5hbWUoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHNtYWxsSWNvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlNtYWxsIEljb24iLCAiVGhlCi0JICogc21hbGwgaWNvbiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9TbWFsbEljb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGxhcmdlSWNvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkxhcmdlIEljb24iLCAiVGhlCi0JICogbGFyZ2UgaWNvbiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9MYXJnZUljb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHZlbmRvck5hbWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJWZW5kb3IgTmFtZSIsICJUaGUKLQkgKiB2ZW5kb3IgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzcGVjVmVyc2lvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlNwZWMgVmVyc2lvbiIsICJUaGUKLQkgKiBzcGVjIHZlcnNpb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGVpc1R5cGUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJFaXMgVHlwZSIsICJUaGUgZWlzCi0JICogdHlwZSBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9FaXNUeXBlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB2ZXJzaW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmVyc2lvbiIsICJUaGUgdmVyc2lvbgotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGxpY2Vuc2UgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJMaWNlbnNlIiwgIlRoZSBsaWNlbnNlCi0JICogb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfTGljZW5zZSgpLCBmYWxzZSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgcmVzb3VyY2VBZGFwdGVyCi0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVzb3VyY2UgQWRhcHRlciIsCi0JICogIlRoZSByZXNvdXJjZSBhZGFwdGVyIG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpLCBmYWxzZSkpOyB9Ci0JICogcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gT2JqZWN0IHRvIGdldCBjaGlsZHJlbiByZWZlcmVuY2VzIG9mLgotCSAqIEByZXR1cm4gQ29sZWxjdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9MaWNlbnNlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkpOwotCQl9Ly8gaWYKLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ly8gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBDb25uZWN0b3IuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gT2JqZWN0IHRvIHJldHVybiB0aGUgcGFyZW50IG9mLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29ubmVjdG9yLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0IC0KLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBpbWFnZSBmb3IuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9ICgoQ29ubmVjdG9yKSBvYmplY3QpOwotCQlyZXR1cm4gIkNvbm5lY3RvciAiICsgY29ubmVjdG9yLmdldERpc3BsYXlOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbm5lY3Rvci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRVJTSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfTGljZW5zZSgpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaWNlbnNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlQWRhcHRlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi19Ly8gQ29uZW5jdG9ySXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMzEwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJ9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU7IAotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FFZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODdjYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FGYWN0b3J5SW1wbDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgamNhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEpjYUVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpjYUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgamNhIHBhY2thZ2UuCi0JICovCi0JcHJvdGVjdGVkIEpjYVBhY2thZ2UgamNhUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEpjYUVkaXRQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQotCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkvLwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBKY2FQYWNrYWdlIGdldEpjYVBhY2thZ2UoKSB7Ci0JCXJldHVybiBqY2FQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBKY2FGYWN0b3J5IGdldEpjYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmNhRmFjdG9yeSkgamNhUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRG8gaW5pdGlhbGl6YXRpb24gc3R1ZmYgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5zdGFydHVwKCk7Ci0JCWpjYVBhY2thZ2UgPSBKY2FGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIGxvYWQgaW1hZ2UgZm9yICciICsga2V5ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIGFuIG9iamVjdCBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtde3MxfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHR3byBvYmplY3Qgc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIHdpdGggdGhyZWUgb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIsIE9iamVjdCBzMykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczIsIHMzfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDA2N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBleHRlbmRlZCBpdGVtIHByb3ZpZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoZSBjb21tYW5kcyBhcmUgaW1wbGVtZW50ZWQgdW5pZm9ybWx5IG9uIGFsbCBvdXIgaXRlbSBhZGFwdGVycyB1c2luZyB0aGlzIGNvbW1vbiBiYXNlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgewotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcGFja2FnZSBmb3IgdGhlIGpjYSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpjYVBhY2thZ2UgamNhUGFja2FnZSA9IChKY2FQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZmFjdG9yeSBmb3IgdGhlIGpjYSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpjYUZhY3RvcnkgamNhRmFjdG9yeSA9IGpjYVBhY2thZ2UuZ2V0SmNhRmFjdG9yeSgpOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYW4gYWRhcHRlciBmYWN0b3J5IGFuZCBhIGRvbWFpbiBub3RpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgSmNhSXRlbVByb3ZpZGVyQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyB0aGUgc3VwcG9ydGVkIGNvbW1hbmRzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEBwYXJhbSBFZGl0aW5nRG9tYWluIC0KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGVkaXRpbmcgZG9tYWluLgotCSAqIEBwYXJhbSBjb21tYW5kQ2xhc3MgLQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29tbWFuZCBjbGFzcy4KLQkgKiBAcGFyYW0gY29tbWFuZFBhcmFtZXRlciAtCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb21tYW5kUGFyYW1ldGVyLgotCSAqIEByZXR1cm4gQ29tbWFuZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JfS8vIGNyZWF0ZUNvbW1hbmQKLQotfS8vIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODQ1MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWwuSmNhQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJ9cy4gVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYKLSAqIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMKLSAqIGFsc28gc3VwcG9ydCBwcm9wZXJ0eSBzaGVldHMsIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllc30uIE5vdGUgdGhhdCBtb3N0IG9mIHRoZQotICogYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEpjYUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBJQ2hhbmdlTm90aWZpZXIuCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IGlzRmFjdG9yeUZvclR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25uZWN0b3IgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JJdGVtUHJvdmlkZXIgY29ubmVjdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgQ29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCWlmIChjb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29ubmVjdG9ySXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGNvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIExpY2Vuc2UgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMaWNlbnNlSXRlbVByb3ZpZGVyIGxpY2Vuc2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBMaWNlbnNlLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCkgewotCQlpZiAobGljZW5zZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsaWNlbnNlSXRlbVByb3ZpZGVyID0gbmV3IExpY2Vuc2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBsaWNlbnNlSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVMaWNlbnNlQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlpZiAoaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuTWVzc2FnZUFkYXB0ZXJ9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9IG5ldyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFkbWluT2JqZWN0fQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlciBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7Ci0JCWlmIChhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9IG5ldyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VMaXN0ZW5lcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5BY3RpdmF0aW9uU3BlY30uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCkgewotCQlpZiAocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIFJlc291cmNlQWRhcHRlciBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciByZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBSZXNvdXJjZUFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKHJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgU2VjdXJpdHlQZXJtaXNzaW9uIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyIHNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIFNlY3VyaXR5UGVybWlzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXI7Ci0JfS8vIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBpbnN0YW5jZXMKLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgYXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25maWdQcm9wZXJ0eSBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyIGNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25maWdQcm9wZXJ0eX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAoY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBjb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfS8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfS8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgaXQgaXMgYSBmYWN0b3J5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0vLyBpc0ZhY3RvcnlGb3JUeXBlCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gVGhlIGdpdmVuIG5vdGlmZXIuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgdHlwZSAtIFRoZSBnaXZlbiB0eXBlCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBEb2VzIGFkYXB0aW5nLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIE9qZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCS8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZGVhbCB3aXRoIGVudW1lcmF0b3JzLCB3aGljaCBjcmFzaCB0aGUgZG9Td2l0Y2guCi0JCS8vCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfS8vIGlmCi0KLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ly8gaWYKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfS8vIHJlbW92ZUxpc3RlbmVyCi0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byBjaGFuZ2UgTm90aWZpZXIgYW5kIHRvIHBhcmVudCBBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBnaXZlbiB0eXBlIG9mIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5yZVZhbHVlIC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZXZlbnQuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfS8vIGlmCi0JfS8vIGZpcmVOb3RpZnlDaGFuZ2VkCi0KLX0vLyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9MaWNlbnNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTBmYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgTGljZW5zZSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaWNlbnNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gTGljZW5zZUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVxdWlyZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9MaWNlbnNlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpY2Vuc2VfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTGljZW5zZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcXVpcmVkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcXVpcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9MaWNlbnNlX3JlcXVpcmVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpY2Vuc2VfcmVxdWlyZWRfZmVhdHVyZSIsICJfVUlfTGljZW5zZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfUmVxdWlyZWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogTGljZW5zZSBmX2xpY2Vuc2UgPSAoKExpY2Vuc2Upb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yCi0JICogdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBsaWNlbnNlIiwgcGtnLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlcXVpcmVkIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVxdWlyZWQiLCAiVGhlCi0JICogcmVxdWlyZWQgcHJvcGVydHkgb2YgdGhlIGxpY2Vuc2UiLCBwa2cuZ2V0TGljZW5zZV9SZXF1aXJlZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZgotCSAqIAotCSAqIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgTGljZW5zZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBMaWNlbnNlLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9saWNlbnNlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldEltYWdlCi0KLQkvKioKLQkgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGdldCB0aGUgbmFtZSBmb3IuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlMaWNlbnNlIGxpY2Vuc2UgPSAoKExpY2Vuc2UpIG9iamVjdCk7Ci0JCWlmIChsaWNlbnNlLmdldERlc2NyaXB0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wOyAKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5MaWNlbnNlSXRlbVByb3ZpZGVyX1VJXzAgKyAiOiIgKyBsaWNlbnNlLmdldERlc2NyaXB0aW9uKCk7ICAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMaWNlbnNlLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRMaWNlbnNlX1JlcXVpcmVkKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIExpY2Vuc2VJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9NZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTM0NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1lc3NhZ2VBZGFwdGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGU7IAotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9NZXNzYWdlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWVzc2FnZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmMyOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VMaXN0ZW5lcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWVzc2FnZUxpc3RlbmVyVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWVzc2FnZSBMaXN0ZW5lciBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2VMaXN0ZW5lclR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01lc3NhZ2VMaXN0ZW5lcl9tZXNzYWdlTGlzdGVuZXJUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01lc3NhZ2VMaXN0ZW5lcl9tZXNzYWdlTGlzdGVuZXJUeXBlX2ZlYXR1cmUiLCAiX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXNzYWdlTGlzdGVuZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXNzYWdlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWVzc2FnZUxpc3RlbmVyKSBvYmplY3QpLmdldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IEpDQVJlc291cmNlSGFuZGxlci5fVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXNzYWdlTGlzdGVuZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2YXRpb25TcGVjKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9PdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjkzMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zYWN0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90cmFuc2FjdGlvblN1cHBvcnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBPdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLwkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpIG9iamVjdDsKLQotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlOyAKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZSIpIC8qKyAiICIgKwotCQkvLyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5pc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkqLzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmNlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfbmFtZV9mZWF0dXJlIiwgIl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTE1YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgUmVzb3VyY2VBZGFwdGVyIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBmYWN0b3J5Ci0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUcmFuc2FjdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlYXV0aGVudGljYXRpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXNvdXJjZUFkYXB0ZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbXBsIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX3RyYW5zYWN0aW9uU3VwcG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlYXV0aGVudGljYXRpb24gU3VwcG9ydCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlc291cmNlIEFkYXB0ZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VBZGFwdGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9yZXNvdXJjZUFkYXB0ZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfcmVzb3VyY2VBZGFwdGVyQ2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIFJlc291cmNlQWRhcHRlciBmX3Jlc291cmNlQWRhcHRlciA9ICgoUmVzb3VyY2VBZGFwdGVyKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0KLQkgKiBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIk1hbmFnZWQgQ29ubmVjdGlvbgotCSAqIEZhY3RvcnkgQ2xhc3MiLCAiVGhlIG1hbmFnZWQgY29ubmVjdGlvbiBmYWN0b3J5IGNsYXNzIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZQotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gRmFjdG9yeQotCSAqIEludGVyZmFjZSIsICJUaGUgY29ubmVjdGlvbiBmYWN0b3J5IGludGVyZmFjZSBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEZhY3RvcnkKLQkgKiBJbXBsIENsYXNzIiwgIlRoZSBjb25uZWN0aW9uIGZhY3RvcnkgaW1wbCBjbGFzcyBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkludGVyZmFjZSBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gSW50ZXJmYWNlIiwKLQkgKiAiVGhlIGNvbm5lY3Rpb24gaW50ZXJmYWNlIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGNvbm5lY3Rpb25JbXBsQ2xhc3MgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEltcGwKLQkgKiBDbGFzcyIsICJUaGUgY29ubmVjdGlvbiBpbXBsIGNsYXNzIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHRyYW5zYWN0aW9uU3VwcG9ydCBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlRyYW5zYWN0aW9uIFN1cHBvcnQiLAotCSAqICJUaGUgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlYXV0aGVudGljYXRpb25TdXBwb3J0Ci0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVhdXRoZW50aWNhdGlvbgotCSAqIFN1cHBvcnQiLCAiVGhlIHJlYXV0aGVudGljYXRpb24gc3VwcG9ydCBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCBBZGRDb21tYW5kIGFuZCBSZW1vdmVDb21tYW5kIHN1cHBvcnQgaW4gY3JlYXRlQ29tbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWludCB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZUFkYXB0ZXIpCi0JCQkJdmVyc2lvbiA9ICgoQ29ubmVjdG9yKSAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpKS5nZXRWZXJzaW9uSUQoKTsKLQotCQkJc3dpdGNoICh2ZXJzaW9uKSB7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEIDoKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEIDoKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ly8gaWYKLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ly8gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBSZXNvdXJjZUFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVzb3VyY2VBZGFwdGVyLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvcmVzb3VyY2VfYWRhcHRlcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8JCVJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSAoKFJlc291cmNlQWRhcHRlcikgb2JqZWN0KTsKLQkJLy9yZXR1cm4gIlJlc291cmNlQWRhcHRlcjogIiArIHJlc291cmNlQWRhcHRlci5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlOyAKLQotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWRtaW5PYmplY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSkgewotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjI4NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNwZWNpZmljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3BlY2lmaWNhdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fc3BlY2lmaWNhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fc3BlY2lmaWNhdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogU2VjdXJpdHlQZXJtaXNzaW9uIGZfc2VjdXJpdHlQZXJtaXNzaW9uID0gKChTZWN1cml0eVBlcm1pc3Npb24pb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPQotCSAqIEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCSAqIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24iLCBwa2cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiU3BlY2lmaWNhdGlvbiIsICJUaGUKLQkgKiBzcGVjaWZpY2F0aW9uIHByb3BlcnR5IG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIiwKLQkgKiBwa2cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgU2VjdXJpdHlQZXJtaXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlY3VyaXR5UGVybWlzc2lvbi5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L3NlY3VyaXR5X3Blcm1pc3Npb25fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU2VjdXJpdHlQZXJtaXNzaW9uIHNlY3VyaXR5UGVybWlzc2lvbiA9ICgoU2VjdXJpdHlQZXJtaXNzaW9uKSBvYmplY3QpOwotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyX1VJXzA7IAotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLlNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wICsgIjogIiArIHNlY3VyaXR5UGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbigpOyAgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmOGQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY29ubmVjdG9yX3ZhbGlkYXRvcl9VSV89Q29ubmVjdG9yIFZhbGlkYXRvcgotQ09OTl9GQUNFVF9MQUJFTD1KMkMgTW9kdWxlCi1DT05OX0ZBQ0VUX0RFU0NSSVBUSU9OPUVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBKMkMgbW9kdWxlLgotQ09OTl9GQUNFVF9URU1QTEFURT1KMkMgUHJvamVjdAotcGx1Z2luTmFtZT1KQ0EgUGx1Zy1pbgotcGx1Z2luVmVuZG9yPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhNDcxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSmNhTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgbmFtZT0iSmNhTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk1vZHVsZUV4dGVuc2lvbiI+Ci0gICAgICA8ZWFyTW9kdWxlRXh0ZW5zaW9uCi0gICAgICAgICAgICBleHRlbnNpb25DbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FNb2R1bGVFeHRlbnNpb25JbXBsIj4KLSAgICAgIDwvZWFyTW9kdWxlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzLkpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iamNhLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvdmlkZXJzLkpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJDb25uZWN0b3JWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlY29ubmVjdG9yX3ZhbGlkYXRvcl9VSV8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICAgIGZhY2V0SWQ9ImpzdC5jb25uZWN0b3IiPgotICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb25uZWN0b3JERCI+Ci0gICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ik1BTklGRVNULk1GIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb24uQ29ubmVjdG9ySGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uLlVJQ29ubmVjdG9yVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCI+Ci0gICAgICA8ZWRpdE1vZGVsCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5Ij4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgYXV0b2xvYWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi9yYS54bWwiLz4KLSAgICAgIDwvZWRpdE1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmFydGlmYWN0ZWRpdCI+Ci0gICAgICA8YXJ0aWZhY3RlZGl0Ci0gICAgICAgICAgICB0eXBlSUQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQiPgotICAgICAgPC9hcnRpZmFjdGVkaXQ+Ci0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8IS0tIEJ1aWxkZXIgUHJvdmlkZXIgcmVnaXN0cmF0aW9ucy0tPgotICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAJPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJqc3QuY29ubmVjdG9yLmJ1aWxkZXIiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkphdmFDb21wb25lbnRCdWlsZGVyRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLSAgPCEtLSBQcm9qZWN0IEZhY2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImpzdC5jb25uZWN0b3IiPgotICAgICAgPGxhYmVsPiVDT05OX0ZBQ0VUX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj4lQ09OTl9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8aWNvbj5pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rvci5naWY8L2ljb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iMS41Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iMS42Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249Ils1LjAiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iWzEuMC0xLjZdIiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LmNvbm5lY3Rvci5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iWzEuMC0xLjZdIiB0eXBlPSJQT1NUX0lOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+Ci0gICAgCi0gICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb249IlsxLjAtMS42XSIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+Ci0gICAgPC9ldmVudC1oYW5kbGVyPgotICAgIAotICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUuanN0LmNvbm5lY3RvciI+Ci0gICAgICA8bGFiZWw+JUNPTk5fRkFDRVRfVEVNUExBVEU8L2xhYmVsPgotICAgICAgPGZpeGVkIGZhY2V0PSJqc3QuamF2YSIvPgotICAgICAgPGZpeGVkIGZhY2V0PSJqc3QuY29ubmVjdG9yIi8+Ci0gICAgPC90ZW1wbGF0ZT4KLQotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgPHByb3ZpZGVyPgotICAgICAgICAJPG1vZGVsUHJvdmlkZXIgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdCIvPgkKLSAgICAgIAkJPGZhY2V0IGlkPSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9ucz0iMS4wLDEuNSIvPgotICAgICAgCTwvcHJvdmlkZXI+Ci0gIDwvZXh0ZW5zaW9uPgkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZWEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmpjYSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0gIAkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3Jhci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAxNjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3Jhci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1MaWNlbnNlSXRlbVByb3ZpZGVyX1VJXzA9TGljZW5zZQotU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyX1VJXzA9U2VjdXJpdHlQZXJtaXNzaW9uCi1Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wPUNvbmZpZ1Byb3BlcnR5Ci1fVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGU9UmVzb3VyY2VBZGFwdGVyCi1fVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZT1PdXRib3VuZFJlc291cmNlQWRhcHRlcgotX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGU9Q29ubmVjdGlvbkRlZmluaXRpb24KLV9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU9SW5ib3VuZFJlc291cmNlQWRhcHRlcgotX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGU9TWVzc2FnZUFkYXB0ZXIKLV9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZT1NZXNzYWdlTGlzdGVuZXIKLV9VSV9BY3RpdmF0aW9uU3BlY190eXBlPUFjdGl2YXRpb25TcGVjCi1fVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZT1SZXF1aXJlZENvbmZpZ1Byb3BlcnR5Ci1fVUlfQWRtaW5PYmplY3RfdHlwZT1BZG1pbk9iamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDc4NzdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfPUlXQUUwMDU0RSBEb2N1bWVudCB0eXBlIHZlcnNpb24gInswfSIgZm9yIHJhci54bWwgaW4gcHJvamVjdCAiezF9IiBuZWVkcyB0byBiZSB2ZXJzaW9uICJ7Mn0iLgotRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRT0iSW52YWxpZCBSQVIgRmlsZSIuCi1FUlJPUl9DT05ORUNUT1JfVkFMSURBVElPTl9GQUlMRUQ9IlJBUiBWYWxpZGF0aW9uIGZhaWxlZCIuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODQwNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0E7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuTk9UX0FfUkFSLCBuZXcgT2JqZWN0W117cHJvamVjdE5hbWV9KTsgICAgICAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgLyoqCi0gICAgICogRXhwb3J0cyB0aGUgc3BlY2lmaWVkIENvbm5lY3RvciBNb2R1bGUgcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkIENvbm5lY3RvciBSQVIgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29ubmVjdG9yUHJvamVjdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDb25uZWN0b3IgTW9kdWxlIHByb2plY3QgdG8gZXhwb3J0LgotICAgICAqIEBwYXJhbSByYXJGaWxlTmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBDb25uZWN0b3IgUkFSIGZpbGUgbG9jYXRpb24gdG8gZXhwb3J0IHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yCi0gICAgICogICAgICAgICAgICBNb2R1bGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlRXhpc3RpbmcKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmVhckZpbGVOYW1lPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuLgotICAgICAqIEBwYXJhbSBleHBvcnRTb3VyY2UKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yCi0gICAgICogICAgICAgICAgICBNb2R1bGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIENvbm5lY3RvciBSQVIgZmlsZS4KLSAgICAgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhwb3J0UHJvamVjdChTdHJpbmcgY29ubmVjdG9yUHJvamVjdE5hbWUsIFN0cmluZyByYXJGaWxlTmFtZSwgYm9vbGVhbiBvdmVyd3JpdGVFeGlzdGluZywgYm9vbGVhbiBleHBvcnRTb3VyY2UpIHsKLS8vICAgICAgICBDb25uZWN0b3JNb2R1bGVFeHBvcnREYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IENvbm5lY3Rvck1vZHVsZUV4cG9ydERhdGFNb2RlbCgpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIGNvbm5lY3RvclByb2plY3ROYW1lKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KE9WRVJXUklURV9FWElTVElORywgb3ZlcndyaXRlRXhpc3RpbmcpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX0RFU1RJTkFUSU9OLCByYXJGaWxlTmFtZSk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2UpOwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkucnVuKG51bGwpOwotLy8gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIyZGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGRhdGFNb2RlbCBpcyB1c2VkIGZvciB0byBpbXBvcnQgQ29ubmVjdG9yIE1vZHVsZXMgKGZyb20gUkFSIGZpbGVzKSBpbnRvIHRoZSB3b3Jrc3BhY2UuCi0gKiAKLSAqIFRoaXMgY2xhc3MgKGFuZCBhbGwgaXRzIGZpZWxkcyBhbmQgbWV0aG9kcykgaXMgbGlrZWx5IHRvIGNoYW5nZSBkdXJpbmcgdGhlIFdUUCAxLjAgbWlsZXN0b25lcyBhcwotICogdGhlIG5ldyBwcm9qZWN0IHN0cnVjdHVyZXMgYXJlIGFkb3B0ZWQuIFVzZSBhdCB5b3VyIG93biByaXNrLgotICogCi0gKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vc2V0SW50UHJvcGVydHkoSUNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFhNTFJlc291cmNlLlJBUl9UWVBFOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuUkFSRmlsZShnZXRBcmNoaXZlT3B0aW9ucygpLCB1cmkpOwotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCQotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIHNldCA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFSQ0hJVkVfV1JBUFBFUikpIHsKLQkJCUlEYXRhTW9kZWwgbW9kdWxlRE0gPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQkJaWYgKGdldEFyY2hpdmVXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kdWxlRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJCUlEYXRhTW9kZWwgamNhRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpDQSApOwotCi0JCQkJaW50IHZlcnNpb24gPSBnZXRNb2R1bGVTcGVjVmVyc2lvbigpOwotCQkJCVN0cmluZyB2ZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5nZXRKQ0FUZXh0VmVyc2lvbiggdmVyc2lvbiApOwotCQkJCWpjYUZhY2V0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHZlcnNpb25UZXh0KTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTVkMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvRXhlY3V0ZShtb25pdG9yKTsKLQkJYWRkQXNzb2NpYXRlQXJjaGl2ZXNUb0NsYXNzUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIGphciB3aXRoaW4gdGhlIGZpbGUgdG8gdGhlIGNsYXNzcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3NvY2lhdGVBcmNoaXZlc1RvQ2xhc3NQYXRoKCkgewotCQlMaXN0IDxJQ2xhc3NwYXRoRW50cnk+IGV4dHJhRW50cmllcyA9IG5ldyBBcnJheUxpc3QgPElDbGFzc3BhdGhFbnRyeT4gKCk7Ci0JCQotCQlMaXN0IDxJQXJjaGl2ZVJlc291cmNlPiBhcmNoaXZlUmVzb3VyY2VzID0gKChJQXJjaGl2ZSlhcmNoaXZlV3JhcHBlci5nZXRVbmRlckx5aW5nQXJjaGl2ZSgpKS5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0JCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IoSUFyY2hpdmVSZXNvdXJjZSBhcmNoaXZlUmVzb3VyY2UgOiBhcmNoaXZlUmVzb3VyY2VzKXsKLQkJCWlmKGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKS5lbmRzV2l0aChKQVJfRVhURU5TSU9OKSl7Ci0JCQkJdkZpbGUgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwotCQkJCWlmICh2RmlsZS5leGlzdHMoKSkgewotCQkJCQlmaWxlID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCQkJZXh0cmFFbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZmlsZS5nZXRGdWxsUGF0aCgpLCBmaWxlLmdldEZ1bGxQYXRoKCksIG51bGwsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWFkZFRvQ2xhc3NwYXRoKGdldERhdGFNb2RlbCgpLCBleHRyYUVudHJpZXMpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJRGF0YU1vZGVsIGltcG9ydE1vZGVsLCBMaXN0IGV4dHJhRW50cmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChleHRyYUVudHJpZXMuc2l6ZSgpID4gMCkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKCgoSVZpcnR1YWxDb21wb25lbnQpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpKS5nZXRQcm9qZWN0KCkpOwotCQkJYWRkVG9DbGFzc3BhdGgoZXh0cmFFbnRyaWVzLCBqYXZhUHJvamVjdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKExpc3QgZXh0cmFFbnRyaWVzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoZXh0cmFFbnRyaWVzLnNpemUoKSA+IDApIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGphdmFDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUxpc3Qgbm9uRHVwbGljYXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmFFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGV4dHJhRW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBleHRyYUVudHJpZXMuZ2V0KGkpOwotCQkJCWJvb2xlYW4gaW5jbHVkZSA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGluY2x1ZGUgJiYgaiA8IGphdmFDbGFzc3BhdGgubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGV4dHJhRW50cnkuZXF1YWxzKGphdmFDbGFzc3BhdGhbal0pKSB7Ci0JCQkJCQlpbmNsdWRlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluY2x1ZGUpIHsKLQkJCQkJbm9uRHVwbGljYXRlTGlzdC5hZGQoZXh0cmFFbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5vbkR1cGxpY2F0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0phdmFDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2phdmFDbGFzc3BhdGgubGVuZ3RoICsgbm9uRHVwbGljYXRlTGlzdC5zaXplKCldOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoamF2YUNsYXNzcGF0aCwgMCwgbmV3SmF2YUNsYXNzcGF0aCwgMCwgamF2YUNsYXNzcGF0aC5sZW5ndGgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9uRHVwbGljYXRlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQluZXdKYXZhQ2xhc3NwYXRoW2phdmFDbGFzc3BhdGgubGVuZ3RoICsgal0gPSAoSUNsYXNzcGF0aEVudHJ5KSBub25EdXBsaWNhdGVMaXN0LmdldChqKTsKLQkJCQl9Ci0JCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0phdmFDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHNhdmVTdHJhdCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKGNvbXBvbmVudCk7Ci0JCXJldHVybiBzYXZlU3RyYXQ7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZ2V0QXJjaGl2ZVNhdmVBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWE1NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci0vKioKLSAqIDxwPgotICogSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbCBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0gKiBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5cCi0gKiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgZHVyaW5nIE01Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTcyODQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotLyoqCi0gKiA8cD4KLSAqIElDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLgotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL21vZHVsZS91dGlsL0Nvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvbW9kdWxlL3V0aWwvQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDllZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvbW9kdWxlL3V0aWwvQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLm1vZHVsZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IENvbm5lY3RvckFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUgfHwgYWRhcHRlclR5cGUgPT0gQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3Q7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpKQotCQkJCXJldHVybiBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117QXJ0aWZhY3RFZGl0LmNsYXNzLCBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkuY2xhc3N9OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjg0NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL0Nvbm5lY3RvckFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5CaW5hcnlDb21wb25lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JQXJ0aWZhY3RFZGl0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBKMkVFIENvbm5lY3RvciBtb2RlbHMgdXNpbmcgdGhlIEFydGlmYWN0RWRpdCBwYXR0ZXJuLgotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCB1c2UgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RGb3JSZWFkL1dyaXRlKCkgdG8gYWNxdWlyZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29ycmVjdAotICogYXJ0aWZhY3QgZWRpdCBjbGFzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29ubmVjdG9yREQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRvIGEgQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5Ci0JICoge0BzZWUgQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IENvbm5lY3RvckFydGlmYWN0RWRpdC5jbGFzczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCXN1cGVyKGFNb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoYmluYXJ5TW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHksIGJvb2xlYW4gZm9yQ3JlYXRlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSwgZm9yQ3JlYXRlLCBKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBhbkFydGlmYWN0RWRpdE1vZGVsKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0TW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQotCXByb3RlY3RlZCBDb25uZWN0b3JBcnRpZmFjdEVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLCBJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlLCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgewotCQlzdXBlcihhTmF0dXJlLCBhTW9kdWxlLCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQ29ubmVjdG9yUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqLwotCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlIGdldENvbm5lY3RvclhtaVJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbm5lY3RvclJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKS5nZXRSZXNvdXJjZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUklfT0JKKTsKLQkJfQotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUklfT0JKKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBDb25uZWN0b3IgKEBzZWUgQ29ubmVjdG9yKSByb290IG9iamVjdCBmcm9tIHRoZSBDb25uZWN0b3JSZXNvdXJjZS4gSWYgdGhlIHJvb3QKLQkgKiBvYmplY3QgZG9lcyBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rCi0JICogYWRkQ29ubmVjdG9ySWZOZWNlc3NhcnkoZ2V0Q29ubmVjdG9yWG1pUmVzb3VyY2UoKSkpLiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyCi0JICogcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KGdldENvbm5lY3RvclhtaVJlc291cmNlKCkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChDb25uZWN0b3IpIGFuZCBwb3B1bGF0ZXMgd2l0aCBkYXRhLiBBZGRzIHRoZQotCSAqIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkCi0JICogICAgICAgICAgICBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJdGhyb3dBdHRlbXB0ZWRCaW5hcnlFZGl0TW9kZWxBY2Nlc3MoKTsKLQkJfQotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlDb25uZWN0b3IgY29ubmVjdG9yID0gSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdG9yKCk7Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoY29ubmVjdG9yKTsKLQkJCVVSSSBtb2R1bGVVUkkgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQljb25uZWN0b3Iuc2V0RGlzcGxheU5hbWUoU3RydWN0dXJlRWRpdC5nZXREZXBsb3llZE5hbWUobW9kdWxlVVJJKSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJCWFSZXNvdXJjZS5zZXRJRChjb25uZWN0b3IsIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0lEKTsKLQkJCS8vIFRPRE8gYWRkIG1vcmUgbWFuZGF0b3J5IGVsZW1lbnRzCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZENvbm5lY3Rvck1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCkpKQotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRDb25uZWN0b3JNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSwgZmFsc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcwotCSAqIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nCi0JICogICAgICAgICBjb250ZW50IG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhTW9kdWxlLmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KGFNb2R1bGUpOwotCQl9Ci0JCXJldHVybiBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIENvbm5lY3RvckFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcwotCSAqICAgICAgICAgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCB8fCBhTW9kdWxlLmlzQmluYXJ5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShXb3JrYmVuY2hDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzCi0JICogICAgICAgICBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENvbm5lY3Rvck1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGFNb2R1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvKiBhbmQgbWF0Y2ggdGhlIEpTVF9Db25uZWN0b3JfTU9EVUxFIHR5cGUgKi8KLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIENvbm5lY3RvclJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldENvbm5lY3RvclhtaVJlc291cmNlKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQ29ubmVjdG9yIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpKQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgewotCQlyZXR1cm4gKENvbm5lY3RvcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJdGhyb3dBdHRlbXB0ZWRCaW5hcnlFZGl0TW9kZWxBY2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGphdmEubGFuZy5JbnRlZ2VyKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbikgewotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJdGhyb3dBdHRlbXB0ZWRCaW5hcnlFZGl0TW9kZWxBY2Nlc3MoKTsKLQkJfQotCQlDb25uZWN0b3JSZXNvdXJjZSByZXMgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJcmVzLnNldE1vZHVsZVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJYWRkQ29ubmVjdG9ySWZOZWNlc3NhcnkocmVzKTsKLQkJcmV0dXJuICgoQ29ubmVjdG9yUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKGFDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYUNvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgYXNBcmNoaXZlKGJvb2xlYW4gaW5jbHVkZVNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKWdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpOwotCQkJcmV0dXJuIGhlbHBlci5hY2Nlc3NMZWdhY3lBcmNoaXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpLCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JCQlsb2FkZXIuc2V0RXhwb3J0U291cmNlKGluY2x1ZGVTb3VyY2UpOwotCQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKLQkJCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlblJBUkZpbGUobG9hZGVyLCB1cmkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBqY2FFZGl0ID0gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlqY2FFZGl0LmNyZWF0ZU1vZGVsUm9vdCh2ZXJzaW9uKTsKLQkJCWpjYUVkaXQuc2F2ZShudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWpjYUVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudCk7Ci0JfQotCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSwgSVBhdGggbW9kZWxQYXRoKSB7Ci0JCXNldFdyaXRhYmxlRWRpdChnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpKTsKLQkJdHJ5ewotCQkJcnVubmFibGUucnVuKCk7Ci0JCQlpZiggZ2V0V3JpdGFibGVFZGl0KCkgIT0gbnVsbCApewotCQkJCS8vIEFsd2F5cyBzYXZlIHJlZ2FyZGxlc3Mgb2YgcmVzb3VyY2UgcGF0aCBwYXNzZWQgLSBBcnRpZmFjdGVkaXRzIHNhdmUgcmVzb3VyY2VzIGFzIGEgdW5pdAotCQkJCWdldFdyaXRhYmxlRWRpdCgpLnNhdmVJZk5lY2Vzc2FyeSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7IC8vUHJvcGVybHkgZGlzcG9zZSB0aGUgd3JpdGUgYXJ0aWZhY3QgZWRpdAotCQkJZ2V0V3JpdGFibGVFZGl0KCkuZGlzcG9zZSgpOwotCQkJc2V0V3JpdGFibGVFZGl0KG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCXJldHVybiBDT05ORUNUT1JfQ09OVEVOVF9UWVBFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyOGJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+V2ViQXJ0aWZhY3RFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIENvbm5lY3RvckFydGlmYWN0RWRpdCBhcGkuIFRoaXMgYXBpIGlzIHVzZWQgdG8gd29yayB3aXRoIHRoZSBlbWYgbW9kZWwKLSAgICAgICAgb2YgYSBmbGV4aWJsZSBjb25uZWN0b3IgbW9kdWxlLiBJdCBjb250YWlucyBhcGkgdG8gcmVhZCBhbmQgc2VyaWFsaXplIG91dCB0aGUgZW1mIG1vZGVsIGZvciBjb25uZWN0b3IgbW9kdWxlcy4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jZHRwcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNkdHByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzg4YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZS1jZHQgdmVyc2lvbj0iMi4wIj8+DQotDQotPGNkdHByb2plY3Q+DQotPGRhdGE+DQotPGl0ZW0gaWQ9ImNkdF9pbmRleGVyIj4NCi08aW5kZXhFbmFibGVkIGluZGV4VmFsdWU9InRydWUiLz4NCi08L2l0ZW0+DQotPC9kYXRhPg0KLTwvY2R0cHJvamVjdD4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1NDI4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlLW5hdmlnYXRvci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODI0NmNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotajJlZS1uYXZpZ2F0b3IuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODU2ZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLmV0b29scy5jdGMuamF2YXByb2plY3RuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhZTNmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVGh1IE1heSAxMCAxODozNToxNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTU1ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBsdWdpbi5wcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTZlNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSBqMmVlLW5hdmlnYXRvci8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9KMkVFUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU2NTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ODQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2FmM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWViM2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lamJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZGIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWIyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MzMwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NjdmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcwYjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNkNDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmIzZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MjAxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDRiNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYyNWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTg2YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWM2YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0MDliNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGEyMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlMTE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2YxM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4N2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmc0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2Y2ZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTMxZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjFjYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlNzdiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1MGQ2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxOWM0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2ViX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU5NjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2ViX21vZHVsZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkN2ZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWY4ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjVlNzYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjJhYTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNTM5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjdmYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNhNzllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0N2YxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTEyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTFhMzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NTRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjM1MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Mjc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY0ZTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9qY3Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhNzNhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9qY3Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2VydmxldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWJlY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93c2RsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93c2RsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTViNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvYWRpbmdERE5vZGVfTG9hZGluZ18wXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhclBsYWNlSG9sZGVySm9iX1JlbW92aW5nX3BsYWNlX2hvbGRlcl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFV0aWxpdHlKYXJUb0VhckRyb3BBc3Npc3RhbnRfQWRkX1V0aWxpdHlfSmFyX3RvXzBfOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9yZWNvZ25pemVfZXh0ZW5zaW9uXzBfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzg4OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jU3RyaW5nIGV4dGVybmFsaXphdGlvbiwga2V5PXZhbHVlCi0jU2F0IEFwciAxNSAxNjoxMjoxMCBFRFQgMjAwNgotQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfPUFkZGluZyBtb2R1bGUgdG8gezB9Ci1DbGVhclBsYWNlSG9sZGVySm9iX1JlbW92aW5nX3BsYWNlX2hvbGRlcl89UmVtb3ZpbmcgcGxhY2UgaG9sZGVyIC4uLgotSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfQ291bGRfbm90X3JlY29nbml6ZV9leHRlbnNpb25fMF89Q291bGQgbm90IHJlY29nbml6ZSBleHRlbnNpb24gInswfSIgYXMgYSBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiBhcnRpZmFjdC4KLUFkZFV0aWxpdHlKYXJUb0VhckRyb3BBc3Npc3RhbnRfQWRkX1V0aWxpdHlfSmFyX3RvXzBfPUFkZCBVdGlsaXR5IEphciB0byB7MH0KLUltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHM9SW1wb3J0aW5nIEphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIGFydGlmYWN0cyAuLi4KLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV89VGhlIHByb2plY3QgInswfSIgY2Fubm90IGJlIGFjY2Vzc2VkCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXz1UaGUgZHJhZ2dlZCBwcm9qZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgKi5lYXIgYmVjYXVzZSBpdCBpcyBjbG9zZWQuCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfPUNvdWxkIG5vdCBhZGQgbW9kdWxlIHRvIEVudGVycHJpc2UgQXBwbGljYXRpb24uCi1Mb2FkaW5nREROb2RlX0xvYWRpbmdfMF89TG9hZGluZyBkZXNjcmlwdG9yIGZvciB7MH0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9BcHBsaWNhdGlvblZpZXdlclNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgxY2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9BcHBsaWNhdGlvblZpZXdlclNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblZpZXdlclNvcnRlciBleHRlbmRzIEoyRUVWaWV3ZXJTb3J0ZXIgewotCi0JcHVibGljIEFwcGxpY2F0aW9uVmlld2VyU29ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYoZTEgaW5zdGFuY2VvZiBKMkVFQmluYXJ5TW9kdWxlc0l0ZW1Qcm92aWRlcil7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmKGUyIGluc3RhbmNlb2YgSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIpewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ2xlYXJQbGFjZUhvbGRlckpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0NsZWFyUGxhY2VIb2xkZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmZjFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ2xlYXJQbGFjZUhvbGRlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhclBsYWNlSG9sZGVySm9iIGV4dGVuZHMgVUlKb2IgewotCi0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlcjsKLQlwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuOwotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXB1YmxpYyBDbGVhclBsYWNlSG9sZGVySm9iKEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXIsIExvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLkNsZWFyUGxhY2VIb2xkZXJKb2JfUmVtb3ZpbmdfcGxhY2VfaG9sZGVyXyk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLnBsYWNlSG9sZGVyID0gcGxhY2VIb2xkZXI7IAotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCQlzZXRSdWxlKG5ldyBOb25Db25mbGljdGluZ1J1bGUoKSk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJdHJ5IHsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCXZpZXdlci5yZW1vdmUocGxhY2VIb2xkZXIpOwotCQkJdmlld2VyLmFkZChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VBUkNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VBUkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVjZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FQVJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIEVBUiBuYXZpZ2F0b3IgY29udGVudCB0byB0aGUgcHJvamVjdCBleHBsb3JlcgotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFQVJDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqLwotCXB1YmxpYyBFQVJDb250ZW50UHJvdmlkZXIoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlzdXBlcihhVmlld2VySWQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbHRlciBvdXQgYW55IG5vbiBBcHBsaWNhdGlvbiBERCBvYmplY3RzIHNvIGFzIG5vdCB0byBkdXBsaWNhdGUgbWV0YSBub2RlcyBpbgotCSAqIHRoZSBiaW5hcnkgbW9kdWxlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpYVBhcmVudEVsZW1lbnQ7Ci0JCQlTdHJpbmcgZW1mUGFja2FnZSA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpOwotCQkJaWYgKCFlbWZQYWNrYWdlLmVxdWFscyhBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkmJgotCQkJCQkhZW1mUGFja2FnZS5lcXVhbHMoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSYmIWVtZlBhY2thZ2UuZXF1YWxzKE1vZHVsZW1hcFBhY2thZ2UuZU5TX1VSSSkpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihhUGFyZW50RWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJjMzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldE1vZGVscygpOwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JcHVibGljIGZpbmFsIEVNRlJvb3RPYmplY3RQcm92aWRlciBnZXRFTUZSb290T2JqZWN0UHJvdmlkZXIoKXsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQlwdWJsaWMgRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgYVByb3ZpZGVyKSB7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXByb3ZpZGVyLm5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiZGExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZNb2RlbE1hbmFnZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIEVNRk1vZGVsTWFuYWdlciBjcmVhdGVFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgcHJvamVjdCwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWJvb2xlYW4gZmxleGlibGUgPSAgKE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsKTsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCWlmIChmbGV4aWJsZSkKLQkJCW1vZGVsTWFuYWdlciA9IG5ldyBGbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihwcm9qZWN0LHByb3ZpZGVyKTsKLQkJZWxzZQotCQkJbW9kZWxNYW5hZ2VyID0gbmV3IE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKHByb2plY3QscHJvdmlkZXIpOwotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzM0NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEVNRlJvb3RPYmplY3RNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0KLQotCXByaXZhdGUgZmluYWwgTWFwIHByb2plY3RFZGl0TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIE1hcCBwcm9qZWN0Um9vdE9iamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCQl2b2lkIG9uUmVmcmVzaChPYmplY3QgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUZSb290T2JqZWN0TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcm9qZWN0RWRpdE1vZGVscyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0JCU9iamVjdFtdIGtleXMgPSBwcm9qZWN0RWRpdE1vZGVscy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMucmVtb3ZlKGtleXNbaV0pOwotCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSb290T2JqZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdCByb290T2JqZWN0ID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChwcm9qZWN0Um9vdE9iamVjdHMpIHsKLQkJCXJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMuZ2V0KHByb2plY3QpOwotCi0JCQlpZiAocm9vdE9iamVjdCA9PSBudWxsIHx8ICgoRU9iamVjdCkgcm9vdE9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFZGl0TW9kZWxGb3JQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCQlyb290T2JqZWN0ID0gZWRpdE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQkJCXByb2plY3RSb290T2JqZWN0cy5wdXQocHJvamVjdCwgcm9vdE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb290T2JqZWN0OwotCX0KLQotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChwcm9qZWN0RWRpdE1vZGVscykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMuZ2V0KHByb2plY3QpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBhcnRpZmFjdEVkaXQuZ2V0QWRhcHRlcihFZGl0TW9kZWwuY2xhc3MpOwotCQkJCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQkJCWFkZE1hcHBpbmcocHJvamVjdCwgZWRpdE1vZGVsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkKLQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmcoSVByb2plY3QgcHJvamVjdCwgRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlwcm9qZWN0RWRpdE1vZGVscy5wdXQocHJvamVjdCwgZWRpdE1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQlzd2l0Y2ggKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpIHsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCU9iamVjdCBvbGRSb290T2JqZWN0ID0gcHJvamVjdFJvb3RPYmplY3RzLnJlbW92ZShhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5TQVZFIDogewotCQkJCU9iamVjdCBvbGRSb290T2JqZWN0ID0gcHJvamVjdFJvb3RPYmplY3RzLmdldChhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJZGlzcG9zZUNhY2hlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhJUHJvamVjdCBhUHJvamVjdCkgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGxpc3RlbmVycy5zaXplKCk7ICsreCkgewotCQkJSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgcmVmcmVzaEhhbmRsZXIgPSAoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoeCk7Ci0JCQlyZWZyZXNoSGFuZGxlci5vblJlZnJlc2goYVByb2plY3QpOwotCQl9Ci0KLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQoRU1GUm9vdE9iamVjdE1hbmFnZXIudGhpcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0gY2F0Y2ggKFNXVEVycm9yIHN3dGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Ioc3d0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCWJvb2xlYW4gcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQgPSAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKTsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkKQotCQkJCQkJZGlzcG9zZUNhY2hlKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUNhY2hlKElQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RFZGl0TW9kZWxzKSB7Ci0JCQlwcm9qZWN0Um9vdE9iamVjdHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVNT1ZJTkcgZWRpdCBtb2RlbDogIiArIGFmZmVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIHByb2plY3RFZGl0TW9kZWxzLnJlbW92ZShhZmZlY3RlZFByb2plY3QpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJFTU9WRUQgZWRpdCBtb2RlbCAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJFTEVBU0VEIGVkaXQgbW9kZWwgIiArIGFmZmVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcihJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChnZXRMaXN0ZW5lcnMoKSkgewotCQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsICYmICFnZXRMaXN0ZW5lcnMoKS5jb250YWlucyhhTGlzdGVuZXIpKQotCQkJCWdldExpc3RlbmVycygpLmFkZChhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcihJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUoYUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjQyOjU4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZhMDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVNRlJvb3RPYmplY3RQcm92aWRlciBpbXBsZW1lbnRzICBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yewotCXByaXZhdGUgZmluYWwgSGFzaE1hcCBlbWZNb2RlbENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCQl2b2lkIG9uUmVmcmVzaChPYmplY3QgZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GUm9vdE9iamVjdFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRNb2RlbHMoSVByb2plY3QgcHJvamVjdCl7Ci0JCXRyeSB7Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLmdldChwcm9qZWN0KTsKLQkJaWYgKG1vZGVsTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGVtZk1vZGVsQ2FjaGUpIHsKLQkJCQltb2RlbE1hbmFnZXI9IEVNRk1vZGVsTWFuYWdlckZhY3RvcnkuY3JlYXRlRU1GTW9kZWxNYW5hZ2VyKHByb2plY3QsdGhpcykgOwotCQkJCWVtZk1vZGVsQ2FjaGUucHV0KHByb2plY3QsbW9kZWxNYW5hZ2VyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyLmdldE1vZGVscygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTG9hZGVkTW9kZWxzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGVtZk1vZGVsQ2FjaGUuZ2V0KHByb2plY3QpICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KEVNRlJvb3RPYmplY3RQcm92aWRlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlib29sZWFuIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkID0gKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fCBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQlkaXNwb3NlKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgcmV0dXJuOwotCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJbW9kZWxNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQlPYmplY3RbXSBrZXlzID0gZW1mTW9kZWxDYWNoZS5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUoa2V5c1tpXSk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltb2RlbE1hbmFnZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgbGlzdGVuZXJzLnNpemUoKTsgKyt4KSB7Ci0JCQlJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciByZWZyZXNoSGFuZGxlciA9IChJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldCh4KTsKLQkJCXJlZnJlc2hIYW5kbGVyLm9uUmVmcmVzaChhUHJvamVjdCk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6NDI6NTggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZjNjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIgZXh0ZW5kcyBFTUZNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcnsKLQotCXByaXZhdGUgTGlzdCByb290T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1QgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgZmluYWwgTGlzdCBhcnRpZmFjdEVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgZmluYWwgTWFwIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoYVByb2plY3QscHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZNb2RlbE1hbmFnZXIjZ2V0TW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0TW9kZWxzKCkgewotCQl0cnkgewotCQkKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIHByb2plY3Q9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCQkKLQkJCXN5bmNocm9uaXplZCAocm9vdE9iamVjdHMpIHsKLQkJCQlpZiAoIWlzVmFsaWQocm9vdE9iamVjdHMpKSB7Ci0JCQkJCXJvb3RPYmplY3RzID0gZ2V0Um9vdE9iamVjdHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKHJvb3RPYmplY3RzICE9IG51bGwpIHsKLQkJCSByZXR1cm4gcm9vdE9iamVjdHMudG9BcnJheSgpIDsKLQkJfQotCQlyZXR1cm4gRU1QVFlfT0JKRUNUOwotCQkJCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaXN0IHJvb3RPYmplY3RzKSB7Ci0JCWlmIChyb290T2JqZWN0cyA9PSBudWxsIHx8IHJvb3RPYmplY3RzLnNpemUoKT09MCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IHg9MDsgeDwgcm9vdE9iamVjdHMuc2l6ZSgpOyArK3gpIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSByb290T2JqZWN0cy5nZXQoeCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsICYmIGVPYmplY3QuZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0Um9vdE9iamVjdHMoKSB7Ci0JICAJICBMaXN0IGFydGlmYWN0cyA9IGdldEFydGlmYWN0RWRpdHMoKTsKLQkgIAkgIExpc3QgZmxleGlibGVPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgCSAgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JICAJICBFT2JqZWN0IGNvbnRlbnRNb2RlbFJvb3QgPSBudWxsOwotCSAgCSAgZm9yIChpbnQgeD0wOyB4PCBhcnRpZmFjdHMuc2l6ZSgpOyArK3gpIHsKLQkgIAkgIAkgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdHMuZ2V0KHgpOwotCSAgCSAgICAgY29udGVudE1vZGVsUm9vdCA9IGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQkgaWYgKGNvbnRlbnRNb2RlbFJvb3QgIT0gbnVsbCkgewotCQkgIAkgICAgIGZsZXhpYmxlT2JqZWN0cy5hZGQoY29udGVudE1vZGVsUm9vdCk7Ci0JCSAgCSAgICAgaWYgKCFyb290T2JqZWN0cy5jb250YWlucyhjb250ZW50TW9kZWxSb290KSkKLQkJICAJICAgIAkgcm9vdE9iamVjdHMuYWRkKGNvbnRlbnRNb2RlbFJvb3QpOwotCQkgIAkgICAgIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5wdXQoYXJ0aWZhY3RFZGl0LGNvbnRlbnRNb2RlbFJvb3QpOwotCQkJIH0KLQkgIAkgIH0KLQkgIAkgIHJldHVybiBmbGV4aWJsZU9iamVjdHM7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldEFydGlmYWN0RWRpdHMoKSB7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAoYXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKGFydGlmYWN0RWRpdHMuc2l6ZSgpID09MCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQkJdHJ5ewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQkJaWYoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0RWRpdHMuYWRkKGFydGlmYWN0RWRpdCk7Ci0JCQkJCQlhcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0RWRpdHMuc2l6ZSgpOyArK3gpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdEVkaXRzLmdldCh4KTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQlyb290T2JqZWN0cy5jbGVhcigpOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lciNlZGl0TW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlJUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBhbkV2ZW50LmdldEVkaXRNb2RlbCgpLmdldFByb2plY3QoKTsKLQkJCi0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSByZW1vdmVSb290T2JqZWN0KGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCksYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQlnZXRSb290T2JqZWN0cygpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IGdldFJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCByZW1vdmVSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcm9vdE9iamVjdHMucmVtb3ZlKGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KSk7Ci0JCQlhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWZmZWN0ZWRQcm9qZWN0Ci0JICogQHBhcmFtIGVkaXRNb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwb3NlKCBFZGl0TW9kZWwgZWRpdE1vZGVsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRBcnRpZmFjdEVkaXQoZWRpdE1vZGVsLHByb2plY3QpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWFydGlmYWN0RWRpdHMucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCQlhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdChFZGl0TW9kZWwgZWRpdE1vZGVsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChhcnRpZmFjdEVkaXRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IHg9MDsgeDxhcnRpZmFjdEVkaXRzLnNpemUoKTsgKyt4KSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChBcnRpZmFjdEVkaXQpYXJ0aWZhY3RFZGl0cy5nZXQoeCk7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdC5oYXNFZGl0TW9kZWwoZWRpdE1vZGVsKSkgCi0JCQkJCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDBiMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDcsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMgewotCi0JU3RyaW5nIFZJRVdFUl9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIjsvLyROT04tTkxTLTEkIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFV2l6YXJkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NDNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIENyZWF0aW9uIElEcyBhcmUgdXNlZCBmb3IgYWN0aXZpdHkgZmlsdGVyaW5nIGFuZCBhcyBzdWNoIGFyZSBkZWNsYXJlZCBvbiB0aGUgaW5kaXZpZHVhbAotICogd2l6YXJkcy4gQWxsIG90aGVyIElEcyBtdXN0IGJlIG1haW50YWluZWQgdG8gc3RheSBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgcGx1Z2luLnhtbAotICogZmlsZXMgb2YgdGhlIHJlc3BlY3RpdmUgbW9kdWxlIFVJIHBsdWdpbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVXaXphcmRDb25zdGFudHMgewotCi0vLwlTdHJpbmcgTkVXX0VBUl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotLy8JU3RyaW5nIE5FV19BUFBDTElFTlRfUFJPSkVDVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19KQ0FfUFJPSkVDVF9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19FSkJfUFJPSkVDVF9XSVpBUkRfSUQgPSBFSkJDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19XRUJfUFJPSkVDVF9XSVpBUkRfSUQgPSBXZWJDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0KLQlTdHJpbmcgTkVXX0VOVEVSUFJJU0VfQkVBTl9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnVpLnV0aWwuY3JlYXRlRUpCV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElNUE9SVF9FQVJfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX0NPTk5FQ1RPUl9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIElNUE9SVF9FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEltcG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTVBPUlRfV0VCX01PRFVMRV9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgRVhQT1JUX1dFQl9NT0RVTEVfV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRFeHBvcnRXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9JRCA9IEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3LmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfRUFSX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9DT05ORUNUT1JfV0laQVJEX0lEID0gQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfRU5URVJQUklTRV9CRUFOX1dJWkFSRF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZEVKQkNvbXBvbmVudEV4cG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFhMGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCQotCXByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOyAKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSjJFRUFjdGlvblByb3ZpZGVyKCkgewotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50U2VydmljZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGFDb25maWcpIHsgCi0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOyAKLQkJCi0vLwkJcmVuYW1lQWN0aW9uID0gbmV3IEoyRUVSZW5hbWVBY3Rpb24oYUNvbmZpZy5nZXRWaWV3U2l0ZSgpLCBhQ29uZmlnLmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjc2V0QWN0aW9uQ29udGV4dChvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGFDb250ZXh0KSB7Ci0JCQotCQlpZiAoYUNvbnRleHQgIT0gbnVsbCAmJiBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFDb250ZXh0LmdldFNlbGVjdGlvbigpOwotCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLS8vCQkJcmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotCQkJT2JqZWN0W10gYXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaWYgKGlzVXRpbGl0eUphcnMoYXJyYXkpKSB7Ci0JCQkJSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQl1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSBhcnJheVtpXTsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZEFsbCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJCS8vZ2VuZXJpY0RlbGV0ZS5zZWxlY3Rpb25DaGFuZ2VkKGdlbmVyaWNEZWxldGUsIHNlbGVjdGlvbik7Ci0JCX0KLQkJc3VwZXIuc2V0Q29udGV4dChhQ29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNmaWxsQWN0aW9uQmFycyhvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0vLwkJaWYgKGdlbmVyaWNEZWxldGUuaXNFbmFibGVkKCkpCi0vLwkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBnZW5lcmljRGVsZXRlKTsKLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgCi0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuQWN0aW9uKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlpZiAoZ2V0Q29udGV4dCgpPT1udWxsIHx8IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZighYWRhcHRzVG9SZXNvdXJjZShzZWxlY3Rpb24udG9BcnJheSgpKSkgewotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdHNUb1Jlc291cmNlKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihvYmplY3RzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQWRhcHRhYmxlICYmICgoKElBZGFwdGFibGUpb2JqZWN0c1tpXSkuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNVdGlsaXR5SmFycyhPYmplY3RbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXSA9PSBudWxsIHx8IGl0ZW1zW2ldLmdldENsYXNzKCkgIT0gSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuY2xhc3MpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9IAotCSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDJhYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIEoyRUVWaWV3ZXJTb3J0ZXIgajJlZVZpZXdTb3J0ZXIgPSBuZXcgSjJFRVZpZXdlclNvcnRlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlckxlZnRBcmcgPSBudWxsOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXJSaWdodEFyZyA9IG51bGw7Ci0KLQkJaWYgKG8xIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcHJvdmlkZXJIZWxwZXJMZWZ0QXJnID0gKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgbzE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXByb3ZpZGVySGVscGVyUmlnaHRBcmcgPSAoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvMjsKLQotCi0JCS8qIGlmIGJvdGggYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWlmIChwcm92aWRlckhlbHBlckxlZnRBcmcgIT0gbnVsbCAmJiBwcm92aWRlckhlbHBlclJpZ2h0QXJnICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvdmlkZXJIZWxwZXJMZWZ0QXJnLmdldFRleHQoKS5jb21wYXJlVG8ocHJvdmlkZXJIZWxwZXJSaWdodEFyZy5nZXRUZXh0KCkpOwotCQkvKiBpZiBleGFjdGx5IG9uZSBvZiB0aGUgYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWVsc2UgaWYgKHByb3ZpZGVySGVscGVyTGVmdEFyZyAhPSBudWxsICYmIG8yIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAocHJvdmlkZXJIZWxwZXJSaWdodEFyZyAhPSBudWxsICYmIG8xIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBqMmVlVmlld1NvcnRlci5jb21wYXJlKG51bGwsIG8xLCBvMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgSjJFRUNvbXBhcmF0b3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjlmYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5NZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GUm9vdE9iamVjdFByb3ZpZGVyLklSZWZyZXNoSGFuZGxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCXByaXZhdGUgZmluYWwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHJvb3RPYmplY3RQcm92aWRlcjsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHZpZXdlcklkID0gbnVsbDsKLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlciA9IG5ldyBFTUZSb290T2JqZWN0UHJvdmlkZXIoKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFQ29udGVudFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyID0gbmV3IEVNRlJvb3RPYmplY3RQcm92aWRlcigpOwotCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKGFWaWV3ZXJJZCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5hZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oYW5JbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlICYmICEoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSAmJiAhKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKQotCQkJCSYmICEoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYVBhcmVudEVsZW1lbnQpOwotCi0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJLy8gVmVyaWZ5IGlmIHRoZSBtb2RlbCAqaXMgYmVpbmcqCi0JCQkJLy8gbG9hZGVkIGFuZCBqdXN0IHJldHVybiB0aGUgcGxhY2UgaG9sZGVyCi0JCQkJaWYgKExvYWRpbmdERE5vZGUuaXNCZWluZ0xvYWRlZChwcm9qZWN0KSkgewotCQkJCQljaGlsZHJlbi5hZGQoTG9hZGluZ0RETm9kZS5jcmVhdGVQbGFjZUhvbGRlcihwcm9qZWN0KSk7Ci0KLQkJCQkJLy8gVmVyaWZ5IGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBsb2FkZWQsIGp1c3QgcmV0dXJuIGl0Ci0JCQkJfSBlbHNlIGlmIChyb290T2JqZWN0UHJvdmlkZXIuaGFzTG9hZGVkTW9kZWxzKHByb2plY3QpKSB7Ci0JCQkJCS8qIG1vZGVsIGFscmVhZHkgbG9hZGVkLCBqdXN0IHJldHVybiB0aGUgbW9kZWwgKi8KLQkJCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qocm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSkpOwotCi0JCQkJCS8vIE90aGVyd2lzZSByZXR1cm4gYSBwbGFjZSBob2xkZXIgbm9kZSBhbmQgc3RhcnQgbG9hZGluZwotCQkJCQkvLyBqb2IKLQkJCQl9IGVsc2UgewotCQkJCQlMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyID0gTG9hZGluZ0RETm9kZS5jcmVhdGVQbGFjZUhvbGRlcihwcm9qZWN0KTsKLQkJCQkJLyoKLQkJCQkJICogd2UgbmVlZCB0byBsb2FkIHRoZSBtb2RlbDsgcG9zc2libGUgbG9uZyBydW5uaW5nCi0JCQkJCSAqIG9wZXJhdGlvbgotCQkJCQkgKi8KLQkJCQkJaWYgKExvYWRpbmdERE5vZGUuY2FuQmVnaW5Mb2FkaW5nKHByb2plY3QpKQotCQkJCQkJbmV3IExvYWRpbmdEREpvYih2aWV3ZXIsIHBsYWNlSG9sZGVyLCAoSUFkYXB0YWJsZSkgYVBhcmVudEVsZW1lbnQsIHJvb3RPYmplY3RQcm92aWRlcikuc2NoZWR1bGUoKTsKLQkJCQkJY2hpbGRyZW4uYWRkKHBsYWNlSG9sZGVyKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IoYVBhcmVudEVsZW1lbnQpKQotCQkJcmV0dXJuIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmdldENoaWxkcmVuKGFQYXJlbnRFbGVtZW50KTsKLQkJZWxzZSAvKiBpZiAoaXNFTUZFZGl0T2JqZWN0KGFQYXJlbnRFbGVtZW50KSkgKi97Ci0JCQlPYmplY3RbXSBzaWJsaW5ncyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNpYmxpbmdzID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKMkVFTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsJCQl9Ci0JCQlpZiAoc2libGluZ3MgIT0gbnVsbCkKLQkJCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzaWJsaW5ncykpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKG9iamVjdCkpCi0JCQlyZXR1cm4gZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYocGFyZW50IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCXBhcmVudCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqZWN0KTsKLQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQkJcGFyZW50ID0gKChCZWFuQ2xhc3NQcm92aWRlckhlbHBlcikgb2JqZWN0KS5nZXRFamIoKTsKLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlwYXJlbnQgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIG9iamVjdCk7CQotCQkJfQotCQl9IAotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5yZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmRpc3Bvc2UoKTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihlbGVtZW50KSkKLQkJCXJldHVybiBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJLyogZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KGVsZW1lbnQpKSAqLwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsgCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQlTdHJpbmcgbmV3Vmlld2VySWQgPSBudWxsOwotCQl2aWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBhVmlld2VyOwotCQlpZiAoYVZpZXdlciBpbnN0YW5jZW9mIENvbW1vblZpZXdlcikKLQkJCW5ld1ZpZXdlcklkID0gKChDb21tb25WaWV3ZXIpIGFWaWV3ZXIpLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKTsKLQotCQlpZiAobmV3Vmlld2VySWQgIT0gbnVsbCAmJiAodmlld2VySWQgPT0gbnVsbCB8fCAhdmlld2VySWQuZXF1YWxzKG5ld1ZpZXdlcklkKSkpCi0JCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKG5ld1ZpZXdlcklkKTsKLQotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIGFuT2xkSW5wdXQsIGFOZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcklkMgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50UHJvdmlkZXJzKFN0cmluZyBhVmlld2VySWQpIHsKLQotCQkvKiBEaXNwb3NlIG9mIHRoZSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyAqLwotCQlpZiAoZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5kaXNwb3NlKCk7Ci0KLQkJLyogQ3JlYXRlIG5ldyBjb250ZW50IHByb3ZpZGVycyB1c2luZyB0aGUgbmV3IHZpZXdlciBpZCAqLwotCQlEeW5hbWljQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCk7Ci0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIgPSBuZXcgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8qIFJlbWVtYmVyIHRoZSB2aWV3ZXIgaWQgKi8KLQkJdmlld2VySWQgPSBhVmlld2VySWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0TWFuYWdlci5JUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciNvblJlZnJlc2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIHVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyICovCi0JCQkJSm9iIGpvYiA9IG5ldyBVSUpvYigiVXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgSm9iIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbmV3IElTY2hlZHVsaW5nUnVsZSgpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7CQotCQkJCQl9Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJam9iLnNldFJ1bGUocnVsZSk7Ci0JCQkJfQotCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTI4MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVFTUZBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVNRkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElGSUxFX0NMQVNTID0gSUZpbGUuY2xhc3M7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBFT0JKRUNUX0NMQVNTID0gRU9iamVjdC5jbGFzczsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRUVNRkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCWlmIChhZGFwdGVyVHlwZSA9PSBJRklMRV9DTEFTUyB8fCBhZGFwdGVyVHlwZSA9PSBJUkVTT1VSQ0VfQ0xBU1MpCi0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCQkvL2Vsc2UgaWYgKGFkYXB0ZXJUeXBlID09IElQUk9KRUNUX0NMQVNTKQotCQkJLy8JcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SVJFU09VUkNFX0NMQVNTLCBJRklMRV9DTEFTU307Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNlMDI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVMYWJlbFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShhVmlld2VySWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgPSBuZXcgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5JQ29tbW9uTGFiZWxQcm92aWRlciNnZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGFuRWxlbWVudCkgewotCQlpZiAoYW5FbGVtZW50ICE9IG51bGwgJiYgYW5FbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGFuRWxlbWVudDsKLQkJCWlmIChDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGVPYmosIHRydWUgLyogaW5jbHVkZSBlYXJzICovKSkgewotCQkJCUlQcm9qZWN0IHBhcmVudCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlT2JqKTsKLQkJCQlpZihlT2JqLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBuZXcgUGF0aChlT2JqLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCkpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBwYXRoOwotCQkJCQlpbnQgc3RhcnRJbmRleCA9IHBhdGguaW5kZXhPZihwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJcmV0dXJuIC0xID09IHN0YXJ0SW5kZXggPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFRleHQoZU9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5lcXVhbHMob2JqKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5maXJlTGFiZWxQcm92aWRlckNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXJldHVybiAoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTG9hZGluZ0RETm9kZSkKLQkJCXJldHVybiAoKExvYWRpbmdERE5vZGUpZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZSkKLQkJCXJldHVybiAoKEZpbGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmV0dXJuICgoSVByb2plY3QpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTG9hZGluZ0RETm9kZSkKLQkJCXJldHVybiAoKExvYWRpbmdERE5vZGUpZWxlbWVudCkuZ2V0VGV4dCgpOwotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5oYXNoQ29kZSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkob2JqZWN0LCBpZCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGFTaXRlKSB7Ci0JCWluaXRpYWxpemUoSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuVklFV0VSX0lEKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODIwZDkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEoyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVQcm9qZWN0RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVByb2plY3REZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5NjYzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVByb2plY3REZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLQotLyoqCi0gKiBKMkVFUHJvamVjdERlY29yYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVByb2plY3REZWNvcmF0b3IgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIEVBUjsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgQVBQQ0xJRU5UOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBEWU5BTUlDV0VCOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBFSkI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIENPTk5FQ1RPUjsKLSAgICAgIAotICAgIC8qIFRoZSBjb25zdGFudHMgYXJlIGR1cGxpY2F0ZWQgaGVyZSB0byBhdm9pZCBwbHVnaW4gbG9hZGluZy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0ZBQ0VUID0gImpzdC5lYXIiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRkFDRVQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQUNFVCA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0ZBQ0VUID0gImpzdC5lamIiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0ZBQ0VUID0gImpzdC51dGlsaXR5IjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0ZBQ0VUID0gImpzdC5jb25uZWN0b3IiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCX0ZBQ0VUID0gIndzdC53ZWIiOyAvLyROT04tTkxTLTEkIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RJUiA9ICJpY29ucy9mdWxsL292cjE2IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIAotICAgIHB1YmxpYyBKMkVFUHJvamVjdERlY29yYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLSAgICAJCi0gICAgCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLSAgICAJCWVsZW1lbnQgPSAoKElKYXZhUHJvamVjdCllbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0gICAgCX0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeyAgCi0gICAgCQotICAgICAgICAJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgCUltYWdlRGVzY3JpcHRvciBvdmVybGF5ID0gbnVsbDsKLQkJCWlmIChoYXNGYWNldChwcm9qZWN0LCBFQVJfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0RUFSKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBBUFBDTElFTlRfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0QVBQQ0xJRU5UKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBXRUJfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0RFlOQU1JQ1dFQigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgRUpCX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PWdldEVKQigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgQ09OTkVDVE9SX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PWdldENPTk5FQ1RPUigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgU1RBVElDX1dFQl9GQUNFVCkpCi0JCQkJb3ZlcmxheT1nZXREWU5BTUlDV0VCKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBVVElMSVRZX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PW51bGw7Ci0JCQkKLQkJCWlmIChvdmVybGF5ICE9IG51bGwpCi0JCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KG92ZXJsYXkpOyAKLSAgICAgICAgfQotCX0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNGYWNldChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgZmFjZXQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQlKMkVFTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVIpLmFwcGVuZChnaWYpOwotCQkJVVJMIGdpZkltYWdlVVJMID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQpLCBwYXRoLCBudWxsKTsKLQkJCWlmIChnaWZJbWFnZVVSTCAhPSBudWxsKQotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRFQVIoKSB7Ci0gICAgCWlmIChFQVIgPT0gbnVsbCkgewotICAgIAkJRUFSID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbnRlcnByaXNlX2FwcF9vdnIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgCXJldHVybiBFQVI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRBUFBDTElFTlQoKSB7Ci0gICAgCWlmIChBUFBDTElFTlQgPT0gbnVsbCkgewotICAgIAkJQVBQQ0xJRU5UID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJjbGllbnRfYXBwX292ciIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICAJcmV0dXJuIEFQUENMSUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldERZTkFNSUNXRUIoKSB7Ci0gICAgCWlmIChEWU5BTUlDV0VCID09IG51bGwpIHsKLSAgICAJCURZTkFNSUNXRUIgPSBnZXRJbWFnZURlc2NyaXB0b3IoIndlYl9tb2R1bGVfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gRFlOQU1JQ1dFQjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVKQigpIHsKLSAgICAJaWYgKEVKQiA9PSBudWxsKSB7Ci0gICAgCQlFSkIgPSBnZXRJbWFnZURlc2NyaXB0b3IoImVqYl9tb2R1bGVfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gRUpCOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0Q09OTkVDVE9SKCkgewotICAgIAlpZiAoQ09OTkVDVE9SID09IG51bGwpIHsKLSAgICAJCUNPTk5FQ1RPUiA9IGdldEltYWdlRGVzY3JpcHRvcigiY29ubmVjdG9yX292ciIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICAJcmV0dXJuIENPTk5FQ1RPUjsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzFiZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFVmlld2VyU29ydGVyLgotCSAqLwotCXB1YmxpYyBKMkVFVmlld2VyU29ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU1QgPSAib3JnLmVjbGlwc2Uud3N0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1QgPSAib3JnLmVjbGlwc2UuanN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkvLyBDaGVjayB0byBzZWUgaWYgZWFjaCBvYmplY3QgaXMgYSBiYXNlIFdTVCBvciBKU1QgY29yZSBjb250cmlidXRpb24KLQkJYm9vbGVhbiBlMV9pc0NvcmUgPSBpc0NvcmUoZTEpOwotCQlib29sZWFuIGUyX2lzQ29yZSA9IGlzQ29yZShlMik7Ci0JCS8vIElmIGJvdGggZWxlbWVudHMgYXJlIGZyb20gdGhlIHNhbWUgY2F0ZWdvcnksIGRvIGRlZmF1bHQgY29tcGFyaXNvbgotCQlpZiAoZTFfaXNDb3JlID09IGUyX2lzQ29yZSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJLy8gSWYgZTEgaXMgY29yZSwgYnV0IG5vdCBlMiwgZTEgaXMgbGVzcyB0aGFuIGUyCi0JCWVsc2UgaWYgKGUxX2lzQ29yZSkKLQkJCXJldHVybiAtMTsKLQkJLy8gSWYgZTEgaXMgbm90IGNvcmUsIGJ1dCBlMiBpcywgZTEgaXMgZ3JlYXRlciB0aGFuIGUyCi0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQkKLQkvKioKLQkgKiBBbnkgY29udHJpYnV0aW9uIGZyb20gdGhlIGJhc2UgSlNUIG9yIFdTVCBwYWNrYWdlcyBpcyBjb25zaWRlcmVkIGNvcmUsIGV2ZXJ5dGhpbmcgZWxzZSBpcwotCSAqIGFuIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIGlzIENvbnRyaWJ1dGlvbiBDb3JlPwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvcmUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ2xhc3MgY2xhenogPSBlbGVtZW50LmdldENsYXNzKCk7Ci0JCQlpZiAoY2xhenogIT0gbnVsbCkgewotCQkJCVBhY2thZ2UgcGFjayA9IGNsYXp6LmdldFBhY2thZ2UoKTsKLQkJCQlpZiAocGFjayAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2suZ2V0TmFtZSgpOwotCQkJCQlyZXR1cm4gcGFja2FnZU5hbWUhPW51bGwgJiYgKHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoV1NUKSB8fCBwYWNrYWdlTmFtZS5zdGFydHNXaXRoKEpTVCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlQmVhbihPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvKSB7Ci0JCXJldHVybiBDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNvcnQoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIChpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMSkgJiYgaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZTIpKSB8fCAoaXNFbnRlcnByaXNlQmVhbihlMSkgJiYgaXNFbnRlcnByaXNlQmVhbihlMikpIHx8ICgoZTEgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKGUyIGluc3RhbmNlb2YgSUZpbGUpKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdEREpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdEREpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU2ODU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nRERKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIExvYWRpbmdEREpvYiBleHRlbmRzIEpvYiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHJpdmF0ZSBFTUZSb290T2JqZWN0UHJvdmlkZXIgcm9vdE9iamVjdFByb3ZpZGVyOwotCXByaXZhdGUgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlcjsKLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJQWRhcHRhYmxlIHBhcmVudDsKLQotCXB1YmxpYyBMb2FkaW5nRERKb2IoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciwgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlciwgSUFkYXB0YWJsZSBwYXJlbnQsIEVNRlJvb3RPYmplY3RQcm92aWRlciByb290T2JqZWN0UHJvdmlkZXIpIHsKLQkJc3VwZXIocGxhY2VIb2xkZXIuZ2V0VGV4dCgpKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMucGxhY2VIb2xkZXIgPSBwbGFjZUhvbGRlcjsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucm9vdE9iamVjdFByb3ZpZGVyID0gcm9vdE9iamVjdFByb3ZpZGVyOwotCQlzZXRSdWxlKG5ldyBOb25Db25mbGljdGluZ1J1bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeyAKLQotCQlMb2FkaW5nRERVSUpvYiB1cGRhdGVVSUpvYiA9IG5ldyBMb2FkaW5nRERVSUpvYih2aWV3ZXIsIHBsYWNlSG9sZGVyKTsKLQkJdXBkYXRlVUlKb2Iuc2NoZWR1bGUoKTsKLQotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAgKElQcm9qZWN0KSAgcGFyZW50LmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQkJT2JqZWN0W10gcm9vdE9iamVjdHMgPSAocm9vdE9iamVjdFByb3ZpZGVyICE9IG51bGwpID8gcm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSA6IG51bGw7Ci0JCQlpZiAocm9vdE9iamVjdHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IHg9MDsgeDwgcm9vdE9iamVjdHMubGVuZ3RoIDsgKyt4KSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChyb290T2JqZWN0c1t4XSk7Ci0JCQkJfQotCQkJCQotCQkJfQkJCi0JCX0gZmluYWxseSB7IAotCQkJLyogZGlzcG9zZSBvZiB0aGUgcGxhY2UgaG9sZGVyLCBjYXVzZXMgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBhbmltYXRpb24gam9iICovCi0JCQlwbGFjZUhvbGRlci5kaXNwb3NlKCk7IAotCQkJbmV3IENsZWFyUGxhY2VIb2xkZXJKb2Iodmlld2VyLCBwbGFjZUhvbGRlciwgcGFyZW50LCBjaGlsZHJlbi50b0FycmF5KCkpLnNjaGVkdWxlKCk7Ci0JCX0KLQkJCi0JCSAKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RETm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdERE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliZWU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RETm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIExvYWRpbmdERE5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdPbmU7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdUd287Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdUaHJlZTsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgbG9hZGluZ0ZvdXI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgbG9hZGluZ0ZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgcGxhY2VIb2xkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlsb2FkaW5nT25lID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzEuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvYWRpbmdUd28gPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9sb2FkaW5nMi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9hZGluZ1RocmVlID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvYWRpbmdGb3VyID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSjJFRU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBtc2csIGUpOwotCQkJbG9hZGluZ09uZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlsb2FkaW5nVHdvID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWxvYWRpbmdUaHJlZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlsb2FkaW5nRm91ciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0gCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsgCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDE7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDM7Ci0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBtb2RlbFByb2plY3Q7Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBwbGFjZSBob2xkZXIgbm9kZSB0byBzaXQgaW4gdGhlIHRyZWUgdW50aWwgZGF0YSBpcyBhdmFpbGFibGUuCi0JICogVGhpcyBwbGFjZSBob2xkZXIgbm9kZSB3aWxsIGJlIGFuaW1hdGVkIGZvciB0aGUgdXNlcidzIGVuam95bWVudC4gCi0JICogIAotCSAqIEBwYXJhbSBtb2RlbEZpbGUgVGhlIG1vZGVsRmlsZSB0byBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIEEgbmV3IHVuaXF1ZSBwbGFjZSBob2xkZXIgZm9yIHRoaXMgZmlsZSBmb3IgYSBnaXZlbiBsb2FkIGN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2FkaW5nREROb2RlIGNyZWF0ZVBsYWNlSG9sZGVyKElQcm9qZWN0IG1vZGVsRmlsZSkgewotCQlMb2FkaW5nREROb2RlIG5vZGUgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsKLQkJCWlmKHBsYWNlSG9sZGVycy5jb250YWluc0tleShtb2RlbEZpbGUpKQotCQkJCW5vZGUgPSAoTG9hZGluZ0RETm9kZSkgcGxhY2VIb2xkZXJzLmdldChtb2RlbEZpbGUpOwotCQkJZWxzZSAJCQkKLQkJCQlwbGFjZUhvbGRlcnMucHV0KG1vZGVsRmlsZSwgbm9kZSA9IG5ldyBMb2FkaW5nREROb2RlKG1vZGVsRmlsZSkpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQlwdWJsaWMgTG9hZGluZ0RETm9kZShJUHJvamVjdCBtb2RlbCkgewotCQl0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMuTG9hZGluZ0RETm9kZV9Mb2FkaW5nXzBfLCBtb2RlbC5nZXROYW1lKCkpOwotCQl0ZXh0MSA9IHRleHQgICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCXRleHQyID0gdGV4dCAgKyAiLi4iOyAvLyROT04tTkxTLTEkCi0JCXRleHQzID0gdGV4dCAgKyAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCQltb2RlbFByb2plY3QgPSBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0KLQkJc3dpdGNoICggY291bnQgJSA0KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0ZXh0OwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdGV4dDE7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0ZXh0MjsKLQkJCWNhc2UgMyA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdGV4dDM7Ci0JCX0gCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlzd2l0Y2ggKCBjb3VudCA9ICgrK2NvdW50ICUgNCkpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGxvYWRpbmdPbmUpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UobG9hZGluZ1R3byk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShsb2FkaW5nVGhyZWUpOwotCQkJY2FzZSAzIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShsb2FkaW5nRm91cik7Ci0JCX0KLQl9IAotCQotCQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkIChMb2FkaW5nREROb2RlLmNsYXNzKSB7Ci0JCQlkaXNwb3NlZCA9IHRydWU7Ci0JCQlwbGFjZUhvbGRlcnMucmVtb3ZlKG1vZGVsUHJvamVjdCk7CQotCQkJbG9hZGluZ0ZpbGVzLnJlbW92ZShtb2RlbFByb2plY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW1wbG95IGEgVGVzdCBhbmQgU2V0IChUU1QpIHByaW1pdGl2ZSB0byBlbnN1cmUgCi0JICogdGhhdCBvbmx5IGpvYiBpcyBzcGF3bmVkIHRvIGxvYWQgdGhlIG1vZGVsIGZpbGUKLQkgKiAgIAotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBvbmx5IGlmIG5vIG90aGVyIGpvYnMgYXJlIHRyeWluZyB0byBsb2FkIHRoaXMgbW9kZWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkJlZ2luTG9hZGluZyhJUHJvamVjdCBtb2RlbFByb2plY3QpIHsKLQkJc3luY2hyb25pemVkIChMb2FkaW5nREROb2RlLmNsYXNzKSB7ICAKLQkJCWlmKGxvYWRpbmdGaWxlcy5jb250YWlucyhtb2RlbFByb2plY3QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWxvYWRpbmdGaWxlcy5hZGQobW9kZWxQcm9qZWN0KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIGpvYiBoYXMgcmVxdWVzdGVkIHBlcm1pc3Npb24gdG8gbG9hZCB0aGUgbW9kZWwgZmlsZSAgIAotCSAqIEBwYXJhbSBtb2RlbEZpbGUgVGhlIG1vZGVsIGZpbGUgdGhhdCBzaG91bGQgYmUgbG9hZGVkCi0JICogQHJldHVybiBUcnVlIG9ubHkgaWYgYSBqb2IgaXMgdHJ5aW5nIHRvIGxvYWQgdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JlaW5nTG9hZGVkKElQcm9qZWN0IG1vZGVsUHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsgIAotCQkJcmV0dXJuIGxvYWRpbmdGaWxlcy5jb250YWlucyhtb2RlbFByb2plY3QpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdERFVJSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0REVUlKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkYTRjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0REVUlKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotCi1wdWJsaWMgY2xhc3MgTG9hZGluZ0REVUlKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMjAwOwotCSAgCi0JcHJpdmF0ZSBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7IAotCSAKLQlwdWJsaWMgTG9hZGluZ0REVUlKb2IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIExvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXIpIHsKLQkJc3VwZXIocGxhY2VIb2xkZXIuZ2V0VGV4dCgpKTsgCi0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLnBsYWNlSG9sZGVyID0gcGxhY2VIb2xkZXI7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJc2V0UnVsZShuZXcgTm9uQ29uZmxpY3RpbmdSdWxlKCkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7ICAKLQotCQlpZighcGxhY2VIb2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl2aWV3ZXIucmVmcmVzaChwbGFjZUhvbGRlciwgdHJ1ZSk7CQkJCi0JCQlzY2hlZHVsZShERUxBWSk7CQkKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uQ29uZmxpY3RpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uQ29uZmxpY3RpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjk5MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkNvbmZsaWN0aW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1wdWJsaWMgY2xhc3MgTm9uQ29uZmxpY3RpbmdSdWxlIGltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE5vbkNvbmZsaWN0aW5nUnVsZSBJTlNUQU5DRSA9IG5ldyBOb25Db25mbGljdGluZ1J1bGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7IAotCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsgCi0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEyOTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyIGV4dGVuZHMgRU1GTW9kZWxNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXJ7Ci0KLQlwcml2YXRlIEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3Qgcm9vdE9iamVjdDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1QgPSBuZXcgT2JqZWN0WzBdOwotCS8qKgotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBOb25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihJUHJvamVjdCBhUHJvamVjdCwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFQcm9qZWN0LCBwcm92aWRlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZNb2RlbE1hbmFnZXIjZ2V0TW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0TW9kZWxzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCB8fCAhZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJCi0JCS8vc3luY2hyb25pemVkIChyb290T2JqZWN0KSB7Ci0JCQlpZiAocm9vdE9iamVjdCA9PSBudWxsIHx8ICgoRU9iamVjdCkgcm9vdE9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFZGl0TW9kZWwoKTsKLQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQkJcm9vdE9iamVjdCA9IGVkaXRNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQkJCX0KLQkJCX0KLQkJLy99Ci0JCWlmIChyb290T2JqZWN0PT1udWxsKSAKLQkJCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlvYmplY3RzWzBdID0gcm9vdE9iamVjdDsKLQkJCXJldHVybiBvYmplY3RzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJZWRpdE1vZGVsID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQlzd2l0Y2ggKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpIHsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogCi0JCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCl7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJICAgICB9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOiB7Ci0JCQkJaWYgKHJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCX0KLQkKLQkKLQotCXByb3RlY3RlZCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvL1RPRE8gZml4IHVwCi0JCS8vc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLS8vCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFZGl0TW9kZWxGb3JQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7Ci0vLwkJCQlKMkVFTmF0dXJlIG5hdHVyZSA9IEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCQlpZiAobmF0dXJlICE9IG51bGwpIHsKLS8vCQkJCQllZGl0TW9kZWwgPSBuYXR1cmUuZ2V0SjJFRUVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0vLwkJCQkJCWVkaXRNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJLy99Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VDYWNoZShJUHJvamVjdCBhZmZlY3RlZFByb2plY3QpIHsKLQkJLy9zeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJCWVkaXRNb2RlbCA9IG51bGw7Ci0JCQl9Ci0JCS8vfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZEV4dGVybmFsVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlJlc291cmNlRHJvcEFkYXB0ZXJBc3Npc3RhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VEcm9wQWRhcHRlckFzc2lzdGFudCB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3IuZG5kLlJlc291cmNlRHJvcEFjdGlvbiN2YWxpZGF0ZURyb3Aob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKENvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCS8vVE9ETyByZWRvIHdpdGggY29tcG9uZW50cwotLy8JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotLy8JCQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCi0vLwkJCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0vLwkJCQkJCWlmICghKHJlc3VsdCA9IHNvdXJjZU5hbWVzWzBdLmVuZHNXaXRoKCIuamFyIikpKWJyZWFrOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGExNzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXJBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdDsKLQotcHVibGljIGNsYXNzIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQgZXh0ZW5kcyBDb21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHVibGljIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZShUcmFuc2ZlckRhdGEgYVRyYW5zZmVyVHlwZSkgewkKLQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoYVRyYW5zZmVyVHlwZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChDb21tb25Ecm9wQWRhcHRlciBhRHJvcEFkYXB0ZXIsIERyb3BUYXJnZXRFdmVudCBhRHJvcFRhcmdldEV2ZW50LCBmaW5hbCBPYmplY3QgYVRhcmdldCkgewotCi0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGFEcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKSkpIHsKLQotCQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkJCi0JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gZ2V0UHJvamVjdChhVGFyZ2V0KTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwotCi0JCQlKb2IgYWRkUHJvamVjdFRvRWFySm9iID0gbmV3IEpvYihnZXRKb2JUaXRsZShlYXJDb21wb25lbnQpKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSBnZXRQcm9qZWN0KGFUYXJnZXQpOwotCi0JCQkJCQlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJIAotCQkJCQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHNvdXJjZU9iamVjdCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQkJCUlQcm9qZWN0IHByb2plY3RUb0FkZCA9IGdldFByb2plY3Qoc291cmNlT2JqZWN0KTsKLQkJCQkJCQlpZiAocHJvamVjdFRvQWRkICE9IG51bGwpIAotCQkJCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdFRvQWRkKTsgCi0JCQkJCQl9Ci0KLQkJCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0QWRkTW9kdWxlRGF0YU1vZGVsKGVhclByb2plY3QsIHByb2plY3RzKTsKLQkJCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBkcm9wT3BlcmF0aW9uID0gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJCQkJCXN0YXR1cyA9IGRyb3BPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfTsKLQkJCXNlcnZpY2Uuc2hvd0luRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgYWRkUHJvamVjdFRvRWFySm9iKTsKLQkJCWFkZFByb2plY3RUb0VhckpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkJYWRkUHJvamVjdFRvRWFySm9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpIHx8IFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQkKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KTsKLQkJCQlpbnQgZWFyVmVyc2lvbiA9IGdldEVhclZlcnNpb24oZWFyUHJvamVjdCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJSVByb2plY3QgcHJvamVjdFRvQWRkID0gZ2V0UHJvamVjdChuZXh0KTsKLQkJCQkJaWYoIChzdGF0dXMgPSB2YWxpZGF0ZVByb2plY3RNYXlCZUFkZGVkKGVhclByb2plY3QsIHByb2plY3RUb0FkZCwgZWFyVmVyc2lvbikpLmlzT0soKSkgCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE1heUJlQWRkZWQoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbikgewotCQkKLQkJaWYgKGVhclByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0VG9BZGQgPT0gbnVsbCB8fCBlYXJWZXJzaW9uIDwgMCkKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV8sIG51bGwpOwotCQllbHNlIGlmICghZWFyUHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTkxTLmJpbmQoTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXywgZWFyUHJvamVjdC5nZXROYW1lKCkpLCBudWxsKTsKLQkJfSBlbHNlIGlmICghcHJvamVjdFRvQWRkLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXywgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWFyVmVyc2lvbiA+IDE0KXsKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV8sIG51bGwpOwotCQl9Ci0KLQkJSVN0YXR1cyBpc1ZhbGlkID0gdmFsaWRhdGVQcm9qZWN0VG9BZGQocHJvamVjdFRvQWRkLCBlYXJWZXJzaW9uKTsKLQkJaWYgKCFpc1ZhbGlkLmlzT0soKSkgewotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQkJLy8gVE9ETyBDaGVjayBpZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSAqLmVhcgotCQkvLyBpZiAoZWRpdE1vZGVsLmhhc01hcHBpbmdUb1Byb2plY3QocHJvamVjdFRvQWRkKSkgewotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIH0gCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0JCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiAtMSBvbiBlcnJvciAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEVhclZlcnNpb24oSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpbnQgZWFyVmVyc2lvbiA9IC0xOwotCQkKLQkgICAgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0JCQkgSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oRWFyVXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpOwotCQkJIGVhclZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9ub3RoaW5nIHRvIGRvIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQgc2luY2UgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZmFjZXRlZCBwcm9qZWN0LiAKLQkJCUoyRUVOYXZpZ2F0b3JQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBlYXJWZXJzaW9uOwotCX0KLQkJCi0JLyoqCi0JICogQHBhcmFtIGZhY2V0ZWRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0VhckZhY2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7IAotCQl9Ci0JCXJldHVybiBmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjYWxjdWxhdGVWYWxpZFByb2plY3ROYW1lKGZpbmFsIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsgCi0KLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyB2YWxpZE5hbWUgPSBvcmlnaW5hbE5hbWU7Ci0JCWludCBjb3VudCA9IDE7Ci0JCXdoaWxlIChyb290LmdldFByb2plY3QodmFsaWROYW1lKS5leGlzdHMoKSkgewotCQkJdmFsaWROYW1lID0gb3JpZ2luYWxOYW1lICsgY291bnQrKzsKLQkJfQotCQlyZXR1cm4gdmFsaWROYW1lOwkJCQkJCi0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldEFkZE1vZHVsZURhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBMaXN0IHByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YW1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKLQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSBudWxsOwotCQlmb3IoSXRlcmF0b3IgaXRyID0gcHJvamVjdHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQltb2R1bGVDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpaXRyLm5leHQoKSk7IAotCQkJY29tcG9uZW50cy5hZGQobW9kdWxlQ29tcG9uZW50KTsKLQkJCWNvbXBvbmVudFRvVVJJTWFwLnB1dChtb2R1bGVDb21wb25lbnQsIGdldERlZmF1bHRVUkkobW9kdWxlQ29tcG9uZW50KSk7IAotCQl9CQkKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50cyk7CQkKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXApOwotCQlyZXR1cm4gZGF0YW1vZGVsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7IAotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfLCBlYXJDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQl9ICAKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyBub3QgYW4gRUFSIGl0c2VsZgotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCk7ICAKLQkJCWlmKCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpICkgCi0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQllbHNlIAotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyB3aXRoIEphdmEgRUUgdmVyc2lvbiBlcXVhbCBvciBsZXNzZXIgdGhhbiB0aGF0IG9mIHRoZSBFQVIKLQkJCVN0cmluZyB2ZXJTdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24ocHJvamVjdFRvQWRkKTsKLQkJCWlmICh2ZXJTdHIgIT0gbnVsbCkgewotCQkJCWludCB2ZXJzaW9uOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJTdHIpOwotCQkJCQotCQkJCWlmICh2ZXJzaW9uID4gZWFyVmVyc2lvbikgCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCWVsc2UgCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCQkgCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCWVsc2UKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihlbGVtZW50LCBJUFJPSkVDVF9DTEFTUyk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUZpbGUgYXNzb2NpYXRlZEZpbGUgPSAoKEoyRUVJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0QXNzb2NpYXRlZEZpbGUoKTsKLQkJCQlpZihhc3NvY2lhdGVkRmlsZSAhPSBudWxsKQotCQkJCQlwcm9qZWN0ID0gYXNzb2NpYXRlZEZpbGUuZ2V0UHJvamVjdCgpOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VVJJKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9FQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9SQVI7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTlhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JTW9kdWxlRXh0ZW5zaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRXh0ZW5zaW9ucyB7Ci0KLQlTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfSkFSID0iLmphciI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIERPVF9SQVIgPSAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRE9UX0VBUiA9ICIuZWFyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQ5ZTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRUpCQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQgZXh0ZW5kcyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50IHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZFR5cGUoVHJhbnNmZXJEYXRhIGFUcmFuc2ZlclR5cGUpIHsgCi0JCXJldHVybiBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYVRyYW5zZmVyVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGhhbmRsZURyb3AoQ29tbW9uRHJvcEFkYXB0ZXIgYURyb3BBZGFwdGVyLCBmaW5hbCBEcm9wVGFyZ2V0RXZlbnQgYURyb3BUYXJnZXRFdmVudCwgZmluYWwgT2JqZWN0IGFUYXJnZXQpIHsJCQotCQkKLQkJaWYoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGFEcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKSkpIHsKLQkJCQotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkKLQkJCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7CSAKLQkJCUpvYiBpbXBvcnRBcnRpZmFjdHNKb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHMpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkJCQkKLQkJCQkJCi0JCQkJCUlQcm9qZWN0IHRhcmdldEVBUlByb2plY3QgPSBnZXRQcm9qZWN0KGFUYXJnZXQpOwotCQkJCQlpZih0YXJnZXRFQVJQcm9qZWN0ICE9IG51bGwpIHsgCi0JCQkJCQkvKiBJZiB0aGlzIGlzbid0IGFuIGVhciBwcm9qZWN0LCB3ZSBjYW4ndCBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgbW9kdWxlcyB0byBpdC4gKi8KLQkJCQkJCWlmKCFoYXNFYXJGYWNldCh0YXJnZXRFQVJQcm9qZWN0KSkKLQkJCQkJCQl0YXJnZXRFQVJQcm9qZWN0ID0gbnVsbDsKLQkJCQkJfSAvKiBvdGhlcndpc2Ugd2UgYXNzdW1lIHRoZSBJV29ya3NwYWNlUm9vdCBhbmQganVzdCBkb24ndCBhZGQgdGhlIG5ldyBtb2R1bGVzIGFuIGFuIGV4aXN0aW5nIGVhciAqLwotCi0JCQkJCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBhRHJvcFRhcmdldEV2ZW50LmRhdGE7Ci0JCQkJCQotCQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzLCBuYW1lcy5sZW5ndGgpOwotCQkJCQlmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHMsIG51bGwpOwotCQkJCQkKLQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKTsKLQkJCQkJSURhdGFNb2RlbCBpbXBvcnREYXRhTW9kZWwgPSBudWxsOwotCQkJCQlib29sZWFuIHBlcmZvcm1TaW1wbGVKYXJDb3B5ID0gZmFsc2U7Ci0JCQkJCUxpc3Qgc2ltcGxlSmFyc1RvQ29weUxpc3QgPSBudWxsOwotCQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkJTGlzdCBjcmVhdGVkQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWltcG9ydERhdGFNb2RlbCA9IG51bGw7Ci0JCQkJCQkJcGVyZm9ybVNpbXBsZUphckNvcHkgPSBmYWxzZTsKLQkJCQkJCQlpbnQgc2VwYXJhdG9ySW5kZXggPSBuYW1lc1tpXS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJCQkJCWludCBkb3RJbmRleCA9IG5hbWVzW2ldLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJCQkJaWYoc2VwYXJhdG9ySW5kZXggPiAwICYmIHNlcGFyYXRvckluZGV4KzEgPCBkb3RJbmRleCkgewotCQkJCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBuYW1lc1tpXS5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXgrMSwgZG90SW5kZXgpOwotCQkJCQkJCQlpZihyb290LmdldFByb2plY3QoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlmaWxlbmFtZSA9IGNhbGN1bGF0ZVZhbGlkUHJvamVjdE5hbWUoZmlsZW5hbWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSBuYW1lc1tpXS5zdWJzdHJpbmcoZG90SW5kZXgpOwotCQkJCQkJCQlpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfUkFSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfRUFSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSLmVxdWFscyhleHRlbnNpb24pKSB7ICAJCQkJCQkJCQkKLQkJCQkJCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkFyY2hpdmUobmFtZXNbaV0pOwotCQkJCQkJCQkJCWlmKGFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJCQkJCWVsc2UgaWYoYXJjaGl2ZS5pc0VKQkphckZpbGUoKSkKLQkJCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVKQkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwZXJmb3JtU2ltcGxlSmFyQ29weSA9IHRydWU7IC8vaGFuZGxlIFV0aWxpdHkgamFycyBhcyByZWd1bGFyIGphcnMuCi0JCQkJCQkJCQkJCWlmKHNpbXBsZUphcnNUb0NvcHlMaXN0ID09IG51bGwpewotCQkJCQkJCQkJCQkJc2ltcGxlSmFyc1RvQ29weUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQkJCQlzaW1wbGVKYXJzVG9Db3B5TGlzdC5hZGQobmFtZXNbaV0pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlpZihhcmNoaXZlICE9IG51bGwpCi0JCQkJCQkJCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSAKLQkJCQkJCQkJCi0JCQkJCQkJCWlmKGltcG9ydERhdGFNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgbmFtZXNbaV0pOwotCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGZpbGVuYW1lKTsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShzdWJtb25pdG9yLCBudWxsKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJY3JlYXRlZENvbXBvbmVudHMuYWRkKChJVmlydHVhbENvbXBvbmVudCkgaW1wb3J0RGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpKTsKLQkJCQkJCQkJCQotCQkJCQkJCQl9IGVsc2UgaWYoIXBlcmZvcm1TaW1wbGVKYXJDb3B5KXsKLQkJCQkJCQkJCXN0YXR1cy5hZGQoSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBOTFMuYmluZChNZXNzYWdlcy5JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXywgZXh0ZW5zaW9uKSwgbnVsbCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCX0gCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJc3RhdHVzLmFkZChKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIG1zZywgZSkpOwotCQkJCQkJfSAJCQkJCQkKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYodGFyZ2V0RUFSUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IGNyZWF0ZWRNb2R1bGVQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvcihpbnQgaT0wOyBpPGNyZWF0ZWRDb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjcmVhdGVkQ29tcG9uZW50cy5nZXQoaSk7CQkJCQkJCQotCQkJCQkJCS8qIElmIHRoaXMgaXNuJ3QgYW4gZWFyIHByb2plY3QsIHdlIGNhbid0IGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBtb2R1bGVzIHRvIGl0LiAqLwotCQkJCQkJCWlmKCFoYXNFYXJGYWNldChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQljcmVhdGVkTW9kdWxlUHJvamVjdHMuYWRkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0QWRkTW9kdWxlRGF0YU1vZGVsKHRhcmdldEVBUlByb2plY3QsIGNyZWF0ZWRNb2R1bGVQcm9qZWN0cyk7Ci0JCQkJCQlJVW5kb2FibGVPcGVyYXRpb24gZHJvcE9wZXJhdGlvbiA9IGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCQkJCQlJU3RhdHVzIGFkZFByb2plY3RzU3RhdHVzID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYWRkUHJvamVjdHNTdGF0dXMgPSBkcm9wT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCQkJaWYoYWRkUHJvamVjdHNTdGF0dXMgIT0gbnVsbCkKLQkJCQkJCQkJc3RhdHVzLmFkZChhZGRQcm9qZWN0c1N0YXR1cyk7Ci0JCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeyAKLQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJCXN0YXR1cy5hZGQoSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJCS8vY29weSB0aGUgc2ltcGxlSmFyc092ZXIKLQkJCQkJCWlmKHNpbXBsZUphcnNUb0NvcHlMaXN0ICE9IG51bGwgKXsKLQkJCQkJCQl0cnl7Ci0JCQkJCQkJCWZpbmFsIFN0cmluZyBbXSBqYXJzVG9Db3B5QXJyYXkgPSBuZXcgU3RyaW5nW3NpbXBsZUphcnNUb0NvcHlMaXN0LnNpemUoKV07Ci0JCQkJCQkJCXNpbXBsZUphcnNUb0NvcHlMaXN0LnRvQXJyYXkoamFyc1RvQ29weUFycmF5KTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oc2hlbGwpOwotCQkJCQkJCQlvcGVyYXRpb24uY29weUZpbGVzSW5DdXJyZW50VGhyZWFkKGphcnNUb0NvcHlBcnJheSwgdGFyZ2V0RUFSUHJvamVjdCwgbW9uaXRvcik7Ci0JCQkJCQkJfWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJCQlzdGF0dXMuYWRkKEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKSk7Ci0JCQkJCQkJfSAJCi0JCQkJCQl9CQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQotCQkJfTsKLQkJCQotCQkJc2VydmljZS5zaG93SW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBpbXBvcnRBcnRpZmFjdHNKb2IpOwotCQkJaW1wb3J0QXJ0aWZhY3RzSm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlpbXBvcnRBcnRpZmFjdHNKb2Iuc2NoZWR1bGUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0JCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQlpZihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkJCQotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQllbHNlIGlmKCAocHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KSkgIT0gbnVsbCAmJiBoYXNFYXJGYWNldChwcm9qZWN0KSkKLQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDJjZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9KMkVFSW1wb3J0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwNAotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklEcm9wQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFSW1wb3J0RHJvcEFjdGlvbiBpbXBsZW1lbnRzIElEcm9wQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgcmVhZE9ubHlBcmNoaXZlT3B0aW9uczsKLQotCXB1YmxpYyBKMkVFSW1wb3J0RHJvcEFjdGlvbigpIHsKLQkJcmVhZE9ubHlBcmNoaXZlT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlyZWFkT25seUFyY2hpdmVPcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZpbGVFeGlzdHNPbkRpc2soU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCXJldHVybiBmaWxlLmV4aXN0cygpICYmICFmaWxlLmlzRGlyZWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25Ecm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsIHx8IHNvdXJjZU5hbWVzLmxlbmd0aCAhPSAxKSB7IC8vb25seSBoYW5kbGUgb25lIGZpbGUgZm9yIG5vdwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IHNvdXJjZU5hbWVzWzBdOwotCQkJaWYgKCEoZmlsZU5hbWUuZW5kc1dpdGgoIi5lYXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIud2FyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5yYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLS8vCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLS8vCQkJCWFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlKTsKLS8vCQkJCVN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlcyA9IG51bGw7Ci0vLwkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQsIElDb25uZWN0b3JOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJZGVmYXVsdCA6Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cyBhbmQgYXJ0aWZhY3QgZWRpdHMKLS8vCQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlib29sZWFuIGZvdW5kTmF0dXJlID0gZmFsc2U7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyAhZm91bmROYXR1cmUgJiYgaSA8IHBvc3NpYmxlTmF0dXJlcy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlc1tpXSkpIHsKLS8vCQkJCQkJCQlmb3VuZE5hdHVyZSA9IHRydWU7Ci0vLwkJCQkJCQkJSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUocG9zc2libGVOYXR1cmVzW2ldKTsKLS8vCQkJCQkJCQlpbnQgcHJvamVjdEoyRUVWZXJzaW9uID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0vLwkJCQkJCQkJaW50IGFyY2hpdmVNb2R1bGVWZXJzaW9uID0gQXJjaGl2ZVV0aWwuZ2V0RmFzdFNwZWNWZXJzaW9uKChNb2R1bGVGaWxlKSBhcmNoaXZlKTsKLS8vCQkJCQkJCQlib29sZWFuIGZhaWwgPSBmYWxzZTsKLS8vCQkJCQkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA8IGFyY2hpdmVNb2R1bGVWZXJzaW9uKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJCQkJCWlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgJiYgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQlpZiAoZmFpbCkgewotLy8JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmICghZm91bmROYXR1cmUpIHsKLS8vCQkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJLy9UT0RPIGZpeCB1cCBkcmFnIGFuZCBkcm9wIHRyYW5zZmVyCi0JCVRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBudWxsOyAvL2Ryb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpOwotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGN1cnJlbnRUcmFuc2ZlcikpIHsKLQkJCWZpbmFsIFN0cmluZ1tdIGZpbGVOYW1lcyA9IChTdHJpbmdbXSkgc291cmNlOwotCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZmlsZU5hbWVzWzBdOwotCQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0KLQkJCWludCBhcmNoaXZlVHlwZSA9IEltcG9ydFV0aWwuVU5LTk9XTjsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJCQlhcmNoaXZlVHlwZSA9IEltcG9ydFV0aWwuZ2V0QXJjaGl2ZVR5cGUoYXJjaGl2ZSk7Ci0JCQkJc3dpdGNoIChhcmNoaXZlVHlwZSkgewotCQkJCQljYXNlIEltcG9ydFV0aWwuRUFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5FSkJKQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgRUpCTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuV0FSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5SQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgQ29ubmVjdG9yTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0KLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYXJjaGl2ZVR5cGUgPT0gSW1wb3J0VXRpbC5FQVJGSUxFICkgewotCQkJCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydFdpemFyZCgoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgRUpCTW9kdWxlSW1wb3J0V2l6YXJkKChFSkJNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBBcHBDbGllbnRNb2R1bGVJbXBvcnRXaXphcmQoKEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IFdlYk1vZHVsZUltcG9ydFdpemFyZCgoV2ViTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgQ29ubmVjdG9yTW9kdWxlSW1wb3J0V2l6YXJkKChDb25uZWN0b3JNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAobnVsbCAhPSB3aXphcmQpIHsKLQkJCQkvL1RPRE8gZml4IHVwIHdpemFyZCBmb3IgZHJhZyBhbmQgZHJvcAotLy8JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLS8vCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczYzI4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL01vZHVsZUlkZW50aWZpZXJTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUlkZW50aWZpZXJTZXJpYWxpemVyIHsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI3RvQnl0ZUFycmF5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheShPYmplY3QgZGF0YSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIoZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpLmdldEJ5dGVzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI2Zyb21CeXRlQXJyYXkoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoZGF0YSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvcGx1Z2luL0oyRUVOYXZpZ2F0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmNzFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvcGx1Z2luL0oyRUVOYXZpZ2F0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKMkVFTmF2aWdhdG9yUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OUyA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGltYWdlczsKLQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKMkVFTmF2aWdhdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW1hZ2VzID0gbmV3IEltYWdlUmVnaXN0cnkoRGlzcGxheS5nZXREZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gaW1hZ2VzLmdldERlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJaWYoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlkZXNjcmlwdG9yID0gaW1hZ2VzLmdldERlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJCQlpZihkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQkJVVJMIGltYWdlVXJsID0gRmlsZUxvY2F0b3IuZmluZChnZXRCdW5kbGUoKSwgbmV3IFBhdGgoSUNPTlMrcmVsYXRpdmVQYXRoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVXJsKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOyAKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7IAotCi0JCUltYWdlIGltYWdlID0gaW1hZ2VzLmdldChkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOwkJCi0JCWlmKGltYWdlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWltYWdlID0gaW1hZ2VzLmdldChkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOwotCQkJCWlmKGltYWdlID09IG51bGwpIHsgCi0JCQkJCWltYWdlcy5wdXQoZGVzY3JpcHRvci50b1N0cmluZygpLCAoaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKHRydWUpKSk7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCWltYWdlcy5kaXNwb3NlKCk7Ci0JfQotCQotCi0JLyoqCi0JICogUmVjb3JkIGFuIGVycm9yIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBhbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNWNhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWU9SjJFRSBFeHRlbnNpb25zIHRvIENvbW1vbiBOYXZpZ2F0b3IKLVBsdWdpbi5wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLVBsdWdpbi5kZXNjcmlwdGlvbj1Db250YWlucyBKMkVFIEV4dGVuc2lvbnMgYnVpbHQgb24gdGhlIENvbW1vbiBOYXZpZ2F0b3IgRnJhbWV3b3JrCi1qMmVlPUoyRUUKLWoyZWUudmlld191aV89UHJvamVjdCBFeHBsb3JlciAKLWoyZWUuY2F0ZWdvcnlfdWlfPUoyRUUKLUVudGVycHJpc2VfQXBwbGljYXRpb25zPUVudGVycHJpc2UgQXBwbGljYXRpb25zCi1BcHBsaWNhdGlvbl9DbGllbnRfUHJvamVjdHM9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3RzCi1Db25uZWN0b3JfUHJvamVjdHM9Q29ubmVjdG9yIFByb2plY3RzCi1FSkJfUHJvamVjdHM9RUpCIFByb2plY3RzCi1XZWJfUHJvamVjdHM9RHluYW1pYyBXZWIgUHJvamVjdHMKLU90aGVyX1Byb2plY3RzPU90aGVyIFByb2plY3RzCi1KMkVFX0FkZF9Nb2R1bGU9SjJFRSBBZGQgTW9kdWxlCi1BZGRzX0oyRUVfbW9kdWxlc190b19FQVJfcHJvamVjdHM9QWRkcyBKMkVFIG1vZHVsZXMgdG8gRUFSIHByb2plY3RzCi1KMkVFX0FkZF9VdGlsaXR5X0phcj1KMkVFIEFkZCBVdGlsaXR5IEphcgotQWRkc19VdGlsaXR5X0phcnNfdG9fRUFSX3Byb2plY3RzPUFkZHMgVXRpbGl0eSBKYXJzIHRvIEVBUiBwcm9qZWN0cwotSjJFRV9VdGlsaXR5X0phcl9JbXBvcnQ9SjJFRSBVdGlsaXR5IEphciBJbXBvcnQKLUltcG9ydF9hX2phcl9maWxlX1VJXz1JbXBvcnQgYSBqYXIgZmlsZSBpbnRvIGFuIEVBUiBwcm9qZWN0IGFzIGEgSjJFRSBVdGlsaXR5IEphcgotSjJFRV9JbXBvcnQ9SjJFRSBJbXBvcnQKLUoyRUVfSU1QT1JUX01FU1NBR0U9SW1wb3J0cyBKMkVFIGFydGlmYWN0czogRUFScywgRUpCIEphcnMsIEFwcGxpY2F0aW9uIENsaWVudCBKYXJzLCBSQVJzIGFuZCBXQVJzCi1qMmVlUHJvamVjdERlY29yYXRvcj1KMkVFIFByb2plY3QgRGVjb3JhdG9yCi1qMmVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbj1BZGRzIGEgdmVyc2lvbiBkZWNvcmF0b3IgdG8gSjJFRSBwcm9qZWN0cy4KLWV4dGVuc2lvbi5qMmVlLm5hbWU9SjJFRSBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1leHRlbnNpb24uYXBwbGljYXRpb24ubmFtZT1KMkVFIEFwcGxpY2F0aW9uIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi5hcHBjbGllbnQubmFtZT1KMkVFIEFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1leHRlbnNpb24uY29ubmVjdG9yLm5hbWU9SjJFRSBDb25uZWN0b3IgRGVwbG95bWVudCBEZXNjcmlwdG9ycwotZXh0ZW5zaW9uLmVqYi5uYW1lPUoyRUUgRUpCIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi53ZWIubmFtZT1KMkVFIFdlYiBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1maWx0ZXIuamV0ZW1pdHRlcnMubmFtZT0uSkVURW1pdHRlcnMKLWZpbHRlci5qZXRlbWl0dGVycy5kZXNjcmlwdGlvbj1IaWRlIC5KRVRFbWl0dGVycyBwcm9qZWN0Ci1QUk9CTEVNX01BUktFUl9MQUJFTF9SRVNPVVJDRV9ERUNPUkFUT1I9UHJvYmxlbSBNYXJrZXIgUmVzb3VyY2UgRGVjb3JhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhMmY2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgCQkgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0gICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS4qIi8+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5maWx0ZXJzLioiLz4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5hcHBsaWNhdGlvbi5uYW1lIgotCQlwcmlvcml0eT0iaGlnaGVzdCIgaWNvbj0iaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiIKLQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotCQljb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FQVJDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5FQVJERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS5pby5GaWxlIiAvPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJjb21tb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9Im1vZHVsZW1hcC54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3QuZWFyOjEuNF0iIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPgotCQkJPC9vcj4KLQkJPC90cmlnZ2VyUG9pbnRzPgotCQk8IS0tICBUaGUgcG9zc2libGVDaGlsZHJlbiBpcyBtb3JlIHZlcmJvc2UgdG8gYWxsb3cgdGhlIGRyb3AgaGFuZGxlcnMgdG8gYmUgaW52b2tlZCBmb3IgCi0JCQljaGlsZHJlbiBub3QgcHJvdmlkZWQgYnkgdGhpcyBleHRlbnNpb24KLQkJLS0+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPG9yPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLmlvLkZpbGUiIC8+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QudXRpbGl0eSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FkYXB0PgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJjb21tb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9Im1vZHVsZW1hcC54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImVqYi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9IndlYmFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ianNwLnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCTwvb3I+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5FQVJBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCQl2YWx1ZT0iY29tbW9uLnhtaSIgLz4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCQl2YWx1ZT0iYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJtb2R1bGVtYXAueG1pIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlciIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCQk8ZHJvcEFzc2lzdGFudAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuQWRkTW9kdWxlc1RvRUFSIj4KLQkJCTxwb3NzaWJsZURyb3BUYXJnZXRzPgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQk8L2FkYXB0PgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvcG9zc2libGVEcm9wVGFyZ2V0cz4KLQkJPC9kcm9wQXNzaXN0YW50PgotCQk8ZHJvcEFzc2lzdGFudAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkltcG9ydEoyRUVNb2R1bGUiPgotCQkJPHBvc3NpYmxlRHJvcFRhcmdldHM+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9vcj4KLQkJCTwvcG9zc2libGVEcm9wVGFyZ2V0cz4KLQkJPC9kcm9wQXNzaXN0YW50PgotCi0JCTwhLS0gRUFSIE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC51dGlsaXR5IiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBFQVIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gVXRpbGl0eSBKYXIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXciPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gRUFSIGV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPGNvbW1vbldpemFyZAotCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLm5ld1Byb2plY3RzIiAKLQkJCXR5cGU9Im5ldyIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViUHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCSAgICA8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+IAotCQk8Y29tbW9uV2l6YXJkCi0JCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiIAotCQkJdHlwZT0ibmV3IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCSAgICA8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+CQkJCQkJCQkJCQkKLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4gCi0JPC9uYXZpZ2F0b3JDb250ZW50PgotCQotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24uYXBwY2xpZW50Lm5hbWUiIHByaW9yaXR5PSJoaWdoZXN0IgotCQlpY29uPSJpY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIiBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5BcHBDbGllbnRDb250ZW50Ij4KLQkJPHRyaWdnZXJQb2ludHM+Ci0JCQk8b3I+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqc3QuYXBwY2xpZW50OjEuNF0iIC8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvb3I+Ci0JCTwvdHJpZ2dlclBvaW50cz4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQk8YW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQk8b3I+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvYW5kPgotCQk8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JCTxjb21tb25Tb3J0ZXIKLQkJICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIgLz4KLQkJPCEtLSAgSGFuZGxlIG9wZW4gcmVxdWVzdHMgLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFQWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkFwcENsaWVudEFjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQkJPG9yPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJjbGllbnQueG1pIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJCi0JCTwhLS0gQXBwQ2xpZW50IE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBBcHAgQ2xpZW50IEltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBBcHAgQ2xpZW50IGV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JCQotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24ud2ViLm5hbWUiIHByaW9yaXR5PSJoaWdoZXN0IgotCQlpY29uPSJpY29ucy93ZWJncm91cF9vYmouZ2lmIiBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5XZWJERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id2ViYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJqc3AueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQl2YWx1ZT0ianN0LndlYjoyLjRdIiAvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkgIDxvcj4KLQkJCTxhbmQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+Ci0JCQkJPG9yPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCXZhbHVlPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpzcC54bWkiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvYW5kPgotCQkgIDwvb3I+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQk8IS0tICBIYW5kbGUgb3BlbiByZXF1ZXN0cyAtLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuV2ViQWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9IndlYmFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ianNwLnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5XZWJOZXdBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQotCQk8IS0tIFdlYiBOZXcgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLm5ld1Byb2plY3RzIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBXZWIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gV2ViIEV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJHcm91cEl0ZW1Qcm92aWRlciIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQotCQk8IS0tIFRoZSBjb250cmlidXRpb24gb2YgdGhlIE5ldyAqLmpzcCB3aXphcmQgdG8gRmlsZXMsIEZvbGRlcnMsIGFuZCBQcm9qZWN0cyAKLQkJCWlzIGhhbmRsZWQgaW4gb3JnLmVjbGlwc2UuanN0LmpzcC51aS4gVGhpcyBjb250cmlidXRpb24gYWRkcyB0aGUgCi0JCQl3aXphcmQgdG8gdGhlIG1vZGVsIGVsZW1lbnRzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBKMkVFIENvbnRlbnQgUHJvdmlkZXIgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiIC8+Ci0KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiIC8+Ci0KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQotCQk8IS0tIFRoZSBjb250cmlidXRpb24gb2YgdGhlIE5ldyAqLmh0bWwgd2l6YXJkIHRvIEZpbGVzLCBGb2xkZXJzLCBhbmQgUHJvamVjdHMgCi0JCQlpcyBoYW5kbGVkIGluIG9yZy5lY2xpcHNlLmpzdC5odG1sLnVpLiBUaGlzIGNvbnRyaWJ1dGlvbiBhZGRzIHRoZSAKLQkJCXdpemFyZCB0byB0aGUgbW9kZWwgZWxlbWVudHMgY29udHJpYnV0ZWQgYnkgdGhlIEoyRUUgQ29udGVudCBQcm92aWRlciAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkdyb3VwSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJCi0JCTwhLS0gTmV3IFNlcnZsZXQgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBOZXcgRmlsdGVyIC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYmNsYXNzIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkRmlsdGVyV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZyIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBOZXcgTGlzdGVuZXIgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIiLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5lamIubmFtZSIgcHJpb3JpdHk9ImhpZ2hlc3QiCi0JCWljb249Imljb25zL2VqYmdyb3VwX29iai5naWYiIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkVKQkREQ29udGVudCI+Ci0JCTx0cmlnZ2VyUG9pbnRzPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0iZWpiLnhtaSIgLz4KLQkJCQk8L2FuZD4KLQkJCQk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPiAKLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiOjIuMV0iIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJlamIueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIi8+Ci0gICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIi8+Ci0JCQk8L29yPgotICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5Mb2FkaW5nREROb2RlIi8+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQk8IS0tICBIYW5kbGUgb3BlbiByZXF1ZXN0cyAtLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuRUpCQWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQkJdmFsdWU9ImVqYi54bWkiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0JCTwhLS0gIEJ5IGRlZmF1bHQsIGFueXRoaW5nIHRoYXQgY2FuIGFkYXB0IHRvIGFuIElSZXNvdXJjZSBnZXRzICBOZXcgQWN0aW9uIFByb3ZpZGVyIChmcm9tIHRoZSBSZXNvdXJjZXMgZXh0ZW5zaW9uKSwKLQkJCXNvIHdlIGp1c3QgbmVlZCB0byBhZGQgb25lIGZvciB0aGUgRUpCIEl0ZW0gUHJvdmlkZXJzICh0aGUgZ3JvdXBpbmdzIGluIHRoZSB0cmVlKSAKLQkJLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5OZXdBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRWpiTmV3QWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIiAvPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCi0JCTwhLS0gRUpCIE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkucHJvamVjdC5mYWNldC5FamJQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gRUpCIEltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gRUpCIEV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gQWRkIEVudGVycHJpc2UgQmVhbiAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb24udWkuaW50ZXJuYWwud2l6YXJkcy5BZGRFamJXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQKLQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIiAvPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiIC8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb3ZpZGVyLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYi54ZG9jbGV0IiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLSAgCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIAkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgIAkJdHlwZT0ibmV3IgotICAgICAgICAJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRTZXNzaW9uQmVhbldpemFyZCI+Ci0gICAgIAkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYjozLjAiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiIC8+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC5lamI6My4wIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm92aWRlci5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamIueGRvY2xldCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLSAgCQk8L2NvbW1vbldpemFyZD4KLSAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRNZXNzYWdlRHJpdmVuQmVhbldpemFyZCI+Ci0gICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVqYjozLjAiPgotICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCI+Ci0gICAgICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiOjMuMCI+Ci0gICAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb3ZpZGVyLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVqYi54ZG9jbGV0Ij4KLSAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgPC9vcj4KLSAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgPC9jb21tb25XaXphcmQ+Ci0JPC9uYXZpZ2F0b3JDb250ZW50PgotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24uY29ubmVjdG9yLm5hbWUiCi0JCXByaW9yaXR5PSJoaWdoZXN0IiBpY29uPSJpY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmIgotCQlhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5Db25uZWN0b3JERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPGFuZD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQk8L2FuZD4KLQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQk8Y29tbW9uU29ydGVyCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5Db25uZWN0b3JBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJPC9hbmQ+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0KLQkJPCEtLSBDb25uZWN0b3IgTmV3IC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gQ29ubmVjdG9yIGltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5jb25uZWN0b3IiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQk8IS0tIENvbm5lY3RvciBFeHBvcnQgLS0+Ci0JCTxjb21tb25XaXphcmQgdHlwZT0iZXhwb3J0IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvciIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvbmF2aWdhdG9yQ29udGVudD4KLSA8Y29tbW9uRmlsdGVyCi0gICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgIGRlc2NyaXB0aW9uPSIlZmlsdGVyLmpldGVtaXR0ZXJzLmRlc2NyaXB0aW9uIgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuZmlsdGVycy5qZXRlbWl0dGVycyIKLSAgICAgICBuYW1lPSIlZmlsdGVyLmpldGVtaXR0ZXJzLm5hbWUiPgotICAgIDxmaWx0ZXJFeHByZXNzaW9uPgotICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9Ii5KRVRFbWl0dGVycyIvPgotICAgICAgIDwvYWRhcHQ+Ci0gICAgPC9maWx0ZXJFeHByZXNzaW9uPgotIDwvY29tbW9uRmlsdGVyPgkJCQotIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiAKLSAgCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeQotICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVFTUZBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFRU1GQWRhcHRlckZhY3RvcnkiPgotICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIExhYmVsIERlY29yYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlajJlZVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVQcm9qZWN0RGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVqMmVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlUFJPQkxFTV9NQVJLRVJfTEFCRUxfUkVTT1VSQ0VfREVDT1JBVE9SIgotICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLmphdmEucmVzb3VyY2UuZGVjb3JhdG9yIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4gCi0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MzIwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNlNDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZV91aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODA4OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWRvYwotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotajJlZV91aS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdmYTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE1ZDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIEp1bCAyNSAxNDowMDo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9lYXJsaWJyYXJpZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYThiY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jVGh1IE1heSAxMCAxODozNTo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmOTU3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgQXByIDEzIDE0OjE2OjM5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTEzMDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC51aSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmxpc3RlbmVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBlcnNwZWN0aXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWkuYXJjaGl2ZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9uLm1vZGVsO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYzgyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gajJlZV91aS8sXAotICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy8yMF9jbXBiZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyM2ZlOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy8yMF9jbXBiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fkb3duLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYWRvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWU3MDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYWRvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4NDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXJyb3dfZG93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93X2Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ1NWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXJyb3dfZG93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDYzMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX2xlZnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX2xlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhlNzZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0Mi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTMxMDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfcmlnaHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczYjYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jbXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jbXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVkMWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY21wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2RlYWRlbmQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9kZWFkZW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmNjE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2RlYWRlbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWJhbm5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLXdpei1pY29uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLXdpei1pY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0MDliNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmZhOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWViM2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZGIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2ZvbGRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWIyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2NsY2wxNi9lamJfY2xpZW50X3JlbW92ZV9hY3Rpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjMyMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2NsY2wxNi9lamJfY2xpZW50X3JlbW92ZV9hY3Rpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2RlcGxveV9hY3Rpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2RlcGxveV9hY3Rpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4OTQ1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgzMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2N2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZWpiY2xpZW50amFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjVlN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZWpiY2xpZW50amFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcwYjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNkNDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmIzZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MjAxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDRiNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYyNWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTg2YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWM2YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0MDliNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGEyMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9yZV9leGVjdXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NDNhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9yZV9leGVjdXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhY2Q0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2RsY2wxNi9lamJfY2xpZW50X3JlbW92ZV9hY3Rpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGEwYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2RsY2wxNi9lamJfY2xpZW50X3JlbW92ZV9hY3Rpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2RlcGxveV9hY3Rpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2RlcGxveV9hY3Rpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1NzM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMTNfZWFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMTNfZWFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjliMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2NtcGJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODM1YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2NtcGJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9lamJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9lamJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYmE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWUwNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzFkMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDgzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0X2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0X2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDA4YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2V4dHdlYnNlcnZpY2VpdGVtcHJvdmlkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9leHR3ZWJzZXJ2aWNlaXRlbXByb3ZpZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2M2ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2V4dHdlYnNlcnZpY2VpdGVtcHJvdmlkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2hvbWVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTc1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2hvbWVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlicmFyeV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2xpYnJhcnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NWUzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlicmFyeV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsX2hvbWVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNjA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZTM5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3NlcnZpY2VfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NjY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZUl0ZW1Qcm92aWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZXNGb2xkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMwMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF8xNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmOTE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3Nzc1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzFkMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Rpc19hbm5vdGF0aW9uX2JlYW5fb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjNDk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUwZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9leHRlcm5hbFdlYlNlcnZpY2VPdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZmY0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM4MGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9rZXlfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ2MDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2xvY2FsX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YzljYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9yZW1vdGVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2UzOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YwNjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ2NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTk2MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NDFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF9tZXNzX2Rlc3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmE5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRfd2ViX3NlcnZpY2VfaGFuZGxlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMwZmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkYXV0aG9yaXR5Y29udHJhaW50c193aXpfLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNtcGZpbGVkX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzkzMjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTdlMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRjb250ZXh0cGFyYW1ldGVyX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNhYjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZW52aXJlbnRyeV93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViOWVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGVycm9yY29kZWVycm9yX3dpel9iYW4uZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGV4Y2VwdGlvbmVycm9ycGFnZV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJkMmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUzMDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZmlsdGVybWFwcGluZ193aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5YzNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGhhbmRsZXJzb2FwaGVhZGVyX3dpel9iYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGpzcHByb3Bncm9wdV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRmZTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbG9jZW5jb2RpbmdtYXBfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTNlMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZG1pbWVtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg1NmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRzZXJ2bGV0bWFwcGluZ193aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyMGM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR0YWdsaWJyZWZfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzOGI1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5N2Q4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYlNlY3VyaXR5Y29udHJhaW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmU2ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJyZXNjb2xsZWN0aW9uX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI0YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2Vic2VjdXJpdHlyb2xlcmVmX3dpel9iLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlbGNvbWVwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY1MGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkN2ZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdGlvbl9taWdyYXRpb25fd2l6YXJkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZWNiYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpiY2xpZW50amFyX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWRhNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1Mzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyN2ZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2E3OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3ZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1MTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWEzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiMWUzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NTRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjM1MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Mjc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiNmRmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2luaXRfcGFyYW1fd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjFkNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX2ptc19jcmVhdGlvbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIxZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbWRiXzJfMV9ub25fam1zX2NyZWF0aW9uX3dpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2U1N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi92ZXJzaW9ubWlncmF0ZTNfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3MmJmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjRlMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYl9saWJyYXJ5X3Byb2plY3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMTVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9sZWZ0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMzgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9yaWdodF9hcnJvdy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZTM1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zaG93ZXJyX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMDllOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3d3YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjkzYzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3V0aWwtd2l6LWljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDM4YjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvV1RQVUlXb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi91aS9XVFBVSVdvcmtpbmdDb3B5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODZiMTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi91aS9XVFBVSVdvcmtpbmdDb3B5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLnVpOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLklDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkludGVybmFsQ2xhc3NGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklXb3JraW5nQ29weU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uV1RQV29ya2luZ0NvcHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8yNS8yMDAxIDc6MDU6MzYgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdUUFVJV29ya2luZ0NvcHlNYW5hZ2VyIGV4dGVuZHMgV1RQV29ya2luZ0NvcHlNYW5hZ2VyIHsKLQlwcml2YXRlIElXb3JraW5nQ29weU1hbmFnZXIgamF2YVdvcmtpbmdDb3B5TWFuYWdlcjsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyIGN1RG9jdW1lbnRQcm92aWRlcjsKLQlwcml2YXRlIEhhc2hNYXAgZWRpdG9ySW5wdXRzOwotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBsYXN0RXJyb3I7Ci0KLQkvKioKLQkgKiBXVFBVSVdvcmtpbmdDb3B5TWFuYWdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBVSVdvcmtpbmdDb3B5TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJY3VEb2N1bWVudFByb3ZpZGVyID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tcGlsYXRpb25Vbml0RG9jdW1lbnRQcm92aWRlcigpOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyID0gSmF2YVVJLmdldFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb25uZWN0KGZpbmFsIElFZGl0b3JJbnB1dCBpbnB1dCwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGQgIT0gbnVsbCkgewotCQkJbGFzdEVycm9yID0gbnVsbDsKLQkJCWQuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbm5lY3QoaW5wdXQsIGN1KTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsYXN0RXJyb3IgPSBlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZQotCQkJY29ubmVjdChpbnB1dCwgY3UpOwotCQlpZiAobGFzdEVycm9yICE9IG51bGwpCi0JCQl0aHJvdyBsYXN0RXJyb3I7Ci0JfQotCi0JLyoqCi0JICogQ29ubmVjdCB0aGUgQ29tcGlsYXRpb25Vbml0RG9jdW1lbnRQcm92aWRlciB0byB0aGUKLQkgKiAKLQkgKiBAaW5wdXQgYW5kIGNvbm5lY3QgdGhlIGFubm90YXRpb24gbW9kZWwgZnJvbSB0aGUgcHJvdmlkZXIgdG8gdGhlIElEb2N1bWVudCBvZiB0aGUKLQkgKiBAaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29ubmVjdChJRWRpdG9ySW5wdXQgaW5wdXQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgamF2YVdvcmtpbmdDb3B5TWFuYWdlciAhPSBudWxsICYmIGN1RG9jdW1lbnRQcm92aWRlciAhPSBudWxsICkgewotCQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5jb25uZWN0KGlucHV0KTsKLQkJCWdldEVkaXRvcklucHV0cygpLnB1dChjdSwgaW5wdXQpOwotCQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQlpZiAoZG9jICE9IG51bGwgJiYgY3VEb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChpbnB1dCkhPSBudWxsKQotCQkJCWN1RG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoaW5wdXQpLmNvbm5lY3QoZG9jKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldmVydFdvcmtpbmdDb3BpZXMoKSB7Ci0JCWlmIChnZXRFZGl0b3JJbnB1dHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGl0Lm5leHQoKTsKLQkJCXJldmVydChpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNvbm5lY3QgdGhlIENvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXIgZnJvbSB0aGUKLQkgKiAKLQkgKiBAaW5wdXQgYW5kIGRpc2Nvbm5lY3QgdGhlIGFubm90YXRpb24gbW9kZWwgZnJvbSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgSURvY3VtZW50IG9mIHRoZQotCSAqIEBpbnB1dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRG9jdW1lbnQgZG9jID0gY3VEb2N1bWVudFByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLQkJY3VEb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChpbnB1dCkuZGlzY29ubmVjdChkb2MpOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyLmRpc2Nvbm5lY3QoaW5wdXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldmVydChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJdHJ5IHsKLQkJCWN1RG9jdW1lbnRQcm92aWRlci5yZXNldERvY3VtZW50KGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBjdURvY3VtZW50UHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKGlucHV0KTsKLQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCkgewotCQkJQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbWFya2VyTW9kZWwgPSAoQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwpIG1vZGVsOwotCQkJbWFya2VyTW9kZWwucmVzZXRNYXJrZXJzKCk7Ci0JCX0KLQkJbW9kZWwuZGlzY29ubmVjdChkb2MpOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyLmRpc2Nvbm5lY3QoaW5wdXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3RFZGl0b3JJbnB1dHMoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGl0Lm5leHQoKTsKLQkJCWRpc2Nvbm5lY3QoaW5wdXQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZEV4aXN0aW5nQ29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGdldEVkaXRvcklucHV0cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWlucHV0ID0gKElFZGl0b3JJbnB1dCkgaXQubmV4dCgpOwotCQkJZGlzY29ubmVjdChpbnB1dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVNldCBhU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBudWxsOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl1bml0ID0gKElDb21waWxhdGlvblVuaXQpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0RpcnR5KHVuaXQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UgPSB1bml0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQlhU2V0LmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IHByaW1HZXRFZGl0b3JJbnB1dChjdSk7Ci0JCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKElKYXZhRWxlbWVudCkgY3UpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDogewotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0JCQkJCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQkJCQljdSA9IGN1LmdldFByaW1hcnkoKTsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEUgOgotCQkJCQlyZXR1cm4gbmV3IEludGVybmFsQ2xhc3NGaWxlRWRpdG9ySW5wdXQoKElDbGFzc0ZpbGUpIGVsZW1lbnQpOwotCQkJfQotCQkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8yNS8yMDAxIDc6MzA6MjAgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBnZXRFZGl0b3JJbnB1dHMoKSB7Ci0JCWlmIChlZGl0b3JJbnB1dHMgPT0gbnVsbCkKLQkJCWVkaXRvcklucHV0cyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJcmV0dXJuIGVkaXRvcklucHV0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuIERvZXMgbm90IGNvbm5lY3QgdGhlIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1ID09IG51bGwgfHwgY3UuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQlyZXR1cm4gY3U7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IHN1cGVyLmdldEV4aXN0aW5nV29ya2luZ0NvcHkoY3UpOwotCQlpZiAobmV3Q1UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdDVTsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoY3UpOwotCQlyZXR1cm4gamF2YVdvcmtpbmdDb3B5TWFuYWdlci5nZXRXb3JraW5nQ29weShlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1LCBib29sZWFuIGZvck5ld0NVKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlpZiAoZm9yTmV3Q1UpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0V29ya2luZ0NvcHkoY3UsIGZvck5ld0NVKTsKLQkJcmV0dXJuIHByaW1HZXRXb3JraW5nQ29weShjdSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRG9jdW1lbnRQcm92aWRlciBwID0gY3VEb2N1bWVudFByb3ZpZGVyOwotCQlyZXR1cm4gcCA9PSBudWxsID8gZmFsc2UgOiBwLmNhblNhdmVEb2N1bWVudChnZXRFZGl0b3JJbnB1dChjdSkpOwotCX0KLQotCS8qKgotCSAqIG11c3RTYXZlRG9jdW1lbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCQlJdGVyYXRvciBpdCA9IGdldEVkaXRvcklucHV0cygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaWYgKGN1RG9jdW1lbnRQcm92aWRlci5tdXN0U2F2ZURvY3VtZW50KGl0Lm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1EaXNwb3NlKCkgewotCQlzdXBlci5wcmltRGlzcG9zZSgpOwotCQlkaXNjYXJkRXhpc3RpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCWVkaXRvcklucHV0cyA9IG51bGw7Ci0JCWphdmFXb3JraW5nQ29weU1hbmFnZXIgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SZXZlcnQoKSB7Ci0JCXN1cGVyLnByaW1SZXZlcnQoKTsKLQkJcmV2ZXJ0V29ya2luZ0NvcGllcygpOwotCQllZGl0b3JJbnB1dHMgPSBudWxsOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvcklucHV0IHByaW1HZXRFZGl0b3JJbnB1dChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiAoSUVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dHMoKS5nZXQoY3UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBwcmltR2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY3UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGN1OwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgcHJpbWFyeSA9IGN1LmdldFByaW1hcnkoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KHByaW1hcnkpOwotCQlpZiAobmV3Q1UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdDVTsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gcHJpbUdldEVkaXRvcklucHV0KHByaW1hcnkpOwotCQlpZiAoZWRpdG9ySW5wdXQgPT0gbnVsbCkgewotCQkJZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dChjdSk7Ci0JCQlzeW5jQ29ubmVjdChlZGl0b3JJbnB1dCwgY3UpOwotCQl9Ci0JCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm4gY3U7Ci0JCXJldHVybiBqYXZhV29ya2luZ0NvcHlNYW5hZ2VyLmdldFdvcmtpbmdDb3B5KGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlci5wcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMobnVsbCk7Ci0JCXNhdmVFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVEb2N1bWVudChJRWRpdG9ySW5wdXQgaW5wdXQsIElEb2N1bWVudCBkb2MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY3VEb2N1bWVudFByb3ZpZGVyLnNhdmVEb2N1bWVudChtb25pdG9yLCBpbnB1dCwgZG9jLCB0cnVlKTsgLy8gb3ZlcndyaXRlIGlmIG5lZWRlZAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoIWlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShleCkpCi0JCQkJdGhyb3cgZXg7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgfHwgIXJlc291cmNlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSkKLQkJCQl0aHJvdyBleDsKLQotCQkJaWYgKGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKChJRmlsZSkgcmVzb3VyY2UpKQotCQkJCWN1RG9jdW1lbnRQcm92aWRlci5zYXZlRG9jdW1lbnQobW9uaXRvciwgaW5wdXQsIGRvYywgZmFsc2UpOwotCQkJZWxzZQotCQkJCXRocm93IGV4OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURvY3VtZW50KElFZGl0b3JJbnB1dCBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBjdURvY3VtZW50UHJvdmlkZXIuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlib29sZWFuIGNhblNhdmUgPSBjdURvY3VtZW50UHJvdmlkZXIuY2FuU2F2ZURvY3VtZW50KGlucHV0KTsKLQkJdHJ5IHsKLQkJCWlmIChjYW5TYXZlKSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gamF2YVdvcmtpbmdDb3B5TWFuYWdlci5nZXRXb3JraW5nQ29weShpbnB1dCk7Ci0JCQkJc3luY2hyb25pemVkICh1bml0KSB7Ci0JCQkJCWN1RG9jdW1lbnRQcm92aWRlci5hYm91dFRvQ2hhbmdlKGlucHV0KTsKLQkJCQkJcHJpbVNhdmVEb2N1bWVudChpbnB1dCwgZG9jLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNhblNhdmUpCi0JCQkJY3VEb2N1bWVudFByb3ZpZGVyLmNoYW5nZWQoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUV4aXN0aW5nQ29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRFZGl0b3JJbnB1dHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWlmICghdmFsaWRhdGVTdGF0ZSgpKSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJLy8JSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQl0cnkgewotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCS8vCQkJY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRyeSB7Ci0JCQkJCXNhdmVEb2N1bWVudChpbnB1dCwgbnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZGlzY29ubmVjdChpbnB1dCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZ2V0RWRpdG9ySW5wdXRzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGwgdmFsaWRhdGVFZGl0IGZvciBhbGwgcmVhZCBvbmx5IElGaWxlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggV29ya2luZ0NvcHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0JCUxpc3QgcmVhZE9ubHlGaWxlcyA9IGdldFJlYWRPbmx5TW9kaWZpZWRGaWxlcygpOwotCQlpZiAocmVhZE9ubHlGaWxlcyAhPSBudWxsICYmICFyZWFkT25seUZpbGVzLmlzRW1wdHkoKSkgewotCQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtyZWFkT25seUZpbGVzLnNpemUoKV07Ci0JCQlyZWFkT25seUZpbGVzLnRvQXJyYXkoZmlsZXMpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW4gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJT2JqZWN0IGN0eCA9IHdpbiA9PSBudWxsID8gbnVsbCA6IHdpbi5nZXRTaGVsbCgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBjdHgpOwotCQkJcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJlYWRPbmx5TW9kaWZpZWRGaWxlcygpIHsKLQkJTGlzdCByZWFkT25seUZpbGVzID0gbnVsbDsKLQkJSUZpbGUgcmVhZE9ubHlGaWxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJLy8JSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92ID0gY3VEb2N1bWVudFByb3ZpZGVyOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyZWFkT25seUZpbGUgPSBudWxsOwotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkvLwkJY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZG9jUHJvdi5jYW5TYXZlRG9jdW1lbnQoaW5wdXQpKQotCQkJCXJlYWRPbmx5RmlsZSA9IGdldFJlYWRPbmx5RmlsZShpbnB1dCk7Ci0JCQlpZiAocmVhZE9ubHlGaWxlICE9IG51bGwpIHsKLQkJCQlpZiAocmVhZE9ubHlGaWxlcyA9PSBudWxsKQotCQkJCQlyZWFkT25seUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlYWRPbmx5RmlsZXMuYWRkKHJlYWRPbmx5RmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWRPbmx5RmlsZXM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRSZWFkT25seUZpbGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJSUZpbGUgZmlsZSA9IGZpbnB1dC5nZXRGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gcHJpbUdldEVkaXRvcklucHV0KGN1KTsKLQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQlkaXNjb25uZWN0KGlucHV0KTsKLQkJZ2V0RWRpdG9ySW5wdXRzKCkucmVtb3ZlKGN1KTsKLQkJc3VwZXIuYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5JSjJFRVdvcmtpbmdDb3B5TWFuYWdlciNoYXNXb3JraW5nQ29waWVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNXb3JraW5nQ29waWVzKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzV29ya2luZ0NvcGllcygpIHx8IChlZGl0b3JJbnB1dHMgIT0gbnVsbCAmJiAhZWRpdG9ySW5wdXRzLmlzRW1wdHkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhhOWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqICAgICBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gYnVncyAyMDc4MjYsIDIyMjY1MQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5DaGFuZ2VMaWJEaXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLkRvdWJsZUNoZWNrYm94VGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLkRvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRWFyRmFjZXRSdW50aW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UgaW1wbGVtZW50cyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2wsIExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBBVEhfU0VQQVJBVE9SID0gQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuUEFUSF9TRVBBUkFUT1I7CQotCXByb3RlY3RlZCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBmaW5hbCBKMkVFRGVwZW5kZW5jaWVzUGFnZSBwcm9wUGFnZTsgCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgY29tcG9uZW50TmFtZVRleHQ7Ci0JcHJvdGVjdGVkIExhYmVsIGF2YWlsYWJsZU1vZHVsZXM7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gcHJvamVjdEphckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGV4dGVybmFsSmFyQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gYWRkVmFyaWFibGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjaGFuZ2VMaWJQYXRoQnV0dG9uOwotCXByb3RlY3RlZCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaWJEaXIgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTGliRGlyOwotCXByb3RlY3RlZCBMaXN0IGoyZWVDb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGphdmFQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3QgajJlZUxpYkVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGphdmFMaWJQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCXByb3RlY3RlZCBib29sZWFuIGlzVmVyc2lvbjU7Ci0JcHJvdGVjdGVkIFNldCBsaWJzVG9VbmNoZWNrOwotCXByb3RlY3RlZCBMaXN0ZW5lciB0YWJsZUxpc3RlbmVyOwotCXByb3RlY3RlZCBMaXN0ZW5lciBsYWJlbExpc3RlbmVyOwotCQotCS8vW0J1ZyAyMzgyNjRdIHRoZSBjYWNoZWQgbGlzdCBvZiBqYXJzIHNlbGVjdGVkIHVzaW5nICdhZGQgamFyJyBvciAnYWRkIGV4dGVybmFsIGphcnMnCi0JcHJvdGVjdGVkIExpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGFkZGVkSkFSQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzQ29udHJvbC4KLQkgKi8KLQlwdWJsaWMgQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSjJFRURlcGVuZGVuY2llc1BhZ2UgcGFnZSkgeyAKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5wcm9wUGFnZSA9IHBhZ2U7Ci0JCWVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlib29sZWFuIGhhc0VFNUZhY2V0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZihmYWNldGVkUHJvamVjdCAhPSBudWxsKXsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKEVhclV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUKTsKLQkJCQlpZihmYWNldFZlcnNpb24uZXF1YWxzKEVhclV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzUwKSl7Ci0JCQkJCWhhc0VFNUZhY2V0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQkKLQkJaWYoaGFzRUU1RmFjZXQpewotCQkJU3RyaW5nIGVhckREVmVyc2lvbiA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUREUHJvamVjdFZlcnNpb24ocHJvamVjdCk7Ci0JCQlpZiAoZWFyRERWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkgewotCQkJCWlzVmVyc2lvbjUgPSB0cnVlOwotCQkJCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJaWYgKGFwcCAhPSBudWxsKQotCQkJCQlvbGRMaWJEaXIgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJCWlmIChvbGRMaWJEaXIgPT0gbnVsbCkgb2xkTGliRGlyID0gSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSOwotCQkJCWxpYkRpciA9IG9sZExpYkRpcjsKLQkJCX0KLQkJfQotCQlsaWJzVG9VbmNoZWNrID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7IAotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgSjJFRURlcGVuZGVuY2llc1BhZ2UuY3JlYXRlRGVzY3JpcHRpb25Db21wb3NpdGUoY29tcG9zaXRlLCBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkVBUl9Nb2R1bGVzX0Rlc2MpOwotCQljcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJcmVmcmVzaCgpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGxpc3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGlzdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEoZ0RhdGEpOwotCi0JCWF2YWlsYWJsZU1vZHVsZXMgPSBuZXcgTGFiZWwobGlzdEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlhdmFpbGFibGVNb2R1bGVzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFWQUlMQUJMRV9KMkVFX0NPTVBPTkVOVFMiKSk7IC8vJE5PTi1OTFMtMSQgPSAiQXZhaWxhYmxlIGRlcGVuZGVudCBKQVJzOiIKLQkJYXZhaWxhYmxlTW9kdWxlcy5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJY3JlYXRlVGFibGVDb21wb3NpdGUobGlzdEdyb3VwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU51bGxQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChpc1ZlcnNpb241KSB7Ci0JCQlpZiAobGliRGlyLmxlbmd0aCgpID09IDApIHsKLQkJCQkKLQkJCQlNZXNzYWdlRGlhbG9nIGRsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKG51bGwsICAKLQkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJMQU5LX0xJQl9ESVIpLAotCQkJICAgICAgICAgICAgbnVsbCwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQkxBTktfTElCX0RJUl9XQVJOX1FVRVNUSU9OKSwgCi0JCQkgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW10ge0oyRUVVSU1lc3NhZ2VzLllFU19CVVRUT04sIAotCQkJCQkJCQkJCQkJCQkJCUoyRUVVSU1lc3NhZ2VzLk5PX0JVVFRPTiwgCi0JCQkJCQkJCQkJCQkJCQkJSjJFRVVJTWVzc2FnZXMuQ0FOQ0VMX0JVVFRPTn0sIDEpOwotCQkJCXN3aXRjaCAoZGxnLm9wZW4oKSkgewotCQkJCQljYXNlIDA6IGJyZWFrOyAKLQkJCQkJY2FzZSAxOiB7Ci0JCQkJCQloYW5kbGVDaGFuZ2VMaWJEaXJCdXR0b24oZmFsc2UpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWNhc2UgMjogcmV0dXJuIGZhbHNlOwotCQkJCQlkZWZhdWx0OiByZXR1cm4gZmFsc2U7Ci0JCQkJfQkJCQotCQkJfQkJCQotCQkJdXBkYXRlTGliRGlyKG1vbml0b3IpOwotCQl9Ci0JCXJlbW92ZU1vZHVsZXNGcm9tRUFSKG1vbml0b3IpOwkJCi0JCWFkZE1vZHVsZXNUb0VBUihtb25pdG9yKTsKLQkJcmVmcmVzaCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlpZiAoYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlciAhPSBudWxsKSB7Ci0JCSAgICAgdGFibGUgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgICAgaWYgKHRhYmxlID09IG51bGwpCi0JCSAgICAJIHJldHVybjsKLQkJfQotCQl0YWJsZS5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgdGFibGVMaXN0ZW5lcik7Ci0JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgdGFibGVMaXN0ZW5lcik7Ci0JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCB0YWJsZUxpc3RlbmVyKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBuZXdKMkVFTW9kdWxlc1RvQWRkKGJvb2xlYW4gaW5MaWJGb2xkZXIpewotCQlpZiAoaW5MaWJGb2xkZXIgJiYgIWlzVmVyc2lvbjUpIHJldHVybiBudWxsOwotCQlMaXN0IG5ld0NvbXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNvbXBzID0gaW5MaWJGb2xkZXIgPyBqMmVlTGliRWxlbWVudExpc3QgOiBqMmVlQ29tcG9uZW50TGlzdDsKLQkJaWYgKGNvbXBzICE9IG51bGwgJiYgIWNvbXBzLmlzRW1wdHkoKSl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBzLnNpemUoKTsgaSsrKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBoYW5kbGUgPSAoSVZpcnR1YWxDb21wb25lbnQpY29tcHMuZ2V0KGkpOwotCQkJCWlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koaGFuZGxlKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYoICFpbkVBUkFscmVhZHkoaGFuZGxlKSkKLQkJCQkJbmV3Q29tcHMuYWRkKGhhbmRsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0NvbXBzOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpYkRpcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGxpYkRpci5lcXVhbHMob2xkTGliRGlyKSkgcmV0dXJuOwotCQlmaW5hbCBJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlmaW5hbCBBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwotCQlvbGRMaWJEaXIgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQlpZiAob2xkTGliRGlyID09IG51bGwpIG9sZExpYkRpciA9IEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUjsKLQkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkKLQkJCWFwcC5zZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYkRpcik7Ci0JCX19LCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlREQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKCBlYXJDb21wb25lbnQgIT0gbnVsbCApewotCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IGdlbmVyYXRlRUFSRERPcGVyYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhlY0FkZE9wKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTGlzdCBjb21wb25lbnRMaXN0LCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29tcG9uZW50TGlzdCA9PSBudWxsIHx8IGNvbXBvbmVudExpc3QuaXNFbXB0eSgpKSByZXR1cm47Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCi0JCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwkJCQkJCi0JCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudExpc3QpOwotCQkKLQkJLy9bQnVnIDIzODI2NF0gdGhlIHVyaSBtYXAgbmVlZHMgdG8gYmUgbWFudWFsbHkgc2V0IGNvcnJlY3RseQotCQlNYXAgdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmlydENvbXA7Ci0JCVN0cmluZyB2aXJ0Q29tcFVSSU1hcE5hbWU7Ci0JCWZvcihpbnQgaT0wOyBpPGNvbXBvbmVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXZpcnRDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudExpc3QuZ2V0KGkpOwotCQkJdmlydENvbXBVUklNYXBOYW1lID0gZ2V0VmlydHVhbENvbXBvbmVudE5hbWVXaXRoRXh0ZW5zaW9uKHZpcnRDb21wKTsJCi0JCQl1cmlNYXAucHV0KHZpcnRDb21wLCB2aXJ0Q29tcFVSSU1hcE5hbWUpOwotCQl9Ci0JCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCB1cmlNYXApOwotCQkKLSAgICAgICAgaWYgKGlzVmVyc2lvbjUpIGRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgcGF0aCk7Ci0KLQkJSVN0YXR1cyBzdGF0ID0gZG0udmFsaWRhdGVQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJaWYgKHN0YXQgIT0gT0tfU1RBVFVTKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdCk7Ci0JCXRyeSB7Ci0JCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhlY0FkZE9wMShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIExpc3QgalByb2pMaXN0LCBMaXN0IGoyZWVDb21wTGlzdCwgU3RyaW5nIHBhdGgpCi0JCQkJCQkJCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWpQcm9qTGlzdC5pc0VtcHR5KCkpIHsKLQkJCVNldCBtb2R1bGVQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGpQcm9qTGlzdC5zaXplKCk7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIGpQcm9qTGlzdC5nZXQoaSk7Ci0JCQkJCW1vZHVsZVByb2plY3RzLmFkZChwcm9qKTsKLQkJCQkJSURhdGFNb2RlbCBtaWdyYXRpb25kbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQltaWdyYXRpb25kbS5zZXRQcm9wZXJ0eShJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvai5nZXROYW1lKCkpOwotCQkJCQltaWdyYXRpb25kbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQotCi0JCQkJCUlEYXRhTW9kZWwgcmVmZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQlMaXN0IHRhcmdldENvbXBMaXN0ID0gKExpc3QpIHJlZmRtLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCi0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotCQkJCQl0YXJnZXRDb21wTGlzdC5hZGQodGFyZ2V0Y29tcG9uZW50KTsKLQotCQkJCQlyZWZkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJCQkJcmVmZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgdGFyZ2V0Q29tcExpc3QpOwotCQkJCQlpZiAoaXNWZXJzaW9uNSkgcmVmZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBwYXRoKTsKLQkJCQkJCi0KLQkJCQkJLy8gcmVmZXJlbmNlZCBqYXZhIHByb2plY3RzIHNob3VsZCBoYXZlIGFyY2hpdmVOYW1lIGF0dHJpYnV0ZQotCQkJCQkoKE1hcClyZWZkbS5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCkpLnB1dCh0YXJnZXRjb21wb25lbnQsIHByb2ouZ2V0TmFtZSgpLnJlcGxhY2UoJyAnLCAnXycpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCk7Ci0KLQkJCQkJcmVmZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCWoyZWVDb21wTGlzdC5hZGQodGFyZ2V0Y29tcG9uZW50KTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJCUVhckZhY2V0UnVudGltZUhhbmRsZXIudXBkYXRlTW9kdWxlUHJvamVjdFJ1bnRpbWUoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgbW9kdWxlUHJvamVjdHMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IC8vIGVuZCAKLQkJCi0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBhZGRNb2R1bGVzVG9FQVIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdCA9IE9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCWlmKCBlYXJDb21wb25lbnQgIT0gbnVsbCApewotCQkJCWZpbmFsIExpc3QgbGlzdCA9IG5ld0oyRUVNb2R1bGVzVG9BZGQoZmFsc2UpOwotCQkJCWZpbmFsIExpc3QgYm5kTGlzdCA9IG5ld0oyRUVNb2R1bGVzVG9BZGQodHJ1ZSk7Ci0JCQkJZmluYWwgYm9vbGVhbiBzaG91bGRSdW4gPSAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgfHwgIWphdmFQcm9qZWN0c0xpc3QuaXNFbXB0eSgpOwotCQkJCWZpbmFsIGJvb2xlYW4gc2hvdWxkQm5kUnVuID0gaXNWZXJzaW9uNSAmJiAKLQkJCQkJCQkJCQkJKChibmRMaXN0ICE9IG51bGwgJiYgIWJuZExpc3QuaXNFbXB0eSgpKSB8fCAhamF2YUxpYlByb2plY3RzTGlzdC5pc0VtcHR5KCkpOwotCQkJCWlmKHNob3VsZFJ1biB8fCBzaG91bGRCbmRSdW4pewotCQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQkJCQkJCWlmIChzaG91bGRSdW4pIHsKLQkJCQkJCQkJZXhlY0FkZE9wKG1vbml0b3IsIGxpc3QsIEoyRUVDb25zdGFudHMuRUFSX1JPT1RfRElSKTsKLQkJCQkJCQkJZXhlY0FkZE9wMShtb25pdG9yLCBqYXZhUHJvamVjdHNMaXN0LCBqMmVlQ29tcG9uZW50TGlzdCwgSjJFRUNvbnN0YW50cy5FQVJfUk9PVF9ESVIpOwkJCQkJCQkJCi0JCQkJCQkJfSAKLQkJCQkJCQlpZiAoc2hvdWxkQm5kUnVuKSB7Ci0JCQkJCQkJCWV4ZWNBZGRPcChtb25pdG9yLCBibmRMaXN0LCBsaWJEaXIpOwotCQkJCQkJCQlleGVjQWRkT3AxKG1vbml0b3IsIGphdmFMaWJQcm9qZWN0c0xpc3QsIGoyZWVMaWJFbGVtZW50TGlzdCwgbGliRGlyKTsJCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJSjJFRVVJUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQkKLQkJLy9bQnVnIDIzODI2NF0gY2xlYXIgb3V0IHRoZSBjYWNoZSBiZWNhdXNlIHRoZXkgc2hvdWxkIGFsbCBlaXRoZXIgYmUgYWRkZWQgYXMgcmVmZXJlbmNlcyBub3cKLQkJLy8Jb3Igbm8gbG9uZ2VyIGNoZWNrZWQgYW5kIHRoZXJlZm9yIG5vdCB3YW50ZWQgYnkgdGhlIHVzZXIKLQkJdGhpcy5hZGRlZEpBUkNvbXBvbmVudHMuY2xlYXIoKTsKLQkJCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1Db21wcyhMaXN0IGxpc3QsIFN0cmluZyBwYXRoKSB7Ci0JCWlmKCAhbGlzdC5pc0VtcHR5KCkpewotCQkJdHJ5IHsKLQkJCQkvLyByZXRyaWV2ZSBhbGwgZGVwZW5kZW5jaWVzIG9uIHRoZXNlIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgRUFSCi0JCQkJTWFwIGRlcGVuZGVudENvbXBzID0gZ2V0RUFSTW9kdWxlRGVwZW5kZW5jaWVzKGVhckNvbXBvbmVudCwgbGlzdCk7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBjb21wb25lbnRzIGZyb20gdGhlIEVBUgotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKGVhckNvbXBvbmVudCwgbGlzdCwgcGF0aCk7Ci0JCQkJb3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCQkvLyBpZiB0aGF0IHN1Y2NlZWRlZCwgcmVtb3ZlIGFsbCBFQVItc2NvcGUgSjJFRSBkZXBlbmRlbmNpZXMgb24gdGhlc2UgY29tcG9uZW50cwotCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVFQVIoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJcmVtb3ZlRUFSQ29tcG9uZW50RGVwZW5kZW5jaWVzKGRlcGVuZGVudENvbXBzKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHJlbW92ZU1vZHVsZXNGcm9tRUFSKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU3RhdHVzIHN0YXQgPSBPS19TVEFUVVM7Ci0JCWlmICghaXNWZXJzaW9uNSkgewotCQkJaWYoZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgajJlZUNvbXBvbmVudExpc3QgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IGdldENvbXBvbmVudHNUb1JlbW92ZSgpOwotCQkJCXJlbUNvbXBzKGxpc3QsIEoyRUVDb25zdGFudHMuRUFSX1JPT1RfRElSKTsKLQkJCX0JCQkKLQkJfSBlbHNlIHsJCi0JCQlpZiggZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgajJlZUNvbXBvbmVudExpc3QgIT0gbnVsbCkgewotCQkJCUxpc3RbXSBsaXN0ID0gZ2V0Q29tcG9uZW50c1RvUmVtb3ZlVXBkYXRlKCFsaWJEaXIuZXF1YWxzKG9sZExpYkRpcikpOyAKLQkJCQlyZW1Db21wcyhsaXN0WzBdLCBKMkVFQ29uc3RhbnRzLkVBUl9ST09UX0RJUik7Ci0JCQkJCi0JCQkJcmVtQ29tcHMobGlzdFsxXSwgb2xkTGliRGlyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdDsKLQl9CQkKLQkKLQlwcml2YXRlIE1hcCBnZXRFQVJNb2R1bGVEZXBlbmRlbmNpZXMoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBmaW5hbCBMaXN0IGNvbXBvbmVudHMpIHsKLQkJZmluYWwgTWFwIGRlcGVuZGVudENvbXBzID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gZ2V0IGFsbCBjdXJyZW50IHJlZmVyZW5jZXMgdG8gcHJvamVjdCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgRUFSCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJCi0JCQlmaW5hbCBMaXN0IGNvbXBzRm9yUHJvamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIGNvbXBvbmVudHMuZ2V0KGkpOwotCQkJZmluYWwgSVByb2plY3RbXSBkZXBlbmRlbnRQcm9qZWN0cyA9IERlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmN5R3JhcGgoKS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoY29tcC5nZXRQcm9qZWN0KCkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXBlbmRlbnRQcm9qZWN0cy5sZW5ndGg7IGorKykgewotCQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBkZXBlbmRlbnRQcm9qZWN0c1tqXTsKLQkJCQkvLyBpZiB0aGlzIGlzIGFuIEVBUiwgY2FuIHNraXAKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBkZXBlbmRlbnRDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJLy8gZW5zdXJlIHRoYXQgdGhlIHByb2plY3QncyBzaGFyZSBhbiBFQVIKLQkJCQlmaW5hbCBJUHJvamVjdFtdIHJlZkVBUnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQkJCWJvb2xlYW4gc2FtZUVBUiA9IGZhbHNlOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcmVmRUFScy5sZW5ndGg7IGsrKykgewotCQkJCQlpZiAocmVmRUFSc1trXS5lcXVhbHMoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQkJCXNhbWVFQVIgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFzYW1lRUFSKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBpZiB0aGUgZGVwZW5kZW5jeSBpcyBhIHdlYiBsaWIgZGVwZW5kZW5jeSwgY2FuIHNraXAKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBkZXBlbmRlbnRDb21wLmdldFJlZmVyZW5jZShjb21wLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMobmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQljb21wc0ZvclByb2plY3QuYWRkKGRlcGVuZGVudENvbXApOwotCQkJfQotCQkJZGVwZW5kZW50Q29tcHMucHV0KGNvbXAsIGNvbXBzRm9yUHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZGVudENvbXBzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRUFSQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIE1hcCBkZXBlbmRlbnRDb21wcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEl0ZXJhdG9yIHRhcmdldHMgPSBkZXBlbmRlbnRDb21wcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAodGFyZ2V0cy5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldCA9IChJVmlydHVhbENvbXBvbmVudCkgdGFyZ2V0cy5uZXh0KCk7Ci0JCQlmaW5hbCBMaXN0IHNvdXJjZXMgPSAoTGlzdCkgZGVwZW5kZW50Q29tcHMuZ2V0KHRhcmdldCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBzb3VyY2UgPSAoSVZpcnR1YWxDb21wb25lbnQpIHNvdXJjZXMuZ2V0KGkpOwotCQkJCWZpbmFsIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBzb3VyY2UpOwotCQkJCWZpbmFsIExpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCQkJbW9kSGFuZGxlc0xpc3QuYWRkKHRhcmdldCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkJCW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJCS8vIHVwZGF0ZSB0aGUgbWFuaWZlc3QKLQkJCQlyZW1vdmVNYW5pZmVzdERlcGVuZGVuY3koc291cmNlLCB0YXJnZXQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVNYW5pZmVzdERlcGVuZGVuY3koZmluYWwgSVZpcnR1YWxDb21wb25lbnQgc291cmNlLCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXQpIAotCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIHNvdXJjZVByb2pOYW1lID0gc291cmNlLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyB0YXJnZXRQcm9qTmFtZTsgCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCXRhcmdldFByb2pOYW1lID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdGFyZ2V0KS5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXRoU2VnbWVudHMgPSB0YXJnZXRQcm9qTmFtZS5zcGxpdChQQVRIX1NFUEFSQVRPUik7Ci0JCQl0YXJnZXRQcm9qTmFtZSA9IHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV07Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRQcm9qTmFtZSA9IHRhcmdldC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWZpbmFsIElGaWxlIG1hbmlmZXN0bWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUoc291cmNlLmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIEFyY2hpdmVNYW5pZmVzdCBtZiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG1mID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIElEYXRhTW9kZWwgdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgc291cmNlUHJvak5hbWUpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GSUxFLCBtYW5pZmVzdG1mKTsKLQkJU3RyaW5nW10gY3AgPSBtZi5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJTGlzdCBjcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBjcFRvUmVtb3ZlID0gKHRhcmdldFByb2pOYW1lLmVuZHNXaXRoKCIuamFyIikpID8gCi0JCQkJdGFyZ2V0UHJvak5hbWUgOiAKLQkJCQkJdGFyZ2V0UHJvak5hbWUgKyAiLmphciI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNwW2ldLmVxdWFscyhjcFRvUmVtb3ZlKSkgewotCQkJCWNwTGlzdC5hZGQoY3BbaV0pOwotCQkJfQotCQl9Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCwgY3BMaXN0KTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCApOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiBnZW5lcmF0ZUVBUkRET3BlcmF0aW9uKCkgewkJCi0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0RELCBlYXJDb21wb25lbnQpOwkJCQkJCi0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNULCBwcm9qZWN0KTsJCQotCQlyZXR1cm4gbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcywgU3RyaW5nIGRpcikgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRzSGFuZGxlcyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBkaXIpOwkJCi0JCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudHNUb1JlbW92ZSgpewotCQkvL2oyZWVDb21wb25lbnRMaXN0ID0gZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKCBlYXJDb21wb25lbnQgIT0gbnVsbCAmJiBsaXN0ICE9IG51bGwgKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gb2xkcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGhhbmRsZSA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYoIWoyZWVDb21wb25lbnRMaXN0LmNvbnRhaW5zKGhhbmRsZSkgJiYgKGlzVmVyc2lvbjUgPyAhajJlZUxpYkVsZW1lbnRMaXN0LmNvbnRhaW5zKGhhbmRsZSkgOiB0cnVlKSl7Ci0JCQkJCWlmICgoaGFuZGxlIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpICYmIChpc1BoeXNpY2FsbHlBZGRlZCgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpaGFuZGxlKSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbGlzdC5hZGQoaGFuZGxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0JCi0JLy8gRUFSNSBjYXNlCi0JcHJvdGVjdGVkIExpc3RbXSBnZXRDb21wb25lbnRzVG9SZW1vdmVVcGRhdGUoYm9vbGVhbiBkaXJVcGRhdGVkKXsKLQkJLy9qMmVlQ29tcG9uZW50TGlzdCA9IGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKTsKLQkJTGlzdFtdIGxpc3QgPSBuZXcgQXJyYXlMaXN0WzJdOwotCQlsaXN0WzBdID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0WzFdID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiggZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgbGlzdCAhPSBudWxsICl7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gb2xkcmVmc1tqXTsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBoYW5kbGUgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChoYW5kbGUgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotCQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWhhbmRsZTsKLQkJCQkJaWYgKGlzUGh5c2ljYWxseUFkZGVkKGNvbXApKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmKCFqMmVlQ29tcG9uZW50TGlzdC5jb250YWlucyhoYW5kbGUpICYmIHJlZi5nZXRSdW50aW1lUGF0aCgpLmlzUm9vdCgpKSB7Ci0JCQkJCWxpc3RbMF0uYWRkKGhhbmRsZSk7Ci0JCQkJfQotCQkJCWlmKCghajJlZUxpYkVsZW1lbnRMaXN0LmNvbnRhaW5zKGhhbmRsZSkgfHwgZGlyVXBkYXRlZCkgJiYKLQkJCQkJCXJlZi5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKG9sZExpYkRpcikpIHsJCi0JCQkJCWxpc3RbMV0uYWRkKGhhbmRsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gc2VsZWN0QWxsQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVzZWxlY3RBbGxCdXR0b24pCi0JCQloYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gcHJvamVjdEphckJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdFByb2plY3RKYXJCdXR0b24oKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gZXh0ZXJuYWxKYXJCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpOwotCQllbHNlIGlmKGV2ZW50LndpZGdldCA9PSBhZGRWYXJpYWJsZUJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGNoYW5nZUxpYlBhdGhCdXR0b24pIHsKLQkJCXRoaXMuaGFuZGxlQ2hhbmdlTGliRGlyQnV0dG9uKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KHRydWUpOwotCQlqYXZhUHJvamVjdHNMaXN0ID0gZ2V0Q2hlY2tlZEphdmFQcm9qZWN0c0FzTGlzdCh0cnVlKTsJCQotCQlpZiAoaXNWZXJzaW9uNSkgewotCQkJajJlZUxpYkVsZW1lbnRMaXN0ID0gZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdChmYWxzZSk7Ci0JCQlqYXZhTGliUHJvamVjdHNMaXN0ID0gZ2V0Q2hlY2tlZEphdmFQcm9qZWN0c0FzTGlzdChmYWxzZSk7CQkJCi0JCX0gCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJaWYgKGlzVmVyc2lvbjUpIHsKLQkJCSgoRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlcilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKS5zZXRBbGxTZWNvbmRDaGVja2VkKGZhbHNlKTsKLQkJCWxpYnNUb1VuY2hlY2suY2xlYXIoKTsKLQkJfQotCQlqMmVlQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJamF2YVByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGlzVmVyc2lvbjUpIHsKLQkJCWoyZWVMaWJFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWphdmFMaWJQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogW0J1ZyAyMzgyNjRdCi0JICogQWRkIGFuIGFyY2hpdmUgYXMgYSBwb3RlbnRpYWwgbmV3IHJlZmVyZW5jZSBmb3IgdGhpcy5lYXJDb21wb25lbnQKLQkgKiBOT1RFMTogdGhlIGdpdmVuIGFyY2hpdmUgd2lsbCBub3QgYmUgYWRkZWQgYXMgYSBwb3RlbnRpYWwgcmVmZXJlbmNlIGlmIHRoZXJlIGlzIGFscmVhZHkgYSByZWZlcmVuY2UgdG8gaXQKLQkgKiBOT1RFMjogdGhlIGdpdmVuIGFyY2hpdmUgd2lsbCBvbmx5IGJlIGFkZGVkIGFzIGFuIGFjdHVhbCByZWZlcmVuY2Ugd2hlbiB0aGlzLnBlcmZvcm1PayBpcyBpbnZva2VkCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmUgdGhlIGFyY2hpdmUgdG8gYWRkIGFzIGEgcG90ZW50aWFsIG5ldyByZWZlcmVuY2UgaW4gdGhpcy5lYXJDb21wb25lbnQKLQkgKiAJCQkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUG90ZW50aWFsTmV3UmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUpIHsKLQkJLy9jaGVjayB0byBzZWUgaWYgYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGFyY2hpdmUgYWxyZWFkeSBleGlzdHMKLQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gZXhpc3RpbmdSZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudDsKLQkJYm9vbGVhbiByZWZBbHJlYWR5RXhpc3RzID0gZmFsc2U7Ci0JCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZzLmxlbmd0aCAmJiAhcmVmQWxyZWFkeUV4aXN0cztpKyspewotCQkJcmVmZXJlbmNlZENvbXBvbmVudCA9IGV4aXN0aW5nUmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlyZWZBbHJlYWR5RXhpc3RzID0gcmVmZXJlbmNlZENvbXBvbmVudC5lcXVhbHMoYXJjaGl2ZSk7Ci0JCX0KLQkJCi0JCS8vb25seSBhZGQgdGhlIGFyY2hpdmUgYXMgYSBwb3RlbnRpYWx5IG5ldyByZWZlcmVuY2UgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCQlpZighcmVmQWxyZWFkeUV4aXN0cykgewotCQkJdGhpcy5qMmVlQ29tcG9uZW50TGlzdC5hZGQoYXJjaGl2ZSk7Ci0JCQl0aGlzLmFkZGVkSkFSQ29tcG9uZW50cy5hZGQoYXJjaGl2ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvL1RPRE8gc2hvdWxkIGluZm9ybSB1c2VyIHRoYXQgdGhleSBzZWxlY3RlZCBhbiBhbHJlYWR5IHJlZmVyZW5jZWQgYXJjaGl2ZT8KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKXsKLQkJSVBhdGhbXSBzZWxlY3RlZD0gQnVpbGRQYXRoRGlhbG9nQWNjZXNzLmNob29zZUV4dGVybmFsSkFSRW50cmllcyhwcm9wUGFnZS5nZXRTaGVsbCgpKTsKLQotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KCBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpLCB0eXBlICsKLQkJCQkJCQlzZWxlY3RlZFtpXS50b1N0cmluZygpKTsKLQkJCQkKLQkJCQl0aGlzLmFkZFBvdGVudGlhbE5ld1JlZmVyZW5jZShhcmNoaXZlKTsKLQkJCX0KLQkJCXJlZnJlc2goKTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0VmFyaWFibGVCdXR0b24oKXsKLQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKLQkJSVBhdGhbXSBwYXRocyA9ICBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKHByb3BQYWdlLmdldFNoZWxsKCksIGV4aXN0aW5nUGF0aCk7Ci0JCQotCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJcmVmcmVzaCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgocGF0aHNbaV0pOwotCi0JCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCWlmKCBmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpewotCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCggZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgdHlwZSArCi0JCQkJCQkJCXBhdGhzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkKLQkJCQkJdGhpcy5hZGRQb3RlbnRpYWxOZXdSZWZlcmVuY2UoYXJjaGl2ZSk7Ci0JCQkJfWVsc2V7Ci0JCQkJCS8vZGlzcGxheSBlcnJvcgotCQkJCX0KLQkJCX0KLQkJCXJlZnJlc2goKTsKLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZUxpYkRpckJ1dHRvbihib29sZWFuIHdhcm5CbGFuaykgewkJCQkJCi0JCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwotCQlpZiAoIXZGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKG51bGwsIAotCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5OT19ERF9NU0dfVElUTEUpLCAKLQkJCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuR0VOX0REX1FVRVNUSU9OKSkpIHJldHVybjsKLQkJCWNyZWF0ZUREKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7Ci0JCWlmIChsaWJEaXIgPT0gbnVsbCkgewotCQkJbGliRGlyID0gYXBwLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCWlmIChsaWJEaXIgPT0gbnVsbCkgbGliRGlyID0gSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSOwotCQl9Ci0JCQotCQlDaGFuZ2VMaWJEaXJEaWFsb2cgZGxnID0gbmV3IENoYW5nZUxpYkRpckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNoZWxsKCksIGxpYkRpciwgd2FybkJsYW5rKTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgcmV0dXJuOwotCQlsaWJEaXIgPSBkbGcuZ2V0VmFsdWUoKS50cmltKCk7Ci0JCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoIWxpYkRpci5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuRUFSX1JPT1RfRElSKSkgbGliRGlyID0gSVBhdGguU0VQQVJBVE9SICsgbGliRGlyOwotCQl9Ci0JCXNldExpYkRpckluQ29udGVudFByb3ZpZGVyKCk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZpbGxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlVGFibGUocGFyZW50KTsKLQkJY3JlYXRlQnV0dG9uQ29sdW1uKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uQ29sdW1uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnV0dG9uQ29sdW1uID0gY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlUHVzaEJ1dHRvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdXNoQnV0dG9ucygpIHsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihERV9TRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCXByb2plY3RKYXJCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfSkFSKSk7Ly8kTk9OLU5MUy0xJAotCQlleHRlcm5hbEphckJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRVhURVJOQUxfSkFSKSk7Ly8kTk9OLU5MUy0xJAotCQlhZGRWYXJpYWJsZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQUREVkFSSUFCTEUpKTsvLyROT04tTkxTLTEkCi0JCWlmIChpc1ZlcnNpb241KSBjaGFuZ2VMaWJQYXRoQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5DSEFOR0VfTElCX0RJUikpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBhQnV0dG9uID0gcHJpbUNyZWF0ZVB1c2hCdXR0b24obGFiZWwsIGJ1dHRvbkNvbHVtbik7Ci0JCWFCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWFCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBhQnV0dG9uOwotCX0KLQotCXB1YmxpYyBCdXR0b24gcHJpbUNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgYUJ1dHRvbkNvbHVtbikgewotCQlCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24oYUJ1dHRvbkNvbHVtbiwgU1dULlBVU0gpOwotCQlhQnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYUJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUJ1dHRvbkNvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBhQnV0dG9uQ29sdW1uID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhQnV0dG9uQ29sdW1uLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWFCdXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGFCdXR0b25Db2x1bW47Ci0JfQotCi0JcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIgPSBjcmVhdGVhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKHBhcmVudCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChlYXJDb21wb25lbnQpOwotCQkJQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIoZWFyQ29tcG9uZW50LCBqMmVlVmVyc2lvbik7Ci0JCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQkJc2V0TGliRGlySW5Db250ZW50UHJvdmlkZXIoKTsKLQkJCWFkZFRhYmxlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldExpYkRpckluQ29udGVudFByb3ZpZGVyKCkgewotCQlJQ29udGVudFByb3ZpZGVyIHByb3YgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlpZiAocHJvdiBpbnN0YW5jZW9mIEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyKSAKLQkJCSgoQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIpcHJvdikuc2V0Q3VycmVudExpYkRpcihsaWJEaXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRDaGVja1N0YXRlTGlzdGVuZXIoKTsKLQkJYWRkSG92ZXJIZWxwTGlzdGVuZXJzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEhvdmVySGVscExpc3RlbmVycygpIHsKLQkJZmluYWwgVGFibGUgdGFibGUgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCk7CQkJCQotCQljcmVhdGVMYWJlbExpc3RlbmVyKHRhYmxlKTsKLQkJY3JlYXRlVGFibGVMaXN0ZW5lcih0YWJsZSk7Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULktleURvd24sIHRhYmxlTGlzdGVuZXIpOwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIHRhYmxlTGlzdGVuZXIpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxhYmVsTGlzdGVuZXIoZmluYWwgVGFibGUgdGFibGUpIHsKLQkJbGFiZWxMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBsYWJlbC5nZXRTaGVsbCAoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCQkJCWUuaXRlbSA9IChUYWJsZUl0ZW0pIGxhYmVsLmdldERhdGEgKCJfVEFCTEVJVEVNIik7Ci0JCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24gKG5ldyBUYWJsZUl0ZW0gW10geyhUYWJsZUl0ZW0pIGUuaXRlbX0pOwotCQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQkJCXNoZWxsLmRpc3Bvc2UgKCk7Ci0JCQkJCQl0YWJsZS5zZXRGb2N1cygpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJCXNoZWxsLmRpc3Bvc2UgKCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlTGlzdGVuZXIoZmluYWwgVGFibGUgdGFibGUpIHsKLQkJdGFibGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlTaGVsbCB0aXAgPSBudWxsOwotCQkJTGFiZWwgbGFiZWwgPSBudWxsOwotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJCWNhc2UgU1dULktleURvd246Ci0JCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogewotCQkJCQkJaWYgKHRpcCA9PSBudWxsKSBicmVhazsKLQkJCQkJCXRpcC5kaXNwb3NlICgpOwotCQkJCQkJdGlwID0gbnVsbDsKLQkJCQkJCWxhYmVsID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgU1dULk1vdXNlSG92ZXI6IHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAobmV3IFBvaW50IChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFpdGVtLmdldEdyYXllZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJaWYgKHRpcCAhPSBudWxsICAmJiAhdGlwLmlzRGlzcG9zZWQgKCkpIHRpcC5kaXNwb3NlICgpOwotCQkJCQkJCXRpcCA9IG5ldyBTaGVsbCAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkgICAgICAgICAgICAgICAgLmdldFNoZWxsKCksIFNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0JCQkJCQkJdGlwLnNldEJhY2tncm91bmQgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkJCQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJCQkJCXRpcC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwgKHRpcCwgU1dULldSQVApOwotCQkJCQkJCWxhYmVsLnNldEZvcmVncm91bmQgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCQlsYWJlbC5zZXREYXRhICgiX1RBQkxFSVRFTSIsIGl0ZW0pOwotCQkJCQkJCWxhYmVsLnNldFRleHQgKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkhPVkVSX0hFTFBfRk9SX0RJU0FCTEVEX0xJQlMpKTsKLQkJCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJCVBvaW50IHNpemUgPSB0aXAuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoMCk7Ci0JCQkJCQkJUG9pbnQgcHQgPSB0YWJsZS50b0Rpc3BsYXkgKHJlY3QueCwgcmVjdC55KTsKLQkJCQkJCQl0aXAuc2V0Qm91bmRzIChwdC54LCBwdC55IC0gc2l6ZS55LCBzaXplLngsIHNpemUueSk7Ci0JCQkJCQkJdGlwLnNldFZpc2libGUgKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja2JveFRhYmxlVmlld2VyIHZyID0gKENoZWNrYm94VGFibGVWaWV3ZXIpZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKHZyLmdldEdyYXllZChlbGVtZW50KSkgCi0JCQkJCXZyLnNldENoZWNrZWQoZWxlbWVudCwgIXZyLmdldENoZWNrZWQoZWxlbWVudCkpOwotCQkJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKCEoZXZlbnQgaW5zdGFuY2VvZiBTZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50KSAmJiAoaXNWZXJzaW9uNSkpIHsKLQkJCQkJT2JqZWN0W10gaXRlbXMgPSAoKERvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIpdnIpLmdldFVuY2hlY2tlZEl0ZW1zKCk7CQkJCQkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gaXRlbSA9IChEb3VibGVDaGVja2JveFRhYmxlSXRlbSlpdGVtc1tpXTsKLQkJCQkJCWlmIChpdGVtLmdldFNlY29uZENoZWNrZWQoKSkgewotCQkJCQkJCWl0ZW0uc2V0U2Vjb25kQ2hlY2tlZChmYWxzZSk7Ci0JCQkJCQkJbGlic1RvVW5jaGVjay5yZW1vdmUoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKGV2ZW50IGluc3RhbmNlb2YgU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudCkpIHsKLQkJCQkJU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudCBldnQgPSAoU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudClldmVudDsKLQkJCQkJRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gdGJsSXRlbSA9IGV2dC5nZXRUYWJsZUl0ZW0oKTsKLQkJCQkJaWYgKHRibEl0ZW0uZ2V0U2Vjb25kQ2hlY2tlZCgpICYmIGlzQ29uZmxpY3QodGJsSXRlbS5nZXREYXRhKCkpKSB7Ci0JCQkJCQlEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGRsZyA9IG5ldyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkgICAgICAgICAgICAgICAgLmdldFNoZWxsKCksIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMik7Ci0JCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nLkJUTl9JRF9DQU5DRUwpIHsKLQkJCQkJCQl0YmxJdGVtLnNldFNlY29uZENoZWNrZWQoZmFsc2UpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQkKLQkJCQkJaWYgKHRibEl0ZW0uZ2V0U2Vjb25kQ2hlY2tlZCgpKSB7Ci0JCQkJCQlpZiAoIXRibEl0ZW0uZ2V0Q2hlY2tlZCgpKQotCQkJCQkJCXRibEl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsJCQkJCQkKLQkJCQkJCWxpYnNUb1VuY2hlY2suYWRkKGV2ZW50LmdldEVsZW1lbnQoKSk7CQotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlic1RvVW5jaGVjay5yZW1vdmUoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlqMmVlQ29tcG9uZW50TGlzdCA9IGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QodHJ1ZSk7Ci0JCQkJamF2YVByb2plY3RzTGlzdCA9IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QodHJ1ZSk7CQkKLQkJCQlpZiAoaXNWZXJzaW9uNSkgewotCQkJCQlqMmVlTGliRWxlbWVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KGZhbHNlKTsKLQkJCQkJamF2YUxpYlByb2plY3RzTGlzdCA9IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoZmFsc2UpOwkJCQkJCi0JCQkJCQotCQkJCX0gCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRDUENvbXBvbmVudHNJbkVhcihib29sZWFuIGluTGliRm9sZGVyKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIHBhdGhUb0NvbXAgPSBuZXcgSGFzaE1hcCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZzW10gPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IoIGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCWlmICgocmVmLmdldFJ1bnRpbWVQYXRoKCkuaXNSb290KCkgJiYgIWluTGliRm9sZGVyKSB8fAotCQkJCSghcmVmLmdldFJ1bnRpbWVQYXRoKCkuaXNSb290KCkgJiYgaW5MaWJGb2xkZXIpIHx8Ci0JCQkJIWlzVmVyc2lvbjUpIHsKLQkJCQkKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5hZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMobGlzdCwgcGF0aFRvQ29tcCwgY29tcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudHNJbkVhcihib29sZWFuIGluTGliRm9sZGVyKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmc1tdID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yKCBpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQlpZiAoKHJlZi5nZXRSdW50aW1lUGF0aCgpLmlzUm9vdCgpICYmICFpbkxpYkZvbGRlcikgfHwKLQkJCQkoIXJlZi5nZXRSdW50aW1lUGF0aCgpLmlzUm9vdCgpICYmIGluTGliRm9sZGVyKSB8fAotCQkJCSFpc1ZlcnNpb241KSB7Ci0JCQkJCi0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJbGlzdC5hZGQoY29tcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnRIYW5kbGUKLQkgKiBAcmV0dXJuCi0JICogQGRlc2NyaXB0aW9uICByZXR1cm5zIHRydWUgaXMgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBpbiB0aGUgRUFSIGFzIGEgZGVwZW5kZW50Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5FQVJBbHJlYWR5KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZnNbXSA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciggaW50IGk9MDsgaTwgcmVmcy5sZW5ndGg7IGkrKyl7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJaWYgICggcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoIGNvbXBvbmVudCApKQotCQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQkvLyBUaGUgbmV4dCB0d28gYXJlIHVzZWQgaW4gRUFSNSBjYXNlCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdChib29sZWFuIHNpbmdsZUNoZWNrZWQpIHsJCQotCQlPYmplY3RbXSBlbGVtZW50czsKLQkJaWYgKGlzVmVyc2lvbjUpIHsKLQkJCWVsZW1lbnRzID0gc2luZ2xlQ2hlY2tlZCA/ICgoRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlcilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKS5nZXRTaW5nbGVDaGVja2VkRWxlbWVudHMoKToKLQkJCQkJCQkJCSAgICgoRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlcilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKS5nZXREb3VibGVDaGVja2VkRWxlbWVudHMoKTsKLQkJCQkKLQkJfSBlbHNlIHsKLQkJCWVsZW1lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJfQotCQlMaXN0IGxpc3Q7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMCk7IC8vIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Qgd291bGQgY2F1c2UgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiBhIGxhdGVyIGF0dGVtcHQgdG8gYWRkIHRvIGl0IGlzIG1hZGUKLQkJZWxzZSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJCWxpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoYm9vbGVhbiBzaW5nbGUpIHsKLQkJT2JqZWN0W10gZWxlbWVudHM7Ci0JCWlmIChpc1ZlcnNpb241KSB7Ci0JCQllbGVtZW50cyA9IHNpbmdsZSA/ICgoRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlcilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKS5nZXRTaW5nbGVDaGVja2VkRWxlbWVudHMoKSA6Ci0JCQkJCQkJCSgoRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlcilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKS5nZXREb3VibGVDaGVja2VkRWxlbWVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWVsZW1lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJfQotCQkKLQkJTGlzdCBsaXN0OwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOyAvLyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIHdvdWxkIGNhdXNlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHdoZW4gYSBsYXRlciBhdHRlbXB0IHRvIGFkZCB0byBpdCBpcyBtYWRlCi0JCWVsc2UgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkJCi0JcHJvdGVjdGVkIExpc3QgZ2V0TGliRm9sZGVyTGlic0FzTGlzdCgpIHsKLQkJT2JqZWN0W10gaXRlbXMgPSAoKERvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIpYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcikuZ2V0U2Vjb25kQ2hlY2tlZEl0ZW1zKCk7Ci0JCUxpc3QgbGlzdDsKLQkJaWYgKGl0ZW1zID09IG51bGwgfHwgaXRlbXMubGVuZ3RoID09IDApCi0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgwKTsgLy8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCB3b3VsZCBjYXVzZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB3aGVuIGEgbGF0ZXIgYXR0ZW1wdCB0byBhZGQgdG8gaXQgaXMgbWFkZQotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSAoKERvdWJsZUNoZWNrYm94VGFibGVJdGVtKWl0ZW1zW2ldKS5nZXREYXRhKCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludCBmbGFncyA9IFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEk7Ci0KLQkJVGFibGUgdGFibGUgPSBpc1ZlcnNpb241ID8gbmV3IFRhYmxlKHBhcmVudCwgZmxhZ3MpIDogbmV3IFRhYmxlKHBhcmVudCwgZmxhZ3MpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyID0gaXNWZXJzaW9uNSA/IG5ldyBEb3VibGVDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlLCAyKSA6IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJaWYgKGlzVmVyc2lvbjUpIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjAwLCB0cnVlKSk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRTb3J0ZXIobnVsbCk7Ci0KLQkJLy8gdGFibGUgY29sdW1ucwotCQlUYWJsZUNvbHVtbiBmaWxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQlmaWxlTmFtZUNvbHVtbi5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuSkFSX01vZHVsZV9VSV8pOyAKLQkJZmlsZU5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIHByb2plY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAxKTsKLQkJcHJvamVjdENvbHVtbi5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuUHJvamVjdF9VSV8pOyAKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQlpZiAoaXNWZXJzaW9uNSkgewotCQkJVGFibGVDb2x1bW4gYm5kQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMik7Ci0JCQlibmRDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLlBhY2tlZF9Jbl9MaWJfVUlfKTsgCi0JCQlibmRDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwkJCQotCQl9Ci0JCQkKLQkJdGFibGVMYXlvdXQubGF5b3V0KHRhYmxlLCB0cnVlKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXI7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2Vjb25kU2hvdWxkQmVEaXNhYmxlZChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYoY29tcG9uZW50LmlzQmluYXJ5KCkpIHJldHVybiBmYWxzZTsKLQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpICYmIGNvbXBvbmVudC5pc0JpbmFyeSgpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiB0cnVlOwotCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQoY29tcG9uZW50KSkgcmV0dXJuIHRydWU7Ci0JCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiB0cnVlOwotCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHJldHVybiB0cnVlOwotCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1Byb2plY3RPZlR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgSUoyRUVGYWNldENvbnN0YW50cy5KQVZBKSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BoeXNpY2FsbHlBZGRlZChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVBhdGggcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwID0gY29tcG9uZW50LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQkJCi0JCQotCXByaXZhdGUgYm9vbGVhbiBpc0luTGliRGlyKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXApIHsKLQkJSVBhdGggcCA9IGNvbXAuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlpZiAocC5zZWdtZW50Q291bnQoKSA9PSAyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWludCBudW1saW5lcyA9IE1hdGgubWluKDEwLCBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vW0J1ZyAyMzgyNjRdIGZvciBhbGwgdGhlIGphcnMgaW4gdGhlIGNhY2hlIHRlbXBhcmFseSBsaXN0IHRoZW0gaW4gdGhlIGdyaWQKLQkJLy8gdW50aWwgdGhlIHVzZXIgYXBwbHlzIHRoZSBjaGFuZ2VzCi0JCWZvcihJVmlydHVhbENvbXBvbmVudCBqYXJDb21wb25lbnQgOiB0aGlzLmFkZGVkSkFSQ29tcG9uZW50cykgewotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5hZGQoamFyQ29tcG9uZW50KTsKLQkJfQotCQkKLQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9PYmplY3RbXSBjb21wcyA9IGdldENvbXBvbmVudHNJbkVhcigpOwotCQlMaXN0IGNwQ29tcHM7Ci0JCUxpc3QgY3BMaWJDb21wcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUhhc2hTZXQgajJlZUNvbXBvbmVudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgajJlZUxpYkNvbXBvbmVudFNldCA9IG5ldyBIYXNoU2V0KCk7CQkKLQkJaWYgKGlzVmVyc2lvbjUpIHsKLQkJCWlmKCBqMmVlQ29tcG9uZW50TGlzdC5pc0VtcHR5KCkgKXsKLQkJCQlMaXN0IGNvbXBzID0gZ2V0Q29tcG9uZW50c0luRWFyKGZhbHNlKTsKLQkJCQlqMmVlQ29tcG9uZW50TGlzdC5hZGRBbGwoY29tcHMpOwotCQkJfQotCQkJaWYoIGoyZWVMaWJFbGVtZW50TGlzdC5pc0VtcHR5KCkgKXsKLQkJCQlMaXN0IGNvbXBzID0gZ2V0Q29tcG9uZW50c0luRWFyKHRydWUpOwotCQkJCWoyZWVMaWJFbGVtZW50TGlzdC5hZGRBbGwoY29tcHMpOwotCQkJfQkJCQotCQkJLy8gZ2V0IGFsbCBDbGFzc3BhdGggY29udHJpYnV0aW9ucyB0byB0aGUgRWFyCi0JCQljcENvbXBzID0gZ2V0Q1BDb21wb25lbnRzSW5FYXIoZmFsc2UpOwotCQkJajJlZUNvbXBvbmVudExpc3QuYWRkQWxsKGNwQ29tcHMpOwkKLQkJCWNwTGliQ29tcHMgPSBnZXRDUENvbXBvbmVudHNJbkVhcih0cnVlKTsKLQkJCWoyZWVMaWJFbGVtZW50TGlzdC5hZGRBbGwoY3BMaWJDb21wcyk7CQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlTGliRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlqMmVlTGliQ29tcG9uZW50U2V0LmFkZChqMmVlTGliRWxlbWVudExpc3QuZ2V0KGkpKTsKLQkJCX0KLQkJCQkKLQkJfSBlbHNlIHsKLQkJCWlmKCBqMmVlQ29tcG9uZW50TGlzdC5pc0VtcHR5KCkgKXsKLQkJCQlMaXN0IGNvbXBzID0gZ2V0Q29tcG9uZW50c0luRWFyKGZhbHNlKTsKLQkJCQlqMmVlQ29tcG9uZW50TGlzdC5hZGRBbGwoY29tcHMpOwotCQkJfQotCQkJLy8gZ2V0IGFsbCBDbGFzc3BhdGggY29udHJpYnV0aW9ucyB0byB0aGUgRWFyCi0JCQljcENvbXBzID0gZ2V0Q1BDb21wb25lbnRzSW5FYXIoZmFsc2UpOwotCQkJajJlZUNvbXBvbmVudExpc3QuYWRkQWxsKGNwQ29tcHMpOwkJCQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgajJlZUNvbXBvbmVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWoyZWVDb21wb25lbnRTZXQuYWRkKGoyZWVDb21wb25lbnRMaXN0LmdldChpKSk7Ci0JCX0KLQkJCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQl0cnkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQgfHwgCi0JCQkJCQkoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpIGVsZW1lbnQpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSkgewotCQkJCQlpZiAoajJlZUNvbXBvbmVudFNldC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBzaG91bGRCZURpc2FibGVkID0gZmFsc2U7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCQkJCXNob3VsZEJlRGlzYWJsZWQgPSBpc1BoeXNpY2FsbHlBZGRlZCgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpZWxlbWVudCk7Ci0JCQkJCQlpZiAoc2hvdWxkQmVEaXNhYmxlZCkgewotCQkJCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJCQkJaXRlbXNbaV0uc2V0R3JheWVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpc1ZlcnNpb241KSB7Ci0JCQkJCQlEb3VibGVDaGVja2JveFRhYmxlSXRlbSBkY2JJdGVtID0gKERvdWJsZUNoZWNrYm94VGFibGVJdGVtKWl0ZW1zW2ldOyAKLQkJCQkJCWJvb2xlYW4gc2Vjb25kRW5hYmxlZCA9IHRydWU7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSAKLQkJCQkJCQlzZWNvbmRFbmFibGVkID0gIXNlY29uZFNob3VsZEJlRGlzYWJsZWQoKElWaXJ0dWFsQ29tcG9uZW50KSBlbGVtZW50KTsKLQkJCQkJCWlmIChzaG91bGRCZURpc2FibGVkKSB7Ci0JCQkJCQkJZGNiSXRlbS5zZXRTZWNvbmRDaGVja2VkKGlzSW5MaWJEaXIoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWVsZW1lbnQpKTsKLQkJCQkJCQlkY2JJdGVtLnNldFNlY29uZEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkY2JJdGVtLnNldFNlY29uZENoZWNrZWQoajJlZUxpYkNvbXBvbmVudFNldC5jb250YWlucyhlbGVtZW50KSk7CQkJCQkJCQotCQkJCQkJCWRjYkl0ZW0uc2V0U2Vjb25kRW5hYmxlZChzZWNvbmRFbmFibGVkKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChqMmVlTGliQ29tcG9uZW50U2V0LmNvbnRhaW5zKGVsZW1lbnQpKSBsaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0JCQotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSAKLQkJCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0Q2hlY2tlZChsaXN0LmdldChpKSwgdHJ1ZSk7Ci0JCUdyaWREYXRhIGJ0bmRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoYnRuZGF0YSk7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb25mbGljdChPYmplY3QgbGliKSB7Ci0JCUlQcm9qZWN0IGxpYlByb2ogPSAobGliIGluc3RhbmNlb2YgSVByb2plY3QpID8gKElQcm9qZWN0KWxpYiA6ICgoSVZpcnR1YWxDb21wb25lbnQpbGliKS5nZXRQcm9qZWN0KCk7IAotCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gZWFyQ29tcG9uZW50LmdldFByb2plY3QoKTsJCi0JCXRyeSB7CQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBjbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKLQkJCUlQcm9qZWN0W10gZWFyUmVmUHJvamVjdHMgPSBlYXJQcm9qZWN0LmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJSZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewkKLQkJCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJSZWZQcm9qZWN0c1tpXSkgJiYKLQkJCQkJCSFlYXJSZWZQcm9qZWN0c1tpXS5lcXVhbHMobGliUHJvaikpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY21wMSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclJlZlByb2plY3RzW2ldKTsKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY21wMS5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5lcXVhbHMobGliUHJvaikpIHJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0UHJvamVjdEphckJ1dHRvbigpewotCQlJUGF0aFtdIHNlbGVjdGVkPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlSkFSRW50cmllcyhwcm9wUGFnZS5nZXRTaGVsbCgpLCBwcm9qZWN0LmdldExvY2F0aW9uKCksIG5ldyBJUGF0aFswXSk7Ci0JCi0JCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkvL0lQYXRoIGZ1bGxQYXRoID0gcHJvamVjdC5nZXRGaWxlKHNlbGVjdGVkW2ldKS5nZXRGdWxsUGF0aCgpOwkKLQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoIGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCksIHR5cGUgKwotCQkJCQkJCXNlbGVjdGVkW2ldLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotCQkJCQotCQkJCXRoaXMuYWRkUG90ZW50aWFsTmV3UmVmZXJlbmNlKGFyY2hpdmUpOwotCQkJfQotCQkJcmVmcmVzaCgpOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBbQnVnIDIzODI2NF0KLQkgKiBkZXRlcm1pbmVzIGEgdW5pcXVlIFVSSSBtYXBwaW5nIG5hbWUgZm9yIGEgZ2l2ZW4gY29tcG9uZW50Ci0JICogdGhpcyBpcyBpbiBjYXNlIHR3byBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgYSB2YWxpZCAobm9uZSBkdXBsaWNhdGUpIHVyaSBtYXBwaW5nIG5hbWUgZm9yIHRoZSBnaXZlbiBjb21wb25lbnRcCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJTWFwcGluZ05hbWUoSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSkgewotCQkKLQkJLy9nZXQgdGhlIGRlZmF1bHQgdXJpIG1hcCBuYW1lIGZvciB0aGUgZ2l2ZW4gYXJjaGl2ZQotCQlJUGF0aCBjb21wb25lbnRQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoYXJjaGl2ZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgdXJpTWFwTmFtZSA9IGNvbXBvbmVudFBhdGgubGFzdFNlZ21lbnQoKS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCi0JCQotCQkvL2NoZWNrIHRvIGJlIHN1cmUgdGhpcyB1cmkgbWFwcGluZyBpcyBub3QgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciByZWZlcmVuY2UKLQkJYm9vbGVhbiBkdXBlQXJjaGl2ZU5hbWU7Ci0JCVN0cmluZyByZWZlZENvbXBOYW1lOwotCQlpbnQgbGFzdERvdEluZGV4OwotCQlTdHJpbmcgaW5jcmVtZW50OwotCQlJVmlydHVhbFJlZmVyZW5jZSBbXSBleGlzdGluZ1JlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IoaW50IGk9MDtpPGV4aXN0aW5nUmVmcy5sZW5ndGg7aSsrKXsKLQkJCXJlZmVkQ29tcE5hbWUgPSBleGlzdGluZ1JlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKTsKLQkJCQotCQkJLy9pZiB1cmkgbWFwcGluZyBuYW1lcyBvZiB0aGUgcmVmZWQgY29tcG9uZW50IGFuZCB0aGUgZ2l2ZW4gYXJjaGl2ZSBhcmUgdGhlIHNhbWUKLQkJCS8vICBmaW5kIGEgbmV3IHVyaSBtYXAgbmFtZSBmb3IgdGhlIGdpdmVuIGFyY2hpdmUKLQkJCWlmKGV4aXN0aW5nUmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyh1cmlNYXBOYW1lKSl7Ci0JCQkJZHVwZUFyY2hpdmVOYW1lID0gdHJ1ZTsKLQkJCQkvL2ZpbmQgYSBuZXcgdXJpTWFwTmFtZSBmb3IgdGhlIGdpdmVuIGNvbXBvbmVudAotCQkJCWZvcihpbnQgaj0xOyBkdXBlQXJjaGl2ZU5hbWU7IGorKyl7Ci0JCQkJCWxhc3REb3RJbmRleCA9IHVyaU1hcE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCQkJaW5jcmVtZW50ID0gIl8iK2o7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJCS8vY3JlYXRlIHRoZSBuZXcgcG90ZW50aWFsIG5hbWUKLQkJCQkJaWYobGFzdERvdEluZGV4ICE9IC0xKXsKLQkJCQkJCXVyaU1hcE5hbWUgPSB1cmlNYXBOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpICsgaW5jcmVtZW50ICsgdXJpTWFwTmFtZS5zdWJzdHJpbmcobGFzdERvdEluZGV4KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVyaU1hcE5hbWUgPSB1cmlNYXBOYW1lLnN1YnN0cmluZygwKStpbmNyZW1lbnQ7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vZGV0ZXJtaW5lIGlmIHRoZSBuZXcgcG90ZW50aWFsIG5hbWUgaXMgdmFsaWQKLQkJCQkJZm9yKGludCBrPTA7IGs8ZXhpc3RpbmdSZWZzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlkdXBlQXJjaGl2ZU5hbWUgPSBleGlzdGluZ1JlZnNba10uZ2V0QXJjaGl2ZU5hbWUoKS5lcXVhbHModXJpTWFwTmFtZSk7Ci0JCQkJCQlpZihkdXBlQXJjaGl2ZU5hbWUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHVyaU1hcE5hbWU7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBJVmlydHVhbENvbXBvbmVudCBiZWluZyBzdXJlIHRoZSBjb3JyZWN0IGV4dGVuc2lvbgotCSAqIGlzIG9uIHRoZSBlbmQgb2YgdGhlIG5hbWUsIHRoaXMgaXMgaW1wb3J0YW50IGZvciBpbnRlcm5hbCBwcm9qZWN0cy4gQWRkZWQgZm9yIFtCdWcgMjQxNTA5XQotCSAqIAotCSAqIEBwYXJhbSB2aXJ0Q29tcCB0aGUgSVZpcnR1YWxDb21wb25lbnQgdG8gZ2V0IHRoZSBuYW1lIG9mIHdpdGggdGhlIGNvcnJlY3QgZXh0ZW5zaW9uCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgY29ycmVjdCBleHRlbnNpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRWaXJ0dWFsQ29tcG9uZW50TmFtZVdpdGhFeHRlbnNpb24oSVZpcnR1YWxDb21wb25lbnQgdmlydENvbXApIHsKLQkJU3RyaW5nIHZpcnRDb21wVVJJTWFwTmFtZSA9IHRoaXMuZ2V0VVJJTWFwcGluZ05hbWUodmlydENvbXApOwotCQkKLQkJYm9vbGVhbiBsaW5rZWRUb0VBUiA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlpZih2aXJ0Q29tcC5pc0JpbmFyeSgpKXsKLQkJCQlsaW5rZWRUb0VBUiA9ICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KXZpcnRDb21wKS5pc0xpbmtlZFRvRUFSKCk7Ci0JCQkJKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdmlydENvbXApLnNldExpbmtlZFRvRUFSKGZhbHNlKTsKLQkJCX0KLQkJCWlmKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHZpcnRDb21wKSkgewotCQkJCWlmKCF2aXJ0Q29tcFVSSU1hcE5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkpIHsKLQkJCQkJLy93ZWIgbW9kdWxlIFVSSXMgbmVlZCB0byBlbmQgaW4gV0FSCi0JCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwotCQkJCX0KLQkJCX0gZWxzZSBpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KHZpcnRDb21wKSkgewotCQkJCWlmKCF2aXJ0Q29tcFVSSU1hcE5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpIHsKLQkJCQkJLy9jb25uZWN0b3IgbW9kdWxlIFVSSXMgbmVlZCB0byBlbmQgaW4gUkFSCi0JCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOwotCQkJCX0KLQkJCX0gZWxzZSBpZighdmlydENvbXBVUklNYXBOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpKSB7Ci0JCQkJLy9hbGwgb3RoZXIgbW9kdWxlcyAoRUpCLCBBcHBDbGllbnQsIFV0aWxpdHkpIG5lZWQgdG8gZW5kIGluIEpBUgotCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYodmlydENvbXAuaXNCaW5hcnkoKSl7Ci0JCQkJKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdmlydENvbXApLnNldExpbmtlZFRvRUFSKGxpbmtlZFRvRUFSKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlydENvbXBVUklNYXBOYW1lOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVkMzcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gYnVnIDIwNzgyNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTdHJpbmcudmFsdWVPZihJUGF0aC5TRVBBUkFUT1IpOwotCQotCXByaXZhdGUgaW50IGoyZWVWZXJzaW9uOwotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50OwotCXByaXZhdGUgYm9vbGVhbiBpc0VFNSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGxpYkRpciA9IG51bGw7Ci0JCi0JCi0JcHVibGljIEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyKElWaXJ0dWFsQ29tcG9uZW50IGFFYXJDb21wb25lbnQsIGludCBqMmVlVmVyc2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmoyZWVWZXJzaW9uID0gajJlZVZlcnNpb247Ci0JCWVhckNvbXBvbmVudCA9IGFFYXJDb21wb25lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKG51bGwgIT0gZWFyQ29tcG9uZW50KXsKLQkJCWlzRUU1ID0gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCU9iamVjdFtdIGVtcHR5ID0gbmV3IE9iamVjdFswXTsKLQkJaWYgKCEoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpKQotCQkJcmV0dXJuIGVtcHR5OwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gKChJV29ya3NwYWNlUm9vdCkgaW5wdXRFbGVtZW50KS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMgPT0gbnVsbCB8fCBwcm9qZWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBlbXB0eTsKLQkJTGlzdCB2YWxpZENvbXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlNYXAgcGF0aFRvQ29tcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGdldCBmbGV4aWJsZSBwcm9qZWN0Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlpZihNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkgfHwKLQkJCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpICl7Ci0JCQkJCWludCBjb21wSjJFRVZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChjb21wb25lbnQpOwotCQkJCQlpZiggY29tcEoyRUVWZXJzaW9uIDw9IGoyZWVWZXJzaW9uKXsKLQkJCQkJCXZhbGlkQ29tcExpc3QuYWRkKGNvbXBvbmVudCk7Ci0JCQkJCX0gZWxzZSBpZihpc0VFNSl7Ci0JCQkJCQl2YWxpZENvbXBMaXN0LmFkZChjb21wb25lbnQpOwotCQkJCQl9Ci0JCQkJfWVsc2UgaWYobnVsbCAhPSBlYXJDb21wb25lbnQgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKXsKLQkJCQkJLy9maW5kIHRoZSBBcmNoaXZlQ29tcG9uZW50Ci0JCQkJCWlmKGNvbXBvbmVudC5lcXVhbHMoIGVhckNvbXBvbmVudCApKXsKLQkJCQkJCWlmIChpc0VFNSkgewotCQkJCQkJCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJCQkJaWYgKGxpYkRpciA9PSBudWxsKQotCQkJCQkJCQlsaWJEaXIgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJCQkJCWlmIChsaWJEaXIgPT0gbnVsbCkKLQkJCQkJCQkJbGliRGlyID0gSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSOwotCQkJCQkJfQotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBuZXdyZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJCWZvciggaW50IGs9MDsgazwgbmV3cmVmcy5sZW5ndGg7IGsrKyApewotCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IG5ld3JlZnNba107Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZGNvbXAgPSB0bXByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwkJCi0JCQkJCQkJYm9vbGVhbiBpc0JpbmFyeSA9IHJlZmVyZW5jZWRjb21wLmlzQmluYXJ5KCk7Ci0JCQkJCQkJaWYoIGlzQmluYXJ5ICl7Ci0JCQkJCQkJCWlmIChzaG91bGRTaG93KHJlZmVyZW5jZWRjb21wKSkKLQkJCQkJCQkJCXZhbGlkQ29tcExpc3QuYWRkKHJlZmVyZW5jZWRjb21wKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXModmFsaWRDb21wTGlzdCwgcGF0aFRvQ29tcCwgcmVmZXJlbmNlZGNvbXApOwotCQkJCQkJCX0KLQkJCQkJCX0JCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQl0cnkgewotCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIHByb2plY3QuaGFzTmF0dXJlKCJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIikgKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYoICFwcm9qZWN0LmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikgKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29tcExpc3QudG9BcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TGliRGlyKFN0cmluZyBsaWJEaXIpIHsKLQkJdGhpcy5saWJEaXIgPSBsaWJEaXI7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTaG93KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiAoIShjb21wb25lbnQgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkpIAotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudDsKLQkJSVBhdGggcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwID0gY29tcC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKHAgPT0gbnVsbCkgJiYgKHAuc2VnbWVudENvdW50KCkgPT0gMCkpCi0JCQlyZXR1cm4gdHJ1ZTsJCi0JCUlDb250YWluZXIgZiAgPSBlYXJDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJU3RyaW5nIHJvb3RGb2xkZXJOYW1lID0gZi5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudCgwKTsKLQkJaWYgKCFwLnNlZ21lbnQoMCkuZXF1YWxzKHJvb3RGb2xkZXJOYW1lKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwLnNlZ21lbnRDb3VudCgpID09IDIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGlzRUU1KSB7Ci0JCQlTdHJpbmcgc3RyaXBwZWRMaWJEaXIgPSBzdHJpcFNlcGFyYXRvcnMobGliRGlyKTsKLQkJCVN0cmluZ1tdIGxpYkRpclNlZ3MgPSBzdHJpcHBlZExpYkRpci5zcGxpdChQQVRIX1NFUEFSQVRPUik7IAotCQkJaWYgKHAuc2VnbWVudENvdW50KCkgLSAyICE9IGxpYkRpclNlZ3MubGVuZ3RoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGliRGlyU2Vncy5sZW5ndGg7IGkrKykgCi0JCQkJaWYgKCFsaWJEaXJTZWdzW2ldLmVxdWFscyhwLnNlZ21lbnQoaSArIDEpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBzdHJpcFNlcGFyYXRvcnMoU3RyaW5nIGRpcikgewotCQlpZiAoZGlyLnN0YXJ0c1dpdGgoUEFUSF9TRVBBUkFUT1IpKSAKLQkJCWRpciA9IGRpci5zdWJzdHJpbmcoMSk7Ci0JCWlmIChkaXIuZW5kc1dpdGgoUEFUSF9TRVBBUkFUT1IpKSAgCi0JCQlkaXIgPSBkaXIuc3Vic3RyaW5nKDAsIGRpci5sZW5ndGgoKSAtIDEpOwotCQlyZXR1cm4gZGlyOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIExpc3QgY29tcG9uZW50TGlzdCwgZmluYWwgTWFwIHBhdGhUb0NvbXAsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQgajJlZUNvbXAgPSAoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9IGoyZWVDb21wLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqPTA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgdW5yZXNvbHZlZFVSSSA9IG51bGw7Ci0JCQkJLy8gb25seSAuLi8gbWFwcGluZ3Mgc3VwcG9ydGVkIGF0IHRoaXMgbGV2ZWwKLQkJCQlpZiAoIWNwUmVmc1tqXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGlmIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGlzIGNvbXBvbmVudCBhbHJlYWR5IGhhcyBhIG1hcHBpbmcsIHNraXAgKHRoZSBjb21wIG1pZ2h0IGJlIGNvbnRyaWJ1dGVkIGJ5IG1vcmUgdGhhbgotCQkJCS8vIG9uZSBjaGlsZCBtb2R1bGUpCi0JCQkJZmluYWwgSVBhdGggcGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldENsYXNzcGF0aFZpcnR1YWxSZWZlcmVuY2VMb2NhdGlvbihjcFJlZnNbal0pOwotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIHBhdGhUb0NvbXAuZ2V0KHBhdGgpOwotCQkJCWlmIChjb21wICE9IG51bGwpIHsKLQkJCQkJLy8gcmVwbGFjZSB3aXRoIGEgdGVtcCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB3aG9zZSBJUHJvamVjdCBpcyBzZXQgdG8gYSBuZXcgcHNldWRvIG5hbWUgdGhhdCBpcwotCQkJCQkvLyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgcHJvamVjdCBjb250cmlidXRpb25zIGZvciB0aGF0IGFyY2hpdmUKLQkJCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotCQkJCQkJZmluYWwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgb2xkQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKLQkJCQkJCWNvbXBvbmVudExpc3QucmVtb3ZlKGNvbXApOwotCQkJCQkJZmluYWwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgbmV3Q29tcG9uZW50ID0gQ2xhc3NQYXRoU2VsZWN0aW9uLnVwZGF0ZURpc3BsYXlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChvbGRDb21wLCBjcFJlZnNbal0pOwotCQkJCQkJcGF0aFRvQ29tcC5wdXQocGF0aCwgbmV3Q29tcG9uZW50KTsKLQkJCQkJCWNvbXBvbmVudExpc3QuYWRkKG5ld0NvbXBvbmVudCk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aFRvQ29tcC5wdXQocGF0aCwgY3BSZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCQkJfQotCQkJCWNvbXBvbmVudExpc3QuYWRkKGNwUmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiggY29sdW1uSW5kZXggPT0gMCApewotCQkJCWlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koY29tcCkpIHsKLQkJCQkJcmV0dXJuIENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3lEaXNwbGF5U3RyaW5nKGNvbXApOwotCQkJCX0KLQkJCQlJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSUVBUk1vZGVsUHJvdmlkZXIpCi0JCQkJewotCQkJCQluYW1lID0gKChJRUFSTW9kZWxQcm92aWRlcilwcm92aWRlcikuZ2V0TW9kdWxlVVJJKGNvbXApOwotCQkJCX0KLQkJCQlpZiggbmFtZSA9PSBudWxsIHx8IG5hbWUgPT0gIiIgKXsgLy8kTk9OLU5MUy0xJAotCQkJCQluYW1lID0gY29tcC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJcmV0dXJuIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQlpZiAoY29sdW1uSW5kZXggIT0gMikgewotCQkJCXJldHVybiAoKElQcm9qZWN0KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzSGVscGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9DbGFzc0hlbHBlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2FlNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzSGVscGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NIZWxwZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUZJTEVfQ0xBU1MgPSBJRmlsZS5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0gbmV3IENsYXNzW10gewotCQlJRklMRV9DTEFTUywgSVJFU09VUkNFX0NMQVNTCi0JfTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZihJUkVTT1VSQ0VfQ0xBU1MgPT0gYWRhcHRlclR5cGUgfHwgSUZJTEVfQ0xBU1MgPT0gYWRhcHRlclR5cGUpIHsKLQkJCWlmKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgewotCQkJCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlciA9IChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIGFkYXB0YWJsZU9iamVjdDsKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwcm92aWRlci5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0JCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9DbGFzc3BhdGhUYWJsZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9DbGFzc3BhdGhUYWJsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNjliMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQ2xhc3NwYXRoVGFibGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFN0ZWZhbiBEaW1vdiwgc3RlZmFuLmRpbW92QHNhcC5jb20gLSBidWcgMjA3ODI2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkRlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLklWYWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXZhaWxhYmxlSmFyc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhUYWJsZU1hbmFnZXIgaW1wbGVtZW50cyBMaXN0ZW5lciwgSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VDbGllbnRKQVJzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gdXNlU2VydmVySkFSc0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFueUpBUnNCdG47Ci0JcHJvdGVjdGVkIEJ1dHRvbiB1cEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvd25CdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgSUNsYXNzcGF0aFRhYmxlT3duZXIgb3duZXI7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidXR0b25Db2x1bW47Ci0JcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0JcHJvdGVjdGVkIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciB2YWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXTFBFbnRyeTsKLQlwcm90ZWN0ZWQgR3JvdXAgcmFkaW9Hcm91cDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKLQlwcm90ZWN0ZWQgQXZhaWxhYmxlSmFyc1Byb3ZpZGVyIGF2YWlsYWJsZUphcnNQcm92aWRlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGV4dGVybmFsSmFyQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gcHJvamVjdEphckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFZhcmlhYmxlQnV0dG9uOwkKLQkKLQlwcm90ZWN0ZWQgU2V0IGNvbXBzVG9VbmNoZWNrID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCdXR0b25CYXJNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGhUYWJsZU1hbmFnZXIoSUNsYXNzcGF0aFRhYmxlT3duZXIgb3duZXIsIENsYXNzcGF0aE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMob3duZXIsIG1vZGVsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIENsYXNzcGF0aFRhYmxlTWFuYWdlcihJQ2xhc3NwYXRoVGFibGVPd25lciBvd25lciwgQ2xhc3NwYXRoTW9kZWwgbW9kZWwsIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy52YWxpZGF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQlwdWJsaWMgdm9pZCBmaWxsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlUmFkaW9Hcm91cChwYXJlbnQpOwotCQljcmVhdGVUYWJsZShwYXJlbnQpOwotCQljcmVhdGVCdXR0b25Db2x1bW4ocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbFdMUENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNyZWF0ZVRhYmxlKHBhcmVudCk7Ci0JCWNyZWF0ZVdMUEJ1dHRvbkNvbHVtbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsV2ViUmVmQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlVGFibGUocGFyZW50KTsKLQkJY3JlYXRlV2ViUmVmQnV0dG9uQ29sdW1uKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRUpCQ2xpZW50RGVmYXVsdHMoKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJvb2xlYW4gc2hvdWxkVXNlU2VydmVySkFScyA9IGZhbHNlOwotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7IAotCQlpbnQgZmlsdGVyTGV2ZWw7Ci0JCWJvb2xlYW4gZWpiU2VsZWN0ZWQgPSBzZWxlY3Rpb24uaXNBbnlFSkJKYXJTZWxlY3RlZCgpOwotCQlib29sZWFuIGNsaWVudFNlbGVjdGVkID0gc2VsZWN0aW9uLmlzQW55RUpCQ2xpZW50SkFSU2VsZWN0ZWQoKTsKLQkJaWYgKGVqYlNlbGVjdGVkICYmIGNsaWVudFNlbGVjdGVkKQotCQkJZmlsdGVyTGV2ZWwgPSBDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkU7Ci0JCWVsc2UgaWYgKHNob3VsZFVzZVNlcnZlckpBUnMpIHsKLQkJCWlmIChjbGllbnRTZWxlY3RlZCkKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfTk9ORTsKLQkJCWVsc2UKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX0NMSUVOVF9KQVJTOwotCQl9IGVsc2UgewotCQkJaWYgKGVqYlNlbGVjdGVkKQotCQkJCWZpbHRlckxldmVsID0gQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FOwotCQkJZWxzZQotCQkJCWZpbHRlckxldmVsID0gQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlM7Ci0JCX0KLQkJaW5pdEZpbHRlckxldmVsKGZpbHRlckxldmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRGaWx0ZXJMZXZlbChpbnQgZmlsdGVyTGV2ZWwpIHsKLQkJbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkuc2V0RmlsdGVyTGV2ZWwoZmlsdGVyTGV2ZWwpOwotCQlzd2l0Y2ggKGZpbHRlckxldmVsKSB7Ci0JCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkUpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl1c2VDbGllbnRKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlU2VydmVySkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfQ0xJRU5UX0pBUlMpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlQ2xpZW50SkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXVzZVNlcnZlckpBUnNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlMpIDoKLQkJCQl1c2VBbnlKQVJzQnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdXNlQ2xpZW50SkFSc0J0bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJdXNlU2VydmVySkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJhZGlvR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyYWRpb0dyb3VwID0gb3duZXIuY3JlYXRlR3JvdXAocGFyZW50KTsKLQkJcmFkaW9Hcm91cC5zZXRUZXh0KEVKQl9DTElFTlRfUkFESU9fVUlfKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlyYWRpb0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlyYWRpb0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl1c2VTZXJ2ZXJKQVJzQnRuID0gY3JlYXRlUmFkaW9CdXR0b24oVVNFX0VKQl9TRVJWRVJfSkFSc19VSV8sIHJhZGlvR3JvdXApOwotCQl1c2VDbGllbnRKQVJzQnRuID0gY3JlYXRlUmFkaW9CdXR0b24oVVNFX0VKQl9DTElFTlRfSkFSc19VSV8sIHJhZGlvR3JvdXApOwotCQl1c2VBbnlKQVJzQnRuCSA9IGNyZWF0ZVJhZGlvQnV0dG9uKFVTRV9CT1RIX1VJXywgcmFkaW9Hcm91cCk7Ci0JCWluaXRpYWxpemVFSkJDbGllbnREZWZhdWx0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBvd25lci5jcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVQdXNoQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXTFBCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBvd25lci5jcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVXTFBQdXNoQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXZWJSZWZCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBvd25lci5jcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVXZWJSZWZQdXNoQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIgPSBvd25lci5jcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKHBhcmVudCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF2YWlsYWJsZUphcnNQcm92aWRlciA9IG5ldyBBdmFpbGFibGVKYXJzUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYXZhaWxhYmxlSmFyc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGF2YWlsYWJsZUphcnNQcm92aWRlcik7Ci0JCWFkZFRhYmxlTGlzdGVuZXJzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdMUFB1c2hCdXR0b25zKCkgewotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJcHJvamVjdEphckJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlBST0pFQ1RfSkFSIikpOyAvLyROT04tTkxTLTEkCi0JCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVhURVJOQUxfSkFSIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFZhcmlhYmxlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQUREVkFSSUFCTEUiKSk7Ly8kTk9OLU5MUy0xJAkJCQotCQlpZiAoaXNSZWFkT25seSgpKSB7Ci0JCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXByb2plY3RKYXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlleHRlcm5hbEphckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWFkZFZhcmlhYmxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXZWJSZWZQdXNoQnV0dG9ucygpIHsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihERV9TRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWlmIChpc1JlYWRPbmx5KCkpIHsKLQkJCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1c2hCdXR0b25zKCkgewotCQl1cEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oVVBfQlVUVE9OKTsKLQkJZG93bkJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oRE9XTl9CVVRUT04pOwotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJaWYgKGlzUmVhZE9ubHkoKSkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdlYkxpYlB1c2hCdXR0b25zKCkgewotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJcHJvamVjdEphckJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlBST0pFQ1RfSkFSIikpOyAvLyROT04tTkxTLTEkCi0JCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVhURVJOQUxfSkFSIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFZhcmlhYmxlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQUREVkFSSUFCTEUiKSk7Ly8kTk9OLU5MUy0xJAkJCQotCQlpZiAoaXNSZWFkT25seSgpKSB7Ci0JCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSAKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBhQnV0dG9uID0gb3duZXIucHJpbUNyZWF0ZVB1c2hCdXR0b24obGFiZWwsIGJ1dHRvbkNvbHVtbik7Ci0JCWFCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWFCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBhQnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IG93bmVyLnByaW1DcmVhdGVSYWRpb0J1dHRvbihsYWJlbCwgcGFyZW50KTsKLQkJYUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCi0JCUNsYXNzcGF0aE1vZGVsRXZlbnQgZXZ0ID0gbmV3IENsYXNzcGF0aE1vZGVsRXZlbnQoQ2xhc3NwYXRoTW9kZWxFdmVudC5DTEFTU19QQVRIX0NIQU5HRUQpOwotCQltb2RlbC5maXJlTm90aWZpY2F0aW9uKGV2dCk7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gdXBCdXR0b24pCi0JCQl1cEJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkb3duQnV0dG9uKQotCQkJZG93bkJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzZWxlY3RBbGxCdXR0b24pCi0JCQlzZWxlY3RBbGxCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVzZWxlY3RBbGxCdXR0b24pCi0JCQlkZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VTZXJ2ZXJKQVJzQnRuKQotCQkJaGFuZGxlU2VydmVySkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VDbGllbnRKQVJzQnRuKQotCQkJaGFuZGxlQ2xpZW50SkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB1c2VBbnlKQVJzQnRuKQotCQkJaGFuZGxlQW55SkFSc0J1dHRvblNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IHByb2plY3RKYXJCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RQcm9qZWN0SmFyQnV0dG9uKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGV4dGVybmFsSmFyQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gYWRkVmFyaWFibGVCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpewotCQkgLy9vd25lci5oYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpOwotCQlpZiggb3duZXIgaW5zdGFuY2VvZiBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UpewotCQkJV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGNvbnRyb2wgPSAoV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKW93bmVyOwotCQkJY29udHJvbC5oYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpOwotCQl9IAotCX0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0UHJvamVjdEphckJ1dHRvbigpewotCQkgLy9vd25lci5oYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpOwotCQlpZiggb3duZXIgaW5zdGFuY2VvZiBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UpewotCQkJV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGNvbnRyb2wgPSAoV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKW93bmVyOwotCQkJY29udHJvbC5oYW5kbGVTZWxlY3RQcm9qZWN0SmFyQnV0dG9uKCk7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpewotCQkvL293bmVyLmhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCk7Ci0JCWlmKCBvd25lciBpbnN0YW5jZW9mIFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSl7Ci0JCQlXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgY29udHJvbCA9IChXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2Upb3duZXI7Ci0JCQljb250cm9sLmhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCk7Ci0JCX0gCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlcnZlckpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfQ0xJRU5UX0pBUlMpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNsaWVudEpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9FSkJfU0VSVkVSX0pBUlMpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFueUpBUnNCdXR0b25TZWxlY3RlZCgpIHsKLQkJbW9kZWwuc2VsZWN0RmlsdGVyTGV2ZWwoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRhdGVFZGl0KCkgewotCQlyZXR1cm4gdmFsaWRhdGVFZGl0TGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCW1vZGVsLnNldEFsbENsYXNzcGF0aEVsZW1lbnRzU2VsZWN0ZWQoZmFsc2UpOwotCQljb21wc1RvVW5jaGVjay5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdEFsbEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOyAKLQkJbW9kZWwuc2V0QWxsQ2xhc3NwYXRoRWxlbWVudHNTZWxlY3RlZChBcnJheXMuYXNMaXN0KGVsZW1lbnRzKSwgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWwgPSAoQ2xhc3NwYXRoRWxlbWVudCllbGVtZW50c1tpXTsKLQkJCWVsLmdldENvbXBvbmVudCgpLmdldEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQuY2xhc3MpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgYXIgPSBlbC5nZXRUYXJnZXRDb21wb25lbnQoKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoYXIgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpID8gYXIgOiBlbC5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChpc0xpYnJhcnkoY29tcCkpIAotCQkJCWNvbXBzVG9VbmNoZWNrLmFkZChjb21wKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3Rpb25Bc0xpc3QoKSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhdmFpbGFibGVKQVJzVmlld2VyLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldENoZWNrZWRMaWJzQXNMaXN0KCkgewotCQlMaXN0IHJlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gY29tcHNUb1VuY2hlY2suaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudClpdC5uZXh0KCk7Ci0JCQlyZXMuYWRkKGNvbXApOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG93bkJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLm1vdmVEb3duKGdldFNlbGVjdGlvbkFzTGlzdCgpKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmICghdmFsaWRhdGF0ZUVkaXQoKSkKLQkJCXJldHVybjsKLQkJbW9kZWwubW92ZVVwKGdldFNlbGVjdGlvbkFzTGlzdCgpKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBhbGwgYnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCkgewotCQlpbnRbXSBpbmRpY2VzID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJaWYgKHVwQnV0dG9uICE9IG51bGwgJiYgZG93bkJ1dHRvbiAhPSBudWxsKSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGNhbk1vdmVVcChpbmRpY2VzKSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoY2FuTW92ZURvd24oaW5kaWNlcywgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Nb3ZlVXAoaW50W10gaW5kaWNlcykgewotCQlyZXR1cm4gY2FuTW92ZShpbmRpY2VzLCAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Nb3ZlRG93bihpbnRbXSBpbmRpY2VzLCBpbnQgaXRlbUNvdW50KSB7Ci0JCXJldHVybiBjYW5Nb3ZlKGluZGljZXMsIGl0ZW1Db3VudCAtIDEpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbk1vdmUoaW50W10gaW5kaWNlcywgaW50IHJlZmVyZW5jZUluZGV4KSB7Ci0JCWludCBsZW5ndGggPSBpbmRpY2VzLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW5kaWNlc1tpXSA9PSByZWZlcmVuY2VJbmRleCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRDaGVja1N0YXRlTGlzdGVuZXIoKTsKLQkJYWRkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlicmFyeShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoY29tcG9uZW50KSkgcmV0dXJuIGZhbHNlOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpICYmIGNvbXBvbmVudC5pc0JpbmFyeSgpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiBmYWxzZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHJldHVybiBmYWxzZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBJSjJFRUZhY2V0Q29uc3RhbnRzLkpBVkEpKSByZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQkJCQotCQotCXByb3RlY3RlZCB2b2lkIGF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbCA9IChDbGFzc3BhdGhFbGVtZW50KWV2ZW50LmdldEVsZW1lbnQoKTsKLQkJLy8yMjY4MjMgdGFyZ2V0aW5nIGEgcmVndWxhciBqYXZhIHByb2plY3QgZnJvbSB3ZWIgbGlicwotCQlpZihlbC5nZXRDb21wb25lbnQoKSA9PSBudWxsKXsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQltb2RlbC5zZXRTZWxlY3Rpb24oZWxlbWVudCwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCQllbC5nZXRDb21wb25lbnQoKS5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgYXIgPSBlbC5nZXRUYXJnZXRDb21wb25lbnQoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChhciBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgPyBhciA6IGVsLmdldENvbXBvbmVudCgpOwotCQlDaGVja2JveFRhYmxlVmlld2VyIHYgPSAoQ2hlY2tib3hUYWJsZVZpZXdlcilldmVudC5nZXRTb3VyY2UoKTsKLQkJaWYgKGlzTGlicmFyeShjb21wKSAmJiBldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWlmIChpc0NvbmZsaWN0KGNvbXApKSB7Ci0JCQkJRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZyBkbGcgPSBuZXcgRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZyhQbGF0Zm9ybVVJLgotCQkJCQkJZ2V0V29ya2JlbmNoKCkuCi0JCQkJCQkJZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuCi0JCQkJCQkJCWdldFNoZWxsKCksIAotCQkJCQkgIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gZGxnLkJUTl9JRF9DQU5DRUwpIHsKLQkJCQkJdi5zZXRDaGVja2VkKGVsLCBmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQljb21wc1RvVW5jaGVjay5hZGQoY29tcCk7Ci0JCX0gZWxzZSBpZiAoIWV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY29tcHNUb1VuY2hlY2sucmVtb3ZlKGNvbXApOwotCQl9Ci0JCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpICYmIChpc1JlYWRPbmx5KCkgfHwgIXZhbGlkYXRhdGVFZGl0KCkgfHwgKGlzTXlDbGllbnRKQVIoZXZlbnQpICYmICFldmVudC5nZXRDaGVja2VkKCkpKSkgewotCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgIWV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJbW9kZWwuc2V0U2VsZWN0aW9uKGVsZW1lbnQsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29uZmxpY3QoSVZpcnR1YWxDb21wb25lbnQgbGliKSB7Ci0JCUlQcm9qZWN0W10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMobGliLmdldFByb2plY3QoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChlYXJzW2ldKSkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNtcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhcnNbaV0pOwotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNtcC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7CQotCQkJCQlpZiAobW9kZWwuZ2V0UHJvamVjdCgpLmVxdWFscyhyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjbXAuZ2V0UmVmZXJlbmNlKGxpYi5nZXROYW1lKCkpOwotCQkJCQkJaWYgKCFyZWYuZ2V0UnVudGltZVBhdGgoKS5pc1Jvb3QoKSkgcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTXlDbGllbnRKQVIoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZXZlbnQuZ2V0RWxlbWVudCgpOwotCQlpZihnZXRDbGFzc3BhdGhTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldENsYXNzcGF0aFNlbGVjdGlvbigpLmlzTXlDbGllbnRKQVIoZWxlbWVudCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXRhYmxlU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmICghaXNSZWFkT25seSgpKQotCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldENsYXNzcGF0aFNlbGVjdGlvbigpIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwuZ2V0U2VsZWN0ZWRFQVJDb21wb25lbnQoKSA9PSBudWxsICYmICEoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaENoZWNrZWRJdGVtcygpIHsKLQkJaWYgKGdldENsYXNzcGF0aFNlbGVjdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWphdmEudXRpbC5MaXN0IGVsZW1lbnRzID0gZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBlbGVtZW50LmlzU2VsZWN0ZWQoKSk7Ci0JCQlpZiAoZWxlbWVudC5pc0NsYXNzcGF0aERlcGVuZGVuY3koKSkgewotCQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0R3JheWVkKGVsZW1lbnQsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IG1vZGVsLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKLQkJLy8gaWYgbm90IGEgd2ViIHByb2plY3QgYW5kIGl0IGlzIGVpdGhlciByZWZlcmVuY2VkIGJ5IGFuIEVBUiBvciBhIGR5bmFtaWMgd2ViIHByb2plY3QuCi0JCWlmICghaXNXTFBFbnRyeSgpICYmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChwcm9qZWN0KSB8fCAKLQkJCQkgICAgICAgICAgICAgICAoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdXZWJQcm9qZWN0cyhwcm9qZWN0KS5sZW5ndGggPiAwKSkpIHsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQoZ2V0Q2xhc3NwYXRoU2VsZWN0aW9uKCkpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJaW50IG51bWxpbmVzID0gTWF0aC5taW4oMTAsIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSk7Ci0JCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXJlZnJlc2hDaGVja2VkSXRlbXMoKTsKLQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlpbnQgbnVtbGluZXMgPSBNYXRoLm1pbigxMCwgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiBudW1saW5lczsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcmVmcmVzaFdMUENoZWNrZWRJdGVtcygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoV0xQQ2hlY2tlZEl0ZW1zKCkgewotCQlpZiAoYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRJbnB1dCgpICE9IG51bGwpIHsKLQkJCWphdmEudXRpbC5MaXN0IGVsZW1lbnRzID0gKChDbGFzc1BhdGhTZWxlY3Rpb24pIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0SW5wdXQoKSkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBlbGVtZW50LmlzU2VsZWN0ZWQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQuaXNDbGFzc3BhdGhEZXBlbmRlbmN5KCkpIHsKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRHcmF5ZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kZWwuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ2xhc3NwYXRoTW9kZWwKLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlbC4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENsYXNzcGF0aE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJaW5pdGlhbGl6ZUVKQkNsaWVudERlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhZE9ubHkuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVhZE9ubHkuCi0JICogQHBhcmFtIHJlYWRPbmx5IFRoZSByZWFkT25seSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dMUEVudHJ5KCkgewotCQlyZXR1cm4gbW9kZWwuaXNXTFBNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyBtZXRob2QKLQkgKiBAcGFyYW0gaXNXTFBFbnRyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdMUEVudHJ5KGJvb2xlYW4gaXNXTFBFbnRyeSkgewotCQl0aGlzLmlzV0xQRW50cnkgPSBpc1dMUEVudHJ5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNsYXNzcGF0aFRhYmxlT3duZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmNjRiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNsYXNzcGF0aFRhYmxlT3duZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDbGFzc3BhdGhUYWJsZU93bmVyIHsKLQlCdXR0b24gcHJpbUNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uKTsKLQlCdXR0b24gcHJpbUNyZWF0ZVJhZGlvQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIHBhcmVudCk7Ci0JQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCUNvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0JLy9CdXR0b24gY3JlYXRlSGlkZUVKQkNsaWVudEpBUnNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCk7IFRoaXMgbWV0aG9kIGlzIG5ldmVyIHVzZWQgaGVuY2UgY29tbWV0aW5nIGl0IG91dCAtIHZrYgotCUdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNDU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKLQlTdHJpbmcgVVBfQlVUVE9OID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5VcF8xOyAKLQlTdHJpbmcgRE9XTl9CVVRUT04gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkRvd25fMjsgCi0JU3RyaW5nIFNFTEVDVF9BTExfQlVUVE9OID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5TZWxlY3RfQWxsXzM7IAotCVN0cmluZyBERV9TRUxFQ1RfQUxMX0JVVFRPTiA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuRGVzZWxlY3RfQWxsXzQ7IAotCVN0cmluZyBFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfVElUTEU7IAotCVN0cmluZyBTQVZFX01BTklGRVNUX1dJVEhfRVJST1IgPU1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuU0FWRV9NQU5JRkVTVF9XSVRIX0VSUk9SOyAKLQlTdHJpbmcgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9FRElUT1IgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SOyAKLQlTdHJpbmcgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0UgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfUFJPUF9QQUdFOyAKLQlTdHJpbmcgTUFOSUZFU1RfUFJPQkxFTV8xID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5NQU5JRkVTVF9QUk9CTEVNXzE7IAotCVN0cmluZyBNQU5JRkVTVF9QUk9CTEVNXzIgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLk1BTklGRVNUX1BST0JMRU1fMjsgCi0JU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fMyA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuTUFOSUZFU1RfUFJPQkxFTV8zOyAKLQlTdHJpbmcgTUFOSUZFU1RfUFJPQkxFTV80ID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5NQU5JRkVTVF9QUk9CTEVNXzQ7IAotCVN0cmluZyBSRURJUkVDVF9URVhUX0VESVRPUl9VSV8gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLlJFRElSRUNUX1RFWFRfRURJVE9SX1VJXzsgCi0JCi0JU3RyaW5nIEVKQl9DTElFTlRfUkFESU9fVUlfCQk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFSkJfQ0xJRU5UX1JBRElPX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9FSkJfU0VSVkVSX0pBUnNfVUlfIAk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfRUpCX1NFUlZFUl9KQVJzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9FSkJfQ0xJRU5UX0pBUnNfVUlfIAk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfRUpCX0NMSUVOVF9KQVJzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVTRV9CT1RIX1VJXwkJCQk9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVU0VfQk9USF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lKMkVFRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lKMkVFRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDA1MTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JSjJFRURlcGVuZGVuY2llc0NvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYSBwb3J0aW9uIHRoZSAiSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIgotICogcHJvcGVydHkgcGFnZSBsb2dpYy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2wgZXh0ZW5kcyBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgQ29tcG9zaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gQ29tcG9zaXRlIGZvciB0aGUgY29udHJvbC4KLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHByb3BlcnR5IHBhZ2UncyA8Y29kZT5wZXJmb3JtT2soKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBwZXJmb3JtT2soKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPnBlcmZvcm1EZWZhdWx0cygpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIHBlcmZvcm1EZWZhdWx0cygpOwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBwYWdlJ3MgPGNvZGU+cGVyZm9ybUNhbmNlbCgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHBlcmZvcm1DYW5jZWwoKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPnNldFZpc2libGUoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHByb3BlcnR5IHBhZ2UncyA8Y29kZT5kaXNwb3NlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCi0JICogQHJldHVybgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjVjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRWpiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3Qub3BlcmF0aW9ucy5JRWpiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5BcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklDb21wb25lbnRQcm9qZWN0TWlncmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2ltcGxlVmFsaWRhdGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIEoyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgaW1wbGVtZW50cyBJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTElCX0NPTlRBSU5FUiA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0xJQl9QQVRIID0gIi9XRUItSU5GL2xpYiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRF9ERVBMT1lBQkxFU19QQVRIID0gIi5kZXBsb3lhYmxlcyI7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEoyRUVfQ09OVEVOVF9FWFRFTlNJT05fSURTID0gbmV3IFN0cmluZ1tdIHsKLQkJIm9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5FQVJERENvbnRlbnQiLCAvLyROT04tTkxTLTEkCi0JCSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuV2ViRERDb250ZW50IiwgLy8kTk9OLU5MUy0xJAotCQkib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkVKQkREQ29udGVudCIsIC8vJE5PTi1OTFMtMSQKLQkJIm9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5Db25uZWN0b3JERENvbnRlbnQiIC8vJE5PTi1OTFMtMSQKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0VYUExPUkVSID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEoyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyB2b2lkIG1pZ3JhdGVQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiAoYVByb2plY3QuZ2V0RmlsZShTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSkuZXhpc3RzKCkpKSB7Ci0JCQkvLyBUaGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FIGlzIGNydWNpYWwgdG8gbWlncmF0aW9uLgotCQkJLy8gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9qZWN0IGNhbm5vdCBiZSBtaWdyYXRlZC4gV2Ugc2hvdWxkIG5ldmVyIGZhaWwgdGhlIHRlc3QgZm9yIGV4aXN0ZW5jZQotCQkJLy8gb2YgdGhlIGZpbGUsIGlmIHdlIGRvIHRoZW4gc29tZXRoaW5nIGhhcyBnb25lIGJhZGx5IHdyb25nLgotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoYVByb2plY3QuZ2V0RmlsZShTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSksIGZhbHNlKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSl7Ci0JCQkJLy8gVW5sb2FkIHRoZSByZXNvdXJjZSBiZWNhdXNlIHRoZSBtb2RlbCBpbnNpZGUgdGhlIFN0cnVjdHVyZUVkaXQgd2FzIGNhY2hlZCB3aGVuIHRoZSAKLQkJCQkvLyB0aGUgcHJvamVjdCB3YXMgaW1wb3J0ZWQsIGFuZCBmaWxlcyBtYXkgaGF2ZSBtb3ZlZCBkdWUgdG8gbWlncmF0aW9uICgud3RwbW9kdWxlcyBmb3IgZXhhbXBsZSkuCi0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQl9Ci0JCQotCQkJZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbGVzLmFkZChhUHJvamVjdC5nZXRGaWxlKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRPVF9QUk9KRUNUKSk7Ci0JCQlmaWxlcy5hZGQoYVByb2plY3QuZ2V0RmlsZShKMkVFUHJvamVjdFV0aWxpdGllcy5ET1RfQ0xBU1NQQVRIKSk7Ci0JCQlmaWxlcy5hZGQoYVByb2plY3QuZ2V0RmlsZShTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSkpOwotCQkJaWYoU2ltcGxlVmFsaWRhdGVFZGl0LnZhbGlkYXRlRWRpdChmaWxlcykpewotCQkJCXByb2plY3QgPSBhUHJvamVjdDsKLQkJCQkKLQkJCQlyZW1vdmVDb21wb25lbnRCdWlsZGVycyhwcm9qZWN0KTsKLQkJCQlpZiAobXVsdGlwbGVDb21wb25lbnRzRGV0ZWN0ZWQoKSkKLQkJCQkJY3JlYXRlTmV3UHJvamVjdHMoKTsKLQkJCQlTdHJpbmcgZmFjZXRpZCA9IGdldEZhY2V0RnJvbVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGZhY2V0aWQubGVuZ3RoKCkgPT0gMCkKLQkJCQkJYWRkRmFjZXRzKHByb2plY3QpOwotCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZW5zdXJlSjJFRUNvbnRlbnRFeHRlbnNpb25zRW5hYmxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmUgdGhlIEoyRUUgY29udGVudCBleHRlbnNpb24gaWRzIGFyZSBlbmFibGVkIG9uIHRoZSBwcm9qZWN0IGV4cGxvcmVyIAotCSAqIGZvciB0aGUgcHJvamVjdHMgYmVpbmcgbWlncmF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUoyRUVDb250ZW50RXh0ZW5zaW9uc0VuYWJsZWQoKSB7Ci0JCUlWaWV3UGFydCB2aWV3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZpZXcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKVswXS5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoUFJPSkVDVF9FWFBMT1JFUik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJLy9KdXN0IGJhaWwgYW5kIHJldHVybiBpZiB0aGVyZSBpcyBubyB2aWV3Ci0JCX0KLQkJaWYgKHZpZXcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlOYXZpZ2F0b3JDb250ZW50U2VydmljZSBjb250ZW50U2VydmljZSA9IChJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpIHZpZXcuZ2V0QWRhcHRlcihJTmF2aWdhdG9yQ29udGVudFNlcnZpY2UuY2xhc3MpOwotCQlDb21tb25WaWV3ZXIgdmlld2VyID0gKENvbW1vblZpZXdlcikgdmlldy5nZXRBZGFwdGVyKENvbW1vblZpZXdlci5jbGFzcyk7Ci0JCQotCQkvLyBTZXQgdGhlIEoyRUUgY29udGVudCBleHRlbnNpb25zIGFzIGVuYWJsZWQgbm93IHRoYXQgd2UgaGF2ZSBzZXQgdGhlIEoyRUUgZmFjZXRzCi0JCWlmIChjb250ZW50U2VydmljZSAhPSBudWxsKQotCQkJY29udGVudFNlcnZpY2UuZ2V0QWN0aXZhdGlvblNlcnZpY2UoKS5hY3RpdmF0ZUV4dGVuc2lvbnMoSjJFRV9DT05URU5UX0VYVEVOU0lPTl9JRFMsIGZhbHNlKTsKLQkJCi0JCS8vIFVwZGF0ZSB0aGUgdmlld2VyIGlmIHdlIGFyZSBpbiB0aGUgY3VycmVudCBVSSB0aHJlYWQKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKTsKLQkJCWlmIChkaXNwbGF5IT1udWxsICYmIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZXF1YWxzKGRpc3BsYXkuZ2V0VGhyZWFkKCkpKQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1Byb2plY3RzKCkgewotCi0JCQlTdHJ1Y3R1cmVFZGl0IHNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2UgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCQlMaXN0IGNvbXBzID0gc2UuZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZ2V0Q29tcG9uZW50cygpOwotCQkJCUxpc3QgcmVtb3ZlZENvbXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAxO2k8Y29tcHMuc2l6ZSgpO2krKykgewotCQkJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcCA9IChXb3JrYmVuY2hDb21wb25lbnQpIGNvbXBzLmdldChpKTsKLQkJCQkJSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQkJSVByb2plY3QgbmV3UHJvaiA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KGNvbXAuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKCFuZXdQcm9qLmV4aXN0cygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNyZWF0ZVByb2oobmV3UHJvaiwoIWNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkpOwotCQkJCQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMobmV3UHJvaik7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY29tcCE9bnVsbCAmJiBjb21wLmdldENvbXBvbmVudFR5cGUoKSE9bnVsbCkKLQkJCQkJCWFkZEZhY2V0c1RvUHJvamVjdChuZXdQcm9qLGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpLGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZlcnNpb24oKSxmYWxzZSk7Ci0JCQkJCXJlbW92ZWRDb21wcy5hZGQoY29tcCk7Ci0JCQkJCUlGb2xkZXIgY29tcEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGNvbXAuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKGNvbXBGb2xkZXIuZXhpc3RzKCkpCi0JCQkJCQl0cnkgewotCQkJCQkJCWNvbXBGb2xkZXIuZGVsZXRlKHRydWUsbnVsbCk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQl9Ci0JCQkJc2UuZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZ2V0Q29tcG9uZW50cygpLnJlbW92ZUFsbChyZW1vdmVkQ29tcHMpOwotCQkJCXNlLnNhdmUobnVsbCk7Ci0JCQkKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHNlICE9IG51bGwpCi0JCQkJCXNlLmRpc3Bvc2UoKTsKLQkJCX0KLQkKLQkJCi0JfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qKElQcm9qZWN0IG5ld1Byb2osIGJvb2xlYW4gaXNKYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJbmV3UHJvai5jcmVhdGUobnVsbCk7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihuZXdQcm9qLmdldE5hbWUoKSk7Ci0vLwkJCWlmIChpc0phdmFQcm9qZWN0KQotLy8JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXXtKYXZhQ29yZS5OQVRVUkVfSUR9KTsKLQkJCWRlc2NyaXB0aW9uLnNldExvY2F0aW9uKG51bGwpOwotCQkJbmV3UHJvai5vcGVuKG51bGwpOwotCQkJbmV3UHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGVDb21wb25lbnRzRGV0ZWN0ZWQoKSB7Ci0JCQlTdHJ1Y3R1cmVFZGl0IHNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2UgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJCWlmIChzZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKHNlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gc2UuZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZ2V0Q29tcG9uZW50cygpLnNpemUoKSA+IDE7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChzZSAhPSBudWxsKQotCQkJCQlzZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JfQotCi0JCXByaXZhdGUgdm9pZCByZW1vdmVDb21wb25lbnRCdWlsZGVycyhJUHJvamVjdCBhUHJvamVjdCkgewotCQl0cnkgewotCQkJYVByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSxudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJLy9JSmF2YVByb2plY3QgamF2YVAgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KGFQcm9qZWN0KTsKLQkJTGlzdCBvbGRCdWlsZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2xkQnVpbGRlcnMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQ29tcG9uZW50U3RydWN0dXJhbEJ1aWxkZXIiKTsKLQkJb2xkQnVpbGRlcnMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQ29tcG9uZW50U3RydWN0dXJhbEJ1aWxkZXJEZXBlbmRlbmN5UmVzb2x2ZXIiKTsKLQkJb2xkQnVpbGRlcnMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuRGVwZW5kZW5jeUdyYXBoQnVpbGRlciIpOwotCQl0cnkgewotCQkJSjJFRVByb2plY3RVdGlsaXRpZXMucmVtb3ZlQnVpbGRlcnMoYVByb2plY3Qsb2xkQnVpbGRlcnMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRGcm9tUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShhUHJvamVjdCk7Ci0JCX0KLQotCQkKLQkJcHJvdGVjdGVkIElEYXRhTW9kZWwgc2V0dXBKYXZhSW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiBleGlzdGluZyxTdHJpbmcgc3JjRm9sZGVyKSB7Ci0JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWRtLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJU3RyaW5nIGpWZXJzaW9uID0gIjEuNCI7Ci0JCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKCBwcm9qZWN0ICk7Ci0JCSAgICBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzIAotCQkgICAgICAgICAgICA9IGNvbnRleHQuZ2V0Tm9kZSggSmF2YUNvcmUuUExVR0lOX0lEICk7Ci0JCQlpZiAoSmF2YUNvcmUuVkVSU0lPTl8xXzUuZXF1YWxzKHByZWZzLmdldChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLEphdmFDb3JlLlZFUlNJT05fMV80KSkpIHsKLQkJCQlqVmVyc2lvbiA9ICI1LjAiOwotCQkJfQotCQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgalZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWV4aXN0aW5nKQotCQkJCWRtLnNldFN0cmluZ1Byb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIHNyY0ZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBkbTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIElEYXRhTW9kZWwgc2V0dXBVdGlsSW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCxTdHJpbmcgc3BlY1ZlcnNpb24pIHsKLQkJCUlEYXRhTW9kZWwgYUZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJYUZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBzcGVjVmVyc2lvbik7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUixmYWxzZSk7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLG51bGwpOwotCQkJcmV0dXJuIGFGYWNldEluc3RhbGxEYXRhTW9kZWw7Ci0JCX0KLQkJcHJvdGVjdGVkIElEYXRhTW9kZWwgc2V0dXBFYXJJbnN0YWxsQWN0aW9uKElQcm9qZWN0IGFQcm9qZWN0LFN0cmluZyBzcGVjVmVyc2lvbikgewotCQkJSURhdGFNb2RlbCBlYXJGYWNldEluc3RhbGxEYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQllYXJGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQllYXJGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgc3BlY1ZlcnNpb24pOwotCQkJCi0JCQlyZXR1cm4gZWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsOwotCQl9Ci0JCXByb3RlY3RlZCBJRGF0YU1vZGVsIHNldHVwQXBwQ2xpZW50SW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCxTdHJpbmcgc3BlY1ZlcnNpb24pIHsKLQkJCUlEYXRhTW9kZWwgYUZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHNwZWNWZXJzaW9uKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLGZhbHNlKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsbnVsbCk7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTLGZhbHNlKTsKLQkJCXJldHVybiBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsOwotCQl9Ci0JCXByb3RlY3RlZCBJRGF0YU1vZGVsIHNldHVwQ29ubmVjdG9ySW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCxTdHJpbmcgc3BlY1ZlcnNpb24pIHsKLQkJCUlEYXRhTW9kZWwgYUZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlhRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHNwZWNWZXJzaW9uKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLGZhbHNlKTsKLQkJCWFGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsbnVsbCk7Ci0JCQlyZXR1cm4gYUZhY2V0SW5zdGFsbERhdGFNb2RlbDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRGYWNldHMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJCVN0cnVjdHVyZUVkaXQgZWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShhUHJvamVjdCk7Ci0JCQkJaWYgKGVkaXQgPT0gbnVsbCkgcmV0dXJuOyAgLy8gTm90IGEgY29tcG9uZW50IHByb2plY3QuLi4uCi0JCQkJZWRpdC5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKS5zZXRVc2VPbGRGb3JtYXQodHJ1ZSk7Ci0JCQkJaWYgKGVkaXQuZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCkgcmV0dXJuOyAvLyBDYW4ndCBtaWdyYXRlCi0JCQkJQ29tcG9uZW50VHlwZSB0eXBlID0gZWRpdC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOyAgLy8gQ2FuJ3QgbWlncmF0ZQotCQkJCVN0cmluZyBjb21wSWQgPSB0eXBlLmdldENvbXBvbmVudFR5cGVJZCgpOwotCQkJCVN0cmluZyBzcGVjVmVyc2lvbiA9IGVkaXQuZ2V0Q29tcG9uZW50KCkuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZlcnNpb24oKTsKLQkJCQltb3ZlTWV0YVByb3BlcnRpZXMoZWRpdC5nZXRDb21wb25lbnQoKSx0eXBlKTsKLQkJCQlhZGRGYWNldHNUb1Byb2plY3QoYVByb2plY3QsIGNvbXBJZCwgc3BlY1ZlcnNpb24sdHJ1ZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCWVkaXQuc2F2ZShudWxsKTsKLQkJCQkJZWRpdC5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKS5zZXRVc2VPbGRGb3JtYXQoZmFsc2UpOwotCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBtb3ZlTWV0YVByb3BlcnRpZXMoV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50VHlwZSB0eXBlKSB7Ci0JCQlMaXN0IHByb3BzID0gdHlwZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlMaXN0IGNvbXBQcm9wcyA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlQcm9wZXJ0eSBlbGVtZW50ID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLQkJCQlQcm9wZXJ0eSBuZXdQcm9wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQkJbmV3UHJvcC5zZXROYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQluZXdQcm9wLnNldFZhbHVlKGVsZW1lbnQuZ2V0VmFsdWUoKSk7Ci0JCQkJY29tcFByb3BzLmFkZChuZXdQcm9wKTsKLQkJCX0KLQkJCXByb3BzLmNsZWFyKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkRmFjZXRzVG9Qcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgY29tcElkLCBTdHJpbmcgc3BlY1ZlcnNpb24sYm9vbGVhbiBleGlzdGluZykgewotCQkJaWYgKGNvbXBJZC5lcXVhbHMoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpKQotCQkJCWluc3RhbGxXRUJGYWNldHMoYVByb2plY3Qsc3BlY1ZlcnNpb24sZXhpc3RpbmcpOwotCQkJZWxzZSBpZiAoY29tcElkLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIpKQotCQkJCWluc3RhbGxFSkJGYWNldHMoYVByb2plY3Qsc3BlY1ZlcnNpb24sZXhpc3RpbmcpOwotCQkJZWxzZSBpZiAoY29tcElkLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQpKQotCQkJCWluc3RhbGxBcHBDbGllbnRGYWNldHMoYVByb2plY3Qsc3BlY1ZlcnNpb24sZXhpc3RpbmcpOwotCQkJZWxzZSBpZiAoY29tcElkLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkKLQkJCQlpbnN0YWxsRUFSRmFjZXRzKGFQcm9qZWN0LHNwZWNWZXJzaW9uLGV4aXN0aW5nKTsKLQkJCWVsc2UgaWYgKGNvbXBJZC5lcXVhbHMoSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBKSkKLQkJCQlpbnN0YWxsQ29ubmVjdG9yRmFjZXRzKGFQcm9qZWN0LHNwZWNWZXJzaW9uLGV4aXN0aW5nKTsKLQkJCWVsc2UgaWYgKGNvbXBJZC5lcXVhbHMoSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSkpCi0JCQkJaW5zdGFsbFV0aWxpdHlGYWNldHMoYVByb2plY3Qsc3BlY1ZlcnNpb24sZXhpc3RpbmcpOwotCQkJZWxzZSBpZiAoY29tcElkLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5TVEFUSUNfV0VCKSkKLQkJCQlpbnN0YWxsU3RhdGljV2ViRmFjZXRzKGFQcm9qZWN0LHNwZWNWZXJzaW9uLGV4aXN0aW5nKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbnN0YWxsU3RhdGljV2ViRmFjZXRzKElQcm9qZWN0IHByb2plY3QyLCBTdHJpbmcgc3BlY1ZlcnNpb24sIGJvb2xlYW4gZXhpc3RpbmcpIHsKLQkJCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWRtLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0Mi5nZXROYW1lKCkpOwotCQkJRmFjZXREYXRhTW9kZWxNYXAgZmFjZXRETXMgPSAoRmFjZXREYXRhTW9kZWxNYXApIGRtLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCS8vZmFjZXRETXMuYWRkKHNldHVwSmF2YUluc3RhbGxBY3Rpb24od2ViUHJvaixleGlzdGluZyxDcmVhdGlvbkNvbnN0YW50cy5ERUZBVUxUX1dFQl9TT1VSQ0VfRk9MREVSKSk7Ci0JCQlJRGF0YU1vZGVsIG5ld01vZGVsID0gc2V0dXBTdGF0aWNXZWJJbnN0YWxsQWN0aW9uKHByb2plY3QyKTsKLQkJCWZhY2V0RE1zLmFkZChuZXdNb2RlbCk7Ci0JCQkvL3NldFJ1bnRpbWUod2ViUHJvaixkbSk7IC8vU2V0dGluZyBydW50aW1lIHByb3BlcnR5Ci0JCQl0cnkgewotCQkJCS8qKgotCQkJCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JCQkJICovCi0JCQkJLy9JU3RhdHVzIHN0YXQgPSAgZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIElEYXRhTW9kZWwgc2V0dXBTdGF0aWNXZWJJbnN0YWxsQWN0aW9uKElQcm9qZWN0IHByb2plY3QyKSB7Ci0JCQlJRGF0YU1vZGVsIHdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCXdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdDIuZ2V0TmFtZSgpKTsKLQkJCXdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCAiMS4wIik7Ci0JCQkKLQkJCXJldHVybiB3ZWJGYWNldEluc3RhbGxEYXRhTW9kZWw7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5zdGFsbFV0aWxpdHlGYWNldHMoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBzcGVjVmVyc2lvbiwgYm9vbGVhbiBleGlzdGluZykgewotCQkJcmVwbGFjZURlcGxveWFibGVzT3V0cHV0SWZOZWNlc3NhcnkocHJvamVjdCk7Ci0JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIGZhY2V0RE1zID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQlmYWNldERNcy5hZGQoc2V0dXBKYXZhSW5zdGFsbEFjdGlvbihhUHJvamVjdCxleGlzdGluZywic3JjIikpOwotCQkJSURhdGFNb2RlbCBuZXdNb2RlbCA9IHNldHVwVXRpbEluc3RhbGxBY3Rpb24oYVByb2plY3Qsc3BlY1ZlcnNpb24pOwotCQkJZmFjZXRETXMuYWRkKG5ld01vZGVsKTsKLQkJCXRyeSB7Ci0JCQkJLyoqCi0JCQkJICogV2FybmluZyBjbGVhbnVwIDEyLzA3LzIwMDUKLQkJCQkgKi8KLQkJCQkvL0lTdGF0dXMgc3RhdCA9ICBkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQkJCWRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRDYXVzZSgpOwotCQkJCWlmIChyZWFsRXhjZXB0aW9uICE9IG51bGwgJiYgcmVhbEV4Y2VwdGlvbiBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQkJSVN0YXR1cyBzdCA9ICgoQ29yZUV4Y2VwdGlvbilyZWFsRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTsKLQkJCQkJaWYgKHN0ICE9IG51bGwpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3QpOwotCQkJCQlyZWFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluc3RhbGxDb25uZWN0b3JGYWNldHMoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBzcGVjVmVyc2lvbiwgYm9vbGVhbiBleGlzdGluZykgewotCQkJcmVwbGFjZURlcGxveWFibGVzT3V0cHV0SWZOZWNlc3NhcnkocHJvamVjdCk7Ci0JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIGZhY2V0RE1zID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQlmYWNldERNcy5hZGQoc2V0dXBKYXZhSW5zdGFsbEFjdGlvbihhUHJvamVjdCxleGlzdGluZyxKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuSkNBX0NPTlRFTlRfRk9MREVSKSkpOwotCQkJSURhdGFNb2RlbCBuZXdNb2RlbCA9IHNldHVwQ29ubmVjdG9ySW5zdGFsbEFjdGlvbihhUHJvamVjdCxzcGVjVmVyc2lvbik7Ci0JCQlmYWNldERNcy5hZGQobmV3TW9kZWwpOwotCQkJdHJ5IHsKLQkJCQkvKioKLQkJCQkgKiBXYXJuaW5nIGNsZWFudXAgMTIvMDcvMjAwNQotCQkJCSAqLwotCQkJCS8vSVN0YXR1cyBzdGF0ID0gIGRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsbnVsbCk7Ci0JCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldENhdXNlKCk7Ci0JCQkJaWYgKHJlYWxFeGNlcHRpb24gIT0gbnVsbCAmJiByZWFsRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKXJlYWxFeGNlcHRpb24pLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCXJlYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5zdGFsbEVBUkZhY2V0cyhJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIHNwZWNWZXJzaW9uLCBib29sZWFuIGV4aXN0aW5nKSB7Ci0JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIGZhY2V0RE1zID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQlJRGF0YU1vZGVsIG5ld01vZGVsID0gc2V0dXBFYXJJbnN0YWxsQWN0aW9uKGFQcm9qZWN0LHNwZWNWZXJzaW9uKTsKLQkJCWZhY2V0RE1zLmFkZChuZXdNb2RlbCk7Ci0JCQl0cnkgewotCQkJCS8qKgotCQkJCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JCQkJICovCi0JCQkJLy9JU3RhdHVzIHN0YXQgPSAgZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbnN0YWxsQXBwQ2xpZW50RmFjZXRzKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgc3BlY1ZlcnNpb24sIGJvb2xlYW4gZXhpc3RpbmcpIHsKLQkJCXJlcGxhY2VEZXBsb3lhYmxlc091dHB1dElmTmVjZXNzYXJ5KHByb2plY3QpOwotCQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlGYWNldERhdGFNb2RlbE1hcCBmYWNldERNcyA9IChGYWNldERhdGFNb2RlbE1hcCkgZG0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJZmFjZXRETXMuYWRkKHNldHVwSmF2YUluc3RhbGxBY3Rpb24oYVByb2plY3QsZXhpc3RpbmcsSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIpKSk7Ci0JCQlJRGF0YU1vZGVsIG5ld01vZGVsID0gc2V0dXBBcHBDbGllbnRJbnN0YWxsQWN0aW9uKGFQcm9qZWN0LHNwZWNWZXJzaW9uKTsKLQkJCWZhY2V0RE1zLmFkZChuZXdNb2RlbCk7Ci0JCQl0cnkgewotCQkJCS8qKgotCQkJCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JCQkJICovCi0JCQkJLy9JU3RhdHVzIHN0YXQgPSAgZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbnN0YWxsRUpCRmFjZXRzKElQcm9qZWN0IGVqYlByb2plY3QyLFN0cmluZyBlamJWZXJzaW9uLCBib29sZWFuIGV4aXN0aW5nKSB7Ci0JCQlyZXBsYWNlRGVwbG95YWJsZXNPdXRwdXRJZk5lY2Vzc2FyeShwcm9qZWN0KTsKLQkJCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWRtLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBlamJQcm9qZWN0Mi5nZXROYW1lKCkpOwotCQkJRmFjZXREYXRhTW9kZWxNYXAgZmFjZXRETXMgPSAoRmFjZXREYXRhTW9kZWxNYXApIGRtLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCWZhY2V0RE1zLmFkZChzZXR1cEphdmFJbnN0YWxsQWN0aW9uKGVqYlByb2plY3QyLGV4aXN0aW5nLEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5FSkJfQ09OVEVOVF9GT0xERVIpKSk7Ci0JCQlJRGF0YU1vZGVsIG5ld01vZGVsID0gc2V0dXBFamJJbnN0YWxsQWN0aW9uKGVqYlByb2plY3QyLGVqYlZlcnNpb24sZXhpc3RpbmcpOwotCQkJZmFjZXRETXMuYWRkKG5ld01vZGVsKTsKLQkJCS8vc2V0UnVudGltZShlamJQcm9qZWN0MixkbSk7IC8vU2V0dGluZyBydW50aW1lIHByb3BlcnR5Ci0JCQl0cnkgewotCQkJCS8qKgotCQkJCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JCQkJICovCi0JCQkJLy9JU3RhdHVzIHN0YXQgPSAgZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlwcml2YXRlIHZvaWQgaW5zdGFsbFdFQkZhY2V0cyhJUHJvamVjdCB3ZWJQcm9qLFN0cmluZyBzcGVjVmVyc2lvbiwgYm9vbGVhbiBleGlzdGluZykgewotCQkJcmVtb3ZlT2xkV2ViQ29udGFpbmVySWZOZWNlc3NhcnkocHJvamVjdCk7Ci0JCQlyZXBsYWNlRGVwbG95YWJsZXNPdXRwdXRJZk5lY2Vzc2FyeShwcm9qZWN0KTsKLQkJCQotCQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHdlYlByb2ouZ2V0TmFtZSgpKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIGZhY2V0RE1zID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQlmYWNldERNcy5hZGQoc2V0dXBKYXZhSW5zdGFsbEFjdGlvbih3ZWJQcm9qLGV4aXN0aW5nLCBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25GcmFtZXdvcmtzUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUikpKTsKLQkJCUlEYXRhTW9kZWwgbmV3TW9kZWwgPSBzZXR1cFdlYkluc3RhbGxBY3Rpb24od2ViUHJvaixzcGVjVmVyc2lvbik7Ci0JCQlmYWNldERNcy5hZGQobmV3TW9kZWwpOwotCQkJLy9zZXRSdW50aW1lKHdlYlByb2osZG0pOyAvL1NldHRpbmcgcnVudGltZSBwcm9wZXJ0eQotCQkJdHJ5IHsKLQkJCQkvKioKLQkJCQkgKiBXYXJuaW5nIGNsZWFudXAgMTIvMDcvMjAwNQotCQkJCSAqLwotCQkJCS8vSVN0YXR1cyBzdGF0ID0gIGRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsbnVsbCk7Ci0JCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldENhdXNlKCk7Ci0JCQkJaWYgKHJlYWxFeGNlcHRpb24gIT0gbnVsbCAmJiByZWFsRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKXJlYWxFeGNlcHRpb24pLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCXJlYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJaWYgKGV4ICE9IG51bGwgJiYgZXggaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pZXgpLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJCi0JCX0KLQkJcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZXBsb3lhYmxlc091dHB1dElmTmVjZXNzYXJ5KElQcm9qZWN0IHByb2opIHsKLQotCi0JCQlJSmF2YVByb2plY3QganByb2ogPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2opOwotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudDsKLQkJCWJvb2xlYW4gZGVwbG95YWJsZXNGb3VuZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQljdXJyZW50ID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJTGlzdCB1cGRhdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJUGF0aCBzb3VyY2VQYXRoID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3VycmVudFtpXTsKLQkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgJiYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaW5kZXhPZihPTERfREVQTE9ZQUJMRVNfUEFUSCkgIT0gLTEpKSB7Ci0JCQkJCQlzb3VyY2VQYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQkJdXBkYXRlZExpc3QuYWRkKEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNvdXJjZVBhdGgpKTsKLQkJCQkJCWRlcGxveWFibGVzRm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXVwZGF0ZWRMaXN0LmFkZChlbnRyeSk7Ci0JCQkJfQotCQkJCWlmIChkZXBsb3lhYmxlc0ZvdW5kKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSAoSUNsYXNzcGF0aEVudHJ5W10pdXBkYXRlZExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3VwZGF0ZWRMaXN0LnNpemUoKV0pOwotCQkJCQlqcHJvai5zZXRSYXdDbGFzc3BhdGgodXBkYXRlZCwgbnVsbCk7Ci0JCQkJCWpwcm9qLnNhdmUobnVsbCwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQkKLQkJCQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZFdlYkNvbnRhaW5lcklmTmVjZXNzYXJ5KElQcm9qZWN0IHdlYlByb2opIHsKLQotCQkJSUphdmFQcm9qZWN0IGpwcm9qID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdCh3ZWJQcm9qKTsKLQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnQ7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnQgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlMaXN0IHVwZGF0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWJvb2xlYW4gdXNlRGVmYXVsdFdlYkFwcExpYnJhcmllcyA9IEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlV2ViQXBwTGlicmFyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGN1cnJlbnRbaV07Ci0JCQkJCS8vIHRoZSB3ZWIgY29udGFpbmVyIGlzIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGggaWY6Ci0JCQkJCS8vIDEuIHRoZXkgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmb3IgV0VCX0xJQl9DT05UQUlORVIgQU5ECi0JCQkJCS8vIDIuIHRoZXkgaGF2ZSBhbiBlbnRyeSBmb3IgV0VCX0xJQl9QQVRIIEJVVAotCQkJCQkvLyB0aGV5IGRvIG5vdCBoYXZlIHRoZSBwcmVmZXJlbmNlIGNoZWNrZWQgdG8gdXNlIHRoZSBXZWIgQXBwIGNsYXNzcGF0aCBjb250YWluZXIKLQkJCQkJaWYgKChlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKS5pbmRleE9mKFdFQl9MSUJfQ09OVEFJTkVSKSA9PSAtMSkgJiYgCi0JCQkJCQkJKChlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKS5pbmRleE9mKFdFQl9MSUJfUEFUSCkgPT0gLTEpIHx8ICF1c2VEZWZhdWx0V2ViQXBwTGlicmFyaWVzKSkKLQkJCQkJCXVwZGF0ZWRMaXN0LmFkZChlbnRyeSk7Ci0JCQkJfQotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSAoSUNsYXNzcGF0aEVudHJ5W10pdXBkYXRlZExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3VwZGF0ZWRMaXN0LnNpemUoKV0pOwotCQkJCWpwcm9qLnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBudWxsKTsKLQkJCQlqcHJvai5zYXZlKG51bGwsIHRydWUpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQl9Ci0KLQkJcHJvdGVjdGVkIElSdW50aW1lIGdldFJ1bnRpbWVCeUlEKFN0cmluZyBpZCkgewotCQkJSVJ1bnRpbWVbXSB0YXJnZXRzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcygiIiwgIiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgdGFyZ2V0ID0gdGFyZ2V0c1tpXTsKLQkJCQlpZiAoaWQuZXF1YWxzKHRhcmdldC5nZXRJZCgpKSkKLQkJCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElEYXRhTW9kZWwgc2V0dXBFamJJbnN0YWxsQWN0aW9uKElQcm9qZWN0IGFQcm9qZWN0LFN0cmluZyBlamJWZXJzaW9uLCBib29sZWFuIGV4aXN0aW5nKSB7Ci0JCQlJRGF0YU1vZGVsIGVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFamJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBlamJWZXJzaW9uKTsKLQkJCWVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsZmFsc2UpOwotCQkJZWpiRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLG51bGwpOwotCQkJaWYgKCFleGlzdGluZykKLQkJCQllamJGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUiwgSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkVKQl9DT05URU5UX0ZPTERFUikpOwotCQkJcmV0dXJuIGVqYkZhY2V0SW5zdGFsbERhdGFNb2RlbDsKLQkJfQotCi0JCXByb3RlY3RlZCBJRGF0YU1vZGVsIHNldHVwV2ViSW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCxTdHJpbmcgc3BlY1ZlcnNpb24pIHsKLQkJCUlEYXRhTW9kZWwgd2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJd2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJd2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHNwZWNWZXJzaW9uKTsKLQkJCXdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsZmFsc2UpOwotCQkJd2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLG51bGwpOwotCQkJcmV0dXJuIHdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbDsKLQkJfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVEZXBlbmRlbmNpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDBjNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVEZXBlbmRlbmNpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhcyBwcm9wIHBhZ2UgaGVpcmFyY2h5Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGNvbnZlcnNpb24gdG8gc2luZ2xlIHByb3BlcnR5IHBhZ2UgaW1wbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFByaW1hcnkgcHJvamVjdCBwcm9wZXJ0eSBwYWdlIGZvciBKMkVFIGRlcGVuZGVuY2llczsgY29udGVudCBpcyBkeW5hbWljYWxseSAKLSAqIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgcHJvamVjdCBmYWNldHMgYW5kIHdpbGwgYmUgY29tcHJpc2VkIGJ5IGEKLSAqIHNldCBvZiBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2wgaW1wbGVtZW50YXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGVuZGVuY2llc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCQotCXB1YmxpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sW10gY29udHJvbHMgPSBuZXcgSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sWzBdOwotCQotCXB1YmxpYyBKMkVFRGVwZW5kZW5jaWVzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJLy8gTmVlZCB0byBmaW5kIG91dCB3aGF0IHR5cGUgb2YgcHJvamVjdCB3ZSBhcmUgaGFuZGxpbmcKLQkJcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJYm9vbGVhbiBpc0VBUiA9IGZhbHNlOwotCQlib29sZWFuIGlzV0VCID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRGYWNldEVycm9yQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQl9Ci0JCQlpc0VBUiA9IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkpOyAKLQkJCWlzV0VCID0gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBnZXRGYWNldEVycm9yQ29tcG9zaXRlKHBhcmVudCk7Ci0JCX0KLQkJCi0JCWlmIChpc0VBUikgewotCQkJcmV0dXJuIGNyZWF0ZUVBUkNvbnRlbnQocGFyZW50KTsKLQkJfSBlbHNlIGlmIChpc1dFQikgewotCQkJcmV0dXJuIGNyZWF0ZVdlYkNvbnRlbnQocGFyZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBjcmVhdGVOb25FQVJDb250ZW50KHBhcmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgZ2V0RmFjZXRFcnJvckNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIFN0cmluZyBlcnJvckNoZWNraW5nRmFjZXQgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkVycm9yX0NoZWNraW5nX1Byb2plY3RfRmFjZXRzOwotCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JDaGVja2luZ0ZhY2V0KTsKLQkJc2V0VmFsaWQoZmFsc2UpOwotCQlyZXR1cm4gZ2V0RXJyb3JDb21wb3NpdGUocGFyZW50LCBlcnJvckNoZWNraW5nRmFjZXQpOwkJCi0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGdldEVycm9yQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBlcnJvcikgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZmluYWwgTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChlcnJvcik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUVBUkNvbnRlbnQoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250cm9scyA9IG5ldyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2xbMV07Ci0JCWNvbnRyb2xzWzBdID0gbmV3IEFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlKHByb2plY3QsIHRoaXMpOwotCQlyZXR1cm4gY29udHJvbHNbMF0uY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlV2ViQ29udGVudChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIGJvb2xlYW4gc3RhbmRhbG9uZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCk7Ci0JCQotCQlpZiAoc3RhbmRhbG9uZSkgewotCQkJLy8gb25seSBuZWVkIHRvIGNyZWF0ZSB0aGUgV2ViIExpYnJhcmllcyBwYWdlCi0JCQljb250cm9scyA9IG5ldyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2xbMV07Ci0JCQljb250cm9sc1swXSA9IG5ldyBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UocHJvamVjdCwgdGhpcyk7Ci0JCQlyZXR1cm4gY29udHJvbHNbMF0uY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIENyZWF0ZSBhIHRhYmJlZCBmb2xkZXIgd2l0aCBib3RoICJKMkVFIE1vZHVsZXMiIGFuZCAiV2ViIExpYnJhcmllcyIKLQkJCWZpbmFsIFRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULkxFRlQpOwotCQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJZm9sZGVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgdHdvIHRhYnMgCi0JCQljb250cm9scyA9IG5ldyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2xbMl07Ci0JCQotCQkJY29udHJvbHNbMF0gPSBuZXcgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKHByb2plY3QsIHRoaXMpOwotCQkJVGFiSXRlbSB0YWIgPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJCXRhYi5zZXRDb250cm9sKGNvbnRyb2xzWzBdLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOwotCQkJdGFiLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5KMkVFX01vZHVsZXMpOwotCQkJY29udHJvbHNbMV0gPSBuZXcgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKHByb2plY3QsIHRoaXMpOwkJCi0JCQl0YWIgPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJCXRhYi5zZXRDb250cm9sKGNvbnRyb2xzWzFdLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOwotCQkJdGFiLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5XZWJfTGlicmFyaWVzKTsKLQkJCi0JCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfQotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVOb25FQVJDb250ZW50KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udHJvbHMgPSBuZXcgSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sWzFdOwotCQlmaW5hbCBib29sZWFuIHN0YW5kYWxvbmUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoc3RhbmRhbG9uZSkgewotCQkJLy8gaWYgbm90IHJlZmVyZW5jZWQgYnkgYW4gRUFSLCBjaGVjayBpZiByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyB3ZWIgcHJvamVjdAotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMocHJvamVjdCkubGVuZ3RoID4gMCkgewotCQkJCWNvbnRyb2xzWzBdID0gbmV3IFdlYlJlZkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZShwcm9qZWN0LCB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGdldFVucmVmZXJlbmNlZEVycm9yQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7IAotCQkJY29udHJvbHNbMF0gPSBuZXcgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKHByb2plY3QsIHRoaXMpOwkJCQotCQl9Ci0KLQkJcmV0dXJuIGNvbnRyb2xzWzBdLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGdldFVucmVmZXJlbmNlZEVycm9yQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgU3RyaW5nIG1zZyA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuVW5yZWZlcmVuY2VkX01vZHVsZV9FcnJvcjsKLQkJc2V0RXJyb3JNZXNzYWdlKG1zZyk7Ci0JCXJldHVybiBnZXRFcnJvckNvbXBvc2l0ZShwYXJlbnQsIG1zZyk7CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjb250cm9sc1tpXS5wZXJmb3JtT2soKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJY29udHJvbHNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybUNhbmNlbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbnRyb2xzW2ldLnBlcmZvcm1DYW5jZWwoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYoY29udHJvbHNbaV0gIT0gbnVsbCl7Ci0JCQkJY29udHJvbHNbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNyZWF0ZURlc2NyaXB0aW9uQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlDb21wb3NpdGUgZGVzY3JpcHRpb25Db21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWRlc2NyaXB0aW9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGVzY3JpcHRpb25Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmaWxsRGVzY3JpcHRpb24oZGVzY3JpcHRpb25Db21wLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbERlc2NyaXB0aW9uKENvbXBvc2l0ZSBjLCBTdHJpbmcgcykgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjUwOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjLCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRleHQuc2V0VGV4dChzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVByb3BlcnRpZXNDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFUHJvcGVydGllc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiM2VlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFUHJvcGVydGllc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVQcm9wZXJ0aWVzQ29uc3RhbnRzIHsKLQkvL0oyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NlcyIpOwotCXB1YmxpYyBTdHJpbmcgSjJFRV9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFX0xldmVsIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMTIgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV8xMiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzEyX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTJfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSjJFRV8xMyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFXzEzIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMTNfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV8xM19ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzE0X0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTRfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCX0xFVkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl9MRVZFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMTEgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzExIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl8xMV9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfMTFfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCXzIwID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl8yMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMjBfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzIwX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl8yMV9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfMjFfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SX0xFVkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl9MRVZFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1JfMTAgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OTkVDVE9SXzEwIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RPUl8xNSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDT05ORUNUT1JfMTUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SXzEwX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl8xMF9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1JfMTVfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OTkVDVE9SXzE1X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfTEVWRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCXzIyX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIldFQl8yMl9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfMjNfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCXzIzX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl8yNF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfMjRfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVBQX0NMSUVOVF9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBUFBfQ0xJRU5UX0xFVkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFQUF9DTElFTlRfMTJfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQVBQX0NMSUVOVF8xMl9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBUFBfQ0xJRU5UXzEzX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFQUF9DTElFTlRfMTNfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVBQX0NMSUVOVF8xNF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBUFBfQ0xJRU5UXzE0X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9DT05URVhUX1JPT1QgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCX0NPTlRFWFRfUk9PVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfQ09OVEVOVF9GT0xERVJfTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfQ09OVEVOVF9GT0xERVJfTkFNRSIpOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2FiMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0pBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqICAgICBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gYnVnIDIwNzgyNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NQYXRoU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NwYXRoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLklWYWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuVmFsaWRhdGVFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLkRlcGVuZGVuY3lHcmFwaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgaW1wbGVtZW50cyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2wsIElDbGFzc3BhdGhUYWJsZU93bmVyLCBMaXN0ZW5lciwgQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lciwgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIEoyRUVEZXBlbmRlbmNpZXNQYWdlIHByb3BQYWdlOwotCXByb3RlY3RlZCBJT0V4Y2VwdGlvbiBjYXVnaHRNYW5pZmVzdEV4Y2VwdGlvbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcnR5OwotCXByb3RlY3RlZCBUZXh0IGNsYXNzUGF0aFRleHQ7Ci0JcHJvdGVjdGVkIFRleHQgY29tcG9uZW50TmFtZVRleHQ7Ci0JcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBDQ29tYm8gYXZhaWxhYmxlQXBwc0NvbWJvOwotCXByb3RlY3RlZCBDbGFzc3BhdGhUYWJsZU1hbmFnZXIgdGFibGVNYW5hZ2VyOwotCXByb3RlY3RlZCBJVmFsaWRhdGVFZGl0TGlzdGVuZXIgdmFsaWRhdGVFZGl0TGlzdGVuZXI7Ci0JcHJvdGVjdGVkIExhYmVsIG1hbmlmZXN0TGFiZWw7Ci0JcHJvdGVjdGVkIExhYmVsIGVudGVycHJpc2VBcHBsaWNhdGlvbkxhYmVsOwotCXByb3RlY3RlZCBMYWJlbCBhdmFpbGFibGVEZXBlbmRlbnRKYXJzOwotCXByaXZhdGUgZmluYWwgRGlzcGxheSBkaXNwbGF5OwotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc3Bvc2VkID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzQ29udHJvbAotCSAqLwotCXB1YmxpYyBKQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSjJFRURlcGVuZGVuY2llc1BhZ2UgcGFnZSkgewotCQlzdXBlcigpOwotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnBhdXNlVXBkYXRlcygpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLnByb3BQYWdlID0gcGFnZTsKLQkJdGhpcy5kaXNwbGF5ID0gcHJvcFBhZ2UuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmYWxzZSBpZiBwYWdlIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIGZvciB0aGUgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQltb2RlbCA9IGNyZWF0ZUNsYXNzcGF0aE1vZGVsKCk7Ci0JCW1vZGVsLnNldFByb2plY3QocHJvamVjdCk7Ci0JCWlmIChtb2RlbC5nZXRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCQltb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCXVwZGF0ZU1vZGVsTWFuaWZlc3QoKTsKLQkJCWluaXRpYWxpemVWYWxpZGF0ZUVkaXRMaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIGNyZWF0ZUNsYXNzcGF0aE1vZGVsKCl7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoTW9kZWwobnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlzRGlzcG9zZWQgPSB0cnVlOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnJlc3VtZVVwZGF0ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTW9kZWxNYW5pZmVzdCgpIHsKLQkJaWYgKEplbVByb2plY3RVdGlsaXRpZXMuaXNCaW5hcnlQcm9qZWN0KHByb2plY3QpIHx8IG1vZGVsLmdldEF2YWlsYWJsZUVBUkNvbXBvbmVudHMoKS5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZihjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQlJVmlydHVhbEZpbGUgdk1hbmlmZXN0ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlpZih2TWFuaWZlc3QuZXhpc3RzKCkpewotCQkJCUlGaWxlIGlNYW5pZmVzdCA9IHZNYW5pZmVzdC5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJCWlmKGlNYW5pZmVzdCAhPSBudWxsICYmIGlNYW5pZmVzdC5leGlzdHMoKSl7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluID0gaU1hbmlmZXN0LmdldENvbnRlbnRzKCk7Ci0JCQkJCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChuZXcgTWFuaWZlc3QoaW4pKTsKLQkJCQkJCW1vZGVsLnByaW1TZXRNYW5pZmVzdChtZik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJbW9kZWwucHJpbVNldE1hbmlmZXN0KG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCkpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb3gpOwotCQkJCQkJbW9kZWwucHJpbVNldE1hbmlmZXN0KG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCkpOwotCQkJCQkJY2F1Z2h0TWFuaWZlc3RFeGNlcHRpb24gPSBpb3g7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotCQkJCQkJCQkvLyBJZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWxpZGF0ZUVkaXRMaXN0ZW5lcigpIHsKLQkJdmFsaWRhdGVFZGl0TGlzdGVuZXIgPSBuZXcgVmFsaWRhdGVFZGl0TGlzdGVuZXIobnVsbCwgbW9kZWwpOwotCQl2YWxpZGF0ZUVkaXRMaXN0ZW5lci5zZXRTaGVsbChwcm9wUGFnZS5nZXRTaGVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAodmlzaWJsZSkgewotCQkJaWYgKGNhdWdodE1hbmlmZXN0RXhjZXB0aW9uICE9IG51bGwgJiYgIW1vZGVsLmlzRGlydHkoKSkgewotCQkJCU1hbmlmZXN0RXJyb3JQcm9tcHRlci5zaG93TWFuaWZlc3RFeGNlcHRpb24ocHJvcFBhZ2UuZ2V0U2hlbGwoKSwgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0UsIGZhbHNlLCBjYXVnaHRNYW5pZmVzdEV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIENsYXNzcGF0aE1vZGVsIGlmIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCBpcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFICYmIGNsYXNzcGF0aENoYW5nZWQoZXZlbnQuZ2V0RGVsdGEoKSkpIHsKLQkJCS8vIHRyaWdnZXIgYSByZWNvbXB1dGF0aW9uIGFuZCByZWZyZXNoIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEVBUgotCQkJaWYgKCFpc0Rpc3Bvc2VkKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCQlpZiAoIWlzRGlzcG9zZWQpIHsKLQkJCQkJCQloYW5kbGVDbGFzc3BhdGhDaGFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB0byByZWZyZXNoIHRoZSBVSSB3aGVuIHRoZSBjbGFzc3BhdGggY2hhbmdlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZSgpIHsKLQkJbW9kZWwucmVzZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJcmVmcmVzaCgpOwkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjbGFzc3BhdGhDaGFuZ2VkKGZpbmFsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWZpbmFsIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQlpZiAoa2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSB7Ci0JCQlmaW5hbCBpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJZmluYWwgSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhTW9kZWwpIHsKLQkJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgPT0gSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgewotCQkJCQlmaW5hbCBJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0Q2hhbmdlZENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCS8vIGNoZWNrIGFsbCBvZiB0aGUgSUphdmFQcm9qZWN0IGNoaWxkcmVuCi0JCQkJCQlpZiAoY2xhc3NwYXRoQ2hhbmdlZChjaGlsZHJlbltpXSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCS8vIGNoZWNrIGlmIHdlIGVpdGhlciBoYXZlIGEgZGlyZWN0IGluZGljYXRpb24gb2YgYSBjbGFzc3BhdGggY2hhbmdlIG9yIGEgZGVsdGEgb24gdGhlCi0JCQkJLy8gLmNsYXNzcGF0aCBmaWxlIChjaGFuZ2VzIHRvIGNsYXNzcGF0aCBlbnRyeSBhdHRyaWJ1dGVzIG9ubHkgZ2l2ZSB1cyB0aGlzLi4uKQotCQkJCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJZmluYWwgSVByb2plY3QgZXZlbnRQcm9qZWN0ID0ganByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJCWlmIChldmVudFByb2plY3QuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJCWlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsgCQotCQkJCQl9Ci0JCQkJCWZpbmFsIElSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXMoKTsKLQkJCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIuY2xhc3NwYXRoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplKCk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVCYXNpY0NvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlpZiAobW9kZWwuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkgewotCQkJaWYgKCFpc1ZhbGlkQ29tcG9uZW50KCkpCi0JCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJCUoyRUVEZXBlbmRlbmNpZXNQYWdlLmNyZWF0ZURlc2NyaXB0aW9uQ29tcG9zaXRlKGNvbXBvc2l0ZSwgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5KMkVFX01vZHVsZXNfRGVzYyk7Ci0JCQljcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoY29tcG9zaXRlKTsKLQkJCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQkJY3JlYXRlVGV4dEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCSAgICBwb3N0Q3JlYXRlQ29udGVudHMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBjcmVhdGVDb250ZW50cygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RDcmVhdGVDb250ZW50cygpIHsKLQkJLy8gcmVnaXN0ZXIgdGhpcyBvYmplY3QgYXMgYW4gSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgc28gdGhhdCBpdCB3aWxsIHJlYWN0IHRvIHVzZXIgY2hhbmdlcyB0byB0aGUgSmF2YSBidWlsZCBwYXRoCi0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUJhc2ljQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQ29tcG9uZW50KCkgewotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9wUGFnZS5zZXRFcnJvck1lc3NhZ2UoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5FQVJfTW9kdWxlX0RlcF9FcnJvcik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlwcm9wUGFnZS5zZXRFcnJvck1lc3NhZ2UoQ2xhc3NwYXRoTW9kZWwuTk9fRUFSX01FU1NBR0UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RMYWJlbHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGxhYmVsc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLyoKLQkJICogTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJICogbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLlByb2plY3RfbmFtZV9fVUlfKTsKLQkJICogCi0JCSAqIGNvbXBvbmVudE5hbWVUZXh0ID0gbmV3IFRleHQobGFiZWxzR3JvdXAsIFNXVC5CT1JERVIpOyBHcmlkRGF0YSBkYXRhID0gbmV3Ci0JCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7IGNvbXBvbmVudE5hbWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJICogY29tcG9uZW50TmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsgY29tcG9uZW50TmFtZVRleHQuc2V0VGV4dChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCSAqLwotCi0JCWNyZWF0ZUVudGVycHJpc2VBcHBzQ29udHJvbHMobGFiZWxzR3JvdXApOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGVycHJpc2VBcHBzQ29udHJvbHMoQ29tcG9zaXRlIGxhYmVsc0dyb3VwKSB7Ci0KLQkJZW50ZXJwcmlzZUFwcGxpY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJZW50ZXJwcmlzZUFwcGxpY2F0aW9uTGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkVBUl9Qcm9qZWN0X05hbWVfX1VJX19VSV8pOwotCi0JCWF2YWlsYWJsZUFwcHNDb21ibyA9IG5ldyBDQ29tYm8obGFiZWxzR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYXZhaWxhYmxlQXBwc0NvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWF2YWlsYWJsZUFwcHNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ0RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQotCQlhdmFpbGFibGVEZXBlbmRlbnRKYXJzID0gbmV3IExhYmVsKGxpc3RHcm91cCwgU1dULk5PTkUpOwotCQlnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYXZhaWxhYmxlRGVwZW5kZW50SmFycy5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuQXZhaWxhYmxlX2RlcGVuZGVudF9KQVJzX19VSV8pOwotCQlhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldExheW91dERhdGEoZ0RhdGEpOwotCQljcmVhdGVUYWJsZUNvbXBvc2l0ZShsaXN0R3JvdXApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24udWkuY2xhc3NwYXRoLklDbGFzc3BhdGhUYWJsZU93bmVyI2NyZWF0ZUdyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIHRleHRHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQl0ZXh0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVDbGFzc1BhdGhUZXh0KHRleHRHcm91cCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGFzc1BhdGhUZXh0KENvbXBvc2l0ZSB0ZXh0R3JvdXApIHsKLQotCQltYW5pZmVzdExhYmVsID0gbmV3IExhYmVsKHRleHRHcm91cCwgU1dULk5PTkUpOwotCQltYW5pZmVzdExhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5NYW5pZmVzdF9DbGFzc19QYXRoX19VSV8pOwotCi0JCWNsYXNzUGF0aFRleHQgPSBuZXcgVGV4dCh0ZXh0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDQwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJY2xhc3NQYXRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJY2xhc3NQYXRoVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOwotCQl0YWJsZU1hbmFnZXIgPSBuZXcgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKHRoaXMsIG1vZGVsLCB2YWxpZGF0ZUVkaXRMaXN0ZW5lcik7Ci0JCXRhYmxlTWFuYWdlci5maWxsQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xhc3NwYXRoVGFibGVPd25lciNjcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVBdmFpbGFibGVKQVJzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW50IGZsYWdzID0gU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIGZsYWdzKTsKLQkJQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotCi0JCS8vIHNldCB1cCB0YWJsZSBsYXlvdXQKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dCgpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIwMCwgdHJ1ZSkpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIwMCwgdHJ1ZSkpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQotCQkvLyBkbyBub3QgY3JlYXRlIHNvcnRlciBvdGhlcndpc2Ugb3JkZXIgd2lsbCBnbyB3cm9uZwotCQkvL2F2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQotCQkvLyB0YWJsZSBjb2x1bW5zCi0JCVRhYmxlQ29sdW1uIGZpbGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0JCWZpbGVOYW1lQ29sdW1uLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5KQVJfTW9kdWxlX1VJXyk7Ci0JCWZpbGVOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBwcm9qZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMSk7Ci0JCXByb2plY3RDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLlByb2plY3RfVUlfKTsKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmxheW91dCh0YWJsZSwgdHJ1ZSk7Ci0JCXJldHVybiBhdmFpbGFibGVKQVJzVmlld2VyOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xhc3NwYXRoVGFibGVPd25lciNjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsYXNzcGF0aFRhYmxlT3duZXIKLQkgKi8KLQlwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbikgewotCQlCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuUFVTSCk7Ci0JCWFCdXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCXJldHVybiBhQnV0dG9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsYXNzcGF0aFRhYmxlT3duZXIKLQkgKi8KLQlwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVSYWRpb0J1dHRvbihTdHJpbmcgbGFiZWwsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGFCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJYUJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGF2YWlsYWJsZUFwcHNDb21ibykKLQkJCWF2YWlsYWJsZUFwcHNTZWxlY3RlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlQXBwc1NlbGVjdGVkKEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpbmRleCA9IGF2YWlsYWJsZUFwcHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQltb2RlbC5zZWxlY3RFQVIoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXBwcygpIHsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gbW9kZWwuZ2V0QXZhaWxhYmxlRUFSQ29tcG9uZW50cygpOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW2NvbXBvbmVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWx1ZXNbaV0gPSBjb21wb25lbnRzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGF2YWlsYWJsZUFwcHNDb21ibyAhPSBudWxsKSB7Ci0JCQlhdmFpbGFibGVBcHBzQ29tYm8uc2V0SXRlbXModmFsdWVzKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHNlbGVjdGVkID0gbW9kZWwuZ2V0U2VsZWN0ZWRFQVJDb21wb25lbnQoKTsKLQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJaW50IGluZGV4ID0gQXJyYXlzLmFzTGlzdChjb21wb25lbnRzKS5pbmRleE9mKHNlbGVjdGVkKTsKLQkJCQlhdmFpbGFibGVBcHBzQ29tYm8uc2VsZWN0KGluZGV4KTsKLQkJCX0gZWxzZQotCQkJCWF2YWlsYWJsZUFwcHNDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJcG9wdWxhdGVBcHBzKCk7Ci0JCWlmICh0YWJsZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJdGFibGVNYW5hZ2VyLnJlZnJlc2goKTsKLQkJfQotCQlyZWZyZXNoVGV4dCgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVmcmVzaFRleHQoKSB7Ci0JCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWwgPSBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCAhPSBudWxsICYmIGNsYXNzUGF0aFRleHQgIT0gbnVsbCkKLQkJCWNsYXNzUGF0aFRleHQuc2V0VGV4dChzZWwgPT0gbnVsbCA/ICIiIDogc2VsLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBDbGFzc3BhdGhNb2RlbExpc3RlbmVyI21vZGVsQ2hhbmdlZChDbGFzc3BhdGhNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChDbGFzc3BhdGhNb2RlbEV2ZW50IGV2dCkgewotCQlpZiAoZXZ0LmdldEV2ZW50VHlwZSgpID09IENsYXNzcGF0aE1vZGVsRXZlbnQuQ0xBU1NfUEFUSF9DSEFOR0VEKSB7Ci0JCQlpc0RpcnR5ID0gdHJ1ZTsKLQkJCXJlZnJlc2hUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZXZ0LmdldEV2ZW50VHlwZSgpID09IENsYXNzcGF0aE1vZGVsRXZlbnQuRUFSX1BST0pFQ1RfQ0hBTkdFRCkgewkJCQotCQkJdGFibGVNYW5hZ2VyLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJbW9kZWwucmVzZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJcmVmcmVzaCgpOwotCQlpc0RpcnR5ID0gZmFsc2U7Ci0JCW1vZGVsLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQltb2RlbC5kaXNwb3NlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmICghaXNEaXJ0eSkKLQkJCXJldHVybiB0cnVlOwotCQltb2RpZnlFQVJCdW5kbGVkTGlicygpOwkJCi0JCVdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKCkpOwotCQljcmVhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVcGRhdGVPcGVyYXRpb24oY29tcG9zZWQsIG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpLCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHByb3BQYWdlLmdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCVN0cmluZyB0aXRsZSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfOwotCQkJU3RyaW5nIG1zZyA9IHRpdGxlOwotCQkJaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJbXNnID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocHJvcFBhZ2UuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gY2FuY2VsbGVkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQkJaXNEaXJ0eSA9IGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlMaXN0IGdldFVuU2VsZWN0ZWRDbGFzc1BhdGhFbGVtZW50c0ZvckoyRUVEZXBlbmRlbmN5KCkgewotCQlMaXN0IHVuc2VsZWN0ZWRGb3JKMkVFID0gZ2V0VW5TZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbigpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0KLQkJTGlzdCB1bnNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkgIT0gbnVsbCkgewotCQkJTGlzdCB3bHBTZWxlY3RlZCA9IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRTZWxlY3RlZENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0KLQkJCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IHVuc2VsZWN0ZWRGb3JKMkVFLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWphdmEudXRpbC5JdGVyYXRvciB3bHBJdGVyYXRvciA9IHdscFNlbGVjdGVkLml0ZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCXdoaWxlICh3bHBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJQ2xhc3NwYXRoRWxlbWVudCB3bHBFbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIHdscEl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJU3RyaW5nIHRleHQgPSBlbGVtZW50LmdldFRleHQoKTsKLQkJCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKCIuamFyIik7Ci0JCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWlmICh0ZXh0LmVxdWFscyh3bHBFbGVtZW50LmdldFRleHQoKSkpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlpZiAoIXVuc2VsZWN0ZWQuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJCQl1bnNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdW5zZWxlY3RlZDsKLQl9Ci0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGRvbid0IHVzZSB0aGlzIG1ldGhvZCBpdCB3aWxsIGJlIGRlbGV0ZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXRVblNlbGVjdGVkQ2xhc3NQYXRoRWxlbWVudHNGb3JXZWJEZXBlbmRlbmN5KCkgewotCQlMaXN0IHVuc2VsZWN0ZWRGb3JXTFAgPSBnZXRVblNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCUxpc3QgdW5zZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJTGlzdCBqMmVlU2VsZWN0ZWQgPSBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKS5nZXRTZWxlY3RlZENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSB1bnNlbGVjdGVkRm9yV0xQLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWphdmEudXRpbC5JdGVyYXRvciBqMmVlSXRlcmF0b3IgPSBqMmVlU2VsZWN0ZWQuaXRlcmF0b3IoKTsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJd2hpbGUgKGoyZWVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJQ2xhc3NwYXRoRWxlbWVudCBqMmVlRWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBqMmVlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlTdHJpbmcgdGV4dCA9IGoyZWVFbGVtZW50LmdldFRleHQoKTsKLQkJCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKCIuamFyIik7Ci0JCQkJCWlmKCBpbmRleCAhPSAtMSApewotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWlmIChlbGVtZW50LmdldFRleHQoKS5lcXVhbHModGV4dCkpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlpZiAoIXVuc2VsZWN0ZWQuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJCQl1bnNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVuc2VsZWN0ZWQgPSB1bnNlbGVjdGVkRm9yV0xQOwotCQl9Ci0JCXJldHVybiB1bnNlbGVjdGVkOwotCX0KLQotCS8qKgotCSAqIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY3JlYXRlSjJFRUNvbXBvbmVudERlcGVuZGVuY3lPcGVyYXRpb25zKCkgewotCQlXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjb21wb3NlZE9wID0gbnVsbDsKLQkJTGlzdCBzZWxlY3RlZCA9IGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJTGlzdCB1bnNlbGVjdGVkID0gZ2V0VW5TZWxlY3RlZENsYXNzUGF0aEVsZW1lbnRzRm9ySjJFRURlcGVuZGVuY3koKTsKLQotCQlMaXN0IHRhcmdldENvbXBvbmVudHNIYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgc2VsZWN0ZWQuZ2V0KGkpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gZWxlbWVudC5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChudWxsICE9IGNvbXBvbmVudCkgewotCQkJCXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmFkZChjb21wb25lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMuaXNFbXB0eSgpKSB7Ci0JCQljb21wb3NlZE9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCk7Ci0JCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKENvbXBvbmVudFV0aWxpdGllcy5jcmVhdGVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwuZ2V0Q29tcG9uZW50KCksIHRhcmdldENvbXBvbmVudHNIYW5kbGVzKSkpOwotCQl9Ci0JCXRhcmdldENvbXBvbmVudHNIYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuc2VsZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSB1bnNlbGVjdGVkLmdldChpKTsKLQkJCUlQcm9qZWN0IGVsZW1lbnRQcm9qZWN0ID0gZWxlbWVudC5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoZWxlbWVudFByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KGVsZW1lbnRQcm9qZWN0KSkgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWxlbWVudFByb2plY3QpOwotCQkJCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5hZGQodGFyZ2V0Q29tcCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlVUkkgYXJjaGl2ZVVSSSA9IGVsZW1lbnQuZ2V0QXJjaGl2ZVVSSSgpOwotCQkJCWlmIChhcmNoaXZlVVJJICE9IG51bGwgJiYgIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyB0eXBlID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlVVJJKTsKLQkJCQkJCVN0cmluZyB0bXBuYW1lID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShhcmNoaXZlVVJJKTsKLQkJCQkJCW5hbWUgPSB0eXBlICsgSVBhdGguU0VQQVJBVE9SICsgdG1wbmFtZTsKLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG1vZGVsLmdldENvbXBvbmVudCgpLmdldFJlZmVyZW5jZShuYW1lKTsKLQkJCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWQgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJCXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmFkZChyZWZlcmVuY2VkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmlzRW1wdHkoKSkgewotCQkJaWYgKGNvbXBvc2VkT3AgPT0gbnVsbCkKLQkJCQljb21wb3NlZE9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCk7Ci0JCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKENvbXBvbmVudFV0aWxpdGllcy5yZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwuZ2V0Q29tcG9uZW50KCksIHRhcmdldENvbXBvbmVudHNIYW5kbGVzKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NlZE9wOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIHtAbGluayBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2V9IGJlY2F1c2UgaXQgaXMgb25seSB1c2VkIHRoZXJlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY3JlYXRlQ29tcG9uZW50RGVwZW5kZW5jeU9wZXJhdGlvbnMoKSB7Ci0JCVdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkT3AgPSBudWxsOwotCQlmaW5hbCBDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0ZWRXTFBzID0gZ2V0U2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCk7Ci0JCUxpc3Qgc2VsZWN0ZWQgPSBzZWxlY3RlZFdMUHMuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJTGlzdCB1bnNlbGVjdGVkID0gZ2V0VW5TZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCi0JCUxpc3QgdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBzZWxlY3RlZC5nZXQoaSk7Ci0JCQlpZiAoZWxlbWVudC5pc0NsYXNzcGF0aERlcGVuZGVuY3koKSB8fCBlbGVtZW50LmlzQ2xhc3NwYXRoRW50cnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSVByb2plY3QgZWxlbWVudFByb2plY3QgPSBlbGVtZW50LmdldFByb2plY3QoKTsKLQkJCWlmIChlbGVtZW50UHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVsZW1lbnRQcm9qZWN0KTsKLQkJCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5hZGQodGFyZ2V0Q29tcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCF0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5pc0VtcHR5KCkpIHsKLQkJCWNvbXBvc2VkT3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKTsKLQkJCWNvbXBvc2VkT3AuYWRkUnVubmFibGUoV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoQ29tcG9uZW50VXRpbGl0aWVzLmNyZWF0ZVdMUFJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihtb2RlbC5nZXRDb21wb25lbnQoKSwgdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMpKSk7Ci0JCX0KLQkJdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5zZWxlY3RlZC5zaXplKCk7IGkrKykgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIHVuc2VsZWN0ZWQuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQuaXNDbGFzc3BhdGhEZXBlbmRlbmN5KCkgfHwgZWxlbWVudC5pc0NsYXNzcGF0aEVudHJ5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlQcm9qZWN0IGVsZW1lbnRQcm9qZWN0ID0gZWxlbWVudC5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoZWxlbWVudFByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KGVsZW1lbnRQcm9qZWN0KSkgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWxlbWVudFByb2plY3QpOwotCQkJCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5hZGQodGFyZ2V0Q29tcCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlVUkkgYXJjaGl2ZVVSSSA9IGVsZW1lbnQuZ2V0QXJjaGl2ZVVSSSgpOwotCQkJCWlmIChhcmNoaXZlVVJJICE9IG51bGwgJiYgIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyB0eXBlID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlVVJJKTsKLQkJCQkJCVN0cmluZyB0bXBuYW1lID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShhcmNoaXZlVVJJKTsKLQkJCQkJCW5hbWUgPSB0eXBlICsgSVBhdGguU0VQQVJBVE9SICsgdG1wbmFtZTsKLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG1vZGVsLmdldENvbXBvbmVudCgpLmdldFJlZmVyZW5jZShuYW1lKTsKLQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWQgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMuYWRkKHJlZmVyZW5jZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoY29tcG9zZWRPcCA9PSBudWxsKSB7Ci0JCQkJY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJfQotCQkJY29tcG9zZWRPcC5hZGRSdW5uYWJsZShXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhDb21wb25lbnRVdGlsaXRpZXMucmVtb3ZlV0xQUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsLmdldENvbXBvbmVudCgpLCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcykpKTsKLQkJfQotCi0JCWlmIChjb21wb3NlZE9wID09IG51bGwpIHsKLQkJCWNvbXBvc2VkT3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKTsKLQkJfQotCQljcmVhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVcGRhdGVPcGVyYXRpb24oY29tcG9zZWRPcCwgbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLCB0cnVlKTsKLQkJCi0JCXJldHVybiBjb21wb3NlZE9wOwotCX0KLQotCXByb3RlY3RlZCBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjcmVhdGVGbGV4UHJvamVjdE9wZXJhdGlvbnMoKSB7Ci0JCVdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkT3AgPSBudWxsOwotCQlPYmplY3RbXSBlbGVtZW50cyA9IHRhYmxlTWFuYWdlci5hdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudHNbaV07Ci0JCQlJUHJvamVjdCBlbGVtZW50UHJvamVjdCA9IGVsZW1lbnQuZ2V0UHJvamVjdCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZWxlbWVudFByb2plY3QgIT0gbnVsbCAmJiAhZWxlbWVudFByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaWYgKGNvbXBvc2VkT3AgPT0gbnVsbCkgewotCQkJCQkJY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWNvbXBvc2VkT3AuYWRkUnVubmFibGUoV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoSjJFRVByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihlbGVtZW50UHJvamVjdCwgZmFsc2UpKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb3NlZE9wOwotCX0KLQotCXByb3RlY3RlZCBDbGFzc1BhdGhTZWxlY3Rpb24gZ2V0VW5TZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKSB7Ci0JCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JCU9iamVjdFtdIGNoZWNrZWRFbGVtZW50cyA9IHRhYmxlTWFuYWdlci5hdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlMaXN0IG1vZGVsRWxlbWVudHMgPSBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlMaXN0IGNoZWNrZWRFbGVtZW50c0xpc3QgPSBBcnJheXMuYXNMaXN0KGNoZWNrZWRFbGVtZW50cyk7Ci0JCQlpZiAoIWNoZWNrZWRFbGVtZW50c0xpc3QuY29udGFpbnMobW9kZWxFbGVtZW50cy5nZXQoaSkpKSB7Ci0JCQkJc2VsZWN0aW9uLmdldENsYXNzcGF0aEVsZW1lbnRzKCkuYWRkKG1vZGVsRWxlbWVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uKCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChjaGVja2VkRWxlbWVudHNbaV0pOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzUGF0aFNlbGVjdGlvbiBnZXRVblNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uKCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBtb2RlbEVsZW1lbnRzID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlMaXN0IGNoZWNrZWRFbGVtZW50c0xpc3QgPSBBcnJheXMuYXNMaXN0KGNoZWNrZWRFbGVtZW50cyk7Ci0JCQlpZiAoIWNoZWNrZWRFbGVtZW50c0xpc3QuY29udGFpbnMobW9kZWxFbGVtZW50cy5nZXQoaSkpKSB7Ci0JCQkJc2VsZWN0aW9uLmdldENsYXNzcGF0aEVsZW1lbnRzKCkuYWRkKG1vZGVsRWxlbWVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCi0JcHJpdmF0ZSBDbGFzc1BhdGhTZWxlY3Rpb24gZ2V0U2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChjaGVja2VkRWxlbWVudHNbaV0pOwotCQl9Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKHByb2plY3QuZ2V0TmFtZSgpLCBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKS50b1N0cmluZygpLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXBkYXRlT3BlcmF0aW9uKGZpbmFsIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkT3AsIGZpbmFsIENsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24sIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHApIHsKLQkJZmluYWwgTWFwIHNlbGVjdGVkRW50cmllc1RvUnVudGltZVBhdGggPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBNYXAgdW5zZWxlY3RlZEVudHJpZXNUb1J1bnRpbWVQYXRoID0gbmV3IEhhc2hNYXAoKTsKLQkJZmluYWwgTGlzdCBlbGVtZW50cyA9IHNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlmaW5hbCBDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQuaXNDbGFzc3BhdGhFbnRyeSgpKSB7Ci0JCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZWxlbWVudC5nZXRDbGFzc3BhdGhFbnRyeSgpOwotCQkJCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGVudHJ5KTsKLQkJCQlib29sZWFuIGhhc0RlcEF0dHJpYiA9IGZhbHNlOwotCQkJCWlmIChhdHRyaWIgIT0gbnVsbCAmJiBhdHRyaWIuZ2V0TmFtZSgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpKSB7Ci0JCQkJCWhhc0RlcEF0dHJpYiA9IHRydWU7Ci0JCQkJfQotCQkJCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgoYXR0cmliLCBpc1dlYkFwcCwgQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KSk7Ci0JCQkJaWYgKGVsZW1lbnQuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUgYXR0cmlidXRlCi0JCQkJCWlmICghaGFzRGVwQXR0cmliKSB7Ci0JCQkJCQlzZWxlY3RlZEVudHJpZXNUb1J1bnRpbWVQYXRoLnB1dChlbnRyeSwgcnVudGltZVBhdGgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gb25seSBhZGQgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBhdHRyaWJ1dGUKLQkJCQkJaWYgKGhhc0RlcEF0dHJpYikgewotCQkJCQkJdW5zZWxlY3RlZEVudHJpZXNUb1J1bnRpbWVQYXRoLnB1dChlbnRyeSwgcnVudGltZVBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGVyZSBhcmUgYW55IGF0dHJpYnV0ZXMgdG8gYWRkLCBjcmVhdGUgYW4gb3BlcmF0aW9uIHRvIGFkZCBhbGwgbmVjZXNzYXJ5IGF0dHJpYnV0ZXMgCi0JCWlmICghc2VsZWN0ZWRFbnRyaWVzVG9SdW50aW1lUGF0aC5pc0VtcHR5KCkpIHsKLQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZUFkZERlcGVuZGVuY3lBdHRyaWJ1dGVzT3BlcmF0aW9uKHByb2plY3QuZ2V0TmFtZSgpLCBzZWxlY3RlZEVudHJpZXNUb1J1bnRpbWVQYXRoKTsgCi0JCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKG9wKSk7Ci0JCX0KLQkJLy8gaWYgdGhlcmUgYXJlIGFueSBhdHRyaWJ1dGVzIHRvIHJlbW92ZSwgY3JlYXRlIGFuIG9wZXJhdGlvbiB0byByZW1vdmUgYWxsIG5lY2Vzc2FyeSBhdHRyaWJ1dGVzCi0JCWlmICghdW5zZWxlY3RlZEVudHJpZXNUb1J1bnRpbWVQYXRoLmlzRW1wdHkoKSkgewotCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuY3JlYXRlUmVtb3ZlRGVwZW5kZW5jeUF0dHJpYnV0ZXNPcGVyYXRpb24ocHJvamVjdC5nZXROYW1lKCksIHVuc2VsZWN0ZWRFbnRyaWVzVG9SdW50aW1lUGF0aCk7IAotCQkJY29tcG9zZWRPcC5hZGRSdW5uYWJsZShXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhvcCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIEplbVByb2plY3RVdGlsaXRpZXMuaXNCaW5hcnlQcm9qZWN0KHByb2plY3QpICYmIChwcm9qZWN0LmZpbmRNZW1iZXIoSU1vZHVsZUNvbnN0YW50cy5DT01QT05FTlRfRklMRV9QQVRIKSA9PSBudWxsKSA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUVBUkJ1bmRsZWRMaWJzKCkgewotCQlMaXN0IGNvbXBzVG9VbmNoZWNrTGlzdCA9IHRhYmxlTWFuYWdlci5nZXRDaGVja2VkTGlic0FzTGlzdCgpOwotCQlpZiAoY29tcHNUb1VuY2hlY2tMaXN0LnNpemUoKSA9PSAwKSByZXR1cm47Ci0JCVNldCBhbGxDb21wc1RvVW5jaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCVNldCBhbGxDb21wTmFtZXNUb1VuY2hlY2sgPSBuZXcgSGFzaFNldCgpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcHNUb1VuY2hlY2tMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWNvbXBzVG9VbmNoZWNrTGlzdC5nZXQoaSk7Ci0JCQlhbGxDb21wc1RvVW5jaGVjay5hZGQoY29tcCk7Ci0JCQlpZiAoY29tcCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgYWxsQ29tcE5hbWVzVG9VbmNoZWNrLmFkZChjb21wLmdldE5hbWUoKSk7Ci0JCX0KLSAJCUlQcm9qZWN0W10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwgPSAoSUVBUk1vZGVsUHJvdmlkZXIpTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJzW2ldKTsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QoZWFyc1tpXSkpIHsJCi0JCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyc1tpXSk7Ci0JCQkJTGlzdCBsaXN0VG9VbmNoZWNrID0gY3JlYXRlTGlzdFRvVW5jaGVjayhlYXJDb21wb25lbnQsIGFsbENvbXBzVG9VbmNoZWNrLCBhbGxDb21wTmFtZXNUb1VuY2hlY2spOwotCQkJCWlmIChsaXN0VG9VbmNoZWNrLnNpemUoKSA9PSAwKSBjb250aW51ZTsKLQkJCQlyZW1vdmVNb2R1bGVzRnJvbUVBUihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBlYXJDb21wb25lbnQsIGxpc3RUb1VuY2hlY2spOwotCQkJCWFkZE1vZHVsZXNUb0VBUihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBlYXJDb21wb25lbnQsIGxpc3RUb1VuY2hlY2spOwotCQkJfQotCQl9CQkJCi0JfQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSBJU3RhdHVzIHJlbW92ZU1vZHVsZXNGcm9tRUFSKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBmaW5hbCBMaXN0IGNvbXBzVG9VbmNoZWNrTGlzdCkgewotCQlJU3RhdHVzIHN0YXQgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCQlTdHJpbmcgbGliRGlyID0gKChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpLmdldE1vZGVsT2JqZWN0KCkpLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJbGliRGlyID0gKGxpYkRpciA9PSBudWxsKSA/IEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUiA6IGxpYkRpcjsKLQkJTWFwIGRlcGVuZGVudENvbXBzID0gZ2V0RUFSTW9kdWxlRGVwZW5kZW5jaWVzKGVhckNvbXBvbmVudCwgY29tcHNUb1VuY2hlY2tMaXN0KTsKLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKGVhckNvbXBvbmVudCwgY29tcHNUb1VuY2hlY2tMaXN0LCBsaWJEaXIpOwotCQkJb3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVFQVIoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlyZW1vdmVFQVJDb21wb25lbnREZXBlbmRlbmNpZXMoZGVwZW5kZW50Q29tcHMpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gc3RhdDsKLQl9CQkKLQkKLQkKLQlwcml2YXRlIElTdGF0dXMgYWRkTW9kdWxlc1RvRUFSKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBmaW5hbCBMaXN0IGNvbXBzVG9VbmNoZWNrTGlzdCkgewotCQlJU3RhdHVzIHN0YXQgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCQl0cnkgewotCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQkJCQlleGVjQWRkT3AobW9uaXRvciwgY29tcHNUb1VuY2hlY2tMaXN0LCBKMkVFQ29uc3RhbnRzLkVBUl9ST09UX0RJUiwgZWFyQ29tcG9uZW50KTsKLQkJCQl9Ci0JCQl9OwotCQkJSjJFRVVJUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9Ci0JCXJldHVybiBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVMaXN0VG9VbmNoZWNrKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgU2V0IGNvbXBzVG9VbmNoZWNrTGlzdCwgU2V0IGNvbXBOYW1lc1RvVW5jaGVjaykgewkKLQkJTGlua2VkTGlzdCByZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCWlmICghcmVmc1tqXS5nZXRSdW50aW1lUGF0aCgpLmlzUm9vdCgpICYmCi0JCQkJCShjb21wc1RvVW5jaGVja0xpc3QuY29udGFpbnMocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpIHx8Ci0JCQkJCWNvbXBOYW1lc1RvVW5jaGVjay5jb250YWlucyhyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCkpKSkgewotCQkJCXJlcy5hZGQocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJfQkJCi0JCX0KLQkJcmV0dXJuIHJlczsKLQl9CQotCQkKLQlwcml2YXRlIHZvaWQgZXhlY0FkZE9wKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTGlzdCBsaXN0LCBTdHJpbmcgcGF0aCwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCi0JCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwkJCQkJCi0JCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGxpc3QpOwotCQlkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIHBhdGgpOwotCi0JCUlTdGF0dXMgc3RhdCA9IGRtLnZhbGlkYXRlUHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCWlmIChzdGF0ICE9IElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVMpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0KTsKLQkJdHJ5IHsKLQkJCWRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQkJCi0JfQotCQkKLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcywgU3RyaW5nIGRpcikgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRzSGFuZGxlcyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBkaXIpOwkJCi0JCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGdldEVBUk1vZHVsZURlcGVuZGVuY2llcyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQsIGZpbmFsIExpc3QgY29tcG9uZW50cykgewotCQlmaW5hbCBNYXAgZGVwZW5kZW50Q29tcHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBnZXQgYWxsIGN1cnJlbnQgcmVmZXJlbmNlcyB0byBwcm9qZWN0IHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBFQVIKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkKLQkJCWZpbmFsIExpc3QgY29tcHNGb3JQcm9qZWN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50cy5nZXQoaSk7Ci0JCQlmaW5hbCBJUHJvamVjdFtdIGRlcGVuZGVudFByb2plY3RzID0gRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERlcGVuZGVuY3lHcmFwaCgpLmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhjb21wLmdldFByb2plY3QoKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlcGVuZGVudFByb2plY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGRlcGVuZGVudFByb2plY3RzW2pdOwotCQkJCS8vIGlmIHRoaXMgaXMgYW4gRUFSLCBjYW4gc2tpcAotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGRlcGVuZGVudENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQkvLyBlbnN1cmUgdGhhdCB0aGUgcHJvamVjdCdzIHNoYXJlIGFuIEVBUgotCQkJCWZpbmFsIElQcm9qZWN0W10gcmVmRUFScyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCQkJYm9vbGVhbiBzYW1lRUFSID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZWZFQVJzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCWlmIChyZWZFQVJzW2tdLmVxdWFscyhlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJc2FtZUVBUiA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXNhbWVFQVIpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGlmIHRoZSBkZXBlbmRlbmN5IGlzIGEgd2ViIGxpYiBkZXBlbmRlbmN5LCBjYW4gc2tpcAotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGRlcGVuZGVudENvbXAuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiL1dFQi1JTkYvbGliIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvbXBzRm9yUHJvamVjdC5hZGQoZGVwZW5kZW50Q29tcCk7Ci0JCQl9Ci0JCQlkZXBlbmRlbnRDb21wcy5wdXQoY29tcCwgY29tcHNGb3JQcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gZGVwZW5kZW50Q29tcHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFQVJDb21wb25lbnREZXBlbmRlbmNpZXMoZmluYWwgTWFwIGRlcGVuZGVudENvbXBzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgSXRlcmF0b3IgdGFyZ2V0cyA9IGRlcGVuZGVudENvbXBzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YXJnZXRzLmhhc05leHQoKSkgewotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0ID0gKElWaXJ0dWFsQ29tcG9uZW50KSB0YXJnZXRzLm5leHQoKTsKLQkJCWZpbmFsIExpc3Qgc291cmNlcyA9IChMaXN0KSBkZXBlbmRlbnRDb21wcy5nZXQodGFyZ2V0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZSA9IChJVmlydHVhbENvbXBvbmVudCkgc291cmNlcy5nZXQoaSk7Ci0JCQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZSk7Ci0JCQkJZmluYWwgTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCQltb2RIYW5kbGVzTGlzdC5hZGQodGFyZ2V0KTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RIYW5kbGVzTGlzdCk7Ci0JCQkJbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJLy8gdXBkYXRlIHRoZSBtYW5pZmVzdAotCQkJCXJlbW92ZU1hbmlmZXN0RGVwZW5kZW5jeShzb3VyY2UsIHRhcmdldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFuaWZlc3REZXBlbmRlbmN5KGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZSwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0KSAKLQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBzb3VyY2VQcm9qTmFtZSA9IHNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0UHJvak5hbWUgPSB0YXJnZXQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJZmluYWwgSUZpbGUgbWFuaWZlc3RtZiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZShzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJZmluYWwgQXJjaGl2ZU1hbmlmZXN0IG1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlpZiAobWYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgSURhdGFNb2RlbCB1cGRhdGVNYW5pZmVzdERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBzb3VyY2VQcm9qTmFtZSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUVSR0UsIGZhbHNlKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BTklGRVNUX0ZJTEUsIG1hbmlmZXN0bWYpOwotCQlTdHJpbmdbXSBjcCA9IG1mLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGNwVG9SZW1vdmUgPSB0YXJnZXRQcm9qTmFtZSArICIuamFyIjsvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghY3BbaV0uZXF1YWxzKGNwVG9SZW1vdmUpKSB7Ci0JCQkJY3BMaXN0LmFkZChjcFtpXSk7Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNULCBjcExpc3QpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsICk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzBjN2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdEVycm9yUHJvbXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmlmZXN0RXJyb3JQcm9tcHRlciBpbXBsZW1lbnRzIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEVycm9yUHJvbXB0ZXIuCi0JICovCi0JcHJpdmF0ZSBNYW5pZmVzdEVycm9yUHJvbXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TWFuaWZlc3RFeGNlcHRpb24oU2hlbGwgc2hlbGwsIFN0cmluZyBiYXNlTWVzc2FnZSwgYm9vbGVhbiBpbmNsdWRlQ2FuY2VsLCBUaHJvd2FibGUgY2F1Z2h0KSB7Ci0JCVN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2VNZXNzYWdlKTsKLQkJbXNnLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKE1BTklGRVNUX1BST0JMRU1fMSk7Ci0JCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChNQU5JRkVTVF9QUk9CTEVNXzIpOwotCQltc2cuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoTUFOSUZFU1RfUFJPQkxFTV8zKTsKLQkJbXNnLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKE1BTklGRVNUX1BST0JMRU1fNCk7Ci0JCXJldHVybiBFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsCi0JCSAgIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX1RJVExFLAotCQkgICBtc2cudG9TdHJpbmcoKSwKLQkJICAgY2F1Z2h0LAotCQkgICAwLCBpbmNsdWRlQ2FuY2VsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMxZjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU3RlZmFuIERpbW92LCBzdGVmYW4uZGltb3ZAc2FwLmNvbSAtIGJ1ZyAyMDc4MjYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJtYW5pZmVzdF91aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvd25fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RfQWxsXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzZWxlY3RfQWxsXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0FWRV9NQU5JRkVTVF9XSVRIX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfUFJPUF9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQU5JRkVTVF9QUk9CTEVNXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFOSUZFU1RfUFJPQkxFTV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdF9uYW1lX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX1Byb2plY3RfTmFtZV9fVUlfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdmFpbGFibGVfZGVwZW5kZW50X0pBUnNfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5pZmVzdF9DbGFzc19QYXRoX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFSX01vZHVsZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2VkX0luX0xpYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX01vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX01vZHVsZXNfRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFX01vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9Nb2R1bGVzX0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViX0xpYnJhcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJfTGlicmFyaWVzX0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViX1JlZl9EZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9Nb2R1bGVfRGVwX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVucmVmZXJlbmNlZF9Nb2R1bGVfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyX0RlcF9PbmVfTW9kdWxlX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYl9MaWJfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX0NoZWNraW5nX1Byb2plY3RfRmFjZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9MSUJfTElTVF9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljX1dlYl9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19XZWJfUmVmZXJlbmNlX0Vycm9yOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1NlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9TZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGRmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1NlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFN0ZWZhbiBEaW1vdiwgc3RlZmFuLmRpbW92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50IGV4dGVuZHMgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCB7Ci0JCi0JcHJpdmF0ZSBEb3VibGVDaGVja2JveFRhYmxlSXRlbSBpdGVtID0gbnVsbDsKLQkKLQlwdWJsaWMgU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudChJQ2hlY2thYmxlIHNvdXJjZSwgCi0JCQkJCQkJCQkJCU9iamVjdCBlbGVtZW50LCAKLQkJCQkJCQkJCQkJYm9vbGVhbiBzdGF0ZSkgewotCQlzdXBlcihzb3VyY2UsIGVsZW1lbnQsIHN0YXRlKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldFRhYmxlSXRlbShEb3VibGVDaGVja2JveFRhYmxlSXRlbSBpdG0pIHsgCi0JCWl0ZW0gPSBpdG07Ci0JfQotCQotCXB1YmxpYyBEb3VibGVDaGVja2JveFRhYmxlSXRlbSBnZXRUYWJsZUl0ZW0oKSB7Ci0JCXJldHVybiBpdGVtOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTg3NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NQYXRoVmFsdWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVwbGFjZTsKLS8qKgotICogVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKFN0cmluZyBhUHJvamVjdE5hbWUsIFN0cmluZyBhU3BhY2VEZWxpbWl0ZWRQYXRoLCBib29sZWFuIHJlcGxhY2VJbnN0ZWFkT2ZNZXJnZSkgewotCXN1cGVyKCk7Ci0JcHJvamVjdE5hbWUgPSBhUHJvamVjdE5hbWU7Ci0JY2xhc3NQYXRoVmFsdWUgPSBhU3BhY2VEZWxpbWl0ZWRQYXRoOwotCXJlcGxhY2UgPSByZXBsYWNlSW5zdGVhZE9mTWVyZ2U7Ci19Ci1wcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci19Ci0vKioKLSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24uICBQcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IuCi0gKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCwKLSAqIHdoaWNoIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICogQSByZXF1ZXN0IHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBob25vcmVkIGFuZCBhY2tub3dsZWRnZWQgCi0gKiBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0gKgotICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLSAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0gKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLSAqIAlpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUgYXV0b21hdGljYWxseQotICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0gKiAgdXNpbmcgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZyAKLSAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLSAqCi0gKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuCi0gKi8KLXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JdHJ5IHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHApOwotCQlpZiAobWYgPT0gbnVsbCkKLQkJCW1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJbWYuYWRkVmVyc2lvbklmTmVjZXNzYXJ5KCk7Ci0JCWlmIChyZXBsYWNlKQotCQkJbWYuc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aFZhbHVlKTsKLQkJZWxzZQotCQkJbWYubWVyZ2VDbGFzc1BhdGgoQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aFZhbHVlKSk7Ci0JCUoyRUVQcm9qZWN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QocCwgbWYpOwotCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJdGhyb3cgbmV3IFdGVFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwNDViYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBpbXBsZW1lbnRzIElDbGFzc3BhdGhUYWJsZU93bmVyLCBMaXN0ZW5lciwgQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIEoyRUVEZXBlbmRlbmNpZXNQYWdlIHBhZ2UpIHsKLQkJc3VwZXIocHJvamVjdCwgcGFnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIGNyZWF0ZUNsYXNzcGF0aE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aE1vZGVsKG51bGwsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQmFzaWNDb21wb3NpdGUocGFyZW50KTsKLQkJaWYgKG1vZGVsLmdldENvbXBvbmVudCgpICE9IG51bGwpIHsKLQkJCWlmICghaXNWYWxpZFdlYk1vZHVsZSgpKQotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQlKMkVFRGVwZW5kZW5jaWVzUGFnZS5jcmVhdGVEZXNjcmlwdGlvbkNvbXBvc2l0ZShjb21wb3NpdGUsIE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuV2ViX0xpYnJhcmllc19EZXNjKTsKLQkJCS8vIGNyZWF0ZVByb2plY3RMYWJlbHNHcm91cChjb21wb3NpdGUpOwotCQkJY3JlYXRlTGlzdEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQloYW5kbGVXTFBTdXBwb3J0KCk7Ci0JCQlzZXRFbmFibGVtZW50KCk7Ci0JCX0KLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCSAgICBwb3N0Q3JlYXRlQ29udGVudHMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBsYWJlbHNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLlByb2plY3RfbmFtZV9fVUlfKTsKLQotCQljb21wb25lbnROYW1lVGV4dCA9IG5ldyBUZXh0KGxhYmVsc0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldFRleHQocHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ0RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQotCQlhdmFpbGFibGVEZXBlbmRlbnRKYXJzID0gbmV3IExhYmVsKGxpc3RHcm91cCwgU1dULk5PTkUpOwotCQlnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYXZhaWxhYmxlRGVwZW5kZW50SmFycy5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuQXZhaWxhYmxlX2RlcGVuZGVudF9KQVJzX19VSV8pOwotCQlhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldExheW91dERhdGEoZ0RhdGEpOwotCQljcmVhdGVUYWJsZUNvbXBvc2l0ZShsaXN0R3JvdXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJdGFibGVNYW5hZ2VyID0gbmV3IENsYXNzcGF0aFRhYmxlTWFuYWdlcih0aGlzLCBtb2RlbCwgdmFsaWRhdGVFZGl0TGlzdGVuZXIpOwotCQl0YWJsZU1hbmFnZXIuZmlsbFdMUENvbXBvc2l0ZShjb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoKSB7Ci0JCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJcHJvcFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuV2ViX0xpYl9FcnJvcik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlbWVudCgpIHsKLQkJaWYgKHRhYmxlTWFuYWdlci5hdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKS5sZW5ndGggPT0gMCkgewotCQkJdGFibGVNYW5hZ2VyLnNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRhYmxlTWFuYWdlci5kZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlTWFuYWdlci5zZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXRhYmxlTWFuYWdlci5kZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVdMUFN1cHBvcnQoKSB7Ci0JCWF2YWlsYWJsZURlcGVuZGVudEphcnMuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLldFQl9MSUJfTElTVF9ERVNDUklQVElPTik7Ci0JCXRhYmxlTWFuYWdlci5yZWZyZXNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZSgpIHsKLQkJbW9kZWwucmVzZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCk7Ci0JCXN1cGVyLmhhbmRsZUNsYXNzcGF0aENoYW5nZSgpOwotCQlzZXRFbmFibGVtZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZiAobW9kZWwuZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCB8fCAhaXNWYWxpZFdlYk1vZHVsZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoIWlzRGlydHkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGNyZWF0ZWRGbGV4UHJvamVjdHMgPSBydW5XTFBPcChjcmVhdGVGbGV4UHJvamVjdE9wZXJhdGlvbnMoKSk7Ci0JCQlib29sZWFuIGNyZWF0ZWRDb21wb25lbnREZXBlbmRlbmN5ID0gZmFsc2U7Ci0JCQlpZiAoY3JlYXRlZEZsZXhQcm9qZWN0cykgewotCQkJCWNyZWF0ZWRDb21wb25lbnREZXBlbmRlbmN5ID0gcnVuV0xQT3AoY3JlYXRlQ29tcG9uZW50RGVwZW5kZW5jeU9wZXJhdGlvbnMoKSk7Ci0JCQkJaXNEaXJ0eSA9IGZhbHNlOwotCQkJfQotCQkJLy8gdHJlYXQgYXMgYSBjbGFzc3BhdGggY2hhbmdlIGZvciByZWZyZXNoIHB1cnBvc2VzCi0JCQkvLyBYWFggdGhpcyByZWZyZXNoIGlzIG5vdCB3b3JraW5nIC0gc3VzcGVjdCBpdCBpcyBiZWNhdXNlIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgYXJlCi0JCQkvLyBub3QgY29uc2lzdGVudGx5IGJlaW5nIHJlY29tcHV0ZWQKLQkJCS8vaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKCk7Ci0JCQlyZXR1cm4gY3JlYXRlZENvbXBvbmVudERlcGVuZGVuY3k7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcnVuV0xQT3AoV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWQpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21wb3NlZCAhPSBudWxsKQotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cocHJvcFBhZ2UuZ2V0U2hlbGwoKSkucnVuKHRydWUsIHRydWUsIGNvbXBvc2VkKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSAhPSBudWxsKSB7Ci0JCQkJZXguZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCVN0cmluZyB0aXRsZSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfOwotCQkJU3RyaW5nIG1zZyA9IHRpdGxlOwotCQkJaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJbXNnID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocHJvcFBhZ2UuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gY2FuY2VsbGVkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZihTdHJpbmcgYUNvbXBvbmVudE5hbWUpewotCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KG1vZGVsLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSwgYUNvbXBvbmVudE5hbWUpOwotCi0JCS8vIFRvIGRvOiBjaGVjayBpZiBhcmNoaXZlIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShtb2RlbC5nZXRDb21wb25lbnQoKSwgYXJjaGl2ZSwgbmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpKTsgLy8kTk9OLU5MUy0xJAotCQltb2RlbC5nZXRDb21wb25lbnQoKS5hZGRSZWZlcmVuY2VzKG5ldyBJVmlydHVhbFJlZmVyZW5jZSBbXSB7IHJlZiB9KTsKLQotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVDbGFzc1BhdGhFbGVtZW50KGFyY2hpdmUsIGFyY2hpdmUuZ2V0TmFtZSgpKTsKLS8vCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uRm9yRXh0ZXJuYWxKYXIoZWxlbWVudCk7Ci0JCW1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKSB7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlJUGF0aFtdIHNlbGVjdGVkID0gQnVpbGRQYXRoRGlhbG9nQWNjZXNzLmNob29zZUV4dGVybmFsSkFSRW50cmllcyhwcm9wUGFnZS5nZXRTaGVsbCgpKTsKLQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNyZWF0ZVJlZih0eXBlICsgc2VsZWN0ZWRbaV0udG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCkgewotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKLQkJCUlQYXRoW10gc2VsZWN0ZWQgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKHByb3BQYWdlLmdldFNoZWxsKCksIGV4aXN0aW5nUGF0aCk7Ci0KLQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5WQVJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQYXRoIHJlc29sdmVkUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKHNlbGVjdGVkW2ldKTsKLQkJCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCQlpZiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQljcmVhdGVSZWYodHlwZSArIHNlbGVjdGVkW2ldLnRvU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gZGlzcGxheSBlcnJvcgotCQkJCQl9Ci0JCQkJfQotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ2xhc3NwYXRoRWxlbWVudCBjcmVhdGVDbGFzc1BhdGhFbGVtZW50KElWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmVDb21wLCBTdHJpbmcgdW5yZXNvbHZlZE5hbWUpIHsKLQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhhcmNoaXZlQ29tcCkpOwotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBuZXcgQ2xhc3NwYXRoRWxlbWVudCh1cmkpOwotCQllbGVtZW50LnNldFZhbGlkKGZhbHNlKTsKLQkJZWxlbWVudC5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZWxlbWVudC5zZXRSZWxhdGl2ZVRleHQodW5yZXNvbHZlZE5hbWUpOwotCQllbGVtZW50LnNldFRleHQodW5yZXNvbHZlZE5hbWUpOwotCQllbGVtZW50LnNldEVhclByb2plY3QobnVsbCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotLy8JcHJpdmF0ZSBDbGFzc1BhdGhTZWxlY3Rpb24gY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uRm9yRXh0ZXJuYWxKYXIoQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLS8vCQlzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0vLwkJcmV0dXJuIHNlbGVjdGlvbjsKLS8vCX0KLQotLy8JcHJpdmF0ZSBDbGFzc1BhdGhTZWxlY3Rpb24gY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uRm9yUHJvamVjdEphcihDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotLy8JCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLS8vCQlyZXR1cm4gc2VsZWN0aW9uOwotLy8JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU2VsZWN0UHJvamVjdEphckJ1dHRvbigpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCUlQYXRoW10gc2VsZWN0ZWQgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlSkFSRW50cmllcyhwcm9wUGFnZS5nZXRTaGVsbCgpLCBwcm9qZWN0LmdldExvY2F0aW9uKCksIG5ldyBJUGF0aFswXSk7Ci0JCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1I7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCQljcmVhdGVSZWYodHlwZSArIHNlbGVjdGVkW2ldLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJSZWZEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJSZWZEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyN2UxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViUmVmRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICByZnJvc3RAYmVhLmNvbSAtIGRlcml2ZWQgZnJvbSBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgZm9yIHByb2plY3RzIHJlZmVyZW5jZWQganVzdCBmcm9tIGEgZHluYW1pYyB3ZWIgcHJvamVjdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBTdXBwb3J0cyBVSSBtYW5pcHVsYXRpb24gb2YgdGhlIHB1Ymxpc2hlZC9leHBvcnRlZCBjbGFzc3BhdGggZW50cmllcyBmb3IgcHJvamVjdHMgcmVmZXJlbmNlZCBieSBkeW5hbWljIHdlYiBwcm9qZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFdlYlJlZkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSB7Ci0KLQlwdWJsaWMgV2ViUmVmRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIEoyRUVEZXBlbmRlbmNpZXNQYWdlIHBhZ2UpIHsKLQkJc3VwZXIocHJvamVjdCwgcGFnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUJhc2ljQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWlmIChtb2RlbC5nZXRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoIWlzVmFsaWRDb21wb25lbnQoKSkgewotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQl9Ci0JCQlKMkVFRGVwZW5kZW5jaWVzUGFnZS5jcmVhdGVEZXNjcmlwdGlvbkNvbXBvc2l0ZShjb21wb3NpdGUsIE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuV2ViX1JlZl9EZXNjKTsKLQkJCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQkJdGFibGVNYW5hZ2VyLnJlZnJlc2goKTsKLQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJfQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JICAgIHBvc3RDcmVhdGVDb250ZW50cygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJdGFibGVNYW5hZ2VyID0gbmV3IENsYXNzcGF0aFRhYmxlTWFuYWdlcih0aGlzLCBtb2RlbCwgdmFsaWRhdGVFZGl0TGlzdGVuZXIpOwotCQl0YWJsZU1hbmFnZXIuc2V0UmVhZE9ubHkoaXNSZWFkT25seSgpKTsKLQkJdGFibGVNYW5hZ2VyLmZpbGxXZWJSZWZDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQ29tcG9uZW50KCkgewotCQkvLyBtdXN0IGhhdmUgdGhlIEphdmEgbmF0dXJlIGFuZCBjYW5ub3QgYmUgYSBkeW5hbWljIHdlYiBwcm9qZWN0Ci0JCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXNKYXZhUHJvamVjdCA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHt9Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpIHx8ICFpc0phdmFQcm9qZWN0KSB7Ci0JCQlwcm9wUGFnZS5zZXRFcnJvck1lc3NhZ2UoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5EeW5hbWljX1dlYl9FcnJvcik7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMocHJvamVjdCkubGVuZ3RoID09IDApIHsKLQkJCXByb3BQYWdlLnNldEVycm9yTWVzc2FnZShNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLk5vX1dlYl9SZWZlcmVuY2VfRXJyb3IpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KCkgewotCQlpZiAodGFibGVNYW5hZ2VyLmF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0YWJsZU1hbmFnZXIuc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGFibGVNYW5hZ2VyLmRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdGFibGVNYW5hZ2VyLnNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGFibGVNYW5hZ2VyLmRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKCkgewotCQlzdXBlci5oYW5kbGVDbGFzc3BhdGhDaGFuZ2UoKTsKLQkJc2V0RW5hYmxlbWVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYgKG1vZGVsLmdldENvbXBvbmVudCgpID09IG51bGwgfHwgIWlzVmFsaWRDb21wb25lbnQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCFpc0RpcnR5KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjUxZWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBXQVJOSU5HOiBUaGlzIGNsYXNzIHdpbGwgYmUgZGVsZXRlZAotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbn0KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIHsKLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSwgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIobmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKG5lc3RlZE9wKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWE3MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c011bHRpU2VsZWN0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFUlJPUl9PQ0NVUlJFRF9USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVJST1JfT0NDVVJSRURfTUVTU0FHRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBFZGl0TW9kdWxlRGVwZW5kZW5jeUFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFwcGxpY2FibGUgb25seSB3aGVuIHRoaXMgYWN0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpIHNlbGVjdAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdChnZXRTZWxlY3RlZEVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvamVjdHMoKSB7Ci0JCWlmICgoc2VsZWN0aW9uID09IG51bGwpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlJdGVyYXRvciBpdCA9IHN0cnVjdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdChpdC5uZXh0KCkpOwotCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkKHApOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlpZiAoaXNTdXBwb3J0ZWRBY3Rpb24oZWxlbWVudCkpCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBlbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXR1cm4gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpIHsKLQkJaWYgKChzZWxlY3Rpb24gPT0gbnVsbCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJc2VsZWN0aW9uID0gSjJFRVVJUGx1Z2luLmdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJfQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiBPbmx5IHJldHVybiBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpdGVtIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHNlbCA9PSBudWxsID8gbnVsbCA6IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JLyoqCi0JICogQ2FuIHRoZSByZWNlaXZlciBiZSBleGVjdXRlZCBmb3IKLQkgKiAKLQkgKiBAZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzU3VwcG9ydGVkQWN0aW9uKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3ByaW1SdW4oU2hlbGwpfQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oSVByb2plY3QgcHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJLy9EZXByZWNhdGVkCi0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBpbnN0ZWFkIG9mIHtAbGluayAjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKX0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCXByaW1SdW4oZ2V0UHJvamVjdCgpLCBzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4gSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvCi0JICogZG8gdGhlIGFjdHVhbCB3b3JrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24pIHsKLQotCQlTaGVsbCBzaGVsbCA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCXNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKGFjdGlvbik7Ci0JCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJTkZPUk1BVElPTl9VSV8iKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNIT1NFTl9PUF9OT1RfQVZBSUxBQkxFIikpOyAvLyROT04tTkxTLTIkID0gIlRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLiIgLy8kTk9OLU5MUy0xJCA9ICJJbmZvcm1hdGlvbiIKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXByaW1SdW4oc2hlbGwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwotCQkJfQotCQl9Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGFjdGlvbiBvciB0byBtb2RpZnkKLQkgKiBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldEFjdGlvblN0YXRlKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFsbG93c011bHRpU2VsZWN0KQotCQkJc2V0QWN0aW9uU3RhdGVGb3JNdWx0aVNlbGVjdChhY3Rpb24pOwotCQllbHNlCi0JCQlzZXRBY3Rpb25TdGF0ZUZvclNpbmdsZVNlbGVjdChhY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlRm9yU2luZ2xlU2VsZWN0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5zaXplKCkgIT0gMSkgewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGb3JNdWx0aVNlbGVjdChJQWN0aW9uIGFjdGlvbikgewotCQlzZXRBY3Rpb25TdGF0ZUZyb21Qcm9qZWN0cyhhY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBhbGxPayA9IGZhbHNlOwotCQlpZiAoc2VsICE9IG51bGwgJiYgIXNlbC5pc0VtcHR5KCkpIHsKLQkJCWFsbE9rID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qobyk7Ci0JCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlhbGxPayA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoYWxsT2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFsbG93c011bHRpU2VsZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFsbG93c011bHRpU2VsZWN0KCkgewotCQlyZXR1cm4gYWxsb3dzTXVsdGlTZWxlY3Q7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd3NNdWx0aVNlbGVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dzTXVsdGlTZWxlY3QKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd3NNdWx0aVNlbGVjdCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd3NNdWx0aVNlbGVjdChib29sZWFuIGFsbG93c011bHRpU2VsZWN0KSB7Ci0JCXRoaXMuYWxsb3dzTXVsdGlTZWxlY3QgPSBhbGxvd3NNdWx0aVNlbGVjdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmNlM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogRWRpdE1vZHVsZURlcGVuZGVuY3lBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGlvbldpdGhEZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoIiIpOy8vJE5PTi1OTFMtMSQKLQkJaW5pdExhYmVsKCk7Ci0JCWluaXREZWxlZ2F0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJQWN0aW9uRGVsZWdhdGUgY3JlYXRlRGVsZWdhdGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXREZWxlZ2F0ZSgpIHsKLQkJZGVsZWdhdGUgPSBjcmVhdGVEZWxlZ2F0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMYWJlbCgpIHsKLQkJc2V0VGV4dChnZXRMYWJlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0byByZWFjdCB0byBzZWxlY3Rpb24gY2hhbmdlczsgaG93ZXZlciwgaWYgdGhlCi0JICogc3VwZXIgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgbXVzdCBhbHNvIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIG5ldyBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsZWN0aW9uKTsKLQkJcmV0dXJuIHRoaXMuaXNFbmFibGVkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDYwMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0vKioKLSAqIEFjdGlvbiBmb3Igb3BlbmluZyBhIEoyRUUgcmVzb3VyY2UgZnJvbSB0aGUgSjJFRSBuYXZpZ2F0b3IuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wZW5BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSUVkaXRvckRlc2NyaXB0b3IgY3VycmVudERlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcGVuQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZmluZEVkaXRvckRlc2NyaXB0b3IoU3RyaW5nIGlkKSB7Ci0JCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJcmV0dXJuIHJlZ2lzdHJ5LmZpbmRFZGl0b3IoaWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEF0dHJpYnV0ZXNGcm9tRGVzY3JpcHRvcigpIHsKLQkJaWYgKGN1cnJlbnREZXNjcmlwdG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vc2V0VGV4dChjdXJyZW50RGVzY3JpcHRvci5nZXRMYWJlbCgpKTsKLQkJc2V0VG9vbFRpcFRleHQoY3VycmVudERlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7Ci0JCS8vc2V0SW1hZ2VEZXNjcmlwdG9yKGN1cnJlbnREZXNjcmlwdG9yLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4gSWYgdGhlIHN1cGVyIG1ldGhvZAotCSAqIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQHBhcmFtIHNlbAotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCXNyY09iamVjdCA9IG51bGw7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vaW5pdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bldpdGhFdmVudChldmVudCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gSEFDSyEKLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTI5ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0KLQlwcml2YXRlIENsYXNzW10gZkFjdGl2YXRlZE9uVHlwZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkFjY2VwdEVtcHR5U2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbigpIHsKLQkJLy9EZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JcHVibGljIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjdGl2YXRlZE9uVHlwZXMsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIobGFiZWwpOwotCQlmV29ya2JlbmNoID0gd29ya2JlbmNoOwotCQlmQWN0aXZhdGVkT25UeXBlcyA9IGFjdGl2YXRlZE9uVHlwZXM7Ci0JCWZBY2NlcHRFbXB0eVNlbGVjdGlvbiA9IGFjY2VwdEVtcHR5U2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQl0aGlzKHdvcmtiZW5jaCwgbGFiZWwsIG51bGwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BY3Rpb25CZUFkZGVkKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmQWNjZXB0RW1wdHlTZWxlY3Rpb247Ci0JCX0KLQkJaWYgKGZBY3RpdmF0ZWRPblR5cGVzICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXJldHVybiBpc0VuYWJsZWQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHNwZWNpZmljIFdpemFyZCAodG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcykKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBmV29ya2JlbmNoOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmICghaXNPZkFjY2VwdGVkVHlwZShvYmopIHx8ICFzaG91bGRBY2NlcHRFbGVtZW50KG9iaikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT2ZBY2NlcHRlZFR5cGUoT2JqZWN0IG9iaikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmF0ZWRPblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkFjdGl2YXRlZE9uVHlwZXNbaV0uaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19MQkwpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpemFyZCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbnVsbDsKLQkJCWlmIChudWxsICE9IGdldEN1cnJlbnRTZWxlY3Rpb24oKSkKLQkJCQlzZWwgPSBnZXRDdXJyZW50U2VsZWN0aW9uKCk7Ci0JCQllbHNlCi0JCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCSgoSVdvcmtiZW5jaFdpemFyZCkgd2l6YXJkKS5pbml0KEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCksIHNlbCk7Ci0JCX0KLQkJaWYgKFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmFsbG93VXNlT2YobnVsbCx3aXphcmQpKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0RGlhbG9nVGV4dCgpOwotCQkJaWYgKG51bGwgIT0gdGV4dCkgewotCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V29ya2JlbmNoKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoqCi0JICogY2FuIGJlIG92ZXJyaWRkZW4gdG8gYWRkIG1vcmUgY2hlY2tzIG9iaiBpcyBndWFyYW50ZWVkIHRvIGJlIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgYWNjZXB0ZWQKLQkgKiB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M0MmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY3RpdmF0ZWRPblR5cGVzLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIG51bGwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgbnVsbCwgYWNjZXB0RW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nLgotCQlzZXRXb3JrYmVuY2gobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24jaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc2V0V29ya2JlbmNoKHdpbmRvdy5nZXRXb3JrYmVuY2goKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nLiBBY3Rpb24gZG9lc24ndCBkZXBlbmQgb24gc2VsZWN0aW9uLgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjNzEzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKG51bGwgPT0gc2VsZWN0aW9uKSB7Ci0JCQlJU2VsZWN0aW9uIGF1dG9zZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoYXV0b3NlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCXRoaXMuc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhdXRvc2VsZWN0aW9uOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXByaW1SdW4oc2hlbGwpOwotCQkJdGhpcy5zZWxlY3Rpb24gPSBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOwotCQkJU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX01FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJAotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKTsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNpbml0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy9pbml0Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhU2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcnVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9Db21wb25lbnRFZGl0b3JJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQ29tcG9uZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYmJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9Db21wb25lbnRFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50RWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHVibGljIENvbXBvbmVudEVkaXRvcklucHV0KElWaXJ0dWFsQ29tcG9uZW50ICBjb21wb25lbnQpewotCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gY29tcG9uZW50LmV4aXN0cygpOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBjb21wb25lbnQuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCl7Ci0JCXJldHVybiBjb21wb25lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvRm9yY2VDbGFzc3BhdGhVcGRhdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ZvcmNlQ2xhc3NwYXRoVXBkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjJiYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvRm9yY2VDbGFzc3BhdGhVcGRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBGb3JjZUNsYXNzcGF0aFVwZGF0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZXsKLQotCXByaXZhdGUgTGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLmZvcmNlVXBkYXRlKHByb2plY3RzTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkuZm9yY2VVcGRhdGUocHJvamVjdHNMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb24uc2V0RW5hYmxlZChzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pewotCQlwcm9qZWN0c0xpc3QuY2xlYXIoKTsKLQkJaWYoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3RydWN0dXJlZFNlbGVjdGlvbi5pdGVyYXRvcigpOwotCSAgICAgICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCSAgICAgICAgICAgIAlwcm9qZWN0c0xpc3QuYWRkKG5leHQpOwotCQkgICAgICAgICAgICB9IGVsc2UgewotCQkgICAgICAgICAgICAJcHJvamVjdHNMaXN0LmNsZWFyKCk7Ci0JCSAgICAgICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9IGVsc2UgeyAvLyBlbXB0eSBzZWxlY3Rpb24KLQkgICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSUoyRUVVSUNvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0lKMkVFVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWZjMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSUoyRUVVSUNvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNi8yMDAxIDEyOjIzOjAyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVVSUNvbnRleHRJZHMgewotCS8vCSBOZXcgY3JlYXRpb24gd2l6YXJkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FQVJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX05FV19FQVJfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FQVJfQUREX01PRFVMRVNfUEFHRSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLk5FV19FQVJfQUREX01PRFVMRVNfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUFSX0NPTVBfUEFHRSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLk5FV19FQVJfQ09NUF9QQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9ORVdfTU9EVUxFX1BST0pFQ1RTX1BBR0UgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfTkVXX01PRFVMRV9QUk9KRUNUU19QQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19BUFBDTElFTlRfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuQVBQQ0xJRU5UX05FV19BUFBDTElFTlRfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19BUFBDTElFTlRfV0laQVJEX1AzID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuQVBQQ0xJRU5UX05FV19BUFBDTElFTlRfV0laQVJEX1BBR0UzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FSkJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUpCX05FV19FSkJfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FSkJfV0laQVJEX1AyID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUpCX05FV19FSkJfV0laQVJEX1BBR0UyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FSkJfV0laQVJEX1AzID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUpCX05FV19FSkJfV0laQVJEX1BBR0UzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05ORUNUT1JfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSkNBX05FV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05ORUNUT1JfV0laQVJEX1AzID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuSkNBX05FV0laQVJEX1BBR0UzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KQVZBX0NPTVBPTkVOVF9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ORVdfSkFWQV9DT01QT05FTlRfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KQVZBX0NMQVNTX09QVElPTl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ORVdfSkFWQV9DTEFTU19PUFRJT05fV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19VVElMSVRZX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLk5FV19VVElMSVRZX1dJWkFSRF9QMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVVRJTElUWV9XSVpBUkRfUDMgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ORVdfVVRJTElUWV9XSVpBUkRfUDMiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSW1wb3J0LCBleHBvcnQgd2l6YXJkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FQVJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX0lNUE9SVF9FQVJfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FQVJfV0laQVJEX1AyID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX0lNUE9SVF9FQVJfV0laQVJEX1BBR0UyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FQVJfV0laQVJEX1AzID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUFSX0lNUE9SVF9FQVJfV0laQVJEX1BBR0UzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9BUFBDTElFTlRfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuQVBQQ0xJRU5UX0lNUE9SVF9BUFBDTElFTlRfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FSkJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUpCX0lNUE9SVF9FSkJfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9SQVJfV0laQVJEX1BBR0UgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5JTVBPUlRfUkFSX1dJWkFSRF9QQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5JTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUDIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5JTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1BBR0UyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DTEFTU19XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5JTVBPUlRfQ0xBU1NfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DTEFTU19XSVpBUkRfUDIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5JTVBPUlRfQ0xBU1NfV0laQVJEX1BBR0UyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0VBUl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfRVhQT1JUX1BBR0UxIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkFQUENMSUVOVF9FWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRUpCX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKQl9FWFBPUlRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1JBUl9XSVpBUkRfUEFHRSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVYUE9SVF9SQVJfV0laQVJEX1BBR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBkaWFsb2dzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUFURV9FQVJfRElBTE9HXzEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5uYXZtMjAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFQVRFX01PRFVMRV9ESUFMT0dfMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdm0yMDEwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9FQVJfRElBTE9HXzEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5uYXZtMzAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfTU9EVUxFX0RJQUxPR18xID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubmF2bTMwMTAiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydENsYXNzZXNBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydENsYXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZjQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRDbGFzc2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDbGFzc2VzQWN0aW9uIGV4dGVuZHMgV1RQQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0Q2xhc3Nlc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJQ2xhc3Nlc0ltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQ2xhc3Nlc0ltcG9ydFdpemFyZChwcm9qZWN0KTsKLQotCi0JCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3MoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTUwLCA1NTApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgzMzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZWxldGVFQVJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZWxldGVNb2R1bGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFRGVsZXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRURlbGV0ZVVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5Db21tb25FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5EZWxldGVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSjJFRURlbGV0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQkvL1VzZWQgZm9yIEVBUiBkZWxldGUKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBwcm9qZWN0czsKLQlwcm90ZWN0ZWQgRGVsZXRlT3B0aW9ucyBvcHRpb25zOwotCS8vIGFkZGVkIGZvciBJUmVmYWN0b3JpbmdBY3Rpb24gYmVoYXZpb3IKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlTW9kdWxlQWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEoyRUVEZWxldGVBY3Rpb24oSVdvcmtiZW5jaFNpdGUgc2l0ZSwgU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHNpdGUpOwotCQlzZXRUZXh0KERFTEVURSk7Ci0JCXNoZWxsID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBKMkVFRGVsZXRlQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIElTZWxlY3Rpb25Qcm92aWRlciBuZXdQcm92aWRlcikgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChERUxFVEUpOwotCQlzaGVsbCA9IEoyRUVVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlwcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBudWxsOwotCQlwcm9qZWN0cyA9IG51bGw7Ci0JCW9wdGlvbnMgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldEVuYWJsZVN0YXRlQmFzZWRPblNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc1NlbGVjdGlvbkFwcGxpY2FibGUoKSAmJiBpc1NlbGVjdGlvblNvbWVKMkVFKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXVwZGF0ZShzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQXBwbGljYWJsZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghaXNKMkVFTW9kdWxlKG8pICYmICFpc0FwcGxpY2F0aW9uKG8pICYmICFpc1Byb2plY3RPckphdmFQcm9qZWN0KG8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvblNvbWVKMkVFKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKGlzSjJFRU1vZHVsZShvKSB8fCBpc0FwcGxpY2F0aW9uKG8pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQWxsRERSb290cygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghaXNKMkVFTW9kdWxlKG8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEFwcGxpY2F0aW9ucygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghaXNBcHBsaWNhdGlvbihvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKMkVFTW9kdWxlKE9iamVjdCBvKSB7Ci0JCS8vVE9ETyBzd2l0Y2ggdG8gdmlydHVhbCBjb21wCi0vLwkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrYmVuY2hDb21wb25lbnQpIHsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIG87Ci0vLwkJCVN0cmluZyBtb2R1bGVUeXBlID0gbW9kdWxlLmdldENvbXBvbmVudFR5cGUoKS5nZXRDb21wb25lbnRUeXBlSWQoKTsKLS8vCQkJLy9UT0RPIG5lZWQgdG8gYWRkIGNvbm5lY3RvciwgYXBwIGNsaWVudCwgZWFyLCBlamIgY2xpZW50Ci0vLwkJCXJldHVybiBtb2R1bGVUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSB8fCBtb2R1bGVUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKTsKLS8vCQl9Ci0JCXJldHVybiBDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8sIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB8fCBpc0oyRUVBcHBsaWNhdGlvblByb2plY3Qobyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQcm9qZWN0T3JKYXZhUHJvamVjdChPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgfHwgKG8gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2plY3RzKCkgewotCQlpZiAocHJvamVjdHMgPT0gbnVsbCkgewotCQkJcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlPYmplY3QgbyA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkKLQkJCQkJbyA9ICgoSUphdmFQcm9qZWN0KSBvKS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlwcm9qZWN0cy5hZGQobyk7Ci0JCQkJCWFkZEVKQkNsaWVudFByb2plY3RJZk5lY2Vzc2FyeSgoSVByb2plY3QpIG8sIHByb2plY3RzKTsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIG87Ci0JCQkJCXByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qob2JqKTsKLQkJCQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9qZWN0X3Nob3VsZF9ub3RfYmVfbnVsbF8xX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQlhZGRFSkJDbGllbnRQcm9qZWN0SWZOZWNlc3NhcnkocHJvamVjdCwgcHJvamVjdHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJOb24tcHJvamVjdF9pbl9zZWxlY3Rpb25fMl9FWENfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBsb2NhbFByb2plY3RzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVKQkNsaWVudFByb2plY3RJZk5lY2Vzc2FyeShJUHJvamVjdCBwcm9qZWN0LCBMaXN0IGxvY2FsUHJvamVjdHMpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQlpZiAoZWRpdCAhPSBudWxsICYmIGVkaXQuaGFzRUpCQ2xpZW50SkFSUHJvamVjdCgpKQotCQkJbG9jYWxQcm9qZWN0cy5hZGQoZWRpdC5nZXRFSkJDbGllbnRKYXJNb2R1bGUoKS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlKMkVFRGVsZXRlRGlhbG9nIGRsZyA9IG51bGw7Ci0JCQlpZiAoaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKSkKLQkJCQlkbGcgPSBuZXcgRGVsZXRlRUFSRGlhbG9nKHNoZWxsLCBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCQllbHNlIGlmIChpc1NlbGVjdGlvbkFsbEREUm9vdHMoKSkKLQkJCQlkbGcgPSBuZXcgRGVsZXRlTW9kdWxlRGlhbG9nKHNoZWxsKTsKLQkJCWVsc2UgewotCQkJCWlmIChjb25maXJtU3RhbmRhcmREZWxldGUoKSkKLQkJCQkJcnVuUmVzb3VyY2VEZWxldGVBY3Rpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWRsZy5vcGVuKCk7Ci0JCQlpZiAoZGxnLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCXJldHVybjsKLQkJCW9wdGlvbnMgPSBkbGcuZ2V0RGVsZXRlT3B0aW9ucygpOwotCQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkKLQkJCQlvcHRpb25zLnNldFNlbGVjdGVkUHJvamVjdHMoZ2V0UHJvamVjdHMoKSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuOwotCQkJaWYgKCEoZW5zdXJlRWRpdG9yc1NhdmVkKCkgJiYgdmFsaWRhdGVTdGF0ZSgpKSkKLQkJCQlyZXR1cm47Ci0JCQlkZWxldGVQcm9qZWN0c0lmTmVjZXNzYXJ5KCk7Ci0JCQlkZWxldGVNZXRhZGF0YUlmTmVjZXNzYXJ5KCk7Ci0JCQlwcmVzZW50U3RhdHVzSWZOZWNjZXNzYXJ5KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUVkaXRvcnNTYXZlZCgpIHsKLQkJcmV0dXJuIENvbW1vbkVkaXRvclV0aWxpdHkucHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlybVN0YW5kYXJkRGVsZXRlKCkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgREVMRVRFX1BST0pFQ1RTLCBDVVNUT01fREVMRVRFX01JWF9NQVRDSCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNldCBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZWZlcmVuY2VkUHJvamVjdHMgPT0gbnVsbCkKLQkJCWNvbXB1dGVSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQkvL1RPRE8gZml4IHVwIHRvIHVzZSBjb21wb25lbnRzCi0vLwkJZ2V0UHJvamVjdHMoKTsKLS8vCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdHMuZ2V0KGkpOwotLy8JCQlFQVJOYXR1cmVSdW50aW1lIHJ1bnRpbWUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCWlmIChydW50aW1lID09IG51bGwpCi0vLwkJCQljb250aW51ZTsKLS8vCQkJRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IHJ1bnRpbWUuZ2V0RWFyRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJlZmVyZW5jZWRQcm9qZWN0cy5hZGRBbGwoZWRpdE1vZGVsLmdldE1vZHVsZU1hcHBlZFByb2plY3RzKCkpOwotLy8JCQl9IGZpbmFsbHkgewotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi0vLwlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlT3BlcmF0aW9uIGdldERlbGV0ZU1vZHVsZU9wZXJhdGlvbigpIHsKLS8vCQlpZiAoZGVsZXRlTW9kdWxlT3BlcmF0aW9uID09IG51bGwpCi0vLwkJCWRlbGV0ZU1vZHVsZU9wZXJhdGlvbiA9IG5ldyBEZWxldGVNb2R1bGVPcGVyYXRpb24ob3B0aW9ucyk7Ci0vLwkJcmV0dXJuIGRlbGV0ZU1vZHVsZU9wZXJhdGlvbjsKLS8vCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1ldGFkYXRhSWZOZWNlc3NhcnkoKSB7Ci0JCWlmICghc2hvdWxkRGVsZXRlTWV0YURhdGEoKSkKLQkJCXJldHVybjsKLQotLy8JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKGdldERlbGV0ZU1vZHVsZU9wZXJhdGlvbigpKTsKLS8vCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgbW9uaXRvckRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotLy8KLS8vCQl0cnkgewotLy8JCQltb25pdG9yRGlhbG9nLnJ1bihmYWxzZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLS8vCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlTWV0YURhdGEoKSB7Ci0JCWlmIChkZWxldGVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwcmltU2hvdWxkRGVsZXRlTWV0YURhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltU2hvdWxkRGVsZXRlTWV0YURhdGEoKSB7Ci0JCXJldHVybiBvcHRpb25zICE9IG51bGwgJiYgKG9wdGlvbnMuc2hvdWxkRGVsZXRlTW9kdWxlcygpIHx8IG9wdGlvbnMuc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZVByb2plY3RzRmFpbGVkT3JDYW5jZWxsZWQoKSB7Ci0JCWlmIChvcHRpb25zID09IG51bGwgfHwgIW9wdGlvbnMuc2hvdWxkRGVsZXRlUHJvamVjdHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGRlbGV0ZWRQcm9qZWN0c0V4aXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlZFByb2plY3RzRXhpc3QoKSB7Ci0JCUxpc3QgZGVsZXRlZFByb2plY3RzID0gb3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsZXRlZFByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkZWxldGVkUHJvamVjdHMuZ2V0KGkpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVByb2plY3RzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChvcHRpb25zLnNob3VsZERlbGV0ZVByb2plY3RzKCkpCi0JCQlydW5SZXNvdXJjZURlbGV0ZUFjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1blJlc291cmNlRGVsZXRlQWN0aW9uKCkgewotCQlEZWxldGVSZXNvdXJjZUFjdGlvbiBhY3Rpb24gPSBuZXcgRGVsZXRlUmVzb3VyY2VBY3Rpb24oc2hlbGwpOwotCQlMaXN0IGxvY2FsUHJvamVjdHMgPSBudWxsOwotCQlpZiAob3B0aW9ucyA9PSBudWxsKQotCQkJbG9jYWxQcm9qZWN0cyA9IGdldFByb2plY3RzKCk7Ci0JCWVsc2UKLQkJCWxvY2FsUHJvamVjdHMgPSBvcHRpb25zLmdldEFsbFByb2plY3RzVG9EZWxldGUoKTsKLQkJSXRlcmF0b3IgaXQgPSBsb2NhbFByb2plY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGl0Lm5leHQoKTsKLQkJCWlmICghcC5leGlzdHMoKSkKLQkJCQlpdC5yZW1vdmUoKTsKLQkJfQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsb2NhbFByb2plY3RzKTsKLQkJYWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsKTsKLQkJYWN0aW9uLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoSVN0YXR1cy5FUlJPUiwgREVMRVRFX0VSUk9SLCBlKTsKLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBERUxFVEVfRVJST1IsIERFTEVURV9OT1RfQ09NUExFVEVELCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYWN0aW9uJ3MgZW5hYmxlIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gb2YgdGhlIHVzZWQgc2VsZWN0aW9uCi0JICogcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBvOwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZEZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGdldEVuYWJsZVN0YXRlQmFzZWRPblNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJc2V0RW5hYmxlZEZyb21TZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQllbHNlCi0JCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTdGF0ZSgpIHsKLQkJLy8gVE9ETyBGaXggdmFsaWRhdGVTdGF0ZQotCQkvLwkJaWYgKCFwcmltU2hvdWxkRGVsZXRlTWV0YURhdGEoKSkKLQkJLy8JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8JCQotCQkvLwkJSVZhbGlkYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZhbGlkYXRlRWRpdExpc3RlbmVyKG51bGwsCi0JCS8vIGdldERlbGV0ZU1vZHVsZU9wZXJhdGlvbigpLmdldERlbGV0ZUVkaXRNb2RlbCgpKTsKLQkJLy8JCWxpc3RlbmVyLnNldFNoZWxsKHNoZWxsKTsKLQkJLy8JCXJldHVybiBsaXN0ZW5lci52YWxpZGF0ZVN0YXRlKCkuaXNPSygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVzZW50U3RhdHVzSWZOZWNjZXNzYXJ5KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0vLwkJaWYgKGRlbGV0ZU1vZHVsZU9wZXJhdGlvbiAhPSBudWxsKQotLy8JCQlzdGF0dXMgPSBkZWxldGVNb2R1bGVPcGVyYXRpb24uZ2V0U3RhdHVzKCk7Ci0KLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm47Ci0KLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBzdGF0dXMsIElTdGF0dXMuRVJST1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkMDBmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlTW9kdWxlQWN0aW9uUG9wdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3Igey8vaW1wbGVtZW50cyBXVFBPcGVyYXRpb25EYXRhTW9kZWxVSUNyZWF0b3IgewotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuV1RQT3BlcmF0aW9uRGF0YU1vZGVsVUlDcmVhdG9yI2NyZWF0ZURhdGFNb2RlbChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChTdHJpbmcgZXh0ZW5kZWRPcGVyYXRpb25JZCwgU3RyaW5nIG9wZXJhdGlvbkNsYXNzLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElXb3JrYmVuY2hTaXRlIHNpdGUpIHsKLQkJLy9UT0RPIGZpeCB1cAotLy8JCUoyRUVEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IEoyRUVEZWxldGVBY3Rpb24oc2l0ZSwgKElTZWxlY3Rpb25Qcm92aWRlcikgbnVsbCk7Ci0vLwkJV1RQT3BlcmF0aW9uRGF0YU1vZGVsIGRhdGFNb2RlbCA9IElBY3Rpb25XVFBPcGVyYXRpb25EYXRhTW9kZWwuY3JlYXRlRGF0YU1vZGVsKGRlbGV0ZUFjdGlvbiwgc2VsZWN0aW9uLCBzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNpdGUuZ2V0U2hlbGwoKSk7Ci0vLwkJcmV0dXJuIGRhdGFNb2RlbDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlcGxveUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlcGxveUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I2NTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMwLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkRlcGxveWVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkoyRUVEZXBsb3lPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5SdW50aW1lU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRGVwbG95QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC51aS5hY3Rpb25zLkJhc2VBY3Rpb24jcHJpbVJ1bihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0KLQkJaWYgKGNoZWNrRW5hYmxlZChzaGVsbCkpIHsKLQkJCWZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGRlcGxveVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCUpvYiBkZXBsb3lKb2IgPSBuZXcgSm9iKCJEZXBsb3kiKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlJU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0JCQkJCUoyRUVEZXBsb3lPcGVyYXRpb24gb3AgPSBuZXcgSjJFRURlcGxveU9wZXJhdGlvbihkZXBsb3lTZWxlY3Rpb24udG9BcnJheSgpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdCA9IG9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI3IiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCQotCQkJdHJ5IHsKLQkJCQlkZXBsb3lKb2Iuc2V0VXNlcih0cnVlKTsKLQkJCQlkZXBsb3lKb2Iuc2NoZWR1bGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRURlcGxveUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIGFTZWxlY3Rpb24pOwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0VuYWJsZWQoU2hlbGwgc2hlbGwpIHsKLQotCQl0cnkgewotCQkJRGVwbG95ZXJSZWdpc3RyeSByZWcgPSBEZXBsb3llclJlZ2lzdHJ5Lmluc3RhbmNlKCk7Ci0KLQkJCUxpc3QgY29tcG9uZW50cyA9IERlcGxveWVyUmVnaXN0cnkuZ2V0U2VsZWN0ZWRNb2R1bGVzKHNlbGVjdGlvbi50b0FycmF5KCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnRzLmdldChpKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCQlpZiAocHJvaiA9PSBudWxsKSB7Ci0JCQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUFJPSkVDVF9OT1RfRk9VTkQiKSAsIHNoZWxsKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlJUnVudGltZSBydW50aW1lID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U2VydmVyUnVudGltZShwcm9qKTsKLQkJCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9SVU5USU1FX05PVF9GT1VORCIpLCBuZXcgU3RyaW5nIFtde3Byb2ouZ2V0TmFtZSgpfSk7Ci0JCQkJCVJ1bnRpbWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coc2hlbGwsIAotCQkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIiksIAotIAkJCQkJCQkJbnVsbCAvKiBkZWZhdWx0IGltYWdlICovLCAKLSAJCQkJCQkJCW1lc3NhZ2UsIAotIAkJCQkJCQkJTWVzc2FnZURpYWxvZy5FUlJPUiwgCi0gCQkJCQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDAsIHByb2opIDsKLQkJCQkJc2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLQkJCQkJcnVudGltZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNlcnZlclJ1bnRpbWUocHJvaik7Ci0JCQkJCWlmIChydW50aW1lID09IG51bGwpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCUxpc3QgdmlzaXRvcnMgPSByZWcuZ2V0RGVwbG95TW9kdWxlRXh0ZW5zaW9ucyhwcm9qLCBydW50aW1lKTsKLQkJCQlpZiAodmlzaXRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUFJPSkVDVF9OT1RfU1VQUE9SVEVEIiksIG5ldyBTdHJpbmcgW117cHJvai5nZXROYW1lKCl9KSwgc2hlbGwpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlcGxveSBBY3Rpb24gcmVjb3ZlcmluZyBmcm9tIHByb2JsZW0gdmVyaWZ5aW5nIGVuYWJsZW1lbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheU1lc3NhZ2VEaWFsb2coU3RyaW5nIG1lc3NhZ2UsIFNoZWxsIHNoZWxsKSB7Ci0JCSBTdHJpbmcgdGl0bGUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0RJQUxPR19USVRMRSIpOwotCQkgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhzaGVsbCwgCi0JCQkJIAkJCQkJCQkJdGl0bGUsIAotCQkJCSAJCQkJCQkJCW51bGwgLyogZGVmYXVsdCBpbWFnZSAqLywgCi0JCQkJIAkJCQkJCQkJbWVzc2FnZSwgCi0JCQkJIAkJCQkJCQkJTWVzc2FnZURpYWxvZy5FUlJPUiwgCi0JCQkJIAkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCB9LCAwKSA7Ci0JICAgICBkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGYyMjdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVNb2R1bGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVSZW5hbWVVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotCi0vKioKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSjJFRU1vZHVsZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLS8vCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0JcHJpdmF0ZSBJUHJvamVjdCB0YXJnZXQ7Ci0vLwlwcml2YXRlIGJvb2xlYW4gcmVuYW1lRGVwZW5kZW5jaWVzOwotCi0JcHVibGljIEoyRUVNb2R1bGVSZW5hbWVDaGFuZ2UoSVByb2plY3QgdGFyZ2V0LCBTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiByZW5hbWVEZXBlbmRlbmNpZXMpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0vLwkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLS8vCQl0aGlzLnJlbmFtZURlcGVuZGVuY2llcyA9IHJlbmFtZURlcGVuZGVuY2llczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKMkVFUmVuYW1lVUlDb25zdGFudHMuUkVOQU1FX01PRFVMRVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2lzVmFsaWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShTdGF0dXMuT0tfU1RBVFVTKTsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNwZXJmb3JtKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJdHJ5IHsKLQotLy8JCQlSZW5hbWVNb2R1bGVPcGVyYXRpb24gcmVuYW1lT3AgPSBuZXcgUmVuYW1lTW9kdWxlT3BlcmF0aW9uKGdldFJlbmFtZU9wdGlvbnMoKSk7Ci0vLwkJCXJlbmFtZU9wLnJ1bihwbSk7Ci0KLQkJCS8vU3RyaW5nIGNvbnRleHRSb290ID0gZ2V0U2VydmVyQ29udGV4dFJvb3QoKTsKLQkJCS8vIFRPRE8gZml4IHVwIHJlbmFtZSBhbmQgY29udGV4dCByb290IG9wZXJhdGlvbnMKLQkJCS8vaWYgKHdlYk5hdHVyZSAhPSBudWxsKSB7Ci0JCQkJLy9uZXcgVXBkYXRlV2ViQ29udGV4dFJvb3RNZXRhZGF0YU9wZXJhdGlvbihuZXdUYXJnZXQsIHdlYk5hdHVyZS5nZXRDb250ZXh0Um9vdCgpKS5ydW4ocG0pOwotLy8JCQlpZihjb250ZXh0Um9vdC5lcXVhbHMoIiIpID09IGZhbHNlKXsgLy8kTk9OLU5MUy0xJAotLy8JCQkJbmV3IFVwZGF0ZVdlYkNvbnRleHRSb290TWV0YWRhdGFPcGVyYXRpb24odGFyZ2V0LCBjb250ZXh0Um9vdCkucnVuKHBtKTsKLS8vCQkJfSBlbHNlIGlmIChKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKHRhcmdldCkgPT0gbnVsbCkKLS8vCQkJCW5ldyBSZW5hbWVVdGlsaXR5SmFyTWV0YWRhdGFPcGVyYXRpb24odGFyZ2V0LCBuZXdUYXJnZXQpLnJ1bihwbSk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQkvL0lnbm9yZQotLy8JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJdHJ5ewotCQkJd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHRhcmdldCk7Ci0gICAgICAgCQlpZiAod2ViRWRpdCAhPSBudWxsKQotICAgICAgIAkJCXJldHVybiB3ZWJFZGl0LmdldFNlcnZlckNvbnRleHRSb290KCk7CQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsICkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJfQkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCS8qKkBkZXByZWNhdGVkIAotCSAqIElmIHRoaXMgbWV0aG9kIGlzIG5vdCB1c2VkIGl0IHNob3VsZCBiZSByZW1vdmVkIGF0IGEgbGF0ZXIgdGltZSwgbWFya2luZyBhcyBkZXByZWNhdGVkCi0JICogV2FybmluZyBjbGVhbnVwIDEyLzA3LzIwMDUKLQkgKi8KLS8vCXByaXZhdGUgUmVuYW1lT3B0aW9ucyBnZXRSZW5hbWVPcHRpb25zKCkgewotLy8JCVJlbmFtZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0vLwkJb3B0aW9ucy5zZXROZXdOYW1lKHRoaXMubmV3TmFtZSk7Ci0vLwkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGhpcy50YXJnZXQpKTsKLS8vCQkvLyBUT0RPIGNoZWNrIG1vZHVsZSB0eXBlIGZvciBFQVIgdHlwZQotLy8JCS8vb3B0aW9ucy5zZXRJc0VBUlJlbmFtZShFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUodGhpcy50YXJnZXQpICE9IG51bGwpOwotLy8JCW9wdGlvbnMuc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKHRoaXMucmVuYW1lRGVwZW5kZW5jaWVzKTsKLS8vCQlvcHRpb25zLnNldFJlbmFtZU1vZHVsZXModHJ1ZSk7Ci0vLwkJb3B0aW9ucy5zZXRSZW5hbWVQcm9qZWN0cyhmYWxzZSk7Ci0vLwkJcmV0dXJuIG9wdGlvbnM7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNnZXRNb2RpZmllZEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MDE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRVJlbmFtZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVSZW5hbWVVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlJlbmFtZU1vZHVsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uQ29tbW9uRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZW5hbWUuUmVuYW1lT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUmVuYW1lUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFUmVuYW1lQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gaW1wbGVtZW50cyBKMkVFUmVuYW1lVUlDb25zdGFudHMgewotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCS8vVXNlZCBmb3IgRUFSIHJlbmFtZQotCXByb3RlY3RlZCBTZXQgcmVmZXJlbmNlZFByb2plY3RzOwotCXByb3RlY3RlZCBMaXN0IG1vZHVsZXM7Ci0JcHJvdGVjdGVkIFJlbmFtZU9wdGlvbnMgb3B0aW9uczsKLQkvLyBhZGRlZCBmb3IgSVJlZmFjdG9yaW5nQWN0aW9uIGJlaGF2aW9yCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0vLwlwcm90ZWN0ZWQgUmVuYW1lTW9kdWxlT3BlcmF0aW9uIHJlbmFtZU1vZHVsZU9wZXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lTW9kdWxlQWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEoyRUVSZW5hbWVBY3Rpb24oSVdvcmtiZW5jaFNpdGUgc2l0ZSwgU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHNpdGUpOwotCQlzZXRUZXh0KFJFTkFNRSk7Ci0JCXNoZWxsID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBKMkVFUmVuYW1lQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIElTZWxlY3Rpb25Qcm92aWRlciBuZXdQcm92aWRlcikgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChSRU5BTUUpOwotCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJcHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLS8vCQlpZiAocmVuYW1lTW9kdWxlT3BlcmF0aW9uICE9IG51bGwpIHsKLS8vCQkJcmVuYW1lTW9kdWxlT3BlcmF0aW9uLnJlbGVhc2UoKTsKLS8vCQkJcmVuYW1lTW9kdWxlT3BlcmF0aW9uID0gbnVsbDsKLS8vCQl9Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cyA9IG51bGw7Ci0JCW1vZHVsZXMgPSBudWxsOwotCQlvcHRpb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIudXBkYXRlKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiNzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlzZXRFbmFibGVkRnJvbVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCWVsc2UKLQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb24udG9MaXN0KCkuc2l6ZSgpICE9IDEpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RW5hYmxlZChnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkgfHwgaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEREUm9vdHMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkvL1RPRE8gY2hlY2sgZm9yIGoyZWUgd29ya2JlbmNoIG1vZHVsZSBzZWxlY3Rpb24KLQkJCWlmICghQ29tbW9uVXRpbC5pc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvLCBmYWxzZSkgLyomJiAhaXNKMkVFUHJvamVjdChvKSovKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEFwcGxpY2F0aW9ucygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghKG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgJiYgIWlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2R1bGVzKCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCW8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrYmVuY2hDb21wb25lbnQpIHsKLQkJCQkJbW9kdWxlcy5hZGQobyk7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBvOwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQkJCVVSSSB1cmkgPSBvYmouZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aCh1cmkpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCW1vZHVsZSA9IHJlc291cmNlc1tpXS5nZXRDb21wb25lbnQoKTsKLQkJCQkJCQlpZiAobW9kdWxlICE9bnVsbCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAobW9kdWxlQ29yZSAhPW51bGwpCi0JCQkJCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxvY2FsTW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQkJCWlmIChsb2NhbE1vZHVsZXMuc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGxvY2FsTW9kdWxlcy5nZXQoMCk7Ci0JCQlKMkVFUmVuYW1lRGlhbG9nIGRsZyA9IG51bGw7Ci0KLQkJCS8vIGlmIGFsbCB3ZSBhcmUgZG9pbmcgaXMgcmVuYW1pbmcgYW4gRUFSLCBsZXQgdGhlIGJhc2UgcGxhdGZvcm0gZG8gaXQKLQkJCWlmIChpc1NlbGVjdGlvbkFsbEFwcGxpY2F0aW9ucygpKSB7Ci0JCQkJUmVuYW1lUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLQkJCQlhY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2R1bGUpKTsKLQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBjb250ZXh0Um9vdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJLy9UT0RPIGFkZCBjb250ZXh0IHJvb3QgdG8gdGhlIG1vZHVsZSBtb2RlbAotCQkJCS8vY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0U2VydmVyQ29udGV4dFJvb3QoKTsKLQkJCQlkbGcgPSBuZXcgUmVuYW1lTW9kdWxlRGlhbG9nKHNoZWxsLCBtb2R1bGUuZ2V0TmFtZSgpLCBjb250ZXh0Um9vdCk7Ci0JCQkJZGxnLm9wZW4oKTsKLQkJCQlpZiAoZGxnLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlvcHRpb25zID0gZGxnLmdldFJlbmFtZU9wdGlvbnMoKTsKLQkJCQlpZiAob3B0aW9ucyAhPSBudWxsKQotCQkJCQlvcHRpb25zLnNldFNlbGVjdGVkUHJvamVjdHMobG9jYWxNb2R1bGVzKTsKLQotCQkJCWlmICghKGVuc3VyZUVkaXRvcnNTYXZlZCgpICYmIHZhbGlkYXRlU3RhdGUoKSkpCi0JCQkJCXJldHVybjsKLQkJCQlyZW5hbWVQcm9qZWN0c0lmTmVjZXNzYXJ5KCk7Ci0JCQkJcmVuYW1lTWV0YWRhdGFJZk5lY2Vzc2FyeSgpOwotCQkJCXByZXNlbnRTdGF0dXNJZk5lY2Nlc3NhcnkoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFZGl0b3JzU2F2ZWQoKSB7Ci0JCXJldHVybiBDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpOwotCX0KLQotCXByb3RlY3RlZCBTZXQgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQljb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJZ2V0TW9kdWxlcygpOwotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCS8vV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIG1vZHVsZXMuZ2V0KGkpOwotCQkJLy9UT0RPIGZpeCB1cCBjb2RlIGhlcmUgZm9yIG1vZHVsZXMgaW5zdGVhZCBvZiBwcm9qZWN0cwotLy8JCQlFQVJOYXR1cmVSdW50aW1lIHJ1bnRpbWUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCWlmIChydW50aW1lID09IG51bGwpCi0vLwkJCQljb250aW51ZTsKLS8vCQkJRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IHJ1bnRpbWUuZ2V0RWFyRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJlZmVyZW5jZWRQcm9qZWN0cy5hZGRBbGwoZWRpdE1vZGVsLmdldE1vZHVsZU1hcHBlZFByb2plY3RzKCkpOwotLy8JCQl9IGZpbmFsbHkgewotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0vLwkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbmFtZU1ldGFkYXRhSWZOZWNlc3NhcnkoKSB7Ci0JCWlmICghc2hvdWxkUmVuYW1lTWV0YURhdGEoKSkKLQkJCXJldHVybjsKLS8vCQlSZW5hbWVNb2R1bGVPcGVyYXRpb24gb3AgPSBnZXRSZW5hbWVNb2R1bGVPcGVyYXRpb24oKTsKLS8vCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhvcCk7Ci0vLwkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3JEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvckRpYWxvZy5ydW4oZmFsc2UsIGZhbHNlLCBydW5uYWJsZSk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlbmFtZU1ldGFEYXRhKCkgewotCQlpZiAocmVuYW1lUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBwcmltU2hvdWxkUmVuYW1lTWV0YURhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW5hbWVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLnNob3VsZFJlbmFtZVByb2plY3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiByZW5hbWVkUHJvamVjdHNFeGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbmFtZWRQcm9qZWN0c0V4aXN0KCkgewotCQlMaXN0IHJlbmFtZWRQcm9qZWN0cyA9IG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb1JlbmFtZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbmFtZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVuYW1lZFByb2plY3RzLmdldChpKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVQcm9qZWN0c0lmTmVjZXNzYXJ5KCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLnNob3VsZFJlbmFtZVByb2plY3RzKCkpCi0JCQlyZXR1cm47Ci0JCUoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbiBhY3Rpb24gPSBuZXcgSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLQkJYWN0aW9uLnNldE5ld05hbWUob3B0aW9ucy5nZXROZXdOYW1lKCkpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvcHRpb25zLmdldEFsbFByb2plY3RzVG9SZW5hbWUoKSk7Ci0JCWFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCWFjdGlvbi5ydW4oKTsKLQotCQkvLyBvbmx5IHdlYiBwcm9qZWN0cyBzaG91bGQgaGF2ZSBhIGNvbnRleHQgcm9vdAotCQlTdHJpbmcgbmV3Q29udGV4dFJvb3QgPSBvcHRpb25zLmdldE5ld0NvbnRleHRSb290KCk7Ci0JCWlmIChuZXdDb250ZXh0Um9vdCAhPSBudWxsICYmIG9wdGlvbnMuc2hvdWxkUmVuYW1lUHJvamVjdHMoKSkgewotCQkJLy9Xb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgZ2V0TW9kdWxlcygpLmdldCgwKTsKLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBhZGQgc2VydmVyIGNvbnRleHQgcm9vdCB0byB0aGUgbW9kdWxlIG1vZGVsCi0JCQkJLy9tb2R1bGUuc2V0U2VydmVyQ29udGV4dFJvb3QobmV3Q29udGV4dFJvb3QpOwkJICAgICAgICAgICAgICAgCQkKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUkVOQU1FX0VSUk9SLCBlKTsKLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBSRU5BTUVfRVJST1IsIFJFTkFNRV9OT1RfQ09NUExFVEVELCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYWN0aW9uJ3MgZW5hYmxlIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gb2YgdGhlIHVzZWQgc2VsZWN0aW9uCi0JICogcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJc3VwZXIudXBkYXRlKHNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVBcHBsaWNhdGlvblByb2plY3QoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0JCWlmICghcHJpbVNob3VsZFJlbmFtZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotLy8JCUlWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihudWxsLCBnZXRSZW5hbWVNb2R1bGVPcGVyYXRpb24oKS5nZXRSZW5hbWVFZGl0TW9kZWwoKSk7Ci0vLwkJbGlzdGVuZXIuc2V0U2hlbGwoc2hlbGwpOwotLy8JCXJldHVybiBsaXN0ZW5lci52YWxpZGF0ZVN0YXRlKCkuaXNPSygpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVNob3VsZFJlbmFtZU1ldGFEYXRhKCkgewotCQlyZXR1cm4gb3B0aW9ucyAhPSBudWxsICYmIChvcHRpb25zLnNob3VsZFJlbmFtZU1vZHVsZXMoKSB8fCBvcHRpb25zLnNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLS8vCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVPcGVyYXRpb24gZ2V0UmVuYW1lTW9kdWxlT3BlcmF0aW9uKCkgewotLy8JCWlmIChyZW5hbWVNb2R1bGVPcGVyYXRpb24gPT0gbnVsbCkgewotLy8JCQlyZW5hbWVNb2R1bGVPcGVyYXRpb24gPSBuZXcgUmVuYW1lTW9kdWxlT3BlcmF0aW9uKG9wdGlvbnMpOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVuYW1lTW9kdWxlT3BlcmF0aW9uOwotLy8JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCi0vLwkJaWYgKHJlbmFtZU1vZHVsZU9wZXJhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCXN0YXR1cyA9IHJlbmFtZU1vZHVsZU9wZXJhdGlvbi5nZXRTdGF0dXMoKTsKLS8vCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm47Ci0KLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBzdGF0dXMsIElTdGF0dXMuRVJST1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmI3YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLQotCi0vKioKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwdWJsaWMgSjJFRVJlbmFtZVBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlPYmplY3RbXSB0YXJnZXRFbGVtZW50cyA9IGdldFByb2Nlc3NvcigpLmdldEVsZW1lbnRzKCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50cyA9PSBudWxsIHx8IHRhcmdldEVsZW1lbnRzLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXRFbGVtZW50c1swXSwgSVBST0pFQ1RfQ0xBU1MpOwotCQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSjJFRU1vZHVsZVJlbmFtZUNoYW5nZShwcm9qZWN0LCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCksIGdldEFyZ3VtZW50cygpLmdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSjJFRVJlbmFtZVVJQ29uc3RhbnRzLlJFTkFNRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjdlMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uIGV4dGVuZHMgUmVuYW1lUmVzb3VyY2VBY3Rpb24gewotCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5IHdpbGwgcmVuYW1lIHVzaW5nIGEgZGlhbG9nIChpZgotCSAqIG5lY2Vzc2FyeSkgcmF0aGVyIHRoYW4gdGhlIGlubGluZSBlZGl0b3Igb2YgYSBSZXNvdXJjZU5hdmlnYXRvci4gTm90ZSB0aGF0IGEgcmVuYW1lIGhhcHBlbnMKLQkgKiBvbiBvbmUgYW5kIG9ubHkgb25lIHJlc291cmNlIGF0IGEgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLQkgKi8KLQlwdWJsaWMgSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ldyBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBxdWVyeU5ld1Jlc291cmNlTmFtZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHJldFZhbCA9IG51bGw7Ci0KLQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJcmV0VmFsID0gc3VwZXIucXVlcnlOZXdSZXNvdXJjZU5hbWUocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJcmV0VmFsID0gbmV3TmFtZTsKLQkJfQotCi0JCXJldHVybiByZXRWYWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiBuZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXdOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA2NTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSU9wZW5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVJlc291cmNlT3Blbkxpc3RlbmVyIGltcGxlbWVudHMgSU9wZW5MaXN0ZW5lcnsKLQotCSBwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gYWN0aW9uOwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSU9wZW5MaXN0ZW5lciNvcGVuKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGFuRXZlbnQpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBhbkV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJICAgCi0JCSAgICBpZiAoZ2V0QWN0aW9uKCkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pKQotCQkgICAgCWFjdGlvbi5ydW4oKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPcGVuSjJFRVJlc291cmNlQWN0aW9uIGdldEFjdGlvbigpIHsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKSAKLQkJCWFjdGlvbiA9IG5ldyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGEyZjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5hcHBjbGllbnQuQXBwQ2xpZW50UHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gewotCi0JLy8gVE9ETyBNREUgMDItMjggRmluZCBjb3JyZWN0IGxhYmVsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3QXBwbENsaWVudE1vZHVsZUFjdGlvbl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJuZXdfYXBwY2xpZW50cHJvamVjdF93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uKCkgewotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwdWJsaWMgTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWNjZXB0ZWRUeXBlcykgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRlZFR5cGVzLCBmYWxzZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgQXBwQ2xpZW50UHJvamVjdFdpemFyZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdFQVJDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5NmNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdFQVJDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotcHVibGljIGNsYXNzIE5ld0VBUkNvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbiB7Ci0JLy8gVE9ETyBNREUgMDItMjggRmluZCBjb3JyZWN0IGxhYmVsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3RUFSTW9kdWxlQWN0aW9uX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIm5ld2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmV3RUFSQ29tcG9uZW50QWN0aW9uKCkgewotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwdWJsaWMgTmV3RUFSQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWNjZXB0ZWRUeXBlcykgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRlZFR5cGVzLCBmYWxzZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgRWFyUHJvamVjdFdpemFyZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFQXJ0aWZhY3REcm9wRG93bkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFQXJ0aWZhY3REcm9wRG93bkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJiZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci0KLQotLyoqCi0gKiBBIHdpemFyZCBpcyBhZGRlZCB0byB0aGUgIk5ldyBKYXZhIEVFIEFydGlmYWN0IiBkcm9wIGRvd24gaWYgaXQgaGFzIGEgcGFyYW1ldGVyICdqYXZhZWVhcnRpZmFjdCc6Ci0gKiAgICAgPHdpemFyZAotICogICAgICAgICBuYW1lPSJNeSBKYXZhIEVFIFByb2plY3QgV2l6YXJkIgotICogICAgICAgICBpY29uPSJpY29ucy93aXouZ2lmIgotICogICAgICAgICBjYXRlZ29yeT0ibXljYXRlZ29yeSIKLSAqICAgICAgICAgaWQ9Inh4Lk15V2l6YXJkIj4KLSAqICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcueHguTXlXaXphcmQiPgotICogICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4KLSAqICAgICAgICAgPC9jbGFzcz4gCi0gKiAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIE15IFdpemFyZAotICogICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICogICAgICA8L3dpemFyZD4KLSAqLwotcHVibGljIGNsYXNzIE5ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciwgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0pBVkFFRUFSVElGQUNUID0gImphdmFlZWFydGlmYWN0IjsvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBBVFRfSkFWQUVFQVJUSUZBQ1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdKYXZhRUVEcm9wRG93bkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFRHJvcERvd25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkOWYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdKYXZhRUVEcm9wRG93bkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciwgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3SmF2YUVFV2l6YXJkQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ly8kTk9OLU5MUy0xJAotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7Ly8kTk9OLU5MUy0xJAotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsJLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgU2hlbGwgZlNoZWxsOwotCQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudDsKLQkJCi0JCXByaXZhdGUgaW50IG1lbnVJbmRleDsKLQotCQlwdWJsaWMgTmV3SmF2YUVFV2l6YXJkQWN0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlmQ29uZmlndXJhdGlvbkVsZW1lbnQ9IGVsZW1lbnQ7Ci0JCQlzZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKSk7Ci0JCQkKLQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uRnJvbUNvbmZpZyhmQ29uZmlndXJhdGlvbkVsZW1lbnQpOwotCQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkJc2V0VG9vbFRpcFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGdldEljb25Gcm9tQ29uZmlnKGZDb25maWd1cmF0aW9uRWxlbWVudCkpOwotCQkJc2V0TWVudUluZGV4KGdldE1lbnVJbmRleEZyb21Db25maWcoZkNvbmZpZ3VyYXRpb25FbGVtZW50KSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJdHJ5IHsKLQkJCQlJTmV3V2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIGdldFNlbGVjdGlvbigpKTsKLQkJCQkKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJCQlkaWFsb2cuc2V0TWluaW11bVBhZ2VTaXplKGNvbnZlcnRlci5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNzApLCBjb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCkpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpbnQgcmVzID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkKLQkJCQlub3RpZnlSZXN1bHQocmVzID09IFdpbmRvdy5PSyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY29uZmlndXJlZCBzZWxlY3Rpb24uIElmIG5vIHNlbGVjdGlvbiBoYXMgYmVlbiBjb25maWd1cmVkIHVzaW5nIHtAbGluayAjc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKX0sCi0JCSAqIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudCBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBpcyByZXR1cm5lZC4KLQkJICogQHJldHVybiB0aGUgY29uZmlndXJlZCBzZWxlY3Rpb24KLQkJICovCi0JCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQlpZiAoZlNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGV2YWx1YXRlQ3VycmVudFNlbGVjdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JCX0KLQkJCi0JCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXZhbHVhdGVDdXJyZW50U2VsZWN0aW9uKCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENvbmZpZ3VyZXMgdGhlIHNlbGVjdGlvbiB0byBiZSB1c2VkIGFzIGluaXRpYWwgc2VsZWN0aW9uIG9mIHRoZSB3aXphcmQuIAotCQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdG8gYmUgc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgc2hlbGwuIElmIG5vIHNoZWxsIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdXNpbmcge0BsaW5rICNzZXRTaGVsbChTaGVsbCl9LAotCQkgKiAJdGhlIHNoZWxsIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHdvcmtiZW5jaCBpcyByZXR1cm5lZC4KLQkJICogQHJldHVybiB0aGUgY29uZmlndXJlZCBzaGVsbAotCQkgKi8KLQkJcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotCQkJaWYgKGZTaGVsbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQkJfQotCQkJcmV0dXJuIGZTaGVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENvbmZpZ3VyZXMgdGhlIHNoZWxsIHRvIGJlIHVzZWQgYXMgcGFyZW50IHNoZWxsIGJ5IHRoZSB3aXphcmQuCi0JCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgdG8gYmUgc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgc2hlbGwgb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJZlNoZWxsID0gc2hlbGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldERlc2NyaXB0aW9uRnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPj0gMSkgewotCQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJY29uRnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCQlTdHJpbmcgaWNvbk5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgaWNvbk5hbWUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgaW50IGdldE1lbnVJbmRleEZyb21Db25maWcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2xhc3NFbGVtZW50cyA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfQ0xBU1MpOwotCQkJaWYgKGNsYXNzRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNsYXNzRWxlbWVudCA6IGNsYXNzRWxlbWVudHMpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcGFyYW1FbGVtZW50cyA9IGNsYXNzRWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUEFSQU1FVEVSKTsKLQkJCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgcGFyYW1FbGVtZW50IDogcGFyYW1FbGVtZW50cykgewotCQkJCQkJaWYgKEFUVF9NRU5VSU5ERVguZXF1YWxzKHBhcmFtRWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX05BTUUpKSkgewotCQkJCQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHBhcmFtRWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1ZBTFVFKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJTmV3V2l6YXJkIGNyZWF0ZVdpemFyZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiAoSU5ld1dpemFyZCkgQ29yZVV0aWxpdHkuY3JlYXRlRXh0ZW5zaW9uKGZDb25maWd1cmF0aW9uRWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWVudUluZGV4KCkgewotCQkJcmV0dXJuIG1lbnVJbmRleDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1lbnVJbmRleChpbnQgbWVudUluZGV4KSB7Ci0JCQl0aGlzLm1lbnVJbmRleCA9IG1lbnVJbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCQlOZXdKYXZhRUVXaXphcmRBY3Rpb24gYWN0aW9uID0gKE5ld0phdmFFRVdpemFyZEFjdGlvbikgbzsKLQkJCXJldHVybiBnZXRNZW51SW5kZXgoKSAtIGFjdGlvbi5nZXRNZW51SW5kZXgoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfV0laQVJEID0gIndpemFyZCI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19QQVJBTUVURVIgPSAicGFyYW1ldGVyIjsvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19WQUxVRSA9ICJ2YWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTUVOVUlOREVYID0gIm1lbnVJbmRleCI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMX05FVyA9ICJuZXdXaXphcmRzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBNZW51IGZNZW51OwotCQotCXByb3RlY3RlZCBTaGVsbCBmV2l6YXJkU2hlbGw7Ci0JCi0JcHVibGljIE5ld0phdmFFRURyb3BEb3duQWN0aW9uKCkgewotCQlmTWVudSA9IG51bGw7Ci0JCXNldE1lbnVDcmVhdG9yKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmTWVudSAhPSBudWxsKSB7Ci0JCQlmTWVudS5kaXNwb3NlKCk7Ci0JCQlmTWVudSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGZNZW51ID09IG51bGwpIHsKLQkJCWZNZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJCU5ld0phdmFFRVdpemFyZEFjdGlvbltdIGFjdGlvbnMgPSBnZXRBY3Rpb25Gcm9tRGVzY3JpcHRvcnMoKTsKLQkJCWZvciAoTmV3SmF2YUVFV2l6YXJkQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKLQkJCQlhY3Rpb24uc2V0U2hlbGwoZldpemFyZFNoZWxsKTsKLQkJCQlBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCQkJCWl0ZW0uZmlsbChmTWVudSwgLTEpOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBmTWVudTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlnZXREZWZhdWx0QWN0aW9uKCkucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBBY3Rpb24gZ2V0RGVmYXVsdEFjdGlvbigpIHsKLQkJQWN0aW9uW10gYWN0aW9ucyA9IGdldEFjdGlvbkZyb21EZXNjcmlwdG9ycygpOwotCQlpZiAoYWN0aW9ucy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIGFjdGlvbnNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTmV3SmF2YUVFV2l6YXJkQWN0aW9uW10gZ2V0QWN0aW9uRnJvbURlc2NyaXB0b3JzKCkgewotCQlBcnJheUxpc3Q8TmV3SmF2YUVFV2l6YXJkQWN0aW9uPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxOZXdKYXZhRUVXaXphcmRBY3Rpb24+KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBsYXRmb3JtVUkuUExVR0lOX0lELCBQTF9ORVcpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX1dJWkFSRCkgJiYgaXNKYXZhRUVQcm9qZWN0V2l6YXJkKGVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKG5ldyBOZXdKYXZhRUVXaXphcmRBY3Rpb24oZWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTmV3SmF2YUVFV2l6YXJkQWN0aW9uW10gYWN0aW9ucyA9IChOZXdKYXZhRUVXaXphcmRBY3Rpb25bXSkgY29udGFpbmVycy50b0FycmF5KG5ldyBOZXdKYXZhRUVXaXphcmRBY3Rpb25bY29udGFpbmVycy5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoYWN0aW9ucyk7Ci0JCXJldHVybiBhY3Rpb25zOyAKLQl9Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIGlzSmF2YUVFUHJvamVjdFdpemFyZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjbGFzc0VsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfQ0xBU1MpOwotCQlpZiAoY2xhc3NFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjbGFzc0VsZW1lbnQgOiBjbGFzc0VsZW1lbnRzKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcGFyYW1FbGVtZW50cyA9IGNsYXNzRWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUEFSQU1FVEVSKTsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBwYXJhbUVsZW1lbnQgOiBwYXJhbUVsZW1lbnRzKSB7Ci0JCQkJCWlmIChnZXRUeXBlQXR0cmlidXRlKCkuZXF1YWxzKHBhcmFtRWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX05BTUUpKSkgewotCQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihwYXJhbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19WQUxVRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG9sZCB3YXksIGRlcHJlY2F0ZWQKLQkJaWYgKEJvb2xlYW4udmFsdWVPZihlbGVtZW50LmdldEF0dHJpYnV0ZShnZXRUeXBlQXR0cmlidXRlKCkpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWZXaXphcmRTaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlQXR0cmlidXRlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRVByb2plY3REcm9wRG93bkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFUHJvamVjdERyb3BEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGNkYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFUHJvamVjdERyb3BEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyOwotCi0KLS8qKgotICogQSB3aXphcmQgaXMgYWRkZWQgdG8gdGhlICJOZXcgSmF2YSBFRSBQcm9qZWN0IiBkcm9wIGRvd24gaWYgaXQgaGFzIGEgcGFyYW1ldGVyICdqYXZhZWVwcm9qZWN0JzoKLSAqICAgICA8d2l6YXJkCi0gKiAgICAgICAgIG5hbWU9Ik15IEphdmEgRUUgUHJvamVjdCBXaXphcmQiCi0gKiAgICAgICAgIGljb249Imljb25zL3dpei5naWYiCi0gKiAgICAgICAgIGNhdGVnb3J5PSJteWNhdGVnb3J5IgotICogICAgICAgICBpZD0ieHguTXlXaXphcmQiPgotICogICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy54eC5NeVdpemFyZCI+Ci0gKiAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZXByb2plY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gKiAgICAgICAgIDwvY2xhc3M+IAotICogICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICBNeSBXaXphcmQKLSAqICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgPC93aXphcmQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKYXZhRUVQcm9qZWN0RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciwgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0pBVkFFRVBST0pFQ1QgPSAiamF2YWVlcHJvamVjdCI7Ly8kTk9OLU5MUy0xJAotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gQVRUX0pBVkFFRVBST0pFQ1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSjJFRVJlc291cmNlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSjJFRVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjRhYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkphdmFFRUFyY2hpdmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5Db21wb25lbnRBcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5CaW5hcnlFZGl0b3JVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQWN0aW9uIGZvciBvcGVuaW5nIGEgSjJFRSByZXNvdXJjZSBmcm9tIHRoZSBKMkVFIG5hdmlnYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5BY3Rpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLnVpLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkuamF2YS5FbnRlcnByaXNlQmVhbkphdmFFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9KQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQudWkuQ29tcGlsYXRpb25Vbml0RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgamF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCkgewotCQlzdXBlcigiT3BlbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9uIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEphdmFFZGl0b3JEZXNjcmlwdG9yKCkgewotCQlpZiAoamF2YUVkaXRvckRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWphdmFFZGl0b3JEZXNjcmlwdG9yID0gZmluZEVkaXRvckRlc2NyaXB0b3IoSkFWQV9FRElUT1JfSUQpOwotCQlyZXR1cm4gamF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRCYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IoKSB7Ci0JCWlmIChiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvciA9IGZpbmRFZGl0b3JEZXNjcmlwdG9yKEJBU0VfSkFWQV9FRElUT1JfSUQpOwotCQlyZXR1cm4gYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQXBwcm9wcmlhdGVFZGl0b3IoSVZpcnR1YWxDb21wb25lbnQgYyl7Ci0JCWlmIChjID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCi0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotCQkJCi0JCQkvL1tCdWcgMjM3Nzk0XSBpZiBjb21wb25lbnQgYyBpcyBhIEpFRSA1IGFyY2hpdmUgdGhlbiBlZGl0b3JJbnB1dCBuZWVkcyB0byBiZSBhIEJpbmFyeUVkaXRvcklucHV0Ci0JCQlpZiAoYyBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhjKTsKLQkJCQkvL1tCdWcgMjM5NDQwXSBiZWNhdXNlIENvbm5lY3RvcnMgYXJlIG9wZW5lZCB3aXRoIHRoZSBiYXNpYyBYTUwgZWRpdG9yIGFuZCBub3QgYSBzcGVjaWFsaXplZCBlZGl0b3IgdGhleSBuZWVkIGJpbmFyeSBlZGl0b3IgaW5wdXQKLQkJCQlpZiggcXAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEIHx8IHFwLmdldFR5cGUoKSA9PSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEUpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSAoKEVPYmplY3Qpc3JjT2JqZWN0KS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCQllZGl0b3JJbnB1dCA9IEJpbmFyeUVkaXRvclV0aWxpdGllcy5nZXRCaW5hcnlFZGl0b3JJbnB1dCgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpYywgcGF0aCk7Ci0JCQkJfQotCQkJfSAKLQkJCQotCQkJLy90aGlzIGlzIGZvciBhbGwgb3RoZXIgY2FzZXMKLQkJCWlmKGVkaXRvcklucHV0ID09IG51bGwpIHsKLQkJCQllZGl0b3JJbnB1dCA9IG5ldyBDb21wb25lbnRFZGl0b3JJbnB1dChjKTsKLQkJCX0KLQkJCQotCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBjdXJyZW50RGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZWRpdG9yKS5zZWxlY3RSZXZlYWwoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXyIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IiCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogb3BlbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKElSZXNvdXJjZSByKSB7Ci0JCWlmIChyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByKSwgY3VycmVudERlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGVkaXRvcikuc2VsZWN0UmV2ZWFsKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgewotCQkJKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIHNyY09iamVjdCkub3BlbkluRWRpdG9yKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCBpc0VKQjNCZWFuT2JqZWN0KHNyY09iamVjdCkgKXsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCBzcmNPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiApewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIGJlYW4gPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4pc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9ZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbil7Ci0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4gIGJlYW4gPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4pc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9ZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuKXsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIGJlYW4gPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbilzcmNPYmplY3Q7Ci0JCQkJbmFtZSA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCX0KLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClzcmNPYmplY3QpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmKGphdmFQcm9qZWN0LmV4aXN0cygpKXsKLQkJCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL2lmIG5hbWUgaXMgbnVsbCB0aGVuIGNhbid0IGdldCB0eXBlCi0JCQkJCQlpZihuYW1lICE9IG51bGwpIHsKLQkJCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoIG5hbWUgKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy9pZiB0eXBlIGlzIG51bGwgdGhlbiBjYW4ndCBvcGVuIGl0cyBlZGl0b3IsIHNvIG9wZW4gZWRpdG9yIGZvciB0aGUgcmVzb3VyY2UKLQkJCQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGN1KTsKLQkJCQkJCX0gZWxzZXsKLQkJCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKC0xLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcigtMSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBybyA9IChFT2JqZWN0KSBzcmNPYmplY3Q7Ci0JCQlJUHJvamVjdCBwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJvKTsKLQkJCQotCQkJaWYgKHJvIGluc3RhbmNlb2YgQmVhbkxpbmspIHsKLQkJCQlvcGVuQmVhbkxpbmtJbkphdmFFZGl0b3IoKEJlYW5MaW5rKSBybywgcCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClzcmNPYmplY3QpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSl7Ci0JCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKHJlc291cmNlKTsKLQkJCX0gZWxzZSBpZihyby5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gQXJjaGl2ZVV0aWwuZ2V0TW9kdWxlRmlsZShybyk7Ci0JCQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCkgewotCQkJCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbW9kdWxlRmlsZS5nZXRPcHRpb25zKCk7Ci0JCQkJCWlmKG9wdGlvbnMgaW5zdGFuY2VvZiBDb21wb25lbnRBcmNoaXZlT3B0aW9ucykgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKChDb21wb25lbnRBcmNoaXZlT3B0aW9ucylvcHRpb25zKS5nZXRDb21wb25lbnQoKTsKLQkJCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy9pZiBjYW4ndCBnZXQgYSBNb2R1bGVGaWxlIHRoZW4gZ2V0IHRoZSBjb21wb25lbnQgZnJvbSB0aGUgYXJjaGl2ZQotCQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQXJjaGl2ZShybyk7Ci0JCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFyY2hpdmUpOwotCQkJCQkJaWYoY29tcG9uZW50ICE9IG51bGwpewotCQkJCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2Upc3JjT2JqZWN0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4gSWYgdGhlIHN1cGVyIG1ldGhvZAotCSAqIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQHBhcmFtIHNlbCB0aGUgbmV3IHN0cnVjdHVyZWQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24ocykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoaXMgaXMgb25lIG9mIHRoZSBzZWxlY3Rpb25zIHdlIGNhbiBoYW5kbGUsCi0JCS8vIHRoZW4gc2V0IHRoZSBzb3VyY2Ugb2JqZWN0IGFzIGlzLiBUaGUgcnVuKCkgd2lsbCBkbyB0aGUgaGFyZCBzdHVmZi4KLQkJT2JqZWN0IG9iaiA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgewotCQkJY3VycmVudERlc2NyaXB0b3IgPSBnZXRKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJlYW5MaW5rKSB7Ci0JCQljdXJyZW50RGVzY3JpcHRvciA9IGdldEJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwkKLQkJfSBlbHNlIGlmKGlzRUpCM0JlYW5PYmplY3Qob2JqKSkgewotCQkJLy9bMjQxNjg1XSBpZiBpdCBpcyBhIEVKQiAzIGJlYW4gdGhlIGNsYXNzIGlzIHNwZWNpYWxseSBvcGVuZWQgYnkgdGhlIHJ1bigpIG1ldGhvZAotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KW9iaik7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQlpZihmaWxlLmV4aXN0cygpKXsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9ICBlbHNlIGlmICgoKEVPYmplY3Qpb2JqKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy9bQnVnIDIzNzc5NF0gaWYgdGhlIGZpbGUgaXMgbnVsbCB0aGVuIGl0IG1heWJlIGEgYmluYXJ5IHJlc291cmNlIGluIGFuIGFyY2hpdmUKLQkJCQkvLwlhdHRlbXB0IHRvIGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgYXJjaGl2ZSBhbmQgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIHRoYXQKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqOwotCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmZpbmRBcmNoaXZlKGVPYmopOwotCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoKChFT2JqZWN0KW9iaikuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UocGF0aCkpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZShwYXRoKTsKLQkJCQkJCQlzdHJlYW0gPSByZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQkJCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHN0cmVhbSwgcGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IocGF0aC5sYXN0U2VnbWVudCgpLHR5cGUpOwotCQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoLTEsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoLTEsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaWYoc3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoLTEsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2Upb2JqKTsKLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwgY29udGVudFR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJY3VycmVudERlc2NyaXB0b3IgPSBudWxsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNldEF0dHJpYnV0ZXNGcm9tRGVzY3JpcHRvcigpOwotCQlzcmNPYmplY3QgPSBvYmo7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuQmVhbkxpbmtJbkphdmFFZGl0b3IoQmVhbkxpbmsgbGluaywgSVByb2plY3QgcCkgewotCQlTdHJpbmcgbGlua05hbWUgPSBudWxsOwotCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KGxpbmspOwotCQkvLyBIYW5kbGUgRUpCIExpbmsgY2FzZQotCQlpZiAobGluayBpbnN0YW5jZW9mIEVKQkxpbmspIHsKLQkJCWxpbmtOYW1lID0gKChFSkJMaW5rKSBsaW5rKS5nZXRFamJMaW5rKCk7Ci0JCQlFSkJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCQkJRUpCSmFyIGVqYkphciA9IGFydGlmYWN0RWRpdC5nZXRFSkJKYXIoKTsKLQkJCQlpZiAoZWpiSmFyID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFuTmFtZWQobGlua05hbWUpOwotCQkJCWlmIChiZWFuID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlqYXZhQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gSGFuZGxlIFNlcnZsZXQgTGluayBjYXNlCi0JCWVsc2UgewotCQkJbGlua05hbWUgPSAoKFNlcnZsZXRMaW5rKSBsaW5rKS5nZXRTZXJ2bGV0TGluaygpOwotCQkJV2ViQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJCVdlYkFwcCB3ZWJBcHAgPSBhcnRpZmFjdEVkaXQuZ2V0V2ViQXBwKCk7Ci0JCQlpZiAod2ViQXBwID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJU2VydmxldCBzZXJ2bGV0ID0gd2ViQXBwLmdldFNlcnZsZXROYW1lZChsaW5rTmFtZSk7Ci0JCQlpZiAoc2VydmxldCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWphdmFDbGFzcyA9IHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gT3BlbiBqYXZhIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBhc3NvY2lhdGVkIGphdmEgZmlsZQotCQl0cnkgewotCQkJSjJFRUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGphdmFDbGFzcywgcCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKC0xLCBjYW50T3Blbi5nZXRNZXNzYWdlKCksIGNhbnRPcGVuKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJvb3RPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCByZWZPYmogPSAoRU9iamVjdCkgb2JqOwotCQkJd2hpbGUgKHJlZk9iaiAhPSBudWxsICYmIHJlZk9iai5lQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQlyZWZPYmogPSByZWZPYmouZUNvbnRhaW5lcigpOwotCQkJcmV0dXJuIHJlZk9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgRUpCIDMgQmVhbgotCSAqIFsyNDE2ODVdIGZpcnN0IGFkZGVkCi0JICogCi0JICogQHBhcmFtIG9iaiBkZXRlcm1pbmUgd2VhdGhlciB0aGlzIG9iamVjdCBpcyBhbiBFSkIgMyBiZWFuIG9yIG5vdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvYmogaXMgYSBFSkIgMyBiZWFuLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFSkIzQmVhbk9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCWJvb2xlYW4gaXNCZWFuID0KLQkJCW9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIHx8Ci0JCQlvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiB8fAotCQkJb2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLQkJCi0JCXJldHVybiBpc0JlYW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMzNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dUUEJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1bCA3LCAyMDA0Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdUUEJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfT0NDVVJSRURfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVJST1JfT0NDVVJSRURfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX01FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKG51bGwgPT0gc2VsZWN0aW9uKSB7Ci0JCQlJU2VsZWN0aW9uIGF1dG9zZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoYXV0b3NlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCXRoaXMuc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhdXRvc2VsZWN0aW9uOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXByaW1SdW4oc2hlbGwpOwotCQkJdGhpcy5zZWxlY3Rpb24gPSBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vaW5pdAotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgYVNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2ZhYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBXQVJOSU5HOiBUaGlzIGNsYXNzIHdpbGwgYmUgZGVsZXRlZAotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbn0KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIHsKLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSwgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIobmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKG5lc3RlZE9wKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDc1OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNjYW5FZGl0KG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVkaXQoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNjYW5SZW1vdmUob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNnZXRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlmaW5hbCBVUkwgZ2lmSW1hZ2VVUkwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJDUERlcCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkgewotCQkJCWRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnaWZJbWFnZVVSTCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNnZXROYW1lTGFiZWwob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lTGFiZWwoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewotCQlyZXR1cm4gUmVzb3VyY2VzLm5hbWVMYWJlbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldFZhbHVlTGFiZWwob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUxhYmVsKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBhdHRyaWJ1dGUuZ2V0Q2xhc3NwYXRoQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyaWIgIT0gbnVsbCkgewotCQkJZmluYWwgU3RyaW5nIHZhbHVlID0gYXR0cmliLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSKSkgewotCQkJCQlyZXR1cm4gUmVzb3VyY2VzLmNvbnRhaW5lck1hcHBpbmc7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VzLnVuc3BlY2lmaWVkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jcGVyZm9ybUVkaXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwsIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIHBlcmZvcm1FZGl0KFNoZWxsIHNoZWxsLAotCQkJQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jcGVyZm9ybVJlbW92ZShvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBwZXJmb3JtUmVtb3ZlKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIG51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zcGVjaWZpZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lck1hcHBpbmc7Ci0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIENsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjA1MGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1uYW1lTGFiZWwgPSBQdWJsaXNoL2V4cG9ydCBkZXBlbmRlbmN5Ci11bnNwZWNpZmllZCA9IChOb25lKQotY29udGFpbmVyTWFwcGluZyA9IEFkZGVkIHRvIHBhcmVudCBtb2R1bGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwYTc3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLlVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci0KLS8qKgotICogSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgZm9yIGNsYXNzcGF0aCBkZXBlbmRlbmN5IHZhbGlkYXRvciBwcm9ibGVtIG1hcmtlcnMuIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhmaW5hbCBJTWFya2VyIG1hcmtlcikgewotCQkvLyBnZW5lcmF0ZSByZXNvbHV0aW9ucyBiYXNlZCBvbiB0eXBlIG9mIHZhbGlkYXRpb24gcHJvYmxlbSBtYXJrZXIKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IG51bGw7Ci0JCVN0cmluZyBjcEVudHJ5UGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXNzYWdlSWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEKTsKLQkJCWNwRW50cnlQYXRoID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSX0dST1VQKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFVUlQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihjZSk7Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCQl9Ci0JCQotCQlpZiAobWVzc2FnZUlkID09IG51bGwgfHwgY3BFbnRyeVBhdGggPT0gbnVsbCB8fCBjcEVudHJ5UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCQl9Ci0JCQotCQlpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci5BcHBDbGllbnRQcm9qZWN0LmVxdWFscyhtZXNzYWdlSWQpKSB7Ci0JCQkvLyBjYW4gYXBwbHkgdG8gbXVsdGlwbGUgY3AgZW50cmllcyBzbyBub3QgY3VycmVudGx5IHN1cHBvcnRpbmcgYSBxdWljayBmaXguLi4KLQkJfSBlbHNlIGlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLkR1cGxpY2F0ZUNsYXNzRm9sZGVyRW50cnkuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLQkJCS8vIHF1aWNrIGZpeCByZW1vdmVzIHRoZSBkZXBlbmRlbmN5Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgVXBkYXRlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgsIGZhbHNlKSB9OwkJCQotCQl9IGVsc2UgaWYgKENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuRHVwbGljYXRlQXJjaGl2ZU5hbWUuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLQkJCS8vIHF1aWNrIGZpeCByZW1vdmVzIHRoZSBkZXBlbmRlbmN5Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgVXBkYXRlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgsIGZhbHNlKSB9OwkJCQotCQl9IGVsc2UgaWYgKENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuRmlsdGVyZWRDb250YWluZXIuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLQkJCS8vIHF1aWNrIGZpeCByZW1vdmVzIHRoZSBkZXBlbmRlbmN5Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgVXBkYXRlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgsIGZhbHNlKSB9OwkJCQotCQl9IGVsc2UgaWYgKENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuSW52YWxpZE5vbldlYlJ1bnRpbWVQYXRoLmVxdWFscyhtZXNzYWdlSWQpKSB7Ci0JCQkvLyBxdWljayBmaXggcmVtb3ZlcyB0aGUgZGVwZW5kZW5jeQotCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsgbmV3IFVwZGF0ZUNsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVSZXNvbHV0aW9uKGNwRW50cnlQYXRoLCBmYWxzZSkgfTsJCQkKLQkJfSBlbHNlIGlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLkludmFsaWRXZWJSdW50aW1lUGF0aC5lcXVhbHMobWVzc2FnZUlkKSkgewotCQkJLy8gcXVpY2sgZml4IHJlbW92ZXMgdGhlIGRlcGVuZGVuY3kKLQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7IG5ldyBVcGRhdGVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihjcEVudHJ5UGF0aCwgZmFsc2UpIH07CQkJCi0JCX0gZWxzZSBpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci5Ob25UYWdnZWRFeHBvcnRlZENsYXNzZXMuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLQkJCS8vIHF1aWNrIGZpeCBhZGRzIHRoZSBkZXBlbmRlbmN5Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgVXBkYXRlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgsIHRydWUpLAotCQkJCQluZXcgQWRkQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgpfTsJCi0JCX0gZWxzZSBpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci5Qcm9qZWN0Q2xhc3NwYXRoRW50cnkuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLQkJCS8vIHF1aWNrIGZpeCByZW1vdmVzIHRoZSBkZXBlbmRlbmN5Ci0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgVXBkYXRlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgsIGZhbHNlKSB9OwkKLQkJfSBlbHNlIGlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLlJvb3RNYXBwaW5nTm9uRUFSV0FSUmVmLmVxdWFscyhtZXNzYWdlSWQpKSB7Ci0JCQkvLyBjYW4gYXBwbHkgdG8gbXVsdGlwbGUgY3AgZW50cmllcyBzbyBub3QgY3VycmVudGx5IHN1cHBvcnRpbmcgYSBxdWljayBmaXguLi4KLQkJfSBlbHNlIGlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLlNvdXJjZUVudHJ5LmVxdWFscyhtZXNzYWdlSWQpKSB7Ci0JCQkvLyBxdWljayBmaXggcmVtb3ZlcyB0aGUgZGVwZW5kZW5jeQotCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsgbmV3IFVwZGF0ZUNsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVSZXNvbHV0aW9uKGNwRW50cnlQYXRoLCBmYWxzZSkgfTsJCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07Ci0gICAgfQotCQotICAgIHByaXZhdGUgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRDbGFzc3BhdGhFbnRyeUZvck1hcmtlcihmaW5hbCBJTWFya2VyIG1hcmtlciwgZmluYWwgU3RyaW5nIGNwRW50cnlQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qICE9IG51bGwgJiYgcHJvai5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJZmluYWwgSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQkJaWYgKGNwRW50cnlQYXRoICE9IG51bGwpIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSByYXdDcCA9IGpQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3Q3AubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHJhd0NwW2ldLmdldFBhdGgoKS50b1N0cmluZygpLmVxdWFscyhjcEVudHJ5UGF0aCkpIHsKLQkJCQkJCXJldHVybiByYXdDcFtpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0JCi0JLyogUmVzb2x1dGlvbiB0aGF0IGFkZC9yZW1vdmVzIHRoZSBjbGFzc3BhdGggZGVwZW5kZW5jeSBhdHRyaWJ1dGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBVcGRhdGVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3BFbnRyeVBhdGg7Ci0gICAgICAgIHB1YmxpYyBVcGRhdGVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihmaW5hbCBTdHJpbmcgY3BFbnRyeVBhdGgsIGZpbmFsIGJvb2xlYW4gYWRkKSB7Ci0gICAgICAgICAgICB0aGlzLmFkZCA9IGFkZDsKLSAgICAgICAgICAgIHRoaXMuY3BFbnRyeVBhdGggPSBjcEVudHJ5UGF0aDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgCWlmIChhZGQpIHsKLSAgICAgICAgCQlyZXR1cm4gUmVzb3VyY2VzLmFkZENsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGU7CQotICAgICAgICAJfSAKLSAgICAgICAgCXJldHVybiBSZXNvdXJjZXMucmVtb3ZlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBJTWFya2VyIG1hcmtlcikgewotICAgIAkgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLQkgICAgCXRyeSB7Ci0JICAgIAkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSBnZXRDbGFzc3BhdGhFbnRyeUZvck1hcmtlcihtYXJrZXIsIGNwRW50cnlQYXRoKTsKLQkgICAgCQlpZiAoYWRkKSB7Ci0JICAgIAkJCVVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuYWRkRGVwZW5kZW5jeUF0dHJpYnV0ZShudWxsLCBwcm9qLmdldE5hbWUoKSwgY3BFbnRyeSk7Ci0JICAgIAkJfSBlbHNlIHsKLQkgICAgCQkJVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5yZW1vdmVEZXBlbmRlbmN5QXR0cmlidXRlKG51bGwsIHByb2ouZ2V0TmFtZSgpLCBjcEVudHJ5KTsJCi0JICAgIAkJfQotCSAgICAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSl7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKG51bGwsIFJlc291cmNlcy5lcnJvckRpYWxvZ1RpdGxlLAotICAgICAgICAgICAgICAgIAkJUmVzb3VyY2VzLmVycm9yRGlhbG9nTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAJCWNlLmdldFN0YXR1cygpKTsKLQkgICAgCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSl7Ci0JICAgIAkJRXJyb3JEaWFsb2cub3BlbkVycm9yKG51bGwsIFJlc291cmNlcy5lcnJvckRpYWxvZ1RpdGxlLAotCSAgICAJCQkJUmVzb3VyY2VzLmVycm9yRGlhbG9nTWVzc2FnZSwKLQkgICAgCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgZWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlZSkpOyAKLQkgICAgCX0KLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotCS8qIFJlc29sdXRpb24gdGhhdCBhZGRzIHRoZSBjbGFzc3BhdGggbm9uZGVwZW5kZW5jeSBhdHRyaWJ1dGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBZGRDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3BFbnRyeVBhdGg7Ci0gICAgICAgIHB1YmxpYyBBZGRDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihmaW5hbCBTdHJpbmcgY3BFbnRyeVBhdGgpIHsKLSAgICAgICAgICAgIHRoaXMuY3BFbnRyeVBhdGggPSBjcEVudHJ5UGF0aDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgCXJldHVybiBSZXNvdXJjZXMuYWRkQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZTsJCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgSU1hcmtlciBtYXJrZXIpIHsKLSAgICAJICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JICAgIAl0cnkgewotCSAgICAJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gZ2V0Q2xhc3NwYXRoRW50cnlGb3JNYXJrZXIobWFya2VyLCBjcEVudHJ5UGF0aCk7Ci0JICAgIAkJVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5hZGROb25EZXBlbmRlbmN5QXR0cmlidXRlKG51bGwsIHByb2ouZ2V0TmFtZSgpLCBjcEVudHJ5KTsKLQkgICAgCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihudWxsLCBSZXNvdXJjZXMuZXJyb3JEaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICAJCVJlc291cmNlcy5lcnJvckRpYWxvZ01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgCQljZS5nZXRTdGF0dXMoKSk7Ci0JICAgIAl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpewotCSAgICAJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihudWxsLCBSZXNvdXJjZXMuZXJyb3JEaWFsb2dUaXRsZSwKLQkgICAgCQkJCVJlc291cmNlcy5lcnJvckRpYWxvZ01lc3NhZ2UsCi0JICAgIAkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIGVlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZWUpKTsgCi0JICAgIAl9Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ1RpdGxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ01lc3NhZ2U7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxZTVhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYWRkQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZSA9IE1hcmsgdGhlIGFzc29jaWF0ZWQgcmF3IGNsYXNzcGF0aCBlbnRyeSBhcyBhIHB1Ymxpc2gvZXhwb3J0IGRlcGVuZGVuY3kuCi1hZGRDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlID0gRXhjbHVkZSB0aGUgYXNzb2NpYXRlZCByYXcgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIHNldCBvZiBwb3RlbnRpYWwgcHVibGlzaC9leHBvcnQgZGVwZW5kZW5jaWVzLgotcmVtb3ZlQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZSA9IFJlbW92ZSBwdWJsaXNoL2V4cG9ydCBkZXBlbmRlbmN5IG9uIHRoZSBhc3NvY2lhdGVkIHJhdyBjbGFzc3BhdGggZW50cnkuCi1lcnJvckRpYWxvZ1RpdGxlID0gRXJyb3IKLWVycm9yRGlhbG9nTWVzc2FnZSA9IEZhaWxlZCB3aGlsZSBhcHBseWluZyB0aGUgcXVpY2sgZml4LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjOTIxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aE5vbkRlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC51aTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbiBleHRlbmRzIENsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jY2FuRWRpdChvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FZGl0KENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jY2FuUmVtb3ZlKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jZ2V0SW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJZmluYWwgVVJMIGdpZkltYWdlVVJMID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiQ1BEZXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGdpZkltYWdlVVJMICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2lmSW1hZ2VVUkwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jZ2V0TmFtZUxhYmVsKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUxhYmVsKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIFJlc291cmNlcy5uYW1lTGFiZWw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNnZXRWYWx1ZUxhYmVsKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVMYWJlbChDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBSZXNvdXJjZXMudW5zcGVjaWZpZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNwZXJmb3JtRWRpdChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCwgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgcGVyZm9ybUVkaXQoU2hlbGwgc2hlbGwsCi0JCQlDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNwZXJmb3JtUmVtb3ZlKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIHBlcmZvcm1SZW1vdmUoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfTk9OX0RFUEVOREVOQ1ksIG51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zcGVjaWZpZWQ7Ci0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIENsYXNzcGF0aE5vbkRlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM0NDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1uYW1lTGFiZWwgPSBFeGNsdWRlZCBmcm9tIHB1Ymxpc2gvZXhwb3J0IHN0cnVjdHVyZQotdW5zcGVjaWZpZWQgPSAoTm9uZSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvQXBwQ2xpZW50QXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvQXBwQ2xpZW50QXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTBmY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0FwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczsKLQotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImFwcGNsaWVudGFyY2hpdmV1aSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0V4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZmQ1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VTdHJpbmcoIiVjbGllbnQuZXhwb3J0LmFjdGlvbi5sYWJlbF91aV8iKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImFwcGNsaWVudF9leHBvcnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEV4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCUFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkKCk7Ci0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbik7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0ltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzYxNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0ltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEFwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFwcGxpY2F0aW9uX0NsaWVudF9JbXBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJhcHBjbGllbnRfaW1wb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCUFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkKCk7Ci0KLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0T3ZlcnJpZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTY0ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDEwOjU2OjA4IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQgb3ZlcnJpZGFibGU7Ci0JcHJpdmF0ZSBKMkVFQ2xpcGJvYXJkIGoyZWVDbGlwYm9hcmQ7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQoQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZC5nZXRMYWJlbCgpLCBjb21tYW5kLmdldERlc2NyaXB0aW9uKCkpOwotCQlzZXRPdmVycmlkYWJsZShjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpICYmIG92ZXJyaWRhYmxlLmRvQ2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBvdmVycmlkYWJsZS5kb0NhblVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBvdmVycmlkYWJsZS5kb0dldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGdldE92ZXJyaWRhYmxlKCkuZ2V0RG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTE6MTk6MjcgQU0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5jb21tYW5kLkoyRUVDbGlwYm9hcmQKLQkgKi8KLQlwdWJsaWMgSjJFRUNsaXBib2FyZCBnZXRKMmVlQ2xpcGJvYXJkKCkgewotCQlyZXR1cm4gajJlZUNsaXBib2FyZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxMDo1ODozMyBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQgZ2V0T3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiBvdmVycmlkYWJsZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBnZXRKMmVlQ2xpcGJvYXJkKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTE6MTk6MjcgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0oyZWVDbGlwYm9hcmQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmNvbW1hbmQuSjJFRUNsaXBib2FyZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEoyZWVDbGlwYm9hcmQoSjJFRUNsaXBib2FyZCBuZXdKMmVlQ2xpcGJvYXJkKSB7Ci0JCWoyZWVDbGlwYm9hcmQgPSBuZXdKMmVlQ2xpcGJvYXJkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDEwOjU4OjMzIEFNKQotCSAqIAotCSAqIEBwYXJhbSBBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPdmVycmlkYWJsZShBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQgbmV3T3ZlcnJpZGFibGUpIHsKLQkJb3ZlcnJpZGFibGUgPSBuZXdPdmVycmlkYWJsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNsaXBib2FyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNsaXBib2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRhYjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDbGlwYm9hcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEoyRUVDbGlwYm9hcmQgZXh0ZW5kcyBBcnJheUxpc3QgewotCS8qKgotCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODcxMzAyMTU3MzA5OTEzNDA5Nkw7Ci0JcHJpdmF0ZSBNYXAgYmluZGluZ3M7Ci0JcHJpdmF0ZSBNYXAgZXh0ZW5zaW9uczsKLQotCS8qKgotCSAqIEoyRUVDbGlwYm9hcmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRUNsaXBib2FyZChDb2xsZWN0aW9uIGRlZmF1bHRDbGlwYm9hcmQpIHsKLQkJc3VwZXIoZGVmYXVsdENsaXBib2FyZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZEFsbChjKTsKLQkJaWYgKHJlc3VsdCAmJiAoYyBpbnN0YW5jZW9mIEoyRUVDbGlwYm9hcmQpKQotCQkJYWRkQWxsRXh0cmEoKEoyRUVDbGlwYm9hcmQpIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFsbEV4dHJhKEoyRUVDbGlwYm9hcmQgYykgewotCQlnZXRCaW5kaW5ncygpLnB1dEFsbChjLmdldEJpbmRpbmdzKCkpOwotCQlnZXRFeHRlbnNpb25zKCkucHV0QWxsKGMuZ2V0RXh0ZW5zaW9ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCaW5kaW5nKEVPYmplY3QgYm91bmRPYmplY3QsIEVPYmplY3QgYmluZGluZykgewotCQlnZXRCaW5kaW5ncygpLnB1dChib3VuZE9iamVjdCwgYmluZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaW9uKEVPYmplY3QgZXh0ZW5kZWRPYmplY3QsIEVPYmplY3QgZXh0ZW5zaW9uKSB7Ci0JCWdldEV4dGVuc2lvbnMoKS5wdXQoZXh0ZW5kZWRPYmplY3QsIGV4dGVuc2lvbik7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0QmluZGluZyhFT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRCaW5kaW5ncygpLmdldChvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEJpbmRpbmdzKCkgewotCQlpZiAoYmluZGluZ3MgPT0gbnVsbCkKLQkJCWJpbmRpbmdzID0gbmV3IEhhc2hNYXAoMTApOwotCQlyZXR1cm4gYmluZGluZ3M7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RXh0ZW5zaW9uKEVPYmplY3QgbykgewotCQlyZXR1cm4gKEVPYmplY3QpIGdldEV4dGVuc2lvbnMoKS5nZXQobyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRFeHRlbnNpb25zKCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJZXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKDEwKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ3MoKSB7Ci0JCXJldHVybiBiaW5kaW5ncyAhPSBudWxsICYmICFiaW5kaW5ncy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhZXh0ZW5zaW9ucy5pc0VtcHR5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvbXBvdW5kQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvbXBvdW5kQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjEwM2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb21wb3VuZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8xMy8wMSAxMDoyNzoxNiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbXBvdW5kQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCB7Ci0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCkgewotCQlzdXBlcihyZXN1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE1lcmdlZEFmZmVjdGVkT2JqZWN0c0NvbGxlY3Rpb24oKSB7Ci0JCUoyRUVDbGlwYm9hcmQgcmVzdWx0ID0gbmV3IEoyRUVDbGlwYm9hcmQobmV3IEFycmF5TGlzdCgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGNvbW1hbmRzID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgY29tbWFuZHMuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLm5leHQoKTsKLQkJCXJlc3VsdC5hZGRBbGwoY29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE1lcmdlZFJlc3VsdENvbGxlY3Rpb24oKSB7Ci0JCUoyRUVDbGlwYm9hcmQgcmVzdWx0ID0gbmV3IEoyRUVDbGlwYm9hcmQobmV3IEFycmF5TGlzdCgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGNvbW1hbmRzID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgY29tbWFuZHMuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRzLm5leHQoKTsKLQkJCXJlc3VsdC5hZGRBbGwoY29tbWFuZC5nZXRSZXN1bHQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWRjMGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNvcHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb3B5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJvdGVjdGVkIEVPYmplY3Qgb2JqZWN0VG9Db3B5OwotCXByb3RlY3RlZCBFT2JqZWN0IGJpbmRpbmdUb0NvcHk7Ci0JcHJvdGVjdGVkIEVPYmplY3QgZXh0ZW5zaW9uVG9Db3B5OwotCXByb3RlY3RlZCBKMkVFQ2xpcGJvYXJkIHJlc3VsdDsKLQlwcm90ZWN0ZWQgRXRvb2xzQ29weVV0aWxpdHkgY29weVV0aWw7Ci0KLQlwdWJsaWMgSjJFRUNvcHlDb21tYW5kKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGJpbmRpbmcsIEVPYmplY3QgZXh0ZW5zaW9uLCBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbGl0eSkgewotCQlvYmplY3RUb0NvcHkgPSBvYmplY3Q7Ci0JCWJpbmRpbmdUb0NvcHkgPSBiaW5kaW5nOwotCQlleHRlbnNpb25Ub0NvcHkgPSBleHRlbnNpb247Ci0JCWNvcHlVdGlsID0gY29weVV0aWxpdHk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHBlcmZvcm0gdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZyBleGVjdXRlCi0JICogd2hlbiBjYW5FeGVjdXRlIHJldHVybnMgZmFsc2UsIG9yIHdoZW4gY2FuRXhlY3V0ZSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlDb3B5R3JvdXAgZ3JvdXAgPSBuZXcgQ29weUdyb3VwKCk7Ci0KLQkJZ3JvdXAuYWRkKG9iamVjdFRvQ29weSk7Ci0KLQkJaWYgKGJpbmRpbmdUb0NvcHkgIT0gbnVsbCkKLQkJCWdyb3VwLmFkZChiaW5kaW5nVG9Db3B5KTsKLQkJaWYgKGV4dGVuc2lvblRvQ29weSAhPSBudWxsKQotCQkJZ3JvdXAuYWRkKGV4dGVuc2lvblRvQ29weSk7Ci0JCWNvcHlVdGlsLmNvcHkoZ3JvdXApOwotCQlFT2JqZWN0IGNvcHkgPSBjb3B5VXRpbC5nZXRDb3B5KG9iamVjdFRvQ29weSk7Ci0JCXJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKENvbGxlY3Rpb25zLnNpbmdsZXRvbihjb3B5KSk7Ci0KLQkJaWYgKGJpbmRpbmdUb0NvcHkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGRCaW5kaW5nKGNvcHksIGNvcHlVdGlsLmdldENvcHkoYmluZGluZ1RvQ29weSkpOwotCQlpZiAoZXh0ZW5zaW9uVG9Db3B5ICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkRXh0ZW5zaW9uKGNvcHksIGNvcHlVdGlsLmdldENvcHkoZXh0ZW5zaW9uVG9Db3B5KSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYWdhaW4gcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byByZWRvIHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyByZWRvIGJlZm9yZSB1bmRvIGlzIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZgotCSAqIHlvdSBpbXBsZW1lbnQgcmVkbyB0byBjYWxsIGV4ZWN1dGUgdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gYnkgdGhhdAotCSAqIGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9yZWRvCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgxZGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVVSUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNvcHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMTEvMDEgODo0NToyMSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBKMkVFVUlFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQlwcml2YXRlIEoyRUVDbGlwYm9hcmQgcmVzdWx0OwotCXByaXZhdGUgRXRvb2xzQ29weVV0aWxpdHkgY29weVV0aWw7Ci0KLQlwdWJsaWMgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZChKMkVFVUlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJZG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBwZXJmb3JtIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcgZXhlY3V0ZQotCSAqIHdoZW4gY2FuRXhlY3V0ZSByZXR1cm5zIGZhbHNlLCBvciB3aGVuIGNhbkV4ZWN1dGUgaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNvcHlVdGlsICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvcHlVdGlsID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCUoyRUVDbGlwYm9hcmQgY2xpcGJvYXJkID0gZG9tYWluLmdldEoyRUVDbGlwYm9hcmQoKTsKLQkJcmVzdWx0ID0gbmV3IEoyRUVDbGlwYm9hcmQobmV3IEFycmF5TGlzdCgwKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xpcGJvYXJkLnNpemUoKTsgaSsrKSB7Ci0JCQlDb3B5R3JvdXAgZ3JvdXAgPSBuZXcgQ29weUdyb3VwKCk7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgY2xpcGJvYXJkLmdldChpKTsKLQkJCWdyb3VwLmFkZChvKTsKLQkJCUVPYmplY3QgYm5kID0gY2xpcGJvYXJkLmdldEJpbmRpbmcobyk7Ci0JCQlpZiAoYm5kICE9IG51bGwpCi0JCQkJZ3JvdXAuYWRkKGJuZCk7Ci0JCQlFT2JqZWN0IGV4dCA9IGNsaXBib2FyZC5nZXRFeHRlbnNpb24obyk7Ci0JCQlpZiAoZXh0ICE9IG51bGwpCi0JCQkJZ3JvdXAuYWRkKGV4dCk7Ci0JCQljb3B5VXRpbC5jb3B5KGdyb3VwKTsKLQkJCUVPYmplY3QgY29weSA9IGNvcHlVdGlsLmdldENvcHkobyk7Ci0JCQlyZXN1bHQuYWRkKGNvcHkpOwotCQkJaWYgKGJuZCAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRCaW5kaW5nKGNvcHksIGNvcHlVdGlsLmdldENvcHkoYm5kKSk7Ci0JCQlpZiAoZXh0ICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEV4dGVuc2lvbihjb3B5LCBjb3B5VXRpbC5nZXRDb3B5KGV4dCkpOwotCQl9Ci0JCS8vUmVzZXQgdGhlIHV0aWwgc28gcmVkbyB3aWxsIGFjdHVhbGwgcmVkbwotCQljb3B5VXRpbCA9IG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYWdhaW4gcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byByZWRvIHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyByZWRvIGJlZm9yZSB1bmRvIGlzIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZgotCSAqIHlvdSBpbXBsZW1lbnQgcmVkbyB0byBjYWxsIGV4ZWN1dGUgdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gYnkgdGhhdAotCSAqIGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXJlc3VsdCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQyYjgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQgZXh0ZW5kcyBDb3B5VG9DbGlwYm9hcmRDb21tYW5kIHsKLQkvL1RoZSBjb2xsZWN0aW9uIG9mIHNvdXJjZSBvYmplY3RzLCB3aXRoIGJpbmRpbmdzIGFuZCBleHRlbnNpb25zLCBpZiBhbnkgZXhpc3QKLQlwcm90ZWN0ZWQgSjJFRUNsaXBib2FyZCBleHRlbmRlZFNvdXJjZU9iamVjdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb25seVJlZk9iamVjdHMgPSB0cnVlOwotCi0JcHVibGljIEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCBjbWQpIHsKLQkJc3VwZXIoY21kLmdldERvbWFpbigpLCBjbWQuZ2V0U291cmNlT2JqZWN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCgpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBKMkVFQ29tcG91bmRDb21tYW5kKENvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZXh0ZW5kZWRTb3VyY2VPYmplY3RzLml0ZXJhdG9yKCk7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEVPYmplY3QpKSB7Ci0JCQkJY21kLmFwcGVuZChVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCByID0gKEVPYmplY3QpIG87Ci0JCQkJY21kLmFwcGVuZChuZXcgSjJFRUNvcHlDb21tYW5kKHIsIGV4dGVuZGVkU291cmNlT2JqZWN0cy5nZXRCaW5kaW5nKHIpLCBleHRlbmRlZFNvdXJjZU9iamVjdHMuZ2V0RXh0ZW5zaW9uKHIpLCBjb3B5VXRpbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbWQudW53cmFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcHJlcGFyZVNvdXJjZU9iamVjdHMoKTsKLQkJaWYgKCFvbmx5UmVmT2JqZWN0cykgewotCQkJY29weUNvbW1hbmQgPSBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJcmV0dXJuIGNvcHlDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCWlmICghZXh0ZW5kZWRTb3VyY2VPYmplY3RzLmhhc0JpbmRpbmdzKCkgJiYgIWV4dGVuZGVkU291cmNlT2JqZWN0cy5oYXNFeHRlbnNpb25zKCkpCi0JCQlyZXR1cm4gc3VwZXIucHJlcGFyZSgpOwotCi0JCWNvcHlDb21tYW5kID0gY3JlYXRlQ29weUNvbW1hbmQoKTsKLQkJcmV0dXJuIGNvcHlDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlU291cmNlT2JqZWN0cygpIHsKLQkJZXh0ZW5kZWRTb3VyY2VPYmplY3RzID0gbmV3IEoyRUVDbGlwYm9hcmQoZ2V0U291cmNlT2JqZWN0cygpKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkvLwkJCUVPYmplY3QgciA9IChFT2JqZWN0KSBvOwotCQkJCS8vIFRPRE8gc3dpdGNoIHRvIGFkYXB0YWJsZSBjb21tYW5kcwotCQkJCS8vCQkJRU9iamVjdCBibmQgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmcocik7Ci0JCQkJLy8JCQlFT2JqZWN0IGV4dCA9IEJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9uKHIpOwotCQkJCS8vCQkJaWYgKGJuZCAhPSBudWxsKQotCQkJCS8vCQkJCWV4dGVuZGVkU291cmNlT2JqZWN0cy5hZGRCaW5kaW5nKHIsIGJuZCk7Ci0JCQkJLy8JCQlpZiAoZXh0ICE9IG51bGwpCi0JCQkJLy8JCQkJZXh0ZW5kZWRTb3VyY2VPYmplY3RzLmFkZEV4dGVuc2lvbihyLCBleHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvL1JpZ2h0IG5vdyB3ZSBjYW4gb25seSBoYW5kbGUgcmVmIG9iamVjdHMgaW4gdGhlIHRyZWUKLQkJCQlvbmx5UmVmT2JqZWN0cyA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxYTZkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5TdHJpY3RDb21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5JRFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVVJRWRpdGluZ0RvbWFpbjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZCBleHRlbmRzIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgewotCXByaXZhdGUgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZCBjb3B5Q29tbWFuZDsKLQlwcml2YXRlIENvbW1hbmQgYWRkQmluZGluZ3NDb21tYW5kOwotCXByaXZhdGUgQ29tbWFuZCBhZGRFeHRlbnNpb25zQ29tbWFuZDsKLQotCXB1YmxpYyBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcCkgewotCQlzdXBlcihwLmdldERvbWFpbigpLCBwLmdldE93bmVyKCksIHAuZ2V0RmVhdHVyZSgpLCBwLmdldEluZGV4KCksIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCQlleGVjdXRlQWRkQmluZGluZ3MoKTsKLQkJZXhlY3V0ZUFkZEV4dGVuc2lvbnMoKTsKLQkJSjJFRUNsaXBib2FyZCByZXN1bHQgPSAoSjJFRUNsaXBib2FyZCkgZG9HZXRSZXN1bHQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSByZXN1bHQuZ2V0KGkpOwotCQkJaWYgKHJlc3VsdC5nZXRCaW5kaW5nKG8pICE9IG51bGwgfHwgcmVzdWx0LmdldEV4dGVuc2lvbihvKSAhPSBudWxsKQotCQkJCUlEVXRpbGl0eS5zZXREZWZhdWx0SUQobywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGNvcHlDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlyZXR1cm4gY29weUNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9SZWRvKCkgewotCQlzdXBlci5kb1JlZG8oKTsKLQkJaWYgKGFkZEJpbmRpbmdzQ29tbWFuZCAhPSBudWxsKQotCQkJYWRkQmluZGluZ3NDb21tYW5kLnJlZG8oKTsKLQkJaWYgKGFkZEV4dGVuc2lvbnNDb21tYW5kICE9IG51bGwpCi0JCQlhZGRFeHRlbnNpb25zQ29tbWFuZC5yZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VbmRvKCkgewotCQlzdXBlci5kb1VuZG8oKTsKLQkJaWYgKGFkZEJpbmRpbmdzQ29tbWFuZCAhPSBudWxsKQotCQkJYWRkQmluZGluZ3NDb21tYW5kLnVuZG8oKTsKLQkJaWYgKGFkZEV4dGVuc2lvbnNDb21tYW5kICE9IG51bGwpCi0JCQlhZGRFeHRlbnNpb25zQ29tbWFuZC51bmRvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFkZEJpbmRpbmdzKCkgewotCQlpZiAoYWRkQmluZGluZ3NDb21tYW5kICE9IG51bGwgJiYgYWRkQmluZGluZ3NDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCWFkZEJpbmRpbmdzQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFkZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChhZGRFeHRlbnNpb25zQ29tbWFuZCAhPSBudWxsICYmIGFkZEV4dGVuc2lvbnNDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCWFkZEV4dGVuc2lvbnNDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRUNsaXBib2FyZCBnZXRDb3BpZWRDbGlwb2FyZCgpIHsKLQkJcmV0dXJuIChKMkVFQ2xpcGJvYXJkKSBjb3B5Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSjJFRUNsaXBib2FyZCBnZXRKMkVFQ2xpcGJvYXJkKCkgewotCQlyZXR1cm4gKEoyRUVDbGlwYm9hcmQpIGRvbWFpbi5nZXRDbGlwYm9hcmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlpZiAoZ2V0SjJFRUNsaXBib2FyZCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNvbW1hbmQgPSBuZXcgU3RyaWN0Q29tcG91bmRDb21tYW5kKCk7Ci0KLQkJY29weUNvbW1hbmQgPSBuZXcgSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZCgoSjJFRVVJRWRpdGluZ0RvbWFpbikgZG9tYWluKTsKLQkJY29tbWFuZC5hcHBlbmQoY29weUNvbW1hbmQpOwotCi0JCWNvbW1hbmQuYXBwZW5kKG5ldyBDb21tYW5kV3JhcHBlcigpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGdldE93bmVyKCksIGdldEZlYXR1cmUoKSwgY29weUNvbW1hbmQuZ2V0UmVzdWx0KCksIGdldEluZGV4KCkpOwotCQkJCXJldHVybiBhZGRDb21tYW5kOwotCQkJfQotCQl9KTsKLQkJcHJlcGFyZUJpbmRpbmdDb21tYW5kKGNvcHlDb21tYW5kKTsKLQkJcHJlcGFyZUV4dGVuc2lvbkNvbW1hbmQoY29weUNvbW1hbmQpOwotCi0JCWJvb2xlYW4gcmVzdWx0OwotCQlpZiAob3B0aW1pemUpIHsKLQkJCS8vIFRoaXMgd2lsbCBkZXRlcm1pbmUgY2FuRXhlY3V0ZSBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KLQkJCS8vCi0JCQlyZXN1bHQgPSBvcHRpbWl6ZWRDYW5FeGVjdXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGlzIHdpbGwgYWN0dWFsbHkgZXhlY3V0ZSB0aGUgY29weSBjb21tYW5kIGluIG9yZGVyIHRvIGNoZWNrIGlmIHRoZSBhZGQgY2FuIGV4ZWN1dGUuCi0JCQkvLwotCQkJcmVzdWx0ID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVCaW5kaW5nQ29tbWFuZChmaW5hbCBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCkgewotCQlpZiAoIWdldEoyRUVDbGlwYm9hcmQoKS5oYXNCaW5kaW5ncygpKQotCQkJcmV0dXJuOwotCQkvL1RPRE8gbWFrZSBhZGFwdGFibGUgY29tbWFuZAotCQkvLwlhZGRCaW5kaW5nc0NvbW1hbmQgPSBuZXcgQ29tbWFuZFdyYXBwZXIoKSB7Ci0JCS8vCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgewotCQkvLwkJCU9iamVjdCBiaW5kaW5nT3duZXIgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmdBZGRPd25lcigoRU9iamVjdClnZXRPd25lcigpKTsKLQkJLy8JCQlDb2xsZWN0aW9uIGJpbmRpbmdzQ29waWVzID0gZ2V0Q29waWVkQ2xpcG9hcmQoKS5nZXRCaW5kaW5ncygpLnZhbHVlcygpOwotCQkvLwkJCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGdldERvbWFpbigpLCBiaW5kaW5nT3duZXIsIG51bGwsIGJpbmRpbmdzQ29waWVzLAotCQkvLyBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJLy8JCQlyZXR1cm4gYWRkQ29tbWFuZDsKLQkJLy8JCX0KLQkJLy8JfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRXh0ZW5zaW9uQ29tbWFuZChmaW5hbCBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCkgewotCQlpZiAoIWdldEoyRUVDbGlwYm9hcmQoKS5oYXNFeHRlbnNpb25zKCkpCi0JCQlyZXR1cm47Ci0JCS8vIFRPRE8gbWFrZSBhZGFwdGFibGUgY29tbWFuZAotCQkvLwlhZGRFeHRlbnNpb25zQ29tbWFuZCA9IG5ldyBDb21tYW5kV3JhcHBlcigpIHsKLQkJLy8JCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCS8vCQkJT2JqZWN0IGV4dGVuc2lvbk93bmVyID0KLQkJLy8gQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5nZXRFeHRlbnNpb25BZGRPd25lcigoRU9iamVjdClnZXRPd25lcigpKTsKLQkJLy8JCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnNDb3BpZXMgPSBnZXRDb3BpZWRDbGlwb2FyZCgpLmdldEV4dGVuc2lvbnMoKS52YWx1ZXMoKTsKLQkJLy8JCQlDb21tYW5kIGFkZENvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShnZXREb21haW4oKSwgZXh0ZW5zaW9uT3duZXIsIG51bGwsCi0JCS8vIGV4dGVuc2lvbnNDb3BpZXMsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkvLwkJCXJldHVybiBhZGRDb21tYW5kOwotCQkvLwkJfQotCQkvLwl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2MTAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTA6NDQ6MDIgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBSZW1vdmVDb21tYW5kIGJpbmRpbmdzUmVtb3ZlQ29tbWFuZDsKLQlwcml2YXRlIFJlbW92ZUNvbW1hbmQgZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQ7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKgotCSAqIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZChSZW1vdmVDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiAoUmVtb3ZlQ29tbWFuZCkgUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGVsZW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nIGV4ZWN1dGUKLQkgKiB3aGVuIGNhbkV4ZWN1dGUgcmV0dXJucyBmYWxzZSwgb3Igd2hlbiBjYW5FeGVjdXRlIGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8qCi0JCSAqIEZvciBlYWNoIG9iamVjdCBiZWluZyByZW1vdmVkLCBjaGVjayBpZiBpdCBoYXMgYSBiaW5kaW5nLCBhbmQgYW4gZXh0ZW5zaW9uIE1ha2UKLQkJICogY29sbGVjdGlvbnMgb2YgdGhlc2UsIG1ha2UgYSBjb21tYW5kIHBhcmFtZXRlciBmb3IgZWFjaCBjb2xsZWN0aW9uLCBhbiBpbnN0YW50aWF0ZSBhCi0JCSAqIHJlbW92ZSBjb21tYW5kCi0JCSAqLwotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGdldFJlbW92ZUNvbW1hbmQoKS5nZXRDb2xsZWN0aW9uKCk7Ci0JCUxpc3QgYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KG9iamVjdHMuc2l6ZSgpKTsKLQkJTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChvYmplY3RzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ID0gb2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpCi0JCQkJcmVzb3VyY2VTZXQgPSBvLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkvLyBUT0RPIG1ha2UgY29tbWFuZCBhZGFwdGFibGUKLQkJCS8vCQlFT2JqZWN0IGJpbmRpbmcgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmcobyk7Ci0JCQkvLwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJLy8JCQliaW5kaW5ncy5hZGQoYmluZGluZyk7Ci0JCQkvLwkJCWdldEoyZWVDbGlwYm9hcmQoKS5hZGRCaW5kaW5nKG8sIGJpbmRpbmcpOwotCQkJLy8JCX0KLQkJCS8vCQlFT2JqZWN0IGV4dGVuc2lvbiA9IEJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9uKG8pOwotCQkJLy8JCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJLy8JCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJLy8JCQlnZXRKMmVlQ2xpcGJvYXJkKCkuYWRkRXh0ZW5zaW9uKG8sIGV4dGVuc2lvbik7Ci0JCQkvLwkJfQotCQl9Ci0JCWlmICghYmluZGluZ3MuaXNFbXB0eSgpKQotCQkJc2V0QmluZGluZ3NSZW1vdmVDb21tYW5kKGNyZWF0ZVJlbW92ZUNvbW1hbmQoYmluZGluZ3MpKTsKLQotCQlpZiAoIWV4dGVuc2lvbnMuaXNFbXB0eSgpKQotCQkJc2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoY3JlYXRlUmVtb3ZlQ29tbWFuZChleHRlbnNpb25zKSk7Ci0KLQkJZXhlY3V0ZUFsbENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFsbENoaWxkcmVuKCkgewotCQlleGVjdXRlTmVzdGVkKGJpbmRpbmdzUmVtb3ZlQ29tbWFuZCk7Ci0JCWV4ZWN1dGVOZXN0ZWQoZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQpOwotCQlnZXRPdmVycmlkYWJsZSgpLmRvRXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWQoUmVtb3ZlQ29tbWFuZCBjbWQpIHsKLQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5kb0NhbkV4ZWN1dGUoKSkgewotCQkJY21kLmRvRXhlY3V0ZSgpOwotCQkJLy8JCUNvbGxlY3Rpb24gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJLy9UT0RPCi0JCQkvLwkJQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5yZXNvbHZlQWxsUHJveGllcyhyZXN1bHQsIHJlc291cmNlU2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHJldHVybiBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0QmluZGluZ3NSZW1vdmVDb21tYW5kKCkgewotCQlyZXR1cm4gYmluZGluZ3NSZW1vdmVDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHJldHVybiBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25zUmVtb3ZlQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKCkgewotCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIGdldE92ZXJyaWRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJc2V0SjJlZUNsaXBib2FyZChuZXcgSjJFRUNsaXBib2FyZChnZXRSZW1vdmVDb21tYW5kKCkuZ2V0Q29sbGVjdGlvbigpKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBhZ2FpbiBwZXJmb3JtIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIHJlZG8gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIHJlZG8gYmVmb3JlIHVuZG8gaXMgY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmCi0JICogeW91IGltcGxlbWVudCByZWRvIHRvIGNhbGwgZXhlY3V0ZSB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBieSB0aGF0Ci0JICogZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlQWxsQ2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxOjMyOjQ0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdCaW5kaW5nc1JlbW92ZUNvbW1hbmQKLQkgKiAgICAgICAgICAgIFJlbW92ZUNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCaW5kaW5nc1JlbW92ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCBuZXdCaW5kaW5nc1JlbW92ZUNvbW1hbmQpIHsKLQkJYmluZGluZ3NSZW1vdmVDb21tYW5kID0gbmV3QmluZGluZ3NSZW1vdmVDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4dGVuc2lvbnNSZW1vdmVDb21tYW5kCi0JICogICAgICAgICAgICBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCBuZXdFeHRlbnNpb25zUmVtb3ZlQ29tbWFuZCkgewotCQlleHRlbnNpb25zUmVtb3ZlQ29tbWFuZCA9IG5ld0V4dGVuc2lvbnNSZW1vdmVDb21tYW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWdldFJlbW92ZUNvbW1hbmQoKS5kb1VuZG8oKTsKLQkJdW5kb05lc3RlZChiaW5kaW5nc1JlbW92ZUNvbW1hbmQpOwotCQl1bmRvTmVzdGVkKGV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bmRvTmVzdGVkKFJlbW92ZUNvbW1hbmQgY21kKSB7Ci0JCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuZG9DYW5VbmRvKCkpCi0JCQljbWQuZG9VbmRvKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkZjgyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5TdHJpY3RDb21wb3VuZENvbW1hbmQ7Ci0KLQotCi0vKioKLSAqIE92ZXJyaWRkZW4gdG8gcHJvdmlkZSBhbiBhY2Nlc3NvciB0byB0aGUgcGVzc2ltaXN0aWMgZmllbGQuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgY2FzZSBvZgotICogdW5kby9yZWRvIHBhc3RlLiBXZSBuZWVkIHRoZSBuZXN0ZWQgY29weSBjb21tbWFuZCBpbiB0aGUgcGFzdGUgY29tbWFuZCB0byByZWRvIGl0c2VsZiB3aGVuIHRoZQotICogcGFzdGUgY29tbWFuZCBpcyBjb3BpZWQsIG90aGVyd2lzZSB3ZSBydW4gaW50byBzZWQgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZCBleHRlbmRzIFN0cmljdENvbXBvdW5kQ29tbWFuZCB7Ci0JLyoqCi0JICogSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChib29sZWFuIHBlc3NpbWlzdGljKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElzUGVzc2lzbWlzdGljKHBlc3NpbWlzdGljKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1Blc3Npc21pc3RpYyhib29sZWFuIGFCb29sKSB7Ci0JCWlzUGVzc2ltaXN0aWMgPSBhQm9vbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdhZGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIEVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5ICB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7SUxhdW5jaGFibGUuY2xhc3MgfTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjYjM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VNb2R1bGVBcnRpZmFjdCBpbXBsZW1lbnRzIElNb2R1bGVBcnRpZmFjdCB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0I2dldE1vZHVsZSgpCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSU1vZHVsZUFydGlmYWN0LmNsYXNzLCBJTGF1bmNoYWJsZS5jbGFzcyB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjc3NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0ID0gbnVsbDsKLS8qCQlpZiAoYWRhcHRlclR5cGUgPT0gSU1vZHVsZUFydGlmYWN0LmNsYXNzICkgewotCQkJCi0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzLldlYk1vZHVsZUFydGlmYWN0IikpIHsKLQkJCQltb2R1bGVBcnRpZmFjdCA9IChJTW9kdWxlQXJ0aWZhY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzLldlYk1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmRlcGxveWFibGVzLklFSkJNb2R1bGVBcnRpZmFjdCIpKSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3QgPSAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5JRUpCTW9kdWxlQXJ0aWZhY3QiKTsKLQkJCX0KLQkJCWlmIChtb2R1bGVBcnRpZmFjdCA9PSBudWxsICYmIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuaGFzQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QiKSkgewotCQkJCW1vZHVsZUFydGlmYWN0ID0gKElNb2R1bGVBcnRpZmFjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QiKTsKLQkJCX0KLQkJCWlmIChtb2R1bGVBcnRpZmFjdCA9PSBudWxsICYmIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuaGFzQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLklTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCIpKSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3QgPSAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuSVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCX0qLwotCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3Q7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTW9kdWxlQXJ0aWZhY3QuY2xhc3MsIElMYXVuY2hhYmxlLmNsYXNzfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvQ2hhbmdlTGliRGlyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9DaGFuZ2VMaWJEaXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyNmZhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9DaGFuZ2VMaWJEaXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFN0ZWZhbiBEaW1vdiwgc3RlZmFuLmRpbW92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBDaGFuZ2VMaWJEaXJEaWFsb2cgZXh0ZW5kcyBJbnB1dERpYWxvZyB7Ci0JcHJpdmF0ZSBib29sZWFuIHdhcm5CbGFuazsKLQkKLSAgICBwdWJsaWMgQ2hhbmdlTGliRGlyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgaW5pdGlhbFZhbHVlLCBib29sZWFuIHdhcm5CbGFuaykgeyAKLSAgICAJc3VwZXIocGFyZW50U2hlbGwsIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkNIQU5HRV9MSUJfRElSX0hFQUQpLAotICAgIAkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19MSUJfRElSX1BST1BNUFQpLCBpbml0aWFsVmFsdWUsIG51bGwpOwotICAgIAl0aGlzLndhcm5CbGFuayA9IHdhcm5CbGFuazsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLSAgICAgICAgCVN0cmluZyByZXMgPSBnZXRUZXh0KCkuZ2V0VGV4dCgpLnRyaW0oKTsgCi0gICAgICAgIAlpZiAocmVzLmxlbmd0aCgpID09IDApIHsKLSAgICAJCQlpZiAod2FybkJsYW5rKQotICAgIAkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHRoaXMuZ2V0U2hlbGwoKSwgCi0gICAgCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CTEFOS19MSUJfRElSKSwgCi0gICAgCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CTEFOS19MSUJfRElSX0NPTkZJUk0pKSkgcmV0dXJuOwotICAgICAgICAJfSBlbHNlIHsKLSAgICAJCQlpZiAocmVzLnN0YXJ0c1dpdGgoIiIgKyBJUGF0aC5TRVBBUkFUT1IpKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCXJlcyA9IHJlcy5zdWJzdHJpbmcoMSk7CQotICAgIAkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcmVzLnNwbGl0KCIiICsgSVBhdGguU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCVBhdGggcCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotICAgIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQkJdmFsaWQgPSBwLmlzVmFsaWRTZWdtZW50KHNlZ21lbnRzW2ldKTsKLSAgICAJCQkJaWYgKCF2YWxpZCkKLSAgICAJCQkJCWJyZWFrOwotICAgIAkJCX0KLSAgICAJCQlpZiAoIXZhbGlkKSB7Ci0gICAgCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG51bGwsIAotICAgIAkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklOVkFMSURfUEFUSCksIAotICAgIAkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklOVkFMSURfUEFUSF9NU0cpKTsJCi0gICAgCQkJCXJldHVybjsKLSAgICAJCQl9CSAgICAgICAgCQkKLSAgICAgICAgCX0KLSAgICAgICAgfSAKLSAgICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gICAgfSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwMjUxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZUVBUkNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cywgTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIERlbGV0ZUVBUkRpYWxvZyBkaWFsb2c7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVBcHBQcm9qZWN0c0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZVJlZlByb2plY3RzQnRuOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmFkaW9Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnRuOwotCXByb3RlY3RlZCBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcHJvamVjdHNMaXN0OwotCXByb3RlY3RlZCBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1hcCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgd29ya2JlbmNoTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlRUFSQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRUFSQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIERlbGV0ZUVBUkRpYWxvZyBkaWFsb2csIGludCBzdHlsZSwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cykgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5kaWFsb2cgPSBkaWFsb2c7Ci0JCWluaXRSZWZlcmVuY2VkUHJvamVjdHMocmVmZXJlbmNlZFByb2plY3RzKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMgd2hpY2ggdGhlIHVzZXIgaGFzIGNob3NlbiB0byBhbHNvIGRlbGV0ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKGRlbGV0ZUFwcFByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFByb2plY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZWxlbWVudCA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJYm9vbGVhbiBpc1NlbGVjdGVkID0gKChCb29sZWFuKSBlbGVtZW50LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJaWYgKGlzU2VsZWN0ZWQpCi0JCQkJcmVzdWx0LmFkZChlbGVtZW50LmdldEtleSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRURlbGV0ZURpYWxvZyNjcmVhdGVEZWxldGVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRGVsZXRlT3B0aW9ucyBjcmVhdGVEZWxldGVPcHRpb25zKCkgewotCQlEZWxldGVPcHRpb25zIG9wdHMgPSBuZXcgRGVsZXRlT3B0aW9ucygpOwotCQlvcHRzLnNldElzRUFSRGVsZXRlKHRydWUpOwotCQlvcHRzLnNldERlbGV0ZVByb2plY3RzKHRydWUpOwotCQlvcHRzLnNldERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQkJb3B0cy5zZXREZWxldGVNb2R1bGVzKG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlcygpKTsKLQkJb3B0cy5zZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyhnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpKTsKLQkJcmV0dXJuIG9wdHM7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2VkUHJvamVjdHMoU2V0IHByb2plY3RzKSB7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2plY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlyZWZlcmVuY2VkUHJvamVjdHMucHV0KHByb2plY3QsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJc2V0TGF5b3V0KCk7Ci0JCWFkZFJhZGlvQ29tcG9zaXRlKCk7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUgPSBuZXcgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgdHJ1ZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvL3NldHVwIGRlZmF1bHRzCi0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExheW91dCgpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmFkaW9Db21wb3NpdGUoKSB7Ci0JCXJhZGlvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX0VBUl9QUk9KRUNUUyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRlbGV0ZVJlZlByb2plY3RzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4uc2V0VGV4dChERUxFVEVfUkVGRVJFTkNFRF9QUk9KRUNUUyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZGV0YWlsc0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJZGV0YWlsc0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQlkZXRhaWxzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVBcHBQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZUFwcFByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZVJlZlByb2plY3RzQnRuKQotCQkJZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGV0YWlsc0J0bikKLQkJCWRldGFpbHNCdG5TZWxlY3RlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUFwcFByb2plY3RzQnRuU2VsZWN0ZWQoKSB7Ci0JCWlmIChkZWxldGVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWYgKGxpc3RDcmVhdGVkKQotCQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZWZQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlUmVmUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWRldGFpbHNCdG4uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGRpYWxvZy5nZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlwcm9qZWN0c0xpc3QuZ2V0Q29udHJvbCgpLmRpc3Bvc2UoKTsKLQkJCWxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25MaXN0KCk7Ci0JCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0KLQkJUG9pbnQgbmV3U2l6ZSA9IGRpYWxvZy5nZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25MaXN0KCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJcHJvamVjdHNMaXN0ID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocmFkaW9Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlwcm9qZWN0c0xpc3Quc2V0TGFiZWxQcm92aWRlcihjcmVhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlwcm9qZWN0c0xpc3Quc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Lyp2aWV3ZXJzb3J0ZXIqL30pOwotCQlwcm9qZWN0c0xpc3QuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlTGlzdCgpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBwcm9qZWN0c0xpc3QuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiByZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXByb2plY3RzTGlzdC5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbGlzdENyZWF0ZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFByb2plY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCXByb2plY3RzTGlzdC5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJYm9vbGVhbiBjaGVja2VkID0gKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCXByb2plY3RzTGlzdC5zZXRDaGVja2VkKGVudHJ5LmdldEtleSgpLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNCdG5TZWxlY3RlZCgpIHsKLQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cy5wdXQoZXZlbnQuZ2V0RWxlbWVudCgpLCBuZXcgQm9vbGVhbihldmVudC5nZXRDaGVja2VkKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vZGlzcG9zZQotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY0MWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlRUFSRGlhbG9nIGV4dGVuZHMgSjJFRURlbGV0ZURpYWxvZyB7Ci0JcHJvdGVjdGVkIERlbGV0ZUVBUkNvbXBvc2l0ZSBkZWxldGVDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlRUFSRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqLwotCXB1YmxpYyBEZWxldGVFQVJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNldCByZWZlcmVuY2VkUHJvamVjdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIERFTEVURV9FQVJfT1BUSU9OUyk7Ci0JCXRoaXMucmVmZXJlbmNlZFByb2plY3RzID0gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2cjY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5ERUxFQVRFX0VBUl9ESUFMT0dfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQ29tcG9zaXRlID0gbmV3IERlbGV0ZUVBUkNvbXBvc2l0ZShwYXJlbnQsIHRoaXMsIFNXVC5OT05FLCByZWZlcmVuY2VkUHJvamVjdHMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlkZWxldGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGRlbGV0ZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVEZWxldGVEaWFsb2cjY3JlYXRlRGVsZXRlT3B0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpIHsKLQkJZGVsZXRlT3B0aW9ucyA9IGRlbGV0ZUNvbXBvc2l0ZS5jcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRhNDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMsIExpc3RlbmVyIHsKLQotCS8vCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUHJvamVjdHNDaGVja0JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBtb2R1bGVSZWZzQ29tcG9zaXRlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlhZGREZWxldGVQcm9qZWN0c0dyb3VwKCk7Ci0JCWFkZERlbGV0ZU1vZHVsZVJlZnNDb21wb3NpdGUoKTsKLQkJLy9zZXQgZGVmYXVsdCB2YWx1ZXMKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlUHJvamVjdHNHcm91cCgpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RTX09OTFkpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWxldGVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RfUkVGRVJFTkNFUyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZVByb2plY3RzKCkgewotCQkvLwkJcmV0dXJuIGRlbGV0ZVByb2plY3RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIHRoZSBwcm9qZWN0IHNob3VsZCBiZSBkZWxldGVkLCBzaW5jZSBkZWxldGUgd2FzIHRoZSBzZWxlY3RlZCBhY3Rpb24KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlQXBwUHJvamVjdHNCdG4pCi0JCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVSZWZQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjgwZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVEaWFsb2cgZXh0ZW5kcyBKMkVFRGVsZXRlRGlhbG9nIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBEZWxldGVNb2R1bGVDb21wb3NpdGUgZGVsZXRlQ29tcG9zaXRlOwotCi0JcHVibGljIERlbGV0ZU1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgREVMRVRFX01PRFVMRV9PUFRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLkRFTEVBVEVfTU9EVUxFX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVDb21wb3NpdGUgPSBuZXcgRGVsZXRlTW9kdWxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlkZWxldGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGRlbGV0ZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWxldGVPcHRpb25zKCkgewotCQlkZWxldGVPcHRpb25zID0gbmV3IERlbGV0ZU9wdGlvbnMoKTsKLQkJZGVsZXRlT3B0aW9ucy5zZXREZWxldGVQcm9qZWN0cyhkZWxldGVDb21wb3NpdGUuc2hvdWxkRGVsZXRlUHJvamVjdHMoKSk7Ci0JCWRlbGV0ZU9wdGlvbnMuc2V0RGVsZXRlTW9kdWxlcyhkZWxldGVDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlcygpKTsKLQkJZGVsZXRlT3B0aW9ucy5zZXREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoZGVsZXRlQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTMxODlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVNb2R1bGVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VBUkRlbGV0ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGJvb2xlYW4gaXNFQVJEZWxldGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuaXNFQVJEZWxldGUgPSBpc0VBUkRlbGV0ZTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJYWRkRGVsZXRlTW9kdWxlc0NoZWNrYm94KCk7Ci0JCWFkZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3goKSB7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRUZXh0KERFTEVURV9NT0RVTEVfREVQRU5ERU5DSUVTKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZU1vZHVsZXNDaGVja2JveCgpIHsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlTdHJpbmcgbGFiZWwgPSBpc0VBUkRlbGV0ZSA/IERFTEVURV9NT0RVTEVTX09USEVSIDogREVMRVRFX01PRFVMRVM7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveC5zZXRUZXh0KGxhYmVsKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBkZWxldGVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZU1vZHVsZXNDaGVja2JveCAmJiBkZWxldGVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgIWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKQotCQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDg0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0lEX09LID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fSURfQ0FOQ0VMID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBETEdfVFlQRV8xID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBETEdfVFlQRV8yID0gMjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET05UX1NIT1dfQUdBSU4gPSAiRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5ET05UX1NIT1dfQUdBSU4iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCAKLQkJCWludCBkbGdUeXBlKSB7Ci0JCQotCQlzdXBlcihwYXJlbnRTaGVsbCwgCi0JCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVQRU5ERU5DWV9DT05GTElDVF9USVRMRSksIAotCQkJCW51bGwsIAotCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKChkbGdUeXBlID09IERMR19UWVBFXzEpID8gCi0JCQkJCQlKMkVFVUlNZXNzYWdlcy5ERVBFTkRFTkNZX0NPTkZMSUNUX01TR18xIDoKLQkJCQkJCUoyRUVVSU1lc3NhZ2VzLkRFUEVOREVOQ1lfQ09ORkxJQ1RfTVNHXzIpCi0JCQkJCQkKLQkJCQksIE1lc3NhZ2VEaWFsb2cuV0FSTklORywKLQkJCQkKLQkJCQluZXcgU3RyaW5nW10geyBKMkVFVUlNZXNzYWdlcy5PS19CVVRUT04sIAotCQkJCQlKMkVFVUlNZXNzYWdlcy5DQU5DRUxfQlVUVE9OIH0sIAotCQkJCUJUTl9JRF9DQU5DRUwsCi0JCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRE9fTk9UX1NIT1dfV0FSTklOR19BR0FJTiksCi0JCQkJZmFsc2UpOwotCX0KLQkJCi0JcHVibGljIGludCBvcGVuKCkgewotCQlpZiAoZ2V0UHJlZlN0b3JlKCkuZ2V0Qm9vbGVhbihET05UX1NIT1dfQUdBSU4pKQotCQkJcmV0dXJuIEJUTl9JRF9PSzsKLQkJc2V0VG9nZ2xlU3RhdGUoZ2V0UHJlZlN0b3JlKCkuZ2V0Qm9vbGVhbihET05UX1NIT1dfQUdBSU4pKTsKLQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWdldFByZWZTdG9yZSgpLnNldFZhbHVlKERPTlRfU0hPV19BR0FJTiwgZ2V0VG9nZ2xlU3RhdGUoKSk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmU3RvcmUoKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0ZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDJmMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZkV4dGVuc2lvbnM7Ci0JLyoqCi0JICogRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgU2hlbGwKLQkgKiBAcGFyZW50IGV4dGVuc2lvbnMgU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQl0aGlzKHBhcmVudCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9ucywgZmFsc2UpOwotCX0KLQkvKioKLQkgKiBGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBTaGVsbAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZSkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJc2V0VGl0bGUodGl0bGUpOwotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlX1NlbGVjdGlvbl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCW1lc3NhZ2UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0X2FfZmlsZV9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJc2V0QWxsb3dNdWx0aXBsZSh0cnVlKTsKLQkJc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJYWRkRmlsdGVyKG5ldyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCQlzZXRWYWxpZGF0b3IobmV3IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihuZXcgQ2xhc3NbXXtJRmlsZS5jbGFzc30sIGFsbG93TXVsdGlwbGUpKTsKLQotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZFeHRlbnNpb25zOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJZkV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHAoU3RyaW5nIGhlbHBDb2RlKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5nZXRQYXJlbnRTaGVsbCgpLCBoZWxwQ29kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5N2YyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVEZWxldGVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBEZWxldGVPcHRpb25zIGRlbGV0ZU9wdGlvbnM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRURlbGV0ZURpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICovCi0JcHVibGljIEoyRUVEZWxldGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG51bGwsIERFTEVURV9ESUFMT0dfTUVTU0FHRSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDApOwotCX0KLQotCXB1YmxpYyBEZWxldGVPcHRpb25zIGdldERlbGV0ZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBkZWxldGVPcHRpb25zOwotCX0KLQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpOwotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IDApCi0JCQljcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZVVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTc0NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZVVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQlTdHJpbmcgREVMRVRFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV8xIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9zZWxlY3RlZF9wcm9qZWN0KHMpXzIiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFU19PVEhFUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFX0RFUEVOREVOQ0lFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0KHMpXzUiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX01vZHVsZV9PcHRpb25zXzYiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRUFSX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX05PVF9DT01QTEVURUQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9FUlJPUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfZXJyb3JfOSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9ESUFMT0dfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXaGF0X3dvdWxkX3lvdV9saWtlX3RvX2RlbGV0ZV9fMTAiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRUFSX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Qocylfb25seV8xMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9SRUZFUkVOQ0VEX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFsc29fZGVsZXRlX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEyIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1BST0pFQ1RTX09OTFkgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX3NlbGVjdGVkX3Byb2plY3Qocylfb25seV8xMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9QUk9KRUNUX1JFRkVSRU5DRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQWxzb19kZWxldGVfcmVmZXJlbmNlc190b19zZWxlY3RlZF9wcm9qZWN0KHMpXzE0Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0ggPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0hfVUlfIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95U3RhdHVzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95U3RhdHVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjliYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVN0YXR1c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEBhdXRob3Igc2FnYXJ3YWwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRGVwbG95U3RhdHVzRGlhbG9nIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGltcGxlbWVudHMgSjJFRURlcGxveVVJQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIFJlc2VydmUgcm9vbSBmb3IgdGhpcyBtYW55IGxpc3QgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCXB1YmxpYyBDb2xvciBERVNDX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOwotCS8qKgotCSAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIFNXVCBsaXN0IGNvbnRyb2wgdGhhdCBkaXNwbGF5cyB0aGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwcml2YXRlIFRleHQgdGV4dDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciBkZXRhaWxzIHZpZXdlciBpcyBjdXJyZW50bHkgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdGV4dENyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExpc3Qgb2YgdGhlIG1haW4gZXJyb3Igb2JqZWN0J3MgZGV0YWlsZWQgZXJyb3JzIChlbGVtZW50IHR5cGU6Ci0JICogPGNvZGU+SjJFRU1pZ3JhdGlvblN0YXR1czwvY29kZT4pLgotCSAqLwotCXByaXZhdGUgamF2YS51dGlsLkxpc3Qgc3RhdHVzTGlzdDsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgSjJFRURlcGxveVN0YXR1c0RpYWxvZyhTaGVsbCBwYXJlbnQsIExpc3Qgc3RhdHVzKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkJPUkRFUiB8IFNXVC5USVRMRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOyAvLyBubwotCQlzdGF0dXNMaXN0ID0gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBqdXN0IGFmdGVyIHRoZSBvcGVyYXRpb24gaXMgcnVuLiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkZWNyZW1lbnQgdGhlIG5lc3RpbmcgZGVwdGgsCi0JICogYW5kIGNsb3NlIHRoZSBkaWFsb2cuCi0JICogCi0JICogQHBsYW5uZWRmb3IgMy4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRSdW4oKSB7Ci0JCWRlY3JlbWVudE5lc3RpbmdEZXB0aCgpOwotCQljbGVhckN1cnNvcnMoKTsKLQkJY2FuY2VsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWRldGFpbHNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY29tcHV0ZVNldmVyaXR5KCk7Ci0JCXNldERlcGxveW1lbnRTdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlcGxveW1lbnRTdGF0dXMoKSB7Ci0JCXNldE1lc3NhZ2VPckRlZmF1bHQoKTsKLQkJaW1hZ2VMYWJlbC5zZXRJbWFnZShnZXRJbWFnZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNZXNzYWdlT3JEZWZhdWx0KCkgewotCQlzd2l0Y2ggKGdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJbWVzc2FnZSA9IERFUExPWV9FUlJPUlNfUkVQT1JUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCW1lc3NhZ2UgPSBERVBMT1lfV0FSTklOR1NfUkVQT1JUOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJbWVzc2FnZSA9IERFUExPWV9TVUNDRVNTX1JFUE9SVDsKLQkJCQlicmVhazsKLQkJfQotCQlzZXRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2FuY2VsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ2FuY2VsQnV0dG9uKHBhcmVudCk7Ci0JCWNhbmNlbC5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjYW5jZWwgYnV0dG9uCi0JCWNyZWF0ZUNhbmNlbEJ1dHRvbihwYXJlbnQpOwotCQlkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELCBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotCQlkZXRhaWxzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLiBIYW5kbGVzIHRoZSBwcmVzc2luZyBvZiB0aGUgT2sgb3IgRGV0YWlscyBidXR0b24gaW4KLQkgKiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlIHRoaXMgZGlhbG9nLiBJZiB0aGUgRGV0YWlscyBidXR0b24gd2FzCi0JICogcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZyBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBvbmx5IGJlIHZpc2libGUgaWYgdGhlIGVycm9yIGJlaW5nIGRpc3BsYXllZCBzcGVjaWZpZXMgY2hpbGQgZGV0YWlscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkgewotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKSB7IC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dTdGF0dXMoKTsKLQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0JICovCi0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJc3dpdGNoIChnZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCXJldHVybiB0aGlzLmdldEVycm9ySW1hZ2UoKTsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gdGhpcy5nZXRXYXJuaW5nSW1hZ2UoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiB0aGlzLmdldEluZm9JbWFnZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlRHJvcERvd25UZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlVGV4dCh0ZXh0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogTElTVF9JVEVNX0NPVU5UOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRleHRDcmVhdGVkID0gdHJ1ZTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ1N0YXR1cygpIHsKLQkJSXRlcmF0b3IgYWVudW0gPSBzdGF0dXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJU3RhdHVzIGNoaWxkU3RhdHVzID0gKElTdGF0dXMpIGFlbnVtLm5leHQoKTsKLQkJCXBvcHVsYXRlVGV4dChzYiwgY2hpbGRTdGF0dXMsIDApOwotCQl9Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dJbmZvKHNiLnRvU3RyaW5nKCkpOwotCi0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcyB0aGUgY2hpbGQgc3RhdGkgb2YgdGhlCi0JICogc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZSBmb3JtYXQgZm9yIGVhY2ggZW50cnkgaXMgc3RhdHVzX3BhdGggOgotCSAqIHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncyBwYXRoIHdhcyBudWxsIHRoZW4gaXQgKGFuZCB0aGUgY29sb24pIGFyZSBvbWl0dGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVRleHQoVGV4dCBzb21lVGV4dCkgewotCQlJdGVyYXRvciBhZW51bSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJU3RhdHVzIGNoaWxkU3RhdHVzID0gKElTdGF0dXMpIGFlbnVtLm5leHQoKTsKLQkJCS8vc2IuYXBwZW5kKCJEZXBsb3ltZW50IHJlc3VsdHMgZm9yICIgKyBjaGlsZFN0YXR1cy4pOwotCQkJcG9wdWxhdGVUZXh0KHNiLCBjaGlsZFN0YXR1cywgMCk7Ci0JCX0KLQkJc29tZVRleHQuc2V0VGV4dChzYi50b1N0cmluZygpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVRleHQoU3RyaW5nQnVmZmVyIHNiLCBJU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLmFwcGVuZChnZXRNZXNzYWdlRm9yRGlzcGxheShzdGF0dXMpKTsKLQkJc2IuYXBwZW5kKCdcbicpOwotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcG9wdWxhdGVUZXh0KHNiLCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWlmICh0ZXh0Q3JlYXRlZCkgewotCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQl0ZXh0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBjcmVhdGVEcm9wRG93blRleHQoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQoREVTQ19DT0xPUik7Ci0JCX0KLQotCQlQb2ludCBuZXdTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUZvckRpc3BsYXkoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1lc3NhZ2VTdHJpbmcgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlyZXR1cm4gbWVzc2FnZVN0cmluZzsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2V2ZXJpdHlUZXh0KElTdGF0dXMgc3RhdHVzKSB7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJcmV0dXJuIEVSUk9SX1RFWFQ7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJcmV0dXJuIFdBUk5JTkdfVEVYVDsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQlyZXR1cm4gSU5GT19URVhUOwotCQkJY2FzZSBJU3RhdHVzLk9LIDoKLQkJCQlyZXR1cm4gT0tfVEVYVDsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNldmVyaXR5KGludCBzZXYpIHsKLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IpCi0JCQlyZXR1cm47Ci0JCWlmIChzZXYgPT0gSVN0YXR1cy5FUlJPUikKLQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJZWxzZSBpZiAoc2V2ID09IElTdGF0dXMuV0FSTklORykgewotCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVTZXZlcml0eSgpIHsKLQkJSXRlcmF0b3IgYWVudW0gPSBzdGF0dXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgYWVudW0ubmV4dCgpOwotCQkJc2V0U2V2ZXJpdHkoY2hpbGRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7Ci0JCQlpZiAoZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCXJldHVybiBnZXRTZXZlcml0eSgpOwotCQkJY29tcHV0ZVNldmVyaXR5KGNoaWxkU3RhdHVzKTsKLQkJCWlmIChnZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJZ2V0U2V2ZXJpdHkoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U2V2ZXJpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZVNldmVyaXR5KElTdGF0dXMgc3RhdHVzKSB7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljb21wdXRlU2V2ZXJpdHkoY2hpbGRyZW5baV0pOwotCQkJaWYgKGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoREVQTE9ZX0RJQUxPR19USVRMRSk7Ci0JCS8vc2hlbGwuc2V0U2l6ZSg2MDAsMjAwKTsgZG9uJ3Qgc2V0IHRoZSBzaXplIHRoaXMgYnJlYWtzIHRoZSBkaWFsb2cgZm9yIGxpbnV4LgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCXNldE1lc3NhZ2UoREVQTE9ZTUVOVF9JTl9QUk9HUkVTUyk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBsYWJlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZVN0cmluZykgewotCQkvL211c3Qgbm90IHNldCBudWxsIHRleHQgaW4gYSBsYWJlbAotCQltZXNzYWdlID0gbWVzc2FnZVN0cmluZyA9PSBudWxsID8gIiIgOiBtZXNzYWdlU3RyaW5nOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXNzYWdlTGFiZWwgPT0gbnVsbCB8fCBtZXNzYWdlTGFiZWwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZXBsb3lVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTM1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRURlcGxveVVJQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9URVhUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9FUlJPUl9URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX1dBUk5JTkdfVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19URVhUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9JTkZPX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9LX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX09LX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfSU5fUFJPR1JFU1MgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZTUVOVF9JTl9QUk9HUkVTUyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX1NVQ0NFU1NfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9TVUNDRVNTX1JFUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX1dBUk5JTkdTX1JFUE9SVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfV0FSTklOR1NfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfRVJST1JTX1JFUE9SVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRVJST1JTX1JFUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX0RJQUxPR19USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2JmMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRVJlbmFtZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFUmVuYW1lRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgUmVuYW1lT3B0aW9ucyByZW5hbWVPcHRpb25zOwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudE5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVSZW5hbWVEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqLwotCXB1YmxpYyBKMkVFUmVuYW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbnVsbCwgUkVOQU1FX0RJQUxPR19NRVNTQUdFLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCWN1cnJlbnROYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgUmVuYW1lT3B0aW9ucyBnZXRSZW5hbWVPcHRpb25zKCkgewotCQlyZXR1cm4gcmVuYW1lT3B0aW9uczsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVJlbmFtZU9wdGlvbnMoKTsKLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSAwKQotCQkJY3JlYXRlUmVuYW1lT3B0aW9ucygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRVJlbmFtZVVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNTc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBKMkVFUmVuYW1lVUlDb25zdGFudHMgewotCVN0cmluZyBSRU5BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lXzEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX3NlbGVjdGVkX3Byb2plY3RfMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9NT0RVTEVTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9tb2R1bGVfaW5fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFU19PVEhFUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfbW9kdWxlX2luX2FsbF9vdGhlcl9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc180Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRV9ERVBFTkRFTkNJRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX21vZHVsZV9kZXBlbmRlbmNpZXNfcmVmZXJlbmNpbmdfc2VsZWN0ZWRfcHJvamVjdF81Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRV9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9Nb2R1bGVfT3B0aW9uc182Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX0VBUl9PUFRJT05TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9OT1RfQ09NUExFVEVEID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9jb3VsZF9ub3RfYmVfY29tcGxldGVkXzgiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRVJST1IgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX2Vycm9yXzkiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRElBTE9HX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV2hhdF93b3VsZF95b3VfbGlrZV90b19yZW5hbWVfdGhpc190b19fMTAiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfQ09OVEVYVF9ST09UID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbnRleHRfUm9vdF9fMTEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRUFSX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Rfb25seV8xMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9SRUZFUkVOQ0VEX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFsc29fcmVuYW1lX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEzIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwOGIxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDExOjI4OjI0IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGxpc3RJdGVtczsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JLyoqCi0JICogRUpCU2VsZWN0aXZlSW1wb3J0RGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBMaXN0TWVzc2FnZURpYWxvZyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsIGphdmEubGFuZy5TdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0TWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4LCBTdHJpbmdbXSBuYW1lcykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlsaXN0SXRlbXMgPSBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhbiBhcmVhIG9mIHRoZSBkaWFsb2cgd2hpY2ggYXBwZWFycyBiZWxvdyB0aGUgbWVzc2FnZSBhbmQKLQkgKiBhYm92ZSB0aGUgYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gU3ViY2xhc3NlcwotCSAqIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBjdXN0b20gYXJlYQotCSAqIEByZXR1cm4gdGhlIGN1c3RvbSBhcmVhIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAobGlzdEl0ZW1zICE9IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxpc3Quc2V0SXRlbXMobGlzdEl0ZW1zKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBjb25maXJtIChPSy9DYW5jZWwpIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5Db25maXJtKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBPSwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgZXJyb3IgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgRVJST1IsIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBvayBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkluZm9ybWF0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBJTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7Ci0JCS8vIG9rIGlzIHRoZSBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBZZXMvTm8gcXVlc3Rpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBPSyBidXR0b24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIHdhcm5pbmcgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5XYXJuaW5nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBXQVJOSU5HLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRlM2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lRUFSQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gcmVuYW1lUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdG47Ci0JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwcm9qZWN0c0xpc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgV29ya2JlbmNoTGFiZWxQcm92aWRlciB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVFQVJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTZXQgcmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpbml0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZWZlcmVuY2VkIHByb2plY3RzIHdoaWNoIHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gYWxzbyByZW5hbWUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZW5hbWVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRQcm9qZWN0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVsZW1lbnQgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNTZWxlY3RlZCA9ICgoQm9vbGVhbikgZWxlbWVudC5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCWlmIChpc1NlbGVjdGVkKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudC5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVSZW5hbWVEaWFsb2cjY3JlYXRlUmVuYW1lT3B0aW9ucygpCi0JICovCi0JcHVibGljIFJlbmFtZU9wdGlvbnMgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJUmVuYW1lT3B0aW9ucyBvcHRzID0gbmV3IFJlbmFtZU9wdGlvbnMoKTsKLQkJb3B0cy5zZXRJc0VBUlJlbmFtZSh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVQcm9qZWN0cyh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCW9wdHMuc2V0UmVuYW1lTW9kdWxlcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCW9wdHMuc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNlZFByb2plY3RzKFNldCBwcm9qZWN0cykgewotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChwcm9qZWN0LCBCb29sZWFuLlRSVUUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCXNldExheW91dCgpOwotCQlhZGRSYWRpb0NvbXBvc2l0ZSgpOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGlvQ29tcG9zaXRlKCkgewotCQlyYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5zZXRUZXh0KFJFTkFNRV9FQVJfUFJPSkVDVFMpOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZW5hbWVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCXJlbmFtZVJlZlByb2plY3RzQnRuLnNldFRleHQoUkVOQU1FX1JFRkVSRU5DRURfUFJPSkVDVFMpOwotCQlyZW5hbWVSZWZQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcmVuYW1lUmVmUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWRldGFpbHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCWRldGFpbHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJZGV0YWlsc0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcmVuYW1lQXBwUHJvamVjdHNCdG4pCi0JCQlyZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZW5hbWVSZWZQcm9qZWN0c0J0bikKLQkJCXJlbmFtZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRldGFpbHNCdG4pCi0JCQlkZXRhaWxzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAocmVuYW1lQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWlmIChsaXN0Q3JlYXRlZCkKLQkJCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKHJlbmFtZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJcHJvamVjdHNMaXN0LmdldENvbnRyb2woKS5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duTGlzdCgpOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duTGlzdCgpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXByb2plY3RzTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHJhZGlvQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJcHJvamVjdHNMaXN0LnNldExhYmVsUHJvdmlkZXIoY3JlYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJcHJvamVjdHNMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgey8qdmlld2Vyc29ydGVyKi99KTsKLQkJcHJvamVjdHNMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZUxpc3QoKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHByb2plY3RzTGlzdC5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIHJlZmVyZW5jZWRQcm9qZWN0cy5zaXplKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcHJvamVjdHNMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaXN0KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJcHJvamVjdHNMaXN0LmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSAoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWQoZW50cnkuZ2V0S2V5KCksIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc0J0blNlbGVjdGVkKCkgewotCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChldmVudC5nZXRFbGVtZW50KCksIG5ldyBCb29sZWFuKGV2ZW50LmdldENoZWNrZWQoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9kaXNwb3NlCi0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MGUwNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFQVJEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIHsKLQlwcm90ZWN0ZWQgUmVuYW1lRUFSQ29tcG9zaXRlIHJlbmFtZUNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICovCi0JcHVibGljIFJlbmFtZUVBUkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIFJFTkFNRV9FQVJfT1BUSU9OUywgbmFtZSk7Ci0JCXRoaXMucmVmZXJlbmNlZFByb2plY3RzID0gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2cjY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5SRU5BTUVfRUFSX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlyZW5hbWVDb21wb3NpdGUgPSBuZXcgUmVuYW1lRUFSQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCS8vCQlyZW5hbWVDb21wb3NpdGUuc2V0TmV3TmFtZShjdXJyZW50TmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gcmVuYW1lQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRVJlbmFtZURpYWxvZyNjcmVhdGVSZW5hbWVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZW5hbWVPcHRpb25zKCkgewotCQlyZW5hbWVPcHRpb25zID0gcmVuYW1lQ29tcG9zaXRlLmNyZWF0ZVJlbmFtZU9wdGlvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjNmY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZU1vZHVsZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JLy8gcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVQcm9qZWN0c0NoZWNrQm94OwotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFRleHQgbmV3TmFtZVRleHQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IG5ld0NvbnRleHRSb290VGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIG5ld0NvbnRleHRSb290TGFiZWwgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIHN0YXR1c01lc3NhZ2VMYWJlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJYWRkUmVuYW1lUHJvamVjdHNHcm91cCgpOwotCQlhZGRTZXBhcmF0b3IoKTsKLQkJYWRkUmVuYW1lTW9kdWxlUmVmc0NvbXBvc2l0ZSgpOwotCQkvL0FkZCBpbiBhIGxhYmVsIGZvciBzdGF0dXMgbWVzc2FnZXMgaWYgcmVxdWlyZWQKLQkJc3RhdHVzTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb250KHRoaXMuZ2V0Rm9udCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVQcm9qZWN0c0dyb3VwKCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluZXdOYW1lVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQluZXdOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQluZXdDb250ZXh0Um9vdExhYmVsLnNldFRleHQoUkVOQU1FX0NPTlRFWFRfUk9PVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290VGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5ld0NvbnRleHRSb290VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qCi0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3guc2V0VGV4dChSRU5BTUVfUFJPSkVDVFMpOwotCQkgKiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsgZGF0YSA9IG5ldwotCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOyBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkgKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVQcm9qZWN0cygpIHsKLQkJLy8gIHJldHVybiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkvLyBhbHdheXMgcmVuYW1lIHRoZSBwcm9qZWN0Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuZXdOYW1lVGV4dCAmJiBPS0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0IG5ld1Byb2plY3QgPSByb290LmdldFByb2plY3QobmV3TmFtZSk7Ci0JCQlpZiAobmV3UHJvamVjdC5leGlzdHMoKSkgewotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEVycm9yVGV4dChzdGF0dXNNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpKSk7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSB7bmV3TmFtZX07Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3RfYWxyZWFkeV9leGlzdHMuIiksIG5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkKLQotCXsKLQkJcmV0dXJuIG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCW9sZE5hbWUgPSBuZXdOYW1lOwotCQluZXdOYW1lVGV4dC5zZXRUZXh0KG5ld05hbWUpOwotCQluZXdOYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJbmV3TmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIG5ld0NvbnRleHRSb290VGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3Q29udGV4dFJvb3QoU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCWlmIChuZXdDb250ZXh0Um9vdCAhPSBudWxsICYmIG5ld0NvbnRleHRSb290Lmxlbmd0aCgpID4gMSkgewotCQkJbmV3Q29udGV4dFJvb3RUZXh0LnNldFRleHQobmV3Q29udGV4dFJvb3QpOwotCQl9IGVsc2UgewotCQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW5ld0NvbnRleHRSb290VGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE9LQnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBPS0J1dHRvbgotCSAqICAgICAgICAgICAgVGhlIE9LQnV0dG9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9LQnV0dG9uKEJ1dHRvbiBvS0J1dHRvbikgewotCQlPS0J1dHRvbiA9IG9LQnV0dG9uOwotCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlYTgxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVNb2R1bGVEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVDb21wb3NpdGUgcmVuYW1lQ29tcG9zaXRlOwotCXByb3RlY3RlZCBTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCi0JcHVibGljIFJlbmFtZU1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvbGRDb250ZXh0Um9vdCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgUkVOQU1FX01PRFVMRV9PUFRJT05TLCBuYW1lKTsKLQkJY29udGV4dFJvb3QgPSBvbGRDb250ZXh0Um9vdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLlJFTkFNRV9NT0RVTEVfRElBTE9HXzEpOyAvLyROT04tTkxTLTEkCi0JCXJlbmFtZUNvbXBvc2l0ZSA9IG5ldyBSZW5hbWVNb2R1bGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdOYW1lKGN1cnJlbnROYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcmVuYW1lQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdDb250ZXh0Um9vdChjb250ZXh0Um9vdCk7Ci0JCXJldHVybiByZW5hbWVDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJcmVuYW1lT3B0aW9ucyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lUHJvamVjdHMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZVByb2plY3RzKCkpOwotCQlyZW5hbWVPcHRpb25zLnNldFJlbmFtZU1vZHVsZXMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKHJlbmFtZUNvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0TmV3TmFtZShyZW5hbWVDb21wb3NpdGUuZ2V0TmV3TmFtZSgpKTsKLQkJcmVuYW1lT3B0aW9ucy5zZXROZXdDb250ZXh0Um9vdChyZW5hbWVDb21wb3NpdGUuZ2V0TmV3Q29udGV4dFJvb3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJT0tCdXR0b24gPSBnZXRCdXR0b24oMCk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRPS0J1dHRvbihPS0J1dHRvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE0YWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVNb2R1bGVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VBUlJlbmFtZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGJvb2xlYW4gaXNFQVJSZW5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuaXNFQVJSZW5hbWUgPSBpc0VBUlJlbmFtZTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWFkZFJlbmFtZU1vZHVsZXNDaGVja2JveCgpOwotCQlhZGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCkgewotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRUZXh0KFJFTkFNRV9NT0RVTEVfREVQRU5ERU5DSUVTKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZU1vZHVsZXNDaGVja2JveCgpIHsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlTdHJpbmcgbGFiZWwgPSBpc0VBUlJlbmFtZSA/IFJFTkFNRV9NT0RVTEVTX09USEVSIDogUkVOQU1FX01PRFVMRVM7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5zZXRUZXh0KGxhYmVsKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIHJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZXMoKSB7Ci0JCXJldHVybiByZW5hbWVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHJlbmFtZU1vZHVsZXNDaGVja2JveCAmJiByZW5hbWVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgIXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKQotCQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1J1bnRpbWVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1J1bnRpbWVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5YjkyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SdW50aW1lU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlndXJlZE1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICovCi0JcHVibGljIFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCUltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLAotCQkJU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwKLQkJCQlkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5jb25maWd1cmVkTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUlVOVElNRV9DT05GSUdVUkVEIiksIG5ldyBTdHJpbmcgW117cHJvamVjdC5nZXROYW1lKCl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy9Db21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIDApOwotCQljcmVhdGVIeXBlckxpbmsocGFyZW50KTsKLQkJcmV0dXJuIHBhcmVudDsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSHlwZXJMaW5rKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSHlwZXJsaW5rIGxpbmsgPSBuZXcgSHlwZXJsaW5rKHBhcmVudCxTV1QuTm9uZSk7Ci0JCUdyaWREYXRhIGxheW91dCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShsYXlvdXQpOwotCQlsaW5rLnNldFVuZGVybGluZWQodHJ1ZSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHBhcmVudC5nZXREaXNwbGF5KCksbmV3IFJHQigwLDAsMjU1KSApOwotCQlsaW5rLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlsaW5rLnNldFRleHQoIkNvbmZpZ3VyZSBUYXJnZXQgUnVudGltZS4uLiIpOwotCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX05PX0xJTksgPSAiUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZS5ub2xpbmsiOyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCVN0cmluZyBpZCA9IGdldFByZWZlcmVuY2VQYWdlSUQoKTsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBwcm9qZWN0LCBpZCwgbmV3IFN0cmluZ1tde2lkfSwgREFUQV9OT19MSU5LKS5vcGVuKCk7IC8vCi0JCQkJLy8oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXXtpZH0sIERBVEFfTk9fTElOSykub3BlbigpOwotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5SdW50aW1lc1Byb3BlcnR5UGFnZSI7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZGdldHMoKSB7Ci0JCWlmIChnZXRUYXJnZXRSdW50aW1lKCkgIT0gbnVsbCkgewotCQkgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KGNvbmZpZ3VyZWRNZXNzYWdlKTsKLQkJICBpbWFnZUxhYmVsLnNldEltYWdlKHRoaXMuZ2V0SW5mb0ltYWdlKCkpOwotCQl9IGVsc2UgewotCQkgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkgIGltYWdlTGFiZWwuc2V0SW1hZ2UoZ2V0RXJyb3JJbWFnZSgpKTsKLQkJfQotCQkJCQotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWUgZ2V0VGFyZ2V0UnVudGltZSgpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTZXJ2ZXJSdW50aW1lKHByb2plY3QpOwotCQkJcmV0dXJuIHJ1bnRpbWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R3b0FycmF5UXVpY2tTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R3b0FycmF5UXVpY2tTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkNjkwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9Ud29BcnJheVF1aWNrU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFF1aWNrIHNvcnQgdG8gc29ydCBrZXktdmFsdWUgcGFpcnMuIFRoZSBrZXlzIGFuZCBhcnJheXMgYXJlIHNwZWNpZmllZCBpbgotICogc2VwYXJhdGUgYXJyYXlzLgotICogCi0gKiBAcGxhbm5lZGZvciAyLjAKLSAqLwotcHVibGljIGNsYXNzIFR3b0FycmF5UXVpY2tTb3J0ZXIgewotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb21wYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RyaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUNhc2U7Ci0KLQkJU3RyaW5nQ29tcGFyYXRvcihib29sZWFuIGlnbm9yZUNhc2UpIHsKLQkJCWZJZ25vcmVDYXNlID0gaWdub3JlQ2FzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQlyZXR1cm4gZklnbm9yZUNhc2UgPyAoKFN0cmluZykgbGVmdCkuY29tcGFyZVRvSWdub3JlQ2FzZSgoU3RyaW5nKSByaWdodCkgOiAoKFN0cmluZykgbGVmdCkuY29tcGFyZVRvKChTdHJpbmcpIHJpZ2h0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzb3J0ZXIgd2l0aCBkZWZhdWx0IHN0cmluZyBjb21wYXJhdG9yLiBUaGUga2V5cyBhcmUgYXNzdW1lZCB0bwotCSAqIGJlIHN0cmluZ3MuCi0JICogCi0JICogQHBhcmFtIGlnbm9yZUNhc2UKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHNvcnRpbmcgaXMgY2FzZSBzZW5zaXRpdmUgb3Igbm90LgotCSAqLwotCXB1YmxpYyBUd29BcnJheVF1aWNrU29ydGVyKGJvb2xlYW4gaWdub3JlQ2FzZSkgewotCQlmQ29tcGFyYXRvciA9IG5ldyBTdHJpbmdDb21wYXJhdG9yKGlnbm9yZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzb3J0ZXIgd2l0aCBhIGNvbXBhcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbXBhcmF0b3IKLQkgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIG9yZGVyIHRoZSBlbGVtZW50cy4gVGhlIGNvbXBhcmF0b3IgbXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUd29BcnJheVF1aWNrU29ydGVyKENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotCQlmQ29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogU29ydHMga2V5cyBhbmQgdmFsdWVzIGluIHBhcmFsbGVsLgotCSAqIAotCSAqIEBwYXJhbSBrZXlzCi0JICogICAgICAgICAgICB0aGUga2V5cyB0byB1c2UgZm9yIHNvcnRpbmcuCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleXMuCi0JICovCi0JcHVibGljIHZvaWQgc29ydChPYmplY3RbXSBrZXlzLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKChrZXlzID09IG51bGwpIHx8ICh2YWx1ZXMgPT0gbnVsbCkpIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJFaXRoZXIga2V5cyBvciB2YWx1ZXMgaW4gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoa2V5cy5sZW5ndGggPD0gMSkKLQkJCXJldHVybjsKLQotCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCAwLCBrZXlzLmxlbmd0aCAtIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNvcnQoT2JqZWN0W10ga2V5cywgT2JqZWN0W10gdmFsdWVzLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7Ci0KLQkJT2JqZWN0IG1pZCA9IGtleXNbKGxlZnQgKyByaWdodCkgLyAyXTsKLQkJZG8gewotCQkJd2hpbGUgKGZDb21wYXJhdG9yLmNvbXBhcmUoa2V5c1tsZWZ0XSwgbWlkKSA8IDApCi0JCQkJbGVmdCsrOwotCi0JCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShtaWQsIGtleXNbcmlnaHRdKSA8IDApCi0JCQkJcmlnaHQtLTsKLQotCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCQlzd2FwKGtleXMsIGxlZnQsIHJpZ2h0KTsKLQkJCQlzd2FwKHZhbHVlcywgbGVmdCwgcmlnaHQpOwotCQkJCWxlZnQrKzsKLQkJCQlyaWdodC0tOwotCQkJfQotCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQotCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIHZhbHVlcywgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOwotCi0JCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpCi0JCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7Ci0JfQotCi0JLyoKLQkgKiBTd2FwcyB4W2FdIHdpdGggeFtiXS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHN3YXAoT2JqZWN0IHhbXSwgaW50IGEsIGludCBiKSB7Ci0JCU9iamVjdCB0ID0geFthXTsKLQkJeFthXSA9IHhbYl07Ci0JCXhbYl0gPSB0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZUphdmFTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZUphdmFTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQzMGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVKYXZhU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdhcyBkZXJpdmVkIGZyb20gSmF2YVNlYXJjaFNjb3BlIGFzIHRoYXQgY2xhc3MgZGlkIG5vdCBoYXZlIGEKLSAqIHByb3Zpc2lvbiB0byBleGNsdWRlIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgYXJlIG5vdCBleHBvcnRlZCBBIEphdmEtc3BlY2lmaWMKLSAqIHNjb3BlIGZvciBzZWFyY2hpbmcgcmVsYXRpdmUgdG8gb25lIG9yIG1vcmUgamF2YSBlbGVtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVKYXZhU2VhcmNoU2NvcGUgaW1wbGVtZW50cyBJSmF2YVNlYXJjaFNjb3BlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSA9IHRydWU7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBlbGVtZW50czsKLQotCS8qCi0JICogVGhlIHBhdGhzIG9mIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBzZWFyY2ggc2NvcGUgKG9yIHRoZSBjbGFzc3BhdGgKLQkgKiBlbnRyaWVzJyBwYXRocyBpZiB0aGUgcmVzb3VyY2VzIGFyZSBwcm9qZWN0cykKLQkgKi8KLQlwcml2YXRlIElQYXRoW10gcGF0aHM7Ci0JcHJpdmF0ZSBib29sZWFuW10gcGF0aFdpdGhTdWJGb2xkZXJzOwotCXByaXZhdGUgaW50IHBhdGhzQ291bnQ7Ci0KLQlwcml2YXRlIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzOwotCi0JcHVibGljIFR5cGVKYXZhU2VhcmNoU2NvcGUoKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIGRpc2FibGVkIGZvciBub3cgYXMgdGhpcyBjb3VsZCBiZSBleHBlbnNpdmUKLQkJLy8gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtZW1iZXJTY29wZSh0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKElQYXRoIHBhdGgpIHsKLQkJaW50IGxlbmd0aCA9IHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2ldLmVxdWFscyhwYXRoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycywgMCwgdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMgPSBuZXcgSVBhdGhbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7Ci0JCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2xlbmd0aF0gPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBhZGRQcm9qZWN0LiBUaGlzIG1ldGhvZCBhZGRzIGFsbCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgcHJvamVjdCB0byB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEBwYXJhbSBpbmNsdWRlc1ByZXJlcVByb2plY3RzCi0JICogQHBhcmFtIHZpc2l0ZWRQcm9qZWN0cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvamVjdChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gaW5jbHVkZXNQcmVyZXFQcm9qZWN0cywgSGFzaFNldCB2aXNpdGVkUHJvamVjdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkgfHwgIXZpc2l0ZWRQcm9qZWN0cy5hZGQocHJvamVjdCkpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSBqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQl0aGlzLmFkZChwYXRoLCB0cnVlKTsKLQkJCQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocGF0aCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJaWYgKGluY2x1ZGVzUHJlcmVxUHJvamVjdHMpIHsKLQkJCQkJCXRoaXMuYWRkKG1vZGVsLmdldEphdmFQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSwgdHJ1ZSwgdmlzaXRlZFByb2plY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJdGhpcy5hZGQoZW50cnkuZ2V0UGF0aCgpLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYWRkLiBUaGlzIG1ldGhvZCBmaWx0ZXJzIG91dCBhbGwgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIG9mIHRoZQotCSAqIHByb2plY3Qgd2hpY2ggYXJlIG5vdCBleHBvcnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcGFyYW0gaW5jbHVkZXNQcmVyZXFQcm9qZWN0cwotCSAqIEBwYXJhbSB2aXNpdGVkUHJvamVjdHMKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gaW5jbHVkZXNQcmVyZXFQcm9qZWN0cywgSGFzaFNldCB2aXNpdGVkUHJvamVjdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkgfHwgIXZpc2l0ZWRQcm9qZWN0cy5hZGQocHJvamVjdCkpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSBqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkoKSkgewotCQkJCWlmICghZW50cnkuaXNFeHBvcnRlZCgpICYmIGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCXRoaXMuYWRkKHBhdGgsIHRydWUpOwotCQkJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihwYXRoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlpZiAoaW5jbHVkZXNQcmVyZXFQcm9qZWN0cykgewotCQkJCQkJdGhpcy5hZGQobW9kZWwuZ2V0SmF2YVByb2plY3QoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpLCB0cnVlLCB2aXNpdGVkUHJvamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCQl0aGlzLmFkZChlbnRyeS5nZXRQYXRoKCksIHRydWUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBhZGQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gbnVsbDsKLQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJCS8vIGEgd29ya3NwYWNlIHNvcGUgc2hvdWxkIGJlIHVzZWQKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJdGhpcy5hZGQoKElKYXZhUHJvamVjdCkgZWxlbWVudCwgdHJ1ZSwgbmV3IEhhc2hTZXQoMikpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQlyb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotCQkJCXRoaXMuYWRkKHJvb3QuZ2V0UGF0aCgpLCB0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKLQkJCQkJdGhpcy5hZGQocm9vdC5nZXRQYXRoKCkuYXBwZW5kKG5ldyBQYXRoKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSkpLCBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCXRoaXMuYWRkKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHJlbWVtYmVyIHN1Yi1jdSAob3Igc3ViLWNsYXNzIGZpbGUpIGphdmEgZWxlbWVudHMKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQkJaWYgKHRoaXMuZWxlbWVudHMgPT0gbnVsbCkgewotCQkJCQkJdGhpcy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQl0aGlzLmVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQkJdGhpcy5hZGQodGhpcy5mdWxsUGF0aChlbGVtZW50KSwgdHJ1ZSk7Ci0KLQkJCQkvLyBmaW5kIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpbmNsdWRpbmcgdGhpcyBqYXZhIGVsZW1lbnQKLQkJCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKLQkJCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkpIHsKLQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFyZW50OwotCQkJCX0KLQkJfQotCi0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkgewotCQkJCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHJvb3QuZ2V0UGF0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhdGggdG8gdGhpcyBzZWFyY2ggc2NvcGUuIFJlbWVtYmVyIGlmIHN1YmZvbGRlcnMgbmVlZCB0bwotCSAqIGJlIGluY2x1ZGVkIGFzIHdlbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChJUGF0aCBwYXRoLCBib29sZWFuIHdpdGhTdWJGb2xkZXJzKSB7Ci0JCWlmICh0aGlzLnBhdGhzLmxlbmd0aCA9PSB0aGlzLnBhdGhzQ291bnQpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wYXRocywgMCwgdGhpcy5wYXRocyA9IG5ldyBJUGF0aFt0aGlzLnBhdGhzQ291bnQgKiAyXSwgMCwgdGhpcy5wYXRoc0NvdW50KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wYXRoV2l0aFN1YkZvbGRlcnMsIDAsIHRoaXMucGF0aFdpdGhTdWJGb2xkZXJzID0gbmV3IGJvb2xlYW5bdGhpcy5wYXRoc0NvdW50ICogMl0sIDAsIHRoaXMucGF0aHNDb3VudCk7Ci0JCX0KLQkJdGhpcy5wYXRoc1t0aGlzLnBhdGhzQ291bnRdID0gcGF0aDsKLQkJdGhpcy5wYXRoV2l0aFN1YkZvbGRlcnNbdGhpcy5wYXRoc0NvdW50KytdID0gd2l0aFN1YkZvbGRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2VzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nKSB7Ci0JCUlQYXRoIHJlc291cmNlUGF0aDsKLQkJaW50IHNlcGFyYXRvckluZGV4ID0gcmVzb3VyY2VQYXRoU3RyaW5nLmluZGV4T2YoSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SKTsKLQkJaWYgKHNlcGFyYXRvckluZGV4ICE9IC0xKSB7Ci0JCQlyZXNvdXJjZVBhdGggPSBuZXcgUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KSkuYXBwZW5kKG5ldyBQYXRoKHJlc291cmNlUGF0aFN0cmluZy5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKSkpOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2VQYXRoID0gbmV3IFBhdGgocmVzb3VyY2VQYXRoU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lbmNsb3NlcyhyZXNvdXJjZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlYXJjaCBzY29wZSBlbmNsb3NlcyB0aGUgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZW5jbG9zZXMoSVBhdGggcGF0aCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGF0aHNDb3VudDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5wYXRoV2l0aFN1YkZvbGRlcnNbaV0pIHsKLQkJCQlpZiAodGhpcy5wYXRoc1tpXS5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSVBhdGggc2NvcGVQYXRoID0gdGhpcy5wYXRoc1tpXTsKLQkJCQlpZiAoc2NvcGVQYXRoLmlzUHJlZml4T2YocGF0aCkgJiYgKHNjb3BlUGF0aC5zZWdtZW50Q291bnQoKSA9PSBwYXRoLnNlZ21lbnRDb3VudCgpIC0gMSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zZXMoSUphdmFFbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICh0aGlzLmVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmVsZW1lbnRzLnNpemUoKTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSUphdmFFbGVtZW50IHNjb3BlRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIHRoaXMuZWxlbWVudHMuZ2V0KGkpOwotCQkJCUlKYXZhRWxlbWVudCBzZWFyY2hlZEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChzZWFyY2hlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoc2VhcmNoZWRFbGVtZW50LmVxdWFscyhzY29wZUVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSAKLQkJCQkJc2VhcmNoZWRFbGVtZW50ID0gc2VhcmNoZWRFbGVtZW50LmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lbmNsb3Nlcyh0aGlzLmZ1bGxQYXRoKGVsZW1lbnQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKSB7Ci0JCXJldHVybiB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKLQl9Ci0JcHJpdmF0ZSBJUGF0aCBmdWxsUGF0aChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuZ2V0UGF0aCgpOwotCQl9IAotCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKLQkJSVBhdGggcGFyZW50UGF0aCA9IHBhcmVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZnVsbFBhdGgocGFyZW50KTsKLQkJSVBhdGggY2hpbGRQYXRoOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCWNoaWxkUGF0aCA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElPcGVuYWJsZSkgewotCQkJY2hpbGRQYXRoID0gbmV3IFBhdGgoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwYXJlbnRQYXRoOwotCQl9Ci0JCXJldHVybiBwYXJlbnRQYXRoID09IG51bGwgPyBjaGlsZFBhdGggOiBwYXJlbnRQYXRoLmFwcGVuZChjaGlsZFBhdGgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMucGF0aHMgPSBuZXcgSVBhdGhbMV07Ci0JCXRoaXMucGF0aFdpdGhTdWJGb2xkZXJzID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRoaXMucGF0aHNDb3VudCA9IDA7Ci0JCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzID0gbmV3IElQYXRoWzBdOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkoKSB7Ci0JCXJldHVybiBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkKLQkgKiAgICAgICAgICAgIFRoZSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seShib29sZWFuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KSB7Ci0JCXRoaXMuaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkgPSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seTsKLQl9Ci0JLyoqCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2luY2x1ZGVzQmluYXJpZXMoKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2luY2x1ZGVzQ2xhc3NwYXRocygpCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNzZXRJbmNsdWRlc0JpbmFyaWVzKGJvb2xlYW4pCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0JpbmFyaWVzKGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcykgewotCQkvL0RlZmF1bHQgbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbikKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocykgewotCQkvL0RlZmF1bHQgbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZVNlYXJjaEVuZ2luZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZVNlYXJjaEVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTNkNDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVTZWFyY2hFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLQotcHVibGljIGNsYXNzIFR5cGVTZWFyY2hFbmdpbmUgZXh0ZW5kcyBTZWFyY2hFbmdpbmUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVTZWFyY2hFbmdpbmUuCi0JICovCi0JcHVibGljIFR5cGVTZWFyY2hFbmdpbmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVTZWFyY2hFbmdpbmUuCi0JICogCi0JICogQHBhcmFtIHdvcmtpbmdDb3BpZXMKLQkgKi8KLQlwdWJsaWMgVHlwZVNlYXJjaEVuZ2luZShJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcykgewotCQlzdXBlcih3b3JraW5nQ29waWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlSmF2YVNlYXJjaFNjb3BlRm9yQVByb2plY3QuIEdpdmVuIGEgcHJvamVjdCBpdCByZXR1cm5zIHRoZQotCSAqIHNjb3BlIG9mIHRoZSBjbGFzc2VzIHdpdGhpbiB0aGUgcHJvamVjdCdzIHNjb3BlCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cwotCSAqIEBwYXJhbSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seQotCSAqIEByZXR1cm4gSUphdmFTZWFyY2hTY29wZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlZFByb2plY3RzLCBib29sZWFuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KSB7Ci0JCWlmICghaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkpIHsKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudHNbXSA9IG5ldyBJSmF2YUVsZW1lbnRbXXtwcm9qZWN0fTsKLQkJCXJldHVybiBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGphdmFFbGVtZW50cywgaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCX0KLQkJVHlwZUphdmFTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBUeXBlSmF2YVNlYXJjaFNjb3BlKCk7Ci0JCXNjb3BlLnNldEluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KHRydWUpOwotCQlIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KDIpOwotCQl0cnkgewotCQkJc2NvcGUuYWRkUHJvamVjdChwcm9qZWN0LCBpbmNsdWRlUmVmZXJlbmNlZFByb2plY3RzLCB2aXNpdGVkUHJvamVjdHMpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZWRGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MjUzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciB7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmQWNjZXB0ZWRFeHRlbnNpb25zOwotCXByaXZhdGUgSGFzaHRhYmxlIHZpc2l0ZWRFbGVtZW50czsKLQlwdWJsaWMgVHlwZWRGaWxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGFjY2VwdGVkRXh0ZW5zaW9ucykgewotCQlmQWNjZXB0ZWRFeHRlbnNpb25zID0gYWNjZXB0ZWRFeHRlbnNpb25zOwotCQl2aXNpdGVkRWxlbWVudHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKElGaWxlLmNsYXNzLmlzSW5zdGFuY2UoZWxlbWVudCkpCi0JCQlyZXR1cm4gaXNWYWxpZEZpbGUoKElGaWxlKSBlbGVtZW50KTsKLQkJaWYgKElDb250YWluZXIuY2xhc3MuaXNJbnN0YW5jZShlbGVtZW50KSkKLQkJCXJldHVybiBpc1ZhbGlkQ29udGFpbmVyKChJQ29udGFpbmVyKSBlbGVtZW50KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKgotCSAqIEEgdmFsaWQgY29udGFpbmVyIGlzIG9uZSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB2YWxpZCBtZW1iZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlJUmVzb3VyY2VbXSBtZW1iZXJzOwotCQlPYmplY3QgdmFsaWQgPSB2aXNpdGVkRWxlbWVudHMuZ2V0KGNvbnRhaW5lcik7Ci0JCWlmICh2YWxpZCAhPSBudWxsKQotCQkJcmV0dXJuICgoQm9vbGVhbikgdmFsaWQpLmJvb2xlYW5WYWx1ZSgpOwotCQl0cnkgewotCQkJbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXNWYWxpZChtZW1iZXJzW2ldKSkgewotCQkJCQl2aXNpdGVkRWxlbWVudHMucHV0KGNvbnRhaW5lciwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCQl2aXNpdGVkRWxlbWVudHMucHV0KGNvbnRhaW5lciwgQm9vbGVhbi5GQUxTRSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZEZpbGUoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkFjY2VwdGVkRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZBY2NlcHRlZEV4dGVuc2lvbnNbaV0uZXF1YWxzSWdub3JlQ2FzZShleHQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpc1ZhbGlkKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4MmVlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiYXJjaGl2ZWVhcnVpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0VBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjMjQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5UYWJsZU9iamVjdHM7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvNy8yMDAxIDExOjM5OjExIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlT2JqZWN0cykKLQkJCXJldHVybiAoKFRhYmxlT2JqZWN0cykgaW5wdXRFbGVtZW50KS5nZXRUYWJsZU9iamVjdHMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOyAvL3Nob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZAotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAotCSAqIGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIG9uCi0JICogdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIGZyb20gdGhlIG9sZCBpbnB1dC4KLQkgKiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIgcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUKLQkgKiB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90IHByZXZpb3VzbHkKLQkgKiAgICAgICAgICAgIGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0V4cG9ydEVBUkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0V4cG9ydEVBUkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA3OGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FeHBvcnRFQVJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRFQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VTdHJpbmcoIiVlYXIuZXhwb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV8iKTsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiZXhwb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhwb3J0RUFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCUVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkKCk7Ci0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1YzNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvSW1wb3J0RUFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEVBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X0VBUiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiaW1wb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0RUFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0KLQkJRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQoKTsKLQotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTRlN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL01vZHVsZXNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDI6Mjc6MjQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZXNQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIE1vZHVsZXNQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2R1bGVzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkKLQkgKiByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyB0aGF0IGFmZmVjdCB0aGUgcmVuZGVyaW5nIG9mIHRoZQotCSAqIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiAoKGphdmEudXRpbC5MaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgaW1hZ2UgaXMgb3duZWQgYnkgdGhlIGxhYmVsCi0JICogcHJvdmlkZXIgYW5kIG11c3Qgbm90IGJlIGRpc3Bvc2VkIGRpcmVjdGx5LiBJbnN0ZWFkLCBkaXNwb3NlIHRoZSBsYWJlbCBwcm92aWRlciB3aGVuIG5vCi0JICogbG9uZ2VyIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIGltYWdlCi0JICogQHJldHVybiB0aGUgaW1hZ2UgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yCi0JICogICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0Ci0JICogQHJldHVybiB0aGUgdGV4dCBzdHJpbmcgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gdGV4dAotCSAqICAgICAgICAgbGFiZWwgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoQ2xhc3NQYXRoU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0IGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50Ci0JICogZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBBIHR5cGljYWwgdXNlIGZvciB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmluZyB0aGUgY29udGVudCBwcm92aWRlciBhcyBhIGxpc3RlbmVyIHRvIGNoYW5nZXMgb24KLQkgKiB0aGUgbmV3IGlucHV0ICh1c2luZyBtb2RlbC1zcGVjaWZpYyBtZWFucyksIGFuZCBkZXJlZ2lzdGVyaW5nIHRoZSB2aWV3ZXIgZnJvbSB0aGUgb2xkIGlucHV0LgotCSAqIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlciBwcm9wYWdhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZQotCSAqIHZpZXdlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBvbGRJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRpZCBub3QgcHJldmlvdXNseQotCSAqICAgICAgICAgICAgaGF2ZSBhbiBpbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4KLQkgKiBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEgbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5Ci0JICogbWVudGlvbmVkIGluIHRoZSB1cGRhdGUgZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdAotCSAqICAgICAgICAgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90Ci0JICogcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2NmNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuRGlzcGxheVV0aWxpdHk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBNRV9FSkJfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpOwotCXByb3RlY3RlZCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIEpBUl9BU1NFTUJMWV9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEVDT1JFX0JFQU5fTkFNRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCk7IC8vRU5BTUVEX0VMRU1FTlRfX05BTUUKLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBtZUNvbXBhcmF0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290ID0gdHJ1ZTsKLQotCXB1YmxpYyBjbGFzcyBFSkJNZXRob2RJdGVtIHsKLQkJcHVibGljIEVPYmplY3QgcmVmT2JqZWN0OwotCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZWpiOwotCi0JCXB1YmxpYyBFSkJNZXRob2RJdGVtKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJCXJlZk9iamVjdCA9IGFSZWZPYmplY3Q7Ci0JCQllamIgPSBhbkVKQjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIHJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlpc1Jvb3QgPSByb290OwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldEVudGVycHJpc2VCZWFuQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIEVKQk5hbWVDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkgewotCQlpZiAobWVDb21wYXJhdG9yID09IG51bGwpCi0JCQltZUNvbXBhcmF0b3IgPSBuZXcgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIG1lQ29tcGFyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRzKChBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRNZXRob2RFbGVtZW50cyhBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSBlamJJdGVtKSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gZWpiSXRlbS5yZWZPYmplY3Q7Ci0JCWlmIChyZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQlMaXN0IGVsZW1lbnRzID0gZ2V0TWV0aG9kRWxlbWVudHMocmVmT2JqZWN0LCBlamJJdGVtLmVqYik7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IGVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUFycmF5cy5zb3J0KHJlc3VsdCwgZ2V0TWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQik7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKEVPYmplY3QgcGFyZW50RWxlbWVudCwgTGlzdCBzb21lTWV0aG9kRWxlbWVudHMpIHsKLQkJaWYgKHNvbWVNZXRob2RFbGVtZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJU2V0IGVqYnMgPSBuZXcgSGFzaFNldCgpOwotCQlFbnRlcnByaXNlQmVhbiBlamIgPSBudWxsOwotCQlNZXRob2RFbGVtZW50IG1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb21lTWV0aG9kRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIHNvbWVNZXRob2RFbGVtZW50cy5nZXQoaSk7Ci0JCQllamIgPSBtZS5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJaWYgKGVqYiAhPSBudWxsKQotCQkJCWVqYnMuYWRkKGVqYik7Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gZWpicy50b0FycmF5KCk7Ci0JCWlmIChyZXN1bHQubGVuZ3RoICE9IDEpCi0JCQlBcnJheXMuc29ydChyZXN1bHQsIGdldEVudGVycHJpc2VCZWFuQ29tcGFyYXRvcigpKTsKLQkJZWpiID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCWVqYiA9IChFbnRlcnByaXNlQmVhbikgcmVzdWx0W2ldOwotCQkJcmVzdWx0W2ldID0gbmV3IEVKQk1ldGhvZEl0ZW0ocGFyZW50RWxlbWVudCwgZWpiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKEVudGVycHJpc2VCZWFuIGVqYikgewotCQlpZiAoZWpiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVqYi5nZXRFamJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiAoVHJlZVZpZXdlcikgdmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKE9iamVjdCBvYmopIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKGNyZWF0ZVJlZnJlc2hUcmVlUnVubmFibGUob2JqKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhjcmVhdGVSZWZyZXNoVHJlZVJ1bm5hYmxlKG51bGwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVHJlZVZpZXdlcihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCXJlZnJlc2hUcmVlVmlld2VyKG1lLmVDb250YWluZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoTGlzdCBhTGlzdCkgewotCQlpZiAoYUxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlyZWZyZXNoVHJlZVZpZXdlcigoTWV0aG9kRWxlbWVudCkgYUxpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1RyZWVWaWV3ZXIoZmluYWwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBmaW5kTWV0aG9kSXRlbSgpIHNob3VsZCBiZSBydW4gaW4gYSBEaXNwbGF5IHRocmVhZAotCQkJCUVKQk1ldGhvZEl0ZW0gaXRlbSA9IGZpbmRNZXRob2RJdGVtKG1lKTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJCQlEaXNwbGF5VXRpbGl0eS5hc3luY0V4ZWMoY3JlYXRlQWRkSXRlbVRyZWVSdW5uYWJsZShpdGVtLCBtZSkpOwotCQkJCWVsc2UKLQkJCQkJcmVmcmVzaFRyZWVWaWV3ZXIobWUuZUNvbnRhaW5lcigpKTsKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVHJlZVZpZXdlcihmaW5hbCBFT2JqZWN0IHBhcmVudCwgZmluYWwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlamIgPSBtZS5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJCUVKQk1ldGhvZEl0ZW0gaXRlbSA9IGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50KTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcihpdGVtKTsKLQkJCQllbHNlCi0JCQkJCXJlZnJlc2hUcmVlVmlld2VyKChPYmplY3QpIG51bGwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUpCTWV0aG9kSXRlbSBmaW5kTWV0aG9kSXRlbShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCXJldHVybiBmaW5kTWV0aG9kSXRlbShtZS5nZXRFbnRlcnByaXNlQmVhbigpLCBtZS5lQ29udGFpbmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBFSkJNZXRob2RJdGVtIGZpbmRNZXRob2RJdGVtKEVudGVycHJpc2VCZWFuIGVqYiwgRU9iamVjdCBwYXJlbnRNZXRob2QpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQkJcmV0dXJuIGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50TWV0aG9kLCBpdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVKQk1ldGhvZEl0ZW0gZmluZE1ldGhvZEl0ZW0oRW50ZXJwcmlzZUJlYW4gZWpiLCBFT2JqZWN0IHBhcmVudE1ldGhvZCwgVHJlZUl0ZW1bXSBpdGVtcykgewotCQlUcmVlSXRlbSBpdGVtID0gbnVsbDsKLQkJT2JqZWN0IGRhdGEgPSBudWxsOwotCQlFSkJNZXRob2RJdGVtIG1ldGhvZEl0ZW0gPSBudWxsLCBmb3VuZCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWl0ZW0gPSBpdGVtc1tpXTsKLQkJCWRhdGEgPSBpdGVtLmdldERhdGEoKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgRUpCTWV0aG9kSXRlbSkgewotCQkJCW1ldGhvZEl0ZW0gPSAoRUpCTWV0aG9kSXRlbSkgZGF0YTsKLQkJCQlpZiAobWV0aG9kSXRlbS5lamIgPT0gZWpiICYmIG1ldGhvZEl0ZW0ucmVmT2JqZWN0ID09IHBhcmVudE1ldGhvZCkKLQkJCQkJcmV0dXJuIG1ldGhvZEl0ZW07Ci0JCQl9Ci0JCQlmb3VuZCA9IGZpbmRNZXRob2RJdGVtKGVqYiwgcGFyZW50TWV0aG9kLCBpdGVtLmdldEl0ZW1zKCkpOwotCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJcmV0dXJuIGZvdW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpT2JqZWN0LAotCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRVNPTFZFKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChub3RpZmllci5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgQ01QQXR0cmlidXRlICYmIG5vdGlmaWVyLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IE1FX0VKQl9TRikgewotCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKE1ldGhvZEVsZW1lbnQpIG5vdGlmaWVyLmdldE5vdGlmaWVyKCkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBFQ09SRV9CRUFOX05BTUUpIHsKLQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoZ2V0TWV0aG9kRWxlbWVudHNSZWZlcmVuY2UoKSA9PSBub3RpZmllci5nZXRGZWF0dXJlKCkpIHsKLQkJCWlmIChub3RpZmllci5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKQotCQkJCWFkZFRvVHJlZVZpZXdlcigoTWV0aG9kRWxlbWVudCkgbm90aWZpZXIuZ2V0TmV3VmFsdWUoKSk7Ci0JCQllbHNlIGlmIChub3RpZmllci5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKQotCQkJCXJlbW92ZUZyb21UcmVlVmlld2VyKChFT2JqZWN0KSBub3RpZmllci5nZXROb3RpZmllcigpLCAoTWV0aG9kRWxlbWVudCkgbm90aWZpZXIuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEpBUl9BU1NFTUJMWV9TRiAmJiBpc1Jvb3QpIHsKLQkJCXVwZGF0ZVRyZWVJbnB1dChub3RpZmllci5nZXROZXdWYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSkKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmllcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyZWVJbnB1dChmaW5hbCBPYmplY3QgdGFyZ2V0KSB7Ci0JCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dCh0YXJnZXQpOyAvL3Jlc2V0IHRoZSBpbnB1dAotCQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKHRhcmdldCk7Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBjcmVhdGVBZGRJdGVtVHJlZVJ1bm5hYmxlKGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFRyZWVWaWV3ZXIoKS5hZGQocGFyZW50LCBtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBjcmVhdGVSZWZyZXNoVHJlZVJ1bm5hYmxlKGZpbmFsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2godGFyZ2V0KTsKLQkJCQllbHNlCi0JCQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9CZWFuQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9CZWFuQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE0MmViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIxLzIwMDEgMTI6Mjk6NDkgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NTM6MDkgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldEVqYkNsYXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImVqYl9tb2R1bGVfb3ZyIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfQ2xhc3NfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkVKQiBDbGFzcyIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FSkJVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0VKQlVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZWQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0VKQlVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBFSkJVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqMmVlX2VqYl91aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFSkJVSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVKQlVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjOTFjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0V4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIEVYQ0xVREVfTUVfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgQURfRUxfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgRUNPUkVfQkVBTl9OQU1FID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKTsgLy9FTkFNRURfRUxFTUVOVF9fTkFNRQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiByb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhjbHVkZXNMaXN0Q29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEVudGVycHJpc2VCZWFucyhFeGNsdWRlTGlzdCBsaXN0KSB7Ci0JCUxpc3QgbWVzID0gbGlzdC5nZXRNZXRob2RFbGVtZW50cygpOwotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKGxpc3QsIG1lcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0LCBFbnRlcnByaXNlQmVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmICghKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJRXhjbHVkZUxpc3QgcGFyZW50TGlzdCA9IChFeGNsdWRlTGlzdCkgYVJlZk9iamVjdDsKLQkJaWYgKHBhcmVudExpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gcGFyZW50TGlzdC5nZXRNZXRob2RFbGVtZW50cyhhbkVKQik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCQlFeGNsdWRlTGlzdCBsaXN0ID0gbnVsbDsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVKQkphcikgewotCQkJRUpCSmFyIGphciA9IChFSkJKYXIpIGlucHV0RWxlbWVudDsKLQkJCWlmIChqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgIT0gbnVsbCkKLQkJCQlsaXN0ID0gamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobGlzdCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFzc2VtYmx5RGVzY3JpcHRvcikgewotCQkJbGlzdCA9ICgoQXNzZW1ibHlEZXNjcmlwdG9yKSBpbnB1dEVsZW1lbnQpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobGlzdCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkucHJvdmlkZXJzLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhjbHVkZUxpc3QpCi0JCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChFeGNsdWRlTGlzdCkgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KQotCQkJcmV0dXJuICEoKEV4Y2x1ZGVMaXN0KSBlbGVtZW50KS5nZXRNZXRob2RFbGVtZW50cygpLmlzRW1wdHkoKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWVyKSB7Ci0JCWlmICgobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEVYQ0xVREVfTUVfU0YgJiYgbm90aWZpZXIuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KSB8fCBub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gRUNPUkVfQkVBTl9OQU1FKSB7Ci0JCQlpZiAobm90aWZpZXIuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGlzUm9vdCkKLQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJZWxzZQotCQkJCXJlZnJlc2hUcmVlVmlld2VyKG5vdGlmaWVyLmdldE5vdGlmaWVyKCkpOwotCQl9Ci0JCWlmIChub3RpZmllci5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgQ01QQXR0cmlidXRlICYmIG5vdGlmaWVyLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHx8IG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpKQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIEVYQ0xVREVfTUVfU0Y7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkucHJvdmlkZXJzLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIEFEX0VMX1NGOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0NWM2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGZvciBFSkIgZ3JvdXBzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyIGV4dGVuZHMgSjJFRUl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgR3JvdXBlZEVKQkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0QXNzb2NpYXRlZEZpbGUoKSB7Ci0KLQkJdHJ5IHsKLQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSBnZXRQYXJlbnQoKTsKLQkJCWlmKGVqYkphciAhPSBudWxsICYmIGVqYkphci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZShlamJKYXIuZVJlc291cmNlKCkuZ2V0VVJJKCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZlNWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotCi0KLS8qKgotICogQGF1dGhvciBTYWNoaW4gUCBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBFSkJKYXJJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlciBzZXNzaW9uUHJvdmlkZXIgPSBudWxsOwotCXByaXZhdGUgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlciBlbnRpdHlQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlciBtZXNzYWdlUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHNlc3Npb25UYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZW50aXR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIG1lc3NhZ2VUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OID0gRUpCVUlNZXNzYWdlcy5Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9IEVKQlVJTWVzc2FnZXMuR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8xOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gRUpCVUlNZXNzYWdlcy5Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzI7Ci0KLQkvLwlOb3JtYWxseSB0aGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgYW4gaXRlbSBwcm92aWRlciBmb3IgYWxsIGluc3RhbmNlcyBvZiB0aGUgb2JqZWNjdAotCS8vCWluIHRoZSB0cmVlLiBUaGUgaXRlbSBwcm92aWRlciB3b3VsZCBiZSBzdGF0ZWxlc3MuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UgYXJlIGRvaW5nIHRyaWNrcwotCS8vCWhlcmUsIHdlIGFyZSBrZWVwaW5nIHRyYWNrIG9mIGFsbCBpdGVtcyB0aGlzIHByb3ZpZGVyIG1hbmFnZXMuIFRoZSBrZXkgaW4gdGhlIG1hcCBpcyB0aGUKLQkvLwlvYmplY3QgKEVKQkphciksIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGNoaWxkcmVuIG5vZGVzIHRoYXQgd2UgaW5zZXJ0ZWQKLQotCXByb3RlY3RlZCBNYXAgY2hpbGRyZW4gPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgYm9vbGVhbiBzaG93QXNzZW1ibHlEZXNjcmlwdG9yOwotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc3Bvc2luZzsKLQotCXB1YmxpYyBHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIHNob3dBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLnNob3dBc3NlbWJseURlc2NyaXB0b3IgPSBzaG93QXNzZW1ibHlEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBpbml0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKHNob3dBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJCWlmICgoKEVKQkphcikgb2JqZWN0KS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQoKChFSkJKYXIpIG9iamVjdCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgaW5pdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpIG9iamVjdDsKLQkJTGlzdCBhbGxSb290QmVhbnMgPSBnZXRBbGxSb290QmVhbnMoZWpiSmFyKTsKLQotCQlib29sZWFuIGlzMjBKYXIgPSBpczIwSmFyKGVqYkphcik7Ci0KLQkJTGlzdCBsb2NhbENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCg1KTsKLQotCQlMaXN0IGVudGl0eUJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHNlc3Npb25CZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtZXNzYWdlQmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJY2F0YWdvcml6ZUJlYW5zKGFsbFJvb3RCZWFucywgZW50aXR5QmVhbnMsIHNlc3Npb25CZWFucywgbWVzc2FnZUJlYW5zKTsKLQkJb3JkZXJCZWFucyhlbnRpdHlCZWFucyk7Ci0JCW9yZGVyQmVhbnMoc2Vzc2lvbkJlYW5zKTsKLQkJb3JkZXJCZWFucyhtZXNzYWdlQmVhbnMpOwotCQkKLQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJLy9pZiAoc2Vzc2lvbkJlYW5zLnNpemUoKSA+IDApIHsKLQkJaWYgKHNlc3Npb25UYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBuZXcgaXRlbSBwcm92aWRlciBpbnN0YW5jZQotCQkJc2Vzc2lvblByb3ZpZGVyID0gbmV3IEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShTRVNTSU9OKSwgb2JqZWN0LCBzZXNzaW9uQmVhbnMpOwotCQkJc2Vzc2lvblRhYmxlLnB1dChlamJKYXIsIHNlc3Npb25Qcm92aWRlcik7Ci0JCQlsb2NhbENoaWxkcmVuLmFkZChzZXNzaW9uUHJvdmlkZXIpOwotCQl9IGVsc2UgewotCQkJLy91c2UgZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0YWJsZQotCQkJbG9jYWxDaGlsZHJlbi5hZGQoc2Vzc2lvblRhYmxlLmdldChlamJKYXIpKTsKLQkJfQotCQkvL30KLQotCQkvL0VOQUJMRSBGT1I6IE5PVCBUTyBTSE9XIEVNUFRZIEdST1VQUwotCQkvL2lmIChlbnRpdHlCZWFucy5zaXplKCkgPiAwKSB7Ci0JCWlmIChlbnRpdHlUYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBuZXcgaXRlbSBwcm92aWRlciBpbnN0YW5jZQotCQkJZW50aXR5UHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoRU5USVRZKSwgb2JqZWN0LCBlbnRpdHlCZWFucyk7Ci0JCQllbnRpdHlUYWJsZS5wdXQoZWpiSmFyLCBlbnRpdHlQcm92aWRlcik7Ci0JCQlsb2NhbENoaWxkcmVuLmFkZChlbnRpdHlQcm92aWRlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvL3VzZSBleGlzdGluZyBpbnN0YW5jZSBmcm9tIHRhYmxlCi0JCQlsb2NhbENoaWxkcmVuLmFkZChlbnRpdHlUYWJsZS5nZXQoZWpiSmFyKSk7Ci0JCX0KLQkJLy99Ci0KLQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJLy9pZiAoaXMyMEphciAmJiBtZXNzYWdlQmVhbnMuc2l6ZSgpID4gMCkgewotCQlpZiAoaXMyMEphcikgewotCQkJaWYgKG1lc3NhZ2VUYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkJLy9jcmVhdGUgbmV3IGl0ZW0gcHJvdmlkZXIgaW5zdGFuY2UKLQkJCQltZXNzYWdlUHJvdmlkZXIgPSBuZXcgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKE1FU1NBR0UpLCBvYmplY3QsIG1lc3NhZ2VCZWFucyk7Ci0JCQkJbWVzc2FnZVRhYmxlLnB1dChlamJKYXIsIG1lc3NhZ2VQcm92aWRlcik7Ci0JCQkJbG9jYWxDaGlsZHJlbi5hZGQobWVzc2FnZVByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy91c2UgZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0YWJsZQotCQkJCWxvY2FsQ2hpbGRyZW4uYWRkKG1lc3NhZ2VUYWJsZS5nZXQoZWpiSmFyKSk7Ci0JCQl9Ci0JCX0KLQkJLy99Ci0KLQkJY2hpbGRyZW4ucHV0KG9iamVjdCwgbG9jYWxDaGlsZHJlbik7Ci0KLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3JkZXJCZWFucyhMaXN0IGJlYW5zKSB7Ci0JCU9iamVjdFtdIGJlYW5zQXJyYXkgPSBiZWFucy50b0FycmF5KCk7Ci0JCUFycmF5cy5zb3J0KGJlYW5zQXJyYXksIEVKQk5hbWVDb21wYXJhdG9yLnNpbmdsZXRvbigpKTsKLQkJYmVhbnMuY2xlYXIoKTsKLQkJYmVhbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhbnNBcnJheSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0QWxsUm9vdEJlYW5zKEVKQkphciBlamJKYXIpIHsKLQkJcmV0dXJuIGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYXRhZ29yaXplQmVhbnMoTGlzdCBhbGxSb290QmVhbnMsIExpc3QgZW50aXR5QmVhbnMsIExpc3Qgc2Vzc2lvbkJlYW5zLCBMaXN0IG1lc3NhZ2VCZWFucykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFJvb3RCZWFucy5zaXplKCk7IGkrKykgewotCQkJaWYgKCgoRW50ZXJwcmlzZUJlYW4pIGFsbFJvb3RCZWFucy5nZXQoaSkpLmlzU2Vzc2lvbigpKSB7Ci0JCQkJc2Vzc2lvbkJlYW5zLmFkZChhbGxSb290QmVhbnMuZ2V0KGkpKTsKLQkJCX0gZWxzZSBpZiAoKChFbnRlcnByaXNlQmVhbikgYWxsUm9vdEJlYW5zLmdldChpKSkuaXNFbnRpdHkoKSkgewotCQkJCWVudGl0eUJlYW5zLmFkZChhbGxSb290QmVhbnMuZ2V0KGkpKTsKLQkJCX0gZWxzZSBpZiAoKChFbnRlcnByaXNlQmVhbikgYWxsUm9vdEJlYW5zLmdldChpKSkuaXNNZXNzYWdlRHJpdmVuKCkpIHsKLQkJCQltZXNzYWdlQmVhbnMuYWRkKGFsbFJvb3RCZWFucy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlciBnZXRTZXNzaW9uTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIpIHNlc3Npb25UYWJsZS5nZXQob2JqZWN0KTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIgZ2V0RW50aXR5Tm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlcikgZW50aXR5VGFibGUuZ2V0KG9iamVjdCk7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlciBnZXRNZXNzYWdlTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIpIG1lc3NhZ2VUYWJsZS5nZXQob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlLmVxdWFscyhTRVNTSU9OKSkKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZXNzaW9uQmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmICh0eXBlLmVxdWFscyhNRVNTQUdFKSkKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtZXNzYWdlX2JlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoRU5USVRZKSkKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlbnRpdHliZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpczIwSmFyKEVKQkphciBlamJKYXIpIHsKLQkJc3dpdGNoIChlamJKYXIuZ2V0VmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRCA6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQgOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCA6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUiAmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzICYmICFpc0Rpc3Bvc2luZykgewotCQkJcmVtb3ZlVGFyZ2V0KG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpKSB7Ci0JCQlKMkVFSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gYmVhbnNDaGFuZ2VkKChFSkJKYXIpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCkpOwotCi0JCQkvL0VKQidzIGdyb3VwIGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQsIG5lZWQgdG8gYWRkIGdyb3VwIHRvIHRyZWUgYmVmb3JlIEVKQiBjYW4gYmUgYWRkZWQKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5BREQsIG51bGwsIGdldEVKQkl0ZW1Qcm92aWRlcigoRW50ZXJwcmlzZUJlYW4pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKSwgMSk7Ci0JCQkJTm90aWZpY2F0aW9uV3JhcHBlciBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3IE5vdGlmaWNhdGlvbldyYXBwZXIobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG1zZyk7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQkJcHJvdmlkZXIgPSBiZWFuc0NoYW5nZWQoKEVKQkphcikgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSwgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKSk7Ci0JCQl9Ci0KLQkJCS8vRmlyZSBub3RpZmljYXRpb24gZm9yIEVKQiBhZGQgb3IgcmVtb3ZlCi0JCQlOb3RpZmljYXRpb25XcmFwcGVyIG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcgTm90aWZpY2F0aW9uV3JhcHBlcihwcm92aWRlciwgbm90aWZpY2F0aW9uKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbldyYXBwZXIpOwotCi0JCQkvL0VOQUJMRSBGT1I6IE5PVCBUTyBTSE9XIEVNUFRZIEdST1VQUwotCQkJLy9JZiBHcm91cCBpcyBlbXB0eSByZW1vdmUgdGhlIGdyb3VwCi0JCQkvKgotCQkJICogaWYgKHByb3ZpZGVyICE9IG51bGwgJiYgcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMCkgeyBOb3RpZmljYXRpb24gbXNnID0gbmV3Ci0JCQkgKiBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5SRU1PVkUsIHByb3ZpZGVyLCBudWxsLCAxKTsgbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldwotCQkJICogTm90aWZpY2F0aW9uV3JhcHBlcihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbXNnKTsKLQkJCSAqIGZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbldyYXBwZXIpOwotCQkJICogCi0JCQkgKiAvL0dyb3VwIGlzIHJlbW92ZWQgc28gZmx1c2ggb3V0IHRhYmxlIGVudHJ5IGlmIChwcm92aWRlciBpbnN0YW5jZW9mCi0JCQkgKiBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcikgeyBzZXNzaW9uVGFibGUucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCSAqIHByb3ZpZGVyID0gbnVsbDsgfSBlbHNlIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSAqIGVudGl0eVRhYmxlLnJlbW92ZShub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7IHByb3ZpZGVyID0gbnVsbDsgfSBlbHNlIGlmIChwcm92aWRlcgotCQkJICogaW5zdGFuY2VvZiBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlcikgewotCQkJICogbWVzc2FnZVRhYmxlLnJlbW92ZShub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7IHByb3ZpZGVyID0gbnVsbDsgfQotCQkJICogCi0JCQkgKiAvL0lmIGFsbCBncm91cHMgYXJlIHJlbW92ZWQgcmVtb3ZlIHRoZSBleHRlbmRlZCBjaGlsZHJlbiBMaXN0IGFsbENoaWxkcmVuID0gbmV3Ci0JCQkgKiBBcnJheUxpc3QodGhpcy5nZXRDaGlsZHJlbigoRUpCSmFyKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpOwotCQkJICogaWYoc2Vzc2lvblRhYmxlLmdldChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gbnVsbCAmJgotCQkJICogZW50aXR5VGFibGUuZ2V0KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBudWxsICYmCi0JCQkgKiBtZXNzYWdlVGFibGUuZ2V0KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBudWxsKSB7IGZvcihpbnQgaSA9IDA7IGkgPAotCQkJICogYWxsQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsgTm90aWZpY2F0aW9uIG1lc3NhZ2UgPSBuZXcKLQkJCSAqIE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlJFTU9WRSwgYWxsQ2hpbGRyZW4uZ2V0KGkpLCBudWxsLCAxKTsKLQkJCSAqIG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcgTm90aWZpY2F0aW9uV3JhcHBlcihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbWVzc2FnZSk7Ci0JCQkgKiBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25XcmFwcGVyKTsgfSB0aGlzLmdldENoaWxkcmVuKChFSkJKYXIpCi0JCQkgKiBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkuY2xlYXIoKTsgfSB9Ci0JCQkgKi8KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKMkVFSXRlbVByb3ZpZGVyIGJlYW5zQ2hhbmdlZChFSkJKYXIgZWpiSmFyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlKMkVFSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0SXRlbVByb3ZpZGVyKGVqYkphciwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBncmFuZENoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOiB7Ci0JCQkJCWlmICghZ3JhbmRDaGlsZHJlbi5jb250YWlucyhuZXdWYWx1ZSkpCi0JCQkJCQlncmFuZENoaWxkcmVuLmFkZChuZXdWYWx1ZSk7Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDogewotCQkJCQlncmFuZENoaWxkcmVuLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDogewotCQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZShvbGRWYWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6IHsKLQkJCQkJZ3JhbmRDaGlsZHJlbi5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIG9sZFZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy9Hcm91cGVkUHJvdmlkZXIgZm9yIG5ldyBiZWFuIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lLgotCQkJTGlzdCBhbGxSb290QmVhbnMgPSBnZXRBbGxSb290QmVhbnMoZWpiSmFyKTsKLQotCQkJTGlzdCBlbnRpdHlCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgc2Vzc2lvbkJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBtZXNzYWdlQmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWNhdGFnb3JpemVCZWFucyhhbGxSb290QmVhbnMsIGVudGl0eUJlYW5zLCBzZXNzaW9uQmVhbnMsIG1lc3NhZ2VCZWFucyk7Ci0KLQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFNlc3Npb24pIHsKLQkJCQlzZXNzaW9uUHJvdmlkZXIgPSBuZXcgR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKFNFU1NJT04pLCBlamJKYXIsIHNlc3Npb25CZWFucyk7Ci0JCQkJc2Vzc2lvblRhYmxlLnB1dChlamJKYXIsIHNlc3Npb25Qcm92aWRlcik7Ci0JCQl9IGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJZW50aXR5UHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoRU5USVRZKSwgZWpiSmFyLCBlbnRpdHlCZWFucyk7Ci0JCQkJZW50aXR5VGFibGUucHV0KGVqYkphciwgZW50aXR5UHJvdmlkZXIpOwotCQkJfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCQltZXNzYWdlUHJvdmlkZXIgPSBuZXcgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKE1FU1NBR0UpLCBlamJKYXIsIG1lc3NhZ2VCZWFucyk7Ci0JCQkJbWVzc2FnZVRhYmxlLnB1dChlamJKYXIsIG1lc3NhZ2VQcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgSjJFRUl0ZW1Qcm92aWRlciBnZXRFSkJKYXJJdGVtUHJvdmlkZXIoRUpCSmFyIGVqYkphciwgT2JqZWN0IGJlYW4pIHsKLQkJSjJFRUl0ZW1Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCWlmIChlamJKYXIgIT0gbnVsbCAmJiBiZWFuICE9IG51bGwpIHsKLQkJCWlmIChiZWFuIGluc3RhbmNlb2YgU2Vzc2lvbikgewotCQkJCXByb3ZpZGVyID0gZ2V0U2Vzc2lvbk5vZGUoZWpiSmFyKTsKLQkJCX0gZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXByb3ZpZGVyID0gZ2V0RW50aXR5Tm9kZShlamJKYXIpOwotCQkJfSBlbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJCXByb3ZpZGVyID0gZ2V0TWVzc2FnZU5vZGUoZWpiSmFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyIGdldEVKQkl0ZW1Qcm92aWRlcihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuICE9IG51bGwpIHsKLQkJCUVKQkphciBlamJKYXIgPSBiZWFuLmdldEVqYkphcigpOwotCQkJcmV0dXJuIGdldEVKQkphckl0ZW1Qcm92aWRlcihlamJKYXIsIGJlYW4pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKMkVFSXRlbVByb3ZpZGVyIGdldEl0ZW1Qcm92aWRlcihFSkJKYXIgZWpiSmFyLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFSkJKYXJJdGVtUHJvdmlkZXIoZWpiSmFyLCBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKG9sZFZhbHVlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RUpCSmFySXRlbVByb3ZpZGVyKGVqYkphciwgb2xkVmFsdWUpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290QmVhbihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgYWxsUm9vdEJlYW5zID0gZ2V0QWxsUm9vdEJlYW5zKGJlYW4uZ2V0RWpiSmFyKCkpOwotCQlpZiAoYWxsUm9vdEJlYW5zICE9IG51bGwgJiYgYWxsUm9vdEJlYW5zLmNvbnRhaW5zKGJlYW4pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8JVXRpbGl0eSBtZXRob2QgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiAtIGlmIEVKQkphciByZW1vdmVkLCByZW1vdmUKLQkvLwlhbGwgZW50aXJlcyBpbiB0YWJsZSBmb3IgRUpCSmFyCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGZsdXNoT3V0VGFibGVFbnRyaWVzRm9yRUpCSmFyKEVKQkphciBlamJKYXIpIHsKLQkJc2Vzc2lvblRhYmxlLnJlbW92ZShlamJKYXIpOwotCQllbnRpdHlUYWJsZS5yZW1vdmUoZWpiSmFyKTsKLQkJbWVzc2FnZVRhYmxlLnJlbW92ZShlamJKYXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIucHJvdmlkZXIuRUpCSmFySXRlbVByb3ZpZGVyI3JlbW92ZVRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFyZ2V0KE5vdGlmaWNhdGlvbiBub3QpIHsKLQkJaWYgKG5vdC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgRUpCSmFyKQotCQkJZmx1c2hPdXRUYWJsZUVudHJpZXNGb3JFSkJKYXIoKEVKQkphcikgbm90LmdldE5vdGlmaWVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJaXNEaXNwb3NpbmcgPSB0cnVlOwotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaXNEaXNwb3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmI0MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFbnRpdHlfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEVOVElUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk3N2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotCi0KLS8qKgotICogQGF1dGhvciBTYWNoaW4gUGF0ZWwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyb3VwZWRFSkJJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9CRUFOUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlX0RyaXZlbl9CZWFuc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIE1FU1NBR0VfQkVBTlM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMjgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JvdXBlZEVKQkl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0JFQU5TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlc3Npb25fQmVhbnNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBHcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBTRVNTSU9OX0JFQU5TOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Ib21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzN2FiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMToyMzozMCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo1Mzo0OSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJcmV0dXJuICJob21lX2ludGVyZmFjZV9vdmVybGF5X29iaiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSG9tZV9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkhvbWUgSW50ZXJmYWNlIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWYxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgNjo1ODo1MSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyIHsKLQkvKioKLQkgKiBKMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIoRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgb2JqZWN0LCByZXN1bHQpOwotCQlyZXN1bHQuYWRkQWxsKCgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgb2JqZWN0KS5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoSjJFRVJlZmVyZW5jZVByb3ZpZGVySGVscGVyLmdldFJlZmVyZW5jZXMoKEVudGVycHJpc2VCZWFuKSBvYmplY3QpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODhkODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDc6MjA6MDcgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5FamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVKQkphcn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlcigpIHsKLQkJaWYgKGVKQkphckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllSkJKYXJJdGVtUHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcih0aGlzLCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBlSkJKYXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FbnRpdHl9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmIChlbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZW50aXR5SXRlbVByb3ZpZGVyID0gbmV3IEoyRUVFbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZW50aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuU2Vzc2lvbn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXNzaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlc3Npb25JdGVtUHJvdmlkZXIgPSBuZXcgSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2Vzc2lvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpIHsKLQkJaWYgKG1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdkNGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDExOjEwOjA2IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgRW50aXR5SXRlbVByb3ZpZGVyIHsKLQkvKioKLQkgKiBKMkVFRW50aXR5SXRlbVByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFRW50aXR5SXRlbVByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuU3VwZXIob2JqZWN0KSk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoRW50aXR5KSBvYmplY3QsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGZlNDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5PdmVybGF5SWNvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCXByaXZhdGUgRW50ZXJwcmlzZUJlYW4gZWpiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCS8qKgotCSAqIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RWpiKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2hpbGRyZW4oRW50aXR5IGVqYiwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlhZGRDaGlsZHJlbigoRW50ZXJwcmlzZUJlYW4pIGVqYiwgY2hpbGRyZW4pOwotCQlpZiAoZWpiLmdldFByaW1hcnlLZXkoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBQcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlcihlamIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2hpbGRyZW4oRW50ZXJwcmlzZUJlYW4gZWpiLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0KLQkJaWYgKGVqYi5nZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyKGVqYikpOwotCQlpZiAoZWpiLmdldFJlbW90ZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IFJlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyKGVqYikpOwotCQlpZiAoZWpiLmdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IExvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyKGVqYikpOwotCQlpZiAoZWpiLmdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlcihlamIpKTsKLQkJaWYgKGVqYi5nZXRFamJDbGFzcygpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKGVqYikpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBjcmVhdGVJbWFnZSgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2UgPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiamN1X29iaiIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IGdldE92ZXJsYXlEZXNjcmlwdG9yKCk7Ci0JCWlmIChvdmVybGF5ID09IG51bGwpCi0JCQlyZXR1cm4gYmFzZS5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbmV3IE92ZXJsYXlJY29uKGJhc2UsIG5ldyBJbWFnZURlc2NyaXB0b3JbXVtde3tvdmVybGF5fX0pLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NDc6MjQgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIGdldEVqYigpIHsKLQkJcmV0dXJuIGVqYjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMDozMDo1NCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldE92ZXJsYXlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoZ2V0T3ZlcmxheUtleSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE92ZXJsYXlLZXkoKTsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldEphdmFDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0xpbmVNZXNzYWdlKCkgewotCQlpZiAoZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRUeXBlU3RyaW5nKGdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGdldEphdmFDbGFzcygpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBvcGVuSW5FZGl0b3IoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0SmF2YUNsYXNzKCkpOwotCQl0cnkgewotCQkJSjJFRUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGdldEphdmFDbGFzcygpLCBwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNhbnRPcGVuKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NDc6MjQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0VqYgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiBuZXdFamIpIHsKLQkJZWpiID0gbmV3RWpiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFkYXB0YWJsZSNFY29yZVV0aWwuZ2V0QWRhcHRlcihlQWRhcHRlcnMoKSxDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBJUkVTT1VSQ0VfQ0xBU1MpCi0JCQlyZXR1cm4gSjJFRUVkaXRvclV0aWxpdHkuZ2V0RmlsZShnZXRKYXZhQ2xhc3MoKSk7Ci0JCWlmIChhZGFwdGVyID09IElQUk9KRUNUX0NMQVNTKQotCQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTU1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEoyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuU3VwZXIob2JqZWN0KSk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoTWVzc2FnZURyaXZlbikgb2JqZWN0LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVSZWZlcmVuY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFUmVmZXJlbmNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiODk0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVSZWZlcmVuY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVJlZmVyZW5jZVByb3ZpZGVySGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghYmVhbi5nZXRFamJSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEVqYlJlZnMoKSk7Ci0JCWlmICghYmVhbi5nZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0RWpiTG9jYWxSZWZzKCkpOwotCQlpZiAoIWJlYW4uZ2V0UmVzb3VyY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldFJlc291cmNlUmVmcygpKTsKLQkJaWYgKCFiZWFuLmdldFNlY3VyaXR5Um9sZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0U2VjdXJpdHlSb2xlUmVmcygpKTsKLQkJaWYgKCFiZWFuLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRkMjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgMTE6MTA6NDggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLlNlc3Npb25JdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlblN1cGVyKG9iamVjdCkpOwotCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKFNlc3Npb24pIG9iamVjdCwgcmVzdWx0KTsKLQkJSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmFkZENoaWxkcmVuKChTZXNzaW9uKSBvYmplY3QsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTZXNzaW9uIHNlc3Npb24sIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJaWYgKHNlc3Npb24uZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCAmJiBzZXNzaW9uLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyKHNlc3Npb24pKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmVhNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSBhbkVKQgotCSAqLwotCXB1YmxpYyBMb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0SmF2YUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAibG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmoiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0VHlwZVN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJMb2NhbF9Ib21lX0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiTG9jYWwgSG9tZSBJbnRlcmZhY2UiOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWFmMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBMb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuCi0JICogCi0JICogQHBhcmFtIGFuRUpCCi0JICovCi0JcHVibGljIExvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRKYXZhQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAibG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0VHlwZVN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJMb2NhbF9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkxvY2FsIEludGVyZmFjZSIKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTA5ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgUEVSTUlTU0lPTl9NRVNfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBQRVJNSVNTSU9OX01FU19VTkNIRUNLRURfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgUEVSTUlTU0lPTl9NRVNfUk9MRVNfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBBRF9NUF9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcm9vdAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIGJvb2xlYW4gcm9vdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uKQotCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygoTWV0aG9kUGVybWlzc2lvbikgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKE1ldGhvZFBlcm1pc3Npb24gbXApIHsKLQkJTGlzdCBtZXMgPSBtcC5nZXRNZXRob2RFbGVtZW50cygpOwotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKG1wLCBtZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCwgRW50ZXJwcmlzZUJlYW4pCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoIShhUmVmT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTWV0aG9kUGVybWlzc2lvbiBwYXJlbnRNUCA9IChNZXRob2RQZXJtaXNzaW9uKSBhUmVmT2JqZWN0OwotCQlpZiAocGFyZW50TVAgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gcGFyZW50TVAuZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVKQkphcikgewotCQkJRUpCSmFyIGphciA9IChFSkJKYXIpIGlucHV0RWxlbWVudDsKLQkJCWlmIChqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldE1ldGhvZFBlcm1pc3Npb25zKCkudG9BcnJheSgpOwotCQl9Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBBc3NlbWJseURlc2NyaXB0b3IpCi0JCQlyZXR1cm4gKChBc3NlbWJseURlc2NyaXB0b3IpIGlucHV0RWxlbWVudCkuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uKQotCQkJcmV0dXJuICEoKE1ldGhvZFBlcm1pc3Npb24pIGVsZW1lbnQpLmdldE1ldGhvZEVsZW1lbnRzKCkuaXNFbXB0eSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIFBFUk1JU1NJT05fTUVTX1NGOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKQotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBBRF9NUF9TRjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IFBFUk1JU1NJT05fTUVTX1NGIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gQURfTVBfU0YpCi0JCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSBpbnN0YW5jZW9mIENNUEF0dHJpYnV0ZSAmJiBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBQRVJNSVNTSU9OX01FU19VTkNIRUNLRURfU0YgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBQRVJNSVNTSU9OX01FU19ST0xFU19TRiB8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpKQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwZTFiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBUUkFOU0FDVElPTl9NRVNfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgQURfTVRfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBNZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiByb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kVHJhbnNhdGlvbkNvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24pCi0JCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChNZXRob2RUcmFuc2FjdGlvbikgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKE1ldGhvZFRyYW5zYWN0aW9uIG10KSB7Ci0JCUxpc3QgbWVzID0gbXQuZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucyhtdCwgbWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QsIEVudGVycHJpc2VCZWFuKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJaWYgKCEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFRyYW5zYWN0aW9uKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlNZXRob2RUcmFuc2FjdGlvbiBwYXJlbnRNVCA9IChNZXRob2RUcmFuc2FjdGlvbikgYVJlZk9iamVjdDsKLQkJaWYgKHBhcmVudE1UID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHBhcmVudE1ULmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLQkJCUVKQkphciBqYXIgPSAoRUpCSmFyKSBpbnB1dEVsZW1lbnQ7Ci0JCQlpZiAoamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGwpCi0JCQkJcmV0dXJuIGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKS50b0FycmF5KCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFzc2VtYmx5RGVzY3JpcHRvcikKLQkJCXJldHVybiAoKEFzc2VtYmx5RGVzY3JpcHRvcikgaW5wdXRFbGVtZW50KS5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikKLQkJCXJldHVybiAhKChNZXRob2RUcmFuc2FjdGlvbikgZWxlbWVudCkuZ2V0TWV0aG9kRWxlbWVudHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gVFJBTlNBQ1RJT05fTUVTX1NGOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKQotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBBRF9NVF9TRjsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1ByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1ByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODkzYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9QcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMS8yMDAxIDEyOjI4OjU1IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0KLQkvKioKLQkgKiBQcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjU0OjIyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKEVudGl0eSkgZ2V0RWpiKCkpLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAia2V5X2ludGVyZl9vdiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJpbWFyeV9LZXlfQ2xhc3NfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIlByaW1hcnkgS2V5IENsYXNzIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1JlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1JlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2I3OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9SZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjEvMjAwMSAxMjoyODoxMiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIgZXh0ZW5kcyBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo1NTo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gInJlbW90ZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmoiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbW90ZV9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIlJlbW90ZSBJbnRlcmZhY2UiCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMmIwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlciBleHRlbmRzIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5FSkIKLQkgKi8KLQlwdWJsaWMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo1Mzo0OSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gKChTZXNzaW9uKSBnZXRFamIoKSkuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQkvL1RPRE86IERGSCB3ZSBuZWVkIGFuIGljb24KLQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlcnZpY2VfRW5kcG9pbnRfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJIb21lIEludGVyZmFjZSIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9JVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvSVZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDRlYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9JVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIgZXh0ZW5kcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLCBJUGFydExpc3RlbmVyLCBTaGVsbExpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBhY3Rpb24gdGhhdCBpcyBhYm91dCB0byBlZGl0IGFueSBjb250ZW50cyBvZiBhbnkgSUZpbGUuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSByZWFkIG9ubHkgSUZpbGVzIHRoYXQgYXJlIGJlaW5nIG1hbmFnZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldFJlc291cmNlcygpCi0JICovCi0JYm9vbGVhbiBoYXNSZWFkT25seUZpbGVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHNhdmluZyB0aGUgY29udGVudHMuIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMKLQkgKiBjYW4gYmUgc2F2ZWQuCi0JICovCi0JYm9vbGVhbiBjaGVja1NhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIFNoZWxsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0byB0aGUgdXNlci4KLQkgKi8KLQl2b2lkIHNldFNoZWxsKFNoZWxsIGFTaGVsbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9WYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9WYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGM4YTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuTGlzdE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUVkaXRMaXN0ZW5lciBleHRlbmRzIFNoZWxsQWRhcHRlciBpbXBsZW1lbnRzIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciwgSVZhbGlkYXRlRWRpdENvbnRleHQgewotCQotCXByb3RlY3RlZCBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGZWYWxpZGF0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIGZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJpdmF0ZSBTaGVsbCBmU2hlbGw7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmUGFydDsKLQlwcml2YXRlIGJvb2xlYW4gZkhhc1JlYWRPbmx5RmlsZXMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZmlyc3RSZWFkT25seUZpbGVBdHRlbXB0ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZk1lc3NhZ2VVcCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNBY3RpdmF0aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0RlYWN0aXZhdGluZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpbmNvbnNpc3RlbnRSZXN1bHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGluY29uc2lzdGVudE92ZXJ3cml0ZVJlc3VsdDsKLQkKLQlwdWJsaWMgVmFsaWRhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRyeSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQkJCWlmICh3YiA9PSBudWxsKSByZXR1cm47Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCWlmICh3aW5kb3cgPT0gbnVsbCAmJiB3Yi5nZXRXb3JrYmVuY2hXaW5kb3dDb3VudCgpPjApIHsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTx3Yi5nZXRXb3JrYmVuY2hXaW5kb3dzKCkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl3aW5kb3cgPSB3Yi5nZXRXb3JrYmVuY2hXaW5kb3dzKClbaV07Ci0JCQkJCQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmICh3aW5kb3chPW51bGwpCi0JCQkJCQlzZXRTaGVsbCh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFZhbGlkYXRlRWRpdEhhbmRsZXIuCi0JICovCi0JcHVibGljIFZhbGlkYXRlRWRpdExpc3RlbmVyKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgYVZhbGlkYXRvcikgewotCQlzdXBlcigpOwotCQlmUGFydCA9IHBhcnQ7Ci0JCWZWYWxpZGF0b3IgPSBhVmFsaWRhdG9yOwotCQlpZiAocGFydCAhPSBudWxsKQotCQkJcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGdldFNoZWxsKCkgIT0gbnVsbCkKLQkJCWdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCWlmIChmU2hlbGwgPT0gbnVsbCkgewotCQkJaWYgKGZQYXJ0ICE9IG51bGwgJiYgZlBhcnQuZ2V0U2l0ZSgpICE9IG51bGwpCi0JCQkJZlNoZWxsID0gZlBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCX0KLQkJcmV0dXJuIGZTaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciNnZXRWYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIGZWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjZ2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE5lZWRzU3RhdGVWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gZk5lZWRzU3RhdGVWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI3NldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbiBuZWVkc1N0YXRlVmFsaWRhdGlvbikgewotCQlmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSBuZWVkc1N0YXRlVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCkgPT0gMCkgLy8gdGhpcyBjYXNlIHNob3VsZCBuZXZlcgotCQkJLy8gb2NjdXIuCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTGlzdCBpbmNvbnNpc3RlbnRGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCkgPiBpOyBpKyspIHsKLQkJCU9iamVjdCBmaWxlID0gaW5jb25zaXN0ZW50RmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2UpIGZpbGUpOwotCQkJCWluY29uc2lzdGVudEZpbGVOYW1lcy5hZGQoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkJfSBlbHNlIGlmIChmaWxlIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJSVJlc291cmNlIHJlc2ZpbGUgPSAoSVJlc291cmNlKSBmaWxlOwotCQkJCWlmICghcmVzZmlsZS5leGlzdHMoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWluY29uc2lzdGVudEZpbGVOYW1lcy5hZGQocmVzZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbCBTdHJpbmcgdGl0bGUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW5jb25zaXN0ZW50X0ZpbGVzXzMiKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJUaGVfZm9sbG93aW5nX3dvcmtzcGFjZV9maWxlc19hcmVfaW5jb25zaXN0ZW50X3dpdGhfdGhlX2VkaXRvcl80IikgKyBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVXBkYXRlX3RoZV9lZGl0b3Jfd2l0aF90aGVfd29ya3NwYWNlX2NvbnRlbnRzX181Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmaW5hbCBTdHJpbmdbXSBmaWxlTmFtZXMgPSAoU3RyaW5nW10paW5jb25zaXN0ZW50RmlsZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tpbmNvbnNpc3RlbnRGaWxlTmFtZXMuc2l6ZSgpXSk7Ci0JCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWluY29uc2lzdGVudFJlc3VsdCA9IExpc3RNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSwgZmlsZU5hbWVzKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBpbmNvbnNpc3RlbnRSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkgewotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJaWYgKGZJc0FjdGl2YXRpbmcpCi0JCQlyZXR1cm47Ci0JCWZJc0FjdGl2YXRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJZlZhbGlkYXRvci5jaGVja0FjdGl2YXRpb24odGhpcyk7Ci0JCQl1cGRhdGVQYXJ0UmVhZE9ubHkoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJfSBmaW5hbGx5IHsKLQkJCWZJc0FjdGl2YXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyI3NoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBldmVudCkgewotCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkKLQkJCXBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChnZXRTaGVsbCgpICE9IG51bGwpCi0JCQlnZXRTaGVsbCgpLnJlbW92ZVNoZWxsTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCA9PSBmUGFydCkgewotCQkJaWYgKGZJc0RlYWN0aXZhdGluZykKLQkJCQlyZXR1cm47Ci0JCQlmSXNEZWFjdGl2YXRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlmVmFsaWRhdG9yLmxvc3RBY3RpdmF0aW9uKHRoaXMpOwotCQkJCXVwZGF0ZVBhcnRSZWFkT25seSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZJc0RlYWN0aXZhdGluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpIHsKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICgoZlNoZWxsPT1udWxsKSAmJiAod2IgIT0gbnVsbCAmJiAod2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgIT0gbnVsbCkpKQotCQkJZlNoZWxsPXdiLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCWlmIChmTmVlZHNTdGF0ZVZhbGlkYXRpb24pIHsKLQkJCXNldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBmVmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUodGhpcyk7Ci0JCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24odHJ1ZSk7Ci0JCQkJCWlmICghZk1lc3NhZ2VVcCkgewotCQkJCQkJZk1lc3NhZ2VVcCA9IHRydWU7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVycm9yX2NoZWNraW5nX291dF9maWxlc18xMCIpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJZk1lc3NhZ2VVcCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZWYWxpZGF0b3IuY2hlY2tBY3RpdmF0aW9uKHRoaXMpOwotCQkJCXVwZGF0ZVBhcnRSZWFkT25seSgpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJCX0KLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWludCBzaXplID0gaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpOwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCWZpbGVzLmFkZChmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmluYWwgU3RyaW5nW10gaXRlbXMgPSAoU3RyaW5nW10pZmlsZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVzLnNpemUoKV0pOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWluY29uc2lzdGVudE92ZXJ3cml0ZVJlc3VsdCA9IExpc3RNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLCBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW5jb25zaXN0ZW50X2ZpbGVzX2RldGVjdGVkXzExIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlRoZV9mb2xsb3dpbmdfZmlsZXNfYXJlX2luY29uc2lzdGVudF93aXRoX3RoZV9maWxlX3N5c3RlbS5fRG9feW91X3dhbnRfdG9fc2F2ZV9hbmRfb3ZlcndyaXRlX3RoZXNlX2ZpbGVzX29uX3RoZV9maWxlX3N5c3RlbV9fMTJfV0FSTl8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlpdGVtcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaW5jb25zaXN0ZW50T3ZlcndyaXRlUmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCWZIYXNSZWFkT25seUZpbGVzID0gZlZhbGlkYXRvci5jaGVja1JlYWRPbmx5KCk7Ci0JCXJldHVybiBmSGFzUmVhZE9ubHlGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciNoYXNSZWFkT25seUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkT25seUZpbGVzKCkgewotCQlpZiAoZmlyc3RSZWFkT25seUZpbGVBdHRlbXB0KSB7Ci0JCQljaGVja1JlYWRPbmx5KCk7Ci0JCQlmaXJzdFJlYWRPbmx5RmlsZUF0dGVtcHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkhhc1JlYWRPbmx5RmlsZXM7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVwZGF0ZVBhcnRSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYXJ0UmVhZE9ubHkoKSB7Ci0JCWlmICghZ2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oKSkgewotCQkJY2hlY2tSZWFkT25seSgpOwotCQkJc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7IC8vU28gdGhhdCBKMkVFWE1MQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0IHVwZGF0ZWQgaW5mbyB3aGVuIGVkaXRvciBBY3RpdmF0ZWQuCi0JCQlmaXJzdFJlYWRPbmx5RmlsZUF0dGVtcHQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdmFsaWRhdGVTdGF0ZSgpLmlzT0soKSAmJiBnZXRWYWxpZGF0b3IoKS5jaGVja1NhdmUodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hlbGwoU2hlbGwgYVNoZWxsKSB7Ci0JCWZTaGVsbCA9IGFTaGVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBhbkVkaXRNb2RlbCkgewotCQlmVmFsaWRhdG9yID0gYW5FZGl0TW9kZWw7Ci0JCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGFuRWRpdE1vZGVsKSB7Ci0JCXNldEVkaXRNb2RlbChhbkVkaXRNb2RlbCk7Ci0JCXJldHVybiB2YWxpZGF0ZVN0YXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BlcnNwZWN0aXZlL0oyRUVQZXJzcGVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BlcnNwZWN0aXZlL0oyRUVQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgxY2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KMkVFUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA3LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKLQotLyoqCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSURfU0VSVkVSU19WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSURfSjJFRV9ISUVSQVJDSFlfVklFVyA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEX1dTVF9TTklQUEVUU19WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3IjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0VBUkNIX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnZpZXdzLlNlYXJjaFZpZXciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0RBVEFfVklFVyA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkRhdGFTb3VyY2VFeHBsb3Jlck5hdmlnYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DT05TT0xFX1ZJRVc9ICJvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVWaWV3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01BUktFUlNfVklFVz0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLkFsbE1hcmtlcnNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9UQVNLTElTVF9WSUVXPSAib3JnLmVjbGlwc2UubXlseW4udGFza3MudWkudmlld3MudGFza3MiOwotCi0JcHVibGljIEoyRUVQZXJzcGVjdGl2ZSgpIHsKLQkJc3VwZXIoKTsKLQkJLy9JZiBwcmVmZXJlbmNlIGV4aXN0cyBmb3IgYWx0ZXJuYXRlIHZpZXcsIHJlcGxhY2UuCi0JCVN0cmluZyB2aWV3ZXJJRCA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5JRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyk7Ci0JCWlmICh2aWV3ZXJJRCAhPSBudWxsKQotCQkJSURfSjJFRV9ISUVSQVJDSFlfVklFVyA9IHZpZXdlcklEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWRlZmluZUxheW91dChsYXlvdXQpOwotCQlkZWZpbmVBY3Rpb25zKGxheW91dCk7Ci0JfQotCQotCQotCi0JcHVibGljIHZvaWQgZGVmaW5lQWN0aW9ucyhJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZEFjdGlvblNldCgib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJlZU1haW5BY3Rpb25TZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUFjdGlvblNldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChJRGVidWdVSUNvbnN0YW50cy5MQVVOQ0hfQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSURlYnVnVUlDb25zdGFudHMuREVCVUdfQUNUSU9OX1NFVCk7Ci0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChJUGFnZUxheW91dC5JRF9OQVZJR0FURV9BQ1RJT05fU0VUKTsKLQotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9KMkVFX0hJRVJBUkNIWV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfU0VSVkVSU19WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfREFUQV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfV1NUX1NOSVBQRVRTX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9NQVJLRVJTX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9UQVNLTElTVF9WSUVXKTsKLQkJCi0JCS8vIHZpZXdzIC0gc2VhcmNoCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEX1NFQVJDSF9WSUVXKTsKLQkJLy8gdmlld3MgLSBkZWJ1Z2dpbmcKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfQ09OU09MRV9WSUVXKTsKLQotCQlsYXlvdXQuYWRkU2hvd0luUGFydChJRF9KMkVFX0hJRVJBUkNIWV9WSUVXKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWZpbmVMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCS8vIEVkaXRvcnMgYXJlIHBsYWNlZCBmb3IgZnJlZS4KLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCi0JCS8vIFRvcCBsZWZ0LgotCQlJRm9sZGVyTGF5b3V0IHRvcExlZnQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BMZWZ0IiwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4yNWYsIGVkaXRvckFyZWEpOy8vJE5PTi1OTFMtMSQKLQkJdG9wTGVmdC5hZGRWaWV3KElEX0oyRUVfSElFUkFSQ0hZX1ZJRVcpOwotCQl0b3BMZWZ0LmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQl0b3BMZWZ0LmFkZFBsYWNlaG9sZGVyKEphdmFVSS5JRF9UWVBFX0hJRVJBUkNIWSk7Ci0JCXRvcExlZnQuYWRkUGxhY2Vob2xkZXIoSmF2YVVJLklEX1BBQ0tBR0VTX1ZJRVcpOwotCi0JCS8vIEJvdHRvbSByaWdodC4KLQkJSUZvbGRlckxheW91dCBib3R0b21SaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbVJpZ2h0IiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjdmLCBlZGl0b3JBcmVhKTsvLyROT04tTkxTLTEkCi0JCWJvdHRvbVJpZ2h0LmFkZFZpZXcoSURfTUFSS0VSU19WSUVXKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9TRVJWRVJTX1ZJRVcpOwotCQlhZGREQlZpZXdJZlByZXNlbnQobGF5b3V0LGJvdHRvbVJpZ2h0KTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9XU1RfU05JUFBFVFNfVklFVyk7Ci0JCQotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJRF9DT05TT0xFX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFBsYWNlaG9sZGVyKElEX1NFQVJDSF9WSUVXKTsKLQotCQkvLyBUb3AgcmlnaHQuCi0JCUlGb2xkZXJMYXlvdXQgdG9wUmlnaHQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BSaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULCAwLjdmLCBlZGl0b3JBcmVhKTsvLyROT04tTkxTLTEkCi0JCXRvcFJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWFkZFRMVmlld0lmUHJlc2VudChsYXlvdXQsIHRvcFJpZ2h0KTsKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBhZGREQlZpZXdJZlByZXNlbnQoSVBhZ2VMYXlvdXQgcGFnZSxJRm9sZGVyTGF5b3V0IGJvdHRvbVJpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJSVZpZXdEZXNjcmlwdG9yIGRiVmlldyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0Vmlld1JlZ2lzdHJ5KCkuZmluZChJRF9EQVRBX1ZJRVcpOwotCQlpZiAoZGJWaWV3ICE9IG51bGwpCi0JCQlib3R0b21SaWdodC5hZGRWaWV3KElEX0RBVEFfVklFVyk7Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRUTFZpZXdJZlByZXNlbnQoSVBhZ2VMYXlvdXQgcGFnZSxJRm9sZGVyTGF5b3V0IHRvcFJpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJSVZpZXdEZXNjcmlwdG9yIHRsVmlldyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0Vmlld1JlZ2lzdHJ5KCkuZmluZChJRF9UQVNLTElTVF9WSUVXKTsKLQkJaWYgKHRsVmlldyAhPSBudWxsKQotCQkJdG9wUmlnaHQuYWRkVmlldyhJRF9UQVNLTElTVF9WSUVXKTsKLQkJfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9CaW5hcnlFZGl0b3JVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQmluYXJ5RWRpdG9yVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0M2E5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9CaW5hcnlFZGl0b3JVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWRpdG9yVXRpbGl0aWVzIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphckVudHJ5RmlsZSBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMKLQkJCUlTdG9yYWdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZW50cnlOYW1lOwotCQlwcml2YXRlIFN0cmluZyB6aXBOYW1lOwotCQlwcml2YXRlIElQYXRoIHBhdGg7Ci0KLQkJcHVibGljIEphckVudHJ5RmlsZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcgemlwTmFtZSkgewotCQkJdGhpcy5lbnRyeU5hbWUgPSBlbnRyeU5hbWU7Ci0JCQl0aGlzLnppcE5hbWUgPSB6aXBOYW1lOwotCQkJdGhpcy5wYXRoID0gbmV3IFBhdGgodGhpcy5lbnRyeU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQl0cnkgewotCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgewotCQkJCQkvLyRBTkFMWVNJUy1JR05PUkUKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmFyRW50cnlGaWxlLmdldENvbnRlbnRzKCldIENyZWF0aW5nIFppcEZpbGUgb24gIiArIHRoaXMuemlwTmFtZSk7Ci0JCQkJfQotCQkJCVppcEZpbGUgemlwRmlsZSA9IEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUodGhpcy56aXBOYW1lKTsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkodGhpcy5lbnRyeU5hbWUpOwotCQkJCWlmICh6aXBFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwKLQkJCQkJCQl0aGlzLmVudHJ5TmFtZSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6aXBFbnRyeSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLAotCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVN0b3JhZ2UjZ2V0RnVsbFBhdGgKLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiB0aGlzLnBhdGg7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJU3RvcmFnZSNnZXROYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXRoLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJU3RvcmFnZSNpc1JlYWRPbmx5KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElTdG9yYWdlI2lzUmVhZE9ubHkoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSmFyRW50cnlGaWxlWyIgKyB0aGlzLnppcE5hbWUgKyAiOjoiICsgdGhpcy5lbnRyeU5hbWUgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXJFbnRyeUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0KLQkJcHJpdmF0ZSBJU3RvcmFnZSBmSmFyRW50cnlGaWxlOwotCi0JCXB1YmxpYyBKYXJFbnRyeUVkaXRvcklucHV0KElTdG9yYWdlIGphckVudHJ5RmlsZSkgewotCQkJZkphckVudHJ5RmlsZSA9IGphckVudHJ5RmlsZTsKLQkJfQotCi0JCS8qCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSmFyRW50cnlFZGl0b3JJbnB1dCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSmFyRW50cnlFZGl0b3JJbnB1dCBvdGhlciA9IChKYXJFbnRyeUVkaXRvcklucHV0KSBvYmo7Ci0JCQlyZXR1cm4gZkphckVudHJ5RmlsZS5lcXVhbHMob3RoZXIuZkphckVudHJ5RmlsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JCSAqLwotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZkphckVudHJ5RmlsZS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElFZGl0b3JJbnB1dCNnZXRGdWxsUGF0aCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxQYXRoKCkgewotCQkJcmV0dXJuIGZKYXJFbnRyeUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRWRpdG9ySW5wdXQjZ2V0Q29udGVudFR5cGUoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJCXJldHVybiBmSmFyRW50cnlGaWxlLmdldEZ1bGxQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBmSmFyRW50cnlGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gcmVnaXN0cnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGZKYXJFbnRyeUZpbGUuZ2V0RnVsbFBhdGgoKQotCQkJCQkuZ2V0RmlsZUV4dGVuc2lvbigpKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUVkaXRvcklucHV0I2V4aXN0cygpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQkvLyBKQVIgZW50cmllcyBjYW4ndCBiZSBkZWxldGVkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogc2VlIElTdG9yYWdlRWRpdG9ySW5wdXQjZ2V0U3RvcmFnZSgpCi0JCSAqLwotCQlwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHsKLQkJCXJldHVybiBmSmFyRW50cnlGaWxlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0QmluYXJ5RWRpdG9ySW5wdXQoCi0JCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBhcmNoaXZlUmVsYXRpdmVQYXRoKSB7Ci0JCQotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBudWxsOwotCQlJUGF0aCBhcmNoaXZlUGF0aCA9IGNvbXBvbmVudC5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJCi0JCS8vW0J1ZyAyMzg2MTZdIGlmIHRoZXJlIGlzIG5vIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIHRoZW4gdGhlIGFyY2hpdmUgaXMgb3V0c2lkZQotCQkvLwl0aGUgd29ya3NwYWNlIHNvIGdldCB0aGUgT1MgcGF0aCBkaXJlY3RseSBmcm9tIHRoZSBmaWxlCi0JCWlmKGFyY2hpdmVQYXRoICE9IG51bGwpIHsKLQkJCWlucHV0ID0gZ2V0QmluYXJ5RWRpdG9ySW5wdXQoYXJjaGl2ZVBhdGgsIGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGFyY2hpdmVPU1BhdGggPSBjb21wb25lbnQuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCkuZ2V0UGF0aCgpOwotCQkJaW5wdXQgPSBnZXRCaW5hcnlFZGl0b3JJbnB1dChhcmNoaXZlT1NQYXRoLCBhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvcklucHV0IGdldEJpbmFyeUVkaXRvcklucHV0KElQYXRoIGFyY2hpdmVQYXRoLAotCQkJU3RyaW5nIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIoYXJjaGl2ZVBhdGgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFyY2hpdmVPU1BhdGggPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0QmluYXJ5RWRpdG9ySW5wdXQoYXJjaGl2ZU9TUGF0aCwgYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0JCi0JLyoqCi0JICogW0J1ZyAyMzg2MTZdCi0JICogCi0JICogR2V0cyBiaW5hcnkgZWRpdG9yIGlucHV0IGdpdmVuIGFuIE9TIHJlbGF0aXZlIHBhdGggdG8gYW4gYXJjaGl2ZSBhbmQKLQkgKiAJdGhlIGFyY2hpdmUgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZU9TUGF0aCB0aGUgT1MgcmVsYXRpdmUgcGF0aCB0byB0aGUgYXJjaGl2ZQotCSAqIEBwYXJhbSBhcmNoaXZlUmVsYXRpdmVQYXRoIHRoZSBhcmNoaXZlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgdG8gZ2V0IGJpbmFyeSBlZGl0b3IgaW5wdXQgZm9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvcklucHV0IGdldEJpbmFyeUVkaXRvcklucHV0KFN0cmluZyBhcmNoaXZlT1NQYXRoLAotCQkJU3RyaW5nIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJSmFyRW50cnlGaWxlIGphckZpbGUgPSBuZXcgSmFyRW50cnlGaWxlKGFyY2hpdmVSZWxhdGl2ZVBhdGgsIGFyY2hpdmVPU1BhdGgpOwotCQlKYXJFbnRyeUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEphckVudHJ5RWRpdG9ySW5wdXQoamFyRmlsZSk7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9Db21tb25FZGl0b3JVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWQ2NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9Db21tb25FZGl0b3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRvck1hbmFnZXI7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FZGl0b3JVdGlsaXR5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCi0JcHJpdmF0ZSBDb21tb25FZGl0b3JVdGlsaXR5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGVkaXRvcnMgdGhhdCBoYXZlIGFuIHVuc2F2ZWQgY29udGVudC4gSWYgdGhlIGlkZW50aWNhbCBjb250ZW50IGlzCi0JICogcHJlc2VudGVkIGluIG1vcmUgdGhhbiBvbmUgZWRpdG9yLCBvbmx5IG9uZSBvZiB0aG9zZSBlZGl0b3IgcGFydHMgaXMgcGFydCBvZiB0aGUgcmVzdWx0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIGRpcnR5IGVkaXRvciBwYXJ0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0W10gZ2V0RGlydHlFZGl0b3JzKCkgewotCQlyZXR1cm4gZ2V0RGlydHlFZGl0b3JzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGVkaXRvcnMgdGhhdCBoYXZlIGFuIHVuc2F2ZWQgY29udGVudCwgd2hlcmUgdGhlIGNvbnRlbnQgaXMgaW5jbHVkZSBpbgotCSAqIG9uZSBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIExpc3QgcGFyYW1ldGVyLiBJZiB0aGUgaWRlbnRpY2FsIGNvbnRlbnQgaXMgcHJlc2VudGVkIGluIG1vcmUgdGhhbgotCSAqIG9uZSBlZGl0b3IsIG9ubHkgb25lIG9mIHRob3NlIGVkaXRvciBwYXJ0cyBpcyBwYXJ0IG9mIHRoZSByZXN1bHQuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhbGwgZGlydHkgZWRpdG9yIHBhcnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoTGlzdCBwcm9qZWN0cykgewotCQlTZXQgaW5wdXRzID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEoyRUVVSVBsdWdpbi5nZXRQbHVnaW5Xb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7Ci0JCQkJSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7Ci0JCQkJZm9yIChpbnQgeiA9IDA7IHogPCBlZGl0b3JzLmxlbmd0aDsgeisrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZXAuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKCFpbnB1dHMuY29udGFpbnMoaW5wdXQpICYmIChwcm9qZWN0cyA9PSBudWxsIHx8IGlucHV0SW5Qcm9qZWN0cyhpbnB1dCwgcHJvamVjdHMpKSkgewotCQkJCQkJaW5wdXRzLmFkZChpbnB1dCk7Ci0JCQkJCQlyZXN1bHQuYWRkKGVwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElFZGl0b3JQYXJ0W10pIHJlc3VsdC50b0FycmF5KG5ldyBJRWRpdG9yUGFydFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlucHV0SW5Qcm9qZWN0cyhJRWRpdG9ySW5wdXQgaW5wdXQsIExpc3QgcHJvamVjdHMpIHsKLQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJFU09VUkNFX0NMQVNTKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJlcyA9PSBudWxsID8gbnVsbCA6IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChwcm9qZWN0LmVxdWFscyhwcm9qZWN0cy5nZXQoaSkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCkgewotCQlyZXR1cm4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzKEFycmF5cy5hc0xpc3QoZ2V0RGlydHlFZGl0b3JzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzKExpc3QgZGlydHlFZGl0b3JzKSB7Ci0JCWlmIChkaXJ0eUVkaXRvcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBFZGl0b3JNYW5hZ2VyLnNhdmVBbGwoZGlydHlFZGl0b3JzLCB0cnVlLCB0cnVlLGZhbHNlLCBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgY2xvc2UgYWxsIGVkaXRvcnMgd2l0aG91dCBwcm9tcHRpbmcgZm9yIHNhdmUuCi0JICogQHBhcmFtIGRpcnR5RWRpdG9ycwotCSAqIEByZXR1cm4gdHJ1ZSBpcyBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbEVkaXRvcnMoKSB7Ci0JCQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCXBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFRvU2F2ZURpcnR5RWRpdG9yc0luUHJvamVjdHMoTGlzdCBwcm9qZWN0cykgewotCQlyZXR1cm4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzKEFycmF5cy5hc0xpc3QoZ2V0RGlydHlFZGl0b3JzKHByb2plY3RzKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmMTFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQWRkZWQgYSBEZXRhaWxzIGJ1dHRvbiB0byB0aGUgTWVzc2FnZURpYWxvZyB0byBzaG93IHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2UuCi0gKiAKLSAqIEJvcnJvd2VkIGZyb20gYW4gZWNsaXBzZSBJbnRlcm5hbEVycm9yRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0NBTkNFTCA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMX0RFVEFJTFMgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcml2YXRlIFRocm93YWJsZSBkZXRhaWw7Ci0JcHJpdmF0ZSBpbnQgZGV0YWlsQnV0dG9uSUQgPSAtMTsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXByaXZhdGUgaW50IGRlZmF1bHRCdXR0b25JbmRleCA9IDA7Ci0JLyoqCi0JICogU2l6ZSBvZiB0aGUgdGV4dCBpbiBsaW5lcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9MSU5FX0NPVU5UID0gMTU7Ci0KLQlwdWJsaWMgRXJyb3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsIGludCBkaWFsb2dJbWFnZVR5cGUsIFN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlkZWZhdWx0QnV0dG9uSW5kZXggPSBkZWZhdWx0SW5kZXg7Ci0JCXRoaXMuZGV0YWlsID0gZGV0YWlsOwotCQltZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQl9Ci0KLQkvL1dvcmthcm91bmQuIFNXVCBkb2VzIG5vdCBzZWVtIHRvIHNldCByaWd0aCB0aGUgZGVmYXVsdCBidXR0b24gaWYKLQkvL3RoZXJlIGlzIG5vdCBjb250cm9sIHdpdGggZm9jdXMuIEJ1ZzogMTQ2NjgKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWNyZWF0ZSgpOwotCQlCdXR0b24gYiA9IGdldEJ1dHRvbihkZWZhdWx0QnV0dG9uSW5kZXgpOwotCQliLnNldEZvY3VzKCk7Ci0JCWIuZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGIpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGV0YWlsIGJ1dHRvbjsKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXRhaWxCdXR0b24oaW50IGluZGV4KSB7Ci0JCWRldGFpbEJ1dHRvbklEID0gaW5kZXg7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IGRldGFpbEJ1dHRvbklEKSB7Ci0JCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQl9IGVsc2UgewotCQkJc2V0UmV0dXJuQ29kZShidXR0b25JZCk7Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCXRleHQgPSBudWxsOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duVGV4dCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWdldEJ1dHRvbihkZXRhaWxCdXR0b25JRCkuc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQkJUG9pbnQgbmV3U2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoaXMgZGlhbG9nJ3MgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25UZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkvLyBwcmludCB0aGUgc3RhY2t0cmFjZSBpbiB0aGUgdGV4dCBmaWVsZAotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShiYW9zKTsKLQkJCWRldGFpbC5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJaWYgKChkZXRhaWwgaW5zdGFuY2VvZiBTV1RFcnJvcikgJiYgKCgoU1dURXJyb3IpIGRldGFpbCkudGhyb3dhYmxlICE9IG51bGwpKSB7Ci0JCQkJcHMucHJpbnRsbigiXG4qKiogU3RhY2sgdHJhY2Ugb2YgY29udGFpbmVkIGV4Y2VwdGlvbiAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCSgoU1dURXJyb3IpIGRldGFpbCkudGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQl9IGVsc2UgaWYgKChkZXRhaWwgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pICYmICgoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFeGNlcHRpb24pIGRldGFpbCkudGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQl9Ci0JCQlwcy5mbHVzaCgpOwotCQkJYmFvcy5mbHVzaCgpOwotCQkJdGV4dC5zZXRUZXh0KGJhb3MudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogVEVYVF9MSU5FX0NPVU5UOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsIGludCBkZWZhdWx0SW5kZXgsIGJvb2xlYW4gc2hvd0NhbmNlbCkgewotCQlTdHJpbmdbXSBsYWJlbHM7Ci0JCWlmIChkZXRhaWwgPT0gbnVsbCkKLQkJCWxhYmVscyA9IHNob3dDYW5jZWwgPyBMQUJFTFNfT0tfQ0FOQ0VMIDogTEFCRUxTX09LOwotCQllbHNlCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTF9ERVRBSUxTIDogTEFCRUxTX09LX0RFVEFJTFM7Ci0JCUVycm9yRGlhbG9nIGRpYWxvZyA9IG5ldyBFcnJvckRpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgZGV0YWlsLCBFUlJPUiwgbGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlpZiAoZGV0YWlsICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0RGV0YWlsQnV0dG9uKGxhYmVscy5sZW5ndGggLSAxKTsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQkJLy8gY3JlYXRlIGltYWdlCi0JCUltYWdlIGltYWdlID0gY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIDApOwotCQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJfQotCQkvLyBjcmVhdGUgbWVzc2FnZQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDRmNGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRmFjZXRlZFByb2plY3RBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyCi0gICAgCi17Ci0gICAgcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZSggZmluYWwgT2JqZWN0IHRhcmdldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgIAkKLSAgICAgICAgaWYoIG5hbWUuZXF1YWxzKCAiZmFjZXQiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpdGFyZ2V0OwotICAgICAgICAJSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gbnVsbDsKLSAgICAgICAgCWlmKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpewotCQkJCXRyeSB7Ci0JCQkJCWZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0ICk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCQkJCX0KLSAgICAgICAgCX0KLQotICAgICAgICAgICAgaWYoIGZwcm9qICE9IG51bGwgKXsKLQkgICAgICAgICAgICBmaW5hbCBpbnQgY29sb24gPSB2YWx1ZS5pbmRleE9mKCAnOicgKTsKLQkgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkOwotCSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXhwcnN0cjsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBpZiggY29sb24gPT0gLTEgfHwgY29sb24gPT0gdmFsdWUubGVuZ3RoKCkgLSAxICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGZpZCA9IHZhbHVlOwotCSAgICAgICAgICAgICAgICB2ZXhwcnN0ciA9IG51bGw7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGZpZCA9IHZhbHVlLnN1YnN0cmluZyggMCwgY29sb24gKTsKLQkgICAgICAgICAgICAgICAgdmV4cHJzdHIgPSB2YWx1ZS5zdWJzdHJpbmcoIGNvbG9uICsgMSApOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBmaWQgKTsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBpZiggISBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGYgKSApCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGlmKCB2ZXhwcnN0ciA9PSBudWxsICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIGYgKTsKLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgIHRyeQotCSAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICBpZiggZi5nZXRWZXJzaW9ucyggdmV4cHJzdHIgKS5jb250YWlucyggZnYgKSApCi0JICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgCS8vRUpCVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMzZkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldGVkUHJvamVjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFUzsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVFZGl0b3JVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVFZGl0b3JVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2UwMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFRWRpdG9yVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhQ2xhc3NKRE9NQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBBIG51bWJlciBvZiByb3V0aW5lcyBmb3Igd29ya2luZyB3aXRoIEphdmFFbGVtZW50cyBpbiBlZGl0b3JzCi0gKiAKLSAqIFVzZSAnaXNPcGVuSW5FZGl0b3InIHRvIHRlc3QgaWYgYW4gZWxlbWVudCBpcyBhbHJlYWR5IG9wZW4gaW4gYSBlZGl0b3IgVXNlICdvcGVuSW5FZGl0b3InIHRvCi0gKiBmb3JjZSBvcGVuaW5nIGFuIGVsZW1lbnQgaW4gYSBlZGl0b3IgV2l0aCAnZ2V0V29ya2luZ0NvcHknIHlvdSBnZXQgdGhlIHdvcmtpbmcgY29weSAoZWxlbWVudCBpbgotICogdGhlIGVkaXRvcikgb2YgYW4gZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVkaXRvclV0aWxpdHkgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSkFWQV9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLm1pc2MuRUpCSmF2YUVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGphdmFDbGFzcyk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdChqYXZhQ2xhc3MsIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YUNsYXNzIGphdmFDbGFzcywgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRDb21waWxhdGlvblVuaXQoamF2YUNsYXNzLCBqYXZhUHJvaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhQ2xhc3MgamF2YUNsYXNzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKGphdmFDbGFzcyk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXR1cm4gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVHlwZSBnZXRUeXBlKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBhZGFwdG9yID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIoamF2YUNsYXNzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAoYWRhcHRvciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdG9yLmdldFNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBuZXcgRmlsZUVkaXRvcklucHV0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpIGlucHV0KSk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSBpbnB1dCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcCA9IGdldENvbXBpbGF0aW9uVW5pdChqYXZhQ2xhc3MpOwotCQlpZiAoY29tcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG51bGw7Ci0JCWlucHV0ID0gRWRpdG9yVXRpbGl0eS5nZXRFZGl0b3JJbnB1dChjb21wKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXJldHVybiAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlKYXZhTW9kZWwgamF2YU1vZGVsID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhTW9kZWwoKTsKLQkJcmV0dXJuIGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChhUHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhY2thZ2VGcmFnbWVudCBmb3IgdGhlIEphdmFQYWNrYWdlIGZvcgotCSAqIAotCSAqIEBqYXZhQ2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChKYXZhQ2xhc3MgamF2YUNsYXNzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSmF2YVBhY2thZ2UgamF2YVBhY2thZ2UgPSAoSmF2YVBhY2thZ2UpIGphdmFDbGFzcy5lQ29udGFpbmVyKCk7Ci0JCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gamF2YVBhY2thZ2UuZ2V0TmFtZSgpOwotCQkJCUlQYWNrYWdlRnJhZ21lbnRbXSBwa2dGcmFncyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBrZ0ZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICgocGtnRnJhZ3NbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpKSkKLQkJCQkJCXJldHVybiBwa2dGcmFnc1tpXTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBKYXZhIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBKYXZhCi0JICogY2xhc3MgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRWRpdG9yUGFydCBvciBudWxsIGlmIHdyb25nIGVsZW1lbnQgdHlwZSBvciBvcGVuaW5nIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MsIElQcm9qZWN0IGFQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBvcGVuSW5FZGl0b3IoamF2YUNsYXNzLCBnZXRKYXZhUHJvamVjdChhUHJvamVjdCkpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgSmF2YSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlmIHRoZSBlbGVtZW50IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IG9yIGEgSmF2YQotCSAqIGNsYXNzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSUVkaXRvclBhcnQgb3IgbnVsbCBpZiB3cm9uZyBlbGVtZW50IHR5cGUgb3Igb3BlbmluZyBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihKYXZhQ2xhc3MgamF2YUNsYXNzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGphdmFDbGFzcyA9PSBudWxsIHx8IGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVR5cGUgdHlwZSA9IGdldFR5cGUoamF2YUNsYXNzKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBvcGVuSW5FZGl0b3IoZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFDbGFzcywgamF2YVByb2plY3QpKTsKLQkJcmV0dXJuIEVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKHR5cGUpOwotCX0KLQotCi0JLyoqCi0JICogT3BlbnMgYSBKYXZhIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBKYXZhCi0JICogY2xhc3MgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRWRpdG9yUGFydCBvciBudWxsIGlmIHdyb25nIGVsZW1lbnQgdHlwZSBvciBvcGVuaW5nIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGVkaXRvcklkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBvcGVuSW5FZGl0b3IoZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFDbGFzcywgamF2YVByb2plY3QpLCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBKYXZhIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBKYXZhCi0JICogY2xhc3MgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRWRpdG9yUGFydCBvciBudWxsIGlmIHdyb25nIGVsZW1lbnQgdHlwZSBvciBvcGVuaW5nIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElDb21waWxhdGlvblVuaXQgYUNvbXBpbGF0aW9uVW5pdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoYUNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBKYXZhIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBKYXZhCi0JICogY2xhc3MgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRWRpdG9yUGFydCBvciBudWxsIGlmIHdyb25nIGVsZW1lbnQgdHlwZSBvciBvcGVuaW5nIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElDb21waWxhdGlvblVuaXQgYUNvbXBpbGF0aW9uVW5pdCwgU3RyaW5nIGVkaXRvcklkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBvcGVuSW5FZGl0b3IoRWRpdG9yVXRpbGl0eS5nZXRFZGl0b3JJbnB1dChhQ29tcGlsYXRpb25Vbml0KSwgZWRpdG9ySWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihJRWRpdG9ySW5wdXQgaW5wdXQsIFN0cmluZyBlZGl0b3JJRCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHAgPSBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcC5vcGVuRWRpdG9yKGlucHV0LCBlZGl0b3JJRCwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZjQ0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAzMCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGNsYXNzIEoyRUVVSUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSUxBVU5DSEFCTEVfQ0xBU1MgPSBJTGF1bmNoYWJsZS5jbGFzczsKLQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSjJFRVVJQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJaWYgKGFkYXB0ZXJUeXBlID09IElMQVVOQ0hBQkxFX0NMQVNTKQotCQkJCXJldHVybiBhZGFwdGFibGVPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lMQVVOQ0hBQkxFX0NMQVNTfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSUNvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgwNTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFVUlDb250ZXh0SWRzIHsKLQotCS8vCURlbGV0ZSBFbnRlcnByaXNlIEJlYW4gRGlhbG9nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0VOVEVSUFJJU0VfQkVBTl9ESUFMT0cgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5kZWxiMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGIwN2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgU3RlZmFuIERpbW92LCBzdGVmYW4uZGltb3ZAc2FwLmNvbSAtIGJ1ZyAyMDc4MjYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5NZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVVJTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSjJFRVVJTWVzc2FnZXMgSU5TVEFOQ0UgPSBuZXcgSjJFRVVJTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9DX0xCTCA9ICIxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9SVU5USU1FX0xCTCA9ICIyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfVkVSU0lPTl9MQkwgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9MT0FEX0VSUk9SID0gIjQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfV0laX1RJVExFID0gIjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9ICI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01BSU5fUEdfREVTQyA9ICI3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01PRFVMRVNfUEdfVElUTEUgPSAiOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NT0RVTEVTX1BHX0RFU0MgPSAiOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NT0RVTEVTX1BHX1NFTEVDVCA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NT0RVTEVTX1BHX0RFU0VMRUNUID0gIjExIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01PRFVMRVNfUEdfTkVXID0gIjEyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9QUk9KRUNUX0ZPUl9NT0RVTEVfQ1JFQVRJT04gPSAiMTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RIUkVFX0RPVFNfRSA9ICIxNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEhSRUVfRE9UU19XID0gIjE0YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX01PRFVMRVRPX0VBUl9QUk9KRUNUID0gIjE1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NT0RfU0VMX1BHX1RJVExFID0gIjE2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NT0RfU0VMX1BHX0RFU0MgPSAiMTciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX01PRF9XSVpfVElUTEUgPSAiMTgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX01PRF9TRUxfUEdfREVGX0JUTiA9ICIxOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX1BST0pfTEJMID0gIjIwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KX0xCTCA9ICIyMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSl9MQkwgPSAiMjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1BST0pfTEJMID0gIjIzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX1dJWl9USVRMRSA9ICIyNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX1ZFUlNJT05fTEJMID0gIjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX01BSU5fUEdfVElUTEUgPSAiMjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9TRVRUSU5HUyA9ICIxMDEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX1BST0pFQ1RfTUFJTl9QR19ERVNDID0gIjI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RJVExFID0gIjI3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfREVTQyA9ICIyOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9BVkFJTEFCTEVfSkFSUyA9ICIyOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9DTEFTU1BBVEggPSAiMzAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfTU9EVUxFID0gIjMxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QgPSAiMzIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xCTCA9ICIzMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9NQUlOX1BHX0RFU0MgPSAiMzQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9JTVBPUlRfTUFJTl9QR19USVRMRSA9ICIzNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9GSUxFX0xBQkVMID0gIjM2IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9JTVBPUlRfUFJPSkVDVF9MQUJFTCA9ICIzNyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9XSVpfVElUTEUgPSAiMzgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9NQUlOX1BHX0RFU0MgPSAiMzkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gIjQwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfRklMRV9MQUJFTCA9ICI0MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSV1JJVEVfUkVTT1VSQ0VTID0gIjQyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9UWVBFID0gIjQzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9UWVBFX0JJTkFSWSA9ICI0NCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfVFlQRV9TT1VSQ0UgPSAiNDUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QQVJUSUFMX0RFVkVMT1BNRU5UID0gIjQ2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX1VUSUxfQlVUVE9OID0gIjQ4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfU0VMRUNUX0FMTF9VVElMX0JVVFRPTiA9ICI0NyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX0pBUlNfR1JPVVAgPSAiNDkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9TRUxFQ1RfVVRJTF9KQVJTX1RPX0JFX1BST0pFQ1RTID0gIjUwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9QR19ERVNDID0gIjUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9QR19USVRMRSA9ICI1MiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0xPQ0FUSU9OU19HUk9VUCA9ICI1MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJPSkVDVF9HUk9VUF9ERVNDUklQVElPTiA9ICI1NCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfREVGQVVMVF9ST09UX1JBRElPID0gIjU1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BTFRFUk5BVEVfUk9PVF9SQURJTyA9ICI1NiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRElSRUNUT1JZX0RMRyA9ICI1NyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX01vZHVsZXNfaW5fRUFSID0gIjU4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfTmV3X1Byb2plY3RfTmFtZSA9ICI1OSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX0ZJTEVOQU1FUyA9ICI2MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1ROQU1FUyA9ICI2MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX0VYUE9SVF9ERVNUSU5BVElPTiA9ICI2MiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX0VYUE9SVF9PVkVSV1JJVEVfQ0hFQ0tCT1ggPSAiNjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9FWFBPUlRfU09VUkNFX0NIRUNLQk9YID0gIjY0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfRVhQT1JUX01BSU5fUEdfVElUTEUgPSAiNjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9FWFBPUlRfTUFJTl9QR19ERVNDID0gIjY2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9XSVpfVElUTEUgPSAiNjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9NQUlOX1BHX1RJVExFID0gIjY4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9FWFBPUlRfTUFJTl9QR19ERVNDID0gIjY5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9FWFBPUlRfSU5DTFVERV9QUk9KRUNUX0ZJTEVTID0gIjcwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9FWFBPUlRfSU5DTFVERV9QUk9KRUNUX0ZJTEVTX0RFU0MgPSAiNzEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9JTkNMVURFX1BST0pFQ1QgPSAiNzIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9PVkVSV1JJVEVfTkVTVEVEID0gIjc0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9QUk9KRUNUID0gIjc1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUFJPSkVDVF9MQUJFTCA9ICI3NiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vc3RyaW5nIGZvciBtaWdyYXRpb24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9USVRMRSA9ICI3NyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gIjc4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9QUk9KRUNUID0gIjc5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DQU5OT1RfQkVfUEVSRk9STUVEX09OX0JJTl9QUk9KRUNUID0gIjgwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9STUFUSU9OX1VJXyA9ICI4MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9TRU5fT1BfTk9UX0FWQUlMQUJMRSA9ICI4MiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FSkJfQ0xJRU5UX0pBUiA9ICI5MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQU5OT1RBVElPTlMgPSAiOTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FOTk9UQVRJT05TX1NFUlZMRVQgPSAiOTgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0FOTk9UQVRJT05TX1NVUFBPUlQgPSAiOTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFX0xBQkVMID0gIjkzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTEFCRUwgPSAiOTQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0NSRUFURV9NQUlOID0gIjk1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUZBVUxUX1NFU1NJT05fQkVBTiA9ICI5NiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRSA9ICI5OSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVkVSU0lPTl9MQUJFTCA9ICIxMDAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX1VUSUxJVFlfSkFSX0xJU1RFQVJfSU1QT1JUX1NFTEVDVF9VVElMX0pBUlNfVE9fQkVfUFJPSkVDVFMgPSAiOTciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9FWFBPUlRfUlVOVElNRSA9ICIxMDMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEVYSUJMRV9QUk9KRUNUX1dJWl9USVRMRSA9ICJGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEVYSUJMRV9QUk9KRUNUX01BSU5fUEdfVElUTEUgPSAiRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxFWElCTEVfUFJPSkVDVF9NQUlOX1BHX0RFU0MgPSAiRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX1dJWl9USVRMRSA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX01BSU5fUEdfVElUTEUgPSAiRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9NQUlOX1BHX0RFU0MgPSAiRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX1NFQ09ORF9QR19USVRMRSA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfU0VDT05EX1BHX0RFU0MgPSAiRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuc2Vjb25kUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfTU9EVUxFX0RFUEVOREVOQ0lFU19MQUJFTCA9ICJKMkVFTW9kdWxlRGVwZW5kZW5jaWVzLmxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT01QT05FTlRfV0laX1RJVExFID0gIkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT01QT05FTlRfTUFJTl9QR19USVRMRSA9ICJBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09NUE9ORU5UX01BSU5fUEdfREVTQyA9ICJBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1dJWl9USVRMRSA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfVElUTEUgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfREVTQyA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0VKQl9NT0RVTEVfTEJMID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5lamIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9XRUJfTU9EVUxFX0xCTCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwud2ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfSkNBX01PRFVMRV9MQkwgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmpjYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0FQUENMSUVOVF9NT0RVTEVfTEJMID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9ORVdfTU9EX1NFTF9QR19ERUZfQlROID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5idXR0b24uc2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9MREVSX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkZPTERFUl9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlJPV1NFX0JVVFRPTl9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJCUk9XU0VfQlVUVE9OX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1BBQ0tBR0VfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9QQUNLQUdFX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19OQU1FX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkNMQVNTX05BTUVfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiU1VQRVJDTEFTU19MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBnZXRSZXNvdXJjZVN0cmluZygiQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBnZXRSZXNvdXJjZVN0cmluZygiQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0cgPSBnZXRSZXNvdXJjZVN0cmluZygiQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0ciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IGdldFJlc291cmNlU3RyaW5nKCJQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkUgPSBnZXRSZXNvdXJjZVN0cmluZygiUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBnZXRSZXNvdXJjZVN0cmluZygiU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IGdldFJlc291cmNlU3RyaW5nKCJTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JVVFRPTl9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJBRERfQlVUVE9OX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlJFTU9WRV9CVVRUT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19CVVRUT04gPSBnZXRSZXNvdXJjZVN0cmluZygiWUVTX0JVVFRPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQlVUVE9OID0gZ2V0UmVzb3VyY2VTdHJpbmcoIk5PX0JVVFRPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0tfQlVUVE9OID0gZ2V0UmVzb3VyY2VTdHJpbmcoIk9LX0JVVFRPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOQ0VMX0JVVFRPTiA9IGdldFJlc291cmNlU3RyaW5nKCJDQU5DRUxfQlVUVE9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUlkgPSBnZXRSZXNvdXJjZVN0cmluZygiQklOQVJZIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IGdldFJlc291cmNlU3RyaW5nKCJJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFPSJKQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFVVElMSVRZX01BSU5fUEdfVElUTEUgPSAiSkFWQVVUSUxJVFlfTUFJTl9QR19USVRMRSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFVVElMSVRZX01BSU5fUEdfREVTQyA9ICJKQVZBVVRJTElUWV9NQUlOX1BHX0RFU0MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVkFJTEFCTEVfSjJFRV9DT01QT05FTlRTPSJBVkFJTEFCTEVfSjJFRV9DT01QT05FTlRTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0pBUj0iRVhURVJOQUxfSkFSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9KQVI9IlBST0pFQ1RfSkFSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREVkFSSUFCTEU9IkFERFZBUklBQkxFIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0xJQl9ESVIgPSJDSEFOR0VfTElCX0RJUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0REX01TR19USVRMRSA9ICJOT19ERF9NU0dfVElUTEUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5fRERfUVVFU1RJT04gPSAiR0VOX0REX1FVRVNUSU9OIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfTElCX0RJUl9IRUFEID0gIkNIQU5HRV9MSUJfRElSX0hFQUQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElCX0RJUl9QUk9QTVBUID0gIk5FV19MSUJfRElSX1BST1BNUFQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTEFOS19MSUJfRElSID0gIkJMQU5LX0xJQl9ESVIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTEFOS19MSUJfRElSX0NPTkZJUk0gPSAiQkxBTktfTElCX0RJUl9DT05GSVJNIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxBTktfTElCX0RJUl9XQVJOX1FVRVNUSU9OID0gIkJMQU5LX0xJQl9ESVJfV0FSTl9RVUVTVElPTiI7Ly8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1BBVEggPSAiSU5WQUxJRF9QQVRIIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9QQVRIX01TRyA9ICJJTlZBTElEX1BBVEhfTVNHIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DWV9DT05GTElDVF9USVRMRSA9ICJERVBFTkRFTkNZX0NPTkZMSUNUX1RJVExFIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMSA9ICJERVBFTkRFTkNZX0NPTkZMSUNUX01TR18xIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMiA9ICJERVBFTkRFTkNZX0NPTkZMSUNUX01TR18yIjsvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX05PVF9TSE9XX1dBUk5JTkdfQUdBSU4gPSAiRE9fTk9UX1NIT1dfV0FSTklOR19BR0FJTiI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRNVUxUSVBMRU1PRFVMRVM9IlNVUFBPUlRNVUxUSVBMRU1PRFVMRVMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VGT0xERVI9IlNPVVJDRUZPTERFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRk9MREVSID0gIjEwMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1ZFUl9IRUxQX0ZPUl9ESVNBQkxFRF9MSUJTID0gIkhPVkVSX0hFTFBfRk9SX0RJU0FCTEVEX0xJQlMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSU5TVEFOQ0UuZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIEoyRUVVSU1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzI2luaXRpYWxpemVCdW5kbGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiajJlZV91aSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzMTI0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEoyRUVVSVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggbG9jYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEoyRUVVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKMkVFVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSBnZXRJbnN0YWxsVVJMKCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBpbnN0YWxsTG9jYXRpb24gPSAoKFBsYXRmb3JtVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCkpLmdldFVSTEFzTG9jYWwoKS5nZXRGaWxlKCk7Ci0JCQkJbG9jYXRpb24gPSBuZXcgUGF0aChpbnN0YWxsTG9jYXRpb24pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW5zdGFsbF9Mb2NhdGlvbl9FcnJvcl8iLCBuZXcgT2JqZWN0W117dXJsfSkgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcmNoaXZlRGVmYXVsdFByb2plY3ROYW1lKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWlmIChhbkFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXRVUkkoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0VXRpbFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXROYW1lKCksIHR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVEZWZhdWx0UHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUsIEhhc2hTZXQgbW9kdWxlTmFtZXMpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0UHJvamVjdE5hbWUoYW5BcmNoaXZlLmdldFVSSSgpLCB0eXBlLCBtb2R1bGVOYW1lcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJjaGl2ZVR5cGUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaW50IHR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVKQkpBUkZJTEU7Ci0JCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5XQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCQkJdHlwZSA9IEltcG9ydFV0aWwuUkFSRklMRTsKLQkJCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVBUkZJTEU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgdGV4dCwgaW50IHR5cGUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHRleHQpOwotCQl0ZXh0ID0gcGF0aC5tYWtlUmVsYXRpdmUoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRleHQpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQlleGlzdHMgPSB0cnVlOwotCQlpZiAoZXhpc3RzICYmIHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV0udG9Mb3dlckNhc2UoKSkgPT0gLTEpCi0JCQl0ZXh0ID0gdGV4dCArIEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV07Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDEpID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiAoaSA8IHByb2plY3RzLmxlbmd0aCk7IGkrKykgewotCQkJCWlmICgocHJvamVjdHNbaV0pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGl0ZXJhdGVkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBpdGVyYXRlZFByb2plY3ROYW1lOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKFN0cmluZyB0ZXh0LCBpbnQgdHlwZSwgSGFzaFNldCBtb2R1bGVOYW1lcykgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodGV4dCk7Ci0JCXRleHQgPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCi0JCWJvb2xlYW4gaXNWYWxpZE5hbWUgPSBtb2R1bGVOYW1lcy5hZGQodGV4dCk7Ci0JCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGV4dCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkJCWV4aXN0cyA9IHRydWU7Ci0JCWlmICghaXNWYWxpZE5hbWUgfHwgKGV4aXN0cyAmJiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKSkKLQkJCXRleHQgPSB0ZXh0ICsgSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCAxMDsgaisrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlTdHJpbmcgaXRlcmF0ZWRQcm9qZWN0TmFtZSA9IHRleHQgKyAoKGogPT0gMSkgPyAiIiA6IEludGVnZXIudG9TdHJpbmcoaikpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgdXNlZCBieSB3ZWIgZWRpdG9yCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoU3RyaW5nIHRleHQsIGludCB0eXBlKSB7Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3IpICsgMSk7Ci0JCWludCBpID0gdGV4dC5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaSA+IDApCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaSk7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKQotCQkJdGV4dCA9IHRleHQgKyBJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDApID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya2JlbmNoCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGoyZWUgcGx1Z2luIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0UGx1Z2luV29ya2JlbmNoKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQkgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJIGlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkgCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJIH0KLQkJIHJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZWNvcmQgYW4gZXJyb3IgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGFuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbHVnaW4uCi0JICogIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIHBsdWdpbidzIGlkIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGFDb2RlLAotCQkJU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIGFDb2RlLAotCQkJCWFNZXNzYWdlICE9IG51bGwgPyBhTWVzc2FnZSA6ICJObyBtZXNzYWdlLiIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW5JY29ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW5JY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwODQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luSWNvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVUlQbHVnaW5JY29ucyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIgPSAiaW1wb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF9yYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9JTVBPUlRfV0laQVJEX0JBTk5FUiA9ICJpbXBvcnRfZWpiamFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF9hcHBjbGllbnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfV0laQVJEX0JBTk5FUiA9ICJpbXBvcnRfd2FyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfV0laX0JBTk5FUiA9ICJlYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gImFwcGNsaWVudF93aXoiOyAvLyROT04tTkxTLTEkCi0JLy9FSkIgSWNvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gImVqYnByb2plY3Rfd2l6IjsgLy8kTk9OLU5MUy0xJAotCS8vV0VCIEljb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfV0laQVJEX0JBTk5FUiA9ICJ3YXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCS8vSkNBIEljb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1BST0pFQ1RfV0laQVJEX0JBTk5FUiA9ICJjb25uZWN0b3Jfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X2FwcGNsaWVudF93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0VYUE9SVF9XSVpBUkRfQkFOTkVSID0gImV4cG9ydF9lamJqYXJfb2JqIjsgLy8kTk9OLU5MUy0xJDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X3dhcl93aXoiOyAvLyROT04tTkxTLTEkOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9FWFBPUlRfV0laQVJEX0JBTk5FUiA9ICJleHBvcnRfcmFyX3dpeiI7IC8vJE5PTi1OTFMtMSQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSID0gImV4cG9ydF9lYXJfd2l6IjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vTWlncmF0aW9uIFdpemFyZCBJY29ucwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19UQVNLID0gInNob3d3YXJuX3RzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9CQU5ORVIgPSAiZWpiY2xpZW50amFyX3dpemJhbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfQkFOTkVSID0gInZlcnNpb25taWdyYXRlM193aXoiOyAvLyROT04tTkxTLTEkCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGNmODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotcHVibGljIGNsYXNzIEoyRUVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVWaWV3ZXJTb3J0ZXIuCi0JICovCi0JcHVibGljIEoyRUVWaWV3ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKHNob3VsZFNvcnQoZTEsIGUyKSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlQmVhbihPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvKSB7Ci0JCXJldHVybiBDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNvcnQoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIChpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMSkgJiYgaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZTIpKSB8fCAoaXNFbnRlcnByaXNlQmVhbihlMSkgJiYgaXNFbnRlcnByaXNlQmVhbihlMikpIHx8ICgoZTEgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKGUyIGluc3RhbmNlb2YgSUZpbGUpKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9VSVByb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vVUlQcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjRmOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9VSVByb2plY3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZXRyaWV2aW5nIHRoZSBwcm9qZWN0IGZyb20gdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIFVJUHJvamVjdFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcm9qZWN0IChyZWdhcmRsZXNzIG9mIG5hdHVyZSkgaW4gdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbiwgKFN0cmluZ1tdKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROYXR1cmVJZAotCSAqICAgICAgICAgICAgVGhlIHJlcXVpcmVkIE5hdHVyZSBJRAotCSAqIEByZXR1cm4gVGhlIGZpcnN0IHByb2plY3QsIG9ubHkgaWYgdGhlIGZpcnN0IHByb2plY3QgaGFzIHRoZSBnaXZlbiBuYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBleHBlY3RlZE5hdHVyZUlkKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uLCBuZXcgU3RyaW5nW10ge2V4cGVjdGVkTmF0dXJlSWR9KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gcG9zc2libGVOYXR1cmVJZHMKLQkgKiAgICAgICAgICAgIEEgbGlzdCBvZiBwb3NzaWJsZSBuYXR1cmUgaWRzCi0JICogQHJldHVybiBUaGUgZmlyc3QgcHJvamVjdCBzZWxlY3RlZCwgb25seSBpZiBpdCBoYXMgQVQgTEVBU1QgT05FIG9mIHRoZSBwb3NzaWJsZSBuYXR1cmUgaWRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmdbXSBwb3NzaWJsZU5hdHVyZUlkcykgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhzZWxlY3Rpb24sIHBvc3NpYmxlTmF0dXJlSWRzKTsKLQkJaWYgKHByb2plY3RzID09IG51bGwgfHwgcHJvamVjdHMubGVuZ3RoPT0wKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwcm9qZWN0c1swXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIEFsbCBzZWxlY3RlZCBQcm9qZWN0cywgcmVnYXJkbGVzcyBvZiBuYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEFsbFNlbGVjdGVkUHJvamVjdHMoc2VsZWN0aW9uLCAoU3RyaW5nW10pIG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIEBwYXJhbSBleHBlY3RlZE5hdHVyZUlkCi0JICogICAgICAgICAgICBUaGUgZXhwZWN0ZWQgbmF0dXJlIGlkCi0JICogQHJldHVybiBBbGwgc2VsZWN0ZWQgUHJvamVjdHMgd2hpY2ggaGF2ZSB0aGUgZXhwZWN0ZWQgbmF0dXJlIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFNlbGVjdGVkUHJvamVjdHMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZXhwZWN0ZWROYXR1cmVJZCkgewotCQlyZXR1cm4gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhzZWxlY3Rpb24sIG5ldyBTdHJpbmdbXSB7ZXhwZWN0ZWROYXR1cmVJZH0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIEBwYXJhbSBwb3NzaWJsZU5hdHVyZUlkcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHBvc3NpYmxlIG5hdHVyZSBpZHMKLQkgKiBAcmV0dXJuIEFsbCBzZWxlY3RlZCBQcm9qZWN0cyB3aGljaCBoYXZlIEFUIExFQVNUIE9ORSBvZiB0aGUgZ2l2ZW4gbmF0dXJlIGlkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxTZWxlY3RlZFByb2plY3RzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nW10gcG9zc2libGVOYXR1cmVJZHMpIHsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCUxpc3QgcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHNlbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCW9iaiA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCQkJLy9DaGVjayBmb3IgSUphdmFFbGVtZW50cy4KLQkJCQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkJCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXByb2plY3QgPSBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBTZWxlY3Rpb24gbWF5IG5vdCBiZSBhZGFwdGFibGUgdG8gYSBwcm9qZWN0IHNvIGNvbnRpbnVlIHRyeWluZyB0byBnZXQgc2VsZWN0ZWQgcHJvamVjdAotCQkJCWlmIChwcm9qZWN0ID09IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCQllbHNlIGlmIChwcm9qZWN0ID09IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCB0ZW1wID0gKChJdGVtUHJvdmlkZXIpIG9iaikuZ2V0UGFyZW50KEVPYmplY3QuY2xhc3MpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgdGVtcCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb2plY3QgPT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBJRmlsZSkgCi0JCQkJCXByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qob2JqKTsKLQotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcG9zc2libGVOYXR1cmVJZHMgIT0gbnVsbCAmJiBwb3NzaWJsZU5hdHVyZUlkcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlTmF0dXJlSWRzLmxlbmd0aDsgaSsrKQotCQkJCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShwb3NzaWJsZU5hdHVyZUlkc1tpXSkpCi0JCQkJCQkJCXByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQkJfSAKLQkJCQkKLQkJCQllbHNlCi0JCQkJCXByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCX0KLQkJCUlQcm9qZWN0W10gZmluYWxQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldOwotCQkJcHJvamVjdHMudG9BcnJheShmaW5hbFByb2plY3RzKTsKLQkJCXJldHVybiBmaW5hbFByb2plY3RzOwotCQl9Ci0JCXJldHVybiBuZXcgSVByb2plY3RbMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmMxYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSBtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCXByb3RlY3RlZCBMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQltZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSA9IG5ldyBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZShhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCi0JCWlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3Iob2JqZWN0KSkKLQkJCXJldHVybiBtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5nZXRQYXJlbnQob2JqZWN0KTsKLQotCQkvL0FkZGVkIHNvIGludGVybmFsRXhwYW5kKCkgaW4gQWJzdHJhY3RUcmVlVmlld2VyIGtub3dzIHRoYXQgRUpCJ3MgcGFyZW50IGlzIG5vdyBpbnN0YW5jZQotCQkvLyBvZiBKMkVFSXRlbVByb3ZpZGVyCi0JCS8vcmF0aGVyIHRoYW4gRUpCSmFyIG9ubHkgaWYgYmVhbiBpcyByb290IGJlYW4KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuICYmIEdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIuaXNSb290QmVhbigoRW50ZXJwcmlzZUJlYW4pIG9iamVjdCkpIHsKLQkJCUoyRUVJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyLmdldEVKQkl0ZW1Qcm92aWRlcigoRW50ZXJwcmlzZUJlYW4pIG9iamVjdCk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCi0JCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQotCQkvLwkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCS8vCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCS8vCQkJCXJldHVybiBKMkVFUm9vdC5pbnN0YW5jZSgpLmdyb3VwRm9yKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLwkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRU1GRWRpdE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MpOwotCQlyZXR1cm4gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCi0JCWlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IocGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCWVsc2UgaWYgKGlzRU1GRWRpdE9iamVjdChwYXJlbnRFbGVtZW50KSkKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Um9vdHMoaW5wdXRFbGVtZW50KTsKLQkJLy8JCWVsc2UgaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihpbnB1dEVsZW1lbnQpKQotCQkvLwkJCXJldHVybiBtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5nZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQkvLwkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldFJvb3RzKE9iamVjdCBwYXJlbnQpIHsKLQkJaWYgKHJvb3RzLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gajJlZUdyb3VwcyA9IHN1cGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQlyb290cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqMmVlR3JvdXBzKSk7Ci0JCX0KLQkJcmV0dXJuIHJvb3RzLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IoZWxlbWVudCkpCi0JCQlyZXR1cm4gbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCWVsc2UgaWYgKGlzRU1GRWRpdE9iamVjdChlbGVtZW50KSkKLQkJCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSAhPSBudWxsKQotCQkJbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCW1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmlucHV0Q2hhbmdlZChhVmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjc1OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDEwOjQwOjQxIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJSXRlbUxhYmVsUHJvdmlkZXJDbGFzcyA9IElJdGVtTGFiZWxQcm92aWRlci5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgUk9MRV9OQU1FX1NGID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFJPTEVTX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKTsKLQotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGZvciBkZWxlZ2F0aW9uIHRvIGdldCBsYWJlbHMgZm9yIHNlcnZlciBvYmplY3RzLCB3aGljaCBkb24ndCBmaXQgaW50byBFTUYgZWRpdAotCSAqLwotCXByb3RlY3RlZCBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIHdiTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJd2JMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvYmplY3QpLmdldEltYWdlKCk7Ci0JCWVsc2UgaWYgKGlzRU1GRWRpdE9iamVjdChvYmplY3QpKQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKCgoQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pIG9iamVjdCkuZWpiKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRmlsZSkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gd2JMYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvYmplY3QpLmdldFRleHQoKTsKLQkJZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KG9iamVjdCkpIHsKLQkJCWlmIChDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG9iamVjdCkpCi0JCQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZXBsb3ltZW50X0Rlc2NyaXB0b3JfVUlfIikgKyAiOiAiICsgc3VwZXIuZ2V0VGV4dChvYmplY3QpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoKChBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkgb2JqZWN0KS5lamIpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJcmV0dXJuICgoSUZpbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZpbGUpIHsKLQkJCXJldHVybiAoKEZpbGUpb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHdiTGFiZWxQcm92aWRlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFTUZFZGl0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXJDbGFzcyk7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpT2JqZWN0LAotCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKGZlYXR1cmUgPT0gUk9MRV9OQU1FX1NGIHx8IGZlYXR1cmUgPT0gUk9MRVNfU0YpCi0JCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2UyMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFTm90aWZpY2F0aW9uSW1wbDsKLQotcHVibGljIGNsYXNzIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwcm90ZWN0ZWQgTWFwIGNoaWxkcmVuID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZUFkYXB0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbG9jYWxDaGlsZHJlbiA9IChMaXN0KSBjaGlsZHJlbi5nZXQob2JqZWN0KTsKLQkJaWYgKGxvY2FsQ2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBpbml0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgaW5pdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXBwbGljYXRpb24gYXBwID0gKEFwcGxpY2F0aW9uKSBvYmplY3Q7Ci0JCUxpc3QgbG9jYWxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCS8vIE1ERTogY2hhbmdlZCBnZXRQYXJlbnQob2JqZWN0KSB0byBqdXN0IGFwcAotCQlsb2NhbENoaWxkcmVuLmFkZChuZXcgTW9kdWxlc0l0ZW1Qcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpLCBudWxsLCBudWxsLCBhcHApKTsKLQotCQkvLyBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFwcCk7Ci0JCS8vIElWaXJ0dWFsQ29tcG9uZW50IGVhciA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFwcCk7Ci0JCS8vIFRPRE8gc3dpdGNoIHRvIHJldHJpZXZlIHJlZmVyZW5jZUNvbXBvbmVudHMKLQkJLy8gRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0JCS8vIHRyeSB7Ci0JCS8vIEVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQkJLy8gaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkvLyBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0JCS8vIEVBUlByb2plY3RNYXAgbWFwID0gZWRpdE1vZGVsLmdldEVBUlByb2plY3RNYXAoKTsKLQkJLy8gbG9jYWxDaGlsZHJlbi5hZGQobWFwKTsKLQkJLy8gbWFwLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChnZXROZXdBZGFwdGVyKGFwcCkpOwotCQkvLyB9Ci0JCS8vIH0gZmluYWxseSB7Ci0JCS8vIGlmIChlZGl0TW9kZWwgIT0gbnVsbCkKLQkJLy8gZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCS8vIH0KLQkJbG9jYWxDaGlsZHJlbi5hZGQobmV3IEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKGFwcCwgZ2V0QWRhcHRlckZhY3RvcnkoKSwgdGhpcykpOwotCi0JCWNoaWxkcmVuLnB1dChvYmplY3QsIGxvY2FsQ2hpbGRyZW4pOwotCQlyZXR1cm4gbG9jYWxDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kdWxlc0l0ZW1Qcm92aWRlciBnZXRNb2R1bGVzTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoTW9kdWxlc0l0ZW1Qcm92aWRlcikgKChMaXN0KSBnZXRDaGlsZHJlbihvYmplY3QpKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIEFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwKLQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUyA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUiAmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzKQotCQkJY2hpbGRyZW4ucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkpCi0JCQltb2R1bGVzQ2hhbmdlZCgoQXBwbGljYXRpb24pIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vZHVsZXNDaGFuZ2VkKEFwcGxpY2F0aW9uIGFwcCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJTW9kdWxlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IGdldE1vZHVsZXNOb2RlKGFwcCk7Ci0JCUNvbGxlY3Rpb24gZ3JhbmRDaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKCk7Ci0JCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5hZGQobmV3VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6IHsKLQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZShvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6IHsKLQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgb2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJTGlzdCBhZGFwdGVycyA9IGdldFJlc291cmNlQWRhcHRlcnMoKTsKLQkJUmVzb3VyY2VBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlhZGFwdGVyID0gKFJlc291cmNlQWRhcHRlcikgYWRhcHRlcnMuZ2V0KGkpOwotCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JCXByaXZhdGUgQXBwbGljYXRpb24gYXBwID0gbnVsbDsKLQotCQlwdWJsaWMgUmVzb3VyY2VBZGFwdGVyKEFwcGxpY2F0aW9uIGFwcCkgewotCQkJdGhpcy5hcHAgPSBhcHA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgIXJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLnRoaXMuY2hpbGRyZW4ucmVtb3ZlKGFwcCk7Ci0JCQkJcmVzLmVBZGFwdGVycygpLnJlbW92ZShSZXNvdXJjZUFkYXB0ZXIudGhpcyk7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IEoyRUVOb3RpZmljYXRpb25JbXBsKGFwcCwgTm90aWZpY2F0aW9uLk1PVkUsIChPYmplY3QpIG51bGwsIChPYmplY3QpIG51bGwsIDApKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciBnZXROZXdBZGFwdGVyKEFwcGxpY2F0aW9uIGtleSkgewotCQlSZXNvdXJjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoa2V5KTsKLQkJZ2V0UmVzb3VyY2VBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNvdXJjZUFkYXB0ZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlc291cmNlQWRhcHRlcnMoKSB7Ci0JCWlmIChyZXNvdXJjZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXNvdXJjZUFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzNGIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkjY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxNGIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFQmluYXJ5TW9kdWxlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEoyRUVJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEoyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyKEFwcGxpY2F0aW9uIGFwcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNoaWxkcmVuKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuQklOQVJZOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFRWRpdGluZ0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDdiZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuT3ZlcnJpZGVhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVwbGFjZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQ3VzdG9tIGVkaXRpbmcgZG9tYWluIHdoaWNoIHByb3ZpZGVzIGhvb2tzIGZvciBjcmVhdGluZyBvdmVycmlkZSBjb21tYW5kczsgc2hvdWxkIG5vdCBiZSB1c2VkCi0gKiBkaXJlY3RseSBidXQgY2FuIGJlIHN1YmNsYXNzZWQgdG8gb3ZlcnJpZGUgY29tbWFuZHMgYXMgbmVjZXNzYXJ5LiBBbGwgdGhlIG92ZXJyaWRlIG1ldGhvZHMgYnkKLSAqIGRlZmF1bHQgcmV0dXJuIG51bGwsIHNvIGEgc3ViY2xhc3MgbWF5IG92ZXJyaWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbW1hbmRzLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVkaXRpbmdEb21haW4gZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gewotCS8qKgotCSAqIEoyRUVFZGl0aW5nRG9tYWluIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBKMkVFRWRpdGluZ0RvbWFpbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRPdmVycmlkZUNvbW1hbmQoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChDb3B5VG9DbGlwYm9hcmRDb21tYW5kIGNvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weU92ZXJyaWRlQ29tbWFuZChDcmVhdGVDb3B5Q29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcE92ZXJyaWRlQ29tbWFuZChEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5T3ZlcnJpZGVDb21tYW5kKEluaXRpYWxpemVDb3B5Q29tbWFuZCBpbml0aWFsaXplQ29weUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZU92ZXJyaWRlQ29tbWFuZChNb3ZlQ29tbWFuZCBtb3ZlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVPdmVycmlkZUNvbW1hbmQoT3ZlcnJpZGVhYmxlQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlQWRkT3ZlcnJpZGVDb21tYW5kKGFkZENvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVSZW1vdmVPdmVycmlkZUNvbW1hbmQocmVtb3ZlQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFNldENvbW1hbmQpIHsKLQkJCVNldENvbW1hbmQgc2V0Q29tbWFuZCA9IChTZXRDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVNldE92ZXJyaWRlQ29tbWFuZChzZXRDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVwbGFjZUNvbW1hbmQpIHsKLQkJCVJlcGxhY2VDb21tYW5kIHJlcGxhY2VDb21tYW5kID0gKFJlcGxhY2VDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVJlcGxhY2VPdmVycmlkZUNvbW1hbmQocmVwbGFjZUNvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBNb3ZlQ29tbWFuZCkgewotCQkJTW92ZUNvbW1hbmQgbW92ZUNvbW1hbmQgPSAoTW92ZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlTW92ZU92ZXJyaWRlQ29tbWFuZChtb3ZlQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNvcHlDb21tYW5kKSB7Ci0JCQlDcmVhdGVDb3B5Q29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCA9IChDcmVhdGVDb3B5Q29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVDcmVhdGVDb3B5T3ZlcnJpZGVDb21tYW5kKGNyZWF0ZUNvcHlDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgSW5pdGlhbGl6ZUNvcHlDb21tYW5kKSB7Ci0JCQlJbml0aWFsaXplQ29weUNvbW1hbmQgaW5pdGlhbGl6ZUNvcHlDb21tYW5kID0gKEluaXRpYWxpemVDb3B5Q29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVJbml0aWFsaXplQ29weU92ZXJyaWRlQ29tbWFuZChpbml0aWFsaXplQ29weUNvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb3B5VG9DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlDb3B5VG9DbGlwYm9hcmRDb21tYW5kIGNvcHlUb0NsaXBib2FyZENvbW1hbmQgPSAoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoY29weVRvQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCA9IChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BDb21tYW5kKSB7Ci0JCQlEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kID0gKERyYWdBbmREcm9wQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVEcmFnQW5kRHJvcE92ZXJyaWRlQ29tbWFuZChkcmFnQW5kRHJvcENvbW1hbmQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZU92ZXJyaWRlQ29tbWFuZChSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVwbGFjZU92ZXJyaWRlQ29tbWFuZChSZXBsYWNlQ29tbWFuZCByZXBsYWNlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVTZXRPdmVycmlkZUNvbW1hbmQoU2V0Q29tbWFuZCBzZXRDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWNkNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZW1hcEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVBUlByb2plY3RNYXBBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQVJQcm9qZWN0TWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBKMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlcih0aGlzLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVByb3ZpZGVyVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVQcm92aWRlclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzOWJhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVByb3ZpZGVyVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFUHJvdmlkZXJVdGlsaXR5IHsKLQotCXByaXZhdGUgSjJFRVByb3ZpZGVyVXRpbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwZW5kUHJvamVjdE5hbWUoRU9iamVjdCBvYmplY3QsIFN0cmluZyBsYWJlbCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCQlpZiAob2JqZWN0LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2ogPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQcm9qZWN0KG9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAocHJvaiAhPSBudWxsKQotCQkJCXByb2plY3ROYW1lID0gcHJvai5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5lcXVhbHMobGFiZWwpKQotCQkJcmV0dXJuIGxhYmVsOwotCQllbHNlIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JCWVsc2UKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArICI6ICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVVJRWRpdGluZ0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U2MzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQuSjJFRUNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kLkoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZC5KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQuSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVVJRWRpdGluZ0RvbWFpbiBleHRlbmRzIEoyRUVFZGl0aW5nRG9tYWluIHsKLQkvKioKLQkgKiBKMkVFVUlFZGl0aW5nRG9tYWluIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBKMkVFVUlFZGl0aW5nRG9tYWluKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCQl0dXJuVHJhY2VPbklmRGVidWdnaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKENvcHlUb0NsaXBib2FyZENvbW1hbmQgY29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgewotCi0JCWlmIChjb3B5VG9DbGlwYm9hcmRDb21tYW5kIGluc3RhbmNlb2YgSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoY29weVRvQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQlpZiAocGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBpbnN0YW5jZW9mIEoyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoZ2V0Q2xpcGJvYXJkKCkgaW5zdGFuY2VvZiBKMkVFQ2xpcGJvYXJkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEoyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQocGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlT3ZlcnJpZGVDb21tYW5kKFJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCkgewotCQlyZXR1cm4gbmV3IEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQocmVtb3ZlQ29tbWFuZCk7Ci0JfQotCi0JcHVibGljIEoyRUVDbGlwYm9hcmQgZ2V0SjJFRUNsaXBib2FyZCgpIHsKLQkJcmV0dXJuIChKMkVFQ2xpcGJvYXJkKSBnZXRDbGlwYm9hcmQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHVyblRyYWNlT25JZkRlYnVnZ2luZygpIHsKLQkJLy9BYnN0cmFjdENvbW1hbmQuVHJhY2UuZW5hYmxlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOGU4NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyIGV4dGVuZHMgSjJFRUl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVVElMSVRZX0pBUlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVXRpbGl0eV9KQVJzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gY2hpbGRyZW5Mb2FkZWQgPSBmYWxzZTsKLQlwcml2YXRlIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoQXBwbGljYXRpb24gYXBwLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCQlhcHBsaWNhdGlvbiA9IGFwcDsKLQkJVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIuSU5TVEFOQ0UuYWRkVXRpbGl0eUphckl0ZW1Qcm92aWRlcihQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYXBwbGljYXRpb24pLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXJldHVybiAhY2hpbGRyZW4uaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCFjaGlsZHJlbkxvYWRlZCkgewotCQkJdHJ5IHsKLQkJCQlkaXNhYmxlTm90aWZpY2F0aW9uKCk7Ci0JCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWNvbXB1dGVDaGlsZHJlbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWVuYWJsZU5vdGlmaWNhdGlvbigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCVV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLklOU1RBTkNFLnJlbW92ZVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFwcGxpY2F0aW9uKSwgdGhpcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVDaGlsZHJlbigpIHsKLQkJY2hpbGRyZW5Mb2FkZWQgPSB0cnVlOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXIgPSBDb21wb25lbnRVdGlsaXRpZXMuZmluZENvbXBvbmVudChhcHBsaWNhdGlvbik7Ci0JCWlmIChlYXIgIT0gbnVsbCkgewotCQkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyKTsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG1vZHVsZXMgPSBlYXJFZGl0LmdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IG1vZHVsZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQlpZiAobW9kdWxlLmlzQmluYXJ5KCkpIHsKLQkJCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHZpcnR1YWxBcmNoaXZlQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBtb2R1bGU7Ci0JCQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSB2aXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQkJCWlmIChkaXNrRmlsZS5leGlzdHMoKSkKLQkJCQkJCQljaGlsZHJlbi5hZGQoZGlza0ZpbGUpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gd2Ugd2lsbCBhc3N1bWUgdGhlIGNvbXBvbmVudCBuYW1lIGlzIGluIHN5bmNoIHdpdGggdGhlIG1vZHVsZSB1cmkKLQkJCQkJCQlJRmlsZSB1dGlsaXR5SmFyID0gdmlydHVhbEFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCQlpZiAodXRpbGl0eUphciAhPSBudWxsKQotCQkJCQkJCQljaGlsZHJlbi5hZGQodXRpbGl0eUphcik7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0KLQkJCQkJfQotCQkJCQlpZiAobW9kdWxlLmdldFByb2plY3QoKSA9PSBudWxsIHx8ICFtb2R1bGUuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCS8vIHJldHVybiBvbmx5IGphcnMgZm9yIHV0aWxpdHkgY29tcG9uZW50cwotCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbik7Ci0JCQkJCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJLy8gd2Ugd2lsbCBhc3N1bWUgdGhlIGNvbXBvbmVudCBuYW1lIGlzIGluIHN5bmNoIHdpdGggdGhlIG1vZHVsZSB1cmkKLQkJCQkJCUlGaWxlIHV0aWxpdHlKYXIgPSBwcm9qZWN0LmdldEZpbGUobW9kdWxlLmdldE5hbWUoKSArICIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh1dGlsaXR5SmFyICE9IG51bGwpIHsKLQkJCQkJCQlpZiAodXRpbGl0eUphci5leGlzdHMoKSkKLQkJCQkJCQkJY2hpbGRyZW4uYWRkKHV0aWxpdHlKYXIpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBVdGlsaXR5TW9kdWxlUHJvamVjdEl0ZW1Qcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpLG1vZHVsZS5nZXRQcm9qZWN0KCksdGhpcykpOwotCQkJCQkJfQotCQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKSB7Ci0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRKYXJzKExpc3QgbGlzdCwgSVJlc291cmNlW10gbWVtYmVycykgewotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCS8vIGlmIChpc0phckZpbGUobWVtYmVyc1tpXSkpIHsKLQkvLyBsaXN0LmFkZChtZW1iZXJzW2ldKTsKLQkvLyB9IGVsc2UgaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkvLyB0cnkgewotCS8vIGdldEphcnMobGlzdCwgKChJRm9sZGVyKSBtZW1iZXJzW2ldKS5tZW1iZXJzKCkpOwotCS8vIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCS8vIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbGlzdDsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXJGaWxlKElSZXNvdXJjZSBtZW1iZXIpIHsKLQkJcmV0dXJuIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgbWVtYmVyLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wb25lbnRGaWxlKElSZXNvdXJjZSBtZW1iZXIpIHsKLQkJcmV0dXJuIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgbWVtYmVyLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKElNb2R1bGVDb25zdGFudHMuQ09NUE9ORU5UX0ZJTEVfTkFNRSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFVUSUxJVFlfSkFSUzsKLQl9Ci0KLQkvLyBhc3N1bWUgdGhpcyByZXNvdXJjZSBpcyBhIGphciByZXNvdXJjZQotCXB1YmxpYyB2b2lkIHV0aWxpdHlKYXJDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGNoaWxkcmVuTG9hZGVkKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEICYmICFjaGlsZHJlbi5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQljaGlsZHJlbi5hZGQocmVzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCAmJiBjaGlsZHJlbi5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQljaGlsZHJlbi5yZW1vdmUocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBVdGlsaXR5SmFyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgSU5TVEFOQ0UgPSBuZXcgVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nID0gZmFsc2U7Ci0JCXByaXZhdGUgTWFwIGVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXA7Ci0KLQkJcHVibGljIHZvaWQgYWRkVXRpbGl0eUphckl0ZW1Qcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciB1dGlsaXR5SmFySXRlbVByb3ZpZGVyKSB7Ci0JCQlMaXN0IHByb3ZpZGVycyA9IGdldFByb3ZpZGVycyhwcm9qZWN0KTsKLQkJCWlmIChwcm92aWRlcnMgIT0gbnVsbCkKLQkJCQlwcm92aWRlcnMuYWRkKHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpOwotCQkJaWYgKCFsaXN0ZW5pbmcpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQkJbGlzdGVuaW5nID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcHJvamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIExpc3QgZ2V0UHJvdmlkZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCUxpc3QgcmVzdWx0ID0gKExpc3QpIGdldEVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXAoKS5nZXQocHJvamVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcHJvamVjdCAhPSBudWxsKQotCQkJCWdldEVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXAoKS5wdXQocHJvamVjdCwgKHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKSkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIE1hcCBnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkgewotCQkJaWYgKGVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXAgPT0gbnVsbCkKLQkJCQllYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJldHVybiBlYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVXRpbGl0eUphckl0ZW1Qcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciB1dGlsaXR5SmFySXRlbVByb3ZpZGVyKSB7Ci0JCQlMaXN0IHByb3ZpZGVycyA9IGdldFByb3ZpZGVycyhwcm9qZWN0KTsKLQkJCXByb3ZpZGVycy5yZW1vdmUodXRpbGl0eUphckl0ZW1Qcm92aWRlcik7Ci0JCQlpZiAocHJvdmlkZXJzLmlzRW1wdHkoKSkKLQkJCQlnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkucmVtb3ZlKHByb2plY3QpOwotCi0JCQlpZiAoZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpLmlzRW1wdHkoKSkgewotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCWxpc3RlbmluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRyeSB7Ci0JCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJc3dpdGNoIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXJldHVybiBnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkuY29udGFpbnNLZXkoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6IHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKGlzQ29tcG9uZW50RmlsZShyZXNvdXJjZSkpIHsKLQkJCQkJCUxpc3QgdXRpbGl0eUphckl0ZW1Qcm92aWRlcnMgPSBnZXRQcm92aWRlcnMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXRpbGl0eUphckl0ZW1Qcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkoKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSB1dGlsaXR5SmFySXRlbVByb3ZpZGVycy5nZXQoaSkpLmdldENoaWxkcmVuKCkuY2xlYXIoKTsKLQkJCQkJCQkoKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSB1dGlsaXR5SmFySXRlbVByb3ZpZGVycy5nZXQoaSkpLmNvbXB1dGVDaGlsZHJlbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRBc3NvY2lhdGVkRmlsZSgpIHsKLQotCQl0cnkgewotCQkJaWYgKGFwcGxpY2F0aW9uICE9IG51bGwgJiYgYXBwbGljYXRpb24uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUoYXBwbGljYXRpb24uZVJlc291cmNlKCkuZ2V0VVJJKCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXZhUHJvamVjdHNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc3M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlciBleHRlbmRzIEVBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVRJTElUWV9KQVZBX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlV0aWxpdHlfSmF2YV9Qcm9qZWN0c19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFV0aWxpdHlKQVJzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFV0aWxpdHlKQVJzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBpbmNsdWRlTW9kdWxlcwotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiBpbmNsdWRlTW9kdWxlcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgaW5jbHVkZU1vZHVsZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVVRJTElUWV9KQVZBX1BST0pFQ1RTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01ldGhvZHNQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMDgwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLk1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBFeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlciBleGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcjsKLQlwcm90ZWN0ZWQgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIgbWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyIG1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBFT2JqZWN0IEVMX01FVEEgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0RXhjbHVkZUxpc3QoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIEVPYmplY3QgTVBfTUVUQSA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFT2JqZWN0IE1UX01FVEEgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKTsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm92aWRlc0NvbnRlbnRGb3IoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0gfHwgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbiB8fCBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbiB8fCBvYmplY3QgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIgPSBuZXcgRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGZhbHNlKTsKLQkJbWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIgPSBuZXcgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGZhbHNlKTsKLQkJbWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIgPSBuZXcgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChleGNsdWRlTGlzdENvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IG1ldGFDbGFzcyA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkKLQkJCW1ldGFDbGFzcyA9ICgoQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pIG9iamVjdCkucmVmT2JqZWN0LmVDbGFzcygpOwotCQllbHNlCi0JCQltZXRhQ2xhc3MgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCk7Ci0KLQkJaWYgKG1ldGFDbGFzcyA9PSBFTF9NRVRBKQotCQkJcmV0dXJuIGV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyOwotCQllbHNlIGlmIChtZXRhQ2xhc3MgPT0gTVBfTUVUQSkKLQkJCXJldHVybiBtZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlcjsKLQkJZWxzZSBpZiAobWV0YUNsYXNzID09IE1UX01FVEEpCi0JCQlyZXR1cm4gbWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXI7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJbWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJbWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgcHJvdiA9IGdldENvbnRlbnRQcm92aWRlcihwYXJlbnRFbGVtZW50KTsKLQkJcmV0dXJuIHByb3YgPT0gbnVsbCA/IG51bGwgOiBwcm92LmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBwcm92ID0gZ2V0Q29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gcHJvdiA9PSBudWxsID8gbnVsbCA6IHByb3YuZ2V0UGFyZW50KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHByb3YgPSBnZXRDb250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiBwcm92ICE9IG51bGwgJiYgcHJvdi5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCUFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBwcm92ID0gZ2V0Q29udGVudFByb3ZpZGVyKGlucHV0RWxlbWVudCk7Ci0JCXJldHVybiBwcm92ID09IG51bGwgPyBudWxsIDogcHJvdi5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhjZjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEoyRUVJdGVtUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTW9kdWxlc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIodGV4dCwgaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIodGV4dCwgaW1hZ2UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0UGFyZW50QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pIGdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRBc3NvY2lhdGVkRmlsZSgpIHsKLQotCQl0cnkgewotCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBnZXRQYXJlbnRBcHBsaWNhdGlvbigpOwotCQkJaWYgKGFwcGxpY2F0aW9uICE9IG51bGwgJiYgYXBwbGljYXRpb24uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUoYXBwbGljYXRpb24uZVJlc291cmNlKCkuZ2V0VVJJKCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTU9EVUxFUzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXJldHVybiAhbG9jYWxDaGlsZHJlbi5pc0VtcHR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGxvY2FsQ2hpbGRyZW4gPSBudWxsOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW5pdENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgaW5pdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJbG9jYWxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXBwbGljYXRpb24gYXBwID0gKEFwcGxpY2F0aW9uKSBnZXRQYXJlbnQoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyID0gQ29tcG9uZW50VXRpbGl0aWVzLmZpbmRDb21wb25lbnQoYXBwKTsKLQkJTGlzdCBtb2R1bGVzID0gYXBwLmdldE1vZHVsZXMoKTsKLQkJTGlzdCBiaW5hcnlNb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXIuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCVN0cmluZyBtb2R1bGVVUkkgPSBtb2R1bGUuZ2V0VXJpKCk7Ci0JCQlib29sZWFuIGZvdW5kQmluYXJ5ID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoICYmICFmb3VuZEJpbmFyeTsgaisrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCWlmIChyZWZzW2pdLmdldEFyY2hpdmVOYW1lKCkuZXF1YWxzKG1vZHVsZVVSSSkpIHsKLQkJCQkJCWZvdW5kQmluYXJ5ID0gdHJ1ZTsKLQkJCQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQloZWxwZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7Ci0JCQkJCQkJT2JqZWN0IGJpbmFyeU1vZHVsZSA9IGhlbHBlci5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQkJCQkJCWlmIChiaW5hcnlNb2R1bGUgIT0gbnVsbCkgewotCQkJCQkJCQliaW5hcnlNb2R1bGVzLmFkZChiaW5hcnlNb2R1bGUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaWYoaGVscGVyICE9IG51bGwpewotCQkJCQkJCQloZWxwZXIuZGlzcG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmRCaW5hcnkpIHsKLQkJCQlsb2NhbENoaWxkcmVuLmFkZChtb2R1bGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFiaW5hcnlNb2R1bGVzLmlzRW1wdHkoKSkgewotCQkJbG9jYWxDaGlsZHJlbi5hZGQobmV3IEoyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyKGFwcCwgZ2V0QWRhcHRlckZhY3RvcnkoKSwgYmluYXJ5TW9kdWxlcykpOwotCQl9Ci0KLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvVXRpbGl0eU1vZHVsZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9VdGlsaXR5TW9kdWxlUHJvamVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2M2NTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9VdGlsaXR5TW9kdWxlUHJvamVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBVdGlsaXR5TW9kdWxlUHJvamVjdEl0ZW1Qcm92aWRlciBleHRlbmRzIEoyRUVJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJUHJvamVjdCB1dGlsUHJvamVjdDsKLQotCXB1YmxpYyBVdGlsaXR5TW9kdWxlUHJvamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgSVByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCQl1dGlsUHJvamVjdCA9IHByb2plY3Q7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiBAc2VlIEl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9wcmp1dGlsamFyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQotCQlyZXR1cm4gdXRpbFByb2plY3QuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9Eb3VibGVDaGVja2JveFRhYmxlSXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZmI1YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogU3RlZmFuIERpbW92LCBzdGVmYW4uZGltb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLlNlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIERvdWJsZUNoZWNrYm94VGFibGVJdGVtIGV4dGVuZHMgVGFibGVJdGVtIHsKLQkKLQlwcm90ZWN0ZWQgaW50IG1TZWNvbmRDaGVja2JveENvbHVtbkluZGV4OwotCXByb3RlY3RlZCBCdXR0b24gc2Vjb25kQ2hlY2tCb3g7Ci0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIHNlbExzdG5yOwotCXByb3RlY3RlZCBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHRibExzdG5yID0gbnVsbDsKLQlwcm90ZWN0ZWQgRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQkKLQlwdWJsaWMgRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gKFRhYmxlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgc2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleCwgRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJbVNlY29uZENoZWNrYm94Q29sdW1uSW5kZXggPSBzZWNvbmRDaGVja2JveENvbHVtbkluZGV4OwotCQl0aGlzLnRhYmxlVmlld2VyID0gdGFibGVWaWV3ZXI7Ci0JCWNyZWF0ZUNoZWNrQm94KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBEb3VibGVDaGVja2JveFRhYmxlSXRlbShUYWJsZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IGluZGV4LCBpbnQgc2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleCwgRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBpbmRleCk7Ci0JCW1TZWNvbmRDaGVja2JveENvbHVtbkluZGV4ID0gc2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleDsKLQkJdGhpcy50YWJsZVZpZXdlciA9IHRhYmxlVmlld2VyOwkJCi0JCWNyZWF0ZUNoZWNrQm94KHBhcmVudCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kQ2hlY2tlZCAoYm9vbGVhbiBjaGVja2VkKSB7Ci0JCXNlY29uZENoZWNrQm94LnNldFNlbGVjdGlvbihjaGVja2VkKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0U2Vjb25kQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIHNlY29uZENoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmRHcmF5ZWQoYm9vbGVhbiBncmF5ZWQpIHsKLQkJc2Vjb25kQ2hlY2tCb3guc2V0R3JheWVkKGdyYXllZCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFNlY29uZEdyYXllZCgpIHsKLQkJcmV0dXJuIHNlY29uZENoZWNrQm94LmdldEdyYXllZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzZWNvbmRDaGVja0JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRTZWNvbmRFbmFibGVkKCkgewotCQlyZXR1cm4gc2Vjb25kQ2hlY2tCb3guZ2V0RW5hYmxlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlY29uZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBzZWNvbmRDaGVja0JveC5pc0VuYWJsZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNoZWNrQm94KFRhYmxlIHBhcmVudFRhYmxlKSB7Ci0JCXNlY29uZENoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnRUYWJsZSwgU1dULkNIRUNLIHwgU1dULkZMQVQpOwotCQlzZWNvbmRDaGVja0JveC5wYWNrKCk7Ci0JCWZpbmFsIERvdWJsZUNoZWNrYm94VGFibGVJdGVtIHRoID0gdGhpczsgCi0JCXNlbExzdG5yID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQgZXZ0ID0gbmV3IFNlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQodGFibGVWaWV3ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCWdldERhdGEoKSwKLQkJCQkJCQkJCQkJCQkJCQkJCQlnZXRDaGVja2VkKCkpOwotCQkJCWV2dC5zZXRUYWJsZUl0ZW0odGgpOwotCQkJCXRibExzdG5yLmNoZWNrU3RhdGVDaGFuZ2VkKGV2dCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJfTsKLQkJc2Vjb25kQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsTHN0bnIpOwotCX0KLQkKLQlwdWJsaWMgQnV0dG9uIGdldFNlY29uZENoZWNrQm94KCkgewotCQlyZXR1cm4gc2Vjb25kQ2hlY2tCb3g7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNwb3NlU2Vjb25kQ2hlY2tib3goKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlU2Vjb25kQ2hlY2tib3goKSB7Ci0JCWlmIChzZWNvbmRDaGVja0JveCAhPSBudWxsKSB7Ci0JCQlzZWNvbmRDaGVja0JveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihzZWxMc3Rucik7Ci0JCQlzZWNvbmRDaGVja0JveC5kaXNwb3NlKCk7Ci0JCQlzZWNvbmRDaGVja0JveCA9IG51bGw7Ci0JCX0KLQkJc2VsTHN0bnIgPSBudWxsOwotCX0KLQkKLQl2b2lkIHNldFRhYmxlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciB0YmxMc3RucikgewotCQl0aGlzLnRibExzdG5yID0gdGJsTHN0bnI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MgKCkge30KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9Eb3VibGVDaGVja2JveFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzdiOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBTdGVmYW4gRGltb3YsIHN0ZWZhbi5kaW1vdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyUm93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBEb3VibGVDaGVja2JveFRhYmxlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUYWJsZVZpZXdlciB7Ci0JCi0JcHJvdGVjdGVkIGludCBtU2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleDsKLQlwcm90ZWN0ZWQgSUNoZWNrU3RhdGVMaXN0ZW5lciBsc3RuciA9IG51bGw7Ci0JCi0gICAgcHVibGljIERvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIoVGFibGUgdGFibGUsIGludCBzZWNvbmRDaGVja0JveENvbHVtbkluZGV4KSB7Ci0gICAgICAgIHN1cGVyKHRhYmxlKTsKLSAgICAgICAgaWYgKHNlY29uZENoZWNrQm94Q29sdW1uSW5kZXggPCAxKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIGNvbHVtbiB3aXRoIGNoZWNrIGJveCBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCQotICAgICAgICBtU2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleCA9IHNlY29uZENoZWNrQm94Q29sdW1uSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAJc3VwZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAJbHN0bnIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0JCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAJc3VwZXIucmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAJbHN0bnIgPSBudWxsOwotICAgIAlnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQlEb3VibGVDaGVja2JveFRhYmxlSXRlbSBpdCA9IChEb3VibGVDaGVja2JveFRhYmxlSXRlbSlnZXRUYWJsZSgpLmdldEl0ZW0oaSk7Ci0gICAgCQlpdC5zZXRUYWJsZUxpc3RlbmVyKG51bGwpOwotICAgIAl9Ci0gICAgfQotCQotCXByb3RlY3RlZCBWaWV3ZXJSb3cgaW50ZXJuYWxDcmVhdGVOZXdSb3dQYXJ0KGludCBzdHlsZSwgaW50IHJvd0luZGV4KSB7Ci0JCURvdWJsZUNoZWNrYm94VGFibGVJdGVtIGl0ZW07Ci0JCWlmIChyb3dJbmRleCA+PSAwKSB7Ci0JCQlpdGVtID0gbmV3IERvdWJsZUNoZWNrYm94VGFibGVJdGVtKGdldFRhYmxlKCksIHN0eWxlLCByb3dJbmRleCwgbVNlY29uZENoZWNrYm94Q29sdW1uSW5kZXgsIHRoaXMpOwotCQl9IGVsc2UgewotCQkJaXRlbSA9IG5ldyBEb3VibGVDaGVja2JveFRhYmxlSXRlbShnZXRUYWJsZSgpLCBzdHlsZSwgbVNlY29uZENoZWNrYm94Q29sdW1uSW5kZXgsIHRoaXMpOwotCQl9CQotCQlpdGVtLnNldFRhYmxlTGlzdGVuZXIobHN0bnIpOwkJCi0JCVRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihnZXRUYWJsZSgpKTsKLSAJICAgIGVkaXRvci5taW5pbXVtV2lkdGggPSBpdGVtLmdldFNlY29uZENoZWNrQm94KCkuZ2V0U2l6ZSAoKS54OwotCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7CQkKLQkJZWRpdG9yLnNldEVkaXRvcihpdGVtLmdldFNlY29uZENoZWNrQm94KCksIGl0ZW0sIG1TZWNvbmRDaGVja2JveENvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldFZpZXdlclJvd0Zyb21JdGVtKGl0ZW0pOwotCX0KLQkKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0U2Vjb25kQ2hlY2tlZEl0ZW1zKCkgewotICAgICAgICBUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IGdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCURvdWJsZUNoZWNrYm94VGFibGVJdGVtIGl0ZW0gPSAoRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0pY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRTZWNvbmRDaGVja2VkKCkpIHsKLQkJCQl2LmFkZChpdGVtKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEFsbFNlY29uZENoZWNrZWQoYm9vbGVhbiBzdGF0ZSkgewotICAgICAgICBUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IGdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gaXRlbSA9IChEb3VibGVDaGVja2JveFRhYmxlSXRlbSljaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGl0ZW0uc2V0U2Vjb25kQ2hlY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTaW5nbGVDaGVja2VkRWxlbWVudHMoKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gaXRlbSA9IChEb3VibGVDaGVja2JveFRhYmxlSXRlbSljaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAmJiAoIWl0ZW0uZ2V0U2Vjb25kQ2hlY2tlZCgpKSkgewotCQkJCXYuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXREb3VibGVDaGVja2VkRWxlbWVudHMoKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0gaXRlbSA9IChEb3VibGVDaGVja2JveFRhYmxlSXRlbSljaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAmJiBpdGVtLmdldFNlY29uZENoZWNrZWQoKSkgewotCQkJCXYuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0VW5jaGVja2VkSXRlbXMoKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmICghaXRlbS5nZXRDaGVja2VkKCkpIHsKLQkJCQl2LmFkZChpdGVtKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIE9iamVjdFtdIGdldFNlY29uZFVuY2hlY2tlZEVsZW1lbnRzKCkgewotICAgICAgICBUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IGdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCURvdWJsZUNoZWNrYm94VGFibGVJdGVtIGl0ZW0gPSAoRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0pY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpZiAoIWl0ZW0uZ2V0U2Vjb25kQ2hlY2tlZCgpKSB7Ci0JCQkJdi5hZGQoaXRlbS5nZXREYXRhKCkpOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9ICAgIAotICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2Vjb25kQ2hlY2tlZEl0ZW1zKE9iamVjdFtdIGlucHV0SXRlbXMpIHsKLSAgICAgICAgYXNzZXJ0RWxlbWVudHNOb3ROdWxsKGlucHV0SXRlbXMpOwotICAgICAgICBIYXNodGFibGUgc2V0ID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0SXRlbXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHNldC5wdXQoaW5wdXRJdGVtc1tpXSwgaW5wdXRJdGVtc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBnZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgCURvdWJsZUNoZWNrYm94VGFibGVJdGVtIGl0ZW0gPSAoRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0paXRlbXNbaV07Ci0gICAgICAgICAgICBib29sZWFuIGNoZWNrID0gc2V0LmNvbnRhaW5zS2V5KGl0ZW0pOwotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0U2Vjb25kQ2hlY2tlZCgpICE9IGNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXRTZWNvbmRDaGVja2VkKGNoZWNrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9SZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCS8vIGVuc3VyZSB0aGF0IHRoZSBzZWNvbmQgY2hlY2sgYm94IGlzIGRpc3Bvc2VkCi0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgeyAKLQkJCWRpc3Bvc2VTZWNvbmRDaGVja2JveE9mSXRlbShpKTsKLQkJfQotCQkKLQkJc3VwZXIuZG9SZW1vdmUoc3RhcnQsIGVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9SZW1vdmUoaW50W10gaW5kaWNlcykgewotCQkvLyBlbnN1cmUgdGhhdCB0aGUgc2Vjb25kIGNoZWNrIGJveCBpcyBkaXNwb3NlZAotCQlmb3IgKGludCBpIDogaW5kaWNlcykgewotCQkJZGlzcG9zZVNlY29uZENoZWNrYm94T2ZJdGVtKGkpOwotCQl9Ci0JCQotCQlzdXBlci5kb1JlbW92ZShpbmRpY2VzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTZWNvbmRDaGVja2JveE9mSXRlbShpbnQgaW5kZXgpIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0oaW5kZXgpOwotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIERvdWJsZUNoZWNrYm94VGFibGVJdGVtKSB7Ci0JCQkoKERvdWJsZUNoZWNrYm94VGFibGVJdGVtKSBpdGVtKS5kaXNwb3NlU2Vjb25kQ2hlY2tib3goKTsKLQkJfQotCX0JCi0JICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmYxMTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9KMkVFUHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWRMYXlvdXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVQcm9wZXJ0aWVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlbmFtZUNvbnRleHRSb290Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlbmFtZUNvbnRleHRSb290UmVmYWN0b3JpbmdQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuUmVuYW1lQ29udGV4dFJvb3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgSjJFRVByb3BlcnRpZXNQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSjJFRVByb3BlcnRpZXNDb25zdGFudHMgewotCi0JcHJpdmF0ZSBUZXh0IGNvbnRleHRSb290TmFtZUZpZWxkOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjID0gcGFyZW50OwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsCi0JCQkJJiYgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUocHJvamVjdCkuZXF1YWxzKAotCQkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikKLQkJCQl8fCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KS5lcXVhbHMoCi0JCQkJCQlKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLlNUQVRJQ19XRUIpKSB7Ci0KLQkJCWMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCQlMYWJlbCBjb250ZXh0Um9vdExhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OT05FKTsKLQkJCWNvbnRleHRSb290TGFiZWwuc2V0VGV4dChKMkVFUHJvcGVydGllc0NvbnN0YW50cy5XRUJfQ09OVEVYVF9ST09UKTsKLQotCQkJY29udGV4dFJvb3ROYW1lRmllbGQgPSBuZXcgVGV4dChjLCBTV1QuQk9SREVSKTsKLQkJCWNvbnRleHRSb290TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlkaXJ0eSA9ICFjb250ZXh0Um9vdE5hbWVGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCUNvbXBvbmVudFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCkpKTsKLQkJCQkJdmFsaWRhdGVUZXh0KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlHcmlkTGF5b3V0RmFjdG9yeS5maWxsRGVmYXVsdHMoKS5udW1Db2x1bW5zKDIpLmFwcGx5VG8oYyk7Ci0JCQlHcmlkRGF0YUZhY3RvcnkuZGVmYXVsdHNGb3IoY29udGV4dFJvb3RMYWJlbCkuYXBwbHlUbyhjb250ZXh0Um9vdExhYmVsKTsKLQkJCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0Zvcihjb250ZXh0Um9vdE5hbWVGaWVsZCkuZ3JhYih0cnVlLCBmYWxzZSkuYXBwbHlUbygKLQkJCQkJY29udGV4dFJvb3ROYW1lRmllbGQpOwotCQl9Ci0JCWFwcGx5RGlhbG9nRm9udChjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJcmVmcmVzaCgpOwotCQlyZWZyZXNoQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUZXh0KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFJlbmFtZUNvbnRleHRSb290Q2hhbmdlCi0JCQkJLnZhbGlkYXRlQ29udGV4dFJvb3QoY29udGV4dFJvb3ROYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJCXJlZnJlc2hBcHBseUJ1dHRvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hBcHBseUJ1dHRvbigpIHsKLQkJaWYgKGRpcnR5KSB7Ci0JCQlpZiAoZ2V0QXBwbHlCdXR0b24oKSAhPSBudWxsKSB7Ci0JCQkJZ2V0QXBwbHlCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEFwcGx5QnV0dG9uKCkgIT0gbnVsbCkgewotCQkJCWdldEFwcGx5QnV0dG9uKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoY29udGV4dFJvb3ROYW1lRmllbGQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHMgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U2VydmVyQ29udGV4dFJvb3QoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChzID09IG51bGwpIHsKLQkJCQlzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNvbnRleHRSb290TmFtZUZpZWxkLnNldFRleHQocyk7Ci0JCQl2YWxpZGF0ZVRleHQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQotCQlPYmplY3QgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSBpbnQgZG9SZWZhY3RvcigpIHsKLQkJaW50IGlkID0gSURpYWxvZ0NvbnN0YW50cy5PS19JRDsKLQkJaWYgKGRpcnR5KSB7Ci0JCQlSZW5hbWVDb250ZXh0Um9vdFJlZmFjdG9yaW5nUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb250ZXh0Um9vdFJlZmFjdG9yaW5nUHJvY2Vzc29yKCk7Ci0JCQlwcm9jZXNzb3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJcHJvY2Vzc29yLnNldE5ld05hbWUoY29udGV4dFJvb3ROYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCVJlbmFtZUNvbnRleHRSb290V2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVDb250ZXh0Um9vdFdpemFyZChwcm9jZXNzb3IsCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkLkRJQUxPR19CQVNFRF9VU0VSX0lOVEVSRkFDRSk7Ci0JCQl3aXphcmQuc2V0UHJvbXB0KGZhbHNlKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKHdpemFyZCk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWQgPSBvcGVyYXRpb24ucnVuKGdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGVlKSB7Ci0KLQkJCX0KLQkJCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQkJZGlydHkgPSBmYWxzZTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlkb1JlZmFjdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gZG9SZWZhY3RvcigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1N2UxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LnVzZXIuVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKLQotICAgIGV4dGVuZHMgVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbAotICAgIAotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2xOZXh0VG9NYW5hZ2VIeXBlcmxpbmsoIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY2ZnCi0gICAgICAgICAgICA9IChXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgZ2V0T3BlcmF0aW9uQ29uZmlnKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBCdXR0b24gY29weU9uUHVibGlzaENoZWNrQm94ID0gbmV3IEJ1dHRvbiggY29tcG9zaXRlLCBTV1QuQ0hFQ0sgKTsKLSAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LnNldFRleHQoIFJlc291cmNlcy5jb3B5TGlicmFyaWVzICk7Ci0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRTZWxlY3Rpb24oIGNmZy5pc0luY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNmZy5zZXRJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCggY29weU9uUHVibGlzaENoZWNrQm94LmdldFNlbGVjdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3VmFsdWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRTZWxlY3Rpb24oIGNmZy5pc0luY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGNmZy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLlBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQgKTsKLSAgICAgICAgCi0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5hZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IERpc3Bvc2VMaXN0ZW5lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoIGZpbmFsIERpc3Bvc2VFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjZmcucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvcHlPblB1Ymxpc2hDaGVja0JveDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyaWVzOwotCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MDcxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY29weUxpYnJhcmllcyA9IEluY2x1ZGUgbGlicmFyaWVzIHdpdGggdGhpcyBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0NvbnRleHRSb290SW5wdXRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvQ29udGV4dFJvb3RJbnB1dFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0OWI0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvQ29udGV4dFJvb3RJbnB1dFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWRMYXlvdXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlVzZXJJbnB1dFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIENvbnRleHRSb290SW5wdXRQYWdlIGV4dGVuZHMgVXNlcklucHV0V2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIFJlbmFtZUNvbnRleHRSb290UmVmYWN0b3JpbmdQcm9jZXNzb3IgZlByb2Nlc3NvcjsKLQlwcml2YXRlIFRleHQgZk5hbWVGaWVsZDsKLQotCXB1YmxpYyBDb250ZXh0Um9vdElucHV0UGFnZShTdHJpbmcgbmFtZSwgUmVuYW1lQ29udGV4dFJvb3RSZWZhY3RvcmluZ1Byb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuZlByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3Q29udGV4dFJvb3QiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmTmFtZUZpZWxkID0gbmV3IFRleHQoYywgU1dULkJPUkRFUik7Ci0JCWZOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0KLQkJZk5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQotCQl9KTsKLQkJU3RyaW5nIG9sZE5hbWUgPSBmUHJvY2Vzc29yLmdldE9sZENvbnRleHRSb290KCk7Ci0JCWlmIChvbGROYW1lICE9IG51bGwgJiYgb2xkTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWZOYW1lRmllbGQuc2V0VGV4dChvbGROYW1lKTsKLQkJCWZOYW1lRmllbGQuc2V0U2VsZWN0aW9uKDAsIG9sZE5hbWUubGVuZ3RoKCkpOwotCQl9Ci0KLQkJR3JpZExheW91dEZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5udW1Db2x1bW5zKDIpLmFwcGx5VG8oYyk7Ci0KLQkJc2V0Q29udHJvbChjKTsKLQkJZk5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQkKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJU3RyaW5nIHRleHQgPSBmTmFtZUZpZWxkLmdldFRleHQoKTsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gZlByb2Nlc3Nvci52YWxpZGF0ZU5ld0VsZW1lbnROYW1lKHRleHQpOwotCQlzZXRQYWdlQ29tcGxldGUoc3RhdHVzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpbml0aWFsaXplUmVmYWN0b3JpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCWluaXRpYWxpemVSZWZhY3RvcmluZygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlZmFjdG9yaW5nKCkgewotCQlmUHJvY2Vzc29yLnNldE5ld05hbWUoZk5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZW5hbWVDb250ZXh0Um9vdENoYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlbmFtZUNvbnRleHRSb290Q2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjIyOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlbmFtZUNvbnRleHRSb290Q2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5ld0NvbnRleHRSb290OwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG9sZENvbnRleHRSb290OwotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQotCXB1YmxpYyBSZW5hbWVDb250ZXh0Um9vdENoYW5nZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmV3Q29udGV4dFJvb3QsIFN0cmluZyBvbGRDb250ZXh0Um9vdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLm9sZENvbnRleHRSb290ID0gb2xkQ29udGV4dFJvb3Q7Ci0JCXRoaXMubmV3Q29udGV4dFJvb3QgPSBuZXdDb250ZXh0Um9vdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZUNvbnRleHRSb290RnJvbVh0b1kiLCBuZXcgU3RyaW5nW117b2xkQ29udGV4dFJvb3QsIC8vJE5PTi1OTFMtMSQKLQkJCQluZXdDb250ZXh0Um9vdH0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVDb250ZXh0Um9vdChTdHJpbmcgbmFtZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyB0aGlzIHdhcyBhZGRlZCBiZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZG50IGJlIHNob3duCi0JCQkvLyBpbml0aWFsbHkuIEl0IHNob3VsZCBiZSBzaG93biBvbmx5IGlmIGNvbnRleHQKLQkJCS8vIHJvb3QgZmllbGQgaXMgZWRpdGVkIHRvCi0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCVByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygKLQkJCQkJCQlQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzIsCi0JCQkJCQkJbmV3IE9iamVjdFswXSkpOwotCi0JCX0KLQotCQlpZiAoIShuYW1lLmluZGV4T2YoJyAnKSA+IC0xKSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUsICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmICghKHRva2VuLmNoYXJBdChpKSA9PSAnXycpICYmICEodG9rZW4uY2hhckF0KGkpID09ICctJykKLQkJCQkJCQkmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLycpCi0JCQkJCQkJJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlKMkVFVUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJCQkJCQlQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsCi0JCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJKG5ldyBDaGFyYWN0ZXIodG9rZW4uY2hhckF0KGkpKSkudG9TdHJpbmcoKQotCQkJCQkJCQkJCQkJCX0pKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuLyBlbmQgb2YgaWYobmFtZS50cmltCi0JCWVsc2UgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKMkVFVUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoCi0JCQkJCQkJUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZV8sCi0JCQkJCQkJbmV3IE9iamVjdFswXSkpOwotCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlJU3RhdHVzIHBoYXNlMSA9IHZhbGlkYXRlQ29udGV4dFJvb3QobmV3Q29udGV4dFJvb3QpOwotCQlpZiAocGhhc2UxLmlzT0soKSkKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJZWxzZQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShwaGFzZTEpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9uZW50VXRpbGl0aWVzLnNldFNlcnZlckNvbnRleHRSb290KHByb2plY3QsIG5ld0NvbnRleHRSb290KTsKLQkJCi0JCXJldHVybiBuZXcgUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UocHJvamVjdCwgb2xkQ29udGV4dFJvb3QsIG5ld0NvbnRleHRSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZW5hbWVDb250ZXh0Um9vdFJlZmFjdG9yaW5nUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVuYW1lQ29udGV4dFJvb3RSZWZhY3RvcmluZ1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTY0ZTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZW5hbWVDb250ZXh0Um9vdFJlZmFjdG9yaW5nUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLQotcHVibGljIGNsYXNzIFJlbmFtZUNvbnRleHRSb290UmVmYWN0b3JpbmdQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgewotCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVwZGF0ZVJlZmVyZW5jZXM7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0FwcGxpY2FibGUoKSkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVFcnJvclN0YXR1cyhKMkVFVUlNZXNzYWdlcwotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZmFjdG9yaW5nTm9Jbml0IikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB2YWxpZGF0ZU5ld0VsZW1lbnROYW1lKGZOZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAoaXNBcHBsaWNhYmxlKCkgJiYgZk5ld05hbWUgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UoZ2V0UHJvamVjdCgpLCBmTmV3TmFtZSwgZ2V0T2xkQ29udGV4dFJvb3QoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCXJldHVybiBuZXcgT2JqZWN0W10gewotCQkJZ2V0UHJvamVjdCgpCi0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLkNoYW5nZUNvbnRleHRSb290UmVmYWN0b3JpbmdQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZUNvbnRleHRSb290Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgUmVuYW1lQXJndW1lbnRzIGdldFJlbmFtZUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBSZW5hbWVBcmd1bWVudHMoZk5ld05hbWUsIGZVcGRhdGVSZWZlcmVuY2VzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotCQkJU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIG5hdHVyZXMgPSBuZXcgU3RyaW5nWzBdOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGZOZXdOYW1lICE9IG51bGwpIHsKLQkJCW5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCQlyZXR1cm4gUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCB0aGlzLCBwcm9qZWN0LAotCQkJCQlnZXRSZW5hbWVBcmd1bWVudHMoKSwgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbMF07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuZlByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5mTmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlUmVmZXJlbmNlcyhib29sZWFuIHVwZGF0ZVJlZmVyZW5jZXMpIHsKLQkJdGhpcy5mVXBkYXRlUmVmZXJlbmNlcyA9IHVwZGF0ZVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShSZW5hbWVDb250ZXh0Um9vdENoYW5nZS52YWxpZGF0ZUNvbnRleHRSb290KG5ld05hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE9sZENvbnRleHRSb290KCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U2VydmVyQ29udGV4dFJvb3QoZ2V0UHJvamVjdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVuYW1lQ29udGV4dFJvb3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZW5hbWVDb250ZXh0Um9vdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE5ZjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZW5hbWVDb250ZXh0Um9vdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLQotcHVibGljIGNsYXNzIFJlbmFtZUNvbnRleHRSb290V2l6YXJkIGV4dGVuZHMgUmVmYWN0b3JpbmdXaXphcmQgewotCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdCA9IHRydWU7Ci0KLQlwdWJsaWMgUmVuYW1lQ29udGV4dFJvb3RXaXphcmQoUmVuYW1lQ29udGV4dFJvb3RSZWZhY3RvcmluZ1Byb2Nlc3NvciBwcm9jZXNzb3IsIGludCBmbGFncykgewotCQlzdXBlcihuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKSwgZmxhZ3MpOwotCQlzZXREZWZhdWx0UGFnZVRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVDb250ZXh0Um9vdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldENoYW5nZUNyZWF0aW9uQ2FuY2VsYWJsZSh0cnVlKTsKLQkJc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFVzZXJJbnB1dFBhZ2VzKCkgewotCQlpZiAocHJvbXB0KSB7Ci0JCQlhZGRQYWdlKG5ldyBDb250ZXh0Um9vdElucHV0UGFnZSgiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkoUmVuYW1lQ29udGV4dFJvb3RSZWZhY3RvcmluZ1Byb2Nlc3NvcikgZ2V0UmVmYWN0b3JpbmcoKS5nZXRBZGFwdGVyKAotCQkJCQkJCVJlbmFtZUNvbnRleHRSb290UmVmYWN0b3JpbmdQcm9jZXNzb3IuY2xhc3MpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9tcHQoYm9vbGVhbiBwcm9tcHQpIHsKLQkJdGhpcy5wcm9tcHQgPSBwcm9tcHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9Bbm5vdGF0aW9uSWNvbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3V0aWwvQW5ub3RhdGlvbkljb25EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmYzY5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9Bbm5vdGF0aW9uSWNvbkRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBZGQgb3ZlcmxheSBmb3IgYW5ub3RhdGVkIG9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25JY29uRGVjb3JhdG9yIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lNQUdFX0RFU0NfU1RSSU5HID0gImFubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcgPSAiZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fSU1BR0VfREVTQ19TVFJJTkcpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0RJU0FCTEVEX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcpOwotCi0JcHVibGljIEFubm90YXRpb25JY29uRGVjb3JhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbm5vdGF0ZWRTdXBwb3J0ZWQoRU9iamVjdCB0YXJnZXQpIHsKLQkJYm9vbGVhbiBiQW5ub3RhdGlvblN1cHBvcnRlZCA9IGZhbHNlOwotCQlpZiAoQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyLklOU1RBTkNFLmlzQW5ub3RhdGVkKHRhcmdldCkpIHsKLQkJCWJBbm5vdGF0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYkFubm90YXRpb25TdXBwb3J0ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbGxlckZvclByb2plY3QoSVByb2plY3QgdGFyZ2V0UHJvamVjdCkgewotCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHRhcmdldFByb2plY3QpOwotCQlyZXR1cm4gY29udHJvbGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQlFT2JqZWN0IGVPYmplY3QgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKSB7Ci0JCQlCZWFuQ2xhc3NQcm92aWRlckhlbHBlciBiZWFuQ2xhc3NIZWxwZXIgPSAoQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQ7Ci0JCQllT2JqZWN0ID0gYmVhbkNsYXNzSGVscGVyLmdldEVqYigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldCkKLQkJCWVPYmplY3QgPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQW5ub3RhdGVkU3VwcG9ydGVkKGVPYmplY3QpKSB7Ci0JCQlpZiAoaXNBbm5vdGF0aW9uRW5hYmxlZChlT2JqZWN0KSkgewotCQkJCWlmIChBTk5PVEFUSU9OX0lNR19ERVNDICE9IG51bGwpCi0JCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShBTk5PVEFUSU9OX0lNR19ERVNDKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MgIT0gbnVsbCkKLQkJCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQW5ub3RhdGlvbkVuYWJsZWQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUlGaWxlIGFubm90YXRlZFNvdXJjZSA9IG51bGw7Ci0JCS8qIHNob3J0IGNpcmN1aXQgaWYgcG9zc2libGUgKi8KLQkJaWYgKEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuaXNBbnlBbm5vdGF0aW9uc1N1cHBvcnRlZCgpKSB7Ci0JCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmplY3QpOwotCQkJQW5ub3RhdGlvbnNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyRm9yUHJvamVjdCh0YXJnZXRQcm9qZWN0KTsKLQkJCWlmIChjb250cm9sbGVyICE9IG51bGwpCi0JCQkJYW5ub3RhdGVkU291cmNlID0gY29udHJvbGxlci5nZXRFbmFibGVkQW5ub3RhdGlvbkZpbGUoZU9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChhbm5vdGF0ZWRTb3VyY2UgIT0gbnVsbCkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlTmFtZSkgewotCQlpZiAoaW1hZ2VGaWxlTmFtZSAhPSBudWxsKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRmlsZU5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9CaW5hcnlQcm9qZWN0VUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0JpbmFyeVByb2plY3RVSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjA1NjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0JpbmFyeVByb2plY3RVSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBCaW5hcnlQcm9qZWN0VUlIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkJJTkFSWV9QUk9KRUNUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBQ1RJT05fQ0FOTk9UX0JFX1BFUkZPUk1FRF9PTl9CSU5fUFJPSkVDVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQmluYXJ5UHJvamVjdFVJSGVscGVyLgotCSAqLwotCXB1YmxpYyBCaW5hcnlQcm9qZWN0VUlIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlFcnJvcihTaGVsbCBwYXJlbnQpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IocGFyZW50LCBESUFMT0dfVElUTEUsIERJQUxPR19NRVNTQUdFKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNwbGF5RXJyb3JJZkJpbmFyeVByb2plY3QoU2hlbGwgcGFyZW50LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlib29sZWFuIGlzQmluYXJ5ID0gSmVtUHJvamVjdFV0aWxpdGllcy5pc0JpbmFyeVByb2plY3QoYVByb2plY3QpOwotCQlpZiAoaXNCaW5hcnkpCi0JCQlkaXNwbGF5RXJyb3IocGFyZW50KTsKLQkJcmV0dXJuIGlzQmluYXJ5OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJBcHBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViQXBwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGMyMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJBcHBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVXZWJBcHBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJBcHBJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemluZyA9IGZhbHNlOwotCXByaXZhdGUgV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIgd2ViRXJyb3JQYWdlR3JvdXA7Ci0JcHJpdmF0ZSBXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIgd2ViU2VydmxldEdyb3VwOwotCXByaXZhdGUgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciB3ZWJTZXJ2bGV0TWFwcGluZ0dyb3VwOwotCXByaXZhdGUgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIHdlYkZpbHRlcnNHcm91cDsKLQlwcml2YXRlIFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciB3ZWJGaWx0ZXJNYXBwaW5nR3JvdXA7Ci0JcHJpdmF0ZSBXZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIgd2ViUmVmc0dyb3VwOwotCXByaXZhdGUgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlciB3ZWJTZWN1cml0eUdyb3VwOwotCXByaXZhdGUgSjJFRVdlYlNlcnZpY2VDbGllbnRERE1hbmFnZXIgY2xpZW50TWdyOwotCXByaXZhdGUgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlciB3ZWJMaXN0ZW5lckdyb3VwOwotCXByaXZhdGUgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlciB3ZWJXZWxjb21lRmlsZUdyb3VwOwotCXByaXZhdGUgV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIgd2ViQ29udGV4dFBhcmFtR3JvdXA7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gYW5kIGZpcmUgdXBkYXRlcyBmb3IgMS4zIHdlYiBzZXJ2aWNlIGNsaWVudHMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciB7Ci0JCXByaXZhdGUgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwOwotCQlXZWJTZXJ2aWNlc0NsaWVudCBjbGllbnQ7Ci0KLQkJcHVibGljIEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyKFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQkJdGhpcy53ZWFrV2ViQXBwID0gd2Vha1dlYkFwcDsKLQkJCWluaXQoKTsKLQkJfQotCi0JCQotCi0JCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCQkvLyBUT0RPIGZpeCB1cCBub3RpZmljYXRpb24KLQkJCS8vIGVkaXRNb2RlbCA9IHdlYlNlcnZpY2VNZ3IuZ2V0V1NFZGl0TW9kZWwoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCkpOwotCQkJLy8gaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBlZGl0TW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkvLyBpZiAoZWRpdE1vZGVsLmdldDEzV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCS8vIGNsaWVudCA9IGVkaXRNb2RlbC5nZXQxM1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2UoKS5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJLy8gaWYgKGNsaWVudCAhPSBudWxsKQotCQkJLy8gY2xpZW50LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkJLy8gVE9ETyBmaXggdXAgbm90aWZpY2F0aW9uCi0JCQkvLyBpZiAoZWRpdE1vZGVsID09IG51bGwpCi0JCQkvLyBpbml0KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCB8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcykgPT0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUykgewotCQkJCQlOb3RpZmljYXRpb25XcmFwcGVyIG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcgTm90aWZpY2F0aW9uV3JhcHBlcih3ZWJSZWZzR3JvdXAsIG5vdGlmaWNhdGlvbik7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbldyYXBwZXIpOwotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBUT0RPIGZpeCB1cCBub3RpZmljYXRpb24KLQkJCQotCQkgICAgd2ViRXJyb3JQYWdlR3JvdXAuZGlzcG9zZSgpOwotCQkgICAgd2ViQ29udGV4dFBhcmFtR3JvdXAuZGlzcG9zZSgpOwotCQkgICAgd2ViV2VsY29tZUZpbGVHcm91cC5kaXNwb3NlKCk7IAotCQkJd2ViU2VydmxldEdyb3VwLmRpc3Bvc2UoKTsKLQkJCXdlYlNlcnZsZXRNYXBwaW5nR3JvdXAuZGlzcG9zZSgpOwotCQkJd2ViRmlsdGVyc0dyb3VwLmRpc3Bvc2UoKTsKLQkJCXdlYkZpbHRlck1hcHBpbmdHcm91cC5kaXNwb3NlKCk7Ci0JCQl3ZWJSZWZzR3JvdXAuZGlzcG9zZSgpOwotCQkJd2ViU2VjdXJpdHlHcm91cC5kaXNwb3NlKCk7Ci0JCQl3ZWJMaXN0ZW5lckdyb3VwLmRpc3Bvc2UoKTsKLQkJCQotCQkJd2Vha1dlYkFwcCA9IG51bGw7Ci0JCQkgaWYgKGNsaWVudCAhPSBudWxsKQotCQkJCSBjbGllbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJIGNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEoyRUVXZWJBcHBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdENoaWxkcmVuKCkgewotCQlpZiAoaXNJbml0aWFsaXppbmcpCi0JCQlyZXR1cm47Ci0JCQotCQlpc0luaXRpYWxpemluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQkJaWYgKGNsaWVudE1nciA9PSBudWxsKSB7Ci0JCQkJY2xpZW50TWdyID0gbmV3IEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyKHdlYWtXZWJBcHApOwotCQkJfQotLy8JCQlpZiAoISgoV2ViQXBwKXdlYWtXZWJBcHAuZ2V0KCkpLmdldEVycm9yUGFnZXMoKS5pc0VtcHR5KCkpIHsKLS8vCQkJICAgIGNoaWxkcmVuLmFkZCh3ZWJFcnJvclBhZ2VHcm91cCA9IG5ldyBXZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotLy8JCQl9IGVsc2UgewotLy8JCQkgICAgV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIgY2hpbGQgPSBudWxsOwotLy8JCQkgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLS8vCQkgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gY2hpbGRyZW4uZ2V0KGkpOwotLy8JCSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlcikgewotLy8JCSAgICAgICAgICAgICAgICBjaGlsZCA9IChXZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlcikgb2JqZWN0OwotLy8JCSAgICAgICAgICAgICAgICBicmVhazsKLS8vCQkgICAgICAgICAgICB9Ci0vLwkJICAgICAgICB9Ci0vLwkJCSAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotLy8JCQkgICAgICAgIGNoaWxkLmRpc3Bvc2UoKTsKLS8vCQkJICAgIH0KLS8vCQkJfQotLy8gICAgICAgICAgICBpZiAoISgoV2ViQXBwKXdlYWtXZWJBcHAuZ2V0KCkpLmdldENvbnRleHRQYXJhbXMoKS5pc0VtcHR5KCkpIHsKLS8vICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZCh3ZWJDb250ZXh0UGFyYW1Hcm91cCA9IG5ldyBXZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIgY2hpbGQgPSBudWxsOwotLy8gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLS8vICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gY2hpbGRyZW4uZ2V0KGkpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlcikgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IChXZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlcikgb2JqZWN0OwotLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpc3Bvc2UoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKChXZWJBcHApd2Vha1dlYkFwcC5nZXQoKSkuZ2V0RmlsZUxpc3QoKTsKLS8vICAgICAgICAgICAgaWYgKHdlbGNvbWVGaWxlTGlzdCAhPSBudWxsICYmICF3ZWxjb21lRmlsZUxpc3QuZ2V0RmlsZSgpLmlzRW1wdHkoKSkgewotLy8gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHdlYldlbGNvbWVGaWxlR3JvdXAgPSBuZXcgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlciBjaGlsZCA9IG51bGw7Ci0vLyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotLy8gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBjaGlsZHJlbi5nZXQoaSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdlYldlbGNvbWVGaWxlR3JvdXBJdGVtUHJvdmlkZXIpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSAoV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlcikgb2JqZWN0OwotLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpc3Bvc2UoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjaGlsZHJlbi5hZGQod2ViRXJyb3JQYWdlR3JvdXAgPSBuZXcgV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKLSAgICAgICAgICAgIGNoaWxkcmVuLmFkZCh3ZWJDb250ZXh0UGFyYW1Hcm91cCA9IG5ldyBXZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHdlYldlbGNvbWVGaWxlR3JvdXAgPSBuZXcgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotICAgICAgICAgICAgCi0JCQljaGlsZHJlbi5hZGQod2ViU2VydmxldEdyb3VwID0gbmV3IFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYlNlcnZsZXRNYXBwaW5nR3JvdXAgPSBuZXcgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYkZpbHRlcnNHcm91cCA9IG5ldyBXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKLQkJCWNoaWxkcmVuLmFkZCh3ZWJGaWx0ZXJNYXBwaW5nR3JvdXAgPSBuZXcgV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0JCQljaGlsZHJlbi5hZGQod2ViUmVmc0dyb3VwID0gbmV3IFdlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYlNlY3VyaXR5R3JvdXAgPSBuZXcgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYkxpc3RlbmVyR3JvdXAgPSBuZXcgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQl9IGZpbmFsbHkgewotCQkJaXNJbml0aWFsaXppbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHAgPSBudWxsOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBvYmplY3Q7Ci0JCQkvLyBJZiB1bmluaXRpYWxpemVkIG9yIHdlYiBhcHAgbmVlZHMgdG8gcmUtaW5pdGlhbGl6ZSwgaW5pdCB0aGUgY2hpbGRyZW4KLQkJCWlmKHdlYWtXZWJBcHAgPT0gbnVsbCB8fCBjaGlsZHJlbi5pc0VtcHR5KCkgfHwgd2ViQXBwICE9IHdlYWtXZWJBcHAuZ2V0KCkpIHsKLQkJCQl3ZWFrV2ViQXBwID0gbmV3IFdlYWtSZWZlcmVuY2Uod2ViQXBwKTsKLQkJCQlpbml0Q2hpbGRyZW4oKTsKLQkJCX0KLS8vCQkJaWYgKGlzSW5pdGlhbGl6aW5nKSByZXR1cm4gY2hpbGRyZW47Ci0vLwkJCWlzSW5pdGlhbGl6aW5nID0gdHJ1ZTsKLS8vCQkJdXBkYXRlQ29udGV4dFBhcmFtcyh3ZWJBcHApOwotLy8JCQl1cGRhdGVXZWxjb21lUGFnZXMod2ViQXBwKTsKLS8vCQkJaXNJbml0aWFsaXppbmcgPSBmYWxzZTsKLQkJCXJldHVybiBjaGlsZHJlbjsJCQkKLQkJfSAKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRQYXJhbXMoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBFTGlzdCBjb250ZXh0UGFyYW1zID0gd2ViQXBwLmdldENvbnRleHRQYXJhbXMoKTsKLSAgICAgICAgaWYgKGNvbnRleHRQYXJhbXMgPT0gbnVsbCB8fCBjb250ZXh0UGFyYW1zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHdlYkNvbnRleHRQYXJhbUdyb3VwICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKHdlYkNvbnRleHRQYXJhbUdyb3VwKTsKLSAgICAgICAgICAgICAgICB3ZWJDb250ZXh0UGFyYW1Hcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgd2ViQ29udGV4dFBhcmFtR3JvdXAgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdlYkNvbnRleHRQYXJhbUdyb3VwID09IG51bGwpIHsgCi0gICAgICAgICAgICBjaGlsZHJlbi5hZGQod2ViQ29udGV4dFBhcmFtR3JvdXAgPSBuZXcgV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXZWxjb21lUGFnZXMoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBXZWxjb21lRmlsZUxpc3QgZmlsZUxpc3QgPSB3ZWJBcHAuZ2V0RmlsZUxpc3QoKTsKLSAgICAgICAgaWYgKGZpbGVMaXN0ID09IG51bGwgfHwgZmlsZUxpc3QuZ2V0RmlsZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHdlYldlbGNvbWVGaWxlR3JvdXAgIT0gbnVsbCkgeyAKLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUod2ViV2VsY29tZUZpbGVHcm91cCk7Ci0gICAgICAgICAgICAgICAgd2ViV2VsY29tZUZpbGVHcm91cC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgd2ViV2VsY29tZUZpbGVHcm91cCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2ViV2VsY29tZUZpbGVHcm91cCA9PSBudWxsKSB7IAotICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHdlYldlbGNvbWVGaWxlR3JvdXAgPSBuZXcgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotICAgICAgICB9Ci0gICAgfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFdlIG9ubHkgY2FyZSBhYm91dCBhZGRzIGFuZCByZW1vdmVzIGZvciB0aGUgZGlmZmVyZW50IGl0ZW0gcHJvdmlkZXIKLQkJLy8gZ3JvdXBzCi0JCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCB8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCU9iamVjdCBub3RpZmllciA9IG51bGw7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViQXBwLmNsYXNzKSkgewotCQkJICAgIGNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTIDoKLQkJCSAgICAgICAgbm90aWZpZXIgPSB3ZWJFcnJvclBhZ2VHcm91cDsKLQkJCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMgOgotICAgICAgICAgICAgICAgICAgICBub3RpZmllciA9IHdlYkNvbnRleHRQYXJhbUdyb3VwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QgOgotICAgICAgICAgICAgICAgICAgICBub3RpZmllciA9IHdlYldlbGNvbWVGaWxlR3JvdXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJTZXJ2bGV0R3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgOgotCQkJCQlub3RpZmllciA9IHdlYlNlcnZsZXRNYXBwaW5nR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlMgOgotCQkJCQlub3RpZmllciA9IHdlYkZpbHRlcnNHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJGaWx0ZXJNYXBwaW5nR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJSZWZzR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUyA6Ci0JCQkJCW5vdGlmaWVyID0gd2ViU2VjdXJpdHlHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJMaXN0ZW5lckdyb3VwOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQkJTm90aWZpY2F0aW9uV3JhcHBlciBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3IE5vdGlmaWNhdGlvbldyYXBwZXIobm90aWZpZXIsIG5vdGlmaWNhdGlvbik7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjbGllbnRNZ3IgIT0gbnVsbCkKLQkJCWNsaWVudE1nci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjdjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEoyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24udXRpbC5XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdlYkFwcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJBcHBJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXdlYkFwcEl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFV2ViQXBwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gd2ViQXBwSXRlbVByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjFhNGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3ZWFrV2ViQXBwIT1udWxsKSB7Ci0JCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJCWlmKG51bGwgIT0gd2ViQXBwKXsKLQkJCQlyZXN1bHQuYWRkQWxsKCgoV2ViQXBwKXdlYkFwcCkuZ2V0Q29udGV4dFBhcmFtcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29udGV4dF9QYXJhbWV0ZXJzXzIiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc2YjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3ZWFrV2ViQXBwIT1udWxsKSB7Ci0JCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJCWlmKG51bGwgIT0gd2ViQXBwKXsKLQkJCQlyZXN1bHQuYWRkQWxsKCgoV2ViQXBwKXdlYkFwcCkuZ2V0RXJyb3JQYWdlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXJyb3JfcGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX1BhZ2VzXzEiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWU1ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSx3ZWFrV2ViQXBwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJaWYobnVsbCAhPSB3ZWJBcHApewotCQkJcmV0dXJuICgoV2ViQXBwKXdlYkFwcCkuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsdGVyX01hcHBpbmdzXzEiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODA5YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEZpbHRlci5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmaWx0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkgICAgaWYod2ViQXBwICE9IG51bGwpewotCSAgICAJcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCl3ZWJBcHApLmdldEZpbHRlcnMoKSk7Ci0JICAgIH0KLQkJcmV0dXJuIGdldFNvcnRlZENoaWxkcmVuKHJlc3VsdCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsdGVyc18xIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjk1NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIEoyRUVJdGVtUHJvdmlkZXIgewotCi0JY2xhc3MgV2ViR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgaWYgKG8xIGluc3RhbmNlb2YgU2VydmxldCkgewotICAgICAgICAgICAgICAgIFNlcnZsZXQgczEgPSAoU2VydmxldClvMTsKLSAgICAgICAgICAgICAgICBTZXJ2bGV0IHMyID0gKFNlcnZsZXQpbzI7Ci0gICAgICAgICAgICAgICAgaWYgKHMxLmdldFNlcnZsZXROYW1lKCkgIT0gbnVsbCAmJiBzMi5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgCXJldHVybiBzMS5nZXRTZXJ2bGV0TmFtZSgpLmNvbXBhcmVUbyhzMi5nZXRTZXJ2bGV0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIEZpbHRlcikgewotICAgICAgICAgICAgICAgIEZpbHRlciBmMSA9IChGaWx0ZXIpIG8xOwotICAgICAgICAgICAgICAgIEZpbHRlciBmMiA9IChGaWx0ZXIpIG8yOwotICAgICAgICAgICAgICAgIGlmIChmMS5nZXROYW1lKCkgIT0gbnVsbCAmJiBmMi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGYxLmdldE5hbWUoKS5jb21wYXJlVG8oZjIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIExpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgTGlzdGVuZXIgbDEgPSAoTGlzdGVuZXIpIG8xOwotICAgICAgICAgICAgICAgIExpc3RlbmVyIGwyID0gKExpc3RlbmVyKSBvMjsKLSAgICAgICAgICAgICAgICBpZiAobDEuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKSAhPSBudWxsICYmIGwyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCkgIT1udWxsKQotICAgICAgICAgICAgICAgIAlyZXR1cm4gbDEuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKS5jb21wYXJlVG8obDIuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcDsKLSAgICAKLSAgICBwdWJsaWMgV2ViR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMud2Vha1dlYkFwcCA9IHdlYWtXZWJBcHA7Ci0JfQotICAgIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFNvcnRlZENoaWxkcmVuKExpc3QgdGhlQ2hpbGRyZW4pIHsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGVDaGlsZHJlbiwgbmV3IFdlYkdyb3VwQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIHRoZUNoaWxkcmVuOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl3ZWFrV2ViQXBwID0gbnVsbDsKLQl9Ci0JCi0KLQlwdWJsaWMgSUZpbGUgZ2V0QXNzb2NpYXRlZEZpbGUoKSB7Ci0KLQkJdHJ5IHsgCi0JCQlXZWJBcHAgd2ViYXBwID0gKFdlYkFwcCkgd2Vha1dlYkFwcC5nZXQoKTsKLQkJCWlmKHdlYmFwcCAhPSBudWxsICYmIHdlYmFwcC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh3ZWJhcHAuZVJlc291cmNlKCkuZ2V0VVJJKCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZTgxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBGaWx0ZXIuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgT2JqZWN0IHdlYkFwcCA9IHdlYWtXZWJBcHAuZ2V0KCk7Ci0JICAgIGlmKHdlYkFwcCAhPSBudWxsKXsKLQkgICAgCXJlc3VsdC5hZGRBbGwoKChXZWJBcHApd2ViQXBwKS5nZXRMaXN0ZW5lcnMoKSk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGdldFNvcnRlZENoaWxkcmVuKHJlc3VsdCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTElTVEVORVIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZjYmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3Qgb2JqID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJaWYgKG51bGwgIT0gb2JqKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgb2JqOwotCQkJaWYgKCF3ZWJBcHAuZ2V0RWpiTG9jYWxSZWZzKCkuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJCWlmICghd2ViQXBwLmdldEVqYlJlZnMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0RWpiUmVmcygpKTsKLQkJCWlmICghd2ViQXBwLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0JCQlpZiAoIXdlYkFwcC5nZXRSZXNvdXJjZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0UmVzb3VyY2VSZWZzKCkpOwotCQkJaWYgKCF3ZWJBcHAuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQkJaWYgKCF3ZWJBcHAuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQlDb2xsZWN0aW9uIHNlcnZpY2VSZWZzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCQkJc2VydmljZVJlZnMgPSBzZXJ2aWNlSGVscGVyLmdldDEzU2VydmljZVJlZnMod2ViQXBwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiByZSkgewotCQkJCXNlcnZpY2VSZWZzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQotCQkJaWYgKHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHNlcnZpY2VSZWZzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVmZXJlbmNlc18xIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMGFhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJTZWN1cml0eUdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWN1cml0eV8xIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3Qgb2JqID0gd2Vha1dlYkFwcC5nZXQoKTsKLQkJaWYgKG51bGwgIT0gb2JqKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgb2JqOwotCQkJaWYgKCF3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlcygpLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRTZWN1cml0eVJvbGVzKCkpOwotCQkJaWYgKCF3ZWJBcHAuZ2V0Q29uc3RyYWludHMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0Q29uc3RyYWludHMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlIik7Ly8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxODY2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHdlYWtXZWJBcHAhPW51bGwpIHsKLQkJCU9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCQkJaWYobnVsbCAhPSB3ZWJBcHApewotCQkJCXJlc3VsdC5hZGRBbGwoKChXZWJBcHApd2ViQXBwKS5nZXRTZXJ2bGV0cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0U29ydGVkQ2hpbGRyZW4ocmVzdWx0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0c18xIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmIwYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCQlpZiAobnVsbCAhPSB3ZWJBcHApIHsKLQkJCXJldHVybiAoKFdlYkFwcCkgd2ViQXBwKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0X21hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9NYXBwaW5nc18yIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYldlbGNvbWVGaWxlR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0Y2NhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYldlbGNvbWVGaWxlR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHdlYWtXZWJBcHAhPW51bGwpIHsKLQkJCU9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwotCQkJaWYgKG51bGwgIT0gd2ViQXBwKSB7Ci0JCQkgICAgV2VsY29tZUZpbGVMaXN0IGZpbGVMaXN0ID0gKChXZWJBcHApd2ViQXBwKS5nZXRGaWxlTGlzdCgpOwotCQkJICAgIGlmIChmaWxlTGlzdCAhPSBudWxsKSB7Ci0JCQkgICAgICAgIHJlc3VsdC5hZGRBbGwoZmlsZUxpc3QuZ2V0RmlsZSgpKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlbGNvbWVfbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlbGNvbWVfUGFnZXNfMSIpOyAvLyROT04tTkxTLTEkIAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3N2I1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0Fubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwIHsKLQotCXByb3RlY3RlZCBPYmplY3QgbW9kZWw7Ci0JcHJvdGVjdGVkIE9iamVjdCBzeW5jaEhlbHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFubm90YXRpb25zOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZvckJlYW47Ci0JcHJpdmF0ZSBib29sZWFuIHVzZVNlcnZsZXRTdHJpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJUQUdTRVQgPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IG1vZGVsLCBib29sZWFuIGZvckJlYW4pIHsKLQkJdGhpcyhwYXJlbnQsIG1vZGVsLCBmb3JCZWFuLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IG1vZGVsLCBib29sZWFuIGZvckJlYW4sIGJvb2xlYW4gdXNlU2VydmxldCkgewotCQlzdXBlcigpOwotCQlzeW5jaEhlbHBlciA9IG5ldyBEYXRhTW9kZWxTeW5jaEhlbHBlcigoSURhdGFNb2RlbCltb2RlbCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5pc0ZvckJlYW4gPSBmb3JCZWFuOwotCQl0aGlzLnVzZVNlcnZsZXRTdHJpbmcgPSB1c2VTZXJ2bGV0OwotCQkKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIEFkZCBzZXBhcmF0b3IKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIEFkZCBzcGFjZXIKLQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMzsKLQkJc3BhY2VyLnNldExheW91dERhdGEoZ2QxKTsKLQkJLy8gQWRkIGFubm90YXRpb25zIGNoZWNrYm94IGFuZCBsYWJlbAotCQl1c2VBbm5vdGF0aW9ucyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlTdHJpbmcgbGFiZWxUZXh0OwotCQlpZiAodXNlU2VydmxldFN0cmluZykKLQkJCWxhYmVsVGV4dCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlVTRV9BTk5PVEFUSU9OU19TRVJWTEVUKTsKLQkJZWxzZSBpZiAoaXNGb3JCZWFuKQotCQkJbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0FOTk9UQVRJT05TKTsKLQkJZWxzZQotCQkJbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQUREX0FOTk9UQVRJT05TX1NVUFBPUlQpOwotCQl1c2VBbm5vdGF0aW9ucy5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0JCSgoRGF0YU1vZGVsU3luY2hIZWxwZXIpc3luY2hIZWxwZXIpLnN5bmNoQ2hlY2tib3godXNlQW5ub3RhdGlvbnMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIG51bGwpOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJdXNlQW5ub3RhdGlvbnMuc2V0TGF5b3V0RGF0YShnZDIpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJKChJRGF0YU1vZGVsKW1vZGVsKS5yZW1vdmVMaXN0ZW5lcigoRGF0YU1vZGVsU3luY2hIZWxwZXIpc3luY2hIZWxwZXIpOwotCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVtZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy9UT0RPIFJlbW92ZSAtIHRoaXMgaXMgdG8gYmUgaGFuZGxlZCBieSB0aGUgcHJvdmlkZXIgb2YgdGhlIERhdGFNb2RlbC4KLQl9Ci0JCi0JCi0KLQlwdWJsaWMgdm9pZCBzZXRVc2VTZXJ2bGV0KGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJdXNlU2VydmxldFN0cmluZyA9IGFCb29sZWFuOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU4M2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBzdHJ1Y3R1cmVzIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEKLSAqIGRlcGxveWFibGUgQXBwbGljYXRpb24gQ2xpZW50IEFyY2hpdmUgKi5qYXIgZmlsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBBcHBDbGllbnRFeHBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEFwcENsaWVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzEyYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUltcG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX0ZJTEVfTEFCRUwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJBUFBfQ0xJRU5UIjsgLy8kTk9OLU5MUy0xJDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5qYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGdldE5ld1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLQkvLyByZXR1cm4gZ2V0QXBwQ2xpZW50RGF0YU1vZGVsKCkuZ2V0SjJlZUFydGlmYWN0Q3JlYXRpb25EYXRhTW9kZWwoKTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCBnZXRBcHBDbGllbnREYXRhTW9kZWwoKSB7Ci0JLy8gcmV0dXJuIChBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwpIG1vZGVsOwotCS8vCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUDEpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCl7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjUyY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbQotICogYW4gZXhpc3RpbmcgQXBwbGljYXRpb24gQ2xpZW50ICouamFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBBcHBDbGllbnRJbXBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklNUE9SVF9XSVpfVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JCXJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9BUFBDTElFTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50RXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzZhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RXhwb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50RXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfRVhQT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9FWFBPUlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5qYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVFeHBvcnRQYWdlI2lzTWV0YVR5cGVTdXBwb3J0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBJSjJFRVVJQ29udGV4dElkcy5FWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMTsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotICAgICAgICByZXR1cm4gIkpTVF9BUFBDTElFTlQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUphcnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVKYXJzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhZDdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUphcnNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuT3ZlcmxheUljb247Ci0KLQotcHVibGljIGNsYXNzIEF2YWlsYWJsZUphcnNQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1dGlsSW1hZ2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBpbnZhbGlkSW1hZ2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlamJJbWFnZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVqYkNsaWVudEltYWdlOwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgY2xhc3NwYXRoSW1hZ2U7Ci0KLQkvKioKLQkgKiBBdmFpbGFibGVKYXJzQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEF2YWlsYWJsZUphcnNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogTGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBhYm91dCBzdGF0ZSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoZSByZW5kZXJpbmcgb2YgdGhlCi0JICogdmlld2VyIHRoYXQgdXNlcyB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4gV2hlbiBhIGxhYmVsIHByb3ZpZGVyIGlzIGF0dGFjaGVkIHRvIGEgdmlld2VyLCB0aGUgdmlld2VyCi0JICogd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGUgdmlld2VyIGlzIGJlaW5nIGNsb3NlZC4gV2hlbiBsYWJlbCBwcm92aWRlcnMgYXJlCi0JICogdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgdmlld2VyLCBpdCBpcyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQKLQkgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBpbWFnZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubwotCSAqICAgICAgICAgICAgaW5wdXQgb2JqZWN0IGlzIHNldCBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogICAgICAgICAgICB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGluIHdoaWNoIHRoZSBsYWJlbCBhcHBlYXJzCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA+IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ2xhc3NwYXRoRWxlbWVudCBjcCA9IChDbGFzc3BhdGhFbGVtZW50KSBlbGVtZW50OwotCQlpZiAoIWNwLmlzVmFsaWQoKSkKLQkJCXJldHVybiBnZXRJbnZhbGlkSW1hZ2UoKTsKLQkJCi0JCWlmIChjcC5pc0NsYXNzcGF0aEVudHJ5KCkpIHsKLQkJCXJldHVybiBnZXRDbGFzc3BhdGhEZXBlbmRlbmN5SW1hZ2UoKTsKLQkJfQotCQkKLQkJc3dpdGNoIChjcC5nZXRKYXJUeXBlKCkpIHsKLQkJCWNhc2UgQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSIDoKLQkJCQlyZXR1cm4gZ2V0RWpiSW1hZ2UoKTsKLQkJCWNhc2UgQ2xhc3NwYXRoRWxlbWVudC5FSkJfQ0xJRU5UX0pBUiA6Ci0JCQkJcmV0dXJuIGdldEVqYkNsaWVudEltYWdlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZ2V0VXRpbEltYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vCi0JICogICAgICAgICAgICBpbnB1dCBvYmplY3QgaXMgc2V0IGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOiB7Ci0JCQkJdmFsdWUgPSAoKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgMSA6Ci0JCQkJdmFsdWUgPSAoKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnQpLmdldFByb2plY3ROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVqYkltYWdlKCkgewotCQlpZiAoZWpiSW1hZ2UgPT0gbnVsbCkKLQkJCWVqYkltYWdlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJFSkJKYXIiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVqYkltYWdlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0RWpiQ2xpZW50SW1hZ2UoKSB7Ci0JCWlmIChlamJDbGllbnRJbWFnZSA9PSBudWxsKQotCQkJZWpiQ2xpZW50SW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoImVqYmNsaWVudGphcl9vYmoiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVqYkNsaWVudEltYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldENsYXNzcGF0aERlcGVuZGVuY3lJbWFnZSgpIHsKLQkJaWYgKGNsYXNzcGF0aEltYWdlID09IG51bGwpCi0JCQljbGFzc3BhdGhJbWFnZSA9IGdldEltYWdlRGVzY3JpcHRvcigiQ1BEZXAiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNsYXNzcGF0aEltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChDbGFzc1BhdGhTZWxlY3Rpb24pIGlucHV0RWxlbWVudDsKLQkJcmV0dXJuIGZpbHRlcihzZWxlY3Rpb24sIHNlbGVjdGlvbi5nZXRGaWx0ZXJMZXZlbCgpKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZmlsdGVyKENsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24sIGludCBmaWx0ZXJMZXZlbCkgewotCQlMaXN0IGxpc3QgPSBzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJc3dpdGNoIChmaWx0ZXJMZXZlbCkgewotCQkJCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX0VKQl9DTElFTlRfSkFSUykgOgotCQkJCQkJaWYgKGVsZW1lbnQuaXNFSkJDbGllbnRKYXIoKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX0VKQl9TRVJWRVJfSkFSUykgOgotCQkJCQkJaWYgKGVsZW1lbnQuaXNFSkJKYXIoKSAmJiBzZWxlY3Rpb24uZ2V0T3Bwb3NpdGVFbGVtZW50KGVsZW1lbnQpICE9IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCi0JCVVSTCBnaWZJbWFnZVVSTCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2Uoa2V5KTsKLQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2lmSW1hZ2VVUkwpOwotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0SW52YWxpZEltYWdlKCkgewotCQlpZiAoaW52YWxpZEltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBiYXNlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJqYXJfbm9uZXhpc3Rfb2JqIik7Ly8kTk9OLU5MUy0xJAotCQkJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBnZXRJbWFnZURlc2NyaXB0b3IoIndhcm5pbmdfY28iKTsvLyROT04tTkxTLTEkCi0JCQlpbnZhbGlkSW1hZ2UgPSBuZXcgT3ZlcmxheUljb24oYmFzZSwgbmV3IEltYWdlRGVzY3JpcHRvcltdW117e292ZXJsYXl9fSkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gaW52YWxpZEltYWdlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0VXRpbEltYWdlKCkgewotCQlpZiAodXRpbEltYWdlID09IG51bGwpCi0JCQl1dGlsSW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoImphcl9vYmoiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHV0aWxJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQKLQkgKiBlbGVtZW50LgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIgdG8gY2hhbmdlcyBvbgotCSAqIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciBmcm9tIHRoZSBvbGQgaW5wdXQuCi0JICogSW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHRoZSBjb250ZW50IHByb3ZpZGVyIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlCi0JICogdmlld2VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogICAgICAgICAgICB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZGlkIG5vdCBwcmV2aW91c2x5Ci0JICogICAgICAgICAgICBoYXZlIGFuIGlucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICogICAgICAgICAgICB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZG9lcyBub3QgaGF2ZSBhbiBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbgotCSAqIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgYSBub24tc3RydWN0dXJhbCB2aWV3ZXIgdXBkYXRlLiBJZiB0aGUgcHJvcGVydHkKLQkgKiBtZW50aW9uZWQgaW4gdGhlIHVwZGF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLCB0aGVuIHRoZSB2aWV3ZXIgbmVlZCBub3QgdXBkYXRlIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0Ci0JICogICAgICAgICB3b3VsZCBiZSB1bmFmZmVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QKLQkgKiByZWdpc3RlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDFhN2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjIsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEF2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIoKSB7Ci0JCS8vRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFyY2hpdmVXcmFwcGVyKXsKLQkJCUFyY2hpdmVXcmFwcGVyIHdyYXBwZXIgPSAoQXJjaGl2ZVdyYXBwZXIpaW5wdXRFbGVtZW50OwotCQkJTGlzdCA8QXJjaGl2ZVdyYXBwZXI+IHV0aWxpdGllcyA9IHdyYXBwZXIuZ2V0RUFSVXRpbGl0aWVzQW5kV2ViTGlicygpOwotCQkJTGlzdCBmaWx0ZXJlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHV0aWxpdGllcy5zaXplKCkgPiAwKXsKLQkJCQlmaWx0ZXJFSkJDbGllbnRKYXJzKHV0aWxpdGllcywgd3JhcHBlcik7Ci0JCQkJT2JqZWN0IFtdIGFycmF5ID0gdXRpbGl0aWVzLnRvQXJyYXkoKTsKLQkJCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJcmV0dXJuIGdldENvbHVtblRleHQobzEsIDApLmNvbXBhcmVUbyhnZXRDb2x1bW5UZXh0KG8yLCAwKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gYXJyYXk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFycmF5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgdm9pZCBmaWx0ZXJFSkJDbGllbnRKYXJzKExpc3QgPEFyY2hpdmVXcmFwcGVyPiB1dGlsaXRpZXMsIEFyY2hpdmVXcmFwcGVyIGVhcldyYXBwZXIpIHsKLQkJTGlzdCA8QXJjaGl2ZVdyYXBwZXI+IG1vZHVsZXMgPSBlYXJXcmFwcGVyLmdldEVhck1vZHVsZXMoKTsKLQkJZm9yKEFyY2hpdmVXcmFwcGVyIG1vZHVsZSA6IG1vZHVsZXMpewotCQkJaWYobW9kdWxlLmlzRUpCSmFyRmlsZSgpKXsKLQkJCQlBcmNoaXZlV3JhcHBlciBjbGllbnRXcmFwcGVyID0gZWFyV3JhcHBlci5nZXRFSkJDbGllbnRBcmNoaXZlV3JhcHBlcihtb2R1bGUpOwotCQkJCWlmKG51bGwgIT0gY2xpZW50V3JhcHBlcil7Ci0JCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQlmb3IoaW50IGk9MDtpPHV0aWxpdGllcy5zaXplKCkgJiYgIXJlbW92ZWQ7IGkrKyl7Ci0JCQkJCQlpZihjbGllbnRXcmFwcGVyLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkgPT0gdXRpbGl0aWVzLmdldChpKS5nZXRVbmRlckx5aW5nQXJjaGl2ZSgpKXsKLQkJCQkJCQl1dGlsaXRpZXMucmVtb3ZlKGkpOwotCQkJCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBBdmFpbGFibGVKYXJzUHJvdmlkZXIuZ2V0VXRpbEltYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IChBcmNoaXZlV3JhcHBlcillbGVtZW50OwotCQlJUGF0aCBwYXRoID0gd3JhcHBlci5nZXRQYXRoKCk7Ci0JCWlmKHBhdGgudG9TdHJpbmcoKS5zdGFydHNXaXRoKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpKXsKLQkJCXJldHVybiB3cmFwcGVyLmdldFBhcmVudCgpLmdldE5hbWUoKSsiIyIrd3JhcHBlci5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gd3JhcHBlci5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0F1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9BdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9BdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjljYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMiwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBBdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyKCkgewotCQkvL2RlZmF1bHQgY29uc3RydWN0b3IKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkvKgotCQkgKiBPYmplY3RbXSBhcnJheSA9IEVBUkltcG9ydERhdGFNb2RlbC5nZXRBbGxVdGlsaXRpZXMoKEVBUkZpbGUpIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQkgKi8KLQkJT2JqZWN0W10gYXJyYXkgPSBnZXRKYXJGaWxlc0Zyb21EaXJlY3RvcnkoaW5wdXRFbGVtZW50KTsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCX0KLQotCQl9KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRKYXJGaWxlc0Zyb21EaXJlY3RvcnkoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCi0JCUxpc3QgY29sbGVjdGVkSmFycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJRGF0YU1vZGVsKQotCQkJbW9kZWwgPSAoSURhdGFNb2RlbCkgaW5wdXRFbGVtZW50OwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCi0JCQlTdHJpbmcgZmlsZU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkpOwotCQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQlpZiAoZGlyZWN0b3J5LmV4aXN0cygpICYmIGRpcmVjdG9yeS5jYW5SZWFkKCkgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlW10gYXZhaWxhYmxlRmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0KLQkJCQlpZiAoYXZhaWxhYmxlRmlsZXMgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5ldyBGaWxlWzBdOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVGaWxlcy5sZW5ndGg7IGkrKykKLQkJCQkJaWYgKGF2YWlsYWJsZUZpbGVzW2ldICE9IG51bGwgJiYgYXZhaWxhYmxlRmlsZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpY29sbGVjdGVkSmFycy5hZGQoYXZhaWxhYmxlRmlsZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbGxlY3RlZEphcnMudG9BcnJheSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmdldFV0aWxJbWFnZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8qCi0JCSAqIEZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGVsZW1lbnQ7IGlmCi0JCSAqIChmaWxlLmdldFVSSSgpLnN0YXJ0c1dpdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkpIHsgU3RyaW5nIHBhcmVudFdhckZpbGVOYW1lID0KLQkJICogKChXQVJGaWxlKSBmaWxlLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpOyByZXR1cm4gcGFyZW50V2FyRmlsZU5hbWUgKyAiIyIgKyBmaWxlLmdldFVSSSgpOwotCQkgKiAvLyROT04tTkxTLTEkIH0gZWxzZSByZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0JCSAqLwotCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9kaXNwb3NlCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQ2xhc3Nlc0ltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDdmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5idWlsZHBhdGhzLkNQTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotcHVibGljIGNsYXNzIENsYXNzZXNJbXBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UgbWFpblBhZ2UgPSBudWxsOwotCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSBwYWdlMSA9IG51bGw7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIElQYXRoIGltcG9ydGVkQ2xhc3Nlc1BhdGg7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBmaWxlTmFtZXMgPSBudWxsOwotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCi0JfQotCi0JcHVibGljIENsYXNzZXNJbXBvcnRXaXphcmQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpbGVOYW1lLCBMaXN0IG90aGVyRmlsZU5hbWVzKSB7Ci0JCXRoaXMocHJvamVjdCk7Ci0JCXRoaXMuZmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZpbGVOYW1lcy5hZGQoZmlsZU5hbWUpOwotCQlpbnQgaSA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJU3RyaW5nIHBhcmVudERpciA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpKTsKLQkJaWYgKG90aGVyRmlsZU5hbWVzICE9IG51bGwpCi0JCQlmb3IgKGludCBqID0gb3RoZXJGaWxlTmFtZXMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pIHsKLQkJCQlpZiAob3RoZXJGaWxlTmFtZXMuZ2V0KGopICE9IG51bGwpIHsKLQkJCQkJaW50IGsgPSAoKFN0cmluZykgb3RoZXJGaWxlTmFtZXMuZ2V0KGopKS5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQkJCWlmIChrID09IGkgJiYgcGFyZW50RGlyLmVxdWFscygoKFN0cmluZykgb3RoZXJGaWxlTmFtZXMuZ2V0KGopKS5zdWJzdHJpbmcoMCwgaykpKSB7Ci0JCQkJCQlmaWxlTmFtZXMuYWRkKG90aGVyRmlsZU5hbWVzLnJlbW92ZShqKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2xkZXJQYXRoKElQYXRoIHBhdGgpIHsKLQkJaW1wb3J0ZWRDbGFzc2VzUGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZTEuZmluaXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlSW1wb3J0ZWRDbGFzc2VzRm9sZGVyKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCS8vQ3JlYXRlIGltcG9ydGVkX2NsYXNzZXMgZm9sZGVyIHNlbGVjdGVkIHByb2plY3QKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBhUHJvamVjdDsKLQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCJpbXBvcnRlZF9jbGFzc2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWphdmFQcm9qZWN0ID0gZ2V0SUphdmFQcm9qZWN0KGFQcm9qZWN0KTsKLQotCQlJUGF0aCBpbXBvcnRlZEZvbGRlcnNDbGFzcyA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCi0JCUNQTGlzdEVsZW1lbnQgZW50cnkgPSBuZXdDUExpYnJhcnlFbGVtZW50KGZvbGRlcik7Ci0JCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IGVudHJ5LmdldENsYXNzcGF0aEVudHJ5KCk7Ci0KLQkJSVJlc291cmNlIHJlcyA9IGVudHJ5LmdldFJlc291cmNlKCk7Ci0JCWlmICgocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgJiYgIXJlcy5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlDb3JlVXRpbGl0eS5jcmVhdGVGb2xkZXIoKElGb2xkZXIpIHJlcywgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCArIDFdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDbGFzc3BhdGhbaV0gPSBjbGFzc3BhdGhFbnRyaWVzW2ldOwotCQkJfQotCQkJbmV3Q2xhc3NwYXRoW2NsYXNzcGF0aEVudHJpZXMubGVuZ3RoXSA9IG5ld0VudHJ5OwotCi0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCi0JCXNldEZvbGRlclBhdGgoaW1wb3J0ZWRGb2xkZXJzQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldElKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0SGFuZGxlKSB7Ci0JCUlKYXZhTW9kZWwgamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlyZXR1cm4gamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3RIYW5kbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIENQTGlzdEVsZW1lbnQgbmV3Q1BMaWJyYXJ5RWxlbWVudChJUmVzb3VyY2UgcmVzKSB7Ci0KLQkJcmV0dXJuIG5ldyBDUExpc3RFbGVtZW50KGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksIHJlcy5nZXRGdWxsUGF0aCgpLCByZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NfRmlsZXNfVUkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl3b3JrYmVuY2ggPSBhV29ya2JlbmNoOwotCQlzZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlpZiAoIWFTZWxlY3Rpb24uaXNFbXB0eSgpICYmIGFTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIGFTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCWNyZWF0ZUltcG9ydGVkQ2xhc3Nlc0ZvbGRlcihwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCQltYWluUGFnZSA9IG5ldyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UoImlkIiwgZmlsZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJbWFpblBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCQkJaWYgKGZpbGVOYW1lcyA9PSBudWxsIHx8IGZpbGVOYW1lcy5zaXplKCkgPT0gMCkKLQkJCQlhZGRQYWdlKG1haW5QYWdlKTsKLQkJCXBhZ2UxID0gbmV3IFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSh3b3JrYmVuY2gsIHNlbGVjdGlvbiwgaW1wb3J0ZWRDbGFzc2VzUGF0aCwgZmlsZU5hbWVzKTsKLQkJCXBhZ2UxLnNldFdpemFyZCh0aGlzKTsKLQkJCWFkZFBhZ2UocGFnZTEpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMWQ4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9QRyA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfV0laX1RJVExFKSk7Ci0JCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy9mdWxsLyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gSURFV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvblBhdGggKyAid2l6YmFuL25ld193aXoucG5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4uIElnbm9yZS4KLQkJfQotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UoZ2V0RGF0YU1vZGVsKCksIFNFTEVDVElPTl9QRykpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKCFzdXBlci5jYW5GaW5pc2goKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVOQUJMRUQpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTJlN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50RXhwb3J0UGFnZSBleHRlbmRzIEoyRUVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50RXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9FWFBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfRVhQT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfUFJPSkVDVF9GT1JfTU9EVUxFX0NSRUFUSU9OKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmVhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNob3dQcm9qZWN0RmlsZXNDaGVja2JveCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkd9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gSUoyRUVVSUNvbnRleHRJZHMuRVhQT1JUX0VBUl9XSVpBUkRfUDE7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotICAgICAgICByZXR1cm4gIkpTVF9FQVIiOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWIyNjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBzdHJ1Y3R1cmVzIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEKLSAqIGRlcGxveWFibGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBBcmNoaXZlICouZWFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFQVJDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRFeHBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzExZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgOCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByaXZhdGUgTGFiZWwgbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VBbHRlcm5hdGVSb290QnRuOwotCXByb3RlY3RlZCBUZXh0IHN5c3RlbURlZmF1bHRUZXh0OwotCXByb3RlY3RlZCBBcmNoaXZlV3JhcHBlciBhV3JhcHBlcjsKLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyOwotCXB1YmxpYyBib29sZWFuIHV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9FQVJfV0laQVJEX1AyKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3JlYXRlSkFSc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVQcm9qZWN0Um9vdENvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGFsbCBidXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKSB7Ci0JCXV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdmFpbGFibGVKYXJzTGlzdChDb21wb3NpdGUgbGlzdEdyb3VwKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChsaXN0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjAwOwotCQlnRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlBdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyIGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlcigpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfTElTVCkpIHsKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QpKS50b0FycmF5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJQXJyYXlMaXN0IGVtcHR5U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNULCBlbXB0eVNlbGVjdGlvbik7Ci0JCXZhbGlkYXRlUGFnZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlBcnJheUxpc3QgYWxsU2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyAobnVsbCAhPSAoc2VsZWN0aW9uID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRFbGVtZW50QXQoaSkpKTsgaSsrKSB7Ci0JCQlhbGxTZWxlY3Rpb24uYWRkKHNlbGVjdGlvbik7Ci0JCX0KLQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNULCBhbGxTZWxlY3Rpb24pOwotCQl2YWxpZGF0ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coYnJvd3NlQnV0dG9uLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5TRUxFQ1RfRElSRUNUT1JZX0RMRykpOwotCi0JCVN0cmluZyBkaXJOYW1lID0gZ2V0QnJvd3NlU3RhcnRMb2NhdGlvbigpOwotCi0JCWlmICghaXNOdWxsT3JFbXB0eShkaXJOYW1lKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQkJfQotCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJc3lzdGVtRGVmYXVsdFRleHQuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKSB7Ci0JCVN0cmluZyB0ZXh0ID0gc3lzdGVtRGVmYXVsdFRleHQuZ2V0VGV4dCgpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9TRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxNDA7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9ERVNFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdkLndpZHRoSGludCA9IDE0MDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKQVJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9KQVJTX0dST1VQKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9VVElMX0pBUlNfVE9fQkVfUFJPSkVDVFMpKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQkvLyBjcmVhdGUgamFycyBjaGVjayBib3ggdmlld2VyCi0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KGdyb3VwKTsKLQkJY3JlYXRlQnV0dG9uc0dyb3VwKGdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0Um9vdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfTE9DQVRJT05TX0dST1VQKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfUFJPSkVDVF9HUk9VUF9ERVNDUklQVElPTikpOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0RFRkFVTFRfUk9PVF9SQURJTykpOwotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlzeXN0ZW1EZWZhdWx0VGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJc3lzdGVtRGVmYXVsdFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChzeXN0ZW1EZWZhdWx0VGV4dCwgSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PRFVMRV9ST09ULCBudWxsKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChpc0VBUkZpbGVDaGFuZ2VkKCkpIHsKLQkJCWFXcmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEpBUnNDb21wb3NpdGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRBbGxHcmF5ZWQoIWVuYWJsZWQpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChhV3JhcHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGFXcmFwcGVyICE9IG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QsIGdldEpBUnNGb3JQcm9qZWN0cygpKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SkFSc0ZvclByb2plY3RzKCkgewotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde307Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2QxYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDgsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQlwcm90ZWN0ZWQgQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm87Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUZpbGVOYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVByb2plY3ROYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWxlSW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9GSUxFX0xBQkVMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5lYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVNb2R1bGVJbXBvcnRQYWdlI2NyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIG5ldyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChjb21wb3NpdGUsIG1vZGVsLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLAotCQkJCQlJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwKLQkJCQkJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuRUFSX05BTUVfVkFMSURBVElPTiwKLQkJCQkJSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLAotCQkJCQlJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLAotCQkJCQlKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5GQUNFVF9SVU5USU1FfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWxlTmFtZXNTdG9yZUlEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiAiRUFSIjsvLyROT04tTkxTLTEkCi0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNWM4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBBcHBsaWNhdGlvbiBzdHJ1Y3R1cmVzIGludG8gdGhlIEVjbGlwc2UgV29ya2JlbmNoIGZyb20gYW4gZXhpc3RpbmcKLSAqIEVudGVycHJpc2UgQXBwbGljYXRpb24gQXJjaGl2ZSAqLmVhciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElJbXBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBQcm9qZWN0cyBwYWdlIG9mIHRoZSBXaXphcmQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUEcgPSAicHJvamVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdGFudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBrZXkgb2YgdGhlIE9wdGlvbnMgcGFnZSBvZiB0aGUgV2l6YXJkLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05TX1BHID0gIm9wdGlvbnMiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjM4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgZm9sbG93aW5nIHBhZ2VzOgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rIEVBUkNvbXBvbmVudEltcG9ydFBhZ2V9YXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pCi0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZX1hcyB0aGUgb3B0aW9ucyB3aXphcmQgcGFnZSAoe0BsaW5rICNPUFRJT05TX1BHfSkKLQkgKiA8bGk+e0BsaW5rIEVBUkNvbXBvbmVudFByb2plY3RzUGFnZX1hcyB0aGUgcHJvamVjdCB3aXphcmQgcGFnZSAoe0BsaW5rICNQUk9KRUNUX1BHfSkKLQkgKiA8L3VsPgotCSAqIAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRJbXBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKSk7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlKGdldERhdGFNb2RlbCgpLCBPUFRJT05TX1BHKSk7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudFByb2plY3RzUGFnZShnZXREYXRhTW9kZWwoKSwgUFJPSkVDVF9QRykpOwotCX0KLQotCi0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0VBUik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudFByb2plY3RzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwYTBiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudFByb2plY3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgOCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBlYXJGaWxlTGlzdFZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQ09MVU1OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0NPTFVNTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DT0xVTU4gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudFByb2plY3RzUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9QUk9KRUNUX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfUFJPSkVDVF9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMyk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVCdXR0b25zR3JvdXAoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbHVtbkVkaXRvcnMoKSB7Ci0JCVRhYmxlIHQgPSBlYXJGaWxlTGlzdFZpZXdlci5nZXRUYWJsZSgpOwotCQlDZWxsRWRpdG9yW10gY29sdW1uRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW3QuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWNvbHVtbkVkaXRvcnNbMV0gPSBuZXcgVGV4dENlbGxFZGl0b3IodCk7Ci0KLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY29sdW1uRWRpdG9ycyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlCdXR0b24gc2VsZWN0Tm90SW5Xb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdE5vdEluV29ya3NwYWNlLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8zIikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQkvL2dkLmhvcml6b250YWxTcGFuID0gMTsKLQkJLy9nZC5oZWlnaHRIaW50ID0gMjI7Ci0JCWdkLndpZHRoSGludCA9IDE0MDsKLQkJc2VsZWN0Tm90SW5Xb3Jrc3BhY2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdE5vdEluV29ya3NwYWNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCQkJTGlzdCBzZWxlY3RlZExpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpOwotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQluZXdMaXN0LmFkZEFsbChzZWxlY3RlZExpc3QpOwotCQkJCUlEYXRhTW9kZWwgaW1wb3J0RE0gPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlpbXBvcnRETSA9IChJRGF0YU1vZGVsKSBsaXN0LmdldChpKTsKLQkJCQkJaWYgKCFuZXdMaXN0LmNvbnRhaW5zKGltcG9ydERNKSkgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGVtcENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgaW1wb3J0RE0uZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVCk7Ci0JCQkJCQlpZih0ZW1wQ29tcG9uZW50ID09IG51bGwgfHwgIXRlbXBDb21wb25lbnQuZXhpc3RzKCkpewotCQkJCQkJCW5ld0xpc3QuYWRkKGltcG9ydERNKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCwgbmV3TGlzdCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJLy9nZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCS8vZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxNDA7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW5ld0xpc3QuYWRkQWxsKGxpc3QpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQkvLy8vZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkvL2dkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTQwOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpKSB7Ci0JCQlpZihlYXJGaWxlTGlzdFZpZXdlciAhPSBudWxsKXsKLQkJCQl1cGRhdGVHVUlDaGVja1NlbGVjdGlvbigpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsZUxpc3RWaWV3ZXJJbnB1dCgpIHsKLQkJVGFibGVPYmplY3RzIGZpbGVzID0gbmV3IFRhYmxlT2JqZWN0cygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlmaWxlcy50YWJsZU9iamVjdHNMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldElucHV0KGZpbGVzKTsKLQkJdXBkYXRlR1VJQ2hlY2tTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR1VJQ2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNUKTsKLQkJTGlzdCBwcm9qZWN0TGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCU9iamVjdCBjdXJyZW50RWxlbWVudCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWN1cnJlbnRFbGVtZW50ID0gcHJvamVjdExpc3QuZ2V0KGkpOwotCQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2hlY2tlZChjdXJyZW50RWxlbWVudCwgc2VsZWN0ZWRMaXN0LmNvbnRhaW5zKGN1cnJlbnRFbGVtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndpemFyZC5KMkVFV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXNldEZpbGVMaXN0Vmlld2VySW5wdXQoKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW1wb3J0IHNvdXJjZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMuIDxiPlN1YmNsYXNzZXMgPC9iPiBtdXN0IG92ZXJyaWRlIHRoaXMgaG9vawotCSAqIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIGFzIHRoZSBwYXJlbnQgb2YgdGhpcyBncm91cCdzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIHZpc3VhbCBjb21wb25lbnRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0R3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbGlzdEdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCWVhckZpbGVMaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQllYXJGaWxlTGlzdFZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSURhdGFNb2RlbCBtYXRjaGluZ01vZGVsID0gbnVsbDsvLyBnZXRFQVJJbXBvcnREYXRhTW9kZWwoKS5nZXRNYXRjaGluZ0VKQkphck9yQ2xpZW50KGFNb2RlbCk7Ci0JCQkJaWYgKG51bGwgIT0gbWF0Y2hpbmdNb2RlbCkgewotCQkJCQllYXJGaWxlTGlzdFZpZXdlci5zZXRDaGVja2VkKG1hdGNoaW5nTW9kZWwsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlYXJGaWxlTGlzdFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCByZXN1bHQpOwotCi0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlIGVhckZpbGVMaXN0VGFibGUgPSAoVGFibGUpIGVhckZpbGVMaXN0Vmlld2VyLmdldENvbnRyb2woKTsKLQkJZWFyRmlsZUxpc3RUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQllYXJGaWxlTGlzdFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJLy8gc2V0IHVwIHRhYmxlIGxheW91dAotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCB0cnVlKSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjAwLCB0cnVlKSk7Ci0JCWVhckZpbGVMaXN0VGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQllYXJGaWxlTGlzdFRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCi0KLQkJVGFibGVDb2x1bW4gZmlsZU5hbWVDb2x1bW5zID0gbmV3IFRhYmxlQ29sdW1uKGVhckZpbGVMaXN0VGFibGUsIFNXVC5OT05FKTsKLQkJZmlsZU5hbWVDb2x1bW5zLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9Nb2R1bGVzX2luX0VBUikpOwotCQlmaWxlTmFtZUNvbHVtbnMuc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGltcG9ydE5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZWFyRmlsZUxpc3RUYWJsZSwgU1dULk5PTkUpOwotCQlpbXBvcnROYW1lQ29sdW1uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9OZXdfUHJvamVjdF9OYW1lKSk7Ci0JCWltcG9ydE5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSBuZXcgU3RyaW5nWzJdOwotCQljb2x1bW5Qcm9wZXJ0aWVzWzBdID0gRklMRV9DT0xVTU47Ci0JCWNvbHVtblByb3BlcnRpZXNbMV0gPSBQUk9KRUNUX0NPTFVNTjsKLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotCQlzZXRDb2x1bW5FZGl0b3JzKCk7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIFBST0pFQ1RfQ09MVU1OLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gZWFyRmlsZUxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zWzBdOwotCQkJCXJldHVybiBpdGVtLmdldFRleHQoMSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCQlUYWJsZUl0ZW0gZWxlbWVudEhvbGRlciA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJaWYgKHByb3BlcnR5LmVxdWFscyhQUk9KRUNUX0NPTFVNTikpIHsKLQkJCQkJZWxlbWVudEhvbGRlci5zZXRUZXh0KDEsIChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJKChJRGF0YU1vZGVsKSBlbGVtZW50SG9sZGVyLmdldERhdGEoKSkuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5ORVNURURfUFJPSkVDVFNfVkFMSURBVElPTn07Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjVmNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS83LzIwMDEgMTE6Mzk6MTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4gVGhlIHJlc3VsdCBpcyBub3QKLQkgKiBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZU9iamVjdHMpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKChUYWJsZU9iamVjdHMpIGlucHV0RWxlbWVudCkuZ2V0VGFibGVPYmplY3RzKCkudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsgLy8gc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBpbnN0ZWFkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgKiAgICAgICAgICAgIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgbGFiZWwgYXBwZWFycwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vCi0JICogICAgICAgICAgICBpbnB1dCBvYmplY3QgaXMgc2V0IGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IChBcmNoaXZlV3JhcHBlcikgZGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJaWYgKHdyYXBwZXIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkgewotCQkJCVN0cmluZyBwYXJlbnRXYXJGaWxlTmFtZSA9IHdyYXBwZXIuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBwYXJlbnRXYXJGaWxlTmFtZSArICIjIiArIHdyYXBwZXIuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gd3JhcHBlci5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkxpYnJhcmllc0NvbnRhaW5lclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVkYWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0VsZW1lbnRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFQVJMaWJyYXJpZXNDb250YWluZXJQYWdlIGV4dGVuZHMgTmV3RWxlbWVudFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSwgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb24gewotCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLQlwdWJsaWMgRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZSgpIHsKLQkJc3VwZXIoIkVBUkxpYnJhcmllc0NvbnRhaW5lclBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShFQVJMaWJyYXJpZXNNZXNzYWdlcy5FQVJMaWJyYXJpZXNDb250YWluZXJQYWdlXzApOwotCQlzZXREZXNjcmlwdGlvbihFQVJMaWJyYXJpZXNNZXNzYWdlcy5FQVJMaWJyYXJpZXNDb250YWluZXJQYWdlXzEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLkNPTlRBSU5FUl9QQVRIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSUNsYXNzcGF0aEVudHJ5IGNvbnRhaW5lckVudHJ5KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotCQl0ZXh0LnNldFRleHQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50RW50cmllcykgewotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRUFSTGlicmFyaWVzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLmVhcmxpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJMaWJyYXJpZXNDb250YWluZXJQYWdlXzA7Ci0KLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZV8xOwotCQlzdGF0aWMgewotCQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVBUkxpYnJhcmllc01lc3NhZ2VzLmNsYXNzKTsKLQkJfQotCi0JCXByaXZhdGUgRUFSTGlicmFyaWVzTWVzc2FnZXMoKSB7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUlZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM3NzJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRUFSVmFsaWRhdGlvbkhlbHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUFSVmFsaWRhdGlvbkhlbHBlci4KLQkgKi8KLQlwcml2YXRlIEVBUlZhbGlkYXRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBydW5uYWJsZSB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgZm9yIGFsbCBFQVIgcHJvamVjdHMgd2hpY2ggaGF2ZSBhdXRvIHZhbGlkYXRlCi0JICogZW5hYmxlZCwgYW5kIGFyZSBpbXBhY3RlZCBieSB0aGUgbGlzdCBvZiBwcm9qZWN0czsgSWYgdGhlIGVhciBwcm9qZWN0IGl0c2VsZiBpcyBpbiB0aGUgbGlzdCwKLQkgKiB0aGVuIGl0IGlzIHNraXBwZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3NbXSBnZXRFQVJWYWxpZGF0aW9uT3BlcmF0aW9ucyhMaXN0IG1vZGlmaWVkUHJvamVjdHMpIHsKLQkJTGlzdCBlYXJQcm9qZWN0cyA9IEFycmF5cy5hc0xpc3QoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHNJbldvcmtzcGFjZU9mVHlwZShKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlYXJQcm9qZWN0cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdCBlYXJQcm9qID0gKElQcm9qZWN0KSBlYXJQcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAod2lsbEVBUlByb2plY3ROZWVkVmFsaWRhdGlvbihlYXJQcm9qLCBtb2RpZmllZFByb2plY3RzKSkgewotCQkJCXJlc3VsdC5hZGQoY3JlYXRlVmFsaWRhdGlvblJ1bm5hYmxlKGVhclByb2opKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdKSByZXN1bHQudG9BcnJheShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHJ1bm5hYmxlIHZhbGlkYXRpb24gb3BlcmF0aW9ucyBmb3IgYWxsIEVBUiBwcm9qZWN0cyB3aGljaCBoYXZlIGF1dG8gdmFsaWRhdGUKLQkgKiBlbmFibGVkLCBhbmQgYXJlIGltcGFjdGVkIGJ5IHRoZSBqMmVlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKElQcm9qZWN0IG1vZGlmaWVkSjJFRVByb2plY3QpIHsKLQkJcmV0dXJuIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW9kaWZpZWRKMkVFUHJvamVjdCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChJUHJvamVjdCBlYXJQcm9qKSB7Ci0JCXJldHVybiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0F1dG9WYWxpZGF0ZShlYXJQcm9qKSAmJiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0VuYWJsZWQoZWFyUHJvaiwgVUlFYXJWYWxpZGF0b3IuVkFMSURBVE9SX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHdpbGxFQVJQcm9qZWN0TmVlZFZhbGlkYXRpb24oSVByb2plY3QgZWFyUHJvaiwgTGlzdCBtb2RpZmllZFByb2plY3RzKSB7Ci0JCWlmIChtb2RpZmllZFByb2plY3RzLmNvbnRhaW5zKGVhclByb2opIHx8ICFpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChlYXJQcm9qKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9UT0RPIG1pZ3JhdGUgdG8gdXNlIGFydGlmYWN0IGVkaXRzIGFuZCBjb21wb25lbnRzCi0vLwkJT2JqZWN0IGFjY2Vzc29yS2V5ID0gbmV3IE9iamVjdCgpOwotLy8JCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQoYWNjZXNzb3JLZXkpOwotLy8JCXRyeSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kaWZpZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQkJaWYgKGVkaXRNb2RlbC5oYXNNYXBwaW5nVG9Qcm9qZWN0KChJUHJvamVjdCkgbW9kaWZpZWRQcm9qZWN0cy5nZXQoaSkpKQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKQotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoYWNjZXNzb3JLZXkpOwotLy8JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHdoaWNoIHJ1bnMgYSBvbmUgdmFsaWRhdG9yIG9wZXJhdGlvbiBvbiB0aGUgRUFSIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjcmVhdGVWYWxpZGF0aW9uUnVubmFibGUoSVByb2plY3QgZWFyUHJvaikgewotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGVhclByb2osIFVJRWFyVmFsaWRhdG9yLlZBTElEQVRPUl9JRCwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSW1wb3J0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9JbXBvcnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTcxMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9JbXBvcnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQVJGSUxFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJKQVJGSUxFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJGSUxFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRKQVJGSUxFID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVJGSUxFID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlRDTEFTU1RZUEUgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEoyRUUxNCA9IDI1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKMkVFMTMgPSAxMjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSjJFRTEyID0gNjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSjJFRVNwZWMgPSBKMkVFMTIgKyBKMkVFMTMgKyBKMkVFMTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSID0gIkVBUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkIgPSAiRUpCIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUiA9ICJXRUIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSID0gIkNMSUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVIgPSAiUkFSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VGRklYRVMgPSB7IiIsIEVBUiwgRUpCLCBXQVIsIEpBUiwgUkFSLCAiIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RmlsZVR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJYW5BcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCQkJaW50IGFyY2hpdmVUeXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJCQlpZiAoYXJjaGl2ZVR5cGUgPT0gVU5LTk9XTiAmJiBpc0ltcG9ydENsYXNzVHlwZShmaWxlTmFtZSkpCi0JCQkJCXJldHVybiBJTVBPUlRDTEFTU1RZUEU7Ci0JCQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoaXNJbXBvcnRDbGFzc1R5cGUoZmlsZU5hbWUpKQotCQkJCQlyZXR1cm4gSU1QT1JUQ0xBU1NUWVBFOwotCQkJCXJldHVybiBVTktOT1dOOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFuQXJjaGl2ZSAhPSBudWxsICYmIGFuQXJjaGl2ZS5pc09wZW4oKSkKLQkJCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8vVE9ETzogdXNlIG5ldyBnZXRKMkVFVmVyaW9ucyBzd2l0Y2ggc3RhdGVtZW50cwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZlcnNpb25lZEZpbGVUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBVTktOT1dOOwotCQkJdHJ5IHsKLQkJCQlhbkFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQkJCQlhcmNoaXZlVHlwZSA9IEVKQkpBUkZJTEU7Ci0JCQkJCQlFSkJKYXIgZWpiSmFyID0gKChFSkJKYXJGaWxlKSBhbkFyY2hpdmUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCQlpZiAoZWpiSmFyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEyOwotCQkJCQkJZWxzZSBpZiAoZWpiSmFyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEzOwotCQkJCQkJZWxzZSBpZiAoZWpiSmFyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTE0OwotCQkJCQl9IGVsc2UgaWYgKGFuQXJjaGl2ZS5pc1dBUkZpbGUoKSkgewotCQkJCQkJYXJjaGl2ZVR5cGUgPSBXQVJGSUxFOwotCQkJCQkJV2ViQXBwIHdhciA9ICgoV0FSRmlsZSkgYW5BcmNoaXZlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCQkJaWYgKHdhci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMjsKLQkJCQkJCWVsc2UgaWYgKHdhci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMzsKLQkJCQkJCWVsc2UgaWYgKHdhci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxNDsKLQkJCQkJfSBlbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJCQkJYXJjaGl2ZVR5cGUgPSBDTElFTlRKQVJGSUxFOwotCQkJCQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gKChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGFuQXJjaGl2ZSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJCWlmIChhcHBDbGllbnQuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEyOwotCQkJCQkJZWxzZSBpZiAoYXBwQ2xpZW50LmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMzsKLQkJCQkJCWVsc2UgaWYgKGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTQ7Ci0JCQkJCX0gZWxzZSBpZiAoYW5BcmNoaXZlLmlzUkFSRmlsZSgpKSB7Ci0JCQkJCQlhcmNoaXZlVHlwZSA9IFJBUkZJTEUgfCBKMkVFMTM7Ci0JCQkJCX0gZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKSB7Ci0JCQkJCQlhcmNoaXZlVHlwZSA9IEVBUkZJTEU7Ci0JCQkJCQlBcHBsaWNhdGlvbiBhcHAgPSAoKEVBUkZpbGUpIGFuQXJjaGl2ZSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJCWlmIChhcHAuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEyOwotCQkJCQkJZWxzZSBpZiAoYXBwLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMzsKLQkJCQkJCWVsc2UgaWYgKGFwcC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTQ7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJaWYgKGFyY2hpdmVUeXBlID09IFVOS05PV04gJiYgaXNJbXBvcnRDbGFzc1R5cGUoZmlsZU5hbWUpKQotCQkJCWFyY2hpdmVUeXBlID0gSU1QT1JUQ0xBU1NUWVBFOwotCQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFuQXJjaGl2ZSAhPSBudWxsICYmIGFuQXJjaGl2ZS5pc09wZW4oKSkKLQkJCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEFyY2hpdmVUeXBlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWludCB0eXBlID0gVU5LTk9XTjsKLQkJdHJ5IHsKLQkJCWlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJdHlwZSA9IEVKQkpBUkZJTEU7Ci0JCQllbHNlIGlmIChhbkFyY2hpdmUuaXNXQVJGaWxlKCkpCi0JCQkJdHlwZSA9IFdBUkZJTEU7Ci0JCQllbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCQl0eXBlID0gQ0xJRU5USkFSRklMRTsKLQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCQl0eXBlID0gUkFSRklMRTsKLQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VBUkZpbGUoKSkKLQkJCQl0eXBlID0gRUFSRklMRTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1wb3J0Q2xhc3NUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGUpOwotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiamFyIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ6aXAiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsgLy9kaXNhYmxlL2VuYWJsZSBkcmFnL2Ryb3AgZGlyZWN0b3JpZXMKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKEZpbGUgZikgewotCQlTdHJpbmcgZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHMgPSBmLmdldE5hbWUoKTsKLQkJaW50IGkgPSBzLmxhc3RJbmRleE9mKCcuJyk7Ci0KLQkJaWYgKGkgPiAwICYmIGkgPCBzLmxlbmd0aCgpIC0gMSkgewotCQkJZXh0ID0gcy5zdWJzdHJpbmcoaSArIDEpLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIGV4dDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRNYXRjaGluZ1Byb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlpZiAocHJvamVjdE5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IEoyRUVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHJvb3QuZ2V0UHJvamVjdHMoKTsKLQkJCVN0cmluZyBsb3dlckNhc2VOYW1lID0gcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgcHJvamVjdHMgYSBjb21wYXJlIGxvd2VyY2FzZSBuYW1lcwotCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgcHJvamVjdE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmIChwcm9qZWN0cy5sZW5ndGggPT0gMSkKLQkJCQkJcmV0dXJuIHByb2plY3RzWzBdLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJvamVjdHNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJaWYgKFdUUFBsdWdpbi5pc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZiAocHJvamVjdHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpCi0JCQkJCQkJcmV0dXJuIHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChwcm9qZWN0c1tpXS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMobG93ZXJDYXNlTmFtZSkpCi0JCQkJCQkJcmV0dXJuIHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMTkwZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5Db21tb25FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotLyoqCi0gKiA8cD4KLSAqIFNlcnZlcyBhcyBhIGJhc2UgY2xhc3MgZm9yIFdpemFyZHMgd2hpY2ggZXhwb3J0IEoyRUUgYXJ0aWZhY3Qgc3RydWN0dXJlcyBmcm9tIEVjbGlwc2UgcHJvamVjdHMKLSAqIGludG8gYSBkZXBsb3lhYmxlIGZvcm0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZSBtZXRob2RzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5Ci0gKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmR9LgotICogPC9wPgotICogPHA+Ci0gKiBPcHRpb25hbGx5LCBzdWJjbGFzc2VzIG1heSBhbHNvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2RvSW5pdCgpKCl9Ci0gKiA8bGk+e0BsaW5rICNkb0Rpc3Bvc2UoKSgpfQotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGJhc2UgY2xhc3Mgd2lsbCBlbnN1cmUgdGhhdCB0aGUgV2l6YXJkIGlzIG5vdCBzcGF3bmVkIHVubGVzcyBhbGwgb3BlbiBlZGl0b3JzIGFyZSBpbiBhCi0gKiBub24tZGlydHkgc3RhdGUuIEFkZGl0aW9uYWxseSwgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBhY3RpdmUgdmlldyB3aGljaCBzcGFud2VkIHRoZSB3aXphcmQgd2lsbAotICogYmUgbWFkZSBhdmFpbGFibGUgdG8gc3ViY2xhc3NlcyB2aWEge0BsaW5rICNnZXRTZWxlY3Rpb24oKX0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9QRyA9ICJtYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCI2NyIpKTsvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjY3IikpOy8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSW52b2tlZCBmcm9tIGluaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9uY2UgdGhlIHdvcmtiZW5jaCBhbmQgc2VsZWN0aW9uIGhhdmUKLQkgKiBiZWVuIHNhZmVseSBzdG9yZWQgYXdheS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm8tb3AgYnkgZGVmYXVsdC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQkvL2luaXQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbnZva2VkIGZyb20ge0BsaW5rICNkaXNwb3NlKCl9LiBTaG91bGQgYmUgdXNlZCB0byBoYW5kbGUgYW55IHNwZWNpZmljIFdpemFyZCBkaXNwb3NhbC4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGRvRGlzcG9zZSgpIHsKLQkJLy9kaXNwb3NlCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB2YWx1ZXMgaW4gdGhlIFdpemFyZCBkaWFsb2cgY29udHJvbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBwYXJlbnQgb2YgdGhlIHdpemFyZAotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXcgdXNlZCB0byBzdGFydCB0aGUgd2l6YXJkIChpZiBhbnkpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVYUE9SVF9XSVpfVElUTEUpKTsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0vL1RPRE86IGVuYWJsZSBzZWxlY3Rpb24gZGVmYXVsdHMKLS8vCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWxlbWVudCk7Ci0vLwkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vCQkJCUlEYXRhTW9kZWwgbSA9IGdldERhdGFNb2RlbCgpOwotLy8JCQkJT2JqZWN0IG9yaWdpbmFsUHJvamVjdE5hbWUgPSBtLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSk7Ci0vLwkJCQltLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQkJaWYgKCFtLnZhbGlkYXRlUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKS5pc09LKCkpIHsKLS8vCQkJCQltLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgb3JpZ2luYWxQcm9qZWN0TmFtZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlkb0luaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDYWxscyB7QGxpbmsgI2RvRGlzcG9zZSgpfWFuZCB0aGVuIG51bGxzIG91dCBmaWVsZHMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBvbmNlIHRoZQotCSAqIHdpemFyZCBjb21wbGV0ZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlkb0Rpc3Bvc2UoKTsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcmVQZXJmb3JtRmluaXNoKCkgewotCQlpZiAoIUNvbW1vbkVkaXRvclV0aWxpdHkucHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ29tbW9uRWRpdG9yVXRpbGl0eS5nZXREaXJ0eUVkaXRvcnMoKS5sZW5ndGggIT0gMCkgeyAvLyBhbGwgY2hlY2tib3hlcyB3ZXJlIG5vdCBzZWxlY3RlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcmVQZXJmb3JtRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50U2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSjJFRUV4cG9ydFBhZ2UgZ2V0TWFpblBhZ2UoKSB7Ci0JCXJldHVybiAoSjJFRUV4cG9ydFBhZ2UpIGdldFBhZ2UoTUFJTl9QRyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxMjA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5Db21tb25FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFNlcnZlcyBhcyBhIGJhc2UgY2xhc3MgZm9yIFdpemFyZHMgd2hpY2ggaW1wb3J0IEoyRUUgYXJ0aWZhY3Qgc3RydWN0dXJlcyBpbnRvIEVjbGlwc2UgcHJvamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZSBtZXRob2RzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5Ci0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQV2l6YXJkfS4KLSAqIDwvcD4KLSAqIDxwPgotICogT3B0aW9uYWxseSwgc3ViY2xhc3NlcyBtYXkgYWxzbyBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rICNnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKX0KLSAqIDxsaT57QGxpbmsgI2RvSW5pdCgpKCl9Ci0gKiA8bGk+e0BsaW5rICNkb0Rpc3Bvc2UoKSgpfQotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGJhc2UgY2xhc3Mgd2lsbCBlbnN1cmUgdGhhdCB0aGUgV2l6YXJkIGlzIG5vdCBzcGF3bmVkIHVubGVzcyBhbGwgb3BlbiBlZGl0b3JzIGFyZSBpbiBhCi0gKiBub24tZGlydHkgc3RhdGUuIEFkZGl0aW9uYWxseSwgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBhY3RpdmUgdmlldyB3aGljaCBzcGFud2VkIHRoZSB3aXphcmQgd2lsbAotICogYmUgbWFkZSBhdmFpbGFibGUgdG8gc3ViY2xhc3NlcyB2aWEge0BsaW5rICNnZXRDdXJyZW50U2VsZWN0aW9uKCl9LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9QRyA9ICJtYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBKMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB2YWx1ZXMgaW4gdGhlIFdpemFyZCBkaWFsb2cgY29udHJvbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBwYXJlbnQgb2YgdGhlIHdpemFyZAotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXcgdXNlZCB0byBzdGFydCB0aGUgd2l6YXJkIChpZiBhbnkpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlkb0luaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDYWxscyB7QGxpbmsgI2RvRGlzcG9zZSgpfWFuZCB0aGVuIG51bGxzIG91dCBmaWVsZHMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBvbmNlIHRoZQotCSAqIHdpemFyZCBjb21wbGV0ZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlkb0Rpc3Bvc2UoKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBudWxsOwotCQl0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbnZva2VkIGFmdGVyIHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gc2F2ZWQgb2ZmIGluCi0JICoge0BsaW5rICNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKX0uIFNob3VsZCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgc3BlY2lmaWMKLQkgKiBXaXphcmQgaW5pdGlhbGl6YXRpb24uCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJLy8gaW5pdAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEludm9rZWQgZnJvbSB7QGxpbmsgI2Rpc3Bvc2UoKX0uIFNob3VsZCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgc3BlY2lmaWMgV2l6YXJkIGRpc3Bvc2FsLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBzdWdnZXN0IGEgZmluYWwgcGVyc3BlY3RpdmUgdG8gdGhlIHVzZXIgb25jZQotCSAqIHRoZSB3aXphcmQgY29tcGxldGVzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIEoyRUUgUGVycHNlY3RpdmUgSUQgYnkgZGVmYXVsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgb3BlbiwgZGlydHkgZWRpdG9ycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0cnVlIG9ubHkgaWYgYWxsIGVkaXRvcnMgYXJlIHNhdmVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJlUGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKCFDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy9NdXN0IGhhdmUgc2VsZWN0ZWQgdG8gbm90IHNhdmUsIGJ1dCBzaG91bGQgY2xvc2UgYWxsIHJlbWFpbmluZwotCQlDb21tb25FZGl0b3JVdGlsaXR5LmNsb3NlQWxsRWRpdG9ycygpOwotCQlyZXR1cm4gc3VwZXIucHJlUGVyZm9ybUZpbmlzaCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEludm9rZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIGNsaWNrZWQgdGhlICJGaW5pc2giIGJ1dHRvbiBvZiB0aGUgd2l6YXJkLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYXR0ZW1wdCB0byB1cGRhdGUgdGhlIGZpbmFsIHBlcnNwZWN0aXZlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKLQkgKiB7QGxpbmsgI2dldEZpbmFsUGVyc3BlY3RpdmVJRCgpIH0KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZCNwb3N0UGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnBvc3RQZXJmb3JtRmluaXNoKCk7Ci0JCWlmIChnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSAhPSBudWxsICYmIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpLmxlbmd0aCgpID4gMCkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBuZXcgRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudChjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCQkJCQlpZiAoYU5hbWUuZXF1YWxzKCJmaW5hbFBlcnNwZWN0aXZlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUoYU5hbWUpOwotCQkJCX0KLQkJCX07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUoY29uZmlndXJhdGlvbkVsZW1lbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgc2F2ZWQgdG8gdXNlIHdoZW4gdGhlIHdpemFyZCBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQotCSAqIGN1cnJlbnQgcGVyc3BlY3RpdmUgdXNpbmcgZWl0aGVyICgxKSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHtAc2VlICNnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKX0KLQkgKiBvciAoMikgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgZmluYWxQZXJzcGVjdGl2ZSBhdHRyaWJ1dGUgaW4gdGhlIFdpemFyZCdzIGNvbmZpZ3VyYXRpb24KLQkgKiBlbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRmZDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclNlbGVjdGlvblBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLkRhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UgaW1wbGVtZW50cyBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9MQUJFTCA9ICJMQVNURUFSTkFNRV8iOyAvLyROT04tTkxTLTEkCi0gICAgCi0JcHJvdGVjdGVkIEVhclNlbGVjdGlvblBhbmVsIGVhclBhbmVsOwotICAKLQlwdWJsaWMgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVFYXJDb21wb3NpdGUodG9wKTsKLSAgICAgICAgY3JlYXRlV29ya2luZ1NldEdyb3VwUGFuZWwodG9wLCBuZXcgU3RyaW5nW10geyBSRVNPVVJDRV9XT1JLSU5HX1NFVCwgSkFWQV9XT1JLSU5HX1NFVCB9KTsKLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRWFyQ29tcG9zaXRlKENvbXBvc2l0ZSB0b3ApIAotCXsKLQkgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MKLQkgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0JICAgIAotCSAgICBmaW5hbCBTdHJpbmcgbW9kdWxlRmFjZXRJZCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLQkgICAgZmluYWwgSVByb2plY3RGYWNldCBtb2R1bGVGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggbW9kdWxlRmFjZXRJZCApOwotCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA9IGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbiggbW9kdWxlRmFjZXQgKTsKLQkgICAgCi0JCWVhclBhbmVsID0gbmV3IEVhclNlbGVjdGlvblBhbmVsKCAoSURhdGFNb2RlbCkgYWN0aW9uLmdldENvbmZpZygpLCB0b3AgKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlRmFjZXRJRCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChlYXJQYW5lbCAhPSBudWxsKQotCQkJZWFyUGFuZWwuZGlzcG9zZSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAJc3VwZXIuc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JICAgIAlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLQkgICAgCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotICAgICAgICAJaWYoajJlZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpewotCSAgICAgICAgCVN0cmluZyBsYXN0RUFSTmFtZSA9IGoyZWVNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JICAgICAgICAgICAgc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMLCBsYXN0RUFSTmFtZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAJc3VwZXIucmVzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhc3RFQVJOYW1lID0gc2V0dGluZ3MuZ2V0KFNUT1JFX0xBQkVMKTsKLSAgICAgICAgICAgIGlmIChsYXN0RUFSTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotICAgICAgICAgICAgCVN0cmluZyBmYWNldElEID0gZ2V0TW9kdWxlRmFjZXRJRCgpOwotICAgICAgICAgICAgCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotICAgICAgICAgICAgICAgIGoyZWVNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTEFTVF9FQVJfTkFNRSwgbGFzdEVBUk5hbWUpOwotICAgICAgICAgICAgfQotCQl9Ci0JfQotICAgIAotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJU3RyaW5nW10gc3VwZXJQcm9wZXJ0aWVzID0gc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQkJTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChzdXBlclByb3BlcnRpZXMpOwotCQlBcnJheUxpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhcnJheUxpc3QuYWRkQWxsKCBsaXN0ICk7Ci0JCWFycmF5TGlzdC5hZGQoIElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUgKTsKLQkJYXJyYXlMaXN0LmFkZCggSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiApOwotCQlyZXR1cm4gKFN0cmluZ1tdKWFycmF5TGlzdC50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDE5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIDxwPgotICogU2VydmVzIGFzIGEgYmFzZSBjbGFzcyBmb3IgV2l6YXJkcyB3aGljaCBpbXBvcnQgSjJFRSBtb2R1bGUgc3RydWN0dXJlcyBpbnRvIEVjbGlwc2UgcHJvamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEltcG9ydCB3aXphcmRzIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEltcG9ydE9wZXJhdGlvbigpfQotICogPGxpPntAbGluayAjZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpfQotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogQW5kIG9wdGlvbmFsbHksIHRoZXkgbWF5IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBmcm9tCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkfToKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEZpbmFsUGVyc3BlY3RpdmVJRCgpfQotICogPGxpPntAbGluayAjZG9Jbml0KCkoKX0KLSAqIDxsaT57QGxpbmsgI2RvRGlzcG9zZSgpKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjM4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjM4IikpOy8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIEltcG9ydCBXaXphcmRzIGNhbiBydW4gYXJiaXRyYXJ5IHZhbGlkYXRvcnMgb25jZSB0aGUgbW9kdWxlIGhhcyBiZWVuIGNyZWF0ZWQuIFRoZXNlCi0JICogdmFsaWRhdG9ycyBlbnN1cmUgdGhhdCB0aGUgc3RydWN0dXJlIGNyZWF0ZWQgYnkgdGhlIEltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBjb250ZW50cyBvZiB0aGF0Ci0JICogc3RydWN0dXJlIGFyZSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGFubm91bmNlZCB0byB0aGUgUHJvYmxlbXMgdmlldyBpbiBFY2xpcHNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRvciBJRHMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBtb2R1bGUgdHlwZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiMTcyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCl7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQlyZXR1cm4gY29tcC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlJUHJvamVjdCBoYW5kbGUgPSAoSVByb2plY3QpZWxlbWVudDsKLQkJCXJldHVybiBoYW5kbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFRXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNThmMDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5hcmNoaXZlLklBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHNFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRXhwb3J0UGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgid2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0xBQkVMID0gIkoyRUVfRVhQT1JUXyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSV1JJVEVfTEFCRUwgPSAiT1ZFUldSSVRFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9MQUJFTCA9ICJTT1VSQ0UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOwotCXByb3RlY3RlZCBTdHJpbmcgTEFCRUxfREVTVElOQVRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9ERVNUSU5BVElPTik7Ci0JcHJvdGVjdGVkIFN0cmluZyBMQUJFTF9SVU5USU1FID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9FWFBPUlRfUlVOVElNRSk7Ci0JcHJpdmF0ZSBDb21ibyByZXNvdXJjZU5hbWVDb21ibzsKLQlwcml2YXRlIENvbWJvIGRlc3RpbmF0aW9uTmFtZUNvbWJvOwotCXByaXZhdGUgQnV0dG9uIG9wdGltaXplRm9yUnVudGltZUNoZWNrYm94OwotCXByaXZhdGUgQ29tYm8gcnVudGltZU5hbWVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXNDaGVja2JveDsKLQlwcml2YXRlIEJ1dHRvbiBzb3VyY2VGaWxlc0NoZWNrYm94OwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCWN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJT2JqZWN0IGVsZW1lbnQgPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWxlbWVudCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIFtdIHZhbGlkUHJvamVjdE5hbWVzID0gbW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQkJYm9vbGVhbiBwcm9qZWN0TmFtZVNldCA9IGZhbHNlOwotCQkJZm9yKGludCBpPTA7aTx2YWxpZFByb2plY3ROYW1lcy5sZW5ndGggJiYgIXByb2plY3ROYW1lU2V0OyBpKyspewotCQkJCWlmKHByb2plY3ROYW1lLmVxdWFscyh2YWxpZFByb2plY3ROYW1lc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpKXsKLQkJCQkJcHJvamVjdE5hbWVTZXQgPSB0cnVlOwotCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIXByb2plY3ROYW1lU2V0ICYmIHZhbGlkUHJvamVjdE5hbWVzLmxlbmd0aCA+IDApewotCQkJCS8vaWYgZXhwb3J0IGRpYWxvZyBpcyBpbnZva2VkIGJ5IHNlbGVjdGluZyBhIG5vbiBFQVIgcHJvamVjdCwgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIEVBUgotCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQkJCWlmKCBlYXJQcm9qZWN0cy5sZW5ndGggPiAwICl7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGVhclByb2plY3RzWzBdLmdldE5hbWUoKSk7CQkJCQkJCi0JCQkJfWVsc2UKLQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgdmFsaWRQcm9qZWN0TmFtZXNbMF0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBnZXRJbmZvcG9wSUQoKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJY3JlYXRlU291cmNlQW5kRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVSdW50aW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlT3B0aW9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJLy9zZXR1cEJhc2VkT25Jbml0aWFsU2VsZWN0aW9ucygpOwotCQlzZXR1cEluZm9wb3AoY29tcG9zaXRlKTsKLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VBbmREZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlRXhwb3J0Q29tcG9uZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwotCi0JfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGV4cG9ydCBzb3VyY2UgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiB0aGlzIGdyb3VwJ3MKLSAgICAgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgdmlzdWFsIGNvbXBvbmVudHMKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4cG9ydENvbXBvbmVudEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAJCi0gICAgICAgIC8vUHJvamVjdCBsYWJlbAotICAgICAgICBMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3RMYWJlbC5zZXRUZXh0KGdldENvbXBvbmVudExhYmVsKCkpOwotICAgICAgICAvL1Byb2plY3QgY29tYm8KLSAgICAgICAgcmVzb3VyY2VOYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgcmVzb3VyY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hDb21ibyhyZXNvdXJjZU5hbWVDb21ibywgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbnVsbCk7Ci0KLSAgICAgICAgCQotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ly9QYWQgbGFiZWwKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVzdGluYXRpb25Hcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgLy9EZXN0aW5hdGlvbiBsYWJlbAotICAgICAgICBMYWJlbCBkZXN0aW5hdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkZXN0aW5hdGlvbkxhYmVsLnNldFRleHQoTEFCRUxfREVTVElOQVRJT04pOwotICAgICAgICAvLyBkZXN0aW5hdGlvbiBuYW1lIGNvbWJvIGZpZWxkCi0gICAgICAgIGRlc3RpbmF0aW9uTmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBkZXN0aW5hdGlvbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hDb21ibyhkZXN0aW5hdGlvbk5hbWVDb21ibywgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sIG51bGwpOwotCi0gICAgICAgIC8vIGRlc3RpbmF0aW9uIGJyb3dzZSBidXR0b24KLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVEZXN0aW5hdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUnVudGltZUdyb3VwKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkgCi0gICAgewotICAgICAgICBmaW5hbCBHcm91cCBncm91cCA9IG5ldyBHcm91cCggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDEsIGZhbHNlICkgKTsKLSAgICAJZ3JvdXAuc2V0VGV4dCggTEFCRUxfUlVOVElNRSApOwotCi0gICAgCXRoaXMub3B0aW1pemVGb3JSdW50aW1lQ2hlY2tib3ggPSBuZXcgQnV0dG9uKCBncm91cCwgU1dULkNIRUNLICk7Ci0gICAgCXRoaXMub3B0aW1pemVGb3JSdW50aW1lQ2hlY2tib3guc2V0VGV4dCggIk9wdGltaXplIGZvciBhIHNwZWNpZmljIHNlcnZlciBydW50aW1lIiApOwotICAgIAl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goIHRoaXMub3B0aW1pemVGb3JSdW50aW1lQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSwgbnVsbCApOwotICAgIAkKLSAgICAJZmluYWwgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAJZ2QudmVydGljYWxJbmRlbnQgPSAyOwotICAgIAkKLSAgICAJdGhpcy5vcHRpbWl6ZUZvclJ1bnRpbWVDaGVja2JveC5zZXRMYXlvdXREYXRhKCBnZCApOwotICAgIAkKLSAgICAJdGhpcy5ydW50aW1lTmFtZUNvbWJvID0gbmV3IENvbWJvKCBncm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgICAgIHRoaXMucnVudGltZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgICAgIHRoaXMuc3luY2hIZWxwZXIuc3luY2hDb21ibyggdGhpcy5ydW50aW1lTmFtZUNvbWJvLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGV4dENvbXBvc2l0ZSA9IG5ldyBFbmhhbmNlZENvbXBvc2l0ZSggZ3JvdXAsIFNXVC5OT05FICk7Ci0gICAgICAgIGV4dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCAxLCBmYWxzZSApOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDE7Ci0gICAgICAgIAotICAgICAgICBleHRDb21wb3NpdGUuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICAgICAgCi0gICAgICAgIGdldERhdGFNb2RlbCgpLmFkZExpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZCggZmluYWwgRGF0YU1vZGVsRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyggSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUUgKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZsYWcoKSA9PSBJRGF0YU1vZGVsLlZBTFVFX0NIRyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hFeHRlbnNpb25zQ29tcG9zaXRlKCBleHRDb21wb3NpdGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSAgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGbGFnKCkgPT0gSURhdGFNb2RlbC5WQUxVRV9DSEcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG9wdGltaXplID0gKCAoQm9vbGVhbikgZXZlbnQuZ2V0UHJvcGVydHkoKSApLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0Q29tcG9zaXRlLnNldEVuYWJsZWQoIG9wdGltaXplICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoRXh0ZW5zaW9uc0NvbXBvc2l0ZSggZXh0Q29tcG9zaXRlICk7Ci0JfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoRXh0ZW5zaW9uc0NvbXBvc2l0ZSggZmluYWwgQ29tcG9zaXRlIGV4dENvbXBvc2l0ZSApCi0gICAgewotICAgICAgICBmb3IoIENvbnRyb2wgY2hpbGQgOiBleHRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4gZXh0ZW5zaW9ucyAKLSAgICAgICAgICAgID0gKExpc3Q8SUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE+KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eSggSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZXh0ZW5zaW9ucyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcG9zaXRlIGlubmVyQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YSBleHRlbnNpb24gOiBleHRlbnNpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBleHRlbnNpb24uZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHNFeHRlbnNpb25Qb2ludC5QYW5lbEZhY3RvcnlJbmZvIHBhbmVsRXh0SW5mbwotICAgICAgICAgICAgICAgICAgICA9IEFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsc0V4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbiggaWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcGFuZWxFeHRJbmZvICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeSBwYW5lbEZhY3RvcnkgPSBwYW5lbEV4dEluZm8ubG9hZFBhbmVsRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBhbmVsRmFjdG9yeSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlubmVyQ29tcG9zaXRlID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9zaXRlID0gbmV3IEVuaGFuY2VkQ29tcG9zaXRlKCBleHRDb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0JPVEggKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdyaWRMYXlvdXQgaW5uZXJDb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCggMSwgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb3NpdGVMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvc2l0ZS5zZXRMYXlvdXQoIGlubmVyQ29tcG9zaXRlTGF5b3V0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsRmFjdG9yeS5jcmVhdGVQYW5lbCggaW5uZXJDb21wb3NpdGUsIGV4dGVuc2lvbi5nZXREYXRhTW9kZWwoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMkVFVUlQbHVnaW4ubG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHRDb21wb3NpdGUuZ2V0U2hlbGwoKS5sYXlvdXQoIHRydWUsIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBleHBvcnQgb3B0aW9ucyBzcGVjaWZpY2F0aW9uIHdpZGdldHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICAvLyBvcHRpb25zIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBvcHRpb25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgb3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0KLSAgICAgICAgLy8gc291cmNlIGZpbGVzLi4uIGNoZWNrYm94Ci0gICAgICAgIGNyZWF0ZVNvdXJjZUZpbGVzQ2hlY2tib3gob3B0aW9uc0dyb3VwKTsKLQotICAgICAgICAvLyBvdmVyd3JpdGUuLi4gY2hlY2tib3gKLSAgICAgICAgY3JlYXRlT3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94KG9wdGlvbnNHcm91cCk7Ci0KLSAgICAgICAgLy8gYWR2YW5jZWQgYnV0dG9uCi0gICAgICAgIGlmIChzaG91bGRTaG93UHJvamVjdEZpbGVzQ2hlY2tib3goKSkgewotICAgICAgICAgICAgY3JlYXRlUHJvamVjdEZpbGVzQ2hlY2tib3gob3B0aW9uc0dyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCQkvL092ZXJ3cml0ZSBjaGVja2JveAotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9PVkVSV1JJVEVfQ0hFQ0tCT1gpKTsgLy8kTk9OLU5MUy0xJCA9ICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgd2l0aG91dCB3YXJuaW5nIgotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkcsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCQlzb3VyY2VGaWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJc291cmNlRmlsZXNDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkoyRUVfRVhQT1JUX1NPVVJDRV9DSEVDS0JPWCkpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goc291cmNlRmlsZXNDaGVja2JveCwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTaG93UHJvamVjdEZpbGVzQ2hlY2tib3goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0RmlsZXNDaGVja2JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCkgewotCi0JCWlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpKQotCQkJcmV0dXJuOyAvLyBubyBzZXR1cCBuZWVkZWQKLQotCQlqYXZhLnV0aWwuTGlzdCBzZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhZW51bSA9IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgYWVudW0ubmV4dCgpOwotCQkJLy8gZG8gbm90IGFkZCBpbmFjY2Vzc2libGUgZWxlbWVudHMKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJc2VsZWN0aW9ucy5hZGQoY3VycmVudFJlc291cmNlKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47IC8vIHNldHVwIG5vdCBuZWVkZWQgYW55bW9yZQotCi0vLwkJaW50IHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9IHNlbGVjdGlvbnMuc2l6ZSgpOwotLy9UT0RPOiBmaW5kIGEgd2F5IHRvIHNlbGVjdCBhbiBleGlzdGluZyBjb21wb25lbnQKLS8vCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZUNvdW50ID09IDEpIHsKLS8vCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9ucy5nZXQoMCk7Ci0vLwkJCWlmICgocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgJiYgY2hlY2tGb3JOYXR1cmUoKElQcm9qZWN0KSByZXNvdXJjZSkpIHsKLS8vCQkJCXJlc291cmNlTmFtZUNvbWJvLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGRlc3RpbmF0aW9uTmFtZUNvbWJvLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCVN0cmluZ1tdIGZpbHRlcnMgPSBnZXRGaWx0ZXJFeHByZXNzaW9uKCk7Ci0JCWlmICghaXNXaW5kb3dzKSB7Ci0JCQlpZiAoZmlsdGVycy5sZW5ndGggIT0gMCAmJiBmaWx0ZXJzWzBdICE9IG51bGwgJiYgZmlsdGVyc1swXS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCQlmaWxlTmFtZSArPSBmaWx0ZXJzWzBdLnN1YnN0cmluZyhmaWx0ZXJzWzBdLmluZGV4T2YoJy4nKSk7Ci0JCQl9Ci0JCX0KLQkJZGlhbG9nLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJaWYgKGlzV2luZG93cykgewotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVycyk7Ci0JCX0KLQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwpCi0JCQlkZXN0aW5hdGlvbk5hbWVDb21iby5zZXRUZXh0KGZpbGVuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzdGluYXRpb25OYW1lQ29tYm8uc2V0SXRlbXMoc291cmNlTmFtZXMpOwotCQkJYm9vbGVhbiBvdmVyd3JpdGUgPSBzZXR0aW5ncy5nZXRCb29sZWFuKFNUT1JFX0xBQkVMICsgT1ZFUldSSVRFX0xBQkVMKTsKLQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HLCBvdmVyd3JpdGUpOwotCQkJYm9vbGVhbiBpbmNsdWRlU291cmNlID0gc2V0dGluZ3MuZ2V0Qm9vbGVhbihTVE9SRV9MQUJFTCArIFNPVVJDRV9MQUJFTCk7Ci0JCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMsIGluY2x1ZGVTb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCQlzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdOYW1lID0gZGVzdGluYXRpb25OYW1lQ29tYm8uZ2V0VGV4dCgpOwotCi0JCQkvL3JpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwICYmICFuZXdOYW1lLmVxdWFscyhzb3VyY2VOYW1lc1tpXSkpIHsKLQkJCQkJbmV3TmFtZXMuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdOYW1lcy5hZGQoMCwgZGVzdGluYXRpb25OYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tuZXdOYW1lcy5zaXplKCldOwotCQkJbmV3TmFtZXMudG9BcnJheShzb3VyY2VOYW1lcyk7Ci0KLQkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSwgc291cmNlTmFtZXMpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgT1ZFUldSSVRFX0xBQkVMLCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElORykpOwotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgU09VUkNFX0xBQkVMLCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiBnZXRDb21wbmVudElEKCk7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpOwotCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JLy9wcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hdHVyZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpIHsKLQotCQlpZiAoY3VycmVudFJlc291cmNlU2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU9iamVjdCBvID0gY3VycmVudFJlc291cmNlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoIWlzTWV0YVR5cGVTdXBwb3J0ZWQobykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgbzsKLQkJSVJlc291cmNlIHJlc291cmNlID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldERpYWxvZ1NldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmhhbmNlZENvbXBvc2l0ZQotCi0JICAgIGV4dGVuZHMgQ29tcG9zaXRlCi0JICAgIAotCXsKLQkgICAgcHVibGljIEVuaGFuY2VkQ29tcG9zaXRlKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdHlsZSApCi0JICAgIHsKLQkgICAgICAgIHN1cGVyKCBwYXJlbnQsIHN0eWxlICk7Ci0JICAgIH0KLQkgICAgCi0JICAgIEBPdmVycmlkZQotCSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKCBib29sZWFuIGVuYWJsZWQgKQotCSAgICB7Ci0JICAgICAgICBzdXBlci5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0JICAgICAgICAKLSAgICAgICAgICAgIGZvciggQ29udHJvbCBjaGlsZCA6IGdldENoaWxkcmVuKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoaWxkLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICAgICAgICAgIH0KLQkgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDEzNjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFSW1wb3J0UGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBDb21ibyBjb21wb25lbnRDb21ibzsKLQlwcml2YXRlIENvbWJvIGZpbGVOYW1lQ29tYm87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0xBQkVMID0gIkoyRUVfSU1QT1JUXyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUZpbGVOYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVByb2plY3ROYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0vLwkJaWYgKEZsZXhpYmxlSmF2YVByb2plY3RQcmVmZXJlbmNlVXRpbC5nZXRNdWx0aXBsZU1vZHVsZXNQZXJQcm9qZWN0UHJvcCgpKSB7Ci0vLwkJCW5ldyBOZXdNb2R1bGVEYXRhTW9kZWxHcm91cChwYXJlbnQsIGdldERhdGFNb2RlbCgpLCBzeW5jaEhlbHBlcik7Ci0vLwkJfSBlbHNlIHsKLQkJCUxhYmVsIGNvbXBvbmVudExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCQljb21wb25lbnRMYWJlbC5zZXRUZXh0KGdldFByb2plY3RJbXBvcnRMYWJlbCgpKTsKLQkJCWNvbXBvbmVudExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJCS8vIHNldHRpbmcgdXAgY29tYm8KLQkJCWNvbXBvbmVudENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJCWNvbXBvbmVudENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJCS8vIC8vIHNldHRpbmcgdXAgYnV0dG9uCi0JCQkvLyBCdXR0b24gbmV3UHJvamVjdEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLnNldFRleHQoZGVmTmV3QnV0dG9uTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gLy8gaGFuZGxlTmV3UHJvamVjdEJ1dHRvblByZXNzZWQoKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gbmV3UHJvamVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb21wb25lbnRDb21ibywgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtjb21wb25lbnRMYWJlbH0pOwotCQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKHBhcmVudCk7Ci0JCS8vfQotCX0KLQotCQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlRBUkdFVF9SVU5USU1FX0xCTCkpOwotCQlDb21ibyBzZXJ2ZXJUYXJnZXRDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUJ1dHRvbiBuZXdTZXJ2ZXJUYXJnZXRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfVEhSRUVfRE9UU19FKSk7Ci0JCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3U2VydmVyVGFyZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpOwotCQkJCWxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpOwotCQkJfQotCQl9KTsKLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde2xhYmVsLCBuZXdTZXJ2ZXJUYXJnZXRCdXR0b259OwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHNlcnZlclRhcmdldENvbWJvLCBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGRlcHMpOwotCX0KLQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlTmFtZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoZ2V0RmlsZUltcG9ydExhYmVsKCkpOwotCi0JCS8vIHNldHVwIGNvbWJvCi0JCWZpbGVOYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWZpbGVOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQotCQkvLyBzZXR1cCBicm93c2UgYnV0dG9uCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRmlsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oZmlsZU5hbWVDb21ibywgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgbmV3IENvbnRyb2xbXXtmaWxlTGFiZWwsIGJyb3dzZUJ1dHRvbn0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpbGVCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCi0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZmlsZU5hbWVDb21iby5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZ2V0RmlsdGVyRXhwcmVzc2lvbigpKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwpCi0JCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmlsZU5hbWVDb21iby5zZXRJdGVtcyhzb3VyY2VOYW1lcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQkJCS8vIHJpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW5ld05hbWVzLmFkZChzb3VyY2VOYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHRleHQgPSBmaWxlTmFtZUNvbWJvLmdldFRleHQoKTsKLQkJCW5ld05hbWVzLnJlbW92ZSh0ZXh0KTsKLQkJCW5ld05hbWVzLmFkZCgwLCB0ZXh0KTsKLQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tuZXdOYW1lcy5zaXplKCldOwotCQkJbmV3TmFtZXMudG9BcnJheShzb3VyY2VOYW1lcyk7Ci0KLQkJCS8vIHNvdXJjZU5hbWVzID0gYWRkVG9IaXN0b3J5KHNvdXJjZU5hbWVzLAotCQkJLy8gZ2V0SjJFRUltcG9ydERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEoyRUVJbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FKSk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCksIHNvdXJjZU5hbWVzKTsKLQkJCQotCQkJRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2Uuc2F2ZVJ1bnRpbWVTZXR0aW5ncyhzZXR0aW5ncywgbW9kZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UucmVzdG9yZVJ1bnRpbWVTZXR0aW5ncyhzZXR0aW5ncywgbW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNdXN0IG92ZXJyaWRlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2VudGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGF1bmNoTmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcmVBZGRpdGlvbkRlc2NyaXB0b3JzID0gbW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCWJvb2xlYW4gaXNPSyA9IFNlcnZlclVJVXRpbC5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgIiIsICIiKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGlzT0sgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCU9iamVjdFtdIHByZUFkZGl0aW9uID0gbmV3IE9iamVjdFtwcmVBZGRpdGlvbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZUFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJlQWRkaXRpb25baV0gPSBwcmVBZGRpdGlvbkRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKTsKLQkJCX0KLQkJCU9iamVjdFtdIHBvc3RBZGRpdGlvbiA9IG5ldyBPYmplY3RbcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zdEFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcG9zdEFkZGl0aW9uW2ldID0gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpOwotCQkJfQotCQkJT2JqZWN0IG5ld0FkZGl0aW9uID0gUHJvamVjdFV0aWxpdGllcy5nZXROZXdPYmplY3QocHJlQWRkaXRpb24sIHBvc3RBZGRpdGlvbik7Ci0KLSAgICAgICAgICAgIG1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCWlmIChuZXdBZGRpdGlvbiAhPSBudWxsKQotCQkJCW1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgbmV3QWRkaXRpb24pOwotCQl9Ci0JCXJldHVybiBpc09LOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk1ZWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIGV4dGVuZHMgSjJFRUV4cG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKMkVFTW9kdWxlRXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX0RFU1RJTkFUSU9OLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWRiOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyU2VsZWN0aW9uUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlIGltcGxlbWVudHMgSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotICAgIHByaXZhdGUgSURhdGFNb2RlbExpc3RlbmVyIGZhY2V0VmVyc2lvbkxpc3RlbmVyID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGFkZEREOwotICAgIAotCXB1YmxpYyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBFYXJTZWxlY3Rpb25QYW5lbCBlYXJQYW5lbDsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChudWxsICE9IGVhclBhbmVsKSB7Ci0JCQllYXJQYW5lbC5kaXNwb3NlKCk7Ci0JCX0KLQkJdGhpcy5tb2RlbC5yZW1vdmVMaXN0ZW5lciggdGhpcy5mYWNldFZlcnNpb25MaXN0ZW5lciApOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBFYXJDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmVhclBhbmVsID0gbmV3IEVhclNlbGVjdGlvblBhbmVsKG1vZGVsLCBjKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhdGVEZXNjcmlwdG9yQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApCi0JewotICAgICAgICB0aGlzLmFkZEREID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHRoaXMuYWRkREQuc2V0VGV4dChSZXNvdXJjZXMuZ2VuZXJhdGVEZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0gICAgICAgIC8vc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhZGRERCwgR0VORVJBVEVfREQsIG51bGwpOyBidWcgMjE1Mjg0IC0gc2VlIGVudGVyKCkKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB0aGlzLmFkZERELnNldExheW91dERhdGEoZ2QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckZhY2V0VmVyc2lvbkNoYW5nZUxpc3RlbmVyKCkKLQl7Ci0gICAgICAgIHRoaXMuZmFjZXRWZXJzaW9uTGlzdGVuZXIgPSBuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCBmaW5hbCBEYXRhTW9kZWxFdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcgJiYKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCBGQUNFVF9WRVJTSU9OICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUZhY2V0VmVyc2lvbkNoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBpZihUaHJlYWQuY3VycmVudFRocmVhZCgpID09IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFRocmVhZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgCXJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBydW5uYWJsZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5tb2RlbC5hZGRMaXN0ZW5lciggZmFjZXRWZXJzaW9uTGlzdGVuZXIgKTsKLSAgICAgICAgaGFuZGxlRmFjZXRWZXJzaW9uQ2hhbmdlZEV2ZW50KCk7Ci0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUZhY2V0VmVyc2lvbkNoYW5nZWRFdmVudCgpCi0gICAgewotICAgICAgICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nLiBUaGUgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlCi0gICAgICAgIC8vIHRvIGhhbmRsZSB0aGlzIGV2ZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlRGVwbG95bWVudERlc2NyaXB0b3I7Ci0KLQotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKEoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotICAgIAlpZiAoaXNGaXJzdFRpbWVUb1BhZ2UoKSAmJiBhZGRERCAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGFkZERELCBHRU5FUkFURV9ERCwgbnVsbCk7Ci0gICAgCX0KLSAgICAJc3VwZXIuZW50ZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwYjhlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1nZW5lcmF0ZURlcGxveW1lbnREZXNjcmlwdG9yID0gR2VuZXJhdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZjQ0MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlSW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJTZWxlY3Rpb25QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVNb2R1bGVJbXBvcnRQYWdlIGV4dGVuZHMgSjJFRUltcG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCQotCXByb3RlY3RlZCBFYXJTZWxlY3Rpb25QYW5lbCBlYXJQYW5lbDsKLQkKLQlwdWJsaWMgSjJFRU1vZHVsZUltcG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCQljcmVhdGVTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpOwkKLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlEYXRhTW9kZWwgY3JlYXRpb25ETSA9IGdldERhdGFNb2RlbCgpLmdldE5lc3RlZE1vZGVsKElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGNyZWF0aW9uRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQlJRGF0YU1vZGVsIGZhY2V0TW9kZWwgPSAoSURhdGFNb2RlbCkgbWFwLmdldChnZXRNb2R1bGVGYWNldElEKCkpOwotCQkKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJYy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZWFyUGFuZWwgPSBuZXcgRWFyU2VsZWN0aW9uUGFuZWwoZmFjZXRNb2RlbCwgYyk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwKLQkJCQkJSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsCi0JCQkJCUlGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwKLQkJCQkJSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwKLQkJCQkJSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwKLQkJCQkJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuRkFDRVRfUlVOVElNRX07Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoZWFyUGFuZWwgIT0gbnVsbCkKLQkJCWVhclBhbmVsLmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5MDQ2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA4LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkVfTEFCRUwgPSAiSjJFRV9VVElMSVRZX0pBUl9MSVNUX0lNUE9SVF8iOyAvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gdXNlQWx0ZXJuYXRlUm9vdEJ0bjsKLQotCXByaXZhdGUgQnV0dG9uIG92ZXJ3cml0ZVByb2plY3RDaGVja2JveDsKLQotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDb21ibyBhdmFpbGFibGVKYXJzQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGxpbmtlZFBhdGhDaGVja2JveDsgIAotCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8xIikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUDEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZVV0aWxpdHlKYXJGaWxlTmFtZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVMaW5rZWRQYXRoVmFyaWFibGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlSkFSc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVPdmVyd3JpdGVDaGVja2JveChjb21wb3NpdGUpOyAKLQotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVXRpbGl0eUphckZpbGVOYW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZmlsZU5hbWVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJZmlsZU5hbWVHcm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJZmlsZU5hbWVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZmlsZU5hbWVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoZmlsZU5hbWVHcm91cCwgU1dULk5PTkUpOwotCQlmaWxlTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmlsZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJLy8gc2V0dXAgY29tYm8KLQkJYXZhaWxhYmxlSmFyc0NvbWJvID0gbmV3IENvbWJvKGZpbGVOYW1lR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJYXZhaWxhYmxlSmFyc0NvbWJvLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0KLQkJLy8gc2V0dXAgYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGZpbGVOYW1lR3JvdXAsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGF2YWlsYWJsZUphcnNDb21ibywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVZBSUxBQkxFX0pBUlNfRElSRUNUT1JZLCBuZXcgQ29udHJvbFtde2ZpbGVMYWJlbCwgYnJvd3NlQnV0dG9ufSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlua2VkUGF0aFZhcmlhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCi0JCUdyb3VwIGxpbmtlZFBhdGhHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGlua2VkUGF0aEdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV80IikpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGlua2VkUGF0aEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlsaW5rZWRQYXRoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNoZWNrYm94R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGxpbmtlZFBhdGhHcm91cCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGNoZWNrYm94TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQljaGVja2JveEdyb3VwLnNldExheW91dChjaGVja2JveExheW91dCk7Ci0JCWNoZWNrYm94R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJbGlua2VkUGF0aENoZWNrYm94ID0gbmV3IEJ1dHRvbihjaGVja2JveEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaW5rZWRQYXRoQ2hlY2tib3guc2V0VGV4dCgiICIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFRleHQgbGlua2VkUGF0aFRleHQgPSBuZXcgVGV4dChjaGVja2JveEdyb3VwLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWxpbmtlZFBhdGhUZXh0LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV81IikpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtlZFBhdGhUZXh0LnNldEVuYWJsZWQoZ2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eUVuYWJsZWQoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFKSk7Ci0JCQotCQlnZXREYXRhTW9kZWwoKS5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbGlua2VkUGF0aFRleHQuc2V0RW5hYmxlZChnZXREYXRhTW9kZWwoKS5pc1Byb3BlcnR5RW5hYmxlZChJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUpKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJR3JpZERhdGEgdGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCXRleHRHcmlkRGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCXRleHRHcmlkRGF0YS53aWR0aEhpbnQgPSAzNTA7Ci0JCWxpbmtlZFBhdGhUZXh0LnNldExheW91dERhdGEodGV4dEdyaWREYXRhKTsKLQkJbGlua2VkUGF0aFRleHQuc2V0QmFja2dyb3VuZChjaGVja2JveEdyb3VwLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJLy8gc2V0dXAgY29tYm8KLQkJQ29tYm8gYXZhaWxhYmxlTGlua2VkUGF0aHNDb21ibyA9IG5ldyBDb21ibyhsaW5rZWRQYXRoR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJYXZhaWxhYmxlTGlua2VkUGF0aHNDb21iby5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oYXZhaWxhYmxlTGlua2VkUGF0aHNDb21ibywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTElOS0VEX1BBVEhfVkFSSUFCTEUsIG5ldyBDb250cm9sW117YXZhaWxhYmxlTGlua2VkUGF0aHNDb21ib30pOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gobGlua2VkUGF0aENoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIG5ldyBDb250cm9sW117YXZhaWxhYmxlTGlua2VkUGF0aHNDb21ib30pOwotCi0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU0VMRUNUX0RJUkVDVE9SWV9ETEcpKTsKLQotCQlTdHJpbmcgZGlyTmFtZSA9IGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKTsKLQotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZGlyTmFtZSkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCWF2YWlsYWJsZUphcnNDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VTdGFydExvY2F0aW9uKCkgewotCQlpZiAoYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKSAhPSBudWxsICYmIGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGFsbCBidXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKSB7Ci0KLQkJdXRpbEphclNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KENvbXBvc2l0ZSBsaXN0R3JvdXApIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGxpc3RHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlciBhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyID0gbmV3IEF2YWlsYWJsZVV0aWxpdHlKYXJzUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYXZhaWxhYmxlVXRpbEpBUnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQobW9kZWwpOwotCi0JCS8qIGdldE1vZGVsKCkuYWRkTGlzdGVuZXIoZ2V0T3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIoKSk7ICovCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tCb3hUYWJsZVZpZXdlcihhdmFpbGFibGVKQVJzVmlld2VyLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0pBUl9MSVNULCBudWxsKTsKLQotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChtb2RlbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIG5ldyBPYmplY3RbMF0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlPYmplY3RbXSBzZWxlY3Rpb24gPSBuZXcgT2JqZWN0W2F2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlzZWxlY3Rpb25baV0gPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0pBUl9MSVNULCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQWxsIgotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMjsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9ERVNFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJEZXNlbGVjdCBBbGwiCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKQVJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9KQVJTX0dST1VQKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX1VUSUxJVFlfSkFSX0xJU1RFQVJfSU1QT1JUX1NFTEVDVF9VVElMX0pBUlNfVE9fQkVfUFJPSkVDVFMpKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQkvLyBjcmVhdGUgamFycyBjaGVjayBib3ggdmlld2VyCi0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KGdyb3VwKTsKLQkJY3JlYXRlQnV0dG9uc0dyb3VwKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdE9wdGlvbnNHcm91cAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU92ZXJ3cml0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlvdmVyd3JpdGVQcm9qZWN0Q2hlY2tib3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJb3ZlcndyaXRlUHJvamVjdENoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV82IikpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcndyaXRlUHJvamVjdENoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKQVJzQ29tcG9zaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsR3JheWVkKCFlbmFibGVkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9JRl9ORUNFU1NBUlksIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktFRF9QQVRIX1ZBUklBQkxFfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXZhaWxhYmxlSmFyc0NvbWJvLnNldEl0ZW1zKHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSB7Ci0JCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3TmFtZSA9IGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCk7Ci0KLQkJCS8vIHJpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwICYmICFuZXdOYW1lLmVxdWFscyhzb3VyY2VOYW1lc1tpXSkpIHsKLQkJCQkJbmV3TmFtZXMuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdOYW1lcy5hZGQoMCwgYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKSk7Ci0JCQlzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbbmV3TmFtZXMuc2l6ZSgpXTsKLQkJCW5ld05hbWVzLnRvQXJyYXkoc291cmNlTmFtZXMpOwotCi0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCksIHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVOYW1lc1N0b3JlSUQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJVVElMIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMTA0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkJyb3dzZUJ1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbjsKLQotCXByaXZhdGUgQ29tYm8gcmVzb3VyY2VOYW1lQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5SmFySW50b0VBUjsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtKYXJJbnRvRUFSOwotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlTGlua2VkUHJvamVjdHM7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVQcm9qZWN0czsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94OwotCi0KLQlwcm90ZWN0ZWQgVGV4dCBwcm9qZWN0Um9vdExvY2F0aW9uVGV4dDsKLQotCXByaXZhdGUgTGFiZWwgbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgR3JvdXAgcHJvamVjdFJvb3RDb21wb3NpdGU7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQlzZXRUaXRsZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUDIpOwotCX0KLQotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXRoaXMuY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRUaXRsZShUSVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShUSVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9ST09UfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlRUFSUHJvamVjdEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVV0aWxpdHlKYXJJbXBvcnRUeXBlcyhjb21wb3NpdGUpOwotCQkvLyBUT0RPIFRoZSBiaW5hcnkgLyBwcm9qZWN0IGxvY2F0aW9uIG9wdGlvbnMgYXJlIG5vdCB5ZXQgKHJlLSkgc3VwcG9ydGVkIGJ5IHRoZSBpbXBvcnQgb3BlcmF0aW9ucy4gCi0JCWNyZWF0ZVByb2plY3RDcmVhdGlvbk9wdGlvbnMoY29tcG9zaXRlKTsKLQotCQlzZXR1cEJhc2VkT25Jbml0aWFsU2VsZWN0aW9ucygpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVV0aWxpdHlKYXJJbXBvcnRUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIHR5cGVzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXR5cGVzR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8yIikpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXR5cGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXR5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlUHJvamVjdHMgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNyZWF0ZVByb2plY3RzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGNyZWF0ZVByb2plY3RzLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfUFJPSkVDVCwgbnVsbCk7Ci0KLQkJY3JlYXRlTGlua2VkUHJvamVjdHMgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNyZWF0ZUxpbmtlZFByb2plY3RzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGNyZWF0ZUxpbmtlZFByb2plY3RzLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BST0pFQ1QsIG51bGwpOwotCi0JCWNvcHlKYXJJbnRvRUFSID0gbmV3IEJ1dHRvbih0eXBlc0dyb3VwLCBTV1QuUkFESU8pOwotCQljb3B5SmFySW50b0VBUi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhjb3B5SmFySW50b0VBUiwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09QWSwgbnVsbCk7Ci0KLQkJbGlua0phckludG9FQVIgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxpbmtKYXJJbnRvRUFSLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNiIpKTsgLy8kTk9OLU5MUy0xJAotCQkvKiBsaW5rSmFySW50b0VBUi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUeXBlU2VsZWN0aW9uTGlzdGVuZXIoKSk7ICovCi0JCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8obGlua0phckludG9FQVIsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktfSU1QT1JULCBudWxsKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RDcmVhdGlvbk9wdGlvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUdyb3VwIHByb2plY3RPcHRpb25zR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV83IikpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IAotCi0JCW92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveCA9IG5ldyBCdXR0b24ocHJvamVjdE9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMTEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlUHJvamVjdFJvb3RDb21wb3NpdGUocHJvamVjdE9wdGlvbnNHcm91cCk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVycmlkZVByb2plY3RSb290Q2hlY2tib3gsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJSSURFX1BST0pFQ1RfUk9PVCwgbmV3IENvbnRyb2xbXXsvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHByb2plY3RSb290TG9jYXRpb25UZXh0LAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJyb3dzZUJ1dHRvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqL30pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiB0aGlzIGdyb3VwJ3MKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgdmlzdWFsIGNvbXBvbmVudHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVBUlByb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJR3JvdXAgZWFyR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWVhckdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQllYXJHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZWFyR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gUHJvamVjdCBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwoZWFyR3JvdXAsIFNXVC5OT05FKTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOSIpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBQcm9qZWN0IGNvbWJvCi0JCXJlc291cmNlTmFtZUNvbWJvID0gbmV3IENvbWJvKGVhckdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJcmVzb3VyY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhyZXNvdXJjZU5hbWVDb21ibywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgbnVsbCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0Um9vdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXByb2plY3RSb290Q29tcG9zaXRlID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlwcm9qZWN0Um9vdENvbXBvc2l0ZS5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfTE9DQVRJT05TX0dST1VQKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0Um9vdENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcHJvamVjdFJvb3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwocHJvamVjdFJvb3RDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfUFJPSkVDVF9HUk9VUF9ERVNDUklQVElPTikpOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShnZDIpOwotCi0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHByb2plY3RSb290Q29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCW1vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0RFRkFVTFRfUk9PVF9SQURJTykpOwotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dCA9IG5ldyBUZXh0KHByb2plY3RSb290Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldFRleHQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldEVuYWJsZWQoZmFsc2UpOyAvKiBkaXNhYmxlZCBieSBkZWZhdWx0ICovCi0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0Um9vdENvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVSb290UHJvamVjdEJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3RSb290TG9jYXRpb25UZXh0LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX1JPT1QsIG5ldyBDb250cm9sW117bW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwsIHByb2plY3RSb290TG9jYXRpb25UZXh0LCBicm93c2VCdXR0b259KTsKLQl9Ci0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290UHJvamVjdEJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU0VMRUNUX0RJUkVDVE9SWV9ETEcpKTsKLQotCQlTdHJpbmcgZGlyTmFtZSA9IGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKTsKLQotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZGlyTmFtZSkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VTdGFydExvY2F0aW9uKCkgewotCQlTdHJpbmcgdGV4dCA9IHByb2plY3RSb290TG9jYXRpb25UZXh0LmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCkgewotCi0JCWlmIChudWxsID09IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiB8fCBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpKQotCQkJcmV0dXJuOyAvLyBubwotCQkvLyBzZXR1cAotCQkvLyBuZWVkZWQKLQotCQlqYXZhLnV0aWwuTGlzdCBzZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhZW51bSA9IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgYWVudW0ubmV4dCgpOwotCQkJLy8gZG8gbm90IGFkZCBpbmFjY2Vzc2libGUgZWxlbWVudHMKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJc2VsZWN0aW9ucy5hZGQoY3VycmVudFJlc291cmNlKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47IC8vIHNldHVwIG5vdCBuZWVkZWQgYW55bW9yZQotCi0JCWludCBzZWxlY3RlZFJlc291cmNlQ291bnQgPSBzZWxlY3Rpb25zLnNpemUoKTsKLQkJaWYgKHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9PSAxKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxlY3Rpb25zLmdldCgwKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0ICkgewotCQkJCXJlc291cmNlTmFtZUNvbWJvLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSByZXNvdXJjZSBuYW1lIGZpZWxkIGJhc2VkIHVwb24gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0dXBCYXNlZE9uUmVmT2JqZWN0U2VsZWN0aW9uKCkgewotCi0JCWlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IG8gPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghaXNNZXRhVHlwZVN1cHBvcnRlZChvKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBvOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVBUkZpbGUgfHwgbyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVByb2plY3RPcHRpb25zKGJvb2xlYW4gZW5hYmxlZCkgeyAKLQkJb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJaWYgKG92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveC5nZXRTZWxlY3Rpb24oKSAmJiBlbmFibGVkKQotCQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZWxzZQotCQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIG1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSkuaXNPSygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTZhNTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi0KLS8qKgotICogPHA+Ci0gKiBVc2VkIHRvIGltcG9ydCBVdGlsaXR5IEphcnMgaW50byBzZXZlcmFsIEVjbGlwc2Ugd29ya2JlbmNoIGNvbmZpZ3VyYXRpb25zLiBUaGVzZSBjYW4gYmUgZXh0cmFjdGVkCi0gKiBhcyBlZGl0YWJsZSBwcm9qZWN0cywgYmluYXJ5IHByb2plY3RzLCBsaW5rZWQgcmVzb3VyY2VzIGluIHRoZSBFQVIgbW9kdWxlIG9yIGFjdHVhbCByZXNvdXJjZXMgaW4KLSAqIHRoZSBFQVIgbW9kdWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgcGFnZSBvZiB0aGUgV2l6YXJkIHdoaWNoIGFsbG93cyB1c2VycyB0byBkZWZpbmUgdGhlCi0JICogdHlwZSBvZiBpbXBvcnQgdGhleSB3b3VsZCBsaWtlIHRvIGNhcnJ5IG91dC4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9UWVBFID0gIklNUE9SVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBwYWdlIG9mIHRoZSBXaXphcmQgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGphcgotCSAqIGZpbGVzIGZvciBpbXBvcnQKLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9KQVJTID0gIlNFTEVDVF9KQVJTIjsgLy8kTk9OLU5MUy0xJAotIAotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjM4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3fWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI0lNUE9SVF9UWVBFfSkKLQkgKiA8bGk+e0BsaW5rIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ld31hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNTRUxFQ1RfSkFSU30pCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJdGhpcy5hZGRQYWdlKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KGdldERhdGFNb2RlbCgpLCBJTVBPUlRfVFlQRSwgZ2V0U2VsZWN0aW9uKCkpKTsKLQkJdGhpcy5hZGRQYWdlKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcoZ2V0RGF0YU1vZGVsKCksIFNFTEVDVF9KQVJTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9VVElMSVRZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NzhjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWxlU3lzdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+TWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IGlzIGEgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHRoYXQga25vd3MgaWYKLSAqIGl0IGhhcyBiZWVuIHBvcHVsYXRlZCBvciBub3QuCi0gKi8KLWNsYXNzIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGV4dGVuZHMgRmlsZVN5c3RlbUVsZW1lbnQgewotCXByaXZhdGUgYm9vbGVhbiBwb3B1bGF0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlQmFzZURpck5hbWUgPSBudWxsOwotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSBhbmQgcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbGVtZW50IHRoaXMgcmVwcmVzZW50cwotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIHBhcmVudAotCSAqIEBwYXJhbSBpc0RpcmVjdG9yeQotCSAqICAgICAgICAgICAgaW5kaWNhdGVkIGlmIHRoaXMgY291bGQgaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChTdHJpbmcgbmFtZSwgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWxlU3lzdGVtRWxlbWVudCBwYXJlbnQsIGJvb2xlYW4gaXNEaXJlY3RvcnkpIHsKLQkJc3VwZXIobmFtZSwgcGFyZW50LCBpc0RpcmVjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZUJhc2VEaXJOYW1lKFN0cmluZyBzKSB7Ci0JCXBhY2thZ2VCYXNlRGlyTmFtZSA9IHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoRmlsZVN5c3RlbUVsZW1lbnQgY2hpbGQpIHsKLQkJaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXN1cGVyLmFkZENoaWxkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjaGlsZC5nZXRGaWxlTmFtZUV4dGVuc2lvbigpLmVxdWFscygiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3VwZXIuYWRkQ2hpbGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlciBpZiBpdAotCSAqIG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4gb2YgdGhpcyBmb2xkZXIuCi0JICovCi0JcHVibGljIEFkYXB0YWJsZUxpc3QgZ2V0RmlsZXMoSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWlmICghcG9wdWxhdGVkKQotCQkJcG9wdWxhdGUocHJvdmlkZXIpOwotCi0JCXJldHVybiBzdXBlci5nZXRGaWxlcygpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZvbGRlcnMgdGhhdCBhcmUgaW1tZWRpYXRlIGNoaWxkcmVuLiBVc2UgdGhlIHN1cHBsaWVkIHByb3ZpZGVyIGlmIGl0Ci0JICogbmVlZHMgdG8gYmUgcG9wdWxhdGVkLiBvZiB0aGlzIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgQWRhcHRhYmxlTGlzdCBnZXRGb2xkZXJzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoIXBvcHVsYXRlZCkKLQkJCXBvcHVsYXRlKHByb3ZpZGVyKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Rm9sZGVycygpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHBvcHVsYXRpb24gaGFzIGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCi0JICovCi0JYm9vbGVhbiBpc1BvcHVsYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMucG9wdWxhdGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBub3QgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlci4KLQkgKi8KLQlib29sZWFuIG5vdFBvcHVsYXRlZCgpIHsKLQkJcmV0dXJuICF0aGlzLnBvcHVsYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgb2YgdGhlIHJlY2VpdmVyIHVzaW5nIHRoZSBzdXBwbGllYyBzdHJ1Y3R1cmUgcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGUoSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0KLQkJT2JqZWN0IGZpbGVTeXN0ZW1PYmplY3QgPSBnZXRGaWxlU3lzdGVtT2JqZWN0KCk7Ci0KLQkJTGlzdCBjaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKGZpbGVTeXN0ZW1PYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJSXRlcmF0b3IgY2hpbGRyZW5FbnVtID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNoaWxkcmVuRW51bS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuRW51bS5uZXh0KCk7Ci0KLQkJCVN0cmluZyBlbGVtZW50TGFiZWwgPSBwcm92aWRlci5nZXRMYWJlbChjaGlsZCk7Ci0JCQlpZiAoZWxlbWVudExhYmVsLmVxdWFscyhwYWNrYWdlQmFzZURpck5hbWUpIHx8IHBhY2thZ2VCYXNlRGlyTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy9DcmVhdGUgb25lIGxldmVsIGJlbG93Ci0KLQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoZWxlbWVudExhYmVsLCB0aGlzLCBwcm92aWRlci5pc0ZvbGRlcihjaGlsZCkpOwotCQkJCXJlc3VsdC5zZXRGaWxlU3lzdGVtT2JqZWN0KGNoaWxkKTsKLQkJCX0KLQkJfQotCQlzZXRQb3B1bGF0ZWQoKTsKLQotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyIHRvIHRydWUuCi0JICovCi0Jdm9pZCBzZXRQb3B1bGF0ZWQoKSB7Ci0JCXRoaXMucG9wdWxhdGVkID0gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzMyNTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuV29ya2JlbmNoQWN0aXZpdHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuR2VuZXJpY1dpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLk5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZDsKLQotcHVibGljIGNsYXNzIE5ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0gICAgcHJpdmF0ZSBCdXR0b24gZGVmYXVsdE1vZHVsZXNCdXR0b247Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5ld01vZHVsZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBhcHBDbGllbnRSYWRpb0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGVqYlJhZGlvQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gd2ViUmFkaW9CdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBjb25uZWN0b3JSYWRpb0J1dHRvbjsKLQotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgYXBwQ2xpZW50Tm9kZTsKLQotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgZWpiTm9kZTsKLQotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgd2ViTm9kZTsKLQotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgY29ubmVjdG9yTm9kZTsKLQotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgc2VsZWN0ZWROb2RlOwotCi0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBzdGFja0xheW91dDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSBwYWdlTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBOZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLSAgICAgICAgc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLSAgICAgICAgc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9USVRMRSkpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0RFU0MpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENSRUFURV9BUFBDTElFTlQsIEFQUENMSUVOVF9DT01QT05FTlRfTkFNRSwgQ1JFQVRFX0NPTk5FQ1RPUiwgQ09OTkVDVE9SX0NPTVBPTkVOVF9OQU1FLCBDUkVBVEVfRUpCLCBFSkJfQ09NUE9ORU5UX05BTUUsIENSRUFURV9XRUIsIFdFQl9DT01QT05FTlRfTkFNRSwgTU9EVUxFX05BTUVfQ09MTElTSU9OU19WQUxJREFUSU9OLCBFTkFCTEVEIH07Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLkVBUl9ORVdfTU9EVUxFX1BST0pFQ1RTX1BBR0UpOwotICAgICAgICBjcmVhdGVEZWZhdWx0Q2hlY2tCb3goY29tcG9zaXRlKTsKLSAgICAgICAgQ29tcG9zaXRlIGZvclN0YWNrQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZm9yU3RhY2tDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGZvclN0YWNrQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBDb21wb3NpdGUgc3RhY2tDb21wb3NpdGUgPSBjcmVhdGVTdGFja0xheW91dENvbXBvc2l0ZShmb3JTdGFja0NvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZURlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKHN0YWNrQ29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlTW9kdWxlU2VsZWN0aW9uQ29tcG9zaXRlKHN0YWNrQ29tcG9zaXRlKTsKLSAgICAgICAgc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlOwotICAgICAgICBzZXRCdXR0b25FbmFibGVtZW50KCk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVN0YWNrTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIHN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgLy8gRGVmYXVsdCBNb2R1bGUgQ29udHJvbHMgY3JlYXRpb24KLSAgICAgICAgY3JlYXRlQXBwQ2xpZW50RGVmYXVsdE1vZHVsZUNvbnRyb2woKTsKLSAgICAgICAgaWYgKEoyRUVQbHVnaW4uaXNFSkJTdXBwb3J0QXZhaWxhYmxlKCkpCi0gICAgICAgICAgICBjcmVhdGVFSkJEZWZhdWx0TW9kdWxlQ29udHJvbCgpOwotICAgICAgICBjcmVhdGVXZWJEZWZhdWx0TW9kdWxlQ29udHJvbCgpOwotICAgICAgICBpZiAoSjJFRVBsdWdpbi5pc0VKQlN1cHBvcnRBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIGNyZWF0ZUNvbm5lY3RvckRlZmF1bHRNb2R1bGVDb250cm9sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNb2R1bGVTZWxlY3Rpb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuZXdNb2R1bGVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihuZXdNb2R1bGVzQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCi0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuYXBwQ2xpZW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRFSkJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlamJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIGVqYlJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuZWpiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlamJSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRXZWJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIHdlYlJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2Uud2ViIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB3ZWJSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRKQ0FNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24obmV3TW9kdWxlc0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgICAgIGNvbm5lY3RvclJhZGlvQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld01vZHVsZVNlbGVjdGlvblBhZ2UuamNhIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb25uZWN0b3JEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0SkNBTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9KQ0FfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX0NPTk5FQ1RPUiwgQ09OTkVDVE9SX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0V2ViTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9XRUJfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX1dFQiwgV0VCX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFSkJEZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9FSkJfTU9EVUxFX0xCTCk7Ci0gICAgICAgICAgICBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChsYWJlbCwgQ1JFQVRFX0VKQiwgRUpCX0NPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBcHBDbGllbnREZWZhdWx0TW9kdWxlQ29udHJvbCgpIHsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9BUFBDTElFTlRfTU9EVUxFX0xCTCk7Ci0gICAgICAgIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKGxhYmVsLCBDUkVBVEVfQVBQQ0xJRU5ULCBBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKMkVFQ29tcG9uZW50Q29udHJvbChTdHJpbmcgbGFiZWwsIFN0cmluZyBjcmVhdGVQcm9wZXJ0eSwgU3RyaW5nIHByb2plY3RQcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBjaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0gICAgICAgIGZpbmFsIFRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQoZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHRleHRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNoZWNrQm94LCBjcmVhdGVQcm9wZXJ0eSwgbnVsbCk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoVGV4dCh0ZXh0RmllbGQsIHByb2plY3RQcm9wZXJ0eSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjaGVja0JveENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY2hlY2tCb3hDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNoZWNrQm94Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbiA9IG5ldyBCdXR0b24oY2hlY2tCb3hDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgICBkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkRFRkFVTFRfQ09NUE9ORU5UX1BBR0VfTkVXX01PRF9TRUxfUEdfREVGX0JUTikpOwotICAgICAgICBkZWZhdWx0TW9kdWxlc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRlZmF1bHRNb2R1bGVzQnV0dG9uLCBFTkFCTEVELCBudWxsKTsKLSAgICAgICAgY3JlYXRlQ29udHJvbHNTZXBhcmF0b3JMaW5lKGNoZWNrQm94Q29tcG9zaXRlKTsgICAgCi0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzU2VwYXJhdG9yTGluZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGFkZCBhIGhvcml6b250YWwgbGluZQotICAgICAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGlmIChldnQud2lkZ2V0ID09IGRlZmF1bHRNb2R1bGVzQnV0dG9uKQotICAgICAgICAgICAgaGFuZGxlRGVmYXVsdE1vZHVsZXNCdXR0b25QcmVzc2VkKCk7Ci0gICAgICAgIGVsc2UgaWYgKCFkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKGV2dC53aWRnZXQgPT0gYXBwQ2xpZW50UmFkaW9CdXR0b24gJiYgYXBwQ2xpZW50UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldEFwcENsaWVudE5vZGUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChldnQud2lkZ2V0ID09IGVqYlJhZGlvQnV0dG9uICYmIGVqYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkTm9kZShnZXRFamJOb2RlKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LndpZGdldCA9PSB3ZWJSYWRpb0J1dHRvbiAmJiB3ZWJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUoZ2V0V2ViTm9kZSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGV2dC53aWRnZXQgPT0gY29ubmVjdG9yUmFkaW9CdXR0b24gJiYgY29ubmVjdG9yUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldENvbm5lY3Rvck5vZGUoKSk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5oYW5kbGVFdmVudChldnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEZWZhdWx0TW9kdWxlc0J1dHRvblByZXNzZWQoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKG51bGwpOwotICAgICAgICAgICAgc2hvd0RlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBzZXREZWZhdWx0TW9kdWxlc1NlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldERlZmF1bHRNb2R1bGVzU2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHNob3dOZXdNb2R1bGVzQ29tcHNpdGUoKTsKLSAgICAgICAgfQotICAgICAgICBzZXRCdXR0b25FbmFibGVtZW50KCk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0TW9kdWxlc1NlbGVjdGlvbihib29sZWFuIHNlbGVjdGlvbikgewotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0FQUENMSUVOVCwgc2VsZWN0aW9uKTsKLSAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9DT05ORUNUT1IsIHNlbGVjdGlvbik7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfRUpCLCBzZWxlY3Rpb24pOwotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX1dFQiwgc2VsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0RlZmF1bHRNb2R1bGVzQ29tcG9zaXRlKCkgewotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBuZXdNb2R1bGVzQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gZGVmYXVsdE1vZHVsZXNDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBkb25lIGJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24uIFdlIG5lZWQgdG8gZGlzYWJsZSBDb25uZWN0b3JzIGlmCi0gICAgICogbm90IGoyZWUgMS4zIG9yIGhpZ2hlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnV0dG9uRW5hYmxlbWVudCgpIHsKLSAgICAgICAgaWYgKCFkZWZhdWx0TW9kdWxlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGdldERhdGFNb2RlbCgpLmdldEludFByb3BlcnR5KEoyRUVfVkVSU0lPTik7Ci0gICAgICAgICAgICBjb25uZWN0b3JSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd05ld01vZHVsZXNDb21wc2l0ZSgpIHsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgaWYgKCFpc0FueU1vZHVsZVJhZGlvU2VsZWN0ZWQoKSkKLSAgICAgICAgICAgIGFwcENsaWVudFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldFdpemFyZE5vZGVGcm9tU2VsZWN0aW9uKCkpOwotICAgICAgICBzdGFja0xheW91dC50b3BDb250cm9sID0gbmV3TW9kdWxlc0NvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRXaXphcmROb2RlRnJvbVNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKGFwcENsaWVudFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGdldEFwcENsaWVudE5vZGUoKTsKLSAgICAgICAgaWYgKGNvbm5lY3RvclJhZGlvQnV0dG9uICE9IG51bGwgJiYgY29ubmVjdG9yUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q29ubmVjdG9yTm9kZSgpOwotICAgICAgICBpZiAoZWpiUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBlamJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRFamJOb2RlKCk7Ci0gICAgICAgIGlmICh3ZWJSYWRpb0J1dHRvbiAhPSBudWxsICYmIHdlYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGdldFdlYk5vZGUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FueU1vZHVsZVJhZGlvU2VsZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBhcHBDbGllbnRSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCAoY29ubmVjdG9yUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgfHwgKGVqYlJhZGlvQnV0dG9uICE9IG51bGwgJiYgZWpiUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHx8ICh3ZWJSYWRpb0J1dHRvbiAhPSBudWxsICYmIHdlYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFwcENsaWVudE5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRBcHBDbGllbnROb2RlKCkgewotICAgICAgICBpZiAoYXBwQ2xpZW50Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcHBDbGllbnROb2RlID0gbmV3IEdlbmVyaWNXaXphcmROb2RlKCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGNyZWF0ZUNoaWxkV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudC5BcHBDbGllbnRQcm9qZWN0V2l6YXJkIiwgTkVTVEVEX01PREVMX0NMSUVOVCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcHBDbGllbnROb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29ubmVjdG9yTm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldENvbm5lY3Rvck5vZGUoKSB7Ci0gICAgICAgIGlmIChjb25uZWN0b3JOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbm5lY3Rvck5vZGUgPSBuZXcgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkdlbmVyaWNXaXphcmROb2RlI2NyZWF0ZVdpemFyZCgpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotICAgICAgICAgICAgICAgIAlyZXR1cm4gY3JlYXRlQ2hpbGRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCIsIE5FU1RFRF9NT0RFTF9KQ0EpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29ubmVjdG9yTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVqYk5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRFamJOb2RlKCkgewotICAgICAgICBpZiAoZWpiTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlamJOb2RlID0gbmV3IEdlbmVyaWNXaXphcmROb2RlKCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGNyZWF0ZUNoaWxkV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLnByb2plY3QuZmFjZXQuRWpiUHJvamVjdFdpemFyZCIsIE5FU1RFRF9NT0RFTF9FSkIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWpiTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYk5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBHZW5lcmljV2l6YXJkTm9kZSBnZXRXZWJOb2RlKCkgewotICAgICAgICBpZiAod2ViTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJOb2RlID0gbmV3IEdlbmVyaWNXaXphcmROb2RlKCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGNyZWF0ZUNoaWxkV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiLCBORVNURURfTU9ERUxfV0VCKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYk5vZGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVdpemFyZCBjcmVhdGVDaGlsZFdpemFyZChTdHJpbmcgaWQsIFN0cmluZyBwYXJlbnRXaXpNb2RlbE5hbWUpIHsKLSAgICAJTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHdpemFyZCA9IG51bGw7Ci0gICAgCUlXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLSAgICAJSVdpemFyZERlc2NyaXB0b3Igd2l6YXJkRGVzY3JpcHRvciA9IG5ld1dpemFyZFJlZ2lzdHJ5LmZpbmRXaXphcmQoaWQpOyAKLSAgICAJdHJ5IHsKLSAgICAJCS8vIHJldHJpZXZlIHRoZSBtb2RlbCBvZiB0aGUgcGFyZW50IHdpemFyZAotICAgIAkJSURhdGFNb2RlbCBwYXJlbnRXaXpNb2RlbCA9IGdldERhdGFNb2RlbCgpLmdldE5lc3RlZE1vZGVsKHBhcmVudFdpek1vZGVsTmFtZSk7Ci0KLSAgICAJCS8vIGNyZWF0ZSB0aGUgY2hpbGQgd2l6YXJkIGFuZCByZXRyaWV2ZSBpdHMgbW9kZWwKLSAgICAJCXdpemFyZCA9IChOZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQpIHdpemFyZERlc2NyaXB0b3IuY3JlYXRlV2l6YXJkKCk7Ci0gICAgCQlJRGF0YU1vZGVsIGNoaWxkV2l6TW9kZWwgPSB3aXphcmQuZ2V0RGF0YU1vZGVsKCk7Ci0KLSAgICAJCS8vIGNvcHkgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhcmVudCB3aXphcmQncyBtb2RlbCB0byB0aGUgY2hpbGQgd2l6YXJkJ3MgbW9kZWwKLSAgICAJCUl0ZXJhdG9yIHByb3BzID0gcGFyZW50V2l6TW9kZWwuZ2V0QmFzZVByb3BlcnRpZXMoKS5pdGVyYXRvcigpOwotICAgIAkJd2hpbGUgKHByb3BzLmhhc05leHQoKSkgewotICAgIAkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgcHJvcHMubmV4dCgpOwotICAgIAkJCWNoaWxkV2l6TW9kZWwuc2V0UHJvcGVydHkocHJvcCwgcGFyZW50V2l6TW9kZWwuZ2V0UHJvcGVydHkocHJvcCkpOwotICAgIAkJfQotICAgIAkJLy9bQnVnIDI0MzIyNl0gYWZ0ZXIgdXBkYXRpbmcgdGhlIG1vZGVsIHRoZSBGYWN0ZWRQcm9qZWN0V29ya2luZ0NvcHkgbmVlZHMgdG8gYmUgdXBkYXRlZC4KLSAgICAJCXdpemFyZC5zZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSljaGlsZFdpek1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSkpOwotICAgIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGNlKTsKLSAgICAJfQotICAgIAlyZXR1cm4gd2l6YXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZWxlY3RlZE5vZGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZE5vZGUgdG8gc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZE5vZGUoR2VuZXJpY1dpemFyZE5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gc2VsZWN0ZWROb2RlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZSAhPSBudWxsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZFNlbGVjdGlvblBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGN1cnJlbnRseQotICAgICAqIHNlbGVjdGVkIHdpemFyZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgSVBsdWdpbkNvbnRyaWJ1dGlvbiBwbHVnaW5Db250cmlidXRpb24gPSBuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJZCgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGUgPT0gYXBwQ2xpZW50Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5hcHBjbGllbnRQcm9qZWN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb2RlID09IGVqYk5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnV0aWwuZWpiUHJvamVjdFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm9kZSA9PSBjb25uZWN0b3JOb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmpjYVByb2plY3RXaXphcmQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vZGUgPT0gd2ViTm9kZSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJQcm9qZWN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoIVdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmFsbG93VXNlT2YobnVsbCxwbHVnaW5Db250cmlidXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNDcmVhdGVkID0gc2VsZWN0ZWROb2RlLmlzQ29udGVudENyZWF0ZWQoKTsKLSAgICAgICAgSVdpemFyZCB3aXphcmQgPSBzZWxlY3RlZE5vZGUuZ2V0V2l6YXJkKCk7Ci0gICAgICAgIGlmICh3aXphcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NyZWF0ZWQpIC8vIEFsbG93IHRoZSB3aXphcmQgdG8gY3JlYXRlIGl0cyBwYWdlcwotICAgICAgICAgICAgd2l6YXJkLmFkZFBhZ2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjdmFsaWRhdGVQYWdlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIGlmICghZGVmYXVsdE1vZHVsZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY1M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuRmlsdGVyZWRUeXBlc1NlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVTZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE5ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1YmxpY0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFic3RyYWN0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZmluYWxCdXR0b247Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGludGVyZmFjZVZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGluaGVyaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjb25zdHJ1Y3RvckJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIG1haW5NZXRob2RCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLnNldFRpdGxlKHBhZ2VUaXRsZSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfSkFWQV9DTEFTU19PUFRJT05fV0laQVJEX1AxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfQUJTVFJBQ1QsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0ZJTkFMfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZU1vZGlmaWVyQ29udHJvbHMoY29tcG9zaXRlKTsKLQkJY3JlYXRlSW50ZXJmYWNlQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQkvLyBTZXBhcmF0b3IgbGFiZWwKLQkJTGFiZWwgc2VwZXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwZXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlU3R1YnNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlwdWJsaWNCdXR0b24uc2V0Rm9jdXMoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250cm9scyBmb3IgdGhlIG1vZGlmaWVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1vZGlmaWVyQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBtb2RpZmllcnNMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbW9kaWZpZXJzTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCk7Ci0JCW1vZGlmaWVyc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXB1YmxpY0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlwdWJsaWNCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gocHVibGljQnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9QVUJMSUMsIG51bGwpOwotCi0JCWFic3RyYWN0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWFic3RyYWN0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWJzdHJhY3RCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0FCU1RSQUNULCBudWxsKTsKLQotCQlmaW5hbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmaW5hbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGZpbmFsQnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9GSU5BTCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW50ZXJmYWNlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBpbnRlcmZhY2VMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW50ZXJmYWNlTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwpOwotCQlpbnRlcmZhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWludGVyZmFjZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlpbnRlcmZhY2VWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlpbnRlcmZhY2VWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldEludGVyZmFjZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaW50ZXJmYWNlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0SW50ZXJmYWNlTGFiZWxQcm92aWRlcigpKTsKLQkJaW50ZXJmYWNlVmlld2VyLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihnZXRJbnRlcmZhY2VLZXlMaXN0ZW5lcigpKTsKLQkJaW50ZXJmYWNlVmlld2VyLnNldElucHV0KG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVMpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkFERF9CVVRUT05fTEFCRUwpOwotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUludGVyZmFjZUFkZEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5SRU1PVkVfQlVUVE9OKTsKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVJbnRlcmZhY2VSZW1vdmVCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJaW50ZXJmYWNlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb21wb3NpdGUgd2l0aCBhbGwgdGhlIHN0dWJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3R1YnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBzdHViTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXN0dWJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R1YkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltYWluTWV0aG9kQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULkNIRUNLKTsKLQkJbWFpbk1ldGhvZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gobWFpbk1ldGhvZEJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9NRVRIT0QsIG51bGwpOwotCi0JCWluaGVyaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChpbmhlcml0QnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTLCBudWxsKTsKLQotCQljb25zdHJ1Y3RvckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5DSEVDSyk7Ci0JCWNvbnN0cnVjdG9yQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY29uc3RydWN0b3JCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCS8vc2V0IHRoZSBpbnRlZmFjZXMgb24gZXZlcnkgcGFnZSBlbnRlciAobm90IG9ubHkgb24gdmlld2VyIGNyZWF0aW9uKQotCQlpbnRlcmZhY2VWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUykpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVN0YXRlZnVsV2l6YXJkUGFnZSNzYXZlV2lkZ2V0VmFsdWVzKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCS8vIC8vIFRPRE86IGRvIHdlIHdhbnQgdG8gZG8gdGhpcyBoZXJlIG9yIGluIHRoZSBjb25jcmV0ZSBzdWJjbGFzc2VzPz8/Ci0JLy8gSURpYWxvZ1NldHRpbmdzIHN0b3JlID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkvLyBpZiAoc3RvcmUgIT0gbnVsbCkKLQkvLyBzdG9yZS5wdXQoZ2V0VW5pcXVlS2V5KCIiKSwgZ2V0VW5pcXVlS2V5KCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkvLyAvLyROT04tTkxTLTIkCi0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihpbmhlcml0QnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZEluaGVyaXRlZEFic3RyYWN0QnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnNhdmVCdXR0b24oY29uc3RydWN0b3JCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkU3VwZXJDbGFzc0NvbnN0cnVjdG9yc0J1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5zYXZlQnV0dG9uKHB1YmxpY0J1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRQdWJsaWNCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihhYnN0cmFjdEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRBYnN0cmFjdEJ1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5zYXZlQnV0dG9uKGZpbmFsQnV0dG9uLCBnZXRVbmlxdWVLZXkoaWRGaW5hbEJ1dHRvbiksCi0JLy8gc3RvcmUpOwotCS8vCi0JLy8gfQotCS8qKgotCSAqIEBzZWUgSVN0YXRlZnVsV2l6YXJkUGFnZSNyZXN0b3JlV2lkZ2V0VmFsdWVzKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCS8vIElEaWFsb2dTZXR0aW5ncyBzdG9yZSA9IHN1cGVyLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JLy8gaWYgKHN0b3JlICE9IG51bGwgJiYgc3RvcmUuZ2V0KGdldFVuaXF1ZUtleSgiIikpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24oaW5oZXJpdEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRJbmhlcml0ZWRBYnN0cmFjdEJ1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5yZXN0b3JlQnV0dG9uKGNvbnN0cnVjdG9yQnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZFN1cGVyQ2xhc3NDb25zdHJ1Y3RvcnNCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIucmVzdG9yZUJ1dHRvbihwdWJsaWNCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkUHVibGljQnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24oYWJzdHJhY3RCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkQWJzdHJhY3RCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIucmVzdG9yZUJ1dHRvbihmaW5hbEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRGaW5hbEJ1dHRvbiksIHN0b3JlKTsKLQkvLyB9Ci0JLy8gfQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN1cGVyIEludGVyZmFjZSBDb250ZW50IFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGdldEludGVyZmFjZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gcmV0ID0gbmV3IE9iamVjdFswXTsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlyZXQgPSAoKExpc3QpIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vRGVmYXVsdCBpcyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3VwZXIgSW50ZXJmYWNlIExhYmVsIFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGdldEludGVyZmFjZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfT0JKU19JTlRFUkZBQ0UpOyAKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHJldCA9IEoyRUVVSU1lc3NhZ2VzLkVNUFRZX1NUUklORzsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQkJcmV0ID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEtleUxpc3RlbmVyIGdldEludGVyZmFjZUtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkRFTCkgewotCQkJCQloYW5kbGVJbnRlcmZhY2VSZW1vdmVCdXR0b25TZWxlY3RlZCgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCX0KLQotCS8qKgotCSAqIEJyb3dzZSBmb3IgYSBuZXcgU3VwZXIgSW50ZXJmYWNlIENsYXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJmYWNlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQkvLyB0aGlzIGVsaW1pbmF0ZXMgdGhlIG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cmllcwotCQlmaW5hbCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gVHlwZVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChqYXZhUHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCUZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSxmYWxzZSwgY29udGV4dCwgc2NvcGUsSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJVHlwZSB0eXBlID0gKElUeXBlKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCVN0cmluZyBuZXdJbnRlcmZhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCW5ld0ludGVyZmFjZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJTGlzdCB2YWx1ZUxpc3QgPSBnZXRJbnRlcmZhY2VWaWV3ZXJJdGVtcygpOwotCQkJCWlmICghdmFsdWVMaXN0LmNvbnRhaW5zKG5ld0ludGVyZmFjZSkpIHsKLQkJCQkJaW50ZXJmYWNlVmlld2VyLmFkZChuZXdJbnRlcmZhY2UpOwotCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTLCBnZXRJbnRlcmZhY2VWaWV3ZXJJdGVtcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYW4gaW50ZXJmYWNlIGZyb20gdGhlIFN1cGVySW50ZXJmYWNlIExpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnRlcmZhY2VSZW1vdmVCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBpbnRlcmZhY2VWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUxpc3QgaXRlbXMgPSBzZWxlY3Rpb24udG9MaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IHZhbHVlTGlzdCA9IGdldEludGVyZmFjZVZpZXdlckl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJdmFsdWVMaXN0LnJlbW92ZShpdGVtcy5nZXQoaSkpOwotCQkJfQotCQkJaW50ZXJmYWNlVmlld2VyLnNldElucHV0KHZhbHVlTGlzdCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTLCB2YWx1ZUxpc3QpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRJbnRlcmZhY2VWaWV3ZXJJdGVtcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGludGVyZmFjZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWZvciAoVGFibGVJdGVtIGl0ZW0gOiBpdGVtcykgewotCQkJbGlzdC5hZGQoaXRlbS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYmQxM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5kaWFsb2dzLkZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LklWaWV3UGFydElucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVTZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgZm9sZGVyVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmb2xkZXJCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgcGFja2FnZVRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwYWNrYWdlQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBwYWNrYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgY2xhc3NUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBjbGFzc0xhYmVsOwotCXByb3RlY3RlZCBUZXh0IHN1cGVyVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHN1cGVyQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBzdXBlckxhYmVsOwotCXByb3RlY3RlZCBMYWJlbCBwcm9qZWN0TmFtZUxhYmVsOwotCXByaXZhdGUgQ29tYm8gcHJvamVjdE5hbWVDb21ibzsJCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLAotCQkJU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLnNldFRpdGxlKHBhZ2VUaXRsZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMucHJvamVjdFR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLnByb2plY3ROYW1lID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCAKLQkJCQlJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgCi0JCQkJSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUiwgCi0JCQkJSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTfTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlhZGRQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWFkZEZvbGRlckdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWFkZFNlcGVyYXRvcihjb21wb3NpdGUsIDMpOwotCQlhZGRQYWNrYWdlR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkQ2xhc3NuYW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkU3VwZXJjbGFzc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJY2xhc3NUZXh0LnNldEZvY3VzKCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBnZXRJbmZvcG9wSUQoKSk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgcHJvamVjdCBncm91cAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCQkJLy8gdXBkYXRlIHNvdXJjZSBmb2xkZXIKLQkJCQlpZiAoZm9sZGVyVGV4dCAhPSBudWxsKSB7CQkJCQkKLQkJCQkJU3RyaW5nIHNvdXJjZUZvbGRlciA9IGdldERlZmF1bHRKYXZhU291cmNlRm9sZGVyKHByb2plY3QpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwkJCQkJCi0JCQkJCWlmIChzb3VyY2VGb2xkZXIgIT0gbnVsbCkKLQkJCQkJCWZvbGRlclRleHQuc2V0VGV4dChzb3VyY2VGb2xkZXIpOwotCQkJCX0KLQkJCQl2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMocHJvamVjdCk7Ci0JCQl9Ci0JCX0pOwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHByb2plY3ROYW1lQ29tYm8sIElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbnVsbCk7Ci0JCWluaXRpYWxpemVQcm9qZWN0TGlzdCgpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqKi8KLQlwcml2YXRlIElGb2xkZXIgZ2V0RGVmYXVsdEphdmFTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQkKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZXMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQkvLyBUcnkgYW5kIHJldHVybiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlcgotCQlpZiAoc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoSUZvbGRlcikgc291cmNlc1swXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHByb2plY3QgbGlzdCBpbml0aWFsaXplci4gVGhlIG1ldGhvZCBjaGVja3MgCi0JICogaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIHZhbGlkIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHByb2plY3QgbGlzdC4KLQkgKiAKLQkgKiA8cD5TdWJjbGFzc2VzIG9mIHRoaXMgd2l6YXJkIHBhZ2Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIAotCSAqIGFkanVzdCBmaWx0ZXJpbmcgb2YgdGhlIHByb2plY3RzIHRvIHRoZWlyIG5lZWRzLiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIHZhbGlkIHRvIGJlIGluY2x1ZGVkIGluIAotCSAqIAkJICAgdGhlIHByb2plY3QgbGlzdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IC0gb3RoZXJ3aXNlLiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RWYWxpZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0OwotCQl0cnkgewotCQkJcmVzdWx0ID0gcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiAKLQkJCQlwcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpICYmIAotCQkJIAlKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUocHJvamVjdCkuZXF1YWxzKHByb2plY3RUeXBlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JIAotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvamVjdExpc3QoKSB7Ci0JCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXTsKLQkJCWlmIChpc1Byb2plY3RWYWxpZChwcm9qZWN0KSkKLQkJCQlpdGVtcy5hZGQocHJvamVjdC5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChpdGVtcy5pc0VtcHR5KCkpIHJldHVybjsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCW5hbWVzW2ldID0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotCQl9Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotCQlJUHJvamVjdCBzZWxlY3RlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9bnVsbCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZUZyb21Nb2RlbCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKTsKLQkJCQlpZiAocHJvamVjdE5hbWVGcm9tTW9kZWwhPW51bGwgJiYgcHJvamVjdE5hbWVGcm9tTW9kZWwubGVuZ3RoKCk+MCkKLQkJCQkJc2VsZWN0ZWRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lRnJvbU1vZGVsKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotCQl0cnkgewotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCA9PSBudWxsKQotCQkJCXNlbGVjdGVkUHJvamVjdCA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCAhPSBudWxsICYmIHNlbGVjdGVkUHJvamVjdC5pc0FjY2Vzc2libGUoKQotCQkJCQkmJiBzZWxlY3RlZFByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQoc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJdmFsaWRhdGVQcm9qZWN0UmVxdWlyZW1lbnRzKHNlbGVjdGVkUHJvamVjdCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwgJiYgbmFtZXMubGVuZ3RoID4gMCkKLQkJCXByb2plY3ROYW1lID0gbmFtZXNbMF07Ci0KLQkJaWYgKChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSA9PSBudWxsIHx8IHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApICYmIHByb2plY3ROYW1lICE9IG51bGwpIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChwcm9qZWN0TmFtZSk7Ci0JCQl2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWRkIGZvbGRlciBncm91cCB0byBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRm9sZGVyR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBmb2xkZXIKLQkJTGFiZWwgZm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWZvbGRlckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuRk9MREVSX0xBQkVMKTsKLQkJZm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJZm9sZGVyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlmb2xkZXJUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZm9sZGVyVGV4dCwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUiwgbnVsbCk7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0U2VsZWN0ZWRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocm9vdCA9PSBudWxsIHx8ICFyb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmVxdWFscyh0YXJnZXRQcm9qZWN0KSkgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0RGVmYXVsdEphdmFTb3VyY2VGb2xkZXIodGFyZ2V0UHJvamVjdCk7Ci0JCQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJCQlmb2xkZXJUZXh0LnNldFRleHQoZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9sZGVyVGV4dC5zZXRUZXh0KHJvb3QuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCQotCQlmb2xkZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmb2xkZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJZm9sZGVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlmb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUZvbGRlckJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFkZCBwYWNrYWdlIGdyb3VwIHRvIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYWNrYWdlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBwYWNrYWdlCi0JCXBhY2thZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJcGFja2FnZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9QQUNLQUdFX0xBQkVMKTsKLQkJcGFja2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXBhY2thZ2VUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXBhY2thZ2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQocGFja2FnZVRleHQsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSwgbnVsbCk7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGdldFNlbGVjdGVkUGFja2FnZUZyYWdtZW50KCk7Ci0JCVN0cmluZyB0YXJnZXRQcm9qZWN0ID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsgCi0JCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCAmJiBwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkgJiYgCi0JCQkJcGFja2FnZUZyYWdtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGFyZ2V0UHJvamVjdCkpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KHBhY2thZ2VGcmFnbWVudCk7Ci0JCQlpZiAocm9vdCAhPSBudWxsKQotCQkJCWZvbGRlclRleHQuc2V0VGV4dChyb290LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSwgcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQl9Ci0KLQkJcGFja2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXBhY2thZ2VCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJcGFja2FnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJcGFja2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUGFja2FnZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlpZiAocGFja2FnZUZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAocGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkKLQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUGFja2FnZUZyYWdtZW50KSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCkpOwotCQllbHNlIGlmIChwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhY2thZ2VGcmFnbWVudC5nZXRQYXJlbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIGNsYXNzbmFtZSBncm91cCB0byBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NuYW1lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjbGFzcyBuYW1lCi0JCWNsYXNzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWNsYXNzTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5DTEFTU19OQU1FX0xBQkVMKTsKLQkJY2xhc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJY2xhc3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY2xhc3NUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCBudWxsKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHNlcGVyYXRvciB0byBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBlcmF0b3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGhvclNwYW4pIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCS8vIFNlcGFyYXRvciBsYWJlbAotCQlMYWJlbCBzZXBlcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3JTcGFuOwotCQlzZXBlcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgc3VwZXJjbGFzcyBncm91cCB0byB0aGUgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN1cGVyY2xhc3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIHN1cGVyY2xhc3MKLQkJc3VwZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJc3VwZXJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfTEFCRUwpOwotCQlzdXBlckxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXN1cGVyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzdXBlclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChzdXBlclRleHQsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1MsIG51bGwpOwotCi0JCXN1cGVyQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc3VwZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJc3VwZXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXN1cGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTdXBlckJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEJyb3dzZSBmb3IgYSBuZXcgRGVzdGluYXRpb24gRm9sZGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRm9sZGVyQnV0dG9uUHJlc3NlZCgpIHsKLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpOwotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZT09bnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKT09MCkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24ocHJvamVjdCk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnQ7Ci0JCQkJCWZvbGRlclRleHQuc2V0VGV4dChjb250YWluZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJLy8gZGVhbFdpdGhTZWxlY3RlZENvbnRhaW5lclJlc291cmNlKGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYWNrYWdlQnV0dG9uUHJlc3NlZCgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja1Jvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJaWYgKHBhY2tSb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlKYXZhRWxlbWVudFtdIHBhY2thZ2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhY2thZ2VzID0gcGFja1Jvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCQlpZiAocGFja2FnZXMgPT0gbnVsbCkKLQkJCXBhY2thZ2VzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKMkVFVUlNZXNzYWdlcy5QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQyk7Ci0JCWRpYWxvZy5zZXRFbXB0eUxpc3RNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhwYWNrYWdlcyk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCWlmIChmcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZVRleHQuc2V0VGV4dChmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFja2FnZVRleHQuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5FTVBUWV9TVFJJTkcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3VwZXJCdXR0b25QcmVzc2VkKCkgewotCQlnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlpZiAocGFja1Jvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyB0aGlzIGVsaW1pbmF0ZXMgdGhlIG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cmllcwotCQlmaW5hbCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gVHlwZVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChwYWNrUm9vdC5nZXRKYXZhUHJvamVjdCgpLCB0cnVlLCB0cnVlKTsKLQotCQkvLyBUaGlzIGluY2x1ZGVzIGFsbCBlbnRyaWVzIG9uIHRoZSBjbGFzc3BhdGguIFRoaXMgYmVoYXZpb3IgaXMKLQkJLy8gaWRlbnRpY2FsCi0JCS8vIHRvIHRoZSBTdXBlciBDbGFzcyBCcm93c2UgQnV0dG9uIG9uIHRoZSBDcmVhdGUgbmV3IEphdmEgQ2xhc3MgV2l6YXJkCi0JCS8vIGZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldwotCQkvLyBJSmF2YUVsZW1lbnRbXSB7cm9vdC5nZXRKYXZhUHJvamVjdCgpfSApOwotCQlGaWx0ZXJlZFR5cGVzU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWx0ZXJlZFR5cGVzU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksZmFsc2UsIGdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLCBzY29wZSwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MpOwotCQlkaWFsb2cuc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0MpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQlTdHJpbmcgc3VwZXJjbGFzc0Z1bGxQYXRoID0gSjJFRVVJTWVzc2FnZXMuRU1QVFlfU1RSSU5HOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXN1cGVyY2xhc3NGdWxsUGF0aCA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQlzdXBlclRleHQuc2V0VGV4dChzdXBlcmNsYXNzRnVsbFBhdGgpOwotCQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNlbGVjdGlvbiB2YWxpZGF0b3IgZm9yIHRoZSBDb250YWluZXIKLQkgKiBTZWxlY3Rpb24gRGlhbG9nIFRoaXMgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBzdWJjbGFzc2VzLCBhcyBpdCBkb2VzCi0JICogc29tZSBiYXNpYyB2YWxpZGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGdldENvbnRhaW5lckRpYWxvZ1NlbGVjdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvblswXSAhPSBudWxsICYmICEoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSVByb2plY3QpKQotCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKEoyRUVVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTZWxlY3Rpb24gTGlzdG5lciBmb3IgdGhlIENvbnRhaW5lcgotCSAqIFNlbGVjdGlvbiBEaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMobW9kZWwuZ2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQkJCQkvLyBvbmx5IHNob3cgc291cmNlIGZvbGRlcnMKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VGb2xkZXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoc291cmNlRm9sZGVyc1tpXS5nZXRSZXNvdXJjZSgpIT0gbnVsbCAmJiBzb3VyY2VGb2xkZXJzW2ldLmdldFJlc291cmNlKCkuZXF1YWxzKGZvbGRlcikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIAotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlpZiAoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRJbml0aWFsSmF2YUVsZW1lbnQoc2VsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEphdmFQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBlbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRTZWxlY3RlZFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRJbml0aWFsSmF2YUVsZW1lbnQoc2VsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7IAotCQkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSAoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotCQkJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIHBhcmVudDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotCQkJCXJldHVybiAoKElUeXBlKSBlbGVtZW50KS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTZWxlY3RlZFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3R1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCS8vIHNlbGVjdGlvbjsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRJbml0aWFsSmF2YUVsZW1lbnQoc2VsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKQotCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gaW5zcGVjdCBhIHNlbGVjdGlvbiB0byBmaW5kIGEgSmF2YSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3Rpb24gdG8gYmUgaW5zcGVjdGVkCi0JICogQHJldHVybiBhIEphdmEgZWxlbWVudCB0byBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHNlbGVjdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBubyBKYXZhIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBnaXZlbgotCSAqICAgICAgICAgc2VsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRJbml0aWFsSmF2YUVsZW1lbnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSUphdmFFbGVtZW50IGplbGVtID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJSUFkYXB0YWJsZSBhZGFwdGFibGUgPSAoSUFkYXB0YWJsZSkgc2VsZWN0ZWRFbGVtZW50OwotCi0JCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJCWlmIChqZWxlbSA9PSBudWxsKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCkgewotCQkJCQkJd2hpbGUgKGplbGVtID09IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCQkJCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHJlc291cmNlLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChqZWxlbSA9PSBudWxsKSB7Ci0JCQkJCQkJamVsZW0gPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpOyAvLyBqYXZhIHByb2plY3QKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7Ci0JCQkJcGFydCA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdQYXJ0SW5wdXRQcm92aWRlcikgewotCQkJCU9iamVjdCBlbGVtID0gKChJVmlld1BhcnRJbnB1dFByb3ZpZGVyKSBwYXJ0KS5nZXRWaWV3UGFydElucHV0KCk7Ci0JCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSBlbGVtOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChqZWxlbSA9PSBudWxsIHx8IGplbGVtLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLQkJCXRyeSB7Ci0JCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0V29ya3NwYWNlUm9vdCgpKS5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQlpZiAocHJvamVjdHMubGVuZ3RoID09IDEpIHsKLQkJCQkJamVsZW0gPSBwcm9qZWN0c1swXTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUphdmFQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBqZWxlbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMoSVByb2plY3QgcHJvamVjdCkKLQl7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gaW4gbW9zdCBjYXNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvUGFja2FnZU5hbWVSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZWMxNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVSZXNvbHZlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQotCXB1YmxpYyBQYWNrYWdlTmFtZVJlc29sdmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKGZpbmFsIFN0cmluZyBjbGFzc0ZpbGUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2xhc3NGaWxlKTsKLQkJYnl0ZVtdIGNsYXNzYnVmID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07Ci0JCXRyeSB7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJaW5zdHJlYW0ucmVhZChjbGFzc2J1Zik7Ci0JCQlpbnN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYm9vbGVhbiBiYWRjbGFzc25hbWUgPSB0cnVlOwotCQlTdHJpbmcgY2xhc3NuYW1lID0gY2xhc3NGaWxlLnJlcGxhY2UoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0JCWludCBlbmRpOwotCQlpZiAoY2xhc3NuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJZW5kaSA9IGNsYXNzbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQllbHNlCi0JCQllbmRpID0gY2xhc3NuYW1lLmxlbmd0aCgpOwotCQlpbnQgaSA9IGNsYXNzbmFtZS5pbmRleE9mKCcuJyk7Ci0JCXdoaWxlIChpIDwgZW5kaSAmJiBiYWRjbGFzc25hbWUgPT0gdHJ1ZSkgewotCQkJYmFkY2xhc3NuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWRlZmluZUNsYXNzKGNsYXNzbmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZGkpLCBjbGFzc2J1ZiwgMCwgY2xhc3NidWYubGVuZ3RoKTsKLQkJCX0gY2F0Y2ggKGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cuaW5kZXhPZignICcpID4gMCkgewotCQkJCQliYWRjbGFzc25hbWUgPSB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJYmFkY2xhc3NuYW1lID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChiYWRjbGFzc25hbWUpIHsKLQkJCQlpID0gY2xhc3NuYW1lLmluZGV4T2YoJy4nLCBpICsgMSk7Ci0JCQkJaWYgKGkgPT0gLTEpCi0JCQkJCWkgPSBlbmRpOwotCQkJfQotCQl9Ci0JCWlmIChiYWRjbGFzc25hbWUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNsYXNzbmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZGkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlNmFmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlclRhcmdldENvbWJvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlCi0gKiBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUmVzb3VyY2VNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYXJnZXRDb21ib0hlbHBlciB7Ci0JcHJpdmF0ZSBMaXN0IHRhcmdldHM7Ci0JcHVibGljIFN0cmluZ1tdIGl0ZW1zOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRJZCA9ICJjb20uaWJtLmV0b29scy53ZWJzcGhlcmUuc2VydmVyVGFyZ2V0LmJhc2UudjUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRFeHByZXNzSWQgPSAiY29tLmlibS5ldG9vbHMud2Vic3BoZXJlLnNlcnZlclRhcmdldC5leHByZXNzLnY1MSI7IC8vJE5PTi1OTFMtMSQKLQotCVNlcnZlclRhcmdldENvbWJvSGVscGVyKExpc3QgdGFyZ2V0cywgU3RyaW5nW10gaXRlbXMpIHsKLQkJdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCXB1YmxpYyBJUnVudGltZSBnZXRTZWxlY3RlZFRhcmdldChpbnQgaXRlbUluZGV4KSB7Ci0JCXJldHVybiAoSVJ1bnRpbWUpIHRhcmdldHMuZ2V0KGl0ZW1JbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoSVJ1bnRpbWUgdGFyZ2V0KSB7Ci0JCXJldHVybiB0YXJnZXRzLmNvbnRhaW5zKHRhcmdldCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SW5kZXgoKSB7Ci0JCUlSdW50aW1lIHY1MVRhcmdldFNlcnZlciA9IG51bGw7Ci0JCWlmIChKMkVFUGx1Z2luLmlzRUpCU3VwcG9ydEF2YWlsYWJsZSgpKQotCQkJdjUxVGFyZ2V0U2VydmVyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UnVudGltZShkZWZhdWx0SWQpOwotCQllbHNlCi0JCQl2NTFUYXJnZXRTZXJ2ZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lKGRlZmF1bHRFeHByZXNzSWQpOwotCQlpZiAodjUxVGFyZ2V0U2VydmVyICE9IG51bGwgJiYgdGFyZ2V0cy5jb250YWlucyh2NTFUYXJnZXRTZXJ2ZXIpKQotCQkJcmV0dXJuIHRhcmdldHMuaW5kZXhPZih2NTFUYXJnZXRTZXJ2ZXIpICsgMTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VydmVyVGFyZ2V0SW5kZXhGcm9tSXRlbXMoSVJ1bnRpbWUgc2VydmVyVGFyZ2V0KSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBzZXJ2ZXJUYXJnZXRMYWJlbCA9IHNlcnZlclRhcmdldC5nZXROYW1lKCkgKyAiICgiICsgc2VydmVyVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbGFiZWwgPSBpdGVtc1tpXTsKLQkJCQlpZiAobGFiZWwuZXF1YWxzKHNlcnZlclRhcmdldExhYmVsKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFZhbGlkVGFyZ2V0cygpIHsKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRVSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRVSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYzMGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0VUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDE3LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhcmdldFVJSGVscGVyIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNlcnZlclRhcmdldFVJSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlbGVjdGVkU2VydmVyVGFyZ2V0U3RyaW5nKENvbWJvIHNlcnZlclRhcmdldENvbWJvKSB7Ci0JCWlmIChzZXJ2ZXJUYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKQotCQkJcmV0dXJuIHNlcnZlclRhcmdldENvbWJvLmdldEl0ZW0oc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRTZWxlY3RlZFNlcnZlclRhcmdldFN0cmluZ0luZGV4KENvbWJvIHNlcnZlclRhcmdldENvbWJvKSB7Ci0JCXJldHVybiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXRGb3JQcm9qZWN0KFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0vLwkJLy9TZXJ2ZXJUYXJnZXRIZWxwZXIuY2xlYW5VcE5vblNlcnZlclRhcmdldENsYXNzcGF0aChwcm9qZWN0KTsKLS8vCQlzZXRTZXJ2ZXJUYXJnZXQoc2hlbGwsIHByb2plY3QsIHJ1bnRpbWUsIG51bGwpOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gbW9kdWxlUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0TW9kdWxlU2VydmVyVGFyZ2V0SWZOZWNlc3NhcnkoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgbW9kdWxlUHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVBUkoyRUVMZXZlbChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JLy8JCUVBUk5hdHVyZVJ1bnRpbWUgbmF0dXJlID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotCS8vCQlTdHJpbmcgajJlZUxldmVsID0gbnVsbDsKLQkvLwkJaW50IG5hdHVyZUlEID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0JLy8JCXN3aXRjaCAobmF0dXJlSUQpIHsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWRlZmF1bHQgOgotCS8vCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQ7Ci0JLy8JCQkJYnJlYWs7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIGoyZWVMZXZlbDsKLQkvLwl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0KFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLS8vCQl0cnkgewotLy8JCQlTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLnNldFJ1bnRpbWVUYXJnZXQocnVudGltZSwgbW9uaXRvcik7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vCQl9Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFNlcnZlclRhcmdldENvbWJvSGVscGVyIGdldFZhbGlkU2VydmVyVGFyZ2V0Q29tYm9JdGVtcyhTdHJpbmcgajJlZVR5cGUsIFN0cmluZyBzZWxlY3RlZFZlcnNpb24pIHsKLQkJSVJ1bnRpbWVbXSB2YWxpZFNlcnZlclRhcmdldHMgPSBTZXJ2ZXJVdGlsLmdldFJ1bnRpbWVzKGoyZWVUeXBlLCBzZWxlY3RlZFZlcnNpb24pOwotCQlTdHJpbmdbXSBzZXJ2ZXJUYXJnZXRMaXN0ID0gbnVsbDsKLQkJaWYgKHZhbGlkU2VydmVyVGFyZ2V0cy5sZW5ndGg+MCkgewotCQkJaW50IHNlcnZlclRhcmdldExpc3RTaXplID0gdmFsaWRTZXJ2ZXJUYXJnZXRzLmxlbmd0aDsKLQkJCXNlcnZlclRhcmdldExpc3QgPSBuZXcgU3RyaW5nW3NlcnZlclRhcmdldExpc3RTaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRTZXJ2ZXJUYXJnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IHZhbGlkU2VydmVyVGFyZ2V0c1tpXTsKLQkJCQlzZXJ2ZXJUYXJnZXRMaXN0W2ldID0gcnVudGltZS5nZXROYW1lKCkgKyAiICgiICsgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTZXJ2ZXJUYXJnZXRDb21ib0hlbHBlcihBcnJheXMuYXNMaXN0KHZhbGlkU2VydmVyVGFyZ2V0cyksIHNlcnZlclRhcmdldExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkVhclZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gRUFSVmFsaWRhdGlvbkhlbHBlci5jcmVhdGVWYWxpZGF0aW9uUnVubmFibGUocHJvamVjdCk7Ci0JCQlydW5uYWJsZS5ydW4obnVsbCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGl0ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTg4MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nQXJyYXlMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FycmF5TGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCSAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkgICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVySW1hZ2U7ICAgICAgIAotCQkgICAgfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlTdHJpbmdbXSBhcnJheSA9IChTdHJpbmdbXSkgZWxlbWVudDsKLQkJCXJldHVybiBhcnJheVtjb2x1bW5JbmRleF07Ci0JCX0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFiZWxQcm92aWRlckltYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGVsZW1lbnQ7Ci0JCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiBhcnJheVswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQWRkU3RyaW5nQXJyYXlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgd2luZG93VGl0bGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0RmllbGQ7Ci0JCXByb3RlY3RlZCBUZXh0W10gdGV4dHM7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBzdHJpbmdBcnJheTsKLQkJLyoqCi0JCSAqIENNUEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgQWRkU3RyaW5nQXJyYXlEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB3aW5kb3dUaXRsZSwgU3RyaW5nW10gbGFiZWxzRm9yVGV4dEZpZWxkKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQl0aGlzLndpbmRvd1RpdGxlID0gd2luZG93VGl0bGU7Ci0JCQl0aGlzLmxhYmVsc0ZvclRleHRGaWVsZCA9IGxhYmVsc0ZvclRleHRGaWVsZDsKLQkJfQotCQkvKioKLQkJICogQ01QRmllbGREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHdpbmRvd1RpdGxlKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkJaW50IG4gPSBsYWJlbHNGb3JUZXh0RmllbGQubGVuZ3RoOwotCQkJdGV4dHMgPSBuZXcgVGV4dFtuXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dChsYWJlbHNGb3JUZXh0RmllbGRbaV0pOwotCQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkJdGV4dHNbaV0gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCQkJdGV4dHNbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCX0KLQotCQkJLy8gc2V0IGZvY3VzCi0JCQl0ZXh0c1swXS5zZXRGb2N1cygpOwotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQl0ZXh0c1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlT0tCdXR0b24oKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJCXN0cmluZ0FycmF5ID0gY2FsbGJhY2sucmV0cmlldmVSZXN1bHRTdHJpbmdzKHRleHRzKTsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KCkgewotCQkJcmV0dXJuIHN0cmluZ0FycmF5OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXVwZGF0ZU9LQnV0dG9uKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVPS0J1dHRvbigpIHsKLQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGNhbGxiYWNrLnZhbGlkYXRlKHRleHRzKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIEVkaXRTdHJpbmdBcnJheURpYWxvZyBleHRlbmRzIEFkZFN0cmluZ0FycmF5RGlhbG9nIHsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlc0ZvclRleHRGaWVsZDsKLQkJLyoqCi0JCSAqIENNUEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgRWRpdFN0cmluZ0FycmF5RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvclRleHRGaWVsZCwgU3RyaW5nW10gdmFsdWVzRm9yVGV4dEZpZWxkKSB7Ci0JCQlzdXBlcihzaGVsbCwgd2luZG93VGl0bGUsIGxhYmVsc0ZvclRleHRGaWVsZCk7Ci0JCQl0aGlzLnZhbHVlc0ZvclRleHRGaWVsZCA9IHZhbHVlc0ZvclRleHRGaWVsZDsKLQkJfQotCQkvKioKLQkJICogQ01QRmllbGREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCQlpbnQgbiA9IHZhbHVlc0ZvclRleHRGaWVsZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCXRleHRzW2ldLnNldFRleHQodmFsdWVzRm9yVGV4dEZpZWxkW2ldKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsYmFjayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQWRkL0VkaXQtU3RyaW5nQXJyYXlEaWFsb2cgY2xhc3Nlcy4gCi0JICovCi0JcHVibGljIGludGVyZmFjZSBTdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrIHsKLQkJCi0JCS8qKgotCQkgKiBWYWxpZGF0ZXMgdGhlIHRleHQgZmllbGRzLiAKLQkJICogPHA+VXNlZCB0byBkZWNpZGUgd2hlYXRoZXIgdG8gZW5hYmxlIHRoZSBPSyBidXR0b24gb2YgdGhlIGRpYWxvZy4gCi0JCSAqIElmIHRoZSBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGUgT0sgYnV0dG9uIGlzIGVuYWJsZWQsIAotCQkgKiBvdGhlcndpc2UgdGhlIE9LIGJ1dHRvbiBpcyBkaXNhYmxlZC48L3A+IAotCQkgKiAKLQkJICogQHBhcmFtIHJlZmVyZW5jZSB0byB0aGUgdGV4dCBmaWVsZHMgaW4gdGhlIGRpYWxvZwotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWVzIGluIHRoZSB0ZXh0IGZpZWxkcyBhcmUgCi0JCSAqICAgICAgICAgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoVGV4dFtdIHRleHRzKTsKLQkJCi0JCS8qKgotCQkgKiBSZXRyaWV2ZXMgdGhlIHN0cmluZ3MgZnJvbSB0aGUgdGV4dCBmaWVsZHMgb2YgdGhlIGRpYWxvZy4gCi0JCSAqIDxwPkltcGxlbWVudGVycyBvZiB0aGUgY2FsbGJhY2sgY2FuIHVzZSB0aGVzZSBtZXRob2QgdG8gZG8gc29tZSAKLQkJICogcHJlcHJvY2Vzc2luZyAobGlrZSB0cmltbWluZykgb2YgdGhlIGRhdGEgaW4gdGhlIHRleHQgZmllbGRzIGJlZm9yZSAKLQkJICogdXNpbmcgaXQuIFRoZSByZXR1cm5lZCB2YWx1ZXMgd2lsbCBiZSB0aGUgYWN0dWFsIGRhdGEgdGhhdCB3aWxsIGJlIAotCQkgKiBwdXQgaW4gdGhlIHRhYmxlIHZpZXdlci48L3A+IAotCQkgKiAgCi0JCSAqIEBwYXJhbSB0ZXh0cyByZWZlcmVuY2UgdG8gdGhlIHRleHQgZmllbGRzIGluIHRoZSBkaWFsb2cKLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIHZhbHVlcyByZXRyZWl2ZWQgZnJvbSB0aGUgdGV4dCBmaWVsZHMKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoVGV4dFtdIHRleHRzKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIERlZmF1bHQgYWRhcHRlciB3aXRoIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIHRoZSAKLQkgKiA8Y29kZT5TdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrPC9jb2RlPiBpbnRlcmZhY2UuIAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrQWRhcHRlciBpbXBsZW1lbnRzIFN0cmluZ0FycmF5RGlhbG9nQ2FsbGJhY2sgewotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPnRydWU8L2NvZGU+LiAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHRbXSB0ZXh0cykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogSnVzdCByZXRyZWl2ZXMgdGhlIHVubW9kaWZpZWQgdmFsdWVzIG9mIHRoZSB0ZXh0IGZpZWxkcyBhcyBhIAotCQkgKiBzdHJpbmcgYXJyYXkuIAotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIHJldHJpZXZlUmVzdWx0U3RyaW5ncyhUZXh0W10gdGV4dHMpIHsKLQkJCWludCBuID0gdGV4dHMubGVuZ3RoOwotCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tuXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJcmVzdWx0W2ldID0gdGV4dHNbaV0uZ2V0VGV4dCgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmaWVsZExhYmVsczsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgSW1hZ2UgbGFiZWxQcm92aWRlckltYWdlOwotCXByaXZhdGUgU3RyaW5nQXJyYXlEaWFsb2dDYWxsYmFjayBjYWxsYmFjazsKLQotCXB1YmxpYyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBhZGRCdXR0b25MYWJlbCwgU3RyaW5nIHJlbW92ZUJ1dHRvbkxhYmVsLCAKLQkJCVN0cmluZ1tdIGxhYmVsc0ZvclRleHQsIEltYWdlIGxhYmVsUHJvdmlkZXJJbWFnZSwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQl0aGlzKHBhcmVudCwgdGl0bGUsIGFkZEJ1dHRvbkxhYmVsLCBudWxsLCByZW1vdmVCdXR0b25MYWJlbCwgbGFiZWxzRm9yVGV4dCwgbGFiZWxQcm92aWRlckltYWdlLCBtb2RlbCwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgYWRkQnV0dG9uTGFiZWwsIFN0cmluZyBlZGl0QnV0dG9uTGFiZWwsIFN0cmluZyByZW1vdmVCdXR0b25MYWJlbCwgCi0JCQlTdHJpbmdbXSBsYWJlbHNGb3JUZXh0LCBJbWFnZSBsYWJlbFByb3ZpZGVySW1hZ2UsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcyhwYXJlbnQsIHRpdGxlLCB0aXRsZSwgYWRkQnV0dG9uTGFiZWwsIGVkaXRCdXR0b25MYWJlbCwgcmVtb3ZlQnV0dG9uTGFiZWwsIGxhYmVsc0ZvclRleHQsIGxhYmVsc0ZvclRleHQsIGxhYmVsUHJvdmlkZXJJbWFnZSwgbW9kZWwsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBjb21wb25lbnRMYWJlbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBTdHJpbmcgYWRkQnV0dG9uTGFiZWwsIFN0cmluZyBlZGl0QnV0dG9uTGFiZWwsIFN0cmluZyByZW1vdmVCdXR0b25MYWJlbCwgCi0JCQlTdHJpbmdbXSBjb2x1bW5UaXRsZXMsIFN0cmluZ1tdIGZpZWxkTGFiZWxzLCBJbWFnZSBsYWJlbFByb3ZpZGVySW1hZ2UsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQkJdGhpcy5maWVsZExhYmVscyA9IGZpZWxkTGFiZWxzOwotCQl0aGlzLmxhYmVsUHJvdmlkZXJJbWFnZSA9IGxhYmVsUHJvdmlkZXJJbWFnZTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRoaXMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgdGl0bGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0JCXRpdGxlTGFiZWwuc2V0VGV4dChjb21wb25lbnRMYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFN0cmluZ0FycmF5TGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFN0cmluZ0FycmF5TGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCQotCQlmaW5hbCBDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OVUxMKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbXBvLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Db21wby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0VGV4dChhZGRCdXR0b25MYWJlbCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlpZiAoZWRpdEJ1dHRvbkxhYmVsICE9IG51bGwpIHsKLQkJCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0JCQllZGl0QnV0dG9uLnNldFRleHQoZWRpdEJ1dHRvbkxhYmVsKTsKLQkJCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQloYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vRG8gbm90aGluZwotCQkJCX0KLQkJCX0pOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQocmVtb3ZlQnV0dG9uTGFiZWwpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGVkaXRCdXR0b24gIT0gbnVsbCkgewotCQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWlmIChjb2x1bW5UaXRsZXMubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGUgdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotICAgICAgICAgICAgICAgICAgICBQb2ludCBidXR0b25BcmVhID0gYnV0dG9uQ29tcG8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemUgPSB2aWV3ZXIuZ2V0VGFibGUoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCkgLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCAqIDI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVXaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFNpemUueCA+IGFyZWEud2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lV2lkdGggPSBzZXRDb2x1bW50V2lkdGgod2lkdGgsIGNvbHVtbnMsIGNvbnN1bWVXaWR0aCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoIC0gYnV0dG9uQXJlYS54IC0gY29sdW1ucy5sZW5ndGggKiAyLCBhcmVhLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoIC0gYnV0dG9uQXJlYS54IC0gY29sdW1ucy5sZW5ndGggKiAyLCBhcmVhLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCBjb25zdW1lV2lkdGgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgc2V0Q29sdW1udFdpZHRoKGludCB3aWR0aCwgVGFibGVDb2x1bW5bXSBjb2x1bW5zLCBpbnQgY29uc3VtZVdpZHRoLCBpbnQgaSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGNvbHVtbnMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAvIGNvbHVtbnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVXaWR0aCArPSBjb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoIC0gY29uc3VtZVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3VtZVdpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIAotCQljYWxsYmFjayA9IG5ldyBTdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZCgpIHsKLQkJQWRkU3RyaW5nQXJyYXlEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFN0cmluZ0FycmF5RGlhbG9nKGdldFNoZWxsKCksIGRpYWxvZ1RpdGxlLCBmaWVsZExhYmVscyk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gZGlhbG9nLmdldFN0cmluZ0FycmF5KCk7Ci0JCWFkZFN0cmluZ0FycmF5KHN0cmluZ0FycmF5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCkgewotCQlJU2VsZWN0aW9uIHMgPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgczsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQkJCi0JCU9iamVjdCBzZWxlY3RlZE9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJU3RyaW5nW10gdmFsdWVzRm9yVGV4dCA9IChTdHJpbmdbXSkgc2VsZWN0ZWRPYmo7Ci0JCQotCQlFZGl0U3RyaW5nQXJyYXlEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRTdHJpbmdBcnJheURpYWxvZyhnZXRTaGVsbCgpLCBkaWFsb2dUaXRsZSwgZmllbGRMYWJlbHMsIHZhbHVlc0ZvclRleHQpOwotCQlkaWFsb2cub3BlbigpOwotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IGRpYWxvZy5nZXRTdHJpbmdBcnJheSgpOwotCQllZGl0U3RyaW5nQXJyYXkodmFsdWVzRm9yVGV4dCwgc3RyaW5nQXJyYXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlMaXN0IHNlbGVjdGVkT2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJcmVtb3ZlU3RyaW5nQXJyYXlzKHNlbGVjdGVkT2JqKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkU3RyaW5nQXJyYXkoU3RyaW5nW10gc3RyaW5nQXJyYXkpIHsKLQkJaWYgKHN0cmluZ0FycmF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpCi0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbHVlTGlzdC5hZGQoc3RyaW5nQXJyYXkpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVkaXRTdHJpbmdBcnJheShTdHJpbmdbXSBvbGRTdHJpbmdBcnJheSwgU3RyaW5nW10gbmV3U3RyaW5nQXJyYXkpIHsKLQkJaWYgKG5ld1N0cmluZ0FycmF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKQotCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaW50IGluZGV4ID0gdmFsdWVMaXN0LmluZGV4T2Yob2xkU3RyaW5nQXJyYXkpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXZhbHVlTGlzdC5hZGQobmV3U3RyaW5nQXJyYXkpOwotCQl9IGVsc2UgewotCQkJdmFsdWVMaXN0LnNldChpbmRleCwgbmV3U3RyaW5nQXJyYXkpOwotCQl9Ci0JCQotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmluZ0FycmF5KE9iamVjdCBzZWxlY3RlZFN0cmluZ0FycmF5KSB7Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQl2YWx1ZUxpc3QucmVtb3ZlKHNlbGVjdGVkU3RyaW5nQXJyYXkpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJpbmdBcnJheXMoQ29sbGVjdGlvbiBzZWxlY3RlZFN0cmluZ0FycmF5cykgewotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJdmFsdWVMaXN0LnJlbW92ZUFsbChzZWxlY3RlZFN0cmluZ0FycmF5cyk7Ci0JCXNldElucHV0KHZhbHVlTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoTGlzdCBpbnB1dCkgewotCQl2aWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkvLyBDcmVhdGUgYSBuZXcgbGlzdCB0byB0cmlnZ2VyIHByb3BlcnR5IGNoYW5nZQotCQlMaXN0IG5ld0lucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdJbnB1dC5hZGRBbGwoaW5wdXQpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld0lucHV0KTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIEJ1dHRvbiBnZXRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBhZGRCdXR0b247Ci0JfQotCi0JcHVibGljIEJ1dHRvbiBnZXRFZGl0QnV0dG9uKCkgewotCQlyZXR1cm4gZWRpdEJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIHJlbW92ZUJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGNhbGxiYWNrIGZvciBjdXN0b21pemluZyB0aGUgcHJlcHJvY2Vzc2luZyBvZiB0aGUgdXNlciBpbnB1dC4gCi0JICogCi0JICogQHBhcmFtIGNhbGxiYWNrIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBpbnRlcmZhY2UuIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGxiYWNrKFN0cmluZ0FycmF5RGlhbG9nQ2FsbGJhY2sgY2FsbGJhY2spIHsKLQkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvVGFibGVPYmplY3RzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1RhYmxlT2JqZWN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgwZDBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvVGFibGVPYmplY3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgzLzE5LzIwMDEgNToxMDoxNCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVPYmplY3RzIHsKLQlwdWJsaWMgTGlzdCB0YWJsZU9iamVjdHNMaXN0OwotCi0JLyoqCi0JICogRUpCcyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUYWJsZU9iamVjdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRhYmxlT2JqZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVPYmplY3RzKCkgewotCQlyZXR1cm4gdGFibGVPYmplY3RzTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGlzdCgpIHsKLQkJaWYgKHRhYmxlT2JqZWN0c0xpc3QgPT0gbnVsbCkKLQkJCXRhYmxlT2JqZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWYwMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tRGlyOwotCXByb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbVppcDsKLQotCXByaXZhdGUgTGlzdCBkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZmlsZVN5c3RlbVRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0LmltcG9ydEZpbGVTeXN0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpc3QgZmlsZU5hbWVzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0RmlsZVN5c3RlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBmaWxlTmFtZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0NMQVNTX1dJWkFSRF9QMSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlDb21wb3NpdGUgYUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlhQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYUNvbXBvc2l0ZS5zZXRTaXplKGFDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCWFDb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJY3JlYXRlSW1wb3J0VHlwZUdyb3VwKGFDb21wb3NpdGUpOwotCQlzZXRDb250cm9sKGFDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydFR5cGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBpbXBvcnRUeXBlR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWltcG9ydFR5cGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaW1wb3J0VHlwZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkvL2ltcG9ydFR5cGVHcm91cC5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkRXhwb3J0UGFnZS5vcHRpb25zIikpOwotCQkvLyAvLyROT04tTkxTLTEkCi0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJV2l6YXJkIHdpeiA9IGdldFdpemFyZCgpOwotCQkJCWlmICgoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikucGFnZTEgIT0gbnVsbCkgewotCQkJCQkoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikucGFnZTEuYmxhbmtQYWdlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpbXBvcnRGcm9tRGlyID0gbmV3IEJ1dHRvbihpbXBvcnRUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWltcG9ydEZyb21EaXIuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ2xhc3Nlc0ltcG9ydC5mcm9tRGlyIikpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydEZyb21EaXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWltcG9ydEZyb21aaXAgPSBuZXcgQnV0dG9uKGltcG9ydFR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaW1wb3J0RnJvbVppcC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDbGFzc2VzSW1wb3J0LmZyb21aaXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0RnJvbVppcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJSVdpemFyZCB3aXogPSBnZXRXaXphcmQoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKLQkJaWYgKCgoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgd2l6KS5maWxlTmFtZXMgIT0gbnVsbCkKLQkJCWZpbGVOYW1lID0gKChDbGFzc2VzSW1wb3J0V2l6YXJkKSB3aXopLmZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpbXBvcnRGcm9tRGlyLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlpbXBvcnRGcm9tWmlwLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWltcG9ydEZyb21EaXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaW1wb3J0RnJvbVppcC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRJbXBvcnRGcm9tRGlyKCkgewotCQlpZiAoaW1wb3J0RnJvbURpciAhPSBudWxsKQotCQkJcmV0dXJuIGltcG9ydEZyb21EaXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIChmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRQYWdlMS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2NWRiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRQYWdlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbGVTeXN0ZW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkUmVzb3VyY2VJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLklFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBQYWdlIDEgb2YgdGhlIGJhc2UgcmVzb3VyY2UgaW1wb3J0LWZyb20tZmlsZS1zeXN0ZW0gV2l6YXJkCi0gKi8KLS8qIHBhY2thZ2UgKi8KLWNsYXNzIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMSBleHRlbmRzIFdpemFyZFJlc291cmNlSW1wb3J0UGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCS8vIHdpZGdldHMKLQlwcm90ZWN0ZWQgQ29tYm8gc291cmNlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZU9ubHlTZWxlY3RlZEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNvdXJjZUJyb3dzZUJ1dHRvbjsKLQkvL3Byb3RlY3RlZCBCdXR0b24gc2VsZWN0VHlwZXNCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQkvL0EgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgdXNlciBoYXMgdHlwZWQgYW55dGhpbmcKLQlwcml2YXRlIGJvb2xlYW4gZW50cnlDaGFuZ2VkID0gZmFsc2U7Ci0KLQkvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX1NPVVJDRV9OQU1FU19JRCA9ICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9TT1VSQ0VfTkFNRVNfSUQiOyAvLyROT04tTkxTLTEkCi0JLy8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUT1JFX09WRVJXUklURV9FWElTVElOR19SRVNPVVJDRVNfSUQgPQotCS8vICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCA9Ci0JLy8gIldpemFyZEZpbGVTeXN0ZW1SZXNvdXJjZUltcG9ydFBhZ2UxLlNUT1JFX0NSRUFURV9DT05UQUlORVJfU1RSVUNUVVJFX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9UWVBFU19USVRMRSA9ICJEYXRhVHJhbnNmZXIuc2VsZWN0VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9BTExfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLnNlbGVjdEFsbCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0VMRUNUX0FMTF9USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZGVzZWxlY3RBbGwiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU09VUkNFX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5zZWxlY3RTb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9FTVBUWV9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuc291cmNlRW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUGF0aCBpbXBvcnRlZENsYXNzZXNQYXRoOwotCS8vcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tRGlyOwotCS8vcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tWmlwOwotCi0KLQlwcml2YXRlIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlckNhY2hlOwotCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBjdXJyZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9JTVBPUlRfTUFTSyA9ICIqLmphcjsqLnppcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IG51bGw7Ci0KLQlib29sZWFuIGNyZWF0ZUZ1bGxTdHJ1Y3R1cmUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlQmFzZURpck5hbWUgPSBudWxsOwotCi0JLy9wcml2YXRlIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHRlc3QgPSBudWxsOwotCi0JLy9wcml2YXRlIENvbXBvc2l0ZSBkdW1teVBhcmVudCA9IG51bGw7Ci0KLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9XSURUSCA9IDQwMDsKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQgPSAxNTA7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlRGlyU3RydWMgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICovCi0JcHJvdGVjdGVkIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMShTdHJpbmcgbmFtZSwgSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gYVdvcmtiZW5jaAotCSAqICAgICAgICAgICAgSVdvcmtiZW5jaAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICovCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRQYWdlMShJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVBhdGggaW1wb3J0ZWRDbGFzc2VzUGF0aCwgTGlzdCBmaWxlTmFtZXMpIHsKLQkJdGhpcygiZmlsZVN5c3RlbUltcG9ydFBhZ2UxIiwgYVdvcmtiZW5jaCwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmZpbGVTeXN0ZW1UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5pbXBvcnRGaWxlU3lzdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2JhbiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmltcG9ydGVkQ2xhc3Nlc1BhdGggPSBpbXBvcnRlZENsYXNzZXNQYXRoOwotCQlpZiAoZmlsZU5hbWVzICE9IG51bGwgJiYgZmlsZU5hbWVzLnNpemUoKSAhPSAwKSB7Ci0JCQlkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IGZpbGVOYW1lczsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGJsYW5rUGFnZSgpIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uR3JvdXAgIT0gbnVsbCkKLQkJCXRoaXMuc2VsZWN0aW9uR3JvdXAuc2V0Um9vdChudWxsKTsKLQkJaWYgKHNvdXJjZU5hbWVGaWVsZCAhPSBudWxsKQotCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY3JlYXRlcyBhIHN0YW5kYXJkIHB1c2gKLQkgKiBidXR0b24sIHJlZ2lzdGVycyBmb3Igc2VsZWN0aW9uIGV2ZW50cyBpbmNsdWRpbmcgYnV0dG9uIHByZXNzZXMgYW5kIHJlZ2lzdGVycyBkZWZhdWx0IGJ1dHRvbnMKLQkgKiB3aXRoIGl0cyBzaGVsbC4gVGhlIGJ1dHRvbiBpZCBpcyBzdG9yZWQgYXMgdGhlIGJ1dHRvbnMgY2xpZW50IGRhdGEuIE5vdGUgdGhhdCB0aGUgcGFyZW50J3MKLQkgKiBsYXlvdXQgaXMgYXNzdW1lZCB0byBiZSBhIEdyaWRMYXlvdXQgYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIGxheW91dCBpcyBpbmNyZW1lbnRlZC4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgYnV0dG9uIChzZWUgPGNvZGU+SURpYWxvZ0NvbnN0YW50cy4qX0lEPC9jb2RlPiBjb25zdGFudHMgZm9yCi0JICogICAgICAgICAgICBzdGFuZGFyZCBkaWFsb2cgYnV0dG9uIGlkcykKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBmcm9tIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gZGVmYXVsdEJ1dHRvbgotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1dHRvbiBpcyB0byBiZSB0aGUgZGVmYXVsdCBidXR0b24sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJLy8gaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYnV0dG9uIGJhcgotCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucysrOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCi0JCUdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7Ci0KLQkJYnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoaWQpKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCWlmIChkZWZhdWx0QnV0dG9uKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0JCQl9Ci0JCQlidXR0b24uc2V0Rm9jdXMoKTsKLQkJfQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGJ1dHRvbnMgZm9yIHNlbGVjdGluZyBzcGVjaWZpYyB0eXBlcyBvciBzZWxlY3RpbmcgYWxsIG9yIG5vbmUgb2YgdGhlIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHRvcCBsZXZlbCBncm91cAotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyB0eXBlcyBlZGl0IGJ1dHRvbgotCQkvLwkJc2VsZWN0VHlwZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLlNFTEVDVF9UWVBFU19JRCwKLQkJLy8gU0VMRUNUX1RZUEVTX1RJVExFLCBmYWxzZSk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCS8vCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8JCQkJaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpOwotCQkJLy8JCQl9Ci0JCX07Ci0JCS8vCQlzZWxlY3RUeXBlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgSURpYWxvZ0NvbnN0YW50cy5TRUxFQ1RfQUxMX0lELCBTRUxFQ1RfQUxMX1RJVExFLCBmYWxzZSk7Ci0KLQkJbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRBbGxTZWxlY3Rpb25zKHRydWUpOwotCQkJfQotCQl9OwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgSURpYWxvZ0NvbnN0YW50cy5ERVNFTEVDVF9BTExfSUQsIERFU0VMRUNUX0FMTF9USVRMRSwgZmFsc2UpOwotCi0JCWxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0QWxsU2VsZWN0aW9ucyhmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL3N1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9DTEFTU19XSVpBUkRfUDIpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJY29tcG9zaXRlLnNldFNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvL2R1bW15UGFyZW50ID0gY29tcG9zaXRlOwotCi0JCWNyZWF0ZVNvdXJjZUdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJLy9jcmVhdGVTcGFjZXIoY29tcG9zaXRlKTsKLQotCQkvL2NyZWF0ZVBsYWluTGFiZWwoY29tcG9zaXRlLAotCQkvLyBXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldpemFyZEltcG9ydFBhZ2UuZGVzdGluYXRpb25MYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkvL2NyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQotCQljcmVhdGVPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCXNldFBhZ2VDb21wbGV0ZShkZXRlcm1pbmVQYWdlQ29tcGxldGlvbigpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdmFsaWRhdGVTb3VyY2VHcm91cCgpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksCi0JCS8vIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5GSUxFX1NZU1RFTV9JTVBPUlRfV0laQVJEX1BBR0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9wdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBvcHRpb25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZU9wdGlvbnNHcm91cEJ1dHRvbnMob3B0aW9uc0dyb3VwKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW1wb3J0IG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9wdGlvbnNHcm91cEJ1dHRvbnMoQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCi0JCS8vIG92ZXJ3cml0ZS4uLiBjaGVja2JveAotCQlvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5vdmVyd3JpdGVFeGlzdGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2V0SW1wb3J0RnJvbURpcigpIHsKLQkJQ2xhc3Nlc0ltcG9ydFdpemFyZCBjaXcgPSAoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXJldHVybiBjaXcubWFpblBhZ2UuaXNTZXRJbXBvcnRGcm9tRGlyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc0ZpbGVEaXJlY3RvcnkoU3RyaW5nIHMpIHsKLQkJaW50IGluZGV4ID0gcy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlyZXR1cm4gcy5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGdyb3VwIGZvciBjcmVhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSb290RGlyZWN0b3J5R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc291cmNlQ29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc291cmNlQ29udGFpbmVyR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNvdXJjZUNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCW5ldyBMYWJlbChzb3VyY2VDb250YWluZXJHcm91cCwgU1dULk5PTkUpLnNldFRleHQoZ2V0U291cmNlTGFiZWwoKSk7Ci0KLQkJLy8gc291cmNlIG5hbWUgZW50cnkgZmllbGQKLQkJc291cmNlTmFtZUZpZWxkID0gbmV3IENvbWJvKHNvdXJjZUNvbnRhaW5lckdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlzb3VyY2VOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlzZXRTb3VyY2VOYW1lRmllbGRGb3JEcmFnQW5kRHJvcCgpOwotCi0JCXNvdXJjZU5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlRnJvbVNvdXJjZUZpZWxkKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJc291cmNlTmFtZUZpZWxkLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIEtleUxpc3RlbmVyLmtleVByZXNzZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy9JZiB0aGVyZSBoYXMgYmVlbiBhIGtleSBwcmVzc2VkIHRoZW4gbWFyayBhcyBkaXJ0eQotCQkJCWVudHJ5Q2hhbmdlZCA9IHRydWU7Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgS2V5TGlzdGVuZXIua2V5UmVsZWFzZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIEZvY3VzTGlzdGVuZXIuZm9jdXNHYWluZWQoRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy9EbyBub3RoaW5nIHdoZW4gZ2V0dGluZyBmb2N1cwotCQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgRm9jdXNMaXN0ZW5lci5mb2N1c0xvc3QoRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vQ2xlYXIgdGhlIGZsYWcgdG8gcHJldmVudCBjb25zdGFudCB1cGRhdGUKLQkJCQlpZiAoZW50cnlDaGFuZ2VkKSB7Ci0KLQkJCQkJZW50cnlDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCXVwZGF0ZUZyb21Tb3VyY2VGaWVsZCgpOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQotCQkvLyBzb3VyY2UgYnJvd3NlIGJ1dHRvbgotCQlzb3VyY2VCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHNvdXJjZUNvbnRhaW5lckdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNvdXJjZUJyb3dzZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuYnJvd3NlIikpOyAvLyROT04tTkxTLTEkCi0JCXNvdXJjZUJyb3dzZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJc291cmNlQnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQlzb3VyY2VCcm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VOYW1lRmllbGRGb3JEcmFnQW5kRHJvcCgpIHsKLQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIChkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkpOwotCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQoZmlsZU5hbWUpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKGYuaXNGaWxlKCkpIHsKLQkJCQlpZiAoSW1wb3J0VXRpbC5nZXRFeHRlbnNpb24oZikuZXF1YWxzKCJ6aXAiKSB8fCBJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoImphciIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvL2ltcG9ydEZyb21aaXAuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkvL2ltcG9ydEZyb21EaXIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQl9IGVsc2UgaWYgKEltcG9ydFV0aWwuZ2V0RXh0ZW5zaW9uKGYpLmVxdWFscygiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KGdldENsYXNzRmlsZURpcmVjdG9yeShmaWxlTmFtZSkpOwotCi0JCQkJCS8vZ2V0IGNvbS5pYm0uYWJjLkNsYXNzTmFtZQotCQkJCQlQYWNrYWdlTmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlciA9IG5ldyBQYWNrYWdlTmFtZVJlc29sdmVyKCk7Ci0JCQkJCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBuYW1lUmVzb2x2ZXIuZ2V0Q2xhc3NOYW1lKGZpbGVOYW1lKTsKLQkJCQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0KLQkJCQkJCS8vZ2V0IGNvbQotCQkJCQkJaW50IGluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmluZGV4T2YoJy4nKTsKLQkJCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQkJCVN0cmluZyB0ZXh0VG9TZXQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgMSArIGZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KHRleHRUb1NldCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGJhc2VEaXIgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCQkJLy9nZXQgY29tLmlibS5hYmMKLQkJCQkJCWluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCS8vZ2V0IGNvbS9pYm0vYWJjCi0JCQkJCQlwYWNrYWdlRGlyU3RydWMgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJCQkJLy9nZXQgQzpcY29tCi0JCQkJCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoYmFzZURpcik7Ci0JCQkJCQkvL2lmIHBhY2thZ2VEaXJTdHVjIGV4aXN0cyB0aGVuIHNldCB0aGUgc291cmNlRGlyIHRvIGNvbSwgZWxzZQotCQkJCQkJLy9zZXQgdGhlIGRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgY2xhc3MKLQkJCQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKHBhY2thZ2VEaXJTdHJ1YykgIT0gLTEpIHsKLQkJCQkJCQlpbnQgYmFzZURpckxlbmd0aCA9IGJhc2VEaXIubGVuZ3RoKCk7Ci0JCQkJCQkJU3RyaW5nIHRleHRUb1NldCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIGJhc2VEaXJMZW5ndGgpOwotCQkJCQkJCWluZGV4ID0gcGFja2FnZU5hbWUuaW5kZXhPZignLicpOwotCQkJCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJCQkJZiA9IG5ldyBGaWxlKHRleHRUb1NldCk7Ci0JCQkJCQkJaWYgKGYuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQkJCQkJZiA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50KCkpOwotCQkJCQkJCXRleHRUb1NldCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vd2FudCB0byBzZXQgdGhlIHJvb3QgZGlyZWN0b3J5IHRvCi0JCQkJCQkJLy8gY29tJ3MgcGFyZW50Ci0JCQkJCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQodGV4dFRvU2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZWNlaXZlciBmcm9tIHRoZSBzb3VyY2UgbmFtZSBmaWVsZC4KLQkgKi8KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVGcm9tU291cmNlRmllbGQoKSB7Ci0KLQkJc2V0U291cmNlTmFtZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJLy9VcGRhdGUgZW5hYmxlbWVudHMgd2hlbiB0aGlzIGlzIHNlbGVjdGVkCi0JCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIG9iamVjdAotCSAqIG1lcml0cyBvbmUuIFRoZSBjcml0ZXJpYSBmb3IgdGhpcyBhcmU6IEFsc28gY3JlYXRlIHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgY3JlYXRlUm9vdEVsZW1lbnQoT2JqZWN0IGZpbGVTeXN0ZW1PYmplY3QsIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlib29sZWFuIGlzQ29udGFpbmVyID0gcHJvdmlkZXIuaXNGb2xkZXIoZmlsZVN5c3RlbU9iamVjdCk7Ci0JCVN0cmluZyBlbGVtZW50TGFiZWwgPSBwcm92aWRlci5nZXRMYWJlbChmaWxlU3lzdGVtT2JqZWN0KTsKLQotCQkvLyBVc2UgYW4gZW1wdHkgbGFiZWwgc28gdGhhdCBkaXNwbGF5IG9mIHRoZSBlbGVtZW50J3MgZnVsbCBuYW1lCi0JCS8vIGRvZXNuJ3QgaW5jbHVkZSBhIGNvbmZ1c2luZyBsYWJlbAotCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBkdW1teVBhcmVudCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCgiIiwgbnVsbCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZHVtbXlQYXJlbnQuc2V0UG9wdWxhdGVkKCk7Ci0JCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHJlc3VsdCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChlbGVtZW50TGFiZWwsIGR1bW15UGFyZW50LCBpc0NvbnRhaW5lcik7Ci0KLQkJcmVzdWx0LnNldFBhY2thZ2VCYXNlRGlyTmFtZShwYWNrYWdlQmFzZURpck5hbWUpOwotCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChmaWxlU3lzdGVtT2JqZWN0KTsKLQotCQkvL0dldCB0aGUgZmlsZXMgZm9yIHRoZSBlbGVtZW50IHNvIGFzIHRvIGJ1aWxkIHRoZSBmaXJzdCBsZXZlbAotCQlyZXN1bHQuZ2V0RmlsZXMocHJvdmlkZXIpOwotCi0JCXJldHVybiBkdW1teVBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGltcG9ydCBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL2NyZWF0ZUltcG9ydFR5cGVHcm91cChwYXJlbnQpOwotCQljcmVhdGVSb290RGlyZWN0b3J5R3JvdXAocGFyZW50KTsKLQkJY3JlYXRlRmlsZVNlbGVjdGlvbkdyb3VwKHBhcmVudCk7Ci0KLQkJY3JlYXRlQnV0dG9uc0dyb3VwKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGJ1dHRvbiBncm91cC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVCdXR0b25Hcm91cChib29sZWFuIGVuYWJsZSkgewotCQkvLwkJc2VsZWN0VHlwZXNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzb3VyY2UgY3VycmVudGx5IGV4aXN0cyBhbmQgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnN1cmVTb3VyY2VJc1ZhbGlkKCkgewotCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCWlmIChnZXRTb3VyY2VEaXJlY3RvcnkoKSAhPSBudWxsICYmIG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSkuaXNEaXJlY3RvcnkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJWmlwRmlsZSBzcGVjaWZpZWRGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCi0JCWlmIChzcGVjaWZpZWRGaWxlID09IG51bGwpIHsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsb3NlWmlwRmlsZShzcGVjaWZpZWRGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBwYXNzZWQgaW1wb3J0IG9wZXJhdGlvbi4gQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLQkJaW5pdGlhbGl6ZU9wZXJhdGlvbihvcCk7Ci0JCWlmIChjcmVhdGVGdWxsU3RydWN0dXJlKSB7Ci0JCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0UHJvYmxlbXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0JCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gbmVlZCB0aGUgZm9sbG93aW5nIHByaXZhdGUgc3R1ZmYganVzdCBiZWNhdXNlIHRoZSBEYXRhVHJhbnNmZXJNZXNzYWdlcyBjbGFzcyBpcyBub3QgcHVibGljIQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5tZXNzYWdlcyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBGaW5pc2ggYnV0dG9uIHdhcyBwcmVzc2VkLiBUcnkgdG8gZG8gdGhlIHJlcXVpcmVkIHdvcmsgbm93IGFuZCBhbnN3ZXIgYSBib29sZWFuCi0JICogaW5kaWNhdGluZyBzdWNjZXNzLiBJZiBmYWxzZSBpcyByZXR1cm5lZCB0aGVuIHRoZSB3aXphcmQgd2lsbCBub3QgY2xvc2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlpZiAoIWVuc3VyZVNvdXJjZUlzVmFsaWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljbGVhclByb3ZpZGVyQ2FjaGUoKTsKLQotCQlzYXZlV2lkZ2V0VmFsdWVzKCk7Ci0KLQkJSXRlcmF0b3IgcmVzb3VyY2VzRW51bSA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBmaWxlU3lzdGVtT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHJlc291cmNlc0VudW0uaGFzTmV4dCgpKSB7Ci0JCQlmaWxlU3lzdGVtT2JqZWN0cy5hZGQoKChGaWxlU3lzdGVtRWxlbWVudCkgcmVzb3VyY2VzRW51bS5uZXh0KCkpLmdldEZpbGVTeXN0ZW1PYmplY3QoKSk7Ci0JCX0KLQotCQlpZiAoZmlsZVN5c3RlbU9iamVjdHMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VzKGZpbGVTeXN0ZW1PYmplY3RzKTsKLQkJCX0KLQkJCXJldHVybiBpbXBvcnRSZXNvdXJjZXNGcm9tWmlwKGZpbGVTeXN0ZW1PYmplY3RzKTsKLQkJfQotCi0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIGdldFN0cmluZygiRGF0YVRyYW5zZmVyLmluZm9ybWF0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJGaWxlSW1wb3J0Lm5vbmVTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHMgdGhhdCByZXR1cm5zIG9ubHkgZmlsZXMgYXMKLQkgKiBjaGlsZHJlbi4KLQkgKi8KLQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGaWxlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotCQkJCQlpZiAoY3VycmVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50LmdldEZpbGVzKGN1cnJlbnRQcm92aWRlcikuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0RmlsZXMoRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdFtdIHN1cGVyT2JqZWN0cyA9IHN1cGVyLmdldEVsZW1lbnRzKGVsZW1lbnQpOwotCQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsICYmIGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgYW5FbGVtZW50ID0gbnVsbDsKLQkJCQkJaW50IG5ld09iamVjdHNJbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlhbkVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHN1cGVyT2JqZWN0c1tpXTsKLQotCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGFuRWxlbWVudC5nZXRGaWxlU3lzdGVtT2JqZWN0KCk7Ci0KLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZHJhZ0FuZERyb3BGaWxlTmFtZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KGspKSkgewotCQkJCQkJCQluZXdPYmplY3RzSW5kZXgrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG5ld09iamVjdHNJbmRleCA+IDApIHsKLQkJCQkJCU9iamVjdFtdIG5ld09iamVjdHMgPSBuZXcgT2JqZWN0W25ld09iamVjdHNJbmRleF07Ci0JCQkJCQluZXdPYmplY3RzSW5kZXggPSAwOwotCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWFuRWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgc3VwZXJPYmplY3RzW2ldOwotCi0JCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGFuRWxlbWVudC5nZXRGaWxlU3lzdGVtT2JqZWN0KCk7Ci0KLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGRyYWdBbmREcm9wRmlsZU5hbWVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCWlmIChmaWxlLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoaykpKSB7Ci0KLQkJCQkJCQkJCW5ld09iamVjdHNbbmV3T2JqZWN0c0luZGV4KytdID0gYW5FbGVtZW50OwotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXdPYmplY3RzOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlck9iamVjdHM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByb290IEZpbGVTeXN0ZW1FbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseS1zcGVjaWZpZWQKLQkgKiBzb3VyY2UuIElmIHRoaXMgRmlsZVN5c3RlbUVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkIHRoZW4gY3JlYXRlIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHJvdGVjdGVkIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGdldEZpbGVTeXN0ZW1UcmVlKCkgewotCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCUZpbGUgc291cmNlRGlyZWN0b3J5ID0gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoc291cmNlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc2VsZWN0RmlsZXMoc291cmNlRGlyZWN0b3J5LCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UpOwotCQkJfQotCQkJaWYgKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGlzcGxheUVycm9yRGlhbG9nKGdldFN0cmluZygiRmlsZUltcG9ydC5pbnZhbGlkU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlaaXBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0JCWlmIChzb3VyY2VGaWxlID09IG51bGwpIHsKLQkJCS8vQ2xlYXIgb3V0IHRoZSBwcm92aWRlciBhcyB3ZWxsCi0JCQl0aGlzLmN1cnJlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlpZiAoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXNwbGF5RXJyb3JEaWFsb2coZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0U3RydWN0dXJlUHJvdmlkZXIoc291cmNlRmlsZSk7Ci0JCXRoaXMuY3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXJldHVybiBzZWxlY3RGaWxlcyhwcm92aWRlci5nZXRSb290KCksIHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHMgdGhhdCByZXR1cm5zIG9ubHkgZm9sZGVycwotCSAqIGFzIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGb2xkZXJQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0JCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0JCQkJCWlmIChjdXJyZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0Rm9sZGVycyhjdXJyZW50UHJvdmlkZXIpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlbGVtZW50LmdldEZvbGRlcnMoRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotCQkJCQlpZiAoZWxlbWVudC5pc1BvcHVsYXRlZCgpKQotCQkJCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCQkJCS8vSWYgd2UgaGF2ZSBub3QgcG9wdWxhdGVkIHRoZW4gd2FpdCB1bnRpbCBhc2tlZAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5LW5hbWVkIHNvdXJjZSBkaXJlY3RvcnkgaWZmIGl0IGV4aXN0cyBhcyBhCi0JICogdmFsaWQgZGlyZWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5KHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5LW5hbWVkIHNvdXJjZSBkaXJlY3RvcnkgaWZmIGl0IGV4aXN0cyBhcyBhCi0JICogdmFsaWQgZGlyZWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgU3RyaW5nIG5vdCB5ZXQgZm9ybWF0dGVkIGZvciBqYXZhLmlvLkZpbGUgY29tcGF0YWJpbGl0eQotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQlGaWxlIHNvdXJjZURpcmVjdG9yeSA9IG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUocGF0aCkpOwotCQkJaWYgKCFzb3VyY2VEaXJlY3RvcnkuZXhpc3RzKCkgfHwgIXNvdXJjZURpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBzb3VyY2VEaXJlY3Rvcnk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBkaXJlY3RvcnkgbmFtZSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIGltcG9ydCBzb3VyY2UuIE5vdGUgdGhhdCBpZiBpdCBlbmRzIHdpdGggYQotCSAqIHNlcGFyYXRvciB0aGVuIHRoZSBzZXBhcmF0b3IgaXMgZmlyc3QgcmVtb3ZlZCBzbyB0aGF0IGphdmEgdHJlYXRzIGl0IGFzIGEgcHJvcGVyIGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBkaXJlY3RvcnkgbmFtZSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIGltcG9ydCBzb3VyY2UuIE5vdGUgdGhhdCBpZiBpdCBlbmRzIHdpdGggYQotCSAqIHNlcGFyYXRvciB0aGVuIHRoZSBzZXBhcmF0b3IgaXMgZmlyc3QgcmVtb3ZlZCBzbyB0aGF0IGphdmEgdHJlYXRzIGl0IGFzIGEgcHJvcGVyIGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoU3RyaW5nIHNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcmVzdWx0ID0gbmV3IFBhdGgoc291cmNlTmFtZS50cmltKCkpOwotCi0JCWlmIChyZXN1bHQuZ2V0RGV2aWNlKCkgIT0gbnVsbCAmJiByZXN1bHQuc2VnbWVudENvdW50KCkgPT0gMCkgLy8gc29tZXRoaW5nIGxpa2UgImM6IgotCQkJcmVzdWx0ID0gcmVzdWx0LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHJlc3VsdC5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0JCXJldHVybiByZXN1bHQudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgc3RyaW5nIHRvIGRpc3BsYXkgYXMgdGhlIGxhYmVsIGZvciB0aGUgc291cmNlIHNwZWNpZmljYXRpb24gZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUxhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5kaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhbGwgZXZlbnRzIGFuZCBlbmFibGVtZW50cyBmb3Igd2lkZ2V0cyBpbiB0aGlzIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHNvdXJjZUJyb3dzZUJ1dHRvbikgewotCQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQkJaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkRm9yWmlwKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5oYW5kbGVFdmVudChldmVudCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBicm93c2VyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzb3VyY2UgdG8gaW1wb3J0IGZyb20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCQlTdHJpbmcgY3VycmVudFNvdXJjZSA9IHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKTsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc291cmNlTmFtZUZpZWxkLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoU0VMRUNUX1NPVVJDRV9NRVNTQUdFKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0U291cmNlRGlyZWN0b3J5TmFtZShjdXJyZW50U291cmNlKSk7Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCS8vSnVzdCBxdWl0IGlmIHRoZSBkaXJlY3RvcnkgaXMgbm90IHZhbGlkCi0JCQlpZiAoKGdldFNvdXJjZURpcmVjdG9yeShzZWxlY3RlZERpcmVjdG9yeSkgPT0gbnVsbCkgfHwgc2VsZWN0ZWREaXJlY3RvcnkuZXF1YWxzKGN1cnJlbnRTb3VyY2UpKQotCQkJCXJldHVybjsKLQkJCS8vSWYgaXQgaXMgdmFsaWQgdGhlbiBwcm9jZWVkIHRvIHBvcHVsYXRlCi0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRTb3VyY2VOYW1lKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCXNlbGVjdGlvbkdyb3VwLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgcmVnaXN0ZXJlZCB0eXBlIHNlbGVjdGlvbiBkaWFsb2cgYW5kIG5vdGUgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIHJlY2VpdmVycwotCSAqIHR5cGVzLXRvLWV4cG9ydCBmaWVsZC4sIEFkZGVkIGhlcmUgc28gdGhhdCBpbm5lciBjbGFzc2VzIGNhbiBoYXZlIGFjY2VzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJc3VwZXIuaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXMoTGlzdCBmaWxlU3lzdGVtT2JqZWN0cykgewotCQlJdGVyYXRvciBpID0gZmlsZVN5c3RlbU9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIGYgPSAoRmlsZSkgaS5uZXh0KCk7Ci0JCQlMaXN0IHNpbmdsZUl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc2luZ2xlSXRlbUxpc3QuYWRkKGYpOwotCQkJU3RyaW5nIHRleHRUb1NldCA9IGdldFBhY2thZ2VOYW1lKGYpOwotCQkJaWYgKHRleHRUb1NldCAhPSBudWxsKSB7Ci0JCQkJRmlsZSBuZXdTb3VyY2UgPSBuZXcgRmlsZSh0ZXh0VG9TZXQpOwotCQkJCWV4ZWN1dGVJbXBvcnRPcGVyYXRpb24obmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLCBuZXdTb3VyY2UsIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgc2luZ2xlSXRlbUxpc3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihuZXcgSW1wb3J0T3BlcmF0aW9uKGdldENvbnRhaW5lckZ1bGxQYXRoKCksIGdldFNvdXJjZURpcmVjdG9yeSgpLCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UsIHRoaXMsIHNpbmdsZUl0ZW1MaXN0KSk7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoRmlsZSBmKSB7Ci0JCWlmIChJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGZpbGVOYW1lID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCS8vZ2V0IGNvbS5pYm0uYWJjLkNsYXNzTmFtZQotCQkJUGFja2FnZU5hbWVSZXNvbHZlciBuYW1lUmVzb2x2ZXIgPSBuZXcgUGFja2FnZU5hbWVSZXNvbHZlcigpOwotCQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IG5hbWVSZXNvbHZlci5nZXRDbGFzc05hbWUoZmlsZU5hbWUpOwotCQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0KLQkJCQkvL2dldCBjb20KLQkJCQlpbnQgaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicpOwotCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDEgKyBmaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGJhc2VEaXIgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCS8vZ2V0IGNvbS5pYm0uYWJjCi0JCQkJaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCS8vZ2V0IGNvbS9pYm0vYWJjCi0JCQkJcGFja2FnZURpclN0cnVjID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCQkvL2dldCBDOlxjb20KLQkJCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoYmFzZURpcik7Ci0JCQkJLy9pZiBwYWNrYWdlRGlyU3R1YyBleGlzdHMgdGhlbiBzZXQgdGhlIHNvdXJjZURpciB0byBjb20sIGVsc2UKLQkJCQkvL3NldCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBjbGFzcwotCQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKHBhY2thZ2VEaXJTdHJ1YykgIT0gLTEpIHsKLQkJCQkJaW50IGJhc2VEaXJMZW5ndGggPSBiYXNlRGlyLmxlbmd0aCgpOwotCQkJCQlTdHJpbmcgdGV4dFRvU2V0ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgYmFzZURpckxlbmd0aCk7Ci0JCQkJCWluZGV4ID0gcGFja2FnZU5hbWUuaW5kZXhPZignLicpOwotCQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJCQkJZWxzZQotCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCQlmID0gbmV3IEZpbGUodGV4dFRvU2V0KTsKLQkJCQkJaWYgKGYuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQkJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKTsKLQkJCQkJdGV4dFRvU2V0ID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsgLy93YW50IHRvIHNldCB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gY29tJ3MKLQkJCQkJLy8gcGFyZW50Ci0JCQkJCS8vc291cmNlTmFtZUZpZWxkLnNldFRleHQodGV4dFRvU2V0KTsKLQkJCQkJcmV0dXJuIHRleHRUb1NldDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3BlcmF0aW9uKEltcG9ydE9wZXJhdGlvbiBvcCkgewotCi0JCS8qCi0JCSAqIG9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZSggY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJICovCi0JCW9wLnNldE92ZXJ3cml0ZVJlc291cmNlcyhvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBwcm92aWRlZCBpcyBhbiBleHRlbnNpb24gdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGV4cG9ydCBieQotCSAqIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgbmFtZSBpcyBzdWl0YWJsZSBmb3IgZXhwb3J0IGJhc2VkIHVwb24gaXRzCi0JICogICAgICAgICBleHRlbnNpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cG9ydGFibGVFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoc2VsZWN0ZWRUeXBlcyA9PSBudWxsKSAvLyBpZS4tIGFsbCBleHRlbnNpb25zIGFyZSBhY2NlcHRhYmxlCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlJdGVyYXRvciBhZW51bSA9IHNlbGVjdGVkVHlwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGFlbnVtLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3B1bGF0ZSB0aGUgdmlldyBiYXNlZCBvbiB0aGUgY3VycmVudGx5IGVudGVyZWQgZGlyZWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2VsZWN0aW9uKCkgewotCi0JCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGN1cnJlbnRSb290ID0gZ2V0RmlsZVN5c3RlbVRyZWUoKTsKLQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRSb290KGN1cnJlbnRSb290KTsKLQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQotCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuemlwIikgPT0gZmFsc2UgJiYgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aGlzLnNlbGVjdGlvbkdyb3VwLmV4cGFuZEFsbCgpOwotCQkJfQotCi0JCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCB0ZW1wID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBjdXJyZW50Um9vdC5nZXRGb2xkZXJzKCkuZ2V0Q2hpbGRyZW4oKVswXTsKLQotCQkJTGlzdCBkaXJMaXN0ID0gcGF0aFRvQXJyYXkoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBkaXJMaXN0LmdldChpKTsKLQkJCQlPYmplY3RbXSBmb2xkZXJzID0gdGVtcC5nZXRGb2xkZXJzKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZvbGRlcnMubGVuZ3RoOyBrKyspIHsKLQkJCQkJaWYgKCgoRmlsZSkgKChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgZm9sZGVyc1trXSkuZ2V0RmlsZVN5c3RlbU9iamVjdCgpKS5nZXROYW1lKCkuZXF1YWxzKHMpKSB7Ci0JCQkJCQl0ZW1wID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB0ZW1wLmdldEZvbGRlcnMoKS5nZXRDaGlsZHJlbigpW2tdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuemlwIikgPT0gZmFsc2UgJiYgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aGlzLnNlbGVjdGlvbkdyb3VwLmluaXRpYWxDaGVja1RyZWVJdGVtKHRlbXApOwotCQkJfQotCi0JCQkvL0lmIGNhbiBmaWd1cmUgb3V0IGhvdyB0byBwcmUtaGlnaGxpZ2h0IGRpciwgdGhlbiB1c2UgZm9sbG93aW5nIGNvZGUKLQkJCS8vdG8gY2hlY2sgZHJhZ2dlZCBmaWxlcyBvbmx5LiBBbHNvIG5lZWQgdG8gc2hvdyBhbGwgZmlsZXMgaW4gdHJlZS4KLQkJCS8qCi0JCQkgKiBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBuYW1lID0gbnVsbDsgaW50IG51bUZpbGVzID0KLQkJCSAqIHRlbXAuZ2V0RmlsZXMoKS5nZXRDaGlsZHJlbigpLmxlbmd0aDsgT2JqZWN0W10gZmlsZXMgPSB0ZW1wLmdldEZpbGVzKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCSAqIGZvcihpbnQgaSA9IDA7IGkgPCBkcmFnQW5kRHJvcEZpbGVOYW1lcy5zaXplKCk7IGkrKykgeyBmaWxlTmFtZSA9IChuZXcKLQkJCSAqIEZpbGUoKFN0cmluZylkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoaSkpKS5nZXROYW1lKCk7IGZvcihpbnQgayA9IDA7IGsgPCBudW1GaWxlczsKLQkJCSAqIGsrKykgeyBpZihmaWxlTmFtZS5lcXVhbHMoKChGaWxlKSAoKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KQotCQkJICogZmlsZXNbMF0pLmdldEZpbGVTeXN0ZW1PYmplY3QoKSkuZ2V0TmFtZSgpKSkgewotCQkJICogdGhpcy5zZWxlY3Rpb25Hcm91cC5pbml0aWFsQ2hlY2tUcmVlSXRlbSh0ZW1wKTsgYnJlYWs7IH0gfSB9Ci0JCQkgKi8KLQotCQkJLy90aGlzLnNlbGVjdGlvbkdyb3VwLnNldEFsbFNlbGVjdGlvbnModHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgcGF0aFRvQXJyYXkoKSB7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApOwotCi0JCVBhY2thZ2VOYW1lUmVzb2x2ZXIgbmFtZVJlc29sdmVyID0gbmV3IFBhY2thZ2VOYW1lUmVzb2x2ZXIoKTsKLQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IG5hbWVSZXNvbHZlci5nZXRDbGFzc05hbWUocyk7Ci0KLQkJaW50IHNsYXNoQ291bnRzID0gMDsKLQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQlTdHJpbmcgYmFzZURpciA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJZm9yIChpbnQgaSA9IHMuaW5kZXhPZihiYXNlRGlyKTsgaSA8IHMubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsgaSsrKSB7Ci0JCQkJaWYgKHMuY2hhckF0KGkpID09IEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJc2xhc2hDb3VudHMrKzsKLQkJCX0KLQkJfQotCi0JCUxpc3QgZGlyTmFtZXNBcnJheSA9IG5ldyBBcnJheUxpc3Qoc2xhc2hDb3VudHMpOwotCQlpZiAocy5lbmRzV2l0aCgiLnppcCIpIHx8IHMuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBkaXJOYW1lc0FycmF5OwotCQl9Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJaW50IGVuZEluZGV4OwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBzbGFzaENvdW50czsgaSsrKSB7Ci0JCQllbmRJbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5pbmRleE9mKCcuJywgc3RhcnRJbmRleCk7Ci0JCQlkaXJOYW1lc0FycmF5LmFkZChxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSk7Ci0JCQlzdGFydEluZGV4ID0gZW5kSW5kZXggKyAxOwotCQl9Ci0JCXJldHVybiBkaXJOYW1lc0FycmF5OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkIGxhc3QgdGltZSB0aGlzCi0JICogd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHZhbHVlcyBzdG9yZWQsIHNvIHN0b3AKLQotCQkJLy8gc2V0IGZpbGVuYW1lcyBoaXN0b3J5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCXNvdXJjZU5hbWVGaWVsZC5hZGQoc291cmNlTmFtZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luY2UgRmluaXNoIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdCB0aGV5IHdpbGwgcGVyc2lzdAotCSAqIGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCi0JCQlzb3VyY2VOYW1lcyA9IGFkZFRvSGlzdG9yeShzb3VyY2VOYW1lcywgZ2V0U291cmNlRGlyZWN0b3J5TmFtZSgpKTsKLQkJCXNldHRpbmdzLnB1dChTVE9SRV9TT1VSQ0VfTkFNRVNfSUQsIHNvdXJjZU5hbWVzKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhIGZpbGUgc2VsZWN0aW9uIG9wZXJhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIGFuZCBzdHJ1Y3R1cmUgcHJvdmlkZXIuIElmCi0JICogdGhlIHVzZXIgc3BlY2lmaWVzIGZpbGVzIHRvIGJlIGltcG9ydGVkIHRoZW4gdGhpcyBzZWxlY3Rpb24gaXMgY2FjaGVkIGZvciBsYXRlciByZXRyaWV2YWwgYW5kCi0JICogaXMgcmV0dXJuZWQuCi0JICovCi0JcHJvdGVjdGVkIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHNlbGVjdEZpbGVzKGZpbmFsIE9iamVjdCByb290RmlsZVN5c3RlbU9iamVjdCwgZmluYWwgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0KLQkJZmluYWwgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnRbXSByZXN1bHRzID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50WzFdOwotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy9DcmVhdGUgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBzdXBwbGllZCBmaWxlIHN5c3RlbSBvYmplY3QKLQkJCQlyZXN1bHRzWzBdID0gY3JlYXRlUm9vdEVsZW1lbnQocm9vdEZpbGVTeXN0ZW1PYmplY3QsIHN0cnVjdHVyZVByb3ZpZGVyKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdHNbMF07Ci0JfQotCi0JLyoqCi0JICogU2V0IGFsbCBvZiB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgc2VsZWN0aW9uIGdyb3VwIHRvIHZhbHVlLiBJbXBsZW1lbnRlZCBoZXJlIHRvIHByb3ZpZGUgYWNjZXNzCi0JICogZm9yIGlubmVyIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWxsU2VsZWN0aW9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyLnNldEFsbFNlbGVjdGlvbnModmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNvdXJjZSBuYW1lIG9mIHRoZSBpbXBvcnQgdG8gYmUgdGhlIHN1cHBsaWVkIHBhdGguIEFkZHMgdGhlIG5hbWUgb2YgdGhlIHBhdGggdG8gdGhlCi0JICogbGlzdCBvZiBpdGVtcyBpbiB0aGUgc291cmNlIGNvbWJvIGFuZCBzZWxlY3RzIGl0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBiZSBhZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKLQotCQkJU3RyaW5nW10gY3VycmVudEl0ZW1zID0gdGhpcy5zb3VyY2VOYW1lRmllbGQuZ2V0SXRlbXMoKTsKLQkJCWludCBzZWxlY3Rpb25JbmRleCA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY3VycmVudEl0ZW1zW2ldLmVxdWFscyhwYXRoKSkKLQkJCQkJc2VsZWN0aW9uSW5kZXggPSBpOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbkluZGV4IDwgMCkgewotCQkJCWludCBvbGRMZW5ndGggPSBjdXJyZW50SXRlbXMubGVuZ3RoOwotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tvbGRMZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRJdGVtcywgMCwgbmV3SXRlbXMsIDAsIG9sZExlbmd0aCk7Ci0JCQkJbmV3SXRlbXNbb2xkTGVuZ3RoXSA9IHBhdGg7Ci0JCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2V0SXRlbXMobmV3SXRlbXMpOwotCQkJCXNlbGVjdGlvbkluZGV4ID0gb2xkTGVuZ3RoOwotCQkJfQotCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2VsZWN0KHNlbGVjdGlvbkluZGV4KTsKLQotCQkJcmVzZXRTZWxlY3Rpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgdHJlZSB0byBvbmx5IHNlbGVjdCB0aG9zZSBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RlZCB0eXBlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwU2VsZWN0aW9uc0Jhc2VkT25TZWxlY3RlZFR5cGVzKCkgewotCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpKTsKLQkJZmluYWwgTWFwIHNlbGVjdGlvbk1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlmaW5hbCBJRWxlbWVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSUVsZW1lbnRGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGZpbHRlckVsZW1lbnRzKENvbGxlY3Rpb24gZmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJSXRlcmF0b3IgZmlsZXNMaXN0ID0gZmlsZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZmlsZXNMaXN0Lmhhc05leHQoKSkgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJY2hlY2tGaWxlKGZpbGVzTGlzdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoT2JqZWN0W10gZmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJY2hlY2tGaWxlKGZpbGVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBjaGVja0ZpbGUoT2JqZWN0IGZpbGVFbGVtZW50KSB7Ci0JCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZmlsZSA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgZmlsZUVsZW1lbnQ7Ci0JCQkJaWYgKGlzRXhwb3J0YWJsZUV4dGVuc2lvbihmaWxlLmdldEZpbGVOYW1lRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJCWlmIChzZWxlY3Rpb25NYXAuY29udGFpbnNLZXkocGFyZW50KSkKLQkJCQkJCWVsZW1lbnRzID0gKExpc3QpIHNlbGVjdGlvbk1hcC5nZXQocGFyZW50KTsKLQkJCQkJZWxlbWVudHMuYWRkKGZpbGUpOwotCQkJCQlzZWxlY3Rpb25NYXAucHV0KHBhcmVudCwgZWxlbWVudHMpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJJbXBvcnRQYWdlLmZpbHRlclNlbGVjdGlvbnMiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoZmlsdGVyLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZGlhbG9nLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0NvdWxkbid0IHN0YXJ0LiBEbyBub3RoaW5nLgotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vR290IGludGVycnVwdGVkLiBEbyBub3RoaW5nLgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IGFsbCBwYWludCBvcGVyYXRpb25zIGNhdXNlZCBieSBjbG9zaW5nIHRoZSBwcm9ncmVzcwotCQkvLyBkaWFsb2cgZ2V0IGZsdXNoZWQsIG90aGVyd2lzZSBleHRyYSBwaXhlbHMgd2lsbCByZW1haW4gb24gdGhlIHNjcmVlbiB1bnRpbAotCQkvLyB1cGRhdGVTZWxlY3Rpb25zIGlzIGNvbXBsZXRlZAotCQlnZXRTaGVsbCgpLnVwZGF0ZSgpOwotCQkvLyBUaGUgdXBkYXRlU2VsZWN0aW9ucyBtZXRob2QgYWNjZXNzZXMgU1dUIHdpZGdldHMgc28gY2Fubm90IGJlIGV4ZWN1dGVkCi0JCS8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIHByb2dyZXNzIGRpYWxvZyBvcGVyYXRpb24gc2luY2UgdGhlIG9wZXJhdGlvbiBmb3JrcwotCQkvLyBhIG5ldyBwcm9jZXNzLgotCQlpZiAoc2VsZWN0aW9uTWFwICE9IG51bGwpIHsKLQkJCXVwZGF0ZVNlbGVjdGlvbnMoc2VsZWN0aW9uTWFwKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuIFNldCB0aGUgc2VsZWN0aW9uIHVwIHdoZW4gaXQgYmVjb21lcyB2aXNpYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCXJlc2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh2aXNpYmxlKQotCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgd2l0aCB0aG9zZSBpbiBtYXAgLiBJbXBsZW1lbnRlZCBoZXJlIHRvIGdpdmUgaW5uZXIgY2xhc3MgdmlzaWJpbGl0eQotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIE1hcCAtIGtleSB0cmVlIGVsZW1lbnRzLCB2YWx1ZXMgTGlzdHMgb2YgbGlzdCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbnMoTWFwIG1hcCkgewotCQlzdXBlci51cGRhdGVTZWxlY3Rpb25zKG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgd2lkZ2V0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBhIGNoYW5nZSBpbiB0aGUgZGlhbG9nLiBQcm92aWRlZCBoZXJlIHRvIGdpdmUKLQkgKiBhY2Nlc3MgdG8gaW5uZXIgY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKSB7Ci0KLQkJc3VwZXIudXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBzZWxmJ3Mgc291cmNlIHNwZWNpZmljYXRpb24gd2lkZ2V0cyBjdXJyZW50bHkgYWxsIGNvbnRhaW4KLQkgKiB2YWxpZCB2YWx1ZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2VHcm91cCgpIHsKLQkJaWYgKGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCUZpbGUgc291cmNlRGlyZWN0b3J5ID0gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoc291cmNlRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCQlzZXRNZXNzYWdlKFNPVVJDRV9FTVBUWV9NRVNTQUdFKTsKLQkJCQllbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoc291cmNlQ29uZmxpY3RzV2l0aERlc3RpbmF0aW9uKG5ldyBQYXRoKHNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkpKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShnZXRTb3VyY2VDb25mbGljdE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQllbmFibGVCdXR0b25Hcm91cCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vSWYgdGhlcmUgaXMgbm90aGluZyBiZWluZyBwcm92aWRlZCB0byB0aGUgaW5wdXQgdGhlbiB0aGVyZSBpcyBhIHByb2JsZW0KLQkJaWYgKHRoaXMuY3VycmVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNldE1lc3NhZ2UoU09VUkNFX0VNUFRZX01FU1NBR0UpOwotCQkJZW5hYmxlQnV0dG9uR3JvdXAoZmFsc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVuYWJsZUJ1dHRvbkdyb3VwKHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNvdXJjZSBsb2NhdGlvbiBjb25mbGljdHMgd2l0aCB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2UuIFRoaXMgd2lsbCBvY2N1cgotCSAqIGlmIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSB1bmRlciB0aGUgZGVzdGluYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlQ29uZmxpY3RzV2l0aERlc3RpbmF0aW9uKElQYXRoIHNvdXJjZVBhdGgpIHsKLQotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFNwZWNpZmllZENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRDb250YWluZXIoKS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2Yoc291cmNlUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFJlc291cmNlUGF0aCgpIHsKLQkJcmV0dXJuIGltcG9ydGVkQ2xhc3Nlc1BhdGg7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkvL21ha2VzdXJlIHRvIGNhbGwgbWFpbnBhZ2UuY2FuY2VsKCkKLQlwdWJsaWMgYm9vbGVhbiBjYW5jZWwoKSB7Ci0JCWNsZWFyUHJvdmlkZXJDYWNoZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNhY2hlZCBzdHJ1Y3R1cmUgcHJvdmlkZXIgYWZ0ZXIgZmlyc3QgZmluYWxpemluZyBpdCBwcm9wZXJseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclByb3ZpZGVyQ2FjaGUoKSB7Ci0JCWlmIChwcm92aWRlckNhY2hlICE9IG51bGwpIHsKLQkJCWNsb3NlWmlwRmlsZShwcm92aWRlckNhY2hlLmdldFppcEZpbGUoKSk7Ci0JCQlwcm92aWRlckNhY2hlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGNsb3NlIHRoZSBwYXNzZWQgemlwIGZpbGUsIGFuZCBhbnN3ZXJzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VaaXBGaWxlKFppcEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2Rpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5mb3JtYXQoIlppcEltcG9ydC5jb3VsZE5vdENsb3NlIiwgbmV3Ci0JCQkvLyBPYmplY3RbXSB7IGZpbGUuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4gUmV0dXJuIG51bGwgaWYgdGhpcwotCSAqIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLQkgKi8KLQotCXByb3RlY3RlZCBaaXBGaWxlIGdldFNwZWNpZmllZFNvdXJjZUZpbGUoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGhhbmRsZSB0byB0aGUgemlwIGZpbGUgY3VycmVudGx5IHNwZWNpZmllZCBhcyBiZWluZyB0aGUgc291cmNlLiBSZXR1cm4gbnVsbCBpZiB0aGlzCi0JICogZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgb2YgdmFsaWQgZm9ybWF0LgotCSAqLwotCi0JcHJpdmF0ZSBaaXBGaWxlIGdldFNwZWNpZmllZFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGVOYW1lKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCS8vZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLmdldFN0cmluZygiWmlwSW1wb3J0LmJhZEZvcm1hdCIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9kaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJaaXBJbXBvcnQuY291bGROb3RSZWFkIikpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmUgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgemlwIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihaaXBGaWxlIHRhcmdldFppcCkgewotCQlpZiAocHJvdmlkZXJDYWNoZSA9PSBudWxsKQotCQkJcHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmdldE5hbWUoKS5lcXVhbHModGFyZ2V0WmlwLmdldE5hbWUoKSkpIHsKLQkJCWNsZWFyUHJvdmlkZXJDYWNoZSgpOyAvLyBpZS4tIG5ldyB2YWx1ZSwgc28gZmluYWxpemUmcmVtb3ZlIG9sZCB2YWx1ZQotCQkJcHJvdmlkZXJDYWNoZSA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIodGFyZ2V0WmlwKTsKLQkJfSBlbHNlIGlmICghcHJvdmlkZXJDYWNoZS5nZXRaaXBGaWxlKCkuZXF1YWxzKHRhcmdldFppcCkpCi0JCQljbG9zZVppcEZpbGUodGFyZ2V0WmlwKTsgLy8gaWUuLSBkdXBsaWNhdGUgaGFuZGxlIHRvIHNhbWUgLnppcAotCi0JCXJldHVybiBwcm92aWRlckNhY2hlOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBGaWxlRGlhbG9nIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIHNvdXJjZSBmaWxlIHRvIGltcG9ydCBmcm9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZEZvclppcCgpIHsKLQkJU3RyaW5nIHNlbGVjdGVkRmlsZSA9IHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCk7Ci0JCWlmIChzZWxlY3RlZEZpbGUgIT0gbnVsbCkgewotCQkJaWYgKCFzZWxlY3RlZEZpbGUuZXF1YWxzKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpKSB7Ci0JCQkJLy9CZSBzdXJlIGl0IGlzIHZhbGlkIGJlZm9yZSB3ZSBnbyBzZXR0aW5nIGFueSBuYW1lcwotCQkJCVppcEZpbGUgc291cmNlRmlsZSA9IGdldFNwZWNpZmllZFNvdXJjZUZpbGUoc2VsZWN0ZWRGaWxlKTsKLQkJCQlpZiAoc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCWNsb3NlWmlwRmlsZShzb3VyY2VGaWxlKTsKLQkJCQkJc2V0U291cmNlTmFtZShzZWxlY3RlZEZpbGUpOwotCQkJCQlzZWxlY3Rpb25Hcm91cC5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXNGcm9tWmlwKExpc3QgZmlsZVN5c3RlbU9iamVjdHMpIHsKLQotCQlaaXBGaWxlIHppcEZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0JCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IGdldFN0cnVjdHVyZVByb3ZpZGVyKHppcEZpbGUpOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihuZXcgSW1wb3J0T3BlcmF0aW9uKGdldENvbnRhaW5lckZ1bGxQYXRoKCksIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwgc3RydWN0dXJlUHJvdmlkZXIsIHRoaXMsIGZpbGVTeXN0ZW1PYmplY3RzKSk7Ci0KLQkJY2xvc2VaaXBGaWxlKHppcEZpbGUpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgYW5kIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3RlZCBmaWxlLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlaaXBGaWxlVG9JbXBvcnQoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc291cmNlTmFtZUZpZWxkLmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tde0ZJTEVfSU1QT1JUX01BU0t9KTsKLQotCQlTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCWludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBjdXJyZW50U291cmNlU3RyaW5nLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkKLQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotCi0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9lYXJsaWJyYXJpZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvZWFybGlicmFyaWVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTVjYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9lYXJsaWJyYXJpZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZV8wPUVBUiBMaWJyYXJpZXMKLUVBUkxpYnJhcmllc0NvbnRhaW5lclBhZ2VfMT1UaGUgRUFSIExpYnJhcmllcyBjbGFzc3BhdGggY29udGFpbmVyIGR5bmFtaWNhbGx5IGNvbXB1dGVzIHRoZSBKYXZhIEVFIHByb2plY3QncyBtb2R1bGUgY2xhc3NwYXRoIGRlcGVuZGVuY2llcyB1c2luZyB0aGUgTUVUQS1JTkYvTUFOSUZFU1QuTUYgQ2xhc3MtUGF0aCBlbnRyaWVzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL2FyY2hpdmUvSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL2FyY2hpdmUvSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg5NzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9hcmNoaXZlL0lBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludCBpbiBvcmRlciB0byBleHRlbmQgdGhlIFVJIG9mIHRoZSBiYXNlIG1vZHVsZSBhcmNoaXZlIGV4cG9ydCB3aXphcmQuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeQotewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29udGFpbmluZyB0aGUgVUkgZWxlbWVudHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBleHBvcnQgcGFydGljaXBhbnQKLSAgICAgKiB0aGF0IHRoaXMgcGFuZWwgZmFjdG9yeSBpcyByZWdpc3RlcmVkIHdpdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBkYXRhTW9kZWwgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIGV4cG9ydCBwYXJ0aWNpcGFudAotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29tcG9zaXRlCi0gICAgICovCi0gICAgCi0gICAgQ29tcG9zaXRlIGNyZWF0ZVBhbmVsKCBDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSURhdGFNb2RlbCBkYXRhTW9kZWwgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsc0V4dGVuc2lvblBvaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHNFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGIxMzA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsc0V4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5maW5kUmVxdWlyZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LlBsdWdpblV0aWwuZ2V0VG9wTGV2ZWxFbGVtZW50czsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW4ubG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmUuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIHByb2Nlc3NpbmcgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHNFeHRlbnNpb25Qb2ludAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUEFORUxfRkFDVE9SWSA9ICJwYW5lbC1mYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSQ0hJVkVfRVhQT1JUX1BBUlRJQ0lQQU5UX0lEID0gImFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudElkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsUGFuZWxGYWN0b3J5SW5mbz4gZXh0ZW5zaW9ucyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYW5lbEZhY3RvcnlJbmZvCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRJZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBcmNoaXZlRXhwb3J0RXh0ZW5zaW9uSWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRJZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbEZhY3RvcnkgbG9hZFBhbmVsRmFjdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZSggdGhpcy5wbHVnaW5JZCwgdGhpcy5jbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVsRmFjdG9yeS5jbGFzcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBQYW5lbEZhY3RvcnlJbmZvIGdldEV4dGVuc2lvbiggZmluYWwgU3RyaW5nIGFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudElkICkKLSAgICB7Ci0gICAgICAgIHJlYWRFeHRlbnNpb25zKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXQoIGFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudElkICk7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBpZiggZXh0ZW5zaW9ucyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHRlbnNpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLFBhbmVsRmFjdG9yeUluZm8+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IAotICAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIEVMX1BBTkVMX0ZBQ1RPUlkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkRXh0ZW5zaW9uKCBlbGVtZW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyIHZpYSB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEV4dGVuc2lvbiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgUGFuZWxGYWN0b3J5SW5mbyBleHQgPSBuZXcgUGFuZWxGYWN0b3J5SW5mbygpOwotCi0gICAgICAgIGV4dC5hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRJZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0FSQ0hJVkVfRVhQT1JUX1BBUlRJQ0lQQU5UX0lEICk7Ci0gICAgICAgIGV4dC5wbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZXh0LmNsYXNzTmFtZSA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgIAotICAgICAgICBleHRlbnNpb25zLnB1dCggZXh0LmFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudElkLCBleHQgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmVkZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBFYXJGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZSBpbXBsZW1lbnRzIElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gbmV3TW9kdWxlQnV0dG9uOwotCQotCXByaXZhdGUgTGFiZWwgbW9kdWxlUHJvamVjdHNMYWJlbDsgCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIG1vZHVsZVByb2plY3RzVmlld2VyOwotCQotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVDaGVja2VkU3RhdGUgPSBmYWxzZTsKLQkKLQlwcml2YXRlIExhYmVsIGNvbnRlbnREaXJMYWJlbDsKLQlwcml2YXRlIFRleHQgY29udGVudERpcjsKLQotCXB1YmxpYyBFYXJGYWNldEluc3RhbGxQYWdlKCkgewotCQlzdXBlcigiZWFyLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfU0VDT05EX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfU0VDT05EX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9XSVpfQkFOTkVSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0NPTlRFTlRfRElSLCBKMkVFX1BST0pFQ1RTX0xJU1R9OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbW9kdWxlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQltb2R1bGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltb2R1bGVzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNyZWF0ZU1vZHVsZVByb2plY3RPcHRpb25zKG1vZHVsZXNHcm91cCk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChtb2R1bGVzR3JvdXApOwotCQkKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobW9kdWxlc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQl0aGlzLmNvbnRlbnREaXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5jb250ZW50RGlyTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuY29udGVudERpckxhYmVsKTsKLQkJdGhpcy5jb250ZW50RGlyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCi0JCXRoaXMuY29udGVudERpciA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRoaXMuY29udGVudERpci5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChjb250ZW50RGlyLCBDT05URU5UX0RJUiwgbnVsbCk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIG1vZHVsZXNHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQodmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlc0dyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZVByb2plY3RPcHRpb25zKENvbXBvc2l0ZSBtb2R1bGVzR3JvdXApIHsKLQkJbW9kdWxlUHJvamVjdHNMYWJlbCA9IG5ldyBMYWJlbChtb2R1bGVzR3JvdXAsIFNXVC5OT05FKTsKLQkJbW9kdWxlUHJvamVjdHNMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkoyRUVfTU9EVUxFX0RFUEVOREVOQ0lFU19MQUJFTCkpOwotCQltb2R1bGVQcm9qZWN0c0xhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJCi0JCW1vZHVsZVByb2plY3RzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobW9kdWxlc0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjAwOwotCQlnRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJaW50IGoyZWVWZXJzaW9uID0gZ2V0SjJFRVZlcnNpb24oKTsKLQkJQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIobnVsbCwgajJlZVZlcnNpb24pOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlcigpKTsKLQkJc2V0Q2hlY2tlZEl0ZW1zRnJvbU1vZGVsKCk7Ci0JCQotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFpZ25vcmVDaGVja2VkU3RhdGUpIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSjJFRV9QUk9KRUNUU19MSVNULCBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCkpOwotCQkJCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKQVZBX1BST0pFQ1RfTElTVCwgZ2V0Q2hlY2tlZEphdmFQcm9qZWN0c0FzTGlzdCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0U29ydGVyKG51bGwpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q2hlY2tlZEl0ZW1zRnJvbU1vZGVsKCkgewotCQlMaXN0IGNvbXBvbmVudHMgPSAoTGlzdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSjJFRV9QUk9KRUNUU19MSVNUKTsKLQkJCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IG1vZHVsZVByb2plY3RzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IoIGludCBpPTA7IGk8IGl0ZW1zLmxlbmd0aDsgaSsrICl7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpZWxlbWVudDsJCQkJCi0JCQkJSXRlcmF0b3IgaXQgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KWl0Lm5leHQoKTsKLQkJCQkJaWYoIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpICl7Ci0JCQkJCQlsaXN0LmFkZChjb21wKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQkKLQkJfQotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMobGlzdC50b0FycmF5KCkpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hNb2R1bGVzKCkgewotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5yZWZyZXNoKCk7Ci0JCXNldENoZWNrZWRJdGVtc0Zyb21Nb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUxpc3QgbGlzdDsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApCi0JCQlsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJZWxzZXsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkJZm9yKCBpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoIGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQgKSB7Ci0JCQkJCWxpc3QuYWRkKCgoSVZpcnR1YWxDb21wb25lbnQpZWxlbWVudHNbaV0pLmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hlY2tlZEphdmFQcm9qZWN0c0FzTGlzdCgpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBtb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBsaXN0OwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCWxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQllbHNlewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQlmb3IoIGludCBpPTA7IGk8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiggZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCApIHsKLQkJCQkJbGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX1BST0pFQ1RfTU9EVUxFU19QR19TRUxFQ1QpKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX0RFU0VMRUNUKSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW5ld01vZHVsZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV3TW9kdWxlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX1BST0pFQ1RfTU9EVUxFU19QR19ORVcpKTsKLQkJbmV3TW9kdWxlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlnZC5taW5pbXVtV2lkdGggPSBTV1QuREVGQVVMVDsKLQkJbmV3TW9kdWxlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCWlmIChldnQud2lkZ2V0ID09IHNlbGVjdEFsbEJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZSBpZiAoZXZ0LndpZGdldCA9PSBkZXNlbGVjdEFsbEJ1dHRvbikKLQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQllbHNlIGlmIChldnQud2lkZ2V0ID09IG5ld01vZHVsZUJ1dHRvbikKLQkJCWhhbmRsZU5ld01vZHVsZUJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlRXZlbnQoZXZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld01vZHVsZUJ1dHRvblByZXNzZWQoKSB7Ci0JCUlEYXRhTW9kZWwgYU1vZGVsID0gY3JlYXRlTmV3TW9kdWxlTW9kZWwoKTsKLQkJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZChhTW9kZWwpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICBzZXROZXdNb2R1bGVzKGFNb2RlbCk7Ci0gICAgICAgICAgICByZWZyZXNoTW9kdWxlcygpOwotCQl9Ci0JfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXROZXdNb2R1bGVzKElEYXRhTW9kZWwgZGVmYXVsdE1vZGVsKSB7Ci0gICAgICAgIExpc3QgbmV3Q29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgY29sbGVjdE5ld0NvbXBvbmVudHMoZGVmYXVsdE1vZGVsLCBuZXdDb21wb25lbnRzKTsKLSAgICAgICAgTGlzdCBvbGRDb21wb25lbnRzID0gKExpc3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KEoyRUVfUFJPSkVDVFNfTElTVCk7Ci0gICAgICAgIG5ld0NvbXBvbmVudHMuYWRkQWxsKG9sZENvbXBvbmVudHMpOwotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKMkVFX1BST0pFQ1RTX0xJU1QsIG5ld0NvbXBvbmVudHMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdE5ld0NvbXBvbmVudHMoSURhdGFNb2RlbCBkZWZhdWx0TW9kZWwsIExpc3QgbmV3UHJvamVjdHMpIHsKLSAgICAgICAgY29sbGVjdENvbXBvbmVudHMoZGVmYXVsdE1vZGVsLmdldE5lc3RlZE1vZGVsKElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfRUpCKSwgbmV3UHJvamVjdHMpOwotICAgICAgICBjb2xsZWN0Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9XRUIpLCBuZXdQcm9qZWN0cyk7Ci0gICAgICAgIGNvbGxlY3RDb21wb25lbnRzKGRlZmF1bHRNb2RlbC5nZXROZXN0ZWRNb2RlbChJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX0NMSUVOVCksIG5ld1Byb2plY3RzKTsKLSAgICAgICAgY29sbGVjdENvbXBvbmVudHMoZGVmYXVsdE1vZGVsLmdldE5lc3RlZE1vZGVsKElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfSkNBKSwgbmV3UHJvamVjdHMpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdENvbXBvbmVudHMoSURhdGFNb2RlbCBjb21wRE0sIExpc3QgbmV3UHJvamVjdHMpIHsKLSAgICAgICAgaWYgKGNvbXBETSAhPSBudWxsKSB7Ci0gICAgICAgIAlTdHJpbmcgcHJvamVjdE5hbWUgPSBjb21wRE0uZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotICAgICAgICAgICAgaWYocHJvamVjdE5hbWUgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgbmV3UHJvamVjdHMuYWRkKHByb2plY3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCXByaXZhdGUgSURhdGFNb2RlbCBjcmVhdGVOZXdNb2R1bGVNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkZWZhdWx0TW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkvLyB0cmFuc2ZlciBwcm9wZXJ0aWVzLCBwcm9qZWN0IG5hbWUKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJZGVmYXVsdE1vZGVsLnNldFByb3BlcnR5KElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJLy8gZWFyIGNvbXBvbmVudCBuYW1lCi0JCVN0cmluZyBlYXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJZGVmYXVsdE1vZGVsLnNldFByb3BlcnR5KElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfQ09NUE9ORU5UX05BTUUsIGVhck5hbWUpOwotCQkvLyBlYXIgajJlZSB2ZXJzaW9uCi0JCWludCBqMmVlVmVyc2lvbiA9IGdldEoyRUVWZXJzaW9uKCk7Ci0JCWRlZmF1bHRNb2RlbC5zZXRQcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbikpOwotCQkKLQkJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCUlSdW50aW1lIHJ0ID0gZnB3Yy5nZXRQcmltYXJ5UnVudGltZSgpOwotCQlkZWZhdWx0TW9kZWwuc2V0UHJvcGVydHkoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIHJ0KTsKLQkJCi0JCXJldHVybiBkZWZhdWx0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWlnbm9yZUNoZWNrZWRTdGF0ZSA9IHRydWU7Ci0JCXRyeSB7Ci0JCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJCS8vZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSjJFRV9DT01QT05FTlRfTElTVCwgbnVsbCk7Ci0JCQkvL0lEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSAoSURhdGFNb2RlbClnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShORVNURURfQUREX0NPTVBPTkVOVF9UT19FQVJfRE0pOwkKLQkJCS8vKG5lc3RlZE1vZGVsKS5zZXRQcm9wZXJ0eShBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLiwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfUFJPSkVDVFNfTElTVCwgbnVsbCk7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKQVZBX1BST0pFQ1RfTElTVCwgbnVsbCk7CQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZ25vcmVDaGVja2VkU3RhdGUgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJaWdub3JlQ2hlY2tlZFN0YXRlID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCW1vZHVsZVByb2plY3RzVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkvL2dldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfQ09NUE9ORU5UX0xJU1QsIGdldENoZWNrZWRFbGVtZW50c0FzTGlzdCgpKTsKLQkJCS8vSURhdGFNb2RlbCBuZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKWdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KE5FU1RFRF9BRERfQ09NUE9ORU5UX1RPX0VBUl9ETSk7Ci0JCQkvLyhuZXN0ZWRNb2RlbCkuc2V0UHJvcGVydHkoQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci4sIGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSk7Ci0JCQkKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfUFJPSkVDVFNfTElTVCwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEpBVkFfUFJPSkVDVF9MSVNULCBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCkpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZ25vcmVDaGVja2VkU3RhdGUgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5KMkVFV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IGlucHV0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlzdXBlci5lbnRlcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLQotCWV4dGVuZHMgTkxTCi0KLQl7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWw7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbEludmFsaWQ7Ci0KLQkJc3RhdGljIHsKLQkJCWluaXRpYWxpemVNZXNzYWdlcyhFYXJGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRmZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBhZ2VUaXRsZSA9IEVBUiBNb2R1bGUKLXBhZ2VEZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSBFQVIgbW9kdWxlIHNldHRpbmdzLgotY29udGVudERpckxhYmVsID0gQ29udGVudCBkaXJlY3Rvcnk6Ci1jb250ZW50RGlyTGFiZWxJbnZhbGlkID0gQ29udGVudCBkaXJlY3RvcnkgKGludmFsaWQpOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdEZpcnN0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmIxMTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLkRhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgRWFyUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBFYXJQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfQ09NUE9ORU5UX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX1dJWl9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19FQVJfV0laQVJEX1AxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVR5cGVJRCgpIHsKLQkJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgICBjcmVhdGVXb3JraW5nU2V0R3JvdXBQYW5lbCh0b3AsIG5ldyBTdHJpbmdbXSB7IFJFU09VUkNFX1dPUktJTkdfU0VUIH0pOwotCQlyZXR1cm4gdG9wOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0NGU5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLk5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRWFyUHJvamVjdFdpemFyZCBleHRlbmRzIE5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZCB7Ci0KLQlwdWJsaWMgRWFyUHJvamVjdFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKXsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfQ09NUE9ORU5UX1dJWl9USVRMRSkpOwotCX0KLQkKLQlwdWJsaWMgRWFyUHJvamVjdFdpemFyZCgpewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfQ09NUE9ORU5UX1dJWl9USVRMRSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lSW5EYXRhTW9kZWwoSVJ1bnRpbWUgcnVudGltZSl7Ci0JCW1vZGVsLnNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIHJ1bnRpbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIpOwotCQlmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCJpY29ucy9lYXItd2l6LWJhbm5lci5naWYiKTsKLQotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LmVhciIpOwotCX0KLQotCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgRWFyUHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9FQVIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVBUk5hbWUoIFN0cmluZyBlYXJOYW1lICl7Ci0JCW1vZGVsLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgZWFyTmFtZSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlOTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFYXJTZWxlY3Rpb25QYW5lbCBpbXBsZW1lbnRzIElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdXR0b24gYWRkVG9FYXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLSAgICBwcml2YXRlIGZpbmFsIEJ1dHRvbiBuZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBmaW5hbCBMYWJlbCBsYWJlbDsKLSAgIAotICAgIHByaXZhdGUgZmluYWwgSURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoaGVscGVyOwotICAgIAotICAgIHB1YmxpYyBFYXJTZWxlY3Rpb25QYW5lbCggZmluYWwgSURhdGFNb2RlbCBtb2RlbCwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgCi0gICAgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMuc3luY2hoZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDMsIGZhbHNlICkgKTsKLSAgICAgICAgZ3JvdXAuc2V0VGV4dCggUmVzb3VyY2VzLmVhck1lbWJlclNoaXAgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuYWRkVG9FYXIgPSBuZXcgQnV0dG9uKCBncm91cCwgU1dULkNIRUNLICk7Ci0gICAgICAgIHRoaXMuYWRkVG9FYXIuc2V0VGV4dCggUmVzb3VyY2VzLmFkZFRvRWFyTGFiZWwgKTsKLSAgICAgICAgdGhpcy5hZGRUb0Vhci5zZXRMYXlvdXREYXRhKCBnZGhzcGFuKCBuZXcgR3JpZERhdGEoKSwgMyApICk7Ci0gICAgICAgIHN5bmNoaGVscGVyLnN5bmNoQ2hlY2tib3goYWRkVG9FYXIsIEFERF9UT19FQVIsIG51bGwpOwotCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoUmVzb3VyY2VzLmVhclByb2plY3RMYWJlbCk7Ci0gICAgICAgIHRoaXMuY29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgdGhpcy5jb21iby5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubmV3QnV0dG9uID0gbmV3IEJ1dHRvbiggZ3JvdXAsIFNXVC5QVVNIICk7Ci0gICAgICAgIHRoaXMubmV3QnV0dG9uLnNldFRleHQoIFJlc291cmNlcy5uZXdCdXR0b25MYWJlbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5uZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBZGRCdXR0b24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSApOwotICAgICAgICAKLSAgICAgICAgc3luY2hoZWxwZXIuc3luY2hDb21ibyhjb21ibywgRUFSX1BST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtsYWJlbCwgbmV3QnV0dG9ufSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhclByb2plY3RXaXphcmQgd2l6YXJkID0gbmV3IEVhclByb2plY3RXaXphcmQoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFdpemFyZERpYWxvZyBkaWFsb2cgCi0gICAgICAgICAgICA9IG5ldyBXaXphcmREaWFsb2coIG5ld0J1dHRvbi5nZXRTaGVsbCgpLCB3aXphcmQgKTsKLSAgICAgICAgCi0gICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSk7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5FQVJfUFJPSkVDVF9OQU1FICk7Ci0gICAgCXdpemFyZC5zZXRSdW50aW1lSW5EYXRhTW9kZWwocnVudGltZSk7Ci0gICAgCXdpemFyZC5zZXRFQVJOYW1lKCBlYXJOYW1lICk7Ci0gICAgICAgIGlmKCBkaWFsb2cub3BlbigpICE9IFNXVC5DQU5DRUwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVhcnByb2ogPSB3aXphcmQuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGVhcnByb2opOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEdyaWREYXRhIGdkaGZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZGhzcGFuKCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuICkKLSAgICB7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLSAgICAgICAgcmV0dXJuIGdkOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRUb0VhckxhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdCdXR0b25MYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZWFyUHJvamVjdExhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlYXJNZW1iZXJTaGlwOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRWFyU2VsZWN0aW9uUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAJaWYoc3luY2hoZWxwZXIgIT0gbnVsbCl7Ci0gICAgCQlzeW5jaGhlbHBlci5kaXNwb3NlKCk7Ci0gICAgCQlzeW5jaGhlbHBlciA9IG51bGw7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21ib1RleHQoKXsKLSAgICAJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjMzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNBUCBBRyAtIGFkZGluZyBrZXlib2FyZCBzaG9ydGN1dHMJCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1hZGRUb0VhckxhYmVsID0gQWRkICZwcm9qZWN0IHRvIGFuIEVBUgotbmV3QnV0dG9uTGFiZWwgPSBOZSZ3Li4uCi1lYXJQcm9qZWN0TGFiZWw9RUFSIHAmcm9qZWN0IG5hbWU6Ci1lYXJNZW1iZXJTaGlwPUVBUiBtZW1iZXJzaGlwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9SdW50aW1lTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzZDI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9SdW50aW1lTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMKLQotICAgIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SVU5USU1FMSA9ICJydW50aW1lMSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SVU5USU1FMiA9ICJydW50aW1lMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NT0RVTEVfUFJPSkVDVCA9ICJtb2R1bGVQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0IHJlc29sdXRpb25zID0gbmV3IEFycmF5TGlzdCggMiApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IGVhclByb2plY3QgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZWFyRmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIGVhclByb2plY3QgKTsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IG1vZFByb2plY3QgPSBnZXRNb2R1bGVQcm9qZWN0KCBtYXJrZXIgKTsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBtb2RGYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggbW9kUHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IGdldFJ1bnRpbWVzKCBtYXJrZXIgKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZWFyRmFjZXRlZFByb2plY3QuaXNUYXJnZXRhYmxlKCBydW50aW1lICkgJiYgCi0gICAgICAgICAgICAgICAgICAgIG1vZEZhY2V0ZWRQcm9qZWN0LmlzVGFyZ2V0YWJsZSggcnVudGltZSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc29sdXRpb24gcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUmVzb2x1dGlvbiggZWFyRmFjZXRlZFByb2plY3QsIG1vZEZhY2V0ZWRQcm9qZWN0LCBydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9ucy5hZGQoIHJlc29sdXRpb24gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEoyRUVVSVBsdWdpbi5sb2dFcnJvciggLTEsIG51bGwsIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSU1hcmtlclJlc29sdXRpb25bXSBhcnJheSA9IG5ldyBJTWFya2VyUmVzb2x1dGlvblsgcmVzb2x1dGlvbnMuc2l6ZSgpIF07Ci0gICAgICAgIHJlc29sdXRpb25zLnRvQXJyYXkoIGFycmF5ICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0IGdldE1vZHVsZVByb2plY3QoIGZpbmFsIElNYXJrZXIgbWFya2VyICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtb2R1bGVQcm9qZWN0TmFtZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoIEFUVFJfTU9EVUxFX1BST0pFQ1QsIG51bGwgKTsKLSAgICAgICAgcmV0dXJuIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBtb2R1bGVQcm9qZWN0TmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGdldFJ1bnRpbWVzKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0IHJ1bnRpbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgSVJ1bnRpbWUgciA9IGdldFJ1bnRpbWVCeU5hbWUoIG1hcmtlci5nZXRBdHRyaWJ1dGUoIEFUVFJfUlVOVElNRTEsIG51bGwgKSApOwotICAgICAgICBpZiggciAhPSBudWxsICkgcnVudGltZXMuYWRkKCByICk7Ci0gICAgICAgIAotICAgICAgICByID0gZ2V0UnVudGltZUJ5TmFtZSggbWFya2VyLmdldEF0dHJpYnV0ZSggQVRUUl9SVU5USU1FMiwgbnVsbCApICk7Ci0gICAgICAgIGlmKCByICE9IG51bGwgKSBydW50aW1lcy5hZGQoIHIgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBydW50aW1lczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZUJ5TmFtZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgaWYoIFJ1bnRpbWVNYW5hZ2VyLmlzUnVudGltZURlZmluZWQoIG5hbWUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lKCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvbHV0aW9uCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdCBlYXJQcm9qZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdCBtb2R1bGVQcm9qZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lIHJ1bnRpbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUmVzb2x1dGlvbiggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGVhclByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgbW9kdWxlUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVhclByb2plY3QgPSBlYXJQcm9qZWN0OwotICAgICAgICAgICAgdGhpcy5tb2R1bGVQcm9qZWN0ID0gbW9kdWxlUHJvamVjdDsKLSAgICAgICAgICAgIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy51c2VTYW1lUnVudGltZSwgdGhpcy5ydW50aW1lLmdldExvY2FsaXplZE5hbWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldFJ1bnRpbWUoIHRoaXMuZWFyUHJvamVjdCwgdGhpcy5ydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgc2V0UnVudGltZSggdGhpcy5tb2R1bGVQcm9qZWN0LCB0aGlzLnJ1bnRpbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvciggbnVsbCwgUmVzb3VyY2VzLmVycm9yRGlhbG9nVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZXJyb3JEaWFsb2dNZXNzYWdlLCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRSdW50aW1lKCBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIGN1cnJlbnRQcmltYXJ5UnVudGltZSA9IGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjdXJyZW50UHJpbWFyeVJ1bnRpbWUgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAhIGN1cnJlbnRQcmltYXJ5UnVudGltZS5nZXROYW1lKCkuZXF1YWxzKCBydW50aW1lLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBmcHJvai5pc1RhcmdldGVkKCBydW50aW1lICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnByb2ouYWRkVGFyZ2V0ZWRSdW50aW1lKCBydW50aW1lLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZwcm9qLnNldFByaW1hcnlSdW50aW1lKCBydW50aW1lLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlU2FtZVJ1bnRpbWU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nTWVzc2FnZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFJ1bnRpbWVNaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1J1bnRpbWVNaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjAzZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXVzZVNhbWVSdW50aW1lID0gU3dpdGNoIGJvdGggcHJvamVjdHMgdG8gezB9Ci1lcnJvckRpYWxvZ1RpdGxlID0gRXJyb3IKLWVycm9yRGlhbG9nTWVzc2FnZSA9IEZhaWxlZCB3aGlsZSBhcHBseWluZyB0aGUgcXVpY2sgZml4LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5UHJvamVjdEZpcnN0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQ1ODc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50RmFjZXRDcmVhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsaXR5UHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihkYXRhTW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoUmVzb3VyY2VzLnBhZ2VUaXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24pOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX1VUSUxJVFlfV0laQVJEX1AxKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLQotCQlzdGF0aWMgewotCQkJaW5pdGlhbGl6ZU1lc3NhZ2VzKFV0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNmRlMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBhZ2VUaXRsZSA9IFV0aWxpdHkgTW9kdWxlCi1wYWdlRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdXRpbGl0eSBtb2R1bGUgc2V0dGluZ3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjQyY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLk5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBVdGlsaXR5UHJvamVjdFdpemFyZCBleHRlbmRzIE5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZCB7Ci0KLQlwdWJsaWMgVXRpbGl0eVByb2plY3RXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKLQl9Ci0JCi0JcHVibGljIFV0aWxpdHlQcm9qZWN0V2l6YXJkKCl7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIik7Ci0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL3V0aWwtd2l6LWJhbm5lci5naWYiKTsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC51dGlsaXR5Iik7Ci0JfQotCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBVdGlsaXR5UHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9VVElMSVRZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjYmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5hcHBjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVNYWluQ2xhc3M7Ci0JCi0JcHVibGljIEFwcENsaWVudEZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJhcHBjbGllbnQuZmFjZXQuaW5zdGFsbC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9QUk9KRUNUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9TRVRUSU5HUykpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtFQVJfUFJPSkVDVF9OQU1FLCBDT05GSUdfRk9MREVSLCBDUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19BUFBDTElFTlRfV0laQVJEX1AzKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQljcmVhdGVNYWluQ2xhc3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJY3JlYXRlTWFpbkNsYXNzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9DUkVBVEVfTUFJTikpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNyZWF0ZU1haW5DbGFzcywgQ1JFQVRFX0RFRkFVTFRfTUFJTl9DTEFTUywgbnVsbCk7Ci0JCQotICAgICAgICBjcmVhdGVHZW5lcmF0ZURlc2NyaXB0b3JDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgICAgICAgcmVnaXN0ZXJGYWNldFZlcnNpb25DaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICAKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGYWNldFZlcnNpb25DaGFuZ2VkRXZlbnQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VUX1ZFUlNJT04gKTsKLSAgICAgICAgYm9vbGVhbiBpc0pFRTVPckdyZWF0ZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChmdi5nZXRWZXJzaW9uU3RyaW5nKCkpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0gICAgICAgIHRoaXMuYWRkREQuc2V0VmlzaWJsZShpc0pFRTVPckdyZWF0ZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RGaXJzdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzViZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRQcm9qZWN0Rmlyc3RQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBBcHBDbGllbnRQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfUFJPSkVDVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfUFJPSkVDVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QMSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmZhNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQotCXB1YmxpYyBBcHBDbGllbnRQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX1BST0pFQ1RfV0laX1RJVExFKSk7Ci0JfQotCi0JcHVibGljIEFwcENsaWVudFByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfUFJPSkVDVF9XSVpfVElUTEUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQpOwotCQlmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCJpY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCX0KLQotCXByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKCJ0ZW1wbGF0ZS5qc3QuYXBwY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudFByb2plY3RGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9BUFBDTElFTlQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qYXZhZG9jLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvamF2YWRvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2EwM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qYXZhZG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IGRlZmF1bHQ9ImphdmFkb2MiPgotICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+Ci0gICAgICAgIDxqYXZhZG9jIGFjY2Vzcz0icHJvdGVjdGVkIiBhdXRob3I9ImZhbHNlIiBjbGFzc3BhdGg9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9iaW47Li4vb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2JpbjsuLi9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBcY29yZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyXzEuMC4wXHVyaXJlc29sdmVyLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpXzIuMS4wXHJ1bnRpbWVcZWRpdC51aS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Qud3NkbF8xLjAuMFx3c2RsLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmVkaXRvcnNfMy4xLjBcZWRpdG9ycy5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xjb20uaWJtLnd0cC5jb21tb24udXRpbF8xLjAuMVx1dGlsLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0XzIuMS4wXHJ1bnRpbWVcZWNvcmUuZWRpdC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyXzEuMC4wXHhtbGNhdGFsb2cuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkud29ya2JlbmNoXzMuMS4wXHdvcmtiZW5jaC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eV8zLjAuMFxjb21wYXRpYmlsaXR5LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXGNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2hfMS4wLjEuMVxlbWZ3b3JrYmVuY2guamFyOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuZWRpdF8yLjEuMFxydW50aW1lXGVkaXQuamFyOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2hfMS4wLjEuMVx3b3JrYmVuY2guamFyOy4uL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2JpbjsuLi9vcmcuZWNsaXBzZS53c3Qud2ViL2JpbjsuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLnVpL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5jb3JlXzMuMS4wXGpkdGNvcmUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxvc2dpLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWlfMi4wLjFccnVudGltZVxjb21tb24udWkuamFyOy4uL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuY29kZWdlbl8yLjEuMFxydW50aW1lXGNvZGVnZW4uamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuaWRlXzMuMS4wXGlkZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZHQudWlfMy4xLjBcamR0LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmplbV8xLjAuMVxqYXZhaW5zdC5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBcZGVmYXVsdEFkYXB0b3IuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uuc3d0LndpbjMyXzMuMS4wXHdzXHdpbjMyXHN3dC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXHJlc29sdmVyLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC53c2RsXzEuMC4wXGphcnNcd3NkbDRqLmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UueHNkXzIuMS4wXHJ1bnRpbWVceHNkLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlLnRleHRfMy4xLjBcamZhY2V0ZXh0LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yXzMuMS4wXHRleHRlZGl0b3IuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkudmlld3NfMy4xLjBcdmlld3MuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXNfMy4xLjBccmVzb3VyY2VzLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29udGVudG1vZGVsXzEuMC4wXGNvbnRlbnRtb2RlbC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS50ZXh0XzMuMS4wXHRleHQuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcl8xLjAuMFxwYXJzZXIuamFyOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlL2JpbjsuLi9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxlY2xpcHNlQWRhcHRvci5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9ydW50aW1lL2oyZWUuamFyOy4uL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzXzMuMS4wXGZpbGVidWZmZXJzLmphcjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gvYmluOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24ubWlncmF0aW9uL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC53ZWJicm93c2VyXzEuMC4wXHdlYmJyb3dzZXIuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamVtXzEuMC4xXG1vZmphdmEuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlXzMuMC4wXHNlcnZlcmNvcmUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmNvbW1vbl8yLjEuMFxydW50aW1lXGNvbW1vbi5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpXzMuMC4wXHNlcnZlcnVpLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmdfMy4xLjBcbGF1bmNoaW5nLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC53c2RsXzEuMC4wXGphcnNccW5hbWUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWlfMy4xLjBcdWkuamFyOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9iaW47Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZV8yLjEuMFxydW50aW1lXGNvZGVnZW4uZWNvcmUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmdfMy4xLjBccmVmY29yZS5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYmluO2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucnVudGltZV8zLjEuMFxydW50aW1lLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBcY29uc29sZS5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYmluOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3JfMy4wLjBcY29uZmlndXJhdG9yLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWlfMi4xLjBccnVudGltZVxlY29yZS54bWkuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamZhY2VfMy4xLjBcamZhY2UuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXzIuMS4wXHJ1bnRpbWVcZWNvcmUuamFyOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjBcc2phdmFjb3JlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmdfMS4wLjBcZW5jb2RpbmdyZXNvdXJjZS5qYXIiIGRlc3RkaXI9IkQ6XERldmVsb3BtZW50XHd0cF9hcGlfZG9jcyIgbm9kZXByZWNhdGVkPSJmYWxzZSIgbm9kZXByZWNhdGVkbGlzdD0iZmFsc2UiIG5vaW5kZXg9ImZhbHNlIiBub25hdmJhcj0iZmFsc2UiIG5vdHJlZT0iZmFsc2UiIHBhY2thZ2VuYW1lcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLG9yZy5lY2xpcHNlLmpzdC5lamIudWkiIHNvdXJjZXBhdGg9ImoyZWVfdWk7Li4vb3JnLmVjbGlwc2UuanN0LmVqYi51aS9wcm9wZXJ0eV9maWxlczsuLi9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcztwcm9wZXJ0eV9maWxlczsuLi9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpOy4uL29yZy5lY2xpcHNlLmpzdC5lamIudWkvZWpiX3VpOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlczsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpIiBzcGxpdGluZGV4PSJ0cnVlIiB1c2U9InRydWUiIHZlcnNpb249InRydWUiLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4ODI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWoyZWU9SmF2YSBFRQotY2xpZW50Lmphci5maWxlX3VpXz1BcHAgQ2xpZW50IEpBUiBmaWxlCi1jbGllbnQuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgYW4gZXh0ZXJuYWwgQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlIGludG8gYW4gQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QKLWNsaWVudC5leHBvcnQuZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBpbnRvIGFuIEFwcGxpY2F0aW9uIENsaWVudCBKQVIgZmlsZQotZWFyLmZpbGVfdWlfPUVBUiBmaWxlCi1lYXIuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgYW4gZXh0ZXJuYWwgRUFSIGZpbGUgaW50byBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QKLQotZWFyLmV4cG9ydC5kZXNjcmlwdGlvbl91aV89RXhwb3J0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuIEVBUiBmaWxlCi1qMmVlLmNhdGVnb3J5X3VpXz1KYXZhIEVFCi1qMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfPUFjdGlvbnMgZm9yIEphdmEgRUUgRGV2ZWxvcG1lbnQKLWNyZWF0ZS5lbnRlcnByaXNlLmFwcGxpY2F0aW9uX3VpXz1DcmVhdGUgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotY3JlYXRlLmNsaWVudC5tb2R1bGVfdWlfPUNyZWF0ZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdAotZWpiLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBFSkIgSkFSIEZpbGUuLi4KLXV0aWxpdHlfamFyX2ltcG9ydF93aXphcmQ9SjJFRSBVdGlsaXR5IEphcgotZWFyX2NvbXBvbmVudF91aV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci1uZXcuZWFyLmNvbXBvbmVudC5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgSmF2YSBFRSBFQVIgcHJvamVjdAotYXBwY2xpZW50X2NvbXBvbmVudF91aV89QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLW5ldy5hcHBjbGllbnQuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBKYXZhIEVFIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci1KMkVFRGVwZW5kZW5jaWVzUGFnZS5uYW1lID0gSmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzCi11dGlsLXByb2plY3Qtd2l6YXJkLW5hbWUgPSBVdGlsaXR5IFByb2plY3QKLXV0aWwtcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBVdGlsaXR5IHByb2plY3QKLXV0aWxpdHkuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgb25lIG9yIG1vcmUgZXh0ZXJuYWwgKi5qYXIgZmlsZXMgYXMgSmF2YSBFRSBVdGlsaXR5IFByb2plY3RzIG9yICouamFycy4KLVdlYl9Qcm9qZWN0X1NldHRpbmdzPVdlYiBQcm9qZWN0IFNldHRpbmdzCi11cGRhdGUtZWFyLWxpYnJhcmllcz1VcGRhdGUgRUFSIExpYnJhcmllcwotdXBkYXRlLWVhci1saWJyYXJpZXMtdG9vbHRpcD1SZWNvbXB1dGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBFQVIgTGlicmFyaWVzIGNsYXNzcGF0aCBjb250YWluZXIuCi1lYXJMaWJyYXJpZXNDb250YWluZXJOYW1lPUVBUiBMaWJyYXJpZXMKLQotQnVuZGxlLU5hbWUuMCA9IFdUUCBKMkVFIFVJIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1qYXZhZWUudWkucG9wdXBNZW51PUphdmEgRUUgVG9vbHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlODRhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQgCi0gICAgIGlkPSJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHMiIAotICAgICBuYW1lPSJBcmNoaXZlIEV4cG9ydCBQYXJ0aWNpcGFudCBQYW5lbHMgRXh0ZW5zaW9uIFBvaW50IiAKLSAgICAgc2NoZW1hPSJzY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50UGFuZWxzLmV4c2QiLz4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFByb2plY3QgV2l6YXJkIENvbnRyaWJ1dGlvbnMgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkoyRUVVSVByb2plY3RXaXphcmRzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlajJlZS5jYXRlZ29yeV91aV8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiPgotICAgICAgPC9jYXRlZ29yeT4KLTwhLS0gRmxleGlibGUgUHJvamVjdCBXaXphcmQgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlZmxleGlibGUucHJvamVjdF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmEiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLSAgICAgICAgICAgID4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVuZXcuZmxleGlibGUucHJvamVjdC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+LS0+Ci08IS0tIEVBUiBDb21wb25lbnQgV2l6YXJkIC0tPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJWVhcl9jb21wb25lbnRfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVwcm9qZWN0IiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMzAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5lYXIuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0gICAgICA8L3dpemFyZD4KLTwhLS0gQXBwbGljYXRpb24gQ2xpZW50IENvbXBvbmVudCBXaXphcmQgLS0+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlYXBwY2xpZW50X2NvbXBvbmVudF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudC5BcHBDbGllbnRQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlcHJvamVjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iNDAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5hcHBjbGllbnQuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0gICAgICA8L3dpemFyZD4KLTwhLS0gVXRpbGl0eSBDb21wb25lbnQgV2l6YXJkIC0tPgotICAgICAgPHdpemFyZAotICAgICAgCQluYW1lPSIldXRpbC1wcm9qZWN0LXdpemFyZC1uYW1lIgotICAgICAgCQlpY29uPSJpY29ucy91dGlsLXdpei1pY29uLmdpZiIKLSAgICAgIAkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgCQlwcm9qZWN0PSJ0cnVlIgotICAgICAgCQlmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiCi0gICAgICAJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0V2l6YXJkIj4KLSAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5VdGlsaXR5UHJvamVjdFdpemFyZCI+Ci0gICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZXByb2plY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjYwIiAvPgotICAgICAgPC9jbGFzcz4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIAkldXRpbC1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0gICAgPC93aXphcmQ+Ci0gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAKLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBJbXBvcnQgV2l6YXJkIENvbnRyaWJ1dGlvbnMgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWNsaWVudC5qYXIuZmlsZV91aV8iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNsaWVudC5pbXBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgIDx3aXphcmQKLSAgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgIG5hbWU9IiVlYXIuZmlsZV91aV8iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWVhci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgIDx3aXphcmQKLSAgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldyIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy91dGlsLXdpei1pY29uLmdpZiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3IgotICAgICAgICAgICAgIG5hbWU9IiV1dGlsaXR5X2phcl9pbXBvcnRfd2l6YXJkIj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgCSV1dGlsaXR5LmltcG9ydC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgIDwvd2l6YXJkPgotICAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgICBuYW1lPSIlajJlZS5jYXRlZ29yeV91aV8iLz4gCi0gICAgICAgPC9leHRlbnNpb24+Ci0gICAgIAotICAgPCEtLSAgIDx3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9qYXJfb2JqLmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiV1dGlsaXR5X2phcl9pbXBvcnRfd2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkIj4KLSAgICAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCSAgICAgICAgPC9zZWxlY3Rpb24+Ci0JICA8L3dpemFyZD4gICAgIAotCSAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVJbXBvcnRfQ2xhc3NlcyIKLSAgICAgICAgICAgIGljb249IiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZCI+Ci0gICAgICAgICAKLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4gICAgICAgICAgICAgCi0gICA8L2V4dGVuc2lvbj4gLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gRXhwb3J0IFdpemFyZCBDb250cmlidXRpb25zICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWNsaWVudC5qYXIuZmlsZV91aV8iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNsaWVudC5leHBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVlYXIuZmlsZV91aV8iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWVhci5leHBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBuYW1lPSIlajJlZS5jYXRlZ29yeV91aV8iLz4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkucHJvamVjdE5hdHVyZUltYWdlcyAgICAtLT4KLTwhLS0gUHVycG9zZTogQXR0YWNoIGljb24gb3ZlcmxheXMgZm9yIEoyRUUgcHJvamVjdCBuYXR1cmVzIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLnByb2plY3ROYXR1cmVJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVqYlByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYiCi0gICAgICAgICAgICBuYXR1cmVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVhclByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hcHBDbGllbnRNb2RQcm9qZWN0TmF0dXJlSW1hZ2UiPgotICAgICAgPC9pbWFnZT4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLkNvbm5lY3Rvck1vZFByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndlYlByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLnd0cHVpQWN0aW9uIj4gCi0gICAgICA8bWFzdGVyT3BlcmF0aW9uCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVsZXRlIHRoZSBkZXBlbmRlbnQgSjJFRSBtb2R1bGVzIgotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5EZWxldGUiCi0gICAgICAgICAgICBwb3B1bGF0b3JDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuYWN0aW9ucy5KMkVFRGVsZXRlTW9kdWxlQWN0aW9uUG9wdWxhdG9yIgotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9uLnVpLklBY3Rpb25XVFBPcGVyYXRpb24iCi0gICAgICAgICAgICBuYW1lPSJEZWxldGUgSjJFRSBEZXBlbmRlbnQgTW9kdWxlcyIgCi0gICAgICAgICAgICBhbHdheXNFeGVjdXRlPSJ0cnVlIgotICAgICAgICAgICAgb3ZlcnJpZGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hY3Rpb25zLkphdmEuZGVsZXRlIj4KLSAgICAgICAgICAgIDxzZWxlY3Rpb25FbmFibGVtZW50PgotICAgICAgICAgICAgCTxvcj4KLSAgICAgICAgICAgIAkJPGFuZD4KLSAgICAgICAgICAgIAkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgCQkJCQkgYWRhcHRhYmxlPSJ0cnVlIiAvPgotCQkJCQk8b3I+Ci0JCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkJCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiCi0JCQkgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAvPiAKLQkJCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIgotCQkJICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIgLz4gCi0JCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkJCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIgotCQkJICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIgLz4gCi0JCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkJCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotCQkJICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIgLz4gCi0JCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkJCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotCQkJICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIgLz4gCi0JCQkgICAgICAgICAgICA8L29yPiAgICAgICAgICAgIAkJCQkJIAotICAgICAgICAgICAgCQk8L2FuZD4gCi0JICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0JICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuQXBwbGljYXRpb25DbGllbnQiPgotCSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLkNvbm5lY3RvciI+Ci0JICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRUpCSmFyIj4KLQkgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYkFwcCI+Ci0JICAgICAgICAgICAgICA8L29iamVjdENsYXNzPiAgICAgICAgICAgIAkJICAgICAgIAkJCi0gICAgICAgICAgICAJPC9vcj4KLQkJCTwvc2VsZWN0aW9uRW5hYmxlbWVudD4KLSAgICAgIDwvbWFzdGVyT3BlcmF0aW9uPgotCTwvZXh0ZW5zaW9uPiAgIAotCQotCQotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImVqYi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8dmlldyAKLSAgICAgICAgIAkgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLkoyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYmFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5KMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0ibW9kdWxlbWFwLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbiBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiIGFkYXB0YWJsZT0idHJ1ZSIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudSBsYWJlbD0iJWphdmFlZS51aS5wb3B1cE1lbnUiICBpZD0iamF2ZWVVSVBvcHVwTWVudUNhdGVnb3J5Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0ic2xvdDEiLz4gPCEtLSBOZXcvZmVhdHVyZWQgSmF2YSBFRSBhY3Rpb25zICAtLT4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0ic2xvdDIiLz4gPCEtLSBDcmVhdGUgZmlsZXMgY2F0ZWdvcnkgIC0tPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJzbG90MyIvPiA8IS0tIFByb2plY3QgY3JlYXRpb24oY2xpZW50cykgIC0tPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJzbG90NCIvPiA8IS0tIExlZ2FjeShKMkVFKSBhY3Rpb25zICAtLT4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgICA8IS0tIGFkZGl0aW9uYWwgb2JqZWN0IGNvbnRyaWJ1dGlvbiAtLT4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24gb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCIgYWRhcHRhYmxlPSJ0cnVlIiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuamF2YUVsZW1lbnQucG9wdXBNZW51Ij4KLSAgICAgICAgIDxtZW51IGxhYmVsPSIlamF2YWVlLnVpLnBvcHVwTWVudSIgaWQ9ImphdmVlVUlQb3B1cE1lbnVDYXRlZ29yeS5qYXZhRWxlbWVudCI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNsb3QxIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNsb3QyIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNsb3QzIi8+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yIG5hbWU9InNsb3Q0Ii8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5Gb3JjZUNsYXNzcGF0aFVwZGF0ZUFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJXVwZGF0ZS1lYXItbGlicmFyaWVzIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXVwZGF0ZS1lYXItbGlicmFyaWVzLXRvb2x0aXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5Gb3JjZUNsYXNzcGF0aFVwZGF0ZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJqYXZlZVVJUG9wdXBNZW51Q2F0ZWdvcnkvc2xvdDEiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9saWJyYXJ5X29iai5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5Gb3JjZUNsYXNzcGF0aFVwZGF0ZUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCSAgCQk8b3I+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC51dGlsaXR5IiAvPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2FkYXB0PgotCQk8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLTwhLS0gRUFSIEdyb3VwIENvbnRyaWJ1dGlvbnMgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5lYXJQcm9qZWN0QWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWVhci5maWxlX3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9ucy5JbXBvcnRFQVJBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci5pbXBvcnQubWVudS9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5pbXBvcnRFQVJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWVhci5maWxlX3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9ucy5FeHBvcnRFQVJBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci5leHBvcnQubWVudS9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5leHBvcnRFQVJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotPCEtLSBBcHBsaWNhdGlvbiBDbGllbnQgR3JvdXAgQ29udHJpYnV0aW9ucwotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuYXBwQ2xpZW50UHJvamVjdEFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVjbGllbnQuamFyLmZpbGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9ucy5JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLmltcG9ydC5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmltcG9ydEFwcENsaWVudEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlY2xpZW50Lmphci5maWxlX3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9ucy5FeHBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLmV4cG9ydC5tZW51L2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmV4cG9ydEFwcENsaWVudEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIC0tPgotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICBERVBMT1kgRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0iamF2YS5sYW5nLk9iamVjdCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuZGVwbG95Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlZGVwbG95X3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9yZV9leGVjdXRlLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVEZXBsb3lBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9ImRlcGxveUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvciI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgCi0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotIAotICAgICAKLTwhLS0gPT09PT09PT09PT0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY3lQYWdlID09PT09PT09PT09PSAtLT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgIAkJbmFtZT0iJUoyRUVEZXBlbmRlbmNpZXNQYWdlLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiPgotICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0JCQk8YW5kPgotCQkJCTxhZGFwdAotCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTxvcj4gCi0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC51dGlsaXR5IiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudCIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2FuZD4gCi0gICAgICAgICA8L2VuYWJsZWRXaGVuPiAgICAgICAgICAKLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgICAgPHBhZ2UKLSAgICAgIAkJYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJVdlYl9Qcm9qZWN0X1NldHRpbmdzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLkoyRUVQcm9wZXJ0aWVzUGFnZSIKLSAgICAgICAgICAgIGlkPSJKMkVFUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotCQkJPGFuZD4KLQkJCQk8YWRhcHQKLQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8b3I+IAotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0id3N0LndlYiIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FkYXB0PgotCQkJPC9hbmQ+IAotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgICAgICAgIAotICAgIDwvZXh0ZW5zaW9uPgotCi08IS0tICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCSAgCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFUmVuYW1lUGFydGljaXBhbnQiIAotCQkJCW5hbWU9IiVKMkVFX1JlbmFtZV9QYXJ0aWNpcGFudCI+IAotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PiAKLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCSAgCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQiIAotCQkJCW5hbWU9IkoyRUUgUmVuYW1lIFBhcnRpY2lwYW50Ij4gCi0JCTxlbmFibGVtZW50PiAKLQkJICAgCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotICAgICAgICAgICAgCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+IAotICAgICAgICAgICAgCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiIC8+ICAKLSAgICAgICAgICAgIAk8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgICAgdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4gCi0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+IC0tPgotCQotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0iJWoyZWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N2aWV3MTYvajJlZV9wZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGVyc3BlY3RpdmUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgPC9leHRlbnNpb24+CQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLz4KLSAgICAgICAgIDxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIi8+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJEZXZQZXJzcGVjdGl2ZSIvPgotICAgICAgIAotIAkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiLz4KLQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiLz4KLQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLnByb2plY3QuZmFjZXQuRWpiUHJvamVjdFdpemFyZCIvPgotCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCIvPgotCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiLz4KLQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViUHJvamVjdFdpemFyZCIvPgkJCQkKLSAgICAgIAk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCIvPgotICAgICAgCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlcnZsZXRXaXphcmQiLz4KLSAgICAgIAk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlc3Npb25CZWFuV2l6YXJkIi8+Ci0gICAgICAJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRNZXNzYWdlRHJpdmVuQmVhbldpemFyZCIvPgotICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXR5Ii8+ICAgICAgCQotICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIi8+Ci0gICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZm9sZGVyIi8+Ci0gICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZmlsZSIvPgotICAgICAgICA8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuYWN0aW9uU2V0Ii8+Ci0gICAgICAgIDxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmJyZWFrcG9pbnRBY3Rpb25TZXQiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJEZXZQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIi8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+CQotICAgIAotICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIj4KLQkJPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciIKLSAgICAgICAgIG5hbWU9IldvcmtpbmcgQ29weSBNYW5hZ2VyIC0gVUkgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGNvbnRleHQ9IlVJIgotICAgICAgICAgICAga2V5PSJ3b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLnVpLldUUFVJV29ya2luZ0NvcHlNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIiCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5DbGFzc0hlbHBlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAKLSAgICA8IS0tCi0gICAgICA8ZmFjdG9yeSAKLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5GYWNldGVkUHJvamVjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiID4KLSAgICAgICAgIAk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+Ci0gICAgICA8L2ZhY3Rvcnk+ICAgIAotICAgIC0tPgotICAgPC9leHRlbnNpb24+IAotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lYXIxIgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAKLSAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lYXIyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXI6MS40XSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICAgIAotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lYXIzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICAJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXI6MS40XSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgPC9leHRlbnNpb24+Ci0gICAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJqc3QuZWFyLmluc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJqc3QuYXBwY2xpZW50Lmluc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudEZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICA8L3dpemFyZC1wYWdlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbgotICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0JPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmRpZmZlcmVudFJ1bnRpbWVzRGV0ZWN0ZWQiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5SdW50aW1lTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucyI+Ci0gICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgotICA8L2V4dGVuc2lvbj4KLSAgICAgIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkNvbXBvbmVudFByb2plY3RNaWdyYXRvciI+Ci0gICAgICAgPG1pZ3JhdG9yRXh0ZW5zaW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICBrZXk9IlZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuVmFsaWRhdGVFZGl0TGlzdGVuZXIiCi0gICAgICAgICAgY29udGV4dD0iVUkiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24iPgotICAgIDxjbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uCi0gICAgICBhdHRyaWJ1dGVOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLnVpLkNsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uIj4KLSAgICA8L2NsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+Ci0gPC9leHRlbnNpb24+Ci0gCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24iPgotICAgIDxjbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uCi0gICAgICBhdHRyaWJ1dGVOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLnVpLkNsYXNzcGF0aE5vbkRlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uIj4KLSAgICA8L2NsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+Ci0gPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uCi0gICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KLQk8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvck1hcmtlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAudWkuQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zIj4KLSAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24KLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJQYWdlCi0gICAgICBuYW1lPSIlZWFyTGlicmFyaWVzQ29udGFpbmVyTmFtZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSTGlicmFyaWVzQ29udGFpbmVyUGFnZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGUuY29udGFpbmVyIj4KLSAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqIFdUUCBVc2VyIExpYnJhcnkgUHJvdmlkZXIgKgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIC0tPgotICAgICAgICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJyYXJ5UHJvdmlkZXJBY3Rpb25QYW5lbHMiPgotICAgIDxwYW5lbCAKLSAgICAgIHByb3ZpZGVyPSJ3dHAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwiLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmZkYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTZkZTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBhZ2VUaXRsZSA9IFV0aWxpdHkgTW9kdWxlCi1wYWdlRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdXRpbGl0eSBtb2R1bGUgc2V0dGluZ3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9lamJfZmlndXJlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9lamJfZmlndXJlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRhMzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX2ZpZ3VyZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfMD1OYXZpZ2F0aW9uCi1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV8xPU5hdmlnYXRpb24KLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzI9Q21yIEZpZWxkIC8gRm9yZWlnbiBLZXkKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzM9Q21yIEZpZWxkIC8gRm9yZWlnbiBLZXkKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzQ9RWRpdCBsZWZ0IGVuZAotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfNT1FZGl0IHJpZ2h0Ci1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV82PUVkaXQgbGVmdCBlbmQKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzc9RWRpdCByaWdodCBlbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2VqYl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzMzNTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUtFWV8wPUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLUtFWV8xPU5ldyBFSkIgUHJvamVjdAotS0VZXzI9RUpCIHZlcnNpb246Ci1LRVlfMz1FSkIgUHJvamVjdAotS0VZXzQ9Q3JlYXRlIGFuIEVKQiBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLUtFWV81PUltcG9ydCBhbiBFSkIgamFyIGZyb20gdGhlIGZpbGUgc3lzdGVtCi1LRVlfNj1FSkIgSmFyIEltcG9ydAotS0VZXzc9RUpCIEphciBmaWxlOgotS0VZXzg9RUpCIFByb2plY3Q6Ci1LRVlfOT1FSkIgSmFyIEV4cG9ydAotS0VZXzEwPUV4cG9ydCBFSkIgcHJvamVjdCB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1LRVlfMTE9RUpCIGNsaWVudCBKQVIgQ3JlYXRpb24KLUtFWV8xMj1Vc2UgdGhpcyB3aXphcmQgdG8gY3JlYXRlIGFuIEVKQiBjbGllbnQgSkFSIGZyb20geW91ciBleGlzdGluZyBFSkIKLUtFWV8xMz1DbGllbnQgSkFSIFVSSToKLUtFWV8xND1Qcm9qZWN0IG5hbWU6Ci1LRVlfMTU9UHJvamVjdCBsb2NhdGlvbjoKLUtFWV8xNj1FSkIgUHJvamVjdDoKLUtFWV8xNz1EZWxldGUgQmVhbiBPbmx5Ci1LRVlfMTg9RGVsZXRlIEJlYW4gQ2xhc3NlcwotS0VZXzE5PURlbGV0ZSBBY2Nlc3MgQmVhbgotS0VZXzIwPURlbGV0ZSBEZXBsb3llZCBDb2RlCi1LRVlfMjE9U2VsZWN0IEFsbAotS0VZXzIyPURlc2VsZWN0IEFsbAotS0VZXzIzPVRoZSBzZWxlY3RlZCBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCBpcyBpbnZvbHZlZCBpblxucmVsYXRpb25zaGlwcyB3aXRoIG90aGVyIGVudGVycHJpc2UgYmVhbnMuICBZb3UgbXVzdCBmaXJzdCBkZWxldGUgdGhlc2VcbnJlbGF0aW9uc2hpcHMgYmVmb3JlIGRlbGV0aW5nIHRoZSBiZWFuLgotS0VZXzI0PURlbGV0ZS4uLgotS0VZXzI1PUNhbm5vdCBkZWxldGUgRW50ZXJwcmlzZSBCZWFuCi1LRVlfMjY9Q2Fubm90IGRlbGV0ZSB0aGUgYmVhbiBuYW1lZCAiezB9IiBiZWNhdXNlIGl0IGlzIGluIGEgYmluYXJ5IHByb2plY3QuCi1LRVlfMjc9RGVsZXRlIEVudGVycHJpc2UgQmVhbihzKQotS0VZXzI4PVdoYXQgb3B0aW9ucyB3b3VsZCB5b3UgbGlrZSB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3RlZFxuRW50ZXJwcmlzZSBCZWFuKHMpPwotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8wPVNlc3Npb24KLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMT1FbnRpdHkKLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMj1NZXNzYWdlCi1OZXdFSkJQcm9qZWN0QWN0aW9uX1VJXzA9RUpCIFByb2plY3QKLU5ld0VKQk1vZHVsZUFjdGlvbl9VSV8wPUVKQiBQcm9qZWN0Ci1wYWdlVGl0bGU9RWpiIE1vZHVsZQotcGFnZURlc2NyaXB0aW9uPUNvbmZpZ3VyZSBlamIgbW9kdWxlIHNldHRpbmdzLgotY29uZmlnRm9sZGVyTGFiZWw9Q29uZmlnIEZvbGRlcjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV9lamJfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV9lamJfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNTY1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfZWpiX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMD1TZXNzaW9uCi1Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzE9RW50aXR5Ci1Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzI9TWVzc2FnZQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjFhMGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMT1Qcm9qZWN0IGxvY2F0aW9uOgotMj1UYXJnZXQgcnVudGltZToKLTM9SjJFRSB2ZXJzaW9uOgotND1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi01PU5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLTY9RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci03PUNyZWF0ZSBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBtb2R1bGUgcHJvamVjdHMuCi04PUVBUiBNb2R1bGUgUHJvamVjdHMKLTk9U2VsZWN0IHRoZSBtb2R1bGUgcHJvamVjdHMgdG8gYWRkIHRvIHRoZSBuZXcgRUFSIHByb2plY3QgZnJvbSB0aGUgbGlzdC4gXG5TZWxlY3QgTmV3IE1vZHVsZSBidXR0b24gdG8gY3JlYXRlIGEgbmV3IG1vZHVsZSBwcm9qZWN0LgotMTA9JlNlbGVjdCBBbGwKLTExPSZEZXNlbGVjdCBBbGwKLTEyPU5ldyAmTW9kdWxlLi4uCi0xMz1FQVIgcHJvamVjdDoKLTE0PU4mZXcuLi4KLTE0YT1OZSZ3Li4uCi0xNT1BZGQgbW9kdWxlIHRvIGFuIEVBUiBhcHBsaWNhdGlvbi4KLTE2PU5ldyBNb2R1bGUgUHJvamVjdAotMTc9Q3JlYXRlIGEgbmV3IG1vZHVsZSBwcm9qZWN0IGZvciB0aGUgc2VsZWN0ZWQgbW9kdWxlIHR5cGUKLTE4PU5ldyBNb2R1bGUgUHJvamVjdAotMTk9Q3JlYXRlIGRlZmF1bHQgbW9kdWxlIHByb2plY3RzLgotMjA9QXBwbGljYXRpb24gQ2xpZW50IHByb2plY3Q6Ci0yMT1FSkIgcHJvamVjdDoKLTIyPVdlYiBwcm9qZWN0OgotMjM9Q29ubmVjdG9yIHByb2plY3Q6Ci0yND1OZXcgQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLTI1PUFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUKLTI2PUNyZWF0ZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotMjc9TW9kdWxlIERlcGVuZGVuY2llcwotMjg9U2VsZWN0IGRlcGVuZGVudCBKQVJzIGZvciB0aGUgbW9kdWxlIHdpdGhpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LgotMjk9QXZhaWxhYmxlIGRlcGVuZGVudCBKQVJzOgotMzA9TWFuaWZlc3QgQ2xhc3MtUGF0aDoKLTMxPUpBUi9Nb2R1bGUKLTMyPVByb2plY3Q6Ci0zMz1OZXcKLTM0PUltcG9ydCBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBmcm9tIHRoZSBmaWxlIFN5c3RlbQotMzU9QXBwbGljYXRpb24gQ2xpZW50IEltcG9ydAotMzY9QXBwbGljYXRpb24gQ2xpZW50IGZpbGU6Ci0zNz1BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDoKLTM4PUltcG9ydAotMzk9SW1wb3J0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBiYXNlZCBvbiBzZWxlY3RlZCByZXNvdXJjZXMuCi00MD1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIEltcG9ydAotNDE9RUFSIGZpbGU6Ci00Mj1PdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZy4KLTQzPVByb2plY3QgaW1wb3J0Ci00ND1PcHRpbWl6ZWQ6IG1ha2UgYmluYXJ5IHByb2plY3RzIGZvciBFSkIsIGNsaWVudCwgYW5kIHV0aWxpdHkgSkFScwotNDU9RXhwYW5kZWQ6IGV4dHJhY3QgcHJvamVjdCBjb250ZW50cyBmb3IgZGV2ZWxvcG1lbnQKLTQ2PUltcG9ydCBmb3IgcGFydGlhbCBFQVIgZGV2ZWxvcG1lbnQKLTQ3PVNlbGVjdCBBbGwKLTQ4PURlc2VsZWN0IEFsbAotNDk9VXRpbGl0eSBKQVJzIGFuZCB3ZWIgbGlicmFyaWVzCi01MD1TZWxlY3QgdGhlIHV0aWxpdHkgSkFScyBmcm9tIHRoZSBsaXN0IHRvIGJlIGltcG9ydGVkIGFzIHV0aWxpdHkgcHJvamVjdHMuIFVuc2VsZWN0ZWQgSkFScyB3aWxsIGJlIGltcG9ydGVkIGFzIFxudXRpbGl0eSBKQVJzIGluIHRoZSBFQVIuCi01MT1FbnRlciB0aGUgbmV3IHByb2plY3QgbmFtZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIGltcG9ydGVkIG1vZHVsZSBmaWxlIGJ5IHNlbGVjdGluZyB0aGUgc2Vjb25kIGNvbHVtbiBvZiB0aGUgdGFibGUgZm9yIGVkaXQuCi01Mj1FQVIgTW9kdWxlIGFuZCBVdGlsaXR5IEpBUiBQcm9qZWN0cwotNTM9UHJvamVjdCBsb2NhdGlvbnMKLTU0PVRoaXMgaXMgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIGFsbCByZWZlcmVuY2VkIHByb2plY3RzLiBBIHN1YmRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggcHJvamVjdC4KLTU1PU1vZHVsZSBSb290IExvY2F0aW9uOgotCi01Nz1TZWxlY3QgdGhlIGxvY2F0aW9uIGRpcmVjdG9yeQotNTg9TW9kdWxlcyBpbiBFQVIKLTU5PU5ldyBQcm9qZWN0IE5hbWUKLTYwPWZpbGVuYW1lcwotNjE9cHJvamVjdG5hbWVzCi02Mj1EZXN0aW5hdGlvbjoKLTYzPU92ZXJ3cml0ZSBleGlzdGluZyBmaWxlCi02ND1FeHBvcnQgc291cmNlIGZpbGVzCi02NT1BcHBsaWNhdGlvbiBDbGllbnQgRXhwb3J0Ci02Nj1FeHBvcnQgQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotNjc9RXhwb3J0Ci02OD1FQVIgRXhwb3J0Ci02OT1FeHBvcnQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLTcwPUluY2x1ZGUgcHJvamVjdCBidWlsZCBwYXRocyBhbmQgbWV0YS1kYXRhIGZpbGVzCi03MT1JZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCB0aGUgZXhwb3J0ZWQgRUFSIG1haW50YWlucyBwcm9qZWN0IG5hbWVzIGFuZCBleHRlcm5hbCBjbGFzc3BhdGggZGVwZW5kZW5jaWVzLCB3aGljaCBhcmUgdXNlZnVsIGZvciBsYXRlciBpbXBvcnRpbmcgdGhlIEVBUiBpbnRvIGJpbmFyeSBwcm9qZWN0cy4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiBhbmQgbGF0ZXIgaW1wb3J0IHRoZSBFQVIsIG9ubHkgYmluYXJ5IHByb2plY3RzIGFyZSBjcmVhdGVkLgotNzI9SW5jbHVkZQotNzQ9QWxsb3cgbmVzdGVkIHByb2plY3RzIG92ZXJ3cml0ZXMgKG1vZHVsZSBhbmQgdXRpbGl0eSBwcm9qZWN0cykKLTc1PURlbGV0ZSBwcm9qZWN0IG9uIG92ZXJ3cml0ZQotNzY9RUFSIHByb2plY3Q6Ci0KLSNtaWdyYXRpb24gc3RyaW5ncwotNzc9RXJyb3IKLTc4PUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHBlcmZvcm1pbmcgdGhlIHNlbGVjdGVkIGFjdGlvbi4KLTc5PUJpbmFyeSBQcm9qZWN0Ci04MD1UaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGlvbiwgd2hpY2ggaXMgcGFydCBvZiBhIGJpbmFyeSBwcm9qZWN0LgotODE9SW5mb3JtYXRpb24KLTgyPVRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgotCi05MD1DcmVhdGUgYW4gRUpCIENsaWVudCBKQVIgbW9kdWxlIHRvIGhvbGQgdGhlIGNsaWVudCBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzLgotOTE9R2VuZXJhdGUgYW4gYW5ub3RhdGVkIGJlYW4gY2xhc3MKLTkyPUFkZCBzdXBwb3J0IGZvciBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzCi05Mz1CJnJvd3NlLi4uCi05ND1OYSZtZToKLTk1PUNyZWF0ZSBhIGRlZmF1bHQgTWFpbiBjbGFzcwotOTY9Q3JlYXRlIGEgZGVmYXVsdCBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuCi05OD1HZW5lcmF0ZSBhIFhEb2NsZXQgYW5ub3RhdGVkIGNsYXNzCi0KLTk3PVNlbGVjdCB0aGUgdXRpbGl0eSBKQVJzIGZyb20gdGhlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgYXMgdXRpbGl0eSBwcm9qZWN0cyBvciBqYXJzLgotOTk9UHJvamVjdCBOYW1lOgotMTAwPU1vZHVsZSBWZXJzaW9uOgotMTAxPUNvbmZpZ3VyZSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIHNldHRpbmdzLgotMTAyPUNvbnRlbnQgRm9sZGVyOgotMTAzPVRhcmdldCBydW50aW1lCi1FbnRpdHlfVUlfPUVudGl0eSBCZWFucygxLngtMi54KQotTWVzc2FnZV9Ecml2ZW5fQmVhbnNfVUlfPU1lc3NhZ2UtRHJpdmVuIEJlYW5zCi1TZXNzaW9uX0JlYW5zX1VJXz1TZXNzaW9uIEJlYW5zCi1FSkJfQ2xhc3NfVUlfPUVKQiBDbGFzczogezB9Ci1Ib21lX0ludGVyZmFjZV9VSV89SG9tZSBJbnRlcmZhY2U6IHswfQotU2VydmljZV9FbmRwb2ludF9JbnRlcmZhY2VfVUlfPVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiB7MH0KLVByaW1hcnlfS2V5X0NsYXNzX1VJXz1QcmltYXJ5IEtleSBDbGFzczogezB9Ci1SZWZhY3RvcmluZ05vSW5pdD1SZWZhY3RvcmluZyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkKLVJlbW90ZV9JbnRlcmZhY2VfVUlfPVJlbW90ZSBJbnRlcmZhY2U6IHswfQotTG9jYWxfSW50ZXJmYWNlX1VJXz1Mb2NhbCBJbnRlcmZhY2U6IHswfQotTG9jYWxfSG9tZV9JbnRlcmZhY2VfVUlfPUxvY2FsIEhvbWUgSW50ZXJmYWNlOiB7MH0KLURlbGV0ZV9VSV89RGVsZXRlLi4uCi1Qcm9qZWN0X3Nob3VsZF9ub3RfYmVfbnVsbF8xX0VYQ189SVdBRTAwMjFFIFByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsCi1Ob24tcHJvamVjdF9pbl9zZWxlY3Rpb25fMl9FWENfPUlXQUUwMDIyRSBOb24tcHJvamVjdCBpbiBzZWxlY3Rpb24KLVByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXz1JV0FFMDA1MkUgUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IuCi1VdGlsaXR5X0pBUnNfVUlfPVV0aWxpdHkgSkFScwotRGVsZXRlXzE9RGVsZXRlLi4uCi1EZWxldGVfc2VsZWN0ZWRfcHJvamVjdChzKV8yPURlbGV0ZSBzZWxlY3RlZCBwcm9qZWN0KHMpCi1SZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzM9UmVtb3ZlIG1vZHVsZShzKSBmcm9tIGFsbCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotUmVtb3ZlX21vZHVsZShzKV9mcm9tX2FsbF9vdGhlcl9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc180PVJlbW92ZSBtb2R1bGUocykgZnJvbSBhbGwgb3RoZXIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbW92ZV9tb2R1bGVfZGVwZW5kZW5jaWVzX3JlZmVyZW5jaW5nX3NlbGVjdGVkX3Byb2plY3QocylfNT1SZW1vdmUgbW9kdWxlIGRlcGVuZGVuY2llcyByZWZlcmVuY2luZyBzZWxlY3RlZCBwcm9qZWN0KHMpCi1EZWxldGVfTW9kdWxlX09wdGlvbnNfNj1EZWxldGUgTW9kdWxlIE9wdGlvbnMKLURlbGV0ZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNz1EZWxldGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBPcHRpb25zCi1EZWxldGVfY291bGRfbm90X2JlX2NvbXBsZXRlZF84PURlbGV0ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkCi1EZWxldGVfZXJyb3JfOT1EZWxldGUgZXJyb3IKLVdoYXRfd291bGRfeW91X2xpa2VfdG9fZGVsZXRlX18xMD1XaGF0IHdvdWxkIHlvdSBsaWtlIHRvIGRlbGV0ZT8KLURlbGV0ZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Qocylfb25seV8xMT1EZWxldGUgc2VsZWN0ZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0KHMpIG9ubHkKLUFsc29fZGVsZXRlX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEyPUFsc28gZGVsZXRlIG1vZHVsZSBhbmQgdXRpbGl0eSBKYXZhIHByb2plY3RzCi1EZWxldGVfc2VsZWN0ZWRfcHJvamVjdChzKV9vbmx5XzEzPURlbGV0ZSBzZWxlY3RlZCBwcm9qZWN0KHMpIG9ubHkKLUFsc29fZGVsZXRlX3JlZmVyZW5jZXNfdG9fc2VsZWN0ZWRfcHJvamVjdChzKV8xND1BbHNvIGRlbGV0ZSByZWZlcmVuY2VzIHRvIHNlbGVjdGVkIHByb2plY3QocykKLUNVU1RPTV9ERUxFVEVfTUlYX01BVENIX1VJXz1UaGUgY3VzdG9tIEphdmEgRUUgZGVsZXRlIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBKYXZhIEVFIHByb2plY3RzLiAgVGhlIHN0YW5kYXJkIGRlbGV0ZSBvcHRpb25zIHdpbGwgYmUgdXNlZC4KLURFUExPWV9ESUFMT0dfVElUTEU9SjJFRSBEZXBsb3ltZW50Ci1ERVBMT1lfRVJST1JfVEVYVD1JV0FFMDAwMUUgRXJyb3I6Ci1ERVBMT1lfV0FSTklOR19URVhUPVdhcm5pbmc6Ci1ERVBMT1lfSU5GT19URVhUPUlXQUUwMDAySSBJbmZvOgotREVQTE9ZX09LX1RFWFQ9T2s6Ci1ERVBMT1lNRU5UX0lOX1BST0dSRVNTPURlcGxveW1lbnQgb3BlcmF0aW9uIGluIHByb2dyZXNzLi4uCi1ERVBMT1lfU1VDQ0VTU19SRVBPUlQ9RGVwbG95bWVudCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCi1ERVBMT1lfV0FSTklOR1NfUkVQT1JUPURlcGxveW1lbnQgZmluaXNoZWQgd2l0aCB3YXJuaW5nczsgc2VlIGxvZyBmaWxlcyBmb3IgZGV0YWlscy4KLURFUExPWV9FUlJPUlNfUkVQT1JUPURlcGxveW1lbnQgZmluaXNoZWQgd2l0aCBlcnJvcnM7IHNlZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMuCi1ERVBMT1lfUFJPSkVDVF9OT1RfRk9VTkQ9Q2Fubm90IGdldCBoYW5kbGUgdG8gdGhlIHByb2plY3QuCi1ERVBMT1lfUlVOVElNRV9OT1RfRk9VTkQ9VGFyZ2V0IHJ1bnRpbWUgbm90IGNvbmZpZ3VyZWQgZm9yIHByb2plY3QgezB9LgotREVQTE9ZX1JVTlRJTUVfQ09ORklHVVJFRD1UYXJnZXQgcnVudGltZSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseSBmb3IgcHJvamVjdCB7MH0uCi1ERVBMT1lfUFJPSkVDVF9OT1RfU1VQUE9SVEVEPVByb2plY3QgezB9IGNhbm5vdCBiZSBkZXBsb3llZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQgcnVudGltZS4KLQotTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5hcHBDbGllbnQ9QXBwbGljYXRpb24gQ2xpZW50Ci1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmVqYj1FbnRlcnByaXNlIEphdmEgQmVhbgotTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS53ZWI9V2ViCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmpjYT1Db25uZWN0b3IKLQotTmV3QXBwbENsaWVudE1vZHVsZUFjdGlvbl9VSV8wPUFwcGxpY2F0aW9uIENsaWVudCBNb2R1bGUKLU5ld0NvbnRleHRSb290PU5ldyBjb250ZXh0IHJvb3Q6Ci1OZXdFQVJNb2R1bGVBY3Rpb25fVUlfMD1FQVIgTW9kdWxlCi1KMkVFUHJvamVjdENyZWF0aW9uUGFnZV9VSV8wPUhpZGUgJkFkdmFuY2VkIDw8Ci1KMkVFUHJvamVjdENyZWF0aW9uUGFnZV9VSV8xPVNob3cgJkFkdmFuY2VkID4+Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMD1VdGlsaXR5IEphciBJbXBvcnQKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8xPUltcG9ydCBkZXBlbmRlbnQgVXRpbGl0eSBKYXJzIGZvciBKYXZhIEVFIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMj1BdmFpbGFibGUgVXRpbGl0eSBKYXJzIERpcmVjdG9yeQotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzM9RXh0ZXJuYWwgSmFyIERpcmVjdG9yeToKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV80PUxpbmtlZCBQYXRoIFZhcmlhYmxlCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNT1NYWtlIHRoZXNlIGltcG9ydGVkIGZpbGVzIHRlYW0tc2hhcmVhYmxlIGJ5IGNyZWF0aW5nIG9yIHJlLXVzaW5nIGEgTGlua2VkIFBhdGggVmFyaWFibGUgKExQVikuIFNlbGVjdCBhbiBleGlzdGluZyBMUFYgb3IgdHlwZSBhIG5ldyBuYW1lIHRvIGNyZWF0ZSBvbmUgdG8gdGhlIGRpcmVjdG9yeSBhYm92ZS4gT3RoZXIgdGVhbW1hdGVzIHNob3VsZCBkZWZpbmUgdGhpcyB2YWx1ZSB0aHJvdWdoIFdpbmRvdyA+IFByZWZlcmVuY2VzIHwgV29ya2JlbmNoID4gTGlua2VkIFJlc291cmNlcy4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgZm9yIGxpbmtlZCBpbXBvcnRzLgotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzY9T3ZlcndyaXRlIEV4aXN0aW5nIFJlc291cmNlcyAocHJvamVjdHMgYW5kIGFyY2hpdmVzKQotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzc9U2VsZWN0IFV0aWxpdHkgSmFyOgotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlLjA9VXNlIEV4aXN0aW5nIExpbmtlZCBQYXRoIFZhcmlhYmxlCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2UuMT1MaW5rZWQgUGF0aCBWYXJpYWJsZTogCi1FQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMD1pbmNsdWRlCi1FQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMT1maWxlCi1FQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMj1wcm9qZWN0Ci1FQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMz1TZWxlY3QgTmV3Ci0KLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMD1VdGlsaXR5IEphciBJbXBvcnQKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMT1JbXBvcnQgZGVwZW5kZW50IFV0aWxpdHkgSmFycyBmb3IgSmF2YSBFRSBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8yPVNlbGVjdCBpbXBvcnQgdHlwZQotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8zPUNyZWF0ZSBKYXZhIFByb2plY3RzIGZyb20gVXRpbGl0eSBKYXJzCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzQ9Q3JlYXRlIGxpbmtlZCBKYXZhIFByb2plY3RzIGZyb20gVXRpbGl0eSBKYXJzCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzU9Q29weSBVdGlsaXR5IEphcnMgaW50byBhbiBleGlzdGluZyBFQVIgZnJvbSBhbiBleHRlcm5hbCBsb2NhdGlvbgotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV82PUNyZWF0ZSBMaW5rZWQgVXRpbGl0eSBKYXJzIGluIGFuIGV4aXN0aW5nIEVBUiBmcm9tIGFuIGV4dGVybmFsIGxvY2F0aW9uCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzc9UHJvamVjdCBpbXBvcnQgb3B0aW9ucwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV84PVNlbGVjdCBFQVIgUHJvamVjdAotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV85PUVBUiBQcm9qZWN0OgotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xMD1DcmVhdGUgQmluYXJ5IFByb2plY3RzCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzExPU92ZXJyaWRlIFByb2plY3QgUm9vdCAoU3BlY2lmeSBsb2NhdGlvbiBiZWxvdykKLQotRGVwbG95bWVudF9EZXNjcmlwdG9yX1VJXz1EZXBsb3ltZW50IERlc2NyaXB0b3IKLQotUmVuYW1lXzE9UmVuYW1lCi1SZW5hbWVEb3REb3REb3Q9UmVuYW1lLi4uCi1SZW5hbWVfc2VsZWN0ZWRfcHJvamVjdF8yPVJlbmFtZSBzZWxlY3RlZCBwcm9qZWN0Ci1SZW5hbWVfbW9kdWxlX2luX2FsbF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc18zPVJlbmFtZSBtb2R1bGUgaW4gYWxsIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1SZW5hbWVfbW9kdWxlX2luX2FsbF9vdGhlcl9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc180PVJlbmFtZSBtb2R1bGUgaW4gYWxsIG90aGVyIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1SZW5hbWVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0XzU9UmVuYW1lIG1vZHVsZSBkZXBlbmRlbmNpZXMgcmVmZXJlbmNpbmcgc2VsZWN0ZWQgcHJvamVjdAotUmVuYW1lX01vZHVsZV9PcHRpb25zXzY9UmVuYW1lIE1vZHVsZSBPcHRpb25zCi1SZW5hbWVfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9PcHRpb25zXzc9UmVuYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24gT3B0aW9ucwotUmVuYW1lX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOD1SZW5hbWUgY291bGQgbm90IGJlIGNvbXBsZXRlZAotUmVuYW1lX2Vycm9yXzk9UmVuYW1lIGVycm9yCi1XaGF0X3dvdWxkX3lvdV9saWtlX3RvX3JlbmFtZV90aGlzX3RvX18xMD1XaGF0IHdvdWxkIHlvdSBsaWtlIHRvIHJlbmFtZSB0aGlzIHRvPwotQ29udGV4dF9Sb290X18xMT1Db250ZXh0IHJvb3Q6Ci1SZW5hbWVfc2VsZWN0ZWRfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9wcm9qZWN0X29ubHlfMTI9UmVuYW1lIHNlbGVjdGVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBvbmx5Ci1SZW5hbWVDb250ZXh0Um9vdD1SZW5hbWUgQ29udGV4dCBSb290Ci1SZW5hbWVDb250ZXh0Um9vdEZyb21YdG9ZPVJlbmFtZSBjb250ZXh0IHJvb3QgZnJvbSAiezB9IiB0byAiezF9IgotQWxzb19yZW5hbWVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTM9QWxzbyByZW5hbWUgbW9kdWxlIGFuZCB1dGlsaXR5IEphdmEgcHJvamVjdHMKLVByb2plY3RfYWxyZWFkeV9leGlzdHMuPVByb2plY3QgezB9IGFscmVhZHkgZXhpc3RzLgotUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FWENfPUlXQUUwMDIxRSBQcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbAotTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVJST1JfPUlXQUUwMDI0RSBOb24tcHJvamVjdCBpbiBzZWxlY3Rpb24KLQotCi1FUlJPUl9PQ0NVUlJFRF9USVRMRT1FcnJvcgotRVJST1JfT0NDVVJSRURfTUVTU0FHRT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBwZXJmb3JtaW5nIHRoZSBzZWxlY3RlZCBhY3Rpb24uCi0KLUltcG9ydF9DbGFzc19GaWxlc19VST1JbXBvcnQKLUZpbGVJbXBvcnQuc2VsZWN0U291cmNlPVNlbGVjdCBhIGRpcmVjdG9yeSB0byBpbXBvcnQgZnJvbS4KLUltcG9ydF9DbGFzc2VzPUltcG9ydCBDbGFzcyBGaWxlcy4uLgotQ2xhc3Nlc0ltcG9ydC5mcm9tRGlyPUltcG9ydCBmcm9tIERpcmVjdG9yeQotQ2xhc3Nlc0ltcG9ydC5mcm9tWmlwPUltcG9ydCBmcm9tIFppcCBvciBKYXIKLURhdGFUcmFuc2Zlci5icm93c2U9QnJvd3NlLi4uCi1EYXRhVHJhbnNmZXIuZGlyZWN0b3J5PVNvdXJjZToKLURhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGU9SW1wb3J0IENsYXNzIEZpbGVzCi1GaWxlSW1wb3J0LmltcG9ydEZpbGVTeXN0ZW09SW1wb3J0IGNsYXNzIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotRmlsZUltcG9ydC5zb3VyY2VFbXB0eT1Tb3VyY2UgbXVzdCBub3QgYmUgZW1wdHkuCi1GaWxlSW1wb3J0Lm92ZXJ3cml0ZUV4aXN0aW5nPU92ZXJ3cml0ZSBleGlzdGluZyByZXNvdXJjZXMgd2l0aG91dCB3YXJuaW5nCi1EYXRhVHJhbnNmZXIuc2VsZWN0QWxsPVNlbGVjdCBBbGwKLURhdGFUcmFuc2Zlci5kZXNlbGVjdEFsbD1EZXNlbGVjdCBBbGwKLUltcG9ydF9DbGFzc19GaWxlc19VST1JbXBvcnQKLUZpbGVJbXBvcnQuc2VsZWN0U291cmNlPVNlbGVjdCBhIGRpcmVjdG9yeSB0byBpbXBvcnQgZnJvbS4KLUluY29uc2lzdGVudF9GaWxlc18zPUluY29uc2lzdGVudCBGaWxlcwotVGhlX2ZvbGxvd2luZ193b3Jrc3BhY2VfZmlsZXNfYXJlX2luY29uc2lzdGVudF93aXRoX3RoZV9lZGl0b3JfND1UaGUgZm9sbG93aW5nIHdvcmtzcGFjZSBmaWxlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIGVkaXRvcjogXG4KLVVwZGF0ZV90aGVfZWRpdG9yX3dpdGhfdGhlX3dvcmtzcGFjZV9jb250ZW50c19fNT1VcGRhdGUgdGhlIGVkaXRvciB3aXRoIHRoZSB3b3Jrc3BhY2UgY29udGVudHM/Ci1FcnJvcl9jaGVja2luZ19vdXRfZmlsZXNfMTA9RXJyb3IgY2hlY2tpbmcgb3V0IGZpbGVzCi1JbmNvbnNpc3RlbnRfZmlsZXNfZGV0ZWN0ZWRfMTE9SW5jb25zaXN0ZW50IGZpbGVzIGRldGVjdGVkCi1Nb2R1bGVzX1VJXz1Nb2R1bGVzCi1VdGlsaXR5X0phdmFfUHJvamVjdHNfVUlfPVByb2plY3QgVXRpbGl0eSBKQVJzCi1UaGVfZm9sbG93aW5nX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZmlsZV9zeXN0ZW0uX0RvX3lvdV93YW50X3RvX3NhdmVfYW5kX292ZXJ3cml0ZV90aGVzZV9maWxlc19vbl90aGVfZmlsZV9zeXN0ZW1fXzEyX1dBUk5fPUlXQUUwMDIwVyBUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uXG5EbyB5b3Ugd2FudCB0byBzYXZlIGFuZCBvdmVyd3JpdGUgdGhlc2UgZmlsZXMgb24gdGhlIGZpbGUgc3lzdGVtPwotSjJFRV9MZXZlbD1KMkVFIExldmVsOgotSjJFRV8xMj0xLjIKLUoyRUVfMTM9MS4zCi1KMkVFXzE0PTEuNAotSjJFRV8xMl9ERVNDUklQVElPTj1KMkVFIDEuMiBpbmNsdWRlcyBTZXJ2bGV0IFNwZWNpZmljYXRpb24gbGV2ZWwgMi4yLCBKU1AgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjEsIGFuZCBFSkIgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjEuCi1KMkVFXzEzX0RFU0NSSVBUSU9OPUoyRUUgMS4zIGluY2x1ZGVzIENvbm5lY3RvciBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjAsIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiBsZXZlbCAyLjMsIEpTUCBTcGVjaWZpY2F0aW9uIGxldmVsIDEuMiwgYW5kIEVKQiBTcGVjaWZpY2F0aW9uIGxldmVsIDIuMC4KLUoyRUVfMTRfREVTQ1JJUFRJT049SjJFRSAxLjQgaW5jbHVkZXMgQ29ubmVjdG9yIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uIGxldmVsIDEuNSwgU2VydmxldCBTcGVjaWZpY2F0aW9uIGxldmVsIDIuNCwgSlNQIFNwZWNpZmljYXRpb24gbGV2ZWwgMS4zLCBhbmQgRUpCIFNwZWNpZmljYXRpb24gbGV2ZWwgMi4xLgotRUpCX0xFVkVMPUVKQiBMZXZlbDoKLUVKQl8xMT0xLjEKLUVKQl8yMD0yLjAKLUVKQl8yMT0yLjEKLUVKQl8xMV9ERVNDUklQVElPTj1FSkIgMS4xIGluY2x1ZGVzIFNlc3Npb24gQmVhbnMsIEJNUCBCZWFucyBhbmQgQ01QIDEuMSBCZWFucy4gIEVKQiAxLjEgbW9kdWxlcyBtYXkgYmUgaW5jbHVkZWQgaW4gZWl0aGVyIEphdmEgRUUgMS4yIG9yIEphdmEgRUUgMS4zIEVudGVycHJpc2UgQXBwbGljYXRpb25zLgotRUpCXzIwX0RFU0NSSVBUSU9OPUVKQiAyLjAgaW5jbHVkZXMgTWVzc2FnZS1Ecml2ZW4gQmVhbnMsIEJNUCBCZWFucywgYW5kIENNUCAxLjEgYW5kIENNUCAyLjAgQmVhbnMuICBFSkIgMi4wIG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSmF2YSBFRSAxLjMgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1FSkJfMjFfREVTQ1JJUFRJT049RUpCIDIuMSBpbmNsdWRlcyBNZXNzYWdlLURyaXZlbiBCZWFucywgQk1QIEJlYW5zLCBhbmQgQ01QIDEuMSBhbmQgQ01QIDIuMCBCZWFucy4gIEVKQiAyLjEgbW9kdWxlcyBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBKYXZhIEVFIDEuNCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KLVdFQl9MRVZFTD1XZWIgTGV2ZWw6Ci1XRUJfMjI9Mi4yCi1XRUJfMjM9Mi4zCi1XRUJfMjQ9Mi40Ci1XRUJfMjJfREVTQ1JJUFRJT049V2ViIDIuMiBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi4yIGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAxLjEuCi1XRUJfMjNfREVTQ1JJUFRJT049V2ViIDIuMyBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi4zIGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAxLjIuCi1XRUJfMjRfREVTQ1JJUFRJT049V2ViIDIuNCBpbmNsdWRlcyBTZXJ2bGV0IHNwZWNpZmljYXRpb24gMi40IGFuZCBKU1Agc3BlY2lmaWNhdGlvbiAyLjAuCi1BUFBfQ0xJRU5UX0xFVkVMPUFwcGxpY2F0aW9uIENsaWVudCBMZXZlbDoKLUFQUF9DTElFTlRfMTJfREVTQ1JJUFRJT049QXBwbGljYXRpb24gMS4yIGluY2x1ZGVzIHRoZSBBcHBsY2lhdGlvbiBjbGllbnQgc3BlY2lmaWNhdGlvbiBsZXZlbCAxLjIuCi1BUFBfQ0xJRU5UXzEzX0RFU0NSSVBUSU9OPUFwcGxpY2F0aW9uIDEuMyBpbmNsdWRlcyB0aGUgQXBwbGNpYXRpb24gY2xpZW50IHNwZWNpZmljYXRpb24gbGV2ZWwgMS4zLgotQVBQX0NMSUVOVF8xNF9ERVNDUklQVElPTj1BcHBsaWNhdGlvbiAxLjQgaW5jbHVkZXMgdGhlIEFwcGxjaWF0aW9uIGNsaWVudCBzcGVjaWZpY2F0aW9uIGxldmVsIDEuNC4KLUNPTk5FQ1RPUl9MRVZFTD1Db25uZWN0b3IgQXJjaGl0ZWN0dXJlIExldmVsOgotQ09OTkVDVE9SXzEwPTEuMAotQ09OTkVDVE9SXzE1PTEuNQotQ09OTkVDVE9SXzEwX0RFU0NSSVBUSU9OPUNvbm5lY3RvciBBcmNoaXRlY3R1cmUgMS4wIG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSmF2YSBFRSAxLjMgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1DT05ORUNUT1JfMTVfREVTQ1JJUFRJT049Q29ubmVjdG9yIEFyY2hpdGVjdHVyZSAxLjUgbW9kdWxlcyBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBKYXZhIEVFIDEuNCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KLURFU0NSSVBUSU9OPURlc2NyaXB0aW9uOgotV0VCX0NPTlRFWFRfUk9PVD1Db250ZXh0IHJvb3Q6Ci1XRUJfQ09OVEVOVF9GT0xERVJfTkFNRT1XZWIgY29udGVudCBmb2xkZXIgbmFtZToKLUZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSA9IFNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IHZhbGlkIG9yIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQuCi1GaWxlSW1wb3J0LmltcG9ydFByb2JsZW1zID0gSW1wb3J0IFByb2JsZW1zCi1EYXRhVHJhbnNmZXIuaW5mb3JtYXRpb24gPSBJbmZvcm1hdGlvbgotRmlsZUltcG9ydC5ub25lU2VsZWN0ZWQgPSBUaGVyZSBhcmUgbm8gcmVzb3VyY2VzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgaW1wb3J0LgotRmlsZV9TZWxlY3Rpb25fVUlfPUZpbGUgU2VsZWN0aW9uCi1TZWxlY3RfYV9maWxlX19VSV89U2VsZWN0IGEgZmlsZToKLUZsZXhpYmxlX1N0cnVjdHVyZT1Vc2UgZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmUKLUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlPUoyRUUgUHJvamVjdAotRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYz1DcmVhdGUgYSBKYXZhIEVFIHByb2plY3QuCi1GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC50aXRsZT1KMkVFIFByb2plY3QKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPU5ldyBFQVIgQXBwbGljYXRpb24gUHJvamVjdAotRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGU9RUFSIEFwcGxpY2F0aW9uIFByb2plY3QKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgRUFSIGFwcGxpY2F0aW9uLgotRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuc2Vjb25kUGFnZS50aXRsZT1FbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLmRlc2M9Q29uZmlndXJlIGVudGVycHJpc2UgYXBwbGljYXRpb24gc2V0dGluZ3MuCi1KMkVFTW9kdWxlRGVwZW5kZW5jaWVzLmxhYmVsPUphdmEgRUUgbW9kdWxlIGRlcGVuZGVuY2llczoKLUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPU5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGU9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgQXBwbGljYXRpb24gQ2xpZW50LgotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZT1DcmVhdGUgZGVmYXVsdCBKYXZhIEVFIG1vZHVsZXMuCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UudGl0bGU9TmV3IEphdmEgRUUgTW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuZGVzYz1DcmVhdGUgYSBuZXcgSmF2YSBFRSBtb2R1bGUgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUgdHlwZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmVqYj1FSkIgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwud2ViPVdlYiBtb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5qY2E9Q29ubmVjdG9yIG1vZHVsZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmFwcGNsaWVudD1BcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuYnV0dG9uLnNlbGVjdD1DcmVhdGUgZGVmYXVsdCBtb2R1bGVzCi0KLUZPTERFUl9MQUJFTD1Tb3VyY2UgZm9sZGVyOgotQlJPV1NFX0JVVFRPTl9MQUJFTD1Ccm93c2UuLi4KLUpBVkFfUEFDS0FHRV9MQUJFTD1KYXZhIHBhY2thZ2U6Ci1DTEFTU19OQU1FX0xBQkVMPUNsYXNzIG5hbWU6Ci1TVVBFUkNMQVNTX0xBQkVMPVN1cGVyY2xhc3M6Ci1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Db250YWluZXIgU2VsZWN0aW9uCi1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIENvbnRhaW5lcjoKLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHPUNob29zZSBhIHZhbGlkIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHNlbGVjdGVkIG1vZHVsZS4KLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1QYWNrYWdlIFNlbGVjdGlvbgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgcGFja2FnZToKLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORT1ObyBwYWNrYWdlcyB0byBjaG9vc2UgZnJvbQotU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFPVN1cGVyY2xhc3MgU2VsZWN0aW9uCi1TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBzdXBlcmNsYXNzOgotSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUw9TW9kaWZpZXJzOgotSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUw9UHVibGljCi1KQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMPUFic3RyYWN0Ci1KQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMPUZpbmFsCi1KQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUw9SW50ZXJmYWNlczoKLUpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMPVdoaWNoIG1ldGhvZCBzdHVicyB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/Ci1KQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUw9cHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLUpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw9Q29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzcwotSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMPUluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzCi1BRERfQlVUVE9OX0xBQkVMPUFkZC4uLgotUkVNT1ZFX0JVVFRPTj1SZW1vdmUKLVlFU19CVVRUT049WWVzCi1OT19CVVRUT049Tm8KLU9LX0JVVFRPTj1PSwotQ0FOQ0VMX0JVVFRPTj1DYW5jZWwKLUJJTkFSWT1CaW5hcnkKLUlOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUludGVyZmFjZSBTZWxlY3Rpb24KLUpBVkFVVElMSVRZX01BSU5fUEdfVElUTEU9SmF2YSBDb21wb25lbnQKLUpBVkFVVElMSVRZX01BSU5fUEdfREVTQz1DcmVhdGUgYSBKYXZhIENvbXBvbmVudAotSkFWQVVUSUxfQ09NUE9ORU5UX1dJWl9USVRMRT1OZXcgSmF2YSBVdGlsaXR5IE1vZHVsZQotQVZBSUxBQkxFX0oyRUVfQ09NUE9ORU5UUz0gQXZhaWxhYmxlIEphdmEgRUUgbW9kdWxlcwotRVhURVJOQUxfSkFSPUFkZCBFeHRlcm5hbCBKQVJzLi4uCi1QUk9KRUNUX0pBUj1BZGQgSkFScy4uLgotQUREVkFSSUFCTEU9QWRkIFZhcmlhYmxlLi4uCi1DSEFOR0VfTElCX0RJUj1DaGFuZ2UgJkxpYnJhcnkgRGlyZWN0b3J5Li4uCi1OT19ERF9NU0dfVElUTEU9Tm8gRGVwbG95bWVudCBEZXNjcmlwdG9yCi1HRU5fRERfUVVFU1RJT049Q2hhbmdpbmcgdGhlIGxpYnJhcnkgZGlyZWN0b3J5IG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoaXMgRUFSIGhhcyBubyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgeWV0IGFuZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQgbm93LiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotQ0hBTkdFX0xJQl9ESVJfSEVBRD1DaGFuZ2UgTGlicmFyeSBEaXJlY3RvcnkKLU5FV19MSUJfRElSX1BST1BNUFQ9TmV3IGxpYnJhcnkgZGlyZWN0b3J5IGxvY2F0aW9uOgotQkxBTktfTElCX0RJUj1CbGFuayBMaWJyYXJ5IERpcmVjdG9yeQotQkxBTktfTElCX0RJUl9DT05GSVJNPVlvdSd2ZSBlbnRlcmVkIGEgYmxhbmsgbGlicmFyeSBkaXJlY3RvcnkuIEluIHJlc3VsdCwgYWxsIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBwYWNrZWQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LiBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHBhY2sgYW55IGxpYnJhcmllcyBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkgeW91IG11c3QgZW50ZXIgYSBub24tYmxhbmsgbGlicmFyeSBkaXJlY3RvcnkuIERvIHlvdSByZWFsbHkgd2FudCB0aGUgbGlicmFyeSBkaXJlY3RvcnkgdG8gYmUgYmxhbms/Ci1CTEFOS19MSUJfRElSX1dBUk5fUVVFU1RJT049VGhlIHNwZWNpZmllZCBsaWJyYXJ5IGRpcmVjdG9yeSBpcyBibGFuay4gSW4gcmVzdWx0LCBhbGwgdGhlIGxpYnJhcmllcyB3aWxsIGJlIHBhY2tlZCBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGlzPyAoSWYgeW91IHdhbnQgdG8gbGVhdmUgdGhlIGJ1bmRsZWQgbGlicmFyaWVzIGRpcmVjdG9yeSBibGFuaywgY2xpY2sgJ1llcycuIElmIHlvdSB3YW50IHRvIGNoYW5nZSBpdCwgY2xpY2sgJ05vJykKLUlOVkFMSURfUEFUSD1JbnZhbGlkIFBhdGgKLUlOVkFMSURfUEFUSF9NU0c9VGhlIGVudGVyZWQgcGF0aCBpcyBpbnZhbGlkIGZvciBhIGxpYnJhcnkgZGlyZWN0b3J5LiBQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYXRoLCBkaWZmZXJlbnQgZnJvbSByb290IQotREVQRU5ERU5DWV9DT05GTElDVF9USVRMRT1EZXBlbmRlbmNpZXMgQ29uZmxpY3QKLURFUEVOREVOQ1lfQ09ORkxJQ1RfTVNHXzE9VGhpcyBKQVIgaXMgYSBidW5kbGVkIGxpYnJhcnkgb2YgYW4gRUFSIHByb2plY3QgYW5kIGlzIHN1cHBvc2VkIHRvIGJlIHBhY2tlZCBpbiB0aGUgRUFSJ3MgbGlicmFyeSBkaXJlY3RvcnkuIEl0IGNvbmZsaWN0cyB3aXRoIHRoZSBtYW5pZmVzdCBjbGFzcyBwYXRoIGRlcGVuZGVuY3kgeW91IGFyZSB0cnlpbmcgdG8gY3JlYXRlLiBJZiB5b3UgY3JlYXRlIHRoaXMgZGVwZW5kZW5jeSwgdGhlIEpBUiB3aWxsIGJlIHBhY2tlZCBpbiB0aGUgcm9vdCAobm90IGxpYnJhcnkpIGRpcmVjdG9yeSBvZiB0aGUgRUFSLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8KLURFUEVOREVOQ1lfQ09ORkxJQ1RfTVNHXzI9VGhpcyBKQVIgaXMgYWxzbyBhIG1hbmlmZXN0IGNsYXNzIHBhdGggZGVwZW5kZW5jeSBvZiBhIG1vZHVsZSBpbiB0aGlzIEVBUi4gSXQgY29uZmxpY3RzIHdpdGggcGFja2luZyB0aGUgSkFSIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeS4gSWYgeW91IHdhbnQgdGhpcyBKQVIgcGFja2VkIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSwgdGhlbiBpdCB3aWxsIGJlIHJlbW92ZWQgYXMgYSBtYW5pZmVzdCBjbGFzcyBwYXRoIGRlcGVuZGVuY3kgZnJvbSBhbGwgbW9kdWxlcyBpbiB0aGlzIEVBUi4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/ICAKLURPX05PVF9TSE9XX1dBUk5JTkdfQUdBSU49RG8gbm90IHNob3cgdGhpcyB3YXJuaW5nIGFnYWluIAotU1VQUE9SVE1VTFRJUExFTU9EVUxFUz1TdXBwb3J0IE11bHRpcGxlIE1vZHVsZXMgcGVyIHByb2plY3QKLVNPVVJDRUZPTERFUj1Tb3VyY2UgRm9sZGVyOgotSE9WRVJfSEVMUF9GT1JfRElTQUJMRURfTElCUz1UaGlzIGxpYnJhcnkgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHByb2plY3QgYnkgdXNpbmcgdGhlIHByb2plY3QgdHJlZSBvclxudGhlIGZpbGUgc3lzdGVtLiBJZiB5b3Ugd2FudCB0byBtb3ZlL3JlbW92ZSBpdCwgdXNlIHRoZSBzYW1lIGFwcHJvYWNoLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvamNhX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmY1ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotXzA9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgotXzE9TmV3IENvbm5lY3RvciBQcm9qZWN0Ci1fMj1KMkMgdmVyc2lvbjoKLV8zPUNvbm5lY3RvciBQcm9qZWN0Ci1fND1DcmVhdGUgYSBzdGFuZGFsb25lIENvbm5lY3RvciBtb2R1bGUgb3IgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4KLV81PUltcG9ydCBhIENvbm5lY3RvciBtb2R1bGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLV82PUNvbm5lY3RvciBJbXBvcnQKLV83PUNvbm5lY3RvciBmaWxlOgotXzg9Q29ubmVjdG9yIG1vZHVsZToKLV85PUNvbm5lY3RvciBFeHBvcnQKLV8xMD1FeHBvcnQgQ29ubmVjdG9yIG1vZHVsZSB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1fMTE9Q29uZmlndXJlIENvbm5lY3RvciBtb2R1bGUgc2V0dGluZ3MuCi1jb25uZWN0b3JfZXhwb3J0X2FjdGlvbl9sYWJlbF91aV89RXhwb3J0IFJBUiBGaWxlLi4uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzVjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9tYW5pZmVzdF91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVXBfMT0mVXAKLURvd25fMj0mRG93bgotU2VsZWN0X0FsbF8zPVNlbGVjdCAmQWxsCi1EZXNlbGVjdF9BbGxfND1EJmVzZWxlY3QgQWxsCi1FUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRT1FcnJvciBSZWFkaW5nIE1hbmlmZXN0Ci1TQVZFX01BTklGRVNUX1dJVEhfRVJST1I9VGhlIG1hbmlmZXN0IGZpbGUgY29udGFpbnMgZXJyb3JzIGFuZCBjYW4gbm90IGJlIHBhcnNlZC4gIFRoZSBmaWxlIHdpbGwgYmUgc2F2ZWQgYnV0IHRoZSBKYXZhIGJ1aWxkIHBhdGggd2lsbCBub3QgYmUgdXBkYXRlZC4gIEZvbGxvd2luZyBhcmUgY29tbW9uIGxpbWl0YXRpb25zIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtczoKLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SPVRoZSBtYW5pZmVzdCBmaWxlIGNvbnRhaW5zIGVycm9ycyBhbmQgY2FuIG5vdCBiZSBwYXJzZWQuICBPdGhlciBwYWdlcyBjYW5ub3QgYmUgdXNlZCB1bnRpbCB0aGVzZSBlcnJvcnMgYXJlIGNvcnJlY3RlZC4gIEZvbGxvd2luZyBhcmUgY29tbW9uIGxpbWl0YXRpb25zIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtczoKLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfUFJPUF9QQUdFPVRoZSBtYW5pZmVzdCBmaWxlIGNvbnRhaW5zIGVycm9ycyBhbmQgY2FuIG5vdCBiZSBwYXJzZWQuICBGb2xsb3dpbmcgYXJlIGNvbW1vbiBsaW1pdGF0aW9ucyB3aGljaCBjYW4gY2F1c2UgcHJvYmxlbXM6Ci1NQU5JRkVTVF9QUk9CTEVNXzE9KiBMaW5lcyBpbiB0aGUgZmlsZSBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiA3MiBieXRlcy4gQ29udGludWF0aW9uIG9mIGxvbmcgbGluZXMgaXMgaW5kaWNhdGVkIGJ5IGEgbmV3IGxpbmUgYW5kIGEgc3BhY2UuCi1NQU5JRkVTVF9QUk9CTEVNXzI9KiBUaGUgbGFzdCBsaW5lIGluIHRoZSBmaWxlIG11c3QgZW5kIHdpdGggYSBuZXcgbGluZSBvciBpdCB3aWxsIG5vdCBiZSBwYXJzZWQuCi1NQU5JRkVTVF9QUk9CTEVNXzM9KiBCbGFuayBsaW5lcyB3aXRoIGV4dHJhIHdoaXRlIHNwYWNlIG1heSBjYXVzZSBwYXJzZSB0byBmYWlsLgotTUFOSUZFU1RfUFJPQkxFTV80PSogVGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBmb3JtYXR0ZWQgY29ycmVjdGx5LiAgUmVmZXIgdG8gdGhlIG1hbmlmZXN0IGFuZCBKQVIgZmlsZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfPUlXQUUwMDEwRSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZDoKLVByb2plY3RfbmFtZV9fVUlfPVByb2plY3QgbmFtZToKLUVBUl9Qcm9qZWN0X05hbWVfX1VJX19VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG5hbWU6Ci1BdmFpbGFibGVfZGVwZW5kZW50X0pBUnNfX1VJXz1BdmFpbGFibGUgZGVwZW5kZW50IEpBUnM6Ci1NYW5pZmVzdF9DbGFzc19QYXRoX19VSV89TWFuaWZlc3QgQ2xhc3MtUGF0aCAoZG9lcyBub3QgaW5jbHVkZSBjb250cmlidXRpb25zIGZyb20gY2xhc3NwYXRoIGVudHJpZXMpOgotSkFSX01vZHVsZV9VSV89SkFSL01vZHVsZQotUGFja2VkX0luX0xpYl9VSV89SW4gTGliIERpcgotUHJvamVjdF9VSV89UHJvamVjdAotRUFSX01vZHVsZXM9RUFSIE1vZHVsZXM6Ci1FQVJfTW9kdWxlc19EZXNjPVRoaXMgcHJvcGVydHkgcGFnZSBsZXRzIHlvdSBzZXR1cCB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBpbiBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotSjJFRV9Nb2R1bGVzPUoyRUUgTW9kdWxlcwotSjJFRV9Nb2R1bGVzX0Rlc2M9VGhpcyBwcm9wZXJ0eSBwYWdlIGxldHMgeW91IGFkZCBNYW5pZmVzdCBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIHRvIG90aGVyIEphdmEgRUUgbW9kdWxlcyBvciBKQVJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4gSXQgYWxzbyBzdXBwb3J0cyB0aGUgc2VsZWN0aW9uIG9mIGNsYXNzIGZvbGRlcnMgd2hvc2UgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcm9vdCBvZiB0aGlzIG1vZHVsZS4KLVdlYl9MaWJyYXJpZXM9V2ViIExpYnJhcmllcwotV2ViX0xpYnJhcmllc19EZXNjPVRoaXMgcHJvcGVydHkgcGFnZSBsZXRzIHlvdSBhZGQgYSBXZWIgTGlicmFyeSBkZXBlbmRlbmN5IHRvIHV0aWxpdHkgcHJvamVjdHMsIEpBUiBmaWxlcyBvciBjbGFzc3BhdGggZW50cmllcy4gQXJjaGl2ZSBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZXNvbHZlZCBpbnRvIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIgb2YgdGhlIHdlYiBtb2R1bGUgYXQgZGVwbG95bWVudCB0aW1lLiBDbGFzcyBmb2xkZXIgZGVwZW5kZW5jaWVzIHdpbGwgYmUgcmVzb2x2ZWQgaW50byB0aGUgV0VCLUlORi9jbGFzc2VzIGZvbGRlci4KLVdlYl9SZWZfRGVzYz1UaGlzIHByb3BlcnR5IHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSBtb2R1bGUgZGVwZW5kZW5jaWVzIG9uIGNsYXNzcGF0aCBlbnRyaWVzLiBFbnRyaWVzIHRoYXQgcmVmZXJlbmNlIGFyY2hpdmVzIHdpbGwgYmUgYnVuZGxlZCwgYWxvbmcgd2l0aCB0aGUgcHJvamVjdCwgaW50byB0aGUgV0VCLUlORi9saWIgZm9sZGVyIG9mIHJlZmVyZW5jaW5nIHdlYiBtb2R1bGVzLiBUaGUgY29udGVudHMgb2YgY2xhc3MgZm9sZGVyIGVudHJpZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcm9vdCBvZiB0aGlzIG1vZHVsZS4KLUVBUl9Nb2R1bGVfRGVwX0Vycm9yPUoyRUUgTW9kdWxlcyBpcyBub3QgdmFsaWQgZm9yIEVBUiBtb2R1bGVzLgotVW5yZWZlcmVuY2VkX01vZHVsZV9FcnJvcj1TZWxlY3RlZCBtb2R1bGUgaXMgbm90IHJlZmVyZW5jZWQgYnkgYW55IEVBUiBvciBEeW5hbWljIFdlYiBtb2R1bGVzLgotSmFyX0RlcF9PbmVfTW9kdWxlX0Vycm9yPUphdmEgSmFyIERlcGVuZGVuY2llcyBpcyB2YWxpZCBvbmx5IGZvciBvbmUgbW9kdWxlIHBlciBmbGV4aWJsZSBwcm9qZWN0LgotV2ViX0xpYl9FcnJvcj1XZWIgbGlicmFyeSBzZXR0aW5ncyBhcmUgb25seSB2YWxpZCBmb3IgV2ViIG1vZHVsZXMuCi1SRURJUkVDVF9URVhUX0VESVRPUl9VSV89UkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfCi1FcnJvcl9DaGVja2luZ19Qcm9qZWN0X0ZhY2V0cz1FcnJvciBjaGVja2luZyBwcm9qZWN0IGZhY2V0cy4KLUVycm9yX0NoZWNraW5nX1Byb2plY3RfRmFjZXRzPUVycm9yIGNoZWNraW5nIHByb2plY3QgZmFjZXRzLgotV0VCX0xJQl9MSVNUX0RFU0NSSVBUSU9OPVNlbGVjdCB0aGUgdXRpbGl0eSBwcm9qZWN0LCBKQVIgb3IgY2xhc3NwYXRoIGVudHJ5IHRvIGFkZCBhcyBhIFdlYiBMaWJyYXJ5IGRlcGVuZGVuY3kKLUR5bmFtaWNfV2ViX0Vycm9yPVRoaXMgcHJvcGVydHkgcGFnZSBpcyBub3QgdmFsaWQgZm9yIGR5bmFtaWMgd2ViIHByb2plY3RzLgotTm9fV2ViX1JlZmVyZW5jZV9FcnJvcj1TZWxlY3RlZCBwcm9qZWN0IG11c3QgYmUgcmVmZXJlbmNlZCBieSBhdCBsZWFzdCBvbmUgZHluYW1pYyB3ZWIgcHJvamVjdC4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9zY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50UGFuZWxzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3NjaGVtYS9hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiMTZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3NjaGVtYS9hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiIGlkPSJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHMiIG5hbWU9IkFyY2hpdmUgRXhwb3J0IFBhcnRpY2lwYW50IFBhbmVscyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCBmb3Igc3VwcGx5aW5nIFVJIGZvciB0aGUgYXJjaGl2ZSBleHBvcnQgcGFydGljaXBhbnRzIHJlZ2lzdGVyZWQgdmlhIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzJmx0Oy9jb2RlJmd0OyBleHRlbnNpb24gcG9pbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhbmVsLWZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGFuZWwtZmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgUmVnaXN0ZXJzIGEgc2luZ2xlIGFyY2hpdmUgZXhwb3J0IHBhcnRpY2lwYW50LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGFyY2hpdmUgZXhwb3J0IHBhcnRpY2lwYW50IHRoYXQgdGhpcyBwYW5lbCBmYWN0b3J5IHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGguIEhhcyB0byBpbmNsdWRlIHBsdWdpbiBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5hcmNoaXZlLklBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLmFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudFBhbmVscyZxdW90OyZndDsKLSAgJmx0O3BhbmVsLWZhY3RvcnkKLSAgICBhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRJZD0mcXVvdDtjb20uc29tZWNvcnAuTXlFeHBvcnRQYXJ0aWNpcGFudCZxdW90OwotICAgIGNsYXNzPSZxdW90O2NvbS5zb21lY29ycC5NeVBhbmVsRmFjdG9yeSZxdW90Oy8mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0ZjQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2ViLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Indhci12YWxpZGF0aW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYmVkaXQvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2VicHJvamVjdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjliMzY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmpldHByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uamV0cHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExNjkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uamV0cHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08amV0LXNldHRpbmdzPgotCTx0ZW1wbGF0ZS1jb250YWluZXI+dGVtcGxhdGVzPC90ZW1wbGF0ZS1jb250YWluZXI+CTxzb3VyY2UtY29udGFpbmVyPndlYjwvc291cmNlLWNvbnRhaW5lcj4KLTwvamV0LXNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2YzNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5KRVRCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5JSkVUTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5YTgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjYmUzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdlYiBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMjNjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSB3ZWIvLFwKLSAgICAgICAgICAgd2FyLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgd2ViZWRpdC8sXAotICAgICAgICAgICB3ZWJwcm9qZWN0LyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4YzRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvU2VydmxldENyZWF0ZUluaXRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9TZXJ2bGV0Q3JlYXRlSW5pdFBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyMjg5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9TZXJ2bGV0Q3JlYXRlSW5pdFBhcmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJBcHBDcmVhdGVDb250ZXh0UGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUwYTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25DcmVhdGVVUkxQYXR0ZXJuVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25DcmVhdGVVUkxQYXR0ZXJuVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzVlYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uQ3JlYXRlVVJMUGF0dGVyblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvYXV0aG9yaXR5X2NvbnN0cmFpbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvYXV0aG9yaXR5X2NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY0YzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2F1dGhvcml0eV9jb25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcl9wYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX3BhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFiMjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX3BhZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZXJyb3Jjb2RlX2Vycm9ycGFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcmNvZGVfZXJyb3JwYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYjIxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcmNvZGVfZXJyb3JwYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9leGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ1NTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9leHBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhhMGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4cG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmllbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmllbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQzOGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpZWxkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpbHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzEyZDFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpbHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXJfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXJfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmUzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmlsdGVyX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZm9ybV9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZm9ybV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fbG9naW5fY29uZmlnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fbG9naW5fY29uZmlnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmY2JiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mb3JtX2xvZ2luX2NvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQXJyb3dEb3duLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJmMmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0Fycm93VXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0Fycm93VXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQ3OWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd1VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjVlODEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNhMTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NmZjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjZmNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODEyNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUpTUENvbmZpZ19wcm9wZXJ0eUdyb3Vwc19KU1BQcm9wZXJ0eUdyb3VwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfcHJvcGVydHlHcm91cHNfSlNQUHJvcGVydHlHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTdjNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUpTUENvbmZpZ19wcm9wZXJ0eUdyb3Vwc19KU1BQcm9wZXJ0eUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfdGFnTGlic19UYWdMaWJSZWZUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfdGFnTGlic19UYWdMaWJSZWZUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyMjlhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSlNQQ29uZmlnX3RhZ0xpYnNfVGFnTGliUmVmVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvYWRkX2NvbHVtbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvYWRkX2NvbHVtbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NmU1YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2FkZF9jb2x1bW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2Nvbm5lY3Rpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2Nvbm5lY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25uZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb252ZXJ0bGlua3Nfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb252ZXJ0bGlua3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NWNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvY29udmVydGxpbmtzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZGVmYXVsdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZGVmYXVsdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmFjMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydGZ0cF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydGZ0cF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzY2ZTllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRmdHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0ZnRwX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0ZnRwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGUwNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGZ0cF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRodHRwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzY4NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM2NTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L21ldGhvZHJldHVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kcmV0dXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyODU5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kcmV0dXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3ZWJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTg2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYmV4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTZiM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi93YXJGaWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJfYXBwbGljYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvd2ViX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvd2ViX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGQyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9saW5rc3ZpZXcxNi9tYWlsdG9fdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2xpbmtzdmlldzE2L21haWx0b192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMTJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2xpbmtzdmlldzE2L21haWx0b192aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvSlNQQ29uZmlnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvSlNQQ29uZmlnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmMGM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUENvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUFByb3BlcnR5R3JvdXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9KU1BQcm9wZXJ0eUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUFByb3BlcnR5R3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9UYWdMaWJSZWZUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvVGFnTGliUmVmVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTAwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9UYWdMaWJSZWZUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvYXNjaWkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9hc2NpaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzAyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9hc2NpaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2JpbmFyeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2JpbmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjMzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9iaW5hcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9lbnZpcm9ubWVudF9lbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9lbnZpcm9ubWVudF9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA0M2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvamFycHJvamVjdF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXJwcm9qZWN0X2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTRiZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXJwcm9qZWN0X2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODczZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXZhX3Byb3BlcnRpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RfcmV0dXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvbWV0aG9kX3JldHVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Mjg1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RfcmV0dXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvcHJvamxpYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9wcm9qbGliX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTJkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9wcm9qbGliX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWIxMl9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWIxMl9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA3NzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTJfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTNfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTNfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MzlkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYjEzX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJzdGF0aWNfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvc2FtcGxlMTYvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0RmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzAyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0RmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0Rm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY0MjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2NvbG91cnBhbF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2dhbGxlcnlfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi9nYWxsZXJ5X3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc3OWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2dhbGxlcnlfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi9saW5rc192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2xpbmtzX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ5Yzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2xpbmtzX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvc2FtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTgxZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhYmJjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi90aHVtYm5haWxfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM4YzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vZnRwcHViX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBwdWJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBwdWJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjODE4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9odHRwaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d2ViZXhfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3YzI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTEyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi93YXJpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJlYmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZ2V0c3RhcnRfYS5HSUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9nZXRzdGFydF9hLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMWU2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9nZXRzdGFydF9hLkdJRgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmE1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF9saWJyYXJ5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2I1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF90eXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MzY3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9qc3BfdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMva2V5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhZjM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXlfaW50ZXJmX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3MDQ0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXlfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL21ldGhFbGVtZW50X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9tZXRoRWxlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL21ldGhFbGVtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9taW1lX21hcHBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbWltZV9tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0Nzc1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9taW1lX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3anByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3anByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDEzN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6XzMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6XzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzNWVjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdqcHJqX3dpel8zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWVhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3c2VydmxldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3d3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU2YjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlY3VyaXR5X2NvbnN0cmFpbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTU0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4YjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZsZXRfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X21hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk1YWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZsZXRfbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VydmxldF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOWQyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2hvd2Vycl90c2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2hvd2Vycl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3d3YXJuX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zaG93d2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3d3YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91cmxfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91cmxfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWYwMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VybF90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkYzljOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX2RhdGFfY29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Nzk3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXNlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2FyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2FyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNzUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJfcmVzb3VyY2VfY29sbGVjdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJfcmVzb3VyY2VfY29sbGVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmE3Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYl90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ2YzQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzEzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjMjRkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzE0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjkxNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzE0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJmNDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzIzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiY2UwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDQ1YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWxjb21lX2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYWI4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWxjb21lX2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9saXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlbGNvbWVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzcxMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3htbF9pbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy94bWxfaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk2Y2JhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3htbF9pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY4ZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi13YXJfdmFsaWRhdG9yX1VJXz1XYXIgVmFsaWRhdG9yCi1XRUJfRkFDRVRfTEFCRUw9RHluYW1pYyBXZWIgTW9kdWxlCi1XRUJfRkFDRVRfREVTQ1JJUFRJT049QWRkcyBzdXBwb3J0IGZvciB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgZm9yIGdlbmVyYXRpb24gb2YgZHluYW1pYyBXZWIgcGFnZSBjb250ZW50LgotV0VCX0ZBQ0VUX1RFTVBMQVRFX0xBQkVMPUR5bmFtaWMgV2ViIFByb2plY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGZmNjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFdlYiBKU0ZhY2VzIEZpbGUgVVJMIGV4dGVuc2lvbiAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZpbGVVUkwiIG5hbWU9IkZpbGVVUkwiIHNjaGVtYT0ic2NoZW1hL2ZpbGVVUkwuZXhzZCIvPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFdlYiBWYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IldhclZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IiV3YXJfdmFsaWRhdG9yX1VJXyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgCQk8YW5kPgotICAgICAgICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3Qud2ViIi8+Ci0JICAJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LndlYjoyLjRdIi8+Ci0JCQk8L2FuZD4KLQkJPC9lbmFibGVtZW50PgotICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYkREIj4KLSAgICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXIiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIud2Vic2V0dGluZ3MiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ii5jbGFzc3BhdGgiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8ZGVwZW5kZW50VmFsaWRhdG9yCi0gICAgICAgICAgICAgICBkZXBWYWxWYWx1ZT0idHJ1ZSI+Ci0gICAgICAgICA8L2RlcGVuZGVudFZhbGlkYXRvcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhclZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJXZWJNb2R1bGVFeHRlbnNpb24iCi0gICAgICAgICBuYW1lPSJXZWJNb2R1bGVFeHRlbnNpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTW9kdWxlRXh0ZW5zaW9uIj4KLSAgICAgIDxlYXJNb2R1bGVFeHRlbnNpb24KLSAgICAgICAgICAgIGV4dGVuc2lvbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYk1vZHVsZUV4dGVuc2lvbkltcGwiPgotICAgICAgPC9lYXJNb2R1bGVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYmFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5wcm92aWRlci5XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJqc3AueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpzcC5wcm92aWRlci5Kc3BJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgV2ViIFRhZyBzZXQgZGVmaW5pdGlvbnMgZm9yIFhEb2NsZXQgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IldlYlRhZ1NldHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25UYWdTZXQiPgotICAgICAgPEFubm90YXRpb25UYWdTZXQKLSAgICAgICAgICAgIG5hbWU9IndlYiI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdTZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IldlYkFubm90YXRpb25JbmZvIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uVGFnSW5mbyI+Ci0JICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0iZmlsdGVyIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktbmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InNtYWxsLWljb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJsYXJnZS1pY29uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJmaWx0ZXItaW5pdC1wYXJhbSIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJuYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0idmFsdWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0iZmlsdGVyLW1hcHBpbmciCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJ1cmwtcGF0dGVybiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InNlcnZsZXQtbmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0ic2VydmxldCIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJuYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGlzcGxheS1uYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iaWNvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0ibG9hZC1vbi1zdGFydHVwIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0icnVuLWFzIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJzZXJ2bGV0LWluaXQtcGFyYW0iCi0gICAgICAgICAgICBtdWx0aXBsaWNpdHk9IioiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InZhbHVlIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InNlcnZsZXQtbWFwcGluZyIKLSAgICAgICAgICAgIG11bHRpcGxpY2l0eT0iKiIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJ1cmwtcGF0dGVybiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0ibGlzdGVuZXIiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9InJvbGUtbmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJyb2xlLWxpbmsiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJ0eXBlIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJuYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9InR5cGUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0iYXV0aCI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0ic2NvcGUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJqbmRpLW5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0icm9sZS1uYW1lIj4KLSAgICAgICAgIAk8L2F0dHJpYj4KLSAgICAgICAgIAk8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICAJPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9ImVudi1lbnRyeSIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgICAgIDxhdHRyaWIgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgICAgIDxhdHRyaWIgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDxhdHRyaWIgbmFtZT0idHlwZSIgdHlwZT0iZW51bSI+Ci0gICAgICAgICAgICAJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0gICAgICAgICAgICAJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLQkJCQk8ZW51bVZhbHVlcyB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgotCQkJCTxlbnVtVmFsdWVzIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQkJCQk8ZW51bVZhbHVlcyB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLQkJCQk8ZW51bVZhbHVlcyB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLQkJCQk8ZW51bVZhbHVlcyB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLQkJCTwvYXR0cmliPgotICAgICAgICAgICAgPGF0dHJpYiBuYW1lPSJ2YWx1ZSIvPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJlamItcmVmIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0idHlwZSIgdHlwZT0iZW51bSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJFbnRpdHkiLz4KLSAgICAgICAgICAJPGVudW1WYWx1ZXMgdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9ImhvbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9InJlbW90ZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0ibGluayIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0iZWpiLWxvY2FsLXJlZiIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgICAgIDxhdHRyaWIgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0idHlwZSIgdHlwZT0iZW51bSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJFbnRpdHkiLz4KLSAgICAgICAgICAJPGVudW1WYWx1ZXMgdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9ImhvbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9ImxvY2FsIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJsaW5rIi8+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwiPgotICAgICAgPGVkaXRNb2RlbAotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC53ZWIiCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLkphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBhdXRvbG9hZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBVUkk9IldFQi1JTkYvd2ViLnhtbCIvPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5hcnRpZmFjdGVkaXQiPgotICAgICAgPGFydGlmYWN0ZWRpdAotICAgICAgICAgICAgdHlwZUlEPSJqc3Qud2ViIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0Ij4KLSAgICAgIDwvYXJ0aWZhY3RlZGl0PgotICAgPC9leHRlbnNpb24+IAotICAgCi0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPCEtLSBCdWlsZGVyIFByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMtLT4KLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgIAk8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9ImpzdC53ZWIuYnVpbGRlciIKLSAgICAgIAkJcHJvdmlkZXJJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSmF2YUNvbXBvbmVudEJ1aWxkZXJEYXRhTW9kZWxQcm92aWRlciIvPgotCQk8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciIvPgotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIj4KLSAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgPC9EYXRhTW9kZWxQcm92aWRlcj4KLSA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICA8L0RhdGFNb2RlbFByb3ZpZGVyPgotIDwvZXh0ZW5zaW9uPgotCQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+Ci0gICAgPGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNsYXNzcGF0aC5XZWJBcHBMaWJyYXJpZXNDb250YWluZXJJbml0aWFsaXplciIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPCEtLSBQcm9qZWN0IEZhY2V0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0ianN0LndlYiI+Ci0gICAgICA8bGFiZWw+JVdFQl9GQUNFVF9MQUJFTDwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+JVdFQl9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjIuNCIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuMiI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuMyI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjUiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzUuMCIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMy4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249Ils1LjAiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuMi0zLjBdIiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LndlYi5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi4yLTMuMF0iIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgotICAgIDwvZXZlbnQtaGFuZGxlcj4KLSAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciB0eXBlPSJQT1NUX0lOU1RBTEwiIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi4yLTMuMF0iPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+Ci0gICAgCi0gICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5qc3Qud2ViIj4KLSAgICAgIDxsYWJlbD4lV0VCX0ZBQ0VUX1RFTVBMQVRFX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LndlYiIvPgotICAgIDwvdGVtcGxhdGU+Ci0KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgPHByb3ZpZGVyPgotICAgICAgICAJPG1vZGVsUHJvdmlkZXIgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdCIvPgkKLSAgICAgIAkJPGZhY2V0IGlkPSJqc3Qud2ViIiB2ZXJzaW9ucz0iMi4yLDIuMywyLjQiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzhkYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC53ZWIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg4YTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBXQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotCi0jIDItSnVseS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieQotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0ozMDAwRTogV0FSIFZhbGlkYXRpb24gRmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTPUNIS0oxMDAyRTogRHVwbGljYXRlIHNlY3VyaXR5IHJvbGUgbmFtZWQgezB9LgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUD1DSEtKMzAwMUU6IFRoZSBKU1AgZmlsZSwgezB9LCBmb3IgdGhlIHNlcnZsZXQgXCJ7MX1cIiBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NNQUxMX0lDT049Q0hLSjMwMDJFOiBUaGUgPHNtYWxsLWljb24+IGZpbGUsIHswfSwgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OPUNIS0ozMDAzRTogVGhlIDxsYXJnZS1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORz1DSEtKMzAwNFc6IFRoZSBzZXJ2bGV0IG1hcHBpbmcgXCJ7MH1cIiByZWZlcnMgdG8gYSBzZXJ2bGV0IHRoYXQgaXMgbm90IGRlZmluZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFPUNIS0ozMDA1RTogRW1wdHkgd2VsY29tZSBmaWxlIGxpc3QgZW50cnkuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEU9Q0hLSjMwMDZFOiBXZWxjb21lIGZpbGUgezB9IGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQ9Q0hLSjMwMDdFOiBUaGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBGaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0lOVkFMSURfV0FSX0ZJTEU9Q0hLSjMwMDhFOiBNaXNzaW5nIG9yIGludmFsaWQgV0FSIGZpbGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HPUNIS0ozMDA5RTogVGhlIGZpbHRlciBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgZmlsdGVyIHRoYXQgaXMgbm90IGRlZmluZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9XRUxDT01FX0ZJTEU9Q0hLSjMwMTBXOiBXZWxjb21lIEZpbGVzIGNhbm5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIC8uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9QQVJTRV9MSU5FQ09MPUNIS0oxMDA5RTogUGFyc2luZyBFcnJvcjogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORT1DSEtKMTAxMEU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTk9JTkZPPUNIS0oxMDExRTogRGVwbG95bWVudCBEZXNjcmlwdG9yIFBhcnNpbmcgZXJyb3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAxMkU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMPUNIS0ozMDEzRTogVGhlIFVSTCBNYXBwaW5nIFwiezB9XCIgaXMgaW52YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFPUNIS0ozMDE0RTogSW52YWxpZCBTZWN1cml0eSByb2xlLWxpbms6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0hUVFBfQ01EPUNIS0ozMDE1RTogSW52YWxpZCBIVFRQIG1ldGhvZDogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVFJBTlNQT1JUPUNIS0ozMDE2RTogSW52YWxpZCBUcmFuc3BvcnQgR3VyYXJhbnRlZS4gIFZhbGlkIHZhbHVlcyBhcmUgXCJOT05FXCIsIFwiSU5URUdSQUxcIiwgb3IgXCJDT05GSURFTlRJQUxcIi4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGPUNIS0ozMDE4RTogVGhlIGpzcC1maWxlIFwiezB9XCIgcmVmZXJlbmNlZCBieSBzZXJ2bGV0IHsxfSBtdXN0IGJlIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLgotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVD1DSEtKMzAxN0U6IFdlYiBQcm9qZWN0OiB7MH0gaXMgbWFwcGVkIHRvIGFuIGludmFsaWQgQ29udGV4dCByb290OiB7MX0gaW4gRUFSIFByb2plY3Q6IHsyfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0U9SVdBRTAwMDFFIENIS0ozMDE5RTogVGhlIExvY2F0aW9uIG9mIHRoZSBFcnJvciBQYWdlIE11c3QgQmVnaW4gd2l0aCBhIC8uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRV9OQU1FPUNIS0ozMDIwRTogSW52YWxpZCBTZWN1cml0eSByb2xlLW5hbWU6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EPUNIS0ozMDIxRTogSW52YWxpZCBhdXRoIG1ldGhvZC4gIFZhbGlkIHZhbHVlcyBhcmU6IFwiQkFTSUNcIiwgXCJESUdFU1RcIiwgXCJGT1JNXCIsIG9yIFwiQ0xJRU5ULUNFUlRcIi4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTj1DSEtKMzAyMkU6ICBBdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgezB9LiAgVGhlIGZvcm0tbG9naW4tY29uZmlnIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHVzaW5nIEZPUk0gYXV0aGVudGljYXRpb24gbWV0aG9kLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyPUNIS0ozMDIzRTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJTRVJWTEVUIiBvciAiQ09OVEFJTkVSIi4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjM9Q0hLSjMwMjRFOiAgUmVzb3VyY2UgcmVmIHswfSBtdXN0IGNvbnRhaW4gcmVzLWF1dGggb2YgIkFwcGxpY2F0aW9uIiBvciAiQ29udGFpbmVyIi4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMj1DSEtKMzAyNUU6ICBcIkFwcGxpY2F0aW9uXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yLnJlcy1hdXRoIGluIGEgMi4yIGxldmVsIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFVzZSBcIlNFUlZMRVRcIiBpbnN0ZWFkLgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIzPUNIS0ozMDI2RTogIFwiU0VSVkxFVFwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJBcHBsaWNhdGlvblwiIGluc3RlYWQuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRT1DSEtKMzAyN0U6ICBJbnZhbGlkIEV4Y2VwdGlvbiBUeXBlIHswfS4gIFRoZSBleGNlcHRpb24gdHlwZSBtdXN0IGNvbnRhaW4gYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HPUNIS0o0MDEwVzogRHVwbGljYXRlIFVSTCBtYXBwaW5nIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVD1DSEtKNDAxMVc6IER1cGxpY2F0ZSBTZXJ2bGV0IEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TRVNTSU9OX1RJTUVPVVQ9Q0hLSjQwMTJXOiBTZXNzaW9uIFRpbWVvdXQgaXMgbm90IHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWT1DSEtKNDAxM1c6IER1cGxpY2F0ZSBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlk9Q0hLSjQwMTRXOiBFbXB0eSBFbnRyeSB7MH0uCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0ZJTFRFUj1DSEtKNDAxNVc6IER1cGxpY2F0ZSBGaWx0ZXIgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGPUNIS0o0MDE2VzogRHVwbGljYXRlIGVqYi1yZWYgZWxlbWVudCBuYW1lZCB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgVGhpcyB3YXMgbWlzc2luZy4gIEl0J3MgZGVmaW5lZCBpbiBjb25zdGFudHMuLi4KLUVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT049Q0hLSjQwMTdXOiBFUlJPUiBFQVIgVU5DT05UQUlORUQgTU9EVUxFIEZJTEUgRVhDRVBUSU9OCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFPUlXQUUwMDM2RSBDSEtKNDAxOFc6IFVua25vd24gRXJyb3IgQ29kZTogezB9LiAgZXJyb3ItY29kZSBtdXN0IGNvbnRhaW4gYSB2YWxpZCBIVFRQIHN0YXR1cyBjb2RlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEU9Q0hLSjQwMTlXOiBJbnZhbGlkIHJlcy1zaGFyaW5nLXNjb3BlOyB2YWxpZCB2YWx1ZXMgYXJlIFwiU2hhcmVhYmxlXCIgb3IgXCJVbnNoYXJlYWJsZVwiLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWT1DSEtKNDAyMFc6IEludmFsaWQgRW52aXJvbm1lbnQgRW50cnkgVHlwZS4gVmFsaWQgdmFsdWVzIGFyZSBcImphdmEubGFuZy5UWVBFXCIsIHdoZXJlIFRZUEUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IEJvb2xlYW4sIEJ5dGUsIENoYXJhY3RlciwgU3RyaW5nLCBTaG9ydCwgSW50ZWdlciwgTG9uZywgRmxvYXQsIG9yIERvdWJsZS4iCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1Q9Q0hLSjQwMjFXOiBNaXNzaW5nIFdlYiBMaWJyYXJ5IFByb2plY3QgKHswfSkuICBDaGVjayB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHByb2plY3QgdG8gZml4IHRoaXMgcHJvYmxlbS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQ09ORkxJQ1RJTkdfV0xQX1BST0pFQ1Q9Q0hLSjQwMjJXOiBUaGUgV2ViIExpYnJhcnkgUHJvamVjdCBKQVIgKHswfSkgY29uZmxpY3RzIHdpdGggYW4gYWN0dWFsIEpBUiBpbiB0aGUgV0VCLUlORi9saWIgZGlyZWN0b3J5LgotTVNHX1NFUlZFUl9UQVJHRVRfTUlTTUFUQ0g9Q0hLSjQwMjNXOiBUaGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgV2ViIExpYnJhcnkgUHJvamVjdCAoezF9KSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoaXMgV2ViIFByb2plY3QgKHswfSkuICBSdW4gdmFsaWRhdGlvbiBvbiB0aGUgV2ViIFByb2plY3QgaWYgeW91IHRoaW5rIHRoYXQgaXMgbm90IHRoZSBjYXNlLgotTUVTU0FHRV9VUkxfUEFUVEVSTl9FTkRfV0lUSF9DQVJSQUlHRV9SRVRVUk49VGhlIFVSTCBwYXR0ZXJuIHN0cmluZyAiezB9IiBlbmRzIHdpdGggYSBpbnZhbGlkIGNhcnJhaWdlIHJldHVybiBmb3Igc2VydmxldCB7MX0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRT1DSEtKNDAyM1c6IGVqYi1yZWYtdHlwZSBtdXN0IGJlICdFbnRpdHknIG9yICdTZXNzaW9uJy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1Q9V2ViIGxpYnJhcnkgcHJvamVjdCBhcmNoaXZlIHswfSBmcm9tIHByb2plY3QgezF9IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgYXJjaGl2ZSBhbHNvIG1hcHBlZCB0byB0aGUgV0VCLUlORi9saWIgZm9sZGVyLgotRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCPVdlYiBsaWJyYXJ5IHByb2plY3QgYXJjaGl2ZSB7MH0gY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcmNoaXZlIGFsc28gbWFwcGVkIHRvIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuCi1FUlJPUl9EVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkk9V2ViIGxpYnJhcnkgVVJJIHswfSBmb3IgY2xhc3NwYXRoIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHsxfSBtYXBzIHRvIGEgZGlmZmVyZW50IGZpbGUgc3lzdGVtIHBhdGggYXMgYW5vdGhlciBjbGFzc3BhdGggZGVwZW5kZW5jeSB3aXRoIHRoZSBzYW1lIFVSSS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEU9Q0hLSjI4MjdXOiAnJ3NlY3VyaXR5LXJvbGUtcmVmJycgZWxlbWVudCB7MH0gZGVmaW5lcyB0aGUgJydyb2xlLWxpbmsnJyBlbGVtZW50IGJ1dCBubyAnJ3NlY3VyaXR5LXJvbGUnJyBlbGVtZW50cyBpbiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotb2ZfVHlwZV9TZWN1cml0eV9Sb2xlX05hbWVfNj1vZiBUeXBlIFNlY3VyaXR5IFJvbGUgTmFtZQotV2ViX0FyY2hpdmVfVmFsaWRhdG9yXzg9V2ViIEFyY2hpdmUgVmFsaWRhdG9yCi1vZl9UeXBlX1JvbGVfTmFtZV8xOT1vZiBUeXBlIFJvbGUgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8yNj1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zMj1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8zMz1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zOT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV80MD1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9lamJfcmVmX25hbWVfNDQ9b2YgVHlwZSBlamItcmVmLW5hbWUKLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80OT1vZiBUeXBlIEVycm9yIExvY2F0aW9uCi1vZl9UeXBlX01pbWVfRXh0ZW5zaW9uXzU0PW9mIFR5cGUgTWltZSBFeHRlbnNpb24KLW9mX1R5cGVfTWltZV9UeXBlXzU1PW9mIFR5cGUgTWltZSBUeXBlCi1vZl9UeXBlX01pbWVfRXh0ZW5zaW9uX19fNTY9b2YgVHlwZSBNaW1lIEV4dGVuc2lvbjoKLW9mX1R5cGVfV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25fNjQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgQ29sbGVjdGlvbgotb2ZfVHlwZV9GaWx0ZXJfTmFtZV82Nj1vZiBUeXBlIEZpbHRlciBOYW1lCi1JbnZhbGlkX1VSTF83MD1JbnZhbGlkIFVSTAotSW52YWxpZF9VUkxfNzU9SW52YWxpZCBVUkwKLW9mX1R5cGVfU2VydmxldF9OYW1lXzc3PW9mIFR5cGUgU2VydmxldCBOYW1lCi1vZl9UeXBlX1RhZ2xpYl84MD1vZiBUeXBlIFRhZ2xpYgotb2ZfVHlwZV9UYWdMaWJfX184MT1vZiBUeXBlIFRhZ0xpYjoKLW9mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgTmFtZQotb2ZfVHlwZV9XZWxjb21lX0ZpbGVfTmFtZV9fODc9b2YgVHlwZSBXZWxjb21lIEZpbGUgTmFtZQotb2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4PW9mIFR5cGUgRW52aXJvbm1lbnQgRW50cnkgTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93ZWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMjUwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93ZWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRVJSX0pBUl9OQU1FX0VNUFRZPVRoZSBKQVIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFSX05BTUVfRVhJU1Q9VGhlIEpBUiBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0pBVkFfUFJPSkVDVF9OQU1FX0VNUFRZPVRoZSBKYXZhIHByb2plY3QgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFWQV9QUk9KRUNUX05BTUVfRVhJU1Q9VGhlIEphdmEgcHJvamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX1NFUlZMRVRfTUFQUElOR19VUkxfUEFUVEVSTl9FTVBUWT1UaGUgc2VydmxldCBtYXBwaW5nIHVybCBwYXR0ZXJuIGNhbm5vdCBiZSBlbXB0eS4KLQotS0VZXzM9VGhlIGZpbHRlciBtYXBwaW5nIHVybCBwYXR0ZXJuIGNhbm5vdCBiZSBlbXB0eS4KLUtFWV80PVRoZSBmaWx0ZXIgbWFwcGluZyB1cmwgcGF0dGVybiAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLUtFWV81PVRoZSBmaWx0ZXIgbWFwcGluZyBzZXJ2bGV0IGNhbm5vdCBiZSBlbXB0eS4KLUtFWV82PVRoZSBmaWx0ZXIgaW5pdCBwYXJhbSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9GSUxURVJfUEFSQU1FVEVSX05BTUVfRVhJU1Q9VGhlIGZpbHRlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9GSUxURVJfTUFQUElOR19TRVJWTEVUX0VYSVNUPVRoZSBmaWx0ZXIgbWFwcGluZyBzZXJ2bGV0ICJ7MH0iIGFscmVhZHkgZXhpc3RzLgotRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRElTUEFUQ0hFUl9UWVBFU19FTVBUWT1UaGUgZGlzcGF0Y2hlciB0eXBlcyBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfRElTUExBWV9OQU1FX0VNUFRZPVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9TRVJWTEVUX05BTUVfRVhJU1Q9VGhlIHNlcnZsZXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX0RJU1BMQVlfTkFNRV9FWElTVD1UaGUgc2VydmxldCBkaXNwbGF5IG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfU0VSVkxFVF9DTEFTU19OQU1FX1VTRUQ9VGhlIGNsYXNzIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHNlcnZsZXQuCi1FUlJfU0VSVkxFVF9KQVZBX0NMQVNTX05BTUVfSU5WQUxJRD1DYW5ub3QgdXNlIFNlcnZsZXQgYXMgdGhlIHNlcnZsZXQgY2xhc3MgbmFtZS4KLUVSUl9TRVJWTEVUX01BUFBJTkdfVVJMX1BBVFRFUk5fRVhJU1Q9VGhlIHNlcnZsZXQgVVJMIG1hcHBpbmcgcGF0dGVybiBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX01BUFBJTkdfU0VSVkxFVF9OT1RfRVhJU1Q9VGhlIHNlcnZsZXQgZG9lcyBub3QgZXhpc3QuCi1FUlJfU0VSVkxFVF9QQVJBTUVURVJfTkFNRV9FTVBUWT1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9QQVJBTUVURVJfTkFNRV9FWElTVD1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX1BBUkFNRVRFUl9WQUxVRV9FTVBUWT1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdmFsdWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1NFUlZMRVRfUEFSQU1FVEVSX1ZBTFVFX0VYSVNUPVRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4KLQotRVJSX0ZJTFRFUl9ESVNQTEFZX05BTUVfRVhJU1Q9VGhlIGZpbHRlciBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0ZJTFRFUl9OQU1FX0VYSVNUPVRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9GSUxURVJfQ0xBU1NfTkFNRV9VU0VEPVRoZSBjbGFzcyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBvdGhlciBmaWx0ZXIuCi1FUlJfRklMVEVSX0NMQVNTX05BTUVfSU5WQUxJRD1DYW5ub3QgdXNlIEZpbHRlciBhcyB0aGUgZmlsdGVyIGNsYXNzIG5hbWUuCi0KLUVSUl9MSVNURU5FUl9ESVNQTEFZX05BTUVfRVhJU1Q9VGhlIGxpc3RlbmVyIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfTElTVEVORVJfQ0xBU1NfTkFNRV9VU0VEPVRoZSBjbGFzcyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBvdGhlciBsaXN0ZW5lci4KLUVSUl9MSVNURU5FUl9DTEFTU19OQU1FX0lOVkFMSUQ9Q2Fubm90IHVzZSBMaXN0ZW5lciBhcyB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZS4KLQotRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI9RHVwbGljYXRlZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc9RHVwbGljYXRlZCBVUkwgbWFwcGluZ3MuCi0KLUVSUl9VUkxfTUFQUElOR19MSVNUX0VNUFRZPVRoZSBVUkwgTWFwcGluZ3MgbGlzdCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfVVJMX1BBVFRFUk5fSU5WQUxJRD0iezB9IiBpcyB1bnJlc29sdmFibGUgVVJMIHBhdHRlcm4uIFVSTCBwYXR0ZXJucyBzaG91bGQgc3RhcnQgd2l0aCAiLyIgb3IgIiouIi4KLUVSUl9GSUxURVJfTUFQUElOR19FTVBUWT1UaGUgRmlsdGVyIE1hcHBpbmdzIGxpc3QgY2Fubm90IGJlIGVtcHR5LgotICAKLUVSUl9TRVJWTEVUX1JPTEVfUkVGX05BTUVfRU1QVFk9VGhlIHNlcnZsZXQgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9ST0xFX1JFRl9OQU1FX0VYSVNUPVRoZSBzZXJ2bGV0IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfU0VSVkxFVF9ST0xFX0xJTktfRU1QVFk9VGhlIHNlcnZsZXQgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbGluayBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9JTlRFUkZBQ0U9VGhlIFNlcnZsZXQgY2xhc3Mgb3IgaXRzIHN1cGVyY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlcnZsZXQuU2VydmxldCBpbnRlcmZhY2UuCi0KLUVSUl9QQUdFX0VOQ09ESU5HX0VNUFRZPVRoZSBwYWdlIGVuY29kaW5nIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9QQUdFX0VOQ09ESU5HX0VYSVNUPVRoZSBwYWdlIGVuY29kaW5nIGFscmVhZHkgZXhpc3RzLgotRVJSX1VSTF9QQVRURVJOX0VYSVNUPVRoZSBVUkwgcGF0dGVybiBleGlzdHMuCi1FUlJfSU5DTFVERV9QUkVMVURFU19FWElTVD1UaGUgaW5jbHVkZSBwcmVsdWRlcyBleGlzdHMuCi1FUlJfSU5DTFVERV9DT0RBU19FWElTVD1UaGUgaW5jbHVkZSBDb2RhcyBleGlzdHMuCi1FUlJfU0VDVVJJVFlfQ09OU1RSQUlOVF9OQU1FX0VNUFRZPVRoZSBzZWN1cml0eSBjb25zdHJhaW50IG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1NFQ1VSSVRZX0NPTlNUUkFJTlRfTkFNRV9FWElTVD1UaGUgc2VjdXJpdHkgY29uc3RyYWludCBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0NPTlRFWFRfUEFSQU1FVEVSX05BTUVfRU1QVFk9VGhlIGNvbnRleHQgcGFyYW1ldGVyIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0NPTlRFWFRfUEFSQU1FVEVSX05BTUVfRVhJU1Q9VGhlIGNvbnRleHQgcGFyYW1ldGVyIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfUkVTT1VSQ0VfTkFNRV9FTVBUWT1UaGUgd2ViIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1JFU09VUkNFX05BTUVfRVhJU1Q9VGhlIHdlYiByZXNvdXJjZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX1VSTF9QQVRURVJOU19FTVBUWT1UaGUgVVJMIHBhdHRlcm5zIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9NSU1FX01BUFBJTkdfRVhURU5TSU9OX0VNUFRZPVRoZSBNaW1lIG1hcHBpbmcgZXh0ZW5zaW9uIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9NSU1FX01BUFBJTkdfRVhURU5TSU9OX0VYSVNUPVRoZSBNaW1lIG1hcHBpbmcgZXh0ZW5zaW9uIGFscmVhZHkgZXhpc3RzLgotRVJSX1dFTENPTUVfUEFHRV9FTVBUWT1UaGUgV2VsY29tZSBmaWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1dFTENPTUVfUEFHRV9FWElTVD1UaGUgV2VsY29tZSBmaWxlIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gV2VsY29tZSBGaWxlIExpc3QuCi1FUlJfRU5WX0VOVFJZX05BTUVfRU1QVFk9VGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VOVl9FTlRSWV9OQU1FX0VYSVNUPVRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0VSUk9SX0NPREVfRU1QVFk9VGhlIGVycm9yIGNvZGUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VSUk9SX0NPREVfTVVTVF9CRV8zX0RJR0lUUz1UaGUgZXJyb3IgY29kZSBtdXN0IGJlIHRocmVlIGRpZ2l0cy4KLUVSUl9FUlJPUl9QQUdFX0xPQ0FUSU9OX0VNUFRZPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9FUlJPUl9QQUdFX0xPQ0FUSU9OX0VYSVNUPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIGFscmVhZHkgZXhpc3RzLgotRVJSX0VSUk9SX1BBR0VfTE9DQVRJT05fTVVTVF9TVEFSVF9XSVRIX1NMQVNIPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIG11c3Qgc3RhcnQgd2l0aCAvLgotRVJSX0VYQ0VQVElPTl9UWVBFX0VNUFRZPVRoZSBleGNlcHRpb24gdHlwZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfRVhDRVBUSU9OX1NFQ1VSSVRZX0lEX05PX0JFQU5TPVRoZSBiZWFuIHNlbGVjdGlvbiBjYW4gbm90IGJlIGVtcHR5LgotRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk9VGhlIHJvbGUgbmFtZSBjYW4gbm90IGJlIGVtcHR5LgotRVJSX0xPQ0FMRV9OQU1FX0VNUFRZPVRoZSBsb2NhbGUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0xPQ0FMRV9OQU1FX0VYSVNUPVRoZSBsb2NhbGUgYWxyZWFkeSBleGlzdHMuCi1FUlJfVEFHTElCUkVGX1VSTF9FTVBUWT1UaGUgdGFnIGxpYiByZWYgVVJMIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9UQUdMSUJSRUZfVVJMX0VYSVNUPVRoZSB0YWcgbGliIHJlZiBVUkwgYWxyZWFkeSBleGlzdHMuCi1FUlJfTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VNUFRZPVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX01FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FWElTVD1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk9VGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VYQ0VQVElPTl9NRVRIT0RfRUxFTUVOVF9FTVBUWT1UaGUgbWV0aG9kIGVsZW1lbnRzIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9FWENFUFRJT05fTUVUSE9EX1RSQU5TQUNUSU9OX0FUVFJJQlVURVNfRU1QVFk9VGhlIG1ldGhvZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGNhbiBub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIHNlcnZsZXRzIHRvIGJlIHJlbW92ZWQgY2Fubm90IGJlIGVtcHR5LgotRVJSX0ZJTFRFUl9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIGZpbHRlcnMgdG8gYmUgcmVtb3ZlZCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfTElTVEVORVJfTElTVF9FTVBUWT1UaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdG8gYmUgcmVtb3ZlZCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfTk9fTElTVEVORVJfU0VMRUNURUQ9QXQgbGVhc3Qgb25lIG9mIHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIG11c3QgYmUgc2VsZWN0ZWQuIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDc2ZjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dlYmVkaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRfRmlsdGVyX01hcHBpbmdfVGl0bGVfVUlfPUFkZCBGaWx0ZXIgTWFwcGluZwotRWRpdF9GaWx0ZXJfTWFwcGluZ19UaXRsZV9VSV89RWRpdCBGaWx0ZXIgTWFwcGluZwotRklMVEVSX01BUFBJTkc9RmlsdGVyIE1hcHBpbmcKLURJU1BBVENIRVJfUj1SCi1ESVNQQVRDSEVSX0Y9RgotRElTUEFUQ0hFUl9JPUkKLURJU1BBVENIRVJfRT1FCi1MSVNURU5FUj1MaXN0ZW5lcgotU2VsZWN0X0Rpc3BhdGNoZXJzX1VJXz1TZWxlY3QgRGlzcGF0Y2hlcnMKLUNvbnRhaW5lcl9TZWxlY3Rpb25fVUlfPUZvbGRlciBTZWxlY3Rpb24KLUNob29zZV9hX0NvbnRhaW5lcl9fVUlfPUNob29zZSBhIEZvbGRlcjoKLUNvbnRhaW5lcl9fVUlfPUZvbGRlcjoKLUJyb3dzZS4uLl9VSV89QnJvd3NlLi4uCi1TdXBlcmNsYXNzX3NlbGVjdGlvbl9VSV89U3VwZXJjbGFzcyBzZWxlY3Rpb24KLUNob29zZV9hX3N1cGVyY2xhc3NfVUlfPUNob29zZSBhIHN1cGVyY2xhc3MKLUFkZC4uLl9VSV89QWRkLi4uCi1SZW1vdmVfVUlfPVJlbW92ZQotTm9fcGFja2FnZXNfdG9fY2hvb3NlX2Zyb21fVUlfPU5vIHBhY2thZ2VzIHRvIGNob29zZSBmcm9tLgotRXJyb3JfRVhDXz1JV0FFMDAxNUUgRXJyb3IKLVNwZWNpZnlfYV9uYW1lX2FuZF9wYWNrYWdlX1VJXz1DcmVhdGUgYSBuZXcgU2VydmxldCBjbGFzcy4KLVdoaWNoX21ldGhvZF9zdHVic193b3VsZF95X1VJXz1XaGljaCBtZXRob2Qgc3R1YnMgd291bGQgeW91IGxpa2UgdG8gY3JlYXRlPwotX19BZGRfdG9fd2ViLnhtbD9fVUlfPUFkZCB0byB3ZWIueG1sPwotX19BZGQuLi5fX19VSV89QWRkCi1fX0RlbGV0ZV9fX1VJXz1EZWxldGUKLUNhbmNlbF9VSV89Q2FuY2VsCi1OZXdfVUlfPU5ldwotTm9uZV9VSV89Tm9uZQotQ3JlYXRlX3RoZV9TZXJ2bGV0X0NsYXNzX1VJXz1DcmVhdGUgdGhlIFNlcnZsZXQgQ2xhc3MKLURlZmluZV90aGVfU2VydmxldF9pbl90aGVfX1VJXz1EZWZpbmUgdGhlIFNlcnZsZXQgaW4gdGhlIERlcGxveW1lbnQgRGVzY3JpcHRvciAod2ViLnhtbCkgRmlsZQotSWRlbnRpZnlfYW55X2luZm9ybWF0aW9uX3RfVUlfPUlkZW50aWZ5IGFueSBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgKHdlYi54bWwpIGZpbGUgZm9yIHRoZSBzZXJ2bGV0LgotQ3JlYXRlX1R3b19DaGlsZHJlbl9VSV89Q3JlYXRlIFR3byBDaGlsZHJlbgotQ3JlYXRlX0NoaWxkX1VJXz1DcmVhdGUgQ2hpbGQKLURlc2NyaXB0aW9uX1VJXz1EZXNjcmlwdGlvbgotMmNvbmNhdF9VSV89Q3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotNGNvbmNhdF9VSV89Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uCi02Y29uY2F0X1VJXz1DcmVhdGUgezB9Ci03Y29uY2F0X1VJXz1DcmVhdGUgdHdvIG5ldyBjaGlsZHJlbiBmb3IgdGhlIHNlbGVjdGVkIHswfS4KLThjb25jYXRfVUlfPUNyZWF0ZSB0d28gbmV3IGNoaWxkcmVuIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezF9LgotOWNvbmNhdF9VSV89Q3JlYXRlIFR3byB7MH1zCi0xMWNvbmNhdF9VSV89QXV0aENvbnN0cmFpbnQgezB9Ci0xMmNvbmNhdF9VSV89Q29udGV4dFBhcmFtIHswfQotMTNjb25jYXRfVUlfPUVycm9yUGFnZSB7MH0KLTE0Y29uY2F0X1VJXz1FcnJvciBDb2RlOiB7MH0KLTE1Y29uY2F0X1VJXz1FeGNlcHRpb246IHswfQotNTJjb25jYXRfVUlfPUZvcm1Mb2dpbkNvbmZpZyB7MH0KLTE2Y29uY2F0X1VJXz1Gb3JtTG9naW5Db25maWcgezB9Ci0xN2NvbmNhdF9VSV89SFRUUE1ldGhvZFR5cGUgezB9Ci0xOGNvbmNhdF9VSV89ezB9ID0gezF9Ci0yMWNvbmNhdF9VSV89TG9naW5Db25maWcgezB9Ci0yMmNvbmNhdF9VSV89TWltZU1hcHBpbmcgezB9Ci0yM2NvbmNhdF9VSV89Um9sZU5hbWVUeXBlIHswfQotMjRjb25jYXQ9Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi0yNmNvbmNhdF9VSV89Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBJbml0UGFyYW0gZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi0yOGNvbmNhdF9VSV89ezB9IC0+IHsxfQotMzFjb25jYXRfVUlfPVNlc3Npb25Db25maWcgezB9Ci0zMmNvbmNhdF9VSV89VGFnTGliUmVmIHswfQotMzNjb25jYXRfVUlfPVVSTFBhdHRlcm5UeXBlIHswfQotMzRjb25jYXRfVUlfPVVzZXJEYXRhQ29uc3RyYWludCB7MH0KLTM1Y29uY2F0X1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIENvbnRleHRQYXJhbSBmb3IgdGhlIHNlbGVjdGVkIHswfS4KLTM3Y29uY2F0X1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFVSTFBhdHRlcm5UeXBlIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotMzhjb25jYXRfVUlfPVdlYlJlc291cmNlQ29sbGVjdGlvbiB7MH0KLTQwY29uY2F0X1VJXz1KU1BUeXBlIHswfQotNDFjb25jYXRfVUlfPVNlcnZsZXRUeXBlIHswfQotNDJjb25jYXRfVUlfPUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgV2VsY29tZUZpbGUgZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi00NWNvbmNhdF9FUlJPUl89SVdBRTAwMTZFIEVycm9yIHdyaXRpbmcgdG8gd2ViLnhtbDp7MH0KLTUwY29uY2F0X1VJXz17MH0gQ2hhbmdlCi1OZXdfcGFyYW1fVUlfPU5ldyBwYXJhbQotdmFsdWVfVUlfPXZhbHVlCi1OZXdfaW5pdF9wYXJhbV9VSV89TmV3IGluaXQgcGFyYW0KLShOZXdfU2VjdXJpdHlfUm9sZSlfVUlfPShOZXcgU2VjdXJpdHkgUm9sZSkKLU5ld19zZWN1cml0eV9yb2xlX1VJXz1OZXcgc2VjdXJpdHkgcm9sZQotKE5ld19TZXJ2bGV0KV9VSV89KE5ldyBTZXJ2bGV0KQotcGFja2FnZW5hbWUuY2xhc3NuYW1lX1VJXz1wYWNrYWdlbmFtZS5jbGFzc25hbWUKLU5ld19zZXJ2bGV0X1VJXz1OZXcgc2VydmxldAotL3VybC8qX1VJXz0vdXJsLyoKLU5ld19zZXJ2bGV0X21hcHBpbmdfVUlfPU5ldyBzZXJ2bGV0IG1hcHBpbmcKLShOZXdfZmlsZW5hbWUpX1VJXz0oTmV3IGZpbGVuYW1lKQotTmV3X3dlbGNvbWVfZmlsZV9VSV89TmV3IHdlbGNvbWUgZmlsZQotTmV3X3dlbGNvbWVfZmlsZV9saXN0X1VJXz1OZXcgd2VsY29tZSBmaWxlIGxpc3QKLVByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXz1JV0FFMDAxN0UgUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IKLUxhcmdlX0ljb25fQ2hvb3Nlcl9EaWFsb2dfVUlfPUxhcmdlIEljb24gQ2hvb3NlciBEaWFsb2cKLVNtYWxsX0ljb25fQ2hvb3Nlcl9EaWFsb2dfVUlfPVNtYWxsIEljb24gQ2hvb3NlciBEaWFsb2cKLUJyb3dzZS4uLl9VSV9fVUlfPUJyb3dzZS4uLgotVmFsdWVfX1VJXz1WYWx1ZToKLURlc2NyaXB0aW9uX1VJX19VSV89RGVzY3JpcHRpb24KLUVycm9yX0VYQ19fRVJST1JfPUlXQUUwMDE4RSBFcnJvcgotcm9vdF91bmRlZl9FUlJPUl89SVdBRTAwMTlFIHJvb3QgdW5kZWYKLVBhY2thZ2VfX1VJXz1QYWNrYWdlOgotKGRlZmF1bHQpX1VJXz0oZGVmYXVsdCkKLVNlcnZsZXRfTmFtZV9fVUlfPVNlcnZsZXQgTmFtZToKLVN1cGVyY2xhc3NfX1VJXz1TdXBlcmNsYXNzOgotSW50ZXJmYWNlc19fVUlfPUludGVyZmFjZXM6Ci1Nb2RpZmllcnNfX1VJXz1Nb2RpZmllcnM6Ci1Vc2VfU2luZ2xlX1RocmVhZF9Nb2RlbF9VSV89VXNlIFNpbmdsZSBUaHJlYWQgTW9kZWwKLU9wdGlvbnNfX1VJXz1PcHRpb25zOgotUGFja2FnZV9TZWxlY3Rpb25fVUlfPVBhY2thZ2UgU2VsZWN0aW9uCi1DaG9vc2VfYV9wYWNrYWdlX19VSV89Q2hvb3NlIGEgcGFja2FnZToKLVN1cGVyaW50ZXJmYWNlc19TZWxlY3Rpb25fVUlfPVN1cGVyaW50ZXJmYWNlcyBTZWxlY3Rpb24KLUNob29zZV9pbnRlcmZhY2VzX1VJXz1DaG9vc2UgaW50ZXJmYWNlcwotQ3JlYXRlX3RoZV9TZXJ2bGV0X0NsYXNzX1VJX19VSV89Q3JlYXRlIHRoZSBTZXJ2bGV0IENsYXNzCi1Jbmhlcml0ZWRfYWJzdHJhY3RfbWV0aG9kc19VSV89SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKLUNvbnN0cnVjdG9yc19mcm9tX3N1cGVyY2xhX1VJXz1Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzCi1NYXBwaW5nc19fVUlfPU1hcHBpbmdzOgotVVJMX1VJXz1VUkwKLVVSTF9fVUlfPVVSTDoKLUFkZF9NYXBwaW5nX1VJXz1BZGQgTWFwcGluZwotRGlzcGxheV9OYW1lX19VSV89RGlzcGxheSBuYW1lOgotSW5pdF9QYXJhbWV0ZXJzX19VSV89SW5pdCBQYXJhbWV0ZXJzOgotSW5pdGlhbGl6YXRpb25fcGFyYW1ldGVyX1VJXz1Jbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLVZhbHVlX1VJXz1WYWx1ZQotUGFyYW1ldGVyX05hbWVfX1VJXz1QYXJhbWV0ZXIgTmFtZToKLVBhcmFtZXRlcl9WYWx1ZV9fVUlfPVBhcmFtZXRlciBWYWx1ZToKLUFkZF9Jbml0aWFsaXphdGlvbl9QYXJhbWV0X1VJXz1BZGQgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1PS19VSV89T0sKLShkZWZhdWx0X3BhY2thZ2UpX1VJXz0oZGVmYXVsdCBwYWNrYWdlKQotQXV0aG9yaXplZF9Sb2xlc19VSV89QXV0aG9yaXplZCByb2xlcwotRWRpdC4uLl9VSV89RWRpdC4uLgotKE5ld193ZWJfcmVzb3VyY2VfY29sbGVjdGlfVUlfPShOZXcgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24pCi1OZXdfd2ViX3Jlc291cmNlX2NvbGxlY3Rpb19VSV89TmV3IHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi1EZWxldGVfd2ViX3Jlc291cmNlX2NvbGxlY19VSV89RGVsZXRlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi1XZWJfUmVzb3VyY2VfQ29sbGVjdGlvbl9VSV89V2ViIHJlc291cmNlIGNvbGxlY3Rpb24KLVdlYl9SZXNvdXJjZV9Db2xsZWN0aW9uc19VSV89V2ViIFJlc291cmNlIENvbGxlY3Rpb25zCi1OZXdfVUlfX1VJXz1BZGQKLURlbGV0ZV9VSV89UmVtb3ZlCi1Vc2VyX0RhdGFfQ29uc3RyYWludF9VSV89VXNlciBkYXRhIGNvbnN0cmFpbnQKLU5ld19zZWN1cml0eV9jb25zdHJhaW50X1VJXz1OZXcgc2VjdXJpdHkgY29uc3RyYWludAotVHJhbnNwb3J0X2d1YXJlbnRlZV9jaGFuZ2VfVUlfPVRyYW5zcG9ydCBndWFyZW50ZWUgY2hhbmdlCi1EZWxldGVfc2VjdXJpdHlfY29uc3RyYWludF9VSV89RGVsZXRlIHNlY3VyaXR5IGNvbnN0cmFpbnQKLVNlY3VyaXR5X2NvbnN0cmFpbnRzX1VJXz1TZWN1cml0eSBjb25zdHJhaW50cwotTmFtZV9VSV89TmFtZQotKE5ld19XZWJfUmVzb3VyY2VfQ29sbGVjdGlfVUlfPShOZXcgV2ViIFJlc291cmNlIENvbGxlY3Rpb24pCi1DaG9vc2VfYV9KU1BfVUlfPUNob29zZSBhIEpTUAotU2VsZWN0X2FfSlNQX2ZpbGVfVUlfPVNlbGVjdCBhIEpTUCBmaWxlCi1DaG9vc2VfYV9zZXJ2bGV0X1VJXz1DaG9vc2UgYSBzZXJ2bGV0Ci1TZWxlY3RfYV9zZXJ2bGV0X2NsYXNzX1VJXz1TZWxlY3QgYSBzZXJ2bGV0IGNsYXNzCi0oTmV3X1VSTClfVUlfPShOZXcgVVJMKQotSWNvbl9jaGFuZ2VfVUlfPUljb24gY2hhbmdlCi1BdXRob3JpemVkX1JvbGVzX19VSV89QXV0aG9yaXplZCByb2xlczoKLURlbGV0ZV9zZXJ2bGV0X21hcHBpbmdzX1VJXz1EZWxldGUgc2VydmxldCBtYXBwaW5ncwotVHlwZV9fVUlfPVR5cGU6Ci1TZXJ2bGV0X2NsYXNzX1VJXz1TZXJ2bGV0IGNsYXNzCi1KU1BfZmlsZV9VSV89SlNQIGZpbGUKLURpc3BsYXlfbmFtZV9fVUlfPURpc3BsYXkgbmFtZToKLURlc2NyaXB0aW9uX19VSV89RGVzY3JpcHRpb246Ci1Jbml0aWFsaXphdGlvbl9fVUlfPUluaXRpYWxpemF0aW9uLi4uCi1JY29uc19fVUlfPUljb25zLi4uCi1EaXNwbGF5X25hbWVfY2hhbmdlX1VJXz1EaXNwbGF5IG5hbWUgY2hhbmdlCi1EZXNjcmlwdGlvbl9jaGFuZ2VfVUlfPURlc2NyaXB0aW9uIGNoYW5nZQotV2ViX3R5cGVfY2hhbmdlX1VJXz1XZWIgdHlwZSBjaGFuZ2UKLVVSTF9NYXBwaW5nc19fVUlfPVVSTCBtYXBwaW5nczoKLU5ldy4uLl9VSV89TmV3Li4uCi1BZGRfVUlfPUFkZAotRGVsZXRlX3NlcnZsZXRzX1VJXz1EZWxldGUgc2VydmxldHMKLVNlcnZsZXRzX1VJXz1TZXJ2bGV0cwotKE5ld19VUkkpX1VJXz0oTmV3IFVSSSkKLS9XRUItSU5GL3RsZHMvKHRhZ2xpYi50bGQpX1VJXz0vV0VCLUlORi90bGRzLyh0YWdsaWIudGxkKQotTmV3X3RhZ2xpYl9VSV89TmV3IHRhZ2xpYgotRGVsZXRlX3RhZ2xpYnNfVUlfPURlbGV0ZSB0YWdsaWJzCi1VUklfVUlfPVVSSQotTG9jYXRpb25fVUlfPUxvY2F0aW9uCi0oTmV3X0NvbnRleHRQYXJhbWV0ZXIpX1VJXz0oTmV3IENvbnRleHRQYXJhbWV0ZXIpCi1OZXdfY29udGV4dF9wYXJhbWV0ZXJfVUlfPU5ldyBjb250ZXh0IHBhcmFtZXRlcgotQ29udGV4dF9wYXJhbWV0ZXJzX19VSV89Q29udGV4dCBwYXJhbWV0ZXJzOgotQ29udGV4dF9QYXJhbWV0ZXJfTmFtZV9VSV89Q29udGV4dCBQYXJhbWV0ZXIgTmFtZQotKE5ld19FeHRlbnNpb24pX1VJXz0oTmV3IEV4dGVuc2lvbikKLU5ld19taW1lX21hcHBpbmdfVUlfPU5ldyBtaW1lIG1hcHBpbmcKLURlbGV0ZV9taW1lX21hcHBpbmdzX1VJXz1EZWxldGUgbWltZSBtYXBwaW5ncwotU2Vzc2lvbl90aW1lX291dF9fVUlfPVNlc3Npb24gdGltZSBvdXQ6Ci1EaXN0cmlidXRhYmxlX1VJXz1EaXN0cmlidXRhYmxlCi1EaXNwbGF5X05hbWVfVUlfPURpc3BsYXkgTmFtZQotU2Vzc2lvbl9Db25maWdfVUlfPVNlc3Npb24gQ29uZmlnCi1TZXNzaW9uX1RpbWVvdXRfVUlfPVNlc3Npb24gVGltZW91dAotTWltZV9tYXBwaW5nc19fVUlfPU1pbWUgbWFwcGluZ3M6Ci1GaWxlX0V4dGVuc2lvbl9VSV89RmlsZSBFeHRlbnNpb24KLU1pbWVfVHlwZV9VSV89TWltZSBUeXBlCi1EZWxldGVfY29udGV4dF9wYXJhbWV0ZXJzX1VJXz1EZWxldGUgY29udGV4dCBwYXJhbWV0ZXJzCi1XZWxjb21lX2ZpbGVfbmFtZV9jaGFuZ2VfVUlfPVdlbGNvbWUgZmlsZSBuYW1lIGNoYW5nZQotKE5ld19XZWxjb21lX0ZpbGUpX1VJXz0oTmV3IFdlbGNvbWUgRmlsZSkKLUNob29zZV9hbl9FcnJvcl9QYWdlX1VJXz1DaG9vc2UgYW4gRXJyb3IgUGFnZQotU2VsZWN0X2FuX0Vycm9yX1BhZ2VfVUlfPVNlbGVjdCBhbiBFcnJvciBQYWdlCi1EZWxldGVfd2VsY29tZV9maWxlc19VSV89RGVsZXRlIHdlbGNvbWUgZmlsZXMKLURlbGV0ZV9lcnJvcl9wYWdlc19VSV89RGVsZXRlIGVycm9yIHBhZ2VzCi1XZWxjb21lX2ZpbGVzX1VJXz1XZWxjb21lIGZpbGVzCi1DaG9vc2VfYV9Mb2dpbl9QYWdlX1VJXz1DaG9vc2UgYSBMb2dpbiBQYWdlCi1TZWxlY3RfYV9Mb2dpbl9QYWdlX1VJXz1TZWxlY3QgYSBMb2dpbiBQYWdlCi1FcnJvcl9tYXBwaW5nX19VSV89RXJyb3IgbWFwcGluZzoKLUVycm9yL0V4Y2VwdGlvbl9VSV89RXJyb3IvRXhjZXB0aW9uCi1Mb2dpbl9VSV89TG9naW4KLVJlYWxtX25hbWVfX1VJXz1SZWFsbSBuYW1lOgotQXV0aGVudGljYXRpb25fbWV0aG9kX19VSV89QXV0aGVudGljYXRpb24gbWV0aG9kOgotTG9naW5fcGFnZV9fVUlfPUxvZ2luIHBhZ2U6Ci1FcnJvcl9wYWdlX19VSV89RXJyb3IgcGFnZToKLU5ld19sb2dpbl9jb25maWdfVUlfPU5ldyBsb2dpbiBjb25maWcKLU5ld19hdXRoX21ldGhvZF9FUlJPUl89SVdBRTAwMjBFIE5ldyBhdXRoIG1ldGhvZAotTmV3X2F1dGhfbWV0aG9kX1VJXz1OZXcgYXV0aCBtZXRob2QKLU5ld19yZWFsbV9uYW1lX1VJXz1OZXcgcmVhbG0gbmFtZQotTmV3X2Zvcm1fbG9naW5fY29uZmlnX1VJXz1OZXcgZm9ybSBsb2dpbiBjb25maWcKLU5ld19mb3JtX2Vycm9yX3BhZ2VfVUlfPU5ldyBmb3JtIGVycm9yIHBhZ2UKLShOZXdfRXJyb3JfQ29kZSlfVUlfPShOZXcgRXJyb3IgQ29kZSkKLU5ld19lcnJvcl9wYWdlX1VJXz1OZXcgZXJyb3IgcGFnZQotUm9sZV9OYW1lX1VJXz1Sb2xlIE5hbWUKLVNlbGVjdF9hbGxfVUlfPVNlbGVjdCBhbGwKLURlc2VsZWN0X2FsbF9VSV89RGVzZWxlY3QgYWxsCi1BdXRob3JpdHlfY29uc3RyYWludF9jaGFuZ19VSV89QXV0aG9yaXR5IGNvbnN0cmFpbnQgY2hhbmdlCi1TZWxlY3RfQXV0aF9Db25zdHJhaW50c19VSV89U2VsZWN0IEF1dGggQ29uc3RyYWludHMKLUxvYWRfb25fc3RhcnR1cF9VSV89TG9hZCBvbiBzdGFydHVwCi1Mb2FkX29yZGVyX19VSV89TG9hZCBvcmRlcjoKLU5ld19wYXJhbWV0ZXJfVUlfPU5ldyBwYXJhbWV0ZXIKLUluaXRpYWxpemF0aW9uX1BhcmFtZXRlcl9VSV89SW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1Mb2FkX29uX3N0YXJ0dXBfY2hhbmdlX1VJXz1Mb2FkIG9uIHN0YXJ0dXAgY2hhbmdlCi1EZWxldGVfcGFyYW1ldGVyX1VJXz1EZWxldGUgcGFyYW1ldGVyCi1Jbml0aWFsaXphdGlvbl9QYXJhbWV0ZXJzX1VJXz1Jbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzCi1TZWN1cml0eV9yb2xlX2NoYW5nZXNfVUlfPVNlY3VyaXR5IHJvbGUgY2hhbmdlcwotTmV3X3NlY3VyaXR5X3JvbGVfcmVmZXJlbmNfVUlfPU5ldyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZQotcmVtb3ZlX3NlY3VyaXR5X3JvbGVfcmVmZXJfVUlfPXJlbW92ZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZQotU2VsZWN0X0F1dGhvcml6ZWRfUm9sZXNfVUlfPVNlbGVjdCBBdXRob3JpemVkIFJvbGVzCi1OYW1lX19VSV89TmFtZToKLURlbGV0ZV9VUkxfUGF0dGVybnNfVUlfPURlbGV0ZSBVUkwgUGF0dGVybnMKLVVSTF9QYXR0ZXJuc19VSV89VVJMIFBhdHRlcm5zCi1IVFRQX01ldGhvZHNfVUlfPUhUVFAgTWV0aG9kcwotKE5ld19VUkxfcGF0dGVybilfVUlfPShOZXcgVVJMIHBhdHRlcm4pCi1OZXdfVVJMX3BhdHRlcm5fVUlfPU5ldyBVUkwgcGF0dGVybgotV2ViX3Jlc291cmNlX2NvbGxlY3Rpb25fbmFfVUlfPVdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIG5hbWUgY2hhbmdlCi1XZWJfcmVzb3VyY2VfY29sbGVjdGlvbl9kZV9VSV89V2ViIHJlc291cmNlIGNvbGxlY3Rpb24gZGVzY3JpcHRpb24gY2hhbmdlCi1BZGRfaHR0cF9tZXRob2RfdHlwZV9VSV89QWRkIGh0dHAgbWV0aG9kIHR5cGUKLVJlbW92ZV9odHRwX21ldGhvZF90eXBlX1VJXz1SZW1vdmUgaHR0cCBtZXRob2QgdHlwZQotRUpCX3JlZmVyZW5jZXNfVUlfPUVKQiByZWZlcmVuY2VzCi1SZXNvdXJjZV9mYWN0b3J5X3JlZmVyZW5jZV9VSV89UmVzb3VyY2UgcmVmZXJlbmNlcwotSlNQX3RhZ19saWJyYXJpZXNfVUlfPUpTUCB0YWcgbGlicmFyaWVzCi1SZWZlcmVuY2VzX1VJXz1SZWZlcmVuY2VzCi1FbnZpcm9ubWVudF9VSV89RW52aXJvbm1lbnQKLVNvdXJjZV9VSV89U291cmNlCi1FcnJvcl9jcmVhdGluZ19uZXN0ZWRfdGV4dF9FUlJPUl89SVdBRTAwMjFFIEVycm9yIGNyZWF0aW5nIG5lc3RlZCB0ZXh0IGVkaXRvcgotUGFnZXNfVUlfPVBhZ2VzCi1TZWN1cml0eV9VSV89U2VjdXJpdHkKLUdlbmVyYWxfVUlfPUdlbmVyYWwKLVRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV89VGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5Ci1Sb2xlc19VSV89Um9sZXMKLVRoZV9yb2xlc19wcm9wZXJ0eV9VSV89VGhlIHJvbGVzIHByb3BlcnR5Ci1TZWNDb25zdHJhaW50X1VJXz1TZWNDb25zdHJhaW50Ci1UaGVfc2VjQ29uc3RyYWludF9wcm9wZXJ0eV9VSV89VGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkKLVBhcmFtTmFtZV9VSV89UGFyYW1OYW1lCi1UaGVfcGFyYW1OYW1lX3Byb3BlcnR5X1VJXz1UaGUgcGFyYW1OYW1lIHByb3BlcnR5Ci1QYXJhbVZhbHVlX1VJXz1QYXJhbVZhbHVlCi1UaGVfcGFyYW1WYWx1ZV9wcm9wZXJ0eV9VSV89VGhlIHBhcmFtVmFsdWUgcHJvcGVydHkKLVdlYkFwcF9VSV89V2ViQXBwCi1UaGVfd2ViQXBwX3Byb3BlcnR5X1VJXz1UaGUgd2ViQXBwIHByb3BlcnR5Ci1UaGVfbG9jYXRpb25fcHJvcGVydHlfVUlfPVRoZSBsb2NhdGlvbiBwcm9wZXJ0eQotRXJyb3JDb2RlX1VJXz1FcnJvckNvZGUKLVRoZV9lcnJvckNvZGVfcHJvcGVydHlfVUlfPVRoZSBlcnJvckNvZGUgcHJvcGVydHkKLUV4Y2VwdGlvblR5cGVfVUlfPUV4Y2VwdGlvblR5cGUKLVRoZV9leGNlcHRpb25UeXBlX3Byb3BlcnR5X1VJXz1UaGUgZXhjZXB0aW9uVHlwZSBwcm9wZXJ0eQotRm9ybUxvZ2luUGFnZV9VSV89Rm9ybUxvZ2luUGFnZQotVGhlX2Zvcm1Mb2dpblBhZ2VfcHJvcGVydHlfVUlfPVRoZSBmb3JtTG9naW5QYWdlIHByb3BlcnR5Ci1Gb3JtRXJyb3JQYWdlX1VJXz1Gb3JtRXJyb3JQYWdlCi1UaGVfZm9ybUVycm9yUGFnZV9wcm9wZXJ0eV9VSV89VGhlIGZvcm1FcnJvclBhZ2UgcHJvcGVydHkKLUxvZ2luQ29uZmlnX1VJXz1Mb2dpbkNvbmZpZwotVGhlX2xvZ2luQ29uZmlnX3Byb3BlcnR5X1VJXz1UaGUgbG9naW5Db25maWcgcHJvcGVydHkKLUh0dHBNZXRob2RfVUlfPUh0dHBNZXRob2QKLVRoZV9odHRwTWV0aG9kX3Byb3BlcnR5X1VJXz1UaGUgaHR0cE1ldGhvZCBwcm9wZXJ0eQotUmVzQ29sbGVjdGlvbl9VSV89UmVzQ29sbGVjdGlvbgotVGhlX3Jlc0NvbGxlY3Rpb25fcHJvcGVydHlfVUlfPVRoZSByZXNDb2xsZWN0aW9uIHByb3BlcnR5Ci1BdXRoTWV0aG9kX1VJXz1BdXRoTWV0aG9kCi1UaGVfYXV0aE1ldGhvZF9wcm9wZXJ0eV9VSV89VGhlIGF1dGhNZXRob2QgcHJvcGVydHkKLVJlYWxtTmFtZV9VSV89UmVhbG1OYW1lCi1UaGVfcmVhbG1OYW1lX3Byb3BlcnR5X1VJXz1UaGUgcmVhbG1OYW1lIHByb3BlcnR5Ci1Gb3JtTG9naW5Db25maWdfVUlfPUZvcm1Mb2dpbkNvbmZpZwotVGhlX2Zvcm1Mb2dpbkNvbmZpZ19wcm9wZXJfVUlfPVRoZSBmb3JtTG9naW5Db25maWcgcHJvcGVydHkKLUV4dGVuc2lvbl9VSV89RXh0ZW5zaW9uCi1UaGVfZXh0ZW5zaW9uX3Byb3BlcnR5X1VJXz1UaGUgZXh0ZW5zaW9uIHByb3BlcnR5Ci1NaW1lVHlwZV9VSV89TWltZVR5cGUKLVRoZV9taW1lVHlwZV9wcm9wZXJ0eV9VSV89VGhlIG1pbWVUeXBlIHByb3BlcnR5Ci1Sb2xlTmFtZV9VSV89Um9sZU5hbWUKLVRoZV9yb2xlTmFtZV9wcm9wZXJ0eV9VSV89VGhlIHJvbGVOYW1lIHByb3BlcnR5Ci1BdXRoQ29uc3RyYWludF9VSV89QXV0aENvbnN0cmFpbnQKLVRoZV9hdXRoQ29uc3RyYWludF9wcm9wZXJ0X1VJXz1UaGUgYXV0aENvbnN0cmFpbnQgcHJvcGVydHkKLVVzZXJEYXRhQ29uc3RyYWludF9VSV89VXNlckRhdGFDb25zdHJhaW50Ci1UaGVfdXNlckRhdGFDb25zdHJhaW50X3Byb19VSV89VGhlIHVzZXJEYXRhQ29uc3RyYWludCBwcm9wZXJ0eQotQ3JlYXRlX1dlYlJlc291cmNlQ29sbGVjdGlfVUlfPUNyZWF0ZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24KLVNlY3VyaXR5Q29uc3RyYWludF9VSV89U2VjdXJpdHlDb25zdHJhaW50Ci1TbWFsbEljb25fVUlfPVNtYWxsSWNvbgotU21hbGxfSWNvbl9VSV89U21hbGwgSWNvbgotTGFyZ2VJY29uX1VJXz1MYXJnZUljb24KLUxhcmdlX0ljb25fVUlfPUxhcmdlIEljb24KLVNlcnZsZXROYW1lX1VJXz1TZXJ2bGV0TmFtZQotVGhlX3NlcnZsZXROYW1lX3Byb3BlcnR5X1VJXz1UaGUgc2VydmxldE5hbWUgcHJvcGVydHkKLURpc3BsYXlOYW1lX1VJXz1EaXNwbGF5TmFtZQotVGhlX2Rpc3BsYXlOYW1lX3Byb3BlcnR5X1VJXz1UaGUgZGlzcGxheU5hbWUgcHJvcGVydHkKLUxvYWRPblN0YXJ0dXBfVUlfPUxvYWRPblN0YXJ0dXAKLVRoZV9sb2FkT25TdGFydHVwX3Byb3BlcnR5X1VJXz1UaGUgbG9hZE9uU3RhcnR1cCBwcm9wZXJ0eQotQ3JlYXRlX0luaXRQYXJhbV9VSV89Q3JlYXRlIEluaXRQYXJhbQotPHNlcnZsZXQ+X1VJXz08c2VydmxldD4KLVVybFBhdHRlcm5fVUlfPVVybFBhdHRlcm4KLVRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXz1UaGUgdXJsUGF0dGVybiBwcm9wZXJ0eQotU2VydmxldF9VSV89U2VydmxldAotVGhlX3NlcnZsZXRfcHJvcGVydHlfVUlfPVRoZSBzZXJ2bGV0IHByb3BlcnR5Ci1VUkxfcGF0dGVybl9VSV89VVJMIFBhdHRlcm4KLT9fVUlfPT8KLVNlc3Npb25UaW1lb3V0X1VJXz1TZXNzaW9uVGltZW91dAotVGhlX3Nlc3Npb25UaW1lb3V0X3Byb3BlcnRfVUlfPVRoZSBzZXNzaW9uVGltZW91dCBwcm9wZXJ0eQotVGFnbGliVVJJX1VJXz1UYWdsaWJVUkkKLVRoZV90YWdsaWJVUklfcHJvcGVydHlfVUlfPVRoZSB0YWdsaWJVUkkgcHJvcGVydHkKLVRhZ2xpYkxvY2F0aW9uX1VJXz1UYWdsaWJMb2NhdGlvbgotVGhlX3RhZ2xpYkxvY2F0aW9uX3Byb3BlcnRfVUlfPVRoZSB0YWdsaWJMb2NhdGlvbiBwcm9wZXJ0eQotVHJhbnNwb3J0R3VhcmFudGVlX1VJXz1UcmFuc3BvcnRHdWFyYW50ZWUKLVRoZV90cmFuc3BvcnRHdWFyYW50ZWVfcHJvX1VJXz1UaGUgdHJhbnNwb3J0R3VhcmFudGVlIHByb3BlcnR5Ci1UaGVfZGlzdHJpYnV0YWJsZV9wcm9wZXJ0eV9VSV89VGhlIGRpc3RyaWJ1dGFibGUgcHJvcGVydHkKLUZpbGVMaXN0X1VJXz1GaWxlTGlzdAotVGhlX2ZpbGVMaXN0X3Byb3BlcnR5X1VJXz1UaGUgZmlsZUxpc3QgcHJvcGVydHkKLUNyZWF0ZV9Db250ZXh0UGFyYW1fVUlfPUNyZWF0ZSBDb250ZXh0UGFyYW0KLTx3ZWJfYXBwPl9VSV89PHdlYiBhcHA+Ci1XZWJSZXNvdXJjZU5hbWVfVUlfPVdlYlJlc291cmNlTmFtZQotVGhlX3dlYlJlc291cmNlTmFtZV9wcm9wZXJfVUlfPVRoZSB3ZWJSZXNvdXJjZU5hbWUgcHJvcGVydHkKLUNyZWF0ZV9VUkxQYXR0ZXJuVHlwZV9VSV89Q3JlYXRlIFVSTFBhdHRlcm5UeXBlCi1XZWJUeXBlX1VJXz1XZWJUeXBlCi1Kc3BGaWxlX1VJXz1Kc3BGaWxlCi1UaGVfanNwRmlsZV9wcm9wZXJ0eV9VSV89VGhlIGpzcEZpbGUgcHJvcGVydHkKLUNsYXNzTmFtZV9VSV89Q2xhc3NOYW1lCi1UaGVfY2xhc3NOYW1lX3Byb3BlcnR5X1VJXz1UaGUgY2xhc3NOYW1lIHByb3BlcnR5Ci1XZWxjb21lRmlsZV9VSV89V2VsY29tZUZpbGUKLVRoZV93ZWxjb21lRmlsZV9wcm9wZXJ0eV9VSV89VGhlIHdlbGNvbWVGaWxlIHByb3BlcnR5Ci08d2VsY29tZS1maWxlPl9VSV89PHdlbGNvbWUtZmlsZT4KLUNyZWF0ZV9XZWxjb21lRmlsZV9VSV89Q3JlYXRlIFdlbGNvbWVGaWxlCi1XZWxjb21lX0ZpbGVfTGlzdF9VSV89V2VsY29tZSBGaWxlIExpc3QKLUVycm9yX01lc3NhZ2VfTm9fV1JDX0VudHJpZXNfVUlfPUF0IGxlYXN0IG9uZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZCBmb3IgYSBzZWN1cml0eSBjb25zdHJhaW50LiBJZiB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiwgeW91IG11c3QgZGVsZXRlIHRoZSBlbnRpcmUgc2VjdXJpdHkgY29uc3RyYWludC4KLUVycm9yX1RpdGxlX05vX1dSQ19FbnRyaWVzX1VJXz1XZWIgcmVzb3VyY2UgY29sbGVjdGlvbgotcmVxdWlyZWQxY29uY2F0PUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgI0NISUxEX0NMQVNTX05BTUUjIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotKE5ld19VUkwpX1VJX19VSV89KE5ldyBVUkwpCi1OZXdfcGFyYW1fVUlfX1VJXz1OZXcgcGFyYW0KLXZhbHVlX1VJX19VSV89dmFsdWUKLVNlbGVjdF9TZXJ2bGV0X29yX0pTUF9VSV89U2VsZWN0IFNlcnZsZXQgb3IgSlNQCi1TZWxlY3RfSlNQX1VJXz1TZWxlY3QgSlNQCi1BZGRfU2VydmxldF9vcl9KU1BfVUlfPUFkZCBTZXJ2bGV0IG9yIEpTUAotQWRkX0pTUF9VSV89QWRkIEpTUAotTmV3X0Vycm9yUGFnZV9VSV89TmV3IEVycm9yUGFnZQotTmV3X0V4Y2VwdGlvblR5cGVfVUlfPU5ldyBFeGNlcHRpb25UeXBlCi1BZGRfU2VydmxldF9VSV89QWRkIFNlcnZsZXQKLVdlYl9OYXR1cmVfUnVudGltZV9kb2VzX25vX0VYQ189SVdBRTAwMjJFIFdlYiBOYXR1cmUgUnVudGltZSBkb2VzIG5vdCBleGlzdC4KLUVkaXRvcl9SZWRpcmVjdGlvbl9VSV89RWRpdG9yIFJlZGlyZWN0aW9uCi1UaGVfc2VsZWN0ZWRfd2ViLnhtbF9maWxlX19FUlJPUl89SVdBRTAwMjNFIFRoZSBzZWxlY3RlZCB3ZWIueG1sIGZpbGUgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4gYSBXQVIgUHJvamVjdC4gIFRoZXJlZm9yZSwgdGhpcyB3ZWIueG1sIGZpbGUgaXMgbm90IGEgRGVwbG95bWVudCBEZXNjcmlwdG9yIGZvciBhIFdlYiBBcmNoaXZlLCBoZW5jZSB0aGUgWE1MIGVkaXRvciB3aWxsIGJlIG9wZW5lZC4KLVByb2JsZW1zX09wZW5pbmdfRWRpdG9yX1VJXz1Qcm9ibGVtcyBPcGVuaW5nIEVkaXRvcgotQ3JlYXRlXyNDSElMRF9DTEFTU19OQU1FI19VSV89Q3JlYXRlICNDSElMRF9DTEFTU19OQU1FIwotTW92ZV9XZWxjb21lX0ZpbGVzX0Rvd25fVUlfPU1vdmUgV2VsY29tZSBGaWxlcyBEb3duCi1Nb3ZlX1dlbGNvbWVfRmlsZXNfVXBfVUlfPU1vdmUgV2VsY29tZSBGaWxlcyBVcAotRXJyb3Jfb2NjdXJyZWRfZ2V0dGluZ193ZWI9RXJyb3Igb2NjdXJyZWQgZ2V0dGluZyB3ZWIueG1sOiB7MH0KLVNlbGVjdF9DbGFzc19VSV89U2VsZWN0IENsYXNzCi1Db3VsZF9ub3RfdW5pcXVlbHlfbWFwX3RoZV9FUlJPUl89SVdBRTAwMjRFIENvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4KLUluZm9ybWF0aW9uX1VJXz1JbmZvcm1hdGlvbgotVGhlX2Nob3Nlbl9vcGVyYXRpb25faXNfbm9fSU5GT189SVdBRTAwMjVJIFRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgotSk5ESV9OYW1lX1VJXz1KTkRJIE5hbWUKLU5ld19TZXJ2bGV0X1VJXz1OZXcgU2VydmxldAotCi0KLShOZXdfRmlsdGVyKV8xPShOZXcgRmlsdGVyKQotTmV3X2ZpbHRlcl8yPU5ldyBmaWx0ZXIKLU5ld19maWx0ZXJfbWFwcGluZ18xPU5ldyBmaWx0ZXIgbWFwcGluZwotTmV3X2xpc3RlbmVyXzE9TmV3IGxpc3RlbmVyCi1UaGVfbmFtZV9wcm9wZXJ0eV8yPVRoZSBuYW1lIHByb3BlcnR5Ci1UaGVfdmFsdWVfcHJvcGVydHlfND1UaGUgdmFsdWUgcHJvcGVydHkKLVRoZV90YXJnZXRfcHJvcGVydHlfMj1UaGUgdGFyZ2V0IHByb3BlcnR5Ci1UaGVfdHlwZV9wcm9wZXJ0eV80PVRoZSB0eXBlIHByb3BlcnR5Ci1UaGVfRXh0ZXJuYWxDYWNoZUdyb3Vwc19wcm9wZXJ0eV8yPVRoZSBFeHRlcm5hbENhY2hlR3JvdXBzIHByb3BlcnR5Ci1UaGVfSWRHZW5lcmF0b3JfcHJvcGVydHlfND1UaGUgSWRHZW5lcmF0b3IgcHJvcGVydHkKLVRoZV9JbnZhbGlkYXRlT25seV9wcm9wZXJ0eV82PVRoZSBJbnZhbGlkYXRlT25seSBwcm9wZXJ0eQotVGhlX01ldGFkYXRhR2VuZXJhdG9yX3Byb3BlcnR5Xzg9VGhlIE1ldGFkYXRhR2VuZXJhdG9yIHByb3BlcnR5Ci1UaGVfUHJpb3JpdHlfcHJvcGVydHlfMTA9VGhlIFByaW9yaXR5IHByb3BlcnR5Ci1UaGVfUHJvcGVydGllc0dyb3VwTmFtZV9wcm9wZXJ0eV8xMj1UaGUgUHJvcGVydGllc0dyb3VwTmFtZSBwcm9wZXJ0eQotVGhlX1RpbWVvdXRfcHJvcGVydHlfMTQ9VGhlIFRpbWVvdXQgcHJvcGVydHkKLVNtYWxsX18xPVNtYWxsOgotTGFyZ2VfXzM9TGFyZ2U6Ci1DaG9vc2VfU21hbGxfSWNvbl81PUNob29zZSBTbWFsbCBJY29uCi1TZWxlY3RfdGhlX1NtYWxsX0ljb25fNj1TZWxlY3QgdGhlIFNtYWxsIEljb24KLUNob29zZV9MYXJnZV9JY29uXzc9Q2hvb3NlIExhcmdlIEljb24KLVNlbGVjdF90aGVfTGFyZ2VfSWNvbl84PVNlbGVjdCB0aGUgTGFyZ2UgSWNvbgotQ2FjaGluZ19ncm91cF9uYW1lX18xPUNhY2hpbmcgZ3JvdXAgbmFtZToKLVByaW9yaXR5X18yPVByaW9yaXR5OgotVGltZW91dF9fMz1UaW1lb3V0Ogotc2Vjb25kKHMpXzQ9c2Vjb25kKHMpCi1JbnZhbGlkYXRlX29ubHlfNT1JbnZhbGlkYXRlIG9ubHkKLUNhY2hpbmdfZ3JvdXBfbWVtYmVyc19fNj1DYWNoaW5nIGdyb3VwIG1lbWJlcnM6Ci1fU2VydmxldC9KU1BfNz1cIFNlcnZsZXQvSlNQCi1SZW1vdmVfOT1SZW1vdmUKLVVzZV9VUklzX2Zvcl9jYWNoZV9JRF9idWlsZGluZ18xPVVzZSBVUklzIGZvciBjYWNoZSBJRCBidWlsZGluZwotVXNlX3NwZWNpZmllZF9zdHJpbmdfXzI9VXNlIHNwZWNpZmllZCBzdHJpbmc6Ci1WYXJpYWJsZXNfXzM9VmFyaWFibGVzOgotX0lEXzQ9XCBJRAotX1R5cGVfNT1cIFR5cGUKLV9SZXF1aXJlZF82PVwgUmVxdWlyZWQKLUV4dGVybmFsX0NhY2hlX2dyb3Vwc19fMT1FeHRlcm5hbCBDYWNoZSBncm91cHM6Ci1fR3JvdXBfTmFtZV8yPVwgR3JvdXAgTmFtZQotSURfZ2VuZXJhdG9yX18zPUlEIGdlbmVyYXRvcjoKLU1ldGFfZGF0YV9nZW5lcmF0b3JfXzQ9TWV0YSBkYXRhIGdlbmVyYXRvcjoKLVJlbW92ZV82PVJlbW92ZQotQWRkX1NlcnZsZXRfQ2FjaGluZ19Db25maWd1cmF0aW9uXzE9QWRkIFNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1FZGl0X1NlcnZsZXRfQ2FjaGluZ19Db25maWd1cmF0aW9uXzI9RWRpdCBTZXJ2bGV0IENhY2hpbmcgQ29uZmlndXJhdGlvbgotQWRkXzE9QWRkCi1SZW1vdmVfMj1SZW1vdmUKLVVQXzU9VVAKLURPV05fNj1ET1dOCi1BZGRfb3JfUmVtb3ZlX1NlcnZsZXRfb3JfSlNQXzE9QWRkIG9yIFJlbW92ZSBTZXJ2bGV0IG9yIEpTUAotQWRkX29yX1JlbW92ZV9TZWN1cml0eV9Sb2xlXzI9QWRkIG9yIFJlbW92ZSBTZWN1cml0eSBSb2xlCi1BZGRfb3JfUmVtb3ZlX1NlY3VyaXR5X0NvbnN0cmFpbnRfMz1BZGQgb3IgUmVtb3ZlIFNlY3VyaXR5IENvbnN0cmFpbnQKLUFkZF9vcl9SZW1vdmVfRW52aXJvbm1lbnRfVmFyaWFibGVfND1BZGQgb3IgUmVtb3ZlIEVudmlyb25tZW50IFZhcmlhYmxlCi1BZGRfb3JfUmVtb3ZlX0VKQl9SZWZlcmVuY2VfNT1BZGQgb3IgUmVtb3ZlIEVKQiBSZWZlcmVuY2UKLUFkZF9vcl9SZW1vdmVfUmVzb3VyY2VfUmVmZXJlbmNlXzY9QWRkIG9yIFJlbW92ZSBSZXNvdXJjZSBSZWZlcmVuY2UKLUFkZF9vcl9SZW1vdmVfSlNQX1RhZ19MaWJyYXJ5Xzc9QWRkIG9yIFJlbW92ZSBKU1AgVGFnIExpYnJhcnkKLUFkZF9vcl9SZW1vdmVfRXJyb3JfUGFnZV84PUFkZCBvciBSZW1vdmUgRXJyb3IgUGFnZQotQWRkX29yX1JlbW92ZV9FeGNlcHRpb25fUGFnZV85PUFkZCBvciBSZW1vdmUgRXhjZXB0aW9uIFBhZ2UKLUFkZF9vcl9SZW1vdmVfV2VsY29tZV9QYWdlXzEwPUFkZCBvciBSZW1vdmUgV2VsY29tZSBQYWdlCi1BZGRfb3JfUmVtb3ZlX0NvbnRleHRfUGFyYW1ldGVyXzExPUFkZCBvciBSZW1vdmUgQ29udGV4dCBQYXJhbWV0ZXIKLUFkZF9vcl9SZW1vdmVfTWltZV9NYXBwaW5nXzEyPUFkZCBvciBSZW1vdmUgTWltZSBNYXBwaW5nCi1BZGRfb3JfUmVtb3ZlX0ZpbHRlcl8xMz1BZGQgb3IgUmVtb3ZlIEZpbHRlcgotQWRkX29yX1JlbW92ZV9MaXN0ZW5lcl8xND1BZGQgb3IgUmVtb3ZlIExpc3RlbmVyCi1BZGRfb3JfUmVtb3ZlX01pbWVfRmlsdGVyXzE1PUFkZCBvciBSZW1vdmUgTWltZSBGaWx0ZXIKLUFkZF9vcl9SZW1vdmVfRmlsZV9TZXJ2aW5nX0F0dHJpYnV0ZV8xNj1BZGQgb3IgUmVtb3ZlIEZpbGUgU2VydmluZyBBdHRyaWJ1dGUKLUFkZF9vcl9SZW1vdmVfSW52b2tlcl9BdHRyaWJ1dGVfMTc9QWRkIG9yIFJlbW92ZSBJbnZva2VyIEF0dHJpYnV0ZQotQWRkX29yX1JlbW92ZV9KU1BfQXR0cmlidXRlXzE4PUFkZCBvciBSZW1vdmUgSlNQIEF0dHJpYnV0ZQotQWRkX29yX1JlbW92ZV9TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbl8xOT1BZGQgb3IgUmVtb3ZlIFNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1GaWx0ZXJfTWFwcGluZ3NfMT1GaWx0ZXIgTWFwcGluZ3MKLVJlYWRfT25seV8yMj1SZWFkIE9ubHkKLVdyaXRhYmxlXzIzPVdyaXRhYmxlCi1SZWFkX29ubHlfZmlsZXNfX19fMjU9UmVhZCBvbmx5IGZpbGVzOgotV2ViX0RlcGxveW1lbnRfRGVzY3JpcHRvcl8yOD1XZWIgRGVwbG95bWVudCBEZXNjcmlwdG9yCi1FbnZpcm9ubWVudF8xPUVudmlyb25tZW50Ci1FbnZpcm9ubWVudF9WYXJpYWJsZXNfMj1FbnZpcm9ubWVudCBWYXJpYWJsZXMKLUV4dGVuc2lvbnNfMT1FeHRlbnNpb25zCi1GaWx0ZXJzXzE9RmlsdGVycwotTGlzdGVuZXJzXzE9TGlzdGVuZXJzCi1NaW1lXzE9TWltZQotTWltZV9NYXBwaW5nc18yPU1pbWUgTWFwcGluZ3MKLU92ZXJ2aWV3XzE9T3ZlcnZpZXcKLVBhZ2VzXzE9UGFnZXMKLVBhcmFtZXRlcnNfMT1QYXJhbWV0ZXJzCi1Db250ZXh0X1BhcmFtZXRlcnNfMj1Db250ZXh0IFBhcmFtZXRlcnMKLVJlZmVyZW5jZXNfMT1SZWZlcmVuY2VzCi1SZWZlcmVuY2VzXzI9UmVmZXJlbmNlcwotRUpCX3JlZmVyZW5jZXNfMz1FSkIgcmVmZXJlbmNlcwotUmVzb3VyY2VfcmVmZXJlbmNlc180PVJlc291cmNlIHJlZmVyZW5jZXMKLUpTUF90YWdfbGlicmFyaWVzXzU9SlNQIHRhZyBsaWJyYXJpZXMKLVNlY3VyaXR5XzE9U2VjdXJpdHkgcm9sZXMKLVNlY3VyaXR5X1JvbGVzXzM9U2VjdXJpdHkgUm9sZXMKLVNlY3VyaXR5X0NvbnN0cmFpbnRzXzQ9U2VjdXJpdHkgQ29uc3RyYWludHMKLVNlcnZsZXRzXzE9U2VydmxldHMKLVNlcnZsZXRzX2FuZF9KU1BzXzI9U2VydmxldHMgYW5kIEpTUHMKLURldGFpbHNfMT1EZXRhaWxzCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9lbnZpcm9ubWVudF92YXJpYWJsZV9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCB2YXJpYWJsZToKLVR5cGVfXzM9VHlwZToKLVZhbHVlX18xMz1WYWx1ZToKLU1pbWVfVHlwZV9jaGFuZ2VfMTQ9TWltZSBUeXBlIGNoYW5nZQotVmFyaWFibGVzXzE9VmFyaWFibGVzCi1UaGVfZm9sbG93aW5nX2Vudmlyb25tZW50X3ZhcmlhYmxlc19hcmVfcmVsZXZhbnRfdG9fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHJlbGV2YW50IHRvIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotKE5ld19WYXJpYWJsZSlfMz0oTmV3IFZhcmlhYmxlKQotRmlsZV9TZXJ2aW5nX0F0dHJpYnV0ZXNfMT1GaWxlIFNlcnZpbmcgQXR0cmlidXRlcwotX05hbWVfMj1cIE5hbWUKLV9WYWx1ZV8zPVwgVmFsdWUKLShuYW1lKV80PShuYW1lKQotKHZhbHVlKV81PSh2YWx1ZSkKLUdlbmVyYWxfMT1HZW5lcmFsCi1SZWxvYWRpbmdfZW5hYmxlZF8yPVJlbG9hZGluZyBlbmFibGVkCi1SZWxvYWRfaW50ZXJ2YWxfXzM9UmVsb2FkIGludGVydmFsOgotRGVmYXVsdF9lcnJvcl9wYWdlX181PURlZmF1bHQgZXJyb3IgcGFnZToKLUFkZGl0aW9uYWxfY2xhc3NfcGF0aF9fNz1BZGRpdGlvbmFsIGNsYXNzIHBhdGg6Ci1GaWxlX3NlcnZpbmdfZW5hYmxlZF85PUZpbGUgc2VydmluZyBlbmFibGVkCi1EaXJlY3RvcnlfYnJvd3NpbmdfZW5hYmxlZF8xMD1EaXJlY3RvcnkgYnJvd3NpbmcgZW5hYmxlZAotU2VydmVfc2VydmxldHNfYnlfY2xhc3NuYW1lXzExPVNlcnZlIHNlcnZsZXRzIGJ5IGNsYXNzbmFtZQotUHJlY29tcGlsZV9KU1BzXzEyPVByZWNvbXBpbGUgSlNQcwotQXV0b21hdGljX1JlcXVlc3RfRW5jb2RpbmdfZW5hYmxlZF8xMz1BdXRvbWF0aWMgUmVxdWVzdCBFbmNvZGluZyBlbmFibGVkCi1BdXRvbWF0aWNfUmVzcG9uc2VfRW5jb2RpbmdfZW5hYmxlZF8xND1BdXRvbWF0aWMgUmVzcG9uc2UgRW5jb2RpbmcgZW5hYmxlZAotQ2hvb3NlX2FfRGVmYXVsdF9FcnJvcl9QYWdlXzE1PUNob29zZSBhIERlZmF1bHQgRXJyb3IgUGFnZQotUmVsb2FkX0VuYWJsZWRfQ2hhbmdlZF8xNj1SZWxvYWQgRW5hYmxlZCBDaGFuZ2VkCi1GaWxlX1NlcnZpbmdfRW5hYmxlZF9DaGFuZ2VkXzE3PUZpbGUgU2VydmluZyBFbmFibGVkIENoYW5nZWQKLURpcmVjdG9yeV9Ccm93c2luZ19FbmFibGVkX0NoYW5nZWRfMTg9RGlyZWN0b3J5IEJyb3dzaW5nIEVuYWJsZWQgQ2hhbmdlZAotU2VydmVfU2VydmxldHNfYnlfY2xhc3NuYW1lX0VuYWJsZWRfQ2hhbmdlZF8xOT1TZXJ2ZSBTZXJ2bGV0cyBieSBjbGFzc25hbWUgRW5hYmxlZCBDaGFuZ2VkCi1QcmVjb21waWxlX0pTUHNfRW5hYmxlZF9DaGFuZ2VkXzIwPVByZWNvbXBpbGUgSlNQcyBFbmFibGVkIENoYW5nZWQKLUF1dG9tYXRpY19SZXF1ZXN0X0VuY29kaW5nX0VuYWJsZWRfQ2hhbmdlZF8yMT1BdXRvbWF0aWMgUmVxdWVzdCBFbmNvZGluZyBFbmFibGVkIENoYW5nZWQKLUF1dG9tYXRpY19SZXNwb25zZV9FbmNvZGluZ19FbmFibGVkX0NoYW5nZWRfMjI9QXV0b21hdGljIFJlc3BvbnNlIEVuY29kaW5nIEVuYWJsZWQgQ2hhbmdlZAotUmVsb2FkX0ludGVydmFsXzI1PVJlbG9hZCBJbnRlcnZhbAotRGVmYXVsdF9FcnJvcl9QYWdlXzI2PURlZmF1bHQgRXJyb3IgUGFnZQotQWRkaXRpb25hbF9DbGFzc3BhdGhfMjc9QWRkaXRpb25hbCBDbGFzc3BhdGgKLUludm9rZXJfQXR0cmlidXRlc18xPUludm9rZXIgQXR0cmlidXRlcwotSlNQX0F0dHJpYnV0ZXNfMT1KU1AgQXR0cmlidXRlcwotTUlNRV9GaWx0ZXJzX18xPU1JTUUgRmlsdGVycwotX1RhcmdldF8yPVwgVGFyZ2V0Ci1fVHlwZV8zPVwgVHlwZQotKHRhcmdldClfND0odGFyZ2V0KQotKHR5cGUpXzU9KHR5cGUpCi1TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbnNfMT1TZXJ2bGV0IENhY2hpbmcgQ29uZmlndXJhdGlvbnMKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX2ZpbHRlcl8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGZpbHRlcgotRmlsdGVyX2NsYXNzX18zPUZpbHRlciBjbGFzczoKLURpc3BsYXlfbmFtZV9fNT1EaXNwbGF5IG5hbWU6Ci1GaWx0ZXJfVHlwZV9TZWxlY3Rpb25fNz1GaWx0ZXIgVHlwZSBTZWxlY3Rpb24KLUZpbHRlckl0ZW1Qcm92aWRlcl9VSV8wPUZpbHRlck5hbWUKLUNob29zZV9hX0ZpbHRlcl9UeXBlXzg9Q2hvb3NlIGEgRmlsdGVyIFR5cGUKLVRoZV9mb2xsb3dpbmdfRmlsdGVyc19hcmVfaW5jbHVkZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBGaWx0ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLUljb25zXzE9SWNvbnMKLVRoZV9mb2xsb3dpbmdfaWNvbnNfcmVwcmVzZW50X3RoZV9zZWxlY3RlZF9maWx0ZXJfXzI9VGhlIGZvbGxvd2luZyBpY29ucyByZXByZXNlbnQgdGhlIHNlbGVjdGVkIGZpbHRlcjoKLUluaXRpYWxpemF0aW9uXzE9SW5pdGlhbGl6YXRpb24KLVRoZV9mb2xsb3dpbmdfRmlsdGVyc193aWxsX2JlX3N0YXJ0ZWRfd2hlbl90aGVfd2ViX2FwcGxpY2F0aW9uX2lzX3N0YXJ0ZWRfXzI9VGhlIGZvbGxvd2luZyBGaWx0ZXJzIHdpbGwgYmUgc3RhcnRlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgc3RhcnRlZDoKLV9OYW1lXzM9XCBOYW1lCi1fVmFsdWVfND1cIFZhbHVlCi1EZWxldGVfRmlsdGVyX0luaXRfUGFyYW1fNT1EZWxldGUgRmlsdGVyIEluaXQgUGFyYW0KLShuYW1lKV82PShuYW1lKQotKHZhbHVlKV83PSh2YWx1ZSkKLU5ld19Jbml0aWFsaXphdGlvbl9QYXJhbWV0ZXJfOD1OZXcgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1TZXJ2bGV0X01hcHBpbmdzXzI9U2VydmxldCBNYXBwaW5ncwotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hcmVfbWFwcGVkX3RvX3RoaXNfZmlsdGVyX18zPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgYXJlIG1hcHBlZCB0byB0aGlzIGZpbHRlcjoKLURlbGV0ZV9maWx0ZXJfbWFwcGluZ3NfND1EZWxldGUgZmlsdGVyIG1hcHBpbmdzCi1OZXdfZmlsdGVyX21hcHBpbmdfNT1OZXcgZmlsdGVyIG1hcHBpbmcKLVVSTF9NYXBwaW5nc18xPVVSTCBNYXBwaW5ncwotVGhlX2ZvbGxvd2luZ19VUkxzX2FyZV9tYXBwZWRfdG9fdGhpc19maWx0ZXJfXzI9VGhlIGZvbGxvd2luZyBVUkxzIGFyZSBtYXBwZWQgdG8gdGhpcyBmaWx0ZXI6Ci1EZWxldGVfZmlsdGVyX21hcHBpbmdzXzM9RGVsZXRlIGZpbHRlciBtYXBwaW5ncwotTmV3X2ZpbHRlcl9tYXBwaW5nXzQ9TmV3IGZpbHRlciBtYXBwaW5nCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9saXN0ZW5lcl8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGxpc3RlbmVyCi1QYWNrYWdlX18zPVBhY2thZ2U6Ci0oZGVmYXVsdF9wYWNrYWdlKV81PShkZWZhdWx0IHBhY2thZ2UpCi1MaXN0ZW5lcnNfNT1MaXN0ZW5lcnMKLVRoZV9mb2xsb3dpbmdfTGlzdGVuZXJzX2FyZV9pbmNsdWRlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fNj1UaGUgZm9sbG93aW5nIExpc3RlbmVycyBhcmUgaW5jbHVkZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1MaXN0ZW5lcl9UeXBlX1NlbGVjdGlvbl8xMD1MaXN0ZW5lciBUeXBlIFNlbGVjdGlvbgotQ2hvb3NlX2FfTGlzdGVuZXJfVHlwZV8xMT1DaG9vc2UgYSBMaXN0ZW5lciBUeXBlCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9maWxlX2V4dGVuc2lvbl9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBmaWxlIGV4dGVuc2lvbjoKLU1pbWVfdHlwZV9fMz1NaW1lIHR5cGU6Ci1NaW1lX1R5cGVfY2hhbmdlXzQ9TWltZSBUeXBlIGNoYW5nZQotRmlsZV9FeHRlbnNpb25zXzE9RmlsZSBFeHRlbnNpb25zCi1UaGVfZm9sbG93aW5nX2ZpbGVfZXh0ZW5zaW9uc19hcmVfbWFwcGVkX3RvX01pbWVfdHlwZXNfXzI9VGhlIGZvbGxvd2luZyBmaWxlIGV4dGVuc2lvbnMgYXJlIG1hcHBlZCB0byBNaW1lIHR5cGVzOgotQ29udGV4dF9QYXJhbWV0ZXJzXzE9Q29udGV4dCBQYXJhbWV0ZXJzCi1UaGVfZm9sbG93aW5nX2NvbnRleHRfaW5pdGlhbGl6YXRpb25fcGFyYW1ldGVyc19hcHBseV90b19hbGxfc2VydmxldHNfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXBwbHkgdG8gYWxsIHNlcnZsZXRzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotRW52aXJvbm1lbnRfVmFyaWFibGVzXzE9RW52aXJvbm1lbnQgVmFyaWFibGVzCi1UaGVfZm9sbG93aW5nX2ZpbHRlcnNfYXJlX3VzZWRfaW5fdGhpc19hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIGZpbHRlcnMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLUdlbmVyYWxfSW5mb3JtYXRpb25fMT1HZW5lcmFsIEluZm9ybWF0aW9uCi1EaXNwbGF5X25hbWVfXzI9RGlzcGxheSBuYW1lOgotRGVzY3JpcHRpb25fXzM9RGVzY3JpcHRpb246Ci1TZXNzaW9uX3RpbWVfb3V0X180PVNlc3Npb24gdGltZSBvdXQ6Ci1EaXN0cmlidXRhYmxlXzU9RGlzdHJpYnV0YWJsZQotRGlzcGxheV9OYW1lXzY9RGlzcGxheSBOYW1lCi1EZXNjcmlwdGlvbl83PURlc2NyaXB0aW9uCi1JY29uc18yPUljb25zCi1UaGVfZm9sbG93aW5nX2ljb25zX3JlcHJlc2VudF90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMz1UaGUgZm9sbG93aW5nIGljb25zIHJlcHJlc2VudCB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLVRoZV9mb2xsb3dpbmdfbGlzdGVuZXJzX2FyZV91c2VkX2luX3RoaXNfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLU1pbWVfVHlwZV8xPU1pbWUgVHlwZQotVGhlX2ZvbGxvd2luZ19maWxlX2V4dGVuc2lvbnNfYXJlX21hcHBlZF90b19taW1lX3R5cGVzX18yPVRoZSBmb2xsb3dpbmcgZmlsZSBleHRlbnNpb25zIGFyZSBtYXBwZWQgdG8gbWltZSB0eXBlczoKLVRoaXNfd2ViX2FwcGxpY2F0aW9uX3VzZXNfdGhlX2ZvbGxvd2luZ193ZWxjb21lX2FuZF9lcnJvcl9wYWdlc19fMj1UaGlzIHdlYiBhcHBsaWNhdGlvbiB1c2VzIHRoZSBmb2xsb3dpbmcgd2VsY29tZSBhbmQgZXJyb3IgcGFnZXM6Ci1UaGlzX3dlYl9hcHBsaWNhdGlvbl9yZWZlcmVuY2VzX3RoZV9mb2xsb3dpbmdfcmVzb3VyY2VzX18yPVRoaXMgd2ViIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6Ci1UaGVfZm9sbG93aW5nX3NlY3VyaXR5X3JvbGVzX2FuZF9jb25zdHJhaW50c19hcmVfZGVmaW5lZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBzZWN1cml0eSByb2xlcyBhbmQgY29uc3RyYWludHMgYXJlIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotU2VydmxldHNfYW5kX0pTUHNfMT1TZXJ2bGV0cyBhbmQgSlNQcwotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hbmRfSlNQc19hcmVfdXNlZF9pbl90aGlzX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgYW5kIEpTUHMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLVVzYWdlXzE9VXNhZ2UKLVRoZV9mb2xsb3dpbmdfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfdXNlX3RoaXNfd2ViX21vZHVsZV9fMj1UaGUgZm9sbG93aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb25zIHVzZSB0aGlzIHdlYiBtb2R1bGU6Ci1FcnJvcl9QYWdlc18xPUVycm9yIFBhZ2VzCi1SZXNvdXJjZXNfaW5fdGhlX2ZvbGxvd2luZ19VUkxzX3dpbGxfYmVfYWNjZXNzZWRfaW5fcmVzcG9uc2VfdG9fSFRUUF9lcnJvcl9jb2Rlc19fMj1SZXNvdXJjZXMgaW4gdGhlIGZvbGxvd2luZyBVUkxzIHdpbGwgYmUgYWNjZXNzZWQgaW4gcmVzcG9uc2UgdG8gSFRUUCBlcnJvciBjb2RlczoKLV9FcnJvcl9Db2RlXzM9XCBFcnJvciBDb2RlCi1fVVJMXzQ9XCBVUkwKLUphdmFfRXhjZXB0aW9uX1R5cGVzXzI9SmF2YSBFeGNlcHRpb24gVHlwZXMKLVJlc291cmNlc19pbl90aGVfZm9sbG93aW5nX1VSTHNfd2lsbF9iZV9hY2Nlc3NlZF9pbl9yZXNwb25zZV90b19KYXZhX2V4Y2VwdGlvbl90eXBlc19fMz1SZXNvdXJjZXMgaW4gdGhlIGZvbGxvd2luZyBVUkxzIHdpbGwgYmUgYWNjZXNzZWQgaW4gcmVzcG9uc2UgdG8gSmF2YSBleGNlcHRpb24gdHlwZXM6Ci1fRXhjZXB0aW9uX1R5cGVfND1cIEV4Y2VwdGlvbiBUeXBlCi1fVVJMXzU9XCBVUkwKLUV4Y2VwdGlvbl9UeXBlX1NlbGVjdGlvbl85PUV4Y2VwdGlvbiBUeXBlIFNlbGVjdGlvbgotQ2hvb3NlX2FuX0V4Y2VwdGlvbl9UeXBlXzEwPUNob29zZSBhbiBFeGNlcHRpb24gVHlwZQotTG9naW5fMT1Mb2dpbgotVGhlX2ZvbGxvd2luZ19Mb2dpbl9jb25maWd1cmF0aW9uX3ZhbHVlc19hcmVfdXNlZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBMb2dpbiBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1SZWFsbV9uYW1lX18zPVJlYWxtIG5hbWU6Ci1BdXRoZW50aWNhdGlvbl9tZXRob2RfXzQ9QXV0aGVudGljYXRpb24gbWV0aG9kOgotTG9naW5fcGFnZV9fNT1Mb2dpbiBwYWdlOgotRXJyb3JfcGFnZV9fOD1FcnJvciBwYWdlOgotV2VsY29tZV9QYWdlc18xPVdlbGNvbWUgUGFnZXMKLVRoZV9zZXJ2ZXJfd2lsbF9zZWFyY2hfZm9yX3RoZV9mb2xsb3dpbmdfcGFnZXMsX2luX3RoaXNfb3JkZXIsX3doZW5fdGhlX3dlYl9hcHBsaWNhdGlvbl9pc19yZWZlcmVuY2VkX18yPVRoZSBzZXJ2ZXIgd2lsbCBzZWFyY2ggZm9yIHRoZSBmb2xsb3dpbmcgcGFnZXMsIGluIHRoaXMgb3JkZXIsIHdoZW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBpcyByZWZlcmVuY2VkOgotVGhlX2ZvbGxvd2luZ19jb250ZXh0X3BhcmFtZXRlcnNfYXJlX2luY2x1ZGVkX2luX3RoaXNfd2ViX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX2NvbnRleHRfcGFyYW1ldGVyX18yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGNvbnRleHQgcGFyYW1ldGVyOgotVmFsdWVfXzM9VmFsdWU6Ci1Db250ZXh0X1BhcmFtX1ZhbHVlX2NoYW5nZV80PUNvbnRleHQgUGFyYW0gVmFsdWUgY2hhbmdlCi1XZWJTcGhlcmVfQmluZGluZ3NfMT1XZWJTcGhlcmUgQmluZGluZ3MKLUpORElfTmFtZV9fMj1KTkRJIE5hbWU6Ci1FamJfUmVmX0pORElfTmFtZV9jaGFuZ2VfMz1FamIgUmVmIEpOREkgTmFtZSBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX0VKQl9yZWZlcmVuY2VfMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBFSkIgcmVmZXJlbmNlCi1Ib21lX182PUhvbWU6Ci1SZW1vdGVfXzc9UmVtb3RlOgotRWpiX1JlZl9Ib21lX2NoYW5nZV84PUVqYiBSZWYgSG9tZSBjaGFuZ2UKLUVqYl9SZWZfUmVtb3RlX2NoYW5nZV85PUVqYiBSZWYgUmVtb3RlIGNoYW5nZQotRUpCX1JlZmVyZW5jZV9UeXBlX2NoYW5nZV8xMD1FSkIgUmVmZXJlbmNlIFR5cGUgY2hhbmdlCi1FSkJfUmVmZXJlbmNlc18xPUVKQiBSZWZlcmVuY2VzCi1UaGVfZm9sbG93aW5nX0VKQl9yZWZlcmVuY2VzX2FyZV91c2VkX2luX3RoaXNfd2ViX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgRUpCIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1KTkRJX05hbWVfMz1KTkRJIE5hbWUKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX0pTUF90YWdfbGlicmFyeV8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEpTUCB0YWcgbGlicmFyeQotVVJJX18zPVVSSToKLUxvY2F0aW9uX180PUxvY2F0aW9uOgotSlNQX3RhZ19saWJyYXJ5X2xvY2F0aW9uX2NoYW5nZV81PUpTUCB0YWcgbGlicmFyeSBsb2NhdGlvbiBjaGFuZ2UKLUpTUF90YWdfbGlicmFyeV9VUklfY2hhbmdlXzY9SlNQIHRhZyBsaWJyYXJ5IFVSSSBjaGFuZ2UKLUpTUF90YWdfbGlicmFyaWVzXzE9SlNQIHRhZyBsaWJyYXJpZXMKLVRoZV9mb2xsb3dpbmdfSlNQX3RhZ19saWJyYXJpZXNfYXJlX3VzZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBKU1AgdGFnIGxpYnJhcmllcyBhcmUgdXNlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLVJlc291cmNlX1JlZl9KTkRJX05hbWVfY2hhbmdlXzM9UmVzb3VyY2UgUmVmIEpOREkgTmFtZSBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX3Jlc291cmNlX3JlZmVyZW5jZV8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlIHJlZmVyZW5jZQotQXV0aGVudGljYXRpb25fXzQ9QXV0aGVudGljYXRpb246Ci1SZXNvdXJjZV9SZWZlcmVuY2VfVHlwZV9jaGFuZ2VfNz1SZXNvdXJjZSBSZWZlcmVuY2UgVHlwZSBjaGFuZ2UKLVJlc291cmNlX1JlZmVyZW5jZV9BdXRoZW50aWNhdGlvbl9jaGFuZ2VfMTA9UmVzb3VyY2UgUmVmZXJlbmNlIEF1dGhlbnRpY2F0aW9uIGNoYW5nZQotUmVzb3VyY2VfUmVmZXJlbmNlc18xPVJlc291cmNlIFJlZmVyZW5jZXMKLVRoZV9mb2xsb3dpbmdfcmVzb3VyY2VfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIHJlc291cmNlIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci0oTmV3X1Jlc291cmNlUmVmKV8zPShOZXcgUmVzb3VyY2VSZWYpCi1KTkRJX05hbWVfND1KTkRJIE5hbWUKLUF1dGhvcml6ZWRfUm9sZXNfMj1BdXRob3JpemVkIFJvbGVzCi1UaGVfZm9sbG93aW5nX3JvbGVzX2FyZV9hdXRob3JpemVkX3RvX2FjY2Vzc190aGVfd2ViX3Jlc291cmNlX2NvbGxlY3Rpb25zX2luX3RoaXNfc2VjdXJpdHlfY29uc3RyYWludF9fMz1UaGUgZm9sbG93aW5nIHJvbGVzIGFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIGluIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludDoKLVNlY3VyaXR5X0NvbnN0cmFpbnRzXzE9U2VjdXJpdHkgQ29uc3RyYWludHMKLVRoZXNlX2NvbnN0cmFpbnRzX3ByZXNjcmliZV9hY2Nlc3NfcG9saWNpZXNfZm9yX3NwZWNpZmljX3dlYl9yZXNvdXJjZXNfMj1UaGVzZSBjb25zdHJhaW50cyBwcmVzY3JpYmUgYWNjZXNzIHBvbGljaWVzIGZvciBzcGVjaWZpYyB3ZWIgcmVzb3VyY2VzCi1Vc2VyX0RhdGFfQ29uc3RyYWludF8xPVVzZXIgRGF0YSBDb25zdHJhaW50Ci1UaGVfZm9sbG93aW5nX2FyZV90aGVfdHJhbnNwb3J0X2d1YXJhbnRlZXNfcmVxdWlyZWRfYmV0d2Vlbl9jbGllbnRfYW5kX3NlcnZlcl9mb3JfdGhlX3NlY3VyaXR5X2NvbnN0cmFpbnRfXzI9VGhlIGZvbGxvd2luZyBhcmUgdGhlIHRyYW5zcG9ydCBndWFyYW50ZWVzIHJlcXVpcmVkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgZm9yIHRoZSBzZWN1cml0eSBjb25zdHJhaW50OgotV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25zXzE9V2ViIFJlc291cmNlIENvbGxlY3Rpb25zCi1UaGVfZm9sbG93aW5nX2RlZmluZV93ZWJfcmVzb3VyY2VzX2FuZF90aGVpcl9IVFRQX21ldGhvZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBkZWZpbmUgd2ViIHJlc291cmNlcyBhbmQgdGhlaXIgSFRUUCBtZXRob2QgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfc2VjdXJpdHlfcm9sZV9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZWN1cml0eSByb2xlOgotU2VjdXJpdHlfUm9sZXNfRGVzY3JpcHRpb25fY2hhbmdlXzU9U2VjdXJpdHkgUm9sZXMgRGVzY3JpcHRpb24gY2hhbmdlCi1TZWN1cml0eV9Sb2xlc18xPVNlY3VyaXR5IFJvbGVzCi1UaGVfZm9sbG93aW5nX3NlY3VyaXR5X3JvbGVzX2FyZV9kZWZpbmVkX2Zvcl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLUF1dGhvcml6ZWRfcm9sZXNfMj1BdXRob3JpemVkIHJvbGVzCi1UaGVfZm9sbG93aW5nX3JvbGVzX2FyZV9hdXRob3JpemVkX3RvX2FjY2Vzc190aGlzX3NlcnZsZXRfXzM9VGhlIGZvbGxvd2luZyByb2xlcyBhcmUgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhpcyBzZXJ2bGV0OgotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfc2VydmxldF9vcl9KU1BfMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZXJ2bGV0IG9yIEpTUAotU2VydmxldF9jbGFzc19fMz1TZXJ2bGV0IGNsYXNzOgotV2ViU3BoZXJlX0V4dGVuc2lvbnNfMz1XZWJTcGhlcmUgRXh0ZW5zaW9ucwotT3B0aW9uYWxfV2ViU3BoZXJlX3NwZWNpZmljX2V4dGVuc2lvbnNfdG9fdGhlX1dlYl9EZXBsb3ltZW50X0Rlc2NyaXB0b3JfND1PcHRpb25hbCBXZWJTcGhlcmUgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byB0aGUgV2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcgotVW5yZXNvbHZlZF9hY3Rpb25fXzU9VW5yZXNvbHZlZCBhY3Rpb246Ci1TZXJ2bGV0X0V4dGVuc2lvbl9DaGFuZ2VfNj1TZXJ2bGV0IEV4dGVuc2lvbiBDaGFuZ2UKLVRoZV9mb2xsb3dpbmdfaWNvbnNfcmVwcmVzZW50X3RoZV9zZWxlY3RlZF9zZXJ2bGV0X29yX0pTUF9fMz1UaGUgZm9sbG93aW5nIGljb25zIHJlcHJlc2VudCB0aGUgc2VsZWN0ZWQgc2VydmxldCBvciBKU1A6Ci1UaGVfZm9sbG93aW5nX1VSTHNfYXJlX21hcHBlZF90b190aGlzX3NlcnZsZXRfXzI9VGhlIGZvbGxvd2luZyBVUkxzIGFyZSBtYXBwZWQgdG8gdGhpcyBzZXJ2bGV0OgotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hbmRfSlNQc19hcmVfaW5jbHVkZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBzZXJ2bGV0cyBhbmQgSlNQcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1UaGVfZmlsdGVyTmFtZV9wcm9wZXJ0eV8zPVRoZSBmaWx0ZXJOYW1lIHByb3BlcnR5Ci1UaGVfZmlsdGVyX3Byb3BlcnR5XzI9VGhlIGZpbHRlciBwcm9wZXJ0eQotVGhlX0xpc3RlbmVyQ2xhc3NfcHJvcGVydHlfMj1UaGUgTGlzdGVuZXJDbGFzcyBwcm9wZXJ0eQotRGV0YWlscy4uLj1EZXRhaWxzLi4uCi1Mb2FkX29uX3N0YXJ0dXBfNT1Mb2FkIG9uIHN0YXJ0dXAKLUxvYWRfb3JkZXJfXzY9TG9hZCBvcmRlcjoKLURlbGV0ZV9TZXJ2bGV0X0luaXRfUGFyYW1fNz1EZWxldGUgU2VydmxldCBJbml0IFBhcmFtCi0obmFtZSlfOD0obmFtZSkKLSh2YWx1ZSlfOT0odmFsdWUpCi1OZXdfSW5pdGlhbGl6YXRpb25fUGFyYW1ldGVyXzEwPU5ldyBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIKLUZpbHRlcl9tYXBwaW5nX19fMT1GaWx0ZXIgbWFwcGluZzoKLVNlY3VyaXR5Q29uc3RyYWludF8xPVNlY3VyaXR5Q29uc3RyYWludAotVGhlX2ZvbGxvd2luZ19pbml0aWFsaXphdGlvbl9wYXJhbWV0ZXJzX2FyZV9jb25maWd1cmVkX2Zvcl90aGlzX3NlcnZsZXRfXzE9VGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFyZSBjb25maWd1cmVkIGZvciB0aGlzIHNlcnZsZXQ6Ci1GaWx0ZXJfbWFwcGluZ190ZXh0PXswfSAtPiB7MX0KLUFkZF9vcl9SZW1vdmVfUmVzb3VyY2VfRW52aXJvbm1lbnRfUmVmZXJlbmNlXzE9QWRkIG9yIFJlbW92ZSBSZXNvdXJjZSBFbnZpcm9ubWVudCBSZWZlcmVuY2UKLU1JTUVfMT1NSU1FCi1NSU1FX01hcHBpbmdzXzI9TUlNRSBNYXBwaW5ncwotUmVzb3VyY2VfRW52aXJvbm1lbnRfMT1SZXNvdXJjZSBFbnZpcm9ubWVudAotQXV0b21hdGljX0ZpbHRlcl9Mb2FkaW5nX2VuYWJsZWRfMT1BdXRvbWF0aWMgRmlsdGVyIExvYWRpbmcgZW5hYmxlZAotQXV0b21hdGljX0ZpbHRlcl9Mb2FkaW5nX0VuYWJsZWRfQ2hhbmdlZF80PUF1dG9tYXRpYyBGaWx0ZXIgTG9hZGluZyBFbmFibGVkIENoYW5nZWQKLVRoZV9mb2xsb3dpbmdfc2VydmxldHNfaGF2ZV90aGlzX2ZpbHRlcl9tYXBwZWRfdG9fdGhlbV8xPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgaGF2ZSB0aGlzIGZpbHRlciBtYXBwZWQgdG8gdGhlbQotVGhlX2ZvbGxvd2luZ19VUkxzX2hhdmVfdGhpc19maWx0ZXJfbWFwcGVkX3RvX3RoZW1fMT1UaGUgZm9sbG93aW5nIFVSTHMgaGF2ZSB0aGlzIGZpbHRlciBtYXBwZWQgdG8gdGhlbQotTUlNRV90eXBlX18xPU1JTUUgdHlwZToKLU1JTUVfVHlwZV9jaGFuZ2VfMj1NSU1FIFR5cGUgY2hhbmdlCi1UaGVfZm9sbG93aW5nX2ZpbGVfZXh0ZW5zaW9uc19hcmVfbWFwcGVkX3RvX01JTUVfdHlwZXNfMT1UaGUgZm9sbG93aW5nIGZpbGUgZXh0ZW5zaW9ucyBhcmUgbWFwcGVkIHRvIE1JTUUgdHlwZXMKLUxvY2F0aW9uXzE9XCBMb2NhdGlvbgotTGlua19fMT1MaW5rOgotRWpiX1JlZl9MaW5rX2NoYW5nZV8yPUVqYiBSZWYgTGluayBjaGFuZ2UKLVJlc291cmNlX0Vudl9SZWZfSk5ESV9OYW1lX2NoYW5nZV8xPVJlc291cmNlIEVudiBSZWYgSk5ESSBOYW1lIGNoYW5nZQotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfcmVzb3VyY2VfZW52aXJvbm1lbnRfcmVmZXJlbmNlXzE9RGV0YWlscyBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlCi1UeXBlX1NlbGVjdGlvbl8yPVR5cGUgU2VsZWN0aW9uCi1DaG9vc2VfYV90eXBlXzM9Q2hvb3NlIGEgdHlwZQotUmVzb3VyY2VfRW52aXJvbm1lbnRfUmVmZXJlbmNlc18xPVJlc291cmNlIEVudmlyb25tZW50IFJlZmVyZW5jZXMKLVRoZV9mb2xsb3dpbmdfcmVzb3VyY2VfZW52aXJvbm1lbnRfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl8yPVRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcyBhcmUgdXNlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbgotTmV3X1Jlc291cmNlRW52UmVmXzM9TmV3IFJlc291cmNlRW52UmVmCi1BZGRfU2VydmxldF9FeHRlbnNpb25fMT1BZGQgU2VydmxldCBFeHRlbnNpb24KLV9FUlJPUl9Qcm9ibGVtc19vcGVuaW5nX2VkaXRvcl8zPUlXQUUwMDI2RSBQcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotX0VSUk9SX0pTUF9maWxlX2RvZXNfbm90X2V4aXN0XzQ9SVdBRTAwMjdFIEpTUCBmaWxlIGRvZXMgbm90IGV4aXN0Ci1fRVJST1JfUHJvYmxlbXNfb3BlbmluZ19lZGl0b3JfNT1JV0FFMDAyOEUgUHJvYmxlbXMgb3BlbmluZyBlZGl0b3IKLV9FUlJPUl9Db3VsZF9ub3RfZmluZF90eXBlX3dpdGhpbl9wcm9qZWN0XzY9SVdBRTAwMjlFIENvdWxkIG5vdCBmaW5kIHR5cGUgd2l0aGluIHByb2plY3QKLV9FUlJPUl9Qcm9ibGVtc19vcGVuaW5nX2VkaXRvcl83PUlXQUUwMDMwRSBQcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotX0VSUk9SX1Byb2JsZW1zX29wZW5pbmdfZWRpdG9yXzg9SVdBRTAwMzFFIFByb2JsZW1zIG9wZW5pbmcgZWRpdG9yCi1BZGRfVmFyaWFibGVfMT1BZGQgVmFyaWFibGUKLUVkaXRfVmFyaWFibGVfMj1FZGl0IFZhcmlhYmxlCi1EZWZpbmVfYV9uZXdfdmFyaWFibGVfaW5fdGhpc19zZXJ2bGV0X2NhY2hpbmdfY29uZmlndXJhdGlvbl8xPURlZmluZSBhIG5ldyB2YXJpYWJsZSBpbiB0aGlzIHNlcnZsZXQgY2FjaGluZyBjb25maWd1cmF0aW9uCi1WYXJpYWJsZV8yPVZhcmlhYmxlCi1JRF9fMz1JRDoKLVR5cGVfXzQ9VHlwZToKLU1ldGhvZF9fNT1NZXRob2Q6Ci1EYXRhX0lEX182PURhdGEgSUQ6Ci1JbnZhbGlkX0lEX183PUludmFsaWQgSUQ6Ci1SZXF1aXJlZF84PVJlcXVpcmVkCi1BZGRfRXh0ZXJuYWxfQ2FjaGVfR3JvdXBfMT1BZGQgRXh0ZXJuYWwgQ2FjaGUgR3JvdXAKLUFkZF9hbl9leHRlcm5hbF9jYWNoZV9ncm91cF90b190aGlzX3NlcnZsZXRfY2FjaGluZ19jb25maWd1cmF0aW9uXzE9QWRkIGFuIGV4dGVybmFsIGNhY2hlIGdyb3VwIHRvIHRoaXMgc2VydmxldCBjYWNoaW5nIGNvbmZpZ3VyYXRpb24KLUV4dGVybmFsX0NhY2hlX0dyb3VwXzI9RXh0ZXJuYWwgQ2FjaGUgR3JvdXAKLUdyb3VwX05hbWVfXzM9R3JvdXAgTmFtZToKLUdyb3VwX05hbWVfaXNfZW1wdHlfNT1Hcm91cCBOYW1lIGlzIGVtcHR5Ci1DYWNoaW5nX2dyb3VwX25hbWVfaXNfZW1wdHlfMj1DYWNoaW5nIGdyb3VwIG5hbWUgaXMgZW1wdHkKLVByaW9yaXR5X211c3RfYmVfYW5faW50ZWdlcl8zPVByaW9yaXR5IG11c3QgYmUgYW4gaW50ZWdlcgotVGltZW91dF9tdXN0X2JlX2FuX2ludGVnZXJfND1UaW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlcgotRGVmaW5lX2FfbmV3X3NlcnZsZXRfY2FjaGluZ19jb25maWd1cmF0aW9uXzE9RGVmaW5lIGEgbmV3IHNlcnZsZXQgY2FjaGluZyBjb25maWd1cmF0aW9uCi1TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbl8yPVNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1UaGVfRGVmYXVsdFBhZ2VfcHJvcGVydHlfMj1UaGUgRGVmYXVsdFBhZ2UgcHJvcGVydHkKLVRoZV9FcnJvclBhZ2VfcHJvcGVydHlfND1UaGUgRXJyb3JQYWdlIHByb3BlcnR5Ci1UaGVfTWltZVR5cGVfcHJvcGVydHlfNj1UaGUgTWltZVR5cGUgcHJvcGVydHkKLVRoZV9OYW1lX3Byb3BlcnR5Xzg9VGhlIE5hbWUgcHJvcGVydHkKLVRoZV9QYWdlc19wcm9wZXJ0eV8xMD1UaGUgUGFnZXMgcHJvcGVydHkKLVRoZV9FeHRlbmRlZFNlcnZsZXRfcHJvcGVydHlfMj1UaGUgRXh0ZW5kZWRTZXJ2bGV0IHByb3BlcnR5Ci1UaGVfTG9jYWxUcmFuc2FjdGlvbl9wcm9wZXJ0eV80PVRoZSBMb2NhbFRyYW5zYWN0aW9uIHByb3BlcnR5Ci1UaGVfTWFya3VwTGFuZ3VhZ2VfcHJvcGVydHlfNj1UaGUgTWFya3VwTGFuZ3VhZ2UgcHJvcGVydHkKLURlZmluZV9BdXRob3JpemF0aW9uX0NvbnN0cmFpbnRfMT1EZWZpbmUgQXV0aG9yaXphdGlvbiBDb25zdHJhaW50Ci1DaG9vc2VfYV9zZXJ2bGV0X18xPUNob29zZSBhIHNlcnZsZXQ6Ci1DaG9vc2VfYV9zZXJ2bGV0X18yPUNob29zZSBhIFNlcnZsZXQ6Ci1NYXRjaGluZ19zZXJ2bGV0c19fMj1NYXRjaGluZyBzZXJ2bGV0czoKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6Ci1RdWFsaWZpZXJfXzM9UXVhbGlmaWVyOgotQWRkX29yX1JlbW92ZV9FSkJfTG9jYWxfUmVmZXJlbmNlXzE9QWRkIG9yIFJlbW92ZSBFSkIgTG9jYWwgUmVmZXJlbmNlCi1BZGRfb3JfUmVtb3ZlX01hcmt1cF9MYW5ndWFnZV8yPUFkZCBvciBSZW1vdmUgTWFya3VwIExhbmd1YWdlCi1DbG9zZV9lZGl0b3JfMz1DbG9zZSBlZGl0b3IKLUZpbGVfaGFzX2JlZW5fZGVsZXRlZF9mcm9tX3RoZV9maWxlX3N5c3RlbS5fbldoYXRfd291bGRfeW91X2xpa2VfdG9fZG9fXzQ9RmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLlxuV2hhdCB3b3VsZCB5b3UgbGlrZSB0byBkbz8KLVNhdmVfYW5kX2Nsb3NlX2VkaXRvcl81PVNhdmUgYW5kIGNsb3NlIGVkaXRvcgotQ2xvc2VfZWRpdG9yXzY9Q2xvc2UgZWRpdG9yCi1UaGlzX3dlYi54bWxfZmlsZV9pc19ub3RfYV92YWxpZF9EZXBsb3ltZW50X0Rlc2NyaXB0b3JfZm9yX2FfV2ViX0FyY2hpdmUsX2hlbmNlX3RoZV9YTUxfZWRpdG9yX3dpbGxfYmVfb3BlbmVkXzc9VGhpcyB3ZWIueG1sIGZpbGUgaXMgbm90IGEgdmFsaWQgRGVwbG95bWVudCBEZXNjcmlwdG9yIGZvciBhIFdlYiBBcmNoaXZlLCBoZW5jZSB0aGUgWE1MIGVkaXRvciB3aWxsIGJlIG9wZW5lZC4KLUVKQl8xPUVKQgotRUpCX0xvY2FsXzI9RUpCIExvY2FsCi1SZXNvdXJjZV8zPVJlc291cmNlCi1SZXNvdXJjZV9FbnZpcm9ubWVudF8xXzQ9UmVzb3VyY2VfRW52aXJvbm1lbnRfMQotSlNQX3RhZ19saWJyYXJpZXNfNV81PUpTUF90YWdfbGlicmFyaWVzXzUKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6Ci1DaG9vc2VfYV9saXN0ZW5lcl9fMT1DaG9vc2UgYSBsaXN0ZW5lcjoKLU1hdGNoaW5nX2xpc3RlbmVyX18yPU1hdGNoaW5nIGxpc3RlbmVyOgotUHJvYmxlbXNfb3BlbmluZ19lZGl0b3JfMj1Qcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotYXBwbGljYXRpb24ueG1sX2RvZXNfbm90X2V4aXN0XzM9YXBwbGljYXRpb24ueG1sIGRvZXMgbm90IGV4aXN0Ci1SZWZyZXNoXzQ9UmVmcmVzaAotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfRUpCX0xvY2FsX3JlZmVyZW5jZV8xPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEVKQiBMb2NhbCByZWZlcmVuY2UKLUxvY2FsX2hvbWVfXzI9TG9jYWwgaG9tZToKLUxvY2FsX18zPUxvY2FsOgotRUpCX0xvY2FsX1JlZmVyZW5jZXNfMT1FSkIgTG9jYWwgUmVmZXJlbmNlcwotVGhlX2ZvbGxvd2luZ19FSkJfbG9jYWxfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl8yPVRoZSBmb2xsb3dpbmcgRUpCIGxvY2FsIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24KLShOZXdfRUpCX0xvY2FsX1JlZilfMz0oTmV3IEVKQiBMb2NhbCBSZWYpCi0oTmV3X1Jlc291cmNlRW52UmVmKV8xPShOZXcgUmVzb3VyY2VFbnZSZWYpCi1EZXNjcmlwdGlvbl9fMj1EZXNjcmlwdGlvbjoKLURlc2NyaXB0aW9uX2NoYW5nZV8zPURlc2NyaXB0aW9uIGNoYW5nZQotRGV0YWlsc19vZl90aGVfU2VydmxldF9FeHRlbnNpb25fb2ZfdGhlX3NlbGVjdGVkX3NlcnZsZXRfMT1EZXRhaWxzIG9mIHRoZSBTZXJ2bGV0IEV4dGVuc2lvbiBvZiB0aGUgc2VsZWN0ZWQgc2VydmxldAotTWFya3VwX0xhbmd1YWdlc18yPU1hcmt1cCBMYW5ndWFnZXMKLUxvY2FsX1RyYW5zYWN0aW9uXzM9TG9jYWwgVHJhbnNhY3Rpb24KLURlbGV0ZV9GaWx0ZXJfTWFwcGluZ18xPURlbGV0ZSBGaWx0ZXIgTWFwcGluZwotQWRkX0ZpbHRlcl9NYXBwaW5nc18yPUFkZCBGaWx0ZXIgTWFwcGluZ3MKLUNob29zZV9hX0pTUF9fMT1DaG9vc2UgYSBKU1A6Ci1OYW1lX18yPU5hbWU6Ci1NSU1FX3R5cGVfXzM9TUlNRSB0eXBlOgotRXJyb3JfcGFnZV9fND1FcnJvciBwYWdlOgotQnJvd3NlXzU9QnJvd3NlCi1EZWZhdWx0X3BhZ2VfXzY9RGVmYXVsdCBwYWdlOgotQnJvd3NlXzc9QnJvd3NlCi1QYWdlc19fOD1QYWdlczoKLV9OYW1lXzk9XCBOYW1lCi1fVVJJXzEwPVwgVVJJCi0oTmFtZSlfMTE9KE5hbWUpCi0oVVJJKV8xMj0oVVJJKQotTmFtZV9pc19lbXB0eV8xMz1OYW1lIGlzIGVtcHR5Ci1NSU1FX2lzX2VtcHR5XzE0PU1JTUUgaXMgZW1wdHkKLURlZmluZV9hX25ld19tYXJrdXBfbGFuZ3VhZ2VfZW50cnlfMT1EZWZpbmUgYSBuZXcgbWFya3VwIGxhbmd1YWdlIGVudHJ5Ci1NYXJrdXBfTGFuZ3VhZ2VfMj1NYXJrdXAgTGFuZ3VhZ2UKLUNob29zZV9hX1BhZ2VfMT1DaG9vc2UgYSBQYWdlCi1EZXNjcmlwdGlvbl9fMT1EZXNjcmlwdGlvbjoKLUVudmlyb25tZW50X3ZhcmlhYmxlX3ZhbHVlX2NoYW5nZV8xPUVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIGNoYW5nZQotRW52aXJvbm1lbnRfdmFyaWFibGVfZGVzY3JpcHRpb25fY2hhbmdlXzI9RW52aXJvbm1lbnQgdmFyaWFibGUgZGVzY3JpcHRpb24gY2hhbmdlCi1EZXNjcmlwdGlvbl9uYW1lX2NoYW5nZV8yPURlc2NyaXB0aW9uIG5hbWUgY2hhbmdlCi1Db250ZXh0X1BhcmFtX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPUNvbnRleHQgUGFyYW0gRGVzY3JpcHRpb24gY2hhbmdlCi1FamJfUmVmX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPUVqYiBSZWYgRGVzY3JpcHRpb24gY2hhbmdlCi1SZXNvdXJjZV9FbnZpcm9ubWVudF9SZWZfRGVzY3JpcHRpb25fY2hhbmdlXzE9UmVzb3VyY2UgRW52aXJvbm1lbnQgUmVmIERlc2NyaXB0aW9uIGNoYW5nZQotUmVzb3VyY2VfUmVmX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPVJlc291cmNlIFJlZiBEZXNjcmlwdGlvbiBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX3NlY3VyaXR5X2NvbnN0cmFpbnRfMT1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZWN1cml0eSBjb25zdHJhaW50Ci1EaXNwbGF5X05hbWVfXzI9RGlzcGxheSBOYW1lOgotU2VjdXJpdHlfQ29uc3RyYWludF9EaXNwbGF5TmFtZV9jaGFuZ2VfMz1TZWN1cml0eSBDb25zdHJhaW50IERpc3BsYXlOYW1lIGNoYW5nZQotRW1wdHlfTGlzdF8yPUVtcHR5IExpc3QKLV9VSV9TZWxlY3RfYV90YWdfbGlicmFyeV90b19hZGRfdG9fdGhlX2RlcGxveW1lbnRfZGVzY3JpcHRvcl8xPVNlbGVjdCBhIHRhZyBsaWJyYXJ5IHRvIGFkZCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1fVUlfQWRkX2FfVGFnX0xpYnJhcnlfMj1BZGQgYSBUYWcgTGlicmFyeQotX1VJX1RhZ19MaWJyYXJpZXNfXzM9VGFnIExpYnJhcmllczoKLV9VSV9BdmFpbGFibGVfQ3VzdG9tX1RhZ3NfXzQ9QXZhaWxhYmxlIEN1c3RvbSBUYWdzOgotX1VJX19UYWdfNT1cIFRhZwotX1VJX19EZXNjcmlwdGlvbl82PVwgRGVzY3JpcHRpb24KLV9VSV9VUklfXzc9VVJJOgotX1VJX1NlbGVjdF9hX1RhZ19MaWJyYXJ5Xzg9U2VsZWN0IGEgVGFnIExpYnJhcnkKLV9VSV9VUklfY2Fubm90X2JlX2VtcHR5XzEwPVVSSSBjYW5ub3QgYmUgZW1wdHkKLUJyb3dzZS4uLl8xPUJyb3dzZS4uLgotQnJvd3NlLi4uXzM9QnJvd3NlLi4uCi1Ccm93c2UuLi5fND1Ccm93c2UuLi4KLVJlbW92ZV9MaW5rXzc9UmVtb3ZlIExpbmsKLUhvbWVfaW50ZXJmYWNlX3NlbGVjdGlvbl84PUhvbWUgaW50ZXJmYWNlIHNlbGVjdGlvbgotTG9jYWxfaW50ZXJmYWNlX3NlbGVjdGlvbl8xMz1Mb2NhbCBpbnRlcmZhY2Ugc2VsZWN0aW9uCi1DaG9vc2VfYW5faW50ZXJmYWNlXzE2PUNob29zZSBhbiBpbnRlcmZhY2UKLU1hdGNoaW5nX2ludGVyZmFjZXNfXzE3PU1hdGNoaW5nIGludGVyZmFjZXM6Ci1TZXRfRUpCX0xvY2FsX1JlZl9MaW5rXzE4PVNldCBFSkIgTG9jYWwgUmVmIExpbmsKLVJlbW92ZV9FSkJfTG9jYWxfUmVmX0xpbmtfMTk9UmVtb3ZlIEVKQiBMb2NhbCBSZWYgTGluawotRUpCX3NlbGVjdGlvbl8zPUVKQiBzZWxlY3Rpb24KLUNob29zZV9hbl9FSkJfND1DaG9vc2UgYW4gRUpCCi1NYXRjaGluZ19FSkJzX181PU1hdGNoaW5nIEVKQnM6Ci1Mb2NhdGlvbl9fNj1Mb2NhdGlvbjoKLUVtcHR5X0xpc3RfMTE9RW1wdHkgTGlzdAotU2V0X0VKQl9SZWZfTGlua184PVNldCBFSkIgUmVmIExpbmsKLVJlbW92ZV9FSkJfUmVmX0xpbmtfOT1SZW1vdmUgRUpCIFJlZiBMaW5rCi1Ib21lX2ludGVyZmFjZV9zZWxlY3Rpb25fMTE9SG9tZSBpbnRlcmZhY2Ugc2VsZWN0aW9uCi1SZW1vdGVfaW50ZXJmYWNlX3NlbGVjdGlvbl8xND1SZW1vdGUgaW50ZXJmYWNlIHNlbGVjdGlvbgotQ2hvb3NlX2FuX2ludGVyZmFjZV8xNz1DaG9vc2UgYW4gaW50ZXJmYWNlCi1NYXRjaGluZ19pbnRlcmZhY2VzX18xOD1NYXRjaGluZyBpbnRlcmZhY2VzOgotU3BlY2lmeV9hbl9FcnJvcl9Db2RlX2FuZF9Mb2NhdGlvbl8xPVNwZWNpZnkgYW4gRXJyb3IgQ29kZSBhbmQgTG9jYXRpb24KLVNwZWNpZnlfYW5fRXhjZXB0aW9uX1R5cGVfYW5kX0xvY2F0aW9uXzI9U3BlY2lmeSBhbiBFeGNlcHRpb24gVHlwZSBhbmQgTG9jYXRpb24KLUFkZF9hbl9FcnJvcl9QYWdlXzM9QWRkIGFuIEVycm9yIFBhZ2UKLUVycm9yX0NvZGVfXzQ9RXJyb3IgQ29kZToKLUV4Y2VwdGlvbl9UeXBlX181PUV4Y2VwdGlvbiBUeXBlOgotU2VsZWN0Li4uXzY9U2VsZWN0Li4uCi1Ccm93c2UuLi5fNz1Ccm93c2UuLi4KLUxvY2F0aW9uX184PUxvY2F0aW9uOgotQnJvd3NlLi4uXzk9QnJvd3NlLi4uCi1FcnJvcl9Db2RlX2lzX2VtcHR5XzEzPUVycm9yIENvZGUgaXMgZW1wdHkKLUV4Y2VwdGlvbl9UeXBlX2lzX2VtcHR5XzE0PUV4Y2VwdGlvbiBUeXBlIGlzIGVtcHR5Ci1Mb2NhdGlvbl9pc19lbXB0eV8xNj1Mb2NhdGlvbiBpcyBlbXB0eQotTG9jYXRpb25fMTg9TG9jYXRpb24KLVNlbGVjdF9hX1BhZ2VfMTk9U2VsZWN0IGEgUGFnZQotQWRkX2FfcGFnZV90b190aGlzX21hcmt1cF9sYW5ndWFnZV8xPUFkZCBhIHBhZ2UgdG8gdGhpcyBtYXJrdXAgbGFuZ3VhZ2UKLVBhZ2VfMj1QYWdlCi1OYW1lX18zPU5hbWU6Ci1VUklfXzQ9VVJJOgotTmFtZV9pc19lbXB0eV84PU5hbWUgaXMgZW1wdHkKLVVSSV9pc19lbXB0eV8xMD1VUkkgaXMgZW1wdHkKLURldGFpbHNfb2ZfdGhlX1NlcnZsZXRfRXh0ZW5zaW9uX2Zvcl90aGVfc2VsZWN0ZWRfc2VydmxldF8xPURldGFpbHMgb2YgdGhlIFNlcnZsZXQgRXh0ZW5zaW9uIGZvciB0aGUgc2VsZWN0ZWQgc2VydmxldAotRGVsZXRlX01hcmt1cF9MYW5ndWFnZV83PURlbGV0ZSBNYXJrdXAgTGFuZ3VhZ2UKLUFkZF9NYXJrdXBfTGFuZ3VhZ2VfZW50cnlfOD1BZGQgTWFya3VwIExhbmd1YWdlIGVudHJ5Ci1FZGl0X01hcmt1cF9MYW5ndWFnZV9lbnRyeV85PUVkaXQgTWFya3VwIExhbmd1YWdlIGVudHJ5Ci1UaGVfbmFtZV9wcm9wZXJ0eV8xPVRoZSBuYW1lIHByb3BlcnR5Ci1UaGVfVVJJX3Byb3BlcnR5XzI9VGhlIFVSSSBwcm9wZXJ0eQotRW1wdHlfTGlzdF8xPUVtcHR5IExpc3QKLVdlYl9MaWJyYXJ5X1Byb2plY3RzXzE9V2ViIExpYnJhcnkgUHJvamVjdHMKLVRoZV9mb2xsb3dpbmdfSkFSc19hcmVfbWFwcGVkX3RvX0phdmFfcHJvamVjdHNfXzI9VGhlIGZvbGxvd2luZyBKQVJzIGFyZSBtYXBwZWQgdG8gSmF2YSBwcm9qZWN0czoKLV9KQVJfTmFtZV8zPVwgSkFSIE5hbWUKLV9KYXZhX1Byb2plY3RfND1cIEphdmEgUHJvamVjdAotRXJyb3JfNT1FcnJvcgotQWRkX1BhZ2VfMT1BZGQgUGFnZQotVXBfMT1VcAotRG93bl8yPURvd24KLVJlc291cmNlX1JlZmVyZW5jZV9TaGFyZWFibGVfY2hhbmdlXzM9UmVzb3VyY2UgUmVmZXJlbmNlIFNoYXJlYWJsZSBjaGFuZ2UKLUVudmlyb25tZW50X3ZhcmlhYmxlX3R5cGVfY2hhbmdlXzE9RW52aXJvbm1lbnQgdmFyaWFibGUgdHlwZSBjaGFuZ2UKLVdlYlNwaGVyZV9FeHRlbnNpb25zXzE9V2ViU3BoZXJlIEV4dGVuc2lvbnMKLUJyb3dzZS4uLl8yPUJyb3dzZS4uLgotUmVtb3ZlX1BhZ2VfMz1SZW1vdmUgUGFnZQotVGFnX0xpYnJhcnlfMT1UYWcgTGlicmFyeQotQ3JlYXRlX1BhZ2VfMT1DcmVhdGUgUGFnZQotQ3JlYXRlX01hcmt1cExhbmd1YWdlXzE9Q3JlYXRlIE1hcmt1cExhbmd1YWdlCi1BZGRfb3JfUmVtb3ZlX1NlcnZsZXRfRXh0ZW5zaW9uXzE9QWRkIG9yIFJlbW92ZSBTZXJ2bGV0IEV4dGVuc2lvbgotX0lORk9fTm9fc2VjdXJpdHlfcm9sZXNfZXhpc3QuXzE9SVdBRTAwMzJJIE5vIHNlY3VyaXR5IHJvbGVzIGV4aXN0LgotX0lORk9fTm9fRW50ZXJwcmlzZV9CZWFuc193aGljaF9pbXBsZW1lbnRfdGhlX3JlbW90ZV9pbnRlcmZhY2VfZXhpc3QuXzE9SVdBRTAwMzNJIE5vIEVudGVycHJpc2UgQmVhbnMgd2hpY2ggaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlIGV4aXN0LgotX0lORk9fTm9fRW50ZXJwcmlzZV9CZWFuc193aGljaF9pbXBsZW1lbnRfdGhlX2xvY2FsX2ludGVyZmFjZV9leGlzdC5fMj1JV0FFMDAzNEkgTm8gRW50ZXJwcmlzZSBCZWFucyB3aGljaCBpbXBsZW1lbnQgdGhlIGxvY2FsIGludGVyZmFjZSBleGlzdC4KLV9JTkZPX05vX3NlcnZsZXRzX2V4aXN0X3RvX2FkZC5fMT1JV0FFMDAzNUkgTm8gc2VydmxldHMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fY2xhc3Nlc193aGljaF9pbXBsZW1lbnRfamF2YXguc2VydmxldC5GaWx0ZXJfZXhpc3QuXzE9SVdBRTAwMzdJIE5vIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IGphdmF4LnNlcnZsZXQuRmlsdGVyIGV4aXN0LgotX0lORk9fTm9fZmlsdGVyc19leGlzdF90b19hZGQuXzE9SVdBRTAwMzhJIE5vIGZpbHRlcnMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fbGlzdGVuZXJzX2V4aXN0X3RvX2FkZC5fMT1JV0FFMDAzOUkgTm8gbGlzdGVuZXJzIGV4aXN0IHRvIGFkZC4KLV9FUlJPUl9FcnJvcl91cGRhdGluZ19XZWJfUHJvcGVydGllc18xPUlXQUUwMDQwRSBFcnJvciB1cGRhdGluZyBXZWIgUHJvcGVydGllcwotX0lORk9fTm9faG9tZV9pbnRlcmZhY2VzX2V4aXN0Ll8xPUlXQUUwMDQxSSBObyBob21lIGludGVyZmFjZXMgZXhpc3QuCi1fSU5GT19Ob19sb2NhbF9pbnRlcmZhY2VzX2V4aXN0Ll8yPUlXQUUwMDQySSBObyBsb2NhbCBpbnRlcmZhY2VzIGV4aXN0LgotX0lORk9fTm9fcmVtb3RlX2ludGVyZmFjZXNfZXhpc3QuXzI9SVdBRTAwNDNJIE5vIHJlbW90ZSBpbnRlcmZhY2VzIGV4aXN0LgotX0lORk9fTm9fdGFnX2xpYnJhcmllc19leGlzdF90b19hZGQuXzE9SVdBRTAwNDRJIE5vIHRhZyBsaWJyYXJpZXMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fZXhjZXB0aW9uc19leGlzdF90b19hZGQuXzE9SVdBRTAwNDVJIE5vIGV4Y2VwdGlvbnMgZXhpc3QgdG8gYWRkLgotQWRkX1Jlc291cmNlX1JlZmVyZW5jZV9FeHRlbnNpb25fMz1BZGQgUmVzb3VyY2UgUmVmZXJlbmNlIEV4dGVuc2lvbgotVmlydHVhbF9Ib3N0X05hbWVfXzE9VmlydHVhbCBIb3N0IE5hbWU6Ci1Db25uZWN0aW9uX21hbmFnZW1lbnRfXzE9Q29ubmVjdGlvbiBtYW5hZ2VtZW50OgotSXNvbGF0aW9uX2xldmVsX18yPUlzb2xhdGlvbiBsZXZlbDoKLV9NYXJrdXBfTGFuZ3VhZ2VfMT1cIE1hcmt1cCBMYW5ndWFnZQotX01pbWVfVHlwZV8yPVwgTWltZSBUeXBlCi1Cb3VuZGFyeV9fMz1Cb3VuZGFyeToKLVJlc29sdmVyX180PVJlc29sdmVyOgotVW5yZXNvbHZlZF9BY3Rpb25fXzU9VW5yZXNvbHZlZCBBY3Rpb246Ci1TZWxlY3RfYW5fRXJyb3JfQ29kZV8xPVNlbGVjdCBhbiBFcnJvciBDb2RlCi1Db2RlXzI9Q29kZQotRGVzY3JpcHRpb25fMz1EZXNjcmlwdGlvbgotKl9kZW5vdGVzX2Vycm9yX2NvZGVfbmV3X3RvX0hUVFBfMS4xXzQ9KiBkZW5vdGVzIGVycm9yIGNvZGUgbmV3IHRvIEhUVFAgMS4xCi1Db250aW51ZSpfNj1Db250aW51ZSoKLVN3aXRjaGluZ19Qcm90b2NvbHMqXzg9U3dpdGNoaW5nIFByb3RvY29scyoKLU9LXzEwPU9LCi1DcmVhdGVkXzEyPUNyZWF0ZWQKLUFjY2VwdGVkXzE0PUFjY2VwdGVkCi1Ob24tQXV0aG9yaXRhdGl2ZV9JbmZvcm1hdGlvbipfMTY9Tm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24qCi1Ob19Db250ZW50XzE4PU5vIENvbnRlbnQKLVJlc2V0X0NvbnRlbnQqXzIwPVJlc2V0IENvbnRlbnQqCi1QYXJ0aWFsX0NvbnRlbnQqXzIyPVBhcnRpYWwgQ29udGVudCoKLU11bHRpcGxlX0Nob2ljZXNfMjQ9TXVsdGlwbGUgQ2hvaWNlcwotTW92ZWRfUGVybWFuZW50bHlfMjY9TW92ZWQgUGVybWFuZW50bHkKLUZvdW5kXzI4PUZvdW5kCi1TZWVfT3RoZXIqXzMwPVNlZSBPdGhlcioKLU5vdF9Nb2RpZmllZF8zMj1Ob3QgTW9kaWZpZWQKLVVzZV9Qcm94eSpfMzQ9VXNlIFByb3h5KgotVGVtcG9yYXJ5X1JlZGlyZWN0Kl8zNj1UZW1wb3JhcnkgUmVkaXJlY3QqCi1CYWRfUmVxdWVzdF8zOD1CYWQgUmVxdWVzdAotVW5hdXRob3JpemVkXzQwPVVuYXV0aG9yaXplZAotRm9yYmlkZGVuXzQyPUZvcmJpZGRlbgotTm90X0ZvdW5kXzQ0PU5vdCBGb3VuZAotTWV0aG9kX05vdF9BbGxvd2VkKl80Nj1NZXRob2QgTm90IEFsbG93ZWQqCi1Ob3RfQWNjZXB0YWJsZSpfNDg9Tm90IEFjY2VwdGFibGUqCi1Qcm94eV9BdXRoZW50aWNhdGlvbl9SZXF1aXJlZCpfNTA9UHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqCi1SZXF1ZXN0X1RpbWVvdXQqXzUyPVJlcXVlc3QgVGltZW91dCoKLUNvbmZsaWN0Kl81ND1Db25mbGljdCoKLUdvbmUqXzU2PUdvbmUqCi1MZW5ndGhfUmVxdWlyZWQqXzU4PUxlbmd0aCBSZXF1aXJlZCoKLVByZWNvbmRpdGlvbl9GYWlsZWQqXzYwPVByZWNvbmRpdGlvbiBGYWlsZWQqCi1SZXF1ZXN0X0VudGl0eV9Ub29fTGFyZ2UqXzYyPVJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSoKLVJlcXVlc3RfVVJJX1Rvb19Mb25nKl82ND1SZXF1ZXN0IFVSSSBUb28gTG9uZyoKLVVuc3VwcG9ydGVkX01lZGlhX1R5cGUqXzY2PVVuc3VwcG9ydGVkIE1lZGlhIFR5cGUqCi1SZXF1ZXN0ZWRfUmFuZ2VfTm90X1NhdGlzZmlhYmxlKl82OD1SZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlKgotRXhwZWN0YXRpb25fRmFpbGVkKl83MD1FeHBlY3RhdGlvbiBGYWlsZWQqCi1JbnRlcm5hbF9TZXJ2ZXJfRXJyb3JfNzI9SW50ZXJuYWwgU2VydmVyIEVycm9yCi1Ob3RfSW1wbGVtZW50ZWRfNzQ9Tm90IEltcGxlbWVudGVkCi1CYWRfR2F0ZXdheV83Nj1CYWQgR2F0ZXdheQotU2VydmljZV9VbmF2YWlsYWJsZV83OD1TZXJ2aWNlIFVuYXZhaWxhYmxlCi1HYXRld2F5X1RpbWVvdXQqXzgwPUdhdGV3YXkgVGltZW91dCoKLUhUVFBfVmVyc2lvbl9Ob3RfU3VwcG9ydGVkKl84Mj1IVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCoKLUNob29zZV9hX1NlcnZsZXRfMT1DaG9vc2UgYSBTZXJ2bGV0Ci1VbnNwZWNpZmllZF8xPVVuc3BlY2lmaWVkCi1TaGFyaW5nX18xPVNoYXJpbmc6Ci1FcnJvcl9QYWdlXzE9RXJyb3IgUGFnZQotTmV3X0VKQl9SZWY9KE5ldyBFSkIgUmVmKQotc2VsZWN0U1I9U2VsZWN0IGEgU2VjdXJpdHkgUm9sZQotUm9sZV9uYW1lPVJvbGUgbmFtZQotTm9TUj1ObyBTZWN1cml0eSBSb2xlcyBleGlzdC4KLVJlbW92ZVVEQz1SZW1vdmUgVXNlciBEYXRhIENvbnN0cmFpbnQKLVVEQ19kZXNjX2NoYW5nZT1Vc2VyIERhdGEgQ29uc3RyYWludCBkZXNjcmlwdGlvbiBjaGFuZ2VkCi1SdW5fQXM9UnVuIEFzCi1kZXRSdW5Bcz1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZXJ2bGV0J3MgcnVuLWFzIGVsZW1lbnQKLVNSPVNlY3VyaXR5IHJvbGU6Ci1TZWxlY3Q9U2VsZWN0Li4uCi1SZW1vdmU9UmVtb3ZlCi1SZW1vdmVSQT1SZW1vdmUgcnVuLWFzCi1TZXRSQT1TZXQgcnVuLWFzCi1TZXRSTj1TZXQgcm9sZS1uYW1lCi1TZWN1cml0eVJvbGVSZWZEaWFsb2cuU2VjdXJpdHlfUm9sZV9SZWY9U2VjdXJpdHkgUm9sZSBSZWYKLVNlY3VyaXR5Um9sZVJlZkRpYWxvZy5Sb2xlX25hbWU9Um9sZSBuYW1lOgotU2VjdXJpdHlSb2xlUmVmRGlhbG9nLlJvbGVfbGluaz1Sb2xlIGxpbms6Ci1TZWN1cml0eVJvbGVSZWZEaWFsb2cuRGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci1XZWJhcHBsaWNhdGlvbkVkaXRvci5BZGRfb3JfUmVtb3ZlX1NlY3VyaXR5X1JvbGVfUmVmPUFkZCBvciBSZW1vdmUgU2VjdXJpdHkgUm9sZSBSZWYKLVNlcl9BdXRoU2VjdGlvbi5fTGluaz1cIExpbmsKLVNlcl9BdXRoU2VjdGlvbi5FZGl0X1NlY3VyaXR5X1JvbGVfUmVmPUVkaXQgU2VjdXJpdHkgUm9sZSBSZWYKLXNycl9oZWFkZXI9U2VjdXJpdHkgUm9sZSBSZWZlcmVuY2VzCi1zcnJfZGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgYXJlIGRlZmluZWQgZm9yIHRoaXMgc2VydmxldDoKLUxvY2FsX2VuY29kaW5nX21hcHBpbmdfbGlzdF9VSV89TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdAotbG9jYWxfZW5jb2RpbmdfbWFwcGluZ19VSV89TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcKLV9VSV9KU1BDb25maWdfdHlwZT1KU1AgQ29uZmlnCi1fVUlfVGFnTGliUmVmVHlwZV90eXBlPVRhZ0xpYlJlZlR5cGUKLV9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGU9SlNQUHJvcGVydHlHcm91cAotX1VJX0pTUFByb3BlcnR5R3JvdXBfdXJsUGF0dGVybl9mZWF0dXJlPVVSTCBQYXR0ZXJuCi1fVUlfSlNQUHJvcGVydHlHcm91cF9lbElnbm9yZWRfZmVhdHVyZT1FbCBJZ25vcmVkCi1fVUlfSlNQUHJvcGVydHlHcm91cF9wYWdlRW5jb2RpbmdfZmVhdHVyZT1QYWdlIEVuY29kaW5nCi1fVUlfSlNQUHJvcGVydHlHcm91cF9zY3JpcHRpbmdJbnZhbGlkX2ZlYXR1cmU9U2NyaXB0aW5nIEludmFsaWQKLV9VSV9KU1BQcm9wZXJ0eUdyb3VwX2lzWE1MX2ZlYXR1cmU9SXMgWE1MCi1fVUlfSlNQUHJvcGVydHlHcm91cF9pbmNsdWRlUHJlbHVkZXNfZmVhdHVyZT1JbmNsdWRlIFByZWx1ZGVzCi1fVUlfSlNQUHJvcGVydHlHcm91cF9pbmNsdWRlQ29kYXNfZmVhdHVyZT1JbmNsdWRlIENvZGFzCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvc2NoZW1hL2ZpbGVVUkwuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3NjaGVtYS9maWxlVVJMLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmY0NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvc2NoZW1hL2ZpbGVVUkwuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIgaWQ9ImZpbGVVUkwiIG5hbWU9IkZpbGUgVVJMIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgZm9yIHRoZSBXZWIgSlNGYWNlcyBGaWxlIFVSTCBleHRlbnNpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVVUkwiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlVVJMIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVuIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1bgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NsYXNzLnRlbXBsYXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19jbGFzcy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0ODgxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NsYXNzLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLQlpZiAobW9kZWwuaXNQdWJsaWMoKSkgeyAKLSU+Ci1wdWJsaWMgCi08JSAKLQl9IAotCi0JaWYgKG1vZGVsLmlzQWJzdHJhY3QoKSkgeyAKLSU+YWJzdHJhY3QgCi08JQotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLSU+ZmluYWwgCi08JQotCX0KLSU+Y2xhc3MgPCU9IG1vZGVsLmdldENsYXNzTmFtZSgpICU+Ci08JQotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotJT4gZXh0ZW5kcyA8JT0gc3VwZXJDbGFzcyAlPgotPCUKLQl9Ci0KLQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0gCWlmICggaW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7IAotJT4gaW1wbGVtZW50cyAKLTwlCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLSU+LCAKLTwlCi0JCX0KLSU+PCU9IElOVEVSRkFDRSAlPgotPCUKLQl9Ci0lPiB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NvbnN0cnVjdG9ycy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fY29uc3RydWN0b3JzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkzOGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fY29uc3RydWN0b3JzLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCUgCi0JaWYgKCFtb2RlbC5oYXNFbXB0eVN1cGVyY2xhc3NDb25zdHJ1Y3RvcigpKSB7IAotJT4KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIAotICAgICAqLwotICAgIHB1YmxpYyA8JT0gbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgJT4oKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLTwlIAotCX0gCi0KLQlpZiAobW9kZWwuc2hvdWxkR2VuU3VwZXJjbGFzc0NvbnN0cnVjdG9ycygpKSB7Ci0JCUxpc3Q8Q29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycyA9IG1vZGVsLmdldENvbnN0cnVjdG9ycygpOwotCQlmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuaXNQdWJsaWMoKSB8fCBjb25zdHJ1Y3Rvci5pc1Byb3RlY3RlZCgpKSB7IAotJT4KLSAgICAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIDwlPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICU+IzwlPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICU+KDwlPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgJT4pCi0gICAgICovCi0gICAgcHVibGljIDwlPSBtb2RlbC5nZXRDbGFzc05hbWUoKSAlPig8JT0gY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSAlPikgewotICAgICAgICBzdXBlcig8JT0gY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICU+KTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotPCUKLQkJCX0gCi0JCX0gCi0JfSAKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19mbGFncy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fZmxhZ3MudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmFmZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19mbGFncy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPCUKLQltb2RlbC5yZW1vdmVGbGFncyhDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FKTsgCi0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9faW1wb3J0cy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9faW1wb3J0cy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlN2I0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2ltcG9ydHMudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwlIAotCUNvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cygpOwotCWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLSU+Ci1pbXBvcnQgPCU9IGFuSW1wb3J0ICU+OwotPCUgCi0JfQotJT4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19tZXRob2RzLnRlbXBsYXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19tZXRob2RzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUzZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fbWV0aG9kcy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwlCi0JaWYgKG1vZGVsLnNob3VsZEltcGxlbWVudEFic3RyYWN0TWV0aG9kcygpKSB7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1vZGVsLmdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkpIHsgCi0lPgotCi0JLyoqCi0gICAgICogQHNlZSA8JT0gbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSAlPiM8JT0gbWV0aG9kLmdldE5hbWUoKSAlPig8JT0gbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSAlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgPCU9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgJT4gPCU9IG1ldGhvZC5nZXROYW1lKCkgJT4oPCU9IG1ldGhvZC5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICU+KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLTwlIAotCQkJU3RyaW5nIGRlZmF1bHRSZXR1cm5WYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0UmV0dXJuVmFsdWUoKTsKLQkJCWlmIChkZWZhdWx0UmV0dXJuVmFsdWUgIT0gbnVsbCkgeyAKLSU+Ci0JCQlyZXR1cm4gPCU9IGRlZmF1bHRSZXR1cm5WYWx1ZSAlPjsKLTwlCi0JCQl9IAotJT4KLSAgICB9Ci08JSAKLQkJfQotCX0gCi0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fcGFja2FnZS50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fcGFja2FnZS50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3OWRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX3BhY2thZ2UudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTwlCi0JaWYgKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICE9IG51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0lPgotcGFja2FnZSA8JT0gbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkgJT47Ci08JQotCX0KLSU+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXIuamF2YWpldCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXIuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxZmIwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvZmlsdGVyLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zIiAKLQlpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qIiAKLQljbGFzcz0iRmlsdGVyVGVtcGxhdGUiIAotJT4KLTwlIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfZmxhZ3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfcGFja2FnZS50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9pbXBvcnRzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iZmlsdGVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2NsYXNzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2NvbnN0cnVjdG9ycy50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9tZXRob2RzLnRlbXBsYXRlIiAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBGaWx0ZXIjZGVzdHJveSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0ZpbHRlcigpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEZpbHRlciNkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vIHBsYWNlIHlvdXIgY29kZSBoZXJlCi0KLQkJLy8gcGFzcyB0aGUgcmVxdWVzdCBhbG9uZyB0aGUgZmlsdGVyIGNoYWluCi0JCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuSW5pdCgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEZpbHRlciNpbml0KEZpbHRlckNvbmZpZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvZmlsdGVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM0NjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioKLSAqIFNlcnZsZXQgRmlsdGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIDwlPSBtb2RlbC5nZXRDbGFzc05hbWUoKSAlPgotPCUgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyCi0gKiAgIG5hbWU9IjwlPSBtb2RlbC5nZXRGaWx0ZXJOYW1lKCkgJT4iCi0gKiAgIGRpc3BsYXktbmFtZT0iPCU9IG1vZGVsLmdldEZpbHRlck5hbWUoKSAlPiIKLTwlCi0JCWlmIChtb2RlbC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwgJiYgbW9kZWwuZ2V0RGVzY3JpcHRpb24oKS5sZW5ndGgoKSA+IDApIHsgCi0lPgotICogICBkZXNjcmlwdGlvbj0iPCU9IG1vZGVsLmdldERlc2NyaXB0aW9uKCkgJT4iCi08JSAKLQkJfSAKLQkJCi0JCUxpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPiBtYXBwaW5ncyA9IG1vZGVsLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0gCQlmb3IgKElGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nIDogbWFwcGluZ3MpIHsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyLW1hcHBpbmcKLTwlCi0JCQlpZiAobWFwcGluZy5pc1VybFBhdHRlcm5UeXBlKCkpIHsgCi0lPgotICogICB1cmwtcGF0dGVybj0iPCU9IG1hcHBpbmcuZ2V0TmFtZSgpICU+IgotPCUKLQkJCX0gZWxzZSBpZiAobWFwcGluZy5pc1NlcnZsZXROYW1lVHlwZSgpKSB7IAotJT4KLSAqICAgc2VydmxldC1uYW1lPSI8JT0gbWFwcGluZy5nZXROYW1lKCkgJT4iCi08JQotCQkJfQotCQkgCi0JCQlTdHJpbmcgZGlzcGF0Y2hlciA9IG1vZGVsLmdldERpc3BhdGNoZXJMaXN0KG1hcHBpbmcpOwotCQkJaWYgKGRpc3BhdGNoZXIubGVuZ3RoKCkgPiAwKSB7IAotJT4KLSAqICAgZGlzcGF0Y2hlcj0iPCU9IGRpc3BhdGNoZXIgJT4iCi08JSAKLQkJCX0gCi0JCX0gCi0KLQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IG1vZGVsLmdldEluaXRQYXJhbXMoKTsKLQkJaWYgKGluaXRQYXJhbXMgIT0gbnVsbCAmJiBpbml0UGFyYW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdFBhcmFtcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuTkFNRSk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuVkFMVUUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG1vZGVsLmdldEluaXRQYXJhbShpLCBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OKTsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyLWluaXQtcGFyYW0KLSAqICAgIG5hbWU9IjwlPSBuYW1lICU+IgotICogICAgdmFsdWU9IjwlPSB2YWx1ZSAlPiIKLTwlCi0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKSB7IAotJT4KLSAqICAgIGRlc2NyaXB0aW9uPSI8JT0gZGVzY3JpcHRpb24gJT4iCi08JQotCQkJCX0KLQkJCX0gCi0JCX0gCi0JfQotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9saXN0ZW5lci5qYXZhamV0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyLmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzg1MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zIiAKLQlpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qIiAKLQljbGFzcz0iTGlzdGVuZXJUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfZmxhZ3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfcGFja2FnZS50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9pbXBvcnRzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0ibGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY2xhc3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY29uc3RydWN0b3JzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX21ldGhvZHMudGVtcGxhdGUiICU+Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvbGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvbGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzI4ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgPCU9IG1vZGVsLmdldENsYXNzTmFtZSgpICU+Ci0gKgotPCUgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0lPgotICogQHdlYi5saXN0ZW5lcgotPCUgCi0JfQotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldC5qYXZhamV0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhmNmY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucyIgCi0JaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuKiIgCi0JY2xhc3M9IlNlcnZsZXRUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2ZsYWdzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX3BhY2thZ2UudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfaW1wb3J0cy50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9InNlcnZsZXRfY2xhc3NIZWFkZXIudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY2xhc3MudGVtcGxhdGUiICU+Ci08JSAKLQlpZiAobW9kZWwuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MoKSkgeyAKLSU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci08JSAKLQl9IAotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9jb25zdHJ1Y3RvcnMudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfbWV0aG9kcy50ZW1wbGF0ZSIgJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Jbml0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgU2VydmxldCNpbml0KFNlcnZsZXRDb25maWcpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotPCUgfSAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBTZXJ2bGV0I2Rlc3Ryb3koKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZsZXQjZ2V0U2VydmxldENvbmZpZygpCi0JICovCi0JcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldEluZm8oKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBTZXJ2bGV0I2dldFNlcnZsZXRJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOyAKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuU2VydmljZSgpICYmICFtb2RlbC5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcygpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZsZXQjc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuU2VydmljZSgpICYmIG1vZGVsLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotPCUgfSAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRvR2V0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuRG9Qb3N0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb1B1dCgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0RlbGV0ZSgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0hlYWQoKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBIdHRwU2VydmxldCNkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSGVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb09wdGlvbnMoKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBIdHRwU2VydmxldCNkb09wdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb1RyYWNlKCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL3NlcnZsZXRfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkMDcwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogU2VydmxldCBpbXBsZW1lbnRhdGlvbiBjbGFzcyA8JT0gbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgJT4KLTwlIAotCWlmIChtb2RlbC5pc0Fubm90YXRlZCgpKSB7IAotJT4KLSAqCi0gKiBAd2ViLnNlcnZsZXQKLSAqICAgbmFtZT0iPCU9IG1vZGVsLmdldFNlcnZsZXROYW1lKCkgJT4iCi0gKiAgIGRpc3BsYXktbmFtZT0iPCU9IG1vZGVsLmdldFNlcnZsZXROYW1lKCkgJT4iCi08JSAKLQkJaWYgKG1vZGVsLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCAmJiBtb2RlbC5nZXREZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMCkgeyAKLSU+Ci0gKiAgIGRlc2NyaXB0aW9uPSI8JT0gbW9kZWwuZ2V0RGVzY3JpcHRpb24oKSAlPiIKLTwlIAotCQl9IAotCQkKLQkJTGlzdDxTdHJpbmdbXT4gbWFwcGluZ3MgPSBtb2RlbC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLSAJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmIG1hcHBpbmdzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgbWFwID0gbW9kZWwuZ2V0U2VydmxldE1hcHBpbmcoaSk7ICU+Ci0gKgotICogQHdlYi5zZXJ2bGV0LW1hcHBpbmcKLSAqICAgdXJsLXBhdHRlcm49IjwlPSBtYXAgJT4iCi08JSAKLQkJCX0gCi0JCX0KLSAJCUxpc3Q8U3RyaW5nW10+IGluaXRQYXJhbXMgPSBtb2RlbC5nZXRJbml0UGFyYW1zKCk7Ci0gCQlpZiAoaW5pdFBhcmFtcyAhPSBudWxsICYmIGluaXRQYXJhbXMuc2l6ZSgpID4gMCkgewotICAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0UGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuTkFNRSk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLlZBTFVFKTsKLSAJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OKTsgCi0lPgotICoKLSAqIEB3ZWIuc2VydmxldC1pbml0LXBhcmFtCi0gKiAgICBuYW1lPSI8JT0gbmFtZSAlPiIKLSAqICAgIHZhbHVlPSI8JT0gdmFsdWUgJT4iCi08JSAKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsgCi0lPgotICogICAgZGVzY3JpcHRpb249IjwlPSBkZXNjcmlwdGlvbiAlPiIKLTwlCi0JCQkJfQotCQkJfSAKLQkJfSAKLQl9IAotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTMzODE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDc6MDY6NDMgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFVJV2FySGVscGVyIGV4dGVuZHMgV2FySGVscGVyIHsKLQotCS8qKgotCSAqIFVJV2FySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJV2FySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWIyYjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLldhclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8yLzIwMDEgNjo0Njo1NiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVUlXYXJWYWxpZGF0b3IgZXh0ZW5kcyBXYXJWYWxpZGF0b3IgewotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhckhlbHBlciB3YXJIZWxwZXI7CQotCi0KLQotCi0JLyoqCi0JICogVUlXYXJWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVUlXYXJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDg6MDE6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUud2FyLndvcmtiZW5jaGltcGwuVUlXYXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJIZWxwZXIgZ2V0V2FySGVscGVyKCkgewotCQlyZXR1cm4gd2FySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA4OjAxOjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdXYXJIZWxwZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS53YXIud29ya2JlbmNoaW1wbC5VSVdhckhlbHBlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdhckhlbHBlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhckhlbHBlciBuZXdXYXJIZWxwZXIpIHsKLQkJd2FySGVscGVyID0gbmV3V2FySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA2OjQ5OjI2IFBNKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBGaXJzdCByZW1vdmUgYWxsIHByZXZpb3VzIG1zZy4gZm9yIHRoaXMgcHJvamVjdAotCQkvLwlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyxudWxsKTsKLQkJc3VwZXIudmFsaWRhdGUoKTsKLQkJdmFsaWRhdGVFQVJGb3JDb250ZXh0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA2OjQ5OjI2IFBNKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikKLQkJCXRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24gewotCQkKLQkJc2V0V2FySGVscGVyKChVSVdhckhlbHBlcikgaW5IZWxwZXIpOwotCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgd2FySGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdiTW9kdWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0gICAgICAgIGlmKCB3Yk1vZHVsZSAhPSBudWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvaikpIHsgICAgICAgICAgIAkKLSAgICAgICAgCUlWaXJ0dWFsRmlsZSB3ZWJGaWxlID0gd2JNb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJCWlmKCB3ZWJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7Ci0JCQkJdmFsaWRhdGVXZWJJbmZMaWJzKHdiTW9kdWxlKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCX0JCi0KLQkvKgotCSAqIEZvciB3ZWIgcHJvamVjdHMsIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgKGJvdGgKLQkgKiBmcm9tIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCBhbmQgZnJvbSB0aGUgZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMgb2YgcmVmZXJlbmNlZAotCSAqIHV0aWxpdHkgcHJvamVjdHMpIGRvIG5vdCBjb25mbGljdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVXZWJJbmZMaWJzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCi0JCWZpbmFsIFNldCB3ZWJMaWJNYXBwaW5ncyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQkvLyBnZXQgdGhlIGxpYnMgY3VycmVudGx5IGluIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIKLQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoV2ViQXJ0aWZhY3RFZGl0LldFQkxJQik7Ci0JCXRyeSB7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElWaXJ0dWFsRmlsZSkgewotCQkJCQlJUmVzb3VyY2VbXSB1bmRlcmx5aW5nUmVzb3VyY2VzID0gcmVzb3VyY2VzW2ldLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQl3ZWJMaWJNYXBwaW5ncy5hZGQodW5kZXJseWluZ1Jlc291cmNlc1tqXS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBzd2FsbG93Ci0JCX0KLQkJZmluYWwgTWFwIGFyY2hpdmVUb1BhdGggPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHdlYkxpYnMgPSBXZWJVdGlsaXRpZXMuZ2V0TGliTW9kdWxlcyhjb21wb25lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYkxpYnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSB3ZWJMaWJzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCWlmIChjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlpZiAoIWRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2hlY2tMaWJOYW1lKGRpc2tGaWxlLmdldE5hbWUoKSwgbnVsbCwgd2ViTGliTWFwcGluZ3MsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSB3ZWJMaWJzW2ldLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJaWYgKGFyY2hpdmVOYW1lICE9IG51bGwgJiYgYXJjaGl2ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW5hbWUgPSBhcmNoaXZlTmFtZTsKLQkJCQl9IGVsc2UgewotCQkJCQluYW1lID0gY29tcC5nZXROYW1lKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2hlY2tMaWJOYW1lKG5hbWUsIGNvbXAuZ2V0UHJvamVjdCgpLCB3ZWJMaWJNYXBwaW5ncywgdHJ1ZSk7Ci0JCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIGNvbXApLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07Ci0JCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIGNwQ29tcE5hbWUgPSByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQkJCQljaGVja0xpYk5hbWUoY3BDb21wTmFtZSwgY29tcC5nZXRQcm9qZWN0KCksIHdlYkxpYk1hcHBpbmdzLCBmYWxzZSk7Ci0JCQkJCQkJSVBhdGggY3BFbnRyeVBhdGg9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldENsYXNzcGF0aFZpcnR1YWxSZWZlcmVuY2VMb2NhdGlvbihyZWYpOwotCQkJCQkJCWlmIChjcEVudHJ5UGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlQYXRoIGV4aXN0aW5nUGF0aCA9IChJUGF0aCkgYXJjaGl2ZVRvUGF0aC5nZXQoY3BDb21wTmFtZSk7Ci0JCQkJCQkJCWlmIChleGlzdGluZ1BhdGggIT0gbnVsbCAmJiAhZXhpc3RpbmdQYXRoLmVxdWFscyhjcEVudHJ5UGF0aCkpIHsKLQkJCQkJCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSwgbmV3IFN0cmluZ1tde2NwQ29tcE5hbWUsIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKX0pKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWFyY2hpdmVUb1BhdGgucHV0KGNwQ29tcE5hbWUsIGNwRW50cnlQYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0xpYk5hbWUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFNldCB3ZWJMaWJOYW1lcywgZmluYWwgYm9vbGVhbiBhZGROYW1lKSB7Ci0JCWlmICh3ZWJMaWJOYW1lcy5jb250YWlucyhuYW1lKSkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCS8vaWdub3JlIHRoaXMgYmVjYXVzZSBvZiBXQVIgaW1wb3J0IGJyaW5ncyBpbiB0aGUgbGliIGphcnMgYWxvbmcgd2l0aCBwcm9qZWN0cwotCQkJCS8vX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1QsIG5ldyBTdHJpbmdbXXtuYW1lLCBwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCLCBuZXcgU3RyaW5nW117bmFtZX0pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChhZGROYW1lKSB7Ci0JCQl3ZWJMaWJOYW1lcy5hZGQobmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDY6NDk6MjYgUE0pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFQVJGb3JDb250ZXh0Um9vdCgpIHsKLQotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXYXJIZWxwZXIoKS5nZXRQcm9qZWN0KCk7Ci0vLwkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLS8vCQlTdHJpbmcgY29udGV4dFJvb3QgPSB3ZWJOYXR1cmUuZ2V0Q29udGV4dFJvb3QoKTsKLS8vCi0vLwkJaWYgKHdlYk5hdHVyZSA9PSBudWxsKQotLy8JCQlyZXR1cm47Ci0vLwotLy8JCUVBUk5hdHVyZVJ1bnRpbWUgZWFyUnVudGltZU5hdHVyZVtdID0gd2ViTmF0dXJlLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoKTsKLQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUnVudGltZU5hdHVyZS5sZW5ndGg7IGkrKykgewotLy8JCQkvLyBmb3IgZWFjaCBFYXIgUHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgd2ViIHByb2plY3QgdXBkYXRlIHRoZSBjb250ZXh0IHJvb3QuCi0vLwkJCS8vIGhvbGQgdGhlIG1vZGVsIGFuZCB2YWxpZGF0ZSB0aGUgY29udGV4dCByb290ICYgcmVsZWFzZSB0aGUgbW9kZWwKLS8vCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQllZGl0TW9kZWwgPSBlYXJSdW50aW1lTmF0dXJlW2ldLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLS8vCQkJCQlpZiAoKG1vZHVsZSA9IGVhclJ1bnRpbWVOYXR1cmVbaV0uZ2V0TW9kdWxlKHByb2plY3QpKSAhPSBudWxsKSB7Ci0vLwkJCQkJCVN0cmluZyB3ZWJNb2Rjb250ZXh0Um9vdCA9ICgoV2ViTW9kdWxlKSBtb2R1bGUpLmdldENvbnRleHRSb290KCk7Ci0vLwkJCQkJCWlmICh3ZWJNb2Rjb250ZXh0Um9vdCAhPSBudWxsICYmICF3ZWJNb2Rjb250ZXh0Um9vdC5lcXVhbHMoY29udGV4dFJvb3QpKSB7Ci0vLwkJCQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotLy8JCQkJCQkJcGFyYW1zWzBdID0gcHJvamVjdC5nZXROYW1lKCk7Ci0vLwkJCQkJCQlwYXJhbXNbMV0gPSAoKFdlYk1vZHVsZSkgbW9kdWxlKS5nZXRDb250ZXh0Um9vdCgpOwotLy8JCQkJCQkJcGFyYW1zWzJdID0gZWFyUnVudGltZU5hdHVyZVtpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotLy8JCQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QsIHBhcmFtcyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJCQllZGl0TW9kZWwgPSBudWxsOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdmFsaWRhdGVMaWJNb2R1bGVzLgotCSAqIAotCSAqIAotCSAqLwotCQotCS8vVE9ETyBjcmVhdGUgdmFsaWRhdGlvbiBmb3IgbW9kdWxlcwotLyoJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMaWJNb2R1bGVzKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYk5hdHVyZSkgewotCQlpZiAod2ViTmF0dXJlICE9IG51bGwpIHsKLQkJCUlMaWJNb2R1bGVbXSBsaWJNb2R1bGVzID0gd2ViTmF0dXJlLmdldExpYk1vZHVsZXMoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3ZWJOYXR1cmUuZ2V0UHJvamVjdCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYk1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTGliTW9kdWxlIGxpYiA9IGxpYk1vZHVsZXNbaV07Ci0JCQkJSVByb2plY3QgdFByb2plY3QgPSBsaWIuZ2V0UHJvamVjdCgpOwotCQkJCWlmICh0UHJvamVjdCAhPSBudWxsKSB7IC8vIFByb2plY3QgY291bGQgYmUgbnVsbCBpZiBKYXZhUHJvamVjdCBpcyBkZWxldGVkLCBmb3IKLQkJCQkJCQkJCQkvLyBleGFtcGxlCi0JCQkJCWlmICghdFByb2plY3QuZXhpc3RzKCkgfHwgIXRQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNULCBuZXcgU3RyaW5nW117dFByb2plY3QuZ2V0TmFtZSgpfSwgd2ViTmF0dXJlLmdldFByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgamFyTmFtZSA9IGxpYi5nZXRKYXJOYW1lKCk7Ci0JCQkJSVBhdGggamFyUGF0aCA9IHdlYk5hdHVyZS5nZXRMaWJyYXJ5Rm9sZGVyKCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoamFyTmFtZSk7Ci0JCQkJaWYgKCgoUmVzb3VyY2UpIHByb2plY3QpLmZpbmRFeGlzdGluZ1Jlc291cmNlVmFyaWFudChqYXJQYXRoKSAhPSBudWxsKQotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCwgbmV3IFN0cmluZ1tde2phck5hbWV9LCB3ZWJOYXR1cmUuZ2V0UHJvamVjdCgpKTsKLQkJCX0KLQkJfQotCX0qLwkKLQkKLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCBwcm9qZWN0ICk7Ci0JCUlGaWxlIHdlYkRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYoIGNvbXAgIT0gbnVsbCApewotCQkJSVZpcnR1YWxGaWxlIHZmID0gY29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKLQkJCWlmKCB2ZiE9IG51bGwgKXsKLQkJCQl3ZWJEZXBsb3ltZW50RGVzY3JpcHRvciA9IHZmLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdlYkRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1dhckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vV2FySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTYzZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vV2FySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLkoyRUVWYWxpZGF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uV0FSTWVzc2FnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2FySGVscGVyIGV4dGVuZHMgSjJFRVZhbGlkYXRpb25IZWxwZXIgewotCUhhc2h0YWJsZSB3YXJGaWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQlXQVJGaWxlIHdhckZpbGUgPSBudWxsOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSGVscGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS53YXIud29ya2JlbmNoaW1wbC5XYXJIZWxwZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFdhckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCi0JcHVibGljIFdhckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQotCQlyZWdpc3Rlck1vZGVsKFdBUk1lc3NhZ2VDb25zdGFudHMuV0FSX01PREVMX05BTUUsICJsb2FkV2FyRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGluZGlyZWN0bHkgZnJvbSB0aGUgV2FyVmFsaWRhdG9yICh2aWEuIHRoZSBXb3JrYmVuY2hSZXBvcnRlcikuIEl0Ci0JICogd2lsbCBleHBlY3QgdGhlIGNvbWluZyBvYmplY3QgdG8gYmUgYSBFT2JqZWN0IGZvciB0aGUgbm9kZSB3aG8gZ2VuZXJhdGVkIHRoaXMgbWVzc2FnZS4gTm90ZToKLQkgKiBUaGlzIG1ldGhvZHMgbWF5IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgaGlnaGVyIHVwIGluIHRoZSBjbGFzcyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgeyAvLyBFcnJvciBkaXNjb3ZlcmVkIHVzaW5nIHRoZSBYTUwgcGFyc2VyCi0JCQlyZXR1cm4gKChJbnRlZ2VyKSBvYmplY3QpLmludFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgotCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc291cmNlUGF0aC50b1N0cmluZygpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gdGhlIGdldEZpbGUoKSBtZXRob2QsIHdlIGtub3cgdGhhdCB3ZSBhcmUgdGFsa2luZyBhYm91dCB3ZWIueG1sLCBidXQgbmVlZCBhIHVuaXF1ZQotCSAqIElELgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIE9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQotCQlpZiggb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgV0FSRmlsZSApewotCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotLy8JCVN0cmluZyByZXQgPSBudWxsOwotLy8JCWlmIChvYmplY3QgIT0gbnVsbCkgewotLy8JCQlJRmlsZSB3YXJGaWxlID0gKElGaWxlKSB3YXJGaWxlTWFwLmdldChnZXRQcm9qZWN0KCkudG9TdHJpbmcoKSk7Ly8gdmFsaWRhdG9yIGZyYW1ld29yawotLy8JCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2lsbCBjYWxsIGdldEZpbGUoKQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QuCi0vLwkJCWlmICh3YXJGaWxlICE9IG51bGwpIHsKLS8vCQkJCXJldCA9ICh3YXJGaWxlLnRvU3RyaW5nKCkgKyBIZWxwZXJJRCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIHJldDsKLQl9Ci0KLQkKLQkvL3B1YmxpYyBFT2JqZWN0IGxvYWRXYXJGaWxlKENvbXBvbmVudEhhbmRsZSBoYW5kbGUpIHsKLQlwdWJsaWMgRU9iamVjdCBsb2FkV2FyRmlsZSgpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQkJZWRpdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJCi0JCQl0cnkgewotCQkJCXdhckZpbGUgPSAoV0FSRmlsZSkoKFdlYkFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlKTsKLQkJCQlyZXR1cm4gd2FyRmlsZTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCQl9Ci0vLwkJCWZpbmFsbHkgewotLy8JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotLy8JCQkJCWVkaXQuZGlzcG9zZSgpOwotLy8JCQkJfQotLy8JCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJCWVkaXQgPSBudWxsOwotCQl9CQotCQlpZih3YXJGaWxlICE9IG51bGwpewotCQkJd2FyRmlsZS5jbG9zZSgpOwotCQkJd2FyRmlsZSA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9Nb2R1bGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL01vZHVsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYjJlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL01vZHVsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSjJFRUZsZXhQcm9qRGVwbG95YWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLSAgICAKLSAgICBKMkVFRmxleFByb2pEZXBsb3lhYmxlIGRlbGVnYXRlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlRGVsZWdhdGUoSjJFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSkgewotICAgICAgICBkZWxlZ2F0ZSA9IG1vZHVsZURlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBKMkVFRmxleFByb2pEZXBsb3lhYmxlIGdldERlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiMzE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb24uRmlsZVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbi5GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEdFTkVSSUNfU0VSVkxFVF9DTEFTU19UWVBFID0gImphdmF4LnNlcnZsZXQuR2VuZXJpY1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBQ1RVU19TRVJWTEVUX0NMQVNTX1RZUEUgPSAib3JnLmFwYWNoZS5jYWN0dXMuc2VydmVyLlNlcnZsZXRUZXN0UmVkaXJlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIG9iajsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVBcnRpZmFjdCkKLQkJCXJlc291cmNlID0gKChJTW9kdWxlQXJ0aWZhY3QpIG9iaikuZ2V0TW9kdWxlKCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTZXJ2bGV0KSB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKChTZXJ2bGV0KSBvYmopOwotCQkJCVJlc291cmNlIHNlcnZSZXNvdXJjZSA9IHNlcnZsZXQuZVJlc291cmNlKCk7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoc2VydlJlc291cmNlKTsKLQkJCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCkKLQkJCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQkJCVN0cmluZyBtYXBwaW5nID0gbnVsbDsKLQkJCQlqYXZhLnV0aWwuTGlzdCBtYXBwaW5ncyA9ICgoU2VydmxldCkgb2JqKS5nZXRNYXBwaW5ncygpOwotCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0JCQkJCW1hcHBpbmcgPSBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCX0KLQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJCX0KLQkJCQlXZWJUeXBlIHdlYlR5cGUgPSAoKFNlcnZsZXQpIG9iaikuZ2V0V2ViVHlwZSgpOwotCQkJCWlmICh3ZWJUeXBlLmlzSnNwVHlwZSgpKSB7Ci0JCQkJCXJlc291cmNlID0gKChJUHJvamVjdCkgcmVzb3VyY2UpLmdldEZpbGUoKChKU1BUeXBlKSB3ZWJUeXBlKS5nZXRKc3BGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh3ZWJUeXBlLmlzU2VydmxldFR5cGUoKSkgewotCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyAoKFNlcnZsZXRUeXBlKSB3ZWJUeXBlKS5nZXRDbGFzc05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKQotCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHByb2plY3QsIG51bGwpLCBwcm9qZWN0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJCi0JCWlmICghaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCQlpZiAoaXNDYWN0dXNKdW5pdFRlc3QocmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPD0gMCB8fCByZXNvdXJjZXNbMF0gPT0gbnVsbCApCi0JCQlyZXR1cm4gbnVsbDsKLQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2VydmxldENsYXNzTmFtZShyZXNvdXJjZSk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1hcHBpbmcgPSBnZXRTZXJ2bGV0TWFwcGluZyhyZXNvdXJjZSwgdHJ1ZSwgY2xhc3NOYW1lLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJCWlmIChtYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKLQkJCX0KLQkJCS8vIGlmIHRoZXJlIGlzIG5vIHNlcnZsZXQgbWFwcGluZywgcHJvdmlkZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzZXJ2bGV0Ci0JCQkvLyB0aHJvdWdoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aCgic2VydmxldC8iICsgY2xhc3NOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQlMaXN0IHNlcnZsZXRzID0gd2ViRWRpdC5nZXRXZWJBcHAoKS5nZXRTZXJ2bGV0cygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMuZ2V0KGkpOwotCQkJCQlXZWJUeXBlIHR5cGUgPSBzZXJ2bGV0LmdldFdlYlR5cGUoKTsKLQkJCQkJaWYgKHR5cGUuaXNKc3BUeXBlKCkpIHsKLQkJCQkJCUpTUFR5cGUganNwID0gKEpTUFR5cGUpdHlwZTsKLQkJCQkJCVN0cmluZyBqc3BQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJCQkJCWlmIChqc3AuZ2V0SnNwRmlsZSgpLmVxdWFscyhqc3BQYXRoKSkgewotCQkJCQkJCUxpc3QgbWFwcGluZ3MgPSBzZXJ2bGV0LmdldE1hcHBpbmdzKCk7Ci0JCQkJCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwotCQkJCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0JCQkJCQkJCW1hcHBpbmcgPSBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSAKLQkJCQkJCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLSAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkJLy8gRXh0ZW5zaW9uIHJlYWQgdG8gZ2V0IHRoZSBjb3JyZWN0IFVSTCBmb3IgSmF2YSBTZXJ2ZXIgRmFjZXMgZmlsZSBpZgotCQkvLyB0aGUganNwIGlzIG9mIHR5cGUganNmYWNlcy4KLQkJRmlsZVVSTCBqc3BVUkwgPSBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmlsZXNVUkwoKTsKLQkJaWYgKGpzcFVSTCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBjb3JyZWN0SlNQUGF0aCA9IGpzcFVSTC5nZXRGaWxlVVJMKHJlc291cmNlLCByZXNvdXJjZVBhdGgpOwotCQkJaWYgKGNvcnJlY3RKU1BQYXRoICE9IG51bGwgJiYgY29ycmVjdEpTUFBhdGgudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBjb3JyZWN0SlNQUGF0aCk7Ci0JCX0KLQkJLy8gcmV0dXJuIFdlYiByZXNvdXJjZSB0eXBlCi0JCQotCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIHJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBWZXJ5IHRlbXBvcmFyeSBhcGkgLSBUT0RPIC0gcmlwIHRoaXMgb3V0IGJ5IDEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDYWN0dXNKdW5pdFRlc3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRDbGFzc05hbWVGb3JUeXBlKHJlc291cmNlLCBDQUNUVVNfU0VSVkxFVF9DTEFTU19UWVBFKSAhPSBudWxsOwotCX0KLQotCi0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZVtdIGdldFR5cGVzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5nZXRBbGxUeXBlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lRm9yVHlwZShyZXNvdXJjZSwgR0VORVJJQ19TRVJWTEVUX0NMQVNTX1RZUEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZUZvclR5cGUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgc3VwZXJUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSB8fCBwYXRoID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQlpZiAoIWphdmFQcm9qZWN0LmlzT3BlbigpKQotCQkJCWphdmFQcm9qZWN0Lm9wZW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCS8vIG91dHB1dCBsb2NhdGlvbiBtYXkgbm90IGJlIG9uIGNsYXNzcGF0aAotCQkJSVBhdGggb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsICYmICJjbGFzcyIuZXF1YWxzKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiBvdXRwdXRQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBjb3VudCA9IG91dHB1dFBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpbml0aWFsIHBhcnQgb2YgY2xhc3NwYXRoCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc1BhdGhFbnRyeSA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJaWYgKGNsYXNzUGF0aEVudHJ5ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNsYXNzUGF0aEVudHJ5Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUGF0aCBjbGFzc1BhdGggPSBjbGFzc1BhdGhFbnRyeVtpXS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChjbGFzc1BhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJaW50IGNvdW50ID0gY2xhc3NQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQkJCQlpICs9IHNpemU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBqYXZhIGVsZW1lbnQKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGphdmFQcm9qZWN0LmZpbmRFbGVtZW50KHBhdGgpOwotCi0JCQlJVHlwZVtdIHR5cGVzID0gZ2V0VHlwZXMoamF2YUVsZW1lbnQpOwotCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZTIgPSB0eXBlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChoYXNTdXBlcmNsYXNzKHR5cGVzW2ldLCBzdXBlclR5cGUpKQotCQkJCQkJcmV0dXJuIHR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU3VwZXJjbGFzcyhJVHlwZSB0eXBlLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCi0JCQlpbnQgc2l6ZSA9IHN1cGVyQ2xhc3Nlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoc3VwZXJDbGFzc2VzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc1NlcnZsZXQsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwgfHwgdHlwZU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQlXZWJBcHAgd2ViQXBwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQl3ZWJBcHAgPSBlZGl0LmdldFdlYkFwcCgpOwotCQkJaWYgKHdlYkFwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCQkJV2ViVHlwZSB3ZWJUeXBlID0gc2VydmxldC5nZXRXZWJUeXBlKCk7Ci0JCQkJaWYgKHdlYlR5cGUuaXNTZXJ2bGV0VHlwZSgpICYmIGlzU2VydmxldCkgewotCQkJCQlTZXJ2bGV0VHlwZSB0eXBlID0gKFNlcnZsZXRUeXBlKSB3ZWJUeXBlOwotCQkJCQlpZiAodHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0Q2xhc3NOYW1lKCkpKQotCQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAod2ViVHlwZS5pc0pzcFR5cGUoKSAmJiAhaXNTZXJ2bGV0KSB7Ci0JCQkJCUpTUFR5cGUgdHlwZSA9IChKU1BUeXBlKSB3ZWJUeXBlOwotCQkJCQlpZiAodHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0SnNwRmlsZSgpKSkKLQkJCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gc2VydmxldC5nZXRNYXBwaW5ncygpOwotCQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTZXJ2bGV0TWFwcGluZyBtYXAgPSAoU2VydmxldE1hcHBpbmcpIG1hcHBpbmdzLmdldCgwKTsKLQkJCQkJCXJldHVybiBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvV2ViTW9kdWxlQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMTNhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYk1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzOwotCi0vKioKLSAqICAgIEtleSBDbGFzcyBmb3IgYWRhcHRlciBtYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVBcnRpZmFjdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzdlOTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVVUkwgewotCXB1YmxpYyBJUGF0aCBnZXRGaWxlVVJMKElSZXNvdXJjZSByZXNvdXJjZSwgSVBhdGggZXhpc3RpbmdVUkwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UyMDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEzLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVVJMRXh0ZW5zaW9uIHsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlVVJMIGluc3RhbmNlOwotCXByaXZhdGUgYm9vbGVhbiBlcnJvckNvbmRpdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9VUkxfRVhURU5TSU9OID0gImZpbGVVUkwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOID0gInJ1biI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEZpbGVVUkxFeHRlbnNpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEZpbGVVUkwgZ2V0SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5pbnN0YW5jZSA9PSBudWxsICYmICF0aGlzLmVycm9yQ29uZGl0aW9uKQotCQkJCXRoaXMuaW5zdGFuY2UgPSAoRmlsZVVSTCkgdGhpcy5lbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInJ1biIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aGlzLmVycm9yQ29uZGl0aW9uID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5pbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZVVSTEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIUZJTEVfVVJMX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIFwiIiArIEZJTEVfVVJMX0VYVEVOU0lPTiArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5pZCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODhjYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEzLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVGhpcyBjbGFzcyBsb2FkcyBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdCBkZWZpbmUgdGhlIGNvcnJlY3QgVVJMIHN0cmluZyBmb3IgdGhlIEphdmEgU2VydmVyIEZhY2VzCi0gKiBmaWxlCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXN0YXRpYyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyIGluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBmaWxlVVJMRXh0ZW5zaW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIEBwYXJhbSBwbHVnaW5JRAotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqLwotCXB1YmxpYyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXZWJQbHVnaW4uUExVR0lOX0lELCAiZmlsZVVSTCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChGaWxlVVJMRXh0ZW5zaW9uLkZJTEVfVVJMX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQlhZGRFeHRlbnNpb24oZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25zCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0V4dGVuc2lvbikgewotCQlnZXRGaWxlVVJMRXh0ZW5zaW9ucygpLmFkZChuZXcgRmlsZVVSTEV4dGVuc2lvbihuZXdFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbnMKLQkgKiAgICAgICAgICAgIFRoZSBleHRlbnNpb25zIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvblBvaW50KEZpbGVVUkxFeHRlbnNpb25SZWFkZXIgbmV3RXh0ZW5zaW9uKSB7Ci0JCWlmICh0aGlzLmZpbGVVUkxFeHRlbnNpb25zID09IG51bGwpCi0JCQl0aGlzLmZpbGVVUkxFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZpbGVVUkxFeHRlbnNpb25zLmFkZChuZXdFeHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHByaW9yaXRpZXMgb2YgdGhvc2Ugd2hpY2ggYXJlCi0JICogICAgICAgICBhdmFpbGFibGUgYW5kIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgRmlsZVVSTCBnZXRGaWxlc1VSTCgpIHsKLQkJRmlsZVVSTEV4dGVuc2lvbiBmaWxlVVJMRXh0OwotCQlmb3IgKEl0ZXJhdG9yIGZpbGVVUkxFeHRJdHIgPSBnZXRGaWxlVVJMRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGZpbGVVUkxFeHRJdHIuaGFzTmV4dCgpOykgewotCQkJZmlsZVVSTEV4dCA9IChGaWxlVVJMRXh0ZW5zaW9uKSBmaWxlVVJMRXh0SXRyLm5leHQoKTsKLQkJCXJldHVybiBmaWxlVVJMRXh0LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRmlsZVVSTEV4dGVuc2lvblJlYWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVVSTEV4dGVuc2lvblJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZpbGVVUkxFeHRlbnNpb25SZWFkZXIoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJFeHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEZpbGVVUkxFeHRlbnNpb25zKCkgewotCQlpZiAodGhpcy5maWxlVVJMRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJdGhpcy5maWxlVVJMRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRoaXMuZmlsZVVSTEV4dGVuc2lvbnM7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxY2NlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHlDYWNoZSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFNVUEVSQ0xBU1MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0SW50ZXJmYWNlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSgoSVByb2plY3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlcmNsYXNzKElEYXRhTW9kZWwgZGF0YU1vZGVsLAotCQkJU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VwZXJUeXBlTmFtZSkgewotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IGdldEphdmFQcm9qZWN0KGRhdGFNb2RlbCkuZmluZFR5cGUodHlwZU5hbWUpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBnZXRUeXBlSGllcmFyY2h5KHR5cGUpOwotCQkJCWZvciAoSVR5cGUgc3VwZXJUeXBlIDogdHlwZUhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSkpIHsKLQkJCQkJaWYgKHN1cGVyVHlwZU5hbWUuZXF1YWxzKHN1cGVyVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWJQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlckludGVyZmFjZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwKLQkJCVN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1cGVyVHlwZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIHR5cGUgPSBnZXRKYXZhUHJvamVjdChkYXRhTW9kZWwpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gZ2V0VHlwZUhpZXJhcmNoeSh0eXBlKTsKLQkJCQlmb3IgKElUeXBlIHN1cGVyVHlwZSA6IHR5cGVIaWVyYXJjaHkuZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKHR5cGUpKSB7Ci0JCQkJCWlmIChzdXBlclR5cGVOYW1lLmVxdWFscyhzdXBlclR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJV2ViUGx1Z2luLmxvZyhlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJVHlwZUhpZXJhcmNoeSBnZXRUeXBlSGllcmFyY2h5KElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodHlwZUhpZXJhcmNoeUNhY2hlID09IG51bGwgfHwgIXR5cGUuZXF1YWxzKHR5cGVIaWVyYXJjaHlDYWNoZS5nZXRUeXBlKCkpKSB7Ci0JCQl0eXBlSGllcmFyY2h5Q2FjaGUgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVIaWVyYXJjaHlDYWNoZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRGaWx0ZXJPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRGaWx0ZXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYTM0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkRmlsdGVyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRklMVEVSX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCBBZGRGaWx0ZXIgT3BlcmF0aW9uIGlzIGEgSURhdGFNb2RlbE9wZXJhdGlvbiBmb2xsb3dpbmcgdGhlCi0gKiBJRGF0YU1vZGVsIHdpemFyZCBhbmQgb3BlcmF0aW9uIGZyYW1ld29yay4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhpcyBvcGVyYXRpb24gc3ViY2xhc3NlcyB0aGUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gc28gdGhlIGNoYW5nZXMKLSAqIG1hZGUgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtb2RlbHMgYXJlIHNhdmVkIHRvIHRoZSBhcnRpZmFjdCBlZGl0Ci0gKiBtb2RlbC4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBJdCBpcyB0aGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgbmV3IGZpbHRlciB0byBhIHdlYgotICogYXBwLiBUaGlzIHVzZXMgdGhlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgdG8gcmV0cmlldmUgcHJvcGVydGllcyBzZXQgYnkgdGhlCi0gKiB1c2VyIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgY3VzdG9tIGZpbHRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAotICogVG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBqYXZhIGNsYXNzIGZvciB0aGUgZmlsdGVyLCB0aGUgb3BlcmF0aW9uIHVzZXMgdGhlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uLiAKLSAqIFRoZSBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbiBzaGFyZXMgdGhlIHNhbWUgZGF0YSBtb2RlbCBwcm92aWRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBvcGVyYXRpb24gdG8gcHJvdmlkZSB0aGVpciBvd24gYmVoYXZpb3Igb24gZmlsdGVyCi0gKiBjcmVhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCB0byBkbyBzby4gQWxzbywKLSAqIGdlbmVyYXRlRmlsdGVyTWV0YURhdGEgYW5kIGNyZXRlRmlsdGVyQ2xhc3MgYXJlIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIEFkZEZpbHRlck9wZXJhdGlvbiBleHRlbmRzIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKiBJdCB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24jQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oSURhdGFNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBBZGRGaWx0ZXJPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWRkRmlsdGVyT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uIGdldE5ld0NsYXNzT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBnZW5lcmF0aW9uIHN0ZXBzIGZvcgotCSAqIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWV0YWRhdGEgZm9yIHRoZSB3ZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgSjJFRSBtb2RlbHMgdG8gY3JlYXRlIHRoZSBGaWx0ZXIgbW9kZWwgaW5zdGFuY2UsCi0JICogYW55IGluaXQgcGFyYW1zIHNwZWNpZmllZCwgYW5kIGFueSBmaWx0ZXIgbWFwcGluZ3MuIEl0IHRoZW4gYWRkcyB0aGVzZQotCSAqIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuIFRoaXMgd2lsbCB0aGVuIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZQotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBzZWUgRmlsdGVyCi0JICogQHNlZSBBZGRGaWx0ZXJPcGVyYXRpb24jY3JlYXRlRmlsdGVyKFN0cmluZykKLQkgKiBAc2VlIEFkZEZpbHRlck9wZXJhdGlvbiNzZXRVcEluaXRQYXJhbXMoTGlzdCwgRmlsdGVyKQotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI3NldFVwVVJMTWFwcGluZ3MoTGlzdCwgRmlsdGVyKQotCSAqIAotCSAqIEBwYXJhbSBhTW9kZWwKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShJRGF0YU1vZGVsIGFNb2RlbCwgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQkvLyBTZXQgdXAgdGhlIGZpbHRlciBtb2RlbGxlZCBvYmplY3QKLQkJT2JqZWN0IGZpbHRlciA9IGNyZWF0ZUZpbHRlcihxdWFsaWZpZWRDbGFzc05hbWUpOwotCi0JCS8vIFNldCB1cCB0aGUgSW5pdFBhcmFtcyBpZiBhbnkKLQkJTGlzdCBpbml0UGFyYW1MaXN0ID0gCi0JCSAgICAoTGlzdCkgYU1vZGVsLmdldFByb3BlcnR5KElOSVRfUEFSQU0pOwotCQlpZiAoaW5pdFBhcmFtTGlzdCAhPSBudWxsKQotCQkJc2V0VXBJbml0UGFyYW1zKGluaXRQYXJhbUxpc3QsIGZpbHRlcik7Ci0KLQkJLy8gU2V0IHVwIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaWYgYW55Ci0JCSBMaXN0IGZpbHRlck1hcHBpbmdzTGlzdCA9IAotCQkgICAgIChMaXN0KSBhTW9kZWwuZ2V0UHJvcGVydHkoRklMVEVSX01BUFBJTkdTKTsKLQotICAgICAgICAgaWYgKGZpbHRlck1hcHBpbmdzTGlzdCAhPSBudWxsICYmICFmaWx0ZXJNYXBwaW5nc0xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgIHNldFVwTWFwcGluZ3MoZmlsdGVyTWFwcGluZ3NMaXN0LCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogY3JlYXRlIHRoZSBmaWx0ZXIgbW9kZWxlZCBvYmplY3QsIHRvIHNldCBhbnkgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4KLQkgKiB0aGUgZGF0YSBtb2RlbCwgYW5kIHRoZW4gdG8gYWRkIHRoZSBmaWx0ZXIgaW5zdGFuY2UgdG8gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBJdCB3aWxsCi0JICogbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2dlbmVyYXRlRmlsdGVyTWV0YURhdGEoTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwsCi0JICogICAgICBTdHJpbmcpCi0JICogQHNlZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkjY3JlYXRlRmlsdGVyKCkKLQkgKiBAc2VlIEZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIEZpbHRlciBpbnN0YW5jZQotCSAqLwotCS8qKgotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmlsdGVyKFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUpIHsKLQkJLy8gR2V0IHZhbHVlcyBmcm9tIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gCi0JCSAgICBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShESVNQTEFZX05BTUUpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAKLQkJICAgIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERFU0NSSVBUSU9OKTsKLQotCQkvLyBDcmVhdGUgdGhlIGZpbHRlciBpbnN0YW5jZSBhbmQgc2V0IHVwIHRoZSBwYXJhbWV0ZXJzIGZyb20gZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCUZpbHRlciBmaWx0ZXIgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcigpOwotCQkJZmlsdGVyLnNldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJZmlsdGVyLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCWZpbHRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQlmaWx0ZXIuc2V0RmlsdGVyQ2xhc3NOYW1lKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgZmlsdGVyIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCXdlYkFwcC5nZXRGaWx0ZXJzKCkuYWRkKGZpbHRlcik7Ci0JCQlyZXR1cm4gZmlsdGVyOwotCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgZmlsdGVyID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyKCk7Ci0JCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZU9iaiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICBkaXNwbGF5TmFtZU9iai5zZXRWYWx1ZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBmaWx0ZXIuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGRpc3BsYXlOYW1lT2JqKTsKLQkJCWZpbHRlci5zZXRGaWx0ZXJOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCWZpbHRlci5zZXRGaWx0ZXJDbGFzcyhxdWFsaWZpZWRDbGFzc05hbWUpOwotCQkJaWYgKHdlYkFwcCAhPSBudWxsKSB7Ci0JCQkJd2ViQXBwLmdldEZpbHRlcnMoKS5hZGQoZmlsdGVyKTsKLQkJCX0KLQkJCS8vIFNob3VsZCBiZSByZXR1cm4gRmlsdGVyJ3MgaW5zdGFuY2UKLQkJCXJldHVybiBmaWx0ZXI7Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBmaWx0ZXIgaW5zdGFuY2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFueQotCSAqIGluaXQgcGFyYW1zIGZvciB0aGUgbmV3IGZpbHRlciBtZXRhZGF0YS4gSXQgd2lsbCBub3QgYWNjZXB0IG51bGwKLQkgKiBwYXJhbWV0ZXJzLiBUaGUgaW5pdCBwYXJhbXMgYXJlIHNldCBvbiB0aGUgZmlsdGVyIG1vZGVsZWQgb2JqZWN0LgotCSAqIAotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2dlbmVyYXRlRmlsdGVyTWV0YURhdGEoTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwsCi0JICogICAgICBTdHJpbmcpCi0JICogQHNlZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkjY3JlYXRlSW5pdFBhcmFtKCkKLQkgKiAKLQkgKiBAcGFyYW0gaW5pdFBhcmFtTGlzdAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VXBJbml0UGFyYW1zKExpc3QgaW5pdFBhcmFtTGlzdCwgT2JqZWN0IGZpbHRlck9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJPYmo7Ci0KLQkJCS8vIElmIEoyRUUgMS40LCBhZGQgdGhlIHBhcmFtIHZhbHVlIGFuZCBkZXNjcmlwdGlvbiBpbmZvIGluc3RhbmNlcwotCQkJLy8gdG8gdGhlIGZpbHRlciBpbml0IHBhcmFtcwotCQkJaWYgKHdlYkFwcC5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpIHsKLQkJCQlmb3IgKGludCBpUCA9IDA7IGlQIDwgaW5pdFBhcmFtTGlzdC5zaXplKCk7IGlQKyspIHsKLQkJCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSAoU3RyaW5nW10pIGluaXRQYXJhbUxpc3QuZ2V0KGlQKTsKLQkJCQkJLy8gQ3JlYXRlIDEuNCBjb21tb24gcGFyYW0gdmFsdWUKLQkJCQkJSW5pdFBhcmFtIHBhcmFtID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1OYW1lKHN0cmluZ0FycmF5WzBdKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1WYWx1ZShzdHJpbmdBcnJheVsxXSk7Ci0JCQkJCXBhcmFtLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gU2V0IHRoZSBwYXJhbSB0byB0aGUgZmlsdGVyIG1vZGVsIGxpc3Qgb2YgaW5pdCBwYXJhbXMKLQkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQocGFyYW0pOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIEoyRUUgMS4yIG9yIDEuMywgdXNlIHRoZSBmaWx0ZXIgc3BlY2lmaWMgaW5pdCBwYXJhbSBpbnN0YW5jZXMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlQID0gMDsgaVAgPCBpbml0UGFyYW1MaXN0LnNpemUoKTsgaVArKykgewotCQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCQkvLyBDcmVhdGUgdGhlIHdlYiBpbml0IHBhcmFtCi0JCQkJCUluaXRQYXJhbSBpcCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQkJCS8vIFNldCB0aGUgcGFyYW0gbmFtZQotCQkJCQlpcC5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIHZhbHVlCi0JCQkJCWlwLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIGRlc2NyaXB0aW9uCi0JCQkJCWlwLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBpbml0IHBhcmFtIHRvIHRoZSBmaWx0ZXIgbW9kZWwgbGlzdCBvZiBwYXJhbXMKLQkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQoaXApOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpIGZpbHRlck9iajsKLQotCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7Ci0JCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSAoU3RyaW5nW10pIGluaXRQYXJhbUxpc3QuZ2V0KGlQKTsKLQkJCQkvLyBDcmVhdGUgMS40IGNvbW1vbiBwYXJhbSB2YWx1ZQotCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlIHBhcmFtID0gCi0JCQkJICAgIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCQlwYXJhbS5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCXBhcmFtLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gCi0JCQkJICAgIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoc3RyaW5nQXJyYXlbMl0pOwotCQkJCS8vIFNldCB0aGUgZGVzY3JpcHRpb24gb24gdGhlIHBhcmFtCi0JCQkJcGFyYW0uZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkJCQkvLyBBZGQgdGhlIHBhcmFtIHRvIHRoZSBmaWx0ZXIgbW9kZWwgbGlzdCBvZiBpbml0IHBhcmFtcwotCQkJCWZpbHRlci5nZXRJbml0UGFyYW1zKCkuYWRkKHBhcmFtKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0bwotCSAqIGNyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmcgbW9kZWxsZWQgb2JqZWN0cyBzbyB0aGUgbWV0YWRhdGEgZm9yIHRoZQotCSAqIGZpbHRlciBtYXBwaW5ncyBpcyBzdG9yZSBpbiB0aGUgd2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhpcyBtZXRob2QKLQkgKiB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBUaGUgZmlsdGVyIG1hcHBpbmdzIGFyZSBhZGRlZCB0byB0aGUKLQkgKiB3ZWIgYXBwbGljYXRpb24gbW9kZWxlZCBvYmplY3QuCi0JICogCi0JICogQHNlZSBBZGRGaWx0ZXJPcGVyYXRpb24jZ2VuZXJhdGVGaWx0ZXJNZXRhRGF0YShOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbCwKLQkgKiAgICAgIFN0cmluZykKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVGaWx0ZXJNYXBwaW5nKCkKLQkgKiAKLQkgKiBAcGFyYW0gdXJsTWFwcGluZ0xpc3QKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFVwTWFwcGluZ3MoTGlzdCBmaWx0ZXJNYXBwaW5nc0xpc3QsIE9iamVjdCBmaWx0ZXJPYmopIHsKLQkJLy8gR2V0IHRoZSB3ZWIgYXBwIG1vZGVsbGVkIG9iamVjdCBmcm9tIHRoZSBkYXRhIG1vZGVsCi0JCS8vIFdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmdzIGlmIGFueQotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJPYmo7Ci0JCQlpZiAoZmlsdGVyTWFwcGluZ3NMaXN0ICE9IG51bGwpIAotCQkJICAgIGZvciAoaW50IGlNID0gMDsgaU0gPCBmaWx0ZXJNYXBwaW5nc0xpc3Quc2l6ZSgpOyBpTSsrKSB7Ci0JCQkgICAgICAgIElGaWx0ZXJNYXBwaW5nSXRlbSBmaWx0ZXJNYXBwaW5nID0gKElGaWx0ZXJNYXBwaW5nSXRlbSkgZmlsdGVyTWFwcGluZ3NMaXN0LmdldChpTSk7Ci0JCQkgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmcgaW5zdGFuY2UgZnJvbSB0aGUgd2ViIGZhY3RvcnkKLQkJCSAgICAgICAgRmlsdGVyTWFwcGluZyBtYXBwaW5nID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0JCQkgICAgICAgIC8vIFNldCB0aGUgZmlsdGVyCi0JCQkgICAgICAgIG1hcHBpbmcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkgICAgICAgIGlmIChmaWx0ZXJNYXBwaW5nLmlzVXJsUGF0dGVyblR5cGUoKSkgewotCQkJICAgICAgICAgICAgLy8gU2V0IHRoZSBVUkwgcGF0dGVybiB0byBtYXAgdGhlIGZpbHRlciB0bwotCQkJICAgICAgICAgICAgbWFwcGluZy5zZXRVcmxQYXR0ZXJuKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJCSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgU2VydmxldCBOYW1lIHRvIG1hcCB0aGUgZmlsdGVyIHRvCi0JCQkgICAgICAgIAlTZXJ2bGV0IHNlcnZsZXQgPSB3ZWJBcHAuZ2V0U2VydmxldE5hbWVkKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCSAgICAgICAgfQotCQkJICAgICAgICAvL1NldCBkaXNwYXRjaGVyIG9wdGlvbnMgZm9yIHRoZSBmaWx0ZXIgbWFwcGluZyBpZiBhbnkuCi0JCQkgICAgICAgIGludCBkaXNwYXRjaGVycyA9IGZpbHRlck1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKTsKLQkJCSAgICAgICAgRUxpc3QgZGlzcGF0Y2hlclR5cGVzID0gbWFwcGluZy5nZXREaXNwYXRjaGVyVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLlJFUVVFU1QpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlclR5cGVzLmFkZChEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRk9SV0FSRCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyVHlwZXMuYWRkKERpc3BhdGNoZXJUeXBlLkZPUldBUkRfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlcy5hZGQoRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkVSUk9SKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlcy5hZGQoRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgLy8gQWRkIHRoZSBmaWx0ZXIgbWFwcGluZyB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsbGVkIGxpc3QKLQkJCSAgICAgICAgd2ViQXBwLmdldEZpbHRlck1hcHBpbmdzKCkuYWRkKG1hcHBpbmcpOwotCQkJICAgIH0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpIGZpbHRlck9iajsKLQotCQkgICAgLy8gQ3JlYXRlIHRoZSBmaWx0ZXIgbWFwcGluZyBpbnN0YW5jZSBmcm9tIHRoZSB3ZWIgZmFjdG9yeQotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyBtYXBwaW5nID0gbnVsbDsKLQkJCS8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmdzIGlmIGFueQotCQkJaWYgKGZpbHRlck1hcHBpbmdzTGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJNYXBwaW5nc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgbWFwcGluZyA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQkgICAgICAgICAgICAgICAgbWFwcGluZy5zZXRGaWx0ZXJOYW1lKGZpbHRlci5nZXRGaWx0ZXJOYW1lKCkpOwotCSAgICAgICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZyA9IChJRmlsdGVyTWFwcGluZ0l0ZW0pIGZpbHRlck1hcHBpbmdzTGlzdC5nZXQoaSk7Ci0JICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXBwaW5nLmdldE1hcHBpbmdUeXBlKCkgPT0gSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOKSB7Ci0JICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIFVSTCBwYXR0ZXJuIHRvIG1hcCB0aGUgZmlsdGVyIHRvCi0JICAgICAgICAgICAgICAgICAgICBVcmxQYXR0ZXJuVHlwZSB1cmwgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotCSAgICAgICAgICAgICAgICAgICAgdXJsLnNldFZhbHVlKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLQkgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0U2VydmxldE5hbWVzKCkuYWRkKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkgICAgICAgICAgICAgICAgfQotICAJCQkgICAgICAgIC8vU2V0IGRpc3BhdGNoZXIgb3B0aW9ucyBmb3IgdGhlIGZpbHRlciBtYXBwaW5nIGlmIGFueS4JCi0gICAgICAgICAgICAgICAgICAgIGludCBkaXNwYXRjaGVycyA9IGZpbHRlck1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5SRVFVRVNUKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKS5hZGQob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUuUkVRVUVTVF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5nZXREaXNwYXRjaGVycygpLmFkZChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uSU5DTFVERSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCkuYWRkKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5FUlJPUikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCkuYWRkKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlLkVSUk9SX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZmlsdGVyIG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbCBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRGaWx0ZXJNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRMaXN0ZW5lck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjgxYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLk5ld0phdmFFRUFydGlmYWN0Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MsIEFkZExpc3RlbmVyT3BlcmF0aW9uIGlzIGEgSURhdGFNb2RlbE9wZXJhdGlvbiBmb2xsb3dpbmcgdGhlIElEYXRhTW9kZWwgd2l6YXJkIGFuZAotICogb3BlcmF0aW9uIGZyYW1ld29yay4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHN1YmNsYXNzZXMgdGhlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uIHNvIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogbW9kZWxzIGFyZSBzYXZlZCB0byB0aGUgYXJ0aWZhY3QgZWRpdCBtb2RlbC4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBJdCBpcyB0aGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgbmV3IGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciB0bwotICogYSB3ZWIgYXBwLCB3aGV0aGVyIHRoYXQgYmUgYW4gYW5ub3RhdGVkIGxpc3RlbmVyIG9yIGEgbm9uIGFubm90YXRlZCBsaXN0ZW5lci4gIFRoaXMgdXNlcyB0aGUKLSAqIE5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzIHNldCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGN1c3RvbQotICogbGlzdGVuZXIgY2xhc3MuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJbiB0aGUgbm9uIGFubm90YXRlZCBjYXNlLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9yLiBJbiB0aGUgYW5ub3RhdGVkIGNhc2UsIGl0IHdpbGwgbm90LCBpdCB3aWxsIGxlYXZlIHRoaXMgdXAgdG8gdGhlIHBhcnNpbmcgb2YgdGhlCi0gKiBhbm5vdGF0aW9ucyB0byBidWlsZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFydGlmYWN0cy4gVG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBqYXZhIGNsYXNzIGZvcgotICogdGhlIGxpc3RlbmVyLCB0aGUgb3BlcmF0aW9uIHVzZXMgdGhlIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24uIFRoZSBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uIAotICogc2hhcmVzIHRoZSBzYW1lIGRhdGEgbW9kZWwgcHJvdmlkZXIuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBvcGVyYXRpb24gdG8gcHJvdmlkZSB0aGVpciBvd24gYmVoYXZpb3Igb24gbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBleGVjdXRlCi0gKiBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIHRvIGRvIHNvLiBBbHNvLCBnZW5lcmF0ZUxpc3RlbmVyTWV0YURhdGEgYW5kIGNyZXRlTGlzdGVuZXJDbGFzcyBhcmUgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlzdGVuZXJPcGVyYXRpb24gZXh0ZW5kcyBBZGRXZWJDbGFzc09wZXJhdGlvbiB7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3Igd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEl0IHdpbGwgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24jQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oSURhdGFNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsIAotCSAqIEByZXR1cm4gQWRkTGlzdGVuZXJPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWRkTGlzdGVuZXJPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBnZXROZXdDbGFzc09wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBnZW5lcmF0aW9uIHN0ZXBzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlCi0JICogbWV0YWRhdGEgZm9yIHRoZSB3ZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBKMkVFIG1vZGVscyB0byBjcmVhdGUKLQkgKiB0aGUgTGlzdGVuZXIgbW9kZWwgaW5zdGFuY2UuIEl0IHRoZW4gYWRkcyB0aGVzZSB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGlzIHdpbGwgdGhlbiBiZSAKLQkgKiB3cml0dGVuIG91dCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogQHNlZSBMaXN0ZW5lcgotCSAqIEBzZWUgQWRkTGlzdGVuZXJPcGVyYXRpb24jY3JlYXRlTGlzdGVuZXIoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBhTW9kZWwKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShJRGF0YU1vZGVsIGFNb2RlbCwgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQkvLyBTZXQgdXAgdGhlIGxpc3RlbmVyIG1vZGVsZWQgb2JqZWN0Ci0JCWNyZWF0ZUxpc3RlbmVyKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdGVuZXIKLQkgKiBtb2RlbGVkIG9iamVjdCwgdG8gc2V0IGFueSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBtb2RlbCwgYW5kIHRoZW4gdG8gYWRkIHRoZQotCSAqIGxpc3RlbmVyIGluc3RhbmNlIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBBZGRMaXN0ZW5lck9wZXJhdGlvbiNnZW5lcmF0ZUxpc3RlbmVyTWV0YURhdGEoSURhdGFNb2RlbCwgU3RyaW5nKQotCSAqIEBzZWUgQ29tbW9uRmFjdG9yeSNjcmVhdGVMaXN0ZW5lcigpCi0JICogQHNlZSBMaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIExpc3RlbmVyIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlTGlzdGVuZXIoU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgKXsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKTsKLQkJCWxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3NOYW1lKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgbGlzdGVuZXIgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbGlzdGVuZXI7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgKXsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciBsaXN0ZW5lciA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCk7Ci0JCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgbGlzdGVuZXIgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7CQotCQkJcmV0dXJuIGxpc3RlbmVyOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkU2VydmxldE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1YzZjOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JU19TRVJWTEVUX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVSTF9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNDUklQVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgQWRkU2VydmxldCBPcGVyYXRpb24gaXMgYSBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUgSURhdGFNb2RlbCB3aXphcmQgYW5kCi0gKiBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhpcyBvcGVyYXRpb24gc3ViY2xhc3NlcyB0aGUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gc28gdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiBtb2RlbHMgYXJlIHNhdmVkIHRvIHRoZSBhcnRpZmFjdCBlZGl0IG1vZGVsLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIEl0IGlzIHRoZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgc2VydmxldCB0bwotICogYSB3ZWIgYXBwLCB3aGV0aGVyIHRoYXQgYmUgYW4gYW5ub3RhdGVkIHNlcnZsZXQgb3IgYSBub24gYW5ub3RhdGVkIHNlcnZsZXQuICBUaGlzIHVzZXMgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzIHNldCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGN1c3RvbQotICogc2VydmV0LgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJbiB0aGUgbm9uIGFubm90YXRlZCBjYXNlLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9yLiAgSW4gdGhlIGFubm90YXRlZCBjYXNlLCBpdCB3aWxsIG5vdCwgaXQgd2lsbCBsZWF2ZSB0aGlzIHVwIHRvIHRoZSBwYXJzaW5nIG9mIHRoZQotICogYW5ub3RhdGlvbnMgdG8gYnVpbGQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcnRpZmFjdHMuICBUbyBhY3R1YWxseSBjcmVhdGUgdGhlIGphdmEgY2xhc3MgZm9yCi0gKiB0aGUgc2VydmxldCwgdGhlIG9wZXJhdGlvbiB1c2VzIHRoZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uIFRoZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24gCi0gKiBzaGFyZXMgdGhlIHNhbWUgZGF0YSBtb2RlbCBwcm92aWRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzT3BlcmF0aW9uCi0gKiAKLSAqIENsaWVudHMgbWF5IHN1YmNsYXNzIHRoaXMgb3BlcmF0aW9uIHRvIHByb3ZpZGUgdGhlaXIgb3duIGJlaGF2aW91ciBvbiBzZXJ2bGV0IGNyZWF0aW9uLiAgVGhlIGV4ZWN1dGUKLSAqIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sIGdlbmVyYXRlU2VydmxldE1ldGFEYXRhIGFuZCBjcmV0ZVNlcnZsZXRDbGFzcyBhcmUgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkU2VydmxldE9wZXJhdGlvbiBleHRlbmRzIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBvcGVyYXRpb24uCi0JICogSXQgd2lsbCBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVyLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwgCi0JICogQHJldHVybiBBZGRTZXJ2bGV0T3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFkZFNlcnZsZXRPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBnZXROZXdDbGFzc09wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24oZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU1ldGFEYXRhKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUpIHsKLQkJYm9vbGVhbiBpc1NlcnZsZXRUeXBlID0gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElTX1NFUlZMRVRfVFlQRSk7Ci0JCWdlbmVyYXRlTWV0YURhdGEobW9kZWwsIHF1YWxpZmllZENsYXNzTmFtZSwgaXNTZXJ2bGV0VHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGdlbmVyYXRpb24gc3RlcHMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUKLQkgKiBtZXRhZGF0YSBmb3IgdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIEoyRUUgbW9kZWxzIHRvIGNyZWF0ZQotCSAqIHRoZSBTZXJ2bGV0IG1vZGVsIGluc3RhbmNlLCBhbnkgaW5pdCBwYXJhbXMgc3BlY2lmaWVkLCBhbmQgYW55IHNlcnZsZXQgbWFwcGluZ3MuICBJdCB0aGVuIGFkZHMgCi0JICogdGhlc2UgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbC4gIFRoaXMgd2lsbCB0aGVuIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiBmaWxlLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4KLQkgKiBAc2VlIFNlcnZsZXQKLQkgKiBAc2VlIEFkZFNlcnZsZXRPcGVyYXRpb24jY3JlYXRlU2VydmxldChTdHJpbmcsIGJvb2xlYW4pCi0JICogQHNlZSBBZGRTZXJ2bGV0T3BlcmF0aW9uI3NldFVwSW5pdFBhcmFtcyhMaXN0LCBTZXJ2bGV0KQotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNzZXRVcFVSTE1hcHBpbmdzKExpc3QsIFNlcnZsZXQpCi0JICogCi0JICogQHBhcmFtIGFNb2RlbAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcGFyYW0gaXNTZXJ2bGV0VHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTWV0YURhdGEoSURhdGFNb2RlbCBhTW9kZWwsIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUsIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSkgewotCQkvLyBTZXQgdXAgdGhlIHNlcnZsZXQgbW9kZWxsZWQgb2JqZWN0Ci0JCU9iamVjdCBzZXJ2bGV0ID0gY3JlYXRlU2VydmxldChxdWFsaWZpZWRDbGFzc05hbWUsIGlzU2VydmxldFR5cGUpOwotCi0JCS8vIFNldCB1cCB0aGUgSW5pdFBhcmFtcyBpZiBhbnkKLQkJTGlzdCBpbml0UGFyYW1MaXN0ID0gKExpc3QpIGFNb2RlbC5nZXRQcm9wZXJ0eShJTklUX1BBUkFNKTsKLQkJaWYgKGluaXRQYXJhbUxpc3QgIT0gbnVsbCkKLQkJCXNldFVwSW5pdFBhcmFtcyhpbml0UGFyYW1MaXN0LCBzZXJ2bGV0KTsKLQkJCi0JCS8vIFNldCB1cCB0aGUgc2VydmxldCBVUkwgbWFwcGluZ3MgaWYgYW55Ci0JCUxpc3QgdXJsTWFwcGluZ0xpc3QgPSAoTGlzdCkgYU1vZGVsLmdldFByb3BlcnR5KFVSTF9NQVBQSU5HUyk7Ci0JCWlmICh1cmxNYXBwaW5nTGlzdCAhPSBudWxsKQotCQkJc2V0VXBVUkxNYXBwaW5ncyh1cmxNYXBwaW5nTGlzdCwgc2VydmxldCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHNlcnZsZXQKLQkgKiBtb2RlbGxlZCBvYmplY3QsIHRvIHNldCBhbnkgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCB0aGVuIHRvIGFkZCB0aGUKLQkgKiBzZXJ2bGV0IGluc3RhbmNlIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NwZXQgbnVsbCBwYXJhbWV0ZXJzLgotCSAqIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNnZW5lcmF0ZVNlcnZsZXRNZXRhRGF0YShOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2bGV0KCkKLQkgKiBAc2VlIFNlcnZsZXQKLQkgKiAKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICogQHBhcmFtIGlzU2VydmxldFR5cGUKLQkgKiBAcmV0dXJuIFNlcnZsZXQgaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVTZXJ2bGV0KFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUsIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSkgewotCQkvLyBHZXQgdmFsdWVzIGZyb20gZGF0YSBtb2RlbAotCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShESVNQTEFZX05BTUUpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERVNDUklQVElPTik7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIHNlcnZsZXQgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0JCQotCQkJU2VydmxldCBzZXJ2bGV0ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQlzZXJ2bGV0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCXNlcnZsZXQuc2V0U2VydmxldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJc2VydmxldC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCQlpZiAoaXNTZXJ2bGV0VHlwZSkgewotCQkJCVNlcnZsZXRUeXBlIHNlcnZsZXRUeXBlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQkJCXNlcnZsZXRUeXBlLnNldENsYXNzTmFtZShxdWFsaWZpZWRDbGFzc05hbWUpOwotCQkJCXNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQl9IAotCQkJLy8gSGFuZGxlIEpTUCBjYXNlCi0JCQllbHNlIHsKLQkJCQlKU1BUeXBlIGpzcFR5cGUgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpTUFR5cGUoKTsKLQkJCQlqc3BUeXBlLnNldEpzcEZpbGUocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCQlzZXJ2bGV0LnNldFdlYlR5cGUoanNwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBBZGQgdGhlIHNlcnZsZXQgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJCi0JCQkvL1dlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwotCQkJcmV0dXJuIHNlcnZsZXQ7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLQkJCQotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpOwotCi0JCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZU9iaiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQlkaXNwbGF5TmFtZU9iai5zZXRWYWx1ZShkaXNwbGF5TmFtZSk7Ci0JCQlzZXJ2bGV0LmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZU9iaik7Ci0JCQkKLQkJCXNlcnZsZXQuc2V0U2VydmxldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJCi0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJc2VydmxldC5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkJCi0JCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCQlpZiAoaXNTZXJ2bGV0VHlwZSkgewotCQkJCXNlcnZsZXQuc2V0U2VydmxldENsYXNzKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0JCQl9IAotCQkJLy8gSGFuZGxlIEpTUCBjYXNlCi0JCQllbHNlIHsKLQkJCQlzZXJ2bGV0LnNldEpzcEZpbGUocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCX0KLQkJCS8vIEFkZCB0aGUgc2VydmxldCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsCi0JCQkKLQkJCS8vV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7Ci0JCQl3ZWJBcHAuZ2V0U2VydmxldHMoKS5hZGQoc2VydmxldCk7CQotCQkJcmV0dXJuIHNlcnZsZXQ7Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBzZXJ2bGV0IGluc3RhbmNlCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFueSBpbml0IHBhcmFtcwotCSAqIGZvciB0aGUgbmV3IHNlcnZsZXQgbWV0YWRhdGEuICBJdCB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgVGhlIGluaXQgcGFyYW1zIGFyZQotCSAqIHNldCBvbiB0aGUgc2VydmxldCBtb2RlbGxlZCBvYmplY3QuCi0JICogQHNlZSBBZGRTZXJ2bGV0T3BlcmF0aW9uI2dlbmVyYXRlU2VydmxldE1ldGFEYXRhKE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbCwgU3RyaW5nLCBib29sZWFuKQotCSAqIEBzZWUgV2ViYXBwbGljYXRpb25GYWN0b3J5I2NyZWF0ZUluaXRQYXJhbSgpCi0JICogCi0JICogQHBhcmFtIGluaXRQYXJhbUxpc3QKLQkgKiBAcGFyYW0gc2VydmxldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRVcEluaXRQYXJhbXMoTGlzdCBpbml0UGFyYW1MaXN0LCBPYmplY3Qgc2VydmxldE9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCQkJCi0JCQkvLyBJZiBKMkVFIDEuNCwgYWRkIHRoZSBwYXJhbSB2YWx1ZSBhbmQgZGVzY3JpcHRpb24gaW5mbyBpbnN0YW5jZXMgdG8gdGhlIHNlcnZsZXQgaW5pdCBwYXJhbXMKLQkJCWlmICh3ZWJBcHAuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSB7Ci0JCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSBpbml0UGFyYW1MaXN0LmdldChpUCk7Ci0JCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIHBhcmFtIHZhbHVlCi0JCQkJCVBhcmFtVmFsdWUgcGFyYW0gPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0JCQkJCXBhcmFtLnNldE5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQlwYXJhbS5zZXRWYWx1ZShzdHJpbmdBcnJheVsxXSk7Ci0JCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIGRlc2NyaXB0b24gdmFsdWUKLQkJCQkJRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShzdHJpbmdBcnJheVsyXSk7Ci0JCQkJCS8vIFNldCB0aGUgZGVzY3JpcHRpb24gb24gdGhlIHBhcmFtCi0JCQkJCXBhcmFtLmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCQkJCXBhcmFtLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBwYXJhbSB0byB0aGUgc2VydmxldCBtb2RlbCBsaXN0IG9mIGluaXQgcGFyYW1zCi0JCQkJCXNlcnZsZXQuZ2V0SW5pdFBhcmFtcygpLmFkZChwYXJhbSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgSjJFRSAxLjIgb3IgMS4zLCB1c2UgdGhlIHNlcnZsZXQgc3BlY2lmaWMgaW5pdCBwYXJhbSBpbnN0YW5jZXMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlQID0gMDsgaVAgPCBpbml0UGFyYW1MaXN0LnNpemUoKTsgaVArKykgewotCQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCQkvLyBDcmVhdGUgdGhlIHdlYiBpbml0IHBhcmFtCi0JCQkJCUluaXRQYXJhbSBpcCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQkJCS8vIFNldCB0aGUgcGFyYW0gbmFtZQotCQkJCQlpcC5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIHZhbHVlCi0JCQkJCWlwLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIGRlc2NyaXB0aW9uCi0JCQkJCWlwLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBpbml0IHBhcmFtIHRvIHRoZSBzZXJ2bGV0IG1vZGVsIGxpc3Qgb2YgcGFyYW1zCi0JCQkJCXNlcnZsZXQuZ2V0UGFyYW1zKCkuYWRkKGlwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCi0JCQlmb3IgKGludCBpUCA9IDA7IGlQIDwgaW5pdFBhcmFtTGlzdC5zaXplKCk7IGlQKyspIHsKLQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIHBhcmFtIHZhbHVlCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUgcGFyYW09IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCQlwYXJhbS5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCXBhcmFtLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShzdHJpbmdBcnJheVsyXSk7Ci0JCQkJLy8gU2V0IHRoZSBkZXNjcmlwdGlvbiBvbiB0aGUgcGFyYW0KLQkJCQlwYXJhbS5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkJCS8vIEFkZCB0aGUgcGFyYW0gdG8gdGhlIHNlcnZsZXQgbW9kZWwgbGlzdCBvZiBpbml0IHBhcmFtcwotCQkJCXNlcnZsZXQuZ2V0SW5pdFBhcmFtcygpLmFkZChwYXJhbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHNlcnZsZXQKLQkgKiBtYXBwaW5nIG1vZGVsbGVkIG9iamVjdHMgc28gdGhlIG1ldGFkYXRhIGZvciB0aGUgc2VydmxldCBtYXBwaW5ncyBpcyBzdG9yZSBpbiB0aGUgd2ViCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhpcyBtZXRob2Qgd2lsbCBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gIFRoZSBzZXJ2bGV0IG1hcHBpbmdzCi0JICogYXJlIGFkZGVkIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWxsZWQgb2JqZWN0LgotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNnZW5lcmF0ZVNlcnZsZXRNZXRhRGF0YShOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2bGV0TWFwcGluZygpCi0JICogCi0JICogQHBhcmFtIHVybE1hcHBpbmdMaXN0Ci0JICogQHBhcmFtIHNlcnZsZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VXBVUkxNYXBwaW5ncyhMaXN0IHVybE1hcHBpbmdMaXN0LCBPYmplY3Qgc2VydmxldE9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgbW9kZWxsZWQgb2JqZWN0IGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJLy9XZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIHNlcnZsZXQgbWFwcGluZ3MgaWYgYW55Ci0JCWlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgewkKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCQkJZm9yIChpbnQgaU0gPSAwOyBpTSA8IHVybE1hcHBpbmdMaXN0LnNpemUoKTsgaU0rKykgewotCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSB1cmxNYXBwaW5nTGlzdC5nZXQoaU0pOwotCQkJCS8vIENyZWF0ZSB0aGUgc2VydmxldCBtYXBwaW5nIGluc3RhbmNlIGZyb20gdGhlIHdlYiBmYWN0b3J5Ci0JCQkJU2VydmxldE1hcHBpbmcgbWFwcGluZyA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQkJCQkvLyBTZXQgdGhlIHNlcnZsZXQgYW5kIHNlcnZsZXQgbmFtZQotCQkJCW1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCQltYXBwaW5nLnNldE5hbWUoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQkvLyBTZXQgdGhlIFVSTCBwYXR0ZXJuIHRvIG1hcCB0aGUgc2VydmxldCB0bwotCQkJCW1hcHBpbmcuc2V0VXJsUGF0dGVybihzdHJpbmdBcnJheVswXSk7Ci0JCQkJLy8gQWRkIHRoZSBzZXJ2bGV0IG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbGxlZCBsaXN0Ci0JCQkJd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQpIHNlcnZsZXRPYmo7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0aGUgc2VydmxldCBtYXBwaW5ncyBpZiBhbnkKLQkJCWlmICh1cmxNYXBwaW5nTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBzZXJ2bGV0IG1hcHBpbmcgaW5zdGFuY2UgZnJvbSB0aGUgd2ViIGZhY3RvcnkKLQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBtYXBwaW5nID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQotCQkJCW1hcHBpbmcuc2V0U2VydmxldE5hbWUoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVybE1hcHBpbmdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSB1cmxNYXBwaW5nTGlzdC5nZXQoaSk7Ci0JCQkJCS8vIFNldCB0aGUgVVJMIHBhdHRlcm4gdG8gbWFwIHRoZSBzZXJ2bGV0IHRvCi0JCQkJCVVybFBhdHRlcm5UeXBlIHVybCA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0JCQkJCXVybC5zZXRWYWx1ZShzdHJpbmdBcnJheVswXSk7Ci0JCQkJCW1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLQkJCQl9Ci0JCQkJLy8gQWRkIHRoZSBzZXJ2bGV0IG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbCBsaXN0Ci0JCQkJd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFdlYkNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkV2ViQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3MGYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkV2ViQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5BZGRKYXZhRUVBcnRpZmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRXZWJDbGFzc09wZXJhdGlvbiBleHRlbmRzIEFkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uIHsKLQkKLQlwdWJsaWMgQWRkV2ViQ2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBhY3Rpb25zIGR1cmluZwotCSAqIGV4ZWN1dGlvbi4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGVjdXRlIG1ldGhvZCBkcml2ZXMgdGhlIHJ1bm5pbmcgb2YKLQkgKiB0aGUgb3BlcmF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIHRoZSBmaWx0ZXIgY2xhc3MsIGFuZAotCSAqIHRoZW4gaXQgd2lsbCBjcmVhdGUgdGhlIGZpbHRlciBtZXRhZGF0YSBmb3IgdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IG51bGwgYXMgYSBwYXJhbWV0ZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2NyZWF0ZUZpbHRlckNsYXNzKCkKLQkgKiBAc2VlIEFkZEZpbHRlck9wZXJhdGlvbiNnZW5lcmF0ZUZpbHRlck1ldGFEYXRhKE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsLAotCSAqICAgICAgU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIElBZGFwdGFibGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCSAgICBib29sZWFuIHVzZUV4aXN0aW5nID0gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9FWElTVElOR19DTEFTUyk7Ci0JCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsKLQotCQkvLyBjcmVhdGUgdGhlIGphdmEgY2xhc3MKLQkJaWYgKCF1c2VFeGlzdGluZykgCi0JCQlxdWFsaWZpZWRDbGFzc05hbWUgPSBjcmVhdGVDbGFzcygpOwotCi0JCS8vIElmIHRoZSBmaWx0ZXIgaXMgbm90IGFubm90YXRlZCwgZ2VuZXJhdGUgdGhlIGZpbHRlciBtZXRhZGF0YSBmb3IgdGhlIERECi0JCWlmICghbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUykpCi0JCXsKLQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoR0VORVJBVEVfREQpKQotCQkJewotCQkJCUlEYXRhTW9kZWwgZGRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKElXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzKTsKLQkJCQlkZE1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNULCBnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJCWRkTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQl9Ci0JCQlnZW5lcmF0ZU1ldGFEYXRhKG1vZGVsLCBxdWFsaWZpZWRDbGFzc05hbWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZU1ldGFEYXRhKElEYXRhTW9kZWwgYU1vZGVsLCBTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjNmYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNUUk9ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5GSUxURVJfTUFQUElOR1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuREVTVFJPWV9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5ET19GSUxURVJfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRklMVEVSX0lOSVRfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0lOSVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfRklMVEVSX0NIQUlOOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUl9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSU9fRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFU1BPTlNFOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMjsKLQotCXB1YmxpYyBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW1wb3J0cygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBzdXBlci5nZXRJbXBvcnRzKCk7Ci0JCQotCQlpZiAoc2hvdWxkR2VuSW5pdCgpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfRklMVEVSX0NPTkZJRyk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuRG9GaWx0ZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVCk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfRklMVEVSX0NIQUlOKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9JT19FWENFUFRJT04pOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoQ0xBU1NfTkFNRSkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkluaXQoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfSU5JVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9GaWx0ZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fRklMVEVSKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5EZXN0cm95KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RFU1RST1kpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZ1tdPiBnZXRJbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJTklUX1BBUkFNKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbShpbnQgaW5kZXgsIGludCB0eXBlKSB7Ci0JCUxpc3Q8U3RyaW5nW10+IHBhcmFtcyA9IGdldEluaXRQYXJhbXMoKTsKLQkJaWYgKGluZGV4IDwgcGFyYW1zLnNpemUoKSkgewotCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBwYXJhbXMuZ2V0KGluZGV4KTsKLQkJCXJldHVybiBzdHJpbmdBcnJheVt0eXBlXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJRmlsdGVyTWFwcGluZ0l0ZW0+IGdldEZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKExpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPikgZGF0YU1vZGVsLmdldFByb3BlcnR5KEZJTFRFUl9NQVBQSU5HUyk7Ci0JfQotCi0JcHVibGljIElGaWx0ZXJNYXBwaW5nSXRlbSBnZXRGaWx0ZXJNYXBwaW5nKGludCBpbmRleCkgewotCQlMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gbWFwcGluZ3MgPSBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQlpZiAoaW5kZXggPCBtYXBwaW5ncy5zaXplKCkpIHsKLQkJICAgIHJldHVybiBtYXBwaW5ncy5nZXQoaW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpc3BhdGNoZXJMaXN0KElGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlpbnQgZGlzcGF0Y2hlcnMgPSBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCk7Ci0JCWlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uUkVRVUVTVCkgPiAwKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFKSA+IDApIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTC5nZXRMaXRlcmFsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRVJST1IpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTC5nZXRMaXRlcmFsKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAlidWlsZGVyLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJCWJ1aWxkZXIuYXBwZW5kKCIsIik7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLQkJCi0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUykpIHsKLQkJCWlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfSU5JVCkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSU5JVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fRklMVEVSKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19GSUxURVIpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RFU1RST1kpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERFU1RST1kpOwotCQl9CQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2Q+IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZD4gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBzdXBlci5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpOwotCQlJdGVyYXRvcjxNZXRob2Q+IGl0ZXJhdG9yID0gdW5pbXBsZW1lbnRlZE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKE1FVEhPRF9JTklULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBGSUxURVJfSU5JVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8IAotCQkJCQkoTUVUSE9EX0RFU1RST1kuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIERFU1RST1lfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fAotCQkJCQkoTUVUSE9EX0RPX0ZJTFRFUi5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fRklMVEVSX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNkZDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0VWRU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKLQkJCi0JCWlmIChpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dExpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVCk7Ci0JCX0KLQkJCi0JCWlmIChpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uTGlzdGVuZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BVFRSSUJVVEVfTElTVEVORVIpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfRVZFTlQpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGVtZW50U2VydmxldFJlcXVlc3RMaXN0ZW5lcigpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0xJU1RFTkVSKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlQpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGVtZW50U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcigpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dExpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW1wbGVtZW50SHR0cFNlc3Npb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGltcGxlbWVudEludGVyZmFjZShRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW1wbGVtZW50SHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGltcGxlbWVudEludGVyZmFjZShRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbnRlcmZhY2UoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbnRlcmZhY2UoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfTElTVEVORVIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50SW50ZXJmYWNlKFN0cmluZyBpZmFjZSkgewotCQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IGdldFF1YWxpZmllZEludGVyZmFjZXMoKTsKLQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGludGVyZmFjZXMuY29udGFpbnMoaWZhY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGQ0OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLaXJpbCBNaXRvdiwgay5taXRvdkBzYXAuY29tCS0gYnVnIDIwNDE2MAotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0RFTEVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fR0VUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19IRUFEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19PUFRJT05TOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QT1NUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QVVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1RSQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRVRfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0lORk87Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVSTF9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRFU1RST1lfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRE9fREVMRVRFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX0dFVF9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5ET19IRUFEX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX1BPU1RfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRE9fUFVUX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX1RSQUNFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkdFVF9TRVJWTEVUX0NPTkZJR19TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5HRVRfU0VSVkxFVF9JTkZPX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkhUVFBfU0VSVklDRV9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfREVTVFJPWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19ERUxFVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fR0VUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RPX0hFQUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fT1BUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19QT1NUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RPX1BVVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19UUkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfR0VUX1NFUlZMRVRfSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9JTklUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfVE9fU1RSSU5HOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9JT19FWENFUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVTUE9OU0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5TRVJWSUNFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlNFUlZMRVRfSU5JVF9TSUdOQVRVUkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwgZXh0ZW5kcyBDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMjsKLQkKLQlwdWJsaWMgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKLQkJCi0JCWlmIChzaG91bGRHZW5Jbml0KCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTkZJRyk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9DT05GSUcpOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuU2VydmljZSgpKSB7Ci0JCQlpZiAoaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFUlZMRVRfUkVRVUVTVCk7Ci0JCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1QpOwotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCQotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9JT19FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuRG9HZXQoKSB8fCBzaG91bGRHZW5Eb1Bvc3QoKSB8fCBzaG91bGRHZW5Eb1B1dCgpIHx8IAotCQkJCXNob3VsZEdlbkRvRGVsZXRlKCkgfHwgc2hvdWxkR2VuRG9IZWFkKCkgfHwgCi0JCQkJc2hvdWxkR2VuRG9PcHRpb25zKCkgfHwgc2hvdWxkR2VuRG9UcmFjZSgpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVJWTEVUX1JFUVVFU1QpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0lPX0VYQ0VQVElPTik7Ci0JCX0KLQkJCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXREaXNwbGF5TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDbGFzc05hbWUoKX0gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIHBvc3QgV1RQCi0JICogICAgICAgICAgICAgMy4wLgotCSAqIAotCSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsI2dldENsYXNzTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuSW5pdCgpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9JTklUKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5EZXN0cm95KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RFU1RST1kpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkdldFNlcnZsZXRDb25maWcoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfR0VUX1NFUlZMRVRfQ09ORklHKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5HZXRTZXJ2bGV0SW5mbygpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9HRVRfU0VSVkxFVF9JTkZPKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5TZXJ2aWNlKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX1NFUlZJQ0UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvR2V0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX0dFVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9Qb3N0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX1BPU1QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvUHV0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX1BVVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9EZWxldGUoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fREVMRVRFKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5Eb0hlYWQoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fSEVBRCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9PcHRpb25zKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX09QVElPTlMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvVHJhY2UoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fVFJBQ0UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5Ub1N0cmluZygpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9UT19TVFJJTkcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhkYXRhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmdbXT4gZ2V0SW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSU5JVF9QQVJBTSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW0oaW50IGluZGV4LCBpbnQgdHlwZSkgewotCQlMaXN0PFN0cmluZ1tdPiBwYXJhbXMgPSBnZXRJbml0UGFyYW1zKCk7Ci0JCWlmIChpbmRleCA8IHBhcmFtcy5zaXplKCkpIHsKLQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gcGFyYW1zLmdldChpbmRleCk7Ci0JCQlyZXR1cm4gc3RyaW5nQXJyYXlbdHlwZV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nW10+IGdldFNlcnZsZXRNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoVVJMX01BUFBJTkdTKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nKGludCBpbmRleCkgewotCQlMaXN0PFN0cmluZ1tdPiBtYXBwaW5ncyA9IGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQlpZiAoaW5kZXggPCBtYXBwaW5ncy5zaXplKCkpIHsKLQkJCVN0cmluZ1tdIG1hcCA9IG1hcHBpbmdzLmdldChpbmRleCk7Ci0JCQlyZXR1cm4gbWFwWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldERlc2NyaXB0aW9uKCl9IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBwb3N0Ci0JICogICAgICAgICAgICAgV1RQIDMuMC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEFCU1RSQUNUX01FVEhPRFMpKSB7Ci0JCQlpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0lOSVQpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElOSVQpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RFU1RST1kpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERFU1RST1kpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0dFVF9TRVJWTEVUX0NPTkZJRykpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoR0VUX1NFUlZMRVRfQ09ORklHKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9HRVRfU0VSVkxFVF9JTkZPKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShHRVRfU0VSVkxFVF9JTkZPKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9TRVJWSUNFKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShTRVJWSUNFKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19HRVQpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERPX0dFVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fUE9TVCkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fUE9TVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fUFVUKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19QVVQpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RPX0RFTEVURSkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fREVMRVRFKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19IRUFEKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19IRUFEKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19PUFRJT05TKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19PUFRJT05TKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19UUkFDRSkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fVFJBQ0UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2Q+IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZD4gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBzdXBlci5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpOwotCQlJdGVyYXRvcjxNZXRob2Q+IGl0ZXJhdG9yID0gdW5pbXBsZW1lbnRlZE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKE1FVEhPRF9JTklULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBTRVJWTEVUX0lOSVRfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fCAKLQkJCQkJKE1FVEhPRF9ERVNUUk9ZLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBERVNUUk9ZX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUcuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIEdFVF9TRVJWTEVUX0NPTkZJR19TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfR0VUX1NFUlZMRVRfSU5GTy5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgR0VUX1NFUlZMRVRfSU5GT19TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfU0VSVklDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgU0VSVklDRV9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfU0VSVklDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgSFRUUF9TRVJWSUNFX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19HRVQuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIERPX0dFVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfRE9fUE9TVC5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fUE9TVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfRE9fUFVULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBET19QVVRfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fAotCQkJCQkoTUVUSE9EX0RPX0RFTEVURS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fREVMRVRFX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19IRUFELmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBET19IRUFEX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19PUFRJT05TLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBNRVRIT0RfRE9fT1BUSU9OUy5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19UUkFDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fVFJBQ0VfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTA4YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ2FybCBBbmRlcnNvbiwgY2NjQHVzLmlibS5jb20gLSBoYW5kbGUgbnVsbCBzdXBlcmNsYXNzIChubyBydW50aW1lKSAoYnVnIDIxNDk1MCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCBleHRlbmRzCi0JCUNyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERJU1BMQVlfTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoREVTQ1JJUFRJT04pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlck1hcHBpbmdJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzMWEwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdJdGVtIGltcGxlbWVudHMgSUZpbHRlck1hcHBpbmdJdGVtIHsKLSAgICAKLSAgICBwcml2YXRlIGludCBtYXBwaW5nVHlwZTsKLSAgICBwcml2YXRlIGludCBkaXNwYXRjaGVyczsKLSAgICBwcml2YXRlIFN0cmluZyBtYXBwaW5nOwotICAgIAotICAgIHB1YmxpYyBGaWx0ZXJNYXBwaW5nSXRlbShpbnQgdHlwZSwgU3RyaW5nIG1hcHBpbmcpIHsKLSAgICAgICAgbWFwcGluZ1R5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWx0ZXJNYXBwaW5nSXRlbShpbnQgdHlwZSwgU3RyaW5nIG1hcHBpbmcsIGludCBkaXNwYXRjaGVycykgewotICAgICAgICB0aGlzKHR5cGUsIG1hcHBpbmcpOwotICAgICAgICB0aGlzLmRpc3BhdGNoZXJzID0gZGlzcGF0Y2hlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNYXBwaW5nVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VybFBhdHRlcm5UeXBlKCkgewotICAgIAlyZXR1cm4gbWFwcGluZ1R5cGUgPT0gSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXROYW1lVHlwZSgpIHsKLSAgICAJcmV0dXJuIG1hcHBpbmdUeXBlID09IElGaWx0ZXJNYXBwaW5nSXRlbS5TRVJWTEVUX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREaXNwYXRjaGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgUkVRVUVTVCkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfUiIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgRk9SV0FSRCkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfRiIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSU5DTFVERSkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfSSIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgRVJST1IpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX0UiKSArICIgIjsgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyU3VwZXJ0eXBlc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjdjNTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9GSUxURVI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWx0ZXJTdXBlcmNsYXNzKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmIChoYXNTdXBlckludGVyZmFjZShkYXRhTW9kZWwsIGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSwgUVVBTElGSUVEX0ZJTFRFUikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWZvciAoT2JqZWN0IGlmYWNlIDogZ2V0SW50ZXJmYWNlcyhkYXRhTW9kZWwpKSB7Ci0JCQlpZiAoaGFzU3VwZXJJbnRlcmZhY2UoZGF0YU1vZGVsLCAoU3RyaW5nKSBpZmFjZSwgUVVBTElGSUVEX0ZJTFRFUikpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU1M2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbHRlclRlbXBsYXRlIGNyZWF0ZShTdHJpbmcgbGluZVNlcGFyYXRvcikKLSAgewotICAgIG5sID0gbGluZVNlcGFyYXRvcjsKLSAgICBGaWx0ZXJUZW1wbGF0ZSByZXN1bHQgPSBuZXcgRmlsdGVyVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogU2VydmxldCBGaWx0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLmZpbHRlciIgKyBOTCArICIgKiAgIG5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSAiXCIiICsgTkwgKyAiICogICBkaXNwbGF5LW5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSBOTCArICIgKiAgIGRlc2NyaXB0aW9uPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5maWx0ZXItbWFwcGluZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9IE5MICsgIiAqICAgdXJsLXBhdHRlcm49XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSBOTCArICIgKiAgIHNlcnZsZXQtbmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOSA9IE5MICsgIiAqICAgZGlzcGF0Y2hlcj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuZmlsdGVyLWluaXQtcGFyYW0iICsgTkwgKyAiICogICAgbmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICJcIiIgKyBOTCArICIgKiAgICB2YWx1ZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9IE5MICsgIiAqICAgIGRlc2NyaXB0aW9uPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gTkwgKyAiICovIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gTkwgKyAicHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOCA9ICJhYnN0cmFjdCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjkgPSAiZmluYWwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMwID0gImNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiIGltcGxlbWVudHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gIiwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIiB7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM1ID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDAgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQzID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDUgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ3ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80OCA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTAgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MSA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MyA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgRmlsdGVyI2Rlc3Ryb3koKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEZpbHRlciNkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbikiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdFx0Ly8gcGxhY2UgeW91ciBjb2RlIGhlcmUiICsgTkwgKyAiIiArIE5MICsgIlx0XHQvLyBwYXNzIHRoZSByZXF1ZXN0IGFsb25nIHRoZSBmaWx0ZXIgY2hhaW4iICsgTkwgKyAiXHRcdGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU2ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgRmlsdGVyI2luaXQoRmlsdGVyQ29uZmlnKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU3ID0gTkwgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU4ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLSAgICAKLQltb2RlbC5yZW1vdmVGbGFncyhDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FKTsgCi0KLSAgICAKLQlpZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkgIT0gbnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yKTsKLSAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMyk7Ci0gICAgIAotCUNvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cygpOwotCWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBhbkltcG9ydCApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81KTsKLSAgICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICAgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0RmlsdGVyTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRGaWx0ZXJOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgIAotCQlpZiAobW9kZWwuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsICYmIG1vZGVsLmdldERlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPiAwKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXREZXNjcmlwdGlvbigpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEzKTsKLSAgICAgCi0JCX0gCi0JCQotCQlMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gbWFwcGluZ3MgPSBtb2RlbC5nZXRGaWx0ZXJNYXBwaW5ncygpOwotIAkJZm9yIChJRmlsdGVyTWFwcGluZ0l0ZW0gbWFwcGluZyA6IG1hcHBpbmdzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE0KTsKLSAgICAKLQkJCWlmIChtYXBwaW5nLmlzVXJsUGF0dGVyblR5cGUoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWFwcGluZy5nZXROYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTYpOwotICAgIAotCQkJfSBlbHNlIGlmIChtYXBwaW5nLmlzU2VydmxldE5hbWVUeXBlKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1hcHBpbmcuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKLSAgICAKLQkJCX0KLQkJIAotCQkJU3RyaW5nIGRpc3BhdGNoZXIgPSBtb2RlbC5nZXREaXNwYXRjaGVyTGlzdChtYXBwaW5nKTsKLQkJCWlmIChkaXNwYXRjaGVyLmxlbmd0aCgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGlzcGF0Y2hlciApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgIAotCQkJfSAKLQkJfSAKLQotCQlMaXN0PFN0cmluZ1tdPiBpbml0UGFyYW1zID0gbW9kZWwuZ2V0SW5pdFBhcmFtcygpOwotCQlpZiAoaW5pdFBhcmFtcyAhPSBudWxsICYmIGluaXRQYXJhbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0UGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5OQU1FKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5WQUxVRSk7Ci0JCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuREVTQ1JJUFRJT04pOyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIAotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVzY3JpcHRpb24gKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIAotCQkJCX0KLQkJCX0gCi0JCX0gCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKLSAgICAKLQlpZiAobW9kZWwuaXNQdWJsaWMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgIAotCX0gCi0KLQlpZiAobW9kZWwuaXNBYnN0cmFjdCgpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKLSAgICAKLQl9Ci0KLQlpZiAobW9kZWwuaXNGaW5hbCgpKSB7Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICAKLQlTdHJpbmcgc3VwZXJDbGFzcyA9IG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCk7Ci0gCWlmIChzdXBlckNsYXNzICE9IG51bGwgJiYgc3VwZXJDbGFzcy5sZW5ndGgoKSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggc3VwZXJDbGFzcyApOwotICAgIAotCX0KLQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLSAJaWYgKCBpbnRlcmZhY2VzLnNpemUoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgIAotCX0KLQkKLSAJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAJCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLSAgIAkJaWYgKGkgPiAwKSB7Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOwotICAgIAotCQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBJTlRFUkZBQ0UgKTsKLSAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgICAKLQlpZiAoIW1vZGVsLmhhc0VtcHR5U3VwZXJjbGFzc0NvbnN0cnVjdG9yKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM2KTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5zaG91bGRHZW5TdXBlcmNsYXNzQ29uc3RydWN0b3JzKCkpIHsKLQkJTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gbW9kZWwuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5pc1B1YmxpYygpIHx8IGNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Myk7Ci0gICAgCi0JCQl9IAotCQl9IAotCX0gCi0KLSAgICAKLQlpZiAobW9kZWwuc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbW9kZWwuZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOwotICAgICAKLQkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7Ci0JCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlZmF1bHRSZXR1cm5WYWx1ZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Mik7Ci0gICAgCi0JCQl9IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKLSAgICAgCi0JCX0KLQl9IAotCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5EZXN0cm95KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvRmlsdGVyKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU1KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkluaXQoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTYpOwotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU4KTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JRmlsdGVyTWFwcGluZ0l0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNmY5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSUZpbHRlck1hcHBpbmdJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlck1hcHBpbmdJdGVtIHsKLQkKLSAgICBwdWJsaWMgc3RhdGljIGludCBVUkxfUEFUVEVSTiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgU0VSVkxFVF9OQU1FID0gMTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludCBSRVFVRVNUID0gMSA8PCAxOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEZPUldBUkQgPSAxIDw8IDI7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgSU5DTFVERSA9IDEgPDwgMzsKLSAgICBwdWJsaWMgc3RhdGljIGludCBFUlJPUiA9IDEgPDwgNDsKLSAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgICBwdWJsaWMgaW50IGdldE1hcHBpbmdUeXBlKCk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNVcmxQYXR0ZXJuVHlwZSgpOwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmxldE5hbWVUeXBlKCk7Ci0gICAgcHVibGljIGludCBnZXREaXNwYXRjaGVycygpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWM3YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGluaXQgbWV0aG9kLgotCSAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVQgPSAiTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwuSU5JVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZGVzdHJveSBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTVFJPWSA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5ERVNUUk9ZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBkb0ZpbHRlciBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19GSUxURVIgPSAiTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwuRE9fRklMVEVSIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBMaXN0IHByb3BlcnR5IHVzZWQgdG8gY2FjaGUgYWxsIHRoZSBpbml0IHBhcmFtcyBkZWZpbmVkIG9uIHRoZSBmaWx0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9QQVJBTSA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5JTklUX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwsIExpc3QgcHJvcGV0eSB1c2VkIHRvIGNhY2hlIGFsbCB0aGUgZmlsdGVyIG1hcHBpbmdzIGZvciB0aGlzIGZpbHRlciBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9NQVBQSU5HUyA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5GSUxURVJfTUFQUElOR1MiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDhlOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjlhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2lyaWwgTWl0b3YsIGsubWl0b3ZAc2FwLmNvbQktIGJ1ZyAyMDQxNjAKLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgaW5pdCBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVCA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuSU5JVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZGVzdHJveSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1kgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRFU1RST1kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZ2V0U2VydmxldEluZm8gbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9JTkZPID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5HRVRfU0VSVkxFVF9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGdldFNlcnZsZXRDb25maWcgbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9DT05GSUcgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkdFVF9TRVJWTEVUX0NPTkZJRyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRSA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuU0VSVklDRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBkb0dldCBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fR0VUID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19HRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9Qb3N0IG1ldGhvZC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1BPU1QgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRPX1BPU1QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGRvUHV0IG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fUFVUID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19QVVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9EZWxldGUgbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19ERUxFVEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRPX0RFTEVURSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9IZWFkIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fSEVBRCA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuRE9fSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9PcHRpb25zIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fT1BUSU9OUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuRE9fT1BUSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9UcmFjZSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1RSQUNFID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19UUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9UcmFjZSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX1NUUklORyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVE9fU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBkZXRlcm1pbmUgaWYgYnVpbGRpbmcgSlNQIG9yIHNlcnZsZXQuCi0JICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TRVJWTEVUX1RZUEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLklTX1NFUlZMRVRfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgTGlzdCBwcm9wZXJ0eSB1c2VkIHRvIGNhY2hlIGFsbCB0aGUgaW5pdCBwYXJhbXMgZGVmaW5lZCBvbiB0aGUgc2VydmxldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX1BBUkFNID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5JTklUX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBMaXN0IHByb3BldHkgdXNlZCB0byBjYWNoZSBhbGwgdGhlIHNlcnZsZXQgbWFwcGluZ3MgZm9yIHRoaXMgc2VydmxldCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9NQVBQSU5HUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVVJMX01BUFBJTkdTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRG8gbm90IHNldCEgVGhlIGphdmFqZXQgdGVtcGxhdGUgZmlsZSB1c2VkIGluIGNyZWF0aW5nIHRoZSBhbm5vdGF0ZWQgc2VydmxldCB0ZW1wbGF0ZSBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0ZJTEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLlRFTVBMQVRFX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRG8gbm90IHNldCEgVGhlIGphdmFqZXQgdGVtcGxhdGUgZmlsZSB1c2VkIGluIGNyZWF0aW5nIHRoZSBub24tYW5ub3RhdGVkIHNlcnZsZXQgdGVtcGxhdGUgY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLk5PTl9BTk5PVEFURURfVEVNUExBVEVfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBkNDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbCB7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZCwgU3RyaW5nIHByb3BlcnR5IG9mIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRJU1BMQVlfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgU3RyaW5nIHByb3BlcnR5IG9mIHRoZSBkZXNjcmlwdGlvbiBpbmZvIGZvciB0aGUgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRFU0NSSVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBnZW5lcmF0ZSBhIG5ldyBqYXZhIGNsYXNzLgotCSAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FWElTVElOR19DTEFTUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVVNFX0VYSVNUSU5HX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0xpc3RlbmVyVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9MaXN0ZW5lclRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTQyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0xpc3RlbmVyVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIExpc3RlbmVyVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3RlbmVyVGVtcGxhdGUgY3JlYXRlKFN0cmluZyBsaW5lU2VwYXJhdG9yKQotICB7Ci0gICAgbmwgPSBsaW5lU2VwYXJhdG9yOwotICAgIExpc3RlbmVyVGVtcGxhdGUgcmVzdWx0ID0gbmV3IExpc3RlbmVyVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogQXBwbGljYXRpb24gTGlmZWN5Y2xlIExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSBOTCArICIgKiBAd2ViLmxpc3RlbmVyIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gTkwgKyAiICovIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAicHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJhYnN0cmFjdCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSAiZmluYWwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gImNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiIGltcGxlbWVudHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIiwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIiB7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIwID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI4ID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMyID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHQiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotICAgIAotCW1vZGVsLnJlbW92ZUZsYWdzKENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbC5GTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpOyAKLQotICAgIAotCWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSAhPSBudWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgCi0JQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKCk7Ci0JZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGFuSW1wb3J0ICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85KTsKLSAgICAgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTApOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgIAotCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5pc0Fic3RyYWN0KCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOwotICAgIAotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNCk7Ci0gICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIAotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBzdXBlckNsYXNzICk7Ci0gICAgCi0JfQotCi0JTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7Ci0gICAgCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOCk7Ci0gICAgCi0JCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIElOVEVSRkFDRSApOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOSk7Ci0gICAgIAotCWlmICghbW9kZWwuaGFzRW1wdHlTdXBlcmNsYXNzQ29uc3RydWN0b3IoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjEpOwotICAgICAKLQl9IAotCi0JaWYgKG1vZGVsLnNob3VsZEdlblN1cGVyY2xhc3NDb25zdHJ1Y3RvcnMoKSkgewotCQlMaXN0PENvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMgPSBtb2RlbC5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJaWYgKGNvbnN0cnVjdG9yLmlzUHVibGljKCkgfHwgY29uc3RydWN0b3IuaXNQcm90ZWN0ZWQoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKLSAgICAKLQkJCX0gCi0JCX0gCi0JfSAKLQotICAgIAotCWlmIChtb2RlbC5zaG91bGRJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtb2RlbC5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI5KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMxKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7Ci0gICAgIAotCQkJU3RyaW5nIGRlZmF1bHRSZXR1cm5WYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0UmV0dXJuVmFsdWUoKTsKLQkJCWlmIChkZWZhdWx0UmV0dXJuVmFsdWUgIT0gbnVsbCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVmYXVsdFJldHVyblZhbHVlICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKLSAgICAKLQkJCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgICAKLQkJfQotCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMTc0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTFRFUl9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLk5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi52YWxpZGF0aW9uLlVybFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogU3RyaW5nIGFycmF5IG9mIHRoZSBkZWZhdWx0LCBtaW5pbXVtIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBGaWx0ZXIKLQkgKiBpbnRlcmZhY2VzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gRklMVEVSX0lOVEVSRkFDRVMgPSB7IFFVQUxJRklFRF9GSUxURVIgfTsgCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoQUJTVFJBQ1RfTUVUSE9EUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKElOSVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChERVNUUk9ZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoRE9fRklMVEVSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gT3RoZXJ3aXNlIHJldHVybiBzdXBlciBpbXBsZW1lbnRhdGlvbgotCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0gICAgCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRlZmF1bHQgb3BlcmF0aW9uCi0JICogZm9yIHRoaXMgZGF0YSBtb2RlbCBwcm92aWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZQotCSAqIEFkZEZpbHRlck9wZXJhdGlvbiB0byBkcml2ZSB0aGUgZmlsdGVyIGNyZWF0aW9uLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiBJRGF0YU1vZGVsT3BlcmF0aW9uIEFkZEZpbHRlck9wZXJhdGlvbgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQWRkRmlsdGVyT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBkYXRhIG1vZGVsJ3MKLQkgKiBwcm9wZXJ0aWVzIGFzIHZhbGlkIGJhc2UgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJLy8gQWRkIGZpbHRlciBzcGVjaWZpYyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBkYXRhIG1vZGVsCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFU1RST1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19GSUxURVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTklUX1BBUkFNKTsKLSAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoRklMVEVSX01BUFBJTkdTKTsKLSAgICAgICAgCi0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IHZhbHVlcyBmb3IKLQkgKiBhbnkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5LiBUaGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBJdCBtYXkgcmV0dXJuIG51bGwuIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cwotCSAqIGFubm90YXRpb24gdXNlIHRvIGJlIHRydWUsIGFuZCB0byBnZW5lcmF0ZSBhIGZpbHRlciB3aXRoIGRvRmlsdGVyLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdCBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5Ci0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERVNUUk9ZKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRE9fRklMVEVSKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVCkpCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTFRFUl9NQVBQSU5HUykpCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdEZpbHRlck1hcHBpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRFUkZBQ0VTKSkKLQkJCXJldHVybiBnZXRGaWx0ZXJJbnRlcmZhY2VzKCk7Ci0gICAgICAgIAotCQkvLyBPdGhlcndpc2UgY2hlY2sgc3VwZXIgZm9yIGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nIGRlcGVuZGluZyB1cG9uIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlCi0JICogRmlsdGVyCi0JICogCi0JICogQHJldHVybiBMaXN0IGNvbnRhaW50aW5nIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVmYXVsdEZpbHRlck1hcHBpbmcoKSB7Ci0JCUxpc3QgZmlsdGVyTWFwcGluZ3MgPSBudWxsOwotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGdldFByb3BlcnR5KERJU1BMQVlfTkFNRSk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJICAgIGZpbHRlck1hcHBpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkgICAgZmlsdGVyTWFwcGluZ3MuYWRkKG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShGaWx0ZXJNYXBwaW5nSXRlbS5VUkxfUEFUVEVSTiwgIi8iICsgdGV4dCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbHRlck1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIGFkZHMgdmFsaWRhdGlvbiBmb3IgdGhlIGluaXQgcGFyYW1zLCBmaWx0ZXIgbWFwcGluZ3MsIGRpc3BsYXkgbmFtZSwgYW5kCi0JICogZXhpc3RpbmcgY2xhc3MgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBmaWx0ZXIgamF2YSBjbGFzcyBjcmVhdGlvbi4gSXQgZG9lcwotCSAqIG5vdCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBwcm9wZXJ0eSB2YWx1ZSB2YWxpZD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCS8vIElmIG91ciBkZWZhdWx0IGlzIHRoZSBzdXBlcmNsYXNzLCB3ZSBrbm93IGl0IGlzIG9rCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpICYmICIiLmVxdWFscyhnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkvLyBWYWxpZGF0ZSBpbml0IHBhcmFtcwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTklUX1BBUkFNKSkKLQkJCXJldHVybiB2YWxpZGF0ZUluaXRQYXJhbUxpc3QoKExpc3QpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotICAgICAgICAvLyBWYWxpZGF0ZSB1cmwgcGF0dGVybiBhbmQgc2VydmxldCBuYW1lIG1hcHBpbmdzCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTFRFUl9NQVBQSU5HUykpCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVGaWx0ZXJNYXBwaW5nTGlzdCgoTGlzdCkgZ2V0UHJvcGVydHkoRklMVEVSX01BUFBJTkdTKSk7Ci0JCS8vIFZhbGlkYXRlIHRoZSBmaWx0ZXIgbmFtZSBpbiBERAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIHZhbGlkYXRlRGlzcGxheU5hbWUoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCQotCQkvLyBPdGhlcndpc2UgZGVmZXIgdG8gc3VwZXIgdG8gdmFsaWRhdGUgdGhlIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBiZSB1c2VkIHRvCi0JICogdmFsaWRhdGUgdGhlIGluaXQgcGFyYW1zIGxpc3QgdG8gZW5zdXJlIHRoZXJlIGFyZSBub3QgYW55IGR1cGxpY2F0ZXMuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtdGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGluaXQgcGFyYW1zIGxpc3QgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSW5pdFBhcmFtTGlzdChMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgIT0gbnVsbCAmJiAhcHJvcC5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGUKLQkgKiBmaWx0ZXIgbWFwcGluZ3MgbGlzdCBhbmQgZW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlIGVudHJpZXMuIEl0IHdpbGwKLQkgKiBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBmaWx0ZXIgbWFwcGluZyBsaXN0IHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUZpbHRlck1hcHBpbmdMaXN0KExpc3QgcHJvcCkgewotCQlpZiAocHJvcCAhPSBudWxsICYmICFwcm9wLmlzRW1wdHkoKSkgewotCQkJLy8gRW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlcyBpbiB0aGUgbWFwcGluZyBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJbkZpbHRlck1hcHBpbmdJdGVtTGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJU3RyaW5nIGlzVmFsaWRWYWx1ZSA9IHZhbGlkYXRlVmFsdWUocHJvcCk7Ci0JCQlpZiAoaXNWYWxpZFZhbHVlICE9IG51bGwgJiYgaXNWYWxpZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCU5MUy5iaW5kKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBpc1ZhbGlkVmFsdWUpOwotCQkJCVN0cmluZyByZXNvdXJjZVN0cmluZyA9IFdlYk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBuZXcgU3RyaW5nW117aXNWYWxpZFZhbHVlfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhyZXNvdXJjZVN0cmluZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9NQVBQSU5HX0VNUFRZOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc0R1cGxpY2F0ZXNJbkZpbHRlck1hcHBpbmdJdGVtTGlzdChMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gaW5wdXQpIHsKLQkJLy8gSWYgbGlzdCBpcyBudWxsIG9yIGVtcHR5IHJldHVybiBmYWxzZQotCQlpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJYm9vbGVhbiBkdXAgPSBmYWxzZTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0gPSBpbnB1dC5nZXQoaSk7Ci0JICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuOyBqKyspIHsKLQkgICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbTIgPSAoSUZpbHRlck1hcHBpbmdJdGVtKSBpbnB1dC5nZXQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0TmFtZSgpLmVxdWFscyhpdGVtMi5nZXROYW1lKCkpICYmIAotICAgICAgICAgICAgICAgIAkJaXRlbS5nZXRNYXBwaW5nVHlwZSgpID09IGl0ZW0yLmdldE1hcHBpbmdUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGR1cCkgYnJlYWs7Ci0JCX0KLQkJLy8gUmV0dXJuIGJvb2xlYW4gc3RhdHVzIGZvciBkdXBsaWNhdGVzCi0JCXJldHVybiBkdXA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZQotCSAqIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGlmIHRoZXJlIGFyZSBpbnZhbGlkIHBhdHRlcm4ncyB2YWx1ZSBpbiBhIGxpc3QuCi0JICogSXQgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVGaWx0ZXJNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gU3RyaW5nIGZpcnN0IGludmFsaWQgcGF0dGVybidzIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVWYWx1ZShMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWludCBzaXplID0gcHJvcC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZ1ZhbHVlID0gKElGaWx0ZXJNYXBwaW5nSXRlbSkgcHJvcC5nZXQoaSk7Ci0JCQlpZiAoZmlsdGVyTWFwcGluZ1ZhbHVlLmlzVXJsUGF0dGVyblR5cGUoKSAmJiAKLQkJCQkJIVVybFBhdHRlcm4uaXNWYWxpZChmaWx0ZXJNYXBwaW5nVmFsdWUuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gZmlsdGVyTWFwcGluZ1ZhbHVlLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsdGVyIGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkgKiBmb3IgdGhlIG5ldyBzZXJ2bGV0IGphdmEgY2xhc3MuIEl0IHdpbGwgaW50aWFsaXplIHRoZSBsaXN0IHVzaW5nIGxhenkKLQkgKiBpbml0aWFsaXphdGlvbiB0byB0aGUgbWluaW11bSBpbnRlcmZhY2VzIHJlcXVpcmVkIGJ5IHRoZSBkYXRhIG1vZGVsCi0JICogRklMVEVSX0lOVEVSRkFDRVMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgI0ZJTFRFUl9JTlRFUkZBQ0VTCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRGaWx0ZXJJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlTGlzdCA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gQWRkIG1pbmltdW0gcmVxdWlyZWQgbGlzdCBvZiBzZXJ2bGV0IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRklMVEVSX0lOVEVSRkFDRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcmZhY2VMaXN0LmFkZChGSUxURVJfSU5URVJGQUNFU1tpXSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIGludGVyZmFjZSBsaXN0Ci0JCXJldHVybiBpbnRlcmZhY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyB3aWxsIHZhbGlkYXRlIHdoZXRoZXIKLQkgKiB0aGUgZGlzcGxheSBuYW1lIHNlbGVjdGVkIGlzIGEgdmFsaWQgZGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyIGluIHRoZQotCSAqIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb24uIEl0IHdpbGwgbWFrZSBzdXJlIHRoZSBuYW1lIGlzIG5vdCBlbXB0eSBhbmQKLQkgKiB0aGF0IGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcC4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQKLQkgKiBudWxsIGFzIGEgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGZpbHRlciBkaXNwbGF5IG5hbWUgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRGlzcGxheU5hbWUoU3RyaW5nIHByb3ApIHsKLQkJLy8gRW5zdXJlIHRoZSBmaWx0ZXIgZGlzcGxheSBuYW1lIGlzIG5vdCBudWxsIG9yIGVtcHR5Ci0JCWlmIChwcm9wID09IG51bGwgfHwgcHJvcC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJU3RyaW5nIG1zZyA9IFdlYk1lc3NhZ2VzLkVSUl9ESVNQTEFZX05BTUVfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJaWYgKGdldFRhcmdldFByb2plY3QoKSA9PSBudWxsIHx8IGdldFRhcmdldENvbXBvbmVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJCi0JCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQlPYmplY3QgbU9iaiA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCWlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBmaWx0ZXJzID0gd2ViQXBwLmdldEZpbHRlcnMoKTsKLQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkvLyBFbnN1cmUgdGhlIGRpc3BsYXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCQlpZiAoZmlsdGVycyAhPSBudWxsICYmICFmaWx0ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyKSBmaWx0ZXJzLmdldChpKSkuZ2V0TmFtZSgpOwotCQkJCQlpZiAocHJvcC5lcXVhbHMobmFtZSkpCi0JCQkJCQlleGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW117cHJvcH0pOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBmaWx0ZXJzID0gd2ViQXBwLmdldEZpbHRlcnMoKTsKLQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkvLyBFbnN1cmUgdGhlIGRpc3BsYXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCQlpZiAoZmlsdGVycyAhPSBudWxsICYmICFmaWx0ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyKSBmaWx0ZXJzLmdldChpKSkuZ2V0RmlsdGVyTmFtZSgpOwotCQkJCQlpZiAocHJvcC5lcXVhbHMobmFtZSkpCi0JCQkJCQlleGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW10ge3Byb3B9KTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSwgcmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2NzVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gZm9sbG93aW5nIHRoZQotICogSURhdGFNb2RlbCB3aXphcmQgYW5kIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEl0IGV4dGVuZHMgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gdG8gcHJvdmlkZSBmaWx0ZXIgc3BlY2lmaWMgamF2YQotICogY2xhc3MgZ2VuZXJhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIGJ5IHRoZSBBZGRGaWx0ZXJPcGVyYXRpb24gdG8gZ2VuZXJhdGUgYW4KLSAqIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgZmlsdGVyLiBJdCBzaGFyZXMgdGhlCi0gKiBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZEZpbHRlck9wZXJhdGlvbiB0byBzdG9yZSB0aGUKLSAqIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBmaWx0ZXIuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZEZpbHRlck9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEEgV1RQSmV0RW1pdHRlciBmaWx0ZXIgdGVtcGxhdGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGggdGhlIGZpbHRlciB0ZW1wbGF0ZS4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuV1RQSkVURW1pdHRlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5DcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBmaWx0ZXIKLSAqIGphdmEgY2xhc3MgZ2VuZXJhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIG1heSBiZSBleHRlbmRlZCB0byBkbyBzby4gQWxzbywKLSAqIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMgaXMgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdXZWJDbGFzc09wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBmb2xkZXIgbG9jYXRpb24gb2YgdGhlIGZpbHRlciBjcmVhdGlvbiB0ZW1wbGF0ZXMgZGlyZXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvZmlsdGVyLmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLQkgKiBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbi4gQW4gaW5zdGFuY2Ugb2YgdGhlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsCi0JICogc2hvdWxkIGJlIHBhc3NlZCBpbi4gVGhpcyBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVGaWx0ZXJUZW1wbGF0ZSBtb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0JICogCi0JICogQHJldHVybiBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBsYXRlRmlsZSgpIHsKLQkJcmV0dXJuIFRFTVBMQVRFX0ZJTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEZpbHRlclRlbXBsYXRlIGdldFRlbXBsYXRlSW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBGaWx0ZXJUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWNlMmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YKLSAqIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgYW5kIGZvbGxvd3MgdGhlIElEYXRhTW9kZWwgT3BlcmF0aW9uIGFuZCBXaXphcmQKLSAqIGZyYW1ld29ya3MuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mIHRoZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLAotICogd2hpY2ggc3RvcmVzIGJhc2UgcHJvcGVydGllcyBuZWNlc3NhcnkgaW4gdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBqYXZhCi0gKiBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVzIG1vcmUgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IKLSAqIGphdmEgY2xhc3MgY3JlYXRpb24gdGhhdCBhcmUgcmVxdWlyZWQgaW4gY3JlYXRpbmcgYSBsaXN0ZW5lciBqYXZhIGNsYXNzLiBUaGUKLSAqIGRhdGEgbW9kZWwgcHJvdmlkZXIgaXMgdXNlZCB0byBzdG9yZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZQotICogTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAgICAgIFRoYXQgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIGJhc2VkIG9uIHRoZSBzZXR0aW5ncwotICogICAgICBkZWZpbmVkIGhlcmUgaW4gdGhlIGRhdGEgbW9kZWwuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW1wbGVtZW50cyB0aGUgSUFubm90YXRpb25zRGF0YU1vZGVsIHRvIGdldCB0aGUKLSAqIFVTRV9BTk5PVEFUSU9OUyBwcm9wZXJ0eSBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgYW4KLSAqIGFubm90YXRlZCBqYXZhIGNsYXNzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbAotICogCi0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyB0aGlzIGRhdGEgbW9kZWwgcHJvdmlkZXIgdG8gY2FjaGUgYW5kIHByb3ZpZGUgdGhlaXIgb3duCi0gKiBzcGVjaWZpYyBhdHRyaWJ1dGVzLiBUaGV5IHNob3VsZCBhbHNvIHByb3ZpZGUgdGhlaXIgb3duIHZhbGlkYXRpb24gbWV0aG9kcywKLSAqIHByb3BlcnRpZXMgaW50ZXJmYWNlLCBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRoZXkgYWRkLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVEVORVJfSU5URVJGQUNFUyA9IHsKLQkJUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUiwJCi0JCVFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUiwKLQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVIsCi0JCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVIsCi0JCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSCi0JfTsKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IG9wZXJhdGlvbgotCSAqIGZvciB0aGlzIGRhdGEgbW9kZWwgcHJvdmlkZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUKLQkgKiBBZGRMaXN0ZW5lck9wZXJhdGlvbiB0byBkcml2ZSB0aGUgbGlzdGVuZXIgY3JlYXRpb24uIEl0IHdpbGwgbm90IHJldHVybgotCSAqIG51bGwuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqIAotCSAqIEByZXR1cm4gSURhdGFNb2RlbE9wZXJhdGlvbiBBZGRMaXN0ZW5lck9wZXJhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQWRkTGlzdGVuZXJPcGVyYXRpb24oZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gSXQgZG9lcyBub3QgYWNjZXB0IGEKLQkgKiBudWxsIHBhcmFtZXRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBwcm9wZXJ0eSB2YWx1ZSB2YWxpZD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVEVSRkFDRVMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVMaXN0ZW5lcnMoKTsKLQkJfQotCQkKLQkJLy8gT3RoZXJ3aXNlIGRlZmVyIHRvIHN1cGVyIHRvIHZhbGlkYXRlIHRoZSBwcm9wZXJ0eQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIGlzCi0JICogc2VsZWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTGlzdGVuZXJzKCkgewotCQlib29sZWFuIGF0TGVhc3RPbmVTZWxlY3RlZCA9IGZhbHNlOwotCQlPYmplY3QgdmFsdWUgPSBtb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCUxpc3QgaW50ZXJmYWNlcyA9IChMaXN0KSB2YWx1ZTsKLQkJCWZvciAoU3RyaW5nIGlmYWNlIDogTElTVEVORVJfSU5URVJGQUNFUykgewotCQkJCWlmIChpbnRlcmZhY2VzLmNvbnRhaW5zKGlmYWNlKSkgeyAKLQkJCQkJYXRMZWFzdE9uZVNlbGVjdGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoYXRMZWFzdE9uZVNlbGVjdGVkKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtc2cgPSBXZWJNZXNzYWdlcy5FUlJfTk9fTElTVEVORVJfU0VMRUNURUQ7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWMyZDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoZSBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gZm9sbG93aW5nIHRoZQotICogSURhdGFNb2RlbCB3aXphcmQgYW5kIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEl0IGV4dGVuZHMgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gdG8gcHJvdmlkZSBsaXN0ZW5lciBzcGVjaWZpYyBqYXZhCi0gKiBjbGFzcyBnZW5lcmF0aW9uLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZExpc3RlbmVyT3BlcmF0aW9uIHRvIGdlbmVyYXRlIGVpdGhlciBhbgotICogYW5ub3RhdGVkIG9yIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyLiAKLSAqIEl0IHNoYXJlcyB0aGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZExpc3RlbmVyT3BlcmF0aW9uIHRvIAotICogc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBsaXN0ZW5lci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQWRkTGlzdGVuZXJPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEluIHRoZSBhbm5vdGF0ZWQgY2FzZSwgYSBXVFBKZXRFbWl0dGVyIGxpc3RlbmVyIHRlbXBsYXRlIGlzIGNyZWF0ZWQgYW5kIHVzZWQKLSAqIHRvIGdlbmVyYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIEluIHRoZSBub24gYW5ub3RhdGVkIGNhc2UsIHRoZSBzYW1lIGVtaXR0ZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGgKLSAqIHRoZSBub24gYW5ub3RhdGVkIGxpc3RlbmVyIHRlbXBsYXRlIHNvIHRoZSBhbm5vdGF0ZWQgdGFncyBhcmUgb21pdHRlZC4KLSAqIAotICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgb3BlcmF0aW9uIHRvIHByb3ZpZGUgdGhlaXIgb3duIHNwZWNpZmljIGxpc3RlbmVyCi0gKiBqYXZhIGNsYXNzIGdlbmVyYXRpb24uIFRoZSBleGVjdXRlIG1ldGhvZCBtYXkgYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sCi0gKiBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzIGlzIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdXZWJDbGFzc09wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBmb2xkZXIgbG9jYXRpb24gb2YgdGhlIGxpc3RlbmVyIGNyZWF0aW9uIHRlbXBsYXRlcyBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvbGlzdGVuZXIuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYQotCSAqIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24uIEFuIGluc3RhbmNlIG9mIHRoZSBOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsCi0JICogc2hvdWxkIGJlIHBhc3NlZCBpbi4gVGhpcyBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwgdG8KLQkgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFdUUEpFVEVtaXR0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwKLQkgKiBAc2VlIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGVtcGxhdGVGaWxlKCkgewotCQlyZXR1cm4gVEVNUExBVEVfRklMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdGVuZXJUZW1wbGF0ZSBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gTGlzdGVuZXJUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwYzcwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEtpcmlsIE1pdG92LCBrLm1pdG92QHNhcC5jb20JLSBidWcgMjA0MTYwCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fREVMRVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19HRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0hFQUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX09QVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BPU1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BVVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fVFJBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0NPTkZJRzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VUX1NFUlZMRVRfSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVF9QQVJBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSVNfU0VSVkxFVF9UWVBFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5OT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlRFTVBMQVRFX0ZJTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlRPX1NUUklORzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVJMX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbi5VcmxQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIgaXMgYSBzdWJjbGFzcyBvZgotICogTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBhbmQgZm9sbG93cyB0aGUgSURhdGFNb2RlbCBPcGVyYXRpb24gYW5kIFdpemFyZAotICogZnJhbWV3b3Jrcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIsCi0gKiB3aGljaCBzdG9yZXMgYmFzZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSBpbiB0aGUgY3JlYXRpb24gb2YgYSB3ZWIgYXJ0aWZhY3QKLSAqIGNsYXNzLgotICogCi0gKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhlIE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVzIG1vcmUgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IKLSAqIGphdmEgY2xhc3MgY3JlYXRpb24gdGhhdCBhcmUgcmVxdWlyZWQgaW4gY3JlYXRpbmcgYSBzZXJ2bGV0IGphdmEgY2xhc3MuIFRoZQotICogZGF0YSBtb2RlbCBwcm92aWRlciBpcyB1c2VkIHRvIHN0b3JlIHRoZXNlIHZhbHVlcyBmb3IgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uCi0gKiAKLSAqIEBzZWUgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogVGhhdCBvcGVyYXRpb24gd2lsbCBjcmVhdGUgdGhlIHNlcnZsZXQgamF2YSBjbGFzcyBiYXNlZCBvbiB0aGUgc2V0dGluZ3MKLSAqIGRlZmluZWQgaGVyZSBpbiB0aGUgZGF0YSBtb2RlbC4KLSAqIAotICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW1wbGVtZW50cyB0aGUgSUFubm90YXRpb25zRGF0YU1vZGVsIHRvIGdldCB0aGUKLSAqIFVTRV9BTk5PVEFUSU9OUyBwcm9wZXJ0eSBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgYW4KLSAqIGFubm90YXRlZCBqYXZhIGNsYXNzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsCi0gKiAKLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIHRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciB0byBjYWNoZSBhbmQgcHJvdmlkZSB0aGVpciBvd24KLSAqIHNwZWNpZmljIGF0dHJpYnV0ZXMuIFRoZXkgc2hvdWxkIGFsc28gcHJvdmlkZSB0aGVpciBvd24gdmFsaWRhdGlvbiBtZXRob2RzLAotICogcHJvcGVydGllcyBpbnRlcmZhY2UsIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgdGhleSBhZGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBkZWZhdWx0IHNlcnZsZXQgc3VwZXJjbGFzczogSHR0cFNlcnZsZXQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfU1VQRVJDTEFTUyA9IFFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFycmF5IG9mIHRoZSBkZWZhdWx0LCBtaW5pbXVtIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBTZXJ2bGV0Ci0JICogaW50ZXJmYWNlcwotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFNFUlZMRVRfSU5URVJGQUNFUyA9IHsgUVVBTElGSUVEX1NFUlZMRVQgfTsgCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVEVEX1RFTVBMQVRFX0RFRkFVTFQgPSAic2VydmxldC5qYXZhamV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PTl9BTk5PVEFURURfVEVNUExBVEVfREVGQVVMVCA9ICJzZXJ2bGV0LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gZGVmYXVsdCBvcGVyYXRpb24KLQkgKiBmb3IgdGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlCi0JICogQWRkU2VydmxldE9wZXJhdGlvbiB0byBkcml2ZSB0aGUgc2VydmxldCBjcmVhdGlvbi4gSXQgd2lsbCBub3QgcmV0dXJuCi0JICogbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiBJRGF0YU1vZGVsT3BlcmF0aW9uIEFkZFNlcnZsZXRPcGVyYXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFkZFNlcnZsZXRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGRhdGEgbW9kZWwncwotCSAqIHByb3BlcnRpZXMgYXMgdmFsaWQgYmFzZSBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQkvLyBBZGQgc2VydmxldCBzcGVjaWZpYyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBkYXRhIG1vZGVsCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFU1RST1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChHRVRfU0VSVkxFVF9DT05GSUcpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChHRVRfU0VSVkxFVF9JTkZPKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU0VSVklDRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX0dFVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX1BPU1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19QVVQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19ERUxFVEUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19IRUFEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRE9fT1BUSU9OUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX1RSQUNFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVE9fU1RSSU5HKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSVNfU0VSVkxFVF9UWVBFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVF9QQVJBTSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVSTF9NQVBQSU5HUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE5PTl9BTk5PVEFURURfVEVNUExBVEVfRklMRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRFTVBMQVRFX0ZJTEUpOwotCQkKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEFCU1RSQUNUX01FVEhPRFMuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCk7Ci0JCX0gZWxzZSBpZiAoSU5JVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAKLQkJCQlERVNUUk9ZLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IAotCQkJCUdFVF9TRVJWTEVUX0NPTkZJRy5lcXVhbHMocHJvcGVydHlOYW1lKSB8fAotCQkJCUdFVF9TRVJWTEVUX0lORk8uZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgCi0JCQkJU0VSVklDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJYm9vbGVhbiBnZW5lcmljU2VydmxldCA9IFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKTsKLQkJCWJvb2xlYW4gaW5oZXJpdCA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBQlNUUkFDVF9NRVRIT0RTKTsKLQkJCXJldHVybiBnZW5lcmljU2VydmxldCAmJiBpbmhlcml0OwotCQl9IGVsc2UgaWYgKERPX0dFVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAKLQkJCQlET19QT1NULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fUFVULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fREVMRVRFLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fSEVBRC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fAotCQkJCURPX09QVElPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwKLQkJCQlET19UUkFDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJYm9vbGVhbiBodHRwU2VydmxldCA9IFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKTsKLQkJCWJvb2xlYW4gaW5oZXJpdCA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBQlNUUkFDVF9NRVRIT0RTKTsKLQkJCXJldHVybiBodHRwU2VydmxldCAmJiBpbmhlcml0OwotCQl9Ci0JCQotCQkvLyBPdGhlcndpc2UgcmV0dXJuIHN1cGVyIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IHZhbHVlcyBmb3IKLQkgKiBhbnkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5LiBUaGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBJdCBtYXkgcmV0dXJuIG51bGwuIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cwotCSAqIGFubm90YXRpb24gdXNlIHRvIGJlIHRydWUsIGFuZCB0byBnZW5lcmF0ZSBhIHNlcnZsZXQgd2l0aCBkb0dldCBhbmQKLQkgKiBkb1Bvc3QuCi0JICogCi0JICogQHNlZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gR2VuZXJhdGUgYSBkb1Bvc3QgYW5kIGRvR2V0IG1ldGhvZHMgYnkgZGVmYXVsdCBvbmx5IGlmIGEgY2xhc3MgCi0JCS8vIGV4dGVuZGluZyBIdHRwU2VydmxldCBpcyBzZWxlY3RlZAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhET19QT1NUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKERPX0dFVCkpIHsKLQkJCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJLy8gR2VuZXJhdGUgYSBzZXJ2aWNlIG1ldGhvZCBieSBkZWZhdWx0IG9ubHkgaWYgYSBjbGFzcyAKLQkJLy8gbm90IGV4dGVuZGluZyBIdHRwU2VydmxldCBpcyBzZWxlY3RlZAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTRVJWSUNFKSkgewotCQkJaWYgKCFTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhERVNUUk9ZKSB8fCAKLQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoR0VUX1NFUlZMRVRfQ09ORklHKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEdFVF9TRVJWTEVUX0lORk8pKSB7Ci0JCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKSkgCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJLy8gVXNlIHNlcnZsZXQgYnkgZGVmYXVsdAotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElTX1NFUlZMRVRfVFlQRSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU1BMQVlfTkFNRSkpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsKLQkJCWlmIChjbGFzc05hbWUuZW5kc1dpdGgoIi5qc3AiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4KzEsY2xhc3NOYW1lLmxlbmd0aCgpLTQpOwotCQkJfSBlbHNlIHsKLQkJCQljbGFzc05hbWUgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShjbGFzc05hbWUpOwotCQkJfQotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVSTF9NQVBQSU5HUykpCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdFVybE1hcHBpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRFUkZBQ0VTKSkKLQkJCXJldHVybiBnZXRTZXJ2bGV0SW50ZXJmYWNlcygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKQotCQkJcmV0dXJuIFNFUlZMRVRfU1VQRVJDTEFTUzsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhURU1QTEFURV9GSUxFKSkKLQkJCXJldHVybiBBTk5PVEFURURfVEVNUExBVEVfREVGQVVMVDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhOT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEUpKQotCQkJcmV0dXJuIE5PTl9BTk5PVEFURURfVEVNUExBVEVfREVGQVVMVDsKLQkJCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIGFkZHMgdmFsaWRhdGlvbiBmb3IgdGhlIGluaXQgcGFyYW1zLCBzZXJ2bGV0IG1hcHBpbmdzLCBkaXNwbGF5IG5hbWUsIGFuZAotCSAqIGV4aXN0aW5nIGNsYXNzIGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgc2VydmxldCBqYXZhIGNsYXNzIGNyZWF0aW9uLiBJdAotCSAqIGRvZXMgbm90IGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgcHJvcGVydHkgdmFsdWUgdmFsaWQ/Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBWYWxpZGF0ZSBzdXBlciBjbGFzcwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSkgCi0JCQlyZXR1cm4gdmFsaWRhdGVTdXBlckNsYXNzTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gVmFsaWRhdGUgaW5pdCBwYXJhbXMKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVF9QQVJBTSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVJbml0UGFyYW1MaXN0KChMaXN0KSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gVmFsaWRhdGUgc2VydmxldCBtYXBwaW5ncwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVUkxfTUFQUElOR1MpKQotCQkJcmV0dXJuIHZhbGlkYXRlVVJMTWFwcGluZ0xpc3QoKExpc3QpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotCQkvLyBWYWxpZGF0ZSB0aGUgc2VydmxldCBuYW1lIGluIERECi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU1BMQVlfTkFNRSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVEaXNwbGF5TmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQotCQkvLyBPdGhlcndpc2UgZGVmZXIgdG8gc3VwZXIgdG8gdmFsaWRhdGUgdGhlIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkKLQkJaWYgKFNVUEVSQ0xBU1MuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFCU1RSQUNUX01FVEhPRFMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShJTklULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREVTVFJPWSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0NPTkZJRywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0lORk8sIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTRVJWSUNFLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fR0VULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fUE9TVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX1BVVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0RFTEVURSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0hFQUQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShET19PUFRJT05TLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fVFJBQ0UsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQkKLQkJCWlmICghaGFzU3VwZXJDbGFzcygpKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUywgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5JVCwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoREVTVFJPWSwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoR0VUX1NFUlZMRVRfQ09ORklHLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShHRVRfU0VSVkxFVF9JTkZPLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShTRVJWSUNFLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19HRVQsIG51bGwpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KERPX1BPU1QsIG51bGwpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KERPX1BVVCwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoRE9fREVMRVRFLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19IRUFELCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19PUFRJT05TLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19UUkFDRSwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFCU1RSQUNUX01FVEhPRFMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5JVCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShERVNUUk9ZLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0NPTkZJRywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShHRVRfU0VSVkxFVF9JTkZPLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNFUlZJQ0UsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fR0VULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX1BPU1QsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fUFVULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0RFTEVURSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShET19IRUFELCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX09QVElPTlMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fVFJBQ0UsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCi0JCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQkJTGlzdCBpZmFjZXMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5URVJGQUNFUyk7Ci0JCQkJaWZhY2VzLmFkZChRVUFMSUZJRURfU0VSVkxFVCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQgfHwgc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIHZhbGlkYXRpb24gb2YgdGhlIHNwZWNpZmllZCBqYXZhCi0JICogY2xhc3NuYW1lLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgZW5zdXJlIHRoZSBjbGFzcyBuYW1lIGlzIG5vdCBzZXQgdG8gU2VydmxldCBhbmQgdGhlbiB3aWxsCi0JICogZm9yd2FyZCBvbiB0byB0aGUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsIHRvIHZhbGlkYXRlIHRoZSBjbGFzcyBuYW1lIGFzIHZhbGlkIGphdmEuIFRoaXMgbWV0aG9kCi0JICogZG9lcyBub3QgYWNjZXB0IG51bGwgYXMgYSBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLiAKLQkgKiBJdCB3aWxsIGNoZWNrIGlmIHRoZSBzdXBlciBjbGFzcyBleHRlbmRzIHRoZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaW50ZXJmYWNlIGFsc28uCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBqYXZhIGNsYXNzbmFtZSB2YWxpZD8KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVN1cGVyQ2xhc3NOYW1lKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgewotCQkvL0lmIHRoZSBzZXJ2bGV0IGltcGxlbWVudHMgamF2YXguc2VydmxldC5TZXJ2bGV0LCB3ZSBkbyBub3QgbmVlZCBhIHN1cGVyIGNsYXNzCi0JCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJCi0JCS8vIENoZWNrIHRoZSBzdXBlciBjbGFzcyBhcyBhIGphdmEgY2xhc3MKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoc3VwZXJjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoU1VQRVJDTEFTUyk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXZWJNZXNzYWdlcy5FUlJfU0VSVkxFVF9JTlRFUkZBQ0UpOwotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nIGRlcGVuZGluZyB1cG9uIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIFNlcnZsZXQKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgY29udGFpbnRpbmcgdGhlIGRlZmF1bHQgVXJsIE1hcHBpbmcKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXREZWZhdWx0VXJsTWFwcGluZygpIHsKLQkJTGlzdCB1cmxNYXBwaW5ncyA9IG51bGw7Ci0JCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgZ2V0UHJvcGVydHkoRElTUExBWV9OQU1FKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdXJsTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl1cmxNYXBwaW5ncy5hZGQobmV3IFN0cmluZ1tdIHsiLyIgKyB0ZXh0fSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdXJsTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8KLQkgKiB2YWxpZGF0ZSB0aGUgaW5pdCBwYXJhbXMgbGlzdCB0byBlbnN1cmUgdGhlcmUgYXJlIG5vdCBhbnkgZHVwbGljYXRlcy4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW10ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGluaXQgcGFyYW1zIGxpc3QgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSW5pdFBhcmFtTGlzdChMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgIT0gbnVsbCAmJiAhcHJvcC5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGUKLQkgKiBzZXJ2bGV0IG1hcHBpbmdzIGxpc3QgYW5kIGVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzLiBJdCB3aWxsCi0JICogYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIHNlcnZsZXQgbWFwcGluZyBsaXN0IHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVVSTE1hcHBpbmdMaXN0KExpc3QgcHJvcCkgewotCQlpZiAocHJvcCAhPSBudWxsICYmICFwcm9wLmlzRW1wdHkoKSkgewotCQkJLy8gRW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlcyBpbiB0aGUgbWFwcGluZyBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJU3RyaW5nIGlzVmFsaWRWYWx1ZSA9IHZhbGlkYXRlVmFsdWUocHJvcCk7Ci0JCQlpZiAoaXNWYWxpZFZhbHVlICE9IG51bGwgJiYgaXNWYWxpZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCU5MUy5iaW5kKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBpc1ZhbGlkVmFsdWUpOwotCQkJCVN0cmluZyByZXNvdXJjZVN0cmluZyA9IFdlYk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBuZXcgU3RyaW5nW117aXNWYWxpZFZhbHVlfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhyZXNvdXJjZVN0cmluZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX1VSTF9NQVBQSU5HX0xJU1RfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gUmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHByb3ZpZGVzIGEgc2ltcGxlCi0JICogYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgaWYgdGhlcmUgYXJlIGludmFsaWQgcGF0dGVybidzIHZhbHVlIGluIGEgbGlzdC4KLQkgKiBJdCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVVUkxNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gU3RyaW5nIGZpcnN0IGludmFsaWQgcGF0dGVybidzIHZhbHVlPwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRlVmFsdWUoTGlzdCBwcm9wKSB7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlpbnQgc2l6ZSA9IHByb3Auc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU3RyaW5nIHVybE1hcHBpbmdWYWx1ZSA9ICgoU3RyaW5nW10pIHByb3AuZ2V0KGkpKVswXTsKLQkJCWlmICghVXJsUGF0dGVybi5pc1ZhbGlkKHVybE1hcHBpbmdWYWx1ZSkpCi0JCQkJcmV0dXJuIHVybE1hcHBpbmdWYWx1ZTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCSAqIGZvciB0aGUgbmV3IHNlcnZsZXQgamF2YSBjbGFzcy4gSXQgd2lsbCBpbnRpYWxpemUgdGhlIGxpc3QgdXNpbmcgbGF6eQotCSAqIGluaXRpYWxpemF0aW9uIHRvIHRoZSBtaW5pbXVtIGludGVyZmFjZXMgcmVxdWlyZWQgYnkgdGhlIGRhdGEgbW9kZWwKLQkgKiBTRVJWTEVUX0lOVEVSRkFDRVMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgI1NFUlZMRVRfSU5URVJGQUNFUwotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBzZXJ2bGV0IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U2VydmxldEludGVyZmFjZXMoKSB7Ci0JCWlmIChpbnRlcmZhY2VMaXN0ID09IG51bGwpIHsKLQkJCWludGVyZmFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBBZGQgbWluaW11bSByZXF1aXJlZCBsaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTRVJWTEVUX0lOVEVSRkFDRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcmZhY2VMaXN0LmFkZChTRVJWTEVUX0lOVEVSRkFDRVNbaV0pOwotCQkJfQotCQkJLy8gUmVtb3ZlIHRoZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaW50ZXJmYWNlIGZyb20gdGhlIGxpc3QgaWYgdGhlCi0JCQkvLyBzdXBlcmNsYXNzIGFscmVhZHkgaW1wbGVtZW50cyBpdAotCQkJaWYgKFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQkJaW50ZXJmYWNlTGlzdC5yZW1vdmUoUVVBTElGSUVEX1NFUlZMRVQpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBpbnRlcmZhY2UgbGlzdAotCQlyZXR1cm4gaW50ZXJmYWNlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB3aGV0aGVyCi0JICogdGhlIGRpc3BsYXkgbmFtZSBzZWxlY3RlZCBpcyBhIHZhbGlkIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHNlcnZsZXQgaW4gdGhlCi0JICogc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbi4gSXQgd2lsbCBtYWtlIHN1cmUgdGhlIG5hbWUgaXMgbm90IGVtcHR5IGFuZAotCSAqIHRoYXQgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluIHRoZSB3ZWIgYXBwLiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdAotCSAqIG51bGwgYXMgYSBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIHNlcnZsZXQgZGlzcGxheSBuYW1lIHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZURpc3BsYXlOYW1lKFN0cmluZyBwcm9wKSB7Ci0JCS8vIEVuc3VyZSB0aGUgc2VydmxldCBkaXNwbGF5IG5hbWUgaXMgbm90IG51bGwgb3IgZW1wdHkKLQkJaWYgKHByb3AgPT0gbnVsbCB8fCBwcm9wLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RJU1BMQVlfTkFNRV9FTVBUWTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJfQotCQlpZiAoZ2V0VGFyZ2V0UHJvamVjdCgpID09IG51bGwgfHwgZ2V0VGFyZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkKLQkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGdldFRhcmdldFByb2plY3QoKSk7Ci0JCU9iamVjdCBtT2JqID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1PYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSBtT2JqOwotCi0JCQlMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0JCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQkJLy8gRW5zdXJlIHRoZSBkaXNwbGF5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCQkJaWYgKHNlcnZsZXRzICE9IG51bGwgJiYgIXNlcnZsZXRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQpIHNlcnZsZXRzLmdldChpKSkuZ2V0U2VydmxldE5hbWUoKTsKLQkJCQkJaWYgKHByb3AuZXF1YWxzKG5hbWUpKQotCQkJCQkJZXhpc3RzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJZiB0aGUgc2VydmxldCBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aHJvdyBhbiBlcnJvcgotCQkJaWYgKGV4aXN0cykgewotCQkJCVN0cmluZyBtc2cgPSBXZWJNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXZWJNZXNzYWdlcy5FUlJfU0VSVkxFVF9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW117cHJvcH0pOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCS8vIEVuc3VyZSB0aGUgZGlzcGxheSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkJCWlmIChzZXJ2bGV0cyAhPSBudWxsICYmICFzZXJ2bGV0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSBzZXJ2bGV0cy5nZXQoaSkpLmdldFNlcnZsZXROYW1lKCk7Ci0JCQkJCWlmIChwcm9wLmVxdWFscyhuYW1lKSkKLQkJCQkJCWV4aXN0cyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgdGhlIHNlcnZsZXQgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX1NFUlZMRVRfTkFNRV9FWElTVCwgbmV3IFN0cmluZ1tde3Byb3B9KTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSwgcmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIxODA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhlIE5ld1NlcnZsZXRDbGFzc09wZXJhdGlvbiBpcyBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUKLSAqIElEYXRhTW9kZWwgd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJdCBleHRlbmRzIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uIHRvIHByb3ZpZGUgc2VydmxldCBzcGVjaWZpYyBqYXZhCi0gKiBjbGFzcyBnZW5lcmF0aW9uLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZFNlcnZsZXRPcGVyYXRpb24gdG8gZ2VuZXJhdGUgZWl0aGVyIGFuCi0gKiBhbm5vdGF0ZWQgb3Igbm9uIGFubm90YXRlZCBqYXZhIGNsYXNzIGZvciBhbiBhZGRlZCBzZXJ2bGV0LiBJdCBzaGFyZXMgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciB3aXRoIHRoZSBBZGRTZXJ2bGV0T3BlcmF0aW9uIHRvIHN0b3JlIHRoZQotICogYXBwcm9wcmlhdGUgcHJvcGVydGllcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHNlcnZsZXQuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFNlcnZsZXRPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogSW4gdGhlIGFubm90YXRlZCBjYXNlLCBhIFdUUEpldEVtaXR0ZXIgc2VydmxldCB0ZW1wbGF0ZSBpcyBjcmVhdGVkIGFuZCB1c2VkCi0gKiB0byBnZW5lcmF0ZSB0aGUgc2VydmxldCBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwKLSAqIAotICogSW4gdGhlIG5vbiBhbm5vdGF0ZWQgY2FzZSwgdGhlIHNhbWUgZW1pdHRlciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3Mgd2l0aAotICogdGhlIG5vbiBhbm5vdGF0ZWQgc2VydmxldCB0ZW1wbGF0ZSBzbyB0aGUgYW5ub3RhdGVkIHRhZ3MgYXJlIG9taXR0ZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBzZXJ2bGV0Ci0gKiBqYXZhIGNsYXNzIGdlbmVyYXRpb24uIFRoZSBleGVjdXRlIG1ldGhvZCBtYXkgYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sCi0gKiBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzIGlzIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZsZXRDbGFzc09wZXJhdGlvbiBleHRlbmRzIE5ld1dlYkNsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIGZvbGRlciBsb2NhdGlvbiBvZiB0aGUgc2VydmxldCBjcmVhdGlvbiB0ZW1wbGF0ZXMgZGlyZXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9ESVIgPSAiL3RlbXBsYXRlcy8iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogbG9jYXRpb24gb2YgdGhlIHNlcnZsZXQgY3JlYXRpb24gdGVtcGxhdGUgZmlsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLQkgKiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uIEFuIGluc3RhbmNlIG9mIHRoZSBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwKLQkgKiBzaG91bGQgYmUgcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uI0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKElEYXRhTW9kZWwpCi0JICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmxldENsYXNzT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZSBtb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsCi0JICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsIGNyZWF0ZVRlbXBsYXRlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwobW9kZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBsYXRlRmlsZSgpIHsKLQkJcmV0dXJuIFRFTVBMQVRFX0ZJTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlcnZsZXRUZW1wbGF0ZSBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gU2VydmxldFRlbXBsYXRlLmNyZWF0ZShudWxsKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0NzQwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9BQlNUUkFDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfUFVCTElDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU0NSSVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mCi0gKiBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBhbmQgZm9sbG93cyB0aGUgSURhdGFNb2RlbCBPcGVyYXRpb24gYW5kIFdpemFyZAotICogZnJhbWV3b3Jrcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLAotICogd2hpY2ggc3RvcmVzIGJhc2UgcHJvcGVydGllcyBuZWNlc3NhcnkgaW4gdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBqYXZhCi0gKiBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXMgbW9yZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBqYXZhCi0gKiBjbGFzcyBjcmVhdGlvbiB0aGF0IGFyZSByZXF1aXJlZCBpbiBjcmVhdGluZyBhIHdlYiBhcnRpZmFjdCBqYXZhIGNsYXNzLiBUaGUKLSAqIGRhdGEgbW9kZWwgcHJvdmlkZXIgaXMgdXNlZCB0byBzdG9yZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZQotICogQWRkV2ViQ2xhc3NPcGVyYXRpb24uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqICAgICAgVGhhdCBvcGVyYXRpb24gd2lsbCBjcmVhdGUgdGhlIHdlYiBhcnRpZmFjdCBqYXZhIGNsYXNzIGJhc2VkIG9uIHRoZQotICogICAgICBzZXR0aW5ncyBkZWZpbmVkIGhlcmUgaW4gdGhlIGRhdGEgbW9kZWwuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFdlYkNsYXNzT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgZGF0YSBtb2RlbCBwcm9wZXJ0aWVzIGltcGxlbWVudHMgdGhlIElBbm5vdGF0aW9uc0RhdGFNb2RlbCB0byBnZXQgdGhlCi0gKiBVU0VfQU5OT1RBVElPTlMgcHJvcGVydHkgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGFuCi0gKiBhbm5vdGF0ZWQgamF2YSBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwKLSAqIAotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgdGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIHRvIGNhY2hlIGFuZCBwcm92aWRlIHRoZWlyIG93bgotICogc3BlY2lmaWMgYXR0cmlidXRlcy4gVGhleSBzaG91bGQgYWxzbyBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG1ldGhvZHMsCi0gKiBwcm9wZXJ0aWVzIGludGVyZmFjZSwgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyB0aGV5IGFkZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyICB7Ci0JCi0JLyoqCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBkZWZhdWx0IHN1cGVyY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfU1VQRVJDTEFTUyA9ICIiOyAvLyROT04tTkxTLTEkIAotCi0JLyoqCi0JICogVGhlIGNhY2hlIG9mIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGUgd2ViIGFydGlmYWN0IGphdmEgY2xhc3Mgd2lsbAotCSAqIGltcGxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBpbnRlcmZhY2VMaXN0OwotCQotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZUNhY2hlOwotCXByaXZhdGUgU3RyaW5nIGV4aXN0aW5nQ2xhc3NOYW1lQ2FjaGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZUFubm90YXRpb25zID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRldGVybWluYXRpb24gb2YKLQkgKiB3aGV0aGVyIG9yIG5vdCBjZXJ0YWluIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRpc2FibGVkIG9yIGVuYWJsZWQuIFRoaXMKLQkgKiBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIG1ha2VzIHN1cmUgYW5ub3RhdGlvbiBzdXBwb3J0IGlzIG9ubHkgYWxsb3dlZCBvbiB3ZWIKLQkgKiBwcm9qZWN0cyBvZiBKMkVFIHZlcnNpb24gMS4zIG9yIGhpZ2hlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiBAc2VlIElBbm5vdGF0aW9uc0RhdGFNb2RlbCNVU0VfQU5OT1RBVElPTlMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBib29sZWFuIHNob3VsZCBwcm9wZXJ0eSBiZSBlbmFibGVkPwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gQW5ub3RhdGlvbnMgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBvbiBhIHZhbGlkIGoyZWUgcHJvamVjdCBvZiB2ZXJzaW9uIDEuMyBvciBoaWdoZXIKLQkJaWYgKFVTRV9BTk5PVEFUSU9OUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuICFnZXRCb29sZWFuUHJvcGVydHkoVVNFX0VYSVNUSU5HX0NMQVNTKSAmJiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKCk7Ci0JCX0gZWxzZSBpZiAoTU9ESUZJRVJfUFVCTElDLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoTU9ESUZJRVJfQUJTVFJBQ1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChDT05TVFJVQ1RPUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGhhc1N1cGVyQ2xhc3MoKTsKLQkJfQotCQkvLyBPdGhlcndpc2UgcmV0dXJuIHN1cGVyIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGRhdGEgbW9kZWwncwotCSAqIHByb3BlcnRpZXMgYXMgdmFsaWQgYmFzZSBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQkvLyBBZGQgd2ViIGFydGlmYWN0IHNwZWNpZmljIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIGRhdGEgbW9kZWwKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLmFkZChESVNQTEFZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChERVNDUklQVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9FWElTVElOR19DTEFTUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9BTk5PVEFUSU9OUyk7Ci0JCQotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gZGVmYXVsdCB2YWx1ZXMgZm9yCi0JICogYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBkYXRhIG1vZGVsIGhpZXJhcmNoeS4gVGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgbWF5IHJldHVybiBudWxsLiBUaGlzIGltcGxlbWVudGF0aW9uIHNldHMKLQkgKiBhbm5vdGF0aW9uIHVzZSB0byBiZSB0cnVlLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdCBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfQU5OT1RBVElPTlMpKQotCQkJcmV0dXJuIHNob3VsZERlZmF1bHRBbm5vdGF0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKQotCQkJcmV0dXJuIERFRkFVTFRfU1VQRVJDTEFTUzsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfRVhJU1RJTkdfQ0xBU1MpKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OU1RSVUNUT1IpKQotCQkJcmV0dXJuIGhhc1N1cGVyQ2xhc3MoKTsKLQkJCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIHNwZWNpZmljIGJlaGF2aW9yIHdoZW4KLQkgKiBhIGNlcnRhaW4gcHJvcGVydHkgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5IGlzIHNldC4gdGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdCBhY2NlcHQgbnVsbCBmb3IgdGhlIHByb3BlcnR5IG5hbWUsIGJ1dCBpdCB3aWxsIGZvciBwcm9wZXJ0eVZhbHVlLiBJdAotCSAqIHdpbGwgbm90IHJldHVybiBudWxsLiBJdCB3aWxsIHJldHVybiBmYWxzZSBpZiB0aGUgc2V0IGZhaWxzLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gdmVyaWZpZXMgdGhlIGRpc3BsYXkgbmFtZSBpcyBzZXQgdG8gdGhlIGNsYXNzIG5hbWUsIHRoYXQKLQkgKiB0aGUgYW5ub3RhdGlvbnMgaXMgZGlzYWJsZWQvZW5hYmxlZCBwcm9wZXJseSwgYW5kIHRoYXQgdGhlIHRhcmdldCBwcm9qZWN0Ci0JICogbmFtZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdXJjZSBmb2xkZXIgc2V0dGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI3Byb3BlcnR5U2V0KFN0cmluZywKLQkgKiAgICAgIE9iamVjdCkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gd2FzIHByb3BlcnR5IHNldD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQkvLyBJZiBhbm5vdGF0aW9ucyBpcyBjaGFuZ2VkLCBub3RpZnkgYW4gZW5hYmxlbWVudCBjaGFuZ2UKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX0FOTk9UQVRJT05TKSkgewotCQkJdXNlQW5ub3RhdGlvbnMgPSAoKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJaWYgKHVzZUFubm90YXRpb25zICYmICFpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfQU5OT1RBVElPTlMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJLy8gSWYgdGhlIHNvdXJjZSBmb2xkZXIgaXMgY2hhbmdlZCwgZW5zdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgcHJvamVjdCBuYW1lCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7Ci0JCQkvLyBHZXQgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZSBzb3VyY2UgZm9sZGVyIG5hbWUKLQkJCVN0cmluZyBzb3VyY2VGb2xkZXIgPSAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlOwotCQkJaW50IGluZGV4ID0gc291cmNlRm9sZGVyLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gc291cmNlRm9sZGVyOwotCQkJaWYgKGluZGV4ID09IDApCi0JCQkJcHJvamVjdE5hbWUgPSBzb3VyY2VGb2xkZXIuc3Vic3RyaW5nKDEpOwotCQkJaW5kZXggPSBwcm9qZWN0TmFtZS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXByb2plY3ROYW1lID0gcHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlzZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBDYWxsIHN1cGVyIHRvIHNldCB0aGUgcHJvcGVydHkgb24gdGhlIGRhdGEgbW9kZWwKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkvLyBJZiBjbGFzcyBuYW1lIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgZGlzcGxheSBuYW1lIHRvIGJlIHRoZSBzYW1lCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENMQVNTX05BTUUpICYmICFtb2RlbC5pc1Byb3BlcnR5U2V0KERJU1BMQVlfTkFNRSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERJU1BMQVlfTkFNRSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCX0KLQkJLy8gQWZ0ZXIgdGhlIHByb3BlcnR5IGlzIHNldCwgaWYgcHJvamVjdCBjaGFuZ2VkLCB1cGRhdGUgdGhlIG5hdHVyZSBhbmQgdGhlIGFubm90YXRpb25zCi0JCS8vIGVuYWJsZW1lbnQKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09NUE9ORU5UX05BTUUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfQU5OT1RBVElPTlMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJLy8gQWZ0ZXIgcHJvcGVydHkgaXMgc2V0LCBpZiBhbm5vdGF0aW9ucyBpcyBzZXQgdG8gdHJ1ZSwgdXBkYXRlIGl0cyB2YWx1ZSBiYXNlZCBvbiB0aGUgbmV3Ci0JCS8vIGxldmVsIG9mIHRoZSBwcm9qZWN0Ci0JCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0FOTk9UQVRJT05TKSkgewotCQkJaWYgKCFpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkpCi0JCQkJc2V0Qm9vbGVhblByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUywgZmFsc2UpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9FWElTVElOR19DTEFTUykpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRV9BTk5PVEFUSU9OUywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCQotCQkJaWYgKCgoQm9vbGVhbikgcHJvcGVydHlWYWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljbGFzc05hbWVDYWNoZSA9IGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkJCXNldFByb3BlcnR5KENMQVNTX05BTUUsIGV4aXN0aW5nQ2xhc3NOYW1lQ2FjaGUpOwotCQkJfSBlbHNlIHsKLQkJCQlleGlzdGluZ0NsYXNzTmFtZUNhY2hlID0gZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7Ci0JCQkJc2V0UHJvcGVydHkoQ0xBU1NfTkFNRSwgY2xhc3NOYW1lQ2FjaGUpOwotCQkJfQotCQl9Ci0JCS8vIGlmIHN1cGVyIGNsYXNzIGlzIGNoYW5nZWQsIG5vdGlmeSB0aGUgY29uc3RydWN0b3IgY2hlY2tib3ggdG8gdXBkYXRlCi0JCS8vIGl0cyBlbmFibGVkIHN0YXRlCi0JCWlmIChTVVBFUkNMQVNTLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05TVFJVQ1RPUiwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCWlmICghaGFzU3VwZXJDbGFzcygpKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OU1RSVUNUT1IsIG51bGwpOwotCQkJfQotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OU1RSVUNUT1IsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQl9Ci0JCQotCQkvLyBSZXR1cm4gd2hldGhlciBwcm9wZXJ0eSB3YXMgc2V0Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW5ub3RhdGlvbnMgc2hvdWxkIHRyeSB0byBlbmFibGUKLQkgKiBiYXNlZCBvbiB3b3Jrc3BhY2Ugc2V0dGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIGRvZXMgYW55IHZhbGlkIGFubm90YXRpb24gcHJvdmlkZXIgb3IgeGRvY2xldCBoYW5kbGVyIGV4aXN0Ci0JICovCi0JLy9UT0RPIGFkZCB0aGlzIG1ldGhvZCBiYWNrIGluIGZvciBkZWZlY3QgMTQ2Njk2Ci0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm92aWRlckRlZmluZWQoKSB7Ci0vLwkJYm9vbGVhbiBpc0NvbnRyb2xsZXJFbmFibGVkID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5pc0FueUFubm90YXRpb25zU3VwcG9ydGVkKCk7Ci0vLwkJZmluYWwgU3RyaW5nIHByZWZlcnJlZCA9IEFubm90YXRpb25QcmVmZXJlbmNlU3RvcmUuZ2V0UHJvcGVydHkoQW5ub3RhdGlvblByZWZlcmVuY2VTdG9yZS5BTk5PVEFUSU9OUFJPVklERVIpOwotLy8JCUlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyID0gbnVsbDsKLS8vCQlib29sZWFuIGlzUHJvdmlkZXJFbmFibGVkID0gZmFsc2U7Ci0vLwkJaWYgKHByZWZlcnJlZCAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlhbm5vdGF0aW9uUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbGl0aWVzLmZpbmRBbm5vdGF0aW9uUHJvdmlkZXJCeU5hbWUocHJlZmVycmVkKTsKLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7IAotLy8JCQkJLy9EZWZhdWx0Ci0vLwkJCX0KLS8vCQkJaWYgKGFubm90YXRpb25Qcm92aWRlciAhPSBudWxsICYmIGFubm90YXRpb25Qcm92aWRlci5pc1ZhbGlkKCkpCi0vLwkJCQlpc1Byb3ZpZGVyRW5hYmxlZCA9IHRydWU7Ci0vLwkJfQotLy8JCXJldHVybiBpc0NvbnRyb2xsZXJFbmFibGVkIHx8IGlzUHJvdmlkZXJFbmFibGVkOwotLy8JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgdmFsaWQgYW5ub3RhdGlvbiBwcm92aWRlcnMgZXhpc3QgYW5kIGlmCi0JICogdmFsaWQgcHJvamVjdCB2ZXJzaW9uIGxldmVscyBleGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHNob3VsZCBhbm5vdGF0aW9ucyBiZSBzdXBwb3J0ZWQgZm9yIHRoaXMgcHJvamVjdCBpbiB0aGlzCi0JICogICAgICAgICB3b3Jrc3BhY2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkgewotCQkvL1RPRE8gYWRkIHRoaXMgY2hlY2sgYmFjayBpbiBmb3IgZGVmZWN0IDE0NjY5NgotLy8JCWlmICghaXNBbm5vdGF0aW9uUHJvdmlkZXJEZWZpbmVkKCkpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KFBST0pFQ1RfTkFNRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCVN0cmluZyBtb2R1bGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoQ09NUE9ORU5UX05BTUUpOwotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IG1vZHVsZU5hbWUgPT0gbnVsbCB8fCBtb2R1bGVOYW1lLmVxdWFscygiIikpcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGoyZWVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKHByb2plY3QpKTsKLQkJCi0JCXJldHVybiBqMmVlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gdmFsaWRhdGlvbiBvbiBhbnkKLQkgKiBvZiB0aGUgdmFsaWQgZGF0YSBtb2RlbCBwcm9wZXJ0aWVzIGluIHRoZSBoaWVyYXJjaHkuIEl0IGRvZXMgbm90IGFjY2VwdCBhCi0JICogbnVsbCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgcHJvcGVydHkgdmFsdWUgdmFsaWQ/Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSkgewotCQkJLy8gSWYgb3VyIGRlZmF1bHQgaXMgdGhlIHN1cGVyY2xhc3MsIHdlIGtub3cgaXQgaXMgb2sKLQkJCWlmIChnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLmVxdWFscyhERUZBVUxUX1NVUEVSQ0xBU1MpKQkJCQotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDTEFTU19OQU1FKSkgewotCQkJaWYgKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkubGVuZ3RoKCkgIT0wICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfRVhJU1RJTkdfQ0xBU1MpKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSBkZWZlciB0byBzdXBlciB0byB2YWxpZGF0ZSB0aGUgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgcHJvdmlkZXMgYSBzaW1wbGUKLQkgKiBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIGVudHJpZXMgaW4gYSBsaXN0LiBJdCB3aWxsCi0JICogYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZUluaXRQYXJhbUxpc3QoTGlzdCkKLQkgKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVVUkxNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gYm9vbGVhbiBhcmUgdGhlcmUgZHVwcyBpbiB0aGUgbGlzdD8KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5TdHJpbmdBcnJheUxpc3QoTGlzdCBpbnB1dCkgewotCQkvLyBJZiBsaXN0IGlzIG51bGwgb3IgZW1wdHkgcmV0dXJuIGZhbHNlCi0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJYm9vbGVhbiBkdXAgPSBmYWxzZTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJU3RyaW5nW10gc0FycmF5MSA9IChTdHJpbmdbXSkgaW5wdXQuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7Ci0JCQkJU3RyaW5nW10gc0FycmF5MiA9IChTdHJpbmdbXSkgaW5wdXQuZ2V0KGopOwotCQkJCWlmIChpc1R3b1N0cmluZ0FycmF5c0VxdWFsKHNBcnJheTEsIHNBcnJheTIpKSB7Ci0JCQkJCWR1cCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkdXApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gUmV0dXJuIGJvb2xlYW4gc3RhdHVzIGZvciBkdXBsaWNhdGVzCi0JCXJldHVybiBkdXA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlCi0JICogdHdvIHN0cmluZyBhcnJheXMgYXJlIGVxdWFsLiBJZiBlaXRoZXIgb2YgdGhlIGFycmF5cyBhcmUgbnVsbCBvciBlbXB0eSwKLQkgKiBpdCByZXR1cm5zIGZhbHNlLgotCSAqIAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciNoYXNEdXBsaWNhdGVzSW5TdHJpbmdBcnJheUxpc3QoTGlzdCkKLQkgKiAKLQkgKiBAcGFyYW0gc0FycmF5MQotCSAqIEBwYXJhbSBzQXJyYXkyCi0JICogQHJldHVybiBib29sZWFuIGFyZSBBcnJheXMgZXF1YWw/Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUd29TdHJpbmdBcnJheXNFcXVhbChTdHJpbmdbXSBzQXJyYXkxLCBTdHJpbmdbXSBzQXJyYXkyKSB7Ci0JCS8vIElmIGVpdGhlciBhcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKHNBcnJheTEgPT0gbnVsbCB8fCBzQXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBuMSA9IHNBcnJheTEubGVuZ3RoOwotCQlpbnQgbjIgPSBzQXJyYXkxLmxlbmd0aDsKLQkJLy8gSWYgZWl0aGVyIGFycmF5IGlzIGVtcHR5LCByZXR1cm4gZmFsc2UKLQkJaWYgKG4xID09IDAgfHwgbjIgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSWYgdGhleSBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgcmV0dXJuIGZhbHNlCi0JCWlmIChuMSAhPSBuMikKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSWYgdGhlaXIgZmlyc3QgZWxlbWVudHMgZG8gbm90IG1hdGNoLCByZXR1cm4gZmFsc2UKLQkJaWYgKCFzQXJyYXkxWzBdLmVxdWFscyhzQXJyYXkyWzBdKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gT3RoZXJ3aXNlIHJldHVybiB0cnVlCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1N1cGVyQ2xhc3MoKSB7Ci0JCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU1VQRVJDTEFTUyk7Ci0JCXJldHVybiAoc3VwZXJDbGFzcyA9PSBudWxsKSA/IGZhbHNlIDogc3VwZXJDbGFzcy50cmltKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbiBzaG91bGQgdGhlIGRlZmF1bHQgYW5ub3RhdGlvbnMgYmUgdHJ1ZT8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIHNob3VsZERlZmF1bHRBbm5vdGF0aW9ucygpIHsKLQkJaWYgKHVzZUFubm90YXRpb25zKQotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjg4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldGVFdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFRoZSBOZXdXZWJDbGFzc09wZXJhdGlvbiBpcyBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUgSURhdGFNb2RlbAotICogd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJdCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHRvIHByb3ZpZGUgd2ViIGFydGlmYWN0IHNwZWNpZmljIGphdmEKLSAqIGNsYXNzIGdlbmVyYXRpb24uCi0gKiBAc2VlIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHRvIGdlbmVyYXRlIGVpdGhlciBhbgotICogYW5ub3RhdGVkIG9yIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgd2ViIGFydGlmYWN0LiBJdCBzaGFyZXMKLSAqIHRoZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHRvIHN0b3JlIHRoZQotICogYXBwcm9wcmlhdGUgcHJvcGVydGllcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHdlYiBhcnRpZmFjdC4KLSAqIAotICogQHNlZSBBZGRXZWJDbGFzc09wZXJhdGlvbgotICogQHNlZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEluIHRoZSBhbm5vdGF0ZWQgY2FzZSwgYSBXVFBKZXRFbWl0dGVyIGxpc3RlbmVyIHRlbXBsYXRlIGlzIGNyZWF0ZWQgYW5kIHVzZWQKLSAqIHRvIGdlbmVyYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIEluIHRoZSBub24gYW5ub3RhdGVkIGNhc2UsIHRoZSBzYW1lIGVtaXR0ZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGgKLSAqIHRoZSBub24gYW5ub3RhdGVkIHdlYiBhcnRpZmFjdCB0ZW1wbGF0ZSBzbyB0aGUgYW5ub3RhdGVkIHRhZ3MgYXJlIG9taXR0ZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyB3ZWIKLSAqIGFydGlmYWN0IGphdmEgY2xhc3MgZ2VuZXJhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIG1heSBiZSBleHRlbmRlZCB0byBkbyBzby4KLSAqIEFsc28sIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMgaXMgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIFhEb2NsZXQgZmFjZXQgY29uc3RhbnRzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVF9XRUJfWERPQ0xFVF9WRVJTSU9OID0gIjEuMi4zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIHZhcmlhYmxlIGZvciB0aGUgd2ViIHBsdWdpbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QTFVHSU4gPSAiV0VCX1BMVUdJTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYQotCSAqIE5ld1dlYkNsYXNzT3BlcmF0aW9uLiBBbiBpbnN0YW5jZSBvZiB0aGUgTmV3V2ViQ2xhc3NEYXRhTW9kZWwgc2hvdWxkIGJlCi0JICogcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3V2ViQ2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gdGVtcGxhdGUgYmFzZWQKLQkgKiBjcmVhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgd2ViIGFydGlmYWN0IGphdmEgY2xhc3MgZmlsZS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHVzZXMgdGhlIGNyZWF0aW9uIG9mIGEgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsIGFuZCB0aGUgV1RQSmV0RW1pdHRlcgotCSAqIHRvIGNyZWF0ZSB0aGUgamF2YSBjbGFzcyB3aXRoIHRoZSBhbm5vdGF0ZWQgdGFncy4gVGhpcyBtZXRob2QgYWNjZXB0cwotCSAqIG51bGwgZm9yIG1vbml0b3IsIGl0IGRvZXMgbm90IGFjY2VwdCBudWxsIGZvciBmcmFnbWVudC4gSWYgYW5ub3RhdGlvbnMKLQkgKiBhcmUgbm90IGJlaW5nIHVzZWQgdGhlIHRhZ3Mgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIGNsYXNzLgotCSAqIAotCSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsCi0JICogQHNlZSAjZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwsIElQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gZnJhZ21lbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCkgdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBDcmVhdGUgdGhlIHdlYiBhcnRpZmFjdCB0ZW1wbGF0ZSBtb2RlbAotCQlDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgdGVtcE1vZGVsID0gY3JlYXRlVGVtcGxhdGVNb2RlbCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQlTdHJpbmcgc291cmNlOwotCQl0cnkgewotCQkJLy8gZ2VuZXJhdGUgdGhlIGphdmEgc291cmNlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBtb2RlbAotCQkJc291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShXZWJQbHVnaW4uZ2V0UGx1Z2luKCksIHRlbXBNb2RlbCwgZ2V0VGVtcGxhdGVGaWxlKCksIGdldFRlbXBsYXRlSW1wbGVtZW50YXRpb24oKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV0ZUV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBqYXZhIGZpbGUKLQkJCVN0cmluZyBqYXZhRmlsZU5hbWUgPSB0ZW1wTW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKyBET1RfSkFWQTsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lKTsKLQkJCS8vIEFkZCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgamF2YSBmaWxlCi0JCQlpZiAoY3UgPT0gbnVsbCB8fCAhY3UuZXhpc3RzKCkpCi0JCQkJY3UgPSBmcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lLCBzb3VyY2UsIHRydWUsIG1vbml0b3IpOwotCQkJSUZpbGUgYUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7Ci0JCQkvLyBMZXQgdGhlIGFubm90YXRpb25zIGNvbnRyb2xsZXIgcHJvY2VzcyB0aGUgYW5ub3RhdGVkIHJlc291cmNlCi0JCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHByb2plY3QpOwotCQkJaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkKLQkJCQljb250cm9sbGVyLnByb2Nlc3MoYUZpbGUpOwotCQl9Ci0JCQotCQkvLyBBZGQgdGhlIHhkb2NsZXQgZmFjZXQsIGlmIG5lY2Vzc2FyeSwgZm9yIHhkb2NsZXQgbGlzdGVuZXIgY3JlYXRpb24KLQkJdHJ5IHsKLQkJCWluc3RhbGxYRG9jbGV0RmFjZXRJZk5lY2Vzc2FyeShtb25pdG9yLCBwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXRlRXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgYWRkIGFuIHdlYmRvY2xldCBmYWNldCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxYRG9jbGV0RmFjZXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQlTZXQgZml4ZWRGYWNldHMgPSBmYWNldGVkUHJvamVjdC5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCwgSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9YRE9DTEVUKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSlNUX1dFQl9YRE9DTEVUX1ZFUlNJT04pOwotCQlJRGF0YU1vZGVsIGZkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlmZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGZkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCW1hcC5hZGQoZG0pOwotCi0JCWZkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJZmFjZXRlZFByb2plY3Quc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKGZpeGVkRmFjZXRzKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGFkZCBhbiAKLQkgKiB3ZWJkb2NsZXQgZmFjZXQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsWERvY2xldEZhY2V0SWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotCQkvLyBJZiBub3QgdXNpbmcgYW5ub3RhdGlvbnMsIGlnbm9yZSB0aGUgeGRvY2xldCBmYWNldAotCQlpZiAoIW1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gSWYgYW4gZXh0ZW5kZWQgYW5ub3RhdGlvbnMgcHJvY2Vzc29yIGlzIGFkZGVkLCBpZ25vcmUgdGhlIGRlZmF1bHQgeGRvY2xldCBvbmUKLQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5nZXREZXNjcmlwdG9yKGdldFRhcmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gT3RoZXJ3aXNlIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHhkb2NsZXQgZmFjZXQgaXMgb24gdGhlIHByb2plY3QgeWV0Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYgKCFmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoV2ViRmFjZXRVdGlscy5XRUJfWERPQ0xFVF9GQUNFVCkpCi0JCQlyZXR1cm47Ci0JCQkKLQkJLy8gSW5zdGFsbCB4ZG9jbGV0IGZhY2V0Ci0JCWluc3RhbGxYRG9jbGV0RmFjZXQobW9uaXRvciwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIHRoYXQgd2lsbCBiZQotCSAqIHBhc3NlZCB0byB0aGUgV1RQSkVURW1pdHRlciB0byBnZW5lcmF0ZSB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24KLQkgKiBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhdGggdG8gdGhlIHRlbXBsYXRlIGZpbGUuIAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGVtcGxhdGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgKiB0aGF0IGlzIHN0YXRpY2FsbHkgY29tcGlsZWQgaW4gdGhlIHBsdWdpbi4gVGhpcyBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0bwotCSAqIGdlbmVyYXRlIHRoZSBhcnRpZmFjdCdzIGNvZGUgd2l0aG91dCB1c2luZyB0aGUgV1RQSkVURW1pdHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCk7Ci0KLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGdldFRhcmdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFRhcmdldFByb2plY3QoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxMWE2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0dFTkVSSUNfU0VSVkxFVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKFFVQUxJRklFRF9IVFRQX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChoYXNTdXBlcmNsYXNzKGRhdGFNb2RlbCwgZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpLCBRVUFMSUZJRURfSFRUUF9TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoUVVBTElGSUVEX0hUVFBfU0VSVkxFVC5lcXVhbHMoZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKFFVQUxJRklFRF9HRU5FUklDX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChoYXNTdXBlcmNsYXNzKGRhdGFNb2RlbCwgZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpLCBRVUFMSUZJRURfR0VORVJJQ19TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2bGV0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoUVVBTElGSUVEX0hUVFBfU0VSVkxFVC5lcXVhbHMoZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKFFVQUxJRklFRF9HRU5FUklDX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChnZXRJbnRlcmZhY2VzKGRhdGFNb2RlbCkuY29udGFpbnMoUVVBTElGSUVEX1NFUlZMRVQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoaGFzU3VwZXJJbnRlcmZhY2UoZGF0YU1vZGVsLCBnZXRTdXBlcmNsYXNzKGRhdGFNb2RlbCksIFFVQUxJRklFRF9TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChPYmplY3QgaWZhY2UgOiBnZXRJbnRlcmZhY2VzKGRhdGFNb2RlbCkpIHsKLQkJCWlmIChoYXNTdXBlckludGVyZmFjZShkYXRhTW9kZWwsIChTdHJpbmcpIGlmYWNlLCBRVUFMSUZJRURfU0VSVkxFVCkpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODFlMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZsZXRUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmxldFRlbXBsYXRlCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTZXJ2bGV0VGVtcGxhdGUgY3JlYXRlKFN0cmluZyBsaW5lU2VwYXJhdG9yKQotICB7Ci0gICAgbmwgPSBsaW5lU2VwYXJhdG9yOwotICAgIFNlcnZsZXRUZW1wbGF0ZSByZXN1bHQgPSBuZXcgU2VydmxldFRlbXBsYXRlKCk7Ci0gICAgbmwgPSBudWxsOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiLyoqIiArIE5MICsgIiAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLnNlcnZsZXQiICsgTkwgKyAiICogICBuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEwID0gIlwiIiArIE5MICsgIiAqICAgZGlzcGxheS1uYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAiICogICBkZXNjcmlwdGlvbj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuc2VydmxldC1tYXBwaW5nIiArIE5MICsgIiAqICAgdXJsLXBhdHRlcm49XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTUgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLnNlcnZsZXQtaW5pdC1wYXJhbSIgKyBOTCArICIgKiAgICBuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIlwiIiArIE5MICsgIiAqICAgIHZhbHVlPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gTkwgKyAiICogICAgZGVzY3JpcHRpb249XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSBOTCArICIgKi8iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjIgPSBOTCArICJwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gImFic3RyYWN0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICJmaW5hbCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIiBleHRlbmRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9ICIgaW1wbGVtZW50cyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiLCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjkgPSAiIHsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSBOTCArICJcdHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9IE5MICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCkgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9IE5MICsgIiAgICAgICAiICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzQgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM2ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNyA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM4ID0gIikgeyIgKyBOTCArICIgICAgICAgIHN1cGVyKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOSA9ICIpOyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiICAgICAqIEBzZWUgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIiMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIpIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDQgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ2ID0gIikgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSBOTCArICJcdFx0XHRyZXR1cm4gIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ4ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDkgPSBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIFNlcnZsZXQjaW5pdChTZXJ2bGV0Q29uZmlnKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNkZXN0cm95KCkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBkZXN0cm95KCkgeyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I2dldFNlcnZsZXRDb25maWcoKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0XHRyZXR1cm4gbnVsbDsiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNnZXRTZXJ2bGV0SW5mbygpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdHJldHVybiBudWxsOyAiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU1ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTYgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU3ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU4ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTkgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvSGVhZChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjEgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb09wdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYyID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYzID0gTkwgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY0ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotICAgIAotCW1vZGVsLnJlbW92ZUZsYWdzKENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbC5GTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpOyAKLQotICAgIAotCWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSAhPSBudWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgCi0JQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKCk7Ci0JZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGFuSW1wb3J0ICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgICAKLQlpZiAobW9kZWwuaXNBbm5vdGF0ZWQoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTZXJ2bGV0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTZXJ2bGV0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKLSAgICAgCi0JCWlmIChtb2RlbC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwgJiYgbW9kZWwuZ2V0RGVzY3JpcHRpb24oKS5sZW5ndGgoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOwotICAgICAKLQkJfSAKLQkJCi0JCUxpc3Q8U3RyaW5nW10+IG1hcHBpbmdzID0gbW9kZWwuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0gCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiBtYXBwaW5ncy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1hcCA9IG1vZGVsLmdldFNlcnZsZXRNYXBwaW5nKGkpOyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1hcCApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNSk7Ci0gICAgIAotCQkJfSAKLQkJfQotIAkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IG1vZGVsLmdldEluaXRQYXJhbXMoKTsKLSAJCWlmIChpbml0UGFyYW1zICE9IG51bGwgJiYgaW5pdFBhcmFtcy5zaXplKCkgPiAwKSB7Ci0gICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRQYXJhbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG1vZGVsLmdldEluaXRQYXJhbShpLCBDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5OQU1FKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuVkFMVUUpOwotIAkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuREVTQ1JJUFRJT04pOyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOwotICAgICAKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlc2NyaXB0aW9uICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIwKTsKLSAgICAKLQkJCQl9Ci0JCQl9IAotCQl9IAotCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjEpOwotICAgIAotCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5pc0Fic3RyYWN0KCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIAotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIAotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBzdXBlckNsYXNzICk7Ci0gICAgCi0JfQotCi0JTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7Ci0gICAgCi0JCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIElOVEVSRkFDRSApOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOSk7Ci0gICAgIAotCWlmIChtb2RlbC5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICAgCi0JfSAKLQotICAgICAKLQlpZiAoIW1vZGVsLmhhc0VtcHR5U3VwZXJjbGFzc0NvbnN0cnVjdG9yKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5zaG91bGRHZW5TdXBlcmNsYXNzQ29uc3RydWN0b3JzKCkpIHsKLQkJTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gbW9kZWwuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5pc1B1YmxpYygpIHx8IGNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOSk7Ci0gICAgCi0JCQl9IAotCQl9IAotCX0gCi0KLSAgICAKLQlpZiAobW9kZWwuc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbW9kZWwuZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Mik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Myk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDYpOwotICAgICAKLQkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7Ci0JCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlZmF1bHRSZXR1cm5WYWx1ZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OCk7Ci0gICAgCi0JCQl9IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ5KTsKLSAgICAgCi0JCX0KLQl9IAotCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Jbml0KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUwKTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTEpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Mik7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5HZXRTZXJ2bGV0SW5mbygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Myk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5TZXJ2aWNlKCkgJiYgIW1vZGVsLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlblNlcnZpY2UoKSAmJiBtb2RlbC5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NSk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb0dldCgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nik7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb1Bvc3QoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTcpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9QdXQoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTgpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9EZWxldGUoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9IZWFkKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYwKTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvT3B0aW9ucygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MSk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb1RyYWNlKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYyKTsKLSAgICAgfSAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82NCk7Ci0gICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RkMTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid2ViIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdlYk1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFSX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX1BST0pFQ1RfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9QUk9KRUNUX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1VSTF9QQVRURVJOX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9GSUxURVJfUEFSQU1FVEVSX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRElTUEFUQ0hFUl9UWVBFU19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1VSTF9QQVRURVJOX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfTUFQUElOR19MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfUEFUVEVSTl9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9GSUxURVJfTUFQUElOR19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRElTUExBWV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX0NMQVNTX05BTUVfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9KQVZBX0NMQVNTX05BTUVfSU5WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1NFUlZMRVRfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFUlZMRVRfRElTUExBWV9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9WQUxVRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9QQVJBTUVURVJfVkFMVUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFUlZMRVRfUk9MRV9SRUZfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9ST0xFX1JFRl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1JPTEVfTElOS19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9JTlRFUkZBQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRklMVEVSX0RJU1BMQVlfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRklMVEVSX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9DTEFTU19OQU1FX1VTRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9DTEFTU19OQU1FX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0xJU1RFTkVSX0RJU1BMQVlfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTElTVEVORVJfQ0xBU1NfTkFNRV9VU0VEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MSVNURU5FUl9DTEFTU19OQU1FX0lOVkFMSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfUEFHRV9FTkNPRElOR19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfUEFHRV9FTkNPRElOR19FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVVJMX1BBVFRFUk5fRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0lOQ0xVREVfUFJFTFVERVNfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0lOQ0xVREVfQ09EQVNfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFQ1VSSVRZX0NPTlNUUkFJTlRfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VDVVJJVFlfQ09OU1RSQUlOVF9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9DT05URVhUX1BBUkFNRVRFUl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9DT05URVhUX1BBUkFNRVRFUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9SRVNPVVJDRV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9SRVNPVVJDRV9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfUEFUVEVSTlNfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX01JTUVfTUFQUElOR19FWFRFTlNJT05fRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX01JTUVfTUFQUElOR19FWFRFTlNJT05fRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1dFTENPTUVfUEFHRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfV0VMQ09NRV9QQUdFX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9FTlZfRU5UUllfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRU5WX0VOVFJZX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VSUk9SX0NPREVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VSUk9SX0NPREVfTVVTVF9CRV8zX0RJR0lUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9NVVNUX1NUQVJUX1dJVEhfU0xBU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9UWVBFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9FWENFUFRJT05fU0VDVVJJVFlfSURfTk9fQkVBTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0xPQ0FMRV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MT0NBTEVfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVEFHTElCUkVGX1VSTF9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVEFHTElCUkVGX1VSTF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9NRVRIT0RfRUxFTUVOVF9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVhDRVBUSU9OX01FVEhPRF9UUkFOU0FDVElPTl9BVFRSSUJVVEVTX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX0xJU1RfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MSVNURU5FUl9MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9OT19MSVNURU5FUl9TRUxFQ1RFRDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdlYk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYk1vZHVsZUV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYk1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkM2Y5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3BsdWdpbi9XZWJNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFSmF2YVByb2plY3RJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbCBleHRlbmRzIEVhck1vZHVsZUV4dGVuc2lvbkltcGwgaW1wbGVtZW50cyBXZWJNb2R1bGVFeHRlbnNpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdlYk1vZHVsZUV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZVByb2plY3RJbmZvKCkKLQkgKi8KLQlwdWJsaWMgSjJFRUphdmFQcm9qZWN0SW5mbyBjcmVhdGVQcm9qZWN0SW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb24jYWRkV0xQUHJvamVjdHMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBqYXZhLnV0aWwuU2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdMUFByb2plY3RzKElQcm9qZWN0IGFQcm9qZWN0LCBTZXQgcHJvamVjdHNUb0J1aWxkKSB7Ci0JCS8vIEoyRUVXZWJOYXR1cmVSdW50aW1lIG5hdHVyZSA9IEoyRUVXZWJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoYVByb2plY3QpOwotCQkvLyBpZiAobmF0dXJlID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gSUxpYk1vZHVsZVtdIGxpYk1vZHVsZXMgPSBuYXR1cmUuZ2V0TGliTW9kdWxlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGxpYk1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gSVByb2plY3QgcCA9IGxpYk1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpOwotCQkvLyBpZiAocC5pc0FjY2Vzc2libGUoKSkKLQkJLy8gcHJvamVjdHNUb0J1aWxkLmFkZChsaWJNb2R1bGVzW2ldLmdldFByb2plY3QoKSk7Ci0JCS8vIH0KLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLldlYk1vZHVsZUV4dGVuc2lvbiNzZXRDb250ZXh0Um9vdEZvck1vZHVsZU1hcHBpbmcob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uV2ViTW9kdWxlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFJvb3RGb3JNb2R1bGVNYXBwaW5nKFdlYk1vZHVsZSB3ZWJNb2R1bGUsIElQcm9qZWN0IG5lc3RlZFByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gVE9ETyBtaWdyYXRlIHRvIGZsZXggcHJvamVjdAotCQkJLy8gd2ViRWRpdCA9IChXZWJBcnRpZmFjdEVkaXQpIFN0cnVjdHVyZUVkaXQuZ2V0Rmlyc3RBcnRpZmFjdEVkaXRGb3JSZWFkKCBuZXN0ZWRQcm9qZWN0Ci0JCQkvLyApOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCXdlYkVkaXQuc2V0U2VydmVyQ29udGV4dFJvb3Qod2ViTW9kdWxlLmdldENvbnRleHRSb290KCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQkvLyBpZiAod25yICE9IG51bGwpIHsKLQkJLy8gd25yLnNldENvbnRleHRSb290KHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLldlYk1vZHVsZUV4dGVuc2lvbiNoYXNSdW50aW1lKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyByZXR1cm4gSjJFRVdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuaGFzSjJFRVJ1bnRpbWUocHJvamVjdCk7Ci0JCS8vIFRvIGRvOiB3b3JrIGJhc2VkIG9uIG1vZHVsZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIEoyRUVJbXBvcnRPcGVyYXRpb25PTEQgY3JlYXRlSW1wb3J0T3BlcmF0aW9uKElQcm9qZWN0Ci0JLy8gbmVzdGVkUHJvamVjdCwgV0FSRmlsZSB3YXJGaWxlLCBFQVJJbXBvcnRDb25maWd1cmF0aW9uIGltcG9ydENvbmZpZyl7Ci0JLy8gV2FySW1wb3J0T3BlcmF0aW9uIG9wID0gbmV3IFdhckltcG9ydE9wZXJhdGlvbihuZXN0ZWRQcm9qZWN0LCB3YXJGaWxlKTsKLQkvLyAvL29wLnNldFNlcnZlclRhcmdldChpbmZvLmdldFNlcnZlclRhcmdldCgpKTsKLQkvLyBIYXNoTWFwIG9wTWFwID0gaW1wb3J0Q29uZmlnLmNyZWF0ZVByb2plY3RPcHRpb247Ci0JLy8gaWYob3BNYXAgIT0gbnVsbCAmJiAhb3BNYXAuaXNFbXB0eSgpKQotCS8vIG9wLmNyZWF0ZVdMUHJvamVjdE9wdGlvbnMgPSBvcE1hcDsKLQkvLyByZXR1cm4gb3A7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uI2dldENvbnRlbnRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5GaWxlKQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QsIElGaWxlIHdlYlNldHRpbmdzRmlsZSkgewotCQlTdHJpbmcgY29udGVudEZvbGRlciA9IG51bGw7Ci0KLQkJLy8gV2ViU2V0dGluZ3Mgd2ViU2V0dGluZ3MgPSBuZXcgV2ViU2V0dGluZ3MocHJvamVjdCwgd2ViU2V0dGluZ3NGaWxlKTsKLQkJLy8gaWYgKHdlYlNldHRpbmdzICE9IG51bGwpIHsKLQkJLy8gY29udGVudEZvbGRlciA9IHdlYlNldHRpbmdzLmdldFdlYkNvbnRlbnROYW1lKCk7Ci0JCS8vIH0KLQkJLy8gVG8gZG86IE5lZWRzIHdvcmsgaGVyZSwgbm8gY29udGVudCBmb2xkZXIgZXhpc3RzIG5vdwotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG1pZ3JhdGUgdG8gZmxleCBwcm9qZWN0Ci0JCQkvLyB3ZWJFZGl0ID0gKFdlYkFydGlmYWN0RWRpdCkgU3RydWN0dXJlRWRpdC5nZXRGaXJzdEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKSB7Ci0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudEZvbGRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb24jY29tcGFyZVdlYkNvbnRleHRSb290KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLk1vZHVsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbXBhcmVXZWJDb250ZXh0Um9vdChNb2R1bGUgbW9kdWxlLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9ICgoV2ViTW9kdWxlKSBtb2R1bGUpLmdldENvbnRleHRSb290KCk7Ci0JCWlmIChjb250ZXh0Um9vdCAhPSBudWxsKQotCQkJcmV0dXJuICgoY29udGV4dFJvb3QpLmVxdWFscyhnZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0KSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gbWlncmF0ZSB0byBmbGV4IHByb2plY3QKLQkJCS8vIHdlYkVkaXQgPSAoV2ViQXJ0aWZhY3RFZGl0KSBTdHJ1Y3R1cmVFZGl0LmdldEZpcnN0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gd2ViRWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVJbXBvcnREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZUltcG9ydERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYlBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wbHVnaW4vV2ViUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Yzk3NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wbHVnaW4vV2ViUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudXRpbC5XZWJFZGl0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB0b3AtbGV2ZWwgY2xhc3Mgb2YgdGhlIGoyZWUgcGx1Z2luLgotICogIAotICovCi0KLXB1YmxpYyBjbGFzcyBXZWJQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCS8vIERlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyCi0JcHJpdmF0ZSBzdGF0aWMgV2ViUGx1Z2luIGluc3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIElQYXRoIGljb25zRm9sZGVyID0gbmV3IFBhdGgoUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkuZ2V0RW50cnkoImljb25zIikuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCS8vIExpbmtzIFZpZXcgcGFydCBvZiB0aGUgcGx1Z2luCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19CVUlMREVSX0lEID0KLQkvLyAiY29tLmlibS5ldG9vbHMubGlua3MubWFuYWdlbWVudC5saW5rc2J1aWxkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19CVUlMREVSX0lEID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLmFkZGl0aW9ucy5saW5rc2J1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gTGliRGlyIENoYW5nZSBMaXN0ZW5lcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQkRJUkNIQU5HRV9CVUlMREVSX0lEID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLkxpYkRpckJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBMaWJDb3B5IGJ1aWxkZXIgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJDT1BZX0JVSUxERVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuTGliQ29weUJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gVmFsaWRhdGlvbiBwYXJ0IG9mIHRoZSBwbHVnaW4KLQkvL0dsb2JhbCBSZXNvdXJjZVNldCAoc29tZXdoYXQgZ2xvYmFsKQotCXByaXZhdGUgc3RhdGljIElQYXRoIGxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSUNPTl9ESVJTID0gbmV3IFN0cmluZ1tdeyJpY29ucy9mdWxsL29iajE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N2aWV3MTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jbGNsMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvb3ZyMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvd2l6YmFuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSjJFRSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIFdlYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFdlYlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJcmV0dXJuIGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0SjJFRVdlYlByb2plY3RNaWdyYXRpb25FeHRlbnNpb25zKCkgewotCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChnZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIkoyRUVXZWJQcm9qZWN0TWlncmF0aW9uRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9uID0gcGN0LmdldEV4dGVuc2lvbnMoKTsKLQkJTGlzdCByZXQgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGwgPSAwOyBsIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytsKSB7Ci0JCQlJRXh0ZW5zaW9uIGNvbmZpZyA9IGV4dGVuc2lvbltsXTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY0VsZW1zID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZCA9IGNFbGVtc1tpXTsKLQkJCQlpZiAoZC5nZXROYW1lKCkuZXF1YWxzKCJtaWdyYXRpb24iKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG1lID0gZC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJydW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlyZXQuYWRkKG1lKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpcyBleHRlbnNpb24sIGtlZXAgZ29pbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRJbWFnZVVSTChrZXksIGdldEJ1bmRsZSgpKTsKLQl9Ci0KLQkvLyBJU1NVRTogdGhpcyBtZXRob2QgaXMgbmV2ZXIgdXNlZCBpbiBXVFAuIFNlZW1zIG5vIG5lZWQgdG8gYmUgQVBJCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbExvY2F0aW9uID0gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldExvY2F0aW9uKCk7Ci0JCQlsb2NhdGlvbiA9IG5ldyBQYXRoKGluc3RhbGxMb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGxvY2F0aW9uLSB0aGUgZGlyZWN0b3J5IHRoYXQgYWxsIHRoZSBwbHVnaW5zIGFyZSBsb2NhdGVkIGluIChpLmUuCi0JICogZDpcaW5zdGFsbGRpclxwbHVnaW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLnRvRXh0ZXJuYWxGb3JtKCkpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7ICAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLQkJCQlyZXR1cm4gbmV3IFBhdGgoaW5zdGFsbFN0cik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBTZXJ2bGV0cyBKYXIgZmlsZSBwYXRoIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCB0byB0aGUgc2VydmxldHMgamFyLCBvciBudWxsIGlmIG5ldmVyIHNwZWNpZmllZC4KLQkgKiBAZGVwcmVjYXRlZCAtIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGlzIG5vIGxvbmdlciBvbiB0aGlzIHBsdWdpbiBiZWNhdXNlIG9mIHRoZSBVSSBkZXBlbmRlbmN5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZVNlcnZsZXRzSmFyKCkgewotCQkvLwlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKElXZWJUb29saW5nQ29yZUNvbnN0YW50cy5QUk9QX1NFUlZMRVRfSkFSKTsKLQkJcmV0dXJuICJUSElTIElTIFRIRSBXUk9ORyBQQVRIIC0gTkVFRCBUTyBDSEFOR0UgSU1QTEVNRU5UQVRJT04hISEhISI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFNlcnZsZXRzIEphciBmaWxlIHBhdGggcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgZmlsZSBwYXRoIHRvIHRoZSBzZXJ2bGV0cyBqYXIsIG9yIG51bGwgaWYgbmV2ZXIgc3BlY2lmaWVkLgotCSAqIEBkZXByZWNhdGVkIC0gdGhlIHByZWZlcmVuY2Ugc3RvcmUgaXMgbm8gbG9uZ2VyIG9uIHRoaXMgcGx1Z2luIGJlY2F1c2Ugb2YgdGhlIFVJIGRlcGVuZGVuY3kuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlV2ViQVNKYXIoKSB7Ci0JCS8vcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhJV2ViVG9vbGluZ0NvcmVDb25zdGFudHMuUFJPUF9XRUJBU19KQVIpOwotCQlyZXR1cm4gIlRISVMgSVMgVEhFIFdST05HIFBBVEggLSBORUVEIFRPIENIQU5HRSBJTVBMRU1FTlRBVElPTiEhISEhIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbiBvcGVyYXRpb24sIGluIHJlc3BvbnNlIHRvIHNvbWUgb3RoZXIgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodCwKLQkgKiB0aGVuIHRoZSBjbGllbnQgY29kZSBzaG91bGQgdGhyb3cge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndmdC51dGlsLldGVFdyYXBwZWRFeGNlcHRpb259OwotCSAqIG90aGVyd2lzZSB0aGlzIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHNpZ25hbCBzb21lIG90aGVyIGVycm9yIGNvbmRpdGlvbiB3aXRoaW4gdGhlIG9wZXJhdGlvbiwKLQkgKiBvciB0byB0aHJvdyBhIGNvcmUgZXhjZXB0aW9uIGluIGEgY29udGV4dCBvdGhlciB0aGFuIGV4ZWN1dGluZyBhbiBvcGVyYXRpb24KLQkgKiAKLQkgKiBDcmVhdGUgYSBuZXcgSVN0YXR1cyBvZiB0eXBlIEVSUk9SIHVzaW5nIHRoZSBKMkVFUGx1Z2luIElELiBhQ29kZSBpcyBqdXN0IGFuIGludGVybmFsIGNvZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIG5ld0Vycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24sCi0JICogb3IgdG8gdGhyb3cgYSBjb3JlIGV4Y2VwdGlvbiBpbiBhIGNvbnRleHQgb3RoZXIgdGhhbiBleGVjdXRpbmcgYW4gb3BlcmF0aW9uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdFcnJvclN0YXR1cyhTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKDAsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdPcGVyYXRpb25GYWlsZWRTdGF0dXMoU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSVJlc291cmNlU3RhdHVzLk9QRVJBVElPTl9GQUlMRUQsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBJU3RhdHVzIHdpdGggYSBzZXZlcml0eSB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRC4gYUNvZGUgaXMganVzdCBhbiBpbnRlcm5hbCBjb2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRCdW5kbGUoKSwga2V5KTsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vV2ViQXBwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IFdlYkVkaXRBZGFwdGVyRmFjdG9yeSgpLCBBcnRpZmFjdEVkaXRNb2RlbC5jbGFzcyk7Ci0JfQotCi0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLQl7Ci0JCWZpbmFsIElMb2cgbG9nID0gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsKLQkJZmluYWwgU3RyaW5nIG1zZyA9ICJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iOwotCQkKLQkJbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9JU2VydmxldENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9JU2VydmxldENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc2NDIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvSVNlcnZsZXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZsZXRDb25zdGFudHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9JT19FWENFUFRJT04gPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0dFTkVSSUNfU0VSVkxFVCA9ICJqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFUlZMRVQgPSAiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0VYQ0VQVElPTiA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1NFUlZMRVRfQ09ORklHID0gImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUID0gImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1NFUlZMRVRfUkVTUE9OU0UgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVFVRVNUID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9GSUxURVIgPSAiamF2YXguc2VydmxldC5GaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0ZJTFRFUl9DT05GSUcgPSAiamF2YXguc2VydmxldC5GaWx0ZXJDb25maWciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0ZJTFRFUl9DSEFJTiA9ICJqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlQgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9FVkVOVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUiA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19FVkVOVCA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlQgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0lOSVQgPSAiaW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfREVTVFJPWSA9ICJkZXN0cm95IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUcgPSAiZ2V0U2VydmxldENvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfR0VUX1NFUlZMRVRfSU5GTyA9ICJnZXRTZXJ2bGV0SW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfU0VSVklDRSA9ICJzZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19HRVQgPSAiZG9HZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX1BPU1QgPSAiZG9Qb3N0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19QVVQgPSAiZG9QdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX0RFTEVURSA9ICJkb0RlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRE9fSEVBRCA9ICJkb0hlYWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX09QVElPTlMgPSAiZG9PcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19UUkFDRSA9ICJkb1RyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9UT19TVFJJTkcgPSAidG9TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX0ZJTFRFUiA9ICJkb0ZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0lOSVRfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9TZXJ2bGV0Q29uZmlnOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1lfU0lHTkFUVVJFID0gIigpViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9DT05GSUdfU0lHTkFUVVJFID0gIigpTGphdmF4L3NlcnZsZXQvU2VydmxldENvbmZpZzsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1NFUlZMRVRfSU5GT19TSUdOQVRVUkUgPSAiKClMamF2YS9sYW5nL1N0cmluZzsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TSUdOQVRVUkUgPSAiKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1NFUlZJQ0VfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fR0VUX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1BPU1RfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fUFVUX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX0RFTEVURV9TSUdOQVRVUkUgPSAiKExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZTspViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19IRUFEX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX09QVElPTlNfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fVFJBQ0VfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0lOSVRfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fRklMVEVSX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlO0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOylWIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3ZhbGlkYXRpb24vVXJsUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi92YWxpZGF0aW9uL1VybFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNzg5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3ZhbGlkYXRpb24vVXJsUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZCBmb3IgVVJMIHBhdHRlcm5zLgotICogCi0gKiA8cD4KLSAqIENvdWxkIGJlIHVzZWQgYnkgY29tcG9uZW50cyBkZWFsaW5nIHdpdGggVVJMIHBhdHRlcm5zIGxpa2U6IFNlcnZsZXQgYW5kCi0gKiBGaWx0ZXIgd2l6YXJkcywgd2ViLnhtbCB2YWxpZGF0b3JzLCBldGMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGNsYXNzIFVybFBhdHRlcm4gewotCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuIFVSTCBwYXR0ZXJuLgotCSAqIAotCSAqIEBwYXJhbSB1cmxQYXR0ZXJuCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgcGF0dGVybiB0byB2YWxpZGF0ZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdHRlcm4gaXMgYSB2YWxpZCBvbmUsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gLSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHVybFBhdHRlcm4pIHsKLQkJLy8gVVJMIFBhdHRlcm4gbXVzdCBub3QgYmUgZW1wdHkgc3RyaW5nCi0JCWlmICh1cmxQYXR0ZXJuLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gVVJMIFBhdHRlcm4gbXVzdCBub3QgY29udGFpbiBDYXJyaWFnZSBSZXR1cm4gY2hhcmFjdGVycwotCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCdccicpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIFVSTCBQYXR0ZXJuIG11c3Qgbm90IGNvbnRhaW4gTmV3IExpbmUgY2hhcmFjdGVycwotCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCdcbicpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIFBhdGggTWFwcGluZ3MgbXVzdCBub3QgY29udGFpbiAiKi4iIGNoYXJhY3RlciBzZXF1ZW5jZXMKLQkJaWYgKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCIqLiIpID09IC0xKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIEV4dGVuc2lvbiBNYXBwaW5ncyBtdXN0IG5vdCBjb250YWluICcvJyBjaGFyYWN0ZXJzCi0JCWlmICh1cmxQYXR0ZXJuLnN0YXJ0c1dpdGgoIiouIikpIHsKLQkJCWlmICh1cmxQYXR0ZXJuLmluZGV4T2YoJy8nKSA9PSAtMSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgVVJMIFBhdHRlcm4gaXMgbmVpdGhlciBhIFBhdGggTWFwcGluZywgbm9yIEV4dGVuc2lvbiBNYXBwaW5nCi0JCS8vIFRoZXJlZm9yZSwgaXQgaXMgaW52YWxpZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9BdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1M2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9BdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50fQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGF1dGhvcml0eV9jb25zdHJhaW50LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImF1dGhvcml0eV9jb25zdHJhaW50Iik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgc2VjQ29uc3RyYWludCBvZiB0aGUgQXV0aENvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChBdXRoQ29uc3RyYWludCkgb2JqZWN0KS5nZXRTZWNDb25zdHJhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJX19VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJEZXNjcmlwdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpKTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByb2xlcyBmZWF0dXJlLgotCQkJLy8KLQkJCVdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJvbGVzX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJvbGVzIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yb2xlc19wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcm9sZXMgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSwgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQVVUSF9DT05TVFJBSU5UX1JPTEVTX0VESVRPUik7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBzZWNDb25zdHJhaW50IGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VjQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZWNDb25zdHJhaW50IgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9zZWNDb25zdHJhaW50X3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBzZWNDb25zdHJhaW50IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSkpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhDb25zdHJhaW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCAvLyROT04tTkxTLTEkCi0JCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoQ29uc3RyYWludF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSJfVUlfQXV0aENvbnN0cmFpbnRfdHlwZSIpLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIHRydWUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvbGVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoQ29uc3RyYWludF9yb2xlc19mZWF0dXJlIiksIGdldFN0cmluZyggLy8kTk9OLU5MUy0xJAotCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aENvbnN0cmFpbnRfcm9sZXNfZmVhdHVyZSIsICJfVUlfQXV0aENvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X1JvbGVzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9ICgoQXV0aENvbnN0cmFpbnQpIG9iamVjdCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCUxpc3QgZGVzY0xpc3QgPSAoKEF1dGhDb25zdHJhaW50KSBvYmplY3QpLmdldERlc2NyaXB0aW9ucygpOwotCQkJaWYgKGRlc2NMaXN0ICE9IG51bGwgJiYgZGVzY0xpc3Quc2l6ZSgpID4gMCkKLQkJCQlkZXNjcmlwdGlvbiA9ICgoRGVzY3JpcHRpb24pIGRlc2NMaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjExY29uY2F0X1VJXyIsIChuZXcKLQkJCS8vIE9iamVjdFtde2Rlc2NyaXB0aW9ufSkpOyAvLyROT04tTkxTLTEkID0gIkF1dGhDb25zdHJhaW50IHswfSIKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoQ29uc3RyYWludC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RVJlZmVyZW5jZSgpOwotCQlpZiAoc2YgPT0gbnVsbCkgewotCQkJc2YgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVBdHRyaWJ1dGUoKTsKLQkJCWlmIChzZiAhPSBudWxsICYmICFzZi5pc01hbnkoKSkKLQkJCQlzZiA9IG51bGw7Ci0JCX0KLQkJaWYgKHNmICE9IG51bGwpIHsKLQkJCUVPYmplY3Qgb3duZXIgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpOwotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCk7Ci0JCQlpZiAoY29tbWFuZENsYXNzID09IEFkZENvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvd25lciwgc2YsIGNvbGxlY3Rpb24sIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0SW5kZXgoKSk7Ci0JCQl9IGVsc2UgaWYgKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb3duZXIsIHNmLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0NvbnRleHRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0NvbnRleHRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTEwZWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Db250ZXh0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW19Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIENvbnRleHRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGluaXRpYWxpel9wYXJhbWV0ZXJfY29udGV4dC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIENvbnRleHRQYXJhbS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBwYXJhbU5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQYXJhbU5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUGFyYW1OYW1lIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9wYXJhbU5hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHBhcmFtTmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHBhcmFtVmFsdWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQYXJhbVZhbHVlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlBhcmFtVmFsdWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3BhcmFtVmFsdWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHBhcmFtVmFsdWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0Q29udGV4dFBhcmFtX1BhcmFtVmFsdWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGVzY3JpcHRpb24iCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rlc2NyaXB0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgd2ViQXBwIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkgKiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUKLQkJCSAqIHdlYkFwcCBwcm9wZXJ0eSIgcGtnLmdldENvbnRleHRQYXJhbV9XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRleHRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIsICJfVUlfQ29udGV4dFBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlIiwgIl9VSV9Db250ZXh0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29udGV4dFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRleHRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZXh0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMTJjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDb250ZXh0UGFyYW0gezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZXh0UGFyYW0uY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Vycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZX0KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZXJyb3Jjb2RlX2Vycm9ycGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcmNvZGVfZXJyb3JwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBlcnJvckNvZGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvckNvZGVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRXJyb3JDb2RlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9lcnJvckNvZGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGVycm9yQ29kZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXJyb3IgQ29kZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvckNvZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Vycm9yQ29kZUVycm9yUGFnZV9lcnJvckNvZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXJyb3JDb2RlRXJyb3JQYWdlX2Vycm9yQ29kZV9mZWF0dXJlIiwgIl9VSV9FcnJvckNvZGVFcnJvclBhZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMTRjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEVycm9yQ29kZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFcnJvckNvZGUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKChFcnJvckNvZGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0RXJyb3JDb2RlKCkgKyAiIC0+ICIgKyAoKEVycm9yQ29kZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRMb2NhdGlvbigpOyAKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXJyb3JDb2RlRXJyb3JQYWdlLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwZmE1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JQYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZXJyb3JfcGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcl9wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgRXJyb3JQYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRXJyb3JQYWdlKSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGxvY2F0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9jYXRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiTG9jYXRpb24iCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2xvY2F0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2NhdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSkpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Vycm9yUGFnZV9sb2NhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FcnJvclBhZ2VfbG9jYXRpb25fZmVhdHVyZSIsICJfVUlfRXJyb3JQYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjEzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvclBhZ2UgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFcnJvclBhZ2UuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjEwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2V9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGV4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJleGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGV4Y2VwdGlvblR5cGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeGNlcHRpb25UeXBlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvblR5cGUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2V4Y2VwdGlvblR5cGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGV4Y2VwdGlvblR5cGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhjZXB0aW9uIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhjZXB0aW9uVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uVHlwZUVycm9yUGFnZV9leGNlcHRpb25UeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VfZXhjZXB0aW9uVHlwZV9mZWF0dXJlIiwgIl9VSV9FeGNlcHRpb25UeXBlRXJyb3JQYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSwgdHJ1ZSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE1Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKSBvYmplY3QpLmdldEV4Y2VwdGlvblR5cGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uVHlwZUVycm9yUGFnZSB7MH0iCi0JICAgIFN0cmluZyB0eXBlTmFtZSA9ICgoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFeGNlcHRpb25UeXBlTmFtZSgpOwotCSAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCSAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSsxKTsKLQkgICAgfQotCSAgICByZXR1cm4gdHlwZU5hbWUgKyAiIC0+ICIgKyAoKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKTsgCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM0OTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9GaWx0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEZpbHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlJbml0UGFyYW0gY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRQYXJhbSgpOwotCi0JCS8vIFRPRE86IGluaXRpYWxpemUgY2hpbGQgaGVyZS4uLgotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSAoKEZpbHRlcikgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JCWlmICh3ZWJBcHAuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpKTsKLQkJZWxzZQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZUluaXRQYXJhbSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICJDcmVhdGUgSW5pdFBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjZjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXtyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgSW5pdFBhcmFtIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRmlsdGVyLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHdhcCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmaWx0ZXJOYW1lIGZlYXR1cmUuCi0KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbHRlckl0ZW1Qcm92aWRlcl9VSV8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZmlsdGVyTmFtZV9wcm9wZXJ0eV8zIiksIHdhcC5nZXRGaWx0ZXJfTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0ZpbHRlcl9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlcl9uYW1lX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbHRlciBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWx0ZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyX2ZpbHRlckNsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlcl9maWx0ZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9GaWx0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0cnVlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gZmlsdGVyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSAiPGZpbHRlcj4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChGaWx0ZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldCBJSXRlbVByb3BlcnR5U291cmNlLmlzUHJvcGVydHlTZXR9Ci0JICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJcmV0ID0gKChXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpKS5pc1Byb3BlcnR5U2V0KG9iamVjdCk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gc3VwZXIuaXNQcm9wZXJ0eVNldChvYmplY3QsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlIElJdGVtUHJvcGVydHlTb3VyY2Uuc2V0UHJvcGVydHlWYWx1ZX1ieQotCSAqIGRlbGVnYXRpbmcgdG8gdGhlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIGFzc3VtZWQgdG8gc3VwcG9ydCB0aGUgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiBpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQkoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLnNldFByb3BlcnR5VmFsdWUob2JqZWN0LCB2YWx1ZSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzMjMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGZpbHRlcl9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgRmlsdGVyTWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHdhcCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJd2FwLmdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybigpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmaWx0ZXIgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJGaWx0ZXIiLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZpbHRlcl9wcm9wZXJ0eV8yIiksIHdhcC5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyTWFwcGluZ191cmxQYXR0ZXJuX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlck1hcHBpbmdfdXJsUGF0dGVybl9mZWF0dXJlIiwgIl9VSV9GaWx0ZXJNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BhdGNoZXIgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwYXRjaGVyVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyTWFwcGluZ19kaXNwYXRjaGVyVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GaWx0ZXJNYXBwaW5nX2Rpc3BhdGNoZXJUeXBlX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbHRlciBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWx0ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0ZpbHRlck1hcHBpbmdfZmlsdGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlck1hcHBpbmdfZmlsdGVyX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCksIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9GaWx0ZXJNYXBwaW5nX3NlcnZsZXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRmlsdGVyTWFwcGluZ19zZXJ2bGV0X2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCB0cnVlKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcgPSAoRmlsdGVyTWFwcGluZykgb2JqZWN0OwotCQlGaWx0ZXIgZmlsdGVyID0gZmlsdGVyTWFwcGluZy5nZXRGaWx0ZXIoKTsKLQkJU3RyaW5nIGZpbHRlclN0ciA9IChmaWx0ZXIgPT0gbnVsbCkgPyBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiP19VSV8iKSA6IGZpbHRlci5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgPSAiPyIKLQotCQlTdHJpbmcgbWFwVGV4dCA9ICgoRmlsdGVyTWFwcGluZykgb2JqZWN0KS5nZXRVcmxQYXR0ZXJuKCk7Ci0JCWlmIChtYXBUZXh0ID09IG51bGwpIHsKLQkJCVNlcnZsZXQgc2VydmxldCA9IGZpbHRlck1hcHBpbmcuZ2V0U2VydmxldCgpOwotCQkJaWYgKHNlcnZsZXQgIT0gbnVsbCkKLQkJCQltYXBUZXh0ID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCQl9Ci0JCWlmIChtYXBUZXh0ID09IG51bGwpCi0JCQltYXBUZXh0ID0gIj8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsdGVyX21hcHBpbmdfdGV4dCIsIG5ldyBPYmplY3RbXXttYXBUZXh0LCBmaWx0ZXJTdHJ9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZpbHRlck1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVCA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmU4NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Zvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZm9ybV9sb2dpbl9jb25maWcuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZm9ybV9sb2dpbl9jb25maWciKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGZvcm1fbG9naW5fY29uZmlnLmdpZi4KLQkgKi8KLQkvL1RPRE8gUmVtb3ZpbmcgdGhlIFVJIGRlcGVuZGVuY3kgYnkgY29tbWVudGluZyBvdXQgdGhpcyBtZXRob2QKLQkvKgotCSAqIHB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuIChJbWFnZSkKLQkgKiBXRUJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VGcm9tUmVnaXN0cnkoImZvcm1fbG9naW5fY29uZmlnIik7Ly8kTk9OLU5MUy0xJCB9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjUyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChGb3JtTG9naW5Db25maWcpIG9iamVjdCkuZ2V0Rm9ybUxvZ2luUGFnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkZvcm1Mb2dpbkNvbmZpZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsb2dpbkNvbmZpZyBvZiB0aGUgRm9ybUxvZ2luQ29uZmlnLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRm9ybUxvZ2luQ29uZmlnKSBvYmplY3QpLmdldExvZ2luQ29uZmlnKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZm9ybUxvZ2luUGFnZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZvcm1Mb2dpblBhZ2VfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRm9ybUxvZ2luUGFnZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZm9ybUxvZ2luUGFnZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZm9ybUxvZ2luUGFnZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmb3JtRXJyb3JQYWdlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRm9ybUVycm9yUGFnZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJGb3JtRXJyb3JQYWdlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb3JtRXJyb3JQYWdlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBmb3JtRXJyb3JQYWdlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGxvZ2luQ29uZmlnIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9naW5Db25maWdfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiTG9naW5Db25maWciCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2xvZ2luQ29uZmlnX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2dpbkNvbmZpZyBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGb3JtIExvZ2luIFBhZ2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRm9ybUxvZ2luUGFnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRm9ybUxvZ2luQ29uZmlnX2Zvcm1Mb2dpblBhZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRm9ybUxvZ2luQ29uZmlnX2Zvcm1Mb2dpblBhZ2VfZmVhdHVyZSIsICJfVUlfRm9ybUxvZ2luQ29uZmlnX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRm9ybSBFcnJvciBQYWdlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZvcm1FcnJvclBhZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Zvcm1Mb2dpbkNvbmZpZ19mb3JtRXJyb3JQYWdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Zvcm1Mb2dpbkNvbmZpZ19mb3JtRXJyb3JQYWdlX2ZlYXR1cmUiLCAiX1VJX0Zvcm1Mb2dpbkNvbmZpZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChGb3JtTG9naW5Db25maWcpIG9iamVjdCkuZ2V0Rm9ybUxvZ2luUGFnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkZvcm1Mb2dpbkNvbmZpZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZvcm1Mb2dpbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9IVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0hUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjhlNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0hUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgaHR0cF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImh0dHBfdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJlc0NvbGxlY3Rpb24gb2YgdGhlIEhUVFBNZXRob2RUeXBlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoSFRUUE1ldGhvZFR5cGUpIG9iamVjdCkuZ2V0SHR0cE1ldGhvZCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGh0dHBNZXRob2QgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJIdHRwTWV0aG9kX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkh0dHBNZXRob2QiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2h0dHBNZXRob2RfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGh0dHBNZXRob2QgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByZXNDb2xsZWN0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVzQ29sbGVjdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJSZXNDb2xsZWN0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yZXNDb2xsZWN0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSByZXNDb2xsZWN0aW9uIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIdHRwIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IVFRQTWV0aG9kVHlwZV9odHRwTWV0aG9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0hUVFBNZXRob2RUeXBlX2h0dHBNZXRob2RfZmVhdHVyZSIsICJfVUlfSFRUUE1ldGhvZFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChIVFRQTWV0aG9kVHlwZSkgb2JqZWN0KS5nZXRIdHRwTWV0aG9kKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiSFRUUE1ldGhvZFR5cGUgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChIVFRQTWV0aG9kVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGE2ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGluaXRpYWxpel9wYXJhbWV0ZXIuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZXJ2bGV0IG9mIHRoZSBJbml0UGFyYW0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChJbml0UGFyYW0pIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHBhcmFtTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBhcmFtTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJQYXJhbU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3BhcmFtTmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcGFyYW1OYW1lIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcGFyYW1WYWx1ZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBhcmFtVmFsdWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUGFyYW1WYWx1ZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcGFyYW1WYWx1ZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcGFyYW1WYWx1ZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCVdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJX19VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJEZXNjcmlwdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGVzY3JpcHRpb24iCi0JCQkJCQlwa2cuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yLk1VTFRJTElORV9URVhUX0VESVRPUik7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlIiwgIl9VSV9Jbml0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiLCAiX1VJX0luaXRQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0luaXRQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMThjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEluaXRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKSwgKChJbml0UGFyYW0pIG9iamVjdCkuZ2V0UGFyYW1WYWx1ZSgpfSkpOyAvLyROT04tTkxTLTEkID0gInswfSA9IHsxfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5pdFBhcmFtLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0IElJdGVtUHJvcGVydHlTb3VyY2UuaXNQcm9wZXJ0eVNldH0KLQkgKiBieSBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmlzUHJvcGVydHlTZXQob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5pc1Byb3BlcnR5U2V0KG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlfWJ5Ci0JICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQotCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCSgoV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSkuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHksIHZhbHVlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSXRlbUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWE0YjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzE4LzIwMDEgNTo1MzowMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUhvbGRlciBleHRlbmRzIEl0ZW1Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIFdlYkFwcCB3ZWJBcHA7Ci0JcHJvdGVjdGVkIFdlYkFydGlmYWN0RWRpdCB3ZWJBcnRpZmFjdEVkaXQ7Ci0KLQlwdWJsaWMgSXRlbUhvbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKYXJob2xkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSXRlbUhvbGRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdlYkFwcCh3ZWJBcHApOwotCX0KLQlwdWJsaWMgSXRlbUhvbGRlcihXZWJBcnRpZmFjdEVkaXQgd2ViQXJ0aWZhY3RFZGl0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdlYkFydGlmYWN0RWRpdCh3ZWJBcnRpZmFjdEVkaXQpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVdlYkFwcCB0ZXN0RWxlbWVudDsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbUhvbGRlcikgewotCQkJdGVzdEVsZW1lbnQgPSAoKEl0ZW1Ib2xkZXIpIGVsZW1lbnQpLmdldFdlYkFwcCgpOwotCQkJdi5hZGQodGVzdEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMTgvMjAwMSA2OjAwOjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVKQkphcgotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gd2ViQXBwOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMTgvMjAwMSA2OjAwOjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdKYXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FSkJKYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIGFXZWJBcHApIHsKLQkJd2ViQXBwID0gYVdlYkFwcDsKLQl9Ci0KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0IGdldFdlYkFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIHdlYkFydGlmYWN0RWRpdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcnRpZmFjdEVkaXQoV2ViQXJ0aWZhY3RFZGl0IHdlYkFydGlmYWN0RWRpdCkgewotCQl0aGlzLndlYkFydGlmYWN0RWRpdCA9IHdlYkFydGlmYWN0RWRpdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTlmYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUENvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BDb25maWd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQQ29uZmlnSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUENvbmZpZ19UYWdMaWJzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKU1BDb25maWcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmdWxsL29iajE2L0pTUENvbmZpZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfSlNQQ29uZmlnX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChKU1BDb25maWcuY2xhc3MpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlMgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfVGFnTGlicygpLCBKc3BGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYWdMaWJSZWZUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSwgSnNwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTE5NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BQcm9wZXJ0eUdyb3VwfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFbElnbm9yZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhZ2VFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2NyaXB0aW5nSW52YWxpZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNYTUxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEluY2x1ZGVQcmVsdWRlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW5jbHVkZUNvZGFzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVcmwgUGF0dGVybiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3VybFBhdHRlcm5fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSlNQUHJvcGVydHlHcm91cF91cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX0pTUFByb3BlcnR5R3JvdXBfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVsIElnbm9yZWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxJZ25vcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2VsSWdub3JlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2VsSWdub3JlZF9mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhZ2UgRW5jb2RpbmcgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZUVuY29kaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3BhZ2VFbmNvZGluZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3BhZ2VFbmNvZGluZ19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNjcmlwdGluZyBJbnZhbGlkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjcmlwdGluZ0ludmFsaWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0pTUFByb3BlcnR5R3JvdXBfc2NyaXB0aW5nSW52YWxpZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3NjcmlwdGluZ0ludmFsaWRfZmVhdHVyZSIsICJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgWE1MIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzWE1MUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2lzWE1MX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0pTUFByb3BlcnR5R3JvdXBfaXNYTUxfZmVhdHVyZSIsICJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGUgUHJlbHVkZXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZVByZWx1ZGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVQcmVsdWRlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVQcmVsdWRlc19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGUgQ29kYXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZUNvZGFzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVDb2Rhc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVDb2Rhc19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSlNQUHJvcGVydHlHcm91cC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSlNQUHJvcGVydHlHcm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChKU1BQcm9wZXJ0eUdyb3VwKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpTUFByb3BlcnR5R3JvdXAuY2xhc3MpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTiA6Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2FjNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgSlNQVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGpzcF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImpzcF90eXBlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGpzcEZpbGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJKc3BGaWxlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkpzcEZpbGUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2pzcEZpbGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGpzcEZpbGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0SlNQVHlwZV9Kc3BGaWxlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSnNwIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSnNwRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSlNQVHlwZV9qc3BGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0pTUFR5cGVfanNwRmlsZV9mZWF0dXJlIiwgIl9VSV9KU1BUeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BUeXBlX0pzcEZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQwY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChKU1BUeXBlKSBvYmplY3QpLmdldEpzcEZpbGUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJKU1BUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSlNQVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Kc3BJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgyZDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Kc3BJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLnV0aWwuSnNwQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKc3BBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BDb25maWd9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbmZpZ0l0ZW1Qcm92aWRlciBqc3BDb25maWdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLkpTUENvbmZpZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUENvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChqc3BDb25maWdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJanNwQ29uZmlnSXRlbVByb3ZpZGVyID0gbmV3IEpTUENvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqc3BDb25maWdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qc3AuSlNQUHJvcGVydHlHcm91cH0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlciBqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BQcm9wZXJ0eUdyb3VwfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKSB7Ci0JCWlmIChqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWpzcFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLlRhZ0xpYlJlZlR5cGV9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qc3AuVGFnTGliUmVmVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlpZiAodGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjM0NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTG9jYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExvY2FsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfbG9jYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvY2FsRW5jb2RpbmdNYXBwaW5nX2xvY2FsZV9mZWF0dXJlIiwgIl9VSV9Mb2NhbEVuY29kaW5nTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmNvZGluZyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfZW5jb2RpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfZW5jb2RpbmdfZmVhdHVyZSIsICJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTG9jYWxFbmNvZGluZ01hcHBpbmciKTsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImxvY2FsX2VuY29kaW5nX21hcHBpbmciKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGVtID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImxvY2FsX2VuY29kaW5nX21hcHBpbmdfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhYmVsID0gKChMb2NhbEVuY29kaW5nTWFwcGluZykgb2JqZWN0KS5nZXRMb2NhbGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGxlbSA6IGxlbSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ZGM0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3R9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkvLwkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIpOwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgibG9jYWxfZW5jb2RpbmdfbWFwcGluZ19saXN0Iik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2NhbF9lbmNvZGluZ19tYXBwaW5nX2xpc3RfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2VsY29tZSBGaWxlIExpc3QiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmY5M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZ31vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBjaGlsZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPOiBjcmVhdGUgc29tZSBjaGlsZCBvYmplY3QuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vVE9ETyBSZW1vdmluZyBVSSBkZXBlbmRlbmN5IGJ5IGNvbW1lbnRpbmcgb3V0IG1ldGhvZAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0Q3JlYXRlQ2hpbGRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBFT2JqZWN0IHJlZk9iamVjdCA9Ci0JICogKEVPYmplY3Qpb2JqZWN0OyByZXR1cm4KLQkgKiBXRUJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKwotCSAqICJDcmVhdGUjQ0hJTERfQ0xBU1NfTkFNRSMiKTsvLyROT04tTkxTLTEkIH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV8jQ0hJTERfQ0xBU1NfTkFNRSNfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlICNDSElMRF9DTEFTU19OQU1FIyIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjFjb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7Ly8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlICNDSElMRF9DTEFTU19OQU1FIyBmb3IgdGhlIHNlbGVjdGVkIHswfS4iIAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBmb3JtX2xvZ2luX2NvbmZpZy5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmb3JtX2xvZ2luX2NvbmZpZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgTG9naW5Db25maWcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChMb2dpbkNvbmZpZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBhdXRoTWV0aG9kIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQXV0aE1ldGhvZF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJBdXRoTWV0aG9kIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9hdXRoTWV0aG9kX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBhdXRoTWV0aG9kIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcmVhbG1OYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVhbG1OYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJlYWxtTmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcmVhbG1OYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSByZWFsbU5hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgd2ViQXBwIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmb3JtTG9naW5Db25maWcgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGb3JtTG9naW5Db25maWdfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRm9ybUxvZ2luQ29uZmlnIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb3JtTG9naW5Db25maWdfcHJvcGVyX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBmb3JtTG9naW5Db25maWcgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aCBNZXRob2QgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXV0aE1ldGhvZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9naW5Db25maWdfYXV0aE1ldGhvZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Mb2dpbkNvbmZpZ19hdXRoTWV0aG9kX2ZlYXR1cmUiLCAiX1VJX0xvZ2luQ29uZmlnX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWFsbSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYWxtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9naW5Db25maWdfcmVhbG1OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvZ2luQ29uZmlnX3JlYWxtTmFtZV9mZWF0dXJlIiwgIl9VSV9Mb2dpbkNvbmZpZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRob3JpemF0aW9uIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRob3JpemF0aW9uTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Mb2dpbkNvbmZpZ19hdXRob3JpemF0aW9uTWV0aG9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvZ2luQ29uZmlnX2F1dGhvcml6YXRpb25NZXRob2RfZmVhdHVyZSIsICJfVUlfTG9naW5Db25maWdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoTG9naW5Db25maWcpIG9iamVjdCkuZ2V0UmVhbG1OYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiTG9naW5Db25maWcgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMb2dpbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL01pbWVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwODZkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIE1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgbWltZV9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIm1pbWVfbWFwcGluZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgTWltZU1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChNaW1lTWFwcGluZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBleHRlbnNpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeHRlbnNpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRXh0ZW5zaW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9leHRlbnNpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGV4dGVuc2lvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgbWltZVR5cGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNaW1lVHlwZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJNaW1lVHlwZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfbWltZVR5cGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIG1pbWVUeXBlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlCi0JCQkgKiB3ZWJBcHAgcHJvcGVydHkiIHBrZy5nZXRNaW1lTWFwcGluZ19XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVuc2lvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01pbWVNYXBwaW5nX2V4dGVuc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaW1lTWFwcGluZ19leHRlbnNpb25fZmVhdHVyZSIsICJfVUlfTWltZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1pbWVUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NaW1lTWFwcGluZ19taW1lVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaW1lTWFwcGluZ19taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9NaW1lTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChNaW1lTWFwcGluZykgb2JqZWN0KS5nZXRFeHRlbnNpb24oKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJNaW1lTWFwcGluZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1pbWVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Sb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Sb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxZjAyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGV9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHNlY3VyaXR5X3JvbGVfbmFtZXR5cGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VjdXJpdHlfcm9sZV9uYW1ldHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByb2xlTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJvbGVOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJvbGVOYW1lIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yb2xlTmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcm9sZU5hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Sb2xlTmFtZVR5cGVfcm9sZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZU5hbWVUeXBlX3JvbGVOYW1lX2ZlYXR1cmUiLCAiX1VJX1JvbGVOYW1lVHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyM2NvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoUm9sZU5hbWVUeXBlKSBvYmplY3QpLmdldFJvbGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiUm9sZU5hbWVUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZU5hbWVUeXBlLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEzNGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnR9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlXZWJSZXNvdXJjZUNvbGxlY3Rpb24gY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCi0JCS8vIFRPRE86IGluaXRpYWxpemUgY2hpbGQgaGVyZS4uLgotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfV2ViUmVzb3VyY2VDb2xsZWN0aV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIgotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjRjb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCB7MH0uIgotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBzZWN1cml0eV9jb25zdHJhaW50LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlY3VyaXR5X2NvbnN0cmFpbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgd2ViQXBwIG9mIHRoZSBTZWN1cml0eUNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChTZWN1cml0eUNvbnN0cmFpbnQpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgd2ViQXBwIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkgKiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUKLQkJCSAqIHdlYkFwcCBwcm9wZXJ0eSIgcGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkaXNwbGF5TmFtZSBmZWF0dXJlLgotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGlzcGxheU5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGlzcGxheU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rpc3BsYXlOYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgYXV0aENvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBdXRoQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJBdXRoQ29uc3RyYWludCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfYXV0aENvbnN0cmFpbnRfcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgYXV0aENvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHVzZXJEYXRhQ29uc3RyYWludCBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVzZXJEYXRhQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVc2VyRGF0YUNvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3VzZXJEYXRhQ29uc3RyYWludF9wcm9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHVzZXJEYXRhQ29uc3RyYWludCBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eUNvbnN0cmFpbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlDb25zdHJhaW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5Q29uc3RyYWludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBkaXNwbGF5TmFtZSA9ICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCWlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0JCQlMaXN0IGRpc3BsYXlOYW1lTGlzdCA9ICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldERpc3BsYXlOYW1lcygpOwotCQkJaWYgKGRpc3BsYXlOYW1lTGlzdCAhPSBudWxsICYmIGRpc3BsYXlOYW1lTGlzdC5zaXplKCkgPiAwKQotCQkJCWRpc3BsYXlOYW1lID0gKChEaXNwbGF5TmFtZSkgZGlzcGxheU5hbWVMaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLQkJCWRpc3BsYXlOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICIgIiArIGRpc3BsYXlOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdXRoQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODQ4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFNlcnZsZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCi0JCUluaXRQYXJhbSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9yZXN1bHQuYWRkKHBrZy5nZXRTZXJ2bGV0X1dlYlR5cGUoKSk7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSAoKFNlcnZsZXQpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCQlpZiAod2ViQXBwID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAod2ViQXBwLmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCXJlc3VsdC5hZGQocGtnLmdldFNlcnZsZXRfSW5pdFBhcmFtcygpKTsKLQkJZWxzZQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0U2VydmxldF9QYXJhbXMoKSk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0U2VydmxldF9SdW5BcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlSW5pdFBhcmFtIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9Jbml0UGFyYW1fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIEluaXRQYXJhbSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIEluaXRQYXJhbSBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZsZXQuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlXZWJUeXBlIHd0ID0gKChTZXJ2bGV0KSBvYmplY3QpLmdldFdlYlR5cGUoKTsKLQkJaWYgKHd0ICE9IG51bGwgJiYgd3QuaXNKc3BUeXBlKCkpCi0JCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgianNwX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VydmxldC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFNlcnZsZXQpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgc2VydmxldE5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0TmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJTZXJ2bGV0TmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfc2VydmxldE5hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlcnZsZXROYW1lIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKSkpOwotCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBsb2FkT25TdGFydHVwIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9hZE9uU3RhcnR1cF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJMb2FkT25TdGFydHVwIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9sb2FkT25TdGFydHVwX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2FkT25TdGFydHVwIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpLCBmYWxzZSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2bGV0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmxldE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRfc2VydmxldE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldF9zZXJ2bGV0TmFtZV9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb2FkIE9uIFN0YXJ0dXAgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9hZE9uU3RhcnR1cFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldF9sb2FkT25TdGFydHVwX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZsZXRfbG9hZE9uU3RhcnR1cF9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI8c2VydmxldD5fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiPHNlcnZsZXQ+IgotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVAgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfUGFyYW1zKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldF9SdW5BcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldCBJSXRlbVByb3BlcnR5U291cmNlLmlzUHJvcGVydHlTZXR9Ci0JICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJcmV0ID0gKChXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpKS5pc1Byb3BlcnR5U2V0KG9iamVjdCk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gc3VwZXIuaXNQcm9wZXJ0eVNldChvYmplY3QsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlfWJ5Ci0JICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQotCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCSgoV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSkuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHksIHZhbHVlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmEyZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgc2VydmxldF9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXRfbWFwcGluZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VydmxldE1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm4oKSkpOwotCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBzZXJ2bGV0IGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZXJ2bGV0IgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9zZXJ2bGV0X3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBzZXJ2bGV0IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldE1hcHBpbmdfdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0TWFwcGluZ191cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX1NlcnZsZXRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRNYXBwaW5nX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldE1hcHBpbmdfbmFtZV9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TWFwcGluZ19zZXJ2bGV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZsZXRNYXBwaW5nX3NlcnZsZXRfZmVhdHVyZSIsICJfVUlfU2VydmxldE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgZmFsc2UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyB1cmxTdHIgPSAoKFNlcnZsZXRNYXBwaW5nKSBvYmplY3QpLmdldFVybFBhdHRlcm4oKTsKLQkJU2VydmxldCBzZXJ2bGV0ID0gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRTZXJ2bGV0KCk7Ci0JCVN0cmluZyBzZXJ2bGV0U3RyID0gKHNlcnZsZXQgPT0gbnVsbCkgPyBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiP19VSV8iKSA6IHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCA9ICI/IgotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI4Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117dXJsU3RyLCBzZXJ2bGV0U3RyfSkpOyAvLyROT04tTkxTLTEkID0gIlNlcnZsZXQgbWFwcGluZyAoezB9IC0+IHsxfSkiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzlhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYlR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlcnZsZXRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgc2VydmxldF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgY2xhc3NOYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xhc3NOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkNsYXNzTmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfY2xhc3NOYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBjbGFzc05hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2VydmxldFR5cGVfQ2xhc3NOYW1lKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xhc3MgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc05hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRUeXBlX2NsYXNzTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0VHlwZV9jbGFzc05hbWVfZmVhdHVyZSIsICJfVUlfU2VydmxldFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRUeXBlX0NsYXNzTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiNDFjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKFNlcnZsZXRUeXBlKSBvYmplY3QpLmdldENsYXNzTmFtZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIlNlcnZsZXRUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldFR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1Nlc3Npb25Db25maWdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzhiNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1Nlc3Npb25Db25maWdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBzZXNzaW9uX2NvbmZpZy5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXNzaW9uX2NvbmZpZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2Vzc2lvbkNvbmZpZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFNlc3Npb25Db25maWcpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgc2Vzc2lvblRpbWVvdXQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXNzaW9uVGltZW91dF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZXNzaW9uVGltZW91dCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfc2Vzc2lvblRpbWVvdXRfcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgc2Vzc2lvblRpbWVvdXQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB3ZWJBcHAgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHdlYkFwcCBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZXNzaW9uQ29uZmlnX1dlYkFwcCgpKSk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlc3Npb24gVGltZW91dCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXNzaW9uVGltZW91dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2Vzc2lvbkNvbmZpZ19zZXNzaW9uVGltZW91dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXNzaW9uQ29uZmlnX3Nlc3Npb25UaW1lb3V0X2ZlYXR1cmUiLCAiX1VJX1Nlc3Npb25Db25maWdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKCgoU2Vzc2lvbkNvbmZpZykgb2JqZWN0KS5nZXRTZXNzaW9uVGltZW91dCgpKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZXNzaW9uQ29uZmlnIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2Vzc2lvbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMzdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgVGFnTGliUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMganNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImpzcF9saWJyYXJ5X3JlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgVGFnTGliUmVmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoVGFnTGliUmVmKSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHRhZ2xpYlVSSSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVSSV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUYWdsaWJVUkkiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3RhZ2xpYlVSSV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgdGFnbGliVVJJIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdGFnbGliTG9jYXRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2NhdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUYWdsaWJMb2NhdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdGFnbGliTG9jYXRpb25fcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgdGFnbGliTG9jYXRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlCi0JCQkgKiB3ZWJBcHAgcHJvcGVydHkiIHBrZy5nZXRUYWdMaWJSZWZfV2ViQXBwKCkpKTsKLQkJCSAqLwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYWdsaWIgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVGFnTGliUmVmX3RhZ2xpYlVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYWdMaWJSZWZfdGFnbGliVVJJX2ZlYXR1cmUiLCAiX1VJX1RhZ0xpYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIExvY2F0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYkxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9UYWdMaWJSZWZfdGFnbGliTG9jYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFnTGliUmVmX3RhZ2xpYkxvY2F0aW9uX2ZlYXR1cmUiLCAiX1VJX1RhZ0xpYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVGFnTGliUmVmKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpfSkpOyAvLyROT04tTkxTLTEkID0gIlRhZ0xpYlJlZiB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhZ0xpYlJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMwY2ZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLlRhZ0xpYlJlZlR5cGV9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGFnbGliVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYWdsaWJMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIFVSSSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVUklfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVSSV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIExvY2F0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYkxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9jYXRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxvY2F0aW9uX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFnTGliUmVmVHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFnTGliUmVmVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYWdMaWJSZWZUeXBlKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpOwotCQlTdHJpbmcgdGxydCA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfVGFnTGliUmVmVHlwZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IHRscnQgOiB0bHJ0ICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFnTGliUmVmVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzMzljMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdXJsX3R5cGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXJsX3R5cGUiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByZXNDb2xsZWN0aW9uIG9mIHRoZSBVUkxQYXR0ZXJuVHlwZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFVSTFBhdHRlcm5UeXBlKSBvYmplY3QpLmdldFJlc0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFVSTFBhdHRlcm5UeXBlX1VybFBhdHRlcm4oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcmVzQ29sbGVjdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJlc0NvbGxlY3Rpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUmVzQ29sbGVjdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcmVzQ29sbGVjdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcmVzQ29sbGVjdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVVJMUGF0dGVyblR5cGVfdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VUkxQYXR0ZXJuVHlwZV91cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX1VSTFBhdHRlcm5UeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzM2NvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVVJMUGF0dGVyblR5cGUpIG9iamVjdCkuZ2V0VXJsUGF0dGVybigpfSkpOyAvLyROT04tTkxTLTEkID0gIlVSTFBhdHRlcm5UeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVVJMUGF0dGVyblR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMwNGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Vc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50fQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBVc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB1c2VyX2RhdGFfY29uc3RyYWludC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ1c2VyX2RhdGFfY29uc3RyYWludCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZWNDb25zdHJhaW50IG9mIHRoZSBVc2VyRGF0YUNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChVc2VyRGF0YUNvbnN0cmFpbnQpIG9iamVjdCkuZ2V0U2VjQ29uc3RyYWludCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkRlc2NyaXB0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZGVzY3JpcHRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHRyYW5zcG9ydEd1YXJhbnRlZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRyYW5zcG9ydEd1YXJhbnRlZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUcmFuc3BvcnRHdWFyYW50ZWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3RyYW5zcG9ydEd1YXJhbnRlZV9wcm9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHRyYW5zcG9ydEd1YXJhbnRlZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHNlY0NvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWNDb25zdHJhaW50X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlNlY0NvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3NlY0NvbnN0cmFpbnRfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVXNlckRhdGFDb25zdHJhaW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1VzZXJEYXRhQ29uc3RyYWludF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Vc2VyRGF0YUNvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHJhbnNwb3J0IEd1YXJhbnRlZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc3BvcnRHdWFyYW50ZWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1VzZXJEYXRhQ29uc3RyYWludF90cmFuc3BvcnRHdWFyYW50ZWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVXNlckRhdGFDb25zdHJhaW50X3RyYW5zcG9ydEd1YXJhbnRlZV9mZWF0dXJlIiwgIl9VSV9Vc2VyRGF0YUNvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzNGNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVXNlckRhdGFDb25zdHJhaW50KSBvYmplY3QpLmdldFRyYW5zcG9ydEd1YXJhbnRlZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJVc2VyRGF0YUNvbnN0cmFpbnQgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTgyNzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMb2NhdG9yIFJFU09VUkNFX0xPQ0FUT1IgPSBuZXcgUmVzb3VyY2VMb2NhdG9yKCkgewotCQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGFyZzApIHsKLQkJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGFyZzApOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGFyZzApIHsKLQkJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhhcmcwKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBhcmcwLCBPYmplY3RbXSBhcmcxKSB7Ci0JCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMsIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid2ViZWRpdCIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY1NDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHB9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwSXRlbVByb3ZpZGVyIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgV2ViQXBwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCi0JCUNvbnRleHRQYXJhbSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGV4dFBhcmFtKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBteUNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKHdlYkFwcC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKSB7Ci0JCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJCW15Q2hpbGRyZW4uYWRkQWxsKHNlcnZpY2VIZWxwZXIuZ2V0MTNTZXJ2aWNlUmVmcyh3ZWJBcHApKTsKLQkJfQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbGVMaXN0KCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9UYWdMaWJzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Db25zdHJhaW50cygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2dpbkNvbmZpZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWltZU1hcHBpbmdzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9MaXN0ZW5lcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZUNvbnRleHRQYXJhbSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfQ29udGV4dFBhcmFtX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBDb250ZXh0UGFyYW0iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBoZWxwIHRleHQgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzNWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBDb250ZXh0UGFyYW0gZm9yIHRoZSBzZWxlY3RlZCB7MH0uIgotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaWYgKCgoV2ViQXBwKSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgid2ViX2FwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoICgoKFdlYkFwcCkgb2JqZWN0KS5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEIDoKLQkJCQlrZXkgPSAid2ViYXBwXzIyIjsgLy8kTk9OLU5MUy0xJCAKLQkJCQlicmVhazsKLQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEIDoKLQkJCQlrZXkgPSAid2ViYXBwXzIzIjsgLy8kTk9OLU5MUy0xJCAKLQkJCQlicmVhazsKLQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEIDoKLQkJCWRlZmF1bHQgOgotCQkJCWtleSA9ICJ3ZWJhcHBfMjQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkaXN0cmlidXRhYmxlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGlzdHJpYnV0YWJsZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJEaXN0cmlidXRhYmxlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kaXN0cmlidXRhYmxlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkaXN0cmlidXRhYmxlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCkpKTsKLQotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZmlsZUxpc3QgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlTGlzdF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJGaWxlTGlzdCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZmlsZUxpc3RfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZpbGVMaXN0IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFdlYkFwcF9GaWxlTGlzdCgpKSk7Ci0KLQkJCS8qCi0JCQkgKiAvLyBjY2MgLSBmb3IgdXNhYmlsaXR5IHJlYXNvbnMsIHRoZXNlIGRlc2NyaXB0b3JzIGFyZSByZW1vdmVkIGZyb20gdGhlIHByb3BlcnR5Ci0JCQkgKiBzaGVldC4gLy8gVGhpcyBpcyBmb3IgdGhlIGxvZ2luQ29uZmlnIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JCQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkxvZ2luQ29uZmlnIiwKLQkJCSAqICJUaGUgbG9naW5Db25maWcgcHJvcGVydHkiLCBwa2cuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCkpKTsKLQkJCSAqICAvLyBUaGlzIGlzIGZvciB0aGUgc2Vzc2lvbkNvbmZpZyBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCQkJICogSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkgKiAiU2Vzc2lvbkNvbmZpZyIsICJUaGUgc2Vzc2lvbkNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpKSk7Ci0JCQkgKi8KLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzdHJpYnV0YWJsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXN0cmlidXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJBcHBfZGlzdHJpYnV0YWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJBcHBfZGlzdHJpYnV0YWJsZV9mZWF0dXJlIiwgIl9VSV9XZWJBcHBfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZXJzaW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYkFwcF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYkFwcF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX1dlYkFwcF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iamVjdDsKLQkJU3RyaW5nIG5hbWUgPSB3ZWJBcHAuZ2V0RGlzcGxheU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiPHdlYl9hcHA+X1VJXyIpOyAvLyROT04tTkxTLTEkID0gIjx3ZWIgYXBwPiIKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYkFwcC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1MgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZXh0UGFyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFcnJvclBhZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9GaWxlTGlzdCgpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfVGFnTGlicygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhZ0xpYlJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9naW5Db25maWcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbWVNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbkNvbmZpZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTGlzdGVuZXJzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpLCBKc3BGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BDb25maWcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHF1YWxpZnkgPSBmZWF0dXJlID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpIHx8IGZlYXR1cmUgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQkJcmV0dXJuIGdldFN0cmluZyhxdWFsaWZ5ID8gIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIgOiAiX1VJX0NyZWF0ZUNoaWxkX3RleHQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IE9iamVjdFtde2dldFR5cGVUZXh0KGNoaWxkKSwgZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyOTRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlVUkxQYXR0ZXJuVHlwZSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVVJMUGF0dGVyblR5cGUoKTsKLQotCQkvLyBUT0RPOiBpbml0aWFsaXplIGNoaWxkIGhlcmUuLi4KLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVVSTFBhdHRlcm5UeXBlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX1VSTFBhdHRlcm5UeXBlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBVUkxQYXR0ZXJuVHlwZSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjM3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFVSTFBhdHRlcm5UeXBlIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2ViX3Jlc291cmNlX2NvbGxlY3Rpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZWNDb25zdHJhaW50IG9mIHRoZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIG9iamVjdCkuZ2V0U2VjQ29uc3RyYWludCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYlJlc291cmNlTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYlJlc291cmNlTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJSZXNvdXJjZU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYlJlc291cmNlTmFtZV9wcm9wZXJfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHdlYlJlc291cmNlTmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkRlc2NyaXB0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZGVzY3JpcHRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHNlY0NvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWNDb25zdHJhaW50X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlNlY0NvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3NlY0NvbnN0cmFpbnRfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWIgUmVzb3VyY2UgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJSZXNvdXJjZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlJlc291cmNlQ29sbGVjdGlvbl93ZWJSZXNvdXJjZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViUmVzb3VyY2VDb2xsZWN0aW9uX3dlYlJlc291cmNlTmFtZV9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViUmVzb3VyY2VDb2xsZWN0aW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1dlYlJlc291cmNlQ29sbGVjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVcmwgUGF0dGVybiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdXJsUGF0dGVybl9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIdHRwIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25faHR0cE1ldGhvZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25faHR0cE1ldGhvZF9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMzhjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXSB7Ci0JCS8vICgoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKW9iamVjdCkuZ2V0V2ViUmVzb3VyY2VOYW1lKCkgfSkpOyAvLyROT04tTkxTLTEkID0KLQkJLy8gIldlYlJlc291cmNlQ29sbGVjdGlvbiB7MH0iCi0JCXJldHVybiAoKFdlYlJlc291cmNlQ29sbGVjdGlvbikgb2JqZWN0KS5nZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk4gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkpLmdldFVSTHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKCgoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpKS5nZXRIdHRwTWV0aG9kKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUE1ldGhvZFR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gY29tbWFuZFBhcmFtZXRlci5nZXRFUmVmZXJlbmNlKCk7Ci0JCWlmIChzZiA9PSBudWxsKSB7Ci0JCQlzZiA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RUF0dHJpYnV0ZSgpOwotCQkJaWYgKHNmICE9IG51bGwgJiYgIXNmLmlzTWFueSgpKQotCQkJCXNmID0gbnVsbDsKLQkJfQotCQlpZiAoc2YgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvd25lciA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RU93bmVyKCk7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKTsKLQkJCWlmIChjb21tYW5kQ2xhc3MgPT0gQWRkQ29tbWFuZC5jbGFzcykgewotCQkJCXJldHVybiBjcmVhdGVBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG93bmVyLCBzZiwgY29sbGVjdGlvbiwgY29tbWFuZFBhcmFtZXRlci5nZXRJbmRleCgpKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVtb3ZlQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvd25lciwgc2YsIGNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEzNjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMS8yMDAwIDU6NTQ6MjggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgSXRlbVByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlwcm90ZWN0ZWQgaW50IGNlbGxFZGl0b3JUeXBlID0gLTE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU01BTExfSUNPTl9FRElUT1IgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExBUkdFX0lDT05fRURJVE9SID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNVUxUSUxJTkVfVEVYVF9FRElUT1IgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFVVEhfQ09OU1RSQUlOVF9ST0xFU19FRElUT1IgPSA0OwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBjYXRlZ29yeSBhbmQgZmlsdGVyIGZsYWdzIGFyZSBlbXB0eSBhbmQgdGhlIGNlbGwgZWRpdG9yIGlzCi0JICogZGV0ZXJtaW5lZCBmb3IgdGhlIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgZGlzcGxheU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgRVJlZmVyZW5jZVtdIHBhcmVudFJlZmVyZW5jZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgcGFyZW50UmVmZXJlbmNlcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBjYXRlZ29yeSBpcyBmaWx0ZXIgZmxhZ3MgYXJlIGVtcHR5IGFuZCB0aGUgY2VsbCBlZGl0b3IgaXMKLQkgKiBkZXRlcm1pbmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHN0cnVjdHVyYWwgZmVhdHVyZT4KLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyBkaXNwbGF5TmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGlzcGxheU5hbWUsIGRlc2NyaXB0aW9uLCBmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGNhdGVnb3J5IGlzIGZpbHRlciBmbGFncyBhcmUgZW1wdHkgYW5kIHRoZSBjZWxsIGVkaXRvciBpcwotCSAqIGRldGVybWluZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgc3RydWN0dXJhbCBmZWF0dXJlPgotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgbmV3Q2VsbEVkaXRvclR5cGUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgZmVhdHVyZSk7Ci0JCWNlbGxFZGl0b3JUeXBlID0gbmV3Q2VsbEVkaXRvclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy9UT0RPIFdlIG5lZWQgdG8gdXNlIHRoZSBDb21tYW5kU3RhY2sgZnJvbSB0aGUgV2ViRWRpdE1vZGVsLgotCQkvLyAgaWYgKGVkaXRpbmdEb21haW4gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4pCi0JCS8vCSAgKChTdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW4pLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCS8vICBlbHNlCi0JCS8vCSAgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIHR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRDZWxsRWRpdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGNlbGxFZGl0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgZGVsZWdhdGVkIGpvYiBvZiBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGlzIGltcGxlbWVudGVkIGluCi0JICogYSBnZW5lcmljIHdheSB1c2luZyB0aGUgc3RydWN0dXJhbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gZ2V0RWRpdGluZ0RvbWFpbihvYmplY3QpOwotCi0JCWlmIChwYXJlbnRSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUVPYmplY3QgcmVmVmFsdWUgPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQlDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gcmVmT2JqZWN0LmVHZXQocGFyZW50UmVmZXJlbmNlc1tpXSk7Ci0JCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJZmluYWwgRVJlZmVyZW5jZSBwYXJlbnRSZWZlcmVuY2UgPSBwYXJlbnRSZWZlcmVuY2VzW2ldOwotCQkJCQlpZiAob2xkVmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvLyBlbHNlIGlmIChyZWZWYWx1ZS5yZWZJc0luc3RhbmNlT2YocGFyZW50UmVmZXJlbmNlLmdldEVUeXBlKCksIHRydWUpKQotCQkJCQllbHNlIGlmIChyZWZWYWx1ZS5lQ2xhc3MoKSA9PSBwYXJlbnRSZWZlcmVuY2UuZ2V0RVR5cGUoKSB8fCByZWZWYWx1ZS5lQ2xhc3MoKS5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKHBhcmVudFJlZmVyZW5jZS5nZXRFVHlwZSgpKSkgewotCQkJCQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZSwgdmFsdWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlDb21tYW5kIHNldENvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCByZWZPYmplY3QsIHBhcmVudFJlZmVyZW5jZSwgdmFsdWUpOwotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIHNldENvbW1hbmQpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlbW92ZUNvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCByZWZPYmplY3QsIHBhcmVudFJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgRVJlZmVyZW5jZSBwYXJlbnRSZWZlcmVuY2UgPSBwYXJlbnRSZWZlcmVuY2VzW2ldOwotCQkJCS8vaWYgKHJlZlZhbHVlLnJlZklzSW5zdGFuY2VPZihwYXJlbnRSZWZlcmVuY2UuZ2V0RVR5cGUoKSwgdHJ1ZSkpCi0JCQkJaWYgKHJlZlZhbHVlLmVDbGFzcygpID09IHBhcmVudFJlZmVyZW5jZS5nZXRFVHlwZSgpIHx8IHJlZlZhbHVlLmVDbGFzcygpLmdldEVBbGxTdXBlclR5cGVzKCkuY29udGFpbnMocGFyZW50UmVmZXJlbmNlLmdldEVUeXBlKCkpKSB7Ci0JCQkJCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZXNbaV0sIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChyZW1vdmVDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlmaW5hbCBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChDb21wb3VuZENvbW1hbmQuTEFTVF9DT01NQU5EX0FMTCk7Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChyZW1vdmVDb21tYW5kKTsKLQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgcGFyZW50UmVmZXJlbmNlLCB2YWx1ZSkpOwotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbXBvdW5kQ29tbWFuZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgcGFyZW50UmVmZXJlbmNlLCB2YWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCQlyZWZPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgZmVhdHVyZSwgdmFsdWUpKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljN2NkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdlYlR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlYlR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB3ZWJfdHlwZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJfdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9XZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTs7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJUeXBlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIldlYlR5cGUiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTgwMjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBleHRlbmRlZCBpdGVtIHByb3ZpZGVyIHN1cHBvcnRzIHR3byBhZGRpdGlvbiBmZWF0dXJlcywgKEBsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0gYW5kCi0gKiB7QGxpbmsgQ3JlYXRlQ2hpbGRyZW5Db21tYW5kfS4gVGhlc2UgdHdvIGFjdGlvbnMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0KLSAqIGFkYXB0ZXJzIHVzaW5nIHRoaXMgY29tbW9uIGJhc2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbmV3IGNoaWxkcmVuIGZvciB7QGxpbmsgQ3JlYXRlQ2hpbGRyZW5Db21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBjcmVhdGVDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBjcmVhdGUgY2hpbGQgaW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGFjaGlsZHJlblJlZmVyZW5jZXMgPSBnZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJaWYgKGFjaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJjcmVhdGVfY2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJKChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgY3JlYXRlIGNoaWxkcmVuIGxhYmVsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRyZW5UZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9FT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUNvbGxlY3Rpb24gYWNoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAoYWNoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfVHdvX0NoaWxkcmVuX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBUd28gQ2hpbGRyZW4iCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI5Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgVHdvIHswfXMiCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgY3JlYXRlIGNoaWxkcmVuIGhlbHAgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkcmVuVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUNvbGxlY3Rpb24gYWNoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAoYWNoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgdHdvIG5ldyBjaGlsZHJlbiBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI4Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKSwgcmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkID0gIkNyZWF0ZSB0d28gbmV3IGNoaWxkcmVuIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezF9LiIKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBjcmVhdGUgY2hpbGQgbGFiZWwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL0VPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBhY2hpbGRyZW5SZWZlcmVuY2VzID0gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCWlmIChhY2hpbGRyZW5SZWZlcmVuY2VzLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9DaGlsZF9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgQ2hpbGQiCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgezB9IgotCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBkZWZhdWx0IGNyZWF0ZSBjaGlsZCBoZWxwIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGFjaGlsZHJlblJlZmVyZW5jZXMgPSBnZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJaWYgKGFjaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQkJfQotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjRjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEVSZWZlcmVuY2UpIGFjaGlsZHJlblJlZmVyZW5jZXMuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpLCByZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCS8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uIgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ViZTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5MaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsLldlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyLkNvbnRlbnRWaWV3ZXJ9cy4gVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydAotICogTU9GIGFkYXB0ZXIgbm90aWZpY2lhdGlvbnMgaW50byB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuRG9tYWluRXZlbnR9cy4gVGhlIGFkYXB0ZXJzIGFsc28KLSAqIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIGNvbS5pYm0uaXRwLnVpLmFwaS5wcm9wZXJ0eXNoZWV0fS4KLSAqLwotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHB9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBXZWJBcHBJdGVtUHJvdmlkZXIgd2ViQXBwSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW19aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIgY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2V9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFcnJvclBhZ2VJdGVtUHJvdmlkZXIgZXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsdGVySXRlbVByb3ZpZGVyIGZpbHRlckl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZ31pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyIHdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBXZWxjb21lRmlsZUl0ZW1Qcm92aWRlciB3ZWxjb21lRmlsZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFnTGliUmVmSXRlbVByb3ZpZGVyIHRhZ0xpYlJlZkl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyIHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9ufWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyIHdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBVUkxQYXR0ZXJuVHlwZUl0ZW1Qcm92aWRlciB1UkxQYXR0ZXJuVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBIVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlciBoVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnR9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciBhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyIHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTG9naW5Db25maWd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyIGZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBNaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciBtaW1lTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ31pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgc2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldH1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXRJdGVtUHJvdmlkZXIgc2VydmxldEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFdlYlR5cGVJdGVtUHJvdmlkZXIgd2ViVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciBzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIEpTUFR5cGVJdGVtUHJvdmlkZXIgalNQVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTGlzdGVuZXJ9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0ZW5lckl0ZW1Qcm92aWRlciBsaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyIHJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQlwcm90ZWN0ZWQgRGlzcG9zYWJsZSBkaXNwb3NhYmxlID0gbmV3IERpc3Bvc2FibGUoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlcktleSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlclR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHROZXcodGFyZ2V0LCBhZGFwdGVyVHlwZSk7Ci0JCWRpc3Bvc2FibGUuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50fS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCWlmIChhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9IG5ldyBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRleHRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2V9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChlcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID0gbmV3IEVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpIHsKLQkJaWYgKGVycm9yUGFnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllcnJvclBhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgRXJyb3JQYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVycm9yUGFnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChmaWx0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZmlsdGVySXRlbVByb3ZpZGVyID0gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKSB7Ci0JCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyID0gbmV3IExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyIGxvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlpZiAoZm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9IG5ldyBGb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCkgewotCQlpZiAoaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJaWYgKGluaXRQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1JdGVtUHJvdmlkZXIgPSBuZXcgSW5pdFBhcmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTGlzdGVuZXJ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJaWYgKGxpc3RlbmVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IExpc3RlbmVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3RlbmVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUeXBlQWRhcHRlcigpIHsKLQkJaWYgKGpTUFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJalNQVHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBKU1BUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGpTUFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyIHVybFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9IG5ldyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKG1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldEFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZsZXRJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0VHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKU1BUeXBlSXRlbVByb3ZpZGVyIGpzcFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgPSBuZXcgU2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWZ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKSB7Ci0JCWlmICh0YWdMaWJSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFnTGliUmVmSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YWdMaWJSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJMUGF0dGVyblR5cGVBZGFwdGVyKCkgewotCQlpZiAodVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyIGh0dHBNZXRob2RUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1c2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViQXBwfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBcHBBZGFwdGVyKCkgewotCQlpZiAod2ViQXBwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYkFwcEl0ZW1Qcm92aWRlciA9IG5ldyBXZWJBcHBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViQXBwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb259LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlR5cGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCkgewotCQlpZiAod2ViVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFdlYlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpIHsKLQkJaWYgKHdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID0gbmV3IFdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3R9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyID0gbmV3IFdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzcG9zYWJsZS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTMxYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB3ZWxjb21lX2ZpbGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2VsY29tZV9maWxlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZmlsZUxpc3Qgb2YgdGhlIFdlbGNvbWVGaWxlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoV2VsY29tZUZpbGUpIG9iamVjdCkuZ2V0RmlsZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB3ZWxjb21lRmlsZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlbGNvbWVGaWxlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIldlbGNvbWVGaWxlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWxjb21lRmlsZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgd2VsY29tZUZpbGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWxjb21lIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2VsY29tZUZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlbGNvbWVGaWxlX3dlbGNvbWVGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlbGNvbWVGaWxlX3dlbGNvbWVGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlbGNvbWVGaWxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlbGNvbWVGaWxlIHdlbGNvbWVGaWxlID0gKFdlbGNvbWVGaWxlKSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gd2VsY29tZUZpbGUuZ2V0V2VsY29tZUZpbGUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiPHdlbGNvbWUtZmlsZT5fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiPHdlbGNvbWUtZmlsZT4iCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWxjb21lRmlsZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTNkMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3R9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBjaGlsZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPOiBjaGVjayB0aGF0IHRoaXMgaXMgd2hhdCB5b3Ugd2FudC4KLQkJV2VsY29tZUZpbGUgY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVdlbGNvbWVGaWxlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX1dlbGNvbWVGaWxlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBXZWxjb21lRmlsZSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFdlbGNvbWVGaWxlIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgd2VsY29tZV9saXN0LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlbGNvbWVfbGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgV2VsY29tZUZpbGVMaXN0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoV2VsY29tZUZpbGVMaXN0KSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2VsY29tZV9GaWxlX0xpc3RfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2VsY29tZSBGaWxlIExpc3QiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlbGNvbWVGaWxlTGlzdC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dUUHJvamVjdFN0cmF0ZWd5VXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XVFByb2plY3RTdHJhdGVneVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzA0NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dUUHJvamVjdFN0cmF0ZWd5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIFdUUHJvamVjdFN0cmF0ZWd5VXRpbHMgewotCXB1YmxpYyBzdGF0aWMgRmlsZSBmaW5kU291cmNlRmlsZShBcmNoaXZlIGFyY2hpdmUsIFN0cmluZyBmaWxlKSB7Ci0JCWlmIChpc0NsYXNzRmlsZShmaWxlKSkKLQkJCXJldHVybiBmaW5kU291cmNlRmlsZUZvckNsYXNzKGFyY2hpdmUsIGZpbGUpOwotCi0JCS8vIExvb2sgaW4gdGhlIENMQVNTRVMgZGlyZWN0b3J5Ci0JCXRyeSB7Ci0JCQlpZiAoIWlzT3V0cHV0RmlsZShmaWxlKSkKLQkJCQlyZXR1cm4gYXJjaGl2ZS5nZXRGaWxlKGZpbGUpOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy9EbyBub3RoaW5nCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGZpbmRTb3VyY2VGaWxlRm9yQ2xhc3MoQXJjaGl2ZSBhcmNoaXZlLCBTdHJpbmcgY2xhc3NGaWxlKSB7Ci0JCS8vIExvb2sgaW4gdGhlIENMQVNTRVMgZGlyZWN0b3J5Ci0JCUlQYXRoIGNsYXNzRmlsZVBhdGggPSBuZXcgUGF0aChjbGFzc0ZpbGUpOwotCQlJUGF0aCBzb3VyY2VGaWxlUGF0aCA9IGNsYXNzRmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmFkZEZpbGVFeHRlbnNpb24oImphdmEiKTsvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBhcmNoaXZlLmdldEZpbGUoc291cmNlRmlsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy9EbyBub3RoaW5nCi0JCX0KLQotCQkvLyBMb29rIGluIHRoZSBMSUIgZGlyZWN0b3J5Ci0JCXNvdXJjZUZpbGVQYXRoID0gbmV3IFBhdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkuYXBwZW5kKHNvdXJjZUZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGFyY2hpdmUuZ2V0RmlsZShzb3VyY2VGaWxlUGF0aC50b1N0cmluZygpKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0RvIG5vdGhpbmcKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzRmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB1cmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSkgJiYgdXJpLmVuZHNXaXRoKCIuY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3V0cHV0RmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB1cmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU291cmNlRmlsZShTdHJpbmcgdXJpKSB7Ci0JCS8vIEEgZmlsZSBpcyBjb25zaWRlcmVkIGEgamF2YSBzb3VyY2UgZmlsZSBpZiBpdCBpcyBpbiB0aGUKLQkJLy8gV0VCX0lORiBkaXJlY3RvcnkgYW5kIGl0IGRvZXMgbm90IGVuZCB3aXRoIC5jbGFzcy4KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV0VCX0lORiArICIvIikgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQl1cmkuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgcGF0aFN0cmluZywgU3RyaW5nIHJlbFRvUGF0aFN0cmluZykgewotCQlJUGF0aCByZWxUb1BhdGggPSBuZXcgUGF0aChyZWxUb1BhdGhTdHJpbmcpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cmluZyk7Ci0KLQkJaWYgKHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHJlbFRvUGF0aCkgPT0gcmVsVG9QYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyZWxUb1BhdGguc2VnbWVudENvdW50KCkpOwotCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0OWI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVYQ0xVREVfQ09NUElMRV9KU1ApOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChFWENMVURFX0NPTVBJTEVfSlNQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JvbmdDb21wb25lbnRUeXBlU3RyaW5nKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLk5PVF9BX1dBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndhciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogRXhwb3J0cyB0aGUgc3BlY2lmaWVkIFdlYiBNb2R1bGUgcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkIFdBUiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFdlYiBNb2R1bGUgcHJvamVjdCB0byBleHBvcnQuCi0JICogQHBhcmFtIHdhckZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIFdBUiBmaWxlIGxvY2F0aW9uIHRvIGV4cG9ydCB0aGUgc3BlY2lmaWVkIFdlYiBNb2R1bGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRXhpc3RpbmcKLQkgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKLQkgKiAgICAgICAgICAgIDxjb2RlPmVhckZpbGVOYW1lPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuLgotCSAqIEBwYXJhbSBleHBvcnRTb3VyY2UKLQkgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgV2ViIE1vZHVsZQotCSAqICAgICAgICAgICAgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIFdBUiBmaWxlLgotCSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLQkgKi8KLQkvLyBUT0RPOiBkZXRlcm1pbmUgcGxhbiBmb3IgbmV3IERNIFByb3ZpZGVyCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIGV4cG9ydFByb2plY3QoU3RyaW5nIHdlYlByb2plY3ROYW1lLCBTdHJpbmcgd2FyRmlsZU5hbWUsIGJvb2xlYW4KLQkvLyBvdmVyd3JpdGVFeGlzdGluZywgYm9vbGVhbiBleHBvcnRTb3VyY2UpIHsKLQkvLyBXZWJNb2R1bGVFeHBvcnREYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IFdlYk1vZHVsZUV4cG9ydERhdGFNb2RlbCgpOwotCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHdlYlByb2plY3ROYW1lKTsKLQkvLyBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KE9WRVJXUklURV9FWElTVElORywgb3ZlcndyaXRlRXhpc3RpbmcpOwotCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX0RFU1RJTkFUSU9OLCB3YXJGaWxlTmFtZSk7Ci0JLy8gZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2UpOwotCS8vIHRyeSB7Ci0JLy8gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5ydW4obnVsbCk7Ci0JLy8gfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JLy8gTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCS8vIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkvLyBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JLy8gfQotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhYWU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhwb3J0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCBFWFBPUlRfV09SSyk7Ci0JCUlBcmNoaXZlIGFyY2hpdmVGcm9tQ29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFyY2hpdmVGcm9tQ29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCQkJaWYgKHF1aWNrUGVlay5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSjJFRUNvbnN0YW50cy5KRUVfNV8wX0lEKSB7Ci0JCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGNhZiA9ICgoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJCVdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbHMgPSBuZXcgV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChnZXRDb21wb25lbnQoKSk7Ci0JCQkJbHMuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwotCQkJCXNldE1vZHVsZUZpbGUoY2FmLm9wZW5XQVJGaWxlKGxzLCBnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpKTsKLQkJCQlscy5zZXRQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvcik7Ci0JCQkJZ2V0TW9kdWxlRmlsZSgpLnNhdmVBc05vUmVvcGVuKGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFyY2hpdmVGcm9tQ29tcG9uZW50ICE9IG51bGwpCi0JCQkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5jbG9zZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCi0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVN0cmluZygpIHsKLQkJcmV0dXJuICJXYXIgRmlsZSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQyNmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGRhdGFNb2RlbCBpcyB1c2VkIGZvciB0byBpbXBvcnQgV2ViIE1vZHVsZXMgKGZyb20gV0FSIGZpbGVzKSBpbnRvIHRoZSB3b3Jrc3BhY2UuCi0gKiAKLSAqIFRoaXMgY2xhc3MgKGFuZCBhbGwgaXRzIGZpZWxkcyBhbmQgbWV0aG9kcykgaXMgbGlrZWx5IHRvIGNoYW5nZSBkdXJpbmcgdGhlIFdUUCAxLjAgbWlsZXN0b25lcyBhcwotICogdGhlIG5ldyBwcm9qZWN0IHN0cnVjdHVyZXMgYXJlIGFkb3B0ZWQuIFVzZSBhdCB5b3VyIG93biByaXNrLgotICogCi0gKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFdFQl9MSUJfTU9ERUxTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTlRFWFRfUk9PVCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoV0VCX0xJQl9NT0RFTFMpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBYTUxSZXNvdXJjZS5XRUJfQVBQX1RZUEU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25UeXBlKEphdmFFRVF1aWNrUGVlayBqcXApIHsKLQkJanFwLnNldFR5cGUoSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUpOwotCQlqcXAuc2V0VmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEKTsKLQkJanFwLnNldEphdmFFRVZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZU1vZHVsZVR5cGUoKSB7Ci0JCWlmIChnZXRBcmNoaXZlV3JhcHBlcigpLmdldEphdmFFRVF1aWNrUGVlaygpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLldFQl9UWVBFKQotCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQotCQkvLyBUT0RPOiBTVFJJTkcgTU9WRQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiVGVtcCBTdHJpbmcgZm9yIG5vbmUgV0FSRmlsZSIpKTsgLy8kTk9OLU5MUy0xJCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQVJDSElWRV9XUkFQUEVSKSkgewotCQkJCi0JCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCWlmIChnZXRBcmNoaXZlV3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkKLQkJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZHVsZURNLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCQlJRGF0YU1vZGVsIHdlYkZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQiApOwotCQkJCQotCQkJCWludCB2ZXJzaW9uID0gZ2V0TW9kdWxlU3BlY1ZlcnNpb24oKTsKLQkJCQlTdHJpbmcgdmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuZ2V0U2VydmxldFRleHRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0JCQkJd2ViRmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOwotCQkJCXVwZGF0ZUphdmFGYWNldFZlcnNpb24oKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl9CQkJCi0JCQkKLQkJCUFyY2hpdmVXcmFwcGVyIGFyY2hpdmVXcmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKSBwcm9wZXJ0eVZhbHVlOwotCQkJaWYgKG51bGwgIT0gYXJjaGl2ZVdyYXBwZXIpIHsKLQkJCQlMaXN0IDxBcmNoaXZlV3JhcHBlcj4gbGlicyA9IGFyY2hpdmVXcmFwcGVyLmdldFdlYkxpYnMoKTsKLQkJCQlMaXN0IG5lc3RlZE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSURhdGFNb2RlbCBsb2NhbE1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEoyRUVVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSLCBsaWJzLmdldChpKSk7Ci0JCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBnZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKTsKLQkJCQkJSURhdGFNb2RlbCBmYWNldERhdGFNb2RlbCA9IGxvY2FsTW9kZWwuZ2V0TmVzdGVkTW9kZWwoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCQkJCWZhY2V0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0JCQkJCW5lc3RlZE1vZGVscy5hZGQobG9jYWxNb2RlbCk7Ci0JCQkJfQotCQkJCXNldFByb3BlcnR5KFdFQl9MSUJfTU9ERUxTLCBuZXN0ZWRNb2RlbHMpOwotCQkJfQotCQl9ZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFWFRfUk9PVCkpewotCQkJSURhdGFNb2RlbCBjcmVhdGlvbk1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgY3JlYXRpb25Nb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQlJRGF0YU1vZGVsIHdlYkZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQiApOwotCQkJd2ViRmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09ULCAoU3RyaW5nKXByb3BlcnR5VmFsdWUpOwotCQl9ZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKFdFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpKSB7Ci0JCQl2YWxpZGF0ZUxpYk1vZGVsUnVudGltZXMoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZihGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JCQlyZXR1cm4gdmFsaWRhdGVMaWJNb2RlbFJ1bnRpbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUxpYk1vZGVsUnVudGltZXMoKSB7Ci0JCUxpc3QgbGliQXJjaGl2ZXMgPSAoTGlzdClnZXRQcm9wZXJ0eShXRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKTsKLQkJTGlzdCBsaWJNb2RlbHMgPSAoTGlzdClnZXRQcm9wZXJ0eShXRUJfTElCX01PREVMUyk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCQlmb3IgKGludCBpPTA7IGkgPCBsaWJNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlEYXRhTW9kZWwgbGliTW9kZWwgPSAoSURhdGFNb2RlbClsaWJNb2RlbHMuZ2V0KGkpOwotCQkJaWYgKGxpYkFyY2hpdmVzLmNvbnRhaW5zKGxpYk1vZGVsLmdldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUikpKXsKLQkJCQlzdGF0dXMgPSBsaWJNb2RlbC52YWxpZGF0ZVByb3BlcnR5KEZBQ0VUX1JVTlRJTUUpOwotCQkJfQotCQkJaWYoIXN0YXR1cy5pc09LKCkpewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5XQVJGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCUlEYXRhTW9kZWwgY29tcG9uZW50Q3JlYXRpb25ETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgY29tcG9uZW50Q3JlYXRpb25ETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCUlEYXRhTW9kZWwgd2ViRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUIgKTsJCi0JCXdlYkZhY2V0LnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKSAmJiBldmVudC5nZXREYXRhTW9kZWwoKSA9PSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pKSB7Ci0JCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlJRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gbnVsbDsKLQkJCUxpc3QgcHJvamVjdE1vZGVscyA9IChMaXN0KSBnZXRQcm9wZXJ0eShXRUJfTElCX01PREVMUyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQluZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKSBwcm9qZWN0TW9kZWxzLmdldChpKTsKLQkJCQluZXN0ZWRNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIHByb3BlcnR5VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ0NWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLldlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcy5JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBpbnQgTElOS19DT01QT05FTlRTX1dPUksgPSAxMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IExJQl9GT0xERVJfV09SSyA9IDI7Ci0JCi0JcHJvdGVjdGVkIGludCBjb21wdXRlVG90YWxXb3JrKCkgewotCQlpbnQgYmFzZVdvcmsgPSBzdXBlci5jb21wdXRlVG90YWxXb3JrKCkgKyBMSUJfRk9MREVSX1dPUks7Ci0JCUxpc3Qgc2VsZWN0ZWRMaWJzID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpOwotCQlMaXN0IGxpYlByb2plY3RzID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfTU9ERUxTKTsKLQkJSURhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0JCUFyY2hpdmVXcmFwcGVyIGxpYkFyY2hpdmUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgbnVsbCAhPSBsaWJQcm9qZWN0cyAmJiBpIDwgbGliUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCWltcG9ydE1vZGVsID0gKElEYXRhTW9kZWwpIGxpYlByb2plY3RzLmdldChpKTsKLQkJCWxpYkFyY2hpdmUgPSAoQXJjaGl2ZVdyYXBwZXIpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJaWYgKHNlbGVjdGVkTGlicy5jb250YWlucyhsaWJBcmNoaXZlKSkgewotCQkJCWJhc2VXb3JrICs9IExJTktfQ09NUE9ORU5UU19XT1JLICsgUFJPSkVDVF9DUkVBVElPTl9XT1JLICsgbGliQXJjaGl2ZS5nZXRTaXplKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBiYXNlV29yazsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvRXhlY3V0ZShtb25pdG9yKTsKLQkJSVZpcnR1YWxGb2xkZXIgbGliRm9sZGVyID0gdmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKFdlYkFydGlmYWN0RWRpdC5XRUJMSUIpOwotCQlpZiAoIWxpYkZvbGRlci5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlsaWJGb2xkZXIuY3JlYXRlKElSZXNvdXJjZS5GT1JDRSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBMSUJfRk9MREVSX1dPUkspKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1vbml0b3Iud29ya2VkKExJQl9GT0xERVJfV09SSyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWltcG9ydFdlYkxpYnJhcnlQcm9qZWN0cyhtb25pdG9yKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRXZWJMaWJyYXJ5UHJvamVjdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUxpc3QgPEFyY2hpdmVXcmFwcGVyPiBzZWxlY3RlZExpYnMgPSAoTGlzdDxBcmNoaXZlV3JhcHBlcj4pIG1vZGVsLmdldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpOwotCQlMaXN0IDxPYmplY3Q+IHNlbGVjdGVkTGlic1VuZGVybHlpbmdBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKEFyY2hpdmVXcmFwcGVyIGxpYjogc2VsZWN0ZWRMaWJzKXsKLQkJCXNlbGVjdGVkTGlic1VuZGVybHlpbmdBcmNoaXZlcy5hZGQobGliLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkpOwotCQl9Ci0JCUxpc3QgPElEYXRhTW9kZWw+IGxpYlByb2plY3RzID0gKExpc3QgPElEYXRhTW9kZWw+KSBtb2RlbC5nZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX01PREVMUyk7Ci0JCUlEYXRhTW9kZWwgaW1wb3J0TW9kZWwgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBuZXN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlBcmNoaXZlV3JhcHBlciBsaWJBcmNoaXZlID0gbnVsbDsKLQkJTGlzdCB0YXJnZXRDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlNYXAgY29tcFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IG51bGwgIT0gbGliUHJvamVjdHMgJiYgaSA8IGxpYlByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlpbXBvcnRNb2RlbCA9IChJRGF0YU1vZGVsKSBsaWJQcm9qZWN0cy5nZXQoaSk7Ci0JCQlsaWJBcmNoaXZlID0gKEFyY2hpdmVXcmFwcGVyKSBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQkJCWlmIChzZWxlY3RlZExpYnNVbmRlcmx5aW5nQXJjaGl2ZXMuY29udGFpbnMobGliQXJjaGl2ZS5nZXRVbmRlckx5aW5nQXJjaGl2ZSgpKSkgewotCQkJCWltcG9ydE1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgUFJPSkVDVF9DUkVBVElPTl9XT1JLICsgbGliQXJjaGl2ZS5nZXRTaXplKCkpICwgaW5mbyk7Ci0JCQkJbmVzdGVkQ29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UKTsKLQkJCQl0YXJnZXRDb21wb25lbnRzLmFkZChuZXN0ZWRDb21wb25lbnQpOwotCQkJCVN0cmluZyBhcmNoaXZlVVJJID0gbGliQXJjaGl2ZS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCQljb21wVG9VUklNYXAucHV0KG5lc3RlZENvbXBvbmVudCwgYXJjaGl2ZVVSSSk7Ci0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIFRoZSBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbnIgd2lsbCBoYW5kbGUgYWRkaW5nIHRoZXNlIHRvIHRoZSBjbGFzc3BhdGgsIHNvIHRoZXkKLQkJICogZG9uJ3QgbmVlZCB0byBiZSBhZGRlZCBoZXJlLgotCQkgKi8KLQkJaWYgKHRhcmdldENvbXBvbmVudHMuc2l6ZSgpID4gMCkgewotCQkJSURhdGFNb2RlbCBjcmVhdGVSZWZDb21wb25lbnRzTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJY3JlYXRlUmVmQ29tcG9uZW50c01vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCB2aXJ0dWFsQ29tcG9uZW50KTsKLQkJCWNyZWF0ZVJlZkNvbXBvbmVudHNNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsICIvV0VCLUlORi9saWIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZVJlZkNvbXBvbmVudHNNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCB0YXJnZXRDb21wb25lbnRzKTsKLQkJCWNyZWF0ZVJlZkNvbXBvbmVudHNNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcFRvVVJJTWFwKTsKLQkJCWNyZWF0ZVJlZkNvbXBvbmVudHNNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIExJTktfQ09NUE9ORU5UU19XT1JLICogdGFyZ2V0Q29tcG9uZW50cy5zaXplKCkpLCBpbmZvKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IGFWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChhVmlydHVhbENvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBnZXRBcmNoaXZlU2F2ZUFkYXB0ZXIoCi0JCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM0N2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5XZWJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCXB1YmxpYyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCQotCXB1YmxpYyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZpbGVzKCkgewotCQlzdXBlci5nZXRGaWxlcygpOwotCQlhZGRMb29zZUxpYkpBUnNUb0ZpbGVzKCk7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJYWRkTWFwcGVkQ2xhc3NGb2xkZXJzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFU19QQVRIKTsKLQkJfQotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRMaWJNb2R1bGVzKCkgewotCQlyZXR1cm4gV2ViVXRpbGl0aWVzLmdldExpYk1vZHVsZXMoZ2V0Q29tcG9uZW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvb3NlTGliSkFSc1RvRmlsZXMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gbGliTW9kdWxlcyA9IGdldExpYk1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJNb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSBpTGliTW9kdWxlID0gbGliTW9kdWxlc1tpXTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGxvb3NlQ29tcG9uZW50ID0gaUxpYk1vZHVsZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAobG9vc2VDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBsb29zZUNvbXBvbmVudDsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlpZiAoIWRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHVyaSA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpICsgIi8iICsgZGlza0ZpbGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkRXh0ZXJuYWxGaWxlKHVyaSwgZGlza0ZpbGUpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IGlMaWJNb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQlpZiAoYXJjaGl2ZU5hbWUgIT0gbnVsbCAmJiBhcmNoaXZlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGFyY2hpdmVOYW1lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5hbWUgPSBsb29zZUNvbXBvbmVudC5nZXROYW1lKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5jaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSkhPSAnLycpIHsKLQkJCQkJcHJlZml4ICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhsb29zZUNvbXBvbmVudCk7Ci0JCQkJCi0JCQkJU3RyaW5nIHVyaSA9IHByZWZpeCArIG5hbWU7Ci0JCQkJdHJ5IHsKLQkJCQkJQXJjaGl2ZSB1dGlsSkFSID0gSjJFRVByb2plY3RVdGlsaXRpZXMuYXNBcmNoaXZlKHVyaSwgbG9vc2VDb21wb25lbnQuZ2V0UHJvamVjdCgpLCBpc0V4cG9ydFNvdXJjZSgpKTsKLQkJCQkJaWYgKHV0aWxKQVIgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKHV0aWxKQVIpOwotCQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIG9lKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl8sIG5ldyBPYmplY3RbXXt1cmksIGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCksIG9lLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlpZihhcnRpZmFjdEVkaXQgPT0gbnVsbCl7Ci0JCQlhcnRpZmFjdEVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJLy8gcmV0cmlldmUgYWxsIEphdmEgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzICYmIHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07Ci0JCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSByZWYuZ2V0UnVudGltZVBhdGgoKTsKLQkJCQkKLQkJCQkvLyBvbmx5IHByb2Nlc3MgLi4vIG1hcHBpbmdzCi0JCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudAotCQkJCQkJJiYgcnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewotCQkJCQlmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQlGaWxlIGNwRW50cnlGaWxlID0gY29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQkJaWYgKCFjcEVudHJ5RmlsZS5leGlzdHMoKSkgewotCQkJCQkJZmluYWwgSUZpbGUgd2JGaWxlID0gY29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQkJY3BFbnRyeUZpbGUgPSBuZXcgRmlsZSh3YkZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWFkZEV4dGVybmFsRmlsZSgiV0VCLUlORi9saWIvIiArIHJlZi5nZXRBcmNoaXZlTmFtZSgpLCBjcEVudHJ5RmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MmExOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgewotCi0JcHVibGljIFdlYkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBhcmNoaXZlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9wZXJhdGlvbkhhbmRsZXNOZXN0ZWQoQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXJldHVybiAhc2hvdWxkTGlua0FzQ29tcG9uZW50UmVmKGFyY2hpdmUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEltcG9ydGVkQ2xhc3Nlc1RvQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gZmFsc2U7IC8vIG5ldmVyIGFkZCB0byBjbGFzc3BhdGggYmVjYXVzZSB0aGUgd2ViIGFwcCBjb250YWluZXIgd2lsbCBwaWNrIHRoaXMgdXAuCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbXBvcnRlZENsYXNzZXNVUkkoRmlsZSBhRmlsZSkgewotCQlTdHJpbmcgdXJpID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCXJldHVybiBXVFByb2plY3RTdHJhdGVneVV0aWxzLm1ha2VSZWxhdGl2ZSh1cmksIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0SW1wb3J0ZWRDbGFzc2VzUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aCgiLyIgKyBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldE91dHB1dFBhdGhGb3JGaWxlKEZpbGUgYUZpbGUpIHsKLQkJaWYgKG51bGwgIT0gbm9uU3RhbmRhcmRTb3VyY2VGaWxlcyAmJiBub25TdGFuZGFyZFNvdXJjZUZpbGVzLmNvbnRhaW5zS2V5KGFGaWxlKSkgewotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKChTdHJpbmcpIG5vblN0YW5kYXJkU291cmNlRmlsZXMuZ2V0KGFGaWxlKSk7Ci0JCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQlyZXR1cm4gaUZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRPdXRwdXRQYXRoRm9yRmlsZShhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXAgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIGEgamF2YSBzb3VyY2UgZmlsZSBpcyBub3QgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlIC5jbGFzcwotCSAqIGZpbGUuIEZvciBleGFtcGxlIGlmIGFsbCB0aGUgc291cmNlIGZpbGVzIHdlcmUgY29udGFpbmVkIGluIFdFQi1JTkYvc291cmNlCi0JICovCi0JcHJvdGVjdGVkIE1hcCBub25TdGFuZGFyZFNvdXJjZUZpbGVzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGFzc1dpdGhvdXRTb3VyY2UoRmlsZSBhRmlsZSkgewotCQlTdHJpbmcgamF2YVVyaSA9IEFyY2hpdmVVdGlsLmNsYXNzVXJpVG9KYXZhVXJpKGFGaWxlLmdldFVSSSgpKTsKLQkJaWYgKGphdmFVcmkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFyY2hpdmUuY29udGFpbnNGaWxlKGphdmFVcmkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gc2VlIGlmIGl0IGlzIGEgSlNQCi0JCVN0cmluZyBqc3BVcmkgPSBqYXZhVXJpLnN1YnN0cmluZygwLCBqYXZhVXJpLmluZGV4T2YoQXJjaGl2ZVV0aWwuRE9UX0pBVkEpKTsKLQkJaW50IGxhc3RTbGFzaCA9IGpzcFVyaS5sYXN0SW5kZXhPZignLycpOwotCQlpbnQgX2luZGV4ID0gbGFzdFNsYXNoID09IC0xID8gQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkubGVuZ3RoKCkgOiBsYXN0U2xhc2ggKyAxOwotCQlpZiAoanNwVXJpLmNoYXJBdChfaW5kZXgpID09ICdfJykgewotCQkJanNwVXJpID0ganNwVXJpLnN1YnN0cmluZyhBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSS5sZW5ndGgoKSwgX2luZGV4KSArIGpzcFVyaS5zdWJzdHJpbmcoX2luZGV4ICsgMSkgKyBBcmNoaXZlVXRpbC5ET1RfSlNQOwotCQkJaWYgKGFyY2hpdmUuY29udGFpbnNGaWxlKGpzcFVyaSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZWUgaWYgdGhlIHNvdXJjZSBpcyBpbiBhbm90aGVyIGRpcmVjdG9yeQotCQlGaWxlIHNvdXJjZUZpbGUgPSAoKFdBUkZpbGUpIGFyY2hpdmUpLmdldFNvdXJjZUZpbGUoYUZpbGUpOwotCQlpZiAobnVsbCA9PSBzb3VyY2VGaWxlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobm9uU3RhbmRhcmRTb3VyY2VGaWxlcyA9PSBudWxsKSB7Ci0JCQlub25TdGFuZGFyZFNvdXJjZUZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlpZiAoIW5vblN0YW5kYXJkU291cmNlRmlsZXMuY29udGFpbnNLZXkoc291cmNlRmlsZSkpIHsKLQkJCW5vblN0YW5kYXJkU291cmNlRmlsZXMucHV0KHNvdXJjZUZpbGUsIGphdmFVcmkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5M2RkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0gICAgICAgIAotCQlDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXQ+IHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCX0ZBQ0VUKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0gICAgICAgIElEYXRhTW9kZWwgamF2YUZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VULmdldElkKCkgKTsKLQkJSURhdGFNb2RlbCB3ZWJGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9GQUNFVC5nZXRJZCgpICk7Ci0JCVN0cmluZyB3ZWJSb290ID0gd2ViRmFjZXQuZ2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7Ci0JCVN0cmluZyB3ZWJTcmMgPSB3ZWJGYWNldC5nZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSKTsKLQkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIHdlYlNyYyk7Ci0JCS8vIElmIHVzaW5nIG9wdGltaXplZCBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUsIHNldCB0aGUgb3V0cHV0IGZvbGRlciB0byAiPGNvbnRlbnQgZm9sZGVyPi9XRUItSU5GL2NsYXNzZXMiCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCi0JCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCB3ZWJSb290KyIvIitKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUyk7IC8vJE5PTi1OTFMtMSQKLQkJd2ViRmFjZXQuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWlmIChpc1Byb3BlcnR5U2V0KEVBUl9QUk9KRUNUX05BTUUpKQotCQkJCQkJc2V0UHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCX1lbHNlIGlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCXNldFByb3BlcnR5KEFERF9UT19FQVIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBNT0RVTEVfVVJJICkpewotCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQkJSURhdGFNb2RlbCB3ZWJGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIgKTsJCi0JCQl3ZWJGYWNldC5zZXRQcm9wZXJ0eSggSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksIHByb3BlcnR5VmFsdWUgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjAwYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguRmxleGlibGVQcm9qZWN0Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lciAKLSAgICAKLSAgICBleHRlbmRzIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcgotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoW10gcGF0aHMgCi0gICAgICAgID0gbmV3IElQYXRoW10geyBuZXcgUGF0aCggIldFQi1JTkYvbGliIiApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKCAiV0VCLUlORi9jbGFzc2VzIiApIH07Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0aFR5cGVbXSB0eXBlcyAKLSAgICAgICAgPSBuZXcgUGF0aFR5cGVbXSB7IFBhdGhUeXBlLkxJQl9ESVJFQ1RPUlksIFBhdGhUeXBlLkNMQVNTRVNfRElSRUNUT1JZIH07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0lEIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIjsKLSAgICAKLSAgICBwdWJsaWMgV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKCBmaW5hbCBJUGF0aCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCApCi0gICAgewotICAgICAgICAgc3VwZXIoIHBhdGgsIGpwcm9qZWN0LCBnZXRQcm9qZWN0KCBwYXRoLCBqcHJvamVjdCksIHBhdGhzLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLm93bmVyLmdldFByb2plY3QoKSAhPSB0aGlzLnByb2plY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy5sYWJlbFdpdGhQcm9qZWN0LCB0aGlzLnByb2plY3QuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmxhYmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGluc3RhbGwoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W10geyB0aGlzLm93bmVyIH07Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXJbXSBjb250cyA9IG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyB0aGlzIH07Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lciggcGF0aCwgcHJvamVjdHMsIGNvbnRzLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgV2ViUGx1Z2luLmxvZyggZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICAgIHsKLSAgICAgICAgKCBuZXcgV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKCB0aGlzLnBhdGgsIHRoaXMub3duZXIgKSApLmluc3RhbGwoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3QgZ2V0UHJvamVjdCggZmluYWwgSVBhdGggcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgKQotICAgIHsKLSAgICAgICAgaWYoIHBhdGguc2VnbWVudENvdW50KCkgPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBqcHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHBhdGguc2VnbWVudCggMSApOwotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCggbmFtZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFdpdGhQcm9qZWN0OwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmRjYzE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWxhYmVsID0gV2ViIEFwcCBMaWJyYXJpZXMKLWxhYmVsV2l0aFByb2plY3QgPSBXZWIgQXBwIExpYnJhcmllcyBbezB9XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDJhN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lckluaXRpYWxpemVyCi0KLSAgICBleHRlbmRzIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyCi0KLXsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCBmaW5hbCBJUGF0aCBwYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2ogKQotCi0JICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0KLQl7Ci0JICAgICggbmV3IFdlYkFwcExpYnJhcmllc0NvbnRhaW5lciggcGF0aCwganByb2ogKSApLmluc3RhbGwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ2xhc3NwYXRoVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NsYXNzcGF0aFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFlMWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ2xhc3NwYXRoVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhVdGlsaXRpZXMgewotCi0Jc3RhdGljIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBhZGRDbGFzc3BhdGhFbnRyaWVzKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMxLCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzMikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGVudHJpZXMxLmxlbmd0aCArIGVudHJpZXMyLmxlbmd0aCk7Ci0JCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW50cmllczEpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMyLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgaUNsYXNzcGF0aEVudHJ5ID0gZW50cmllczJbaV07Ci0JCQlpZiAoIWxpc3QuY29udGFpbnMoaUNsYXNzcGF0aEVudHJ5KSkKLQkJCQlsaXN0LmFkZChpQ2xhc3NwYXRoRW50cnkpOwotCQl9Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gcmV0ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtsaXN0LnNpemUoKV07Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIGxpc3QudG9BcnJheShyZXQpOwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBlbnRyeUV4aXN0cyhJQ2xhc3NwYXRoRW50cnkgZW50cnksIElDbGFzc3BhdGhFbnRyeVtdIGNvbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IG90aGVyRW50cnkgPSBjb2xbaV07Ci0JCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSAhPSBvdGhlckVudHJ5LmdldENvbnRlbnRLaW5kKCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBvdGhlckVudHJ5LmdldEVudHJ5S2luZCgpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZW50cnkuaXNFeHBvcnRlZCgpICE9IG90aGVyRW50cnkuaXNFeHBvcnRlZCgpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5lcXVhbHMob3RoZXJFbnRyeS5nZXRQYXRoKCkpKQotCQkJCWNvbnRpbnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVtb3ZlQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnlbXSByZW1vdmVGcm9tQ29sLCBJQ2xhc3NwYXRoRW50cnlbXSByZW1vdmVDb2wpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChyZW1vdmVGcm9tQ29sLmxlbmd0aCk7Ci0JCS8vCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHJlbW92ZUZyb21Db2wpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZUZyb21Db2wubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBpQ2xhc3NwYXRoRW50cnkgPSByZW1vdmVGcm9tQ29sW2ldOwotCQkJaWYgKCFlbnRyeUV4aXN0cyhpQ2xhc3NwYXRoRW50cnksIHJlbW92ZUNvbCkpCi0JCQkJbGlzdC5hZGQoaUNsYXNzcGF0aEVudHJ5KTsKLQkJfQotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIHJldCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKSBsaXN0LnRvQXJyYXkocmV0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGUyYmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyAgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JCi0JcHVibGljIENvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05WRVJUX1RPX1dFQl9WRVJTSU9OKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjIxYjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbihJRGF0YU1vZGVsIGRtKSB7Ci0JCXN1cGVyKGRtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCWRvQ29udmVydCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlXZWJQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkKLQkJCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJCi0JCVN0cmluZyBzZWxlY3RlZFZlcnNpb24gPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OVkVSVF9UT19XRUJfVkVSU0lPTik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUKTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQlTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpOwotCQlmaXhlZEZhY2V0cy5hZGRBbGwoZmFjZXRlZFByb2plY3QuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkpOwotCQlJUHJvamVjdEZhY2V0IHdlYkZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpOwotCQlmaXhlZEZhY2V0cy5yZW1vdmUod2ViRmFjZXQpOwotCQlmaXhlZEZhY2V0cy5hZGQoV2ViRmFjZXRVdGlscy5XRUJfRkFDRVQpOwotCQlmaXhlZEZhY2V0cy5hZGQoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVCk7Ci0JCWZhY2V0ZWRQcm9qZWN0LnNldEZpeGVkUHJvamVjdEZhY2V0cyhmaXhlZEZhY2V0cyk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHdlYkZ2ID0gV2ViRmFjZXRVdGlscy5XRUJfRkFDRVQuZ2V0VmVyc2lvbihzZWxlY3RlZFZlcnNpb24pOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhRnYgPSBKYXZhRmFjZXRVdGlscy5jb21waWxlckxldmVsVG9GYWNldChKYXZhRmFjZXRVdGlscy5nZXRDb21waWxlckxldmVsKHByb2plY3QpKTsKLQkJSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiB1bmluc3RhbGwgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbihJRmFjZXRlZFByb2plY3QuQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmYWNldGVkUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKHdlYkZhY2V0KSwgbnVsbCk7Ci0JCUlEYXRhTW9kZWwgd2ViTW9kZWxDZmcgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCXdlYk1vZGVsQ2ZnLnNldEJvb2xlYW5Qcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0JCS8vIEdldCB0aGUgZGVmYXVsdCB3ZWIgcm9vdCBmb2xkZXIgbmFtZSAoanVzdCBpbiBjYXNlIHRoZSAuY29tcG9uZW50IGZpbGUgZG9lc24ndCBleGlzdCBmb3Igc29tZSByZWFzb24pCi0JCVN0cmluZyB3ZWJSb290ID0gd2ViTW9kZWxDZmcuZ2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWMuY3JlYXRlKDAsIG51bGwpOwotCQlpZiAoYy5leGlzdHMoKSkgewotCQkJLy8gR2V0IHRoZSB3ZWIgcm9vdCBmb2xkZXIgZnJvbSB0aGUgLmNvbXBvbmVudCBmaWxlIAotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJd2ViUm9vdCA9IHJvb3QuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldE5hbWUoKTsKLQkJCS8vIFN0b3JlIHRoZSBuYW1lIGludG8gdGhlIHByb3BlcnRpZXMgZm9yIHVzZSBkdXJpbmcgZmFjZXQgaW5zdGFsCi0JCQl3ZWJNb2RlbENmZy5zZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSLCB3ZWJSb290KTsKLQkJfQotCi0JCUlEYXRhTW9kZWwgamF2YU1vZGVsQ2ZnID0gbnVsbDsKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSl7Ci0JCQlqYXZhTW9kZWxDZmcgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJamF2YU1vZGVsQ2ZnLnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5ERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSwKLQkJCQkJd2ViUm9vdCsiLyIrIEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkKLQkJCi0JCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gaW5zdGFsbCA9IG5ldyBJRmFjZXRlZFByb2plY3QuQWN0aW9uKElGYWNldGVkUHJvamVjdC5BY3Rpb24uVHlwZS5JTlNUQUxMLHdlYkZ2LHdlYk1vZGVsQ2ZnKTsKLQkJSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiBqYXZhSW5zdGFsbCA9IG5ldyBJRmFjZXRlZFByb2plY3QuQWN0aW9uKElGYWNldGVkUHJvamVjdC5BY3Rpb24uVHlwZS5JTlNUQUxMLCBqYXZhRnYsIGphdmFNb2RlbENmZyk7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKHVuaW5zdGFsbCk7Ci0JCXNldC5hZGQoaW5zdGFsbCk7Ci0JCXNldC5hZGQoamF2YUluc3RhbGwpOwotCQlmYWNldGVkUHJvamVjdC5tb2RpZnkoc2V0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lXZWJQcm9qZWN0V2l6YXJkSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViUHJvamVjdFdpemFyZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZTEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lXZWJQcm9qZWN0V2l6YXJkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViUHJvamVjdFdpemFyZEluZm8gewotCS8qKgotCSAqIEFkZHMgZW50cmllcyB0byB0aGUgY2xhc3MgcGF0aCBmb3IgdGhpcyBwcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGhFbnRyaWVzKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBDcmVhdGlvbiBkYXRlOiAoMTEvMDkvMDAgMTA6MDU6MjQgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVBUlByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHdlYiBjb250ZW50IGZvbGRlci4gSWYgbm90IHNldCB0aGVuIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViQ29udGVudE5hbWUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgd2ViIGNvbnRlbnQgZm9sZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQ29udGVudE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSBKYXZhIHNvdXJjZSBmb2xkZXIgSWYgbm90IHNldCB0aGVuIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVNvdXJjZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgSmF2YSBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZU5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIE9iamVjdCBmb3IgdGhlIGFzc29jYXRlZCBwcm9wZXJ0aWVzIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogU2V0IGFuIE9iamVjdCBmb3IgdGhlIGFzc29jYXRlZCBwcm9wZXJ0aWVzIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViVG9vbGluZ0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViVG9vbGluZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzUwNTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLQotCi0vKgotICogVGhlIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIGFyZSB0aGUgbGlzdCBvZiB0YWdzIHRoYXQgYXJlIHVzdWFibGUgZm9yIHNwZWNpZnlpbmcgYSB3ZWIKLSAqIGFwcGxpY2F0aW9uIHBhcmFtZXRlcnMgdmlhIFhNTAotICogCi0gKiBAc2VlIFdlYkFwcGxpY2F0aW9uU3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZ1bGwgRFRECi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJV2ViVG9vbGluZ0NvbnN0YW50cyB7Ci0KLQlwdWJsaWMgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cmluZyBIVFRQX1BBVEhfUFJFRklYID0gImh0dHA6Ly8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJTkRFWF9GSUxFID0gImluZGV4Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBIVFRQX1BBUkFNRVRFUl9TRVBBUkFUT1IgPSAiPyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTlRFTlRfTEVOR1RIX0hFQURFUl9LRVkgPSAiQ29udGVudC1MZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIFNFTlRFTkNFX1RFUk1JTkFUT1IgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJpbmcgUE9TVF9DT01NQU5EID0gIlBPU1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBHRVRfQ09NTUFORCA9ICJHRVQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViVG9vbGluZ0NvcmVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb3JlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWVhYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViVG9vbGluZ0NvcmVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotLyoqCi0gKiBUaGUgSVdlYlRvb2xpbmdDb3JlQ29uc3RhbnRzIGFyZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIGJ5IHRoZSBJVFAgY29yZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJUb29saW5nQ29yZUNvbnN0YW50cyB7Ci0JcHVibGljIFN0cmluZyBQTFVHX0lOX0lEID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9TRVJWTEVUX0pBUiA9ICJjb20uaWJtLmV0b29scy53ZWJ0b29scy5zZXJ2bGV0amFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9XRUJBU19KQVIgPSAiY29tLmlibS5ldG9vbHMud2VidG9vbHMud2ViYXNqYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBQUk9QX0NMSUVOVF9OQU1FID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLmNsaWVudG5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBQUk9QX0xJTktfU1RZTEUgPSAiY29tLmlibS5ldG9vbHMud2VidG9vbHMubGlua3N0eWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9NT0RJRllfTElOS19QUk9NUFQgPSAiY29tLmlibS5ldG9vbHMud2VidG9vbHMubW9kaWZ5cHJvbXB0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9BVVRPX01PRElGWV9MSU5LID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLmF1dG9tb2RpZnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKRFRfSURFTlRJRklFUiA9ICJvcmcuZWNsaXBzZS5qZHQudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSVU5USU1FX0lERU5USUZJRVIgPSAiV2ViTmF0dXJlUnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERPQ19SRUxBVElWRSA9ICJET0NfUkVMQVRJVkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBET0NfUk9PVF9SRUxBVElWRSA9ICJET0NfUk9PVF9SRUxBVElWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElDT05fUEFUSCA9ICJpY29ucyI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL01hc3RlckNTUy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9NYXN0ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzFiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL01hc3RlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi0KLQotLyoqCi0gKiBDb2RlIGdlbmVyYXRpb24gY2xhc3MgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZSBmaWxlIE1hc3RlckNTUy50cGwKLSAqLwotcHVibGljIGNsYXNzIE1hc3RlckNTUyBpbXBsZW1lbnRzIFdlYlRvb2xpbmdUZW1wbGF0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJCT0RZXHJcbntcclxuICAgIEJBQ0tHUk9VTkQtQ09MT1I6ICNGRkU0QjU7XHJcbiAgICBDT0xPUjogYmxhY2s7XHJcbiAgICBGT05ULUZBTUlMWTogJ1RpbWVzIE5ldyBSb21hbidcclxufVxyXG5IMVxyXG57XHJcbiAgICBDT0xPUjogbmF2eTtcclxuICAgIEZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJztcclxuICAgIEZPTlQtU0laRTogeC1sYXJnZTtcclxuICAgIEZPTlQtV0VJR0hUOiBib2xkZXI7XHJcbiAgICBURVhULVRSQU5TRk9STTogY2FwaXRhbGl6ZVxyXG59XHJcbkgyXHJcbntcclxuICAgIENPTE9SOiBuYXZ5O1xyXG4gICAgRk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nO1xyXG4gICAgRk9OVC1TSVpFOiBsYXJnZTtcclxuICAgIEZPTlQtV0VJR0hUOiBib2xkZXI7XHJcbiAgICBURVhULVRSQU5TRk9STTogY2FwaXRhbGl6ZVxyXG59XHJcbkgzXHJcbntcclxuICAgIENPTE9SOiBuYXZ5O1xyXG4gICAgRk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nO1xyXG4gICAgRk9OVC1TSVpFOiBsYXJnZTtcclxuICAgIEZPTlQtV0VJR0hUOiBsaWdodGVyO1xyXG4gICAgVEVYVC1UUkFOU0ZPUk06IGNhcGl0YWxpemVcclxufSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29kZSBnZW5lcmF0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZShUZW1wbGF0ZURhdGEgZGF0YSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChURVhUXzEpOwotCQlzYi5hcHBlbmQoVEVYVF8yKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvUmVsYXRpb25EYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1JlbGF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM1MzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvUmVsYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gZmlsZXMuIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgYW4gaW5MaW5rIGFuZCB0aGUKLSAqIGZpbGVzIHdoaWNoIHJlZmVyZW5jZSBpdC4KLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uRGF0YSB7Ci0JcHVibGljIGNsYXNzIExpbmsgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0JCXByaXZhdGUgU3RyaW5nIHVybDsKLQkJcHJpdmF0ZSBpbnQgb2NjdXJyZW5jZXMgPSAwOwotCi0JCXB1YmxpYyBMaW5rKFN0cmluZyBuZXdVcmwsIGludCBvY2MpIHsKLQkJCXVybCA9IG5ld1VybDsKLQkJCW9jY3VycmVuY2VzID0gb2NjOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYW4gZXhhY3QgY29weSBvZiB0aGlzIG9iamVjdC4KLQkJICogCi0JCSAqIEByZXR1cm4gQ3JlYXRlZCBjbG9uZSBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmsodXJsLCBvY2N1cnJlbmNlcyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgdXJsIG9mIHRoZSBmaWxlIHRoYXQgcmVmZXJlbmNlcyB0aGlzIGluTGluawotCQkgKiAKLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmaWxlIHJlZmVyZW5jZXMgdGhlIGluTGluawotCQkgKiAKLQkJICogQHJldHVybiBpbnQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0T2NjdXJyZW5jZXMoKSB7Ci0JCQlyZXR1cm4gb2NjdXJyZW5jZXM7Ci0JCX0KLQotCQlwcml2YXRlIGludCBhZGRPY2N1cnJlbmNlKGludCBhZGQpIHsKLQkJCW9jY3VycmVuY2VzID0gb2NjdXJyZW5jZXMgKyBhZGQ7Ci0JCQlyZXR1cm4gb2NjdXJyZW5jZXM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCX0KLQotCS8vIG91ciByZWxhdGlvbnNoaXAgdGFibGUuIEtleSBpcyBhIHN0cmluZyB3aGljaCBpcyB0aGUgcGF0aCBvZiB0aGUgaW5MaW5rLAotCS8vIHZhbHVlIGlzIGEgdmVjdG9yIG9mIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBpbkxpbmsuCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBpbkxpbmtzVGFibGUgPSBudWxsOwotCXByb3RlY3RlZCBIYXNodGFibGUgYW5jaG9yc1RhYmxlID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVF9IQVNIX1RBQkxFX1NJWkUgPSAxMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRfQU5DSE9SU19IQVNIX1RBQkxFX1NJWkUgPSAxMDsKLQlwcml2YXRlIGJvb2xlYW4gZmlsZU9rID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfU1RBVEVfRklMRV9OQU1FID0gImxpbmtfdGFibGVfc3RhdGVzLnR4dCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1NFUlZFUkNPTlRFWFRST09UX0ZJTEVfTkFNRSA9ICJsaW5rX3Njcl9zdGF0ZXMudHh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19NSVNTSU5HX0ZJTEUgPSAiLSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfSU5ERVhfU0VQQVJBVE9SID0gIisiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkNIT1JfSU5ERVhfU0VQQVJBVE9SID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX09DQ1VSRU5DRV9TRVBBUkFUT1IgPSAiLyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQ0hPUl9TRVBBUkFUT1IgPSAiIyMjIyBBTkNIT1JTICMjIyMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbGF0aW9uRGF0YSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWxhdGlvbkRhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluTGlua3NUYWJsZSA9IG5ldyBIYXNodGFibGUoSU5JVF9IQVNIX1RBQkxFX1NJWkUpOwotCQlhbmNob3JzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfQU5DSE9SU19IQVNIX1RBQkxFX1NJWkUpOwotCX0KLQotCXB1YmxpYyBMaW5rIGFkZEluTGluayhTdHJpbmcgZmlsZV9wYXRoLCBTdHJpbmcgcGFyZW50X3BhdGgsIGludCBvY2N1cmVuY2UpIHsKLQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChmaWxlX3BhdGgpOwotCQlpZiAoaW5fbGlua3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCS8vCi0JCQkvLyBJbmNyZW1lbnQgdGhlIG9jY3VyZW5jZSBhbmQgcmV0dXJuCi0JCQkvLwotCi0JCQlpZiAodXJsLmNvbXBhcmVUbyhwYXJlbnRfcGF0aCkgPT0gMCkgewotCQkJCWlubG5rLmFkZE9jY3VycmVuY2Uob2NjdXJlbmNlKTsKLQkJCQlyZXR1cm4gaW5sbms7Ci0JCQl9Ci0JCX0KLQotCQkvLwotCQkvLyBUaGUgbGluayBkb2VzIG5vdCBleGlzdCwgbmVlZCB0byBhZGQgYW4gZW50cnkgaW4gdGhlIHRhYmxlIGZvciBpdAotCQkvLwotCi0JCUxpbmsgaW5sbmsgPSBuZXcgTGluayhwYXJlbnRfcGF0aCwgb2NjdXJlbmNlKTsKLQkJaW5fbGlua3MuYWRkRWxlbWVudChpbmxuayk7Ci0JCXJldHVybiBpbmxuazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFuZ2VJbkxpbmsoU3RyaW5nIGZpbGVQYXRoLCBib29sZWFuIG1pc3NpbmcpIHsKLQotCQlpZiAobWlzc2luZykgewotCQkJVmVjdG9yIGlubGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUucmVtb3ZlKGZpbGVQYXRoKTsKLQkJCWluTGlua3NUYWJsZS5wdXQoTElOS19NSVNTSU5HX0ZJTEUgKyBmaWxlUGF0aCwgaW5saW5rcyk7Ci0JCX0gZWxzZSB7Ci0JCQlWZWN0b3IgaW5saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5yZW1vdmUoTElOS19NSVNTSU5HX0ZJTEUgKyBmaWxlUGF0aCk7Ci0JCQlpbkxpbmtzVGFibGUucHV0KGZpbGVQYXRoLCBpbmxpbmtzKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiByZXR1cm5zIHdoaWNoIHByb2plY3RzIGRlcGVuZCBvbiB0aGlzIGZpbGUgaS5lLiBhbnkgcHJvamVjdHMgdGhhdCBhcmUgaW4gdGhpcyBmaWxlJ3MgbGlzdCBvZgotCSAqIGluX2xpbmtzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGVwZW5kZW50UHJvamVjdHMoU3RyaW5nIGZpbGVfcGF0aCkgewotCQlIYXNodGFibGUgb3V0UHJvamVjdHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoZmlsZV9wYXRoKTsKLQotCQlpZiAoaW5fbGlua3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQkJCQkvLyBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2Y6IC9Qcm9qTmFtZS8uLi4uCi0JCQkJaWYgKHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8ga2V5IGNvdWxkIGJlIHRoZSBmaWxlbmFtZSBvciB0aGUgbWlzc2luZyBmaWxlbmFtZSAoIi0iICsgZmlsZW5hbWUpCi0JCQkJCS8vIHRha2UgdGhpcyBpbnRvIGFjY291bnQgYW5kIG9mZnNldCB0aGUgaW5kZXggYWNjb3JkaW5nbHkKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJaW50IG9mZnNldCA9IDE7Ci0JCQkJCWlmICh1cmwuY2hhckF0KDApID09ICctJykgewotCQkJCQkJaW5kZXggPSB1cmwuaW5kZXhPZihJUGF0aC5TRVBBUkFUT1IsIDIpOwotCQkJCQkJb2Zmc2V0ID0gMjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZGV4ID0gdXJsLmluZGV4T2YoSVBhdGguU0VQQVJBVE9SLCAxKTsKLQkJCQkJCW9mZnNldCA9IDE7Ci0JCQkJCX0KLQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmcgcHJvak5hbWUgPSB1cmwuc3Vic3RyaW5nKG9mZnNldCwgaW5kZXgpOwotCQkJCQkJb3V0UHJvamVjdHMucHV0KHByb2pOYW1lLCBwcm9qTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dFByb2plY3RzLnZhbHVlcygpOwotCX0KLQotCS8qCi0JICogcmV0dXJucyB3aGljaCBjcm9zcy1wcm9qZWN0IGZpbGVzIGRlcGVuZCBvbiB0aGlzIGZpbGUgaS5lLiBhbnkgcHJvamVjdHMgdGhhdCBhcmUgaW4gdGhpcwotCSAqIGZpbGUncyBsaXN0IG9mIGluX2xpbmtzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGVwZW5kZW50UHJvamVjdEZpbGVzKFN0cmluZyBwcm9qTmFtZSkgewotCQlIYXNodGFibGUgb3V0UHJvamVjdHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJLy8gc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mOiAvUHJvak5hbWUvLi4uLgotCQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gaWYgcGF0aCBpcyBhIG1pc3NpbmcgZmlsZW5hbWUgKCItIiArIGZpbGVuYW1lKSB0aGVuIGl0IG1lYW5zIHRoYXQgaXQgaGFkCi0JCQkJLy8gdG8gY29tZSBmcm9tIHRoaXMgcHJvamVjdCAodGhhdCBpcywgdGhlIGV4dGVybmFsIG5vbmV4aXN0ZW50IGZpbGUgY291bGQgbm90IGhhdmUKLQkJCQkvLyBsaW5rZWQgdG8gdGhpcyBwcm9qZWN0KS4gU28sIHdlIHdpbGwgbm90IGFkZCB0aGlzIHBhdGguIEFsc28sIHNpbmNlIGl0IGlzIG1hcmtlZAotCQkJCS8vIGJyb2tlbiwgaXQgcHJvYmFibHkgd29uJ3QgZXhpc3QgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCBhbnl3YXkuCi0JCQkJaWYgKHBhdGguY2hhckF0KDApICE9ICctJykgewotCQkJCQlpbnQgaW5kZXggPSBwYXRoLmluZGV4T2YoSVBhdGguU0VQQVJBVE9SLCAxKTsKLQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmcgY3VycmVudFByb2pOYW1lID0gcGF0aC5zdWJzdHJpbmcoMSwgaW5kZXgpOwotCQkJCQkJaWYgKCFjdXJyZW50UHJvak5hbWUuZXF1YWxzKHByb2pOYW1lKSkgewotCQkJCQkJCW91dFByb2plY3RzLnB1dChwYXRoLCBwYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0UHJvamVjdHMudmFsdWVzKCk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluTGlua0VudHJ5KFN0cmluZyBmaWxlX3BhdGgsIFN0cmluZyBwYXJlbnRfcGF0aCwgaW50IG9jY3VyZW5jZSkgewotCi0JCVZlY3RvciBpbl9saW5rcyA9IG5ldyBWZWN0b3IoKTsKLQkJTGluayBpbmxuayA9IG5ldyBMaW5rKHBhcmVudF9wYXRoLCBvY2N1cmVuY2UpOwotCQlpbl9saW5rcy5hZGRFbGVtZW50KGlubG5rKTsKLQkJaW5MaW5rc1RhYmxlLnB1dChmaWxlX3BhdGgsIGluX2xpbmtzKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJaWYgKGZhbHNlKSB7Ci0JCQlpZiAoaW5MaW5rc1RhYmxlICE9IG51bGwpIHsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBTdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0LmFwcGVuZCgiXG5LZXk9IiArIGtleSArICJcbiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQkJCQkJaW50IG5iX29mX2xpbmtzID0gaW5fbGlua3Muc2l6ZSgpOwotCi0JCQkJCS8vIFJlcGxhY2UgdGhlIHN0cmluZyBieSBpbmRleAotCQkJCQkvLyBBZGQgYSAnKydzZXBhcmF0b3Igb25seSBmb3IgbW9yZSB0aGFuIG9uZSBsaW5rcyB0byBzYXZlIHNwYWNlCi0JCQkJCS8vCi0KLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5iX29mX2xpbmtzOyBpKyspIHsKLQkJCQkJCUxpbmsgbG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQkJCVN0LmFwcGVuZCgiXHRWYWx1ZT0iICsgbG5rLmdldFVSTCgpICsgIlsiICsgbG5rLmdldE9jY3VycmVuY2VzKCkgKyAiXSIpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nSW5mbyhTdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkdW1wKGJvb2xlYW4gZHVtcCkgewotCQlpZiAoZHVtcCkgewotCQkJaWYgKGluTGlua3NUYWJsZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCQlTdHJpbmdCdWZmZXIgU3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdC5hcHBlbmQoIlxuS2V5PSIgKyBrZXkgKyAiXG4iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGtleSk7Ci0JCQkJCWludCBuYl9vZl9saW5rcyA9IGluX2xpbmtzLnNpemUoKTsKLQotCQkJCQkvLyBSZXBsYWNlIHRoZSBzdHJpbmcgYnkgaW5kZXgKLQkJCQkJLy8gQWRkIGEgJysnc2VwYXJhdG9yIG9ubHkgZm9yIG1vcmUgdGhhbiBvbmUgbGlua3MgdG8gc2F2ZSBzcGFjZQotCQkJCQkvLwotCi0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9vZl9saW5rczsgaSsrKSB7Ci0JCQkJCQlMaW5rIGxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCQlTdC5hcHBlbmQoIlx0VmFsdWU9IiArIGxuay5nZXRVUkwoKSArICJbIiArIGxuay5nZXRPY2N1cnJlbmNlcygpICsgIl0iKTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKFN0LnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHVzZWQgZm9yIExpbmtzQnVpbGRlciBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBkdW1wMigpIHsKLQkJaWYgKGluTGlua3NUYWJsZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nQnVmZmVyIFN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCi0JCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCQkJCWludCBuYl9vZl9saW5rcyA9IGluX2xpbmtzLnNpemUoKTsKLQkJCQlTdC5hcHBlbmQoIlxuS2V5PSIgKyBrZXkgKyAiIC0tIG51bToiICsgbmJfb2ZfbGlua3MgKyAiXG4iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLy8gUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGluZGV4Ci0JCQkJLy8gQWRkIGEgJysnc2VwYXJhdG9yIG9ubHkgZm9yIG1vcmUgdGhhbiBvbmUgbGlua3MgdG8gc2F2ZSBzcGFjZQotCQkJCS8vCi0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmJfb2ZfbGlua3M7IGkrKykgewotCQkJCQlMaW5rIGxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCVN0LmFwcGVuZCgiXHRWYWx1ZT0iICsgbG5rLmdldFVSTCgpICsgIlsiICsgbG5rLmdldE9jY3VycmVuY2VzKCkgKyAiXSIpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oU3QudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBWZWN0b3IgZ2V0SW5MaW5rcyhTdHJpbmcgZmlsZVBhdGgpIHsKLQkJcmV0dXJuIChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoZmlsZVBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldEluTGlua3MoU3RyaW5nIGZpbGVQYXRoLCBWZWN0b3IgdmVjdEluTGlua3MpIHsKLQotCQlpZiAoaW5MaW5rc1RhYmxlICE9IG51bGwpIHsKLQkJCWR1bXAoKTsKLQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoZmlsZVBhdGgpOwotCQkJaWYgKGluX2xpbmtzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgKChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSkpLmNsb25lKCk7Ci0JCQkJCXZlY3RJbkxpbmtzLmFkZEVsZW1lbnQoaW5sbmspOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0QW5jaG9yc1RhYmxlKCkgewotCQlyZXR1cm4gYW5jaG9yc1RhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgdXNlZCB0byBzdG9yZSBTZXJ2ZXJDb250ZXh0Um9vdCBmb3IgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFByZXZpb3VzU0NSRmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgUGF0aChKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgcHJvamVjdC5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIExJTktfU0VSVkVSQ09OVEVYVFJPT1RfRklMRV9OQU1FKS50b0ZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBsaW5rIHJlbGF0aW9ucyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmlvLkZpbGUgVGhlIHN0YXRlIGZpbGUKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgVGhlIHByb2plY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmaWxlIGZvci4KLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0U3RhdGVGaWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyBwcm9qZWN0LmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgTElOS19TVEFURV9GSUxFX05BTUUpLnRvRmlsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0luTGlua0VudHJ5KFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbkxpbmtzVGFibGUuY29udGFpbnNLZXkocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRocm91Z2ggYWxsIG1pc3NpbmctZmlsZSAoLSkgUkQgZW50cmllcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gY2xvc2VseSBtYXRjaCB0aGUgcGF0aCB0bwotCSAqIHRoaXMgY2xhc3MuIFJldHVybiBhbGwgb2YgdGhlIG1hdGNoZXMuCi0JICovCi0JcHVibGljIFZlY3RvciBnZXRQb3NzaWJsZU1pc3NpbmdFbmRpbmdNYXRjaGVzKElQYXRoIGNsYXNzUGF0aCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQotCQlTdHJpbmcgbWF0Y2ggPSBjbGFzc1BhdGgubGFzdFNlZ21lbnQoKTsKLQkJbWF0Y2ggPSBtYXRjaC5zdWJzdHJpbmcoMCwgbWF0Y2gubGVuZ3RoKCkgLSA2KTsgLy8gbGVuZ3RoIG1pbnVzICIuY2xhc3MiCi0KLQkJU3RyaW5nIGNsYXNzUGF0aFN0ciA9IGNsYXNzUGF0aC50b1N0cmluZygpOwotCQlTdHJpbmcgbWF0Y2hpbmdDbGFzc1BhdGggPSBjbGFzc1BhdGhTdHIudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgY2xhc3NQYXRoU3RyLmxlbmd0aCgpIC0gNik7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJLy8gY2hlY2sgaWYgcGF0aCBlbmRzIHdpdGggdGhlIGNsYXNzIG5hbWUgdGhhdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkCi0JCQlpZiAocGF0aC5zdGFydHNXaXRoKExJTktfTUlTU0lOR19GSUxFKSAmJiBwYXRoLmVuZHNXaXRoKG1hdGNoKSkgewotCQkJCS8vIE9LOiBzaW1wbGUgbWF0Y2ggZm91bmQ7IG5vdyBsZXQncyBtYXRjaCB3aXRoIGZpbmVyIGdyYW51bGFyaXR5LgotCQkJCS8vIFRha2UgcGF0aCBhbmQgcHV0IGl0IGludG8gYSBmb3JtIHdoZXJlIHdlIGNhbiBjaGVjayBpZiBpdCBpcyBhCi0JCQkJLy8gY2xvc2UgbWF0Y2ggdG8gdGhlIGNsYXNzIHRoYXQgaGFzIGNoYW5nZWQ6Ci0JCQkJLy8gL1Byb2ovV2ViIENvbnRlbnQvY29tLmFjbWUuRm9vIC0tPiBjb20vYWNtZS9Gb28KLQkJCQlTdHJpbmcgbGlua1BhdGg7Ci0JCQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihJUGF0aC5TRVBBUkFUT1IpOwotCQkJCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCWxpbmtQYXRoID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsaW5rUGF0aCA9IHBhdGg7Ci0JCQkJfQotCQkJCVN0cmluZyBjbG9zZU1hdGNoID0gbGlua1BhdGgucmVwbGFjZSgnLicsIElQYXRoLlNFUEFSQVRPUik7Ci0KLQkJCQlpZiAobWF0Y2hpbmdDbGFzc1BhdGguZW5kc1dpdGgoY2xvc2VNYXRjaCkpIHsKLQkJCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChwYXRoKTsKLQkJCQkJU3RyaW5nIG5vbk1pc3NpbmdQYXRoID0gcGF0aC5zdWJzdHJpbmcoMSwgcGF0aC5sZW5ndGgoKSk7Ci0JCQkJCWNoYW5nZUluTGluayhub25NaXNzaW5nUGF0aCwgZmFsc2UpOwotCQkJCQlpZiAoaW5fbGlua3MgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCQkJCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQkJCQkJCQl2LmFkZCh1cmwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCi0JLyoqCi0JICogUnVuIHRocm91Z2ggYWxsIGV4aXN0aW5nIFJEIGVudHJpZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIGNsb3NlbHkgbWF0Y2ggdGhlIHBhdGggdG8gdGhpcwotCSAqIGNsYXNzLiBSZXR1cm4gYWxsIG9mIHRoZSBtYXRjaGVzLgotCSAqLwotCXB1YmxpYyBWZWN0b3IgZ2V0UG9zc2libGVFeGlzdGluZ0VuZGluZ01hdGNoZXMoSVBhdGggY2xhc3NQYXRoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCi0JCVN0cmluZyBtYXRjaCA9IGNsYXNzUGF0aC5sYXN0U2VnbWVudCgpOwotCQltYXRjaCA9IG1hdGNoLnN1YnN0cmluZygwLCBtYXRjaC5sZW5ndGgoKSAtIDYpOyAvLyBsZW5ndGggbWludXMgIi5jbGFzcyIKLQotCQlTdHJpbmcgY2xhc3NQYXRoU3RyID0gY2xhc3NQYXRoLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBtYXRjaGluZ0NsYXNzUGF0aCA9IGNsYXNzUGF0aFN0ci50b1N0cmluZygpLnN1YnN0cmluZygwLCBjbGFzc1BhdGhTdHIubGVuZ3RoKCkgLSA2KTsKLQotCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkvLyBjaGVjayBpZiBwYXRoIGVuZHMgd2l0aCB0aGUgY2xhc3MgbmFtZSB0aGF0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQKLQkJCWlmIChwYXRoLmVuZHNXaXRoKG1hdGNoKSAmJiAhcGF0aC5zdGFydHNXaXRoKExJTktfTUlTU0lOR19GSUxFKSkgewotCQkJCS8vIE9LOiBzaW1wbGUgbWF0Y2ggZm91bmQ7IG5vdyBsZXQncyBtYXRjaCB3aXRoIGZpbmVyIGdyYW51bGFyaXR5LgotCQkJCS8vIFRha2UgcGF0aCBhbmQgcHV0IGl0IGludG8gYSBmb3JtIHdoZXJlIHdlIGNhbiBjaGVjayBpZiBpdCBpcyBhCi0JCQkJLy8gY2xvc2UgbWF0Y2ggdG8gdGhlIGNsYXNzIHRoYXQgaGFzIGNoYW5nZWQ6Ci0JCQkJLy8gL1Byb2ovV2ViIENvbnRlbnQvY29tLmFjbWUuRm9vIC0tPiBjb20vYWNtZS9Gb28KLQkJCQlTdHJpbmcgbGlua1BhdGg7Ci0JCQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihJUGF0aC5TRVBBUkFUT1IpOwotCQkJCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCWxpbmtQYXRoID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsaW5rUGF0aCA9IHBhdGg7Ci0JCQkJfQotCQkJCVN0cmluZyBjbG9zZU1hdGNoID0gbGlua1BhdGgucmVwbGFjZSgnLicsIElQYXRoLlNFUEFSQVRPUik7Ci0KLQkJCQlpZiAobWF0Y2hpbmdDbGFzc1BhdGguZW5kc1dpdGgoY2xvc2VNYXRjaCkpIHsKLQkJCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChwYXRoKTsKLQkJCQkJY2hhbmdlSW5MaW5rKHBhdGgsIHRydWUpOwotCQkJCQlpZiAoaW5fbGlua3MgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCQkJCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQkJCQkJCQl2LmFkZCh1cmwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIFJ1biB0aHJvdWdoIGFsbCBleGlzdGluZyBSRCBlbnRyaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSBjbG9zZWx5IG1hdGNoIHRoZSBwYXRoIHRvIHRoaXMKLQkgKiBjbGFzcy4gUmVtb3ZlIHRoZSBpbmxpbmtzIGZvciBhbGwgdGhlIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSW5MaW5rc1Bvc3NpYmxlRXhpc3RpbmdFbmRpbmdNYXRjaGVzKElQYXRoIGNsYXNzUGF0aCkgewotCQlTdHJpbmcgbWF0Y2ggPSBjbGFzc1BhdGgubGFzdFNlZ21lbnQoKTsKLQkJbWF0Y2ggPSBtYXRjaC5zdWJzdHJpbmcoMCwgbWF0Y2gubGVuZ3RoKCkgLSA2KTsgLy8gbGVuZ3RoIG1pbnVzICIuY2xhc3MiCi0KLQkJU3RyaW5nIGNsYXNzUGF0aFN0ciA9IGNsYXNzUGF0aC50b1N0cmluZygpOwotCQlTdHJpbmcgbWF0Y2hpbmdDbGFzc1BhdGggPSBjbGFzc1BhdGhTdHIudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgY2xhc3NQYXRoU3RyLmxlbmd0aCgpIC0gNik7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHBhdGguZW5kc1dpdGgobWF0Y2gpICYmICFwYXRoLnN0YXJ0c1dpdGgoTElOS19NSVNTSU5HX0ZJTEUpKSB7Ci0JCQkJLy8gT0s6IHNpbXBsZSBtYXRjaCBmb3VuZDsgbm93IGxldCdzIG1hdGNoIHdpdGggZmluZXIgZ3JhbnVsYXJpdHkuCi0JCQkJLy8gVGFrZSBwYXRoIGFuZCBwdXQgaXQgaW50byBhIGZvcm0gd2hlcmUgd2UgY2FuIGNoZWNrIGlmIGl0IGlzIGEKLQkJCQkvLyBjbG9zZSBtYXRjaCB0byB0aGUgY2xhc3MgdGhhdCBoYXMgY2hhbmdlZDoKLQkJCQkvLyAvUHJvai9XZWIgQ29udGVudC9jb20uYWNtZS5Gb28gLS0+IGNvbS9hY21lL0ZvbwotCQkJCVN0cmluZyBsaW5rUGF0aDsKLQkJCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4IDwgcGF0aC5sZW5ndGgoKSAtIDEpIHsKLQkJCQkJbGlua1BhdGggPSBwYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxpbmtQYXRoID0gcGF0aDsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNsb3NlTWF0Y2ggPSBsaW5rUGF0aC5yZXBsYWNlKCcuJywgSVBhdGguU0VQQVJBVE9SKTsKLQotCQkJCWlmIChtYXRjaGluZ0NsYXNzUGF0aC5lbmRzV2l0aChjbG9zZU1hdGNoKSkgewotCQkJCQlyZW1vdmVJbkxpbmtzKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgbGlua3MgdGFibGVzCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaW5MaW5rc1RhYmxlID0gbmV3IEhhc2h0YWJsZShJTklUX0hBU0hfVEFCTEVfU0laRSk7Ci0JCWFuY2hvcnNUYWJsZSA9IG5ldyBIYXNodGFibGUoSU5JVF9BTkNIT1JTX0hBU0hfVEFCTEVfU0laRSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGxpbmtzIHRhYmxlcwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBbmNob3JzKCkgewotCQlhbmNob3JzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfQU5DSE9SU19IQVNIX1RBQkxFX1NJWkUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgbGlua3MgdGFibGVzCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUluTGlua3MoKSB7Ci0JCWluTGlua3NUYWJsZSA9IG5ldyBIYXNodGFibGUoSU5JVF9IQVNIX1RBQkxFX1NJWkUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHRvIHJlc3RvcmUgZGF0YSBmcm9tIGV4aXN0ZWQgYW5kIHdhcyBzdWNjZXNzZnVsbHkgcmVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVPaygpIHsKLQkJcmV0dXJuIGZpbGVPazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotCQlyZXR1cm4gKGluTGlua3NUYWJsZSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdJbkxpbmtFbnRyeShTdHJpbmcgcGF0aCkgewotCQlpZiAoIWluTGlua3NUYWJsZS5jb250YWluc0tleShwYXRoKSkKLQkJCWluTGlua3NUYWJsZS5wdXQocGF0aCwgbmV3IFZlY3RvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVJbkxpbmtzKFN0cmluZyBmaWxlX3BhdGgpIHsKLQotCQkvLwotCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGZMaW5rc1RhYmxlIHRvIHJlbW92ZSBhbGwgaW4tbGlua3MgcmVmZXJlbmNlcwotCQkvLyBmb3IgZmlsZV9wYXRoCi0JCS8vCi0KLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGtleSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQotCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQotCQkJCWlmICh1cmwuY29tcGFyZVRvKGZpbGVfcGF0aCkgPT0gMCkgewotCQkJCQlpbl9saW5rcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vCi0JCQkJLy8gUmVtb3ZlIHRoZSBlbnRyeSBpbiB0aGUgZkxpbmtzVGFibGUgaWYgdGhlIGluLWxpbmsKLQkJCQkvLyBvZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIHdvcmtiZW5jaCBhbmQgYW4gb3JwaGFuIGxpbmsKLQkJCQkvLyBvdGhlcndpc2UgdXBkYXRlIHRoZSBpbi1saW5rcyBmTGlua3NUYWJsZQotCQkJCS8vCi0JCQl9Ci0KLQkJCWlmIChpbl9saW5rcy5pc0VtcHR5KCkgJiYga2V5LnN0YXJ0c1dpdGgoTElOS19NSVNTSU5HX0ZJTEUpKSB7Ci0JCQkJaW5MaW5rc1RhYmxlLnJlbW92ZShrZXkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBmTGlua3NUYWJsZSB0byByZXR1cm4gYWxsIG91dC1saW5rcyByZWZlcmVuY2VzIGZvciBmaWxlX3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZV9wYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE91dExpbmtzKFN0cmluZyBmaWxlX3BhdGgpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQkJCQkJbGlzdC5hZGQoa2V5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciBvdGhlciByZXNvdXJjZXMgbGluayB0byB0aGlzIGZpbGUgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZEJ5T3RoZXJMaW5rcyhTdHJpbmcgZmlsZV9wYXRoKSB7Ci0KLQkJLy8KLQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBmTGlua3NUYWJsZSB0byByZW1vdmUgYWxsIGluLWxpbmtzIHJlZmVyZW5jZXMKLQkJLy8gZm9yIGZpbGVfcGF0aAotCQkvLwotCQlib29sZWFuIHJlZmVyZW5jZWQgPSBmYWxzZTsKLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7ICFyZWZlcmVuY2VkICYmIGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGtleSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQkJCQkJcmVmZXJlbmNlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQl9Ci0KLQotCS8qCi0JICogcGVyZm9ybXMgYXMgcmVtb3ZlSW5MaW5rcyggU3RyaW5nICkgLi4uIEJ1dCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhpcyBhbHNvIGFkZGl0aW9uYWxseQotCSAqIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgcHJvamVjdHMgdGhhdCB0aGlzIGZpbGUgaXMgZGVwZW5kZW50IHVwb24uIFRoaXMgaXMgdXNlZnVsIHRvIGdldAotCSAqIHRoaXMgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGdvIHRvIGFsbCBvZiB0aG9zZSBwcm9qZWN0cycgcmVsYXRpb24gZGF0YSBhbmQgdGVsbCB0aGVtIHRvCi0JICogcmVtb3ZlSW5MaW5rcyBmb3IgdGhpcyBmaWxlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbW92ZUluTGlua3NGb3JQcm9qZWN0cyhTdHJpbmcgZmlsZV9wYXRoKSB7Ci0KLQkJLy8KLQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBmTGlua3NUYWJsZSB0byByZW1vdmUgYWxsIGluLWxpbmtzIHJlZmVyZW5jZXMKLQkJLy8gZm9yIGZpbGVfcGF0aAotCQkvLwotCQlIYXNodGFibGUgcHJvamVjdHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQkJCQkJLy8gc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mOiAvUHJvak5hbWUvLi4uLgotCQkJCQlpZiAoa2V5Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJLy8ga2V5IGNvdWxkIGJlIHRoZSBmaWxlbmFtZSBvciB0aGUgbWlzc2luZyBmaWxlbmFtZSAoIi0iICsgZmlsZW5hbWUpCi0JCQkJCQkvLyB0YWtlIHRoaXMgaW50byBhY2NvdW50IGFuZCBvZmZzZXQgdGhlIGluZGV4IGFjY29yZGluZ2x5Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJaW50IG9mZnNldCA9IDE7Ci0JCQkJCQlpZiAoa2V5LmNoYXJBdCgwKSA9PSAnLScpIHsKLQkJCQkJCQlpbmRleCA9IGtleS5pbmRleE9mKElQYXRoLlNFUEFSQVRPUiwgMik7Ci0JCQkJCQkJb2Zmc2V0ID0gMjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW5kZXggPSBrZXkuaW5kZXhPZihJUGF0aC5TRVBBUkFUT1IsIDEpOwotCQkJCQkJCW9mZnNldCA9IDE7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQlTdHJpbmcgcHJvak5hbWUgPSBrZXkuc3Vic3RyaW5nKG9mZnNldCwgaW5kZXgpOwotCQkJCQkJCXByb2plY3RzLnB1dChwcm9qTmFtZSwgcHJvak5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWluX2xpbmtzLnJlbW92ZUVsZW1lbnRBdChpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8KLQkJCQkvLyBSZW1vdmUgdGhlIGVudHJ5IGluIHRoZSBmTGlua3NUYWJsZSBpZiB0aGUgaW4tbGluawotCQkJCS8vIG9mIHRoZSBmaWxlIGlzIG5vdCBpbiB0aGUgd29ya2JlbmNoIGFuZCBhbiBvcnBoYW4gbGluawotCQkJCS8vIG90aGVyd2lzZSB1cGRhdGUgdGhlIGluLWxpbmtzIGZMaW5rc1RhYmxlCi0JCQkJLy8KLQkJCX0KLQotCQkJaWYgKGluX2xpbmtzLmlzRW1wdHkoKSAmJiBrZXkuc3RhcnRzV2l0aChMSU5LX01JU1NJTkdfRklMRSkpCi0JCQkJaW5MaW5rc1RhYmxlLnJlbW92ZShrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2plY3RzLnZhbHVlcygpOwotCX0KLQotCi0KLQkvKioKLQkgKiBwZXJmb3JtcyBhcyByZW1vdmVJbkxpbmtzKCBTdHJpbmcgKSAuLi4gQnV0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBhZGRpdGlvbmFsbHkgcmV0dXJucwotCSAqIHdoaWNoIHByb2plY3RzIGRlcGVuZCBvbiB0aGlzIGZpbGUuIGkuZS4gYW55IHByb2plY3RzIHRoYXQgYXJlIGluIHRoaXMgZmlsZSdzIGxpc3Qgb2YKLQkgKiBpbl9saW5rcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbW92ZUluTGlua3NBbmRHZXREZXBlbmRlbnRQcm9qZWN0cyhTdHJpbmcgZmlsZV9wYXRoKSB7Ci0JCS8vCi0JCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZkxpbmtzVGFibGUgdG8gcmVtb3ZlIGFsbCBpbi1saW5rcyByZWZlcmVuY2VzCi0JCS8vIGZvciBmaWxlX3BhdGgKLQkJLy8KLQkJSGFzaHRhYmxlIHByb2plY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQotCQkJaWYgKGtleS5lcXVhbHMoUmVsYXRpb25EYXRhLkxJTktfTUlTU0lOR19GSUxFICsgZmlsZV9wYXRoKSkgewotCQkJCWludCBpbmRleCA9IC0xOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQotCQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJfQotCQkJCQlpZiAodXJsLmxlbmd0aCgpID4gMSkgewotCQkJCQkJaW50IHByb2ppbmRleCA9IHVybC5pbmRleE9mKElQYXRoLlNFUEFSQVRPUiwgMSk7Ci0JCQkJCQlpZiAocHJvamluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJU3RyaW5nIHByb2pOYW1lID0gdXJsLnN1YnN0cmluZygxLCBwcm9qaW5kZXgpOwotCQkJCQkJCXByb2plY3RzLnB1dChwcm9qTmFtZSwgcHJvak5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQlpbl9saW5rcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCVN0cmluZyB1cmwgPSBpbmxuay5nZXRVUkwoKTsKLQotCQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQotCQkJCQkJaW5fbGlua3MucmVtb3ZlRWxlbWVudEF0KGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQkvLwotCQkJCQkvLyBSZW1vdmUgdGhlIGVudHJ5IGluIHRoZSBmTGlua3NUYWJsZSBpZiB0aGUgaW4tbGluawotCQkJCQkvLyBvZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIHdvcmtiZW5jaCBhbmQgYW4gb3JwaGFuIGxpbmsKLQkJCQkJLy8gb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgaW4tbGlua3MgZkxpbmtzVGFibGUKLQkJCQkJLy8KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbl9saW5rcy5pc0VtcHR5KCkgJiYga2V5LnN0YXJ0c1dpdGgoTElOS19NSVNTSU5HX0ZJTEUpKSB7Ci0JCQkJaW5MaW5rc1RhYmxlLnJlbW92ZShrZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0cy52YWx1ZXMoKTsKLQl9Ci0KLQotCS8qKgotCSAqIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBhIHNwZWNpZmljIGluTGluay4gV2hlbiByZW1vdmVPcnBoYW4gaXMgdHJ1ZSB0aGUgaW5MaW5rIGVudHJ5IGlzCi0JICogcmVtb3ZlZCBhcyB3ZWxsLCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlZmVyZWNlcyB0byBpdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUluTGlua3MoU3RyaW5nIGluTGlua0VudHJ5LCBTdHJpbmcgaW5MaW5rUmVmZXJlbmNlLCBib29sZWFuIHJlbW92ZU9ycGhhbikgewotCi0JCVN0cmluZyBrZXkgPSBpbkxpbmtFbnRyeTsKLQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQotCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCWlmICh1cmwuY29tcGFyZVRvKGluTGlua1JlZmVyZW5jZSkgPT0gMCkgewotCQkJCWluX2xpbmtzLnJlbW92ZUVsZW1lbnRBdChpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gdGhlIGluTGlua0VudHJ5Ci0JCS8vIGFuZCB0aGUgY2FsbGVyIHdhbnRzIHRoaXMgb3JwaGFuIGRlbGV0ZWQgdGhlbgotCQkvLyByZW1vdmUgdGhlIGtleSBmcm9tIHRoZSB0YWJsZQotCQlpZiAoaW5fbGlua3MuaXNFbXB0eSgpICYmIHJlbW92ZU9ycGhhbikKLQkJCWluTGlua3NUYWJsZS5yZW1vdmUoa2V5KTsKLQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoaXMgYnVpbGRlcidzIHNhdmVkIHN0YXRlIGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgd2FzIHN1Y2Nlc3NmdWwgaW4gZG9pbmcgc28uCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzdG9yZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCS8vIGdldCB0aGUgc3RhdGUKLQkJCUZpbGUgc3RhdGVGaWxlID0gZ2V0U3RhdGVGaWxlKHByb2plY3QpOwotCQkJaWYgKHN0YXRlRmlsZS5leGlzdHMoKSkgewotCQkJCWluTGlua3NUYWJsZSA9IG5ldyBIYXNodGFibGUoSU5JVF9IQVNIX1RBQkxFX1NJWkUpOwotCi0JCQkJLy8gcmVhZCBpbkxpbmtzVGFibGUgZnJvbSBzdGF0ZUZpbGUKLQkJCQlWZWN0b3Iga2V5cyA9IG5ldyBWZWN0b3IoKTsKLQkJCQlWZWN0b3IgaW5kaWNlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzdGF0ZUZpbGUpKTsKLQotCQkJCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCQkJCS8vCQkJCXdoaWxlKCAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgJiYgIWxpbmUuc3RhcnRzV2l0aCgKLQkJCQkJLy8gQU5DSE9SX1NFUEFSQVRPUiApICkKLQkJCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBidWZmZXIgPSBsaW5lOwotCi0KLQkJCQkJCS8vIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBwb3NzaWJpbGl0eSBvZiBsaW5rcyBzcGFubmluZyBtdWx0aXBsZSBsaW5lcywKLQkJCQkJCS8vIGtlZXAgcmVhZGluZyB1bnRpbCB3ZSBmaW5kIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGFuIGlkaWNhdG9yCi0JCQkJCQkvLyB0aGF0IHRoZSBsaW5rIGlzIGZpbmlzaGVkIChhIGxpbmUgYmVnaW5uaW5nIHcvIExJTktfSU5ERVhfU0VQQVJBVE9SKQotCQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCAmJiAhbGluZS5zdGFydHNXaXRoKExJTktfSU5ERVhfU0VQQVJBVE9SKSkgewotCQkJCQkJCWJ1ZmZlciA9IGJ1ZmZlciArIGxpbmU7Ci0JCQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCQkJfQotCQkJCQkJLy8gYWRkIGxpbmsgc3RyaW5nICgvTXlQcm9qL2ZpbGUuaHRtbCkKLQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCQkJCWtleXMuYWRkRWxlbWVudChidWZmZXIpOwotCQkJCQkJfQotCQkJCQkJLy8gYWRkIHJlZmVyZW5jZXMgbGluZSAoKzIvMy4uLikKLQkJCQkJCWlmIChsaW5lICE9IG51bGwpIHsKLQkJCQkJCQlpbmRpY2VzLmFkZEVsZW1lbnQobGluZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5TeW50YXhfRXJyb3JfaW5fdGhlX2xpbmtzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiU3ludGF4IEVycm9yIGluIHRoZSBsaW5rcyBzdGF0ZSBmaWxlIgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIFVzZSB0aGlzIHRvIGxvYWQgYW5jaG9yIGluZm9ybWF0aW9uCi0JCQkJCS8vCQkJCS8vIE5vdyBsZXQncyBhZGQgYWxsIG9mIHRoZSBleHRyYSBhbmNob3IgaW5mb3JtYXRpb24KLQkJCQkJLy8JCQkJaWYgKCBsaW5lICE9IG51bGwgJiYgbGluZS5zdGFydHNXaXRoKCBBTkNIT1JfU0VQQVJBVE9SICkgKSB7Ci0JCQkJCS8vCQkJCQl3aGlsZSggKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCApCi0JCQkJCS8vCQkJCQl7Ci0JCQkJCS8vCQkJCQkJU3RyaW5nIGJ1ZmZlciA9IGxpbmU7Ci0JCQkJCS8vCQotCQkJCQkvLwkJCQkJCS8vIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBwb3NzaWJpbGl0eSBvZiBsaW5rcyBzcGFubmluZyBtdWx0aXBsZSBsaW5lcywKLQkJCQkJLy8JCQkJCQkvLyBrZWVwIHJlYWRpbmcgdW50aWwgd2UgZmluZCBhIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhbiBpZGljYXRvcgotCQkJCQkvLwkJCQkJCS8vIHRoYXQgdGhlIGxpbmsgaXMgZmluaXNoZWQgKGEgbGluZSBiZWdpbm5pbmcgdy8gTElOS19JTkRFWF9TRVBBUkFUT1IpCi0JCQkJCS8vCQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCQkvLwkJCQkJCXdoaWxlICggbGluZSAhPSBudWxsICYmICFsaW5lLnN0YXJ0c1dpdGgoIEFOQ0hPUl9JTkRFWF9TRVBBUkFUT1IgKSApIHsKLQkJCQkJLy8JCQkJCQkJYnVmZmVyID0gYnVmZmVyICsgbGluZTsKLQkJCQkJLy8JCQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCQkvLwkJCQkJCX0KLQkJCQkJLy8KLQkJCQkJLy8JCQkJCQkvLyBhZGQgZmlsZSBhbmQgYWxsIG9mIGl0cyBhbmNob3JzCi0JCQkJCS8vCQkJCQkJaWYgKCBidWZmZXIgIT0gbnVsbCAmJiBsaW5lICE9IG51bGwpCi0JCQkJCS8vCQkJCQkJewotCQkJCQkvLwkJCQkJCQlhbmNob3JzVGFibGUucHV0KCBidWZmZXIsIGxpbmUgKTsKLQkJCQkJLy8JCQkJCQl9Ci0JCQkJCS8vCQkJCQkJZWxzZQotCQkJCQkvLwkJCQkJCXsKLQkJCQkJLy8JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN5bnRheF9FcnJvcl9pbl90aGVfbGlua3NfVUlfIikpOwotCQkJCQkvLyAvLyROT04tTkxTLTEkID0gIlN5bnRheCBFcnJvciBpbiB0aGUgbGlua3Mgc3RhdGUgZmlsZSIKLQkJCQkJLy8JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvLwkJCQkJCX0KLQkJCQkJLy8JCQkJCX0KLQkJCQkJLy8JCQotCQkJCQkvLwkJCQl9Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZlKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGllKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGllMikgewotCQkJCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWUyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCi0JCQkJLy8KLQkJCQkvLyBQb3B1bGF0ZSB0aGUgaGFzaCBpbkxpbmtzVGFibGUgd2l0aCBrZXlzIChmaWxlIHBhdGhzKSBhbmQgdmFsdWVzIChpbiBsaW5rcyBmaWxlcwotCQkJCS8vIHBhdGhzKQotCQkJCS8vCi0JCQkJZmlsZU9rID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLmVsZW1lbnRBdChpKTsKLQkJCQkJCVN0cmluZyBjb21wYWN0ZWRfaW5kaWNlcyA9IChTdHJpbmcpIGluZGljZXMuZWxlbWVudEF0KGkpOwotCi0JCQkJCQkvLwotCQkJCQkJLy8gUGFyc2UgdGhlIGluLWxpbmtzIGluZGV4ZXMKLQkJCQkJCS8vCi0KLQkJCQkJCWludCBzaXplID0ga2V5cy5zaXplKCk7Ci0JCQkJCQlWZWN0b3IgaW5fbGlua3MgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCQlpZiAoY29tcGFjdGVkX2luZGljZXMgIT0gTElOS19JTkRFWF9TRVBBUkFUT1IpIHsKLQotCQkJCQkJCS8vIEV4dHJhY3QgaW5kZXhlcyBhbmQgb2NjdXJlbmNlcwotCi0JCQkJCQkJU3RyaW5nVG9rZW5pemVyIHN0X2lkeF9vY2MgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5ldyBTdHJpbmcoY29tcGFjdGVkX2luZGljZXMpLCBMSU5LX0lOREVYX1NFUEFSQVRPUik7Ci0JCQkJCQkJd2hpbGUgKHN0X2lkeF9vY2MuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCVN0cmluZyBpZHhfb2NjID0gbmV3IFN0cmluZyhzdF9pZHhfb2NjLm5leHRUb2tlbigpKTsKLQkJCQkJCQkJaW50IHBvc19vY2MgPSBpZHhfb2NjLmluZGV4T2YoTElOS19PQ0NVUkVOQ0VfU0VQQVJBVE9SKTsKLQkJCQkJCQkJaW50IGluZGV4OwotCQkJCQkJCQlpbnQgb2NjdXJlbmNlID0gMTsKLQkJCQkJCQkJaWYgKHBvc19vY2MgPT0gLTEpIHsKLQkJCQkJCQkJCWluZGV4ID0gSW50ZWdlci52YWx1ZU9mKGlkeF9vY2MpLmludFZhbHVlKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpbmRleCA9IEludGVnZXIudmFsdWVPZihpZHhfb2NjLnN1YnN0cmluZygwLCBwb3Nfb2NjKSkuaW50VmFsdWUoKTsKLQkJCQkJCQkJCW9jY3VyZW5jZSA9IEludGVnZXIudmFsdWVPZihpZHhfb2NjLnN1YnN0cmluZyhwb3Nfb2NjICsgMSkpLmludFZhbHVlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKSB7Ci0JCQkJCQkJCQlMaW5rIGlubG5rID0gbmV3IExpbmsoKFN0cmluZykga2V5cy5lbGVtZW50QXQoaW5kZXgpLCBvY2N1cmVuY2UpOwotCQkJCQkJCQkJaW5fbGlua3MuYWRkRWxlbWVudChpbmxuayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpbkxpbmtzVGFibGUucHV0KGtleSwgaW5fbGlua3MpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZmlsZU9rID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZmlsZU9rOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhpcyBidWlsZGVyJ3Mgc3RhdGUgdG8gZGlzayBzbyB0aGF0IGl0IGNhbiBiZSByZXN0YXJ0ZWQgaW4gdGhlIHNhbWUgc3RhdGUgbGF0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJRmlsZSBzdGF0ZUZpbGUgPSBnZXRTdGF0ZUZpbGUocHJvamVjdCk7Ci0JCWlmIChpbkxpbmtzVGFibGUgPT0gbnVsbCkgewotCQkJc3RhdGVGaWxlLmRlbGV0ZSgpOwotCQl9IGVsc2UgewotCi0JCQkvLyBQcmVwYXJlIHRoZSBpbmRleCB2ZWN0b3IKLQotCQkJVmVjdG9yIGluZGV4X3ZlY3RvciA9IG5ldyBWZWN0b3IoaW5MaW5rc1RhYmxlLnNpemUoKSk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJaW5kZXhfdmVjdG9yLmFkZEVsZW1lbnQoYWVudW0ubmV4dEVsZW1lbnQoKSk7Ci0JCQl9Ci0KLQkJCS8vIHdyaXRlIGluTGlua3NUYWJsZSB0byBzdGF0ZUZpbGUKLQotCQkJdHJ5IHsKLQkJCQlGaWxlIHBhcmVudEZvbGRlciA9IHN0YXRlRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKCFwYXJlbnRGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJcGFyZW50Rm9sZGVyLm1rZGlycygpOwotCQkJCX0KLQkJCQlQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHN0YXRlRmlsZSkpKTsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCQlvdXQucHJpbnQoa2V5KTsKLQkJCQkJb3V0LnByaW50bG4oKTsKLQkJCQkJb3V0LnByaW50KExJTktfSU5ERVhfU0VQQVJBVE9SKTsKLQkJCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCQkJCQlpbnQgbmJfb2ZfbGlua3MgPSBpbl9saW5rcy5zaXplKCk7Ci0KLQkJCQkJLy8gUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGluZGV4Ci0JCQkJCS8vIEFkZCBhICcrJ3NlcGFyYXRvciBvbmx5IGZvciBtb3JlIHRoYW4gb25lIGxpbmtzIHRvIHNhdmUgc3BhY2UKLQkJCQkJLy8gQWRkICcvPG9jY3VyZW5jZT4nIG9ubHkgaWYgb2NjdXJlbmNlID4gMSB0byBzYXZlIHNwYWNlCi0JCQkJCS8vCi0KLQkJCQkJTGluayBsbmsgPSBudWxsOwotCQkJCQlpbnQgbmJfbG5rcyA9IDA7Ci0JCQkJCWlmIChuYl9vZl9saW5rcyA+IDApIHsKLQkJCQkJCWxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoMCk7Ci0JCQkJCQlvdXQucHJpbnQoaW5kZXhfdmVjdG9yLmluZGV4T2YobG5rLmdldFVSTCgpKSk7Ci0JCQkJCQluYl9sbmtzID0gbG5rLmdldE9jY3VycmVuY2VzKCk7Ci0JCQkJCQlpZiAobmJfbG5rcyA+IDEpIHsKLQkJCQkJCQlvdXQucHJpbnQoTElOS19PQ0NVUkVOQ0VfU0VQQVJBVE9SKTsKLQkJCQkJCQlvdXQucHJpbnQobmJfbG5rcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG5iX29mX2xpbmtzOyBpKyspIHsKLQkJCQkJCQlvdXQucHJpbnQoTElOS19JTkRFWF9TRVBBUkFUT1IpOwotCQkJCQkJCWxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCQkJb3V0LnByaW50KGluZGV4X3ZlY3Rvci5pbmRleE9mKGxuay5nZXRVUkwoKSkpOwotCQkJCQkJCW5iX2xua3MgPSBsbmsuZ2V0T2NjdXJyZW5jZXMoKTsKLQkJCQkJCQlpZiAobmJfbG5rcyA+IDEpIHsKLQkJCQkJCQkJb3V0LnByaW50KExJTktfT0NDVVJFTkNFX1NFUEFSQVRPUik7Ci0JCQkJCQkJCW91dC5wcmludChuYl9sbmtzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJb3V0LnByaW50bG4oKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiB1c2UgdGhpcyB0byBzYXZlIG91dCBhbmNob3IgaW5mb3JtYXRpb24gLy8KLQkJCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBpZiAoICFhbmNob3JzVGFibGUuaXNFbXB0eSgpICkgewotCQkJCSAqIG91dC5wcmludGxuKCBBTkNIT1JfU0VQQVJBVE9SICk7IH0gZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gYW5jaG9yc1RhYmxlLmtleXMoKTsKLQkJCQkgKiBlbnVtLmhhc01vcmVFbGVtZW50cygpOykgeyBTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCSAqIG91dC5wcmludChrZXkpOyBvdXQucHJpbnRsbigpOyAvL291dC5wcmludChBTkNIT1JfSU5ERVhfU0VQQVJBVE9SKTsgb3V0LnByaW50bG4oCi0JCQkJICogYW5jaG9yc1RhYmxlLmdldChrZXkpICk7IH0KLQkJCQkgKi8KLQotCQkJCW91dC5mbHVzaCgpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRXJyb3Jfd2hpbGVfc2F2aW5nX2xpbmtzX3NfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igd2hpbGUgc2F2aW5nIGxpbmtzIHN0YXRlIGZpbGUiCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgzLzIxLzIwMDEgMTo0NTo1OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsZU9rCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRGaWxlT2soYm9vbGVhbiBuZXdGaWxlT2spIHsKLQkJZmlsZU9rID0gbmV3RmlsZU9rOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmVyVGFyZ2V0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9TZXJ2ZXJUYXJnZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDNkYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9TZXJ2ZXJUYXJnZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTIsIDIwMDMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotLyoqCi0gKiBBIGNsYXNzIHdpdGggc29tZSB1c2VmdWwgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2VydmVyIHRhcmdldHRpbmcgZm9yIFdlYiBwcm9qZWN0cy4KLSAqIAotICogQGF1dGhvciBQcmF0aWsgU2hhaAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVGFyZ2V0VXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdElkID0gImNvbS5pYm0uZXRvb2xzLndlYnNwaGVyZS5zZXJ2ZXJUYXJnZXQuYmFzZS52NTEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRFeHByZXNzSWQgPSAiY29tLmlibS5ldG9vbHMud2Vic3BoZXJlLnNlcnZlclRhcmdldC5leHByZXNzLnY1MSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXRzCi0JICogICAgICAgICAgICBBIGxpc3Qgb2YgSVNlcnZlclRhcmdldHMKLQkgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0IHNlcnZlciB3aXRoIHRoZQotCSAqICAgICAgICAge0BsaW5rICNnZXREZWZhdWx0U2VydmVyVGFyZ2V0SWQoKSBkZWZhdWx0IElkfTsgb3IgMCwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmREZWZhdWx0U2VydmVyVGFyZ2V0SW5kZXgoTGlzdCB0YXJnZXRzKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5zaXplKCk7IGkrKykgewotCQkJSVJ1bnRpbWUgdGFyZ2V0ID0gKElSdW50aW1lKSB0YXJnZXRzLmdldChpKTsKLQkJCWlmICh0YXJnZXQuZ2V0SWQoKS5lcXVhbHMoZ2V0RGVmYXVsdFNlcnZlclRhcmdldElkKCkpKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgSVNlcnZlclRhcmdldCB0aGF0IGhhcyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gbGlzdDsgaXQgY2FuIGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBsaXN0Ci0JICogICAgICAgICAgICBUaGUgTGlzdCBmcm9tIHdoaWNoIHRoZSBJU2VydmVyVGFyZ2V0IGhhcyB0byBiZSBmb3VuZAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBnaXZlbiB0YXJnZXQgaW4gdGhlIGdpdmVuIGxpc3Q7IG9yIDAsIGlmIHRoZSBnaXZlbiB0YXJnZXQgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gbGlzdC4gVHdvIElTZXJ2ZXJUYXJnZXRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVxdWFsIGlmIHRoZXkKLQkgKiAgICAgICAgIGhhdmUgdGhlIHNhbWUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZEluZGV4T2YoSVJ1bnRpbWUgdGFyZ2V0LCBMaXN0IGxpc3QpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJUnVudGltZSBlbGVtZW50ID0gKElSdW50aW1lKSBsaXN0LmdldChpKTsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlpbmRleCA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgSWQgb2YgdGhlIHRhcmdldCBzZXJ2ZXIgdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2ZXJUYXJnZXRJZCgpIHsKLQkJU3RyaW5nIGlkID0gZGVmYXVsdEV4cHJlc3NJZDsKLQkJaWYgKEoyRUVQbHVnaW4uaXNFSkJTdXBwb3J0QXZhaWxhYmxlKCkpIHsKLQkJCWlkID0gZGVmYXVsdElkOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNKMkVFMTMKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25zdGFudCBmb3IgSjJFRSB2ZXJzaW9uIDEuMyBpcyBkZXNpcmVkCi0JICogQHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTIgb3IgSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzEzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oYm9vbGVhbiBpc0oyRUUxMykgewotCQlyZXR1cm4gaXNKMkVFMTMgPyBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTMgOiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0JfQotCi0JLyoqCi0JICogQSBjb252ZW5pZW50IG1ldGhvZCB0aGF0IHRha2VzIGluIGEgbGlzdCBvZiBJU2VydmVyVGFyZ2V0cyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBsYWJlbHMgb2YKLQkgKiB0aGUgSVNlcnZlclRhcmdldHMgaW4gdGhlIGdpdmVuIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHNlcnZlclRhcmdldHMKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIElTZXJ2ZXJUYXJnZXRzCi0JICogQHJldHVybiBBbiBhcnJheSBsb2YgbGFiZWxzIG9mIHRoZSBJU2VydmVyVGFyZ2V0cyBpbiB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyTmFtZXMoTGlzdCBzZXJ2ZXJUYXJnZXRzKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc2VydmVyVGFyZ2V0cy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgc2VydmVyVGFyZ2V0cy5nZXQoaSk7Ci0JCQlyZXN1bHRbaV0gPSBydW50aW1lLmdldE5hbWUoKSArICIgKCIgKyBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcmpOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBwcm9qZWN0IHdob3NlIFNlcnZlclRhcmdldCBoYXMgdG8gYmUgcmV0cmlldmVkOyBpdCBjYW4gYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiB0aGUgU2VydmVyVGFyZ2V0IG9mIHRoZSBnaXZlbiBwcm9qZWN0OyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBkb2VzIG5vdAotCSAqICAgICAgICAgZXhpc3Qgb3IgaXRzIFNlcnZlclRhcmdldCBpcyBub3Qgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0U2VydmVyVGFyZ2V0KFN0cmluZyBwcmpOYW1lKSB7Ci0JCWlmIChwcmpOYW1lICE9IG51bGwgJiYgIXByak5hbWUudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVByb2plY3QgcHJqID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByak5hbWUpOwotCQkJaWYgKHByaiAhPSBudWxsICYmIHByai5leGlzdHMoKSkgewotCQkJCXJldHVybiBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByaikuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvVGVtcGxhdGVEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1RlbXBsYXRlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTJlODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvVGVtcGxhdGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlRGF0YSB7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgd3RGaWxlTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB3dENTU05hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgd3RDb250YWluZXJMb2NhdG9pbiA9ICIiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB0YWdsaWJzOwotCi0JLyoqCi0JICogVGVtcGxhdGVEYXRhIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRlbXBsYXRlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckxvY2F0b2luKCkgewotCQlyZXR1cm4gd3RDb250YWluZXJMb2NhdG9pbjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzQvMjAwMSA1OjI0OjMwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU05hbWUoKSB7Ci0JCXJldHVybiB3dENTU05hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi80LzIwMDEgNToyMjo1NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gd3RGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8yMDAxIDQ6MTY6MTAgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGFnbGlicygpIHsKLQkJcmV0dXJuIHRhZ2xpYnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyTG9jYXRvaW4oU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCXd0Q29udGFpbmVyTG9jYXRvaW4gPSBuZXdGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzQvMjAwMSA1OjI0OjMwIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDU1NOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q1NTTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0NTU05hbWUpIHsKLQkJd3RDU1NOYW1lID0gbmV3Q1NTTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzQvMjAwMSA1OjIyOjU2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdXdEZpbGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCXd0RmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8yMDAxIDQ6MTY6MTAgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1RhZ2xpYnMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJzKGphdmEubGFuZy5TdHJpbmcgbmV3VGFnbGlicykgewotCQl0YWdsaWJzID0gbmV3VGFnbGliczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y0M2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViUHJvcGVydGllc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgV2ViUHJvcGVydGllc1V0aWwgewotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQURfQ0hBUlMgPSB7Jy8nLCAnXFwnLCAnOid9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQURfQ0hBUlMgPSB7JzonfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pBVkFfU09VUkNFX05BTUUgPSAiSmF2YSBTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLy9UT0RPIFBvcnQgdG8gZmxleGlibGUgc3RydWN0dXJlCi0JLyoqCi0JICogVXBkYXRlIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgdG8gYSBuZXcgdmFsdWUgaWYgaXQgaXMgZGlmZmVyZW50LiBUaGlzIGFwcGxpZXMgdG8gYm90aCBTdGF0aWMKLQkgKiBhbmQgSjJFRSBXZWIgUHJvamVjdHMuIEluIHRoZSBjYXNlIG9mIGEgSjJFRSBQcm9qZWN0LCB0aGUgbGlicmFyeSBjbGFzc3BhdGggZW50cmllcyB3aWxsIGJlCi0JICogbW9kaWZpZXMgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgV2ViIFByb2plY3QgdG8gdXBkYXRlCi0JICogQHBhcmFtIHdlYkNvbnRlbnROYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3IG5hbWUgZ2l2ZW4gdG8gdGhlIFdlYiBQcm9qZWN0J3MgV2ViIENvbnRlbnQgZm9sZGVyCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgSW5kaWNhdGVzIHByb2dyZXNzIG9mIHRoZSB1cGRhdGUgb3BlcmF0aW9uCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSB3ZWIgY29udGVudCByZW5hbWUgd2FzIGFjdHVhbGx5IHJlbmFtZWQsIGZhbHNlIGlmIHVubmVlZGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cmVkIGR1cmluZyByZW5hbWluZyBvZiB0aGUgdGhlIHByb2plY3QncyB3ZWIgY29udGVudAotCSAqICAgICAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cGRhdGVXZWJDb250ZW50TmFtZUFuZFByb3BlcnRpZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHdlYkNvbnRlbnROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCi0JCQkvKgotCQkJICogSUJhc2VXZWJOYXR1cmUgd2ViTmF0dXJlID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuZ2V0UnVudGltZShwcm9qZWN0KTsgaWYKLQkJCSAqICh3ZWJDb250ZW50TmFtZSA9PSBudWxsKSB7IGlmICh3ZWJOYXR1cmUuaXNTdGF0aWMoKSkgeyB3ZWJDb250ZW50TmFtZSA9Ci0JCQkgKiBKMkVFV2ViTmF0dXJlUnVudGltZVV0aWxpdGllcy5nZXREZWZhdWx0U3RhdGljV2ViQ29udGVudE5hbWUoKTsgfSBlbHNlIHsKLQkJCSAqIHdlYkNvbnRlbnROYW1lID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuZ2V0RGVmYXVsdEoyRUVXZWJDb250ZW50TmFtZSgpOyB9IH0KLQkJCSAqLwotCi0JCQlJUGF0aCBuZXdQYXRoID0gbmV3IFBhdGgod2ViQ29udGVudE5hbWUpOwotCQkJaWYgKGdldE1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmVxdWFscyhuZXdQYXRoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAocHJvamVjdC5leGlzdHMobmV3UGF0aCkpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIiwgSVN0YXR1cy5PSywgUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNvdWxkX25vdF9yZW5hbWVfX19fXzIsIG5ldyBPYmplY3RbXXt3ZWJDb250ZW50TmFtZX0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCW1vdmVXZWJDb250ZW50Rm9sZGVyKHByb2plY3QsIHdlYkNvbnRlbnROYW1lLCBwcm9ncmVzc01vbml0b3IpOwotCQkJdXBkYXRlV2ViQ29udGVudE5hbWVQcm9wZXJ0aWVzT25seShwcm9qZWN0LCB3ZWJDb250ZW50TmFtZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgY2xhc3NwYXRoIGVudHJpZXMgYW5kIFNlcnZlciBSb290IE5hbWUgZm9yIHRoaXMgd2ViIHByb2plY3Qgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB3ZWJDb250ZW50TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlV2ViQ29udGVudE5hbWVQcm9wZXJ0aWVzT25seShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgd2ViQ29udGVudE5hbWUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIG5ld1BhdGggPSBuZXcgUGF0aCh3ZWJDb250ZW50TmFtZSk7Ci0JCWlmIChnZXRNb2R1bGVTZXJ2ZXJSb290KHByb2plY3QpLmVxdWFscyhuZXdQYXRoKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIWdldE1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZXF1YWxzKHdlYkNvbnRlbnROYW1lKSkgewotCi0JCQkvLyBpZiAod2ViTW9kdWxlQXJ0aWZhY3QuaXNKMkVFKSB7Ci0JCQkvLyBVcGRhdGUgdGhlIGxpYnJhcnkgcmVmZXJlbmNlcwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aC5sZW5ndGhdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJCQlJUGF0aCBsaWJwYXRoID0gbGlicmFyeS5nZXRQYXRoKCk7Ci0JCQkJCUlQYXRoIG1vZFNlcnZlclJvb3RQYXRoID0gZ2V0TW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5nZXRGdWxsUGF0aCgpOwotCQkJCQlpZiAobW9kU2VydmVyUm9vdFBhdGguaXNQcmVmaXhPZihsaWJwYXRoKSkgewotCQkJCQkJSVBhdGggcHJ1bmVkUGF0aCA9IGxpYnBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtb2RTZXJ2ZXJSb290UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCQlJUGF0aCByZWxXZWJDb250ZW50UGF0aCA9IG5ldyBQYXRoKHdlYkNvbnRlbnROYW1lICsgIi8iICsgcHJ1bmVkUGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSVJlc291cmNlIGFic1dlYkNvbnRlbnRQYXRoID0gcHJvamVjdC5nZXRGaWxlKHJlbFdlYkNvbnRlbnRQYXRoKTsKLQotCQkJCQkJSVBhdGggc3JjQXR0YWNobWVudFBhdGggPSBsaWJyYXJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JCQkJCQlpZiAobnVsbCAhPSBzcmNBdHRhY2htZW50UGF0aCkgewotCQkJCQkJCXBydW5lZFBhdGggPSBzcmNBdHRhY2htZW50UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1vZFNlcnZlclJvb3RQYXRoLnNlZ21lbnRDb3VudCgpKTsKLQkJCQkJCX0KLQkJCQkJCUlSZXNvdXJjZSBhYnNXZWJDb250ZW50U3JjQXR0YWNobWVudFBhdGggPSBwcm9qZWN0LmdldEZpbGUocmVsV2ViQ29udGVudFBhdGgpOwotCi0JCQkJCQluZXdDbGFzc3BhdGhbaV0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoYWJzV2ViQ29udGVudFBhdGguZ2V0RnVsbFBhdGgoKSwgYWJzV2ViQ29udGVudFNyY0F0dGFjaG1lbnRQYXRoLmdldEZ1bGxQYXRoKCksIGxpYnJhcnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIGxpYnJhcnkuaXNFeHBvcnRlZCgpKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3Q2xhc3NwYXRoW2ldID0gY2xhc3NwYXRoW2ldOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQluZXdDbGFzc3BhdGhbaV0gPSBjbGFzc3BhdGhbaV07Ci0JCQkJfQotCQkJCS8vIH0KLQotCQkJCS8vIFNldCB0aGUgamF2YSBvdXRwdXQgZm9sZGVyCi0JCQkJSUZvbGRlciBvdXRwdXRGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihnZXRNb2R1bGVTZXJ2ZXJSb290KHByb2plY3QpLmdldEZ1bGxQYXRoKCkpOwotCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG91dHB1dEZvbGRlci5nZXRGdWxsUGF0aCgpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQkJfQotCQkJLy8gdXBkYXRlIHdlYnNldHRpbmdzCi0JCQkvLyBUT0RPIGFkZCB0byBXZWJBcnRpZmFjdEVkaXQKLQkJCS8vIHdlYk5hdHVyZS5zZXRNb2R1bGVTZXJ2ZXJSb290TmFtZSh3ZWJDb250ZW50TmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgd2ViIGNvbnRlbnQgZm9sZGVyIHRvIHRoZSBuYW1lIGluZGljYXRlZCBvbmx5IGlmIHRoYXQgcGF0aCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4KLQkgKiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHdlYiBwcm9qZWN0IHRvIGJlIHVwZGF0ZWQuCi0JICogQHBhcmFtIHdlYkNvbnRlbnROYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3IHdlYiBjb250ZW50IG5hbWUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBJbmRpY2F0ZXMgcHJvZ3Jlc3MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCBkdXJpbmcgbW92ZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZVdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHdlYkNvbnRlbnROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBuZXdQYXRoID0gbmV3IFBhdGgod2ViQ29udGVudE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKG5ld1BhdGgpKSB7Ci0JCQlpZiAobmV3UGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gbmV3UGF0aC5zZWdtZW50Q291bnQoKSAtIDE7IGkgPiAwOyBpLS0pIHsKLQkJCQkJSVBhdGggdGVtcFBhdGggPSBuZXdQYXRoLnJlbW92ZUxhc3RTZWdtZW50cyhpKTsKLQkJCQkJSUZvbGRlciB0ZW1wRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIodGVtcFBhdGgpOwotCQkJCQlpZiAoIXRlbXBGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCXRlbXBGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbmV3UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQobmV3UGF0aCk7Ci0JCQlJQ29udGFpbmVyIHdlYkNvbnRlbnRSb290ID0gZ2V0TW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KTsKLQkJCUlQYXRoIG9sZFBhdGggPSB3ZWJDb250ZW50Um9vdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQl3ZWJDb250ZW50Um9vdC5tb3ZlKG5ld1BhdGgsIElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFBhdGguc2VnbWVudENvdW50KCk7IGkrKykgewotCQkJCUlQYXRoIHRlbXBQYXRoID0gb2xkUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoaSk7Ci0JCQkJSUZvbGRlciB0ZW1wRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIodGVtcFBhdGgpOwotCQkJCWlmICh0ZW1wRm9sZGVyLmV4aXN0cygpICYmIHRlbXBGb2xkZXIubWVtYmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXRlbXBGb2xkZXIuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN5bmNob25pemllcyB0aGUgY2xhc3MgcGF0aCBhbmQgdGhlIGxpYiBkaXJlY3RvcmllcyB0byBjYXRjaCBhbnkgY2hhbmdlcyBmcm9tIHRoZSBsYXN0IHVzZQotCSAqIENyZWF0aW9uIGRhdGU6ICg0LzE3LzAxIDExOjQ4OjEyIEFNKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzeW5jaChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCQkJbW9uaXRvci5iZWdpblRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuU3ljaHJvbml6ZV9DbGFzc19QYXRoX1VJXywgNCk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vJE5PTi1OTFMtMSQgPSAiU3ljaHJvbml6ZSBDbGFzcyBQYXRoIgotCi0JCQlJQ29udGFpbmVyIGxpYl9mb2xkZXIgPSBnZXRXZWJMaWJGb2xkZXIocHJvamVjdCk7Ci0JCQkvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZSBsaWIgZm9sZGVyIGRvZXMgbm90IGV4aXN0LgotCQkJaWYgKGxpYl9mb2xkZXIgPT0gbnVsbCB8fCAhbGliX2ZvbGRlci5pc0FjY2Vzc2libGUoKSkKLQkJCQlyZXR1cm47Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQkJSVBhdGggbGliX3BhdGggPSBsaWJfZm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCUlQYXRoIGxpYl9mdWxsX3BhdGggPSBsaWJfZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0KLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0KLQkJCWJvb2xlYW4gbmVlZHNUb0JlTW9kaWZpZWQgPSBmYWxzZTsKLQkJCS8vIENyZWF0ZSBhIG1hcCBvZiB0aGUgbGliIHByb2plY3RzIGluIHRoZSBjdXJyZW50IHByb2plY3QKLQkJCUhhc2h0YWJsZSBsaWJfamFycyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCUlSZXNvdXJjZVtdIGNoaWxkcmVuID0gbGliX2ZvbGRlci5tZW1iZXJzKCk7Ci0JCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ2F0YWxvZ19MaWJfRGlyZWN0b3J5X19VSV8pOyAvLyROT04tTkxTLTEkCi0JCQkvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeToiCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVJlc291cmNlIGNoaWxkID0gY2hpbGRyZW5bal07Ci0JCQkJLy8gbW9uaXRvci5zZXRUYXNrTmFtZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXyIpICsKLQkJCQkvLyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OiIKLQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgYSB6aXAgb3IgYSBqYXIgZmlsZQotCQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgKGNoaWxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXx8IGNoaWxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuemlwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGliX2phcnMucHV0KGNoaWxkLmdldEZ1bGxQYXRoKCksIGNoaWxkKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVXBkYXRlX0NsYXNzUGF0aF9fVUlfKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8kTk9OLU5MUy0xJCA9ICJVcGRhdGUgQ2xhc3NQYXRoOiIKLQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGNsYXNzcGF0aCBkaXJzIGxvb2tpbmcgZm9yIG9uZXMgdGhhdCBtYXkgaGF2ZQotCQkJLy8gYmVlbiBkZWxldGVkCi0JCQlWZWN0b3IgbmV3Q2xhc3NQYXRoVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcC5sZW5ndGg7IGorKykgewotCi0JCQkJLy8gSWYgaXQgaXMgYSBsaWJfcGF0aAotCQkJCWlmIChjcFtqXS5nZXRQYXRoKCkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGxpYl9wYXRoLnRvU3RyaW5nKCkpIHx8IGNwW2pdLmdldFBhdGgoKS50b1N0cmluZygpLnN0YXJ0c1dpdGgobGliX2Z1bGxfcGF0aC50b1N0cmluZygpKSkgewotCQkJCQkvLyBJdCB3YXMgYWxyZWFkeSBpbiB0aGUgY2xhc3MgcGF0aAotCQkJCQlpZiAobGliX2phcnMuZ2V0KGNwW2pdLmdldFBhdGgoKSkgIT0gbnVsbCkgewotCQkJCQkJbmV3Q2xhc3NQYXRoVmVjdG9yLmFkZChjcFtqXSk7Ci0JCQkJCQkvLyBSZW1vdmUgaXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBvZiBwYXRocyB0byBhZGQgYmFjawotCQkJCQkJLy8gbW9uaXRvci5zZXRUYXNrTmFtZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXyIpCi0JCQkJCQkvLyArIGNwW2pdLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OiIKLQkJCQkJCWxpYl9qYXJzLnJlbW92ZShjcFtqXS5nZXRQYXRoKCkpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBZb3UgaGF2ZSByZW1vdmVkIHNvbWV0aGluZyBmb3JtIHRoZSBjbGFzcyBwYXRoIHlvdQotCQkJCQkJLy8gd2lsbCBuZWVkIHRvIHJlLWJ1aWxkCi0JCQkJCQkvLyBtb25pdG9yLnNldFRhc2tOYW1lKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhdGFsb2dfTGliX0RpcmVjdG9yeV9SZW1vX1VJXyIpCi0JCQkJCQkvLyArIGNwW2pdLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OlJlbW92ZSAiCi0JCQkJCQluZWVkc1RvQmVNb2RpZmllZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ2F0YWxvZ19MaWJfRGlyZWN0b3J5X19VSV8gKyBjcFtqXS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OiIKLQkJCQkJbmV3Q2xhc3NQYXRoVmVjdG9yLmFkZChjcFtqXSk7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVXBkYXRlX0NsYXNzUGF0aF9fVUlfKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8kTk9OLU5MUy0xJCA9ICJVcGRhdGUgQ2xhc3NQYXRoOiIKLQotCQkJLy8gQWRkIGFueSBlbnRyaWVzIG5vdCBhbHJlYWR5IGZvdW5kCi0JCQlFbnVtZXJhdGlvbiBhZW51bSA9IGxpYl9qYXJzLmtleXMoKTsKLQkJCXdoaWxlIChhZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJbmV3Q2xhc3NQYXRoVmVjdG9yLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCkpOwotCQkJCS8vIFlvdSBoYXZlIGFkZGVkIHNvbWV0aGluZyBmb3JtIHRoZSBjbGFzcyBwYXRoIHlvdQotCQkJCS8vIHdpbGwgbmVlZCB0byByZS1idWlsZAotCQkJCS8vIG1vbml0b3Iuc2V0VGFza05hbWUoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjNjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXSB7Ci0JCQkJLy8gcGF0aCB9KSkpOyAvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeTpBZGQgezB9IgotCQkJCW5lZWRzVG9CZU1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuU2V0X0NsYXNzUGF0aF9fVUlfKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8kTk9OLU5MUy0xJCA9ICJTZXQgQ2xhc3NQYXRoOiIKLQotCQkJLy8gVGFuc2ZlciB0aGUgdmVjdG9yIHRvIGFuIGFycmF5Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc1BhdGhBcnJheSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q2xhc3NQYXRoVmVjdG9yLnNpemUoKV07Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3Q2xhc3NQYXRoQXJyYXkubGVuZ3RoOyBqKyspIHsKLQkJCQluZXdDbGFzc1BhdGhBcnJheVtqXSA9IChJQ2xhc3NwYXRoRW50cnkpIG5ld0NsYXNzUGF0aFZlY3Rvci5nZXQoaik7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkgY2hhbmdlIHRoZSBjbGFzcyBwYXRoIGlmIHRoZXJlIGhhcyBiZWVuIGEgbW9kaWZpY2F0aW9uCi0JCQlpZiAobmVlZHNUb0JlTW9kaWZpZWQpIHsKLQotCQkJCXRyeSB7Ci0JCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc1BhdGhBcnJheSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGV4KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGV4dFJvb3QpIHsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPIG1pZ3JhdGUgdG8gZmxleCBwcm9qZWN0cwotCQkJCS8vIHdlYkVkaXQgPSAoV2ViQXJ0aWZhY3RFZGl0KSBTdHJ1Y3R1cmVFZGl0LmdldEZpcnN0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJCQl3ZWJFZGl0LnNldFNlcnZlckNvbnRleHRSb290KGNvbnRleHRSb290KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICovCi0JLyoqCi0JICogUmV0dXJucyBhIGVycm9yIG1lc3NhZ2UgdGhhdCBzdGF0ZXMgd2hldGhlciBhIGNvbnRleHQgcm9vdCBpcyB2YWxpZCBvciBub3QgcmV0dXJucyBudWxsIGlmCi0JICogY29udGV4dCByb290IGlzIGZpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCi0JCWlmIChjb250ZXh0Um9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjb250ZXh0Um9vdDsKLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSB8fCBuYW1lID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhpcyB3YXMgYWRkZWQgYmVjYXVzZSB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGRudCBiZSBzaG93biBpbml0aWFsbHkuIEl0IHNob3VsZCBiZQotCQkJLy8gc2hvd24gb25seSBpZiBjb250ZXh0IHJvb3QgZmllbGQgaXMgZWRpdGVkIHRvCi0JCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiAvLyBKWiAtIGZpeCB0byBkZWZlY3QgMjA0MjY0LCAiLyIgaXMgdmFsaWQgaW4gY29udGV4dCByb290IGlmIChuYW1lLmluZGV4T2YoIi8vIikgIT0gLTEpIHsKLQkJICogLy8kTk9OLU5MUy0xJCBlcnJvck1lc3NhZ2UgPSAiLy8gYXJlIGludmFsaWQgY2hhcmFjdGVycyBpbiBhIHJlc291cmNlIG5hbWUiOyByZXR1cm4KLQkJICogZXJyb3JNZXNzYWdlOyB9Ci0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkJaWYgKG5hbWUudHJpbSgpLmVxdWFscyhuYW1lKSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUsICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dGVyIDogd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKCEodG9rZW4uY2hhckF0KGkpID09ICdfJykgJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy0nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLycpICYmIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQodG9rZW4uY2hhckF0KGkpKSA9PSBmYWxzZSkgewotCQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UodG9rZW4uY2hhckF0KGkpKSkgewotCQkJCQkJCS8vIFJlbW92ZWQgYmVjYXVzZSBjb250ZXh0IHJvb3RzIGNhbiBjb250YWluIHdoaXRlIHNwYWNlCi0JCQkJCQkJLy8gZXJyb3JNZXNzYWdlID0KLQkJCQkJCQkvLyBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfQ29udGV4dF9yb290X2Nhbm5vdF9jb250YV9VSV8iKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gPSAiIENvbnRleHQgcm9vdCBjYW5ub3QgY29udGFpbiB3aGl0ZXNwYWNlcy4iCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVycm9yTWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbi8gZW5kIG9mIGlmKG5hbWUudHJpbQotCQllbHNlCi0JCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5OYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81OyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBhcnJheS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBzdHIsIGNoYXJbXSBjaGFycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc3RyLmluZGV4T2YoY2hhcnNbaV0pICE9IC0xKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlRm9sZGVyTmFtZShTdHJpbmcgZm9sZGVyTmFtZSkgewotCQlpZiAoZm9sZGVyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8yOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGNvbnRhaW5zKGZvbGRlck5hbWUsIEJBRF9DSEFSUykpCi0JCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2lzX25vdF92YWxpZCwgbmV3IE9iamVjdFtde2ZvbGRlck5hbWV9KTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVXZWJDb250ZW50TmFtZShTdHJpbmcgd2ViQ29udGVudE5hbWUsIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBqYXZhU291cmNlTmFtZSkgewotCi0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZUZvbGRlck5hbWUod2ViQ29udGVudE5hbWUpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCi0JCWlmIChqYXZhU291cmNlTmFtZSAhPSBudWxsICYmIHdlYkNvbnRlbnROYW1lLmVxdWFscyhqYXZhU291cmNlTmFtZSkpCi0JCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVzX2Nhbm5vdF9iZV9lcXVhbF80OyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSWYgZ2l2ZW4gYSBqYXZhIHByb2plY3QsIGNoZWNrIHRvIG1ha2Ugc3VyZSBjdXJyZW50IHBhY2thZ2UgZnJhZ21lbnQKLQkJLy8gcm9vdCBmb2xkZXJzIGRvIG5vdCBvdmVybGFwIHdpdGggbmV3IHdlYiBjb250ZW50IG5hbWUKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdHNbXSA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKLQkJCQkJCWlmICghcm9vdC5pc0FyY2hpdmUoKSkgewotCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJCQkJCQlTdHJpbmcgcm9vdEZvbGRlciA9IHBhdGguc2VnbWVudCgxKTsKLQkJCQkJCQkJaWYgKHdlYkNvbnRlbnROYW1lLmVxdWFscyhyb290Rm9sZGVyKSkgewotCQkJCQkJCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQotCQkJCQkJCQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfdGhlX3NhbWVfYXNfSmF2YV9zb3VyY2VfZm9sZGVyXzU7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2Nhbm5vdF9iZV90aGVfc2FtZV9hc19KYXZhX2NsYXNzX2ZvbGRlcl82OyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIFVwZGF0ZSBnaXZlbiB3ZWIgbmF0dXJlIHRvIHRoZSBjdXJyZW50IHZlcnNpb24gaWYgbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJOYXR1cmUKLQkgKiAgICAgICAgICAgIFRoZSB3ZWIgTmF0dXJlIHRoYXQgc2hvdWxkIGJlIGV4YW1pbmVkLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bm5lY2Vzc2FyeS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCBkdXJpbmcgdGhlIHZlcnNpb24gY2hhbmdlIG9wZXJhdGlvbi4KLQkgKi8KLQkvKgotCSAqIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiB1cGRhdGVOYXR1cmVUb0N1cnJlbnRWZXJzaW9uKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYk5hdHVyZSkgdGhyb3dzCi0JICogQ29yZUV4Y2VwdGlvbiB7Ci0JICogCi0JICogYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JICogCi0JICogaWYgKHdlYk5hdHVyZS5nZXRWZXJzaW9uKCkgIT0gV0VCLkNVUlJFTlRfVkVSU0lPTikgewotCSAqIHdlYk5hdHVyZS5zZXRWZXJzaW9uKEoyRUVTZXR0aW5ncy5DVVJSRU5UX1ZFUlNJT04pOyBzdWNjZXNzID0gdHJ1ZTsgfQotCSAqICgoSjJFRU1vZHVsZVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwpCi0JICogd2ViTmF0dXJlLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkpLnJlY29tcHV0ZUNvbnRhaW5lcnNJZk5lY2Vzc2FyeSgpOwotCSAqIAotCSAqIHJldHVybiBzdWNjZXNzOyB9Ci0JICovCi0KLQkvKioKLQkgKiBNb3ZlIHRoZSBvbGQgc291cmNlIGZvbGRlciB0byB0aGUgbmV3IGRlZmF1bHQgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgV2ViIFByb2plY3Qgd2UgYXJlIHdvcmtpbmcgd2l0aC4KLQkgKiBAcGFyYW0gb2xkU291cmNlRm9sZGVyCi0JICogICAgICAgICAgICBUaGUgb2xkICJKYXZhIFNvdXJjZSIgZm9sZGVyIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQkgKiBAcGFyYW0gamF2YVNvdXJjZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgbmFtZSBvZiB0aGUgIkphdmEgU291cmNlIiBmb2xkZXIsIG9yIG51bGwgZm9yIGRlZmF1bHQuCi0JICogQHJldHVybiBUaGUgbG9jYXRpb24gb2YgdGhlIG5ldyBmb2xkZXIsIG9yIG51bGwgaWYgbm8gbW92ZSB3YXMgbmVjZXNzYXJ5LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cmVkIGR1cmluZyB0aGUgbW92ZSBvcGVyYXRpb24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJQ29udGFpbmVyIHVwZGF0ZUphdmFTb3VyY2VOYW1lKElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgb2xkU291cmNlRm9sZGVyLCBTdHJpbmcgamF2YVNvdXJjZU5hbWUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb250YWluZXIgbmV3U291cmNlRm9sZGVyID0gbnVsbDsKLQkJaWYgKG9sZFNvdXJjZUZvbGRlciAhPSBudWxsKSB7Ci0JCQlJUGF0aCBuZXdQYXRoOwotCQkJaWYgKGphdmFTb3VyY2VOYW1lID09IG51bGwpCi0JCQkJbmV3UGF0aCA9IG5ldyBQYXRoKERFRkFVTFRfSkFWQV9TT1VSQ0VfTkFNRSk7Ci0JCQllbHNlCi0JCQkJbmV3UGF0aCA9IG5ldyBQYXRoKGphdmFTb3VyY2VOYW1lKTsKLQotCQkJLy8gTWFrZSBzdXJlIG5ldyBwYXRoIGlzIGRpZmZlcmVudCBmb3JtIG9sZCBwYXRoCi0JCQlpZiAoIXByb2plY3QuZ2V0Rm9sZGVyKG5ld1BhdGgpLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG9sZFNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpKSkgewotCQkJCW9sZFNvdXJjZUZvbGRlci5tb3ZlKG5ld1BhdGgsIElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSk7Ci0JCQkJSmVtUHJvamVjdFV0aWxpdGllcy5yZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwcm9qZWN0LCBvbGRTb3VyY2VGb2xkZXIpOwotCQkJCW5ld1NvdXJjZUZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5ld1BhdGgpOwotCQkJCUplbVByb2plY3RVdGlsaXRpZXMuYXBwZW5kSmF2YUNsYXNzUGF0aChwcm9qZWN0LCBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0LmdldEZvbGRlcihuZXdQYXRoKS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1NvdXJjZUZvbGRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgc291cmNlIGZvbGRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBtaWdyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBXZWIgUHJvamVjdCB0byBleGFtaW5lLgotCSAqIEByZXR1cm4gVGhlIHNvdXJjZSBmb2xkZXIgdG8gdXNlIGluIG1pZ3JhdGlvbiwgb3IgbnVsbCBpZiBpdCBzaG91bGQgYmUgc2tpcHBlZC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIElDb250YWluZXIgZ2V0SmF2YVNvdXJjZUZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgc291cmNlUm9vdHMgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCUlDb250YWluZXIgb2xkU291cmNlRm9sZGVyID0gbnVsbDsKLQotCQlpZiAoc291cmNlUm9vdHMgIT0gbnVsbCkgewotCQkJaWYgKHNvdXJjZVJvb3RzLnNpemUoKSA9PSAxKSB7Ci0JCQkJSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIgPSAoSUNvbnRhaW5lcikgc291cmNlUm9vdHMuZ2V0KDApOwotCQkJCWlmIChzb3VyY2VGb2xkZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCW9sZFNvdXJjZUZvbGRlciA9IHNvdXJjZUZvbGRlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9sZFNvdXJjZUZvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0TW9kdWxlU2VydmVyUm9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIFRPRE8gbmVlZCB0byBpbXBsZW1lbnQgbW9kdWxlIHNlcnZlciByb290IHByb3Blcmx5Ci0JCUlQYXRoIGNvbXBSb290UGF0aCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpLmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlyZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIoY29tcFJvb3RQYXRoKTsKLQkJLy9yZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIoIldlYkNvbnRlbnQiKTsKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbEZvbGRlciBnZXRXZWJMaWJGb2xkZXIoSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50KSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkYgKyAiLyIgKyAibGliIik7Ci0JCUlWaXJ0dWFsRm9sZGVyIGxpYkZvbGRlciA9IHdlYkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKHBhdGgpOwotCQlyZXR1cm4gbGliRm9sZGVyOwotCX0KLQotCS8vVE9ETyBkZWxldGUganNob2xsCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFdlYkxpYkZvbGRlcihJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wb25lbnQpCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldFdlYkxpYkZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRXZWJMaWJGb2xkZXIoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQl9Ci0KLQkvLwkKLQkvLyBzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNJbXBvcnRlZENsYXNzZXNKQVJGaWxlSW5MaWJEaXIoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8gaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyByZXR1cm4gcmVzb3VyY2UuZ2V0VHlwZSgpID09IHJlc291cmNlLkZJTEUgJiYKLQkvLyByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoSVdlYk5hdHVyZUNvbnN0YW50cy5JTVBPUlRFRF9DTEFTU0VTX1NVRkZJWCkgJiYgaXNaaXAocmVzb3VyY2UpOwotCS8vIH0KLQkvLwkKLQkvLyBzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNMaWJEaXJKQVJGaWxlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCS8vIGlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gcmV0dXJuIHJlc291cmNlLmdldFR5cGUoKSA9PSByZXNvdXJjZS5GSUxFICYmIGlzWmlwKHJlc291cmNlKTsKLQkvLyB9Ci0JLy8JCi0JLy8gc3RhdGljIHB1YmxpYyBib29sZWFuIGlzWmlwKElSZXNvdXJjZSByZXNvdXJjZSkgewotCS8vIFN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JLy8gWmlwRmlsZSB6aXAgPSBudWxsOwotCS8vCi0JLy8gdHJ5IHsKLQkvLyB6aXAgPSBuZXcgWmlwRmlsZShwYXRoKTsKLQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBub3RBWmlwKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0gZmluYWxseSB7Ci0JLy8gaWYgKHppcCAhPSBudWxsKSB7Ci0JLy8gdHJ5IHsKLQkvLyB6aXAuY2xvc2UoKTsKLQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkge30KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiB6aXAgIT0gbnVsbDsKLQkvLyB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlRvb2xpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwYmY4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlRvb2xpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBUaGUgV2ViVG9vbGluZ0V4Y2VwdGlvbiBjbGFzcyBpcyB0aGUgZ2VuZXJpYyBjbGFzcyBmb3IgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIHdlYiB0b29saW5nLgotICovCi1wdWJsaWMgY2xhc3MgV2ViVG9vbGluZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FYX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19TQV9FUlJPUl87IC8vJE5PTi1OTFMtMSQgPSAiT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gU0FYIGVycm9yOiAiCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9fRVJST1JfTUVTU0FHRSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0lPX0VSUk9SXzsgLy8kTk9OLU5MUy0xJCA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBJTyBlcnJvcjogIgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfRVJST1JfTUVTU0FHRSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0NvX0VSUk9SXzsgLy8kTk9OLU5MUy0xJCA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBDb3JlIGVycm9yOiAiCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NT0RFTF9FUlJPUl9NRVNTQUdFID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fSmFfRVJST1JfOyAvLyROT04tTkxTLTEkID0gIk9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIEphdmEgTW9kZWwgZXJyb3I6ICIKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBXZWJUb29saW5nRXhjZXB0aW9uIHdpdGggbm8gbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIGZvciBhIHN1cHBsaWVkIElPIEV4Y2VwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFdlYlRvb2xpbmdFeGNlcHRpb24oSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXRoaXMoSU9fRVJST1JfTUVTU0FHRSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgV2ViVG9vbGluZ0V4Y2VwdGlvbiB3aXRoIGVycm9yIG1lc3NhZ2Ugb2Ygcy4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgc3VwcGxpZWQgcHJlYW1ibGUgYW5kIHRoZSBtZXNzYWdlIG9mIHRoZQotCSAqIGV4YW1wbGUgYXBwZW5kZWQgdG8gdGhlIGVuZC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKFN0cmluZyBwcmVhbWJsZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQl0aGlzKHByZWFtYmxlICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciBmb3IgYSBzdXBwbGllZCBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXRoaXMoQ09SRV9FUlJPUl9NRVNTQUdFLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgZm9yIGEgc3VwcGxpZWQgSmF2YU1vZGVsRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKEphdmFNb2RlbEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJdGhpcyhKQVZBX01PREVMX0VSUk9SX01FU1NBR0UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciBmb3IgYSBzdXBwbGllZCBTQVggRXhjZXB0aW9uCi0JICogCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgU0FYRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFdlYlRvb2xpbmdFeGNlcHRpb24oU0FYRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQl0aGlzKFNBWF9FUlJPUl9NRVNTQUdFLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViVG9vbGluZ1RlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlRvb2xpbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzlmNjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViVG9vbGluZ1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlRvb2xpbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvNi8yMDAwIDc6MzU6MzggUE0pCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIFRlbXBsYXRlRGF0YQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoVGVtcGxhdGVEYXRhIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViQXJ0aWZhY3RFZGl0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkFydGlmYWN0RWRpdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAyMmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViQXJ0aWZhY3RFZGl0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgV2ViQXJ0aWZhY3RFZGl0VXRpbGl0aWVzIHsKLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFdlYkNvbXBvbmVudChTZXJ2bGV0IHNlcnZsZXQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2bGV0KTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlXZWJBcHAgd2ViYXBwID0gZWRpdC5nZXRXZWJBcHAoKTsKLQkJCQkJaWYgKHdlYmFwcC5nZXRTZXJ2bGV0TmFtZWQoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGNvbXBvbmVudDsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU0YTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEFkYXB0cyB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9cyB0bwotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnV0aWwuV2ViQXJ0aWZhY3RFZGl0fSZuYnNwOyBmYWNhZGVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV2ViRWRpdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IFdlYkFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUgfHwgYWRhcHRlclR5cGUgPT0gQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3Q7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKSkKLQkJCQlyZXR1cm4gbmV3IFdlYkFydGlmYWN0RWRpdCgoQXJ0aWZhY3RFZGl0TW9kZWwpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117QXJ0aWZhY3RFZGl0LmNsYXNzLCBXZWJBcnRpZmFjdEVkaXQuY2xhc3N9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9XZWJBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9XZWJBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMTllNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9jb21wb25lbnRjb3JlL3V0aWwvV2ViQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIFdlYkFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV2ViIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YSBmcm9tIGEKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlIG1ldGFtb2RlbC4gVGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZX0mbmJzcDtpcyByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDt1c2luZyBhIGNvbnN0YW50IHtAc2VlCi0gKiBKMkVFQ29uc3RhbnRzI1dFQkFQUF9ERF9VUklfT0JKfS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGltcGxlbWVudHMgSUFydGlmYWN0RWRpdEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViREQiOwotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdlYkFydGlmYWN0RWRpdCB0byBhIFdlYkVkaXRBZGFwdGVyRmFjdG9yeSB7QHNlZQotCSAqIFdlYkVkaXRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gV2ViQXJ0aWZhY3RFZGl0LmNsYXNzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXZWJBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFdlYkFydGlmYWN0RWRpdChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCXN1cGVyKGFNb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoYmluYXJ5TW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXZWJBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5LCBmb3JDcmVhdGUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBXZWJBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5LCBib29sZWFuIGZvckNyZWF0ZSwgU3RyaW5nIGVkaXRNb2RlbElEKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSwgZm9yQ3JlYXRlLCBlZGl0TW9kZWxJRCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRXZWJNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgV2ViQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlXZWJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkV2ViTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KSkpCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdlYkFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV2ViQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYU1vZHVsZS5pc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gbmV3IFdlYkFydGlmYWN0RWRpdChhTW9kdWxlKTsKLQkJfQotCi0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV2ViQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcwotCSAqIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXZWJBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcnRpZmFjdEVkaXQgZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsIHx8IGFNb2R1bGUuaXNCaW5hcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiAgICAgICAgICAgIEEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKFdvcmtiZW5jaENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMKLQkgKiAgICAgICAgIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIFdlYkFwcFJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlyZXR1cm4gKChXZWJBcHBSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViQXBwIChAc2VlIFdlYkFwcCkgcm9vdCBvYmplY3QgZnJvbSB0aGUgV2ViQXBwUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzCi0JICogbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkIChAbGluayBhZGRXZWJBcHBJZk5lY2Vzc2FyeShnZXRXZWJBcHBsaWNhdGlvblhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYWRkV2ViQXBwSWZOZWNlc3NhcnkoKFdlYkFwcFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZnJvbSB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgdXNpbmcgZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gZ2V0QmluYXJ5Q29tcG9uZW50SGVscGVyKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJX09CSik7Ci0JCX0KLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJX09CSik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIFNlcnZsZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gdGhlIHtAc2VlIFdlYkFwcFJlc291cmNlfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlIHZlcnNpb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZsZXRWZXJzaW9uKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuICgoV2ViQXBwUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBmb3IgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIGxldmVsIGFzc29jaWF0ZWQKLQkgKiB3aXRoIHRoZSBKMkVFIHZlcnNpb24gZm9yIHRoaXMgd29ya2JlbmNoIG1vZHVsZS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwgYW5kIHJldHVybnMKLQkgKiAyMCBhcyBkZWZhdWx0LgotCSAqIAotCSAqIEBzZWUgV2ViQXJ0aWZhY3RFZGl0I2dldFNlcnZsZXRWZXJzaW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIEpTUCBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SlNQVmVyc2lvbigpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWludCBzZXJ2bGV0VmVyc2lvbiA9IGdldFNlcnZsZXRWZXJzaW9uKCk7Ci0JCWlmIChzZXJ2bGV0VmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpTUF8xXzFfSUQ7Ci0JCWVsc2UgaWYgKHNlcnZsZXRWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSlNQXzFfMl9JRDsKLQkJZWxzZQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpTUF8yXzBfSUQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViQXBwKSBhbmQgcG9wdWxhdGVzIHdpdGggZGF0YS4gQWRkcyB0aGUgcm9vdAotCSAqIG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfQotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBWZXJzaW9uIHRvIGJlIHNldCBvbiByZXNvdXJjZS4uLi5pZiBudWxsIGRlZmF1bHQgaXMgdGFrZW4KLQkgKiAKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJBcHBJZk5lY2Vzc2FyeShYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJV2ViQXBwIHdlYkFwcE5ldyA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViQXBwKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdlYkFwcE5ldyk7Ci0JCQkJYVJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJfQotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCVVSSSBtb2R1bGVVUkkgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQl3ZWJBcHAuc2V0RGlzcGxheU5hbWUoU3RydWN0dXJlRWRpdC5nZXREZXBsb3llZE5hbWUobW9kdWxlVVJJKSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJCWFSZXNvdXJjZS5zZXRJRCh3ZWJBcHAsIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEKTsKLQotCQkJV2VsY29tZUZpbGVMaXN0IHdMaXN0ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQkJCUxpc3QgZmlsZXMgPSB3TGlzdC5nZXRGaWxlKCk7Ci0JCQlXZWxjb21lRmlsZSBmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiaW5kZXguaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQlmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiaW5kZXguaHRtIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCWZpbGUgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0JCQlmaWxlLnNldFdlbGNvbWVGaWxlKCJpbmRleC5qc3AiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJZmlsZSA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGUoKTsKLQkJCWZpbGUuc2V0V2VsY29tZUZpbGUoImRlZmF1bHQuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQlmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiZGVmYXVsdC5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJZmlsZSA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGUoKTsKLQkJCWZpbGUuc2V0V2VsY29tZUZpbGUoImRlZmF1bHQuanNwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQotCQkJd2ViQXBwLnNldEZpbGVMaXN0KHdMaXN0KTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGV4KSB7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UgZm9yIHRoZSBhc3NvY2lhdGVkCi0JICogd29ya2JlbmNoIG1vZHVsZS4gVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgV2ViQXJ0aWZhY3RFZGl0I2dldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZ1bGwgSVBhdGggZm9yIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHdlYiBhcHAgcmVzb3VyY2UsIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnksIGFkZCBnZXQgdGhlIHJvb3QKLQkgKiBvYmplY3QsIHRoZSB3ZWIgYXBwIG91dCBvZiB0aGF0IHdlYiBhcHAgcmVzb3VyY2UuIEl0IHdpbGwgY3JlYXRlIHRoZSB3ZWIgYXBwIGluc3RhbmNlIGlmIG5lZWQKLQkgKiBiZSwgYW5kIGFkZCBpdCB0byB0aGUgd2ViIHJlc291cmNlLiBUaGVuLCBpdCByZXR1cm5zIHRoZSB3ZWIgYXBwIG9iamVjdCBhcyB0aGUgbW9kZWwgcm9vdC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlT2JqZWN0IGluc3RhbmNlIG9mIHRoZSBtb2RlbCByb290Ci0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSB3ZWIgYXBwIHJlc291cmNlLCBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5LCBhZGQgZ2V0IHRoZSByb290Ci0JICogb2JqZWN0LCBzZXQgdmVyc2lvbiB0aGUgd2ViIGFwcCBvdXQgb2YgdGhhdCB3ZWIgYXBwIHJlc291cmNlLiBJdCB3aWxsIGNyZWF0ZSB0aGUgd2ViIGFwcAotCSAqIGluc3RhbmNlIGlmIG5lZWQgYmUsIGFuZCBhZGQgaXQgdG8gdGhlIHdlYiByZXNvdXJjZS4gVGhlbiwgaXQgcmV0dXJucyB0aGUgd2ViIGFwcCBvYmplY3QgYXMKLQkgKiB0aGUgbW9kZWwgcm9vdC4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICogCi0JICogQHJldHVybiB0aGUgZU9iamVjdCBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcm9vdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbikgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJV2ViQXBwUmVzb3VyY2UgcmVzID0gKFdlYkFwcFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZFdlYkFwcElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiByZXMuZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogdXNlIHtAbGluayBXZWJVdGlsaXRpZXN9e0BsaW5rICNnZXRMaWJNb2R1bGVzKCl9Ci0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0TGliTW9kdWxlcygpIHsKLQkJcmV0dXJuIFdlYlV0aWxpdGllcy5nZXRMaWJNb2R1bGVzKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGRlcGVuZGVudCBtb2R1bGVzIGZyb20gdGhlIHBhc3NlZCBpbiBhcnJheSB0byB0aGUgZGVwZW5kZW50bW9kdWxlcwotCSAqIGxpc3Qgb2YgdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoIG1vZHVsZS4gSXQgd2lsbCBlbnN1cmUgYSBudWxsIGlzIG5vdCBwYXNzZWQgYW5kIGl0IHdpbGwKLQkgKiBlbnN1cmUgdGhlIGRlcGVuZGVudCBtb2R1bGVzIGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGliTW9kdWxlcwotCSAqICAgICAgICAgICAgYXJyYXkgb2YgZGVwZW5kZW50IG1vZHVsZXMgdG8gYWRkIGFzIHdlYiBsaWJyYXJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaWJNb2R1bGVzKFJlZmVyZW5jZWRDb21wb25lbnRbXSBsaWJNb2R1bGVzKSB7Ci0JCS8vIFRPRE8gLSBOZWVkIHRvIGltcGxlbWVudAotCQkvLyBpZiAobGliTW9kdWxlcz09bnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyBmb3IgKGludCBpPTA7IGk8bGliTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkvLyBpZiAoIW1vZHVsZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmNvbnRhaW5zKGxpYk1vZHVsZXNbaV0pKQotCQkvLyBtb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQobGliTW9kdWxlc1tpXSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBjb250ZXh0IHJvb3QgZm9yIHRoaXMgd2ViIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUuIEl0IGlzCi0JICogbWVhbnQgdG8gaGFuZGxlIGEgc3RhbmRhbG9uZSB3ZWIgY2FzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbnRleHRSb290IFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIGNvbnRleHQgcm9vdCBmb3IgdGhpcyB3ZWIgcHJvamVjdCBpbiB0aGUgYXNzb2NpYXRlZCBwYXJhbWV0ZXIncwotCSAqIGFwcGxpY2F0aW9uLnhtbC4gSWYgdGhlIGVhclByb2plY3QgaXMgbnVsbCwgdGhlbiB0aGUgY29udGV4dFJvb3QgZnJvbSB0aGUgLmNvbXBvbmVudCBvZiB0aGUKLQkgKiB3ZWIgcHJvamVjdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdAotCSAqIEByZXR1cm4gY29udGV4dFJvb3QgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSkKLQkJCXJldHVybiBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCWNvbnRleHRSb290ID0gZWFyRWRpdC5nZXRXZWJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGNvbnRleHQgcm9vdCBmb3IgdGhpcyB3ZWIgcHJvamVjdCBvbiB0aGUgRUFSIHdoaWNoIGlzIHBhc3NlZCBpbi4KLQkgKiBJZiBubyBFQVIgaXMgcGFzc2VkIHRoZSAuY29tcG9uZW50IGZpbGUgZm9yIHRoZSB3ZWIgcHJvamVjdCB3aWxsIGJlIHVwZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gYUNvbnRleHRSb290Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgZWFyUHJvamVjdCwgU3RyaW5nIGFDb250ZXh0Um9vdCkgewotCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpCi0JCQlzZXRTZXJ2ZXJDb250ZXh0Um9vdChhQ29udGV4dFJvb3QpOwotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvcldyaXRlKGVhclByb2plY3QpOwotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQllYXJFZGl0LnNldFdlYkNvbnRleHRSb290KGdldFByb2plY3QoKSwgYUNvbnRleHRSb290KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlYXJFZGl0ICE9IG51bGwpIHsKLQkJCQllYXJFZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGNvbnRleHQgcm9vdCBwcm9wZXJ0eSBvbiB0aGUgd2ViIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUgZm9yIHRoZQotCSAqIHN0YW5kYWxvbmUgY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlKMkVFUHJvamVjdFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCksIGNvbnRleHRSb290KTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViQXBwCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCi0JCXJldHVybiAoV2ViQXBwKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGFDb21wb25lbnQpOwotCX0KLQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKWdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpOwotCQkJcmV0dXJuIGhlbHBlci5hY2Nlc3NMZWdhY3lBcmNoaXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpLCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JCQlsb2FkZXIuc2V0RXhwb3J0U291cmNlKGluY2x1ZGVTb3VyY2UpOwotCQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKLQkJCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbldBUkZpbGUobG9hZGVyLCB1cmkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbmV3IFdlYkFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl3ZWJFZGl0LmNyZWF0ZU1vZGVsUm9vdCh2ZXJzaW9uKTsKLQkJCXdlYkVkaXQuc2F2ZShudWxsKTsKLQkJfSBmaW5hbGx5IHsgIC8vIE1ha2Ugc3VyZSBuZXcgcmVzb3VyY2UgaXMgcmVtb3ZlZCAgLSB0aGUgdXJpIHVzZWQgZm9yIGNyZWF0aW9uIHNob3VsZG4ndCBiZSBjYWNoZWQKLQkJCVJlc291cmNlIG5ld1JlcyA9IHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpLmdldFJlc291cmNlcygpLnJlbW92ZShuZXdSZXMpOwotCQkJbmV3UmVzLnVubG9hZCgpOwotCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9ZmluYWxseXsKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCXJldHVybiBXRUJfQ09OVEVOVF9UWVBFOwotCX0KLQlwcm90ZWN0ZWQgVVJJIGdldFJvb3RVUkkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE3YzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5XZWJBcnRpZmFjdEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgV2ViQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIHdlYiBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIHdlYiBhcHBsaWNhdGlvbnMuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZhZDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVCA9ICJJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY1Byb3BlcnRpZXMuUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX1RPX1dFQl9WRVJTSU9OID0gIklDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljUHJvcGVydGllcy5DT05WRVJUX1RPX1dFQl9WRVJTSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTE1MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0gKiBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci4KLSAqIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBkdXJpbmcgTTUKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotICAgIC8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4gZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gZXhwb3J0IGNvbXBpbGVkIEpTUCBmaWxlcwotICAgICAqIChjb21waWxlZCBmaWxlcyBleGlzdCBpbiAvV0VCLUlORi9jbGFzc2VzIGFzIC5jbGFzcyBhbmQgLmphdmFbZm9yIGRlYnVnXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0NPTVBJTEVfSlNQID0gIldlYkV4cG9ydERhdGFNb2RlbC5FWENMVURFX0NPTVBJTEVfSlNQIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4Njk3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIFdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQKLSAqIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG9wdGlvbmFsIHtAbGluayBMaXN0fSBwcm9wZXJ0eSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggbmVzdGVkIHdlYiBsaWJyYXJpZXMgc2hvdWxkIGJlCi0JICogZXhwYW5kZWQgaW50byBwcm9qZWN0cyBkdXJpbmcgaW1wb3J0LiBUaGUgY29udGVudHMgb2YgdGhpcyB7QGxpbmsgTGlzdH0gcHJvcGVydHkgc2hvdWxkIGJlCi0JICoge0BsaW5rIEFyY2hpdmV9cy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCA9ICJXQVJJbXBvcnREYXRhTW9kZWwuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMge0BsaW5rIExpc3R9IHByb3BlcnR5IHNob3VsZCBub3QgYmUgc2V0IGJ5IGNsaWVudHMuIFRoaXMgbGlzdCBjb250YWlucyB0aGUKLQkgKiB7QGxpbmsgSURhdGFNb2RlbH1zIGZvciBjcmVhdGluZyB0aGUgbmV3IGNvbXBvbmVudHMgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQKLQkgKiBhcmNoaXZlcy4gVGhpcyBsaXN0IHdpbGwgY29udGFpbiBvbmUgZW50cnkgZm9yIGVhY2ggd2ViIGxpYiBhcmNoaXZlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdAotCSAqIGlzIHNlbGVjdGVkIGZvciBpbXBvcnQgYnkgdGhlIHtAbGluayAjV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRH0gcHJvcGVydHkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9MSUJfTU9ERUxTID0gIldBUkltcG9ydERhdGFNb2RlbC5XRUJfTElCX01PREVMUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVCA9ICJJQWRkV2ViQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ZTY3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT53ZWIgbW9kdWxlIGRhdGEgbW9kZWwgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgYXBpIHRvIGNyZWF0ZSwgaW1wb3J0IGFuZCBleHBvcnQgd2ViIG1vZHVsZXMuIFRoZSBpbnRlcmZhY2VzIGluIHRoaXMgcGFja2FnZQotICAgICAgICBkZWZpbmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSB3ZWIgbW9kdWxlcyBkYXRhIG1vZGVscyB0aGF0IGFyZSB1c2UgdG8gcnVuIHRoZSBkYXRhIG1vZGVsIG9wZXJhdGlvbnMgYW5kIGRyaXZlIHRoZSB3aXphcmQgZGF0YSwgdmFsaWRhdGlvbi4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNDRlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L0lXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxZjA1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUphdmFGYWNldFNvdXJjZUZvbGRlcnNDaGFuZ2VkKCBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzID0gZXZlbnQuZ2V0SmF2YUZhY2V0SW5zdGFsbENvbmZpZygpLmdldFNvdXJjZUZvbGRlcnMoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlciA9ICggc291cmNlRm9sZGVycy5pc0VtcHR5KCkgPyBudWxsIDogc291cmNlRm9sZGVycy5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCkgKTsKLSAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoIFNPVVJDRV9GT0xERVIsIHNvdXJjZUZvbGRlciApOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoQ09OVEVYVF9ST09UKTsKLQkJbmFtZXMuYWRkKFNPVVJDRV9GT0xERVIpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5XRUJfQ09OVEVOVF9GT0xERVIpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKLQkJICAgIGlmKCB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcgIT0gbnVsbCApCi0JCSAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICggc291cmNlRm9sZGVycy5pc0VtcHR5KCkgPyBudWxsIDogc291cmNlRm9sZGVycy5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCkgKTsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgICByZXR1cm4gbnVsbDsKLQkJICAgIH0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFWFRfUk9PVCkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpLnJlcGxhY2UoJyAnLCAnXycpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7Ci0JCQlyZXR1cm4gRFlOQU1JQ19XRUI7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNT0RVTEVfVVJJKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQ7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHRU5FUkFURV9ERCkpIHsKLQkJCVN0cmluZyBmYWNldFZlcnNpb24gPSBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUik7Ci0JCQlpZihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChmYWNldFZlcnNpb24pID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSjJFRVByZWZlcmVuY2VzLktleXMuRFlOQU1JQ19XRUJfR0VORVJBVEVfREQpKTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChBRERfVE9fRUFSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05URVhUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0gZWxzZSBpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05URVhUX1JPT1QsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewotCQkJLy8gSWYgdXNpbmcgb3B0aW1pemVkIHNpbmdsZSByb290IHN0cnVjdHVyZSwgdXBkYXRlIHRoZSBvdXRwdXQgZm9sZGVyIGJhc2VkIG9uIGNvbnRlbnQgZm9sZGVyIGNoYW5nZQotCQkJLy8gVGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSAiPGNvbnRlbnRSb290Pi9XRUItSU5GL2NsYXNzZXMiCi0JCQlpZiAoUHJvZHVjdE1hbmFnZXIuc2hvdWxkVXNlU2luZ2xlUm9vdFN0cnVjdHVyZSgpKSAKLQkJCXsKLQkgICAgICAgICAgICBpZiggdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnICE9IG51bGwgKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggb3V0cHV0Rm9sZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICA9IHByb3BlcnR5VmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSArICIvIiArSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVMgKTsKLQotCSAgICAgICAgICAgICAgICB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuc2V0RGVmYXVsdE91dHB1dEZvbGRlciggb3V0cHV0Rm9sZGVyICk7Ci0JICAgICAgICAgICAgfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkgCi0JCXsKLQkJICAgIGlmKCB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcgIT0gbnVsbCApCi0JCSAgICB7Ci0JCSAgICAgICAgZmluYWwgSVBhdGggc291cmNlRm9sZGVyCi0JCSAgICAgICAgICAgID0gcHJvcGVydHlWYWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBQYXRoKCAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlICk7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnLnNldFNvdXJjZUZvbGRlciggc291cmNlRm9sZGVyICk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhDT05URVhUX1JPT1QpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVDb250ZXh0Um9vdChnZXRTdHJpbmdQcm9wZXJ0eShDT05URVhUX1JPT1QpKTsKLQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlRm9sZGVyTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKSk7Ci0JCX0KLQkJLy8gdGhlIHN1cGVyY2xhc3MgdmFsaWRhdGVzIHRoZSBjb250ZW50IGRpcmVjdG9yeSB3aGljaCBpcyBhY3R1YWxseSBhICJDT05GSUdfRk9MREVSIgotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDb250ZXh0Um9vdChTdHJpbmcgY29udGV4dFJvb3QpIHsKLQkJaWYgKGNvbnRleHRSb290ID09IG51bGwpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzIsIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfTsKLQkJCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoZXJyb3JTdGF0dXMsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5OYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81LCBuZXcgT2JqZWN0W117Y29udGV4dFJvb3R9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjY5ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGguV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkZhY2V0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlmaW5hbCBJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkvLyBBZGQgV1RQIG5hdHVyZXMuCi0KLQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMocHJvamVjdCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCWZpbmFsIElQYXRoIHBqcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJZmluYWwgSVBhdGggY29udGVudGRpciA9IHNldENvbnRlbnRQcm9wZXJ0eUlmTmVlZGVkKG1vZGVsLCBwanBhdGgsIHByb2plY3QpOwotCQkJbWtkaXJzKHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY29udGVudGRpcikpOwotCi0JCQlmaW5hbCBJUGF0aCB3ZWJpbmYgPSBjb250ZW50ZGlyLmFwcGVuZCgiV0VCLUlORiIpOyAvLyROT04tTkxTLTEkCi0JCQlJRm9sZGVyIHdlYmluZkZvbGRlciA9IHdzLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViaW5mKTsKLQkJCW1rZGlycyh3ZWJpbmZGb2xkZXIpOwotCi0JCQlmaW5hbCBJUGF0aCB3ZWJpbmZsaWIgPSB3ZWJpbmYuYXBwZW5kKCJsaWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWtkaXJzKHdzLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViaW5mbGliKSk7Ci0KLQkJCS8vIFNldHVwIHRoZSBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGZhbHNlKTsKLQotCQkJYy5jcmVhdGUoMCwgbnVsbCk7Ci0KLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCk7Ci0JCQlzZXRDb250ZXh0Um9vdFByb3BlcnR5SWZOZWVkZWQoYywgY29udGV4dFJvb3QpOwotCQkJc2V0SmF2YU91dHB1dFByb3BlcnR5SWZOZWVkZWQobW9kZWwsYyk7Ci0KLQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIHdlYnJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCWlmICh3ZWJyb290LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5lcXVhbHMobmV3IFBhdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl3ZWJyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYoIGZ2ID09IFdlYkZhY2V0VXRpbHMuV0VCXzMwICkKLQkJCXsKLQkJCQkgaWYobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCkpewotCQkgICAgICAgICAgICAgICAgY3JlYXRlV2ViMzBEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBmdiwgd2ViaW5mRm9sZGVyLCBtb25pdG9yKTsKLQkJICAgICAgICAgICAgfQotCQkJfQotCQkJZWxzZSBpZiggZnYgPT0gV2ViRmFjZXRVdGlscy5XRUJfMjUgKQotCQkJewotCQkgICAgICAgICBpZihtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REKSl7Ci0JCSAgICAgICAgICAgICAgICBjcmVhdGVXZWIyNURlcGxveW1lbnREZXNjcmlwdG9yKHByb2plY3QsIGZ2LCB3ZWJpbmZGb2xkZXIsIG1vbml0b3IpOwotCQkgICAgICAgICAgICB9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0gICAgCQkJLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpIGlmIG9uZSBkb2Vzbid0IGV4aXN0Ci0gICAgCQkJaWYgKCF3ZWJpbmZGb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLmV4aXN0cygpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJU3RyaW5nIHZlciA9IGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAJCQkJaW50IG5WZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXIpOwotICAgIAkJCQlXZWJBcnRpZmFjdEVkaXQuY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgblZlcik7Ci0gICAgCQkJfQotCQkJfQotCQkJCi0JCQkvLyBTZXQgZW50cmllcyBmb3Igc3JjIGZvbGRlcnMKLQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGpzcmMgPSBjLmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoIi9XRUItSU5GL2NsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbaV07Ci0JCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQlpZiggY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnNlZ21lbnRDb3VudCgpID4gMCApCi0JCQkJCQlqc3JjLmNyZWF0ZUxpbmsoY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLCAwLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUlWaXJ0dWFsRmlsZSB2ZiA9IGMuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCUlGaWxlIG1hbmlmZXN0bWYgPSB2Zi5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJaWYgKG1hbmlmZXN0bWYgPT0gbnVsbCB8fCAhbWFuaWZlc3RtZi5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWNyZWF0ZU1hbmlmZXN0KHByb2plY3QsIGMuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFNldHVwIHRoZSBjbGFzc3BhdGguCi0KLQkJCUNsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KTsKLQotCQkJaWYgKCFDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmdikpIHsKLQkJCQkvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0JCQkJLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotCQkJfQotCi0JCQkvLyBBZGQgdGhlIHdlYiBsaWJyYXJpZXMgY29udGFpbmVyLgotCi0JCQkJCQkKLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlV2ViQXBwTGlicmFyaWVzKCkpewotCQkJCWZpbmFsIElQYXRoIHdlYkxpYkNvbnRhaW5lciA9IG5ldyBQYXRoKFdlYkFwcExpYnJhcmllc0NvbnRhaW5lci5DT05UQUlORVJfSUQpOwotCQkJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSh3ZWJMaWJDb250YWluZXIpKTsKLQkJCX0KLQotCQkJaWYoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VFQVJMaWJyYXJpZXMoKSl7Ci0JCQkJZmluYWwgSVBhdGggZWFyTGliQ29udGFpbmVyID0gbmV3IFBhdGgoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5DT05UQUlORVJfSUQpOwotCQkJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShlYXJMaWJDb250YWluZXIpKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFPdXRwdXRQcm9wZXJ0eUlmTmVlZGVkKElEYXRhTW9kZWwgbW9kZWwsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMpIHsKLQkJLy8gTWFrZSBzdXJlIG91dHB1dCBmb2xkZXIgaXMgc2V0IHByb3Blcmx5IGZvciB3ZWIgcHJvamVjdHMsIGFuZCB0aGUgcHJvZHVjdCBzZXR0aW5nIGZvciBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZC4KLQkJLy8gV2UgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZSBleGlzdGluZyBzZXR1cAotCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpIHsKLQkJCVN0cmluZyBvdXRwdXRGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUikrIi8iK0oyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTOwotCQkJCi0JCQlJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoYy5nZXRQcm9qZWN0KCkpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudCA9IG51bGw7Ci0JCQlib29sZWFuIHdlYmluZiA9IGZhbHNlOwotCQkJSVBhdGggcGpwYXRoID0gYy5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCUxpc3QgdXBkYXRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IG51bGw7Ci0JCQkJYm9vbGVhbiBjaGFuZ2VOZWVkZWQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3VycmVudFtpXTsKLQkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgJiYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaW5kZXhPZihKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykgPT0gLTEpKSB7Ci0JCQkJCQkvL291dHB1dCBkaWZmZXJlbnQgdGhhbiBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUwotCQkJCQkJc291cmNlUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCXVwZGF0ZWRMaXN0LmFkZChKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzb3VyY2VQYXRoKSk7Ci0JCQkJCQljaGFuZ2VOZWVkZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXVwZGF0ZWRMaXN0LmFkZChlbnRyeSk7Ci0JCQkJfQotCQkJCUlQYXRoIGN1cnJlbnREZWZhdWx0T3V0cHV0ID0gbnVsbDsKLQkJCQljdXJyZW50RGVmYXVsdE91dHB1dCA9IGpwcm9qLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKGN1cnJlbnREZWZhdWx0T3V0cHV0LnRvU3RyaW5nKCkuaW5kZXhPZihKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykgPT0gLTEpCi0JCQkJCWNoYW5nZU5lZWRlZCA9IHRydWU7Ci0JCQkJaWYgKGNoYW5nZU5lZWRlZCkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSB1cGRhdGVkID0gKElDbGFzc3BhdGhFbnRyeVtdKXVwZGF0ZWRMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVt1cGRhdGVkTGlzdC5zaXplKCldKTsKLQkJCQkJSVBhdGggb3V0ZGlyID0gcGpwYXRoLmFwcGVuZChvdXRwdXRGb2xkZXIpOyAKLQkJCQkJanByb2ouc2V0UmF3Q2xhc3NwYXRoKHVwZGF0ZWQsb3V0ZGlyICxudWxsKTsKLQkJCQkJanByb2ouc2F2ZShudWxsLCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkvLyBOb3cganVzdCBzZXQgdGhlIHByb3BlcnR5Ci0JCVN0cmluZyBleGlzdGluZyA9IGMuZ2V0TWV0YVByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgiamF2YS1vdXRwdXQtcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleGlzdGluZyA9PSBudWxsKQotCQkJc2V0T3V0cHV0Rm9sZGVyKG1vZGVsLCBjKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgSjJFRSBzZXQgb3V0cHV0IGZvbGRlciB3aGljaCBzZXRzIHRoZSBvdXRwdXQgZm9sZGVyIHRvIHRoZSBjb250ZW50IHJvb3QKLQkgKiBpZiB0aGUgb3B0aW1pemVkIHNpbmdsZSByb290IHN0cnVjdHVyZSBpcyB1c2VkLiAgRm9yIHdlYiBwcm9qZWN0cywgd2UgbmVlZCB0byBzd2l0Y2ggdGhpcyB0bwotCSAqIHNldCB0aGUgb3V0cHV0IGZvbGRlciB0byAiPGNvbnRlbnRSb290Pi9XRUItSU5GL2NsYXNzZXMiCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE91dHB1dEZvbGRlcihJRGF0YU1vZGVsIG1vZGVsLCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJU3RyaW5nIG91dHB1dEZvbGRlciA9IG51bGw7Ci0JCS8vIElmIHVzaW5nIHNpbmdsZSByb290IHN0cnVjdHVyZSwgc2V0IHRoZSBvdXRwdXQgZm9sZGVyIHRvICI8Y29udGVudFJvb3Q+L1dFQi1JTkYvY2xhc3NlcyIKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKLQkJCW91dHB1dEZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKSsiLyIrSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVM7Ci0JCS8vIE90aGVyd2lzZSBzZXQgdGhlIG91dHB1dCBmb2xkZXIgdG8gdGhlIHByb2R1Y3Qgc2V0dGluZyBkZWZhdWx0Ci0JCWVsc2UKLQkJCW91dHB1dEZvbGRlciA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uT1VUUFVUX0ZPTERFUik7Ci0KLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiamF2YS1vdXRwdXQtcGF0aCIsIG91dHB1dEZvbGRlciApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRSb290UHJvcGVydHlJZk5lZWRlZChmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjLCBTdHJpbmcgY29udGV4dFJvb3QpIHsKLQkJU3RyaW5nIGV4aXN0aW5nID0gYy5nZXRNZXRhUHJvcGVydGllcygpLmdldFByb3BlcnR5KCJjb250ZXh0LXJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkKLQkJCWMuc2V0TWV0YVByb3BlcnR5KCJjb250ZXh0LXJvb3QiLCBjb250ZXh0Um9vdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElQYXRoIHNldENvbnRlbnRQcm9wZXJ0eUlmTmVlZGVkKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwsIGZpbmFsIElQYXRoIHBqcGF0aCwgSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZmFsc2UpOwotCQlpZiAoYy5leGlzdHMoKSkgewotCQkJaWYoICFjLmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuaXNSb290KCkgKXsKLQkJCQlyZXR1cm4gYy5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGpwYXRoLmFwcGVuZChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUikpOwotCX0KLQkKLQkvLyBUaGlzIG1ldGhvZCBzdGlsbCBjcmVhdGVzIGEgd2ViLnhtbCB3aXRoIGEgU2VydmxldCAyLjUgc2NoZW1hLCBiZWNhdXNlIHRoZSBTZXJ2bGV0IDMuMCBvbmUgaXMgbm90IHlldCBkZWZpbmVkCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdlYjMwRGVwbG95bWVudERlc2NyaXB0b3IoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHdlYmluZkZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpIGlmIG9uZSBkb2Vzbid0IGV4aXN0Ci0gICAgICAgSUZpbGUgd2VieG1sRmlsZSA9IHdlYmluZkZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBpZiAoIXdlYnhtbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1pbmltYWwgd2ViLnhtbCBmaWxlLCBzbyB0aGUgbW9kZWwgY2FuIGJlIGluaXRpYWxpemVkCi0gICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2ViWG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48d2ViLWFwcCBpZD1cIldlYkFwcF9JRFwiIHZlcnNpb249XCIyLjVcIiB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2RcIj5cbjwvd2ViLWFwcD4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICB3ZWJ4bWxGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0od2ViWG1sQ29udGVudHMuZ2V0Qnl0ZXMoIlVURi04IikpLCB0cnVlLCBtb25pdG9yKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAvLyBUT0RPIGRvIHNvbWUgc3R1ZmYgd2l0aCB0aGUgbW9kdWxlCi0gICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWIyNURlcGxveW1lbnREZXNjcmlwdG9yKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3ZWJpbmZGb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgIC8vIENyZWF0ZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKSBpZiBvbmUgZG9lc24ndCBleGlzdAotICAgICAgIElGaWxlIHdlYnhtbEZpbGUgPSB3ZWJpbmZGb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgaWYgKCF3ZWJ4bWxGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHdlYi54bWwgZmlsZSwgc28gdGhlIG1vZGVsIGNhbiBiZSBpbml0aWFsaXplZAotICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdlYlhtbENvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHdlYi1hcHAgaWQ9XCJXZWJBcHBfSURcIiB2ZXJzaW9uPVwiMi41XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkXCI+XG48L3dlYi1hcHA+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgd2VieG1sRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdlYlhtbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKSwgdHJ1ZSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgCi0gICAgICAgICAgICAgICBmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCwgZnYpOwotICAgICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsKLSAgIAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpc3BsYXktbmFtZSB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgZGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lLnNldFZhbHVlKHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwLmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxjb21lIGZpbGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gd2VsY29tZUZpbGVzID0gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXguaHRtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXguaHRtIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleC5qc3AiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuaHRtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdC5odG0iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuanNwIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHdlbGNvbWUtZmlsZS1saXN0IHRhZwotICAgICAgICAgICAgICAgICAgICAgICBXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKFdlbGNvbWVGaWxlTGlzdCkgV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdlbGNvbWVGaWxlTGlzdC5nZXRXZWxjb21lRmlsZXMoKS5hZGRBbGwod2VsY29tZUZpbGVzKTsgCi0gICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRXZWxjb21lRmlsZUxpc3RzKCkuYWRkKHdlbGNvbWVGaWxlTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHByb3ZpZGVyLm1vZGlmeShydW5uYWJsZSwgbnVsbCk7Ci0gICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpCi0KLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCi0JewotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJaWYgKGZvbGRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlta2RpcnMoKElGb2xkZXIpIGZvbGRlci5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0KLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBJQ29udGFpbmVyIHggPSBmb2xkZXI7Ci0JCSAgICAKLQkJICAgIHdoaWxlKCB4IGluc3RhbmNlb2YgSUZvbGRlciAmJiB4LmlzRGVyaXZlZCgpICkKLQkJICAgIHsKLQkJICAgICAgICB4LnNldERlcml2ZWQoIGZhbHNlICk7Ci0JCSAgICAgICAgeCA9IHguZ2V0UGFyZW50KCk7Ci0JCSAgICB9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiODlmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUgZXh0ZW5kcyBKMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgZmluYWwgT2JqZWN0IGNmZywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZpbmFsIElEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY2ZnOwotCi0JCQkvLyBBc3NvY2lhdGUgd2l0aCBhbiBFQVIsIGlmIG5lY2Vzc2FyeS4KLQkJCWlmICggbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpICkgewotCQkJCWZpbmFsIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpOwotCQkJCQotCQkJCWlmICggZWFyUHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhZWFyUHJvamVjdE5hbWUuZXF1YWxzKCIiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQkJU3RyaW5nIHZlciA9IGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLQkJCQkJCi0JCQkJCVN0cmluZyBqMmVlVmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyKSk7Ci0JCQkJCWZpbmFsIFN0cmluZyBtb2R1bGVVUkkgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShNT0RVTEVfVVJJKTsKLQkJCQkJCi0JCQkJCWZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjCi0JCQkJCSAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgbW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLQkJCQkJCi0JCQkJCWluc3RhbGxBbmRBZGRNb2R1bGV0b0VBUiggajJlZVZlcnNpb25UZXh0LAotCQkJCQkJCQllYXJQcm9qZWN0TmFtZSwKLQkJCQkJCQkJZnBqd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKSwKLQkJCQkJCQkJcHJvamVjdCwKLQkJCQkJCQkJbW9kdWxlVVJJLAotCQkJCQkJCQltb25pdG9yICk7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjc5NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkNsYXNzcGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9ydCB0aGUgbm8gcnVudGltZSBjYXNlLgotICAgICAgICAgICAgICAgIC8vIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgPHNvbWV0aGluZz4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0VXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBkZTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFdlYkZhY2V0VXRpbHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFdFQl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQl8yMiA9IFdFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjIiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzIzID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjIuMyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBXRUJfMjQgPSBXRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi40Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQl8yNSA9IFdFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzMwID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjMuMCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFdFQl9YRE9DTEVUX0ZBQ0VUID0gZ2V0V2ViRG9jbGV0RmFjZXQoKTsKLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChpZCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSAKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBnZXRXZWJEb2NsZXRGYWNldCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9YRE9DTEVUKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoZSB3ZWIgZG9jbGV0IGZhY2V0IGlzIG5vdCBkZWZpbmVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgwMDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUgCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSB2ZXJzaW9uIHRoYXQncyBjdXJyZW50bHkgaW5zdGFsbGVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2oKLSAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOwotCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGR2ZXIKLSAgICAgICAgICAgICAgICA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjbGFzc3BhdGguIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgb2xkdmVyICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCB2ZXJzaW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIGZpbmFsIFN0cnVjdHVyZUVkaXQgZWRpdCAKLS8vICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoIHByb2plY3QgKTsKLS8vICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIHRyeQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnRUeXBlIG9sZGN0eXBlIAotLy8gICAgICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnRUeXBlKCBjICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudFR5cGUgbmV3Y3R5cGUgCi0vLyAgICAgICAgICAgICAgICAgICAgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRDb21wb25lbnRUeXBlSWQoIG9sZGN0eXBlLmdldENvbXBvbmVudFR5cGVJZCgpICk7Ci0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRWZXJzaW9uKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLS8vICAgICAgICAgICAgICAgIG5ld2N0eXBlLmdldFByb3BlcnRpZXMoKS5hZGRBbGwoIG9sZGN0eXBlLmdldFByb3BlcnRpZXMoKSApOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVFZGl0LnNldENvbXBvbmVudFR5cGUoIGMsIG5ld2N0eXBlICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGVkaXQuc2F2ZUlmTmVjZXNzYXJ5KCBudWxsICk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZmluYWxseQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBlZGl0LmRpc3Bvc2UoKTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYmQ2YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2VzX3VpLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlYjE4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1zZXJ2bGV0dWkuamFyCi13ZWJzZXJ2aWNldWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTc3NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzNzAyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jVGh1IE1heSAxMCAxODozNjoxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxNzFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jV2VkIE1heSAwMyAyMDo0MTo0NCBFRFQgMjAwNgotREVMRUdBVEVTX1BSRUZFUkVOQ0U9ZGVsZWdhdGVWYWxpZGF0b3JMaXN0b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLldTRExEZWxlZ2F0aW5nVmFsaWRhdG9yXD1vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvclw9b3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3I7Ci1VU0VSX0JVSUxEX1BSRUZFUkVOQ0U9ZW5hYmxlZEJ1aWxkVmFsaWRhdG9yTGlzdG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvcjtvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BKYXZhVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJTWVzc2FnZVZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3I7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRUxWYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLldTRExEZWxlZ2F0aW5nVmFsaWRhdG9yO29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUERpcmVjdGl2ZVZhbGlkYXRvcjsKLVVTRVJfTUFOVUFMX1BSRUZFUkVOQ0U9ZW5hYmxlZE1hbnVhbFZhbGlkYXRvckxpc3RvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uLkhUTUxWYWxpZGF0b3I7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcjtvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSU1lc3NhZ2VWYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3I7b3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yO29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yO29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5XU0RMRGVsZWdhdGluZ1ZhbGlkYXRvcjtvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BEaXJlY3RpdmVWYWxpZGF0b3I7Ci1VU0VSX1BSRUZFUkVOQ0U9b3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlc2ZhbHNlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjQ4YTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnN0YXJ0dXA7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwxLjYuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSIxLjEuMjA1IgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uuc3RhcnR1cCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4YmVhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic2VydmljZXNfdWkvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1ZWFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYnNlcnZpY2VkZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd2Vic2VydmljZWRlc2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93c2RsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93c2RsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5MmRiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW5hdmlnYXRvci5Db250ZW50PUpTUi0xMDkgV2ViIFNlcnZpY2VzIEluZGV4Ci1wbHVnaW5OYW1lPVdUUCBXZWJzZXJ2aWNlIFVJIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2OTAwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICAgICBuYW1lPSIlbmF2aWdhdG9yLkNvbnRlbnQiCi0gICAgICAgICAgICBwcmlvcml0eT0ibG93ZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvd2Vic2VydmljZWRlc2MuZ2lmIgotICAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci53ZWJzZXJ2aWNlIj4KLSAgICAgICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ii8+Ci0gICAgICAgICAJICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwIi8+Ci0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSIvPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIvPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+Ci0gICAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgIAkgICAgICAgPHRlc3QgCi0JICAgICAgICAgICAgICAgIAlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JICAgICAgICAgICAgICAgIAlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkgICAgICAgICAgICAgICAgICB2YWx1ZT0id3NkZC54bWkiLz4KLQkgICAgICAgICAgICAgICA8dGVzdCAKLQkgICAgICAgICAgICAgICAgCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkgICAgICAgICAgICAgICAgCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiLz4KLQkgICAgICAgICAgICAgICA8dGVzdCAKLQkgICAgICAgICAgICAgICAgCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkgICAgICAgICAgICAgICAgCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJ3c2NvbW1vbi54bWkiLz4KLQkgICAgICAgICAgICAgICA8dGVzdCAKLQkgICAgICAgICAgICAgICAgCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkgICAgICAgICAgICAgICAgCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiLz4KLQkgICAgICAgICAgICAgPC9vcj4KLQkgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAJPC9vcj4KLSAgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICAgCTxvcj4KLSAgICAgICAgIAkgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAiLz4KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIi8+Ci0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIi8+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiLz4KLSAgICAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgCSAgICAgICA8dGVzdCAKLQkgICAgICAgICAgICAgICAgCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkgICAgICAgICAgICAgICAgCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJ3c2RkLnhtaSIvPgotCSAgICAgICAgICAgICAgIDx0ZXN0IAotCSAgICAgICAgICAgICAgICAJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCSAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JICAgICAgICAgICAgICAgICAgdmFsdWU9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIvPgotCSAgICAgICAgICAgICAgIDx0ZXN0IAotCSAgICAgICAgICAgICAgICAJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCSAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JICAgICAgICAgICAgICAgICAgdmFsdWU9IndzY29tbW9uLnhtaSIvPgotCSAgICAgICAgICAgICAgIDx0ZXN0IAotCSAgICAgICAgICAgICAgICAJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCSAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JICAgICAgICAgICAgICAgICAgdmFsdWU9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvV1NETCIvPgotCSAgICAgICAgICAgICA8L29yPgotCSAgICAgICAgICA8L2FuZD4KLSAgICAgICAgIAk8L29yPgotICAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICAgPGNvbW1vblNvcnRlcgotICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0gICAgICAJCWlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuSjJFRUNvbnRlbnQiPgotICAgICAgCQk8cGFyZW50RXhwcmVzc2lvbj4KLSAgICAgICAgICAgCQkgIDxvcj4gICAgICAgICAKLQkJICAgICAgICAgICAgPGluc3RhbmNlb2YgCi0JCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJICAgICAgICAgICAgPGluc3RhbmNlb2YgCi0JCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4gIAotCQkgICAgICAgICA8L29yPgotCQkgICA8L3BhcmVudEV4cHJlc3Npb24+Ci0gICAgICA8L2NvbW1vblNvcnRlcj4KLSAgICAgIDwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCSAgPGFjdGlvblByb3ZpZGVyCi0JCSAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lciIKLQkJICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS5KMkVFV2ViU2VydmljZUFjdGlvblByb3ZpZGVyIj4KLQkJICA8ZW5hYmxlbWVudD4KLQkJCSA8b3I+Ci0JCQkJPGFuZD4KLQkJCQkgIDxpbnN0YW5jZW9mCi0JCQkJCSB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id3NkZC54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id3Njb21tb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiIC8+Ci0JCQkJCSA8L29yPgotCQkJCTwvYW5kPgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIiAvPgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiIC8+Ci0JCQkgIDwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+IAotICAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIAotICAgPCEtLSBKMkVFIFZpZXcgV2ViIFNlcnZpY2VzIGNvbnRyaWJ1dGlvbiAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0gICAgICAJCXZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgIAkJPGluY2x1ZGVzPgotICAgICAgCQkgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwubmF2aWdhdG9yLndlYnNlcnZpY2UiCi0gICAgICAJCSAgICAgIGlzUm9vdD0iZmFsc2UiLz4KLSAgICAgIAkJPC9pbmNsdWRlcz4gIAotICAgICAgPC92aWV3ZXJDb250ZW50QmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbiAKLSAgCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlQWRhcHRlckZhY3RvcnkiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlQWRhcHRlckZhY3RvcnkiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgPC9mYWN0b3J5PgotICAgIAotICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KLSAgICAgIDxzdGFydHVwIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnN0YXJ0dXAuV2Vic2VydmljZUxpc3RlbmVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2V1aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2V1aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkwYTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wcm9wZXJ0eV9maWxlcy93ZWJzZXJ2aWNldWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTkVXX0JVVFRPTl9MQUJFTD1OZXcuLi4KLU5FV19IQU5ETEVSX1dJWkFSRF9XSU5ET1dfVElUTEU9TmV3IEhhbmRsZXIKLU5FV19IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFPVdlYiBTZXJ2aWNlIEhhbmRsZXIKLU5FV19IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXRlIGEgbmV3IHdlYiBzZXJ2aWNlIGhhbmRsZXIuCi1IQU5ETEVSX0RJU1BMQVlfTkFNRV9MQUJFTD1EaXNwYWx5IG5hbWU6Ci1IQU5ETEVSX0RFU0NSSVBUSU9OX0xBQkVMPURlc2NyaXB0aW9uOgotSEFORExFUl9OQU1FX0xBQkVMPUhhbmRsZXIgbmFtZToKLUhBTkRMRVJfQ0xBU1NfTkFNRV9MQUJFTD1IYW5kbGVyIGNsYXNzOgotSEFORExFUl9JTklUX1BBUkFNX1dJWkFSRF9XSU5ET1dfVElUTEU9SGFuZGxlciBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIKLUhBTkRMRVJfSU5JVF9QQVJBTV9XSVpBUkRfUEFHRV9USVRMRT1FbnRlciBIYW5kbGVyIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlcgotSEFORExFUl9JTklUX1BBUkFNX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXJlIGEgbmV3IGhhbmRsZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLgotSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfV0lORE9XX1RJVExFPUhhbmRsZXIgU09BUCBIZWFkZXJzCi1IQU5ETEVSX1NPQVBfSEVBREVSX1dJWkFSRF9QQUdFX1RJVExFPUVudGVyIEhhbmRsZXIgU09BUCBIZWFkZXJzCi1IQU5ETEVSX1NPQVBfSEVBREVSX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXRlIGEgbmV3IFNPQVAgaGVhZGVyLgotSEFORExFUl9OQU1FU1BBQ0VfVVJMX0xBQkVMPU5hbWVzcGFjZSBVUkw6Ci1IQU5ETEVSX0xPQ0FMX1BBUlRfTEFCRUw9TG9jYWwgcGFydDoKLVBvcnRDb21wb25lbnRSZWZMYWJlbFByb3ZpZGVyX1VJXzE9U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U6Ci1Qb3J0Q29tcG9uZW50UmVmTGFiZWxQcm92aWRlcl9VSV8yPVBvcnQgQ29tcG9uZW50IExpbms6Ci1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzA9U2VydmljZXMKLVdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGVfVUlfMT1DbGllbnRzCi1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzI9SGFuZGxlcnMKLVdlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbl9VSV8wPUZpbGVzCi1XZWJTZXJ2aWNlR3JvdXBDb250ZW50RXh0ZW5zaW9uX1VJXzE9T3BlbiB3aXRoIFdlYiBCcm93c2VyCi1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBfVUlfMD1KU1ItMTA5IFdlYiBTZXJ2aWNlcwotU2VydmVyX0ludmFsaWRfRm9yX0V4aXNpdG5nX0VBUl9VSV89U2VsZWN0ZWQgdGFyZ2V0IHNlcnZlciAiezB9IiBpcyBpbnZhbGlkIGZvciB0aGUgZXhpc3RpbmcgRUFSIHByb2plY3QgInsxfSIKLVNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25XaXphcmRfVUlfNj1TZXJ2aWNlIFJlZmVyZW5jZSBTZWxlY3Rpb24KLVNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25XaXphcmRfVUlfNz1TZXJ2aWNlIFJlZmVyZW5jZSBTbmlwcGV0Ci1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uUGFnZV9VSV8wPVNlbGVjdCBhIFNlcnZpY2UgUmVmZXJlbmNlCi1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uUGFnZV9VSV8xPVNlcnZpY2UgUmVmZXJlbmNlIG93bmVyOgotU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvblBhZ2VfVUlfMj1OZXcgU2VydmljZSBSZWZlcmVuY2UuLi4KLVNFUlZJQ0VfQ0xBU1NFU19VSV89U2VydmljZSBDbGFzc2VzCi1QT1JUX1VJXz1Qb3J0OgotSEFORExFUl9VSV89SGFuZGxlcjoKLVdTRExfUE9SVF9VSV89V1NETCBQb3J0OgotU0VSVklDRV9JTVBMX1VJXz1TZXJ2aWNlSW1wbDoKLVdTRExfVUlfPVdTREw6Ci1XU19OQVZfSk9CMD1JbmRleGluZyBKU1ItMTA5IFdlYiBTZXJ2aWNlcwotV1NfTkFWX0pPQjE9TG9hZCBXZWIgU2VydmljZSBDb21wb25lbnRzCi1XU19OQVZfSk9CMj1BZGQgSlNSLTEwOSBXZWIgU2VydmljZXMgbm9kZSB0byB2aWV3ZXIKLVdTX05BVl9KT0IzPVVwZGF0ZSBKU1ItMTA5IFdlYiBTZXJ2aWNlcyBub2RlIGluIHZpZXdlcgotV1NfTkFWX0pPQjQ9VXBkYXRlIEpTUi0xMDkgV2ViIFNlcnZpY2VzIG5vZGUgaW4gdmlld2VyCi1XU19OQVZfSk9CNT1VcGRhdGluZyBJbmRleCBvZiBXZWIgU2VydmljZSBDb21wb25lbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9OZXdQcm9qZWN0c0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9OZXdQcm9qZWN0c0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmVmNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvTmV3UHJvamVjdHNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uuc3RhcnR1cC5XZWJzZXJ2aWNlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXdQcm9qZWN0c0xpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciAgewotCi0JCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlVmlld2VyU3luY2hyb25pemF0aW9uIHN5bmNocm9uaXphdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXppbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNwb3NlZCA9IGZhbHNlOwotCi0JcHVibGljIE5ld1Byb2plY3RzTGlzdGVuZXIoV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbiBzeW5jKSB7Ci0JCXN5bmNocm9uaXphdGlvbiA9IHN5bmM7Ci0JCWlmKCFzeW5jaHJvbml6YXRpb24ud2ViU2VydmljZVByb2plY3RzRXhpc3QobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkpIHsKLQkJCS8vCQkJIG5vbmUgZXhpc3QKLQkJCVdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uc2V0QXJlVGhlcmVXZWJTZXJ2aWNlcyhmYWxzZSk7Ci0JCX0KLQkJc3RhcnRMaXN0ZW5pbmcoKTsKLQl9IAotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGxpc3RlbmluZykKLQkJCXN0b3BMaXN0ZW5pbmcoKTsKLQkJaWYoc3luY2hyb25pemluZykKLQkJCXN5bmNocm9uaXphdGlvbi5zdG9wKCk7Ci0JCWlmKFdlYnNlcnZpY2VMaXN0ZW5lci5nZXRJbnN0YW5jZSgpICE9IG51bGwKLQkJCQkmJiAhV2Vic2VydmljZUxpc3RlbmVyLmdldEluc3RhbmNlKCkuaXNMaXN0ZW5pbmcoKSl7Ci0JCQlXZWJzZXJ2aWNlTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JCWlzRGlzcG9zZWQgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdHJ5IHsKLQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHRoaXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdlYlNlcnZpY2VVSVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gCi0JfSAKLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7IAotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDogCi0JCQkJaWYobGlzdGVuaW5nICYmICAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSl7Ci0JCQkJCWlmKFdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uaXNJbnRlcmVzdGluZyhyZXNvdXJjZS5nZXRQcm9qZWN0KCkpICYmICFzeW5jaHJvbml6YXRpb24uaGFzTmF2aWdhdG9yR3JvdXBCZWVuQWRkZWQoKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCWlmKGxpc3RlbmluZyAmJiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQlpZihsaXN0ZW5pbmcgJiYgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQkJCWlmKFdlYlNlcnZpY2VzTWFuYWdlci5pc0ZpbGVJbnRlcmVzdGluZygoSUZpbGUpcmVzb3VyY2UpKXsKLQkJCQkJCXN0b3BMaXN0ZW5pbmcoKTsKLQkJCQkJCWlmKCFzeW5jaHJvbml6aW5nKXsKLQkJCQkJCQlzeW5jaHJvbml6aW5nID0gdHJ1ZTsKLQkJCQkJCQlzeW5jaHJvbml6YXRpb24uc3RhcnQoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIHNldCBpdCB0byB0cnVlLCBhZGQgdGhlIG5vZGUgaWYgbm90IGFscmVhZHkgYWRkZWQKLQkJCQkJCVdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uc2V0QXJlVGhlcmVXZWJTZXJ2aWNlcyh0cnVlKTsKLQkJCQkJCWlmKCFzeW5jaHJvbml6YXRpb24uaGFzTmF2aWdhdG9yR3JvdXBCZWVuQWRkZWQoKSl7Ci0JCQkJCQkJc3luY2hyb25pemF0aW9uLmFkZFdlYlNlcnZpY2VOb2RlKCk7Ci0JCQkJCQkJc3luY2hyb25pemF0aW9uLmluZGV4Sm9iU2NoZWR1bGVkID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQl2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCWxpc3RlbmluZyA9IHRydWU7Ci0JfQotCi0Jdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJbGlzdGVuaW5nID0gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBpc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIGxpc3RlbmluZzsKLQl9Ci0KLQlib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBpc0Rpc3Bvc2VkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL09wZW5FeHRlcm5hbFdTRExBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL09wZW5FeHRlcm5hbFdTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWFhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9PcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0T3BlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuQWN0aW9uIHsKLQotCVN0cmluZyB1cmkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgT3BlbkV4dGVybmFsV1NETEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJdGhpcy5zZXRJbWFnZURlc2NyaXB0b3IoQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy93ZWJfdHlwZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7IAotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwiV1NETCIsIiIsIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJYnJvd3Nlci5vcGVuVVJMKG5ldyBVUkwodXJpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJT2JqZWN0IG9iaiA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShvYmopKQotCQkJdXJpID0gKChSZXNvdXJjZSkgb2JqKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQllbHNlIGlmIChzZXJ2aWNlSGVscGVyLmlzU2VydmljZShvYmopKQotCQkJdXJpID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V1NETFJlc291cmNlKChFT2JqZWN0KW9iaikuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEzMTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVFTUZBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSjJFRUVNRkFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzU2VydmljZShhZGFwdGFibGVPYmplY3QpKQotCQkJcmVzID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V3NkZFJlc291cmNlKChFT2JqZWN0KSBhZGFwdGFibGVPYmplY3QpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXMgPSBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMUmVzb3VyY2UoKEVPYmplY3QpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBKMkVFRU1GQWRhcHRlckZhY3RvcnkuSUZJTEVfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBKMkVFRU1GQWRhcHRlckZhY3RvcnkuSVJFU09VUkNFX0NMQVNTKQotCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmMGE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb24gewotCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlOwotCXByb3RlY3RlZCBMaXN0IGFsbEZpbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbihXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZSkgewotCQlzdXBlcigpOwotCQl0aGlzLndlYlNlcnZpY2UgPSB3ZWJTZXJ2aWNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb25fVUlfMDsgCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2UuZ2V0V3NkbEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gd2ViU2VydmljZS5nZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFsbEZpbGVzKCkgewotCQlpZiAoYWxsRmlsZXMgPT0gbnVsbCkgewotCQkJYWxsRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlhbGxGaWxlcy5hZGQoZ2V0V1NETEZpbGUoKSk7Ci0JCQlhbGxGaWxlcy5hZGQoZ2V0TWFwcGluZ0ZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbEZpbGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZS4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZURlc2NyaXB0aW9uIGdldFdlYlNlcnZpY2UoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZU5hdmlnYXRvckdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1ZTUxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgewotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwX1VJXzA7IAotCXByaXZhdGUgSVdvcmtzcGFjZVJvb3Qgcm9vdDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKElXb3Jrc3BhY2VSb290IHdzUm9vdCkgewotCQlzdXBlcigpOwotCQlyb290ID0gd3NSb290OwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9vdC4KLQkgKi8KLQlwdWJsaWMgSVdvcmtzcGFjZVJvb3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJvb3QKLQkgKiAgICAgICAgICAgIFRoZSByb290IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290KElXb3Jrc3BhY2VSb290IHJvb3QpIHsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxYmM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjUsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyIHsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyA9IElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5PX0NISUxEUkVOID0gbmV3IE9iamVjdFswXTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VTID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRTID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQU5ETEVSUyA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFU19VSSA9IFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UU19VSSA9IFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUlNfVUkgPSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8yOwotCi0JcHJpdmF0ZSBpbnQgVFlQRTsKLQlwcml2YXRlIEVPYmplY3Qgd3NkbFNlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3BlY2lmaWMgdHlwZSBvZiB3ZWIgc2VydmljZSBuYXZpZ2F0b3IgZ3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShpbnQgZ3JvdXBUeXBlLCBBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCVRZUEUgPSBncm91cFR5cGU7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzcGVjaWZpYyB0eXBlIG9mIHdlYiBzZXJ2aWNlIG5hdmlnYXRvciBncm91cGluZwotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKGludCBncm91cFR5cGUsIEVPYmplY3Qgd3NkbFNlcnZpY2UsIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJVFlQRSA9IGdyb3VwVHlwZTsKLQkJdGhpcy53c2RsU2VydmljZSA9IHdzZGxTZXJ2aWNlOwotCQlhZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3BlY2lmaWMgdHlwZSBvZiB3ZWIgc2VydmljZSBuYXZpZ2F0b3IgZ3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShpbnQgZ3JvdXBUeXBlLCBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYsIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJVFlQRSA9IGdyb3VwVHlwZTsKLQkJdGhpcy5zZXJ2aWNlUmVmID0gc2VydmljZVJlZjsKLQkJYWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgVFlQRS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEdyb3VwVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IFNFUlZJQ0VTOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50cygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IENMSUVOVFM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVycygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IEhBTkRMRVJTOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldFdzZGxTZXJ2aWNlKCkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoaXNTZXJ2aWNlcygpKQotCQkJcmV0dXJuIFNFUlZJQ0VTX1VJOwotCQllbHNlIGlmIChpc0NsaWVudHMoKSkKLQkJCXJldHVybiBDTElFTlRTX1VJOwotCQllbHNlIGlmIChpc0hhbmRsZXJzKCkpCi0JCQlyZXR1cm4gSEFORExFUlNfVUk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciN0ZXN0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdyb3VwID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHRhcmdldDsKLQkJCWlmIChncm91cC5pc0NsaWVudHMoKSAmJiB2YWx1ZS5lcXVhbHMoQ0xJRU5UU19VSSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlIGlmIChncm91cC5pc1NlcnZpY2VzKCkgJiYgdmFsdWUuZXF1YWxzKFNFUlZJQ0VTX1VJKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYgKGdyb3VwLmlzSGFuZGxlcnMoKSAmJiB2YWx1ZS5lcXVhbHMoSEFORExFUlNfVUkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VSZWYuCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWYgZ2V0U2VydmljZVJlZigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWY7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0KLQkJc3dpdGNoIChnZXRHcm91cFR5cGUoKSkgewotCi0JCQljYXNlIENMSUVOVFMgOgotCQkJCXJldHVybiBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpLnRvQXJyYXkoKTsKLQkJCWNhc2UgSEFORExFUlMgOiB7Ci0vLwkJCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBoYW5kbGUgd2ViIHNlcnZpY2UgaGFuZGxlcnMgY2FzZQotCQkJCWlmIChnZXRXc2RsU2VydmljZSgpICE9IG51bGwpIHsKLQkJCQkJUG9ydENvbXBvbmVudCBwb3J0ID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UG9ydENvbXBvbmVudChnZXRXc2RsU2VydmljZSgpKTsKLQkJCQkJaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0LmdldEhhbmRsZXJzKCkgIT0gbnVsbCAmJiAhcG9ydC5nZXRIYW5kbGVycygpLmlzRW1wdHkoKSkgewotCQkJCQkJCi0JCQkJCQkvKgotCQkJCQkJICogVGhlIHJlbmRlcmluZyBpbiB0aGUgdmlld2VyIGlzIHRoZSBsaXN0IG9mIGhhbmRsZXJzIGZyb20gYW4gb2JqZWN0Ci0JCQkJCQkgKiB0aGF0IGlzIG5ldmVyIHRvdWNoZWQgYnkgdGhlIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLCBhbmQKLQkJCQkJCSAqIHRodXMgbmV2ZXIgYWRhcHRlZCBieSB0aGUgQWRhcHRlckZhY3RvcnksIGFuZCB0aHVzIG5ldmVyIGhhcyBhbgotCQkJCQkJICogSXRlbVByb3ZpZGVyIGZvciB0aGUgdmlld2VyIGF0dGFjaGVkIHRvIGl0LiBUaGUgZm9sbG93aW5nIGxpbmUgCi0JCQkJCQkgKiBlbnN1cmVzIHRoYXQgaXQgbG9va3MgbGlrZSB0aGlzIGVsZW1lbnQgd2FzICJyZW5kZXJlZCIgYnkgdGhlIAotCQkJCQkJICogY29udGVudCBwcm92aWRlciwgc28gdGhhdCB1cGRhdGVzIHRvIHRoZSBsaXN0IG9mIGhhbmRsZXJzIHdpbGwKLQkJCQkJCSAqIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHZpZXdlci4gIAotCQkJCQkJICovCi0JCQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChwb3J0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyk7Ci0JCQkJCQkKLQkJCQkJCXJldHVybiBwb3J0LmdldEhhbmRsZXJzKCkudG9BcnJheSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGhhbmRsZSBzZXJ2aWNlIHJlZiBjYXNlCi0JCQkJZWxzZSBpZiAoZ2V0U2VydmljZVJlZigpICE9IG51bGwpCi0JCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmKCkuZ2V0SGFuZGxlcnMoKS50b0FycmF5KCk7Ci0KLQkJCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JCQl9Ci0JCQljYXNlIFNFUlZJQ0VTIDogewotCQkJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc3VsdC5hZGRBbGwoV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhY2Q5MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndlYnNlcnZpY2V1aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX0hBTkRMRVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfRElTUExBWV9OQU1FX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfREVTQ1JJUFRJT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9OQU1FX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfQ0xBU1NfTkFNRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0lOSVRfUEFSQU1fV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0lOSVRfUEFSQU1fV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9JTklUX1BBUkFNX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfU09BUF9IRUFERVJfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfTkFNRVNQQUNFX1VSTF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0xPQ0FMX1BBUlRfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUG9ydENvbXBvbmVudFJlZkxhYmVsUHJvdmlkZXJfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQb3J0Q29tcG9uZW50UmVmTGFiZWxQcm92aWRlcl9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGVfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlNlcnZpY2VHcm91cENvbnRlbnRFeHRlbnNpb25fVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJfSW52YWxpZF9Gb3JfRXhpc2l0bmdfRUFSX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uV2l6YXJkX1VJXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvbldpemFyZF9VSV83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25QYWdlX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvblBhZ2VfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uUGFnZV9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfQ0xBU1NFU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUE9SVF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NfTkFWX0pPQjU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9QT1JUX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWSUNFX0lNUExfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfVUlfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlVmlld2VyU3luY2hyb25pemF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlVmlld2VyU3luY2hyb25pemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2VmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLklKMkVFTmF2aWdhdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkR5bmFtaWNBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbiBpbXBsZW1lbnRzIFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXJ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFX1RIRVJFX1dFQlNFUlZJQ0VTID0gImFyZVRoZXJlV2ViU2VydmljZXMiOwotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgd2ViU2VydmljZXNNYW5hZ2VyID0gbnVsbDsgCi0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRkFDRVQgPSAicHJvamVjdEZhY2V0IjsgLy8kTk9OLU5MUy0xJCAgICAgCi0gICAgCi0gICAgLyogVGhlIGZhY2V0cyBhcmUgZHVwbGljYXRlZCBoZXJlIHRvIGF2b2lkIGxvYWRpbmcgcGx1Z2lucyBqdXN0IGZvciBjb25zdGFudHMgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0ZBQ0VUID0gImpzdC5lYXIiOyAvLyROT04tTkxTLTEkIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRkFDRVQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQUNFVCA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJCAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0ZBQ0VUID0gImpzdC5lamIiOyAvLyROT04tTkxTLTEkIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0ZBQ0VUID0gImpzdC51dGlsaXR5IjsgLy8kTk9OLU5MUy0xJCAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0ZBQ0VUID0gImpzdC5jb25uZWN0b3IiOyAvLyROT04tTkxTLTEkIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCX0ZBQ0VUID0gIndzdC53ZWIiOyAvLyROT04tTkxTLTEkIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIgZmFjZXRQcm9wZXJ0eVRlc3RlciA9IG5ldyBGYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyKCk7Ci0KLSAgICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSm9iIGluZGV4Sm9iID0gbmV3IFdlYlNlcnZpY2VJbmRleEpvYigpOwotCXByaXZhdGUgSm9iIHVwZGF0ZUpvYiA9IG5ldyBVcGRhdGVXZWJTZXJ2aWNlc05vZGVVSUpvYigpOyAKLQlwcml2YXRlIEpvYiByZW1vdmVKb2IgPSBuZXcgUmVtb3ZlV2ViU2VydmljZXNOb2RlVUlKb2IoKTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gbmF2aWdhdG9yR3JvdXBBZGRlZCA9IGZhbHNlOwotCWJvb2xlYW4gaW5kZXhKb2JTY2hlZHVsZWQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbihXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBwcm92aWRlcjsgCi0JfQotCQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0KLQkJdHJ5IHsgCi0JCQkKLQkJCWdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCi0JCQkvLyBjcmVhdGUgdGhlIGRlZmF1bHQgc3luY2hyb25pemVyIGZvciBhbnkgd2ViIHNlcnZpY2UgZWRpdG9yIHRvIHVzZSB3aXRoIHZpZXcgZHVlCi0JCQkvLyB0byB0aGUgdXNhZ2Ugb2Ygc2VwZXJhdGUgZWRpdCBtb2RlbHMuCi0JCQlXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5jcmVhdGVJbnN0YW5jZSgKLQkJCQkJCQluZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KElKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLlZJRVdFUl9JRCksIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0gZmluYWxseSB7IAotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9IAotCX0KLQkgCi0JcHVibGljIHZvaWQgc3RvcCgpIHsgCi0JCWlmKGluaXRpYWxpemVkKSB7Ci0JCQlnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCS8vIGRpc3Bvc2UgY3VycmVudCBpbnN0YW5jZSBvZiB3ZWIgc2VydmljZSBlZGl0b3IvZXhwbG9yZXIgc3luY2hyb25pemVyCi0JCQlXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5kaXNwb3NlSW5zdGFuY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB3ZWJTZXJ2aWNlTWFuYWdlckNoYW5nZWQoV2ViU2VydmljZUV2ZW50IGFuRXZlbnQpIHsKLQkJCi0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBXZWJTZXJ2aWNlRXZlbnQuUkVGUkVTSDoKLQotCQkJCWlmKCFoYXNOYXZpZ2F0b3JHcm91cEJlZW5BZGRlZCgpKSB7Ci0JCQkJCWlmKCFoYXNJbmRleEpvYkJlZW5TY2hlZHVsZWQoKSl7Ci0JCQkJCQlpbmRleEpvYi5zY2hlZHVsZSgpOwotCQkJCQl9Ci0JCQkJCWlmKCFoYXNOYXZpZ2F0b3JHcm91cEJlZW5BZGRlZCgpKQotCQkJCQkJYWRkV2ViU2VydmljZU5vZGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1cGRhdGVKb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdlYlNlcnZpY2VFdmVudC5SRU1PVkU6Ci0JCQkJaWYoaGFzTmF2aWdhdG9yR3JvdXBCZWVuQWRkZWQoKSkKLQkJCQkJcmVtb3ZlSm9iLnNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci0KLQotCXZvaWQgYWRkV2ViU2VydmljZU5vZGUoKSB7Ci0JCW5ldyBBZGRXZWJTZXJ2aWNlc05vZGVVSUpvYigpLnNjaGVkdWxlKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdGFydEluZGV4Sm9iKCkgewotCQlpbmRleEpvYi5zY2hlZHVsZSgpOwotCX0gCi0JCi0JLyoqCi0JICogRW1wbG95IGEgVGVzdC1BbmQtU2V0IChUU1QpIHByaW1pdGl2ZSB0byBlbnN1cmUgdGhlIEpvYiBpcyBvbmx5IHNjaGVkdWxlZCBvbmNlIHBlciBsb2FkLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdGhlIGluZGV4IGpvYiBoYXMgYmVlbiBzY2hlZHVsZWQuIFRoZSB2YWx1ZSBvZiBpbmRleEpvYlNjaGVkdWxlIHdpbGwKLQkgKiAgICAgICAgIF9hbHdheXNfIGJlIHRydWUgYWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIHNvIGlmIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgam9iIG11c3QgYmUKLQkgKiAgICAgICAgIHNjaGVkdWxlZCBieSB0aGUgY2FsbGVyLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gaGFzSW5kZXhKb2JCZWVuU2NoZWR1bGVkKCkgewotCQlpZiAoIWluZGV4Sm9iU2NoZWR1bGVkKSB7Ci0JCQlpbmRleEpvYlNjaGVkdWxlZCA9IHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3MgdGhpcyBib29sZWFuIGZsYWcsIHNvIHdlIHN5bmNocm9uaXplIGl0IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcwotCSAqIGNvbnNpc3RlbnQgYWNyb3NzIGRpZmZlcmVudCB0aHJlYWRzLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlCi0JICogICAgICAgICB0cmVlLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmF2aWdhdG9yR3JvdXBCZWVuQWRkZWQoKSB7Ci0JCXJldHVybiBuYXZpZ2F0b3JHcm91cEFkZGVkOwotCX0gCi0JCi0JLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBzZXROYXZpZ2F0b3JHcm91cEFkZGVkKGJvb2xlYW4gaGFzQmVlbkFkZGVkKSB7Ci0JCW5hdmlnYXRvckdyb3VwQWRkZWQgPSBoYXNCZWVuQWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkgewotCQlpZiAod2ViU2VydmljZXNNYW5hZ2VyID09IG51bGwpCi0JCQl3ZWJTZXJ2aWNlc01hbmFnZXIgPSBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGluZGV4V2ViU2VydmljZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdHJ5IHsKLQkJCQloYXNDaGlsZHJlbiB8PSBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRXb3Jrc3BhY2UxM1NlcnZpY2VSZWZzKCkuc2l6ZSgpID4gMDsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeyAKLQkJCQlXZWJTZXJ2aWNlVUlQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGhhc0NoaWxkcmVuOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaGFzQ2hpbGRyZW4gfD0gZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcygpLnNpemUoKSA+IDA7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsgCi0JCQkJV2ViU2VydmljZVVJUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBoYXNDaGlsZHJlbjsKLQkJfQotCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWhhc0NoaWxkcmVuIHw9IGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmdldEludGVybmFsV1NETFNlcnZpY2VzKCkuc2l6ZSgpID4gMDsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeyAKLQkJCQlXZWJTZXJ2aWNlVUlQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGhhc0NoaWxkcmVuOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaGFzQ2hpbGRyZW4gfD0gZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0RXh0ZXJuYWxXU0RMU2VydmljZXMoKS5zaXplKCkgPiAwOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7IAotCQkJCVdlYlNlcnZpY2VVSVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gaGFzQ2hpbGRyZW47Ci0JCX0KLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCXJldHVybiBoYXNDaGlsZHJlbjsKLQl9Ci0JCi0JLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiBoYXNGYWNldChPYmplY3QgZWxlbWVudCwgU3RyaW5nIGZhY2V0KSB7Ci0JCXJldHVybiBmYWNldFByb3BlcnR5VGVzdGVyLnRlc3QoZWxlbWVudCwgUFJPSkVDVF9GQUNFVCwgbmV3IE9iamVjdFtdIHt9LCBmYWNldCk7Ci0JfQotCQotCS8qIHBhY2thZ2UgKi8gYm9vbGVhbiB3ZWJTZXJ2aWNlUHJvamVjdHNFeGlzdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsgCQotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkKLQkJbW9uaXRvci5iZWdpblRhc2soIlNlYXJjaGluZyBmb3Igd2ViIHNlcnZpY2UgY2FwYWJsZSBwcm9qZWN0cy4uLiIsIHByb2plY3RzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCSBpZihpc0ludGVyZXN0aW5nKHByb2plY3RzW2ldKSl7Ci0JCQkJIHJldCA9IHRydWU7Ci0JCQkJIGJyZWFrOwotCQkJIH0JIAotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBcmVUaGVyZVdlYlNlcnZpY2VzKGJvb2xlYW4gaXNUaGVyZVdlYlNlcnZpY2VzKSB7Ci0JCS8vIHNldCB0aGUgdmFsdWUgb2YgV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5BUkVfVEhFUkVfV0VCU0VSVklDRVMgc28gdGhhdCB3ZSBkbyBub3QgaW5kZXggaW4gZnV0dXJlCi0JCVdlYlNlcnZpY2VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShBUkVfVEhFUkVfV0VCU0VSVklDRVMsIEJvb2xlYW4udG9TdHJpbmcoaXNUaGVyZVdlYlNlcnZpY2VzKSk7Ci0JCVdlYlNlcnZpY2VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVUaGVyZVdlYlNlcnZpY2VzKCkgewotCQlpZiAoUHJvZHVjdE1hbmFnZXIuc2hvdWxkVXNlVmlld2VyU3luY0ZvcldlYnNlcnZpY2VzKCkpIHsKLQkJCVN0cmluZyB2YWwgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uQVJFX1RIRVJFX1dFQlNFUlZJQ0VTKTsKLQkJCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWwpOwotCQl9IGVsc2UgcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RoZXJlV2ViU2VydmljZXNQcmVmZXJlbmNlU2V0KCkgewotCQlyZXR1cm4gV2ViU2VydmljZVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uQVJFX1RIRVJFX1dFQlNFUlZJQ0VTKTsKLQl9Ci0KLQotCS8qIHBhY2thZ2UgKi8gcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW50ZXJlc3RpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaGFzRmFjZXQocHJvamVjdCwgV0VCX0ZBQ0VUKSB8fCAKLQkJCWhhc0ZhY2V0KHByb2plY3QsIEVKQl9GQUNFVCkgfHwgCi0JCQloYXNGYWNldChwcm9qZWN0LCBBUFBDTElFTlRfRkFDRVQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlSW5kZXhKb2IgZXh0ZW5kcyBKb2IgewotCQotCQlwdWJsaWMgV2ViU2VydmljZUluZGV4Sm9iKCkgewotCQkJc3VwZXIoV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLldTX05BVl9KT0IwKTsKLQkJCS8vIFsyMDQ4MzNdCi0JCQkvL3NldFJ1bGUobmV3IE5vbkNvbmZsaWN0aW5nUnVsZSgpKTsKLQkJCXNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuV1NfTkFWX0pPQjEsIDUpOwotCQkJCi0JCQlib29sZWFuIGlzVGhlcmVXZWJTZXJ2aWNlcyA9IGZhbHNlOwotCQkJaWYgKHdlYlNlcnZpY2VQcm9qZWN0c0V4aXN0KG1vbml0b3IpKSB7Ci0JCQkJaXNUaGVyZVdlYlNlcnZpY2VzID0gIGluZGV4V2ViU2VydmljZXMobW9uaXRvcik7Ci0JCQkJaWYoIGlzVGhlcmVXZWJTZXJ2aWNlcyApewotCQkJCQlzZXRBcmVUaGVyZVdlYlNlcnZpY2VzKGlzVGhlcmVXZWJTZXJ2aWNlcyk7CQkKLQkJCQl9Ci0JCQl9ZWxzZXsKLQkJCQlzZXRBcmVUaGVyZVdlYlNlcnZpY2VzKGZhbHNlKTsKLQkJCX0KLQkJCWlmKCFoYXNOYXZpZ2F0b3JHcm91cEJlZW5BZGRlZCgpKXsKLQkJCQlpZihpc1RoZXJlV2ViU2VydmljZXMpCi0JCQkJCWFkZFdlYlNlcnZpY2VOb2RlKCk7Ci0JCQl9Ci0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBZGRXZWJTZXJ2aWNlc05vZGVVSUpvYiBleHRlbmRzIFVJSm9iIHsKLQotCi0JCXB1YmxpYyBBZGRXZWJTZXJ2aWNlc05vZGVVSUpvYigpIHsKLQkJCXN1cGVyKFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XU19OQVZfSk9CMik7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQlUcmVlVmlld2VyIHZpZXdlciA9IGNvbnRlbnRQcm92aWRlci5nZXRWaWV3ZXIoKTsKLQkJCWlmKCF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCXZpZXdlci5hZGQodmlld2VyLmdldElucHV0KCksIGNvbnRlbnRQcm92aWRlci5nZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCX0KLQkJCXNldE5hdmlnYXRvckdyb3VwQWRkZWQodHJ1ZSk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSAKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVXBkYXRlV2ViU2VydmljZXNOb2RlVUlKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0gCi0JCXB1YmxpYyBVcGRhdGVXZWJTZXJ2aWNlc05vZGVVSUpvYiAoKSB7Ci0JCQlzdXBlcihXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuV1NfTkFWX0pPQjMpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCVRyZWVWaWV3ZXIgdmlld2VyID0gY29udGVudFByb3ZpZGVyLmdldFZpZXdlcigpOwotCi0JCQlpZighdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZihoYXNOYXZpZ2F0b3JHcm91cEJlZW5BZGRlZCgpKQotCQkJCQljb250ZW50UHJvdmlkZXIuZ2V0Vmlld2VyKCkucmVmcmVzaChjb250ZW50UHJvdmlkZXIuZ2V0TmF2aWdhdG9yR3JvdXAoKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5hZGQodmlld2VyLmdldElucHV0KCksIGNvbnRlbnRQcm92aWRlci5nZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCQkJc2V0TmF2aWdhdG9yR3JvdXBBZGRlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSAKLQl9Ci0JIAotCXB1YmxpYyBjbGFzcyBSZW1vdmVXZWJTZXJ2aWNlc05vZGVVSUpvYiBleHRlbmRzIFVJSm9iIHsgCi0KLQkJcHVibGljIFJlbW92ZVdlYlNlcnZpY2VzTm9kZVVJSm9iKCkgewotCQkJc3VwZXIoV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLldTX05BVl9KT0I0KTsKLQkJCS8vIFsyMDQ4MzNdCi0JCQlzZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsgCi0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XU19OQVZfSk9CNSwgNCk7Ci0KLQkJCVRyZWVWaWV3ZXIgdmlld2VyID0gY29udGVudFByb3ZpZGVyLmdldFZpZXdlcigpOwotCi0JCQlpZighdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZihoYXNOYXZpZ2F0b3JHcm91cEJlZW5BZGRlZCgpKXsKLQkJCQkJaWYgKGluZGV4V2ViU2VydmljZXMobW9uaXRvcikpIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKGNvbnRlbnRQcm92aWRlci5nZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCQkJCXNldEFyZVRoZXJlV2ViU2VydmljZXModHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2aWV3ZXIucmVtb3ZlKGNvbnRlbnRQcm92aWRlci5nZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCQkJCXNldE5hdmlnYXRvckdyb3VwQWRkZWQoZmFsc2UpOwotCQkJCQkJc2V0QXJlVGhlcmVXZWJTZXJ2aWNlcyhmYWxzZSk7Ci0JCQkJCQlpZihjb250ZW50UHJvdmlkZXIucHJvamVjdExpc3RlbmVyICE9IG51bGwgJiYgIWNvbnRlbnRQcm92aWRlci5wcm9qZWN0TGlzdGVuZXIuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmICFjb250ZW50UHJvdmlkZXIucHJvamVjdExpc3RlbmVyLmlzTGlzdGVuaW5nKCkpCi0JCQkJCQkJY29udGVudFByb3ZpZGVyLnByb2plY3RMaXN0ZW5lci5zdGFydExpc3RlbmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiNjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTksIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5JSjJFRU5hdmlnYXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkR5bmFtaWNBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOT19DSElMRFJFTiA9IG5ldyBPYmplY3RbMF07IAotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgd2ViU2VydmljZXNNYW5hZ2VyID0gbnVsbDsgCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgd2ViU2VydmljZU5hdmlnYXRvckdyb3VwOwotCXByaXZhdGUgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBTRVJWSUNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIENMSUVOVFMgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBIQU5ETEVSUyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24gdmlld2VyU3luY2hyb25pemF0aW9uOwotCU5ld1Byb2plY3RzTGlzdGVuZXIgcHJvamVjdExpc3RlbmVyOwotCQotCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcihjcmVhdGVBZGFwdGVyRmFjdG9yeSgpKTsKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVZpZXdlclN5bmNGb3JXZWJzZXJ2aWNlcygpKSB7Ci0JCQl2aWV3ZXJTeW5jaHJvbml6YXRpb24gPSBuZXcgV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbih0aGlzKTsKLQkJCXByb2plY3RMaXN0ZW5lciA9IG5ldyBOZXdQcm9qZWN0c0xpc3RlbmVyKHZpZXdlclN5bmNocm9uaXphdGlvbik7Ci0JCX0KLQotCX0gCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2plY3RMaXN0ZW5lciAhPSBudWxsKQotCQkJcHJvamVjdExpc3RlbmVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmUgYW5kIHJldHVybiBhIGNvbXBvc2l0ZSBhZGFwdGVyIGZhY3RvcnkgZm9yIG91ciBjb250ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KElKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLlZJRVdFUl9JRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCi0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpIHsKLQkJCS8vIHJldHVybiBuZXcgT2JqZWN0W117IGdldFdlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXAocGFyZW50RWxlbWVudCkgfTsKLQkJCWlmKFdlYlNlcnZpY2VWaWV3ZXJTeW5jaHJvbml6YXRpb24uaXNUaGVyZVdlYlNlcnZpY2VzUHJlZmVyZW5jZVNldCgpKXsKLQkJCQlpZihXZWJTZXJ2aWNlVmlld2VyU3luY2hyb25pemF0aW9uLmFyZVRoZXJlV2ViU2VydmljZXMoKSl7Ci0JCQkJCWlmICh2aWV3ZXJTeW5jaHJvbml6YXRpb24gIT0gbnVsbCkKLQkJCQkJCXZpZXdlclN5bmNocm9uaXphdGlvbi5zZXROYXZpZ2F0b3JHcm91cEFkZGVkKHRydWUpOwotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtde2dldE5hdmlnYXRvckdyb3VwKCl9OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBOT19DSElMRFJFTjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGZpcnN0IHRpbWUgb24gdGhpcyB3b3Jrc3BhY2UsIGxldCB0aGUgam9iIHNldCB0aGUgV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5BUkVfVEhFUkVfV0VCU0VSVklDRVMKLQkJCQlpZiAodmlld2VyU3luY2hyb25pemF0aW9uICE9IG51bGwgJiYgIXZpZXdlclN5bmNocm9uaXphdGlvbi5oYXNJbmRleEpvYkJlZW5TY2hlZHVsZWQoKSkgewotCQkJCQl2aWV3ZXJTeW5jaHJvbml6YXRpb24uc3RhcnRJbmRleEpvYigpOwotCQkJCX0KLQkJCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCl7Ci0JCQlpZiAodmlld2VyU3luY2hyb25pemF0aW9uICE9IG51bGwgJiYgIXZpZXdlclN5bmNocm9uaXphdGlvbi5oYXNJbmRleEpvYkJlZW5TY2hlZHVsZWQoKSkgewotCQkJCXZpZXdlclN5bmNocm9uaXphdGlvbi5zdGFydEluZGV4Sm9iKCk7Ci0JCQl9IAotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXtnZXRTZXJ2aWNlc0dyb3VwKCksIGdldENsaWVudHNHcm91cCgpfTsKLQotCQl9ZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHsKLQkJCWlmICh2aWV3ZXJTeW5jaHJvbml6YXRpb24gIT0gbnVsbCAmJiAhdmlld2VyU3luY2hyb25pemF0aW9uLmhhc0luZGV4Sm9iQmVlblNjaGVkdWxlZCgpKSB7Ci0JCQkJdmlld2VyU3luY2hyb25pemF0aW9uLnN0YXJ0SW5kZXhKb2IoKTsKLQkJCX0gCi0JCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIHdzR3JvdXBUeXBlID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHBhcmVudEVsZW1lbnQ7Ci0JCQlyZXR1cm4gd3NHcm91cFR5cGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCi0JCX0gZWxzZSBpZiAoV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKS5pc1NlcnZpY2UocGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gZ2V0U2VydmljZUxldmVsTm9kZXMocGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotCi0JCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXtnZXRIYW5kbGVyc0dyb3VwKHBhcmVudEVsZW1lbnQpfTsKLQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSGFuZGxlciB8fCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyIHx8IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCkuaXNXU0RMUmVzb3VyY2UocGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0KLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlcnZpY2VMZXZlbE5vZGVzKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgc2VydmljZSBjbGFzc2VzCi0JCWlmIChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5pc1NlcnZpY2VJbnRlcm5hbCgoRU9iamVjdCkgcGFyZW50RWxlbWVudCkgJiYgZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0U2VydmljZUltcGxCZWFuKChFT2JqZWN0KSBwYXJlbnRFbGVtZW50KSAhPSBudWxsKQotCQkJcmVzdWx0LmFkZChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRTZXJ2aWNlSW1wbEJlYW4oKEVPYmplY3QpIHBhcmVudEVsZW1lbnQpKTsKLQkJLy8gQWRkIGhhbmRsZXJzCi0JCWlmIChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5pc1NlcnZpY2VJbnRlcm5hbCgoRU9iamVjdCkgcGFyZW50RWxlbWVudCkpCi0JCQlyZXN1bHQuYWRkKGdldEhhbmRsZXJzR3JvdXAocGFyZW50RWxlbWVudCkpOwotCQkvLyBhZGQgd3NkbCBmaWxlCi0JCVJlc291cmNlIHdzZGwgPSBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRXU0RMUmVzb3VyY2UoKEVPYmplY3QpIHBhcmVudEVsZW1lbnQpOwotCQlpZiAod3NkbCAhPSBudWxsKQotCQkJcmVzdWx0LmFkZCh3c2RsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLS8vCXByaXZhdGUgTGlzdCBnZXRIYW5kbGVyQ2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLS8vCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGhhbmRsZXJzR3JvdXAgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgcGFyZW50RWxlbWVudDsKLS8vCQkvLyBoYW5kbGUgd2ViIHNlcnZpY2UgaGFuZGxlcnMgY2FzZQotLy8JCWlmIChoYW5kbGVyc0dyb3VwLmdldFdzZGxTZXJ2aWNlKCkgIT0gbnVsbCkgewotLy8JCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRQb3J0Q29tcG9uZW50KGhhbmRsZXJzR3JvdXAuZ2V0V3NkbFNlcnZpY2UoKSk7Ci0vLwkJCWlmIChwb3J0ICE9IG51bGwgJiYgcG9ydC5nZXRIYW5kbGVycygpICE9IG51bGwgJiYgIXBvcnQuZ2V0SGFuZGxlcnMoKS5pc0VtcHR5KCkpCi0vLwkJCQlyZXN1bHQuYWRkQWxsKHBvcnQuZ2V0SGFuZGxlcnMoKSk7Ci0vLwkJfQotLy8JCS8vIGhhbmRsZSBzZXJ2aWNlIHJlZiBjYXNlCi0vLwkJZWxzZSBpZiAoaGFuZGxlcnNHcm91cC5nZXRTZXJ2aWNlUmVmKCkgIT0gbnVsbCkgewotLy8JCQlyZXN1bHQuYWRkQWxsKGhhbmRsZXJzR3JvdXAuZ2V0U2VydmljZVJlZigpLmdldEhhbmRsZXJzKCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApCi0JCQlyZXR1cm4gKChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApIGVsZW1lbnQpLmdldFJvb3QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gVE9ETyBoYW5kbGUgY2hhbmdlIGV2ZW50cwotCQlpZiAoYVZpZXdlciAhPSBudWxsICYmIGFWaWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKQotCQkJdmlld2VyID0gKFRyZWVWaWV3ZXIpIGFWaWV3ZXI7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZChhVmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCX0KLSAKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmF2aWdhdG9yR3JvdXAuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCBnZXROYXZpZ2F0b3JHcm91cCgpIHsKLQkJaWYgKG51bGwgPT0gd2ViU2VydmljZU5hdmlnYXRvckdyb3VwKSB7Ci0JCQl3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQl9Ci0JCXJldHVybiB3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VzTWFuYWdlciBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc01hbmFnZXIgPT0gbnVsbCkKLQkJCXdlYlNlcnZpY2VzTWFuYWdlciA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyOwotCX0KLQkKLQlwcml2YXRlIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgZ2V0U2VydmljZXNHcm91cCgpIHsKLQkJaWYgKFNFUlZJQ0VTID09IG51bGwpCi0JCQlTRVJWSUNFUyA9IG5ldyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuU0VSVklDRVMsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlyZXR1cm4gU0VSVklDRVM7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdldENsaWVudHNHcm91cCgpIHsKLQkJaWYgKENMSUVOVFMgPT0gbnVsbCkKLQkJCUNMSUVOVFMgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLkNMSUVOVFMsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlyZXR1cm4gQ0xJRU5UUzsKLQl9Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgZ2V0SGFuZGxlcnNHcm91cChPYmplY3Qga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGhhbmRsZXIgPSBudWxsOwotCQloYW5kbGVyID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIEhBTkRMRVJTLmdldChrZXkpOwotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKS5pc1NlcnZpY2Uoa2V5KSkKLQkJCQloYW5kbGVyID0gbmV3IFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZS5IQU5ETEVSUywgKEVPYmplY3QpIGtleSwgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQllbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotCQkJCWhhbmRsZXIgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLkhBTkRMRVJTLCAoU2VydmljZVJlZikga2V5LCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQlIQU5ETEVSUy5wdXQoa2V5LCBoYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgVHJlZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQotCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VSZWYuY2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCQkKLQkJCQkJV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBoYW5kbGVyc0dyb3VwID0gZ2V0SGFuZGxlcnNHcm91cChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0KLQkJCQkJaWYoaGFuZGxlcnNHcm91cCAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOiAKLQkJCQkJCQkJdmlld2VyLmFkZChoYW5kbGVyc0dyb3VwLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7CQkJCQkJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOiAKLQkJCQkJCQkJdmlld2VyLmFkZChoYW5kbGVyc0dyb3VwLCAoKENvbGxlY3Rpb24pbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLnRvQXJyYXkoKSk7CQkJCQkJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRTogCQkJCQkJCi0JCQkJCQkJCXZpZXdlci5yZW1vdmUobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCQkJdmlld2VyLnJlbW92ZSgoKENvbGxlY3Rpb24pbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLnRvQXJyYXkoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQkJCQotCQkJCQl9Ci0JCQkJCXJldHVybjsJCQkJCi0JCQkJZGVmYXVsdDoJCQkKLQkJCX0gCi0JCX0gZWxzZSBpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJCQotCQkJCQlQb3J0Q29tcG9uZW50IHBDb21wID0gKFBvcnRDb21wb25lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlFT2JqZWN0IHNlcnZpY2UgPSBnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRTZXJ2aWNlKHBDb21wKTsKLQkJCQkJaWYoc2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGhhbmRsZXJzR3JvdXAgPSBnZXRIYW5kbGVyc0dyb3VwKHNlcnZpY2UpOwkJCQkJCQotCQkJCQkJaWYoaGFuZGxlcnNHcm91cCAhPSBudWxsKSB7Ci0JCQkJCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6IAotCQkJCQkJCQkJdmlld2VyLmFkZChoYW5kbGVyc0dyb3VwLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7CQkJCQkJCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6IAotCQkJCQkJCQkJdmlld2VyLmFkZChoYW5kbGVyc0dyb3VwLCAoKENvbGxlY3Rpb24pbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLnRvQXJyYXkoKSk7CQkJCQkJCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOiAJCQkJCQkKLQkJCQkJCQkJCXZpZXdlci5yZW1vdmUobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJCQkJdmlld2VyLnJlbW92ZSgoKENvbGxlY3Rpb24pbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLnRvQXJyYXkoKSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCQotCQkJCQlyZXR1cm47CQkJCQotCQkJCWRlZmF1bHQ6CQkJCi0JCQl9Ci0JCX0gIAotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CSAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXBPcGVuTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXBPcGVuTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjMzQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwT3Blbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSjJFRVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQotCXByaXZhdGUgT3BlbkV4dGVybmFsV1NETEFjdGlvbiBvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uOwotCXByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOwotCQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXBPcGVuTGlzdGVuZXIoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgYUNvbmZpZykgeyAKLQkJb3BlbkV4dGVybmFsV1NETEFjdGlvbiA9IG5ldyBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uKFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5XZWJTZXJ2aWNlR3JvdXBDb250ZW50RXh0ZW5zaW9uX1VJXzEpOwotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGFDb250ZXh0KSB7Ci0JCWlmIChhQ29udGV4dCAhPSBudWxsICYmIGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk9PW51bGwpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlcnZpY2VIZWxwZXI9PW51bGwpCi0JCQkJcmV0dXJuOwotCQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkgewotCQkJCVdzZGRSZXNvdXJjZSByZXNvdXJjZSA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdzZGRSZXNvdXJjZSgoU2VydmljZUltcGwpc2VsZWN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCW9wZW5FeHRlcm5hbFdTRExBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCQlzdXBlci5zZXRDb250ZXh0KGFDb250ZXh0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlMaXN0IHdzZGRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd3NkZFNlbGVjdGlvbi5hZGQocmVzb3VyY2UpOwotCQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c2RkU2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJCVJlc291cmNlIHdzZGwgPSAoUmVzb3VyY2UpIHNlbGVjdGVkT2JqZWN0OwotCQkJCUlGaWxlIHdzZGxGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3c2RsKTsKLQkJCQlpZiAod3NkbEZpbGUgPT0gbnVsbCB8fCAhd3NkbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb3BlbkV4dGVybmFsV1NETEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQkJCXN1cGVyLnNldENvbnRleHQoYUNvbnRleHQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJfQotCQkJCi0JCQllbHNlIHsKLQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJCX0JCi0JCX0KLQkJc3VwZXIuc2V0Q29udGV4dChhQ29udGV4dCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkgewotCQkJU2VydmljZUltcGwgd3NkbCA9IChTZXJ2aWNlSW1wbCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJV3NkZFJlc291cmNlIHJlc291cmNlID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V3NkZFJlc291cmNlKHdzZGwpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlJRmlsZSB3c2RsRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod3NkbCk7Ci0JCQkJaWYgKHdzZGxGaWxlID09IG51bGwgfHwgIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCW9wZW5FeHRlcm5hbFdTRExBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gCi0JCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTGlzdCB3c2RkU2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3NkZFNlbGVjdGlvbi5hZGQocmVzb3VyY2UpOwotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGRTZWxlY3Rpb24pKTsKLQkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sIG9wZW5BY3Rpb24pOwotCQkJcmV0dXJuOwotCQkJCi0JCX0gZWxzZSBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkgewotCQkJV1NETFJlc291cmNlSW1wbCB3c2RsID0gKFdTRExSZXNvdXJjZUltcGwpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlGaWxlIHdzZGxGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3c2RsKTsKLQkJCWlmICh3c2RsRmlsZSA9PSBudWxsIHx8ICF3c2RsRmlsZS5leGlzdHMoKSkgewotCQkJCW9wZW5FeHRlcm5hbFdTRExBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sIG9wZW5FeHRlcm5hbFdTRExBY3Rpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCWlmKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpIAotCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChnZXRDb250ZXh0KCk9PW51bGwgfHwgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkgewotCQkJU2VydmljZUltcGwgd3NkbCA9IChTZXJ2aWNlSW1wbCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJSUZpbGUgd3NkbEZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHdzZGwpOwotCQkJaWYgKHdzZGxGaWxlID09IG51bGwgfHwgIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJb3BlbkV4dGVybmFsV1NETEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkgewotCQkJV1NETFJlc291cmNlSW1wbCB3c2RsID0gKFdTRExSZXNvdXJjZUltcGwpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlGaWxlIHdzZGxGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3c2RsKTsKLQkJCWlmICh3c2RsRmlsZSA9PSBudWxsIHx8ICF3c2RsRmlsZS5leGlzdHMoKSkgewotCQkJCW9wZW5FeHRlcm5hbFdTRExBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCW1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgb3BlbkV4dGVybmFsV1NETEFjdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCW1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgb3BlbkFjdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkOWNlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoY3JlYXRlQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbmZpZ3VyZSBhbmQgcmV0dXJuIGEgY29tcG9zaXRlIGFkYXB0ZXIgZmFjdG9yeSBmb3Igb3VyIGNvbnRlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoVklFV0VSX0lEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlYlNlcnZpY2VzRm9sZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNTZXJ2aWNlSW50ZXJuYWwoKEVPYmplY3QpIGVsZW1lbnQpKQotCQkJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNXU0RMUmVzb3VyY2UoZWxlbWVudCkpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJU3RyaW5nIHNwYWNlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKQotCQkJcmV0dXJuIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvblRleHQoKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgZWxlbWVudCk7Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5QT1JUX1VJXyArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIYW5kbGVyKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5IQU5ETEVSX1VJXyArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXU0RMUG9ydCkKLQkJCXJldHVybiBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuV1NETF9QT1JUX1VJXyArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW4pCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLlNFUlZJQ0VfQ0xBU1NFU19VSV87IAotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRUpCTGluaykKLQkJCXJldHVybiBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuU0VSVklDRV9JTVBMX1VJXyArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0TGluaykKLQkJCXJldHVybiBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuU0VSVklDRV9JTVBMX1VJXyArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKQotCQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZUxvY2FsUGFydChlbGVtZW50KTsKLQkJZWxzZSBpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShlbGVtZW50KSkgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2UpIGVsZW1lbnQpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCXJlc3VsdCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9ICgoUmVzb3VyY2UpIGVsZW1lbnQpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLldTRExfVUlfICsgc3BhY2UgKyByZXN1bHQ7IAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQlTdHJpbmcgYmVhbk5hbWUxNCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNKMkVFMTQoKFNlcnZpY2VSZWYpIGVsZW1lbnQpKSB7Ci0JCQkJaWYgKCgoU2VydmljZVJlZikgZWxlbWVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgU2Vzc2lvbikKLQkJCQkJYmVhbk5hbWUxNCA9ICgoU2Vzc2lvbikgKChTZXJ2aWNlUmVmKSBlbGVtZW50KS5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUlQcm9qZWN0IHJlZlByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKFNlcnZpY2VSZWYpIGVsZW1lbnQpOwotCQkJcmV0dXJuIChyZWZQcm9qICE9IG51bGwpID8gcmVmUHJvai5nZXROYW1lKCkgOiAiIiArICI6ICIgKyBiZWFuTmFtZTE0IC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgKChTZXJ2aWNlUmVmKSBlbGVtZW50KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGdldCB0ZXh0IGZvciB3ZWIgc2VydmljZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvblRleHQoV2ViU2VydmljZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCVJlc291cmNlIHJlcyA9IGRlc2NyaXB0aW9uLmVSZXNvdXJjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJU3RyaW5nIHByb2pTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzICE9IG51bGwpCi0JCQlwcm9qZWN0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChyZXMpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcHJvalN0cmluZyA9IHByb2plY3QuZ2V0TmFtZSgpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcHJvalN0cmluZyArIHN1cGVyLmdldFRleHQoZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBhZGQgYW55IGxpc3RlbmVycz8KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBoYW5kbGUgZGlzcG9zZQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBkbyBzb21ldGhpbmcgc21hcnQgaGVyZT8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBob3cgZG8gd2UgcmVtb3ZlIGxpc3RlbmVycz8KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODFiMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEwLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgSU5TVEFOQ0UgPSBudWxsOwotCXByb3RlY3RlZCBOb3RpZmllciB0YXJnZXQgPSBudWxsOwotCXByaXZhdGUgV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyIGNyZWF0ZUluc3RhbmNlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQlJTlNUQU5DRSA9IG5ldyBXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplcihhZGFwdGVyRmFjdG9yeSwgcHJvdmlkZXIpOwotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2VJbnN0YW5jZSgpIHsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNnZXRUYXJnZXQoKQotCSAqLwotCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNzZXRUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQl0YXJnZXQgPSBuZXdUYXJnZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uaXNUb3VjaCgpKSB7Ci0JCQkvL1RoZXJlIGlzIG5vdGhpbmcgdGhhdCBpcyByZXF1aXJlZCBzaW5jZSBub3RoaW5nIGNoYW5nZWQuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVPYmplY3Qgbm90aWZpZXIgPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzKSB7Ci0JCQkvL0RvIG5vdGhpbmcuCi0JCX0gZWxzZSBpZiAoaXNTZXJ2aWNlUmVmTW9kaWZpY2F0aW9uKG5vdGlmaWNhdGlvbikpIHsKLQkJCS8vIEhhbmRsZSBzZXJ2aWNlIHJlZiBlZGl0cwotCQkJY29udGVudFByb3ZpZGVyLmdldFZpZXdlcigpLnJlZnJlc2gobm90aWZpZXIpOwotCQl9IGVsc2UgaWYgKGlzU2VydmljZVJlZkFkZE9yUmVtb3ZlKG5vdGlmaWNhdGlvbikpIHsKLQkJCS8vSGFuZGxlIHNlcnZpY2UgcmVmIGFkZHMgb3IgcmVtb3ZlcwotCQkJY29udGVudFByb3ZpZGVyLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEhhbmRsZSB3ZWIgc2VydmljZSBjaGFuZ2VzIGJ5IGdldHRpbmcgdGhlIFdTREQgcGFyZW50Ci0JCQl3aGlsZSAoIShub3RpZmllciBpbnN0YW5jZW9mIFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgJiYgbm90aWZpZXIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyID0gbm90aWZpZXIuZUNvbnRhaW5lcigpOwotCQkJfQotCQkJLy8gUmVmcmVzaCB0aGUgYXNzb2NpYXRlZCB3c2RsIHNlcnZpY2UgZm9yIHRoZSBXU0REIHBhcmVudAotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uICYmIG5vdGlmaWVyICE9bnVsbCkgewotCQkJCUVPYmplY3Qgd3NkbCA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdTRExTZXJ2aWNlRm9yV2ViU2VydmljZSgoV2ViU2VydmljZURlc2NyaXB0aW9uKW5vdGlmaWVyKTsKLQkJCQljb250ZW50UHJvdmlkZXIuZ2V0Vmlld2VyKCkucmVmcmVzaCh3c2RsKTsKLQkJCX0KLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aWNlUmVmQWRkT3JSZW1vdmUoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL05vdGUgdGhpcyBjaGVjayBpcyBub3QgaGFuZGxpbmcgQUREX01BTlkgb3IgUkVNT1ZFX01BTlkuCi0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQl2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSBpbnN0YW5jZW9mIFNlcnZpY2VSZWYgfHwgdmFsdWUgaW5zdGFuY2VvZiBDb21wb25lbnRTY29wZWRSZWZzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VydmljZVJlZk1vZGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQlyZXR1cm4gbm90aWZpZXIgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmIHx8IG5vdGlmaWVyIGluc3RhbmNlb2YgSGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9Xc2RsUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMGE2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9Xc2RsUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUVNRkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RsUmVzb3VyY2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEoyRUVFTUZBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdzZGxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKGFkYXB0YWJsZU9iamVjdCkpCi0JCQlyZXMgPSAoUmVzb3VyY2UpIGFkYXB0YWJsZU9iamVjdDsKLQotCQlpZiAocmVzICE9IG51bGwgJiYgYWRhcHRlclR5cGUgPT0gSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LklGSUxFX0NMQVNTKQotCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKSAhPSBudWxsID8gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpIDogbnVsbDsKLQkJZWxzZSBpZiAocmVzICE9IG51bGwgJiYgYWRhcHRlclR5cGUgPT0gSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LklSRVNPVVJDRV9DTEFTUykKLQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4ZmNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8JVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCi0JLyoqCi0JICogUmVjb3JkIGFuIGVycm9yIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBhbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2Uvc3RhcnR1cC9XZWJzZXJ2aWNlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3N0YXJ0dXAvV2Vic2VydmljZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzk3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2Uvc3RhcnR1cC9XZWJzZXJ2aWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBJU3RhcnR1cCwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZyA9IGZhbHNlOwotCSAgICAKLSAgICAvKiBUaGUgY29uc3RhbnRzL2ZhY2V0cy9maWxlIGV4dG5zIGFyZSBkdXBsaWNhdGVkIGhlcmUgdG8gYXZvaWQgbG9hZGluZyBwbHVnaW5zICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRkFDRVQgPSAicHJvamVjdEZhY2V0IjsgLy8kTk9OLU5MUy0xJCAgICAgCi0gICAgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9GQUNFVCA9ICJqc3QuZWFyIjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0ZBQ0VUID0gImpzdC5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRkFDRVQgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJCAKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NJTF9FWFQgPSAid3NpbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TSE9SVE5BTUUgICAgPSAid2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRVNfRERfVVJJCQkJPSAJIndlYnNlcnZpY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIGZhY2V0UHJvcGVydHlUZXN0ZXIgPSBuZXcgRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3RlcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgV2Vic2VydmljZUxpc3RlbmVyIElOU1RBTkNFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgV2Vic2VydmljZUxpc3RlbmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIG1ldGhvZCBjb3BpZWQgZnJvbSBXZWJTZXJ2aWNlc1ZpZXdlclN5bmNocm9uaXphdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAobm90IGxvYWQgcGx1Z2lucykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSW50ZXJlc3RpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaGFzRmFjZXQocHJvamVjdCwgV0VCX0ZBQ0VUKSB8fCAKLQkJCWhhc0ZhY2V0KHByb2plY3QsIEVKQl9GQUNFVCkgfHwgCi0JCQloYXNGYWNldChwcm9qZWN0LCBBUFBDTElFTlRfRkFDRVQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmYWNldAotCSAqIEByZXR1cm4KLQkgKiBtZXRob2QgY29waWVkIGZyb20gV2ViU2VydmljZXNWaWV3ZXJTeW5jaHJvbml6YXRpb24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKG5vdCBsb2FkIHBsdWdpbnMpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNGYWNldChPYmplY3QgZWxlbWVudCwgU3RyaW5nIGZhY2V0KSB7Ci0JCXJldHVybiBmYWNldFByb3BlcnR5VGVzdGVyLnRlc3QoZWxlbWVudCwgUFJPSkVDVF9GQUNFVCwgbmV3IE9iamVjdFtdIHt9LCBmYWNldCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiBtZXRob2QgY29waWVkIGZyb20gV2ViU2VydmljZXNNYW5hZ2VyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChub3QgbG9hZCBwbHVnaW5zKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlSW50ZXJlc3RpbmcoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uLmVxdWFscyhXU0RMX0VYVCkgfHwgZXh0ZW5zaW9uLmVxdWFscyhXU0lMX0VYVCkgCi0JCQl8fCBhRmlsZS5nZXROYW1lKCkuZXF1YWxzKFdFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FKSAKLQkJCXx8IGFGaWxlLmdldE5hbWUoKS5lcXVhbHMoV0VCX1NFUlZJQ0VTX0REX1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuaW5nKCkgewotCQlyZXR1cm4gbGlzdGVuaW5nOwotCX0KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VWaWV3ZXJTeW5jRm9yV2Vic2VydmljZXMoKSkgewotCQkJSU5TVEFOQ0UgPSB0aGlzOwotCQkJc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfSBlbHNlIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5zZXRBcmVUaGVyZVdlYlNlcnZpY2VzKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9IAotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7IAotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDogCi0JCQkJaWYoaXNMaXN0ZW5pbmcoKSAmJiAgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkpewotCQkJCQlpZihpc0ludGVyZXN0aW5nKHJlc291cmNlLmdldFByb2plY3QoKSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQlpZihpc0xpc3RlbmluZygpICYmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCWlmKGlzTGlzdGVuaW5nKCkgJiYgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQkJCWlmKGlzRmlsZUludGVyZXN0aW5nKChJRmlsZSlyZXNvdXJjZSkpewotCQkJCQkJc3RvcExpc3RlbmluZygpOwotCQkJCQkJLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBwbHVnLWluIHRvIHN0YXJ0IG91ciBnb2FsIHdhcyB0byBkZWxheSBpdCB1bnRpbCBub3cKLQkJCQkJCWlmKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5pc1RoZXJlV2ViU2VydmljZXNQcmVmZXJlbmNlU2V0KCkpewotCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZVZpZXdlclN5bmNocm9uaXphdGlvbi5zZXRBcmVUaGVyZVdlYlNlcnZpY2VzKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCWxpc3RlbmluZyA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWxpc3RlbmluZyA9IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjIzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2UvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGQyODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd2Vic2VydmljZS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjZmI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzNjMWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgTWF5IDMwIDIwOjM0OjE2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMmIxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwxLjYuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGQ1ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSB3ZWJzZXJ2aWNlLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2IxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGQ4YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb25lbnRTY29wZWRSZWZzX3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwNzRmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNTM1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRmOGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRkMjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMwMGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX2luaXRQYXJhbXNfSW5pdFBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZTRiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX2luaXRQYXJhbXNfUGFyYW1WYWx1ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyZjJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfUU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjkzZTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwY2E5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1NPQVBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjlhYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwUm9sZXNfU09BUFJvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWIwYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjAyYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkNDRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaGFuZGxlcnNfSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2ljb25UeXBlX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwYjdmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9zZXJ2aWNlSW1wbEJlYW5fU2VydmljZUltcGxCZWFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfd3NkbFBvcnRfV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNmNmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmJjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfQmVhbkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfRUpCTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlNDcwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNmZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19TZXJ2bGV0TGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lRUpCTGlua19FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VTZXJ2bGV0TGlua19TZXJ2bGV0TGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzZmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ODBjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfaGFuZGxlcnNfSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzE4MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3BvcnRDb21wb25lbnRSZWZzX1BvcnRDb21wb25lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9RTmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwN2IzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1NPQVBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmViNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3NzI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDdhODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGQ3NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25faWNvblR5cGVfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fcG9ydENvbXBvbmVudHNfUG9ydENvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiYzM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0ZDc0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X2NvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmNjg4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc193ZWJTZXJ2aWNlRGVzY3JpcHRpb25zX1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyYWQ5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9CZWFuTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Db21wb25lbnRTY29wZWRSZWZzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvRUpCTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4NTRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY2NjBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnRSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTNjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZpY2VJbXBsQmVhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODc0NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZpY2VSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDM4MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmxldExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQxNTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUzNDVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFkNWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzQ2xpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmE1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkY2IzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zcnZjZV9lbGVtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi93c2RsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2NvbXBvbmVudHNjb3BlZHJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYjAyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MzM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvaGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MzBlMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBjNWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9zZXJ2aWNlcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NjZWRpdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJjNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWMzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvZm9ybV9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2hvbWVfbmF2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBjNjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdjNDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9wZXJ0aWVzIGZvciBjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aQotIwotIyBFbnRyaWVzIGFyZSBvZiB0aGUgZm9ybSBDT05TVEFOVD1zdHJpbmcKLSMKLSMgRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuYXRrLnVpL3BsdWdpbi5wcm9wZXJ0aWVzLCB3c2EuZXRvb2xzLndzLnByb3BlcnRpZXMsIGx1bmFyLCAyMDAzMDkyMmEgMjYKLSMgVmVyc2lvbiAxLjI2IDAzLzA5LzA5IDE2OjQxOjQ5Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi1wbHVnaW5OYW1lPVdlYiBTZXJ2aWNlIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwotCi0KLSMKLSMgRWRpdCBtb2RlbHMKLSMKLVdTRERfRURJVF9NT0RFTF9OQU1FPVdlYiBTZXJ2aWNlcyBFZGl0IE1vZGVsCi1FRElUT1JfRURJVE1PREVMU19XRUJfU0VSVklDRVM9V2ViIFNlcnZpY2VzIEVkaXRvciBFZGl0IE1vZGVsCi1XU0NERF9FRElUX01PREVMX05BTUU9V2ViIFNlcnZpY2VzIENsaWVudCBFZGl0IE1vZGVsCi1FRElUT1JfRURJVE1PREVMU19XRUJfU0VSVklDRVNfQ0xJRU5UPVdlYiBTZXJ2aWNlcyBDbGllbnQgRWRpdG9yIEVkaXQgTW9kZWwKLQotIwotI0NvbW1vbiBFZGl0b3IgTWVzc2FnZXMKLSMKLVRJVExFX1NBVkVfRVJST1I9U2F2ZSBFcnJvcgotTVNHX1NBVkVfRVJST1I9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHNhdmUgZWRpdG9yIGNvbnRlbnRzLgotCi0jCi0jIE1lc3NhZ2VzIGluIFdlYlNlcnZpY2VzRWRpdG9yCi0jCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNDbGllbnRFZGl0b3IKLSMKLQotCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBQb3J0Q29tcG9uZW50UGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gSGFuZGxlclBhZ2UKLSMKLQotCi0jCi0jIE1lc3NhZ2VzIGluIFdlYlNlcnZpY2VzQ2xpZW50UGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gU2VydmljZVJlZlBhZ2UKLSMKLQotCi0jCi0jIExhYmVscwotIwotTEFCRUxfVU5RVUFMSUZJRURfQ09NUE9ORU5UPTx1bnF1YWxpZmllZD4KLUxBQkVMX1NFUlZMRVRfTElOSz1TZXJ2bGV0IGxpbmsKLQotCi0KLSMKLSMgTGFiZWxzIGZvciB0YWJsZSBsYXlvdXQKLSMKLUxBQkVMX1RBQkxFX05BTUU9TmFtZQotTEFCRUxfVEFCTEVfVkFMVUU9VmFsdWUKLUxBQkVMX1RBQkxFX1NPQVBfUk9MRT1TT0FQIHJvbGUKLUxBQkVMX1RBQkxFX1BPUlRfTkFNRT1Qb3J0IG5hbWUKLUxBQkVMX1RBQkxFX1BPUlRfQ09NUE9ORU5UX0xJTks9UG9ydCBjb21wb25lbnQgbGluawotTEFCRUxfVEFCTEVfREVTQ1JJUFRJT049RGVzY3JpcHRpb24KLQotIwotIyBQYWdlIGFuZCBTZWN0aW9uIHRpdGxlcy9kZXNjcmlwdGlvbnMKLSMKLQotCi0KLQotIwotIyBEaWFsb2cgbGFiZWxzCi0jCi0KLQotIwotIyBUb29sdGlwcwotIwotCi0KLSMKLSMgTGFiZWxzIGZvciBwcm92aWRlcnMKLSMKLV9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZT1XZWIgc2VydmljZSBkZXNjcmlwdGlvbgotX1VJX1BvcnRDb21wb25lbnRfdHlwZT1Qb3J0IGNvbXBvbmVudAotX1VJX0hhbmRsZXJfdHlwZT1IYW5kbGVyCi1fVUlfUG9ydENvbXBvbmVudFJlZl90eXBlPVBvcnQgY29tcG9uZW50IHJlZmVyZW5jZQotX1VJX1NlcnZpY2VSZWZfdHlwZT1TZXJ2aWNlIHJlZmVyZW5jZQotX1VJX1dlYlNlcnZpY2VzQ2xpZW50X3R5cGU9V2ViIHNlcnZpY2VzIGNsaWVudAotX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZT1Db21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZQotX1VJX1dTRExQb3J0X3R5cGU9V1NETCBwb3J0Ci1fVUlfV2ViU2VydmljZXNfdHlwZT1XZWIgc2VydmljZXMKLV9VSV9TZXJ2bGV0TGlua190eXBlPVNlcnZsZXQgbGluawotX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlPVNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbgotX1VJX0VKQkxpbmtfdHlwZT1FSkIgbGluawotX1VJX0JlYW5MaW5rX3R5cGU9QmVhbiBsaW5rCi1fVUlfU09BUFJvbGVfdHlwZT1TT0FQIHJvbGUKLV9VSV9TT0FQSGVhZGVyX3R5cGU9U09BUCBoZWFkZXIKLV9VSV9Qb3J0TmFtZV90eXBlPVBvcnQgbmFtZQotX1VJX0luaXRQYXJhbV90eXBlPUluaXRpYWwgcGFyYW1ldGVyCi1fVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlPUpheHJwYyBNYXBwaW5nIEZpbGUKLV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmVfZGVzYz1UaGUgamF4cnBjIG1hcHBpbmcgZmlsZS4KLV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZT1TZXJ2aWNlIEludGVyZmFjZQotX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgaW50ZXJmYWNlLgotX1VJX1NlcnZpY2VSZWZfc2VydmljZVJlZk5hbWVfZmVhdHVyZT1OYW1lCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUuCi1fVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlPVdzZGwgRmlsZQotX1VJX1NlcnZpY2VSZWZfd3NkbEZpbGVfZmVhdHVyZV9kZXNjPVRoZSAud3NkbCBmaWxlLgotX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmU9U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotX1VJX1BvcnRDb21wb25lbnRSZWZfcG9ydENvbXBvbmVudExpbmtfZmVhdHVyZT1MaW5rCi1fVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlX2Rlc2M9VGhlIHBvcnQgY29tcG9uZW50IGxpbmsuCi1fVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZT1Tb2FwIFJvbGVzCi1fVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIHNvYXAgcm9sZXMuCi1fVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZT1Qb3J0IE5hbWVzCi1fVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIHBvcnQgbmFtZXMuCi1fVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlPUhhbmRsZXIgTmFtZQotX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIG5hbWUuCi1fVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZT1IYW5kbGVyIENsYXNzCi1fVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIGNsYXNzLgotX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZT1OYW1lCi1fVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIG5hbWUuCi1fVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmU9RGVzY3JpcHRpb24KLV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjPVRoZSBpbml0aWFsIHBhcmFtZXRlciBkZXNjcmlwdGlvbi4KLV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlPVZhbHVlCi1fVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZV9kZXNjPVRoZSBpbml0aWFsIHBhcmFtZXRlciB2YWx1ZS4KLV9VSV9KYXhSUENNaXNzaW5nTW9kZWw9TWFwcGluZyBmaWxlIG5hbWUgdW5rbm93bi4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjZDBiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotPCEtLSAgRHlhbm1pYyBDb250ZW50IFByb3ZpZGVyIGV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndzY29tbW9uLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJjbGllbnQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvckNsaWVudCI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnlGb3JXU0NsaWVudCI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImVqYi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yRUpCIj4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id2ViYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvcldFQiI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndzZGQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24iPgotICAgICAgPGVkaXRNb2RlbEV4dGVuc2lvbgotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC53ZWIiCi0gICAgICAgICAgICBpZD0id2Vic2VydmljZXMud2ViLmVkaXRNb2RlbGV4dGVuc2lvbiI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iV0VCLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJXRUItSU5GL3dlYnNlcnZpY2VzLnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgPC9lZGl0TW9kZWxFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24iPgotICAgICAgPGVkaXRNb2RlbEV4dGVuc2lvbgotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC5lamIiCi0gICAgICAgICAgICBpZD0id2Vic2VydmljZXMuZWpiLmVkaXRNb2RlbGV4dGVuc2lvbiI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICA8L2VkaXRNb2RlbEV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy5hcHBjbGllbnQuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgIDwvZWRpdE1vZGVsRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJXU0RMU2VydmljZUhlbHBlciIKLSAgICAgICAgIG5hbWU9IldTRExTZXJ2aWNlSGVscGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLldTRExTZXJ2aWNlSGVscGVyIj4KLSAgICAgIDx3c2RsSGVscGVyCi0gICAgICAgICAgICBoZWxwZXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV1NETFNlcnZpY2VIZWxwZXJJbXBsIj4KLSAgICAgIDwvd3NkbEhlbHBlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzLnhtbCIvPgotICAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlcy10ZW1wLnhtbCIvPgotICAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXNjbGllbnQueG1sIi8+IAotICAgPC9leHRlbnNpb24+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIj4KLSAgICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXMueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzLXRlbXAueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiLz4gCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNThmMjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLndlYnNlcnZpY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcm9wZXJ0eV9maWxlcy93ZWJzZXJ2aWNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhN2IwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FWElTVD1UaGUgaGFuZGxlciBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VNUFRZPVRoZSBoYW5kbGVyIG5hbWUgc3BhY2UgVVJMIGNhbm5vdCBiZSBlbXB0eS5TZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLjA9U2VydmljZVJlZgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FWElTVFM9VGhlIHBhcmFtZXRlciBuYW1lIGFscmVhZHkgZXhpc3QuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VYSVNUUz1UaGUgaGFuZGxlciBuYW1lIHNwYWNlIFVSTCBhbHJlYWR5IGV4aXNpdCwgcGxlYXNlIGNoYW5nZSBuYW1lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckNDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Y0M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckNDb21ibyBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8gY29tYm9fOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHREaXNwbGF5U3RyaW5nXzsKLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibywgU3RyaW5nIGRlZmF1bHREaXNwbGF5U3RyaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlkaXNwbGF5RmVhdHVyZV8gPSBkaXNwbGF5RmVhdHVyZTsKLQkJY29tYm9fID0gY29tYm87Ci0JCWNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGVmYXVsdERpc3BsYXlTdHJpbmdfID0gKGRlZmF1bHREaXNwbGF5U3RyaW5nICE9IG51bGwpID8gZGVmYXVsdERpc3BsYXlTdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibykgewotCQl0aGlzKGZlYXR1cmUsIGRpc3BsYXlGZWF0dXJlLCBjb21ibywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJDQ29tYm8oRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlLCBDQ29tYm8gY29tYm8pIHsKLQkJdGhpcyhlT2JqZWN0LCBmZWF0dXJlLCBkaXNwbGF5RmVhdHVyZSwgY29tYm8sIG51bGwpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZSwgQ0NvbWJvIGNvbWJvLCBTdHJpbmcgZGVmYXVsdERpc3BsYXlTdHJpbmcpIHsKLQkJdGhpcyhmZWF0dXJlLCBkaXNwbGF5RmVhdHVyZSwgY29tYm8sIGRlZmF1bHREaXNwbGF5U3RyaW5nKTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCU9iamVjdCBub3RpZmllciA9IG1zZy5nZXROb3RpZmllcigpOwotCQlpZiAobm90aWZpZXIgPT0gZU9iamVjdF8pIHsKLQkJCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BREQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKQotCQkJCXBvcHVsYXRlQ29tYm8oKTsKLQkJfSBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IGRpc3BsYXlGZWF0dXJlXykKLQkJCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChjb21ib18uaXNEaXNwb3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tYm9fLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjb21ib18uZ2V0VGV4dCgpOwotCQkJCWNvbWJvXy5yZW1vdmVBbGwoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQkJCQljb21ib18uYWRkKHRvRGlzcGxheVN0cmluZygoKEVPYmplY3QpIGl0Lm5leHQoKSkuZUdldChkaXNwbGF5RmVhdHVyZV8pKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbWJvXy5hZGQodG9EaXNwbGF5U3RyaW5nKCgoRU9iamVjdCkgb2JqZWN0KS5lR2V0KGRpc3BsYXlGZWF0dXJlXykpKTsKLQkJCQlpbnQgbmV3SW5kZXggPSBjb21ib18uaW5kZXhPZih0ZXh0KTsKLQkJCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEgJiYgbmV3SW5kZXggIT0gLTEpCi0JCQkJCWNvbWJvXy5zZWxlY3QobmV3SW5kZXgpOwotCQkJCWVsc2UKLQkJCQkJY29tYm9fLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIHMgPSBvYmplY3QudG9TdHJpbmcoKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIHM7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHREaXNwbGF5U3RyaW5nXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJY29tYm9fLnJlbW92ZUFsbCgpOwotCQl9Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKEVMaXN0KSBvYmplY3QpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJCSgoRU9iamVjdCkgaXRlbSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJcG9wdWxhdGVDb21ibygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmIChjb21ib18gIT0gbnVsbCAmJiAhY29tYm9fLmlzRGlzcG9zZWQoKSkKLQkJCWNvbWJvXy5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYwM2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRBZGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kUmVtb3ZlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRWxlbWVudCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVDbGFzcyBjaGlsZEVDbGFzc187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIGJvb2xlYW4gY2hpbGROaWxsYWJsZV87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlc187Ci0JcHJpdmF0ZSBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZV87Ci0JcHJpdmF0ZSBUZXh0W10gZmVhdHVyZXNUZXh0c187Ci0JcHJpdmF0ZSBBZGFwdGVyVGV4dFtdIGZlYXR1cmVzQWRhcHRlcnNfOwotCi0JcHVibGljIEFkYXB0ZXJFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCXBhcmVudF8gPSBudWxsOwotCQljaGlsZEVDbGFzc18gPSBjaGlsZEVDbGFzczsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJY2hpbGROaWxsYWJsZV8gPSBjaGlsZE5pbGxhYmxlOwotCQlmZWF0dXJlc18gPSBmZWF0dXJlczsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBmZWF0dXJlc05pbGxhYmxlOwotCQlmZWF0dXJlc1RleHRzXyA9IGZlYXR1cmVzVGV4dHM7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZlYXR1cmVzQWRhcHRlcnNfID0gbmV3IEFkYXB0ZXJUZXh0W2ZlYXR1cmVzXy5sZW5ndGhdOwotCQluZXdBZGFwdGVycyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgY2hpbGRFQ2xhc3MsIGNoaWxkRmVhdHVyZSwgY2hpbGROaWxsYWJsZSwgZmVhdHVyZXMsIGZlYXR1cmVzTmlsbGFibGUsIGZlYXR1cmVzVGV4dHMpOwotCQlhZGFwdChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBuZXdBZGFwdGVycyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JCWVsc2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNUZXh0c19baV0uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBjaGlsZEZlYXR1cmVfKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsICYmICFjaGlsZE5pbGxhYmxlXykKLQkJCQljaGlsZCA9IHNldENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmFkYXB0KGNoaWxkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlib29sZWFuIGlzVGV4dHNOdWxsID0gaXNUZXh0c051bGwoKTsKLQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWJvb2xlYW4gY2hpbGRDYW5CZVJlbW92ZWQgPSB0cnVlOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYWxsZmVhdHVyZXMgPSBjaGlsZEVDbGFzc18uZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYWxsZmVhdHVyZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRoaXNGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsZmVhdHVyZXMubmV4dCgpOwotCQkJCWlmICghYWRhcHRpbmdGZWF0dXJlKHRoaXNGZWF0dXJlKSAmJiBjaGlsZC5lSXNTZXQodGhpc0ZlYXR1cmUpKSB7Ci0JCQkJCWNoaWxkQ2FuQmVSZW1vdmVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaXNUZXh0c051bGwgJiYgY2hpbGQgIT0gbnVsbCAmJiBjaGlsZE5pbGxhYmxlXyAmJiBjaGlsZENhbkJlUmVtb3ZlZCkgewotCQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCUNvbW1hbmRSZW1vdmVFbGVtZW50IGNvbW1hbmQgPSBuZXcgQ29tbWFuZFJlbW92ZUVsZW1lbnQobnVsbCwgbnVsbCwgcGFyZW50XywgY2hpbGRGZWF0dXJlXyk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKG51bGwpOwotCQl9IGVsc2UgaWYgKCFpc1RleHRzTnVsbCAmJiBjaGlsZCA9PSBudWxsKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJY2hpbGQgPSBjcmVhdGVDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7Ci0JCQl9Ci0JCQlDb21tYW5kQWRkRWxlbWVudCBjb21tYW5kID0gbmV3IENvbW1hbmRBZGRFbGVtZW50KG51bGwsIG51bGwsIHBhcmVudF8sIGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVGV4dHNOdWxsKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKQotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlFT2JqZWN0IGNoaWxkID0gbnVsbDsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQljaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiAhY2hpbGROaWxsYWJsZV8pCi0JCQkJY2hpbGQgPSBzZXRDaGlsZCgpOwotCQl9Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5hZGFwdChjaGlsZCk7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IHNldENoaWxkKCkgewotCQlFT2JqZWN0IGNoaWxkID0gY3JlYXRlQ2hpbGQoKTsKLQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNoaWxkKCkgewotCQlFRmFjdG9yeSBjaGlsZEZhY3RvcnkgPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVPYmplY3QgY2hpbGQgPSBjaGlsZEZhY3RvcnkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWZlYXR1cmVzTmlsbGFibGVfW2ldKQotCQkJCWNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUFkYXB0ZXJzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykKLQkJCWlmIChmZWF0dXJlc1RleHRzX1tpXSAhPSBudWxsICYmICFmZWF0dXJlc1RleHRzX1tpXS5pc0Rpc3Bvc2VkKCkpCi0JCQkJZmVhdHVyZXNUZXh0c19baV0ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0aW5nRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZXNfID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlID09IGZlYXR1cmVzX1tpXSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRXhwaXJlc0NDb21iby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFeHBpcmVzQ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWU4MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFeHBpcmVzQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJFeHBpcmVzQ0NvbWJvIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0XzsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8geWVhcl87Ci0JcHJpdmF0ZSBDQ29tYm8gbW9udGhfOwotCXByaXZhdGUgQ0NvbWJvIGRheV87Ci0JcHJpdmF0ZSBDQ29tYm8gaG91cl87Ci0JcHJpdmF0ZSBDQ29tYm8gbWludXRlXzsKLQlwcml2YXRlIENDb21ibyBzZWNvbmRfOwotCXByaXZhdGUgQ0NvbWJvIG1zZWNvbmRfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0KLQlwdWJsaWMgQWRhcHRlckV4cGlyZXNDQ29tYm8oQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB5ZWFyLCBDQ29tYm8gbW9udGgsIENDb21ibyBkYXksIENDb21ibyBob3VyLCBDQ29tYm8gbWludXRlLCBDQ29tYm8gc2Vjb25kLCBDQ29tYm8gbXNlY29uZCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXRfID0gYXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJeWVhcl8gPSB5ZWFyOwotCQltb250aF8gPSBtb250aDsKLQkJZGF5XyA9IGRheTsKLQkJaG91cl8gPSBob3VyOwotCQltaW51dGVfID0gbWludXRlOwotCQlzZWNvbmRfID0gc2Vjb25kOwotCQltc2Vjb25kXyA9IG1zZWNvbmQ7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQl5ZWFyXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbW9udGhfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlkYXlfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlob3VyXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbWludXRlXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc2Vjb25kXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbXNlY29uZF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJFeHBpcmVzQ0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB5ZWFyLCBDQ29tYm8gbW9udGgsIENDb21ibyBkYXksIENDb21ibyBob3VyLCBDQ29tYm8gbWludXRlLCBDQ29tYm8gc2Vjb25kLCBDQ29tYm8gbXNlY29uZCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQl0aGlzKGFydGlmYWN0RWRpdCwgZmVhdHVyZSwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1zZWNvbmQsIG5pbGxhYmxlKTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgc3luY1RleHRBbmRNb2RlbCgpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZV8pCi0JCQlzZXRUZXh0KG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIGV4cGlyZXMoKSwgbmlsbGFibGVfKTsKLQkJCWFydGlmYWN0RWRpdF8uZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBleHBpcmVzKCkgewotCQlyZXR1cm4gIlAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQl5ZWFyXy5nZXRUZXh0KCkgKyAiWSIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbnRoXy5nZXRUZXh0KCkgKyAiTSIgKyAvLyROT04tTkxTLTEkCi0JCQkJCWRheV8uZ2V0VGV4dCgpICsgIkRUIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJaG91cl8uZ2V0VGV4dCgpICsgIkgiICsgLy8kTk9OLU5MUy0xJAotCQkJCQltaW51dGVfLmdldFRleHQoKSArICJNIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJc2Vjb25kXy5nZXRUZXh0KCkgKyAiLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1zZWNvbmRfLmdldFRleHQoKSArICJTIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh5ZWFyXyAhPSBudWxsICYmICF5ZWFyXy5pc0Rpc3Bvc2VkKCkpCi0JCQl5ZWFyXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1vbnRoXyAhPSBudWxsICYmICFtb250aF8uaXNEaXNwb3NlZCgpKQotCQkJbW9udGhfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoZGF5XyAhPSBudWxsICYmICFkYXlfLmlzRGlzcG9zZWQoKSkKLQkJCWRheV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChob3VyXyAhPSBudWxsICYmICFob3VyXy5pc0Rpc3Bvc2VkKCkpCi0JCQlob3VyXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1pbnV0ZV8gIT0gbnVsbCAmJiAhbWludXRlXy5pc0Rpc3Bvc2VkKCkpCi0JCQltaW51dGVfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoc2Vjb25kXyAhPSBudWxsICYmICFzZWNvbmRfLmlzRGlzcG9zZWQoKSkKLQkJCXNlY29uZF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtc2Vjb25kXyAhPSBudWxsICYmICFtc2Vjb25kXy5pc0Rpc3Bvc2VkKCkpCi0JCQltc2Vjb25kXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGV4cGlyZXMoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh2YWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgbW9kZWxWYWx1ZSkgewotCQlpZiAobW9kZWxWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpbnQgeSA9IG1vZGVsVmFsdWUuaW5kZXhPZigiWSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbW8gPSBtb2RlbFZhbHVlLmluZGV4T2YoIk0iKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGQgPSBtb2RlbFZhbHVlLmluZGV4T2YoIkQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGggPSBtb2RlbFZhbHVlLmluZGV4T2YoIkgiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IG1pID0gbW9kZWxWYWx1ZS5sYXN0SW5kZXhPZigiTSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgcyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbXMgPSBtb2RlbFZhbHVlLmluZGV4T2YoIlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIXllYXJfLmlzRGlzcG9zZWQoKSAmJiB5ID4gMCkKLQkJCQl5ZWFyXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKDEsIHkpKTsKLQkJCWlmICghbW9udGhfLmlzRGlzcG9zZWQoKSAmJiBtbyA+IDApCi0JCQkJbW9udGhfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoeSArIDEsIG1vKSk7Ci0JCQlpZiAoIWRheV8uaXNEaXNwb3NlZCgpICYmIGQgPiAwKQotCQkJCWRheV8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhtbyArIDEsIGQpKTsKLQkJCWlmICghaG91cl8uaXNEaXNwb3NlZCgpICYmIGggPiAwKQotCQkJCWhvdXJfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoZCArIDIsIGgpKTsKLQkJCWlmICghbWludXRlXy5pc0Rpc3Bvc2VkKCkgJiYgbWkgPiAwKQotCQkJCW1pbnV0ZV8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhoICsgMSwgbWkpKTsKLQkJCWlmICghc2Vjb25kXy5pc0Rpc3Bvc2VkKCkgJiYgcyA+IDApCi0JCQkJc2Vjb25kXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKG1pICsgMSwgcykpOwotCQkJaWYgKCFtc2Vjb25kXy5pc0Rpc3Bvc2VkKCkgJiYgbXMgPiAwKQotCQkJCW1zZWNvbmRfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcocyArIDEsIG1zKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckhhbmRsZXJDbGFzc1RleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FiNWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotLyoKLSAqIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVySGFuZGxlckNsYXNzVGV4dCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByb3RlY3RlZCBIYW5kbGVyIGVPYmplY3RfOwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJvdGVjdGVkIFRleHQgdGV4dF87Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIEFkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgVGV4dCB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckhhbmRsZXJDbGFzc1RleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBIYW5kbGVyIGVPYmplY3QsIFRleHQgdGV4dCkgewotCQl0aGlzKGFuQXJ0aWZhY3RFZGl0LCB0ZXh0KTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgc3luY1RleHRBbmRNb2RlbCgpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZV8pIHsKLQkJCVN0cmluZyBuZXdDbGFzc05hbWUgPSBlT2JqZWN0Xy5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSk7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoSGFuZGxlciBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlTdHJpbmcgbmV3Q2xhc3NOYW1lID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qCi0JICogcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeyBmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JICogYWRhcHQoZU9iamVjdCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHRleHRfICE9IG51bGwgJiYgIXRleHRfLmlzRGlzcG9zZWQoKSkKLQkJCXRleHRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlRWRpdE1vZGVsLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBqMmVlRWRpdE1vZGVsIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0KSB7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkMGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyTGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckxheWVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgRUNsYXNzIGNoaWxkRUNsYXNzXzsKLQlwcml2YXRlIEVPYmplY3QgY2hpbGRfOwotCi0JcHVibGljIEFkYXB0ZXJMYXllcihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyBjaGlsZEVDbGFzcykgewotCQlzdXBlcigpOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWNoaWxkRUNsYXNzXyA9IGNoaWxkRUNsYXNzOwotCQlhZGFwdChwYXJlbnRfKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkKLQkJCWFkYXB0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCWNoaWxkXy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlhZGFwdENoaWxkKCk7Ci0JCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCWNoaWxkXy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDaGlsZCgpIHsKLQkJcmV0dXJuIGNoaWxkXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRhcHRDaGlsZCgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdCA9IHBhcmVudF8uZUdldChmZWF0dXJlXyk7Ci0JCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQkJY2hpbGRfID0gY2hpbGRFQ2xhc3NfLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShjaGlsZEVDbGFzc18pOwotCQkJZWxzZQotCQkJCWNoaWxkXyA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCX0gZWxzZQotCQkJY2hpbGRfID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRhcHRQYXJlbnQoKSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwgJiYgY2hpbGRfICE9IG51bGwpIHsKLQkJCUVMaXN0IGNoaWxkRmVhdHVyZXMgPSBjaGlsZEVDbGFzc18uZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQkJYm9vbGVhbiBpc0ZlYXR1cmVTZXQ7Ci0JCQkJT2JqZWN0IGdyYW5kY2hpbGQgPSBjaGlsZF8uZUdldChjaGlsZEZlYXR1cmUpOwotCQkJCWlmIChncmFuZGNoaWxkICE9IG51bGwgJiYgZ3JhbmRjaGlsZCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJCQlpc0ZlYXR1cmVTZXQgPSAhKChFTGlzdCkgZ3JhbmRjaGlsZCkuaXNFbXB0eSgpOwotCQkJCWVsc2UKLQkJCQkJaXNGZWF0dXJlU2V0ID0gY2hpbGRfLmVJc1NldChjaGlsZEZlYXR1cmUpOwotCQkJCWlmIChpc0ZlYXR1cmVTZXQpIHsKLQkJCQkJcGFyZW50Xy5lU2V0KGZlYXR1cmVfLCBjaGlsZF8pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50Xy5lVW5zZXQoZmVhdHVyZV8pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclBDUmVmVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFkMDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5U0VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUENSZWZUZXh0IGV4dGVuZHMgQWRhcHRlclRleHQgewotCXB1YmxpYyBBZGFwdGVyUENSZWZUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCi0JcHVibGljIEFkYXB0ZXJQQ1JlZlRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXQsIGVPYmplY3QsIGZlYXR1cmUsIHRleHQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJT2JqZWN0IG9iaiA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIG9ialN0cmluZ1ZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9iajsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIG9iajsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfQotCQkJc2V0VGV4dChvYmpTdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJLy9IYW5kbGUgUG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIFNFSUZlYXR1cmVOYW1lID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLmdldE5hbWUoKTsKLQkJCWlmICgoZU9iamVjdF8gaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50UmVmKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhTRUlGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVNFSSBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlTRUkobnVsbCwgbnVsbCwgKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlPYmplY3Qgb2JqID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgb2JqU3RyaW5nVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCW9ialN0cmluZ1ZhbHVlID0gKFN0cmluZykgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgb2JqOwotCQkJCW9ialN0cmluZ1ZhbHVlID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlzZXRUZXh0KG9ialN0cmluZ1ZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZTsKLQkJCS8vSGFuZGxlIFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGZlYXR1cmUgaW4gYSBzcGVjaWFsIHdheS4KLQkJCVN0cmluZyBTRUlGZWF0dXJlTmFtZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoKGVPYmplY3RfIGluc3RhbmNlb2YgUG9ydENvbXBvbmVudFJlZikgJiYgKGZlYXR1cmVfLmdldE5hbWUoKS5lcXVhbHMoU0VJRmVhdHVyZU5hbWUpKSkgewotCQkJCW1vZGVsVmFsdWUgPSAoKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZhbHVlID0gKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDMwZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kQWRkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZFJlbW92ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotLyoqCi0gKiBHZW5lcmljIGVTZXQncyB3aWxsIG5vdCB3b3JrIHdoZW4gc2V0dGluZyBuYW1lc3BhY2VVUklzIG9uIFFOYW1lJ3Mgc28gQWRhcHRlckVsZW1lbnQgY2Fubm90IGJlCi0gKiB1c2VkIHdoZW4gdGhlIGNoaWxkIGlzIGEgUU5hbWUuIFRoaXMgY2xhc3MgaXMgdmVyeSBzaW1pbGFyIEFkYXB0ZXJFbGVtZW50IGJ1dCBoYXMgc3BlY2lhbAotICogYmVoYXZpb3VyIGZvciBoYW5kbGluZyBRTmFtZSdzLgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlclFOYW1lRWxlbWVudCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRUNsYXNzIGNoaWxkRUNsYXNzXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgYm9vbGVhbiBjaGlsZE5pbGxhYmxlXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzXzsKLQlwcml2YXRlIGJvb2xlYW5bXSBmZWF0dXJlc05pbGxhYmxlXzsKLQlwcml2YXRlIFRleHRbXSBmZWF0dXJlc1RleHRzXzsKLQlwcml2YXRlIEFkYXB0ZXJUZXh0W10gZmVhdHVyZXNBZGFwdGVyc187Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFkYXB0ZXJRTmFtZUVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gY2hpbGROaWxsYWJsZSwgVGV4dCBuc1VSSVRleHQsIFRleHQgbG9jYWxQYXJ0VGV4dCkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJcGFyZW50XyA9IG51bGw7Ci0JCWNoaWxkRUNsYXNzXyA9IGNoaWxkRUNsYXNzOwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZE5pbGxhYmxlXyA9IGNoaWxkTmlsbGFibGU7Ci0JCUNvbW1vblBhY2thZ2UgY29tbW9uUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCS8vIFNldCB1cCBRTmFtZSBmZWF0dXJlcwotCQlmZWF0dXJlc18gPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlWzJdOwotCQlmZWF0dXJlc19bMF0gPSBjb21tb25QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCk7Ci0JCWZlYXR1cmVzX1sxXSA9IGNvbW1vblBLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKTsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBuZXcgYm9vbGVhblsyXTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMF0gPSBmYWxzZTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMV0gPSBmYWxzZTsKLQkJZmVhdHVyZXNUZXh0c18gPSBuZXcgVGV4dFsyXTsKLQkJZmVhdHVyZXNUZXh0c19bMF0gPSBuc1VSSVRleHQ7Ci0JCWZlYXR1cmVzVGV4dHNfWzFdID0gbG9jYWxQYXJ0VGV4dDsKLQkJYWRkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJZmVhdHVyZXNBZGFwdGVyc18gPSBuZXcgQWRhcHRlclRleHRbZmVhdHVyZXNfLmxlbmd0aF07Ci0JCW5ld0FkYXB0ZXJzKG51bGwpOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyUU5hbWVFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRU9iamVjdCBwYXJlbnQsIEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBjaGlsZE5pbGxhYmxlLCBUZXh0IG5zVVJJVGV4dCwgVGV4dCBsb2NhbFBhcnRUZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIGNoaWxkRUNsYXNzLCBjaGlsZEZlYXR1cmUsIGNoaWxkTmlsbGFibGUsIG5zVVJJVGV4dCwgbG9jYWxQYXJ0VGV4dCk7Ci0JCWFkYXB0KHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5ld0FkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1RleHRzX1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGNoaWxkRmVhdHVyZV8pIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWJvb2xlYW4gaXNUZXh0c051bGwgPSBpc1RleHRzTnVsbCgpOwotCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJYm9vbGVhbiBjaGlsZENhbkJlUmVtb3ZlZCA9IHRydWU7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBhbGxmZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChhbGxmZWF0dXJlcy5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGhpc0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJaWYgKCFhZGFwdGluZ0ZlYXR1cmUodGhpc0ZlYXR1cmUpICYmIGNoaWxkLmVJc1NldCh0aGlzRmVhdHVyZSkpIHsKLQkJCQkJY2hpbGRDYW5CZVJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc1RleHRzTnVsbCAmJiBjaGlsZCAhPSBudWxsICYmIGNoaWxkTmlsbGFibGVfICYmIGNoaWxkQ2FuQmVSZW1vdmVkKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJQ29tbWFuZFJlbW92ZUVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kUmVtb3ZlRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMobnVsbCk7Ci0JCX0gZWxzZSBpZiAoIWlzVGV4dHNOdWxsICYmIGNoaWxkID09IG51bGwpIHsKLQkJCWRpc3Bvc2VBZGFwdGVycygpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQljaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCQlzZXRGZWF0dXJlc09uQ2hpbGQoY2hpbGQpOwotCQkJLyoKLQkJCSAqIHJlcGxhY2VkIGJ5IHNldEZlYXR1cmVzT25DaGlsZCBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgeyBTdHJpbmcKLQkJCSAqIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7IGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkgKiBjaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7IH0KLQkJCSAqLwotCQkJQ29tbWFuZEFkZEVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kQWRkRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKGNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1RleHRzTnVsbCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfID0gZU9iamVjdDsKLQkJRU9iamVjdCBjaGlsZCA9IG51bGw7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpIHsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJfQotCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQlhZGRNb2RpZnlMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBzZXRDaGlsZCgpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDaGlsZCgpIHsKLQkJRUZhY3RvcnkgY2hpbGRGYWN0b3J5ID0gY2hpbGRFQ2xhc3NfLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQlFT2JqZWN0IGNoaWxkID0gY2hpbGRGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzc18pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFmZWF0dXJlc05pbGxhYmxlX1tpXSkKLQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpCi0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VBZGFwdGVycygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlpZiAoZmVhdHVyZXNUZXh0c19baV0gIT0gbnVsbCAmJiAhZmVhdHVyZXNUZXh0c19baV0uaXNEaXNwb3NlZCgpKQotCQkJCWZlYXR1cmVzVGV4dHNfW2ldLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdGluZ0ZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVzXyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBmZWF0dXJlc19baV0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlc09uQ2hpbGQoRU9iamVjdCBjaGlsZCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBRTmFtZSkgLy9UaGlzIHdpbGwgYWx3YXlzIGJlIHRydWUuCi0JCXsKLQkJCVFOYW1lIHFuYW1lID0gKFFOYW1lKSBjaGlsZDsKLQkJCVN0cmluZyBuYW1lc3BhY2VVUklWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzBdLmdldFRleHQoKTsKLQkJCVN0cmluZyBsb2NhbFBhcnRWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzFdLmdldFRleHQoKTsKLQkJCWlmIChuYW1lc3BhY2VVUklWYWx1ZSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSVZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkvL0p1c3Qgc2V0IHRoZSBsb2NhbCBwYXJ0Ci0JCQkJaWYgKGxvY2FsUGFydFZhbHVlICE9IG51bGwgJiYgbG9jYWxQYXJ0VmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJCQlxbmFtZS5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0VmFsdWUpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmIChsb2NhbFBhcnRWYWx1ZSA9PSBudWxsKQotCQkJCQlsb2NhbFBhcnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvL1NldCBuYW1lc3BhY2UgYW5kIGxvY2FsIHBhcnQgdXNpbmcgUU5hbWVIZWxwZXIKLQkJCQlRTmFtZUhlbHBlci5zZXRRTmFtZVZhbHVlKHFuYW1lLCBuYW1lc3BhY2VVUklWYWx1ZSwgbG9jYWxQYXJ0VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NjhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlOU1VSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotCi0KLS8qKgotICogU2luY2UgZ2VuZXJpYyBlU2V0J3Mgd2lsbCBub3Qgd29yayBmb3Igc2V0dGluZyBRTmFtZSBuYW1lc3BhY2VVUkkncywgdGhpcyBzdWJjbGFzcydzIHB1cnBvc2UgaXMKLSAqIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgd2hlbiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUU5hbWVUZXh0IGV4dGVuZHMgQWRhcHRlclRleHQgewotCi0JcHVibGljIEFkYXB0ZXJRTmFtZVRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgVGV4dCB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JfQotCi0KLQlwdWJsaWMgQWRhcHRlclFOYW1lVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQkvL0hhbmRsZSBRTmFtZV9OYW1lc3BhY2VVUkkgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIG5hbWVzcGFjZUZlYXR1cmVOYW1lID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkuZ2V0TmFtZSgpOwotCQkJaWYgKChlT2JqZWN0XyBpbnN0YW5jZW9mIFFOYW1lKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhuYW1lc3BhY2VGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJQ29tbWFuZE1vZGlmeU5TVVJJIGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeU5TVVJJKG51bGwsIG51bGwsIChRTmFtZSkgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfSAKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfSAKLQkJCX0KLQotCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTE4NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotLyoKLSAqIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJvdGVjdGVkIFNlcnZpY2VSZWYgZU9iamVjdF87Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcm90ZWN0ZWQgVGV4dCB0ZXh0XzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuaWxsYWJsZV87Ci0KLQlwdWJsaWMgQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgVGV4dCB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQkJdGV4dF8gPSB0ZXh0OwotCQluaWxsYWJsZV8gPSBmYWxzZTsKLQkJdGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIFNlcnZpY2VSZWYgZU9iamVjdCwgVGV4dCB0ZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIHRleHQpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgdGV4dF8uZ2V0VGV4dCgpKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KFNlcnZpY2VSZWYgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJaWYgKGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0VGV4dChudWxsKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qCi0JICogcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeyBmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JICogYWRhcHQoZU9iamVjdCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHRleHRfICE9IG51bGwgJiYgIXRleHRfLmlzRGlzcG9zZWQoKSkKLQkJCXRleHRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQkJbW9kZWxWYWx1ZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGQ0ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclRleHQgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBlT2JqZWN0XzsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByb3RlY3RlZCBUZXh0IHRleHRfOwotCXByb3RlY3RlZCBib29sZWFuIG5pbGxhYmxlXzsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQotCXB1YmxpYyBBZGFwdGVyVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZUVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogICAgICAgICAgICBUaGUgajJlZUVkaXRNb2RlbCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCkgewotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dENDb21iby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0Q0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODIyZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0Q0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJUZXh0Q0NvbWJvIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0XzsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8gdGV4dF87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVyVGV4dENDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0XyA9IGFydGlmYWN0RWRpdDsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCXRleHRfID0gdGV4dDsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCXRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyVGV4dENDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDQ29tYm8gdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQl0aGlzKGFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCXNldFRleHQoKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXykpOwotCQl9IGVsc2UKLQkJCXNldFRleHQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlpZiAodGV4dF8gIT0gbnVsbCAmJiAhdGV4dF8uaXNEaXNwb3NlZCgpKQotCQkJdGV4dF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYyOWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IGVPYmplY3RfOwotCXByaXZhdGUgVmlld2VyIHZpZXdlcl87Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZXNfOwotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcigpOwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCXZpZXdlcl8gPSB2aWV3ZXI7Ci0JCWZlYXR1cmVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlcihFT2JqZWN0IGVPYmplY3QsIFZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcyh2aWV3ZXIpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gbXNnLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZU9iamVjdF8pIHsKLQkJCQlpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkKLQkJCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgbXNnLmdldEZlYXR1cmUoKSk7Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgaXRlbSA9IGVMaXN0LmdldChpKTsKLQkJCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkJCSgoRU9iamVjdCkgaXRlbSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdmlld2VyXy5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCX0KLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJcmVhZGFwdEFsbENhY2hlZEZlYXR1cmUoKTsKLQkJfQotCQl2aWV3ZXJfLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCFmZWF0dXJlc18uY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzXy5hZGQoZmVhdHVyZSk7Ci0JCQlpbnRlcm5hbEFkYXB0RmVhdHVyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEFkYXB0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IGZlYXR1cmVPYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBmZWF0dXJlT2JqZWN0KS5lQWRhcHRlcnMoKTsKLQkJCQlpZiAoIWVBZGFwdGVycy5jb250YWlucyh0aGlzKSkKLQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCX0gZWxzZSBpZiAoZmVhdHVyZU9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIGZlYXR1cmVPYmplY3Q7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gZUxpc3QuZ2V0KGkpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBvYmplY3QpLmVBZGFwdGVycygpOwotCQkJCQkJaWYgKCFlQWRhcHRlcnMuY29udGFpbnModGhpcykpCi0JCQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoZmVhdHVyZXNbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuYWRhcHRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVzXy5yZW1vdmUoZmVhdHVyZSk7Ci0JCWludGVybmFsVW5hZGFwdEZlYXR1cmUoZmVhdHVyZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsVW5hZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCU9iamVjdCBmZWF0dXJlT2JqZWN0ID0gZU9iamVjdF8uZUdldChmZWF0dXJlKTsKLQkJCWlmIChmZWF0dXJlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkoKEVPYmplY3QpIGZlYXR1cmVPYmplY3QpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWVsc2UgaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBmZWF0dXJlT2JqZWN0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGVMaXN0LmdldChpKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxVbmFkYXB0RmVhdHVyZShmZWF0dXJlc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCWZlYXR1cmVzXyA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VySXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmEzMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyVmlld2VySXRlbSB7Ci0JcHJpdmF0ZSBFTGlzdCBlT2JqZWN0c187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlckl0ZW0oRUxpc3QgZU9iamVjdHMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWVPYmplY3RzXyA9IGVPYmplY3RzOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXJJdGVtKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZU9iamVjdHNfID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZU9iamVjdHNfLmFkZChlT2JqZWN0KTsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFT2JqZWN0TGlzdCgpIHsKLQkJcmV0dXJuIGVPYmplY3RzXzsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVfOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZENsaWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGE5NjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgU2VydmljZVJlZiBwYXJlbnRfOwotCXByaXZhdGUgSGFuZGxlciBuZXdDaGlsZF87Ci0KLQkvL3ByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBIYW5kbGVyIG5ld0NoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlcihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBoYW5kbGVyTmFtZSwgSmF2YUNsYXNzIGhhbmRsZXJDbGFzcykgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdIYW5kbGVyKGhhbmRsZXJOYW1lLCBoYW5kbGVyQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlcihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJSmF2YUNsYXNzIGhhbmRsZXJDbGFzcyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihoYW5kbGVyQ2xhc3NOYW1lKTsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3SGFuZGxlcihoYW5kbGVyTmFtZSwgaGFuZGxlckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEhhbmRsZXIgY3JlYXRlTmV3SGFuZGxlcihTdHJpbmcgaGFuZGxlck5hbWUsIEphdmFDbGFzcyBoYW5kbGVyQ2xhc3MpIHsKLQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGZhY3RvcnkgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSgpOwotCQlIYW5kbGVyIG5ld0NoaWxkID0gZmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0JCW5ld0NoaWxkLnNldEhhbmRsZXJOYW1lKGhhbmRsZXJOYW1lKTsKLQkJbmV3Q2hpbGQuc2V0SGFuZGxlckNsYXNzKGhhbmRsZXJDbGFzcyk7Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwYXJlbnRfLmdldEhhbmRsZXJzKCkuYWRkKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXBhcmVudF8uZ2V0SGFuZGxlcnMoKS5yZW1vdmUobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRkZWRPYmplY3QoKSB7Ci0JCXJldHVybiBuZXdDaGlsZF87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhN2ZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkRWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdCBuZXdDaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG51bGw7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXSBjaGlsZFByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld0NoaWxkKGNoaWxkRUNsYXNzLCAoY2hpbGRQcm9wZXJ0aWVzICE9IG51bGwpID8gY2hpbGRQcm9wZXJ0aWVzIDogbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVswXSwgKHByb3BlcnR5VmFsdWVzICE9IG51bGwpID8gcHJvcGVydHlWYWx1ZXMgOiBuZXcgT2JqZWN0WzBdKTsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVOZXdDaGlsZChFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGNoaWxkUHJvcGVydGllcywgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXMpIHsKLQkJRUZhY3RvcnkgZUZhY3RvcnkgPSBjaGlsZEVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRU9iamVjdCBuZXdDaGlsZCA9IGVGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzcyk7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0JCQkJbmV3Q2hpbGQuZVNldChjaGlsZFByb3BlcnRpZXNbaV0sIHByb3BlcnR5VmFsdWVzW2ldKTsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKSB7Ci0JCQlpZiAobmV3Q2hpbGRfICE9IG51bGwpCi0JCQkJKChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pKS5hZGQobmV3Q2hpbGRfKTsKLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG5ld0NoaWxkXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChuZXdDaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLnJlbW92ZShuZXdDaGlsZF8pOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIG5ld0NoaWxkXzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkUG9ydENvbXBvbmVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNjMGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkUG9ydENvbXBvbmVudFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgU2VydmljZVJlZiBwYXJlbnRfOwotCXByaXZhdGUgUG9ydENvbXBvbmVudFJlZiBuZXdDaGlsZF87Ci0KLQkvL3ByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBwb3J0Q29tcG9uZW50TGluaywgSmF2YUNsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdQb3J0Q29tcG9uZW50UmVmKHBvcnRDb21wb25lbnRMaW5rLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBwb3J0Q29tcG9uZW50TGluaywgU3RyaW5nIHNlaU5hbWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJSmF2YUNsYXNzIHNlaUNsYXNzID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHNlaU5hbWUpOwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdQb3J0Q29tcG9uZW50UmVmKHBvcnRDb21wb25lbnRMaW5rLCBzZWlDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYoU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQkJUG9ydENvbXBvbmVudFJlZiBuZXdDaGlsZCA9IGZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudFJlZigpOwotCQluZXdDaGlsZC5zZXRQb3J0Q29tcG9uZW50TGluayhwb3J0Q29tcG9uZW50TGluayk7Ci0JCW5ld0NoaWxkLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcGFyZW50Xy5nZXRQb3J0Q29tcG9uZW50UmVmcygpLmFkZChuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlwYXJlbnRfLmdldFBvcnRDb21wb25lbnRSZWZzKCkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkU2VydmljZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTIwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZFNlcnZpY2VSZWYgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgV2ViU2VydmljZXNDbGllbnQgcGFyZW50XzsKLQlwcml2YXRlIFNlcnZpY2VSZWYgbmV3Q2hpbGRfOwotCi0JLy9wcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCi0JcHVibGljIENvbW1hbmRBZGRTZXJ2aWNlUmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBXZWJTZXJ2aWNlc0NsaWVudCBwYXJlbnQsIFNlcnZpY2VSZWYgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRTZXJ2aWNlUmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBXZWJTZXJ2aWNlc0NsaWVudCBwYXJlbnQsIFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgSmF2YUNsYXNzIHNlcnZpY2VJbnRlcmZhY2UpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgc2VydmljZUludGVyZmFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmIGNyZWF0ZU5ld1NlcnZpY2VSZWYoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBKYXZhQ2xhc3Mgc2VydmljZUludGVyZmFjZSkgewotCQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZmFjdG9yeSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2Vic2VydmljZV9jbGllbnRGYWN0b3J5KCk7Ci0JCVNlcnZpY2VSZWYgbmV3Q2hpbGQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZpY2VSZWYoKTsKLQkJbmV3Q2hpbGQuc2V0U2VydmljZVJlZk5hbWUoc2VydmljZVJlZk5hbWUpOwotCQluZXdDaGlsZC5zZXRTZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UpOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcGFyZW50Xy5nZXRTZXJ2aWNlUmVmcygpLmFkZChuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlwYXJlbnRfLmdldFNlcnZpY2VSZWZzKCkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjYyNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBwcm9wZXJ0aWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIG9sZFByb3BlcnR5VmFsdWVzXzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5RWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCXByb3BlcnRpZXNfID0gcHJvcGVydGllczsKLQkJcHJvcGVydHlWYWx1ZXNfID0gcHJvcGVydHlWYWx1ZXM7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFByb3BlcnR5VmFsdWVzXyA9IG5ldyBPYmplY3RbcHJvcGVydGllc18ubGVuZ3RoXTsKLQotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2xkUHJvcGVydHlWYWx1ZXNfW2ldID0gcGFyZW50Xy5lR2V0KHByb3BlcnRpZXNfW2ldKTsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIHByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQcm9wZXJ0eVZhbHVlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIG9sZFByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE0MzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEhhbmRsZXIgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgSmF2YUNsYXNzIG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEhhbmRsZXIgZU9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpOwotCQllT2JqZWN0Xy5zZXRIYW5kbGVyQ2xhc3MoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKG5ld1ZhbHVlXykpOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLnNldEhhbmRsZXJDbGFzcyhvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzN2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5TlNVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeU5TVVJJIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFFOYW1lIGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgU3RyaW5nIG5ld1ZhbHVlXzsKLQlwcml2YXRlIE9iamVjdCBvbGRWYWx1ZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkSXNTZXRfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlOU1VSSShTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgUU5hbWUgZU9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKTsKLQkJaWYgKG5pbGxhYmxlICYmIChuZXdWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlLmxlbmd0aCgpIDw9IDApKQotCQkJbmV3VmFsdWVfID0gbnVsbDsKLQkJZWxzZSBpZiAoIW5pbGxhYmxlICYmIG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVFOYW1lSGVscGVyLnNldFFOYW1lTmFtZXNwYWNlVVJJKGVPYmplY3RfLCBuZXdWYWx1ZV8pOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMGUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5U0VJIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFBvcnRDb21wb25lbnRSZWYgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5U0VJKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBQb3J0Q29tcG9uZW50UmVmIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQlpZiAobmlsbGFibGUgJiYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPD0gMCkpCi0JCQluZXdWYWx1ZV8gPSBudWxsOwotCQllbHNlIGlmICghbmlsbGFibGUgJiYgbmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5ld1ZhbHVlXyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5ld1ZhbHVlXyA9IG5ld1ZhbHVlOwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJb2xkVmFsdWVfID0gbnVsbDsKLQkJb2xkSXNTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRJc1NldF8gPSBlT2JqZWN0Xy5lSXNTZXQoZmVhdHVyZV8pOwotCQlvbGRWYWx1ZV8gPSBlT2JqZWN0Xy5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIG5ld0phdmFDbGFzc18gPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKTsKLQkJZU9iamVjdF8uc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKG5ld0phdmFDbGFzc18pOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODhkMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgU3RyaW5nIG5ld1ZhbHVlXzsKLQlwcml2YXRlIEphdmFDbGFzcyBvbGRWYWx1ZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkSXNTZXRfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBlT2JqZWN0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQkJZU9iamVjdF8uc2V0U2VydmljZUludGVyZmFjZShKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKSk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uc2V0U2VydmljZUludGVyZmFjZShvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ZWIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeVRleHQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJaWYgKG5pbGxhYmxlICYmIChuZXdWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlLmxlbmd0aCgpIDw9IDApKQotCQkJbmV3VmFsdWVfID0gbnVsbDsKLQkJZWxzZSBpZiAoIW5pbGxhYmxlICYmIG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG5ld1ZhbHVlXyk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uZVNldChmZWF0dXJlXywgb2xkVmFsdWVfKTsKLQkJZWxzZQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg5M2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcyBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHNvdXJjZV87Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuXzsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb3B5XzsKLQlwcml2YXRlIE9iamVjdFtdIGNsb25lZENoaWxkcmVuXzsKLQlwcml2YXRlIEVMaXN0IHNlcnZpY2VSZWZzOwotCi0JcHVibGljIENvbW1hbmRNb3ZlU2VydmljZVJlZnMoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0W10gY2hpbGRyZW4sIGJvb2xlYW4gaXNDb3B5LCBFTGlzdCBzZXJ2aWNlUmVmcykgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlzb3VyY2VfID0gc291cmNlOwotCQl0YXJnZXRfID0gdGFyZ2V0OwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZHJlbl8gPSBjaGlsZHJlbjsKLQkJaXNDb3B5XyA9IGlzQ29weTsKLQkJY2xvbmVkQ2hpbGRyZW5fID0gbnVsbDsKLQkJdGhpcy5zZXJ2aWNlUmVmcyA9IHNlcnZpY2VSZWZzOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNsb25lT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQlFTGlzdCBjbG9uZSA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChFTGlzdCkgb2JqZWN0KS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJY2xvbmUuYWRkKGNsb25lT2JqZWN0KGl0Lm5leHQoKSkpOwotCQkJfQotCQkJcmV0dXJuIGNsb25lOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IHNvdXJjZSA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpOwotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCUVGYWN0b3J5IGVGYWN0b3J5ID0gZVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQkJRU9iamVjdCBjbG9uZSA9IGVGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOwotCQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc291cmNlLmVJc1NldChmZWF0dXJlKSkgewotCQkJCQlPYmplY3QgY2xvbmVkRmVhdHVyZSA9IGNsb25lT2JqZWN0KHNvdXJjZS5lR2V0KGZlYXR1cmUpKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpCi0JCQkJCQkoKExpc3QpIGNsb25lLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoTGlzdCkgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNsb25lLmVTZXQoZmVhdHVyZSwgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNsb25lLmVVbnNldChmZWF0dXJlKTsKLQkJCX0KLQkJCXJldHVybiBjbG9uZTsKLQkJfQotCQlpZiAob2JqZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhvYmplY3QudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKQotCQkJZXhlY3V0ZU1hbnkoKTsKLQkJZWxzZQotCQkJZXhlY3V0ZVNpbmdsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlU2luZ2xlKCkgewotCQlPYmplY3QgY2hpbGQgPSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmIChpc0NvcHlfKQotCQkJdGFyZ2V0Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIGNsb25lT2JqZWN0KGNoaWxkKSk7Ci0JCWVsc2UgewotCQkJc291cmNlXy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQl0YXJnZXRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVNYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pCi0JCQljbG9uZWRDaGlsZHJlbl8gPSBuZXcgT2JqZWN0W2NoaWxkcmVuXy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gc291cmNlTGlzdC5pbmRleE9mKGNoaWxkcmVuX1tpXSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlpZiAoaXNDb3B5XykgewotCQkJCQljbG9uZWRDaGlsZHJlbl9baV0gPSBjbG9uZU9iamVjdChjaGlsZHJlbl9baV0pOwotCQkJCQl0YXJnZXRMaXN0LmFkZChjbG9uZWRDaGlsZHJlbl9baV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNvdXJjZUxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJdGFyZ2V0TGlzdC5hZGQoY2hpbGRyZW5fW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpCi0JCQl1bmRvU2luZ2xlKCk7Ci0JCWVsc2UKLQkJCXVuZG9NYW55KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9TaW5nbGUoKSB7Ci0JCU9iamVjdCBjaGlsZCA9IHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJdGFyZ2V0Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmICghaXNDb3B5XykKLQkJCXNvdXJjZV8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9NYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pIHsKLQkJCWlmIChjbG9uZWRDaGlsZHJlbl8gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xvbmVkQ2hpbGRyZW5fLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRhcmdldExpc3QucmVtb3ZlKGNsb25lZENoaWxkcmVuX1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbl8ubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaW5kZXggPSB0YXJnZXRMaXN0LmluZGV4T2YoY2hpbGRyZW5fW2ldKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJdGFyZ2V0TGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQlzb3VyY2VMaXN0LmFkZChjaGlsZHJlbl9baV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRSZW1vdmVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFJlbW92ZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNjE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFJlbW92ZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kUmVtb3ZlRWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBPYmplY3QgY2hpbGRfOwotCXByaXZhdGUgT2JqZWN0IG9sZENoaWxkXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgY2hpbGRGZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFJlbW92ZUVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMobGFiZWwsIGRlc2NyaXB0aW9uLCBwYXJlbnQsIG51bGwsIGNoaWxkRmVhdHVyZSwgbmlsbGFibGUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQl0aGlzKGxhYmVsLCBkZXNjcmlwdGlvbiwgcGFyZW50LCBjaGlsZCwgY2hpbGRGZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFJlbW92ZUVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRfID0gY2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG51bGw7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKSB7Ci0JCQlpZiAoY2hpbGRfICE9IG51bGwpCi0JCQkJKChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pKS5yZW1vdmUoY2hpbGRfKTsKLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKG5pbGxhYmxlXykKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLmFkZChjaGlsZF8pOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRTZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjZWMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kU2V0RWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdCBuZXdDaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZFNldEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgY2hpbGRGZWF0dXJlLCBuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRTZXRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0IG5ld0NoaWxkLCBPYmplY3Qgb2xkQ2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG9sZENoaWxkOwotCQlvbGRDaGlsZFNldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpICYmICEobmV3Q2hpbGRfIGluc3RhbmNlb2YgRUxpc3QpKSB7Ci0JCQlpZiAob2xkQ2hpbGRfICE9IG51bGwgJiYgbmV3Q2hpbGRfICE9IG51bGwpIHsKLQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJCWludCBpbmRleCA9IGVMaXN0LmluZGV4T2Yob2xkQ2hpbGRfKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJCWVMaXN0LnNldChpbmRleCwgbmV3Q2hpbGRfKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKG5ld0NoaWxkXyAhPSBudWxsKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBuZXdDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpICYmICEobmV3Q2hpbGRfIGluc3RhbmNlb2YgRUxpc3QpKSB7Ci0JCQlpZiAob2xkQ2hpbGRfICE9IG51bGwgJiYgbmV3Q2hpbGRfICE9IG51bGwpIHsKLQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJCWludCBpbmRleCA9IGVMaXN0LmluZGV4T2YobmV3Q2hpbGRfKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJCWVMaXN0LnNldChpbmRleCwgb2xkQ2hpbGRfKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvbGRDaGlsZFNldF8pCi0JCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG9sZENoaWxkXyk7Ci0JCQllbHNlCi0JCQkJcGFyZW50Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL0pheFJQQ01hcEFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDVmYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogV1NEREFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV1MgRGVwbG95bWVudCBEZXNjcmlwdG9yIG1ldGFtb2RlbCBzcGVjaWZlYyBkYXRhIGZyb20gYQotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlIG1ldGFtb2RlbC4gVGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7aXMgcmV0cmlldmVkIGZyb20gdGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7dXNpbmcgYSBjb25zdGFudCB7QHNlZQotICogSjJFRUNvbnN0YW50cyNFSkJKQVJfRERfVVJJX09CSn0uIFRoZSBkZWZpbmVkIG1ldGhvZHMgZXh0cmFjdCBkYXRhIG9yIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mCi0gKiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLSAqIDwvcD4KLSAqIAotICovIAotcHVibGljIGNsYXNzIEpheFJQQ01hcEFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgewotCQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdTRERBcnRpZmFjdEVkaXQgdG8gYSBXc2RkQWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBXc2RkQWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmNsYXNzOwotCQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20gdGhlIGdpdmVuCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLyAKLQlwcm90ZWN0ZWQgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBKYXhycGNtYXBSZXNvdXJjZSBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgcmVzU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQotCQlKYXhycGNtYXBSZXNvdXJjZSBqYXhycGNtYXBSZXMgPSAoSmF4cnBjbWFwUmVzb3VyY2UpIHJlc1NldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCQotCQlyZXR1cm4gamF4cnBjbWFwUmVzOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICogIAotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbihTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCXJldHVybiBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogIAotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlyZXR1cm4gZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKiAgCi0JICovCi0JcHVibGljIEphdmFXU0RMTWFwcGluZyBnZXRKYXZhV1NETE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YVdTRExNYXBwaW5nKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMKLQkgKiBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogIAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdChTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJYWRkSmF2YVdTRExNYXBwaW5nSWZOZWNlc3NhcnkoZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChXZWJTZXJ2aWNlcykgYW5kIHBvcHVsYXRlcyB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3QKLQkgKiBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhV1NETE1hcHBpbmdJZk5lY2Vzc2FyeShKYXhycGNtYXBSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCSAgICBpZihhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCUphdmFXU0RMTWFwcGluZyBtYXAgPSBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhV1NETE1hcHBpbmcoKTsKLQkJCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobWFwKTsKLQkJICAgIH0KLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlKYXhSUENNYXBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdAotCSAqIGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlCi0JICogICAgICAgICAgICBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgcmVzb2x2ZSB1cmkuCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCXJldHVybiBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgdHJ1ZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheFJQQ01hcEFydGlmYWN0RWRpdCBnZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVKQk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCSAgICByZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCksbWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQl9Ci0JCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoaW50KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbixTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JICAgIEpheHJwY21hcFJlc291cmNlIHJlcyA9IGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JICAgIHJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JICAgIGFkZEphdmFXU0RMTWFwcGluZ0lmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRKYXZhV1NETE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIl9VSV9KYXhSUENNaXNzaW5nTW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBbMTgyNDE3XSBUaGlzIEFydGlmYWN0RWRpdCB3b3JrcyBmb3IgYWxsIHByb2plY3QgdmVyc2lvbnMsIHNvIGp1c3QgcmV0dXJuIHRydWUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTQ0REQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM2NjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTQ0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0NEREFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgewotCi0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgV1NEREFydGlmYWN0RWRpdCB0byBhIFdzZGRBZGFwdGVyRmFjdG9yeSB7QHNlZQotCSAqIFdzZGRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBXU0NEREFydGlmYWN0RWRpdC5jbGFzczsKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFdTQ0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV1NDRERBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCXB1YmxpYyBXU0NEREFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqLwotCi0JcHVibGljIFdlYlNlcnZpY2VzUmVzb3VyY2UgZ2V0V3NjZGRYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlc1Jlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEVKQlJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldFdzY2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nCi0JICogZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlpZiAoZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKSE9bnVsbCkKLQkJCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlKGdldFdlYlNlcnZpY2VzQ2xpZW50WG1sUmVzb3VyY2VVUkkoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0V2ViU2VydmljZXNDbGllbnRYbWxSZXNvdXJjZVVSSSgpIHsKLQkJVVJJIHJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1dFQl9JTkZfRERfVVJJX09CSjsKLQkJaWYgKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUklfT0JKOwotCQllbHNlIGlmIChpc1ZhbGlkRUpCTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJX09CSjsKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzQ2xpZW50KSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBXZWJTZXJ2aWNlcyAoQHNlZSBXZWJTZXJ2aWNlcykgcm9vdCBvYmplY3QgZnJvbSB0aGUKLQkgKiBXc2RkUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBvbmUgaXMgY3JlYXRlZAotCSAqIChAbGluayBhZGRFSkJKYXJJZk5lY2Vzc2FyeShnZXRFSkJKYXJYbWlSZXNvdXJjZSgpKSkuIFRoZSByb290IG9iamVjdAotCSAqIGNvbnRhaW5zIGFsbCBvdGhlciByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KGdldFdzY2RkWG1pUmVzb3VyY2UoKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKFdlYlNlcnZpY2VzKSBhbmQgcG9wdWxhdGVzCi0JICogd2l0aCBkYXRhLiBBZGRzIHRoZSByb290IG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfSBOb3RlOiBUaGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiAgICAgICAgICAgIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KFdlYlNlcnZpY2VzUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJV2ViU2VydmljZXNDbGllbnQgd3NfY2xpZW50ID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh3c19jbGllbnQpOwotCQkJfQotCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJYVJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NDRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgdHJ1ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiAgICAgICAgIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NDRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gYUNvbXBvbmVudCAhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUKLQkgKiAgICAgICAgIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdTQ0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIChpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKGFDb21wb25lbnQpIHx8IGlzVmFsaWRXZWJNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZEVKQk1vZHVsZShhQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIGFDb21wb25lbnQgIT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBhQ29tcG9uZW50ICE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQlyZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCX0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJc2V0V3JpdGFibGVFZGl0KGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgeyAvL1Byb3Blcmx5IGRpc3Bvc2UgdGhlIHdyaXRlIGFydGlmYWN0IGVkaXQKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QyKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNWQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0REQXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFdTRERBcnRpZmFjdEVkaXQuY2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0ZJTEVfRVhUID0gIndzaWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRVhUID0gIndzZGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXU0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCXB1YmxpYyBXU0REQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdzZGRSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICovCi0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXc2RkUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZwotCSAqIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoZ2V0V2ViU2VydmljZXNYbWxSZXNvdXJjZVVSSSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgd3NEREVkaXQgPSBuZXcgV1NEREFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQl3c0RERWRpdC5jcmVhdGVNb2RlbFJvb3QodmVyc2lvbik7Ci0JCQl3c0RERWRpdC5zYXZlKG51bGwpOwotCQl9IGZpbmFsbHkgeyAgLy8gTWFrZSBzdXJlIG5ldyByZXNvdXJjZSBpcyByZW1vdmVkICAtIHRoZSB1cmkgdXNlZCBmb3IgY3JlYXRpb24gc2hvdWxkbid0IGJlIGNhY2hlZAotCQkJUmVzb3VyY2UgbmV3UmVzID0gd3NEREVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpLmdldFJlc291cmNlcygpLnJlbW92ZShuZXdSZXMpOwotCQkJbmV3UmVzLnVubG9hZCgpOwotCQkJd3NEREVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFVSSSBnZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlVVJJKCkgewotCi0JCVVSSSByZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX1dFQl9JTkZfRERfVVJJX09CSjsKLQkJaWYgKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoZ2V0Q29tcG9uZW50KCkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKOwotCQllbHNlIGlmIChpc1ZhbGlkRUpCTW9kdWxlKGdldENvbXBvbmVudCgpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJX09CSjsKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCkgewotCQlpZiAoIWdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlcykgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlCi0JICogV3NkZFJlc291cmNlLiBJZiB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQKLQkgKiAoQGxpbmsgYWRkRUpCSmFySWZOZWNlc3NhcnkoZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKSkpLiBUaGUgcm9vdCBvYmplY3QKLQkgKiBjb250YWlucyBhbGwgb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShnZXRXc2RkWG1pUmVzb3VyY2UoKSk7Ci0JCWlmIChjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMKLQkgKiB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkoV3NkZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVdlYlNlcnZpY2VzIHdzID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzKTsKLQkJCX0KLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpOwotCQlpZiAoY29tcCAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGNvbXApKSB7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpOwotCQlpZiAoY29tcCAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGNvbXApKSB7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCWlmIChhTW9kdWxlICE9IG51bGwgJiYgaXNWYWxpZFdTRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBFSkJBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NERE1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBuZXcgV1NEREFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRUpCTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRXU0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlCi0JICogICAgICAgICBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIChpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKGFDb21wb25lbnQpIHx8IGlzVmFsaWRXZWJNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZEVKQk1vZHVsZShhQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCVdzZGRSZXNvdXJjZSByZXMgPSAoV3NkZFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkocmVzKTsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzKCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0Q29udGVudE1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V1NJTFJlc291cmNlcygpIHsKLQkJZmluYWwgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJdHJ5IHsKLQkJCWdldFByb2plY3QoKS5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCQkKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZihwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoV1NJTF9GSUxFX0VYVCkpIHsKLQkJCQkJCUlSZXNvdXJjZSBmaWxlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCQkJaWYgKHZSZXNvdXJjZXMubGVuZ3RoID4gMCAmJiAhcmVzdWx0LmNvbnRhaW5zKGZpbGUpKQotCQkJCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJfSwgSVJlc291cmNlLk5PTkUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdlYlNlcnZpY2VQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZXMoV1NETF9GSUxFX0VYVCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJlc291cmNlcyhTdHJpbmcgZXh0KSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpLmZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmIHJlcy5nZXRVUkkoKS5maWxlRXh0ZW5zaW9uKCkuZXF1YWxzKGV4dCkpCi0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBXU0RMUmVzb3VyY2UgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0V3NkbFJlc291cmNlKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKXJldHVybiBudWxsOyAvLyROT04tTkxTLTEkCi0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkocGF0aCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiBzZXJ2aWNlSGVscGVyICE9IG51bGwgJiYgc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShyZXMpKQotCQkJcmV0dXJuIHJlczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0KLQkvLyBbMTgyNDE3XSBUaGlzIEFydGlmYWN0RWRpdCB3b3JrcyBmb3IgYWxsIHByb2plY3QgdmVyc2lvbnMsIHNvIGp1c3QgcmV0dXJuIHRydWUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSkpOwotCQl0cnl7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCWlmKCBnZXRXcml0YWJsZUVkaXQoKSAhPSBudWxsICl7Ci0JCQkJLy8gQWx3YXlzIHNhdmUgcmVnYXJkbGVzcyBvZiByZXNvdXJjZSBwYXRoIHBhc3NlZCAtIEFydGlmYWN0ZWRpdHMgc2F2ZSByZXNvdXJjZXMgYXMgYSB1bml0Ci0JCQkJZ2V0V3JpdGFibGVFZGl0KCkuc2F2ZUlmTmVjZXNzYXJ5KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsgLy9Qcm9wZXJseSBkaXNwb3NlIHRoZSB3cml0ZSBhcnRpZmFjdCBlZGl0Ci0JCQlnZXRXcml0YWJsZUVkaXQoKS5kaXNwb3NlKCk7Ci0JCQlzZXRXcml0YWJsZUVkaXQobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9BVEtVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9BVEtVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUNvbnN0YW50cyB7Ci0JLy8gaW5pdC1wYXJhbQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEluaXRQYXJhbU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJbml0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfVkFMVUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfREVTQ1JJUFRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBRTmFtZQotCXByaXZhdGUgU3RyaW5nIERFRkFVTFRfUFJFRklYID0gInBmeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRVVSSSA9ICJOYW1lc3BhY2VVUkkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9MT0NBTFBBUlQgPSAiTG9jYWxQYXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0UHJlZml4KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX1BSRUZJWCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX05BTUVTUEFDRVVSSSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0TG9jYWxQYXJ0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX0xPQ0FMUEFSVCk7Ci0JfQotCi0JLy8gc29hcCByb2xlCi0JcHVibGljIFN0cmluZyBkZWZhdWx0U09BUFJvbGUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX1NPQVBfUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHBvcnQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9QT1JUX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvL3BvcnQgY29tcG9uZW50Ci0JcHVibGljIFN0cmluZyBkZWZhdWx0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZygiamF2YS5ybWkuUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vIHBvcnQgY29tcG9uZW50IHJlZgotCXB1YmxpYyBKYXZhQ2xhc3MgZGVmYXVsdENsaWVudFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5ybWkuUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQb3J0Q29tcG9uZW50TGluaygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfUE9SVF9DT01QT05FTlRfTElOSyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHNlcnZpY2UtcmVmCi0JcHVibGljIFNlcnZpY2VSZWYgZGVmYXVsdFNlcnZpY2VSZWYoKSB7Ci0JCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpOwotCQlzZXJ2aWNlUmVmLnNldFNlcnZpY2VSZWZOYW1lKGRlZmF1bHRTZXJ2aWNlUmVmTmFtZSgpKTsKLQkJc2VydmljZVJlZi5zZXRTZXJ2aWNlSW50ZXJmYWNlKGRlZmF1bHRTZXJ2aWNlSW50ZXJmYWNlKCkpOwotCQlyZXR1cm4gc2VydmljZVJlZjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigic2VydmljZS8iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlX1VJX1NlcnZpY2VSZWZfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGRlZmF1bHRTZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZheC54bWwucnBjLlNlcnZpY2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHBvcnQgY29tcG9uZW50IG5hbWUKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHNlcnZpY2UgaW1wbCBiZWFuCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbiBkZWZhdWx0U2VydmljZUltcGxCZWFuKCkgewotCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpOwotCQlzZXJ2aWNlSW1wbEJlYW4uc2V0RVNlcnZsZXRMaW5rKGRlZmF1bHRTZXJ2bGV0TGluaygpKTsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbjsKLQl9Ci0KLQkvLyBzZXJ2bGV0IGxpbmsKLQlwdWJsaWMgU2VydmxldExpbmsgZGVmYXVsdFNlcnZsZXRMaW5rKCkgewotCQlTZXJ2bGV0TGluayBzZXJ2bGV0TGluayA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0TGluaygpOwotCQlzZXJ2bGV0TGluay5zZXRTZXJ2bGV0TGluayhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9TRVJWTEVUX0xJTksiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNlcnZsZXRMaW5rOwotCX0KLQotCS8vIFdTREwgcG9ydAotCXB1YmxpYyBXU0RMUG9ydCBkZWZhdWx0V1NETFBvcnQoaW50IHZlcnNpb25JRCkgewotCQlXU0RMUG9ydCB3c2RscG9ydCA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpOwotCQlRTmFtZUhlbHBlci5zZXRRTmFtZVZhbHVlKHdzZGxwb3J0LCBkZWZhdWx0TmFtZXNwYWNlVVJJKCksIGRlZmF1bHRMb2NhbFBhcnQoKSwgZGVmYXVsdFByZWZpeCgpLCB2ZXJzaW9uSUQpOwotCQlyZXR1cm4gd3NkbHBvcnQ7Ci0JfQotCi0JLy8gcG9ydCBjb21wb25lbnQKLQlwdWJsaWMgUG9ydENvbXBvbmVudCBkZWZhdWx0UG9ydENvbXBvbmVudChpbnQgdmVyc2lvbklEKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50KCk7Ci0JCXBvcnRDb21wb25lbnQuc2V0UG9ydENvbXBvbmVudE5hbWUoZGVmYXVsdFBvcnRDb21wb25lbnROYW1lKCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFdzZGxQb3J0KGRlZmF1bHRXU0RMUG9ydCh2ZXJzaW9uSUQpKTsKLQkJcG9ydENvbXBvbmVudC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoZGVmYXVsdFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLQkJcG9ydENvbXBvbmVudC5zZXRTZXJ2aWNlSW1wbEJlYW4oZGVmYXVsdFNlcnZpY2VJbXBsQmVhbigpKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnQ7Ci0JfQotCi0JLy8gSkFYIFJQQyBtYXBwaW5nCi0JcHVibGljIFN0cmluZyBkZWZhdWx0SmF4UnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCJqYXhycGNtYXBwaW5nLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTIwN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0luZm9wb3BDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW5mb3BvcENvbnN0YW50cyB7Ci0KLQkvKiogKioqKioqKioqKioqKioqKioqKioqKioqKkluZm9wb3BzIGZvciBwYWdlcyoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VzUGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudFBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTSGFuZGxlclBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VSZWZQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTUkhhbmRsZXJQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0JLyoqICoqKioqKioqKioqKioqKioqKioqKioqKipJbmZvcG9wcyBmb3Igc2VjdGlvbnMqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcERlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAxIGZvciB0aGUgZGVzY3JpcHRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wRGlzcGxheU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDIgZm9yIHRoZSBkaXNwbGF5IG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU21hbGxJY29uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAzIGZvciB0aGUgc21hbGwgaWNvbiBkaXNwbGF5ICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BMYXJnZUljb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDQgZm9yIHRoZSBsYXJnZSBpY29uIGRpc3BsYXkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDUgZm9yIHRoZSBXZWIgc2VydmljZSBkZXNjcmlwdGlvbiBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA2IGZvciB0aGUgV1NETCBmaWxlIGxvY2F0aW9uIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcEpBWFJQQ01hcHBpbmdGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA3IGZvciB0aGUgSkFYLVJQQyBtYXBwaW5nIGZpbGUgbG9jYXRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudE5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDggZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExQb3J0TmFtZXNwYWNlVVJJKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA5IGZvciB0aGUgV1NETCBwb3J0IG5hbWVzcGFjZSBVUkkgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETFBvcnRMb2NhbHBhcnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTAgZm9yIHRoZSBXU0RMIHBvcnQgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMTEgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MgbmFtZSB0ZXh0Ci0JCSAqIGZpZWxkCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUltcGxCZWFuKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDEyIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBjbGFzcyBuYW1lIHRleHQKLQkJICogZmllbGQKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BFSkJMaW5rKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDEzIGZvciB0aGUgdXNlIEVKQiBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmxldExpbmsoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTQgZm9yIHRoZSB1c2Ugc2VydmxldCBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlck5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTUgZm9yIHRoZSBoYW5kbGVyIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlckNsYXNzKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE2IGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIGhhbmRsZXIgY2xhc3MgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNyBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUludGVyZmFjZU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTggZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZU5hbWVzcGFjZVVSSSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxOSBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbmFtc3BhY2UgVVJJIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZUxvY2FscGFydCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyMCBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BDb21ib1dlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAyMSBmb3IgdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIGRyb3AtZG93biAobGlzdCBvZiBXZWIgc2VydmljZQotCQkgKiBkZXNjcmlwdGlvbnMpCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9Qb3J0Q29tcG9uZW50KCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDIyIGZvciB0aGUgcG9ydCBjb21wb25lbnQgZHJvcC1kb3duIChsaXN0IG9mIHBvcnQgY29tcG9uZW50cykgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDIzIGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UgZHJvcC1kb3duIChsaXN0IG9mIGNvbXBvbmVudAotCQkgKiBzY29wZWQgcmVmZXJlbmNlKQotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvU2VydmljZVJlZigpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyNCBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGRyb3AtZG93biAobGlzdCBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMpICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI1IGZvciB0aGUgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXMueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjYgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSGFuZGxlcldTKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI3IGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDI4IGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUKLQkJICogd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25TZXJ2aWNlUmVmKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI5IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzAgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sCi0JCSAqIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25IYW5kbGVyV1NDKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDMxIGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSW5pdFBhcmFtcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMiBmb3IgdGhlIGluaXRpYWwgcGFyYW1ldGVyIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uU09BUEhlYWRlcnMoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzMgZm9yIHRoZSBTT0FQIGhlYWRlciBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblNPQVBSb2xlcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzNCBmb3IgdGhlIFNPQVAgcm9sZSBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnROYW1lcygpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAzNSBmb3IgdGhlIHBvcnQgbmFtZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BSZXNvdXJjZVRyZWUoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzYgZm9yIHRoZSBwb3B1cCBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcmVzb3VyY2UgaW4gdGhlCi0JCSAqIHdvcmtiZW5jaAotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDM2IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWIxN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gaGVscCBuYXZpZ2F0ZSBXU0RMIGZpbGVzIHByb3ZpZGVkIGluIHZhcmlvdXMgSlNSLTEwOSBkZXNjcmlwdG9ycwotICovCi1wdWJsaWMgY2xhc3MgV1NETEhlbHBlciB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2o7Ci0KLQlwdWJsaWMgV1NETEhlbHBlcihJUHJvamVjdCBhUHJvamVjdCkgewotCQl0aGlzLnByb2ogPSBhUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsaXN0IG9mIHdzZGw6cG9ydEBuYW1lJ3MgY29udGFpbmVkIGluIHRoZSBXU0RMIGZpbGUgcmVmZXJyZWQgdG8gYnkKLQkgKiB0aGUgc3BlY2lmaWVkIDxzZXJ2aWNlLXJlZj4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZVJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8c2VydmljZS1yZWY+Ci0JICogQHBhcmFtIGNvbXBTY29wZWRSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPGNvbXBvbmVudC1zY29wZWQtcmVmcz4KLQkgKiBAcGFyYW0gd3NjCi0JICogICAgICAgICAgICBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGV4Y2x1ZGUKLQkgKiAgICAgICAgICAgIHBvcnQgbmFtZXMgdG8gZXhjbHVkZSBpbiB0aGUgcmV0dXJuZWQgYXJyYXkKLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lcydzLiBudWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMKLQkgKiAgICAgICAgIHdpdGggbmF2aWdhdGluZyB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIG9yIHRoZSBXU0RMLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3J0TmFtZXMoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYywgU3RyaW5nW10gZXhjbHVkZSkgewotCQlTZXJ2aWNlUmVmIHNyID0gZ2V0U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHdzZGxVUkwgPSBnZXRXU0RMRmlsZVVSTChzcik7Ci0JCWlmICh3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgc2VydmljZUxvY2FsTmFtZSA9IGdldFNlcnZpY2VRbmFtZShzcik7Ci0JCVN0cmluZ1tdIHBvcnROYW1lcyA9IGdldFBvcnROYW1lcyh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQkJcG9ydE5hbWVzID0gdHJpbShwb3J0TmFtZXMsIGV4Y2x1ZGUpOwotCQlyZXR1cm4gcG9ydE5hbWVzOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSB3c2RsOnNlcnZpY2UgaW4gV1NETCBmaWxlIHJlZmVycmVkIHRvIGJ5IHRoZQotCSAqIHNwZWNpZmllZCA8c2VydmljZS1yZWY+Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2VSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPHNlcnZpY2UtcmVmPgotCSAqIEBwYXJhbSBjb21wU2NvcGVkUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxjb21wb25lbnQtc2NvcGVkLXJlZnM+Ci0JICogQHBhcmFtIHdzYwotCSAqICAgICAgICAgICAgVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBleGNsdWRlCi0JICogICAgICAgICAgICBwb3J0IG5hbWVzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybmVkIGFycmF5Ci0JICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWVzcGFjZSBvZiB0aGUgd3NkbDpzZXJ2aWNlLiBudWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMKLQkgKiAgICAgICAgIHdpdGggbmF2aWdhdGluZyB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIG9yIHRoZSBXU0RMLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWVzcGFjZShTdHJpbmcgc2VydmljZVJlZk5hbWUsIFN0cmluZyBjb21wU2NvcGVkUmVmTmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjKSB7Ci0JCVNlcnZpY2VSZWYgc3IgPSBnZXRTZXJ2aWNlUmVmKHNlcnZpY2VSZWZOYW1lLCBjb21wU2NvcGVkUmVmTmFtZSwgd3NjKTsKLQkJaWYgKHNyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgd3NkbFVSTCA9IGdldFdTRExGaWxlVVJMKHNyKTsKLQkJaWYgKHdzZGxVUkwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lID0gZ2V0U2VydmljZVFuYW1lKHNyKTsKLQkJU3RyaW5nIG5hbWVzcGFjZSA9IGdldFBvcnROYW1lc3BhY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGlzdCBvZiB3c2RsOnBvcnRAbmFtZSdzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHdzZGw6c2VydmljZSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgV1NETCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3c2RsVVJMCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIHRoZSBXU0RMIGZpbGUuCi0JICogQHBhcmFtIHNlcnZpY2VMb2NhbE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgdG8gbG9vayBpbi4KLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lJ3MuIE51bGwgaXMgcmV0dXJuZWQgYSB3c2RsOnNlcnZpY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBsb2NhbCBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGdldFBvcnROYW1lcyhTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gZ2V0VGFyZ2V0U2VydmljZSh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQotCQlpZiAodGFyZ2V0U2VydmljZSA9PSBudWxsKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0UG9ydE5hbWVzIC4uLiB0YXJnZXRTZXJ2aWNlIG51bGwuIik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCBwb3J0cyA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHRhcmdldFNlcnZpY2UpOwotCQlpbnQgbnVtYmVyT2ZQb3J0cyA9IHBvcnRzLnNpemUoKTsKLQkJU3RyaW5nW10gcG9ydE5hbWVzID0gbmV3IFN0cmluZ1tudW1iZXJPZlBvcnRzXTsKLQkJSXRlcmF0b3IgayA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IG0gPSAwOyBtIDwgbnVtYmVyT2ZQb3J0czsgbSsrKSB7Ci0JCQlPYmplY3QgcG9ydCA9IGsubmV4dCgpOwotCQkJcG9ydE5hbWVzW21dID0gc2VydmljZUhlbHBlci5nZXRQb3J0TmFtZShwb3J0KTsKLQkJfQotCi0JCXJldHVybiBwb3J0TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgd3NkbDpzZXJ2aWNlIGluIHRoZSBzcGVjaWZpZWQgV1NETCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3c2RsVVJMCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIHRoZSBXU0RMIGZpbGUuCi0JICogQHBhcmFtIHNlcnZpY2VMb2NhbE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgdG8gbG9vayBpbi4KLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lJ3MuIEFuIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZCBpZiBhIHdzZGw6c2VydmljZQotCSAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBvcnROYW1lc3BhY2UoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gZ2V0VGFyZ2V0U2VydmljZSh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQotCQlpZiAodGFyZ2V0U2VydmljZSA9PSBudWxsKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0UG9ydE5hbWVzcGFjZSAuLi4gdGFyZ2V0U2VydmljZSBudWxsLiIpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKS5nZXRTZXJ2aWNlTmFtZXNwYWNlVVJJKHRhcmdldFNlcnZpY2UpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldFRhcmdldFNlcnZpY2UoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlPYmplY3QgZGVmaW5pdGlvbiA9IGdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gbnVsbDsKLQkJTWFwIHNlcnZpY2VzID0gc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmaW5pdGlvbik7Ci0JCWlmICghc2VydmljZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoKHNlcnZpY2VMb2NhbE5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTG9jYWxOYW1lLmxlbmd0aCgpID09IDApICYmIHNlcnZpY2VzLnNpemUoKSA+IDEpIC8vTXVsdGlwbGUKLQkJCS8vIHNlcnZpY2VzCi0JCQkvLyB3aXRob3V0Ci0JCQkvLyBvbmUKLQkJCS8vIGRlc2lnbmF0ZWQKLQkJCS8vIGlzCi0JCQkvLyBhbgotCQkJLy8gZXJyb3IKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwgfHwgc2VydmljZUxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSAmJiBzZXJ2aWNlcy5zaXplKCkgPT0gMSkgewotCQkJCS8vUmV0dXJuIHRoZSBwb3J0IG5hbWVzIGluIHRoZSBvbmUgc2VydmljZQotCQkJCUl0ZXJhdG9yIGkgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXRhcmdldFNlcnZpY2UgPSBpLm5leHQoKTsKLQkJCX0gZWxzZSAvL1RoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyBidXQgb25lIGlzIGRlc2lnbmF0ZWQKLQkJCXsKLQkJCQlJdGVyYXRvciBqID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHNlcnZpY2UgPSBqLm5leHQoKTsKLQkJCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlTG9jYWxQYXJ0KHNlcnZpY2UpOwotCQkJCQlpZiAoc2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2VMb2NhbE5hbWUpKSB7Ci0JCQkJCQl0YXJnZXRTZXJ2aWNlID0gc2VydmljZTsKLQkJCQkJCWJyZWFrOyAvL0ZvdW5kIGEgbWF0Y2guIEJyZWFrIG91dCBvZiBsb29wLiBXZSBtdXN0IGJlIGFzc3VtaW5nIHVuaXF1ZSBuYW1lcwotCQkJCQkJLy8gb24gc2VydmljZXMuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGFyZ2V0U2VydmljZTsKLQotCX0KLQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkwpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCXJldHVybiBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQkKLQkJLyp0cnkgewotCQkJV1NETFJlc291cmNlSW1wbCByZXMgPSAoV1NETFJlc291cmNlSW1wbCkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkod3NkbFVSTCksIHRydWUpOwotCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHJlcy5nZXREZWZpbml0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB3c2RsZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0qLwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgVVJMIG9mIHRoZSA8d3NkbC1maWxlPnNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gPHNlcnZpY2UtcmVmPi4gUmV0dXJucyBhIGJsYW5rCi0JICogU3RyaW5nIGlmIDx3c2RsLWZpbGU+aXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcHJvdmlkZWQgPHNlcnZpY2UtcmVmPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFdTRExGaWxlVVJMKFNlcnZpY2VSZWYgc3IpIHsKLQkJU3RyaW5nIHdzZGxGaWxlUmVsUGF0aCA9IHNyLmdldFdzZGxGaWxlKCk7Ci0JCWlmICh3c2RsRmlsZVJlbFBhdGggPT0gbnVsbCB8fCB3c2RsRmlsZVJlbFBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEdldCBhIGhhbmRsZSBvbiB0aGUgV1NETCBmaWxlLgotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbEZvbGRlciBtb2R1bGVSb290ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJSUZpbGUgd3NkbEZpbGUgPSBtb2R1bGVSb290LmdldEZpbGUod3NkbEZpbGVSZWxQYXRoKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJaWYgKCF3c2RsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy9HZXQgdGhlIGZpbGVVUkwgZnJvbSB3c2RsRmlsZQotCQkJU3RyaW5nIHdzZGxVUkw7Ci0JCQl0cnkgewotCQkJCXdzZGxVUkwgPSB3c2RsRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAod3NkbFVSTCA9PSBudWxsIHx8IHdzZGxVUkwubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB3c2RsVVJMOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIDxzZXJ2aWNlLXFuYW1lPnNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gPHNlcnZpY2UtcmVmPi4gUmV0dXJucyBhCi0JICogYmxhbmsgU3RyaW5nIGlmIDxzZXJ2aWNlLXFuYW1lPmlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkIDxzZXJ2aWNlLXJlZj4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlUW5hbWUoU2VydmljZVJlZiBzcikgewotCQlRTmFtZSBzZXJ2aWNlUW5hbWUgPSBzci5nZXRTZXJ2aWNlUW5hbWUoKTsKLQkJaWYgKHNlcnZpY2VRbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUgPSBzZXJ2aWNlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0JCWlmIChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gc2VydmljZUxvY2FsTmFtZTsKLQl9Ci0KLQkvKiBJZiBjb21wU2NvcGVkUmVmTmFtZSBpcyBlbXB0eSBvciBudWxsLCB3ZSBtYXkgaGF2ZSB0byBjaGVjayBhbGwgb2YgdGhlbS4gKi8KLQlwdWJsaWMgU2VydmljZVJlZiBnZXRTZXJ2aWNlUmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYykgewotCQlJdGVyYXRvciBzZXJ2aWNlUmVmczsKLQkJaWYgKGNvbXBTY29wZWRSZWZOYW1lICE9IG51bGwgJiYgY29tcFNjb3BlZFJlZk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlDb21wb25lbnRTY29wZWRSZWZzIGNzciA9IGdldENvbXBTY29wZWRSZWYoY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCQlzZXJ2aWNlUmVmcyA9IGNzci5nZXRTZXJ2aWNlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IHdzYy5nZXRTZXJ2aWNlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCQkvL0lmIHRoZXJlIGFyZSBubyBzZXJ2aWNlIHJlZnMgLi4uIGNoZWNrIGFsbCBjb21wb25lbnQtc2NvcGVkLXJlZnMgZm9yIHRoZSBzZXJ2aWNlLXJlZgotCQkJaWYgKCFzZXJ2aWNlUmVmcy5oYXNOZXh0KCkpIHsKLQkJCQlJdGVyYXRvciBjc1JlZnMgPSB3c2MuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLml0ZXJhdG9yKCk7Ci0KLQkJCQl3aGlsZSAoY3NSZWZzLmhhc05leHQoKSkgewotCQkJCQlDb21wb25lbnRTY29wZWRSZWZzIGNzciA9IChDb21wb25lbnRTY29wZWRSZWZzKSBjc1JlZnMubmV4dCgpOwotCQkJCQlJdGVyYXRvciBzcnMgPSBjc3IuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoc3JzLmhhc05leHQoKSkgewotCQkJCQkJU2VydmljZVJlZiBzciA9IChTZXJ2aWNlUmVmKSBzcnMubmV4dCgpOwotCQkJCQkJU3RyaW5nIHRoaXNOYW1lID0gc3IuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCQkJCWlmICh0aGlzTmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCQlyZXR1cm4gc3I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsgLy9Db3VsZCBub3QgZmluZCBpdCBpbiBhbnkgb2YgdGhlIGNvbXBvbmVudC1zY29wZWQtcmVmcwotCQkJfQotCi0JCX0KLQotCQl3aGlsZSAoc2VydmljZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgc2VydmljZVJlZnMubmV4dCgpOwotCQkJU3RyaW5nIHNlcnZpY2VSZWZOYW1lID0gc2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQkJaWYgKHNlcnZpY2VSZWZOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gc2VydmljZVJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ29tcG9uZW50U2NvcGVkUmVmcyBnZXRDb21wU2NvcGVkUmVmKFN0cmluZyBuYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MpIHsKLQkJSXRlcmF0b3IgY29tcFNjb3BlZFJlZnMgPSB3c2MuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb21wU2NvcGVkUmVmcy5oYXNOZXh0KCkpIHsKLQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgY29tcFNjb3BlZFJlZiA9IChDb21wb25lbnRTY29wZWRSZWZzKSBjb21wU2NvcGVkUmVmcy5uZXh0KCk7Ci0JCQlTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUgPSBjb21wU2NvcGVkUmVmLmdldENvbXBvbmVudE5hbWUoKTsKLQkJCWlmIChjb21wU2NvcGVkUmVmTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIGNvbXBTY29wZWRSZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nW10gdHJpbShTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZ1tdIGV4Y2x1ZGUpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCB8fCBleGNsdWRlID09IG51bGwgfHwgZXhjbHVkZS5sZW5ndGggPT0gMCkgLy9ubwotCQkJLy8gY2hhbmdlCi0JCQkvLyByZXF1aXJlZC4KLQkJCS8vIHJldHVybgotCQkJLy8gYXMKLQkJCS8vIGlzLgotCQkJcmV0dXJuIHZhbHVlczsKLQotCQlTdHJpbmdbXSBmaW5hbFZhbHVlczsKLQkJQXJyYXlMaXN0IGZpbmFsTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghY29udGFpbnMoZXhjbHVkZSwgdmFsdWVzW2ldKSkgewotCQkJCWZpbmFsTGlzdC5hZGQodmFsdWVzW2ldKTsKLQkJCX0KLQkJfQotCi0JCWludCBmaW5hbFNpemUgPSBmaW5hbExpc3Quc2l6ZSgpOwotCQlmaW5hbFZhbHVlcyA9IG5ldyBTdHJpbmdbZmluYWxTaXplXTsKLQkJT2JqZWN0W10gZmluYWxBcnJheSA9IGZpbmFsTGlzdC50b0FycmF5KCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZmluYWxTaXplOyBqKyspIHsKLQkJCWZpbmFsVmFsdWVzW2pdID0gKFN0cmluZykgKGZpbmFsQXJyYXlbal0pOwotCQl9Ci0KLQkJcmV0dXJuIGZpbmFsVmFsdWVzOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBvZiBTdHJpbmcncyBjb250YWlucyB0aGUgc3BlY2lmaWVkIFN0cmluZy4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZyBzKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHZhbHVlc1tpXS5lcXVhbHMocykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMU2VydmljZUhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQyZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VIZWxwZXJJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlSGVscGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9IAotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRQb3J0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoT2JqZWN0IHBvcnQpIHsKLQkJUG9ydCBhUG9ydCA9IChQb3J0KXBvcnQ7Ci0JCXJldHVybiBhUG9ydC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVBvcnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXRTZXJ2aWNlUG9ydHMoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZU5hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVzcGFjZVVSSShPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShPYmplY3QgYVBvcnQpIHsKLQkJUG9ydCBwb3J0ID0gKFBvcnQpYVBvcnQ7Ci0JCXJldHVybiBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VMb2NhbFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uU2VydmljZXMoT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9KERlZmluaXRpb24pYURlZmluaXRpb247Ci0JCXJldHVybiBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlXU0RMUmVzb3VyY2VJbXBsIHJlcyA9IChXU0RMUmVzb3VyY2VJbXBsKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh3c2RsVVJMKSwgdHJ1ZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcmVzLmdldERlZmluaXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHdzZGxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdTRExEZWZpbml0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFJlc291cmNlIHdzZGxSZXNvdXJjZSkgewotCQlyZXR1cm4gKChXU0RMUmVzb3VyY2VJbXBsKXdzZGxSZXNvdXJjZSkuZ2V0RGVmaW5pdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSBwYXJzZVdzaWxGaWxlKHdzaWwpOwotCQlpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV1NETCByZWZlcmVuY2VzIGZyb20gdGhlIFdTSUwgZW50aXR5Ci0JCQlMaXN0IHdzZGxMaXN0ID0gZW50aXR5LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpIHsKLQkJCQkJaWYgKCgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSAhPSBudWxsICYmICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkJCQkJCURlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiAhZGVmLmdldFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQkJCXJlc3VsdC5hZGRBbGwoZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlRW50aXR5IHBhcnNlV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JU3RyaW5nIHVybCA9IG51bGw7Ci0JLy8gdmVyaWZ5IHByb3BlciBpbnB1dAotCWlmICh3c2lsID09IG51bGwgfHwgIXdzaWwuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCXJldHVybiBudWxsOwotCS8vIFBhcnNlIHdzaWwgZmlsZSB0byBnZXQgd3NkbCBzZXJ2aWNlcwotCXRyeSB7Ci0JCXVybCA9IHdzaWwuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCXBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcih1cmwpOwotCQlwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTREwpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vSWdub3JlCi0JfQotCWlmIChwYXJzZXIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkodXJsKTsKLX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZShPYmplY3QgYVNlcnZpY2UpIHsKLQkJCi0JCXJldHVybiBhU2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzV1NETFJlc291cmNlKE9iamVjdCBhUmVzb3VyY2UpIHsKLQkJCi0JCXJldHVybiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCQotCQlyZXR1cm4gYURlZmluaXRpb24gaW5zdGFuY2VvZiBEZWZpbml0aW9uOwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFT2JqZWN0IGoyZWVPYmplY3QpIHsKLQkJaWYgKGoyZWVPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkKLQkJCXJldHVybiBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXQxM1NlcnZpY2VSZWZzKChBcHBsaWNhdGlvbkNsaWVudClqMmVlT2JqZWN0KTsKLQkJZWxzZSBpZiAoajJlZU9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKEVudGVycHJpc2VCZWFuKWoyZWVPYmplY3QpOwotCQllbHNlIGlmIChqMmVlT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKFdlYkFwcClqMmVlT2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MzMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VFdmVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAwOwotCQotCXByaXZhdGUgaW50IGV2ZW50VHlwZSA9IDA7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VFdmVudChpbnQgYW5FdmVudFR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJZXZlbnRUeXBlID0gYW5FdmVudFR5cGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWRjYWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHdlYlNlcnZpY2VNYW5hZ2VyQ2hhbmdlZChXZWJTZXJ2aWNlRXZlbnQgYW5FdmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlc01hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWIxNGE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTQ0REQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTRERBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc01hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3NBcnRpZmFjdEVkaXRzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgd3NDbGllbnRBcnRpZmFjdEVkaXRzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIExpc3Qgd3NBcnRpZmFjdEVkaXRzTGlzdDsKLQlwcml2YXRlIExpc3Qgd3NDbGllbnRBcnRpZmFjdEVkaXRzTGlzdDsKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc01hbmFnZXIgSU5TVEFOQ0UgPSBudWxsOwotCXByaXZhdGUgTGlzdCBsaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBMaXN0IHJlbW92ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzTm90aWZ5aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHdzQ2xpZW50RWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gd3NFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgcHJvY2Vzc05ld1Byb2plY3RzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0VYVCA9ICJ3c2lsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgV2ViU2VydmljZXNNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkKLQkJCUlOU1RBTkNFID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyAgYm9vbGVhbiBpc0ZpbGVJbnRlcmVzdGluZyhJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCXJldHVybiBleHRlbnNpb24uZXF1YWxzKFdTRExfRVhUKSB8fCBleHRlbnNpb24uZXF1YWxzKFdTSUxfRVhUKSAKLQkJCXx8IGFGaWxlLmdldE5hbWUoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSkgCi0JCQl8fCBhRmlsZS5nZXROYW1lKCkuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0REX1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQljb2xsZWN0QXJ0aWZhY3RFZGl0cygpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBcnRpZmFjdEVkaXQoSVByb2plY3QgaGFuZGxlKSB7Ci0JCXN5bmNocm9uaXplZCh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCWlmICghd3NBcnRpZmFjdEVkaXRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQlXU0REQXJ0aWZhY3RFZGl0IGVkaXQgPSBXU0REQXJ0aWZhY3RFZGl0LmdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKGhhbmRsZSk7Ci0JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IGVkaXQuZ2V0V2ViU2VydmljZXMoKTsKLQkJCQkJLy8gSWYgdGhlIHByb2plY3QgaGFzIGEgd2Vic2VydmljZS54bWwgd2l0aCBpbnRlcm5hbCBzZXJ2aWNlcyBvciAKLQkJCQkJLy8gaXQgaGFzIC53c2lsIGZpbGVzIHdpdGggZXh0ZXJuYWwgc2VydmljZXMsIHdlIGNhY2hlIHRoZSBhcnRpZmFjdCBlZGl0Ci0JCQkJCWlmICgod2ViU2VydmljZXMgIT0gbnVsbCAmJiAhd2ViU2VydmljZXMuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgfHwgIWVkaXQuZ2V0V1NJTFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJCQkJZWRpdC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCXdzQXJ0aWZhY3RFZGl0cy5wdXQoaGFuZGxlLCBlZGl0KTsKLQkJCQkJCXdzRWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJLy8gT3RoZXJ3aXNlLCBkaXNwb3NlIHRoZSBhcnRpZmFjdCBlZGl0Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKCF3c0NsaWVudEFydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCVdTQ0REQXJ0aWZhY3RFZGl0IGVkaXQgPSBXU0NEREFydGlmYWN0RWRpdC5nZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQoaGFuZGxlKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQkJCWJvb2xlYW4gaXNJbnRlcmVzdGVkID0gZmFsc2U7Ci0JCQkJCS8vIERvZXMgdGhlIHByb2plY3QgaGF2ZSAxLjMgd2ViIHNlcnZpY2UgY2xpZW50cz8KLQkJCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpCi0JCQkJCQlpc0ludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkKLQkJCQkJLy8gRG9lcyB0aGUgcHJvamVjdCBoYXZlIDEuNCB3ZWIgc2VydmljZSBjbGllbnRzPwotCQkJCQlMaXN0IHdzQ2xpZW50RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXdzQ2xpZW50RWRpdHMuYWRkKGVkaXQpOwotCQkJCQkvL2lmICghZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcyh3c0NsaWVudEVkaXRzKS5pc0VtcHR5KCkpCi0JCQkJCQlpc0ludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkKLQkJCQkJLy8gSWYgcHJvamVjdCBoYXMgMS4zIG9yIDEuNCB3ZWIgc2VydmljZSBjbGllbnRzLCBjYWNoZSB0aGUgYXJ0aWZhY3QgZWRpdAotCQkJCQlpZiAoaXNJbnRlcmVzdGVkKSB7Ci0JCQkJCQllZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLnB1dChoYW5kbGUsIGVkaXQpOwotCQkJCQkJd3NDbGllbnRFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCQkvLyBPdGhlcndpc2UsIGRpc3Bvc2UgdGhlIGFydGlmYWN0IGVkaXQJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGhhbmRsZSkgewotCQlzeW5jaHJvbml6ZWQod3NBcnRpZmFjdEVkaXRzKSB7Ci0JCQlpZiAod3NBcnRpZmFjdEVkaXRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQlBcnRpZmFjdEVkaXQgZWRpdCA9IChBcnRpZmFjdEVkaXQpIHdzQXJ0aWZhY3RFZGl0cy5nZXQoaGFuZGxlKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCXdzQXJ0aWZhY3RFZGl0cy5yZW1vdmUoaGFuZGxlKTsKLQkJCQkJZWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQkJCXdzRWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3luY2hyb25pemVkICh3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0NsaWVudEFydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdCkgd3NDbGllbnRBcnRpZmFjdEVkaXRzLmdldChoYW5kbGUpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLnJlbW92ZShoYW5kbGUpOwotCQkJCQllZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJd3NDbGllbnRFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb2xsZWN0QXJ0aWZhY3RFZGl0cygpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSB8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJCQljb250aW51ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhZGRBcnRpZmFjdEVkaXQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFydGlmYWN0IGVkaXQgaXRlcmF0b3IgZm9yIHdlYiBzZXJ2aWNlIGFydGlmYWN0IGVkaXRzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFdTQXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0VsZW1lbnRzQ2hhbmdlZCkgewotCQkJCXdzQXJ0aWZhY3RFZGl0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd3NBcnRpZmFjdEVkaXRzTGlzdC5hZGRBbGwod3NBcnRpZmFjdEVkaXRzLnZhbHVlcygpKTsKLQkJCQl3c0VsZW1lbnRzQ2hhbmdlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB3c0FydGlmYWN0RWRpdHNMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVkaXRNb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCkgewotCQkJCXdzQ2xpZW50QXJ0aWZhY3RFZGl0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzTGlzdC5hZGRBbGwod3NDbGllbnRBcnRpZmFjdEVkaXRzLnZhbHVlcygpKTsKLQkJCQl3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB3c0NsaWVudEFydGlmYWN0RWRpdHNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChhbkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpPT1FZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSkgewotCQkJTGlzdCByZXNvdXJjZXMgPSBhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQkJaWYgKGlzSW50ZXJlc3RlZEluUmVzb3VyY2UocmVzKSkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkgPT0gRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UpIHsKLQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYW5FdmVudC5nZXRFZGl0TW9kZWwoKTsKLQkJCWlmIChlZGl0TW9kZWwgPT0gbnVsbCB8fCBlZGl0TW9kZWwuZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJcmVtb3ZlQXJ0aWZhY3RFZGl0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCi0JICogCi0JICogQGFuRXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBhbkV2ZW50VHlwZSkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaXNOb3RpZnlpbmcgPSB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlXZWJTZXJ2aWNlRXZlbnQgd2ViU2VydmljZUV2ZW50ID0gbnVsbDsKLQkJCQotCQkJc3dpdGNoIChhbkV2ZW50VHlwZSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRToKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0U6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0U6Ci0JCQkJd2ViU2VydmljZUV2ZW50ID0gbmV3IFdlYlNlcnZpY2VFdmVudChXZWJTZXJ2aWNlRXZlbnQuUkVNT1ZFKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKCFnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSB8fCAhZ2V0QWxsV1NETFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQl3ZWJTZXJ2aWNlRXZlbnQgPSBuZXcgV2ViU2VydmljZUV2ZW50KFdlYlNlcnZpY2VFdmVudC5SRUZSRVNIKTsKLQkJCX0KLQkJCUxpc3QgbGlzdCA9IGdldExpc3RlbmVycygpOwotCQkJaWYgKHdlYlNlcnZpY2VFdmVudCE9bnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkoKFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIpIGxpc3QuZ2V0KGkpKS53ZWJTZXJ2aWNlTWFuYWdlckNoYW5nZWQod2ViU2VydmljZUV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpc05vdGlmeWluZyA9IGZhbHNlOwotCQkJCWlmIChyZW1vdmVkTGlzdGVuZXJzICE9IG51bGwgJiYgIXJlbW92ZWRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZExpc3RlbmVycy5zaXplKCk7IGkrKykKLQkJCQkJCWxpc3RlbmVycy5yZW1vdmUocmVtb3ZlZExpc3RlbmVycy5nZXQoaSkpOwotCQkJCQlyZW1vdmVkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFMaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlpZiAoaXNOb3RpZnlpbmcpCi0JCQkJcmV0dXJuIHJlbW92ZWRMaXN0ZW5lcnMuYWRkKGFMaXN0ZW5lcik7Ci0JCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCkucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlQXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB3c0FydGlmYWN0RWRpdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJd3NBcnRpZmFjdEVkaXRzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN5bmNocm9uaXplZCAod3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gd3NDbGllbnRBcnRpZmFjdEVkaXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJYWNjZXB0RGVsdGEoZXZlbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0RGVsdGEoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkvLyBzZWFyY2ggZm9yIGNoYW5nZXMgdG8gYW55IHByb2plY3RzIHVzaW5nIGEgdmlzaXRvcgotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodGhpcyk7Ci0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIGludGVybmFsIHdlYiBzZXJ2aWNlcyBkZXNjcmlwdGlvbnMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdlYlNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYlNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlID0gKFdlYlNlcnZpY2VzKSB3ZWJTZXJ2aWNlcy5nZXQoaSk7Ci0JCQlpZiAod2ViU2VydmljZSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbGwgaW50ZXJuYWwgd2ViIHNlcnZpY2VzIGluc3RhbmNlcyBpbiB3b3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQXJ0aWZhY3RFZGl0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IGFydGlmYWN0RWRpdC5nZXRXZWJTZXJ2aWNlcygpOwotCQkJaWYgKHdlYlNlcnZpY2VzICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZCh3ZWJTZXJ2aWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGludGVybmFsIHdzZGwgc2VydmljZXMgaW4gd3NkbCdzIHBvaW50ZWQgdG8gYnkgd3NkZCdzCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSB7Ci0JCXJldHVybiBnZXRXU0RMU2VydmljZXNGcm9tV1NETFJlc291cmNlcyhnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXU0RMUmVzb3VyY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3c2RkV2ViU2VydmljZXMgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzRGVzY3JpcHRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NkZFdlYlNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXMgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c2RkV2ViU2VydmljZXMuZ2V0KGkpOwotCQkJUmVzb3VyY2Ugd3NkbCA9IGdldFdTRExSZXNvdXJjZSh3ZWJTZXJ2aWNlcyk7Ci0JCQlpZiAod3NkbCAhPSBudWxsICYmICFyZXN1bHQuY29udGFpbnMod3NkbCkpCi0JCQkJcmVzdWx0LmFkZCh3c2RsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbFdTRExSZXNvdXJjZXMoKSB7Ci0JCQkvL1RPRE8gZml4IHVwIGZvciBiYXNpcyBvZmYgLndzaWwKLQkJCUxpc3QgcmVzdWx0ID0gZ2V0V29ya3NwYWNlV1NETFJlc291cmNlcygpOwotCQkJcmVzdWx0LnJlbW92ZUFsbChnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSk7Ci0JCQlMaXN0IHNlcnZpY2VSZWZzID0gZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZXJ2aWNlUmVmcy5zaXplKCk7IGkrKykgewotCQkJCVNlcnZpY2VSZWYgcmVmID0gKFNlcnZpY2VSZWYpIHNlcnZpY2VSZWZzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShyZWYuZ2V0V3NkbEZpbGUoKSksIHRydWUpOwotCQkJCQlpZiAocmVzICE9bnVsbCAmJiByZXN1bHQuY29udGFpbnMocmVzKSkKLQkJCQkJCXJlc3VsdC5yZW1vdmUocmVzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlSW50ZXJuYWwoRU9iamVjdCBzZXJ2aWNlKSB7Ci0JCXJldHVybiBnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKS5jb250YWlucyhnZXRXU0RMUmVzb3VyY2Uoc2VydmljZSkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXU0RMU2VydmljZXNGcm9tV1NETFJlc291cmNlcyhMaXN0IHdzZGxSZXNvdXJjZXMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2Ugd3NkbCA9IChSZXNvdXJjZSkgd3NkbFJlc291cmNlcy5nZXQoaSk7Ci0JCQlMaXN0IHNlcnZpY2VzID0gZ2V0V1NETFNlcnZpY2VzKHdzZGwpOwotCQkJaWYgKHdzZGwgIT0gbnVsbCAmJiBzZXJ2aWNlcyAhPSBudWxsICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChzZXJ2aWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbFdTRExTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBnZXRXc2RsU2VydmljZXNGcm9tV29ya3NwYWNlV1NJTHMoKTsKLQkJcmVzdWx0LnJlbW92ZUFsbChnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV29ya3NwYWNlV1NJTHMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdzaWxGaWxlcyA9IGdldFdvcmtzcGFjZVdTSUxGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzaWxGaWxlcy5zaXplKCk7IGkrKykgewotCQkJSUZpbGUgd3NpbCA9IChJRmlsZSkgd3NpbEZpbGVzLmdldChpKTsKLQkJCUxpc3Qgc2VydmljZXMgPSBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUod3NpbCk7Ci0JCQlpZiAoIXNlcnZpY2VzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHNlcnZpY2VzKTsKLQkJfQotCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKElGaWxlIHdzaWwpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCXJldHVybiBzZXJ2aWNlSGVscGVyLmdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZSh3c2lsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBXU0RMIFNlcnZpY2VzLCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFsbFdTRExTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0RXh0ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXJlbGVhc2VBcnRpZmFjdEVkaXRzKCk7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0V1NETFJlc291cmNlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHdzZGxGaWxlTmFtZSA9IHdlYlNlcnZpY2UuZ2V0V3NkbEZpbGUoKTsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod2ViU2VydmljZSkpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aD09MCkgcmV0dXJuIHJlczsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTRERBcnRpZmFjdEVkaXQocmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpIAotCQkJcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzZGxSZXNvdXJjZSh3c2RsRmlsZU5hbWUpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIFdTRERBcnRpZmFjdEVkaXQgZ2V0RXhpc3RpbmdXU0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCB3c0VkaXRzID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3c0VkaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgd3NFZGl0cy5nZXQoaSk7Ci0JCQlpZiAoZWRpdCAhPW51bGwgJiYgZWRpdC5nZXRQcm9qZWN0KCkhPSBudWxsICYmIGVkaXQuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQlyZXR1cm4gZWRpdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBXU0NEREFydGlmYWN0RWRpdCBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCB3c0NsaWVudEVkaXRzID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3c0NsaWVudEVkaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCBlZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSB3c0NsaWVudEVkaXRzLmdldChpKTsKLQkJCWlmIChlZGl0ICE9bnVsbCAmJiBlZGl0LmdldFByb2plY3QoKSE9IG51bGwgJiYgZWRpdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCXJldHVybiBlZGl0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExTZXJ2aWNlcyhSZXNvdXJjZSB3c2RsKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGRlZiA9IHNlcnZpY2VIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbCk7Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmKS52YWx1ZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0V1NETFNlcnZpY2VGb3JXZWJTZXJ2aWNlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCUVPYmplY3Qgc2VydmljZSA9IG51bGw7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlSZXNvdXJjZSB3c2RsID0gZ2V0V1NETFJlc291cmNlKHdlYlNlcnZpY2UpOwotCQlpZiAod3NkbCA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJT2JqZWN0IGRlZmluaXRpb24gPSBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJTWFwIHNlcnZpY2VzID0gc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmaW5pdGlvbik7Ci0JCWlmIChzZXJ2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBzZXJ2aWNlOwotCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wID0gbnVsbDsKLQkJaWYgKHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKSE9bnVsbCAmJiB3ZWJTZXJ2aWNlLmdldFBvcnRDb21wb25lbnRzKCkuc2l6ZSgpPjApIHsKLQkJCXBvcnRDb21wID0gKFBvcnRDb21wb25lbnQpIHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKS5nZXQoMCk7Ci0JCQlyZXR1cm4gZ2V0U2VydmljZShwb3J0Q29tcCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFdTRExSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZS5lUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRTZXJ2aWNlKFBvcnRDb21wb25lbnQgcG9ydCkgewotCQlMaXN0IHNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVPYmplY3Qgc2VydmljZSA9IChFT2JqZWN0KXNlcnZpY2VzLmdldChpKTsKLQkJCWlmIChzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyhzZXJ2aWNlKS5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCB3c2RsUG9ydCA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCQlTdHJpbmcgcU5hbWUgPSBzZXJ2aWNlSGVscGVyLmdldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKHdzZGxQb3J0KTsKLQkJCQlpZiAocG9ydC5nZXRXc2RsUG9ydCgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxTmFtZSkpCi0JCQkJCXJldHVybiBzZXJ2aWNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lKSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHBvcnRDb21wLmdldFdzZGxQb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHFOYW1lKSkKLQkJCQkJcmV0dXJuIHBvcnRDb21wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHByb2plY3QgPT0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHBvcnRDb21wKSkKLQkJCQkJcmV0dXJuIHBvcnRDb21wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoRU9iamVjdCB3c2RsU2VydmljZSkgewotCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3J0IGluIHRoZSB3c2RsIHNlcnZpY2UsIGZpbmQgdGhlIG1hdGNoaW5nIHBvcnQgY29tcG9uZW50Ci0JCS8vIG90aGVyd2lzZSBpZiBtdWx0aXBsZSBwb3J0cyByZXR1cm4gbnVsbCBiZWNhdXNlIHdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbgotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJaWYgKHdzZGxTZXJ2aWNlID09IG51bGwgfHwgc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBwb3J0ID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCVN0cmluZyBxTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkocG9ydCk7Ci0JCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudChxTmFtZSwgUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdzZGxTZXJ2aWNlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbiBnZXRTZXJ2aWNlSW1wbEJlYW4oRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRQb3J0Q29tcG9uZW50KHdzZGxTZXJ2aWNlKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcG9ydC5nZXRTZXJ2aWNlSW1wbEJlYW4oKTsKLQl9Ci0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydCA9IGdldFBvcnRDb21wb25lbnQod3NkbFNlcnZpY2UpOwotCQlpZiAocG9ydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV3NkZFJlc291cmNlKSBwb3J0LmVSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0ID0gZ2V0UG9ydENvbXBvbmVudCh3c2RsU2VydmljZSk7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBvcnQuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldFdvcmtzcGFjZTEzU2VydmljZVJlZnMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxM1NlcnZpY2VSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChhcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlMaXN0IHNjb3BlZEJlYW5zID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NvcGVkQmVhbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyByZWZCZWFuID0gKENvbXBvbmVudFNjb3BlZFJlZnMpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXJlc3VsdC5hZGRBbGwocmVmQmVhbi5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZQlyZXN1bHQuYWRkQWxsKHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpLmdldFNlcnZpY2VSZWZzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhJUHJvamVjdCBoYW5kbGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0ID0gZ2V0RXhpc3RpbmdXU0NEREFydGlmYWN0RWRpdChoYW5kbGUpOwotCQlpZiAod3NDbGllbnRBcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IHdzQ2xpZW50QXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRBbGwocmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcyhnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKExpc3Qgd3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSB3c0NsaWVudEFydGlmYWN0RWRpdHMuaXRlcmF0b3IoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NDRERBcnRpZmFjdEVkaXQgd3NjQXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCQotCQkJSVByb2plY3QgcHJvamVjdCA9IHdzY0FydGlmYWN0RWRpdC5nZXRQcm9qZWN0KCk7IAkKLQkJCQotCQkJU3RyaW5nIHByb2plY3RUeXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2plY3QpOwotCQkJU3RyaW5nIHByb2plY3RWZXJzaW9uID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKHByb2plY3QpOwotCQkJaW50ICAgIGoyZWVMZXZlbCA9ICAwOwotCQkJaWYoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRS5lcXVhbHMocHJvamVjdFR5cGUpKXsKLQkJCQlqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQocHJvamVjdFZlcnNpb24pOwotCQkJfSBlbHNlIGlmKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUuZXF1YWxzKHByb2plY3RUeXBlKSl7Ci0JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRXZWJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHByb2plY3RWZXJzaW9uKTsKLQkJCX0gZWxzZSBpZihJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFLmVxdWFscyhwcm9qZWN0VHlwZSkpewotCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0QXBwQ2xpZW50VmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChwcm9qZWN0VmVyc2lvbik7Ci0JCQl9Ci0JCQkKLQkJCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGNoZWNrIHRoYXQgcHJvamVjdCdzIGoyZWUgbGV2ZWwgaXMgMTQKLQkJCWlmKGoyZWVMZXZlbCAhPSAgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJRU9iamVjdCByb290T2JqZWN0ID0gbnVsbDsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotCQkJCQlyb290T2JqZWN0ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCQkvLyBoYW5kbGUgRUpCIHByb2plY3QgY2FzZQotCQkJCWlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgRUpCSmFyKSB7Ci0JCQkJCUxpc3QgY21wcyA9ICgoRUpCSmFyKSByb290T2JqZWN0KS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbXBzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKSBjbXBzLmdldChqKTsKLQkJCQkJCWlmIChiZWFuLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhYmVhbi5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gaGFuZGxlIFdlYiBQcm9qZWN0Ci0JCQkJZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIFdlYkFwcCkgewotCQkJCQlpZiAoKChXZWJBcHApIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhKChXZWJBcHApIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJfQotCQkJCS8vIGhhbmRsZSBBcHAgY2xpZW50cwotCQkJCWVsc2UgaWYgKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkgewotCQkJCQlpZiAoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICEoKEFwcGxpY2F0aW9uQ2xpZW50KSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0oyRUUxNChTZXJ2aWNlUmVmIHJlZikgewotCQlyZXR1cm4gIShyZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTSUxGaWxlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRXU0FydGlmYWN0RWRpdHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBmaWxlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0lMUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGopOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgV1NJTF9FWFQuZXF1YWxzKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkJCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTRExSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUxpc3Qgd3NkbFJlc291cmNlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0RMUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKHdzZGxSZXNvdXJjZXMgIT0gbnVsbCAmJiAhd3NkbFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c2RsUmVzb3VyY2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSB3c2RsID0gKFJlc291cmNlKSB3c2RsUmVzb3VyY2VzLmdldChqKTsKLQkJCQkJCWlmICghcmVzdWx0LmNvbnRhaW5zKHdzZGwpKQotCQkJCQkJCXJlc3VsdC5hZGQod3NkbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGludGVybmFsV3NkbHMgPSBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpOwotCQlpZiAoaW50ZXJuYWxXc2RscyAhPSBudWxsICYmICFpbnRlcm5hbFdzZGxzLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoaW50ZXJuYWxXc2Rscyk7Ci0JCS8vVE9ETyBhZGQgZXh0ZXJuYWxzCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGJlYW4pOwotCQlpZiAoZmlsZSE9bnVsbCkKLQkJCWFydGlmYWN0RWRpdCA9IGdldEV4aXN0aW5nV1NDRERBcnRpZmFjdEVkaXQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9bnVsbCkgewotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZWpiTmFtZSA9IGJlYW4uZ2V0TmFtZSgpOwotCQkJCUxpc3Qgc2NvcGVzID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNjb3Blcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBzY29wZSA9IChDb21wb25lbnRTY29wZWRSZWZzKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHNjb3BlLmdldENvbXBvbmVudE5hbWUoKS5lcXVhbHMoZWpiTmFtZSkpCi0JCQkJCQlyZXR1cm4gc2NvcGUuZ2V0U2VydmljZVJlZnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoY2xpZW50KSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3ZWJDbGllbnQgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQkJCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2ViYXBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoV2ViQXBwIHdlYmFwcCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod2ViYXBwKSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3ZWJDbGllbnQgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQkJCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCS8vIEhhbmRsZSBwcm9qZWN0IGFkZHMgYW5kIHByb2plY3Qgb3BlbnMKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpPT1JUmVzb3VyY2VEZWx0YS5BRERFRCB8fCAoKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgJiYgcC5pc0FjY2Vzc2libGUoKSkpKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocCk7Ci0JCQkJaWYgKGNvbXBvbmVudCE9bnVsbCAmJiAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHApICYmICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QocCkpIHsKLQkJCQkJZ2V0UXVldWVkSm9iKCkuYWRkUHJvamVjdChwKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIEhhbmRsZSBwcm9qZWN0IGNsb3NlIGV2ZW50cyBhbmQgcmVtb3ZhbHMgCi0JCQllbHNlIGlmICgoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgICYmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApKQotCQkJCQl8fCAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpKXsKLQkJCQlyZW1vdmVBcnRpZmFjdEVkaXQocCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgaXNJbnRlcnJlc3RlZEluRmlsZSgoSUZpbGUpIHJlc291cmNlKSkgewotCQkJLy8gSGFuZGxlIFdTSUwgYW5kIFdTREwgRmlsZSBhZGRpdGlvbnMgYXMgd2VsbCBhcyB3ZWJzZXJ2aWNlLnhtbCBhbmQgd2Vic2VydmljZWNsaWVudC54bWwKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0RMX0VYVCkpCi0JCQkJICAgIGFkZGVkV3NkbCgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQkgICAgYWRkZWRXc2lsKChJRmlsZSlyZXNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FKSB8fAotCQkJCQkJcmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19ERF9VUkkpKSB7Ci0JCQkJCWdldFF1ZXVlZEpvYigpLmFkZFByb2plY3QocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQl9CQotCQkJfSAKLQkJCS8vIEhhbmRsZSBXU0lMIG9yIFdTREwgZmlsZSByZW1vdmFscwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTRExfRVhUKSB8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQlub3RpZnlMaXN0ZW5lcnMoRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgY3JlYXRlUHJvamVjdHNKb2IoKSB7Ci0JCVNldCBuZXdTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlQcm9jZXNzUHJvamVjdHNXaXRoV1NETCBqb2IgPSBuZXcgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwobmV3U2V0LCBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSk7Ci0JCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgZ2V0UXVldWVkSm9iKCkgewotCQkKLQkJaWYgKHByb2Nlc3NOZXdQcm9qZWN0cyAhPSBudWxsICYmIChwcm9jZXNzTmV3UHJvamVjdHMuZ2V0U3RhdGUoKSA9PSBKb2IuV0FJVElORykpewotCQkJcmV0dXJuIHByb2Nlc3NOZXdQcm9qZWN0czsKLQkJfSBlbHNlIHsKLQkJCXByb2Nlc3NOZXdQcm9qZWN0cyA9IGNyZWF0ZVByb2plY3RzSm9iKCk7Ci0JCQlwcm9jZXNzTmV3UHJvamVjdHMuc2NoZWR1bGUoKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc05ld1Byb2plY3RzOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NQcm9qZWN0c1dpdGhXU0RMIGV4dGVuZHMgSm9iCi0JewotCQlwcml2YXRlIFNldCBjdXJyZW50UHJvamVjdHM7Ci0JCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQkJCi0JCXB1YmxpYyBQcm9jZXNzUHJvamVjdHNXaXRoV1NETChTZXQgcCwgaW50IG5ld0V2ZW50VHlwZSkKLQkJewotCQkJc3VwZXIoIkxvYWRpbmcgYXJ0aWZhY3QgZWRpdCBmb3IgcHJvamVjdCIpOwotCQkJY3VycmVudFByb2plY3RzID0gcDsKLQkJCWV2ZW50VHlwZSA9IG5ld0V2ZW50VHlwZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkUHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCQlzeW5jaHJvbml6ZWQoY3VycmVudFByb2plY3RzKSB7Ci0JCQkJY3VycmVudFByb2plY3RzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIE51bGwgb3V0IGpvYiBmb3IgcHJvY2Vzc2luZyBuZXcgcHJvamVjdHMKLQkJCXN5bmNocm9uaXplZCAocHJvY2Vzc05ld1Byb2plY3RzKSB7Ci0JCQkJaWYocHJvY2Vzc05ld1Byb2plY3RzID09IHRoaXMpewotCQkJCQlwcm9jZXNzTmV3UHJvamVjdHMgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjdXJyZW50UHJvamVjdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYWRkQXJ0aWZhY3RFZGl0KGN1cnJlbnRQcm9qZWN0KTsKLQkJCX0KLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUpOwotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZGVkV3NkbChJRmlsZSB3c2RsKSB7Ci0JCWlmICghd3NkbC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdCh3c2RsKTsKLQkJaWYgKGhhbmRsZSAhPSBudWxsKSB7Ci0JCQlhZGRBcnRpZmFjdEVkaXQoaGFuZGxlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkZWRXc2lsKElGaWxlIHdzaWwpIHsKLQkJaWYgKCF3c2lsLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KHdzaWwpOwotCQlpZiAoaGFuZGxlICE9IG51bGwpIHsKLQkJCWFkZEFydGlmYWN0RWRpdChoYW5kbGUpOwotCQkJbm90aWZ5TGlzdGVuZXJzKEVkaXRNb2RlbEV2ZW50LkxPQURFRF9SRVNPVVJDRSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRDb21wb25lbnRQcm9qZWN0KElGaWxlIHJlcykgewotCQlpZiAocmVzPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZXMuZ2V0UHJvamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJbkZpbGUoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGlzRmlsZUludGVyZXN0aW5nKGFGaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9ubHkgcmVzb3VyY2VzIHdlYnNlcnZpY2UgbWFuYWdlciBpcyBjb25jZXJuZWQgYWJvdXQgYXJlOgotCSAqIHdlYnNlcnZpY2UueG1sLCB3ZWJzZXJ2aWNlY2xpZW50LnhtbCwgYW5kIEoyRUUgMS40IHdlYi54bWwsIGVqYi1qYXIteG1sLCBhbmQgYXBwbGljYXRpb24tY2xpZW50LnhtbAotCSAqIEBwYXJhbSByZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4gaXNJbnRlcmVzdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RlZEluUmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBXc2RkUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgV2ViU2VydmljZXNSZXNvdXJjZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgRUpCUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgV2ViQXBwUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpcmVzKS5nZXRKMkVFVmVyc2lvbklEKCk+SjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKEVKQkphciBqYXIpIHsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYmVhbnMgPSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJlYW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbikgYmVhbnMuZ2V0KGkpOwotCQkJCWxpc3QuYWRkQWxsKGdldFNlcnZpY2VSZWZzKGJlYW4pKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChiZWFuLmdldEVqYkphcigpLmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCWxpc3QuYWRkQWxsKGJlYW4uZ2V0U2VydmljZVJlZnMoKSk7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkQWxsKGdldDEzU2VydmljZVJlZnMoYmVhbikpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhXZWJBcHAgd2ViYXBwKSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKHdlYmFwcC5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEKQotCQkJCWxpc3QuYWRkQWxsKHdlYmFwcC5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCWVsc2UKLQkJCQlsaXN0LmFkZEFsbChnZXQxM1NlcnZpY2VSZWZzKHdlYmFwcCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQpIHsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoY2xpZW50LmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQlsaXN0LmFkZEFsbChjbGllbnQuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQllbHNlCi0JCQkJbGlzdC5hZGRBbGwoZ2V0MTNTZXJ2aWNlUmVmcyhjbGllbnQpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y0MzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVBsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSB0aGlzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbAotCSAqIGxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIG5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLQkgKiAoQVRLVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aSIpOwotCSAqIAotCSAqIEByZXR1cm4gVGhlIEFUS1VJUGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yCi0JICogdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4gVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4KLQkgKiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvcgotCSAqIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nIGFyZSByZXBsYWNlZCBieSB0aGUKLQkgKiBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2ggYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlCi0JICogamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluCi0JICogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JICogICAgICAgICAgICBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4KLQkgKiAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZCBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksIGFyZ3MpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlTdHJpbmcgaW5zdGFsbFVSTCA9IGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoaW5zdGFsbFVSTCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW5zdGFsbFVSTCk7Ci0JCQkJc2IuYXBwZW5kKCJwbHVnaW4ucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBVUkwoc2IudG9TdHJpbmcoKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBrZXkuIFRoZSBkZXNjcmlwdGlvbiB3aWxsIHR5cGljYWxseSBiZSBpbiB0aGUgZm9ybSBvZiBhIFVSTCB0byB0aGUgaW1hZ2UgZGF0YS4gQ3JlYXRpb24gb2YgYW4KLQkgKiBhY3R1YWwgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgR1VJIGVudmlyb25tZW50OyB3aXRoaW4gRWNsaXBzZSwKLQkgKiBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnkgY2FuIGJlIHVzZWQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgaW1hZ2UgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb24gdGhlIGltYWdlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzdHJpbmcgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBhbmQgcGVmb3JtcyBzdWJzdGl0dXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHN0cmluZy4KLQkgKiBAcGFyYW0gc3Vic3RpdHV0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugc3Vic3RpdHV0aW9ucy4KLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqIEBzZWUgI2dldFN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBNZXNzYWdlRm9ybWF0I2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyBmaXJzdCBsb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc3RhcnQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLQkKLQotCS8qKgotCSAqIFJlY29yZCBhbiBlcnJvciBhZ2FpbnN0IHRoaXMgcGx1Z2luJ3MgbG9nLiAKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gYW5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgYW5FeGNlcHRpb24pIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDgzZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzXzsKLQotCXB1YmxpYyBBVEtVSUFkYXB0ZXJGYWN0b3J5KCkgewotCQlhZGFwdGVyRmFjdG9yaWVzXyA9IG5ldyBBZGFwdGVyRmFjdG9yeVs0XTsKLQkJYWRhcHRlckZhY3Rvcmllc19bMF0gPSBuZXcgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzFdID0gbmV3IEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSgpOwotCQlhZGFwdGVyRmFjdG9yaWVzX1syXSA9IG5ldyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJYWRhcHRlckZhY3Rvcmllc19bM10gPSBuZXcgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpOwotCi0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb3RpZmllcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzXy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmplY3QgPSBhZGFwdGVyRmFjdG9yaWVzX1tpXS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvbHZlKHRhcmdldCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3Qgb2JqZWN0ID0gYWRhcHQoKE9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCXJldHVybiAoQWRhcHRlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjYWRhcHQoT2JqZWN0LE9iamVjdCkgYWRhcHQoT2JqZWN0LCBPYmplY3QpfWZvciBvYmplY3RzIHRoYXQgYXJlbid0Ci0JICogbm90aWZpZXJzLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgYXJiaXRyYXJ5IG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGtleSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGFkYXB0ZXIgcmVxdWlyZWQuCi0JICogQHJldHVybiB0aGUgb2JqZWN0IGl0c2VsZi4KLQkgKiBAc2VlICNhZGFwdChPYmplY3QsT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gcmVzb2x2ZUVMaXN0KChFTGlzdCkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gcmVzb2x2ZUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZUVMaXN0KEVMaXN0IGVMaXN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoZUxpc3Quc2l6ZSgpID4gMCkKLQkJCXJldHVybiBhZGFwdChlTGlzdC5nZXQoMCksIHR5cGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZXNvbHZlQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0sIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiByZXNvbHZlRUxpc3QoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkoKFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bMF0pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKChBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzFdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCSgoQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1syXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkoKEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzNdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWQxYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpIHsKLQkJaWYgKHBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOwotCi0JCXJldHVybiBwYXJhbVZhbHVlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHFOYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXFOYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcU5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0KLQkvKgotCSAqIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgeyBpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4KLQkgKiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOyB9Ci0JICogCi0JICogcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgeyBpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkgKiBzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7IH0KLQkgKiAKLQkgKiBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7IGlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7IHJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsgfQotCSAqICAKLQkgKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzZjM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKENvbXBvbmVudFNjb3BlZFJlZnMpIG9iamVjdCkuZ2V0Q29tcG9uZW50TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZjMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBIYW5kbGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiMGM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldFBhcmFtVmFsdWUoKSk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWM0NTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBhcmFtVmFsdWUgaW5pdFBhcmFtID0gKFBhcmFtVmFsdWUpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZWYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcFJlZiA9IChQb3J0Q29tcG9uZW50UmVmKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhwb3J0Q29tcFJlZi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydENvbXBSZWYuZ2V0UG9ydENvbXBvbmVudExpbmsoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnRDb21wUmVmLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlYWIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQb3J0TmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBvcnROYW1lIHBvcnROYW1lID0gKFBvcnROYW1lKSBvYmplY3Q7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydE5hbWUuZ2V0UG9ydE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzgzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlRTmFtZSBxbmFtZSA9IChRTmFtZSkgb2JqZWN0OwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJCXNiLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCQlzYi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIzZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFNPQVBSb2xlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUFJvbGUgc29hcFJvbGUgPSAoU09BUFJvbGUpIG9iamVjdDsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwUm9sZS5nZXRTb2FwUm9sZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTRhN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VydmljZVJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKCgoU2VydmljZVJlZikgb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCkgPyBjbGFzc05hbWUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFmMWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlmZWF0dXJlID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpKSkKLQkJCXJlc3VsdC5hZGQoU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5nZXRXc0NsaWVudCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXNDbGllbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVU5RVUFMSUZJRURfQ09NUE9ORU5UIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3ZDlmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJd2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCkgewotCQlpZiAoY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlSGFuZGxlckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJaGFuZGxlckl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZmOTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlpbml0UGFyYW1JdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKSB7Ci0JCWlmIChzb2FwSGVhZGVySXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXNvYXBSb2xlSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJcG9ydE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYwY2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vLyBOb24tZ2VuZXJhdGVkIHByb3ZpZGVyIGNvZGUKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQlwdWJsaWMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGFkYXB0ZXIncyByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzA0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbkxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBCZWFuTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0JlYW5MaW5rIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IHJldHVybiBnZXRTdHJpbmcoIl9VSV9CZWFuTGlua190eXBlIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX0JlYW5MaW5rX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUyMTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29tcG9uZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc19jb21wb25lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfY29tcG9uZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbXBvbmVudFNjb3BlZFJlZnMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9Db21wb25lbnRTY29wZWRSZWZzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoQ29tcG9uZW50U2NvcGVkUmVmcylvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSArICIgIiArCi0JICogbGFiZWw7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb21wb25lbnRTY29wZWRSZWZzKSBvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1NmY1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX2lkX2ZlYXR1cmUiLCAiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVsZW1lbnROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzRlNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5EZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdGlvblR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZXNjcmlwdGlvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpcHRpb25UeXBlKSBvYmplY3QpLmdldExhbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3NmFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkRpc3BsYXlOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpc3BsYXlOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpc3BsYXlOYW1lVHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Rpc3BsYXlOYW1lVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNwbGF5TmFtZVR5cGUpIG9iamVjdCkuZ2V0TGFuZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVUeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FSkJMaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmI2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FSkJMaW5rSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJMaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX0VKQkxpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfRUpCTGlua19pZF9mZWF0dXJlIiwgIl9VSV9FSkJMaW5rX3R5cGUiKSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxpbmtfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVqYiBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VKQkxpbmtfZWpiTGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FSkJMaW5rX2VqYkxpbmtfZmVhdHVyZSIsICJfVUlfRUpCTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rX0VqYkxpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRUpCTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEVKQkxpbmspb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4gbGFiZWwgPT0KLQkgKiBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX0VKQkxpbmtfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRUpCTGluaykgb2JqZWN0KS5nZXRFamJMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfRUpCTGlua190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFSkJMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjllMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnROYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsZW1lbnROYW1lX2lkX2ZlYXR1cmUiLCAiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWVfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRleHQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfdGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGVtZW50TmFtZV90ZXh0X2ZlYXR1cmUiLCAiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWVfVGV4dCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFbGVtZW50TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0VsZW1lbnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEVsZW1lbnROYW1lKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRWxlbWVudE5hbWUuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhUIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0V4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmJiM2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4Y2VwdGlvbiBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfZXhjZXB0aW9uVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX2V4Y2VwdGlvblR5cGVfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEV4Y2VwdGlvbk1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FeGNlcHRpb25NYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEV4Y2VwdGlvbk1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFeGNlcHRpb25NYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzU1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuSGFuZGxlcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIYW5kbGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBSb2xlcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfc29hcFJvbGVzX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfcG9ydE5hbWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1BvcnROYW1lcygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSk7Ci0vLwkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L2hhbmRsZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcilvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgOiBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgKyAiOiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGFuZGxlci5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDI0M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0luaXRQYXJhbV9pZF9mZWF0dXJlIiwgIl9VSV9Jbml0UGFyYW1fdHlwZSIpLAotCSAqIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW5pdFBhcmFtLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChJbml0UGFyYW0pb2JqZWN0KS5nZXRQYXJhbU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyB9IC8qCi0JICogCi0JICogLyoqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+IEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuYW1lKTsKLQkJbGFiZWwuYXBwZW5kKCI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKHZhbHVlKTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEluaXRQYXJhbS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0lEOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUluaXRQYXJhbSBwYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJaWYgKHBhcmFtLmdldFBhcmFtTmFtZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQlpZiAocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQkJaWYgKHBhcmFtLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChwYXJhbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMmNhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEludGVyZmFjZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JbnRlcmZhY2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSW50ZXJmYWNlTWFwcGluZ190eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRhYzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSmF2YVdTRExNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFXU0RMTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEphdmFXU0RMTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0phdmFXU0RMTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChKYXZhV1NETE1hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEphdmFXU0RMTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhY2thZ2VNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhWE1MVHlwZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25NYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW50ZXJmYWNlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlMTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDbGFzc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFub255bW91c1R5cGVRbmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDbGFzcyBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2NsYXNzVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfY2xhc3NUeXBlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFFuYW1lIFNjb3BlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbm9ueW1vdXMgVHlwZSBRbmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm9ueW1vdXNUeXBlUW5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19hbm9ueW1vdXNUeXBlUW5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2Fub255bW91c1R5cGVRbmFtZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKYXZhWE1MVHlwZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KYXZhWE1MVHlwZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSmF2YVhNTFR5cGVNYXBwaW5nKSBvYmplY3QpLmdldEFub255bW91c1R5cGVRbmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9vdFR5cGVRbmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVmFyaWFibGVNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNkNmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWwuSmF4cnBjbWFwQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXhycGNtYXBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVdTRExNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgcGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyIGV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvbk1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciByb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpIHsKLQkJaWYgKHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJ9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJBZGFwdGVyKCkgewotCQlpZiAoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyID0gbmV3IENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgZWxlbWVudE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciB3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFNlcnZpY2VOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgcG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExQb3J0VHlwZUl0ZW1Qcm92aWRlciB3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIgd3NkbEJpbmRpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsQmluZGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgd3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAod3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWVBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MjU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFBvc2l0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtUG9zaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1Qb3NpdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1UeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1UeXBlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhcmFtUGFydHNNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT04gOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNGU5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYWNrYWdlVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTmFtZXNwYWNlVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lc3BhY2UgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfbmFtZXNwYWNlVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhY2thZ2VNYXBwaW5nX25hbWVzcGFjZVVSSV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQYWNrYWdlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhY2thZ2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBhY2thZ2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGFja2FnZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0MWQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3J0Q29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1BvcnRDb21wb25lbnRfaWRfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgQ29tcG9uZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfcG9ydENvbXBvbmVudE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9wb3J0Q29tcG9uZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50Iik7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChQb3J0Q29tcG9uZW50KW9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRDb21wb25lbnQpIG9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIYW5kbGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwM2YyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUG9ydENvbXBvbmVudExpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9ydCBDb21wb25lbnQgTGluayBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0Q29tcG9uZW50TGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfcG9ydENvbXBvbmVudExpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZmFsc2UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0Q29tcG9uZW50UmVmLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFBvcnRDb21wb25lbnRSZWYpb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TGluaygpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PQotCSAqIDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRSZWZfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydENvbXBvbmVudFJlZikgb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TGluaygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydENvbXBvbmVudFJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0N2Q4ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEphdmFQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF2YSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ19qYXZhUG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfamF2YVBvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9ydE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE1hcHBpbmcpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0TWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA2MzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnROYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCS8vcGdtIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfUG9ydE5hbWVfdHlwZSIpLCBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnROYW1lX0lkKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpb2JqZWN0KS5nZXRQb3J0TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0TmFtZV90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnROYW1lLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWEwNmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvb3RUeXBlUW5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb290VHlwZVFuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvb3RUeXBlUW5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9vdFR5cGVRbmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Jvb3RUeXBlUW5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxMzAzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU09BUEhlYWRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNPQVBIZWFkZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TT0FQSGVhZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFNPQVBIZWFkZXIpb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1NPQVBIZWFkZXJfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfU09BUEhlYWRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBvYmplY3Q7Ci0JCVN0cmluZyBuc1VSSSA9IHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSBzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpOwotCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5sZW5ndGgoKSA9PSAwIHx8IGxvY2FscGFydCA9PSBudWxsIHx8IGxvY2FscGFydC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9TT0FQSGVhZGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuc1VSSSk7Ci0JCWxhYmVsLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZChsb2NhbHBhcnQpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTT0FQUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU29hcFJvbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NPQVBSb2xlX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1NPQVBSb2xlX2lkX2ZlYXR1cmUiLCAiX1VJX1NPQVBSb2xlX3R5cGUiKSwgV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQUm9sZV9JZCgpLAotCSAqIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBSb2xlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBSb2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV9zb2FwUm9sZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TT0FQUm9sZV9zb2FwUm9sZV9mZWF0dXJlIiwgIl9VSV9TT0FQUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGVfU29hcFJvbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU09BUFJvbGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TT0FQUm9sZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFNPQVBSb2xlKW9iamVjdCkuZ2V0SWQoKTsgcmV0dXJuCi0JICogbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU09BUFJvbGUpIG9iamVjdCkuZ2V0U29hcFJvbGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9TT0FQUm9sZV90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNPQVBSb2xlLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQyYzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgd3NDbGllbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V3NDbGllbnQoV2ViU2VydmljZXNDbGllbnQgY2xpZW50KSB7Ci0JCXdzQ2xpZW50ID0gY2xpZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V3NDbGllbnQoKSB7Ci0JCXJldHVybiB3c0NsaWVudDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmJiYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETEJpbmRpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzI1MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YU1ldGhvZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXZhIE1ldGhvZCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFNZXRob2ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2phdmFNZXRob2ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfamF2YU1ldGhvZE5hbWVfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3JhcHBlZCBFbGVtZW50IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dyYXBwZWRFbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3JhcHBlZEVsZW1lbnRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKSBvYmplY3QpLmdldEphdmFNZXRob2ROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3YTZkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9TZXJ2aWNlSW1wbEJlYW5faWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VJbXBsQmVhbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VJbXBsQmVhbilvYmplY3QpLmdldElkKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSAoU2VydmljZUltcGxCZWFuKSBvYmplY3Q7Ci0JCVN0cmluZyBlamJMaW5rID0gc2VydmljZUltcGxCZWFuLmdldEVFSkJMaW5rKCkuZ2V0RWpiTGluaygpOwotCQlpZiAoZWpiTGluayAhPSBudWxsICYmIGVqYkxpbmsubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGVqYkxpbms7Ci0JCVN0cmluZyBiZWFuTGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRCZWFuTGluaygpLnRvU3RyaW5nKCk7Ci0JCWlmIChiZWFuTGluayAhPSBudWxsICYmIGJlYW5MaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBiZWFuTGluazsKLQkJU3RyaW5nIHNlcnZsZXRMaW5rID0gc2VydmljZUltcGxCZWFuLmdldEVTZXJ2bGV0TGluaygpLmdldFNlcnZsZXRMaW5rKCk7Ci0JCWlmIChzZXJ2bGV0TGluayAhPSBudWxsICYmIHNlcnZsZXRMaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBzZXJ2bGV0TGluazsKLQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VJbXBsQmVhbi5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldExpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJlYW5MaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0TGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTGluaygpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcXVhbGlmeSA9IGZlYXR1cmUgPT0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSB8fCBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSB8fCBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKTsKLQkJcmV0dXJuIGdldFN0cmluZyhxdWFsaWZ5ID8gIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIgOiAiX1VJX0NyZWF0ZUNoaWxkX3RleHQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IE9iamVjdFtde2dldFR5cGVUZXh0KGNoaWxkKSwgZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUludGVyZmFjZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUludGVyZmFjZU1hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMU2VydmljZU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0TWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGFkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBhcmcwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGExNTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlNlcnZpY2VSZWZ9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VSZWZOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgUmVmIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZVJlZk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VSZWZOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgRmlsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfd3NkbEZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEpheHJwYyBNYXBwaW5nIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQkvL2NoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSk7Ci0JCQkvL2NoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VSZWYuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9zZXJ2aWNlcmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoU2VydmljZVJlZilvYmplY3QpLmdldFNlcnZpY2VSZWZOYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VSZWZfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfU2VydmljZVJlZl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZVJlZikgb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQlyZXR1cm4gIlNlcnZpY2VSZWYgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZVJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhhbmRsZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk2Nzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmxldExpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldExpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZXJ2bGV0TGlua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIsICJfVUlfU2VydmxldExpbmtfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZsZXRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0TGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2bGV0TGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTZXJ2bGV0TGluaylvYmplY3QpLmdldElkKCk7IHJldHVybgotCSAqIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZsZXRMaW5rKSBvYmplY3QpLmdldFNlcnZsZXRMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfU2VydmxldExpbmtfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldExpbmsuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU4MTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YVZhcmlhYmxlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWG1sRWxlbWVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbEF0dHJpYnV0ZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbFdpbGRjYXJkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgVmFyaWFibGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVmFyaWFibGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWG1sIEVsZW1lbnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEVsZW1lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxFbGVtZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERhdGEgTWVtYmVyIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYbWwgQXR0cmlidXRlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQXR0cmlidXRlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhtbCBXaWxkY2FyZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxXaWxkY2FyZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbFdpbGRjYXJkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxXaWxkY2FyZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVmFyaWFibGVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVmFyaWFibGVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFZhcmlhYmxlTWFwcGluZykgb2JqZWN0KS5nZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJsZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWYxOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMQmluZGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExCaW5kaW5nKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExCaW5kaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETEJpbmRpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU0MGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2V9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2UuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMTWVzc2FnZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODRmOGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbWV0ZXJNb2RlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTb2FwSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtZXRlciBNb2RlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlck1vZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19wYXJhbWV0ZXJNb2RlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19wYXJhbWV0ZXJNb2RlX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEhlYWRlciBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfc29hcEhlYWRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfc29hcEhlYWRlcl9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE1lc3NhZ2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExNZXNzYWdlTWFwcGluZykgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YzUzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV93c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2VQYXJ0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExNZXNzYWdlUGFydE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2VQYXJ0TmFtZSkgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODgwZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExPcGVyYXRpb25faWRfZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25fd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMT3BlcmF0aW9uX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMT3BlcmF0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMT3BlcmF0aW9uKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExPcGVyYXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExQb3J0LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi93c2RsLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFdTRExQb3J0KW9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydF90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1dTRExQb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJV1NETFBvcnQgd3NkbHBvcnQgPSAoV1NETFBvcnQpIG9iamVjdDsKLQkJU3RyaW5nIG5zVVJJID0gd3NkbHBvcnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSB3c2RscG9ydC5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkubGVuZ3RoKCkgPT0gMCB8fCBsb2NhbHBhcnQgPT0gbnVsbCB8fCBsb2NhbHBhcnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV1NETFBvcnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbGFiZWwuYXBwZW5kKG5zVVJJKTsKLQkJbGFiZWwuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKGxvY2FscGFydCk7Ci0JCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTcxN2I2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUG9ydFR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMUG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFBvcnRUeXBlKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzYyNjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0gKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1ldGhvZFJldHVyblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNZXRob2QgUmV0dXJuIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZFJldHVyblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX21ldGhvZFJldHVyblZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfbWV0aG9kUmV0dXJuVmFsdWVfZmVhdHVyZSIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETFJldHVyblZhbHVlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExSZXR1cm5WYWx1ZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFJldHVyblZhbHVlTWFwcGluZykgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjUwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExTZXJ2aWNlTmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExTZXJ2aWNlTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMU2VydmljZU5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5ZTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlzcGxheU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9pZF9mZWF0dXJlIiksCi0JICogZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25faWRfZmVhdHVyZSIsCi0JICogIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXhycGMgTWFwcGluZyBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25famF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWUgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93c2RsRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fd3NkbEZpbGVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3NtYWxsSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFyZ2UgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9sYXJnZUljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlRGVzY3JpcHRpb24iKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoV2ViU2VydmljZURlc2NyaXB0aW9uKW9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fAotCSAqIGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvd2Vic2VydmljZWRlc2MuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2I2MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlc0NsaWVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dlYlNlcnZpY2VzQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc0NsaWVudF90eXBlIik7Ci0JCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzQ2xpZW50LmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTMzMjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlc30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfV2ViU2VydmljZXNfaWRfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZXNfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlcy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dlYlNlcnZpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZXMpb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc190eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlcykgb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNjcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlZDgwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5TZXJ2aWNlUmVmfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyID0gbmV3IFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkhhbmRsZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJdGVtUHJvdmlkZXIgaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCWlmIChoYW5kbGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgSGFuZGxlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWFiMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBXZWJzZXJ2aWNlLWoyZWUgZWRpdCBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4oKTsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luKCkgewotCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW117fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbiA8L2I+LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogCi0JCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JCSAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwbHVnaW4uCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJbXBsZW1lbnRhdGlvbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCQlzdXBlcihkZXNjcmlwdG9yKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODQ1NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWwuV3Njb21tb25BZGFwdGVyRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluaXRQYXJhbUl0ZW1Qcm92aWRlciBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWluaXRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTT0FQUm9sZUl0ZW1Qcm92aWRlciBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc29hcFJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE5hbWVJdGVtUHJvdmlkZXIgcG9ydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKHBvcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFBvcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25UeXBlQWRhcHRlcigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyIGRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MTkyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud3NkZC5wcm92aWRlci5IYW5kbGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsLldzZGRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2RkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieQotCSAqIHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXN9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIgd2ViU2VydmljZXNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZXNBZGFwdGVyKCkgewotCQlpZiAod2ViU2VydmljZXNJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViU2VydmljZXNJdGVtUHJvdmlkZXIgPSBuZXcgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViU2VydmljZXNJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb259aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciBwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFBvcnRJdGVtUHJvdmlkZXIgd3NkbFBvcnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldTRExQb3J0fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRBZGFwdGVyKCkgewotCQlpZiAod3NkbFBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFBvcnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFBvcnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW59aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyIHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFufS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyIHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRMaW5rQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuRUpCTGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJMaW5rSXRlbVByb3ZpZGVyIGVqYkxpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMaW5rQWRhcHRlcigpIHsKLQkJaWYgKGVqYkxpbmtJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZWpiTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBFSkJMaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYkxpbmtJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJdGVtUHJvdmlkZXIgaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQloYW5kbGVySXRlbVByb3ZpZGVyID0gbmV3IEhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJlYW5MaW5rSXRlbVByb3ZpZGVyIGJlYW5MaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJlYW5MaW5rQWRhcHRlcigpIHsKLQkJaWYgKGJlYW5MaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWJlYW5MaW5rSXRlbVByb3ZpZGVyID0gbmV3IEJlYW5MaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGJlYW5MaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd3NkZC9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyNDJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53c2RkLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBIYW5kbGVySXRlbVByb3ZpZGVyIGluIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIKLSAqIHBhY2thZ2UgYW5kIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgY2xhc3MgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIEhhbmRsZXJJdGVtUHJvdmlkZXIgaW4gCi0gKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyIHBhY2thZ2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0hhbmRsZXJfaWRfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEhhbmRsZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuCi0JICogZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSGFuZGxlciIpOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBIYW5kbGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9oYW5kbGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcikgb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGFuZGxlci5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBSb2xlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5ZTIzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlcGx1Z2luIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29udGVudHR5cGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb25lZGl0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWFycHJvamVjdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWVjcmVhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImFyY2hpdmVvcHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJhcHBsaWNhdGlvbmVkaXQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJhcHBjbGllbnRjcmVhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icmVmYWN0b3IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjbGFzc3BhdGhkZXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwMDg0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotcnVudGltZQotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmNmMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWE4MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjkxN2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1dlZCBNYXIgMTkgMTc6MjM6NTMgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvYz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZ2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJjb21tZW50IiBuYW1lXD0iZ2V0dGVyY29tbWVudCI+LyoqXHJcbiAqIEByZXR1cm4gdGhlICR7YmFyZV9maWVsZF9uYW1lfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIHNldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyY29tbWVudCIgbmFtZVw9InNldHRlcmNvbW1lbnQiPi8qKlxyXG4gKiBAcGFyYW0gJHtwYXJhbX0gdGhlICR7YmFyZV9maWVsZF9uYW1lfSB0byBzZXRcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgY29uc3RydWN0b3JzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yY29tbWVudCIgbmFtZVw9ImNvbnN0cnVjdG9yY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qKlxyXG4gKiBcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJ0eXBlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCB0eXBlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy50eXBlY29tbWVudCIgbmFtZVw9InR5cGVjb21tZW50Ij4vKipcclxuICogQGF1dGhvciAke3VzZXJ9XHJcbiAqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJmaWVsZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGZpZWxkcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWVsZGNvbW1lbnQiIG5hbWVcPSJmaWVsZGNvbW1lbnQiPi8qKlxyXG4gKiBcclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBub24tb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGNvbW1lbnQiIG5hbWVcPSJtZXRob2Rjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im92ZXJyaWRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igb3ZlcnJpZGluZyBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm92ZXJyaWRlY29tbWVudCIgbmFtZVw9Im92ZXJyaWRlY29tbWVudCI+LyogKG5vbi1KYXZhZG9jKVxyXG4gKiAke3NlZV90b19vdmVycmlkZGVufVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImRlbGVnYXRlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZGVsZWdhdGUgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5kZWxlZ2F0ZWNvbW1lbnQiIG5hbWVcPSJkZWxlZ2F0ZWNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqICR7c2VlX3RvX3RhcmdldH1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJOZXdseSBjcmVhdGVkIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm5ld3R5cGUiIG5hbWVcPSJuZXd0eXBlIj4ke2ZpbGVjb21tZW50fVxyXG4ke3BhY2thZ2VfZGVjbGFyYXRpb259XHJcblxyXG4ke3R5cGVjb21tZW50fVxyXG4ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjbGFzc2JvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNsYXNzIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNsYXNzYm9keSIgbmFtZVw9ImNsYXNzYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iaW50ZXJmYWNlYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgaW50ZXJmYWNlIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmludGVyZmFjZWJvZHkiIG5hbWVcPSJpbnRlcmZhY2Vib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJlbnVtYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgZW51bSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5lbnVtYm9keSIgbmFtZVw9ImVudW1ib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJhbm5vdGF0aW9uYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgYW5ub3RhdGlvbiB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5hbm5vdGF0aW9uYm9keSIgbmFtZVw9ImFubm90YXRpb25ib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9ImZhbHNlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj5vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcigke2V4Y2VwdGlvbl92YXJ9KTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBtZXRob2Qgc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kYm9keSIgbmFtZVw9Im1ldGhvZGJvZHkiPi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWJcclxuJHtib2R5X3N0YXRlbWVudH08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGNvbnN0cnVjdG9yIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNvbnN0cnVjdG9yYm9keSIgbmFtZVw9ImNvbnN0cnVjdG9yYm9keSI+JHtib2R5X3N0YXRlbWVudH1cclxuLy8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgZ2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5nZXR0ZXJib2R5IiBuYW1lXD0iZ2V0dGVyYm9keSI+cmV0dXJuICR7ZmllbGR9OzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIHNldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuc2V0dGVyYm9keSIgbmFtZVw9InNldHRlcmJvZHkiPiR7ZmllbGR9IFw9ICR7cGFyYW19OzwvdGVtcGxhdGU+PC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNDNjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb250ZW50dHlwZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3k7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuZmFjZXQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZW5hbWU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3RvciwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5saXN0ZW5lcnMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW47YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2NvbXBvbmVudGNvcmUvdXRpbC9BcHBDbGllbnRBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvY29tcG9uZW50Y29yZS91dGlsL0FwcENsaWVudEFydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTlkMmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvY29tcG9uZW50Y29yZS91dGlsL0FwcENsaWVudEFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkFwcENsaWVudENvbXBvbmVudExvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklBcnRpZmFjdEVkaXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGltcGxlbWVudHMgSUFydGlmYWN0RWRpdEZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGNsaWVudEREIjsKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBBcHBDbGllbnRBcnRpZmFjdEVkaXQgdG8gYSBBcHBDbGllbnRFZGl0QWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBBcHBDbGllbnRFZGl0QWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmNsYXNzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFwcENsaWVudEFydGlmYWN0RWRpdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0KElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJc3VwZXIoYU1vZHVsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoYmluYXJ5TW9kdWxlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwkJCi0JfQotCQotCXB1YmxpYyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5LCBib29sZWFuIGZvckNyZWF0ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHksIGZvckNyZWF0ZSwgSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UKTsJCQotCX0KLQotCXB1YmxpYyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgYW5BcnRpZmFjdEVkaXRNb2RlbCkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdE1vZGVsKTsJCQotCX0KLQotCS8qKgotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICovCi0JcHJvdGVjdGVkIEFwcENsaWVudEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogIAotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXJldHVybiBnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKS5nZXRSZXNvdXJjZShnZXRSb290VVJJKCkpOwotCQl9IAotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShnZXRSb290VVJJKCkpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBBcHBsaWNhdGlvbkNsaWVudCAoQHNlZSBBcHBsaWNhdGlvbkNsaWVudCkgcm9vdCBvYmplY3QgZnJvbSB0aGUgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMKLQkgKiBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rIGFkZEFwcENsaWVudEphcklmTmVjZXNzYXJ5KGdldEFwcENsaWVudFhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogIAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlhZGRBcHBDbGllbnRJZk5lY2Vzc2FyeShnZXRBcHBsaWNhdGlvbkNsaWVudFhtaVJlc291cmNlKCkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBnZXRBcHBsaWNhdGlvbkNsaWVudFhtaVJlc291cmNlKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKEFwcGxpY2F0aW9uQ2xpZW50KSBhbmQgcG9wdWxhdGVzIHdpdGggZGF0YS4gQWRkcyB0aGUgcm9vdAotCSAqIG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfQotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGZvciBKVU5JVCAtIG1vdmU/Ci0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFwcENsaWVudElmTmVjZXNzYXJ5KFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gQ2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhcHBDbGllbnQpOwotCQkJVVJJIG1vZHVsZVVSSSA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFwcENsaWVudC5zZXREaXNwbGF5TmFtZShTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShtb2R1bGVVUkkpKTsKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlhUmVzb3VyY2Uuc2V0SUQoYXBwQ2xpZW50LCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfSUQpOwotCQkJLy9UT0RPIGFkZCBtb3JlIG1hbmRhdG9yeSBlbGVtZW50cwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIE1ldGhvZCB1c2VkIGZvciBhZGRpbmcgYSBqMmVlIHByb2plY3QgdG8gYW4gZWFyIHByb2plY3Q7IHN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0byBjcmVhdGUgYQotCSAqIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29ycmVjdCBraW5kIG9mIE1vZHVsZQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGNyZWF0ZU5ld01vZHVsZSgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnQgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICogIAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uQ2xpZW50WG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkQXBwbGljYXRpb25DbGllbnRNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkgCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IEFwcENsaWVudEFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRBcHBsaWNhdGlvbkNsaWVudE1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCkpKQotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90Ci0JICogYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmKGFNb2R1bGUuaXNCaW5hcnkoKSl7Ci0JCQlyZXR1cm4gbmV3IEFwcENsaWVudEFydGlmYWN0RWRpdChhTW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlCi0JICogICAgICAgICAgICBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFwcENsaWVudEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsIHx8IGFNb2R1bGUuaXNCaW5hcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShXb3JrYmVuY2hDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkgICAgcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGphdmEubGFuZy5JbnRlZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbikgewotICAgIAlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkgICAgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSByZXMgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSlnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JICAgIGFkZEFwcENsaWVudElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRSb290T2JqZWN0KCk7Ci0gICAgfQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJCi0JCXJldHVybiBnZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKGFDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJcmV0dXJuIGdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGFzQXJjaGl2ZShib29sZWFuIGluY2x1ZGVTb3VyY2UsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbnsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKWdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpOwotCQkJcmV0dXJuIGhlbHBlci5hY2Nlc3NMZWdhY3lBcmNoaXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJCWxvYWRlci5zZXRFeHBvcnRTb3VyY2UoaW5jbHVkZVNvdXJjZSk7Ci0JCQlTdHJpbmcgdXJpID0gTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcoZ2V0Q29tcG9uZW50KCkpOwotCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGxvYWRlciwgdXJpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IoSVByb2plY3QgcHJvamVjdCwgaW50IHZlcnNpb24pIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGFwcENsaWVudEVkaXQgPSBuZXcgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0KHByb2plY3QsZmFsc2UsdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlhcHBDbGllbnRFZGl0LmNyZWF0ZU1vZGVsUm9vdCh2ZXJzaW9uKTsKLQkJCWFwcENsaWVudEVkaXQuc2F2ZShudWxsKTsKLQkJfSBmaW5hbGx5IHsgLy8gTWFrZSBzdXJlIG5ldyByZXNvdXJjZSBpcyByZW1vdmVkICAtIHRoZSB1cmkgdXNlZCBmb3IgY3JlYXRpb24gc2hvdWxkbid0IGJlIGNhY2hlZAotCQkJUmVzb3VyY2UgbmV3UmVzID0gYXBwQ2xpZW50RWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKG5ld1Jlcyk7Ci0JCQluZXdSZXMudW5sb2FkKCk7Ci0JCQlhcHBDbGllbnRFZGl0LmRpc3Bvc2UoKTsKLQkJfSAKLQl9Ci0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJc2V0V3JpdGFibGVFZGl0KGdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSkpOwotCQl0cnl7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCWlmKCBnZXRXcml0YWJsZUVkaXQoKSAhPSBudWxsICl7Ci0JCQkJLy8gQWx3YXlzIHNhdmUgcmVnYXJkbGVzcyBvZiByZXNvdXJjZSBwYXRoIHBhc3NlZCAtIEFydGlmYWN0ZWRpdHMgc2F2ZSByZXNvdXJjZXMgYXMgYSB1bml0Ci0JCQkJZ2V0V3JpdGFibGVFZGl0KCkuc2F2ZUlmTmVjZXNzYXJ5KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsgLy9Qcm9wZXJseSBkaXNwb3NlIHRoZSB3cml0ZSBhcnRpZmFjdCBlZGl0Ci0JCQlnZXRXcml0YWJsZUVkaXQoKS5kaXNwb3NlKCk7Ci0JCQlzZXRXcml0YWJsZUVkaXQobnVsbCk7Ci0JCX0KLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkgewotCQkKLQkJcmV0dXJuIEFQUENMSUVOVF9DT05URU5UX1RZUEU7Ci0JfQotCXByb3RlY3RlZCBVUkkgZ2V0Um9vdFVSSSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUklfT0JKOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvY29tcG9uZW50Y29yZS91dGlsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9jb21wb25lbnRjb3JlL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTNlOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9jb21wb25lbnRjb3JlL3V0aWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFlYmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5BcHBDbGllbnRDb21wb25lbnRJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBYTUxSZXNvdXJjZS5BUFBfQ0xJRU5UX1RZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93blR5cGUoSmF2YUVFUXVpY2tQZWVrIGpxcCkgewotCQlqcXAuc2V0VHlwZShKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSk7Ci0JCWpxcC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpOwotCQlqcXAuc2V0SmF2YUVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKLQl9Ci0KLQkKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGFwcENsaWVudERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApYXBwQ2xpZW50RGF0YU1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJLy9uZWVkIHRvIGVuc3VyZSBubyBkZWZhdWx0IE1haW4gY2xhc3MgaXMgY3JlYXRlZCBkdXJpbmcgaW1wb3J0Ci0JCW1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQpLnNldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTLCBmYWxzZSk7Ci0JCXJldHVybiBhcHBDbGllbnREYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBUkNISVZFX1dSQVBQRVIpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCWlmIChnZXRBcmNoaXZlV3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZHVsZURNLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCQlJRGF0YU1vZGVsIGFwcENsaWVudEZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQgKTsKLQotCQkJCWludCB2ZXJzaW9uID0gZ2V0TW9kdWxlU3BlY1ZlcnNpb24oKTsKLQkJCQlTdHJpbmcgdmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuZ2V0SjJFRVRleHRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0JCQkJYXBwQ2xpZW50RmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOwotCQkJCXVwZGF0ZUphdmFGYWNldFZlcnNpb24oKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCUlEYXRhTW9kZWwgY29tcG9uZW50Q3JlYXRpb25ETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgY29tcG9uZW50Q3JlYXRpb25ETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCUlEYXRhTW9kZWwgYXBwQ2xpZW50RmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UICk7CQotCQlhcHBDbGllbnRGYWNldC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0RELCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRDcmVhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRDcmVhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVlZGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50Q3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHBDbGllbnRDcmVhdGlvblJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiYXBwY2xpZW50Y3JlYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXBwQ2xpZW50Q3JlYXRpb25SZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29jY3VyZWRfZ2V0dGluZ19hcHBsX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19BcHBsaWNhdGlvbl9DbGllbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3Jfb2NjdXJlZF9sb2FkaW5nX2FwcGxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vdF9hbl9BcHBsaWNhdGlvbl9DbGllbnRfcHJvamVjdF9FUlJPUl87Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBcHBDbGllbnRDcmVhdGlvblJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTI0MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfRkFDRVQpOwotICAgICAgICBzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOwotCQkKLQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQlJRGF0YU1vZGVsIGphdmFGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VULmdldElkKCkpOwotCQlJRGF0YU1vZGVsIGFwcENsaWVudEZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VULmdldElkKCkpOwotCQlTdHJpbmcgYXBwQ2xpZW50Um9vdCA9IGFwcENsaWVudEZhY2V0LmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIGFwcENsaWVudFJvb3QpOwotCQkvLyBJZiB1c2luZyBvcHRpbWl6ZWQgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBzZXQgdGhlIG91dHB1dCBmb2xkZXIgdG8gdGhlIGNvbnRlbnQgcm9vdAotCQlpZiAoUHJvZHVjdE1hbmFnZXIuc2hvdWxkVXNlU2luZ2xlUm9vdFN0cnVjdHVyZSgpKQotCQkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5ERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSwgYXBwQ2xpZW50Um9vdCk7Ci0JCWFwcENsaWVudEZhY2V0LmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAoaXNQcm9wZXJ0eVNldChFQVJfUFJPSkVDVF9OQU1FKSkKLQkJCQkJCXNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCQl9ZWxzZSBpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlzZXRQcm9wZXJ0eShBRERfVE9fRUFSLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIE1PRFVMRV9VUkkgKSl7Ci0JCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0JCQlJRGF0YU1vZGVsIGFwcEZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQgKTsJCi0JCQlhcHBGYWNldC5zZXRQcm9wZXJ0eSggSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksIHByb3BlcnR5VmFsdWUgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0OGNmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2NyZWF0aW9uL0lDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzQvMjAwMSAxMDowNToyNCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlmaW5hbCBTdHJpbmcgUExVR19JTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0FwcENsaWVudEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvQXBwQ2xpZW50RWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjUwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvQXBwQ2xpZW50RWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwuQXBwQ2xpZW50QXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFZGl0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFwcENsaWVudEVkaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEFwcENsaWVudEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUgfHwgYWRhcHRlclR5cGUgPT0gQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3Q7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoZWRpdE1vZGVsLmdldFByb2plY3QoKSkpCi0JCQkJcmV0dXJuIG5ldyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117QXJ0aWZhY3RFZGl0LmNsYXNzLCBBcHBDbGllbnRBcnRpZmFjdEVkaXQuY2xhc3N9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZGJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChDUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKQotCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0NMSUVOVDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRFVMRV9VUkkpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpLnJlcGxhY2UoJyAnLCdfJyk7Ci0JCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOyAKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCkpIHsKLQkJCVN0cmluZyBmYWNldFZlcnNpb24gPSBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUik7Ci0JCQlpZihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChmYWNldFZlcnNpb24pID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKMkVFUHJlZmVyZW5jZXMuS2V5cy5BUFBfQ0xJRU5UX0dFTkVSQVRFX0REKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRGYWNldFZlcnNpb25Ub0oyRUVWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0QXBwQ2xpZW50VmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCQotICAgIHB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTkZJR19GT0xERVIpKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBzb3VyY2VGb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgPSBwcm9wZXJ0eVZhbHVlID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgoIChTdHJpbmcpIHByb3BlcnR5VmFsdWUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuc2V0U291cmNlRm9sZGVyKCBzb3VyY2VGb2xkZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmViMWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRGYWNldEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQlmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJCS8vIEFkZCBXVFAgbmF0dXJlcy4KLQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMocHJvamVjdCk7Ci0KLQkJCS8vIFNldHVwIHRoZSBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZS4KLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBjcmVhdGVGbGV4aWJsZVByb2plY3QobW9uaXRvciwgcHJvamVjdCwgbW9kZWwsIGpwcm9qLCBmdik7Ci0KLQkJCS8vIFNldHVwIHRoZSBjbGFzc3BhdGguCi0JCQlDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmdik7Ci0JCQlpZiAoIUNsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KSkgewotCQkJCS8vIFRPRE86IFN1cHBvcnQgdGhlIG5vIHJ1bnRpbWUgY2FzZS4KLQkJCQkvLyBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIDxzb21ldGhpbmc+ICk7Ci0JCQl9Ci0KLQotLy8JCQkvLyBBZGQgbWFpbiBjbGFzcyBpZiBuZWNlc3NhcnkKLS8vCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkKLS8vCQkJCWFkZE1haW5DbGFzcyhtb25pdG9yLCBtb2RlbCwgcHJvamVjdCk7Ci0KLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzKCkpewotCQkJCWZpbmFsIElQYXRoIGVhckxpYkNvbnRhaW5lciA9IG5ldyBQYXRoKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuQ09OVEFJTkVSX0lEKTsKLQkJCQlhZGRUb0NsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoZWFyTGliQ29udGFpbmVyKSk7Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUZsZXhpYmxlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIElEYXRhTW9kZWwgbW9kZWwsIElKYXZhUHJvamVjdCBqcHJvaiwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0JCWZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCWZpbmFsIElQYXRoIHBqcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZmFsc2UpOwotCQljLmNyZWF0ZSgwLCBudWxsKTsKLQkJc2V0T3V0cHV0Rm9sZGVyKG1vZGVsLCBjKTsKLQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkKLQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBudWxsOwotCQlTdHJpbmcgY29uZmlnRm9sZGVyID0gbnVsbDsKLQkJY29uZmlnRm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQlyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgY29uZmlnRm9sZGVyKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbmZpZ0ZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7Ci0JCUlQYXRoIGNvbmZpZ0ZvbGRlcnBhdGggPSBwanBhdGguYXBwZW5kKGNvbmZpZ0ZvbGRlck5hbWUpOwotCQlzb3VyY2VGb2xkZXIgPSB3cy5nZXRSb290KCkuZ2V0Rm9sZGVyKGNvbmZpZ0ZvbGRlcnBhdGgpOwotCi0JCWlmKCBmdiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF82MCApCi0JCXsKLQkgICAgICAgIGlmKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpKXsKLQkgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoYXBwbGljYXRpb24tY2xpZW50LnhtbCkgaWYgb25lIGRvZXNuJ3QgZXhpc3QKLQkgICAgICAgICAgICBJRmlsZSBhcHBDbGllbnRGaWxlID0gc291cmNlRm9sZGVyLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSkpOwotCSAgICAgICAgICAgIGlmICghYXBwQ2xpZW50RmlsZS5leGlzdHMoKSkgewotCSAgICAgICAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgICAgICAgICAgaWYoIWFwcENsaWVudEZpbGUuZ2V0UGFyZW50KCkuZXhpc3RzKCkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGFwcENsaWVudEZpbGUuZ2V0UGFyZW50KCkuZ2V0VHlwZSgpID09ICBJUmVzb3VyY2UuRk9MREVSKSl7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgKChJRm9sZGVyKWFwcENsaWVudEZpbGUuZ2V0UGFyZW50KCkpLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcHBDbGllbnRYbWxDb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxhcHBsaWNhdGlvbi1jbGllbnQgdmVyc2lvbj1cIjVcIiB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2RcIj5cbiA8ZGlzcGxheS1uYW1lPiBcbiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICAiPC9kaXNwbGF5LW5hbWU+IFxuIDwvYXBwbGljYXRpb24tY2xpZW50PiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICAgICAgICAgIGFwcENsaWVudEZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcHBDbGllbnRYbWxDb250ZW50cy5nZXRCeXRlcygiVVRGLTgiKSksIHRydWUsIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCi0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCQl9Ci0JCWVsc2UgaWYoIGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzUwICkKLQkJewotCSAgICAgICAgaWYobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCkpewotCSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhcHBsaWNhdGlvbi1jbGllbnQueG1sKSBpZiBvbmUgZG9lc24ndCBleGlzdAotCSAgICAgICAgICAgIElGaWxlIGFwcENsaWVudEZpbGUgPSBzb3VyY2VGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKSk7Ci0JICAgICAgICAgICAgaWYgKCFhcHBDbGllbnRGaWxlLmV4aXN0cygpKSB7Ci0JICAgICAgICAgICAgICAgIHRyeSB7Ci0JICAgICAgICAgICAgICAgICAgICBpZighYXBwQ2xpZW50RmlsZS5nZXRQYXJlbnQoKS5leGlzdHMoKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYXBwQ2xpZW50RmlsZS5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gIElSZXNvdXJjZS5GT0xERVIpKXsKLQkgICAgICAgICAgICAgICAgICAgICAgICAoKElGb2xkZXIpYXBwQ2xpZW50RmlsZS5nZXRQYXJlbnQoKSkuY3JlYXRlKHRydWUsIHRydWUsIG1vbml0b3IpOwotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFwcENsaWVudFhtbENvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPGFwcGxpY2F0aW9uLWNsaWVudCB2ZXJzaW9uPVwiNVwiIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4c2k6c2NoZW1hTG9jYXRpb249XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZFwiPlxuIDxkaXNwbGF5LW5hbWU+IFxuIiArIHByb2plY3QuZ2V0TmFtZSgpICsgICI8L2Rpc3BsYXktbmFtZT4gXG4gPC9hcHBsaWNhdGlvbi1jbGllbnQ+IjsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50RmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFwcENsaWVudFhtbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKSwgdHJ1ZSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgCQlpZiAoIXNvdXJjZUZvbGRlci5nZXRGaWxlKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkkpLmV4aXN0cygpKSB7Ci0gICAgCQkJU3RyaW5nIHZlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIpOwotICAgIAkJCWludCBuVmVyID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQodmVyKTsKLSAgICAJCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQuY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgblZlcik7Ci0gICAgCQl9Ci0JCX0KLQkJCi0JCS8vIGFkZCBzb3VyY2UgZm9sZGVyIG1hcHMKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwW2ldOwotCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCXJvb3QuY3JlYXRlTGluayhjcGUuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIDAsIG51bGwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjOwotCX0KLQotLy8JcHJpdmF0ZSB2b2lkIGFkZE1haW5DbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElEYXRhTW9kZWwgbW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLS8vCQl0cnkgewotLy8JCQlJRGF0YU1vZGVsIG1haW5DbGFzc0RhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRSwgIk1haW4iKTsgLy8kTk9OLU5MUy0xJAotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fTUVUSE9ELCB0cnVlKTsKLS8vCQkJU3RyaW5nIHByb2pSZWxhdGl2ZVNvdXJjZVBhdGggPSBJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLS8vCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIsIHByb2pSZWxhdGl2ZVNvdXJjZVBhdGgpOwotLy8JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QsIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF0pOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0vLwkJCWNyZWF0ZU1hbmlmZXN0RW50cnlGb3JNYWluQ2xhc3MobW9uaXRvciwgbW9kZWwsIHByb2plY3QpOwotLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JfQotCi0vLwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYW5pZmVzdEVudHJ5Rm9yTWFpbkNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSURhdGFNb2RlbCBtb2RlbCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQlJVmlydHVhbENvbXBvbmVudCBhcHBDbGllbnRDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLS8vCQlJVmlydHVhbEZpbGUgdmYgPSBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLS8vCQlJRmlsZSBtYW5pZmVzdG1mID0gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLS8vCQlpZiAobWFuaWZlc3RtZiA9PSBudWxsIHx8ICFtYW5pZmVzdG1mLmV4aXN0cygpKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLwkJCX0KLS8vCQkJU3RyaW5nIG1hbmlmZXN0Rm9sZGVyID0gSVBhdGguU0VQQVJBVE9SICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpICsgSVBhdGguU0VQQVJBVE9SICsgSjJFRUNvbnN0YW50cy5NRVRBX0lORjsKLS8vCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBwcm9qZWN0LmdldEZvbGRlcihtYW5pZmVzdEZvbGRlcik7Ci0vLwkJCW1hbmlmZXN0bWYgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1NIT1JUX05BTUUpKTsKLS8vCQl9Ci0vLwkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkgewotLy8JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7Ci0vLwkJCWRtLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NRVJHRSwgZmFsc2UpOwotLy8JCQlkbS5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgbWFuaWZlc3RtZik7Ci0vLwkJCWRtLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQUlOX0NMQVNTLCAiTWFpbiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCXRyeSB7Ci0vLwkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCS8vIElnbm9yZQotLy8JCQl9Ci0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk5ZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQkKLQkJCS8vIEFkZCBtYWluIGNsYXNzIGlmIG5lY2Vzc2FyeQotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSl7Ci0JCQkJYWRkTWFpbkNsYXNzKG1vbml0b3IsIG1vZGVsLCBwcm9qZWN0KTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlTWFuaWZlc3RFbnRyeUZvck1haW5DbGFzcyhtb25pdG9yLCBtb2RlbCwgcHJvamVjdCk7Ci0JCQl9Ci0KLQkJCS8vIEFzc29jaWF0ZSB3aXRoIGFuIEVBUiwgaWYgbmVjZXNzYXJ5LgotCQkJZmluYWwgU3RyaW5nIGVhclByb2plY3ROYW1lID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpOwotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpIHsKLQkJCQlpZiAoZWFyUHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhZWFyUHJvamVjdE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB2ZXIgPSBmdi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCQkJCQotCQkJCQlTdHJpbmcgajJlZVZlcnNpb25UZXh0ID0gdmVyOwotCQkJCQlpbnN0YWxsRUFSRmFjZXQoajJlZVZlcnNpb25UZXh0LCBlYXJQcm9qZWN0TmFtZSwgKElSdW50aW1lKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSksIG1vbml0b3IpOwotCQkJCQlmaW5hbCBTdHJpbmcgbW9kdWxlVVJJID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkpOwotCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotCQkJCQkKLQkJCQkJaW5zdGFsbEFuZEFkZE1vZHVsZXRvRUFSKCBqMmVlVmVyc2lvblRleHQsCi0JCQkJCQkJCWVhclByb2plY3ROYW1lLAotCQkJCQkJCQlmcGp3Yy5nZXRQcmltYXJ5UnVudGltZSgpLAotCQkJCQkJCQlwcm9qZWN0LAotCQkJCQkJCQltb2R1bGVVUkksCi0JCQkJCQkJCW1vbml0b3IgKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1haW5DbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElEYXRhTW9kZWwgbW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWwgbWFpbkNsYXNzRGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3MpOwotCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsICJNYWluIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1haW5DbGFzc0RhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9NRVRIT0QsIHRydWUpOwotCi0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUZvbGRlck9yRmlyc3QocHJvamVjdCwgbnVsbCk7Ci0JCQlpZiggY29udGFpbmVyICE9IG51bGwgKXsKLQkJCQlTdHJpbmcgcHJvalJlbGF0aXZlU291cmNlUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUiwgcHJvalJlbGF0aXZlU291cmNlUGF0aCk7Ci0JCQkJbWFpbkNsYXNzRGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCWNyZWF0ZU1hbmlmZXN0RW50cnlGb3JNYWluQ2xhc3MobW9uaXRvciwgbW9kZWwsIHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYW5pZmVzdEVudHJ5Rm9yTWFpbkNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSURhdGFNb2RlbCBtb2RlbCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgYXBwQ2xpZW50Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlWaXJ0dWFsRmlsZSB2ZiA9IGFwcENsaWVudENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQlJRmlsZSBtYW5pZmVzdG1mID0gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJaWYgKG1hbmlmZXN0bWYgPT0gbnVsbCB8fCAhbWFuaWZlc3RtZi5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9ERUZBVUxUX01BSU5fQ0xBU1MpKSB7Ci0JCQlTdHJpbmcgbWFuaWZlc3RGb2xkZXIgPSBJUGF0aC5TRVBBUkFUT1IgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUikgKyBJUGF0aC5TRVBBUkFUT1IgKyBKMkVFQ29uc3RhbnRzLk1FVEFfSU5GOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBwcm9qZWN0LmdldEZvbGRlcihtYW5pZmVzdEZvbGRlcik7Ci0JCQltYW5pZmVzdG1mID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9TSE9SVF9OQU1FKSk7Ci0JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlkbS5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgbWFuaWZlc3RtZik7Ci0JCQlkbS5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9DTEFTUywgIk1haW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5YWQ5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQkKLQkgLyoqCi0gICAgICogT3B0aW9uYWwsIHR5cGUgQm9vbGVhbi4gdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPi5JZiB0aGlzIGlzIHRydWUgYW5kIENSRUFURV9ERUZBVUxUX0ZJTEVTIGlzIHRydWUsIHRoZW4gYSBkZWZhdWx0IG1haW4KLSAgICAgKiBjbGFzcyB3aWxsIGJlIGdlbmVyYXRlZCBkdXJpbmcgY29tcG9uZW50IGNyZWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUZBVUxUX01BSU5fQ0xBU1MgPSAiSUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vY29tbW9uL0NyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vY29tbW9uL0NyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY5NGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL2NvbW1vbi9DcmVhdGVDaGlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uY29tbW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGNvbW1hbmQgdGhhdCB3aWxsIGFkZCBhIG5ldyBjaGlsZCBvZiBhcHByb3ByaWF0ZSB0eXBlIHRvIGFuIG9iamVjdC4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZXMgYW4gb3duZXIsIGEgZmVhdHVyZSwgYW5kIGEgaGVscGVyIHRvIHdoaWNoIHRoZSBpbXBsZW1lbnRhdGlvbiBpcwotICogZGVsZWdhdGVkLAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQ2hpbGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgaW1wbGVtZW50cyBDb21tYW5kQWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgaGVscGVyIGludGVyZmFjZSB0byB3aGljaCBjaGlsZCBjcmVhdGlvbiBpcyBkZWxlZ2F0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSGVscGVyIHsKLQkJLyoqCi0JCSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBjb21tYW5kIGJlaGF2aW9yCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpOwotCi0JCS8qKgotCQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgbGFiZWwKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpOwotCi0JCS8qKgotCQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaGVscCB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBpbWFnZQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGVkaXRpbmcgZG9tYW4gaW4gd2hpY2ggdGhpcyBjb21tYW5kIG9wZXJhdGVzLgotCSAqLwotCXByb3RlY3RlZCBFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBvd25lciB0byB3aGljaCBjaGlsZHJlbiB3aWxsIGJlIGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IG93bmVyOwotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGZlYXR1cmUgb2YgdGhlIG93bmVyIHRvIHdoaWNoIGNoaWxkcmVuIHdpbGwgYmUgYWRkZWQuCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZmVhdHVyZTsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBoZWxwZXIgb2JqZWN0IHRvIHdoaWNoIGNoaWxkIGNyZWF0aW9uIGlzIGRlbGVnYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciBoZWxwZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2VzIHRoYXQgd2lsbCBhZGQgc29tZXRoaW5nIHRvIHRoZSBvd25lcidzIGZlYXR1cmUgYmFzZWQgb24gdGhlCi0JICogZGVsZWdhdGUgaGVscGVyLgotCSAqLwotCXB1YmxpYyBDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgZmVhdHVyZSwgQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgYSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhIG5ldyBjaGlsZCBvZiBzb21lIGFwcHJvcHJpYXRlIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIGNyZWF0ZShFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZG9tYWluLmNyZWF0ZUNvbW1hbmQoQ3JlYXRlQ2hpbGRDb21tYW5kLmNsYXNzLCBuZXcgQ29tbWFuZFBhcmFtZXRlcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGFkZCBjb21tYW5kIHRoYXQgd2lsbCBpbXBsZW1lbnQgdGhpcyBhY3Rpb24gYW5kIHNwZWNpZmllcyB0aGUgY29sbGVjdGlvbiBieQotCSAqIGRlbGVnYXRpbmcgdG8ge0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIEFkZENvbW1hbmQuY3JlYXRlKGRvbWFpbiwgb3duZXIsIG51bGwsIGhlbHBlci5jcmVhdGVDaGlsZChvd25lcikpOwotCQl9Ci0JCXJldHVybiBuZXcgQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBoZWxwZXIuY3JlYXRlQ2hpbGQob3duZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0fS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gaGVscGVyLmdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQob3duZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2V9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0fS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0fS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQob3duZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNTE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbn1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBjaGlsZCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPOiBjaGVjayB0aGF0IHRoaXMgaXMgd2hhdCB5b3Ugd2FudC4KLQkJTW9kdWxlIGNoaWxkID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlTW9kdWxlKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZU1vZHVsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX01vZHVsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfYV9jaGlsZF9vZl90eXBlX01vZHVsZV9mb3JfdGhlX3NlbGVjdGVkX1VJXyIpICsgcmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKSArICIuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFwcGxpY2F0aW9uLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCWlmICgoKEFwcGxpY2F0aW9uKSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZWFyRmlsZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2ggKCgoQXBwbGljYXRpb24pIG9iamVjdCkuZ2V0VmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQkJCWtleSA9ICIxMl9lYXJfb2JqIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJa2V5ID0gIjEzX2Vhcl9vYmoiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJCWRlZmF1bHQgOgotCQkJCWtleSA9ICIxNF9lYXJfb2JqIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQXBwbGljYXRpb25fdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcHBsaWNhdGlvbl92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX0FwcGxpY2F0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gKChBcHBsaWNhdGlvbikgb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCQlyZXR1cm4gZGlzcGxheU5hbWUgPT0gbnVsbCA/IEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiPDxOb19kaXNwbGF5X25hbWU+Pl9FUlJPUl8iKSA6IGRpc3BsYXlOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFwcGxpY2F0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT04gOgotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTIDoKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZHVsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksIEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViTW9kdWxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFamJNb2R1bGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNDE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0KLQotLyoqCi0gKiBUaGlzIGV4dGVuZGVkIGl0ZW0gcHJvdmlkZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uIFRoZQotICogY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0gYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgewotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaW1hZ2UgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIkNyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgbGFiZWwgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9DaGlsZF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBoZWxwIHRleHQgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9hX25ld19jaGlsZF9mb3JfdGhlX3NlbGVjdGVkX1VJXyIpICsgcmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKSArICIuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAwMGM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0FwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyfXMuIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GCi0gKiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzCi0gKiBhbHNvIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXN9LiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUKLSAqIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9ufWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25JdGVtUHJvdmlkZXIgYXBwbGljYXRpb25JdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLk1vZHVsZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUl0ZW1Qcm92aWRlciBtb2R1bGVJdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLldlYk1vZHVsZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFdlYk1vZHVsZUl0ZW1Qcm92aWRlciB3ZWJNb2R1bGVJdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyIGphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIgY29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5FamJNb2R1bGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFamJNb2R1bGVJdGVtUHJvdmlkZXIgZWpiTW9kdWxlSXRlbVByb3ZpZGVyOwotCXByb3RlY3RlZCBEaXNwb3NhYmxlIGRpc3Bvc2FibGUgPSBuZXcgRGlzcG9zYWJsZSgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlcktleSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlclR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHROZXcodGFyZ2V0LCBhZGFwdGVyVHlwZSk7Ci0JCWRpc3Bvc2FibGUuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb259LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLkVqYk1vZHVsZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWpiTW9kdWxlQWRhcHRlcigpIHsKLQkJaWYgKGVqYk1vZHVsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllamJNb2R1bGVJdGVtUHJvdmlkZXIgPSBuZXcgRWpiTW9kdWxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYk1vZHVsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlQWRhcHRlcigpIHsKLQkJaWYgKGphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJamF2YUNsaWVudE1vZHVsZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgY29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rvck1vZHVsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29ubmVjdG9yTW9kdWxlQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uTW9kdWxlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVBZGFwdGVyKCkgewotCQlpZiAobW9kdWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1vZHVsZUl0ZW1Qcm92aWRlciA9IG5ldyBNb2R1bGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kdWxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLldlYk1vZHVsZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViTW9kdWxlQWRhcHRlcigpIHsKLQkJaWYgKHdlYk1vZHVsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJNb2R1bGVJdGVtUHJvdmlkZXIgPSBuZXcgV2ViTW9kdWxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYk1vZHVsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNwb3NhYmxlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNhbGxzIHtAbGluayBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfWZvciBlYWNoIHZpZXdlcgotCSAqIGluIHtAbGluayAjbm90aWZ5Q2hhbmdlZExpc3RlbmVyc30uCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IGZvciAoSXRlcmF0b3IgaSA9IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkgKiBpLmhhc05leHQoKTsgKSB7IElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyID0KLQkgKiAoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsgbm90aWZ5Q2hhbmdlZExpc3RlbmVyLm5vdGlmeUNoYW5nZWQobmV3Ci0JICogRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClvYmplY3QsIGV2ZW50VHlwZSwoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlLCBvbGRWYWx1ZSwKLQkgKiBuZXdWYWx1ZSwgaW5kZXgpKTsgfQotCSAqIAotCSAqIGlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG9iamVjdCwgZXZlbnRUeXBlLAotCSAqIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOyB9IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0FwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWUyNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUxvY2F0b3IgUkVTT1VSQ0VfTE9DQVRPUiA9IG5ldyBSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoYXJnMCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhhcmcwKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBhcmcwLCBPYmplY3RbXSBhcmcxKSB7Ci0JCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKGFyZzAsIGFyZzEpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQkJcmV0dXJuIGdldFN0cmluZyhrZXksc3Vic3RpdHV0aW9ucyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImFwcGxpY2F0aW9ucHJvdmlkZXJzIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0Nvbm5lY3Rvck1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDg4NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIENvbm5lY3RvciBtb2R1bGVzIGluIGVhcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEN1cnJlbnQgYWRhcHRlcgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyByZXNvdXJjZSBpbWFnZQotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIHJlc291cmNlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29ubmVjdG9yX21vZHVsZSIpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldEltYWdlCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbm5lY3Rvck1vZHVsZSkgb2JqZWN0KS5nZXRVcmkoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Nvbm5lY3Rvck1vZHVsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0Nvbm5lY3Rvck1vZHVsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQ29ubmVjdG9yTW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIHJlc291cmNlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIHJlc291cmNlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0KLX0vLyBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0VqYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvRWpiTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkY2MwMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvRWpiTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLkVqYk1vZHVsZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBFamJNb2R1bGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFamJNb2R1bGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibW9kdWxlX2VqYl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRWpiTW9kdWxlKSBvYmplY3QpLmdldFVyaSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRWpiTW9kdWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWpiTW9kdWxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEVqYk1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0phdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0phdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNGE3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9KYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSmF2YUNsaWVudE1vZHVsZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtb2R1bGVfY2xpZW50YXBwX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChKYXZhQ2xpZW50TW9kdWxlKSBvYmplY3QpLmdldFVyaSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSmF2YUNsaWVudE1vZHVsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0phdmFDbGllbnRNb2R1bGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgSmF2YUNsaWVudE1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL01vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGY1OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLk1vZHVsZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBNb2R1bGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNb2R1bGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIk1vZHVsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIE1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlBcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHVyaSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVcmlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3VyaV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldE1vZHVsZV9VcmkoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgYWx0REQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQWx0RERfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2FsdEREX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0TW9kdWxlX0FsdEREKCksIGZhbHNlKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBcHBsaWNhdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfYXBwbGljYXRpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRNb2R1bGVfQXBwbGljYXRpb24oKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJpIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTW9kdWxlX3VyaV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Nb2R1bGVfdXJpX2ZlYXR1cmUiLCAiX1VJX01vZHVsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TW9kdWxlX1VyaSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWx0IEREIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdEREUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Nb2R1bGVfYWx0RERfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kdWxlX2FsdEREX2ZlYXR1cmUiLCAiX1VJX01vZHVsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TW9kdWxlX0FsdEREKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFVSSUlmUG9zc2libGUoKE1vZHVsZSkgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTW9kdWxlLmNsYXNzKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkkgOgotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJJSWZQb3NzaWJsZShNb2R1bGUgbSkgewotCQlyZXR1cm4gbS5nZXRVcmkoKSA9PSBudWxsID8gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI8PFVSSV9ub3Rfc2V0Pj5fRVJST1JfIikgOiBtLmdldFVyaSgpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IEFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOzsgaWYKLQkgKiAoZmVhdHVyZSA9PSBwa2cuZ2V0TW9kdWxlX1VyaSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldE1vZHVsZV9BbHRERCgpIHx8IGZlYXR1cmUgPT0KLQkgKiBwa2cuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCkpIHsgZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsCi0JICogbmV3VmFsdWUsIGluZGV4KTsgLy8gTW9kdWxlRXh0ZW5zaW9uIGRvZXMgbm90IHVwZGF0ZSBhdXRvbWF0aWNhbGx5LiAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMKLQkgKiB0byBleHBsaWNpdGx5IG5vdGlmeSBBcHBsaWNhdGlvbkV4dGVuc2lvbiBpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0TW9kdWxlX1VyaSgpIHx8IGZlYXR1cmUgPT0KLQkgKiBwa2cuZ2V0TW9kdWxlX0FsdEREKCkgKSB7IEFwcGxpY2F0aW9uRXh0ZW5zaW9uIGFwcGxpY2F0aW9uRXh0ZW5zaW9uID0KLQkgKiBBcHBsaWNhdGlvbkV4dGVuc2lvbnNIZWxwZXIuZ2V0QXBwbGljYXRpb25FeHRlbnNpb24oKChNb2R1bGUpbm90aWZpZXIpLmdldEFwcGxpY2F0aW9uKCkpOyBpZgotCSAqIChhcHBsaWNhdGlvbkV4dGVuc2lvbiA9PSBudWxsKSByZXR1cm47IEVPYmplY3QgbmV3RmVhdHVyZSA9Ci0JICogQXBwbGljYXRpb25leHRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkV4dGVuc2lvbl9Nb2R1bGVFeHRlbnNpb25zKCk7IE9iamVjdAotCSAqIG1vZHVsZUV4dGVuc2lvbiA9IGFwcGxpY2F0aW9uRXh0ZW5zaW9uLmdldE1vZHVsZUV4dGVuc2lvbigoTW9kdWxlKW5vdGlmaWVyKTsgTm90aWZpY2F0aW9uCi0JICogbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbkltcGwoYXBwbGljYXRpb25FeHRlbnNpb24sIE5vdGlmaWNhdGlvbi5TRVQsIG5ld0ZlYXR1cmUsCi0JICogbW9kdWxlRXh0ZW5zaW9uLCBtb2R1bGVFeHRlbnNpb24pOyBhcHBsaWNhdGlvbkV4dGVuc2lvbi5lTm90aWZ5KG5vdGlmaWNhdGlvbik7IH0gLy8gY29kZSBlbmRzCi0JICogcmV0dXJuOyB9IHN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL1dlYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvV2ViTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTg1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvV2ViTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLldlYk1vZHVsZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJNb2R1bGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibW9kdWxlX3dlYl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2ViTW9kdWxlKSBvYmplY3QpLmdldFVyaSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViTW9kdWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV2ViTW9kdWxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViTW9kdWxlLmNsYXNzKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgV2ViTW9kdWxlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCUFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgY29udGV4dFJvb3QgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29udGV4dFJvb3RfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2NvbnRleHRSb290X3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCksIGZhbHNlKSk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbnRleHQgUm9vdCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZXh0Um9vdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViTW9kdWxlX2NvbnRleHRSb290X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYk1vZHVsZV9jb250ZXh0Um9vdF9mZWF0dXJlIiwgIl9VSV9XZWJNb2R1bGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYk1vZHVsZV9Db250ZXh0Um9vdCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0FwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjhiOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuQXBwbGljYXRpb25DbGllbnR9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNyZWF0ZSBzb21lIGNoaWxkIG9iamVjdC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJQ2xpZW50UGFja2FnZSBwa2cgPSBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZmVyZW5jZXMoKSk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZpcm9ubWVudFByb3BzKCkpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZSNDSElMRF9DTEFTU19OQU1FIyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY2xpZW50LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9DaGlsZF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX2FfY2hpbGRfZm9yX3RoZV9zZWxlY3RlZF9VSV8iKSArIHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBcHBsaWNhdGlvbkNsaWVudC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBrZXkgPSBudWxsOwotCQlpZiAoKChBcHBsaWNhdGlvbkNsaWVudCkgb2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImFwcGxjbGllbnRKQVJfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoICgoKEFwcGxpY2F0aW9uQ2xpZW50KSBvYmplY3QpLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCQlrZXkgPSAiYXBwY2xpZW50XzEyIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJa2V5ID0gImFwcGNsaWVudF8xMyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQkJZGVmYXVsdCA6Ci0JCQkJa2V5ID0gImFwcGNsaWVudF8xNCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBBcHBsaWNhdGlvbkNsaWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZXJzaW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FwcGxpY2F0aW9uQ2xpZW50X3ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXBwbGljYXRpb25DbGllbnRfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9BcHBsaWNhdGlvbkNsaWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENhbGxiYWNrIEhhbmRsZXIgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2FsbGJhY2tIYW5kbGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BcHBsaWNhdGlvbkNsaWVudF9jYWxsYmFja0hhbmRsZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXBwbGljYXRpb25DbGllbnRfY2FsbGJhY2tIYW5kbGVyX2ZlYXR1cmUiLCAiX1VJX0FwcGxpY2F0aW9uQ2xpZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCi0JCS8qCi0JCSAqIFN0cmluZyBkaXNwbGF5TmFtZSA9ICgoQXBwbGljYXRpb25DbGllbnQpIG9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsgcmV0dXJuIGRpc3BsYXlOYW1lID09Ci0JCSAqIG51bGwgPyAiIiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIiA8IDxOb19kaXNwbGF5X25hbWU+Pl9FUlJPUl8iKSA6Ci0JCSAqIGRpc3BsYXlOYW1lOyAvLyROT04tTkxTLTEkCi0JCSAqLwotCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBjbGllbnQgPSAoKEFwcGxpY2F0aW9uQ2xpZW50KSBvYmplY3QpOwotCQlpZiAoYXBwY2xpZW50LmdldERpc3BsYXlOYW1lKCkgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFwcGNsaWVudCk7Ci0JCQkJcmV0dXJuIHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYW1lKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0KLQkJCVJlc291cmNlIHJlc291cmNlID0gYXBwY2xpZW50LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFBhdGgocmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYXBwY2xpZW50LmdldERpc3BsYXlOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiA6Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTIDoKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTIDoKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTIDoKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTIDoKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyA6Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgOgotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlUmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZpcm9ubWVudFByb3BzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudkVudHJ5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZlcmVuY2VzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVqYlJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMb2NhbFJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlRW52UmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBteUNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJbXlDaGlsZHJlbi5hZGRBbGwoY2xpZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0JCWlmIChjbGllbnQuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpIHsKLQkJCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQkJbXlDaGlsZHJlbi5hZGRBbGwoc2VydmljZUhlbHBlci5nZXQxM1NlcnZpY2VSZWZzKGNsaWVudCkpOwotCQl9CQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTNhNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQ2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmNvbW1vbi5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXIuQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXI7Ci0KLQotCi0vKioKLSAqIFRoaXMgZXh0ZW5kZWQgaXRlbSBwcm92aWRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uIFRoZSBjb21tYW5kcwotICogYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0gYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uY29tbW9uLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIgewotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBDbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyB0aGUgc3VwcG9ydGVkIGNvbW1hbmRzLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlpZiAoY29tbWFuZENsYXNzID09IENyZWF0ZUNoaWxkQ29tbWFuZC5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBDcmVhdGVDaGlsZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKEVPYmplY3QpIG9iamVjdCwgbnVsbCwgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBlZGl0aW5nRG9tYWluLCBjb21tYW5kQ2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBpbWFnZSBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY2xpZW50LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIkNyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgbGFiZWwgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfQ2hpbGRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX2FfbmV3X2NoaWxkX2Zvcl90aGVfc2VsZWN0ZWRfVUlfIikgKyByZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQ2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1YjE1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwudXRpbC5DbGllbnRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcn1zLiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRgotICogYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycwotICogYWxzbyBzdXBwb3J0IHByb3BlcnR5IHNoZWV0cywgc2VlIHtAbGluayBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzfS4gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlCi0gKiBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIENsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ2xpZW50QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayAjSUNoYW5nZU5vdGlmaWVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuQXBwbGljYXRpb25DbGllbnR9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudEl0ZW1Qcm92aWRlciBhcHBsaWNhdGlvbkNsaWVudEl0ZW1Qcm92aWRlcjsKLQlwcm90ZWN0ZWQgRGlzcG9zYWJsZSBkaXNwb3NhYmxlID0gbmV3IERpc3Bvc2FibGUoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdCh0YXJnZXQsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJLy8gVGhpcyBpcyBhIGtsdWRnZSB0byBkZWFsIHdpdGggZW51bWVyYXRvcnMsIHdoaWNoIGNyYXNoIHRoZSBkb1N3aXRjaC4KLQkJLy8KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCBhZGFwdGVyVHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdE5ldyh0YXJnZXQsIGFkYXB0ZXJUeXBlKTsKLQkJZGlzcG9zYWJsZS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuQXBwbGljYXRpb25DbGllbnR9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50QWRhcHRlcigpIHsKLQkJaWYgKGFwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2FibGUuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgotCSAqLwotCS8qCi0JICogcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgKiBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgeyBjaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChvYmplY3QsIGV2ZW50VHlwZSwgZmVhdHVyZSwKLQkgKiBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkgKiAKLQkgKiBpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeyBwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChvYmplY3QsIGV2ZW50VHlwZSwKLQkgKiBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgfSB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkgfHwgc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0VBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0VBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYmI3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9FQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXIuQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLkVBUlByb2plY3RNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5FQVJQcm9qZWN0TWFwfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlciBleHRlbmRzIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqIEFkZGVkIHRvIGdlbmVyYXRlZCBjb2RlICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZU1vZHVsZXMgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEVBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIGJvb2xlYW4gaW5jbHVkZU1vZHVsZXMpIHsKLQkJdGhpcyhhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuaW5jbHVkZU1vZHVsZXMgPSBpbmNsdWRlTW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWlmIChpbmNsdWRlTW9kdWxlcykKLQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVBUlByb2plY3RNYXBfTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVBUlByb2plY3RNYXBfVXRpbGl0eUpBUk1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBUT0RPOiBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UKLQkJLy8gZm9yCi0JCS8vICAgICAgIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgRUFSUHJvamVjdE1hcC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFQVJQcm9qZWN0TWFwLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIkVBUlByb2plY3RNYXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUlByb2plY3RNYXBfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRUFSUHJvamVjdE1hcC5jbGFzcykpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX01BUFBJTkdTIDoKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBFT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgKiBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgeyBNb2R1bGVtYXBQYWNrYWdlIHBrZyA9IE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFOzsgaWYKLQkgKiAoIWluY2x1ZGVNb2R1bGVzICYmIGZlYXR1cmUgPT0gcGtnLmdldEVBUlByb2plY3RNYXBfTWFwcGluZ3MoKSkgcmV0dXJuOwotCSAqIAotCSAqIGlmIChmZWF0dXJlID09IHBrZy5nZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCkgfHwgZmVhdHVyZSA9PQotCSAqIHBrZy5nZXRFQVJQcm9qZWN0TWFwX1V0aWxpdHlKQVJNYXBwaW5ncygpKSB7IGZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsCi0JICogb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7IHJldHVybjsgfSBzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsCi0JICogb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmtjb20uaWJtLmV0b29scy5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCWlmIChpbmNsdWRlTW9kdWxlcykKLQkJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKG1vZHVsZW1hcFBhY2thZ2UuZ2V0RUFSUHJvamVjdE1hcF9NYXBwaW5ncygpLCBtb2R1bGVtYXBQYWNrYWdlLmdldE1vZHVsZU1hcHBpbmcoKSkpOwotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihtb2R1bGVtYXBQYWNrYWdlLmdldEVBUlByb2plY3RNYXBfVXRpbGl0eUpBUk1hcHBpbmdzKCksIG1vZHVsZW1hcFBhY2thZ2UuZ2V0VXRpbGl0eUpBUk1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQ3NGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0ZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLQotcHVibGljIGNsYXNzIEZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotICAgIAotewotICAgIHB1YmxpYyBib29sZWFuIHRlc3QoIGZpbmFsIE9iamVjdCByZWNlaXZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhICggcmVjZWl2ZXIgaW5zdGFuY2VvZiBKMkVFSXRlbVByb3ZpZGVyICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKChKMkVFSXRlbVByb3ZpZGVyKSByZWNlaXZlcikuZ2V0QXNzb2NpYXRlZEZpbGUoKTsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcGogPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb24gPSB2YWwuaW5kZXhPZiggJzonICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmV4cHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjb2xvbiA9PSAtMSB8fCBjb2xvbiA9PSB2YWwubGVuZ3RoKCkgLSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWQgPSB2YWw7Ci0gICAgICAgICAgICAgICAgdmV4cHIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpZCA9IHZhbC5zdWJzdHJpbmcoIDAsIGNvbG9uICk7Ci0gICAgICAgICAgICAgICAgdmV4cHIgPSB2YWwuc3Vic3RyaW5nKCBjb2xvbiArIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldCggcGosIGZpZCwgdmV4cHIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNzFmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEoyRUVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSUZJTEVfQ0xBU1MgPSBJRmlsZS5jbGFzczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgSjJFRUl0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUl0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUl0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIodGV4dCwgaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIodGV4dCwgaW1hZ2UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUl0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEoyRUVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSjJFRUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUl0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBKMkVFSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZpY2F0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZU5vdGlmaWNhdGlvbigpIHsKLQkJbm90aWZpY2F0aW9uT24gPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVOb3RpZmljYXRpb24oKSB7Ci0JCW5vdGlmaWNhdGlvbk9uID0gdHJ1ZTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbk9uKQotCQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZGlzYWJsZU5vdGlmaWNhdGlvbigpOwotCQkJCWluaXRpYWxpemVDaGlsZHJlbigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllbmFibGVOb3RpZmljYXRpb24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNoaWxkcmVuKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gSVJFU09VUkNFX0NMQVNTIHx8IGFkYXB0ZXIgPT0gSUZJTEVfQ0xBU1MpCi0JCQlyZXR1cm4gbnVsbDsgLy9yZXR1cm4gZ2V0QXNzb2NpYXRlZEZpbGUoKTsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEFzc29jaWF0ZWRGaWxlKCkgewotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXJlbnQoKSB7Ci0vLwkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRQYXJlbnQoKSk7Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNmY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZU1hcHBpbmd9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIE1vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlNb2R1bGVtYXBQYWNrYWdlIHBrZyA9IE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcHJvamVjdE5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9OYW1lXzEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV9tb2R1bGVfbWFwcGluZ19VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBtb2R1bGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9tb2R1bGVfb2ZfdGhlX21vZHVsZV9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Nb2R1bGVNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZHVsZU1hcHBpbmdfcHJvamVjdE5hbWVfZmVhdHVyZSIsICJfVUlfTW9kdWxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCU1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01vZHVsZU1hcHBpbmdfbW9kdWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZHVsZU1hcHBpbmdfbW9kdWxlX2ZlYXR1cmUiLCAiX1VJX01vZHVsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVNYXBwaW5nX01vZHVsZSgpLCB0cnVlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgTW9kdWxlTWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNb2R1bGVNYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIk1vZHVsZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCU1vZHVsZU1hcHBpbmcgbW9kdWxlTWFwcGluZyA9ICgoTW9kdWxlTWFwcGluZykgb2JqZWN0KTsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlTWFwcGluZ19VSV8iKSArIG1vZHVsZU1hcHBpbmcuZ2V0UHJvamVjdE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNb2R1bGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19QUk9KRUNUX05BTUUgOgotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19NT0RVTEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKLQl9Ci0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqLwotCS8qCi0JICogcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsCi0JICogT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsgTW9kdWxlbWFwUGFja2FnZSBwa2cgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTs7IGlmICgKLQkgKiBmZWF0dXJlID09IHBrZy5nZXRNb2R1bGVNYXBwaW5nX1Byb2plY3ROYW1lKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSApIHsKLQkgKiBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgcmV0dXJuOyB9Ci0JICogc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmY2YWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgTGVhdmluZyB0aGlzIGluIGZvciBub3csIHRvIG1pbmltaXplIGJyZWFrYWdlIHRvIGFsbCB0aGUgcHJvdmlkZXJzOyBzaG91bGQgZGVsZXRlCi0gKiAgICAgICAgICAgICB3aGVuIHdlIHJlZ2VuIGFsbCBwcm92aWRlcnMgZm9yIG1vZjUKLSAqIAotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBtb2R1bGVtYXAgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwRWRpdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlbWFwRWRpdFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBtb2R1bGVtYXAgcGFja2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlbWFwUGFja2FnZSBtb2R1bGVtYXBQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlbWFwRWRpdFBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IpOwotCi0JCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCS8vCi0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgbW9kdWxlbWFwIHBhY2thZ2UuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcFBhY2thZ2UgZ2V0TW9kdWxlbWFwUGFja2FnZSgpIHsKLQkJcmV0dXJuIG1vZHVsZW1hcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgbW9kdWxlbWFwIGZhY3RvcnkuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEZhY3RvcnkgZ2V0TW9kdWxlbWFwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2R1bGVtYXBGYWN0b3J5KSBtb2R1bGVtYXBQYWNrYWdlLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBpbml0aWFsaXphdGlvbiBzdHVmZiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0dXAoKTsKLQkJbW9kdWxlbWFwUGFja2FnZSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVtYXBFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF90b19sb2FkX2ltYWdlX2Zvcl9FUlJPUl8iKSArIGtleSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCBhbiBvYmplY3Qgc3Vic3RpdHV0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCB0d28gb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHRocmVlIG9iamVjdCBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyLCBPYmplY3QgczMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyLCBzM30pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmM4YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgZXh0ZW5kZWQgaXRlbSBwcm92aWRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotICogPHVsPgotICogPGxpPntAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGUgY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0gYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBwYWNrYWdlIGZvciB0aGUgbW9kdWxlbWFwIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTW9kdWxlbWFwUGFja2FnZSBtb2R1bGVtYXBQYWNrYWdlID0gKE1vZHVsZW1hcFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZHVsZW1hcFBhY2thZ2UuZU5TX1VSSSk7Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgZmFjdG9yeSBmb3IgdGhlIG1vZHVsZW1hcCBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1vZHVsZW1hcEZhY3RvcnkgbW9kdWxlbWFwRmFjdG9yeSA9IG1vZHVsZW1hcFBhY2thZ2UuZ2V0TW9kdWxlbWFwRmFjdG9yeSgpOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYW4gYWRhcHRlciBmYWN0b3J5IGFuZCBhIGRvbWFpbiBub3RpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBzdXBwb3J0ZWQgY29tbWFuZHMuCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyA8Y29kZT5Db21tYW5kUGFyYW1ldGVyPC9jb2RlPiBzIGZvciBhIGdpdmVuCi0JICogcGFyZW50IGZlYXR1cmUgYW5kIGNoaWxkIHR5cGUgKE1PRiBtZXRhLW9iamVjdCkuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRQYXJhbWV0ZXIgY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoRVJlZmVyZW5jZSBmZWF0dXJlLCBFT2JqZWN0IGNoaWxkVHlwZSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmRQYXJhbWV0ZXIobnVsbCwgZmVhdHVyZSwgbW9kdWxlbWFwRmFjdG9yeS5jcmVhdGUoY2hpbGRUeXBlLmVDbGFzcygpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBkZWZhdWx0IG93bmVyIG9iamVjdCBmb3Ige0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZE93bmVyKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgcmVzdWx0IGNvbGxlY3Rpb24gZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENyZWF0ZUNoaWxkUmVzdWx0KE9iamVjdCBjaGlsZCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXJlc3VsdC5hZGQoY2hpbGQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBsYWJlbCBmb3Ige0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgZGVzY3JpcHRpb24gZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGREZXNjcmlwdGlvbihPYmplY3QgcGFyZW50LCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaGVscCB0ZXh0IGZvciB7QGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90b29sdGlwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaW1hZ2UgZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3QgcGFyZW50LCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRU9iamVjdCkgcGFyZW50KS5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlIiArICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJaW1hZ2UgPSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxvb2tzIHVwIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZVRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgdHlwZUtleSA9IG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgPyAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0TmFtZSgpIDogIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJXyIgKyB0eXBlS2V5ICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9va3MgdXAgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoT2JqZWN0IGZlYXR1cmUpIHsKLQkJU3RyaW5nIGZlYXR1cmVLZXkgPSBmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSA/ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuZ2V0TmFtZSgpIDogIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJXyIgKyBmZWF0dXJlS2V5ICsgIl9mZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxNWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyfXMuIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GCi0gKiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzCi0gKiBhbHNvIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXN9LiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUKLSAqIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVtYXBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayAjY29tLmlibS5ldG9vbHMuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVNYXBwaW5nfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlciBtb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZU1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE1vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLkVBUlByb2plY3RNYXB9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyIGVhclByb2plY3RNYXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuRUFSUHJvamVjdE1hcH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKSB7Ci0JCWlmIChlYXJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVhclByb2plY3RNYXBJdGVtUHJvdmlkZXIgPSBuZXcgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlYXJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuVXRpbGl0eUpBUk1hcHBpbmd9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBVdGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlciB1dGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5VdGlsaXR5SkFSTWFwcGluZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXRpbGl0eUpBUk1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAodXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgVXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkgfHwgc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQkvLyBUaGlzIGlzIGEga2x1ZGdlIHRvIGRlYWwgd2l0aCBlbnVtZXJhdG9ycywgd2hpY2ggY3Jhc2ggdGhlIGRvU3dpdGNoLgotCQkvLwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IGNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG9iamVjdCwgZXZlbnRUeXBlLCBmZWF0dXJlLAotCSAqIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCSAqIAotCSAqIGlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG9iamVjdCwgZXZlbnRUeXBlLAotCSAqIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOyB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL1V0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9VdGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2YzYzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL1V0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuVXRpbGl0eUpBUk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5VdGlsaXR5SkFSTWFwcGluZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFV0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFV0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJTW9kdWxlbWFwUGFja2FnZSBwa2cgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHByb2plY3ROYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RfTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdXJpIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVyaV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdXJpX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfVXJpKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiLCAiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3VyaV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VdGlsaXR5SkFSTWFwcGluZ191cmlfZmVhdHVyZSIsICJfVUlfVXRpbGl0eUpBUk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRVdGlsaXR5SkFSTWFwcGluZ19VcmkoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgVXRpbGl0eUpBUk1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVXRpbGl0eUpBUk1hcHBpbmcuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9wcmp1dGlsamFyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8JLyoqCi0JLy8JICogQHBhcmFtIG9iamVjdAotCS8vCSAqIEByZXR1cm4KLQkvLwkgKi8KLQkvLwlwcml2YXRlIGJvb2xlYW4gaXNFSkJDbGllbnRKQVIoT2JqZWN0IG9iamVjdCkgewotCS8vCQlVdGlsaXR5SkFSTWFwcGluZyBtYXAgPSAoVXRpbGl0eUpBUk1hcHBpbmcpIG9iamVjdDsKLQkvLwkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtYXApOwotCS8vCQlpZiAocHJvamVjdCA9PSBudWxsKQotCS8vCQkJcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8JCUVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQkvLwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkvLwkJCXJldHVybiBmYWxzZTsKLQkvLwotCS8vCQlFQVJFZGl0TW9kZWwgbW9kZWwgPSBudWxsOwotCS8vCQl0cnkgewotCS8vCQkJbW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0JLy8JCQlyZXR1cm4gbW9kZWwuaXNFamJDbGllbnRKYXJNYXBwaW5nKG1hcCk7Ci0JLy8JCX0gZmluYWxseSB7Ci0JLy8JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkvLwkJCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCS8vCQl9Ci0JLy8JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJVXRpbGl0eUpBUk1hcHBpbmcgbWFwID0gKChVdGlsaXR5SkFSTWFwcGluZykgb2JqZWN0KTsKLQkJcmV0dXJuIG1hcCA9PSBudWxsID8gIjw/Pz4iIDogbWFwLmdldFVyaSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFV0aWxpdHlKQVJNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fVVJJIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IE1vZHVsZW1hcFBhY2thZ2UgcGtnID0gTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0U7OyBpZiAoCi0JICogZmVhdHVyZSA9PSBwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSB8fCBmZWF0dXJlID09Ci0JICogcGtnLmdldFV0aWxpdHlKQVJNYXBwaW5nX1VyaSgpICkgeyBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwKLQkgKiBuZXdWYWx1ZSwgaW5kZXgpOyByZXR1cm47IH0gc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwKLQkgKiBuZXdWYWx1ZSwgaW5kZXgpOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9JQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9JQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODE3NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50czwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludCBpbiBvcmRlciB0byBleHRlbmQgdGhlIGJhc2UgbW9kdWxlIGFyY2hpdmUgZXhwb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50Ci17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBtb2RlbCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdEFyY2hpdmVFeHBvcnREYXRhTW9kZWwgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIG1vZHVsZSBhcmNoaXZlIGV4cG9ydAotICAgICAqICAgb3BlcmF0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCBpcyBleHRlbmRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGRhdGEgbW9kZWwKLSAgICAgKi8KLSAgICAKLSAgICBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCggSURhdGFNb2RlbCByb290QXJjaGl2ZUV4cG9ydERhdGFNb2RlbCApOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBpbiBvcmRlciB0byBsZXQgdGhpcyBleHRlbnNpb24KLSAgICAgKiBwYXJ0aWNpcGF0ZSBpbiB0aGUgZXhwb3J0IHByb2Nlc3MuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBleHRlbnNpb25EYXRhTW9kZWwgdGhlIGRhdGEgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhwb3J0Ci0gICAgICogICBwYXJ0aWNpcGFudCAocHJldmlvdXNseSByZXR1cm5lZCBieSB0aGUgY3JlYXRlRGF0YU1vZGVsKCkgbWV0aG9kKQotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb3BlcmF0aW9uCi0gICAgICovCi0gICAgCi0gICAgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oIElEYXRhTW9kZWwgZXh0ZW5zaW9uRGF0YU1vZGVsICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUFkZFdlYkNvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBZGRXZWJDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkNWUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUFkZFdlYkNvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJQWRkV2ViQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklBZGRXZWJDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUFwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmYTVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUFwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotLyoqCi0gKiA8cD4KLSAqIElBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIEFwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLgotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODk1ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotLyoqCi0gKiA8cD4KLSAqIElBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLgotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZThiMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIEVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLgotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGZhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotLyoqCi0gKiA8cD4KLSAqIElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZAotICogZHVyaW5nIE01Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIElQYXRoIGRlZmF1bHQgaXMgZWFyIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX01PRFVMRV9ST09UID0gIklFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RVTEVfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBBIExpc3QgY29udGFpbmluZyB1dGlsaWx0eSBqYXJzLiBUaGlzIGxpc3Qgc2hvdWxkIGNvbnNpc3Qgb2YgdGhlIENvbW1vbkFyY2hpdmUKLQkgKiBBcmNoaXZlcyBvZiBhbGwgdGhlIFV0aWxpdHkgSmFycyB0aGF0IHNob3VsZCBiZSBleHRyYWN0ZWQgaW50byBwcm9qZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0xJU1QgPSAiSUVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNUIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9wdGlvbmFsLCBBIExpc3QgY29udGFpbmluZyBtb2R1bGVzIHRvIGJlIGltcG9ydGVkIGxpc3Q7Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURfTU9ERUxTX0xJU1QgPSAiSUVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogT3B0aW9uYWwsIEEgTGlzdCBjb250YWluaW5nIGVqYiBjbGllbnQgamFycyBhc3NvY2lhdGVkIHdpdGggYW55IGVqYiBjb21wb25lbnRzIHdoaWNoIGFyZSB0bwotCSAqIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DTElFTlRfTElTVCA9ICJJRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FSkJfQ0xJRU5UX0xJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbC4gVGhpcyBpcyBhIGxpc3Qgb2YgZGF0YSBtb2RlbHMuIFRoaXMgbGlzdCBtdXN0IGNvbnRhaW4gYWxsIG5vbi11dGlsdHkgcHJvamVjdHMgaW4KLQkgKiB0aGUgZWFyIHRvIGJlIGltcG9ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX01PREVMU19MSVNUID0gIklFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9NT0RFTFNfTElTVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLiBUaGlzIGlzIGEgbGlzdCBvZiBkYXRhIG1vZGVscy4gVGhpcyBsaXN0IG11c3QgY29udGFpbiBhbGwgdXRpbGl0eSBqYXJzIHNlbGVjdGVkIHRvCi0JICogYmUgaW1wb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX01PREVMU19MSVNUID0gIklFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfTU9ERUxTX0xJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIHVuc2V0dGFibGUgcHJvcGVydHkgd2hpY2ggd2lsbCByZXR1cm4gYWxsIHRoZSBwcm9qZWN0IERhdGFNb2RlbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QgPSAiSUVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIHVuc2V0dGFibGUgcHJvcGVydHkgd2hpY2ggd2lsbCByZXR1cm4gLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNUID0gIklFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVOSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBpcyBhbiB1bnNldHRhYmxlIHByb3BlcnR5IHdoaWNoIHdpbGwgcmV0dXJuIC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVEX1BST0pFQ1RfTU9ERUxTX0xJU1QgPSAiSUVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzFmMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIAotICogSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgYXMgd2VsbCBhcyBhbGwgZXh0ZW5kaW5nIGludGVyZmFjZXMgZXh0ZW5kaW5nIAotICogSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICogQHNlZSBJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMsIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNXsKLQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPkJvb2xlYW4uRkFMU0U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UT19FQVIgPSAiSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVVJJID0gIklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogdHlwZSBTdHJpbmcsIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgc2V0IGlmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgQUREX1RPX0VBUiAgaXMgc2V0IHRvIDxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX05BTUUgPSAiSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgU3RyaW5nLCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldCBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IEFERF9UT19FQVIgIGlzIHNldCB0byA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9ERVBMT1lfTkFNRSA9ICJJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfQ09NUE9ORU5UX0RFUExPWV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgQ29tcG9uZW50SGFuZGxlLCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldCBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IEFERF9UT19FQVIgIGlzIHNldCB0byA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+LiAgUmVwcmVzZW50cwotICAgICAqIGEgaGFuZGxlIHRvIHRoZSBFQVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX1BST0pFQ1QgPSAiSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8qKgotCSAqIHR5cGUgQm9vbGVhbjsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiwgdGhpcyBpcyBVSSBvbmx5IHByb3BlcnR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfU0hPV19FQVJfU0VDVElPTiA9ICJJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5VSV9TSE9XX0VBUl9TRUNUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIFN0cmluZwotICAgICAqIFN0cmluZyBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGlzdHMuCi0gICAgICogRWFjaCBKMkVFIGNvbXBvbmVuciBwcm92aWRlciB3aWxsIGRlZmF1bHQgdGhlIERlcGxveW1lbnQgZGVzY3JpcHRvciBmb2xkZXIuCi0gICAgICogCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRERfRk9MREVSID0gIklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkREX0ZPTERFUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIEludGVnZXIuIFRoZSB1c2VyIGRlZmluZWQgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9WRVJTSU9OID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiB0eXBlIEludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9DT01QT05FTlRfVkVSU0lPTlNfRk9SX1BST0pFQ1RfUlVOVElNRSA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZBTElEX0NPTVBPTkVOVF9WRVJTSU9OU19GT1JfUFJPSkVDVF9SVU5USU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfQUREX0NPTVBPTkVOVF9UT19FQVJfRE0gPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfQUREX0NPTVBPTkVOVF9UT19FQVJfRE0iOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogdHlwZSBFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9FQVJfQ09NUE9ORU5UX0NSRUFUSU9OX0RNID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX0VBUl9DT01QT05FTlRfQ1JFQVRJT05fRE0iOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogdHlwZSBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9VUERBVEVfTUFOSUZFU1RfRE0gPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfVVBEQVRFX01BTklGRVNUX0RNIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgQ2xhc3NQYXRoU2VsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX1NFTEVDVElPTiA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTUEFUSF9TRUxFQ1RJT04iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2NjNiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgSURhdGFNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIAotICogSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZyAKLSAqIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBzcGVjaWZpY2FsbHkgYWxsIEoyRUUgY29tcG9uZW50IHNwZWNpZmljIGV4cG9ydHMuCi0gKiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgZHVyaW5nIE01Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhlIHVzZXIgZGVmaW5lZCBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIGJlIGV4cG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogUmVxdWlyZWQsIHR5cGUgSVBhdGguICBUaGUgdXNlciBkZWZpbmVkIGV4cG9ydCBsb2NhdGlvbiBpbmNsdWRpbmcgZnVsbHkgcXVhbGlmaWVkIFBhdGggYW5kIGFyY2hpdmUgZmlsZQotICAgICAqIHRvIGJlIGNyZWF0ZWQgbmFtZS4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV9ERVNUSU5BVElPTiA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9ERVNUSU5BVElPTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBPcHRpb25hbCwgdHlwZSBCb29sZWFuLiAgSWYgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiBzb3VyY2UgYW5kIGNsYXNzIGZpZWxkcyB3aWxsIGJvdGggYmUgYXJjaGl2ZWQgYW5kIGV4cG9ydGVkLgotICAgICAqIE90aGVyd2lzZSBpZiA8Y29kZT5Cb29sZWFuLkZBTFNFPC9jb2RlPiBvbmx5IG91dHB1dCBmaWxlcyBhcmUgZXhwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1NPVVJDRV9GSUxFUyA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBPcHRpb25hbCwgdHlwZSBCb29sZWFuLiAgSWYgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiBhbmQgYW4gYXJjaGl2ZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzIGluIHRoZSAKLSAgICAgKiBBUkNISVZFX0RFU1RJTkFUSU9OLCB0aGUgZXhpc3Rpbmcgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgYXJjaGl2ZSB0byBiZSBjcmVhdGVkLiAgT3RoZXJ3aXNlLAotICAgICAqIGlmIDxjb2RlPkJvb2xlYW4uRkFMU0U8L2NvZGU+IGEgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHNob3cgaW5kaWNhdGluZyBuYW1lIGNvbGxpc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUldSSVRFX0VYSVNUSU5HID0gIklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkciOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwsIHR5cGUgYm9vbGVhbiwgRGVmYXVsdCA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+IGluZGljYXRpbmcgYSBCdWlsZCBydW5zIGJlZm9yZSBleHBvcnRpbmcgdGh1cyBvdXRwdXQgZmlsZXMgYXJlIGNyZWF0ZWQKLSAgICAgKiBhbmQgYXJjaGl2ZWQuICBIb3dldmVyLCBpZiA8Y29kZT5Cb29sZWFuLkZBTFNFPC9jb2RlPiB0aGUgY29tcG9uZW50IGlzIGFyY2hpdmVkIGFzIGlzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9CVUlMRCA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUlVOX0JVSUxEIjsgLy8kTk9OLU5MUy0xJH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlQgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkVfRk9SX1NQRUNJRklDX1JVTlRJTUUgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRSA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRSI7IC8vJE5PTi1OTFMtMQotICAgIAotICAgIC8qKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUyAKLSAgICAgICAgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTIjsgLy8kTk9OLU5MUy0xCi0gICAgCi0gICAgLyoqCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIAotICAgIGludGVyZmFjZSBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YQotICAgIHsKLSAgICAgICAgU3RyaW5nIGdldElkKCk7Ci0gICAgICAgIElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKTsKLSAgICAgICAgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWVlZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqIDxwPgotICogSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZwotICogSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHNwZWNpZmljYWxseSBhbGwgSjJFRSBjb21wb25lbnQgc3BlY2lmaWMgaW1wb3J0cy4KLSAqIAotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBpbXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSAiSUoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgQXJjaGl2ZSwgdXNlZCB3aGVuIGEgZmlsZSBpcyBhdmFpbGFibGUgYXMgYW4gb2JqZWN0IHJhdGhlciB0aGFuIGEgdXJsIChpLmUuCi0JICogdXNpbmcgdGhlIEZJTEVfTkFNRSBwcm9wZXJ0eSB3aWxsIG5vdCB3b3JrKS4KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNBUkNISVZFX1dSQVBQRVJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgbmFtZSBvZiB0aGUgUHJvamVjdCB3aGljaCB0aGUgQXJjaGl2ZSB3aWxsIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVW5zZXR0YWJsZSBwcm9wZXJ0eSB1c2VkIHRvIHJldHJlaXZlIHRoZSBjb21wb25lbnQgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBoYXMgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UID0gIklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVW5zZXR0YWJsZSBwcm9wZXJ0eSB1c2VkIGZvciBhcmNoaXZlIHN3aXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1dSQVBQRVIgPSAiSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUiI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIElPdmVyd3JpdGVIYW5kbGVyLiBEZWZpbmVzIGEgSU92ZXJ3cml0ZUhhbmRsZXIgZm9yIHRoZSBjb21wb25lbnQgaW4gdGhlCi0JICogd29ya3NwYWNlIGlmIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gKE9WRVJXUklURV9DT01QT05FTlQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJXUklURV9IQU5ETEVSID0gIklKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9IQU5ETEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgU2F2ZUZpbHRlciwgZGVmYXVsdCBpcyBudWxsCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZJTFRFUiA9ICJJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TQVZFX0ZJTFRFUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIEJvb2xlYW4gLSBTaG91bGQgdGhlIGFyY2hpdmUgYmUgY2xvc2VkIG9uIGRpc3Bvc2U/Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFID0gIklKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmNsb3NlQXJjaGl2ZU9uRGlzcG9zZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPcHRpb25hbCAtIHR5cGUgTGlzdCwgcG9wdWxhdGVkIGxpc3Qgb2YgZmlsZXMgcHJldmlvdXNseSBzZWxlY3RlZC4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgR1VJcwotCSAqIHdoaWNoIHdpc2ggdG8gc2hvdyBwcmVpdm91cyBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VMRUNUSU9OX0hJU1RPUlkgPSAiSUoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9TRUxFQ1RJT05fSElTVE9SWSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBJRGF0YU1vZGVsLiBUaGlzIElEYXRhTW9kZWwgd2lsbCBoYXZlIGEgSjJFRSBzcGVjaWZpYyBjb21wb25lbnQgY3JlYXRpb24KLQkgKiBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OID0gIklKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMxY2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotCi0vKioKLSAqIDxwPgotICogSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIEoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm92aWRlciBhcyB3ZWxsIGFzIGFsbCBleHRlbmRpbmcgaW50ZXJmYWNlcyBleHRlbmRpbmcgCi0gKiBJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgc3BlY2lmaWNhbGx5IGFsbCBKMkVFIGNvbXBvbmVudCBzcGVjaWZpYyBpbXBvcnRzLgotICogCi0gKiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgZHVyaW5nIE01Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0gICAgCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMjRUFSX1BST0pFQ1RfTkFNRX0gb24gdGhlIG5lc3RlZCBwcm9qZWN0IGNyZWF0aW9uIG1vZGVsCi0JICogCi0JICogQHNlZSBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX05BTUUgPSAiSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyNBRERfVE9fRUFSfSBvbiB0aGUgbmVzdGVkIHByb2plY3QgY3JlYXRpb24gbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAc2VlIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UT19FQVIgPSAiSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfSU1QT1JUX0ZBQ1RPUlkgPSAiSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYVEVOREVEX0lNUE9SVF9GQUNUT1JZIjsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGNmNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllc3sKLQotCS8qKgotCSAqIFJlcXVpcmVkLiBUaGUgRUFSIFByb2plY3QgdG8gd2hpY2ggVXRpbGl0eSBKYXJzIHNob3VsZCBiZSBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfUFJPSkVDVF9OQU1FID0gSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FOwotCi0JLyoqCi0JICogT3B0aW9uYWwuIEJvb2xlYW4gUHJvcGVydHkuIFRydWUgaW5kaWNhdGVzIHRvIGNyZWF0ZSBhIFByb2plY3QgQ2FuIGJlIHVzZWQgd2l0aAotCSAqIExJTktfSU1QT1JUPSJ0cnVlfCJmYWxzZSIgb3IgQklOQVJZX0lNUE9SVD0idHJ1ZXxmYWxzZSIgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUFJPSkVDVCA9ICJKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbC4gQm9vbGVhbiBwcm9wZXJ0eS4gVHJ1ZSBpbmRpY2F0ZXMgdG8gaW1wb3J0IHRoZSBqYXIgYXMgYSBsaW5rZWQgcHJvamVjdCBDYW4gYmUKLQkgKiBzcGVjaWZpZWQgd2l0aCBCSU5BUllfSU1QT1JUPSJ0cnVlfGZhbHNlIiBhbmQvb3IgQ1JFQVRFX1BST0pFQ1Q9InRydWV8ZmFsc2UiIFRoZSBkZWZhdWx0Ci0JICogdmFsdWUgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19JTVBPUlQgPSAiSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkxJTktfSU1QT1JUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwuIEJvb2xlYW4gUHJvcGVydHkuIFRydWUgaW5kaWNhdGVzIHRvIGNyZWF0ZSBhIFByb2plY3QgQ2FuIGJlIHVzZWQgd2l0aAotCSAqIExJTktfSU1QT1JUPSJ0cnVlfCJmYWxzZSIgb3IgQklOQVJZX0lNUE9SVD0idHJ1ZXxmYWxzZSIgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTElOS0VEX1BST0pFQ1QgPSAiSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkNSRUFURV9MSU5LRURfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLiBCb29sZWFuIHByb3BlcnR5LiBUcnVlIGluZGljYXRlcyB0byBpbXBvcnQgdGhlIGphciBhcyBhIGxpbmtlZCBwcm9qZWN0IENhbiBiZQotCSAqIHNwZWNpZmllZCB3aXRoIEJJTkFSWV9JTVBPUlQ9InRydWV8ZmFsc2UiIGFuZC9vciBDUkVBVEVfUFJPSkVDVD0idHJ1ZXxmYWxzZSIgVGhlIGRlZmF1bHQKLQkgKiB2YWx1ZSBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gIkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5DT1BZIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwuIEJvb2xlYW4gcHJvcGVydHkuIFRydWUgaW5kaWNhdGVzIHRvIGltcG9ydCB0aGUgamFyIGFzIGEgYmluYXJ5IHByb2plY3QgQ2FuIGJlCi0JICogc3BlY2lmaWVkIHdpdGggTElOS19JTVBPUlQ9InRydWV8ZmFsc2UiIGFuZC9vciBDUkVBVEVfUFJPSkVDVD0idHJ1ZXxmYWxzZSIgVGhlIGRlZmF1bHQgdmFsdWUKLQkgKiBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfSU1QT1JUID0gIkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5CSU5BUllfSU1QT1JUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVxdWlyZWQuIEEgamF2YS51dGlsLkxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGZpbGUgbmFtZXMgZm9yIGVhY2ggVXRpbGl0eSBKYXIgdGhhdCBzaG91bGQgYmUKLQkgKiBpbXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0pBUl9MSVNUID0gIkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5VVElMSVRZX0pBUl9MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVZBSUxBQkxFX0pBUlNfRElSRUNUT1JZID0gIkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1JPT1QgPSAiSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLlBST0pFQ1RfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJSSURFX1BST0pFQ1RfUk9PVCA9ICJKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuT1ZFUlJJREVfUFJPSkVDVF9ST09UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUldSSVRFX0lGX05FQ0VTU0FSWSA9ICJKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuT1ZFUldSSVRFX0lGX05FQ0VTU0FSWSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LRURfUEFUSF9WQVJJQUJMRSA9ICJKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX0xJTktFRF9QQVRIIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS0VEX1BBVEhfVkFSSUFCTEUgPSAiSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsLkxJTktFRF9QQVRIX1ZBUklBQkxFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwMzdmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci0KLS8qKgotICogPHA+Ci0gKiBJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSAKLSAqIEphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZyAKLSAqIElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHNwZWNpZmljYWxseSwgYnV0IG5vdCBsaW1pdGVkIHRvIGFsbCBKMkVFIGNvbXBvbmVudCByZWxhdGVkCi0gKiBjcmVhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBzbGF0ZWQgZm9yIHJlbW92YWwgcG9zdCBXVFAgMS41LiBEbyBub3QgdXNlIHRoaXMgY2xhc3MvaW50ZXJmYWNlCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiAKLSAqIEBzZWUgSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLCBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIFN0cmluZwotICAgICAqIFN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSB0aGUgcm9vdCBKYXZhIFNvdXJjZSBGb2xkZXIgaW4gdGhlIGNvbXBvbmVudCBiZWluZyBjcmVhdGVkLgotICAgICAqIFRoZSBEYXRhTW9kZWxQcm92aWRlciB3aWxsIGRlZmF1bHQgdGhlIEphdmEgU291cmNlIEZvbGRlciB0byB0aGUgQ29tcG9uZW50IGZvbGRlci4KLSAgICAgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU09VUkNFX0ZPTERFUiA9ICJJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBU09VUkNFX0ZPTERFUiI7Ci0gICAgLyoqCi0gICAgICogT3B0aW9uYWwsIHR5cGUgU3RyaW5nCi0gICAgICogU3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZSBNYW5pZmVzdC5NRiBpbiB0aGUgY29tcG9uZW50IGJlaW5nIGNyZWF0ZWQuCi0gICAgICogVGhlIERhdGFNb2RlbFByb3ZpZGVyIHdpbGwgZGVmYXVsdCB0aGUgTWFuaWZlc3QgZm9sZGVyIHRvIHRoZSBDb21wb25lbnQgZm9sZGVyL01FVEEtSU5GLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZPTERFUiA9ICJJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GT0xERVIiOwotCQotICAgIC8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHNlcnZlciB0YXJnZXQuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9UQVJHRVRfSUQgPSBJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lEOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODU3MGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotLyoqCi0gKiA8cD4KLSAqIElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgSURhdGFNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIAotICogSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlci4KLSAqIAotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCwgdHlwZSBTdHJpbmcuICBSZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBQcm9qZWN0IGNvbnRhaW5pbmcgdGhlIEVBUiBjb21wb25lbnQsIHdoaWNoIHRoZSB1dGlsaXR5IAotICAgICAqIGphciB3aWxsIGJlIGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9QUk9KRUNUX05BTUUgPSAiSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWwuRUFSX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY0M2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5qMmVlIG1vZHVsZSBjb21tb24gZGF0YSBtb2RlbCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBhcGkgdGhlIGNvbW1vbiBjcmVhdGUsIGltcG9ydCBhbmQgZXhwb3J0IGoyZWUgbW9kdWxlcy4gSXQgYWxzbyBpbmNsdWRlcyB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBhbmQgYXBwbGNpYXRpb24gY2xpZW50IGNyZWF0aW9uLCBpbXBvcnQgYW5kIGV4cG9ydCBhcGkuIFRoZSBpbnRlcmZhY2VzIGluIHRoaXMgcGFja2FnZQotICAgICAgICBkZWZpbmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSBqMmVlIG1vZHVsZXMgZGF0YSBtb2RlbHMgdGhhdCBhcmUgdXNlZCB0byBydW4gdGhlIGRhdGEgbW9kZWwgb3BlcmF0aW9ucyBhbmQgZHJpdmUgdGhlIHdpemFyZCBkYXRhLCB2YWxpZGF0aW9uLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXBwQ2xpZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcHBDbGllbnRBcmNoaXZlVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzOWQ4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcHBDbGllbnRBcmNoaXZlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudEFyY2hpdmVUeXBlSGFuZGxlciBpbXBsZW1lbnRzIElBcmNoaXZlSGFuZGxlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCWlmIChhcmNoaXZlLmdldExvYWRBZGFwdGVyKCkgaW5zdGFuY2VvZiBBcHBDbGllbnRDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRPRE8gaGFuZGxlIHRoZSBubyBERCBjYXNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FwcENsaWVudENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXBwQ2xpZW50Q29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Mzg3YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXBwQ2xpZW50Q29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciBleHRlbmRzIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGF0aCBnZXREZWZhdWx0TW9kZWxPYmplY3RQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcHBDbGllbnRDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI2NjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludCRQbHVnaW5VdGlsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQkUGx1Z2luVXRpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDczNDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludCRQbHVnaW5VdGlsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1pc3NpbmdBdHRyaWJ1dGUgPSBFeHRlbnNpb24gZWxlbWVudCA8ezJ9PiBpcyBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSAiezN9Ii4gW3BsdWdpbjogInswfSI7IGV4dGVuc2lvbiBwb2ludDogInsxfSJdCi1taXNzaW5nRWxlbWVudCA9IEV4dGVuc2lvbiBlbGVtZW50IDx7Mn0+IGlzIG1pc3NpbmcgcmVxdWlyZWQgY2hpbGQgZWxlbWVudCA8ezN9Pi4gW3BsdWdpbjogInswfSI7IGV4dGVuc2lvbiBwb2ludDogInsxfSJdCi1mYWlsZWRUb0NyZWF0ZSA9IEZhaWxlZCB0byBpbnN0YW50aWF0ZSBjbGFzcyB7MH0uCi1kb2VzTm90SW1wbGVtZW50ID0gQ2xhc3MgezB9IGRvZXMgbm90IGltcGxlbWVudCB7MX0gaW50ZXJmYWNlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NWExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludC5QbHVnaW5VdGlsLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludC5QbHVnaW5VdGlsLkludmFsaWRFeHRlbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgcHJvY2Vzc2luZyB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50czwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50cyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QQVJUSUNJUEFOVCA9ICJwYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUlVOVElNRV9DT01QT05FTlQgPSAicnVudGltZS1jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZBQ1RPUlkgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRU5BQkxFTUVOVCA9ICJlbmFibGVtZW50IjsgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFBhcnRpY2lwYW50SW5mbz4gZXh0ZW5zaW9ucyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJ0aWNpcGFudEluZm8KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJ1bnRpbWVDb21wb25lbnRUeXBlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcnVudGltZUNvbXBvbmVudFZlcnNpb25FeHByID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGVuYWJsZW1lbnRDb25kaXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudCBsb2FkUGFydGljaXBhbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuY2xhc3NOYW1lLCBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50LmNsYXNzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFydGljaXBhbnRJbmZvPiBnZXRFeHRlbnNpb25zKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgcmVhZEV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8UGFydGljaXBhbnRJbmZvPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFBhcnRpY2lwYW50SW5mbz4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggUGFydGljaXBhbnRJbmZvIHBhcnRJbmZvIDogZXh0ZW5zaW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IHJ1bnRpbWUuZ2V0UnVudGltZUNvbXBvbmVudHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdCA9IHJjLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJjdCA9PSBwYXJ0SW5mby5ydW50aW1lQ29tcG9uZW50VHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ID0gcmMuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcmN0LmdldFZlcnNpb25zKCBwYXJ0SW5mby5ydW50aW1lQ29tcG9uZW50VmVyc2lvbkV4cHIgKS5jb250YWlucyggcmN2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbWF0Y2ggJiYgcGFydEluZm8uZW5hYmxlbWVudENvbmRpdGlvbiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCggbnVsbCwgcHJvamVjdCApOwotICAgICAgICAgICAgICAgIGV2YWxDb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbiggdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBFdmFsdWF0aW9uUmVzdWx0IGV2YWxSZXN1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IHBhcnRJbmZvLmVuYWJsZW1lbnRDb25kaXRpb24uZXZhbHVhdGUoIGV2YWxDb250ZXh0ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZXZhbFJlc3VsdCAhPSBFdmFsdWF0aW9uUmVzdWx0LlRSVUUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1hdGNoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwYXJ0SW5mbyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggcmVzdWx0ICk7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBpZiggZXh0ZW5zaW9ucyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxQYXJ0aWNpcGFudEluZm8+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IAotICAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIEVMX1BBUlRJQ0lQQU5UICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZEV4dGVuc2lvbiggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlciB2aWEgdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRFeHRlbnNpb24oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFBhcnRpY2lwYW50SW5mbyBpbmZvID0gbmV3IFBhcnRpY2lwYW50SW5mbygpOwotCi0gICAgICAgIGluZm8ucGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGluZm8uaWQgPSBpbmZvLnBsdWdpbklkICsgIi4iICsgZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbEZhY3RvcnkgPSBmaW5kUmVxdWlyZWRFbGVtZW50KCBjb25maWcsIEVMX0ZBQ1RPUlkgKTsKLSAgICAgICAgaW5mby5jbGFzc05hbWUgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGVsRmFjdG9yeSwgQVRUUl9DTEFTUyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsUnVudGltZUNvbXBvbmVudCAKLSAgICAgICAgICAgID0gZmluZFJlcXVpcmVkRWxlbWVudCggY29uZmlnLCBFTF9SVU5USU1FX0NPTVBPTkVOVCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHJjVHlwZVN0cmluZyA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWxSdW50aW1lQ29tcG9uZW50LCBBVFRSX1RZUEUgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIFJ1bnRpbWVNYW5hZ2VyLmlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCByY1R5cGVTdHJpbmcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IExvZyB0aGUgcHJvYmxlbQotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW5mby5ydW50aW1lQ29tcG9uZW50VHlwZSA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCByY1R5cGVTdHJpbmcgKTsKLSAgICAgICAgaW5mby5ydW50aW1lQ29tcG9uZW50VmVyc2lvbkV4cHIgPSBlbFJ1bnRpbWVDb21wb25lbnQuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbEVuYWJsZW1lbnQgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX0VOQUJMRU1FTlQgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLmVuYWJsZW1lbnRDb25kaXRpb24gPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKCBlbEVuYWJsZW1lbnQgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXh0ZW5zaW9ucy5hZGQoIGluZm8gKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIGhlbHBmdWwgZm9yIGltcGxlbWVudGluZyBleHRlbnNpb24gcG9pbnRzLgotICAgICAqCi0gICAgICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsdWdpblV0aWwKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotCi0gICAgICAgICAgICBleHRlbmRzIEV4Y2VwdGlvbgotICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgUGx1Z2luVXRpbCgpIHt9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SUV4dGVuc2lvbj4gZmluZEV4dGVuc2lvbnMoIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHBvaW50ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SUV4dGVuc2lvbj4gZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8SUV4dGVuc2lvbj4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBvaW50LmdldEV4dGVuc2lvbnMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQoIGV4dGVuc2lvbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPElDb25maWd1cmF0aW9uRWxlbWVudD4gZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluYWwgQ29sbGVjdGlvbjxJRXh0ZW5zaW9uPiBleHRlbnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBlbC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRQb2ludElkID0gZWwuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMubWlzc2luZ0F0dHJpYnV0ZSwgcGx1Z2luSWQsIGV4dFBvaW50SWQsIGVsLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlICk7Ci0KLSAgICAgICAgICAgIGxvZyggY3JlYXRlRXJyb3JTdGF0dXMoIC0xLCBtc2csIG51bGwgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdFbGVtZW50KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVsZW1lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBlbC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRQb2ludElkID0gZWwuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMubWlzc2luZ0VsZW1lbnQsIHBsdWdpbklkLCBleHRQb2ludElkLCBlbC5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgKTsKLQotICAgICAgICAgICAgbG9nKCBjcmVhdGVFcnJvclN0YXR1cyggLTEsIG1zZywgbnVsbCApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0cmlidXRlICkKLQotICAgICAgICAgICAgdGhyb3dzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KLQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gZWwuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTsKLQotICAgICAgICAgICAgaWYoIHZhbCA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBlbCwgYXR0cmlidXRlICk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZpbmRSZXF1aXJlZEVsZW1lbnQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkRWxlbWVudCApCi0KLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0KLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbC5nZXRDaGlsZHJlbiggY2hpbGRFbGVtZW50ICk7Ci0KLSAgICAgICAgICAgIGlmKCBjaGlsZHJlbi5sZW5ndGggPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0VsZW1lbnQoIGVsLCBjaGlsZEVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bIDAgXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZpbmRPcHRpb25hbEVsZW1lbnQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkRWxlbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZWwuZ2V0Q2hpbGRyZW4oIGNoaWxkRWxlbWVudCApOwotCi0gICAgICAgICAgICBpZiggY2hpbGRyZW4ubGVuZ3RoID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlblsgMCBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VmFsdWUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGVsICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZWwuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGV4dCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0ZXh0Lmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgICAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGluc3RhbnRpYXRlKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPFQ+IGludGVyZmMgKQotICAgICAgICAKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2wgPSBidW5kbGUubG9hZENsYXNzKCBjbG5hbWUgKTsKLSAgICAgICAgICAgICAgICBvYmogPSBjbC5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRUb0NyZWF0ZSwgY2xuYW1lICk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIGNyZWF0ZUVycm9yU3RhdHVzKCAtMSwgbXNnLCBlICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgaW50ZXJmYy5pc0Fzc2lnbmFibGVGcm9tKCBvYmouZ2V0Q2xhc3MoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5kb2VzTm90SW1wbGVtZW50LCBjbG5hbWUsIGludGVyZmMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggY3JlYXRlRXJyb3JTdGF0dXMoIC0xLCBtc2csIG51bGwgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKFQpIG9iajsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0KLSAgICAgICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nQXR0cmlidXRlOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0VsZW1lbnQ7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRUb0NyZWF0ZTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvZXNOb3RJbXBsZW1lbnQ7Ci0gICAgICAgIAotICAgICAgICAgICAgc3RhdGljCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBQbHVnaW5VdGlsLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kKCBtZXNzYWdlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0IH0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxMGYzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5GaWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlV3JhcHBlciB7Ci0KLQkvL1RPRE8gcmVtb3ZlIGNvbW1vbkFyY2hpdmU7IHBvc3NpYmx5IHJlbW92ZSB0aGlzIGVudGlyZSBjbGFzcyBhbmQKLQkvL2NvZGUgZGlyZWN0bHkgdG8gSUFyY2hpdmUKLQlwcml2YXRlIEFyY2hpdmUgY29tbW9uQXJjaGl2ZSA9IG51bGw7Ci0JcHJpdmF0ZSBJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQlwcml2YXRlIEphdmFFRVF1aWNrUGVlayBqcXAgPSBudWxsOwotCi0JcHVibGljIEFyY2hpdmVXcmFwcGVyKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJdGhpcy5hcmNoaXZlID0gYXJjaGl2ZTsKLQkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcyBqZWEgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFOwotCQlqcXAgPSBqZWEuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlV3JhcHBlcihBcmNoaXZlIG1GaWxlKSB7Ci0JCXRoaXMuY29tbW9uQXJjaGl2ZSA9IG1GaWxlOwotCQlpbnQgdHlwZSA9IEoyRUVDb25zdGFudHMuVU5LTk9XTjsKLQotCQlpZiAobUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJdHlwZSA9IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7Ci0JCX0gZWxzZSBpZiAobUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCXR5cGUgPSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEU7Ci0JCX0gZWxzZSBpZiAobUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCXR5cGUgPSBKMkVFQ29uc3RhbnRzLkVKQl9UWVBFOwotCQl9IGVsc2UgaWYgKG1GaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQl0eXBlID0gSjJFRUNvbnN0YW50cy5XRUJfVFlQRTsKLQkJfSBlbHNlIGlmIChtRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJdHlwZSA9IEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1RZUEU7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gSjJFRUNvbnN0YW50cy5VTktOT1dOKSB7Ci0JCQlpbnQgdmVyc2lvbiA9IEFyY2hpdmVVdGlsLmdldEZhc3RTcGVjVmVyc2lvbigoTW9kdWxlRmlsZSkgbUZpbGUpOwotCQkJanFwID0gbmV3IEphdmFFRVF1aWNrUGVlayh0eXBlLCB2ZXJzaW9uKTsKLQkJfSBlbHNlIHsKLQkJCWpxcCA9IG5ldyBKYXZhRUVRdWlja1BlZWsobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrIGdldEphdmFFRVF1aWNrUGVlaygpIHsKLQkJcmV0dXJuIGpxcDsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBnZXRDb21tb25BcmNoaXZlKCkgewotCQlyZXR1cm4gKEFyY2hpdmUpIGNvbW1vbkFyY2hpdmU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRVbmRlckx5aW5nQXJjaGl2ZSgpIHsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyY2hpdmU7Ci0JCX0KLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmU7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFyY2hpdmVXcmFwcGVyIGNhY2hlZFBhcmVudCA9IG51bGw7Ci0KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZXIgZ2V0UGFyZW50KCkgewotCQlpZiAobnVsbCAhPSBjYWNoZWRQYXJlbnQpIHsKLQkJCXJldHVybiBjYWNoZWRQYXJlbnQ7Ci0JCX0KLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJY2FjaGVkUGFyZW50ID0gbmV3IEFyY2hpdmVXcmFwcGVyKGFyY2hpdmUuZ2V0QXJjaGl2ZSgpKTsKLQkJCXJldHVybiBjYWNoZWRQYXJlbnQ7Ci0JCX0KLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkgewotCQkJY2FjaGVkUGFyZW50ID0gbmV3IEFyY2hpdmVXcmFwcGVyKChBcmNoaXZlKSBjb21tb25BcmNoaXZlLmVDb250YWluZXIoKSk7Ci0JCQlyZXR1cm4gY2FjaGVkUGFyZW50OwotCQl9Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElBcmNoaXZlIGdldElBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwgJiYgY29tbW9uQXJjaGl2ZS5pc09wZW4oKSkgewotCQkJCWNvbW1vbkFyY2hpdmUuY2xvc2UoKTsKLQkJCX0KLQkJCWlmIChhcmNoaXZlICE9IG51bGwgJiYgYXJjaGl2ZS5pc09wZW4oKSkgewotCQkJCUphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuY2xvc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbW1vbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyY2hpdmUuZ2V0UGF0aCgpOwotCQl9Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZhaWwoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBcmNoaXZlV3JhcHBlciBpcyBpbmNvbnNpc3RlbnQuIik7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuZ2V0RmlsZXMoKS5zaXplKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKS5zaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEFyY2hpdmVXcmFwcGVyPiBjYWNoZWRXZWJMaWJzOwotCi0JcHVibGljIExpc3Q8QXJjaGl2ZVdyYXBwZXI+IGdldFdlYkxpYnMoKSB7Ci0JCWlmIChjYWNoZWRXZWJMaWJzICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWRXZWJMaWJzOwotCQl9Ci0JCWlmIChqcXAuZ2V0VHlwZSgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl9UWVBFKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQotCQljYWNoZWRXZWJMaWJzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlV3JhcHBlcj4oKTsKLQotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlXQVJGaWxlIHdhciA9IChXQVJGaWxlKSBjb21tb25BcmNoaXZlOwotCQkJTGlzdCBsaWJzID0gd2FyLmdldExpYkFyY2hpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCQljYWNoZWRXZWJMaWJzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGxpYnMuZ2V0KGkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkV2ViTGliczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQkJZm9yIChJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMikgewotCQkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lcXVhbHMoIldFQi1JTkYiKSAmJiBwYXRoLnNlZ21lbnQoMSkuZXF1YWxzKCJsaWIiKSkgewotCQkJCQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQkJCQlpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoImphciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCJ6aXAiKSkgewotCQkJCQkJCQlJQXJjaGl2ZSB3ZWJMaWI7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQl3ZWJMaWIgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUocmVzb3VyY2UpOwotCQkJCQkJCQkJY2FjaGVkV2ViTGlicy5hZGQobmV3IEFyY2hpdmVXcmFwcGVyKHdlYkxpYikpOwotCQkJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFdlYkxpYnM7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgPFN0cmluZz5jYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMgPSBudWxsOwotCQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RERNYXBwZWRNb2R1bGVVUklzKCkgewotCQlpZihjYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzOwotCQl9Ci0JCWlmIChqcXAuZ2V0VHlwZSgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQkKLQkJY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlFQVJGaWxlIGVhciA9IChFQVJGaWxlKSBjb21tb25BcmNoaXZlOwotCQkJTGlzdCBlYXJNb2RzID0gZWFyLmdldE1vZHVsZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhck1vZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQljYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMuYWRkKCgoQXJjaGl2ZSkgZWFyTW9kcy5nZXQoaSkpLmdldFVSSSgpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRERE1hcHBlZE1vZHVsZVVSSXM7Ci0JCX0gZWxzZSBpZihhcmNoaXZlICE9IG51bGwpIHsKLQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKSl7Ci0JCQkJaWYoanFwLmdldEphdmFFRVZlcnNpb24oKSA9PSBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChBcHBsaWNhdGlvbikgYXJjaGl2ZS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJTGlzdCBtb2R1bGVzID0gYXBwbGljYXRpb24uZ2V0TW9kdWxlcygpOwotCQkJCQkJZm9yKGludCBpPTA7aTxtb2R1bGVzLnNpemUoKTtpKyspewotCQkJCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKW1vZHVsZXMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyB1cmkgPSBtb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJCQkJY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzLmFkZCh1cmkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IAotCQkJCQl0cnl7Ci0JCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbilhcmNoaXZlLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJCQlMaXN0IG1vZHVsZXMgPSBhcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCk7Ci0JCQkJCQlmb3IoaW50IGk9MDtpPG1vZHVsZXMuc2l6ZSgpO2krKyl7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIG1vZHVsZSA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUpbW9kdWxlcy5nZXQoaSk7Ci0JCQkJCQkJU3RyaW5nIHVyaSA9IG1vZHVsZS5nZXRVcmkoKTsKLQkJCQkJCQljYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMuYWRkKHVyaSk7Ci0JCQkJCQl9Ci0JCQkJCX1jYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZERETWFwcGVkTW9kdWxlVVJJczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0PEFyY2hpdmVXcmFwcGVyPiBjYWNoZWRFQVJNb2R1bGVzOwotCi0JcHVibGljIExpc3Q8QXJjaGl2ZVdyYXBwZXI+IGdldEVhck1vZHVsZXMoKSB7Ci0JCWlmIChjYWNoZWRFQVJNb2R1bGVzICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWRFQVJNb2R1bGVzOwotCQl9Ci0JCWlmIChqcXAuZ2V0VHlwZSgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQljYWNoZWRFQVJNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlV3JhcHBlcj4oKTsKLQotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlFQVJGaWxlIGVhciA9IChFQVJGaWxlKSBjb21tb25BcmNoaXZlOwotCQkJTGlzdCBlYXJNb2RzID0gZWFyLmdldE1vZHVsZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhck1vZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQljYWNoZWRFQVJNb2R1bGVzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGVhck1vZHMuZ2V0KGkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkRUFSTW9kdWxlczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQkJZm9yIChJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCQkJaWYgKGxhc3RTZWdtZW50LmVuZHNXaXRoKCJqYXIiKSB8fCBsYXN0U2VnbWVudC5lbmRzV2l0aCgiemlwIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoInJhciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCJ3YXIiKSkgewotCQkJCQkJCUlBcmNoaXZlIGVhcm1vZHVsZTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQllYXJtb2R1bGUgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUocmVzb3VyY2UpOwotCQkJCQkJCQljYWNoZWRFQVJNb2R1bGVzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoZWFybW9kdWxlKSk7Ci0JCQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRFQVJNb2R1bGVzOwotCQl9Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbW9uQXJjaGl2ZS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyY2hpdmUuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZSgpIHsKLQkJaWYgKGlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChpc1dBUkZpbGUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoaXNSQVJGaWxlKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiBjb21tb25BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFKTsKLQkJZmFpbCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuaXNXQVJGaWxlKCk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLldFQl9UWVBFKTsKLQkJZmFpbCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkVKQl9UWVBFKTsKLQkJZmFpbCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFYXJGaWxlKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuaXNFQVJGaWxlKCk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpOwotCQlmYWlsKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKSB7Ci0JCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gY29tbW9uQXJjaGl2ZS5pc1JBUkZpbGUoKTsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiAoSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSkuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1RZUEUpOwotCQlmYWlsKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBUaGlzIGlzIGFuIGFycmF5IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaW5pdGlhbGl6ZWQgYW5kIG51bGwgdnMgbm90IGluaXRpYWxpemVkCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYWNoZWRXZWJDb250ZXh0Um9vdCA9IG51bGw7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkNvbnRleHRSb290KCkgewotCQlpZiAoY2FjaGVkV2ViQ29udGV4dFJvb3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhY2hlZFdlYkNvbnRleHRSb290WzBdOwotCQl9Ci0KLQkJaWYgKCFpc1dBUkZpbGUoKSkgewotCQkJZmFpbCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2FjaGVkV2ViQ29udGV4dFJvb3QgPSBuZXcgU3RyaW5nWzFdOwotCi0JCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwpIHsKLQkJCWNhY2hlZFdlYkNvbnRleHRSb290WzBdID0gKChXZWJNb2R1bGUpICgoRUFSRmlsZSkgY29tbW9uQXJjaGl2ZS5nZXRDb250YWluZXIoKSkuZ2V0TW9kdWxlKGNvbW1vbkFyY2hpdmUuZ2V0VVJJKCksIG51bGwpKS5nZXRDb250ZXh0Um9vdCgpOwotCQkJcmV0dXJuIGNhY2hlZFdlYkNvbnRleHRSb290WzBdOwotCQl9Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpIHsKLQkJCUlBcmNoaXZlIGVhckFyY2hpdmUgPSBhcmNoaXZlLmdldEFyY2hpdmUoKTsKLQkJCWlmKGVhckFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKSl7Ci0JCQkJSmF2YUVFUXVpY2tQZWVrIGVhckpRUCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGVhckFyY2hpdmUpOwotCQkJCWlmKGVhckpRUC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpewotCQkJCQl0cnkgewotCQkJCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoQXBwbGljYXRpb24pIGVhckFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCVN0cmluZyBtb2R1bGVOYW1lID0gYXJjaGl2ZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBhcHBsaWNhdGlvbi5nZXRGaXJzdE1vZHVsZShtb2R1bGVOYW1lKTsKLQkJCQkJCWlmKG1vZHVsZSAhPSBudWxsKXsKLQkJCQkJCQljYWNoZWRXZWJDb250ZXh0Um9vdFswXSA9IG1vZHVsZS5nZXRXZWIoKS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljYWNoZWRXZWJDb250ZXh0Um9vdFswXSA9IGdldERlZmF1bHRDb250ZXh0Um9vdCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeXsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKWVhckFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCVN0cmluZyBtb2R1bGVOYW1lID0gYXJjaGl2ZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZSBtb2R1bGUgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlKWFwcGxpY2F0aW9uLmdldEZpcnN0TW9kdWxlKG1vZHVsZU5hbWUpOwotCQkJCQkJaWYobW9kdWxlID09IG51bGwpewotCQkJCQkJCWNhY2hlZFdlYkNvbnRleHRSb290WzBdID0gbnVsbDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBtb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNhY2hlZFdlYkNvbnRleHRSb290WzBdID0gZ2V0RGVmYXVsdENvbnRleHRSb290KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkV2ViQ29udGV4dFJvb3RbMF07Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dFJvb3QoKSB7Ci0JCS8vSjJFRSBzcGVjIDguMy4xLjMuYyAocGcgMTQ5KQotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBhcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQljb250ZXh0Um9vdCA9IGNvbnRleHRSb290LnN1YnN0cmluZygwLCBjb250ZXh0Um9vdC5sYXN0SW5kZXhPZignLicpKTsKLQkJcmV0dXJuIGNvbnRleHRSb290OwotCX0KLQotCS8vIFRoaXMgaXMgYW4gYXJyYXkgc28gd2UgY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpbml0aWFsaXplZCBhbmQgbnVsbCB2cyBub3QgaW5pdGlhbGl6ZWQKLQlwcml2YXRlIEhhc2hNYXA8QXJjaGl2ZVdyYXBwZXIsIEFyY2hpdmVXcmFwcGVyPiBjYWNoZWRFSkJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG51bGw7Ci0KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZXIgZ2V0RUpCQ2xpZW50QXJjaGl2ZVdyYXBwZXIoQXJjaGl2ZVdyYXBwZXIgZWpiV3JhcHBlcikgewotCQlpZiAoY2FjaGVkRUpCQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPT0gbnVsbCkgewotCQkJY2FjaGVkRUpCQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgSGFzaE1hcDxBcmNoaXZlV3JhcHBlciwgQXJjaGl2ZVdyYXBwZXI+KCk7Ci0JCX0KLQkJCi0JCWlmKGNhY2hlZEVKQkNsaWVudEFyY2hpdmVXcmFwcGVyLmNvbnRhaW5zS2V5KGVqYldyYXBwZXIpKXsKLQkJCXJldHVybiBjYWNoZWRFSkJDbGllbnRBcmNoaXZlV3JhcHBlci5nZXQoZWpiV3JhcHBlcik7Ci0JCX0KLQkJCi0KLQkJaWYgKCFlamJXcmFwcGVyLmlzRUpCSmFyRmlsZSgpIHx8ICFpc0VhckZpbGUoKSkgewotCQkJZmFpbCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlBcmNoaXZlV3JhcHBlciBlamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG51bGw7Ci0JCXRyeXsKLQkJCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlFSkJKYXIgamFyID0gKChFSkJKYXJGaWxlKSBlamJXcmFwcGVyLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCWlmIChqYXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKGphci5nZXRFamJDbGllbnRKYXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGNsaWVudE5hbWUgPSBqYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQkJZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpICgoRUFSRmlsZSkgY29tbW9uQXJjaGl2ZSkuZ2V0RmlsZShjbGllbnROYW1lKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVqYkNsaWVudEFyY2hpdmVXcmFwcGVyOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSmF2YUVFUXVpY2tQZWVrIGpxcCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGVqYldyYXBwZXIuYXJjaGl2ZSk7Ci0JCQkJCVN0cmluZyBjbGllbnRKYXJOYW1lID0gbnVsbDsKLQkJCQkJaWYoanFwLmdldFZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEKXsKLQkJCQkJCWlmKGVqYldyYXBwZXIuYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpKSl7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIGVkZCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpIGVqYldyYXBwZXIuYXJjaGl2ZS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJCWNsaWVudEphck5hbWUgPSBlZGQuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlFSkJKYXIgamFyID0gKEVKQkphcillamJXcmFwcGVyLmFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCWlmIChqYXIgIT0gbnVsbCkgewotCQkJCQkJCWNsaWVudEphck5hbWUgPSBqYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChudWxsICE9IGNsaWVudEphck5hbWUpIHsKLQkJCQkJCUlQYXRoIGNsaWVudEphclBhdGggPSBuZXcgUGF0aChjbGllbnRKYXJOYW1lKTsKLQkJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoY2xpZW50SmFyUGF0aCkpewotCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgY2xpZW50SmFyID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UoY2xpZW50SmFyUGF0aCk7Ci0JCQkJCQkJaWYobnVsbCAhPSBjbGllbnRKYXIpewotCQkJCQkJCQlpZiAoY2xpZW50SmFyLmdldFR5cGUoKSA9PSBJQXJjaGl2ZVJlc291cmNlLkFSQ0hJVkVfVFlQRSkgewotCQkJCQkJCQkJZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKElBcmNoaXZlKSBjbGllbnRKYXIpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQllamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcihhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUoY2xpZW50SmFyKSk7Ci0JCQkJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5iaW5kKEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuTUlTU0lOR19DTElFTlRfSkFSLCBuZXcgT2JqZWN0W10ge2NsaWVudEphck5hbWUsIGVqYldyYXBwZXIuZ2V0TmFtZSgpLCBhcmNoaXZlLmdldFBhdGgoKX0pKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXI7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY2FjaGVkRUpCQ2xpZW50QXJjaGl2ZVdyYXBwZXIucHV0KGVqYldyYXBwZXIsIGVqYkNsaWVudEFyY2hpdmVXcmFwcGVyKTsKLQkJfQotCQlmYWlsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTGlzdDxBcmNoaXZlV3JhcHBlcj4gY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGlicyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlzdDxBcmNoaXZlV3JhcHBlcj4gZ2V0RUFSVXRpbGl0aWVzQW5kV2ViTGlicygpIHsKLQkJaWYgKG51bGwgIT0gY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGlicykgewotCQkJcmV0dXJuIGNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnM7Ci0JCX0KLQotCQlpZiAoIWlzRWFyRmlsZSgpKSB7Ci0JCQlmYWlsKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnMgPSBuZXcgQXJyYXlMaXN0PEFyY2hpdmVXcmFwcGVyPigpOwotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0IGZpbGVzID0gY29tbW9uQXJjaGl2ZS5nZXRGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJCUZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGZpbGVzLmdldChpKTsKLQkJCQlpZiAoZmlsZS5pc0FyY2hpdmUoKSAmJiAhZmlsZS5pc01vZHVsZUZpbGUoKSAmJiBmaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGZpbGUpKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcigoQXJjaGl2ZSkgZmlsZSk7Ci0JCQkJCWNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnMuYWRkQWxsKHdyYXBwZXIuZ2V0V2ViTGlicygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGliczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0IGZpbGVzID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUFyY2hpdmVSZXNvdXJjZSBmaWxlID0gKElBcmNoaXZlUmVzb3VyY2UpIGZpbGVzLmdldChpKTsKLQkJCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBmaWxlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiLmphciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCIucmFyIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoIi53YXIiKSB8fCBsYXN0U2VnbWVudC5lbmRzV2l0aCgiemlwIikpIHsKLQkJCQkJSUFyY2hpdmUgbmVzdGVkQXJjaGl2ZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5lc3RlZEFyY2hpdmUgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUoZmlsZSk7Ci0JCQkJCQlBcmNoaXZlV3JhcHBlciBuZXN0ZWRXcmFwcGVyID0gbmV3IEFyY2hpdmVXcmFwcGVyKG5lc3RlZEFyY2hpdmUpOwotCQkJCQkJaWYgKG5lc3RlZFdyYXBwZXIuaXNXQVJGaWxlKCkpIHsKLQkJCQkJCQljYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzLmFkZEFsbChuZXN0ZWRXcmFwcGVyLmdldFdlYkxpYnMoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCFuZXN0ZWRXcmFwcGVyLmlzTW9kdWxlKCkpIHsKLQkJCQkJCQljYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzLmFkZChuZXN0ZWRXcmFwcGVyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzOwotCi0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NTdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUxvYWRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU1FMSiA9ICIuc3FsaiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KU1AgPSAiLmpzcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTUEFUSCA9ICIuY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1NFVFRJTkdTID0gIi5zZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9DVlNfSUdPUkUgPSAiLmN2c2lnbm9yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0U291cmNlID0gdHJ1ZTsKLQotCXByaXZhdGUgTGlzdCB6aXBGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBqYXZhQ2xhc3NwYXRoVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBjbGFzcyBGaWxlc0hvbGRlciB7Ci0KLQkJcHJpdmF0ZSBNYXAgcGF0aHNUb0FyY2hpdmVSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgTWFwIHBhdGhzVG9Xb3JrYmVuY2hSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgTWFwIHdvcmtiZW5jaFJlc291cmNlc1RvUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgTWFwIHBhdGhzVG9EaXNrRmlsZXM7Ci0KLQkJcHJpdmF0ZSBNYXAgcGF0aHNUb1ppcEVudHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwdWJsaWMgdm9pZCByZW1vdmVJRmlsZShJRmlsZSBmaWxlKSB7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSB3b3JrYmVuY2hSZXNvdXJjZXNUb1BhdGhzLmdldChmaWxlKTsKLQkJCXJlbW92ZShwYXRoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShJUGF0aCBwYXRoKSB7Ci0JCQlwYXRoc1RvQXJjaGl2ZVJlc291cmNlcy5yZW1vdmUocGF0aCk7Ci0JCQlPYmplY3QgcmVzb3VyY2UgPSBwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzLnJlbW92ZShwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJd29ya2JlbmNoUmVzb3VyY2VzVG9QYXRocy5yZW1vdmUocmVzb3VyY2UpOwotCQkJfQotCQkJaWYgKHBhdGhzVG9EaXNrRmlsZXMgIT0gbnVsbCkgewotCQkJCXBhdGhzVG9EaXNrRmlsZXMucmVtb3ZlKHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRmlsZShJQXJjaGl2ZVJlc291cmNlIGZpbGUpIHsKLQkJCUlQYXRoIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJCXBhdGhzVG9BcmNoaXZlUmVzb3VyY2VzLnB1dChwYXRoLCBmaWxlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEZpbGUoSUFyY2hpdmVSZXNvdXJjZSBmaWxlLCBqYXZhLmlvLkZpbGUgZXh0ZXJuYWxEaXNrRmlsZSkgewotCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotCQkJcGF0aHNUb0FyY2hpdmVSZXNvdXJjZXMucHV0KHBhdGgsIGZpbGUpOwotCQkJaWYgKG51bGwgPT0gcGF0aHNUb0Rpc2tGaWxlcykgewotCQkJCXBhdGhzVG9EaXNrRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCQkJcGF0aHNUb0Rpc2tGaWxlcy5wdXQocGF0aCwgZXh0ZXJuYWxEaXNrRmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRGaWxlKElBcmNoaXZlUmVzb3VyY2UgZmlsZSwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlJUGF0aCBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCQlwYXRoc1RvQXJjaGl2ZVJlc291cmNlcy5wdXQocGF0aCwgZmlsZSk7Ci0JCQlwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzLnB1dChwYXRoLCByZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gbnVsbDsKLQotCQkJaWYgKHBhdGhzVG9EaXNrRmlsZXMgIT0gbnVsbCAmJiBwYXRoc1RvRGlza0ZpbGVzLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0JCQkJZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKSBwYXRoc1RvRGlza0ZpbGVzLmdldChwYXRoKTsKLQkJCX0gZWxzZSBpZiAocGF0aHNUb1dvcmtiZW5jaFJlc291cmNlcyAhPSBudWxsICYmIHBhdGhzVG9Xb3JrYmVuY2hSZXNvdXJjZXMuY29udGFpbnNLZXkocGF0aCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzLmdldChwYXRoKTsKLQkJCQlkaXNrRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGRpc2tGaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShkaXNrRmlsZSk7Ci0JCQl9IGVsc2UgaWYgKHBhdGhzVG9aaXBFbnRyeS5jb250YWluc0tleShwYXRoKSkgewotCQkJCU1hcCBmaWxlVVJJTWFwID0gKE1hcCkgcGF0aHNUb1ppcEVudHJ5LmdldChwYXRoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGZpbGVVUklNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQkJCVN0cmluZyBzb3VyY2VGaWxlVXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCi0JCQkJLy8gdGhlcmUgaXMgb25seSBvbmUga2V5LCBwYWlyCi0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlzb3VyY2VGaWxlVXJpID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQl6aXBGaWxlID0gKFppcEZpbGUpIGZpbGVVUklNYXAuZ2V0KHNvdXJjZUZpbGVVcmkpOwotCQkJCX0KLQkJCQlaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoc291cmNlRmlsZVVyaSk7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQlyZXR1cm4gaW47Ci0JCQl9IGVsc2UgewotCQkJCUlBcmNoaXZlUmVzb3VyY2UgcmVzID0gZ2V0QXJjaGl2ZVJlc291cmNlKHBhdGgpOwotCQkJCXJldHVybiBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIudGhpcy5nZXRTdXBlcklucHV0U3RyZWFtKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBnZXRGaWxlcygpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PElBcmNoaXZlUmVzb3VyY2U+KHBhdGhzVG9BcmNoaXZlUmVzb3VyY2VzLnZhbHVlcygpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElQYXRoIHBhdGgpIHsKLQkJCXJldHVybiBwYXRoc1RvQXJjaGl2ZVJlc291cmNlcy5jb250YWluc0tleShwYXRoKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCBwYXRoKSB7Ci0JCQlyZXR1cm4gKElBcmNoaXZlUmVzb3VyY2UpIHBhdGhzVG9BcmNoaXZlUmVzb3VyY2VzLmdldChwYXRoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIHppcEZpbGUsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCkgewotCQkJCWlmICghcnVudGltZVBhdGguZXF1YWxzKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcnVudGltZVBhdGggPSBydW50aW1lUGF0aC5hcHBlbmQoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQllbHNlCi0JCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVudGltZVBhdGggPSBuZXcgUGF0aChlbnRyeS5nZXROYW1lKCkpOwotCQkJfQotCi0JCQlJQXJjaGl2ZVJlc291cmNlIGZpbGUgPSBjcmVhdGVGaWxlKHJ1bnRpbWVQYXRoKTsKLQotCQkJTWFwIGZpbGVVUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZmlsZVVSSU1hcC5wdXQoZW50cnkuZ2V0TmFtZSgpLCB6aXBGaWxlKTsKLQotCQkJcGF0aHNUb1ppcEVudHJ5LnB1dChmaWxlLmdldFBhdGgoKSwgZmlsZVVSSU1hcCk7Ci0JCQlwYXRoc1RvQXJjaGl2ZVJlc291cmNlcy5wdXQoZmlsZS5nZXRQYXRoKCksIGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVzSG9sZGVyIGZpbGVzSG9sZGVyOwotCi0JcHJpdmF0ZSBJVmlydHVhbEZpbGUgbWFuaWZlc3RGaWxlID0gbnVsbDsKLQotCXB1YmxpYyBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQl0aGlzKHZDb21wb25lbnQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQl0aGlzLnZDb21wb25lbnQgPSB2Q29tcG9uZW50OwotCQlmaWxlc0hvbGRlciA9IG5ldyBGaWxlc0hvbGRlcigpOwotCQlzZXRJbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyhpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMoYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQl0aGlzLmluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzID0gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHM7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJdGhpcy5tYW5pZmVzdEZpbGUgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlzYXZlSmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubWFuaWZlc3RGaWxlID0gbnVsbDsKLQkJCWphdmFDbGFzc3BhdGhVUklzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaW5pdEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEFyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHBhdGgpIHsKLQkJaW5pdEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmNvbnRhaW5zKHBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFyY2hpdmVSZXNvdXJjZXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCWlmICghYXJjaGl2ZVJlc291cmNlc0luaXRpYWxpemVkKSB7Ci0JCQlhcmNoaXZlUmVzb3VyY2VzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKLQkJCWFnZ3JlZ2F0ZUNsYXNzRmlsZXMoKTsKLQkJCWFkZFV0aWxpdGllcygpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQotCQlpbml0QXJjaGl2ZVJlc291cmNlcygpOwotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpYnJhcnkgY3AgZW50cmllcyB0aGF0IHBvaW50IHRvIGNsYXNzIGZvbGRlcnMgYW5kIGhhdmUgYmVlbiB0YWdnZWQgd2l0aCB0aGUgcHVibGlzaC9leHBvcnQgYXR0cmlidXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBlZENsYXNzRm9sZGVycyhmaW5hbCBJUGF0aCB0YXJnZXRSdW50aW1lUGF0aCkgewotCQkvLyByZXRyaWV2ZSBhbGwgbWFwcGVkIGNsYXNzIGZvbGRlcnMKLQkJaWYgKHZDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCBqMmVlQ29tcG9uZW50ID0gKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB2Q29tcG9uZW50OwotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gajJlZUNvbXBvbmVudC5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGNwUmVmc1tqXTsKLQkJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSByZWYuZ2V0UnVudGltZVBhdGgoKTsKLQkJCQkJLy8gb25seSBwcm9jZXNzIG1hcHBpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBydW50aW1lIHBhdGgKLQkJCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudAotCQkJCQkJCSYmIHJ1bnRpbWVQYXRoLmVxdWFscyh0YXJnZXRSdW50aW1lUGF0aCkpIHsKLQkJCQkJCWZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQlpZiAoY29tcC5pc0NsYXNzRm9sZGVyKCkpIHsKLQkJCQkJCQlmaW5hbCBJQ29udGFpbmVyIGNsYXNzRm9sZGVyID0gY29tcC5nZXRDbGFzc0ZvbGRlcigpOwotCQkJCQkJCWlmIChjbGFzc0ZvbGRlciAhPSBudWxsICYmIGNsYXNzRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWFnZ3JlZ2F0ZU91dHB1dEZpbGVzKG5ldyBJUmVzb3VyY2VbXXtjbGFzc0ZvbGRlcn0sIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpLCBjbGFzc0ZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlSmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKSB7Ci0JCWlmICh2Q29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWZpbmFsIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50IGoyZWVDb21wID0gKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB2Q29tcG9uZW50OwotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gajJlZUNvbXAuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJamF2YUNsYXNzcGF0aFVSSXMuYWRkKHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXRpbGl0aWVzKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBvbmVudHMgPSB2Q29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb21wb25lbnRzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gRGVwZW5kZW5jeVR5cGUuQ09OU1VNRVMpIHsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlaaXBGaWxlIHppcEZpbGU7Ci0JCQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCXRyeSB7Ci0JCQkJCXppcEZpbGUgPSBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGRpc2tGaWxlKTsKLQkJCQkJemlwRmlsZXMuYWRkKHppcEZpbGUpOwotCQkJCQlFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHppcEZpbGUuZW50cmllcygpOwotCQkJCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJCQkJZmlsZXNIb2xkZXIuYWRkRW50cnkoZW50cnksIHppcEZpbGUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjYWNoZSBvZiB0aGUgSVJlc291cmNlIHJvb3RzIGZvciBhbGwgamF2YSBzb3VyY2UgZm9sZGVycyBhbmQgaXMKLQkgKiB1c2VkIGJ5IHtAbGluayAjaW5KYXZhU3JjKElWaXJ0dWFsUmVzb3VyY2UpfS4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZVtdIHNvdXJjZVJvb3RzID0gbnVsbDsKLQotCXByb3RlY3RlZCB2b2lkIGFnZ3JlZ2F0ZVNvdXJjZUZpbGVzKCkgewotCQl0cnkgewotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSByb290Rm9sZGVyLm1lbWJlcnMoKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc3JjUGtncyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnModkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJc291cmNlUm9vdHMgPSBuZXcgSVJlc291cmNlW3NyY1BrZ3MubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGtncy5sZW5ndGg7IGkrKykgewotCQkJCXNvdXJjZVJvb3RzW2ldID0gc3JjUGtnc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0KLQkJCWluSmF2YVNyYyA9IGZhbHNlOwotCQkJYWdncmVnYXRlRmlsZXMobWVtYmVycyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWdncmVnYXRlQ2xhc3NGaWxlcygpIHsKLQkJU3RydWN0dXJlRWRpdCBzZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZVJvb3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyh2Q29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQodkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSb290cy5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIG91dHB1dFBhdGggPSBzb3VyY2VSb290c1tpXS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCQlvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvdXRwdXRQYXRoICE9IG51bGwpIHsKLQkJCQkJSUNvbnRhaW5lciBqYXZhT3V0cHV0Q29udGFpbmVyID0gb3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKSA+IDEgPyAoSUNvbnRhaW5lcikgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIob3V0cHV0UGF0aCkgOiAoSUNvbnRhaW5lcikgUmVzb3VyY2VzUGx1Z2luCi0JCQkJCQkJLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG91dHB1dFBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gc2UuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChzb3VyY2VSb290c1tpXS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlJUGF0aCB0bXBSdW50aW1lUGF0aCA9IGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQkJCUlQYXRoIHRtcFNvdXJjZVBhdGggPSBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0U291cmNlUGF0aCgpOwotCQkJCQkJCWlmICghdG1wUnVudGltZVBhdGguZXF1YWxzKHRtcFNvdXJjZVBhdGgpKSB7Ci0JCQkJCQkJCXdoaWxlICh0bXBTb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMCAmJiB0bXBSdW50aW1lUGF0aC5zZWdtZW50Q291bnQoKSA+IDAgJiYgdG1wUnVudGltZVBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHModG1wU291cmNlUGF0aC5sYXN0U2VnbWVudCgpKSkgewotCQkJCQkJCQkJdG1wUnVudGltZVBhdGggPSB0bXBSdW50aW1lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJCQkJCQl0bXBTb3VyY2VQYXRoID0gdG1wU291cmNlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHRtcFJ1bnRpbWVQYXRoLnNlZ21lbnRDb3VudCgpICE9IDApIHsKLQkJCQkJCQkJCXJ1bnRpbWVQYXRoID0gdG1wUnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWlmIChudWxsID09IHJ1bnRpbWVQYXRoKSB7Ci0JCQkJCQlydW50aW1lUGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYWdncmVnYXRlT3V0cHV0RmlsZXMobmV3IElSZXNvdXJjZVtdIHsgamF2YU91dHB1dENvbnRhaW5lciB9LCBydW50aW1lUGF0aCwgamF2YU91dHB1dENvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2UgIT0gbnVsbCkgewotCQkJCXNlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFnZ3JlZ2F0ZU91dHB1dEZpbGVzKElSZXNvdXJjZVtdIHJlc291cmNlcywgZmluYWwgSVBhdGggcnVudGltZVBhdGhQcmVmaXgsIGludCBvdXRwdXRGb2xkZXJTZWdtZW50Q291bnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBmaWxlQWRkZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlBcmNoaXZlUmVzb3VyY2UgY0ZpbGUgPSBudWxsOwotCQkJaWYgKCFyZXNvdXJjZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIFdlIGhhdmUgdG8gYXZvaWQgZHVwbGljYXRlcyBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzCi0JCQkvLyAobm9uLWphdmEKLQkJCS8vIHJlc291cmNlcykKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGhQcmVmaXguYXBwZW5kKHJlc291cmNlc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhvdXRwdXRGb2xkZXJTZWdtZW50Q291bnQpKTsKLQkJCWlmIChydW50aW1lUGF0aCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlc291cmNlc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoIXNob3VsZEluY2x1ZGUocnVudGltZVBhdGgpKQotCQkJCQljb250aW51ZTsKLQkJCQljRmlsZSA9IGNyZWF0ZUZpbGUocnVudGltZVBhdGgpOwotCQkJCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2VzW2ldKSk7Ci0JCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShjRmlsZSwgcmVzb3VyY2VzW2ldKTsKLQkJCQlmaWxlQWRkZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChzaG91bGRJbmNsdWRlKChJQ29udGFpbmVyKSByZXNvdXJjZXNbaV0pKSB7Ci0JCQkJSVJlc291cmNlW10gbmVzdGVkUmVzb3VyY2VzID0gKChJQ29udGFpbmVyKSByZXNvdXJjZXNbaV0pLm1lbWJlcnMoKTsKLQkJCQlhZ2dyZWdhdGVPdXRwdXRGaWxlcyhuZXN0ZWRSZXNvdXJjZXMsIHJ1bnRpbWVQYXRoUHJlZml4LCBvdXRwdXRGb2xkZXJTZWdtZW50Q291bnQpOwotCQkJCWlmICghZmlsZXNIb2xkZXIuY29udGFpbnMocnVudGltZVBhdGgpKSB7Ci0JCQkJCWlmICghc2hvdWxkSW5jbHVkZShydW50aW1lUGF0aCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJY0ZpbGUgPSBjcmVhdGVEaXJlY3RvcnkocnVudGltZVBhdGgpOwotCQkJCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKHJlc291cmNlc1tpXSkpOwotCQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKGNGaWxlKTsKLQkJCQkJZmlsZUFkZGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVBZGRlZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgd2hldGhlciB7QGxpbmsgI2FnZ3JlZ2F0ZUZpbGVzKElWaXJ0dWFsUmVzb3VyY2VbXSl9Ci0JICogaXMgY3VycmVudGx5IHdpdGhpbiBhIEphdmEgU291cmNlIGZvbGRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW5KYXZhU3JjID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZ2dyZWdhdGVGaWxlcyhJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIGZpbGVBZGRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghdmlydHVhbFJlc291cmNlc1tpXS5leGlzdHMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gV2UgaGF2ZSB0byBhdm9pZCBkdXBsaWNhdGVzIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMKLQkJCS8vIChub24tamF2YQotCQkJLy8gcmVzb3VyY2VzKQotCQkJSVBhdGggcnVudGltZVBhdGggPSB2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQlpZiAocnVudGltZVBhdGggPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGguc2V0RGV2aWNlKG51bGwpLm1ha2VSZWxhdGl2ZSgpOwotCQkJaWYgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKHJ1bnRpbWVQYXRoKSkKLQkJCQljb250aW51ZTsKLQotCQkJSUFyY2hpdmVSZXNvdXJjZSBjRmlsZSA9IG51bGw7Ci0KLQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFR5cGUoKSA9PSBJVmlydHVhbFJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoIXNob3VsZEluY2x1ZGUocnVudGltZVBhdGgpKQotCQkJCQljb250aW51ZTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCS8vIHdhbnQgdG8gaWdub3JlIGRlcml2ZWQgcmVzb3VyY2VzIG5lc3RlZCB3aXRoaW4gSmF2YSBzcmMKLQkJCQkvLyBkaXJlY3RvcmllczsgdGhpcyBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUKLQkJCQkvLyBhIHVzZXIgaGFzIG5lc3RlZCBhIEphdmEgb3V0cHV0IGRpcmVjdG9yeSB3aXRoaW4gYSBKYXZhIHNyYwotCQkJCS8vIGRpcmVjdG9yeSAobm90ZTogc2hvdWxkIGlkZWFsbHkgYmUKLQkJCQkvLyByZXNwZWN0aW5nIEphdmEgc3JjIHBhdGggZXhjbHVzaW9uIGZpbHRlcnMpCi0JCQkJaWYgKGluSmF2YVNyYyAmJiByZXNvdXJjZS5pc0Rlcml2ZWQoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY0ZpbGUgPSBjcmVhdGVGaWxlKHJ1bnRpbWVQYXRoKTsKLQkJCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKHJlc291cmNlKSk7Ci0JCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShjRmlsZSwgcmVzb3VyY2UpOwotCQkJCWZpbGVBZGRlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHNob3VsZEluY2x1ZGUoKElWaXJ0dWFsQ29udGFpbmVyKSB2aXJ0dWFsUmVzb3VyY2VzW2ldKSkgewotCQkJCWJvb2xlYW4gaW5KYXZhU3JjQXRUaGlzTGV2ZWwgPSBpbkphdmFTcmM7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKCFpbkphdmFTcmMpIHsKLQkJCQkJCS8vIGlmIG5vdCBhbHJlYWR5IGluc2lkZSBhIEphdmEgc3JjIGRpciwgY2hlY2sgYWdhaW4KLQkJCQkJCWluSmF2YVNyYyA9IGluSmF2YVNyYyh2aXJ0dWFsUmVzb3VyY2VzW2ldKTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbFJlc291cmNlW10gbmVzdGVkVmlydHVhbFJlc291cmNlcyA9ICgoSVZpcnR1YWxDb250YWluZXIpIHZpcnR1YWxSZXNvdXJjZXNbaV0pLm1lbWJlcnMoKTsKLQkJCQkJYWdncmVnYXRlRmlsZXMobmVzdGVkVmlydHVhbFJlc291cmNlcyk7Ci0JCQkJCWlmICghZmlsZXNIb2xkZXIuY29udGFpbnMocnVudGltZVBhdGgpKSB7Ci0JCQkJCQlpZiAoIXNob3VsZEluY2x1ZGUocnVudGltZVBhdGgpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChpbkphdmFTcmMgJiYgcmVzb3VyY2UuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWNGaWxlID0gY3JlYXRlRGlyZWN0b3J5KHJ1bnRpbWVQYXRoKTsKLQkJCQkJCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2UpKTsKLQkJCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUoY0ZpbGUpOwotCQkJCQkJZmlsZUFkZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWluSmF2YVNyYyA9IGluSmF2YVNyY0F0VGhpc0xldmVsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZUFkZGVkOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCBJVmlydHVhbFJlc291cmNlIG1hcHMgdG8gYSBJUmVzb3VyY2UgdGhhdCBpcwotCSAqIGNvbnRhaW5lZCB3aXRoaW4gYSBKYXZhIHNyYyByb290LgotCSAqIAotCSAqIEBwYXJhbSB2aXJ0dWFsUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIElWaXJ0dWFsUmVzb3VyY2UgdG8gY2hlY2suCi0JICogQHBhcmFtIHNvdXJjZVJvb3RzCi0JICogICAgICAgICAgICBDdXJyZW50IEphdmEgc3JjIHJvb3RzLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBjb250YWluZWQgaW4gYSBKYXZhIHNyYyByb290LCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5KYXZhU3JjKGZpbmFsIElWaXJ0dWFsUmVzb3VyY2UgdmlydHVhbFJlc291cmNlKSB7Ci0JCWlmIChzb3VyY2VSb290cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGFsbCBtYXBwZWQgcmVzb3VyY2VzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIEphdmEgc3JjIGZvciB0aGUKLQkJLy8gcmVzb3VyY2UgdG8gYmUgY29uc2lkZXJlZCBpbiBKYXZhIHNyYwotCQlmaW5hbCBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSB2aXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlib29sZWFuIGluSmF2YVNyYyA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJaW5KYXZhU3JjID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNvdXJjZVJvb3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHNvdXJjZVJvb3RzW2pdLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihyZXNvdXJjZXNbaV0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJaW5KYXZhU3JjID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gaWYgdGhpcyBvbmUgd2FzIG5vdCBpbiBKYXZhIHNyYywgY2FuIGJyZWFrCi0JCQlpZiAoIWluSmF2YVNyYykgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluSmF2YVNyYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgbG9uZyBnZXRMYXN0TW9kaWZpZWQoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gYVJlc291cmNlLmdldExvY2F0aW9uKCkudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0U291cmNlKGJvb2xlYW4gbmV3RXhwb3J0U291cmNlKSB7Ci0JCWV4cG9ydFNvdXJjZSA9IG5ld0V4cG9ydFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydFNvdXJjZSgpIHsKLQkJcmV0dXJuIGV4cG9ydFNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKElDb250YWluZXIgYUNvbnRhaW5lcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKElWaXJ0dWFsQ29udGFpbmVyIHZDb250YWluZXIpIHsKLQkJSUNvbnRhaW5lciBpQ29udGFpbmVyID0gKElDb250YWluZXIpIHZDb250YWluZXIuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCXJldHVybiBzaG91bGRJbmNsdWRlKGlDb250YWluZXIpOwotCX0KLQotCS8vIFRPRE8gYWRkIGEgbWVjaGFuaXNtIGZvciBpZ25vcmluZyBzcGVjaWZpYyBmaWxlIHR5cGVzCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBsYXN0U2VnbWVudCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJaWYgKG51bGwgPT0gbGFzdFNlZ21lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoRE9UX1BST0pFQ1QpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKERPVF9DTEFTU1BBVEgpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKERPVF9DVlNfSUdPUkUpIHx8IHBhdGguc2VnbWVudCgwKS5zdGFydHNXaXRoKERPVF9TRVRUSU5HUykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNFeHBvcnRTb3VyY2UoKSB8fCAhaXNTb3VyY2UocGF0aCk7Ci0JfQotCi0JLy8gVE9ETyBhZGQgYSBtZWNoYW5pc20gZm9yIGlnbm9yaW5nIHNwZWNpZmljIGZpbGUgdHlwZXMKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZShJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCkuZW5kc1dpdGgoSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5ET1RfSkFWQSkgfHwgcGF0aC5sYXN0U2VnbWVudCgpLmVuZHNXaXRoKERPVF9TUUxKKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlcm5hbEZpbGUoSVBhdGggcGF0aCwgamF2YS5pby5GaWxlIGV4dGVybmFsRGlza0ZpbGUpIHsKLQkJSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA9IGNyZWF0ZUZpbGUocGF0aCk7Ci0JCWZpbGVzSG9sZGVyLmFkZEZpbGUoYUZpbGUsIGV4dGVybmFsRGlza0ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRTdXBlcklucHV0U3RyZWFtKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmNoaXZlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlLkFSQ0hJVkVfVFlQRSkgewotCQkJSUFyY2hpdmVMb2FkQWRhcHRlciBuZXN0ZWRMb2FkQWRhcHRlciA9IChJQXJjaGl2ZUxvYWRBZGFwdGVyKSgoSUFyY2hpdmUpYXJjaGl2ZVJlc291cmNlKS5nZXRMb2FkQWRhcHRlcigpOwotCQkJaWYobmVzdGVkTG9hZEFkYXB0ZXIgaW5zdGFuY2VvZiBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpewotCQkJCSgoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKW5lc3RlZExvYWRBZGFwdGVyKS5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRJbnB1dFN0cmVhbShhcmNoaXZlUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKTsKLQkJLy8gSWYgdGhlIE1BTklGRVNULk1GIG9mIGEgbW9kdWxlIGNvbXBvbmVudCBpcyBiZWluZyByZXF1ZXN0ZWQgYW5kIHRoYXQKLQkJLy8gbW9kdWxlIGNvbXBvbmVudCByZWZlcmVuY2VzCi0JCS8vIEphdmEgYnVpbGQgcGF0aC1iYXNlZCBjb21wb25lbnRzLCBuZWVkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUKLQkJLy8gbWFuaWZlc3QgY2xhc3NwYXRoIHRvIHJlZmxlY3QgdGhlIHJlc29sdmVkCi0JCS8vIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgYnVpbGQgcGF0aAotCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcGF0aC5lcXVhbHMoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpICYmICFqYXZhQ2xhc3NwYXRoVVJJcy5pc0VtcHR5KCkgJiYgbWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkgIT0gbnVsbAotCQkJCSYmIG1hbmlmZXN0RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkvLyB1cGRhdGUgdGhlIG1hbmlmZXN0IGNsYXNzcGF0aCBmb3IgdGhlIGNvbXBvbmVudAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlDbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsLnVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKG1hbmlmZXN0RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpLCBqYXZhQ2xhc3NwYXRoVVJJcywgYmFvcyk7Ci0JCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCX0KLQotCQlpZiAoZmlsZXNIb2xkZXIuY29udGFpbnMocGF0aCkpIHsKLQkJCXJldHVybiBmaWxlc0hvbGRlci5nZXRJbnB1dFN0cmVhbShwYXRoKTsKLQkJfQotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgdlJlc291cmNlID0gcm9vdEZvbGRlci5maW5kTWVtYmVyKHBhdGgpOwotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlpZiAobnVsbCAhPSB2UmVzb3VyY2UgJiYgdlJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQlmaWxlUGF0aCA9IHZSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlUGF0aCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJfQotCQlTdHJpbmcgZVN0cmluZyA9IEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fRmlsZU5vdEZvdW5kOwotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGVTdHJpbmcpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCXJldHVybiB2Q29tcG9uZW50OwotCX0KLQotCXByb3RlY3RlZCBKYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlciBlbWZIZWxwZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVNRkhlbHBlcigpIHsKLQkJaWYgKGVtZkhlbHBlciA9PSBudWxsKSB7Ci0JCQllbWZIZWxwZXIgPSBuZXcgSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIoZ2V0QXJjaGl2ZSgpKTsKLQkJCWVtZkhlbHBlci5zZXRBcmNoaXZlVVJJQ29udmVydGVyKG5ldyBBcmNoaXZlVVJJQ29udmVydGVyKGVtZkhlbHBlci5nZXRBcmNoaXZlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgVVJJIGNvbnZlcnRQYXRoVG9VUkkoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7Ci0JCQkJCS8vIFRPRE8gZmluZCBhIGJldHRlciB3YXkgdG8gZ2V0cGxhdGZvcm1VUkkKLQkJCQkJSVBhdGggcGF0aCA9IGdldENvbXBvbmVudCgpLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG1vZGVsT2JqZWN0UGF0aCkuZ2V0VW5kZXJseWluZ0ZpbGUoKS5nZXRGdWxsUGF0aCgpOwotCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJaW5pdEVNRkhlbHBlcigpOwotCQlpZiAoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCA9PSBtb2RlbE9iamVjdFBhdGgpIHsKLQkJCW1vZGVsT2JqZWN0UGF0aCA9IGdldERlZmF1bHRNb2RlbE9iamVjdFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gZW1mSGVscGVyLmNvbnRhaW5zTW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlpbml0RU1GSGVscGVyKCk7Ci0JCWlmIChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIID09IG1vZGVsT2JqZWN0UGF0aCkgewotCQkJbW9kZWxPYmplY3RQYXRoID0gZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpOwotCQl9Ci0JCXJldHVybiBlbWZIZWxwZXIuZ2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZUxlbmd0aCkpOwotCQlidWZmZXIuYXBwZW5kKCIsIENvbXBvbmVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRDb21wb25lbnQoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbnVsbDsKLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsgdGhpcy5tb25pdG9yID0KLQkgKiBtb25pdG9yOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIGZpbmFsIGludCBGSUxFX1NBVkVfV09SSyA9IDEwMDsKLQkgKiAKLQkgKiBwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7IHJldHVybiBuZXcKLQkgKiBGaWxlSXRlcmF0b3JJbXBsKGdldENvbnRhaW5lcigpLmdldEZpbGVzKCkpeyBwcm90ZWN0ZWQgU3ViUHJvZ3Jlc3NNb25pdG9yCi0JICogbGFzdFN1Yk1vbiA9IG51bGw7IGJvb2xlYW4gZmlyc3RWaXNpdCA9IHRydWU7Ci0JICogCi0JICogcHVibGljIEZpbGUgbmV4dCgpIHsgaWYoZmlyc3RWaXNpdCl7IGZpcnN0VmlzaXQgPSBmYWxzZTsgaWYobW9uaXRvciAhPQotCSAqIG51bGwpewotCSAqIG1vbml0b3IuYmVnaW5UYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5FeHBvcnRpbmdfYXJjaGl2ZSwKLQkgKiBuZXcgT2JqZWN0IFtdIHsgZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCkgfSksIGZpbGVzLnNpemUoKSAqCi0JICogRklMRV9TQVZFX1dPUkspOyB9IH0gaWYobGFzdFN1Yk1vbiAhPSBudWxsKXsgbGFzdFN1Yk1vbi5kb25lKCk7Ci0JICogbGFzdFN1Yk1vbiA9IG51bGw7IH0gZWxzZSBpZihtb25pdG9yICE9IG51bGwpewotCSAqIG1vbml0b3Iud29ya2VkKEZJTEVfU0FWRV9XT1JLKTsgfSBGaWxlIGZpbGUgPSBzdXBlci5uZXh0KCk7IGlmKG1vbml0b3IgIT0KLQkgKiBudWxsKXsgaWYoZmlsZS5pc0NvbnRhaW5lcigpICYmCi0JICogQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmNsYXNzLmlzSW5zdGFuY2UoKChDb250YWluZXJJbXBsKWZpbGUpLmdldExvYWRTdHJhdGVneSgpKSl7Ci0JICogQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGxzID0KLQkgKiAoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSgoQ29udGFpbmVySW1wbClmaWxlKS5nZXRMb2FkU3RyYXRlZ3koKTsKLQkgKiBsYXN0U3ViTW9uID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBGSUxFX1NBVkVfV09SSywKLQkgKiBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCSAqIGxzLnNldFByb2dyZXNzTW9uaXRvcihsYXN0U3ViTW9uKTsgfSBlbHNlIHsKLQkgKiBtb25pdG9yLnN1YlRhc2soZmlsZS5nZXRVUkkoKSk7IH0gfSByZXR1cm4gZmlsZTsgfSB9OyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0NvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2MxYmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0NvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLklPdmVyd3JpdGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5PdmVyd3JpdGVIYW5kbGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi0vLyBoYXJpOiBtYWtlIGFic3RyYWN0Ci1wdWJsaWMgY2xhc3MgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQ7Ci0KLQlwcm90ZWN0ZWQgSU92ZXJ3cml0ZUhhbmRsZXIgb3ZlcndyaXRlSGFuZGxlcjsKLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCXByaXZhdGUgU3RyaW5nIGFyY2hpdmVDb21wb25lbnRzRGVwbG95UGF0aDsKLQotCXByaXZhdGUgTGlzdCBhcmNoaXZlQ29tcG9uZW50czsKLQotCXByaXZhdGUgTWFwIGFyY2hpdmVDb21wb25lbnRVUklNYXA7Ci0KLQlwdWJsaWMgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG51bGwgPT0gdkNvbXBvbmVudCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52Q29tcG9uZW50ID0gdkNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlSGFuZGxlcihJT3ZlcndyaXRlSGFuZGxlciBuZXdPdmVyd3JpdGVIYW5kbGVyKSB7Ci0JCW92ZXJ3cml0ZUhhbmRsZXIgPSBuZXdPdmVyd3JpdGVIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG5ld1Byb2dyZXNzTW9uaXRvcikgewotCQlwcm9ncmVzc01vbml0b3IgPSBuZXdQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFZGl0KElGaWxlIGFGaWxlKSB7Ci0JCWlmIChvdmVyd3JpdGVIYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKGFGaWxlLmV4aXN0cygpICYmIGFGaWxlLmlzUmVhZE9ubHkoKSkpCi0JCQlyZXR1cm47Ci0KLQkJb3ZlcndyaXRlSGFuZGxlci52YWxpZGF0ZUVkaXQoYUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZE92ZXJ3cml0ZShTdHJpbmcgdXJpKSB7Ci0JCWlmIChvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlTm9uZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKG92ZXJ3cml0ZUhhbmRsZXIuaXNPdmVyd3JpdGVSZXNvdXJjZXMoKSB8fCBvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlQWxsKCkgfHwgb3ZlcndyaXRlSGFuZGxlci5zaG91bGRPdmVyd3JpdGUodXJpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHRoaXMgbWV0aG9kIGhhcyBubyByZWZlcmVuY2VzIGluIHRoZSBoaXJhcmNoeQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGludCBTVVBFUl9USUNLUyA9IDEwMDA7Ci0JCWZpbmFsIGludCBMT0NBTF9USUNLUyA9IDEwOwotCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBTVVBFUl9USUNLUyArIExPQ0FMX1RJQ0tTOwotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIkltcG9ydGluZyAiICsgdkNvbXBvbmVudC5nZXROYW1lKCksIFRPVEFMX1RJQ0tTKTsKLQkJCXN1cGVyLnNhdmUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTVVBFUl9USUNLUykpOwotCQkJbGlua0FyY2hpdmVDb21wb25lbnRzKCk7Ci0JCQltb25pdG9yLndvcmtlZChMT0NBTF9USUNLUyk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkKLQkJCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJcHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2soYUZpbGUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBhRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCi0JCQlJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoID0gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aChhRmlsZSk7Ci0JCQlpZiAoYUZpbGUuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuQVJDSElWRV9UWVBFKSB7Ci0JCQkJc2F2ZUFzQXJjaGl2ZUNvbXBvbmVudCgoSUFyY2hpdmUpIGFGaWxlLCBwcm9qZWN0UmVsYXRpdmVQYXRoLCBpbik7Ci0JCQl9IGVsc2UgaWYgKGFGaWxlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJc2F2ZVRvT3V0cHV0UGF0aChwcm9qZWN0UmVsYXRpdmVQYXRoLCBpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZURpcmVjdG9yeShwcm9qZWN0UmVsYXRpdmVQYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbiBvaGUpIHsKLQkJCXRocm93IG9oZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBlcnJvclN0cmluZyA9IEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fU2F2ZUZpbGUgKyBhRmlsZS5nZXRQYXRoKCk7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG51bGwgIT0gcHJvZ3Jlc3NNb25pdG9yKXsKLQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIGZvciB3aGVyZSB0aGUgc3BlY2lmaWVkIGZpbGUgc2hvdWxkIGJlCi0JICogc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKLQkJSVBhdGggcGF0aCA9IGFGaWxlLmdldFBhdGgoKTsKLQkJSUZpbGUgaUZpbGUgPSBudWxsOwotCQlpZiAocGF0aC5sYXN0U2VnbWVudCgpICE9IG51bGwgJiYgcGF0aC5sYXN0U2VnbWVudCgpLnN0YXJ0c1dpdGgoSU1vZHVsZUNvbnN0YW50cy5ET1RfU0VUVElOR1MpKSB7Ci0JCQlpRmlsZSA9IHZDb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldEZpbGUocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJVmlydHVhbEZpbGUgdkZpbGUgPSByb290Rm9sZGVyLmdldEZpbGUocGF0aCk7Ci0JCQlpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGlGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBJRm9sZGVyIHNwZWNpZmllZCBieSB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0UmVsYXRpdmVQYXRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlyZWN0b3J5KElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBpRm9sZGVyID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCQlpZiAoIWlGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCW1rZGlycyhpRm9sZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNwZWNpZmllZCBJRm9sZGVyCi0JICogCi0JICogQHBhcmFtIGZvbGRlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhJRm9sZGVyIGZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLQkJaWYgKCFjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCW1rZGlycygoSUZvbGRlcikgY29udGFpbmVyKTsKLQkJfQotCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHNwZWNpZmllZCBBcmNoaXZlIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdCByZWxhdGl2ZSBwYXRoIHVzaW5nCi0JICogdGhlIHBhc3NlZCBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmUKLQkgKiBAcGFyYW0gcHJvamVjdFJlbGF0aXZlUGF0aAotCSAqIEBwYXJhbSBpbgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUFzQXJjaGl2ZUNvbXBvbmVudChJQXJjaGl2ZSBhcmNoaXZlLCBJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGlGaWxlID0gc2F2ZVRvT3V0cHV0UGF0aElGaWxlKHByb2plY3RSZWxhdGl2ZVBhdGgsIGluKTsKLQkJLy8gVE9ETyBpbnZlc3RpZ2F0ZSByZW1vdmluZyB0aGlzIGJsb2NrIGFuZCByZWxhdGVkIHZhcmlhYmxlcyBhbmQKLQkJLy8gbGlua0FyY2hpdmVDb21wb25lbnRzKCk7IHNlZSBidWd6aWxsYSAxNTkxNjAKLQkJaWYgKHNob3VsZExpbmtBc0NvbXBvbmVudFJlZihhcmNoaXZlKSkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZUNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCh2Q29tcG9uZW50LmdldFByb2plY3QoKSwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBpRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJaWYgKGFyY2hpdmVDb21wb25lbnRzID09IG51bGwpIHsKLQkJCQlhcmNoaXZlQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlhcmNoaXZlQ29tcG9uZW50VVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlhcmNoaXZlQ29tcG9uZW50c0RlcGxveVBhdGggPSBJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0UmVsYXRpdmVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQkJfQotCQkJYXJjaGl2ZUNvbXBvbmVudHMuYWRkKGFyY2hpdmVDb21wb25lbnQpOwotCQkJYXJjaGl2ZUNvbXBvbmVudFVSSU1hcC5wdXQoYXJjaGl2ZUNvbXBvbmVudCwgaUZpbGUuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZExpbmtBc0NvbXBvbmVudFJlZihJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaW5rQXJjaGl2ZUNvbXBvbmVudHMoKSB7Ci0JCWlmIChhcmNoaXZlQ29tcG9uZW50cyAhPSBudWxsICYmIGFyY2hpdmVDb21wb25lbnRzLnNpemUoKSA+IDApIHsKLQkJCUlEYXRhTW9kZWwgY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQljcmVhdGVSZWZlcmVuY2VzRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCB2Q29tcG9uZW50KTsKLQkJCWNyZWF0ZVJlZmVyZW5jZXNEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBhcmNoaXZlQ29tcG9uZW50c0RlcGxveVBhdGgpOwotCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBhcmNoaXZlQ29tcG9uZW50cyk7Ci0JCQljcmVhdGVSZWZlcmVuY2VzRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBhcmNoaXZlQ29tcG9uZW50VVJJTWFwKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QgcmVsYXRpdmUgb3V0cHV0IHBhdGguIFdhcm5pbmcgdGhpcyBtZXRob2QKLQkgKiB3aWxsIGJlIGNoYW5nZWQgcG9zdCAxLjUgdG8gcmV0dXJuIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIHByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiBAcGFyYW0gaW4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUb091dHB1dFBhdGgoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCX0KLQotCS8qKgotCSAqIFRPRE8gcmVmYWN0b3IgY2hhbmdlIHRoZSBtZXRob2QgYWJvdmUgdG8gcmV0dXJuIElGaWxlCi0JICoge0BsaW5rIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNX0KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aElGaWxlKElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgaUZpbGUgPSB2Q29tcG9uZW50LmdldFByb2plY3QoKS5nZXRGaWxlKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCQlzYXZlVG9JRmlsZShpRmlsZSwgaW4pOwotCQlyZXR1cm4gaUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvSUZpbGUoSUZpbGUgaUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVFZGl0KGlGaWxlKTsKLQkJaWYgKGlGaWxlLmV4aXN0cygpKQotCQkJaUZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIG51bGwpOwotCQllbHNlIHsKLQkJCW1rZGlycyhpRmlsZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlpRmlsZS5jcmVhdGUoaW4sIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWtkaXJzKElQYXRoIHBhdGgsIElXb3Jrc3BhY2VSb290IHJvb3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPD0gMSkKLQkJCXJldHVybjsKLQkJSUZvbGRlciBmb2xkZXIgPSByb290LmdldEZvbGRlcihwYXRoKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCW1rZGlycyhwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcm9vdCk7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI4ZTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIHsKLQotCXByaXZhdGUgaW50IGRvdEphdmFMZW5ndGggPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLkRPVF9KQVZBLmxlbmd0aCgpOwotCi0JcHJpdmF0ZSBMaXN0IGFscmVhZHlJbmRleGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNYXAgY2xhc3Nlc01hcDsKLQotCXByaXZhdGUgSUZpbGUga25vd25ERDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10ga25vd25MaWJFeHRlbnNpb25zID0geyAiLmphciIsIC8vJE5PTi1OTFMtMSQKLQkJCSIuemlwIiwgLy8kTk9OLU5MUy0xJAotCQkJIi5zbyIsIC8vJE5PTi1OTFMtMSQKLQkJCSIubyIsIC8vJE5PTi1OTFMtMSQKLQkJCSIuc2wiLCAvLyROT04tTkxTLTEkCi0JCQkiLmRsbCIsIC8vJE5PTi1OTFMtMSQKLQl9OwotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXRoaXModkNvbXBvbmVudCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50LCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJa25vd25ERCA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCWFkZE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKTsKLQkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlUm9vdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSb290cy5sZW5ndGg7IGkrKykgewotCQkJSUFyY2hpdmVSZXNvdXJjZSBhRmlsZTsKLQkJCXRyeSB7Ci0JCQkJYUZpbGUgPSBnZXROZXN0ZWRKYXIoc291cmNlUm9vdHNbaV0pOwotCQkJCWlmIChudWxsICE9IGFGaWxlKSB7Ci0JCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUoYUZpbGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElBcmNoaXZlUmVzb3VyY2UgZ2V0TmVzdGVkSmFyKElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZVJvb3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIG91dHB1dFBhdGggPSBzb3VyY2VSb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHZDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCW91dHB1dFBhdGggPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRQYXRoID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCUlGb2xkZXIgamF2YU91dHB1dEZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG91dHB1dFBhdGgpOwotCQlpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoamF2YU91dHB1dEZvbGRlcik7Ci0JCUlDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gKElDb250YWluZXIpIHNvdXJjZVJvb3QuZ2V0UmVzb3VyY2UoKTsKLQotCQlpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJYm9vbGVhbiBpc01vZHVsZVJvb3QgPSBrbm93bkRELmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLnN0YXJ0c1dpdGgoc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJU2V0IGlGaWxlc1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWJvb2xlYW4gZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzU2V0LCBzb3VyY2VDb250YWluZXIsIGlzTW9kdWxlUm9vdCwgZmFsc2UsIHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCk7Ci0JCWlmICghaXNNb2R1bGVSb290IHx8IGZvdW5kSmF2YSkgewotCQkJTGlzdCA8SUZpbGU+IGlGaWxlc0xpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGlGaWxlc1NldCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpRmlsZXNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJZmlsZXNIb2xkZXIucmVtb3ZlSUZpbGUoKElGaWxlKSBpRmlsZXNMaXN0LmdldChpKSk7Ci0JCQl9Ci0JCQlJQXJjaGl2ZVJlc291cmNlIG5lc3RlZEFyY2hpdmUgPSBjcmVhdGVOZXN0ZWRBcmNoaXZlKGlGaWxlc0xpc3QsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2F0aGVyRmlsZXNGb3JKQVIoQ29sbGVjdGlvbiBpRmlsZXMsIElDb250YWluZXIgY3VycmVudCwgYm9vbGVhbiBpc01vZHVsZVJvb3QsIGJvb2xlYW4gZm91bmRKYXZhLCBpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBudWxsOwotCQl0cnkgewotCQkJbWVtYmVycyA9IGN1cnJlbnQubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmUpIHsKLQkJCS8vIFRPRE8KLQkJCS8vIHRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihjb3JlKTsKLQkJfQotCQkKLQkJSUNvbnRhaW5lciBkZEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gbWVtYmVyc1tpXTsKLQkJCWlmIChyZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQlpZiAoIWRkRm9sZGVyLmVxdWFscyhyZXMpKSB7Ly9pZiBpdCdzIG5vdCB0aGUgZGQgZm9sZGVyCi0JCQkJCWZvdW5kSmF2YSA9IGdhdGhlckZpbGVzRm9ySkFSKGlGaWxlcywgKElGb2xkZXIpIHJlcywgaXNNb2R1bGVSb290LCBmb3VuZEphdmEsIHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCkgfHwgZm91bmRKYXZhOwotCQkJCX0KLQkJCX0gZWxzZSB7Ly8gaXQgbXVzdCBiZSBhIGZpbGUKLQkJCQlJRmlsZSBzcmNGaWxlID0gKElGaWxlKSByZXM7Ci0JCQkJaWYgKGJlbG9uZ3NJbk5lc3RlZEpBUihzcmNGaWxlLCBpc01vZHVsZVJvb3QpKSB7Ci0JCQkJCWlmIChKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzSmF2YShzcmNGaWxlKSkgewotCQkJCQkJaWYgKGV4cG9ydFNvdXJjZSkgewotCQkJCQkJCWlGaWxlcy5hZGQoc3JjRmlsZSk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sKLQkJCQkJCQkvLyBkdXBsaWNhdGVzIGhlcmUKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmNGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCkudG9TdHJpbmcoKTsKLQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxlbmd0aCgpIC0gZG90SmF2YUxlbmd0aCk7Ci0JCQkJCQlMaXN0IGNsYXNzZXMgPSByZXRyaWV2ZUNsYXNzZXMoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChudWxsICE9IGNsYXNzZXMpIHsKLQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCUlGaWxlIGNsYXp6ID0gKElGaWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICghaUZpbGVzLmNvbnRhaW5zKGNsYXp6KSkgewotCQkJCQkJCQkJLy8gLmNsYXNzIG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJCQkJCWlGaWxlcy5hZGQoY2xhenopOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFpRmlsZXMuY29udGFpbnMoc3JjRmlsZSkpIHsKLQkJCQkJCQkvLyBpZiBpdCdzIG5vdCBzcmMsIHRoZW4gaXQgY291bGQgYmUgLmNsYXNzIGFuZCBuZWVkCi0JCQkJCQkJLy8gdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJCQlpRmlsZXMuYWRkKHNyY0ZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpc01vZHVsZVJvb3QpCi0JCQkJCQlmb3VuZEphdmEgPSBmb3VuZEphdmEgfHwgSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5pc0phdmEoc3JjRmlsZSkgfHwgSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5pc0NsYXNzKHNyY0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRKYXZhOwotCX0KLQotCXByaXZhdGUgSUFyY2hpdmUgY3JlYXRlTmVzdGVkQXJjaGl2ZShMaXN0IDxJRmlsZT4gZmlsZXMsIElDb250YWluZXIgc291cmNlQ29udGFpbmVyLCBJRm9sZGVyIGphdmFPdXRwdXRGb2xkZXIpIHRocm93cyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJBcmNoaXZlTG9hZEFkYXB0ZXIgbmVzdGVkTG9hZGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlcihmaWxlcywgc291cmNlQ29udGFpbmVyLCBqYXZhT3V0cHV0Rm9sZGVyKTsKLQkJQXJjaGl2ZU9wdGlvbnMgbmVzdGVkT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQluZXN0ZWRPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIsIG5lc3RlZExvYWRlcik7Ci0JCUlBcmNoaXZlIG5lc3RlZEFyY2hpdmUgPSBJQXJjaGl2ZUZhY3RvcnkuSU5TVEFOQ0Uub3BlbkFyY2hpdmUobmVzdGVkT3B0aW9ucyk7Ci0JCW5lc3RlZEFyY2hpdmUuc2V0UGF0aChuZXcgUGF0aChjb21wdXRlVW5pcXVlQXJjaGl2ZVVSSShzb3VyY2VDb250YWluZXIpKSk7Ci0JCW5lc3RlZEFyY2hpdmUuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJcmV0dXJuIG5lc3RlZEFyY2hpdmU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVVuaXF1ZUFyY2hpdmVVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBpbmNyZW1lbnQgPSAwOwotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQkJZG8gewotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKyA1KTsKLQkJCXNiLmFwcGVuZCgnXycpOwotCQkJc2IuYXBwZW5kKG5hbWUpOwotCQkJaWYgKGluY3JlbWVudCA+IDApCi0JCQkJc2IuYXBwZW5kKGluY3JlbWVudCk7Ci0JCQlzYi5hcHBlbmQoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5jcmVtZW50Kys7Ci0JCX0gd2hpbGUgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKG5ldyBQYXRoKHNiLnRvU3RyaW5nKCkpKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiZWxvbmdzSW5OZXN0ZWRKQVIoSUZpbGUgaUZpbGUsIGJvb2xlYW4gaXNNb2R1bGVSb290KSB7Ci0JCWlmIChpc01vZHVsZVJvb3QgJiYgaXNEZXBsb3ltZW50RGVzY3JpcHRvcihpRmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duTGliRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaGFzRXh0ZW5zaW9uKGlGaWxlLCBrbm93bkxpYkV4dGVuc2lvbnNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKElQYXRoIHBhdGgpIHsKLQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gcGF0aC5sYXN0U2VnbWVudCgpOwotCQlyZXR1cm4gbnVsbCAhPSBsYXN0U2VnbWVudCAmJiAhSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5oYXNFeHRlbnNpb24obGFzdFNlZ21lbnQsIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuRE9UX0NMQVNTKSAmJiAhSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5oYXNFeHRlbnNpb24obGFzdFNlZ21lbnQsIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuRE9UX0pBVkEpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYWxsIHRoZSAuY2xhc3MgZmlsZXMgYW5kIGluZGV4IHRoZW0gc28gaW5uZXIgY2xhc3NlcyBjYW4gYmUgbG9jYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc2VzRm9yT3V0cHV0Rm9sZGVyKElGb2xkZXIgamF2YU91dHB1dEZvbGRlcikgewotCQlpZiAobnVsbCA9PSBqYXZhT3V0cHV0Rm9sZGVyIHx8IGFscmVhZHlJbmRleGVkLmNvbnRhaW5zKGphdmFPdXRwdXRGb2xkZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYWxyZWFkeUluZGV4ZWQuYWRkKGphdmFPdXRwdXRGb2xkZXIpOwotCQlpbnQgc2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCWluZGV4Q2xhc3NlcyhqYXZhT3V0cHV0Rm9sZGVyLCBzZWdtZW50Q291bnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzZXMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgamF2YU91dHB1dFNlZ21lbnRDb3VudCkgewotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQljYXNlIElSZXNvdXJjZS5GSUxFOgotCQkJaW5kZXhDbGFzcygoSUZpbGUpIHJlc291cmNlLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCWJyZWFrOwotCQljYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0JCQl0cnkgewotCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSAoKElGb2xkZXIpIHJlc291cmNlKS5tZW1iZXJzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NlcyhtZW1iZXJzW2ldLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzKElGaWxlIGlGaWxlLCBpbnQgamF2YU91dHB1dFNlZ21lbnRDb3VudCkgewotCQlpZiAoIUphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaXNDbGFzcyhpRmlsZSkpCi0JCQlyZXR1cm47Ci0JCWlmIChjbGFzc2VzTWFwID09IG51bGwpCi0JCQljbGFzc2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCUlQYXRoIHJlbFBhdGggPSBpRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJU3RyaW5nIGtleSA9IHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJaWYgKG5hbWUuaW5kZXhPZignJCcpICE9IC0xKSB7Ci0JCQlrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCckJykpOwotCQl9IGVsc2UgewotCQkJa2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignLicpKTsKLQkJfQotCQlMaXN0IGlubmVycyA9IChMaXN0KSBjbGFzc2VzTWFwLmdldChrZXkpOwotCQlpZiAoaW5uZXJzID09IG51bGwpIHsKLQkJCWlubmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljbGFzc2VzTWFwLnB1dChrZXksIGlubmVycyk7Ci0JCX0KLQkJaW5uZXJzLmFkZChpRmlsZSk7Ci0JfQotCi0JcHVibGljIExpc3QgcmV0cmlldmVDbGFzc2VzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGNsYXNzZXNNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKExpc3QpIGNsYXNzZXNNYXAuZ2V0KGtleSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3IoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGtub3duREQuZXF1YWxzKGlGaWxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoIGdldERlZmF1bHRNb2RlbE9iamVjdFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKElWaXJ0dWFsQ29udGFpbmVyIHZDb250YWluZXIpIHsKLQkJYm9vbGVhbiBpc0RERm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpLmVxdWFscyh2Q29udGFpbmVyKTsKLQkJcmV0dXJuIGlzRERGb2xkZXIgfHwgIWluSmF2YVNyYyh2Q29udGFpbmVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRkODljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVUeXBlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTNjNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRBcmNoaXZlVHlwZUhhbmRsZXIgaW1wbGVtZW50cyBJQXJjaGl2ZUhhbmRsZXIgewotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0FyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQlpZiAoYXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpIGluc3RhbmNlb2YgQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRPRE8gaGFuZGxlIHRoZSBubyBERCBjYXNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSQXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTIzMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSQXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSQXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBMaXN0PElGaWxlPiBpRmlsZXM7Ci0KLQlwcml2YXRlIGludCBzb3VyY2VTZWdtZW50Q291bnQ7Ci0KLQlwcml2YXRlIGludCBvdXRwdXRTZWdtZW50Q291bnQ7Ci0KLQlwcml2YXRlIE1hcDxJUGF0aCwgSUZpbGU+IHBhdGhzVG9JRmlsZXM7Ci0KLQlwcml2YXRlIE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4gcGF0aHNUb0lBcmNoaXZlUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJBcmNoaXZlTG9hZEFkYXB0ZXIoTGlzdDxJRmlsZT4gaUZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaUZpbGVzID0gaUZpbGVzOwotCQl0aGlzLnNvdXJjZUNvbnRhaW5lciA9IHNvdXJjZUNvbnRhaW5lcjsKLQkJc291cmNlU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJb3V0cHV0U2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5sZW5ndGgoKSArIDE7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VMZW5ndGgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBTb3VyY2UgQ29udGFpbmVyOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHNvdXJjZUNvbnRhaW5lci5nZXROYW1lKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluZGV4ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBmdWxsSW5kZXggPSBudWxsOwotCi0JcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJaWYgKCFpbmRleGVkKSB7Ci0JCQlpbmRleGVkID0gdHJ1ZTsKLQkJCXBhdGhzVG9JRmlsZXMgPSBuZXcgSGFzaE1hcDxJUGF0aCwgSUZpbGU+KCk7Ci0JCQlwYXRoc1RvSUFyY2hpdmVSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4oKTsKLQkJCWZvciAoSUZpbGUgaUZpbGUgOiBpRmlsZXMpIHsKLQkJCQlJUGF0aCByZWxQYXRoOwotCQkJCWlmIChKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzQ2xhc3MoaUZpbGUpKSB7Ci0JCQkJCXJlbFBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoaUZpbGUsIG91dHB1dFNlZ21lbnRDb3VudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVsUGF0aCA9IGdldFJlbGF0aXZlUGF0aChpRmlsZSwgc291cmNlU2VnbWVudENvdW50KTsKLQkJCQl9Ci0JCQkJYWRkRmlsZShpRmlsZSwgcmVsUGF0aCk7Ci0JCQl9Ci0JCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQlpZiAoIXBhdGhzVG9JQXJjaGl2ZVJlc291cmNlcy5jb250YWluc0tleShtYW5pZmVzdFBhdGgpKSB7Ci0JCQkJSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IGNyZWF0ZU1hbmlmZXN0KG1hbmlmZXN0UGF0aCk7Ci0JCQkJcGF0aHNUb0lBcmNoaXZlUmVzb3VyY2VzLnB1dChtYW5pZmVzdC5nZXRQYXRoKCksIG1hbmlmZXN0KTsKLQkJCX0KLQkJCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkQWxsKHBhdGhzVG9JQXJjaGl2ZVJlc291cmNlcy52YWx1ZXMoKSk7Ci0JCQlmdWxsSW5kZXggPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpc3QpOwotCQl9Ci0JCXJldHVybiBmdWxsSW5kZXg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCkgewotCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gY3JlYXRlRmlsZShpRmlsZSwgcmVsUGF0aCk7Ci0JCXBhdGhzVG9JQXJjaGl2ZVJlc291cmNlcy5wdXQoYUZpbGUuZ2V0UGF0aCgpLCBhRmlsZSk7Ci0JCXBhdGhzVG9JRmlsZXMucHV0KGFGaWxlLmdldFBhdGgoKSwgaUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZChJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBhUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQl9Ci0KLQlwcml2YXRlIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCkgewotCQlJQXJjaGl2ZVJlc291cmNlIGNGaWxlID0gY3JlYXRlRmlsZShyZWxQYXRoKTsKLQkJY0ZpbGUuc2V0TGFzdE1vZGlmaWVkKGdldExhc3RNb2RpZmllZChpRmlsZSkpOwotCQlyZXR1cm4gY0ZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUZpbGUgZmlsZSwgaW50IHBhcmVudFNlZ21lbnRDb3VudCkgewotCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhwYXJlbnRTZWdtZW50Q291bnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgewotCQlpZiAoIWluZGV4ZWQpIHsKLQkJCWdldEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJfQotCQlyZXR1cm4gcGF0aHNUb0lBcmNoaXZlUmVzb3VyY2VzLmNvbnRhaW5zS2V5KHJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghaW5kZXhlZCkgewotCQkJZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQl9Ci0JCXJldHVybiBwYXRoc1RvSUFyY2hpdmVSZXNvdXJjZXMuZ2V0KHJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBwYXRoc1RvSUZpbGVzLmdldChhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IGNvbnRlbnRzIGZyb20gIiArIGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIiBtZXNzYWdlICIgKyBjb3JlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsgLy8gbm8gbW9kZWwgb2JqZWN0cyBoZXJlCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FQVJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjQ5Zjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogU3RlZmFuIERpbW92LCBzdGVmYW4uZGltb3ZAc2FwLmNvbSAtIGJ1ZyAyMDc4MjYKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjIwOTEyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUxvYWRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIHsKLQotCS8vIE9wdGltaXphdGlvbiB0byBkaXJlY3RseSBjb3B5IGJpbmFyeSBmaWxlcwotCXByaXZhdGUgTWFwPElBcmNoaXZlUmVzb3VyY2UsIEZpbGU+IGJpbmFyeVJlc291cmNlc1RvRGlza0ZpbGVzID0gbmV3IEhhc2hNYXA8SUFyY2hpdmVSZXNvdXJjZSwgRmlsZT4oKTsKLQotCXB1YmxpYyBFQVJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCX0KLQotCXB1YmxpYyBMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCWFnZ3JlZ2F0ZVNvdXJjZUZpbGVzKCk7Ci0JCWFkZE1vZHVsZXNBbmRVdGlsaXRpZXMoKTsKLQkJTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBmaWxlcyA9IGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JCUlQYXRoIG1hbmlmZXN0UGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJaWYgKCFmaWxlc0hvbGRlci5jb250YWlucyhtYW5pZmVzdFBhdGgpKSB7Ci0JCQlJQXJjaGl2ZVJlc291cmNlIG1hbmlmZXN0ID0gY3JlYXRlTWFuaWZlc3QobWFuaWZlc3RQYXRoKTsKLQkJCWZpbGVzLmFkZChtYW5pZmVzdCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoYmluYXJ5UmVzb3VyY2VzVG9EaXNrRmlsZXMuY29udGFpbnNLZXkoYXJjaGl2ZVJlc291cmNlKSkgewotCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYmluYXJ5UmVzb3VyY2VzVG9EaXNrRmlsZXMuZ2V0KGFyY2hpdmVSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShkaXNrRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldElucHV0U3RyZWFtKGFyY2hpdmVSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTW9kdWxlc0FuZFV0aWxpdGllcygpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBjb21wb25lbnRzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyh2Q29tcG9uZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb21wb25lbnRzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkJCXRyeSB7Ci0JCQkJSUFyY2hpdmUgbmVzdGVkTW9kdWxlQXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJU3RyaW5nIHNQYXRoID0gcmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJU3RyaW5nIHNydHAgPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpOwotCQkJCWlmIChzcnRwLnN0YXJ0c1dpdGgoIiIgKyBJUGF0aC5TRVBBUkFUT1IpKSBzcnRwID0gc3J0cC5zdWJzdHJpbmcoMSk7Ci0JCQkJU3RyaW5nIHNwdCA9IHNydHAgKyBJUGF0aC5TRVBBUkFUT1IgKyBzUGF0aDsKLQkJCQlpZiAoc3B0LnN0YXJ0c1dpdGgoIiIgKyBJUGF0aC5TRVBBUkFUT1IpKSBzcHQgPSBzcHQuc3Vic3RyaW5nKDEpOwotCQkJCW5lc3RlZE1vZHVsZUFyY2hpdmUuc2V0UGF0aChuZXcgUGF0aChzcHQpKTsKLQkJCQluZXN0ZWRNb2R1bGVBcmNoaXZlLnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShuZXN0ZWRNb2R1bGVBcmNoaXZlKTsKLQotCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gbnVsbDsKLQkJCQkJZGlza0ZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQkJaWYgKCFkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQkJSUZpbGUgd2JGaWxlID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQliaW5hcnlSZXNvdXJjZXNUb0Rpc2tGaWxlcy5wdXQobmVzdGVkTW9kdWxlQXJjaGl2ZSwgZGlza0ZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEJ1ZyAyMjA5MTIgLSBzZXQgImV4cG9ydCBzb3VyY2UiIGZsYWcgYmVmb3JlIGNhbGxpbmcgSmF2YUVFUXVpY2tQZWVrCi0JCQkJCWlmIChuZXN0ZWRNb2R1bGVBcmNoaXZlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZS5BUkNISVZFX1RZUEUpIHsKLQkJCQkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbmVzdGVkTG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcikoKElBcmNoaXZlKW5lc3RlZE1vZHVsZUFyY2hpdmUpLmdldExvYWRBZGFwdGVyKCk7Ci0JCQkJCQlpZihuZXN0ZWRMb2FkQWRhcHRlciBpbnN0YW5jZW9mIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcil7Ci0JCQkJCQkJKChDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpbmVzdGVkTG9hZEFkYXB0ZXIpLnNldEV4cG9ydFNvdXJjZShpc0V4cG9ydFNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKG5lc3RlZE1vZHVsZUFyY2hpdmUpOwotCQkJCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEU6Ci0JCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgotCQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKLQkJCQkJCSgoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSBuZXN0ZWRNb2R1bGVBcmNoaXZlLmdldExvYWRBZGFwdGVyKCkpLnNldEluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCS8vIHJldHJpZXZlIGFsbCBKYXZhIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzCi0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyAmJiByZWZlcmVuY2VkQ29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gY3BSZWZzW2pdOwotCQkJCS8vIG9ubHkgLi4vIHJ1bnRpbWUgcGF0aHMgY29udHJpYnV0ZSB0byB0aGUgRUFSCi0JCQkJaWYgKHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgewotCQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCUZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQkJaWYgKCFjcEVudHJ5RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWZpbmFsIElGaWxlIHdiRmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCQljcEVudHJ5RmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRFeHRlcm5hbEZpbGUobmV3IFBhdGgocmVmLmdldEFyY2hpdmVOYW1lKCkpLCBjcEVudHJ5RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoIGdldERlZmF1bHRNb2RlbE9iamVjdFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FQVJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTVmZjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgewotCi0JcHVibGljIEVBUkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIoY29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVUeXBlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUFSQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjgxNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUFSQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRBcmNoaXZlVHlwZUhhbmRsZXIgaW1wbGVtZW50cyBJQXJjaGl2ZUhhbmRsZXIgewotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0FyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQlpZiAoYXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpIGluc3RhbmNlb2YgRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJLy8gVE9ETyBoYW5kbGUgdGhlIG5vIEREIGNhc2UKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUpCQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FSkJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlZjE3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FSkJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgRUpCQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQlwdWJsaWMgRUpCQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJdGhpcyh2Q29tcG9uZW50LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRUpCQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXREZWZhdWx0TW9kZWxPYmplY3RQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FSkJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA0YmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFSkJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQotCXB1YmxpYyBFSkJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FSkJDb21wb25lbnRBcmNoaXZlVHlwZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkwZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRUpCQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyIGltcGxlbWVudHMgSUFyY2hpdmVIYW5kbGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKGFyY2hpdmUuZ2V0TG9hZEFkYXB0ZXIoKSBpbnN0YW5jZW9mIEVKQkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIGhhbmRsZSB0aGUgbm8gREQgY2FzZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Y2Q1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyewotCi0JcHVibGljIEoyRUVDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXN1cGVyKGNvbXBvbmVudCk7Ci0JfQotCQotCXB1YmxpYyBKMkVFQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQlzdXBlcihjb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgPElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCXN1cGVyLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCQlhZGRNYXBwZWRDbGFzc0ZvbGRlcnMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09NUE9ORU5UX1BBVEgpOwkJCi0JCX0KLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIxMmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0oyRUVDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGV4dGVuZHMgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIElNUE9SVEVEX0NMQVNTRVMgPSAiSW1wb3J0ZWRDbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEoyRUVDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGludCBTVVBFUl9USUNLUyA9IDEwMDA7Ci0JCWZpbmFsIGludCBMT0NBTF9USUNLUyA9IDEwOwotCQlmaW5hbCBpbnQgUkVGUkVTSF9USUNLUyA9IDEwMDsKLQkJZmluYWwgaW50IFRPVEFMX1RJQ0tTID0gU1VQRVJfVElDS1MgKyBMT0NBTF9USUNLUyArIFJFRlJFU0hfVElDS1M7Ci0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJJbXBvcnRpbmcgIiArIHZDb21wb25lbnQuZ2V0TmFtZSgpLCBUT1RBTF9USUNLUyk7Ci0JCQlzdXBlci5zYXZlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgU1VQRVJfVElDS1MpKTsKLQkJCWxpbmtJbXBvcnRlZENsYXNzZXNGb2xkZXJJZk5lY2Vzc2FyeSgpOwotCQkJbW9uaXRvci53b3JrZWQoTE9DQUxfVElDS1MpOwotCQkJdHJ5IHsKLQkJCQl2Q29tcG9uZW50LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIFJFRlJFU0hfVElDS1MpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmRzV2l0aENsYXNzVHlwZShTdHJpbmcgYUZpbGVOYW1lKSB7Ci0KLQkJaWYgKGFGaWxlTmFtZSAhPSBudWxsICYmIGFGaWxlTmFtZS5lbmRzV2l0aChET1RfQ0xBU1MpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKLQkJaWYgKGVuZHNXaXRoQ2xhc3NUeXBlKGFGaWxlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSkgewotCQkJYm9vbGVhbiBzaG91bGRTYXZlID0gaXNDbGFzc1dpdGhvdXRTb3VyY2UoYUZpbGUpOwotCQkJaWYgKHNob3VsZFNhdmUgJiYgIWltcG9ydGVkQ2xhc3Nlc0ZvbGRlckNyZWF0ZWQpIHsKLQkJCQljcmVhdGVJbXBvcnRlZENsYXNzZXNGb2xkZXIoKTsKLQkJCX0KLQkJCXJldHVybiBzaG91bGRTYXZlOwotCQl9Ci0JCXJldHVybiBzdXBlci5zaG91bGRTYXZlKGFGaWxlKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkgKiBJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7IElWaXJ0dWFsRmlsZQotCSAqIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7IElGaWxlCi0JICogaUZpbGUgPSB2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOyB2YWxpZGF0ZUVkaXQoaUZpbGUpOyBPdXRwdXRTdHJlYW0gb3V0ID0KLQkgKiBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGlGaWxlKTsgdHJ5IHsgYU1hbmlmZXN0LndyaXRlKG91dCk7IH0KLQkgKiBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7IH0gZmluYWxseSB7IHRyeSB7Ci0JICogb3V0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOyB9IH0gfQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydGVkQ2xhc3Nlc0ZvbGRlckNyZWF0ZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBJRm9sZGVyIGltcG9ydGVkQ2xhc3Nlc0ZvbGRlcjsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydGVkQ2xhc3Nlc0ZvbGRlcigpIHsKLQkJaW1wb3J0ZWRDbGFzc2VzRm9sZGVyQ3JlYXRlZCA9IHRydWU7Ci0JCUlDb250YWluZXIgamFyUGFyZW50ID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldFBhcmVudCgpOwotCQlpbXBvcnRlZENsYXNzZXNGb2xkZXIgPSBqYXJQYXJlbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKElNUE9SVEVEX0NMQVNTRVMpKTsKLQkJdHJ5IHsKLQkJCWltcG9ydGVkQ2xhc3Nlc0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaW5rSW1wb3J0ZWRDbGFzc2VzRm9sZGVySWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChpbXBvcnRlZENsYXNzZXNGb2xkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoZ2V0SW1wb3J0ZWRDbGFzc2VzUnVudGltZVBhdGgoKSkuY3JlYXRlTGluayhpbXBvcnRlZENsYXNzZXNGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCAwLCBudWxsKTsKLQkJCQlpZiAoc2hvdWxkQWRkSW1wb3J0ZWRDbGFzc2VzVG9DbGFzc3BhdGgoKSkgewotCQkJCQlpZiAoSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdCh2Q29tcG9uZW50LmdldFByb2plY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGphdmFDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0phdmFDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2phdmFDbGFzc3BhdGgubGVuZ3RoICsgMV07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGphdmFDbGFzc3BhdGgsIDAsIG5ld0phdmFDbGFzc3BhdGgsIDAsIGphdmFDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCQkJCW5ld0phdmFDbGFzc3BhdGhbbmV3SmF2YUNsYXNzcGF0aC5sZW5ndGggLSAxXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShpbXBvcnRlZENsYXNzZXNGb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3SmF2YUNsYXNzcGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBZGRJbXBvcnRlZENsYXNzZXNUb0NsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldEltcG9ydGVkQ2xhc3Nlc1J1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoIi8iKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgewotCQlpZiAoZW5kc1dpdGhDbGFzc1R5cGUoYUZpbGUuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpKSB7Ci0JCQlyZXR1cm4gaW1wb3J0ZWRDbGFzc2VzRm9sZGVyLmdldEZpbGUoZ2V0SW1wb3J0ZWRDbGFzc2VzVVJJKGFGaWxlKSkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKGFGaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQYXRoIGdldEltcG9ydGVkQ2xhc3Nlc1VSSShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB7Ci0JCXJldHVybiBhRmlsZS5nZXRQYXRoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGFzc1dpdGhvdXRTb3VyY2UoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgewotCQlTdHJpbmcgamF2YVVyaSA9IGNsYXNzVXJpVG9KYXZhVXJpKGFGaWxlLmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKGphdmFVcmkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICFhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKGphdmFVcmkpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNsYXNzVXJpVG9KYXZhVXJpKFN0cmluZyBjbGFzc1VyaSkgewotCQlpZiAoY2xhc3NVcmkgPT0gbnVsbCB8fCAhY2xhc3NVcmkuZW5kc1dpdGgoRE9UX0NMQVNTKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0cnVuY2F0ZWQgPSB0cnVuY2F0ZUlnbm9yZUNhc2UoY2xhc3NVcmksIERPVF9DTEFTUyk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRydW5jYXRlZCwgIiQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdG9rLm5leHRUb2tlbigpLmNvbmNhdChET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3Vic3RyaW5nIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIHVwIHRvIHRoZSBsYXN0IGluZGV4IG9mIHRoZQotCSAqIHNlY29uZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlSWdub3JlQ2FzZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHRyYWlsaW5nU3ViU3RyaW5nKSB7Ci0JCWludCBpbmRleCA9IGFTdHJpbmcudG9Mb3dlckNhc2UoKS5sYXN0SW5kZXhPZih0cmFpbGluZ1N1YlN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIGFTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIGFTdHJpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUphdmFDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNDU0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBleHRlbmRzIEoyRUVDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgewotCi0JcHVibGljIEoyRUVKYXZhQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWViMDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciBleHRlbmRzIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQlwdWJsaWMgSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXN1cGVyKHZDb21wb25lbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50LCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgPElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCXN1cGVyLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCQlhZGRNYXBwZWRDbGFzc0ZvbGRlcnMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09NUE9ORU5UX1BBVEgpOwkJCi0JCX0KLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVkODczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBleHRlbmRzIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciB7Ci0KLQlwdWJsaWMgSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXN1cGVyKHZDb21wb25lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYzOWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFFRUFyY2hpdmVVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLlppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMgZXh0ZW5kcyBBcmNoaXZlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJQXJjaGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogRGVmYXVsdCB2YWx1ZSA9IEJvb2xlYW4uVFJVRSBWYWxpZCB2YWx1ZXMgPSBCb29sZWFuLlRSVUUgb3IgQm9vbGVhbi5GQUxTRQotCSAqIAotCSAqIEFuIEFyY2hpdmVPcHRpb24gdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIKLQkgKiB7QGxpbmsgI29wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zKX0gc2hvdWxkIGF0dGVtcHQgdG8gZGlzY3JpbWluYXRlCi0JICogYmV0d2VlbiBkaWZmZXJlbnQgSmF2YSBFRSBhcmNoaXZlIHR5cGVzLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIGFsd2F5cyBkaXNjcmltaW5hdGUgZnVsbHkgZm9yIGFsbCB0eXBlcyBleGNlcHQgRUpCIDMuMCBhcmNoaXZlcwotCSAqIHtAbGluayAjRElTQ1JJTUlOQVRFX0VKQl9BTk5PVEFUSU9OU30uIEluIG9yZGVyIHRvIGZ1bGx5IGRpc2NyaW1pbmF0ZQotCSAqIEVKQiAzLjAgYXJjaGl2ZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYm90aCB0aGlzIGZsYWcgYW5kCi0JICoge0BsaW5rICNESVNDUklNSU5BVEVfRUpCX0FOTk9UQVRJT05TfSB0byB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFURV9KQVZBX0VFID0gIkRJU0NSSU1JTkFURV9FSkIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IHZhbHVlID0gQm9vbGVhbi5UUlVFIFZhbGlkIHZhbHVlcyA9IEJvb2xlYW4uVFJVRSBvciBCb29sZWFuLkZBTFNFCi0JICogCi0JICogQW4gQXJjaGl2ZU9wdGlvbiB1c2VkIHRvIHNwZWNpZnkgd2hldGhlcgotCSAqIHtAbGluayAjb3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMpfSBzaG91bGQgYXR0ZW1wdCB0byBmdWxseSBkaXNjcmltaW5hdGUKLQkgKiBhIEpBUiBmaWxlIGZyb20gYW4gRUpCIEpBUiBmaWxlLiBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IGlmIHRoZQotCSAqIHtAbGluayAjRElTQ1JJTUlOQVRFX0pBVkFfRUV9IG9wdGlvbiBpcyBhbHNvIHNldCB0byBCb29sZWFuLlRSVUUuIElmIGJvdGgKLQkgKiBvcHRpb25zIGFyZSBzZXQgdG8gdHJ1ZSB0aGVuIGFzIGEgbGFzdCByZXNvcnQgYWxsIC5jbGFzcyBmaWxlcyBieXRlIGNvZGVzCi0JICogd2lsbCBiZSBhbmFseXplZCBmb3IgRUpCIGFubm90YXRpb25zIGluIG9yZGVyIHRvIGRpc2NyaW1pbmF0ZSB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBJQXJjaGl2ZSBpcyBhbiBFSkIgMy4wIGphci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVEVfRUpCX0FOTk9UQVRJT05TID0gIkRJU0NSSU1JTkFURV9FSkJfQU5OT1RBVElPTlMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IHZhbHVlID0gbnVsbAotCSAqIAotCSAqIEFuIEFyY2hpdmVPcHRpb24gdXNlZCB0byBzcGVjaWZ5IHRoZSBvcmlnaW5hbCBsb2FkIGFkYXB0ZXIgaW4gdGhlIGNhc2UgaXQKLQkgKiBzd2FwcGVkIG91dCB3aXRoIGFuIHtAbGluayAjSmF2YUVFV3JhcHBpbmdMb2FkQWRhcHRlcn0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFRF9MT0FEX0FEQVBURVIgPSAiV1JBUFBFRF9MT0FEX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzIElOU1RBTkNFID0gbmV3IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVZBID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmEoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihpRmlsZSwgRE9UX0pBVkEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzKElGaWxlIGlGaWxlKSB7Ci0JCXJldHVybiBoYXNFeHRlbnNpb24oaUZpbGUsIERPVF9DTEFTUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0V4dGVuc2lvbihJRmlsZSBpRmlsZSwgU3RyaW5nIGV4dCkgewotCQlTdHJpbmcgbmFtZSA9IGlGaWxlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihuYW1lLCBleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBleHQpIHsKLQkJaW50IG9mZnNldCA9IGV4dC5sZW5ndGgoKTsKLQkJcmV0dXJuIG5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCBuYW1lLmxlbmd0aCgpIC0gb2Zmc2V0LCBleHQsIDAsIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIElBcmNoaXZlIG9wZW5BcmNoaXZlKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHRocm93cyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAodmlydHVhbENvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQlKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXBvbmVudCA9IChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHZpcnR1YWxDb21wb25lbnQ7Ci0JCQlKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlciBsb2FkQWRhcHRlciA9IG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcihhcmNoaXZlQ29tcG9uZW50KTsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSLCBsb2FkQWRhcHRlcik7Ci0JCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuQVJDSElWRV9QQVRILCBsb2FkQWRhcHRlci5nZXRBcmNoaXZlUGF0aCgpKTsKLQkJCUlBcmNoaXZlIHBhcmVudEVBUkFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZihhcmNoaXZlQ29tcG9uZW50LmlzTGlua2VkVG9FQVIoKSl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gdmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJCQlpZihlYXJQcm9qZWN0ICE9IG51bGwgJiYgRWFyVXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSl7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQodmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCWlmKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCXBhcmVudEVBUkFyY2hpdmUgPSBvcGVuQXJjaGl2ZShlYXJDb21wb25lbnQpOwotCQkJCQkJCQlpZihwYXJlbnRFQVJBcmNoaXZlICE9IG51bGwpIHsKLQkJCQkJCQkJCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5QQVJFTlRfQVJDSElWRSwgcGFyZW50RUFSQXJjaGl2ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2goQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBvcGVuQXJjaGl2ZShhcmNoaXZlT3B0aW9ucyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKHBhcmVudEVBUkFyY2hpdmUgIT0gbnVsbCl7Ci0JCQkJCWFyY2hpdmVPcHRpb25zLnJlbW92ZU9wdGlvbihBcmNoaXZlT3B0aW9ucy5QQVJFTlRfQVJDSElWRSk7Ci0JCQkJCWNsb3NlQXJjaGl2ZShwYXJlbnRFQVJBcmNoaXZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOOwotCQlJQXJjaGl2ZUxvYWRBZGFwdGVyIGFyY2hpdmVMb2FkQWRhcHRlciA9IG51bGw7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QodmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlhcmNoaXZlTG9hZEFkYXB0ZXIgPSBuZXcgRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCQkJdHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEU7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQodmlydHVhbENvbXBvbmVudCkpIHsKLQkJCWFyY2hpdmVMb2FkQWRhcHRlciA9IG5ldyBFSkJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7Ci0JCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEU7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudCh2aXJ0dWFsQ29tcG9uZW50KSkgewotCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IEFwcENsaWVudENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudCh2aXJ0dWFsQ29tcG9uZW50KSkgewotCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQodmlydHVhbENvbXBvbmVudCkpIHsKLQkJCWFyY2hpdmVMb2FkQWRhcHRlciA9IG5ldyBXZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7Ci0JCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdCh2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCWFyY2hpdmVMb2FkQWRhcHRlciA9IG5ldyBKYXZhQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCQl9Ci0KLQkJaWYgKGFyY2hpdmVMb2FkQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIsIGFyY2hpdmVMb2FkQWRhcHRlcik7Ci0JCQlJQXJjaGl2ZSBhcmNoaXZlID0gc3VwZXIub3BlbkFyY2hpdmUob3B0aW9ucyk7Ci0JCQlpZiAodHlwZSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSB7Ci0JCQkJaW50IHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOOwotCQkJCVN0cmluZyB2ZXJzaW9uU3RyID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFRERQcm9qZWN0VmVyc2lvbih2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJaWYodmVyc2lvblN0ciA9PSBudWxsKXsKLQkJCQkJdmVyc2lvblN0ciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbih2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFOgotCQkJCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFOgotCQkJCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNl9URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRToKLQkJCQkJaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8xX1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMF9URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzFfVEVYVCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMV9URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzFfSUQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRToKLQkJCQkJaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzRfVEVYVCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKLQkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh2ZXJzaW9uICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pIHsKLQkJCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChhcmNoaXZlLCBuZXcgSmF2YUVFUXVpY2tQZWVrKHR5cGUsIHZlcnNpb24pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcDxJQXJjaGl2ZSwgSmF2YUVFUXVpY2tQZWVrPiBhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsgPSBuZXcgV2Vha0hhc2hNYXA8SUFyY2hpdmUsIEphdmFFRVF1aWNrUGVlaz4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSB1dGlsaXR5IGZvciBnZXR0aW5nIHRoZSB0eXBlIG9mIEphdmEgRUUgYXJjaGl2ZSwgdGhlIEphdmEgRUUKLQkgKiB2ZXJzaW9uLCBhbmQgdGhlIE1vZHVsZSB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEphdmFFRVF1aWNrUGVlayBnZXRKYXZhRUVRdWlja1BlZWsoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQlpZiAoYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmNvbnRhaW5zS2V5KGFyY2hpdmUpKSB7Ci0JCQlyZXR1cm4gYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmdldChhcmNoaXZlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1tdIGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW10geyBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSwgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkksCi0JCQkJCUoyRUVDb25zdGFudHMuUkFSX0REX1VSSSB9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoID0gbmV3IFBhdGgoZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tpXSk7Ci0JCQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCUlBcmNoaXZlUmVzb3VyY2UgZGQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZCA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlKGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCk7Ci0JCQkJCQlpbiA9IGRkLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7Ci0JCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KGFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQlyZXR1cm4gcXVpY2tQZWVrOwotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKG51bGwpOwotCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChhcmNoaXZlLCBxdWlja1BlZWspOwotCQkJcmV0dXJuIHF1aWNrUGVlazsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUFyY2hpdmUuIFRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0byBkaXNjcmltaW5hdGUgdGhlCi0JICogc3BlY2lmaWMgSmF2YSBFRSBhcmNoaXZlIHR5cGUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzaW1wbGUgcnVsZXMuIFBsZWFzZQotCSAqIG5vdGUgdGhhdCB0aGVzZSBydWxlcyBkbyBub3QgYWRoZXJlIGV4YWN0bHkgdG8gdGhlIEphdmEgRUUgc3BlY2lmaWNhdGlvbgotCSAqIGJlY2F1c2UgdGhleSBhcmUgd3JpdHRlbiBmb3IgYSB0b29saW5nIGVudmlyb25tZW50IHJhdGhlciB0aGFuIGEgcnVudGltZQotCSAqIGVudmlyb25tZW50LiBUaHVzIHRoZXNlIHJ1bGVzIGF0dGVtcHQgdG8gY29tcGVuc2F0ZSBmb3IgdXNlciBlcnJvciB3aXRoCi0JICogdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBvdGhlciBhcmVhcyBvZiB0aGUgdG9vbGluZyBlbnZpcm9ubWVudCB3aWxsIGhlbHAKLQkgKiBkZXRlY3QgYW5kIGNvcnJlY3QgdGhlc2UgZXJyb3JzLgotCSAqIAotCSAqIDxvbD4KLQkgKiA8bGk+IEFuIGFyY2hpdmUgY29udGFpbmluZyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBjb25zaWRlcmVkIHRvIGJlIG9mCi0JICogdGhhdCB0eXBlIDwvbGk+Ci0JICogPGxpPiBBbiBhcmNoaXZlIHdob3NlIG5hbWUgZW5kcyB3aXRoICcuZWFyJyBpcyBjb25zaWRlcmVkIGFuIEVBUiA8L2xpPgotCSAqIDxsaT4gQW4gYXJjaGl2ZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCAnLndhcicgaXMgY29uc2lkZXJlZCBhIFdBUiA8L2xpPgotCSAqIDxsaT4gQW4gYXJjaGl2ZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCAnLmphcicgYW5kIHdoaWNoIGNvbnRhaW5zIGEKLQkgKiBNRVRBLUlORi9NQU5JRkVTVC5NRiBmaWxlIGNvbnRhaW5pbmcgYSBNYWluLWNsYXNzIGF0dHJpYnV0ZSBpcyBjb25zaWRlcmVkCi0JICogYW4gQXBwbGljYXRpb24gQ2xpZW50IDwvbGk+Ci0JICogPGxpPiBJZiB0aGUgQXJjaGl2ZU9wdGlvbnMgc3BlY2lmeSB0aGUKLQkgKiB7QGxpbmsgI0RJU0NSSU1JTkFURV9FSkJfQU5OT1RBVElPTlN9IGFzIEJvb2xlYW4uVFJVRSB0aGVuIGlmIHRoZSBhcmNoaXZlCi0JICogY29udGFpbnMgYW55IC5jbGFzcyBmaWxlIHdpdGggRUpCIGFubm90YXRpb25zIGl0IGlzIGNvbnNpZGVyZWQgYW4gRUpCCi0JICogSkFSLiBCZSB3YXJuZWQgdGhhdCB0aGlzIGZ1bGwgY2hlY2sgZG9lcyBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucwotCSAqIGFuZCBpcyBub3QgZG9uZSBieSBkZWZhdWx0LjwvbGk+Ci0JICogQW4gYXJjaGl2ZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCAnLmphcicgaXMgY29uc2lkZXJlZCBhIFV0aWxpdHkgPC9saT4KLQkgKiA8L29sPgotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUlBcmNoaXZlIHNpbXBsZUFyY2hpdmUgPSBzdXBlci5vcGVuQXJjaGl2ZShhcmNoaXZlT3B0aW9ucyk7Ci0JCU9iamVjdCBkaXNjcmltaW5hdGVKYXZhRUUgPSBhcmNoaXZlT3B0aW9ucy5nZXRPcHRpb24oRElTQ1JJTUlOQVRFX0pBVkFfRUUpOwotCQlpZiAoZGlzY3JpbWluYXRlSmF2YUVFICE9IG51bGwgJiYgISgoQm9vbGVhbikgZGlzY3JpbWluYXRlSmF2YUVFKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7Ci0JCX0KLQkJcmV0dXJuIHJlZmluZUZvckphdmFFRShzaW1wbGVBcmNoaXZlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0VBUiA9ICIuZWFyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElBcmNoaXZlIHJlZmluZUZvckphdmFFRShmaW5hbCBJQXJjaGl2ZSBzaW1wbGVBcmNoaXZlKSB7Ci0JCS8vQ2hlY2sgdG8gc2VlIGlmIHRoaXMgYXJjaGl2ZSBpcyBhY3R1YWxseSBiZWluZyBvcGVuZWQgYXMgYSBuZXN0ZWQgYXJjaGl2ZSBmcm9tIHdpdGhpbiBhbiBFQVIKLQkJLy9pZiBpdCBpcyB0aGVuIHRoZSBFQVIncyBERCBuZWVkcyB0byBiZSBjaGVja2VkIHRvIHNlZSBleGFjdGx5IHdoYXQgdHlwZSBvZiBhcmNoaXZlIHRoaXMgaXMuCi0JCWlmIChzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuaGFzT3B0aW9uKEFyY2hpdmVPcHRpb25zLlBBUkVOVF9BUkNISVZFKSkgewotCQkJSUFyY2hpdmUgcGFyZW50ID0gKElBcmNoaXZlKSBzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLlBBUkVOVF9BUkNISVZFKTsKLQkJCUphdmFFRVF1aWNrUGVlayBxcCA9IGdldEphdmFFRVF1aWNrUGVlayhwYXJlbnQpOwotCi0JCQlpZiAocXAuZ2V0VHlwZSgpID09IEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFKSB7Ci0JCQkJSVBhdGggZGRQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwotCQkJCWlmIChwYXJlbnQuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGRQYXRoKSkgewotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IGRkT2JqID0gcGFyZW50LmdldE1vZGVsT2JqZWN0KGRkUGF0aCk7Ci0JCQkJCQlJUGF0aCBhcmNoaXZlUGF0aCA9IHNpbXBsZUFyY2hpdmUuZ2V0UGF0aCgpOwotCQkJCQkJaWYgKGFyY2hpdmVQYXRoID09IG51bGwpIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gc2ltcGxlQXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5BUkNISVZFX1BBVEgpOwotCQkJCQkJCWlmIChudWxsICE9IG9iaikgewotCQkJCQkJCQlhcmNoaXZlUGF0aCA9IChJUGF0aCkgb2JqOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWludCBkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV047Ci0JCQkJCQlpZiAocXAuZ2V0VmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKSB7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiBhcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbikgZGRPYmo7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgbW9kdWxlID0gYXBwLmdldEZpcnN0TW9kdWxlKGFyY2hpdmVQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQkJCS8vaWYgdGhlIGFyY2hpdmUgaXNuJ3QgZm91bmQsIGRvIGEgc21hcnQgc2VhcmNoIGZvciBpdAotCQkJCQkJCWlmKG1vZHVsZSA9PSBudWxsKXsKLQkJCQkJCQkJSVBhdGggbm9EZXZpY2VQYXRoID0gYXJjaGl2ZVBhdGguc2V0RGV2aWNlKG51bGwpOwotCQkJCQkJCQlmb3IoaW50IGk9MTsgaTxub0RldmljZVBhdGguc2VnbWVudENvdW50KCkgJiYgbW9kdWxlID09IG51bGw7IGkrKyl7Ci0JCQkJCQkJCQlTdHJpbmcgc3RyaW5nUGF0aCA9IG5vRGV2aWNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQltb2R1bGUgPSBhcHAuZ2V0Rmlyc3RNb2R1bGUoc3RyaW5nUGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG51bGwgIT0gbW9kdWxlKSB7Ci0JCQkJCQkJCWlmIChtb2R1bGUuZ2V0RWpiKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRTsKLQkJCQkJCQkJfSBlbHNlIGlmIChtb2R1bGUuZ2V0Q29ubmVjdG9yKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRTsKLQkJCQkJCQkJfSBlbHNlIGlmIChtb2R1bGUuZ2V0SmF2YSgpICE9IG51bGwpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7Ci0JCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlLmdldFdlYigpICE9IG51bGwpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgeyAvL0oyRUUgMS40IG9yIGJlbG93LCByZWx5IHNvbGVseSBvbiBERAotCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcCA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbikgZGRPYmo7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIG1vZHVsZSA9IGFwcC5nZXRGaXJzdE1vZHVsZShhcmNoaXZlUGF0aC50b1N0cmluZygpKTsKLQkJCQkJCQkvL2lmIHRoZSBhcmNoaXZlIGlzbid0IGZvdW5kLCBkbyBhIHNtYXJ0IHNlYXJjaCBmb3IgaXQKLQkJCQkJCQlpZihtb2R1bGUgPT0gbnVsbCl7Ci0JCQkJCQkJCUlQYXRoIG5vRGV2aWNlUGF0aCA9IGFyY2hpdmVQYXRoLnNldERldmljZShudWxsKTsKLQkJCQkJCQkJZm9yKGludCBpPTE7IGk8bm9EZXZpY2VQYXRoLnNlZ21lbnRDb3VudCgpICYmIG1vZHVsZSA9PSBudWxsOyBpKyspewotCQkJCQkJCQkJU3RyaW5nIHN0cmluZ1BhdGggPSBub0RldmljZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhpKS50b1N0cmluZygpOwotCQkJCQkJCQkJbW9kdWxlID0gYXBwLmdldEZpcnN0TW9kdWxlKHN0cmluZ1BhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChudWxsICE9IG1vZHVsZSkgewotCQkJCQkJCQlpZiAobW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEU7Ci0JCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzQ29ubmVjdG9yTW9kdWxlKCkpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU7Ci0JCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzSmF2YU1vZHVsZSgpKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOwotCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl9UWVBFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsgLy9KMkVFIDEuNCBvciBiZWxvdywgYW5kIG5vdCBpbiBERCwgdHJlYXQgYXMgdXRpbGl0eQotCQkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhudWxsKTsKLQkJCQkJCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChzaW1wbGVBcmNoaXZlLCBxdWlja1BlZWspOwotCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVmaW5lZFR5cGUgIT0gSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikgewotCQkJCQkJCVN0cmluZyBkZFRvQ2hlY2sgPSBudWxsOwotCQkJCQkJCXN3aXRjaCAoZGVmaW5lZFR5cGUpIHsKLQkJCQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFOgotCQkJCQkJCQlkZFRvQ2hlY2sgPSBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU6Ci0JCQkJCQkJCWRkVG9DaGVjayA9IEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQkJCQkJZGRUb0NoZWNrID0gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRToKLQkJCQkJCQkJZGRUb0NoZWNrID0gSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJSUFyY2hpdmUgd3JhcHBlZEZvckREID0gd3JhcEZvckREKHNpbXBsZUFyY2hpdmUsIGRlZmluZWRUeXBlLCBuZXcgUGF0aChkZFRvQ2hlY2spKTsKLQkJCQkJCQlpZiAod3JhcHBlZEZvckREICE9IG51bGwpIHsKLQkJCQkJCQkJcmV0dXJuIHdyYXBwZWRGb3JERDsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gZWxzZSB0aGVyZSBpcyBubyBERCBhbmQgd2UgbmVlZCB0byBkZWNpZGUgb24gYQotCQkJCQkJCS8vIHZlcnNpb24gKGxldHRpbmcgUkFScyBmYWxsIHRocm91Z2gpCi0JCQkJCQkJc3dpdGNoIChkZWZpbmVkVHlwZSkgewotCQkJCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEU6IHsKLQkJCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuRUpCXzNfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQkJCXdyYXBBcmNoaXZlKHNpbXBsZUFyY2hpdmUsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSkpOwotCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRTogewotCQkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7Ci0JCQkJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCQkJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKLQkJCQkJCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7Ci0JCQkJCQkJfQotCQkJCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU6IHsKLQkJCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuV0VCXzJfNV9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQkJCXdyYXBBcmNoaXZlKHNpbXBsZUFyY2hpdmUsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkpOwotCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJU3RyaW5nW10gZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVjayA9IG5ldyBTdHJpbmdbXSB7IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkksIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSwKLQkJCQlKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkgfTsKLQkJaW50W10gdHlwZVRvVmVyaWZ5ID0gbmV3IGludFtdIHsgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwKLQkJCQlKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVjay5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGN1cnJlbnRUeXBlID0gdHlwZVRvVmVyaWZ5W2ldOwotCQkJZmluYWwgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoID0gbmV3IFBhdGgoZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tpXSk7Ci0JCQlJQXJjaGl2ZSB3cmFwcGVkRm9yREQgPSB3cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSwgY3VycmVudFR5cGUsIGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCk7Ci0JCQlpZih3cmFwcGVkRm9yREQgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIHdyYXBwZWRGb3JERDsKLQkJCX0KLQkJfQotCQlJUGF0aCBhcmNoaXZlUGF0aCA9IHNpbXBsZUFyY2hpdmUuZ2V0UGF0aCgpOwotCQlpZiAoYXJjaGl2ZVBhdGggPT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHNpbXBsZUFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuQVJDSElWRV9QQVRIKTsKLQkJCWlmIChudWxsICE9IG9iaikgewotCQkJCWFyY2hpdmVQYXRoID0gKElQYXRoKSBvYmo7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gYXJjaGl2ZVBhdGgubGFzdFNlZ21lbnQoKS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGxhc3RTZWdtZW50LmVuZHNXaXRoKERPVF9FQVIpKSB7Ci0JCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX1RZUEUsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7Ci0JCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChzaW1wbGVBcmNoaXZlLCBxdWlja1BlZWspOwotCQkJCXdyYXBBcmNoaXZlKHNpbXBsZUFyY2hpdmUsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7Ci0JCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7Ci0JCQl9IGVsc2UgaWYgKGxhc3RTZWdtZW50LmVuZHNXaXRoKERPVF9XQVIpKSB7Ci0JCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuV0VCXzJfNV9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKLQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCX0gZWxzZSBpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoRE9UX0pBUikpIHsKLQkJCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQkJaWYgKHNpbXBsZUFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKSkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQXJjaGl2ZVJlc291cmNlIG1hbmlmZXN0UmVzb3VyY2UgPSBzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZShtYW5pZmVzdFBhdGgpOwotCQkJCQkJaW4gPSBtYW5pZmVzdFJlc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbik7Ci0JCQkJCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOwotCQkJCQkJU3RyaW5nIG1haW5DbGFzc05hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJNYWluLUNsYXNzIik7Ci0JCQkJCQlpZiAobWFpbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCQkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwotCQkJCQkJCXJldHVybiBzaW1wbGVBcmNoaXZlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCU9iamVjdCBkaXNjcmltaW5hdGVFSkIzMCA9IHNpbXBsZUFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oRElTQ1JJTUlOQVRFX0VKQl9BTk5PVEFUSU9OUyk7Ci0JCQkJaWYgKG51bGwgPT0gZGlzY3JpbWluYXRlRUpCMzAgfHwgKChCb29sZWFuKSBkaXNjcmltaW5hdGVFSkIzMCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJaWYgKGlzRUpCQXJjaGl2ZShzaW1wbGVBcmNoaXZlKSkgewotCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuRUpCXzNfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChzaW1wbGVBcmNoaXZlLCBxdWlja1BlZWspOwotCQkJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKSk7Ci0JCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7Ci0JfQotCi0JcHJpdmF0ZSBJQXJjaGl2ZSB3cmFwRm9yREQoZmluYWwgSUFyY2hpdmUgc2ltcGxlQXJjaGl2ZSwgZmluYWwgaW50IGN1cnJlbnRUeXBlLCBmaW5hbCBJUGF0aCBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpIHsKLQkJaWYgKHNpbXBsZUFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSkgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJSUFyY2hpdmVSZXNvdXJjZSBkZDsKLQkJCXRyeSB7Ci0JCQkJZGQgPSBzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZShkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpOwotCQkJCWluID0gZGQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7Ci0JCQkJaWYgKHF1aWNrUGVlay5nZXRUeXBlKCkgPT0gY3VycmVudFR5cGUgJiYgcXVpY2tQZWVrLmdldFZlcnNpb24oKSAhPSBKYXZhRUVRdWlja1BlZWsuVU5LTk9XTil7Ci0JCQkJCWlmKGlzQmluYXJ5KHNpbXBsZUFyY2hpdmUpIHx8ICFzaW1wbGVBcmNoaXZlLmNvbnRhaW5zTW9kZWxPYmplY3QoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSl7Ci0JCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpOwotCQkJCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnkoSUFyY2hpdmUgYW5BcmNoaXZlKXsKLQkJSUFyY2hpdmVMb2FkQWRhcHRlciBsb2FkQWRhcHRlciA9IG51bGw7Ci0JCWlmKGFuQXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmhhc09wdGlvbihXUkFQUEVEX0xPQURfQURBUFRFUikpewotCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilhbkFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oV1JBUFBFRF9MT0FEX0FEQVBURVIpOwotCQl9IGVsc2UgewotCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilhbkFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSKTsKLQkJfQotCQlpZihsb2FkQWRhcHRlciBpbnN0YW5jZW9mIEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKXsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYobG9hZEFkYXB0ZXIgaW5zdGFuY2VvZiBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUFyY2hpdmUgZmluZEFyY2hpdmUoT2JqZWN0IG1vZGVsT2JqZWN0KXsKLQkJaWYobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KXsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KW1vZGVsT2JqZWN0OwotCQkJcmV0dXJuIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyLmZpbmRBcmNoaXZlKGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGZpbmRDb21wb25lbnQoSUFyY2hpdmUgYW5BcmNoaXZlKXsKLQkJSUFyY2hpdmVMb2FkQWRhcHRlciBsb2FkQWRhcHRlciA9IG51bGw7Ci0JCWlmKGFuQXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmhhc09wdGlvbihXUkFQUEVEX0xPQURfQURBUFRFUikpewotCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilhbkFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oV1JBUFBFRF9MT0FEX0FEQVBURVIpOwotCQl9IGVsc2UgewotCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilhbkFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSKTsKLQkJfQotCQlpZihsb2FkQWRhcHRlciBpbnN0YW5jZW9mIEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKXsKLQkJCXJldHVybiAoKEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKWxvYWRBZGFwdGVyKS5nZXRBcmNoaXZlQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBKYXZhRUVXcmFwcGluZ0xvYWRBZGFwdGVyIGltcGxlbWVudHMgSUFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQkJcHJpdmF0ZSBJQXJjaGl2ZSBzaW1wbGVBcmNoaXZlOwotCQlwcml2YXRlIElBcmNoaXZlTG9hZEFkYXB0ZXIgc2ltcGxlTG9hZEFkYXB0ZXI7Ci0JCXByaXZhdGUgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoOwotCQlwcml2YXRlIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyIGVtZkhlbHBlcjsKLQotCQlwdWJsaWMgSmF2YUVFV3JhcHBpbmdMb2FkQWRhcHRlcihJQXJjaGl2ZSBzaW1wbGVBcmNoaXZlLCBJUGF0aCBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpIHsKLQkJCXRoaXMuc2ltcGxlQXJjaGl2ZSA9IHNpbXBsZUFyY2hpdmU7Ci0JCQl0aGlzLnNpbXBsZUxvYWRBZGFwdGVyID0gdGhpcy5zaW1wbGVBcmNoaXZlLmdldExvYWRBZGFwdGVyKCk7Ci0JCQl0aGlzLmRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCA9IGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aDsKLQkJCXRoaXMuZW1mSGVscGVyID0gbmV3IEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyKHRoaXMuc2ltcGxlQXJjaGl2ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCXNpbXBsZUxvYWRBZGFwdGVyLmNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJCXJldHVybiBzaW1wbGVMb2FkQWRhcHRlci5jb250YWluc0FyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJCWlmIChzaW1wbGVMb2FkQWRhcHRlci5jb250YWluc0FyY2hpdmVSZXNvdXJjZShtb2RlbE9iamVjdFBhdGgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCA9PSBtb2RlbE9iamVjdFBhdGgpIHsKLQkJCQltb2RlbE9iamVjdFBhdGggPSBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGg7Ci0JCQl9Ci0JCQlyZXR1cm4gZW1mSGVscGVyLmNvbnRhaW5zTW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkJcmV0dXJuIHNpbXBsZUxvYWRBZGFwdGVyLmdldEFyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJCXJldHVybiBzaW1wbGVMb2FkQWRhcHRlci5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSUFyY2hpdmVSZXNvdXJjZSBhcmNoaXZlUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXJldHVybiBzaW1wbGVMb2FkQWRhcHRlci5nZXRJbnB1dFN0cmVhbShhcmNoaXZlUmVzb3VyY2UpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIHsKLQkJCWlmIChzaW1wbGVMb2FkQWRhcHRlci5jb250YWluc01vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCkpIHsKLQkJCQlyZXR1cm4gc2ltcGxlTG9hZEFkYXB0ZXIuZ2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQkJCX0KLQkJCWlmIChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIID09IG1vZGVsT2JqZWN0UGF0aCkgewotCQkJCW1vZGVsT2JqZWN0UGF0aCA9IGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aDsKLQkJCX0KLQkJCXJldHVybiBlbWZIZWxwZXIuZ2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQkJcmV0dXJuIHNpbXBsZUxvYWRBZGFwdGVyLmdldEFyY2hpdmUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQkJc2ltcGxlTG9hZEFkYXB0ZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJjaGl2ZUxvYWRBZGFwdGVyIGdldFdyYXBwZWRMb2FkQWRhdHBlcigpIHsKLQkJCXJldHVybiBzaW1wbGVMb2FkQWRhcHRlcjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gc2ltcGxlTG9hZEFkYXB0ZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JhcEFyY2hpdmUoZmluYWwgSUFyY2hpdmUgc2ltcGxlQXJjaGl2ZSwgZmluYWwgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSB7Ci0JCUlBcmNoaXZlTG9hZEFkYXB0ZXIgd3JhcHBpbmdFTUZMb2FkQWRhcHRlciA9IG5ldyBKYXZhRUVXcmFwcGluZ0xvYWRBZGFwdGVyKHNpbXBsZUFyY2hpdmUsIGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCk7Ci0JCXNpbXBsZUFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSLCB3cmFwcGluZ0VNRkxvYWRBZGFwdGVyKTsKLQkJc2ltcGxlQXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLnNldE9wdGlvbihXUkFQUEVEX0xPQURfQURBUFRFUiwgc2ltcGxlQXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpKTsKLQkJKChBcmNoaXZlSW1wbCkgc2ltcGxlQXJjaGl2ZSkuc2V0TG9hZEFkYXB0ZXIod3JhcHBpbmdFTUZMb2FkQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFJVTlRJTUVfVklTSUJMRSA9ICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU1RBVEVMRVNTID0gIkxqYXZheC9lamIvU3RhdGVsZXNzOyIudG9DaGFyQXJyYXkoKTsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU1RBVEVGVUwgPSAiTGphdmF4L2VqYi9TdGF0ZWZ1bDsiLnRvQ2hhckFycmF5KCk7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE1FU1NBR0VEUklWRU4gPSAiTGphdmF4L2VqYi9NZXNzYWdlRHJpdmVuOyIudG9DaGFyQXJyYXkoKTsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQkvLyBmaXJzdCBjaGVjayBmb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCQlpZiAoYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmNvbnRhaW5zS2V5KGFyY2hpdmUpKSB7Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKTsKLQkJCWlmIChxcC5nZXRUeXBlKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGFyY2hpdmVSZXNvdXJjZXMgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJZm9yIChJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSA6IGFyY2hpdmVSZXNvdXJjZXMpIHsKLQkJCWlmIChhcmNoaXZlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFKSB7Ci0JCQkJaWYgKGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKS5lbmRzV2l0aChET1RfQ0xBU1MpKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGlvU3RyZWFtID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlvU3RyZWFtID0gYXJjaGl2ZVJlc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoaW9TdHJlYW0sIElDbGFzc0ZpbGVSZWFkZXIuQ0xBU1NGSUxFX0FUVFJJQlVURVMpOwotCQkJCQkJLy9jbGFzc0ZpbGVSZWFkZXIgd2lsbCBiZSBudWxsIGlmIHRoaXMgaXMgYW4gaW52YWxpZCBqYXZhIC5jbGFzcyBmaWxlCi0JCQkJCQlpZihjbGFzc0ZpbGVSZWFkZXIgIT0gbnVsbCl7Ci0JCQkJCQkJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJCWZvciAoSUNsYXNzRmlsZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKSB7Ci0JCQkJCQkJCWNoYXJbXSBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQkJCQkJCQkJaWYgKEFycmF5cy5lcXVhbHMoYXR0cmlidXRlTmFtZSwgUlVOVElNRV9WSVNJQkxFKSkgewotCQkJCQkJCQkJSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgYW5ub3RhdGlvbnNBdHRyaWJ1dGUgPSAoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIGF0dHJpYnV0ZTsKLQkJCQkJCQkJCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc0F0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucygpOwotCQkJCQkJCQkJZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLQkJCQkJCQkJCQljaGFyW10gdHlwZWROYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpOwotCQkJCQkJCQkJCWlmIChBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVMRVNTKSB8fCBBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVGVUwpIHx8IEFycmF5cy5lcXVhbHModHlwZWROYW1lLCBNRVNTQUdFRFJJVkVOKSkgewotCQkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKG51bGwgIT0gaW9TdHJlYW0pIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpb1N0cmVhbS5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpb1N0cmVhbSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdChJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCU1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKLQkJSVBhdGggbWFuaWZlc3RQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQlpZiAoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShtYW5pZmVzdFBhdGgpKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUlBcmNoaXZlUmVzb3VyY2UgbWFuaWZlc3RSZXNvdXJjZSA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7Ci0JCQkJaW4gPSBtYW5pZmVzdFJlc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW4pOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkMTI1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JUm9vdE9iamVjdFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBJQXJjaGl2ZSBmaW5kQXJjaGl2ZShFT2JqZWN0IGVPYmplY3QpewotCQlFTGlzdCA8QWRhcHRlcj4gYWRhcHRlcnMgPSBlT2JqZWN0LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCk7Ci0JCWZvcihBZGFwdGVyIGFkYXB0ZXI6YWRhcHRlcnMpewotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEVNRkFkZGFwdGVyKXsKLQkJCQlyZXR1cm4gKChFTUZBZGRhcHRlcikgYWRhcHRlcikuZ2V0SGVscGVyKCkuZ2V0QXJjaGl2ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEVNRkFkZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwcml2YXRlIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyIGhlbHBlcjsKLQkJcHVibGljIEVNRkFkZGFwdGVyKEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyIGhlbHBlcil7Ci0JCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkJfQotCQlwdWJsaWMgSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQkJcmV0dXJuIHRoaXMuaGVscGVyOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgRU1GQWRkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCi0JcHVibGljIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBKYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlcihJQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJc2V0QXJjaGl2ZShhbkFyY2hpdmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXRoaXMuYXJjaGl2ZSA9IGFuQXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJSUFyY2hpdmUgYXJjaGl2ZSA9IGdldEFyY2hpdmUoKTsKLQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobW9kZWxPYmplY3RQYXRoKSkgewotCQkJVVJJIHVyaSA9IGdldEFyY2hpdmVVUklDb252ZXJ0ZXIoKS5nZXRVUkkobW9kZWxPYmplY3RQYXRoKTsKLQkJCXJldHVybiBjb250YWluc1Jlc291cmNlKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zUmVzb3VyY2UoVVJJIHVyaSkgewotCQkvLyBUT0RPIGZpZ3VyZSBvdXQgYSB3YXkgdG8gZmlndXJlIHRoaXMgb3V0IHdpdGhvdXQgYWN0dWFsbHkKLQkJLy8gbG9hZGluZyB0aGUgcmVzb3VyY2UKLQkJSVJvb3RPYmplY3RSZXNvdXJjZSByZXNvdXJjZSA9IChJUm9vdE9iamVjdFJlc291cmNlKSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJvb3RPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVVUklDb252ZXJ0ZXIgYXJjaGl2ZVVSSUNvbnZlcnRlcjsKLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVVUklDb252ZXJ0ZXIoQXJjaGl2ZVVSSUNvbnZlcnRlciBhcmNoaXZlVVJJQ29udmVydGVyKSB7Ci0JCXRoaXMuYXJjaGl2ZVVSSUNvbnZlcnRlciA9IGFyY2hpdmVVUklDb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVVUklDb252ZXJ0ZXIgZ2V0QXJjaGl2ZVVSSUNvbnZlcnRlcigpIHsKLQkJaWYgKGFyY2hpdmVVUklDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJYXJjaGl2ZVVSSUNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVyKGdldEFyY2hpdmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGFyY2hpdmVVUklDb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlVUkkgdXJpID0gZ2V0QXJjaGl2ZVVSSUNvbnZlcnRlcigpLmdldFVSSShyZXNvdXJjZVBhdGgpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlJUm9vdE9iamVjdFJlc291cmNlIHJlc291cmNlID0gKElSb290T2JqZWN0UmVzb3VyY2UpIGdldFJlc291cmNlKG1vZGVsT2JqZWN0UGF0aCk7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlc291cmNlU2V0KCk7Ci0JCQlpZiAobnVsbCA9PSBhZGFwdGVyKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBFTUZBZGRhcHRlcih0aGlzKTsKLQkJCX0KLQkJCXJlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IG5ld1Jlc291cmNlU2V0KSB7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBuZXdSZXNvdXJjZVNldCkgewotCQkJLy8gcmVtb3ZlIGFkYXB0ZXIgZnJvbSBvbGQgcmVzb3VyY2Ugc2V0Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCAmJiBhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQl9Ci0JCQkvLyBhZGQgYXMgYWRhcHRlciB0byBuZXcgcmVzb3VyY2Ugc2V0IGlmIG5lY2Vzc2FyeQotCQkJaWYgKG5ld1Jlc291cmNlU2V0ICE9IG51bGwgJiYgIW5ld1Jlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKGFkYXB0ZXIpKSB7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyID0gbmV3IEVNRkFkZGFwdGVyKHRoaXMpOwotCQkJCX0KLQkJCQluZXdSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldCA9IG5ld1Jlc291cmNlU2V0OwotCQl9IC8vIG5vIG5lZWQgdG8gdXBkYXRlIGlmIG9sZCBzZXQgZXF1YWxzIG5ldyBzZXQgKGJ5IHJlZmVyZW5jZSkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoKSB7Ci0JCVJlc291cmNlU2V0IHJzID0gbmV3IFJlc291cmNlU2V0SW1wbCgpIHsKLQkJCWZpbmFsIFN0cmluZyBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUgPSAiamF2YSI7Ci0JCQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFVSSSB1cmkpIHsKLQkJCQlJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSA9IG51bGw7Ci0JCQkJSW5wdXRTdHJlYW0gaW9TdHJlYW0gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBnZXRBcmNoaXZlVVJJQ29udmVydGVyKCkuZ2V0UGF0aCh1cmkpOwotCQkJCQlhcmNoaXZlUmVzb3VyY2UgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlKHBhdGgpOwotCQkJCQlpb1N0cmVhbSA9IGFyY2hpdmVSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaW9TdHJlYW0sIHBhdGgubGFzdFNlZ21lbnQoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoaW9TdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpb1N0cmVhbS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgQ29udGVudEhhbmRsZXIuVU5TUEVDSUZJRURfQ09OVEVOVF9UWVBFKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCWlmICghaXNKYXZhVVJJKHVyaSkpCi0JCQkJCWRlc2NyaXB0aW9uID0gZ2V0Q29udGVudERlc2NyaXB0aW9uKHVyaSk7Ci0KLQkJCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYgKG51bGwgIT0gZGVzY3JpcHRpb24pIHsKLQkJCQkJU0FYRmFjdG9yeUtleSBrZXkgPSBuZXcgU0FYRmFjdG9yeUtleSh1cmksIGRlc2NyaXB0aW9uKTsKLQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gZ2V0U0FYUmVzb3VyY2VGYWN0b3J5KGtleSk7Ci0JCQkJCWlmIChudWxsID09IHJlc291cmNlRmFjdG9yeSkgewotCQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gKChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSkuZ2V0RmFjdG9yeSh1cmksIGRlc2NyaXB0aW9uKTsKLQkJCQkJCUNsYXNzIGNsYXp6ID0gcmVzb3VyY2VGYWN0b3J5LmdldENsYXNzKCk7Ci0JCQkJCQlib29sZWFuIGlzVHJhbnNsYXRvciA9IGZhbHNlOwotCQkJCQkJd2hpbGUgKCFpc1RyYW5zbGF0b3IgJiYgY2xhenogIT0gbnVsbCkgewotCQkJCQkJCWlmIChjbGF6eiA9PSBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJCQkJCWlzVHJhbnNsYXRvciA9IHRydWU7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGlzVHJhbnNsYXRvcikgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gcmVzb3VyY2VGYWN0b3J5LmdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IoUmVuZGVyZXJGYWN0b3J5LmNsYXNzKTsKLQkJCQkJCQkJRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gKFJlc291cmNlLkZhY3RvcnkpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpOwotCQkJCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOwotCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUFyY2hpdmVVdGlsLndhcm4oZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0U0FYUmVzb3VyY2VGYWN0b3J5KGtleSwgcmVzb3VyY2VGYWN0b3J5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc291cmNlRmFjdG9yeSA9IGdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeSh1cmkpOwotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZSByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhVVJJKFVSSSB1cmkpIHsKLQkJCQlyZXR1cm4gSkFWQV9QUk9UT0NPTF9VUklfU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpOwotCQkJfQotCQl9OwotCQlycy5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JCXJzLnNldFVSSUNvbnZlcnRlcihnZXRBcmNoaXZlVVJJQ29udmVydGVyKCkpOwotCQlzZXRSZXNvdXJjZVNldChycyk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTQVhGYWN0b3J5S2V5IHsKLQkJcHJpdmF0ZSBVUkkgdXJpID0gbnVsbDsKLQotCQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCi0JCXB1YmxpYyBTQVhGYWN0b3J5S2V5KFVSSSB1cmksIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMudXJpID0gdXJpOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYodXJpID09IG51bGwpewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYoZGVzY3JpcHRpb24gPT0gbnVsbCl7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iail7Ci0JCQlpZihvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIFNBWEZhY3RvcnlLZXkpKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlTQVhGYWN0b3J5S2V5IG90aGVyID0gKFNBWEZhY3RvcnlLZXkpb2JqOwotCQkJcmV0dXJuIHVyaS5lcXVhbHMob3RoZXIudXJpKSAmJiBkZXNjcmlwdGlvbi5lcXVhbHMob3RoZXIuZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdXJpLmhhc2hDb2RlKCkgKyBkZXNjcmlwdGlvbi5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFNBWEZhY3RvcnlLZXksIFJlc291cmNlLkZhY3Rvcnk+IGxvY2FsRmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPFNBWEZhY3RvcnlLZXksIFJlc291cmNlLkZhY3Rvcnk+KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZS5GYWN0b3J5IGdldFNBWFJlc291cmNlRmFjdG9yeShTQVhGYWN0b3J5S2V5IGtleSkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2FsRmFjdG9yeU1hcCkgewotCQkJcmV0dXJuIGxvY2FsRmFjdG9yeU1hcC5nZXQoa2V5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0U0FYUmVzb3VyY2VGYWN0b3J5KFNBWEZhY3RvcnlLZXkga2V5LCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2FsRmFjdG9yeU1hcCkgewotCQkJbG9jYWxGYWN0b3J5TWFwLnB1dChrZXksIHJlc291cmNlRmFjdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWE1MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFRU1GWmlwRmlsZUxvYWRBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsIGV4dGVuZHMgWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwgewotCi0JcHJpdmF0ZSBKYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlciBlbWZIZWxwZXIgPSBuZXcgSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIoKTsKLQotCXB1YmxpYyBKYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsKFppcEZpbGUgemlwRmlsZSkgewotCQlzdXBlcih6aXBGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJc3VwZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJZW1mSGVscGVyLnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZW1mSGVscGVyLmdldFJlc291cmNlKHJlc291cmNlUGF0aCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7Ci0JCXJldHVybiBlbWZIZWxwZXIuY29udGFpbnNNb2RlbE9iamVjdChtb2RlbE9iamVjdFBhdGgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB0aHJvd3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbWZIZWxwZXIuZ2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JCVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5yZW1vdmVBbmRVbmxvYWRBbGwoZW1mSGVscGVyLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCksIGVtZkhlbHBlci5nZXRSZXNvdXJjZVNldCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyIGdldEVNRkhlbHBlcigpIHsKLQkJcmV0dXJuIGVtZkhlbHBlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9XZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM0MzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciBleHRlbmRzIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIFdFQkxJQiA9IG5ldyBQYXRoKCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBXZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIFdlYkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50LCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCA8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJc3VwZXIuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQlhZGRMb29zZUxpYkpBUnNUb0ZpbGVzKCk7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJYWRkTWFwcGVkQ2xhc3NGb2xkZXJzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKTsJCQotCQl9Ci0JCXJldHVybiBmaWxlc0hvbGRlci5nZXRGaWxlcygpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldExpYk1vZHVsZXMoKSB7Ci0JCUxpc3QgPElWaXJ0dWFsUmVmZXJlbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBudWxsOwotCQlpZiAoIXZDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCXJlZkNvbXBvbmVudHMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KXZDb21wb25lbnQpLmdldE5vbk1hbmlmZXN0UmVmZXJlbmNlcygpOwotCQllbHNlCi0JCQlyZWZDb21wb25lbnRzID0gdkNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCS8vIENoZWNrIHRoZSBkZXBsb3llZCBwYXRoIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBsaWIgcGFyZW50IGZvbGRlciBhbmQgbWF0Y2hzIHRoZSB3ZWIueG1sCi0JCS8vIGJhc2UgcGF0aAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWZDb21wb25lbnRzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFdFQkxJQikpCi0JCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJfQotCi0JCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3Jlc3VsdC5zaXplKCldKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvb3NlTGliSkFSc1RvRmlsZXMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gbGliTW9kdWxlcyA9IGdldExpYk1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJNb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSBpTGliTW9kdWxlID0gbGliTW9kdWxlc1tpXTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGxvb3NlQ29tcG9uZW50ID0gaUxpYk1vZHVsZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAobG9vc2VDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBsb29zZUNvbXBvbmVudDsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlpZiAoIWRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJSVBhdGggdXJpID0gaUxpYk1vZHVsZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmFwcGVuZCgiLyIgKyBkaXNrRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkRXh0ZXJuYWxGaWxlKHVyaSwgZGlza0ZpbGUpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IGlMaWJNb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQlpZiAoYXJjaGl2ZU5hbWUgIT0gbnVsbCAmJiBhcmNoaXZlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGFyY2hpdmVOYW1lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5hbWUgPSBsb29zZUNvbXBvbmVudC5nZXROYW1lKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5jaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSkhPSAnLycpIHsKLQkJCQkJcHJlZml4ICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhsb29zZUNvbXBvbmVudCk7Ci0JCQkJU3RyaW5nIHVyaSA9IHByZWZpeCArIG5hbWU7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciBhcmNoaXZlTG9hZEFkYXB0ZXIgPSBuZXcgSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcihsb29zZUNvbXBvbmVudCk7Ci0JCQkJCWFyY2hpdmVMb2FkQWRhcHRlci5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQkJCUFyY2hpdmVPcHRpb25zIHdlYkxpYk9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJCQkJd2ViTGliT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSLCBhcmNoaXZlTG9hZEFkYXB0ZXIpOwotCQkJCQlJQXJjaGl2ZSB3ZWJMaWJBcmNoaXZlOwotCQkJCQl3ZWJMaWJBcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZSh3ZWJMaWJPcHRpb25zKTsKLQkJCQkJd2ViTGliQXJjaGl2ZS5zZXRQYXRoKG5ldyBQYXRoKHVyaSkpOwotCQkJCQl3ZWJMaWJBcmNoaXZlLnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCQkJCS8vdGhpcyBpcyBpbiBjYXNlIHRoZXJlIGlzIGEgamFyIGluIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIgd2hpY2ggaXMgYWxzbwotCQkJCQkvL21hcHBlZCBhcyBhIHByb2plY3QuICBJZiBpdCBpcyBub3QgcmVtb3ZlZCBoZXJlLCB0aGVuIGV4cG9ydCB3aWxsIGluY2x1ZGUKLQkJCQkJLy90aGUgamFyIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgcHJvamVjdCB2ZXJzaW9uLgotCQkJCQlmaWxlc0hvbGRlci5yZW1vdmUod2ViTGliQXJjaGl2ZS5nZXRQYXRoKCkpOwotCQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKHdlYkxpYkFyY2hpdmUpOwotCQkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl8sIG5ldyBPYmplY3RbXXt1cmksIGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCksIGUuZ2V0TWVzc2FnZSgpfSk7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgewotCQkvLyByZXRyaWV2ZSBhbGwgSmF2YSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcwotCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGNwUmVmc1tqXTsKLQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQotCQkJCS8vIG9ubHkgcHJvY2VzcyAuLi8gbWFwcGluZ3MKLQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50Ci0JCQkJCQkmJiBydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCWZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCUZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQlpZiAoIWNwRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaW5hbCBJRmlsZSB3YkZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCQljcEVudHJ5RmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYWRkRXh0ZXJuYWxGaWxlKG5ldyBQYXRoKCJXRUItSU5GL2xpYi8iICsgcmVmLmdldEFyY2hpdmVOYW1lKCkpLCBjcEVudHJ5RmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGF0aCBnZXREZWZhdWx0TW9kZWxPYmplY3RQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvV2ViQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTMxZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvV2ViQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKLQotCXByaXZhdGUgSVBhdGggSU1QT1JURURfQ0xBU1NFU19QQVRIID0gbmV3IFBhdGgoIi8iICsgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQotCXB1YmxpYyBXZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBZGRJbXBvcnRlZENsYXNzZXNUb0NsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBuZXZlciBhZGQgdG8gY2xhc3NwYXRoIGJlY2F1c2UgdGhlIHdlYiBhcHAgY29udGFpbmVyIHdpbGwgcGljayB0aGlzIHVwLgotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRJbXBvcnRlZENsYXNzZXNVUkkoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSl7Ci0JCXJldHVybiBhRmlsZS5nZXRQYXRoKCkubWFrZVJlbGF0aXZlKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhJTVBPUlRFRF9DTEFTU0VTX1BBVEguc2VnbWVudENvdW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRJbXBvcnRlZENsYXNzZXNSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIElNUE9SVEVEX0NMQVNTRVNfUEFUSDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgewotCQlpZiAobnVsbCAhPSBub25TdGFuZGFyZFNvdXJjZUZpbGVzICYmIG5vblN0YW5kYXJkU291cmNlRmlsZXMuY29udGFpbnNLZXkoYUZpbGUpKSB7Ci0JCQlJUGF0aCBwYXRoID0gbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5nZXQoYUZpbGUpOwotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKHBhdGgpOwotCQkJSUZpbGUgaUZpbGUgPSB2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJcmV0dXJuIGlGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aChhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXAgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIGEgamF2YSBzb3VyY2UgZmlsZSBpcyBub3QgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlIC5jbGFzcwotCSAqIGZpbGUuIEZvciBleGFtcGxlIGlmIGFsbCB0aGUgc291cmNlIGZpbGVzIHdlcmUgY29udGFpbmVkIGluIFdFQi1JTkYvc291cmNlCi0JICovCi0JcHJvdGVjdGVkIE1hcDxJQXJjaGl2ZVJlc291cmNlLCBJUGF0aD4gbm9uU3RhbmRhcmRTb3VyY2VGaWxlczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NXaXRob3V0U291cmNlKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKLQkJU3RyaW5nIGphdmFVcmkgPSBBcmNoaXZlVXRpbC5jbGFzc1VyaVRvSmF2YVVyaShhRmlsZS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChqYXZhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSVBhdGggamF2YVBhdGggPSBuZXcgUGF0aChqYXZhVXJpKTsKLQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoamF2YVBhdGgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gc2VlIGlmIGl0IGlzIGEgSlNQCi0JCVN0cmluZyBqc3BVcmkgPSBqYXZhVXJpLnN1YnN0cmluZygwLCBqYXZhVXJpLmluZGV4T2YoQXJjaGl2ZVV0aWwuRE9UX0pBVkEpKTsKLQkJaW50IGxhc3RTbGFzaCA9IGpzcFVyaS5sYXN0SW5kZXhPZignLycpOwotCQlpbnQgX2luZGV4ID0gbGFzdFNsYXNoID09IC0xID8gQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkubGVuZ3RoKCkgOiBsYXN0U2xhc2ggKyAxOwotCQlpZiAoanNwVXJpLmNoYXJBdChfaW5kZXgpID09ICdfJykgewotCQkJanNwVXJpID0ganNwVXJpLnN1YnN0cmluZyhBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSS5sZW5ndGgoKSwgX2luZGV4KSArIGpzcFVyaS5zdWJzdHJpbmcoX2luZGV4ICsgMSkgKyBBcmNoaXZlVXRpbC5ET1RfSlNQOwotCQkJSVBhdGgganNwUGF0aCA9IG5ldyBQYXRoKGpzcFVyaSk7Ci0JCQlpZiAoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShqc3BQYXRoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vVGhpcyBpcyB0byBoYW5kbGUgYXJjaGl2ZXMgY3JlYXRlZCBieSBhbiBlYXJsaWVyIHZlcnNpb24KLQkJLy9UaGUgZm9ybWF0IHdhcyB0byBpbmNsdWRlIHRoZSBzb3VyY2UgZmlsZXMgaW4gYSBkaXJlY3RvcnkgY2FsbGVkIHNvdXJjZSBpbiBXRUItSU5GCi0JCS8vRXhhbXBsZTogY2xhc3MgIGlzIGluIFdFQi1JTkYvY2xhc3Nlcy90ZXN0L0Zvby5jbGFzcwotCQkvLyAgICAgICAgIHNvdXJjZSBpcyBpbiBXRUItSU5GL3NvdXJjZS90ZXN0L0Zvby5qYXZhCi0JCWlmKGphdmFQYXRoLnNlZ21lbnRDb3VudCgpID4gMiAmJiBqYXZhUGF0aC5zZWdtZW50KDApLmVxdWFscygiV0VCLUlORiIpICYmIGphdmFQYXRoLnNlZ21lbnQoMSkuZXF1YWxzKCJjbGFzc2VzIikpewotCQkJU3RyaW5nIGFsdGVybmF0ZUphdmFVcmkgPSBqYXZhVXJpLnJlcGxhY2VGaXJzdCgiY2xhc3NlcyIsICJzb3VyY2UiKTsKLQkJCUlQYXRoIGFsdGVybmF0ZUphdmFQYXRoID0gbmV3IFBhdGgoYWx0ZXJuYXRlSmF2YVVyaSk7Ci0JCQlpZiAoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShhbHRlcm5hdGVKYXZhUGF0aCkpewotCQkJCUlBcmNoaXZlUmVzb3VyY2Ugc291cmNlRmlsZTsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VGaWxlID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UoYWx0ZXJuYXRlSmF2YVBhdGgpOwotCQkJCQlpZihzb3VyY2VGaWxlICE9IG51bGwpewotCQkJCQkJaWYgKG5vblN0YW5kYXJkU291cmNlRmlsZXMgPT0gbnVsbCkgewotCQkJCQkJCW5vblN0YW5kYXJkU291cmNlRmlsZXMgPSBuZXcgSGFzaE1hcDxJQXJjaGl2ZVJlc291cmNlLCBJUGF0aD4oKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5jb250YWluc0tleShzb3VyY2VGaWxlKSkgewotCQkJCQkJCW5vblN0YW5kYXJkU291cmNlRmlsZXMucHV0KHNvdXJjZUZpbGUsIGphdmFQYXRoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXNGb3JTYXZlKCkgewotCQlMaXN0IDxJQXJjaGl2ZVJlc291cmNlPiBzb3J0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QgPElBcmNoaXZlUmVzb3VyY2U+KCk7Ci0JCWludCBjbGFzc0luZGV4ID0gMDsKLQkJZm9yKElBcmNoaXZlUmVzb3VyY2UgcmVzb3VyY2UgOiBzdXBlci5nZXRBcmNoaXZlUmVzb3VyY2VzRm9yU2F2ZSgpKXsKLQkJCWlmKHJlc291cmNlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLmVuZHNXaXRoKERPVF9DTEFTUykpewotCQkJCXNvcnRlZEZpbGVzLmFkZChjbGFzc0luZGV4KyssIHJlc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvcnRlZEZpbGVzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvcnRlZEZpbGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVUeXBlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvV2ViQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjM5ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvV2ViQ29tcG9uZW50QXJjaGl2ZVR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRBcmNoaXZlVHlwZUhhbmRsZXIgaW1wbGVtZW50cyBJQXJjaGl2ZUhhbmRsZXIgewotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0FyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQlpZiAoYXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpIGluc3RhbmNlb2YgV2ViQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRPRE8gaGFuZGxlIHRoZSBubyBERCBjYXNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTFlOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImFwcGNsaWVudGFyY2hpdmVvcHMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fU2F2ZUZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fUHJvamVjdE5hdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9TYXZlTWFuaWZlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fRmlsZU5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX0ltcG9ydE9wZXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBPUlRfTU9GUkVTT1VSQ0VfU1RSSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUENMSUVOVF9JTVBPUlRfT1BFUkFUSU9OX1NUUklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBDTElFTlRfSU1QT1JUX0ZJTEVfU1RSSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUENMSUVOVF9JTVBPUlRfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fRXJyb3JPY2N1cmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uX0NsaWVudF9GaWxlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfY19fQ29weXJpZ2h0X0lCTV9Db3Jwb3JhdGlvbl8yMDAxXzE7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWM1ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkphdmFFRUFyY2hpdmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0T3BlcmF0aW9uIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhwb3J0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCBFWFBPUlRfV09SSyk7Ci0JCUlBcmNoaXZlIGFyY2hpdmVGcm9tQ29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFyY2hpdmVGcm9tQ29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCQkJaWYgKHF1aWNrUGVlay5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSjJFRUNvbnN0YW50cy5KRUVfNV8wX0lEKSB7Ci0JCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGNhZiA9ICgoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJCUFwcENsaWVudENvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbHMgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChnZXRDb21wb25lbnQoKSk7Ci0JCQkJbHMuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwotCQkJCXNldE1vZHVsZUZpbGUoY2FmLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUobHMsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotCQkJCWxzLnNldFByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yKTsKLQkJCQlnZXRNb2R1bGVGaWxlKCkuc2F2ZUFzTm9SZW9wZW4oZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFyY2hpdmVGcm9tQ29tcG9uZW50ICE9IG51bGwpCi0JCQkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5jbG9zZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGFyY2hpdmVTdHJpbmcoKSB7Ci0JCXJldHVybiBBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFwcGxpY2F0aW9uX0NsaWVudF9GaWxlX1VJXzsgCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjMjI2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudENvbXBvbmVudEltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBzYXZlU3RyYXQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCh2aXJ0dWFsQ29tcG9uZW50KTsKLQkJcmV0dXJuIHNhdmVTdHJhdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBnZXRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2M3OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXN1cGVyKHZDb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSB7Ci0JCWlmKGFydGlmYWN0RWRpdCA9PSBudWxsKXsKLQkJCWFydGlmYWN0RWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHZDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2OWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgewotCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmM2M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db250YWluZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU0VUVElOR1MgPSAiLnNldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9DVlNfSUdPUkUgPSAiLmN2c2lnbm9yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50OwotCXByb3RlY3RlZCBib29sZWFuIGV4cG9ydFNvdXJjZTsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcml2YXRlIExpc3QgemlwRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGphdmFDbGFzc3BhdGhVUklzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBjbGFzcyBGaWxlc0hvbGRlciB7Ci0KLQkJcHJpdmF0ZSBNYXAgdXJpc1RvRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcml2YXRlIE1hcCB1cmlzVG9SZXNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcml2YXRlIE1hcCByZXNvdXJjZXNUb1VSSSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByaXZhdGUgTWFwIHVyaXNUb0Rpc2tGaWxlczsKLQkJcHJpdmF0ZSBNYXAgdXJpc1RvWmlwRW50cnkgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUlGaWxlKElGaWxlIGZpbGUpIHsKLQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSByZXNvdXJjZXNUb1VSSS5nZXQoZmlsZSk7Ci0JCQlyZW1vdmUodXJpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgdXJpKSB7Ci0JCQl1cmlzVG9GaWxlcy5yZW1vdmUodXJpKTsKLQkJCU9iamVjdCByZXNvdXJjZSA9IHVyaXNUb1Jlc291cmNlcy5yZW1vdmUodXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VzVG9VUkkucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJCWlmICh1cmlzVG9EaXNrRmlsZXMgIT0gbnVsbCkgewotCQkJCXVyaXNUb0Rpc2tGaWxlcy5yZW1vdmUodXJpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQkJU3RyaW5nIHVyaSA9IGRpcmVjdG9yeS5nZXRVUkkoKTsKLQkJCXVyaXNUb0ZpbGVzLnB1dCh1cmksIGRpcmVjdG9yeSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRGaWxlKEZpbGUgZmlsZSkgewotCQkJU3RyaW5nIHVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQl1cmlzVG9GaWxlcy5wdXQodXJpLCBmaWxlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZSBmaWxlLCBqYXZhLmlvLkZpbGUgZXh0ZXJuYWxEaXNrRmlsZSkgewotCQkJU3RyaW5nIHVyaSA9IGZpbGUuZ2V0VVJJKCk7Ci0JCQl1cmlzVG9GaWxlcy5wdXQodXJpLCBmaWxlKTsKLQkJCWlmIChudWxsID09IHVyaXNUb0Rpc2tGaWxlcykgewotCQkJCXVyaXNUb0Rpc2tGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0JCQl1cmlzVG9EaXNrRmlsZXMucHV0KHVyaSwgZXh0ZXJuYWxEaXNrRmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRGaWxlKEZpbGUgZmlsZSwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlTdHJpbmcgdXJpID0gZmlsZS5nZXRVUkkoKTsKLQkJCXVyaXNUb0ZpbGVzLnB1dCh1cmksIGZpbGUpOwotCQkJdXJpc1RvUmVzb3VyY2VzLnB1dCh1cmksIHJlc291cmNlKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBudWxsOwotCi0JCQlpZiAodXJpc1RvRGlza0ZpbGVzICE9IG51bGwgJiYgdXJpc1RvRGlza0ZpbGVzLmNvbnRhaW5zS2V5KHVyaSkpIHsKLQkJCQlkaXNrRmlsZSA9IChqYXZhLmlvLkZpbGUpIHVyaXNUb0Rpc2tGaWxlcy5nZXQodXJpKTsKLQkJCX0gZWxzZSBpZiAodXJpc1RvUmVzb3VyY2VzICE9IG51bGwgJiYgdXJpc1RvUmVzb3VyY2VzLmNvbnRhaW5zS2V5KHVyaSkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB1cmlzVG9SZXNvdXJjZXMuZ2V0KHVyaSk7Ci0JCQkJZGlza0ZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTWFwIGZpbGVVUklNYXAgPSAoTWFwKSB1cmlzVG9aaXBFbnRyeS5nZXQodXJpKTsKLQkJCQlJdGVyYXRvciBpdCA9IGZpbGVVUklNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQkJCVN0cmluZyBzb3VyY2VGaWxlVXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCi0JCQkJLy8gdGhlcmUgaXMgb25seSBvbmUga2V5LCBwYWlyCi0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlzb3VyY2VGaWxlVXJpID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQl6aXBGaWxlID0gKFppcEZpbGUpIGZpbGVVUklNYXAuZ2V0KHNvdXJjZUZpbGVVcmkpOwotCQkJCX0KLQkJCQlaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoc291cmNlRmlsZVVyaSk7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQlyZXR1cm4gaW47Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShkaXNrRmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRGaWxlcygpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KHVyaXNUb0ZpbGVzLnZhbHVlcygpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiB1cmlzVG9GaWxlcy5jb250YWluc0tleSh1cmkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRW50cnkoWmlwRW50cnkgZW50cnksIFppcEZpbGUgemlwRmlsZSwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJCVN0cmluZyB1cmkgPSBydW50aW1lUGF0aCA9PSBudWxsID8gbnVsbCA6IHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgZmlsZVVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlpZiAoIXVyaS5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlmaWxlVVJJID0gdXJpICsgZW50cnkuZ2V0TmFtZSgpOwotCQkJCWVsc2UKLQkJCQkJZmlsZVVSSSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsZVVSSSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJRmlsZSBmaWxlID0gY3JlYXRlRmlsZShmaWxlVVJJKTsKLQotCQkJTWFwIGZpbGVVUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZmlsZVVSSU1hcC5wdXQoZW50cnkuZ2V0TmFtZSgpLCB6aXBGaWxlKTsKLQotCQkJdXJpc1RvWmlwRW50cnkucHV0KGZpbGUuZ2V0VVJJKCksIGZpbGVVUklNYXApOwotCQkJdXJpc1RvRmlsZXMucHV0KGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVzSG9sZGVyIGZpbGVzSG9sZGVyOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOyAvL1RFTVAgVE9ETyBSRU1PVkUKLQkKLQlwcml2YXRlIElWaXJ0dWFsRmlsZSBtYW5pZmVzdEZpbGUgPSBudWxsOwotCSAKLQlwdWJsaWMgQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXRoaXModkNvbXBvbmVudCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJdGhpcy52Q29tcG9uZW50ID0gdkNvbXBvbmVudDsKLQkJZmlsZXNIb2xkZXIgPSBuZXcgRmlsZXNIb2xkZXIoKTsKLQkJZXhjZXB0aW9uID0gbmV3IEV4Y2VwdGlvbigpOwotCQl0aGlzLmluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzID0gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHM7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJdGhpcy5tYW5pZmVzdEZpbGUgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlzYXZlSmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlyZXR1cm4gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKHVyaSkpLmV4aXN0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldCgpIHsKLQkJcmVzb3VyY2VTZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQodkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaWxlcygpIHsKLQkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKLQkJYWdncmVnYXRlQ2xhc3NGaWxlcygpOwotCQlhZGRVdGlsaXRpZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgbGlicmFyeSBjcCBlbnRyaWVzIHRoYXQgcG9pbnQgdG8gY2xhc3MgZm9sZGVycyBhbmQgaGF2ZSBiZWVuIHRhZ2dlZCB3aXRoIHRoZSBwdWJsaXNoL2V4cG9ydCBhdHRyaWJ1dGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGVkQ2xhc3NGb2xkZXJzKGZpbmFsIElQYXRoIHRhcmdldFJ1bnRpbWVQYXRoKSB7Ci0JCS8vIHJldHJpZXZlIGFsbCBtYXBwZWQgY2xhc3MgZm9sZGVycwotCQlpZiAodkNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50IGoyZWVDb21wb25lbnQgPSAoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHZDb21wb25lbnQ7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSBqMmVlQ29tcG9uZW50LmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gY3BSZWZzW2pdOwotCQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQkvLyBvbmx5IHByb2Nlc3MgbWFwcGluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgcGF0aAotCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50Ci0JCQkJCQkJJiYgcnVudGltZVBhdGguZXF1YWxzKHRhcmdldFJ1bnRpbWVQYXRoKSkgewotCQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCWlmIChjb21wLmlzQ2xhc3NGb2xkZXIoKSkgewotCQkJCQkJCWZpbmFsIElDb250YWluZXIgY2xhc3NGb2xkZXIgPSBjb21wLmdldENsYXNzRm9sZGVyKCk7Ci0JCQkJCQkJaWYgKGNsYXNzRm9sZGVyICE9IG51bGwgJiYgY2xhc3NGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQkJYWdncmVnYXRlT3V0cHV0RmlsZXMobmV3IElSZXNvdXJjZVtde2NsYXNzRm9sZGVyfSwgcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCksIGNsYXNzRm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpIHsKLSAgICAgICAgaWYgKHZDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotICAgICAgICAJZmluYWwgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQgajJlZUNvbXAgPSAoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHZDb21wb25lbnQ7Ci0gICAgICAgIAlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBqMmVlQ29tcC5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgaWYgKHJlZnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgCWlmIChyZWZzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewotICAgICAgICAgICAgCQlqYXZhQ2xhc3NwYXRoVVJJcy5hZGQocmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVdGlsaXRpZXMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IHZDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbXBvbmVudHNbaV07Ci0JCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gRGVwZW5kZW5jeVR5cGUuQ09OU1VNRVMpIHsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlaaXBGaWxlIHppcEZpbGU7Ci0JCQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCXRyeSB7Ci0JCQkJCXppcEZpbGUgPSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShkaXNrRmlsZSk7Ci0JCQkJCXppcEZpbGVzLmFkZCh6aXBGaWxlKTsKLQkJCQkJRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCQkJCWZpbGVzSG9sZGVyLmFkZEVudHJ5KGVudHJ5LCB6aXBGaWxlLCBwYXRoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKglUaGlzIGlzIGEgY2FjaGUgb2YgdGhlIElSZXNvdXJjZSByb290cyBmb3IgYWxsIGphdmEgc291cmNlIGZvbGRlcnMgYW5kIGlzIHVzZWQgYnkKLQkgKiAge0BsaW5rICNpbkphdmFTcmMoSVZpcnR1YWxSZXNvdXJjZSl9LgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlW10gc291cmNlUm9vdHMgPSBudWxsOwotCQotCXByb3RlY3RlZCB2b2lkIGFnZ3JlZ2F0ZVNvdXJjZUZpbGVzKCkgewotCQl0cnkgewotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSByb290Rm9sZGVyLm1lbWJlcnMoKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc3JjUGtncyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnModkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJc291cmNlUm9vdHMgPSBuZXcgSVJlc291cmNlW3NyY1BrZ3MubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGtncy5sZW5ndGg7IGkrKykgewotCQkJCXNvdXJjZVJvb3RzW2ldID0gc3JjUGtnc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0KLQkJCWluSmF2YVNyYyA9IGZhbHNlOwotCQkJYWdncmVnYXRlRmlsZXMobWVtYmVycyk7IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFnZ3JlZ2F0ZUNsYXNzRmlsZXMoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgc2UgPSBudWxsOwotCQl0cnkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VSb290cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnModkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJc2UgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gc291cmNlUm9vdHNbaV0uZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCWlmIChvdXRwdXRQYXRoID09IG51bGwpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHZDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbCkgewotCQkJCQlJQ29udGFpbmVyIGphdmFPdXRwdXRDb250YWluZXIgPSBvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID4gMSA/IChJQ29udGFpbmVyKSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihvdXRwdXRQYXRoKSA6IChJQ29udGFpbmVyKSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qob3V0cHV0UGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJCQkJSVBhdGggcnVudGltZVBhdGggPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSBzZS5maW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKHNvdXJjZVJvb3RzW2ldLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJCQkJCWlmIChjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCUlQYXRoIHRtcFJ1bnRpbWVQYXRoID0gY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJCQkJSVBhdGggdG1wU291cmNlUGF0aCA9IGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRTb3VyY2VQYXRoKCk7Ci0JCQkJCQkJaWYgKCF0bXBSdW50aW1lUGF0aC5lcXVhbHModG1wU291cmNlUGF0aCkpIHsKLQkJCQkJCQkJd2hpbGUgKHRtcFNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAwICYmIHRtcFJ1bnRpbWVQYXRoLnNlZ21lbnRDb3VudCgpID4gMCAmJiB0bXBSdW50aW1lUGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscyh0bXBTb3VyY2VQYXRoLmxhc3RTZWdtZW50KCkpKSB7Ci0JCQkJCQkJCQl0bXBSdW50aW1lUGF0aCA9IHRtcFJ1bnRpbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQkJCQkJCXRtcFNvdXJjZVBhdGggPSB0bXBTb3VyY2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAodG1wUnVudGltZVBhdGguc2VnbWVudENvdW50KCkgIT0gMCkgewotCQkJCQkJCQkJcnVudGltZVBhdGggPSB0bXBSdW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG51bGwgPT0gcnVudGltZVBhdGgpIHsKLQkJCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYWdncmVnYXRlT3V0cHV0RmlsZXMobmV3IElSZXNvdXJjZVtde2phdmFPdXRwdXRDb250YWluZXJ9LCBydW50aW1lUGF0aCwgamF2YU91dHB1dENvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkpOwotCQkJCX0KLQkJCX0JCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlICE9IG51bGwpIHsKLQkJCQlzZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWdncmVnYXRlT3V0cHV0RmlsZXMoSVJlc291cmNlW10gcmVzb3VyY2VzLCBmaW5hbCBJUGF0aCBydW50aW1lUGF0aFByZWZpeCwgaW50IG91dHB1dEZvbGRlclNlZ21lbnRDb3VudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIGZpbGVBZGRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBjRmlsZSA9IG51bGw7Ci0JCQlpZiAoIXJlc291cmNlc1tpXS5leGlzdHMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gV2UgaGF2ZSB0byBhdm9pZCBkdXBsaWNhdGVzIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMgKG5vbi1qYXZhCi0JCQkvLyByZXNvdXJjZXMpCi0JCQlJUGF0aCBydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoUHJlZml4LmFwcGVuZChyZXNvdXJjZXNbaV0uZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMob3V0cHV0Rm9sZGVyU2VnbWVudENvdW50KSk7Ci0JCQlTdHJpbmcgdXJpID0gcnVudGltZVBhdGggPT0gbnVsbCA/IG51bGwgOiBydW50aW1lUGF0aC50b1N0cmluZygpOwotCQkJaWYgKHVyaSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlc291cmNlc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoIXNob3VsZEluY2x1ZGUodXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJY0ZpbGUgPSBjcmVhdGVGaWxlKHVyaSk7Ci0JCQkJY0ZpbGUuc2V0TGFzdE1vZGlmaWVkKGdldExhc3RNb2RpZmllZChyZXNvdXJjZXNbaV0pKTsKLQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKGNGaWxlLCByZXNvdXJjZXNbaV0pOwotCQkJCWZpbGVBZGRlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHNob3VsZEluY2x1ZGUoKElDb250YWluZXIpIHJlc291cmNlc1tpXSkpIHsKLQkJCQlJUmVzb3VyY2VbXSBuZXN0ZWRSZXNvdXJjZXMgPSAoKElDb250YWluZXIpIHJlc291cmNlc1tpXSkubWVtYmVycygpOwotCQkJCWFnZ3JlZ2F0ZU91dHB1dEZpbGVzKG5lc3RlZFJlc291cmNlcywgcnVudGltZVBhdGhQcmVmaXgsIG91dHB1dEZvbGRlclNlZ21lbnRDb3VudCk7Ci0JCQkJaWYoIWZpbGVzSG9sZGVyLmNvbnRhaW5zKHVyaSkpewotCQkJCQlpZiAoIXNob3VsZEluY2x1ZGUodXJpKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQljRmlsZSA9IGNyZWF0ZURpcmVjdG9yeSh1cmkpOwotCQkJCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKHJlc291cmNlc1tpXSkpOwotCQkJCQlmaWxlc0hvbGRlci5hZGREaXJlY3RvcnkoY0ZpbGUpOwotCQkJCQlmaWxlQWRkZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZUFkZGVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB3aGV0aGVyIHtAbGluayAjYWdncmVnYXRlRmlsZXMoSVZpcnR1YWxSZXNvdXJjZVtdKX0gaXMgY3VycmVudGx5IHdpdGhpbiBhIEphdmEgU291cmNlIGZvbGRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW5KYXZhU3JjID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWdncmVnYXRlRmlsZXMoSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBmaWxlQWRkZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGNGaWxlID0gbnVsbDsKLQkJCWlmICghdmlydHVhbFJlc291cmNlc1tpXS5leGlzdHMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gV2UgaGF2ZSB0byBhdm9pZCBkdXBsaWNhdGVzIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMgKG5vbi1qYXZhCi0JCQkvLyByZXNvdXJjZXMpCi0JCQlJUGF0aCBydW50aW1lUGF0aCA9IHZpcnR1YWxSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKTsKLQkJCVN0cmluZyB1cmkgPSBydW50aW1lUGF0aCA9PSBudWxsID8gbnVsbCA6IHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCk7Ci0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodXJpLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJaWYgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKHVyaSkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFR5cGUoKSA9PSBJVmlydHVhbFJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoIXNob3VsZEluY2x1ZGUodXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkvLyB3YW50IHRvIGlnbm9yZSBkZXJpdmVkIHJlc291cmNlcyBuZXN0ZWQgd2l0aGluIEphdmEgc3JjIGRpcmVjdG9yaWVzOyB0aGlzIGNvdmVycyB0aGUgY2FzZSB3aGVyZQotCQkJCS8vIGEgdXNlciBoYXMgbmVzdGVkIGEgSmF2YSBvdXRwdXQgZGlyZWN0b3J5IHdpdGhpbiBhIEphdmEgc3JjIGRpcmVjdG9yeSAobm90ZTogc2hvdWxkIGlkZWFsbHkgYmUgCi0JCQkJLy8gcmVzcGVjdGluZyBKYXZhIHNyYyBwYXRoIGV4Y2x1c2lvbiBmaWx0ZXJzKQotCQkJCWlmIChpbkphdmFTcmMgJiYgcmVzb3VyY2UuaXNEZXJpdmVkKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNGaWxlID0gY3JlYXRlRmlsZSh1cmkpOwotCQkJCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2UpKTsKLQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKGNGaWxlLCByZXNvdXJjZSk7Ci0JCQkJZmlsZUFkZGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoc2hvdWxkSW5jbHVkZSgoSVZpcnR1YWxDb250YWluZXIpIHZpcnR1YWxSZXNvdXJjZXNbaV0pKSB7Ci0JCQkJYm9vbGVhbiBpbkphdmFTcmNBdFRoaXNMZXZlbCA9IGluSmF2YVNyYzsKLQkJCQl0cnkgewotCQkJCQlpZiAoIWluSmF2YVNyYykgewotCQkJCQkJLy8gaWYgbm90IGFscmVhZHkgaW5zaWRlIGEgSmF2YSBzcmMgZGlyLCBjaGVjayBhZ2FpbgotCQkJCQkJaW5KYXZhU3JjID0gaW5KYXZhU3JjKHZpcnR1YWxSZXNvdXJjZXNbaV0pOwotCQkJCQl9Ci0JCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSBuZXN0ZWRWaXJ0dWFsUmVzb3VyY2VzID0gKChJVmlydHVhbENvbnRhaW5lcikgdmlydHVhbFJlc291cmNlc1tpXSkubWVtYmVycygpOwotCQkJCQlhZ2dyZWdhdGVGaWxlcyhuZXN0ZWRWaXJ0dWFsUmVzb3VyY2VzKTsKLQkJCQkJaWYoIWZpbGVzSG9sZGVyLmNvbnRhaW5zKHVyaSkpewotCQkJCQkJaWYgKCFzaG91bGRJbmNsdWRlKHVyaSkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQkJaWYgKGluSmF2YVNyYyAmJiByZXNvdXJjZS5pc0Rlcml2ZWQoKSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJY0ZpbGUgPSBjcmVhdGVEaXJlY3RvcnkodXJpKTsKLQkJCQkJCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2UpKTsKLQkJCQkJCWZpbGVzSG9sZGVyLmFkZERpcmVjdG9yeShjRmlsZSk7Ci0JCQkJCQlmaWxlQWRkZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaW5KYXZhU3JjID0gaW5KYXZhU3JjQXRUaGlzTGV2ZWw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlQWRkZWQ7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCBJVmlydHVhbFJlc291cmNlIG1hcHMgdG8gYSBJUmVzb3VyY2UgdGhhdCBpcyBjb250YWluZWQgd2l0aGluIGEgSmF2YSBzcmMgcm9vdC4KLQkgKiBAcGFyYW0gdmlydHVhbFJlc291cmNlIElWaXJ0dWFsUmVzb3VyY2UgdG8gY2hlY2suCi0JICogQHBhcmFtIHNvdXJjZVJvb3RzIEN1cnJlbnQgSmF2YSBzcmMgcm9vdHMuCi0JICogQHJldHVybiBUcnVlIGlmIGNvbnRhaW5lZCBpbiBhIEphdmEgc3JjIHJvb3QsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbkphdmFTcmMoZmluYWwgSVZpcnR1YWxSZXNvdXJjZSB2aXJ0dWFsUmVzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZVJvb3RzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gYWxsIG1hcHBlZCByZXNvdXJjZXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggSmF2YSBzcmMgZm9yIHRoZSByZXNvdXJjZSB0byBiZSBjb25zaWRlcmVkIGluIEphdmEgc3JjCi0JCWZpbmFsIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IHZpcnR1YWxSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7Ci0JCWJvb2xlYW4gaW5KYXZhU3JjID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbkphdmFTcmMgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc291cmNlUm9vdHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoc291cmNlUm9vdHNbal0uZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKHJlc291cmNlc1tpXS5nZXRGdWxsUGF0aCgpKSkgewotCQkJCQlpbkphdmFTcmMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB0aGlzIG9uZSB3YXMgbm90IGluIEphdmEgc3JjLCBjYW4gYnJlYWsKLQkJCWlmICghaW5KYXZhU3JjKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpbkphdmFTcmM7Ci0JfQotCi0JcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKElSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGFSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFNvdXJjZShib29sZWFuIG5ld0V4cG9ydFNvdXJjZSkgewotCQlleHBvcnRTb3VyY2UgPSBuZXdFeHBvcnRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFeHBvcnRTb3VyY2UoKSB7Ci0JCXJldHVybiBleHBvcnRTb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShJQ29udGFpbmVyIGFDb250YWluZXIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShJVmlydHVhbENvbnRhaW5lciB2Q29udGFpbmVyKSB7Ci0JCUlDb250YWluZXIgaUNvbnRhaW5lciA9IChJQ29udGFpbmVyKSB2Q29udGFpbmVyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQlyZXR1cm4gc2hvdWxkSW5jbHVkZShpQ29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFN0cmluZyB1cmkpIHsKLQkJaWYgKHVyaS5sZW5ndGgoKSA9PSAwIHx8IERPVF9QUk9KRUNULmVxdWFscyh1cmkpIHx8IERPVF9DTEFTU1BBVEguZXF1YWxzKHVyaSkgfHwgdXJpLmVuZHNXaXRoKERPVF9DVlNfSUdPUkUpIHx8IHVyaS5zdGFydHNXaXRoKERPVF9TRVRUSU5HUykpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc0V4cG9ydFNvdXJjZSgpIHx8ICFpc1NvdXJjZSh1cmkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU291cmNlKFN0cmluZyB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdXJpLmVuZHNXaXRoKEFyY2hpdmVVdGlsLkRPVF9KQVZBKSB8fCB1cmkuZW5kc1dpdGgoQXJjaGl2ZVV0aWwuRE9UX1NRTEopOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsRmlsZShTdHJpbmcgdXJpLCBqYXZhLmlvLkZpbGUgZXh0ZXJuYWxEaXNrRmlsZSkgewotCQlGaWxlIGFGaWxlID0gY3JlYXRlRmlsZSh1cmkpOwotCQlmaWxlc0hvbGRlci5hZGRGaWxlKGFGaWxlLCBleHRlcm5hbERpc2tGaWxlKTsKLQl9Ci0JCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gSWYgdGhlIE1BTklGRVNULk1GIG9mIGEgbW9kdWxlIGNvbXBvbmVudCBpcyBiZWluZyByZXF1ZXN0ZWQgYW5kIHRoYXQgbW9kdWxlIGNvbXBvbmVudCByZWZlcmVuY2VzCi0gICAgICAgIC8vIEphdmEgYnVpbGQgcGF0aC1iYXNlZCBjb21wb25lbnRzLCBuZWVkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoIHRvIHJlZmxlY3QgdGhlIHJlc29sdmVkCi0gICAgICAgIC8vIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgYnVpbGQgcGF0aAotCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgCi0JCQl1cmkuZXF1YWxzKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSAmJiAhamF2YUNsYXNzcGF0aFVSSXMuaXNFbXB0eSgpICYmCi0JCQltYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiBtYW5pZmVzdEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKSAhPSBudWxsICYmIAotCQkJbWFuaWZlc3RGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCS8vdXBkYXRlIHRoZSBtYW5pZmVzdCBjbGFzc3BhdGggZm9yIHRoZSBjb21wb25lbnQKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCSAgICAgICAgQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbC51cGRhdGVNYW5pZmVzdENsYXNzcGF0aChtYW5pZmVzdEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKSwgamF2YUNsYXNzcGF0aFVSSXMsIGJhb3MpOwotCSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCQl9Ci0JCQotCQlpZiAoZmlsZXNIb2xkZXIuY29udGFpbnModXJpKSkgewotCQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCX0KLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbFJlc291cmNlIHZSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZmluZE1lbWJlcih1cmkpOwotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlpZiAobnVsbCAhPSB2UmVzb3VyY2UgJiYgdlJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQlmaWxlUGF0aCA9IHZSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlUGF0aCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJfQotCQlTdHJpbmcgZVN0cmluZyA9IEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fRmlsZU5vdEZvdW5kOwotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGVTdHJpbmcpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBzdXBlci5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvL29ubHkgcmVtb3ZlIGNvbXBvbmVudCBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgc2V0dGluZ3MgZGlyZWN0b3J5Ci0JCQlpZiAocmVzLmdldFVSSSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoSU1vZHVsZUNvbnN0YW50cy5DT01QT05FTlRfRklMRV9OQU1FKSAmJiByZXMuZ2V0VVJJKCkuc2VnbWVudHNMaXN0KCkuY29udGFpbnMoSU1vZHVsZUNvbnN0YW50cy5ET1RfU0VUVElOR1MpKQotCQkJCXJlc291cmNlc1RvUmVtb3ZlLmFkZChyZXMpOwotCQl9Ci0JCWlmIChudWxsICE9IHJlc291cmNlc1RvUmVtb3ZlKSB7Ci0JCQlyZXNvdXJjZXMucmVtb3ZlQWxsKHJlc291cmNlc1RvUmVtb3ZlKTsKLQkJfQotCi0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJaWYoYXJ0aWZhY3RFZGl0ID09IG51bGwpewotCQkJYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQodkNvbXBvbmVudCk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzTG9hZGVyTmVlZGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHZDb21wb25lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBpbnQgRklMRV9TQVZFX1dPUksgPSAxMDA7Ci0JCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlSXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVJdGVyYXRvckltcGwoZ2V0Q29udGFpbmVyKCkuZ2V0RmlsZXMoKSl7Ci0JCQlwcm90ZWN0ZWQgU3ViUHJvZ3Jlc3NNb25pdG9yIGxhc3RTdWJNb24gPSBudWxsOwotCQkJYm9vbGVhbiBmaXJzdFZpc2l0ID0gdHJ1ZTsKLQkJCQotCQkJcHVibGljIEZpbGUgbmV4dCgpIHsKLQkJCQlpZihmaXJzdFZpc2l0KXsKLQkJCQkJZmlyc3RWaXNpdCA9IGZhbHNlOwotCQkJCQlpZihtb25pdG9yICE9IG51bGwpewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkV4cG9ydGluZ19hcmNoaXZlLCBuZXcgT2JqZWN0IFtdIHsgZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCkgfSksIGZpbGVzLnNpemUoKSAqIEZJTEVfU0FWRV9XT1JLKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihsYXN0U3ViTW9uICE9IG51bGwpewotCQkJCQlsYXN0U3ViTW9uLmRvbmUoKTsKLQkJCQkJbGFzdFN1Yk1vbiA9IG51bGw7Ci0JCQkJfSBlbHNlIGlmKG1vbml0b3IgIT0gbnVsbCl7Ci0JCQkJCW1vbml0b3Iud29ya2VkKEZJTEVfU0FWRV9XT1JLKTsKLQkJCQl9Ci0JCQkJRmlsZSBmaWxlID0gc3VwZXIubmV4dCgpOwotCQkJCWlmKG1vbml0b3IgIT0gbnVsbCl7Ci0JCQkJCWlmKGZpbGUuaXNDb250YWluZXIoKSAmJiBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmNsYXNzLmlzSW5zdGFuY2UoKChDb250YWluZXJJbXBsKWZpbGUpLmdldExvYWRTdHJhdGVneSgpKSl7Ci0JCQkJCQlDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxzID0gKENvbXBvbmVudExvYWRTdHJhdGVneUltcGwpKChDb250YWluZXJJbXBsKWZpbGUpLmdldExvYWRTdHJhdGVneSgpOwotCQkJCQkJbGFzdFN1Yk1vbiA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgRklMRV9TQVZFX1dPUkssIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQkJCQlscy5zZXRQcm9ncmVzc01vbml0b3IobGFzdFN1Yk1vbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soZmlsZS5nZXRVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZmluYWxpemVyIikgIT0gLTEpewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJPcGVuZXIgb2YgQXJjaGl2ZSBkaWRuJ3QgY2xvc2UhICIrdGhpcyk7Ci0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9Ci0JCQotCQl0cnl7Ci0JCQlJdGVyYXRvciBpdCA9IHppcEZpbGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJWmlwRmlsZSBmaWxlID0gKFppcEZpbGUpIGl0Lm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlmaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHl7Ci0JCQl0cnl7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaWYoYXJ0aWZhY3RFZGl0ICE9IG51bGwpewotCQkJCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKWFydGlmYWN0RWRpdC5nZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKTsKLQkJCQkJCWlmKGVkaXRNb2RlbCAhPSBudWxsICYmICFlZGl0TW9kZWwuaXNEaXNwb3NlZCgpKXsKLQkJCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdjNGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgewotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50OwotCXByb3RlY3RlZCBJT3ZlcndyaXRlSGFuZGxlciBvdmVyd3JpdGVIYW5kbGVyOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCXByaXZhdGUgU3RyaW5nIGFyY2hpdmVDb21wb25lbnRzRGVwbG95UGF0aDsKLQlwcml2YXRlIExpc3QgYXJjaGl2ZUNvbXBvbmVudHM7Ci0JcHJpdmF0ZSBNYXAgYXJjaGl2ZUNvbXBvbmVudFVSSU1hcDsKLQlwcml2YXRlIE1hcCBhcmNoaXZlQ29tcG9uZW50RGVwbG95UGF0aE1hcDsKLQotCXB1YmxpYyBDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG51bGwgPT0gdkNvbXBvbmVudCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52Q29tcG9uZW50ID0gdkNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlSGFuZGxlcihJT3ZlcndyaXRlSGFuZGxlciBuZXdPdmVyd3JpdGVIYW5kbGVyKSB7Ci0JCW92ZXJ3cml0ZUhhbmRsZXIgPSBuZXdPdmVyd3JpdGVIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG5ld1Byb2dyZXNzTW9uaXRvcikgewotCQlwcm9ncmVzc01vbml0b3IgPSBuZXdQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFZGl0KElGaWxlIGFGaWxlKSB7Ci0JCWlmIChvdmVyd3JpdGVIYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKGFGaWxlLmV4aXN0cygpICYmIGFGaWxlLmlzUmVhZE9ubHkoKSkpCi0JCQlyZXR1cm47Ci0KLQkJb3ZlcndyaXRlSGFuZGxlci52YWxpZGF0ZUVkaXQoYUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZE92ZXJ3cml0ZShTdHJpbmcgdXJpKSB7Ci0JCWlmIChvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlTm9uZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKG92ZXJ3cml0ZUhhbmRsZXIuaXNPdmVyd3JpdGVSZXNvdXJjZXMoKSB8fCBvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlQWxsKCkgfHwgb3ZlcndyaXRlSGFuZGxlci5zaG91bGRPdmVyd3JpdGUodXJpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyB0aGlzIG1ldGhvZCBoYXMgbm8gcmVmZXJlbmNlcyBpbiB0aGUgaGlyYXJjaHkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUZpbGVzKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZUZpbGVzKCk7Ci0JCWxpbmtBcmNoaXZlQ29tcG9uZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhhRmlsZS5nZXRVUkkoKSk7Ci0JCQkKLQkJCUlQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGggPSBnZXRPdXRwdXRQYXRoRm9yRmlsZShhRmlsZSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpIHsKLQkJCQlzYXZlQXNBcmNoaXZlQ29tcG9uZW50KChBcmNoaXZlKSBhRmlsZSwgcHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCQkJfSBlbHNlIGlmICghYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKSB7Ci0JCQkJc2F2ZVRvT3V0cHV0UGF0aChwcm9qZWN0UmVsYXRpdmVQYXRoLCBpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZURpcmVjdG9yeShwcm9qZWN0UmVsYXRpdmVQYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbiBvaGUpIHsKLQkJCXRocm93IG9oZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBlcnJvclN0cmluZyA9IEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fU2F2ZUZpbGUgKyBhRmlsZS5nZXROYW1lKCk7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oZXJyb3JTdHJpbmcsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQotCS8vVE9ETyB0aGlzIHNob3VsZCBiZSByZW5hbWVkIHRvIGdldFByb2plY3RSZWxhdGl2ZVBhdGgKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggZm9yIHdoZXJlIHRoZSBzcGVjaWZpZWQgZmlsZSBzaG91bGQgYmUKLQkgKiBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldE91dHB1dFBhdGhGb3JGaWxlKEZpbGUgYUZpbGUpIHsKLQkJU3RyaW5nIHVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQlJRmlsZSBpRmlsZSA9IG51bGw7Ci0JCWlmKHVyaS5zdGFydHNXaXRoKElNb2R1bGVDb25zdGFudHMuRE9UX1NFVFRJTkdTKSl7Ci0JCQlpRmlsZSA9IHZDb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgodXJpKSk7Ci0JCX1lbHNlIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShhRmlsZS5nZXRVUkkoKSk7Ci0JCQlpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGlGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQl9Ci0KLQkvL1RPRE8gVGhpcyBpc24ndCByZWZlcmVuY2VkIGluIFdUUCBpdCBzaG91bGQgYmUgZGVsZXRlZC4KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUb1dvcmtiZW5jaFBhdGgoSVBhdGggd29ya2JlbmNoUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBpRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3b3JrYmVuY2hQYXRoKTsKLQkJc2F2ZVRvSUZpbGUoaUZpbGUsIGluKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBJRm9sZGVyIHNwZWNpZmllZCBieSB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0UmVsYXRpdmVQYXRoCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlyZWN0b3J5KElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBpRm9sZGVyID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCQlpZiAoIWlGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCW1rZGlycyhpRm9sZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNwZWNpZmllZCBJRm9sZGVyCi0JICogCi0JICogQHBhcmFtIGZvbGRlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhJRm9sZGVyIGZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLQkJaWYgKCFjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCW1rZGlycygoSUZvbGRlcikgY29udGFpbmVyKTsKLQkJfQotCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHNwZWNpZmllZCBBcmNoaXZlIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdCByZWxhdGl2ZSBwYXRoCi0JICogdXNpbmcgdGhlIHBhc3NlZCBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmUKLQkgKiBAcGFyYW0gcHJvamVjdFJlbGF0aXZlUGF0aAotCSAqIEBwYXJhbSBpbgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUFzQXJjaGl2ZUNvbXBvbmVudChBcmNoaXZlIGFyY2hpdmUsIElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgaUZpbGUgPSBzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCQkvL1RPRE8gaW52ZXN0aWdhdGUgcmVtb3ZpbmcgdGhpcyBibG9jayBhbmQgcmVsYXRlZCB2YXJpYWJsZXMgYW5kIGxpbmtBcmNoaXZlQ29tcG9uZW50cygpOyBzZWUgYnVnemlsbGEgMTU5MTYwCi0JCWlmIChzaG91bGRMaW5rQXNDb21wb25lbnRSZWYoYXJjaGl2ZSkpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmVDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQodkNvbXBvbmVudC5nZXRQcm9qZWN0KCksIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgaUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCWlmIChhcmNoaXZlQ29tcG9uZW50cyA9PSBudWxsKSB7Ci0JCQkJYXJjaGl2ZUNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJYXJjaGl2ZUNvbXBvbmVudFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJYXJjaGl2ZUNvbXBvbmVudERlcGxveVBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWFyY2hpdmVDb21wb25lbnRzRGVwbG95UGF0aCA9IElQYXRoLlNFUEFSQVRPUiArIChuZXcgUGF0aChhcmNoaXZlLmdldFVSSSgpKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlhcmNoaXZlQ29tcG9uZW50cy5hZGQoYXJjaGl2ZUNvbXBvbmVudCk7Ci0JCQlhcmNoaXZlQ29tcG9uZW50VVJJTWFwLnB1dChhcmNoaXZlQ29tcG9uZW50LCBpRmlsZS5nZXROYW1lKCkpOwotCQkJYXJjaGl2ZUNvbXBvbmVudERlcGxveVBhdGhNYXAucHV0KGFyY2hpdmVDb21wb25lbnQsIElQYXRoLlNFUEFSQVRPUiArIChuZXcgUGF0aChhcmNoaXZlLmdldFVSSSgpKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTGlua0FzQ29tcG9uZW50UmVmKEFyY2hpdmUgYXJjaGl2ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlua0FyY2hpdmVDb21wb25lbnRzKCkgewotCQlpZiAoYXJjaGl2ZUNvbXBvbmVudHMgIT0gbnVsbCAmJiBhcmNoaXZlQ29tcG9uZW50cy5zaXplKCkgPiAwKSB7Ci0JCQlJRGF0YU1vZGVsIGNyZWF0ZVJlZmVyZW5jZXNEYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgdkNvbXBvbmVudCk7Ci0JCQljcmVhdGVSZWZlcmVuY2VzRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgYXJjaGl2ZUNvbXBvbmVudHNEZXBsb3lQYXRoKTsKLQkJCWNyZWF0ZVJlZmVyZW5jZXNEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIX01BUCwgYXJjaGl2ZUNvbXBvbmVudERlcGxveVBhdGhNYXApOwotCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBhcmNoaXZlQ29tcG9uZW50cyk7Ci0JCQljcmVhdGVSZWZlcmVuY2VzRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBhcmNoaXZlQ29tcG9uZW50VVJJTWFwKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QgcmVsYXRpdmUgb3V0cHV0IHBhdGguIFdhcm5pbmcgdGhpcyBtZXRob2QKLQkgKiB3aWxsIGJlIGNoYW5nZWQgcG9zdCAxLjUgdG8gcmV0dXJuIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIHByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiBAcGFyYW0gaW4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUb091dHB1dFBhdGgoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCX0KLQotCS8qKgotCSAqIFRPRE8gcmVmYWN0b3IgY2hhbmdlIHRoZSBtZXRob2QgYWJvdmUgdG8gcmV0dXJuIElGaWxlCi0JICoge0BsaW5rIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNX0KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aElGaWxlKElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgaUZpbGUgPSB2Q29tcG9uZW50LmdldFByb2plY3QoKS5nZXRGaWxlKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCQlzYXZlVG9JRmlsZShpRmlsZSwgaW4pOwotCQlyZXR1cm4gaUZpbGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9JRmlsZShJRmlsZSBpRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQl2YWxpZGF0ZUVkaXQoaUZpbGUpOwotCQlpZiAoaUZpbGUuZXhpc3RzKCkpCi0JCQlpRmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCWVsc2UgewotCQkJbWtkaXJzKGlGaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCWlGaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhJUGF0aCBwYXRoLCBJV29ya3NwYWNlUm9vdCByb290KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpCi0JCQlyZXR1cm47Ci0JCUlGb2xkZXIgZm9sZGVyID0gcm9vdC5nZXRGb2xkZXIocGF0aCk7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlta2RpcnMocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHJvb3QpOwotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM0ZTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgewotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRGVwZW5kZW50SmFyRXhwb3J0TWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0RlcGVuZGVudEphckV4cG9ydE1lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVlODg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRGVwZW5kZW50SmFyRXhwb3J0TWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLQotcHVibGljIGNsYXNzIERlcGVuZGVudEphckV4cG9ydE1lcmdlciB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgb3V0Z29pbmdBcmNoaXZlOwotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBMaXN0IGRlcGVuZGVudEFyY2hpdmVzOwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTb3VyY2U7Ci0KLQkvKioKLQkgKiBEZXBlbmRlbnRKYXJFeHBvcnRNZXJnZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW50SmFyRXhwb3J0TWVyZ2VyKEFyY2hpdmUgYXJjaGl2ZSwgSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gaW5jbHVkZVNvdXJjZUZpbGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCW91dGdvaW5nQXJjaGl2ZSA9IGFyY2hpdmU7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJaW5jbHVkZVNvdXJjZSA9IGluY2x1ZGVTb3VyY2VGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlyZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVyZ2UoKSB7Ci0JCVN0cmluZ1tdIGNwID0gb3V0Z29pbmdBcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWRlcGVuZGVudEFyY2hpdmVzID0gbmV3IEFycmF5TGlzdChjcC5sZW5ndGgpOwotCQlMaXN0IGtlZXBDbGFzc1BhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlBcmNoaXZlIGRlcGVuZGVudEphciA9IG51bGw7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmlsZSA9IHByb2plY3QuZ2V0RmlsZShjcFtpXSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgY3BbaV0uZW5kc1dpdGgoSjJFRUltcG9ydENvbnN0YW50cy5JTVBPUlRFRF9KQVJfU1VGRklYKSkgewotCQkJCXRyeSB7Ci0JCQkJCWRlcGVuZGVudEphciA9IGdldEFyY2hpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIE5lZWQgdG8gd3JpdGUgdGhpcyB0byB0aGUgbG9nIGZpbGUKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlkZXBlbmRlbnRBcmNoaXZlcy5hZGQoZGVwZW5kZW50SmFyKTsKLQkJCQltZXJnZUZpbGVzKGRlcGVuZGVudEphcik7Ci0JCQl9IGVsc2UKLQkJCQlrZWVwQ2xhc3NQYXRocy5hZGQoY3BbaV0pOwotCQl9Ci0JCXJlc2V0Q2xhc3NQYXRoKGtlZXBDbGFzc1BhdGhzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtZXJnZUZpbGVzKEFyY2hpdmUgZGVwZW5kZW50SmFyKSB7Ci0JCUxpc3QgZmlsZXMgPSBkZXBlbmRlbnRKYXIuZ2V0RmlsZXMoKTsKLQkJTGlzdCBmaWxlc1RvQWRkID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoc2hvdWxkTWVyZ2UoYUZpbGUpKQotCQkJCWZpbGVzVG9BZGQuYWRkKGFGaWxlKTsKLQkJfQotCQl0cnkgewotCQkJb3V0Z29pbmdBcmNoaXZlLmFkZENvcHlGaWxlcyhmaWxlc1RvQWRkKTsKLQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJLy8gU2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHdlIGp1c3QgY2hlY2tlZCBmb3IgZHVwcwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xpZW50cyBtdXN0IGNhbGwgdGhpcyB3aGVuIGRvbmUgdG8gY2xvc2UgdGhlIGFyY2hpdmVzCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGRlcGVuZGVudEFyY2hpdmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50QXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGRlcGVuZGVudEFyY2hpdmVzLmdldChpKTsKLQkJCWlmIChhbkFyY2hpdmUuaXNPcGVuKCkpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENsYXNzUGF0aChMaXN0IGNwKSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IG91dGdvaW5nQXJjaGl2ZS5nZXRNYW5pZmVzdCgpOwotCQlpZiAoY3AuaXNFbXB0eSgpKQotCQkJbWYuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotCQllbHNlIHsKLQkJCW1mLnNldENsYXNzUGF0aCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5zaXplKCk7IGkrKykgewotCQkJCW1mLmFwcGVuZENsYXNzUGF0aCgoU3RyaW5nKSBjcC5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTWVyZ2UoRmlsZSBhRmlsZSkgewotCi0JCVN0cmluZyB1cmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKCEodXJpLmVuZHNXaXRoKCIuamF2YSIpIHx8IHVyaS5lbmRzV2l0aCgiLmNsYXNzIikpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaW5jbHVkZVNvdXJjZSAmJiB1cmkuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gIW91dGdvaW5nQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSAmJiAhQXJjaGl2ZUNvbnN0YW50cy5NQU5JRkVTVF9VUkkuZXF1YWxzKHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MDNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZWFyYXJjaGl2ZW9wcyI7Ly8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fU2F2ZU1vZlJlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9TYXZlRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9Qcm9qZWN0TmF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVNYW5pZmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9GaWxlTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fRmlsZUNvbnRlbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX0Vycm9PY2N1cmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX0ZpbGVzRnJvbVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fSW1wb3J0T3BlcmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUE9SVF9NT0ZSRVNPVVJDRV9TVFJJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX0lNUE9SVF9GSUxFX1NUUklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTVBPUlRJTkdfRUFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRVhQT1JUSU5HX0VBUl9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUE9SVElOR19FQVJfRklMRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRpbmdfcHJvamVjdF9jbGFzc3BhdGhfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX2phcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRpbmdfbWFuaWZlc3RfQ2xhc3NfUGF0aF9fYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByZURlcGxveV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9SdW50aW1lU2VsZWN0ZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSVNTSU5HX0NMSUVOVF9KQVI7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFQVJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWJkMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkphdmFFRUFyY2hpdmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewotCi0JcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleHBvcnQoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIEVYUE9SVF9XT1JLKTsKLQkJSUFyY2hpdmUgYXJjaGl2ZUZyb21Db21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJLy9bQnVnIDI0NDA0OV0gbmVlZCB0byB1c2UgUHJvamVjdEZhY2V0IHZlcnNpb24gdG8gZGV0ZXJtaW5lIGhvdyB0byBleHBvcnQgdGhlIEVBUgotCQkJU3RyaW5nIHZlcnNpb25TdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJCWlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkgewotCQkJCWFyY2hpdmVGcm9tQ29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdCkgQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoZ2V0Q29tcG9uZW50KCkpOwotCQkJCQlFQVJGaWxlIGFyY2hpdmUgPSAoRUFSRmlsZSkgYXJ0aWZhY3RFZGl0LmFzQXJjaGl2ZShpc0V4cG9ydFNvdXJjZSgpKTsKLQkJCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpOwotCQkJCQlhcmNoaXZlLnNldFVSSShkZXN0aW5hdGlvbik7Ci0JCQkJCXNldE1vZHVsZUZpbGUoYXJjaGl2ZSk7Ci0JCQkJCUNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbHMgPSAoQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCkgYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKTsKLQkJCQkJbHMuc2V0UHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IpOwotCQkJCQlhcmNoaXZlLnNhdmVBc05vUmVvcGVuKGRlc3RpbmF0aW9uKTsKLQkJCQl9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBleDsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5BUkNISVZFX09QRVJBVElPTl9PcGVuaW5nQXJjaGl2ZSwgZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKG51bGwgIT0gYXJ0aWZhY3RFZGl0KSB7Ci0JCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFyY2hpdmVGcm9tQ29tcG9uZW50ICE9IG51bGwpCi0JCQkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5jbG9zZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5OZWNlc3NhcnlCdWlsZGVycyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWludCB3b3JrID0gKEpBVkFfQlVJTERFUl9XT1JLICsgTElCX0JVSUxERVJfV09SSykgLyAocmVmcy5sZW5ndGggKyAxKTsKLQkJCXN1cGVyLnJ1bk5lY2Vzc2FyeUJ1aWxkZXJzKGNvbXBvbmVudCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB3b3JrKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZDb21wID0gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJc3VwZXIucnVuTmVjZXNzYXJ5QnVpbGRlcnMocmVmQ29tcCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB3b3JrKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVN0cmluZygpIHsKLQkJcmV0dXJuICJFQVIiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWQ2MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkVBUkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uIHsKLQotCXByb3RlY3RlZCBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgaW50IExJTktfQ09NUE9ORU5UU19XT1JLID0gMTA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBXRUJfTElCX1dPUksgPSAxMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IERJU1BPU0VfV09SSyA9IDEwOwotCi0JcHVibGljIEVBUkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KXsKLQkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgY29tcHV0ZVRvdGFsV29yaygpIHsKLQkJaW50IGJhc2VXb3JrID0gc3VwZXIuY29tcHV0ZVRvdGFsV29yaygpICsgV0VCX0xJQl9XT1JLICsgRElTUE9TRV9XT1JLOwotCQlMaXN0IG1vZGVsc1RvSW1wb3J0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCUlEYXRhTW9kZWwgaW1wb3J0TW9kZWwgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsc1RvSW1wb3J0LnNpemUoKTsgaSsrKSB7Ci0JCQlpbXBvcnRNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2RlbHNUb0ltcG9ydC5nZXQoaSk7Ci0JCQlBcmNoaXZlV3JhcHBlciBuZXN0ZWRBcmNoaXZlID0gKEFyY2hpdmVXcmFwcGVyKSBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJYmFzZVdvcmsgKz0gTElOS19DT01QT05FTlRTX1dPUksgKyBQUk9KRUNUX0NSRUFUSU9OX1dPUksgKyBuZXN0ZWRBcmNoaXZlLmdldFNpemUoKTsKLQkJfQotCQlyZXR1cm4gYmFzZVdvcms7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRvIHBlcmZvcm1zIHRoZSB3b3JrYmVuY2ggbW9kaWZpY2F0aW9uIHN0ZXBzCi0JICogdGhhdCBhcmUgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBsb2dpY2FsIHdvcmtiZW5jaCBjaGFuZ2UuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvRXhlY3V0ZShtb25pdG9yKTsKLQkJRXhlY3V0aW9uRXhjZXB0aW9uIGZpcnN0TmVzdGVkRXhjZXB0aW9uID0gbnVsbDsKLQkJTGlzdCBtb2RlbHNUb0ltcG9ydCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5IQU5ETEVEX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotCQl0cnkgewotCQkJSURhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0JCQkvLyBtYWtlIHN1cmUgdGhlIHdhcnMgaGFuZGxlIGltcG9ydGluZyB0aGVpciBvd24gd2ViIGxpYnMKLQkJCWZvciAoaW50IGkgPSBtb2RlbHNUb0ltcG9ydC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQkJaW1wb3J0TW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kZWxzVG9JbXBvcnQuZ2V0KGkpOwotCQkJCUFyY2hpdmVXcmFwcGVyIG5lc3RlZEFyY2hpdmUgPSAoQXJjaGl2ZVdyYXBwZXIpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQkJaWYgKG5lc3RlZEFyY2hpdmUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkgewotCQkJCQlBcmNoaXZlV3JhcHBlciBvd25pbmdXYXIgPSAoQXJjaGl2ZVdyYXBwZXIpIG5lc3RlZEFyY2hpdmUuZ2V0UGFyZW50KCk7Ci0JCQkJCW1vZGVsc1RvSW1wb3J0LnJlbW92ZShpbXBvcnRNb2RlbCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9kZWxzVG9JbXBvcnQuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCUlEYXRhTW9kZWwgd2FyTW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kZWxzVG9JbXBvcnQuZ2V0KGopOwotCQkJCQkJaWYgKCgoQXJjaGl2ZVdyYXBwZXIpICh3YXJNb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpKSkuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSA9PSBvd25pbmdXYXIuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSkgewotCQkJCQkJCS8vIFRPRE8gdGhpcyBpcyBiYWQsIGJ1dCBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUKLQkJCQkJCQkvLyBwbHVnaW4gd2hlcmUgdGhlc2UKLQkJCQkJCQkvLyBjb25zdGFudHMgYXJlIGRlZmluZWQuCi0JCQkJCQkJU3RyaW5nIGFyY2hpdmVzU2VsZWN0ZWQgPSAiV0FSSW1wb3J0RGF0YU1vZGVsLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIGxpYk1vZGVscyA9ICJXQVJJbXBvcnREYXRhTW9kZWwuV0VCX0xJQl9NT0RFTFMiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJTGlzdCB3YXJIYW5kbGVkQXJjaGl2ZXMgPSAoTGlzdCkgd2FyTW9kZWwuZ2V0UHJvcGVydHkoYXJjaGl2ZXNTZWxlY3RlZCk7Ci0JCQkJCQkJaWYgKHdhckhhbmRsZWRBcmNoaXZlcyA9PSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0JCQkJCQkJCXdhckhhbmRsZWRBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJd2FyTW9kZWwuc2V0UHJvcGVydHkoYXJjaGl2ZXNTZWxlY3RlZCwgd2FySGFuZGxlZEFyY2hpdmVzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2FySGFuZGxlZEFyY2hpdmVzLmFkZChuZXN0ZWRBcmNoaXZlKTsKLQkJCQkJCQlMaXN0IHdhckxpYk1vZGVscyA9IChMaXN0KSB3YXJNb2RlbC5nZXRQcm9wZXJ0eShsaWJNb2RlbHMpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgd2FyTGliTW9kZWxzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCUlEYXRhTW9kZWwgbGliTW9kZWwgPSAoSURhdGFNb2RlbCkgd2FyTGliTW9kZWxzLmdldChrKTsKLQkJCQkJCQkJaWYgKCgoQXJjaGl2ZVdyYXBwZXIpbGliTW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUikpLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkgPT0gbmVzdGVkQXJjaGl2ZS5nZXRVbmRlckx5aW5nQXJjaGl2ZSgpKSB7Ci0JCQkJCQkJCQlsaWJNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCQkJCQlsaWJNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoV0VCX0xJQl9XT1JLKTsKLQotCQkJTGlzdCA8U3RyaW5nPiBkZFNwZWNpZmllZFVSSXMgPSAoKEFyY2hpdmVXcmFwcGVyKSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpKS5nZXRERE1hcHBlZE1vZHVsZVVSSXMoKTsKLQkJCUxpc3QgY29tcG9uZW50VG9BZGRBc01vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlNYXAgY29tcG9uZW50VG9VUklNYXBBc01vZHVsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJTGlzdCBjb21wb25lbnRUb0FkZEFzQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1hcCBjb21wb25lbnRUb1VSSU1hcEFzQ29tcG9uZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxzVG9JbXBvcnQuc2l6ZSgpOyBpKyspIHsKLQkJCQlpbXBvcnRNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2RlbHNUb0ltcG9ydC5nZXQoaSk7Ci0JCQkJQXJjaGl2ZVdyYXBwZXIgbmVzdGVkQXJjaGl2ZSA9IChBcmNoaXZlV3JhcHBlcikgaW1wb3J0TW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQkJCQlpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFLCBCb29sZWFuLkZBTFNFKTsKLQkJCQlJRGF0YU1vZGVsIGNvbXBDcmVhdGlvbk1vZGVsID0gaW1wb3J0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCQkJaWYgKGNvbXBDcmVhdGlvbk1vZGVsLmlzUHJvcGVydHkoSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTU9EVUxFX1VSSSkpewotCQkJCQljb21wQ3JlYXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJLCBuZXN0ZWRBcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY29tcENyZWF0aW9uTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJCQl0cnkgewotCQkJCQlJU3RhdHVzIG5lc3RlZEltcG9ydFN0YXR1cyA9IGltcG9ydE1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgUFJPSkVDVF9DUkVBVElPTl9XT1JLICsgbmVzdGVkQXJjaGl2ZS5nZXRTaXplKCkpLCBpbmZvKTsKLQkJCQkJaWYgKCFuZXN0ZWRJbXBvcnRTdGF0dXMuaXNPSygpICYmIG5lc3RlZEltcG9ydFN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24obmVzdGVkSW1wb3J0U3RhdHVzLmdldE1lc3NhZ2UoKSwgbmVzdGVkSW1wb3J0U3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChmaXJzdE5lc3RlZEV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQlmaXJzdE5lc3RlZEV4Y2VwdGlvbiA9IGU7Ci0JCQkJCX0KLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpOwotCQkJCVN0cmluZyB1cmkgPSBuZXN0ZWRBcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCWlmKGRkU3BlY2lmaWVkVVJJcy5jb250YWlucyh1cmkpKXsKLQkJCQkJY29tcG9uZW50VG9BZGRBc01vZHVsZXMuYWRkKGNvbXBvbmVudCk7Ci0JCQkJCWNvbXBvbmVudFRvVVJJTWFwQXNNb2R1bGVzLnB1dChjb21wb25lbnQsIHVyaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tcG9uZW50VG9BZGRBc0NvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0JCQkJCWNvbXBvbmVudFRvVVJJTWFwQXNDb21wb25lbnRzLnB1dChjb21wb25lbnQsIHVyaSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoY29tcG9uZW50VG9BZGRBc01vZHVsZXMuc2l6ZSgpID4gMCkgewotCQkJCS8vdGhpcyBibG9jayBhZGRzIHRoZSBjb21wb25lbnQgcmVmZXJlbmNlcyB0byB0aGUgY29tcG9uZW50IGZpbGUgYW5kIHRoZSBFQVIgREQKLQkJCQkvL3RoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBFQVIgREQgYWxyZWFkeSBjb250YWlucyB0aGUgbW9kdWxlCi0JCQkJLy9hbmQgaXMgbmVjZXNzYXJ5IHRvIHVwZGF0ZSB0aGUgaWQgYXR0cmlidXRlIChmb3IgdGhlIGRlcGVuZGVuY3kgb2JqZWN0KQotCQkJCUlEYXRhTW9kZWwgYWRkQ29tcG9uZW50c0RNID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJYWRkQ29tcG9uZW50c0RNLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCB2aXJ0dWFsQ29tcG9uZW50KTsKLQkJCQlhZGRDb21wb25lbnRzRE0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50VG9BZGRBc01vZHVsZXMpOwotCQkJCWFkZENvbXBvbmVudHNETS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXBBc01vZHVsZXMpOwotCQkJCWFkZENvbXBvbmVudHNETS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIExJTktfQ09NUE9ORU5UU19XT1JLLzIpLCBpbmZvKTsKLQkJCX0KLQkJCWlmIChjb21wb25lbnRUb0FkZEFzQ29tcG9uZW50cy5zaXplKCkgPiAwKXsKLQkJCQkvL3RoaXMgYmxvY2sgb25seSBhZGRzIHRoZSBjb21wb25lbnQgcmVmZXJlbmNlcyB0byB0aGUgY29tcG9uZW50IGZpbGUKLQkJCQkvL3RoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhleSBhcmUgbm90IGFscmVhZHkgbGlua2VkIGludG8gdGhlIEVBUiBERAotCQkJCUlEYXRhTW9kZWwgYWRkQ29tcG9uZW50c0RNID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQlhZGRDb21wb25lbnRzRE0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHZpcnR1YWxDb21wb25lbnQpOwotCQkJCWFkZENvbXBvbmVudHNETS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBjb21wb25lbnRUb0FkZEFzQ29tcG9uZW50cyk7Ci0JCQkJYWRkQ29tcG9uZW50c0RNLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wb25lbnRUb1VSSU1hcEFzQ29tcG9uZW50cyk7Ci0JCQkJYWRkQ29tcG9uZW50c0RNLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgTElOS19DT01QT05FTlRTX1dPUksvMiksIGluZm8pOwotCQkJfQotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChudWxsICE9IGFydGlmYWN0RWRpdCkgewotCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCX0KLQkJCXJlc2V0RGlzcG9zZUltcG9ydE1vZGVscygpOwotCQkJbW9uaXRvci53b3JrZWQoRElTUE9TRV9XT1JLKTsKLQkJfQotCQlpZiAoZmlyc3ROZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJdGhyb3cgZmlyc3ROZXN0ZWRFeGNlcHRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxzVG9JbXBvcnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXREaXNwb3NlSW1wb3J0TW9kZWxzKCkgewotCQlyZXNldERpc3Bvc2VJbXBvcnRNb2RlbHMoKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTF9QUk9KRUNUX01PREVMU19MSVNUKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0RGlzcG9zZUltcG9ydE1vZGVscyhMaXN0IG1vZGVscykgewotCQlJRGF0YU1vZGVsIG1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVscy5zaXplKCk7IGkrKykgewotCQkJbW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kZWxzLmdldChpKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DTE9TRV9BUkNISVZFX09OX0RJU1BPU0UsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneShJUHJvamVjdCBwcm9qZWN0KSB7IC8vIE5PT1AKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwodmlydHVhbENvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RWFyRmlsZSgpIHsKLQkJcmV0dXJuIChFQVJGaWxlKSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThkN2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCXByaXZhdGUgTGlzdCBhcnRpZmFjdEVkaXRzVG9EaXNwb3NlID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTWFwIGJpbmFyeUNvbXBvbmVudFVSSXNUb0Rpc2tGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBFQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCQotCXB1YmxpYyBFQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZpbGVzKCkgewotCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOwotCQlhZGRNb2R1bGVzQW5kVXRpbGl0aWVzKCk7Ci0JCXJldHVybiBmaWxlc0hvbGRlci5nZXRGaWxlcygpOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlpZihhcnRpZmFjdEVkaXQgPT0gbnVsbCl7Ci0JCQlhcnRpZmFjdEVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChiaW5hcnlDb21wb25lbnRVUklzVG9EaXNrRmlsZU1hcC5jb250YWluc0tleSh1cmkpKSB7Ci0JCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKSBiaW5hcnlDb21wb25lbnRVUklzVG9EaXNrRmlsZU1hcC5nZXQodXJpKTsKLQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGRpc2tGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTW9kdWxlc0FuZFV0aWxpdGllcygpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVhckFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJBcnRpZmFjdEVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IGVhckFydGlmYWN0RWRpdC5nZXRDb21wb25lbnRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb21wb25lbnRzW2ldOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gbnVsbDsKLQkJCQlib29sZWFuIGZvcmNlVXRpbGl0eSA9IGZhbHNlOwotCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJaW50IGplZVZlcnNpb24gPSBxcC5nZXRKYXZhRUVWZXJzaW9uKCk7Ci0JCQkJCWlmKGplZVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCl7Ci0JCQkJCQlmb3JjZVV0aWxpdHkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWRpc2tGaWxlID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCWlmICghZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCUlGaWxlIHdiRmlsZSA9ICgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCQlkaXNrRmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYm9vbGVhbiBpc01vZHVsZSA9IGZhbHNlOwotCQkJCWlmKCFmb3JjZVV0aWxpdHkpewotCQkJCQlib29sZWFuIGFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyA9IGZhbHNlOwotCQkJCQlBcnRpZmFjdEVkaXQgY29tcG9uZW50QXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQpKSB7Ci0JCQkJCQkJY29tcG9uZW50QXJ0aWZhY3RFZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQpKSB7Ci0JCQkJCQkJYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzID0gdHJ1ZTsKLQkJCQkJCQljb21wb25lbnRBcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpLmdldEFydGlmYWN0RWRpdChKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIpLmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChyZWZlcmVuY2VkQ29tcG9uZW50KSkgewotCQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyA9IHRydWU7Ci0JCQkJCQkJY29tcG9uZW50QXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKS5nZXRBcnRpZmFjdEVkaXQoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpLmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQpKSB7Ci0JCQkJCQkJYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzID0gdHJ1ZTsKLQkJCQkJCQljb21wb25lbnRBcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpLmdldEFydGlmYWN0RWRpdChKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EpLmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobnVsbCAhPSBjb21wb25lbnRBcnRpZmFjdEVkaXQpIHsKLQkJCQkJCQlBcmNoaXZlIGFyY2hpdmUgPSAoKEVudGVycHJpc2VBcnRpZmFjdEVkaXQpIGNvbXBvbmVudEFydGlmYWN0RWRpdCkuYXNBcmNoaXZlKGV4cG9ydFNvdXJjZSwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJCQkJYXJ0aWZhY3RFZGl0c1RvRGlzcG9zZS5hZGQoY29tcG9uZW50QXJ0aWZhY3RFZGl0KTsKLQkJCQkJCQkJYXJjaGl2ZS5zZXRMb2FkaW5nQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQkJCQkJCQkJYmluYXJ5Q29tcG9uZW50VVJJc1RvRGlza0ZpbGVNYXAucHV0KGFyY2hpdmUuZ2V0T3JpZ2luYWxVUkkoKSwgZGlza0ZpbGUpOwotCQkJCQkJCX0KLQkJCQkJCQlhcmNoaXZlLnNldFVSSShlYXJBcnRpZmFjdEVkaXQuZ2V0TW9kdWxlVVJJKHJlZmVyZW5jZWRDb21wb25lbnQpKTsKLQkJCQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKGFyY2hpdmUpOwotCQkJCQkJCWlzTW9kdWxlID0gdHJ1ZTsKLQkJCQkJCQlpZiAoYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKSB7Ci0JCQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIG9lKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iob2UpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKCFyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgY29tcG9uZW50QXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCQljb21wb25lbnRBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghaXNNb2R1bGUpIHsKLQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQkJU3RyaW5nIHVyaSA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCQkJYWRkRXh0ZXJuYWxGaWxlKHVyaSwgZGlza0ZpbGUpOwotCQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocmVmZXJlbmNlZENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmICghcmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCQkJCVN0cmluZyB1cmkgPSBlYXJBcnRpZmFjdEVkaXQuZ2V0TW9kdWxlVVJJKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJCQlBcmNoaXZlIGFyY2hpdmUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5hc0FyY2hpdmUodXJpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKSwgZXhwb3J0U291cmNlLCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JCQkJCQkJCWFyY2hpdmUuc2V0VVJJKHVyaSk7Ci0JCQkJCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUoYXJjaGl2ZSk7Ci0JCQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCQl9IGVsc2UgewotCi0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobnVsbCAhPSBlYXJBcnRpZmFjdEVkaXQpIHsKLQkJCQllYXJBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCS8vIHJldHJpZXZlIGFsbCBKYXZhIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzCi0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyAmJiByZWZlcmVuY2VkQ29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gY3BSZWZzW2pdOwotCQkJCS8vIG9ubHkgLi4vIHJ1bnRpbWUgcGF0aHMgY29udHJpYnV0ZSB0byB0aGUgRUFSCi0JCQkJaWYgKHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgewotCQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCUZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQkJaWYgKCFjcEVudHJ5RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWZpbmFsIElGaWxlIHdiRmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCQljcEVudHJ5RmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRFeHRlcm5hbEZpbGUocmVmLmdldEFyY2hpdmVOYW1lKCksIGNwRW50cnlGaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJSXRlcmF0b3IgaXQgPSBhcnRpZmFjdEVkaXRzVG9EaXNwb3NlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdCkgaXQubmV4dCgpOwotCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJYXJ0aWZhY3RFZGl0c1RvRGlzcG9zZS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCBjcmVhdGVMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZW5hbWUgPSB1cmkucmVwbGFjZSgnLycsIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZmlsZV9ub3RfZm91bmRfRVhDXywgKG5ldyBPYmplY3RbXXt1cmksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyA9Ci0JCX0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmZpbGVfbm90X2ZvdW5kX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8gPQotCQl9Ci0JCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoZmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YTVmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7Ci0KLS8vCXByb3RlY3RlZCBNYXAgY3JlYXRlZENvbXBvbmVudHNNYXA7Ci0KLQlwdWJsaWMgRUFSQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIoY29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIuc2V0RGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0KLQkJc2V0QXJjaGl2ZSgoQXJjaGl2ZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpKTsKLQkJb3ZlcndyaXRlSGFuZGxlciA9IChJT3ZlcndyaXRlSGFuZGxlcikgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9IQU5ETEVSKTsKLQkJaWYgKG51bGwgIT0gb3ZlcndyaXRlSGFuZGxlcikgewotCQkJb3ZlcndyaXRlSGFuZGxlci5zZXRFYXJTYXZlU3RyYXRlZ3kodGhpcyk7Ci0JCX0KLS8vCQlidWlsZFByb2plY3RzTWFwKCk7Ci0JfQotCi0KLQotLy8JLyoqCi0vLwkgKiBDcmVhdGVzIGEgTWFwIG1hcHBpbmcgYXJjaGl2ZSB1cmlzIHRvIHByb2plY3RzIGZvciBhbGwgYXJjaGl2ZXMgaW4gdGhlIGVhciB0aGF0IGltcG9ydGVkIGFzCi0vLwkgKiBwcm9qZWN0cy4KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJvamVjdHNNYXAoKSB7Ci0vLwkJY3JlYXRlZENvbXBvbmVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCUxpc3QgY3JlYXRlZFByb2plY3RzTGlzdCA9IChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotLy8JCUlEYXRhTW9kZWwgaW1wb3J0RE0gPSBudWxsOwotLy8JCUFyY2hpdmUgYW5BcmNoaXZlID0gbnVsbDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNyZWF0ZWRQcm9qZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKLS8vCQkJaW1wb3J0RE0gPSAoSURhdGFNb2RlbCkgY3JlYXRlZFByb2plY3RzTGlzdC5nZXQoaSk7Ci0vLwkJCWFuQXJjaGl2ZSA9IChBcmNoaXZlKSBpbXBvcnRETS5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSk7Ci0vLwkJCWNyZWF0ZWRDb21wb25lbnRzTWFwLnB1dChhbkFyY2hpdmUuZ2V0VVJJKCksIGltcG9ydERNLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpKTsKLS8vCQl9Ci0vLwl9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIGFkZEZpbGVUb0NsYXNzcGF0aChJUHJvamVjdCBwLCBJRmlsZSBmaWxlLCBMaXN0IGNwKSB7Ci0vLwkJaWYgKCFmaWxlLmV4aXN0cygpKQotLy8JCQlyZXR1cm47Ci0vLwotLy8JCS8vIEFzc3VtZSB0aGUgZmlsZSBhbHNvIGNvbnRhaW5zIHRoZSBzb3VyY2UKLS8vCQlJUGF0aCBwYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotLy8JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBwYXRoLCBudWxsLCB0cnVlKTsKLS8vCQlpZiAoIWNwLmNvbnRhaW5zKGVudHJ5KSkKLS8vCQkJY3AuYWRkKGVudHJ5KTsKLS8vCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdFRvQ2xhc3NwYXRoKElQcm9qZWN0IGRlcGVuZGVudCwgSVByb2plY3QgcHJlcmVxLCBMaXN0IGNwKSB7Ci0vLwkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHByZXJlcS5nZXRGdWxsUGF0aCgpLCB0cnVlKTsKLS8vCQlpZiAoIWNwLmNvbnRhaW5zKGVudHJ5KSkKLS8vCQkJY3AuYWRkKGVudHJ5KTsKLS8vCX0KLQotCXByb3RlY3RlZCBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCXJldHVybiAoRUFSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJc2F2ZUZpbGVzKCk7Ci0JCXNhdmVNYW5pZmVzdCgpOwotCQlzYXZlTW9mUmVzb3VyY2VzKCk7Ci0JCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuVXBkYXRpbmdfcHJvamVjdF9jbGFzc3BhdGhfVUlfKTsKLQkJLy91cGRhdGVDb21wb25lbnRDbGFzc3BhdGhzKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlzYXZlQXJjaGl2ZUFzSkFSSW5FQVIoYW5BcmNoaXZlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlQXJjaGl2ZUFzSkFSSW5FQVIoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlhbkFyY2hpdmUuc2F2ZShjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koYW5BcmNoaXZlKSk7Ci0JCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYW5BcmNoaXZlLmdldFVSSSgpLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBuZXdNb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG5ld01vbml0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkgewotCQkJcmV0dXJuIGdldEZpbHRlcigpLnNob3VsZFNhdmUoYUZpbGUuZ2V0VVJJKCksIGdldEFyY2hpdmUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNob3VsZFNhdmUoYUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZExpbmtBc0NvbXBvbmVudFJlZihBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKG51bGwgIT0gZGF0YU1vZGVsKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoYXJjaGl2ZSA9PSAoKElEYXRhTW9kZWwpIGxpc3QuZ2V0KGkpKS5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSkgewotCQlpZiAob3ZlcndyaXRlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpZiAob3ZlcndyaXRlSGFuZGxlci5pc092ZXJ3cml0ZU5vbmUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChzdXBlci5zaG91bGRTYXZlKHVyaSkpICYmIChvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlQWxsKCkgfHwgb3ZlcndyaXRlSGFuZGxlci5pc092ZXJ3cml0ZVJlc291cmNlcygpIHx8IG92ZXJ3cml0ZUhhbmRsZXIuc2hvdWxkT3ZlcndyaXRlKHVyaSkpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCUlGaWxlIGlGaWxlID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJdmFsaWRhdGVFZGl0KGlGaWxlKTsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaUZpbGUpOwotCQl0cnkgewotCQkJYU1hbmlmZXN0LndyaXRlKG91dCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCi0vLwkvKgotLy8JICogUGFyc2UgdGhlIG1hbmlmZXN0IG9mIHRoZSBtb2R1bGUgZmlsZTsgZm9yIGVhY2ggY3AgZW50cnkgMSkgY2FuYW5vbmljYWxpemUgdG8gYSB1cmkgdGhhdAotLy8JICogbG9va3MgbGlrZSB0aGUgZW50cnkgaW4gdGhlIGVhciAyKSBJZiB0aGUgZWFyIGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoYXQgdXJpICh0aGUgZW50cnkgaXMKLS8vCSAqIHZhbGlkKSBhKSBJZiB0aGUgZmlsZSBpcyBhbm90aGVyIHdhcyBibG93biBvdXQgdG8gYSBwcm9qZWN0LCBhZGQgYSBjcCBlbnRyeSBmb3IgYSByZWZlcmVuY2VkCi0vLwkgKiBwcm9qZWN0IGIpIG90aGVyd2lzZSwgYWRkIGEgY3AgZW50cnkgdGhhdCBwb2ludHMgdG8gdGhlIGZpbGUgaW4gdGhlIGVhciBwcm9qZWN0LCBhbmQgY3AKLS8vCSAqIGVudHJpZXMgZm9yIGFsbCBwcmVyZXFzCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RDbGFzc3BhdGgoQXJjaGl2ZSBhbkFyY2hpdmUsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotLy8KLS8vCQlTdHJpbmcgbWVzc2FnZSA9IEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuVXBkYXRpbmdfcHJvamVjdF9jbGFzc3BhdGhfVUlfICsgY29tcG9uZW50LmdldE5hbWUoKTsKLS8vCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLS8vCQlMaXN0IHByb2plY3RDcEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJU2V0IHZpc2l0ZWQgPSBuZXcgSGFzaFNldCgpOwotLy8JCXRyYXZlcnNlQ2xhc3NwYXRocyhjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBhbkFyY2hpdmUsIHByb2plY3RDcEVudHJpZXMsIHZpc2l0ZWQpOwotLy8KLS8vCQl0cnkgewotLy8JCQlpZiAoIXByb2plY3RDcEVudHJpZXMuaXNFbXB0eSgpKQotLy8JCQkJSmVtUHJvamVjdFV0aWxpdGllcy5hcHBlbmRKYXZhQ2xhc3NQYXRoKGNvbXBvbmVudC5nZXRQcm9qZWN0KCksIHByb2plY3RDcEVudHJpZXMpOwotLy8JCQlKZW1Qcm9qZWN0VXRpbGl0aWVzLmZvcmNlQ2xhc3NwYXRoUmVsb2FkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotLy8JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotLy8JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLS8vCQl9Ci0vLwotLy8JfQotCi0vLwkvKgotLy8JICogSWYgeW91IGhhdmUgYSBkZXBlbmRlbmN5IHRvIGEgSkFSIGluIHRoZSBFQVIgcHJvamVjdCwgYW5kIHRoZSBKQVIgZGVwZW5kcyBvbiBhbm90aGVyIEpBUiBpbgotLy8JICogdGhlIEVBUjsgeW91IHdhbnQgdG8gY29tcGlsZSBjbGVhbmx5IGFmdGVyIGltcG9ydCwgc28geW91IG5lZWQgYm90aCB0aG9zZSBKQVJzIG9uIHlvdXIgYnVpbGQKLS8vCSAqIHBhdGgKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VDbGFzc3BhdGhzKElQcm9qZWN0IHAsIEFyY2hpdmUgYW5BcmNoaXZlLCBMaXN0IHByb2plY3RDcEVudHJpZXMsIFNldCB2aXNpdGVkQXJjaGl2ZXMpIHsKLS8vCQl2aXNpdGVkQXJjaGl2ZXMuYWRkKGFuQXJjaGl2ZSk7Ci0vLwkJU3RyaW5nW10gbWFuaWZlc3RDcEVudHJpZXMgPSBhbkFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLS8vCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG1hbmlmZXN0Q3BFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShtYW5pZmVzdENwRW50cmllc1tpXSwgYW5BcmNoaXZlKTsKLS8vCQkJLy8gZW5zdXJlIHRoZSBlbnRyeSBpcyB2YWxpZCBvciBza2lwIHRvIHRoZSBuZXh0Ci0vLwkJCWlmICh1cmkgPT0gbnVsbCkKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQlGaWxlIGFGaWxlID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCWFGaWxlID0gZWFyRmlsZS5nZXRGaWxlKHVyaSk7Ci0vLwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub3RUaGVyZSkgewotLy8JCQl9Ci0vLwkJCWlmIChhRmlsZSA9PSBudWxsIHx8ICFhRmlsZS5pc0FyY2hpdmUoKSB8fCB2aXNpdGVkQXJjaGl2ZXMuY29udGFpbnMoYUZpbGUpKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUFyY2hpdmUgZGVwQXJjaGl2ZSA9IChBcmNoaXZlKSBhRmlsZTsKLS8vCQkJSVByb2plY3QgcHJlcmVxID0gbnVsbDsKLS8vCQkJSVZpcnR1YWxDb21wb25lbnQgZGVwQ29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjcmVhdGVkQ29tcG9uZW50c01hcC5nZXQodXJpKTsKLS8vCQkJaWYgKGRlcENvbXBvbmVudCAhPSBudWxsKQotLy8JCQkJcHJlcmVxID0gZGVwQ29tcG9uZW50LmdldFByb2plY3QoKTsKLS8vCi0vLwkJCWlmIChwcmVyZXEgIT0gbnVsbCkgewotLy8JCQkJYWRkUHJvamVjdFRvQ2xhc3NwYXRoKHAsIHByZXJlcSwgcHJvamVjdENwRW50cmllcyk7Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQlhZGRGaWxlVG9DbGFzc3BhdGgocCwgdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZSh1cmkpLmdldFVuZGVybHlpbmdGaWxlKCksIHByb2plY3RDcEVudHJpZXMpOwotLy8JCQkJdHJhdmVyc2VDbGFzc3BhdGhzKHAsIGRlcEFyY2hpdmUsIHByb2plY3RDcEVudHJpZXMsIHZpc2l0ZWRBcmNoaXZlcyk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbXBvbmVudENsYXNzcGF0aHMoKSB7Ci0vLwkJTGlzdCBqYXJGaWxlcyA9IGdldEVBUkZpbGUoKS5nZXRBcmNoaXZlRmlsZXMoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGphckZpbGVzLmdldChpKTsKLS8vCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjcmVhdGVkQ29tcG9uZW50c01hcC5nZXQoYW5BcmNoaXZlLmdldFVSSSgpKTsKLS8vCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotLy8JCQkJdXBkYXRlUHJvamVjdENsYXNzcGF0aChhbkFyY2hpdmUsIGNvbXBvbmVudCk7Ci0vLwkJfQotLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUpCQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjBmODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUpCQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFSkJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlamJhcmNoaXZlb3BzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVNb2ZSZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fU2F2ZUZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fUHJvamVjdE5hdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9TYXZlTWFuaWZlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fRmlsZU5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX0ZpbGVDb250ZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9FcnJvT2NjdXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9GaWxlc0Zyb21Qcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSQ0hJVkVfT1BFUkFUSU9OX0ludmFsaWRFSkJKYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJDSElWRV9PUEVSQVRJT05fSW52YWxpZEltcG9ydEVKQkphcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUkNISVZFX09QRVJBVElPTl9JbXBvcnRPcGVyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCX0lNUE9SVF9PUEVSQVRJT05fU1RSSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQl9JTVBPUlRfRklMRV9TVFJJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU1QT1JUX01PRlJFU09VUkNFX1NUUklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBPUlRfT1BFUkFUSU9OX1NUUklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9DT1BZSU5HX0ZJTEVTX0ZST01fT1JJR0lOQUxfSkFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lNUE9SVElOR19NT0RVTEVfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBZZXNfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWWVzX1RvX0FsbF9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5jZWxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX2V4cG9ydGluZ19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQl9KYXJfRmlsZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weV9EZXBfSkFSU19VSTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VKQkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUpCQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFiM2ExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUpCQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFSkJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgewotCi0JcHVibGljIEVKQkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSU92ZXJ3cml0ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSU92ZXJ3cml0ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3YjI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0lPdmVyd3JpdGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTYvMjAwMSAzOjEyOjQxIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU92ZXJ3cml0ZUhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PID0gRUpCQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5Ob19VSTsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTID0gRUpCQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5ZZXNfVUk7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuWWVzX1RvX0FsbF9VSTsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9IEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQ2FuY2VsX1VJXzsgCi0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMzoxMzozOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMzoxMzozOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcndyaXRlQWxsKCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMzoxMzozOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcndyaXRlTm9uZSgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc092ZXJ3cml0ZVJlc291cmNlcygpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyByZXNvdXJjZVBhdGgpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRFYXJTYXZlU3RyYXRlZ3koRUFSQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBuZXdFYXJTYXZlU3RyYXRlZ3kpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRFamJTYXZlU3RyYXRlZ3koSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgbmV3RWpiU2F2ZVN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIFJBUiBTYXZlU3RyYXRlZ3kuCi0JICogCi0JICogQHBhcmFtIFJBUlByb2plY3RTYXZlU3RyYXRlZ3lJbXBsCi0JICogICAgICAgICAgICByYXJTYXZlU3RyYXRlZ3kgLSBUaGUgcmFyIHNhdmUgc3RyYXRlZ3kgdG8gc2V0LgotCSAqLwotCXZvaWQgc2V0UkFSU2F2ZVN0cmF0ZWd5KEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIG5ld1JBUlNhdmVTdHJhdGVneSk7Ci0KLQl2b2lkIHNldE92ZXJ3cml0ZUFsbChib29sZWFuIG5ld0FsbFRydWUpOwotCi0Jdm9pZCBzZXRPdmVyd3JpdGVOb25lKGJvb2xlYW4gbmV3Tm9uZVRydWUpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRPdmVyd3JpdGVSZXNvdXJjZXMoYm9vbGVhbiBuZXdPdmVyd3JpdGVSZXNvdXJjZXMpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IG5ld1Byb2plY3QpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDM6MTM6MzggUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRXYXJTYXZlU3RyYXRlZ3koSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgbmV3V2FyU2F2ZVN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTYvMjAwMSAzOjEzOjM4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkT3ZlcndyaXRlKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGNhbiBiZSBjaGVja2VkIG91dC4KLQkgKiAKLQkgKiBAdGhyb3dzIE92ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgdmFsaWRhdGUgZmFpbHMKLQkgKi8KLQl2b2lkIHZhbGlkYXRlRWRpdChJRmlsZSBhRmlsZSkgdGhyb3dzIE92ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGVzIGNhbiBiZSBjaGVja2VkIG91dC4KLQkgKiAKLQkgKiBAdGhyb3dzIE92ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgdmFsaWRhdGUgZmFpbHMKLQkgKi8KLQl2b2lkIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciByZXNvdXJjZVN0YXRlVmFsaWRhdG9yKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTYvMjAwMSAzOjEzOjM4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkT3ZlcndyaXRlV0xQcm9qZWN0KElQcm9qZWN0IGZQcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0ltcG9ydE9wdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9JbXBvcnRPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxZjdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0ltcG9ydE9wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklKMkVFUHJvamVjdFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgcnVsZXMgZm9yIGltcG9ydGluZyBhbiBpbmRpdmlkdWFsIG5lc3RlZCBKQVIgaW4gYW4gRUFSIHByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydE9wdGlvbiBpbXBsZW1lbnRzIElKMkVFUHJvamVjdFR5cGVzIHsKLQkvKioKLQkgKiBQcm9qZWN0IGluZm8gZm9yIHRoZSBpbmRpdmlkdWFsIG1vZHVsZS9KQVIsIG9yIG51bGwgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUKLQkgKiBhcHBsaWNhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIG1vZGVsOwotCi0JLyoqCi0JICogVmFsaWQgb25seSBpZiB0aGUgcHJvamVjdCBpbmZvIGlzIG5vdCBudWxsCi0JICogCi0JICogQHNlZSBJSjJFRVByb2plY3RUeXBlcwotCSAqLwotCXByb3RlY3RlZCBpbnQgcHJvamVjdFR5cGUgPSBJSjJFRVByb2plY3RUeXBlcy5ERUZBVUxUOwotCi0JLyoqCi0JICogQHNlZSBJSjJFRVByb2plY3RUeXBlcyNNT0RVTEUKLQkgKiBAc2VlIElKMkVFUHJvamVjdFR5cGVzI1VUSUwKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGFyY2hpdmVUeXBlID0gSUoyRUVQcm9qZWN0VHlwZXMuTU9EVUxFOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEltcG9ydE9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0T3B0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCXB1YmxpYyBJbXBvcnRPcHRpb24oSURhdGFNb2RlbCBtb2RlbCwgaW50IHR5cGUpIHsKLQkJdGhpcyhtb2RlbCk7Ci0JCXByb2plY3RUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJvamVjdFR5cGUoKSB7Ci0JCXJldHVybiBwcm9qZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJjaGl2ZVR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRBcmNoaXZlVHlwZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcmNoaXZlVHlwZQotCSAqICAgICAgICAgICAgVGhlIGFyY2hpdmVUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlVHlwZShpbnQgYXJjaGl2ZVR5cGUpIHsKLQkJdGhpcy5hcmNoaXZlVHlwZSA9IGFyY2hpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0VHlwZQotCSAqICAgICAgICAgICAgVGhlIHByb2plY3RUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0VHlwZShpbnQgcHJvamVjdFR5cGUpIHsKLQkJdGhpcy5wcm9qZWN0VHlwZSA9IHByb2plY3RUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGUzYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FWFBPUlRfU09VUkNFX0ZJTEVTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1BUSU1JWkVfRk9SX1NQRUNJRklDX1JVTlRJTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTl9CVUlMRDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkxpYkNvcHlCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCXByaXZhdGUgSVBhdGggZGVzdGluYXRpb25QYXRoOwotCXByaXZhdGUgTW9kdWxlRmlsZSBtb2R1bGVGaWxlOwotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRTb3VyY2UgPSBmYWxzZTsKLQotCXB1YmxpYyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIGludCBSRUZSRVNIX1dPUksgPSAxMDA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBKQVZBX0JVSUxERVJfV09SSyA9IDEwMDsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IExJQl9CVUlMREVSX1dPUksgPSAxMDA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBFWFBPUlRfV09SSyA9IDEwMDA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBDTE9TRV9XT1JLID0gMTA7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBTSU5HTEVfUEFSVElDSVBBTlRfV09SSyA9IDIwMDsKLQkKLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVUb3RhbFdvcmsoKSB7Ci0JCWludCB0b3RhbFdvcmsgPSBSRUZSRVNIX1dPUks7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoUlVOX0JVSUxEKSkgewotCQkJdG90YWxXb3JrICs9IEpBVkFfQlVJTERFUl9XT1JLICsgTElCX0JVSUxERVJfV09SSzsKLQkJfQotCQl0b3RhbFdvcmsgKz0gRVhQT1JUX1dPUksgKyBDTE9TRV9XT1JLOwotCQkKLQkJZmluYWwgSURhdGFNb2RlbCBkbSA9IGdldERhdGFNb2RlbCgpOwotCQkKLQkJaWYoIGRtLmdldFByb3BlcnR5KCBPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSApID09IEJvb2xlYW4uVFJVRSApCi0JCXsKLSAgICAJCWZpbmFsIExpc3Q8SUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE+IGV4dGVuc2lvbnMKLSAgICAJCSAgICA9IChMaXN0PElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnREYXRhPikgZG0uZ2V0UHJvcGVydHkoIFJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTICk7Ci0gICAgCQkgICAgCi0gICAgCQl0b3RhbFdvcmsgKz0gZXh0ZW5zaW9ucy5zaXplKCkgKiBTSU5HTEVfUEFSVElDSVBBTlRfV09SSzsKLQkJfQotCQkgICAgCi0JCXJldHVybiB0b3RhbFdvcms7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlzZXRDb21wb25lbnQoKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShDT01QT05FTlQpKTsKLQkJc2V0RGVzdGluYXRpb25QYXRoKG5ldyBQYXRoKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04pKSk7Ci0JCXNldEV4cG9ydFNvdXJjZShtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRVhQT1JUX1NPVVJDRV9GSUxFUykpOwotCQkKLQkJdHJ5Ci0JCXsKLQkJICAgIG1vbml0b3IuYmVnaW5UYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5FeHBvcnRpbmdfYXJjaGl2ZSwgbmV3IE9iamVjdCBbXSB7IGdldERlc3RpbmF0aW9uUGF0aCgpLmxhc3RTZWdtZW50KCkgfSksIGNvbXB1dGVUb3RhbFdvcmsoKSk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0KLSAgICAJCXRyeSB7Ci0gICAgCQkJLy8gZGVmZWN0IDI0MDk5OQotICAgIAkJCWNvbXBvbmVudC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBSRUZSRVNIX1dPUkspKTsKLSAgICAJCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFJVTl9CVUlMRCkpIHsKLSAgICAJCQkJcnVuTmVjZXNzYXJ5QnVpbGRlcnMoY29tcG9uZW50LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIEpBVkFfQlVJTERFUl9XT1JLICsgTElCX0JVSUxERVJfV09SSykpOwotICAgIAkJCX0KLSAgICAJCQlleHBvcnQoKTsKLSAgICAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJaWYobW9kdWxlRmlsZSAhPSBudWxsKXsKLSAgICAJCQkJLy9UaGUgbW9kdWxlIGZpbCB3aWxsIGJlIGNsb3NlZCBpZiB0aGUgZXhwb3J0IHN1Y2NlZWRzCi0gICAgCQkJCS8vTmVlZCB0byBiZSBjYXJlZnVsIG5vdCB0byBjbG9zZSB0aGUgYXJjaGl2ZSB0d2ljZSBiZWNhdXNlIG9mIFJlZmVyZW5jZUNvdW50ZWQgQXJjaGl2ZXMKLSAgICAJCQkJbW9kdWxlRmlsZS5jbG9zZSgpOyAKLSAgICAJCQkJbW9uaXRvci53b3JrZWQoQ0xPU0VfV09SSyk7Ci0gICAgCQkJfQotICAgIAkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oRUpCQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5FcnJvcl9leHBvcnRpbmdfX1VJXyArIGFyY2hpdmVTdHJpbmcoKSwgZSk7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAgICAgICAgIGZpbmFsIElEYXRhTW9kZWwgZG0gPSBnZXREYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGRtLmdldFByb3BlcnR5KCBPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSApID09IEJvb2xlYW4uVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YSBleHREYXRhIAotICAgICAgICAgICAgICAgICAgICAgOiAoTGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4pIGRtLmdldFByb3BlcnR5KCBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElEYXRhTW9kZWxPcGVyYXRpb24gb3AgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGV4dERhdGEuZ2V0UGFydGljaXBhbnQoKS5jcmVhdGVPcGVyYXRpb24oIGV4dERhdGEuZ2V0RGF0YU1vZGVsKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG9wLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIFNJTkdMRV9QQVJUSUNJUEFOVF9XT1JLICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkgICAgbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZXhwb3J0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYXJjaGl2ZVN0cmluZygpOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbmV3UHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG5ld1Byb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBuZXdDb21wb25lbnQpIHsKLQkJY29tcG9uZW50ID0gbmV3Q29tcG9uZW50OwotCX0KLQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCWNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoQ09NUE9ORU5UKTsKLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RGVzdGluYXRpb25QYXRoKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb25QYXRoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlc3RpbmF0aW9uUGF0aChJUGF0aCBuZXdEZXN0aW5hdGlvblBhdGgpIHsKLQkJZGVzdGluYXRpb25QYXRoID0gbmV3RGVzdGluYXRpb25QYXRoOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwb3J0U291cmNlKCkgewotCQlyZXR1cm4gZXhwb3J0U291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEV4cG9ydFNvdXJjZShib29sZWFuIG5ld0V4cG9ydFNvdXJjZSkgewotCQlleHBvcnRTb3VyY2UgPSBuZXdFeHBvcnRTb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kdWxlRmlsZShNb2R1bGVGaWxlIG5ld01vZHVsZUZpbGUpIHsKLQkJbW9kdWxlRmlsZSA9IG5ld01vZHVsZUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuTmVjZXNzYXJ5QnVpbGRlcnMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5ewotCQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgSkFWQV9CVUlMREVSX1dPUksgKyBMSUJfQlVJTERFUl9XT1JLKTsKLQkJCWlmKCFjb21wb25lbnQuaXNCaW5hcnkoKSl7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29tbWFuZCBqYXZhQnVpbGRlciA9IGdldEphdmFDb21tYW5kKGRlc2NyaXB0aW9uKTsKLQkJCQlpZiAoamF2YUJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIEphdmFDb3JlLkJVSUxERVJfSUQsIGphdmFCdWlsZGVyLmdldEFyZ3VtZW50cygpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIEpBVkFfQlVJTERFUl9XT1JLKSk7Ci0JCQkJfQotCQkJCUlDb21tYW5kIGxpYkNvcHlCdWlsZGVyID0gZ2V0TGliQ29weUJ1aWxkZXIoZGVzY3JpcHRpb24pOwotCQkJCWlmIChudWxsICE9IGxpYkNvcHlCdWlsZGVyKSB7Ci0JCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgTGliQ29weUJ1aWxkZXIuQlVJTERFUl9JRCwgbGliQ29weUJ1aWxkZXIuZ2V0QXJndW1lbnRzKCksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgTElCX0JVSUxERVJfV09SSykpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgc3BlY2lmaWMgSmF2YSBjb21tYW5kIGFtb25nc3QgdGhlIGJ1aWxkIHNwZWMgb2YgYSBnaXZlbiBkZXNjcmlwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRKYXZhQ29tbWFuZChJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKEphdmFDb3JlLkJVSUxERVJfSUQpKSB7Ci0JCQkJcmV0dXJuIGNvbW1hbmRzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRMaWJDb3B5QnVpbGRlcihJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKExpYkNvcHlCdWlsZGVyLkJVSUxERVJfSUQpKSB7Ci0JCQkJcmV0dXJuIGNvbW1hbmRzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpIHsKLQkJU2V0IHByb2pzID0gZ2F0aGVyRGVwZW5kZW50UHJvamVjdHMoZ2V0Q29tcG9uZW50KCksIG5ldyBIYXNoU2V0KCkpOwotCQlJU2NoZWR1bGluZ1J1bGUgY29tYmluZWRSdWxlID0gbnVsbDsKLQkJSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvanMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBpdGVyLm5leHQoKTsKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShwcm9qKTsKLQkJCWNvbWJpbmVkUnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKHJ1bGUsIGNvbWJpbmVkUnVsZSk7Ci0JCX0KLQkJY29tYmluZWRSdWxlID0gTXVsdGlSdWxlLmNvbWJpbmUocnVsZUZhY3RvcnkuYnVpbGRSdWxlKCksIGNvbWJpbmVkUnVsZSk7Ci0KLQkJcmV0dXJuIGNvbWJpbmVkUnVsZTsKLQl9Ci0KLQlwcml2YXRlIFNldCBnYXRoZXJEZXBlbmRlbnRQcm9qZWN0cyhJVmlydHVhbENvbXBvbmVudCBjb21wLCBTZXQgcHJvanMpIHsKLQkJaWYgKCFwcm9qcy5jb250YWlucyhjb21wLmdldFByb2plY3QoKSkpIHsKLQkJCXByb2pzLmFkZChjb21wLmdldFByb2plY3QoKSk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZkNvbXAgPSByZWZzW2ldOwotCQkJCXByb2pzLmFkZEFsbChnYXRoZXJEZXBlbmRlbnRQcm9qZWN0cyhyZWZDb21wLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgcHJvanMpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvanM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmVUb1NhdmUsIFN0cmluZyBmaWxlTmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uICB7Ci0JCVN0cmluZyB3cml0ZUZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCUZpbGUgd3JpdGVGaWxlID0gbmV3IEZpbGUod3JpdGVGaWxlTmFtZSk7Ci0JCWlmICh3cml0ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCXdyaXRlRmlsZS5kZWxldGUoKTsKLQkJfQotCQlJUGF0aCBvdXRwdXRQYXRoID0gbmV3IFBhdGgod3JpdGVGaWxlTmFtZSk7Ci0JCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIgPSBhcmNoaXZlVG9TYXZlLmdldExvYWRBZGFwdGVyKCk7Ci0JCWlmKGxvYWRBZGFwdGVyIGluc3RhbmNlb2YgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKXsKLQkJCUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciBjTG9hZEFkYXB0ZXIgPSAoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKWxvYWRBZGFwdGVyOwotCQkJY0xvYWRBZGFwdGVyLnNldEV4cG9ydFNvdXJjZShnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoRVhQT1JUX1NPVVJDRV9GSUxFUykpOwotCQkJCi0JCX0KLQkJSUFyY2hpdmVGYWN0b3J5LklOU1RBTkNFLnNhdmVBcmNoaXZlKGFyY2hpdmVUb1NhdmUsIG91dHB1dFBhdGgsIG1vbml0b3IpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4YWFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldGVFdyYXBwZWRFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNhcmNoaXZlV3JhcHBlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBtb2R1bGVGaWxlOwotCXByb3RlY3RlZCBBcmNoaXZlV3JhcHBlciBhcmNoaXZlV3JhcHBlcjsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudDsKLQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBpbmZvOwotCXByb3RlY3RlZCBmaW5hbCBpbnQgUFJPSkVDVF9DUkVBVElPTl9XT1JLID0gMzA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUFyY2hpdmVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gSUFyY2hpdmVGYWN0b3J5LklOU1RBTkNFOwotCi0JcHVibGljIEoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhbkluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKLQkJCXRoaXMuaW5mbyA9IGFuSW5mbzsKLQkJCW1vZHVsZUZpbGUgPSAoQXJjaGl2ZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpOwotCQkJYXJjaGl2ZVdyYXBwZXIgPSAoQXJjaGl2ZVdyYXBwZXIpbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuSW1wb3J0aW5nX2FyY2hpdmUsIG5ldyBPYmplY3QgW10geyBhcmNoaXZlV3JhcHBlci5nZXRQYXRoKCkgfSksIGNvbXB1dGVUb3RhbFdvcmsoKSk7Ci0JCQlkb0V4ZWN1dGUobW9uaXRvcik7Ci0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAodmlydHVhbENvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGUodmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5yZXN1bWVVcGRhdGVzKCk7Ci0JCQkJbW9kZWwuZGlzcG9zZSgpOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb21wdXRlVG90YWxXb3JrKCkgewotCQlyZXR1cm4gUFJPSkVDVF9DUkVBVElPTl9XT1JLICsgYXJjaGl2ZVdyYXBwZXIuZ2V0U2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Qgc2hvdWxkIGFsc28gb3ZlcnJpZGUge0BsaW5rICNjb21wdXRlVG90YWxXb3JrKCl9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgUFJPSkVDVF9DUkVBVElPTl9XT1JLKTsKLQkJdmlydHVhbENvbXBvbmVudCA9IGNyZWF0ZVZpcnR1YWxDb21wb25lbnQobmVzdGVkTW9kZWwsIHN1Yk1vbml0b3IpOwotCi0JCXRyeSB7Ci0JCQlpbXBvcnRNb2R1bGVGaWxlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgYXJjaGl2ZVdyYXBwZXIuZ2V0U2l6ZSgpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZVZpcnR1YWxDb21wb25lbnQoSURhdGFNb2RlbCBhTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIHNhdmUgc3RyYXRlZ3kuIFN1YmNsYXNlcyBzaG91bGQgb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUKLQkgKiBhcHByb3ByaWF0ZSBzYXZlIHN0YXJ0ZWd5IGZvciB0aGUga2luZCBvZiBKMkVFIG1vZHVsZSBwcm9qZWN0IHRvIGltcG9ydCB0aGUgYXJjaGl2ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IHZjKTsKLQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeVN0cmF0ZWd5KFNhdmVTdHJhdGVneSBzYXZlU3RyYXQpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBnZXRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCl7Ci0JCXJldHVybiBuZXcgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCX0KLQotCS8qKgotCSAqIHBlcmZvcm0gdGhlIGFyY2hpdmUgaW1wb3J0IG9wZXJhdGlvbgotCSAqIAotCSAqIEB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW1wb3J0TW9kdWxlRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCBhcmNoaXZlV3JhcHBlci5nZXRTaXplKCkpOwotCQkJaWYoYXJjaGl2ZVdyYXBwZXIuZ2V0SUFyY2hpdmUoKSAhPSBudWxsKXsKLQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gYXJjaGl2ZVdyYXBwZXIuZ2V0SUFyY2hpdmUoKTsKLQkJCQlDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgYWRhcCA9IGdldEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQkJCQlBcmNoaXZlT3B0aW9ucyBzYXZlT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJCXNhdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5TQVZFX0FEQVBURVIsIGFkYXApOwotCQkJCWFyY2hpdmVGYWN0b3J5LnNhdmVBcmNoaXZlKGFyY2hpdmUsIHNhdmVPcHRpb25zLG1vbml0b3IpOwotCQkJfWVsc2V7Ci0JCQkJQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBhU3RyYXRlZ3kgPSAoQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCkgY3JlYXRlU2F2ZVN0cmF0ZWd5KHZpcnR1YWxDb21wb25lbnQpOwotCQkJCWFTdHJhdGVneS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQkJYVN0cmF0ZWd5LnNldE92ZXJ3cml0ZUhhbmRsZXIoKElPdmVyd3JpdGVIYW5kbGVyKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0hBTkRMRVIpKTsKLQkJCQlhU3RyYXRlZ3kuc2V0RGF0YU1vZGVsKG1vZGVsKTsKLQkJCQltb2RpZnlTdHJhdGVneShhU3RyYXRlZ3kpOwotCQkJCWFyY2hpdmVXcmFwcGVyLmdldENvbW1vbkFyY2hpdmUoKS5zYXZlKGFTdHJhdGVneSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbiBvZSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFdGVFdyYXBwZWRFeGNlcHRpb24oZXgsIEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuRVJST1JfSU1QT1JUSU5HX01PRFVMRV9GSUxFKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTYwM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEoyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbHsKLQotCXB1YmxpYyBKMkVFQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIoY29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIEoyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQlzdXBlcihjb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCXN1cGVyLmdldEZpbGVzKCk7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJYWRkTWFwcGVkQ2xhc3NGb2xkZXJzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKTsKLQkJfQotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjdkNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERPVF9DTEFTUyA9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBJTVBPUlRFRF9DTEFTU0VTID0gIkltcG9ydGVkQ2xhc3NlcyI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUZpbGVzKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZUZpbGVzKCk7Ci0JCWxpbmtJbXBvcnRlZENsYXNzZXNGb2xkZXJJZk5lY2Vzc2FyeSgpOwotCQl0cnkgewotCQkJdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmRzV2l0aENsYXNzVHlwZShTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCWlmIChhRmlsZU5hbWUuZW5kc1dpdGgoRE9UX0NMQVNTKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShGaWxlIGFGaWxlKSB7Ci0JCWlmIChlbmRzV2l0aENsYXNzVHlwZShhRmlsZS5nZXRVUkkoKSkpewotCQkJYm9vbGVhbiBzaG91bGRTYXZlID0gaXNDbGFzc1dpdGhvdXRTb3VyY2UoYUZpbGUpOwotCQkJaWYoc2hvdWxkU2F2ZSAmJiAhaW1wb3J0ZWRDbGFzc2VzRm9sZGVyQ3JlYXRlZCl7Ci0JCQkJY3JlYXRlSW1wb3J0ZWRDbGFzc2VzRm9sZGVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2hvdWxkU2F2ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuc2hvdWxkU2F2ZShhRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCXZhbGlkYXRlRWRpdChpRmlsZSk7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGlGaWxlKTsKLQkJdHJ5IHsKLQkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydGVkQ2xhc3Nlc0ZvbGRlckNyZWF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSUZvbGRlciBpbXBvcnRlZENsYXNzZXNGb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbXBvcnRlZENsYXNzZXNGb2xkZXIoKSB7Ci0JCWltcG9ydGVkQ2xhc3Nlc0ZvbGRlckNyZWF0ZWQgPSB0cnVlOwotCQlJQ29udGFpbmVyIGphclBhcmVudCA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRQYXJlbnQoKTsKLQkJaW1wb3J0ZWRDbGFzc2VzRm9sZGVyID0gamFyUGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChJTVBPUlRFRF9DTEFTU0VTKSk7Ci0JCXRyeSB7Ci0JCQlpbXBvcnRlZENsYXNzZXNGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxpbmtJbXBvcnRlZENsYXNzZXNGb2xkZXJJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGltcG9ydGVkQ2xhc3Nlc0ZvbGRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihnZXRJbXBvcnRlZENsYXNzZXNSdW50aW1lUGF0aCgpKS5jcmVhdGVMaW5rKGltcG9ydGVkQ2xhc3Nlc0ZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIDAsIG51bGwpOwotCQkJCWlmIChzaG91bGRBZGRJbXBvcnRlZENsYXNzZXNUb0NsYXNzcGF0aCgpKSB7Ci0JCQkJCWlmIChKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gamF2YUNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3SmF2YUNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbamF2YUNsYXNzcGF0aC5sZW5ndGggKyAxXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoamF2YUNsYXNzcGF0aCwgMCwgbmV3SmF2YUNsYXNzcGF0aCwgMCwgamF2YUNsYXNzcGF0aC5sZW5ndGgpOwotCQkJCQkJbmV3SmF2YUNsYXNzcGF0aFtuZXdKYXZhQ2xhc3NwYXRoLmxlbmd0aCAtIDFdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGltcG9ydGVkQ2xhc3Nlc0ZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdKYXZhQ2xhc3NwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEltcG9ydGVkQ2xhc3Nlc1RvQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0SW1wb3J0ZWRDbGFzc2VzUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aCgiLyIpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRPdXRwdXRQYXRoRm9yRmlsZShGaWxlIGFGaWxlKSB7Ci0JCWlmKGVuZHNXaXRoQ2xhc3NUeXBlKGFGaWxlLmdldFVSSSgpKSl7Ci0JCQlyZXR1cm4gaW1wb3J0ZWRDbGFzc2VzRm9sZGVyLmdldEZpbGUoZ2V0SW1wb3J0ZWRDbGFzc2VzVVJJKGFGaWxlKSkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRPdXRwdXRQYXRoRm9yRmlsZShhRmlsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW1wb3J0ZWRDbGFzc2VzVVJJKEZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGFGaWxlLmdldFVSSSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NXaXRob3V0U291cmNlKEZpbGUgYUZpbGUpIHsKLQkJU3RyaW5nIGphdmFVcmkgPSBBcmNoaXZlVXRpbC5jbGFzc1VyaVRvSmF2YVVyaShhRmlsZS5nZXRVUkkoKSk7Ci0JCWlmIChqYXZhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAhYXJjaGl2ZS5jb250YWluc0ZpbGUoamF2YVVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFSW1wb3J0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVJbXBvcnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmOGFmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVJbXBvcnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRUltcG9ydENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JURURfSkFSX1NVRkZJWCA9ICIuaW1wb3J0ZWRfY2xhc3Nlcy5qYXIiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTI5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBKMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhkYTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIENvbXBvbmVudExvYWRTdHJhdGVneUltcGwgewotCi0JcHVibGljIEphdmFDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50LCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCXN1cGVyLmdldEZpbGVzKCk7Ci0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQkJYWRkTWFwcGVkQ2xhc3NGb2xkZXJzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKTsKLQkJfQotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0phdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0phdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjk3MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgewotCi0JcHVibGljIEphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKLQkJc3VwZXIodkNvbXBvbmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL092ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmNGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8xNi8yMDAxIDY6MDc6MzUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE92ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBXYXJuaW5nIGNsZWFuLXVwIDEyLzA1LzIwMDUKLSAgICAgKi8gICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjUxODM2Njk0MzkxNjQxOTMwTDsKLQotCS8qKgotCSAqIE92ZXJ3cml0ZUhhbmRsZXJFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVyd3JpdGVIYW5kbGVyRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgT3ZlcndyaXRlSGFuZGxlckV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYjI5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwcmVwYXJlQWxsUElJLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS8sXAotICAgICAgICAgICAgICAgcHJlZmVyZW5jZXMuaW5pCi1zb3VyY2UuLiA9IGoyZWVwbHVnaW4vLFwKLSAgICAgICAgICAgY29tbW9uLyxcCi0gICAgICAgICAgIGNvbW1vbmVkaXQvLFwKLSAgICAgICAgICAgZWFycHJvamVjdC8sXAotICAgICAgICAgICBqMmVlY3JlYXRpb24vLFwKLSAgICAgICAgICAgYXJjaGl2ZW9wcy8sXAotICAgICAgICAgICBhcHBsaWNhdGlvbmVkaXQvLFwKLSAgICAgICAgICAgYXBwY2xpZW50Y3JlYXRpb24vLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgcmVmYWN0b3IvLFwKLSAgICAgICAgICAgY2xhc3NwYXRoZGVwLyxcCi0gICAgICAgICAgIGNvbnRlbnR0eXBlLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gcm9zZS8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwM2ZjMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogQkVBIFN5c3RlbXMsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIENvbnRhaW5zIHV0aWxpdHkgY29kZSBmb3Igd29ya2luZyBtYW5pcHVsYXRpbmcgdGhlIFdUUCBjbGFzc3BhdGggY29tcG9uZW50Ci0gKiBkZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aERlcGVuZGVuY3lVdGlsIGltcGxlbWVudHMgSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMgewotCQotCS8qKgotCSAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdCwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKTsKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUpfQotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHVucmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0IHRoYXQKLQkgKiBoYXZlIHRoZSBzcGVjaWFsIFdUUCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlLgotCSAqICAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QgSmF2YSBwcm9qZWN0IHdob3NlIGNvbXBvbmVudCBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIGFyZSBiZWluZyByZXRyaWV2ZWQuCi0JICogQHBhcmVtIGF0dHJpYnV0ZVR5cGUgdGhlIGF0dHJpYnV0ZSB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiBNYXAgZnJvbSBJQ2xhc3NwYXRoRW50cnkgdG8gSUNsYXNzcGF0aEF0dHJpYnV0ZSBmb3IgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5LgotCSAqIEByZXR1cm4gSUNsYXNzcGF0aEVudHJpZXMgd2l0aCB0aGUgc3BlY2lhbCBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBhY2Nlc3NpbmcgdGhlIHVucmVzb2x2ZWQgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlIGF0dHJpYnV0ZVR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJZmluYWwgTWFwIHJlZmVyZW5jZWRSYXdFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IGNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShlbnRyeSwgYXR0cmlidXRlVHlwZSk7Ci0gICAgICAgICAgICBpZiAoYXR0cmliICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlyZWZlcmVuY2VkUmF3RW50cmllcy5wdXQoZW50cnksIGF0dHJpYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRSYXdFbnRyaWVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHVucmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0IHRoYXQKLQkgKiBjb3VsZCBwb3RlbnRpYWxseSBiZSBtYXBwZWQgaW50byB0aGUgdmlydHVhbCBjb21wb25lbnQgdHJlZSBmb3IgdGhlIHByb2plY3QgdmlhCi0JICogdGhlIHNwZWNpYWwgV1RQIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jZSBhdHRyaWJ1dGUuIENsYXNzcGF0aCBlbnRyaWVzIHRoYXQKLQkgKiBjdXJyZW50bHkgaGF2ZSB0aGUgYXR0cmlidXRlIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgKEBzZWUge0BsaW5rICNnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoSUphdmFQcm9qZWN0LCBib29sZWFuKX0pCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IEphdmEgcHJvamVjdCB3aG9zZSBwb3RlbnRpYWwgY29tcG9uZW50IGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZXRyaWV2ZWQuCi0JICogQHJldHVybiBMaXN0IG9mIHJhdyBJQ2xhc3NwYXRoRW50cmllcyBmb3IgcG90ZW50aWFsIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQb3RlbnRpYWxDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIExpc3QgcG90ZW50aWFsUmF3RW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCB8fCAhamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlmaW5hbCBib29sZWFuIGlzV2ViQXBwID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCQlmaW5hbCBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YSBkYXRhID0gbmV3IENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhKHByb2plY3QpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChhdHRyaWIgIT0gbnVsbCkgewotICAgICAgICAgICAgCWNvbnRpbnVlOyAvLyBhbHJlYWR5IGhhcyB0aGUgYXR0cmlidXRlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgCS8vIGNoZWNrIHZhbGlkYXRpb24gbG9naWMgZm9yIGVudHJ5Ci0gICAgICAgICAgICAJLy8gYWx3YXlzIG1hcmsgdGhlICJpc1dlYkFwcCIgcGFyYW0gYXMgdHJ1ZSBzbyB0aGF0IHdlIGdldCBib3RoIGV4cG9ydGVkIGFuZCBub24tZXhwb3J0ZWQgZW50cmllczsgZm9yIG5vbi13ZWIgcHJvamVjdHMsCi0gICAgICAgICAgICAJLy8gd2FudCB0byBsZXQgYSB1c2VyIGhhdmUgdGhlIG9wdGlvbiB0byBzZWUgYW5kIHNlbGVjdCB0aGUgbm9uLWV4cG9ydGVkIGVudHJpZXMgYW5kIHRoZW4ganVzdCBnZW5lcmF0ZSBhIHZhbGlkYXRpb24KLSAgICAgICAgICAgIAkvLyBlcnJvciBpZiB0aGV5IGhhcHBlbiB0byBzZWxlY3Qgb25lLgotICAgICAgICAgICAgCWZpbmFsIElNZXNzYWdlW10gbXNncyA9IENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IudmFsaWRhdGVWaXJ0dWFsQ29tcG9uZW50RW50cnkoZW50cnksIG51bGwsIHRydWUsIHByb2plY3QsIGRhdGEpOwotICAgICAgICAgICAgCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IG1zZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIAkJaWYgKG1zZ3Nbal0uZ2V0U2V2ZXJpdHkoKSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSB7Ci0gICAgICAgICAgICAJCQllcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAJCQlicmVhazsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAlpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIAkJY29udGludWU7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmIChJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgPT0gZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQkJZmluYWwgYm9vbGVhbiBpc0ZpbGUgPSAhQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKLQkJCQkJaWYgKGlzRmlsZSkgewotCQkJCQkJYm9vbGVhbiBmb3VuZEVudHJ5ID0gZmFsc2U7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQkJCWlmIChpc1dlYkFwcCkgeyAvLyBjaGVja3MgZm9yIHdlYiBsaWJzCi0JCQkJCQkJSUNvbnRhaW5lcltdIHdlYkxpYkZvbGRlcnMgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihXRUJfSU5GX0xJQl9QQVRIKS5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotCQkJCQkJCWZvciAoSUNvbnRhaW5lciB3ZWJMaWIgOiB3ZWJMaWJGb2xkZXJzKSB7Ci0JCQkJCQkJCUlQYXRoIHdlYkxpYkZvbGRlclBhdGggPSB3ZWJMaWIuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQkJaWYgKHdlYkxpYkZvbGRlclBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkpKSB7Ci0JCQkJCQkJCQlmb3VuZEVudHJ5ID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmb3VuZEVudHJ5KSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGNoZWNrcyBmb3IgbWFuaWZlc3QgcmVmZXJlbmNlcwotCQkJCQkJTGlzdCBtYW5pZmVzdFJlZnMgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXRNYW5pZmVzdFJlZmVyZW5jZXMoY29tcG9uZW50LCBudWxsKTsKLQkJCQkJCWlmKG1hbmlmZXN0UmVmcyAhPSBudWxsKXsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1hbmlmZXN0UmVmcy5zaXplKCk7IGorKykgewotCQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIG1hbmlmZXN0UmVmcy5nZXQoaik7Ci0JCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJCQlpZiAoYy5pc0JpbmFyeSgpKSB7Ci0JCQkJCQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjOwotCQkJCQkJCQkJSUZpbGUgZmlsZSA9IGFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAoZmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7Ci0JCQkJCQkJCQkJCWZvdW5kRW50cnkgPSB0cnVlOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGZvdW5kRW50cnkpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2tzIGZvciBlYXIgbGlicmFyeS1kaXJlY3RvcnkgZW50cmllcwotCQkJCQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQkJCQkJZm9yIChJUHJvamVjdCBlYXJQcm9qZWN0IDogZWFyUHJvamVjdHMpIHsKLQkJCQkJCQlTdHJpbmcgZWFyRERWZXJzaW9uID0gRWFyVXRpbGl0aWVzLmdldEoyRUVERFByb2plY3RWZXJzaW9uKGVhclByb2plY3QpOwotCQkJCQkJCWlmKCFlYXJERFZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpICYmICFlYXJERFZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpICYmICFlYXJERFZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQpKSB7Ci0JCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwotCQkJCQkJCQlBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pIE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZWFyQ29tcG9uZW50KS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJCQlTdHJpbmcgbGliRGlyID0gYXBwLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCQkJCQkJaWYgKGxpYkRpciA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyBsaWIgaXMgdGhlIGRlZmF1bHQgaWYgbm8gbGlicmFyeS1kaXJlY3RvcnkgaXMgc2V0Ci0JCQkJCQkJCQlsaWJEaXIgPSAibGliIjsKLQkJCQkJCQkJfQotCQkJCQkJCQlJQ29udGFpbmVyW10gZWFyTGliRm9sZGVycyA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKGxpYkRpcikpLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCQkJCQkJCWZvciAoSUNvbnRhaW5lciBlYXJMaWIgOiBlYXJMaWJGb2xkZXJzKSB7Ci0JCQkJCQkJCQlJUGF0aCBlYXJMaWJGb2xkZXJQYXRoID0gZWFyTGliLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQkJCQlpZiAoZWFyTGliRm9sZGVyUGF0aC5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKSkpIHsKLQkJCQkJCQkJCQlmb3VuZEVudHJ5ID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoZm91bmRFbnRyeSkgewotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZm91bmRFbnRyeSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotICAgICAgICAgICAgCQotICAgICAgICAgICAgCS8vIGVudHJ5IGNhbiBwb3RlbnRpYWxseSBiZSB0YWdnZWQgYXMgYSBjb21wb25lbnQgZGVwZW5kZW5jeQotICAgICAgICAgICAgCXBvdGVudGlhbFJhd0VudHJpZXMuYWRkKGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG90ZW50aWFsUmF3RW50cmllczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIsIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHAsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhIGRhdGEpIHsKLQkJZmluYWwgSU1lc3NhZ2VbXSBtc2dzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci52YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShlbnRyeSwgYXR0cmliLCBpc1dlYkFwcCwgcHJvamVjdCwgZGF0YSk7Ci0JCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1zZ3MubGVuZ3RoOyBqKyspIHsKLQkJCWlmIChtc2dzW2pdLmdldFNldmVyaXR5KCkgPT0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgewotCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCByZXNvbHZlZCBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIHNwZWNpZmllZCBKYXZhIHByb2plY3QgdGhhdAotCSAqIGhhdmUgb25lIG9mIHRoZSBzcGVjaWFsIFdUUCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlcyBhbmQgcGFzcyB0aGUgc2V0IG9mIHJ1bGVzCi0JICogdGhhdCBnb3Zlcm4gdmFsaWQgY2xhc3NwYXRoIGRlcGVuZGVuY2llcy4KLQkgKiAgCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IEphdmEgcHJvamVjdCB3aG9zZSBjb21wb25lbnQgY2xhc3NwYXRoIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgcmV0cmlldmVkLgotCSAqIEBwYXJhbSBpc1dlYkFwcCBUcnVlIGlmIHRoZSB0YXJnZXQgcHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYSB3ZWIgcHJvamVjdC4KLQkgKiBAcmV0dXJuIE1hcCBmcm9tIElDbGFzc3BhdGhFbnRyeSB0byBJQ2xhc3NwYXRoQXR0cmlidXRlIGZvciBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGFjY2Vzc2luZyB0aGUgdW5yZXNvbHZlZCBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgYm9vbGVhbiBpc1dlYkFwcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0LCBpc1dlYkFwcCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0IHRoYXQKLQkgKiBoYXZlIG9uZSBvZiB0aGUgc3BlY2lhbCBXVFAgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZXMuCi0JICogIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBKYXZhIHByb2plY3Qgd2hvc2UgY29tcG9uZW50IGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIHJldHJpZXZlZC4KLQkgKiBAcGFyYW0gaXNXZWJBcHAgVHJ1ZSBpZiB0aGUgdGFyZ2V0IHByb2plY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgd2ViIHByb2plY3QuCi0JICogQHBhcmFtIG9ubHlWYWxpZCBJZiB0cnVlLCBvbmx5IHZhbGlkIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJldHVybmVkLiBJZiBmYWxzZSwgdGhlIHJhdyBlbnRyeSBtdXN0IGJlIHZhbGlkIGJ1dCB0aGUKLQkgKiByZXNvbHZlZCBjYW4gYmUgaW52YWxpZC4gCi0JICogQHJldHVybiBNYXAgZnJvbSBJQ2xhc3NwYXRoRW50cnkgdG8gSUNsYXNzcGF0aEF0dHJpYnV0ZSBmb3IgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBhY2Nlc3NpbmcgdGhlIHVucmVzb2x2ZWQgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHAsIGZpbmFsIGJvb2xlYW4gb25seVZhbGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvckRhdGEgZGF0YSA9IG5ldyBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkKLQkJLy8gZ2V0IHRoZSByYXcgZW50cmllcwotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSk7Ci0JCWZpbmFsIE1hcCB2YWxpZFJhd0VudHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGZpbHRlciBvdXQgbm9uLXZhbGlkIHJlZmVyZW5jZWQgcmF3IGVudHJpZXMKLQkJZmluYWwgSXRlcmF0b3IgaSA9IHJlZmVyZW5jZWRSYXdFbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgaS5uZXh0KCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IChJQ2xhc3NwYXRoQXR0cmlidXRlKSByZWZlcmVuY2VkUmF3RW50cmllcy5nZXQoZW50cnkpOwotCQkJaWYgKGlzVmFsaWQoZW50cnksIGF0dHJpYiwgaXNXZWJBcHAsIGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgZGF0YSkpIHsKLQkJCQl2YWxpZFJhd0VudHJpZXMucHV0KGVudHJ5LCBhdHRyaWIpOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgd2UgaGF2ZSBubyB2YWxpZCByYXcgZW50cmllcywgcmV0dXJuIGVtcHR5IG1hcAotCQlpZiAodmFsaWRSYXdFbnRyaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCi0JCS8vIFhYWCBXb3VsZCBsaWtlIHRvIHJlcGxhY2UgdGhlIGNvZGUgYmVsb3cgd2l0aCB1c2Ugb2YgYSBwdWJsaWMgSkRUIEFQSSB0aGF0IHJldHVybnMKLQkJLy8gdGhlIHJhdyBJQ2xhc3NwYXRoRW50cnkgZm9yIGEgZ2l2ZW4gcmVzb2x2ZWQgSUNsYXNzcGF0aEVudHJ5IChzZWUgc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM5OTUpCi0JCS8vIFRoZSBjb2RlIG11c3QgY3VycmVudGx5IGxldmVyYWdlIElQYWNrYWdlRnJhZ21lbnRSb290IHRvIGRldGVybWluZSB0aGlzCi0JCS8vIG1hcHBpbmcgYW5kLCBiZWNhdXNlIElQYWNrYWdlRnJhZ21lbnRSb290cyBkbyBub3QgbWFpbnRhaW4gSUNsYXNzcGF0aEVudHJ5IGRhdGEsIGEgcHJpb3IKLQkJLy8gY2FsbCBpcyBuZWVkZWQgdG8gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSBhbmQgdGhlIHJlc29sdmVkIElDbGFzc3BhdGhFbnRyaWVzIGhhdmUgdG8gYmUgc3RvcmVkIGluIGEgTWFwIGZyb20gSVBhdGgtdG8tSUNsYXNzcGF0aEVudHJ5IHRvCi0JCS8vIHN1cHBvcnQgcmV0cmlldmFsIHVzaW5nIHRoZSByZXNvbHZlZCBJUGFja2FnZUZyYWdtZW50Um9vdAotCQkKLQkJLy8gcmV0cmlldmUgdGhlIHJlc29sdmVkIGNsYXNzcGF0aAotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCWZpbmFsIE1hcCBwYXRoVG9SZXNvbHZlZEVudHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCS8vIHN0b3JlIGluIGEgbWFwIGZyb20gcGF0aCB0byBlbnRyeQotCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCXBhdGhUb1Jlc29sdmVkRW50cnkucHV0KGVudHJpZXNbal0uZ2V0UGF0aCgpLCBlbnRyaWVzW2pdKTsKLQkJfQotCi0JCWZpbmFsIE1hcCByZWZlcmVuY2VkRW50cmllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCQotCQkvLyBncmFiIGFsbCBJUGFja2FnZUZyYWdtZW50Um9vdHMKLQkJCi0JCS8vIFRPRE8gdGhpcyBpZ25vcmVzIHByb2plY3QgY3AgZW50cmllczsgY2FuIGVhc2lseSBhZGQgaW4gdGhlIHJhdyBwcm9qZWN0IGNwIGVudHJpZXMsIGhvd2V2ZXIsIGRvIG5vdCBoYXZlIGEgZ29vZCB3YXkgdG8gCi0JCS8vIG1hcCBwcm9qZWN0IGNwIGVudHJpZXMgcmVzb2x2ZWQgZnJvbSBjcCBjb250YWluZXJzIGJhY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmF3IGVudHJ5IChhbmQgdGhlcmVieSBkZXRlcm1pbmUgaWYgdGhlCi0JCS8vIGVudHJ5IGhhcyB0aGUgcHVibGlzaC9leHBvcnQgYXR0cmlidXRlKQotCQkKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdHMubGVuZ3RoOyBqKyspIHsKLQkJCWZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tqXTsKLQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSByYXdFbnRyeSA9IHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLQkJCQotCQkJLy8gaXMgdGhlIHJhdyBlbnRyeSB2YWxpZD8KLQkJCUlDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gKElDbGFzc3BhdGhBdHRyaWJ1dGUpIHZhbGlkUmF3RW50cmllcy5nZXQocmF3RW50cnkpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIElQYXRoIHBrZ0ZyYWdQYXRoID0gcm9vdC5nZXRQYXRoKCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIHBhdGhUb1Jlc29sdmVkRW50cnkuZ2V0KHBrZ0ZyYWdQYXRoKTsKLQkJCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgcmVzb2x2ZWRBdHRyaWIgPSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUocmVzb2x2ZWRFbnRyeSk7Ci0JCQkvLyBhdHRyaWJ1dGUgZm9yIHRoZSByZXNvbHZlZCBlbnRyeSBtdXN0IGVpdGhlciBiZSB1bnNwZWNpZmllZCBvciBpdCBtdXN0IGJlIHRoZQotCQkJLy8gZGVwZW5kZW5jeSBhdHRyaWJ1dGUgZm9yIGl0IHRvIGJlIGluY2x1ZGVkCi0JCQlpZiAocmVzb2x2ZWRBdHRyaWIgPT0gbnVsbCB8fCByZXNvbHZlZEF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKENMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSkpIHsKLQkJCQkvLyBmaWx0ZXIgb3V0IHJlc29sdmVkIGVudHJ5IGlmIGl0IGRvZXNuJ3QgcGFzcyB0aGUgdmFsaWRhdGlvbiBydWxlcwotCQkJCWlmICghb25seVZhbGlkIHx8IGlzVmFsaWQocmVzb2x2ZWRFbnRyeSwgcmVzb2x2ZWRBdHRyaWIgIT0gbnVsbD9yZXNvbHZlZEF0dHJpYjphdHRyaWIsaXNXZWJBcHAsIGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgZGF0YSkpIHsKLQkJCQkJaWYgKHJlc29sdmVkQXR0cmliICE9IG51bGwpIHsKLQkJCQkJCS8vIGlmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgc3ViLWVudHJ5LCB1c2UgdGhhdAotCQkJCQkJYXR0cmliID0gcmVzb2x2ZWRBdHRyaWI7Ci0JCQkJCX0KLQkJCQkJcmVmZXJlbmNlZEVudHJpZXMucHV0KHJlc29sdmVkRW50cnksIGF0dHJpYik7Ci0JCQkJfQotCQkJfSAKLQkJfQotCQkKLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRFbnRyaWVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxvY2F0aW9uIChhcyBhIGFic29sdXRlIGZpbGUgc3lzdGVtIHBhdGgpIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aCBlbnRyeS4KLQkgKiBAcGFyYW0gZW50cnkgQ2xhc3NwYXRoIGVudHJ5LiBJZiBudWxsLCByZXR1cm5zIG51bGwuCi0JICogQHJldHVybiBBYnNvbHV0ZSBmaWxlIHN5c3RlbSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RW50cnlMb2NhdGlvbihmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWwgSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQlJUGF0aCBlbnRyeUxvY2F0aW9uID0gZW50cnlQYXRoOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZW50cnlQYXRoKTsJCQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZW50cnlMb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVudHJ5TG9jYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgSVJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggZW50cnkgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCByZXByZXNlbnQgYSBXb3Jrc3BhY2UgcmVzb3VyY2UuCi0JICogQHBhcmFtIGVudHJ5IENsYXNzcGF0aCBlbnRyeS4gSWYgbnVsbCwgcmV0dXJucyBudWxsLgotCSAqIEByZXR1cm4gSVJlc291cmNlIG9yIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0RW50cnlSZXNvdXJjZShmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIElQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBJVmlydHVhbFJlZmVyZW5jZSByZXByZXNlbnRzIGFuIHByb2plY3QgY3AgZW50cnkuIElmIHNvLCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIElQcm9qZWN0LCBvdGhlcndpc2UsCi0JICogcmV0dXJucyBudWxsLgotCSAqIEBwYXJhbSByZWYgVGhlIElWaXJ0dWFsUmVmZXJlbmNlCi0JICogQHJldHVybiBJUHJvamVjdCByZWZlcmVuY2VkIGJ5IHRoZSBwcm9qZWN0IGNwIGVudHJ5IG9yIG51bGwgaWYgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UgaXMgbnVsbCBvciBkb2VzIG5vdCByZWZlciB0byAKLQkgKiBhIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHdpdGggdHlwZSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSB0aGF0IHJlcHJlc2VudHMgYSBwcm9qZWN0IGNwIGVudHJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgaXNDbGFzc3BhdGhQcm9qZWN0UmVmZXJlbmNlKGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcC5nZXRBcmNoaXZlVHlwZSgpLmVxdWFscyhWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSkgJiYKLQkJCQkJY29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbXAuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggZW50cnkgcmVwcmVzZW50cyBhIGNsYXNzIGZvbGRlci4KLQkgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBpdCBpcyBhIGxpYnJhcnkgZW50cnkgdGhhdCBwb2ludHMgdG8gYSBjbGFzcyBmb2xkZXIuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0ZvbGRlckVudHJ5KGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBkb2VzIHRoZSBwYXRoIHJlZmVyIHRvIGEgZmlsZSBvciBhIGZvbGRlcj8KLQkJZmluYWwgSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQlJUGF0aCBlbnRyeUxvY2F0aW9uID0gZW50cnlQYXRoOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZW50cnlQYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWVudHJ5TG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWJvb2xlYW4gaXNGaWxlID0gdHJ1ZTsgLy8gYnkgZGVmYXVsdCwgYXNzdW1lIGEgamFyIGZpbGUKLQkJaWYgKGVudHJ5TG9jYXRpb24udG9GaWxlKCkuaXNEaXJlY3RvcnkoKSkgewotCQkJaXNGaWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFpc0ZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhdGlvbiAoYXMgYW4gYWJzb2x1dGUgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aCkgZm9yIHRoZSBjbGFzc3BhdGggZGVwZW5kZW5jeSByZXByZXNlbnRlZAotCSAqIGJ5IHRoZSBzcGVjaWZpZWQgSVZpcnR1YWxSZWZlcmVuY2UuIFdpbGwgcmV0dXJuIG51bGwgZm9yIGEgcHJvamVjdCBjcCBlbnRyeS4KLQkgKiBAcGFyYW0gcmVmIFRoZSBJVmlydHVhbFJlZmVyZW5jZQotCSAqIEByZXR1cm4gQWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb3IgbnVsbCBpZiB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSBpcyBudWxsIG9yIGRvZXMgbm90IHJlZmVyIHRvIAotCSAqIGEgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgd2l0aCB0eXBlIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q2xhc3NwYXRoVmlydHVhbFJlZmVyZW5jZUxvY2F0aW9uKGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcC5nZXRBcmNoaXZlVHlwZSgpLmVxdWFscyhWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSkpIHsKLQkJCQlqYXZhLmlvLkZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCUlQYXRoIGNwRW50cnlQYXRoID0gbnVsbDsKLQkJCQlpZiAoY3BFbnRyeUZpbGUgIT0gbnVsbCAmJiBjcEVudHJ5RmlsZS5leGlzdHMoKSkgewotCQkJCQljcEVudHJ5UGF0aCA9IG5ldyBQYXRoKGNwRW50cnlGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsZSBpRmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWNwRW50cnlQYXRoID0gaUZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q2xhc3NGb2xkZXIoY29tcCk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm4gY29udGFpbmVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCQkJcmV0dXJuIGNwRW50cnlQYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJ1bnRpbWUgcGF0aCB0byB3aGljaCB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGNvbXBvbmVudHMgd2lsbCBiZQotCSAqIGFkZGVkIHdpdGhpbiB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGF0dHJpYiBUaGUgSUNsYXNzcGF0aEF0dHJpYnV0ZSB3aXRoIHRoZSBXVFAgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5IHZhbHVlLiBJZiBudWxsLAotCSAqIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHBhdGguCi0JICogQHBhcmFtIGlzV2ViQXBwIFRydWUgZm9yIHdlYiBwcm9qZWN0cywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBpc0NsYXNzRm9sZGVyIFRydWUgaWYgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIGNvbXB1dGVkIGZvciBhIGNsYXNzIGZvbGRlci4gSWdub3JlZCBpZiBjYWxjdWxhdGluZyBmb3IKLQkgKiBhIHZhbGlkIElDbGFzc3BhdGhBdHRyaWJ1dGUuCi0JICogQHJldHVybiBSdW50aW1lIHBhdGguIFdpbGwgYmUgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhIFdUUCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kgCi0JICogYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIsIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHAsIGZpbmFsIGJvb2xlYW4gaXNDbGFzc0ZvbGRlcikgewotICAgIAlpZiAoYXR0cmliICE9IG51bGwgJiYgIWF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKENMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSkpIHsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgCWlmIChhdHRyaWIgPT0gbnVsbCB8fCBhdHRyaWIuZ2V0VmFsdWUoKT09IG51bGwgfHwgYXR0cmliLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotICAgIAkJcmV0dXJuIGdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCwgaXNDbGFzc0ZvbGRlcik7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBQYXRoKGF0dHJpYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBJVmlydHVhbFJlZmVyZW5jZSByZXByZXNlbnRzIGEgY2xhc3MgZm9sZGVyIHRoYXQgaGFzIGJlZW4gbWFya2VkIGZvciBwdWJsaXNoL2V4cG9ydC4KLQkgKiBAcGFyYW0gcmVmIElWaXJ0dWFsUmVmZXJlbmNlIHRvIHRlc3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoaXMgaXMgYSBwdWJsaXNoL2V4cG9ydCBjbGFzcyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NGb2xkZXJSZWZlcmVuY2UoZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmKSB7Ci0JCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gcmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkvLyBtdXN0IHJlZmVyIHRvIGEgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQKLQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY3BDb21wPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIGNvbXA7Ci0JCQlyZXR1cm4gY3BDb21wLmlzQ2xhc3NGb2xkZXIoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBvciBudWxsIGlmIHRoaXMgcmVmZXJlbmNlIGRvZXMgbm90IG1hdGNoIHRvIGEgY29udGFpbmVyLgotCSAqIEBwYXJhbSBjb21wIElWaXJ0dWFsQ29tcG9uZW50LgotCSAqIEByZXR1cm4gSUNvbnRhaW5lciBmb3IgdGhlIGNsYXNzIGZvbGRlciBvciBudWxsIGlmIHRoaXMgcmVmZXJlbmNlIGRvZXMgbm90IG1hdGNoIGEgY29udGFpbmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRDbGFzc0ZvbGRlcihmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmIChjb21wIGluc3RhbmNlb2YgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNwQ29tcD0gKENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSBjb21wOwotCQkJcmV0dXJuIGNwQ29tcC5nZXRDbGFzc0ZvbGRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlZmF1bHQgcnVudGltZSBwYXRoIHRvIHdoaWNoIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgY29tcG9uZW50cyB3aWxsIGJlCi0JICogYWRkZWQgd2l0aGluIHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbi4gVGhpcyBtZXRob2QgaXMgb25seSB2YWxpZCBmb3Igbm9uLWNsYXNzIGZvbGRlciBlbnRyaWVzLgotCSAqIEBwYXJhbSBpc1dlYkFwcCBUcnVlIGlmIHRoZSBkZWZhdWx0IHJ1bnRpbWUgcGF0aCBmb3Igd2ViIGFwcHMgc2hvdWxkIGJlIHJldHVybmVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBydW50aW1lIHBhdGguIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKGZpbmFsIGJvb2xlYW4gaXNXZWJBcHApIHsKLQkJcmV0dXJuIGdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlZmF1bHQgcnVudGltZSBwYXRoIHRvIHdoaWNoIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgY29tcG9uZW50cyB3aWxsIGJlCi0JICogYWRkZWQgd2l0aGluIHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gaXNXZWJBcHAgVHJ1ZSBpZiB0aGUgZGVmYXVsdCBydW50aW1lIHBhdGggZm9yIHdlYiBhcHBzIHNob3VsZCBiZSByZXR1cm5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBpc0NsYXNzRm9sZGVyIFRydWUgaWYgdGhlIHBhdGggaXMgYSBjbGFzcyBmb2xkZXIuCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBydW50aW1lIHBhdGguIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKGZpbmFsIGJvb2xlYW4gaXNXZWJBcHAsIGZpbmFsIGJvb2xlYW4gaXNDbGFzc0ZvbGRlcikgewotCQlpZiAoaXNXZWJBcHApIHsKLQkJCXJldHVybiBpc0NsYXNzRm9sZGVyID8gV0VCX0lORl9DTEFTU0VTX1BBVEggOiBXRUJfSU5GX0xJQl9QQVRIOwkJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGlzQ2xhc3NGb2xkZXIgPyBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlRfUEFUSCA6IFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgYXJjaGl2ZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aCBlbnRyeQotCSAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkuCi0JICogQHJldHVybiBUaGUgYXJjaGl2ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVOYW1lKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWwgYm9vbGVhbiBpc0NsYXNzRm9sZGVyID0gaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKLQkJaWYgKGlzQ2xhc3NGb2xkZXIpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEVudHJ5UmVzb3VyY2UoZW50cnkpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RW50cnlMb2NhdGlvbihlbnRyeSkubGFzdFNlZ21lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlmaW5hbCBJUGF0aCBlbnRyeUxvY2F0aW9uID0gZ2V0RW50cnlMb2NhdGlvbihlbnRyeSk7Ci0JCXJldHVybiBlbnRyeUxvY2F0aW9uLmxhc3RTZWdtZW50KCk7Ci0JfQotCQotCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgSUNsYXNzcGF0aEVudHJ5IGhhcyBlaXRoZXIgb2YgdGhlIHNwZWNpYWwgV1RQIGNvbXBvbmVudCBkZXBlbmRlbmN5Ci0JICogYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIGl0IHNob3VsZCBiZSBtYXBwZWQgaW50byB0aGUgdmlydHVhbCBjb21wb25lbnQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGVudHJ5IFRoZSBJQ2xhc3NwYXRoRW50cnkuCi0JICogQHJldHVybiBUaGUgSUNsYXNzcGF0aEF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBzcGVjaWFsIFdUUCBhdHRyaWJ1dGUgb3IgbnVsbCBpZiBvbmUgd2FzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlyZXR1cm4gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGVudHJ5LCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5ERVBFTkRFTkNZX09SX05PTkRFUEVOREVOQ1kpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBJQ2xhc3NwYXRoRW50cnkgaGFzIG9uZSBvZiB0aGUgc3BlY2lhbCBXVFAgY29tcG9uZW50IGRlcGVuZGVuY3kKLQkgKiBhdHRyaWJ1dGVzIHRoYXQgaW5kaWNhdGUgaXQgc2hvdWxkIGJlIG1hcHBlZCBpbnRvIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnkgVGhlIElDbGFzc3BhdGhFbnRyeS4KLQkgKiBAcGFyYW0gY29tcG9uZW50RGVwZW5kZW5jeSBDb250cm9scyB3aGljaCB0eXBlIG9mIGRlcGVuZGVuY3kgYXR0cmlidXRlIHNob3VsZCBiZSBjaGVja2VkIGZvciAob3Igd2hldGhlciBib3RoIHNob3VsZCBiZSBjaGVja2VkKS4KLQkgKiBAcmV0dXJuIFRoZSBJQ2xhc3NwYXRoQXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIHNwZWNpYWwgV1RQIGF0dHJpYnV0ZSBvciBudWxsIGlmIG9uZSB3YXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBmaW5hbCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZSBhdHRyaWJ1dGVUeXBlKSB7Ci0JCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCSAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLQkgICAgCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKLQkgICAgCWZpbmFsIFN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkgICAgCWlmIChuYW1lLmVxdWFscyhDTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpKSB7Ci0JICAgIAkJaWYgKGF0dHJpYnV0ZVR5cGUgPT0gRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuREVQRU5ERU5DWV9PUl9OT05ERVBFTkRFTkNZCi0JICAgIAkJCQl8fCBhdHRyaWJ1dGVUeXBlID09IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSkgewotCSAgICAJCQlyZXR1cm4gYXR0cmlidXRlOwotCSAgICAJCX0KLQkgICAgCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSkpIHsKLQkgICAgCQlpZiAoYXR0cmlidXRlVHlwZSA9PSBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5ERVBFTkRFTkNZX09SX05PTkRFUEVOREVOQ1kKLQkgICAgCQkJCXx8IGF0dHJpYnV0ZVR5cGUgPT0gRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05ERVBFTkRFTkNZKSB7Ci0JICAgIAkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JICAgIAkJfQotCSAgICAJfQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBjb21wb25lbnQgcmVwcmVzZW50cyBhIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jeS4KLQkgKiBAcGFyYW0gY29tcG9uZW50IFZpcnR1YWwgY29tcG9uZW50IHRvIHRlc3QKLQkgKiBAcmV0dXJuIFRydWUgaWYgYSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3ksIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiAoY29tcG9uZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wb25lbnQ7Ci0JCQlyZXR1cm4gYXJjaGl2ZUNvbXAuZ2V0QXJjaGl2ZVR5cGUoKS5lcXVhbHMoVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQ0xBU1NQQVRIQVJDSElWRVRZUEUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBjbGFzc3BhdGggY29tcG9uZW50IGRpc3BsYXkgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC4KLQkgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgYSBjbGFzc3BhdGggY29tcG9uZW50LgotCSAqIEByZXR1cm4gRGlzcGxheSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeURpc3BsYXlTdHJpbmcoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWZpbmFsIFVSSSBhcmNoaXZlVVJJID0gVVJJLmNyZWF0ZVVSSShNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhjb21wb25lbnQpKTsKLQkJcmV0dXJuIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhOTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogQkVBIFN5c3RlbXMsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotLyoqCi0gKiBIb2xkcyBjb25zdGFudHMgcmVsYXRlZCB0byBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBFbnVtZXJhdGlvbiB0aGF0IGlzIHVzZWQgdG8gc2VsZWN0IGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSB0eXBlLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGVudW0gRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUge0NMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwgQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05ERVBFTkRFTkNZLCBERVBFTkRFTkNZX09SX05PTkRFUEVOREVOQ1l9OyAKLQkKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBjdXN0b20gSmF2YSBjbGFzc3BhdGggZW50cnkgYXR0cmlidXRlIHRoYXQgaXMgdXNlZCB0byBmbGFnCi0JICogZW50cmllcyB3aGljaCBzaG91bGQgYmUgZXhwb3NlZCBhcyBtb2R1bGUgZGVwZW5kZW5jaWVzIHZpYSB0aGUgdmlydHVhbCBjb21wb25lbnQgQVBJLiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBydW50aW1lIHBhdGggdG8gd2hpY2ggcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGNvbXBvbmVudHMKLQkgKiB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZGVwbG95ZWQvZXhwb3J0ZWQgbW9kdWxlLiBCeSBkZWZhdWx0LCB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMgb2YgZHluYW1pYyB3ZWIgCi0JICogcHJvamVjdHMgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIFdFQi1JTkYvbGliIGZvbGRlciBvZiB0aGUgd2ViIHByb2plY3QgKG9yIFdFQi1JTkYvY2xhc3NlcyBpZiB0aGUgZW50cnkgcG9pbnRzIHRvIGEgY2xhc3MgZm9sZGVyKS4gCi0JICogVGFnZ2VkIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgcmVmZXJlbmNlIGFyY2hpdmVzIGZvciB1dGlsaXR5LCBlamIgYW5kIGNvbm5lY3RvciBwcm9qZWN0cyB3aWxsIGJlIG1hcHBlZCB0byBlaXRoZXIgdGhlIHJvb3Qgb2YgdGhlIEVBUiAoaWYgdGhlIHByb2plY3QgaXMKLQkgKiByZWZlcmVuY2VkIGJ5IGFuIEVBUikgb3IgdG8gdGhlIC9XRUItSU5GL2xpYiBkaXJlY3Rvcnkgb2YgdGhlIFdBUiAoaWYgdGhlIHByb2plY3QgaXMgYSAKLQkgKiB3ZWIgbGlicmFyeSByZWZlcmVuY2Ugb2YgYSB3ZWIgcHJvamVjdCk7IHRoZSBydW50aW1lIHBhdGggb2YgIi4uLyIgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIG1hcHBpbmcKLQkgKiBpbnRvIHRoZSByZWZlcmVuY2luZyBtb2R1bGUgaW4gYm90aCBvZiB0aGVzZSBjYXNlcy4gVGFnZ2VkIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgcmVmZXJlbmNlIGNsYXNzIGZvbGRlcnMgZm9yIHV0aWxpdHksIGVqYiBhbmQgY29ubmVjdG9yIHByb2plY3RzCi0JICogd2lsbCBtYXAgaW50byB0aGUgcm9vdCBvZiB0aGUgdXRpbGl0eSwgZWpiIG9yIGNvbm5lY3RvciBhcmNoaXZlLgotCSAqIE9ubHkgY29udGFpbmVyLCBsaWJyYXJ5IGFuZCB2YXJpYWJsZSBlbnRyaWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOyBmb3IgY29udGFpbmVycywgb25seSB0aGUgcmVzb2x2ZWQKLQkgKiBlbnRyaWVzIHRoYXQgYXJlIGxpYnJhcnkgZW50cmllcyBhcmUgc3VwcG9ydGVkLiBBbGwgcmVzb2x2ZWQgZW50cmllcyBhcmUgbWFwcGVkIHVubGVzcyB0aGV5IGhhdmUgdGhlIAotCSAqICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiIGF0dHJpYnV0ZSAob3IgYXJlIHByb2plY3Qgd2hpY2ggYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGFuZCBhcmUgdGhlcmVmb3JlIGFsd2F5cyBza2lwcGVkKS4gCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZID0gIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQuZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMQotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgY3VzdG9tIEphdmEgY2xhc3NwYXRoIGVudHJ5IGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8gZmxhZwotCSAqIHRoZSByZXNvbHZlZCBlbnRyaWVzIG9mIGNsYXNzcGF0aCBjb250YWluZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkCi0JICogdmlhIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBBUEkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSA9ICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEKLQkKLQkvKioKLQkgKiBSdW50aW1lIHBhdGggdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gYSBjbGFzc3BhdGggZW50cnkgc2hvdWxkIGJlCi0JICogbWFwcGVkIGludG8gdGhlIGV4cG9ydGVkL2RlcGxveWVkIHN0cnVjdHVyZSBvZiB0aGUgcGFyZW50IG1vZHVsZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0IHRoZSB0YXJnZXQgbW9kdWxlCi0JICogaXMgbWFwcGVkICh3aWxsIGJlIGVpdGhlciB0aGUgRUFSIHJvb3Qgb3IgL1dFQi1JTkYvbGliKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIgPSAiLi4vIjsKLQkKLQkvKioKLQkgKiBJUGF0aCB2YWx1ZSBvZiBSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCA9IG5ldyBQYXRoKFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUik7Ci0KLQkvKioKLQkgKiBSdW50aW1lIHBhdGggdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gYSBjbGFzc3BhdGggZW50cnkgc2hvdWxkIGJlCi0JICogbWFwcGVkIGludG8gdGhlIHJvb3Qgb2YgdGhlIGV4cG9ydGVkL2RlcGxveWVkIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlQgPSIvIjsKLQkKLQkvKioKLQkgKiBJUGF0aCB2YWx1ZSBvZiBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlRfUEFUSCA9IG5ldyBQYXRoKFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVCk7Ci0JCi0JLyoqCi0JICogUnVudGltZSBwYXRoIHVzZWQgdG8gbWFwIGludG8gL1dFQi1JTkYvY2xhc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9DTEFTU0VTX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykubWFrZUFic29sdXRlKCk7Ci0JCi0JLyoqCi0JICogUnVudGltZSBwYXRoIHVzZWQgdG8gbWFwIGludG8gL1dFQi1JTkYvbGliCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJfSU5GX0xJQl9QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GX0xJQikubWFrZUFic29sdXRlKCk7Ci0JCi0JfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmM4OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBCRUEgU3lzdGVtcywgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLlVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogQ29udGFpbnMgdXRpbGl0eSBjb2RlIGZvciBleGVjdXRpbmcgdGhlIFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZU9wZXJhdGlvbi4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwgaW1wbGVtZW50cyBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIElDbGFzc3BhdGhBdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lhbCBXVFAgIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQuZGVwZW5kZW5jeSIgbmFtZSB3aG9zZSBydW50aW1lIHBhdGgKLQkgKiAocmVwcmVzZW50ZWQgYnkgdGhlIHZhbHVlKSBpcyB1bnNwZWNpZmllZCBhbmQgd2lsbCB0aGVyZWZvcmUgdGFrZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb2plY3QgaW4gd2hpY2ggaXQgaXMKLQkgKiBhZGRlZC4gCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBJQ2xhc3NwYXRoQXR0cmlidXRlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBUaHJvd24gaWYgYSBwcm9ibGVtIGlzIGVuY291bnRlcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZSgiIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSUNsYXNzcGF0aEF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWFsIFdUUCAib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiBuYW1lIHdob3NlIHJ1bnRpbWUgcGF0aAotCSAqIChyZXByZXNlbnRlZCBieSB0aGUgdmFsdWUpIGlzIHNldCB0byB0aGUgZGVmYXVsdCBmb3IgZWl0aGVyIGEgd2ViIHByb2plY3QgKC9XRUItSU5GL2xpYikgb3Igbm9uLXdlYiBwcm9qZWN0ICguLi8pLgotCSAqIEBwYXJhbSBpc1dlYkFwcCBUcnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzIGJlaW5nIGNyZWF0ZWQgZm9yIGEgY2xhc3NwYXRoIGVudHJ5IG9uIGEgZHluYW1pYyB3ZWIgcHJvamVjdC4KLQkgKiBAcGFyYW0gaXNDbGFzc0ZvbGRlciBUcnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzIGJlaW5nIGNyZWF0ZWQgZm9yIGEgY2xhc3MgZm9sZGVyLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgSUNsYXNzcGF0aEF0dHJpYnV0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBib29sZWFuIGlzQ2xhc3NGb2xkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUoQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKGlzV2ViQXBwLCBpc0NsYXNzRm9sZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJQ2xhc3NwYXRoQXR0cmlidXRlIHdpdGggdGhlIHNwZWNpYWwgV1RQICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiIG5hbWUgd2hvc2UgcnVudGltZSBwYXRoCi0JICogKHJlcHJlc2VudGVkIGJ5IHRoZSB2YWx1ZSkgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IGZvciBlaXRoZXIgYSB3ZWIgcHJvamVjdCAoL1dFQi1JTkYvbGliKSBvciBub24td2ViIHByb2plY3QgKC4uLykuCi0JICogQHBhcmFtIGlzV2ViQXBwIFRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgYmVpbmcgY3JlYXRlZCBmb3IgYSBjbGFzc3BhdGggZW50cnkgb24gYSBkeW5hbWljIHdlYiBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgSUNsYXNzcGF0aEF0dHJpYnV0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBib29sZWFuIGlzV2ViQXBwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSUNsYXNzcGF0aEF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWFsIFdUUCAib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiBuYW1lIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHJ1bnRpbWUgcGF0aCAod2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlKS4KLQkgKiBAcGFyYW0gcnVudGltZVBhdGggVGhlIHJ1bnRpbWUgcGF0aCBpbiB0aGUgZGVwbG95ZWQvZXhwb3J0ZWQgbW9kdWxlIHdoZXJlIHJlc29sdmVkIGNsYXNzcGF0aCBjb21wb25lbnRzIHNob3VsZAotCSAqIGJlIGFkZGVkLiBNdXN0IGJlIG5vbi1udWxsLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgSUNsYXNzcGF0aEF0dHJpYnV0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBJUGF0aCBydW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShydW50aW1lUGF0aC50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIFN0cmluZyBydW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwgcnVudGltZVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIElDbGFzc3BhdGhBdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lhbCBXVFAgIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQubm9uZGVwZW5kZW5jeSIgbmFtZS4gVGhpcyBhdHRyaWJ1dGUgaXMKLQkgKiB1c2VkIG9uIHRoZSByZXNvbHZlZCBlbnRyaWVzIG9mIGNsYXNzcGF0aCBjb250YWluZXJzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGV4cG9ydGVkL3B1Ymxpc2hlZC4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIElDbGFzc3BhdGhBdHRyaWJ1dGUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhIHByb2JsZW0gaXMgZW5jb3VudGVyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIGNyZWF0ZU5vbkRlcGVuZGVuY3lBdHRyaWJ1dGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSwgIiIpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0IHNvIHRoYXQgb25seSB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aCBlbnRyaWVzIGhhdmUKLQkgKiB0aGUgV1RQIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IEphdmEgcHJvamVjdC4KLQkgKiBAcGFyYW0gZW50cnlUb1J1bnRpbWVQYXRoIE1hcCBmcm9tIElDbGFzc3BhdGhFbnRyeSB0byBydW50aW1lIHBhdGggZm9yIGFsbCBlbnRyaWVzIHRoYXQgc2hvdWxkIAotCSAqIGhhdmUgdGhlIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIFN0YXR1cyBmcm9tIHRoZSBvcGVyYXRpb24uCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdXBkYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIE1hcCBlbnRyeVRvUnVudGltZVBhdGgpIAotCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzT3BlcmF0aW9uKHByb2plY3ROYW1lLCBlbnRyeVRvUnVudGltZVBhdGgpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIElEYXRhTW9kZWxPcGVyYXRpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgY2xhc3NwYXRoIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgcHJvamVjdCBzbyB0aGF0Ci0JICogb25seSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMgd2lsbCBoYXZlIFdUUCBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgSmF2YSBwcm9qZWN0LgotCSAqIEBwYXJhbSBlbnRyeVRvUnVudGltZVBhdGggTWFwIGZyb20gSUNsYXNzcGF0aEVudHJ5IHRvIHJ1bnRpbWUgcGF0aCBmb3IgYWxsIGVudHJpZXMgdGhhdCBzaG91bGQgCi0JICogaGF2ZSB0aGUgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlLgotCSAqIEByZXR1cm4gVGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlVXBkYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZXNPcGVyYXRpb24oZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLCBmaW5hbCBNYXAgZW50cnlUb1J1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBjcmVhdGVPcGVyYXRpb24ocHJvamVjdE5hbWUsIGVudHJ5VG9SdW50aW1lUGF0aCwgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3BlcnRpZXMuRU5UUklFU19XSVRIX0FUVFJJQlVURSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIElEYXRhTW9kZWxPcGVyYXRpb24gdGhhdCB3aWxsIHVwZGF0ZSB0aGUgY2xhc3NwYXRoIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgcHJvamVjdCBzbyB0aGF0Ci0JICogdGhlIFdUUCBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMuIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgSmF2YSBwcm9qZWN0LgotCSAqIEBwYXJhbSBlbnRyeVRvUnVudGltZVBhdGggTWFwIGZyb20gSUNsYXNzcGF0aEVudHJ5IHRvIHJ1bnRpbWUgcGF0aCBmb3IgYWxsIGVudHJpZXMgdGhhdCBzaG91bGQgaGF2ZSB0aGUgYXR0cmlidXRlIGFkZGVkLgotCSAqIEByZXR1cm4gVGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlQWRkRGVwZW5kZW5jeUF0dHJpYnV0ZXNPcGVyYXRpb24oZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLCBmaW5hbCBNYXAgZW50cnlUb1J1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBjcmVhdGVPcGVyYXRpb24ocHJvamVjdE5hbWUsIGVudHJ5VG9SdW50aW1lUGF0aCwgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3BlcnRpZXMuRU5UUklFU19UT19BRERfQVRUUklCVVRFLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgSURhdGFNb2RlbE9wZXJhdGlvbiB0aGF0IHdpbGwgdXBkYXRlIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0IHNvIHRoYXQKLQkgKiB0aGUgV1RQIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMuIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgSmF2YSBwcm9qZWN0LgotCSAqIEBwYXJhbSBlbnRyeVRvUnVudGltZVBhdGggTWFwIGZyb20gSUNsYXNzcGF0aEVudHJ5IHRvIHJ1bnRpbWUgcGF0aCBmb3IgYWxsIGVudHJpZXMgdGhhdCBzaG91bGQgaGF2ZSB0aGUgYXR0cmlidXRlIHJlbW92ZWQuCi0JICogQHJldHVybiBUaGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVSZW1vdmVEZXBlbmRlbmN5QXR0cmlidXRlc09wZXJhdGlvbihmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIE1hcCBlbnRyeVRvUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbihwcm9qZWN0TmFtZSwgZW50cnlUb1J1bnRpbWVQYXRoLCBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5FTlRSSUVTX1RPX1JFTU9WRV9BVFRSSUJVVEUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBXVFAgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGVudHJ5IHVzaW5nIHRoZSBkZWZhdWx0IHJ1bnRpbWUgcGF0aCBmb3IgdGhlIHByb2plY3QuIERvZXMgTk9UIGNoZWNrIHRoYXQgdGhlCi0JICogc3BlY2lmaWVkIGVudHJ5IGlzIGEgdmFsaWQgZW50cnkgZm9yIHRoZSBkZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBQcm9ncmVzcyBtb25pdG9yLiBDYW4gYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IEphdmEgcHJvamVjdC4KLQkgKiBAcGFyYW0gZW50cnkgQ2xhc3NwYXRoIGVudHJ5IHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGFkZGVkLgotCSAqIEByZXR1cm4gU3RhdHVzIGZyb20gdGhlIG9wZXJhdGlvbi4KLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBhZGREZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIAotCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZERlcGVuZGVuY3lBdHRyaWJ1dGUobW9uaXRvciwgcHJvamVjdE5hbWUsIGVudHJ5LCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgV1RQIGNvbXBvbmVudCBub24tZGVwZW5kZW5jeSBhdHRyaWJ1dGUgdG8gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggZW50cnkgdXNpbmcgdGhlIGRlZmF1bHQgcnVudGltZSBwYXRoIGZvciB0aGUgcHJvamVjdC4gCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgUHJvZ3Jlc3MgbW9uaXRvci4gQ2FuIGJlIG51bGwuCi0JICogQHBhcmFtIHByb2plY3ROYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBKYXZhIHByb2plY3QuCi0JICogQHBhcmFtIGVudHJ5IENsYXNzcGF0aCBlbnRyeSB0byB3aGljaCB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBhZGRlZC4KLQkgKiBAcmV0dXJuIFN0YXR1cyBmcm9tIHRoZSBvcGVyYXRpb24uCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgYWRkTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSAKLQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1hcCBlbnRyeVRvUnVudGltZVBhdGggPSBuZXcgSGFzaE1hcCgpOwotCQllbnRyeVRvUnVudGltZVBhdGgucHV0KGVudHJ5LCBudWxsKTsKLQkJcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbihwcm9qZWN0TmFtZSwgZW50cnlUb1J1bnRpbWVQYXRoLCBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5FTlRSSUVTX1RPX0FERF9BVFRSSUJVVEUsIGZhbHNlKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBXVFAgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGVudHJ5LiBEb2VzIE5PVCBjaGVjayB0aGF0IHRoZQotCSAqIHNwZWNpZmllZCBlbnRyeSBpcyBhIHZhbGlkIGVudHJ5IGZvciB0aGUgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgUHJvZ3Jlc3MgbW9uaXRvci4gQ2FuIGJlIG51bGwuCi0JICogQHBhcmFtIHByb2plY3ROYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBKYXZhIHByb2plY3QuCi0JICogQHBhcmFtIGVudHJ5IENsYXNzcGF0aCBlbnRyeSB0byB3aGljaCB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gcnVudGltZVBhdGggUnVudGltZSBwYXRoIHRvIHdoaWNoIGVudHJ5IGVsZW1lbnRzIHNob3VsZCBiZSBkZXBsb3llZC4gTnVsbCBpZiB0aGUgZGVmYXVsdCBydW50aW1lIHBhdGggZm9yIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB1c2VkLgotCSAqIEByZXR1cm4gU3RhdHVzIGZyb20gdGhlIG9wZXJhdGlvbi4KLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBhZGREZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoKSAKLQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1hcCBlbnRyeVRvUnVudGltZVBhdGggPSBuZXcgSGFzaE1hcCgpOwotCQllbnRyeVRvUnVudGltZVBhdGgucHV0KGVudHJ5LCBydW50aW1lUGF0aCk7Ci0JCXJldHVybiBjcmVhdGVPcGVyYXRpb24ocHJvamVjdE5hbWUsIGVudHJ5VG9SdW50aW1lUGF0aCwgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3BlcnRpZXMuRU5UUklFU19UT19BRERfQVRUUklCVVRFLCB0cnVlKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBXVFAgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggZW50cnkuIERvZXMgTk9UIGNoZWNrIHRoYXQgdGhlCi0JICogc3BlY2lmaWVkIGVudHJ5IGlzIGEgdmFsaWQgZW50cnkgZm9yIHRoZSBkZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBQcm9ncmVzcyBtb25pdG9yLiBDYW4gYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IEphdmEgcHJvamVjdC4KLQkgKiBAcGFyYW0gZW50cnkgQ2xhc3NwYXRoIGVudHJ5IGZyb20gd2hpY2ggdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZC4KLQkgKiBAcmV0dXJuIFN0YXR1cyBmcm9tIHRoZSBvcGVyYXRpb24uCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgcmVtb3ZlRGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSAKLQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgTWFwIGVudHJ5VG9SdW50aW1lUGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWVudHJ5VG9SdW50aW1lUGF0aC5wdXQoZW50cnksIG51bGwpOwotCQlyZXR1cm4gY3JlYXRlT3BlcmF0aW9uKHByb2plY3ROYW1lLCBlbnRyeVRvUnVudGltZVBhdGgsIFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVFJJRVNfVE9fUkVNT1ZFX0FUVFJJQlVURSwgdHJ1ZSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBmaW5hbCBNYXAgZW50cnlUb1J1bnRpbWVQYXRoLCBmaW5hbCBTdHJpbmcgZW50cnlNYXBQcm9wZXJ0eSwgZmluYWwgYm9vbGVhbiBtb2RpZnlDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmN5KSB7IAotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KGVudHJ5TWFwUHJvcGVydHksIGVudHJ5VG9SdW50aW1lUGF0aCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRllfQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZLCBuZXcgQm9vbGVhbihtb2RpZnlDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmN5KSk7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDE5NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBCRUEgU3lzdGVtcywgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLS8qKgotICogUmVhZHMgY2xhc3NwYXRoIGRlcGVuZGVuY3kgcmVsYXRlZCBleHRlbnNpb24gcG9pbnQgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0RFUF9FWFRFTlNJT05fSUQgPSAiY2xhc3NwYXRoZGVwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJFRF9DTEFTU1BBVEhfQ09OVEFJTkVSID0gImZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQ09OVEFJTkVSX0lEID0gImNvbnRhaW5lcklEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zIF9pbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucyBnZXQoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVySURzOwotCQotCXByaXZhdGUgQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbnMoKSB7Ci0JCWZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVySURzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNldCBvZiBjbGFzc3BhdGggY29udGFpbmVyIElEcyB0aGF0IHNob3VsZAotCSAqIGJlIGZpbHRlcmVkIGZyb20gdGhlIGNvbnRhaW5lciB0aGF0IGNhbiBwb3RlbnRpYWxseSBiZSBtYXJrZWQKLQkgKiBhcyBkZXBlbmRlbmNpZXMuIFRoaXMgc2V0IG9mIGRlZmluZWQgdXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLkZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVyc0V4dGVuc2lvbi4KLQkgKiBAcmV0dXJuIFNldCBvZiBjbGFzc3BhdGggY29udGFpbmVyIElEcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZENsYXNzcGF0aENvbnRhaW5lcklEcygpIHsKLQkJcmV0dXJuIGZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVySURzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIGZpbmFsIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEoyRUVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIAkJQ0xBU1NQQVRIX0RFUF9FWFRFTlNJT05fSUQpOwotICAgICAgICAKLSAgICAgICAgaWYocG9pbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbiBwb2ludCBub3QgZm91bmQhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25zW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAJCWlmIChlbGVtZW50c1tqXS5nZXROYW1lKCkuZXF1YWxzKEZJTFRFUkVEX0NMQVNTUEFUSF9DT05UQUlORVIpKSB7Ci0gICAgICAgIAkJCVN0cmluZyBjcENvbnRhaW5lcklEID0gZWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKENMQVNTUEFUSF9DT05UQUlORVJfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlmIChjcENvbnRhaW5lcklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVySURzLmFkZChjcENvbnRhaW5lcklEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmNjNDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogQkVBIFN5c3RlbXMsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotCi0vKioKLSAqIENvbnRhaW5zIHV0aWxpdHkgY29kZSBmb3Igd29ya2luZyBtYW5pcHVsYXRpbmcgdGhlIG1vZHVsZSBNQU5JRkVTVC5NRgotICogY2xhc3NwYXRoIHRvIHJlZmxlY3QgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsIHsKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBuZXcgTUFOSUZFU1QuTUYgd2l0aCBhIGR5bmFtaWNhbGx5IHVwZGF0ZWQgY2xhc3NwYXRoIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkCi0JICogb3V0cHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIFRoZSBjdXJyZW50IE1BTklGRVNULk1GIGZpbGUuCi0JICogQHBhcmFtIGR5bmFtaWNVUklzIElzIExpc3Qgb2YgVVJJcyB0byBkeW5hbWljYWxseSBhZGQgdG8gdGhlIG1hbmlmZXN0IGNsYXNzcGF0aC4KLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtIFN0cmVhbSB0byB3aGljaCB0aGUgbW9kaWZpZWQgZW50cnkgc2hvdWxkIGJlIHdyaXR0ZW4uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKGZpbmFsIElGaWxlIG1hbmlmZXN0RmlsZSwgZmluYWwgTGlzdCBkeW5hbWljVVJJcywgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgIAl0cnkgewotICAgICAgICAJCWluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIAkJbWFuaWZlc3QgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0gICAgICAgIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIAl9IGZpbmFsbHkgewotICAgICAgICAJCWlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgIAkJCXRyeSB7Ci0gICAgICAgIAkJCQlpbi5jbG9zZSgpOwotICAgICAgICAJCQkJaW4gPSBudWxsOwotICAgICAgICAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAlmaW5hbCBTdHJpbmdbXSBtYW5pZmVzdENsYXNzcGF0aCA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotICAgICAgICAJZmluYWwgTGlzdCB1cGRhdGVkQ1AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IG1hbmlmZXN0Q2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAkJdXBkYXRlZENQLmFkZChtYW5pZmVzdENsYXNzcGF0aFtpXSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkvLyB1cGRhdGUgbWFuaWZlc3QgY2xhc3NwYXRoIHRvIGluY2x1ZGUgZHluYW1pYyBlbnRyaWVzCi0gICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IGR5bmFtaWNVUklzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIAkJZmluYWwgU3RyaW5nIGNvbnRhaW5lclVSSSA9IChTdHJpbmcpIGR5bmFtaWNVUklzLmdldChqKTsKLSAgICAgICAgCQkvLyBuZWVkIHRvIGNoZWNrIGV4aXN0aW5nIGVudHJpZXMgdG8gZW5zdXJlIGl0IGRvZXNuJ3QgYXJlIGV4aXN0IG9uIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCQkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoW2ldLmVxdWFscyhjb250YWluZXJVUkkpKSB7Ci0gICAgICAgIAkJCQlleGlzdHMgPSB0cnVlOwotICAgICAgICAJCQkJYnJlYWs7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAkJaWYgKCFleGlzdHMpIHsKLSAgICAgICAgCQkJdXBkYXRlZENQLmFkZChjb250YWluZXJVUkkpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCWZpbmFsIFN0cmluZ0J1ZmZlciBjcEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCB1cGRhdGVkQ1Auc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgCQlpZiAoIWZpcnN0KSB7Ci0gICAgICAgIAkJCWNwQnVmZmVyLmFwcGVuZCgiICIpOwotICAgICAgICAJCX0gZWxzZSB7Ci0gICAgICAgIAkJCWZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWNwQnVmZmVyLmFwcGVuZCgoU3RyaW5nKSB1cGRhdGVkQ1AuZ2V0KGopKTsKLSAgICAgICAgCX0KLSAgICAgICAgCW1hbmlmZXN0LnNldENsYXNzUGF0aChjcEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgCW1hbmlmZXN0LndyaXRlKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIAlvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTA5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IDIwMDcgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEJFQSBTeXN0ZW1zLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIFZhbGlkYXRlcyBjbGFzc3BhdGggZW50cmllcyB0aGF0IGhhdmUgYmVlbiB0YWdnZWQgYXMgY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBcHBDbGllbnRQcm9qZWN0ID0gIkFwcENsaWVudFByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUm9vdE1hcHBpbmdOb25FQVJXQVJSZWYgPSAiUm9vdE1hcHBpbmdOb25FQVJXQVJSZWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTm9uVGFnZ2VkRXhwb3J0ZWRDbGFzc2VzID0gIk5vblRhZ2dlZEV4cG9ydGVkQ2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEdXBsaWNhdGVBcmNoaXZlTmFtZSA9ICJEdXBsaWNhdGVBcmNoaXZlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQcm9qZWN0Q2xhc3NwYXRoRW50cnkgPSAiUHJvamVjdENsYXNzcGF0aEVudHJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNvdXJjZUVudHJ5ID0gIlNvdXJjZUVudHJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZpbHRlcmVkQ29udGFpbmVyID0gIkZpbHRlcmVkQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIER1cGxpY2F0ZUNsYXNzRm9sZGVyRW50cnkgPSAiRHVwbGljYXRlQ2xhc3NGb2xkZXJFbnRyeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOb25XZWJOb25FeHBvcnRlZCA9ICJOb25XZWJOb25FeHBvcnRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJbnZhbGlkTm9uV2ViUnVudGltZVBhdGggPSAiSW52YWxpZE5vbldlYlJ1bnRpbWVQYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEludmFsaWRXZWJSdW50aW1lUGF0aCA9ICJJbnZhbGlkV2ViUnVudGltZVBhdGgiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIElSZXBvcnRlciBfcmVwb3J0ZXI7Ci0JCi0JcHVibGljIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCQkJdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJLy9SZW1vdmUgYWxsIG1hcmtlcnMgcmVsYXRlZCB0byB0aGlzIHZhbGlkYXRvcgotCQlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCS8vVXNpbmcgdGhlIGhlbHBlciBjbGFzcywgbG9hZCB0aGUgbW9kdWxlIG1vZGVsCi0JCWZpbmFsIFNldCBhcmNoaXZlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qID0gKChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9ySGVscGVyKSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qLmlzQWNjZXNzaWJsZSgpIAotCQkJICAgICYmIHByb2ouaGFzTmF0dXJlKE1vZHVsZUNvcmVOYXR1cmUuTU9EVUxFX05BVFVSRV9JRCkKLQkJCSAgICAmJiBwcm9qLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkgICAgCi0JCQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQkJICAgIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHAgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvaik7Ci0JCQkJZmluYWwgTWFwIHJlZmVyZW5jZWRSYXdFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0LCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpOyAJCQkJCi0JCQkJZmluYWwgTGlzdCBwb3RlbnRpYWxSYXdFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0KTsKLQkJCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsJCQkJCi0JCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvckRhdGEgZGF0YSA9IG5ldyBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YShwcm9qKTsKLQkJCQkKLQkJCQkvLyB2YWxpZGF0ZSB0aGUgcmF3IHJlZmVyZW5jZWQgY29udGFpbmVyIGVudHJpZXMKLQkJCQlJdGVyYXRvciBpID0gIHJlZmVyZW5jZWRSYXdFbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBoYXNSb290TWFwcGluZyA9IGZhbHNlOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBpLm5leHQoKTsKLQkJCQkJZmluYWwgYm9vbGVhbiBpc0NsYXNzRm9sZGVyID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKLQkJCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSkgcmVmZXJlbmNlZFJhd0VudHJpZXMuZ2V0KGVudHJ5KTsKLQkJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSdW50aW1lUGF0aChhdHRyaWIsIGlzV2ViQXBwLCBpc0NsYXNzRm9sZGVyKTsKLQkJCQkJaWYgKHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJCWhhc1Jvb3RNYXBwaW5nID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlJTWVzc2FnZVtdIG1zZ3MgPSB2YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShlbnRyeSwgYXR0cmliLCBpc1dlYkFwcCwgcHJvaiwgZGF0YSk7Ci0JCQkJCWZpbmFsIFN0cmluZyBjcEVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1zZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCW1zZ3Nbal0uc2V0R3JvdXBOYW1lKGNwRW50cnlQYXRoKTsKLQkJCQkJfQotCQkJCQlyZXBvcnRNZXNzYWdlcyhtc2dzKTsKLQkJICAgIAkJLy8gaWYgbm90IGEgd2ViIGFwcCwgd2FybiBpZiBhc3NvY2lhdGVkIGNwIGVudHJ5IGlzIG5vdCBleHBvcnRlZAotCQkJCQlpZiAoIWlzV2ViQXBwICYmICFlbnRyeS5pc0V4cG9ydGVkKCkpIHsKLQkJCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8gJE5PTi1OTFMtMSQKLQkJCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBOb25XZWJOb25FeHBvcnRlZCwgbmV3IFN0cmluZ1tde2NwRW50cnlQYXRofSwgcHJvaikpOwotCQkJCQl9Ci0JCQkJfQotCQkJCi0JCQkJaWYgKCFyZWZlcmVuY2VkUmF3RW50cmllcy5pc0VtcHR5KCkpIHsKLQkJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvaikpIHsgCi0JCQkJCQkvLyBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzCi0JCQkJCQlmaW5hbCBJTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vICROT04tTkxTLTEkCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEFwcENsaWVudFByb2plY3QsIG51bGwsIHByb2opOwotCQkJCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbXNnKTsKLQkJCQkJfQotCi0JCQkJCS8vIGFyZSB0aGVyZSBhbnkgcm9vdCBtYXBwaW5ncwotCQkJCQlpZiAoaGFzUm9vdE1hcHBpbmcgJiYgY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJCWJvb2xlYW4gcmVmZXJlbmNlZEZyb21FQVJvcldBUiA9IGZhbHNlOwotCQkJCQkJZmluYWwgTGlzdCBlYXJXYXJSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnRbXSByZWZDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHJlZkNvbXBvbmVudHNbal0uZ2V0UHJvamVjdCgpKQotCQkJCQkJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHJlZkNvbXBvbmVudHNbal0uZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQlyZWZlcmVuY2VkRnJvbUVBUm9yV0FSID0gdHJ1ZTsKLQkJCQkJCQkJZWFyV2FyUmVmcy5hZGQocmVmQ29tcG9uZW50c1tqXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFyZWZlcmVuY2VkRnJvbUVBUm9yV0FSKSB7Ci0JCQkJCQkJLy8gd2FybiBpZiB0aGVyZSBhcmUgcm9vdCBtYXBwaW5ncyBhbmQgdGhlIHByb2plY3QgaXMgbm90IHJlZmVyZW5jZWQgYnkgYW4gRUFSIG9yIGEgV0FSCi0JCQkJCQkJZmluYWwgSU1lc3NhZ2UgbXNnID1uZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vICROT04tTkxTLTEkCi0JCQkJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIFJvb3RNYXBwaW5nTm9uRUFSV0FSUmVmLCBudWxsLCBwcm9qKTsgCi0JCQkJCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBnZW5lcmF0ZSB3YXJuaW5nIG1lc3NhZ2VzIGZvciBhbnkgcG90ZW50aWFsIGVudHJpZXM7IHdlIHdhcm4gZm9yIHRoZXNlIHNpbmNlCi0JCQkJLy8gdGhlIGNsYXNzZXMgYXJlIGJlaW5nIGV4cG9zZWQgYnV0IHdpbGwgbm90IGJlIGJ1bmRsZWQgaW50byB0aGUgZXhwb3J0ZWQvcHVibGlzaGVkIG1vZHVsZSBhbmQKLQkJCQkvLyB0aGVyZWZvcmUgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCi0JCQkJaSA9IHBvdGVudGlhbFJhd0VudHJpZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgaS5uZXh0KCk7Ci0JCQkJCWZpbmFsIElNZXNzYWdlIG1zZyA9bmV3IE1lc3NhZ2UoImNsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IiLCAvLyAkTk9OLU5MUy0xJAotCQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgTm9uVGFnZ2VkRXhwb3J0ZWRDbGFzc2VzLCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCl9LCBwcm9qKTsKLQkJCQkJbXNnLnNldEdyb3VwTmFtZShlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1zZyk7IAotCQkJCX0KLQkJCQkKLQkJCQkvLyB2YWxpZGF0ZSBhbGwgcmVzb2x2ZWQgZW50cmllcyAob25seSBwZXJmb3JtIHRoaXMgaWYgdGhlcmUgYXJlIHJhdyByZWZlcmVuY2VkIGVudHJpZXMpCi0JCQkJaWYgKCFyZWZlcmVuY2VkUmF3RW50cmllcy5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgTWFwIHJlZmVyZW5jZWRSZXNvbHZlZEVudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QsIGlzV2ViQXBwLCBmYWxzZSk7ICAKLQkJCQkJaSA9IHJlZmVyZW5jZWRSZXNvbHZlZEVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBpLm5leHQoKTsKLQkJCQkJCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gKElDbGFzc3BhdGhBdHRyaWJ1dGUpIHJlZmVyZW5jZWRSZXNvbHZlZEVudHJpZXMuZ2V0KGVudHJ5KTsKLQkJCQkJCS8vIGNvbXB1dGUgdGhlIGFyY2hpdmUgbmFtZQotCQkJCQkJZmluYWwgU3RyaW5nIGFyY2hpdmVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0QXJjaGl2ZU5hbWUoZW50cnkpOwotCQkJCQkJaWYgKGFyY2hpdmVOYW1lcy5jb250YWlucyhhcmNoaXZlUGF0aCkpIHsKLQkJCQkJCQkvLyBQcm9qZWN0IGNwIGVudHJ5Ci0JCQkJCQkJZmluYWwgSU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoImNsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IiLCAvLyAkTk9OLU5MUy0xJAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRHVwbGljYXRlQXJjaGl2ZU5hbWUsIG5ldyBTdHJpbmdbXXtlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKX0sIHByb2opOwkJCQkJCQkJCQotCQkJCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1zZyk7IAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhcmNoaXZlTmFtZXMuYWRkKGFyY2hpdmVQYXRoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIHZhbGlkYXRlIHRoZSByZXNvbHZlZCBlbnRyeSBpZiB3ZSBkaWRuJ3QgYWxyZWFkeSB2YWxpZGF0ZSBhcyBwYXJ0IG9mIHRoZSByYXcgZW50cmllcwotCQkJCQkJaWYgKCFyZWZlcmVuY2VkUmF3RW50cmllcy5jb250YWluc0tleShlbnRyeSkpIHsKLQkJCQkJCQlJTWVzc2FnZVtdIG1zZ3MgPSB2YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShlbnRyeSwgYXR0cmliLCBpc1dlYkFwcCwgcHJvaiwgZGF0YSk7Ci0JCQkJCQkJcmVwb3J0TWVzc2FnZXMobXNncyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVwb3J0TWVzc2FnZXMoZmluYWwgSU1lc3NhZ2VbXSBtc2dzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgewotCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbXNnc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgSmF2YSBjbGFzc3BhdGggZW50cnkgaXMgYSB2YWxpZCBXVFAgdmlydHVhbCBjb21wb25lbnQgcmVmZXJlbmNlLgotCSAqIERvZXMgbm90IGNoZWNrIHRoZSBydW50aW1lIHBhdGguCi0JICogQHBhcmFtIGVudHJ5IFJhdyBvciByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgdG8gdmFsaWRhdGUuIAotCSAqIEBwYXJhbSBhdHRyaWIgVGhlIFdUUCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlLiBOdWxsIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc2V0LgotCSAqIEBwYXJhbSBpc1dlYkFwcCBUcnVlIGlmIHRoZSB0YXJnZXQgcHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYSB3ZWIgcHJvamVjdC4KLQkgKiBAcmV0dXJuIElNZXNzYWdlcyByZXByZXNlbnRpbmcgdmFsaWRhdGlvbiByZXN1bHRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2VbXSB2YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliLCBmaW5hbCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShlbnRyeSwgYXR0cmliLCBpc1dlYkFwcCwgcHJvamVjdCwgbmV3IENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhKHByb2plY3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogSG9sZHMgZGF0YSByZXF1aXJlZCB0byB2YWxpZGF0ZSBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmljIHByb2plY3QuIENhbiBiZSBjb21wdXRlZCBvbmNlIGZvciB0aGUgcHJvamVjdCBhbmQgcmV1c2VkLgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YSB7Ci0JCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQkJLy8gQ2xhc3MgZm9sZGVycyBtYXBwZWQgdmlhIHRoZSBjb21wb25lbnQgZmlsZSAoZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSBzcmMgZm9sZGVycykKLQkJcHJpdmF0ZSBmaW5hbCBJQ29udGFpbmVyW10gbWFwcGVkQ2xhc3NGb2xkZXJzOwotCQkKLQkJcHVibGljIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCQl0aGlzLm1hcHBlZENsYXNzRm9sZGVycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbE91dHB1dENvbnRhaW5lcnMocHJvamVjdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0TWFwcGVkQ2xhc3NGb2xkZXJzKCkgewotCQkJcmV0dXJuIG1hcHBlZENsYXNzRm9sZGVyczsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBKYXZhIGNsYXNzcGF0aCBlbnRyeSBpcyBhIHZhbGlkIFdUUCB2aXJ0dWFsIGNvbXBvbmVudCByZWZlcmVuY2UuCi0JICogRG9lcyBub3QgY2hlY2sgdGhlIHJ1bnRpbWUgcGF0aC4KLQkgKiBAcGFyYW0gZW50cnkgUmF3IG9yIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSB0byB2YWxpZGF0ZS4gCi0JICogQHBhcmFtIGF0dHJpYiBUaGUgV1RQIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuIE51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzZXQuCi0JICogQHBhcmFtIGlzV2ViQXBwIFRydWUgaWYgdGhlIHRhcmdldCBwcm9qZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHdlYiBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwYXJlbnQgcHJvamVjdC4KLQkgKiBAcGFyYW0gZGF0YSBEYXRhIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uLiBDYW4gYmUgY29tcHV0ZWQgb25jZSBmb3IgdGhlIHByb2plY3QgYW5kIHJldXNlZC4KLQkgKiBAcmV0dXJuIElNZXNzYWdlcyByZXByZXNlbnRpbmcgdmFsaWRhdGlvbiByZXN1bHRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2VbXSB2YWxpZGF0ZVZpcnR1YWxDb21wb25lbnRFbnRyeShmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliLCBmaW5hbCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLQkJCWZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhIGRhdGEpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIChJTWVzc2FnZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElNZXNzYWdlW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCWZpbmFsIGludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0JCWZpbmFsIGJvb2xlYW4gaXNGaWxlID0gIUNsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCi0JCQkvLyBQcm9qZWN0IGNwIGVudHJ5Ci0JCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vICROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFByb2plY3RDbGFzc3BhdGhFbnRyeSwgbmV3IFN0cmluZ1tde2VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpfSwgcHJvamVjdCkpOwotCi0JCQlyZXR1cm4gKElNZXNzYWdlW10pIHJlc3VsdHMudG9BcnJheShuZXcgSU1lc3NhZ2VbcmVzdWx0cy5zaXplKCldKTsKLQkJfSBlbHNlIGlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkKLQkJCS8vIFNvdXJjZSBjcCBlbnRyeQotCQkJCi0JCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vICROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFNvdXJjZUVudHJ5LCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCl9LCBwcm9qZWN0KSk7Ci0JCQlyZXR1cm4gKElNZXNzYWdlW10pIHJlc3VsdHMudG9BcnJheShuZXcgSU1lc3NhZ2VbcmVzdWx0cy5zaXplKCldKTsKLQkJfSBlbHNlIGlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKSB7Ci0KLQkJCS8vIGdldCB0aGUgc2V0IG9mIGNsYXNzcGF0aCBjb250YWluZXIgSURzIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkCi0JCQlMaXN0IGZpbHRlcmVkSURzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbnMuZ2V0KCkuZ2V0RmlsdGVyZWRDbGFzc3BhdGhDb250YWluZXJJRHMoKTsKLQkJCWZpbmFsIElQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkSURzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGlkID0gKFN0cmluZykgZmlsdGVyZWRJRHMuZ2V0KGkpOwotCQkJCWlmIChwYXRoLnNlZ21lbnQoMCkuZXF1YWxzKGlkKSkgewotCSAgICAgICAgCQkvLyBmaWx0ZXJlZCBjbGFzc3BhdGggY29udGFpbmVyCi0JICAgIAkJCXJlc3VsdHMuYWRkKG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8gJE5PTi1OTFMtMSQKLQkgICAgCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBGaWx0ZXJlZENvbnRhaW5lciwgbmV3IFN0cmluZ1tde2VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpfSwgcHJvamVjdCkpOwotCSAgICAJCQlyZXR1cm4gKElNZXNzYWdlW10pIHJlc3VsdHMudG9BcnJheShuZXcgSU1lc3NhZ2VbcmVzdWx0cy5zaXplKCldKTsJCQkJCQotCQkJCX0KLQkJCX0KLQotCQl9IGVsc2UgaWYgKGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQlpZiAoIWlzRmlsZSkgewotCQkJCWZpbmFsIElDb250YWluZXJbXSBtYXBwZWRDbGFzc0ZvbGRlcnMgPSBkYXRhLmdldE1hcHBlZENsYXNzRm9sZGVycygpOwotCQkJCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEVudHJ5UmVzb3VyY2UoZW50cnkpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIElQYXRoIGZ1bGxDbGFzc0ZvbGRlclBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJCQlib29sZWFuIGFscmVhZHlNYXBwZWQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXBwZWRDbGFzc0ZvbGRlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChmdWxsQ2xhc3NGb2xkZXJQYXRoLmVxdWFscyhtYXBwZWRDbGFzc0ZvbGRlcnNbal0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkvLyBlbnRyeSByZXNvbHZlcyB0byBzYW1lIGZpbGUgYXMgZXhpc3RpbmcgY2xhc3MgZm9sZGVyIG1hcHBpbmcsIHNraXAKLQkJCQkJCQlhbHJlYWR5TWFwcGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSAKLQotCQkJCQkvLyBDbGFzcyBmb2xkZXIgcmVmZXJlbmNlOyBlbnN1cmUgdGhpcyBpcyBub3QgYWxyZWFkeSBtYXBwZWQgdmlhIHRoZSBjb21wb25lbnQgZmlsZS4KLQkJCQkJaWYgKGFscmVhZHlNYXBwZWQpIHsKLQkJCQkJCXJlc3VsdHMuYWRkKG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8gJE5PTi1OTFMtMSQKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRHVwbGljYXRlQ2xhc3NGb2xkZXJFbnRyeSwgbmV3IFN0cmluZ1tde2VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpfSwgcHJvamVjdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgCQotICAgIAlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJ1bnRpbWVQYXRoKGF0dHJpYiwgaXNXZWJBcHAsICFpc0ZpbGUpOwotICAgIAlpZiAoIWlzV2ViQXBwKSB7Ci0gICAgCQkvLyBvbmx5IGEgLi4vIG9yIC8gbWFwcGluZyBpcyBjdXJyZW50bHkgbGVnYWwgaW4gYSBub24td2ViIGNvbnRleHQKLSAgICAJCWlmICghKHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCi0gICAgCQkJCXx8IHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlRfUEFUSCkpKSB7IAotICAgIAkJCXJlc3VsdHMuYWRkKG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8gJE5PTi1OTFMtMSQKLSAgICAJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEludmFsaWROb25XZWJSdW50aW1lUGF0aCwgbmV3IFN0cmluZ1tde2VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpLCBydW50aW1lUGF0aC50b1N0cmluZygpfSwgcHJvamVjdCkpOwotICAgIAkJfQotICAgIAl9IGVsc2UgewotICAgIAkJU3RyaW5nIHBhdGhTdHIgPSBydW50aW1lUGF0aC50b1N0cmluZygpOwotICAgIAkJLy8gY2FuIG9ubHkgYmUgLi4vLCAvV0VCLUlORi9saWIgb3IgL1dFQi1JTkYvY2xhc3NlcwotICAgIAkJaWYgKCFydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpIAotICAgIAkJCSYmICFydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuV0VCX0lORl9MSUJfUEFUSCkKLSAgICAJCQkmJiAhcnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFU19QQVRIKSkgeyAKLSAgICAJCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vICROT04tTkxTLTEkCi0gICAgCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBJbnZhbGlkV2ViUnVudGltZVBhdGgsIG5ldyBTdHJpbmdbXXtlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSwgcGF0aFN0cn0sIHByb2plY3QpKTsKLSAgICAJCX0KLSAgICAJfQotCi0JCXJldHVybiAoSU1lc3NhZ2VbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJTWVzc2FnZVtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJX3JlcG9ydGVyID0gbnVsbDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLQkJCXRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gRm9yd2FyZGluZyB0byBqb2IgbWV0aG9kCi0JCXZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzA1ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0IHsKLQotCXB1YmxpYyBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9ySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmZjMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIFN1YmNsYXNzIG9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCByZWZlcmVuY2VzIGNvbXB1dGVkIGZyb20gSmF2YSBjbGFzc3BhdGggZW50cmllcyB0aGF0Ci0gKiBoYXZlIGJlZW4gbWFya2VkIGFzIHB1Ymxpc2gvZXhwb3J0IGRlcGVuZGVuY2llcy4gSW4gbW9zdCBjYXNlcywgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHdpbGwgcmVzb2x2ZSBpbnRvIGFyY2hpdmUgZGVwZW5kZW5jaWVzLCAKLSAqIGhvd2V2ZXIsIGNsYXNzIGZvbGRlciBkZXBlbmRlbmNpZXMgYXJlIGFsc28gcG9zc2libGUgYW5kIHRob3NlIGFyZSByZXByZXNlbnRlZCBhcyBhIHJlZmVyZW5jZSB0byBhbiBWaXJ0dWFsQ29tcG9uZW50IHVzaW5nIHRoaXMKLSAqIGNsYXNzIGFzIHdlbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBleHRlbmRzIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB7Ci0KLQlmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNDbGFzc0ZvbGRlcjsKLQkKLQlwdWJsaWMgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIFN0cmluZyBsb2NhdGlvbiwgYm9vbGVhbiBpc0NsYXNzRm9sZGVyKSB7Ci0JCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBsb2NhdGlvbiwgbnVsbCk7Ci0JCXRoaXMuaXNDbGFzc0ZvbGRlciA9IGlzQ2xhc3NGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IHJlcHJlc2VudHMgYSBsaWJyYXJ5IGNsYXNzIGZvbGRlciBlbnRyeS4KLQkgKiBAcmV0dXJuIFRydWUgZm9yIGNsYXNzIGZvbGRlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc0ZvbGRlcigpIHsKLQkJcmV0dXJuIGlzQ2xhc3NGb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBmb2xkZXIgb3IgbnVsbCBpZiBkb2VzIG5vdCByZXByZXNlbnQgYSBjbGFzcyBmb2xkZXIuCi0JICogQHJldHVybiBJQ29udGFpbmVyIGZvciB0aGUgY2xhc3MgZm9sZGVyIG9yIG51bGwgaWYgdGhpcyByZWZlcmVuY2UgZG9lcyBub3QgbWF0Y2ggY2xhc3MgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldENsYXNzRm9sZGVyKCkgewotCQlpZiAoIWlzQ2xhc3NGb2xkZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aChnZXROYW1lKCkuc3Vic3RyaW5nKDQpKTsKLQkJZmluYWwgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWZpbmFsIElDb250YWluZXJbXSBhbGxDb250YWluZXJzID0gcm9vdC5maW5kQ29udGFpbmVyc0ZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoYWxsQ29udGFpbmVycyA9PSBudWxsIHx8IGFsbENvbnRhaW5lcnMubGVuZ3RoID09IDAgfHwgYWxsQ29udGFpbmVyc1swXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCQkvLyByZXR1cm4gZmlyc3QgbWF0Y2hpbmcgY29udGFpbmVyCi0JCXJldHVybiBhbGxDb250YWluZXJzWzBdOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKCkgewotCQlpZiAoaXNDbGFzc0ZvbGRlcikgewotCQkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc3BhdGgoKSB7Ci0JCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TWFuaWZlc3RDbGFzc3BhdGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc4ZmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci0KLS8qKgotICogUHJvcGVydGllcyBmb3IgdGhlIFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBQcm9qZWN0IG5hbWUuIFJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDbGFzc3BhdGggZW50cmllcyB0aGF0IHNob3VsZCBoYXZlIHRoZSBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuIE1hcCBmcm9tIElDbGFzc3BhdGhFbnRyeSB0byBydW50aW1lIElQYXRoLiBXaWxsIGJlCi0JICogaWdub3JlZCBpZiBlaXRoZXIgRU5UUklFU19UT19BRERfQVRUUklCVVRFIG9yIEVOVFJJRVNfVE9fUkVNT1ZFX0FUVFJJQlVURSBhcmUgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJJRVNfV0lUSF9BVFRSSUJVVEUgPSAiVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbC5FTlRSSUVTX1dJVEhfQVRUUklCVVRFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENsYXNzcGF0aCBlbnRyaWVzIHRvIHdoaWNoIHRoZSBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGFkZGVkLiBNYXAgZnJvbSBJQ2xhc3NwYXRoRW50cnkgdG8gcnVudGltZSBJUGF0aC4gSWYgdGhpcyAKLQkgKiBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQsIEVOVFJJRVNfV0lUSF9BVFRSSUJVVEUgYW5kIEVOVFJJRVNfVE9fUkVNT1ZFX0FUVFJJQlVURSB3aWxsIGJlIGlnbm9yZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSSUVTX1RPX0FERF9BVFRSSUJVVEUgPSAiVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbC5FTlRSSUVTX1RPX0FERF9BVFRSSUJVVEUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ2xhc3NwYXRoIGVudHJpZXMgdG8gd2hpY2ggdGhlIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZC4gCi0JICogTWFwIGZyb20gSUNsYXNzcGF0aEVudHJ5IHRvIHJ1bnRpbWUgSVBhdGguIElmIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkLCBFTlRSSUVTX1dJVEhfQVRUUklCVVRFIHdpbGwgYmUgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGlmIEVOVFJJRVNfVE9fQUREX0FUVFJJQlVURSBpcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUklFU19UT19SRU1PVkVfQVRUUklCVVRFID0gIlVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWwuRU5UUklFU19UT19SRU1PVkVfQVRUUklCVVRFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmxhZyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQuZGVwZW5kZW5jeSIgb3IgdGhlICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiIGF0dHJpYnV0ZSBpcyBiZWluZyBhZGRlZC9yZW1vdmVkLgotCSAqIFdpbGwgYmUgdHJ1ZSBpZiB0aGUgIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQuZGVwZW5kZW5jeSIgYXR0cmlidXRlIGlzIGJlaW5nIG1vZGlmaWVkLiBEZWZhdWx0cyB0byB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGWV9DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgPSAiVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbC5NT0RJRllfQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZIjsgLy8kTk9OLU5MUy0xJAotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJjNjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogRGF0YU1vZGVsUHJvdmlkZXIgZm9yIHRoZSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzT3BlcmF0aW9uLiAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5UUklFU19XSVRIX0FUVFJJQlVURSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVFJJRVNfVE9fQUREX0FUVFJJQlVURSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVFJJRVNfVE9fUkVNT1ZFX0FUVFJJQlVURSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1PRElGWV9DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRSSUVTX1dJVEhfQVRUUklCVVRFKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRElGWV9DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc09wZXJhdGlvbihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5LmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQlmaW5hbCBTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9FTVBUWV9QUk9KRUNUX05BTUU7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlpZiAoIWdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJCWZpbmFsIFN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9QUk9KRUNUX0lOQUNDRVNTSUJMRSwgbmV3IFN0cmluZ1tde3Byb2plY3ROYW1lfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9IAotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmU4ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogRGF0YU1vZGVsT3BlcmF0aW9uIHRoYXQgdXBkYXRlcyB0aGUgV1RQIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBvbiB0aGUKLSAqIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIHRhcmdldCBKYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc09wZXJhdGlvbihmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0KLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCXZhbGlkYXRlRWRpdChwcm9qZWN0KTsKLQkJCQlmaW5hbCBNYXAgZW50cmllc1RvQWRkID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoRU5UUklFU19UT19BRERfQVRUUklCVVRFKTsKLQkJCQlmaW5hbCBib29sZWFuIG1vZGlmeUNvbXBvbmVudERlcCA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShNT0RJRllfQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKTsKLQkJCQlpZiAoZW50cmllc1RvQWRkID09IG51bGwpIHsKLQkJCQkJZmluYWwgTWFwIGVudHJpZXNUb1JlbW92ZSA9IChNYXAgKSBtb2RlbC5nZXRQcm9wZXJ0eShFTlRSSUVTX1RPX1JFTU9WRV9BVFRSSUJVVEUpOwotCQkJCQlpZiAoZW50cmllc1RvUmVtb3ZlID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIE1hcCBlbnRyaWVzVG9SdW50aW1lUGF0aCA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KEVOVFJJRVNfV0lUSF9BVFRSSUJVVEUpOwotCQkJCQkJZmluYWwgTWFwIGVudHJpZXNUb0F0dHJpYiA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlmaW5hbCBJdGVyYXRvciBpID0gZW50cmllc1RvUnVudGltZVBhdGgua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gKElQYXRoKSBlbnRyaWVzVG9SdW50aW1lUGF0aC5nZXQoZW50cnkpOwotCQkJCQkJCUlDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGVudHJ5LCAKLQkJCQkJCQkJCW1vZGlmeUNvbXBvbmVudERlcCA/IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSA6IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfTk9OREVQRU5ERU5DWSk7Ci0JCQkJCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmIChtb2RpZnlDb21wb25lbnREZXApIHsKLQkJCQkJCQkJCWF0dHJpYiA9IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShydW50aW1lUGF0aCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlhdHRyaWIgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZU5vbkRlcGVuZGVuY3lBdHRyaWJ1dGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbnRyaWVzVG9BdHRyaWIucHV0KGVudHJ5LCBhdHRyaWIpOwotCQkJCQkJfQotCQkJCQkJdXBkYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZXMoamF2YVByb2plY3QsIGVudHJpZXNUb0F0dHJpYiwgbW9kaWZ5Q29tcG9uZW50RGVwKTsgCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZW1vdmVEZXBlbmRlbmN5QXR0cmlidXRlcyhqYXZhUHJvamVjdCwgZW50cmllc1RvUmVtb3ZlLCBtb2RpZnlDb21wb25lbnREZXApOyAKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCQotCQkJCQlhZGREZXBlbmRlbmN5QXR0cmlidXRlcyhqYXZhUHJvamVjdCwgZW50cmllc1RvQWRkLCBtb2RpZnlDb21wb25lbnREZXApOyAKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmxvZ0Vycm9yKGNlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHZhbGlkYXRlRWRpdCBjYWxsIG9uIHRoZSBmaWxlcyBpbXBhY3RlZCBieSB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRWRpdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIExpc3QgYWZmZWN0ZWRGaWxlcyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0RmlsZXNBZmZlY3RlZEJ5Q2xhc3NwYXRoQ2hhbmdlKHByb2plY3QpOwotCQlmaW5hbCBJRmlsZVtdIGZpbGVzID0gKElGaWxlW10pIGFmZmVjdGVkRmlsZXMudG9BcnJheShuZXcgSUZpbGVbYWZmZWN0ZWRGaWxlcy5zaXplKCldKTsKLQkJZmluYWwgSVN0YXR1cyByZXN1bHQgPSBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocmVzdWx0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBXVFAgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGVudHJpZXMuCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IFRhcmdldCBKYXZhIHByb2plY3QuCi0JICogQHBhcmFtIGVudHJpZXMgQ2xhc3NwYXRoIGVudHJpZXMgdG8gd2hpY2ggdGhlIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBzaG91bGQgYmUgYWRkZWQuCi0gCSAqIEBwYXJhbSBtb2RpZnlDb21wb25lbnREZXAgVHJ1ZSBpZiBhZGRpbmcgdGhlIGRlcGVuZGVuY3kgYXR0cmlidXRlLCBmYWxzZSBpZiBhZGRpbmcgdGhlIG5vbi1kZXBlbmRlbmN5IGF0dHJpYnV0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCSAqLwkKLQlwcml2YXRlIHZvaWQgYWRkRGVwZW5kZW5jeUF0dHJpYnV0ZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBNYXAgZW50cmllcywgZmluYWwgYm9vbGVhbiBtb2RpZnlDb21wb25lbnREZXApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYWx0ZXJEZXBlbmRlbmN5QXR0cmlidXRlcyhqYXZhUHJvamVjdCwgZW50cmllcywgdHJ1ZSwgbW9kaWZ5Q29tcG9uZW50RGVwKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgV1RQIGNvbXBvbmVudCBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGVudHJpZXMuCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IFRhcmdldCBKYXZhIHByb2plY3QuCi0JICogQHBhcmFtIGVudHJpZXMgQ2xhc3NwYXRoIGVudHJpZXMgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHNob3VsZCBiZSByZW1vdmVkLgotCSAqIEBwYXJhbSBtb2RpZnlDb21wb25lbnREZXAgVHJ1ZSBpZiByZW1vdmluZyB0aGUgZGVwZW5kZW5jeSBhdHRyaWJ1dGUsIGZhbHNlIGlmIHJlbW92aW5nIHRoZSBub24tZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLQkgKi8JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgTWFwIGVudHJpZXMsIGZpbmFsIGJvb2xlYW4gbW9kaWZ5Q29tcG9uZW50RGVwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFsdGVyRGVwZW5kZW5jeUF0dHJpYnV0ZXMoamF2YVByb2plY3QsIGVudHJpZXMsIGZhbHNlLCBtb2RpZnlDb21wb25lbnREZXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBhbHRlckRlcGVuZGVuY3lBdHRyaWJ1dGVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgTWFwIGVudHJpZXMsIGZpbmFsIGJvb2xlYW4gYWRkLCBmaW5hbCBib29sZWFuIG1vZGlmeUNvbXBvbmVudERlcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBpbml0aWFsaXplIHRvIHRoZSBzZXQgb2YgcmF3IGVudHJpZXMgd2l0aCB0aGUgYXR0cmliCi0JCWZpbmFsIE1hcCBlbnRyaWVzV2l0aEF0dHJpYiA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdCwgbW9kaWZ5Q29tcG9uZW50RGVwID8gRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZIDogRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05ERVBFTkRFTkNZKTsKLQkJCi0JCUl0ZXJhdG9yIGkgPSBlbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgaS5uZXh0KCk7Ci0JCQlpZiAoYWRkKSB7Ci0JCQkJaWYgKGdldE1hdGNoaW5nRW50cnlJZ25vcmVBdHRyaWJ1dGVzKGVudHJpZXNXaXRoQXR0cmliLCBlbnRyeSkgPT0gbnVsbCkgewotCQkJCQlJUGF0aCBydW50aW1lUGF0aCA9IChJUGF0aCkgZW50cmllcy5nZXQoZW50cnkpOwotCQkJCQlpZiAocnVudGltZVBhdGggPT0gbnVsbCkgewotCQkJCQkJLy8gY29tcHV0ZSB0aGUgZGVmYXVsdCBydW50aW1lIHBhdGgKLQkJCQkJCWZpbmFsIGJvb2xlYW4gaXNXZWJBcHAgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJCQlydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCwgQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KSk7Ci0JCQkJCX0KLQkJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBudWxsOwotCQkJCQlpZiAobW9kaWZ5Q29tcG9uZW50RGVwKSB7Ci0JCQkJCQlhdHRyaWIgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUocnVudGltZVBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXR0cmliID0gVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5jcmVhdGVOb25EZXBlbmRlbmN5QXR0cmlidXRlKCk7Ci0JCQkJCX0KLSAJCQkJCWVudHJpZXNXaXRoQXR0cmliLnB1dChlbnRyeSwgYXR0cmliKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBtYXRjaGluZyA9IGdldE1hdGNoaW5nRW50cnlJZ25vcmVBdHRyaWJ1dGVzKGVudHJpZXNXaXRoQXR0cmliLCBlbnRyeSk7Ci0JCQkJaWYgKG1hdGNoaW5nICE9IG51bGwpIHsKLQkJCQkJZW50cmllc1dpdGhBdHRyaWIucmVtb3ZlKG1hdGNoaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZXMoamF2YVByb2plY3QsIGVudHJpZXNXaXRoQXR0cmliLCBtb2RpZnlDb21wb25lbnREZXApOwotCX0KLQkKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBnZXRNYXRjaGluZ0VudHJ5SWdub3JlQXR0cmlidXRlcyhmaW5hbCBNYXAgZW50cmllcywgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWZpbmFsIEl0ZXJhdG9yIGkgPSBlbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGUgPSAoSUNsYXNzcGF0aEVudHJ5KSBpLm5leHQoKTsKLQkJCWlmIChlLmdldEVudHJ5S2luZCgpID09IGVudHJ5LmdldEVudHJ5S2luZCgpCi0JCQkJCSYmIGUuZ2V0UGF0aCgpLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpCi0JCQkJCSYmIGUuaXNFeHBvcnRlZCgpID09IGVudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3BlY2lmaWVkIEphdmEgcHJvamVjdCBzbyB0aGF0IG9ubHkgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggZW50cmllcyBoYXZlCi0JICogdGhlIFdUUCBjb21wb25lbnQgZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IFRhcmdldCBKYXZhIHByb2plY3QuCi0JICogQHBhcmFtIGVudHJpZXMgQ2xhc3NwYXRoIGVudHJpZXMgdGhhdCBzaG91bGQgaGF2ZSB0aGUgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlLiBNYXAgZnJvbSBJQ2xhc3NwYXRoRW50cnkKLQkgKiB0byB0aGUgSUNsYXNzcGF0aEF0dHJpYnV0ZSBmb3IgdGhlIFdUUCBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kuCi0JICogQHBhcmFtIG1vZGlmeUNvbXBvbmVudERlcCBUcnVlIGlmIG1vZGlmeWluZyB0aGUgZGVwZW5kZW5jeSBhdHRyaWJ1dGUsIGZhbHNlIGlmIG1vZGlmeWluZyB0aGUgbm9uLWRlcGVuZGVuY3kgYXR0cmlidXRlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0JICovCQotCXByaXZhdGUgdm9pZCB1cGRhdGVEZXBlbmRlbmN5QXR0cmlidXRlcyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGZpbmFsIE1hcCBlbnRyaWVzV2l0aEF0dHJpYiwgZmluYWwgYm9vbGVhbiBtb2RpZnlDb21wb25lbnREZXApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwgfHwgIWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmaW5hbCBMaXN0IHVwZGF0ZWRDbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIHJhd0NsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlib29sZWFuIG5lZWRUb1VwZGF0ZUNsYXNzcGF0aCA9IGZhbHNlOwotCQlJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZSgpOwotCQlpZiAoIW1vZGlmeUNvbXBvbmVudERlcCkgewotCQkJYXR0cmliID0gVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5jcmVhdGVOb25EZXBlbmRlbmN5QXR0cmlidXRlKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYXdDbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJhd0NsYXNzcGF0aFtpXTsKLQkJCWZpbmFsIGludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0JCQlib29sZWFuIGhhc0F0dHJpYnV0ZSA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShlbnRyeSwgCi0JCQkJCW1vZGlmeUNvbXBvbmVudERlcCA/IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSA6IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfTk9OREVQRU5ERU5DWSkgIT0gbnVsbDsKLQkJCWJvb2xlYW4gc2hvdWxkSGF2ZUF0dHJpYnV0ZSA9IGVudHJpZXNXaXRoQXR0cmliLmNvbnRhaW5zS2V5KGVudHJ5KTsKLQkJCWJvb2xlYW4gdXBkYXRlQXR0cmlidXRlcyA9IGZhbHNlOwotCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHVwZGF0ZWRBdHRyaWJ1dGVzID0gbnVsbDsKLQkJCWlmIChzaG91bGRIYXZlQXR0cmlidXRlKSB7Ci0JCQkJaWYgKCFoYXNBdHRyaWJ1dGUpIHsKLQkJCQkJLy8gc2hvdWxkIGhhdmUgdGhlIGF0dHJpYnV0ZSBhbmQgY3VycmVudGx5IG1pc3NpbmcgaXQKLQkJCQkJYXR0cmliID0gKElDbGFzc3BhdGhBdHRyaWJ1dGUpIGVudHJpZXNXaXRoQXR0cmliLmdldChlbnRyeSk7Ci0JCQkJCXVwZGF0ZWRBdHRyaWJ1dGVzID0gdXBkYXRlQXR0cmlidXRlcyhlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwgYXR0cmliLCB0cnVlKTsKLQkJCQkJbmVlZFRvVXBkYXRlQ2xhc3NwYXRoID0gdHJ1ZTsKLQkJCQkJdXBkYXRlQXR0cmlidXRlcyA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUpIHsKLQkJCQkvLyBzaG91bGQgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSBhbmQgY3VycmVudGx5IGhhcyBpdAotCQkJCXVwZGF0ZWRBdHRyaWJ1dGVzID0gdXBkYXRlQXR0cmlidXRlcyhlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwgYXR0cmliLCBmYWxzZSk7Ci0JCQkJbmVlZFRvVXBkYXRlQ2xhc3NwYXRoID0gdHJ1ZTsKLQkJCQl1cGRhdGVBdHRyaWJ1dGVzID0gdHJ1ZTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICh1cGRhdGVBdHRyaWJ1dGVzKSB7Ci0JCQkJc3dpdGNoKGtpbmQpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCQllbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgdXBkYXRlZEF0dHJpYnV0ZXMsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCQllbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLCBlbnRyeS5nZXRBY2Nlc3NSdWxlcygpLCB1cGRhdGVkQXR0cmlidXRlcywgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQllbnRyeSA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkoZW50cnkuZ2V0UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgdXBkYXRlZEF0dHJpYnV0ZXMsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6IC8vIGFsdGhvdWdoIHByb2plY3QgZW50cmllcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQsIGFsbG93IHRoZSBhdHRyaWJ1dGUgaGVyZSBhbmQgbGV0IHRoZSB2YWxpZGF0b3IgZmxhZyBhcyBhbiBlcnJvcgotCQkJCQllbnRyeSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldEFjY2Vzc1J1bGVzKCksIGVudHJ5LmNvbWJpbmVBY2Nlc3NSdWxlcygpLCB1cGRhdGVkQXR0cmlidXRlcywgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6IC8vIGFsdGhvdWdoIHNvdXJjZSBlbnRyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLCBhbGxvdyB0aGUgYXR0cmlidXRlIGhlcmUgYW5kIGxldCB0aGUgdmFsaWRhdG9yIGZsYWcgYXMgYW4gZXJyb3IKLQkJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldEluY2x1c2lvblBhdHRlcm5zKCksIGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCksIGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCksIHVwZGF0ZWRBdHRyaWJ1dGVzKTsKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQl1cGRhdGVkQ2xhc3NwYXRoLmFkZChlbnRyeSk7Ci0JCX0KLQkJaWYgKG5lZWRUb1VwZGF0ZUNsYXNzcGF0aCkgewotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gdXBkYXRlZENQQXJyYXkgPSAoSUNsYXNzcGF0aEVudHJ5W10pIHVwZGF0ZWRDbGFzc3BhdGgudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3VwZGF0ZWRDbGFzc3BhdGguc2l6ZSgpXSk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgodXBkYXRlZENQQXJyYXksIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ2xhc3NwYXRoQXR0cmlidXRlW10gdXBkYXRlQXR0cmlidXRlcyhmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gY3VycmVudEF0dHJpYnMsIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgdGFyZ2V0QXR0cmliLCBmaW5hbCBib29sZWFuIGFkZCkgewotCQlmaW5hbCBMaXN0IHVwZGF0ZWRBdHRyaWJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIGhhc0F0dHJpYiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRBdHRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3VycmVudEF0dHJpYnNbaV0uZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRBdHRyaWIuZ2V0TmFtZSgpKSkgewotCQkJCWhhc0F0dHJpYiA9IHRydWU7Ci0JCQkJaWYgKCFhZGQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlZEF0dHJpYnMuYWRkKGN1cnJlbnRBdHRyaWJzW2ldKTsKLQkJfQotCQlpZiAoYWRkICYmICFoYXNBdHRyaWIpIHsKLQkJCXVwZGF0ZWRBdHRyaWJzLmFkZCh0YXJnZXRBdHRyaWIpOwotCQl9Ci0JCXJldHVybiAoSUNsYXNzcGF0aEF0dHJpYnV0ZVtdKSB1cGRhdGVkQXR0cmlicy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW3VwZGF0ZWRBdHRyaWJzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DTVBKYXZhQ2hhbmdlU3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NNUEphdmFDaGFuZ2VTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTI3NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NNUEphdmFDaGFuZ2VTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsLk5vdGlmaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBlamIgY2xhc3Mgb3IgdGhlIHByaW1hcnkga2V5IGNsYXNzIGluIG9yZGVyIHRvCi0gKiByZWZsZWN0IHRoZSBwcm9wZXIgQ01QIGZpZWxkIHR5cGVzIGFuZCB0aGUgcHJvcGVyIGtleSBhdHRyaWJ1dGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ01QSmF2YUNoYW5nZVN5bmNocm9uaXphdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9QUk9KX01JR1JBVElPTl9BREFQVEVSID0gIkoyRUVQcm9qZWN0TWlncmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBFamJQYWNrYWdlIEVKQl9QQUNLID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBlbmFibGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWVuYWJsZW1lbnRNYXAucHV0KGNtcCwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQllbmFibGVtZW50TWFwLnB1dChjbXAsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZiAoIWVuYWJsZW1lbnRNYXAuY29udGFpbnNLZXkoY21wKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gKChCb29sZWFuKSBlbmFibGVtZW50TWFwLmdldChjbXApKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY21wUmVzb3VyY2U7Ci0KLQlwcml2YXRlIExpc3QgZm91bmRLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qCi0JICogVGhpcyBTZXQgaXMgdXNlZCB0byBhdm9pZCByZWFjdGluZyB0byBub3RpZmljYXRpb25zIGZvciBhIG5vdGlmaWVyIHdoaWxlCi0JICogdXBkYXRpbmcgdGhhdCBub3RpZmllci4KLQkgKi8KLQlwcml2YXRlIFNldCB1cGRhdGluZ1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgQ01QSmF2YUNoYW5nZVN5bmNocm9uaXphdGlvbkFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfSAvLyBFSkJLZXlTaGFwZU1haW50ZW5hbmNlQWRhcHRlcgotCi0JLyoqCi0JICogTm90aWZpZXMgaWYgdGhlcmUgaXMgY2hhbmdlIGluIHRoZSBrZXkgc2hhcGUuCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWNhdGlvbgotCSAqICAgICAgICAgICAgbXNnIC0gTWVzc2FnZSBpbmRpY2F0ZXMgd2hhdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKCFpc0VuYWJsZWQoZ2V0Q01QKCkpKSB7Ci0JCQllbmFibGUoZ2V0Q01QKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBub3RpZmllciA9IG1zZy5nZXROb3RpZmllcigpOwotCQlpZiAoIXVwZGF0aW5nU2V0LmNvbnRhaW5zKG5vdGlmaWVyKSkgewotCQkJdHJ5IHsKLQkJCQl1cGRhdGluZ1NldC5hZGQobm90aWZpZXIpOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQkJCQlzZXROb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0JCQkJCQl1bnNldE5vdGlmaWNhdGlvbihtc2cpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIgOgotCQkJCQkJcmVtb3ZlQWRhcHRlck5vdGlmaWNhdGlvbihtc2cpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgOgotCQkJCQkJamVtRmx1c2hOb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdXBkYXRpbmdTZXQucmVtb3ZlKG5vdGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZSBpZiB0aGUgdGhlcmUgd2FzIGFuIHNldCBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWNhdGlvbgotCSAqICAgICAgICAgICAgbXNnIC0gTWVzc2FnZSBpbmRpY2F0ZXMgd2hhdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBtc2cuZ2V0RmVhdHVyZSgpOwotCQlpZiAoc2YgPT0gRUpCX1BBQ0suZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSB8fCBzZiA9PSBFSkJfUEFDSy5nZXRFbnRpdHlfUHJpbWFyeUtleSgpKSB7Ci0JCQlpZiAoIWlzTWlncmF0aW5nKCkpIHsKLQkJCQlyZW1vdmVBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoKE5vdGlmaWVyKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJYWRkQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKChOb3RpZmllcikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCXRvdWNoS2V5U2hhcGVBZGFwdGVyKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc2YgPT0gRUpCX1BBQ0suZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkgewotCQkJcmVtb3ZlQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKChOb3RpZmllcikgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJaWYgKHNob3VsZEFkZFRvUHJpbWFyeUtleUNsYXNzKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBnZXRUYXJnZXQoKSkpCi0JCQkJYWRkQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKChOb3RpZmllcikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJamVtRmx1c2hOb3RpZmljYXRpb24obXNnKTsgLy9JbiBFTUYgYSBUT1VDSCBpcyBhIFNFVC4KLQkJfQotCX0gLy8gc2V0Tm90aWZpY2F0aW9uCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTWlncmF0aW5nKCkgewotCQlFSkJKYXIgamFyID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBnZXRUYXJnZXQoKSkuZ2V0RWpiSmFyKCk7Ci0JCWlmIChqYXIgIT0gbnVsbCkKLQkJCXJldHVybiBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGphciwgSjJFRV9QUk9KX01JR1JBVElPTl9BREFQVEVSKSAhPSBudWxsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gc2V0Tm90aWZpY2F0aW9uCi0JLyoqCi0JICogVXNlIGlmIHRoZSB0aGVyZSB3YXMgYW4gdW5zZXQgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmljYXRpb24KLQkgKiAgICAgICAgICAgIG1zZyAtIE1lc3NhZ2UgaW5kaWNhdGVzIHdoYXQgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5zZXROb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBtc2cuZ2V0RmVhdHVyZSgpOwotCQlpZiAoKHNmID09IEVKQl9QQUNLLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkgfHwgc2YgPT0gRUpCX1BBQ0suZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkgJiYgIWlzTWlncmF0aW5nKCkpIHsKLQkJCXJlbW92ZUF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigoTm90aWZpZXIpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJfQotCX0gLy8gdW5zZXROb3RpZmljYXRpb24KLQotCS8qKgotCSAqIFVzZSBpZiB0aGUgdGhlcmUgd2FzIGFuIHRvdWNoIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpY2F0aW9uCi0JICogICAgICAgICAgICBtc2cgLSBNZXNzYWdlIGluZGljYXRlcyB3aGF0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGplbUZsdXNoTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKChOb3RpZmljYXRpb25VdGlsLmlzRmx1c2hOZXdFdmVudChtc2cpIHx8IE5vdGlmaWNhdGlvblV0aWwuaXNGbHVzaEV2ZW50KG1zZykpICYmICFpc01pZ3JhdGluZygpKSB7Ci0JCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBnZXRUYXJnZXQoKSkuZ2V0RWpiQ2xhc3MoKSkgewotCQkJCXRvdWNoQmVhbkFkYXB0ZXIobXNnKTsKLQkJCX0gZWxzZSBpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBnZXRUYXJnZXQoKSkuZ2V0UHJpbWFyeUtleSgpKSB7Ci0JCQkJdG91Y2hLZXlTaGFwZUFkYXB0ZXIobXNnKTsKLQkJCX0gLy8gaWYKLQkJCS8vaWYgdGhlIG5vdGlmaWVyIGlzIGVxIHRoZSBwcmltYXJ5IGtleQotCQkJLy9lbHNlIGVqYiBiZWFuIGNsYXNzIGZsdXNoCi0JCX0gLy8gaWYKLQl9IC8vIHRvdWNoTm90aWZpY2F0aW9uCi0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBZGFwdGVyTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpID09IHRoaXMgJiYgbXNnLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSB7Ci0JCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBtc2cuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChjbXAuZ2V0RWpiQ2xhc3MoKSAhPSBudWxsKQotCQkJCWNtcC5nZXRFamJDbGFzcygpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWlmIChjbXAuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCi0JCQkJY21wLmdldFByaW1hcnlLZXkoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBrZXkgc2hhcGUgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBUaGUgY3VycmVudCBub3RpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyICE9IG51bGwgJiYgIW5vdGlmaWVyLmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJbm90aWZpZXIuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUga2V5IHNoYXBlIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyICE9IG51bGwpCi0JCQlub3RpZmllci5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGtleSBoYXMgYmVlbiB0b3VjaGVkLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmljYXRpb24KLQkgKiAgICAgICAgICAgIG1zZyAtIFRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b3VjaEtleVNoYXBlQWRhcHRlcihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFDbGFzcyBwcmltYXJ5S2V5Q2xhc3MgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQkvL1N5bmNoIHRoZSB0d28gbGlzdHMuCi0JCXN5bmNoQ01QYW5kS2V5QXR0cmlidXRlcyhjbXAsIHByaW1hcnlLZXlDbGFzcyk7Ci0JfSAvLyB0b3VjaEtleVNoYXBlQWRhcHRlcgotCi0JLyoqCi0JICogVGhlIGVqYiBjbGFzcyBoYXMgYmVlbiBmbHVzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmljYXRpb24KLQkgKiAgICAgICAgICAgIG1zZyAtIFRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b3VjaEJlYW5BZGFwdGVyKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBnZXRUYXJnZXQoKTsKLQkJTGlzdCBjbXBBdHRyaWJ1dGVzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChjbXBBdHRyaWJ1dGVzICE9IG51bGwgfHwgIWNtcEF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7Ci0JCQlib29sZWFuIG1vZEZsYWcgPSBnZXRDdXJyZW50TW9kaWZpY2F0aW9uRmxhZygpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNtcEF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ01QQXR0cmlidXRlIGNtcEF0dHIgPSAoQ01QQXR0cmlidXRlKSBjbXBBdHRyaWJ1dGVzLmdldChpKTsKLQkJCQkJaWYgKGNtcEF0dHIgIT0gbnVsbCAmJiAhY21wQXR0ci5pc0Rlcml2ZWQoKSkgewotCQkJCQkJY21wQXR0ci5zZXRFVHlwZShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0TW9kaWZpY2F0aW9uRmxhZyhtb2RGbGFnKTsKLQkJCX0KLQkJfQotCQlzeW5jaENNUGFuZEtleUF0dHJpYnV0ZXMoY21wLCBjbXAuZ2V0UHJpbWFyeUtleSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbnppZXMgdGhlIGNtcCBhbmQgcHJpbWFyeSBrZXkgY2xhc3MgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gQ29udGFpbmVyTWFuYWdlZEVudGl0eQotCSAqICAgICAgICAgICAgY21wIC0gVGhlIGNtcC4KLQkgKiBAcGFyYW0gSmF2YUNsYXNzCi0JICogICAgICAgICAgICBwcmltYXJ5S2V5Q2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaENNUGFuZEtleUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIEphdmFDbGFzcyBwcmltYXJ5S2V5Q2xhc3MpIHsKLQkJaWYgKGNtcCA9PSBudWxsIHx8IHByaW1hcnlLZXlDbGFzcyA9PSBudWxsIHx8IGNtcC5nZXRQcmltS2V5RmllbGQoKSAhPSBudWxsIHx8IHByaW1hcnlLZXlDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQkvLyBtYWtlIHN1cmUgd2UgZmx1c2ggdGhlIHByaW1hcnkga2V5IHRvIGdldCBsYXRlc3QgdXBkYXRlcyBpZiBubyBzYXZlCi0JCS8vIHRvb2sgcGxhY2UKLQkJZmx1c2hQcmltYXJ5S2V5Q2xhc3MocHJpbWFyeUtleUNsYXNzKTsKLQotCQlMaXN0IGNtcEF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGNtcEF0dHJpYnV0ZXMgIT0gbnVsbCB8fCAhY21wQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKLQkJCWZvdW5kS2V5cy5jbGVhcigpOwotCQkJTGlzdCBrZXlBdHRyaWJ1dGVzTGlzdCA9IGNtcC5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQlmb3VuZEtleXMuYWRkQWxsKGtleUF0dHJpYnV0ZXNMaXN0KTsKLQkJCWJvb2xlYW4gbW9kRmxhZyA9IGdldEN1cnJlbnRNb2RpZmljYXRpb25GbGFnKCk7Ci0JCQl0cnkgewotCQkJCUxpc3Qga2V5RmllbGRzID0gcHJpbWFyeUtleUNsYXNzLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJRmllbGQgZmllbGQgPSAoRmllbGQpIGtleUZpZWxkcy5nZXQoaSk7Ci0JCQkJCWlmIChmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpICE9IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlTdHJpbmcgZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCQkJCQlpZiAoZmllbGROYW1lICE9IG51bGwpIHsKLQkJCQkJCUNNUEF0dHJpYnV0ZSBrZXlBdHRyID0gY21wLmdldEtleUF0dHJpYnV0ZShmaWVsZE5hbWUpOwotCQkJCQkJaWYgKGtleUF0dHIgPT0gbnVsbCkKLQkJCQkJCQljbXAuYWRkS2V5QXR0cmlidXRlTmFtZShmaWVsZE5hbWUpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvdW5kS2V5cy5yZW1vdmUoa2V5QXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZEtleXMuaXNFbXB0eSgpKQotCQkJCQlrZXlBdHRyaWJ1dGVzTGlzdC5yZW1vdmVBbGwoZm91bmRLZXlzKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0TW9kaWZpY2F0aW9uRmxhZyhtb2RGbGFnKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJYm9vbGVhbiBpc0NoYW5nZWQgPSBnZXRUYXJnZXQoKSAhPSBuZXdUYXJnZXQ7Ci0JCWlmIChuZXdUYXJnZXQgPT0gbnVsbCkgewotCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JCQljbXBSZXNvdXJjZSA9IG51bGw7Ci0JCX0gZWxzZSBpZiAobmV3VGFyZ2V0IGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJLy9UT0RPIC0gdW5jb21tZW50IHdoZW4gY29tcGlsZSBlcnJvcnMgYXJlIGdvbmUKLQkJCWlmIChmYWxzZSkvKiAoRUpCQ29tbWFuZENvcGllci5pc0NvZGVnZW5Db3B5KG5ld1RhcmdldCkpICovCi0JCQkJbmV3VGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWVsc2UgewotCQkJCVJlc291cmNlIHJlcyA9ICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbmV3VGFyZ2V0KS5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJCQkJaWYgKGlzQ2hhbmdlZCkKLQkJCQkJCWluaXRpYWxpemVUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYXJnZXQoKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGdldFRhcmdldCgpOwotCQlhZGRBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoY21wLmdldEVqYkNsYXNzKCkpOwotCQlpZiAoc2hvdWxkQWRkVG9QcmltYXJ5S2V5Q2xhc3MoY21wKSkKLQkJCWFkZEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcihjbXAuZ2V0UHJpbWFyeUtleSgpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkQWRkVG9QcmltYXJ5S2V5Q2xhc3MoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJcmV0dXJuIGNtcC5nZXRQcmltS2V5RmllbGQoKSA9PSBudWxsICYmIGNtcC5nZXRQcmltYXJ5S2V5KCkgIT0gbnVsbCAmJiAhY21wLmdldFByaW1hcnlLZXkoKS5nZXRRdWFsaWZpZWROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS5sYW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0Q01QUmVzb3VyY2UoKSB7Ci0JCWlmIChjbXBSZXNvdXJjZSA9PSBudWxsICYmIGdldFRhcmdldCgpICE9IG51bGwpCi0JCQljbXBSZXNvdXJjZSA9ICgoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpLmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gY21wUmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q3VycmVudE1vZGlmaWNhdGlvbkZsYWcoKSB7Ci0JCXJldHVybiBnZXRDTVBSZXNvdXJjZSgpICE9IG51bGwgJiYgY21wUmVzb3VyY2UuZ2V0Q29udGVudHMoKSAhPSBudWxsID8gY21wUmVzb3VyY2UuaXNNb2RpZmllZCgpIDogZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpY2F0aW9uRmxhZyhib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlmIChnZXRDTVBSZXNvdXJjZSgpICE9IG51bGwpCi0JCQlnZXRDTVBSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGFCb29sZWFuKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRDTVAoKSB7Ci0JCWlmIChnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JCQlyZXR1cm4gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGdldFRhcmdldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFByaW1hcnlLZXlDbGFzcyhKYXZhQ2xhc3MgcHJpbWFyeUtleUNsYXNzKSB7Ci0JCS8vIGVuc3VyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgZmx1c2hlZCBhbmQgcmVsb2FkZWQgdG8gZ2V0IGxhdGVzdAotCQkvLyBjb250ZW50Ci0JCUlQcm9qZWN0IHAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJpbWFyeUtleUNsYXNzKTsKLQkJdHJ5IHsKLQkJCUxpc3QgbmF0dXJlcyA9IEVNRk5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZXMocCk7Ci0JCQlFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCWlmIChuYXR1cmVzLmdldChpKSBpbnN0YW5jZW9mIEVNRk5hdHVyZSkKLQkJCQkJbmF0dXJlID0gKEVNRk5hdHVyZSkgbmF0dXJlcy5nZXQoaSk7Ci0JCQl9Ci0JCQlMaXN0IGFkYXB0ZXJGYWN0b3JpZXMgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgSmF2YUpET01BZGFwdGVyRmFjdG9yeSkgewotCQkJCUphdmFKRE9NQWRhcHRlckZhY3RvcnkgamF2YUZhY3RvcnkgPSAoSmF2YUpET01BZGFwdGVyRmFjdG9yeSkgZmFjdG9yeTsKLQkJCQlqYXZhRmFjdG9yeS5mbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihwcmltYXJ5S2V5Q2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGRvbid0IHJlYWxseSBjYXJlIHdoYXQgdGhlIGV4Y2VwdGlvbiB3YXMsIHdlJ2xsIGp1c3QgYmFpbCBvdXQKLQkJCS8vIGFuZCByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DbGFzc3BhdGhNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzlkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhNb2RlbCBpbXBsZW1lbnRzIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLCBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBzZWxlY3RlZEVBUkNvbXBvbmVudDsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudFtdIGF2YWlsYWJsZUVBUkNvbXBvbmVudHMgPSBudWxsOwotCXByb3RlY3RlZCBDbGFzc1BhdGhTZWxlY3Rpb24gY2xhc3NQYXRoU2VsZWN0aW9uOwotCXByb3RlY3RlZCBMaXN0IGxpc3RlbmVyczsKLQlwcm90ZWN0ZWQgTGlzdCBub25SZXNvdXJjZUZpbGVzOwotCXByb3RlY3RlZCBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHN0YXRlVmFsaWRhdG9yOwotCXByb3RlY3RlZCBBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fRUFSX01FU1NBR0UgPSBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTk9fRUFSX0pBUkRFUF9GT1JfTU9EX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIExpc3QgdGFyZ2V0V0xQUmVmQ29tcG9uZW50TGlzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dMUE1vZGVsID0gZmFsc2U7Ci0JcHJvdGVjdGVkIENsYXNzUGF0aFNlbGVjdGlvbiBjbGFzc1BhdGhXTFBTZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJSVZpcnR1YWxDb21wb25lbnQgZTEgPSAoSVZpcnR1YWxDb21wb25lbnQpIG8xOwotCQkJSVZpcnR1YWxDb21wb25lbnQgZTIgPSAoSVZpcnR1YWxDb21wb25lbnQpIG8yOwotCQkJcmV0dXJuIGUxLmdldFByb2plY3QoKS5nZXROYW1lKCkuY29tcGFyZVRvKGUyLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBDbGFzc3BhdGhNb2RlbChBcmNoaXZlTWFuaWZlc3QgaW5pdGlhbE1hbmlmZXN0KSB7Ci0JCXRoaXMoaW5pdGlhbE1hbmlmZXN0LCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzc3BhdGhNb2RlbChBcmNoaXZlTWFuaWZlc3QgaW5pdGlhbE1hbmlmZXN0LCBib29sZWFuIGlzV0xQTW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJbWFuaWZlc3QgPSBpbml0aWFsTWFuaWZlc3Q7Ci0JCXRoaXMuaXNXTFBNb2RlbCA9IGlzV0xQTW9kZWw7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJaW5pdGlhbGl6ZUNvbXBvbmVudCgpOwotCQlnZXRBdmFpbGFibGVFQVJDb21wb25lbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb21wb25lbnQoKSB7Ci0JCXNldENvbXBvbmVudChDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnRbXSByZWZyZXNoQXZhaWxhYmxlRUFScygpIHsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdFtdIGVhclByb2plY3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQkJYXZhaWxhYmxlRUFSQ29tcG9uZW50cyA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRDb21wb25lbnRzKGVhclByb2plY3RzKTsKLQkJCWlmIChhdmFpbGFibGVFQVJDb21wb25lbnRzICE9IG51bGwgJiYgYXZhaWxhYmxlRUFSQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJQXJyYXlzLnNvcnQoYXZhaWxhYmxlRUFSQ29tcG9uZW50cywgY29tcGFyYXRvcik7Ci0JCQkJaWYgKHNlbGVjdGVkRUFSQ29tcG9uZW50ID09IG51bGwgfHwgIUFycmF5cy5hc0xpc3QoYXZhaWxhYmxlRUFSQ29tcG9uZW50cykuY29udGFpbnMoc2VsZWN0ZWRFQVJDb21wb25lbnQpKSB7Ci0JCQkJCWlmIChhdmFpbGFibGVFQVJDb21wb25lbnRzLmxlbmd0aCA+IDApCi0JCQkJCQlzZWxlY3RlZEVBUkNvbXBvbmVudCA9IGF2YWlsYWJsZUVBUkNvbXBvbmVudHNbMF07Ci0JCQkJCWVsc2UKLQkJCQkJCXNlbGVjdGVkRUFSQ29tcG9uZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJsZUVBUkNvbXBvbmVudHM7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0QXZhaWxhYmxlRUFSQ29tcG9uZW50cygpIHsKLQkJaWYgKGF2YWlsYWJsZUVBUkNvbXBvbmVudHMgPT0gbnVsbCkKLQkJCXJlZnJlc2hBdmFpbGFibGVFQVJzKCk7Ci0JCXJldHVybiBhdmFpbGFibGVFQVJDb21wb25lbnRzOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRTZWxlY3RlZEVBUkNvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkRUFSQ29tcG9uZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRUFSQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlzZWxlY3RlZEVBUkNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50LkVBUl9QUk9KRUNUX0NIQU5HRUQpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVVUkkoKSB7Ci0JCWlmIChzZWxlY3RlZEVBUkNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSBbXSByZWZzID0gc2VsZWN0ZWRFQVJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcCA9IGdldENvbXBvbmVudCgpOwotCQkJZm9yKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKG1vZHVsZUNvbXApKXsKLQkJCQkJcmV0dXJuIHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlbGVjdGlvbihBcmNoaXZlTWFuaWZlc3QgZXhpc3RpbmcpIHsKLQkJCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGdldFByb2plY3QoKSkpIHsKLQkJCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQkJaWYoZXhpc3RpbmcgIT0gbnVsbCl7Ci0JCQkJCQltYW5pZmVzdCA9IGV4aXN0aW5nOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNyZWF0ZUNsYXNzUGF0aFNlbGVjdGlvbigpOwotCQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsYXNzUGF0aFNlbGVjdGlvbigpIHsKLQkJaWYgKGdldENvbXBvbmVudCgpICE9IG51bGwgJiYgc2VsZWN0ZWRFQVJDb21wb25lbnQgIT0gbnVsbCApIHsKLQkJCWNsYXNzUGF0aFNlbGVjdGlvbiA9IG5ldyBDbGFzc1BhdGhTZWxlY3Rpb24oZ2V0Q29tcG9uZW50KCksIHNlbGVjdGVkRUFSQ29tcG9uZW50KTsKLQkJfSBlbHNlIGlmIChzZWxlY3RlZEVBUkNvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQljbGFzc1BhdGhTZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKGdldENvbXBvbmVudCgpKTsKLQkJfSBlbHNlIHsKLQkJCWNsYXNzUGF0aFNlbGVjdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyBDbGFzc1BhdGhTZWxlY3Rpb24gZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCkgewotCQlpZiAoY2xhc3NQYXRoU2VsZWN0aW9uID09IG51bGwpCi0JCQlpbml0aWFsaXplU2VsZWN0aW9uKG51bGwpOwotCQlyZXR1cm4gY2xhc3NQYXRoU2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Q2xhc3NQYXRoU2VsZWN0aW9uKEFyY2hpdmVNYW5pZmVzdCBtZikgewotCQlpbml0aWFsaXplU2VsZWN0aW9uKG1mKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50LkNMQVNTX1BBVEhfUkVTRVQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldENsYXNzUGF0aFNlbGVjdGlvbigpIHsKLQkJcmVzZXRDbGFzc1BhdGhTZWxlY3Rpb24obnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0Q2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpIHsKLQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDbGFzc3BhdGhNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzc3BhdGhNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZmljYXRpb24oQ2xhc3NwYXRoTW9kZWxFdmVudCBldnQpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gKENsYXNzcGF0aE1vZGVsTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7Ci0JCQlsaXN0ZW5lci5tb2RlbENoYW5nZWQoZXZ0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGlzU2VsZWN0ZWQgZm9yIHRoZSBjbGFzc3BhdGggZWxlbWVudCBhbmQgc2VuZHMgb3V0IGEgbm90aWZpY2F0aW9uIG9mIHR5cGUKLQkgKiB7QGxpbmsgQ2xhc3NwYXRoTW9kZWxFdmVudCNDTEFTU19QQVRIX0NIQU5HRUR9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQllbGVtZW50LnNldFNlbGVjdGVkKHNlbGVjdGVkKTsKLQkJaWYgKCFpc1dMUE1vZGVsKCkpIHsKLQkJCXVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhdCBsZWFzdCBmaXJlIHRoZSBjaGFuZ2UgZXZlbnQKLQkJCWZpcmVOb3RpZmljYXRpb24obmV3IENsYXNzcGF0aE1vZGVsRXZlbnQoQ2xhc3NwYXRoTW9kZWxFdmVudC5DTEFTU19QQVRIX0NIQU5HRUQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBvciBkZXNlbGVjdCBhbGwgYW5kIG5vdGlmeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbENsYXNzcGF0aEVsZW1lbnRzU2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gcyA9IGdldENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlzLnNldEFsbFNlbGVjdGVkKHNlbGVjdGVkKTsKLQkJCXVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3Qgb3IgZGVzZWxlY3QgYWxsIGFuZCBub3RpZnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxDbGFzc3BhdGhFbGVtZW50c1NlbGVjdGVkKExpc3QgZWxlbWVudHMsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHMgPSBnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJcy5zZXRBbGxTZWxlY3RlZChlbGVtZW50cywgc2VsZWN0ZWQpOwotCQkJdXBkYXRlTWFuaWZlc3RDbGFzc3BhdGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1hbmlmZXN0IENsYXNzLVBhdGg6LCBhbmQgc2VuZHMgb3V0IGEgbm90aWZpY2F0aW9uIG9mIHR5cGUKLQkgKiB7QGxpbmsgQ2xhc3NwYXRoTW9kZWxFdmVudCNDTEFTU19QQVRIX0NIQU5HRUR9Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTWFuaWZlc3RDbGFzc3BhdGgoKSB7Ci0JCWlmIChjbGFzc1BhdGhTZWxlY3Rpb24gIT0gbnVsbCAmJiBjbGFzc1BhdGhTZWxlY3Rpb24uaXNNb2RpZmllZCgpKSB7Ci0JCQltYW5pZmVzdC5zZXRDbGFzc1BhdGgoY2xhc3NQYXRoU2VsZWN0aW9uLnRvU3RyaW5nKCkpOwotCQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50LkNMQVNTX1BBVEhfQ0hBTkdFRCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgbWFuaWZlc3QgTWFpbi1DbGFzczosIGFuZCBzZW5kcyBvdXQgYSBub3RpZmljYXRpb24gb2YgdHlwZQotCSAqIHtAbGluayBDbGFzc3BhdGhNb2RlbEV2ZW50I01BSU5fQ0xBU1NfQ0hBTkdFRH0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNYWluQ2xhc3MoU3RyaW5nIG1haW5DbGFzcykgewotCQltYW5pZmVzdC5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50Lk1BSU5fQ0xBU1NfQ0hBTkdFRCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1hbmlmZXN0IE1haW4tQ2xhc3M6LCBhbmQgc2VuZHMgb3V0IGEgbm90aWZpY2F0aW9uIG9mIHR5cGUKLQkgKiB7QGxpbmsgQ2xhc3NwYXRoTW9kZWxFdmVudCNNQUlOX0NMQVNTX0NIQU5HRUR9Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlSW1wbFZlcnNpb24oU3RyaW5nIGltcGxWZXJzaW9uKSB7Ci0JCW1hbmlmZXN0LnNldEltcGxlbWVuYXRpb25WZXJzaW9uKGltcGxWZXJzaW9uKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50LklNUExfVkVSU0lPTl9DSEFOR0VEKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZVNhdmVkRXZlbnQoKSB7Ci0JCWZpcmVOb3RpZmljYXRpb24obmV3IENsYXNzcGF0aE1vZGVsRXZlbnQoQ2xhc3NwYXRoTW9kZWxFdmVudC5NT0RFTF9TQVZFRCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmlmZXN0IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGFyY2hpdmUsIG9yIG5vdGlmeWluZwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRNYW5pZmVzdChBcmNoaXZlTWFuaWZlc3QgbWYpIHsKLQkJbWFuaWZlc3QgPSBtZjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYW5mZXN0IG9uIHRoZSBhcmNoaXZlLCB1cGRhdGVzIHRoZSBjbGFzc3BhdGggc2VsZWN0aW9uLCBhbmQgbm90aWZpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChBcmNoaXZlTWFuaWZlc3QgbmV3TWFuaWZlc3QpIHsKLQkJdHJ5IHsKLQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QoZ2V0UHJvamVjdCgpLCBuZXdNYW5pZmVzdCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQkJZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7IC8vIEVuc3VyZSB0aGUgc2VsZWN0aW9uIGlzIGluaXRpYWxpemVkLgotCQlmaXJlTm90aWZpY2F0aW9uKG5ldyBDbGFzc3BhdGhNb2RlbEV2ZW50KENsYXNzcGF0aE1vZGVsRXZlbnQuTUFOSUZFU1RfQ0hBTkdFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdEVBUihpbnQgaW5kZXgpIHsKLQkJc2VsZWN0ZWRFQVJDb21wb25lbnQgPSBhdmFpbGFibGVFQVJDb21wb25lbnRzW2luZGV4XTsKLQkJaW5pdGlhbGl6ZVNlbGVjdGlvbihudWxsKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihuZXcgQ2xhc3NwYXRoTW9kZWxFdmVudChDbGFzc3BhdGhNb2RlbEV2ZW50LkVBUl9QUk9KRUNUX0NIQU5HRUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoTGlzdCB0b01vdmVVcCkgewotCQlnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKS5tb3ZlVXAodG9Nb3ZlVXApOwotCQl1cGRhdGVNYW5pZmVzdENsYXNzcGF0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKExpc3QgdG9Nb3ZlRG93bikgewotCQlnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKS5tb3ZlRG93bih0b01vdmVEb3duKTsKLQkJdXBkYXRlTWFuaWZlc3RDbGFzc3BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBudWxsOwotCQlpZiAoZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkKLQkJCW1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KGdldFByb2plY3QoKSk7Ci0JCXJlZnJlc2hBdmFpbGFibGVFQVJzKCk7Ci0JCXJlc2V0Q2xhc3NQYXRoU2VsZWN0aW9uKG1mKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCkgewotCQlpZiAobm9uUmVzb3VyY2VGaWxlcyA9PSBudWxsKQotCQkJaW5pdE5vblJlc291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIG5vblJlc291cmNlRmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5vblJlc291cmNlRmlsZXMoKSB7Ci0JCS8vIE1pZ2h0IGJlIG9wZW5lZCBmcm9tIGEgSkFSCi0JCWlmIChnZXRDb21wb25lbnQoKSA9PSBudWxsIHx8IGdldENvbXBvbmVudCgpLmlzQmluYXJ5KCkpewotCQkJcmV0dXJuOwotCQl9IAotCQlub25SZXNvdXJjZUZpbGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJaWYoaXNXTFBNb2RlbCl7Ci0JCQlJRmlsZSBkb3RQcm9qZWN0ID0gZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldEZpbGUoUHJvamVjdFV0aWxpdGllcy5ET1RfUFJPSkVDVCk7Ci0JCQlpZihkb3RQcm9qZWN0ICE9IG51bGwpewotCQkJCW5vblJlc291cmNlRmlsZXMuYWRkKGRvdFByb2plY3QpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUZpbGUgbWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUoZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChtZiAhPSBudWxsKXsKLQkJCQlub25SZXNvdXJjZUZpbGVzLmFkZChtZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc2VsZWN0aW9uLmlzTW9kaWZpZWQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyB0aGF0IHdpbGwgZ2V0IG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mIHJ1bm5pbmcgdGhpcyBvcGVyYXRpb247Ci0JICogdXNlZCBmb3IgdmFsaWRhdGVFZGl0Ci0JICovCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSUZpbGUgYUZpbGUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUoZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXN1bHQuYWRkKGFGaWxlKTsKLQkJcmVzdWx0LmFkZEFsbChQcm9qZWN0VXRpbGl0aWVzLmdldEZpbGVzQWZmZWN0ZWRCeUNsYXNzcGF0aENoYW5nZShnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0UmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmKGlzV0xQTW9kZWwpewotCQkJU3RydWN0dXJlRWRpdCBzRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQkJTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbCA9IHNFZGl0LmdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpOwotCQkJCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc291cmNlcy5hZGRBbGwoc3RydWN0dXJhbE1vZGVsLmdldFJlc291cmNlcygpKTsKLQkJCQlyZXR1cm4gcmVzb3VyY2VzOwotCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsJCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc0VkaXQgIT1udWxsKXsKLQkJCQkJc0VkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0RGVwZW5kZW5jeUlmTmVjZXNzYXJ5KElQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0KSB7Ci0JCWdldENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlpZiAoY2xhc3NQYXRoU2VsZWN0aW9uID09IG51bGwgfHwgY2xhc3NQYXRoU2VsZWN0aW9uLmhhc0RpcmVjdE9ySW5kaXJlY3REZXBlbmRlbmN5VG8ocmVmZXJlbmNlZFByb2plY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50KHJlZmVyZW5jZWRQcm9qZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJc2V0U2VsZWN0aW9uKGVsZW1lbnQsIHRydWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNlbGVjdERlcGVuZGVuY3lJZk5lY2Vzc2FyeShTdHJpbmcgamFyTmFtZSkgewotCQlnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJaWYgKGNsYXNzUGF0aFNlbGVjdGlvbiA9PSBudWxsIHx8IGNsYXNzUGF0aFNlbGVjdGlvbi5oYXNEaXJlY3RPckluZGlyZWN0RGVwZW5kZW5jeVRvKGphck5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50KGphck5hbWUpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlzZXRTZWxlY3Rpb24oZWxlbWVudCwgdHJ1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVwZW5kZW5jeShTdHJpbmcgamFyTmFtZSkgewotCQlnZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLQkJaWYgKGNsYXNzUGF0aFNlbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50KGphck5hbWUpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNWYWxpZCgpKQotCQkJc2V0U2VsZWN0aW9uKGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEZXBlbmRlbmN5KElQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0KSB7Ci0JCWdldENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlpZiAoY2xhc3NQYXRoU2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY2xhc3NQYXRoU2VsZWN0aW9uLmdldENsYXNzcGF0aEVsZW1lbnQocmVmZXJlbmNlZFByb2plY3QpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNWYWxpZCgpKQotCQkJc2V0U2VsZWN0aW9uKGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RGaWx0ZXJMZXZlbChpbnQgZmlsdGVyTGV2ZWwpIHsKLQkJZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JCWlmIChjbGFzc1BhdGhTZWxlY3Rpb24gIT0gbnVsbCkKLQkJCWNsYXNzUGF0aFNlbGVjdGlvbi5zZWxlY3RGaWx0ZXJMZXZlbChmaWx0ZXJMZXZlbCk7Ci0JCXVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhdGVWYWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGdldFN0YXRlVmFsaWRhdG9yKCkgewotCQlpZiAoc3RhdGVWYWxpZGF0b3IgPT0gbnVsbCkKLQkJCXN0YXRlVmFsaWRhdG9yID0gY3JlYXRlU3RhdGVWYWxpZGF0b3IoKTsKLQkJcmV0dXJuIHN0YXRlVmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjcmVhdGVTdGF0ZVZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlU3RhdGVWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgY3JlYXRlU3RhdGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrQWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFN0YXRlVmFsaWRhdG9yKCkubG9zdEFjdGl2YXRpb24ocHJlc2VudGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkudmFsaWRhdGVTdGF0ZShwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIENsYXNzUGF0aFNlbGVjdGlvbiBnZXRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkgewotCQlpZiAoY2xhc3NQYXRoV0xQU2VsZWN0aW9uID09IG51bGwpCi0JCQlpbml0aWFsaXplU2VsZWN0aW9uRm9yV0xQcygpOwotCQlyZXR1cm4gY2xhc3NQYXRoV0xQU2VsZWN0aW9uOwotCX0KLQotCS8vY29waWVkIGZyb20gV2ViQXJ0aWZhY3RFZGl0Ci0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggV0VCTElCID0gIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORl9MSUIpLm1ha2VBYnNvbHV0ZSgpOwotCXByaXZhdGUgc3RhdGljIElQYXRoIFdFQklORl9DTEFTU0VTID0gIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTKS5tYWtlQWJzb2x1dGUoKTsKLQlwcml2YXRlIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldExpYk1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBudWxsOwotCQlpZiAoIWNvbXAuaXNCaW5hcnkoKSkKLQkJCXJlZkNvbXBvbmVudHMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KWNvbXApLmdldE5vbk1hbmlmZXN0UmVmZXJlbmNlcygpOwotCQllbHNlCi0JCQlyZWZDb21wb25lbnRzID0gY29tcC5nZXRSZWZlcmVuY2VzKCk7Ci0JCS8vIENoZWNrIHRoZSBkZXBsb3llZCBwYXRoIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBsaWIgcGFyZW50IGZvbGRlciBhbmQgbWF0Y2hzIHRoZSB3ZWIueG1sCi0JCS8vIGJhc2UgcGF0aAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWZDb21wb25lbnRzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFdFQkxJQikpCi0JCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJfQotCi0JCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZWxlY3Rpb25Gb3JXTFBzKCkgewotCQljbGFzc1BhdGhXTFBTZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKCk7Ci0JCWNsYXNzUGF0aFdMUFNlbGVjdGlvbi5zZXRGaWx0ZXJMZXZlbChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkUpOwotCQkvL3RoaXMgaXMgdGhlIHNldCBvZiBhbGwgcHJvamVjdHMgdGhhdCBhcmUgYWxyZWFkeSBtYXBwZWQgYXMgd2ViIGxpYnJhcnkgcHJvamVjdHMKLQkJSGFzaFNldCBleGlzdGluZ1dlYkxpYlByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBvdGhlckV4aXN0aW5nV2ViTGliUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gbGliTW9kdWxlcyA9IGdldExpYk1vZHVsZXMoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCWZvcihpbnQgaT0wO2k8bGliTW9kdWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gbGliTW9kdWxlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZihjb21wICE9IG51bGwgJiYgY29tcC5leGlzdHMoKSl7Ci0JCQkJaWYoY29tcC5pc0JpbmFyeSgpKXsKLQkJCQkJb3RoZXJFeGlzdGluZ1dlYkxpYlJlZnMuYWRkKGxpYk1vZHVsZXNbaV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlQcm9qZWN0IHAgPSBjb21wLmdldFByb2plY3QoKTsKLQkJCQkJaWYocCAhPSBudWxsICYmIHAuZXhpc3RzKCkpewotCQkJCQkJZXhpc3RpbmdXZWJMaWJQcm9qZWN0cy5hZGQocCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vdGhpcyBpcyB0aGUgbGlzdCBvZiBhbGwgcHJvamVjdHMgdGhhdCBzaG91bGQgc2hvdyB1cCBpbiB0aGUgbGlzdAotCQlIYXNoU2V0IHBvc3NpYmxlV2ViTGlicyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRyeXsKLQkJCUxpc3QgamF2YVByb2plY3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0QWxsSmF2YU5vbkZsZXhQcm9qZWN0cygpOwotCQkJcG9zc2libGVXZWJMaWJzLmFkZEFsbChqYXZhUHJvamVjdHMpOwotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJSVByb2plY3RbXSB1dGlsaXR5UHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0c0luV29ya3NwYWNlT2ZUeXBlKEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFkpOwotCQlwb3NzaWJsZVdlYkxpYnMuYWRkQWxsKEFycmF5cy5hc0xpc3QodXRpbGl0eVByb2plY3RzKSk7Ci0JCUlQcm9qZWN0W10gZWpiUHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0c0luV29ya3NwYWNlT2ZUeXBlKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQik7Ci0JCXBvc3NpYmxlV2ViTGlicy5hZGRBbGwoQXJyYXlzLmFzTGlzdChlamJQcm9qZWN0cykpOwotCQkKLQkJTWFwIHBhdGhUb0NvbXAgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJLy9maXJzdCBoYW5kbGUgdGhlIHByb2plY3RzIGNhc2UKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9zc2libGVXZWJMaWJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJSVByb2plY3QgcG9zc2libGVXZWJMaWIgPSAoSVByb2plY3QpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYocG9zc2libGVXZWJMaWIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIi4iKSl7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNFeGlzdGluZ1dlYkxpYiA9IGV4aXN0aW5nV2ViTGliUHJvamVjdHMuY29udGFpbnMocG9zc2libGVXZWJMaWIpOwotCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmNyZWF0ZVByb2plY3RFbGVtZW50KHBvc3NpYmxlV2ViTGliLCBpc0V4aXN0aW5nV2ViTGliKTsKLQkJCS8vIGJ1aWxkIG9mIG1hcCBvZiBhbGwgdW5pcXVlIGNsYXNzcGF0aCBjb21wb25lbnQgY29udHJpYnV0aW9ucyBmcm9tIGRlcGVuZGVudCBwcm9qZWN0cwotCQkJaWYoaXNFeGlzdGluZ1dlYkxpYil7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocG9zc2libGVXZWJMaWIpOwotCQkJCWlmKGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmJ1aWxkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeU1hcChjb21wb25lbnQsIHBhdGhUb0NvbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvL25leHQgaGFuZGxlIGVudHJpZXMgZm9yIGFsbCBvdGhlciB3ZWIgbGliIHJlZnMKLQkJLy9lLmcuIHRvIGphcnMgaW4gb3RoZXIgcHJvamVjdHMsIG9yIG91dHNpZGUgdGhlIHdvcmtzcGFjZSBvciByZWxhdGl2ZSB0byBhIHZhcgotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBvdGhlckV4aXN0aW5nV2ViTGliUmVmcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCS8vIGRvIG5vdCBhZGQgaWYgdGhpcyBpcyBhIGNsYXNzcGF0aCBlbnRyeSBkZXBlbmRlbmN5Ci0JCQlpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KHJlZmVyZW5jZWRDb21wb25lbnQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVN0cmluZyB1bnJlc29sdmVkVVJJID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKHJlZmVyZW5jZWRDb21wb25lbnQpKSk7Ci0JCQkJVVJJIGFyY2hpdmVVUkkgPSBVUkkuY3JlYXRlVVJJKHVucmVzb2x2ZWRVUkkpOwotCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFdMUFNlbGVjdGlvbi5jcmVhdGVBcmNoaXZlRWxlbWVudChVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKHJlZmVyZW5jZWRDb21wb25lbnQpKSwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXROYW1lKCksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSk7Ci0JCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgdW5yZXNvbHZlZFVSSSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYWRkIENsYXNzcGF0aEVsZW1lbnRzIGZvciBhbGwgZGVwZW5kZW50IHByb2plY3QgY3AgZGVwZW5kZW5jaWVzCi0JCWZpbmFsIEl0ZXJhdG9yIGl0ID0gcGF0aFRvQ29tcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gKElWaXJ0dWFsQ29tcG9uZW50KSBpdC5uZXh0KCk7Ci0JCQlmaW5hbCBVUkkgYXJjaGl2ZVVSSSA9IFVSSS5jcmVhdGVVUkkoTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcoYykpOwotCQkJU3RyaW5nIHVucmVzb2x2ZWRVUkkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl1bnJlc29sdmVkVVJJID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShhcmNoaXZlVVJJKTsKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJaWYgKHVucmVzb2x2ZWRVUkkgIT0gbnVsbCkgewotCQkJCWZpbmFsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFdMUFNlbGVjdGlvbi5jcmVhdGVDbGFzc3BhdGhBcmNoaXZlRWxlbWVudChjLmdldFByb2plY3QoKSwgYXJjaGl2ZVVSSSwgdW5yZXNvbHZlZFVSSSk7Ci0JCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgdW5yZXNvbHZlZFVSSSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIEFkZCBlbGVtZW50cyBmb3IgcmF3IGNsYXNzcGF0aCBlbnRyaWVzIChlaXRoZXIgYWxyZWFkeSB0YWdnZWQgb3IgcG90ZW50aWFsbHkgdGFnZ2FibGUpIAotCQl0cnkgewotCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmNyZWF0ZUNsYXNzcGF0aEVudHJ5RWxlbWVudHMoY29tcG9uZW50LCBXRUJMSUIsIFdFQklORl9DTEFTU0VTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXTFBNb2RlbCgpIHsKLQkJcmV0dXJuIGlzV0xQTW9kZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vQ2xhc3NwYXRoTW9kZWxFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4NDA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vQ2xhc3NwYXRoTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoTW9kZWxFdmVudCBleHRlbmRzIE9iamVjdCB7Ci0JcHJvdGVjdGVkIGludCBldmVudFR5cGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfUEFUSF9DSEFOR0VEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQVJfUFJPSkVDVF9DSEFOR0VEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5JRkVTVF9DSEFOR0VEID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19QQVRIX1JFU0VUID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUlOX0NMQVNTX0NIQU5HRUQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1NBVkVEID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBMX1ZFUlNJT05fQ0hBTkdFRCA9IDc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2xhc3NwYXRoTW9kZWxFdmVudC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoTW9kZWxFdmVudChpbnQgZXZlbnRUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV2ZW50VHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGV2ZW50VHlwZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DbGFzc3BhdGhNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzMzZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lciB7Ci0Jdm9pZCBtb2RlbENoYW5nZWQoQ2xhc3NwYXRoTW9kZWxFdmVudCBldnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DcmVhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NyZWF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzViZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NyZWF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKLQotcHVibGljIGludGVyZmFjZSBDcmVhdGlvbkNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCwgdXNlIHRoZSBwcmVmZXJlbmNlcyBkaXJlY3RseQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9XRUJfU09VUkNFX0ZPTERFUiA9CUNvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uREVGQVVMVF9TT1VSQ0VfRk9MREVSKTsgCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQsIHVzZSB0aGUgcHJlZmVyZW5jZXMgZGlyZWN0bHkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JU3RyaW5nIERFRkFVTFRfRUpCX1NPVVJDRV9GT0xERVIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuRUpCX0NPTlRFTlRfRk9MREVSKTsKLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCwgdXNlIHRoZSBwcmVmZXJlbmNlcyBkaXJlY3RseQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9DT05ORUNUT1JfU09VUkNFX0ZPTERFUiA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5KQ0FfQ09OVEVOVF9GT0xERVIpOwotCS8qKgotCSAqIEBkZXByZWNhdGVkLCB1c2UgdGhlIHByZWZlcmVuY2VzIGRpcmVjdGx5Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCVN0cmluZyBERUZBVUxUX0FQUENMSUVOVF9TT1VSQ0VfRk9MREVSID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIpOyAKLQlTdHJpbmcgRUpCX0NMSUVOVF9OQU1FID0iQ2xpZW50UHJvamVjdCI7Ly8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgQ0xJRU5UX0pBUl9VUkk9IkNsaWVudEpBUlVSSSI7Ly8kTk9OLU5MUy0xJCAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg2N2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotCi17Ci1wdWJsaWMgYm9vbGVhbiB0ZXN0KCBmaW5hbCBPYmplY3QgcmVjZWl2ZXIsIAotICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5LCAKLSAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3MsIAotICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlICkKLXsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAgIGlmKCAhICggcmVjZWl2ZXIgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gKCAoSUNvbXBpbGF0aW9uVW5pdCApIHJlY2VpdmVyICkuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggcGogPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHZhbHVlOwotICAgICAgICBmaW5hbCBpbnQgY29sb24gPSB2YWwuaW5kZXhPZiggJzonICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgZmlkOwotICAgICAgICBmaW5hbCBTdHJpbmcgdmV4cHI7Ci0gICAgICAgIAotICAgICAgICBpZiggY29sb24gPT0gLTEgfHwgY29sb24gPT0gdmFsLmxlbmd0aCgpIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZCA9IHZhbDsKLSAgICAgICAgICAgIHZleHByID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZCA9IHZhbC5zdWJzdHJpbmcoIDAsIGNvbG9uICk7Ci0gICAgICAgICAgICB2ZXhwciA9IHZhbC5zdWJzdHJpbmcoIGNvbG9uICsgMSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KCBwaiwgZmlkLCB2ZXhwciApOwotICAgIH0KLSAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRUNvbW1vbk1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRUNvbW1vbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjkxMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVDb21tb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29tbW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqMmVlX2NvbW1vbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKMkVFQ29tbW9uTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRUNVUklUWV9ST0xFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRUNVUklUWV9ST0xFX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX0NMQVNTX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9DTEFTU19GSUxFX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfRk9MREVSX1BST0pFQ1RfTk9UX09QRU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfTk9UX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9DTEFTU19GT0xERVJfU1RBVElDX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05PVF9TT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfTkFNRV9RVUFMSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBVkFfQ0xBU1NfTkFNRV9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX0NMQVNTX05BTUVfV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9DTEFTU19TVVBFUkNMQVNTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9DTEFTU19TVVBFUkNMQVNTX0ZJTkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX1BBQ0FLR0VfTkFNRV9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX1BBQ0tBR0VfTkFNRV9XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9CT1RIX0ZJTkFMX0FORF9BQlNUUkFDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFQ1VSSVRZX1JPTEVfTElTVF9FTVBUWTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX0NMQVNTX0ZPTERFUl9OT1RfRVhJU1Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRU1QVFlfTU9EVUxFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VNUFRZX1BST0pFQ1RfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfUFJPSkVDVF9JTkFDQ0VTU0lCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1BST0pFQ1RfTkFNRV9FWElTVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1ZFUlNJT05fTk9UX1NVUFBPUlRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTk9UX1NVUFBPUlRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0FCU09MVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9OT19NT0RFTF9QUk9WSURFUl9GT1JfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTk9fTU9ERUxfUFJPVklERVJfRk9SX1ZJUlRVQUxfQ09NUE9ORU5UOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9NT0RVTEVfQ0xBU1NQQVRIX0NPTlRBSU5FUl9OQU1FOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENMQVNTUEFUSF9FTlRSWV9ERVBFTkRFTkNZX1BSRUZJWDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVFlQRV9ESUZGRVJFTlRfQ0FTRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVFlQRV9BTFJFQURZX0VYSVNUOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEoyRUVDb21tb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRURlcGVuZGVuY3lMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVEZXBlbmRlbmN5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzMDA0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRURlcGVuZGVuY3lMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklNb2R1bGVFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgSjJFRURlcGVuZGVuY3lMaXN0ZW5lciBJTlNUQU5DRSA9IG5ldyBKMkVFRGVwZW5kZW5jeUxpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIoKSB7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0PiBjYWNoZWRFQVJNb2R1bGVEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOwotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlTW9kdWxlRGVwZW5kZW5jaWVzKElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkJaWYgKEVhclV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IEVhclV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2VzKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBudWxsOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJY29tcCA9IHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmICghY29tcC5pc0JpbmFyeSgpKSB7Ci0JCQkJCWNhY2hlZEVBUk1vZHVsZURlcGVuZGVuY2llcy5hZGQoY29tcC5nZXRQcm9qZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCWlmICghY2FjaGVkRUFSTW9kdWxlRGVwZW5kZW5jaWVzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxJUHJvamVjdD4gaXRlcmF0b3IgPSBjYWNoZWRFQVJNb2R1bGVEZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UudXBkYXRlKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCQljYWNoZWRFQVJNb2R1bGVEZXBlbmRlbmNpZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5wcmVVcGRhdGUoKTsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRToKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURToKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJY2FjaGVNb2R1bGVEZXBlbmRlbmNpZXMoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRToKLQkJCQlldmVudC5nZXREZWx0YSgpLmFjY2VwdCh0aGlzKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5wb3N0VXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQljYXNlIElSZXNvdXJjZS5ST09UOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0JCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWlmICgoSVJlc291cmNlRGVsdGEuQURERUQgJiBraW5kKSAhPSAwKSB7Ci0JCQkJLy8gaWYgYW4gRUFSIHByb2plY3QgaXMgYWRkZWQgdGhlbiBhbGwgZGVwZW5kZW50IG1vZHVsZXMgbXVzdCBiZQotCQkJCS8vIHVwZGF0ZWQKLQkJCQlpZiAoRWFyVXRpbGl0aWVzLmlzRUFSUHJvamVjdCgoSVByb2plY3QpIHJlc291cmNlKSkgewotCQkJCQljYWNoZU1vZHVsZURlcGVuZGVuY2llcygoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJdXBkYXRlTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoKElSZXNvdXJjZURlbHRhLlJFTU9WRUQgJiBraW5kKSAhPSAwKSB7Ci0JCQkJdXBkYXRlTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICgoSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmIGtpbmQpICE9IDApIHsKLQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJCWlmICgoSVJlc291cmNlRGVsdGEuT1BFTiAmIGZsYWdzKSAhPSAwKSB7Ci0JCQkJCWJvb2xlYW4gaXNPcGVuID0gKChJUHJvamVjdCkgcmVzb3VyY2UpLmlzT3BlbigpOwotCQkJCQlpZiAoaXNPcGVuKSB7Ci0JCQkJCQkvLyBpZiBhbiBFQVIgcHJvamVjdCBpcyBvcGVuIGFsbCBkZXBlbmRlbnQgbW9kdWxlcyBtdXN0Ci0JCQkJCQkvLyBiZSB1cGRhdGVkCi0JCQkJCQljYWNoZU1vZHVsZURlcGVuZGVuY2llcygoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQkvLyB0aGlzIHdpbGwgYWxzbyBwaWNrdXAgYm90aCBjbG9zZSBhbmQgb3BlbiBldmVudHMKLQkJCQkJLy8gaWYgdGhlIEVBUiBwcm9qZWN0IGlzIGNsb3NlZCwgdGhlIGNhY2hlZCBkZXBlbmRlbnQKLQkJCQkJLy8gbW9kdWxlcyB3aWxsIGFscmVhZHkKLQkJCQkJdXBkYXRlTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQljYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJY2FzZSBJUmVzb3VyY2UuRklMRToKLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJLy8gTUFOSUZFU1QuTUYgbXVzdCBiZSBhbGwgY2FwcyBwZXIgc3BlYwotCQkJaWYgKG5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfU0hPUlRfTkFNRSkpIHsKLQkJCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBmYWxzZSk7Ci0JCQkJaWYgKG51bGwgPT0gbWFuaWZlc3RGaWxlIHx8IHJlc291cmNlLmVxdWFscyhtYW5pZmVzdEZpbGUpKSB7Ci0JCQkJCUlEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UudXBkYXRlKHJlc291cmNlLmdldFByb2plY3QoKSwgSURlcGVuZGVuY3lHcmFwaC5NT0RJRklFRCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LldUUF9NT0RVTEVTX1NIT1JUX05BTUUpKSB7Ci0JCQkJaWYgKEVhclV0aWxpdGllcy5pc0VBUlByb2plY3QocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkvLyB1bmZvcnR1bmF0ZWx5LCBpbiB0aGlzIGNhc2UsIHRoZSBvbmx5IGVhc3kgd2F5IHRvIHVwZGF0ZQotCQkJCQkvLyBpcyB0byBmb3JjZSB0aGUgdXBkYXRlIG9mIGFsbCBwcm9qZWN0cwotCQkJCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQlmb3IgKElQcm9qZWN0IHNvdXJjZVByb2plY3QgOiBhbGxQcm9qZWN0cykgewotCQkJCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS51cGRhdGUoc291cmNlUHJvamVjdCwgSURlcGVuZGVuY3lHcmFwaC5NT0RJRklFRCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSKSB8fCBlbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX1dBUikgfHwgZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsIElNb2R1bGVFeHRlbnNpb25zLkRPVF9SQVIpKSB7Ci0JCQkJaWYgKEVhclV0aWxpdGllcy5pc0VBUlByb2plY3QocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQkJaWYgKGlzRm9sZGVyKHJlc291cmNlLmdldFBhcmVudCgpLCBjb21wLmdldFJvb3RGb2xkZXIoKSkpIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXAuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWYgOiByZWZzKSB7Ci0JCQkJCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS51cGRhdGUocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCksIElEZXBlbmRlbmN5R3JhcGguTU9ESUZJRUQpOwotCQkJCQkJfQotCQkJCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS51cGRhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoSWdub3JlQ2FzZShTdHJpbmcgc3RyLCBTdHJpbmcgc2Z4KSB7Ci0JCXJldHVybiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5lbmRzV2l0aElnbm9yZUNhc2Uoc3RyLCBzZngpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9sZGVyKElSZXNvdXJjZSByZXNvdXJjZSwgSVZpcnR1YWxGb2xkZXIgZm9sZGVyKSB7Ci0JCXJldHVybiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5pc0ZvbGRlcihyZXNvdXJjZSwgZm9sZGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTIyNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVWZXJzaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBuYWdyYXdhbAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVWZXJzaW9uVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0VGV4dFZlcnNpb24oaW50IGFWZXJzaW9uKSB7Ci0JCXN3aXRjaCAoYVZlcnNpb24pIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5TRVJWTEVUXzJfMjoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMl9URVhUOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuU0VSVkxFVF8yXzM6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzNfVEVYVDsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfMl80OgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQ7Ci0JCQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfMl81OgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQ7Ci0JCQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfM18wOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQ7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFSkJUZXh0VmVyc2lvbihpbnQgYVZlcnNpb24pIHsKLQotCQlzd2l0Y2ggKGFWZXJzaW9uKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMF9URVhUOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMV9URVhUOwotCQkKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQ7Ci0JCQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzFfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzFfVEVYVDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKQ0FUZXh0VmVyc2lvbihpbnQgYVZlcnNpb24pIHsKLQkJc3dpdGNoIChhVmVyc2lvbikgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVDsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVDsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVDsKLQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVUZXh0VmVyc2lvbihpbnQgYVZlcnNpb24pIHsKLQkJc3dpdGNoIChhVmVyc2lvbikgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQ7Ci0KLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVDsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzBfVEVYVDsKLQotCQl9Ci0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRFSkJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzFfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzFfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzVfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7Ci0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEoyRUVWZXJzaW9uSURUb0VKQlZlcnNpb25JRChpbnQgajJlZVZlcnNpb25JZCkgewotCQlzd2l0Y2ggKGoyZWVWZXJzaW9uSWQpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMV9JRDsKLQkJfQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRKMkVFVmVyc2lvbklEVG9XZWJWZXJzaW9uSUQoaW50IGoyZWVWZXJzaW9uSWQpIHsKLQkJc3dpdGNoIChqMmVlVmVyc2lvbklkKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7Ci0JCX0KLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0SjJFRVZlcnNpb25JRFRvQ29ubmVjdG9yVmVyc2lvbklEKGludCBqMmVlVmVyc2lvbklkKSB7Ci0JCXN3aXRjaCAoajJlZVZlcnNpb25JZCkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ7Ci0JCX0KLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydFZlcnNpb25TdHJpbmdUb0ludChJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKGNvbXAuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKQotCQkJcmV0dXJuIGNvbnZlcnRXZWJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcnNpb24pOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybiBjb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJzaW9uKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gY29udmVydENvbm5lY3RvclZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWludCBuVmVyc2lvbiA9IDA7Ci0JCQotCQlpZiggdmVyc2lvbi5lbmRzV2l0aCgiIikpeyAvLyROT04tTkxTLTEkCi0JCQluVmVyc2lvbiA9IDA7Ci0JCX0KLQkJCi0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzA7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzE7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzI7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzM7CQotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80OwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81OwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV82OwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wOwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzFfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8xOwkKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMjsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMzsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNDsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNTsJCi0KLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wOwkJCQotCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18xX1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMTsJCi0JCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzA7CQkJCi0JCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA7CQotCi0JCXJldHVybiBuVmVyc2lvbjsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhpbnQgdmVyc2lvbikgewotCQlTdHJpbmcgblZlcnNpb24gPSBudWxsOwotCQkKLQkJaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzApCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQ7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8xKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUOwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMikKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVDsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQ7CQotCQkKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzUpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQ7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV82KQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNl9URVhUOwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMCkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVDsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzEpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8xX1RFWFQ7CQotCQkKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMikKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVDsKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzMpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQ7Ci0JCQotCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80KQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNF9URVhUOwotCQkKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNSkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzVfVEVYVDsJCQotCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzApCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQ7CQkKLQotCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18xKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMV9URVhUOwkKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzApCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQ7CQkKLQkJCi0JCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzApCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQ7CQotCQotCQlyZXR1cm4gblZlcnNpb247Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1VwZGF0ZVByb2plY3RDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9VcGRhdGVQcm9qZWN0Q2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDAzYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1VwZGF0ZVByb2plY3RDbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlUHJvamVjdENsYXNzcGF0aCB7Ci0JCi0gCi0JcHVibGljIFVwZGF0ZVByb2plY3RDbGFzc3BhdGgoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIElQcm9qZWN0IGpQcm9qZWN0KXsKLQkJYWRkU3JjRm9sZGVyVG9Qcm9qZWN0KHNvdXJjZUZvbGRlciwgY29tcG9uZW50TmFtZSwgalByb2plY3QpOwotCX0KLQkKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIGNvbXBvbmVudE5hbWUsCi0JCQlJUHJvamVjdCBqUHJvamVjdCkgewotCQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoSmF2YUNvcmUubmV3U291cmNlRW50cnkoalByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoc291cmNlRm9sZGVyKSkpOwotCQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtsaXN0LnNpemUoKV07Ci0KLQotICAgICAgICBJUGF0aCBuZXdPdXRwdXRQYXRoID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWNsYXNzcGF0aFtpXSA9IChJQ2xhc3NwYXRoRW50cnkpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbmV3T3V0cHV0UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKFBhdGguU0VQQVJBVE9SICtqUHJvamVjdC5nZXROYW1lKCkgKyAiL2Jpbi8iKTsKLSAgICAgICAgICAgICgoQ2xhc3NwYXRoRW50cnkpY2xhc3NwYXRoW2ldKS5zcGVjaWZpY091dHB1dExvY2F0aW9uID0gbmV3T3V0cHV0UGF0aDsKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoOwkJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkU3JjRm9sZGVyVG9Qcm9qZWN0KFN0cmluZyBzb3VyY2VGb2xkZXIsU3RyaW5nIGNvbXBvbmVudE5hbWUsCi0JCQlJUHJvamVjdCBqUHJvamVjdCkgewotCQkJCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSggalByb2plY3QgKTsKLQkJdHJ5IHsKLQkKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIExpc3Qgb2xkRW50cmllc0xpc3QsY2xhc3NwYXRoTGlzdDsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBnZXRDbGFzc3BhdGhFbnRyaWVzKHNvdXJjZUZvbGRlciwgY29tcG9uZW50TmFtZSwgCi0JCQkJCWpQcm9qZWN0KTsKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBXYXJuaW5nIGNsZWFuLXVwIDEyLzA1LzIwMDUKLQkgICAgICAgICAgKi8gICAKLQkJCS8vaW50IG9sZFNpemUgPSBvbGRFbnRyaWVzLmxlbmd0aDsKLQkJCS8vaW50IG5ld1NpemUgPSBuZXdFbnRyaWVzLmxlbmd0aDsKLQkJCQotCQkJY2xhc3NwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW9sZEVudHJpZXNMaXN0ID0gQXJyYXlzLmFzTGlzdChvbGRFbnRyaWVzKTsKLQkJCWNsYXNzcGF0aExpc3QuYWRkQWxsKG9sZEVudHJpZXNMaXN0KTsKLQkJCWZvciggaW50IGo9MDsgajwgbmV3RW50cmllcy5sZW5ndGg7IGorKyl7Ci0gICAgICAgICAgICAgICAgaWYoIW9sZEVudHJpZXNMaXN0LmNvbnRhaW5zKG5ld0VudHJpZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgCWNsYXNzcGF0aExpc3QuYWRkKG5ld0VudHJpZXNbal0pOwotICAgICAgICAgICAgICAgIH0KLQkJCX0KLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSAoSUNsYXNzcGF0aEVudHJ5W10pIGNsYXNzcGF0aExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aExpc3Quc2l6ZSgpXSk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoRW50cmllcywgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vVmlydHVhbEFyY2hpdmVDb21wb25lbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1ZpcnR1YWxBcmNoaXZlQ29tcG9uZW50QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNmEzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vVmlydHVhbEFyY2hpdmVDb21wb25lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5BREFQVEVSX1RZUEUgKSB7Ci0JCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGFkYXB0YWJsZU9iamVjdDsKLQkJCUlQYXRoIHBhdGggPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZXNvbHZlZFBhdGhGb3JBcmNoaXZlQ29tcG9uZW50KGNvbXBvbmVudC5nZXROYW1lKCkpOwotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5jbGFzc307Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxZWIyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aC5DbGFzc3BhdGhEZWNvcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLkRlcGVuZGVuY3lHcmFwaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzc3BhdGggY29udGFpbmVyIGlzIGJhc2VkIG9uIHRoZSBDb21wb25lbnQgcmVmZXJlbmNlczsgbm90IHRoZSBtYW5pZmVzdCBlbnRyaWVzLiBPdGhlcgotICogbWVjaGFuaXNtcyBhcmUgaW4gcGxhY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbXBvbmVudCByZWZlcmVuY2VzIGFyZSB1cGRhdGVkIHdoZW4gdGhlIG1hbmlmZXN0IGlzCi0gKiB1cGRhdGVkLCBhbmQgYWxzbyB0byBtYWtlIHN1cmUgdGhlIG1hbmlmZXN0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgY29tcG9uZW50IHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGUuY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aChDT05UQUlORVJfSUQpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggV0VCTElCID0gbmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyIGRlY29yYXRpb25zTWFuYWdlciA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQpOwotCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZ2V0RGVjb3JhdGlvbnNNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnNNYW5hZ2VyOwotICAgIH0KLQkKLQlwcml2YXRlIElQYXRoIGNvbnRhaW5lclBhdGg7Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQlwcml2YXRlIGJvb2xlYW4gZXhwb3J0RW50cmllcyA9IHRydWU7IC8vdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYWx3YXlzIGV4cG9ydCB0aGVzZSBkZXBlbmRlbmNpZXMKLQlwcml2YXRlIHN0YXRpYyBNYXAga2V5cyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgcHJldmlvdXNTZWx2ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9SRVRSSUVTID0gMTA7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIHJldHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBMYXN0VXBkYXRlIHsKLQkJcHJpdmF0ZSBsb25nIGRvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gLTE7Ci0JCXByaXZhdGUgaW50IHJlZkNvdW50ID0gMDsKLQkJcHJpdmF0ZSBib29sZWFuW10gaXNCaW5hcnkgPSBuZXcgYm9vbGVhbltyZWZDb3VudF07Ci0JCXByaXZhdGUgSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFtyZWZDb3VudF07Ci0JfQotCi0JcHJpdmF0ZSBMYXN0VXBkYXRlIGxhc3RVcGRhdGUgPSBuZXcgTGFzdFVwZGF0ZSgpOwotCi0JcHVibGljIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIoSVBhdGggcGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMuY29udGFpbmVyUGF0aCA9IHBhdGg7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNVcGRhdGUoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlJRmlsZSBkb3RDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShQcm9qZWN0VXRpbGl0aWVzLkRPVF9DTEFTU1BBVEgpOwotCQlsb25nIGRvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gZG90Q2xhc3NwYXRoLmV4aXN0cygpID8gZG90Q2xhc3NwYXRoLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgOiAwOwotCQlpZihkb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCAhPSBsYXN0VXBkYXRlLmRvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCA/ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpY29tcG9uZW50KS5nZXRSZWZlcmVuY2VzKHRydWUsIHRydWUpOiBjb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gbnVsbDsKLQotCQkvLyBhdm9pZCB1cGRhdGluZyB0aGUgY29udGFpbmVyIGlmIHJlZmVyZW5jZXMgaGF2ZW4ndCBjaGFuZ2VkCi0JCWlmIChyZWZzLmxlbmd0aCA9PSBsYXN0VXBkYXRlLnJlZkNvdW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3RVcGRhdGUucmVmQ291bnQ7IGkrKykgewotCQkJCWNvbXAgPSByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcC5pc0JpbmFyeSgpICE9IGxhc3RVcGRhdGUuaXNCaW5hcnlbaV0pIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQkJCWlmIChjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wOwotCQkJCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpCi0JCQkJCQkJcGF0aCA9IG5ldyBQYXRoKGRpc2tGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCUlGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCQlwYXRoID0gaUZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGggPSBjb21wLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwotCQkJCQl9Ci0JCQkJCWlmICghcGF0aC5lcXVhbHMobGFzdFVwZGF0ZS5wYXRoc1tpXSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotCQlpZighamF2YVByb2plY3QuaXNPcGVuKCkpewotCQkJdHJ5IHsKLQkJCQlpZihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZXhpc3RzKCkgJiYgamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKXsKLQkJCQkJamF2YVByb2plY3Qub3BlbihudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZSAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLmdldChuZXcgSW50ZWdlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzaENvZGUoKSkpOwotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyIGZpcnN0UHJldmlvdXNTZWxmID0gKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIpcHJldmlvdXNTZWx2ZXMuZ2V0KGtleSk7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9IAotCQkKLQkJaWYoIWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKS5leGlzdHMoKSl7Ci0JCQlJbnRlZ2VyIHJldHJ5Q291bnQgPSAoSW50ZWdlcilyZXRyaWVzLmdldChrZXkpOwotCQkJaWYocmV0cnlDb3VudCA9PSBudWxsKXsKLQkJCQlyZXRyeUNvdW50ID0gbmV3IEludGVnZXIoMSk7Ci0JCQl9IGVsc2UgaWYocmV0cnlDb3VudC5pbnRWYWx1ZSgpID4gTUFYX1JFVFJJRVMpewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0cnlDb3VudCA9IG5ldyBJbnRlZ2VyKHJldHJ5Q291bnQuaW50VmFsdWUoKSArIDEpOwotCQkJfQotCQkJcmV0cmllcy5wdXQoa2V5LCByZXRyeUNvdW50KTsKLQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCXJldHJpZXMucmVtb3ZlKGtleSk7Ci0JCX0KLQkJCi0JCUlGaWxlIGRvdENsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKFByb2plY3RVdGlsaXRpZXMuRE9UX0NMQVNTUEFUSCk7Ci0JCWxhc3RVcGRhdGUuZG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAgPSBkb3RDbGFzc3BhdGguZXhpc3RzKCkgPyBkb3RDbGFzc3BhdGguZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA6IDA7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gbnVsbDsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gbnVsbDsKLQkJCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50ID8gKChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCljb21wb25lbnQpLmdldFJlZmVyZW5jZXModHJ1ZSwgdHJ1ZSk6IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0KLQkJTGlzdCByZWZzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2V0IHJlZmVkQ29tcHMgPSBuZXcgSGFzaFNldCgpOwotCQlyZWZlZENvbXBzLmFkZChjb21wb25lbnQpOwotCQlmb3IoaW50IGkgPSAwOyBpPHJlZnMubGVuZ3RoO2krKyl7Ci0JCQlyZWZzTGlzdC5hZGQocmVmc1tpXSk7Ci0JCQlyZWZlZENvbXBzLmFkZChyZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCX0KLQkJZm9yKGludCBpPTA7IGk8IHJlZnNMaXN0LnNpemUoKTsgaSsrKXsKLQkJCWNvbXAgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKXJlZnNMaXN0LmdldChpKSkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYoY29tcC5pc0JpbmFyeSgpKXsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSBbXSBiaW5hcnlSZWZzID0gY29tcC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yKGludCBqID0gMDsgajxiaW5hcnlSZWZzLmxlbmd0aDsgaisrKXsKLQkJCQkJaWYoIXJlZmVkQ29tcHMuY29udGFpbnMoYmluYXJ5UmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKXsKLQkJCQkJCXJlZnNMaXN0LmFkZChiaW5hcnlSZWZzW2pdKTsKLQkJCQkJCXJlZmVkQ29tcHMuYWRkKGJpbmFyeVJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJbGFzdFVwZGF0ZS5yZWZDb3VudCA9IHJlZnNMaXN0LnNpemUoKTsKLQkJbGFzdFVwZGF0ZS5pc0JpbmFyeSA9IG5ldyBib29sZWFuW2xhc3RVcGRhdGUucmVmQ291bnRdOwotCQlsYXN0VXBkYXRlLnBhdGhzID0gbmV3IElQYXRoW2xhc3RVcGRhdGUucmVmQ291bnRdOwotCi0JCWJvb2xlYW4gaXNXZWIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQlib29sZWFuIHNob3VsZEFkZCA9IHRydWU7Ci0KLQkJTGlzdCBlbnRyaWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCi0JCQlib29sZWFuIHVzZUpEVFRvQ29udHJvbEV4cG9ydCA9IEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzSkRURXhwb3J0KCk7Ci0JCQlpZih1c2VKRFRUb0NvbnRyb2xFeHBvcnQpewotCQkJCS8vaWYgdGhlIGRlZmF1bHQgaXMgbm90IGVuYWJsZWQsIHRoZW4gY2hlY2sgd2hldGhlciB0aGUgY29udGFpbmVyIGlzIGJlaW5nIGV4cG9ydGVkCi0JCQkJdHJ5ewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgW10gcmF3RW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlmb3IoaW50IGk9MDtpPHJhd0VudHJpZXMubGVuZ3RoOyBpKyspewotCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcmF3RW50cmllc1tpXTsKLQkJCQkJCWlmKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKXsKLQkJCQkJCQlpZihlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKENPTlRBSU5FUl9QQVRIKSl7Ci0JCQkJCQkJCWV4cG9ydEVudHJpZXMgPSBlbnRyeS5pc0V4cG9ydGVkKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9uIDxJQ2xhc3NwYXRoRW50cnk+IGV4aXN0aW5nRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotCQkJdHJ5IHsKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihDT05UQUlORVJfUEFUSCwgamF2YVByb2plY3QpOwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHByZXZpb3VzRW50cmllcyAgPSBudWxsOwotCQkJCWlmKG51bGwgIT0gY29udGFpbmVyKXsKLQkJCQkJcHJldmlvdXNFbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCQl9Ci0JCQkJZXhpc3RpbmdFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpKSk7Ci0JCQkJcmVtb3ZlTWF0Y2hpbmdFbnRyaWVzKHByZXZpb3VzRW50cmllcywgZXhpc3RpbmdFbnRyaWVzKTsKLQkJCQkKLQkJCQlpZihmaXJzdFByZXZpb3VzU2VsZiAhPSBudWxsKXsKLQkJCQkJcmVtb3ZlTWF0Y2hpbmdFbnRyaWVzKGZpcnN0UHJldmlvdXNTZWxmLmVudHJpZXMsIGV4aXN0aW5nRW50cmllcyk7Ci0JCQkJfQotCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIgc2Vjb25kUHJldmlvdXNTZWxmID0gKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIpcHJldmlvdXNTZWx2ZXMuZ2V0KGtleSk7Ci0JCQkJaWYoZmlyc3RQcmV2aW91c1NlbGYgIT0gc2Vjb25kUHJldmlvdXNTZWxmICYmIHNlY29uZFByZXZpb3VzU2VsZiAhPSBudWxsKXsKLQkJCQkJcmVtb3ZlTWF0Y2hpbmdFbnRyaWVzKHNlY29uZFByZXZpb3VzU2VsZi5lbnRyaWVzLCBleGlzdGluZ0VudHJpZXMpOwotCQkJCX0KLQkJCQlyZW1vdmVNYXRjaGluZ0VudHJpZXMoZW50cmllcywgZXhpc3RpbmdFbnRyaWVzKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVmID0gKElWaXJ0dWFsUmVmZXJlbmNlKXJlZnNMaXN0LmdldChpKTsKLQkJCQljb21wID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlsYXN0VXBkYXRlLmlzQmluYXJ5W2ldID0gY29tcC5pc0JpbmFyeSgpOwotCQkJCXNob3VsZEFkZCA9ICEoaXNXZWIgJiYgcmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFdFQkxJQikpOyAKLQkJCQlpZiAoIXNob3VsZEFkZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbXAuaXNCaW5hcnkoKSkgewotCQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKLQkJCQkJaWYgKGFyY2hpdmVDb21wLmdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFKSkgewotCQkJCQkJLy8gZG8gbm90IHByb2Nlc3MgY29tcG9uZW50cyBkeW5hbWljYWxseSBjb21wdXRlZCBmcm9tIHRoZSBKYXZhIGNsYXNzcGF0aAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCWlmIChkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQkJbGFzdFVwZGF0ZS5wYXRoc1tpXSA9IG5ldyBQYXRoKGRpc2tGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCWxhc3RVcGRhdGUucGF0aHNbaV0gPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJCQl9Ci0JCQkJCWlmICghaXNBbHJlYWR5T25DbGFzc3BhdGgoZXhpc3RpbmdFbnRyaWVzLCBsYXN0VXBkYXRlLnBhdGhzW2ldKSkgewotCQkJCQkJQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjID0gZGVjb3JhdGlvbnNNYW5hZ2VyLmdldERlY29yYXRpb25zKCBnZXRQYXRoKCkudG9TdHJpbmcoKSwgbGFzdFVwZGF0ZS5wYXRoc1tpXS50b1N0cmluZygpICk7Ci0JCQkJCQkKLQkJCQkJCUlQYXRoIHNyY3BhdGggPSBudWxsOwotCQkJCSAgICAgICAgSVBhdGggc3Jjcm9vdHBhdGggPSBudWxsOwotCQkJCSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0ge307Ci0JCQkJICAgICAgICBJQWNjZXNzUnVsZVtdIGFjY2VzcyA9IHt9OwotCQkJCQkJCi0JCQkJICAgICAgICBpZiggZGVjICE9IG51bGwgKSB7Ci0JCQkJICAgICAgICAgICAgc3JjcGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotCQkJCSAgICAgICAgICAgIHNyY3Jvb3RwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotCQkJCSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotCQkJCSAgICAgICAgfQotCQkJICAgICAgICAKLQkJCQkgICAgICAgIGVudHJpZXNMaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoIGxhc3RVcGRhdGUucGF0aHNbaV0sIHNyY3BhdGgsIHNyY3Jvb3RwYXRoLCBhY2Nlc3MsIGF0dHJzLCBleHBvcnRFbnRyaWVzICkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXAuZ2V0UHJvamVjdCgpOwotCQkJCQlsYXN0VXBkYXRlLnBhdGhzW2ldID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQlpZiAoIWlzQWxyZWFkeU9uQ2xhc3NwYXRoKGV4aXN0aW5nRW50cmllcywgbGFzdFVwZGF0ZS5wYXRoc1tpXSkpIHsKLQkJCQkJCWVudHJpZXNMaXN0LmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkobGFzdFVwZGF0ZS5wYXRoc1tpXSwgZXhwb3J0RW50cmllcykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cmllc0xpc3Quc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWVudHJpZXNbaV0gPSAoSUNsYXNzcGF0aEVudHJ5KSBlbnRyaWVzTGlzdC5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJcHJldmlvdXNTZWx2ZXMucHV0KGtleSwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hdGNoaW5nRW50cmllcyhJQ2xhc3NwYXRoRW50cnkgW10gb2xkRW50cmllcywgQ29sbGVjdGlvbjxJQ2xhc3NwYXRoRW50cnk+IGV4aXN0aW5nRW50cmllcykgewotCQlpZihvbGRFbnRyaWVzICE9IG51bGwpewotCQkJZm9yKElDbGFzc3BhdGhFbnRyeSBvbGRFbnRyeSA6IG9sZEVudHJpZXMpewotCQkJCUl0ZXJhdG9yIDxJQ2xhc3NwYXRoRW50cnk+IGl0ZXJhdG9yID0gZXhpc3RpbmdFbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGV4aXN0aW5nRW50cnkgPSBpdGVyYXRvci5uZXh0KCk7IAotCQkJCQlpZihpc0FscmVhZHlPbkNsYXNzcGF0aChleGlzdGluZ0VudHJ5LCBvbGRFbnRyeS5nZXRQYXRoKCkpKXsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5ewotCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKLQkJCUludGVnZXIgaGFzaENvZGUgPSBuZXcgSW50ZWdlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzaENvZGUoKSk7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5nZXQoaGFzaENvZGUpOwotCQkJaWYoa2V5ID09IG51bGwpewotCQkJCWtleXMucHV0KGhhc2hDb2RlLCBoYXNoQ29kZSk7Ci0JCQkJa2V5ID0gaGFzaENvZGU7Ci0JCQl9Ci0JCQlmaW5hbCBJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJSmF2YVByb2plY3RbXXtqYXZhUHJvamVjdH07Ci0JCQlmaW5hbCBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLQkJCWNvbnRhaW5lci51cGRhdGUoKTsKLQkJCWZpbmFsIElDbGFzc3BhdGhDb250YWluZXJbXSBjb250cyA9IG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW117Y29udGFpbmVyfTsKLQkJCXRyeSB7Ci0JCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIHByb2plY3RzLCBjb250cywgbnVsbCk7Ci0JCQkJcHJldmlvdXNTZWx2ZXMucHV0KGtleSwgY29udGFpbmVyKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucmVzdW1lVXBkYXRlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIGZvcmNlKXsKLQkJaWYoZm9yY2UgfHwgcmVxdWlyZXNVcGRhdGUoKSl7Ci0JCQlpbnN0YWxsKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLQkJCWlmIChKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5zaG91bGRVcGRhdGVEZXBlbmRlbmN5R3JhcGgoKSkKLQkJCXsKLQkJCQkvLyBVcGRhdGUgZGVwZW5kZW5jeSBncmFwaAotCQkJCURlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5mb3JjZVJlZnJlc2goKTsKLQkJCQkvLyBbMjAyODIwXQotCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLnNldFVwZGF0ZURlcGVuZGVuY3lHcmFwaChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJcmVmcmVzaChmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQkKLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsKLQkJaWYoIWlzVXBkYXRpbmcpewotCQkJaWYodGhpcyAhPSBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0SW5zdGFsbGVkRUFSTGlicmFyaWVzQ29udGFpbmVyKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpewotCQkJCXRyeSB7Ci0JCQkJCWlzVXBkYXRpbmcgPSB0cnVlOwotCQkJCQl1cGRhdGUoKTsKLQkJCQl9IGZpbmFsbHl7Ci0JCQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEoyRUVDb21tb25NZXNzYWdlcy5KMkVFX01PRFVMRV9DTEFTU1BBVEhfQ09OVEFJTkVSX05BTUU7Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS19BUFBMSUNBVElPTjsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIGNvbnRhaW5lclBhdGg7Ci0JfQotCi0JLyoqCi0JICogVGFrZW4gZnJvbSB7QGxpbmsgSmF2YVByb2plY3QjaXNPbkNsYXNzcGF0aChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpfQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGgKLQkgKiBAcGFyYW0gbmV3UGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxyZWFkeU9uQ2xhc3NwYXRoKENvbGxlY3Rpb248SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGgsIElQYXRoIG5ld1BhdGgpIHsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBjbGFzc3BhdGguaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGl0ci5uZXh0KCk7Ci0JCQlpZihpc0FscmVhZHlPbkNsYXNzcGF0aChlbnRyeSwgbmV3UGF0aCkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUYWtlbiBmcm9tIHtAbGluayBKYXZhUHJvamVjdCNpc09uQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSl9Ci0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aAotCSAqIEBwYXJhbSBuZXdQYXRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbHJlYWR5T25DbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5LCBJUGF0aCBuZXdQYXRoKXsKLQkJSVBhdGggZW50cnlQYXRoID0gY2xhc3NwYXRoRW50cnkuZ2V0UGF0aCgpOwotCQlpZiAoZW50cnlQYXRoLmVxdWFscyhuZXdQYXRoKSkgeyAvLyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG11c3QgbWF0Y2ggZXhhY3RseSBlbnRyeQotCQkJLy8gcGF0aHMgKG5vIGV4Y2x1c2lvbiB0aGVyZSkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihuZXdQYXRoKSAmJiAhVXRpbC5pc0V4Y2x1ZGVkKG5ld1BhdGgsICgoQ2xhc3NwYXRoRW50cnkpIGNsYXNzcGF0aEVudHJ5KS5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksICgoQ2xhc3NwYXRoRW50cnkpIGNsYXNzcGF0aEVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCksIGZhbHNlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjZmUxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoLkZsZXhpYmxlUHJvamVjdENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdFVzZUVBUkxpYnJhcmllcygpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFVzZUVBUkxpYnJhcmllcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzSkRURXhwb3J0KCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0VXNlRUFSTGlicmFyaWVzSkRURXhwb3J0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlV2ViQXBwTGlicmFyaWVzKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0VXNlV2ViTGliYXJpZXMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGdldEluc3RhbGxlZENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCUlKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZ2V0SW5zdGFsbGVkQ29udGFpbmVyRW50cnkoanByb2osIGNvbnRhaW5lclBhdGgpOwotCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqcHJvaik7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyIGdldEluc3RhbGxlZEVBUkxpYnJhcmllc0NvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gZ2V0SW5zdGFsbGVkQ29udGFpbmVyKHByb2plY3QsIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuQ09OVEFJTkVSX1BBVEgpOwotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyIGVhckxpYnJhcmllc0NvbnRhaW5lciA9IG51bGw7Ci0JCWlmIChudWxsICE9IGNvbnRhaW5lciAmJiBjb250YWluZXIgaW5zdGFuY2VvZiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyKSB7Ci0JCQllYXJMaWJyYXJpZXNDb250YWluZXIgPSAoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lcikgY29udGFpbmVyOwotCQl9Ci0JCXJldHVybiBlYXJMaWJyYXJpZXNDb250YWluZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGbGV4aWJsZVByb2plY3RDb250YWluZXIgZ2V0SW5zdGFsbGVkV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpewotCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldEluc3RhbGxlZENvbnRhaW5lcihwcm9qZWN0LCBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5XRUJfQVBQX0xJQlNfUEFUSCk7Ci0JCUZsZXhpYmxlUHJvamVjdENvbnRhaW5lciB3ZWJBcHBMaWJyYXJpZXNDb250YWluZXIgPSBudWxsOwotCQlpZiAobnVsbCAhPSBjb250YWluZXIgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQl3ZWJBcHBMaWJyYXJpZXNDb250YWluZXIgPSAoRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKSBjb250YWluZXI7Ci0JCX0KLQkJcmV0dXJuIHdlYkFwcExpYnJhcmllc0NvbnRhaW5lcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0SW5zdGFsbGVkQ29udGFpbmVyRW50cnkoSUphdmFQcm9qZWN0IGpwcm9qLCBJUGF0aCBjbGFzc3BhdGhDb250YWluZXJQYXRoKSB7Ci0JCWlmIChqcHJvai5pc09wZW4oKSkgewotCQkJdHJ5IHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjcGVzOwotCQkJCWNwZXMgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNwZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwZXNbal07Ci0JCQkJCWlmIChjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkJCWlmIChjcGUuZ2V0UGF0aCgpLmVxdWFscyhjbGFzc3BhdGhDb250YWluZXJQYXRoKSkgewotCQkJCQkJCXJldHVybiBjcGU7IC8vIGVudHJ5IGZvdW5kCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCS8vIGVudHJ5IG5vdCBmb3VuZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aEluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNmYjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aC5DbGFzc3BhdGhEZWNvcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSjJFRUNvbXBvbmVudENsYXNzcGF0aEluaXRpYWxpemVyIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyIGRlY29yYXRpb25zID0gSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5nZXREZWNvcmF0aW9uc01hbmFnZXIoKTsKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLmluc3RhbGwoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBzZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcga2V5ID0gY29udGFpbmVyUGF0aC50b1N0cmluZygpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gc2cuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCi0JCQlmaW5hbCBJUGF0aCBzcmNwYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKLQkJCWZpbmFsIElQYXRoIHNyY3Jvb3RwYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cnMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQotCQkJaWYgKHNyY3BhdGggIT0gbnVsbCB8fCBhdHRycy5sZW5ndGggPiAwKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGVpZCA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCWZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9ucygpOwotCi0JCQkJZGVjLnNldFNvdXJjZUF0dGFjaG1lbnRQYXRoKHNyY3BhdGgpOwotCQkJCWRlYy5zZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoc3Jjcm9vdHBhdGgpOwotCQkJCWRlYy5zZXRFeHRyYUF0dHJpYnV0ZXMoYXR0cnMpOwotCi0JCQkJZGVjb3JhdGlvbnMuc2V0RGVjb3JhdGlvbnMoa2V5LCBlaWQsIGRlYyk7Ci0JCQl9Ci0JCX0KLQotCQlkZWNvcmF0aW9ucy5zYXZlKCk7Ci0KLQkJZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotCi0JCSggKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIpIGNvbnRhaW5lciApLnJlZnJlc2goIHRydWUgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YTE4MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguRmxleGlibGVQcm9qZWN0Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSU1vZHVsZUV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cGRhdGVEZXBlbmRlbmN5R3JhcGggPSB0cnVlOwotCi0JcHJpdmF0ZSBpbnQgcGF1c2VDb3VudCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBXRUJfQVBQX0xJQlNfUEFUSCA9IG5ldyBQYXRoKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbml0KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXVzZXMgdXBkYXRlczsgYW55IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aHJvdWdoIGEKLQkgKiB0cnkvZmluYWxseSBibG9jayB0aGF0IHJlc3VtZVVwZGF0ZXMgaXMgc3Vic2VxdWVudGx5IGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXVzZVVwZGF0ZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJcGF1c2VDb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lVXBkYXRlcygpIHsKLQkJcmVzdW1lVXBkYXRlcyh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc3VtZVVwZGF0ZXMoYm9vbGVhbiBzY2hlZHVsZUpvYil7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKHBhdXNlQ291bnQgPiAwKSB7Ci0JCQkJcGF1c2VDb3VudC0tOwotCQkJfQotCQkJaWYgKHBhdXNlQ291bnQgPiAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmKHNjaGVkdWxlSm9iKXsKLQkJCW1vZHVsZVVwZGF0ZUpvYi5zY2hlZHVsZShNT0RVTEVfVVBEQVRFX0RFTEFZKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBmb3JjZVVwZGF0ZShDb2xsZWN0aW9uIHByb2plY3RzKXsKLQkJZm9yY2VVcGRhdGUocHJvamVjdHMsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBDb2xsZWN0aW9uIG9mIHR5cGUgSVByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZVVwZGF0ZShDb2xsZWN0aW9uIHByb2plY3RzLCBib29sZWFuIHJ1bkFzSm9iKSB7Ci0JCXRyeSB7Ci0JCQlwYXVzZVVwZGF0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvamVjdHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkJcXVldWVVcGRhdGUoKElQcm9qZWN0KWl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3JjZVVwZGF0ZU9uTmV4dFJ1biA9IHRydWU7Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gcGxhY2Ugb2YgdGhlIG5vcm1hbCBjYWxsIHRvCi0JCQkvLyByZXN1bWUgdXBkYXRlcy4gIFRoaXMgcmVzdG9yZXMgdGhlIHBhdXNlQ291bnQgYW5kIGZvcmNlcyAKLQkJCS8vIHRoZSBqb2IgdG8gYmUgc2NoZWR1bGVkIGltbWVkaWF0ZWx5IAotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHBhdXNlQ291bnQgPiAwKSB7Ci0JCQkJCXBhdXNlQ291bnQtLTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihydW5Bc0pvYil7Ci0JCQkJbW9kdWxlVXBkYXRlSm9iLnNjaGVkdWxlKDApOwotCQkJfSBlbHNlIHsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXVwZGF0ZURlcGVuZGVuY3lHcmFwaCA9IGZhbHNlOwotCQkJCQltb2R1bGVVcGRhdGVKb2IucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5Ci0JCQkJewotCQkJCQl1cGRhdGVEZXBlbmRlbmN5R3JhcGggPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VVcGRhdGVPbk5leHRSdW4gPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBxdWV1ZVVwZGF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpIHsKLQkJCXF1ZXVlVXBkYXRlRUFSKHByb2plY3QpOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpIHx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSB8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpCi0JCQkJfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpIHx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocHJvamVjdCkpIHsKLQkJCXF1ZXVlVXBkYXRlTW9kdWxlKHByb2plY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcXVldWVVcGRhdGVNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQltb2R1bGVVcGRhdGVKb2IucXVldWVNb2R1bGUocHJvamVjdCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKHBhdXNlQ291bnQgPiAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCW1vZHVsZVVwZGF0ZUpvYi5zY2hlZHVsZShNT0RVTEVfVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBxdWV1ZVVwZGF0ZUVBUihJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCW1vZHVsZVVwZGF0ZUpvYi5xdWV1ZUVBUihlYXJQcm9qZWN0KTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAocGF1c2VDb3VudCA+IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJbW9kdWxlVXBkYXRlSm9iLnNjaGVkdWxlKE1PRFVMRV9VUERBVEVfREVMQVkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9qZWN0c1F1ZXVlZCgpIHsKLQkJcmV0dXJuIG1vZHVsZVVwZGF0ZUpvYi5wcm9qZWN0c1F1ZXVlZCgpIHx8IG1vZHVsZVVwZGF0ZUpvYi5nZXRTdGF0ZSgpICE9IEpvYi5OT05FOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX1VQREFURV9ERUxBWSA9IDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9VUERBVEVfSk9CX05BTUUgPSAiRUFSIExpYnJhcmllcyBVcGRhdGUgSm9iIjsgCi0KLQlwcml2YXRlIGZpbmFsIE1vZHVsZVVwZGF0ZUpvYiBtb2R1bGVVcGRhdGVKb2IgPSBuZXcgTW9kdWxlVXBkYXRlSm9iKCk7Ci0KLQlwdWJsaWMgY2xhc3MgTW9kdWxlVXBkYXRlSm9iIGV4dGVuZHMgSm9iIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJaWYoZmFtaWx5ID09IE1PRFVMRV9VUERBVEVfSk9CX05BTUUpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJlbG9uZ3NUbyhmYW1pbHkpOwotCQl9Ci0JCQotCQkvLyBXZSB1c2UgdGhlIGxpc3RlbmVyIGxpc3QgYXMgYSB0aHJlYWQgc2FmZSBxdWV1ZS4KLQkJcHJpdmF0ZSBjbGFzcyBRdWV1ZSBleHRlbmRzIExpc3RlbmVyTGlzdCAgewotCQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCQkJT2JqZWN0W10gZGF0YSA9IHN1cGVyLmdldExpc3RlbmVycygpOwotCQkJCWNsZWFyKCk7Ci0JCQkJcmV0dXJuIGRhdGE7Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBRdWV1ZSBtb2R1bGVRdWV1ZSA9IG5ldyBRdWV1ZSgpOwotCi0JCXByaXZhdGUgUXVldWUgZWFyUXVldWUgPSBuZXcgUXVldWUoKTsKLQotCQkvL2EgcHJpdmF0ZSBxdWV1ZSBmb3IgYWRkaW5nIG1vZHVsZXMgcXVldWVkIGJ5IHRoZSBFQVIKLQkJcHJpdmF0ZSBRdWV1ZSBlYXJBZGRlZE1vZHVsZVF1ZXVlID0gbmV3IFF1ZXVlKCk7Ci0JCQotCQlwdWJsaWMgTW9kdWxlVXBkYXRlSm9iKCkgewotCQkJc3VwZXIoTU9EVUxFX1VQREFURV9KT0JfTkFNRSk7IAotCQkJc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXVlRUFSKElQcm9qZWN0IGVhcikgewotCQkJZWFyUXVldWUuYWRkKGVhcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBxdWV1ZU1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQltb2R1bGVRdWV1ZS5hZGQocHJvamVjdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHByb2plY3RzUXVldWVkKCkgewotCQkJcmV0dXJuICFlYXJRdWV1ZS5pc0VtcHR5KCkgfHwgIW1vZHVsZVF1ZXVlLmlzRW1wdHkoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgcmVmZXJlbmNlZCBFQVJzIGZyb20gdGhlIHF1ZXVlZCBtb2R1bGVzIGludG8gdGhlIEVBUnMgcXVldWUKLQkJICovCi0JCXByaXZhdGUgdm9pZCBxdWV1ZVJlZmVyZW5jaW5nRWFycyhPYmplY3RbXSBwcm9qZWN0cykgewotCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwcm9qZWN0cy5sZW5ndGg7IHArKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzW3BdOwotCQkJCWlmICghaXNLbm93bihwcm9qZWN0KSkgewotCQkJCQlJUHJvamVjdFtdIGVhclByb2plY3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJcXVldWVFQVIoZWFyUHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFYXJzKCkgewotCQkJT2JqZWN0W10gZWFyUHJvamVjdHMgPSBlYXJRdWV1ZS5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gKElQcm9qZWN0KSBlYXJQcm9qZWN0c1tpXTsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2plY3QpKQotCQkJCXsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7IAotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2VzKGVhckNvbXBvbmVudCk7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWNvbXAgPSByZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCWlmICghY29tcC5pc0JpbmFyeSgpKSB7Ci0JCQkJCQkJZWFyQWRkZWRNb2R1bGVRdWV1ZS5hZGQoY29tcC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKG51bGwgIT0gZWFyQ29tcG9uZW50KXsKLQkJCQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5jbGVhckRpc2Nvbm5lY3RlZEFyY2hpdmVzSW5FQVIoZWFyQ29tcG9uZW50KTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzTW9kdWxlcyhPYmplY3RbXSBwcm9qZWN0cykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzW2ldOwotCQkJCS8vIHRoaXMgYmxvY2sgaXMgZm9yIFdlYiBhcHAgTGlicmFyaWVzCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciB3ZWJBcHBMaWJyYXJpZXNDb250YWluZXIgPSBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0SW5zdGFsbGVkV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKHByb2plY3QpOwotCQkJCQkvLyBJZiB0aGUgY29udGFpbmVyIGlzIHByZXNlbnQsIHJlZnJlc2ggaXQKLQkJCQkJaWYgKHdlYkFwcExpYnJhcmllc0NvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkoKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgd2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKiBUaGUgZm9sbG93aW5nIGlzIGZvciBFQVIgTGlicmFyaWVzCi0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBlYXJMaWJyYXJpZXNDb250YWluZXIgPSBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0SW5zdGFsbGVkRUFSTGlicmFyaWVzQ29udGFpbmVyKHByb2plY3QpOwotCQkJCS8vIElmIHRoZSBjb250YWluZXIgaXMgcHJlc2VudCwgcmVmcmVzaCBpdAotCQkJCWlmIChlYXJMaWJyYXJpZXNDb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkoKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIpIGVhckxpYnJhcmllc0NvbnRhaW5lcikucmVmcmVzaChmb3JjZVVwZGF0ZU9uTmV4dFJ1bik7Ci0JCQkJfQotCQkJfQotCQkJLy8gWzIwMjgyMF0KLQkJCXVwZGF0ZURlcGVuZGVuY3lHcmFwaCA9IHRydWU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0W10gbW9kdWxlUHJvamVjdHMgPSBtb2R1bGVRdWV1ZS5nZXRMaXN0ZW5lcnMoKTsKLQkJCQkJCXF1ZXVlUmVmZXJlbmNpbmdFYXJzKG1vZHVsZVByb2plY3RzKTsKLQkJCQkJCXByb2Nlc3NFYXJzKCk7Ci0JCQkJCQlPYmplY3QgW10gZWFyUXVldWVkTW9kdWxlUHJvamVjdHMgPSBlYXJBZGRlZE1vZHVsZVF1ZXVlLmdldExpc3RlbmVycygpOwotCQkJCQkJU2V0IG1vZHVsZXNTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCQkJbW9kdWxlc1NldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb2R1bGVQcm9qZWN0cykpOwotCQkJCQkJbW9kdWxlc1NldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlYXJRdWV1ZWRNb2R1bGVQcm9qZWN0cykpOwotCQkJCQkJT2JqZWN0IFtdIG1vZHVsZXNBcnJheSA9IG1vZHVsZXNTZXQudG9BcnJheSgpOwotCQkJCQkJcHJvY2Vzc01vZHVsZXMobW9kdWxlc0FycmF5KTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWZvcmNlVXBkYXRlT25OZXh0UnVuID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfSk7Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGdldFdlYkFwcExpYnJhcmllc0NvbnRhaW5lcihJUHJvamVjdCB3ZWJQcm9qZWN0LCBib29sZWFuIGNyZWF0ZSkgewotCQlJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7Ci0JCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3JlYXRlID8gbnVsbCA6IGdldEV4aXN0aW5nQ29udGFpbmVyKGpwcm9qLCBXRUJfQVBQX0xJQlNfUEFUSCk7Ci0JCWlmIChlbnRyeSAhPSBudWxsIHx8IGNyZWF0ZSkgewotCQl0cnkgewotCQkJCWNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihXRUJfQVBQX0xJQlNfUEFUSCwganByb2opOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBjbGFzc3BhdGggY29udGFpbmVyIGlmIGl0IGlzIGFscmVhZHkgb24gdGhlIGNsYXNzcGF0aC4gVGhpcyB3aWxsIG5vdAotCSAqIGNyZWF0ZSBhIG5ldyBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGpwcm9qCi0JICogQHBhcmFtIGNsYXNzcGF0aENvbnRhaW5lcklECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0RXhpc3RpbmdDb250YWluZXIoSUphdmFQcm9qZWN0IGpwcm9qLCBJUGF0aCBjbGFzc3BhdGhDb250YWluZXJQYXRoKSB7Ci0JCXJldHVybiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0SW5zdGFsbGVkQ29udGFpbmVyRW50cnkoanByb2osIGNsYXNzcGF0aENvbnRhaW5lclBhdGgpOwotCX0KLQotCXByaXZhdGUgU2V0IGtub3duUHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBpc0tub3duKElQcm9qZWN0IHByb2plY3QpewotCQlyZXR1cm4gIWtub3duUHJvamVjdHMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZvcmdldFByb2plY3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCWtub3duUHJvamVjdHMucmVtb3ZlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWJvb2xlYW4gc2NoZWR1bGVKb2IgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXBhdXNlVXBkYXRlcygpOwotCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpewotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFOgotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURToKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsKLQkJCQkJCWlmKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoKElQcm9qZWN0KSByZXNvdXJjZSkpewotCQkJCQkJCWlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdCgoSVByb2plY3QpcmVzb3VyY2UpKXsKLQkJCQkJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQotCQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2VzKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpKTsKLQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQkJCQkJY29tcCA9IHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJCQkJaWYgKCFjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQkJCQkJCQlxdWV1ZVVwZGF0ZU1vZHVsZShjb21wLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJCQkJCWZvcihpbnQgaT0wOyBpPGVhclByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCQkJCQkJCXF1ZXVlVXBkYXRlRUFSKGVhclByb2plY3RzW2ldKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmb3JnZXRQcm9qZWN0KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuY2xlYXJBbGxBcmNoaXZlc0luUHJvamVjdCgoSVByb2plY3QpcmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0U6Ci0JCQkJCXNjaGVkdWxlSm9iID0gdHJ1ZTsKLQkJCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7Ci0JCQkJCUlSZXNvdXJjZURlbHRhW10gZCA9IGV2ZW50LmdldERlbHRhKCkuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQlmaW5kTm9kZShkKTsKLQkJCQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSAKLQkJZmluYWxseSB7Ci0JCQlyZXN1bWVVcGRhdGVzKHNjaGVkdWxlSm9iKTsKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclJlc291cmNlVHJlZVJvb3RDYWNoZShXb3JrYmVuY2hDb21wb25lbnQgYU1vZHVsZSkgewotCi0JCVJlc291cmNlVHJlZVJvb3RBZGFwdGVyIHJlc291cmNlVHJlZUFkYXB0ZXIgPSAoUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIpIEV4dGVuZGVkRWNvcmVVdGlsCi0JCQkJLmdldEFkYXB0ZXIoYU1vZHVsZSwgYU1vZHVsZS5lQWRhcHRlcnMoKSwKLQkJCQkJCVJlc291cmNlVHJlZVJvb3RBZGFwdGVyLkRFUExPWV9BREFQVEVSX1RZUEUpOwotCQlpZihudWxsICE9IHJlc291cmNlVHJlZUFkYXB0ZXIpIHsKLQkJCXJlc291cmNlVHJlZUFkYXB0ZXIuc2V0UmVzb3VyY2VUcmVlUm9vdChudWxsKTsKLQkJfQotCQlyZXNvdXJjZVRyZWVBZGFwdGVyID0gKFJlc291cmNlVHJlZVJvb3RBZGFwdGVyKSBFeHRlbmRlZEVjb3JlVXRpbAotCQkJCS5nZXRBZGFwdGVyKGFNb2R1bGUsIGFNb2R1bGUuZUFkYXB0ZXJzKCksCi0JCQkJCQlSZXNvdXJjZVRyZWVSb290QWRhcHRlci5TT1VSQ0VfQURBUFRFUl9UWVBFKTsKLQkJaWYobnVsbCAhPSByZXNvdXJjZVRyZWVBZGFwdGVyKXsKLQkJCXJlc291cmNlVHJlZUFkYXB0ZXIuc2V0UmVzb3VyY2VUcmVlUm9vdChudWxsKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiBOZWVkcyB0byBub3RpY2UgY2hhbmdlcyB0byBNQU5JRkVTVC5NRiBpbiBhbnkgSjJFRSBwcm9qZWN0cywgY2hhbmdlcyB0bwotCSAqIC5jb21wb25lbnQgaW4gYW55IEoyRUUgUHJvamVjdHMsIGFuZCBhbnkgYXJjaGl2ZSBjaGFuZ2VzIGluIEVBUiBwcm9qZWN0cwotCSAqLwotCQotCXB1YmxpYyBib29sZWFuIGZpbmROb2RlKElSZXNvdXJjZURlbHRhW10gZGVsdGEpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGVsdGFbaV0udG9TdHJpbmcoKS5pbmRleE9mKElKMkVFTW9kdWxlQ29uc3RhbnRzLkNPTVBPTkVOVF9GSUxFX05BTUUpICE9IC0xKSB7Ci0JCQkJU3RydWN0dXJlRWRpdCBjb3JlID0gU3RydWN0dXJlRWRpdAotCQkJCQkJLmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGRlbHRhW2ldLmdldFJlc291cmNlKCkKLQkJCQkJCQkJLmdldFByb2plY3QoKSk7Ci0JCQkJaWYobnVsbCAhPSBjb3JlKXsKLQkJCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCWlmKGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCQkJCWNsZWFyUmVzb3VyY2VUcmVlUm9vdENhY2hlKGNvbXBvbmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZpbmROb2RlKGRlbHRhW2ldLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJLy8gSWYgaXQgaXMgb25seSBhIG1hcmtlciBjaGFuZ2UsIGlnbm9yZSB0aGUgY2hhbmdlCi0JCWlmKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQljYXNlIElSZXNvdXJjZS5ST09UOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0JCQlyZXR1cm4gTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdCgoSVByb2plY3QpIHJlc291cmNlKTsKLQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOiB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhJSjJFRU1vZHVsZUNvbnN0YW50cy5ET1RfU0VUVElOR1MpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQotCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCB8fCBjb21wIGluc3RhbmNlb2YgRUFSVmlydHVhbENvbXBvbmVudCkgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wLmdldFJvb3RGb2xkZXIoKTsKLQkJCQlpZiAoY29tcCBpbnN0YW5jZW9mIEVBUlZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQkJcmV0dXJuIGlzUm9vdEFuY2VzdGVyKHJlc291cmNlLCByb290Rm9sZGVyKTsKLQkJCQl9IGVsc2UgeyAvLyBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudAotCQkJCQlyZXR1cm4gaXNSb290QW5jZXN0ZXIocmVzb3VyY2UsIHJvb3RGb2xkZXIpIHx8IGlzRm9sZGVyKHJlc291cmNlLCByb290Rm9sZGVyLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhc2UgSVJlc291cmNlLkZJTEU6IHsKLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuV1RQX01PRFVMRVNfU0hPUlRfTkFNRSkgfHwgbmFtZS5lcXVhbHMoUHJvamVjdFV0aWxpdGllcy5ET1RfQ0xBU1NQQVRIKSkgewotCQkJCXF1ZXVlVXBkYXRlKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfU0hPUlRfTkFNRSkpIHsgLy8gTUFOSUZFU1QuTUYgbXVzdCBiZSBhbGwgY2FwcyBwZXIgc3BlYwotCQkJCUlGaWxlIG1hbmlmZXN0RmlsZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGZhbHNlKTsKLQkJCQlpZiAobnVsbCA9PSBtYW5pZmVzdEZpbGUgfHwgcmVzb3VyY2UuZXF1YWxzKG1hbmlmZXN0RmlsZSkpIHsKLQkJCQkJcXVldWVVcGRhdGVNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSKSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlpZihpc0ZvbGRlcihyZXNvdXJjZS5nZXRQYXJlbnQoKSwgY29tcC5nZXRSb290Rm9sZGVyKCkpKXsKLQkJCQkJCQlxdWV1ZVVwZGF0ZUVBUihyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aElnbm9yZUNhc2UoU3RyaW5nIHN0ciwgU3RyaW5nIHNmeCkgewotCQlyZXR1cm4gc3RyLnJlZ2lvbk1hdGNoZXModHJ1ZSwgc3RyLmxlbmd0aCgpIC0gc2Z4Lmxlbmd0aCgpLCBzZngsIDAsIHNmeC5sZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9sZGVyKElSZXNvdXJjZSByZXNvdXJjZSwgSVZpcnR1YWxGb2xkZXIgZm9sZGVyKSB7Ci0JCUlDb250YWluZXJbXSByZWFsRm9sZGVycyA9IGZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWxGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVhbEZvbGRlcnNbaV0uZXF1YWxzKHJlc291cmNlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290QW5jZXN0ZXIoSVJlc291cmNlIHJlc291cmNlLCBJVmlydHVhbEZvbGRlciByb290Rm9sZGVyKSB7Ci0JCUlDb250YWluZXJbXSByZWFsUm9vdHMgPSByb290Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCUlQYXRoIGN1cnJlbnRSZXNvdXJjZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWxSb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGN1cnJlbnRSZXNvdXJjZVBhdGguaXNQcmVmaXhPZihyZWFsUm9vdHNbaV0uZ2V0RnVsbFBhdGgoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVcGRhdGVEZXBlbmRlbmN5R3JhcGgoKQotCXsKLQkJcmV0dXJuIHVwZGF0ZURlcGVuZGVuY3lHcmFwaDsKLQl9Ci0JCi0JLy8gWzIwMjgyMF0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBkYXRlRGVwZW5kZW5jeUdyYXBoKGJvb2xlYW4gdmFsdWUpCi0JewotCQl1cGRhdGVEZXBlbmRlbmN5R3JhcGggPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNWQ4OTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YudXNlci5Vc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LnVzZXIuVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbgotCi0gICAgZXh0ZW5kcyBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbgotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUIAotICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQiApOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnkgY3JlYXRlQ2xhc3NwYXRoRW50cnkoIGZpbmFsIFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGlicmFyeU5hbWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY2ZnCi0gICAgICAgICAgICA9IChXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiA9IGNmZy5nZXRGYWNldGVkUHJvamVjdCgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzV2ViUHJvamVjdCA9IGZwcm9qLmhhc1Byb2plY3RGYWNldCggV0VCX0ZBQ0VUICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHI7Ci0gICAgICAgIAotICAgICAgICBpZiggY2ZnLmlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF0dHIgPSBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldERlZmF1bHRSdW50aW1lUGF0aCggaXNXZWJQcm9qZWN0ICkudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXR0ciA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSggSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSwgIiIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IHN1cGVyLmNyZWF0ZUNsYXNzcGF0aEVudHJ5KCBjb25maWcsIGxpYnJhcnlOYW1lICk7Ci0gICAgICAgIGNwZSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KCBjcGUuZ2V0UGF0aCgpLCBudWxsLCBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdeyBhdHRyIH0sIGZhbHNlICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY3BlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyODEwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkNsYXNzcGF0aFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YudXNlci5Vc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCi0gICAgZXh0ZW5kcyBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FIAotICAgICAgICA9IFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVEIAotICAgICAgICA9IENMQVNTX05BTUUgKyAiLklOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVEIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSB0cnVlOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVdpdGhBcHBsaWNhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVdpdGhBcHBsaWNhdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBib29sZWFuIG9sZFZhbHVlID0gdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uOwotICAgICAgICB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSBpbmNsdWRlV2l0aEFwcGxpY2F0aW9uOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQsIG9sZFZhbHVlLCB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgcHJvdmlkZXIgKQotICAgIHsKLSAgICAgICAgc3VwZXIuaW5pdCggZnByb2osIGZ2LCBwcm92aWRlciApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmcHJvai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggcHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgY3VycmVudFByb3ZpZGVyIAotICAgICAgICAgICAgICAgID0gTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrLmdldEN1cnJlbnRQcm92aWRlciggcHJvamVjdCwgZiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY3VycmVudFByb3ZpZGVyID09IHByb3ZpZGVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllczsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBDbGFzc3BhdGhVdGlsLmdldENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSBnZXRJbmNsdWRlV2l0aEFwcGxpY2F0aW9uU2V0dGluZyggZW50cmllcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvblNldHRpbmcoIGZpbmFsIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzICkKLSAgICB7Ci0gICAgICAgIGZvciggSUNsYXNzcGF0aEVudHJ5IGNwZSA6IGVudHJpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcGF0aC5zZWdtZW50Q291bnQoKSA+PSAyICYmIHBhdGguc2VnbWVudCggMCApLmVxdWFscyggSmF2YUNvcmUuVVNFUl9MSUJSQVJZX0NPTlRBSU5FUl9JRCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciggSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyIDogY3BlLmdldEV4dHJhQXR0cmlidXRlcygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGF0dHIuZ2V0TmFtZSgpLmVxdWFscyggSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0FkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9BZGRKYXZhRUVBcnRpZmFjdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNlZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0FkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotCXByb3RlY3RlZCBJTW9kZWxQcm92aWRlciBwcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRkSmF2YUVFQXJ0aWZhY3RPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQkJcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGdldFRhcmdldFByb2plY3QoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbnVsbDsKLQkJaWYgKHByb3ZpZGVyLnZhbGlkYXRlRWRpdChudWxsLCBudWxsKS5pc09LKCkpIHsKLQkJCXJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlwcm92aWRlci5tb2RpZnkocnVubmFibGUsIG51bGwpOwotCQl9Ci0JCS8vcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gY3JlYXRlIHRoZSBqYXZhIGNsYXNzCi0JCWNyZWF0ZUNsYXNzKCk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQ2xhc3MoKSB7Ci0JCS8vIENyZWF0ZSBiZWFuIGphdmEgY2xhc3MgZmlsZSB1c2luZyB0aGUgTmV3QmVhbkNsYXNzT3BlcmF0aW9uLgotCQlOZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uIG9wID0gZ2V0TmV3Q2xhc3NPcGVyYXRpb24oKTsKLQkJdHJ5IHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gb3AuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCUoyRUVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCS8vIFJldHVybiB0aGUgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgamF2YSBjbGFzcyBmb3IKLQkJLy8gdGhlIGJlYW4KLQkJcmV0dXJuIGdldFF1YWxpZmllZENsYXNzTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBnZXROZXdDbGFzc09wZXJhdGlvbigpOwotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlCi0JICogY2xhc3MgbmFtZSBhbmQgcGFja2FnZSBuYW1lIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwuIFRoaXMgbWV0aG9kCi0JICogc2hvdWxkIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlICNDTEFTU19OQU1FCi0JICogQHNlZSAjSkFWQV9QQUNLQUdFCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQkvLyBVc2UgdGhlIGphdmEgcGFja2FnZSBuYW1lIGFuZCB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIGNyZWF0ZSBhCi0JCS8vIHF1YWxpZmllZCBqYXZhIGNsYXNzIG5hbWUKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSkFWQV9QQUNLQUdFKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkKLQkJLy8gRW5zdXJlIHRoZSBjbGFzcyBpcyBub3QgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSBiZWZvcmUgYWRkaW5nIHBhY2thZ2UKLQkJLy8gbmFtZSB0byBxdWFsaWZpZWQgbmFtZQotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHBhY2thZ2VOYW1lICsgIi4iICsgY2xhc3NOYW1lOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5Q29uc3RydWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0JpbmFyeUNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZWRjNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5Q29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQmluYXJ5Q29uc3RydWN0b3IgaW1wbGVtZW50cyBDb25zdHJ1Y3RvciB7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kIG1ldGhvZDsKLQotCXB1YmxpYyBCaW5hcnlDb25zdHJ1Y3RvcihJTWV0aG9kIG1ldGhvZCkgewotCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnN0cnVjdG9yI2lzUGFyYW1ldGVybGVzcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJsZXNzKCkgewotCQlyZXR1cm4gbWV0aG9kLmdldE51bWJlck9mUGFyYW1ldGVycygpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb25zdHJ1Y3RvciNpc1B1YmxpYygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCWludCBmbGFnczsKLQkJdHJ5IHsKLQkJCWZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJZmxhZ3MgPSAwOwotCQl9Ci0gICAgICAgIHJldHVybiBGbGFncy5pc1B1YmxpYyhmbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb25zdHJ1Y3RvciNpc1Byb3RlY3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm90ZWN0ZWQoKSB7Ci0JCWludCBmbGFnczsKLQkJdHJ5IHsKLQkJCWZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJZmxhZ3MgPSAwOwotCQl9Ci0gICAgICAgIHJldHVybiBGbGFncy5pc1Byb3RlY3RlZChmbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb25zdHJ1Y3RvciNnZXRQYXJhbXNGb3JDYWxsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtc0ZvckNhbGwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmFtcyhmYWxzZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb25zdHJ1Y3RvciNnZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKHRydWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29uc3RydWN0b3IjZ2V0UGFyYW1zRm9ySmF2YWRvYygpKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtc0ZvckphdmFkb2MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmFtcyh0cnVlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgQ29uc3RydWN0b3IjZ2V0Tm9uUHJpbWl0aXZlUGFyYW1ldGVyVHlwZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Tm9uUHJpbWl0aXZlUGFyYW1ldGVyVHlwZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoU3RyaW5nIHBhcmFtZXRlclR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgewotCQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChwYXJhbWV0ZXJUeXBlKSAhPSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgewotCQkJCXJlc3VsdC5hZGQoU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJhbXMoYm9vbGVhbiB0eXBlcywgYm9vbGVhbiBuYW1lcykgewotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lczsKLQkJdHJ5IHsKLQkJCXBhcmFtZXRlck5hbWVzID0gbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCi0JCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsKLQkJCX0KLQkJfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJaWYgKHR5cGVzKSAKLSAgICAgICAgCQlyZXN1bHQuYXBwZW5kKFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHBhcmFtZXRlclR5cGVzW2ldKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmICh0eXBlcyAmJiBuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkKLSAgICAgICAgCWlmIChuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJOYW1lc1tpXSk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQkJCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0JpbmFyeU1ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjEzMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJpbmFyeU1ldGhvZCBpbXBsZW1lbnRzIE1ldGhvZCB7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kIG1ldGhvZDsKLQkKLQlwdWJsaWMgQmluYXJ5TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE1ldGhvZCNnZXRTaWduYXR1cmUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2QjZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFJldHVyblR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldERlZmF1bHRSZXR1cm5WYWx1ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmV0dXJuVmFsdWUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc2lnbmF0dXJlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCWludCBraW5kID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZ25hdHVyZSk7Ci0JCQlpZiAoa2luZCA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgewotCQkJCWlmIChTaWduYXR1cmUuU0lHX1ZPSUQuZXF1YWxzKHNpZ25hdHVyZSkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBlbHNlIGlmIChTaWduYXR1cmUuU0lHX0JPT0xFQU4uZXF1YWxzKHNpZ25hdHVyZSkpIHsKLQkJCQkJcmV0dXJuICJmYWxzZSI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuICIwIjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAibnVsbCI7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE1ldGhvZCNnZXRSZXR1cm5UeXBlSW1wb3J0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRSZXR1cm5UeXBlSW1wb3J0cygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQotCQkJU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlnZXRUeXBlSW1wb3J0cyhzaWduYXR1cmUsIHJlc3VsdCk7Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFBhcmFtc0ZvckNhbGwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1zRm9yQ2FsbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKGZhbHNlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1ldGhvZCNnZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKHRydWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFBhcmFtc0ZvckphdmFkb2MoKSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JKYXZhZG9jKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJhbXModHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE1ldGhvZCNnZXRQYXJhbWV0ZXJJbXBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFBhcmFtZXRlckltcG9ydHMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoU3RyaW5nIHBhcmFtZXRlclR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgewotCQkJZ2V0VHlwZUltcG9ydHMocGFyYW1ldGVyVHlwZSwgcmVzdWx0KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJTWV0aG9kIG9iaiA9IChNZXRob2QpIG87Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMob2JqLmdldE5hbWUoKSkgJiYgCi0JCQl0aGlzLmdldFNpZ25hdHVyZSgpLmVxdWFscyhvYmouZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpICogZ2V0U2lnbmF0dXJlKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJhbXMoYm9vbGVhbiB0eXBlcywgYm9vbGVhbiBuYW1lcykgewotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lczsKLQkJdHJ5IHsKLQkJCXBhcmFtZXRlck5hbWVzID0gbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCi0JCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsKLQkJCX0KLQkJfQotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJaWYgKHR5cGVzKSAKLSAgICAgICAgCQlyZXN1bHQuYXBwZW5kKFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHBhcmFtZXRlclR5cGVzW2ldKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmICh0eXBlcyAmJiBuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkKLSAgICAgICAgCWlmIChuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJOYW1lc1tpXSk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQkJCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdldFR5cGVJbXBvcnRzKFN0cmluZyB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCWludCBraW5kID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHR5cGUpOwotCQkKLQkJc3dpdGNoIChraW5kKSB7Ci0JCWNhc2UgU2lnbmF0dXJlLkFSUkFZX1RZUEVfU0lHTkFUVVJFOgotCQkJZ2V0QXJyYXlUeXBlSW1wb3J0cyh0eXBlLCByZXN1bHQpOwotCQkJYnJlYWs7Ci0JCQkKLQkJY2FzZSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRToKLQkJCWdldEJhc2VUeXBlSW1wb3J0cyh0eXBlLCByZXN1bHQpOwotCQkJYnJlYWs7Ci0JCQkKLQkJY2FzZSBTaWduYXR1cmUuQ0FQVFVSRV9UWVBFX1NJR05BVFVSRToKLQkJCWdldENhcHR1cmVUeXBlSW1wb3J0cyh0eXBlLCByZXN1bHQpOwotCQkJYnJlYWs7Ci0JCQkKLQkJY2FzZSBTaWduYXR1cmUuQ0xBU1NfVFlQRV9TSUdOQVRVUkU6Ci0JCQlnZXRDbGFzc1R5cGVJbXBvcnRzKHR5cGUsIHJlc3VsdCk7Ci0JCQlicmVhazsKLQkJCQotCQljYXNlIFNpZ25hdHVyZS5UWVBFX1ZBUklBQkxFX1NJR05BVFVSRToKLQkJCWdldFR5cGVWYXJpYWxibGVJbXBvcnRzKHR5cGUsIHJlc3VsdCk7Ci0JCQlicmVhazsKLQkJCi0JCWNhc2UgU2lnbmF0dXJlLldJTERDQVJEX1RZUEVfU0lHTkFUVVJFOgotCQkJZ2V0V2lsZGNhcmRUeXBlSW1wb3J0cyh0eXBlLCByZXN1bHQpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgdHlwZSBzaWduYXR1cmUga2luZDogIiArIGtpbmQpOwotCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBcnJheVR5cGVJbXBvcnRzKFN0cmluZyB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCVN0cmluZyBlbGVtZW50VHlwZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZSh0eXBlKTsKLQkJZ2V0VHlwZUltcG9ydHMoZWxlbWVudFR5cGUsIHJlc3VsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEJhc2VUeXBlSW1wb3J0cyhTdHJpbmcgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQkvLyBkbyBub3RoaW5nIC0gbm8gaW1wb3J0cyByZXF1aXJlZCBmb3IgcHJpbWl0aXZlIHR5cGVzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldENhcHR1cmVUeXBlSW1wb3J0cyhTdHJpbmcgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRDbGFzc1R5cGVJbXBvcnRzKFN0cmluZyB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCXJlc3VsdC5hZGQoU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0VHlwZVZhcmlhbGJsZUltcG9ydHMoU3RyaW5nIHR5cGUsIExpc3Q8U3RyaW5nPiByZXN1bHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0V2lsZGNhcmRUeXBlSW1wb3J0cyhTdHJpbmcgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ29uc3RydWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0NvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjg5ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpbiBhIEphdmEgY2xhc3MuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIEpFVEVtaXR0ZXIgdGVtcGxhdGUKLSAqIG1vZGVsLgotICogPC9wPgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RydWN0b3IgewotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMgYW55IHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25zdHJ1Y3RvciBoYXMgbm8gcGFyYW1ldGVycywKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAtIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcmxlc3MoKTsKLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGEgPGNvZGU+cHVibGljPC9jb2RlPiBtb2RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBwdWJsaWMsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gLSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKTsKLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGEgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPgotCSAqIG1vZGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAtIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb25zdHJ1Y3RvcidzIHBhcmFtZXRlcnMgaW4gYSBmb3JtYXQgdGhhdCBpcwotCSAqIGNvbnZlbmllbnQgZm9yIHVzYWdlIGluIGEgSmF2YWRvYyA8Yj5Ac2VlPC9iPiBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtc0ZvckphdmFkb2MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY29uc3RydWN0b3IncyBwYXJhbWV0ZXJzIGluIGEgZm9ybWF0IHRoYXQgaXMKLQkgKiBjb252ZW5pZW50IGZvciB1c2FnZSBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGxpc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb25zdHJ1Y3RvcidzIHBhcmFtZXRlcnMgaW4gYSBmb3JtYXQgdGhhdCBpcwotCSAqIGNvbnZlbmllbnQgZm9yIHVzYWdlIGluIGEgbWV0aG9kIGNhbGwuCi0JICogCi0JICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1zRm9yQ2FsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgbm9uLXByaW1pdGl2ZSBjb25zdHJ1Y3RvcidzIHBhcmFtZXRlciB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIKLQkgKiAgICAgICAgIHR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Tm9uUHJpbWl0aXZlUGFyYW1ldGVyVHlwZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9DcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiNDcyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9DcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfQUJTVFJBQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0ZJTkFMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9QVUJMSUM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbCB7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIG5vIGNvbXBhdGliaWxpdHkgZmxhZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX05PTkUgPSAweDAwMDAwMDAwOwotCQotCS8qKgotCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgPGk+UXVhbGlmaWVkIFN1cGVyY2xhc3MgTmFtZTwvaT4gY29tcGF0aWJpbGl0eQotCSAqIGZsYWcuCi0JICogCi0JICogPHA+Ci0JICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRoZW4gdGhlIHtAbGluayAjZ2V0U3VwZXJjbGFzc05hbWUoKX0gbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzdXBlcmNsYXNzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNnZXRTdXBlcmNsYXNzTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FID0gMHgwMDAwMDAwMTsKLQkKLQkvKioKLQkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBjb21iaW5hdGlvbiBvZiBhbGwgcG9zc2libGUgY29tcGF0aWJpbGl0eSBmbGFncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMTCA9IDB4ZmZmZmZmZmY7Ci0JCi0JLyoqCi0JICogQ29tcGF0aWJpbGl0eSBmbGFncy4gCi0JICogCi0JICogQHNlZSAjYWRkRmxhZ3MoaW50KQotCSAqIEBzZWUgI3JlbW92ZUZsYWdzKGludCkKLQkgKiBAc2VlICNGTEFHX05PTkUKLQkgKiBAc2VlICNGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUKLQkgKiBAc2VlICNGTEFHX0FMTAotCSAqLwotCXByb3RlY3RlZCBpbnQgZmxhZ3M7IAotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQkKLQlwdWJsaWMgQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQl0aGlzLmZsYWdzID0gRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGNvbXBhdGliaWxpdHkgZmxhZ3MgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGJpdG1hc2suCi0JICogCi0JICogQHBhcmFtIGJpdG1hc2sgLQotCSAqICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZmxhZ3MgdG8gYWRkLgotCSAqICAgICAgICAgICAgCi0JICogQHNlZSAjYWRkRmxhZ3MoaW50KQotCSAqIEBzZWUgI3JlbW92ZUZsYWdzKGludCkKLQkgKiBAc2VlICNGTEFHX05PTkUKLQkgKiBAc2VlICNGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUKLQkgKiBAc2VlICNGTEFHX0FMTAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZsYWdzKGludCBiaXRtYXNrKSB7Ci0JCWZsYWdzID0gZmxhZ3MgfCBiaXRtYXNrOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGNvbXBhdGliaWxpdHkgZmxhZ3MgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGJpdG1hc2suCi0JICogCi0JICogQHBhcmFtIGJpdG1hc2sgLQotCSAqICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZmxhZ3MgdG8gcmVtb3ZlLgotCSAqICAgICAgICAgICAgCi0JICogQHNlZSAjYWRkRmxhZ3MoaW50KQotCSAqIEBzZWUgI3JlbW92ZUZsYWdzKGludCkKLQkgKiBAc2VlICNGTEFHX05PTkUKLQkgKiBAc2VlICNGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUKLQkgKiBAc2VlICNGTEFHX0FMTAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZsYWdzKGludCBiaXRtYXNrKSB7Ci0JCWZsYWdzID0gZmxhZ3MgJiB+Yml0bWFzazsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgY29tcGF0aWJpbGl0eSBmbGFncywgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGJpdG1hc2ssIGFyZSBzZXQuCi0JICogCi0JICogQHBhcmFtIGJpdG1hc2sgLQotCSAqICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZmxhZ3MgdG8gY2hlY2suCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiAtIGlmIGFsbCBvZiB0aGUgZ2l2ZW4gZmxhZ3MgYXJlIHNldCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAtIGlmIGFueSBvZiB0aGUgZ2l2ZW4gZmxhZ3MgaXMgbm90IHNldC4gIAotCSAqICAgICAgICAgICAgCi0JICogQHNlZSAjYWRkRmxhZ3MoaW50KQotCSAqIEBzZWUgI3JlbW92ZUZsYWdzKGludCkKLQkgKiBAc2VlICNGTEFHX05PTkUKLQkgKiBAc2VlICNGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUKLQkgKiBAc2VlICNGTEFHX0FMTAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFyZUZsYWdzU2V0KGludCBiaXRtYXNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBiaXRtYXNrKSAhPSAwOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEltcG9ydHMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEltcG9ydHNDb2xsZWN0aW9uKHRoaXMpOwotCQkKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwotCi0JCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJgotCQkJCSFhcmVGbGFnc1NldChGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpICYmIAotCQkJCSFlcXVhbFNpbXBsZU5hbWVzKGNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChzdXBlcmNsYXNzTmFtZSk7Ci0JCX0KLQkJCi0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gZ2V0UXVhbGlmaWVkSW50ZXJmYWNlcygpOwotCQlpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBpZmFjZSA6IGludGVyZmFjZXMpIHsKLQkJCQlpZiAoIWVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIGlmYWNlKSkgeyAKLQkJCQkJY29sbGVjdGlvbi5hZGQoaWZhY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCUxpc3Q8U3RyaW5nPiB0eXBlcyA9IGNvbnN0cnVjdG9yLmdldE5vblByaW1pdGl2ZVBhcmFtZXRlclR5cGVzKCk7Ci0JCQlmb3IgKFN0cmluZyB0eXBlIDogdHlwZXMpIHsKLQkJCQljb2xsZWN0aW9uLmFkZCh0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxNZXRob2Q+IG1ldGhvZHMgPSBnZXRVbmltcGxlbWVudGVkTWV0aG9kcygpOwotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0JCQljb2xsZWN0aW9uLmFkZEFsbChtZXRob2QuZ2V0UGFyYW1ldGVySW1wb3J0cygpKTsKLQkJCWNvbGxlY3Rpb24uYWRkQWxsKG1ldGhvZC5nZXRSZXR1cm5UeXBlSW1wb3J0cygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShDTEFTU19OQU1FKS50cmltKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShKQVZBX1BBQ0tBR0UpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRKYXZhUGFja2FnZU5hbWUoKSArICIuIiArIGdldENsYXNzTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIHF1YWxpZmllZCA9IGdldFF1YWxpZmllZFN1cGVyY2xhc3NOYW1lKCk7Ci0JCWlmIChhcmVGbGFnc1NldChGTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpIHx8IGVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIHF1YWxpZmllZCkpIHsKLQkJCXJldHVybiBxdWFsaWZpZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUocXVhbGlmaWVkKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFN1cGVyY2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoU1VQRVJDTEFTUykudHJpbSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBxdWFsaWZpZWRJbnRlcmZhY2VzID0gZ2V0UXVhbGlmaWVkSW50ZXJmYWNlcygpOwotCQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihxdWFsaWZpZWRJbnRlcmZhY2VzLnNpemUoKSk7Ci0JCQotCQlmb3IgKFN0cmluZyBxdWFsaWZpZWQgOiBxdWFsaWZpZWRJbnRlcmZhY2VzKSB7Ci0JCQlpZiAoZXF1YWxTaW1wbGVOYW1lcyhnZXRDbGFzc05hbWUoKSwgcXVhbGlmaWVkKSkgewotCQkJCWludGVyZmFjZXMuYWRkKHF1YWxpZmllZCk7Ci0JCQl9IGVsc2UgewotCQkJCWludGVyZmFjZXMuYWRkKFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHF1YWxpZmllZCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gaW50ZXJmYWNlczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFF1YWxpZmllZEludGVyZmFjZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gKExpc3Q8U3RyaW5nPikgZGF0YU1vZGVsLmdldFByb3BlcnR5KElOVEVSRkFDRVMpOwotCQlyZXR1cm4gKGludGVyZmFjZXMgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSA6IGludGVyZmFjZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KE1PRElGSUVSX1BVQkxJQyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoTU9ESUZJRVJfRklOQUwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KE1PRElGSUVSX0FCU1RSQUNUKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuU3VwZXJjbGFzc0NvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQ09OU1RSVUNUT1IpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKXsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUyk7Ci0JfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRW1wdHlTdXBlcmNsYXNzQ29uc3RydWN0b3IoKSB7Ci0gICAgCUxpc3Q8Q29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycyA9IGdldENvbnN0cnVjdG9ycygpOwotICAgIAlmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0gICAgCQlpZiAoY29uc3RydWN0b3IuaXNQYXJhbWV0ZXJsZXNzKCkpCi0gICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgCX0KLSAgICAgICAgCi0gICAgCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3Q8Q29uc3RydWN0b3I+IGdldENvbnN0cnVjdG9ycygpIHsKLSAgICAgICAgTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RycyA9IG5ldyBBcnJheUxpc3Q8Q29uc3RydWN0b3I+KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc3VwZXJjbGFzcyA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTVVBFUkNMQVNTKTsKLSAgICAgICAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCAmJiBzdXBlcmNsYXNzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHApOwotICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoc3VwZXJjbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnMuYWRkKG5ldyBCaW5hcnlDb25zdHJ1Y3RvcihtZXRob2QpKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICAgICAgCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb25Gcm9tVHlwZSA9IGdldFR5cGVEZWNsYXJhdGlvbkZyb21UeXBlKHN1cGVyY2xhc3MsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uRnJvbVR5cGUgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSBkZWNsYXJhdGlvbkZyb21UeXBlLmdldE1ldGhvZHMoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgOiBtZXRob2RzKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Rycy5hZGQobmV3IFNvdXJjZUNvbnN0cnVjdG9yKG1ldGhvZCkpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb25zdHJzOwotICAgIH0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2Q+IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkgewotICAgICAgICBDb2xsZWN0aW9uPE1ldGhvZD4gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBuZXcgSGFzaFNldDxNZXRob2Q+KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKLSAgICAgICAgCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0gICAgCSAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IGdldFF1YWxpZmllZEludGVyZmFjZXMoKTsKLQkgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogaW50ZXJmYWNlcykgewotICAgICAgICAJCXRyeSB7Ci0JCSAgICAgICAgCUlUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShpZmFjZSk7Ci0JCSAgICAgICAgCWlmICh0eXBlICE9IG51bGwpCi0JICAgICAgICAJCQlnZXRVbmltcGxlbWVudGVkTWV0aG9kMCh0eXBlLCB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0gICAgICAgIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLSAgICAJICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB1bmltcGxlbWVudGVkTWV0aG9kczsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdldFVuaW1wbGVtZW50ZWRNZXRob2QwKElUeXBlIHR5cGUsIENvbGxlY3Rpb248TWV0aG9kPiB1bmltcGxlbWVudGVkTWV0aG9kcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0JCWlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLQkJICAgIElNZXRob2RbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCSAgICBmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkgICAgCXVuaW1wbGVtZW50ZWRNZXRob2RzLmFkZChuZXcgQmluYXJ5TWV0aG9kKG1ldGhvZCkpOwotCQkgICAgfQotCQkgICAgCi0JCSAgICAvLyBwcm9jZXNzIHN1cGVyIGludGVyZmFjZXMKLQkJICAgIFN0cmluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGUuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpOwotCQkJZm9yIChTdHJpbmcgc3VwZXJJbnRlcmZhY2UgOiBzdXBlckludGVyZmFjZXMpIHsKLQkJCQlJVHlwZSBzdXBlckludGVyZmFjZVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShzdXBlckludGVyZmFjZSk7Ci0JCQkJaWYgKHN1cGVySW50ZXJmYWNlVHlwZSAhPSBudWxsKSAKLQkJCQkJZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZDAoc3VwZXJJbnRlcmZhY2VUeXBlLCB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCSAgICBUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb25Gcm9tVHlwZSA9IGdldFR5cGVEZWNsYXJhdGlvbkZyb21UeXBlKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGNvbXBpbGF0aW9uVW5pdCk7Ci0JCSAgICBpZiAoZGVjbGFyYXRpb25Gcm9tVHlwZSAhPSBudWxsKSB7Ci0JCSAgICAgICAgTWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gZGVjbGFyYXRpb25Gcm9tVHlwZS5nZXRNZXRob2RzKCk7Ci0JCSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgOiBtZXRob2RzKSB7Ci0JCSAgICAgICAgCXVuaW1wbGVtZW50ZWRNZXRob2RzLmFkZChuZXcgU291cmNlTWV0aG9kKG1ldGhvZCkpOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJICAgIAotCQkgICAgLy8gcHJvY2VzcyBzdXBlciBpbnRlcmZhY2VzCi0JCSAgICBMaXN0PFR5cGU+IHN1cGVySW50ZXJmYWNlcyA9IGRlY2xhcmF0aW9uRnJvbVR5cGUuc3VwZXJJbnRlcmZhY2VUeXBlcygpOwotCQkgICAgZm9yIChUeXBlIHN1cGVySW50ZXJmYWNlIDogc3VwZXJJbnRlcmZhY2VzKSB7Ci0JCSAgICAJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBzdXBlckludGVyZmFjZS5yZXNvbHZlQmluZGluZygpOwotCQkgICAgCUlUeXBlIHN1cGVySW50ZXJmYWNlVHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQlpZiAoc3VwZXJJbnRlcmZhY2VUeXBlICE9IG51bGwpIAotCQkJCQlnZXRVbmltcGxlbWVudGVkTWV0aG9kMChzdXBlckludGVyZmFjZVR5cGUsIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJICAgIH0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGVxdWFsU2ltcGxlTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJU3RyaW5nIHNpbXBsZU5hbWUxID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUobmFtZTEpOwotCQlTdHJpbmcgc2ltcGxlTmFtZTIgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShuYW1lMik7Ci0JCXJldHVybiBzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpOwotCX0KLQotICAgIHByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uRnJvbVR5cGUoU3RyaW5nIHR5cGVOYW1lLCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2UodW5pdCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gY3UudHlwZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJaWYgKG9iaiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotCSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG9iajsKLQkgICAgICAgICAgICBJVHlwZUJpbmRpbmcgdGIgPSBkZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCSAgICAgICAgICAgIGlmICh0YiAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsYXJhdGlvbk5hbWUgPSB0Yi5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZS5lcXVhbHMoZGVjbGFyYXRpb25OYW1lKSkgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotICAgICAgICAJfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQVNUTm9kZSBwYXJzZShJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLSAgICAgICAgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotICAgICAgICBwYXJzZXIuc2V0S2luZChBU1RQYXJzZXIuS19DT01QSUxBVElPTl9VTklUKTsKLSAgICAgICAgcGFyc2VyLnNldFNvdXJjZSh1bml0KTsKLSAgICAgICAgcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLSAgICAgICAgcGFyc2VyLnNldFN0YXRlbWVudHNSZWNvdmVyeSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0lOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODViN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogUmVxdWlyZWQsIFN0cmluZyBwcm9wZXJ0eSB1c2VkIHRvIHNldCB0aGUgdW5xdWFsaWZpZWQgamF2YSBjbGFzcyBuYW1lIGZvciB0aGUgbmV3IGphdmEgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJOZXdKYXZhQ2xhc3NEYXRhTW9kZWwuQ0xBU1NfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgU3RyaW5nIHByb3BlcnR5IHVzZWQgdG8gc2V0IHRoZSBzb3VyY2UgZm9sZGVyIGxvY2F0aW9uIGZvciB0aGUgbmV3IGphdmEgY2xhc3MuICBUaGUgZmlyc3QKLQkgKiBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBwcm9qZWN0IHdpbGwgYmUgdXNlZCBpZiBvbmUgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5TT1VSQ0VfRk9MREVSIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBTdHJpbmcgcHJvcGVydHkgdXNlZCB0byB0byBzZXQgdGhlIGphdmEgcGFja2FnZSBmb3IgdGhlIG5ldyBqYXZhIGNsYXNzLiAgVGhlIGRlZmF1bHQKLQkgKiBwYWNrYWdlIGlzIHVzZWQgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QQUNLQUdFID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5KQVZBX1BBQ0tBR0UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIFN0cmluZyBwcm9wZXJ0eSB1c2VkIHRvIHNldCB0aGUgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUKLQkgKiBuZXcgamF2YSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUkNMQVNTID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5TVVBFUkNMQVNTIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBuZXcgamF2YSBjbGFzcy4gVGhpcyBpcyB0cnVlCi0JICogYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFUl9QVUJMSUMgPSAiTmV3SmF2YUNsYXNzRGF0YU1vZGVsLk1PRElGSUVSX1BVQkxJQyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNldCB3aGV0aGVyIHRoZSBuZXcgamF2YSBjbGFzcyBpcyBhYnN0cmFjdC4gIFRoaXMgaXMgZmFsc2UKLQkgKiBieSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVSX0FCU1RSQUNUID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5NT0RJRklFUl9BQlNUUkFDVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNldCB3aGV0aGVyIHRoZSBuZXcgamF2YSBjbGFzcyBpcyBkZWNsYXJlZCBmaW5hbC4gIFRoaXMgaXMgZmFsc2UKLQkgKiBieSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVSX0ZJTkFMID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5NT0RJRklFUl9GSU5BTCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgTGlzdCBwcm9wZXJ0eSBvZiBhbGwgdGhlIHF1YWxpZmllZCBuYW1lcyBvZiBpbnRlcmZhY2VzIHRoZSBuZXcgamF2YSBjbGFzcyBzaG91bGQgaW1wbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRVMgPSAiTmV3SmF2YUNsYXNzRGF0YU1vZGVsLklOVEVSRkFDRVMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzZXQgd2hldGhlciB0aGUgbmV3IGphdmEgY2xhc3Mgc2hvdWxkIGdlbmVyYXRlIGEgbWFpbiBtZXRob2QuICBUaGlzCi0JICogaXMgZmFsc2UgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX01FVEhPRCA9ICJOZXdKYXZhQ2xhc3NEYXRhTW9kZWwuTUFJTl9NRVRIT0QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzZXQgd2hldGhlciBvciBub3QgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHN1cGVyY2xhc3Mgc2hvdWxkIGJlCi0JICogZ2VuZXJhdGVkIGluIHRoZSBuZXcgamF2YSBjbGFzcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSVUNUT1IgPSAiTmV3SmF2YUNsYXNzRGF0YU1vZGVsLkNPTlNUUlVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc2V0IHdoZXRoZXIgdGhlIG5ldyBqYXZhIGNsYXNzIHNob3VsZCBhZGQgbWV0aG9kIHN0dWJzIGZvciB1bmltcGxlbWVudGVkCi0JICogbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2VzIG9mIHRoZSBpbnRlcmZhY2UgbGlzdC4gIFRoaXMgaXMgdHJ1ZSBieSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCU1RSQUNUX01FVEhPRFMgPSAiTmV3SmF2YUNsYXNzRGF0YU1vZGVsLkFCU1RSQUNUX01FVEhPRFMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzZXQgd2hldGhlciB0aGUgbmV3IGphdmEgY2xhc3Mgc2hvdWxkCi0JICogYmUgb3BlbiBpbiB0aGUgZGVmYXVsdCBlZGl0b3IuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIFRoZSB2YWx1ZSBjb3VsZAotCSAqIGJlIGNoYW5nZWQgdG8gZmFsc2UgaWYgb3BlbmluZyB0aGUgamF2YSBjbGFzcyBpbiB0aGUgZWRpdG9yIGlzIG5vdAotCSAqIGRlc2lyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9JTl9FRElUT1IgPSAiTmV3SmF2YUNsYXNzRGF0YU1vZGVsLk9QRU5fSU5fRURJVE9SIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRISVMgUFJPUEVSVFkgU0hPVUxEIE5PVCBCRSBTRVQsIGl0J3MgdmFsdWUgaXMgbWVhbnQgdG8gYmUgZGV0ZXJtaW5lZCBhcyBhIGhlbHBlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCA9ICJOZXdKYXZhQ2xhc3NEYXRhTW9kZWwuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVEhJUyBQUk9QRVJUWSBTSE9VTEQgTk9UIEJFIFNFVCwgaXQncyB2YWx1ZSBpcyBtZWFudCB0byBiZSBkZXRlcm1pbmVkIGFzIGEgaGVscGVyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU09VUkNFX0ZPTERFUiA9ICJOZXdKYXZhQ2xhc3NEYXRhTW9kZWwuSkFWQV9TT1VSQ0VfRk9MREVSIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRISVMgUFJPUEVSVFkgU0hPVUxEIE5PVCBCRSBTRVQsIGl0J3MgdmFsdWUgaXMgbWVhbnQgdG8gYmUgZGV0ZXJtaW5lZCBhcyBhIGhlbHBlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gIk5ld0phdmFDbGFzc0RhdGFNb2RlbC5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRISVMgUFJPUEVSVFkgU0hPVUxEIE5PVCBCRSBTRVQsIGl0J3MgdmFsdWUgaXMgbWVhbnQgdG8gYmUgZGV0ZXJtaW5lZCBhcyBhIGhlbHBlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfQ0xBU1NfTkFNRSA9ICJOZXdKYXZhQ2xhc3NEYXRhTW9kZWwuUVVBTElGSUVEX0NMQVNTX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXF1aXJlZCwgU3RyaW5nIHByb3BlcnR5IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZGVmYXVsdCBkZXBsb3ltZW50IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ERCA9ICJJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0ltcG9ydHNDb2xsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9JbXBvcnRzQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA0NTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0ltcG9ydHNDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRzQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENvbGxlY3Rpb248U3RyaW5nPiB7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbjsKLQlwcml2YXRlIENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbCBtb2RlbDsKLQkKLQlwdWJsaWMgSW1wb3J0c0NvbGxlY3Rpb24oQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsIG1vZGVsKSB7Ci0JCWNvbGxlY3Rpb24gPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoU3RyaW5nIG8pIHsKLQkJaWYgKCFpc0ltcG9ydEluSmF2YUxhbmcobykgJiYgIWlzSW1wb3J0SW5TYW1lUGFja2FnZShvKSkKLQkJCXJldHVybiBjb2xsZWN0aW9uLmFkZChvKTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4gYykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkKLQkJZm9yIChTdHJpbmcgbyA6IGMpCi0JCQlyZXN1bHQgPSByZXN1bHQgfCB0aGlzLmFkZChvKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gY29sbGVjdGlvbi5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24uY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24uaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gY29sbGVjdGlvbi5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gY29sbGVjdGlvbi5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoYyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkoYSk7Ci0JfQotCQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ltcG9ydEluSmF2YUxhbmcoU3RyaW5nIGFyZykgewotICAgIAlyZXR1cm4gYXJnLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKTsgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ltcG9ydEluU2FtZVBhY2thZ2UoU3RyaW5nIGFyZykgewotICAgIAlTdHJpbmcgcXVhbGlmaWVyID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihhcmcpOwotICAgIAkKLSAgICAJcmV0dXJuIHF1YWxpZmllci5lcXVhbHMobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSjJFRU1vZGlmaWVySGVscGVyQ3JlYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSjJFRU1vZGlmaWVySGVscGVyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZhNzRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0oyRUVNb2RpZmllckhlbHBlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5Nb2RpZmllckhlbHBlcjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzgvMjAwMSAxMDoxMzo1MiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU1vZGlmaWVySGVscGVyQ3JlYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGlmaWVySGVscGVyIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckhlbHBlcihFSkJKYXIgYW5FSkJKYXIpIHsKLQkJaWYgKGFuRUpCSmFyID09IG51bGwgfHwgYW5FSkJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFamJQYWNrYWdlIHBhY2sgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IHBhY2suZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlyZXR1cm4gbmV3IE1vZGlmaWVySGVscGVyKGFuRUpCSmFyLCBzZiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG1vZGlmaWVyIGhlbHBlciB0aGF0IHdpbGwgY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCBtZXRob2QgdHlwZSBhbmQgcGFyYW0KLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZFNpZyBhbmQgdGhlIG1ldGhvZHBlcm1pc3Npb24gd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIHNlY3VyaXR5Ci0JICogcm9sZS4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJIZWxwZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFzQ29weUhlbHBlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIFNlY3VyaXR5Um9sZSByb2xlKSB7Ci0JCWlmIChyb2xlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kaWZpZXJIZWxwZXIgdGVtcEhlbHBlciA9IG5ldyBNb2RpZmllckhlbHBlcigpOwotCQlzZXRNZXRob2RQZXJtaXNzaW9uT3duZXJIZWxwZXIodGVtcEhlbHBlciwgcm9sZSk7Ci0JCXRlbXBIZWxwZXIuc2V0RmVhdHVyZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpKTsKLQkJdGVtcEhlbHBlci5zZXRWYWx1ZShFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KGVsZW1lbnQpKTsKLQkJcmV0dXJuIHRlbXBIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG1vZGlmaWVyIGhlbHBlciB0aGF0IHdpbGwgY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCBtZXRob2QgdHlwZSBhbmQgcGFyYW0KLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZFNpZyBhbmQgdGhlIG1ldGhvZHBlcm1pc3Npb24gd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIHNlY3VyaXR5Ci0JICogcm9sZS4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJIZWxwZXIgY3JlYXRlTWV0aG9kRWxlbWVudEhlbHBlcihFbnRlcnByaXNlQmVhbiBiZWFuLCBTZWN1cml0eVJvbGUgcm9sZSwgU3RyaW5nIG1ldGhvZFR5cGUsIFN0cmluZyBtZXRob2RTaWcpIHsKLQkJaWYgKHJvbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RpZmllckhlbHBlciB0ZW1wSGVscGVyID0gbmV3IE1vZGlmaWVySGVscGVyKCk7Ci0JCXNldE1ldGhvZFBlcm1pc3Npb25Pd25lckhlbHBlcih0ZW1wSGVscGVyLCByb2xlKTsKLQkJdGVtcEhlbHBlci5zZXRGZWF0dXJlKGdldEVqYlBhY2thZ2UoKS5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCkpOwotCQl0ZW1wSGVscGVyLmFkZEF0dHJpYnV0ZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCksIG1ldGhvZFR5cGUpOwotCQlpbnQgaW5kZXggPSBtZXRob2RTaWcuaW5kZXhPZigiKCIpOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2RTaWc7Ci0JCVN0cmluZyBtZXRob2RQYXJtcyA9IG51bGw7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQltZXRob2ROYW1lID0gbWV0aG9kU2lnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQltZXRob2RQYXJtcyA9IG1ldGhvZFNpZy5zdWJzdHJpbmcoaW5kZXggKyAxLCBtZXRob2RTaWcubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlpZiAobWV0aG9kUGFybXMgIT0gbnVsbCkKLQkJCW1ldGhvZFBhcm1zID0gbWV0aG9kUGFybXMucmVwbGFjZSgnLCcsICcgJyk7Ci0JCXRlbXBIZWxwZXIuYWRkQXR0cmlidXRlKGdldEVqYlBhY2thZ2UoKS5nZXRNZXRob2RFbGVtZW50X05hbWUoKSwgbWV0aG9kTmFtZSk7Ci0JCWlmIChtZXRob2RQYXJtcyAhPSBudWxsKQotCQkJdGVtcEhlbHBlci5hZGRBdHRyaWJ1dGUoZ2V0RWpiUGFja2FnZSgpLmdldE1ldGhvZEVsZW1lbnRfUGFybXMoKSwgbWV0aG9kUGFybXMpOwotCQl0ZW1wSGVscGVyLmFkZEF0dHJpYnV0ZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpLCBiZWFuKTsKLQkJcmV0dXJuIHRlbXBIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG1vZGlmaWVyIGhlbHBlciB0aGF0IHdpbGwgY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCBtZXRob2QgdHlwZSBhbmQgcGFyYW0KLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZFNpZyBhbmQgYSBuZXcgbWV0aG9kdHJhbnNhY3RvbiBmb3IgYSB0cmFuc3R5cGUuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIE1vZGlmaWVySGVscGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbiwgU3RyaW5nIG1ldGhvZFR5cGUsIFN0cmluZyBtZXRob2RTaWcsIFN0cmluZyB0cmFuc1R5cGUpIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RpZmllckhlbHBlciBvd25lckhlbHBlciA9IGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uSGVscGVyKChFSkJKYXIpIGJlYW4uZUNvbnRhaW5lcigpLCB0cmFuc1R5cGUpOwotCQlNb2RpZmllckhlbHBlciB0ZW1wSGVscGVyID0gbmV3IE1vZGlmaWVySGVscGVyKCk7Ci0JCXRlbXBIZWxwZXIuc2V0T3duZXJIZWxwZXIob3duZXJIZWxwZXIpOwotCQl0ZW1wSGVscGVyLnNldEZlYXR1cmUoZ2V0RWpiUGFja2FnZSgpLmdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCkpOwotCQl0ZW1wSGVscGVyLmFkZEF0dHJpYnV0ZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCksIG1ldGhvZFR5cGUpOwotCQlpbnQgaW5kZXggPSBtZXRob2RTaWcuaW5kZXhPZigiKCIpOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2RTaWc7Ci0JCVN0cmluZyBtZXRob2RQYXJtcyA9IG51bGw7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQltZXRob2ROYW1lID0gbWV0aG9kU2lnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQltZXRob2RQYXJtcyA9IG1ldGhvZFNpZy5zdWJzdHJpbmcoaW5kZXggKyAxLCBtZXRob2RTaWcubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlpZiAobWV0aG9kUGFybXMgIT0gbnVsbCkKLQkJCW1ldGhvZFBhcm1zID0gbWV0aG9kUGFybXMucmVwbGFjZSgnLCcsICcgJyk7Ci0JCXRlbXBIZWxwZXIuYWRkQXR0cmlidXRlKGdldEVqYlBhY2thZ2UoKS5nZXRNZXRob2RFbGVtZW50X05hbWUoKSwgbWV0aG9kTmFtZSk7Ci0JCWlmIChtZXRob2RQYXJtcyAhPSBudWxsKQotCQkJdGVtcEhlbHBlci5hZGRBdHRyaWJ1dGUoZ2V0RWpiUGFja2FnZSgpLmdldE1ldGhvZEVsZW1lbnRfUGFybXMoKSwgbWV0aG9kUGFybXMpOwotCQl0ZW1wSGVscGVyLmFkZEF0dHJpYnV0ZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpLCBiZWFuKTsKLQkJcmV0dXJuIHRlbXBIZWxwZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RpZmllckhlbHBlciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uSGVscGVyKFNlY3VyaXR5Um9sZSByb2xlKSB7Ci0KLQkJaWYgKHJvbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseSA9IChBc3NlbWJseURlc2NyaXB0b3IpIHJvbGUuZUNvbnRhaW5lcigpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJTW9kaWZpZXJIZWxwZXIgdGVtcEhlbHBlciA9IG5ldyBNb2RpZmllckhlbHBlcihhc3NlbWJseSwgc2YsIG51bGwpOwotCQl0ZW1wSGVscGVyLmFkZEF0dHJpYnV0ZShnZXRFamJQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpLCByb2xlKTsKLQkJcmV0dXJuIHRlbXBIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgaGVscGVyIHRoYXQgd2lsbCBjcmVhdGUgYSBuZXcgTWV0aG9kVHJhbnNhY3Rpb24gd2l0aAotCSAqIAotCSAqIEBhVHJhbnNUeXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJIZWxwZXIgY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25IZWxwZXIoRUpCSmFyIGFuRUpCSmFyLCBTdHJpbmcgYVRyYW5zVHlwZSkgewotCQlpZiAoYW5FSkJKYXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RpZmllckhlbHBlciBoZWxwZXIgPSBuZXcgTW9kaWZpZXJIZWxwZXIoKTsKLQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yT3duZXJIZWxwZXIoaGVscGVyLCBhbkVKQkphcik7Ci0JCWhlbHBlci5zZXRGZWF0dXJlKGdldEVqYlBhY2thZ2UoKS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCkpOwotCQloZWxwZXIuYWRkQXR0cmlidXRlKGdldEVqYlBhY2thZ2UoKS5nZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpLCBhVHJhbnNUeXBlKTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25QYWNrYWdlIGdldENvbW1vblBhY2thZ2UoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgZ2V0RWpiUGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG93bmVyIG9mCi0JICogCi0JICogQGhlbHBlciB0byBiZSB0aGUgZXhpc3RpbmcgQXNzZW1ibHlEZXNjcmlwdG9yIGZyb20KLQkgKiBAYW5FSkJKYXIgb3Igc2V0IHRoZSBvd25lckhlbHBlciBvZgotCSAqIEBoZWxwZXIgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyBBc3NlbWJseURlc2NyaXB0b3Igd2hlbiBvbmUgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvck93bmVySGVscGVyKE1vZGlmaWVySGVscGVyIGhlbHBlciwgRUpCSmFyIGFuRUpCSmFyKSB7Ci0JCU1vZGlmaWVySGVscGVyIG93bmVySGVscGVyID0gSjJFRU1vZGlmaWVySGVscGVyQ3JlYXRvci5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3JIZWxwZXIoYW5FSkJKYXIpOwotCQlpZiAob3duZXJIZWxwZXIgPT0gbnVsbCkKLQkJCWhlbHBlci5zZXRPd25lcihhbkVKQkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSk7Ci0JCWVsc2UKLQkJCWhlbHBlci5zZXRPd25lckhlbHBlcihvd25lckhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvd25lciBvZgotCSAqIAotCSAqIEBoZWxwZXIgdG8gYmUgdGhlIGV4aXN0aW5nIEFzc2VtYmx5RGVzY3JpcHRvciBmcm9tCi0JICogQGFuRUpCSmFyIG9yIHNldCB0aGUgb3duZXJIZWxwZXIgb2YKLQkgKiBAaGVscGVyIGZvciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgQXNzZW1ibHlEZXNjcmlwdG9yIHdoZW4gb25lIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZXRob2RQZXJtaXNzaW9uT3duZXJIZWxwZXIoTW9kaWZpZXJIZWxwZXIgaGVscGVyLCBTZWN1cml0eVJvbGUgcm9sZSkgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJcm9sZUxpc3QuYWRkKHJvbGUpOwotCQlNZXRob2RQZXJtaXNzaW9uIHBlcm1pc3Npb24gPSAoKEFzc2VtYmx5RGVzY3JpcHRvcikgcm9sZS5lQ29udGFpbmVyKCkpLmdldE1ldGhvZFBlcm1pc3Npb24ocm9sZUxpc3QpOwotCQlNb2RpZmllckhlbHBlciBvd25lckhlbHBlciA9IG51bGw7Ci0JCWlmIChwZXJtaXNzaW9uID09IG51bGwpCi0JCQlvd25lckhlbHBlciA9IEoyRUVNb2RpZmllckhlbHBlckNyZWF0b3IuY3JlYXRlTWV0aG9kUGVybWlzc2lvbkhlbHBlcihyb2xlKTsKLQotCQlpZiAob3duZXJIZWxwZXIgPT0gbnVsbCkKLQkJCWhlbHBlci5zZXRPd25lcihwZXJtaXNzaW9uKTsKLQkJZWxzZQotCQkJaGVscGVyLnNldE93bmVySGVscGVyKG93bmVySGVscGVyKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0YzcwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotLyoqCi0gKiB7QGxpbmsgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1fQotICogCi0gKiBAZGVwcmVjYXRlZCBUaGlzIHNob3VsZCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIG5ldyBFQVIgJiBXZWIgTGliIGNsYXNzcGF0aAotICogICAgICAgICAgICAgY29udGFpbmVycwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpBUkRlcGVuZGVuY3lEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIFN0cmluZywgdGhlIGVhciBwcm9qZWN0IG5hbWUsIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1BST0pFQ1RfTkFNRSA9ICJBYnN0cmFjdEpBUkRlcGVuZGVuY3lEYXRhTW9kZWwuRUFSX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUFJPSkVDVF9OQU1FID0gIkFic3RyYWN0SkFSRGVwZW5kZW5jeURhdGFNb2RlbC5SRUZFUkVOQ0VEX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIG5lc3RlZCwgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FOwotCi0KLQkvKioKLQkgKiBVc2VkIGZvciBjbGllbnQgSkFSIGRlcGVuZGVuY3kgaW52ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BQT1NJVEVfUFJPSkVDVF9OQU1FID0gIkFic3RyYWN0SkFSRGVwZW5kZW5jeURhdGFNb2RlbC5PUFBPU0lURV9QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBuZXN0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfTElTVCA9IFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVDsKLQotCS8qKgotCSAqIHR5cGUgSW50ZWdlciwgZGVmYXVsdCBKQVJfTUFOSVBVTEFUSU9OX0FERCwgb3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBKQVJfTUFOSVBVTEFUSU9OX1JFTU9WRQotCSAqIGFuZCBKQVJfTUFOSVBVTEFUSU9OX0lOVkVSVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9NQU5JUFVMQVRJT05fVFlQRSA9ICJBYnN0cmFjdEpBUkRlcGVuZGVuY3lEYXRhTW9kZWwuSkFSX01BTklQVUxBVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9NT0RFTF9VUERBVEVfTUFJTkZFU1QgPSAiQWJzdHJhY3RKQVJEZXBlbmRlbmN5RGF0YU1vZGVsLk5FU1RFRF9NT0RFTF9VUERBVEVfTUFJTkZFU1QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVJfTUFOSVBVTEFUSU9OX0FERCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFSX01BTklQVUxBVElPTl9SRU1PVkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBUl9NQU5JUFVMQVRJT05fSU5WRVJUID0gMjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZjY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMiwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi0vKioKLSAqIHtAbGluayBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV9Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgbmV3IEVBUiAmIFdlYiBMaWIgY2xhc3NwYXRoCi0gKiAgICAgICAgICAgICBjb250YWluZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJFRkVSRU5DRURfUFJPSkVDVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSkFSX01BTklQVUxBVElPTl9UWVBFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoT1BQT1NJVEVfUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlJRGF0YU1vZGVsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7Ci0JCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9VUERBVEVfTUFJTkZFU1QsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBUl9NQU5JUFVMQVRJT05fVFlQRSkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKQVJfTUFOSVBVTEFUSU9OX0FERCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRFQVJQcm9qZWN0KCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0VXBkYXRlTWFuaWZlc3REYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfVVBEQVRFX01BSU5GRVNUKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UmVmZXJlbmNlZFByb2plY3QoKSB7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoUkVGRVJFTkNFRF9QUk9KRUNUX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0T3Bwb3NpdGVQcm9qZWN0KCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KE9QUE9TSVRFX1BST0pFQ1RfTkFNRSkpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSkFSRGVwZW5kZW5jeU9wZXJhdGlvbihtb2RlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSkFSRGVwZW5kZW5jeU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSkFSRGVwZW5kZW5jeU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjBhNzcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0pBUkRlcGVuZGVuY3lPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIHtAbGluayBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV9Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgbmV3IEVBUiAmIFdlYiBMaWIgY2xhc3NwYXRoCi0gKiAgICAgICAgICAgICBjb250YWluZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVJEZXBlbmRlbmN5T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllc3sKLQlwdWJsaWMgSkFSRGVwZW5kZW5jeU9wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmVNb2RlbChDbGFzc3BhdGhNb2RlbCBtb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoIW1vZGVsLmlzRGlydHkoKSkKLQkJCXJldHVybjsKLQkJdmFsaWRhdGVFZGl0KG1vZGVsKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDIpOyAvLyROT04tTkxTLTEkCi0JCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gbWZPcGVyYXRpb24gPSBjcmVhdGVNYW5pZmVzdE9wZXJhdGlvbihtb2RlbCk7Ci0JCUlIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkUGF0aE9wZXJhdGlvbiA9IGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbihtb2RlbCk7Ci0JCXRyeSB7Ci0JCQltZk9wZXJhdGlvbi5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIG51bGwpOwotCQkJLy8gTm8gbG9uZ2VyIG1hbmlwdWxhdGluZyBidWlsZCBwYXRoLi4uIGNvbnRhaW5lcnMgd2lsbCBjYWxjdWxhdGUKLQkJCS8vYnVpbGRQYXRoT3BlcmF0aW9uLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRWRpdChDbGFzc3BhdGhNb2RlbCBhTW9kZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU2V0IGFmZmVjdGVkRmlsZXMgPSBhTW9kZWwuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCQlJRmlsZVtdIGZpbGVzID0gKElGaWxlW10pIGFmZmVjdGVkRmlsZXMudG9BcnJheShuZXcgSUZpbGVbYWZmZWN0ZWRGaWxlcy5zaXplKCldKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHJlc3VsdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24gY3JlYXRlQnVpbGRQYXRoT3BlcmF0aW9uKENsYXNzcGF0aE1vZGVsIGFNb2RlbCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KGFNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gbmV3IFVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24oamF2YVByb2plY3QsIGFNb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBjcmVhdGVNYW5pZmVzdE9wZXJhdGlvbihDbGFzc3BhdGhNb2RlbCBhTW9kZWwpIHsKLQkJSURhdGFNb2RlbCB1cGRhdGVNYW5pZmVzdERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIuY2xhc3MpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBhTW9kZWwuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUVSR0UsIGZhbHNlKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNULCBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyLmNvbnZlcnRDbGFzc3BhdGhTdHJpbmdUb0xpc3QoYU1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpLnRvU3RyaW5nKCkpKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BTklGRVNUX0ZJTEUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZSggYU1vZGVsLmdldFByb2plY3QoKSkpOwotCQlyZXR1cm4gbmV3IFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsKTsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKSk7IAotCQkKLQkJQ2xhc3NwYXRoTW9kZWwgY2xwTW9kZWwgPSBuZXcgQ2xhc3NwYXRoTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHByb2opKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoIGVhclByb2plY3QgKTsKLQkJaWYoICFlYXJDb21wb25lbnQuZXhpc3RzKCkgKQotCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQkJCi0JCWNscE1vZGVsLnNldFNlbGVjdGVkRUFSQ29tcG9uZW50KCBlYXJDb21wb25lbnQgKTsKLQkJY2xwTW9kZWwuc2V0UHJvamVjdCggcHJvaiApOwotCQkKLQkJdHJ5IHsKLQkJCWludCBqYXJNYW5pcHVsYXRpb25UeXBlID0gbW9kZWwuZ2V0SW50UHJvcGVydHkoSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMuSkFSX01BTklQVUxBVElPTl9UWVBFKTsKLQkJCXN3aXRjaCAoamFyTWFuaXB1bGF0aW9uVHlwZSkgewotCQkJCWNhc2UgSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMuSkFSX01BTklQVUxBVElPTl9BREQgOgotCQkJCQl7Ci0JCQkJCQlMaXN0IGphckxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1VQREFURV9NQUlORkVTVCkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNUKTsKLQkJCQkJCWlmICghamFyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJU3RyaW5nIGphck5hbWUgPSAoU3RyaW5nKSBqYXJMaXN0LmdldChpKTsKLQkJCQkJCQkJY2xwTW9kZWwuc2VsZWN0RGVwZW5kZW5jeUlmTmVjZXNzYXJ5KGphck5hbWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJSVByb2plY3QgcmVmcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5SRUZFUkVOQ0VEX1BST0pFQ1RfTkFNRSkpOwkJCQkJCQkKLQkJCQkJCQljbHBNb2RlbC5zZWxlY3REZXBlbmRlbmN5SWZOZWNlc3NhcnkoIHJlZnByb2ogKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTUFOSVBVTEFUSU9OX1JFTU9WRSA6IAotCQkJCQl7Ci0JCQkJCQlMaXN0IGphckxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1VQREFURV9NQUlORkVTVCkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNUKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamFyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCVN0cmluZyBqYXJOYW1lID0gKFN0cmluZykgamFyTGlzdC5nZXQoaSk7Ci0JCQkJCQkJY2xwTW9kZWwucmVtb3ZlRGVwZW5kZW5jeShqYXJOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTUFOSVBVTEFUSU9OX0lOVkVSVCA6Ci0JCQkJCXsKLQkJCQkJCUlQcm9qZWN0IHJlZnByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMuUkVGRVJFTkNFRF9QUk9KRUNUX05BTUUpKTsKLQkJCQkJCUlQcm9qZWN0IG9wcG9zaXRlUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvcGVydGllcy5PUFBPU0lURV9QUk9KRUNUX05BTUUpKTsKLQkJCQkJCWNscE1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpLmludmVydENsaWVudEpBUlNlbGVjdGlvbiggcmVmcHJvaiwgb3Bwb3NpdGVQcm9qZWN0ICk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCX0KLQkJCWlmIChjbHBNb2RlbC5pc0RpcnR5KCkpCi0JCQkJdHJ5IHsKLQkJCQkJc2F2ZU1vZGVsKGNscE1vZGVsLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNscE1vZGVsICE9IG51bGwpCi0JCQkJY2xwTW9kZWwuZGlzcG9zZSgpOwkJCQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0phdmFNb2RlbFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0phdmFNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxNDdkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KYXZhTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYXJlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi0vL1RPRE8gdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGNsYXNzIGluIG9yZy5lY2xpcHNlLmpkdC51aSBhbmQgc2hvdWxkIGJlIGRlbGV0ZWQgb25jZSBidWd6aWxsYSA2MDU2NwotLy8gaXMgYWRkcmVzc2VkCi0vKioKLSAqIAotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIEphdmEgTW9kZWwuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhTW9kZWxVdGlsIHsKLQkKLQkvKioKLQkgKiBPbmx5IHVzZSB0aGlzIHN1ZmZpeCBmb3IgY3JlYXRpbmcgbmV3IC5qYXZhIGZpbGVzLgotCSAqIEluIGdlbmVyYWwsIHVzZSBvbmUgb2YgdGhlIHRocmVlICpKYXZhTGlrZSooLi4pIG1ldGhvZHMgaW4gSmF2YUNvcmUgb3IgY3JlYXRlCi0JICogYSBuYW1lIGZyb20gYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCB3aXRoIHtAbGluayAjZ2V0UmVuYW1lZENVTmFtZShJQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcpfQotCSAqIDxwPiAKLQkgKiBOb3RlOiBVbmxpa2Uge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpfSwgdGhpcyBzdWZmaXggaW5jbHVkZXMgYSBsZWFkaW5nICIuIi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKSAKLQkgKiBAc2VlIEphdmFDb3JlI2lzSmF2YUxpa2VGaWxlTmFtZShTdHJpbmcpCi0JICogQHNlZSBKYXZhQ29yZSNyZW1vdmVKYXZhTGlrZUV4dGVuc2lvbihTdHJpbmcpCi0JICogQHNlZSAjZ2V0UmVuYW1lZENVTmFtZShJQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DVV9TVUZGSVg9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogRmluZHMgYSB0eXBlIGJ5IGl0cyBxdWFsaWZpZWQgdHlwZSBuYW1lIChkb3Qgc2VwYXJhdGVkKS4KLQkgKiBAcGFyYW0ganByb2plY3QgVGhlIGphdmEgcHJvamVjdCB0byBzZWFyY2ggaW4KLQkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSAodHlwZSBuYW1lIHdpdGggZW5jbG9zaW5nIHR5cGUgbmFtZXMgYW5kIHBhY2thZ2UgKGFsbCBzZXBhcmF0ZWQgYnkgZG90cykpCi0JICogQHJldHVybiBUaGUgdHlwZSBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZXhpc3RpbmcKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShJSmF2YVByb2plY3QganByb2plY3QsIFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvL3dvcmthcm91bmQgZm9yIGJ1ZyAyMjg4MwotCQlJVHlwZSB0eXBlPSBqcHJvamVjdC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIHR5cGU7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHM9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gcm9vdHNbaV07Ci0JCQl0eXBlPSBmaW5kVHlwZShyb290LCBmdWxseVF1YWxpZmllZE5hbWUpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmV4aXN0cygpKQotCQkJCXJldHVybiB0eXBlOwotCQl9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqIAotCSAqIEZpbmRzIGEgdHlwZSBieSBpdHMgcXVhbGlmaWVkIHR5cGUgbmFtZSAoZG90IHNlcGFyYXRlZCkuCi0JICogQHBhcmFtIGpwcm9qZWN0IFRoZSBqYXZhIHByb2plY3QgdG8gc2VhcmNoIGluCi0JICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgKHR5cGUgbmFtZSB3aXRoIGVuY2xvc2luZyB0eXBlIG5hbWVzIGFuZCBwYWNrYWdlIChhbGwgc2VwYXJhdGVkIGJ5IGRvdHMpKQotCSAqIEBwYXJhbSBvd25lciB0aGUgd29ya2luZyBjb3B5IG93bmVyCi0JICogQHJldHVybiBUaGUgdHlwZSBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZXhpc3RpbmcKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShJSmF2YVByb2plY3QganByb2plY3QsIFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvL3dvcmthcm91bmQgZm9yIGJ1ZyAyMjg4MwotCQlJVHlwZSB0eXBlPSBqcHJvamVjdC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUsIG93bmVyKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJldHVybiB0eXBlOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzPSBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IHJvb3RzW2ldOwotCQkJdHlwZT0gZmluZFR5cGUocm9vdCwgZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHlwZTsKLQkJfQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGUgZmluZFR5cGUoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbnsKLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW49IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudD0gY2hpbGRyZW5baV07Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKXsKLQkJCQlJUGFja2FnZUZyYWdtZW50IHBhY2s9IChJUGFja2FnZUZyYWdtZW50KWVsZW1lbnQ7Ci0JCQkJaWYgKCEgZnVsbHlRdWFsaWZpZWROYW1lLnN0YXJ0c1dpdGgocGFjay5nZXRFbGVtZW50TmFtZSgpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJSVR5cGUgdHlwZT0gZmluZFR5cGUocGFjaywgZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElUeXBlIGZpbmRUeXBlKElQYWNrYWdlRnJhZ21lbnQgcGFjaywgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbnsKLQkJSUNvbXBpbGF0aW9uVW5pdFtdIGN1cz0gcGFjay5nZXRDb21waWxhdGlvblVuaXRzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjdXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb21waWxhdGlvblVuaXQgdW5pdD0gY3VzW2ldOwotCQkJSVR5cGUgdHlwZT0gZmluZFR5cGUodW5pdCwgZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHlwZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGUgZmluZFR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbnsKLQkJSVR5cGVbXSB0eXBlcz0gY3UuZ2V0QWxsVHlwZXMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVHlwZSB0eXBlPSB0eXBlc1tpXTsKLQkJCWlmIChnZXRGdWxseVF1YWxpZmllZE5hbWUodHlwZSkuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkTmFtZSkpCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEZpbmRzIGEgdHlwZSBjb250YWluZXIgYnkgY29udGFpbmVyIG5hbWUuCi0JICogVGhlIHJldHVybmVkIGVsZW1lbnQgd2lsbCBiZSBvZiB0eXBlIDxjb2RlPklUeXBlPC9jb2RlPiBvciBhIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+LgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkIGlmIHRoZSB0eXBlIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgZm91bmQuCi0JICogQHBhcmFtIGpwcm9qZWN0IFRoZSBKYXZhIHByb2plY3QgZGVmaW5pbmcgdGhlIGNvbnRleHQgdG8gc2VhcmNoCi0JICogQHBhcmFtIHR5cGVDb250YWluZXJOYW1lIEEgZG90IHNlcGFyYXRlZCBuYW1lIG9mIHRoZSB0eXBlIGNvbnRhaW5lcgotCSAqIEBzZWUgI2dldFR5cGVDb250YWluZXJOYW1lKElUeXBlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGZpbmRUeXBlQ29udGFpbmVyKElKYXZhUHJvamVjdCBqcHJvamVjdCwgU3RyaW5nIHR5cGVDb250YWluZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJLy8gdHJ5IHRvIGZpbmQgaXQgYXMgdHlwZQotCQlJSmF2YUVsZW1lbnQgcmVzdWx0PSBqcHJvamVjdC5maW5kVHlwZSh0eXBlQ29udGFpbmVyTmFtZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gZmluZCBpdCBhcyBwYWNrYWdlCi0JCQlJUGF0aCBwYXRoPSBuZXcgUGF0aCh0eXBlQ29udGFpbmVyTmFtZS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCQlyZXN1bHQ9IGpwcm9qZWN0LmZpbmRFbGVtZW50KHBhdGgpOwotCQkJaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkpIHsKLQkJCQlyZXN1bHQ9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0JCi0JCi0JLyoqIAotCSAqIEZpbmRzIGEgdHlwZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuIFR5cGljYWwgdXNhZ2UgaXMgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZwotCSAqIHR5cGUgaW4gYSB3b3JraW5nIGNvcHkuCi0JICogQHBhcmFtIGN1IHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHNlYXJjaCBpbgotCSAqIEBwYXJhbSB0eXBlUXVhbGlmaWVkTmFtZSB0aGUgdHlwZSBxdWFsaWZpZWQgbmFtZSAodHlwZSBuYW1lIHdpdGggZW5jbG9zaW5nIHR5cGUgbmFtZXMgKHNlcGFyYXRlZCBieSBkb3RzKSkKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIGZvdW5kLCBvciBudWxsIGlmIG5vdCBleGlzdGluZwotCSAqLwkJCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZUluQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyB0eXBlUXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlUeXBlW10gdHlwZXM9IGN1LmdldEFsbFR5cGVzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGN1cnJOYW1lPSBnZXRUeXBlUXVhbGlmaWVkTmFtZSh0eXBlc1tpXSk7Ci0JCQlpZiAodHlwZVF1YWxpZmllZE5hbWUuZXF1YWxzKGN1cnJOYW1lKSkgewotCQkJCXJldHVybiB0eXBlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqIAotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgd2hpY2ggaXMgImVxdWFsIiB0byB0aGUKLQkgKiBnaXZlbiBlbGVtZW50LiBOb3RlIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgdXN1YWxseSBoYXMgYSBwYXJlbnQgZGlmZmVyZW50Ci0JICogZnJvbSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKLQkgKiBAcGFyYW0gY3UgdGhlIGN1IHRvIHNlYXJjaCBpbgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGxvb2sgZm9yCi0JICogQHJldHVybiBhbiBlbGVtZW50IG9mIHRoZSBnaXZlbiBjdSAiZXF1YWwiIHRvIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCQkKLQlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBmaW5kSW5Db21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IGN1LmZpbmRFbGVtZW50cyhlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRzWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlIHVzaW5nICcuJyBhcyBzZXBhcmF0b3JzLgotCSAqIFRoaXMgaXMgYSByZXBsYWNlIGZvciBJVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpCi0JICogd2hpY2ggdXNlcyAnJCcgYXMgc2VwYXJhdG9ycy4gQXMgJyQnIGlzIGFsc28gYSB2YWxpZCBjaGFyYWN0ZXIgaW4gYW4gaWQKLQkgKiB0aGlzIGlzIGFtYmlndW91cy4gSmF2YUNvcmUgUFI6IDFHQ0ZVTlQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZS5pc0JpbmFyeSgpICYmICF0eXBlLmlzQW5vbnltb3VzKCkpIHsKLQkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRUeXBlUXVhbGlmaWVkTmFtZShkZWNsYXJpbmdUeXBlKSArICcuJyArIHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQkKLQkJcmV0dXJuIHR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoJy4nKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGdpdmVuIHR5cGUgdXNpbmcgJy4nIGFzIHNlcGFyYXRvcnMuCi0JICogVGhpcyBpcyBhIHJlcGxhY2UgZm9yIElUeXBlLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUKLQkgKiB3aGljaCB1c2VzICckJyBhcyBzZXBhcmF0b3JzLiBBcyAnJCcgaXMgYWxzbyBhIHZhbGlkIGNoYXJhY3RlciBpbiBhbiBpZAotCSAqIHRoaXMgaXMgYW1iaWd1b3VzLiBKYXZhQ29yZSBQUjogMUdDRlVOVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZS5pc0JpbmFyeSgpICYmICF0eXBlLmlzQW5vbnltb3VzKCkpIHsKLQkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRGdWxseVF1YWxpZmllZE5hbWUoZGVjbGFyaW5nVHlwZSkgKyAnLicgKyB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0JCQotCQlyZXR1cm4gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSB0eXBlJ3MgY29udGFpbmVyLiAocGFja2FnZSBuYW1lIG9yIGVuY2xvc2luZyB0eXBlIG5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZUNvbnRhaW5lck5hbWUoSVR5cGUgdHlwZSkgewotCQlJVHlwZSBvdXRlclR5cGU9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQlpZiAob3V0ZXJUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRGdWxseVF1YWxpZmllZE5hbWUob3V0ZXJUeXBlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHR3byBuYW1lcy4gVXNlcyBhIGRvdCBmb3Igc2VwYXJhdGlvbi4KLQkgKiBCb3RoIHN0cmluZ3MgY2FuIGJlIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdGVuYXRlTmFtZShTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChuYW1lMSAhPSBudWxsICYmIG5hbWUxLmxlbmd0aCgpID4gMCkgewotCQkJYnVmLmFwcGVuZChuYW1lMSk7Ci0JCX0KLQkJaWYgKG5hbWUyICE9IG51bGwgJiYgbmFtZTIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoJy4nKTsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQobmFtZTIpOwotCQl9CQkKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBDb25jYXRlbmF0ZXMgdHdvIG5hbWVzLiBVc2VzIGEgZG90IGZvciBzZXBhcmF0aW9uLgotCSAqIEJvdGggc3RyaW5ncyBjYW4gYmUgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0ZW5hdGVOYW1lKGNoYXJbXSBuYW1lMSwgY2hhcltdIG5hbWUyKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWUxICE9IG51bGwgJiYgbmFtZTEubGVuZ3RoID4gMCkgewotCQkJYnVmLmFwcGVuZChuYW1lMSk7Ci0JCX0KLQkJaWYgKG5hbWUyICE9IG51bGwgJiYgbmFtZTIubGVuZ3RoID4gMCkgewotCQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCQlidWYuYXBwZW5kKCcuJyk7Ci0JCQl9Ci0JCQlidWYuYXBwZW5kKG5hbWUyKTsKLQkJfQkJCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9CQotCQotCS8qKgotCSAqIEV2YWx1YXRlcyBpZiBhIG1lbWJlciAocG9zc2libGUgZnJvbSBhbm90aGVyIHBhY2thZ2UpIGlzIHZpc2libGUgZnJvbQotCSAqIGVsZW1lbnRzIGluIGEgcGFja2FnZS4KLQkgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gdGVzdCB0aGUgdmlzaWJpbGl0eSBmb3IKLQkgKiBAcGFyYW0gcGFjayBUaGUgcGFja2FnZSBpbiBmb2N1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Zpc2libGUoSU1lbWJlciBtZW1iZXIsIElQYWNrYWdlRnJhZ21lbnQgcGFjaykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlpbnQgdHlwZT0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWlmICAodHlwZSA9PSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgfHwgICh0eXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QgJiYgbWVtYmVyLmdldEVsZW1lbnROYW1lKCkuc3RhcnRzV2l0aCgiPCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWludCBvdGhlcmZsYWdzPSBtZW1iZXIuZ2V0RmxhZ3MoKTsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZT0gbWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJaWYgKEZsYWdzLmlzUHVibGljKG90aGVyZmxhZ3MpIHx8IChkZWNsYXJpbmdUeXBlICE9IG51bGwgJiYgaXNJbnRlcmZhY2VPckFubm90YXRpb24oZGVjbGFyaW5nVHlwZSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChGbGFncy5pc1ByaXZhdGUob3RoZXJmbGFncykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0JCQotCQlJUGFja2FnZUZyYWdtZW50IG90aGVycGFjaz0gKElQYWNrYWdlRnJhZ21lbnQpIG1lbWJlci5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCk7Ci0JCXJldHVybiAocGFjayAhPSBudWxsICYmIG90aGVycGFjayAhPSBudWxsICYmIGlzU2FtZVBhY2thZ2UocGFjaywgb3RoZXJwYWNrKSk7Ci0JfQotCQotCS8qKgotCSAqIEV2YWx1YXRlcyBpZiBhIG1lbWJlciBpbiB0aGUgZm9jdXMnIGVsZW1lbnQgaGllcmFyY2h5IGlzIHZpc2libGUgZnJvbQotCSAqIGVsZW1lbnRzIGluIGEgcGFja2FnZS4KLQkgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gdGVzdCB0aGUgdmlzaWJpbGl0eSBmb3IKLQkgKiBAcGFyYW0gcGFjayBUaGUgcGFja2FnZSBvZiB0aGUgZm9jdXMgZWxlbWVudCBmb2N1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Zpc2libGVJbkhpZXJhcmNoeShJTWVtYmVyIG1lbWJlciwgSVBhY2thZ2VGcmFnbWVudCBwYWNrKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaW50IHR5cGU9IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpOwotCQlpZiAgKHR5cGUgPT0gSUphdmFFbGVtZW50LklOSVRJQUxJWkVSIHx8ICAodHlwZSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EICYmIG1lbWJlci5nZXRFbGVtZW50TmFtZSgpLnN0YXJ0c1dpdGgoIjwiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpbnQgb3RoZXJmbGFncz0gbWVtYmVyLmdldEZsYWdzKCk7Ci0JCQotCQlJVHlwZSBkZWNsYXJpbmdUeXBlPSBtZW1iZXIuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQlpZiAoRmxhZ3MuaXNQdWJsaWMob3RoZXJmbGFncykgfHwgRmxhZ3MuaXNQcm90ZWN0ZWQob3RoZXJmbGFncykgfHwgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCAmJiBpc0ludGVyZmFjZU9yQW5ub3RhdGlvbihkZWNsYXJpbmdUeXBlKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShvdGhlcmZsYWdzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnQgb3RoZXJwYWNrPSAoSVBhY2thZ2VGcmFnbWVudCkgbWVtYmVyLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKLQkJcmV0dXJuIChwYWNrICE9IG51bGwgJiYgcGFjay5lcXVhbHMob3RoZXJwYWNrKSk7Ci0JfQotCQkJCi0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+LiBJZiB0aGUgZ2l2ZW4KLQkgKiBlbGVtZW50IGlzIGFscmVhZHkgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIHRoZSBlbGVtZW50IGl0c2VsZiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZHMgYSBtZXRob2QgaW4gYSB0eXBlLgotCSAqIFRoaXMgc2VhcmNoZXMgZm9yIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlLiBQYXJhbWV0ZXIgdHlwZXMgYXJlIG9ubHkKLQkgKiBjb21wYXJlZCBieSB0aGUgc2ltcGxlIG5hbWUsIG5vIHJlc29sdmluZyBmb3IgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgaXMgZG9uZS4KLQkgKiBDb25zdHJ1Y3RvcnMgYXJlIG9ubHkgY29tcGFyZWQgYnkgcGFyYW1ldGVycywgbm90IHRoZSBuYW1lLgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gZmluZAotCSAqIEBwYXJhbSBwYXJhbVR5cGVzIFRoZSB0eXBlIHNpZ25hdHVyZXMgb2YgdGhlIHBhcmFtZXRlcnMgZS5nLiA8Y29kZT57IlFTdHJpbmc7IiwiSSJ9PC9jb2RlPgotCSAqIEBwYXJhbSBpc0NvbnN0cnVjdG9yIElmIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3RvcgotCSAqIEByZXR1cm4gVGhlIGZpcnN0IGZvdW5kIG1ldGhvZCBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgbm90aGluZyBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZCBmaW5kTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbVR5cGVzLCBib29sZWFuIGlzQ29uc3RydWN0b3IsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kW10gbWV0aG9kcz0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNTYW1lTWV0aG9kU2lnbmF0dXJlKG5hbWUsIHBhcmFtVHlwZXMsIGlzQ29uc3RydWN0b3IsIG1ldGhvZHNbaV0pKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZHNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNmaW5kTWV0aG9kSW5IaWVyYXJjaHkoSVR5cGVIaWVyYXJjaHksIElUeXBlLCBTdHJpbmcsIFN0cmluZ1tdLCBib29sZWFuKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2QgZmluZE1ldGhvZEltcGxlbWVudGF0aW9uSW5IaWVyYXJjaHkoSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1UeXBlcywgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRNZXRob2RJbkhpZXJhcmNoeShoaWVyYXJjaHksIHR5cGUsIG5hbWUsIHBhcmFtVHlwZXMsIGlzQ29uc3RydWN0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyBhIG1ldGhvZCBpbiBhIHR5cGUgYW5kIGFsbCBpdHMgc3VwZXIgdHlwZXMuIFRoZSBzdXBlciBjbGFzcyBoaWVyYXJjaHkgaXMgc2VhcmNoZWQgZmlyc3QsIHRoZW4gdGhlIHN1cGVyIGludGVyZmFjZXMuCi0JICogVGhpcyBzZWFyY2hlcyBmb3IgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUuIFBhcmFtZXRlciB0eXBlcyBhcmUgb25seQotCSAqIGNvbXBhcmVkIGJ5IHRoZSBzaW1wbGUgbmFtZSwgbm8gcmVzb2x2aW5nIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBpcyBkb25lLgotCSAqIENvbnN0cnVjdG9ycyBhcmUgb25seSBjb21wYXJlZCBieSBwYXJhbWV0ZXJzLCBub3QgdGhlIG5hbWUuCi0JICogTk9URTogRm9yIGZpbmRpbmcgb3ZlcnJpZGRlbiBtZXRob2RzIG9yIGZvciBmaW5kaW5nIHRoZSBkZWNsYXJpbmcgbWV0aG9kLCB1c2Uge0BsaW5rIE1ldGhvZE92ZXJyaWRlVGVzdGVyfQotCSAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBjb250YWluaW5nIHRoZSB0eXBlCi0JICogCUBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbQotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gZmluZAotCSAqIEBwYXJhbSBwYXJhbVR5cGVzIFRoZSB0eXBlIHNpZ25hdHVyZXMgb2YgdGhlIHBhcmFtZXRlcnMgZS5nLiA8Y29kZT57IlFTdHJpbmc7IiwiSSJ9PC9jb2RlPgotCSAqIEBwYXJhbSBpc0NvbnN0cnVjdG9yIElmIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3RvcgotCSAqIEByZXR1cm4gVGhlIGZpcnN0IGZvdW5kIG1ldGhvZCBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgbm90aGluZyBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZCBmaW5kTWV0aG9kSW5IaWVyYXJjaHkoSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1UeXBlcywgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSU1ldGhvZCBtZXRob2Q9IGZpbmRNZXRob2QobmFtZSwgcGFyYW1UeXBlcywgaXNDb25zdHJ1Y3RvciwgdHlwZSk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQlJVHlwZSBzdXBlckNsYXNzPSBoaWVyYXJjaHkuZ2V0U3VwZXJjbGFzcyh0eXBlKTsKLQkJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJSU1ldGhvZCByZXM9ICBmaW5kTWV0aG9kSW5IaWVyYXJjaHkoaGllcmFyY2h5LCBzdXBlckNsYXNzLCBuYW1lLCBwYXJhbVR5cGVzLCBpc0NvbnN0cnVjdG9yKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpc0NvbnN0cnVjdG9yKSB7Ci0JCQlJVHlwZVtdIHN1cGVySW50ZXJmYWNlcz0gaGllcmFyY2h5LmdldFN1cGVySW50ZXJmYWNlcyh0eXBlKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWV0aG9kIHJlcz0gZmluZE1ldGhvZEluSGllcmFyY2h5KGhpZXJhcmNoeSwgc3VwZXJJbnRlcmZhY2VzW2ldLCBuYW1lLCBwYXJhbVR5cGVzLCBmYWxzZSk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiByZXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtZXRob2Q7CQkKLQl9Ci0JCQotCQotCS8qKgotCSAqIFRlc3RzIGlmIGEgbWV0aG9kIGVxdWFscyB0byB0aGUgZ2l2ZW4gc2lnbmF0dXJlLgotCSAqIFBhcmFtZXRlciB0eXBlcyBhcmUgb25seSBjb21wYXJlZCBieSB0aGUgc2ltcGxlIG5hbWUsIG5vIHJlc29sdmluZyBmb3IKLQkgKiB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBpcyBkb25lLiBDb25zdHJ1Y3RvcnMgYXJlIG9ubHkgY29tcGFyZWQgYnkKLQkgKiBwYXJhbWV0ZXJzLCBub3QgdGhlIG5hbWUuCi0JICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbWV0aG9kCi0JICogQHBhcmFtIHBhcmFtVHlwZXMgVGhlIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgcGFyYW1ldGVycyBlLmcuIDxjb2RlPnsiUVN0cmluZzsiLCJJIn08L2NvZGU+Ci0JICogQHBhcmFtIGlzQ29uc3RydWN0b3IgU3BlY2lmaWVzIGlmIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3RvcgotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGhhcyB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVyIHR5cGVzIGFuZCBjb25zdHJ1Y3RvciBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbVR5cGVzLCBib29sZWFuIGlzQ29uc3RydWN0b3IsIElNZXRob2QgY3VycikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0NvbnN0cnVjdG9yIHx8IG5hbWUuZXF1YWxzKGN1cnIuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCWlmIChpc0NvbnN0cnVjdG9yID09IGN1cnIuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJU3RyaW5nW10gY3VyclBhcmFtVHlwZXM9IGN1cnIuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQlpZiAocGFyYW1UeXBlcy5sZW5ndGggPT0gY3VyclBhcmFtVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgdDE9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbVR5cGVzW2ldKSk7Ci0JCQkJCQlTdHJpbmcgdDI9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhjdXJyUGFyYW1UeXBlc1tpXSkpOwotCQkJCQkJaWYgKCF0MS5lcXVhbHModDIpKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgaWYgdHdvIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+cyByZXByZXNlbnQgdGhlIHNhbWUgbG9naWNhbCBqYXZhIHBhY2thZ2UuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFja2FnZSBmcmFnbWVudHMnIG5hbWVzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lUGFja2FnZShJUGFja2FnZUZyYWdtZW50IHBhY2sxLCBJUGFja2FnZUZyYWdtZW50IHBhY2syKSB7Ci0JCXJldHVybiBwYWNrMS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWNrMi5nZXRFbGVtZW50TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaGFzIGEgdmFsaWQgbWFpbiBtZXRob2Qgb3Igbm90LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNYWluTWV0aG9kKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kW10gbWV0aG9kcz0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWV0aG9kc1tpXS5pc01haW5NZXRob2QoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBmaWVsZCBpcyBib29sZWFuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jvb2xlYW4oSUZpZWxkIGZpZWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uewotCQlyZXR1cm4gZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmVxdWFscyhTaWduYXR1cmUuU0lHX0JPT0xFQU4pOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgdHlwZSBpcyBhbiBpbnRlcmZhY2Ugb3IgYW4gYW5ub3RhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZU9yQW5ub3RhdGlvbihJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJlc29sdmVzIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWNsYXJpbmcgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmVHlwZVNpZyB0aGUgdHlwZSBuYW1lIGluIHNpZ25hdHVyZSBub3RhdGlvbiAoZm9yIGV4YW1wbGUgJ1FWZWN0b3InKSB0aGlzIGNhbiBhbHNvIGJlIGFuIGFycmF5IHR5cGUsIGJ1dCBkaW1lbnNpb25zIHdpbGwgYmUgaWdub3JlZC4KLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZSB0aGUgY29udGV4dCBmb3IgcmVzb2x2aW5nICh0eXBlIHdoZXJlIHRoZSByZWZlcmVuY2Ugd2FzIG1hZGUgaW4pCi0JICogQHJldHVybiByZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9yIGJ1aWxkLWluLXR5cGUgbmFtZS4gaWYgYSB1bnJlc29sdmVkIHR5cGUgY291bGRuJ3QgYmUgcmVzb2x2ZWQgbnVsbCBpcyByZXR1cm5lZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc29sdmVkVHlwZU5hbWUoU3RyaW5nIHJlZlR5cGVTaWcsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpbnQgYXJyYXlDb3VudD0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQocmVmVHlwZVNpZyk7Ci0JCWNoYXIgdHlwZT0gcmVmVHlwZVNpZy5jaGFyQXQoYXJyYXlDb3VudCk7Ci0JCWlmICh0eXBlID09IFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQpIHsKLQkJCVN0cmluZyBuYW1lPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGJyYWNrZXQ9IHJlZlR5cGVTaWcuaW5kZXhPZihTaWduYXR1cmUuQ19HRU5FUklDX1NUQVJULCBhcnJheUNvdW50ICsgMSk7Ci0JCQlpZiAoYnJhY2tldCA+IDApCi0JCQkJbmFtZT0gcmVmVHlwZVNpZy5zdWJzdHJpbmcoYXJyYXlDb3VudCArIDEsIGJyYWNrZXQpOwotCQkJZWxzZSB7Ci0JCQkJaW50IHNlbWk9IHJlZlR5cGVTaWcuaW5kZXhPZihTaWduYXR1cmUuQ19TRU1JQ09MT04sIGFycmF5Q291bnQgKyAxKTsKLQkJCQlpZiAoc2VtaSA9PSAtMSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCW5hbWU9IHJlZlR5cGVTaWcuc3Vic3RyaW5nKGFycmF5Q291bnQgKyAxLCBzZW1pKTsKLQkJCX0KLQkJCVN0cmluZ1tdW10gcmVzb2x2ZWROYW1lcz0gZGVjbGFyaW5nVHlwZS5yZXNvbHZlVHlwZShuYW1lKTsKLQkJCWlmIChyZXNvbHZlZE5hbWVzICE9IG51bGwgJiYgcmVzb2x2ZWROYW1lcy5sZW5ndGggPiAwKSB7Ci0JCQkJcmV0dXJuIEphdmFNb2RlbFV0aWwuY29uY2F0ZW5hdGVOYW1lKHJlc29sdmVkTmFtZXNbMF1bMF0sIHJlc29sdmVkTmFtZXNbMF1bMV0pOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gU2lnbmF0dXJlLnRvU3RyaW5nKHJlZlR5cGVTaWcuc3Vic3RyaW5nKGFycmF5Q291bnQpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGlmIGEgQ1UgY2FuIGJlIGVkaXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFZGl0YWJsZShJQ29tcGlsYXRpb25Vbml0IGN1KSAgewotCQlBc3NlcnQuaXNOb3ROdWxsKGN1KTsKLQkJSVJlc291cmNlIHJlc291cmNlPSBjdS5nZXRQcmltYXJ5KCkuZ2V0UmVzb3VyY2UoKTsKLQkJcmV0dXJuIChyZXNvdXJjZS5leGlzdHMoKSAmJiAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBpZiB0aGUgZ2l2ZW4gbWVtYmVyLiBJZiB0aGUgbWVtYmVyIGlzIGFscmVhZHkKLQkgKiBhbiBvcmlnaW5hbCB0aGUgaW5wdXQgaXMgcmV0dXJuZWQuIFRoZSByZXR1cm5lZCBtZW1iZXIgbWlnaHQgbm90IGV4aXN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBieSBJTWVtYmVyI2dldFByaW1hcnlFbGVtZW50KCkgaWYgPGNvZGU+bWVtYmVyPC9jb2RlPiBpcyBub3QgcGFydAotCSAqIG9mIGEgc2hhcmVkIHdvcmtpbmcgY29weSBvd25lci4gQWxzbyBoYXZlIGEgbG9vayBhdCBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU2OAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWJlciB0b09yaWdpbmFsKElNZW1iZXIgbWVtYmVyKSB7Ci0JCWlmIChtZW1iZXIgaW5zdGFuY2VvZiBJTWV0aG9kKQotCQkJcmV0dXJuIHRvT3JpZ2luYWxNZXRob2QoKElNZXRob2QpbWVtYmVyKTsKLQotCQkvLyBUT0RPOiByZW1vdmUgdG9PcmlnaW5hbE1ldGhvZChJTWV0aG9kKQotCi0JCXJldHVybiAoSU1lbWJlcikgbWVtYmVyLmdldFByaW1hcnlFbGVtZW50KCk7Ci0JCS8qSUNvbXBpbGF0aW9uVW5pdCBjdT0gbWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm4gKElNZW1iZXIpY3UuZ2V0T3JpZ2luYWwobWVtYmVyKTsKLQkJcmV0dXJuIG1lbWJlcjsqLwotCX0KLQkKLQkvKgotCSAqIFRPRE8gcmVtb3ZlIGlmIHRvT3JpZ2luYWwoSU1lbWJlcikgY2FuIGJlIHJlbW92ZWQKLQkgKiBYWFggd29ya2Fyb3VuZCBmb3IgYnVnIDE4NTY4Ci0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NjgKLQkgKiB0byBiZSByZW1vdmVkIG9uY2UgdGhlIGJ1ZyBpcyBmaXhlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElNZXRob2QgdG9PcmlnaW5hbE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGlzUHJpbWFyeShjdSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdHJ5ewotCQkJLy91c2UgdGhlIHdvcmthcm91bmQgb25seSBpZiBuZWVkZWQJCi0JCQlpZiAoISBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpKSkKLQkJCQlyZXR1cm4gKElNZXRob2QpIG1ldGhvZC5nZXRQcmltYXJ5RWxlbWVudCgpOwotCQkJCi0JCQlJVHlwZSBvcmlnaW5hbFR5cGUgPSAoSVR5cGUpIHRvT3JpZ2luYWwobWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0JCQlJTWV0aG9kW10gbWV0aG9kcyA9IG9yaWdpbmFsVHlwZS5maW5kTWV0aG9kcyhtZXRob2QpOwotCQkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gbWV0aG9kLmlzQ29uc3RydWN0b3IoKTsKLQkJCWZvciAoaW50IGk9MDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCSAgaWYgKG1ldGhvZHNbaV0uaXNDb25zdHJ1Y3RvcigpID09IGlzQ29uc3RydWN0b3IpIAotCQkJCXJldHVybiBtZXRob2RzW2ldOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBudWxsOwotCQl9CQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIGN1IGlzIGEgcHJpbWFyeSBjdSAob3JpZ2luYWwgb3Igc2hhcmVkIHdvcmtpbmcgY29weSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltYXJ5KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIGN1LmdldE93bmVyKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjUzCi0JICogCi0JICogUmVjb25jaWxpbmcgaGFwcGVucyBpbiBhIHNlcGFyYXRlIHRocmVhZC4gVGhpcyBjYW4gY2F1c2UgYSBzaXR1YXRpb24gd2hlcmUgdGhlCi0JICogSmF2YSBlbGVtZW50IGdldHMgZGlzcG9zZWQgYWZ0ZXIgYW4gZXhpc3RzIHRlc3QgaGFzIGJlZW4gZG9uZS4gU28gd2Ugc2hvdWxkIG5vdAotCSAqIGxvZyBub3QgcHJlc2VudCBleGNlcHRpb25zIHdoZW4gdGhleSBoYXBwZW4gaW4gd29ya2luZyBjb3BpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhjZXB0aW9uVG9CZUxvZ2dlZChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pKQotCQkJcmV0dXJuIHRydWU7Ci0JCUphdmFNb2RlbEV4Y2VwdGlvbiBqZT0gKEphdmFNb2RlbEV4Y2VwdGlvbilleGNlcHRpb247Ci0JCWlmICghamUuaXNEb2VzTm90RXhpc3QoKSkKLQkJCXJldHVybiB0cnVlOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gamUuZ2V0SmF2YU1vZGVsU3RhdHVzKCkuZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGEgY29tcGlsYXRpb24gdW5pdCBkb24ndCBsb2cKLQkJCS8vIGRvZXMgbm90IGV4aXN0IGV4Y2VwdGlvbnMuIFNlZSBidWcgCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU4OTQKLQkJCS8vIGZvciBtb3JlIGRldGFpbHMKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpCi0JCQkJY29udGludWU7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQ9IChJQ29tcGlsYXRpb25Vbml0KWVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpOwotCQkJaWYgKHVuaXQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmICghdW5pdC5pc1dvcmtpbmdDb3B5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwZXJUeXBlKElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSVR5cGUgcG9zc2libGVTdXBlclR5cGUsIElUeXBlIHR5cGUpIHsKLQkJLy8gZmlsZWQgYnVnIDExMjYzNSB0byBhZGQgdGhpcyBtZXRob2QgdG8gSVR5cGVIaWVyYXJjaHkKLQkJSVR5cGUgc3VwZXJDbGFzcz0gaGllcmFyY2h5LmdldFN1cGVyY2xhc3ModHlwZSk7Ci0JCWlmIChzdXBlckNsYXNzICE9IG51bGwgJiYgKHBvc3NpYmxlU3VwZXJUeXBlLmVxdWFscyhzdXBlckNsYXNzKSB8fCBpc1N1cGVyVHlwZShoaWVyYXJjaHksIHBvc3NpYmxlU3VwZXJUeXBlLCBzdXBlckNsYXNzKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChGbGFncy5pc0ludGVyZmFjZShoaWVyYXJjaHkuZ2V0Q2FjaGVkRmxhZ3MocG9zc2libGVTdXBlclR5cGUpKSkgewotCQkJSVR5cGVbXSBzdXBlckludGVyZmFjZXM9IGhpZXJhcmNoeS5nZXRTdXBlckludGVyZmFjZXModHlwZSk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVR5cGUgY3Vycj0gc3VwZXJJbnRlcmZhY2VzW2ldOwotCQkJCWlmIChwb3NzaWJsZVN1cGVyVHlwZS5lcXVhbHMoY3VycikgfHwgaXNTdXBlclR5cGUoaGllcmFyY2h5LCBwb3NzaWJsZVN1cGVyVHlwZSwgY3VycikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWRQYXRoKElQYXRoIHJlc291cmNlUGF0aCwgSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJucykgewotCQljaGFyW10gcGF0aCA9IHJlc291cmNlUGF0aC50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBleGNsdXNpb25QYXR0ZXJucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhcltdIHBhdHRlcm49IGV4Y2x1c2lvblBhdHRlcm5zW2ldLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQkJCWlmIChDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaChwYXR0ZXJuLCBwYXRoLCB0cnVlLCAnLycpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoIG1hdGNoZXMgb25lIG9mIHRoZSBleGNsdXNpb24KLQkgKiBwYXR0ZXJucy4KLQkgKiAKLQkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNnZXRFeGNsdXNpb25QYXR0ZXJucwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKElQYXRoIHJlc291cmNlUGF0aCwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMpIHsKLQkJaWYgKGV4Y2x1c2lvblBhdHRlcm5zID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJY2hhcltdIHBhdGggPSByZXNvdXJjZVBhdGgudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZXhjbHVzaW9uUGF0dGVybnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlpZiAoQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goZXhjbHVzaW9uUGF0dGVybnNbaV0sIHBhdGgsIHRydWUsICcvJykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQkKLQotCS8qKgotCSAqIEZvcmNlIGEgcmVjb25jaWxlIG9mIGEgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBAcGFyYW0gdW5pdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWNvbmNpbGUoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdW5pdC5yZWNvbmNpbGUoCi0JCQkJSUNvbXBpbGF0aW9uVW5pdC5OT19BU1QsIAotCQkJCWZhbHNlIC8qIGRvbid0IGZvcmNlIHByb2JsZW0gZGV0ZWN0aW9uICovLCAKLQkJCQludWxsIC8qIHVzZSBwcmltYXJ5IG93bmVyICovLCAKLQkJCQludWxsIC8qIG5vIHByb2dyZXNzIG1vbml0b3IgKi8pOwotCX0KLQkKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRoYXQgdGVzdHMgaWYgYW4gY2xhc3NwYXRoIGVudHJ5IGNhbiBiZSBmb3VuZCBpbiBhCi0JICogY29udGFpbmVyLiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBpZiB0aGUgZW50cnkgY2FuIG5vdCBiZSBmb3VuZAotCSAqIG9yIGlmIHRoZSBjb250YWluZXIgZG9lcyBub3QgYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIG9mIHNvdXJjZQotCSAqIGF0dGFjaG1lbnRzCi0JICogQHBhcmFtIGpwcm9qZWN0IFRoZSBjb250YWluZXIncyBwYXJlbnQgcHJvamVjdAotCSAqIEBwYXJhbSBjb250YWluZXJQYXRoIFRoZSBwYXRoIG9mIHRoZSBjb250YWluZXIKLQkgKiBAcGFyYW0gbGliUGF0aCBUaGUgcGF0aCBvZiB0aGUgbGlicmFyeSB0byBiZSBmb3VuZAotCSAqIEByZXR1cm4gSUNsYXNzcGF0aEVudHJ5IEEgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIGNvbnRhaW5lciBvZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250YWluZXIgY2FuIG5vdCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRDbGFzc3BhdGhFbnRyeVRvRWRpdChJSmF2YVByb2plY3QganByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgsIElQYXRoIGxpYlBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcj0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGpwcm9qZWN0KTsKLQkJQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKSk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBpbml0aWFsaXplciAhPSBudWxsICYmIGluaXRpYWxpemVyLmNhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqcHJvamVjdCkpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBjdXJyPSBlbnRyaWVzW2ldOwotCQkJCUlDbGFzc3BhdGhFbnRyeSByZXNvbHZlZD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShjdXJyKTsKLQkJCQlpZiAocmVzb2x2ZWQgIT0gbnVsbCAmJiBsaWJQYXRoLmVxdWFscyhyZXNvbHZlZC5nZXRQYXRoKCkpKSB7Ci0JCQkJCXJldHVybiBjdXJyOyAvLyByZXR1cm4gdGhlIHJlYWwgZW50cnkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIGF0dGFjaG1lbnQgbm90IHBvc3NpYmxlCi0JfQotCQotCS8qKgotCSAqIEdldCBhbGwgY29tcGlsYXRpb24gdW5pdHMgb2YgYSBzZWxlY3Rpb24uCi0JICogQHBhcmFtIGphdmFFbGVtZW50cyB0aGUgc2VsZWN0ZWQgamF2YSBlbGVtZW50cwotCSAqIEByZXR1cm4gYWxsIGNvbXBpbGF0aW9uIHVuaXRzIGNvbnRhaW5pbmcgYW5kIGNvbnRhaW5lZCBpbiBlbGVtZW50cyBmcm9tIGphdmFFbGVtZW50cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0W10gZ2V0QWxsQ29tcGlsYXRpb25Vbml0cyhJSmF2YUVsZW1lbnRbXSBqYXZhRWxlbWVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNoU2V0IHJlc3VsdD0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGphdmFFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJYWRkQWxsQ3VzKHJlc3VsdCwgamF2YUVsZW1lbnRzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb21waWxhdGlvblVuaXRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQWxsQ3VzKEhhc2hTZXQvKjxJQ29tcGlsYXRpb25Vbml0PiovIGNvbGxlY3RvciwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0PSAoSUphdmFQcm9qZWN0KSBqYXZhRWxlbWVudDsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWZvciAoaW50IGk9IDA7IGkgPCBwYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7IGkrKykKLQkJCQkJYWRkQWxsQ3VzKGNvbGxlY3RvciwgcGFja2FnZUZyYWdtZW50Um9vdHNbaV0pOwotCQkJCXJldHVybjsKLQkJCi0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdD0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBqYXZhRWxlbWVudDsKLQkJCQlpZiAocGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQkJCXJldHVybjsKLQkJCQlJSmF2YUVsZW1lbnRbXSBwYWNrYWdlRnJhZ21lbnRzPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaj0gMDsgaiA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBqKyspCi0JCQkJCWFkZEFsbEN1cyhjb2xsZWN0b3IsIHBhY2thZ2VGcmFnbWVudHNbal0pOwotCQkJCXJldHVybjsKLQkJCi0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50PSAoSVBhY2thZ2VGcmFnbWVudCkgamF2YUVsZW1lbnQ7Ci0JCQkJY29sbGVjdG9yLmFkZEFsbChBcnJheXMuYXNMaXN0KHBhY2thZ2VGcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXRzKCkpKTsKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6Ci0JCQkJY29sbGVjdG9yLmFkZChqYXZhRWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJCQotCQkJZGVmYXVsdDoKLQkJCQlJSmF2YUVsZW1lbnQgY3U9IGphdmFFbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKTsKLQkJCQlpZiAoY3UgIT0gbnVsbCkKLQkJCQkJY29sbGVjdG9yLmFkZChjdSk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXRzIGFsbCBjb21wbGlhbmNlIHNldHRpbmdzIGluIHRoZSBnaXZlbiBtYXAgdG8gNS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldDUwQ29tcGlsYW5jZU9wdGlvbnMoTWFwIG1hcCkgewotCQlzZXRDb21waWxhbmNlT3B0aW9ucyhtYXAsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGFuY2VPcHRpb25zKE1hcCBtYXAsIFN0cmluZyBjb21wbGlhbmNlKSB7Ci0JCWlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNi5lcXVhbHMoY29tcGxpYW5jZSkpIHsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzYpOwotCQkJbWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV82KTsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIEphdmFDb3JlLlZFUlNJT05fMV82KTsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SKTsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUik7Ci0JCX0gZWxzZSBpZiAoSmF2YUNvcmUuVkVSU0lPTl8xXzUuZXF1YWxzKGNvbXBsaWFuY2UpKSB7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUik7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0VOVU1fSURFTlRJRklFUiwgSmF2YUNvcmUuRVJST1IpOwotCQl9IGVsc2UgaWYgKEphdmFDb3JlLlZFUlNJT05fMV80LmVxdWFscyhjb21wbGlhbmNlKSkgewotCQkJbWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzMpOwotCQkJbWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzIpOwotCQkJbWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9QQl9BU1NFUlRfSURFTlRJRklFUiwgSmF2YUNvcmUuV0FSTklORyk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0VOVU1fSURFTlRJRklFUiwgSmF2YUNvcmUuV0FSTklORyk7Ci0JCX0gZWxzZSBpZiAoSmF2YUNvcmUuVkVSU0lPTl8xXzMuZXF1YWxzKGNvbXBsaWFuY2UpKSB7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV8zKTsKLQkJCW1hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfMyk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfMSk7Ci0JCQltYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5JR05PUkUpOwotCQkJbWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9QQl9FTlVNX0lERU5USUZJRVIsIEphdmFDb3JlLklHTk9SRSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjb21wbGlhbmNlOiAiICsgY29tcGxpYW5jZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHJldHVybnMgaWYgdmVyc2lvbiAxIGlzIGxlc3MgdGhhbiB2ZXJzaW9uIDIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbkxlc3NUaGFuKFN0cmluZyB2ZXJzaW9uMSwgU3RyaW5nIHZlcnNpb24yKSB7Ci0JCXJldHVybiB2ZXJzaW9uMS5jb21wYXJlVG8odmVyc2lvbjIpIDwgMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzNTBPckhpZ2hlcihTdHJpbmcgY29tcGxpYW5jZSkgewotCQlyZXR1cm4gIWlzVmVyc2lvbkxlc3NUaGFuKGNvbXBsaWFuY2UsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzNTBPckhpZ2hlcihJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXM1ME9ySGlnaGVyKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzNTBPckhpZ2hlckpSRShJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVk1JbnN0YWxsIHZtSW5zdGFsbD0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKHByb2plY3QpOwotCQlpZiAoISh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gYXNzdW1lIDUuMC4KLQkJCi0JCVN0cmluZyBjb21wbGlhbmNlPSBnZXRDb21waWxlckNvbXBsaWFuY2UoKElWTUluc3RhbGwyKSB2bUluc3RhbGwsIG51bGwpOwotCQlpZiAoY29tcGxpYW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIGFzc3VtZSA1LjAKLQkJcmV0dXJuIGNvbXBsaWFuY2Uuc3RhcnRzV2l0aChKYXZhQ29yZS5WRVJTSU9OXzFfNSkgfHwgY29tcGxpYW5jZS5zdGFydHNXaXRoKEphdmFDb3JlLlZFUlNJT05fMV82KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJDb21wbGlhbmNlKElWTUluc3RhbGwyIHZNSW5zdGFsbCwgU3RyaW5nIGRlZmF1bHRDb21wbGlhbmNlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uPSB2TUluc3RhbGwuZ2V0SmF2YVZlcnNpb24oKTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmF1bHRDb21wbGlhbmNlOwotCQl9IGVsc2UgaWYgKHZlcnNpb24uc3RhcnRzV2l0aChKYXZhQ29yZS5WRVJTSU9OXzFfNikpIHsKLQkJCXJldHVybiBKYXZhQ29yZS5WRVJTSU9OXzFfNjsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uLnN0YXJ0c1dpdGgoSmF2YUNvcmUuVkVSU0lPTl8xXzUpKSB7Ci0JCQlyZXR1cm4gSmF2YUNvcmUuVkVSU0lPTl8xXzU7Ci0JCX0gZWxzZSBpZiAodmVyc2lvbi5zdGFydHNXaXRoKEphdmFDb3JlLlZFUlNJT05fMV80KSkgewotCQkJcmV0dXJuIEphdmFDb3JlLlZFUlNJT05fMV80OwotCQl9IGVsc2UgaWYgKHZlcnNpb24uc3RhcnRzV2l0aChKYXZhQ29yZS5WRVJTSU9OXzFfMykpIHsKLQkJCXJldHVybiBKYXZhQ29yZS5WRVJTSU9OXzFfMzsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uLnN0YXJ0c1dpdGgoSmF2YUNvcmUuVkVSU0lPTl8xXzIpKSB7Ci0JCQlyZXR1cm4gSmF2YUNvcmUuVkVSU0lPTl8xXzM7Ci0JCX0gZWxzZSBpZiAodmVyc2lvbi5zdGFydHNXaXRoKEphdmFDb3JlLlZFUlNJT05fMV8xKSkgewotCQkJcmV0dXJuIEphdmFDb3JlLlZFUlNJT05fMV8zOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q29tcGxpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIGEgbmV3IG5hbWUgZm9yIGEgY29tcGlsYXRpb24gdW5pdCwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIG5ldyBtYWluIHR5cGUuCi0JICogVGhpcyBxdWVyeSB0cmllcyB0byBtYWludGFpbiB0aGUgZXhpc3RpbmcgZXh0ZW5zaW9uIChlLmcuICIuamF2YSIpLgotCSAqIAotCSAqIEBwYXJhbSBjdSBhIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBAcGFyYW0gbmV3TWFpbk5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBjdSdzIG1haW4gdHlwZSAod2l0aG91dCBleHRlbnNpb24pCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0ICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZW5hbWVkQ1VOYW1lKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBuZXdNYWluTmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCWludCBpID0gb2xkTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaSAhPSAtMSkgewotCQkJcmV0dXJuIG5ld01haW5OYW1lICsgb2xkTmFtZS5zdWJzdHJpbmcoaSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3TWFpbk5hbWU7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltcGxpY2l0SW1wb3J0KFN0cmluZyBxdWFsaWZpZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKCJqYXZhLmxhbmciLmVxdWFscyhxdWFsaWZpZXIpKSB7ICAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlTdHJpbmcgcGFja2FnZU5hbWU9IGN1LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChxdWFsaWZpZXIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIHR5cGVOYW1lPSBKYXZhQ29yZS5yZW1vdmVKYXZhTGlrZUV4dGVuc2lvbihjdS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJU3RyaW5nIG1haW5UeXBlTmFtZT0gSmF2YU1vZGVsVXRpbC5jb25jYXRlbmF0ZU5hbWUocGFja2FnZU5hbWUsIHR5cGVOYW1lKTsKLQkJcmV0dXJuIHF1YWxpZmllci5lcXVhbHMobWFpblR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gZWxlbWVudCBjYW4gc2FmZWx5IGJlIGNhc3QgdG8gYW55IG9mCi0JICoge0BsaW5rIElQYXJlbnR9LCB7QGxpbmsgSU9wZW5hYmxlfSwge0BsaW5rIElTb3VyY2VSZWZlcmVuY2V9LCBvciB7QGxpbmsgSUNvZGVBc3Npc3R9LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgZWxlbWVudCBpcyBhbiB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gb3IgYW4ge0BsaW5rIElDbGFzc0ZpbGV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHlwZUNvbnRhaW5lclVuaXQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUwNAotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGdldFR5cGVDb250YWluZXJVbml0KElNZW1iZXIgbWVtYmVyKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ICE9IG51bGwpCi0JCQlyZXR1cm4gY3U7Ci0JCWVsc2UKLQkJCXJldHVybiBtZW1iZXIuZ2V0Q2xhc3NGaWxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9NZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmY2ZjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9NZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBNZXRob2QgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIAotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBuYW1lLiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250YWluaW5nIGNsYXNzIG5hbWUuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1ldGhvZCdzIHJldHVybiB0eXBlLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXR1cm4gdHlwZS4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgZm9yIHRoZSBtZXRob2QuCi0JICogCi0JICogPHA+Ci0JICogSWYgdGhlIG1ldGhvZCByZXR1cm4gdHlwZSBpcyA8Y29kZT52b2lkPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZAotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSBtZXRob2QgcmV0dXJuIHR5cGUgaXMgPGNvZGU+Ym9vbGVhbjwvY29kZT4sIHRoZW4gdGhpcyBtZXRob2QKLQkgKiByZXR1cm5zIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBGb3IgYW55IG90aGVyIHJldHVybiB0eXBlIHRoYXQgaXMgcHJpbWl0aXZlIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiA8Y29kZT4iMCI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWV0aG9kIHJldHVybiB0eXBlIGlzIG5vbi1wcmltaXRpdmUsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIDxjb2RlPiJudWxsIjwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHQgcmV0dXJuIHR5cGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmV0dXJuVmFsdWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgdHlwZXMgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQgc28gdGhpcyBtZXRob2QKLQkgKiBkZWNsYXJhdGlvbiBjYW4gYmUgcmVzb2x2ZWQuCi0JICogCi0JICogPHA+Ci0JICogVGhlIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieSB0aGVpciBmdWxseSBxdWFsaWZpZWQgbmFtZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBvZiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdHlwZXMgdG8KLQkgKiAgICAgICAgIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UmV0dXJuVHlwZUltcG9ydHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG1ldGhvZCdzIHBhcmFtZXRlcnMgaW4gYSBmb3JtYXQgdGhhdCBpcwotCSAqIGNvbnZlbmllbnQgZm9yIHVzYWdlIGluIGEgSmF2YWRvYyA8Yj5Ac2VlPC9iPiBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtc0ZvckphdmFkb2MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWV0aG9kJ3MgcGFyYW1ldGVycyBpbiBhIGZvcm1hdCB0aGF0IGlzCi0JICogY29udmVuaWVudCBmb3IgdXNhZ2UgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWV0aG9kJ3MgcGFyYW1ldGVycyBpbiBhIGZvcm1hdCB0aGF0IGlzCi0JICogY29udmVuaWVudCBmb3IgdXNhZ2UgaW4gYSBtZXRob2QgY2FsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGxpc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JDYWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBub24tcHJpbWl0aXZlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIKLQkgKiAgICAgICAgIHR5cGVzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVySW1wb3J0cygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhODg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1NPVVJDRV9GT0xERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9BQlNUUkFDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfRklOQUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX1BVQkxJQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuT1BFTl9JTl9FRElUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlFVQUxJRklFRF9DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgYW5kIGZvbGxvd3MgdGhlCi0gKiBJRGF0YU1vZGVsT3BlcmF0aW9uIGFuZCBEYXRhIE1vZGVsIFdpemFyZCBmcmFtZXdvcmtzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGlzIGRhdGEgbW9kZWwgcHJvdmlkZXIgZXh0ZW5kcyB0aGUgQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgdG8gZ2V0IHByb2plY3QgbmFtZQotICogYW5kIGFydGlmYWN0IGVkaXQgaW5mb3JtYXRpb24gdGhhdCBkdXJpbmcgdGhlIG9wZXJhdGlvbiwgdGhlIGFydGlmYWN0IGVkaXQgbW9kZWwgY2FuIGJlIHVzZWQgdG8KLSAqIHNhdmUgY2hhbmdlcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgaXMgdXNlZCB0byBzdG9yZSBhbGwgdGhlIGJhc2UgcHJvcGVydGllcyB3aGljaCB3b3VsZCBiZSBuZWVkZWQKLSAqIHRvIGdlbmVyYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgamF2YSBjbGFzcy4gVmFsaWRhdGlvbnMgZm9yIHRoZXNlIHByb3BlcnRpZXMgc3VjaCBhcyBjbGFzcyBuYW1lLAotICogcGFja2FnZSBuYW1lLCBzdXBlcmNsYXNzLCBhbmQgbW9kaWZpZXJzIGFyZSBhbHNvIHByb3ZpZGVkLgotICogCi0gKiBUaGUgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMgaXMgaW1wbGVtZW50ZWQgdG8gc3RvcmUgYWxsIG9mIHRoZSBwcm9wZXJ0eSBuYW1lcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQ2xpZW50cyBtdXN0IHN1YmNsYXNzIHRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciBhbmQgdGhlIHByb3BlcnRpZXMgaW50ZXJmYWNlIHRvIHVzZSBpdCBhbmQgdG8KLSAqIGNhY2hlIGFuZCBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBhdHRyaWJ1dGVzLiBUaGV5IHNob3VsZCBhbHNvIHByb3ZpZGUgdGhlaXIgb3duIHZhbGlkYXRpb24KLSAqIG1ldGhvZHMgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyB0aGV5IGFkZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gdmFsaWRhdGlvbi4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdAotCSAqIHJldHVybiBudWxsLiBJdCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBhcyBhIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gZm9sZGVyRnVsbFBhdGgKLQkgKiBAcmV0dXJuIElTdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGZvbGRlckZ1bGxQYXRoKSB7Ci0JCS8vIEVuc3VyZSB0aGF0IHRoZSBzb3VyY2UgZm9sZGVyIHBhdGggaXMgbm90IGVtcHR5Ci0JCWlmIChmb2xkZXJGdWxsUGF0aCA9PSBudWxsIHx8IGZvbGRlckZ1bGxQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05BTUVfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gRW5zdXJlIHRoYXQgdGhlIHNvdXJjZSBmb2xkZXIgcGF0aCBpcyBhYnNvbHV0ZQotCQllbHNlIGlmICghbmV3IFBhdGgoZm9sZGVyRnVsbFBhdGgpLmlzQWJzb2x1dGUoKSkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0FCU09MVVRFOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCS8vIEVuc3VyZSBwcm9qZWN0IGlzIG5vdCBjbG9zZWQKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0VYSVNUOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIEVuc3VyZSBwcm9qZWN0IGlzIGFjY2Vzc2libGUuCi0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0VYSVNUOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIEVuc3VyZSB0aGUgcHJvamVjdCBpcyBhIGphdmEgcHJvamVjdC4KLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfTk9UX0pBVkFfUFJPSkVDVDsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQkvLyBFbnN1cmUgdGhlIHNlbGVjdGVkIGZvbGRlciBpcyBhIHZhbGlkIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGNvbXBvbmVudAotCQlJRm9sZGVyIHNvdXJjZWZvbGRlciA9IGdldEphdmFTb3VyY2VGb2xkZXIoKTsKLQkJaWYgKHNvdXJjZWZvbGRlciA9PSBudWxsIHx8IChzb3VyY2Vmb2xkZXIgIT0gbnVsbCAmJiAhc291cmNlZm9sZGVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGZvbGRlckZ1bGxQYXRoKSkpKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX1NPVVJDRSwgbmV3IFN0cmluZ1tde2ZvbGRlckZ1bGxQYXRofSk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gVmFsaWQgc291cmNlIGlzIHNlbGVjdGVkCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biByZXRyaWV2YWwgb2YgYSBkZWZhdWx0IGphdmEgc291cmNlCi0JICogZm9sZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgaW4gdGhlIHByb2plY3QgZm9yIHRoZSBjb21wb25lbnQuCi0JICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLgotCSAqIAotCSAqIEByZXR1cm4gSUZvbGRlciBpbnN0YW5jZSBvZiBkZWZhdWx0IGphdmEgc291cmNlIGZvbGRlcgotCSAqLwotCXByb3RlY3RlZCBJRm9sZGVyIGdldERlZmF1bHRKYXZhU291cmNlRm9sZGVyKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlcyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCS8vIFRyeSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyCi0JCWlmIChzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChJRm9sZGVyKSBzb3VyY2VzWzBdLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZWlyIG93biBzcGVjaWFsaXplZCBkZWZhdWx0IFdUUCBvcGVyYXRpb24uIFRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24gdG8gY3JlYXRlIGEgbmV3IGphdmEgY2xhc3MuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBXVFBPcGVyYXRpb25EYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFdUUE9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTmV3SmF2YUNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBkYXRhIG1vZGVsJ3MgcHJvcGVydGllcyBhcyB2YWxpZCBiYXNlCi0JICogcHJvcGVydGllcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9GT0xERVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKQVZBX1BBQ0tBR0UpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDTEFTU19OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU1VQRVJDTEFTUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1PRElGSUVSX1BVQkxJQyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1PRElGSUVSX0FCU1RSQUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTU9ESUZJRVJfRklOQUwpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRFUkZBQ0VTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTUFJTl9NRVRIT0QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05TVFJVQ1RPUik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEFCU1RSQUNUX01FVEhPRFMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChPUEVOX0lOX0VESVRPUik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSkFWQV9TT1VSQ0VfRk9MREVSKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFFVQUxJRklFRF9DTEFTU19OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoR0VORVJBVEVfREQpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlaXIgb3duIHNwZWNpZmljIGRhdGEgbW9kZWwKLQkgKiBwcm9wZXJ0aWVzLiBUaGlzIGRlY2xhcmVzIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG5ldyBqYXZhIGNsYXNzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGFjY2VwdCBudWxsLiBJdCBtYXkgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIGRlZmF1bHQgb2JqZWN0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gR2V0IHRoZSBkZWZhdWx0IHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBwcm9qZWN0Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7Ci0JCQlJRm9sZGVyIHNvdXJjZUZvbGRlciA9IGdldERlZmF1bHRKYXZhU291cmNlRm9sZGVyKCk7Ci0JCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwgJiYgc291cmNlRm9sZGVyLmV4aXN0cygpKQotCQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVXNlIE9iamVjdCBhcyB0aGUgZGVmYXVsdCBzdXBlcmNsYXNzIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkCi0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1VQRVJDTEFTUykpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFVzZSBwdWJsaWMgYXMgZGVmYXVsdCB2aXNpYmlsaXR5Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTU9ESUZJRVJfUFVCTElDKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCS8vIEdlbmVyYXRlIGNvbnN0cnVjdG9ycyBmcm9tIHRoZSBzdXBlcmNsYXNzIGJ5IGRlZmF1bHQKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05TVFJVQ1RPUikpCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkvLyBHZW5lcmF0ZSB1bmltcGxlbWVudGVkIG1ldGhvZHMgZnJvbSBkZWNsYXJlZCBpbnRlcmZhY2VzIGJ5IGRlZmF1bHQKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBQlNUUkFDVF9NRVRIT0RTKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCS8vIE9wZW4gdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGluIHRoZSBlZGl0b3IgYnkgZGVmYXVsdAotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9QRU5fSU5fRURJVE9SKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVCkpCi0JCQlyZXR1cm4gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBVkFfU09VUkNFX0ZPTERFUikpCi0JCQlyZXR1cm4gZ2V0SmF2YVNvdXJjZUZvbGRlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UKSkKLQkJCXJldHVybiBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFFVQUxJRklFRF9DTEFTU19OQU1FKSkKLQkJCXJldHVybiBnZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQkJZWxzZSBpZiAoR0VORVJBVEVfREQuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBxdWFsaWZpZWQgamF2YSBjbGFzcyBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgY2xhc3MgbmFtZSBhbmQKLQkgKiBwYWNrYWdlIG5hbWUgcHJvcGVydGllcyBpbiB0aGUgZGF0YSBtb2RlbC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlICNDTEFTU19OQU1FCi0JICogQHNlZSAjSkFWQV9QQUNLQUdFCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgcXVhbGlmaWVkIGphdmEgY2xhc3NuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQkvLyBVc2UgdGhlIGphdmEgcGFja2FnZSBuYW1lIGFuZCB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIGNyZWF0ZSBhIHF1YWxpZmllZCBqYXZhIGNsYXNzCi0JCS8vIG5hbWUKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoSkFWQV9QQUNLQUdFKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkvLyBFbnN1cmUgdGhlIGNsYXNzIGlzIG5vdCBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIGJlZm9yZSBhZGRpbmcgcGFja2FnZSBuYW1lIHRvIHF1YWxpZmllZAotCQkvLyBuYW1lCi0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBjbGFzc05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9mIGFueSBvZiB0aGUgZGF0YQotCSAqIG1vZGVsJ3MgcHJvcGVydGllcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBlbnN1cmVzIHRoYXQgYSBqYXZhIGNsYXNzIGNhbiBiZSBwcm9wZXJseSBnZW5lcmF0ZWQKLQkgKiBmcm9tIHRoZSB2YWx1ZXMgYXMgc3BlY2lmaWVkLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4gVGhpcyBtZXRob2Qgd2lsbCBub3QgYWNjZXB0Ci0JICogbnVsbCBhcyBhIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIHNwZWNpZmllYyBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc09LKCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkKLQkJCXJldHVybiB2YWxpZGF0ZUphdmFTb3VyY2VGb2xkZXIoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBVkFfUEFDS0FHRSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVKYXZhUGFja2FnZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ0xBU1NfTkFNRSkpIHsKLQkJCXJlc3VsdCA9IHZhbGlkYXRlSmF2YUNsYXNzTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJCWlmIChyZXN1bHQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJSVN0YXR1cyBleGlzdHNTdGF0dXMgPSBjYW5DcmVhdGVUeXBlSW5DbGFzc3BhdGgoZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSkpOwotCQkJCWlmIChleGlzdHNTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SIHwgSVN0YXR1cy5XQVJOSU5HKSkKLQkJCQkJcmVzdWx0ID0gZXhpc3RzU3RhdHVzOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKQotCQkJcmV0dXJuIHZhbGlkYXRlU3VwZXJjbGFzcyhnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTU9ESUZJRVJfQUJTVFJBQ1QpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoTU9ESUZJRVJfRklOQUwpKQotCQkJcmV0dXJuIHZhbGlkYXRlTW9kaWZpZXIocHJvcGVydHlOYW1lLCBnZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHZhbGlkYXRlIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYWNrYWdlIG5hbWUgaXMgYSB2YWxpZCBqYXZhIHBhY2thZ2UgbmFtZS4gSXQKLQkgKiB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRvVmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcpLiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBudWxsLiBJdCB3aWxsCi0JICogbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwYWNrTmFtZSAtLQotCSAqICAgICAgICAgICAgdGhlIHBhY2thZ2UgbmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBvZiBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIHZhbGlkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSmF2YVBhY2thZ2UoU3RyaW5nIHBhY2tOYW1lKSB7Ci0JCWlmIChwYWNrTmFtZSAhPSBudWxsICYmIHBhY2tOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFVzZSBzdGFuZGFyZCBqYXZhIGNvbnZlbnRpb25zIHRvIHZhbGlkYXRlIHRoZSBwYWNrYWdlIG5hbWUKLQkJCUlTdGF0dXMgamF2YVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2tOYW1lKTsKLQkJCWlmIChqYXZhU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfUEFDQUtHRV9OQU1FX0lOVkFMSUQgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9IGVsc2UgaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX1BBQ0tBR0VfTkFNRV9XQVJOSU5HICsgamF2YVN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVXYXJuaW5nU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gamF2YSBwYWNrYWdlIG5hbWUgaXMgdmFsaWQKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gdmFsaWRhdGlvbiBvZiB0aGUgY2xhc3MgbmFtZS4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIHdpbGwgdmVyaWZ5IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZSBpcyBhIHZhbGlkIFVOUVVBTElGSUVEIGphdmEgY2xhc3MKLQkgKiBuYW1lLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBhY2NlcHQgbnVsbC4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBvZiBpZiBqYXZhIGNsYXNzIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUphdmFDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkvLyBFbnN1cmUgdGhlIGNsYXNzIG5hbWUgaXMgbm90IGVtcHR5Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfTkFNRV9FTVBUWTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJfQotCQkvLyBEbyBub3QgYWxsb3cgcXVhbGlmaWVkIG5hbWUKLQkJaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX05BTUVfUVVBTElGSUVEOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIENoZWNrIEphdmEgY2xhc3MgbmFtZSBieSBzdGFuZGFyZCBqYXZhIGNvbnZlbnRpb25zCi0JCUlTdGF0dXMgamF2YVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShjbGFzc05hbWUpOwotCQlpZiAoamF2YVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfTkFNRV9JTlZBTElEICsgamF2YVN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0gZWxzZSBpZiAoamF2YVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19OQU1FX1dBUk5JTkcgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhtc2cpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZSBzcGVjaWZpZWQgc3VwZXJjbGFzcyBjYW4gYmUgc3ViY2xhc3NlZC4gSXQgZW5zdXJlcyB0aGUgc3VwZXJjbGFzcwotCSAqIGlzIGEgdmFsaWQgamF2YSBjbGFzcywgdGhhdCBpdCBleGlzdHMsIGFuZCB0aGF0IGl0IGlzIG5vdCBmaW5hbC4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQKLQkgKiBudWxsLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gc3VwZXJjbGFzc05hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgb2YgaWYgdGhlIHN1cGVyY2xhc3MgY2FuIGJlIHN1YmNsYXNzZWQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVTdXBlcmNsYXNzKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgewotCQkvLyBFbnN1cmUgdGhlIHN1cGVyY2xhc3MgbmFtZSBpcyBub3QgZW1wdHkKLQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwgfHwgc3VwZXJjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfTkFNRV9FTVBUWTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJfQotCQkvLyBJbiBkZWZhdWx0IGNhc2Ugb2YgT2JqZWN0LCByZXR1cm4gT0sgcmlnaHQgYXdheQotCQlpZiAoc3VwZXJjbGFzc05hbWUuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkvLyBFbnN1cmUgdGhlIHVucXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBpcyB2YWxpZAotCQlTdHJpbmcgY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWU7Ci0JCWludCBpbmRleCA9IHN1cGVyY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQljbGFzc05hbWUgPSBzdXBlcmNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlSmF2YUNsYXNzTmFtZShjbGFzc05hbWUpOwotCQkvLyBJZiB1bnF1YWxpZmllZCBzdXBlciBjbGFzcyBuYW1lIGlzIHZhbGlkLCBlbnN1cmUgdmFsaWRpdHkgb2Ygc3VwZXJjbGFzcyBpdHNlbGYKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpIHsKLQkJCS8vIElmIHRoZSBzdXBlcmNsYXNzIGRvZXMgbm90IGV4aXN0LCB0aHJvdyBhbiBlcnJvcgotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJSVR5cGUgc3VwZXJ0eXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3VwZXJ0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoc3VwZXJjbGFzc05hbWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBKdXN0IHRocm93IGVycm9yIGJlbG93Ci0JCQl9Ci0JCQlpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKLQkJCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX1NVUEVSQ0xBU1NfTk9UX0VYSVNUOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0KLQkJCS8vIEVuc3VyZSB0aGUgc3VwZXJjbGFzcyBpcyBub3QgZmluYWwKLQkJCWludCBmbGFncyA9IC0xOwotCQkJdHJ5IHsKLQkJCQlmbGFncyA9IHN1cGVydHlwZS5nZXRGbGFncygpOwotCQkJCWlmIChNb2RpZmllci5pc0ZpbmFsKGZsYWdzKSkgewotCQkJCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX1NVUEVSQ0xBU1NfRklOQUw7Ci0JCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIHN0YXR1cyBvZiBzcGVjaWZpZWQgc3VwZXJjbGFzcwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZW5zdXJlIHRoYXQgaWYgdGhlIGFic3RyYWN0IG1vZGlmaWVyIGlzIHNldCwgdGhhdCBmaW5hbCBpcyBub3Qgc2V0LCBhbmQKLQkgKiB2aWNlLXZlcnNhLCBhcyB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZWl0aGVyIHdheS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgYWNjZXB0IG51bGwuIEl0IHdpbGwKLQkgKiBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiBAcmV0dXJuIElTdGF0dXMgb2Ygd2hldGhlciBhYnN0cmFjdCB2YWx1ZSBpcyB2YWxpZAotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZU1vZGlmaWVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gcHJvcCkgewotCQkvLyBUaHJvdyBhbiBlcnJvciBpZiBib3RoIEFic3RyYWN0IGFuZCBGaW5hbCBhcmUgY2hlY2tlZAotCQlpZiAocHJvcCkgewotCQkJLy8gRW5zdXJlIGZpbmFsIGlzIG5vdCBhbHNvIGNoZWNrZWQKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRElGSUVSX0FCU1RSQUNUKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoTU9ESUZJRVJfRklOQUwpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfQk9USF9GSU5BTF9BTkRfQUJTVFJBQ1Q7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJLy8gRW5zdXJlIGFic3RyYWN0IGlzIG5vdCBhbHNvIGNoZWNrZWQKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRElGSUVSX0ZJTkFMKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoTU9ESUZJRVJfQUJTVFJBQ1QpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfQk9USF9GSU5BTF9BTkRfQUJTVFJBQ1Q7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIEFic3RyYWN0IGFuZCBmaW5hbCBzZXR0aW5ncyBhcmUgdmFsaWQKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgY2hlY2sgdGhlIGphdmEgbW9kZWwgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBqYXZhcHJvamVjdCBpbiB0aGUgZGF0YSBtb2RlbCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcGFzc2VkIGluIHF1YWxpZmllZAotCSAqIGNsYXNzbmFtZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwuIEl0IG1heSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI2dldFRhcmdldFByb2plY3QoKQotCSAqIEBzZWUgSmF2YU1vZGVsVXRpbCNmaW5kVHlwZShJSmF2YVByb2plY3QsIFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gZnVsbENsYXNzTmFtZQotCSAqIEByZXR1cm4gSVR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3NuYW1lCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgY2FuQ3JlYXRlVHlwZUluQ2xhc3NwYXRoKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoSkFWQV9QQUNLQUdFKTsKLQkJcmV0dXJuIGNhbkNyZWF0ZVR5cGVJbkNsYXNzcGF0aChwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgY2FuQ3JlYXRlVHlwZUluQ2xhc3NwYXRoKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQkJaWYgKHBhY2sgIT0gbnVsbCkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2suZ2V0Q29tcGlsYXRpb25Vbml0KHR5cGVOYW1lICsgSmF2YU1vZGVsVXRpbC5ERUZBVUxUX0NVX1NVRkZJWCk7Ci0JCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lID0gSmF2YU1vZGVsVXRpbC5nZXRGdWxseVF1YWxpZmllZE5hbWUoY3UuZ2V0VHlwZSh0eXBlTmFtZSkpOwotCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjdS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUoyRUVDb21tb25NZXNzYWdlcy5FUlJfVFlQRV9BTFJFQURZX0VYSVNULCAKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGZ1bGx5UXVhbGlmaWVkTmFtZSB9KTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UpOyAKLQkJCX0KLQkJCQotCQkJVVJJIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZpbGVTdG9yZSBzdG9yZT0gRUZTLmdldFN0b3JlKGxvY2F0aW9uKTsKLQkJCQkJaWYgKHN0b3JlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCQlKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX1RZUEVfRElGRkVSRU5UX0NBU0VfRVhJU1QsIAotCQkJCQkJCQluZXcgT2JqZWN0W10geyBmdWxseVF1YWxpZmllZE5hbWUgfSk7Ci0JCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UpOyAKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHJldHVybiB0aGUgSUZvbGRlciBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBmb2xkZXIgbmFtZSBpbiB0aGUgZGF0YSBtb2RlbC4gVGhpcwotCSAqIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSAjU09VUkNFX0ZPTERFUgotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0QWxsU291cmNlRm9sZGVycygpCi0JICogCi0JICogQHJldHVybiBJRm9sZGVyIGphdmEgc291cmNlIGZvbGRlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRm9sZGVyIGdldEphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlcyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMoZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJLy8gRW5zdXJlIHRoZXJlIGlzIHZhbGlkIHNvdXJjZSBmb2xkZXIocykKLQkJaWYgKHNvdXJjZXMgPT0gbnVsbCB8fCBzb3VyY2VzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBmb2xkZXJGdWxsUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOwotCQkvLyBHZXQgdGhlIHNvdXJjZSBmb2xkZXIgd2hvc2UgcGF0aCBtYXRjaGVzIHRoZSBzb3VyY2UgZm9sZGVyIG5hbWUgdmFsdWUgaW4gdGhlIGRhdGEgbW9kZWwKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc291cmNlc1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGZvbGRlckZ1bGxQYXRoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gKElGb2xkZXIpIHNvdXJjZXNbaV0uZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biByZXRyaWV2YWwgbWVjaGFuaXNtLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIEpEVCBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZm9yIHRoZSBzZWxlY3RlZCBzb3VyY2UgZm9sZGVyLgotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNnZXRQYWNrYWdlRnJhZ21lbnRSb290KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkKLQkgKiAKLQkgKiBAcmV0dXJuIElQYWNrYWdlRnJhZ21lbnRSb290Ci0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJSmF2YVByb2plY3QgYUphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJCS8vIFJldHVybiB0aGUgc291cmNlIGZvbGRlciBmb3IgdGhlIGphdmEgcHJvamVjdCBvZiB0aGUgc2VsZWN0ZWQgcHJvamVjdAotCQkJaWYgKGFKYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUZvbGRlciBzb3VyY2Vmb2xkZXIgPSAoSUZvbGRlcikgZ2V0UHJvcGVydHkoSkFWQV9TT1VSQ0VfRk9MREVSKTsKLQkJCQlpZiAoc291cmNlZm9sZGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBhSmF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChzb3VyY2Vmb2xkZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHNvdXJjZSBmb2xkZXIgaXMgdXBkYXRlZCBpZiB0aGUgY29tcG9uZW50IGlzIGNoYW5nZWQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsCi0JICogICAgICBPYmplY3QpCi0JICogCi0JICogQHJldHVybiBib29sZWFuIGlmIHByb3BlcnR5IHNldCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCWlmIChDT01QT05FTlRfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQkJaWYoIGdldERlZmF1bHRKYXZhU291cmNlRm9sZGVyKCkgIT0gbnVsbCApewotCQkJCQlzZXRQcm9wZXJ0eShTT1VSQ0VfRk9MREVSLCBnZXREZWZhdWx0SmF2YVNvdXJjZUZvbGRlcigpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL05ld0phdmFDbGFzc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY3YmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL05ld0phdmFDbGFzc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DT05TVFJVQ1RPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfQUJTVFJBQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0ZJTkFMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9QVUJMSUM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1M7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogTmV3SmF2YUNsYXNzT3BlcmF0aW9uIGlzIGEgZGF0YSBtb2RlbCBvcGVyYXRpb24gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYSBuZXcgamF2YSBjbGFzcwotICogYmFzZWQgb24gdGhlIGlucHV0IGFuZCBwcm9wZXJ0aWVzIHNldCBpbiB0aGUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuICAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogSXQgaXMgYSBzdWJjbGFzcyBvZiBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiBhbmQgY2xpZW50cyBjYW4gaW52b2tlIHRoaXMgb3BlcmF0aW9uIGFzIGlzIG9yIGl0IG1heSBiZSBzdWJjbGFzc2VkIHRvCi0gKiBhZGQgYWRkaXRpb25hbCBvciBtb2RpZnkgYmVoYXZpb3VyLiAgVGhlIGV4ZWN1dGUoKSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIHRvIGRyaXZlIHRoaXMgYmVoYXZpb3VyLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIFRoZSBuZXcgamF2YSBjbGFzcyBpcyBnZW5lcmF0ZWQgdGhyb3VnaCB0aGUgdXNlIG9mIGFkZGluZyBhIHNlcmllcyBvZiBzdGF0aWMgdG9rZW5zIGRlZmluZWQgd2l0aGluIHRvCi0gKiBhbiBvbmdvaW5nIHN0cmluZyBidWZmZXIuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqIAotICogVGhpcyBuZWVkcyB0byBiZSByZW1vdmVkIGFzIGl0IGlzIGxlZ2FjeSBpbmhlcml0ZWQgZnJvbSBhbm90aGVyIHRlYW0KLSAqLwotcHVibGljIGNsYXNzIE5ld0phdmFDbGFzc09wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8vIFRva2VucyBmb3Igc3RyaW5nIGJ1ZmZlciBjcmVhdGlvbiBvZiBkZWZhdWx0IGphdmEgY2xhc3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gIjsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9VTkQgPSAiIyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1BBUiA9ICIoIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX1BBUiA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJBID0gInsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQlJBID0gIn0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFMgPSAiZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UUyA9ICJpbXBsZW1lbnRzICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV1MgPSAidGhyb3dzICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUMgPSAicHVibGljICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURUQgPSAicHJvdGVjdGVkICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFID0gInByaXZhdGUgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQyA9ICJzdGF0aWMgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFCU1RSQUNUID0gImFic3RyYWN0ICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTCA9ICJmaW5hbCAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRCA9ICJ2b2lkIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fTUVUSE9EID0gIlx0cHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT0RPX0NPTU1FTlQgPSAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX05VTEwgPSAiXHRcdHJldHVybiBudWxsOyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fMCA9ICJcdFx0cmV0dXJuIDA7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9GQUxTRSA9ICJcdFx0cmV0dXJuIGZhbHNlOyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCB0aGUgY2FsY3VsYXRlZCBpbXBvcnQgc3RhdGVtZW50cyB0aGF0IHdpbGwgbmVlZCB0byBiZSBhZGRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBpbXBvcnRTdGF0ZW1lbnRzOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIE5ld0phdmFDbGFzc09wZXJhdGlvbiBjb25zdHJ1Y3Rvci4gIERhdGEgbW9kZWxzIHBhc3NlZCBpbiBzaG91bGQgYmUgaW5zdGFuY2VzCi0JICogb2YgTmV3SmF2YUNsYXNzRGF0YU1vZGVsLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwuICBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4gTmV3SmF2YUNsYXNzT3BlcmF0aW9uCi0JICovCi0JcHVibGljIE5ld0phdmFDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCQlpbXBvcnRTdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGFjdGlvbnMgZHVyaW5nIGV4ZWN1dGlvbi4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4ZWN1dGUgbWV0aG9kIGRyaXZlcyB0aGUgcnVubmluZyBvZiB0aGUgb3BlcmF0aW9uLiAgVGhpcwotCSAqIG1ldGhvZCB3aWxsIGNyZWF0ZSB0aGUgc291cmNlIGZvbGRlciwgdGhlIGphdmEgcGFja2FnZSwgYW5kIHRoZW4gY3JlYXRlIHRoZSBqYXZhIGZpbGUuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgbnVsbC4KLQkgKiBAc2VlIEFic3RyYWN0T3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIFByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBFbnN1cmUgc291cmNlIGZvbGRlciBleGlzdHMKLQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBjcmVhdGVKYXZhU291cmNlRm9sZGVyKCk7Ci0JCS8vIEVuc3VyZSBqYXZhIHBhY2thZ2UgZXhpc3RzCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IGNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0JCS8vIENyZWF0ZSBqYXZhIGNsYXNzCi0JCWNyZWF0ZUphdmFGaWxlKHNvdXJjZUZvbGRlciwgcGFjayk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGphdmEgc291cmNlIGZvbGRlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGphdmEgY2xhc3MgZGF0YSBtb2RlbC4gCi0JICogSXQgd2lsbCBjcmVhdGUgdGhlIGphdmEgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdC4gIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4KLQkgKiBAc2VlICNTT1VSQ0VfRk9MREVSCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZShib29sZWFuLCBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcmV0dXJuIElGb2xkZXIgdGhlIGphdmEgc291cmNlIGZvbGRlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRm9sZGVyIGNyZWF0ZUphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCS8vIEdldCB0aGUgc291cmNlIGZvbGRlciBuYW1lIGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGZvbGRlckZ1bGxQYXRoID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlckZ1bGxQYXRoKSk7Ci0JCS8vIElmIGZvbGRlciBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIHRoZSBmb2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGphdmEgcGFja2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlIG5ldyBqYXZhIGNsYXNzIGRhdGEgbW9kZWwuCi0JICogSWYgdGhlIHBhY2thZ2UgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgY3JlYXRlIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCByZXR1cm4KLQkgKiBudWxsLgotCSAqIEBzZWUgI0pBVkFfUEFDS0FHRQotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjY3JlYXRlUGFja2FnZUZyYWdtZW50KGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEByZXR1cm4gSVBhY2thZ2VGcmFnbWVudCB0aGUgamF2YSBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCS8vIFJldHJpZXZlIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSB0aGUgamF2YSBjbGFzcyBkYXRhIG1vZGVsCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEpBVkFfUEFDS0FHRSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBtb2RlbC5nZXRQcm9wZXJ0eShKQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9CXBhY2tSb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JCS8vIEhhbmRsZSBkZWZhdWx0IHBhY2thZ2UKLQkJaWYgKHBhY2sgPT0gbnVsbCkgewotCQkJcGFjayA9IHBhY2tSb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBDcmVhdGUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJaWYgKCFwYWNrLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgcGFja05hbWUgPSBwYWNrLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl0cnkgewotCQkJCXBhY2sgPSBwYWNrUm9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja05hbWUsIHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiB0aGUgcGFja2FnZQotCQlyZXR1cm4gcGFjazsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gamF2YSBmaWxlIGNyZWF0aW9uIHBhdGguCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHVzZSB0aGUgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgbW9kZWwgdG8gY3JlYXRlCi0JICogYSBkZWZhdWx0IGphdmEgY2xhc3MuICBUaGUgY2xhc3Mgd2lsbCBiZSBidWlsdCB1c2luZyBwcmUtZGVmaW5lZCB0b2tlbnMgYW5kIHdpbGwgYmUKLQkgKiBidWlsdCB1cCB1c2luZyBhIHN0cmluZyBidWZmZXIuICBUaGUgbWV0aG9kIGdldEphdmFGaWxlQ29udGVudCB3aWxsIGhhbmRsZSB0aGUgYnVpbGRpbmcKLQkgKiBvZiB0aGUgc3RyaW5nIGJ1ZmZlciB3aGlsZSB0aGlzIG1ldGhvZCB3aWxsIHdyaXRlIHRob3NlIGNvbnRlbnRzIHRvIHRoZSBmaWxlLgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogQHNlZSAjQ0xBU1NfTkFNRQotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2dldEphdmFGaWxlQ29udGVudChJUGFja2FnZUZyYWdtZW50LCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHNvdXJjZUZvbGRlcgotCSAqIEBwYXJhbSBwYWNrCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSmF2YUZpbGUoSUZvbGRlciBzb3VyY2VGb2xkZXIsIElQYWNrYWdlRnJhZ21lbnQgcGFjaykgewotCQkvLyBSZXRyaWV2ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGphdmEgY2xhc3MgZGF0YSBtb2RlbAotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVZBX1BBQ0tBR0UpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGNsYXNzTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJLy9JQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEdldCB0aGUgamF2YSBmaWxlIGNvbnRlbnQgZnJvbSB0aGUgc3RyaW5nIGJ1ZmZlcgotCQkJU3RyaW5nIGNvbnRlbnQgPSBnZXRKYXZhRmlsZUNvbnRlbnQocGFjaywgY2xhc3NOYW1lKTsKLQkJCS8vIENyZWF0ZSB0aGUgY29tcGlsYXRpb24gdW5pdAotCQkJcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQoZmlsZU5hbWUsIGNvbnRlbnQsIHRydWUsIG51bGwpOwotCQkJYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IGNvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJCUlQYXRoIHBhY2thZ2VGdWxsUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBJUGF0aC5TRVBBUkFUT1IpKTsKLQkJCUlQYXRoIGphdmFGaWxlRnVsbFBhdGggPSBwYWNrYWdlRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJCUlGaWxlIGZpbGUgPSBzb3VyY2VGb2xkZXIuZ2V0RmlsZShqYXZhRmlsZUZ1bGxQYXRoKTsKLQkJCS8vIFNldCB0aGUgY29udGVudHMgaW4gdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCWZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRCeXRlcyksIGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJCX0gLy8gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBpdCB3aXRoIHRoZSBjb250ZW50cwotCQkJZWxzZSBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRCeXRlcyksIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJCS8vIGVkaXRNb2RlbC5nZXRXb3JraW5nQ29weShjdSwgdHJ1ZSk7IC8vVHJhY2sgQ1UuCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIFRoaXMgaXMgd2hlcmUgdGhlIHN0cmluZyBidWZmZXIgZm9yIHRoZSBjb250ZW50cwotCSAqIG9mIHRoZSBqYXZhIGZpbGUgaXMgYnVpbHQgdXAgdXNpbmcgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwgYW5kIHRoZSBwcmVkZWZpbmVkIHRva2Vucy4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jY3JlYXRlSmF2YUZpbGUoSUZvbGRlciwgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcGFyYW0gcGFjawotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIFN0cmluZyBqYXZhIGZpbGUgY29udGVudHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKYXZhRmlsZUNvbnRlbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCS8vIENyZWF0ZSB0aGUgc3VwZXJjbGFzcyBuYW1lCi0JCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFNVUEVSQ0xBU1MpOwotCQlMaXN0IGludGVyZmFjZXMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5URVJGQUNFUyk7Ci0JCVN0cmluZyBwYWNrYWdlU3RhdGVtZW50ID0gZ2V0UGFja2FnZVN0YXRlbWVudChwYWNrKTsKLQkJLy8gQ3JlYXRlIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQlzZXR1cEltcG9ydFN0YXRlbWVudHMocGFjaywgc3VwZXJjbGFzc05hbWUsIGludGVyZmFjZXMpOwotCQkvLyBDcmVhdGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uCi0JCVN0cmluZyBjbGFzc0RlY2xhcmF0aW9uID0gZ2V0Q2xhc3NEZWNsYXJhdGlvbihzdXBlcmNsYXNzTmFtZSwgY2xhc3NOYW1lLCBpbnRlcmZhY2VzKTsKLQkJLy8gQ3JlYXRlIHRoZSBmaWVsZHMKLQkJU3RyaW5nIGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQkvLyBDcmVhdGUgdGhlIG1ldGhvZHMKLQkJU3RyaW5nIG1ldGhvZHMgPSBnZXRNZXRob2RTdHVicyhzdXBlcmNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKLQotCQlTdHJpbmdCdWZmZXIgY29udGVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIEFkZCB0aGUgcGFja2FnZSBzdGF0ZW1lbnQgdG8gdGhlIGJ1ZmZlcgotCQljb250ZW50cy5hcHBlbmQocGFja2FnZVN0YXRlbWVudCk7Ci0JCS8vIEFkZCBhbGwgdGhlIGltcG9ydCBzdGF0ZW1lbnRzIHRvIHRoZSBidWZmZXIKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRTdGF0ZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQljb250ZW50cy5hcHBlbmQoSU1QT1JUICsgaW1wb3J0U3RhdGVtZW50cy5nZXQoaSkgKyBTRU1JQ09MT04pOwotCQkJY29udGVudHMuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQl9Ci0JCWNvbnRlbnRzLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJLy8gQWRkIHRoZSBjbGFzcyBkZWNsYXJhdGlvbiB0byB0aGUgYnVmZmVyCi0JCWNvbnRlbnRzLmFwcGVuZChjbGFzc0RlY2xhcmF0aW9uKTsKLQkJLy8gQWRkIHRoZSBmaWVsZHMgdG8gdGhlIGJ1ZmZlcgotCQljb250ZW50cy5hcHBlbmQoZmllbGRzKTsKLQkJLy8gQWRkIHRoZSBtZXRob2QgYm9kaWVzIHRvIHRoZSBidWZmZXIKLQkJY29udGVudHMuYXBwZW5kKG1ldGhvZHMpOwotCQljb250ZW50cy5hcHBlbmQoQ0xPU0VfQlJBKTsKLQkJLy8gUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyCi0JCXJldHVybiBjb250ZW50cy50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBwYWNrYWdlIHN0cmluZyBmb3IKLQkgKiB0aGUgY2xhc3MuICBJdCB3aWxsIG5vdCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2dldEphdmFGaWxlQ29udGVudChJUGFja2FnZUZyYWdtZW50LCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHBhY2sKLQkgKiBAcmV0dXJuIFN0cmluZyBwYWNrYWdlIHN0YXRlbWVudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VTdGF0ZW1lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gSWYgaXQgaXMgbm90IGRlZmF1bHQgcGFja2FnZSwgYWRkIHBhY2thZ2Ugc3RhdGVtZW50Ci0JCWlmICghcGFjay5pc0RlZmF1bHRQYWNrYWdlKCkpIHsKLQkJCXNiLmFwcGVuZChQQUNLQUdFICsgcGFjay5nZXRFbGVtZW50TmFtZSgpICsgU0VNSUNPTE9OKTsKLQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJfQotCQkvLyBSZXR1cm4gY29udGVudHMgb2YgYnVmZmVyCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2UuICBJdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotCSAqIGJlbG9uZ3MgdG8gdGhlIHNwZWNpZmllZCBwYWNrYWdlLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBhY2NlcHQgbnVsbHMuICBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc09wZXJhdGlvbiNzZXR1cEltcG9ydFN0YXRlbWVudHMoSVBhY2thZ2VGcmFnbWVudCwgU3RyaW5nLCBMaXN0KQotCSAqCi0JICogQHBhcmFtIHBhY2thZ2VGcmFnbWVudAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gaXMgY2xhc3MgaW4gdGhpcyBwYWNrYWdlPwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NhbWVQYWNrYWdlKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgc1BhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCQlTdHJpbmcgY2xhc3NQYWNrYWdlTmFtZSA9IFNpZ25hdHVyZS5nZXRRdWFsaWZpZXIoY2xhc3NOYW1lKTsKLQkJCS8vIERvZXMgdGhlIHF1YWxpZmllZCBjbGFzcydzIHBhY2thZ2UgbmFtZSBtYXRjaCB0aGUgcGFzc2VkIGluIHBhY2thZ2UncyBuYW1lPwotCQkJaWYgKGNsYXNzUGFja2FnZU5hbWUuZXF1YWxzKHNQYWNrYWdlTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHVwIHRoZSByZXF1aXJlZCBpbXBvcnQKLQkgKiBzdGF0ZW1lbnRzIGFuZCBjYWNoZSB0byB0aGUgaW1wb3J0U3RhdGVtZW50cyBsaXN0LgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jaW1wb3J0U3RhdGVtZW50cwotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2dldEphdmFGaWxlQ29udGVudChJUGFja2FnZUZyYWdtZW50LCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHBhY2sKLQkgKiBAcGFyYW0gc3VwZXJjbGFzc05hbWUKLQkgKiBAcGFyYW0gaW50ZXJmYWNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEltcG9ydFN0YXRlbWVudHMoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgc3VwZXJjbGFzc05hbWUsIExpc3QgaW50ZXJmYWNlcykgewotCQkvLyBJZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MgYW5kIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWNrYWdlLCBhZGQgYW4gaW1wb3J0IGZvciBpdAotCQlpZiAoc3VwZXJjbGFzc05hbWUgIT0gbnVsbCAmJiBzdXBlcmNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghc3VwZXJjbGFzc05hbWUuZXF1YWxzKEpBVkFfTEFOR19PQkpFQ1QpICYmICFpc1NhbWVQYWNrYWdlKHBhY2ssIHN1cGVyY2xhc3NOYW1lKSkgewotCQkJCWltcG9ydFN0YXRlbWVudHMuYWRkKHN1cGVyY2xhc3NOYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBBZGQgYW4gaW1wb3J0IHRoZSBsaXN0IG9mIGltcGxlbWVudGVkIGludGVyZmFjZXMKLQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCAmJiBpbnRlcmZhY2VzLnNpemUoKSA+IDApIHsKLQkJCWludCBzaXplID0gaW50ZXJmYWNlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCQkJaWYoIWludGVyZmFjZU5hbWUuZXF1YWxzKEpBVkFfTEFOR19PQkpFQ1QpICYmICFpc1NhbWVQYWNrYWdlKHBhY2ssIGludGVyZmFjZU5hbWUpKXsKLQkJCQkJaW1wb3J0U3RhdGVtZW50cy5hZGQoaW50ZXJmYWNlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIHdpbGwgYnVpbGQgdXAgdGhlIGNsYXNzIGRlY2xhcnRpb24KLQkgKiBzdGF0ZW1lbnQgYmFzZWQgb2ZmIHRoZSBwcm9wZXJ0aWVzIHNldCBpbiB0aGUgamF2YSBjbGFzcyBkYXRhIG1vZGVsLgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuICBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc09wZXJhdGlvbiNnZXRKYXZhRmlsZUNvbnRlbnQoSVBhY2thZ2VGcmFnbWVudCwgU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBzdXBlcmNsYXNzTmFtZQotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gaW50ZXJmYWNlcwotCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzIGRlY2xhcmF0aW9uIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHN1cGVyY2xhc3NOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBMaXN0IGludGVyZmFjZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBBcHBlbmQgYXBwcm9wcmlhdGUgbW9kaWZpZXJzCi0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoTU9ESUZJRVJfUFVCTElDKSkKLQkJCXNiLmFwcGVuZChQVUJMSUMpOwotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KE1PRElGSUVSX0FCU1RSQUNUKSkKLQkJCXNiLmFwcGVuZChBQlNUUkFDVCk7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoTU9ESUZJRVJfRklOQUwpKQotCQkJc2IuYXBwZW5kKEZJTkFMKTsKLQkJLy8gQWRkIHRoZSBjbGFzcyB0b2tlbiAKLQkJc2IuYXBwZW5kKENMQVNTKTsKLQkJLy8gQWRkIHRoZSBjbGFzcyBuYW1lCi0JCXNiLmFwcGVuZChjbGFzc05hbWUgKyBTUEFDRSk7Ci0JCS8vIElmIHRoZXJlIGlzIGEgc3VwZXJjbGFzcywgYWRkIHRoZSBleHRlbmRzIGFuZCBzdXBlciBjbGFzcyBuYW1lCi0JCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJiAhc3VwZXJjbGFzc05hbWUuZXF1YWxzKEpBVkFfTEFOR19PQkpFQ1QpKSB7Ci0JCQlpbnQgaW5kZXggPSBzdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZihET1QpOwotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCXN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQlzYi5hcHBlbmQoRVhURU5EUyArIHN1cGVyY2xhc3NOYW1lICsgU1BBQ0UpOwotCQl9Ci0JCS8vIElmIHRoZXJlIGFyZSBpbnRlcmZhY2VzLCBhZGQgdGhlIGltcGxlbWVudHMgYW5kIHRoZW4gaW50ZXJhdGUgb3ZlciB0aGUgaW50ZXJmYWNlIGxpc3QKLQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCAmJiBpbnRlcmZhY2VzLnNpemUoKSA+IDApIHsKLQkJCXNiLmFwcGVuZChJTVBMRU1FTlRTKTsKLQkJCWludCBzaXplID0gaW50ZXJmYWNlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCQkJaW50IGluZGV4ID0gaW50ZXJmYWNlTmFtZS5sYXN0SW5kZXhPZihET1QpOwotCQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQkJaW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJc2IuYXBwZW5kKGludGVyZmFjZU5hbWUpOwotCQkJCWlmIChpIDwgc2l6ZSAtIDEpCi0JCQkJCXNiLmFwcGVuZChDT01NQSk7Ci0JCQkJc2IuYXBwZW5kKFNQQUNFKTsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoT1BFTl9CUkEpOwotCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCS8vIFJldHVybiB0aGUgZmluaXNoZWQgY2xhc3MgZGVjbGFyYXRpb24gc3RyaW5nCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGZpZWxkcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogaXMgbm90IHRvIGhhdmUgYW55IGZpZWxkcy4gIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2dldEphdmFGaWxlQ29udGVudChJUGFja2FnZUZyYWdtZW50LCBTdHJpbmcpCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgZmllbGRzIHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRzKCkgewotCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIFRoaXMgd2lsbCBidWlsZCB1cCBhIHN0cmluZyB3aXRoIHRoZQotCSAqIGNvbnRlbnRzIG9mIGFsbCB0aGUgbWV0aG9kIHN0dWJzIGZvciB0aGUgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZXMuCi0JICogSXQgd2lsbCBhbHNvIGFkZCBpbmhlcml0ZWQgY29uc3RydWN0b3JzIGZyb20gdGhlIHN1cGVyY2xhc3MgYXMgYXBwcm9wcmlhdGUuCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2dldEphdmFGaWxlQ29udGVudChJUGFja2FnZUZyYWdtZW50LCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHN1cGVyY2xhc3NOYW1lCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gU3RyaW5nIG1ldGhvZCBzdHVicyBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RTdHVicyhTdHJpbmcgc3VwZXJjbGFzc05hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KGdldFRhcmdldFByb2plY3QoKSk7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9NRVRIT0QpKSB7Ci0JCQkvLyBBZGQgbWFpbiBtZXRob2QKLQkJCXNiLmFwcGVuZChNQUlOX01FVEhPRCk7Ci0JCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQlzYi5hcHBlbmQoVE9ET19DT01NRU5UKTsKLQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCXNiLmFwcGVuZChUQUIgKyBDTE9TRV9CUkEpOwotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQl9Ci0KLQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSBudWxsOwotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENPTlNUUlVDVE9SKSB8fCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUykpIHsKLQkJCS8vIEZpbmQgc3VwZXIgY2xhc3MgdHlwZQotCQkJdHJ5IHsKLQkJCQlzdXBlckNsYXNzVHlwZSA9IGphdmFQcm9qLmZpbmRUeXBlKHN1cGVyY2xhc3NOYW1lKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENPTlNUUlVDVE9SKSkgewotCQkJLy8gSW1wbGVtZW50IGNvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3MKLQkJCXRyeSB7Ci0JCQkJaWYgKHN1cGVyQ2xhc3NUeXBlICE9IG51bGwpIHsKLQkJCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBzdXBlckNsYXNzVHlwZS5nZXRNZXRob2RzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKG1ldGhvZHNbal0uaXNDb25zdHJ1Y3RvcigpICYmICFGbGFncy5pc1ByaXZhdGUobWV0aG9kc1tqXS5nZXRGbGFncygpKSAmJiAhaGFzR2VuZXJpY1BhcmFtcyhtZXRob2RzW2pdKSkgewotCQkJCQkJCVN0cmluZyBtZXRob2RTdHViID0gZ2V0TWV0aG9kU3R1YihtZXRob2RzW2pdLCBzdXBlcmNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKLQkJCQkJCQlzYi5hcHBlbmQobWV0aG9kU3R1Yik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gQWRkIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2VzIGxpc3QKLQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBQlNUUkFDVF9NRVRIT0RTKSAmJiBzdXBlckNsYXNzVHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWV0aG9kU3R1YiA9IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzRnJvbVN1cGVyY2xhc3Moc3VwZXJDbGFzc1R5cGUsIGNsYXNzTmFtZSk7Ci0JCQlpZiAobWV0aG9kU3R1YiAhPSBudWxsICYmIG1ldGhvZFN0dWIudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlzYi5hcHBlbmQobWV0aG9kU3R1Yik7Ci0JCQltZXRob2RTdHViID0gZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHNGcm9tSW50ZXJmYWNlcyhzdXBlckNsYXNzVHlwZSwgY2xhc3NOYW1lLCBqYXZhUHJvaik7Ci0JCQlpZiAobWV0aG9kU3R1YiAhPSBudWxsICYmIG1ldGhvZFN0dWIudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlzYi5hcHBlbmQobWV0aG9kU3R1Yik7Ci0JCX0KLQkJLy8gQWRkIGFueSB1c2VyIGRlZmluZWQgbWV0aG9kIHN0dWJzCi0JCWlmIChzdXBlckNsYXNzVHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdXNlckRlZmluZWQgPSBnZXRVc2VyRGVmaW5lZE1ldGhvZFN0dWJzKHN1cGVyQ2xhc3NUeXBlKTsKLQkJCWlmICh1c2VyRGVmaW5lZCAhPSBudWxsICYmIHVzZXJEZWZpbmVkLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJc2IuYXBwZW5kKHVzZXJEZWZpbmVkKTsKLQkJfQotCQkvLyBSZXR1cm4gdGhlIG1ldGhvZHMgc3RyaW5nCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNHZW5lcmljUGFyYW1zKElNZXRob2QgbWV0aG9kKSB7Ci0JCXRyeSB7Ci0JCQlJVHlwZSBwYXJlbnRUeXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCVN0cmluZ1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQotCQkJaW50IG5QID0gcGFyYW1UeXBlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5QOyBpKyspIHsKLQkJCQlTdHJpbmcgdHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQkJaWYgKCFpc1ByaW1pdGl2ZVR5cGUodHlwZSkpIHsKLQkJCQkJdHlwZSA9IEphdmFNb2RlbFV0aWwuZ2V0UmVzb2x2ZWRUeXBlTmFtZSh0eXBlLCBwYXJlbnRUeXBlKTsKLQkJCQkJaWYodHlwZS5pbmRleE9mKFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQsIDApICE9IC0xKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIHdpbGwgcmV0cmlldmUgbWV0aG9kIHN0dWJzIGZvcgotCSAqIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBpbiB0aGUgc3VwZXJjbGFzcyB0aGF0IHdpbGwgbmVlZCB0byBiZSBjcmVhdGVkIGluIHRoZSBuZXcgY2xhc3MuCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZ2V0TWV0aG9kU3R1YnMoU3RyaW5nLCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHN1cGVyQ2xhc3NUeXBlCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gU3RyaW5nIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBkZWZpbmVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVbmltcGxlbWVudGVkTWV0aG9kc0Zyb21TdXBlcmNsYXNzKElUeXBlIHN1cGVyQ2xhc3NUeXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIEltcGxlbWVudCBhYnN0cmFjdCBtZXRob2RzIGZyb20gc3VwZXJjbGFzcwotCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBzdXBlckNsYXNzVHlwZS5nZXRNZXRob2RzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQkJaW50IGZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCQkJLy8gQWRkIGlmIHRoZSBtZXRob2QgaXMgYWJzdHJhY3QsIG5vdCBwcml2YXRlIG9yIHN0YXRpYywgYW5kIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQgaW4gZGF0YSBtb2RlbAotCQkJCWlmICgoRmxhZ3MuaXNBYnN0cmFjdChmbGFncykgJiYgIUZsYWdzLmlzU3RhdGljKGZsYWdzKSAmJiAhRmxhZ3MuaXNQcml2YXRlKGZsYWdzKSkgfHwgaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QobWV0aG9kc1tqXSkpIHsKLQkJCQkJU3RyaW5nIG1ldGhvZFN0dWIgPSBnZXRNZXRob2RTdHViKG1ldGhvZHNbal0sIHN1cGVyQ2xhc3NUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBjbGFzc05hbWUpOwotCQkJCQlzYi5hcHBlbmQobWV0aG9kU3R1Yik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQkvLyBSZXR1cm4gbWV0aG9kIHN0dWJzIHN0cmluZwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIHdpbGwgcmV0cmlldmUgbWV0aG9kIHN0dWJzIGZvcgotCSAqIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIG5ldyBjbGFzcy4KLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc09wZXJhdGlvbiNnZXRNZXRob2RTdHVicyhTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gc3VwZXJDbGFzc1R5cGUKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIGphdmFQcm9qCi0JICogQHJldHVybiBTdHJpbmcgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGRlZmluZWQgaW4gaW50ZXJmYWNlcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVuaW1wbGVtZW50ZWRNZXRob2RzRnJvbUludGVyZmFjZXMoSVR5cGUgc3VwZXJDbGFzc1R5cGUsIFN0cmluZyBjbGFzc05hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvaikgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBJbXBsZW1lbnQgZGVmaW5lZCBtZXRob2RzIGZyb20gaW50ZXJmYWNlcwotCQkJTGlzdCBpbnRlcmZhY2VzID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElOVEVSRkFDRVMpOwotCQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotCQkJCQlTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCQkJCUlUeXBlIGludGVyZmFjZVR5cGUgPSBqYXZhUHJvai5maW5kVHlwZShxdWFsaWZpZWRDbGFzc05hbWUpOwotCQkJCQlJTWV0aG9kW10gbWV0aG9kQXJyYXkgPSBpbnRlcmZhY2VUeXBlLmdldE1ldGhvZHMoKTsKLQkJCQkJLy8gTWFrZSBzdXJlIHRoZSBtZXRob2QgaXNuJ3QgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBoZWlyYXJjaHkKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RBcnJheS5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGlzTWV0aG9kSW1wbGVtZW50ZWRJbkhpZXJhcmNoeShtZXRob2RBcnJheVtqXSwgc3VwZXJDbGFzc1R5cGUpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJU3RyaW5nIG1ldGhvZFN0dWIgPSBnZXRNZXRob2RTdHViKG1ldGhvZEFycmF5W2pdLCBxdWFsaWZpZWRDbGFzc05hbWUsIGNsYXNzTmFtZSk7Ci0JCQkJCQlzYi5hcHBlbmQobWV0aG9kU3R1Yik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9Ci0JCS8vIFJldHVybiBtZXRob2Qgc3R1YnMgc3RyaW5nCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIENoZWNrcyB0byBzZWUgaWYgdGhlIHBhc3NlZCB0eXBlIG5hbWUKLQkgKiBpcyBvZiBhIHByaW1pdGl2ZSB0eXBlLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwuICBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIFNpZ25hdHVyZSNnZXRFbGVtZW50VHlwZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqIEByZXR1cm4gYm9vbGVhbiBpcyB0eXBlIFByaW1pdGl2ZT8KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQljaGFyIGZpcnN0ID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHR5cGVOYW1lKS5jaGFyQXQoMCk7Ci0JCXJldHVybiAoZmlyc3QgIT0gU2lnbmF0dXJlLkNfUkVTT0xWRUQgJiYgZmlyc3QgIT0gU2lnbmF0dXJlLkNfVU5SRVNPTFZFRCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgVGhpcyB3aWxsIGFkZCBpbXBvcnQgc3RhdGVtZW50cyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHR5cGUgaWYgaXQgaXMgZGV0ZXJtaW5lZCB0byBiZSBuZWNlc3NhcnkuIFRoaXMgZG9lcyBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZ2V0TWV0aG9kU3R1YihJTWV0aG9kLCBTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcmVmVHlwZVNpZwotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHJldHVybiBTdHJpbmcgdHlwZSBzaWduYXR1cmUKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVBbmRBZGQoU3RyaW5nIHJlZlR5cGVTaWcsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZihyZWZUeXBlU2lnLmluZGV4T2YoU2lnbmF0dXJlLkNfR0VORVJJQ19TVEFSVCwgMCkgIT0gLTEpewotCQkJZ2V0SW1wb3J0U3RhdGVtZW50cyhyZWZUeXBlU2lnLCBkZWNsYXJpbmdUeXBlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyByZXNvbHZlZFR5cGVOYW1lID0gSmF2YU1vZGVsVXRpbC5nZXRSZXNvbHZlZFR5cGVOYW1lKHJlZlR5cGVTaWcsIGRlY2xhcmluZ1R5cGUpOwotCQkJLy8gQ291bGQgdHlwZSBub3QgYmUgcmVzb2x2ZWQgYW5kIGlzIGltcG9ydCBzdGF0ZW1lbnQgbWlzc2luZz8KLQkJCWlmIChyZXNvbHZlZFR5cGVOYW1lICE9IG51bGwgJiYgIWltcG9ydFN0YXRlbWVudHMuY29udGFpbnMocmVzb2x2ZWRUeXBlTmFtZSkgJiYgIXJlc29sdmVkVHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltcG9ydFN0YXRlbWVudHMuYWRkKHJlc29sdmVkVHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcocmVmVHlwZVNpZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZXRJbXBvcnRTdGF0ZW1lbnRzKFN0cmluZyBzaWduYXR1cmUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb257Ci0JCVN0cmluZyBlcmFzdXJlID0gU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKHNpZ25hdHVyZSk7Ci0JCVN0cmluZyByZXNvbHZlZFR5cGVOYW1lID0gSmF2YU1vZGVsVXRpbC5nZXRSZXNvbHZlZFR5cGVOYW1lKGVyYXN1cmUsIGRlY2xhcmluZ1R5cGUpOwotCQlpZiAocmVzb2x2ZWRUeXBlTmFtZSAhPSBudWxsICYmICFpbXBvcnRTdGF0ZW1lbnRzLmNvbnRhaW5zKHJlc29sdmVkVHlwZU5hbWUpICYmICFyZXNvbHZlZFR5cGVOYW1lLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWltcG9ydFN0YXRlbWVudHMuYWRkKHJlc29sdmVkVHlwZU5hbWUpOwotCQl9Ci0JCVN0cmluZyBbXSBwYXJhbXMgPSBTaWduYXR1cmUuZ2V0VHlwZUFyZ3VtZW50cyhzaWduYXR1cmUpOwotCQlmb3IoaW50IGk9MDtpPHBhcmFtcy5sZW5ndGg7IGkrKyl7Ci0JCQlnZXRJbXBvcnRTdGF0ZW1lbnRzKHBhcmFtc1tpXSwgZGVjbGFyaW5nVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIHdpbGwgdXNlIHRoZSBwcmVkZWZpbmVkIHRva2VucyB0byBnZW5lcmF0ZSB0aGUKLQkgKiBhY3R1YWwgbWV0aG9kIHN0dWJzLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcGFyYW0gc3VwZXJDbGFzc05hbWUKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBTdHJpbmcgbWV0aG9kIHN0dWIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RTdHViKElNZXRob2QgbWV0aG9kLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJSVR5cGUgcGFyZW50VHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCQkJU3RyaW5nW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJU3RyaW5nW10gcGFyYW1OYW1lcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotCQkJU3RyaW5nW10gZXhjZXB0aW9uVHlwZXMgPSBtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQotCQkJLy8gUGFyYW1ldGVycyBTdHJpbmcKLQkJCVN0cmluZyBwYXJhbVN0cmluZyA9IEVNUFRZX1NUUklORzsKLQkJCWludCBuUCA9IHBhcmFtVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJCS8vIHVwZGF0ZSBpbXBvcnQgc3RhdGVtZW50cwotCQkJCWlmICghaXNQcmltaXRpdmVUeXBlKHR5cGUpKSB7Ci0JCQkJCXR5cGUgPSByZXNvbHZlQW5kQWRkKHR5cGUsIHBhcmVudFR5cGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcodHlwZSk7Ci0JCQkJfQotCi0JCQkJaW50IGluZGV4ID0gdHlwZS5sYXN0SW5kZXhPZihET1QpOwotCQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJcGFyYW1TdHJpbmcgKz0gdHlwZSArIFNQQUNFICsgcGFyYW1OYW1lc1tpXTsKLQkJCQlpZiAoaSA8IG5QIC0gMSkKLQkJCQkJcGFyYW1TdHJpbmcgKz0gQ09NTUEgKyBTUEFDRTsKLQkJCX0KLQkJCS8vIEphdmEgZG9jCi0JCQlzYi5hcHBlbmQoIlx0LyogKG5vbi1KYXZhLWRvYykiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJc2IuYXBwZW5kKCJcdCAqIEBzZWUgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChzdXBlckNsYXNzTmFtZSArIFBPVU5EICsgbmFtZSArIE9QRU5fUEFSKTsKLQkJCXNiLmFwcGVuZChwYXJhbVN0cmluZyk7Ci0JCQlzYi5hcHBlbmQoQ0xPU0VfUEFSKTsKLQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCXNiLmFwcGVuZCgiXHQgKi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJLy8gYWNjZXNzCi0JCQlzYi5hcHBlbmQoVEFCKTsKLQkJCWlmIChGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkpCi0JCQkJc2IuYXBwZW5kKFBVQkxJQyk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChtZXRob2QuZ2V0RmxhZ3MoKSkpCi0JCQkJc2IuYXBwZW5kKFBST1RFQ1RFRCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1ByaXZhdGUobWV0aG9kLmdldEZsYWdzKCkpKQotCQkJCXNiLmFwcGVuZChQUklWQVRFKTsKLQkJCVN0cmluZyByZXR1cm5UeXBlID0gbnVsbDsKLQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJc2IuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJldHVybiB0eXBlCi0JCQkJcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJaWYgKCFpc1ByaW1pdGl2ZVR5cGUocmV0dXJuVHlwZSkpIHsKLQkJCQkJcmV0dXJuVHlwZSA9IHJlc29sdmVBbmRBZGQocmV0dXJuVHlwZSwgcGFyZW50VHlwZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhyZXR1cm5UeXBlKTsKLQkJCQl9Ci0JCQkJaW50IGlkeCA9IHJldHVyblR5cGUubGFzdEluZGV4T2YoRE9UKTsKLQkJCQlpZiAoaWR4ID09IC0xKQotCQkJCQlzYi5hcHBlbmQocmV0dXJuVHlwZSk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQocmV0dXJuVHlwZS5zdWJzdHJpbmcoaWR4ICsgMSkpOwotCQkJCXNiLmFwcGVuZChTUEFDRSk7Ci0JCQkJLy8gbmFtZQotCQkJCXNiLmFwcGVuZChuYW1lKTsKLQkJCX0KLQkJCS8vIFBhcmFtZXRlcnMKLQkJCXNiLmFwcGVuZChPUEVOX1BBUiArIHBhcmFtU3RyaW5nICsgQ0xPU0VfUEFSKTsKLQkJCS8vIGV4Y2VwdGlvbnMKLQkJCWludCBuRSA9IGV4Y2VwdGlvblR5cGVzLmxlbmd0aDsKLQkJCWlmIChuRSA+IDApIHsKLQkJCQlzYi5hcHBlbmQoU1BBQ0UgKyBUSFJPV1MpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkU7IGkrKykgewotCQkJCQlTdHJpbmcgdHlwZSA9IGV4Y2VwdGlvblR5cGVzW2ldOwotCQkJCQlpZiAoIWlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgewotCQkJCQkJdHlwZSA9IHJlc29sdmVBbmRBZGQodHlwZSwgcGFyZW50VHlwZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eXBlID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWludCBpbmRleCA9IHR5cGUubGFzdEluZGV4T2YoRE9UKTsKLQkJCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJCXNiLmFwcGVuZCh0eXBlKTsKLQkJCQkJaWYgKGkgPCBuRSAtIDEpCi0JCQkJCQlzYi5hcHBlbmQoQ09NTUEgKyBTUEFDRSk7Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKFNQQUNFICsgT1BFTl9CUkEpOwotCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQlzYi5hcHBlbmQoVEFCICsgVEFCICsgU1VQRVIgKyBPUEVOX1BBUik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUDsgaSsrKSB7Ci0JCQkJCXNiLmFwcGVuZChwYXJhbU5hbWVzW2ldKTsKLQkJCQkJaWYgKGkgPCBuUCAtIDEpCi0JCQkJCQlzYi5hcHBlbmQoQ09NTUEgKyBTUEFDRSk7Ci0JCQkJfQotCQkJCXNiLmFwcGVuZChDTE9TRV9QQVIgKyBTRU1JQ09MT04pOwotCQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIG1ldGhvZEJvZHkgPSBnZXRNZXRob2RCb2R5KG1ldGhvZCwgcmV0dXJuVHlwZSk7Ci0JCQkJc2IuYXBwZW5kKG1ldGhvZEJvZHkpOwotCQkJfQotCQkJc2IuYXBwZW5kKFRBQiArIENMT1NFX0JSQSk7Ci0JCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIEl0IGNoZWNrcyB0byBzZWUgd2hldGhlciBvciBub3QgdGhlCi0JICogbWV0aG9kIGlzIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gdGhlIGNsYXNzIGhlaXJhcmNoeS4KLQkgKiBJdCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHNGcm9tSW50ZXJmYWNlcyhJVHlwZSwgU3RyaW5nLCBJSmF2YVByb2plY3QpCi0JICogCi0JICogQHBhcmFtIG1ldGhvZAotCSAqIEBwYXJhbSBzdXBlckNsYXNzCi0JICogQHJldHVybiBib29sZWFuIGlzIG1ldGhvZCBhbHJlYWR5IGluIGhlaXJhcmNoeT8KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNZXRob2RJbXBsZW1lbnRlZEluSGllcmFyY2h5KElNZXRob2QgbWV0aG9kLCBJVHlwZSBzdXBlckNsYXNzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCUlNZXRob2QgZm91bmRNZXRob2QgPSBmaW5kTWV0aG9kSW1wbGVtZW50YXRpb25JbkhpZXJhcmNoeShtZXRob2QsIHN1cGVyQ2xhc3MpOwotCQkvLyBpZiB0aGUgbWV0aG9kIGV4aXN0cyBhbmQgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgZGF0YSBtb2RlbCwgdGhlbiByZXR1cm4gdHJ1ZQotCQlpZiAoZm91bmRNZXRob2QgIT0gbnVsbCAmJiBmb3VuZE1ldGhvZC5leGlzdHMoKSAmJiAhaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QobWV0aG9kKSkKLQkJCXJldCA9IHRydWU7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgVGhpcyB3aWxsIHJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBzdXBlcnR5cGUgaGVpcmFyY2h5IGZvcgotCSAqIHRoZSBwYXNzZWQgaW4gbWV0aG9kLiAgVGhpcyB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgSXQgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgbWV0aG9kIGRvZXMKLQkgKiBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgaGVpcmFyY2h5LgotCSAqIEBzZWUgTmV3SmF2YUNsYXNzT3BlcmF0aW9uI2lzTWV0aG9kSW1wbGVtZW50ZWRJbkhpZXJhcmNoeShJTWV0aG9kLCBJVHlwZSkKLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogQHBhcmFtIHN1cGVyQ2xhc3MKLQkgKiBAcmV0dXJuIElNZXRob2QgdGhlIG1ldGhvZCBmcm9tIHRoZSBoZWlyYXJjaHkKLQkgKi8KLQlwcml2YXRlIElNZXRob2QgZmluZE1ldGhvZEltcGxlbWVudGF0aW9uSW5IaWVyYXJjaHkoSU1ldGhvZCBtZXRob2QsIElUeXBlIHN1cGVyQ2xhc3MpIHsKLQkJSU1ldGhvZCBpbXBsZW1lbnRlZE1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoc3VwZXJDbGFzcyAhPSBudWxsICYmIHN1cGVyQ2xhc3MuZXhpc3RzKCkpIHsKLQkJCQlJVHlwZUhpZXJhcmNoeSB0SCA9IHN1cGVyQ2xhc3MubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWltcGxlbWVudGVkTWV0aG9kID0gZmluZE1ldGhvZEltcGxlbWVudGF0aW9uSW5IaWVyYXJjaHkodEgsIHN1cGVyQ2xhc3MsIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSwgbWV0aG9kLmlzQ29uc3RydWN0b3IoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBpbXBsZW1lbnRlZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIHdpbGwgcmVjdXJzaXZlbHkgY2hlY2sgdGhlIHN1cGVydHlwZSBoZWlyYXJjaHkgZm9yCi0JICogdGhlIHBhc3NlZCBpbiBtZXRob2QuICBUaGlzIHdpbGwgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuICBJdCB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBtZXRob2QgZG9lcwotCSAqIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBoZWlyYXJjaHkuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZmluZE1ldGhvZEltcGxlbWVudGF0aW9uSW5IaWVyYXJjaHkoSU1ldGhvZCwgSVR5cGUpCi0JICogQHNlZSBKYXZhTW9kZWxVdGlsI2ZpbmRNZXRob2RJbXBsZW1lbnRhdGlvbkluSGllcmFyY2h5KElUeXBlSGllcmFyY2h5LCBJVHlwZSwgU3RyaW5nLCBTdHJpbmdbXSwgYm9vbGVhbikKLQkgKiAKLQkgKiBAcGFyYW0gdEgKLQkgKiBAcGFyYW0gdGhpc1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEBwYXJhbSBpc0NvbnN0cnVjdG9yCi0JICogQHJldHVybiBJTWV0aG9kCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElNZXRob2QgZmluZE1ldGhvZEltcGxlbWVudGF0aW9uSW5IaWVyYXJjaHkoSVR5cGVIaWVyYXJjaHkgdEgsIElUeXBlIHRoaXNUeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVzW10sIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2QgZm91bmQgPSBKYXZhTW9kZWxVdGlsLmZpbmRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGlzQ29uc3RydWN0b3IsIHRoaXNUeXBlKTsKLQkJLy8gSWYgbWV0aG9kIGV4aXN0cyBtYWtlIHN1cmUgaXQgaXMgbm90IGFic3RyYWN0Ci0JCWlmIChmb3VuZCAhPSBudWxsICYmICFGbGFncy5pc0Fic3RyYWN0KGZvdW5kLmdldEZsYWdzKCkpKSB7Ci0JCQlyZXR1cm4gZm91bmQ7Ci0JCX0KLQkJLy8gQ2hlY2sgcmVjdXJzaXZlbHkKLQkJcmV0dXJuIEphdmFNb2RlbFV0aWwuZmluZE1ldGhvZEluSGllcmFyY2h5KHRILCB0aGlzVHlwZSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGlzQ29uc3RydWN0b3IpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBtZXRob2QgYm9keSBkZWZpbml0aW9ucy4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBhZGQgYSB0b2RvLCBhbmQgdG8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuICBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBAc2VlIE5ld0phdmFDbGFzc09wZXJhdGlvbiNnZXRNZXRob2RTdHViKElNZXRob2QsIFN0cmluZywgU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcGFyYW0gcmV0dXJuVHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIG1ldGhvZCBib2R5Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRob2RCb2R5KElNZXRob2QgbWV0aG9kLCBTdHJpbmcgcmV0dXJuVHlwZSkgewotCQkvLyBBZGQgYSB0b2RvIGNvbW1lbnQKLQkJU3RyaW5nIGJvZHkgPSBUT0RPX0NPTU1FTlQ7Ci0JCWJvZHkgKz0gbGluZVNlcGFyYXRvcjsKLQkJLy8gQWRkIHRoZSBhcHByb3ByaWF0ZSBkZWZhdWx0IHJldHVybiB0eXBlCi0JCWlmIChyZXR1cm5UeXBlID09IG51bGwgfHwgcmV0dXJuVHlwZS5lcXVhbHMoVk9JRCkpCi0JCQlyZXR1cm4gYm9keTsKLQkJaWYgKHJldHVyblR5cGUuZXF1YWxzKElOVCkpCi0JCQlib2R5ICs9IFJFVFVSTl8wOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCT09MRUFOKSkKLQkJCWJvZHkgKz0gUkVUVVJOX0ZBTFNFOwotCQllbHNlCi0JCQlib2R5ICs9IFJFVFVSTl9OVUxMOwotCQlib2R5ICs9IGxpbmVTZXBhcmF0b3I7Ci0JCS8vIFJldHVybiB0aGUgbWV0aG9kIGJvZHkKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIHVzZXIgZGVmaW5lZCBtZXRob2Qgc3R1YnMuICBUaGUKLQkgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGp1c3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gIFRoaXMgbWV0aG9kIHdpbGwgbm90IGFjY2VwdAotCSAqIG51bGwgcGFyYW1ldGVyLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZ2V0TWV0aG9kU3R1YnMoU3RyaW5nLCBTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHN1cGVyQ2xhc3NUeXBlCi0JICogQHJldHVybiBTdHJpbmcgdXNlciBkZWZpbmVkIG1ldGhvZHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJEZWZpbmVkTWV0aG9kU3R1YnMoSVR5cGUgc3VwZXJDbGFzc1R5cGUpIHsKLQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gc3BlY2lhbGl6ZWQgcmV0dXJuIG9uIHdoaWNoIG5vbmltcGxlbWVudGVkCi0JICogbWV0aG9kcyB0byBpbXBsZW1lbnQuICBUaGlzIGRvZXMgbm90IGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiAgVGhpcyB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gc2hvdWxkIGltcGxlbWVudCBtZXRob2Q/Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZSBmb3IgYSBqYXZhIGNsYXNzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTWV0aG9kIG5hbWUgb2YgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfTUVUSE9EID0gImdlbmVyYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld0phdmFFRUFydGlmYWN0Q2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGFjdGlvbnMgZHVyaW5nCi0JICogZXhlY3V0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4ZWN1dGUgbWV0aG9kIGRyaXZlcyB0aGUgcnVubmluZyBvZgotCSAqIHRoZSBvcGVyYXRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBjcmVhdGUgdGhlIGphdmEgc291cmNlIGZvbGRlciwKLQkgKiBjcmVhdGUgdGhlIGphdmEgcGFja2FnZSwgYW5kIHRoZW4gaWYgdXNpbmcgYW5ub3RhdGlvbnMsIHdpbGwgdXNlCi0JICogdGVtcGxhdGVzIHRvIGdlbmVyYXRlIGFuIGFubm90YXRlZCB3ZWIgYXJ0aWZhY3QgamF2YSBjbGFzcywgb3IgaWYgaXQgaXMKLQkgKiBub3QgYW5ub3RhdGVkLCB0aGUgd2ViIGFydGlmYWN0IGphdmEgY2xhc3MgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dAotCSAqIHRoZSBhbm5vdGF0ZWQgdGFncyB1c2luZyB0ZW1wbGF0ZXMuIE9wdGlvbmFsbHksIHN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGUKLQkgKiBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzIG9yIGNyZWF0ZUphdmFGaWxlIG1ldGhvZCByYXRoZXIgdGhhbiBleHRlbmQgdGhlCi0JICogZXhlY3V0ZSBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzZWUgTmV3V2ViQ2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBDcmVhdGUgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdAotCQljcmVhdGVKYXZhU291cmNlRm9sZGVyKCk7Ci0JCS8vIENyZWF0ZSBqYXZhIHBhY2thZ2UgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJLy8gR2VuZXJhdGUgdXNpbmcgdGVtcGxhdGVzCi0JCXRyeSB7Ci0JCQlnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKG1vbml0b3IsIHBhY2spOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQpIHRocm93cyBXRlRXcmFwcGVkRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBqYXZhIHBhY2thZ2UgYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZXcgamF2YQotCSAqIGNsYXNzIGRhdGEgbW9kZWwuIElmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGNyZWF0ZSB0aGUKLQkgKiBwYWNrYWdlLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgI0pBVkFfUEFDS0FHRQotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjY3JlYXRlUGFja2FnZUZyYWdtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcmV0dXJuIElQYWNrYWdlRnJhZ21lbnQgdGhlIGphdmEgcGFja2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZUphdmFQYWNrYWdlKCkgewotCQkvLyBSZXRyaWV2ZSB0aGUgcGFja2FnZSBuYW1lIGZyb20gdGhlIGphdmEgY2xhc3MgZGF0YSBtb2RlbAotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVZBX1BBQ0tBR0UpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwuZ2V0UHJvcGVydHkoSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQkvLyBIYW5kbGUgZGVmYXVsdCBwYWNrYWdlCi0JCWlmIChwYWNrID09IG51bGwpIHsKLQkJCXBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gQ3JlYXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCWlmICghcGFjay5leGlzdHMoKSkgewotCQkJU3RyaW5nIHBhY2tOYW1lID0gcGFjay5nZXRFbGVtZW50TmFtZSgpOwotCQkJdHJ5IHsKLQkJCQlwYWNrID0gcGFja1Jvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2tOYW1lLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkvLyBSZXR1cm4gdGhlIHBhY2thZ2UKLQkJcmV0dXJuIHBhY2s7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hlY2tzIHRoZQotCSAqIHtAbGluayBKMkVFUGx1Z2luI0RZTkFNSUNfVFJBTlNMQVRJT05fT0ZfSkVUX1RFTVBMQVRFU19QUkVGX0tFWX0KLQkgKiBwcmVmZXJlbmNlIHRvIGRldGVybWluZSB0aGUgbWV0aG9kIGZvciBnZW5lcmF0aW5nIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUKLQkgKiBKYXZhIEVFIGFydGlmYWN0OgotCSAqIDx1bD4KLQkgKiAJCTxsaT5keW5hbWljYWxseSB1c2luZyB0aGUgcHJvdmlkZWQgSkVUIHRlbXBsYXRlIGZpbGUsIG9yPC9saT4KLQkgKiAJCTxsaT51c2luZyB0aGUgc3RhdGljYWxseSBidWlsZC1pbiB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gPC9saT4gCi0JICogPC91bD4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICAtIHRoZSBwbHVnaW4gd2hpY2ggY2FsbHMgdGhlIGN1cnJlbnQgbWV0aG9kCi0JICogQHBhcmFtIHRlbXBsYXRlTW9kZWwKLQkgKiAgICAgICAgICAgIC0gYSB0ZW1wbGF0ZSBtb2RlbCB0aGF0IGlzIHVzZWQgYnkgdGhlIEpFVCB0ZW1wbGF0ZSBmaWxlIG9yCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgKiBAcGFyYW0gdGVtcGxhdGVGaWxlCi0JICogICAgICAgICAgICAtIGEgSmF2YSBKRVQgdGVtcGxhdGUgZmlsZQotCSAqIEBwYXJhbSB0ZW1wbGF0ZUltcGwKLQkgKiAgICAgICAgICAgIC0gYSBKYXZhIEpFVCB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICAtIGEgbW9uaXRvciB0byByZXBvcnQgdGhlIHByb2dyZXNzIG9mIHRoZSBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdGVtcGxhdGVJbXBsCi0JICogICAgICAgICAgICAtIGEgSmF2YSBKRVQgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUKLQkgKiAKLQkgKiBAdGhyb3dzIEpFVEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgaW4gZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIAotCSAqIEBzZWUgI2dlbmVyYXRlVGVtcGxhdGVTb3VyY2UoV1RQUGx1Z2luLAotCSAqICAgICAgQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsLCBTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNlZSAjZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UoV1RQUGx1Z2luIHBsdWdpbiwgQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsIHRlbXBsYXRlTW9kZWwsIFN0cmluZyB0ZW1wbGF0ZUZpbGUsIE9iamVjdCB0ZW1wbGF0ZUltcGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0JCQl0aHJvd3MgSkVURXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlib29sZWFuIGR5bmFtaWNUcmFuc2xhdGlvbiA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSjJFRVBsdWdpbi5EWU5BTUlDX1RSQU5TTEFUSU9OX09GX0pFVF9URU1QTEFURVNfUFJFRl9LRVkpOwotCQkKLQkJaWYgKGR5bmFtaWNUcmFuc2xhdGlvbikgewotCQkJcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UocGx1Z2luLCB0ZW1wbGF0ZU1vZGVsLCB0ZW1wbGF0ZUZpbGUsIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UodGVtcGxhdGVNb2RlbCwgdGVtcGxhdGVJbXBsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzdGF0aWNhbGx5IGJ1aWx0LWluIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvCi0JICogZ2VuZXJhdGUgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBKYXZhIEVFIGFydGlmYWN0IHdpdGggdGhlIGdpdmVuIHRlbXBsYXRlCi0JICogbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTW9kZWwKLQkgKiAgICAgICAgICAgIC0gYSB0ZW1wbGF0ZSBtb2RlbCB0aGF0IGlzIHVzZWQgYnkgdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uCi0JICogICAgICAgICAgICBjbGFzcwotCSAqIEBwYXJhbSB0ZW1wbGF0ZUltcGwKLQkgKiAgICAgICAgICAgIC0gYSBKYXZhIEpFVCB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBzb3VyY2UgY29kZQotCSAqIAotCSAqIEB0aHJvd3MgSkVURXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBpbiBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbCB0ZW1wbGF0ZU1vZGVsLCBPYmplY3QgdGVtcGxhdGVJbXBsKSAKLQkJCXRocm93cyBKRVRFeGNlcHRpb24gewotCQl0cnkgewotCQkJTWV0aG9kIG1ldGhvZCA9IHRlbXBsYXRlSW1wbC5nZXRDbGFzcygpLmdldE1ldGhvZChHRU5FUkFURV9NRVRIT0QsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0pOwotCQkJcmV0dXJuIChTdHJpbmcpIG1ldGhvZC5pbnZva2UodGVtcGxhdGVJbXBsLCB0ZW1wbGF0ZU1vZGVsKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEpFVEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBKRVRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSkVURXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBKRVRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEpFVEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIFdUUEpFVEVtaXR0ZXIgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZQotCSAqIEphdmEgRUUgYXJ0aWZhY3Qgd2l0aCB0aGUgZ2l2ZW4gdGVtcGxhdGUgbW9kZWwgYW5kIHRlbXBsYXRlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgLSB0aGUgcGx1Z2luIHdoaWNoIGNhbGxzIHRoZSBjdXJyZW50IG1ldGhvZAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU1vZGVsCi0JICogICAgICAgICAgICAtIGEgdGVtcGxhdGUgbW9kZWwgdGhhdCBpcyB1c2VkIGJ5IHRoZSBKRVQgdGVtcGxhdGUgZmlsZQotCSAqIEBwYXJhbSB0ZW1wbGF0ZUZpbGUKLQkgKiAgICAgICAgICAgIC0gYSBKYXZhIEpFVCB0ZW1wbGF0ZSBmaWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIC0gYSBtb25pdG9yIHRvIHJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBzb3VyY2UgY29kZQotCSAqIAotCSAqIEB0aHJvd3MgSkVURXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBpbiB0aGUgSkVUIGVtaXR0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UoV1RQUGx1Z2luIHBsdWdpbiwgQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsIHRlbXBsYXRlTW9kZWwsIFN0cmluZyB0ZW1wbGF0ZUZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0JCQl0aHJvd3MgSkVURXhjZXB0aW9uIHsKLQkJVVJMIHRlbXBsYXRlVVJMID0gRmlsZUxvY2F0b3IuZmluZChwbHVnaW4uZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHRlbXBsYXRlRmlsZSksIG51bGwpOwotCQljbGVhblVwT2xkRW1pdHRlclByb2plY3QoKTsKLQkJV1RQSkVURW1pdHRlciBlbWl0dGVyID0gbmV3IFdUUEpFVEVtaXR0ZXIodGVtcGxhdGVVUkwudG9TdHJpbmcoKSwgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQllbWl0dGVyLnNldEludGVsbGlnZW50TGlua2luZ0VuYWJsZWQodHJ1ZSk7Ci0JCWVtaXR0ZXIuYWRkVmFyaWFibGUoSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5JRCgpLCBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbklEKCkpOwotCQllbWl0dGVyLmFkZFZhcmlhYmxlKHBsdWdpbi5nZXRQbHVnaW5JRCgpLCBwbHVnaW4uZ2V0UGx1Z2luSUQoKSk7Ci0JCXJldHVybiBlbWl0dGVyLmdlbmVyYXRlKG1vbml0b3IsIG5ldyBPYmplY3RbXSB7IHRlbXBsYXRlTW9kZWwgfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcE9sZEVtaXR0ZXJQcm9qZWN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFdUUEpFVEVtaXR0ZXIuUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsID0gbWFya2Vycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQlpZiAoKChJbnRlZ2VyKSBtYXJrZXJzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSkuaW50VmFsdWUoKSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSB7Ci0JCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBqYXZhIHNvdXJjZSBmb2xkZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBqYXZhCi0JICogY2xhc3MgZGF0YSBtb2RlbC4gSXQgd2lsbCBjcmVhdGUgdGhlIGphdmEgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdAotCSAqIGV4aXN0LiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSAjU09VUkNFX0ZPTERFUgotCSAqIEBzZWUgSUZvbGRlciNjcmVhdGUoYm9vbGVhbiwgYm9vbGVhbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEByZXR1cm4gSUZvbGRlciB0aGUgamF2YSBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElGb2xkZXIgY3JlYXRlSmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJLy8gR2V0IHRoZSBzb3VyY2UgZm9sZGVyIG5hbWUgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlJRm9sZGVyIGZvbGRlciA9IGdldFNvdXJjZUZvbGRlcigpOwotCQkvLyBJZiBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGUgZm9sZGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoCi0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiB0aGUgc291cmNlIGZvbGRlcgotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0U291cmNlRm9sZGVyKCkgewotCQlTdHJpbmcgZm9sZGVyRnVsbFBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCXJldHVybiByb290LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJGdWxsUGF0aCkpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1NvdXJjZUNvbnN0cnVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9Tb3VyY2VDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQzNTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1NvdXJjZUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIENvbnN0cnVjdG9yIHsKLQkKLQlwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDsKLQkKLQlwdWJsaWMgU291cmNlQ29uc3RydWN0b3IoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIENvbnN0cnVjdG9yI2lzUGFyYW1ldGVybGVzcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJsZXNzKCkgewotCQlyZXR1cm4gbWV0aG9kLnBhcmFtZXRlcnMoKS5zaXplKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnN0cnVjdG9yI2lzUHVibGljKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb25zdHJ1Y3RvciNpc1Byb3RlY3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm90ZWN0ZWQoKSB7Ci0JCWludCBtb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0gICAgICAgIHJldHVybiBNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29uc3RydWN0b3IjZ2V0UGFyYW1zRm9yQ2FsbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JDYWxsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJhbXMoZmFsc2UsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29uc3RydWN0b3IjZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmFtcyh0cnVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnN0cnVjdG9yI2dldFBhcmFtc0ZvckphdmFkb2MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1zRm9ySmF2YWRvYygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKHRydWUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnN0cnVjdG9yI2dldE5vblByaW1pdGl2ZVBhcmFtZXRlclR5cGVzKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5vblByaW1pdGl2ZVBhcmFtZXRlclR5cGVzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVycygpOwotCQlmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotCQkJVHlwZSB0eXBlID0gIHBhcmFtZXRlci5nZXRUeXBlKCk7Ci0JCQlpZiAoIXR5cGUuaXNQcmltaXRpdmVUeXBlKCkpIHsKLQkJCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJCQlpZiAoYmluZGluZyAhPSBudWxsKQotCQkJCQlyZXN1bHQuYWRkKGJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1zKGJvb2xlYW4gdHlwZXMsIGJvb2xlYW4gbmFtZXMpIHsKLQkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkKLQkJSXRlcmF0b3I8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSBtZXRob2QucGFyYW1ldGVycygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCi0gICAgICAgIAlpZiAodHlwZXMpIAotICAgICAgICAJCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyLmdldFR5cGUoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmICh0eXBlcyAmJiBuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkKLSAgICAgICAgCWlmIChuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgCQotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1NvdXJjZU1ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvU291cmNlTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDYyZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvU291cmNlTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmltaXRpdmVUeXBlLkNvZGU7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VNZXRob2QgaW1wbGVtZW50cyBNZXRob2QgewotCQotCXByaXZhdGUgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kOwotCQotCXB1YmxpYyBTb3VyY2VNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE1ldGhvZCNnZXRTaWduYXR1cmUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVycygpOwotCQlMaXN0PFN0cmluZz4gcGFyYW1ldGVyVHlwZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0JCQlwYXJhbWV0ZXJUeXBlc0xpc3QuYWRkKHBhcmFtZXRlci5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbXSB7IH0pOwotCQlTdHJpbmcgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlMigpLnJlc29sdmVCaW5kaW5nKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkKLQkJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVNZXRob2RTaWduYXR1cmUocGFyYW1ldGVyVHlwZXMsIHJldHVyblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldENvbnRhaW5pbmdKYXZhQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKSBtZXRob2QuZ2V0UGFyZW50KCk7Ci0JCXJldHVybiB0eXBlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2QjZ2V0UmV0dXJuVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCkgewotCQlyZXR1cm4gbWV0aG9kLmdldFJldHVyblR5cGUyKCkucmVzb2x2ZUJpbmRpbmcoKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldERlZmF1bHRSZXR1cm5WYWx1ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmV0dXJuVmFsdWUoKSB7Ci0JCVR5cGUgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlMigpOwotCQlpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSkgewotCQkJQ29kZSBjb2RlID0gKChQcmltaXRpdmVUeXBlKSByZXR1cm5UeXBlKS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpOwotCQkJaWYgKGNvZGUgPT0gUHJpbWl0aXZlVHlwZS5WT0lEKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgaWYgKGNvZGUgPT0gUHJpbWl0aXZlVHlwZS5CT09MRUFOKSB7Ci0JCQkJcmV0dXJuICJmYWxzZSI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAiMCI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIm51bGwiOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFJldHVyblR5cGVJbXBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFJldHVyblR5cGVJbXBvcnRzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlUeXBlIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZTIoKTsKLQkJZ2V0VHlwZUltcG9ydHMocmV0dXJuVHlwZSwgcmVzdWx0KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2QjZ2V0UGFyYW1zRm9yQ2FsbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JDYWxsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJhbXMoZmFsc2UsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJhbXModHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2QjZ2V0UGFyYW1zRm9ySmF2YWRvYygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbXNGb3JKYXZhZG9jKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJhbXModHJ1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kI2dldFBhcmFtZXRlckltcG9ydHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVySW1wb3J0cygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kLnBhcmFtZXRlcnMoKTsKLQkJZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLQkJCVR5cGUgdHlwZSA9ICBwYXJhbWV0ZXIuZ2V0VHlwZSgpOwotCQkJZ2V0VHlwZUltcG9ydHModHlwZSwgcmVzdWx0KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJTWV0aG9kIG9iaiA9IChNZXRob2QpIG87Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMob2JqLmdldE5hbWUoKSkgJiYgCi0JCQl0aGlzLmdldFNpZ25hdHVyZSgpLmVxdWFscyhvYmouZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpICogZ2V0U2lnbmF0dXJlKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1zKGJvb2xlYW4gdHlwZXMsIGJvb2xlYW4gbmFtZXMpIHsKLQkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkKLQkJSXRlcmF0b3I8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSBtZXRob2QucGFyYW1ldGVycygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCi0gICAgICAgIAlpZiAodHlwZXMpIAotICAgICAgICAJCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyLmdldFR5cGUoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmICh0eXBlcyAmJiBuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkKLSAgICAgICAgCWlmIChuYW1lcykgCi0gICAgICAgIAkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgCQotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0VHlwZUltcG9ydHMoVHlwZSB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJCWdldEFycmF5VHlwZUltcG9ydHModHlwZSwgcmVzdWx0KTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewotCQkJZ2V0UGFyYW1ldGVyaXplZFR5cGVJbXBvcnRzKHR5cGUsIHJlc3VsdCk7Ci0JCX0gZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSkgewotCQkJZ2V0UHJpbWl0aXZlVHlwZUltcG9ydHModHlwZSwgcmVzdWx0KTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKSB7Ci0JCQlnZXRTaW1wbGVUeXBlSW1wb3J0cyh0eXBlLCByZXN1bHQpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNRdWFsaWZpZWRUeXBlKCkpIHsKLQkJCWdldFF1YWxpZmllZFR5cGVJbXBvcnRzKHR5cGUsIHJlc3VsdCk7Ci0JCX0gZWxzZSBpZiAodHlwZS5pc1dpbGRjYXJkVHlwZSgpKSB7Ci0JCQlnZXRXaWxkY2FyZFR5cGVJbXBvcnRzKHR5cGUsIHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QXJyYXlUeXBlSW1wb3J0cyhUeXBlIHR5cGUsIExpc3Q8U3RyaW5nPiByZXN1bHQpIHsKLQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCVR5cGUgY29tcG9uZW50VHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWdldFR5cGVJbXBvcnRzKGNvbXBvbmVudFR5cGUsIHJlc3VsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFBhcmFtZXRlcml6ZWRUeXBlSW1wb3J0cyhUeXBlIHR5cGUsIExpc3Q8U3RyaW5nPiByZXN1bHQpIHsKLQkJUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGU7Ci0JCQotCQlUeXBlIG1haW5UeXBlID0gcGFyYW1ldGVyaXplZFR5cGUuZ2V0VHlwZSgpOwotCQlnZXRUeXBlSW1wb3J0cyhtYWluVHlwZSwgcmVzdWx0KTsKLQkJCi0JCUxpc3Q8VHlwZT4gYXJndW1lbnRzID0gcGFyYW1ldGVyaXplZFR5cGUudHlwZUFyZ3VtZW50cygpOwotCQlmb3IgKFR5cGUgYXJndW1lbnQgOiBhcmd1bWVudHMpIHsKLQkJCWdldFR5cGVJbXBvcnRzKGFyZ3VtZW50LCByZXN1bHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFByaW1pdGl2ZVR5cGVJbXBvcnRzKFR5cGUgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQkvLyBkbyBub3RoaW5nIC0gbm8gaW1wb3J0cyByZXF1aXJlZCBmb3IgcHJpbWl0aXZlIHR5cGVzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFNpbXBsZVR5cGVJbXBvcnRzKFR5cGUgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGQoYmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0UXVhbGlmaWVkVHlwZUltcG9ydHMoVHlwZSB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCVF1YWxpZmllZFR5cGUgcXVhbGlmaWVkVHlwZSA9IChRdWFsaWZpZWRUeXBlKSB0eXBlOwotCQlyZXN1bHQuYWRkKHF1YWxpZmllZFR5cGUuZ2V0UXVhbGlmaWVyKCkgKyAiLiIgKyBxdWFsaWZpZWRUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFdpbGRjYXJkVHlwZUltcG9ydHMoVHlwZSB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCVdpbGRjYXJkVHlwZSB3aWxkY2FyZFR5cGUgPSAoV2lsZGNhcmRUeXBlKSB0eXBlOwotCQlUeXBlIGJvdW5kID0gd2lsZGNhcmRUeXBlLmdldEJvdW5kKCk7Ci0JCWlmIChib3VuZCAhPSBudWxsKSB7Ci0JCQlnZXRUeXBlSW1wb3J0cyhib3VuZCwgcmVzdWx0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE2MmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1VwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIHtAbGluayBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV9Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgbmV3IEVBUiAmIFdlYiBMaWIgY2xhc3NwYXRoCi0gKiAgICAgICAgICAgICBjb250YWluZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uIGltcGxlbWVudHMgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJvdGVjdGVkIENsYXNzUGF0aFNlbGVjdGlvbiBjbGFzc1BhdGhTZWxlY3Rpb247Ci0JLy8gQWxsIHRoZSBKYXZhIGJ1aWxkIHBhdGggZW50cmllcyBjcmVhdGVkIGJ5IHRoZSBjbGFzc3BhdGggc2VsZWN0aW9uCi0JcHJvdGVjdGVkIFNldCBhbGxDbGFzc3BhdGhFbnRyaWVzOwotCXByb3RlY3RlZCBMaXN0IGFsbFVuc2VsZWN0ZWRDbGFzc3BhdGhFbnRyaWVzOwotCi0JLyoqCi0JICogVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uKElKYXZhUHJvamVjdCBhSmF2YVByb2plY3QsIENsYXNzUGF0aFNlbGVjdGlvbiBhQ2xhc3NQYXRoU2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWphdmFQcm9qZWN0ID0gYUphdmFQcm9qZWN0OwotCQljbGFzc1BhdGhTZWxlY3Rpb24gPSBhQ2xhc3NQYXRoU2VsZWN0aW9uOwotCQlhbGxDbGFzc3BhdGhFbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cnkgPSBhQ2xhc3NQYXRoU2VsZWN0aW9uLmdldENsYXNzcGF0aEVudHJpZXNGb3JTZWxlY3RlZCgpOwotCQlpZiAoY2xhc3NwYXRoRW50cnkgIT0gbnVsbCkKLQkJCWFsbENsYXNzcGF0aEVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2xhc3NwYXRoRW50cnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24oSUphdmFQcm9qZWN0IGFKYXZhUHJvamVjdCwgQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGVkLCBDbGFzc1BhdGhTZWxlY3Rpb24gdW5zZWxlY3RlZCkgewotCQlzdXBlcigpOwotCQlqYXZhUHJvamVjdCA9IGFKYXZhUHJvamVjdDsKLQkJY2xhc3NQYXRoU2VsZWN0aW9uID0gc2VsZWN0ZWQ7Ci0JCWFsbENsYXNzcGF0aEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiAhc2VsZWN0ZWQuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlhbGxDbGFzc3BhdGhFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNlbGVjdGVkLmdldENsYXNzcGF0aEVudHJpZXNGb3JTZWxlY3RlZCgpKSk7Ci0KLQkJYWxsVW5zZWxlY3RlZENsYXNzcGF0aEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh1bnNlbGVjdGVkICE9IG51bGwgJiYgIXVuc2VsZWN0ZWQuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlhbGxVbnNlbGVjdGVkQ2xhc3NwYXRoRW50cmllcy5hZGRBbGwodW5zZWxlY3RlZC5nZXRDbGFzc3BhdGhFbGVtZW50cygpKTsKLQl9Ci0KLQlwdWJsaWMgVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbihJSmF2YVByb2plY3QgYUphdmFQcm9qZWN0LCBDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0ZWQsIExpc3QgdW5zZWxlY3RlZCkgewotCQlzdXBlcigpOwotCQlqYXZhUHJvamVjdCA9IGFKYXZhUHJvamVjdDsKLQkJY2xhc3NQYXRoU2VsZWN0aW9uID0gc2VsZWN0ZWQ7Ci0JCWFsbENsYXNzcGF0aEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiAhc2VsZWN0ZWQuZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlhbGxDbGFzc3BhdGhFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNlbGVjdGVkLmdldENsYXNzcGF0aEVudHJpZXNGb3JTZWxlY3RlZCgpKSk7Ci0KLQkJYWxsVW5zZWxlY3RlZENsYXNzcGF0aEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh1bnNlbGVjdGVkICE9IG51bGwgJiYgIXVuc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWxsVW5zZWxlY3RlZENsYXNzcGF0aEVudHJpZXMuYWRkQWxsKHVuc2VsZWN0ZWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsYXNzcGF0aEVudHJ5SXNFeHBvcnRlZChMaXN0IGNwLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5LmlzRXhwb3J0ZWQoKSkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gZ2V0SW5kZXgoY3AsIGVudHJ5KTsKLQkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gbnVsbDsKLQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCW5ld0VudHJ5ID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KGVudHJ5LmdldFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJbmV3RW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZW50cnkuZ2V0UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCW5ld0VudHJ5ID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChlbnRyeSAhPSBudWxsKQotCQkJY3Auc2V0KGluZGV4LCBuZXdFbnRyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBlbnN1cmVFbGVtZW50SW5MaXN0KExpc3QgY3AsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgSUNsYXNzcGF0aEVudHJ5IHByZWRlY2Vzc29yKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBhZGRlZEVudHJ5ID0gbnVsbDsKLQkJLy8gVGhlIGVsZW1lbnQgbWlnaHQgaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIGluIHRoZSBjYXNlIG9mCi0JCS8vIHRoZSBpbXBvcnRlZF9jbGFzc2VzLmphciBmaWxlCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwRW50cmllcyA9IGVsZW1lbnQubmV3Q2xhc3NwYXRoRW50cmllcygpOwotCQlpZiAoY3BFbnRyaWVzID09IG51bGwgfHwgY3BFbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJLy8gaW5kaWNhdGVzIGFuIGludmFsaWQgZW50cnkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBwcmVkZWNlc3NvclBvcyA9IHByZWRlY2Vzc29yID09IG51bGwgPyAtMSA6IGdldEluZGV4KGNwLCBwcmVkZWNlc3Nvcik7Ci0JCWFkZGVkRW50cnkgPSBjcEVudHJpZXNbMF07Ci0JCS8vIEVuc3VyZSB0aGF0IHRoZSBmaXJzdCBpdGVtIGlzIGluIHRoZSBsaXN0LCBhbmQgZm9sbG93cwotCQkvLyB0aGUgcHJlZGVjZXNzb3IgaWYgc3BlY2lmaWVkOyBwcmVzZXJ2ZSBleGlzdGluZyBpdGVtcyBpbgotCQkvLyB0aGUgY2FzZSBvZiBzb3VyY2UgYXR0YWNobWVudHMKLQkJaW50IHBvcyA9IGdldEluZGV4KGNwLCBhZGRlZEVudHJ5KTsKLQkJaWYgKHBvcyA9PSAtMSkgewotCQkJaWYgKHByZWRlY2Vzc29yUG9zID09IC0xKQotCQkJCWNwLmFkZChhZGRlZEVudHJ5KTsKLQkJCWVsc2UKLQkJCQljcC5hZGQocHJlZGVjZXNzb3JQb3MgKyAxLCBhZGRlZEVudHJ5KTsKLQkJfSBlbHNlIHsKLQkJCWFkZGVkRW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBjcC5nZXQocG9zKTsKLQkJCWlmIChwb3MgPCBwcmVkZWNlc3NvclBvcykgewotCQkJCWNwLnJlbW92ZShhZGRlZEVudHJ5KTsKLQkJCQljcC5hZGQocHJlZGVjZXNzb3JQb3MsIGFkZGVkRW50cnkpOwotCQkJfQotCQl9Ci0JCWVuc3VyZUNsYXNzcGF0aEVudHJ5SXNFeHBvcnRlZChjcCwgYWRkZWRFbnRyeSk7Ci0KLQkJLy8gUmVtb3ZlIGFuZCBhZGQgc28gd2UgY2FuIGVuc3VyZSB0aGUgcHJvcGVyIG9yZGVyOyB0aGlzCi0JCS8vIGlzIHRoZSBjYXNlIG9mIHRoZSBpbXBvcnRlZF9jbGFzc2VzLmphcjsgd2UgYWx3YXlzIHdhbnQgaXQKLQkJLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHByb2plY3QKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjcEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IGdldEluZGV4KGNwLCBjcEVudHJpZXNbaV0pOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJYWRkZWRFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGNwLmdldChpbmRleCk7Ci0JCQkJY3AucmVtb3ZlKGluZGV4KTsKLQkJCX0gZWxzZQotCQkJCWFkZGVkRW50cnkgPSBjcEVudHJpZXNbaV07Ci0JCQlwb3MgPSBnZXRJbmRleChjcCwgY3BFbnRyaWVzWzBdKTsKLQkJCWNwLmFkZChwb3MgKyAxLCBhZGRlZEVudHJ5KTsKLQkJfQotCQlyZXR1cm4gYWRkZWRFbnRyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEluZGV4KExpc3QgY3AsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLnNpemUoKTsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZWxtdCA9IChJQ2xhc3NwYXRoRW50cnkpIGNwLmdldChpKTsKLQkJCWlmIChlbG10LmdldFBhdGgoKS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlRWxlbWVudE5vdEluTGlzdChMaXN0IGNwLCBDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3BFbnRyaWVzID0gZWxlbWVudC5uZXdDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCWlmIChjcEVudHJpZXMgPT0gbnVsbCB8fCBjcEVudHJpZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3BFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWxsQ2xhc3NwYXRoRW50cmllcy5jb250YWlucyhjcEVudHJpZXNbaV0pKQotCQkJCS8vIFRoaXMgbWF5IGJlIGluY2x1ZGVkIGluZGlyZWN0bHkgYnkgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kKLQkJCQljb250aW51ZTsKLQkJCWludCBpbmRleCA9IGdldEluZGV4KGNwLCBjcEVudHJpZXNbaV0pOwotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCWNwLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVSZW1vdmVFbGVtZW50SW5MaXN0KExpc3QgY3AsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCkgewotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcEVudHJpZXMgPSBlbGVtZW50Lm5ld0NsYXNzcGF0aEVudHJpZXMoKTsKLQkJaWYgKGNwRW50cmllcyA9PSBudWxsIHx8IGNwRW50cmllcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcC5jb250YWlucyhjcEVudHJpZXNbaV0pKSB7Ci0JCQkJaW50IGluZGV4ID0gZ2V0SW5kZXgoY3AsIGNwRW50cmllc1tpXSk7Ci0JCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCQljcC5yZW1vdmUoaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGlzIG9wZXJhdGlvbi4gUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLiBUaGlzIG1ldGhvZAotCSAqIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QsIHdoaWNoCi0JICogc3VwcGxpZXMgdGhlIHByb2dyZXNzIG1vbml0b3IuIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQKLQkgKiBhY2tub3dsZWRnZWQgYnkgdGhyb3dpbmcgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZSByZXF1ZXN0cyBmb3IKLQkgKiAgICAgICAgICAgIGNhbmNlbGF0aW9uCi0JICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlCi0JICogICAgICAgICAgICAgICAgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUKLQkgKiAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlCi0JICogICAgICAgICAgICAgICAgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCB1c2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBwcmV2UmVxdWlyZWRQcm9qZWN0cyA9IGphdmFQcm9qZWN0LmdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCk7Ci0JCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKSk7Ci0JCQlMaXN0IGNsYXNzcGF0aEVsZW1lbnRzID0gY2xhc3NQYXRoU2VsZWN0aW9uLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgcHJlZGVjZXNzb3IgPSBudWxsOwotCQkJSUNsYXNzcGF0aEVudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGNsYXNzcGF0aEVsZW1lbnRzLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudC5pc1NlbGVjdGVkKCkpIHsKLQkJCQkJcmVzdWx0ID0gZW5zdXJlRWxlbWVudEluTGlzdChjcCwgZWxlbWVudCwgcHJlZGVjZXNzb3IpOwotCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQlwcmVkZWNlc3NvciA9IHJlc3VsdDsKLQkJCQl9IGVsc2UKLQkJCQkJZW5zdXJlRWxlbWVudE5vdEluTGlzdChjcCwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlmaWx0ZXJVbnNlbGVjdGVkRW50cmllcyhjcCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDcCA9ICgoSUNsYXNzcGF0aEVudHJ5W10pIGNwLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtjcC5zaXplKCldKSk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q3AsIG1vbml0b3IpOwotCQkJdXBkYXRlUmVxdWlyZWRQcm9qZWN0cyhqYXZhUHJvamVjdCwgcHJldlJlcXVpcmVkUHJvamVjdHMsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBXRlRXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJVbnNlbGVjdGVkRW50cmllcyhMaXN0IGNwKSB7Ci0JCWlmIChhbGxVbnNlbGVjdGVkQ2xhc3NwYXRoRW50cmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFVuc2VsZWN0ZWRDbGFzc3BhdGhFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGFsbFVuc2VsZWN0ZWRDbGFzc3BhdGhFbnRyaWVzLmdldChpKTsKLQkJCQllbnN1cmVSZW1vdmVFbGVtZW50SW5MaXN0KGNwLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlcXVpcmVkUHJvamVjdHMoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBTdHJpbmdbXSBwcmV2UmVxdWlyZWRQcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIG5ld1JlcXVpcmVkUHJvamVjdHMgPSBqcHJvamVjdC5nZXRSZXF1aXJlZFByb2plY3ROYW1lcygpOwotCi0JCUFycmF5TGlzdCBwcmV2RW50cmllcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChwcmV2UmVxdWlyZWRQcm9qZWN0cykpOwotCQlBcnJheUxpc3QgbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChuZXdSZXF1aXJlZFByb2plY3RzKSk7Ci0KLQkJSVByb2plY3QgcHJvaiA9IGpwcm9qZWN0LmdldFByb2plY3QoKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBwcm9qRGVzYyA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQotCQlBcnJheUxpc3QgbmV3UmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMgPSBwcm9qRGVzYy5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VkUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjdXJyID0gcmVmZXJlbmNlZFByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCWlmIChuZXdFbnRyaWVzLnJlbW92ZShjdXJyKSB8fCAhcHJldkVudHJpZXMuY29udGFpbnMoY3VycikpIHsKLQkJCQluZXdSZWZzLmFkZChyZWZlcmVuY2VkUHJvamVjdHNbaV0pOwotCQkJfQotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBwcm9qLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgY3VyciA9IChTdHJpbmcpIG5ld0VudHJpZXMuZ2V0KGkpOwotCQkJbmV3UmVmcy5hZGQocm9vdC5nZXRQcm9qZWN0KGN1cnIpKTsKLQkJfQotCQlwcm9qRGVzYy5zZXRSZWZlcmVuY2VkUHJvamVjdHMoKElQcm9qZWN0W10pIG5ld1JlZnMudG9BcnJheShuZXcgSVByb2plY3RbbmV3UmVmcy5zaXplKCldKSk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24ocHJvakRlc2MsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL0RlZmF1bHRXU0RMU2VydmljZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvRGVmYXVsdFdTRExTZXJ2aWNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDQ5Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvRGVmYXVsdFdTRExTZXJ2aWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFdTRExTZXJ2aWNlSGVscGVyIGltcGxlbWVudHMgV1NETFNlcnZpY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlZmF1bHRXU0RMU2VydmljZUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0UG9ydE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKE9iamVjdCBwb3J0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVBvcnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXRTZXJ2aWNlUG9ydHMoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZU5hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVzcGFjZVVSSShPYmplY3QgYVNlcnZpY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKE9iamVjdCBhUG9ydCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VMb2NhbFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uU2VydmljZXMoT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oUmVzb3VyY2Ugd3NkbFJlc291cmNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShJRmlsZSB3c2lsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlKE9iamVjdCBhU2VydmljZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNXU0RMUmVzb3VyY2UoT2JqZWN0IGFSZXNvdXJjZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNEZWZpbml0aW9uKE9iamVjdCBhRGVmaW5pdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEVPYmplY3QgajJlZU9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlRXh0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjliMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VydmljZUV4dE1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgV1NETFNlcnZpY2VIZWxwZXIgZXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBXU0RMU2VydmljZUhlbHBlciBnZXRTZXJ2aWNlSGVscGVyKCkgewotCQlpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLQkJCS8vIEluaXRpYWxpemUgdGhlIFdTREwgU2VydmljZSBSZWdpc3RyeSB0byByZWdpc3RlciBleHRlbnNpb25zIGludG8gdGhpcyBtYW5hZ2VyCi0JCQlXU0RMU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuc2lvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXU0RMU2VydmljZUhlbHBlcihXU0RMU2VydmljZUhlbHBlciBleHQpIHsKLQkJZXh0ZW5zaW9uID0gZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVXU0RMU2VydmljZUhlbHBlcigpIHsKLQkJZXh0ZW5zaW9uID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgV1NETFNlcnZpY2VFeHRNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA2Yzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9OQU1FID0gIldTRExTZXJ2aWNlSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9XU0RMX0hFTFBFUiA9ICJ3c2RsSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9IRUxQRVJfQ0xBU1MgPSAiaGVscGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeSgpIHsKLQkJc3VwZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdTRExTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBXU0RMU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHcvIGFuIGV4dGVuc2lvbiBsaWtlOiA8ZWFyTW9kdWxlRXh0ZW5zaW9uIGV4dGVuc2lvbkNsYXNzID0KLQkgKiAiY29tLmlibS5ldG9vbHMud2ViLnBsdWdpbi5XZWJNb2R1bGVFeHRlbnNpb25JbXBsIi8+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9XU0RMX0hFTFBFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIGV4dGVuc2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleHRlbnNpb24gPSAoV1NETFNlcnZpY2VIZWxwZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihXU0RMX0hFTFBFUl9DTEFTUyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9IAotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0JCQlhZGRNb2R1bGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJZWxzZSAvLyBSZWdpc3RlciBkZWZhdWx0IGRvIG5vdGhpbmcgaGVscGVyLi4uLi4uCi0JCQlhZGRNb2R1bGVFeHRlbnNpb24obmV3IERlZmF1bHRXU0RMU2VydmljZUhlbHBlcigpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1vZHVsZUV4dGVuc2lvbihXU0RMU2VydmljZUhlbHBlciBleHQpIHsKLQkJV1NETFNlcnZpY2VFeHRNYW5hZ2VyLnJlZ2lzdGVyV1NETFNlcnZpY2VIZWxwZXIoZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XU0RMU2VydmljZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk1MjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBleHBhbmQgdGhlIHZpc2liaWxpdHkgb2Ygd3NkbCBhcGksIHdpdGhvdXQgYSBkaXJlY3QgZGVwZW5kZW5jeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExTZXJ2aWNlSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0VYVCA9ICJ3c2lsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoT2JqZWN0IHBvcnQpOwotCXB1YmxpYyBNYXAgZ2V0U2VydmljZVBvcnRzKE9iamVjdCBhU2VydmljZSk7Ci0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZXNwYWNlVVJJKE9iamVjdCBhU2VydmljZSk7Ci0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKEVPYmplY3QgYVNlcnZpY2UpOwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkoT2JqZWN0IGFQb3J0KTsKLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKTsKLQlwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VRTmFtZShPYmplY3QgYVNlcnZpY2UpOwotCXB1YmxpYyBNYXAgZ2V0RGVmaW5pdGlvblNlcnZpY2VzKE9iamVjdCBhRGVmaW5pdGlvbik7Ci0JcHVibGljIE9iamVjdCBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbFVSTCk7Ci0JcHVibGljIE9iamVjdCBnZXRXU0RMRGVmaW5pdGlvbihSZXNvdXJjZSB3c2RsUmVzb3VyY2UpOwotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShJRmlsZSB3c2lsKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2UoT2JqZWN0IGFTZXJ2aWNlKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1dTRExSZXNvdXJjZShPYmplY3QgYVJlc291cmNlKTsKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKTsKLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEVPYmplY3QgajJlZU9iamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5N2I4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLQotCi0vKioKLSAqIEV4dGVuc2lvbiBmb3IgZ2VuZXJhdGluZyB3ZWIgc2VydmljZSBjbGllbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfSjJFRV9DT05UQUlORVIgPSBKMkVFQ29tbW9uTWVzc2FnZXMuV2ViU2VydmljZUNsaWVudEdlbmVyYXRvcl9VSV8wOwotCi0JcHJpdmF0ZSBMaXN0IHJ1bnRpbWUgPSBudWxsOwotCi0JLyoqCi0JICogR2VuZXJhdGVzIFdlYiBzZXJ2aWNlIGNsaWVudCBhcnRpZmFjdHMgYmFzZWQgb24gaW5mb3JtYXRpb24gb2JhdGluZWQgZnJvbSB0aGUgZGF0YU1vZGVsCi0JICogKHdzZGxVUkwsIHNlcnZpY2VRTmFtZSwgb3V0cHV0V1NETEZpbGVQYXRoTmFtZSwgcHJvamVjdE5hbWUsIHNob3VsZERlcGxveSkgQWZ0ZXIgZ2VuZXJhdGluZwotCSAqIHRoZSBXZWIgc2VydmljZSBjbGllbnQgYXJ0aWZhY3RzLCBzZXRzIHRoZSBmb2xsb3dpbmcgb24gdGhlIGRhdGFNb2RlbDogc2VydmljZUludGVyZmFjZU5hbWUsCi0JICogc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSwgZGlkR2VuRGVzY3JpcHRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIFN0YXR1cyBmb3IgcmVzdWx0cwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyIGRhdGFNb2RlbCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lKExpc3Qgc2VydmVyVGFyZ2V0cykgewotCQlydW50aW1lID0gc2VydmVyVGFyZ2V0czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJUYXJnZXRzKCkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcnVudGltZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSdW50aW1lU3VwcG9ydGVkKFN0cmluZyBzZXJ2ZXJUYXJnZXRJRCkgewotCQlyZXR1cm4gZ2V0U2VydmVyVGFyZ2V0cygpLmNvbnRhaW5zKHNlcnZlclRhcmdldElEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzQ2xpZW50RGF0YUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTI5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI2LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7Ci0KLQotLyoqCi0gKiBXZWJTZXJ2aWNlc0NsaWVudERhdGFIZWxwZXIgSW50ZXJmYWNlIEV4dGVuc2lvbiAtIEZvciB1c2UgaW4gZ2VuZXJhdGluZyBXZWIgU2VydmljZSBDbGllbnRzIGJ5Ci0gKiBzaGFyaW5nIGRhdGEgYmV0d2VlbiBKMkVFIG9wZXJhdGlvbnMgYW5kIHdlYiBzZXJ2aWNlcyBvcGVyYXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIGFzc29jaWF0ZWQgb3JpZ2luYWwgV1NETCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V1NETFVybCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgUU5hbWUgb2YgZm9ybSBodHRwOi8vc29tZU5hbWVzcGFjZTpzb21lTG9jYWxQYXJ0IGZvciB0aGUgYXNzb2NpYXRlZCB3ZWIgc2VydmljZQotCSAqICAgICAgICAgZm9yIHRoZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VRTmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHByb2plY3QgZm9yIHRoZSB3ZWIgc2VydmljZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBVUkkgZm9yIHRoZSBmaWxlTmFtZSBwYXRoIGZvciB0aGUgY29waWVkIFdTREwgZmlsZSBpbnRvIHRoZSBjbGllbnQgcHJvamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V1NETEZpbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIGRlcGxveW1lbnQ/Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVwbG95KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBnZW5lcmF0ZWQgdGhlIGRlc2NyaXB0b3JzIG9yIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFNFSSBjbGFzc25hbWUgZm9yIHRoZSB3ZWIgc2VydmljZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFNJIGNsYXNzbmFtZSBmb3IgdGhlIHdlYiBzZXJ2aWNlIGNsaWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzKFN0cmluZ1tdIG5hbWVzKTsKLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIGRlc2NyaXB0b3JzIHdlcmUgZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlkR2VuRGVzY3JpcHRvcnMoYm9vbGVhbiBiKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzQ2xpZW50RGF0YVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE2MGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzQ2xpZW50RGF0YVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI2LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotLyoqCi0gKiBSZWFkIHRoZSBXZWJTZXJ2aWNlc0NsaWVudERhdGFFeHRlbnNpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzQ2xpZW50RGF0YVJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DTElFTlRfRVhURU5TSU9OX1BPSU5UID0gIldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gImdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVEFSR0VUID0gInNlcnZlclRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FID0gInJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0IHdzQ2xpZW50RGF0YUV4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeSgpIHsKLQkJc3VwZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIFdTX0NMSUVOVF9FWFRFTlNJT05fUE9JTlQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNDbGllbnREYXRhUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBXZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoR0VORVJBVE9SKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gR2V0IHRoZSBjbGFzcyBzcGVjaWZpZWQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludAotCQlXZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSAoV2ViU2VydmljZUNsaWVudEdlbmVyYXRvcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX05BTUUpOwotCQkJLy8gZ2V0IHNlcnZlciB0YXJnZXQgcnVudGltZXMKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bnRpbWVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihSVU5USU1FKTsKLQkJCUxpc3QgcnVudGltZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bnRpbWUgPSBydW50aW1lc1tpXTsKLQkJCQlTdHJpbmcgc2VydmVyVGFyZ2V0ID0gcnVudGltZS5nZXRBdHRyaWJ1dGUoU0VSVkVSX1RBUkdFVCk7Ci0JCQkJcnVudGltZUxpc3QuYWRkKHNlcnZlclRhcmdldCk7Ci0JCQl9Ci0JCQloZWxwZXIuc2V0UnVudGltZShydW50aW1lTGlzdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8vIEFkZCBkYXRhIGhlbHBlciBjbGFzcyB0byByZWdpc3RyeSBleHRlbnNpb25zIGxpc3QKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlnZXRXU0NsaWVudEdlbmVyYXRvckV4dGVuc2lvbnMoKS5hZGQoaGVscGVyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0NsaWVudEdlbmVyYXRvckV4dGVuc2lvbnMoKSB7Ci0JCWlmICh3c0NsaWVudERhdGFFeHRlbnNpb25zID09IG51bGwpCi0JCQl3c0NsaWVudERhdGFFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gd3NDbGllbnREYXRhRXh0ZW5zaW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JRUFSTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSUVBUk1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4MTcxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JRUFSTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEluIHByb2dyZXNzLi4uICAgIFNpbXBsZSBpbnRlcmZhY2UgdGhhdCBzZXJ2ZXMgdG8gdW5pZnkgdGhlIHZhcmlvdXMgbW9kZWwgYWNjZXNzIGFwaSdzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFQVJNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBwcm92aWRlcyBhIHdheSB0byBnZXQgbW9kdWxlIFVSSXMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbW9kZWwgY29udGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlVVJJKElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXApOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGNvbnRleHQgcm9vdCBpbiB0aGlzIGFwcGxpY2F0aW9uIGZvciB0aGUgcGFzc2VkIGluIHdlYiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0Ci0JICogQHJldHVybiBjb250ZXh0Um9vdCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkNvbnRleHRSb290KElQcm9qZWN0IHdlYlByb2plY3QpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIGNvbnRleHQgcm9vdCBvbiB0aGUgYXBwbGljYXRpb24gZm9yIHRoZSBwYXNzZWQgaW4gY29udGV4dFJvb3QuCi0JICogCi0JICogQHBhcmFtIHdlYlByb2plY3QKLQkgKiBAcGFyYW0gYUNvbnRleHRSb290Ci0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQ29udGV4dFJvb3QoSVByb2plY3Qgd2ViUHJvamVjdCwgU3RyaW5nIGFDb250ZXh0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4OGQwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFNpbXBsZSBKMkVFIG1vZGVsIHJlZ2lzdHJhdGlvbiBpbnRlcmZhY2UgdGhhdCBzZXJ2ZXMgdG8gdW5pZnkgdGhlIHZhcmlvdXMgbW9kZWwgYWNjZXNzIGFwaSdzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVyIHsKLQkKLQkvLyBGbGFnIHVzZWQgdG8gc2F2ZSBpbiBtZW1vcnkgbW9kZWwgd2hlbiBubyBmaWxlIGV4aXN0cy4KLQlmaW5hbCBzdGF0aWMgSVBhdGggRk9SQ0VTQVZFID0gbmV3IFBhdGgoIkZPUkNFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVzaWduYXRlZCAiZGVmYXVsdCIgbW9kZWwgZm9yIHRoZSBnaXZlbiBjb250ZXh0Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0TW9kZWxPYmplY3QoKTsKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIG1vZGVsIHNwZWNpZmljYWxseSBmb3IgYSBnaXZlbiBwYXRoIHdpdGhpbiB0aGUgbW9kZWwgY29udGV4dCwgcGF0aCBjYW4gYWxzbyBiZSB1c2VkCi0JICogdG8gZGVzaWduYXRlIHRoZSBzb3VyY2Ugb2YgdGhlIG1vZGVsICh4bWwsIGphdmEgYW5ub3RhdGlvbnMsIGV0Yy4uKQotCSAqIEBwYXJhbSBtb2RlbFBhdGgKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCU9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbFBhdGgpOwotCS8qKgotCSAqIFRoZSBtb2RpZnkgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBvbiB0aGUgbW9kZWwuICAKLQkgKiBUaGUgbW9kZWwgd2lsbCBiZSBwcm9wZXJseSBhY2Nlc3NlZCwgc2F2ZWQgYW5kIHJlbGVhc2VkCi0JICogTm90ZTogIEFsbCBpbXBsZW1lbnRvcnMgbmVlZCB0byBlbnN1cmUgYWxsIG1vZGVsIGFjY2VzcyB1c2luZyB0aGlzIGluc3RhbmNlIHdpdGhpbiB0aGUgcnVubmFibGUgYmxvY2sKLSAgICAgKiAgICAgICAgVXNlIGEgY2FjaGVkL2NvbnNpc3RlbnQgdmlldyBvZiB0aGUgbW9kZWwgdGhhdCBpcyBiZWluZyBtb2RpZmllZAotICAgICAqICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCB3cml0YWJsZSB2aWV3cywgYW5kIHNob3VsZCByZXR1cm4gYSBSdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgaXMgZGV0ZWN0ZWQKLQkgKiBAcGFyYW0gcnVubmFibGUge0BsaW5rIFJ1bm5hYmxlfSAtIFVzZXIgc3BlY2lmaWVkIGNvZGUgdGhhdCBhbHRlcnMgdGhlIG1vZGVsLiAKLQkgKiBAcGFyYW0gbW9kZWxQYXRoIHtAbGluayBJUGF0aH0gLSBPcHRpb25hbCBwYXRoIHRvIHNwZWNpZnkgd2hpY2ggbW9kZWwgaW5zdGFuY2Ugd2lsbCBiZSBtb2RpZmllZAotCSAqLwotCXZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpOwotCQotCS8qKgotCSAqIFZhbGlkYXRlIGVkaXQgZm9yIHJlc291cmNlIHN0YXRlIAotCSAqCi0JICogQHBhcmFtIG1vZGVsUGF0aCAtIFBhdGggb2YgcmVzb3VyY2UgdmVyaWZ5aW5nLCBvciBudWxsIGlmIGRlZmF1bHQgcmVzb3VyY2UuCi0JICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dCBvYmplY3QgdG8gaGVscCBkaXNwbGF5IGRpYWxvZ3MgZXRjLCBvciBudWxsLCB0aGVuIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUIHdpbGwgYmUgdXNlZAotCSAqIEByZXR1cm4gSVN0YXR1cwotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVFZGl0KElQYXRoIG1vZGVsUGF0aCwgT2JqZWN0IGNvbnRleHQpOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBtb2RlbCBjaGFuZ2VzLgotCSAqIEBwYXJhbSBsaXN0ZW5lciAKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBvZiBtb2RlbCBjaGFuZ2UgbGlzdGVuZXJzCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0lNb2RlbFByb3ZpZGVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0lNb2RlbFByb3ZpZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMWFiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm92aWRlckV2ZW50IHsKLQotCS8vIFVzZWQgd2hlbiB0aGUgZWRpdCBtb2RlbCBpcyBzYXZlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFID0gMHgxOwotCS8vIFVzZWQgd2hlbiB0aGUgY29tbWFuZCBzdGFjayBiZWNvbWVzIGRpcnR5LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUlRZID0gMHgyOwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEX1JFU09VUkNFID0gMHg0OwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIFJlc291cmNlU2V0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEX1JFU09VUkNFID0gMHg4OwotCS8vIFVzZWQgd2hlbiB0aGUgZWRpdCBtb2RlbCBpcyBkaXNwb3NlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9ESVNQT1NFID0gMHgxMDsKLQkvLyBVc2VkIHdoZW4gYSBSZXNvdXJjZSBpcyBsb2FkZWQgb3IgdGhlIGZpcnN0IG9iamVjdAotCS8vIGlzIGFkZGVkIHRvIHRoZSBjb250ZW50cyB3aGVuIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BREVEX1JFU09VUkNFID0gMHgyMDsKLQkvLyBVc2VkIHdoZW4gYSBSZXNvdXJjZSBpcyB1bmxvYWRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkxPQURFRF9SRVNPVVJDRSA9IDB4NDA7Ci0JLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpc3Qgb2Yga25vd24gcmVzb3VyY2VzIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgaXMgYWJvdXQgdG8gY2hhbmdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS05PV05fUkVTT1VSQ0VTX0FCT1VUX1RPX0NIQU5HRSA9IDB4ODA7Ci0JLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpc3Qgb2Yga25vd24gcmVzb3VyY2VzIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgaGFzIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTk9XTl9SRVNPVVJDRVNfQ0hBTkdFRCA9IDB4MTAwOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUmVzb3VyY2UoT2JqZWN0IGFSZXNvdXJjZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSZXNvdXJjZXMoQ29sbGVjdGlvbjxPYmplY3Q+IHNvbWVSZXNvdXJjZXMpOwotCi0JcHVibGljIGFic3RyYWN0IExpc3Q8T2JqZWN0PiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZGVsUHJvdmlkZXIgZ2V0TW9kZWwoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRFdmVudENvZGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENoYW5nZWRSZXNvdXJjZXMoTGlzdDxPYmplY3Q+IG5ld0NoYW5nZWRSZXNvdXJjZXMpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TW9kZWwoSU1vZGVsUHJvdmlkZXIgbmV3TW9kZWwpOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFdmVudENvZGUoaW50IG5ld0V2ZW50Q29kZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0lNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM5ZmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0lNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSBmb3IgY3JlYXRpbmcgSU1vZGVsUHJvdmlkZXIgaW5zdGFuY2VzLiAgCi0gKiBUaGVzZSBmYWN0b3JpZXMgYXJlIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgZG9tYWluL3ZlcnNpb24KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJvdmlkZXJGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3Qge0BsaW5rIElQcm9qZWN0fQotCSAqIEByZXR1cm4ge0BsaW5rIElNb2RlbFByb3ZpZGVyfQotCSAqLwotCUlNb2RlbFByb3ZpZGVyIGNyZWF0ZSAoSVByb2plY3QgYVByb2plY3QpOwotCS8qKgotCSAqIEBwYXJhbSBhQ29tcG9uZW50IHtAbGluayBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIHtAbGluayBJTW9kZWxQcm92aWRlcn0KLQkgKi8KLQlJTW9kZWxQcm92aWRlciBjcmVhdGUgKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjU4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSU1vZGVsUHJvdmlkZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciB7Ci0JLyoqCi0JICogVGVsbCBsaXN0ZW5lcnMgYWJvdXQgbW9kZWwgY2hhbmdlcwotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsc0NoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSjJFRU1vZGVsUHJvdmlkZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSjJFRU1vZGVsUHJvdmlkZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkyMzExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0oyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9OQU1FID0gIkoyRUVNb2RlbFByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9wcm92aWRlcnMgPSAicHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9QUk9WSURFUiA9ICJtb2RlbFByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfRkFDVE9SWV9DTEFTUyA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0ZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfRkFDRVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9GQUNFVF9WRVJTSU9OID0gInZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEoyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOwotCi0JcHVibGljIEoyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKEoyRUVQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKMkVFTW9kZWxQcm92aWRlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgSjJFRU1vZGVsUHJvdmlkZXJSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBwcmlvcml0eSA9IG51bGw7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfcHJvdmlkZXJzKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJTW9kZWxQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1wID0gZWxlbWVudC5nZXRDaGlsZHJlbihNT0RFTF9QUk9WSURFUik7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5ID0gKElNb2RlbFByb3ZpZGVyRmFjdG9yeSkgbXBbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQUk9WSURFUl9GQUNUT1JZX0NMQVNTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsgIC8vT3B0aW9uYWxseSByZWFkIHByaW9yaXR5IGlmIHRvIG92ZXJyaWRlIHByb3ZpZGVycyBmb3IgdHlwZQotCQkJcHJpb3JpdHkgPSBtcFswXS5nZXRBdHRyaWJ1dGUoUFJPVklERVJfUFJJT1JJVFkpOwotCQl9Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY2V0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihQUk9WSURFUl9GQUNFVCk7Ci0JCQlTdHJpbmcgZmFjZXRJZCA9IGZhY2V0WzBdLmdldEF0dHJpYnV0ZShQUk9WSURFUl9GQUNFVF9JRCk7Ci0JCQlJUHJvamVjdEZhY2V0IHB2ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWQpOwotCQkJaWYgKHB2ID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVjb2duaXplZCBmYWNldDogIiArIGZhY2V0SWQpOwotCQkJCXJldHVybiB0cnVlOyAgLy8gVW5yZWNvZ25pemVkIGZhY2V0Ci0JCQl9Ci0JCQlTdHJpbmcgZmFjZXRWZXJzaW9ucyA9IGZhY2V0WzBdLmdldEF0dHJpYnV0ZShQUk9WSURFUl9GQUNFVF9WRVJTSU9OKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZhY2V0VmVyc2lvbnMsIiwiKTsKLQkJCXdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgZmFjZXR2ZXJzaW9uID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBwdi5nZXRWZXJzaW9uKGZhY2V0dmVyc2lvbik7Ci0JCQkJaWYgKGZ2ICE9IG51bGwpCi0JCQkJCWFkZE1vZGVsUHJvdmlkZXIoZmFjdG9yeSwgZnYsIHByaW9yaXR5KTsKLQkJCX0KLQkJCQotCQkJCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1vZGVsUHJvdmlkZXIoSU1vZGVsUHJvdmlkZXJGYWN0b3J5IHByb3ZpZGVyLCBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgcHJpb3JpdHkpIHsKLQkJLy8gQ2hlY2sgcHJpb3JpdHkgb2YgZXhpc3RpbmcgcHJvdmlkZXIgZm9yIG92ZXJyaWRlCi0JCU1vZGVsUHJvdmlkZXJNYW5hZ2VyLnJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXIsdmVyc2lvbixwcmlvcml0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9Nb2RlbFByb3ZpZGVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL01vZGVsUHJvdmlkZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBmNjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL01vZGVsUHJvdmlkZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotcHVibGljIGNsYXNzIE1vZGVsUHJvdmlkZXJFdmVudCBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyRXZlbnQgewotCi0JcHJpdmF0ZSBJTW9kZWxQcm92aWRlciBtb2RlbDsKLQlwcml2YXRlIElQcm9qZWN0IHByb2o7Ci0JcHJpdmF0ZSBpbnQgZXZlbnQ7Ci0JcHJpdmF0ZSBMaXN0IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgTW9kZWxQcm92aWRlckV2ZW50KGludCBhbkV2ZW50Q29kZSwgSU1vZGVsUHJvdmlkZXIgbW9kZWwsIElQcm9qZWN0IHByb2opIHsKLQkJc2V0RXZlbnRDb2RlKGFuRXZlbnRDb2RlKTsKLQkJc2V0TW9kZWwobW9kZWwpOwotCQlzZXRQcm9qZWN0KHByb2opOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcHJvaiA9IHByb2plY3Q7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlKE9iamVjdCByZXNvdXJjZSkgewotCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZXMoQ29sbGVjdGlvbjxPYmplY3Q+IHNvbWVSZXNvdXJjZXMpIHsKLQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoc29tZVJlc291cmNlcyk7Ci0KLQl9Ci0KLQlwdWJsaWMgTGlzdDxPYmplY3Q+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCQotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV2ZW50Q29kZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGdldE1vZGVsKCkgewotCQkKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYW5nZWRSZXNvdXJjZXMoTGlzdDxPYmplY3Q+IG5ld0NoYW5nZWRSZXNvdXJjZXMpIHsKLQkJY2hhbmdlZFJlc291cmNlcyA9IG5ld0NoYW5nZWRSZXNvdXJjZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFdmVudENvZGUoaW50IG5ld0V2ZW50Q29kZSkgewotCQlldmVudCA9IG5ld0V2ZW50Q29kZTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbFByb3ZpZGVyIG5ld01vZGVsKSB7Ci0JCW1vZGVsID0gbmV3TW9kZWw7Ci0KLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2o7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9Nb2RlbFByb3ZpZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvTW9kZWxQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYmE5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9Nb2RlbFByb3ZpZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxQcm92aWRlck1hbmFnZXIgewotCQotcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFByb3ZpZGVyS2V5IHsgCi0gCQkKLQkJcHJvdGVjdGVkIElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb247Ci0JCXByb3RlY3RlZCBpbnQgcHJpb3JpdHk7Ci0JCQotCQlwdWJsaWMgTW9kZWxQcm92aWRlcktleSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhT3RoZXIpewotCQkJaWYoIHRoaXMgPT0gYU90aGVyICkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJTW9kZWxQcm92aWRlcktleSBvdGhlcktleSA9IChNb2RlbFByb3ZpZGVyS2V5KWFPdGhlcjsKLQkJCWlmKCB2ZXJzaW9uLmVxdWFscyggb3RoZXJLZXkudmVyc2lvbikgKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHZlcnNpb24uaGFzaENvZGUoKTsKLQkJfQkJCi0JfQotcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTZXRMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkvKgotCSAqIEBzZWUgQWRhcHRlciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLAotCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQlhZGRlZFJlc291cmNlKChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJcmVtb3ZlZFJlc291cmNlcygoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQotcHJpdmF0ZSBzdGF0aWMgV2Vha0hhc2hNYXAgbW9kZWxzUHJvdmlkZXJzID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUklPUklUWSA9IDEwMDsKLXByaXZhdGUgc3RhdGljIEhhc2hNYXAgcHJvdmlkZXJzOwotcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIHJlc291cmNlU2V0TGlzdGVuZXJzOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIAotCSAqIEBwYXJhbSAKLQkgKiBAcmV0dXJuIElNb2RlbFByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCBvZiB0aGUgZ2l2ZW4gdmVyc2lvbiwgTlVMTCBpZiBubyBJTW9kZWxQcm92aWRlciBleGlzdHMgZm9yIHByb2plY3QsIHZlcnNpb24gcGFpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsUHJvdmlkZXIgZ2V0TW9kZWxQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzKSB7Ci0JCQotCQlJTW9kZWxQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldFByb3ZpZGVyKHZlcnMpOwotCQlpZihmYWN0b3J5ICE9IG51bGwpewotCQkJc3RhcnRMaXN0ZW5pbmdUb1Jlc291cmNlU2V0KHByb2plY3QpOwotCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlKHByb2plY3QpOwotCQl9Ci0JCQotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gSjJFRUNvbW1vbk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKAotCQkJCUoyRUVDb21tb25NZXNzYWdlcy5FUlJfTk9fTU9ERUxfUFJPVklERVJfRk9SX1BST0pFQ1QsIG5ldyBPYmplY3RbXSB7cHJvamVjdCwgdmVyc30pOwotCQlUaHJvd2FibGUgZXJyb3IgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLQkJCi0JCUoyRUVQbHVnaW4uSU5TVEFOQ0UuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXJyb3IpOwotCQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSAKLQkgKiBAcGFyYW0gCi0JICogQHJldHVybiBJTW9kZWxQcm92aWRlciBmb3IgdGhlIGdpdmVuIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gdmVyc2lvbiwgTlVMTCBpZiBubyBJTW9kZWxQcm92aWRlciBleGlzdHMgZm9yIHZpcnR1YWwgY29tcG9uZW50L3ZlcnNpb24gcGFpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsUHJvdmlkZXIgZ2V0TW9kZWxQcm92aWRlcihJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlLCBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzKSB7Ci0KLQkJSU1vZGVsUHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRQcm92aWRlcih2ZXJzKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKXsKLQkJCUlNb2RlbFByb3ZpZGVyIG1wID0gZmFjdG9yeS5jcmVhdGUoYU1vZHVsZSk7Ci0JCQlhZGRQcm92aWRlcihtcCk7Ci0JCQlyZXR1cm4gbXA7Ci0JCX0KLQkJCi0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBKMkVFQ29tbW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkJSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9OT19NT0RFTF9QUk9WSURFUl9GT1JfUFJPSkVDVCwgbmV3IE9iamVjdFtdIHthTW9kdWxlLCB2ZXJzfSk7Ci0JCVRocm93YWJsZSBlcnJvciA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwotCQkKLQkJSjJFRVBsdWdpbi5JTlNUQU5DRS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlcnJvcik7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCQotCQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3ZpZGVyKElNb2RlbFByb3ZpZGVyIG1wKSB7Ci0JCQltb2RlbHNQcm92aWRlcnMucHV0KG1wLCBudWxsKTsKLQkJCQotCQl9Ci0JCi0JCS8qKgotCQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkZWRSZXNvdXJjZShSZXNvdXJjZSBhZGRlZFJlc291cmNlKSB7Ci0JCQlpZiAoKGFkZGVkUmVzb3VyY2UgIT0gbnVsbCkgJiYgKGFkZGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpKQotCQkJCSgoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSBhZGRlZFJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCUlQcm9qZWN0IHByb2ogPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQcm9qZWN0KGFkZGVkUmVzb3VyY2UpOwotCQkJCUlNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxQcm92aWRlckV2ZW50KElNb2RlbFByb3ZpZGVyRXZlbnQuQURERURfUkVTT1VSQ0UsIG51bGwscHJvaik7Ci0JCQkJZXZlbnQuYWRkUmVzb3VyY2UoYWRkZWRSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TW9kZWxQcm92aWRlcnMoZXZlbnQpOwotCQkJCi0JCX0KLQkJLyoqCi0JCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG5vdGlmeU1vZGVsUHJvdmlkZXJzKElNb2RlbFByb3ZpZGVyRXZlbnQgYW5FdmVudCkgewotCQlpZiAoKGFuRXZlbnQgPT0gbnVsbCkgfHwgKG1vZGVsc1Byb3ZpZGVycy5zaXplKCkgPT0gMCkpCi0JCQkJcmV0dXJuOwotCQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN5bmNocm9uaXplZCAobW9kZWxzUHJvdmlkZXJzKSB7Ci0JCQkJYUxpc3QuYWRkQWxsKG1vZGVsc1Byb3ZpZGVycy5rZXlTZXQoKSk7Ci0JCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSU1vZGVsUHJvdmlkZXIgbW9kOwotCQkJCW1vZCA9IChJTW9kZWxQcm92aWRlcikgYUxpc3QuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChtb2QgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlckxpc3RlbmVyKQotCQkJCQl7Ci0JCQkJCQkoKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIpbW9kKS5tb2RlbHNDaGFuZ2VkKGFuRXZlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQkvKioKLQkJICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZWRSZXNvdXJjZShSZXNvdXJjZSByZW1vdmVkUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2ogPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQcm9qZWN0KHJlbW92ZWRSZXNvdXJjZSk7Ci0JCQkJSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCA9IG5ldyBNb2RlbFByb3ZpZGVyRXZlbnQoSU1vZGVsUHJvdmlkZXJFdmVudC5SRU1PVkVEX1JFU09VUkNFLCBudWxsLHByb2opOwotCQkJCWV2ZW50LmFkZFJlc291cmNlKHJlbW92ZWRSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TW9kZWxQcm92aWRlcnMoZXZlbnQpOwotCQkJCi0JCX0KLQkKLQkJLyoqCi0JCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVkUmVzb3VyY2VzKExpc3QgcmVtb3ZlZFJlc291cmNlcykgewotCQkJUmVzb3VyY2UgZmlyc3RSZXMgPSAoUmVzb3VyY2UpcmVtb3ZlZFJlc291cmNlcy5nZXQoMCk7Ci0JCQlJUHJvamVjdCBwcm9qID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChmaXJzdFJlcyk7Ci0JCQkJSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCA9IG5ldyBNb2RlbFByb3ZpZGVyRXZlbnQoSU1vZGVsUHJvdmlkZXJFdmVudC5SRU1PVkVEX1JFU09VUkNFLCBudWxsLHByb2opOwotCQkJCWV2ZW50LmFkZFJlc291cmNlcyhyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCQlub3RpZnlNb2RlbFByb3ZpZGVycyhldmVudCk7Ci0JCQkKLQkJfQotCi0JLyoqCi0JICogVXNlZCB0byByZWdpc3RlciBhbiBJTW9kZWxQcm92aWRlckZhY3RvcnkgYWdhaW5zdCBhIGZhY2V0IHZlcnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXJGYWN0b3J5Ci0JICogICAgICAgICAgICAtIHtAbGluayBJTW9kZWxQcm92aWRlckZhY3Rvcnl9Ci0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIC0ge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufQotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgLSB7QGxpbmsgU3RyaW5nfS0gVXNlZCB0byBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMsIHRoZQotCSAqICAgICAgICAgICAgaGlnaGVzdCBwcmlvcml0eSBpcyBjaG9zZW4uIFByaW9yaXR5ICcwJyBpcyBoaWdoZXIgdGhhdAotCSAqICAgICAgICAgICAgcHJpb3JpdHkgJzEnLiBJZiBwcmlvcml0aWVzIGFyZSBlcXVhbCB0aGUgbmV3IHByb3ZpZGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgaXMgY2hvc2VuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclByb3ZpZGVyKElNb2RlbFByb3ZpZGVyRmFjdG9yeSBwcm92aWRlckZhY3RvcnksIElQcm9qZWN0RmFjZXRWZXJzaW9uIHYsIFN0cmluZyBwcmlvcml0eSkgewotCi0JCWludCBuZXdQcmlvcml0eSA9IChwcmlvcml0eSAhPSBudWxsKSA/IEludGVnZXIucGFyc2VJbnQocHJpb3JpdHkpIDogREVGQVVMVF9QUklPUklUWTsKLQkJaW50IGN1cnJlbnRQcmlvcml0eSA9IGdldFByb3ZpZGVyUHJpb3JpdHkodik7Ci0JCWlmIChuZXdQcmlvcml0eSA8PSBjdXJyZW50UHJpb3JpdHkpIHsKLQkJCU1vZGVsUHJvdmlkZXJLZXkga2V5ID0gY3JlYXRlUHJvdmlkZXJLZXkodiwgbmV3UHJpb3JpdHkpOwotCQkJZ2V0UHJvdmlkZXJzKCkucHV0KGtleSwgcHJvdmlkZXJGYWN0b3J5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElNb2RlbFByb3ZpZGVyRmFjdG9yeSBnZXRQcm92aWRlcihJUHJvamVjdEZhY2V0VmVyc2lvbiB2KSB7Ci0JCVNldDxNb2RlbFByb3ZpZGVyS2V5PiBrZXlzID0gZ2V0UHJvdmlkZXJzKCkua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUHJvdmlkZXJLZXkga2V5ID0gKE1vZGVsUHJvdmlkZXJLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkudmVyc2lvbi5lcXVhbHModikpCi0JCQkJcmV0dXJuIChJTW9kZWxQcm92aWRlckZhY3RvcnkpcHJvdmlkZXJzLmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UHJvdmlkZXJQcmlvcml0eShJUHJvamVjdEZhY2V0VmVyc2lvbiB2KSB7Ci0JCVNldDxNb2RlbFByb3ZpZGVyS2V5PiBrZXlzID0gZ2V0UHJvdmlkZXJzKCkua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUHJvdmlkZXJLZXkga2V5ID0gKE1vZGVsUHJvdmlkZXJLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkudmVyc2lvbi5lcXVhbHModikpCi0JCQkJcmV0dXJuIGtleS5wcmlvcml0eTsKLQkJfQotCQlyZXR1cm4gREVGQVVMVF9QUklPUklUWTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBBZGFwdGVyIGdldFJlc291cmNlU2V0TGlzdGVuZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocmVzb3VyY2VTZXRMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJlc291cmNlU2V0TGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJQWRhcHRlciBsaXN0ZW5lciA9IChBZGFwdGVyKXJlc291cmNlU2V0TGlzdGVuZXJzLmdldChwcm9qZWN0KTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCWxpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TGlzdGVuZXIoKTsKLQkJCXJlc291cmNlU2V0TGlzdGVuZXJzLnB1dChwcm9qZWN0LCBsaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEoyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJcHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVnaXN0cnkgPSBKMkVFTW9kZWxQcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9SZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQlBZGFwdGVyIGxpc3RlbmVyID0gZ2V0UmVzb3VyY2VTZXRMaXN0ZW5lcihwcm9qZWN0KTsKLQkJaWYgKHNldCAhPSBudWxsICYmICFzZXQuZUFkYXB0ZXJzKCkuY29udGFpbnMobGlzdGVuZXIpKQotCQkJc2V0LmVBZGFwdGVycygpLmFkZChsaXN0ZW5lcik7Ci0JfQotCXByaXZhdGUgc3RhdGljIE1vZGVsUHJvdmlkZXJLZXkgY3JlYXRlUHJvdmlkZXJLZXkoSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGludCBwcmlvcml0eSkgewotCQlNb2RlbFByb3ZpZGVyS2V5IGtleSA9ICBuZXcgTW9kZWxQcm92aWRlcktleSgpOwotCQlrZXkucHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJa2V5LnZlcnNpb24gPSBmdjsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNb2RlbFByb3ZpZGVyIGdldE1vZGVsUHJvdmlkZXIoSVByb2plY3QgcHJvaikgewotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBnZXREZWZhdWx0RmFjZXQocHJvaik7Ci0JCXJldHVybiBnZXRNb2RlbFByb3ZpZGVyKHByb2osIGZhY2V0VmVyc2lvbik7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZGVsUHJvdmlkZXIgZ2V0TW9kZWxQcm92aWRlcihJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IGdldERlZmF1bHRGYWNldChhTW9kdWxlKTsKLQkJcmV0dXJuIGdldE1vZGVsUHJvdmlkZXIoYU1vZHVsZSwgZmFjZXRWZXJzaW9uKTsJCQotCX0KLQotCXByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRGYWNldChJUHJvamVjdCBwcm9qKSB7Ci0JCVN0cmluZyB0eXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2opOwotCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGUpOwotCQlJRmFjZXRlZFByb2plY3QgZnAgPSBudWxsOwotCQl0cnkgewotCQkJZnAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvaik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAoZnAgIT0gbnVsbCAmJiBmYWNldCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZnAuZ2V0SW5zdGFsbGVkVmVyc2lvbihmYWNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCQkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0RmFjZXQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlTdHJpbmcgdHlwZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKGFNb2R1bGUpOwotCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGUpOwotCQlJRmFjZXRlZFByb2plY3QgZnAgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGFNb2R1bGUuaXNCaW5hcnkoKSkKLQkJCXsKLQkJCQkKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmcCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAoZnAgIT0gbnVsbCAmJiBmYWNldCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZnAuZ2V0SW5zdGFsbGVkVmVyc2lvbihmYWNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxNb2RlbFByb3ZpZGVyS2V5LCBJTW9kZWxQcm92aWRlckZhY3Rvcnk+IGdldFByb3ZpZGVycygpIHsKLQkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0UHJvdmlkZXJzKCk7Ci0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjMyMWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLQotLyoqCi0gKiBUaGlzIGV4dGVuZGVkIGl0ZW0gcHJvdmlkZXIgc3VwcG9ydHMgdHdvIGFkZGl0aW9uIGZlYXR1cmVzLCAoQGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kfSBhbmQKLSAqIHtAbGluayBDcmVhdGVDaGlsZHJlbkNvbW1hbmR9LiBUaGVzZSB0d28gYWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdW5pZm9ybWx5IG9uIGFsbCBvdXIgaXRlbQotICogYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbmV3IGNoaWxkcmVuIGZvciB7QGxpbmsgQ3JlYXRlQ2hpbGRyZW5Db21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBjcmVhdGVDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBpbWFnZSBmb3Ige0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGxvY2FsQ2hpbGRyZW5SZWZlcmVuY2VzID0gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCWlmIChsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImNyZWF0ZV9jaGlsZCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZSIgKyAvLyROT04tTkxTLTEkCi0JCQkJCSgoRVJlZmVyZW5jZSkgbG9jYWxDaGlsZHJlblJlZmVyZW5jZXMuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgY3JlYXRlIGNoaWxkcmVuIGxhYmVsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRyZW5UZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9FT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KW9iamVjdDsKLQkJQ29sbGVjdGlvbiBsb2NhbENoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAobG9jYWxDaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX1R3b19DaGlsZHJlbl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjFjb25jYXQiLCAobmV3IE9iamVjdFtdeygoRVJlZmVyZW5jZSkgbG9jYWxDaGlsZHJlblJlZmVyZW5jZXMuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBkZWZhdWx0IGNyZWF0ZSBjaGlsZHJlbiBoZWxwIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZHJlblRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGxvY2FsQ2hpbGRyZW5SZWZlcmVuY2VzID0gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCWlmIChsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIxOWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIwY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5pdGVyYXRvcigpLm5leHQoKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCksIHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIHR3byBuZXcgY2hpbGRyZW4gb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uIgotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBsYWJlbCBmb3Ige0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL0VPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3Qpb2JqZWN0OwotCQlDb2xsZWN0aW9uIGxvY2FsQ2hpbGRyZW5SZWZlcmVuY2VzID0gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCWlmIChsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfQ2hpbGRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE4Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5pdGVyYXRvcigpLm5leHQoKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBsb2NhbENoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAobG9jYWxDaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjljb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQkJfQotCQlyZXR1cm4gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBsb2NhbENoaWxkcmVuUmVmZXJlbmNlcy5pdGVyYXRvcigpLm5leHQoKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCksIHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uIgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhNmE1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vbkFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlci5Db250ZW50Vmlld2VyfXMuIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQKLSAqIE1PRiBhZGFwdGVyIG5vdGlmaWNpYXRpb25zIGludG8ge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLkRvbWFpbkV2ZW50fXMuIFRoZSBhZGFwdGVycyBhbHNvCi0gKiBzdXBwb3J0IHByb3BlcnR5IHNoZWV0cywgc2VlIHtAbGluayBjb20uaWJtLml0cC51aS5hcGkucHJvcGVydHlzaGVldH0uIE5vdGUgdGhhdCBtb3N0IG9mIHRoZQotICogYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbW1vbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uU2VjdXJpdHlSb2xlfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyIHNlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5FamJSZWZ9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFamJSZWZJdGVtUHJvdmlkZXIgZWpiUmVmSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlJlc291cmNlUmVmfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIgcmVzb3VyY2VSZWZJdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uUmVzb3VyY2VFbnZSZWZ9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlciByZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5FbnZFbnRyeX0KLQkgKiBpbnN0YW5jZXMuCi0JICovCi0JLy9JdGVtUHJvdmlkZXJzCi0JcHJvdGVjdGVkIEVudkVudHJ5SXRlbVByb3ZpZGVyIGVudkVudHJ5SXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIgc2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBSdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSWRlbnRpdHlJdGVtUHJvdmlkZXIgaWRlbnRpdHlJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIgdXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXI7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5TZWN1cml0eVJvbGVSZWZ9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIgc2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyOwotCXByb3RlY3RlZCBEaXNwb3NhYmxlIGRpc3Bvc2FibGUgPSBuZXcgRGlzcG9zYWJsZSgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KHRhcmdldCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IGFkYXB0ZXJUeXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0TmV3KHRhcmdldCwgYWRhcHRlclR5cGUpOwotCQlkaXNwb3NhYmxlLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uRWpiUmVmfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJSZWZBZGFwdGVyKCkgewotCQlpZiAoZWpiUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVqYlJlZkl0ZW1Qcm92aWRlciA9IG5ldyBFamJSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZWpiUmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5fS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmICh1c2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1c2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlciA9IG5ldyBVc2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB1c2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9ufWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9ufS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5RTmFtZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBRTmFtZUl0ZW1Qcm92aWRlciBxTmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uUU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRTmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChxTmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlxTmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBRTmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBxTmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkxpc3RlbmVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3RlbmVySXRlbVByb3ZpZGVyIGxpc3RlbmVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5MaXN0ZW5lcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJaWYgKGxpc3RlbmVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IExpc3RlbmVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3RlbmVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlpZiAoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5FbnZFbnRyeX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyKCkgewotCQlpZiAoZW52RW50cnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZW52RW50cnlJdGVtUHJvdmlkZXIgPSBuZXcgRW52RW50cnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZW52RW50cnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5SZXNvdXJjZVJlZn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyKCkgewotCQlpZiAocmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2VSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5SZXNvdXJjZUVudlJlZn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5FSkJMb2NhbFJlZn1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJMb2NhbFJlZkl0ZW1Qcm92aWRlciBlamJMb2NhbFJlZkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5FSkJMb2NhbFJlZn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlcigpIHsKLQkJaWYgKGVqYkxvY2FsUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmSXRlbVByb3ZpZGVyID0gbmV3IEVKQkxvY2FsUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYkxvY2FsUmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uU2VjdXJpdHlSb2xlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uSWRlbnRpdHl9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aXR5QWRhcHRlcigpIHsKLQkJaWYgKGlkZW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWlkZW50aXR5SXRlbVByb3ZpZGVyID0gbmV3IElkZW50aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGlkZW50aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkljb25UeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEljb25UeXBlSXRlbVByb3ZpZGVyIGljb25UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5JY29uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUljb25UeXBlQWRhcHRlcigpIHsKLQkJaWYgKGljb25UeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWljb25UeXBlSXRlbVByb3ZpZGVyID0gbmV3IEljb25UeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGljb25UeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uRGlzcGxheU5hbWV9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIgZGlzcGxheU5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uRGlzcGxheU5hbWV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBEaXNwbGF5TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIgbWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb259aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyIG1lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb259LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uUGFyYW1WYWx1ZX1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyIHBhcmFtVmFsdWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uUGFyYW1WYWx1ZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcmFtVmFsdWVBZGFwdGVyKCkgewotCQlpZiAocGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYXJhbVZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXB9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBkZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXB9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5fS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpIHsKLQkJaWYgKHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlciA9IG5ldyBSdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uU2VjdXJpdHlSb2xlUmVmfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2FibGUuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAocGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNThhM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTbWFsbCBJY29uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfc21hbGxJY29uX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX2xhcmdlSWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9sYXJnZUljb25fZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BsYXkgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwbGF5TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTiA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQyOTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uRGVzY3JpcHRpb25Hcm91cH1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQkvL2NoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERlc2NyaXB0aW9uR3JvdXAuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Rlc2NyaXB0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWVzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWVUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdGlvbkdyb3VwX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmlwdGlvbkdyb3VwLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUyA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVMgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmMTFlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9ufW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTGFuZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhbmcgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFuZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRpb25fbGFuZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdGlvbl9sYW5nX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fTGFuZygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uX3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0aW9uX3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0aW9uKSBvYmplY3QpLmdldFZhbHVlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSArICI6ICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWJkMWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkRpc3BsYXlOYW1lfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTGFuZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFuZyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9EaXNwbGF5TmFtZV9sYW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc3BsYXlOYW1lX2xhbmdfZmVhdHVyZSIsICJfVUlfRGlzcGxheU5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZV9MYW5nKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzcGxheU5hbWVfdmFsdWVfZmVhdHVyZSIsICJfVUlfRGlzcGxheU5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZV9WYWx1ZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNwbGF5TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzcGxheU5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlzcGxheU5hbWUpIG9iamVjdCkuZ2V0TGFuZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNwbGF5TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc3BsYXlOYW1lLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORyA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FSkJMb2NhbFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FSkJMb2NhbFJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBkODI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRUpCTG9jYWxSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkVKQkxvY2FsUmVmfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMb2NhbFJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIEVqYlJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCTG9jYWxSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTG9jYWxIb21lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMb2NhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb2NhbCBIb21lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYWxIb21lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX0VKQkxvY2FsUmVmX2xvY2FsSG9tZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9FSkJMb2NhbFJlZl9sb2NhbEhvbWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvY2FsIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfRUpCTG9jYWxSZWZfbG9jYWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfRUpCTG9jYWxSZWZfbG9jYWxfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSwgZmFsc2UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFSkJMb2NhbFJlZi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImVqYl9sb2NhbF9yZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRUpCTG9jYWxSZWYpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9FSkJMb2NhbFJlZl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVKQkxvY2FsUmVmLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUUgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VqYlJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FamJSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNjVlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VqYlJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLkVqYlJlZn1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBFamJSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBlamJfcmVmZXJlbmNlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGtleSA9ICgoRWpiUmVmKSBvYmplY3QpLmlzTG9jYWwoKSA/ICJlamJfbG9jYWxfcmVmX29iaiIgOiAiZWpiX3JlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShrZXkpOyAKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgRWpiUmVmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoRWpiUmVmKSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJQ29tbW9uUGFja2FnZSBwa2cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIG5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX25hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRFamJSZWZfTmFtZSgpLCB0cnVlKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB0eXBlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVHlwZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV90eXBlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0RWpiUmVmX1R5cGUoKSwgZmFsc2UpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGhvbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJIb21lX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2hvbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRFamJSZWZfSG9tZSgpLCBmYWxzZSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcmVtb3RlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVtb3RlX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3JlbW90ZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldEVqYlJlZl9SZW1vdGUoKSwgZmFsc2UpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGxpbmsgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMaW5rX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2xpbmtfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRFamJSZWZfTGluaygpLCBmYWxzZSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldEVqYlJlZl9EZXNjcmlwdGlvbigpLCB0cnVlKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBjbGllbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQkvKgotCQkJICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkgKiBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDbGllbnRfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9jbGllbnRfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCSAqIHBrZy5nZXRFamJSZWZfQ2xpZW50KCkpKTsKLQkJCSAqLwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgd2ViQXBwIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViQXBwX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkgKiBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfd2ViQXBwX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkgKiBwa2cuZ2V0RWpiUmVmX1dlYkFwcCgpKSk7Ci0JCQkgKi8KLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGVqYiBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgLy8gbmV4dCBmb3VyCi0JCQkgKiBsaW5lcyBmb3IgMTc1MzMzIC8vUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRWpiX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkgKiAiRUpCIiwvLyROT04tTkxTLTEkIC8vUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2VqYl9wcm9wZXJ0eV9VSV8iKSwKLQkJCSAqIC8vJE5PTi1OTFMtMSQgUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX0VKQl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUKLQkJCSAqIEVKQiBwcm9wZXJ0eSIgcGtnLmdldEVqYlJlZl9FamIoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FamJSZWZfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FamJSZWZfbmFtZV9mZWF0dXJlIiwgIl9VSV9FamJSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FamJSZWZfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FamJSZWZfdHlwZV9mZWF0dXJlIiwgIl9VSV9FamJSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSG9tZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIb21lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FamJSZWZfaG9tZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FamJSZWZfaG9tZV9mZWF0dXJlIiwgIl9VSV9FamJSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVtb3RlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlbW90ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRWpiUmVmX3JlbW90ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FamJSZWZfcmVtb3RlX2ZlYXR1cmUiLCAiX1VJX0VqYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRWpiUmVmX2xpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWpiUmVmX2xpbmtfZmVhdHVyZSIsICJfVUlfRWpiUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0xpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FamJSZWZfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWpiUmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0VqYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVKQkxvY2FsUmVmKQotCQkJcmV0dXJuICJFamJMb2NhbFJlZiAiICsgKChFSkJMb2NhbFJlZikgb2JqZWN0KS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICJFamJSZWYgIiArICgoRWpiUmVmKSBvYmplY3QpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFamJSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59dG8gcmV0dXJuIHRoZSBlbXB0eQotCSAqIGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndCBiZSBhbnkgY2hpbGRyZW4sIHNvCi0JICogdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FbnZFbnRyeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FbnZFbnRyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMxYzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRW52RW50cnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uRW52RW50cnl9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRW52RW50cnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBFbnZFbnRyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGVudmlyb25tZW50X2VudGl0eS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlbnZpcm9ubWVudF9lbnRpdHkiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEVudkVudHJ5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQotCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyBudWxsIDogKChFbnZFbnRyeSkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCUNvbW1vblBhY2thZ2UgcGtnID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rlc2NyaXB0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgbmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfbmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldEVudkVudHJ5X05hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdmFsdWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJWYWx1ZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV92YWx1ZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldEVudkVudHJ5X1ZhbHVlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHR5cGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUeXBlX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3R5cGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRFbnZFbnRyeV9UeXBlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldEVudkVudHJ5X1dlYkFwcCgpKSk7Ci0JCQkgKi8KLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGNsaWVudCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2NsaWVudF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldEVudkVudHJ5X0NsaWVudCgpKSk7Ci0JCQkgKi8KLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VudkVudHJ5X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VudkVudHJ5X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0VudkVudHJ5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRW52RW50cnlfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbnZFbnRyeV9uYW1lX2ZlYXR1cmUiLCAiX1VJX0VudkVudHJ5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VudkVudHJ5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VudkVudHJ5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0VudkVudHJ5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRW52RW50cnlfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbnZFbnRyeV90eXBlX2ZlYXR1cmUiLCAiX1VJX0VudkVudHJ5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIkVudkVudHJ5ICIgKyAoKEVudkVudHJ5KSBvYmplY3QpLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVudkVudHJ5LmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19WQUxVRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufXRvIHJldHVybiB0aGUgZW1wdHkKLQkgKiBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QgYmUgYW55IGNoaWxkcmVuLCBzbwotCSAqIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSWNvblR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSWNvblR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhOGNkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0ljb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkljb25UeXBlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWNvblR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNtYWxsIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9JY29uVHlwZV9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSWNvblR5cGVfc21hbGxJY29uX2ZlYXR1cmUiLCAiX1VJX0ljb25UeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SWNvblR5cGVfU21hbGxJY29uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYXJnZSBJY29uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSWNvblR5cGVfbGFyZ2VJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ljb25UeXBlX2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9JY29uVHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEljb25UeXBlX0xhcmdlSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFuZyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9JY29uVHlwZV9sYW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ljb25UeXBlX2xhbmdfZmVhdHVyZSIsICJfVUlfSWNvblR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYW5nKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEljb25UeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSWNvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSWNvblR5cGUpIG9iamVjdCkuZ2V0U21hbGxJY29uKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9JY29uVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0ljb25UeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSWNvblR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBUkdFX0lDT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0lkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0lkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTEzOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9JZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uSWRlbnRpdHl9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlDb21tb25QYWNrYWdlIHBrZyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQkJOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfb2ZfdGhlX2lkZW50aXR5XzIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcm9sZU5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJSb2xlIE5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3JvbGVfbmFtZV9wcm9wZXJ0eV9vZl90aGVfaWRlbnRpdHlfNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9JZGVudGl0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JZGVudGl0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9JZGVudGl0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0lkZW50aXR5X3JvbGVOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lkZW50aXR5X3JvbGVOYW1lX2ZlYXR1cmUiLCAiX1VJX0lkZW50aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIElkZW50aXR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIElkZW50aXR5LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInNlY3VyaXR5X2lkZW50aXR5X29iaiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlJZGVudGl0eSBpZGVudGl0eSA9ICgoSWRlbnRpdHkpIG9iamVjdCk7Ci0JCXJldHVybiAiSWRlbnRpdHkgIiArIGlkZW50aXR5LmdldFJvbGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSWRlbnRpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0pORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMyNDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLkpORElFbnZSZWZzR3JvdXB9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKTkRJRW52UmVmc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEpORElFbnZSZWZzR3JvdXAuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KTkRJRW52UmVmc0dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEpORElFbnZSZWZzR3JvdXApIG9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0pORElFbnZSZWZzR3JvdXBfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9KTkRJRW52UmVmc0dyb3VwX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSk5ESUVudlJlZnNHcm91cC5jbGFzcykpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUyA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlMgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnZFbnRyeSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFamJSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMb2NhbFJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VFbnZSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiTG9jYWxSZWZzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVKQkxvY2FsUmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcXVhbGlmeSA9IGZlYXR1cmUgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkgfHwgZmVhdHVyZSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpOwotCQlyZXR1cm4gZ2V0U3RyaW5nKHF1YWxpZnkgPyAiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiA6ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQluZXcgT2JqZWN0W117Z2V0VHlwZVRleHQoY2hpbGQpLCBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9MaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9MaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMzZDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIExpc3RlbmVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTGlzdGVuZXIuZ2lmCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJsaXN0ZW5lciIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgTGlzdGVuZXIuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJCUNvbW1vblBhY2thZ2Ugd2FwID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBsaXN0ZW5lckNsYXNzIGZlYXR1cmUuCi0KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkxpc3RlbmVyQ2xhc3MiLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX0xpc3RlbmVyQ2xhc3NfcHJvcGVydHlfMiIpLCB3YXAuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGlzdGVuZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTGlzdGVuZXJfbGlzdGVuZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaXN0ZW5lcl9saXN0ZW5lckNsYXNzX2ZlYXR1cmUiLCAiX1VJX0xpc3RlbmVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCB0cnVlKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcikgb2JqZWN0OwotCQlTdHJpbmcgbmFtZSA9IGxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gIjxsaXN0ZW5lcj4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL01lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjUzMjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXNzYWdlRGVzdGluYXRpb25fbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXNzYWdlRGVzdGluYXRpb25fbmFtZV9mZWF0dXJlIiwgIl9VSV9NZXNzYWdlRGVzdGluYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXNzYWdlRGVzdGluYXRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tc2dkcml2ZW5kZXN0aW5hdGlvbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG1kID0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1lc3NhZ2VEZXN0aW5hdGlvbl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFiZWwgPSAoKE1lc3NhZ2VEZXN0aW5hdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBtZCA6IG1kICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9NZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTEzYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9NZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVXNhZ2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX25hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX05hbWUoKSwgdHJ1ZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlR5cGVfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV90eXBlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCksIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNhZ2UgZmVhdHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2FnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVzYWdlX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdXNhZ2VfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCksIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBmZWF0dXJlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMaW5rX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfbGlua19wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTGluaygpLCB0cnVlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXNzYWdlRGVzdGluYXRpb25SZWYuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXNzYWdlRGVzdGluYXRpb25SZWYpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1lc3NhZ2VEZXN0aW5hdGlvblJlZkl0ZW1Qcm92aWRlcl9VSV8wIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkLCAkTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0UgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MSU5LIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9QYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTFkYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9QYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5QYXJhbVZhbHVlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1BhcmFtVmFsdWVfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYXJhbVZhbHVlX25hbWVfZmVhdHVyZSIsICJfVUlfUGFyYW1WYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUGFyYW1WYWx1ZV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYXJhbVZhbHVlX3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX1BhcmFtVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX1ZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9QYXJhbVZhbHVlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhcmFtVmFsdWVfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfUGFyYW1WYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEVSZWZlcmVuY2U+KCk7Ci0vLwkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0vLwkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotLy8JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotICAgIC8qKgotCSAqIFRoaXMgcmV0dXJucyBQYXJhbVZhbHVlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImluaXRpYWxpel9wYXJhbWV0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUGFyYW1WYWx1ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCVN0cmluZyB2YWx1ZSA9ICgoUGFyYW1WYWx1ZSkgb2JqZWN0KS5nZXRWYWx1ZSgpOwotLy8JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1BhcmFtVmFsdWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotLy8JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUGFyYW1WYWx1ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1BhcmFtVmFsdWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbGFiZWwgKyAiID0gIiArICh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1BhcmFtVmFsdWVfdmFsdWUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGFyYW1WYWx1ZS5jbGFzcykpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLS8vCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0vLwotLy8JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1FOYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1FOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2VjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9RTmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5RTmFtZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUU5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTG9jYWxQYXJ0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQkvL2FkZENvbWJpbmVkUU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCS8vYWRkSW50ZXJuYWxQcmVmaXhPck5zVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lc3BhY2UgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9RTmFtZV9uYW1lc3BhY2VVUklfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUU5hbWVfbmFtZXNwYWNlVVJJX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYWwgUGFydCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb2NhbFBhcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUU5hbWVfbG9jYWxQYXJ0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1FOYW1lX2xvY2FsUGFydF9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbWJpbmVkIFFOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbWJpbmVkUU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1FOYW1lX2NvbWJpbmVkUU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUU5hbWVfY29tYmluZWRRTmFtZV9mZWF0dXJlIiwgIl9VSV9RTmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEludGVybmFsIFByZWZpeCBPciBOcyBVUkkgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJuYWxQcmVmaXhPck5zVVJJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9RTmFtZV9pbnRlcm5hbFByZWZpeE9yTnNVUklfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUU5hbWVfaW50ZXJuYWxQcmVmaXhPck5zVVJJX2ZlYXR1cmUiLCAiX1VJX1FOYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFFOYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgicW5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9RTmFtZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCgoUU5hbWUpIG9iamVjdCkuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCAmJiAoKChRTmFtZSkgb2JqZWN0KS5nZXRMb2NhbFBhcnQoKSAhPSBudWxsKSkgewotCQkJbGFiZWwgPSBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1FOYW1lX3R5cGUiKSArICIgIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJKChRTmFtZSkgb2JqZWN0KS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArICgoUU5hbWUpIG9iamVjdCkuZ2V0TG9jYWxQYXJ0KCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChRTmFtZS5jbGFzcykpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzY4MGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlJlc291cmNlUmVmfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyByZXNvdXJjZV9yZWZlcmVuY2UuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzX2Vudl9yZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgUmVzb3VyY2VSZWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyBudWxsIDogKChSZXNvdXJjZUVudlJlZikgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCUNvbW1vblBhY2thZ2UgcGtnID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rlc2NyaXB0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb24oKSwgdHJ1ZSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgbmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfbmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFJlc291cmNlRW52UmVmX05hbWUoKSwgdHJ1ZSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdHlwZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlR5cGVfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdHlwZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFJlc291cmNlRW52UmVmX1R5cGUoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlRW52UmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlRW52UmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlRW52UmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VFbnZSZWZfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUVudlJlZl9uYW1lX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlRW52UmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUVudlJlZl90eXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlRW52UmVmX3R5cGVfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VFbnZSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9UeXBlKCksIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIlJlc291cmNlRW52UmVmICIgKyAoKFJlc291cmNlRW52UmVmKSBvYmplY3QpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZUVudlJlZi5jbGFzcykpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59dG8gcmV0dXJuIHRoZSBlbXB0eQotCSAqIGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndCBiZSBhbnkgY2hpbGRyZW4sIHNvCi0JICogdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZVJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU2NDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotCi07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uUmVzb3VyY2VSZWZ9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHJlc291cmNlX3JlZmVyZW5jZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZV9yZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBSZXNvdXJjZVJlZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiAoKFJlc291cmNlUmVmKSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJQ29tbW9uUGFja2FnZSBwa2cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBrZy5nZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBuYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9uYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0UmVzb3VyY2VSZWZfTmFtZSgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB0eXBlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVHlwZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV90eXBlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0UmVzb3VyY2VSZWZfVHlwZSgpLCBmYWxzZSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgYXV0aCBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkF1dGhfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfYXV0aF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFJlc291cmNlUmVmX0F1dGgoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgbGluayBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxpbmtfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9saW5rX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkgKiBwa2cuZ2V0UmVzb3VyY2VSZWZfTGluaygpKSk7Ci0JCQkgKi8KLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGNsaWVudCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2NsaWVudF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldFJlc291cmNlUmVmX0NsaWVudCgpKSk7Ci0JCQkgKi8KLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldFJlc291cmNlUmVmX1dlYkFwcCgpKSk7Ci0JCQkgKi8KLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlUmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlUmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VSZWZfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZVJlZl9uYW1lX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZVJlZl90eXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlUmVmX3R5cGVfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9UeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRoIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlUmVmX2F1dGhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VSZWZfYXV0aF9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZVJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0F1dGgoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VSZWZfbGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZVJlZl9saW5rX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfTGluaygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVzIFNoYXJpbmcgU2NvcGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzU2hhcmluZ1Njb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZVJlZl9yZXNTaGFyaW5nU2NvcGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VSZWZfcmVzU2hhcmluZ1Njb3BlX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAiUmVzb3VyY2VSZWYgIiArICgoUmVzb3VyY2VSZWYpIG9iamVjdCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlUmVmLmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFIDoKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0FVVEggOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSyA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIEl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn10byByZXR1cm4gdGhlIGVtcHR5Ci0JICogZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0IGJlIGFueSBjaGlsZHJlbiwgc28KLQkgKiB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNmZDJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5fQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlciBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBSdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJQ29tbW9uUGFja2FnZSBwa2cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGlkZW50aXR5IGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiSWRlbnRpdHkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2lkZW50aXR5X29mX3RoZV9ydW5fYXNfc3BlY2lmaWVkX2lkZW50aXR5XzIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCSAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxFUmVmZXJlbmNlPigpOwotLy8JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotLy8JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLS8vCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2VjdXJpdHlfaWRlbnRpdHlfb2JqIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcnVuQXNTcGVjaWZpZWRJZGVudGl0eSA9ICgoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSkgb2JqZWN0KTsKLQkJcmV0dXJuIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2V0SWRlbnRpdHkoKS5nZXRSb2xlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpdHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzYzZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5fW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCUNvbW1vblBhY2thZ2UgcGtnID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9vZl90aGVfc2VjdXJpdHlfaWRlbnRpdHlfMiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlY3VyaXR5SWRlbnRpdHlfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlJZGVudGl0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN1cml0eUlkZW50aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBTZWN1cml0eUlkZW50aXR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlY3VyaXR5SWRlbnRpdHkuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZW52aXJvbm1lbnRfZW50aXR5Iik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9ICgoU2VjdXJpdHlJZGVudGl0eSkgb2JqZWN0KTsKLQkJcmV0dXJuICJTZWN1cml0eUlkZW50aXR5ICIgKyBzZWN1cml0eUlkZW50aXR5LmdldERlc2NyaXB0aW9uKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdXJpdHlJZGVudGl0eS5jbGFzcykpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eVJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMGE1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5TZWN1cml0eVJvbGV9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgc2VjdXJpdHlfcm9sZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBTZWN1cml0eVJvbGUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyBudWxsIDogKChTZWN1cml0eVJvbGUpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlDb21tb25QYWNrYWdlIHBrZyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByb2xlTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJvbGVOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3JvbGVOYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQXBwbGljYXRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9hcHBsaWNhdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldFNlY3VyaXR5Um9sZV9BcHBsaWNhdGlvbigpKSk7Ci0JCQkgKi8KLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJICogcGtnLmdldFNlY3VyaXR5Um9sZV9XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVJvbGVfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlSb2xlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5Um9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVJvbGVfcm9sZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlSb2xlX3JvbGVOYW1lX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5Um9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICIgIiArICgoU2VjdXJpdHlSb2xlKSBvYmplY3QpLmdldFJvbGVOYW1lKCk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZWN1cml0eVJvbGUuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRSA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIEl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn10byByZXR1cm4gdGhlIGVtcHR5Ci0JICogZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0IGJlIGFueSBjaGlsZHJlbiwgc28KLQkgKiB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZVJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2M2FmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZVJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlNlY3VyaXR5Um9sZVJlZn1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBzZWN1cml0eV9yb2xlX3JlZmVyZW5jZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlX3JlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHNlcnZsZXQgb2YgdGhlIFNlY3VyaXR5Um9sZVJlZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiAoKFNlY3VyaXR5Um9sZVJlZikgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCUNvbW1vblBhY2thZ2UgcGtnID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBuYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9uYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBsaW5rIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTGlua19VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9saW5rX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSwgZmFsc2UpKTsKLQotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlY3VyaXR5Um9sZVJlZl9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3VyaXR5Um9sZVJlZl9uYW1lX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5Um9sZVJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VjdXJpdHlSb2xlUmVmX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3VyaXR5Um9sZVJlZl9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN1cml0eVJvbGVSZWZfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VjdXJpdHlSb2xlUmVmX2xpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlSb2xlUmVmX2xpbmtfZmVhdHVyZSIsICJfVUlfU2VjdXJpdHlSb2xlUmVmX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAiU2VjdXJpdHlSb2xlUmVmICIgKyAoKFNlY3VyaXR5Um9sZVJlZikgb2JqZWN0KS5nZXROYW1lKCk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZWN1cml0eVJvbGVSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUUgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0xJTksgOgotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufXRvIHJldHVybiB0aGUgZW1wdHkKLQkgKiBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QgYmUgYW55IGNoaWxkcmVuLCBzbwotCSAqIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhYjk5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1VzZUNhbGxlcklkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHl9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgVXNlQ2FsbGVySWRlbnRpdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVXNlQ2FsbGVySWRlbnRpdHkuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2VjdXJpdHlfaWRlbnRpdHlfb2JqIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVVzZUNhbGxlcklkZW50aXR5IHVzZUNhbGxlcklkZW50aXR5ID0gKChVc2VDYWxsZXJJZGVudGl0eSkgb2JqZWN0KTsKLQkJcmV0dXJuICJVc2VDYWxsZXJJZGVudGl0eSAiICsgdXNlQ2FsbGVySWRlbnRpdHkuZ2V0RGVzY3JpcHRpb24oKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUzMDhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbW1vbmVkaXQiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9JSjJFRUNvbW1vbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9JSjJFRUNvbW1vbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU2ZjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSUoyRUVDb21tb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFQ29tbW9uQ29uc3RhbnRzIHsKLQotCS8vSjJFRSBQcmVmZXJlbmNlcwotCS8vIEoyRUVfTkFWSUdBVE9SX0xJTktJTkdfUFJFRkVSRU5DRSBzcGVjaWZpZXMgd2hldGhlciB0aGUgSjJFRSBOYXZpZ2F0b3IKLQkvLyBzZWxlY3Rpb24gc2hvdWxkIGJlIGxpbmtlZCB0byB0aGUgYWN0aXZlIGVkaXRvci4KLQkvLyBJdCBpcyBhIGJvb2xlYW4gdmFsdWUsIGFuZCB0aGUgZGVmYXVsdCBpcyB0cnVlLgotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9OQVZJR0FUT1JfTElOS0lOR19QUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLnVpLnByZWZlcmVuY2UuajJlZU5hdmlnYXRvckxpbmtpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlLmoyZWVWZXJzaW9uIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fMV8yID0gIkoyRUVfMV8yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMyA9ICJKMkVFXzFfMyI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OX1BSRUZfTEFCRUwgPSBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X3RoZV9oaWdoZXN0X0oyRUVfdmVyc2lvbl90aGF0X2lzX3RvX2JlX3VzZWRfX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNBVkVfT05fQklOQVJZX1BST0pFQ1RfVElUTEUgPSBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0FWRV9PTl9CSU5BUllfUFJPSkVDVF9USVRMRV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0FWRV9PTl9CSU5BUllfUFJPSkVDVF9NRVNTQUdFID0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNBVkVfT05fQklOQVJZX1BST0pFQ1RfTUVTU0FHRV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSVN0cnVjdHVyZWRUZXh0RWRpdGluZ0RvbWFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9JU3RydWN0dXJlZFRleHRFZGl0aW5nRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjk4ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9JU3RydWN0dXJlZFRleHRFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNwZWNpYWxpemVkIGVkaXRpbmcgZG9tYWluIHRoYXQgY2FuIGJlIHVzZWQgYnkgZWRpdG9ycyB0aGF0IGhhdmUgb25lIG9yIG1vcmUgZGVzaWduCi0gKiBwYWdlcyB0aGF0IHZpZXcgYSBNT0YgbW9kZWwgYW5kIGEgc291cmNlIHBhZ2UgdGhhdCBjb250YWlucyBhbiBYTUwgTW9kZWwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0RWRpdGluZ0RvbWFpbiBleHRlbmRzIEVkaXRpbmdEb21haW4gewotCS8qKgotCSAqIEV4ZWN1dGUgYSBjb21tYW5kIHdpdGhpbiB0aGUgZWRpdGluZyBkb21haW4uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogRXhlY3V0ZSBhIGNvbW1hbmQgd2l0aGluIHRoZSBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nIGxhYmVsLCBDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBieSB0aGlzIGRvbWFpbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpOwotCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgbmV3VW5kb01hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9TdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vU3RydWN0dXJlZFRleHRFZGl0aW5nRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTRkYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9TdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzcGVjaWFsaXplZCBlZGl0aW5nIGRvbWFpbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGVkaXRvcnMgdGhhdCBoYXZlIG9uZSBvciBtb3JlIGRlc2lnbgotICogcGFnZXMgdGhhdCB2aWV3IGEgTU9GIG1vZGVsIGFuZCBhIHNvdXJjZSBwYWdlIHRoYXQgY29udGFpbnMgYW4gWE1MIE1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRFZGl0aW5nRG9tYWluIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0RWRpdGluZ0RvbWFpbiB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRFZGl0aW5nRG9tYWluIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VTZXQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBjb21tYW5kIHdpdGhpbiB0aGUgZWRpdGluZyBkb21haW4uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJZXhlY3V0ZShjb21tYW5kLmdldExhYmVsKCksIGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBjb21tYW5kIHdpdGhpbiB0aGUgZWRpdGluZyBkb21haW4uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgbGFiZWwsIENvbW1hbmQgY29tbWFuZCkgewotCQlleGVjdXRlVmlhVW5kb01hbmFnZXIobGFiZWwsIGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBjb21tYW5kIGRpcmVjdGx5IG9uIHRoZSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZVZpYVN0YWNrKENvbW1hbmQgY29tbWFuZCkgewotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBjb21tYW5kIHdpdGhpbiB0aGUgZWRpdGluZyBkb21haW4uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZVZpYVVuZG9NYW5hZ2VyKFN0cmluZyBsYWJlbCwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJaWYgKHVuZG9NYW5hZ2VyICE9IG51bGwpIHsKLQkJCQl1bmRvTWFuYWdlci5iZWdpblJlY29yZGluZyh0aGlzLCBsYWJlbCk7Ci0JCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJdW5kb01hbmFnZXIuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfSBlbHNlCi0JCQkJZXhlY3V0ZVZpYVN0YWNrKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCkgewotCQlyZXR1cm4gdW5kb01hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgbmV3VW5kb01hbmFnZXIpIHsKLQkJdW5kb01hbmFnZXIgPSBuZXdVbmRvTWFuYWdlcjsKLQkJdW5kb01hbmFnZXIuc2V0Q29tbWFuZFN0YWNrKGNvbW1hbmRTdGFjayk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQ1NDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRUNvbnRlbnREZXNjcmliZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRUNvbnRlbnREZXNjcmliZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MjVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbnRlbnR0eXBlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbnRlbnR0eXBlL0oyRUVDb250ZW50RGVzY3JpYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLQotLyoqCi0gKiBBIGNvbnRlbnQgZGVzY3JpYmVyIGZvciBkZXRlY3RpbmcgYSBqMmVlIG1vZHVsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSjJFRUNvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJQ29udGVudERlc2NyaWJlciB7Ci0JcHVibGljIEoyRUVDb250ZW50RGVzY3JpYmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBKRUVWRVJTSU9OID0gbmV3IFF1YWxpZmllZE5hbWUoImplZS12ZXJzaW9uIiwgIjEuNCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGNvbnRlbnRzKTsKLQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOgotCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFOgotCQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VmVyc2lvbigpKSB7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5KMkVFXzFfMl9JRDoKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkoyRUVfMV8zX0lEOgotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuSjJFRV8xXzRfSUQ6Ci0JCQkJcmV0dXJuIFZBTElEOwotCQkJfQotCQkJcmV0dXJuIElOVkFMSUQ7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgotCQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VmVyc2lvbigpKSB7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5KQ0FfMV8wX0lEOgotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuSkNBXzFfNV9JRDoKLQkJCQlyZXR1cm4gVkFMSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6Ci0JCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRWZXJzaW9uKCkpIHsKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl8xXzFfSUQ6Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfMl8wX0lEOgotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCXzJfMV9JRDoKLQkJCQlyZXR1cm4gVkFMSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRWZXJzaW9uKCkpIHsKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl8yXzJfSUQ6Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfMl8zX0lEOgotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCXzJfNF9JRDoKLQkJCQlyZXR1cm4gVkFMSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJfQotCi0JCXJldHVybiBJTlZBTElEOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQkJLy8gdGhpcyBpcyBub3QgdXNlZAotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWVbXSB7IEpFRVZFUlNJT04gfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRVNwZWNGaW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRVNwZWNGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2NzA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbnRlbnR0eXBlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbnRlbnR0eXBlL0oyRUVTcGVjRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBKYXZhRUVRdWlja1BlZWt9Ci0gKiBAYXV0aG9yIGphc2hvbGwKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRVNwZWNGaW5kZXIgewotCi0JLyoqCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBKYXZhRUVRdWlja1BlZWt9Ci0JICogCi0JICogQHBhcmFtIGluCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZhc3RTcGVjVmVyc2lvbihJbnB1dFN0cmVhbSBpbikgewotCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGluKTsKLQkJaW50IHZlcnNpb24gPSBxcC5nZXRWZXJzaW9uKCk7Ci0JCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyh2ZXJzaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MTdhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlMaXN0IGNvbXBvbmVudHMgPSAoTGlzdCkgZ2V0UHJvcGVydHkoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50cy5nZXQoaSk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCQkJCWlmKG5hbWUgIT0gbnVsbCkKLQkJCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnICcsJ18nKTsKLQkJCQkKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVI7Ci0JCQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfUkFSOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5hbWUgKz0gSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsKLQkJCQl9Ci0JCQkJbWFwLnB1dChjb21wb25lbnQsIG5hbWUpOwotCQkJfQotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBtYXApOwotCQkJcmV0dXJuIG1hcDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AobW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmViOGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFJ1bnRpbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wIGV4dGVuZHMgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtZXRhSW5mRm9sZGVyRGVwbG95UGF0aCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAzKTsKLQkJfQotCQl0cnkgewotCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKLQkJCUlTdGF0dXMgIHN0YXR1cyA9IHZhbGlkYXRlRWRpdEVBUigpOwotCQkJaWYoIHN0YXR1cy5pc09LKCkgKXsKLQkJCQlzdGF0dXMgPSBzdXBlci5leGVjdXRlKHN1Ym1vbihtb25pdG9yLCAxKSwgaW5mbyk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJdXBkYXRlRUFSREQoc3VibW9uKG1vbml0b3IsIDEpKTsKLQkJCQl1cGRhdGVNb2R1bGVSdW50aW1lcyhzdWJtb24obW9uaXRvciwgMSkpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucmVzdW1lVXBkYXRlcygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWJvb2xlYW4gdXNlQXJjaGl2ZVVSSSA9IHRydWU7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShjb21wLmdldFByb2plY3QoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdXNlQXJjaGl2ZVVSSSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKHVzZUFyY2hpdmVVUkkgJiYgZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpKSB7Ci0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSk7Ci0JCQl1c2VBcmNoaXZlVVJJID0gcHJvamVjdEZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHByb2plY3RGYWNldCk7Ci0JCX0KLQkJaWYgKHVzZUFyY2hpdmVVUkkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBcmNoaXZlTmFtZShjb21wKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFQVJERChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCVN0cnVjdHVyZUVkaXQgc2UgPSBudWxsOwotCQl0cnkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQkJZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwgPSAoSUVBUk1vZGVsUHJvdmlkZXIpTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihzb3VyY2VDb21wLmdldFByb2plY3QoKSk7Ci0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXIgPSAoSVZpcnR1YWxDb21wb25lbnQpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQkJZmluYWwgSVByb2plY3QgZWFycGogPSBlYXIuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChlYXJNb2RlbCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCWZpbmFsIE1hcCBtYXAgPSAoTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVApOwotCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJU3RydWN0dXJlRWRpdCBjb21wc2UgPSBudWxsOwotCQkJCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgd2MgPSAoSVZpcnR1YWxDb21wb25lbnQpIGxpc3QuZ2V0KGkpOwotCQkJCQkJYm9vbGVhbiBsaW5rZWRUb0VBUiA9IHRydWU7Ci0JCQkJCQl0cnl7Ci0JCQkJCQkJaWYod2MuaXNCaW5hcnkoKSl7Ci0JCQkJCQkJCWxpbmtlZFRvRUFSID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpd2MpLmlzTGlua2VkVG9FQVIoKTsKLQkJCQkJCQkJKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpd2MpLnNldExpbmtlZFRvRUFSKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJV29ya2JlbmNoQ29tcG9uZW50IGVhcndjID0gc2UuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY29tcHNlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUod2MuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQkJV29ya2JlbmNoQ29tcG9uZW50IHJlZndjID0gY29tcHNlLmdldENvbXBvbmVudCgpOwotCQkJCQkJCQlmaW5hbCBSZWZlcmVuY2VkQ29tcG9uZW50IHJlZiA9IHNlLmZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KGVhcndjLCByZWZ3Yyk7Ci0JCQkJCQkJCWVhck1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJZmluYWwgSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKElDb21tb25BcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJCQkJCWlmKGFwcGxpY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJSUNvbW1vbk1vZHVsZSBtb2QgPSBhZGRNb2R1bGUoYXBwbGljYXRpb24sIHdjLCAoU3RyaW5nKSBtYXAuZ2V0KHdjKSk7Ci0JCQkJCQkJCQkJCWlmIChyZWYhPW51bGwpCi0JCQkJCQkJCQkJCQlyZWYuc2V0RGVwZW5kZW50T2JqZWN0KChFT2JqZWN0KW1vZCk7Ci0JCQkJCQkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdCh3Yy5nZXRQcm9qZWN0KCkpCi0JCQkJCQkJCQkJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQod2MpKSB7Ci0JCQkJCQkJCQkJCQl1cGRhdGVDb250ZXh0Um9vdChlYXJwaiwgd2MsIG1vZCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9CQkJCQkJCi0JCQkJCQkJCX0sIG51bGwpOwotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWlmIChjb21wc2UgIT0gbnVsbCkgewotCQkJCQkJCQkJY29tcHNlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQkJCQkJCWNvbXBzZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWlmKHdjLmlzQmluYXJ5KCkpewotCQkJCQkJCQkoKEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCl3Yykuc2V0TGlua2VkVG9FQVIobGlua2VkVG9FQVIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzZSAhPSBudWxsKQotCQkJCXNlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZXh0Um9vdChmaW5hbCBJUHJvamVjdCBlYXJwaiwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgd2MsCi0JCQlJQ29tbW9uTW9kdWxlIG1vZCkgewotCQlib29sZWFuIHVzZU5ld01vZGVsID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFRERQcm9qZWN0VmVyc2lvbihlYXJwaikuZXF1YWxzKAotCQkJCUoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpOwotCQlTdHJpbmcgY29udGV4dHJvb3QgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U2VydmVyQ29udGV4dFJvb3Qod2MuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGNvbnRleHRyb290ID09IG51bGwpIHsKLQkJCWNvbnRleHRyb290ID0gd2MuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAodXNlTmV3TW9kZWwpIHsKLQkJCWlmIChtb2QgaW5zdGFuY2VvZiBNb2R1bGUpIHsKLQkJCQkvLyBzYWZldHkgY2hlY2sKLQkJCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSkgbW9kOwotCQkJCVdlYiB3ZWIgPSAoKE1vZHVsZSkgbW9kKS5nZXRXZWIoKTsKLQkJCQl3ZWIuc2V0Q29udGV4dFJvb3QoY29udGV4dHJvb3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHdjLmdldFByb2plY3QoKSkKLQkJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQod2MpKSB7Ci0JCQkJaWYgKG1vZCBpbnN0YW5jZW9mIFdlYk1vZHVsZSkgewotCQkJCQkoKFdlYk1vZHVsZSkgbW9kKS5zZXRDb250ZXh0Um9vdChjb250ZXh0cm9vdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tbW9uTW9kdWxlIGNyZWF0ZU5ld01vZHVsZShJVmlydHVhbENvbXBvbmVudCB3YywgU3RyaW5nIG5hbWUpIHsKLQkJSUNvbW1vbk1vZHVsZSBuZXdNb2R1bGUgPSBudWxsOwotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXIgPSAoSVZpcnR1YWxDb21wb25lbnQpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQlmaW5hbCBJUHJvamVjdCBlYXJwaiA9IGVhci5nZXRQcm9qZWN0KCk7Ci0JCWJvb2xlYW4gdXNlTmV3TW9kZWwgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVERFByb2plY3RWZXJzaW9uKGVhcnBqKS5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCk7Ci0JCS8vW0J1ZyAyMzgyNjRdIG5lZWQgdG8gdXNlIGNvbXBvbmVudCB0byBkZXRlcm1pbmUgdHlwZSBvZiBwcm9qZWN0IGluLWNhc2UgY29tcG9uZW50IGlzIGJpbmFyeQotCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQod2MpKSB7Ci0JCQlpZiAodXNlTmV3TW9kZWwpIHsKLQkJCQlXZWIgd2ViID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWIoKTsKLQkJCQl3ZWIuc2V0V2ViVXJpKG5hbWUpOwotCQkJCU1vZHVsZSB3ZWJNb2R1bGUgPSBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZHVsZSgpOwotCQkJCXdlYk1vZHVsZS5zZXRXZWIod2ViKTsKLQkJCQluZXdNb2R1bGUgPSAoSUNvbW1vbk1vZHVsZSl3ZWJNb2R1bGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGUgd2ViTW9kdWxlID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJNb2R1bGUoKTsKLQkJCQl3ZWJNb2R1bGUuc2V0VXJpKG5hbWUpOwotCQkJCW5ld01vZHVsZSA9IChJQ29tbW9uTW9kdWxlKXdlYk1vZHVsZTsKLQkJCX0KLQkJCXVwZGF0ZUNvbnRleHRSb290KGVhcnBqLCB3YywgbmV3TW9kdWxlKTsKLQkJCXJldHVybiBuZXdNb2R1bGU7Ci0JCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudCh3YykpIHsKLQkJCWlmICh1c2VOZXdNb2RlbCkgewotCQkJCU1vZHVsZSBlamJNb2R1bGUgPSBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZHVsZSgpOwotCQkJCWVqYk1vZHVsZS5zZXRFamIobmFtZSk7Ci0JCQkJbmV3TW9kdWxlID0gKElDb21tb25Nb2R1bGUpZWpiTW9kdWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlIGVqYk1vZHVsZSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWpiTW9kdWxlKCk7Ci0JCQkJZWpiTW9kdWxlLnNldFVyaShuYW1lKTsKLQkJCQluZXdNb2R1bGUgPSAoSUNvbW1vbk1vZHVsZSllamJNb2R1bGU7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gbmV3TW9kdWxlOwotCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudCh3YykpIHsKLQkJCWlmICh1c2VOZXdNb2RlbCkgewotCQkJCU1vZHVsZSBhcHBDbGllbnRNb2R1bGUgPSBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZHVsZSgpOwotCQkJCWFwcENsaWVudE1vZHVsZS5zZXRKYXZhKG5hbWUpOwotCQkJCW5ld01vZHVsZSA9IChJQ29tbW9uTW9kdWxlKWFwcENsaWVudE1vZHVsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGUgYXBwQ2xpZW50TW9kdWxlID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0JCQkJYXBwQ2xpZW50TW9kdWxlLnNldFVyaShuYW1lKTsKLQkJCQluZXdNb2R1bGUgPSAoSUNvbW1vbk1vZHVsZSlhcHBDbGllbnRNb2R1bGU7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gbmV3TW9kdWxlOwotCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FDb21wb25lbnQod2MpKSB7Ci0JCQlpZiAodXNlTmV3TW9kZWwpIHsKLQkJCQlNb2R1bGUgajJjTW9kdWxlID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2R1bGUoKTsKLQkJCQlqMmNNb2R1bGUuc2V0Q29ubmVjdG9yKG5hbWUpOwotCQkJCW5ld01vZHVsZSA9IChJQ29tbW9uTW9kdWxlKWoyY01vZHVsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZSBqMmNNb2R1bGUgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQkJCWoyY01vZHVsZS5zZXRVcmkobmFtZSk7Ci0JCQkJbmV3TW9kdWxlID0gKElDb21tb25Nb2R1bGUpajJjTW9kdWxlOwotCQkJfQkJCQotCQkJcmV0dXJuIG5ld01vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbW1vbk1vZHVsZSBhZGRNb2R1bGUoSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJVmlydHVhbENvbXBvbmVudCB3YywgU3RyaW5nIG5hbWUpIHsKLQkJSUNvbW1vbkFwcGxpY2F0aW9uIGRkID0gYXBwbGljYXRpb247Ci0JCUlDb21tb25Nb2R1bGUgZXhpc3RpbmdNb2R1bGUgPSBkZC5nZXRGaXJzdEVBUk1vZHVsZShuYW1lKTsKLQkJaWYgKGV4aXN0aW5nTW9kdWxlID09IG51bGwpIHsKLQkJCWV4aXN0aW5nTW9kdWxlID0gY3JlYXRlTmV3TW9kdWxlKHdjLCBuYW1lKTsKLQkJCWlmIChleGlzdGluZ01vZHVsZSAhPSBudWxsKSB7Ci0JCQkJZXhpc3RpbmdNb2R1bGUuc2V0VXJpKG5hbWUpOwotCQkJCWRkLmdldEVBUk1vZHVsZXMoKS5hZGQoZXhpc3RpbmdNb2R1bGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBleGlzdGluZ01vZHVsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTW9kdWxlUnVudGltZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7Ci0JCX0KLQotCQl0cnkgewotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyID0gKElWaXJ0dWFsQ29tcG9uZW50KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKLQotCQkJZmluYWwgSVByb2plY3QgZWFycGogPSBlYXIuZ2V0UHJvamVjdCgpOwotCi0JCQlmaW5hbCBMaXN0IG1vZHVsZUNvbXBvbmVudHMgPSAoTGlzdCkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQotCQkJZmluYWwgU2V0IG1vZHVsZVByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdHIgPSBtb2R1bGVDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJbW9kdWxlUHJvamVjdHMuYWRkKCgoSVZpcnR1YWxDb21wb25lbnQpIGl0ci5uZXh0KCkpLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQotCQkJRWFyRmFjZXRSdW50aW1lSGFuZGxlci51cGRhdGVNb2R1bGVQcm9qZWN0UnVudGltZShlYXJwaiwgbW9kdWxlUHJvamVjdHMsIHN1Ym1vbihtb25pdG9yLCA5KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBhcmVudCwgZmluYWwgaW50IHRpY2tzKSB7Ci0JCXJldHVybiAocGFyZW50ID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwYXJlbnQsIHRpY2tzKSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0RUFSKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IE9LX1NUQVRVUzsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gc291cmNlQ29tcC5nZXRQcm9qZWN0KCk7Ci0JCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlciggcHJvamVjdCApOwotCQlzdGF0dXMgPSBwcm92aWRlci52YWxpZGF0ZUVkaXQobnVsbCwgbnVsbCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlRWRpdEVBUigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZFdlYkNvbXBvbmVudFRvRUFSRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZFdlYkNvbXBvbmVudFRvRUFSRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkZWM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJDb21wb25lbnRUb0VBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklBZGRXZWJDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZFdlYkNvbXBvbmVudFRvRUFSRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkZFdlYkNvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05URVhUX1JPT1QpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRVUklFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAid2FyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAobm90aWZ5ICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVYVF9ST09UKSkKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKENPTlRFWFRfUk9PVCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCXJldHVybiBub3RpZnk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05URVhUX1JPT1QpKQotCQkvLyByZXR1cm4gZ2V0RGVmYXVsdENvbnRleHRSb290KCk7Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKENPTlRFWFRfUk9PVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlQ29udGV4dFJvb3QoZ2V0U3RyaW5nUHJvcGVydHkoQ09OVEVYVF9ST09UKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRSb290Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlQ29udGV4dFJvb3QoU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCWlmIChjb250ZXh0Um9vdC5lcXVhbHMoIiIpIHx8IGNvbnRleHRSb290ID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNvbnRleHRfUm9vdF9jYW5ub3RfYmVfZW1wdHlfMiwgbmV3IE9iamVjdFtde2NvbnRleHRSb290fSksIG51bGwpOyAKLQkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfTsKLQkJCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgCi0JCQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhlcnJvclN0YXR1cywgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzUsIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsgCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjM4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuTk9UX0FOX0FQUF9DTElFTlQsIG5ldyBPYmplY3RbXXtwcm9qZWN0TmFtZX0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEV4cG9ydHMgdGhlIHNwZWNpZmllZCBBcHBsaWNhdGlvbiBDbGllbnQgTW9kdWxlIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBBcHBsaWNhdGlvbiBDbGllbnQKLSAgICAgKiBKYXIgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXBwQ2xpZW50UHJvamVjdE5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBBcHBsaWNhdGlvbiBDbGllbnQgTW9kdWxlIHByb2plY3QgdG8gZXhwb3J0LgotICAgICAqIEBwYXJhbSBhcHBDbGllbnRKYXJGaWxlTmFtZQotICAgICAqICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBBcHBsaWNhdGlvbiBDbGllbnQgSmFyIGZpbGUgbG9jYXRpb24gdG8gZXhwb3J0IHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgICAgIEFwcGxpY2F0aW9uIENsaWVudCBNb2R1bGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlRXhpc3RpbmcKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmVhckZpbGVOYW1lPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuLgotICAgICAqIEBwYXJhbSBleHBvcnRTb3VyY2UKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgQXBwbGljYXRpb24KLSAgICAgKiAgICAgICAgICAgIENsaWVudCBNb2R1bGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIEFwcGxpY2F0aW9uIENsaWVudCBKYXIgZmlsZS4KLSAgICAgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhwb3J0UHJvamVjdChTdHJpbmcgYXBwQ2xpZW50UHJvamVjdE5hbWUsIFN0cmluZyBhcHBDbGllbnRKYXJGaWxlTmFtZSwgYm9vbGVhbiBvdmVyd3JpdGVFeGlzdGluZywgYm9vbGVhbiBleHBvcnRTb3VyY2UpIHsKLS8vICAgICAgICBBcHBDbGllbnRNb2R1bGVFeHBvcnREYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IEFwcENsaWVudE1vZHVsZUV4cG9ydERhdGFNb2RlbCgpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIGFwcENsaWVudFByb2plY3ROYW1lKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KE9WRVJXUklURV9FWElTVElORywgb3ZlcndyaXRlRXhpc3RpbmcpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX0RFU1RJTkFUSU9OLCBhcHBDbGllbnRKYXJGaWxlTmFtZSk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2UpOwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkucnVuKG51bGwpOwotLy8gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQmluYXJ5UHJvamVjdEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQmluYXJ5UHJvamVjdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDkzOTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0JpbmFyeVByb2plY3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi1wdWJsaWMgY2xhc3MgQmluYXJ5UHJvamVjdEhlbHBlciB7Ci0KLQlwdWJsaWMgdm9pZCBpbXBvcnRBcmNoaXZlQXNCaW5hcnkoQXJjaGl2ZSBhcmNoaXZlLCBJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCQkJCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkKLQkJCUlGaWxlIHNhdmVkTW9kdWxlRmlsZSA9IHNhdmVGaWxlKGFyY2hpdmUsIHByb2plY3QpOwotCQkJc2F2ZUVuY2xvc2VkRmlsZShhcmNoaXZlLCBwcm9qZWN0LCBQcm9qZWN0VXRpbGl0aWVzLkRPVF9DTEFTU1BBVEgpOwotCQkJc2F2ZUVuY2xvc2VkRmlsZShhcmNoaXZlLCBwcm9qZWN0LCBQcm9qZWN0VXRpbGl0aWVzLkRPVF9QUk9KRUNUKTsKLQkJCXJlbW92ZUltcG9ydGVkQ2xhc3Nlc0Zyb21DbGFzc3BhdGhJZk5lY2Vzc2FyeShwcm9qZWN0KTsKLQkJCQotCQkJZW5zdXJlQmluYXJ5KGphdmFQcm9qZWN0LCBtb25pdG9yKTsKLQkJCUlQYXRoIHBhdGggPSBzYXZlZE1vZHVsZUZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCQotCQkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHBhdGgsIG51bGwsIHRydWUpOwotCQkJCQkJCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAxLCBlbnRyaWVzLmxlbmd0aCk7Ci0JCQluZXdFbnRyaWVzWzBdID0gbmV3RW50cnk7CQkJCi0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbW9uaXRvcik7Ci0JCQkJCQkJCSAKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9IAotCX0gCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW1wb3J0ZWRDbGFzc2VzRnJvbUNsYXNzcGF0aElmTmVjZXNzYXJ5KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlpZiAoamF2YVByb2ogIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qLnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnlUb1JlbW92ZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiBlbnRyaWVzW2ldLmdldFBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCJpbXBvcnRlZF9jbGFzc2VzIikgJiYgIXByb2plY3QuZ2V0Rm9sZGVyKCJpbXBvcnRlZF9jbGFzc2VzIikuZXhpc3RzKCkpIHsKLQkJCQkJCWVudHJ5VG9SZW1vdmUgPSBlbnRyaWVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gZW50cnlUb1JlbW92ZSkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCAtIDFdOwotCQkJCQlmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBuZXdFbnRyaWVzLmxlbmd0aCAmJiBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGVudHJ5VG9SZW1vdmUgIT0gZW50cmllc1tqXSkgewotCQkJCQkJCW5ld0VudHJpZXNbaV0gPSBlbnRyaWVzW2pdOwotCQkJCQkJCWkrKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbnRyaWVzID0gbmV3RW50cmllczsKLQkJCQkJSVBhdGggb3V0cHV0ID0gamF2YVByb2oucmVhZE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJCWlmIChvdXRwdXQgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJamF2YVByb2ouc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG91dHB1dCwgbnVsbCk7Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIHNhdmVGaWxlKEZpbGUgYUZpbGUsIElQcm9qZWN0IHApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlIGlGaWxlID0gcC5nZXRGaWxlKGFGaWxlLmdldFVSSSgpKTsKLQkJV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaUZpbGUpOwotCQlBcmNoaXZlVXRpbC5jb3B5KGFGaWxlLmdldElucHV0U3RyZWFtKCksIG91dCk7Ci0JCXJldHVybiBpRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRW5jbG9zZWRGaWxlKEFyY2hpdmUgYW5BcmNoaXZlLCBJUHJvamVjdCBwLCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJRmlsZSBhRmlsZSA9IGFuQXJjaGl2ZS5nZXRGaWxlKHVyaSk7Ci0JCQlzYXZlRmlsZShhRmlsZSwgcCk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUJpbmFyeShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgbmV3Q3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsgCi0JCQkJaWYgKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpCi0JCQkJCW5ld0NwLmFkZChlbnRyaWVzW2ldKTsKLQkJCX0KLQkJCWVudHJpZXMgPSAoSUNsYXNzcGF0aEVudHJ5W10pIG5ld0NwLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdDcC5zaXplKCldKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChlbnRyaWVzLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGV4KTsKLQkJfQotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DbGFzc1BhdGhTZWxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NsYXNzUGF0aFNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI4NjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NsYXNzUGF0aFNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5NYW5pZmVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc1BhdGhTZWxlY3Rpb24gewotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmU7Ci0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IGVhclByb2plY3Q7Ci0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudDsKLQlwcm90ZWN0ZWQgTGlzdCBjbGFzc3BhdGhFbGVtZW50czsKLQlwcm90ZWN0ZWQgTWFwIHVyaXNUb0VsZW1lbnRzOwotCXByb3RlY3RlZCBib29sZWFuIG1vZGlmaWVkOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFByb2plY3ROYW1lOwotCXByb3RlY3RlZCBNYXAgZWpiVG9DbGllbnRKQVJzID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWFwIGNsaWVudFRvRUpCSkFScyA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX0VKQl9TRVJWRVJfSkFSUyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX0VKQl9DTElFTlRfSkFSUyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX05PTkUgPSAyOwotCi0JcHJvdGVjdGVkIGludCBmaWx0ZXJMZXZlbCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkvKioKLQkJICogQHNlZSBDb21wYXJhdG9yI2NvbXBhcmUoT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWludCByZXRWYWwgPSAwOwotCQkJaWYgKG8xIGluc3RhbmNlb2YgQXJjaGl2ZSkKLQkJCXsKLQkJCQlBcmNoaXZlIGExID0gKEFyY2hpdmUpIG8xOwotCQkJCUFyY2hpdmUgYTIgPSAoQXJjaGl2ZSkgbzI7Ci0JCQkJcmV0VmFsID0gYTEuZ2V0VVJJKCkuY29tcGFyZVRvKGEyLmdldFVSSSgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG8xIGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpCi0JCQl7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmMSA9IChJVmlydHVhbFJlZmVyZW5jZSkgbzE7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmMiA9IChJVmlydHVhbFJlZmVyZW5jZSkgbzI7Ci0JCQkJcmV0VmFsID0gcmVmMS5nZXRBcmNoaXZlTmFtZSgpLmNvbXBhcmVUbyhyZWYyLmdldEFyY2hpdmVOYW1lKCkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldFZhbCA9IG8xLnRvU3RyaW5nKCkuY29tcGFyZVRvKG8yLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJcmV0dXJuIHJldFZhbDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQ2xhc3NQYXRoU2VsZWN0aW9uKEFyY2hpdmUgYW5BcmNoaXZlLCBTdHJpbmcgdGFyZ2V0UHJvamVjdE5hbWUsIEVBUkZpbGUgZWFyRmlsZSkgewotCQlzdXBlcigpOwotCQlhcmNoaXZlID0gYW5BcmNoaXZlOwotCQl0aGlzLnRhcmdldFByb2plY3ROYW1lID0gdGFyZ2V0UHJvamVjdE5hbWU7Ci0JCWluaXRpYWxpemVFQVJQcm9qZWN0KGVhckZpbGUpOwotCQlpbml0aWFsaXplRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGFzc1BhdGhTZWxlY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NQYXRoU2VsZWN0aW9uKEFyY2hpdmUgYW5BcmNoaXZlLCBFQVJGaWxlIGVhckZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJjaGl2ZSA9IGFuQXJjaGl2ZTsKLQkJaW5pdGlhbGl6ZUVBUlByb2plY3QoZWFyRmlsZSk7Ci0JCWluaXRpYWxpemVFbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd2l0aG91dCBhbiBFQVIgY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBDbGFzc1BhdGhTZWxlY3Rpb24oSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlzdXBlcigpOwotCQljb21wb25lbnQgPSBhQ29tcG9uZW50OwotCQl0YXJnZXRQcm9qZWN0TmFtZSA9IGFDb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJaW5pdGlhbGl6ZUVsZW1lbnRzKCk7Ci0JfQotCQotCS8qKgotCSAqIENsYXNzUGF0aFNlbGVjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDbGFzc1BhdGhTZWxlY3Rpb24oSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgYW5FYXJDb21wb25lbnQpIHsKLQkJdGhpcyhhQ29tcG9uZW50KTsKLQkJZWFyQ29tcG9uZW50ID0gYW5FYXJDb21wb25lbnQ7Ci0JCWVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQlpbml0aWFsaXplRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGFzc1BhdGhTZWxlY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NQYXRoU2VsZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzc3BhdGhFbGVtZW50IGNyZWF0ZUVsZW1lbnQoQXJjaGl2ZSByZWZlcmVuY2luZ0FyY2hpdmUsIEFyY2hpdmUgcmVmZXJlbmNlZEFyY2hpdmUsIFN0cmluZyBjcEVudHJ5KSB7Ci0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IG5ldyBDbGFzc3BhdGhFbGVtZW50KHJlZmVyZW5jaW5nQXJjaGl2ZSk7Ci0JCWVsZW1lbnQuc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJCi0JCVN0cmluZyB1cmlTdHJpbmcgPSByZWZlcmVuY2VkQXJjaGl2ZS5nZXRVUkkoKTsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLQotCQlib29sZWFuIGhhc0Fic29sdXRlUGF0aCA9IHVyaS5oYXNBYnNvbHV0ZVBhdGgoKTsKLQkJaWYoIGhhc0Fic29sdXRlUGF0aCApewotCQkJdXJpU3RyaW5nID0gdXJpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJCi0JCS8vZWxlbWVudC5zZXRUZXh0KHJlZmVyZW5jZWRBcmNoaXZlLmdldFVSSSgpKTsKLQkJZWxlbWVudC5zZXRUZXh0KHVyaVN0cmluZyk7Ci0JCWVsZW1lbnQuc2V0VGFyZ2V0QXJjaGl2ZShyZWZlcmVuY2VkQXJjaGl2ZSk7Ci0JCWVsZW1lbnQuc2V0RWFyUHJvamVjdChlYXJQcm9qZWN0KTsKLQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICl7Ci0JCQlJQ29udGFpbmVyIGVhckNvbmVudEZvbGRlciA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQkJaWYoIGVhckNvbmVudEZvbGRlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApewotCQkJCWVsZW1lbnQuc2V0RWFyQ29udGVudEZvbGRlciggZWFyQ29uZW50Rm9sZGVyLmdldE5hbWUoKSk7Ci0JCQl9ZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRFYXJDb250ZW50Rm9sZGVyKCAiIiApOwotCQkJfQotCQl9Ci0JCi0JCXNldFByb2plY3RWYWx1ZXMoZWxlbWVudCwgcmVmZXJlbmNlZEFyY2hpdmUpOwotCQlpZiAoY3BFbnRyeSAhPSBudWxsKQotCQkJZWxlbWVudC5zZXRWYWx1ZXNTZWxlY3RlZChjcEVudHJ5KTsKLQkJc2V0VHlwZShlbGVtZW50LCByZWZlcmVuY2VkQXJjaGl2ZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBDbGFzc3BhdGhFbGVtZW50IGNyZWF0ZUVsZW1lbnQoSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdBcmNoaXZlLCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2VkQXJjaGl2ZSwgU3RyaW5nIGNwRW50cnkpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQocmVmZXJlbmNpbmdBcmNoaXZlKTsKLQkJZWxlbWVudC5zZXRWYWxpZCh0cnVlKTsKLQkJCQkKLQkJU3RyaW5nIHVyaVN0cmluZyA9IHJlZmVyZW5jZWRBcmNoaXZlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQotCQllbGVtZW50LnNldFRleHQodXJpU3RyaW5nKTsKLQkJZWxlbWVudC5zZXRUYXJnZXRDb21wb25lbnQocmVmZXJlbmNlZEFyY2hpdmUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJZWxlbWVudC5zZXRFYXJQcm9qZWN0KGVhclByb2plY3QpOwotCQlpZiggZWFyQ29tcG9uZW50ICE9IG51bGwgKXsKLQkJCUlDb250YWluZXIgZWFyQ29uZW50Rm9sZGVyID0gZWFyQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JCQlpZiggZWFyQ29uZW50Rm9sZGVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICl7Ci0JCQkJZWxlbWVudC5zZXRFYXJDb250ZW50Rm9sZGVyKCBlYXJDb25lbnRGb2xkZXIuZ2V0TmFtZSgpKTsKLQkJCX1lbHNlIHsKLQkJCQllbGVtZW50LnNldEVhckNvbnRlbnRGb2xkZXIoICIiICk7Ci0JCQl9Ci0JCX0KLQkKLQkJc2V0UHJvamVjdFZhbHVlcyhlbGVtZW50LCByZWZlcmVuY2VkQXJjaGl2ZSk7Ci0JCWlmIChjcEVudHJ5ICE9IG51bGwpCi0JCQllbGVtZW50LnNldFZhbHVlc1NlbGVjdGVkKGNwRW50cnkpOwotCQlzZXRUeXBlKGVsZW1lbnQsIHJlZmVyZW5jZWRBcmNoaXZlKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzcGF0aEVsZW1lbnQgY3JlYXRlSW52YWxpZEVsZW1lbnQoU3RyaW5nIGNwRW50cnkpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQoYXJjaGl2ZSk7Ci0JCWVsZW1lbnQuc2V0VmFsaWQoZmFsc2UpOwotCQllbGVtZW50LnNldFNlbGVjdGVkKHRydWUpOwotCQllbGVtZW50LnNldFJlbGF0aXZlVGV4dChjcEVudHJ5KTsKLQkJZWxlbWVudC5zZXRUZXh0KGNwRW50cnkpOwotCQllbGVtZW50LnNldEVhclByb2plY3QoZWFyUHJvamVjdCk7Ci0JCXNldEludmFsaWRQcm9qZWN0KGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgY3JlYXRlUHJvamVjdEVsZW1lbnQoSVByb2plY3QgcHJvamVjdCkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBuZXcgQ2xhc3NwYXRoRWxlbWVudChwcm9qZWN0KTsKLQkJZWxlbWVudC5zZXRWYWxpZCh0cnVlKTsKLQkJZWxlbWVudC5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZWxlbWVudC5zZXRUZXh0KHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJZWxlbWVudC5zZXRQcm9qZWN0KHByb2plY3QpOwotCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsZWxlbWVudC5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBDbGFzc3BhdGhFbGVtZW50IGNyZWF0ZVByb2plY3RFbGVtZW50KElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZXhpc3RpbmdFbnRyeSApIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQocHJvamVjdCk7Ci0JCWVsZW1lbnQuc2V0VmFsaWQodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U2VsZWN0ZWQoZXhpc3RpbmdFbnRyeSk7Ci0JCWVsZW1lbnQuc2V0VGV4dChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCWVsZW1lbnQuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJYWRkQ2xhc3NwYXRoRWxlbWVudChlbGVtZW50LGVsZW1lbnQuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkKLQlwdWJsaWMgQ2xhc3NwYXRoRWxlbWVudCBjcmVhdGVBcmNoaXZlRWxlbWVudChVUkkgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNwRW50cnkpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQodXJpKTsKLQkJZWxlbWVudC5zZXRWYWxpZChmYWxzZSk7Ci0JCWVsZW1lbnQuc2V0UmVsYXRpdmVUZXh0KG5hbWUpOwotCQlpZiAoY3BFbnRyeSAhPSBudWxsKQotCQkJZWxlbWVudC5zZXRWYWx1ZXNTZWxlY3RlZChjcEVudHJ5KTsJCQotCQllbGVtZW50LnNldFRleHQobmFtZSk7Ci0JCWVsZW1lbnQuc2V0RWFyUHJvamVjdChlYXJQcm9qZWN0KTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJ1aWxkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeU1hcChmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wLCBmaW5hbCBNYXAgcGF0aFRvQ29tcCkgewotCQlpZiAoY29tcCAhPSBudWxsICYmIGNvbXAgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQgajJlZUNvbXAgPSAoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIGNvbXA7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9IGoyZWVDb21wLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3BSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gb25seSAuLi8gbWFwcGluZ3Mgc3VwcG9ydGVkIGF0IHRoaXMgbGV2ZWwKLQkJCQlpZiAoIWNwUmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBjcFJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWZpbmFsIElQYXRoIHBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDbGFzc3BhdGhWaXJ0dWFsUmVmZXJlbmNlTG9jYXRpb24oY3BSZWZzW2ldKTsgCi0JCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZXhpc3RpbmdDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBwYXRoVG9Db21wLmdldChwYXRoKTsKLQkJCQlpZiAoZXhpc3RpbmdDb21wICE9IG51bGwpIHsKLQkJCQkJLy8gcmVwbGFjZSB3aXRoIGEgdGVtcCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB3aG9zZSBJUHJvamVjdCBpcyBzZXQgdG8gYSBuZXcgcHNldWRvIG5hbWUgdGhhdCBpcwotCQkJCQkvLyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgcHJvamVjdCBjb250cmlidXRpb25zIGZvciB0aGF0IGFyY2hpdmUKLQkJCQkJaWYgKGV4aXN0aW5nQ29tcCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCQlmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBvbGRDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBleGlzdGluZ0NvbXA7Ci0JCQkJCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBuZXdDb21wID0gdXBkYXRlRGlzcGxheVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KG9sZENvbXAsIGNwUmVmc1tpXSk7Ci0JCQkJCQlwYXRoVG9Db21wLnB1dChwYXRoLCBuZXdDb21wKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhdGhUb0NvbXAucHV0KHBhdGgsIHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgKHVzZWQgb25seSBmb3IgZGlzcGxheSBwdXJwb3Nlcykgd2hvc2UgSVByb2plY3QgaXMgc2V0IHRvIGEgZHVtbXkgdmFsdWUgd2hvc2UKLQkgKiBuYW1lIGlzIGEgY29uY2F0ZW50YXRpb24gb2YgdGhlIGV4aXN0aW5nIG5hbWUgYW5kIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHJlZi4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjYXNlIHdoZXJlIGEgc2luZ2xlIHVuaXF1ZSBhcmNoaXZlIGlzIHJlZmVyZW5jZWQvY29udHJpYnV0ZWQgYnkgbXVsdGlwbGUgZGVwZW5kZW50IHByb2plY3RzLgotCSAqLyAKLQlwdWJsaWMgc3RhdGljIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHVwZGF0ZURpc3BsYXlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBvbGRDb21wLCBmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBuZXdSZWYpIHsKLQkJZmluYWwgU3RyaW5nIG5ld1Byb2pOYW1lID0gb2xkQ29tcC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIiAiICsgbmV3UmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOyAgCi0JCWZpbmFsIElQcm9qZWN0IG5ld1Byb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmV3UHJvak5hbWUpOwotCQlmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBuZXdDb21wb25lbnQgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChuZXdQcm9qLCBvbGRDb21wLmdldE5hbWUoKSk7Ci0JCXJldHVybiBuZXdDb21wb25lbnQ7Ci0JfQotCQotCXB1YmxpYyBDbGFzc3BhdGhFbGVtZW50W10gY3JlYXRlQ2xhc3NwYXRoRW50cnlFbGVtZW50cyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wLCBmaW5hbCBJUGF0aCBhcmNoaXZlUnVudGltZVBhdGgsIGZpbmFsIElQYXRoIGNsYXNzRm9sZGVyUnVudGltZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGNvbXAuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJZmluYWwgYm9vbGVhbiBpc1dlYkFwcCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCQkJZmluYWwgTWFwIHRhZ2dlZEVudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QpOwotCQkJCQotCQkJCUl0ZXJhdG9yIGkgPSB0YWdnZWRFbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IChJQ2xhc3NwYXRoQXR0cmlidXRlKSB0YWdnZWRFbnRyaWVzLmdldChlbnRyeSk7Ci0JCQkJCWZpbmFsIGJvb2xlYW4gaXNDbGFzc0ZvbGRlciA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCQkJCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgoYXR0cmliLCBpc1dlYkFwcCwgaXNDbGFzc0ZvbGRlcik7IAotCQkJCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCAmJiAoKGlzQ2xhc3NGb2xkZXIgJiYgIXJ1bnRpbWVQYXRoLmVxdWFscyhjbGFzc0ZvbGRlclJ1bnRpbWVQYXRoKSkgfHwgKCFpc0NsYXNzRm9sZGVyICYmICFydW50aW1lUGF0aC5lcXVhbHMoYXJjaGl2ZVJ1bnRpbWVQYXRoKSkpKSB7Ci0JCQkJCQkvLyBpZiBydW50aW1lIHBhdGggZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IHJ1bnRpbWUgcGF0aCwgc2tpcAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZmluYWwgQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2xhc3NwYXRoRWxlbWVudEZvckVudHJ5KHByb2plY3QsIGVudHJ5KTsKLQkJCQkJZWxlbWVudC5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCQkJYWRkQ2xhc3NwYXRoRWxlbWVudChlbGVtZW50LCBlbGVtZW50LmdldEFyY2hpdmVVUkkoKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZmluYWwgTGlzdCBwb3RlbnRpYWxFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0KTsKLQkJCQlpID0gcG90ZW50aWFsRW50cmllcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBpLm5leHQoKTsKLQkJCQkJaWYgKGlzV2ViQXBwICYmIGNsYXNzRm9sZGVyUnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKSAmJiBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzRm9sZGVyRW50cnkoZW50cnkpKSB7Ci0JCQkJCQkvLyBkb24ndCBkaXNwbGF5IGNsYXNzIGZvbGRlciBkZXBlbmRlbmNpZXMgZm9yIGR5bmFtaWMgd2ViIHByb2plY3RzIG9uIHRoZSBub24td2ViIGxpYiBkZXBlbmRlbmN5IHBhZ2UKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWZpbmFsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUNsYXNzcGF0aEVsZW1lbnRGb3JFbnRyeShwcm9qZWN0LCBlbnRyeSk7Ci0JCQkJCWVsZW1lbnQuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQuZ2V0QXJjaGl2ZVVSSSgpLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKENsYXNzcGF0aEVsZW1lbnRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgQ2xhc3NwYXRoRWxlbWVudFtlbGVtZW50cy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzcGF0aEVsZW1lbnQgY3JlYXRlQ2xhc3NwYXRoRWxlbWVudEZvckVudHJ5KGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlmaW5hbCBJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCWZpbmFsIFVSSSBhcmNoaXZlVVJJID0gVVJJLmNyZWF0ZVVSSShlbnRyeVBhdGgudG9TdHJpbmcoKSk7Ci0JCWZpbmFsIGludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGVudHJ5UGF0aC50b1N0cmluZygpOwotCQlpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeVBhdGgsIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnROYW1lID0gY29udGFpbmVyLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0KLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2xhc3NwYXRoRW50cnlFbGVtZW50KHByb2plY3QsIGFyY2hpdmVVUkksIGVsZW1lbnROYW1lLCBlbnRyeSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkJCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW52YWxpZFByb2plY3QoQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlQcm9qZWN0IGVhclByb2ogPSBlbGVtZW50LmdldEVhclByb2plY3QoKTsKLQkJLy9JVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRDb21wb25lbnQoZWFyUHJvai5nZXROYW1lKCkpOwotCQlJVmlydHVhbENvbXBvbmVudCByZWZFYXJDb21wb25lbnQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0Q29tcG9uZW50KGVhclByb2ouZ2V0TmFtZSgpKTsKLQkJCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZXMocmVmRWFyQ29tcG9uZW50KTsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBlbGVtZW50LmdldFJlbGF0aXZlVGV4dCgpOwotCQlpZihtb2R1bGVOYW1lICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZENvbXBvbmVudCA9IG51bGw7Ci0JCQlmb3IgKGludCBjbnQ9MDsgY250IDwgcmVmZXJlbmNlcy5sZW5ndGg7IGNudCsrKQotCQkJewotCQkJCWlmIChtb2R1bGVOYW1lLmVxdWFscyhyZWZlcmVuY2VzW2NudF0uZ2V0QXJjaGl2ZU5hbWUoKSkpCi0JCQkJewotCQkJCQltb2RDb21wb25lbnQgPSByZWZlcmVuY2VzW2NudF0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCX0KLQkJCX0KLQkJCWlmKG1vZENvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgbWFwcGVkUHJvamVjdCA9IG1vZENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJZWxlbWVudC5zZXRQcm9qZWN0KG1hcHBlZFByb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDE6MTc6MjEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDbGFzc3BhdGhFbGVtZW50cygpIHsKLQkJaWYoY2xhc3NwYXRoRWxlbWVudHMgPT0gbnVsbCkKLQkJCWNsYXNzcGF0aEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2xhc3NwYXRoRWxlbWVudHM7Ci0JfQotCQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3RlZENsYXNzcGF0aEVsZW1lbnRzKCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRDbGFzc3BhdGhFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpaXQubmV4dCgpOwotCQkJaWYoIGVsZW1lbnQuaXNTZWxlY3RlZCgpICl7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQkKLQotCS8qKgotCSAqIEFkYXB0ZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIG1hbmlmZXN0IGNsYXNzIHBhdGggZW50cmllcyB3aGljaCBtYXAgdG8gYSBwcm9qZWN0IHRvIGEgbGlzdCBvZgotCSAqIGNsYXNzcGF0aCBlbnRyaWVzIGZvciBhIGphdmEgYnVpbGQgcGF0aAotCSAqLwotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKGJvb2xlYW4gZmlsdGVyU2VsZWN0ZWQpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGFycmF5ID0gbnVsbDsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYoY2xhc3NwYXRoRWxlbWVudHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQllbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGNsYXNzcGF0aEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChmaWx0ZXJTZWxlY3RlZCAmJiAhZWxlbWVudC5pc1NlbGVjdGVkKCkpCi0JCQkJY29udGludWU7Ci0JCQlhcnJheSA9ICgoQ2xhc3NwYXRoRWxlbWVudCkgY2xhc3NwYXRoRWxlbWVudHMuZ2V0KGkpKS5uZXdDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQlpZiAoYXJyYXkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXJyYXkubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIXJlc3VsdC5jb250YWlucyhhcnJheVtqXSkpCi0JCQkJCXJlc3VsdC5hZGQoYXJyYXlbal0pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkYXB0ZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIG1hbmlmZXN0IGNsYXNzIHBhdGggZW50cmllcyB3aGljaCBtYXAgdG8gYSBwcm9qZWN0IHRvIGEgbGlzdCBvZgotCSAqIGNsYXNzcGF0aCBlbnRyaWVzIGZvciBhIGphdmEgYnVpbGQgcGF0aAotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzRm9yQWxsKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoRW50cmllcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciBtZXRob2QgdG8gY29udmVydCB0aGUgbWFuaWZlc3QgY2xhc3MgcGF0aCBlbnRyaWVzIHdoaWNoIG1hcCB0byBhIHByb2plY3QgdG8gYSBsaXN0IG9mCi0JICogY2xhc3NwYXRoIGVudHJpZXMgZm9yIGEgamF2YSBidWlsZCBwYXRoCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXNGb3JTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGdldENsYXNzcGF0aEVudHJpZXModHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsKLQkJaWYgKGFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNvbnRhaW5lciBwYXJlbnQgPSBhcmNoaXZlLmdldENvbnRhaW5lcigpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIChFQVJGaWxlKSBwYXJlbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVByb2plY3QgZ2V0RUFSUHJvamVjdChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlDb250YWluZXIgYyA9IGFuQXJjaGl2ZS5nZXRDb250YWluZXIoKTsKLQkJaWYgKCFjLmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVBUkZpbGUgZWFyID0gKEVBUkZpbGUpIGM7Ci0JCUxvYWRTdHJhdGVneSBsb2FkZXIgPSBlYXIuZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0JCWlmICghKGxvYWRlciBpbnN0YW5jZW9mIEVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuICgoRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCkgbG9hZGVyKS5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IGdldENvbXBvbmVudChhbkFyY2hpdmUpOwotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcC5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJTG9hZFN0cmF0ZWd5IGxvYWRlciA9IGFuQXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKTsKLQkJaWYgKGxvYWRlciBpbnN0YW5jZW9mIENvbXBvbmVudExvYWRTdHJhdGVneUltcGwpCi0JCQlyZXR1cm4gKChDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKSBsb2FkZXIpLmdldENvbXBvbmVudCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBhcmNoaXZlLmdldFVSSSgpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIGdldEFyY2hpdmUoU3RyaW5nIHVyaSwgTGlzdCBhcmNoaXZlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQkKLQkJCVN0cmluZyBhcmNoaXZlVVJJU3RyaW5nID0gYW5BcmNoaXZlLmdldFVSSSgpOwotCQkJVVJJIGFyY2hpdmVVUkkgPSBVUkkuY3JlYXRlVVJJKGFyY2hpdmVVUklTdHJpbmcpOwotCQkJYm9vbGVhbiBoYXNBYnNvbHV0ZVBhdGggPSBhcmNoaXZlVVJJLmhhc0Fic29sdXRlUGF0aCgpOwotCQkJaWYoIGhhc0Fic29sdXRlUGF0aCApewotCQkJCWFyY2hpdmVVUklTdHJpbmcgPSBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCk7Ci0JCQl9Ci0JCQlpZiAoYXJjaGl2ZVVSSVN0cmluZy5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gYW5BcmNoaXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZSBnZXRWaXJ0dWFsUmVmZXJlbmNlKFN0cmluZyB1cmksIExpc3QgYXJjaGl2ZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgYW5BcmNoaXZlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQkKLQkJCVN0cmluZyBhcmNoaXZlVVJJU3RyaW5nID0gYW5BcmNoaXZlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQlpZiAoYXJjaGl2ZVVSSVN0cmluZy5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gYW5BcmNoaXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVwZW5kZW5jeShJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkSkFSLCBJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2luZ0pBUikgewotCQkvL05vIG90aGVyIG1vZHVsZXMgc2hvdWxkIHJlZmVyZW5jZSB3YXJzCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQocmVmZXJlbmNlZEpBUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCByZWZlcmVuY2VkSkFSLmdldE5hbWUoKS5lcXVhbHMoIHJlZmVyZW5jaW5nSkFSLmdldE5hbWUoKSApICkKLQkJCXJldHVybiBmYWxzZTsJCQotCi0JCS8vQ2xpZW50cyBjYW4gcmVmZXJlbmNlIGFsbCBidXQgdGhlIFdBUnMsIHdoaWNoIHdlJ3ZlIGFscmVhZHkgY292ZXJlZAotCQkvLyBhYm92ZTsgV0FScyBhbmQgRUpCIEpBUnMKLQkJLy9jYW4gcmVmZXJlbmNlIGFsbCBidXQgV0FScywgYWJvdmUsIG9yIEFwcGxpY2F0aW9uQ2xpZW50cwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudChyZWZlcmVuY2luZ0pBUikgfHwgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQocmVmZXJlbmNlZEpBUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRzKCkgewotLy8JCWVqYlRvQ2xpZW50SkFScyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmNvbGxlY3RFSkJDbGllbnRKQVJzKGdldEVBUkZpbGUoKSk7Ci0JCWVqYlRvQ2xpZW50SkFScyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGN1cnJlbnRDb21wb25lbnQgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjbGllbnRDb21wb25lbnQgPSBudWxsOwotCQlPYmplY3Qgcm9vdE1vZGVsT2JqZWN0ID0gbnVsbDsKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IG51bGw7Ci0JCVN0cmluZyBlamJDbGllbnRKYXJOYW1lID0gbnVsbDsKLQkJTGlzdCBhcmNoaXZlcyA9IG51bGw7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIG90aGVyID0gbnVsbDsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJU3RyaW5nW10gY3AgPSBuZXcgU3RyaW5nWzBdOwotCQkKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwkJCi0JCQlmb3IgKGludCBjbnQ9MDsgY250PHJlZmVyZW5jZXMubGVuZ3RoOyBjbnQrKykKLQkJCXsKLQkJCQljbGllbnRDb21wb25lbnQgPSBudWxsOwotCQkJCW1vZGVsUHJvdmlkZXIgPSBudWxsOwotCQkJCXJvb3RNb2RlbE9iamVjdCA9IG51bGw7Ci0JCQkJZWpiQ2xpZW50SmFyTmFtZSA9IG51bGw7Ci0JCQkJY3VycmVudENvbXBvbmVudCA9IHJlZmVyZW5jZXNbY250XS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGN1cnJlbnRDb21wb25lbnQpKQotCQkJCXsKLQkJCQkJaWYoY3VycmVudENvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCQkJCS8vVE9ETyBhZGQgYmluYXJ5IHN1cHBvcnQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoY3VycmVudENvbXBvbmVudCk7Ci0JCQkJCQlpZihtb2RlbFByb3ZpZGVyPT1udWxsKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlyb290TW9kZWxPYmplY3QgPSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJvb3RNb2RlbE9iamVjdCBpbnN0YW5jZW9mIEVKQkphcikKLQkJCQkJewotCQkJCQkJZWpiQ2xpZW50SmFyTmFtZSA9ICgoRUpCSmFyKXJvb3RNb2RlbE9iamVjdCkuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocm9vdE1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcikKLQkJCQkJewotCQkJCQkJZWpiQ2xpZW50SmFyTmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcilyb290TW9kZWxPYmplY3QpLmdldEVqYkNsaWVudEphcigpOwotCQkJCQl9Ci0JCQkJCWlmIChlamJDbGllbnRKYXJOYW1lICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWNsaWVudENvbXBvbmVudCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1vZHVsZShlYXJDb21wb25lbnQsIGVqYkNsaWVudEphck5hbWUpOwotCQkJCQl9Ci0JCQkJCWlmIChjbGllbnRDb21wb25lbnQgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJZWpiVG9DbGllbnRKQVJzLnB1dChjdXJyZW50Q29tcG9uZW50LCBjbGllbnRDb21wb25lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2xpZW50VG9FSkJKQVJzID0gcmV2ZXJzZShlamJUb0NsaWVudEpBUnMpOwotCQkJY2xhc3NwYXRoRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl1cmlzVG9FbGVtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCQotCQkJdHJ5IHsKLQkJCQkvLwkJCWNwID0gYXJjaGl2ZS5nZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJCW1hbmlmZXN0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCWNwID0gbWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCQl9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJvamVjdFVyaSA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2UoY29tcG9uZW50LmdldE5hbWUoKSkuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCWFyY2hpdmVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCkpKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjcEVudHJ5ID0gY3BbaV07Ci0JCQkJU3RyaW5nIHVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGNwRW50cnksIHByb2plY3RVcmkpOwotCi0JCQkJb3RoZXIgPSBnZXRWaXJ0dWFsUmVmZXJlbmNlKHVyaSwgYXJjaGl2ZXMpOwotCQkJCWlmIChvdGhlciAhPSBudWxsICYmIGlzVmFsaWREZXBlbmRlbmN5KG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgY29tcG9uZW50KSkgewotCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChjb21wb25lbnQsIG90aGVyLCBjcEVudHJ5KTsKLQkJCQkJYXJjaGl2ZXMucmVtb3ZlKG90aGVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbGVtZW50ID0gY3JlYXRlSW52YWxpZEVsZW1lbnQoY3BFbnRyeSk7Ci0JCQkJCWlmIChlbGVtZW50LnJlcHJlc2VudHNJbXBvcnRlZEphcigpKSB7Ci0JCQkJCQllbGVtZW50LnNldFZhbGlkKHRydWUpOwotCQkJCQkJZWxlbWVudC5zZXRQcm9qZWN0KGdldFByb2plY3QoYXJjaGl2ZSkpOwotCQkJCQl9Ci0JCQkJCWlmIChvdGhlciAhPSBudWxsKQotCQkJCQkJZWxlbWVudC5zZXRQcm9qZWN0KG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCi0JCQkJCWlmKCBvdGhlciA9PSBudWxsICl7Ci0JCQkJCQkvL21ha2luZyBhIGJlc3QgZ3Vlc3MgZm9yIHRoZSBwcm9qZWN0IG5hbWUKLQkJCQkJCWlmKCBlbGVtZW50LmdldFByb2plY3QoKSA9PSBudWxsICl7Ci0JCQkJCQkJaW50IGluZGV4ID0gY3BFbnRyeS5pbmRleE9mKCIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBpZiBqYXIgaXMgbmVzdGVkIGluIGEgZm9sZGVyIHlvdSBtdXN0IG5vdCBsb29rIGZvcgotCQkJCQkJCS8vIHByb2plY3QgKHNlZ21lbnRzIGluIHByb2plY3QgbmFtZSBjYXVzZSBhc3NlcnRpb24KLQkJCQkJCQkvLyBlcnJvcikKLQkJCQkJCQlib29sZWFuIGlzTXVsdGlTZWdtZW50ID0gY3BFbnRyeQotCQkJCQkJCQkJLmluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yKSA9PSAtMTsKLQkJCQkJCQlpZiAoIWlzTXVsdGlTZWdtZW50ICYmIGluZGV4ID4gMCkgewotCQkJCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBjcEVudHJ5LnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQkJCUlQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgocHJvamVjdE5hbWUpOwotCQkJCQkJCQkvL2lmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZWdtZW50cyBhbmQgbm8gcmVmZXJlbmNlIGFyY2hpdmUgaXMgZm91bmQKLQkJCQkJCQkJLy90aGVuIGVpdGhlciB0aGlzIGlzIHBvaW50aW5nIHRvIGEgamFyIGluIHRoZSBFQVIgdGhhdCBkb2Vzbid0IGV4aXN0Ci0JCQkJCQkJCS8vb3IgdGhlIERlcGVuZGVjeUdyYXBoTWFuYWdlciBpcyBzdGFsZQotCQkJCQkJCQlpZihwcm9qZWN0UGF0aC5zZWdtZW50Q291bnQoKSA+IDEpewotCQkJCQkJCQkJaWYoZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSAhPSBudWxsKXsKLQkJCQkJCQkJCQllbGVtZW50LnNldFByb2plY3QoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZSApOwotCQkJCQkJCQkJaWYoIHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICkKLQkJCQkJCQkJCQllbGVtZW50LnNldFByb2plY3QoIHByb2plY3QgKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIHVyaSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIEFkZCByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gdGFnZ2VkIGNsYXNzcGF0aCBlbnRyaWVzCi0JCS8vIFhYWCBEb24ndCBzaG93IHJlc29sdmVkIGNvbnRyaWJ1dGlvbnMgZnJvbSB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMgb24gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoOyB3ZSBzaG91bGQgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgcmF3IGVudHJpZXMgaW5zdGVhZAotCQkvL2NyZWF0ZUNsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3lFbGVtZW50cyhjb21wKTsKLQkJCi0JCS8vIEFkZCBlbGVtZW50cyBmb3IgcmF3IGNsYXNzcGF0aCBlbnRyaWVzIChlaXRoZXIgYWxyZWFkeSB0YWdnZWQgb3IgcG90ZW50aWFsbHkgdGFnZ2FibGUpIAotCQl0cnkgewotCQkgICAgY3JlYXRlQ2xhc3NwYXRoRW50cnlFbGVtZW50cyhjb21wb25lbnQsIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRILCBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlRfUEFUSCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCQkKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGFyY2hpdmVzLCBjb21wYXJhdG9yKTsKLQkJCS8vQW55dGhpbmcgdGhhdCByZW1haW5zIGluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhcmNoaXZlcyB0aGF0IGlzIHZhbGlkIHNob3VsZCBiZQotCQkJLy9hdmFpbGFibGUgZm9yIHNlbGVjdGlvbgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJCW90aGVyID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBhcmNoaXZlcy5nZXQoaSk7Ci0KLQkJCQlpZiAob3RoZXIgIT0gYXJjaGl2ZSAmJiBpc1ZhbGlkRGVwZW5kZW5jeShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGNvbXBvbmVudCkpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChudWxsID09IHRhcmdldFByb2plY3ROYW1lIHx8IG51bGwgPT0gcHJvamVjdCB8fCAhcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFByb2plY3ROYW1lKSkgewotCQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBvdGhlciwgbnVsbCk7Ci0JCQkJCQllbGVtZW50LnNldFByb2plY3Qob3RoZXIuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIG90aGVyLmdldEFyY2hpdmVOYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBuZXdyZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciggaW50IGk9MDsgaSA8IG5ld3JlZnMubGVuZ3RoOyBpKyspewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG5ld3JlZnNbaV07Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJYm9vbGVhbiBpc0JpbmFyeSA9IHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKTsKLQkJCQlpZiggaXNCaW5hcnkgKXsKLQotCQkJCQkvKioKLQkJCQkJICogV2FybmluZyBjbGVhbi11cCAxMi8wNS8yMDA1Ci0JCQkJCSAqLyAgIAotCQkJCQkvL1N0cmluZyB1cmkgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZXNvbHZlZFBhdGhGb3JBcmNoaXZlQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgdW5yZXNvbHZlZFVSSSA9IHJlZi5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCQlpZih1bnJlc29sdmVkVVJJID09IG51bGwpewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1bnJlc29sdmVkVVJJID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKHJlZmVyZW5jZWRDb21wb25lbnQpKSk7Ci0JCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYodW5yZXNvbHZlZFVSSSAhPSBudWxsKXsKLQkJCQkJCVVSSSBhcmNoaXZlVVJJID0gVVJJLmNyZWF0ZVVSSSh1bnJlc29sdmVkVVJJKTsJCi0KLQkJCQkJCWJvb2xlYW4gIGFscmVhZHlJbkxpc3QgPSBmYWxzZTsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXIgPSBnZXRDbGFzc3BhdGhFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCQkJQ2xhc3NwYXRoRWxlbWVudCB0bXBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYodW5yZXNvbHZlZFVSSS5lbmRzV2l0aCh0bXBlbGVtZW50LmdldFRleHQoKSkpewotCQkJCQkJCQlhbHJlYWR5SW5MaXN0ID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiggIWFscmVhZHlJbkxpc3QgKXsKLQkJCQkJCQlpZiggaW5NYW5pZmVzdChjcCwgYXJjaGl2ZVVSSS5sYXN0U2VnbWVudCgpKSl7Ci0JCQkJCQkJCWVsZW1lbnQgPSBjcmVhdGVBcmNoaXZlRWxlbWVudChVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKHJlZmVyZW5jZWRDb21wb25lbnQpKSwgYXJjaGl2ZVVSSS5sYXN0U2VnbWVudCgpLCBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCkpOwotCQkJCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIHVucmVzb2x2ZWRVUkkpOwotCQkJCQkJCX1lbHNlewotCQkJCQkJCQllbGVtZW50ID0gY3JlYXRlQXJjaGl2ZUVsZW1lbnQoVVJJLmNyZWF0ZVVSSShNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhyZWZlcmVuY2VkQ29tcG9uZW50KSksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSwgbnVsbCk7Ci0JCQkJCQkJCWFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgdW5yZXNvbHZlZFVSSSk7CQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgY3JlYXRlQ2xhc3NwYXRoQXJjaGl2ZUVsZW1lbnQoZmluYWwgSVByb2plY3QgcHJvamVjdCwgVVJJIGFyY2hpdmVVUkksIFN0cmluZyB1bnJlc29sdmVkVVJJKSB7Ci0JCWZpbmFsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUFyY2hpdmVFbGVtZW50KGFyY2hpdmVVUkksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSwgYXJjaGl2ZVVSSS5sYXN0U2VnbWVudCgpKTsKLQkJZWxlbWVudC5zZXRQcm9qZWN0KHByb2plY3QpOwotCQllbGVtZW50LnNldENsYXNzcGF0aERlcGVuZGVuY3kodHJ1ZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NwYXRoRWxlbWVudCBjcmVhdGVDbGFzc3BhdGhFbnRyeUVsZW1lbnQoZmluYWwgSVByb2plY3QgcHJvamVjdCwgVVJJIGFyY2hpdmVVUkksIFN0cmluZyBlbGVtZW50TmFtZSwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWZpbmFsIENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUFyY2hpdmVFbGVtZW50KGFyY2hpdmVVUkksIGVsZW1lbnROYW1lLCBlbGVtZW50TmFtZSk7Ci0JCWVsZW1lbnQuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJZWxlbWVudC5zZXRDbGFzc3BhdGhFbnRyeSh0cnVlLCBlbnRyeSk7Ci0JCWVsZW1lbnQuc2V0VmFsaWQodHJ1ZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCWJvb2xlYW4gaW5NYW5pZmVzdChTdHJpbmdbXSBjcCwgU3RyaW5nIGFyY2hpdmVOYW1lICl7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyBjcEVudHJ5ID0gIiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWNwRW50cnkgPSBjcFtpXTsKLQkJCWlmKCBhcmNoaXZlTmFtZS5lcXVhbHMoY3BFbnRyeSkpewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCQotCXByb3RlY3RlZCBMaXN0IGxvYWRDbGFzc1BhdGhBcmNoaXZlcygpewotICAgICAgICAvKioKLSAgICAgICAgICogV2FybmluZyBjbGVhbi11cCAxMi8wNS8yMDA1Ci0gICAgICAgICAqLyAgIAotCQkvL0xvYWRTdHJhdGVneSBsb2FkU3RyYXQgPSBhcmNoaXZlLmdldExvYWRTdHJhdGVneSgpOwotCQkKLQkJTGlzdCBhcmNoaXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWlmKCBlYXJDb21wb25lbnQhPSBudWxsKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gbmV3cmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IoIGludCBpPTA7IGkgPCBuZXdyZWZzLmxlbmd0aDsgaSsrKXsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBuZXdyZWZzW2ldOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWJvb2xlYW4gaXNCaW5hcnkgPSByZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JCQkKLQkJCQlpZiggaXNCaW5hcnkgKXsKLQkJCQkJU3RyaW5nIHVyaSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudC5nZXROYW1lKCkpLnRvU3RyaW5nKCk7Ci0JCQotCQkJCQl0cnkgewotCQkJCQkJWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgc3RyYXQgPSBjcmVhdGVMb2FkU3RyYXRlZ3kodXJpKTsKLQkJCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZShzdHJhdCwgdXJpKTsKLQkJCQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCi0JCQkJCQlhcmNoaXZlcy5hZGQoYXJjaGl2ZSk7Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBhcmNoaXZlczsKLQl9Ci0JCi0JQXJjaGl2ZSBnZXRDbGFzc1BhdGhBcmNoaXZlKFN0cmluZyB1cmksIExpc3QgYXJjaGl2ZXMpewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQkKLQkJCVN0cmluZyBhcmNoaXZlVVJJU3RyaW5nID0gYW5BcmNoaXZlLmdldFVSSSgpOwotCQkJVVJJIGFyY2hpdmVVUkkgPSBVUkkuY3JlYXRlVVJJKGFyY2hpdmVVUklTdHJpbmcpOwotCQkJYm9vbGVhbiBoYXNBYnNvbHV0ZVBhdGggPSBhcmNoaXZlVVJJLmhhc0Fic29sdXRlUGF0aCgpOwotCQkJaWYoIGhhc0Fic29sdXRlUGF0aCApewotCQkJCWFyY2hpdmVVUklTdHJpbmcgPSBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCk7Ci0JCQl9Ci0JCQlpZiAoYXJjaGl2ZVVSSVN0cmluZy5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gYW5BcmNoaXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlib29sZWFuICBpc0NsYXNzUGF0aEFyY2hpdmUoU3RyaW5nIHVyaSwgTGlzdCBhcmNoaXZlcyl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCQotCQkJU3RyaW5nIGFyY2hpdmVVUklTdHJpbmcgPSBhbkFyY2hpdmUuZ2V0VVJJKCk7Ci0JCQlVUkkgYXJjaGl2ZVVSSSA9IFVSSS5jcmVhdGVVUkkoYXJjaGl2ZVVSSVN0cmluZyk7Ci0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogV2FybmluZyBjbGVhbi11cCAxMi8wNS8yMDA1Ci0JICAgICAgICAgICovICAgCi0JCQkvL2Jvb2xlYW4gaGFzQWJzb2x1dGVQYXRoID0gYXJjaGl2ZVVSSS5oYXNBYnNvbHV0ZVBhdGgoKTsKLQkJCWlmKCBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCkuZXF1YWxzKHVyaSkgKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlwdWJsaWMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgY3JlYXRlTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gdXJpLnJlcGxhY2UoJy8nLCBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmZpbGVfbm90X2ZvdW5kX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8gPSAiVVJJIE5hbWU6IHswfTsgRmlsZSBuYW1lOiB7MX0iCi0JCX0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmZpbGVfbm90X2ZvdW5kX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8gPSAiVVJJIE5hbWU6IHswfTsgRmlsZSBuYW1lOiB7MX0iCi0JCX0KLQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbChmaWxlKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFQVJQcm9qZWN0KEVBUkZpbGUgZWFyRmlsZSkgewotCQlMb2FkU3RyYXRlZ3kgbG9hZFN0cmF0ID0gZWFyRmlsZS5nZXRMb2FkU3RyYXRlZ3koKTsKLQkJaWYgKGxvYWRTdHJhdCBpbnN0YW5jZW9mIEVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwpewotCQkJZWFyQ29tcG9uZW50ID0gKChFQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKSBsb2FkU3RyYXQpLmdldENvbXBvbmVudCgpOwotCQkJZWFyUHJvamVjdCA9ICgoRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCkgbG9hZFN0cmF0KS5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGUoQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50LCBBcmNoaXZlIG90aGVyKSB7Ci0JCWlmIChvdGhlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChjbGllbnRUb0VKQkpBUnMuY29udGFpbnNLZXkob3RoZXIpKQotCQkJZWxlbWVudC5zZXRKYXJUeXBlKENsYXNzcGF0aEVsZW1lbnQuRUpCX0NMSUVOVF9KQVIpOwotCQllbHNlIGlmIChvdGhlci5pc0VKQkphckZpbGUoKSkKLQkJCWVsZW1lbnQuc2V0SmFyVHlwZShDbGFzc3BhdGhFbGVtZW50LkVKQl9KQVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgSVZpcnR1YWxSZWZlcmVuY2Ugb3RoZXIpIHsKLQkJaWYgKG90aGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgaWYgKGNsaWVudFRvRUpCSkFScy5jb250YWluc0tleShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJZWxlbWVudC5zZXRKYXJUeXBlKENsYXNzcGF0aEVsZW1lbnQuRUpCX0NMSUVOVF9KQVIpOwotCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJZWxlbWVudC5zZXRKYXJUeXBlKENsYXNzcGF0aEVsZW1lbnQuRUpCX0pBUik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2FsZWpiVG9DbGllbnRKQVJzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWFwIHJldmVyc2UoTWFwIGxvY2FsZWpiVG9DbGllbnRKQVJzKSB7Ci0JCWlmIChsb2NhbGVqYlRvQ2xpZW50SkFScyA9PSBudWxsIHx8IGxvY2FsZWpiVG9DbGllbnRKQVJzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQlJdGVyYXRvciBpdGVyID0gbG9jYWxlamJUb0NsaWVudEpBUnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc3BhdGhFbGVtZW50KENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkgewotCQlnZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQkJZ2V0VXJpc1RvRWxlbWVudHMoKS5wdXQodXJpLCBlbGVtZW50KTsKLQkJZWxlbWVudC5zZXRQYXJlbnRTZWxlY3Rpb24odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDY6MDU6MTEgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMjIvMjAwMSA2OjA1OjExIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdNb2RpZmllZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbmV3TW9kaWZpZWQpIHsKLQkJbW9kaWZpZWQgPSBuZXdNb2RpZmllZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0VmFsdWVzKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgQXJjaGl2ZSByZWZlcmVuY2VkQXJjaGl2ZSkgewotCQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdChyZWZlcmVuY2VkQXJjaGl2ZSk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZWxlbWVudC5zZXRQcm9qZWN0KHApOwotCQkvL0hhbmRsZSB0aGUgaW1wb3J0ZWQgamFycyBpbiB0aGUgcHJvamVjdAotCQlTdHJpbmdbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IHJlZmVyZW5jZWRBcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCX0gY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIG1mRXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihtZkV4KTsKLQkJCWNwID0gbmV3IFN0cmluZ1tde307Ci0JCX0KLQkJTGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoY3AubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCi0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmlsZSA9IHAuZ2V0RmlsZShjcFtpXSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW52YWxpZFBhdGgpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXBhdGhzLmFkZChmaWxlLmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JCWlmICghcGF0aHMuaXNFbXB0eSgpKQotCQkJZWxlbWVudC5zZXRJbXBvcnRlZEphclBhdGhzKHBhdGhzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0VmFsdWVzKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlZEFyY2hpdmUpIHsKLQkJSVByb2plY3QgcCA9IHJlZmVyZW5jZWRBcmNoaXZlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZWxlbWVudC5zZXRQcm9qZWN0KHApOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQlpZiggY29tcCA9PSBudWxsICkKLQkJCXJldHVybjsKLQkJCi0JCS8vSGFuZGxlIHRoZSBpbXBvcnRlZCBqYXJzIGluIHRoZSBwcm9qZWN0Ci0JCVN0cmluZ1tdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLS8vCQkJY3AgPSByZWZlcmVuY2VkQXJjaGl2ZS5nZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJQXJjaGl2ZU1hbmlmZXN0IHJlZmVyZW5jZWRNYW5pZmVzdCA9IG51bGw7Ci0JCQkKLQkJCWlmKCBjb21wLmlzQmluYXJ5KCkgKXsKLQkJCQlyZWZlcmVuY2VkTWFuaWZlc3QgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5yZWFkTWFuaWZlc3QoY29tcCk7Ci0JCQl9ZWxzZXsKLQkJCQlyZWZlcmVuY2VkTWFuaWZlc3QgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5yZWFkTWFuaWZlc3QocCk7Ci0JCQl9Ci0JCQlpZiggcmVmZXJlbmNlZE1hbmlmZXN0ICE9IG51bGwgKQotCQkJCWNwID0gcmVmZXJlbmNlZE1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQl9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBtZkV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobWZFeCk7Ci0JCQljcCA9IG5ldyBTdHJpbmdbXXt9OwotCQl9Ci0JCWlmKCBjcCAhPSBudWxsICl7Ci0JCQlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdChjcC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQotCQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUgPSBwLmdldEZpbGUoY3BbaV0pOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnZhbGlkUGF0aCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCXBhdGhzLmFkZChmaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQkJaWYgKCFwYXRocy5pc0VtcHR5KCkpCi0JCQkJZWxlbWVudC5zZXRJbXBvcnRlZEphclBhdGhzKHBhdGhzKTsKLQkJCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBjbGFzc3BhdGhFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoZWxlbWVudC5pc1NlbGVjdGVkKCkgJiYgIWVsZW1lbnQuaXNDbGFzc3BhdGhEZXBlbmRlbmN5KCkgJiYgIWVsZW1lbnQuaXNDbGFzc3BhdGhFbnRyeSgpKSB7Ci0JCQkJc2IuYXBwZW5kKGVsZW1lbnQuZ2V0UmVsYXRpdmVUZXh0KCkpOwotCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy9SZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlCi0JCWlmIChzYi5sZW5ndGgoKSA+IDApCi0JCQlzYi5kZWxldGVDaGFyQXQoc2IubGVuZ3RoKCkgLSAxKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsU2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQlzZXRBbGxTZWxlY3RlZChjbGFzc3BhdGhFbGVtZW50cywgc2VsZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbFNlbGVjdGVkKExpc3QgZWxlbWVudHMsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbG10ID0gKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCWVsbXQuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JLyogYm9ycm93ZWQgY29kZSBmcm9tIGpkdCAqLwotCXByb3RlY3RlZCBMaXN0IG1vdmVVcChMaXN0IGVsZW1lbnRzLCBMaXN0IG1vdmUpIHsKLQkJaW50IG5FbGVtZW50cyA9IGVsZW1lbnRzLnNpemUoKTsKLQkJTGlzdCByZXMgPSBuZXcgQXJyYXlMaXN0KG5FbGVtZW50cyk7Ci0JCU9iamVjdCBmbG9hdGluZyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkVsZW1lbnRzOyBpKyspIHsKLQkJCU9iamVjdCBjdXJyID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG1vdmUuY29udGFpbnMoY3VycikpIHsKLQkJCQlyZXMuYWRkKGN1cnIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmxvYXRpbmcgIT0gbnVsbCkgewotCQkJCQlyZXMuYWRkKGZsb2F0aW5nKTsKLQkJCQl9Ci0JCQkJZmxvYXRpbmcgPSBjdXJyOwotCQkJfQotCQl9Ci0JCWlmIChmbG9hdGluZyAhPSBudWxsKSB7Ci0JCQlyZXMuYWRkKGZsb2F0aW5nKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qIGJvcnJvd2VkIGNvZGUgZnJvbSBqZHQgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoTGlzdCB0b01vdmVVcCkgewotCQlzZXRNb2RpZmllZElmQW55U2VsZWN0ZWQodG9Nb3ZlVXApOwotCQlpZiAodG9Nb3ZlVXAuc2l6ZSgpID4gMCkKLQkJCWNsYXNzcGF0aEVsZW1lbnRzID0gbW92ZVVwKGNsYXNzcGF0aEVsZW1lbnRzLCB0b01vdmVVcCk7Ci0JfQotCi0JLyogYm9ycm93ZWQgY29kZSBmcm9tIGpkdCAqLwotCXB1YmxpYyB2b2lkIG1vdmVEb3duKExpc3QgdG9Nb3ZlRG93bikgewotCQlzZXRNb2RpZmllZElmQW55U2VsZWN0ZWQodG9Nb3ZlRG93bik7Ci0JCWlmICh0b01vdmVEb3duLnNpemUoKSA+IDApCi0JCQljbGFzc3BhdGhFbGVtZW50cyA9IHJldmVyc2UobW92ZVVwKHJldmVyc2UoY2xhc3NwYXRoRWxlbWVudHMpLCB0b01vdmVEb3duKSk7Ci0KLQl9Ci0KLQkvKiBib3Jyb3dlZCBjb2RlIGZyb20gamR0ICovCi0JcHJvdGVjdGVkIExpc3QgcmV2ZXJzZShMaXN0IHApIHsKLQkJTGlzdCByZXZlcnNlID0gbmV3IEFycmF5TGlzdChwLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSBwLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlyZXZlcnNlLmFkZChwLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJldmVyc2U7Ci0JfQotCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgZ2V0Q2xhc3NwYXRoRWxlbWVudChTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmlzVG9FbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ2xhc3NwYXRoRWxlbWVudCkgdXJpc1RvRWxlbWVudHMuZ2V0KHVyaSk7Ci0JfQotCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgZ2V0Q2xhc3NwYXRoRWxlbWVudChJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50KSB7Ci0JCWlmIChhcmNoaXZlQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsbW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGNsYXNzcGF0aEVsZW1lbnRzLmdldChpKTsKLQkJCQlpZiAoYXJjaGl2ZUNvbXBvbmVudC5lcXVhbHMoZWxtbnQuZ2V0Q29tcG9uZW50KCkpKQotCQkJCQlyZXR1cm4gZWxtbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgZ2V0Q2xhc3NwYXRoRWxlbWVudChJUHJvamVjdCBhcmNoaXZlUHJvamVjdCkgewotCQlpZiAoYXJjaGl2ZVByb2plY3QgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxtbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgY2xhc3NwYXRoRWxlbWVudHMuZ2V0KGkpOwotCQkJCWlmIChhcmNoaXZlUHJvamVjdC5lcXVhbHMoZWxtbnQuZ2V0UHJvamVjdCgpKSkKLQkJCQkJcmV0dXJuIGVsbW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0RpcmVjdE9ySW5kaXJlY3REZXBlbmRlbmN5VG8oSVByb2plY3QgYXJjaGl2ZVByb2plY3QpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gZ2V0Q2xhc3NwYXRoRWxlbWVudChhcmNoaXZlUHJvamVjdCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuaXNWYWxpZCgpKSB7Ci0JCQl0cnkgewotCQkJCWFuQXJjaGl2ZSA9IChBcmNoaXZlKSBnZXRFQVJGaWxlKCkuZ2V0RmlsZShlbGVtZW50LmdldFRleHQoKSk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBhbkFyY2hpdmUgIT0gbnVsbCAmJiBhcmNoaXZlLmhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhhbkFyY2hpdmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0RpcmVjdE9ySW5kaXJlY3REZXBlbmRlbmN5VG8oU3RyaW5nIGphck5hbWUpIHsKLQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gZ2V0Q2xhc3NwYXRoRWxlbWVudChqYXJOYW1lKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBudWxsOwotCQlpZiAoZWxlbWVudC5pc1ZhbGlkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJYW5BcmNoaXZlID0gKEFyY2hpdmUpIGdldEVBUkZpbGUoKS5nZXRGaWxlKGVsZW1lbnQuZ2V0VGV4dCgpKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFuQXJjaGl2ZSAhPSBudWxsICYmIGFyY2hpdmUuaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKGFuQXJjaGl2ZSk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FueUphclNlbGVjdGVkKGludCB0eXBlKSB7Ci0JCWlmIChjbGFzc3BhdGhFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGNsYXNzcGF0aEVsZW1lbnRzLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRKYXJUeXBlKCkgPT0gdHlwZSAmJiBlbGVtZW50LmlzU2VsZWN0ZWQoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNBbnlFSkJKYXJTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGlzQW55SmFyU2VsZWN0ZWQoQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSKTsKLQl9Ci0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNBbnlFSkJDbGllbnRKQVJTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGlzQW55SmFyU2VsZWN0ZWQoQ2xhc3NwYXRoRWxlbWVudC5FSkJfQ0xJRU5UX0pBUik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRGaWx0ZXJMZXZlbCgpIHsKLQkJcmV0dXJuIGZpbHRlckxldmVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyTGV2ZWwoaW50IGkpIHsKLQkJZmlsdGVyTGV2ZWwgPSBpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNlbGVjdHMgb3IgZGVzZWxlY3RzIGluZGl2dWFsIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBmaWx0ZXIgbGV2ZWwsIGFuZAotCSAqIGFkZGl0aW9uYWxseSBzZXRzIHRoZSBmaWx0ZXIgbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RGaWx0ZXJMZXZlbChpbnQgbGV2ZWwpIHsKLQkJc2V0RmlsdGVyTGV2ZWwobGV2ZWwpOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIEZJTFRFUl9FSkJfQ0xJRU5UX0pBUlMgOgotCQkJCWludmVydENsaWVudEpBUlNlbGVjdGlvbnMoQ2xhc3NwYXRoRWxlbWVudC5FSkJfQ0xJRU5UX0pBUik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZJTFRFUl9FSkJfU0VSVkVSX0pBUlMgOgotCQkJCWludmVydENsaWVudEpBUlNlbGVjdGlvbnMoQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW52ZXJ0Q2xpZW50SkFSU2VsZWN0aW9uKElQcm9qZWN0IGFQcm9qZWN0LCBJUHJvamVjdCBvcHBvc2l0ZSkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBnZXRDbGFzc3BhdGhFbGVtZW50KGFQcm9qZWN0KTsKLQkJQ2xhc3NwYXRoRWxlbWVudCBvcHBvc2l0ZUVsZW1lbnQgPSAob3Bwb3NpdGUgPT0gbnVsbCA/IG51bGwgOiBnZXRDbGFzc3BhdGhFbGVtZW50KG9wcG9zaXRlKSk7Ci0JCWlmIChlbGVtZW50LmlzU2VsZWN0ZWQoKSkKLQkJCWludmVydFNlbGVjdGlvbklmUG9zc2libGUoZWxlbWVudCwgb3Bwb3NpdGVFbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW52ZXJ0Q2xpZW50SkFSU2VsZWN0aW9ucyhpbnQgZWxlbWVudFR5cGUpIHsKLQkJaWYgKGNsYXNzcGF0aEVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGNsYXNzcGF0aEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChlbGVtZW50LmdldEphclR5cGUoKSA9PSBlbGVtZW50VHlwZSAmJiBlbGVtZW50LmlzU2VsZWN0ZWQoKSkgewotCQkJCWludmVydFNlbGVjdGlvbklmUG9zc2libGUoZWxlbWVudCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50VHlwZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbnZlcnRTZWxlY3Rpb25JZlBvc3NpYmxlKENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCwgQ2xhc3NwYXRoRWxlbWVudCBvcHBvc2l0ZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAob3Bwb3NpdGUgPT0gbnVsbCkKLQkJCW9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVFbGVtZW50KGVsZW1lbnQpOwotCQlpZiAob3Bwb3NpdGUgIT0gbnVsbCkgewotCQkJb3Bwb3NpdGUuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQllbGVtZW50LnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSBlbGVtZW50IHJlcHJlc2VudHMgYW4gRUpCIGNsaWVudCBKQVIsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIEpBUi4gSWYgdGhlCi0JICogZWxlbWVudCByZXByZXNlbnRzIGFuIEVKQiBzZXJ2ZXIgSkFSLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNsaWVudCBKQVIuCi0JICovCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQgZ2V0T3Bwb3NpdGVFbGVtZW50KENsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdXJpID0gZWxlbWVudC5nZXRUZXh0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldCA9IGVsZW1lbnQuZ2V0VGFyZ2V0Q29tcG9uZW50KCk7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBvcHBvc2l0ZUpBUiA9IG51bGw7Ci0JCXN3aXRjaCAoZWxlbWVudC5nZXRKYXJUeXBlKCkpIHsKLQkJCWNhc2UgKENsYXNzcGF0aEVsZW1lbnQuRUpCX0NMSUVOVF9KQVIpIDoKLQkJCQlvcHBvc2l0ZUpBUiA9IChJVmlydHVhbENvbXBvbmVudCkgY2xpZW50VG9FSkJKQVJzLmdldCh0YXJnZXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSKSA6Ci0JCQkJb3Bwb3NpdGVKQVIgPSAoSVZpcnR1YWxDb21wb25lbnQpIGVqYlRvQ2xpZW50SkFScy5nZXQodGFyZ2V0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChvcHBvc2l0ZUpBUiAhPSBudWxsKQotCQkJcmV0dXJuIGdldENsYXNzcGF0aEVsZW1lbnQob3Bwb3NpdGVKQVIpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNb2RpZmllZElmQW55U2VsZWN0ZWQoTGlzdCBlbGVtZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQuaXNTZWxlY3RlZCgpKQotCQkJCXNldE1vZGlmaWVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNeUNsaWVudEpBUihDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlamJUb0NsaWVudEpBUnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVZpcnR1YWxDb21wb25lbnQgbXlDbGllbnRKYXIgPSAoSVZpcnR1YWxDb21wb25lbnQpIGVqYlRvQ2xpZW50SkFScy5nZXQoY29tcG9uZW50KTsKLQkJcmV0dXJuIG15Q2xpZW50SmFyICE9IG51bGwgJiYgbXlDbGllbnRKYXIgPT0gZWxlbWVudC5nZXRUYXJnZXRDb21wb25lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFVyaXNUb0VsZW1lbnRzKCkgewotCQlpZih1cmlzVG9FbGVtZW50cyA9PSBudWxsKQotCQkJdXJpc1RvRWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gdXJpc1RvRWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DbGFzc3BhdGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DbGFzc3BhdGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWY2MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ2xhc3NwYXRoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVJbXBvcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRWxlbWVudCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVVRJTF9KQVIgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVKQl9KQVIgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVKQl9DTElFTlRfSkFSID0gMjsKLQlwcm90ZWN0ZWQgaW50IGphclR5cGUgPSBVVElMX0pBUjsKLQkvKiogVGhlIG93bmVyIGFyY2hpdmUgb2YgdGhpcyBlbnRyeSAqLwotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmU7Ci0KLQkvKiogVGhlIGFyY2hpdmUgdGhpcyBlbnRyeSByZWZlcmVuY2VzLCBpZiBpdCBleGlzdHMgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSB0YXJnZXRBcmNoaXZlOwotCi0JLyoqIFRoZSBkaXNwbGF5IHRleHQgZm9yIHRoaXMgaXRlbSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLQkvKiogSW5kaWNhdGVzIGlmIHRoaXMgaXMgc2VsZWN0ZWQgaW4gdGhlIHZpZXcgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3RlZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZDsKLQkvKiogSW5kaWNhdGVzIGlmIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIGEgY29tcG9uZW50IGRlcGVuZGVuY3kgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb2x2ZWQgSmF2YSBjbGFzc3BhdGggZW50cnkgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIHZpcnR1YWwgY29tcG9uZW50IGFwaSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NwYXRoRGVwZW5kZW5jeSA9IGZhbHNlOyAKLQkvKiogSW5kaWNhdGVzIGlmIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YSBjbGFzc3BhdGggZW50cnkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzcGF0aEVudHJ5PSBmYWxzZTsgCi0JLyoqIEZvciBlbG1lbnRzIHRoYXQgcmVwcmVzZW50IGEgSmF2YSBjbGFzc3BhdGggZW50cnksIGhvbGRzIHRoZSBlbnRyeSAqLwotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSB0ZXh0IHRoYXQgaXMgYW4gYWN0dWFsIENsYXNzLVBhdGggZW50cnkgaW4gdGhlIE1hbmlmZXN0OyBpbiB0aGUgY2FzZSBvZiBtdWx0aS1zZWdtZW50Ci0JICogdXJpcywgbWlnaHQgbG9vayBsaWtlIC4uL3h4eAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVsYXRpdmVUZXh0OwotCS8qKiBUaGUgcHJvamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBkZXBlbmRlbnQgbW9kdWxlLCB3aGVuIGl0IGV4aXN0cyAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCS8qKgotCSAqIElmIHRoZSBwcm9qZWN0IGlzIG5vdCBudWxsLCB0aGVyZSBtYXkgYmUgaW1wb3J0ZWQgamFycyBpbiB0aGUgcHJvamVjdCBMaXN0IG9mIElQYXRoCi0JICovCi0JcHJvdGVjdGVkIExpc3QgaW1wb3J0ZWRKYXJQYXRoczsKLQlwcm90ZWN0ZWQgSVByb2plY3QgZWFyUHJvamVjdDsKLQlwcm90ZWN0ZWQgQ2xhc3NQYXRoU2VsZWN0aW9uIHBhcmVudFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgVVJJIGFyY2hpdmVVUkk7Ci0JcHJvdGVjdGVkIFN0cmluZyBlYXJDb250ZW50Rm9sZGVyOwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudDsKLQotCXB1YmxpYyBDbGFzc3BhdGhFbGVtZW50KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXN1cGVyKCk7Ci0JCWFyY2hpdmUgPSBhbkFyY2hpdmU7Ci0JfQotCQotCXB1YmxpYyBDbGFzc3BhdGhFbGVtZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIENsYXNzcGF0aEVsZW1lbnQoVVJJICBhQXJjaGl2ZVVSSSkgewotCQlzdXBlcigpOwotCQlhcmNoaXZlVVJJID0gYUFyY2hpdmVVUkk7Ci0JfQkKLQotCXB1YmxpYyBDbGFzc3BhdGhFbGVtZW50KElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21wb25lbnQgPSBhQ29tcG9uZW50OwotCQl0aGlzLnByb2plY3QgPSBhQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVsYXRpdmVUZXh0KCkgewotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlyZWxhdGl2ZVRleHQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5jb21wdXRlUmVsYXRpdmVUZXh0KGFyY2hpdmUuZ2V0VVJJKCksIGdldFRleHQoKSk7Ci0JCQlpZiAocmVsYXRpdmVUZXh0ID09IG51bGwpCi0JCQkJcmVsYXRpdmVUZXh0ID0gZ2V0VGV4dCgpOwotCQl9Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLQkJewotCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQkJCVN0cmluZyBhcmNoaXZlVVJJID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCXJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQkJaWYoIGNvbXBvbmVudC5lcXVhbHMocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkpewotCQkJCQlhcmNoaXZlVVJJID0gcmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFyY2hpdmVVUkkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZWxhdGl2ZVRleHQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5jb21wdXRlUmVsYXRpdmVUZXh0KGFyY2hpdmVVUkksIGdldFRleHQoKSk7Ci0JCQl9Ci0JCQlpZiAocmVsYXRpdmVUZXh0ID09IG51bGwpCi0JCQkJcmVsYXRpdmVUZXh0ID0gZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yOC8yMDAxIDU6MDc6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRFYXJQcm9qZWN0KCkgewotCQlyZXR1cm4gZWFyUHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0SW1wb3J0ZWRKYXJBc0lGaWxlKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRUZXh0KCkgIT0gbnVsbCAmJiBnZXRUZXh0KCkuZW5kc1dpdGgoSjJFRUltcG9ydENvbnN0YW50cy5JTVBPUlRFRF9KQVJfU1VGRklYKSkgewotCQkJCUlGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShnZXRUZXh0KCkpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yOC8yMDAxIDQ6MzM6MzUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbXBvcnRlZEphclBhdGhzKCkgewotCQlyZXR1cm4gaW1wb3J0ZWRKYXJQYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzI3LzIwMDEgMToxNDowNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmFyVHlwZSgpIHsKLQkJcmV0dXJuIGphclR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yNS8yMDAxIDY6MjE6MDEgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlpZihwcm9qZWN0ICE9IG51bGwpewotCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQl9IGVsc2UgaWYocmVsYXRpdmVUZXh0ICE9IG51bGwpewotCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCQlpZihlYXJDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQkJCWlmKCByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwgKXsKLQkJCQkJCVN0cmluZyBuYW1lID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCk7Ci0JCQkJCQlpZihuYW1lLmxhc3RJbmRleE9mKCcvJykgIT0gLTEpewotCQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcvJykrMSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMocmVsYXRpdmVUZXh0KSl7Ci0JCQkJCQkJcmV0dXJuIHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0ID09IG51bGwgPyBudWxsIDogcHJvamVjdC5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVsYXRpdmVUZXh0KCkgewotCQlpZiAocmVsYXRpdmVUZXh0ID09IG51bGwpCi0JCQljb21wdXRlUmVsYXRpdmVUZXh0KCk7Ci0JCXJldHVybiByZWxhdGl2ZVRleHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDExOjAwOjM2IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMjIvMjAwMSAxMTowMTo0NiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGlzIENsYXNzcGF0aEVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb2x2ZWQgSmF2YSBjbGFzc3BhdGggZW50cnkgCi0JICogdGhhdCBpcyB0YWdnZWQgYXMgYSBjb21wb25lbnQgZGVwZW5kZW5jeS4KLQkgKiBAcmV0dXJuIFRydWUgaWYgYSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc3BhdGhEZXBlbmRlbmN5KCkgewotCQlyZXR1cm4gaXNDbGFzc3BhdGhEZXBlbmRlbmN5OwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyBDbGFzc3BhdGhFbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlc29sdmVkIEphdmEgY2xhc3NwYXRoIGVudHJ5IAotCSAqIHRoYXQgaXMgdGFnZ2VkIGFzIGEgY29tcG9uZW50IGRlcGVuZGVuY3kuCi0JICogQHBhcmFtIGNsYXNzcGF0aERlcGVuZGVuY3kgVHJ1ZSBpZiBhIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhEZXBlbmRlbmN5KGZpbmFsIGJvb2xlYW4gY2xhc3NwYXRoRGVwZW5kZW5jeSkgewotCQl0aGlzLmlzQ2xhc3NwYXRoRGVwZW5kZW5jeSA9IGNsYXNzcGF0aERlcGVuZGVuY3k7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhpcyBDbGFzc3BhdGhFbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBhIEphdmEgY2xhc3NwYXRoIGVudHJ5IAotCSAqIHRoYXQgaXMgZWl0aGVyIGN1cnJlbnRseSB0YWdnZWQgb3IgY2FuIGJlIHRhZ2dlZCBhcyBhIGNvbXBvbmVudCBkZXBlbmRlbmN5LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jeS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gaXNDbGFzc3BhdGhFbnRyeTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoaXMgQ2xhc3NwYXRoRWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBKYXZhIGNsYXNzcGF0aCBlbnRyeSAKLQkgKiB0aGF0IGlzIGVpdGhlciBjdXJyZW50bHkgdGFnZ2VkIG9yIGNhbiBiZSB0YWdnZWQgYXMgYSBjb21wb25lbnQgZGVwZW5kZW5jeS4KLQkgKiBAcGFyYW0gaXNDbGFzc3BhdGhFbnRyeSBUcnVlIGlmIGEgY2xhc3NwYXRoIGVudHJ5LgotCSAqIEBwYXJhbSBlbnRyeSBUaGUgYXNzb2NpYXRlZCBjbGFzc3BhdGggZW50cnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoRW50cnkoZmluYWwgYm9vbGVhbiBpc0NsYXNzcGF0aEVudHJ5LCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJdGhpcy5pc0NsYXNzcGF0aEVudHJ5PSBpc0NsYXNzcGF0aEVudHJ5OwotCQl0aGlzLmNsYXNzcGF0aEVudHJ5ID0gZW50cnk7Ci0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyBhbnkgYXNzb2NpYXRlZCBjbGFzc3BhdGggZW50cnkuCi0JICogQHJldHVybiBBc3NvY2lhdGVkIGNsYXNzcGF0aCBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0Q2xhc3NwYXRoRW50cnkoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzI3LzIwMDEgMTowNDozNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9qZWN0OwotCQlyZXR1cm4gZWFyUHJvamVjdC5nZXRGaWxlKGdldFRleHQoKSk7Ci0JfQotCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aEVudHJpZXNGb3JBcmNoaXZlKCkgewotCQlpZiggIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSl7Ci0JCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0gIiI7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlUGF0aCA9IE1vZHVsZVVSSVV0aWwuZ2V0QXJjaGl2ZU5hbWUoYXJjaGl2ZVVSSSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlJUGF0aCByZXNQYXRoID0gbmV3IFBhdGgocmVzb3VyY2VQYXRoKTsKLQkJCWlmICghcmVzUGF0aC5pc0Fic29sdXRlKCkpCi0JCQkJcmVzUGF0aCA9IHJlc1BhdGgubWFrZUFic29sdXRlKCk7Ci0JCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VQYXRoKTsKLQkJCWlmKCBmaWxlLmV4aXN0cygpIHx8IEoyRUVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhuZXcgUGF0aChyZXNvdXJjZVBhdGgpKSl7Ci0JCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoIHJlc1BhdGgsIG51bGwsIG51bGwsIHRydWUpfTsKLQkJCX1lbHNlewotCQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeSggcmVzUGF0aCwgbnVsbCwgbnVsbCl9OwotCQkJfQotCQl9CQotCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQWRhcHRlciBtZXRob2QgdG8gY29udmVydCB0aGlzIG1hbmlmZXN0IGNsYXNzIHBhdGggZWxlbWVudCB0byB6ZXJvIG9yIG1vcmUgY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBmb3IgYSBqYXZhIGJ1aWxkIHBhdGgKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cmllcyhTZXQgdmlzaXRlZCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyh0aGlzKSkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQl2aXNpdGVkLmFkZCh0aGlzKTsKLQkJaWYgKHJlcHJlc2VudHNJbXBvcnRlZEphcigpKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZ2V0SW1wb3J0ZWRKYXJBc0lGaWxlKCkuZ2V0RnVsbFBhdGgoKSwgbnVsbCwgbnVsbCl9OwotCQkKLQkJaWYoIGFyY2hpdmVVUkkgIT0gbnVsbCAmJiAhYXJjaGl2ZVVSSS5lcXVhbHMoIiIpICl7Ci0JCQlyZXR1cm4gbmV3Q2xhc3NwYXRoRW50cmllc0ZvckFyY2hpdmUoKTsKLQkJfQotCQlpZiAoIXZhbGlkICYmIGlzU2VsZWN0ZWQoKSkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCi0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3Q2xhc3NwYXRoRW50cmllc0Zyb21FQVJQcm9qZWN0KHZpc2l0ZWQpOwotCi0JCUlDbGFzc3BhdGhFbnRyeSBwcm9qZWN0RW50cnkgPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCksIHRydWUpOwotCQlpZiAoaW1wb3J0ZWRKYXJQYXRocyA9PSBudWxsIHx8IGltcG9ydGVkSmFyUGF0aHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtwcm9qZWN0RW50cnl9OwotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJcmVzdWx0LmFkZChwcm9qZWN0RW50cnkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydGVkSmFyUGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGltcG9ydGVkSmFyUGF0aHMuZ2V0KGkpOwotCQkJcmVzdWx0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCkpOwotCQl9Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlyZXR1cm4gbmV3Q2xhc3NwYXRoRW50cmllcyhuZXcgSGFzaFNldCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5IG5ld0NsYXNzcGF0aEVudHJ5RnJvbUVBUlByb2ooKSB7Ci0JCUlQYXRoIHBhdGggPSBlYXJQcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKCBnZXRFYXJDb250ZW50Rm9sZGVyKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBlYXJQcm9qZWN0LmdldEZpbGUoZ2V0VGV4dCgpKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHBhdGgsIG51bGwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhcmNoaXZlIGlzIGluIHRoZSBFQVIgYW5kIG5vdCBpbiBhIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aEVudHJpZXNGcm9tRUFSUHJvamVjdChTZXQgdmlzaXRlZCkgewotCQlMaXN0IGNwRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY3BFbnRyaWVzLmFkZChuZXdDbGFzc3BhdGhFbnRyeUZyb21FQVJQcm9qKCkpOwotCQl0cmF2ZXJzZUNsYXNzcGF0aHMoY3BFbnRyaWVzLCB2aXNpdGVkKTsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgY3BFbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtjcEVudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBJZiB5b3UgaGF2ZSBhIGRlcGVuZGVuY3kgdG8gYSBKQVIgaW4gdGhlIEVBUiBwcm9qZWN0LCBhbmQgdGhlIEpBUiBkZXBlbmRzIG9uIGFub3RoZXIgSkFSIGluCi0JICogdGhlIEVBUjsgeW91IHdhbnQgdG8gY29tcGlsZSBjbGVhbmx5IGFmdGVyIGltcG9ydCwgc28geW91IG5lZWQgYm90aCB0aG9zZSBKQVJzIG9uIHlvdXIgYnVpbGQKLQkgKiBwYXRoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VDbGFzc3BhdGhzKExpc3QgcHJvamVjdENwRW50cmllcywgU2V0IHZpc2l0ZWQpIHsKLQotCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFGaWxlID0gZ2V0RUFSRmlsZSgpLmdldEZpbGUoZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vdFRoZXJlKSB7Ci0JCX0KLQkJaWYgKGFGaWxlID09IG51bGwgfHwgIWFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJcmV0dXJuOwotCi0JCUFyY2hpdmUgZGVwQXJjaGl2ZSA9IChBcmNoaXZlKSBhRmlsZTsKLQkJU3RyaW5nW10gbWFuaWZlc3RDcEVudHJpZXMgPSBkZXBBcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFuaWZlc3RDcEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShtYW5pZmVzdENwRW50cmllc1tpXSwgZGVwQXJjaGl2ZSk7Ci0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IG90aGVyID0gcGFyZW50U2VsZWN0aW9uLmdldENsYXNzcGF0aEVsZW1lbnQodXJpKTsKLQkJCS8vSWYgdGhlIG90aGVyIGVsZW1lbnQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgdGhlbgotCQkJLy8gd2UgZG9uJ3QgbmVlZCB0byBhZGQgaXQgYWdhaW4KLQkJCWlmIChvdGhlciA9PSBudWxsIHx8IG90aGVyLmlzU2VsZWN0ZWQoKSkKLQkJCQljb250aW51ZTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNwRW50cmllcyA9IG90aGVyLm5ld0NsYXNzcGF0aEVudHJpZXModmlzaXRlZCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwRW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCWlmICghcHJvamVjdENwRW50cmllcy5jb250YWlucyhjcEVudHJpZXNbal0pKQotCQkJCQlwcm9qZWN0Q3BFbnRyaWVzLmFkZChjcEVudHJpZXNbal0pOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiByZXByZXNlbnRzSW1wb3J0ZWRKYXIoKSB7Ci0JCXJldHVybiBnZXRJbXBvcnRlZEphckFzSUZpbGUoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMjgvMjAwMSA1OjA3OjI2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFYXJQcm9qZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhclByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgbmV3RWFyUHJvamVjdCkgewotCQllYXJQcm9qZWN0ID0gbmV3RWFyUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzI4LzIwMDEgNDozMzozNSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SW1wb3J0ZWRKYXJQYXRocwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnRlZEphclBhdGhzKGphdmEudXRpbC5MaXN0IG5ld0ltcG9ydGVkSmFyUGF0aHMpIHsKLQkJaW1wb3J0ZWRKYXJQYXRocyA9IG5ld0ltcG9ydGVkSmFyUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yNy8yMDAxIDE6MTQ6MDQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0phclR5cGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphclR5cGUoaW50IG5ld0phclR5cGUpIHsKLQkJamFyVHlwZSA9IG5ld0phclR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yNS8yMDAxIDY6MjE6MDEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCXByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMjIvMjAwMSA0OjIwOjU1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdSZWxhdGl2ZVRleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdSZWxhdGl2ZVRleHQpIHsKLQkJcmVsYXRpdmVUZXh0ID0gbmV3UmVsYXRpdmVUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKEFyY2hpdmUgcmVmZXJlbmNpbmdKYXIsIEFyY2hpdmUgcmVmZXJlbmNlZEphciwgTGlzdCBjbGFzc1BhdGgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGguc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBjcEVudHJ5ID0gKFN0cmluZykgY2xhc3NQYXRoLmdldChpKTsKLQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjcEVudHJ5LCByZWZlcmVuY2luZ0phcik7Ci0JCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmVxdWFscyhyZWZlcmVuY2VkSmFyLmdldFVSSSgpKSkgewotCQkJCXNldFNlbGVjdGVkKHRydWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRTZWxlY3RlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDExOjAxOjQ2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTZWxlY3RlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gbmV3U2VsZWN0ZWQpIHsKLQkJYm9vbGVhbiBvbGRTZWxlY3RlZCA9IHNlbGVjdGVkOwotCQlzZWxlY3RlZCA9IG5ld1NlbGVjdGVkOwotCQlpZiAob2xkU2VsZWN0ZWQgIT0gbmV3U2VsZWN0ZWQgJiYgcGFyZW50U2VsZWN0aW9uICE9IG51bGwpCi0JCQlwYXJlbnRTZWxlY3Rpb24uc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDExOjAwOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dCA9IG5ld1RleHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yNy8yMDAxIDE6MDQ6MzUgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbGlkCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiBuZXdWYWxpZCkgewotCQl2YWxpZCA9IG5ld1ZhbGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlc1NlbGVjdGVkKFN0cmluZyBjcEVudHJ5KSB7Ci0JCXNldFNlbGVjdGVkKHRydWUpOwotCQlzZXRSZWxhdGl2ZVRleHQoY3BFbnRyeSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJDbGFzc3BhdGhlRWxlbWVudCgiICsgZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gKEVBUkZpbGUpIGFyY2hpdmUuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCi0Jdm9pZCBzZXRQYXJlbnRTZWxlY3Rpb24oQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlwYXJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkphcigpIHsKLQkJcmV0dXJuIGphclR5cGUgPT0gRUpCX0pBUjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQkNsaWVudEphcigpIHsKLQkJcmV0dXJuIGphclR5cGUgPT0gRUpCX0NMSUVOVF9KQVI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGdldFRhcmdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiB0YXJnZXRBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VGFyZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gdGFyZ2V0Q29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0QXJjaGl2ZShBcmNoaXZlIGFyY2hpdmUpIHsKLQkJdGFyZ2V0QXJjaGl2ZSA9IGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGFUYXJnZXRDb21wb25lbnQpIHsKLQkJdGFyZ2V0Q29tcG9uZW50ID0gYVRhcmdldENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEFyY2hpdmVVUkkoKSB7Ci0JCXJldHVybiBhcmNoaXZlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWFyQ29udGVudEZvbGRlcigpIHsKLQkJcmV0dXJuIGVhckNvbnRlbnRGb2xkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWFyQ29udGVudEZvbGRlcihTdHJpbmcgZWFyQ29udGVudEZvbGRlcikgewotCQl0aGlzLmVhckNvbnRlbnRGb2xkZXIgPSBlYXJDb250ZW50Rm9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzMTNmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPGNvZGU+QWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjwvY29kZT4gc3ViY2xhc3MgdGhhdCBzdXBwb3J0cyB0aGUgPGNvZGU+Q29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZU9wPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIENvbXB1dGVFQVJzRm9yQ29udGV4dFJvb3RVcGRhdGVEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVXBkYXRlTW9kdWxlQ29udGV4dFJvb3RQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJZmluYWwgU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVBUlNfVE9fVVBEQVRFKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZU9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYWE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiA8Y29kZT5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjwvY29kZT4gc3ViY2xhc3MgdGhhdCBjb21wdXRlcyB0aGUgc2V0IG9mIHJlZmVyZW5jaW5nIEVBUnMKLSAqIGluIHdoaWNoIHRoZSBjb250ZXh0LXJvb3QgZm9yIGEgZ2l2ZW4gbW9kdWxlIHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElVcGRhdGVNb2R1bGVDb250ZXh0Um9vdFByb3BlcnRpZXMgeyAKLQkKLQlwdWJsaWMgQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZU9wKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCltb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLSAgICAgICAgZmluYWwgTGlzdCBlYXJzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAkvLyBnZXQgdGhlIHNldCBvZiBhbGwgcmVmZXJlbmNpbmcgRUFScwotICAgICAgICAJZmluYWwgSVByb2plY3RbXSBlYXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLSAgICAgICAgCQotICAgICAgICAJLy8gZm9yIGVhY2ggRUFSLCBjaGVjayBpZiB0aGUgY3VycmVudCBjb250ZXh0LXJvb3QgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG9sZCBjb250ZXh0LXJvb3Qgc2V0dGluZwotICAgICAgICAJLy8gaWYgaXQgaXMsIHVwZGF0ZSBpdCB0byByZWZsZWN0IHRoZSBuZXcgdmFsdWUKLSAgICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotICAgICAgICAJCS8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LXJvb3QgZm9yIHRoZSBtb2R1bGUKLSAgICAgICAgCQkvLyBpcyBlcXVhbCB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBhc3NvY2lhdGVkIEVBUidzCi0gICAgICAgIAkJLy8gYXBwbGljYXRpb24ueG1sCi0gICAgICAgIAkJaWYgKGN1cnJlbnRSb290RXF1YWxzRUFSUm9vdChlYXJzW2ldLCBwcm9qZWN0KSkgewotICAgICAgICAJCQllYXJzVG9VcGRhdGUuYWRkKGVhcnNbaV0pOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCS8vIFNhdmUgdGhlIGxpc3Qgb2YgRUFScyB0byB1cGRhdGUgaW4gYSBuZXN0ZWQgSURhdGFNb2RlbAotICAgICAgICAJSURhdGFNb2RlbCBuZXN0ZWRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIAluZXN0ZWRNb2RlbC5zZXRQcm9wZXJ0eShFQVJTX1RPX1VQREFURSwgZWFyc1RvVXBkYXRlKTsKLSAgICAgICAgCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9JRCwgbmVzdGVkTW9kZWwpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IG1vZHVsZSBjb250ZXh0LXJvb3QgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIGluIHRoZSBhcHBsaWNhdGlvbi54bWwuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGN1cnJlbnRSb290RXF1YWxzRUFSUm9vdChmaW5hbCBJUHJvamVjdCBlYXJQcm9qZWN0LCBmaW5hbCBJUHJvamVjdCBtb2R1bGVQcm9qZWN0KSB7Ci0JCUVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVhckVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChlYXJQcm9qZWN0KTsKLQkJCWlmIChlYXJFZGl0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlmaW5hbCBBcHBsaWNhdGlvbiBhcHAgPSBlYXJFZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQobW9kdWxlUHJvamVjdCk7Ci0JCQlpZiAoYXBwID09IG51bGwgfHwgY29tcCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZmluYWwgU3RyaW5nIG1vZHVsZVVSSSA9IGVhckVkaXQuZ2V0TW9kdWxlVVJJKGNvbXApOwotCQkJZmluYWwgTW9kdWxlIG1vZHVsZSA9IGFwcC5nZXRGaXJzdE1vZHVsZShtb2R1bGVVUkkpOwotCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIFdlYk1vZHVsZSkgewotCQkJCWZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBjb21wLmdldE1ldGFQcm9wZXJ0aWVzKCk7Ci0JCQkJaWYgKChwcm9wcyAhPSBudWxsKSAmJiAocHJvcHMuY29udGFpbnNLZXkoSjJFRUNvbnN0YW50cy5DT05URVhUUk9PVCkpKSB7Ci0JCQkJCXJldHVybiAoKFdlYk1vZHVsZSkgbW9kdWxlKS5nZXRDb250ZXh0Um9vdCgpLmVxdWFscyhwcm9wcy5nZXRQcm9wZXJ0eShKMkVFQ29uc3RhbnRzLkNPTlRFWFRST09UKSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkgewotCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3JlZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBuby1vcAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3VuZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBuby1vcAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2YWE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbiBleHRlbmRzIEoyRUVVdGlsaXR5SmFySW1wb3J0QXNzaXN0YW50T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBDb3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uKEZpbGUgdXRpbGl0eUphcikgewotCQlzdXBlcihOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uX0NvcHlpbmdfYXJjaGl2ZV9pbnRvX3NlbGVjdGVkX3Byb2plXywgdXRpbGl0eUphci5nZXROYW1lKCkpLCB1dGlsaXR5SmFyKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uX0NvcHlpbmdfYXJjaGl2ZV9pbnRvX3NlbGVjdGVkX3Byb2plXywgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG51bGwpOwotCQkgCi0JCXRyeSB7Ci0KLQkJCUlGaWxlIGNvcGllZEphckZpbGUgPSBudWxsOwotCQkJCi0JCQlJUHJvamVjdCBhc3NvY2lhdGVkRUFSUHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGdldEFzc29jaWF0ZWRFQVJQcm9qZWN0TmFtZSgpKTsgCi0JCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhc3NvY2lhdGVkRUFSUHJvamVjdCk7Ci0JCQkKLQkJCUlDb250YWluZXIgdW5kZXJseWluZ0ZvbGRlciA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQkJaWYodW5kZXJseWluZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewotCQkJCSBjb3BpZWRKYXJGaWxlID0gdW5kZXJseWluZ0ZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJIGNvcGllZEphckZpbGUgPSBhc3NvY2lhdGVkRUFSUHJvamVjdC5nZXRGaWxlKGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpOwotCQkJfQkJCi0gCQkJaWYgKGNvcGllZEphckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNPdmVyd3JpdGVJZk5lY2Vzc2FyeSgpKQotCQkJCQljb3BpZWRKYXJGaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQllbHNlIHsKLQkJCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE5MUy5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkNvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb25fRm91bmRfZXhpc3RpbmdfZmlsZV8wXywgY29waWVkSmFyRmlsZSksIG51bGwpKTsKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0JCQl9IAotCQkJCi0JCQlGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0U3RyZWFtID0gbnVsbDsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBudWxsOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gamFyRmlsZUlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRVdGlsaXR5SmFyKCkpOwotCQkJCWJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzQwOTZdOwotCQkJCXRyeSB7Ci0JCQkJCWludCBieXRlc1JlYWQgPSAwOwotCQkJCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGZpbGVJbnB1dFN0cmVhbS5yZWFkKGRhdGEpKSA+IDApCi0JCQkJCQlib3Mud3JpdGUoZGF0YSwgMCwgYnl0ZXNSZWFkKTsKLQkJCQkJLy8gY2xlYXIgc3BhY2UgZm9yIEdDCi0JCQkJCWRhdGEgPSBudWxsOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKGZpbGVJbnB1dFN0cmVhbSAhPSBudWxsKSAKLQkJCQkJCWZpbGVJbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQotCQkJCWphckZpbGVJbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSk7Ci0JCQkJY29waWVkSmFyRmlsZS5jcmVhdGUoamFyRmlsZUlucHV0U3RyZWFtLCAwLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQotCQkJCWFkZExpYnJhcnlUb0NsYXNzcGF0aChhc3NvY2lhdGVkRUFSUHJvamVjdCwgY29waWVkSmFyRmlsZSwgbW9uaXRvcik7Ci0JCQkJCi0JCQkJY3JlYXRlVmlydHVhbEFyY2hpdmVDb21wb25lbnQoYXNzb2NpYXRlZEVBUlByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIGNvcGllZEphckZpbGUsIG1vbml0b3IpOwotCQkJCQotCQkJCQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYm9zICE9IG51bGwpCi0JCQkJCWJvcy5jbG9zZSgpOwotCQkJCWlmIChqYXJGaWxlSW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJamFyRmlsZUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9IAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOyAgCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfSAgCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoRXh0cmFjdGVkSmFyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTM3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb24gZXh0ZW5kcyBKMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbiB7Ci0vLwlwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluYXJ5UHJvamVjdCA9IGZhbHNlOyAKLQlwcml2YXRlIFN0cmluZyBuZXdQcm9qZWN0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0Um9vdDsKLS8vCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVBc0JpbmFyeTsKLQotCXB1YmxpYyBDcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbihGaWxlIHV0aWxpdHlKYXIsIFN0cmluZyBvdmVycmlkaW5nUHJvamVjdFJvb3QpIHsKLQkJc3VwZXIoTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb25fQ3JlYXRlX3Byb2plY3Rfd2l0aF9leHRyYWN0ZWRfY29udGVfLCB1dGlsaXR5SmFyLmdldE5hbWUoKSksIHV0aWxpdHlKYXIpOwotCQluZXdQcm9qZWN0TmFtZSA9IGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZSh1dGlsaXR5SmFyKTsKLQkJcHJvamVjdFJvb3QgPSBmaW5kVW5pcXVlTG9jYXRpb24ob3ZlcnJpZGluZ1Byb2plY3RSb290LCBuZXdQcm9qZWN0TmFtZSk7IAotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkNyZWF0ZVByb2plY3RXaXRoRXh0cmFjdGVkSmFyT3BlcmF0aW9uX0NyZWF0ZV9wcm9qZWN0X3dpdGhfZXh0cmFjdGVkX2NvbnRlXywgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG51bGwpOwotCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQl0cnkgewotCQkJYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5wcmltT3BlbkFyY2hpdmUoZ2V0VXRpbGl0eUphcigpLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJSURhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOyAKLQotCQkJaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFLCBhcmNoaXZlKTsKLS8vCQkJaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGdldFV0aWxpdHlKYXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJCWlmIChwcm9qZWN0Um9vdCAhPSBudWxsICYmIHByb2plY3RSb290Lmxlbmd0aCgpID4gMCkgewkJCQkKLQkJCQlpbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFX0RFRkFVTFRfTE9DQVRJT04sIGZhbHNlKTsKLQkJCQlpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VSX0RFRklORURfTE9DQVRJT04sIHByb2plY3RSb290KTsKLQkJCX0KLQotCQkJLy8gaW1wb3J0TW9kZWwuZ2V0SjJlZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCB0cnVlKTsKLQkJCWlmIChpc092ZXJ3cml0ZUlmTmVjZXNzYXJ5KCkpIHsKLQkJCQkvLyBpbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSEFORExFUik7Ci0JCQkJSVByb2plY3QgZXhpc3RpbmdQcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QobmV3UHJvamVjdE5hbWUpOwotCQkJCWlmIChleGlzdGluZ1Byb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJZXhpc3RpbmdQcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWltcG9ydE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBuZXdQcm9qZWN0TmFtZSk7Ci0JCQlpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGdldEFzc29jaWF0ZWRFQVJQcm9qZWN0TmFtZSgpKTsKLQotCQkJc3RhdHVzLmFkZChpbXBvcnRNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCBpbmZvKSk7IAotCQkJCi0JCQlJUHJvamVjdCBhc3NvY2lhdGVkRUFSUHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGdldEFzc29jaWF0ZWRFQVJQcm9qZWN0TmFtZSgpKTsKLSAJCQlJUHJvamVjdCB1dGlsaXR5SmFyUHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KG5ld1Byb2plY3ROYW1lKTsKLQkJCWxpbmtBcmNoaXZlVG9FQVIoYXNzb2NpYXRlZEVBUlByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIHV0aWxpdHlKYXJQcm9qZWN0LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKGFyY2hpdmUgIT0gbnVsbCkKLQkJCQlhcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0JCXRoaXMubmV3UHJvamVjdE5hbWUgPSBuZXdQcm9qZWN0TmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRhYjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLQotcHVibGljIGNsYXNzIENyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uIGV4dGVuZHMgSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbGlua2VkUGF0aFZhcmlhYmxlOwotCXByaXZhdGUgU3RyaW5nIHByb2plY3RSb290OwotLy8JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUFzQmluYXJ5OwotCi0JcHVibGljIENyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uKEZpbGUgdXRpbGl0eUphciwgU3RyaW5nIG92ZXJyaWRpbmdQcm9qZWN0Um9vdCwgU3RyaW5nIGxpbmtlZFBhdGhWYXJpYWJsZSkgewotCQlzdXBlcihOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbl9DcmVhdGluZ19wcm9qZWN0X3dpdGhfbGlua2VkX2FyY2hpdl8sIHV0aWxpdHlKYXIuZ2V0TmFtZSgpKSwgdXRpbGl0eUphcik7Ci0JCXRoaXMubGlua2VkUGF0aFZhcmlhYmxlPSBsaW5rZWRQYXRoVmFyaWFibGU7IAotCQlwcm9qZWN0Um9vdCA9IGZpbmRVbmlxdWVMb2NhdGlvbihvdmVycmlkaW5nUHJvamVjdFJvb3QsIGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZSh1dGlsaXR5SmFyKSk7IAotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkNyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uX0NyZWF0aW5nX3Byb2plY3Rfd2l0aF9saW5rZWRfYXJjaGl2XywgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG51bGwpOwotIAotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZShnZXRVdGlsaXR5SmFyKCkpKTsKLQkJCQotCQkJSURhdGFNb2RlbCBjcmVhdGVVdGlsaXR5UHJvamVjdCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQljcmVhdGVVdGlsaXR5UHJvamVjdC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgZ2V0VXRpbGl0eUphclByb2plY3ROYW1lKGdldFV0aWxpdHlKYXIoKSkpOwotCQkJCi0JCQlpZiAocHJvamVjdFJvb3QgIT0gbnVsbCAmJiBwcm9qZWN0Um9vdC5sZW5ndGgoKSA+IDApIHsJCQkJCi0JCQkJY3JlYXRlVXRpbGl0eVByb2plY3Quc2V0Qm9vbGVhblByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBmYWxzZSk7Ci0JCQkJY3JlYXRlVXRpbGl0eVByb2plY3Quc2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLCBwcm9qZWN0Um9vdCk7Ci0JCQl9Ci0gCQkJCi0JCQljcmVhdGVVdGlsaXR5UHJvamVjdC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7Ci0JCQkKLQkJCXN0YXR1cy5hZGQoY3JlYXRlVXRpbGl0eVByb2plY3QuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgaW5mbykpOwotCQkJCi0JCQlJUHJvamVjdCB1dGlsaXR5SmFyUHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZShnZXRVdGlsaXR5SmFyKCkpKTsKLQkJCQotCQkJLyogUmVtb3ZlIHRoZSBkZWZhdWx0IHNyYyBmb2xkZXIgKi8KLQkJCUlKYXZhUHJvamVjdCB1dGlsaXR5SmFySmF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodXRpbGl0eUphclByb2plY3QpOwotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc3JjRm9sZGVyID0gdXRpbGl0eUphckphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodXRpbGl0eUphclByb2plY3QuZ2V0Rm9sZGVyKCJzcmMiKSk7Ci0JCQlpZihzcmNGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlzcmNGb2xkZXIuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgsIG1vbml0b3IpOwotCQkJfQkJCQotCQkJc3RhdHVzLmFkZChjcmVhdGVMaW5rZWRBcmNoaXZlKHByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIGdldFV0aWxpdHlKYXIoKSwgbGlua2VkUGF0aFZhcmlhYmxlLCBtb25pdG9yKSk7Ci0JCQkKLQkJCS8qIFJlbW92ZSB0aGUgL3NyYyBtYXBwaW5nICovCi0JCQlJVmlydHVhbENvbXBvbmVudCB1dGlsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlzdGF0dXMuYWRkKHJlbW92ZVJvb3RNYXBwaW5nKHV0aWxDb21wb25lbnQsICIvc3JjIiwgbW9uaXRvcikpOwotCQkJCi0JCQkvKiBDcmVhdGUgdGhlIC88YXJjaGl2ZT4gbWFwcGluZyAqLwotCQkJc3RhdHVzLmFkZChjcmVhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChwcm9qZWN0LCBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpLCBwcm9qZWN0LmdldEZpbGUoZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG1vbml0b3IpKTsKLQkJCSAKLQkJCS8qIE1ha2UgdGhpcyBwcm9qZWN0IGEgdXRpbGl0eSBqYXIgcHJvamVjdCBmb3IgdGhlIEVBUiAqLwotCQkJSVByb2plY3QgYXNzb2NpYXRlZEVBUlByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7CQkJCi0JCQlzdGF0dXMuYWRkKGxpbmtBcmNoaXZlVG9FQVIoYXNzb2NpYXRlZEVBUlByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIHV0aWxpdHlKYXJQcm9qZWN0LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb25fVUlfMiwgZSkpOwotCQl9CQkgCi0JCXJldHVybiBzdGF0dXM7IAotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkZTE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXMuV1RQQWN0aXZpdHlCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0RFVl9BQ1RJVklUWV9JRCA9ICJjb20uaWJtLnd0cC5qY2EuZGV2ZWxvcG1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfREVWX0FDVElWSVRZX0lEID0gImNvbS5pYm0ud3RwLndlYi5kZXZlbG9wbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVEVSUFJJU0VfSkFWQSA9ICJjb20uaWJtLnd0cC5lamIuZGV2ZWxvcG1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0VKQikpIHsKLSAgICAgICAgICAgICAgICBJRGF0YU1vZGVsIHByb2plY3RNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9FSkIpOwotICAgICAgICAgICAgICAgIGNyZWF0ZUVKQkNvbXBvbmVudChwcm9qZWN0TW9kZWwsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCKSkgewotICAgICAgICAgICAgICAgIElEYXRhTW9kZWwgcHJvamVjdE1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1dFQik7Ci0gICAgICAgICAgICAgICAgY3JlYXRlV2ViSjJFRUNvbXBvbmVudChwcm9qZWN0TW9kZWwsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfQ09OTkVDVE9SKSkgewotICAgICAgICAgICAgICAgIElEYXRhTW9kZWwgcHJvamVjdE1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0pDQSk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlUmFySjJFRUNvbXBvbmVudChwcm9qZWN0TW9kZWwsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfQVBQQ0xJRU5UKSkgewotICAgICAgICAgICAgICAgIElEYXRhTW9kZWwgcHJvamVjdE1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0NMSUVOVCk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQXBwQ2xpZW50Q29tcG9uZW50KHByb2plY3RNb2RlbCwgbW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0tfU1RBVFVTOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFSkJDb21wb25lbnQoSURhdGFNb2RlbCBtb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotICAgICAgICBhZGREZWZhdWx0RmFjZXRzKG1vZGVsKTsKLSAgICAgICAgV1RQQWN0aXZpdHlCcmlkZ2UuZ2V0SW5zdGFuY2UoKS5lbmFibGVBY3Rpdml0eShFTlRFUlBSSVNFX0pBVkEsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJKMkVFQ29tcG9uZW50KElEYXRhTW9kZWwgbW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLSAgICAgICAgYWRkRGVmYXVsdEZhY2V0cyhtb2RlbCk7Ci0gICAgICAgIFdUUEFjdGl2aXR5QnJpZGdlLmdldEluc3RhbmNlKCkuZW5hYmxlQWN0aXZpdHkoV0VCX0RFVl9BQ1RJVklUWV9JRCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJhckoyRUVDb21wb25lbnQoSURhdGFNb2RlbCBtb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotICAgICAgICBhZGREZWZhdWx0RmFjZXRzKG1vZGVsKTsKLSAgICAgICAgV1RQQWN0aXZpdHlCcmlkZ2UuZ2V0SW5zdGFuY2UoKS5lbmFibGVBY3Rpdml0eShFTlRFUlBSSVNFX0pBVkEsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoSURhdGFNb2RlbCBtb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotICAgICAgICBhZGREZWZhdWx0RmFjZXRzKG1vZGVsKTsKLSAgICAgICAgV1RQQWN0aXZpdHlCcmlkZ2UuZ2V0SW5zdGFuY2UoKS5lbmFibGVBY3Rpdml0eShFTlRFUlBSSVNFX0pBVkEsIHRydWUpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRGYWNldHMoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuRkFDRVRfUlVOVElNRSk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5GQUNFVF9QUk9KRUNUX05BTUUpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZSApOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJCi0JCWlmKCBmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIHJ1bnRpbWUgIT0gbnVsbCApewotCQkJdHJ5IHsKLQkJCQlGYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5hZGREZWZhdWx0RmFjdGV0cyggZmFjZXRlZFByb2plY3QsIHJ1bnRpbWUgKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9ICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjAzN2JmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEVBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLmVhciI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdyb25nQ29tcG9uZW50VHlwZVN0cmluZyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5OT1RfQU5fRUFSLCBuZXcgT2JqZWN0W117cHJvamVjdE5hbWV9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RUeXBlKCkgewotICAgICAgICByZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogRXhwb3J0cyB0aGUgc3BlY2lmaWVkIEVudGVycHJpc2UgQXBwbGljdGlvbiBwcm9qZWN0IHRvIHRoZSBzcGVjaWZpZWQgRUFSIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVhclByb2plY3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGV4cG9ydC4KLSAgICAgKiBAcGFyYW0gZWFyRmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgRUFSIGZpbGUgbG9jYXRpb24gdG8gZXhwb3J0IHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZQotICAgICAqICAgICAgICAgICAgQXBwbGljYXRpb24gcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlRXhpc3RpbmcKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmVhckZpbGVOYW1lPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuLgotICAgICAqIEBwYXJhbSBleHBvcnRTb3VyY2UKLSAgICAgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZQotICAgICAqICAgICAgICAgICAgQXBwbGljYXRpb24gUHJvamVjdCBhbmQgYWxsIGl0cyBtb2R1bGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBFQVIKLSAgICAgKiAgICAgICAgICAgIGZpbGUuCi0gICAgICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICAgICAqLwotLy9UT0RPOiBjYW4gdGhpcyBiZSBkb25lIGluIHRoZSBuZXcgZGF0YW1vZGVsIGZyYW1ld29yaz8KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBvcnRQcm9qZWN0KFN0cmluZyBlYXJQcm9qZWN0TmFtZSwgU3RyaW5nIGVhckZpbGVOYW1lLCBib29sZWFuIG92ZXJ3cml0ZUV4aXN0aW5nLCBib29sZWFuIGV4cG9ydFNvdXJjZSkgewotLy8gICAgICAgIEVudGVycHJpc2VBcHBsaWNhdGlvbkV4cG9ydERhdGFNb2RlbCBkYXRhTW9kZWwgPSBuZXcgRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsKCk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfTkFNRSwgZWFyUHJvamVjdE5hbWUpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoT1ZFUldSSVRFX0VYSVNUSU5HLCBvdmVyd3JpdGVFeGlzdGluZyk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04sIGVhckZpbGVOYW1lKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEVYUE9SVF9TT1VSQ0VfRklMRVMsIGV4cG9ydFNvdXJjZSk7Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5ydW4obnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMGJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUFkZFdlYkNvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FamJNb2R1bGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIHVzZWQgZm9yIHRvIGltcG9ydCBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucyhmcm9tIEVBUiBmaWxlcykgaW50byB0aGUgd29ya3NwYWNlLgotICogCi0gKiBUaGlzIGNsYXNzIChhbmQgYWxsIGl0cyBmaWVsZHMgYW5kIG1ldGhvZHMpIGlzIGxpa2VseSB0byBjaGFuZ2UgZHVyaW5nIHRoZSBXVFAgMS4wIG1pbGVzdG9uZXMgYXMgdGhlIG5ldyBwcm9qZWN0Ci0gKiBzdHJ1Y3R1cmVzIGFyZSBhZG9wdGVkLiBVc2UgYXQgeW91ciBvd24gcmlzay4KLSAqIAotICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uc0RhdGFNb2RlbCwgSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogVGhpcyBpcyBvbmx5IHRvIGZvcmNlIHZhbGlkYXRpb24gZm9yIHRoZSBuZXN0ZWQgcHJvamVjdHM7IGRvIG5vdCBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX1BST0pFQ1RTX1ZBTElEQVRJT04gPSAiRUFSSW1wb3J0RGF0YU1vZGVsLk5FU1RFRF9QUk9KRUNUU19WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBpcyBvbmx5IHRvIGZvcmNlIHZhbGlkYXRpb24gZm9yIHRoZSBFQVIgbmFtZSBhZ2FpbnN0IHRoZSBuZXN0ZWQgcHJvamVjdHM7IGRvIG5vdCBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX05BTUVfVkFMSURBVElPTiA9ICJFQVJJbXBvcnREYXRhTW9kZWwuRUFSX05BTUVfVkFMSURBVElPTiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsTGlzdGVuZXIgbmVzdGVkTGlzdGVuZXIgPSBuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKE5FU1RFRF9QUk9KRUNUU19WQUxJREFUSU9OLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIEhhc2h0YWJsZTxJRGF0YU1vZGVsLCBJRGF0YU1vZGVsPiBlamJKYXJNb2RlbHNUb0NsaWVudEphck1vZGVscyA9IG5ldyBIYXNodGFibGU8SURhdGFNb2RlbCwgSURhdGFNb2RlbD4oKTsKLQotCXByaXZhdGUgSGFzaHRhYmxlPElEYXRhTW9kZWwsIElEYXRhTW9kZWw+IGNsaWVudEphck1vZGVsc1RvRWpiSmFyTW9kZWxzID0gbmV3IEhhc2h0YWJsZTxJRGF0YU1vZGVsLCBJRGF0YU1vZGVsPigpOwotCi0JcHJpdmF0ZSBBcmNoaXZlV3JhcHBlciBjYWNoZWRMb2FkRXJyb3IgPSBudWxsOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTkVTVEVEX01PRFVMRV9ST09UKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVRJTElUWV9MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTU9EVUxFX01PREVMU19MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRUpCX0NMSUVOVF9MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVRJTElUWV9NT0RFTFNfTElTVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE5FU1RFRF9QUk9KRUNUU19WQUxJREFUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRUFSX05BTUVfVkFMSURBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNFTEVDVEVEX01PREVMU19MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFX0FOTk9UQVRJT05TKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVTkhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKE5FU1RFRF9NT0RVTEVfUk9PVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQl9IGVsc2UgaWYgKE1PRFVMRV9NT0RFTFNfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBVVElMSVRZX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgVVRJTElUWV9NT0RFTFNfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBTRUxFQ1RFRF9NT0RFTFNfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBFSkJfQ0xJRU5UX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9IGVsc2UgaWYgKFVTRV9BTk5PVEFUSU9OUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0gZWxzZSBpZiAoQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXRQcm9qZWN0TW9kZWxzKCk7Ci0JCX0gZWxzZSBpZiAoVU5IQU5ETEVEX1BST0pFQ1RfTU9ERUxTX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXRVbmhhbmRsZWRQcm9qZWN0TW9kZWxzKCk7Ci0JCX0gZWxzZSBpZiAoSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0SGFuZGxlZFNlbGVjdGVkTW9kZWxzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCWNoYW5nZU1vZHVsZUNyZWF0aW9uTG9jYXRpb25Gb3JOYW1lQ2hhbmdlKGdldFByb2plY3RNb2RlbHMoKSk7Ci0JCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkgJiYgZXZlbnQuZ2V0RGF0YU1vZGVsKCkgPT0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKSkgewotCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJSURhdGFNb2RlbCBuZXN0ZWRNb2RlbCA9IG51bGw7Ci0JCQlMaXN0IHByb2plY3RNb2RlbHMgPSAoTGlzdCkgZ2V0UHJvcGVydHkoQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TW9kZWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbmVzdGVkTW9kZWwgPSAoSURhdGFNb2RlbCkgcHJvamVjdE1vZGVscy5nZXQoaSk7Ci0JCQkJbmVzdGVkTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCX0KLQkJCWZpeHVwSmF2YUZhY2V0cygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEFMTF9QUk9KRUNUX01PREVMU19MSVNULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IFVOSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBFQVJfTkFNRV9WQUxJREFUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwcm9wZXJ0eU5hbWUgKyAiIGlzIGFuIHVuc2V0dGFibGUgcHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gZG9TZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAoTkVTVEVEX01PRFVMRV9ST09ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl1cGRhdGVNb2R1bGVSb290KCk7Ci0JCX0gZWxzZSBpZiAoRklMRV9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlMaXN0IG5lc3RlZE1vZGVscyA9IGdldE1vZHVsZU1vZGVscygpOwotCQkJc2V0UHJvcGVydHkoTU9EVUxFX01PREVMU19MSVNULCBuZXN0ZWRNb2RlbHMpOwotCQkJdXBkYXRlTW9kdWxlUm9vdCgpOwotCQkJc2V0UHJvcGVydHkoVVRJTElUWV9MSVNULCBudWxsKTsKLQotCQkJSURhdGFNb2RlbCBlYXJQcm9qZWN0TW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQkJaWYgKGdldEFyY2hpdmVXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZWFyUHJvamVjdE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCQlJRGF0YU1vZGVsIGVhckZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04pOwotCi0JCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IGdldEFyY2hpdmVXcmFwcGVyKCkuZ2V0SmF2YUVFUXVpY2tQZWVrKCk7Ci0JCQkJaW50IG1pbmltdW1WZXJzaW9uID0gcXVpY2tQZWVrLmdldFZlcnNpb24oKTsKLQkJCQlpZihuZXN0ZWRNb2RlbHMgIT0gbnVsbCl7Ci0JCQkJCS8vaW5jcmVhc2UgdGhlIEphdmFFRSBmYWNldCB2ZXJzaW9uIHRvIGFjY29tbW9kYXRlIHRoZSBoaWdoZXN0IG1vZHVsZSB2ZXJzaW9uCi0JCQkJCWZvcihpbnQgaT0wO2k8bmVzdGVkTW9kZWxzLnNpemUoKTsgaSsrKXsKLQkJCQkJCUlEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSAoSURhdGFNb2RlbCluZXN0ZWRNb2RlbHMuZ2V0KGkpOwotCQkJCQkJQXJjaGl2ZVdyYXBwZXIgbmVzdGVkV3JhcHBlciA9IChBcmNoaXZlV3JhcHBlciluZXN0ZWRNb2RlbC5nZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIpOwotCQkJCQkJaW50IG5lc3RlZEVFVmVyc2lvbiA9IG5lc3RlZFdyYXBwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKCkuZ2V0SmF2YUVFVmVyc2lvbigpOwotCQkJCQkJaWYobmVzdGVkRUVWZXJzaW9uID4gbWluaW11bVZlcnNpb24pewotCQkJCQkJCW1pbmltdW1WZXJzaW9uID0gbmVzdGVkRUVWZXJzaW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyB2ZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5nZXRKMkVFVGV4dFZlcnNpb24obWluaW11bVZlcnNpb24pOwotCQkJCWVhckZhY2V0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHZlcnNpb25UZXh0KTsKLQkJCX0KLQotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJaWYgKGdldEoyRUVWZXJzaW9uKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMykKLQkJCQlzZXRCb29sZWFuUHJvcGVydHkoVVNFX0FOTk9UQVRJT05TLCBmYWxzZSk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfQU5OT1RBVElPTlMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQlmaXh1cEphdmFGYWNldHMoKTsKLQkJfSBlbHNlIGlmIChVVElMSVRZX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXVwZGF0ZVV0aWxpdHlNb2RlbHMoKExpc3QpIHByb3BlcnR5VmFsdWUpOwotCQl9IGVsc2UgaWYgKFVTRV9BTk5PVEFUSU9OUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJTGlzdCBwcm9qZWN0TW9kZWxzID0gKExpc3QpIGdldFByb3BlcnR5KE1PRFVMRV9NT0RFTFNfTElTVCk7Ci0JCQlJRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE1vZGVscy5zaXplKCk7IGkrKykgewotCQkJCW5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpIHByb2plY3RNb2RlbHMuZ2V0KGkpOwotCQkJCWlmIChuZXN0ZWRNb2RlbC5pc1Byb3BlcnR5KFVTRV9BTk5PVEFUSU9OUykpIHsKLQkJCQkJbmVzdGVkTW9kZWwuc2V0UHJvcGVydHkoVVNFX0FOTk9UQVRJT05TLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoTU9EVUxFX01PREVMU19MSVNULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQluZXdMaXN0LmFkZEFsbChnZXRQcm9qZWN0TW9kZWxzKCkpOwotCQkJc2V0UHJvcGVydHkoU0VMRUNURURfTU9ERUxTX0xJU1QsIG5ld0xpc3QpOwotCQl9IGVsc2UgaWYgKFBST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJTGlzdCBuZXN0ZWRNb2RlbHMgPSAoTGlzdCkgZ2V0UHJvcGVydHkoTU9EVUxFX01PREVMU19MSVNUKTsKLQkJCUlEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQluZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKSBuZXN0ZWRNb2RlbHMuZ2V0KGkpOwotCQkJCW5lc3RlZE1vZGVsLnNldFByb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQkJfQotCQkJbmVzdGVkTW9kZWxzID0gKExpc3QpIGdldFByb3BlcnR5KFVUSUxJVFlfTU9ERUxTX0xJU1QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQluZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKSBuZXN0ZWRNb2RlbHMuZ2V0KGkpOwotCQkJCW5lc3RlZE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy52YWxpZGF0ZVByb2plY3ROYW1lKGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpLmlzT0soKSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCQkJaWYgKG51bGwgIT0gcHJvamVjdCAmJiBwcm9qZWN0LmV4aXN0cygpKSB7Ci0KLQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBjYW5Db250aW51ZSA9IHRydWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQljYW5Db250aW51ZSA9IGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNhbkNvbnRpbnVlKSB7Ci0JCQkJCQlJUnVudGltZSBydW50aW1lID0gZmFjZXRlZFByb2plY3QuZ2V0UnVudGltZSgpOwotCQkJCQkJaWYgKG51bGwgIT0gcnVudGltZSkgewotCQkJCQkJCXNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgcnVudGltZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvU2V0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGZvcmNlUmVzZXRPblByZXNlcnZlTWV0YURhdGEoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXh1cEphdmFGYWNldHMoKSB7Ci0JCUxpc3Qgc3ViUHJvamVjdHMgPSBnZXRTZWxlY3RlZE1vZGVscygpOwotCQlJRGF0YU1vZGVsIHN1YkRhdGFNb2RlbCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1YkRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBzdWJQcm9qZWN0cy5nZXQoaSk7Ci0JCQlzdWJEYXRhTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShGQUNFVF9SVU5USU1FKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTkVTVEVEX1BST0pFQ1RTX1ZBTElEQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoRUFSX05BTUVfVkFMSURBVElPTikpIHsKLQkJCWJvb2xlYW4gY2hlY2tBZ2FpbnN0RUFSTmFtZU9ubHkgPSBwcm9wZXJ0eU5hbWUuZXF1YWxzKEVBUl9OQU1FX1ZBTElEQVRJT04pOwotCi0JCQlTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCQlMaXN0IHN1YlByb2plY3RzID0gZ2V0U2VsZWN0ZWRNb2RlbHMoKTsKLQkJCUlEYXRhTW9kZWwgc3ViRGF0YU1vZGVsID0gbnVsbDsKLQkJCVN0cmluZyB0ZW1wUHJvamVjdE5hbWUgPSBudWxsOwotCQkJQXJjaGl2ZVdyYXBwZXIgdGVtcEFyY2hpdmUgPSBudWxsOwotCQkJSVN0YXR1cyB0ZW1wU3RhdHVzID0gbnVsbDsKLQkJCUhhc2h0YWJsZTxTdHJpbmcsIEFyY2hpdmVXcmFwcGVyPiBwcm9qZWN0cyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBBcmNoaXZlV3JhcHBlcj4oNCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YlByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQkJc3ViRGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIHN1YlByb2plY3RzLmdldChpKTsKLQkJCQl0ZW1wUHJvamVjdE5hbWUgPSBzdWJEYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJCS8vIFRPRE86IGFkZCBtYW51YWwgdmFsaWRhdGlvbgotCQkJCS8vIElTdGF0dXMgc3RhdHVzID0KLQkJCQkvLyBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwudmFsaWRhdGVQcm9qZWN0TmFtZSh0ZW1wUHJvamVjdE5hbWUpOwotCQkJCS8vIGlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCS8vIHJldHVybiBzdGF0dXM7Ci0JCQkJLy8gfQotCQkJCXRlbXBBcmNoaXZlID0gKEFyY2hpdmVXcmFwcGVyKSBzdWJEYXRhTW9kZWwuZ2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSKTsKLQotCQkJCWlmIChjaGVja0FnYWluc3RFQVJOYW1lT25seSkgewotCQkJCQlpZiAodGVtcFByb2plY3ROYW1lLmVxdWFscyhlYXJQcm9qZWN0TmFtZSkpIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkVBUkltcG9ydERhdGFNb2RlbF9VSV8xLCBuZXcgT2JqZWN0W10geyB0ZW1wUHJvamVjdE5hbWUsCi0JCQkJCQkJCXRlbXBBcmNoaXZlLmdldFBhdGgoKSB9KSk7Ci0JCQkJCX0gZWxzZSBpZiAoIVdUUFBsdWdpbi5pc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZiAodGVtcFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGVhclByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVXYXJuaW5nU3RhdHVzKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzFhLCBuZXcgT2JqZWN0W10geyBlYXJQcm9qZWN0TmFtZSwKLQkJCQkJCQkJCXRlbXBQcm9qZWN0TmFtZSwgdGVtcEFyY2hpdmUuZ2V0UGF0aCgpIH0pKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmICghb3ZlcndyaXRlICYmIHN1YkRhdGFNb2RlbC5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLQkJCQkJLy8gcmV0dXJuCi0JCQkJCS8vIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVBUkltcG9ydERhdGFNb2RlbF9VSV8wIiwKLQkJCQkJLy8gbmV3IE9iamVjdFtde3RlbXBQcm9qZWN0TmFtZSwgdGVtcEFyY2hpdmUuZ2V0VVJJKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gfQotCQkJCQl0ZW1wU3RhdHVzID0gc3ViRGF0YU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJCQlpZiAoIXRlbXBTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzAsIG5ldyBPYmplY3RbXSB7IHRlbXBQcm9qZWN0TmFtZSwKLQkJCQkJCQkJdGVtcEFyY2hpdmUuZ2V0UGF0aCgpIH0pKTsKLQkJCQkJfQotCQkJCQl0ZW1wU3RhdHVzID0gc3ViRGF0YU1vZGVsLnZhbGlkYXRlKCk7Ci0JCQkJCWlmICghdGVtcFN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCXJldHVybiB0ZW1wU3RhdHVzOwotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wUHJvamVjdE5hbWUuZXF1YWxzKGVhclByb2plY3ROYW1lKSkgewotCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkVBUkltcG9ydERhdGFNb2RlbF9VSV8xLCBuZXcgT2JqZWN0W10geyB0ZW1wUHJvamVjdE5hbWUsCi0JCQkJCQkJCXRlbXBBcmNoaXZlLmdldFBhdGgoKSB9KSk7Ci0JCQkJCX0gZWxzZSBpZiAoIVdUUFBsdWdpbi5pc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZiAodGVtcFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGVhclByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkVBUkltcG9ydERhdGFNb2RlbF9VSV8xYSwgbmV3IE9iamVjdFtdIHsgZWFyUHJvamVjdE5hbWUsCi0JCQkJCQkJCQl0ZW1wUHJvamVjdE5hbWUsIHRlbXBBcmNoaXZlLmdldFBhdGgoKSB9KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHByb2plY3RzLmNvbnRhaW5zS2V5KHRlbXBQcm9qZWN0TmFtZSkpIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5FQVJJbXBvcnREYXRhTW9kZWxfVUlfMiwgbmV3IE9iamVjdFtdIHsgdGVtcFByb2plY3ROYW1lLAotCQkJCQkJCQl0ZW1wQXJjaGl2ZS5nZXRQYXRoKCksICgoQXJjaGl2ZVdyYXBwZXIpIHByb2plY3RzLmdldCh0ZW1wUHJvamVjdE5hbWUpKS5nZXRQYXRoKCkgfSkpOwotCQkJCQl9IGVsc2UgaWYgKCFXVFBQbHVnaW4uaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJU3RyaW5nIGxvd2VyQ2FzZVByb2plY3ROYW1lID0gdGVtcFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCQlTdHJpbmcgY3VycmVudEtleSA9IG51bGw7Ci0JCQkJCQlFbnVtZXJhdGlvbiBrZXlzID0gcHJvamVjdHMua2V5cygpOwotCQkJCQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCQljdXJyZW50S2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCQkJCWlmIChjdXJyZW50S2V5LnRvTG93ZXJDYXNlKCkuZXF1YWxzKGxvd2VyQ2FzZVByb2plY3ROYW1lKSkgewotCQkJCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzJhLCBuZXcgT2JqZWN0W10geyB0ZW1wUHJvamVjdE5hbWUsCi0JCQkJCQkJCQkJY3VycmVudEtleSwgdGVtcEFyY2hpdmUuZ2V0UGF0aCgpLCBwcm9qZWN0cy5nZXQoY3VycmVudEtleSkuZ2V0UGF0aCgpIH0pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcHJvamVjdHMucHV0KHRlbXBQcm9qZWN0TmFtZSwgdGVtcEFyY2hpdmUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEVfTkFNRSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9IGVsc2UgaWYgKGNhY2hlZExvYWRFcnJvciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbgotCQkJCQkJLmNyZWF0ZVdhcm5pbmdTdGF0dXMoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5FQVJJbXBvcnREYXRhTW9kZWxfVUlfNCwgbmV3IE9iamVjdFtdIHsgY2FjaGVkTG9hZEVycm9yLmdldFBhdGgoKS50b09TU3RyaW5nKCkgfSkpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkvLyBUT0RPOiBjaGVjayBjb250ZXh0IHJvb3QgaXMgbm90IGluc2lkZSBjdXJyZW50IHdvcmtpbmcKLQkJLy8gZGlyZWN0b3J5Li4udGhpcyBpcyBpbnZhbGlkCi0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2R1bGVSb290KCkgewotCQlMaXN0IHByb2plY3RzID0gZ2V0UHJvamVjdE1vZGVscygpOwotCQlTdHJpbmcgYmFzZVBhdGggPSBpc1Byb3BlcnR5U2V0KE5FU1RFRF9NT0RVTEVfUk9PVCkgPyBnZXRTdHJpbmdQcm9wZXJ0eShORVNURURfTU9EVUxFX1JPT1QpIDogbnVsbDsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gYmFzZVBhdGggPT0gbnVsbDsKLQkJSURhdGFNb2RlbCBsb2NhbE1vZGVsID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IG51bGwgIT0gcHJvamVjdHMgJiYgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlsb2NhbE1vZGVsID0gKElEYXRhTW9kZWwpIHByb2plY3RzLmdldChpKTsKLQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04sIGJhc2VQYXRoKTsKLQkJCWxvY2FsTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRV9ERUZBVUxUX0xPQ0FUSU9OLCB1c2VEZWZhdWx0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VNb2R1bGVDcmVhdGlvbkxvY2F0aW9uRm9yTmFtZUNoYW5nZShMaXN0IHByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBudWxsICE9IHByb2plY3RzICYmIGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJbG9jYWxNb2RlbCA9IChJRGF0YU1vZGVsKSBwcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAoaXNQcm9wZXJ0eVNldChORVNURURfTU9EVUxFX1JPT1QpKSB7Ci0JCQkJSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIGdldFByb3BlcnR5KE5FU1RFRF9NT0RVTEVfUk9PVCkpOwotCQkJCW5ld1BhdGggPSBuZXdQYXRoLmFwcGVuZCgoU3RyaW5nKSBsb2NhbE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJCQkvLyBtb2RlbC5zZXRQcm9wZXJ0eShKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9MT0NBVElPTiwKLQkJCQkvLyBuZXdQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG1vZGVsLnNldFByb3BlcnR5KEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX0xPQ0FUSU9OLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyaW1TZWxlY3Rpb24oKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJTGlzdCBzZWxlY3RlZExpc3QgPSBnZXRTZWxlY3RlZE1vZGVscygpOwotCQlMaXN0IGFsbExpc3QgPSBnZXRQcm9qZWN0TW9kZWxzKCk7Ci0JCWZvciAoaW50IGkgPSBzZWxlY3RlZExpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWlmICghYWxsTGlzdC5jb250YWlucyhzZWxlY3RlZExpc3QuZ2V0KGkpKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQlzZWxlY3RlZExpc3QucmVtb3ZlKGkpOwotCQkJfQotCQl9Ci0JCWlmIChtb2RpZmllZCkgewotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbmV3TGlzdC5hZGRBbGwoc2VsZWN0ZWRMaXN0KTsKLQkJCXNldFByb3BlcnR5KFNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVVdGlsaXR5TW9kZWxzKExpc3Q8QXJjaGl2ZVdyYXBwZXI+IHV0aWxpdHlKYXJzKSB7Ci0JCXVwZGF0ZVV0aWxpdHlNb2RlbHModXRpbGl0eUphcnMsIFNFTEVDVEVEX01PREVMU19MSVNULCBVVElMSVRZX01PREVMU19MSVNUKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVXRpbGl0eU1vZGVscyhMaXN0PEFyY2hpdmVXcmFwcGVyPiB1dGlsaXR5SmFycywgU3RyaW5nIHNlbGVjdGVkUHJvcGVydHksIFN0cmluZyBsaXN0VHlwZVByb3BlcnR5KSB7Ci0JCWJvb2xlYW4gYWxsU2VsZWN0ZWQgPSB0cnVlOwotCQlMaXN0PElEYXRhTW9kZWw+IHNlbGVjdGVkTGlzdCA9IChMaXN0PElEYXRhTW9kZWw+KSBnZXRQcm9wZXJ0eShzZWxlY3RlZFByb3BlcnR5KTsKLQkJTGlzdDxJRGF0YU1vZGVsPiBhbGxMaXN0ID0gZ2V0UHJvamVjdE1vZGVscygpOwotCQlpZiAoc2VsZWN0ZWRMaXN0LnNpemUoKSA9PSBhbGxMaXN0LnNpemUoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZExpc3Quc2l6ZSgpICYmIGFsbFNlbGVjdGVkOyBpKyspIHsKLQkJCQlpZiAoIXNlbGVjdGVkTGlzdC5jb250YWlucyhhbGxMaXN0LmdldChpKSkgfHwgIWFsbExpc3QuY29udGFpbnMoc2VsZWN0ZWRMaXN0LmdldChpKSkpIHsKLQkJCQkJYWxsU2VsZWN0ZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhbGxTZWxlY3RlZCA9IGZhbHNlOwotCQl9Ci0JCUxpc3Q8SURhdGFNb2RlbD4gdXRpbGl0eU1vZGVscyA9IChMaXN0PElEYXRhTW9kZWw+KSBnZXRQcm9wZXJ0eShsaXN0VHlwZVByb3BlcnR5KTsKLQkJQXJjaGl2ZVdyYXBwZXIgY3VycmVudEFyY2hpdmUgPSBudWxsOwotCQlJRGF0YU1vZGVsIGN1cnJlbnRVdGlsaXR5TW9kZWwgPSBudWxsOwotCQlib29sZWFuIHV0aWxpdHlKYXJzTW9kaWZpZWQgPSBmYWxzZTsKLQkJLy8gQWRkIG1pc3NpbmcKLQkJZm9yIChpbnQgaSA9IDA7IG51bGwgIT0gdXRpbGl0eUphcnMgJiYgaSA8IHV0aWxpdHlKYXJzLnNpemUoKTsgaSsrKSB7Ci0JCQljdXJyZW50QXJjaGl2ZSA9IHV0aWxpdHlKYXJzLmdldChpKTsKLQkJCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyB1dGlsaXR5TW9kZWxzICE9IG51bGwgJiYgaiA8IHV0aWxpdHlNb2RlbHMuc2l6ZSgpICYmICFhZGRlZDsgaisrKSB7Ci0JCQkJY3VycmVudFV0aWxpdHlNb2RlbCA9IChJRGF0YU1vZGVsKSB1dGlsaXR5TW9kZWxzLmdldChqKTsKLQkJCQlpZiAoY3VycmVudFV0aWxpdHlNb2RlbC5nZXRQcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUikgPT0gY3VycmVudEFyY2hpdmUpIHsKLQkJCQkJYWRkZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghYWRkZWQpIHsKLQkJCQlpZiAoIWlzUHJvcGVydHlTZXQobGlzdFR5cGVQcm9wZXJ0eSkpIHsKLQkJCQkJdXRpbGl0eU1vZGVscyA9IG5ldyBBcnJheUxpc3Q8SURhdGFNb2RlbD4oKTsKLQkJCQkJc2V0UHJvcGVydHkobGlzdFR5cGVQcm9wZXJ0eSwgdXRpbGl0eU1vZGVscyk7Ci0JCQkJfQotCQkJCUlEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIsIGN1cnJlbnRBcmNoaXZlKTsKLQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpOwotCQkJCXV0aWxpdHlNb2RlbHMuYWRkKGxvY2FsTW9kZWwpOwotCQkJCWxvY2FsTW9kZWwuYWRkTGlzdGVuZXIobmVzdGVkTGlzdGVuZXIpOwotCQkJCXV0aWxpdHlKYXJzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9IC8vIFJlbW92ZSBleHRyYXMKLQkJZm9yIChpbnQgaSA9IHV0aWxpdHlNb2RlbHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWN1cnJlbnRVdGlsaXR5TW9kZWwgPSAoSURhdGFNb2RlbCkgdXRpbGl0eU1vZGVscy5nZXQoaSk7Ci0JCQljdXJyZW50QXJjaGl2ZSA9IChBcmNoaXZlV3JhcHBlcikgY3VycmVudFV0aWxpdHlNb2RlbC5nZXRQcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQlpZiAobnVsbCA9PSB1dGlsaXR5SmFycyB8fCAhdXRpbGl0eUphcnMuY29udGFpbnMoY3VycmVudEFyY2hpdmUpKSB7Ci0JCQkJY3VycmVudFV0aWxpdHlNb2RlbC5yZW1vdmVMaXN0ZW5lcihuZXN0ZWRMaXN0ZW5lcik7Ci0JCQkJY3VycmVudFV0aWxpdHlNb2RlbC5kaXNwb3NlKCk7Ci0JCQkJdXRpbGl0eU1vZGVscy5yZW1vdmUoY3VycmVudFV0aWxpdHlNb2RlbCk7Ci0JCQkJdXRpbGl0eUphcnNNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYWxsTGlzdCA9IGdldFByb2plY3RNb2RlbHMoKTsKLQkJaWYgKGFsbFNlbGVjdGVkKSB7Ci0JCQlMaXN0PElEYXRhTW9kZWw+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PElEYXRhTW9kZWw+KCk7Ci0JCQluZXdMaXN0LmFkZEFsbChhbGxMaXN0KTsKLQkJCXNldFByb3BlcnR5KFNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJfSBlbHNlIHsKLQkJCXRyaW1TZWxlY3Rpb24oKTsKLQkJfQotCQlpZiAodXRpbGl0eUphcnNNb2RpZmllZCkgewotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoTkVTVEVEX1BST0pFQ1RTX1ZBTElEQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNb2R1bGVNb2RlbHMoKSB7Ci0JCUFyY2hpdmVXcmFwcGVyIGVhcldyYXBwZXIgPSBnZXRBcmNoaXZlV3JhcHBlcigpOwotCQlpZiAoZWFyV3JhcHBlciA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWNhY2hlZExvYWRFcnJvciA9IG51bGw7Ci0JCUxpc3Q8QXJjaGl2ZVdyYXBwZXI+IG1vZHVsZXMgPSBlYXJXcmFwcGVyLmdldEVhck1vZHVsZXMoKTsKLQkJTGlzdCBtb2R1bGVNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Q8QXJjaGl2ZVdyYXBwZXI+IGNsaWVudEphckFyY2hpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJRGF0YU1vZGVsIGxvY2FsTW9kZWw7Ci0JCVN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQotCQlMaXN0IGRlZmF1bHRNb2R1bGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVmYXVsdE1vZHVsZU5hbWVzLmFkZChlYXJQcm9qZWN0TmFtZSk7Ci0JCUxpc3QgY29sbGlkaW5nTW9kdWxlTmFtZXMgPSBudWxsOwotCQlIYXNodGFibGU8SURhdGFNb2RlbCwgQXJjaGl2ZVdyYXBwZXI+IGVqYkphcnNXaXRoQ2xpZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlsb2NhbE1vZGVsID0gbnVsbDsKLQkJCUFyY2hpdmVXcmFwcGVyIHRlbXAgPSBtb2R1bGVzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRlbXAuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJCQlsb2NhbE1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCX0gZWxzZSBpZiAodGVtcC5pc1dBUkZpbGUoKSkgewotCQkJCQlXZWJNb2R1bGVFeHRlbnNpb24gd2ViRXh0ID0gRWFyTW9kdWxlTWFuYWdlci5nZXRXZWJNb2R1bGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKHdlYkV4dCAhPSBudWxsKSB7Ci0JCQkJCQlsb2NhbE1vZGVsID0gd2ViRXh0LmNyZWF0ZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJU3RyaW5nIGN0eFJ0ID0gdGVtcC5nZXRXZWJDb250ZXh0Um9vdCgpOwotCQkJCQkJaWYgKG51bGwgIT0gY3R4UnQpIHsKLQkJCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElBZGRXZWJDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09ULCBjdHhSdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHRlbXAuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCQkJRWpiTW9kdWxlRXh0ZW5zaW9uIGVqYkV4dCA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCWlmIChlamJFeHQgIT0gbnVsbCkgewotCQkJCQkJbG9jYWxNb2RlbCA9IGVqYkV4dC5jcmVhdGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJQXJjaGl2ZVdyYXBwZXIgY2xpZW50QXJjaCA9IGVhcldyYXBwZXIuZ2V0RUpCQ2xpZW50QXJjaGl2ZVdyYXBwZXIodGVtcCk7Ci0JCQkJCQlpZiAobnVsbCAhPSBjbGllbnRBcmNoKSB7Ci0JCQkJCQkJY2xpZW50SmFyQXJjaGl2ZXMuYWRkKGNsaWVudEFyY2gpOwotCQkJCQkJCWVqYkphcnNXaXRoQ2xpZW50cy5wdXQobG9jYWxNb2RlbCwgY2xpZW50QXJjaCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSBpZiAodGVtcC5pc1JBUkZpbGUoKSkgewotCQkJCQlKY2FNb2R1bGVFeHRlbnNpb24gcmFyRXh0ID0gRWFyTW9kdWxlTWFuYWdlci5nZXRKQ0FNb2R1bGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKHJhckV4dCAhPSBudWxsKSB7Ci0JCQkJCQlsb2NhbE1vZGVsID0gcmFyRXh0LmNyZWF0ZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb2NhbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIsIHRlbXApOwotCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGVhclByb2plY3ROYW1lKTsKLQkJCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpOwotCQkJCQlsb2NhbE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQlsb2NhbE1vZGVsLmFkZExpc3RlbmVyKG5lc3RlZExpc3RlbmVyKTsKLQkJCQkJbW9kdWxlTW9kZWxzLmFkZChsb2NhbE1vZGVsKTsKLQkJCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBsb2NhbE1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCQkJCWlmIChkZWZhdWx0TW9kdWxlTmFtZXMuY29udGFpbnMobW9kdWxlTmFtZSkpIHsKLQkJCQkJCWlmIChjb2xsaWRpbmdNb2R1bGVOYW1lcyA9PSBudWxsKSB7Ci0JCQkJCQkJY29sbGlkaW5nTW9kdWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl9Ci0JCQkJCQljb2xsaWRpbmdNb2R1bGVOYW1lcy5hZGQobW9kdWxlTmFtZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkZWZhdWx0TW9kdWxlTmFtZXMuYWRkKG1vZHVsZU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkVycm9yIGxvYWRpbmcgbmVzdGVkIGFyY2hpdmU6ICIgKyB0ZW1wLmdldFBhdGgoKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCWNhY2hlZExvYWRFcnJvciA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlVXRpbGl0eU1vZGVscyhjbGllbnRKYXJBcmNoaXZlcywgRUpCX0NMSUVOVF9MSVNULCBFSkJfQ0xJRU5UX0xJU1QpOwotCQlMaXN0PElEYXRhTW9kZWw+IGNsaWVudE1vZGVsTGlzdCA9IChMaXN0PElEYXRhTW9kZWw+KSBnZXRQcm9wZXJ0eShFSkJfQ0xJRU5UX0xJU1QpOwotCQlFbnVtZXJhdGlvbjxJRGF0YU1vZGVsPiBlamJNb2RlbHMgPSBlamJKYXJzV2l0aENsaWVudHMua2V5cygpOwotCQllamJKYXJNb2RlbHNUb0NsaWVudEphck1vZGVscy5jbGVhcigpOwotCQljbGllbnRKYXJNb2RlbHNUb0VqYkphck1vZGVscy5jbGVhcigpOwotCQl3aGlsZSAoZWpiTW9kZWxzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlJRGF0YU1vZGVsIGVqYk1vZGVsID0gZWpiTW9kZWxzLm5leHRFbGVtZW50KCk7Ci0JCQlBcmNoaXZlV3JhcHBlciBlamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IGVqYkphcnNXaXRoQ2xpZW50cy5nZXQoZWpiTW9kZWwpOwotCQkJSURhdGFNb2RlbCBjbGllbnRNb2RlbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgY2xpZW50TW9kZWwgPT0gbnVsbCAmJiBpIDwgY2xpZW50TW9kZWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCgoQXJjaGl2ZVdyYXBwZXIpIGNsaWVudE1vZGVsTGlzdC5nZXQoaSkuZ2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSKSkuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSA9PSBlamJDbGllbnRBcmNoaXZlV3JhcHBlci5nZXRVbmRlckx5aW5nQXJjaGl2ZSgpKSB7Ci0JCQkJCWNsaWVudE1vZGVsID0gY2xpZW50TW9kZWxMaXN0LmdldChpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllamJKYXJNb2RlbHNUb0NsaWVudEphck1vZGVscy5wdXQoZWpiTW9kZWwsIGNsaWVudE1vZGVsKTsKLQkJCWNsaWVudEphck1vZGVsc1RvRWpiSmFyTW9kZWxzLnB1dChjbGllbnRNb2RlbCwgZWpiTW9kZWwpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGNvbGxpZGluZ01vZHVsZU5hbWVzICE9IG51bGwgJiYgaSA8IG1vZHVsZU1vZGVscy5zaXplKCk7IGkrKykgewotCQkJbG9jYWxNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2R1bGVNb2RlbHMuZ2V0KGkpOwotCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBsb2NhbE1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQkJaWYgKGNvbGxpZGluZ01vZHVsZU5hbWVzLmNvbnRhaW5zKG1vZHVsZU5hbWUpKSB7Ci0JCQkJQXJjaGl2ZVdyYXBwZXIgbW9kdWxlID0gKEFyY2hpdmVXcmFwcGVyKSBsb2NhbE1vZGVsLmdldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJCVN0cmluZyBzdWZmaXggPSBudWxsOwotCQkJCWlmIChtb2R1bGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJCQlzdWZmaXggPSAiX0FwcENsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1dBUkZpbGUoKSkgewotCQkJCQlzdWZmaXggPSAiX1dFQiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc0VKQkphckZpbGUoKSkgewotCQkJCQlzdWZmaXggPSAiX0VKQiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1JBUkZpbGUoKSkgewotCQkJCQlzdWZmaXggPSAiX0pDQSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRlZmF1bHRNb2R1bGVOYW1lcy5jb250YWlucyhtb2R1bGVOYW1lICsgc3VmZml4KSkgewotCQkJCQlpbnQgY291bnQgPSAxOwotCQkJCQlmb3IgKDsgZGVmYXVsdE1vZHVsZU5hbWVzLmNvbnRhaW5zKG1vZHVsZU5hbWUgKyBzdWZmaXggKyBjb3VudCkgJiYgY291bnQgPCAxMDsgY291bnQrKykKLQkJCQkJCTsKLQkJCQkJc3VmZml4ICs9IGNvdW50OwotCQkJCX0KLQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIG1vZHVsZU5hbWUgKyBzdWZmaXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVNb2RlbHM7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gWE1MUmVzb3VyY2UuQVBQTElDQVRJT05fVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5FQVJGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsgcmV0dXJuIChFQVJGaWxlKSBnZXRBcmNoaXZlRmlsZSgpOyB9Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgeyBMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7IExpc3QgdGVtcExpc3QgPSAoTGlzdCkKLQkgKiBnZXRQcm9wZXJ0eShNT0RVTEVfTU9ERUxTX0xJU1QpOyBpZiAobnVsbCAhPSB0ZW1wTGlzdCkgeyB0ZW1wLmFkZEFsbCh0ZW1wTGlzdCk7IH0gdGVtcExpc3QgPSAoTGlzdCkKLQkgKiBnZXRQcm9wZXJ0eShFSkJfQ0xJRU5UX0xJU1QpOyBpZiAobnVsbCAhPSB0ZW1wTGlzdCkgeyB0ZW1wLmFkZEFsbCh0ZW1wTGlzdCk7IH0gdGVtcExpc3QgPSBnZXRTZWxlY3RlZE1vZGVscygpOwotCSAqIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsgaWYgKCF0ZW1wLmNvbnRhaW5zKHRlbXBMaXN0LmdldChpKSkpIHsgdGVtcC5hZGQodGVtcExpc3QuZ2V0KGkpKTsgfSB9Ci0JICogSURhdGFNb2RlbCBpbXBvcnRETSA9IG51bGw7IGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5zaXplKCk7IGkrKykgeyBpbXBvcnRETSA9IChJRGF0YU1vZGVsKSB0ZW1wLmdldChpKTsgaWYKLQkgKiAoaW1wb3J0RE0uZ2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSKSA9PSBhbkFyY2hpdmUpIHsgcmV0dXJuIHRydWU7IH0gfSByZXR1cm4gZmFsc2U7IH0KLQkgKi8KLQlwcml2YXRlIExpc3Q8SURhdGFNb2RlbD4gZ2V0UHJvamVjdE1vZGVscygpIHsKLQkJTGlzdDxJRGF0YU1vZGVsPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxJRGF0YU1vZGVsPigpOwotCQlMaXN0IHRlbXBMaXN0ID0gKExpc3QpIGdldFByb3BlcnR5KE1PRFVMRV9NT0RFTFNfTElTVCk7Ci0JCWlmIChudWxsICE9IHRlbXBMaXN0KSB7Ci0JCQl0ZW1wLmFkZEFsbCh0ZW1wTGlzdCk7Ci0JCX0KLQkJdGVtcExpc3QgPSAoTGlzdCkgZ2V0UHJvcGVydHkoVVRJTElUWV9NT0RFTFNfTElTVCk7Ci0JCWlmIChudWxsICE9IHRlbXBMaXN0KSB7Ci0JCQl0ZW1wLmFkZEFsbCh0ZW1wTGlzdCk7Ci0JCX0KLQkJdGVtcExpc3QgPSAoTGlzdCkgZ2V0UHJvcGVydHkoRUpCX0NMSUVOVF9MSVNUKTsKLQkJaWYgKG51bGwgIT0gdGVtcExpc3QpIHsKLQkJCXRlbXAuYWRkQWxsKHRlbXBMaXN0KTsKLQkJfQotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VW5oYW5kbGVkUHJvamVjdE1vZGVscygpIHsKLQkJTGlzdCBoYW5kbGVkID0gcmVtb3ZlSGFuZGxlZE1vZGVscyhnZXRQcm9qZWN0TW9kZWxzKCksIGdldFByb2plY3RNb2RlbHMoKSwgZmFsc2UpOwotCQlMaXN0IGFsbCA9IGdldFByb2plY3RNb2RlbHMoKTsKLQkJYWxsLnJlbW92ZUFsbChoYW5kbGVkKTsKLQkJcmV0dXJuIGFsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE1vZGVscygpIHsKLQkJcmV0dXJuIChMaXN0KSBnZXRQcm9wZXJ0eShTRUxFQ1RFRF9NT0RFTFNfTElTVCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHJlbW92ZUhhbmRsZWRNb2RlbHMoTGlzdCBsaXN0VG9QcnVuZSwgTGlzdCBtb2RlbHNUb0NoZWNrLCBib29sZWFuIGFkZE1vZGVscykgewotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0xpc3QuYWRkQWxsKGxpc3RUb1BydW5lKTsKLQkJLy8gSURhdGFNb2RlbCBsb2NhbE1vZGVsID0gbnVsbDsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbHNUb0NoZWNrLnNpemUoKTsgaSsrKSB7Ci0JCS8vIGxvY2FsTW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kZWxzVG9DaGVjay5nZXQoaSk7Ci0JCS8vIG1vZGVsLmV4dHJhY3RIYW5kbGVkKG5ld0xpc3QsIGFkZE1vZGVscyk7Ci0JCS8vIH0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEhhbmRsZWRTZWxlY3RlZE1vZGVscygpIHsKLQkJTGlzdCBzZWxlY3RlZE1vZGVscyA9IGdldFNlbGVjdGVkTW9kZWxzKCk7Ci0JCXJldHVybiByZW1vdmVIYW5kbGVkTW9kZWxzKHNlbGVjdGVkTW9kZWxzLCBzZWxlY3RlZE1vZGVscywgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgeyBFQVJGaWxlIGVmID0gZ2V0RUFSRmlsZSgpOyByZXR1cm4gbnVsbCA9PSBlZiA/IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkgKiBBcmNoaXZlVXRpbC5nZXRGYXN0U3BlY1ZlcnNpb24oZWYpOyB9Ci0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmICghc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9BTk5PVEFUSU9OUykpIHsKLQkJCWlmIChnZXRKMkVFVmVyc2lvbigpIDwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlMaXN0IGxpc3QgPSBnZXRQcm9qZWN0TW9kZWxzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJKChJRGF0YU1vZGVsKSBsaXN0LmdldChpKSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG8gbm90IHVzZSB0aGlzIGl0IHdpbGwgYmUgZGVsZXRlZCBwb3N0IDIuMC4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgbW92ZWQgdG8gYSB1dGlsaXR5IGNsYXNzLgotCSAqIEBkZXByZWNhdGVkIAotCSAqIEBwYXJhbSBlYXJGaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxVdGlsaXRpZXMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCUxpc3QgZmlsZXMgPSBlYXJGaWxlLmdldEZpbGVzKCk7Ci0JCUxpc3QgdXRpbEphcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRmlsZUltcGwgZmlsZSA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkZpbGVJbXBsKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc0FyY2hpdmUoKSAmJiAhZmlsZS5pc01vZHVsZUZpbGUoKSAmJiBmaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXV0aWxKYXJzLmFkZChmaWxlKTsKLQkJCX0KLQkJCWlmIChmaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQkJdXRpbEphcnMuYWRkQWxsKGdldFdlYkxpYnMoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGUpIGZpbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXRpbEphcnM7Ci0JfQotCQotCS8qKgotCSAqIERvIG5vdCB1c2UgdGhpcyBpdCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCAyLjAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgbW92ZWQgdG8gYSB1dGlsaXR5IGNsYXNzLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHdhckZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdlYkxpYnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZSB3YXJGaWxlKSB7Ci0JCXJldHVybiAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV0FSRmlsZUltcGwpIHdhckZpbGUpLmdldExpYkFyY2hpdmVzKCk7Ci0JfQotCQotCS8vIFRPRE86IEltcGxlbWVudCB3aXRoIEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyCi0JLyoKLQkgKiBwdWJsaWMgSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsIGdldE1hdGNoaW5nRUpCSmFyT3JDbGllbnQoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsIG1vZGVsKSB7IGlmCi0JICogKGNsaWVudEphclRvRWpiSmFyTW9kZWxzLmNvbnRhaW5zS2V5KG1vZGVsKSkgeyByZXR1cm4gKEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbCkKLQkgKiBjbGllbnRKYXJUb0VqYkphck1vZGVscy5nZXQobW9kZWwpOyB9IGVsc2UgaWYgKGVqYkphclRvQ2xpZW50SmFyTW9kZWxzLmNvbnRhaW5zS2V5KG1vZGVsKSkgeyByZXR1cm4KLQkgKiAoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsKSBlamJKYXJUb0NsaWVudEphck1vZGVscy5nZXQobW9kZWwpOyB9IGVsc2UgeyByZXR1cm4gbnVsbDsgfSB9Ci0JICovCi0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlJRGF0YU1vZGVsIGNvbXBvbmVudENyZWF0aW9uRE0gPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGNvbXBvbmVudENyZWF0aW9uRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQlJRGF0YU1vZGVsIGVhckZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04gKTsJCi0JCWVhckZhY2V0LnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQsIGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTE5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSUFubm90YXRpb25zRGF0YU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQW5ub3RhdGlvbnNEYXRhTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YTQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQW5ub3RhdGlvbnNEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogVGhlIElBbm5vdGF0aW9uc0RhdGFNb2RlbCBpcyBkYXRhIG1vZGVsIGludGVyZmFjZSB1c2VkIGJ5IG90aGVyIGRhdGEgbW9kZWxzIGluCi0gKiB0aGUgV1RQIHdpemFyZCBhbmQgb3BlcmF0aW9uIGZyYW1ld29yay4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuV1RQT3BlcmF0aW9uRGF0YU1vZGVsCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLldUUE9wZXJhdGlvbgotICogCi0gKiBUaGlzIHByb3ZpZGVzIHRoZSBVU0VfQU5OT1RBVElPTlMgcHJvcGVydHkgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvcgotICogbm90IGFydGlmYWN0cyBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyBhbm5vdGF0aW9ucyBvciBub3QuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIGludGVyZmFjZSB0byBhZGQgdGhlaXIgb3duIHByb3BlcnRpZXMuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMIGFuZCBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbnNEYXRhTW9kZWwgewotCi0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgQm9vbGVhbiB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhcnRpZmFjdCBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGFubm90YXRlZCB0YWdzLgotCSAqIFRoZSBkZWZhdWx0IGlzIHNldCBvbiB0aGUgcGFydGljdWxhciBkYXRhIG1vZGVsIHdobyBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BTk5PVEFUSU9OUyA9ICJJQW5ub3RhdGlvbnNEYXRhTW9kZWwudXNlQW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lNb2R1bGVFeHRlbnNpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JTW9kdWxlRXh0ZW5zaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTEzNmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVFeHRlbnNpb25zIHsKLQotCXB1YmxpYyBTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgU3RyaW5nIERPVF9SQVIgPSAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERPVF9FQVIgPSAiLmVhciI7IC8vJE5PTi1OTFMtMSQKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JVXBkYXRlTW9kdWxlQ29udGV4dFJvb3RQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JVXBkYXRlTW9kdWxlQ29udGV4dFJvb3RQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDdiZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVVwZGF0ZU1vZHVsZUNvbnRleHRSb290UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBCRUEgU3lzdGVtcywgSW5jCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqIEhvbGRzIERhdGFNb2RlbE9wZXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB1cGRhdGluZyB0aGUgY29udGV4dC1yb290IG9mIG1vZHVsZXMgaW4gYXNzb2NpYXRlZCBFQVIgYXBwbGljYXRpb24ueG1sIGZpbGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVNb2R1bGVDb250ZXh0Um9vdFByb3BlcnRpZXMgZXh0ZW5kcyBJU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBJRCBmb3IgbmV4dGVkIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfSUQgPSAiVXBkYXRlTW9kdWxlQ29udGV4dFJvb3RNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOYW1lIG9mIHByb3BlcnR5IChpbiBuZXN0ZWQgbW9kZWwpIHRoYXQgaG9sZHMgYSBMaXN0IG9mIEVBUiBJUHJvamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSU19UT19VUERBVEUgPSAiSVVwZGF0ZU1vZHVsZUNvbnRleHRSb290UHJvcGVydGllcy5FQVJTX1RPX1VQREFURSI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2IxMzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVBcnRpZmFjdEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBcmNoaXZlRXhwb3J0UGFydGljaXBhbnREYXRhIGltcGxlbWVudHMgSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGEKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50IGV4dGVuc2lvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSURhdGFNb2RlbCBkYXRhbW9kZWwgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb247Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFtb2RlbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoTWFwIGNvbXBvbmVudE1hcDsKLQotCXB1YmxpYyBKMkVFQXJ0aWZhY3RFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBUkNISVZFX0RFU1RJTkFUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRVhQT1JUX1NPVVJDRV9GSUxFUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE9WRVJXUklURV9FWElTVElORyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJVTl9CVUlMRCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTVBPTkVOVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUlVOVElNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcoU3RyaW5nIHByb2plY3ROYW1lKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFSQ0hJVkVfREVTVElOQVRJT04pKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVYUE9SVF9TT1VSQ0VfRklMRVMpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9WRVJXUklURV9FWElTVElORykpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUlVOX0JVSUxEKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTKSkgewotCQkgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8SUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE+KCk7Ci0JCX0gZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FKSl7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lICkKLQl7Ci0JICAgIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSApICkKLQkgICAgewotCSAgICAgICAgcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyggUlVOVElNRSApLmxlbmd0aCA+IDA7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggUlVOVElNRSApICkKLQkgICAgewotCSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSk7IAotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIAotCXsKLQkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlmaW5hbCBJRGF0YU1vZGVsIGRtID0gZ2V0RGF0YU1vZGVsKCk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlpZiAoZ2V0Q29tcG9uZW50TWFwKCkuaXNFbXB0eSgpKQotCQkJCWludGlhbGl6ZUNvbXBvbmVudE1hcCgpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBnZXRDb21wb25lbnRNYXAoKS5nZXQocHJvcGVydHlWYWx1ZSk7Ci0JCQlpZiAobnVsbCAhPSBjb21wb25lbnQgJiYgY29tcG9uZW50LmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHlWYWx1ZSkpIHsKLQkJCQlzZXRQcm9wZXJ0eShDT01QT05FTlQsIGNvbXBvbmVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXNldFByb3BlcnR5KENPTVBPTkVOVCwgbnVsbCk7Ci0JCQl9Ci0KLSAgICAgICAgICAgIGRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCBSVU5USU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbXBvbmVudCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBjb21wb25lbnQuZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSjJFRVBsdWdpbi5sb2dFcnJvciggLTEsIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIG9wdGltaXplID0gZmFsc2U7Ci0gICAgICAgICAgICBJUnVudGltZSBydW50aW1lID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZwcm9qICE9ICBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydW50aW1lID0gZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGltaXplID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gdmFsaWRWYWx1ZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGRtLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyggUlVOVElNRSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHZhbGlkVmFsdWVzLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lID0gKElSdW50aW1lKSB2YWxpZFZhbHVlc1sgMCBdLmdldFByb3BlcnR5VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0UHJvcGVydHkoIE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FLCBvcHRpbWl6ZSk7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eSggUlVOVElNRSwgcnVudGltZSApOwotCQl9Ci0JCWVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FICkgKQotCQl7Ci0gICAgICAgICAgICBkbS5ub3RpZnlQcm9wZXJ0eUNoYW5nZSggUlVOVElNRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHICk7Ci0JCX0KLQkJZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggUlVOVElNRSApICkKLQkJewotICAgICAgICAgICAgZmluYWwgTGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4gY3VycmVudEV4dERhdGFMaXN0Ci0gICAgICAgICAgICAgICAgPSAoTGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4pIGdldFByb3BlcnR5KCBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY3VycmVudEV4dERhdGFMaXN0ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGEgZXh0RGF0YSA6IGN1cnJlbnRFeHREYXRhTGlzdCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkbS5yZW1vdmVOZXN0ZWRNb2RlbCggZXh0RGF0YS5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBMaXN0PElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnREYXRhPiBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4oKTsKLQkJICAgIAotCQkgICAgaWYoIHByb3BlcnR5VmFsdWUgIT0gbnVsbCApCi0JCSAgICB7Ci0JCSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJICAgICAgICAKLQkJICAgICAgICBpZiggcHJvamVjdCAhPSBudWxsICYmIHByb3BlcnR5VmFsdWUgIT0gbnVsbCApCi0JCSAgICAgICAgewotCQkgICAgICAgICAgICBmaW5hbCBJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBwcm9wZXJ0eVZhbHVlOwotCQkgICAgICAgICAgICAKLQkJICAgICAgICAgICAgZm9yKCBBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGFydGljaXBhbnRJbmZvIHBhcnRJbmZvIAotCQkgICAgICAgICAgICAgICAgIDogQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoIHByb2plY3QsIHJ1bnRpbWUgKSApCi0JCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGEgcGFydERhdGEgPSBuZXcgQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydERhdGEuaWQgPSBwYXJ0SW5mby5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydERhdGEuZXh0ZW5zaW9uID0gcGFydEluZm8ubG9hZFBhcnRpY2lwYW50KCk7Ci0JCSAgICAgICAgICAgICAgICAKLQkJICAgICAgICAgICAgICAgIGlmKCBwYXJ0RGF0YS5leHRlbnNpb24gIT0gbnVsbCApCi0JCSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0JCSAgICAgICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0RGF0YS5kYXRhbW9kZWwgPSBwYXJ0RGF0YS5leHRlbnNpb24uY3JlYXRlRGF0YU1vZGVsKCBkbSApOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBkbS5hZGROZXN0ZWRNb2RlbCggcGFydERhdGEuaWQsIHBhcnREYXRhLmRhdGFtb2RlbCApOwotCQkgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotCQkgICAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgSjJFRVBsdWdpbi5sb2dFcnJvciggLTEsIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnREYXRhID0gbnVsbDsKLQkJICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICBlbHNlCi0JCSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcGFydERhdGEgPSBudWxsOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgCi0JCSAgICAgICAgICAgICAgICBpZiggcGFydERhdGEgIT0gbnVsbCApCi0JCSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQoIHBhcnREYXRhICk7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCSAgICAKLQkJICAgIHNldFByb3BlcnR5KCBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUywgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggZXh0ZW5zaW9ucyApICk7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXQ7Ci0JfQotCi0JcHVibGljIEhhc2hNYXAgZ2V0Q29tcG9uZW50TWFwKCkgewotCQlpZiAoY29tcG9uZW50TWFwID09IG51bGwpCi0JCQljb21wb25lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gY29tcG9uZW50TWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIGludGlhbGl6ZUNvbXBvbmVudE1hcCgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wcyA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBbGxXb3JrYmVuY2hDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcHMubGVuZ3RoOyBpKyspIHsKLQkJCWdldENvbXBvbmVudE1hcCgpLnB1dChjb21wc1tpXS5nZXROYW1lKCksIGNvbXBzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlIHRoZSByZXNvdXJjZSBuYW1lIGNvbWJvIHdpdGggcHJvamVjdHMgdGhhdCBhcmUgbm90IGVuY3J5cHRlZC4KLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gVE9ETzogcG9wdWxhdGUgdmFsaWQgY29tcG9uZW50cwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlMaXN0IGNvbXBvbmVudE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVZpcnR1YWxDb21wb25lbnRbXSB3YkNvbXBzID0gQ29tcG9uZW50VXRpbGl0aWVzLmdldEFsbFdvcmtiZW5jaENvbXBvbmVudHMoKTsKLQotCQkJTGlzdCByZWxldmFudENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdiQ29tcHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHdiQ29tcHNbaV0uZ2V0UHJvamVjdCgpKS5lcXVhbHMoZ2V0UHJvamVjdFR5cGUoKSkpIHsKLQkJCQkJcmVsZXZhbnRDb21wb25lbnRzLmFkZCh3YkNvbXBzW2ldKTsKLQkJCQkJZ2V0Q29tcG9uZW50TWFwKCkucHV0KHdiQ29tcHNbaV0uZ2V0TmFtZSgpLCB3YkNvbXBzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWxldmFudENvbXBvbmVudHMgPT0gbnVsbCB8fCByZWxldmFudENvbXBvbmVudHMuc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVsZXZhbnRDb21wb25lbnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJY29tcG9uZW50TmFtZXMuYWRkKCgoSVZpcnR1YWxDb21wb25lbnQpIHJlbGV2YW50Q29tcG9uZW50cy5nZXQoaikpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IChTdHJpbmdbXSkgY29tcG9uZW50TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NvbXBvbmVudE5hbWVzLnNpemUoKV0pOwotCi0JCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKG5hbWVzKTsKLQkJfQotCQllbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBSVU5USU1FICkgKQotCQl7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCSAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGdldFByb3BlcnR5KCBDT01QT05FTlQgKTsKLQkJICAgIAotCQkgICAgaWYoIGNvbXBvbmVudCAhPSBudWxsICkKLQkJICAgIHsKLSAgICAgICAgICAgICAgICBpZiggY29tcG9uZW50ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggY29tcG9uZW50LmdldFByb2plY3QoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZnByb2ouaXNUYXJnZXRhYmxlKCBydW50aW1lICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZXMuYWRkKCBydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPElSdW50aW1lPiBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8SVJ1bnRpbWU+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIGZpbmFsIElSdW50aW1lIHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcjIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIxLmdldE5hbWUoKS5jb21wYXJlVG8oIHIyLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoIHJ1bnRpbWVzLCBjb21wYXJhdG9yICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEoyRUVQbHVnaW4ubG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkgICAgfQotCQkgICAgCi0JCSAgICByZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKCBydW50aW1lcy50b0FycmF5KCkgKTsJCSAgICAKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkvLyAoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0TmFtZXNXaXRob3V0Rm9yd2FyZFNsYXNoKChTdHJpbmdbXSkKLQkJLy8gcHJvamVjdHNXaXRoTmF0dXJlLnRvQXJyYXkobmV3IFN0cmluZ1twcm9qZWN0c1dpdGhOYXR1cmUuc2l6ZSgpXSkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsI2RvVmFsaWRhdGVQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKFBST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5NT0RVTEVfRVhJU1RTX0VSUk9SKSk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGNvbXBvbmVudE1hcC5nZXQocHJvamVjdE5hbWUpOwotCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuTU9EVUxFX0VYSVNUU19FUlJPUikpOwotCQkJfQotCQkJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSkuZXF1YWxzKGdldFByb2plY3RUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcocHJvamVjdE5hbWUpKTsKLQkJCX0KLQkJfQotCQlpZiAoQVJDSElWRV9ERVNUSU5BVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJU3RyaW5nIGFyY2hpdmVMb2NhdGlvbiA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04pOwotCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KEFSQ0hJVkVfREVTVElOQVRJT04pIHx8IGFyY2hpdmVMb2NhdGlvbi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5ERVNUSU5BVElPTl9JTlZBTElEKSk7IC8vKTsKLQkJCX0gZWxzZSBpZiAobW9kZWwuaXNQcm9wZXJ0eVNldChBUkNISVZFX0RFU1RJTkFUSU9OKSAmJiAhdmFsaWRhdGVNb2R1bGVUeXBlKGFyY2hpdmVMb2NhdGlvbikpIHsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5ERVNUSU5BVElPTl9BUkNISVZFX1NIT1VMRF9FTkRfV0lUSCwgbmV3IE9iamVjdFtde2dldE1vZHVsZUV4dGVuc2lvbigpfSkpOyAvLyk7Ci0JCQl9IGVsc2UgaWYgKG1vZGVsLmlzUHJvcGVydHlTZXQoQVJDSElWRV9ERVNUSU5BVElPTikpIHsKLQkJCQlJU3RhdHVzIHRlbXBTdGF0dXMgPSB2YWxpZGF0ZUxvY2F0aW9uKGFyY2hpdmVMb2NhdGlvbik7Ci0JCQkJaWYgKHRlbXBTdGF0dXMgIT0gT0tfU1RBVFVTKQotCQkJCQlyZXR1cm4gdGVtcFN0YXR1czsKLQkJCX0KLQkJfQotCQlpZiAoQVJDSElWRV9ERVNUSU5BVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBPVkVSV1JJVEVfRVhJU1RJTkcuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpIGdldFByb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04pOwotCQkJaWYgKGNoZWNrRm9yRXhpc3RpbmdGaWxlUmVzb3VyY2UobG9jYXRpb24pKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUkVTT1VSQ0VfRVhJU1RTX0VSUk9SLCBuZXcgT2JqZWN0W117bG9jYXRpb259KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVMb2NhdGlvbihTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJcGF0aCA9IG5ldyBQYXRoKGFyY2hpdmVMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuREVTVElOQVRJT05fSU5WQUxJRCkpOwotCQl9Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpLCBJUmVzb3VyY2UuRklMRSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlTdHJpbmcgZGV2aWNlID0gcGF0aC5nZXREZXZpY2UoKTsKLQkJaWYgKGRldmljZSA9PSBudWxsKQotCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBkZXZpY2UubGVuZ3RoKCkgPT0gMSAmJiBkZXZpY2UuY2hhckF0KDApID09IElQYXRoLkRFVklDRV9TRVBBUkFUT1IpCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5ERVNUSU5BVElPTl9JTlZBTElEKSk7Ci0KLQkJaWYgKCFwYXRoLnRvRmlsZSgpLmNhbldyaXRlKCkpIHsKLQkJCWlmIChwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuSVNfUkVBRF9PTkxZKSk7Ci0JCQl9Ci0JCQlib29sZWFuIE9LID0gZmFsc2U7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlmb3IgKGludCBpID0gMTsgIU9LICYmIGkgPCAyMCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMDsgaSsrKSB7Ci0JCQkJaWYgKHBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJT0sgPSB0cnVlOwotCQkJCX0KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkRFU1RJTkFUSU9OX0lOVkFMSUQpKTsKLQkJCQl9Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JFeGlzdGluZ0ZpbGVSZXNvdXJjZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKCFtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoT1ZFUldSSVRFX0VYSVNUSU5HKSkgewotCQkJamF2YS5pby5GaWxlIGV4dGVybmFsRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKGV4dGVybmFsRmlsZSAhPSBudWxsICYmIGV4dGVybmFsRmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTW9kdWxlVHlwZShTdHJpbmcgYXJjaGl2ZSkgewotCQlpZiAoKGFyY2hpdmUubGVuZ3RoKCkgPCA0KSB8fCAoIShhcmNoaXZlLnN1YnN0cmluZyhhcmNoaXZlLmxlbmd0aCgpIC0gNCwgYXJjaGl2ZS5sZW5ndGgoKSkuZXF1YWxzSWdub3JlQ2FzZShnZXRNb2R1bGVFeHRlbnNpb24oKSkpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKQotCXsKLQkgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBnZXRQcm9wZXJ0eSggQ09NUE9ORU5UICk7Ci0JICAgIAotCSAgICBpZiggY29tcG9uZW50ICE9IG51bGwgKQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlNGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcywgSURhdGFNb2RlbExpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfREVGQVVMVF9QUk9KRUNUX05BTUUgPSAiSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuVVNFX0RFRkFVTFRfUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1JVTlRJTUUgPSAiSUoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIElEYXRhTW9kZWwgY29tcG9uZW50Q3JlYXRpb25ETTsKLQlwcml2YXRlIFRocm93YWJsZSBhcmNoaXZlT3BlbkZhaWx1cmUgPSBudWxsOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklMRV9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklMRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNBVkVfRklMVEVSKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoT1ZFUldSSVRFX0hBTkRMRVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDTE9TRV9BUkNISVZFX09OX0RJU1BPU0UpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfREVGQVVMVF9QUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT01QT05FTlQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZCggRkFDRVRfUlVOVElNRSApOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBUkNISVZFX1dSQVBQRVIpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWNvbXBvbmVudENyZWF0aW9uRE0gPSBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLQkJY29tcG9uZW50Q3JlYXRpb25ETS5zZXRCb29sZWFuUHJvcGVydHkoRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5GT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UsIGZhbHNlKTsKLQkJY29tcG9uZW50Q3JlYXRpb25ETS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJbW9kZWwuYWRkTmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OLCBjb21wb25lbnRDcmVhdGlvbkRNKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENMT1NFX0FSQ0hJVkVfT05fRElTUE9TRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfREVGQVVMVF9QUk9KRUNUX05BTUUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9ZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyhDT01QT05FTlQpKXsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsJCQkKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldHRpbmdGaWxlTmFtZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQVJDSElWRV9XUkFQUEVSKSkgewotCQkJaWYocHJvcGVydHlWYWx1ZSAhPSBudWxsKXsKLQkJCQlpZiAoIXNldHRpbmdGaWxlTmFtZSkgewotCQkJCQlzZXRQcm9wZXJ0eShGSUxFX05BTUUsIG51bGwpOwotCQkJCX0KLQkJCQl1cGRhdGVEZWZhdWx0Q29tcG9uZW50TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEUpKXsKLQkJCWlmKHByb3BlcnR5VmFsdWUgIT0gbnVsbCl7Ci0JCQkJaWYoIXNldHRpbmdGaWxlTmFtZSkgewotCQkJCQlBcmNoaXZlV3JhcHBlciBhcmNoaXZlV3JhcHBlciA9IGdldEFyY2hpdmVXcmFwcGVyKCk7Ci0JCQkJCWlmKG51bGwgPT0gYXJjaGl2ZVdyYXBwZXIgfHwgYXJjaGl2ZVdyYXBwZXIuZ2V0Q29tbW9uQXJjaGl2ZSgpICE9IHByb3BlcnR5VmFsdWUpewotCQkJCQkJYXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpcHJvcGVydHlWYWx1ZSk7Ci0JCQkJCQlzZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIsIGFyY2hpdmVXcmFwcGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNBVkVfRklMVEVSKSAmJiBnZXRBcmNoaXZlV3JhcHBlcigpICE9IG51bGwgJiYgZ2V0QXJjaGl2ZVdyYXBwZXIoKS5nZXRDb21tb25BcmNoaXZlKCkgIT0gbnVsbCkgewotCQkJZ2V0QXJjaGl2ZVdyYXBwZXIoKS5nZXRDb21tb25BcmNoaXZlKCkuc2V0U2F2ZUZpbHRlcihnZXRTYXZlRmlsdGVyKCkpOwotCQl9IGVsc2UgaWYgKEZJTEVfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJdHJ5IHsKLQkJCQlhcmNoaXZlT3BlbkZhaWx1cmUgPSBudWxsOwotCQkJCWhhbmRsZUFyY2hpdmVTZXR1cCgoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIG9lKSB7Ci0JCQkJYXJjaGl2ZU9wZW5GYWlsdXJlID0gb2U7Ci0JCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCWFyY2hpdmVPcGVuRmFpbHVyZSA9IGU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiggQ09NUE9ORU5ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHByb3BlcnR5TmFtZSArICIgc2hvdWxkIG5vdCBiZSBzZXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgaWYgKFBST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJTGlzdCBuZXN0ZWRNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KG1vZGVsLmdldE5lc3RlZE1vZGVscygpKTsKLQkJCUlEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQluZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKSBuZXN0ZWRNb2RlbHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCW5lc3RlZE1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYoIEZBQ0VUX1JVTlRJTUUuZXF1YWxzKCBwcm9wZXJ0eU5hbWUgKSl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwcm9wZXJ0eU5hbWUgKyAiIHNob3VsZCBub3QgYmUgc2V0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvaW5nQ29tcG9uZW50VXBkYXRlOwotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlZmF1bHRDb21wb25lbnROYW1lKCkgewotCQlBcmNoaXZlV3JhcHBlciB3cmFwcGVyID0gZ2V0QXJjaGl2ZVdyYXBwZXIoKTsKLQkJaWYgKG51bGwgIT0gd3JhcHBlciAmJiBnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfUFJPSkVDVF9OQU1FKSkgewotCQkJdHJ5IHsKLQkJCQlkb2luZ0NvbXBvbmVudFVwZGF0ZSA9IHRydWU7Ci0JCQkJSVBhdGggcGF0aCA9IHdyYXBwZXIuZ2V0UGF0aCgpOwotCQkJCVN0cmluZyBkZWZhdWx0UHJvamVjdE5hbWUgPSBwYXRoLnNlZ21lbnQocGF0aC5zZWdtZW50Q291bnQoKSAtIDEpOwotCQkJCWlmIChkZWZhdWx0UHJvamVjdE5hbWUuaW5kZXhPZignLicpID4gMCkgewotCQkJCQlkZWZhdWx0UHJvamVjdE5hbWUgPSBkZWZhdWx0UHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIGRlZmF1bHRQcm9qZWN0TmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQkJCQl9Ci0JCQkJc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLCBkZWZhdWx0UHJvamVjdE5hbWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlkb2luZ0NvbXBvbmVudFVwZGF0ZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQXJjaGl2ZVNldHVwKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uLCBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJc2V0dGluZ0ZpbGVOYW1lID0gdHJ1ZTsKLQkJCUFyY2hpdmVXcmFwcGVyIHdyYXBwZXIgPSBnZXRBcmNoaXZlV3JhcHBlcigpOwotCQkJaWYgKHdyYXBwZXIhPSBudWxsKSB7Ci0JCQkJd3JhcHBlci5jbG9zZSgpOwotCQkJCXNldFByb3BlcnR5KEZJTEUsIG51bGwpOwotCQkJCXNldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUiwgbnVsbCk7Ci0JCQl9Ci0JCQlTdHJpbmcgdXJpID0gZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9OQU1FKTsKLQkJCWlmICghYXJjaGl2ZUV4aXN0c09uRmlsZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXdyYXBwZXIgPSBvcGVuQXJjaGl2ZVdyYXBwZXIodXJpKTsKLQkJCWlmKHdyYXBwZXIgIT0gbnVsbCl7Ci0JCQkJc2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSLCB3cmFwcGVyKTsKLQkJCQlpZih3cmFwcGVyLmdldENvbW1vbkFyY2hpdmUoKSAhPSBudWxsKXsKLQkJCQkJc2V0UHJvcGVydHkoRklMRSwgd3JhcHBlci5nZXRDb21tb25BcmNoaXZlKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB3cmFwcGVyIT0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldHRpbmdGaWxlTmFtZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZVdyYXBwZXIgb3BlbkFyY2hpdmVXcmFwcGVyKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiwgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uewotCQlJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaSk7Ci0JCWFyY2hpdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKHBhdGgpOwotCQlhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuc2V0T3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuRElTQ1JJTUlOQVRFX0VKQl9BTk5PVEFUSU9OUywgQm9vbGVhbi5UUlVFKTsKLQkJYXJjaGl2ZS5zZXRQYXRoKHBhdGgpOwotCQlKYXZhRUVRdWlja1BlZWsganFwID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSk7Ci0JCQotCQlpZihqcXAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEoyRUVDb25zdGFudHMuVU5LTk9XTiAmJiBqcXAuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuVU5LTk9XTil7Ci0JCQloYW5kbGVVbmtub3duVHlwZShqcXApOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3IEFyY2hpdmVXcmFwcGVyKGFyY2hpdmUpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbGxvd3Mgc3ViY2xhc3NlcyB0byBoYW5kbGUgYW4gdW5rbm93biBhcmNoaXZlIHR5cGUuCi0JICogQHBhcmFtIGpxcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25UeXBlKEphdmFFRVF1aWNrUGVlayBqcXApIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VBcmNoaXZlKCkgewotCQlpZiAobnVsbCAhPSBnZXRBcmNoaXZlV3JhcHBlcigpKSB7Ci0JCQlnZXRBcmNoaXZlV3JhcHBlcigpLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRklMRV9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmICFpc1Byb3BlcnR5U2V0KEFSQ0hJVkVfV1JBUFBFUikpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuQVJDSElWRV9GSUxFX05BTUVfRU1QVFlfRVJST1IsIG5ldyBPYmplY3RbXXtBcmNoaXZlVXRpbC5nZXRNb2R1bGVGaWxlVHlwZU5hbWUoZ2V0VHlwZSgpKX0pKTsKLQkJCX0gZWxzZSBpZiAoYXJjaGl2ZU9wZW5GYWlsdXJlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhhcmNoaXZlT3BlbkZhaWx1cmUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgIWFyY2hpdmVFeGlzdHNPbkZpbGUoKSkgewotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkZJTEVfRE9FU19OT1RfRVhJU1RfRVJST1IsIG5ldyBPYmplY3RbXXtBcmNoaXZlVXRpbC5nZXRNb2R1bGVGaWxlVHlwZU5hbWUoZ2V0VHlwZSgpKX0pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkgKSB7Ci0JCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKS52YWxpZGF0ZSh0cnVlKTsKLQkJfSBlbHNlIGlmKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIHZhbGlkYXRlVmVyc2lvblN1cHBvcnRlZEJ5U2VydmVyKCk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLQotCS8qCi0JICogQHNlZSBYTUxSZXNvdXJjZSNBUFBfQ0xJRU5UX1RZUEUKLQkgKiBAc2VlIFhNTFJlc291cmNlI0FQUExJQ0FUSU9OX1RZUEUKLQkgKiBAc2VlIFhNTFJlc291cmNlI0VKQl9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNXRUJfQVBQX1RZUEUKLQkgKiBAc2VlIFhNTFJlc291cmNlI1JBUl9UWVBFCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRUeXBlKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXJjaGl2ZUV4aXN0c09uRmlsZSgpIHsKLQkJU3RyaW5nIGphck5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShGSUxFX05BTUUpOwotCQlpZiAoamFyTmFtZSAhPSBudWxsICYmIGphck5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoamFyTmFtZSk7Ci0JCQlyZXR1cm4gZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KENMT1NFX0FSQ0hJVkVfT05fRElTUE9TRSkpCi0JCQljbG9zZUFyY2hpdmUoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEFyY2hpdmVGaWxlKEFyY2hpdmUgYXJjaGl2ZUZpbGUpIHsKLQkJc2V0UHJvcGVydHkoRklMRSwgYXJjaGl2ZUZpbGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgQXJjaGl2ZVdyYXBwZXIgZ2V0QXJjaGl2ZVdyYXBwZXIoKXsKLQkJcmV0dXJuIChBcmNoaXZlV3JhcHBlcilnZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEByZXR1cm4gdXNlIEFSQ0hJVkVfV1JBUFBFUgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBBcmNoaXZlIGdldEFyY2hpdmVGaWxlKCkgewotCQlyZXR1cm4gKEFyY2hpdmUpIGdldFByb3BlcnR5KEZJTEUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBBcmNoaXZlT3B0aW9ucyBnZXRBcmNoaXZlT3B0aW9ucygpIHsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0cyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRzLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCXByaXZhdGUgU2F2ZUZpbHRlciBnZXRTYXZlRmlsdGVyKCkgewotCQlyZXR1cm4gKFNhdmVGaWx0ZXIpIGdldFByb3BlcnR5KFNBVkVfRklMVEVSKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlpZiAoIWRvaW5nQ29tcG9uZW50VXBkYXRlICYmIGV2ZW50LmdldERhdGFNb2RlbCgpID09IGNvbXBvbmVudENyZWF0aW9uRE0gJiYgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFBST0pFQ1RfTkFNRSkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX1BST0pFQ1RfTkFNRSkpIHsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9QUk9KRUNUX05BTUUsIGZhbHNlKTsKLQkJfQotCQlpZiggZXZlbnQuZ2V0RGF0YU1vZGVsKCkgPT0gY29tcG9uZW50Q3JlYXRpb25ETSAmJiBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKSl7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZml4dXAgdGhlIEpTVCBmYWNldCB2ZXJzaW9uIGlmIGl0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBzZWxlY3RlZCBydW50aW1lCi0JICogSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBTZXJ2ZXIgUnVudGltZSBvciB0aGUgQXJjaGl2ZSBwcm9wZXJ0aWVzIGFyZSBzZXQuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmVyc2lvblN1cHBvcnRlZEJ5U2VydmVyKCl7Ci0JCWlmKCBtb2RlbC5pc1Byb3BlcnR5U2V0KEFSQ0hJVkVfV1JBUFBFUikgJiYgbW9kZWwuaXNQcm9wZXJ0eVNldChJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKXsKLQkJCUlEYXRhTW9kZWwgcHJvamVjdE1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgcHJvamVjdE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCUNvbGxlY3Rpb24gcHJvamVjdEZhY2V0cyA9IChDb2xsZWN0aW9uKWdldFByb3BlcnR5KEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04pOwotCQkJCQkKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCQlpZihydW50aW1lICE9IG51bGwpewotCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3RGYWNldHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJCUlEYXRhTW9kZWwgZmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoKChJUHJvamVjdEZhY2V0KWl0ZXJhdG9yLm5leHQoKSkuZ2V0SWQoKSk7Ci0JCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilmYWNldERhdGFNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pOwotCQkJCQlpZihmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfSkFWQSkpewotCQkJCQkJU2V0IHNldCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTZXQgY29ycmVjdFNldCA9IHJ1bnRpbWUuZ2V0RGVmYXVsdEZhY2V0cyhzZXQpOwotCQkJCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGNvcnJlY3RWZXJzaW9uID0gbnVsbDsKLQkJCQkJCQlJdGVyYXRvciBjb3JyZWN0VmVyc2lvbnMgPSBjb3JyZWN0U2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCQkJd2hpbGUoY29ycmVjdFZlcnNpb25zLmhhc05leHQoKSAmJiBjb3JyZWN0VmVyc2lvbiA9PSBudWxsKXsKLQkJCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbiljb3JyZWN0VmVyc2lvbnMubmV4dCgpOwotCQkJCQkJCQlpZih2ZXJzaW9uLmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0pBVkEpKXsKLQkJCQkJCQkJCWNvcnJlY3RWZXJzaW9uID0gdmVyc2lvbjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlpZihjb3JyZWN0VmVyc2lvbiAhPSBudWxsKXsKLQkJCQkJCQkJaWYoIWZhY2V0VmVyc2lvbi5lcXVhbHMoY29ycmVjdFZlcnNpb24pKXsKLQkJCQkJCQkJCWZhY2V0RGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgY29ycmVjdFZlcnNpb24pOwotCQkJCQkJCQkJZmFjZXRWZXJzaW9uID0gY29ycmVjdFZlcnNpb247Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkKLQkJCQkJaWYoIXJ1bnRpbWUuc3VwcG9ydHMoZmFjZXRWZXJzaW9uKSl7Ci0JCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuVkVSU0lPTl9OT1RfU1VQUE9SVEVEICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAyMDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyOGMxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIGEgY29tbW9uIHN1cGVyIGNsYXNzIHVzZWQgdG8gaW1wb3J0IEoyRUUgTW9kdWxlcy4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRVhURU5ERURfSU1QT1JUX0ZBQ1RPUlkpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE1vZHVsZVNwZWNWZXJzaW9uKCkgewotCQlBcmNoaXZlV3JhcHBlciB3cmFwcGVyID0gZ2V0QXJjaGl2ZVdyYXBwZXIoKTsKLQkJcmV0dXJuIHdyYXBwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKCkuZ2V0VmVyc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSAjSUFSQ0hJVkVfV1JBUFBFUgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiAoTW9kdWxlRmlsZSkgZ2V0QXJjaGl2ZUZpbGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgSmF2YSBGYWNldCBWZXJzaW9uIHNvIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoZSBKYXZhIEVFIE1vZHVsZSB2ZXJzaW9uIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUphdmFGYWNldFZlcnNpb24oKSB7Ci0JCUFyY2hpdmVXcmFwcGVyIHdyYXBwZXIgPSBnZXRBcmNoaXZlV3JhcHBlcigpOwotCQlpbnQgamF2YUVFVmVyc2lvbiA9IHdyYXBwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKCkuZ2V0SmF2YUVFVmVyc2lvbigpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhRmFjZXRWZXJzaW9uID0gbnVsbDsKLQkJc3dpdGNoIChqYXZhRUVWZXJzaW9uKXsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXRVdGlscy5KQVZBXzEzOwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0JCQlqYXZhRmFjZXRWZXJzaW9uID0gSmF2YUZhY2V0VXRpbHMuSkFWQV8xNDsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ6Ci0JCQlqYXZhRmFjZXRWZXJzaW9uID0gSmF2YUZhY2V0VXRpbHMuSkFWQV81MDsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ6Ci0JCQlqYXZhRmFjZXRWZXJzaW9uID0gSmF2YUZhY2V0VXRpbHMuSkFWQV82MDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmKGphdmFGYWNldFZlcnNpb24gIT0gbnVsbCl7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kdWxlRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJSURhdGFNb2RlbCBqYXZhRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpBVkEgKTsKLQkJCWphdmFGYWNldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sIGphdmFGYWNldFZlcnNpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0QXNzaXN0YW50T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWViNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQYXRoVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVVdGlsaXR5SmFySW1wb3J0QXNzaXN0YW50T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBGaWxlIHV0aWxpdHlKYXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlSWZOZWNlc3NhcnkgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBhc3NvY2lhdGVkRUFSUHJvamVjdE5hbWU7Ci0KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24oU3RyaW5nIGxhYmVsLCBGaWxlIHV0aWxpdHlKYXIpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLnV0aWxpdHlKYXIgPSB1dGlsaXR5SmFyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzc29jaWF0ZWRFQVJQcm9qZWN0TmFtZShTdHJpbmcgYXNzb2NpYXRlZEVBUlByb2plY3ROYW1lKSB7Ci0JCXRoaXMuYXNzb2NpYXRlZEVBUlByb2plY3ROYW1lID0gYXNzb2NpYXRlZEVBUlByb2plY3ROYW1lOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlSWZOZWNlc3NhcnkoYm9vbGVhbiBvdmVyd3JpdGVQcm9qZWN0KSB7Ci0JCXRoaXMub3ZlcndyaXRlSWZOZWNlc3NhcnkgPSBvdmVyd3JpdGVQcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZUxpbmtlZFBhdGhWYXJpYWJsZShTdHJpbmcgbGlua2VkUGF0aFZhcmlhYmxlLCBGaWxlIGFyY2hpdmVGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UGF0aFZhcmlhYmxlTWFuYWdlcigpOwotCQlJUGF0aCBsaW5rZWRQYXRoID0gbmV3IFBhdGgoYXJjaGl2ZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQltYW5hZ2VyLnNldFZhbHVlKGxpbmtlZFBhdGhWYXJpYWJsZSwgbGlua2VkUGF0aCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZShGaWxlIHV0aWxpdHlKYXIpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAodXRpbGl0eUphciAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuID0gdXRpbGl0eUphci5nZXROYW1lKCkubGFzdEluZGV4T2YoJy4nKTsKLQkJCW5hbWUgPSB1dGlsaXR5SmFyLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgbGVuKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9IAotCi0JcHJvdGVjdGVkIGZpbmFsIElTdGF0dXMgbGlua0FyY2hpdmVUb0VBUihJUHJvamVjdCBlYXJQcm9qZWN0LCBTdHJpbmcgdXJpTWFwcGluZywgSVByb2plY3QgdXRpbGl0eVByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGFkZEFyY2hpdmVQcm9qZWN0VG9FQVJEYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhcmNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwotCQlJVmlydHVhbENvbXBvbmVudCB1dGlsY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQodXRpbGl0eVByb2plY3QpOwotCi0JCWFkZEFyY2hpdmVQcm9qZWN0VG9FQVJEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGVhcmNvbXBvbmVudCk7Ci0JCWFkZEFyY2hpdmVQcm9qZWN0VG9FQVJEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1dGlsY29tcG9uZW50KSk7Ci0JCU1hcCB1cmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl1cmlNYXAucHV0KHV0aWxjb21wb25lbnQsIHVyaU1hcHBpbmcpOwotCQlhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCB1cmlNYXApOwotCQlyZXR1cm4gYWRkQXJjaGl2ZVByb2plY3RUb0VBUkRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVN0YXR1cyBjcmVhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCB0YXJnZXRQcm9qZWN0LCBTdHJpbmcgdXJpTWFwcGluZywgSUZpbGUgdXRpbGl0eUphcklGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQotCQlJVmlydHVhbENvbXBvbmVudCBlYXJjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh0YXJnZXRQcm9qZWN0KTsKLQotCQlJVmlydHVhbENvbXBvbmVudCB1dGlsY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KHRhcmdldFByb2plY3QsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SICsgdXRpbGl0eUphcklGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQotCQlhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJjb21wb25lbnQpOwotCQlhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXRpbGNvbXBvbmVudCkpOwotCQlNYXAgdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdXJpTWFwLnB1dCh1dGlsY29tcG9uZW50LCB1cmlNYXBwaW5nKTsKLQkJYWRkQXJjaGl2ZVByb2plY3RUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgdXJpTWFwKTsKLQkJcmV0dXJuICBhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQotCXByb3RlY3RlZCBmaW5hbCBJU3RhdHVzIHJlbW92ZVJvb3RNYXBwaW5nKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgU3RyaW5nIHVyaU1hcHBpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlzb3VyY2VDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLnJlbW92ZUxpbmsobmV3IFBhdGgodXJpTWFwcGluZyksIDAsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQkKLQotCXByb3RlY3RlZCBGaWxlIGdldFV0aWxpdHlKYXIoKSB7Ci0JCXJldHVybiB1dGlsaXR5SmFyOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0QXNzb2NpYXRlZEVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gYXNzb2NpYXRlZEVBUlByb2plY3ROYW1lOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzT3ZlcndyaXRlSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiBvdmVyd3JpdGVJZk5lY2Vzc2FyeTsKLQl9Ci0gCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkTGlicmFyeVRvQ2xhc3NwYXRoKElQcm9qZWN0IGFzc29jaWF0ZWRFQVJQcm9qZWN0LCBJRmlsZSBjb3BpZWRKYXJGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoYXNzb2NpYXRlZEVBUlByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGNvcGllZEphckZpbGUuZ2V0RnVsbFBhdGgoKS5tYWtlQWJzb2x1dGUoKSwgbnVsbCwgLy8gc291cmNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXR0YWNobWVudAotCQkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAotCQkJCQkJbmV3IElBY2Nlc3NSdWxlWzBdLCAvLyBhY2Nlc3NSdWxlcwotCQkJCQkJbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbMF0sIC8vIGV4dHJhQXR0cmlidXRlcwotCQkJCQkJZmFsc2UpOyAvLyBpc0V4cG9ydGVkCi0KLQkJCUlKYXZhUHJvamVjdCBlYXJKYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShhc3NvY2lhdGVkRUFSUHJvamVjdCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSByYXdDbGFzc3BhdGggPSBlYXJKYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmF3Q2xhc3NwYXRoLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShyYXdDbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgcmF3Q2xhc3NwYXRoLmxlbmd0aCk7Ci0JCQluZXdDbGFzc3BhdGhbcmF3Q2xhc3NwYXRoLmxlbmd0aF0gPSBlbnRyeTsKLQkJCWVhckphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG1vbml0b3IpOwotCi0JCX0KLQl9Ci0JCi0gICAgcHJvdGVjdGVkIGZpbmFsIElTdGF0dXMgY3JlYXRlTGlua2VkQXJjaGl2ZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbGlua2VkRmlsZU5hbWUsIEZpbGUgYXJjaGl2ZUZpbGUsIFN0cmluZyBsaW5rZWRQYXRoVmFyaWFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRmlsZSBsaW5rZWRKYXJGaWxlID0gbnVsbDsgCi0gICAgICAgIElQYXRoIHBhdGhUb0FyY2hpdmUgPSBnZXRMaW5rZWRQYXRoKGFyY2hpdmVGaWxlLCBsaW5rZWRQYXRoVmFyaWFibGUpOwotCi0gICAgICAgIGxpbmtlZEphckZpbGUgPSBwcm9qZWN0LmdldEZpbGUobGlua2VkRmlsZU5hbWUpOwotICAgICAgICBpZiAobGlua2VkSmFyRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKGlzT3ZlcndyaXRlSWZOZWNlc3NhcnkoKSkKLSAgICAgICAgICAgICAgICBsaW5rZWRKYXJGaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbl9GaWxlX2FscmVhZHlfZXhpc3RzXzBfLCBsaW5rZWRKYXJGaWxlLmdldEZ1bGxQYXRoKCkpLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBsaW5rZWRKYXJGaWxlLmNyZWF0ZUxpbmsocGF0aFRvQXJjaGl2ZSwgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCi0gICAgICAgIGFkZExpYnJhcnlUb0NsYXNzcGF0aChwcm9qZWN0LCBsaW5rZWRKYXJGaWxlLCBtb25pdG9yKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfSAKLQotICAgIHByb3RlY3RlZCBmaW5hbCBJUGF0aCBnZXRMaW5rZWRQYXRoKEZpbGUgYXJjaGl2ZUZpbGUsIFN0cmluZyBsaW5rZWRQYXRoVmFyaWFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsgICAgICAgIAotCi0gICAgICAgIGlmIChsaW5rZWRQYXRoVmFyaWFibGUgPT0gbnVsbCB8fCBsaW5rZWRQYXRoVmFyaWFibGUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aChhcmNoaXZlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY3JlYXRlTGlua2VkUGF0aFZhcmlhYmxlKGxpbmtlZFBhdGhWYXJpYWJsZSwgYXJjaGl2ZUZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aChsaW5rZWRQYXRoVmFyaWFibGUpLmFwcGVuZChhcmNoaXZlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfSAKLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGZpbmRVbmlxdWVMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHJvcG9zZWRQcm9qZWN0TmFtZSkgeyAKLSAgICAJCi0gICAgCXJldHVybiBiYXNlTG9jYXRpb24gIT0gbnVsbCA/IChiYXNlTG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvciArIHByb3Bvc2VkUHJvamVjdE5hbWUpIDogbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlZTY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDE1LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFX1VUSUxJVFlfSkFSX0lNUE9SVF9ETVBfSUQgPSAiajJlZVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlciI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFQVJfUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEoyRUVVdGlsaXR5SmFySW1wb3J0T3BlcmF0aW9uTmV3KG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0KLQkJcmV0dXJuIEoyRUVfVVRJTElUWV9KQVJfSU1QT1JUX0RNUF9JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydE9wZXJhdGlvbk5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnRPcGVyYXRpb25OZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5YTA4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydE9wZXJhdGlvbk5ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkoyRUVKYXZhQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVKYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydE9wZXJhdGlvbk5ldyBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSjJFRVV0aWxpdHlKYXJJbXBvcnRPcGVyYXRpb25OZXcoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KXsKLQkJcmV0dXJuIG5ldyBKMkVFSmF2YUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlKMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgc2F2ZVN0cmF0ID0gbmV3IEoyRUVKYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCh2aXJ0dWFsQ29tcG9uZW50KTsKLQkJcmV0dXJuIHNhdmVTdHJhdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQyZDMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUGF0aFZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHVibGljIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENSRUFURV9QUk9KRUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTElOS19JTVBPUlQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfTElOS0VEX1BST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT1BZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQklOQVJZX0lNUE9SVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVUSUxJVFlfSkFSX0xJU1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX1JPT1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChPVkVSUklERV9QUk9KRUNUX1JPT1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChPVkVSV1JJVEVfSUZfTkVDRVNTQVJZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTElOS0VEX1BBVEhfVkFSSUFCTEUpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCi0JCWJvb2xlYW4gbm90aWZ5ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQotCQlpZiAoQVZBSUxBQkxFX0pBUlNfRElSRUNUT1JZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlzZXRQcm9wZXJ0eShVVElMSVRZX0pBUl9MSVNULCBFTVBUWV9BUlJBWSk7Ci0JCX0gZWxzZSBpZiAoVVRJTElUWV9KQVJfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkKLQkJCQlzZXRQcm9wZXJ0eShVVElMSVRZX0pBUl9MSVNULCBFTVBUWV9BUlJBWSk7Ci0JCQllbHNlCi0JCQkJbW9kZWwuc2V0UHJvcGVydHkoVVRJTElUWV9KQVJfTElTVCwgcHJvcGVydHlWYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChQUk9KRUNUX1JPT1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwgfHwgKChTdHJpbmcpIHByb3BlcnR5VmFsdWUpLmxlbmd0aCgpID09IDApCi0JCQkJc2V0Qm9vbGVhblByb3BlcnR5KE9WRVJSSURFX1BST0pFQ1RfUk9PVCwgZmFsc2UpOwotCQkJZWxzZQotCQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShPVkVSUklERV9QUk9KRUNUX1JPT1QsIHRydWUpOwotCi0JCX0gZWxzZSBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX1BST0pFQ1QuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9QUk9KRUNUKSkgewotCi0JCQlzZXRCb29sZWFuUHJvcGVydHkoTElOS19JTVBPUlQsIGZhbHNlKTsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfTElOS0VEX1BST0pFQ1QsIGZhbHNlKTsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShDT1BZLCBmYWxzZSk7Ci0KLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEJJTkFSWV9JTVBPUlQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShPVkVSUklERV9QUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSU5LRURfUEFUSF9WQVJJQUJMRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQotCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkxJTktfSU1QT1JULmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5MSU5LX0lNUE9SVCkpIHsKLQotCQkJc2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9QUk9KRUNULCBmYWxzZSk7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0xJTktFRF9QUk9KRUNULCBmYWxzZSk7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoQ09QWSwgZmFsc2UpOwotCi0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShCSU5BUllfSU1QT1JULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoT1ZFUlJJREVfUFJPSkVDVF9ST09ULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9ST09ULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoTElOS0VEX1BBVEhfVkFSSUFCTEUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0KLQkJfSBlbHNlIGlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BST0pFQ1QuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9MSU5LRURfUFJPSkVDVCkpIHsKLQotCQkJc2V0Qm9vbGVhblByb3BlcnR5KExJTktfSU1QT1JULCBmYWxzZSk7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX1BST0pFQ1QsIGZhbHNlKTsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShDT1BZLCBmYWxzZSk7Ci0KLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEJJTkFSWV9JTVBPUlQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShPVkVSUklERV9QUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSU5LRURfUEFUSF9WQVJJQUJMRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQotCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNPUFkuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNPUFkpKSB7Ci0KLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfUFJPSkVDVCwgZmFsc2UpOwotCQkJc2V0Qm9vbGVhblByb3BlcnR5KExJTktfSU1QT1JULCBmYWxzZSk7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0xJTktFRF9QUk9KRUNULCBmYWxzZSk7Ci0KLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEJJTkFSWV9JTVBPUlQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShPVkVSUklERV9QUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSU5LRURfUEFUSF9WQVJJQUJMRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQotCi0JCX0gZWxzZSBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuT1ZFUlJJREVfUFJPSkVDVF9ST09ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0gZWxzZSBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0KLQkJCWlmIChpc0xpbmtlZFBhdGhWYXJpYWJsZUludmFsaWQoKSkKLQkJCQlzZXRQcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5MSU5LRURfUEFUSF9WQVJJQUJMRSwgIlRFQU1fU0hBUkVEX0RJUkVDVE9SWSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkxJTktFRF9QQVRIX1ZBUklBQkxFLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQVZBSUxBQkxFX0pBUlNfRElSRUNUT1JZLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCi0JCX0gZWxzZSBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuTElOS0VEX1BBVEhfVkFSSUFCTEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCS8vIHdpbGwgb25seSBzZXQgaWYgbmVjZXNzYXJ5Ci0JCQlzZXRQcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJCWlmIChsaW5rZWRQYXRoRXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgbGlua2VkUGF0aFZhcmlhYmxlID0gZ2V0U3RyaW5nUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuTElOS0VEX1BBVEhfVkFSSUFCTEUpOwotCQkJCUlQYXRoVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UGF0aFZhcmlhYmxlTWFuYWdlcigpOwotCQkJCUlQYXRoIGF2YWlsYWJsZUphcnNQYXRoID0gbWFuYWdlci5nZXRWYWx1ZShsaW5rZWRQYXRoVmFyaWFibGUpOwotCQkJCXNldFByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9MSU5LRURfUEFUSF9WQVJJQUJMRSwgQm9vbGVhbi52YWx1ZU9mKGF2YWlsYWJsZUphcnNQYXRoICE9IG51bGwpKTsKLQotCQkJCVN0cmluZyBhdmFpbGFibGVKYXJzUGF0aFN0cmluZyA9IGF2YWlsYWJsZUphcnNQYXRoLnRvT1NTdHJpbmcoKTsKLQkJCQlpZiAoYXZhaWxhYmxlSmFyc1BhdGhTdHJpbmcgIT0gbnVsbCAmJiBhdmFpbGFibGVKYXJzUGF0aFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQkJCXNldFByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkFWQUlMQUJMRV9KQVJTX0RJUkVDVE9SWSwgYXZhaWxhYmxlSmFyc1BhdGhTdHJpbmcpOwotCQkJfQotCi0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShBVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlksIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJcmV0dXJuIG5vdGlmeTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjYmFzaWNJc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5CSU5BUllfSU1QT1JULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9QUk9KRUNUKSB8fCBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0xJTktFRF9QUk9KRUNUKTsKLQkJfSBlbHNlIGlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5PVkVSUklERV9QUk9KRUNUX1JPT1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX1BST0pFQ1QpIHx8IGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BST0pFQ1QpOwotCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLlBST0pFQ1RfUk9PVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX1BST0pFQ1QpIHx8IGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BST0pFQ1QpKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuT1ZFUlJJREVfUFJPSkVDVF9ST09UKTsKLQkJfSBlbHNlIGlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAoZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkxJTktfSU1QT1JUKSB8fCBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0xJTktFRF9QUk9KRUNUKSk7Ci0JCX0gZWxzZSBpZiAoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuTElOS0VEX1BBVEhfVkFSSUFCTEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFKTsKLQkJfSBlbHNlIGlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5BVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWJvb2xlYW4gY3JlYXRlUGF0aCA9IGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUpOwotCQkJcmV0dXJuICFjcmVhdGVQYXRoIHx8ICFsaW5rZWRQYXRoRXhpc3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpbmtlZFBhdGhFeGlzdHMoKSB7Ci0JCVN0cmluZyBsaW5rZWRQYXRoVmFyaWFibGUgPSBnZXRTdHJpbmdQcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5MSU5LRURfUEFUSF9WQVJJQUJMRSk7Ci0JCWlmIChsaW5rZWRQYXRoVmFyaWFibGUgPT0gbnVsbCB8fCBsaW5rZWRQYXRoVmFyaWFibGUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVBhdGhWYXJpYWJsZU1hbmFnZXIgbWFuYWdlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRQYXRoVmFyaWFibGVNYW5hZ2VyKCk7Ci0JCUlQYXRoIGF2YWlsYWJsZUphcnNQYXRoID0gbWFuYWdlci5nZXRWYWx1ZShsaW5rZWRQYXRoVmFyaWFibGUpOwotCQlyZXR1cm4gYXZhaWxhYmxlSmFyc1BhdGggIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rZWRQYXRoVmFyaWFibGVJbnZhbGlkKCkgewotCQlib29sZWFuIGNyZWF0ZVBhdGggPSBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFKTsKLQkJU3RyaW5nIGxpbmtlZFBhdGhWYXJpYWJsZSA9IGdldFN0cmluZ1Byb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkxJTktFRF9QQVRIX1ZBUklBQkxFKTsKLQkJcmV0dXJuIChjcmVhdGVQYXRoICYmIChsaW5rZWRQYXRoVmFyaWFibGUgPT0gbnVsbCB8fCBsaW5rZWRQYXRoVmFyaWFibGUudHJpbSgpLmxlbmd0aCgpID09IDApKTsKLQl9Ci0JCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsgCi0JCXJldHVybiBuZXcgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLm9wZXJhdGlvbnMuSjJFRUltcG9ydERhdGFNb2RlbCNnZXREZWZhdWx0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChDUkVBVEVfUFJPSkVDVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCWVsc2UgaWYgKExJTktfSU1QT1JULmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWVsc2UgaWYgKENPUFkuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJZWxzZSBpZiAoQ1JFQVRFX0xJTktFRF9QUk9KRUNULmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWVsc2UgaWYgKENSRUFURV9MSU5LRURfUEFUSF9WQVJJQUJMRS5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQllbHNlIGlmIChPVkVSUklERV9QUk9KRUNUX1JPT1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJZWxzZSBpZiAoQklOQVJZX0lNUE9SVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQllbHNlIGlmIChQUk9KRUNUX1JPT1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRSYXdMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJZWxzZSBpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChBVkFJTEFCTEVfSkFSU19ESVJFQ1RPUlkuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoTElOS0VEX1BBVEhfVkFSSUFCTEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoVVRJTElUWV9KQVJfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJCXJldHVybiBFTVBUWV9BUlJBWTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9ycyhnZXRWYWxpZFByb2plY3ROYW1lcygpKTsKLQkJfSBlbHNlIGlmIChMSU5LRURfUEFUSF9WQVJJQUJMRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSVBhdGhWYXJpYWJsZU1hbmFnZXIgbWFuYWdlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRQYXRoVmFyaWFibGVNYW5hZ2VyKCk7Ci0JCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKG1hbmFnZXIuZ2V0UGF0aFZhcmlhYmxlTmFtZXMoKSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlIHRoZSByZXNvdXJjZSBuYW1lIGNvbWJvIHdpdGggY29ubmVjdG9yIHByb2plY3RzIHRoYXQgYXJlIG5vdCBlbmNyeXB0ZWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFZhbGlkUHJvamVjdE5hbWVzKCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlMaXN0IHByb2plY3RzV2l0aE5hdHVyZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgeyAKLQkJCWlmKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdHNbaV0pOwotCQkJCWlmIChmYWNldGVkUHJvamVjdCE9bnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpKSB7Ci0JCQkJCXByb2plY3RzV2l0aE5hdHVyZS5hZGQocHJvamVjdHNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0gCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0TmFtZXNXaXRob3V0Rm9yd2FyZFNsYXNoKChTdHJpbmdbXSkgcHJvamVjdHNXaXRoTmF0dXJlLnRvQXJyYXkobmV3IFN0cmluZ1twcm9qZWN0c1dpdGhOYXR1cmUuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgLyogJiYgaXNTZXQoRUFSX1BST0pFQ1RfTkFNRSkgKi8pIHsKLQkJCVN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpOwotCQkJaWYgKGVhclByb2plY3ROYW1lICE9IG51bGwgJiYgZWFyUHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKCFlYXJQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X1ZhbGlkX1Byb2plY3QsIG51bGwpOyAKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X1ZhbGlkX1Byb2plY3QsIGUpOyAKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsX1NwZWNpZnlfVmFsaWRfUHJvamVjdCwgbnVsbCk7IAotCi0JCX0gZWxzZSBpZiAoVVRJTElUWV9KQVJfTElTVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0KLQkJCU9iamVjdFtdIGxpc3QgPSAoT2JqZWN0W10pIGdldFByb3BlcnR5KFVUSUxJVFlfSkFSX0xJU1QpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0Lmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxfU2VsZWN0X0phciwgbnVsbCk7IAotCi0JCQkvKiByZXR1cm4gdmFsaWRhdGVFeGlzdGluZ1Byb2plY3RzKCk7ICovCi0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGVsc2UgaWYgKExJTktFRF9QQVRIX1ZBUklBQkxFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAoaXNMaW5rZWRQYXRoVmFyaWFibGVJbnZhbGlkKCkpCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X0xpbmtlZF9QYXRoLCBudWxsKTsKLQkJCWVsc2UgaWYgKGxpbmtlZFBhdGhFeGlzdHMoKSkgCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsX0xpbmtlZF9QYXRoX0V4aXN0cywgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoUFJPSkVDVF9ST09ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0Um9vdCgpOwotCQl9IAotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0Um9vdCgpIHsKLQkJaWYgKGlzUHJvcGVydHlTZXQoUFJPSkVDVF9ST09UKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoT1ZFUlJJREVfUFJPSkVDVF9ST09UKSkgewotCQkJU3RyaW5nIGxvYyA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfUk9PVCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2MpOwotCQkJaWYgKCFmaWxlLmNhbldyaXRlKCkgfHwgIWZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsXzAsIG51bGwpOyAKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCS8vIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0aW5nUHJvamVjdHMoKSB7Ci0JLy8gYm9vbGVhbiBjcmVhdGVQcm9qZWN0ID0gKGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX1BST0pFQ1QpCi0JLy8gfHwgZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5DUkVBVEVfTElOS0VEX1BST0pFQ1QpKTsKLQkvLyBib29sZWFuIG92ZXJ3cml0ZSA9Ci0JLy8gZ2V0Qm9vbGVhblByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZKTsKLQkvLyBpZiAoY3JlYXRlUHJvamVjdCAmJiAhb3ZlcndyaXRlKSB7Ci0JLy8gRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkvLyBTdHJpbmcgbmFtZVdpdGhvdXRKYXIgPSBudWxsOwotCS8vIE9iamVjdFtdIHNlbGVjdGVkSmFycyA9IChPYmplY3RbXSkgZ2V0UHJvcGVydHkoVVRJTElUWV9KQVJfTElTVCk7Ci0JLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEphcnMubGVuZ3RoOyBpKyspIHsKLQkvLyBqYXJGaWxlID0gKEZpbGUpIHNlbGVjdGVkSmFyc1tpXTsKLQkvLyBpbnQgc3RhcnQgPSBqYXJGaWxlLmdldE5hbWUoKS5pbmRleE9mKCIuamFyIik7Ci0JLy8gbmFtZVdpdGhvdXRKYXIgPSBqYXJGaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgc3RhcnQpOwotCS8vIGlmIChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobmFtZVdpdGhvdXRKYXIpLmV4aXN0cygpKQotCS8vIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCAiRXhpc3RpbmcgcHJvamVjdHMgd2l0aCB0aGUgZGVyaXZlZAotCS8vIG5hbWVzIGFscmVhZHkgZXhpc3QgKFwiezB9XCIpLiIsIG51bGwpOyAvLyB7MH0KLQkvLyAvLyBuYW1lV2l0aG91dEphcgotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkvLyB9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzAyMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElVbmRvYWJsZU9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTSVNUQU5UX1RJQ0tTID0gNTsKLQotCXB1YmxpYyBKMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgeyAKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJX0ltcG9ydF9VdGlsaXR5X0phcnMsIG51bGwpOyAgCi0JCQkKLQkJT2JqZWN0W10gdXRpbGl0eUphcnMgPSAoT2JqZWN0W10pIG1vZGVsLmdldFByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QpOwotCQlpZiAodXRpbGl0eUphcnMgPT0gbnVsbCB8fCB1dGlsaXR5SmFycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9UaGVyZV93ZXJlX25vX3V0aWxpdHlfamFyc19zZWxlY3RlZCwgbnVsbCk7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJX0ltcG9ydF9VdGlsaXR5X0phcnMsIHV0aWxpdHlKYXJzLmxlbmd0aCAqICgxICsgQVNTSVNUQU5UX1RJQ0tTKSk7IC8vJE5PTi1OTFMtMSQKLQotLy8JCVN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpOwotLy8JCWJvb2xlYW4gaXNCaW5hcnkgPSBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQklOQVJZX0lNUE9SVCk7Ci0JCQotCQkvLyBpZiBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09QWSkgdGhlbgotCQkvLyBpc0xpbmtlZCA9IGNyZWF0ZVByb2plY3QgPSBmYWxzZTsKLQkJYm9vbGVhbiB0b0xpbmtJbXBvcnRlZEphcnMgPSBzaG91bGRMaW5rSW1wb3J0ZWRKYXJzKCk7Ci0JCWJvb2xlYW4gdG9DcmVhdGVQcm9qZWN0ID0gc2hvdWxkQ3JlYXRlUHJvamVjdCgpOwotCQlib29sZWFuIHRvT3ZlcnJpZGVQcm9qZWN0Um9vdCA9IHNob3VsZE92ZXJyaWRlUHJvamVjdFJvb3QoKTsgIAotCQlib29sZWFuIHRvT3ZlcndyaXRlSWZOZWNlc3NhcnkgPSBzaG91bGRPdmVyd3JpdGVJZk5lY2Vzc2FyeSgpOwotCQkKLQkJCi0JCVN0cmluZyBwcm9qZWN0Um9vdCA9IG51bGw7CQkKLQkJaWYodG9PdmVycmlkZVByb2plY3RSb290KQotCQkJcHJvamVjdFJvb3QgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX1JPT1QpOwotCQkKLQkJbW9uaXRvci5zdWJUYXNrKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV9QcmVwYXJpbmdfdG9faW1wb3J0KTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBhc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsJCQotCQkKLQkJSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24gYXNzaXN0YW50T3BlcmF0aW9uID0gbnVsbDsKLQkJTGlzdCB1dGlsaXR5SmFyT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSB1dGlsaXR5SmFyID0gbnVsbDsKLQkJU3RyaW5nIGxpbmtlZFBhdGhWYXJpYWJsZSA9IG51bGw7IAotCQlpZihtb2RlbC5pc1Byb3BlcnR5U2V0KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktFRF9QQVRIX1ZBUklBQkxFKSkKLQkJCWxpbmtlZFBhdGhWYXJpYWJsZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktFRF9QQVRIX1ZBUklBQkxFKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1dGlsaXR5SmFycy5sZW5ndGggJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpOyBpKyspIHsKLQkJCXV0aWxpdHlKYXIgPSAoRmlsZSkgdXRpbGl0eUphcnNbaV07Ci0JCQlpZiAodG9DcmVhdGVQcm9qZWN0KSB7IAotCQkJCWlmICghdG9MaW5rSW1wb3J0ZWRKYXJzKSB7Ci0JCQkJCWFzc2lzdGFudE9wZXJhdGlvbiA9IG5ldyBDcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbih1dGlsaXR5SmFyLCBwcm9qZWN0Um9vdCk7IAotCQkJCSAKLQkJCQl9IGVsc2UgewotCQkJCQlhc3Npc3RhbnRPcGVyYXRpb24gPSBuZXcgQ3JlYXRlUHJvamVjdFdpdGhMaW5rZWRKYXJPcGVyYXRpb24odXRpbGl0eUphciwgcHJvamVjdFJvb3QsIGxpbmtlZFBhdGhWYXJpYWJsZSk7Ci0JCQkJCQotCQkJCX0gCi0JCQl9IGVsc2UgeyAKLQkJCQlpZiAoIXRvTGlua0ltcG9ydGVkSmFycykgewotCQkJCQlhc3Npc3RhbnRPcGVyYXRpb24gPSBuZXcgQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbih1dGlsaXR5SmFyKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXNzaXN0YW50T3BlcmF0aW9uID0gbmV3IExpbmtBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24odXRpbGl0eUphciwgbGlua2VkUGF0aFZhcmlhYmxlKTsKLQkJCX0gCi0JCQlhc3Npc3RhbnRPcGVyYXRpb24uc2V0QXNzb2NpYXRlZEVBUlByb2plY3ROYW1lKGFzc29jaWF0ZWRFQVJQcm9qZWN0TmFtZSk7IAotCQkJYXNzaXN0YW50T3BlcmF0aW9uLnNldE92ZXJ3cml0ZUlmTmVjZXNzYXJ5KHRvT3ZlcndyaXRlSWZOZWNlc3NhcnkpOwotCQkJdXRpbGl0eUphck9wZXJhdGlvbnMuYWRkKGFzc2lzdGFudE9wZXJhdGlvbik7Ci0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1dGlsaXR5SmFyT3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQl0cnkgewotCQkJCWFzc2lzdGFudE9wZXJhdGlvbiA9IChKMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBzdWJtb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBBU1NJU1RBTlRfVElDS1MpOwotCQkJCWFzc2lzdGFudE9wZXJhdGlvbi5leGVjdXRlKHN1Ym1vbml0b3IsIG51bGwpOwotCQkJCXN1Ym1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0gCi0JCX0gCi0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotIAotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRPdmVyd3JpdGVJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRJbXBvcnRBc0JpbmFyeSgpIHsKLQkJcmV0dXJuIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5CSU5BUllfSU1QT1JUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRPdmVycmlkZVByb2plY3RSb290KCkgewotCQlyZXR1cm4gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJSSURFX1BST0pFQ1RfUk9PVCk7Ci0JfQotIAotCXByb3RlY3RlZCBmaW5hbCAgYm9vbGVhbiBzaG91bGRDcmVhdGVQcm9qZWN0KCkgewotCQlyZXR1cm4gKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfUFJPSkVDVCkgfHwgbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9MSU5LRURfUFJPSkVDVCkpOwotCX0KLSAKLQlwcm90ZWN0ZWQgZmluYWwgIGJvb2xlYW4gc2hvdWxkTGlua0ltcG9ydGVkSmFycygpIHsKLQkJcmV0dXJuIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTElOS19JTVBPUlQpIHx8IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BST0pFQ1QpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0KLSAKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2JhOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTGlua0FyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIExpbmtBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24gZXh0ZW5kcyBKMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbiB7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGxpbmtlZFBhdGhWYXJpYWJsZTsKLQotCXB1YmxpYyBMaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uKEZpbGUgdXRpbGl0eUphciwgU3RyaW5nIGxpbmtlZFBhdGhWYXJpYWJsZSkgewotCQlzdXBlcihOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uX0xpbmtpbmdfYXJjaGl2ZV9pbnRvX3NlbGVjdGVkX3Byb2plXywgdXRpbGl0eUphci5nZXROYW1lKCkpLCB1dGlsaXR5SmFyKTsKLQkJdGhpcy5saW5rZWRQYXRoVmFyaWFibGUgPSBsaW5rZWRQYXRoVmFyaWFibGU7Ci0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uX0xpbmtpbmdfYXJjaGl2ZV9pbnRvX3NlbGVjdGVkX3Byb2plXywgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG51bGwpOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7Ci0KLQkJdHJ5IHsKLQkJCUlGaWxlIGxpbmtlZEphckZpbGUgPSBwcm9qZWN0LmdldEZpbGUoZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSk7Ci0JCQlpZiAobGlua2VkSmFyRmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChpc092ZXJ3cml0ZUlmTmVjZXNzYXJ5KCkpCi0JCQkJCWxpbmtlZEphckZpbGUuZGVsZXRlKHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCWVsc2UgewotCQkJCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuQ3JlYXRlUHJvamVjdFdpdGhMaW5rZWRKYXJPcGVyYXRpb25fRmlsZV9hbHJlYWR5X2V4aXN0c18wXywgbGlua2VkSmFyRmlsZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCkpOwotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJCXN0YXR1cy5hZGQoY3JlYXRlTGlua2VkQXJjaGl2ZShwcm9qZWN0LCBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpLCBnZXRVdGlsaXR5SmFyKCksIGxpbmtlZFBhdGhWYXJpYWJsZSwgbW9uaXRvcikpOwotCi0JCQlhZGRMaWJyYXJ5VG9DbGFzc3BhdGgocHJvamVjdCwgbGlua2VkSmFyRmlsZSwgbW9uaXRvcik7Ci0JCQkKLQkJCWNyZWF0ZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KHByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIGxpbmtlZEphckZpbGUsIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2YzEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJjOTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbiBleHRlbmRzIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKLQkJCXVwZGF0ZUVBUkREKG1vbml0b3IpOwotCQkJc3VwZXIuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCX0gZmluYWxseSB7Ci0JCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnJlc3VtZVVwZGF0ZXMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVBUkREKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCWlmICghY29tcC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVFQVIoY29tcC5nZXRQcm9qZWN0KCkpOwotCQlmaW5hbCBJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGNvbXAuZ2V0UHJvamVjdCgpKTsKLQkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJQ29tbW9uQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoSUNvbW1vbkFwcGxpY2F0aW9uKWVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJaWYgKGFwcGxpY2F0aW9uID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCB3YyA9IChJVmlydHVhbENvbXBvbmVudCkgbGlzdC5nZXQoaSk7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSB3Yy5nZXRDb21wb25lbnQoKTsKLQkJCQkJCWlmKCFtb2R1bGVDb21wb25lbnQuaXNCaW5hcnkoKSl7Ci0JCQkJCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZU1vZHVsZShtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBtb2R1bGVVUkkgPSBnZXRNb2R1bGVVUkkoZWFyTW9kZWwsIHdjKTsKLQkJCQkJCXJlbW92ZU1vZHVsZShhcHBsaWNhdGlvbiwgbW9kdWxlVVJJKTsgCi0JCQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG1vZHVsZVVSSSk7Ci0JCQkJCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJCQlpZihpRmlsZS5leGlzdHMoKSl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaUZpbGUuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQotCQkJfQotCQl9LCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVVUkkoZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kdWxlLCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQpIHsKLQkJcmV0dXJuIGVhck1vZHVsZS5nZXRNb2R1bGVVUkkodGFyZ2V0Q29tcG9uZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2R1bGUoSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBTdHJpbmcgbW9kdWxlVVJJKSB7Ci0JCUlDb21tb25Nb2R1bGUgbW9kdWxlID0gYXBwbGljYXRpb24uZ2V0Rmlyc3RFQVJNb2R1bGUobW9kdWxlVVJJKTsKLQkJYXBwbGljYXRpb24uZ2V0RUFSTW9kdWxlcygpLnJlbW92ZShtb2R1bGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1NzNjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JLyoqCi0JICogUHJvamVjdCBuYW1lIHdpdGggbWFuaWZlc3QgdG8gdXBkYXRlLCB0eXBlIFN0cmluZyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogamF2YS51dGlsLkxpc3Qgb2YgU3RyaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9MSVNUID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLkNMQVNTUEFUSF9MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nLiBUaGlzIGlzIGJ1aWxkIGZyb20gdGhlIEpBUl9MSVNUIHByb3BlcnR5LiBOZXZlciBzZXQgdGhpcyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfTElTVF9URVhUX1VJID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLkNMQVNTUEFUSF9MSVNUX1RFWFRfVUkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCb29sZWFuLCB0cnVlIG1lcmdlcywgZmFsc2UgcmVwbGFjZXMsIGRlZmF1bHQgaXMgdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLk1FUkdFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nLCBubyBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fQ0xBU1MgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuTUFJTl9DTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCi0JLyoqCi0JICogU3RyaW5nLCBubyBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZJTEUgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuTUFOSUZFU1RfRklMRSI7IC8vJE5PTi1OTFMtMSQJCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWUwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKQVJfTElTVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpBUl9MSVNUX1RFWFRfVUkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChNRVJHRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1BSU5fQ0xBU1MpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChNQU5JRkVTVF9GSUxFKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNRVJHRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVJfTElTVCkpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVJfTElTVF9URVhUX1VJKSkgewotCQkJcmV0dXJuIGdldENsYXNzcGF0aEFzU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gc2V0ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFSX0xJU1QpICYmIGlzUHJvcGVydHlTZXQoSkFSX0xJU1RfVEVYVF9VSSkpCi0JCQlzZXRQcm9wZXJ0eShKQVJfTElTVF9URVhUX1VJLCBnZXRDbGFzc3BhdGhBc1N0cmluZygpKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhBc1N0cmluZygpIHsKLQkJTGlzdCBjbGFzc3BhdGhMaXN0ID0gKExpc3QpIGdldFByb3BlcnR5KEpBUl9MSVNUKTsKLQkJcmV0dXJuIGNvbnZlcnRDbGFzc3BhdGhMaXN0VG9TdHJpbmcoY2xhc3NwYXRoTGlzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENsYXNzcGF0aExpc3RUb1N0cmluZyhMaXN0IGxpc3QpIHsKLQkJU3RyaW5nIGNsYXNzcGF0aFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJY2xhc3NwYXRoU3RyaW5nICs9ICgoU3RyaW5nKSBsaXN0LmdldChpKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoU3RyaW5nLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29udmVydENsYXNzcGF0aFN0cmluZ1RvTGlzdChTdHJpbmcgc3RyaW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxZmYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHVibGljIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSltb2RlbC5nZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSk7Ci0JCQotCQlTdHJpbmcgY2xhc3NQYXRoVmFsdWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuSkFSX0xJU1RfVEVYVF9VSSk7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5yZWFkTWFuaWZlc3QoZmlsZSk7Ci0JCQkKLQkJCWlmIChtZiA9PSBudWxsKQotCQkJCW1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJCW1mLmFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpOwotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUVSR0UpKSB7Ci0JCQkJbWYubWVyZ2VDbGFzc1BhdGgoQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aFZhbHVlKSk7Ci0JCQl9IGVsc2UgewotCQkJCW1mLnNldENsYXNzUGF0aChjbGFzc1BhdGhWYWx1ZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwuaXNQcm9wZXJ0eVNldChVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9DTEFTUykpIHsKLQkJCQltZi5zZXRNYWluQ2xhc3MobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fQ0xBU1MpKTsKLQkJCX0KLQotCQkJSjJFRVByb2plY3RVdGlsaXRpZXMud3JpdGVNYW5pZmVzdChmaWxlLCBtZik7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLGV4KTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNb2R1bGVDb250ZXh0Um9vdEluRUFST3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE2YjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogPGNvZGU+QWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb248L2NvZGU+IHN1YmNsYXNzIHRoYXQgdXBkYXRlcyB0aGUgY29udGV4dC1yb290IGZvciBhIGdpdmVuCi0gKiBtb2R1bGUgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi54bWwgZmlsZXMgb2YgYWxsIGNvbnRhaW5pbmcgRUFScy4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGltcGxlbWVudHMgSVVwZGF0ZU1vZHVsZUNvbnRleHRSb290UHJvcGVydGllcyB7Ci0JCi0JcHVibGljIFVwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZihtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCWZpbmFsIFN0cmluZyBuZXdDb250ZXh0Um9vdCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTlRFWFRfUk9PVCk7Ci0gICAgICAgIAlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLSAgICAgICAgCWZpbmFsIElEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSUQpOwotICAgICAgICAJaWYgKG5lc3RlZE1vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlMaXN0IGVhcnNUb1VwZGF0ZT0gKExpc3QpIG5lc3RlZE1vZGVsLmdldFByb3BlcnR5KEVBUlNfVE9fVVBEQVRFKTsKLSAgICAgICAgICAgIAlpZiAobmV3Q29udGV4dFJvb3QgIT0gbnVsbCAmJiBlYXJzVG9VcGRhdGUgIT0gbnVsbCAmJiBwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkJLy8gdXBkYXRlIGVhY2ggc3BlY2lmaWVkIEVBUgotICAgICAgICAgICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnNUb1VwZGF0ZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgCQkJdXBkYXRlRUFSQ29udGV4dFJvb3QoKElQcm9qZWN0KSBlYXJzVG9VcGRhdGUuZ2V0KGkpLCBwcm9qZWN0LCBuZXdDb250ZXh0Um9vdCwgbW9uaXRvcik7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBpbnQgdGhlIGFwcGxpY2F0aW9uLnhtbCBvZiB0aGUgc3BlY2lmaWVkIEVBUiBmb3IgdGhlIHNwZWNpZmllZAotCSAqIG1vZHVsZSBwcm9qZWN0IHRvIHRoZSBuZXcgdmFsdWUuIAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVFQVJDb250ZXh0Um9vdChmaW5hbCBJUHJvamVjdCBlYXIsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyBuZXdDb250ZXh0Um9vdCwKLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvcldyaXRlKGVhcik7Ci0JCQlpZiAoZWFyRWRpdCAhPSBudWxsKSB7Ci0JCQkJZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBlYXJFZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCWlmIChjb21wID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmaW5hbCBTdHJpbmcgbW9kdWxlVVJJID0gZWFyRWRpdC5nZXRNb2R1bGVVUkkoY29tcCk7Ci0JCQkJZmluYWwgTW9kdWxlIG1vZHVsZSA9IGFwcGxpY2F0aW9uLmdldEZpcnN0TW9kdWxlKG1vZHVsZVVSSSk7Ci0JCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIFdlYk1vZHVsZSkgewotCQkJCQkoKFdlYk1vZHVsZSkgbW9kdWxlKS5zZXRDb250ZXh0Um9vdChuZXdDb250ZXh0Um9vdCk7Ci0JCQkJfQotCQkJCWVhckVkaXQuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkgewotCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gbm8tb3AKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gbm8tb3AKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUkFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9FQVJBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3YzA2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUkFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogPHA+Ci0gKiBFQVJBcnRpZmFjdEVkaXQgb2J0YWlucyBhbiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbn0mbmJzcDttZXRhbW9kZWwuCi0gKiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZSBtZXRhbW9kZWwKLSAqIGlzIHJldHJpZXZlZCBmcm9tIHRoZSB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7dXNpbmcgYQotICogY2FjaGVkIGNvbnN0YW50IChAc2VlCi0gKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHMjQVBQTElDQVRJT05fRERfVVJJKS4gVGhlCi0gKiBkZWZpbmVkIG1ldGhvZHMgZXh0cmFjdCBkYXRhIG9yIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICovCi0KLXB1YmxpYyBjbGFzcyBFQVJBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGltcGxlbWVudHMgSUFydGlmYWN0RWRpdEZhY3RvcnksIElFQVJNb2RlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVhckREIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gRUFSQXJ0aWZhY3RFZGl0LmNsYXNzOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gTk9fUkVGRVJFTkNFUyA9IG5ldyBJVmlydHVhbFJlZmVyZW5jZVswXTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFQVJBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRUFSQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQotCS8vIFRoaXMgc2hvdWxkIGJlIHJldmVydGVkIHRvIHByb3RlY3RlZCB3aGVuIDExNTkyNCBpcyBmaXhlZAotCXB1YmxpYyBFQVJBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5LCBib29sZWFuIGZvckNyZWF0ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHksIGZvckNyZWF0ZSwgSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFSQXJ0aWZhY3RFZGl0IGdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZEVBUk1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCkpKQotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBFQVJBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJBcnRpZmFjdEVkaXQgZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZEVBUk1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCkpKQotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBFQVJBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEVBUkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gRUFSQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEVBUkFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUkFydGlmYWN0RWRpdCBnZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gRUFSQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBFQVJBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFSQXJ0aWZhY3RFZGl0IGdldEVBUkFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiAgICAgICAgICAgIEEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKFdvcmtiZW5jaENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMKLQkgKiAgICAgICAgIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRUFSTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0JcHVibGljIEVBUkFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20gdGhlIGdpdmVuCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCi0KLQlwcm90ZWN0ZWQgRUFSQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gQXBwbGljYXRpb25SZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBBcHBsaWNhdGlvblJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlIGdldEFwcGxpY2F0aW9uWG1pUmVzb3VyY2UoKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlyZXR1cm4gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBBcHBsaWNhdGlvbiB7QHNlZSBBcHBsaWNhdGlvbn1yb290IG9iamVjdCBmcm9tIHRoZSB7QHNlZSBBcHBsaWNhdGlvblJlc291cmNlfSwKLQkgKiB0aGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBcHBsaWNhdGlvbgotCSAqIAotCSAqLwotCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSByZXNvdXJjZSBmcm9tIHRoZSB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqIAotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSV9PQkopOwotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoQXBwbGljYXRpb24pIGFuZCBwb3B1bGF0ZXMgd2l0aCBkYXRhLiBBZGRzIHRoZQotCSAqIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9Ci0JICogQHBhcmFtIHZlcnNpb24KLQkgKiAgICAgICAgICAgIFZlcnNpb24gdG8gYmUgc2V0IG9uIHJlc291cmNlLi4uLmlmIG51bGwgZGVmYXVsdCBpcyB0YWtlbgotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGZvciBKVU5JVCAtIG1vdmU/Ci0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFwcGxpY2F0aW9uSWZOZWNlc3NhcnkoWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCUFwcGxpY2F0aW9uIG5ld0FwcCA9IEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobmV3QXBwKTsKLQkJCX0KLQkJCUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKEFwcGxpY2F0aW9uKSBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlVUkkgbW9kdWxlVVJJID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJYXBwbGljYXRpb24uc2V0RGlzcGxheU5hbWUoU3RydWN0dXJlRWRpdC5nZXREZXBsb3llZE5hbWUobW9kdWxlVVJJKSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJCWFSZXNvdXJjZS5zZXRJRChhcHBsaWNhdGlvbiwgSjJFRUNvbnN0YW50cy5BUFBMX0lEKTsKLQkJCS8vIFRPRE8gYWRkIG1vcmUgbWFuZGF0b3J5IGVsZW1lbnRzCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHVyaSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGN1cnJlbnRVUkkgLSBUaGUgY3VycmVudCB1cmkgb2YgdGhlIG1vZHVsZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cmlFeGlzdHMoU3RyaW5nIGN1cnJlbnRVUkkpIHsKLQkJU3RydWN0dXJlRWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoZWRpdCE9bnVsbCAmJiBlZGl0LmdldENvbXBvbmVudCgpIT1udWxsKSB7Ci0JCQkJTGlzdCByZWZlcmVuY2VkQ29tcHMgPSBlZGl0LmdldENvbXBvbmVudCgpLmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHJlZmVyZW5jZWRDb21wcy5zaXplKCk7IGkrKykgewotCQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZiA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcHMuZ2V0KGkpOwotCQkJCQlPYmplY3QgbW9kdWxlID0gcmVmLmdldERlcGVuZGVudE9iamVjdCgpOwotCQkJCQlpZiAobW9kdWxlIT1udWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIE1vZHVsZSkgewotCQkJCQkJU3RyaW5nIGV4aXN0aW5nVVJJID0gKChNb2R1bGUpbW9kdWxlKS5nZXRVcmkoKTsKLQkJCQkJCWlmIChleGlzdGluZ1VSSSE9bnVsbCAmJiBleGlzdGluZ1VSSS5lcXVhbHMoY3VycmVudFVSSSkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChqYXZhLmxhbmcuSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCUFwcGxpY2F0aW9uUmVzb3VyY2UgcmVzID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJcmVzLnNldE1vZHVsZVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJYWRkQXBwbGljYXRpb25JZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gKChBcHBsaWNhdGlvblJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGFsbCBvZiB0aGUgdXRpbGl0eSBtb2R1bGVzCi0JICogY29udGFpbmVkIGluIHRoZSBFQVIgYXBwbGljYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIC0gYW4gYXJyYXkgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciB1dGlsaXR5IG1vZHVsZXMgaW4gdGhlIEVBUgotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKCkgeyAgCi0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlMaXN0IGV4cGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMgPSAKLQkJCWdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFkpKTsKLQkJCi0JCS8vIGZldGNoIG90aGVyIFV0aWxpdHkgSmFycyBhdHRhY2hlZCB0byB0aGUgRUFSIHByb2plY3QgCi0JCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMgPQotCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwgCi0JCQkJCQkJCQkJICAgSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSwgIAotCQkJCQkJCQkJCSAgIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUgfSk7IAotCi0JCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcyA9IAotCQkJZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyk7Ci0JCQotCQkKLQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBnZXRBcHBsaWNhdGlvbigpOwotCQlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciByZWZlcmVuY2VJdHIgPSBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IHJlZmVyZW5jZUl0ci5oYXNOZXh0KCk7ICkgewotCQkJcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSByZWZlcmVuY2VJdHIubmV4dCgpOwotCQkJbW9kdWxlID0gYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpOwotCQkJaWYobW9kdWxlICE9IG51bGwpIAotCQkJCXJlZmVyZW5jZUl0ci5yZW1vdmUoKTsgCi0JCX0KLQkJCi0JCUxpc3QgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLmFkZEFsbChleHBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzKTsKLQkJYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuYWRkQWxsKGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMpOwotCQkKLQkJaWYoYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiBOT19SRUZFUkVOQ0VTOwotCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZVVSSShJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIHJlZnMgPSBnZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHJlZnMubGVuZ3RoOyBpKyspewotCQkJaWYocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKG1vZHVsZUNvbXApKXsKLQkJCQlyZXR1cm4gcmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCi0vLwlwcml2YXRlIFN0cmluZyBnZXRKYXJVUkkoZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWYsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXApIHsKLS8vCQlTdHJpbmcgdXJpID0gIHJlZi5nZXRBcmNoaXZlTmFtZSgpOwotLy8JCWlmKCB1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPCAwICl7Ci0vLwkJCXVyaSA9IG1vZHVsZUNvbXAuZ2V0TmFtZSgpK0lKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7Ci0vLwkJfWVsc2V7Ci0vLwkJCVN0cmluZyBwcmVmaXggPSByZWYuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotLy8JCQlpZihwcmVmaXgubGVuZ3RoKCkgPiAwKXsKLS8vCQkJCXVyaSA9IHByZWZpeCArICIvIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiB1cmk7Ci0vLwl9Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldE1vZHVsZUJ5TWFuaWZlc3RVUkkoZmluYWwgU3RyaW5nIHVyaSkgewotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlJVmlydHVhbFJlZmVyZW5jZSBbXSByZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQotCQlmb3IoaW50IGk9MDtpPHJlZnMubGVuZ3RoOyBpKyspewotCQkJaWYocmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyh1cmkpKXsKLQkJCQlyZXR1cm4gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGFuIElWaXJ0dWFsQ29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUuIFRoZSBtZXRob2QgdGFrZQotCSAqIGVpdGhlciBtb2R1bGVOYW1lIG9yIG1vZHVsZU5hbWUgKyAiLm1vZHVsZV9leHRlbnNpb24iIChtb2R1bGVfZXh0ZW5zaW9uID0gIi5qYXIiIHx8ICIud2FyIiB8fAotCSAqICIucmFyIikgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGdldCBhIElWaXJ0dWFsQ29tcG9uZW50IGZvciBhIGdpdmVuIGVudHJ5IGluIGFuIGFwcGxpY2F0aW9uLnhtbAotCSAqIAotCSAqIEByZXR1cm4gLSBhIElWaXJ0dWFsQ29tcG9uZW50IGZvciBtb2R1bGUgbmFtZQotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBTdHJpbmcgbW9kdWxlTmFtZSl9Ci0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgewotCQlpZiAobW9kdWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChtb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpIHx8IG1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkgfHwgbW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUKSkKLQkJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lLnN1YnN0cmluZygwLCAobW9kdWxlTmFtZS5sZW5ndGgoKSAtIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQubGVuZ3RoKCkpKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKG1vZHVsZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbXBvbmVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIHRoZSBKMkVFIG1vZHVsZSBjb21wb25lbnRzCi0JICogY29udGFpbmVkIGluIHRoaXMgRUFSIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIEoyRUUgbW9kdWxlcyBpbiB0aGUgRUFSCi0JICogQGRlcHJlY2F0ZWQgLSBzZWUge0BsaW5rIEVhclV0aWxpdGllcy5nZXRKMkVFTW9kdWxlUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpfQotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKGdldENvbXBvbmVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGFsbCBvZiB0aGUgY29tcG9uZW50cyBjb250YWluZWQgaW4KLQkgKiB0aGlzIEVBUiBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIC0gYW4gYXJyYXkgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciBjb21wb25lbnRzIGluIHRoZSBFQVIKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgRWFyVXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KX0KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRDb21wb25lbnRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZXMoZ2V0Q29tcG9uZW50KCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBJVmlydHVhbFJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBuYW1lCi0JICogCi0JICogQHJldHVybiAtIElWaXJ0dWFsUmVmZXJlbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICogQGRlcHJlY2F0ZWQgLSBzZWUge0BsaW5rIEVhclV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50TmFtZSl9Ci0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldENvbXBvbmVudFJlZmVyZW5jZShTdHJpbmcgY29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZShnZXRDb21wb25lbnQoKSwgY29tcG9uZW50TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudFR5cGVzCi0JICogQHJldHVybiBBIExpc3Qgb2Yge0BsaW5rIElWaXJ0dWFsUmVmZXJlbmNlfXMuCi0JICogCi0JICogQSBjb3B5IG9mIHRoaXMgbWV0aG9kIGlzIG5vdyBpbiBKMkVFUHJvamVjdFV0aWxpdGllcy4gIEFueSBidWcgZml4ZXMgc2hvdWxkIG9jY3VyIGluIGJvdGggbG9jYXRpb25zLgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KExpc3QgY29tcG9uZW50VHlwZXMpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBnZXRDb21wb25lbnQoKTsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICYmIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gcmVmQ29tcG9uZW50c1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBpZiBjb21wb25lbnQgdHlwZXMgcGFzc2VkIGluIGlzIG51bGwgdGhlbiByZXR1cm4gYWxsIGNvbXBvbmVudHMKLQkJCQlpZiAoY29tcG9uZW50VHlwZXMgPT0gbnVsbCB8fCBjb21wb25lbnRUeXBlcy5zaXplKCkgPT0gMCkKLQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb21wb25lbnRUeXBlcy5jb250YWlucyhKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKG1vZHVsZSkpKSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCi0JCXJldHVybiBnZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGFDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCi0JCXJldHVybiBnZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuIGFzQXJjaGl2ZShpbmNsdWRlU291cmNlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmUgYXNBcmNoaXZlKGJvb2xlYW4gaW5jbHVkZVNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCUVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbG9hZGVyID0gbmV3IEVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoZ2V0Q29tcG9uZW50KCksIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJbG9hZGVyLnNldEV4cG9ydFNvdXJjZShpbmNsdWRlU291cmNlKTsKLQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuRUFSRmlsZShsb2FkZXIsIHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG5ldyBFQVJBcnRpZmFjdEVkaXQocHJvamVjdCwgZmFsc2UsIHRydWUpOwotCQl0cnkgewotCQkJZWFyRWRpdC5jcmVhdGVNb2RlbFJvb3QodmVyc2lvbik7Ci0JCQllYXJFZGl0LnNhdmUobnVsbCk7Ci0JCX0gZmluYWxseSB7ICAvLyBNYWtlIHN1cmUgbmV3IHJlc291cmNlIGlzIHJlbW92ZWQgIC0gdGhlIHVyaSB1c2VkIGZvciBjcmVhdGlvbiBzaG91bGRuJ3QgYmUgY2FjaGVkCi0JCQlSZXNvdXJjZSBuZXdSZXMgPSBlYXJFZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUobmV3UmVzKTsKLQkJCW5ld1Jlcy51bmxvYWQoKTsKLQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGNvbnRleHQgcm9vdCBpbiB0aGlzIGFwcGxpY2F0aW9uIGZvciB0aGUgcGFzc2VkIGluIHdlYiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0Ci0JICogQHJldHVybiBjb250ZXh0Um9vdCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkNvbnRleHRSb290KElQcm9qZWN0IHdlYlByb2plY3QpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWlmICh3ZWJQcm9qZWN0ID09IG51bGwgfHwgIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdCh3ZWJQcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7Ci0JCVN0cmluZyB3ZWJNb2R1bGVVUkkgPSBnZXRNb2R1bGVVUkkod2ViQ29tcCk7Ci0JCWlmICh3ZWJNb2R1bGVVUkkgIT0gbnVsbCkgewotCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpIGdldEFwcGxpY2F0aW9uKCkuZ2V0TW9kdWxlKHdlYk1vZHVsZVVSSSwgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjb250ZXh0IHJvb3Qgb24gdGhlIGFwcGxpY2F0aW9uIGZvciB0aGUgcGFzc2VkIGluIGNvbnRleHRSb290LiBUaGlzCi0JICogbXVzdCBiZSBjYWxsZWQgaW4gYSB3cml0ZSBhcnRpZmFjdCBlZGl0IGFuZCBiZSBzYXZlZCBmb3IgY2hhbmdlcyB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViUHJvamVjdAotCSAqIEBwYXJhbSBhQ29udGV4dFJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJDb250ZXh0Um9vdChJUHJvamVjdCB3ZWJQcm9qZWN0LCBTdHJpbmcgYUNvbnRleHRSb290KSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlpZiAod2ViUHJvamVjdCA9PSBudWxsIHx8ICFKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qod2ViUHJvamVjdCkpCi0JCQlyZXR1cm47Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh3ZWJQcm9qZWN0KTsKLQkJU3RyaW5nIHdlYk1vZHVsZVVSSSA9IGdldE1vZHVsZVVSSSh3ZWJDb21wKTsKLQkJaWYgKHdlYk1vZHVsZVVSSSAhPSBudWxsKSB7Ci0JCQlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKFdlYk1vZHVsZSkgZ2V0QXBwbGljYXRpb24oKS5nZXRNb2R1bGUod2ViTW9kdWxlVVJJLCBudWxsKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkKLQkJCQl3ZWJNb2R1bGUuc2V0Q29udGV4dFJvb3QoYUNvbnRleHRSb290KTsKLQkJfQotCX0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjbW9kaWZ5KGphdmEubGFuZy5SdW5uYWJsZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSwgSVBhdGggbW9kZWxQYXRoKSB7Ci0JCXNldFdyaXRhYmxlRWRpdChnZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpKTsKLQkJdHJ5IHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJZ2V0V3JpdGFibGVFZGl0KCkuZGlzcG9zZSgpOwotCQkJc2V0V3JpdGFibGVFZGl0KG51bGwpOwotCQl9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKLQkJcmV0dXJuIEVBUl9DT05URU5UX1RZUEU7Ci0JfQotCXByb3RlY3RlZCBVUkkgZ2V0Um9vdFVSSSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJX09CSjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjU2YzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLkRlcGVuZGVuY3lHcmFwaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUNvbXBvbmVudEltcGxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEVBUlZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBWaXJ0dWFsQ29tcG9uZW50IGltcGxlbWVudHMgSUNvbXBvbmVudEltcGxGYWN0b3J5IHsKLQkKLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gY2FjaGVkUmVmZXJlbmNlczsKLQlwcml2YXRlIGxvbmcgZGVwR3JhcGhNb2RTdGFtcDsKLQlwdWJsaWMgRUFSVmlydHVhbENvbXBvbmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRUFSVmlydHVhbENvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXN1cGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uLCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQoYVByb2plY3QsIGFyY2hpdmVMb2NhdGlvbiwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVBUlZpcnR1YWxDb21wb25lbnQoYVByb2plY3QsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBjcmVhdGVGb2xkZXIoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlyZXR1cm4gbmV3IEVBUlZpcnR1YWxSb290Rm9sZGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKYXJVUkkoZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWYsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXApIHsKLQkJU3RyaW5nIHVyaSA9IHJlZi5nZXRBcmNoaXZlTmFtZSgpOwotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpIDwgMCkgewotCQkJaWYobW9kdWxlQ29tcC5pc0JpbmFyeSgpKXsKLQkJCQl1cmkgPSBuZXcgUGF0aChtb2R1bGVDb21wLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXJpID0gbW9kdWxlQ29tcC5nZXROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIHByZWZpeCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCXVyaSA9IHByZWZpeCArICIvIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRIYXJkUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJTGlzdCBoYXJkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKGNvcmUgIT0gbnVsbCAmJiBjb3JlLmdldENvbXBvbmVudCgpICE9IG51bGwpIHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50ID09IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB2UmVmZXJlbmNlID0gU3RydWN0dXJlRWRpdC5jcmVhdGVWaXJ0dWFsUmVmZXJlbmNlKGVhckNvbXBvbmVudCwgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQlpZiAodlJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50ID0gdlJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJaWYgKHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudCAhPSBudWxsICYmIHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudC5leGlzdHMoKSkgewotCQkJCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSBudWxsOwotCQkJCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbnRPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlhcmNoaXZlTmFtZSA9ICgoSUNvbW1vbk1vZHVsZSkgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbnRPYmplY3QoKSkuZ2V0VXJpKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAocmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9IGdldEphclVSSShyZWZlcmVuY2VkQ29tcG9uZW50LCByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQpOwotCQkJCQkJCQkJfSBlbHNlIGlmKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsKXsKLQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJSVByb2plY3QgcmVmZXJlbmNlZFByb2plY3QgPSByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCS8vIElmIGRlcGVuZGVudCBvYmplY3QgaXMgbm90IHNldCwgYXNzdW1lCi0JCQkJCQkJCQkJLy8gY29tcG5hbWUgaXMgbW9kdWxlIG5hbWUgKyBwcm9wZXIKLQkJCQkJCQkJCQkvLyBleHRlbnNpb24KLQkJCQkJCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChyZWZlcmVuY2VkUHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHJlZmVyZW5jZWRQcm9qZWN0KSkgewotCQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9IHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudC5nZXROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHJlZmVyZW5jZWRQcm9qZWN0KSkgewotCQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9IHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudC5nZXROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChyZWZlcmVuY2VkUHJvamVjdCkpIHsKLQkJCQkJCQkJCQkJYXJjaGl2ZU5hbWUgPSBnZXRKYXJVUkkocmVmZXJlbmNlZENvbXBvbmVudCwgcmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50KTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9IHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudC5nZXROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQl2UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKGFyY2hpdmVOYW1lKTsKLQkJCQkJCQkJaGFyZFJlZmVyZW5jZXMuYWRkKHZSZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIGhhcmRSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdGluZyBsaXN0IG9mIHJlZmVyZW5jZWQgY29tcG9uZW50cyBiYXNlZCBvZmYgdGhlIGhhcmQgcmVmZXJlbmNlcyBhbmQgYXJjaGl2ZXMgbWFwcGluZyB0byB0aGUgcm9vdCBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGVhckNvbXBvbmVudAotCSAqIEBwYXJhbSBoYXJkUmVmZXJlbmNlcwotCSAqIEBwYXJhbSBtZW1iZXJzVG9JZ25vcmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRMb29zZUFyY2hpdmVSZWZlcmVuY2VzKEVBUlZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBMaXN0IGhhcmRSZWZlcmVuY2VzKSB7Ci0JCXJldHVybiAgZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhlYXJDb21wb25lbnQsIGhhcmRSZWZlcmVuY2VzLCBudWxsLCAoRUFSVmlydHVhbFJvb3RGb2xkZXIpZWFyQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhFQVJWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBoYXJkUmVmZXJlbmNlcywgTGlzdCBkeW5hbWljUmVmZXJlbmNlcywgRUFSVmlydHVhbFJvb3RGb2xkZXIgZm9sZGVyKSB7Ci0JCXRyeSB7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5zdXBlck1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChJVmlydHVhbFJlc291cmNlLkZJTEUgPT0gbWVtYmVyc1tpXS5nZXRUeXBlKCkpIHsKLQkJCQkJaWYoZm9sZGVyLmlzRHluYW1pY0NvbXBvbmVudCgoSVZpcnR1YWxGaWxlKW1lbWJlcnNbaV0pKXsKLQkJCQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IG1lbWJlcnNbaV0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQkJCQkJCWJvb2xlYW4gc2hvdWxkSW5jbHVkZSA9IHRydWU7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGhhcmRSZWZlcmVuY2VzLnNpemUoKSAmJiBzaG91bGRJbmNsdWRlOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgdGVtcEFyY2hpdmVOYW1lID0gKChJVmlydHVhbFJlZmVyZW5jZSkgaGFyZFJlZmVyZW5jZXMuZ2V0KGopKS5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCQkJCWlmIChudWxsICE9IHRlbXBBcmNoaXZlTmFtZSAmJiB0ZW1wQXJjaGl2ZU5hbWUuZXF1YWxzKGFyY2hpdmVOYW1lKSkgewotCQkJCQkJCQlzaG91bGRJbmNsdWRlID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHNob3VsZEluY2x1ZGUpIHsKLQkJCQkJCQlJUmVzb3VyY2UgaVJlc291cmNlID0gbWVtYmVyc1tpXS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBkeW5hbWljQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCksIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgaVJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgZHluYW1pY1JlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKGVhckNvbXBvbmVudCwgZHluYW1pY0NvbXBvbmVudCk7Ci0JCQkJCQkJZHluYW1pY1JlZi5zZXRBcmNoaXZlTmFtZShhcmNoaXZlTmFtZSk7Ci0JCQkJCQkJaWYgKG51bGwgPT0gZHluYW1pY1JlZmVyZW5jZXMpIHsKLQkJCQkJCQkJZHluYW1pY1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJfQotCQkJCQkJCWR5bmFtaWNSZWZlcmVuY2VzLmFkZChkeW5hbWljUmVmKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZihJVmlydHVhbFJlc291cmNlLkZPTERFUiA9PSBtZW1iZXJzW2ldLmdldFR5cGUoKSl7Ci0JCQkJCWR5bmFtaWNSZWZlcmVuY2VzID0gZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhlYXJDb21wb25lbnQsIGhhcmRSZWZlcmVuY2VzLCBkeW5hbWljUmVmZXJlbmNlcywgKEVBUlZpcnR1YWxSb290Rm9sZGVyKW1lbWJlcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGR5bmFtaWNSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNhY2hlZCA9IGdldENhY2hlZFJlZmVyZW5jZXMoKTsKLQkJaWYgKGNhY2hlZCAhPSBudWxsKQotCQkJcmV0dXJuIGNhY2hlZDsKLQkJTGlzdCBoYXJkUmVmZXJlbmNlcyA9IGdldEhhcmRSZWZlcmVuY2VzKHRoaXMpOwotCQlMaXN0IGR5bmFtaWNSZWZlcmVuY2VzID0gZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyh0aGlzLCBoYXJkUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGR5bmFtaWNSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWhhcmRSZWZlcmVuY2VzLmFkZEFsbChkeW5hbWljUmVmZXJlbmNlcyk7Ci0JCX0KLQkJY2FjaGVkUmVmZXJlbmNlcyA9IChJVmlydHVhbFJlZmVyZW5jZVtdKSBoYXJkUmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtoYXJkUmVmZXJlbmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIGNhY2hlZFJlZmVyZW5jZXM7Ci0JfQotCS8vIFJldHVybnMgY2FjaGUgaWYgc3RpbGwgdmFsaWQgb3IgbnVsbAotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldENhY2hlZFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjYWNoZWRSZWZlcmVuY2VzICE9IG51bGwgJiYgY2hlY2tJZlN0aWxsVmFsaWQoKSkKLQkJCXJldHVybiBjYWNoZWRSZWZlcmVuY2VzOwotCQllbHNlCi0JCQlkZXBHcmFwaE1vZFN0YW1wID0gRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZFN0YW1wKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0lmU3RpbGxWYWxpZCgpIHsKLQkJcmV0dXJuIERlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lmU3RpbGxWYWxpZChkZXBHcmFwaE1vZFN0YW1wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxSb290Rm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxSb290Rm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWY3Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9FQVJWaXJ0dWFsUm9vdEZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLy9UT0RPIHRoaXMgc2hvdWxkIGJlIHJlbmFtZWQgdG8gRUFSVmlydHVhbEZvbGRlciBiZWNhdXNlIGl0IGlzIG5vdCB1c2VkIG9ubHkgZm9yIHRoZSByb290LgotcHVibGljIGNsYXNzIEVBUlZpcnR1YWxSb290Rm9sZGVyIGV4dGVuZHMgVmlydHVhbEZvbGRlciB7Ci0KLQlwdWJsaWMgRUFSVmlydHVhbFJvb3RGb2xkZXIoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBbXSBFWFRFTlNJT05TX1RPX0lHTk9SRSA9IG5ldyBTdHJpbmcgW10geyIuamFyIiwgIi56aXAiLCAiLnJhciIsICIud2FyIiB9OwotCQotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gc3VwZXJNZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXJNZW1iZXJzKElSZXNvdXJjZS5OT05FKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBzdXBlck1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5tZW1iZXJzKG1lbWJlckZsYWdzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEeW5hbWljQ29tcG9uZW50KElWaXJ0dWFsRmlsZSB2RmlsZSl7Ci0JCVN0cmluZyBhcmNoaXZlTmFtZSA9IHZGaWxlLmdldE5hbWUoKTsKLQkJZm9yKGludCBqID0gMDsgajxFWFRFTlNJT05TX1RPX0lHTk9SRS5sZW5ndGg7IGorKyl7Ci0JCQlpZihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5lbmRzV2l0aElnbm9yZUNhc2UoYXJjaGl2ZU5hbWUsIEVYVEVOU0lPTlNfVE9fSUdOT1JFW2pdKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBGb3Igbm93LCBqdXN0IHJpcCBvdXQgZmlsZXMgd2l0aCAuamFyLCAucmFyLCBvciAud2FyIGZpbGUgZXh0ZW5zaW9ucywgYmVjYXVzZSB0aGVzZSBhcmUKLQkgKiB0aGUgb25seSBmaWxlcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGR5YW1pY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gc3VwZXJNZW1iZXJzKG1lbWJlckZsYWdzKTsKLQkJTGlzdCB2aXJ0dWFsUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIHNob3VsZEFkZCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJc2hvdWxkQWRkID0gdHJ1ZTsKLQkJCWlmIChJVmlydHVhbFJlc291cmNlLkZJTEUgPT0gbWVtYmVyc1tpXS5nZXRUeXBlKCkpIHsKLQkJCQlpZihpc0R5bmFtaWNDb21wb25lbnQoKElWaXJ0dWFsRmlsZSltZW1iZXJzW2ldKSl7Ci0JCQkJCXNob3VsZEFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzaG91bGRBZGQpIHsKLQkJCQl2aXJ0dWFsUmVzb3VyY2VzLmFkZChtZW1iZXJzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsUmVzb3VyY2VbXSkgdmlydHVhbFJlc291cmNlcwotCQkJCS50b0FycmF5KG5ldyBJVmlydHVhbFJlc291cmNlW3ZpcnR1YWxSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzQ5NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkJBcnRpZmFjdEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgRUFSQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIEVBUiBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2VhcmNyZWF0aW9uL0lFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWFyY3JlYXRpb24vSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwYTQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWFyY3JlYXRpb24vSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuZmFjZXQuRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQkKLQkvL1RPRE8gd2hhdCBpcyB0aGlzPz8/Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVIgPSAiSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfUFJPSkVDVFNfTElTVCA9ICJJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KMkVFX1BST0pFQ1RTX0xJU1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QUk9KRUNUX0xJU1QgPSAiSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QUk9KRUNUX0xJU1QiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWM0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVqYk1vZHVsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uSmNhTW9kdWxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENSRUFURV9CQVNFID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQ1JFQVRFXyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFSkIgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXRUIgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQVIgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElFTlQgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TVUZGSVggPSAiV2ViIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfU1VGRklYID0gIkVKQiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1NVRkZJWCA9ICJDbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9TVUZGSVggPSAiQ29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGVqYk1vZGVsOwotCXByaXZhdGUgSURhdGFNb2RlbCBlamJGYWNldE1vZGVsOwotCXByaXZhdGUgSURhdGFNb2RlbCB3ZWJNb2RlbDsKLQlwcml2YXRlIElEYXRhTW9kZWwgd2ViRmFjZXRNb2RlbDsKLQlwcml2YXRlIElEYXRhTW9kZWwgamNhTW9kZWw7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGpjYUZhY2V0TW9kZWw7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGNsaWVudE1vZGVsOwotCXByaXZhdGUgSURhdGFNb2RlbCBjbGllbnRGYWNldE1vZGVsOwotCi0JcHVibGljIERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFQVJfQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChXRUJfQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFSkJfQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKMkVFX1ZFUlNJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfRUpCKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX1dFQik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENSRUFURV9BUFBDTElFTlQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfQ09OTkVDVE9SKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTU9EVUxFX05BTUVfQ09MTElTSU9OU19WQUxJREFUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5BQkxFRCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE5FU1RFRF9NT0RFTF9DTElFTlQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChORVNURURfTU9ERUxfRUpCKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTkVTVEVEX01PREVMX0pDQSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE5FU1RFRF9NT0RFTF9XRUIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChGQUNFVF9SVU5USU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCWluaXROZXN0ZWRDcmVhdGlvbk1vZGVscygpOwotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5lc3RlZENyZWF0aW9uTW9kZWxzKCkgewotCQljbGllbnRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfQ0xJRU5ULCBjbGllbnRNb2RlbCk7Ci0JCWNsaWVudEZhY2V0TW9kZWwgPSAoKEZhY2V0RGF0YU1vZGVsTWFwKWNsaWVudE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKSkuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UKTsKLQkJY2xpZW50RmFjZXRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJY2xpZW50RmFjZXRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLlBST0hJQklUX0FERF9UT19FQVIsIHRydWUpOwotCQkKLQkJRWpiTW9kdWxlRXh0ZW5zaW9uIGVqYkV4dCA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChlamJFeHQgIT0gbnVsbCkgewotCQkJZWpiTW9kZWwgPSBlamJFeHQuY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpOwotCQkJaWYgKGVqYk1vZGVsICE9IG51bGwpewotCQkJCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9FSkIsIGVqYk1vZGVsKTsKLQkJCQllamJGYWNldE1vZGVsID0gKChGYWNldERhdGFNb2RlbE1hcCllamJNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCkpLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQik7Ci0JCQkJZWpiRmFjZXRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJCQllamJGYWNldE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuUFJPSElCSVRfQUREX1RPX0VBUiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJV2ViTW9kdWxlRXh0ZW5zaW9uIHdlYkV4dCA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0V2ViTW9kdWxlRXh0ZW5zaW9uKCk7Ci0JCWlmICh3ZWJFeHQgIT0gbnVsbCkgewotCQkJd2ViTW9kZWwgPSB3ZWJFeHQuY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpOwotCQkJaWYgKHdlYk1vZGVsICE9IG51bGwpewotCQkJCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9XRUIsIHdlYk1vZGVsKTsKLQkJCQl3ZWJGYWNldE1vZGVsID0gKChGYWNldERhdGFNb2RlbE1hcCl3ZWJNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCkpLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQkJCQl3ZWJGYWNldE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJCXdlYkZhY2V0TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5QUk9ISUJJVF9BRERfVE9fRUFSLCB0cnVlKTsKLQkJCX0KLQkJfQotCQlKY2FNb2R1bGVFeHRlbnNpb24gcmFyRXh0ID0gRWFyTW9kdWxlTWFuYWdlci5nZXRKQ0FNb2R1bGVFeHRlbnNpb24oKTsKLQkJaWYgKHJhckV4dCAhPSBudWxsKSB7Ci0JCQlqY2FNb2RlbCA9IHJhckV4dC5jcmVhdGVQcm9qZWN0RGF0YU1vZGVsKCk7Ci0JCQlpZiAoamNhTW9kZWwgIT0gbnVsbCl7Ci0JCQkJbW9kZWwuYWRkTmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0pDQSwgamNhTW9kZWwpOwotCQkJCWpjYUZhY2V0TW9kZWwgPSAoKEZhY2V0RGF0YU1vZGVsTWFwKWpjYU1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKSkuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBKTsKLQkJCQlqY2FGYWNldE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJCWpjYUZhY2V0TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5QUk9ISUJJVF9BRERfVE9fRUFSLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKENSRUFURV9CQVNFKSkKLQkJCXJldHVybiBnZXREZWZhdWx0Q3JlYXRlVmFsdWUocHJvcGVydHlOYW1lKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5BQkxFRCkpCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQlwcml2YXRlIE9iamVjdCBnZXREZWZhdWx0Q3JlYXRlVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfQ09OTkVDVE9SKSkgewotCQkJaW50IHZlcnNpb24gPSBnZXRJbnRQcm9wZXJ0eShKMkVFX1ZFUlNJT04pOwotCQkJaWYgKHZlcnNpb24gPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbnZlcnRQcm9wZXJ0eU5hbWVUb0ludChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENSRUFURV9XRUIpKSB7Ci0JCQlyZXR1cm4gV0VCOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX0VKQikpIHsKLQkJCXJldHVybiBFSkI7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfQ09OTkVDVE9SKSkgewotCQkJcmV0dXJuIFJBUjsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENSRUFURV9BUFBDTElFTlQpKSB7Ci0JCQlyZXR1cm4gQ0xJRU5UOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBlbnN1cmVVbmlxdWVQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gcHJvamVjdE5hbWU7Ci0JCWludCBpbmRleCA9IDA7Ci0JCUlQcm9qZWN0IHByb2ogPSByb290LmdldFByb2plY3QobmV3TmFtZSk7Ci0JCXdoaWxlIChwcm9qLmV4aXN0cygpKSB7Ci0JCQlpbmRleCsrOwotCQkJbmV3TmFtZSA9IHByb2plY3ROYW1lICsgaW5kZXg7Ci0JCQlwcm9qID0gcm9vdC5nZXRQcm9qZWN0KG5ld05hbWUpOwotCQl9Ci0JCXJldHVybiBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSjJFRV9WRVJTSU9OKSkgewotCQkJdXBkYXRlZEoyRUVWZXJzaW9uKChJbnRlZ2VyKSBwcm9wZXJ0eVZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoQ1JFQVRFX0JBU0UpKXsKLQkJCW5vdGlmeUVuYWJsZW1lbnQoY29udmVydFByb3BlcnR5TmFtZVRvSW50KHByb3BlcnR5TmFtZSkpOwotCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQVJfQ09NUE9ORU5UX05BTUUpKSB7Ci0JCQlzZXREZWZhdWx0Q29tcG9uZW50TmFtZXMoKFN0cmluZykgcHJvcGVydHlWYWx1ZSk7Ci0JCX1lbHNlIGlmKHdlYk1vZGVsICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhXRUJfQ09NUE9ORU5UX05BTUUpKXsKLQkJCXdlYk1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfWVsc2UgaWYoY2xpZW50TW9kZWwgIT0gbnVsbCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKEFQUENMSUVOVF9DT01QT05FTlRfTkFNRSkpewotCQkJY2xpZW50TW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQl9ZWxzZSBpZihlamJNb2RlbCAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoRUpCX0NPTVBPTkVOVF9OQU1FKSl7Ci0JCQllamJNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCX1lbHNlIGlmKGpjYU1vZGVsICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUpKXsKLQkJCWpjYU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfSAKLQkJZWxzZSBpZihGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCWlmKHdlYk1vZGVsICE9IG51bGwpewotCQkJCXdlYk1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9Ci0JCQlpZihjbGllbnRNb2RlbCAhPSBudWxsKXsKLQkJCQljbGllbnRNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIHByb3BlcnR5VmFsdWUpOwotCQkJfQotCQkJaWYoZWpiTW9kZWwgIT0gbnVsbCl7Ci0JCQkJZWpiTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCX0KLQkJCWlmKGpjYU1vZGVsICE9IG51bGwpewotCQkJCWpjYU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vdGlmeTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5RW5hYmxlbWVudChpbnQgZmxhZykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gbnVsbDsKLQkJc3dpdGNoIChmbGFnKSB7Ci0JCQljYXNlIEVKQiA6Ci0JCQkJcHJvcGVydHlOYW1lID0gRUpCX0NPTVBPTkVOVF9OQU1FOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUIgOgotCQkJCXByb3BlcnR5TmFtZSA9IFdFQl9DT01QT05FTlRfTkFNRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0xJRU5UIDoKLQkJCQlwcm9wZXJ0eU5hbWUgPSBBUFBDTElFTlRfQ09NUE9ORU5UX05BTUU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJBUiA6Ci0JCQkJcHJvcGVydHlOYW1lID0gQ09OTkVDVE9SX0NPTVBPTkVOVF9OQU1FOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlZEoyRUVWZXJzaW9uKEludGVnZXIgdmVyc2lvbikgewotCQlzZXROZXN0ZWRKMkVFVmVyc2lvbih2ZXJzaW9uKTsKLQkJaWYgKHZlcnNpb24uaW50VmFsdWUoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIG1vZGVsLmlzUHJvcGVydHlTZXQoQ1JFQVRFX0NPTk5FQ1RPUikpIHsKLQkJCW1vZGVsLnNldFByb3BlcnR5KENSRUFURV9DT05ORUNUT1IsIEJvb2xlYW4uRkFMU0UpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVNb2R1bGVOYW1lQ29sbGlzaW9ucygpIHsKLQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShFTkFCTEVEKSkgewotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCQkJU3RyaW5nIGFjdHVhbFByb2plY3ROYW1lID0gbnVsbDsKLQkJCWJvb2xlYW4gZXJyb3JDb2xsaXNpb24gPSBmYWxzZTsKLQkJCWJvb2xlYW4gZXJyb3JOb1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9BUFBDTElFTlQpKSB7Ci0JCQkJYWN0dWFsUHJvamVjdE5hbWUgPSBjbGllbnRNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCQkJcHJvamVjdE5hbWUgPSBXVFBQbHVnaW4uaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSA/IGFjdHVhbFByb2plY3ROYW1lIDogYWN0dWFsUHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQlsaXN0LmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkJZXJyb3JOb1NlbGVjdGlvbiA9IGZhbHNlOwotCQkJfQotCQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfRUpCKSkgewotCQkJCWFjdHVhbFByb2plY3ROYW1lID0gZWpiTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJCXByb2plY3ROYW1lID0gV1RQUGx1Z2luLmlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkgPyBhY3R1YWxQcm9qZWN0TmFtZSA6IGFjdHVhbFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHByb2plY3ROYW1lKSkgewotCQkJCQlsaXN0LmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JDb2xsaXNpb24gPSB0cnVlOwotCQkJCX0KLQkJCQllcnJvck5vU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWVycm9yQ29sbGlzaW9uICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCKSkgewotCQkJCWFjdHVhbFByb2plY3ROYW1lID0gd2ViTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJCXByb2plY3ROYW1lID0gV1RQUGx1Z2luLmlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkgPyBhY3R1YWxQcm9qZWN0TmFtZSA6IGFjdHVhbFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHByb2plY3ROYW1lKSkgewotCQkJCQlsaXN0LmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JDb2xsaXNpb24gPSB0cnVlOwotCQkJCX0KLQkJCQllcnJvck5vU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWVycm9yQ29sbGlzaW9uICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfQ09OTkVDVE9SKSkgewotCQkJCWFjdHVhbFByb2plY3ROYW1lID0gamNhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQkJCXByb2plY3ROYW1lID0gV1RQUGx1Z2luLmlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkgPyBhY3R1YWxQcm9qZWN0TmFtZSA6IGFjdHVhbFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHByb2plY3ROYW1lKSkgewotCQkJCQlsaXN0LmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JDb2xsaXNpb24gPSB0cnVlOwotCQkJCX0KLQkJCQllcnJvck5vU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoZXJyb3JDb2xsaXNpb24pIHsKLQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkR1cGxpY2F0ZU1vZHVsZU5hbWVzIiwgbmV3IE9iamVjdFtde2FjdHVhbFByb2plY3ROYW1lfSksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGVycm9yTm9TZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5Ob01vZHVsZXNTZWxlY3RlZCwgbnVsbCk7IAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsI2RvVmFsaWRhdGVQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQotCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9BUFBDTElFTlQpICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoQVBQQ0xJRU5UX0NPTVBPTkVOVF9OQU1FKSkgewotCQkJcmV0dXJuIGNsaWVudE1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQl9Ci0KLQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCKSAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFdFQl9DT01QT05FTlRfTkFNRSkpIHsKLQkJCXJldHVybiB3ZWJNb2RlbC52YWxpZGF0ZVByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJfQotCi0JCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0VKQikgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhFSkJfQ09NUE9ORU5UX05BTUUpKSB7Ci0JCQlyZXR1cm4gZWpiTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCX0KLQotCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9DT05ORUNUT1IpICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVE9SX0NPTVBPTkVOVF9OQU1FKSkgewotCQkJcmV0dXJuIGpjYU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCQl9Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQotLy8JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlQ29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkgewotLy8JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotLy8JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCWlmIChjb21wb25lbnROYW1lLmluZGV4T2YoIiMiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9JTlZBTElEX0NIQVJTKTsgCi0vLwkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7Ci0vLwkJCX0gZWxzZSBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsIHx8IGNvbXBvbmVudE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9FTVBUWV9NT0RVTEVfTkFNRSk7Ci0vLwkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIHN0YXR1czsKLS8vCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmVzdGVkQ29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSwgaW50IGZsYWcpIHsKLQkJSURhdGFNb2RlbCBtb2RNb2R1bGUgPSBnZXROZXN0ZWRNb2RlbChmbGFnKTsKLQkJaWYgKG1vZE1vZHVsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29tcE5hbWUgPSBlbnN1cmVVbmlxdWVQcm9qZWN0TmFtZShuYW1lKTsKLQkJCW1vZE1vZHVsZS5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgY29tcE5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRDb21wb25lbnROYW1lcyhTdHJpbmcgYmFzZSkgewotCQlTdHJpbmcgY29tcG9uZW50TmFtZTsKLQkJaWYgKGJhc2UuZW5kc1dpdGgoRUpCX1NVRkZJWCkpCi0JCQljb21wb25lbnROYW1lID0gYmFzZTsKLQkJZWxzZQotCQkJY29tcG9uZW50TmFtZSA9IGJhc2UgKyBFSkJfU1VGRklYOwotCQlzZXREZWZhdWx0TmVzdGVkQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lLCBFSkIpOwotCQlzZXRQcm9wZXJ0eShFSkJfQ09NUE9ORU5UX05BTUUsIGNvbXBvbmVudE5hbWUpOwotCQlpZiAoYmFzZS5lbmRzV2l0aChXRUJfU1VGRklYKSkKLQkJCWNvbXBvbmVudE5hbWUgPSBiYXNlOwotCQllbHNlCi0JCQljb21wb25lbnROYW1lID0gYmFzZSArIFdFQl9TVUZGSVg7Ci0JCXNldERlZmF1bHROZXN0ZWRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUsIFdFQik7Ci0JCXNldFByb3BlcnR5KFdFQl9DT01QT05FTlRfTkFNRSwgY29tcG9uZW50TmFtZSk7Ci0JCWlmIChiYXNlLmVuZHNXaXRoKENMSUVOVF9TVUZGSVgpKQotCQkJY29tcG9uZW50TmFtZSA9IGJhc2U7Ci0JCWVsc2UKLQkJCWNvbXBvbmVudE5hbWUgPSBiYXNlICsgQ0xJRU5UX1NVRkZJWDsKLQkJc2V0RGVmYXVsdE5lc3RlZENvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSwgQ0xJRU5UKTsKLQkJc2V0UHJvcGVydHkoQVBQQ0xJRU5UX0NPTVBPTkVOVF9OQU1FLCBjb21wb25lbnROYW1lKTsKLQkJaWYgKGJhc2UuZW5kc1dpdGgoQ09OTkVDVE9SX1NVRkZJWCkpCi0JCQljb21wb25lbnROYW1lID0gYmFzZTsKLQkJZWxzZQotCQkJY29tcG9uZW50TmFtZSA9IGJhc2UgKyBDT05ORUNUT1JfU1VGRklYOwotCQlzZXREZWZhdWx0TmVzdGVkQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lLCBSQVIpOwotCQlzZXRQcm9wZXJ0eShDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUsIGNvbXBvbmVudE5hbWUpOwotCQkKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgRUFSIFByb2plY3QgTmFtZSBmaWVsZCBhcyB3ZWxsCi0JCWlmKHdlYk1vZGVsICE9IG51bGwpewotCQkJd2ViTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgYmFzZSk7Ci0JCX0KLQkJaWYoY2xpZW50TW9kZWwgIT0gbnVsbCl7Ci0JCQljbGllbnRNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBiYXNlKTsKLQkJfQotCQlpZihlamJNb2RlbCAhPSBudWxsKXsKLQkJCWVqYk1vZGVsLnNldFByb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGJhc2UpOwotCQl9Ci0JCWlmKGpjYU1vZGVsICE9IG51bGwpewotCQkJamNhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgYmFzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmVzdGVkSjJFRVZlcnNpb24oT2JqZWN0IGoyZWVWZXJzaW9uKSB7Ci0JCWludCBqMmVlVmVyID0gKChJbnRlZ2VyKSBqMmVlVmVyc2lvbikuaW50VmFsdWUoKTsKLQkJaWYgKGVqYk1vZGVsICE9IG51bGwgJiYgZWpiRmFjZXRNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmFjZXRWZXJzaW9uU3RyaW5nID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9FSkJWZXJzaW9uSUQoajJlZVZlcikpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGVqYkZhY2V0TW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCkpLmdldFZlcnNpb24oZmFjZXRWZXJzaW9uU3RyaW5nKTsKLQkJCWVqYkZhY2V0TW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLCBmYWNldFZlcnNpb24pOwotCQkJLy9bQnVnIDI0MzIyNl0gSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZmFjZXQgdmVyc2lvbiBpcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGVkIHNvIGl0IGhhcyB0byBiZSBkb25lIG1hbnVhbGx5Ci0JCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KWVqYk1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCQlmcHdjLmNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oZmFjZXRWZXJzaW9uKTsKLQkJfQotCQlpZiAod2ViTW9kZWwgIT0gbnVsbCAmJndlYkZhY2V0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZhY2V0VmVyc2lvblN0cmluZyA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0SjJFRVZlcnNpb25JRFRvV2ViVmVyc2lvbklEKGoyZWVWZXIpKTsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh3ZWJGYWNldE1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfSUQpKS5nZXRWZXJzaW9uKGZhY2V0VmVyc2lvblN0cmluZyk7Ci0JCQl3ZWJGYWNldE1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgZmFjZXRWZXJzaW9uKTsKLQkJCS8vW0J1ZyAyNDMyMjZdIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZhY2V0IHZlcnNpb24gaXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBzbyBpdCBoYXMgdG8gYmUgZG9uZSBtYW51YWxseQotCQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnB3YyA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSl3ZWJNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpOwotCQkJZnB3Yy5jaGFuZ2VQcm9qZWN0RmFjZXRWZXJzaW9uKGZhY2V0VmVyc2lvbik7Ci0JCX0KLQkJaWYgKGpjYU1vZGVsICE9IG51bGwgJiYgamNhRmFjZXRNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmFjZXRWZXJzaW9uU3RyaW5nID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9Db25uZWN0b3JWZXJzaW9uSUQoajJlZVZlcikpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGpjYUZhY2V0TW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCkpLmdldFZlcnNpb24oZmFjZXRWZXJzaW9uU3RyaW5nKTsKLQkJCWpjYUZhY2V0TW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLCBmYWNldFZlcnNpb24pOwotCQkJLy9bQnVnIDI0MzIyNl0gSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZmFjZXQgdmVyc2lvbiBpcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGVkIHNvIGl0IGhhcyB0byBiZSBkb25lIG1hbnVhbGx5Ci0JCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KWpjYU1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCQlmcHdjLmNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oZmFjZXRWZXJzaW9uKTsKLQkJfQotCQlpZiAoY2xpZW50TW9kZWwgIT0gbnVsbCAmJiBjbGllbnRGYWNldE1vZGVsICE9IG51bGwpewotCQkJU3RyaW5nIGZhY2V0VmVyc2lvblN0cmluZyA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKGoyZWVWZXIpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGNsaWVudEZhY2V0TW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCkpLmdldFZlcnNpb24oZmFjZXRWZXJzaW9uU3RyaW5nKTsKLQkJCWNsaWVudEZhY2V0TW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLCBmYWNldFZlcnNpb24pOwotCQkJLy9bQnVnIDI0MzIyNl0gSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZmFjZXQgdmVyc2lvbiBpcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGVkIHNvIGl0IGhhcyB0byBiZSBkb25lIG1hbnVhbGx5Ci0JCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KWNsaWVudE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCQlmcHdjLmNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oZmFjZXRWZXJzaW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChpbnQgZmxhZykgewotCQlzd2l0Y2ggKGZsYWcpIHsKLQkJCWNhc2UgRUpCIDoKLQkJCQlyZXR1cm4gZWpiTW9kZWw7Ci0JCQljYXNlIFdFQiA6Ci0JCQkJcmV0dXJuIHdlYk1vZGVsOwotCQkJY2FzZSBSQVIgOgotCQkJCXJldHVybiBqY2FNb2RlbDsKLQkJCWNhc2UgQ0xJRU5UIDoKLQkJCQlyZXR1cm4gY2xpZW50TW9kZWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfQ09OTkVDVE9SKSkgewotCQkJaW50IHZlcnNpb24gPSBnZXRJbnRQcm9wZXJ0eShKMkVFX1ZFUlNJT04pOwotCQkJcmV0dXJuIHZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJfQotCQlpZiggcHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUpKXsKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0NPTk5FQ1RPUik7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQVBQQ0xJRU5UX0NPTVBPTkVOVF9OQU1FKSkKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0FQUENMSUVOVCk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVKQl9DT01QT05FTlRfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9FSkIpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhXRUJfQ09NUE9ORU5UX05BTUUpKQotCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCKTsKLQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlNmUxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlYXJjcmVhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3Jfb2NjdXJlZF9nZXR0aW5nX2FwcGxfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29jY3VyZWRfZ2V0dGluZ19hcHBsMV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19FQVJfUHJvamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGhlX3Byb2plY3RfYWxyZWFkeV9leGlzdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSUHJvamVjdENyZWF0aW9uT3BlcmF0aW9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFCU19QQVRIX0NIQU5HRURfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVOU0FWRURfQ0hBTkdFU19XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX01BUF9QUk9CTEVNU19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX1BST0pFQ1RTX0NMT1NFRF9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRfTW9kdWxlX0NvbW1hbmRfTGFiZWxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZV9Nb2R1bGVfQ29tbWFuZF9MYWJlbF9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXRfcHJvamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkX1V0aWxpdHlfSkFSX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTV9VVElMX0pBUl9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KX0RFU0NfVVBEQVRFX0VSUk9SX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb3RfYW5fZWFyX3Byb2plY3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9QUk9KRUNUX01VU1RfQkVfT1BFTl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRpbmdfYWJzb2x1dGVfcGF0aHNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER1cGxpY2F0ZU1vZHVsZU5hbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vTW9kdWxlc1NlbGVjdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLRVlfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZXzE2OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV9JbXBvcnRfVXRpbGl0eV9KYXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV9QcmVwYXJpbmdfdG9faW1wb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X1ZhbGlkX1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsX1NlbGVjdF9KYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsX1NwZWNpZnlfTGlua2VkX1BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1RoZXJlX3dlcmVfbm9fdXRpbGl0eV9qYXJzX3NlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9MaW5rZWRfUGF0aF9FeGlzdHM7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb25fQ3JlYXRlX3Byb2plY3Rfd2l0aF9leHRyYWN0ZWRfY29udGVfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb25fQ29weWluZ19hcmNoaXZlX2ludG9fc2VsZWN0ZWRfcHJvamVfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb25fRm91bmRfZXhpc3RpbmdfZmlsZV8wXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbl9DcmVhdGluZ19wcm9qZWN0X3dpdGhfbGlua2VkX2FyY2hpdl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvamVjdFdpdGhMaW5rZWRKYXJPcGVyYXRpb25fQ2Fubm90X2xpbmtfdXRpbGl0eV9qYXJfaW50b19hX2Nsb3NfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uX0ZpbGVfYWxyZWFkeV9leGlzdHNfMF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua0FyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbl9MaW5raW5nX2FyY2hpdmVfaW50b19zZWxlY3RlZF9wcm9qZV87Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzFhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUkltcG9ydERhdGFNb2RlbF9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUkltcG9ydERhdGFNb2RlbF9VSV8yYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJJbXBvcnREYXRhTW9kZWxfVUlfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJJbXBvcnREYXRhTW9kZWxfVUlfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVNYXBwaW5nSW1wbF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxpdHlKQVJNYXBwaW5nSW1wbF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFdyb25nVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRXcm9uZ1ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX1BST0pFQ1ROQU1FX1NBTUVBU19NT0RVTEU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX01PRFVMRV9NT0RVTEVfVFlQRSA9IEtFWV8xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9NT0RVTEVfTU9EVUxFX0VYSVNUUyA9IEtFWV8yOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9NT0RVTEVfTU9EVUxFX0NMT1NFRCA9IEtFWV8zOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9NT0RVTEVfTU9EVUxFX05VTEwgPSBLRVlfNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUFJPSkVDVF9VUklfRVhJU1RTID0gS0VZXzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1BST0pFQ1RfTk9UX0pBVkEgPSBLRVlfNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUFJPSkVDVF9VVElMX1VSSSA9IEtFWV83OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9QUk9KRUNUX1VUSUxfTUFQUEVEID0gS0VZXzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1BST0pFQ1RfTk9UX0VBUiA9IEtFWV85OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9QUk9KRUNUX1VSSV9FTVBUWSA9IEtFWV8xMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQU5fQVBQX0NMSUVOVCA9IEtFWV8xMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQU5fRUFSID0gS0VZXzEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BTl9FSkIgPSBLRVlfMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0FfUkFSID0gS0VZXzE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BX1dBUiA9IEtFWV8xNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVEFSR0VUX05PVF9TVVBQT1JUX0VBUiA9IEtFWV8xNjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9FYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjU4ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChDT05URU5UX0RJUik7Ci0JCW5hbWVzLmFkZChKMkVFX1BST0pFQ1RTX0xJU1QpOwotCQluYW1lcy5hZGQoSkFWQV9QUk9KRUNUX0xJU1QpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9JRCkpIHsKLQkJCXJldHVybiBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVOVF9ESVIpKSB7Ci0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEoyRUVfUFJPSkVDVFNfTElTVCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKQVZBX1BST0pFQ1RfTElTVCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9IGVsc2UgaWYocHJvcGVydHlOYW1lLmVxdWFscyhHRU5FUkFURV9ERCkpewotCQkJU3RyaW5nIGZhY2V0VmVyc2lvbiA9IGdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1ZFUlNJT05fU1RSKTsKLQkJCWlmKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGZhY2V0VmVyc2lvbikgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCl7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUExJQ0FUSU9OX0dFTkVSQVRFX0REKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZS5lcXVhbHMoSjJFRV9QUk9KRUNUU19MSVNUKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlVGFyZ2V0Q29tcG9uZW50VmVyc2lvbigoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSjJFRV9QUk9KRUNUU19MSVNUKSk7Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQ09OVEVOVF9ESVIpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGb2xkZXJOYW1lKGdldFN0cmluZ1Byb3BlcnR5KENPTlRFTlRfRElSKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVRhcmdldENvbXBvbmVudFZlcnNpb24oTGlzdCBsaXN0KSB7Ci0JCWludCBlYXJWZXJzaW9uID0gZ2V0SjJFRVZlcnNpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IGhhbmRsZSA9IChJUHJvamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoaGFuZGxlLmdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29tcCA9PSBudWxsKSByZXR1cm4gT0tfU1RBVFVTOyAvL05vdCBhIGZhY2V0ZWQgcHJvamVjdCwgc28gdmVyc2lvbiBub3QgcmVsZXZhbnQKLQkJCWludCBjb21wVmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGNvbXApOwotCQkJaWYgKGVhclZlcnNpb24gPCBjb21wVmVyc2lvbikgewotCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9ICJUaGUgTW9kdWxlIHNwZWNpZmljYXRpb24gbGV2ZWwgb2YgIiArIGhhbmRsZS5nZXROYW1lKCkgKyAiLCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY29udGFpbmluZyBFQVIgdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhlcnJvclN0YXR1cywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRGYWNldFZlcnNpb25Ub0oyRUVWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzAyMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0lEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCAtIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIHR5cGUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFJlcXVpcmVkIC0gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZWFyLiB0eXBlIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfTkFNRSA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFJlcXVpcmVkIC0gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwIGNsaWVudC4gdHlwZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BUFBDTElFTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCAtIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIFdFQi4gdHlwZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09NUE9ORU5UX05BTUUgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5XRUJfQ09NUE9ORU5UX05BTUUiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogUmVxdWlyZWQgLSBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBFSkIuIHR5cGUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NPTVBPTkVOVF9OQU1FID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRUpCX0NPTVBPTkVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFJlcXVpcmVkIC0gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdG9yLiB0eXBlIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9DT01QT05FTlRfTkFNRSA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNPTk5FQ1RPUl9DT01QT05FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfVkVSU0lPTiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiI7IC8vJE5PTi1OTFMtMSQKLSAgIC8qKgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VKQiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9FSkIiOwotICAgIC8qKgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1dFQiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9XRUIiOwotICAgIC8qKgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FQUENMSUVOVCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9DTElFTlQiOwotICAgIC8qKgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0NPTk5FQ1RPUiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9DT05ORUNUT1IiOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBmb3IgdmFsaWRhdGlvbiBvbmx5OyB2YWxpZGF0ZXMgbm8gY29sbHNpb25zIGJldHdlZW4gdmFyaW91cyBtb2R1bGUgbmFtZXMuIERvIG5vdCBzZXQKLSAgICAgKiB0aGlzIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FX0NPTExJU0lPTlNfVkFMSURBVElPTiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLk1PRFVMRV9OQU1FX0NPTExJU0lPTlNfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVOQUJMRUQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfRUpCID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuTkVTVEVEX01PREVMX0VKQiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfV0VCID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuTkVTVEVEX01PREVMX1dFQiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfSkNBID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuTkVTVEVEX01PREVMX0pDQSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfTU9ERUxfQ0xJRU5UID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuTkVTVEVEX01PREVMX0NMSUVOVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9SVU5USU1FID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRkFDRVRfUlVOVElNRSI7Ly8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2U3NTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGJlaW5nIG1hZGUgcHVibGljLiAgUGxlYXNlIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN9IAotICogCi0gKiBAZGVwcmVjYXRlZAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSUxvb3NlQ29uZmlnQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSUxvb3NlQ29uZmlnQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDU5ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0lMb29zZUNvbmZpZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvb3NlQ29uZmlnQ29uc3RhbnRzIHsKLQkvKioKLQkgKiBUaGUgc2hvcnQgbmFtZSBvZiB0aGUgbG9vc2UgY29uZmlndXJhdGlvbiBmaWxlOyB3aWxsIG1vc3Qgb2Z0ZW4gbmVlZCB0byB1c2UKLQkgKiB7QGxpbmsgI0NPTkZJR19QQVRIfQotCSAqLwotCVN0cmluZyBDT05GSUdfRklMRV9OQU1FID0gImxvb3NlY29uZmlnLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKiogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLwotCVN0cmluZyBDT05GSUdfUEFUSCA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoQ09ORklHX0ZJTEVfTkFNRSkudG9PU1N0cmluZygpOwotCS8qKiBUaGUgcHJvcGVydHkgbmFtZSB1c2VkIGJ5IFdlYlNwaGVyZSB0byBsb29rdXAgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24gbG9jYXRpb24gdG8gbG9hZCAqLwotCVN0cmluZyBXQVNfUFJPUEVSVFkgPSBMb29zZUNvbmZpZ1JlZ2lzdGVyLkxPT1NFX0NPTkZJR19QUk9QRVJUWTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL0VBUlByb2plY3RNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkNTdkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL0VBUlByb2plY3RNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEVBUlByb2plY3RNYXAgZXh0ZW5kcyBFT2JqZWN0IHt9Ci0gKiBAZGVwcmVjYXRlZAotICogVXNlCi0gKiA8cD4KLSAqIAkJTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGludGVyZmFjZSBFQVJQcm9qZWN0TWFwIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1hcHBpbmdzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFV0aWxpdHlKQVJNYXBwaW5ncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0VXRpbGl0eUpBUk1hcHBpbmdzKCk7Ci0KLX0gLy9FQVJQcm9qZWN0TWFwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL0VBUlByb2plY3RNYXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL0VBUlByb2plY3RNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTNhODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIEVBUlByb2plY3RNYXBJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFQVJQcm9qZWN0TWFwLCBFT2JqZWN0IHt9Ci0gKiBAZGVwcmVjYXRlZAotICogVXNlCi0gKiA8cD4KLSAqIAkJTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGNsYXNzIEVBUlByb2plY3RNYXBJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFQVJQcm9qZWN0TWFwIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB1dGlsaXR5SkFSTWFwcGluZ3MgPSBudWxsOwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFQVJQcm9qZWN0TWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQVJQcm9qZWN0TWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWFwcGluZ3MoKSB7Ci0JCWlmIChtYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQltYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNb2R1bGVNYXBwaW5nLmNsYXNzLCB0aGlzLCBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRVdGlsaXR5SkFSTWFwcGluZ3MoKSB7Ci0JCWlmICh1dGlsaXR5SkFSTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJdXRpbGl0eUpBUk1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFV0aWxpdHlKQVJNYXBwaW5nLmNsYXNzLCB0aGlzLCBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiB1dGlsaXR5SkFSTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRVdGlsaXR5SkFSTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA6Ci0JCQkJcmV0dXJuIGdldE1hcHBpbmdzKCk7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19VVElMSVRZX0pBUl9NQVBQSU5HUyA6Ci0JCQkJcmV0dXJuIGdldFV0aWxpdHlKQVJNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA6Ci0JCQkJZ2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MgOgotCQkJCWdldFV0aWxpdHlKQVJNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXRpbGl0eUpBUk1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA6Ci0JCQkJZ2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTIDoKLQkJCQlnZXRVdGlsaXR5SkFSTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX01BUFBJTkdTIDoKLQkJCQlyZXR1cm4gbWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MgOgotCQkJCXJldHVybiB1dGlsaXR5SkFSTWFwcGluZ3MgIT0gbnVsbCAmJiAhdXRpbGl0eUpBUk1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vRUFSUHJvamVjdE1hcEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTk5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBNb2R1bGVNYXBwaW5nIGV4dGVuZHMgRU9iamVjdCB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiBOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZU1hcHBpbmcgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQcm9qZWN0TmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQcm9qZWN0TmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIE1vZHVsZSByZWZlcmVuY2UKLQkgKi8KLQlNb2R1bGUgZ2V0TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNb2R1bGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRNb2R1bGUoTW9kdWxlIHZhbHVlKTsKLQotfSAvL01vZHVsZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzZjhkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTW9kdWxlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1vZHVsZU1hcHBpbmcsIEVPYmplY3Qge30KLSAqICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiBOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1vZHVsZU1hcHBpbmcgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE5hbWUgPSBQUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZSBtb2R1bGUgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZU1hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgbmV3UHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZFByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JCXByb2plY3ROYW1lID0gbmV3UHJvamVjdE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5lSXNQcm94eSgpKSB7Ci0JCQlNb2R1bGUgb2xkTW9kdWxlID0gbW9kdWxlOwotCQkJbW9kdWxlID0gKE1vZHVsZSkgRWNvcmVVdGlsLnJlc29sdmUobW9kdWxlLCB0aGlzKTsKLQkJCWlmIChtb2R1bGUgIT0gb2xkTW9kdWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFLCBvbGRNb2R1bGUsIG1vZHVsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGUgYmFzaWNHZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlKE1vZHVsZSBuZXdNb2R1bGUpIHsKLQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJbW9kdWxlID0gbmV3TW9kdWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19NT0RVTEUsIG9sZE1vZHVsZSwgbW9kdWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlyZXR1cm4gUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TmFtZSAhPSBudWxsIDogIVBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE5hbWUpOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19NT0RVTEUgOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlzZXRQcm9qZWN0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19NT0RVTEUgOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlzZXRQcm9qZWN0TmFtZShQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFIDoKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNb2R1bGVNYXBwaW5nSW1wbF9VSV8wIiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Nb2R1bGVNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM0ZGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBNb2R1bGVtYXBBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVtYXBBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZW1hcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVtYXBTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgTW9kdWxlbWFwU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVNYXBwaW5nKE1vZHVsZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVBUlByb2plY3RNYXAoRUFSUHJvamVjdE1hcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQVJQcm9qZWN0TWFwQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlVXRpbGl0eUpBUk1hcHBpbmcoVXRpbGl0eUpBUk1hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVXRpbGl0eUpBUk1hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLiBJdCdzIHVzZWZ1bCB0bwotCSAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVdGlsaXR5SkFSTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01vZHVsZW1hcEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ExZjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIE1vZHVsZW1hcEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlbWFwRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kdWxlbWFwRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUFSUHJvamVjdE1hcCB2YWx1ZQotCSAqLwotCUVBUlByb2plY3RNYXAgY3JlYXRlRUFSUHJvamVjdE1hcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIE1vZHVsZU1hcHBpbmcgdmFsdWUKLQkgKi8KLQlNb2R1bGVNYXBwaW5nIGNyZWF0ZU1vZHVsZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBVdGlsaXR5SkFSTWFwcGluZyB2YWx1ZQotCSAqLwotCVV0aWxpdHlKQVJNYXBwaW5nIGNyZWF0ZVV0aWxpdHlKQVJNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlNb2R1bGVtYXBQYWNrYWdlIGdldE1vZHVsZW1hcFBhY2thZ2UoKTsKLQotfSAvL01vZHVsZW1hcEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxMzJmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTW9kdWxlbWFwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2R1bGVtYXBGYWN0b3J5LCBFRmFjdG9yeSB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVtYXBGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1vZHVsZW1hcEZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HIDoKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlTWFwcGluZygpOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUCA6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVBUlByb2plY3RNYXAoKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HIDoKLQkJCQlyZXR1cm4gY3JlYXRlVXRpbGl0eUpBUk1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUFSUHJvamVjdE1hcCBjcmVhdGVFQVJQcm9qZWN0TWFwKCkgewotCQlFQVJQcm9qZWN0TWFwSW1wbCBlYXJQcm9qZWN0TWFwID0gbmV3IEVBUlByb2plY3RNYXBJbXBsKCk7Ci0JCXJldHVybiBlYXJQcm9qZWN0TWFwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNb2R1bGVNYXBwaW5nIGNyZWF0ZU1vZHVsZU1hcHBpbmcoKSB7Ci0JCU1vZHVsZU1hcHBpbmdJbXBsIG1vZHVsZU1hcHBpbmcgPSBuZXcgTW9kdWxlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIG1vZHVsZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFV0aWxpdHlKQVJNYXBwaW5nIGNyZWF0ZVV0aWxpdHlKQVJNYXBwaW5nKCkgewotCQlVdGlsaXR5SkFSTWFwcGluZ0ltcGwgdXRpbGl0eUpBUk1hcHBpbmcgPSBuZXcgVXRpbGl0eUpBUk1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiB1dGlsaXR5SkFSTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlbWFwUGFja2FnZSBnZXRNb2R1bGVtYXBQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZHVsZW1hcFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVtYXBQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Nb2R1bGVtYXBGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhNWFlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0vL2ltcG9ydCBjb20uaWJtLmV0b29scy5qMmVlLmludGVybmFsLnByb2plY3QuRUFSRWRpdE1vZGVsOwotLyoqCi0qIEBkZXByZWNhdGVkCi0qIFVzZQotKiA8cD4KLSogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0qIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSovCi0KLXB1YmxpYyBjbGFzcyBNb2R1bGVtYXBJbml0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpbnZva2VQcmVyZXFJbml0cyhzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKTsKLQkJCWlmIChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJtb2R1bGVtYXAueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCQkJCQkJcmV0dXJuIE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQkJCQkJCXJldHVybiBNb2R1bGVtYXBGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJfQotCQkJLy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5yZWdpc3RlckRlcGVuZGVuY3koSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUklfT0JKLCBFQVJFZGl0TW9kZWwuTU9EVUxFX01BUF9VUklfT0JKKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VQcmVyZXFJbml0cyhib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJLy9UT0RPIFNob3VsZCByZW1vdmUuLi4uCi0JCS8vY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5pbml0LkV4dGVuc2lvbnNJbml0LmluaXQoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4ZjczYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIE1vZHVsZW1hcFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiBOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZW1hcFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtb2R1bGVtYXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9QUk9KRUNUX01BUCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9NQVBQSU5HID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9NQVBQSU5HX19NT0RVTEUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Nb2R1bGUgTWFwcGluZzwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FQVIgUHJvamVjdCBNYXA8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVBUl9QUk9KRUNUX01BUF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVVElMSVRZX0pBUl9NQVBQSU5HID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVRJTElUWV9KQVJfTUFQUElOR19fUFJPSkVDVF9OQU1FID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVRJTElUWV9KQVJfTUFQUElOR19fVVJJID0gMTsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5VdGlsaXR5IEpBUiBNYXBwaW5nPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVVElMSVRZX0pBUl9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJtb2R1bGVtYXAueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibW9kdWxlbWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZW1hcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFQVJQcm9qZWN0TWFwIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFQVJQcm9qZWN0TWFwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVBUlByb2plY3RNYXBfTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUFSUHJvamVjdE1hcF9VdGlsaXR5SkFSTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBNb2R1bGVNYXBwaW5nIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNb2R1bGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBVdGlsaXR5SkFSTWFwcGluZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0VXRpbGl0eUpBUk1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXRpbGl0eUpBUk1hcHBpbmdfVXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlNb2R1bGVtYXBGYWN0b3J5IGdldE1vZHVsZW1hcEZhY3RvcnkoKTsKLQotfSAvL01vZHVsZW1hcFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNzhkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLQotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTW9kdWxlbWFwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNb2R1bGVtYXBQYWNrYWdlLCBFUGFja2FnZSB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVtYXBQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1vZHVsZW1hcFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlYXJQcm9qZWN0TWFwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1dGlsaXR5SkFSTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIE1vZHVsZW1hcFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNb2R1bGVtYXBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVtYXBQYWNrYWdlIGluaXQoKSB7Ci0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlDb21tb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwuaW5pdCgpOwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlIGFuZCBpbnRlcmRlcGVuZGVuY2llcwotCQlNb2R1bGVtYXBQYWNrYWdlSW1wbCB0aGVNb2R1bGVtYXBQYWNrYWdlID0gKE1vZHVsZW1hcFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IE1vZHVsZW1hcFBhY2thZ2VJbXBsKCkpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVNb2R1bGVtYXBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFN0ZXAgMjogY29tcGxldGUgaW5pdGlhbGl6YXRpb24KLQkJdGhlTW9kdWxlbWFwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJcmV0dXJuIHRoZU1vZHVsZW1hcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFQVJQcm9qZWN0TWFwKCkgewotCQlyZXR1cm4gZWFyUHJvamVjdE1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGVhclByb2plY3RNYXBFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUFSUHJvamVjdE1hcF9VdGlsaXR5SkFSTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZWFyUHJvamVjdE1hcEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBtb2R1bGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbW9kdWxlTWFwcGluZ0VDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVNYXBwaW5nX01vZHVsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtb2R1bGVNYXBwaW5nRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VXRpbGl0eUpBUk1hcHBpbmcoKSB7Ci0JCXJldHVybiB1dGlsaXR5SkFSTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVdGlsaXR5SkFSTWFwcGluZ19Qcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB1dGlsaXR5SkFSTWFwcGluZ0VDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVdGlsaXR5SkFSTWFwcGluZ19VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEZhY3RvcnkgZ2V0TW9kdWxlbWFwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2R1bGVtYXBGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24KLQkgKiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQltb2R1bGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVNYXBwaW5nRUNsYXNzLCBNT0RVTEVfTUFQUElOR19fUFJPSkVDVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVNYXBwaW5nRUNsYXNzLCBNT0RVTEVfTUFQUElOR19fTU9EVUxFKTsKLQotCQllYXJQcm9qZWN0TWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVBUl9QUk9KRUNUX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWFyUHJvamVjdE1hcEVDbGFzcywgRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWFyUHJvamVjdE1hcEVDbGFzcywgRUFSX1BST0pFQ1RfTUFQX19VVElMSVRZX0pBUl9NQVBQSU5HUyk7Ci0KLQkJdXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVRJTElUWV9KQVJfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MsIFVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MsIFVUSUxJVFlfSkFSX01BUFBJTkdfX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUKLQkgKiBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCS8vCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0KLQkJLy8gKENvbW1vblBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCS8vCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPQotCQkvLyAoSmF2YVJlZlBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCS8vCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9Ci0JCS8vIChFY29yZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhtb2R1bGVNYXBwaW5nRUNsYXNzLCBNb2R1bGVNYXBwaW5nLmNsYXNzLCAiTW9kdWxlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlTWFwcGluZ19Qcm9qZWN0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvamVjdE5hbWUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVNYXBwaW5nX01vZHVsZSgpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGUiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWFyUHJvamVjdE1hcEVDbGFzcywgRUFSUHJvamVjdE1hcC5jbGFzcywgIkVBUlByb2plY3RNYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVBUlByb2plY3RNYXBfTWFwcGluZ3MoKSwgdGhpcy5nZXRNb2R1bGVNYXBwaW5nKCksIG51bGwsICJtYXBwaW5ncyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFQVJQcm9qZWN0TWFwX1V0aWxpdHlKQVJNYXBwaW5ncygpLCB0aGlzLmdldFV0aWxpdHlKQVJNYXBwaW5nKCksIG51bGwsICJ1dGlsaXR5SkFSTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHV0aWxpdHlKQVJNYXBwaW5nRUNsYXNzLCBVdGlsaXR5SkFSTWFwcGluZy5jbGFzcywgIlV0aWxpdHlKQVJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRVdGlsaXR5SkFSTWFwcGluZ19Qcm9qZWN0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvamVjdE5hbWUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRVdGlsaXR5SkFSTWFwcGluZ19VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLX0gLy9Nb2R1bGVtYXBQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWRmNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBNb2R1bGVtYXBTd2l0Y2gge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZW1hcFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZW1hcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZW1hcFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HIDogewotCQkJCQlNb2R1bGVNYXBwaW5nIG1vZHVsZU1hcHBpbmcgPSAoTW9kdWxlTWFwcGluZykgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGVNYXBwaW5nKG1vZHVsZU1hcHBpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUCA6IHsKLQkJCQkJRUFSUHJvamVjdE1hcCBlYXJQcm9qZWN0TWFwID0gKEVBUlByb2plY3RNYXApIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUFSUHJvamVjdE1hcChlYXJQcm9qZWN0TWFwKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HIDogewotCQkJCQlVdGlsaXR5SkFSTWFwcGluZyB1dGlsaXR5SkFSTWFwcGluZyA9IChVdGlsaXR5SkFSTWFwcGluZykgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVdGlsaXR5SkFSTWFwcGluZyh1dGlsaXR5SkFSTWFwcGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQVJQcm9qZWN0TWFwKEVBUlByb2plY3RNYXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZU1hcHBpbmcoTW9kdWxlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVXRpbGl0eUpBUk1hcHBpbmcoVXRpbGl0eUpBUk1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kdWxlbWFwU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL1V0aWxpdHlKQVJNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL1V0aWxpdHlKQVJNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjM1NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBVdGlsaXR5SkFSTWFwcGluZyBleHRlbmRzIEVPYmplY3Qge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFV0aWxpdHlKQVJNYXBwaW5nIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUHJvamVjdE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUHJvamVjdE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotfSAvL1V0aWxpdHlKQVJNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL1V0aWxpdHlKQVJNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNTQ1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL1V0aWxpdHlKQVJNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBVdGlsaXR5SkFSTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFV0aWxpdHlKQVJNYXBwaW5nLCBFT2JqZWN0IHt9Ci0gKiBAZGVwcmVjYXRlZAotICogVXNlCi0gKiA8cD4KLSAqIE5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsaXR5SkFSTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFV0aWxpdHlKQVJNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE5hbWUoKSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmkgPSBVUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVXRpbGl0eUpBUk1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFV0aWxpdHlKQVJNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19VUkkgOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlyZXR1cm4gUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TmFtZSAhPSBudWxsIDogIVBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE5hbWUpOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1VSSSA6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJc2V0UHJvamVjdE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19VUkkgOgotCQkJCXNldFVyaSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19QUk9KRUNUX05BTUUgOgotCQkJCXNldFByb2plY3ROYW1lKFBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1VSSSA6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVdGlsaXR5SkFSTWFwcGluZ0ltcGxfVUlfMCIsIG5ldyBPYmplY3RbXXtwcm9qZWN0TmFtZSwgdXJpfSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9VdGlsaXR5SkFSTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvRWFyRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0VhckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlkYjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvRWFyRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEFkYXB0cyB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9cyB0bwotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVBUkFydGlmYWN0RWRpdH0mbmJzcDsgZmFjYWRlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEVhckVkaXRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0KLQkJaWYgKGFkYXB0ZXJUeXBlID09IEVBUkFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUgfHwgYWRhcHRlclR5cGUgPT0gQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3Q7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpKQotCQkJCXJldHVybiBuZXcgRUFSQXJ0aWZhY3RFZGl0KChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzW117QXJ0aWZhY3RFZGl0LmNsYXNzLCBFQVJBcnRpZmFjdEVkaXQuY2xhc3N9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWFyTW9kdWxlRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWMwZGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWFyTW9kdWxlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkltcG9ydE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWFyTW9kdWxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIFJldHVybiBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSURhdGFNb2RlbCBjcmVhdGVQcm9qZWN0RGF0YU1vZGVsKCk7Ci0KLQlJRGF0YU1vZGVsIGNyZWF0ZUltcG9ydERhdGFNb2RlbCgpOwotCi0JSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpOwotCi0JSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSW1wb3J0T3B0aW9uIG9wdGlvbik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWFyTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcxMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWFyTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkltcG9ydE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFYXJNb2R1bGVFeHRlbnNpb25JbXBsIGltcGxlbWVudHMgRWFyTW9kdWxlRXh0ZW5zaW9uIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVhck1vZHVsZUV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lYXIub3BlcmF0aW9ucy5JbXBvcnRPcHRpb24pCi0JICovCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKEltcG9ydE9wdGlvbiBvcHRpb24pIHsKLQkJaWYgKG9wdGlvbi5nZXRBcmNoaXZlVHlwZSgpID09IEltcG9ydE9wdGlvbi5NT0RVTEUpCi0JCQlyZXR1cm4gb3B0aW9uLmdldE1vZGVsKCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOWVkMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9FYXJNb2R1bGVFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTkFNRSA9ICJFQVJNb2R1bGVFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0VBUk1PRFVMRV9FWFRFTlNJT04gPSAiZWFyTW9kdWxlRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VYVEVOU0lPTl9DTEFTUyA9ICJleHRlbnNpb25DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBFYXJNb2R1bGVFeHRlbnNpb25SZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgRWFyTW9kdWxlRXh0ZW5zaW9uUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKEoyRUVQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFYXJNb2R1bGVFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IEVhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHcvIGFuIGV4dGVuc2lvbiBsaWtlOiA8ZWFyTW9kdWxlRXh0ZW5zaW9uIGV4dGVuc2lvbkNsYXNzID0KLQkgKiAiY29tLmlibS5ldG9vbHMud2ViLnBsdWdpbi5XZWJNb2R1bGVFeHRlbnNpb25JbXBsIi8+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9FQVJNT0RVTEVfRVhURU5TSU9OKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFYXJNb2R1bGVFeHRlbnNpb24gZXh0ZW5zaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWV4dGVuc2lvbiA9IChFYXJNb2R1bGVFeHRlbnNpb24pIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihNT0RVTEVfRVhURU5TSU9OX0NMQVNTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCkKLQkJCWFkZE1vZHVsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTW9kdWxlRXh0ZW5zaW9uKEVhck1vZHVsZUV4dGVuc2lvbiBleHQpIHsKLQkJRWFyTW9kdWxlTWFuYWdlci5yZWdpc3Rlck1vZHVsZUV4dGVuc2lvbihleHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9FYXJNb2R1bGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkMmNmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFYXJNb2R1bGVNYW5hZ2VyIHsKLQlzdGF0aWMgSGFzaE1hcCBtb2R1bGVFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBnZXRNb2R1bGVFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gbW9kdWxlRXh0ZW5zaW9uczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVhck1vZHVsZUV4dGVuc2lvbiBnZXRNb2R1bGVFeHRlbnNpb24oU3RyaW5nIGtleSkgewotCQkvL01ha2Ugc3VyZSB0aGUgcmVnaXN0cnkgaXMgbG9hZGVkCi0JCUVhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiAoRWFyTW9kdWxlRXh0ZW5zaW9uKSBtb2R1bGVFeHRlbnNpb25zLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYk1vZHVsZUV4dGVuc2lvbiBnZXRFSkJNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRWpiTW9kdWxlRXh0ZW5zaW9uKSBnZXRNb2R1bGVFeHRlbnNpb24oSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FNb2R1bGVFeHRlbnNpb24gZ2V0SkNBTW9kdWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gKEpjYU1vZHVsZUV4dGVuc2lvbikgZ2V0TW9kdWxlRXh0ZW5zaW9uKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpDQSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViTW9kdWxlRXh0ZW5zaW9uIGdldFdlYk1vZHVsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChXZWJNb2R1bGVFeHRlbnNpb24pIGdldE1vZHVsZUV4dGVuc2lvbihKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0VKQk1vZHVsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChFamJNb2R1bGVFeHRlbnNpb24pIGdldE1vZHVsZUV4dGVuc2lvbihKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0pDQU1vZHVsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChKY2FNb2R1bGVFeHRlbnNpb24pIGdldE1vZHVsZUV4dGVuc2lvbihKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1dlYk1vZHVsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGdldE1vZHVsZUV4dGVuc2lvbihKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJNb2R1bGVFeHRlbnNpb24oRWFyTW9kdWxlRXh0ZW5zaW9uIGV4dCkgewotCQlpZiAoZXh0IGluc3RhbmNlb2YgV2ViTW9kdWxlRXh0ZW5zaW9uKQotCQkJbW9kdWxlRXh0ZW5zaW9ucy5wdXQoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIsIGV4dCk7Ci0JCWVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIEVqYk1vZHVsZUV4dGVuc2lvbikKLQkJCW1vZHVsZUV4dGVuc2lvbnMucHV0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQiwgZXh0KTsKLQkJZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgSmNhTW9kdWxlRXh0ZW5zaW9uKQotCQkJbW9kdWxlRXh0ZW5zaW9ucy5wdXQoSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBLCBleHQpOwotCQllbHNlCi0JCQltb2R1bGVFeHRlbnNpb25zLnB1dChKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OLCBleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb2R1bGVFeHRlbnNpb24oU3RyaW5nIGtleSkgewotCQltb2R1bGVFeHRlbnNpb25zLnJlbW92ZShrZXkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWpiTW9kdWxlRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0VqYk1vZHVsZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmE3OGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWpiTW9kdWxlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBFamJNb2R1bGVFeHRlbnNpb24gZXh0ZW5kcyBFYXJNb2R1bGVFeHRlbnNpb24gewotCi0JLy92b2lkIGluaXRpYWxpemVFamJSZWZlcmVuY2VzVG9Nb2R1bGUoSjJFRU5hdHVyZSBuYXR1cmUsIFVwZGF0ZU1vZHVsZVJlZmVyZW5jZXNJbkVBUlByb2plY3RDb21tYW5kIGNtZCk7Ci0KLQkvL0oyRUVKYXZhUHJvamVjdEluZm8gY3JlYXRlUHJvamVjdEluZm8oKTsKLQotCS8vSjJFRUltcG9ydE9wZXJhdGlvbk9MRCBjcmVhdGVJbXBvcnRPcGVyYXRpb24oSVByb2plY3QgcHJvaiwgRUpCSmFyRmlsZSBlamJKYXJGaWxlKTsKLQotCUVKQkphciBnZXRFSkJKYXIoSVByb2plY3QgYVByb2plY3QpOwotCi0JSVByb2plY3QgZ2V0RGVmaW5lZEVKQkNsaWVudEpBUlByb2plY3QoSVByb2plY3QgYW5FSkJQcm9qZWN0KTsKLQotCUlEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlRUpCQ2xpZW50SkFSUHJvamVjdCgKLQkJCWZpbmFsIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSwKLQkJCWZpbmFsIFN0cmluZyBzcmNGb2xkZXJOYW1lLAotCQkJZmluYWwgU3RyaW5nIGVqYlByb2plY3ROYW1lLAotCQkJZmluYWwgU3RyaW5nIGVhclByb2plY3ROYW1lLAotCQkJZmluYWwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lKTsKLQkKLQlJRGF0YU1vZGVsT3BlcmF0aW9uIGNyZWF0ZUVKQkNsaWVudEpBUlByb2plY3QoSVByb2plY3QgZWpiUHJvamVjdCk7CQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9KY2FNb2R1bGVFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vSmNhTW9kdWxlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2E5Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9KY2FNb2R1bGVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb247Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLlVwZGF0ZU1vZHVsZVJlZmVyZW5jZXNJbkVBUlByb2plY3RDb21tYW5kOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFTmF0dXJlOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpjYU1vZHVsZUV4dGVuc2lvbiBleHRlbmRzIEVhck1vZHVsZUV4dGVuc2lvbiB7Ci0KLQkvL3ZvaWQgaW5pdGlhbGl6ZUVqYlJlZmVyZW5jZXNUb01vZHVsZShKMkVFTmF0dXJlIG5hdHVyZSwgVXBkYXRlTW9kdWxlUmVmZXJlbmNlc0luRUFSUHJvamVjdENvbW1hbmQgY21kKTsKLQotCS8vSjJFRUphdmFQcm9qZWN0SW5mbyBjcmVhdGVQcm9qZWN0SW5mbygpOwotCi0JLy9KMkVFSW1wb3J0T3BlcmF0aW9uIGNyZWF0ZUltcG9ydE9wZXJhdGlvbihJUHJvamVjdCBwcm9qLCBSQVJGaWxlIHJhckZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9XZWJNb2R1bGVFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vV2ViTW9kdWxlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOWE1ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9XZWJNb2R1bGVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVKYXZhUHJvamVjdEluZm87Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViTW9kdWxlRXh0ZW5zaW9uIGV4dGVuZHMgRWFyTW9kdWxlRXh0ZW5zaW9uIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VUVElOR1NfRklMRV9VUkkgPSAiLmoyZWUiOyAvLyROT04tTkxTLTEkCi0KLS8vCXZvaWQgaW5pdGlhbGl6ZUVqYlJlZmVyZW5jZXNUb01vZHVsZShKMkVFTmF0dXJlIG5hdHVyZSwgVXBkYXRlTW9kdWxlUmVmZXJlbmNlc0luRUFSUHJvamVjdENvbW1hbmQgY29tbWFuZCk7Ci0KLQl2b2lkIGFkZFdMUFByb2plY3RzKElQcm9qZWN0IGFQcm9qZWN0LCBTZXQgcHJvamVjdHNUb0J1aWxkKTsKLQotCi0Jdm9pZCBzZXRDb250ZXh0Um9vdEZvck1vZHVsZU1hcHBpbmcoV2ViTW9kdWxlIG0sIElQcm9qZWN0IG5lc3RlZFByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLy9KMkVFSW1wb3J0T3BlcmF0aW9uT0xEIGNyZWF0ZUltcG9ydE9wZXJhdGlvbihJUHJvamVjdCBuZXN0ZWRQcm9qZWN0LCBXQVJGaWxlIHdhckZpbGUsCi0JLy8gRUFSSW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRDb25maWcpOwotCi0JU3RyaW5nIGdldENvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgSUZpbGUgd2ViU2V0dGluZ3NGaWxlKTsKLQotCUoyRUVKYXZhUHJvamVjdEluZm8gY3JlYXRlUHJvamVjdEluZm8oKTsKLQotCWJvb2xlYW4gY29tcGFyZVdlYkNvbnRleHRSb290KE1vZHVsZSBtb2R1bGUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTAxMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotCi1wdWJsaWMgY2xhc3MgRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIEVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCUNvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpOwotICAgICAgICBzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2JkYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSVV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHVibGljIFV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX0lELmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gVVRJTElUWTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRFVMRV9VUkkpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpLnJlcGxhY2UoJyAnLCAnXycpOwotCQkJcmV0dXJuIHByb2plY3ROYW1lICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKLQkJfQotCQllbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBDT05GSUdfRk9MREVSICkgKQotCQl7Ci0JCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyAKLQkJICAgICAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLQkJICAgIAotCQkgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IGZwandjLmdldEZhY2V0ZWRQcm9qZWN0KCk7Ci0JCSAgICAKLQkJICAgIGlmKCBmcGouaGFzUHJvamVjdEZhY2V0KCBKYXZhRmFjZXQuRkFDRVQgKSApCi0JCSAgICB7Ci0JCSAgICAgICAgdHJ5Ci0JCSAgICAgICAgewotICAgIAkJICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganBqID0gSmF2YUNvcmUuY3JlYXRlKCBmcGouZ2V0UHJvamVjdCgpICk7Ci0gICAgCQkgICAgICAgIAotICAgIAkJICAgICAgICBmb3IoIElDbGFzc3BhdGhFbnRyeSBjcGUgOiBqcGouZ2V0UmF3Q2xhc3NwYXRoKCkgKQotICAgIAkJICAgICAgICB7Ci0gICAgCQkgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFICkKLSAgICAJCSAgICAgICAgICAgIHsKLSAgICAJCSAgICAgICAgICAgICAgICByZXR1cm4gY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKCAxICkudG9Qb3J0YWJsZVN0cmluZygpOwotICAgIAkJICAgICAgICAgICAgfQotICAgIAkJICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjYTg2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSBwdWJsaWMgQVBJLiAgUGxlYXNlIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN9IAotICogCi0gKiBAZGVwcmVjYXRlZAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIEVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRhNTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VBUkZhY2V0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFQVJGYWNldFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFQVJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFQVJfMTIgPSBFQVJfRkFDRVQuZ2V0VmVyc2lvbigiMS4yIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVBUl8xMyA9IEVBUl9GQUNFVC5nZXRWZXJzaW9uKCIxLjMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRUFSXzE0ID0gRUFSX0ZBQ0VULmdldFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCi0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjk0OTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Lld0cFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFYXJGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBmaW5hbCBPYmplY3QgY2ZnLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjZmc7Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJCS8vIEFkZCBXVFAgbmF0dXJlcy4KLQotCQkJV3RwVXRpbHMuYWRkTmF0dXJlc3RvRUFSKHByb2plY3QpOwotCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZmFsc2UpOwotCQkJYy5jcmVhdGUoMCwgbnVsbCk7Ci0KLQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGVhcnJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCWVhcnJvb3QuY3JlYXRlTGluayhuZXcgUGF0aCgiLyIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URU5UX0RJUikpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWVhcnJvb3QuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgdmVyID0gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotCQkJCWludCBuVmVyID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQodmVyKTsKLQkJCQlFQVJBcnRpZmFjdEVkaXQuY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgblZlcik7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNWNhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0KLQkJCVNldCBkZXBlbmRlbnRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0cy5hZGRBbGwoKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfUFJPSkVDVFNfTElTVCkpOwotCQkJZGVwZW5kZW50UHJvamVjdHMuYWRkQWxsKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BST0pFQ1RfTElTVCkpOwotCQkJaWYgKCFkZXBlbmRlbnRQcm9qZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGRlcGVuZGVudENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KGRlcGVuZGVudFByb2plY3RzLnNpemUoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlcGVuZGVudFByb2plY3RzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2plY3QgZGVwUHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlJVmlydHVhbENvbXBvbmVudCBkZXBDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZGVwUHJvamVjdCk7Ci0JCQkJCWlmIChkZXBDb21wID09IG51bGwpIHsKLQkJCQkJCUphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uIHV0aWxPcCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZUZsZXhKYXZhUHJvamVjdEZvclByb2plY3RPcGVyYXRpb24oZGVwUHJvamVjdCk7Ci0JCQkJCQl1dGlsT3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCQkJCWRlcENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChkZXBQcm9qZWN0KTsKLQkJCQkJfQotCi0JCQkJCWRlcGVuZGVudENvbXBvbmVudHMuYWRkKGRlcENvbXApOwotCQkJCX0KLQotCQkJCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBjKTsKLQkJCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCW1vZExpc3QuYWRkQWxsKGRlcGVuZGVudENvbXBvbmVudHMpOwotCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKLQkJCQl0cnkgewotCQkJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UnVudGltZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UnVudGltZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkMTBjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFJ1bnRpbWVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEVhckZhY2V0UnVudGltZUhhbmRsZXIgCi17Ci0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4gVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgRWFyRmFjZXRSdW50aW1lSGFuZGxlcigpIHt9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1vZHVsZVByb2plY3RSdW50aW1lKCBmaW5hbCBJUHJvamVjdCBlYXJQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgbW9kdWxlUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGVhckZhY2V0ZWRQcm9qZWN0Ci0gICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIGVhclByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBlYXJSdW50aW1lID0gZWFyRmFjZXRlZFByb2plY3QuZ2V0UnVudGltZSgpOwotICAgIAotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IG1vZHVsZUZhY2V0ZWRQcm9qZWN0IAotICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBtb2R1bGVQcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtb2R1bGVGYWNldGVkUHJvamVjdCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICEgZXF1YWxzKCBlYXJSdW50aW1lLCBtb2R1bGVGYWNldGVkUHJvamVjdC5nZXRSdW50aW1lKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGVhclJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZUZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKS5pdGVyYXRvcigpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIGVhclJ1bnRpbWUuc3VwcG9ydHMoIGZ2ZXIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc3VwcG9ydHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRmFjZXRlZFByb2plY3Quc2V0UnVudGltZSggZWFyUnVudGltZSwgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNb2R1bGVQcm9qZWN0UnVudGltZSggZmluYWwgSVByb2plY3QgZWFyUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldCBtb2R1bGVQcm9qZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgbW9kdWxlUHJvamVjdHMuc2l6ZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZVByb2plY3RzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gKElQcm9qZWN0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVwZGF0ZU1vZHVsZVByb2plY3RSdW50aW1lKCBlYXJQcm9qZWN0LCBtb2R1bGVQcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUnVudGltZUNoYW5nZWREZWxlZ2F0ZQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjZmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxMCApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICB0cnkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgbGlzdCBvZiBwcm9qZWN0cyByZWZlcmVuY2VkIGJ5IHRoaXMgZWFyIHByb2plY3QuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU2V0IG1vZHVsZVByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXJ2YyAKLSAgICAgICAgICAgICAgICAgICAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggcHJvamVjdCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gdnJlZnMgPSBlYXJ2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB2cmVmcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSB2cmVmID0gdnJlZnNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmMgPSB2cmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3RzLmFkZCggdmMuZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHJ1bnRpbWUgZm9yIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlTW9kdWxlUHJvamVjdFJ1bnRpbWUoIHByb2plY3QsIG1vZHVsZVByb2plY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9uKCBtb25pdG9yLCA5ICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBzdWJtb24oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGlja3MgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggcGFyZW50ID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvciggcGFyZW50LCB0aWNrcyApICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iajIgKQotICAgIHsKLSAgICAgICAgaWYoIG9iajEgPT0gb2JqMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqMS5lcXVhbHMoIG9iajIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGVjM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRWFyRmFjZXRWYWxpZGF0b3IKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCAKLSAgICAgICAgPSBKMkVFUGx1Z2luLlBMVUdJTl9JRCArICIuZGlmZmVyZW50UnVudGltZXNEZXRlY3RlZCI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZjIAotICAgICAgICAgICAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggZnByb2ouZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdmMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiggZnByb2ouaGFzUHJvamVjdEZhY2V0KCBFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZnByb2ouZ2V0UHJvamVjdCgpLmRlbGV0ZU1hcmtlcnMoIE1BUktFUl9JRCwgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9aRVJPICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IHZjLmdldFJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSByZWZzWyBpIF07Ci0gICAgICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmdmMgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCByZWZ2YyAhPSBudWxsICYmICFyZWZ2Yy5pc0JpbmFyeSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcmVmcGogPSByZWZ2Yy5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlKCBmcHJvaiwgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCByZWZwaiApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnRbXSByZWZlcmVuY2luZyAKLSAgICAgICAgICAgICAgICA9IHZjLmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHJlZmVyZW5jaW5nLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCByZWZ2YyA9IHJlZmVyZW5jaW5nWyBpIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IHJlZmZwagotICAgICAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcmVmdmMuZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJlZmZwai5oYXNQcm9qZWN0RmFjZXQoIEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUoIHJlZmZwaiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoIGZpbmFsIElGYWNldGVkUHJvamVjdCBlYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgbW9kdWxlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUnVudGltZSBlYXJSdW50aW1lID0gZWFyLmdldFJ1bnRpbWUoKTsKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgbW9kdWxlUnVudGltZSA9IG1vZHVsZS5nZXRSdW50aW1lKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggZWFyUnVudGltZSA9PSBudWxsICYmIG1vZHVsZVJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCB0aGlzIGFsc28gYmUgYSB3YXJuaW5nPwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGVhclJ1bnRpbWUgIT0gbnVsbCAmJiBtb2R1bGVSdW50aW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgdGhpcyBhbHNvIGJlIGEgd2FybmluZz8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBlYXJSdW50aW1lICE9IG51bGwgJiYgbW9kdWxlUnVudGltZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICEgZWFyUnVudGltZS5lcXVhbHMoIG1vZHVsZVJ1bnRpbWUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMudGFyZ2V0aW5nRGlmZmVyZW50UnVudGltZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSU1hcmtlciBtID0gZWFyLmNyZWF0ZVdhcm5pbmdNYXJrZXIoIE1BUktFUl9JRCwgbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCAibW9kdWxlUHJvamVjdCIsIG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBtLnNldEF0dHJpYnV0ZSggInJ1bnRpbWUxIiwgZWFyLmdldFJ1bnRpbWUoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCAicnVudGltZTIiLCBtb2R1bGUuZ2V0UnVudGltZSgpLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldGluZ0RpZmZlcmVudFJ1bnRpbWVzOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRWFyRmFjZXRWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmFsaWRhdG9yLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGIzZDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmFsaWRhdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi10YXJnZXRpbmdEaWZmZXJlbnRSdW50aW1lcyA9IFJlZmVyZW5jZWQgbW9kdWxlIHByb2plY3QgezB9IGlzIHRhcmdldGluZyBhIGRpZmZlcmVudCBydW50aW1lLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjFlNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFdhcm5pbmcgY2xlYW4tdXAgMTIvMDUvMjAwNQotICovICAgCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFYXJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgIC8qKgotICAgICAgICAgICogV2FybmluZyBjbGVhbi11cCAxMi8wNS8yMDA1Ci0gICAgICAgICAgKi8gICAKLSAgICAgICAgICAgIC8vZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIGZpbmFsIFN0cnVjdHVyZUVkaXQgZWRpdCAKLS8vICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoIHByb2plY3QgKTsKLS8vICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIHRyeQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnRUeXBlIG9sZGN0eXBlIAotLy8gICAgICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnRUeXBlKCBjICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudFR5cGUgbmV3Y3R5cGUgCi0vLyAgICAgICAgICAgICAgICAgICAgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRDb21wb25lbnRUeXBlSWQoIG9sZGN0eXBlLmdldENvbXBvbmVudFR5cGVJZCgpICk7Ci0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRWZXJzaW9uKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLS8vICAgICAgICAgICAgICAgIG5ld2N0eXBlLmdldFByb3BlcnRpZXMoKS5hZGRBbGwoIG9sZGN0eXBlLmdldFByb3BlcnRpZXMoKSApOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVFZGl0LnNldENvbXBvbmVudFR5cGUoIGMsIG5ld2N0eXBlICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGVkaXQuc2F2ZUlmTmVjZXNzYXJ5KCBudWxsICk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZmluYWxseQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBlZGl0LmRpc3Bvc2UoKTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiZDMwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UT19FQVIgPSAiSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM0NGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCS8qKgotCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgSXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBhbmQgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBfcHJvdmlkZXJfY2xhc3MgPSBKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0NBVElPTiA9ICJJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9QUk9KRUNUX05BTUUgPSAiSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRSA9ICJJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUUiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0ZPTERFUiA9ICJJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOwkvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE1MjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgQVBJIGFuZCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBkMGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIGEgY29tbW9uIHN1cGVyIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW9uIG9mIFdUUCBDb21wb25lbnRzLgotICogCi0gKiBUaGlzIGNsYXNzIChhbmQgYWxsIGl0cyBmaWVsZHMgYW5kIG1ldGhvZHMpIGlzIGxpa2VseSB0byBjaGFuZ2UgZHVyaW5nIHRoZSBXVFAgMS4wIG1pbGVzdG9uZXMgYXMKLSAqIHRoZSBuZXcgcHJvamVjdCBzdHJ1Y3R1cmVzIGFyZSBhZG9wdGVkLiBVc2UgYXQgeW91ciBvd24gcmlzay4KLSAqIAotICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBRERfVE9fRUFSKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKSB7Ci0JCQlldmVudC5nZXREYXRhTW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmNiOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0KLQotCXB1YmxpYyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0KLQotCi0JCUlEYXRhTW9kZWwgamRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCi0JCWpkbS5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0KLQkJamRtLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgZ2V0SmF2YUZhY2V0VmVyc2lvbigpICk7IAkKLQotCQlJRGF0YU1vZGVsIHVkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCXRyeSB7Ci0JCQlpZihtb2RlbC5pc1Byb3BlcnR5U2V0KEFERF9UT19FQVIpKXsKLQkJCQl1ZG0uc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIG1vZGVsLmdldFByb3BlcnR5KEFERF9UT19FQVIpKTsKLQkJCX0KLQkJCXVkbS5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCQl1ZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB1ZG0uc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkgKyAiLmphciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBhZGQgdG8gZWFyIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgIHVkbS5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwotCi0JCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZG0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQltYXAuYWRkKGpkbSk7Ci0JCW1hcC5hZGQodWRtKTsKLQotCQl0cnkgewotCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldEphdmFGYWNldFZlcnNpb24oKXsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpICk7Ci0JCUlKYXZhUHJvamVjdCBqUHJvaiA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QoIHByb2plY3QgKTsKLQkJU3RyaW5nIGpkdFZlcnNpb24gPSBqUHJvai5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSApOwotCQkKLQkJaWYgKGpkdFZlcnNpb24uc3RhcnRzV2l0aCgiMS4zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEphdmFGYWNldFV0aWxzLkpBVkFfMTM7Ci0JCX0gZWxzZSBpZiAoamR0VmVyc2lvbi5zdGFydHNXaXRoKCIxLjQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSmF2YUZhY2V0VXRpbHMuSkFWQV8xNDsKLQkJfWVsc2UgaWYgKGpkdFZlcnNpb24uc3RhcnRzV2l0aCgiMS41IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEphdmFGYWNldFV0aWxzLkpBVkFfNTA7Ci0JCX0KLQkJcmV0dXJuIEphdmFGYWNldFV0aWxzLkpBVkFfNjA7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3MzE0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJLy9wcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJVTlRJTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfRk9MREVSKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmFmNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0KLQkKLQlwdWJsaWMgSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJU3RhdHVzIHN0YXQgPSBPS19TVEFUVVM7Ci0JCQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUgKTsKLQkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSApOzsKLQkJU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSICk7Ci0JCQotCQlvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRSk7Ci0JCQotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCi0JCQotCQkvL0lEYXRhTW9kZWwgcGRtID0gZG0uZ2V0TmVzdGVkTW9kZWwoIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX1BST0pFQ1RfRE0gKTsKLQkJLy9wZG0uc2V0U3RyaW5nUHJvcGVydHkoIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04sIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KCBJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04gKSApOwotCQkKLQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBkbS5nZXRQcm9wZXJ0eShVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuRkFDRVRfRE1fTUFQKTsKLQkJCi0JCUlEYXRhTW9kZWwgamF2YWRtID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBICk7Ci0JCUlEYXRhTW9kZWwgdXRpbGRtID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZICk7Ci0JCQotCQkKLQkJamF2YWRtLnNldFByb3BlcnR5KCBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuRkFDRVRfUFJPSkVDVF9OQU1FLAotCQkJCXByb2plY3ROYW1lKTsKLQkJCi0JCQotCQlqYXZhZG0uc2V0UHJvcGVydHkoIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5TT1VSQ0VfRk9MREVSX05BTUUsCi0JCQkJamF2YVNvdXJjZUZvbGRlcik7Ci0JCQotCi0JCXV0aWxkbS5zZXRQcm9wZXJ0eSggSVV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGVhclByb2plY3ROYW1lKTsKLQkJCi0JCXV0aWxkbS5zZXRQcm9wZXJ0eSggSVV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIHJ1bnRpbWUgKTsKLQkJZG0uc2V0UHJvcGVydHkoVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLkZBQ0VUX1JVTlRJTUUsIHJ1bnRpbWUpOwotCi0JCUZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIG9wID0gbmV3IEZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKGRtKTsKLQkJdHJ5IHsKLQkJCXN0YXQgPSBvcC5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViNWM1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSBwdWJsaWMgQVBJLiAgUGxlYXNlIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN9IAotICogCi0gKiBAZGVwcmVjYXRlZAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcgotICovCi0KLXB1YmxpYyBjbGFzcyBVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciB7Ci0JcHVibGljIFV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODM5YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXR5RmFjZXRJbnN0YWxsRGVsZWdhdGUgZXh0ZW5kcyBKMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgZmluYWwgT2JqZWN0IGNmZywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQotCQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjZmc7Ci0KLQkJCS8vIEFkZCBXVFAgbmF0dXJlcy4KLQotCQkJV3RwVXRpbHMuYWRkTmF0dXJlcyhwcm9qZWN0KTsKLQotCQkJLy8gU2V0dXAgdGhlIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlLgotCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZmFsc2UpOwotCi0JCQljLmNyZWF0ZSgwLCBudWxsKTsKLQotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIganNyYyA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwW2ldOwotCi0JCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQlJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpIHsKLQkJCQkJCXBhdGggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJanNyYy5jcmVhdGVMaW5rKHBhdGgsIDAsIG51bGwpOwotCQkJCX0KLQkJCX0KLQotLy8JCQlmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciByb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0KLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQotCQkJaWYgKHJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpID09IDApIHsKLQkJCQljb250YWluZXIgPSBwcm9qZWN0OwotCQkJfSBlbHNlIHsKLQkJCQljb250YWluZXIgPSBwcm9qZWN0LmdldEZvbGRlcihyb290LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBjb250YWluZXIsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQotCi0JCQlDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmdik7Ci0KLQkJCWlmICghQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpKSB7Ci0JCQkJLy8gVE9ETzogU3VwcG9ydCB0aGUgbm8gcnVudGltZSBjYXNlLgotCQkJCS8vIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgPHNvbWV0aGluZz4gKTsKLQkJCX0KLQotCQkJaWYoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VFQVJMaWJyYXJpZXMoKSl7Ci0JCQkJZmluYWwgSVBhdGggZWFyTGliQ29udGFpbmVyID0gbmV3IFBhdGgoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5DT05UQUlORVJfSUQpOwotCQkJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShlYXJMaWJDb250YWluZXIpKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0NTI4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbGl0eUZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBmaW5hbCBPYmplY3QgY2ZnLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCi0JCQlmaW5hbCBJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJLy8gQXNzb2NpYXRlIHdpdGggYW4gRUFSLCBpZiBuZWNlc3NhcnkuCi0JCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSKSkgewotCQkJCWZpbmFsIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJCQlpZiAoZWFyUHJvamVjdE5hbWUgIT0gbnVsbCAmJiBlYXJQcm9qZWN0TmFtZSAhPSAiIikgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJZmluYWwgU3RyaW5nIG1vZHVsZVVSSSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJKTsKLQkJCQkJCi0JCQkJCWluc3RhbGxBbmRBZGRNb2R1bGV0b0VBUiggbnVsbCwKLQkJCQkJCQkJZWFyUHJvamVjdE5hbWUsCi0JCQkJCQkJCShJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpLAotCQkJCQkJCQlwcm9qZWN0LAotCQkJCQkJCQltb2R1bGVVUkksCi0JCQkJCQkJCW1vbml0b3IgKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWYzZWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuV3RwVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFV0aWxpdHlGYWNldFVuSW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeXsKLQkJCS8vcmVtb3ZlIC5jb21wb25lbnQgIGZpbGUKLQkJCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoIFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FICk7Ci0JCQlmaWxlLmRlbGV0ZSggdHJ1ZSwgbW9uaXRvciApOwotCQkJCi0JCQkvL3JlbW92ZSBtYW5pZmVzdCBmaWxlCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciByb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0KLQkJCWlmIChyb290LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JCQkJY29udGFpbmVyID0gcHJvamVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGFpbmVyID0gcHJvamVjdC5nZXRGb2xkZXIocm9vdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJfQotCQkJCi0JCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQkJbWFuaWZlc3RGaWxlLmRlbGV0ZSggdHJ1ZSwgbW9uaXRvciApOwotCQkJCi0JCQlJRm9sZGVyIG1hbmlmZXN0Rm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlciggbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NRVRBX0lORikgKTsKLQkJCW1hbmlmZXN0Rm9sZGVyLmRlbGV0ZSggdHJ1ZSwgbW9uaXRvciApOwotCQkgICAgIAotCQkJLy9yZW1vdmUgIG1vZHVsZSBjb3JlIG5hdHVyZQotCQkJV3RwVXRpbHMucmVtb3ZlTmF0dXJlcyggcHJvamVjdCApOwotCQkJCi0JCQkvL3JlbW92ZSBzZXJ2ZXIgY2xhc3MgcGF0aCBjb250YWluZXIKLQkJCUNsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApOwotCQkJCi0JCX1maW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTlhNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0gICAgICAgIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWV9GQUNFVCk7Ci0gICAgICAgIHNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCByZXF1aXJlZEZhY2V0cyk7Ci0JCQotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0JCUlEYXRhTW9kZWwgamF2YUZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQuZ2V0SWQoKSk7Ci0JCS8vIElmIGFwcGxpY2FibGUsIGtlZXAgcHJvamVjdCBzdHJ1Y3R1cmUgb3B0aW1pemVkIGJ5IG1ha2luZyBvdXRwdXQgZGlyZWN0b3J5IHRoZSBzYW1lIGFzIHRoZSBjb250ZW50IHJvb3QKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKLQkJCWphdmFGYWNldC5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsIGphdmFGYWNldC5nZXRTdHJpbmdQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUl9OQU1FKSk7Ci0JCUlEYXRhTW9kZWwgdXRpbEZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWV9GQUNFVC5nZXRJZCgpKTsKLQkJdXRpbEZhY2V0LmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAoaXNQcm9wZXJ0eVNldChFQVJfUFJPSkVDVF9OQU1FKSkKLQkJCQkJCXNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCQl9ZWxzZSBpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlzZXRQcm9wZXJ0eShBRERfVE9fRUFSLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIE1PRFVMRV9VUkkgKSl7Ci0JCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0JCQlJRGF0YU1vZGVsIHV0aWxGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSApOwkKLQkJCXV0aWxGYWNldC5zZXRQcm9wZXJ0eSggSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksIHByb3BlcnR5VmFsdWUgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8xMV9jbXBiZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzExX2NtcGJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNGU3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzExX2NtcGJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMTFfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzExX2VqYl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVhYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMTFfZWpiX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzExX2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8xMV9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0YWRjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzExX2VqYmphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8xMl9lYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMTJfZWFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmU3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8xMl9lYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMTNfZWFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzEzX2Vhcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NkNmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMTNfZWFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzIwX2NtcGJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8yMF9lamJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMjBfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmViYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy8yMF9lamJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMjBfZWpiamFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zLzIwX2VqYmphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjU5NGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvMjBfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0FjY2Vzc0ludGVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0FjY2Vzc0ludGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjQ2NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9BY2Nlc3NJbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9BcHBsQ2xpZW50SmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQXBwbENsaWVudEphci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjM1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9BcHBsQ2xpZW50SmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQXNzZW1ibHlEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQXNzZW1ibHlEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmZjIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Fzc2VtYmx5RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Fzc2VtYmx5RGVzY3JpcHRvckNyZWF0ZU1ldGhvZFBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Bc3NlbWJseURlc2NyaXB0b3JDcmVhdGVNZXRob2RQZXJtaXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3YWUyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Fzc2VtYmx5RGVzY3JpcHRvckNyZWF0ZU1ldGhvZFBlcm1pc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkYTEyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhbkNhY2hlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhbkNhY2hlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhNzYwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0JlYW5DYWNoZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0JlYW5JbnN0YWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhbkluc3RhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDVkNWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhbkluc3RhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9CZWFuSW50ZXJuYXRpb25hbGl6YXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9CZWFuSW50ZXJuYXRpb25hbGl6YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRjOWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhbkludGVybmF0aW9uYWxpemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhblN0cnVjdHVyZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0JlYW5TdHJ1Y3R1cmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRiOTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQmVhblN0cnVjdHVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NNUEF0dHJpYnV0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NNUEF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmIxZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DTVBBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DTVBBdHRyaWJ1dGVDcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ01QQXR0cmlidXRlQ3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDQxNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DTVBBdHRyaWJ1dGVDcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ01QQXR0cmlidXRlb2xkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ01QQXR0cmlidXRlb2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0M2M0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NNUEF0dHJpYnV0ZW9sZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NNUEtleUF0dHJpYnV0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NNUEtleUF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzhkYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DTVBLZXlBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DUERlcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NQRGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzOGIyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NQRGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmViODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Nvbm5lY3Rvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Nvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWVhNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db25uZWN0b3JDcmVhdGVMaWNlbnNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29ubmVjdG9yQ3JlYXRlTGljZW5zZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWVmNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db25uZWN0b3JDcmVhdGVMaWNlbnNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29ubmVjdG9yQ3JlYXRlUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29ubmVjdG9yQ3JlYXRlUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3YWUyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0Nvbm5lY3RvckNyZWF0ZVJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lckFjdGl2aXR5U2Vzc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lckFjdGl2aXR5U2Vzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWVkYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db250YWluZXJBY3Rpdml0eVNlc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db250YWluZXJNYW5hZ2VkRW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29udGFpbmVyTWFuYWdlZEVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWQxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29udGFpbmVyTWFuYWdlZEVudGl0eUNyZWF0ZUVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlDcmVhdGVFbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUxN2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29udGFpbmVyTWFuYWdlZEVudGl0eUNyZWF0ZUVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjNDQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uQ3JlYXRlRWpiUmVsYXRpb25zaGlwUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb25DcmVhdGVFamJSZWxhdGlvbnNoaXBSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMzYzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb25DcmVhdGVFamJSZWxhdGlvbnNoaXBSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29udGFpbmVyTWFuYWdlZEVudGl0eW5vLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvQ29udGFpbmVyTWFuYWdlZEVudGl0eW5vLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzY2MxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvbnRhaW5lck1hbmFnZWRFbnRpdHluby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvcHkgb2YgQ3JlYXRlQ2hpbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Db3B5IG9mIENyZWF0ZUNoaWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYTRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NvcHkgb2YgQ3JlYXRlQ2hpbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9DcmVhdGVDaGlsZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NyZWF0ZUNoaWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYTRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0NyZWF0ZUNoaWxkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUFSLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUFSLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MzBiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VBUi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjVjMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJKYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJKYXJDcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUpCSmFyQ3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTk2OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJKYXJDcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUpCSmFyQ3JlYXRlRW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUpCSmFyQ3JlYXRlRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0NDE3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphckNyZWF0ZUVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphckV4dGVuc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphckV4dGVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzhhOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJKYXJFeHRlbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJKYXJFeHRlbnNpb25DcmVhdGVFamJHZW5lcmFsaXphdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphckV4dGVuc2lvbkNyZWF0ZUVqYkdlbmVyYWxpemF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyOTUxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VKQkphckV4dGVuc2lvbkNyZWF0ZUVqYkdlbmVyYWxpemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRUpCTWV0aG9kQ2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJNZXRob2RDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzhhOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FSkJNZXRob2RDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYkdlbmVyYWxpemF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiR2VuZXJhbGl6YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ5MGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiR2VuZXJhbGl6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJLZXlSZWxhdGlvbnNoaXBSb2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiS2V5UmVsYXRpb25zaGlwUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTJlY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJLZXlSZWxhdGlvbnNoaXBSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiTW9kZWxGaWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiTW9kZWxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiYzUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYk1vZGVsRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYk1vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYk1vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjVjMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJNb2R1bGVFeHRlbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJNb2R1bGVFeHRlbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzRjZGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiTW9kdWxlRXh0ZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiUmVsYXRpb25zaGlwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiUmVsYXRpb25zaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MzU4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYlJlbGF0aW9uc2hpcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYlJlbGF0aW9uc2hpcFJvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJSZWxhdGlvbnNoaXBSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5MDJhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYlJlbGF0aW9uc2hpcFJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJleHRNb2RlbEZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FamJleHRNb2RlbEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmJjNTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpiZXh0TW9kZWxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpicWxGaW5kZXJEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRWpicWxGaW5kZXJEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2ZWI4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VqYnFsRmluZGVyRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGVycHJpc2VCZWFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZlYjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRlcnByaXNlQmVhbkNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRlcnByaXNlQmVhbkNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTcyMmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW5DcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW5DcmVhdGVFbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRlcnByaXNlQmVhbkNyZWF0ZUVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzIyZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRlcnByaXNlQmVhbkNyZWF0ZUVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGVycHJpc2VCZWFuRXh0ZW5zaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW5FeHRlbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGVlYTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50ZXJwcmlzZUJlYW5FeHRlbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRlcnByaXNlQmVhbkV4dGVuc2lvbkNyZWF0ZVJlYWRPbmx5QXR0cmlidXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGVycHJpc2VCZWFuRXh0ZW5zaW9uQ3JlYXRlUmVhZE9ubHlBdHRyaWJ1dGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZWY2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGVycHJpc2VCZWFuRXh0ZW5zaW9uQ3JlYXRlUmVhZE9ubHlBdHRyaWJ1dGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2OTE0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eUNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRpdHlDcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyOTUxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eUNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRpdHlFSkIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRpdHlFSkIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ2ODExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50aXR5RUpCLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50aXR5RXh0ZW5zaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRW50aXR5RXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmZjIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eUV4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eUV4dGVuc2lvbkNyZWF0ZVJlYWRPbmx5QXR0cmlidXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0VudGl0eUV4dGVuc2lvbkNyZWF0ZVJlYWRPbmx5QXR0cmlidXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2FlMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9FbnRpdHlFeHRlbnNpb25DcmVhdGVSZWFkT25seUF0dHJpYnV0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9GaW5kZXJEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRmluZGVyRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjkxNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9GaW5kZXJEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvRnVsbFNlbGVjdEZpbmRlckRlc2NyaXB0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9GdWxsU2VsZWN0RmluZGVyRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGExMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9GdWxsU2VsZWN0RmluZGVyRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0lkZW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvSWRlbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNmODlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvSWRlbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9KYXZhQ2xpZW50TW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvSmF2YUNsaWVudE1vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTllZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9KYXZhQ2xpZW50TW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvSmF2YUNsaWVudE1vZHVsZUV4dGVuc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0phdmFDbGllbnRNb2R1bGVFeHRlbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE5ZWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvSmF2YUNsaWVudE1vZHVsZUV4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0xpY2Vuc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9MaWNlbnNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmZjIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL0xpY2Vuc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Mb2NhbFRyYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Mb2NhbFRyYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjUyMDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTG9jYWxUcmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9NZXRob2RQZXJtaXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1NWNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFBlcm1pc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9NZXRob2RQZXJtaXNzaW9uQ3JlYXRlTWV0aG9kRWxlbWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFBlcm1pc3Npb25DcmVhdGVNZXRob2RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZWY2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFBlcm1pc3Npb25DcmVhdGVNZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kU2Vzc2lvbkF0dHJpYnV0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFNlc3Npb25BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM2NDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kU2Vzc2lvbkF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL01ldGhvZFRyYW5zYWN0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kVHJhbnNhY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNmM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kVHJhbnNhY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9NZXRob2RUcmFuc2FjdGlvbkNyZWF0ZU1ldGhvZEVsZW1lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9NZXRob2RUcmFuc2FjdGlvbkNyZWF0ZU1ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzAzNjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvTWV0aG9kVHJhbnNhY3Rpb25DcmVhdGVNZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUGVyc2lzdGVuY2VTZWN1cml0eUlkZW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUGVyc2lzdGVuY2VTZWN1cml0eUlkZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlZGZlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1BlcnNpc3RlbmNlU2VjdXJpdHlJZGVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1JlYWRPbmx5QXR0cmlidXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1JlYWRPbmx5QXR0cmlidXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTBjNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZWFkT25seUF0dHJpYnV0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM0NDUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUmVzb3VyY2VBZGFwdGVyQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXJDcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjk1MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXJDcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Jlc291cmNlQWRhcHRlckNyZWF0ZUNvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUmVzb3VyY2VBZGFwdGVyQ3JlYXRlQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUxN2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUmVzb3VyY2VBZGFwdGVyQ3JlYXRlQ29uZmlnUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXJDcmVhdGVTZWN1cml0eVBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SZXNvdXJjZUFkYXB0ZXJDcmVhdGVTZWN1cml0eVBlcm1pc3Npb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzAzNjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUmVzb3VyY2VBZGFwdGVyQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUnVuQXNNb2RlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvUnVuQXNNb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNzBhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1J1bkFzTW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1YWM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZWN1cml0eUlkZW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2VjdXJpdHlJZGVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTg3ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZWN1cml0eUlkZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2VjdXJpdHlQZXJtaXNzaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2OTE0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1NlY3VyaXR5UGVybWlzc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZXNzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZXNzaW9uQ3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb25DcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNzc5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb25DcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2Vzc2lvbkNyZWF0ZUVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb25DcmVhdGVFbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM3NzkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2Vzc2lvbkNyZWF0ZUVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb25FeHRlbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZXNzaW9uRXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyODEwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1Nlc3Npb25FeHRlbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZXNzaW9uRXh0ZW5zaW9uQ3JlYXRlUmVhZE9ubHlBdHRyaWJ1dGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvU2Vzc2lvbkV4dGVuc2lvbkNyZWF0ZVJlYWRPbmx5QXR0cmlidXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTE3YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9TZXNzaW9uRXh0ZW5zaW9uQ3JlYXRlUmVhZE9ubHlBdHRyaWJ1dGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvVXNlQ2FsbGVySWRlbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Vc2VDYWxsZXJJZGVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzg1ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Vc2VDYWxsZXJJZGVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1VzZVN5c3RlbUlkZW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvVXNlU3lzdGVtSWRlbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjc2ZWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvVXNlU3lzdGVtSWRlbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9Vc2VyRmluZGVyRGVzY3JpcHRvci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1VzZXJGaW5kZXJEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkMWFhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1VzZXJGaW5kZXJEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvV0FSLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvV0FSLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlY2I3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1dBUi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1dlYk1vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1dlYk1vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjBmNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9XZWJNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9XZWJNb2R1bGVFeHRlbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9XZWJNb2R1bGVFeHRlbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIwZjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvV2ViTW9kdWxlRXh0ZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvV2hlcmVDbGF1c2VGaW5kZXJEZXNjcmlwdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvV2hlcmVDbGF1c2VGaW5kZXJEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1YTlkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL1doZXJlQ2xhdXNlRmluZGVyRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2FjY2Vzc19pbnRlbnRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYWNjZXNzX2ludGVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYwOWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYWNjZXNzX2ludGVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hY2Nlc3NfaW50ZW50X3JlYWRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYWNjZXNzX2ludGVudF9yZWFkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGQyMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hY2Nlc3NfaW50ZW50X3JlYWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYWNjZXNzX2ludGVudF91cGRhdGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYWNjZXNzX2ludGVudF91cGRhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzMDdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2FjY2Vzc19pbnRlbnRfdXBkYXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2FwcENsaWVudEV4dF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hcHBDbGllbnRFeHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwZGY0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2FwcENsaWVudEV4dF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hc3NlbWJseURlc2NyaXB0b3Jfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYXNzZW1ibHlEZXNjcmlwdG9yX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWNhZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hc3NlbWJseURlc2NyaXB0b3Jfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYXR0cmlidXRlS2V5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2F0dHJpYnV0ZUtleV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiMzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYXR0cmlidXRlS2V5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2F0dHJpYnV0ZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9hdHRyaWJ1dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiNThlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2F0dHJpYnV0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9ibXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9ibXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmMxOGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYm1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYm1wRW50aXR5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2JtcEVudGl0eV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdkZjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvYm1wRW50aXR5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2NtcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2NtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWQxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9jbXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9jbXBFbnRpdHlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvY21wRW50aXR5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWQxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9jbXBFbnRpdHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvY21wRmllbGRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvY21wRmllbGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NmEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2NtcEZpZWxkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2RlYWNjc2ludGVudF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9kZWFjY3NpbnRlbnRfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3YzNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2RlYWNjc2ludGVudF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lYXJCaW5kaW5nX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VhckJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxYmM0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VhckJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWFyRXh0ZW5zaW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VhckV4dGVuc2lvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M1NmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWFyRXh0ZW5zaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VhckZpbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWFyRmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDY4ZDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWFyRmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamIxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYjE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNWMwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiMTZvbGQuR0lGIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamIxNm9sZC5HSUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGE1N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamIxNm9sZC5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYkJpbmRpbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiQmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTdlNmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiQmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamJFeHRlbnNpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiRXh0ZW5zaW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTg0Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamJFeHRlbnNpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiSmFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYkphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1YzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZWpiSmFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYlJlZl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lamJSZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NTA2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VqYlJlZl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lbnRpdHliZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VudGl0eWJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZDFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2VudGl0eWJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZW50aXR5YmVhbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lbnRpdHliZWFuX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjg5MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9lbnRpdHliZWFuX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Vycm9yX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZXJyb3JfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9maWVsZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZpZWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMzhmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZpZWxkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzM2MwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZpbmRlcl9kZXNjcmlwdG9yX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZvcmVpZ25LZXlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZm9yZWlnbktleV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjYxYTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZm9yZWlnbktleV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mcm5rZXlyZWxuc2hwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZybmtleXJlbG5zaHBfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlOWZmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2ZybmtleXJlbG5zaHBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvRmllbGRfZWpiLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvRmllbGRfZWpiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMzhmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY2xjbDE2L0ZpZWxkX2VqYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY2xjbDE2L1Nob3dCYXNlVHlwZXNfZWpiLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvU2hvd0Jhc2VUeXBlc19lamIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDhjNjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvU2hvd0Jhc2VUeXBlc19lamIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2NsY2wxNi9TaG93R2VuVHlwZXNfZWpiLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvU2hvd0dlblR5cGVzX2VqYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGIxYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2NsY2wxNi9TaG93R2VuVHlwZXNfZWpiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvVHlwZXNfZWpiLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jbGNsMTYvVHlwZXNfZWpiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlY2I2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY2xjbDE2L1R5cGVzX2VqYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZVJlZkJpbmRpbmdfZGVmYXVsdEF1dGhfQmFzaWNBdXRoRGF0YS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZVJlZkJpbmRpbmdfZGVmYXVsdEF1dGhfQmFzaWNBdXRoRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzE0NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VSZWZCaW5kaW5nX2RlZmF1bHRBdXRoX0Jhc2ljQXV0aERhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eV9pZGVudGl0eV9JZGVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5X2lkZW50aXR5X0lkZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiZDRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5X2lkZW50aXR5X0lkZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MzMwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjY3ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvY3JlYXRlRUpCX1JEQi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9jcmVhdGVFSkJfUkRCLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MjdiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9jcmVhdGVFSkJfUkRCLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2NyZWF0ZVJEQl9FSkIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvY3JlYXRlUkRCX0VKQi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjMyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvY3JlYXRlUkRCX0VKQi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJfcmRibWFwcGluZ193aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZWpiX3JkYm1hcHBpbmdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NDhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJfcmRibWFwcGluZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZWpiY2xpZW50amFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NWU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNvbXBvc2VyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJjb21wb3Nlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdiZTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNvbXBvc2VyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNkNDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVfZGRsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlX2RkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmU1NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVfZGRsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlX3JtaWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVfcm1pYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmVmYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVfcm1pYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIwMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0YjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld19hcHBjbGllbnRwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTRjYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FjY2Vzc2JlYW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FjY2Vzc2JlYW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwY2EwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhY2Nlc3NiZWFuX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4NmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzU2MWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpiZXhfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmRlODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpiZXhfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOWU0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVlYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3Rvb2wxNi9yZV9leGVjdXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjk0M2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvdGFibGVfbWFwcGluZ19zdHJhdGVneV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N0b29sMTYvdGFibGVfbWFwcGluZ19zdHJhdGVneV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQyYzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdG9vbDE2L3RhYmxlX21hcHBpbmdfc3RyYXRlZ3lfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2RhdGFfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9kYXRhX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJiMWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2RhdGFfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9lYXJfZWRfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9lYXJfZWRfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDAzNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvZWFyX2VkX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvZWFyZXh0X2VkX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvZWFyZXh0X2VkX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIzNDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VhcmV4dF9lZF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYl9lZF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYl9lZF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwOTcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9lamJfZWRfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9lamJfcmRibWFwcGluZ192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYl9yZGJtYXBwaW5nX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA2NzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYl9yZGJtYXBwaW5nX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvZWpiX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvZWpiX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzA5NzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYl92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYmV4dF9lZF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2VqYmV4dF9lZF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMzQxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9lamJleHRfZWRfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9jdmlldzE2L3RhYmxlX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvdGFibGVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWI0NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2N2aWV3MTYvdGFibGVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L0ZpZWxkX2VqYi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L0ZpZWxkX2VqYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjRmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2RsY2wxNi9GaWVsZF9lamIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2RsY2wxNi9TaG93QmFzZVR5cGVzX2VqYi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L1Nob3dCYXNlVHlwZXNfZWpiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyM2E1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L1Nob3dCYXNlVHlwZXNfZWpiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kbGNsMTYvU2hvd0dlblR5cGVzX2VqYi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L1Nob3dHZW5UeXBlc19lamIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZlOGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kbGNsMTYvU2hvd0dlblR5cGVzX2VqYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L1R5cGVzX2VqYi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZGxjbDE2L1R5cGVzX2VqYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWIxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2RsY2wxNi9UeXBlc19lamIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvYXBwY2xpZW50X2V4cG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvYXBwY2xpZW50X2V4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxOTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxMWViMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9jcmVhdGVFSkJfUkRCLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2NyZWF0ZUVKQl9SREIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M4ZmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2NyZWF0ZUVKQl9SREIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvY3JlYXRlUkRCX0VKQi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9jcmVhdGVSREJfRUpCLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzZWRiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9jcmVhdGVSREJfRUpCLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2VqYl9yZGJtYXBwaW5nX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9lamJfcmRibWFwcGluZ193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzIxYTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2VqYl9yZGJtYXBwaW5nX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDlmZWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZWpiY29tcG9zZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2VqYmNvbXBvc2VyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWQ2YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZWpiY29tcG9zZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjM0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjI5NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0X3Jhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZXhwb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMyYjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExZDRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9nZW5lcmF0ZV9kZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZ2VuZXJhdGVfZGRsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmNmIzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9nZW5lcmF0ZV9kZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvZ2VuZXJhdGVfcm1pYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9nZW5lcmF0ZV9ybWljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3OTE1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9nZW5lcmF0ZV9ybWljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliOTJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnRfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTM5NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3Jhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvaW1wb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQyMzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L2ltcG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMmViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9pbXBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfYXBwY2xpZW50cHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxYjAyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfYXBwY2xpZW50cHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3YWNjZXNzYmVhbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3YWNjZXNzYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JkZGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2FjY2Vzc2JlYW5fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTAwMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZWEzYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlZTRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2VqYl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpiX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2U5MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpiX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlamJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpiZXhfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNGIzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlamJleF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxZDUyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdlamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2VqYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mjg5NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjBhOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxNDE0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXd3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9kdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvcmVfZXhlY3V0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDU2ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvcmVfZXhlY3V0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi90YWJsZV9tYXBwaW5nX3N0cmF0ZWd5X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZHRvb2wxNi90YWJsZV9tYXBwaW5nX3N0cmF0ZWd5X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzE0YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2R0b29sMTYvdGFibGVfbWFwcGluZ19zdHJhdGVneV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9GaWVsZF9lamIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9GaWVsZF9lamIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQzOGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9lbGNsMTYvRmllbGRfZWpiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9lbGNsMTYvU2hvd0Jhc2VUeXBlc19lamIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9TaG93QmFzZVR5cGVzX2VqYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOGM2MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9TaG93QmFzZVR5cGVzX2VqYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZWxjbDE2L1Nob3dHZW5UeXBlc19lamIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9TaG93R2VuVHlwZXNfZWpiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0YjFjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZWxjbDE2L1Nob3dHZW5UeXBlc19lamIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9UeXBlc19lamIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2VsY2wxNi9UeXBlc19lamIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGVjYjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9lbGNsMTYvVHlwZXNfZWpiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MzMwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9hcHBjbGllbnRfZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjY3ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvY3JlYXRlRUpCX1JEQi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9jcmVhdGVFSkJfUkRCLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MjdiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9jcmVhdGVFSkJfUkRCLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2NyZWF0ZVJEQl9FSkIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvY3JlYXRlUkRCX0VKQi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjMyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvY3JlYXRlUkRCX0VKQi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9lamJfcmRibWFwcGluZ193aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZWpiX3JkYm1hcHBpbmdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NDhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9lamJfcmRibWFwcGluZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZWpiY2xpZW50amFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NWU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2VqYmNvbXBvc2VyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9lamJjb21wb3Nlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdiZTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2VqYmNvbXBvc2VyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNkNDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZXhwb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfZGRsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX2RkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmU1NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfZGRsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3JtaWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfcm1pYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmVmYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfcm1pYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIwMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0YjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvaW1wb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19hcHBjbGllbnRwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTRjYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2FjY2Vzc2JlYW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2FjY2Vzc2JlYW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwY2EwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdhY2Nlc3NiZWFuX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4NmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdlamJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzU2MWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWpiZXhfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmRlODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWpiZXhfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOWU0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2VqYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVlYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXRvb2wxNi9yZV9leGVjdXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L3JlX2V4ZWN1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjk0M2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L3JlX2V4ZWN1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvdGFibGVfbWFwcGluZ19zdHJhdGVneV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V0b29sMTYvdGFibGVfbWFwcGluZ19zdHJhdGVneV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQyYzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldG9vbDE2L3RhYmxlX21hcHBpbmdfc3RyYXRlZ3lfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2RhdGFfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9kYXRhX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJiMWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2RhdGFfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9lYXJfZWRfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9lYXJfZWRfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDAzNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvZWFyX2VkX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvZWFyZXh0X2VkX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvZWFyZXh0X2VkX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIzNDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VhcmV4dF9lZF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYl9lZF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYl9lZF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwOTcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9lamJfZWRfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9lamJfcmRibWFwcGluZ192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYl9yZGJtYXBwaW5nX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA2NzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYl9yZGJtYXBwaW5nX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvZWpiX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvZWpiX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzA5NzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYl92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYmV4dF9lZF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2VqYmV4dF9lZF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMzQxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9lamJleHRfZWRfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXZpZXcxNi9qMmVlX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvajJlZV92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L2oyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9ldmlldzE2L3RhYmxlX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvdGFibGVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWI0NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V2aWV3MTYvdGFibGVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvRUpCRGF0YVRyYW5zZm9ybWVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9FSkJEYXRhVHJhbnNmb3JtZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZiNGU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9FSkJEYXRhVHJhbnNmb3JtZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL0ZvcndhcmRGbGF0dGVuZWRGS0NvbXBvc2VyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9Gb3J3YXJkRmxhdHRlbmVkRktDb21wb3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2EwOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL0ZvcndhcmRGbGF0dGVuZWRGS0NvbXBvc2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9Jbmhlcml0ZWRQcmltYXJ5VGFibGVTdHJhdGVneS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvSW5oZXJpdGVkUHJpbWFyeVRhYmxlU3RyYXRlZ3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E4NTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9Jbmhlcml0ZWRQcmltYXJ5VGFibGVTdHJhdGVneS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvUHJpbWFyeVRhYmxlU3RyYXRlZ3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL1ByaW1hcnlUYWJsZVN0cmF0ZWd5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlYzI4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvUHJpbWFyeVRhYmxlU3RyYXRlZ3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL1JEQk1lbWJlclR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL1JEQk1lbWJlclR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZkZGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9SREJNZW1iZXJUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9hcnJheXR5cGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9hcnJheXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyN2MxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvYXJyYXl0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvY2xhc3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3OTQ3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2RhdGF0eXBlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvZGF0YXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1Mzc5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvZGF0YXR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9lcnJvcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvZm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2Zvcm1fYmFubmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9ob21lX25hdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBjNjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvaW50ZXJmYWNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9pbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9pbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2pjdV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL2pjdV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE3M2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9qY3Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9zaG93ZXJyX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvc2hvd2Vycl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJmZGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9zaG93ZXJyX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvc2hvd3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9zaG93d2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS9zaG93d2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS93YXJuX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjc1MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL2V4dHJhL3dhcm5fdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS93YXJuaW5nX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9leHRyYS93YXJuaW5nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZGFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvZXh0cmEvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTFfY21wYmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzExX2NtcGJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNGU3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTFfY21wYmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzExX2VqYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzExX2VqYl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVhYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xMV9lamJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xMV9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xMV9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0YWRjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTFfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTJfZWFyX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTJfZWFyX2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTQzZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzEyX2Vhcl9kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzEyX2Vhcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzEyX2Vhcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZlN2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xMl9lYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xM19lYXJfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xM19lYXJfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhMjI1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTNfZWFyX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTNfZWFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMTNfZWFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2Q2YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzE0X2Vhcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzE0X2Vhcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI5YjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8xNF9lYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMF9jbXBiZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjBfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMF9jbXBiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjBfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjBfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmViYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIwX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIwX2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIwX2VqYmphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjU5NGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMF9lamJqYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjFfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTgzNWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2JhNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIxX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGFlMDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi8yMV9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9BYnN0cmFjdEF1dGhEYXRhLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9BYnN0cmFjdEF1dGhEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0MDc5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQWJzdHJhY3RBdXRoRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvbkNvbmZpZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvbkNvbmZpZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMmMxZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0FjdGl2YXRpb25Db25maWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NzIzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9CYXNpY0F1dGhEYXRhLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9CYXNpY0F1dGhEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0ZmU5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQmFzaWNBdXRoRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiNTMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VKQkxvY2FsUmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9FSkJMb2NhbFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjgxM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VKQkxvY2FsUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9FamJSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VqYlJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTEzMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VqYlJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvRWpiUmVmQmluZGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvRWpiUmVmQmluZGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYWMwNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VqYlJlZkJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VudkVudHJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9FbnZFbnRyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGJmYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L0VudkVudHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvSWRlbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWE5Y2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VFbnZSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRW52UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMWRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VFbnZSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRW52UmVmQmluZGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VFbnZSZWZCaW5kaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlYjM1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VFbnZSZWZCaW5kaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UxZjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VSZWZCaW5kaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZVJlZkJpbmRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhkM2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZVJlZkJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNmM2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9TT0FQSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmOTkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlJZGVudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlJZGVudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWQyNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5SWRlbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5Um9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0NzJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9TZWN1cml0eVJvbGVSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5Um9sZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjM4ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5Um9sZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvVXNlQ2FsbGVySWRlbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L1VzZUNhbGxlcklkZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNzAzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvVXNlQ2FsbGVySWRlbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FjY2Vzc19pbnRlbnRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NfaW50ZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjA5ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FjY2Vzc19pbnRlbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NfaW50ZW50X3JlYWRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NfaW50ZW50X3JlYWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZDIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYWNjZXNzX2ludGVudF9yZWFkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYWNjZXNzX2ludGVudF91cGRhdGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NfaW50ZW50X3VwZGF0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzMwN2ZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NfaW50ZW50X3VwZGF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FjY2Vzc2JlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hY2Nlc3NiZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDExYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FjY2Vzc2JlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYW5ub3RhdGlvbl9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWMxZDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwQ2xpZW50RXh0X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwQ2xpZW50RXh0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGRmNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcENsaWVudEV4dF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzEyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzMDRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzEyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTJfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTJfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwMTc4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzEyX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzEzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTY0NzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xM19kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xM19kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQ2MDViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTNfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDgzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0X2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0X2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDA4YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudGdyb3VwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50Z3JvdXBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5NzNjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50Z3JvdXBfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudGdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Njg0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwbGNsaWVudEpBUl9vYmouR0lGIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2FwcGxjbGllbnRKQVJfb2JqLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMzU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXBwbGNsaWVudEpBUl9vYmouR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Fzc2VtYmx5RGVzY3JpcHRvcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Fzc2VtYmx5RGVzY3JpcHRvcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVjYWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hc3NlbWJseURlc2NyaXB0b3Jfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVLZXlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVLZXlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YjM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlS2V5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjU4ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F1dGhfZGF0YV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F1dGhfZGF0YV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdmNmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hdXRoX2RhdGFfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9hdXRoX21lY2hhbmlzbV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F1dGhfbWVjaGFuaXNtX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmRmOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F1dGhfbWVjaGFuaXNtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXV0aF90YWJsZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2F1dGhfdGFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMDM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvYXV0aF90YWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2JtcEVudGl0eV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2JtcEVudGl0eV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdkZjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ibXBFbnRpdHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jbXBFbnRpdHlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jbXBFbnRpdHlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZDFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY21wRW50aXR5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY21wRmllbGRfZGVjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jbXBGaWVsZF9kZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2YTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jbXBGaWVsZF9kZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2NtcEZpZWxkX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY21wRmllbGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NmEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY21wRmllbGRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb2xsYWNjZXNzX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29sbGFjY2Vzc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM3Y2E3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb2xsYWNjZXNzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29sbGluY3JlbWVudF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2NvbGxpbmNyZW1lbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlYzg3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29sbGluY3JlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2NvbmZpZ19wcm9wX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29uZmlnX3Byb3Bfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NzIzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29uZmlnX3Byb3Bfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdG9yX21vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdG9yX21vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmM1MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rvcl9tb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rvcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb3B5aGVscGVyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY29weWhlbHBlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjg1MGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jb3B5aGVscGVyX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvY3JlYXRlX2NoaWxkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jcmVhdGVfY2hpbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY4ZjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9jcmVhdGVfY2hpbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2RhdGFjbGFzc19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2RhdGFjbGFzc19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM0MGE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9kYXRhY2xhc3Nfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9kYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2RiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmIxZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2RiX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZGJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2RiZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMDExZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZGJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VhckJpbmRpbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lYXJCaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWJjNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VhckJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lYXJFeHRlbnNpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lYXJFeHRlbnNpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNTZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWFyRXh0ZW5zaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWFyRmlsZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VhckZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2OGQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWFyRmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Vhcmdyb3VwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWFyZ3JvdXBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwYWYwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWFyZ3JvdXBfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lYXJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Vhcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWIzZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Vhcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiQmluZGluZ19vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYkJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3ZTZlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiQmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYkV4dGVuc2lvbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYkV4dGVuc2lvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjE4NGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJFeHRlbnNpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJKYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJKYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNWMwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiSmFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiUmVmX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiUmVmX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTUwNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYlJlZl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYl9jb250YWluZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfY29udGFpbmVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYl9jb250YWluZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfbG9jYWxfcmVmX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiX2xvY2FsX3JlZl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThhNmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfbG9jYWxfcmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiX3JkYm1hcHBpbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfcmRibWFwcGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNiODdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfcmRibWFwcGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYl9yZWZlcmVuY2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYl9yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU1MDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJjbGllbnRqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJjbGllbnRqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjNzE1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiY2xpZW50amFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiY2xpZW50dXRpbF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYmNsaWVudHV0aWxfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkYjI4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiY2xpZW50dXRpbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYmdyb3VwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiZ3JvdXBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NTgxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpiZ3JvdXBfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZWpicWxfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJxbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTkyNDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lamJxbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Vudmlyb25tZW50X2VudGl0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNDNmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lbnZ2YXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9lbnZ2YXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNDNmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZW52dmFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2V4dHdlYnNlcnZpY2VpdGVtcHJvdmlkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjYzZlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2ZpbmRlcl9kZXNjcmlwdG9yX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzM2MwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9mb3JlaWduS2V5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZm9yZWlnbktleV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjYxYTFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9mb3JlaWduS2V5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZm9ybV9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2dyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlN2VkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ob21lSW50X2RlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaG9tZUludF9kZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY2YTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ob21lSW50X2RlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2luaHJlbGVqYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2luaHJlbGVqYl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM4ZjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pbmhyZWxlamJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzYTRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaXNvbGF0aW9uX2xldmVsX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaXNvbGF0aW9uX2xldmVsX3JlYWRjb21fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfcmVhZGNvbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJmZTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfcmVhZGNvbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2lzb2xhdGlvbl9sZXZlbF9yZWFkdW5jb21fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfcmVhZHVuY29tX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmU0ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2lzb2xhdGlvbl9sZXZlbF9yZWFkdW5jb21fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9pc29sYXRpb25fbGV2ZWxfcmVwcmVhZF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2lzb2xhdGlvbl9sZXZlbF9yZXByZWFkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDg5Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2lzb2xhdGlvbl9sZXZlbF9yZXByZWFkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaXNvbGF0aW9uX2xldmVsX3NlcmlhbGl6X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvaXNvbGF0aW9uX2xldmVsX3NlcmlhbGl6X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGIzZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2lzb2xhdGlvbl9sZXZlbF9zZXJpYWxpel9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2phcnByb2plY3RfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9qYXJwcm9qZWN0X2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTRiZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2phcnByb2plY3RfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9qYXZhYmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2phdmFiZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjI2MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2phdmFiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYva2V5SW50X2RlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYva2V5SW50X2RlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWYzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2tleUludF9kZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2xpY2Vuc2Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9saWNlbnNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZThkYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2xpY2Vuc2Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9saXN0ZW5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbGlzdGVuZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIwNDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9saXN0ZW5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ2MDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2xvY2FsX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L2xvY2FsX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZmZWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tYW55UmlnaHRfZGVjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tYW55UmlnaHRfZGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYmE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWFueVJpZ2h0X2RlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWVzc2FnZV9iZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWVzc2FnZV9iZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTQyMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21lc3NhZ2VfYmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhFbGVtZW50X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWV0aEVsZW1lbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWV0aEVsZW1lbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tZXRoUGVybWlzc2lvbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhQZXJtaXNzaW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTVjYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhQZXJtaXNzaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWV0aFRyYW5zYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbWV0aFRyYW5zYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2YzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhUcmFuc2FjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhvZHNfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTRhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21ldGhvZHNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tb2R1bGVfY2xpZW50YXBwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX2NsaWVudGFwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTIxYThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tb2R1bGVfY2xpZW50YXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX2VqYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21vZHVsZV9lamJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3Y2YwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L21vZHVsZV9ncm91cC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX2dyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0ZDlkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX2dyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tb2R1bGVfd2ViX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbW9kdWxlX3dlYl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdiN2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tb2R1bGVfd2ViX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvbXNnZHJpdmVuZGVzdGluYXRpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tc2dkcml2ZW5kZXN0aW5hdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZkY2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9tc2dkcml2ZW5kZXN0aW5hdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L29wdF9yZWFkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9vcHRfcmVhZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNGQ2Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L29wdF9yZWFkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9vcHRfdXBkYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9vcHRfdXBkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZDA2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvb3B0X3VwZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcGFyYW1ldGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcGFyYW1ldGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZTA3MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3BhcmFtZXRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Blc3NfcmVhZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcGVzc19yZWFkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxYWFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcGVzc19yZWFkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wZXNzX3VwZGF0ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcGVzc191cGRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZmNmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wZXNzX3VwZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcHJpbWFyeUtleV9hY3RpdmVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wcmltYXJ5S2V5X2FjdGl2ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI3MWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wcmltYXJ5S2V5X2FjdGl2ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3ByaW1hcnlLZXlfaW5hY3RpdmVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wcmltYXJ5S2V5X2luYWN0aXZlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWMxMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3ByaW1hcnlLZXlfaW5hY3RpdmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wcmp1dGlsamFyX21pc3Npbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9wcmp1dGlsamFyX21pc3Npbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4NTZlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcHJqdXRpbGphcl9taXNzaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcHJqdXRpbGphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3ByanV0aWxqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwZDk2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcHJqdXRpbGphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3FuYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9xbmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDE1OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3FuYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9xdWVyeV9tZXRob2Rfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9xdWVyeV9tZXRob2Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNDQwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcXVlcnlfbWV0aG9kX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVhZGFoZWFkaGludF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3JlYWRhaGVhZGhpbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjMjQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVhZGFoZWFkaGludF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3JlbGF0aW9uc2hpcF9yb2xlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVsYXRpb25zaGlwX3JvbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyMjg0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVsYXRpb25zaGlwX3JvbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9yZW1JbnRfZGVjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9yZW1JbnRfZGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMDcxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVtSW50X2RlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZTM5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Jlc19lbnZfcmVmX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzX2Vudl9yZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMmFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzX2Vudl9yZWZfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9yZXNvdXJjZVJlZl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlUmVmX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGE2N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlUmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzb3VyY2VfYWRhcHRlcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlX2FkYXB0ZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5YzY2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzb3VyY2VfYWRhcHRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Jlc291cmNlX3JlZmVyZW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzb3VyY2VfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YTY3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcmVzb3VyY2VfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9yb2xlS2V5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcm9sZUtleV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRhODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9yb2xlS2V5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcm9sZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3JvbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjNzZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcm9sZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3J1bl9iaW5kaW5nX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcnVuX2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4MGI0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcnVuX2JpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ydW5fbWFwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvcnVuX21hcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUzNzRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9ydW5fbWFwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJfcm9sZV9yZWZfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cl9yb2xlX3JlZl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFlMWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cl9yb2xlX3JlZl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5X2lkZW50aXR5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfaWRlbnRpdHlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxMzIwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfaWRlbnRpdHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eV9wZXJtaXNzaW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfcGVybWlzc2lvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzNmZTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eV9wZXJtaXNzaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfcm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzkwMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5X3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5X3JvbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eV9yb2xlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzkwMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5X3JvbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eV9yb2xlX3JlZmVyZW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlfcm9sZV9yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U0NThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eV9yb2xlX3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlyb2xlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VjdXJpdHlyb2xlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjI1MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5cm9sZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5cm9sZWJpbmRpbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZWN1cml0eXJvbGViaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2M3NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NlY3VyaXR5cm9sZWJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2ZXJQYXVzZWRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2ZXJQYXVzZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmY2Y1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmVyUGF1c2VkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ2NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3Nlc3Npb25CZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uX3Njb3BlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uX3Njb3BlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3YjAxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbl9zY29wZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvc2hvd3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zaG93d2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zaG93d2Fybl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NxbF9xdWVyeV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3NxbF9xdWVyeV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEzMmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi9zcWxfcXVlcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi90aW1vdXRfc2NvcGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3RpbW91dF9zY29wZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzNiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3RpbW91dF9zY29wZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNhY3Rpb25fc2NvcGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3RyYW5zYWN0aW9uX3Njb3BlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2NWE4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNhY3Rpb25fc2NvcGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3VuZGVmaW5lZFJpZ2h0X2RlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdW5kZWZpbmVkUmlnaHRfZGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4YzcxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdW5kZWZpbmVkUmlnaHRfZGVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi91c2VyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdXNlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGEwMDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi91c2VyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdXRpbGphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3V0aWxqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMTVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvdXRpbGphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dhckJpbmRpbmdfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93YXJCaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzFmYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dhckJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93YXJFeHRlbnNpb25fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93YXJFeHRlbnNpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlNzk3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2FyRXh0ZW5zaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2FyRmlsZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dhckZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NDc3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2FyRmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYlNlcnZpY2VJdGVtUHJvdmlkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYlNlcnZpY2VJdGVtUHJvdmlkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYlNlcnZpY2VzRm9sZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzAzOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYlNlcnZpY2VzRm9sZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2xpYnJhcnlfcHJvamVjdF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYl9saWJyYXJ5X3Byb2plY3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ODM4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2xpYnJhcnlfcHJvamVjdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJncm91cF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYmdyb3VwX2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjQyYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL29iajE2L3dlYmdyb3VwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb2JqMTYvd2ViZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vYmoxNi93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfMF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfMF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI5OTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzFfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzFfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNzcyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV8xX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV8yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV8yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTBhZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfMl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfM19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfM19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODg4ZDU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzNfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzRfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8xXzRfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhZmZiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV80X292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV81X292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMV81X292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjM2NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzFfNV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzJfMF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzJfMF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGIxMDVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzFfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzFfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3Mjc2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMl8xX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMl8yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMl8yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YTJiZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzJfMl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzJfM19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2LzJfM19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzcxNDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzNfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzRfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi8yXzRfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllNmY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvMl80X292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvY2FsbGVyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvY2FsbGVyX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjMzN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2NhbGxlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjFjYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlNzdiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvZGF0YWJhc2Vfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9kYXRhYmFzZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWIzMjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9kYXRhYmFzZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTBkNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9lamJxbF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2VqYnFsX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODFkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2VqYnFsX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2Z1bGxzZWxlY3Rfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9mdWxsc2VsZWN0X292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmIzZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2Z1bGxzZWxlY3Rfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2JmZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZl9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYva2V5X2ludGVyZl9vdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNzA0NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2xvY2FsX2hvbWVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODI3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2xvY2FsX2hvbWVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2xvY2FsX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTE2NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L2xvY2FsX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvb3B0aW1pc3RpY19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L29wdGltaXN0aWNfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNzFmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvb3B0aW1pc3RpY19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZfb3YuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM5Y2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9yZW1vdGVfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZWN1cml0eXJvbGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZWN1cml0eXJvbGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2MWFiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VjdXJpdHlyb2xlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmVyX2NvbmZpZ19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3NlcnZlcl9jb25maWdfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0MWJkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmVyX2NvbmZpZ19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3NlcnZlcl9pbnN0X292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmVyX2luc3Rfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjOTFhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmVyX2luc3Rfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlOGIzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmVyX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2Vfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YwNjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3VzZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi91c2VyX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Nzk3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL292cjE2L3VzZXJfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvd2ViX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU5NjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvb3ZyMTYvd2hlcmVjbGF1c2Vfb3ZyLkdJRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi93aGVyZWNsYXVzZV9vdnIuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdiNjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9vdnIxNi93aGVyZWNsYXVzZV9vdnIuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0LzF4X2NtcGJlYW5fcGFsZXR0ZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0LzF4X2NtcGJlYW5fcGFsZXR0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU3NWRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC8xeF9jbXBiZWFuX3BhbGV0dGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC8yeF9jbXBiZWFuX3BhbGV0dGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC8yeF9jbXBiZWFuX3BhbGV0dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZDVlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvMnhfY21wYmVhbl9wYWxldHRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvYm1wRW50aXR5X3BhbGV0dGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9ibXBFbnRpdHlfcGFsZXR0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTVkN2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9ibXBFbnRpdHlfcGFsZXR0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0L2VqYl9yZGJtYXBwaW5nX3BhbGV0dGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9lamJfcmRibWFwcGluZ19wYWxldHRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjBiNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0L2VqYl9yZGJtYXBwaW5nX3BhbGV0dGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9lamJfcmVmZXJlbmNlX3BhbGV0dGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9lamJfcmVmZXJlbmNlX3BhbGV0dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MjM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvZWpiX3JlZmVyZW5jZV9wYWxldHRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvaW5oZXJlbGVqYl9wYWxldHRlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvaW5oZXJlbGVqYl9wYWxldHRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMmNhOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0L2luaGVyZWxlamJfcGFsZXR0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0L21lc3NhZ2VfYmVhbl9wYWxldHRlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvbWVzc2FnZV9iZWFuX3BhbGV0dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0ZmFiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvbWVzc2FnZV9iZWFuX3BhbGV0dGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9yZWxhdGlvbnNoaXBfcm9sZV9wYWxldHRlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvcmVsYXRpb25zaGlwX3JvbGVfcGFsZXR0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdhMjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC9wYWwyNC9yZWxhdGlvbnNoaXBfcm9sZV9wYWxldHRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvc2Vzc2lvbkJlYW5fcGFsZXR0ZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3BhbDI0L3Nlc3Npb25CZWFuX3BhbGV0dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMGQ1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvcGFsMjQvc2Vzc2lvbkJlYW5fcGFsZXR0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8xMV9jbXBiZWFuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzExX2NtcGJlYW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5OWFlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzExX2NtcGJlYW5fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMTFfZWpiX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzExX2VqYl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJhN2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMTFfZWpiX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzExX2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8xMV9lamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxYTcwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzExX2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8xMl9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMTJfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjQyMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8xMl9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMTNfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzEzX2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZlOWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMTNfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzIwX2NtcGJlYW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMjBfY21wYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM5NjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMjBfY21wYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8yMF9lamJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMjBfZWpiX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzUwOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi8yMF9lamJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMjBfZWpiamFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuLzIwX2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2IyYjlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vMjBfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL1NlcnZpY2VyZWZfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vU2VydmljZXJlZl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhiY2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vU2VydmljZXJlZl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hY2Nlc3NfaW50ZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FjY2Vzc19pbnRlbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlZDg3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FjY2Vzc19pbnRlbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vYWNjZXNzYmVhbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hY2Nlc3NiZWFuX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2ZiYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hY2Nlc3NiZWFuX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF9tZXNzX2Rlc3Rfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF9tZXNzX2Rlc3Rfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTQxY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hZGRfbWVzc19kZXN0X3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfZXhwb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlZjIyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF9leHBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTAwYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwZmNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hdHRyaWJ1dGVfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vYXR0cmlidXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzBlNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9hdHRyaWJ1dGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vYmVhbnNlbGVjdGlvbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9iZWFuc2VsZWN0aW9uX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTAyYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9iZWFuc2VsZWN0aW9uX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2JtcF9iZWFuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2JtcF9iZWFuX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzg2N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9ibXBfYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9jbXBfYmVhbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9jbXBfYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzA5ZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vY21wX2JlYW5fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZGVsX2NsaWVudHZpZXdfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZGVsX2NsaWVudHZpZXdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyODJmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2RlbF9jbGllbnR2aWV3X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4YjEyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lYXJpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWFyaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTQ0N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lYXJpbXBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWFycHViX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VhcnB1Yl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNiMzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWFycHViX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl9tb2R1bGVfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiX21vZHVsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIyOTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiX21vZHVsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJfcmVmX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl9yZWZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NWQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl9yZWZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiX3V0aWxpdHlfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiX3V0aWxpdHlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmOTI3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl91dGlsaXR5X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZTI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJiaW5kaW5nX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmJpbmRpbmdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlZTZjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmJpbmRpbmdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiY2xpZW50amFyX3dpemJhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmNsaWVudGphcl93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFkYTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiY2xpZW50amFyX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmNvbXBvc2VyYmFubmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmNvbXBvc2VyYmFubmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzI0ZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJjb21wb3NlcmJhbm5lcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJleGFtcGxlX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmV4YW1wbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiY2IyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmV4YW1wbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiZXhwb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmV4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2E4NDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmltcG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMzUxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYmltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTQxZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnFsX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnFsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTI3Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJxbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lamJyZGJtYXBwaW5nX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnJkYm1hcHBpbmdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYmMzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnJkYm1hcHBpbmdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZW52X3JlZl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lbnZfcmVmX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MGY4MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lbnZfcmVmX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2Vudl92YXJpYWJsZV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9lbnZfdmFyaWFibGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxODkyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2Vudl92YXJpYWJsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYTQwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NmY5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTMxMTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0N2YxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWVhY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQxOGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjFlM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTgxY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZjODY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5ZGZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDI3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2luaGVyaXRhbmNlX2hpZXJhcmNoeV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbmhlcml0YW5jZV9oaWVyYXJjaHlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1ZDIyZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9pbmhlcml0YW5jZV9oaWVyYXJjaHlfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaXNvbGF0aW9ubGV2ZWxfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vaXNvbGF0aW9ubGV2ZWxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2lzb2xhdGlvbmxldmVsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2phdmFwcmpfdG9fZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2phdmFwcmpfdG9fZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTM4Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9qYXZhcHJqX3RvX2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9qYXZhdmlzdWFsZWRpdG9yX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2phdmF2aXN1YWxlZGl0b3Jfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1MTAxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL2phdmF2aXN1YWxlZGl0b3Jfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbG9jYWxfZWpiX3JlZl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9sb2NhbF9lamJfcmVmX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjEyZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9sb2NhbF9lamJfcmVmX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL21lc3NhZ2VfYmVhbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9tZXNzYWdlX2JlYW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyNTEzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL21lc3NhZ2VfYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9tZXNzZGVzdHJlZl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9tZXNzZGVzdHJlZl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA2NzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbWVzc2Rlc3RyZWZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbWV0aG9kX3Blcm1pc3Npb25fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbWV0aG9kX3Blcm1pc3Npb25fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhOTVjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL21ldGhvZF9wZXJtaXNzaW9uX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL21ldGhvZF90cmFuc2FjdGlvbl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9tZXRob2RfdHJhbnNhY3Rpb25fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5MmU4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL21ldGhvZF90cmFuc2FjdGlvbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdfYXBwY2xpZW50cHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdfYXBwY2xpZW50cHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQyZmRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2FwcGNsaWVudHByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2NsaWVudHZpZXdfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2NsaWVudHZpZXdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkYzQ1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld19jbGllbnR2aWV3X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2FjY2Vzc2JlYW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3YWNjZXNzYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzJmNjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3YWNjZXNzYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdhcHBjbGllbnRwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3YXBwY2xpZW50cHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNGYwMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdhcHBjbGllbnRwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWY4ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1ZjdhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlamJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZWpiX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjllYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlamJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZWpiZXhfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZWpiZXhfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0NDdmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2VqYmV4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4MjljMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZWpicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjhiMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdlamJwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZmlsdGVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2ZpbHRlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI0ZDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZmlsdGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2xpc3RlbmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld2xpc3RlbmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTcxZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdsaXN0ZW5lcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3NlcnZsZXRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTU3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY0ZTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dlYmV4X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dlYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2MyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9uZXd3cHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NDRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vcHJlbG9hZF9yZWxhdGlvbnNoaXBfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vcHJlbG9hZF9yZWxhdGlvbnNoaXBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1NzYwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3ByZWxvYWRfcmVsYXRpb25zaGlwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3JlZ2VuYWJuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3JlZ2VuYWJuX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDkxNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9yZWdlbmFibl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9yZWxhdGlvbnNoaXBfcm9sZV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9yZWxhdGlvbnNoaXBfcm9sZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ4MzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vcmVsYXRpb25zaGlwX3JvbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vcmVwbGFjZV9yb2xlX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3JlcGxhY2Vfcm9sZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM1MmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vcmVwbGFjZV9yb2xlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3Jlc291cmNlX3JlZl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9yZXNvdXJjZV9yZWZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2MzIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3Jlc291cmNlX3JlZl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWN1cl9yb2xlX3JlZl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWN1cl9yb2xlX3JlZl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI5NDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vc2VjdXJfcm9sZV9yZWZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vc2VjdXJfcm9sZV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWN1cl9yb2xlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWRiNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWN1cl9yb2xlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NlY3VyaXR5X2lkZW50aXR5X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NlY3VyaXR5X2lkZW50aXR5X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDMxNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWN1cml0eV9pZGVudGl0eV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zZWxlY3RiZWFuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NlbGVjdGJlYW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzODQ1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NlbGVjdGJlYW5fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vc2Vzc2lvbl9iZWFuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3Nlc3Npb25fYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEzNjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vc2Vzc2lvbl9iZWFuX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NxbF9xdWVyeV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi9zcWxfcXVlcnlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZWU2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3NxbF9xdWVyeV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi90YWJsZW1hcHBpbmdzdHJhdGVneV93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi90YWJsZW1hcHBpbmdzdHJhdGVneV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQyZDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vdGFibGVtYXBwaW5nc3RyYXRlZ3lfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vdXNlcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi91c2VyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzcxZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi91c2VyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3VzZXJncm91cF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi91c2VyZ3JvdXBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYzkyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3VzZXJncm91cF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGMwNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9mdWxsL3dpemJhbi93YXJpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiZWJlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9nZXRzdGFydF9hLkdJRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvZ2V0c3RhcnRfYS5HSUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzFlNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9nZXRzdGFydF9hLkdJRgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTAyZWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9yZWFkY29tX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9yZWFkY29tX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmZlNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9pc29sYXRpb25fbGV2ZWxfcmVhZGNvbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9pc29sYXRpb25fbGV2ZWxfcmVhZHVuY29tX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9yZWFkdW5jb21fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZTRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9yZWFkdW5jb21fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvaXNvbGF0aW9uX2xldmVsX3JlcHJlYWRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvaXNvbGF0aW9uX2xldmVsX3JlcHJlYWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ODljZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9yZXByZWFkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9zZXJpYWxpel9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9pc29sYXRpb25fbGV2ZWxfc2VyaWFsaXpfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYjNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2lzb2xhdGlvbl9sZXZlbF9zZXJpYWxpel9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9qYXJfbm9uZXhpc3Rfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvamFyX25vbmV4aXN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmFiMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9qYXJfbm9uZXhpc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvamFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzMxNWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2phdmFfcHJvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL2phdmFfcHJvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODczZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9qYXZhX3Byb3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9rZXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9rZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FmMzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMva2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbWVzc2FnZV9iZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL21lc3NhZ2VfYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U0MjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbWVzc2FnZV9iZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL21ldGhFbGVtZW50X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL21ldGhFbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTI3Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9tZXRoRWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9tZXRoUGVybWlzc2lvbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9tZXRoUGVybWlzc2lvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjU1Y2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbWV0aFBlcm1pc3Npb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbWV0aFRyYW5zYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL21ldGhUcmFuc2FjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNmM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbWV0aFRyYW5zYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL21zZ2RyaXZlbmJlYW5fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbXNnZHJpdmVuYmVhbl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVhZTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvbXNnZHJpdmVuYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9uZXdqcHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL25ld2pwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxMzdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL25ld2pwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYjAyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L2NvbXBvbmVudHNjb3BlZHJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MzM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi9sb2NhbGVuY29kaW5nbWFwcGluZ19vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi9sb2NhbGVuY29kaW5nbWFwcGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1NWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvbG9jYWxlbmNvZGluZ21hcHBpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvbWVzc2Rlc3RyZWZfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvbWVzc2Rlc3RyZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4MzBkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L21lc3NkZXN0cmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMGUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi9xbmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3FuYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MTU5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3FuYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBjNWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3NlcnZpY2VyZWZfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvc2VydmljZXJlZl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWZkMWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvb2JqMTYvc2VydmljZXJlZl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcHJpbWFyeUtleV9hY3RpdmVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcHJpbWFyeUtleV9hY3RpdmVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiNzFkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3ByaW1hcnlLZXlfYWN0aXZlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3ByaW1hcnlLZXlfaW5hY3RpdmVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcHJpbWFyeUtleV9pbmFjdGl2ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFjMTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcHJpbWFyeUtleV9pbmFjdGl2ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yZGFoZWFkaGludF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yZGFoZWFkaGludF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMyNDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcmRhaGVhZGhpbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcmVzb3VyY2VSZWZfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcmVzb3VyY2VSZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YTY3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3Jlc291cmNlUmVmX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYmE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yb2xlS2V5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGVLZXlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0YTg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGVLZXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvcm9sZV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yb2xlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Yzc2ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yb2xlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGVpZF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9yb2xlaWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4MzE2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3JvbGVpZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9zZXJ2ZXJQYXVzZWRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvc2VydmVyUGF1c2VkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmNmNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9zZXJ2ZXJQYXVzZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3Nlc3Npb25iZWFuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3Nlc3Npb25iZWFuX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YThkNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy9zZXNzaW9uYmVhbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93YXJCaW5kaW5nX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhckJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MWZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhckJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FyRXh0ZW5zaW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhckV4dGVuc2lvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3OTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FyRXh0ZW5zaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhckZpbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FyRmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVjYjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FyRmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93YXJuX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNzUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhcm5fdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FybmluZ19jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dhcm5pbmdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJkYWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYl9hcHBsaWNhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJfYXBwbGljYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWU3MDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvQXJyb3dEb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvQXJyb3dVcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L0Fycm93VXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYwNTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvQXJyb3dVcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2FkZF9jb2x1bW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9hZGRfY29sdW1uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2ZTVhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2FkZF9jb2x1bW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25uZWN0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvY29ubmVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWZlNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25uZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvY29udmVydGxpbmtzX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2NvbnZlcnRsaW5rc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc1Y2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvY29udmVydGxpbmtzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2RlZmF1bHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9kZWZhdWx0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiYWMzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRmdHBfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0ZnRwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjZlOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRmdHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGZ0cF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRmdHBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwZTA0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGZ0cF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRodHRwX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3Njg3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L21ldGhvZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L21ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzY1MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2RyZXR1cm4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2RyZXR1cm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjhhZTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kcmV0dXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvbmV3d2ViZXhfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvbmV3d2ViZXhfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlODZkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYmV4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3ZWJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NmIzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi93YXJGaWxlX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlY2I3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2N0b29sMTYvd2ViX2FwcGxpY2F0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMDQxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkZDJkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvbGlua3N2aWV3MTYvbWFpbHRvX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvbGlua3N2aWV3MTYvbWFpbHRvX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2YxMmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL2xpbmtzdmlldzE2L21haWx0b192aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L2FzY2lpLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L2FzY2lpLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMDI4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9vYmoxNi9hc2NpaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9vYmoxNi9iaW5hcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvYmluYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2MzNhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9vYmoxNi9iaW5hcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L2Vudmlyb25tZW50X2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDQzZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9vYmoxNi9qYXZhX3Byb3BlcnRpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg3M2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RfcmV0dXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L21ldGhvZF9yZXR1cm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4NTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L21ldGhvZF9yZXR1cm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvcHJvamxpYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvcHJvamxpYl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEyZGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L3Byb2psaWJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWJlY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvc2FtcGxlMTYvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMwMjg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWIyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdmlldzE2L2NvbG91cnBhbF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNGRhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdmlldzE2L2dhbGxlcnlfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvZ2FsbGVyeV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3NzllNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvZ2FsbGVyeV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3ZpZXcxNi9saW5rc192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3ZpZXcxNi9saW5rc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkOWM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvbGlua3Nfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC92aWV3MTYvc2FtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3ZpZXcxNi9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE4MWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3ZpZXcxNi9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3ZpZXcxNi90aHVtYm5haWxfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYWJiY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi9mdHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi9mdHBpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjOGMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vZnRwaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vZnRwcHViX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vZnRwcHViX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjJiZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL2Z0cHB1Yl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi9odHRwaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYzgxODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL25ld3dlYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2MyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL25ld3dlYmV4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NDRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ0b29sc2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi93YXJleHBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi93YXJpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidG9vbHNpY29ucy9mdWxsL3dpemJhbi93YXJpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiZWJlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnRvb2xzaWNvbnMvZnVsbC93aXpiYW4vd2FyaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvMTFfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvMTFfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NWFhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zLzExX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zLzExX2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zLzExX2VqYmphcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzRhZGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy8xMV9lamJqYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy8yMF9lamJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy8yMF9lamJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiZWJjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvMjBfZWpiX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvMjBfZWpiamFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvMjBfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTk0YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zLzIwX2VqYmphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL1NlcnZsZXRDcmVhdGVJbml0UGFyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL1NlcnZsZXRDcmVhdGVJbml0UGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIyODliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9TZXJ2bGV0Q3JlYXRlSW5pdFBhcmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9XZWJBcHBDcmVhdGVDb250ZXh0UGFyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTBhNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uQ3JlYXRlVVJMUGF0dGVyblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL1dlYlJlc291cmNlQ29sbGVjdGlvbkNyZWF0ZVVSTFBhdHRlcm5UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3NWViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uQ3JlYXRlVVJMUGF0dGVyblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2F1dGhvcml0eV9jb25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9hdXRob3JpdHlfY29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjRjNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2F1dGhvcml0eV9jb25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9jcmVhdGVfY2hpbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2NyZWF0ZV9jaGlsZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjhmNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2NyZWF0ZV9jaGlsZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZXJyb3JfcGFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZXJyb3JfcGFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWIyMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2Vycm9yX3BhZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2Vycm9yY29kZV9lcnJvcnBhZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2Vycm9yY29kZV9lcnJvcnBhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFiMjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9lcnJvcmNvZGVfZXJyb3JwYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9leGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDU1NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZmlsdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9maWx0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzEyZDFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9maWx0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2ZpbHRlcl9tYXBwaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9maWx0ZXJfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmUzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2ZpbHRlcl9tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9mb3JtX2xvZ2luX2NvbmZpZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZm9ybV9sb2dpbl9jb25maWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZjYmIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9mb3JtX2xvZ2luX2NvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZnVsbC93aXpiYW4vbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2Z1bGwvd2l6YmFuL25ld3NlcnZsZXRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTU3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvZnVsbC93aXpiYW4vbmV3c2VydmxldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2h0dHBfdHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvaHR0cF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2YzcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvaHR0cF90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJhNTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2pzcF9saWJyYXJ5X3JlZmVyZW5jZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YjUwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9qc3BfdHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvanNwX3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYzNjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9qc3BfdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvbGlzdGVuZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL2xpc3RlbmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyMDQ3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvbGlzdGVuZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL21pbWVfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvbWltZV9tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0Nzc1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvbWltZV9tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvbmV3c2VydmxldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVlYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTU0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3NlY3VyaXR5X2NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3NlY3VyaXR5X3JvbGVfbmFtZXR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3NlY3VyaXR5X3JvbGVfbmFtZXR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTEzMjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZWN1cml0eV9yb2xlX25hbWV0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VydmxldF9tYXBwaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXJ2bGV0X21hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk1YWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXJ2bGV0X21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3NlcnZsZXRfdHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VydmxldF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOWQyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2VydmxldF90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXNzaW9uX2NvbmZpZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvc2Vzc2lvbl9jb25maWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjJjMWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy9zZXNzaW9uX2NvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvdXJsX3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3VybF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2YzcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvdXJsX3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy91c2VyX2RhdGFfY29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGM5YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWJfYXBwbGljYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYl9yZXNvdXJjZV9jb2xsZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiYTdjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYl90eXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWJfdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYl90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWJhcHBfMTIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYmFwcF8xMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDZjNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlYmFwcF8xMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvd2ViYXBwXzEzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWJhcHBfMTMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWMyNGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWJhcHBfMTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlbGNvbWVfZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvd2VsY29tZV9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYWI4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3dlYnVpSWNvbnMvd2VsY29tZV9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvaWNvbnMvd2VidWlJY29ucy93ZWxjb21lX2xpc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlbGNvbWVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzcxMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy93ZWJ1aUljb25zL3dlbGNvbWVfbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3htbF9pbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2ljb25zL3htbF9pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTZjYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9pY29ucy94bWxfaW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9FbnRlcnByaXNlQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0VudGVycHJpc2VBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwYmY0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0VudGVycHJpc2VBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLldvcmtpbmdDb3B5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5Xb3JraW5nQ29weVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgb2J0YWlucyBhIHR5cGUtc3BlY2lmaWMgSjJFRSBtZXRhbW9kZWwgZnJvbSB0aGUgbWFuYWdlZAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfS4gVGhlIHVuZGVybHlpbmcgRWRpdE1vZGVsIG1haW50YWlucwotICoge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlfXMsIHN1Y2ggYXMgdGhlIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiByZXNvdXJjZS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcywgYW5kIGNsaWVudHMgYXJlIGludGVuZGVkIHRvIHN1YmNsYXNzIGFuZCBvd24gdGhlaXIKLSAqIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCBleHRlbmRzIEFydGlmYWN0RWRpdCBpbXBsZW1lbnRzIFdvcmtpbmdDb3B5UHJvdmlkZXIsIElNb2RlbFByb3ZpZGVyLCBJTW9kZWxQcm92aWRlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFNVUFBPUlRfTEVHQUNZX1BST0pFQ1RTID0gdHJ1ZTsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCB3cml0YWJsZUVkaXQgPSAgbnVsbDsgCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVudGVycHJpc2VBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVudGVycHJpc2VBcnRpZmFjdEVkaXQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSl7Ci0JCXN1cGVyKGFNb2R1bGUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUsIFN0cmluZyBwcm9qZWN0VHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHksIGZvckNyZWF0ZSwgcHJvamVjdFR5cGUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIHRoYXQgdXNlIHRoaXMgY29uc3RydWN0b3IgYXJlIHJlcXVpcmVkIHRvIHJlbGVhc2UgdGhlaXIgYWNjZXNzIG9mIHRoZSBFZGl0TW9kZWwgd2hlbgotCSAqIGZpbmlzaGVkLiBDYWxsaW5nIHtAc2VlIEFydGlmYWN0RWRpdCNkaXNwb3NlKCl9d2lsbCBub3QgdG91Y2ggdGhlIHN1cHBsaWVkIEVkaXRNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIHByb3Blcmx5LWFjY2Vzc2VkIEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEluc3RhbmNlcyBvZiBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZQotCSAqIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0KLQlwcm90ZWN0ZWQgRW50ZXJwcmlzZUFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBbiB0aGUgSjJFRSBTcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhlIHVuZGVybHlpbmcge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SjJFRVZlcnNpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZSBmcm9tIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfXVzaW5nIGEgZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvcnJlY3QgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlIGZvciB0aGUgdW5kZXJseWluZwotCSAqICAgICAgICAge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSByb290IG9iamVjdCBmcm9tIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLCB0aGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsCi0JICogb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLiBFeGFtcGxlcyBvZiBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGluY2x1ZGU6Ci0JICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwfSwKLQkgKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbn0sIGFuZAotCSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXJ9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY3JlYXRhaW9uLwotCSAqIHJldHJpZXZhbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBBbiBFTUYgbWV0YW1vZGVsIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogCi0JICovCi0KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCVJlc291cmNlIHJlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJaWYgKCFyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKEVPYmplY3QpIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdvcmtpbmcgY29weSBtYW5hZ2V0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCi0JcHVibGljIFdvcmtpbmdDb3B5TWFuYWdlciBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJdGhyb3dBdHRlbXB0ZWRCaW5hcnlFZGl0TW9kZWxBY2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gKChKYXZhQXJ0aWZhY3RFZGl0TW9kZWwpZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKSkuZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZ2V0V29ya2luZ0NvcHkoY3UsIGZvck5ld0NVKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlyZXR1cm4gRW50ZXJwcmlzZUFydGlmYWN0RWRpdC5TVVBQT1JUX0xFR0FDWV9QUk9KRUNUUyB8fCBwcmltVmFsaWRQcm9qZWN0VmVyc2lvbihwcm9qZWN0KTsKLQl9Ci1wcm90ZWN0ZWQgYm9vbGVhbiBwcmltVmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQkvLyBSZXR1cm4gdHJ1ZSBpZiBwcm9qZWN0IGlzIGJlaW5nIGNyZWF0ZWQKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSByZXR1cm4gdHJ1ZTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIE5vdGhpbmcKLQkJfQotCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkKLQkJCS8vIFJldHVybiB0cnVlIGlmIHByb2plY3QgZmFjZXQgaXMgYmVpbmcgY3JlYXRlZAotCQkJcmV0dXJuIHRydWU7Ci0JCS8vcmV0dXJuIHRydWUgZm9yIGxlZ2FjeSBwcm9qZWN0cywgb3IgdXNlIHByZWZlcmVuY2UuCi0JCXJldHVybiAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4gRG9lcyBub3QgY29ubmVjdCB0aGUgZWRpdCBtb2RlbCB0byB0aGUgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0IGRvZXMKLQkgKiAgICAgICAgIG5vdCBlbmNvZGUgYW4gZWRpdG9yIGlucHV0LCBvciBpZiB0aGVyZSBpcyBubyByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcwotCSAqICAgICAgICAgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldEV4aXN0aW5nV29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldEV4aXN0aW5nV29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TW9kdWxlTG9jYXRpb24oU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkJaWYgKGdldFByb2plY3QoKSE9bnVsbCkKLQkJCXJldHVybiBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZGVsZXRlCi0JICogCi0JICogQGN1IGZyb20gdGhlIHdvcmtiZW5jaCBhbmQgZml4IHRoZSBpbnRlcm5hbCByZWZlcmVuY2VzIGZvciB0aGlzIHdvcmtpbmcgY29weSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGN1LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmRlbGV0ZShjdSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZSBpZiBvbmUgZG9lcyBub3QgZ2V0IGFuZCByZXR1cm4gaXQuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGVpciBvd24gdHlwZSBvZiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBFT2JqZWN0Ci0JICovCi0KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UgaWYgb25lIGRvZXMgbm90IGdldCBhbmQgcmV0dXJuIGl0LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlaXIgb3duIHR5cGUgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudAotCSAqIEByZXR1cm4gYW4gRU9iamVjdAotCSAqLwotCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKTsKLQkKLQlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb257Ci0JCXJldHVybiBhc0FyY2hpdmUoaW5jbHVkZVNvdXJjZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBBcmNoaXZlIGFzQXJjaGl2ZShib29sZWFuIGluY2x1ZGVTb3VyY2UsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsT2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotCQlpZiAoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0V3JpdGFibGVFZGl0KCkuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQlyZXR1cm4gZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsT2JqZWN0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsUGF0aCkgewotCQlpZiAoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9ICgoQXJ0aWZhY3RFZGl0TW9kZWwpZ2V0V3JpdGFibGVFZGl0KCkuZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpKS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKG1vZGVsUGF0aC50b1N0cmluZygpKSk7Ci0JCQlpZiAocmVzICE9IG51bGwgJiYgIXJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZWxzZSByZXR1cm4gbnVsbDsKLQkJfQotCQkJcmV0dXJuIGdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI21vZGlmeShqYXZhLmxhbmcuUnVubmFibGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQkvL0Fib3V0IHRvIG1vZGlmeSBhbmQgc2F2ZSB0aGlzIG1vZGVsCi0JCQotCQkvLyBhY2Nlc3MgbW9kZWwgICh3cml0ZSBjb3VudCkKLQkJLy8gY2FjaGUgd3JpdGFibGUgbW9kZWwgKHNldFdyaXRlYWJsZUVkaXQoKSkKLQkJLy8gcnVuIHJ1bm5hYmxlCi0JCS8vIHNhdmUgbW9kZWwKLQkJLy8gcmVsZWFzZSBhY2Nlc3MgY291bnQKLQkJLy8gbnVsbCBXcml0YWJsZSBFZGl0Ci0JCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJUGF0aCBtb2RlbFBhdGgsIE9iamVjdCBjb250ZXh0KSB7Ci0JCS8vIEFydGlmYWN0RWRpdCB3aWxsIHZhbGlkYXRlIGFsbCBmaWxlcyBpdCBtYW5hZ2VzLCBhbmQgdXNlcyBpdHMgb3duIGNvbnRleHQgbWVjaGFuaXNtCi0JCXJldHVybiB2YWxpZGF0ZUVkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JpdGFibGVFZGl0IHRoZSB3cml0YWJsZUVkaXQgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0V3JpdGFibGVFZGl0KEFydGlmYWN0RWRpdCB3cml0YWJsZUVkaXQpIHsKLQkJdGhpcy53cml0YWJsZUVkaXQgPSB3cml0YWJsZUVkaXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd3JpdGFibGVFZGl0Ci0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBnZXRXcml0YWJsZUVkaXQoKSB7Ci0JCXJldHVybiB3cml0YWJsZUVkaXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFZGl0TW9kZWxMaXN0ZW5lcikKLQkJewotCQkJYWRkTGlzdGVuZXIoKEVkaXRNb2RlbExpc3RlbmVyKWxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBFZGl0TW9kZWxMaXN0ZW5lcikKLQkJewotCQkJcmVtb3ZlTGlzdGVuZXIoKEVkaXRNb2RlbExpc3RlbmVyKWxpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0oyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzMxODg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBleHRlbmRzIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBOT19SRUZFUkVOQ0VTID0gbmV3IFZpcnR1YWxSZWZlcmVuY2VbMF07Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlua2VkVG9FQVIgPSB0cnVlOwotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBtYW5pZmVzdENsYXNzcGF0aDsKLQotCXB1YmxpYyBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIFN0cmluZyBhcmNoaXZlTG9jYXRpb24sIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYXJjaGl2ZUxvY2F0aW9uLCBhUnVudGltZVBhdGgpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCUxpc3QgZHluYW1pY1JlZmVyZW5jZXMgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXRNYW5pZmVzdFJlZmVyZW5jZXModGhpcywgbnVsbCk7Ci0JCWlmIChudWxsID09IGR5bmFtaWNSZWZlcmVuY2VzKSB7Ci0JCQlyZXR1cm4gTk9fUkVGRVJFTkNFUzsKLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGR5bmFtaWNSZWZlcmVuY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2R5bmFtaWNSZWZlcmVuY2VzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzcGF0aCgpIHsKLQkJaWYgKG51bGwgPT0gbWFuaWZlc3RDbGFzc3BhdGgpIHsKLQkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdCh0aGlzKTsKLQkJCWlmIChtYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQkJbWFuaWZlc3RDbGFzc3BhdGggPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJCX0KLQkJCWlmIChtYW5pZmVzdENsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQkJbWFuaWZlc3RDbGFzc3BhdGggPSBuZXcgU3RyaW5nWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYW5pZmVzdENsYXNzcGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5rZWRUb0VBUihib29sZWFuIGxpbmtlZFRvRUFSKSB7Ci0JCXRoaXMubGlua2VkVG9FQVIgPSBsaW5rZWRUb0VBUjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZFRvRUFSKCkgewotCQlyZXR1cm4gbGlua2VkVG9FQVI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBmOTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JQ29tcG9uZW50SW1wbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCBleHRlbmRzIFZpcnR1YWxDb21wb25lbnQgaW1wbGVtZW50cyBJQ29tcG9uZW50SW1wbEZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VUX0pBVkFfUkVGUyA9ICJHRVRfSkFWQV9SRUZTIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHRVRfRlVaWllfRUFSX1JFRlMgPSAiR0VUX0ZVWlpZX0VBUl9SRUZTIjsKLQkKLQlwdWJsaWMgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJc3VwZXIoYVByb2plY3QsIGFSdW50aW1lUGF0aCk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KGFQcm9qZWN0LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uLCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQoYVByb2plY3QsIGFyY2hpdmVMb2NhdGlvbiwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIGFsbCByZWZlcmVuY2VzIGV4Y2VwdCB0aG9zZSBjb21wdXRlZCBkeW5hbWljYWxseSBmcm9tCi0JICogdGFnZ2VkIEphdmEgY2xhc3NwYXRoIGVudHJpZXMuCi0JICogQHJldHVybiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGFsbCBub24tSmF2YSBjbGFzc3BhdGggZW50cnkgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXROb25KYXZhUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXMoZmFsc2UsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMpIHsKLQkJT2JqZWN0IG9iakdldEphdmFSZWZzID0gb3B0aW9ucy5nZXQoR0VUX0pBVkFfUkVGUyk7Ci0JCU9iamVjdCBvYmpHZXRGdXp6eUVhclJlZnMgPSBvcHRpb25zLmdldChHRVRfRlVaWllfRUFSX1JFRlMpOwotCQlib29sZWFuIGdldEphdmFSZWZzID0gb2JqR2V0SmF2YVJlZnMgIT0gbnVsbCA/ICgoQm9vbGVhbilvYmpHZXRKYXZhUmVmcykuYm9vbGVhblZhbHVlKCkgOiB0cnVlOwotCQlib29sZWFuIGZpbmRGdXp6eUVBUlJlZnMgPSBvYmpHZXRGdXp6eUVhclJlZnMgIT0gbnVsbCA/ICgoQm9vbGVhbilvYmpHZXRGdXp6eUVhclJlZnMpLmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2VzKGdldEphdmFSZWZzLCBmaW5kRnV6enlFQVJSZWZzKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXModHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKGZpbmFsIGJvb2xlYW4gZ2V0SmF2YVJlZnMsIGZpbmFsIGJvb2xlYW4gZmluZEZ1enp5RUFSUmVmcykgewotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzID0gZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKGdldEphdmFSZWZzKTsKLQkJCi0JCS8vIHJldHJpZXZlIHRoZSBkeW5hbWljIHJlZmVyZW5jZXMgc3BlY2lmaWVkIHZpYSB0aGUgTUFOSUZFU1QuTUYgY2xhc3NwYXRoIAotCQlMaXN0IGR5bmFtaWNSZWZlcmVuY2VzID0gSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuZ2V0TWFuaWZlc3RSZWZlcmVuY2VzKHRoaXMsIGhhcmRSZWZlcmVuY2VzLCBmaW5kRnV6enlFQVJSZWZzKTsKLQkJCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG51bGw7Ci0JCWlmIChkeW5hbWljUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VzID0gaGFyZFJlZmVyZW5jZXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZWZlcmVuY2VzID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW2hhcmRSZWZlcmVuY2VzLmxlbmd0aCArIGR5bmFtaWNSZWZlcmVuY2VzLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGhhcmRSZWZlcmVuY2VzLCAwLCByZWZlcmVuY2VzLCAwLCBoYXJkUmVmZXJlbmNlcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkeW5hbWljUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJCXJlZmVyZW5jZXNbaGFyZFJlZmVyZW5jZXMubGVuZ3RoICsgaV0gPSAoSVZpcnR1YWxSZWZlcmVuY2UpIGR5bmFtaWNSZWZlcmVuY2VzLmdldChpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXROb25NYW5pZmVzdFJlZmVyZW5jZXMoZmluYWwgYm9vbGVhbiBnZXRKYXZhUmVmcykgewotCQlmaW5hbCBMaXN0IGFsbFJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBhZGQgY29tcG9uZW50IGZpbGUgcmVmZXJlbmNlcwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzID0gc3VwZXIuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhhcmRSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxSZWZzLmFkZChoYXJkUmVmZXJlbmNlc1tpXSk7Ci0JCX0KLQotCQkvLyBhZGQgdGhlIGR5bmFtaWMgcmVmZXJlbmNlcyBzcGVjaWZpZWQgdmlhIHNwZWNpYWxseSB0YWdnZWQgSkRUIGNsYXNzcGF0aCBlbnRyaWVzCi0JCWlmIChnZXRKYXZhUmVmcykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSBnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcyhoYXJkUmVmZXJlbmNlcyk7IAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcFJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxSZWZzLmFkZChjcFJlZnNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGFsbFJlZnMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsUmVmcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBbXSBnZXRNYW5pZmVzdENsYXNzcGF0aChJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQpIHsKLQkJU3RyaW5nW10gbWFuaWZlc3RDbGFzc3BhdGggPSBudWxsOwotCQlpZighbW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkpewotCQkJSVZpcnR1YWxGaWxlIHZNYW5pZmVzdCA9IG1vZHVsZUNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQlpZiAodk1hbmlmZXN0LmV4aXN0cygpKSB7Ci0JCQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gdk1hbmlmZXN0LmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJCQkJbWFuaWZlc3RDbGFzc3BhdGggPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJaW4gPSBudWxsOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1hbmlmZXN0Q2xhc3NwYXRoID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpbW9kdWxlQ29tcG9uZW50KS5nZXRNYW5pZmVzdENsYXNzcGF0aCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbWFuaWZlc3RDbGFzc3BhdGg7Ci0JCQkKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcyhudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMpIHsKLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJZmluYWwgTGlzdCBjcFJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmFsIGJvb2xlYW4gaXNXZWJBcHAgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQodGhpcyk7Ci0JCQotCQl0cnkgewotCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSB8fCAhcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgeyAKLQkJCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCQkJfQotCi0JCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbMF07Ci0JCQl9Ci0KLQkJCS8vIHJldHJpZXZlIGFsbCByZWZlcmVuY2VkIGNsYXNzcGF0aCBlbnRyaWVzCi0JCQlmaW5hbCBNYXAgcmVmZXJlbmNlZEVudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QsIGlzV2ViQXBwKTsKLQotCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbMF07Ci0JCQl9Ci0KLQkJCWlmIChoYXJkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQkJLy8gb25seSBjb21wdXRlIHRoaXMgbm90IHNldCBhbmQgaWYgd2UgaGF2ZSBzb21lIGNwIGRlcGVuZGVuY2llcyAKLQkJCQloYXJkUmVmZXJlbmNlcyA9IHN1cGVyLmdldFJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJCWZpbmFsIElQYXRoW10gaGFyZFJlZlBhdGhzID0gbmV3IElQYXRoW2hhcmRSZWZlcmVuY2VzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGhhcmRSZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IGhhcmRSZWZlcmVuY2VzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcC5pc0JpbmFyeSgpKSB7Ci0JCQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wOwotCQkJCQlmaW5hbCBGaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCUlQYXRoIGRpc2tQYXRoID0gbnVsbDsKLQkJCQkJaWYgKGRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlkaXNrUGF0aCA9bmV3IFBhdGgoZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCSAgICAgICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbGUgaUZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCSAgICAgICAgICAgICAgICAgICAgZGlza1BhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCSAgICAgICAgICAgICAgICB9Ci0JCQkJCWhhcmRSZWZQYXRoc1tqXSA9IGRpc2tQYXRoOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSUNvbnRhaW5lcltdIG1hcHBlZENsYXNzRm9sZGVycyA9IG51bGw7Ci0JCQlmaW5hbCBJdGVyYXRvciBpID0gcmVmZXJlbmNlZEVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gKElDbGFzc3BhdGhBdHRyaWJ1dGUpIHJlZmVyZW5jZWRFbnRyaWVzLmdldChlbnRyeSk7Ci0JCQkJZmluYWwgYm9vbGVhbiBpc0NsYXNzRm9sZGVyID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKLQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJ1bnRpbWVQYXRoKGF0dHJpYiwgaXNXZWJBcHAsIGlzQ2xhc3NGb2xkZXIpOwkJCQkKLQkJCQlib29sZWFuIGFkZCA9IHRydWU7Ci0JCQkJZmluYWwgSVBhdGggZW50cnlMb2NhdGlvbiA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEVudHJ5TG9jYXRpb24oZW50cnkpOwotCQkJCWlmIChlbnRyeUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJLy8gdW5hYmxlIHRvIHJldHJpZXZlIGxvY2F0aW9uIGZvciBjcCBlbnRyeSwgZG8gbm90IGNvbnRyaWJ1dGUgYXMgYSB2aXJ0dWFsIHJlZgotCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKCFpc0NsYXNzRm9sZGVyKSB7IC8vIGNoZWNrIGhhcmQgYXJjaGl2ZSByZWZzCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaGFyZFJlZlBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoZW50cnlMb2NhdGlvbi5lcXVhbHMoaGFyZFJlZlBhdGhzW2pdKSkgewotCQkJCQkJCS8vIGVudHJ5IHJlc29sdmVzIHRvIHNhbWUgZmlsZSBhcyBleGlzdGluZyBoYXJkIHJlZmVyZW5jZSwgY2FuIHNraXAKLQkJCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGNoZWNrIGNsYXNzIGZvbGRlcnMgbWFwcGVkIGluIGNvbXBvbmVudCBmaWxlIGFzIGNsYXNzIGZvbGRlcnMgYXNzb2NpYXRlZCB3aXRoIG1hcHBlZCBzcmMgZm9sZGVycwotCQkJCQlpZiAobWFwcGVkQ2xhc3NGb2xkZXJzID09IG51bGwpIHsKLQkJCQkJCW1hcHBlZENsYXNzRm9sZGVycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbE91dHB1dENvbnRhaW5lcnMoZ2V0UHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1hcHBlZENsYXNzRm9sZGVycy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGVudHJ5TG9jYXRpb24uZXF1YWxzKG1hcHBlZENsYXNzRm9sZGVyc1tqXS5nZXRGdWxsUGF0aCgpKSkgewotCQkJCQkJCS8vIGVudHJ5IHJlc29sdmVzIHRvIHNhbWUgZmlsZSBhcyBleGlzdGluZyBjbGFzcyBmb2xkZXIgbWFwcGluZywgc2tpcAotCQkJCQkJCWFkZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IAotCQkJCX0KLQotCQkJCWlmIChhZGQpIHsKLQkJCQkJU3RyaW5nIGNvbXBvbmVudFBhdGggPSBudWxsOwotCQkJCQlDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBlbnRyeUNvbXBvbmVudCA9IG51bGw7Ci0JCQkJCS8qCi0JCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIHsKLQkJCQkJCWNvbXBvbmVudFBhdGggPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRTsKLQkJCQkJCWZpbmFsIElQcm9qZWN0IGNwRW50cnlQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQkJCWVudHJ5Q29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoY3BFbnRyeVByb2plY3QsIGNvbXBvbmVudFBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkqLwotCQkJCQljb21wb25lbnRQYXRoID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQ0xBU1NQQVRIQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBlbnRyeUxvY2F0aW9uLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJZW50cnlDb21wb25lbnQgPSBuZXcgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50UGF0aCwgaXNDbGFzc0ZvbGRlcik7Ci0JCQkJCS8vfQotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBlbnRyeVJlZmVyZW5jZSA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKHRoaXMsIGVudHJ5Q29tcG9uZW50LCBydW50aW1lUGF0aCk7Ci0JCQkJCWVudHJ5UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEFyY2hpdmVOYW1lKGVudHJ5KSk7Ci0JCQkJCWNwUmVmcy5hZGQoZW50cnlSZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGptZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGptZSk7Ci0JCX0gCi0JCQotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGNwUmVmcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtjcFJlZnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1hbmlmZXN0UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIGdldE1hbmlmZXN0UmVmZXJlbmNlcyhtb2R1bGVDb21wb25lbnQsIGhhcmRSZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5pZmVzdFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzLCBib29sZWFuIGZpbmRGdXp6eUVBUlJlZnMpIHsKLQkJTGlzdCBkeW5hbWljUmVmZXJlbmNlcyA9IG51bGw7Ci0JCVN0cmluZyBbXSBtYW5pZmVzdENsYXNzcGF0aCA9IGdldE1hbmlmZXN0Q2xhc3NwYXRoKG1vZHVsZUNvbXBvbmVudCk7IAotCi0JCUlWaXJ0dWFsUmVmZXJlbmNlIGZvdW5kUmVmID0gbnVsbDsKLQkJU3RyaW5nIGVhckFyY2hpdmVVUkkgPSBudWxsOyAvL1RoZSBVUkkgZm9yIHRoaXMgYXJjaGl2ZSBpbiB0aGUgRUFSCi0JCWJvb2xlYW4gc2ltcGxlUGF0aCA9IGZhbHNlOwotCQkKLQkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoICE9IG51bGwgJiYgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBbXSBmb3VuZFJlZkFscmVhZHkgPSBmaW5kRnV6enlFQVJSZWZzID8gbmV3IGJvb2xlYW5bbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoXTogbnVsbDsKLQkJCWlmKG51bGwgIT0gZm91bmRSZWZBbHJlYWR5KXsKLQkJCQlmb3IoaW50IGk9MDsgaTxmb3VuZFJlZkFscmVhZHkubGVuZ3RoOyBpKyspewotCQkJCQlmb3VuZFJlZkFscmVhZHlbaV0gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUlQcm9qZWN0IFtdIGVhclByb2plY3RzID0gRWFyVXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMobW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlmb3IgKElQcm9qZWN0IGVhclByb2plY3QgOiBlYXJQcm9qZWN0cykgewotCQkJCWlmKCFKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGVhclJlZnMgPSBudWxsOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRlbXBFQVJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHRlbXBFYXJSZWZzID0gdGVtcEVBUkNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZW1wRWFyUmVmcy5sZW5ndGggJiYgZWFyUmVmcyA9PSBudWxsOyBqKyspIHsKLQkJCQkJaWYgKHRlbXBFYXJSZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMobW9kdWxlQ29tcG9uZW50KSkgewotCQkJCQkJZWFyUmVmcyA9IHRlbXBFYXJSZWZzOwotCQkJCQkJZm91bmRSZWYgPSB0ZW1wRWFyUmVmc1tqXTsKLQkJCQkJCWVhckFyY2hpdmVVUkkgPSBmb3VuZFJlZi5nZXRBcmNoaXZlTmFtZSgpOyAKLQkJCQkJCXNpbXBsZVBhdGggPSBlYXJBcmNoaXZlVVJJICE9IG51bGwgPyBlYXJBcmNoaXZlVVJJLmxhc3RJbmRleE9mKCIvIikgPT0gLTEgOiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gZWFyUmVmcykgewotCQkJCQlmb3IgKGludCBtYW5pZmVzdEluZGV4ID0gMDsgbWFuaWZlc3RJbmRleCA8IG1hbmlmZXN0Q2xhc3NwYXRoLmxlbmd0aDsgbWFuaWZlc3RJbmRleCsrKSB7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlpZihmb3VuZFJlZkFscmVhZHkgIT0gbnVsbCAmJiBmb3VuZFJlZkFscmVhZHlbbWFuaWZlc3RJbmRleF0pewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlYXJSZWZzLmxlbmd0aCAmJiAhZm91bmQ7IGorKykgewotCQkJCQkJCWlmKGZvdW5kUmVmICE9IGVhclJlZnNbal0pewotCQkJCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSBlYXJSZWZzW2pdLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJCQkJCWlmIChudWxsICE9IGFyY2hpdmVOYW1lKXsKLQkJCQkJCQkJCWJvb2xlYW4gc2hvdWxkQWRkID0gZmFsc2U7Ci0JCQkJCQkJCQlpZihzaW1wbGVQYXRoICYmIG1hbmlmZXN0Q2xhc3NwYXRoW21hbmlmZXN0SW5kZXhdLmxhc3RJbmRleE9mKCIvIikgPT0gLTEpeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJc2hvdWxkQWRkID0gYXJjaGl2ZU5hbWUuZXF1YWxzKG1hbmlmZXN0Q2xhc3NwYXRoW21hbmlmZXN0SW5kZXhdKTsJCi0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCVN0cmluZyBlYXJSZWxhdGl2ZVVSSSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKG1hbmlmZXN0Q2xhc3NwYXRoW21hbmlmZXN0SW5kZXhdLCBlYXJBcmNoaXZlVVJJKTsKLQkJCQkJCQkJCQlpZihudWxsICE9IGVhclJlbGF0aXZlVVJJKXsKLQkJCQkJCQkJCQkJc2hvdWxkQWRkID0gZWFyUmVsYXRpdmVVUkkuZXF1YWxzKGFyY2hpdmVOYW1lKTsJCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihzaG91bGRBZGQpewotCQkJCQkJCQkJCWlmKGZpbmRGdXp6eUVBUlJlZnMpewotCQkJCQkJCQkJCQlmb3VuZFJlZkFscmVhZHlbbWFuaWZlc3RJbmRleF0gPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQkJYm9vbGVhbiBzaG91bGRJbmNsdWRlID0gdHJ1ZTsKLQkJCQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBkeW5hbWljQ29tcG9uZW50ID0gZWFyUmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJCQkJaWYobnVsbCAhPSBoYXJkUmVmZXJlbmNlcyl7Ci0JCQkJCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaGFyZFJlZmVyZW5jZXMubGVuZ3RoICYmIHNob3VsZEluY2x1ZGU7IGsrKykgewotCQkJCQkJCQkJCQkJaWYgKGhhcmRSZWZlcmVuY2VzW2tdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoZHluYW1pY0NvbXBvbmVudCkpIHsKLQkJCQkJCQkJCQkJCQlzaG91bGRJbmNsdWRlID0gZmFsc2U7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYgKHNob3VsZEluY2x1ZGUpIHsKLQkJCQkJCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgZHluYW1pY1JlZmVyZW5jZSA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKG1vZHVsZUNvbXBvbmVudCwgZHluYW1pY0NvbXBvbmVudCk7Ci0JCQkJCQkJCQkJCWlmIChudWxsID09IGR5bmFtaWNSZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCQkJCQlkeW5hbWljUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlkeW5hbWljUmVmZXJlbmNlcy5hZGQoZHluYW1pY1JlZmVyZW5jZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQkJaWYoIWZpbmRGdXp6eUVBUlJlZnMpewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlib29sZWFuIGZvdW5kQWxsID0gdHJ1ZTsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmb3VuZFJlZkFscmVhZHkubGVuZ3RoICYmIGZvdW5kQWxsOyBpKyspewotCQkJCQkJCWlmKCFmb3VuZFJlZkFscmVhZHlbaV0pewotCQkJCQkJCQlmb3VuZEFsbCA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGZvdW5kQWxsKXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZHluYW1pY1JlZmVyZW5jZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0FwcENsaWVudEJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9BcHBDbGllbnRCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMWFiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0FwcENsaWVudEJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNlZSB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfQotICogQGF1dGhvciBqYXNob2xsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyIGV4dGVuZHMgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlc0NvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSBuZXcgQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7Ci0JCQlyZXR1cm4gaGVscGVyLmlzQXJjaGl2ZVZhbGlkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuRGlzY3JpbWluYXRvciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgRGlzY3JpbWluYXRvciBpbnN0YW5jZTsKLQotCQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCWluc3RhbmNlID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlSZWZlcmVuY2VDb3VudGVkQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCBhcmNoaXZlID0gbmV3IFJlZmVyZW5jZUNvdW50ZWRBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsKCk7Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlQ291bnRlZEFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwgZXh0ZW5kcyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsIGltcGxlbWVudHMgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIHsKLQotCQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXNzKCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJaGVscGVyLmFib3V0VG9DbG9zZSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQtLTsKLQkJCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlwaHlzaWNhbGx5Q2xvc2UodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZvcmNlQ2xvc2UoKXsKLQkJCWNvdW50ID0gMDsKLQkJCWhlbHBlci5hYm91dFRvQ2xvc2UoKTsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpIHsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKSB7Ci0JCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVCaW5hcnlMb2FkU3RyYXRlZ3koZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpKTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCQloZWxwZXIucHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUodXJpLCBvcmlnaW5hbCwgZGVzdGluYXRpb25GaWxlKTsKLQkJCXN1cGVyLmNsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQloZWxwZXIucG9zdENsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JCi0JcHVibGljIEFwcENsaWVudEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIoY29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25DbGllbnRGaWxlKSBnZXRBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0NvbXBvbmVudEFyY2hpdmVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0NvbXBvbmVudEFyY2hpdmVPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMGUwNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9Db21wb25lbnRBcmNoaXZlT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzZWUge0BsaW5rIEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcn0KLSAqIEBhdXRob3IgamFzaG9sbAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudEFyY2hpdmVPcHRpb25zIGV4dGVuZHMgQXJjaGl2ZU9wdGlvbnMgewotCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHVibGljIENvbXBvbmVudEFyY2hpdmVPcHRpb25zKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7Ci0JCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBjb21wb25lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FSkJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGRkYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FSkJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVKQkphckZpbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNlZSB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfQotICogQGF1dGhvciBqYXNob2xsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyIGV4dGVuZHMgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlc0NvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSBuZXcgRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7Ci0JCQlyZXR1cm4gaGVscGVyLmlzQXJjaGl2ZVZhbGlkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuRGlzY3JpbWluYXRvciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgRGlzY3JpbWluYXRvciBpbnN0YW5jZTsKLQotCQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCWluc3RhbmNlID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlSZWZlcmVuY2VDb3VudGVkRUpCSmFyRmlsZUltcGwgYXJjaGl2ZSA9IG5ldyBSZWZlcmVuY2VDb3VudGVkRUpCSmFyRmlsZUltcGwoKTsKLQkJCXJldHVybiBhcmNoaXZlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VDb3VudGVkRUpCSmFyRmlsZUltcGwgZXh0ZW5kcyBFSkJKYXJGaWxlSW1wbCBpbXBsZW1lbnRzIElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSB7Ci0KLQkJcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JCXB1YmxpYyB2b2lkIGFjY2VzcygpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCWhlbHBlci5hYm91dFRvQ2xvc2UoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWNvdW50LS07Ci0JCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJcGh5c2ljYWxseUNsb3NlKHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBmb3JjZUNsb3NlKCl7Ci0JCQljb3VudCA9IDA7Ci0JCQloZWxwZXIuYWJvdXRUb0Nsb3NlKCk7Ci0JCQlzdXBlci5jbG9zZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGdldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoKSB7Ci0JCQlyZXR1cm4gaGVscGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcihFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlcikgewotCQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5Rm9yUmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gY3JlYXRlQmluYXJ5TG9hZFN0cmF0ZWd5KGdldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoKSk7Ci0JCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQkJaGVscGVyLnByZUNsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQlzdXBlci5jbGVhbnVwQWZ0ZXJUZW1wU2F2ZSh1cmksIG9yaWdpbmFsLCBkZXN0aW5hdGlvbkZpbGUpOwotCQkJaGVscGVyLnBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZSh1cmksIG9yaWdpbmFsLCBkZXN0aW5hdGlvbkZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlyZXR1cm4gRGlzY3JpbWluYXRvci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBFSkJCaW5hcnlDb21wb25lbnRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXN1cGVyKGNvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0UHJpbWFyeVJvb3RPYmplY3QoKSB7Ci0JCXJldHVybiAoKEVKQkphckZpbGUpIGdldEFyY2hpdmUoKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTFhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNlZSB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfQotICogQGF1dGhvciBqYXNob2xsCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBleHRlbmRzIEJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgZ2V0SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpewotCQlFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChhQ29tcG9uZW50KSkgewotCQkJaGVscGVyID0gbmV3IEVKQkJpbmFyeUNvbXBvbmVudEhlbHBlcihhQ29tcG9uZW50KTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KGFDb21wb25lbnQpKSB7Ci0JCQloZWxwZXIgPSBuZXcgQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KGFDb21wb25lbnQpKSB7Ci0JCQloZWxwZXIgPSBuZXcgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChhQ29tcG9uZW50KSkgewotCQkJaGVscGVyID0gbmV3IFdlYkJpbmFyeUNvbXBvbmVudEhlbHBlcihhQ29tcG9uZW50KTsKLQkJfSBlbHNlIHsKLQkJCWhlbHBlciA9IG5ldyBVdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCUlSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQotCXByb3RlY3RlZCBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlzdXBlcihjb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb25lbnRBcmNoaXZlT3B0aW9ucyBnZXRBcmNoaXZlT3B0aW9ucygpIHsKLQkJQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21wb25lbnRBcmNoaXZlT3B0aW9ucyhnZXRDb21wb25lbnQoKSk7Ci0JCW9wdGlvbnMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuU0FYKTsKLQkJb3B0aW9ucy5zZXRVc2VKYXZhUmVmbGVjdGlvbihmYWxzZSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXByb3RlY3RlZCBJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgZ2V0VW5pcXVlQXJjaGl2ZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBvcGVuQXJjaGl2ZSgpOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFyY2hpdmUgYWNjZXNzQXJjaGl2ZSgpIHsKLQkJSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIGFyY2hpdmUgPSBnZXRBcmNoaXZlKCk7Ci0JCWFyY2hpdmUuYWNjZXNzKCk7Ci0JCWlmKCFpc1BoeXNpY2FsbHlPcGVuKGFyY2hpdmUpKXsKLQkJCXBoeXNpY2FsbHlPcGVuKGFyY2hpdmUpOwotCQl9Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJaWYgKGFyY2hpdmUgPT0gbnVsbCkgewotCQkJYXJjaGl2ZSA9IGdldFVuaXF1ZUFyY2hpdmUoKTsKLQkJfQotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FyY2hpdmVWYWxpZCgpIHsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBudWxsOwotCQl0cnkgewotCQkJYW5BcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLnByaW1PcGVuQXJjaGl2ZShnZXRBcmNoaXZlT3B0aW9ucygpLCBnZXRBcmNoaXZlVVJJKCkpOwotCQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBnZXREaXNjcmltaW5hdG9yKCk7Ci0JCQlyZXR1cm4gbnVsbCA9PSBkaXNjIHx8IGRpc2MuY2FuSW1wb3J0KGFuQXJjaGl2ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwpIHsKLQkJCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJjaGl2ZVVSSSgpIHsKLQkJU3RyaW5nIGFyY2hpdmVVUkkgPSBudWxsOwotCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgZ2V0Q29tcG9uZW50KCk7Ci0JCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpCi0JCQlhcmNoaXZlVVJJID0gZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWVsc2UgewotCQkJSUZpbGUgaUZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJYXJjaGl2ZVVSSSA9IGlGaWxlLmdldFJhd0xvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBhcmNoaXZlVVJJOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpIHsKLQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCWFyY2hpdmUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCk7Ci0KLQlwcm90ZWN0ZWQgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIG9wZW5BcmNoaXZlKCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZUNhY2hlIGNhY2hlID0gQXJjaGl2ZUNhY2hlLmdldEluc3RhbmNlKCk7Ci0JCUlSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBhcmNoaXZlID0gY2FjaGUuZ2V0QXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpIHsKLQkJCWFyY2hpdmUuYWNjZXNzKCk7Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gY2FjaGUub3BlbkFyY2hpdmUodGhpcyk7Ci0JfQotCi0JYm9vbGVhbiBnb3RSZXNvdXJjZSA9IGZhbHNlOwotCQotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYoIWlzUGh5c2ljYWxseU9wZW4oZ2V0QXJjaGl2ZSgpKSl7Ci0JCQlyZXNvdXJjZSA9IGdldEFyY2hpdmUoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYocmVzb3VyY2UgPT0gbnVsbCl7Ci0JCQkJcGh5c2ljYWxseU9wZW4oZ2V0QXJjaGl2ZSgpKTsKLQkJCX0KLQkJfQotCQlpZihyZXNvdXJjZSA9PSBudWxsKXsKLQkJCXJlc291cmNlID0gZ2V0QXJjaGl2ZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsgCi0JCX0KLQkJCi0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKCkgewotCQlkaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmxvYWRBcmNoaXZlKElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5yZW1vdmVBbmRVbmxvYWRBbGwoYXJjaGl2ZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLCBhcmNoaXZlLmdldFJlc291cmNlU2V0KCkpOwotCQlhcmNoaXZlLmdldExvYWRTdHJhdGVneSgpLnNldFJlc291cmNlU2V0KG51bGwpOwotCQlhcmNoaXZlLnNldExvYWRTdHJhdGVneShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BoeXNpY2FsbHlPcGVuKElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXJldHVybiAoKEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3kpYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKSkuaXNQaHlzaWNhbGx5T3BlbigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBoeXNpY2FsbHlPcGVuKElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXRyeSB7Ci0JCQkoKEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3kpYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKSkucGh5c2ljYWxseU9wZW4oKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwaHlzaWNhbGx5Q2xvc2UoSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIGFyY2hpdmUpIHsKLQkJKChCaW5hcnlaaXBGaWxlTG9hZFN0cmF0ZWd5KWFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCkpLnBoeXNpY2FsbHlDbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvQ2xvc2UoKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZUNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewotCQkvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3kgZXh0ZW5kcyBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gcGh5c2ljYWxseU9wZW4gPSB0cnVlOwotCQkKLQkJcHVibGljIEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3koamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihmaWxlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQlwaHlzaWNhbGx5T3BlbiA9IGZhbHNlOwotCQkJc3VwZXIuY2xvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGh5c2ljYWxseU9wZW4oKXsKLQkJCXJldHVybiBwaHlzaWNhbGx5T3BlbjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGh5c2ljYWxseU9wZW4oKSB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKLQkJCWlmKCFpc1BoeXNpY2FsbHlPcGVuKCkpewotCQkJCXBoeXNpY2FsbHlPcGVuID0gdHJ1ZTsKLQkJCQlzZXRaaXBGaWxlKEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSkpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwaHlzaWNhbGx5Q2xvc2UoKXsKLQkJCWlmKGlzUGh5c2ljYWxseU9wZW4oKSl7Ci0JCQkJcGh5c2ljYWxseU9wZW4gPSBmYWxzZTsKLQkJCQl0cnl7Ci0JCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfSAKLQkJfQotCQkKLQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWZpbmFsIGJvb2xlYW4gaXNQaHlzY2lhbGx5T3BlbiA9IGlzUGh5c2ljYWxseU9wZW4oKTsKLQkJCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzUGh5c2NpYWxseU9wZW4pIHsKLQkJCQkJcGh5c2ljYWxseU9wZW4oKTsKLQkJCQl9Ci0JCQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKTsKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCi0JCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KSkgewotCQkJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJCQlzdXBlci5jbG9zZSgpOwotCQkJCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuICkgewotCQkJCQkJCXBoeXNpY2FsbHlDbG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2F1Z2h0RXhjZXB0aW9uID0gZTsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHppcENsb3NlZCkgewotCQkJCWNhdWdodEV4Y2VwdGlvbiA9IHppcENsb3NlZDsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oemlwQ2xvc2VkLnRvU3RyaW5nKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQljYXVnaHRFeGNlcHRpb24gPSBlOwotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJCQlwaHlzaWNhbGx5Q2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBcmNoaXZlQ2FjaGUgewotCi0JCXByaXZhdGUgc3RhdGljIEFyY2hpdmVDYWNoZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkJcHVibGljIHN0YXRpYyBBcmNoaXZlQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCWluc3RhbmNlID0gbmV3IEFyY2hpdmVDYWNoZSgpOwotCQkJfQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE1hcCBjb21wb25lbnRzVG9BcmNoaXZlcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlwdWJsaWMgc3luY2hyb25pemVkIElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBnZXRBcmNoaXZlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQkJSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIGFyY2hpdmUgPSAoSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlKSBjb21wb25lbnRzVG9BcmNoaXZlcy5nZXQoY29tcG9uZW50KTsKLQkJCXJldHVybiBhcmNoaXZlOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyRGlzY29ubmVjdGVkQXJjaGl2ZXNJbkVBUihJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKLQkJCWlmIChjb21wb25lbnRzVG9BcmNoaXZlcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTZXQgbGl2ZUJpbmFyeUNvbXBvbm50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCWNvbXBvbmVudCA9IHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlsaXZlQmluYXJ5Q29tcG9ubnRzLmFkZChjb21wb25lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWNsZWFyQXJjaGl2ZXNJblByb2plY3QoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgbGl2ZUJpbmFyeUNvbXBvbm50cyk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBbGxBcmNoaXZlc0luUHJvamVjdChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCQlpZiAoY29tcG9uZW50c1RvQXJjaGl2ZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2xlYXJBcmNoaXZlc0luUHJvamVjdChlYXJQcm9qZWN0LCBudWxsKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjbGVhckFyY2hpdmVzSW5Qcm9qZWN0KElQcm9qZWN0IGVhclByb2plY3QsIFNldCBleGNsdWRlU2V0KSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvbmVudHNUb0FyY2hpdmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQlJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoY29tcG9uZW50LmdldFByb2plY3QoKS5lcXVhbHMoZWFyUHJvamVjdCkgJiYgKGV4Y2x1ZGVTZXQgPT0gbnVsbCB8fCAhZXhjbHVkZVNldC5jb250YWlucyhjb21wb25lbnQpKSkgewotCQkJCQlhcmNoaXZlID0gKElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYXJjaGl2ZS5mb3JjZUNsb3NlKCk7Ci0JCQkJCXVubG9hZEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIG9wZW5BcmNoaXZlKEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IGhlbHBlci5nZXRBcmNoaXZlT3B0aW9ucygpOwotCQkJU3RyaW5nIGFyY2hpdmVVUkkgPSBoZWxwZXIuZ2V0QXJjaGl2ZVVSSSgpOwotCQkJCi0JCQlvcHRpb25zLnNldExvYWRTdHJhdGVneShjcmVhdGVCaW5hcnlMb2FkU3RyYXRlZ3koaGVscGVyKSk7Ci0KLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLnByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCBhcmNoaXZlVVJJKTsKLQotCQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3IgPSBoZWxwZXIuZ2V0RGlzY3JpbWluYXRvcigpOwotCi0JCQlpZiAoIWRpc2NyaW1pbmF0b3IuY2FuSW1wb3J0KGFuQXJjaGl2ZSkpIHsKLQkJCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oZGlzY3JpbWluYXRvci5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQkJfQotCQkJSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIHNwZWNpZmljQXJjaGl2ZSA9IChJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUpIGRpc2NyaW1pbmF0b3Iub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJCXNwZWNpZmljQXJjaGl2ZS5zZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKGhlbHBlcik7Ci0JCQlzcGVjaWZpY0FyY2hpdmUuaW5pdGlhbGl6ZUFmdGVyT3BlbigpOwotCQkJc3BlY2lmaWNBcmNoaXZlLmFjY2VzcygpOwotCQkJY29tcG9uZW50c1RvQXJjaGl2ZXMucHV0KGhlbHBlci5nZXRDb21wb25lbnQoKSwgc3BlY2lmaWNBcmNoaXZlKTsKLQkJCXJldHVybiBzcGVjaWZpY0FyY2hpdmU7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBCaW5hcnlaaXBGaWxlTG9hZFN0cmF0ZWd5IGNyZWF0ZUJpbmFyeUxvYWRTdHJhdGVneShFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlcikgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFyY2hpdmVVUkkgPSBoZWxwZXIuZ2V0QXJjaGl2ZVVSSSgpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBhcmNoaXZlVVJJLnJlcGxhY2UoJy8nLCBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZmlsZV9ub3RfZm91bmRfRVhDXywgKG5ldyBPYmplY3RbXSB7IGFyY2hpdmVVUkksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpKTsgCi0JCX0KLQkJdHJ5IHsKLQkJCUJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3kgc3RyYXRlZ3kgPSBuZXcgQmluYXJ5WmlwRmlsZUxvYWRTdHJhdGVneShmaWxlKTsKLQkJCXJldHVybiBzdHJhdGVneTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmNvdWxkX25vdF9vcGVuX0VYQ18sIChuZXcgT2JqZWN0W10geyBhcmNoaXZlVVJJIH0pKSwgZXgpOyAKLQkJfQotCX0KLQotCXByb3RlY3RlZCBpbnRlcmZhY2UgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIGV4dGVuZHMgQXJjaGl2ZSB7Ci0KLQkJLyoqCi0JCSAqIEluY3JlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZS4gQSBjYWxsIHRvIGNsb3NlIHdpbGwgZGVjcmltZW50Ci0JCSAqIHRoZSBjb3VudCBieSBvbmUuIElmIGFmdGVyIGRlY3JpbWVudGluZyB0aGUgY291bnQgdGhlIGNvdW50IGlzIDAKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY2Nlc3MoKTsKLQotCQlwdWJsaWMgdm9pZCBmb3JjZUNsb3NlKCk7Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKTsKLQkJCi0JCXB1YmxpYyBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGdldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0pDQUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KQ0FCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmNTExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0pDQUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuUkFSRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlJhckltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNlZSB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfQotICogQGF1dGhvciBqYXNob2xsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyIGV4dGVuZHMgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlc0NvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSBuZXcgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7Ci0JCQlyZXR1cm4gaGVscGVyLmlzQXJjaGl2ZVZhbGlkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgUmFySW1wb3J0U3RyYXRlZ3lJbXBsLkRpc2NyaW1pbmF0b3IgewotCi0JCXByaXZhdGUgc3RhdGljIERpc2NyaW1pbmF0b3IgaW5zdGFuY2U7Ci0KLQkJcHVibGljIHN0YXRpYyBEaXNjcmltaW5hdG9yIGdldEluc3RhbmNlKCkgewotCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQlpbnN0YW5jZSA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJUmVmZXJlbmNlQ291bnRlZFJBUkZpbGVJbXBsIGFyY2hpdmUgPSBuZXcgUmVmZXJlbmNlQ291bnRlZFJBUkZpbGVJbXBsKCk7Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlQ291bnRlZFJBUkZpbGVJbXBsIGV4dGVuZHMgUkFSRmlsZUltcGwgaW1wbGVtZW50cyBJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgewotCi0JCXByaXZhdGUgaW50IGNvdW50ID0gMDsKLQotCQlwdWJsaWMgdm9pZCBhY2Nlc3MoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQloZWxwZXIuYWJvdXRUb0Nsb3NlKCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQljb3VudC0tOwotCQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXBoeXNpY2FsbHlDbG9zZSh0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZm9yY2VDbG9zZSgpewotCQkJY291bnQgPSAwOwotCQkJaGVscGVyLmFib3V0VG9DbG9zZSgpOwotCQkJc3VwZXIuY2xvc2UoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBnZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKCkgewotCQkJcmV0dXJuIGhlbHBlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIpIHsKLQkJCXRoaXMuaGVscGVyID0gaGVscGVyOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneUZvclJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJpbmFyeUxvYWRTdHJhdGVneShnZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKCkpOwotCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJCWhlbHBlci5wcmVDbGVhbnVwQWZ0ZXJUZW1wU2F2ZSh1cmksIG9yaWdpbmFsLCBkZXN0aW5hdGlvbkZpbGUpOwotCQkJc3VwZXIuY2xlYW51cEFmdGVyVGVtcFNhdmUodXJpLCBvcmlnaW5hbCwgZGVzdGluYXRpb25GaWxlKTsKLQkJCWhlbHBlci5wb3N0Q2xlYW51cEFmdGVyVGVtcFNhdmUodXJpLCBvcmlnaW5hbCwgZGVzdGluYXRpb25GaWxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlzdXBlcihjb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewotCQlyZXR1cm4gKChSQVJGaWxlKSBnZXRBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0phdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5OTU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0phdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlci5JUmVmZXJlbmNlQ291bnRlZEFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlTG9hZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBleHRlbmRzIEJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwcml2YXRlIElBcmNoaXZlIGFyY2hpdmU7Ci0JcHJpdmF0ZSBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIGxlZ2FjeUJpbmFyeUhlbHBlcjsKLQotCXByaXZhdGUgaW50IGxvY2FsQXJjaGl2ZUFjY2Vzc0NvdW50ID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgSmF2YUVFUXVpY2tQZWVrIGdldEphdmFFRVF1aWNrUGVlayhJVmlydHVhbENvbXBvbmVudCBhQmluYXJ5Q29tcG9uZW50KSB7Ci0JCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQl0cnkgewotCQkJaGVscGVyID0gbmV3IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihhQmluYXJ5Q29tcG9uZW50KTsKLQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBoZWxwZXIuZ2V0QXJjaGl2ZSgpOwotCQkJaWYgKGFyY2hpdmUgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSmF2YUVFUXVpY2tQZWVrKG51bGwpOwotCQkJfQotCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSk7Ci0JCQlyZXR1cm4gcXA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQloZWxwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBhQmluYXJ5Q29tcG9uZW50KSB7Ci0JCXN1cGVyKGFCaW5hcnlDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRBYnNvbHV0ZVBhdGgoKSB7Ci0JCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIgPSBudWxsOwotCQlpZihnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5oYXNPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUikpewotCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlsb2FkQWRhcHRlciA9IChJQXJjaGl2ZUxvYWRBZGFwdGVyKWdldEFyY2hpdmUoKS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIpOwotCQl9Ci0JCXJldHVybiAoKEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKSBsb2FkQWRhcHRlcikuZ2V0QXJjaGl2ZVBhdGgoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0UHJpbWFyeVJvb3RPYmplY3QoKSB7Ci0JCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGdldEFyY2hpdmUoKSk7Ci0JCUlQYXRoIGRkUGF0aCA9IG51bGw7Ci0JCXN3aXRjaCAocXAuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOgotCQkJZGRQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7Ci0JCQlicmVhazsKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6Ci0JCQlkZFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFOgotCQkJZGRQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJCWJyZWFrOwotCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKLQkJCWRkUGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZGRQYXRoICE9IG51bGwpIHsKLQkJCWlmIChnZXRBcmNoaXZlKCkuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGRQYXRoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiAoRU9iamVjdCkgZ2V0QXJjaGl2ZSgpLmdldE1vZGVsT2JqZWN0KGRkUGF0aCk7Ci0JCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBnZXRDb21wb25lbnQoKS5nZXROYW1lKCk7Ci0JCQkJLy9iZWNhdXNlIHRoaXMgY29tcG9uZW50IGlzIGJpbmFyeSwgaXRzIHByb2plY3QgbXVzdCBiZSB0aGUgRUFSLgotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIHJlZjpyZWZzKXsKLQkJCQkJaWYocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoZ2V0Q29tcG9uZW50KCkpKXsKLQkJCQkJCWRpc3BsYXlOYW1lID0gcmVmLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5TmFtZSBkbiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQkJZG4uc2V0VmFsdWUoZGlzcGxheU5hbWUpOwotCQkJCUVPYmplY3Qgcm9vdCA9IG51bGw7Ci0JCQkJc3dpdGNoIChxcC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQkJQXBwbGljYXRpb25DbGllbnQgYXBwbGljYXRpb25DbGllbnQgPSBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCQkJCWFwcGxpY2F0aW9uQ2xpZW50LmdldERpc3BsYXlOYW1lcygpLmFkZChkbik7Ci0JCQkJCXJvb3QgPSAoRU9iamVjdCkgYXBwbGljYXRpb25DbGllbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgotCQkJCQlFSkJKYXIgZWpiSmFyID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCSmFyKCk7Ci0JCQkJCWVqYkphci5nZXREaXNwbGF5TmFtZXMoKS5hZGQoZG4pOwotCQkJCQlyb290ID0gKEVPYmplY3QpIGVqYkphcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQkJCVdlYkFwcCB3ZWJBcHAgPSBXZWJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJBcHAoKTsKLQkJCQkJd2ViQXBwLmdldERpc3BsYXlOYW1lcygpLmFkZChkbik7Ci0JCQkJCXJvb3QgPSAoRU9iamVjdCkgd2ViQXBwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJvb3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaS50b1N0cmluZygpKTsKLQkJdHJ5IHsKLQkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIgPSBudWxsOwotCQkJaWYoZ2V0QXJjaGl2ZSgpLmdldEFyY2hpdmVPcHRpb25zKCkuaGFzT3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuV1JBUFBFRF9MT0FEX0FEQVBURVIpKXsKLQkJCQlsb2FkQWRhcHRlciA9IChJQXJjaGl2ZUxvYWRBZGFwdGVyKWdldEFyY2hpdmUoKS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLldSQVBQRURfTE9BRF9BREFQVEVSKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcilnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSKTsKLQkJCX0KLQkJCUVPYmplY3QgbW9kZWxSb290ID0gKEVPYmplY3QpKChKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcikgbG9hZEFkYXB0ZXIpLmdldE1vZGVsT2JqZWN0KHBhdGgpOyAKLQkJCXJldHVybiBtb2RlbFJvb3QuZVJlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gZSkgewotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmUgYWNjZXNzQXJjaGl2ZSgpIHsKLQkJSUFyY2hpdmUgYXJjaGl2ZSA9IGdldEFyY2hpdmUoKTsKLQkJaWYgKG51bGwgIT0gYXJjaGl2ZSkgewotCQkJQXJjaGl2ZUNhY2hlIGNhY2hlID0gQXJjaGl2ZUNhY2hlLmdldEluc3RhbmNlKCk7Ci0JCQljYWNoZS5hY2Nlc3NBcmNoaXZlKGFyY2hpdmUpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJbG9jYWxBcmNoaXZlQWNjZXNzQ291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2FmZVJlbGVhc2VBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpewotCQlpbnQgY291bnQgPSAwOwotCQlzeW5jaHJvbml6ZWQodGhpcyl7Ci0JCQljb3VudCA9IGxvY2FsQXJjaGl2ZUFjY2Vzc0NvdW50OwotCQl9Ci0JCWlmKGNvdW50ID4gMCl7Ci0JCQlyZWxlYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKGFyY2hpdmUgIT0gdGhpcy5hcmNoaXZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIElBcmNoaXZlIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIElBcmNoaXZlIHJldHJpZXZlZCBmcm9tIGFjY2Vzc0FyY2hpdmUiKTsKLQkJfQotCQlpZiAobnVsbCAhPSBhcmNoaXZlKSB7Ci0JCQlBcmNoaXZlQ2FjaGUgY2FjaGUgPSBBcmNoaXZlQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhY2hlLnJlbGVhc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJbG9jYWxBcmNoaXZlQWNjZXNzQ291bnQtLTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHByZVN3YXBBY2Nlc3NDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIHZvaWQgcHJlRmlsZVN3YXAoKXsKLQkJaW50IGNvdW50ID0gMDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlwcmVTd2FwQWNjZXNzQ291bnQgPSBsb2NhbEFyY2hpdmVBY2Nlc3NDb3VudDsKLQkJCWNvdW50ID0gcHJlU3dhcEFjY2Vzc0NvdW50OwotCQl9Ci0JCXdoaWxlIChjb3VudCA+IDApewotCQkJY291bnQgLS07Ci0JCQlyZWxlYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0RmlsZVN3YXAoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJY291bnQgPSBwcmVTd2FwQWNjZXNzQ291bnQ7Ci0JCQlwcmVTd2FwQWNjZXNzQ291bnQgPSAwOwotCQl9Ci0JCXdoaWxlKGNvdW50ID4gMCl7Ci0JCQljb3VudCAtLTsKLQkJCWFjY2Vzc0FyY2hpdmUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZSBhY2Nlc3NMZWdhY3lBcmNoaXZlKCkgewotCQlpZihsZWdhY3lCaW5hcnlIZWxwZXIgPT0gbnVsbCl7Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBnZXRKYXZhRUVRdWlja1BlZWsoZ2V0Q29tcG9uZW50KCkpOwotCQkJSVBhdGggZGRQYXRoID0gbnVsbDsKLQkJCXN3aXRjaCAocXAuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKLQkJCQkJcHJvdGVjdGVkIHZvaWQgYWJvdXRUb0Nsb3NlKCkgewotCQkJCQkJc2FmZVJlbGVhc2VBcmNoaXZlKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci50aGlzLmFyY2hpdmUpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHByZUNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7Ci0JCQkJCQlwcmVGaWxlU3dhcCgpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewotCQkJCQkJcG9zdEZpbGVTd2FwKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWJyZWFrOwotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6Ci0JCQkJbGVnYWN5QmluYXJ5SGVscGVyID0gbmV3IEVKQkJpbmFyeUNvbXBvbmVudEhlbHBlcihnZXRDb21wb25lbnQoKSl7Ci0JCQkJCXByb3RlY3RlZCB2b2lkIGFib3V0VG9DbG9zZSgpIHsKLQkJCQkJCXNhZmVSZWxlYXNlQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIudGhpcy5hcmNoaXZlKTsKLQkJCQkJfQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBwcmVDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewotCQkJCQkJcHJlRmlsZVN3YXAoKTsKLQkJCQkJfQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBwb3N0Q2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKLQkJCQkJCXBvc3RGaWxlU3dhcCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFOgotCQkJCWxlZ2FjeUJpbmFyeUhlbHBlciA9IG5ldyBXZWJCaW5hcnlDb21wb25lbnRIZWxwZXIoZ2V0Q29tcG9uZW50KCkpewotCQkJCQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvQ2xvc2UoKSB7Ci0JCQkJCQlzYWZlUmVsZWFzZUFyY2hpdmUoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLnRoaXMuYXJjaGl2ZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgcHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKLQkJCQkJCXByZUZpbGVTd2FwKCk7Ci0JCQkJCX0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgcG9zdENsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7Ci0JCQkJCQlwb3N0RmlsZVN3YXAoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKLQkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKLQkJCQkJcHJvdGVjdGVkIHZvaWQgYWJvdXRUb0Nsb3NlKCkgewotCQkJCQkJc2FmZVJlbGVhc2VBcmNoaXZlKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci50aGlzLmFyY2hpdmUpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHByZUNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7Ci0JCQkJCQlwcmVGaWxlU3dhcCgpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewotCQkJCQkJcG9zdEZpbGVTd2FwKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDogLy91dGlsaXR5IGphcgotCQkJCWxlZ2FjeUJpbmFyeUhlbHBlciA9IG5ldyBVdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKLQkJCQkJcHJvdGVjdGVkIHZvaWQgYWJvdXRUb0Nsb3NlKCkgewotCQkJCQkJc2FmZVJlbGVhc2VBcmNoaXZlKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci50aGlzLmFyY2hpdmUpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHByZUNsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7Ci0JCQkJCQlwcmVGaWxlU3dhcCgpOwotCQkJCQl9Ci0JCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewotCQkJCQkJcG9zdEZpbGVTd2FwKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFjY2Vzc0FyY2hpdmUoKTsKLQkJQXJjaGl2ZSBsZWdhY3lBcmNoaXZlID0gbGVnYWN5QmluYXJ5SGVscGVyLmFjY2Vzc0FyY2hpdmUoKTsKLQkJcmV0dXJuIGxlZ2FjeUFyY2hpdmU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJaW50IGxlZ2FjeUNvdW50ID0gMDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQljb3VudCA9IGxvY2FsQXJjaGl2ZUFjY2Vzc0NvdW50OwotCQl9Ci0JCWlmIChjb3VudCA+IDAgJiYgYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlBcmNoaXZlQ2FjaGUgY2FjaGUgPSBBcmNoaXZlQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCWNhY2hlLnJlbGVhc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlsb2NhbEFyY2hpdmVBY2Nlc3NDb3VudC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihsZWdhY3lCaW5hcnlIZWxwZXIgIT0gbnVsbCl7Ci0JCQlJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgbGVnYWN5QXJjaGl2ZSA9IGxlZ2FjeUJpbmFyeUhlbHBlci5hcmNoaXZlOwotCQkJaWYobGVnYWN5QXJjaGl2ZSAhPSBudWxsKXsKLQkJCQlsZWdhY3lBcmNoaXZlLmZvcmNlQ2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlpZiAoYXJjaGl2ZSA9PSBudWxsKSB7Ci0JCQlhcmNoaXZlID0gZ2V0VW5pcXVlQXJjaGl2ZSgpOwotCQl9Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBJQXJjaGl2ZSBnZXRVbmlxdWVBcmNoaXZlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIG9wZW5BcmNoaXZlKCk7Ci0JCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQXJjaGl2ZSBvcGVuQXJjaGl2ZSgpIHRocm93cyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlQ2FjaGUgY2FjaGUgPSBBcmNoaXZlQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLQkJSUFyY2hpdmUgYXJjaGl2ZSA9IGNhY2hlLmdldEFyY2hpdmUoZ2V0Q29tcG9uZW50KCkpOwotCQlpZiAoYXJjaGl2ZSA9PSBudWxsKSB7Ci0JCQlhcmNoaXZlID0gY2FjaGUub3BlbkFyY2hpdmUodGhpcyk7Ci0JCX0KLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJY2FjaGUuYWNjZXNzQXJjaGl2ZShhcmNoaXZlKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWxvY2FsQXJjaGl2ZUFjY2Vzc0NvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyRGlzY29ubmVjdGVkQXJjaGl2ZXNJbkVBUihJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKLQkJQXJjaGl2ZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXJEaXNjb25uZWN0ZWRBcmNoaXZlc0luRUFSKGVhckNvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQWxsQXJjaGl2ZXNJblByb2plY3QoSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlBcmNoaXZlQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbGVhckFsbEFyY2hpdmVzSW5Qcm9qZWN0KGVhclByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2FjaGUgbWFuYWdlcyBJQXJjaGl2ZXMgYWNyb3NzIGFsbAotCSAqIHtAbGluayBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXJ9IGluc3RhbmNlcy4gSWYgbXVsdGlwbGUKLQkgKiB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfSBpbnN0YW5jZXMgZXhpc3QgZm9yIHRoZSBzYW1lCi0JICogdW5kZXJseWluZyBhcmNoaXZlIGZpbGUgKGUuZy4gYSBqYXIgZmlsZSBvbiBkaXNrKSBhbGwgd2lsbCB1c2UgdGhlIGV4YWN0Ci0JICogc2FtZSBJQXJjaGl2ZSBpbnN0YW5jZS4gQ2FyZSBuZWVkcyB0byBiZSB0YWtlbiBpbiBtYW5hZ2luZyB0aGUgb3BlbmluZwotCSAqIGFuZCBjbG9zaW5nIG9mIHRoaXMgSUFyY2hpdmUgd2hpY2ggc2hvdWxkIG9ubHkgYmUgZG9uZSB0aHJvdWdoIGludGVybmFsCi0JICogbWV0aG9kcyB3aXRoaW4ge0BsaW5rIEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcn0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmNoaXZlQ2FjaGUgewotCi0JCXByaXZhdGUgc3RhdGljIEFyY2hpdmVDYWNoZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkJcHVibGljIHN0YXRpYyBBcmNoaXZlQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCWluc3RhbmNlID0gbmV3IEFyY2hpdmVDYWNoZSgpOwotCQkJfQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE1hcDxJVmlydHVhbENvbXBvbmVudCwgSUFyY2hpdmU+IGNvbXBvbmVudHNUb0FyY2hpdmVzID0gbmV3IEhhc2h0YWJsZTxJVmlydHVhbENvbXBvbmVudCwgSUFyY2hpdmU+KCk7Ci0KLQkJcHJvdGVjdGVkIE1hcDxJQXJjaGl2ZSwgSW50ZWdlcj4gYXJjaGl2ZUFjY2Vzc0NvdW50ID0gbmV3IEhhc2h0YWJsZTxJQXJjaGl2ZSwgSW50ZWdlcj4oKTsKLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNjZXNzQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCQlJbnRlZ2VyIGNvdW50ID0gYXJjaGl2ZUFjY2Vzc0NvdW50LmdldChhcmNoaXZlKTsKLQkJCUludGVnZXIgbmV3Q291bnQgPSBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSk7Ci0JCQlhcmNoaXZlQWNjZXNzQ291bnQucHV0KGFyY2hpdmUsIG5ld0NvdW50KTsKLQkJCWlmIChuZXdDb3VudC5pbnRWYWx1ZSgpID09IDEpIHsKLQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlciBiaW5hcnlBZGFwdGVyID0gbnVsbDsKLQkJCQlpZiAoYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmhhc09wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLldSQVBQRURfTE9BRF9BREFQVEVSKSkgewotCQkJCQliaW5hcnlBZGFwdGVyID0gKEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKSBhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuV1JBUFBFRF9MT0FEX0FEQVBURVIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJpbmFyeUFkYXB0ZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIpIGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSKTsKLQkJCQl9Ci0JCQkJaWYgKCFiaW5hcnlBZGFwdGVyLmlzUGh5c2ljYWxseU9wZW4oKSkgewotCQkJCQl0cnkgewotCQkJCQkJYmluYXJ5QWRhcHRlci5waHlzaWNhbGx5T3BlbigpOwotCQkJCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJCUludGVnZXIgY291bnQgPSBhcmNoaXZlQWNjZXNzQ291bnQuZ2V0KGFyY2hpdmUpOwotCQkJSW50ZWdlciBuZXdDb3VudCA9IG5ldyBJbnRlZ2VyKGNvdW50LmludFZhbHVlKCkgLSAxKTsKLQkJCWFyY2hpdmVBY2Nlc3NDb3VudC5wdXQoYXJjaGl2ZSwgbmV3Q291bnQpOwotCQkJaWYgKG5ld0NvdW50LmludFZhbHVlKCkgPT0gMCkgewotCQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyIGJpbmFyeUFkYXB0ZXIgPSBudWxsOwotCQkJCWlmIChhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuaGFzT3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuV1JBUFBFRF9MT0FEX0FEQVBURVIpKSB7Ci0JCQkJCWJpbmFyeUFkYXB0ZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIpIGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmluYXJ5QWRhcHRlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcikgYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIpOwotCQkJCX0KLQkJCQlpZiAoYmluYXJ5QWRhcHRlci5pc1BoeXNpY2FsbHlPcGVuKCkpIHsKLQkJCQkJYmluYXJ5QWRhcHRlci5waHlzaWNhbGx5Q2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIElBcmNoaXZlIGdldEFyY2hpdmUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCQlJQXJjaGl2ZSBhcmNoaXZlID0gY29tcG9uZW50c1RvQXJjaGl2ZXMuZ2V0KGNvbXBvbmVudCk7Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRpc2Nvbm5lY3RlZEFyY2hpdmVzSW5FQVIoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7Ci0JCQlpZiAoY29tcG9uZW50c1RvQXJjaGl2ZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU2V0PElWaXJ0dWFsQ29tcG9uZW50PiBsaXZlQmluYXJ5Q29tcG9ubnRzID0gbmV3IEhhc2hTZXQ8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCWNvbXBvbmVudCA9IHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlsaXZlQmluYXJ5Q29tcG9ubnRzLmFkZChjb21wb25lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWNsZWFyQXJjaGl2ZXNJblByb2plY3QoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgbGl2ZUJpbmFyeUNvbXBvbm50cyk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBbGxBcmNoaXZlc0luUHJvamVjdChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCQlpZiAoY29tcG9uZW50c1RvQXJjaGl2ZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2xlYXJBcmNoaXZlc0luUHJvamVjdChlYXJQcm9qZWN0LCBudWxsKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjbGVhckFyY2hpdmVzSW5Qcm9qZWN0KElQcm9qZWN0IGVhclByb2plY3QsIFNldCBleGNsdWRlU2V0KSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvbmVudHNUb0FyY2hpdmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQlJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoY29tcG9uZW50LmdldFByb2plY3QoKS5lcXVhbHMoZWFyUHJvamVjdCkgJiYgKGV4Y2x1ZGVTZXQgPT0gbnVsbCB8fCAhZXhjbHVkZVNldC5jb250YWlucyhjb21wb25lbnQpKSkgewotCQkJCQlhcmNoaXZlID0gKElBcmNoaXZlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlJQXJjaGl2ZUZhY3RvcnkuSU5TVEFOQ0UuY2xvc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJYXJjaGl2ZUFjY2Vzc0NvdW50LnJlbW92ZShhcmNoaXZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIElBcmNoaXZlIG9wZW5BcmNoaXZlKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIpIHRocm93cyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUoaGVscGVyLmdldENvbXBvbmVudCgpKTsKLQkJCWNvbXBvbmVudHNUb0FyY2hpdmVzLnB1dChoZWxwZXIuZ2V0Q29tcG9uZW50KCksIGFyY2hpdmUpOwotCQkJYXJjaGl2ZUFjY2Vzc0NvdW50LnB1dChhcmNoaXZlLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQlyZXR1cm4gYXJjaGl2ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNkODA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlciBleHRlbmRzIEphdmFFRUVNRlppcEZpbGVMb2FkQWRhcHRlckltcGwgewotCi0JcHJpdmF0ZSBqYXZhLmlvLkZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUGF0aCBhcmNoaXZlUGF0aDsKLQlwcml2YXRlIGJvb2xlYW4gcGh5c2ljYWxseU9wZW4gPSB0cnVlOwotCQotCXByaXZhdGUgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXBvbmVudDsKLQkKLQlwdWJsaWMgSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIoVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXBvbmVudCkgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJjaGl2ZUNvbXBvbmVudCA9IGFyY2hpdmVDb21wb25lbnQ7Ci0JCUlQYXRoIGFyY2hpdmVQYXRoID0gcmVjb21wdXRlQXJjaGl2ZVBhdGgoKTsKLQkJdHJ5ewotCQkJcmVzZXRaaXBGaWxlKGFyY2hpdmVQYXRoKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvcGVuRmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7Ci0JCQl0aHJvdyBvcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIG9wZW5GYWlsdXJlRXhjZXB0aW9uID0gbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKLQkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXNldFppcEZpbGUoSVBhdGggYXJjaGl2ZVBhdGgpICB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCVppcEZpbGUgemlwRmlsZSA9IEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSk7Ci0JCXNldFppcEZpbGUoemlwRmlsZSk7Ci0JCXNldEFyY2hpdmVQYXRoKGFyY2hpdmVQYXRoKTsJCi0JfQotCQotCXByaXZhdGUgSVBhdGggcmVjb21wdXRlQXJjaGl2ZVBhdGgoKSB7Ci0JCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCWlmICghZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQlJUGF0aCBhcmNoaXZlUGF0aCA9IG5ldyBQYXRoKGRpc2tGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJcmV0dXJuIGFyY2hpdmVQYXRoOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0QXJjaGl2ZVBhdGgoSVBhdGggYXJjaGl2ZVBhdGgpIHsKLQkJdGhpcy5hcmNoaXZlUGF0aCA9IGFyY2hpdmVQYXRoOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0QXJjaGl2ZVBhdGgoKSB7Ci0JCXJldHVybiBhcmNoaXZlUGF0aDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQaHlzaWNhbGx5T3BlbigpewotCQlyZXR1cm4gcGh5c2ljYWxseU9wZW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBoeXNpY2FsbHlPcGVuKCkgdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257Ci0JCWlmKCFpc1BoeXNpY2FsbHlPcGVuKCkpewotCQkJaWYoZmlsZS5leGlzdHMoKSl7Ci0JCQkJc2V0WmlwRmlsZShBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpKTsKLQkJCX0gZWxzZSB7IAotCQkJCS8vY2hlY2sgaWYgdGhlIGZpbGUgaGFzIG1vdmVkIC0tIHRoaXMgY2FuIGhhcHBlbiB3aGVuCi0JCQkJLy9jaGVja2luZyBpbnRvIENsZWFyQ2FzZS4KLQkJCQlJUGF0aCBuZXdQYXRoID0gcmVjb21wdXRlQXJjaGl2ZVBhdGgoKTsKLQkJCQlpZihuZXdQYXRoLmVxdWFscyhhcmNoaXZlUGF0aCkpewotCQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzZXRaaXBGaWxlKG5ld1BhdGgpOwotCQkJCX0KLQkJCX0KLQkJCXBoeXNpY2FsbHlPcGVuID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwaHlzaWNhbGx5Q2xvc2UoKXsKLQkJaWYoaXNQaHlzaWNhbGx5T3BlbigpKXsKLQkJCXBoeXNpY2FsbHlPcGVuID0gZmFsc2U7Ci0JCQl0cnl7Ci0JCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfSAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJZmluYWwgYm9vbGVhbiBpc1BoeXNjaWFsbHlPcGVuID0gaXNQaHlzaWNhbGx5T3BlbigpOwotCQlFeGNlcHRpb24gY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghaXNQaHlzY2lhbGx5T3BlbikgewotCQkJCXBoeXNpY2FsbHlPcGVuKCk7Ci0JCQl9Ci0JCQl0cnl7Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKHJlc291cmNlUGF0aCk7Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNhdWdodEV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQljYXVnaHRFeGNlcHRpb24gPSBlOwotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjYXVnaHRFeGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNhdWdodEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJCXBoeXNpY2FsbHlDbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCBmaWxlUGF0aCkgewotCQlmaW5hbCBib29sZWFuIGlzUGh5c2NpYWxseU9wZW4gPSBpc1BoeXNpY2FsbHlPcGVuKCk7Ci0JCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJcGh5c2ljYWxseU9wZW4oKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEFyY2hpdmVSZXNvdXJjZShmaWxlUGF0aCk7Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNhdWdodEV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQljYXVnaHRFeGNlcHRpb24gPSBlOwotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjYXVnaHRFeGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNhdWdodEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJCXBoeXNpY2FsbHlDbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJZmluYWwgYm9vbGVhbiBpc1BoeXNjaWFsbHlPcGVuID0gaXNQaHlzaWNhbGx5T3BlbigpOwotCQlFeGNlcHRpb24gY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghaXNQaHlzY2lhbGx5T3BlbikgewotCQkJCXBoeXNpY2FsbHlPcGVuKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXJldHVybiBzdXBlci5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNhdWdodEV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQljYXVnaHRFeGNlcHRpb24gPSBlOwotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjYXVnaHRFeGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNhdWdodEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJCXBoeXNpY2FsbHlDbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlmaW5hbCBib29sZWFuIGlzUGh5c2NpYWxseU9wZW4gPSBpc1BoeXNpY2FsbHlPcGVuKCk7Ci0JCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuKSB7Ci0JCQkJcGh5c2ljYWxseU9wZW4oKTsKLQkJCX0KLQkJCUlQYXRoIHBhdGggPSBhRmlsZS5nZXRQYXRoKCk7Ci0JCQlTdHJpbmcgdXJpID0gcGF0aC50b1N0cmluZygpOwotCQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQotCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KSkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJc3VwZXIuY2xvc2UoKTsKLQkJCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuICkgewotCQkJCQkJcGh5c2ljYWxseUNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJY2F1Z2h0RXhjZXB0aW9uID0gZTsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB6aXBDbG9zZWQpIHsKLQkJCWNhdWdodEV4Y2VwdGlvbiA9IHppcENsb3NlZDsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih6aXBDbG9zZWQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQljYXVnaHRFeGNlcHRpb24gPSBlOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzUGh5c2NpYWxseU9wZW4pIHsKLQkJCQkJcGh5c2ljYWxseUNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGdldEFyY2hpdmVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBhcmNoaXZlQ29tcG9uZW50OwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9VdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1V0aWxpdHlCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMDEzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1V0aWxpdHlCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkFyY2hpdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNlZSB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfQotICogQGF1dGhvciBqYXNob2xsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXRpbGl0eUJpbmFyeUNvbXBvbmVudEhlbHBlciBleHRlbmRzIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgewotCi0JcHVibGljIFV0aWxpdHlCaW5hcnlDb21wb25lbnRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXN1cGVyKGNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgRGlzY3JpbWluYXRvciBpbnN0YW5jZTsKLQotCQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCWluc3RhbmNlID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZUltcGwgYXJjaGl2ZSA9IG5ldyBSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZUltcGwoKTsKLQkJCXJldHVybiBhcmNoaXZlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlSW1wbCBleHRlbmRzIEFyY2hpdmVJbXBsIGltcGxlbWVudHMgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIHsKLQotCQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXNzKCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJaGVscGVyLmFib3V0VG9DbG9zZSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQtLTsKLQkJCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlwaHlzaWNhbGx5Q2xvc2UodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZvcmNlQ2xvc2UoKXsKLQkJCWNvdW50ID0gMDsKLQkJCWhlbHBlci5hYm91dFRvQ2xvc2UoKTsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpIHsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKSB7Ci0JCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVCaW5hcnlMb2FkU3RyYXRlZ3koZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpKTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCQloZWxwZXIucHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUodXJpLCBvcmlnaW5hbCwgZGVzdGluYXRpb25GaWxlKTsKLQkJCXN1cGVyLmNsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQloZWxwZXIucG9zdENsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yLmdldEluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUmVmZXJlbmNlQ291bnRlZEFyY2hpdmUgZ2V0VW5pcXVlQXJjaGl2ZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBvcGVuQXJjaGl2ZSgpOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1dlYkJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9XZWJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3NTkxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1dlYkJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV0FSRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LldhcjIySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgc2VlIHtAbGluayBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXJ9Ci0gKiBAYXV0aG9yIGphc2hvbGwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCaW5hcnlDb21wb25lbnRIZWxwZXIgZXh0ZW5kcyBFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVzQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlXZWJCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhlbHBlciA9IG5ldyBXZWJCaW5hcnlDb21wb25lbnRIZWxwZXIoY29tcG9uZW50KTsKLQkJCXJldHVybiBoZWxwZXIuaXNBcmNoaXZlVmFsaWQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5EaXNjcmltaW5hdG9yIHsKLQotCQlwcml2YXRlIHN0YXRpYyBEaXNjcmltaW5hdG9yIGluc3RhbmNlOwotCi0JCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJaW5zdGFuY2UgPSBuZXcgRGlzY3JpbWluYXRvcigpOwotCQkJfQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCVJlZmVyZW5jZUNvdW50ZWRXQVJGaWxlSW1wbCBhcmNoaXZlID0gbmV3IFJlZmVyZW5jZUNvdW50ZWRXQVJGaWxlSW1wbCgpOwotCQkJcmV0dXJuIGFyY2hpdmU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUNvdW50ZWRXQVJGaWxlSW1wbCBleHRlbmRzIFdBUkZpbGVJbXBsIGltcGxlbWVudHMgSVJlZmVyZW5jZUNvdW50ZWRBcmNoaXZlIHsKLQotCQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXNzKCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJaGVscGVyLmFib3V0VG9DbG9zZSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJY291bnQtLTsKLQkJCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlwaHlzaWNhbGx5Q2xvc2UodGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZvcmNlQ2xvc2UoKXsKLQkJCWNvdW50ID0gMDsKLQkJCWhlbHBlci5hYm91dFRvQ2xvc2UoKTsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpIHsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKSB7Ci0JCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVCaW5hcnlMb2FkU3RyYXRlZ3koZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpKTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCQloZWxwZXIucHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUodXJpLCBvcmlnaW5hbCwgZGVzdGluYXRpb25GaWxlKTsKLQkJCXN1cGVyLmNsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQloZWxwZXIucG9zdENsZWFudXBBZnRlclRlbXBTYXZlKHVyaSwgb3JpZ2luYWwsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFdlYkJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIoY29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKLQkJcmV0dXJuICgoV0FSRmlsZSkgZ2V0QXJjaGl2ZSgpKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0NsYXNzcGF0aERlbGV0ZUluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9DbGFzc3BhdGhEZWxldGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjgzNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0NsYXNzcGF0aERlbGV0ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBBIHNpbXBsZSBzdHJ1Y3R1cmUgdGhhdCByZW1lbWJlcnMgZm9yIGEgZ2l2ZW4gcHJvamVjdCwgdGhlIG1hbmlmZXN0IGVudHJpZXMgdG8gYmUgZGVsZXRlZCBhbmQgdGhlCi0gKiBidWlsZCBwYXRoIGVudHJpZXMgdG8gYmUgZGVsZXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVsZXRlSW5mbyB7Ci0JLyoqCi0JICogVGhlIHByb2plY3QgZnJvbSB3aGljaCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgcmVtb3ZlZAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCS8qKgotCSAqIFRoZSBsaXRlcmFsIG1hbmlmZXN0IGVudHJpZXMgdG8gYmUgcmVtb3ZlZDsgU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIExpc3QgbWFuaWZlc3RFbnRyaWVzOwotCS8qKgotCSAqIFRoZSBwcm9qZWN0IHJlZmVyZW5jZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWlsZCBwYXRoOyBJUHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQotCXB1YmxpYyBDbGFzc3BhdGhEZWxldGVJbmZvKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0UHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuaWZlc3RFbnRyaWVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYW5pZmVzdEVudHJpZXMoKSB7Ci0JCWlmIChtYW5pZmVzdEVudHJpZXMgPT0gbnVsbCkKLQkJCW1hbmlmZXN0RW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG1hbmlmZXN0RW50cmllczsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZWRQcm9qZWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXJnZXRQcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIElQcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9qZWN0OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0RlbGV0ZU1vZHVsZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0RlbGV0ZU1vZHVsZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDlkZDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVNb2R1bGVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogRG8gbm90IHVzZSB0aGlzLiAgSXQgd2lsbCBiZSBkZWxldGVkIGluIDMuMAotICogCi0gKiBAZGVwcmVjYXRlZAotICoKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZU1vZHVsZU9wZXJhdGlvbiB7IC8vZXh0ZW5kcyBXVFBPcGVyYXRpb24gewotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0vLwlwcm90ZWN0ZWQgRGVsZXRlT3B0aW9ucyBvcHRpb25zOwotLy8JLyoKLS8vCSAqIGtleSBpcyBhbiBFQVJFZGl0TW9kZWwgYW5kIHRoZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZGVsZXRlIGNvbW1hbmRzLiBXZSBjYWNoZSB0aGUgY29tbWFuZHMgYW5kCi0vLwkgKiBleGVjdXRlIGxhdGVyIGJlY2F1c2UgdGhlIG1vZHVsZXMgc3RpbGwgbmVlZCB0byBleGlzdCB3aGVuIHdlIGdvIHRvIHJlbW92ZSBtb2R1bGUgZGVwZW5kZW5jeQotLy8JICogcmVmZXJlbmNlcy4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIE1hcCBkZWZlcnJlZENvbW1hbmRzOwotLy8JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLS8vCXByb3RlY3RlZCBEZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uIGRlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb247Ci0vLwlwcm90ZWN0ZWQgTG9vc2VDb21wb3NlZEVkaXRNb2RlbCBkZWxldGVFZGl0TW9kZWw7Ci0vLwlwcm90ZWN0ZWQgTGlzdCBkaXJ0eUVhck1vZGVsczsKLS8vCi0vLwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFRElUX01PREVMX0tFWSA9ICJERUxFVEVfTU9EVUxFUyI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwdWJsaWMgRGVsZXRlTW9kdWxlT3BlcmF0aW9uKERlbGV0ZU9wdGlvbnMgb3B0aW9ucykgewotLy8JCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBAc2VlIEhlYWRsZXNzSjJFRU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IpCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQl0aGlzLm1vbml0b3IgPSBhTW9uaXRvcjsKLS8vCQl0cnkgewotLy8JCQlidWlsZERlbGV0ZUNvbW1hbmRzSWZOZWNlc3NhcnkoKTsKLS8vCQkJaWYgKG9wdGlvbnMuc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkpIHsKLS8vCQkJCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpOwotLy8JCQl9Ci0vLwkJCWNoZWNrSWZFYXJzQXJlRGlydHkoKTsKLS8vCQkJZXhlY3V0ZURlZmVycmVkQ29tbWFuZHMoKTsKLS8vCQkJc2F2ZU1vZGVsc0lmTmVjZXNzYXJ5KCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJcmVsZWFzZU1vZGVscygpOwotLy8JCX0KLS8vCi0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgY2hlY2tJZkVhcnNBcmVEaXJ0eSgpIHsKLS8vCQlkaXJ0eUVhck1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlpZiAoZGVmZXJyZWRDb21tYW5kcyA9PSBudWxsKQotLy8JCQlyZXR1cm47Ci0vLwkJSXRlcmF0b3IgbW9kZWxzID0gZGVmZXJyZWRDb21tYW5kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotLy8JCXdoaWxlIChtb2RlbHMuaGFzTmV4dCgpKSB7Ci0vLwkJCUVBUkVkaXRNb2RlbCBtb2RlbCA9IChFQVJFZGl0TW9kZWwpIG1vZGVscy5uZXh0KCk7Ci0vLwkJCWlmIChtb2RlbC5pc0RpcnR5KCkgJiYgIWRpcnR5RWFyTW9kZWxzLmNvbnRhaW5zKG1vZGVsKSkgewotLy8JCQkJZGlydHlFYXJNb2RlbHMuYWRkKG1vZGVsKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCBidWlsZERlbGV0ZUNvbW1hbmRzSWZOZWNlc3NhcnkoKSB7Ci0vLwkJaWYgKGRlZmVycmVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhZGVmZXJyZWRDb21tYW5kcy5pc0VtcHR5KCkpCi0vLwkJCXJldHVybjsKLS8vCQlkZWZlcnJlZENvbW1hbmRzID0gbmV3IEhhc2hNYXAoKTsKLS8vCQlMaXN0IGVhclByb2plY3RzID0gRUFSTmF0dXJlUnVudGltZS5nZXRBbGxFQVJQcm9qZWN0c0luV29ya2JlbmNoKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBlYXJQcm9qZWN0cy5nZXQoaSk7Ci0vLwkJCWlmIChvcHRpb25zLmdldFNlbGVjdGVkUHJvamVjdHMoKS5jb250YWlucyhwKSkKLS8vCQkJCXJldHVybjsKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHApOwotLy8JCQlpZiAocnVudGltZSAhPSBudWxsKQotLy8JCQkJYnVpbGREZWxldGVDb21tYW5kcyhydW50aW1lKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgYnVpbGREZWxldGVDb21tYW5kcyhFQVJOYXR1cmVSdW50aW1lIHJ1bnRpbWUpIHsKLS8vCQlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCUVBUkVkaXRNb2RlbCBtb2RlbCA9IHJ1bnRpbWUuZ2V0RWFyRWRpdE1vZGVsRm9yV3JpdGUodGhpcyk7Ci0vLwkJTGlzdCBwcm9qZWN0cyA9IG9wdGlvbnMuZ2V0TW9kdWxlQW5kVXRpbGl0eVByb2plY3RzKCk7Ci0vLwkJdHJ5IHsKLS8vCQkJaWYgKG9wdGlvbnMuc2hvdWxkRGVsZXRlTW9kdWxlcygpKSB7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdHMuZ2V0KGkpOwotLy8JCQkJCU1vZHVsZSBtID0gcnVudGltZS5nZXRNb2R1bGUocHJvamVjdCk7Ci0vLwkJCQkJaWYgKG0gIT0gbnVsbCkKLS8vCQkJCQkJY29tbWFuZHMuYWRkKG5ldyBSZW1vdmVNb2R1bGVGcm9tRUFSUHJvamVjdENvbW1hbmQobSwgcnVudGltZS5nZXRQcm9qZWN0KCkpKTsKLS8vCQkJCQllbHNlIHsKLS8vCQkJCQkJU3RyaW5nIHVyaSA9IHJ1bnRpbWUuZ2V0SkFSVXJpKHByb2plY3QpOwotLy8JCQkJCQlpZiAodXJpICE9IG51bGwpCi0vLwkJCQkJCQljb21tYW5kcy5hZGQobmV3IFJlbW92ZVV0aWxpdHlKQVJNYXBDb21tYW5kKHJ1bnRpbWUuZ2V0UHJvamVjdCgpLCB1cmksIHByb2plY3QpKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpCi0vLwkJCQlkZWZlcnJlZENvbW1hbmRzLnB1dChtb2RlbCwgY29tbWFuZHMpOwotLy8JCQllbHNlCi0vLwkJCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotLy8JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl0aHJvdyBlOwotLy8JCX0gY2F0Y2ggKEVycm9yIGVycikgewotLy8JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl0aHJvdyBlcnI7Ci0vLwkJfQotLy8JfQotLy8KLS8vCS8qKgotLy8JICogRG8gdGhpcyBmb3IgdW5oYW5kbGVkIGV4Y2VwdGlvbnMKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1vZGVscygpIHsKLS8vCQlpZiAoZGVsZXRlRWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJLy9UT0RPIC0gUkxTLCAyLzE5LzIwMDQgd2UgbmVlZCB0byByZXZpc2l0IHRoZSB3aG9sZSBub3Rpb24gb2YgdGhlIGxvb3NlIGNvbXBvc2VkIGVkaXQKLS8vCQkJLy9tb2RlbCBiZWNjYXVzZSB0aGlzIGRvZXMgbm90IHJlbGVhc2UgdGhlIG5lc3RlZCBtb2RlbHMgYXMgZXhwZWN0ZWQsIGFsc28gaXQgbG9va3MKLS8vCQkJLy8gbGlrZQotLy8JCQkvLyB0aGUgZGVsZXRlIGVkaXQgbW9kZWwgaXMgbmV2ZXIgY3JlYXRlZCB3aGljaCBtZWFucyB2YWxpZGF0ZSBlZGl0IGlzIG5vdCBoYXBwZW5pbmcKLS8vCQkJLy9UT0RPIC0gSkFTIHdoZW4geW91IGxvb2sgYXQgdGhpcyBjbGFzcyB0byBjbGVhbiB1cCB0aGUgYWJvdmUsIGFsc28gbG9vayBhdAotLy8JCQkvLyBSZW5hbWVNb2R1bGVPcGVyYXRpb24KLS8vCQkJLy9iZWNhdXNlIGl0IGhhcyB0aGUgc2FtZSBraW5kIG9mIG1lc3MKLS8vCQkJZGVsZXRlRWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0vLwkJCWRlbGV0ZUVkaXRNb2RlbCA9IG51bGw7Ci0vLwkJfQotLy8JCWlmIChkZWZlcnJlZENvbW1hbmRzICE9IG51bGwpIHsKLS8vCQkJSXRlcmF0b3IgaXRlciA9IGRlZmVycmVkQ29tbWFuZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgaXRlci5uZXh0KCk7Ci0vLwkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLS8vCQlyZWxlYXNlTW9kZWxzKCk7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBBZnRlciBhIG5vcm1hbCBleGVjdXRpb24gZmxvdywgc2F2ZSB0aGUgbW9kZWxzIGlmIG5lY2Vzc2FyeQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9kZWxzSWZOZWNlc3NhcnkoKSB7Ci0vLwkJaWYgKGRlZmVycmVkQ29tbWFuZHMgPT0gbnVsbCkKLS8vCQkJcmV0dXJuOwotLy8JCUl0ZXJhdG9yIG1vZGVscyA9IGRlZmVycmVkQ29tbWFuZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQl3aGlsZSAobW9kZWxzLmhhc05leHQoKSkgewotLy8JCQlFQVJFZGl0TW9kZWwgbW9kZWwgPSAoRUFSRWRpdE1vZGVsKSBtb2RlbHMubmV4dCgpOwotLy8JCQlpZiAobW9kZWwuaXNEaXJ0eSgpKSB7Ci0vLwkJCQlpZiAoZGlydHlFYXJNb2RlbHMuY29udGFpbnMobW9kZWwpKSB7Ci0vLwkJCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQltb2RlbC5zYXZlKHRoaXMpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0vLwkJZ2V0RGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbigpLnJ1bihtb25pdG9yKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbiBnZXREZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uKCkgewotLy8JCWlmIChkZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uID09IG51bGwpIHsKLS8vCQkJTGlzdCBlYXJFZGl0TW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlJdGVyYXRvciBpdGVyID0gZGVmZXJyZWRDb21tYW5kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotLy8JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0vLwkJCQllYXJFZGl0TW9kZWxzLmFkZCgoKEVBUkVkaXRNb2RlbCkgaXRlci5uZXh0KCkpLmdldEVBUk5hdHVyZSgpKTsKLS8vCQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbiA9IG5ldyBEZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uKGVhckVkaXRNb2RlbHMsIG5ldyBIYXNoU2V0KG9wdGlvbnMuZ2V0TW9kdWxlQW5kVXRpbGl0eVByb2plY3RzKCkpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb247Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZURlZmVycmVkQ29tbWFuZHMoKSB7Ci0vLwkJSXRlcmF0b3IgaXQgPSBkZWZlcnJlZENvbW1hbmRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0vLwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLS8vCQkJTGlzdCBjb21tYW5kcyA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotLy8JCQlleGVjdXRlQ29tbWFuZHMoY29tbWFuZHMpOwotLy8KLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUNvbW1hbmRzKExpc3QgY29tbWFuZHMpIHsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGNvbW1hbmRzLmdldChpKTsKLS8vCQkJY21kLmV4ZWN1dGUoKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbm9uLXJlc291cmNlIGZpbGVzIHRoYXQgd2lsbCBnZXQgbW9kaWZpZWQgYXMgYSByZXN1bHQgb2YgcnVubmluZwotLy8JICogdGhpcyBvcGVyYXRpb247IHVzZWQgZm9yIHZhbGlkYXRlIGVkaXQuCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkTm9uUmVzb3VyY2VGaWxlcygpIHsKLS8vCQlpZiAob3B0aW9ucy5zaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSkKLS8vCQkJcmV0dXJuIGdldERlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb24oKS5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0vLwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBVc2UgdGhpcyBvbmx5IGZvciB2YWxpZGF0ZSBlZGl0cwotLy8JICovCi0vLwlwdWJsaWMgQ29tcG9zZWRFZGl0TW9kZWwgZ2V0RGVsZXRlRWRpdE1vZGVsKCkgewotLy8JCWlmIChkZWxldGVFZGl0TW9kZWwgPT0gbnVsbCkKLS8vCQkJaW5pdGlhbGl6ZURlbGV0ZUVkaXRNb2RlbCgpOwotLy8JCXJldHVybiBkZWxldGVFZGl0TW9kZWw7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlbGV0ZUVkaXRNb2RlbCgpIHsKLS8vCQlpZiAob3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCkuc2l6ZSgpID09IDApIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVsZXRlTW9kdWxlT3BlcmF0aW9uX1VJXzAiKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0vLwotLy8JCWJ1aWxkRGVsZXRlQ29tbWFuZHNJZk5lY2Vzc2FyeSgpOwotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotLy8JCXByb2plY3QgPSAoSVByb2plY3QpIG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpLmdldCgwKTsKLS8vCi0vLwkJZGVsZXRlRWRpdE1vZGVsID0gbmV3IExvb3NlQ29tcG9zZWRFZGl0TW9kZWwoRURJVF9NT0RFTF9LRVksIChFTUZXb3JrYmVuY2hDb250ZXh0KSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRFTUZDb250ZXh0KHByb2plY3QpKSB7Ci0vLwotLy8JCQkvKioKLS8vCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53b3JrYmVuY2guRWRpdE1vZGVsI2dldE5vblJlc291cmNlRmlsZXMoKQotLy8JCQkgKi8KLS8vCQkJcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLS8vCQkJCUxpc3QgcmVzdWx0ID0gc3VwZXIuZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotLy8JCQkJcmVzdWx0LmFkZEFsbChnZXRBZmZlY3RlZE5vblJlc291cmNlRmlsZXMoKSk7Ci0vLwkJCQlyZXR1cm4gcmVzdWx0OwotLy8JCQl9Ci0vLwkJfTsKLS8vCi0vLwkJSXRlcmF0b3IgaXQgPSBkZWZlcnJlZENvbW1hbmRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0vLwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotLy8JCQlkZWxldGVFZGl0TW9kZWwuYWRkQ2hpbGQoKEoyRUVFZGl0TW9kZWwpIGl0Lm5leHQoKSk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLS8vCQlyZXR1cm4gZGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbi5nZXRTdGF0dXMoKTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0RlbGV0ZU9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjE1NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVsZXRlL0RlbGV0ZU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVPcHRpb25zIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRUFSRGVsZXRlOwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZVByb2plY3RzOwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZU1vZHVsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzOwotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkUHJvamVjdHM7Ci0JLyoqIEFwcGxpY2FibGUgZm9yIEVBUiBkZWxldGUgKi8KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0czsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVPcHRpb25zLgotCSAqLwotCXB1YmxpYyBEZWxldGVPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsZXRlTW9kdWxlcygpIHsKLQkJcmV0dXJuIGRlbGV0ZU1vZHVsZXM7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVNb2R1bGVzKGJvb2xlYW4gZGVsZXRlTW9kdWxlc0Zyb21BbGxFQVJzKSB7Ci0JCXRoaXMuZGVsZXRlTW9kdWxlcyA9IGRlbGV0ZU1vZHVsZXNGcm9tQWxsRUFSczsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZVByb2plY3RzKCkgewotCQlyZXR1cm4gZGVsZXRlUHJvamVjdHM7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVQcm9qZWN0cyhib29sZWFuIGRlbGV0ZVByb2plY3RzKSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdHMgPSBkZWxldGVQcm9qZWN0czsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llczsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcyhib29sZWFuIGRlbGV0ZVJlZmVyZW5jZXNGcm9tTW9kdWxlRGVwZW5kZW5jaWVzKSB7Ci0JCXRoaXMuZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzID0gZGVsZXRlUmVmZXJlbmNlc0Zyb21Nb2R1bGVEZXBlbmRlbmNpZXM7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlQW5kVXRpbGl0eVByb2plY3RzKCkgewotCQlpZiAoaXNFQVJEZWxldGUpCi0JCQlyZXR1cm4gZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJcmV0dXJuIGdldFNlbGVjdGVkUHJvamVjdHMoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRTZWxlY3RlZFByb2plY3RzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNlbGVjdGVkUHJvamVjdHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkUHJvamVjdHMoKSB7Ci0JCWlmIChzZWxlY3RlZFByb2plY3RzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHNlbGVjdGVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0ZWRQcm9qZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9qZWN0cwotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkUHJvamVjdHMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQcm9qZWN0cyhMaXN0IHNlbGVjdGVkUHJvamVjdHMpIHsKLQkJdGhpcy5zZWxlY3RlZFByb2plY3RzID0gc2VsZWN0ZWRQcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyhMaXN0IHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMgPSBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkRlbGV0ZSgpIHsKLQkJcmV0dXJuIGlzRUFSRGVsZXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzRUFSRGVsZXRlKGJvb2xlYW4gaXNFQVJEZWxldGUpIHsKLQkJdGhpcy5pc0VBUkRlbGV0ZSA9IGlzRUFSRGVsZXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvQXNzZXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZmOWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3Q7Ci0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzCi0gKiBpbiBjb2RlLgotICogVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lCi0gKiB0eXBlIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUKLSAqIHRocm93biB3aGVuIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5Ci0gKiB1bnNwZWNpZmllZCBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uCi0gKiB0aGVzZSBiZWluZyB0aHJvd24gKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtCi0gKiBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQkvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi0JcHJpdmF0ZSBBc3NlcnQoKSB7Ci0JCS8vIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMKLQkgKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLQkgKiBpcyB0aHJvd24uCi0JICoKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotCSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMKLQkgKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLQkgKiBpcyB0aHJvd24uCi0JICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotCSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMKLQkgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgewotCQlpc05vdE51bGwob2JqZWN0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzCi0JICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigibnVsbCBhcmd1bWVudDoiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzCi0JICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICoKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotCSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNUcnVlKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKLQkgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0JICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJhc3NlcnRpb24gZmFpbGVkOiAiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzNjMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0OwotCi0vKioKLSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIAotICogb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvIHVuZXhwZWN0ZWQKLSAqIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLSAqIDwvcD4KLSAqLwotLyogcGFja2FnZSAqLwotY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQlzdXBlcihkZXRhaWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSUoyRUVQcm9qZWN0VHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSUoyRUVQcm9qZWN0VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZjEyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0lKMkVFUHJvamVjdFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSjJFRVByb2plY3RUeXBlcyB7Ci0JaW50IFNPVVJDRSA9IDE7Ci0JaW50IEJJTkFSWSA9IDI7Ci0JaW50IERFRkFVTFQgPSAzOwotCWludCBVVElMID0gNDsKLQlpbnQgRUpCX0NMSUVOVCA9IDU7Ci0JaW50IE1PRFVMRSA9IDY7Ci0JaW50IEVKQl9NT0RVTEUgPSA3OwotCWludCBXRUJfTU9EVUxFID0gODsKLQlpbnQgSkNBX01PRFVMRSA9IDk7Ci0JaW50IEFQUENMSUVOVF9NT0RVTEUgPSAxMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9KMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiMzI2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiajJlZWNyZWF0aW9uIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVfSjJFRV9TUEVDX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJSZWZlcmVuY2VEYXRhTW9kZWxfVUlfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUVVJUkVEX0NMSUVOVF9WSUVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVElPTl9DT01QTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfTkVFREVEX0RFUExPWU1FTlRfREVTQ19NSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlHUkFUSU9OX1dBUk5JTkdTX1JFUE9SVF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQkFDS0VORF9NSUdSQVRJT05fRkFJTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFVVNFX0RFTEVURURfQ0xJRU5UX1ZJRVdfTkFNRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCX1BST0pFQ1RTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfTkVFREVEX0JBQ0tFTkRfTUlHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVElPTl9OT1RfUE9TU0lCTEVfUkVQT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTVVTVF9CRV9TRUxFQ1RFRF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFSXzExX0lNUE9SVF8yMF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCQ09OVEVOVF9GT0xERVJfUkVOQU1FX1NLSVBQRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklSTV9NSUdSQVRFX1BST0pFQ1RfU1RSVUNUVVJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBST0pFQ1RfVkVSU0lPTl9NSUdSQVRFX0ZBSUxFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGtKYXJGaWxlRG9lc05vdEV4aXN0X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsX2Nhbm5vdF9iZV9lbXB0eV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxfQ0xJRU5UX05PVF9ORUVERUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1RFX0NMSUVOVF9WSUVXU19OT1RfRVhJU1RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVElOR19QUk9KRUNUX1NUUlVDVFVSRVNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRW52aXJvbm1lbnRSZWZlcmVuY2VEYXRhTW9kZWxfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFXzFfMl9PTkxZX0hBVkVfUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9QRU5fRURJVE9SU19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJfTVVTVF9CRV9TRUxFQ1RFRF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRkFJTEVEX01JR1JBVElOR19JTVBPUlRFRF9DTEFTU0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9QRU5fSjJFRV9NSUdSQVRJT05fV0laQVJEX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9DTElFTlRfVklFV1NfRVhJU1RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFTEVUSU5HX1JFTU9URV9DTElFTlRfVklFV1NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklSTV9DTElFTlRfVklFV19SRVFVSVJFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSUdSQVRJT05fTk9UX05FRURFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERJTkdfTE9DQUxfQ0xJRU5UX1ZJRVdTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZU1vZHVsZU9wZXJhdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhvbWVfY2Fubm90X2JlX2VtcHR5X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJDT05URU5UX0xJQlBBVEhfVVBEQVRFX0ZBSUxFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfQ0xJRU5UX0RFTEVURV9TVUNDRVNTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJUYXJnZXREYXRhTW9kZWxfVUlfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9DTElFTlRfQUREX0ZBSUxFRF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VydmVyVGFyZ2V0RGF0YU1vZGVsX1VJXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT0xEX1BST0pFQ1RfU1RSVUNUVVJFX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJUYXJnZXREYXRhTW9kZWxfVUlfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPUk1fUFJPUEVSX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSUdSQVRFX01PRFVMRV9QUk9KRUNUU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09NUExFVEVEX0xPQ0FMX0NMSUVOVF9DUkVBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU1QT1JURURfQ0xBU1NFU19GSUxFX0RFTEVURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xPQ0FMX0NMSUVOVF9WSUVXU19CQU5fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9SRU1PVEVfRk9SX0RJRkZFUkVOVF9FQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVBQX1BST0pFQ1RfRVJST1JfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkQ2hhcnNFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VSZWZlcmVuY2VEYXRhTW9kZWxfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVJlZmVyZW5jZURhdGFNb2RlbF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFTEVURV9SRU1fQ0xJRU5UX1ZJRVdTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcnNfb2NjdXJyZWRfcmVuYW1pbmdfbW9kdWxlX2RlcGVuZGVuY2llc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlHUkFUSU9OX0VSUk9SU19SRVBPUlRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl9GQUlMRURfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTVBMRVRFRF9ERVBMT1lfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfUkVGRVJFTkNFU19VUERBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBUkdFVF9BTFNPX0VYSVNUX0lOX1NBTUVfRUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQkNPTlRFTlRfRk9MREVSX1JFTkFNRV9GQUlMRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlHUkFURV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9jcmVhdGluZ19hbl9FQVJfcHJval9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5URVJQUklTRV9CRUFOU19CQU5fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MT0NBTF9DTElFTlRfVklFV1NfQ0hFQ0tfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhbl9ub3RfcmVuYW1lX21vZHVsZV9kZXBlbmRlbmN5X2Zyb21fcHJvamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9TVFJVQ1RVUkVfU1VDQ0VTU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU09VUkNFX0ZPTERFUl9SRU5BTUVfU0tJUFBFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTktOT1dOX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXSVpfQkFOX0RFU0NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTVBMRVRFRF9DTVAyMF9DT0RFR0VOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTk9UX05FRURfTUlHUkFUSU9OX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUxFQ1RfRUpCX0NMSUVOVF9WSUVXU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfSmF2YV9Qcm9qZWN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfQ0xJRU5UX0RFTEVURV9GQUlMRURfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEVTX09VVF9PRl9TWU5DOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVfQ01QX0JFQU5TX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdGVfY2Fubm90X2JlX2VtcHR5X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcnNfb2NjdXJyZWRfZGVsZXRpbmdfbW9kdWxlX2RlcGVuZGVuY2llc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FuX25vdF9yZW1vdmVfbW9kdWxlX2RlcGVuZGVuY3lfZnJvbV9wcm9qZWN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1NFTEVDVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBQlNfUEFUSFNfQVBQX0VYVF9SRU1PVkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsX2hvbWVfY2Fubm90X2JlX2VtcHR5X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfTE9DQUxfRk9SX0RJRkZFUkVOVF9FQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5URVJQUklTRV9BUFBfUFJPSkVDVFNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVfSjJFRV9QUk9KRUNUU19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlHUkFUSU9OX1NVQ0NFU1NfUkVQT1JUX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGQUlMRURfREVQTE9ZX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fTk9UX05FRURfTUlHUkFUSU9OX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSUdSQVRJTkdfSjJFRV9WRVJTSU9OX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBMSUNBVElPTl9DTElFTlRTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2aWNlUmVmZXJlbmNlRGF0YU1vZGVsX0VSUk9SXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9TVFJVQ1RVUkVfRkFJTEVEX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9DTElFTlRfQUREX1NVQ0NFU1NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTVBPTkVOVF9BTFJFQURZSU5FQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09NUExFVEVEX0JBQ0tFTkRfTUlHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVfRUpCX1NQRUNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZU1vZHVsZU9wZXJhdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENNUF8xMV9JTVBPUlRfMjBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfUFJPSkVDVF9NSUdSQVRJT05fVElUTEVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUF9DTElFTlRfT05MWV9IQVZFX1JFTU9URTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSUdSQVRJT05fTk9UX05FRURFRF9SRVBPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxfQ0xJRU5UX1ZJRVdfU0NIRU1FX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCSU5BUllfTUlHUkFUSU9OX0ZBSUxFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPUk1fT1BFTl9FRElUT1JTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYVFJBQ1RFRF9JTVBPUlRFRF9DTEFTU0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl9TVUNDRVNTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTVUZGSVhfRVhBTVBMRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklSTUFUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVElPTl9FUlJPUlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVBQTElDQVRJT05fQ0xJRU5UX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTUEVDSUZZX1NVRkZJWF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklSTV9NSUdSQVRFX0oyRUVfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUG9ydENvbXBvbmVudFJlZmVyZW5jZURhdGFNb2RlbF9FUlJPUl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZBSUxFRF9MT0NBTF9DTElFTlRfQ1JFQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VEZXN0UmVmZXJlbmNlRGF0YU1vZGVsXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVBQTElDQVRJT05fQ0xJRU5UX1BST0pFQ1RTX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlRGVzdFJlZmVyZW5jZURhdGFNb2RlbF84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPVVJDRV9GT0xERVJfUkVOQU1FX0ZBSUxFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlRGVzdFJlZmVyZW5jZURhdGFNb2RlbF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVEVSUFJJU0VfQkVBTlNfTElTVF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9DTEFTU1BBVEhfVVBEQVRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWRVJTSU9OX05PVF9TVVBQT1JURUQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRUphdmFQcm9qZWN0SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9KMkVFSmF2YVByb2plY3RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYmFjZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9KMkVFSmF2YVByb2plY3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhUHJvamVjdEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSBpbmZvIHJlcXVpcmVkIGZvciBjcmVhdGluZyBhIG5ldyBKMkVFIHByb2plY3Q7IG5vdCBhbGwgaW5mbyB3aWxsIGFwcGx5IHRvCi0gKiBhbGwga2luZHMgb2YgcHJvamVjdHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVKYXZhUHJvamVjdEluZm8gZXh0ZW5kcyBKYXZhUHJvamVjdEluZm8gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ1JPT1RfVkFSID0gIkpSRV9TUkNST09UIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBTdHJpbmcgamRrUlRKYXJQYXRoOwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE5hbWU7Ci0JcHJvdGVjdGVkIElQYXRoIHByb2plY3RMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFPdXRwdXRQYXRoOwotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzOwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluaXRpYWxpemVEZWZhdWx0Q2xhc3NwYXRoID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hdHVyZUlkOwotCXByb3RlY3RlZCBJUnVudGltZSBzZXJ2ZXJUYXJnZXQ7Ci0JcHJvdGVjdGVkIGludCBtb2R1bGVWZXJzaW9uOwotCi0JLyoqCi0JICogRUpCUHJvamVjdEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRUphdmFQcm9qZWN0SW5mbygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFSkJQcm9qZWN0SW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFSmF2YVByb2plY3RJbmZvKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gY2FsY3VsYXRlU2VydmVyQ2xhc3NwYXRoRW50cmllcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZ2V0UHJvamVjdCgpLmV4aXN0cygpKSB7Ci0JCQkvL1dlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIGEgc2VydmVyIHRhcmdldCBhbnlvbXJlIGFzIGl0IG5lZWQgdG8gYmUgdGhlcmUKLQkJCS8vU2VydmVyVGFyZ2V0TWFuYWdlci5yZW1vdmVTZXJ2ZXJUYXJnZXQoZ2V0UHJvamVjdCgpLG51bGwpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2VzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlpZiAoY2VzLmxlbmd0aCA+IDApCi0JCQkJYWRkVG9DbGFzc3BhdGhFbnRyaWVzKGNlcyk7Ci0JCX0KLQkJYWRkU2VydmVySmRrUnVudGltZVRvQ2xhc3NwYXRoRW50cmllcygpOwotCQlhZGRTZXJ2ZXJKYXJzVG9DbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCXJldHVybiBjbGFzc3BhdGhFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgY2xhc3NwYXRoIGZvciB0aGlzIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0VG9DbGFzc3BhdGhFbnRyaWVzKCkgewotCQlhZGRUb0NsYXNzcGF0aEVudHJpZXMoY29tcHV0ZURlZmF1bHRKYXZhQ2xhc3NwYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29ycmVzcG9uZGluZyBqc3AgYW5kIHNlcnZsZXQgbGV2ZWxzLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDkvMDAgMTA6MDU6MjQgQU0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oaW50IG5ld1ZlcnNpb24pIHsKLQl9Ci0KLQotCS8qKgotCSAqIGFkZCB0aGUgc291cmNlIGZvbGRlciB0byBjbGFzc3BhdGggZGlyIChJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRKYXZhU291cmNlVG9DbGFzc3BhdGhFbnRyaWVzKCkgewotCQlJUGF0aCBzb3VyY2VDbGFzc1BhdGggPSBuZXcgUGF0aChnZXRGdWxsU291cmNlUGF0aCgpKTsKLQkJYWRkVG9DbGFzc3BhdGhFbnRyaWVzKG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzb3VyY2VDbGFzc1BhdGgpfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkSmRrSmFyVG9DbGFzc3BhdGhFbnRyaWVzKFN0cmluZyBqZGtKYXJGdWxsUGF0aE5hbWUpIHsKLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyeSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMV07Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGpka0phckZ1bGxQYXRoTmFtZSk7Ci0JCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5KZGtKYXJGaWxlRG9lc05vdEV4aXN0X1VJLCBuZXcgT2JqZWN0W117amRrSmFyRnVsbFBhdGhOYW1lfSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWVudHJ5WzBdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpOwotCQlhZGRUb0NsYXNzcGF0aEVudHJpZXMoZW50cnkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGFkZCBydC5qYXIgZm9ybSB0aGUgc2VydmVyLmpkayBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJKZGtSdW50aW1lVG9DbGFzc3BhdGhFbnRyaWVzKCkgewotCQlhZGRUb0NsYXNzcGF0aEVudHJpZXMoZ2V0U2VydmVySkRLQ2xhc3NwYXRoRW50cmllcygpKTsKLQl9Ci0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0U2VydmVySkRLQ2xhc3NwYXRoRW50cmllcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJLy9UT0RPIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGRlbGV0ZWQuCi0JCS8vCQlpZiAoaXNKMkVFMTMoKQotCQkvLwkJCXx8ICFvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5oYXNEZXZlbG9wbWVudFJvbGUoKSkgewotCQkvLwkJCWxpc3QuYWRkKEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3Ci0JCS8vIFBhdGgoSUVKQk5hdHVyZUNvbnN0YW50cy5TRVJWRVJKREtfNTBfUExVR0lORElSX1ZBUklBQkxFICsgIi9qcmUvbGliL3J0LmphciIpLAotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQkJbmV3IFBhdGgoSUVKQk5hdHVyZUNvbnN0YW50cy5TRVJWRVJKREtfNTBfUExVR0lORElSX1ZBUklBQkxFICsgIi9zcmMuamFyIiksIC8vJE5PTi1OTFMtMSQKLQkJLy8JCQluZXcgUGF0aChJRUpCTmF0dXJlQ29uc3RhbnRzLlNFUlZFUkpES19TUkNST09UX1ZBUklBQkxFKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vCQl9IGVsc2UgewotCQkvLwkJCWxpc3QuYWRkKEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3Ci0JCS8vIFBhdGgoSUVKQk5hdHVyZUNvbnN0YW50cy5TRVJWRVJKREtfUExVR0lORElSX1ZBUklBQkxFICsgIi9qcmUvbGliL3J0LmphciIpLCAvLyROT04tTkxTLTEkCi0JCS8vCQkJbmV3IFBhdGgoSUVKQk5hdHVyZUNvbnN0YW50cy5TRVJWRVJKREtfUExVR0lORElSX1ZBUklBQkxFICsgIi9zcmMuamFyIiksIC8vJE5PTi1OTFMtMSQKLQkJLy8JCQluZXcgUGF0aChJRUpCTmF0dXJlQ29uc3RhbnRzLlNFUlZFUkpES19TUkNST09UX1ZBUklBQkxFKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vCQl9Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIGxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBlbnRyaWVzIHRvIHRoZSBjbGFzcyBwYXRoIGZvciB0aGlzIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb0NsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCi0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJLy8gYWRkIHRoZSBleGlzdGluZyBvbmVzIGlmIGFueQotCQlpZiAoY2xhc3NwYXRoRW50cmllcyAhPSBudWxsKQotCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGFzc3BhdGhFbnRyaWVzKSk7Ci0KLQkJLy8gYWRkIHRoZSBuZXcgb25lcwotCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQotCQkvLyBjb252ZXJ0Ci0JCWNsYXNzcGF0aEVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXTsKLQkJY2xhc3NwYXRoRW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbGlzdC50b0FycmF5KGNsYXNzcGF0aEVudHJpZXMpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkVmFyaWFibGVKYXJUb0NsYXNzcGF0aEVudHJpZXMoU3RyaW5nIGZ1bGxQYXRoKSB7Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cnkgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WzFdOwotCQllbnRyeVswXSA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgoZnVsbFBhdGgpLCBudWxsLCBudWxsKTsKLQkJYWRkVG9DbGFzc3BhdGhFbnRyaWVzKGVudHJ5KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkVmFyaWFibGVKYXJUb0NsYXNzcGF0aEVudHJpZXNXaXRoQXR0YWNobWVudHMoU3RyaW5nIGZ1bGxQYXRoLCBTdHJpbmcgc3JjUGF0aCwgU3RyaW5nIHNyY1Jvb3QpIHsKLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyeSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMV07Ci0JCWVudHJ5WzBdID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aChmdWxsUGF0aCksIG5ldyBQYXRoKHNyY1BhdGgpLCBuZXcgUGF0aChzcmNSb290KSk7Ci0JCWFkZFRvQ2xhc3NwYXRoRW50cmllcyhlbnRyeSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBjbGFzc3BhdGggZm9yIHByb2plY3RzIG9mIHRoaXMga2luZDsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZm9yCi0JICogc2V0dGluZyB1cCBuZXcgcHJvamVjdHMKLQkgKi8KLQlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gY29tcHV0ZURlZmF1bHRKYXZhQ2xhc3NwYXRoKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlhZGRKYXZhU291cmNlVG9DbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCWlmIChzZXJ2ZXJUYXJnZXQgPT0gbnVsbCkgewotCQkJYWRkU2VydmVySmRrUnVudGltZVRvQ2xhc3NwYXRoRW50cmllcygpOwotCQkJYWRkU2VydmVySmFyc1RvQ2xhc3NwYXRoRW50cmllcygpOwotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGhFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIFN1YmxjYXNzZXMgaGF2ZSB0byBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgc2VydmVyIGphcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJKYXJzVG9DbGFzc3BhdGhFbnRyaWVzKCkgewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb2plY3QgaGFuZGxlIHdpdGggYSBzcGVjaWZpZWQgcGF0aC4gVGhlIHByb2plY3QgcmVzb3VyY2Ugc2hvdWxkIDxiPm5vdCA8L2I+IGJlCi0JICogY3JlYXRlZCBjb25jcmV0ZWx5IGhlcmU7Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3RIYW5kbGUoSVBhdGggcHJvamVjdFBhdGgpIHsKLQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3RQYXRoLnNlZ21lbnQoMCkpOwotCX0KLQotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlpZiAoY2xhc3NwYXRoRW50cmllcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUNsYXNzcGF0aEVudHJpZXMoKTsKLQkJcmV0dXJuIGNsYXNzcGF0aEVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDkvMDAgMTA6MDU6MjQgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRSb290KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKYXZhT3V0cHV0UGF0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSkFWQV9PVVRQVVRfUEFUSDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8wOS8wMCAxMDowNToyNCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0VXJpKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWUucmVwbGFjZSgnICcsICdfJykgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGphdmEgb3V0cHV0IGZvbGRlciBmb3IgdGhlIHJlY2VpdmVyLCBpbiB0aGUgZm9ybSBvZiAvcHJvamVjdC8gPG91dHB1dCBmb2xkZXI+Ci0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsSmF2YU91dHB1dFBhdGgoKSB7Ci0JCXJldHVybiBQYXRoLlJPT1QuYXBwZW5kKGdldFByb2plY3RQYXRoKCkpLmFwcGVuZChnZXRKYXZhT3V0cHV0UGF0aCgpKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbW9kdWxlIHBhdGggZm9sZGVyIGZvciB0aGUgcmVjZWl2ZXIgaW4gdGhlIGZvcm0gb2YgL3Byb2plY3QvbW9kdWxlcGF0aAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbFNvdXJjZVBhdGgoKSB7Ci0JCXJldHVybiBQYXRoLlJPT1QuYXBwZW5kKGdldFByb2plY3RQYXRoKCkpLmFwcGVuZChnZXRTb3VyY2VQYXRoKCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBqYXZhIGJ1aWxkIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SmF2YU91dHB1dFBhdGgoKSB7Ci0JCWlmIChqYXZhT3V0cHV0UGF0aCA9PSBudWxsKQotCQkJamF2YU91dHB1dFBhdGggPSBnZXREZWZhdWx0SmF2YU91dHB1dFBhdGgoKTsKLQkJcmV0dXJuIGphdmFPdXRwdXRQYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbihpbnQgdmVyc2lvbikgewotCQltb2R1bGVWZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkvLyBuZWVkZWQgdG8gZ2V0IGFuIElKYXZhUHJvamVjdCB0byBjcmVhdGUgY2xhc3NwYXRocyBmcm9tLgotCQlJUHJvamVjdCBhUHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQlhUHJvamVjdCA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGdldFByb2plY3ROYW1lKCkpOwotCi0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoYVByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGVmYXVsdCBqZGsgcnQuamFyIHRvIHVzZSBmb3IgdGhpcyBwcm9qZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SmRrUlRKYXJQYXRoKCkgewotCQlyZXR1cm4gamRrUlRKYXJQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdCBiZWluZyBjcmVhdGVkOyBjaGVja3MgdGhlIHdvcmtzcGFjZSBmb3IgYW4gZXhpc3RpbmcgcHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGdldFByb2plY3ROYW1lKCkpOwotCQkJaWYgKGFQcm9qZWN0LmV4aXN0cygpKQotCQkJCXByb2plY3QgPSBhUHJvamVjdDsKLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9qZWN0IGluIHRoZSBmaWxlIHN5c3RlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBwcm9qZWN0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDkvMDAgMTA6MDU6MjQgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsICYmIHByb2plY3QgIT0gbnVsbCkKLQkJCXByb2plY3ROYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aChnZXRQcm9qZWN0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemF0aW9uIC0gdXNlR2V0Q2xhc3NwYXRoRW50cmllcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlpZiAoc2hvdWxkSW5pdGlhbGl6ZURlZmF1bHRDbGFzc3BhdGgoKSkKLQkJCWNvbXB1dGVEZWZhdWx0SmF2YUNsYXNzcGF0aCgpOwotCQllbHNlCi0JCQljbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgZmFsc2UgYnkgZGVmYXVsdAotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gVXNlIGdldE1vZHVsZVZlcnNpb24oKSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKMkVFMTMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgcHJpbUdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZ2V0Q2xhc3NwYXRoRW50cmllcygpKSk7Ci0JCWxpc3QucmVtb3ZlKGVudHJ5KTsKLQkJY2xhc3NwYXRoRW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xMC8wMCAxMDowOTo1OCBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2xhc3NQYXRoRW50cmllcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuYXBpLklDbGFzc3BhdGhFbnRyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cmllcykgewotCQljbGFzc3BhdGhFbnRyaWVzID0gbmV3Q2xhc3NwYXRoRW50cmllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKYXZhT3V0cHV0UGF0aChTdHJpbmcgcGF0aCkgewotCQlqYXZhT3V0cHV0UGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmRrUlRKYXJQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWpka1JUSmFyUGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZSBzeXN0ZW0gdGhhdCB0aGUgcHJvamVjdCBpcyB0byBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm9qZWN0TG9jYXRpb24KLQkgKiAgICAgICAgICAgIElQYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdExvY2F0aW9uKElQYXRoIG5ld1Byb2plY3RMb2NhdGlvbikgewotCQlwcm9qZWN0TG9jYXRpb24gPSBuZXdQcm9qZWN0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDkvMDAgMTA6MDU6MjQgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2plY3ROYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdQcm9qZWN0TmFtZSkgewotCQlpZiAocHJvamVjdE5hbWUgIT0gbmV3UHJvamVjdE5hbWUpCi0JCQlzZXRDbGFzc3BhdGhFbnRyaWVzKG51bGwpOwotCQlwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3VsZEluaXRpYWxpemVEZWZhdWx0Q2xhc3NwYXRoKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2hvdWxkSW5pdGlhbGl6ZURlZmF1bHRDbGFzc3BhdGggPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbml0aWFsaXplRGVmYXVsdENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIHNob3VsZEluaXRpYWxpemVEZWZhdWx0Q2xhc3NwYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hdHVyZUlkLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmF0dXJlSWQoKSB7Ci0JCWlmIChuYXR1cmVJZCA9PSBudWxsKQotCQkJcmV0dXJuIGdldERlZmF1bHROYXR1cmVJZCgpOwotCQlyZXR1cm4gbmF0dXJlSWQ7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgY29ycmVjdCBuYXR1cmUgaWQgc3RyaW5nIGJhc2VkIG9uIHRoZSBKMkVFIHNwZWMgbGV2ZWwgYmVpbmcgdXNlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hdHVyZUlkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYXR1cmVJZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiAgICAgICAgICAgIFRoZSBuYXR1cmVJZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYXR1cmVJZChTdHJpbmcgbmF0dXJlSWQpIHsKLQkJdGhpcy5uYXR1cmVJZCA9IG5hdHVyZUlkOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29ycmVjdCBXQVMgY2xhc3NwYXRoIHZhcmlhYmxlIGJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXQVNQbHVnaW5WYXJpYWJsZSgpIHsKLQkJLy9UT0RPIFRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgZGVsZXRlZC4KLQkJLy8JaWYgKGlzSjJFRTEzKCkKLQkJLy8JCXx8ICFvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5oYXNEZXZlbG9wbWVudFJvbGUoKSkKLQkJLy8JCXJldHVybiBJRUpCTmF0dXJlQ29uc3RhbnRzLldBU181MF9QTFVHSU5ESVJfVkFSSUFCTEU7Ci0JCS8vCWVsc2UKLQkJLy8JCXJldHVybiBJRUpCTmF0dXJlQ29uc3RhbnRzLldBU19QTFVHSU5ESVJfVkFSSUFCTEU7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbigpIHsKLQkJcmV0dXJuIG1vZHVsZVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRTZXJ2ZXJUYXJnZXQoKSB7Ci0JCXJldHVybiBzZXJ2ZXJUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclRhcmdldChJUnVudGltZSB0YXJnZXQpIHsKLQkJc2VydmVyVGFyZ2V0ID0gdGFyZ2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRVByb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRVByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyNzU0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVQcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgSjJFRVByb2plY3RVdGlsaXRpZXMgZXh0ZW5kcyBQcm9qZWN0VXRpbGl0aWVzIGltcGxlbWVudHMgSUoyRUVGYWNldENvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgYSBsb29zZSBhcmNoaXZlIGluIGEgSjJFRSBhcHBsaWNhdGlvbiBvciBXQVIgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UnVudGltZUxvY2F0aW9uKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChKZW1Qcm9qZWN0VXRpbGl0aWVzLmlzQmluYXJ5UHJvamVjdChhUHJvamVjdCkpCi0JCQlyZXR1cm4gZ2V0QmluYXJ5UHJvamVjdEpBUkxvY2F0aW9uKGFQcm9qZWN0KTsKLQkJcmV0dXJuIEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3RPdXRwdXRBYnNvbHV0ZUxvY2F0aW9uKGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEJpbmFyeVByb2plY3RKQVJMb2NhdGlvbihJUHJvamVjdCBhUHJvamVjdCkgewotCQlMaXN0IHNvdXJjZXMgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldExvY2FsSkFSUGF0aHNGcm9tQ2xhc3NwYXRoKGFQcm9qZWN0KTsKLQkJaWYgKCFzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgc291cmNlcy5nZXQoMCk7Ci0JCQlyZXR1cm4gYVByb2plY3QuZ2V0RmlsZShwYXRoKS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZSBnZXRDbGllbnRKQVIoRUpCSmFyRmlsZSBmaWxlLCBFQVJGaWxlIGVhckZpbGUpIHsKLQkJRUpCSmFyIGphciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXIgPSBmaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0gY2F0Y2ggKERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChqYXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY2xpZW50SkFSID0gamFyLmdldEVqYkNsaWVudEphcigpOwotCQlpZiAoY2xpZW50SkFSID09IG51bGwgfHwgY2xpZW50SkFSLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5vcm1hbGl6ZWQgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjbGllbnRKQVIsIGZpbGUuZ2V0VVJJKCkpOwotCQlpZiAobm9ybWFsaXplZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUZpbGUgYUZpbGUgPSBlYXJGaWxlLmdldEZpbGUobm9ybWFsaXplZCk7Ci0JCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpICYmICFhRmlsZS5pc01vZHVsZUZpbGUoKSkKLQkJCQkJcmV0dXJuIChBcmNoaXZlKSBhRmlsZTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub3RoaW5nVGhlcmUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gVE9ETyAtIHJlbGVhc2UgdGhlIEREIGhlcmUgdG8gZnJlZSB1cCBzcGFjZQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBvbmUgSUNsYXNzcGF0aEVudHJ5IHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwYXNzZWQgcHJvamVjdC4gSWYgYSBjbGFzc3BhdGggZW50cnkKLQkgKiBoYXZpbmcgdGhlIHNhbWUgcGF0aCBhcyB0aGUgcGFyYW1ldGVyIGFscmVhZHkgZXhpc3RzLCB0aGVuIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUxpc3QgbmV3UGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJLy8gZml4IGR1cCBjbGFzcyBwYXRoIGVudHJ5IGZvciAuSkVURW1pdHRlciBwcm9qZWN0Ci0JCQkvLyBTa2lwIHRoZSBlbnRyeSB0byBiZSBhZGRlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLk9TX1dJTjMyKSkgewotCQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhuZXdFbnRyeS5nZXRQYXRoKCkpKQotCQkJCQluZXdQYXRoTGlzdC5hZGQoZW50cnkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCW5ld1BhdGhMaXN0LmFkZChuZXdFbnRyeSk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbmV3UGF0aExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld1BhdGhMaXN0LnNpemUoKV0pOwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmUgYXNBcmNoaXZlRnJvbUJpbmFyeShTdHJpbmcgamFyVXJpLCBJUHJvamVjdCBhUHJvamVjdCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IGdldEJpbmFyeVByb2plY3RKQVJMb2NhdGlvbihhUHJvamVjdCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZShsb2NhdGlvbik7Ci0JCQlhbkFyY2hpdmUuc2V0VVJJKGphclVyaSk7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IHJlYWRNYW5pZmVzdChJRmlsZSBhRmlsZSkgewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoYUZpbGUgPT0gbnVsbCB8fCAhYUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbiA9IGFGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IHJlYWRNYW5pZmVzdChJUHJvamVjdCBwKSB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlGaWxlIGFGaWxlID0gZ2V0TWFuaWZlc3RGaWxlKHApOwotCQkJaWYgKGFGaWxlID09IG51bGwgfHwgIWFGaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQkJaW4gPSBhRmlsZS5nZXRDb250ZW50cygpOwotCQkJcmV0dXJuIG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHdlVHJpZWQpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFcXVhdmFsZW50IHRvIGNhbGxpbmcgZ2V0TWFuaWZlc3RGaWxlKHByb2plY3QsIHRydWUpCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRNYW5pZmVzdEZpbGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0TWFuaWZlc3RGaWxlKHByb2plY3QsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElGaWxlIGhhbmRsZSB0byB0aGUgSjJFRSBtYW5pZmVzdCBmaWxlIGZvciB0aGUgc3BlY2lmaWVkCi0JICogcHJvamVjdC4gSWYgY3JlYXRlSWZOZWNlc3NhcnkgaXMgdHJ1ZSwgdGhlIE1BTklGRVNULk1GIGZpbGUgd2lsbCBiZQotCSAqIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBjcmVhdGVJZk5lY2Vzc2FyeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldE1hbmlmZXN0RmlsZShJUHJvamVjdCBwLCBib29sZWFuIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kRmlsZShjb21wb25lbnQsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlpZiAoY3JlYXRlSWZOZWNlc3NhcnkgJiYgZmlsZSA9PSBudWxsKSB7Ci0JCQkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQkJZmlsZSA9IHZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCU1hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uLmNyZWF0ZU1hbmlmZXN0RmlsZShmaWxlLCBwKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZpbGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU1hbmlmZXN0KElQcm9qZWN0IGFQcm9qZWN0LCBBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJd3JpdGVNYW5pZmVzdChhUHJvamVjdCwgZ2V0TWFuaWZlc3RGaWxlKGFQcm9qZWN0KSwgbWFuaWZlc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU1hbmlmZXN0KElGaWxlIGFGaWxlLCBBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJd3JpdGVNYW5pZmVzdChhRmlsZS5nZXRQcm9qZWN0KCksIGFGaWxlLCBtYW5pZmVzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU1hbmlmZXN0KElQcm9qZWN0IGFQcm9qZWN0LCBJRmlsZSBhRmlsZSwgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQlpZihTaW1wbGVWYWxpZGF0ZUVkaXQudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgYUZpbGUgfSkpewotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGFGaWxlKTsKLQkJCQltYW5pZmVzdC53cml0ZVNwbGl0dGluZ0NsYXNzcGF0aChvdXQpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVNb2R1bGUoYVByb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IHJlYWRNYW5pZmVzdChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJSVZpcnR1YWxGaWxlIHZNYW5pZmVzdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQlpZiAodk1hbmlmZXN0LmV4aXN0cygpKSB7Ci0JCQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gdk1hbmlmZXN0LmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCXJldHVybiBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJaW4gPSBudWxsOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJCXRyeXsKLQkJCQloZWxwZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7Ci0JCQkJaWYoaGVscGVyICE9IG51bGwpewotCQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJCQl0cnl7Ci0JCQkJCQlhcmNoaXZlID0gaGVscGVyLmFjY2Vzc0FyY2hpdmUoKTsKLQkJCQkJCWlmKG51bGwgIT0gYXJjaGl2ZSl7Ci0JCQkJCQkJSVBhdGggbWFuaWZlc3RQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCQkJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKSl7Ci0JCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgbWFuaWZlc3RSZXNvdXJjZSA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7Ci0JCQkJCQkJCWlmKG1hbmlmZXN0UmVzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJCQkJCQlpbiA9IG1hbmlmZXN0UmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJCQkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJCQkJCQkJCXJldHVybiBtYW5pZmVzdDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseXsKLQkJCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCQkJaW4gPSBudWxsOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihhcmNoaXZlICE9IG51bGwpewotCQkJCQkJCWhlbHBlci5yZWxlYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseXsKLQkJCQlpZihoZWxwZXIgIT0gbnVsbCl7Ci0JCQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBLZXlzIGFyZSB0aGUgRUpCIEpBUiBmaWxlcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIHJlc3BlY3RpdmUgY2xpZW50IEpBUnM7IGluY2x1ZGVzIG9ubHkga2V5Ci0JICogdmFsdWUgcGFpcnMgZm9yIHdoaWNoIEVKQiBDbGllbnQgSkFScyBhcmUgZGVmaW5lZCBhbmQgZXhpc3QuCi0JICogCi0JICogQGF1dGhvciBzY2hhY2hlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNvbGxlY3RFSkJDbGllbnRKQVJzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlpZiAoZWFyRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJTWFwIGVqYkNsaWVudEpBUnMgPSBudWxsOwotCQlMaXN0IGVqYkpBUkZpbGVzID0gZWFyRmlsZS5nZXRFSkJKYXJGaWxlcygpOwotCQlBcmNoaXZlIGNsaWVudEpBUiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWpiSkFSRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlamJKQVJGaWxlcy5nZXQoaSk7Ci0JCQljbGllbnRKQVIgPSBnZXRDbGllbnRKQVIoZWpiSmFyRmlsZSwgZWFyRmlsZSk7Ci0JCQlpZiAoY2xpZW50SkFSICE9IG51bGwpIHsKLQkJCQlpZiAoZWpiQ2xpZW50SkFScyA9PSBudWxsKQotCQkJCQllamJDbGllbnRKQVJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQllamJDbGllbnRKQVJzLnB1dChlamJKYXJGaWxlLCBjbGllbnRKQVIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlamJDbGllbnRKQVJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9NQVAgOiBlamJDbGllbnRKQVJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVRleHQoU3RyaW5nIHJlZmVyZW5jaW5nVVJJLCBTdHJpbmcgcmVmZXJlbmNlZFVSSSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGJlYW5OYW1lID0gYmVhbi5nZXROYW1lKCk7Ci0JCWlmIChiZWFuTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHJlbGF0aXZlVXJpID0gY29tcHV0ZVJlbGF0aXZlVGV4dChyZWZlcmVuY2luZ1VSSSwgcmVmZXJlbmNlZFVSSSk7Ci0JCWlmIChyZWxhdGl2ZVVyaSA9PSBudWxsKQotCQkJcmV0dXJuIGJlYW5OYW1lOwotCQlyZXR1cm4gcmVsYXRpdmVVcmkgKyAiIyIgKyBiZWFuTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVRleHQoU3RyaW5nIHJlZmVyZW5jaW5nVVJJLCBTdHJpbmcgcmVmZXJlbmNlZFVSSSkgewotCQlpZiAocmVmZXJlbmNpbmdVUkkgPT0gbnVsbCB8fCByZWZlcmVuY2VkVVJJID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhdGggcFByZSA9IG5ldyBQYXRoKHJlZmVyZW5jaW5nVVJJKTsKLQkJSVBhdGggcERlcCA9IG5ldyBQYXRoKHJlZmVyZW5jZWRVUkkpOwotCQlpZiAocFByZS5nZXREZXZpY2UoKSAhPSBudWxsIHx8IHBEZXAuZ2V0RGV2aWNlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlwUHJlID0gcFByZS5tYWtlUmVsYXRpdmUoKTsKLQkJcERlcCA9IHBEZXAubWFrZVJlbGF0aXZlKCk7IC8vIHJlZmVyZW5jZWQgQXJjaGl2ZSBwYXRoIFVSSQotCi0JCXdoaWxlIChwUHJlLnNlZ21lbnRDb3VudCgpID4gMSAmJiBwRGVwLnNlZ21lbnRDb3VudCgpID4gMSAmJiBwUHJlLnNlZ21lbnQoMCkuZXF1YWxzKHBEZXAuc2VnbWVudCgwKSkpIHsKLQkJCXBQcmUgPSBwUHJlLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQlwRGVwID0gcERlcC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQl9Ci0KLQkJSVBhdGggcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHNlZ21lbnQgPSBudWxsOwotCQlkbyB7Ci0JCQlzZWdtZW50ID0gcERlcC5sYXN0U2VnbWVudCgpOwotCQkJcFByZSA9IHBQcmUucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJcERlcCA9IHBEZXAucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJaWYgKHNlZ21lbnQgIT0gbnVsbCkgewotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gbmV3IFBhdGgoc2VnbWVudCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQgPSBuZXcgUGF0aChzZWdtZW50KS5hcHBlbmQocmVzdWx0KTsKLQkJCX0KLQkJCWlmICghcFByZS5lcXVhbHMocERlcCkgJiYgIXBQcmUuaXNFbXB0eSgpKQotCQkJCWJ1Zi5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCX0gd2hpbGUgKCFwUHJlLmVxdWFscyhwRGVwKSk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJYnVmLmFwcGVuZChyZXN1bHQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0RUpCUHJvamVjdEZyb21FSkJDbGllbnRQcm9qZWN0KElQcm9qZWN0IGVqYkNsaWVudFByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChudWxsICE9IGVqYkNsaWVudFByb2plY3QgJiYgZWpiQ2xpZW50UHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG51bGwgIT0gRWFyTW9kdWxlTWFuYWdlci5nZXRFSkJNb2R1bGVFeHRlbnNpb24oKS5nZXRFSkJKYXIoYWxsUHJvamVjdHNbaV0pKSB7Ci0JCQkJCQlpZiAoZWpiQ2xpZW50UHJvamVjdCA9PSBFYXJNb2R1bGVNYW5hZ2VyLmdldEVKQk1vZHVsZUV4dGVuc2lvbigpLmdldERlZmluZWRFSkJDbGllbnRKQVJQcm9qZWN0KGFsbFByb2plY3RzW2ldKSkgewotCQkJCQkJCXJldHVybiBhbGxQcm9qZWN0c1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbihJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBjdS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJRUpCSmFyIGphciA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCkuZ2V0RUpCSmFyKHByb2opOwotCQlpZiAobnVsbCA9PSBqYXIpIHsKLQkJCWphciA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCkuZ2V0RUpCSmFyKGdldEVKQlByb2plY3RGcm9tRUpCQ2xpZW50UHJvamVjdChwcm9qKSk7Ci0JCX0KLQkJaWYgKGphciAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBjdS5nZXRFbGVtZW50TmFtZSgpLmluZGV4T2YoJy4nKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBjdS5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKGluZGV4ID4gMCkKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSwgY2xhc3NOYW1lLCBqYXIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQlyZXR1cm4gamFyLmdldEVudGVycHJpc2VCZWFuV2l0aFJlZmVyZW5jZShqYXZhQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRTb3VyY2VGb2xkZXJPckZpcnN0KElQcm9qZWN0IHAsIFN0cmluZyBkZWZhdWx0U291cmNlTmFtZSkgewotCQl0cnkgewotCQkJSVBhdGggc291cmNlUGF0aCA9IGdldFNvdXJjZVBhdGhPckZpcnN0KHAsIGRlZmF1bHRTb3VyY2VOYW1lKTsKLQkJCWlmIChzb3VyY2VQYXRoID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlIGlmIChzb3VyY2VQYXRoLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gcDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcC5nZXRGb2xkZXIoc291cmNlUGF0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQnVpbGRlcnMoSVByb2plY3QgcHJvamVjdCwgTGlzdCBidWlsZGVyaWRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSUNvbW1hbmRbXSBvbGRTcGVjID0gZGVzYy5nZXRCdWlsZFNwZWMoKTsKLQkJaW50IG9sZExlbmd0aCA9IG9sZFNwZWMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWludCByZW1haW5pbmcgPSAwOwotCQkvLyBudWxsIG91dCBhbGwgY29tbWFuZHMgdGhhdCBtYXRjaCB0aGUgYnVpbGRlciB0byByZW1vdmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTcGVjLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYnVpbGRlcmlkcy5jb250YWlucyhvbGRTcGVjW2ldLmdldEJ1aWxkZXJOYW1lKCkpKQotCQkJCW9sZFNwZWNbaV0gPSBudWxsOwotCQkJZWxzZQotCQkJCXJlbWFpbmluZysrOwotCQl9Ci0JCS8vIGNoZWNrIGlmIGFueSB3ZXJlIGFjdHVhbGx5IHJlbW92ZWQKLQkJaWYgKHJlbWFpbmluZyA9PSBvbGRTcGVjLmxlbmd0aCkKLQkJCXJldHVybjsKLQkJSUNvbW1hbmRbXSBuZXdTcGVjID0gbmV3IElDb21tYW5kW3JlbWFpbmluZ107Ci0JCWZvciAoaW50IGkgPSAwLCBuZXdJbmRleCA9IDA7IGkgPCBvbGRMZW5ndGg7IGkrKykgewotCQkJaWYgKG9sZFNwZWNbaV0gIT0gbnVsbCkKLQkJCQluZXdTcGVjW25ld0luZGV4KytdID0gb2xkU3BlY1tpXTsKLQkJfQotCQlkZXNjLnNldEJ1aWxkU3BlYyhuZXdTcGVjKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBJUmVzb3VyY2UuTk9ORSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTb3VyY2VQYXRoT3JGaXJzdChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwKTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBudWxsOwotCQl0cnkgewotCQkJY3AgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeSBmaXJzdFNvdXJjZSA9IG51bGw7Ci0JCUlQYXRoIGRlZmF1bHRTb3VyY2VQYXRoID0gbnVsbDsKLQkJaWYgKGRlZmF1bHRTb3VyY2VOYW1lICE9IG51bGwpCi0JCQlkZWZhdWx0U291cmNlUGF0aCA9IGNyZWF0ZVBhdGgocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCS8vIGNoZWNrIGlmIGl0IGNvbnRhaW5zIC9NRVRBLUlORi9NQU5JRkVTVC5NRgotCQkJCUlQYXRoIHNvdXJjZUZvbGRlclBhdGggPSBjcFtpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQlJRm9sZGVyIHNvdXJjZUZvbGRlciA9IHAuZ2V0Rm9sZGVyKHNvdXJjZUZvbGRlclBhdGgpOwotCQkJCWlmIChpc1NvdXJjZUZvbGRlckFuSW5wdXRDb250YWluZXIoc291cmNlRm9sZGVyKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWlmIChmaXJzdFNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCQlmaXJzdFNvdXJjZSA9IGNwW2ldOwotCQkJCQkJaWYgKGRlZmF1bHRTb3VyY2VQYXRoID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGNwW2ldLmdldFBhdGgoKS5lcXVhbHMoZGVmYXVsdFNvdXJjZVBhdGgpKQotCQkJCQkJcmV0dXJuIGRlZmF1bHRTb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZm91bmQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJaWYgKGZpcnN0U291cmNlID09IG51bGwpIHsKLQkJCQkJCWZpcnN0U291cmNlID0gY3BbaV07Ci0JCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCi0JCQkJCQlyZXR1cm4gZGVmYXVsdFNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpcnN0U291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZpcnN0U291cmNlLmdldFBhdGgoKS5zZWdtZW50KDApLmVxdWFscyhwLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmlyc3RTb3VyY2UuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NvdXJjZUZvbGRlckFuSW5wdXRDb250YWluZXIoSUZvbGRlciBzb3VyY2VGb2xkZXIpIHsKLQkJSUNvbnRhaW5lciBwYXJlbnQgPSBzb3VyY2VGb2xkZXI7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCWJyZWFrOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHBhcmVudDsKLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5maW5kTWVtYmVyKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSkgIT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gc291cmNlRm9sZGVyLmZpbmRNZW1iZXIoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSkgIT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZmluZE1lbWJlcihKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpICE9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGlzSkNBUHJvamVjdChwcm9qZWN0KSkgewotCQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZmluZE1lbWJlcihKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpICE9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmUgYXNBcmNoaXZlKFN0cmluZyBqYXJVcmksIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZXhwb3J0U291cmNlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gYXNBcmNoaXZlKGphclVyaSwgcHJvamVjdCwgZXhwb3J0U291cmNlLCB0cnVlKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFyY2hpdmUgYXNBcmNoaXZlKFN0cmluZyBqYXJVcmksIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZXhwb3J0U291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBzdHJhdCA9IG5ldyBKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KSwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCQlzdHJhdC5zZXRFeHBvcnRTb3VyY2UoZXhwb3J0U291cmNlKTsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKHN0cmF0LCBqYXJVcmkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlEKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsdHlwZUlEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHJvamVjdE9mVHlwZShJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VBUlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBEWU5BTUlDX1dFQik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VKQlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBFSkIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKQ0FQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSkNBKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgQVBQTElDQVRJT05fQ0xJRU5UKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXRpbGl0eVByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBVVElMSVRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljV2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQoY29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdGljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQoY29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pDQUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FDb21wb25lbnQoY29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSkNBUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoY29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1V0aWxpdHlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhbmRhbG9uZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHJlZmVyZW5jaW5nIEVBUiBwcm9qZWN0cy4KLQkgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0IHRvIGNoZWNrLiBJZiBudWxsIG9yIGFuIEVBUiwgcmV0dXJucyBhIHplcm8gbGVuZ3RoIGFycmF5LgotCSAqIEByZXR1cm4gQXJyYXkgb2YgcmVmZXJlbmNpbmcgRUFSIHByb2plY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYocHJvamVjdCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlyZXR1cm4gbmV3IElQcm9qZWN0W10ge3Byb2plY3R9OwotCQl9Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSByZWZDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzRUFSUHJvamVjdChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSkpCi0JCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgcmVmZXJlbmNpbmcgZHluYW1pYyB3ZWIgcHJvamVjdHMuCi0JICogQHBhcmFtIHByb2plY3QgUHJvamVjdCB0byBjaGVjay4gSWYgbnVsbCBvciBhIGR5bmFtaWMgd2ViIHByb2plY3QsIHJldHVybnMgYSB6ZXJvIGxlbmd0aCBhcnJheS4KLQkgKiBAcmV0dXJuIEFycmF5IG9mIHJlZmVyZW5jaW5nIGR5bmFtaWMgd2ViIHByb2plY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ1dlYlByb2plY3RzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYocHJvamVjdCAhPSBudWxsICYmIGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewotCQkJcmV0dXJuIG5ldyBJUHJvamVjdFtdIHtwcm9qZWN0fTsKLQkJfQotCQkKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gcmVmQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHJlZkNvbXBvbmVudHNbaV0uZ2V0UHJvamVjdCgpKSkKLQkJCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2plY3RbcmVzdWx0LnNpemUoKV0pOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHByb2plY3RzIGluIHdvcmtzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSAtCi0JICogICAgICAgICAgICB1c2Ugb25lIG9mIHRoZSBzdGF0aWMgc3RyaW5ncyBvbiB0aGlzIGNsYXNzIGFzIGEgdHlwZQotCSAqIEByZXR1cm4gSVByb2plY3RbXQotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzSW5Xb3Jrc3BhY2VPZlR5cGUoU3RyaW5nIHR5cGUpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxQcm9qZWN0c0luV29ya3NwYWNlT2ZUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzSW5Xb3Jrc3BhY2VPZlR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBzZWUge0BsaW5rIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFQ29tcG9uZW50VHlwZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUoY29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUoSVByb2plY3QgcHJvamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRVByb2plY3RUeXBlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2plY3QpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKMkVFIE1vZHVsZSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSBERCBYTUwgZmlsZQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB2ZXJzaW9uIFN0cmluZwotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVERFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVERFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUREUHJvamVjdFZlcnNpb24ocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRTZXJ2ZXJSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZSA9IGZhY2V0ZWRQcm9qZWN0LmdldFJ1bnRpbWUoKTsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRmFjZXRVdGlsLmdldFJ1bnRpbWUocnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSjJFRSBNb2R1bGUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgcHJvamVjdCBGYWNldCBpbnN0YWxsZWQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdmVyc2lvbiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgdHlwZSA9IGdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJSVByb2plY3RGYWNldCBmYWNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gTm90IEZhY2V0ZWQgcHJvamVjdCBvciBub3QgSjJFRSBQcm9qZWN0Ci0JCX0KLQkJaWYgKGZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkKLQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKGZhY2V0KS5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24gY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24gY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFkZFRvRUFSKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgYWRkVG9FQVIpOwotCQlyZXR1cm4gbmV3IEphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSBhbGwgdGhlIHNvdXJjZSBjb250YWluZXJzIGZvciBhIGdpdmVuIHZpcnR1YWwgd29ya2JlbmNoIGNvbXBvbmVudAotCSAqIAotCSAqIEBwYXJhbSB2YwotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIElQYWNrYWdlRnJhZ21lbnRSb290cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGpQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHM7Ci0JCXRyeSB7Ci0JCQlyb290cyA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkKLQkJCQkJY29udGludWU7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdHNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAobnVsbCAhPSByZXNvdXJjZSkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCB2UmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAodlJlc291cmNlc1tqXS5nZXRDb21wb25lbnQoKS5lcXVhbHModmMpKSB7Ci0JCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHJvb3RzW2ldKSkKLQkJCQkJCQkJbGlzdC5hZGQocm9vdHNbaV0pOwotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnRSb290W10pIGxpc3QudG9BcnJheShuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBJQ29udGFpbmVycyBmb3IgYWxsIEphdmEgb3V0cHV0IGZvbGRlcnMgdGhhdCBjb3JyZXNwb25kIHRvIHNyYyBmb2xkZXJzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUKLQkgKiB2aXJ0dWFsIGNvbXBvbmVudCB0cmVlIHZpYSB0aGUgY29tcG9uZW50IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHZjCi0JICogQHJldHVybiBhcnJheSBvZiBJQ29udGFpbmVycyBmb3IgdGhlIG91dHB1dCBmb2xkZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0T3V0cHV0Q29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotCQkJCXJldHVybiBuZXcgSUNvbnRhaW5lcltdIHt9OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlQ29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlQ29udGFpbmVycy5sZW5ndGg7IGkrKykgewotCQkJSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSBnZXRPdXRwdXRDb250YWluZXIocHJvamVjdCwgc291cmNlQ29udGFpbmVyc1tpXSk7Ci0JCQlpZiAob3V0cHV0Rm9sZGVyICE9IG51bGwgJiYgIXJlc3VsdC5jb250YWlucyhvdXRwdXRGb2xkZXIpKQotCQkJCXJlc3VsdC5hZGQob3V0cHV0Rm9sZGVyKTsKLQkJfQotCQlyZXR1cm4gKElDb250YWluZXJbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb250YWluZXJbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRPdXRwdXRDb250YWluZXIoSVByb2plY3QgcHJvamVjdCwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlQ29udGFpbmVyKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgalByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlJUGF0aCBvdXRwdXRQYXRoID0gc291cmNlQ29udGFpbmVyLmdldFJhd0NsYXNzcGF0aEVudHJ5KCkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCWlmIChvdXRwdXRQYXRoID09IG51bGwpIHsKLQkJCQlpZiAoalByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSA9PSAxKQotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQlyZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIoalByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJCXJldHVybiBwcm9qZWN0LmdldEZvbGRlcihvdXRwdXRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIGFsbCBKYXZhIG91dHB1dCBjb250YWluZXJzIG1hcHBlZCBpbnRvIHRoZSB2aXJ0dWFsIHJlc291cmNlIHRyZWUgdmlhIHRoZSBjb21wb25lbnQgZmlsZS4gSW5jbHVkZXMgYm90aCBkaXJlY3RseQotCSAqIG1hcHBlZCBjbGFzcyBmb2xkZXJzIGFuZCB0aGUgY2xhc3MgZm9sZGVycyBhc3NvY2lhdGVkIHdpdGggbWFwcGVkIHNvdXJjZSBmb2xkZXJzLgotCSAqIAotCSAqIEBwYXJhbSB2YwotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIElQYWNrYWdlRnJhZ21lbnRSb290cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lcltdIGdldEFsbE91dHB1dENvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgalByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoalByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbnRhaW5lclswXTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGFpbmVyW10gc3JjT3V0cHV0Q29udGFpbmVycyA9IGdldE91dHB1dENvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjT3V0cHV0Q29udGFpbmVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdC5hZGQoc3JjT3V0cHV0Q29udGFpbmVyc1tpXSk7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290czsKLQkJdHJ5IHsKLQkJCXJvb3RzID0galByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocm9vdHNbaV0uZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKQotCQkJCQljb250aW51ZTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290c1tpXS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChudWxsICE9IHJlc291cmNlKSB7Ci0JCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2UmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMocmVzb3VyY2UpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyAhZm91bmQgJiYgaiA8IHZSZXNvdXJjZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmICh2UmVzb3VyY2VzW2pdLmdldENvbXBvbmVudCgpLmVxdWFscyh2YykpIHsKLQkJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQkJCQlpZiAoIWxpc3QuY29udGFpbnMob3V0cHV0Q29udGFpbmVyKSkgewotCQkJCQkJCQkJbGlzdC5hZGQob3V0cHV0Q29udGFpbmVyKTsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gKElDb250YWluZXJbXSkgbGlzdC50b0FycmF5KG5ldyBJQ29udGFpbmVyW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQGRlc2NyaXB0aW9uIHRoZSBwYXNzZWQgbmFtZSBzaG91bGQgaGF2ZSBlaXRoZXIgbGliIG9yIHZhciBhcyBpdHMgZmlyc3Qgc2VnbWVudCBlLmcuCi0JICogICAgICAgICAgICAgIGxpYi9EOi9mb28vZm9vLmphciBvciB2YXIvPENMQVNTUEFUSFZBUj4vZm9vLmphcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVzb2x2ZWRQYXRoRm9yQXJjaGl2ZUNvbXBvbmVudChTdHJpbmcgbmFtZSkgewotCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG5hbWUpOwotCi0JCVN0cmluZyByZXNvdXJjZVR5cGUgPSB1cmkuc2VnbWVudCgwKTsKLQkJVVJJIGNvbnRlbnR1cmkgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub1JlbGF0aXZlUGF0aCh1cmksIDEpOwotCQlTdHJpbmcgY29udGVudE5hbWUgPSBjb250ZW50dXJpLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoImxpYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG1vZHVsZTovY2xhc3NwYXRoL2xpYi9EOi9mb28vZm9vLmphcgotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGNvbnRlbnROYW1lKTsKLQotCQl9IGVsc2UgaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoInZhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kdWxlOi9jbGFzc3BhdGgvdmFyLzxDTEFTU1BBVEhWQVI+L2Zvby5qYXIKLQkJCVN0cmluZyBjbGFzc3BhdGhWYXIgPSBjb250ZW50dXJpLnNlZ21lbnQoMCk7Ci0JCQlVUkkgcmVtYWluaW5nUGF0aHVyaSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvUmVsYXRpdmVQYXRoKGNvbnRlbnR1cmksIDEpOwotCQkJU3RyaW5nIHJlbWFpbmluZ1BhdGggPSByZW1haW5pbmdQYXRodXJpLnRvU3RyaW5nKCk7Ci0KLQkJCVN0cmluZ1tdIGNsYXNzcGF0aHZhcnMgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZU5hbWVzKCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2xhc3NwYXRoVmFyLmVxdWFscyhjbGFzc3BhdGh2YXJzW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCUlQYXRoIHBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShjbGFzc3BhdGhWYXIpOwotCQkJCWlmIChwYXRoICE9IG51bGwgKXsKLQkJCQkJVVJJIGZpbmFsdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoLnRvT1NTdHJpbmcoKSArIElQYXRoLlNFUEFSQVRPUiArIHJlbWFpbmluZ1BhdGgpOwotCQkJCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZmluYWx1cmkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxKYXZhTm9uRmxleFByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IG5vbkZsZXhKYXZhUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSAmJiBwcm9qZWN0c1tpXS5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSAmJiAhcHJvamVjdHNbaV0uaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQlub25GbGV4SmF2YVByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vbkZsZXhKYXZhUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgY29udGV4dCByb290IGZvciB0aGUgYXNzb2NpYXRlZCB3b3JrYmVuY2ggbW9kdWxlIHdoaWNoIGlzIHVzZWQKLQkgKiBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuIFRoaXMgbWV0aG9kIGlzIG5vdCB5ZXQgY29tcGxldGVkIGFzIHRoZSBjb250ZXh0IHJvb3QgaGFzIHRvIGJlCi0JICogYWJzdHJhY3RlZCBhbmQgYWRkZWQgdG8gdGhlIHdvcmtiZW5jaE1vZHVsZSBtb2RlbC4gVGhpcyBBUEkgd2lsbCBub3QgY2hhbmdlIHRob3VnaC4gUmV0dXJucwotCSAqIG51bGwgZm9yIG5vdy4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgY29udGV4dCByb290IGZvciBydW50aW1lIG9mIHRoZSBhc3NvY2lhdGVkIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIENvbXBvbmVudFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgY29udGV4dCByb290IG9uIHRoZSBhc3NvY2lhdGVkIHdvcmtiZW5jaCBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBzdHJpbmcgdmFsdWUgcGFzc2VkIGluLiBUaGlzIGNvbnRleHQgcm9vdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZS4gVGhpcyBtZXRob2QgaXMKLQkgKiBub3QgeWV0IGNvbXBsZXRlZCBhcyB0aGUgY29udGV4dCByb290IHN0aWxsIG5lZWRzIHRvIGJlIGFic3RyYWN0ZWQgYW5kIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkgKiBtb2R1bGUgbW9kZWwuIFRoaXMgQVBJIHdpbGwgbm90IGNoYW5nZSB0aG91Z2guIERvZXMgbm90aGluZyBhcyBvZiBub3cuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRSb290Ci0JICogICAgICAgICAgICBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCUNvbXBvbmVudFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0LCBjb250ZXh0Um9vdCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0cnVlLCBpZiBqZWUgdmVyc2lvbiA1LjAgb3IgbGF0ZXIgKG9yIHRoZWlyIHJlc3BlY3RpdmUgZWpiLCB3ZWIsIGFwcCB2ZXJzaW9ucykKLQkgKiAsIGl0IG11c3QgYmUgbm90ZWQgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IGxvb2tzIGF0IHRoZSBmYWNldCAmIHRoZWlyIHZlcnNpb25zIHRvIGRldGVybWluZSAKLQkgKiB0aGUgamVlIGxldmVsLiBJdCBkb2VzIG5vdCByZWFkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSkVFUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KXsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJCi0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYoaXNFQVJQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKEVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpOwotCQkJCXJldCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGZ2LmdldFZlcnNpb25TdHJpbmcoKSkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCX0gZWxzZSBpZihpc0R5bmFtaWNXZWJQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKERZTkFNSUNfV0VCX0ZBQ0VUKTsKLQkJCQlyZXQgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoZnYuZ2V0VmVyc2lvblN0cmluZygpKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJfSBlbHNlIGlmKGlzRUpCUHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihFSkJfRkFDRVQpOwotCQkJCXJldCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChmdi5nZXRWZXJzaW9uU3RyaW5nKCkpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCQl9IGVsc2UgaWYoaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoZmFjZXRlZFByb2plY3QpKXsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VUKTsKLQkJCQlyZXQgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoZnYuZ2V0VmVyc2lvblN0cmluZygpKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJfSBlbHNlIGlmIChpc0pDQVByb2plY3QoZmFjZXRlZFByb2plY3QpKXsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oSkNBX0ZBQ0VUKTsKLQkJCQlyZXQgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydENvbm5lY3RvclZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoZnYuZ2V0VmVyc2lvblN0cmluZygpKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUsIGlmIGoyZWUgdmVyc2lvbiAxLjIsIDEuMywgMS40IChvciB0aGVpciByZXNwZWN0aXZlIGVqYiwgd2ViLCBhcHAgdmVyc2lvbnMpCi0JICogLCBpdCBtdXN0IGJlIG5vdGVkIHRoYXQgdGhpcyBtZXRob2Qgb25seSBsb29rcyBhdCB0aGUgZmFjZXQgJiB0aGVpciB2ZXJzaW9ucyB0byBkZXRlcm1pbmUgCi0JICogdGhlIGoyZWUgbGV2ZWwuIEl0IGRvZXMgbm90IHJlYWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lKMkVFUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KXsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJCi0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZihpc0VBUlByb2plY3QoZmFjZXRlZFByb2plY3QpKXsKLQkJCQlJUHJvamVjdEZhY2V0IGVhckZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpOwotCQkJCXJldCA9IChmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZWFyRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGVhckZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKSkKLQkJCQkJCXx8IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChlYXJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSkpCi0JCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNEeW5hbWljV2ViUHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgd2ViRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSk7Ci0JCQkJcmV0ID0gKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldCh3ZWJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0SjJFRVZlcnNpb25JRFRvV2ViVmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHdlYkZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9XZWJWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQod2ViRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb1dlYlZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNFSkJQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldCBlamJGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKTsKLQkJCQlyZXQgPSAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGVqYkZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9FSkJWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZWpiRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb0VKQlZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKSkKLQkJCQkJCXx8IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChlamJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0SjJFRVZlcnNpb25JRFRvRUpCVmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSkpKQotCQkJCQkJKTsKLQkJCX0gZWxzZSBpZihpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgYXBwRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSk7Ci0JCQkJcmV0ID0gKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChhcHBGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoYXBwRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGFwcEZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNKQ0FQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldCBqY2FGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKTsKLQkJCQlyZXQgPSAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGpjYUZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9Db25uZWN0b3JWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoamNhRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb0Nvbm5lY3RvclZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNVdGlsaXR5UHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCS8vIG5vdCBzdXJlIGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheQotCQkJCXJldCA9IHRydWU7Ci0JCQl9IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgYW4gSVZpcnR1YWxDb21wb25lbnQgZm9yIHRoZSBnaXZlbiBtb2R1bGUgbmFtZS4gVGhlIG1ldGhvZCB0YWtlCi0JICogZWl0aGVyIG1vZHVsZU5hbWUgb3IgbW9kdWxlTmFtZSArICIubW9kdWxlX2V4dGVuc2lvbiIgKG1vZHVsZV9leHRlbnNpb24gPSAiLmphciIgfHwgIi53YXIiIHx8Ci0JICogIi5yYXIiKSB3aGljaCBhbGxvd3MgdXNlcnMgdG8gZ2V0IGEgSVZpcnR1YWxDb21wb25lbnQgZm9yIGEgZ2l2ZW4gZW50cnkgaW4gYW4gYXBwbGljYXRpb24ueG1sCi0JICogCi0JICogQHJldHVybiAtIGEgSVZpcnR1YWxDb21wb25lbnQgZm9yIG1vZHVsZSBuYW1lCi0JICogQGRlcHJlY2F0ZWQgLSBzZWUge0BsaW5rIEVhclV0aWxpdGllcy5nZXRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBTdHJpbmcgbW9kdWxlTmFtZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBTdHJpbmcgbW9kdWxlTmFtZSkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldE1vZHVsZShlYXJDb21wb25lbnQsIG1vZHVsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIElWaXJ0dWFsUmVmZXJlbmNlcyBmb3IgdGhlIEoyRUUgbW9kdWxlIGNvbXBvbmVudHMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBFQVIgYXBwbGljYXRpb24uCi0JICogCi0JICogQHJldHVybiAtIGFuIGFycmF5IG9mIElWaXJ0dWFsUmVmZXJlbmNlcyBmb3IgSjJFRSBtb2R1bGVzIGluIHRoZSBFQVIKLQkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgRWFyVXRpbGl0aWVzLmdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKGVhckNvbXBvbmVudCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciBhbGwgb2YgdGhlIGNvbXBvbmVudHMgY29udGFpbmVkIGluCi0JICogYW4gRUFSIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGNvbXBvbmVudHMgaW4gdGhlIEVBUgotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBFYXJVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRDb21wb25lbnRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgSVZpcnR1YWxSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEByZXR1cm4gLSBJVmlydHVhbFJlZmVyZW5jZSBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqIEBkZXByZWNhdGVkIC0gc2VlIHtAbGluayBFYXJVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0Q29tcG9uZW50UmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIEVhclV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2UoZWFyQ29tcG9uZW50LCBjb21wb25lbnROYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L01hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L01hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTJjZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9NYW5pZmVzdEZpbGVDcmVhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIE1hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0hFQURFUiA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcclxuQ2xhc3MtUGF0aDogXHJcblxyXG4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24uCi0JICovCi0JcHVibGljIE1hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVNYW5pZmVzdEZpbGUoSUZpbGUgZmlsZSwgSVByb2plY3QgYUoyRUVQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlvdXQud3JpdGUoTUFOSUZFU1RfSEVBREVSLmdldEJ5dGVzKCkpOwotCQkJb3V0LmNsb3NlKCk7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBpb2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTE0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJwcm9qZWN0c3VwcG9ydCI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9sZGVyX25hbWVfY2Fubm90X2JlX3RoZV9zYW1lX2FzX0phdmFfc291cmNlX2ZvbGRlcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldF9VcGRhdGVfT3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fU0FfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX1dlYl9Qcm9qZWN0X19fX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3VsZF9ub3RfcmVuYW1lX19fX18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfd2ViX3Byb2plY3RfbXVzdF9iZV9vcGVuX2FuZF9tdXN0X2V4aXN0X2Zvcl9wcm9wZXJ0aWVzX3RvX2JlX2VkaXRlZF8zMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVyYXRpb25fZmFpbGVkX2R1ZV90b19JT19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2Fubm90X2Nsb25lX1RhZ2xpYkluZm9fMV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheF9FcnJvcl9pbl90aGVfbGlua3NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bmNfV0xQX09wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZF9ieV9XZWJfVG9vbGluZ18yMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMWNvbmNhdF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVfU2VydmluZ19FbmFibGVyXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b19HZW5lcmF0ZWRfX19GaWxlX0VuYWJsZXJfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb3RfYV93ZWJfcHJvamVjdF8yOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRoZV9jaGFyYWN0ZXJfaXNfaW52YWxpZF9pbl9hX2NvbnRleHRfcm9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2xkZXJfbmFtZV9jYW5ub3RfYmVfdGhlX3NhbWVfYXNfSmF2YV9jbGFzc19mb2xkZXJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaGVfcGF0aF9mb3JfdGhlX2xpbmtzX3N0YV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0phX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2xkZXJfbmFtZV9jYW5ub3RfYmVfZW1wdHlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9pbXBvcnRpbmdfTW9kdWxlX0ZpbF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0NvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2xkZXJfbmFtZXNfY2Fubm90X2JlX2VxdWFsXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ291bGRfbm90X3JlYWRfVExEXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvbGRlcl9uYW1lX2lzX25vdF92YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX1NlcnZsZXRfTGV2ZWxfc2V0X29uX1dlYk5hdHVyZV8zX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX3doaWxlX3NhdmluZ19saW5rc19zX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ljaHJvbml6ZV9DbGFzc19QYXRoX1VJXzsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU5BQkxFX1RPX0xPQURfTU9EVUxFX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVfQ2xhc3NQYXRoX19VSV87CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNldF9DbGFzc1BhdGhfX1VJXzsgCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydGluZ19hcmNoaXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydGluZ19hcmNoaXZlOwotCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9XVFBKRVRFbWl0dGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1dUUEpFVEVtaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzNmYxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1dUUEpFVEVtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uQ29kZUdlblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5qZXQuSkVUQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEVtaXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIsIG1kZWxkZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEpFVEVtaXR0ZXIgZXh0ZW5kcyBKRVRFbWl0dGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICIuSkVURW1pdHRlcnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNYXAgdmFyaWFibGVzOwotCi0JcHJpdmF0ZSBib29sZWFuIGludGVsbGlnZW50TGlua2luZ0VuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSkVUQ29tcGlsZXIgamV0Q29tcGlsZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVtcGxhdGVVUkkKLQkgKi8KLQlwdWJsaWMgV1RQSkVURW1pdHRlcihTdHJpbmcgdGVtcGxhdGVVUkkpIHsKLQkJc3VwZXIodGVtcGxhdGVVUkkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZW1wbGF0ZVVSSVBhdGgKLQkgKiBAcGFyYW0gcmVsYXRpdmVUZW1wbGF0ZVVSSQotCSAqLwotCXB1YmxpYyBXVFBKRVRFbWl0dGVyKFN0cmluZ1tdIHRlbXBsYXRlVVJJUGF0aCwgU3RyaW5nIHJlbGF0aXZlVGVtcGxhdGVVUkkpIHsKLQkJc3VwZXIodGVtcGxhdGVVUklQYXRoLCByZWxhdGl2ZVRlbXBsYXRlVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVtcGxhdGVVUkkKLQkgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgV1RQSkVURW1pdHRlcihTdHJpbmcgdGVtcGxhdGVVUkksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKHRlbXBsYXRlVVJJLCBjbGFzc0xvYWRlcik7Ci0JCXRyeSB7Ci0JCQlpbml0aWFsaXplKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChKRVRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZW1wbGF0ZVVSSVBhdGgKLQkgKiBAcGFyYW0gcmVsYXRpdmVUZW1wbGF0ZVVSSQotCSAqIEBwYXJhbSBjbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBXVFBKRVRFbWl0dGVyKFN0cmluZ1tdIHRlbXBsYXRlVVJJUGF0aCwgU3RyaW5nIHJlbGF0aXZlVGVtcGxhdGVVUkksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKHRlbXBsYXRlVVJJUGF0aCwgcmVsYXRpdmVUZW1wbGF0ZVVSSSwgY2xhc3NMb2FkZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZW1wbGF0ZVVSSVBhdGgKLQkgKiBAcGFyYW0gcmVsYXRpdmVUZW1wbGF0ZVVSSQotCSAqIEBwYXJhbSBjbGFzc0xvYWRlcgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBXVFBKRVRFbWl0dGVyKFN0cmluZ1tdIHRlbXBsYXRlVVJJUGF0aCwgU3RyaW5nIHJlbGF0aXZlVGVtcGxhdGVVUkksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJc3VwZXIodGVtcGxhdGVVUklQYXRoLCByZWxhdGl2ZVRlbXBsYXRlVVJJLCBjbGFzc0xvYWRlciwgZW5jb2RpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEVtaXR0ZXIjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSkVURXhjZXB0aW9uIHsKLQotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJcHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2soQ29kZUdlblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9HZW5lcmF0aW5nSkVURW1pdHRlckZvcl9tZXNzYWdlIiwgbmV3IE9iamVjdFtde3RlbXBsYXRlVVJJfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCS8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBKUkUgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZC4KLQkJCXRyeSB7Ci0JCQkJSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQkJCS8vIFRoaXMgaXMga2luZCBvZiBuYXN0eSB0byBjb21lIGhlcmUuCi0JCQkJVVJMIGpyZVVSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbiIpLG5ldyBQYXRoKCJwbHVnaW4ueG1sIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJUGF0aCBqcmVQYXRoID0gbmV3IFBhdGgoUGxhdGZvcm0uYXNMb2NhbFVSTChqcmVVUkwpLmdldEZpbGUoKSk7Ci0JCQkJanJlUGF0aCA9IGpyZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuZXcgUGF0aCgiLi4vLi4vanJlL2xpYi9ydC5qYXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWpyZVBhdGguZXF1YWxzKEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKEphdmFSdW50aW1lLkpSRUxJQl9WQVJJQUJMRSkpKSB7Ci0JCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aFZhcmlhYmxlKEphdmFSdW50aW1lLkpSRUxJQl9WQVJJQUJMRSwganJlUGF0aCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogZmluYWwgSkVUQ29tcGlsZXIgamV0Q29tcGlsZXIgPSB0ZW1wbGF0ZVVSSVBhdGggPT0gbnVsbCA/IG5ldwotCQkJICogTXlKRVRDb21waWxlcih0ZW1wbGF0ZVVSSSwgZW5jb2RpbmcpIDoKLQkJCSAqLwotCi0JCQlnZXRKZXRDb21waWxlcigpOwotCi0JCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhDb2RlR2VuUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0pFVFBhcnNpbmdfbWVzc2FnZSIsIG5ldyBPYmplY3RbXXtqZXRDb21waWxlci5nZXRSZXNvbHZlZFRlbXBsYXRlVVJJKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCWpldENvbXBpbGVyLnBhcnNlKCk7Ci0JCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJamV0Q29tcGlsZXIuZ2VuZXJhdGUob3V0cHV0U3RyZWFtKTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGNvbnRlbnRzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQotCQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCWlmICghamF2YU1vZGVsLmlzT3BlbigpKSB7Ci0JCQkJamF2YU1vZGVsLm9wZW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRQcm9qZWN0TmFtZSgpKTsKLQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSkVUUHJlcGFyaW5nUHJvamVjdF9tZXNzYWdlIiwgbmV3IE9iamVjdFtde3Byb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCWphdmFQcm9qZWN0ID0gY3JlYXRlSmF2YVByb2plY3QocHJvZ3Jlc3NNb25pdG9yLCB3b3Jrc3BhY2UsIHByb2plY3QpOwotCi0JCQkJaW5pdGlhbGl6ZUphdmFQcm9qZWN0KHByb2dyZXNzTW9uaXRvciwgcHJvamVjdCwgamF2YVByb2plY3QpOwotCi0JCQkJamF2YVByb2plY3QuY2xvc2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdC5vcGVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCA1KSk7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJTGlzdCByYXdDbGFzc1BhdGggPSBBcnJheXMuYXNMaXN0KGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8cmF3Q2xhc3NQYXRoLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIHJhd0NsYXNzUGF0aC5nZXQoaSk7Ci0JCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKT09SUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKQotCQkJCQkJY2xhc3NwYXRoRW50cmllcy5hZGQoZW50cnkpOwotCQkJCX0KLQkJCX0KLQotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCA9IG9wZW5KYXZhUHJvamVjdElmTmVjZXNzYXJ5KHByb2dyZXNzTW9uaXRvciwgcHJvamVjdCwgamF2YVByb2plY3QpOwotCi0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBqZXRDb21waWxlci5nZXRTa2VsZXRvbigpLmdldFBhY2thZ2VOYW1lKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYWNrYWdlTmFtZSwgIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSk7Ci0JCQlzdWJQcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCBzdHJpbmdUb2tlbml6ZXIuY291bnRUb2tlbnMoKSArIDQpOyAvLyROT04tTkxTLTEkCi0JCQlzdWJQcm9ncmVzc01vbml0b3Iuc3ViVGFzayhDb2RlR2VuUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0NyZWF0ZVRhcmdldEZpbGVfbWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSAoSUNvbnRhaW5lcikgc291cmNlUGFja2FnZUZyYWdtZW50Um9vdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCXdoaWxlIChzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlzb3VyY2VDb250YWluZXIgPSBzb3VyY2VDb250YWluZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLQkJCQlpZiAoIXNvdXJjZUNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJCQkoKElGb2xkZXIpIHNvdXJjZUNvbnRhaW5lcikuY3JlYXRlKGZhbHNlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHN1YlByb2dyZXNzTW9uaXRvciwgMSkpOwotCQkJCX0KLQkJCX0KLQkJCUlGaWxlIHRhcmdldEZpbGUgPSBzb3VyY2VDb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChqZXRDb21waWxlci5nZXRTa2VsZXRvbigpLmdldENsYXNzTmFtZSgpICsgIi5qYXZhIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlzdWJQcm9ncmVzc01vbml0b3Iuc3ViVGFzayhDb2RlR2VuUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0pFVENyZWF0aW5nX21lc3NhZ2UiLCBuZXcgT2JqZWN0W117dGFyZ2V0RmlsZS5nZXRGdWxsUGF0aCgpfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJdGFyZ2V0RmlsZS5jcmVhdGUoY29udGVudHMsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViUHJvZ3Jlc3NNb25pdG9yLCAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCXN1YlByb2dyZXNzTW9uaXRvci5zdWJUYXNrKENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSkVUVXBkYXRpbmdfbWVzc2FnZSIsIG5ldyBPYmplY3RbXXt0YXJnZXRGaWxlLmdldEZ1bGxQYXRoKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0YXJnZXRGaWxlLnNldENvbnRlbnRzKGNvbnRlbnRzLCB0cnVlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHN1YlByb2dyZXNzTW9uaXRvciwgMSkpOwotCQkJfQotCi0JCQlib29sZWFuIGVycm9ycyA9IHBlcmZvcm1CdWlsZChwcm9qZWN0LCBzdWJQcm9ncmVzc01vbml0b3IsIHRhcmdldEZpbGUpOwotCi0JCQlpZiAoIWVycm9ycykgewotCQkJCWxvYWRDbGFzcyh3b3Jrc3BhY2UsIHByb2plY3QsIGphdmFQcm9qZWN0LCBwYWNrYWdlTmFtZSwgc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCX0KLQotCQkJc3ViUHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBKRVRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IEpFVEV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9IGZpbmFsbHkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IG9wZW5KYXZhUHJvamVjdElmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhDb2RlR2VuUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0pFVE9wZW5pbmdKYXZhUHJvamVjdF9tZXNzYWdlIiwgbmV3IE9iamVjdFtde3Byb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCWphdmFQcm9qZWN0Lm9wZW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpKTsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFja2FnZUZyYWdtZW50Um9vdHMubGVuZ3RoOyArK2opIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tqXTsKLQkJCWlmIChwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24sIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSkVUSW5pdGlhbGl6aW5nUHJvamVjdF9tZXNzYWdlIiwgbmV3IE9iamVjdFtde3Byb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi9zcmMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vSUNsYXNzcGF0aEVudHJ5IGpyZUNsYXNzcGF0aEVudHJ5ID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aChKYXZhUnVudGltZS5KUkVMSUJfVkFSSUFCTEUpLCBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVTUkNfVkFSSUFCTEUpLCBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVTUkNST09UX1ZBUklBQkxFKSk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBqcmVDbGFzc3BhdGhFbnRyeSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotCi0JCUxpc3QgY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQljbGFzc3BhdGguYWRkKGNsYXNzcGF0aEVudHJ5KTsKLQkJY2xhc3NwYXRoLmFkZChqcmVDbGFzc3BhdGhFbnRyeSk7Ci0JCWNsYXNzcGF0aC5hZGRBbGwoY2xhc3NwYXRoRW50cmllcyk7Ci0KLQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuZXcgUGF0aCgic3JjIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICghc291cmNlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlzb3VyY2VGb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQl9Ci0JCUlGb2xkZXIgcnVudGltZUZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5ldyBQYXRoKCJydW50aW1lIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcnVudGltZUZvbGRlci5leGlzdHMoKSkgewotCQkJcnVudGltZUZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSk7Ci0JCX0KLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyeUFycmF5ID0gKElDbGFzc3BhdGhFbnRyeVtdKSBjbGFzc3BhdGgudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aC5zaXplKCldKTsKLQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoRW50cnlBcnJheSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpKTsKLQotCQlqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihuZXcgUGF0aCgiLyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIvcnVudGltZSIpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBhcHBlbmRlZCBmcm9tIHByZXZpb3VzIGltcGxlbWVudGF0aW9uCi0JCWNyZWF0ZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdCk7Ci0JCQotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKCBwcm9qZWN0ICk7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBjb250ZXh0LmdldE5vZGUoIEphdmFDb3JlLlBMVUdJTl9JRCApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX1JBV19UWVBFX1JFRkVSRU5DRSwgSmF2YUNvcmUuSUdOT1JFICk7Ci0JCXByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfVU5DSEVDS0VEX1RZUEVfT1BFUkFUSU9OLCBKYXZhQ29yZS5JR05PUkUgKTsKLQkJCi0JCS8vIHNldCBKYXZhIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwgdG8gMS41Ci0JCXByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUgKTsKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUgKTsKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV81ICk7Ci0JCXByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SICk7Ci0JCXByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUiApOwotCQkKLQkJLy8gc2V0IEphdmFkb2MgdmFsaWRhdGlvbiB0byB0aGUgZGVmYXVsdCBpZ25vcmUgbGV2ZWwKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0MsIEphdmFDb3JlLklHTk9SRSApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTLCBKYXZhQ29yZS5ESVNBQkxFRCApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTX19ERVBSRUNBVEVEX1JFRiwgSmF2YUNvcmUuRElTQUJMRUQgKTsKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0NfVEFHU19fTk9UX1ZJU0lCTEVfUkVGLCBKYXZhQ29yZS5ESVNBQkxFRCApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTX1ZJU0lCSUxJVFksIEphdmFDb3JlLlBVQkxJQyApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT04sIEphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT05fUkVUVVJOX1RBRyApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdTLCBKYXZhQ29yZS5JR05PUkUgKTsKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHU19WSVNJQklMSVRZLCBKYXZhQ29yZS5QVUJMSUMgKTsKLQkJcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHU19PVkVSUklESU5HLCBKYXZhQ29yZS5ESVNBQkxFRCApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19DT01NRU5UUywgSmF2YUNvcmUuSUdOT1JFICk7Ci0JCXByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX0NPTU1FTlRTX1ZJU0lCSUxJVFksIEphdmFDb3JlLlBVQkxJQyApOwotCQlwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19DT01NRU5UU19PVkVSUklESU5HLCBKYXZhQ29yZS5ESVNBQkxFRCApOwotCQkKLQkJLy8gc3RvcmUgY2hhbmdlZCBwcm9wZXJ0aWVzIHBlcm1hbmVudGx5Ci0JCXByZWZzLmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElKYXZhUHJvamVjdCBjcmVhdGVKYXZhUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzaygiSkVUIGNyZWF0aW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9qZWN0LmNyZWF0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhDb2RlR2VuUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0pFVENyZWF0aW5nUHJvamVjdF9tZXNzYWdlIiwgbmV3IE9iamVjdFtde3Byb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXXtKYXZhQ29yZS5OQVRVUkVfSUR9KTsKLQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24obnVsbCk7Ci0JCXByb2plY3Qub3BlbihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCi0JCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHBhcmFtIHBhY2thZ2VOYW1lCi0JICogQHBhcmFtIHN1YlByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENsYXNzKGZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gewotCQkvL0lDb250YWluZXIgdGFyZ2V0Q29udGFpbmVyID0KLQkJLy8gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0KLQkJc3ViUHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2soQ29kZUdlblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9KRVRMb2FkaW5nQ2xhc3NfbWVzc2FnZSIsIG5ldyBPYmplY3RbXXtqZXRDb21waWxlci5nZXRTa2VsZXRvbigpLmdldENsYXNzTmFtZSgpICsgIi5jbGFzcyJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIENvbnN0cnVjdCBhIHByb3BlciBVUkwgZm9yIHJlbGF0aXZlIGxvb2t1cC4KLQkJLy8KLQkJVVJMIHVybCA9IG5ldyBGaWxlKHByb2plY3QuZ2V0TG9jYXRpb24oKSArICIvIiArIGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSArICIvIikudG9VUkwoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVVSTENsYXNzTG9hZGVyIHRoZUNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXXt1cmx9LCBjbGFzc0xvYWRlcik7Ci0JCUNsYXNzIHRoZUNsYXNzID0gdGhlQ2xhc3NMb2FkZXIubG9hZENsYXNzKChwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwID8gIiIgOiBwYWNrYWdlTmFtZSArICIuIikgKyBqZXRDb21waWxlci5nZXRTa2VsZXRvbigpLmdldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBtZXRob2ROYW1lID0gamV0Q29tcGlsZXIuZ2V0U2tlbGV0b24oKS5nZXRNZXRob2ROYW1lKCk7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSB0aGVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJc2V0TWV0aG9kKG1ldGhvZHNbaV0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gc3ViUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRhcmdldEZpbGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyZm9ybUJ1aWxkKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yLCBJRmlsZSB0YXJnZXRGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1YlByb2dyZXNzTW9uaXRvci5zdWJUYXNrKENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSkVUQnVpbGRpbmdfbWVzc2FnZSIsIG5ldyBPYmplY3RbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViUHJvZ3Jlc3NNb25pdG9yLCAxKSk7Ci0KLQkJSU1hcmtlcltdIG1hcmtlcnMgPSB0YXJnZXRGaWxlLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJYm9vbGVhbiBlcnJvcnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQlpZiAobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0lORk8pID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQllcnJvcnMgPSB0cnVlOwotCQkJCXN1YlByb2dyZXNzTW9uaXRvci5zdWJUYXNrKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSArICIgOiAiICsgKENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJqZXQubWFyay5maWxlLmxpbmUiLCBuZXcgT2JqZWN0W117dGFyZ2V0RmlsZS5nZXRMb2NhdGlvbigpLCBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpfSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9yczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvcnJlY3QgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGFzc3BhdGhFbnRyaWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9qZWN0LCAiQSB2YWxpZCBwcm9qZWN0IGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGFwcGVuZCB0byBhIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2YXJpYWJsZU5hbWUgPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIHZhcmlhYmxlc0tleUl0ZXJhdG9yID0gZ2V0VmFyaWFibGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgdmFyaWFibGVzS2V5SXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJdmFyaWFibGVOYW1lID0gKFN0cmluZykgdmFyaWFibGVzS2V5SXRlcmF0b3IubmV4dCgpOwotCQkJcGx1Z2luSWQgPSAoU3RyaW5nKSBnZXRWYXJpYWJsZXMoKS5nZXQodmFyaWFibGVOYW1lKTsKLQkJCWlmIChoYXNPdXRwdXREaXJlY3RvcnkocGx1Z2luSWQpKQotCQkJCWFkZExpbmtlZEZvbGRlckFzTGlicmFyeShwcm9qZWN0LCB2YXJpYWJsZU5hbWUsIHBsdWdpbklkKTsKLQkJCWVsc2UKLQkJCQlhZGRSdW50aW1lSmFyc0FzTGlicmFyeShwcm9qZWN0LCBwbHVnaW5JZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzT3V0cHV0RGlyZWN0b3J5KFN0cmluZyBwbHVnaW5JZCkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJVVJMIG91dHB1dERpcmVjdG9yeSA9IFBsYXRmb3JtLmZpbmQoYnVuZGxlLG5ldyBQYXRoKCJiaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG91dHB1dERpcmVjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlVUkwgaW5zdGFsbExvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluc3RhbGxMb2NhdGlvbiA9IFBsYXRmb3JtLmFzTG9jYWxVUkwob3V0cHV0RGlyZWN0b3J5KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkluc3RhbGxfTG9jYXRpb25fRXJyb3JfIiwgbmV3IE9iamVjdFtde2luc3RhbGxMb2NhdGlvbn0pICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGaWxlIG91dHB1dERpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShpbnN0YWxsTG9jYXRpb24uZ2V0UGF0aCgpKTsvLyBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCXJldHVybiBvdXRwdXREaXJlY3RvcnlGaWxlLmNhblJlYWQoKSAmJiBvdXRwdXREaXJlY3RvcnlGaWxlLmlzRGlyZWN0b3J5KCkgJiYgb3V0cHV0RGlyZWN0b3J5RmlsZS5saXN0RmlsZXMoKS5sZW5ndGggPiAwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHZhcmlhYmxlTmFtZQotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJ1bnRpbWVKYXJzQXNMaWJyYXJ5KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwbHVnaW5JZCkgewotCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQl0cnkgewotCQkJU3RyaW5nIHJlcXVpcmVzID0gKFN0cmluZykgYnVuZGxlLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9DTEFTU1BBVEgpOwotCQkJZWxlbWVudHMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoQ29uc3RhbnRzLkJVTkRMRV9DTEFTU1BBVEgsIHJlcXVpcmVzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWVsZW1lbnRzID0gbmV3IE1hbmlmZXN0RWxlbWVudFswXTsKLQkJfQotCQlJUGF0aCBydW50aW1lTGliRnVsbFBhdGggPSBudWxsOwotCQlVUkwgZnVsbHVybCA9IG51bGw7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlpZiAoYnVuZGxlLmdldExvY2F0aW9uKCkuZW5kc1dpdGgoIi5qYXIiKSkKLQkJCQl0cnkgewotCQkJCQlydW50aW1lTGliRnVsbFBhdGggPSBnZXRKYXJyZWRQbHVnaW5QYXRoKGJ1bmRsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCWFwcGVuZFRvQ2xhc3NQYXRoKHJ1bnRpbWVMaWJGdWxsUGF0aCxwcm9qZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50c1tpXS5nZXRWYWx1ZSgpOwotCQkJaWYgKCIuIi5lcXVhbHModmFsdWUpKSAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgdmFsdWUgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCWZ1bGx1cmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmdldEVudHJ5KHZhbHVlKTsKLQkJCS8vIGZpeCB0aGUgcHJvYmxlbSB3aXRoIGxlYWRpbmcgc2xhc2ggdGhhdCBjYXVzZWQgZHVwIGNsYXNzcGF0aCBlbnRyaWVzCi0JCQlpZiAoZnVsbHVybD09bnVsbCkgY29udGludWU7Ci0JCQl0cnkgewotCQkJCXJ1bnRpbWVMaWJGdWxsUGF0aCA9IG5ldyBQYXRoKFBsYXRmb3JtLmFzTG9jYWxVUkwoZnVsbHVybCkuZ2V0UGF0aCgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJLy9UT0RPIGhhbmRsZSBqYXInZWQgcGx1Z2lucywgdGhpcyBpcyBhIGhhY2sgZm9yIG5vdywgbmVlZCB0byBmaW5kIHByb3BlciBidW5kbGUgQVBJCi0JCQlpZiAoYnVuZGxlLmdldExvY2F0aW9uKCkuZW5kc1dpdGgoIi5qYXIiKSkKLQkJCQl0cnkgewotCQkJCQlydW50aW1lTGliRnVsbFBhdGggPSBnZXRKYXJyZWRQbHVnaW5QYXRoKGJ1bmRsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCWlmICghImphciIuZXF1YWxzKHJ1bnRpbWVMaWJGdWxsUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmICEiemlwIi5lcXVhbHMocnVudGltZUxpYkZ1bGxQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbnRpbnVlOwotCQkJYXBwZW5kVG9DbGFzc1BhdGgocnVudGltZUxpYkZ1bGxQYXRoLHByb2plY3QpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0NsYXNzUGF0aChJUGF0aCBydW50aW1lTGliRnVsbFBhdGgsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocnVudGltZUxpYkZ1bGxQYXRoLCBudWxsLG51bGwsbnVsbCxuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde30sZmFsc2UpOwotCQl0cnkgewotCQkJaWYgKCFjbGFzc3BhdGhFbnRyaWVzLmNvbnRhaW5zKGVudHJ5KSkKLQkJCQljbGFzc3BhdGhFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQkvL0oyRUVQcm9qZWN0VXRpbGl0aWVzLmFwcGVuZEphdmFDbGFzc1BhdGgocHJvamVjdCwgZW50cnkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJQcm9ibGVtIGFwcGVuZGluZyBcIiIgKyBlbnRyeS5nZXRQYXRoKCkgKyAiXCIgdG8gY2xhc3NwYXRoIG9mIFByb2plY3QgXCIiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBnZXRKYXJyZWRQbHVnaW5QYXRoKEJ1bmRsZSBidW5kbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdGggcnVudGltZUxpYkZ1bGxQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGphclBsdWdpbkxvY2F0aW9uID0gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpLmdldFBhdGgoKTsKLQkJUGF0aCBqYXJQbHVnaW5QYXRoID0gbmV3IFBhdGgoamFyUGx1Z2luTG9jYXRpb24pOwotCQkvLyBoYW5kbGUgY2FzZSB3aGVyZSBqYXJzIGFyZSBpbnN0YWxsZWQgb3V0c2lkZSBvZiBlY2xpcHNlIGluc3RhbGxhdGlvbgotCQlpZiAoamFyUGx1Z2luUGF0aC5pc0Fic29sdXRlKCkpCi0JCQlydW50aW1lTGliRnVsbFBhdGggPSBqYXJQbHVnaW5QYXRoOwotCQkvLyBoYW5kbGUgbm9ybWFsIGNhc2Ugd2hlcmUgYWxsIHBsdWdpbnMgdW5kZXIgZWNsaXBzZSBpbnN0YWxsCi0JCWVsc2UgewotCQkJU3RyaW5nIGluc3RhbGxQYXRoID0gUGxhdGZvcm0uZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQkJcnVudGltZUxpYkZ1bGxQYXRoID0gbmV3IFBhdGgoaW5zdGFsbFBhdGgrIi8iK2phclBsdWdpbkxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBydW50aW1lTGliRnVsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2dyZXNzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBTdHJpbmcga2V5KSB7Ci0JCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGdldE1lc3NhZ2Uoa2V5KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2dyZXNzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGdldE1lc3NhZ2Uoa2V5LCBhcmdzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIENvZGVHZW5QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKGtleSwgYXJncyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5qZXQuSkVURW1pdHRlciNhZGRWYXJpYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUsIFN0cmluZyBwbHVnaW5JRCkgdGhyb3dzIEpFVEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNJbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkKCkpCi0JCQlzdXBlci5hZGRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIHBsdWdpbklEKTsKLQkJZWxzZSB7Ci0JCQlnZXRWYXJpYWJsZXMoKS5wdXQodmFyaWFibGVOYW1lLCBwbHVnaW5JRCk7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QoZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQkJY3JlYXRlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ludGVsbGlnZW50TGlua2luZ0VuYWJsZWQoKSB7Ci0JCXJldHVybiBpbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRWYXJpYWJsZXMoKSB7Ci0JCWlmICh2YXJpYWJsZXMgPT0gbnVsbCkKLQkJCXZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua2VkRm9sZGVyQXNMaWJyYXJ5KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YXJpYWJsZU5hbWUsIFN0cmluZyBwbHVnaW5JRCkgewotCQl0cnkgewotCQkJVVJMIG91dHB1dERpcmVjdG9yeSA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKSxuZXcgUGF0aCgiYmluIikpOyAvLyROT04tTkxTLTEkCi0vLwkJCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW4ocGx1Z2luSUQpLmdldERlc2NyaXB0b3IoKTsKLS8vCQkJVVJMIG91dHB1dERpcmVjdG9yeSA9IHBsdWdpbkRlc2NyaXB0b3IuZmluZChuZXcgUGF0aCgiYmluIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGF0aFN0cmluZyA9IFBsYXRmb3JtLmFzTG9jYWxVUkwob3V0cHV0RGlyZWN0b3J5KS5nZXRQYXRoKCk7Ci0JCQlpZiAocGF0aFN0cmluZy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJcGF0aFN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKDAsIHBhdGhTdHJpbmcubGVuZ3RoKCkgLSAxKTsKLQkJCWlmIChwYXRoU3RyaW5nLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nLnN1YnN0cmluZygxLCBwYXRoU3RyaW5nLmxlbmd0aCgpKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nKS5tYWtlQWJzb2x1dGUoKTsKLQotCQkJU3RyaW5nIGJpbkRpcmVjdG9yeVZhcmlhYmxlID0gdmFyaWFibGVOYW1lICsgIl9CSU4iOyAvLyROT04tTkxTLTEkCi0JCQlJRm9sZGVyIGxpbmtlZERpcmVjdG9yeSA9IHByb2plY3QuZ2V0Rm9sZGVyKGJpbkRpcmVjdG9yeVZhcmlhYmxlKTsKLQkJCWlmICghbGlua2VkRGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0JCQkJbGlua2VkRGlyZWN0b3J5LmNyZWF0ZUxpbmsocGF0aCwgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG51bGwpOwotCQkJCWxpbmtlZERpcmVjdG9yeS5zZXREZXJpdmVkKHRydWUpOwotCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQl9Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobGlua2VkRGlyZWN0b3J5LmdldEZ1bGxQYXRoKCksIG51bGwsbnVsbCxudWxsLG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW117fSxmYWxzZSk7Ci0KLQkJCWlmICghY2xhc3NwYXRoRW50cmllcy5jb250YWlucyhlbnRyeSkpCi0JCQljbGFzc3BhdGhFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQkvL0oyRUVQcm9qZWN0VXRpbGl0aWVzLmFwcGVuZEphdmFDbGFzc1BhdGgocHJvamVjdCwgZW50cnkpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW50ZWxsaWdlbnRMaW5raW5nRW5hYmxlZAotCSAqICAgICAgICAgICAgVGhlIGludGVsbGlnZW50TGlua2luZ0VuYWJsZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVsbGlnZW50TGlua2luZ0VuYWJsZWQoYm9vbGVhbiBpbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkKSB7Ci0JCXRoaXMuaW50ZWxsaWdlbnRMaW5raW5nRW5hYmxlZCA9IGludGVsbGlnZW50TGlua2luZ0VuYWJsZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIEpFVENvbXBpbGVyIGdldEpldENvbXBpbGVyKCkgewotCQl0cnkgewotCQkJaWYgKGpldENvbXBpbGVyID09IG51bGwpIHsKLQkJCQlqZXRDb21waWxlciA9IHRlbXBsYXRlVVJJUGF0aCA9PSBudWxsID8gbmV3IE15SkVUQ29tcGlsZXIodGVtcGxhdGVVUkksIGVuY29kaW5nKSA6IG5ldyBNeUpFVENvbXBpbGVyKHRlbXBsYXRlVVJJUGF0aCwgdGVtcGxhdGVVUkksIGVuY29kaW5nKTsKLQkJCX0KLQkJfSBjYXRjaCAoSkVURXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gamV0Q29tcGlsZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC90ZXN0LmpwYWdlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC90ZXN0LmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvdGVzdC5qcGFnZQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvQ2xhc3NwYXRoUmVuYW1lSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcmVuYW1lL0NsYXNzcGF0aFJlbmFtZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyNzgwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvQ2xhc3NwYXRoUmVuYW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIEEgc2ltcGxlIHN0cnVjdHVyZSB0aGF0IHJlbWVtYmVycyBmb3IgYSBnaXZlbiBwcm9qZWN0LCB0aGUgbWFuaWZlc3QgZW50cmllcyB0byBiZSBkZWxldGVkIGFuZCB0aGUKLSAqIGJ1aWxkIHBhdGggZW50cmllcyB0byBiZSBkZWxldGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhSZW5hbWVJbmZvIHsKLQkvKioKLQkgKiBUaGUgcHJvamVjdCBmcm9tIHdoaWNoIHRoZSBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IHRhcmdldFByb2plY3Q7Ci0JLyoqCi0JICogVGhlIGxpdGVyYWwgbWFuaWZlc3QgZW50cmllcyB0byBiZSByZW1vdmVkOyBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBtYW5pZmVzdEVudHJpZXM7Ci0JLyoqCi0JICogVGhlIHByb2plY3QgcmVmZXJlbmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGJ1aWxkIHBhdGg7IElQcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlZFByb2plY3RzOwotCi0JcHVibGljIENsYXNzcGF0aFJlbmFtZUluZm8oSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0YXJnZXRQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5pZmVzdEVudHJpZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1hbmlmZXN0RW50cmllcygpIHsKLQkJaWYgKG1hbmlmZXN0RW50cmllcyA9PSBudWxsKQotCQkJbWFuaWZlc3RFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbWFuaWZlc3RFbnRyaWVzOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlZFByb2plY3RzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZWZlcmVuY2VkUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhcmdldFByb2plY3QuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRhcmdldFByb2plY3Q7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvUmVuYW1lT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcmVuYW1lL1JlbmFtZU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MWEyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvUmVuYW1lT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFJlbmFtZU9wdGlvbnMgewotCXByb3RlY3RlZCBib29sZWFuIGlzRUFSUmVuYW1lOwotCXByb3RlY3RlZCBib29sZWFuIHJlbmFtZVByb2plY3RzOwotCXByb3RlY3RlZCBib29sZWFuIHJlbmFtZU1vZHVsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzOwotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkUHJvamVjdHM7Ci0JLyoqIEFwcGxpY2FibGUgZm9yIEVBUiByZW5hbWUgKi8KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgbmV3Q29udGV4dFJvb3QgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGJvZ3VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlbmFtZU9wdGlvbnMuCi0JICovCi0JcHVibGljIFJlbmFtZU9wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVNb2R1bGVzKCkgewotCQlyZXR1cm4gcmVuYW1lTW9kdWxlczsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlbmFtZU1vZHVsZXMoYm9vbGVhbiByZW5hbWVNb2R1bGVzRnJvbUFsbEVBUnMpIHsKLQkJdGhpcy5yZW5hbWVNb2R1bGVzID0gcmVuYW1lTW9kdWxlc0Zyb21BbGxFQVJzOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lUHJvamVjdHMoKSB7Ci0JCXJldHVybiByZW5hbWVQcm9qZWN0czsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlbmFtZVByb2plY3RzKGJvb2xlYW4gcmVuYW1lUHJvamVjdHMpIHsKLQkJdGhpcy5yZW5hbWVQcm9qZWN0cyA9IHJlbmFtZVByb2plY3RzOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkgewotCQlyZXR1cm4gcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKGJvb2xlYW4gcmVuYW1lUmVmZXJlbmNlc0Zyb21Nb2R1bGVEZXBlbmRlbmNpZXMpIHsKLQkJdGhpcy5yZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMgPSByZW5hbWVSZWZlcmVuY2VzRnJvbU1vZHVsZURlcGVuZGVuY2llczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVBbmRVdGlsaXR5UHJvamVjdHMoKSB7Ci0JCWlmIChpc0VBUlJlbmFtZSkKLQkJCXJldHVybiBnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRQcm9qZWN0cygpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFsbFByb2plY3RzVG9SZW5hbWUoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldFNlbGVjdGVkUHJvamVjdHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWRQcm9qZWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRQcm9qZWN0cygpIHsKLQkJaWYgKHNlbGVjdGVkUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gc2VsZWN0ZWRQcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3RlZFByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZFByb2plY3RzCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWRQcm9qZWN0cyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFByb2plY3RzKExpc3Qgc2VsZWN0ZWRQcm9qZWN0cykgewotCQl0aGlzLnNlbGVjdGVkUHJvamVjdHMgPSBzZWxlY3RlZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cwotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKExpc3Qgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMpIHsKLQkJdGhpcy5zZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyA9IHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRUFSUmVuYW1lKCkgewotCQlyZXR1cm4gaXNFQVJSZW5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNFQVJSZW5hbWUoYm9vbGVhbiBpc0VBUlJlbmFtZSkgewotCQl0aGlzLmlzRUFSUmVuYW1lID0gaXNFQVJSZW5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiBuZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXdOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdDb250ZXh0Um9vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0NvbnRleHRSb290KCkgewotCQlyZXR1cm4gbmV3Q29udGV4dFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmV3Q29udGV4dFJvb3QuCi0JICogCi0JICogQHBhcmFtIG5ld0NvbnRleHRSb290Ci0JICogICAgICAgICAgICBUaGUgbmV3Q29udGV4dFJvb3QgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3Q29udGV4dFJvb3QoU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCXRoaXMubmV3Q29udGV4dFJvb3QgPSBuZXdDb250ZXh0Um9vdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0lTZXJ2ZXJUYXJnZXRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9JU2VydmVyVGFyZ2V0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGFlMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0lTZXJ2ZXJUYXJnZXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMgewotCVN0cmluZyBFQVJfVFlQRSA9ICJqMmVlLmVhciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCX1RZUEUgPSAiajJlZS53ZWIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9QT1JUQUxfVFlQRSA9ICJqMmVlLndlYi5wb3J0YWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9UWVBFID0gImoyZWUuZWpiIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBUFBfQ0xJRU5UX1RZUEUgPSAiajJlZS5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTk5FQ1RPUl9UWVBFID0gImoyZWUuY29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKMkVFXzEyID0gIjEuMiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSjJFRV8xMyA9ICIxLjMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEoyRUVfMTQgPSAiMS40IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVJWRVJfRklMRV9OQU1FID0gIi5zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGFlc1Y0U2VydmVyVGFyZ2V0SWQgPSAiY29tLmlibS5ldG9vbHMud2Vic3BoZXJlLmFlcy52NCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyB2NVNlcnZlclRhcmdldElkID0gImNvbS5pYm0uZXRvb2xzLndlYnNwaGVyZS5zZXJ2ZXJUYXJnZXQuYmFzZS52NSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyB2NTFTZXJ2ZXJUYXJnZXRJZCA9ICJjb20uaWJtLmV0b29scy53ZWJzcGhlcmUuc2VydmVyVGFyZ2V0LmJhc2UudjUxIjsvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSVRhcmdldFJ1bnRpbWVFeHRlbnNpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSVRhcmdldFJ1bnRpbWVFeHRlbnNpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzg4MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0lUYXJnZXRSdW50aW1lRXh0ZW5zaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRSdW50aW1lRXh0ZW5zaW9uSGFuZGxlciB7Ci0JcHVibGljIGJvb2xlYW4gcmVtb3ZlVGFyZ2V0UnVudGltZUNsYXNzcGF0aChJUHJvamVjdCBwcm9qZWN0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0oyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1ODAyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXNvdXJjZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lELCBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SUQoKSk7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0T3AobW9kZWwpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJVTlRJTUVfVEFSR0VUX0lEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSjJFRV9WRVJTSU9OX0lEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoREVQTE9ZTUVOVF9UWVBFX0lEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVBEQVRFX01PRFVMRVMpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKSB7Ci0JCVN0cmluZyBzZXJ2ZXJUYXJnZXRJZCA9IChTdHJpbmcpIGdldFByb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lEKTsKLQkJcmV0dXJuIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWUoc2VydmVyVGFyZ2V0SWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjZ2V0RGVmYXVsdFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhSVU5USU1FX1RBUkdFVF9JRCkpCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZlclRhcmdldElEKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSjJFRV9WRVJTSU9OX0lEKSkKLQkJCXJldHVybiBnZXREZWZhdWx0VmVyc2lvbklEKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVBEQVRFX01PRFVMRVMpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVmYXVsdFNlcnZlclRhcmdldElEKCkgewotCQlMaXN0IHRhcmdldHMgPSBnZXRWYWxpZFNlcnZlclRhcmdldHMoKTsKLQkJaWYgKCF0YXJnZXRzLmlzRW1wdHkoKSkgewotCQkJSVJ1bnRpbWUgdGFyZ2V0ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSB0YXJnZXRzLnNpemUoKSAtIDE7IGkgPCB0YXJnZXRzLnNpemUoKSAmJiBpID49IDA7IGktLSkgewotCQkJCXRhcmdldCA9IChJUnVudGltZSkgdGFyZ2V0cy5nZXQoaSk7Ci0JCQkJaWYgKERFRkFVTFRfVEFSR0VUX0lELmVxdWFscyh0YXJnZXQuZ2V0SWQoKSkpCi0JCQkJCXJldHVybiB0YXJnZXQuZ2V0SWQoKTsKLQkJCX0KLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdGFyZ2V0LmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsaWVudHMgdGhhdCBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIFNlcnZlciB0b29saW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXR1cm4gdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcnVudGltZSB0YXJnZXQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZVR5cGVJZCgpIHsKLQkJaW50IHR5cGUgPSAtMTsKLQkJaWYgKGdldERhdGFNb2RlbCgpLmlzUHJvcGVydHlTZXQoREVQTE9ZTUVOVF9UWVBFX0lEKSkKLQkJCXR5cGUgPSBnZXRJbnRQcm9wZXJ0eShERVBMT1lNRU5UX1RZUEVfSUQpOwotCQkvLyBlbHNlIHsKLQkJLy8gSjJFRU5hdHVyZSBuYXR1cmUgPSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKGdldFByb2plY3QoKSk7Ci0JCS8vIGlmIChuYXR1cmUgIT0gbnVsbCkKLQkJLy8gdHlwZSA9IG5hdHVyZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclR5cGUoKTsKLQkJLy8gZWxzZQotCQkvLyB0eXBlID0gZ2V0SW50UHJvcGVydHkoREVQTE9ZTUVOVF9UWVBFX0lEKTsKLQkJLy8gfQotCQlyZXR1cm4gY29tcHV0ZVR5cGVJZCh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVwbG95bWVudERlc2NyaXB0b3JUeXBlMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlVHlwZUlkKGludCBkZXBsb3ltZW50RGVzY3JpcHRvclR5cGUpIHsKLQkJc3dpdGNoIChkZXBsb3ltZW50RGVzY3JpcHRvclR5cGUpIHsKLQkJCWNhc2UgWE1MUmVzb3VyY2UuQVBQTElDQVRJT05fVFlQRSA6Ci0JCQkJcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuRUFSX1RZUEU7Ci0JCQljYXNlIFhNTFJlc291cmNlLkFQUF9DTElFTlRfVFlQRSA6Ci0JCQkJcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuQVBQX0NMSUVOVF9UWVBFOwotCQkJY2FzZSBYTUxSZXNvdXJjZS5FSkJfVFlQRSA6Ci0JCQkJcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuRUpCX1RZUEU7Ci0JCQljYXNlIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRSA6Ci0JCQkJcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEU7Ci0JCQljYXNlIFhNTFJlc291cmNlLlJBUl9UWVBFIDoKLQkJCQlyZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5DT05ORUNUT1JfVFlQRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgdG8gYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBTZXJ2ZXIgdG9vbGluZyBkaXJlY3RseS4KLQkgKiBUaGUgcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSB2ZXJzaW9uIGlkIGFzc29jaWF0ZWQgd2l0aCBhIHJ1bnRpbWUgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZVZlcnNpb25JZCgpIHsKLQkJaW50IHZlcnNpb24gPSAtMTsKLQkJaWYgKGdldERhdGFNb2RlbCgpLmlzUHJvcGVydHlTZXQoSjJFRV9WRVJTSU9OX0lEKSkKLQkJCXZlcnNpb24gPSBnZXRJbnRQcm9wZXJ0eShKMkVFX1ZFUlNJT05fSUQpOwotCQkvLyBlbHNlIHsKLQkJLy8gSjJFRU5hdHVyZSBuYXR1cmUgPSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKGdldFByb2plY3QoKSk7Ci0JCS8vIGlmIChuYXR1cmUgIT0gbnVsbCkKLQkJLy8gdmVyc2lvbiA9IG5hdHVyZS5nZXRKMkVFVmVyc2lvbigpOwotCQkvLyBlbHNlCi0JCS8vIHZlcnNpb24gPSBnZXRJbnRQcm9wZXJ0eShKMkVFX1ZFUlNJT05fSUQpOwotCQkvLyB9Ci0JCXJldHVybiBjb21wdXRlVmVyc2lvbklkKHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVWZXJzaW9uSWQoaW50IHZlcnNpb24pIHsKLQkJc3dpdGNoICh2ZXJzaW9uKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCQlyZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzEyOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuSjJFRV8xMzsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCNkb0dldFZhbGlkUHJvcGVydHlWYWx1ZXMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUlVOVElNRV9UQVJHRVRfSUQpKQotCQkJcmV0dXJuIGdldFZhbGlkU2VydmVyVGFyZ2V0RGVzY3JpcHRvcnMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRTZXJ2ZXJUYXJnZXREZXNjcmlwdG9ycygpIHsKLQkJTGlzdCB0YXJnZXRzID0gZ2V0VmFsaWRTZXJ2ZXJUYXJnZXRzKCk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbnVsbDsKLQkJaWYgKCF0YXJnZXRzLmlzRW1wdHkoKSkgewotCQkJaW50IHNlcnZlclRhcmdldExpc3RTaXplID0gdGFyZ2V0cy5zaXplKCk7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Jbc2VydmVyVGFyZ2V0TGlzdFNpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGFyZ2V0cy5nZXQoaSk7Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHJ1bnRpbWUuZ2V0SWQoKSwgcnVudGltZS5nZXROYW1lKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKMkVFX1ZFUlNJT05fSUQpKSB7Ci0JCQlJUnVudGltZSB0YXJnZXQgPSBnZXRTZXJ2ZXJUYXJnZXRCeUlEKGdldFN0cmluZ1Byb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lEKSk7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJc2V0UHJvcGVydHkoUlVOVElNRV9UQVJHRVRfSUQsIG51bGwpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUlVOVElNRV9UQVJHRVRfSUQsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0gZWxzZSBpZiAoUlVOVElNRV9UQVJHRVRfSUQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXNldFByb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lELCBwcm9wZXJ0eVZhbHVlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgSVJ1bnRpbWUgZ2V0U2VydmVyVGFyZ2V0QnlJRChTdHJpbmcgaWQpIHsKLQkJTGlzdCB0YXJnZXRzID0gZ2V0VmFsaWRTZXJ2ZXJUYXJnZXRzKCk7Ci0JCUlSdW50aW1lIHRhcmdldDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQl0YXJnZXQgPSAoSVJ1bnRpbWUpIHRhcmdldHMuZ2V0KGkpOwotCQkJaWYgKGlkLmVxdWFscyh0YXJnZXQuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHRhcmdldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkU2VydmVyVGFyZ2V0cygpIHsKLQkJTGlzdCB2YWxpZFNlcnZlclRhcmdldHMgPSBudWxsOwotCQkvLyBUT0RPOiBhcGkgaXMgbmVlZGVkIGZyb20gdGhlIHNlcnZlciB0YXJnZXQgaGVscGVyIHRvIGdldCBhbGwgc2VydmVyIHRhcmdldHMKLQkJLy8gdmFsaWRTZXJ2ZXJUYXJnZXRzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMoSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRSwKLQkJLy8gSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzE0KTsKLQkJdmFsaWRTZXJ2ZXJUYXJnZXRzID0gZ2V0U2VydmVyVGFyZ2V0cygiIiwgIiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCWlmICh2YWxpZFNlcnZlclRhcmdldHMgIT0gbnVsbCAmJiB2YWxpZFNlcnZlclRhcmdldHMuaXNFbXB0eSgpKQotCQkJdmFsaWRTZXJ2ZXJUYXJnZXRzID0gbnVsbDsKLQkJaWYgKHZhbGlkU2VydmVyVGFyZ2V0cyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiB2YWxpZFNlcnZlclRhcmdldHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZlclRhcmdldHMoU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCUxpc3QgdGFyZ2V0cyA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRSdW50aW1lcyh0eXBlLCB2ZXJzaW9uKSk7Ci0JCXJldHVybiB0YXJnZXRzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcml2YXRlIExpc3QgZ2V0VmFsaWRTZXJ2ZXJUYXJnZXRzKCkgewotCS8vIExpc3QgdmFsaWRTZXJ2ZXJUYXJnZXRzID0gbnVsbDsKLQkvLyBTdHJpbmcgdHlwZSA9IGNvbXB1dGVUeXBlSWQoKTsKLQkvLyBpZiAodHlwZSAhPSBudWxsKSB7Ci0JLy8gU3RyaW5nIHZlcnNpb24gPSBjb21wdXRlVmVyc2lvbklkKCk7Ci0JLy8gaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCS8vIHZhbGlkU2VydmVyVGFyZ2V0cyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHR5cGUsIHZlcnNpb24pOwotCS8vIGlmICh2YWxpZFNlcnZlclRhcmdldHMgIT0gbnVsbCAmJiB2YWxpZFNlcnZlclRhcmdldHMuaXNFbXB0eSgpKQotCS8vIHZhbGlkU2VydmVyVGFyZ2V0cyA9IG51bGw7Ci0JLy8gfQotCS8vIH0KLQkvLyBpZiAodmFsaWRTZXJ2ZXJUYXJnZXRzID09IG51bGwpCi0JLy8gcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JLy8gcmV0dXJuIHZhbGlkU2VydmVyVGFyZ2V0czsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCNkb1ZhbGlkYXRlUHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUVfVEFSR0VUX0lEKSkKLQkJCXJldHVybiB2YWxpZGF0ZVNlcnZlclRhcmdldCgpOwotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlU2VydmVyVGFyZ2V0KCkgewotCQlMaXN0IHRhcmdldHMgPSBnZXRWYWxpZFNlcnZlclRhcmdldHMoKTsKLQkJaWYgKHRhcmdldHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuU2VydmVyVGFyZ2V0RGF0YU1vZGVsX1VJXzcsIG51bGwpOyAKLQkJfQotCQlJUnVudGltZSB0YXJnZXQgPSBnZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLlNlcnZlclRhcmdldERhdGFNb2RlbF9VSV84LCBudWxsKTsgCi0JCX0gZWxzZSBpZiAoIXRhcmdldHMuY29udGFpbnModGFyZ2V0KSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLlNlcnZlclRhcmdldERhdGFNb2RlbF9VSV85LCBudWxsKTsgCi0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9KMkVFUHJvamVjdFNlcnZlclRhcmdldE9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTUwNjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9KMkVFUHJvamVjdFNlcnZlclRhcmdldE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUmVzb3VyY2VNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXRPcCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25EYXRhTW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXRPcChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsKTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJUYXJnZXRJZCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQpOwotCQlJUnVudGltZSBydW50aW1lID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UnVudGltZShzZXJ2ZXJUYXJnZXRJZCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkKLQkJCXByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRSdW50aW1lVGFyZ2V0KHJ1bnRpbWUsIG1vbml0b3IpOwotCQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5VUERBVEVfTU9EVUxFUykgCi0JCQkJCQkmJiBwcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKSB7Ci0JCQkJCS8vU2VydmVyVGFyZ2V0SGVscGVyLnNldE5ld1NlcnZlclRhcmdldEZvckVBUk1vZHVsZXMocnVudGltZSwgcHJvamVjdCk7Ci0JCQkJCS8vU2VydmVyVGFyZ2V0SGVscGVyLnNldE5ld1NlcnZlclRhcmdldEZvckVBUlV0aWxpdHlKYXJzKHJ1bnRpbWUsIHByb2plY3QpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvU2VydmVyVGFyZ2V0SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvU2VydmVyVGFyZ2V0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWE3MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L1NlcnZlclRhcmdldEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTUsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uZXRvb2xzLmoyZWUuaW50ZXJuYWwucHJvamVjdC5FQVJFZGl0TW9kZWw7Ci0vL2ltcG9ydCBjb20uaWJtLmV0b29scy5qMmVlLmludGVybmFsLnByb2plY3QuRUFSTmF0dXJlUnVudGltZTsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogQGRlcHJlY2F0ZWQgLSBVc2Ugc2VydmVyIGNvcmUgYXBpIHRvIHNldCBSdW50aW1lIFRhcmdldHMuIFVzZSBhcnRpZmFjdCBlZGl0IGFwaSB0bwotICogZ2V0IHRvIGFueSBqMmVlIHJlbGF0ZWQgbWV0aG9kcyBpbiB0aGUgY2xhc3MuCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVGFyZ2V0SGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX05BVFVSRV9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NPTlRBSU5FUiA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUYXJnZXRIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwTm9uU2VydmVyVGFyZ2V0Q2xhc3NwYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCBleGlzdGluZ0NsYXNzcGF0aEVudHJpZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0RXhpc3RpbmdOb25TZXJ2ZXJUYXJnZXRDbGFzc3BhdGgocHJvamVjdCk7Ci0JCWlmICghZXhpc3RpbmdDbGFzc3BhdGhFbnRyaWVzLmlzRW1wdHkoKSkKLQkJCVNlcnZlclRhcmdldEhlbHBlci5yZW1vdmVOb25TZXZlclRhcmdldENsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZXhpc3RpbmdDbGFzc3BhdGhFbnRyaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhpc3RpbmdDbGFzc3BhdGhFbnRyaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5vblNldmVyVGFyZ2V0Q2xhc3NwYXRoRW50cmllcyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IGV4aXN0aW5nQ2xhc3NwYXRoRW50cmllcykgewotCQl0cnkgewotCQkJSmVtUHJvamVjdFV0aWxpdGllcy5yZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwcm9qZWN0LCBleGlzdGluZ0NsYXNzcGF0aEVudHJpZXMpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Ioam1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIHN5bmNOb1NlcnZlclRhcmdldEZvckVBUk1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCS8vIHJlbW92ZVNlcnZlclRhcmdldEZvckVBUk1vZHVsZVByb2plY3RzKHByb2plY3QpOwotCS8vIHJlbW92ZVNlcnZlclRhcmdldEZvckVBUlV0aWxzUHJvamVjdChwcm9qZWN0KTsKLQkvLyB9Ci0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2VydmVyVGFyZ2V0Rm9yRUFSKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4KLQkvLyB1cGRhdGVNb2R1bGVzKSB7Ci0JLy8gLy9XZSBkb24ndCBuZWVkIHRvIHJlbW92ZSBhIHNlcnZlciB0YXJnZXQgYW55b21yZSBhcyBpdCBuZWVkIHRvIGJlCi0JLy8gLy8gdGhlcmUKLQkvLyAvL1NlcnZlclRhcmdldE1hbmFnZXIucmVtb3ZlU2VydmVyVGFyZ2V0KHByb2plY3QsIG51bGwpOwotCS8vIGlmICh1cGRhdGVNb2R1bGVzKSB7Ci0JLy8gcmVtb3ZlU2VydmVyVGFyZ2V0Rm9yRUFSTW9kdWxlUHJvamVjdHMocHJvamVjdCk7Ci0JLy8gcmVtb3ZlU2VydmVyVGFyZ2V0Rm9yRUFSVXRpbHNQcm9qZWN0KHByb2plY3QpOwotCS8vIH0KLQkvLyB9Ci0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVNlcnZlclRhcmdldEZvckVBUk1vZHVsZVByb2plY3RzKElQcm9qZWN0Ci0JLy8gcHJvamVjdCkgewotCS8vIExpc3QgbW9kdWxlUHJvamVjdHMgPQotCS8vIFNlcnZlclRhcmdldEhlbHBlci5nZXRBbGxFYXJNb2R1bGVQcm9qZWN0cyhwcm9qZWN0KTsKLQkvLyBpZiAoIW1vZHVsZVByb2plY3RzLmlzRW1wdHkoKSkgewotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkvLyBJUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gKElQcm9qZWN0KSBtb2R1bGVQcm9qZWN0cy5nZXQoaSk7Ci0JLy8gU2VydmVyVGFyZ2V0VHlwZSB0dCA9Ci0JLy8gU2VydmVyVGFyZ2V0TWFuYWdlci5nZXRTZXJ2ZXJUYXJnZXRUeXBlKG1vZHVsZVByb2plY3QpOwotCS8vIGlmICh0dCAhPSBudWxsKSB7Ci0JLy8gSjJFRUphdmFQcm9qZWN0SW5mbyBpbmZvID0gZ2V0TmV3SjJFRVByb2plY3RJbmZvKG1vZHVsZVByb2plY3QpOwotCS8vIGlmIChpbmZvICE9IG51bGwpIHsKLQkvLyBpbmZvLnNldFByb2plY3QobW9kdWxlUHJvamVjdCk7Ci0JLy8gdHJ5IHsKLQkvLyBpbmZvLmNhbGN1bGF0ZVNlcnZlckNsYXNzcGF0aEVudHJpZXMoKTsKLQkvLyBpbmZvLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKGluZm8uZ2V0Q2xhc3NwYXRoRW50cmllcygpLCBudWxsKTsKLQkvLyB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JLy8gTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKGptZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVNlcnZlclRhcmdldEZvckVBUlV0aWxzUHJvamVjdChJUHJvamVjdAotCS8vIHByb2plY3QpIHsKLQkvLyBFQVJOYXR1cmVSdW50aW1lIG5hdHVyZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQkvLyBFQVJFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkvLyBPYmplY3Qga2V5ID0gbmV3IFNlcnZlclRhcmdldEhlbHBlcigpOwotCS8vIHRyeSB7Ci0JLy8gZWRpdE1vZGVsID0gbmF0dXJlLmdldEVhckVkaXRNb2RlbEZvclJlYWQoa2V5KTsKLQkvLyBMaXN0IHV0aWxQcm9qZWN0cyA9Ci0JLy8gU2VydmVyVGFyZ2V0SGVscGVyLmdldEFsbEVhclV0aWxpdHlQcm9qZWN0cyhlZGl0TW9kZWwsIHByb2plY3QpOwotCS8vIGlmICghdXRpbFByb2plY3RzLmlzRW1wdHkoKSkgewotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdXRpbFByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JLy8gSVByb2plY3QgbW9kdWxlUHJvamVjdCA9IChJUHJvamVjdCkgdXRpbFByb2plY3RzLmdldChpKTsKLQkvLyAvL1dlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIGEgc2VydmVyIHRhcmdldCBhbnlvbXJlIGFzIGl0IG5lZWQgdG8gYmUgdGhlcmUKLQkvLyAvL1NlcnZlclRhcmdldFR5cGUgZXhpc3RpbmdUYXJnZXRUeXBlID0KLQkvLyAvLyBTZXJ2ZXJUYXJnZXRNYW5hZ2VyLmdldFNlcnZlclRhcmdldFR5cGUobW9kdWxlUHJvamVjdCk7Ci0JLy8gLy9pZiAoZXhpc3RpbmdUYXJnZXRUeXBlICE9IG51bGwpIHsKLQkvLyAvL2lmICghZWRpdE1vZGVsLmlzRWpiQ2xpZW50SmFyUHJvamVjdChtb2R1bGVQcm9qZWN0KSkKLQkvLyAvL1dlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIGEgc2VydmVyIHRhcmdldCBhbnlvbXJlIGFzIGl0Ci0JLy8gLy8gbmVlZCB0byBiZSB0aGVyZQotCS8vIC8vU2VydmVyVGFyZ2V0TWFuYWdlci5yZW1vdmVTZXJ2ZXJUYXJnZXQobW9kdWxlUHJvamVjdCxudWxsKTsKLQkvLyAvL2Vsc2UKLQkvLyAvLyByZW1vdmVTZXJ2ZXJUYXJnZXRGb3JFSkJDbGllbnRKYXIobW9kdWxlUHJvamVjdCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9IGZpbmFsbHkgewotCS8vIGVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKGtleSk7Ci0JLy8gfQotCS8vIH0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlUHJvamVjdAotCSAqLwotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTZXJ2ZXJUYXJnZXRGb3JFSkJDbGllbnRKYXIoSVByb2plY3QKLQkvLyBlamJDbGllbnRKYXJQcm9qZWN0KSB7Ci0JLy8gRWpiTW9kdWxlRXh0ZW5zaW9uIGVqYkV4dCA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKCk7Ci0JLy8gSjJFRUphdmFQcm9qZWN0SW5mbyBpbmZvID0gZWpiRXh0LmNyZWF0ZVByb2plY3RJbmZvKCk7Ci0JLy8gaWYgKGluZm8gIT0gbnVsbCkgewotCS8vIGluZm8uc2V0UHJvamVjdChlamJDbGllbnRKYXJQcm9qZWN0KTsKLQkvLyB0cnkgewotCS8vIGluZm8uY2FsY3VsYXRlU2VydmVyQ2xhc3NwYXRoRW50cmllcygpOwotCS8vIGluZm8uZ2V0SmF2YVByb2plY3QoKS5zZXRSYXdDbGFzc3BhdGgoaW5mby5nZXRDbGFzc3BhdGhFbnRyaWVzKCksIG51bGwpOwotCS8vIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkvLyBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2Uoam1lKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2VydmVyVGFyZ2V0T25Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZwotCS8vIHByb2plY3RUeXBlKSB7Ci0JLy8gc2V0U2VydmVyQ2xhc3NQYXRoRm9ySjJFRVByb2plY3QocHJvamVjdCwgcHJvamVjdFR5cGUpOwotCS8vIH0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXJDbGFzc1BhdGhGb3JKMkVFUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCS8vIFN0cmluZyBwcm9qZWN0VHlwZSkgewotCS8vIHRyeSB7Ci0JLy8gSjJFRUphdmFQcm9qZWN0SW5mbyBpbmZvID0gZ2V0TmV3SjJFRVByb2plY3RJbmZvKHByb2plY3QsIHByb2plY3RUeXBlKTsKLQkvLyBpZiAoaW5mbyAhPSBudWxsKSB7Ci0JLy8gaW5mby5zZXRQcm9qZWN0KHByb2plY3QpOwotCS8vIGluZm8uY2FsY3VsYXRlU2VydmVyQ2xhc3NwYXRoRW50cmllcygpOwotCS8vIGluZm8uZ2V0SmF2YVByb2plY3QoKS5zZXRSYXdDbGFzc3BhdGgoaW5mby5nZXRDbGFzc3BhdGhFbnRyaWVzKCksIG51bGwpOwotCS8vIH0KLQkvLyB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JLy8gTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGptZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBwdWJsaWMgc3RhdGljIEoyRUVKYXZhUHJvamVjdEluZm8gZ2V0TmV3SjJFRVByb2plY3RJbmZvKElQcm9qZWN0IHByb2plY3QsCi0JLy8gU3RyaW5nIHByb2plY3RUeXBlKQotCS8vIHsKLQkvLyBpZiAocHJvamVjdFR5cGUuZXF1YWxzKElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuQVBQX0NMSUVOVF9UWVBFKSkKLQkvLyByZXR1cm4gbmV3IEFwcGxpY2F0aW9uQ2xpZW50UHJvamVjdEluZm8oKTsKLQkvLyBlbHNlIGlmIChwcm9qZWN0VHlwZS5lcXVhbHMoSVNlcnZlclRhcmdldENvbnN0YW50cy5XRUJfVFlQRSkpIHsKLQkvLyBXZWJNb2R1bGVFeHRlbnNpb24gd2ViRXh0ID0gRWFyTW9kdWxlTWFuYWdlci5nZXRXZWJNb2R1bGVFeHRlbnNpb24oKTsKLQkvLyBKMkVFSmF2YVByb2plY3RJbmZvIGluZm8gPSB3ZWJFeHQuY3JlYXRlUHJvamVjdEluZm8oKTsKLQkvLyBTdHJpbmcgd2ViTmF0dXJlID0gSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZUlEKHByb2plY3QpOwotCS8vIGluZm8uc2V0SjJFRVZlcnNpb24od2ViTmF0dXJlLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKQotCS8vID8KLQkvLyBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkvLyByZXR1cm4gaW5mbzsKLQkvLyB9IGVsc2UgaWYgKHByb2plY3RUeXBlLmVxdWFscyhJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVKQl9UWVBFKSkgewotCS8vIEVqYk1vZHVsZUV4dGVuc2lvbiBlamJFeHQgPSBFYXJNb2R1bGVNYW5hZ2VyLmdldEVKQk1vZHVsZUV4dGVuc2lvbigpOwotCS8vIHJldHVybiBlamJFeHQuY3JlYXRlUHJvamVjdEluZm8oKTsKLQkvLyB9IGVsc2UgaWYgKHByb2plY3RUeXBlLmVxdWFscyhJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFKSkgewotCS8vIEpjYU1vZHVsZUV4dGVuc2lvbiBqY2FFeHQgPSBFYXJNb2R1bGVNYW5hZ2VyLmdldEpDQU1vZHVsZUV4dGVuc2lvbigpOwotCS8vIHJldHVybiBqY2FFeHQuY3JlYXRlUHJvamVjdEluZm8oKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIHB1YmxpYyBzdGF0aWMgSjJFRUphdmFQcm9qZWN0SW5mbyBnZXROZXdKMkVFUHJvamVjdEluZm8oSVByb2plY3QgcHJvamVjdCkKLQkvLyB7Ci0JLy8gaWYgKEoyRUVOYXR1cmUuaGFzUnVudGltZShwcm9qZWN0LCBJRUpCTmF0dXJlQ29uc3RhbnRzLkVKQl9OQVRVUkVfSURTKSkgewotCS8vIEVqYk1vZHVsZUV4dGVuc2lvbiBlamJFeHQgPSBFYXJNb2R1bGVNYW5hZ2VyLmdldEVKQk1vZHVsZUV4dGVuc2lvbigpOwotCS8vIHJldHVybiBlamJFeHQuY3JlYXRlUHJvamVjdEluZm8oKTsKLQkvLyB9IGVsc2UgaWYgKEoyRUVOYXR1cmUuaGFzUnVudGltZShwcm9qZWN0LAotCS8vIElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKSB7Ci0JLy8gV2ViTW9kdWxlRXh0ZW5zaW9uIHdlYkV4dCA9IEVhck1vZHVsZU1hbmFnZXIuZ2V0V2ViTW9kdWxlRXh0ZW5zaW9uKCk7Ci0JLy8gcmV0dXJuIHdlYkV4dC5jcmVhdGVQcm9qZWN0SW5mbygpOwotCS8vIH0gZWxzZSBpZiAoQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lLmhhc1J1bnRpbWUocHJvamVjdCkpCi0JLy8gcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkNsaWVudFByb2plY3RJbmZvKCk7Ci0JLy8gZWxzZSBpZiAoSjJFRU5hdHVyZS5oYXNSdW50aW1lKHByb2plY3QsCi0JLy8gSUNvbm5lY3Rvck5hdHVyZUNvbnN0YW50cy5DT05ORUNUT1JfTkFUVVJFX0lEKSkgewotCS8vIEpjYU1vZHVsZUV4dGVuc2lvbiBqY2FFeHQgPSBFYXJNb2R1bGVNYW5hZ2VyLmdldEpDQU1vZHVsZUV4dGVuc2lvbigpOwotCS8vIHJldHVybiBqY2FFeHQuY3JlYXRlUHJvamVjdEluZm8oKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotLy8JcHVibGljIHN0YXRpYyB2b2lkIHNldE5ld1NlcnZlclRhcmdldEZvckVBUk1vZHVsZXMoSVJ1bnRpbWUgbmV3U2VydmVyVGFyZ2V0LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJTGlzdCBtb2R1bGVQcm9qZWN0cyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRBbGxFYXJNb2R1bGVQcm9qZWN0cyhwcm9qZWN0KTsKLS8vCQlpZiAoIW1vZHVsZVByb2plY3RzLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlJUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gKElQcm9qZWN0KSBtb2R1bGVQcm9qZWN0cy5nZXQoaSk7Ci0vLwkJCQlTdHJpbmdbXSBwcm9qZWN0QXR0ciA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRQcm9qZWN0VHlwZUFuZEoyRUVMZXZlbChtb2R1bGVQcm9qZWN0KTsKLS8vCQkJCWlmIChwcm9qZWN0QXR0clswXSAhPSBudWxsICYmIHByb2plY3RBdHRyWzFdICE9IG51bGwpIHsKLS8vCQkJCQlJUnVudGltZSBleGlzdGluZ1RhcmdldFR5cGUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKG1vZHVsZVByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLS8vCQkJCQlpZiAoZXhpc3RpbmdUYXJnZXRUeXBlICE9IG51bGwpIHsKLS8vCQkJCQkJaWYgKCFleGlzdGluZ1RhcmdldFR5cGUuZ2V0SWQoKS5lcXVhbHMobmV3U2VydmVyVGFyZ2V0LmdldElkKCkpKQotLy8JCQkJCQkJc2V0U2VydmVyVGFyZ2V0Rm9yTW9kdWxlUHJvamVjdChuZXdTZXJ2ZXJUYXJnZXQsIG1vZHVsZVByb2plY3QsIHByb2plY3RBdHRyKTsKLS8vCQkJCQkJLy8gVE9ETyBNb3ZlIHRoZSBXTFAgc3luYyB0byB0aGlzIG1ldGhvZAotLy8JCQkJCX0gZWxzZQotLy8JCQkJCQlzZXRTZXJ2ZXJUYXJnZXRGb3JNb2R1bGVQcm9qZWN0KG5ld1NlcnZlclRhcmdldCwgbW9kdWxlUHJvamVjdCwgcHJvamVjdEF0dHIpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0Rm9yTW9kdWxlUHJvamVjdChJUnVudGltZSBuZXdTZXJ2ZXJUYXJnZXQsIElQcm9qZWN0IG1vZHVsZVByb2plY3QsIFN0cmluZ1tdIHByb2plY3RBdHRyKSB7Ci0vLwkJU2VydmVyVGFyZ2V0SGVscGVyLmNsZWFuVXBOb25TZXJ2ZXJUYXJnZXRDbGFzc3BhdGgobW9kdWxlUHJvamVjdCk7Ci0vLwkJc2V0U2VydmVyVGFyZ2V0KG1vZHVsZVByb2plY3QsIG5ld1NlcnZlclRhcmdldCwgbnVsbCk7Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXZWJQcm9qZWN0c0luRUFSKElQcm9qZWN0IGVhclByb2plY3QpIHsKLS8vCQlMaXN0IG1vZHVsZVByb2plY3RzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldEFsbEVhck1vZHVsZVByb2plY3RzKGVhclByb2plY3QpOwotLy8JCWlmICghbW9kdWxlUHJvamVjdHMuaXNFbXB0eSgpKSB7Ci0vLwkJCUxpc3Qgd2ViUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZHVsZVByb2plY3RzLmdldChpKTsKLS8vCQkJCVdlYk1vZHVsZUV4dGVuc2lvbiB3ZWJFeHQgPSBFYXJNb2R1bGVNYW5hZ2VyLmdldFdlYk1vZHVsZUV4dGVuc2lvbigpOwotLy8JCQkJaWYgKHdlYkV4dC5oYXNSdW50aW1lKHByb2plY3QpKQotLy8JCQkJCXdlYlByb2plY3RzLmFkZChwcm9qZWN0KTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gd2ViUHJvamVjdHM7Ci0vLwkJfQotLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1NlcnZlclRhcmdldAotCSAqIEBwYXJhbSB0dAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmV3U2VydmVyVGFyZ2V0Rm9yRUFSVXRpbGl0eUphcnMoSVJ1bnRpbWUgbmV3U2VydmVyVGFyZ2V0LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJRUFSTmF0dXJlUnVudGltZSBuYXR1cmUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0vLwkJT2JqZWN0IGtleSA9IG5ldyBTZXJ2ZXJUYXJnZXRIZWxwZXIoKTsKLS8vCQl0cnkgewotLy8JCQllZGl0TW9kZWwgPSBuYXR1cmUuZ2V0RWFyRWRpdE1vZGVsRm9yUmVhZChrZXkpOwotLy8JCQlMaXN0IHV0aWxQcm9qZWN0cyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRBbGxFYXJVdGlsaXR5UHJvamVjdHMoZWRpdE1vZGVsLCBwcm9qZWN0KTsKLS8vCQkJaWYgKCF1dGlsUHJvamVjdHMuaXNFbXB0eSgpKSB7Ci0vLwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHV0aWxQcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQkJCUlQcm9qZWN0IG1vZHVsZVByb2plY3QgPSAoSVByb2plY3QpIHV0aWxQcm9qZWN0cy5nZXQoaSk7Ci0vLwkJCQkJSVJ1bnRpbWUgZXhpc3RpbmdUYXJnZXRUeXBlID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhtb2R1bGVQcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0vLwkJCQkJaWYgKGV4aXN0aW5nVGFyZ2V0VHlwZSAhPSBudWxsKSB7Ci0vLwkJCQkJCWlmICghZXhpc3RpbmdUYXJnZXRUeXBlLmdldElkKCkuZXF1YWxzKG5ld1NlcnZlclRhcmdldC5nZXRJZCgpKSkgewotLy8JCQkJCQkJc2V0U2VydmVyVGFyZ2V0Rm9yVXRpbFByb2plY3QobmV3U2VydmVyVGFyZ2V0LCBtb2R1bGVQcm9qZWN0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCXNldFNlcnZlclRhcmdldEZvclV0aWxQcm9qZWN0KG5ld1NlcnZlclRhcmdldCwgbW9kdWxlUHJvamVjdCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3Moa2V5KTsKLS8vCQl9Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXRGb3JVdGlsUHJvamVjdChJUnVudGltZSBuZXdTZXJ2ZXJUYXJnZXQsIElQcm9qZWN0IG1vZHVsZVByb2plY3QpIHsKLS8vCQlTZXJ2ZXJUYXJnZXRIZWxwZXIuY2xlYW5VcE5vblNlcnZlclRhcmdldENsYXNzcGF0aChtb2R1bGVQcm9qZWN0KTsKLS8vCQlzZXRTZXJ2ZXJUYXJnZXQobW9kdWxlUHJvamVjdCwgbmV3U2VydmVyVGFyZ2V0LCBudWxsKTsKLS8vCX0KLQotLy8JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlclRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLS8vCQl0cnkgewotLy8JCQlTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLnNldFJ1bnRpbWVUYXJnZXQocnVudGltZSwgbW9uaXRvcik7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotLy8JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJQcm9qZWN0Ci0JICovCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsRWFyTW9kdWxlUHJvamVjdHMoSVByb2plY3QgZWFyUHJvamVjdCkgewotLy8JCUVBUk5hdHVyZVJ1bnRpbWUgbmF0dXJlID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotLy8JCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBudWxsOwotLy8JCUxpc3QgbW9kdWxlUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJT2JqZWN0IGtleSA9IG5ldyBTZXJ2ZXJUYXJnZXRIZWxwZXIoKTsKLS8vCQl0cnkgewotLy8JCQllZGl0TW9kZWwgPSBuYXR1cmUuZ2V0RWFyRWRpdE1vZGVsRm9yUmVhZChrZXkpOwotLy8JCQlTZXQgYWxsTW9kdWxlUHJvamVjdHMgPSBlZGl0TW9kZWwuZ2V0TW9kdWxlTWFwcGVkTW9kdWxlUHJvamVjdHMoKTsKLS8vCQkJaWYgKCFhbGxNb2R1bGVQcm9qZWN0cy5pc0VtcHR5KCkpCi0vLwkJCQltb2R1bGVQcm9qZWN0cy5hZGRBbGwoYWxsTW9kdWxlUHJvamVjdHMpOwotLy8JCQlyZXR1cm4gbW9kdWxlUHJvamVjdHM7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKQotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3Moa2V5KTsKLS8vCQl9Ci0vLwl9Ci0vLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvamVjdFR5cGVBbmRKMkVFTGV2ZWwoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm9qZWN0QXR0ciA9IG5ldyBTdHJpbmdbMl07Ci0vLwkJYm9vbGVhbiBpc0oyRUUxMyA9IHRydWU7Ci0vLwkJaWYgKEVBUk5hdHVyZVJ1bnRpbWUuaGFzUnVudGltZShwcm9qZWN0KSkgewotLy8JCQlwcm9qZWN0QXR0clswXSA9IElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuRUFSX1RZUEU7Ci0vLwkJCWlzSjJFRTEzID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpLmlzSjJFRTFfMygpOwotLy8JCX0gZWxzZSBpZiAoSjJFRU5hdHVyZS5oYXNSdW50aW1lKHByb2plY3QsIElFSkJOYXR1cmVDb25zdGFudHMuRUpCX05BVFVSRV9JRFMpKSB7Ci0vLwkJCXByb2plY3RBdHRyWzBdID0gSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRTsKLS8vCQkJaXNKMkVFMTMgPSBKMkVFTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdCwgSUVKQk5hdHVyZUNvbnN0YW50cy5FSkJfTkFUVVJFX0lEUykuaXNKMkVFMV8zKCk7Ci0vLwkJfSBlbHNlIGlmIChKMkVFTmF0dXJlLmhhc1J1bnRpbWUocHJvamVjdCwgSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpIHsKLS8vCQkJcHJvamVjdEF0dHJbMF0gPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFOwotLy8JCQlpc0oyRUUxMyA9IEoyRUVOYXR1cmUuZ2V0UnVudGltZShwcm9qZWN0LCBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKS5pc0oyRUUxXzMoKTsKLS8vCQl9IGVsc2UgaWYgKEoyRUVOYXR1cmUuaGFzUnVudGltZShwcm9qZWN0LElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCXByb2plY3RBdHRyWzBdID0gSVNlcnZlclRhcmdldENvbnN0YW50cy5BUFBfQ0xJRU5UX1RZUEU7Ci0vLwkJCWlzSjJFRTEzID0gSjJFRU5hdHVyZS5nZXRSdW50aW1lKHByb2plY3QsSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkuaXNKMkVFMV8zKCk7Ci0vLwkJfSBlbHNlIGlmIChKMkVFTmF0dXJlLmhhc1J1bnRpbWUocHJvamVjdCwgSUNvbm5lY3Rvck5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCXByb2plY3RBdHRyWzBdID0gSVNlcnZlclRhcmdldENvbnN0YW50cy5DT05ORUNUT1JfVFlQRTsKLS8vCQkJaXNKMkVFMTMgPSBKMkVFTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdCwgSUNvbm5lY3Rvck5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpLmlzSjJFRTFfMygpOwotLy8JCX0gZWxzZSBpZiAoaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkKLS8vCQkJcHJvamVjdEF0dHJbMF0gPSBudWxsOwotLy8JCWlmIChwcm9qZWN0QXR0clswXSAhPSBudWxsICYmIHByb2plY3RBdHRyWzBdLmxlbmd0aCgpID4gMCkgewotLy8JCQlpZiAoaXNKMkVFMTMpCi0vLwkJCQlwcm9qZWN0QXR0clsxXSA9IElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuSjJFRV8xMzsKLS8vCQkJZWxzZQotLy8JCQkJcHJvamVjdEF0dHJbMV0gPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0vLwkJfQotCQlyZXR1cm4gcHJvamVjdEF0dHI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0phdmFOYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKEpBVkFfTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKGNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxFYXJVdGlsaXR5UHJvamVjdHMoRUFSRWRpdE1vZGVsIGVhckVkaXRNb2RlbCwgSVByb2plY3QgZWFyUHJvamVjdCkgewotLy8JCUxpc3QgdXRpbGl0eVByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVNldCB1dGlsUHJvamVjdHMgPSBlYXJFZGl0TW9kZWwuZ2V0TW9kdWxlTWFwcGVkVXRpbGl0eUphclByb2plY3RzKCk7Ci0vLwkJaWYgKCF1dGlsUHJvamVjdHMuaXNFbXB0eSgpKQotLy8JCQl1dGlsaXR5UHJvamVjdHMuYWRkQWxsKHV0aWxQcm9qZWN0cyk7Ci0vLwkJcmV0dXJuIHV0aWxpdHlQcm9qZWN0czsKLS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEV4aXN0aW5nU2VydmVyVGFyZ2V0SW5kZXgoTGlzdCB2YWxpZFNlcnZlclRhcmdldHMsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHZhbGlkU2VydmVyVGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlJUnVudGltZSBzdCA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJaWYgKHN0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkU2VydmVyVGFyZ2V0cy5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoKChJUnVudGltZSkgdmFsaWRTZXJ2ZXJUYXJnZXRzLmdldChpKSkuZ2V0SWQoKSA9PSBzdC5nZXRJZCgpKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RXhpc3RpbmdOb25TZXJ2ZXJUYXJnZXRDbGFzc3BhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlpbnQgc2l6ZSA9IGNwLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpbnQgZW50cnlLaW5kID0gY3BbaV0uZ2V0RW50cnlLaW5kKCk7Ci0JCQkJCWlmIChlbnRyeUtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgJiYgZW50cnlLaW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiBlbnRyeUtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUICYmIChlbnRyeUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAmJiBpc1dBU1ZhcmlhYmxlKGNwW2ldKSkgJiYgKGVudHJ5S2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiB8fCAhY3BbaV0uZ2V0UGF0aCgpLnNlZ21lbnQoMCkuZXF1YWxzKFNFUlZFUl9DT05UQUlORVIpKSkgewotCQkJCQkJbGlzdC5hZGQoY3BbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV0FTVmFyaWFibGUoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCS8vIFRPRE8gVGhpcyBpcyBubyBsb25nZXIgdmFsaWQgaW4gdGhlIGJhc2UuCi0JCS8vIElQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCS8vIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSAhPSAwKSB7Ci0JCS8vIFN0cmluZyBjbGFzc3BhdGhWYXJpYWJsZSA9IHBhdGguc2VnbWVudCgwKTsKLQkJLy8gcmV0dXJuCi0JCS8vIGNsYXNzcGF0aFZhcmlhYmxlLmVxdWFscyhJRUpCTmF0dXJlQ29uc3RhbnRzLldBU19QTFVHSU5ESVJfVkFSSUFCTEUpCi0JCS8vIHx8Ci0JCS8vIGNsYXNzcGF0aFZhcmlhYmxlLmVxdWFscyhJRUpCTmF0dXJlQ29uc3RhbnRzLldBU181MF9QTFVHSU5ESVJfVkFSSUFCTEUpCi0JCS8vIHx8Ci0JCS8vIGNsYXNzcGF0aFZhcmlhYmxlLmVxdWFscyhJRUpCTmF0dXJlQ29uc3RhbnRzLlNFUlZFUkpES181MF9QTFVHSU5ESVJfVkFSSUFCTEUpCi0JCS8vIHx8Ci0JCS8vIGNsYXNzcGF0aFZhcmlhYmxlLmVxdWFscyhJRUpCTmF0dXJlQ29uc3RhbnRzLlNFUlZFUkpES19QTFVHSU5ESVJfVkFSSUFCTEUpCi0JCS8vIHx8IGNsYXNzcGF0aFZhcmlhYmxlLmVxdWFscyhKMkVFUGx1Z2luLlNPQVBfUExVR0lORElSX1ZBUklBQkxFKQotCQkvLyB8fCBjbGFzc3BhdGhWYXJpYWJsZS5lcXVhbHMoSjJFRVBsdWdpbi5TT0FQU0VDX1BMVUdJTkRJUl9WQVJJQUJMRSk7Ci0JCS8vIC8vfHwgY2xhc3NwYXRoVmFyaWFibGUuZXF1YWxzKEoyRUVQbHVnaW4uWEVSQ0VTX0lNUExfVkFSSUFCTEUpCi0JCS8vIC8vfHwgY2xhc3NwYXRoVmFyaWFibGUuZXF1YWxzKEoyRUVQbHVnaW4uWEVSQ0VTX1BMVUdJTkRJUl9WQVJJQUJMRSkKLQkJLy8gLy98fCBjbGFzc3BhdGhWYXJpYWJsZS5lcXVhbHMoSjJFRVBsdWdpbi5XT1JGX1BMVUdJTkRJUl9WQVJJQUJMRSkKLQkJLy8gLy98fCBjbGFzc3BhdGhWYXJpYWJsZS5lcXVhbHMoSjJFRVBsdWdpbi5NQUlMX0NMQVNTUEFUSF9WQVJJQUJMRSkKLQkJLy8gLy98fAotCQkvLyBjbGFzc3BhdGhWYXJpYWJsZS5lcXVhbHMoSjJFRVBsdWdpbi5BQ1RJVkFUSU9OX0NMQVNTUEFUSF9WQVJJQUJMRSk7Ci0JCS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJQcm9qZWN0Ci0JICogQHBhcmFtIHN0Ci0JICogQHJldHVybgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBib29sZWFuIHNlcnZlclRhcmdldFZhbGlkRm9yRUFSKElQcm9qZWN0IGVhclByb2plY3QsIElSdW50aW1lIHN0KSB7Ci0vLwkJcmV0dXJuICEoSjJFRU5hdHVyZS5oYXNSdW50aW1lKGVhclByb2plY3QsIElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSAmJiBzdC5nZXRJZCgpLmVxdWFscyhJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLmFlc1Y0U2VydmVyVGFyZ2V0SWQpKTsKLS8vCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJUYXJnZXRzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0IHRhcmdldHMgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0UnVudGltZXModHlwZSwgdmVyc2lvbikpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIElUYXJnZXRUeXBlIGdldFY1MFRhcmdldFR5cGUoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlclRhcmdldCB2NTBTZXJ2ZXJUYXJnZXQpIHsKLQkgKiBpZiAoSjJFRU5hdHVyZS5oYXNSdW50aW1lKHByb2plY3QsIElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkgcmV0dXJuCi0JICogU2VydmVyVGFyZ2V0TWFuYWdlci5nZXRUYXJnZXRUeXBlKHY1MFNlcnZlclRhcmdldCwgSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRSk7IGlmCi0JICogKEoyRUVOYXR1cmUuaGFzUnVudGltZShwcm9qZWN0LCBJQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkgcmV0dXJuCi0JICogU2VydmVyVGFyZ2V0TWFuYWdlci5nZXRUYXJnZXRUeXBlKHY1MFNlcnZlclRhcmdldCwgSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRSk7IGVsc2UgaWYKLQkgKiAoSjJFRU5hdHVyZS5oYXNSdW50aW1lKHByb2plY3QsIElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkgcmV0dXJuCi0JICogU2VydmVyVGFyZ2V0TWFuYWdlci5nZXRUYXJnZXRUeXBlKHY1MFNlcnZlclRhcmdldCwgSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRSk7IGVsc2UgaWYKLQkgKiAoSjJFRU5hdHVyZS5oYXNSdW50aW1lKHByb2plY3QsIElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKSByZXR1cm4KLQkgKiBTZXJ2ZXJUYXJnZXRNYW5hZ2VyLmdldFRhcmdldFR5cGUodjUwU2VydmVyVGFyZ2V0LCBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFKTsgcmV0dXJuCi0JICogbnVsbDsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L1RhcmdldFJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9UYXJnZXRSdW50aW1lRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzM0YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L1RhcmdldFJ1bnRpbWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiBAZGVwcmVjYXRlZAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0UnVudGltZUV4dGVuc2lvbiB7Ci0JU3RyaW5nIGdyb3VwSUQ7Ci0JU3RyaW5nIGNsYXNzTmFtZTsKLQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLQlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBUYXJnZXRSdW50aW1lRXh0ZW5zaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYXJnZXRSdW50aW1lRXh0ZW5zaW9uKFBsdWdpbiBhUGx1Z2luLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGdyb3VwSWQsIFN0cmluZyBoYW5kbGVyQ2xhc3MpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gYVBsdWdpbjsKLQkJY29uZmlnRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWdyb3VwSUQgPSBncm91cElkOwotCQljbGFzc05hbWUgPSBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJZCgpIHsKLQkJcmV0dXJuIGdyb3VwSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwSWQoU3RyaW5nIHN0cmluZykgewotCQlncm91cElEID0gc3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRUpCVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0VKQlV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQwYzlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRUpCVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ3JlYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEVKQlV0aWxpdGllcyBleHRlbmRzIEphdmFFRVByb2plY3RVdGlsaXRpZXMgewotCi0JcHVibGljIEVKQlV0aWxpdGllcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRFSkJDbGllbnRKYXIoSVZpcnR1YWxDb21wb25lbnQgZWpiQ29tcG9uZW50KXsKLQkJaWYoIWVqYkNvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCXJldHVybiBnZXRFSkJDbGllbnRKYXIoZWpiQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZihlamJDb21wb25lbnQuaXNCaW5hcnkoKSl7Ci0JCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG51bGw7IAotCQkJCXRyeXsKLQkJCQkJaGVscGVyID0gbmV3IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihlamJDb21wb25lbnQpOwotCQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFyY2hpdmUgPSBoZWxwZXIuYWNjZXNzQXJjaGl2ZSgpOwotCQkJCQkJSVBhdGggZGRQYXRoID0gbmV3IFBhdGgoIk1FVEEtSU5GL2VqYi1qYXIueG1sIik7Ci0JCQkJCQlpZihhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKGRkUGF0aCkpewotCQkJCQkJCU9iamVjdCBqYXIgPSBhcmNoaXZlLmdldE1vZGVsT2JqZWN0KGRkUGF0aCk7Ci0JCQkJCQkJU3RyaW5nIGNsaWVudEpBUiA9IG51bGw7Ci0JCQkJCQkJaWYgKGphciAhPSBudWxsKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKGphciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWNsaWVudEpBUiA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcilqYXIpLmdldEVqYkNsaWVudEphcigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGphciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcikKLQkJCQkJCQkJewotCQkJCQkJCQkJY2xpZW50SkFSID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpamFyKS5nZXRFamJDbGllbnRKYXIoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY2xpZW50SkFSICE9IG51bGwpIHsKLQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWpiQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaWYgKHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKS5lcXVhbHMoY2xpZW50SkFSKSkgewotCQkJCQkJCQkJCXJldHVybiByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCl7Ci0JCQkJCQkJaGVscGVyLnJlbGVhc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYoaGVscGVyICE9IG51bGwpewotCQkJCQkJaGVscGVyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBJVmlydHVhbENvbXBvbmVudCBvZiB0aGUgRUpCQ2xpZW50SmFyIGZvciBhIGdpdmVuIEVKQiBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIElWaXJ0dWFsQ29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRFSkJDbGllbnRKYXIoSVByb2plY3QgZWpiUHJvamVjdCkgewotCQlPYmplY3QgamFyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlamJQcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBlamJDb21wb25lbnQsIGVqYkNsaWVudENvbXBvbmVudCA9IG51bGw7Ci0JCWVqYkNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVqYlByb2plY3QpOwotCQlpZiAoZWpiQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUHJvcGVydGllcyBwcm9wcyA9IGVqYkNvbXBvbmVudC5nZXRNZXRhUHJvcGVydGllcygpOwotCQlTdHJpbmcgY2xpZW50Q29tcE5hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShDcmVhdGlvbkNvbnN0YW50cy5FSkJfQ0xJRU5UX05BTUUpOwotCQlpZiAoY2xpZW50Q29tcE5hbWUgIT0gbnVsbCAmJiAhY2xpZW50Q29tcE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJVmlydHVhbFJlZmVyZW5jZSB2UmVmID0gZWpiQ29tcG9uZW50LmdldFJlZmVyZW5jZShjbGllbnRDb21wTmFtZSk7Ci0JCQlpZiAodlJlZiAhPSBudWxsKQotCQkJCWVqYkNsaWVudENvbXBvbmVudCA9IHZSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGNsaWVudEpBUiA9IG51bGw7Ci0JCQlpZiAoamFyICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKGphciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIpCi0JCQkJewotCQkJCQljbGllbnRKQVIgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIpamFyKS5nZXRFamJDbGllbnRKYXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoamFyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyKQotCQkJCXsKLQkJCQkJY2xpZW50SkFSID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpamFyKS5nZXRFamJDbGllbnRKYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2xpZW50SkFSICE9IG51bGwpIHsKLQkJCQljbGllbnRKQVIgPSBjbGllbnRKQVIuc3Vic3RyaW5nKDAsIGNsaWVudEpBUi5sZW5ndGgoKSAtIDQpOwotCQkJCWVqYkNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVqYlByb2plY3QpOwotCQkJCWlmIChlamJDb21wb25lbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZWpiQ29tcG9uZW50LmdldFJlZmVyZW5jZShjbGllbnRKQVIpOwotCQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQkJZWpiQ2xpZW50Q29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWpiQ2xpZW50Q29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENoZWNrcyBpcyBhIEVKQiBDbGllbnQgSmFyIGV4aXN0cyBmb3IgdGhlIGVqYiBtb2R1bGUgcHJvamVjdAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFSkJDbGllbnRKQVJQcm9qZWN0KElQcm9qZWN0IGVqYlByb2plY3QpIHsKLQotCQlpZiAoZ2V0RUpCQ2xpZW50SmFyKGVqYlByb2plY3QpICE9IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRWFyVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0VhclV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTAzNmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRWFyVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVhclV0aWxpdGllcyBleHRlbmRzIEphdmFFRVByb2plY3RVdGlsaXRpZXMgewotCi0JcHVibGljIEVhclV0aWxpdGllcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGFuIElWaXJ0dWFsQ29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUuIFRoZSBtZXRob2QgdGFrZQotCSAqIGVpdGhlciBtb2R1bGVOYW1lIG9yIG1vZHVsZU5hbWUgKyAiLm1vZHVsZV9leHRlbnNpb24iIChtb2R1bGVfZXh0ZW5zaW9uID0gIi5qYXIiIHx8ICIud2FyIiB8fAotCSAqICIucmFyIikgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGdldCBhIElWaXJ0dWFsQ29tcG9uZW50IGZvciBhIGdpdmVuIGVudHJ5IGluIGFuIGFwcGxpY2F0aW9uLnhtbAotCSAqIAotCSAqIEByZXR1cm4gLSBhIElWaXJ0dWFsQ29tcG9uZW50IGZvciBtb2R1bGUgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkJaWYgKG1vZHVsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSB8fCBtb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQpIHx8IG1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpCi0JCQltb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5zdWJzdHJpbmcoMCwgKG1vZHVsZU5hbWUubGVuZ3RoKCkgLSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhULmxlbmd0aCgpKSk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wb25lbnQuZ2V0TmFtZSgpLmVxdWFscyhtb2R1bGVOYW1lKSkgewotCQkJCXJldHVybiBjb21wb25lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciB0aGUgSjJFRSBtb2R1bGUgY29tcG9uZW50cwotCSAqIGNvbnRhaW5lZCBpbiB0aGlzIEVBUiBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIC0gYW4gYXJyYXkgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciBKMkVFIG1vZHVsZXMgaW4gdGhlIEVBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRKMkVFTW9kdWxlUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKLQkJTGlzdCBqMmVlVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWoyZWVUeXBlcy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlQpOwotCQlqMmVlVHlwZXMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuSkNBKTsKLQkJajJlZVR5cGVzLmFkZChJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQik7Ci0JCWoyZWVUeXBlcy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQik7Ci0JCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzKGVhckNvbXBvbmVudCwgajJlZVR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGFsbCBvZiB0aGUgY29tcG9uZW50cyBjb250YWluZWQgaW4KLQkgKiBhbiBFQVIgYXBwbGljYXRpb24uCi0JICogCi0JICogQHJldHVybiAtIGFuIGFycmF5IG9mIElWaXJ0dWFsUmVmZXJlbmNlcyBmb3IgY29tcG9uZW50cyBpbiB0aGUgRUFSCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldENvbXBvbmVudFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzKGVhckNvbXBvbmVudCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIElWaXJ0dWFsUmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIC0gSVZpcnR1YWxSZWZlcmVuY2Ugb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldENvbXBvbmVudFJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50LCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZzW2ldOwotCQkJaWYgKHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkKLQkJCQlyZXR1cm4gcmVmZXJlbmNlOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRDb21wb25lbnRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBjb21wb25lbnRUeXBlcykgewotCQlMaXN0IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGVhckNvbXBvbmVudCwgY29tcG9uZW50VHlwZXMpOwotCQlpZihjb21wb25lbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGNvbXBvbmVudHMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbY29tcG9uZW50cy5zaXplKCldKTsKLQkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7Ci0JfSAKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50VHlwZXMKLQkgKiBAcmV0dXJuIEEgTGlzdCBvZiB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9cy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBjb3BpZWQgZnJvbSBFQVJBcnRpZmFjdEVkaXQuICBBbnkgYnVnIGZpeGVzIHNob3VsZCBvY2N1ciBpbiBib3RoIGxvY2F0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBMaXN0IGNvbXBvbmVudFR5cGVzKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IHJlZkNvbXBvbmVudHNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gaWYgY29tcG9uZW50IHR5cGVzIHBhc3NlZCBpbiBpcyBudWxsIHRoZW4gcmV0dXJuIGFsbCBjb21wb25lbnRzCi0JCQkJaWYgKGNvbXBvbmVudFR5cGVzID09IG51bGwgfHwgY29tcG9uZW50VHlwZXMuc2l6ZSgpID09IDApCi0JCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCWVsc2UgewotCQkJCQlpZiAoY29tcG9uZW50VHlwZXMuY29udGFpbnMoZ2V0SjJFRUNvbXBvbmVudFR5cGUobW9kdWxlKSkpIHsKLQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgdXJpIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgY3VycmVudFVSSSAtIFRoZSBjdXJyZW50IHVyaSBvZiB0aGUgbW9kdWxlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cmlFeGlzdHMoU3RyaW5nIGN1cnJlbnRVUkksIElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkJU3RydWN0dXJlRWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGVhclByb2plY3QpOwotCQkJaWYgKGVkaXQhPW51bGwgJiYgZWRpdC5nZXRDb21wb25lbnQoKSE9bnVsbCkgewotCQkJCUxpc3QgcmVmZXJlbmNlZENvbXBzID0gZWRpdC5nZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VkQ29tcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWYgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBzLmdldChpKTsKLQkJCQkJT2JqZWN0IG1vZHVsZSA9IHJlZi5nZXREZXBlbmRlbnRPYmplY3QoKTsKLQkJCQkJaWYgKG1vZHVsZSE9bnVsbCAmJiBtb2R1bGUgaW5zdGFuY2VvZiBNb2R1bGUpIHsKLQkJCQkJCVN0cmluZyBleGlzdGluZ1VSSSA9ICgoTW9kdWxlKW1vZHVsZSkuZ2V0VXJpKCk7Ci0JCQkJCQlpZiAoZXhpc3RpbmdVUkkhPW51bGwgJiYgZXhpc3RpbmdVUkkuZXF1YWxzKGN1cnJlbnRVUkkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgcmVmZXJlbmNpbmcgRUFSIHByb2plY3RzLgotCSAqIEBwYXJhbSBwcm9qZWN0IFByb2plY3QgdG8gY2hlY2suIElmIG51bGwgb3IgYW4gRUFSLCByZXR1cm5zIGEgemVybyBsZW5ndGggYXJyYXkuCi0JICogQHJldHVybiBBcnJheSBvZiByZWZlcmVuY2luZyBFQVIgcHJvamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBUT0RPIC0gc2hvdWxkIHRoaXMgZ28gaGVyZSwgb3IgaW4gSmF2YUVFUHJvamVjdFV0aWxpdGllcz8KLQkJaWYocHJvamVjdCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlyZXR1cm4gbmV3IElQcm9qZWN0W10ge3Byb2plY3R9OwotCQl9Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSByZWZDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzRUFSUHJvamVjdChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSkpCi0JCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGFuZGFsb25lUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIElWaXJ0dWFsUmVmZXJlbmNlcyBmb3IgYWxsIG9mIHRoZSB1dGlsaXR5IG1vZHVsZXMKLQkgKiBjb250YWluZWQgaW4gdGhlIEVBUiBhcHBsaWNhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIHV0aWxpdHkgbW9kdWxlcyBpbiB0aGUgRUFSCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlpZiAoZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgaXNFQVJQcm9qZWN0KGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlMaXN0IGV4cGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMgPSAKLQkJCQlnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGVhckNvbXBvbmVudCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFkpKTsKLQkJCQotCQkJLy8gZmV0Y2ggb3RoZXIgVXRpbGl0eSBKYXJzIGF0dGFjaGVkIHRvIHRoZSBFQVIgcHJvamVjdCAKLQkJCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMgPQotCQkJCUFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUsIAotCQkJCQkJCQkJCQkgICBJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLCAgCi0JCQkJCQkJCQkJCSAgIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUgfSk7IAotCQotCQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzID0gCi0JCQkJZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChlYXJDb21wb25lbnQsIGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzKTsKLQkJCQotCQkJSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwgPSAoSUVBUk1vZGVsUHJvdmlkZXIpTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCUlDb21tb25BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChJQ29tbW9uQXBwbGljYXRpb24pZWFyTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCU9iamVjdCBtb2R1bGUgPSBudWxsOwotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgcmVmZXJlbmNlSXRyID0gaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcy5pdGVyYXRvcigpOyByZWZlcmVuY2VJdHIuaGFzTmV4dCgpOyApIHsKLQkJCQltb2R1bGUgPSBudWxsOwotCQkJCXJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgcmVmZXJlbmNlSXRyLm5leHQoKTsKLQkJCQlpZiAoYXBwbGljYXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsKQotCQkJCXsKLQkJCQkJbW9kdWxlID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsKWFwcGxpY2F0aW9uKS5nZXRGaXJzdE1vZHVsZShyZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFwcGxpY2F0aW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwpCi0JCQkJewotCQkJCQltb2R1bGUgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsKWFwcGxpY2F0aW9uKS5nZXRGaXJzdE1vZHVsZShyZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKSk7IAotCQkJCX0KLQkJCQlpZihtb2R1bGUgIT0gbnVsbCkgCi0JCQkJCXJlZmVyZW5jZUl0ci5yZW1vdmUoKTsgCi0JCQl9Ci0JCQkKLQkJCUxpc3QgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoZXhwbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7Ci0JCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7Ci0JCQkKLQkJCWlmKGFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSBhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gTk9fUkVGRVJFTkNFUzsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgUHJvamVjdEZhY2V0VmVyc2lvbnMgZm9yIGEgZ2l2ZW4gbW9kdWxlIHR5cGUgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZWFyIHZlcnNpb24KLQkgKiBAcGFyYW0gZWFyUHJvamVjdEZhY2V0VmVyc2lvbiAtIHRoZSBQcm9qZWN0RmFjZXRWZXJzaW9uIGZvciB0aGUgRU5URVJQUklTRV9BUFBMSUNBVElPTiB0aGF0IHRoZSBtb2R1bGUgd2lsbCBiZSBhZGRlZCB0bwotCSAqIEBwYXJhbSBtb2R1bGVQcm9qZWN0RmFjZXQgLSB0aGUgbW9kdWxlIHR5cGUgd2hvc2UgYXBwcm9wcmlhdGUgUHJvamVjdEZhY2V0VmVyc2lvbnMgYXJlIGRlc2lyZWQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgY29tcGF0aWJsZSBQcm9qZWN0RmFjZXRWZXJzaW9ucyBvZiB0aGUgbW9kdWxlUHJvamVjdEZhY2V0IHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFN1cHBvcnRlZEZhY2V0cyhJUHJvamVjdEZhY2V0VmVyc2lvbiBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uLCBJUHJvamVjdEZhY2V0IG1vZHVsZVByb2plY3RGYWNldCkKLQl7Ci0JCUxpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IHJldFZhbCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0KLQkJaWYgKGVhclByb2plY3RGYWNldFZlcnNpb24gIT0gbnVsbCAmJiBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OLmVxdWFscyhlYXJQcm9qZWN0RmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpLmdldElkKCkpKQotCQl7Ci0JCQlTdHJpbmcgbW9kdWxlUHJvamVjdEZhY2V0SWQgPSBtb2R1bGVQcm9qZWN0RmFjZXQuZ2V0SWQoKTsKLQkJCWludCBlYXJWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoZWFyUHJvamVjdEZhY2V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCi0JCQlpZiAoRFlOQU1JQ19XRUIuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVhclZlcnNpb24pCi0JCQkJewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA6Ci0JCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMzApOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzA6Ci0JCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMjUpOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQ6Ci0JCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMjQpOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzM6Ci0JCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMjMpOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzI6Ci0JCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMjIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKEVKQi5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKQotCQkJewotCQkJCXN3aXRjaCAoZWFyVmVyc2lvbikKLQkJCQl7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMDoKLQkJCQkJcmV0VmFsLmFkZChFSkJfMzEpOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzA6Ci0JCQkJCXJldFZhbC5hZGQoRUpCXzMwKTsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80OgotCQkJCQlyZXRWYWwuYWRkKEVKQl8yMSk7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMzoKLQkJCQkJcmV0VmFsLmFkZChFSkJfMjApOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzI6Ci0JCQkJCXJldFZhbC5hZGQoRUpCXzExKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChKQ0EuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVhclZlcnNpb24pCi0JCQkJewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA6Ci0JCQkJCXJldFZhbC5hZGQoSkNBXzE2KTsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOgotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQ6Ci0JCQkJCXJldFZhbC5hZGQoSkNBXzE1KTsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zOgotCQkJCQlyZXRWYWwuYWRkKEpDQV8xMCk7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMjoKLQkJCQkJLy8gdGhlcmUgaXMgbm8gSkNBIGluIEVBUiAxLjIKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChBUFBMSUNBVElPTl9DTElFTlQuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVhclZlcnNpb24pCi0JCQkJewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA6Ci0JCQkJCXJldFZhbC5hZGQoQVBQTElDQVRJT05fQ0xJRU5UXzYwKTsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOgotCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF81MCk7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNDoKLQkJCQkJcmV0VmFsLmFkZChBUFBMSUNBVElPTl9DTElFTlRfMTQpOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzM6Ci0JCQkJCXJldFZhbC5hZGQoQVBQTElDQVRJT05fQ0xJRU5UXzEzKTsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yOgotCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF8xMik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoVVRJTElUWS5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKQotCQkJewotCQkJCXJldFZhbC5hZGQoVVRJTElUWV9GQUNFVF8xMCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZCBtb2R1bGUgdHlwZQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBtb2R1bGVQcm9qZWN0RmFjZXQgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWxpZCBKYXZhIEVFIG1vZHVsZSB0eXBlLiIpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gaW52YWxpZCBFQVIgZmFjZXQKLQkJCWlmIChlYXJQcm9qZWN0RmFjZXRWZXJzaW9uID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVhclByb2plY3RGYWNldFZlcnNpb24gcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVhclByb2plY3RGYWNldFZlcnNpb24gcGFyYW1ldGVyIG11c3QgYmUgYW4gRU5URVJQUklTRV9BUFBMSUNBVElPTiBmYWNldC4iKTsKLQkJfQotCi0JCXJldHVybiByZXRWYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9KYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0phdmFFRVByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiMmE4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0phdmFFRVByb2plY3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzIGV4dGVuZHMgUHJvamVjdFV0aWxpdGllcyBpbXBsZW1lbnRzIElKMkVFRmFjZXRDb25zdGFudHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBOT19SRUZFUkVOQ0VTID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCi0JcHVibGljIEphdmFFRVByb2plY3RVdGlsaXRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RPZlR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCB0eXBlSUQpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCWlmKHByb2plY3RGYWNldCA9PSBudWxsKXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3RGYWNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCi0JCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCh0eXBlSUQpKSB7Ci0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOwotCQkJcmV0dXJuIHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRUFSUHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIEVOVEVSUFJJU0VfQVBQTElDQVRJT04pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIERZTkFNSUNfV0VCKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3RhdGljV2ViUHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIFNUQVRJQ19XRUIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFSkJQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgRUpCKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSkNBUHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIEpDQSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIEFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1V0aWxpdHlQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgVVRJTElUWSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgRU5URVJQUklTRV9BUFBMSUNBVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0R5bmFtaWNXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIGlzQmluYXJ5VHlwZShjb21wb25lbnQsIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBEWU5BTUlDX1dFQik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIERZTkFNSUNfV0VCKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBTVEFUSUNfV0VCKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIGlzQmluYXJ5VHlwZShjb21wb25lbnQsIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBFSkIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIEVKQik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSkNBQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiAoY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBpc0JpbmFyeVR5cGUoY29tcG9uZW50LCBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEUpOwotCQl9Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgSkNBKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKQ0FQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBKQ0EpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiAoY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBpc0JpbmFyeVR5cGUoY29tcG9uZW50LCBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUpOwotCQl9Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgQVBQTElDQVRJT05fQ0xJRU5UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIEFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXRpbGl0eVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIFVUSUxJVFkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgcHJvamVjdHMgaW4gd29ya3NwYWNlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgIHVzZSBvbmUgb2YgdGhlIHN0YXRpYyBzdHJpbmdzIG9uIHRoaXMgY2xhc3MgYXMgYSB0eXBlCi0JICogQHJldHVybiBJUHJvamVjdFtdCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzSW5Xb3Jrc3BhY2VPZlR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdHNbaV0sIHR5cGUpKQotCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5VHlwZShJVmlydHVhbENvbXBvbmVudCBhQmluYXJ5Q29tcG9uZW50LCBpbnQgcXVpY2tQZWVrVHlwZSl7Ci0JCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsoYUJpbmFyeUNvbXBvbmVudCk7Ci0JCWludCB0eXBlID0gcXAuZ2V0VHlwZSgpOwotCQlyZXR1cm4gcXVpY2tQZWVrVHlwZSA9PSB0eXBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFQ29tcG9uZW50VHlwZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQlpZiAoY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKGNvbXBvbmVudCk7Ci0JCQkJc3dpdGNoKHFwLmdldFR5cGUoKSl7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6Ci0JCQkJCXJldHVybiBBUFBMSUNBVElPTl9DTElFTlQ7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQkJCXJldHVybiBEWU5BTUlDX1dFQjsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRToKLQkJCQkJcmV0dXJuIEVKQjsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKLQkJCQkJcmV0dXJuIEpDQTsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFOgotCQkJCQlyZXR1cm4gRU5URVJQUklTRV9BUFBMSUNBVElPTjsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gVVRJTElUWTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0SjJFRVByb2plY3RUeXBlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVQcm9qZWN0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChudWxsICE9IHByb2plY3QgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChmYWNldGVkUHJvamVjdCkpCi0JCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0NMSUVOVDsKLQkJCWVsc2UgaWYgKGlzRHluYW1pY1dlYlByb2plY3QoZmFjZXRlZFByb2plY3QpKQotCQkJCXJldHVybiBEWU5BTUlDX1dFQjsKLQkJCWVsc2UgaWYgKGlzRUpCUHJvamVjdChmYWNldGVkUHJvamVjdCkpCi0JCQkJcmV0dXJuIEVKQjsKLQkJCWVsc2UgaWYgKGlzRUFSUHJvamVjdChmYWNldGVkUHJvamVjdCkpCi0JCQkJcmV0dXJuIEVOVEVSUFJJU0VfQVBQTElDQVRJT047Ci0JCQllbHNlIGlmIChpc0pDQVByb2plY3QoZmFjZXRlZFByb2plY3QpKQotCQkJCXJldHVybiBKQ0E7Ci0JCQllbHNlIGlmIChpc1N0YXRpY1dlYlByb2plY3QoZmFjZXRlZFByb2plY3QpKQotCQkJCXJldHVybiBTVEFUSUNfV0VCOwotCQkJZWxzZSBpZiAoaXNVdGlsaXR5UHJvamVjdChmYWNldGVkUHJvamVjdCkpCi0JCQkJcmV0dXJuIFVUSUxJVFk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIEoyRUUgTW9kdWxlIHZlcnNpb24gYmFzZWQgb24gdGhlIEREIFhNTCBmaWxlCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHZlcnNpb24gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRUREUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpbnQgdHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV047Ci0JCVN0cmluZyBkZFVSSSA9IG51bGw7Ci0JCWlmIChpc0VBUlByb2plY3QocHJvamVjdCkpIHsKLQkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFOwotCQkJZGRVUkkgPSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSTsKLQkJfSBlbHNlIGlmIChpc0VKQlByb2plY3QocHJvamVjdCkpIHsKLQkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRTsKLQkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJOwotCQl9IGVsc2UgaWYgKGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7Ci0JCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkk7Ci0JCX0gZWxzZSBpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU7Ci0JCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKLQkJfSBlbHNlIGlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU7Ci0JCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSTsKLQkJfSAKLQotCQlpZih0eXBlICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoZGRVUkkpKTsKLQkJCQlpZih2RmlsZS5leGlzdHMoKSl7Ci0JCQkJCUlucHV0U3RyZWFtIGluPSBudWxsOwotCQkJCQl0cnl7Ci0JCQkJCQlpbiA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0Q29udGVudHMoKTsKLQkJCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGluKTsKLQkJCQkJCWludCB2ZXJzID0gKHF1aWNrUGVlay5nZXRWZXJzaW9uKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikgPyBnZXRKRUVWZXJzaW9uKHByb2plY3QpIDogcXVpY2tQZWVrLmdldFZlcnNpb24oKTsKLQkJCQkJCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyh2ZXJzKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZihpbiAhPSBudWxsKXsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbi5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoZ2V0SkVFVmVyc2lvbihwcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEpFRVZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoaXNFQVJQcm9qZWN0KHByb2plY3QpIHx8IGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOwotCQlpZiAoaXNFSkJQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wOwotCQlpZiAoaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNTsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV047Ci0JCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRKMkVFVmVyc2lvbihJUHJvamVjdCBqYXZhRUVQcm9qZWN0KQotCXsKLQkJaW50IHJldFZhbCA9IDA7Ci0JCXJldHVybiByZXRWYWw7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgY29tcG9uZW50IHJldHVybnMgd2hldGhlciB0aGUgY29tcG9uZW50IGhhcwotCSAqIEphdmEgRUUgdmVyc2lvbiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNQotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBKYXZhIEVFIHZlcnNpb24gNSBvciBncmVhdGVyLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKRUVDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KXsKLQkJaWYoY29tcG9uZW50LmlzQmluYXJ5KCkpewotCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhjb21wb25lbnQpOwotCQkJaW50IGphdmFFRVZlcnNpb24gPSBxcC5nZXRKYXZhRUVWZXJzaW9uKCk7Ci0JCQlyZXR1cm4gamF2YUVFVmVyc2lvbiA+PSBKMkVFQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCQotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OKTsKLQkJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKLQkJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzEyIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl8xMyB8fAotCQkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fMTQpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlmYWNldFZlcnNpb24gPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIEFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7Ci0JCQkJaWYoZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzEyIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzEzIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzE0KXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBFSkIpOwotCQkJaWYoZmFjZXRWZXJzaW9uICE9IG51bGwpewotCQkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQl8xMSB8fAotCQkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQl8yMCB8fAotCQkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQl8yMSl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWZhY2V0VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgRFlOQU1JQ19XRUIpOwotCQkJaWYoZmFjZXRWZXJzaW9uICE9IG51bGwpewotCQkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCXzIyIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjMgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl8yNCl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWZhY2V0VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgSkNBKTsKLQkJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKLQkJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5KQ0FfMTAgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5KQ0FfMTUgKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgY29tcG9uZW50IHJldHVybnMgd2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBKYXZhIEVFIHZlcnNpb24gbGVzcyB0aGFuIDUKLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgbGVzcyB0aGVuIEphdmEgRUUgdmVyc2lvbiA1LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lKMkVFQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7Ci0JCXJldHVybiAhaXNKRUVDb21wb25lbnQoY29tcG9uZW50KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L1dlYlV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9XZWJVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiNmUyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L1dlYlV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgV2ViVXRpbGl0aWVzIGV4dGVuZHMgSmF2YUVFUHJvamVjdFV0aWxpdGllcyB7Ci0JcHVibGljIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXZWJVdGlsaXRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBTZXJ2bGV0IHZlcnNpb24gaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIHRoZSB7QHNlZSBXZWJBcHBSZXNvdXJjZX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZSB2ZXJzaW9uCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0U2VydmxldFZlcnNpb24oSVByb2plY3Qgd2ViUHJvamVjdCkgewotCQlpbnQgcmV0VmFsID0gMDsKLQkJT2JqZWN0IHdlYkFwcFJlc291cmNlID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcih3ZWJQcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAod2ViQXBwUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJewotCQkJcmV0VmFsID0gKChYTUxSZXNvdXJjZSl3ZWJBcHBSZXNvdXJjZSkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JCX0KLQkJZWxzZSBpZiAod2ViQXBwUmVzb3VyY2UgaW5zdGFuY2VvZiBXZWJBcHApCi0JCXsKLQkJCXN3aXRjaCAoKChXZWJBcHApd2ViQXBwUmVzb3VyY2UpLmdldFZlcnNpb24oKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJY2FzZSBXZWJBcHBWZXJzaW9uVHlwZS5fMjU6IAotCQkJCQlyZXRWYWwgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXRWYWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBmb3IgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIGxldmVsIGFzc29jaWF0ZWQKLQkgKiB3aXRoIHRoZSBKMkVFIHZlcnNpb24gZm9yIHRoaXMgd29ya2JlbmNoIG1vZHVsZS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwgYW5kIHJldHVybnMKLQkgKiAyMCBhcyBkZWZhdWx0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNQIGxldmVsCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SlNQVmVyc2lvbihJUHJvamVjdCB3ZWJQcm9qZWN0KSB7Ci0JCWludCBzZXJ2bGV0VmVyc2lvbiA9IGdldFNlcnZsZXRWZXJzaW9uKHdlYlByb2plY3QpOwotCQlpZiAoc2VydmxldFZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KU1BfMV8xX0lEOwotCQllbHNlIGlmIChzZXJ2bGV0VmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpTUF8xXzJfSUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KU1BfMl8wX0lEOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBtb2R1bGVzIHdoaWNoIGFyZSB1dGlsaXR5IGphcnMgaW4gdGhlIHdlYiBsaWIKLQkgKiBmb2xkZXIgb2YgdGhlIGRlcGxveWVkIHBhdGggb2YgdGhlIG1vZHVsZS4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiB0aGUgd2ViIGxpYnJhcnkgZGVwZW5kZW50IG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0TGliTW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wb25lbnQpewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gbnVsbDsKLQkJaWYgKCF3ZWJDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCXJlZkNvbXBvbmVudHMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KXdlYkNvbXBvbmVudCkuZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKCk7Ci0JCWVsc2UKLQkJCXJlZkNvbXBvbmVudHMgPSB3ZWJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkvLyBDaGVjayB0aGUgZGVwbG95ZWQgcGF0aCB0byBtYWtlIHN1cmUgaXQgaGFzIGEgbGliIHBhcmVudCBmb2xkZXIgYW5kIG1hdGNocyB0aGUgd2ViLnhtbAotCQkvLyBiYXNlIHBhdGgKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVmQ29tcG9uZW50c1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpKQotCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCX0KLQotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBtb2R1bGVzIHdoaWNoIGFyZSB1dGlsaXR5IGphcnMgaW4gdGhlIHdlYiBsaWIKLQkgKiBmb2xkZXIgb2YgdGhlIGRlcGxveWVkIHBhdGggb2YgdGhlIG1vZHVsZS4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiB0aGUgd2ViIGxpYnJhcnkgZGVwZW5kZW50IG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0TGliTW9kdWxlcyhJUHJvamVjdCB3ZWJQcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHdlYlByb2plY3QpOwotCQlyZXR1cm4gZ2V0TGliTW9kdWxlcyh3ZWJDb21wb25lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWEyNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JLyoqCi0JICogcmVxdWlyZWQsIHR5cGUgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHJlcXVpcmVkLCBub3QgZGVmYXVsdGVkLiBJZiBudWxsLCB3aWxsIG5vdCBydW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9UQVJHRVRfSUQgPSAiSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1RBUkdFVF9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPcHRpb25hbCAtIFRoaXMgbmVlZHMgdG8gYmUgc2V0IGlmIHRoZSBQUk9KRUNUX05BTUUgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX1ZFUlNJT05fSUQgPSAiSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5KMkVFX1ZFUlNJT05fSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLCB0eXBlIEJvb2xlYW4uIFNldCB0aGlzIHRvIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdXBwb3NlZCB0byB1cGRhdGUKLQkgKiBhbGwgZGVwZW5kZW50IG1vZHVsZXMgYW5kIHByb2plY3RzIGluIGFuIGVhciBpZiB0aGUgcGFzc2VkIHByb2plY3QgbmFtZSBpcyBhbiBlYXIgcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9NT0RVTEVTID0gIklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuVVBEQVRFX01PRFVMRVMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCAtIFRoaXMgbmVlZHMgdG8gYmUgc2V0IGlmIHRoZSBQUk9KRUNUX05BTUUgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQGxpbmsgWE1MUmVzb3VyY2UjQVBQX0NMSUVOVF9UWVBFCi0JICogQGxpbmsgWE1MUmVzb3VyY2UjQVBQTElDQVRJT05fVFlQRQotCSAqIEBsaW5rIFhNTFJlc291cmNlI0VKQl9UWVBFCi0JICogQGxpbmsgWE1MUmVzb3VyY2UjUkFSX1RZUEUKLQkgKiBAbGluayBYTUxSZXNvdXJjZSNXRUJfQVBQX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lNRU5UX1RZUEVfSUQgPSAiSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5ERF9UWVBFX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVGYWNldENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTNjYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFRmFjZXRDb25zdGFudHMgewotCi0JLy9tb2R1bGVUeXBlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVEVSUFJJU0VfQVBQTElDQVRJT04gPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEVOVEVSUFJJU0VfQVBQTElDQVRJT04pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRU5URVJQUklTRV9BUFBMSUNBVElPTl8xMiA9IEVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQuZ2V0VmVyc2lvbigiMS4yIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVOVEVSUFJJU0VfQVBQTElDQVRJT05fMTMgPSBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VULmdldFZlcnNpb24oIjEuMyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzE0ID0gRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVC5nZXRWZXJzaW9uKCIxLjQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRU5URVJQUklTRV9BUFBMSUNBVElPTl81MCA9IEVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQuZ2V0VmVyc2lvbigiNS4wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVOVEVSUFJJU0VfQVBQTElDQVRJT05fNjAgPSBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VULmdldFZlcnNpb24oIjYuMCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ0xJRU5UID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBBUFBMSUNBVElPTl9DTElFTlRfMTIgPSBBUFBMSUNBVElPTl9DTElFTlRfRkFDRVQuZ2V0VmVyc2lvbigiMS4yIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEFQUExJQ0FUSU9OX0NMSUVOVF8xMyA9IEFQUExJQ0FUSU9OX0NMSUVOVF9GQUNFVC5nZXRWZXJzaW9uKCIxLjMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gQVBQTElDQVRJT05fQ0xJRU5UXzE0ID0gQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VULmdldFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBBUFBMSUNBVElPTl9DTElFTlRfNTAgPSBBUFBMSUNBVElPTl9DTElFTlRfRkFDRVQuZ2V0VmVyc2lvbigiNS4wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEFQUExJQ0FUSU9OX0NMSUVOVF82MCA9IEFQUExJQ0FUSU9OX0NMSUVOVF9GQUNFVC5nZXRWZXJzaW9uKCI2LjAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQiA9IElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEVKQl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChFSkIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRUpCXzExID0gRUpCX0ZBQ0VULmdldFZlcnNpb24oIjEuMSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFSkJfMjAgPSBFSkJfRkFDRVQuZ2V0VmVyc2lvbigiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVKQl8yMSA9IEVKQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRUpCXzMwID0gRUpCX0ZBQ0VULmdldFZlcnNpb24oIjMuMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFSkJfMzEgPSBFSkJfRkFDRVQuZ2V0VmVyc2lvbigiMy4xIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfV0VCID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgRFlOQU1JQ19XRUJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRFlOQU1JQ19XRUIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRFlOQU1JQ19XRUJfMjIgPSBEWU5BTUlDX1dFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjIiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRFlOQU1JQ19XRUJfMjMgPSBEWU5BTUlDX1dFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRFlOQU1JQ19XRUJfMjQgPSBEWU5BTUlDX1dFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRFlOQU1JQ19XRUJfMjUgPSBEWU5BTUlDX1dFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRFlOQU1JQ19XRUJfMzAgPSBEWU5BTUlDX1dFQl9GQUNFVC5nZXRWZXJzaW9uKCIzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfV0VCX1hET0NMRVQgPSAianN0LndlYi54ZG9jbGV0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVUSUxJVFkgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgVVRJTElUWV9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChVVElMSVRZKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFVUSUxJVFlfRkFDRVRfMTAgPSBVVElMSVRZX0ZBQ0VULmdldFZlcnNpb24oIjEuMCIpOyAvLyROT04tTkxTLTEkIAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgSkNBX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpDQSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQ0FfMTAgPSBKQ0FfRkFDRVQuZ2V0VmVyc2lvbigiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpDQV8xNSA9IEpDQV9GQUNFVC5nZXRWZXJzaW9uKCIxLjUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkNBXzE2ID0gSkNBX0ZBQ0VULmdldFZlcnNpb24oIjEuNiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCID0gSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZGIyMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMsIElKMkVFRmFjZXRDb25zdGFudHMgewotCi0JLy9UT0RPIHRoaXMgcHJvcGVydHkgc2hvdWxkIHByb2JhYmx5IGJlIGRlbGV0ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1RBUkdFVF9JRCA9ICJJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfUlVOVElNRSA9IElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRTsKLQotCS8qKgotCSAqICBib29sZWFuIHByb3BlcnR5IGZvciBKYXZhIEVFIDUgcHJvamVjdHMsIHRvIGNyZWF0ZS9ub3QgY3JlYXRlIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLCAKLQkgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ERCA9ICJJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQiOyAvLyROT04tTkxTLTEkIAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWI3ZWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyAgCi0gICBleHRlbmRzIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSID0gIklKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1BST0pFQ1RfTkFNRSA9ICJJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9VUkkgPSAiSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTU9EVUxFX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FkZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSID0gIklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9QUk9KRUNUX05BTUUgPSAiSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZPTERFUiA9ICJJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0VBUl9OQU1FID0gIklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5MQVNUX0VBUl9OQU1FIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9VUkkgPSAiSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkYTk2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciAgaW1wbGVtZW50cyBJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKFJVTlRJTUVfVEFSR0VUX0lEKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1JVTlRJTUUpOwotCQkvLyBhZGRlZCBmb3IgamVlIHByb2plY3RzIHRoYXQgbWFrZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9wdGlvbmFsCi0JCW5hbWVzLmFkZChHRU5FUkFURV9ERCk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gY29udmVydEZhY2V0VmVyc2lvblRvSjJFRVZlcnNpb24oKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBnZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uKTsKLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRm9sZGVyTmFtZShTdHJpbmcgZm9sZGVyTmFtZSkgewotCQkvLyB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZXF1aXJlZCwgYnV0IGlmIHRoZSBuYW1lIGlzIGVudGVyZWQgZW5zdXJlIHRoYXQgaXQgCi0JCS8vIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycy4KLQkJaWYgKGZvbGRlck5hbWUgPT0gbnVsbCB8fCBmb2xkZXJOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCX0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhdGguc2VnbWVudENvdW50KCk7IGkgPCBtYXg7IGkrKykgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHBhdGguc2VnbWVudChpKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQlpZiAoISBzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvLyBhbGwgb2YgdGhlIHBvdGVudGlhbCBzZWdtZW50cyBvZiB0aGUgZm9sZGVyIGhhdmUgYmVlbiB2ZXJpZmllZAotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTBjYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmZhY2V0LlJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiwgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnQgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gdXBkYXRlZCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShjdXJyZW50LCAwLCB1cGRhdGVkLCAwLCBjdXJyZW50Lmxlbmd0aCk7Ci0JCXVwZGF0ZWRbY3VycmVudC5sZW5ndGhdID0gZW50cnk7Ci0JCWpwcm9qLnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBudWxsKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRUFSRmFjZXQoIGZpbmFsIFN0cmluZyBqMmVlVmVyc2lvblRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVhclByb2plY3ROYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOyAKLQkJaWYoIHByb2plY3QuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmNyZWF0ZU5ld1Byb2plY3QoKTsKLQkJCi0JCWZwandjLnNldFByb2plY3ROYW1lKCBlYXJQcm9qZWN0TmFtZSApOwotCQkKLQkJaWYoIHJ1bnRpbWUgIT0gbnVsbCApCi0JCXsKLQkJICAgIGZwandjLnNldFRhcmdldGVkUnVudGltZXMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggcnVudGltZSApICk7Ci0JCX0KLQkJCi0JCWZwandjLnNldEZpeGVkUHJvamVjdEZhY2V0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCApICk7Ci0JCWZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBGYWNldGVkUHJvamVjdEZyYW1ld29yay5ERUZBVUxUX0NPTkZJR1VSQVRJT05fUFJFU0VUX0lEICk7Ci0JCQotCQlpZiggajJlZVZlcnNpb25UZXh0ICE9IG51bGwgKQotCQl7Ci0JCSAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBkZWZhdWx0RWFyRmFjZXRWZXJzaW9uCi0JCSAgICAgICAgPSBmcGp3Yy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCBFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCApOwotCQkgICAgCi0JCSAgICBpZiggISBkZWZhdWx0RWFyRmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoIGoyZWVWZXJzaW9uVGV4dCApICkKLQkJICAgIHsKLQkJICAgICAgICBTdHJpbmcgcHJlc2V0SWQgPSBudWxsOwotCQkgICAgICAgIAotCQkgICAgICAgIGlmKCBydW50aW1lICE9IG51bGwgKQotCQkgICAgICAgIHsKLSAgICAJCSAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IHJ1bnRpbWUuZ2V0UnVudGltZUNvbXBvbmVudHMoKSApCi0gICAgCQkgICAgICAgIHsKLSAgICAJCSAgICAgICAgICAgIHByZXNldElkID0gUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQcmVzZXRJRAotICAgIAkJICAgICAgICAgICAgKCAKLSAgICAJCSAgICAgICAgICAgICAgICByYy5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpLmdldElkKCksCi0gICAgCQkgICAgICAgICAgICAgICAgcmMuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKS5nZXRWZXJzaW9uU3RyaW5nKCksIAotICAgIAkJICAgICAgICAgICAgICAgIEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VULmdldElkKCksIAotICAgIAkJICAgICAgICAgICAgICAgIGoyZWVWZXJzaW9uVGV4dCAKLSAgICAJCSAgICAgICAgICAgICk7Ci0gICAgCQkgICAgICAgICAgICAKLSAgICAJCSAgICAgICAgICAgIGlmKCBwcmVzZXRJZCAhPSBudWxsICkKLSAgICAJCSAgICAgICAgICAgIHsKLSAgICAJCSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAJCSAgICAgICAgICAgIH0KLSAgICAJCSAgICAgICAgfQotCQkgICAgICAgIH0KLQkJICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBlYXJGYWNldFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgPSBFQVJGYWNldFV0aWxzLkVBUl9GQUNFVC5nZXRWZXJzaW9uKCBqMmVlVmVyc2lvblRleHQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmV4dCBjYWxsIGlzIG5lY2Vzc2FyeSBldmVuIGlmIGEgcHJlc2V0IGlzIGdvaW5nIHRvIGJlIHNlbGVjdGVkIAotICAgICAgICAgICAgICAgIC8vIGxhdGVyIHNpbmNlIGl0IGFsbG93cyB0aGUgZHluYW1pYyBwcmVzZXQgdG8gYWRqdXN0IGZvciB0aGUgZWFyIGZhY2V0IHZlcnNpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZnBqd2Muc2V0UHJvamVjdEZhY2V0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBlYXJGYWNldFZlcnNpb24gKSApOwotICAgICAgICAgICAgICAgIAotCQkgICAgICAgIGlmKCBwcmVzZXRJZCAhPSBudWxsICkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgIGZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBwcmVzZXRJZCApOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQkKLQkJdHJ5Ci0JCXsKLQkJICAgIGZwandjLmNvbW1pdENoYW5nZXMoIG51bGwgKTsKLQkJfQotCQljYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLQkJewotCQkgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCBlICk7Ci0JCX0KLQl9Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFuaWZlc3QoSVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBhRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgCQotICAgICAgICBJRmlsZSBmaWxlID0gYUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0gICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSByZXR1cm47Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYW5pZmVzdEZpbGVDcmVhdGlvbkFjdGlvbi5jcmVhdGVNYW5pZmVzdEZpbGUoZmlsZSwgcHJvamVjdCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvRWFyKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXAsIElWaXJ0dWFsQ29tcG9uZW50IGoyZWVDb21wLCBTdHJpbmcgbW9kdWxlVVJJICl7Ci0JCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCU1hcCBtYXAgPSAoTWFwKWRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVApOwotCQltYXAucHV0KGoyZWVDb21wLCBtb2R1bGVVUkkpOwotCQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wKTsKLQkJCQotCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQltb2RMaXN0LmFkZChqMmVlQ29tcCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsQW5kQWRkTW9kdWxldG9FQVIoIFN0cmluZyBqMmVlVmVyc2lvblRleHQsCi0gICAgCQkJU3RyaW5nCQkJCWVhclByb2plY3ROYW1lLAotICAgIAkJCUlSdW50aW1lCQkJcnVudGltZSwKLSAgICAJCQlJUHJvamVjdAkJCW1vZHVsZVByb2plY3QsCi0gICAgCQkJU3RyaW5nCQkJCW1vZHVsZVVSSSwKLSAgICAJCQlJUHJvZ3Jlc3NNb25pdG9yCW1vbml0b3IgKXsKLSAgICAJCi0JCWluc3RhbGxFQVJGYWNldChqMmVlVmVyc2lvblRleHQsCi0JCQkJCWVhclByb2plY3ROYW1lLAotCQkJCQlydW50aW1lLAotCQkJCQltb25pdG9yKTsKLQkJCi0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggbW9kdWxlUHJvamVjdCApOwotCQlmaW5hbCBJUHJvamVjdCBlYXJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBlYXJQcm9qZWN0TmFtZSApOwotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoIGVhclByb2plY3QgKTsKLQkJCi0JCWlmKCBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmdldEN1cnJlbnRDb250ZXh0KCkgPT0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUICl7Ci0JCQlib29sZWFuIGlzVmFsaWRhdGluZyA9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuaXNWYWxpZGF0aW5nKCk7Ci0JCQl0cnl7Ci0JCQkJaWYoIGlzVmFsaWRhdGluZyApewotCQkJCQlSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJCX0KLQkJCQlhZGRUb0VhciggZWFyQ29tcCwgYywgbW9kdWxlVVJJICk7Ci0JCQl9ZmluYWxseXsKLQkJCQlSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCSBhZGRUb0VhciggZWFyQ29tcCwgYywgbW9kdWxlVVJJICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBvdXRwdXQgcHJvcGVydHkgb24gdGhlIG1vZGVsIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBjb21wb25lbnQuCi0gICAgICogSWYgdGhlIHNpbmdsZSByb290IHN0cnVjdHVyZSBpcyBzZXQgZm9yIG9wdGltaXplZCB1c2UsIHRoZSBvdXRwdXQgZm9sZGVyIHdpbGwgYmUgdGhlCi0gICAgICogY29udGVudCByb290LiAgT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC4gIFRoaXMgbWF5IGJlIG92ZXJyaWRlZCBieSBzcGVjaWZpYwotICAgICAqIEoyRUUgbW9kdWxlcyB0byBkbyBtb3JlIGFwcHJvcHJpYXRlIGJlaGF2aW91ci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0T3V0cHV0Rm9sZGVyKElEYXRhTW9kZWwgbW9kZWwsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlTdHJpbmcgb3V0cHV0Rm9sZGVyID0gbnVsbDsKLQkJLy8gSWYgdXNpbmcgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBzZXQgb3V0cHV0IGZvbGRlciB0byBiZSB0aGUgY29udGVudCBmb2xkZXIKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKLQkJCW91dHB1dEZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJLy8gT3RoZXJ3aXNlIGp1c3QgdXNlIHRoZSBwcm9kdWN0IGRlZmF1bHQgZm9yIGphdmEgb3V0cHV0IHBhdGgKLQkJZWxzZQotCQkJb3V0cHV0Rm9sZGVyID0gQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5PVVRQVVRfRk9MREVSKTsKLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiamF2YS1vdXRwdXQtcGF0aCIsIG91dHB1dEZvbGRlciApOyAvLyROT04tTkxTLTEkCi0JfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZTA2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldD4gTU9EVUxFX0ZBQ0VUUyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0R3JvdXAoICJtb2R1bGVzIiApLmdldE1lbWJlcnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1PRFVMRV9GQUNFVFMuYWRkKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0JcHVibGljIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSURhdGFNb2RlbCBuZXN0ZWRKMkVFRmFjZXREYXRhTW9kZWwgPSBnZXRKMkVFRmFjZXRNb2RlbCgpOwotCQkJaWYgKG5lc3RlZEoyRUVGYWNldERhdGFNb2RlbCE9bnVsbCkKLQkJCQlyZXR1cm4gbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChFQVJfUFJPSkVDVF9OQU1FKTsKLQkJbmFtZXMuYWRkKEFERF9UT19FQVIpOwotCQluYW1lcy5hZGQoTU9EVUxFX1VSSSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlSdW50aW1lIHJ0ID0gKElSdW50aW1lKSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0JCQkJaWYgKHJ0ID09IG51bGwgfHwgcnQuc3VwcG9ydHMoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpKSB7Ci0JCQkJCWxpc3QuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCWRlc2NyaXB0b3JzW2ldID0gKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcikgbGlzdC5nZXQoaSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlEYXRhTW9kZWwgbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsID0gZ2V0SjJFRUZhY2V0TW9kZWwoKTsKLQkJCWlmKG51bGwgIT0gbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsKXsKLQkJCQlpZihFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCQkJbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQluZXN0ZWRKMkVFRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIHByb3BlcnR5VmFsdWUpOwkKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCWlmIChlYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGRFYXJQcm9qZWN0OwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmYWNldGRFYXJQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGVhclByb2plY3QpOwotCQkJCQkJCWlmIChmYWNldGRFYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZmFjZXRkRWFyUHJvamVjdC5nZXRSdW50aW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl9Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldEoyRUVGYWNldE1vZGVsKCkgCi0JewotCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YwotCSAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLQkgICAgCi0JICAgIGZvciggSVByb2plY3RGYWNldCBtb2R1bGVGYWNldCA6IE1PRFVMRV9GQUNFVFMgKQotCSAgICB7Ci0JICAgICAgICBpZiggZnBqd2MuaGFzUHJvamVjdEZhY2V0KCBtb2R1bGVGYWNldCApICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA9IGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbiggbW9kdWxlRmFjZXQgKTsKLQkgICAgICAgICAgICByZXR1cm4gKElEYXRhTW9kZWwpIGFjdGlvbi5nZXRDb25maWcoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRUFSKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQkJaWYgKGVhclByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZEVhclByb2plY3Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZhY2V0ZEVhclByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0JCQkJCQkJaWYgKGZhY2V0ZEVhclByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBGQUNFVF9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRUFSKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJaWYgKGdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKS5lcXVhbHMoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpKSB7Ci0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuU0FNRV9NT0RVTEVfQU5EX0VBUl9OQU1FLCBuZXcgT2JqZWN0W117Z2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSl9KTsKLQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVBUihTdHJpbmcgZWFyTmFtZSkgewotCQlpZiAoZWFyTmFtZS5pbmRleE9mKCIjIikgIT0gLTEgfHwgZWFyTmFtZS5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9JTlZBTElEX0NIQVJTKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfSBlbHNlIGlmIChlYXJOYW1lID09IG51bGwgfHwgZWFyTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuRVJSX0VNUFRZX01PRFVMRV9OQU1FKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy52YWxpZGF0ZVByb2plY3ROYW1lKGVhck5hbWUpOwotCQkvL2NoZWNrIGZvciB0aGUgZGVsZXRlZCBjYXNlLCB0aGUgcHJvamVjdCBpcyBkZWxldGVkIGZyb20gdGhlIHdvcmtzcGFjZSBidXQgc3RpbGwgZXhpc3RzIGluIHRoZQotCQkvL2ZpbGUgc3lzdGVtLgotCQlpZiggc3RhdHVzLmlzT0soKSl7Ci0JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCWlmKCAhZWFyUHJvamVjdC5leGlzdHMoKSApewotCQkJCUlQYXRoIHBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKGVhck5hbWUpOwotCQkJCXN0YXR1cyA9IFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LnZhbGlkYXRlRXhpc3RpbmcoZWFyTmFtZSwgcGF0aC50b09TU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThmYmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIAotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFmYjU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwudXRpbHMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuSUV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogQW4gaW50ZXJuYWwgQm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHByb2hpYml0IGFkZGluZyB0aGlzIG1vZHVsZSB0byBhbiBFQVIuIFRoaXMgaXMgc2V0IG9uCi0JICogdGhlIG5lc3RlZCBtb2RlbHMgd2hlbiB1c2VkIGR1cmluZyBFQVIgY3JlYXRpb24gc2luY2UgRUFSIGNyZWF0aW9uIGhhbmRsZXMgYWRkaW5nIHRvIHRoZSBFQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9ISUJJVF9BRERfVE9fRUFSID0gIkoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5QUk9ISUJJVF9BRERfVE9fRUFSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBqYXZhRmFjZXRJbnN0YWxsQ29uZmlnID0gbnVsbDsKLQotICAgIHByaXZhdGUgSUV2ZW50TGlzdGVuZXI8SmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudD4gamF2YUZhY2V0U291cmNlRm9sZGVyTGlzdGVuZXIgCi0gICAgICAgID0gbmV3IElFdmVudExpc3RlbmVyPEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQ+KCkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCApIAotICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVKYXZhRmFjZXRTb3VyY2VGb2xkZXJzQ2hhbmdlZCggZXZlbnQgKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVKYXZhRmFjZXRTb3VyY2VGb2xkZXJzQ2hhbmdlZCggZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IGV2ZW50LmdldEphdmFGYWNldEluc3RhbGxDb25maWcoKS5nZXRTb3VyY2VGb2xkZXJzKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VGb2xkZXIgPSAoIHNvdXJjZUZvbGRlcnMuaXNFbXB0eSgpID8gbnVsbCA6IHNvdXJjZUZvbGRlcnMuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpICk7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KCBDT05GSUdfRk9MREVSLCBzb3VyY2VGb2xkZXIgKTsKLSAgICB9Ci0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChBRERfVE9fRUFSKTsKLQkJbmFtZXMuYWRkKFBST0hJQklUX0FERF9UT19FQVIpOwotCQluYW1lcy5hZGQoQ09ORklHX0ZPTERFUik7Ci0JCW5hbWVzLmFkZChFQVJfUFJPSkVDVF9OQU1FKTsKLQkJbmFtZXMuYWRkKExBU1RfRUFSX05BTUUpOwotCQluYW1lcy5hZGQoTU9EVUxFX1VSSSk7Ci0JCS8vIGFkZGVkIGZvciBqZWUgbW9kdWxlcyB0aGF0IG1ha2UgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBvcHRpb25hbAotCQluYW1lcy5hZGQoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSElCSVRfQUREX1RPX0VBUikpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQUREX1RPX0VBUikpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbiggSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKMkVFUHJlZmVyZW5jZXMuS2V5cy5BRERfVE9fRUFSX0JZX0RFRkFVTFQpICYmIGlzRUFSU3VwcG9ydGVkQnlSdW50aW1lKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUFSX1BST0pFQ1RfTkFNRSkpIHsKLQkJCWlmIChtb2RlbC5pc1Byb3BlcnR5U2V0KExBU1RfRUFSX05BTUUpKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShMQVNUX0VBUl9OQU1FKSk7Ci0JCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3MgPSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCQlpZiAoZGVzY3MubGVuZ3RoID4gMCkgewotCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjID0gZGVzY3NbMF07Ci0JCQkJU3RyaW5nIGVBUk5hbWUgPSBkZXNjLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZUFSTmFtZSAhPSBudWxsICYmICFlQVJOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gZUFSTmFtZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKSArICJFQVIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKSArICJFQVIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0hJQklUX0FERF9UT19FQVIpKSB7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUiwgZmFsc2UpOwotCQl9Ci0JCWlmIChGQUNFVF9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikpIHsKLQkJCQlpZiAoIW1vZGVsLmlzUHJvcGVydHlTZXQoRUFSX1BST0pFQ1RfTkFNRSkpIHsKLQkJCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewotCQkJSURhdGFNb2RlbCBtYXN0ZXJNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2RlbC5nZXRQcm9wZXJ0eShNQVNURVJfUFJPSkVDVF9ETSk7Ci0JCQlpZiAobWFzdGVyTW9kZWwgIT0gbnVsbCkgewotCQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbWFzdGVyTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJCUlEYXRhTW9kZWwgamF2YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEpBVkEpOwotCQkJCWlmIChqYXZhTW9kZWwgIT0gbnVsbCkgewotCQkJCQlqYXZhTW9kZWwuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQkJCS8vIElmIGFwcGxpY2FibGUsIHJlYWN0IHRvIHRoZSBjaGFuZ2UgaW4gY29udGVudCBmb2xkZXIgdG8gdXBkYXRlIHRoZSBvdXRwdXQgZm9sZGVyIGZvciBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmVzCi0JCQkJCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCi0JCQkJCQlqYXZhTW9kZWwuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLHByb3BlcnR5VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICgoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBBRERfVE9fRUFSLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IExBU1RfRUFSX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpOwotCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCXNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIGZhY2V0UHJvai5nZXRSdW50aW1lKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShBRERfVE9fRUFSLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotICAgICAgICBlbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwandjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBwcm9wZXJ0eVZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmZwandjLmFkZExpc3RlbmVyCi0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcm9qZWN0RmFjZXRzQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfRkFDRVRTX0NIQU5HRUQKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSVN0YXR1cyBzdGF0ID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHN0YXQgIT0gT0tfU1RBVFVTKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcm9qZWN0RmFjZXRzQ2hhbmdlZCgpCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGphdmFJbnN0YWxsQWN0aW9uCi0gICAgICAgICAgICA9IHRoaXMuZnBqd2MuZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUICk7Ci0gICAgICAgIAotICAgICAgICBpZiggamF2YUluc3RhbGxBY3Rpb24gIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgPSBqYXZhSW5zdGFsbEFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbmZpZyBpbnN0YW5jZW9mIEphdmFGYWNldEluc3RhbGxDb25maWcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZyA9IChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnID0gKEphdmFGYWNldEluc3RhbGxDb25maWcpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlciggY29uZmlnLCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmNsYXNzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5hZGRMaXN0ZW5lciggdGhpcy5qYXZhRmFjZXRTb3VyY2VGb2xkZXJMaXN0ZW5lciwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudC5UeXBlLlNPVVJDRV9GT0xERVJTX0NIQU5HRUQgKTsKLSAgICAgICAgfQotICAgIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAhZ2V0Qm9vbGVhblByb3BlcnR5KFBST0hJQklUX0FERF9UT19FQVIpICYmIGlzRUFSU3VwcG9ydGVkQnlSdW50aW1lKCk7Ci0JCX0KLQkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAhZ2V0Qm9vbGVhblByb3BlcnR5KFBST0hJQklUX0FERF9UT19FQVIpICYmIGlzRUFSU3VwcG9ydGVkQnlSdW50aW1lKCkgJiYgZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaW50IGoyZWVWZXJzaW9uID0gZ2V0SjJFRVZlcnNpb24oKTsKLQkJCXJldHVybiBnZXRFQVJQcm9wZXJ0eURlc2NyaXB0b3JzKGoyZWVWZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldEVBUlByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGoyZWVWZXJzaW9uKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQlBcnJheUxpc3QgZWFyRGVzY3JpcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSVByb2plY3RbXSBwcm9qcyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcHJvanMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlJUHJvamVjdCBmbGV4UHJvamVjdCA9IHByb2pzW2luZGV4XTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZsZXhQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoZmxleFByb2plY3QpKSB7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZmxleFByb2plY3QpOwotCQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKLQkJCQkJCQlTdHJpbmcgc1ZlciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihjb21wLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJaW50IHZlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHNWZXIpOwotCQkJCQkJCWlmIChqMmVlVmVyc2lvbiA8PSB2ZXIpIHsKLQkJCQkJCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJCQkJCWVhckRlc2NyaXB0b3JMaXN0LmFkZChkZXNjKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChtYyAhPSBudWxsKQotCQkJCQltYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2VhckRlc2NyaXB0b3JMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjID0gKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcikgZWFyRGVzY3JpcHRvckxpc3QuZ2V0KGkpOwotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGRlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLCBkZXNjLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhFQVJfUFJPSkVDVF9OQU1FKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVFQVIoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQlmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JCQlTdHJpbmcgZnBqd2NOYW1lID0gZnBqd2MuZ2V0UHJvamVjdE5hbWUoKTsKLQkJCWlmKGZwandjTmFtZSAhPSBudWxsICYmIGZwandjTmFtZS5lcXVhbHMoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpKXsKLQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlNBTUVfTU9EVUxFX0FORF9FQVJfTkFNRSwgbmV3IE9iamVjdCBbXSB7Z2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkgfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENPTkZJR19GT0xERVIpKSB7Ci0JCQlTdHJpbmcgZm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTkZJR19GT0xERVIpOwotCQkJaWYgKGZvbGRlck5hbWUgPT0gbnVsbCB8fCBmb2xkZXJOYW1lLmxlbmd0aCgpID09IDAgfHwgZm9sZGVyTmFtZS5lcXVhbHMoIi8iKSB8fCBmb2xkZXJOYW1lLmVxdWFscygiXFwiKSkgewotCQkJCS8vIGFsbCBmb2xkZXJzIHdoaWNoIG1lZXQgdGhlIGNyaXRlcmlhIG9mICJDT05GSUdfRk9MREVSIiBhcmUgcmVxdWlyZWQKLQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlNPVVJDRUZPTERFUl9FTVBUWSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRm9sZGVyTmFtZShmb2xkZXJOYW1lKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkKLQkJCQl7Ci0JCQkJCS8qIGJ1ZyAyMjMwNzIgdGVzdCBpbnZhbGlkIGNoYXJhY3RlciAtIFVSSS5GUkFHTUVOVF9TRVBBUkFUT1IgKi8KLQkJCQkJaWYgKGZvbGRlck5hbWUuaW5kZXhPZignIycpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMucmVzb3VyY2VzX2ludmFsaWRDaGFySW5OYW1lLCAiIyIsIGZvbGRlck5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlzdGF0dXMgPSBuZXcgUmVzb3VyY2VTdGF0dXMoSVJlc291cmNlU3RhdHVzLklOVkFMSURfVkFMVUUsIG51bGwsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQUREX1RPX0VBUikpIHsKLQkJCWlmICghaXNFQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKSkgewotCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuTU9EVUxFX05PVF9TVVBQT1JURUQpOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFQVIoU3RyaW5nIGVhck5hbWUpIHsKLQkJaWYgKGVhck5hbWUgPT0gbnVsbCB8fCBlYXJOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5FUlJfRU1QVFlfTU9EVUxFX05BTUUpOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQl9IGVsc2UgaWYgKGVhck5hbWUuaW5kZXhPZigiIyIpICE9IC0xIHx8IGVhck5hbWUuaW5kZXhPZigiLyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5FUlJfSU5WQUxJRF9DSEFSUyk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIChQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy52YWxpZGF0ZVByb2plY3ROYW1lKGVhck5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJSVJ1bnRpbWUgcnQgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCWlmIChydCAhPSBudWxsKQotCQkJcmV0ID0gcnQuc3VwcG9ydHMoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpOwotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NDIwZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVQb3N0SW1wb3J0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFTW9kdWxlUG9zdEltcG9ydEhhbmRsZXIgewotCi0JcHVibGljIHZvaWQgbW9kdWxlSW1wb3J0ZWQoSVByb2plY3QgbW9kdWxlUHJvamVjdCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgzOTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVQb3N0SW1wb3J0SGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUIgPSBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLkoyRUVNb2R1bGVQb3N0SW1wb3J0SGVscGVyXzA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQiA9IEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVCA9IEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlcl8zOwotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd2ViRXh0ZW5zaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWpiRXh0ZW5zaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYXBwQ2xpZW50RXh0ZW5zaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29ubmVjdG9yRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGZpcnN0VGltZUxvYWRpbmcgPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG5vdGlmeVdlYkV4dGVuc2lvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAod2ViRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlsb2FkQ29uZmlndXJhdGlvbihXRUIpOwotCQl9Ci0JCW5vdGlmeUV4dGVuc2lvbnMod2ViRXh0ZW5zaW9ucywgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG5vdGlmeUVqYkV4dGVuc2lvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoZWpiRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlsb2FkQ29uZmlndXJhdGlvbihFSkIpOwotCQl9Ci0JCW5vdGlmeUV4dGVuc2lvbnMoZWpiRXh0ZW5zaW9ucywgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG5vdGlmeUFwcENsaWVudEV4dGVuc2lvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoYXBwQ2xpZW50RXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlsb2FkQ29uZmlndXJhdGlvbihBUFBfQ0xJRU5UKTsKLQkJfQotCQlub3RpZnlFeHRlbnNpb25zKGFwcENsaWVudEV4dGVuc2lvbnMsIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBub3RpZnlDb25uZWN0b3JFeHRlbnNpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGNvbm5lY3RvckV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJbG9hZENvbmZpZ3VyYXRpb24oQ09OTkVDVE9SKTsKLQkJfQotCQlub3RpZnlFeHRlbnNpb25zKGNvbm5lY3RvckV4dGVuc2lvbnMsIHByb2plY3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbm90aWZ5RXh0ZW5zaW9ucyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwb3N0SW1wb3J0RWxlbWVudCwgSVByb2plY3QgcHJvamVjdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3RJbXBvcnRFbGVtZW50Lmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUoyRUVNb2R1bGVQb3N0SW1wb3J0SGFuZGxlciBwb3N0Q3JlYXRlID0gKEoyRUVNb2R1bGVQb3N0SW1wb3J0SGFuZGxlcikgcG9zdEltcG9ydEVsZW1lbnRbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3NOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwb3N0Q3JlYXRlLm1vZHVsZUltcG9ydGVkKHByb2plY3QpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oZmluYWwgU3RyaW5nIGxvYWRpbmdNb2R1bGVUeXBlKSB7Ci0JCWJvb2xlYW4gc2hvdWxkTG9nRXJyb3JzID0gZmlyc3RUaW1lTG9hZGluZzsKLQkJZmlyc3RUaW1lTG9hZGluZyA9IGZhbHNlOwotCi0JCUlFeHRlbnNpb25bXSBpbXBvcnRFeHRlbnNpb25zID1QbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KCJKMkVFTW9kdWxlUG9zdEltcG9ydCIpLmdldEV4dGVuc2lvbnMoKTsgLy8kTk9OLU5MUy0xJAotCi0JCUFycmF5TGlzdCBpbnRlcmVzdGVkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGltcG9ydEV4dGVuc2lvbnNbaV07Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWJvb2xlYW4gaXNFeHRlbnNpb25JbnRlcmVzdGVkID0gZmFsc2U7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcG9zdEltcG9ydEVsZW1lbnQgPSBudWxsOwotCQkJaW50IG1vZHVsZUNvdW50ID0gMDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQl0cnkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgicG9zdEltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBvc3RJbXBvcnRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCgibW9kdWxlIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vZHVsZUNvdW50Kys7Ci0JCQkJCQlpZiAoIWlzRXh0ZW5zaW9uSW50ZXJlc3RlZCkgewotCQkJCQkJCVN0cmluZyBtb2R1bGVUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChXRUIgPT0gbG9hZGluZ01vZHVsZVR5cGUgJiYgV0VCLmVxdWFsc0lnbm9yZUNhc2UobW9kdWxlVHlwZSkpIHsKLQkJCQkJCQkJaXNFeHRlbnNpb25JbnRlcmVzdGVkID0gdHJ1ZTsKLQkJCQkJCQl9IGVsc2UgaWYgKEVKQiA9PSBsb2FkaW5nTW9kdWxlVHlwZSAmJiBFSkIuZXF1YWxzSWdub3JlQ2FzZShtb2R1bGVUeXBlKSkgewotCQkJCQkJCQlpc0V4dGVuc2lvbkludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkJCX0gZWxzZSBpZiAoQVBQX0NMSUVOVCA9PSBsb2FkaW5nTW9kdWxlVHlwZSAmJiBBUFBfQ0xJRU5ULmVxdWFsc0lnbm9yZUNhc2UobW9kdWxlVHlwZSkpIHsKLQkJCQkJCQkJaXNFeHRlbnNpb25JbnRlcmVzdGVkID0gdHJ1ZTsKLQkJCQkJCQl9IGVsc2UgaWYgKENPTk5FQ1RPUiA9PSBsb2FkaW5nTW9kdWxlVHlwZSAmJiBDT05ORUNUT1IuZXF1YWxzSWdub3JlQ2FzZShtb2R1bGVUeXBlKSkgewotCQkJCQkJCQlpc0V4dGVuc2lvbkludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChzaG91bGRMb2dFcnJvcnMpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vaWYgbm8gbW9kdWxlIHR5cGVzIGFyZSBkZWZpbmVkIHRoZSBkZWZhdWx0IGlzIHRvIGxpc3RlbiB0byBhbGwgb2YgdGhlbS4KLQkJCWlmICghaXNFeHRlbnNpb25JbnRlcmVzdGVkICYmIDAgPT0gbW9kdWxlQ291bnQpIHsKLQkJCQlpc0V4dGVuc2lvbkludGVyZXN0ZWQgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoaXNFeHRlbnNpb25JbnRlcmVzdGVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy90cnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgbGlzdC4KLQkJCQkJcG9zdEltcG9ydEVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3NOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW50ZXJlc3RlZEV4dGVuc2lvbnMuYWRkKHBvc3RJbXBvcnRFbGVtZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFtpbnRlcmVzdGVkRXh0ZW5zaW9ucy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb25maWdFbGVtZW50c1tpXSA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGludGVyZXN0ZWRFeHRlbnNpb25zLmdldChpKTsKLQkJfQotCQlpZiAoV0VCID09IGxvYWRpbmdNb2R1bGVUeXBlKSB7Ci0JCQl3ZWJFeHRlbnNpb25zID0gY29uZmlnRWxlbWVudHM7Ci0JCX0gZWxzZSBpZiAoRUpCID09IGxvYWRpbmdNb2R1bGVUeXBlKSB7Ci0JCQllamJFeHRlbnNpb25zID0gY29uZmlnRWxlbWVudHM7Ci0JCX0gZWxzZSBpZiAoQVBQX0NMSUVOVCA9PSBsb2FkaW5nTW9kdWxlVHlwZSkgewotCQkJYXBwQ2xpZW50RXh0ZW5zaW9ucyA9IGNvbmZpZ0VsZW1lbnRzOwotCQl9IGVsc2UgaWYgKENPTk5FQ1RPUiA9PSBsb2FkaW5nTW9kdWxlVHlwZSkgewotCQkJY29ubmVjdG9yRXh0ZW5zaW9ucyA9IGNvbmZpZ0VsZW1lbnRzOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1Jlc291cmNlVHlwZVJlYWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1Jlc291cmNlVHlwZVJlYWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ5NGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9SZXNvdXJjZVR5cGVSZWFkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gMTAtT2N0LTAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGF1dGhvciBzYXBuYW0KLSAqIAotICogVGhpcyBoZWxwZXIgY2xhc3Mgd2FzIGNyZWF0ZWQgZm9yIFJlc291cmNlUmVmVHlwZVJlYWRlciBhbmQgUmVzb3VyY2VFbnZSZWZUeXBlUmVhZGVyIHRvIHJlYWQgYWxsCi0gKiB2YWxpZCB0eXBlcyBmcm9tIGV4dGVuc2lvbnMgb2YgZWFjaCBhbmQgdG8gcmV0dXJuIGEgYXJyYXkgb2YgU3RyaW5nIHRvIHBvcHVsYXRlIHRoZSBSZWYgJ1R5cGUnCi0gKiBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVR5cGVSZWFkZXJIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRlbnNpb25Qb2ludDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHlwZUF0dHJpYnV0ZU5hbWU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfQVRUUklCVVRFX05BTUUgPSAidXNhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX0NPTU1PTiA9ICJDb21tb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX0VKQiA9ICJFSkIgSmFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVEFSR0VUX0lEU19BVFRSSUJVVEVfTkFNRSA9ICJ0YXJnZXQtc2VydmVyLWlkcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RBUkdFVF9JRFNfU0VQQVJBVE9SID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGlzRUpCSmFyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfUkVGID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9FTlZfUkVGID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVYVEVOU0lPTl9QT0lOVFMgPSB7Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlc291cmNlUmVmVHlwZSIsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5yZXNvdXJjZUVudlJlZlR5cGUifTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsUmVmZXJlbmNlcyhpbnQgcmVmVHlwZSwgU3RyaW5nIHNlcnZlclRhcmdldElELCBib29sZWFuIGlzRUpCSmFyLCBTdHJpbmdbXSBiYXNlSXRlbXMpIHsKLQkJU3RyaW5nIGV4dGVuc2lvblBvaW50TG9jYWwgPSBFWFRFTlNJT05fUE9JTlRTW3JlZlR5cGVdOwotCQlSZXNvdXJjZVR5cGVSZWFkZXJIZWxwZXIgcmVhZGVyID0gbmV3IFJlc291cmNlVHlwZVJlYWRlckhlbHBlcihleHRlbnNpb25Qb2ludExvY2FsLCBVU0FHRV9UWVBFLCBpc0VKQkphcik7Ci0JCVN0cmluZ1tdIGV4dGVuZGVkSXRlbXMgPSBudWxsID09IHNlcnZlclRhcmdldElEID8gcmVhZGVyLmdldFJlc1R5cGVzKCkgOiByZWFkZXIuZ2V0UmVzVHlwZXMoc2VydmVyVGFyZ2V0SUQpOwotCQlTdHJpbmdbXSBhbGxJdGVtcyA9IG51bGw7Ci0JCWlmIChudWxsID09IGV4dGVuZGVkSXRlbXMgfHwgMCA9PSBleHRlbmRlZEl0ZW1zLmxlbmd0aCkgewotCQkJYWxsSXRlbXMgPSBiYXNlSXRlbXM7Ci0JCX0gZWxzZSB7Ci0JCQlhbGxJdGVtcyA9IG5ldyBTdHJpbmdbYmFzZUl0ZW1zLmxlbmd0aCArIGV4dGVuZGVkSXRlbXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYmFzZUl0ZW1zLCAwLCBhbGxJdGVtcywgMCwgYmFzZUl0ZW1zLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGV4dGVuZGVkSXRlbXMsIDAsIGFsbEl0ZW1zLCBiYXNlSXRlbXMubGVuZ3RoLCBleHRlbmRlZEl0ZW1zLmxlbmd0aCk7Ci0JCX0KLQkJQXJyYXlzLnNvcnQoYWxsSXRlbXMpOwotCQlyZXR1cm4gYWxsSXRlbXM7Ci0JfQotCi0KLQlwcml2YXRlIFJlc291cmNlVHlwZVJlYWRlckhlbHBlcihTdHJpbmcgZXh0UG9pbnQsIFN0cmluZyB0eXBlQXR0TmFtZSwgYm9vbGVhbiBlamJKYXIpIHsKLQkJZXh0ZW5zaW9uUG9pbnQgPSBleHRQb2ludDsKLQkJdHlwZUF0dHJpYnV0ZU5hbWUgPSB0eXBlQXR0TmFtZTsKLQkJaXNFSkJKYXIgPSBlamJKYXI7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleFBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnQpOyAKLQkJcmV0dXJuIGV4UG9pbnQ7Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc0V4dGVuc2lvbnMoKSB7Ci0JCUlFeHRlbnNpb25bXSBhbGxFeHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9uUG9pbnQoKS5nZXRFeHRlbnNpb25zKCk7Ci0JCUFycmF5TGlzdCB0ZW1wVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgYWxsRXh0ZW5zaW9ucy5sZW5ndGg7ICsreCkgewotCQkJSUV4dGVuc2lvbiBjb25maWcgPSBhbGxFeHRlbnNpb25zW3hdOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY0VsZW1zID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZ2V0VmFsaWRUeXBlcyhjRWxlbXNbaV0pICE9IG51bGwpIHsKLQkJCQkJdGVtcFR5cGVzLmFkZChnZXRWYWxpZFR5cGVzKGNFbGVtc1tpXSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVtcFR5cGVzOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgY29udGFpbmluZyB2YWxpZCBSZXNvdXJjZSBSZWYgb3IgUmVzb3VyY2UgRW52IFJlZiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzVHlwZXMoKSB7Ci0JCUFycmF5TGlzdCB0eXBlcyA9IHByb2Nlc3NFeHRlbnNpb25zKCk7Ci0JCVN0cmluZ1tdIGFsbFR5cGVzID0gbmV3IFN0cmluZ1t0eXBlcy5zaXplKCldOwotCQlmb3IgKGludCB6ID0gMDsgeiA8IHR5cGVzLnNpemUoKTsgeisrKSB7Ci0JCQlhbGxUeXBlc1t6XSA9IChTdHJpbmcpIHR5cGVzLmdldCh6KTsKLQkJfQotCQlyZXR1cm4gYWxsVHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc0V4dGVuc2lvbnMoU3RyaW5nIHRhcmdldFNlcnZlcikgewotCQlJRXh0ZW5zaW9uW10gYWxsRXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvblBvaW50KCkuZ2V0RXh0ZW5zaW9ucygpOwotCQlBcnJheUxpc3QgdGVtcFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IGFsbEV4dGVuc2lvbnMubGVuZ3RoOyArK3gpIHsKLQkJCUlFeHRlbnNpb24gY29uZmlnID0gYWxsRXh0ZW5zaW9uc1t4XTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNFbGVtcyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY0VsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGdldFZhbGlkVHlwZXMoY0VsZW1zW2ldLCB0YXJnZXRTZXJ2ZXIpICE9IG51bGwpIHsKLQkJCQkJdGVtcFR5cGVzLmFkZChnZXRWYWxpZFR5cGVzKGNFbGVtc1tpXSwgdGFyZ2V0U2VydmVyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0ZW1wVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqIEByZXR1cm4gQSB2YWxpZCBUeXBlCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0VmFsaWRUeXBlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRhcmdldFNlcnZlcikgewotCQlTdHJpbmcgZWxlbWVudFNlcnZlcklEcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNFUlZFUl9UQVJHRVRfSURTX0FUVFJJQlVURV9OQU1FKTsKLQkJaWYgKG51bGwgPT0gZWxlbWVudFNlcnZlcklEcyB8fCBpc1ZhbGlkVGFyZ2V0ZWQoZWxlbWVudFNlcnZlcklEcywgdGFyZ2V0U2VydmVyKSkgewotCQkJU3RyaW5nIHVzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVVNBR0VfQVRUUklCVVRFX05BTUUpOwotCQkJaWYgKHVzYWdlLmVxdWFscyhVU0FHRV9DT01NT04pKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKHR5cGVBdHRyaWJ1dGVOYW1lKTsKLQkJCX0gZWxzZSBpZiAoaXNFSkJKYXIgJiYgdXNhZ2UuZXF1YWxzKFVTQUdFX0VKQikpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUodHlwZUF0dHJpYnV0ZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKiBAcmV0dXJuIEEgdmFsaWQgVHlwZQotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFZhbGlkVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFZhbGlkVHlwZXMoZWxlbWVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgY29udGFpbmluZyB2YWxpZCBSZXNvdXJjZSBSZWYgb3IgUmVzb3VyY2UgRW52IFJlZiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzVHlwZXMoU3RyaW5nIHRhcmdldFNlcnZlcikgewotCQlBcnJheUxpc3QgdHlwZXMgPSBwcm9jZXNzRXh0ZW5zaW9ucyh0YXJnZXRTZXJ2ZXIpOwotCQlTdHJpbmdbXSBhbGxUeXBlcyA9IG5ldyBTdHJpbmdbdHlwZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgeiA9IDA7IHogPCB0eXBlcy5zaXplKCk7IHorKykgewotCQkJYWxsVHlwZXNbel0gPSAoU3RyaW5nKSB0eXBlcy5nZXQoeik7Ci0JCX0KLQkJcmV0dXJuIGFsbFR5cGVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVGFyZ2V0ZWQoU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHRhcmdldFNlcnZlcklkKSB7Ci0JCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCB8fCB0YXJnZXRTZXJ2ZXJJZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cmlidXRlLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldFNlcnZlcklkLnRyaW0oKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGF0dHJpYnV0ZS5pbmRleE9mKHRhcmdldFNlcnZlcklkLnRyaW0oKSArIFNFUlZFUl9UQVJHRVRfSURTX1NFUEFSQVRPUikgPj0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYXR0cmlidXRlLnRyaW0oKS5sZW5ndGgoKSA+ICh0YXJnZXRTZXJ2ZXJJZC50cmltKCkubGVuZ3RoKCkgKyAxKSAmJiBhdHRyaWJ1dGUuc3Vic3RyaW5nKGF0dHJpYnV0ZS50cmltKCkubGVuZ3RoKCkgLSB0YXJnZXRTZXJ2ZXJJZC5sZW5ndGgoKSkuZXF1YWxzSWdub3JlQ2FzZSh0YXJnZXRTZXJ2ZXJJZC50cmltKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvRGVwbG95ZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzk5OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlcGxveWVyUmVnaXN0cnkgewotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEZXBsb3llclJlZ2lzdHJ5IElOU1RBTkNFOwotCXByaXZhdGUgSGFzaE1hcCBkZXBsb3lNb2R1bGVFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBEZXBsb3llclJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXBsb3llcgotCSAqIEBwYXJhbSBzZXJ2ZXJUYXJnZXQKLQkgKiBAcGFyYW0gbmF0dXJlSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVwbG95ZXIsIExpc3Qgc2VydmVyVGFyZ2V0cywgTGlzdCBuYXR1cmVzKSB7Ci0JCUhhc2hNYXAgdGFyZ2V0RGVwbG95ZXJzOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hdHVyZUlEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyVGFyZ2V0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJ1bnRpbWVJRCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0YXJnZXREZXBsb3llcnMgPSBnZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKG5hdHVyZUlEKTsKLQkJCQlnZXRUYXJnZXREZXBsb3llcnModGFyZ2V0RGVwbG95ZXJzLCBydW50aW1lSUQpLmFkZChkZXBsb3llcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RGVwbG95ZXJzKFN0cmluZyBuYXR1cmVJRCwgU3RyaW5nIHNlcnZlclRhcmdldCkgewotCQlIYXNoTWFwIHRhcmdldERlcGxveWVycyA9IGdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMobmF0dXJlSUQpOwotCQlyZXR1cm4gZ2V0VGFyZ2V0RGVwbG95ZXJzKHRhcmdldERlcGxveWVycywgc2VydmVyVGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERlcGxveWVyUmVnaXN0cnkgaW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBEZXBsb3llclJlZ2lzdHJ5KCk7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlEZXBsb3llclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBEZXBsb3llclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBJVmlydHVhbENvbXBvbmVudCdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlbGVjdGVkTW9kdWxlcyhPYmplY3RbXSBteVNlbGVjdGlvbnMpIHsKLQkJTGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG15U2VsZWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iamVjdCA9IG15U2VsZWN0aW9uc1tpXTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJb2JqZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iamVjdCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3Qpb2JqZWN0KTsKLQkJCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gbnVsbDsKLQkJCQkJCi0JCQkJbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJaWYgKG1vZGVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gd2UganVzdCBoYXBwZW4gdG8ga25vdyBpdAotCQkJCUVPYmplY3Qgcm9vdCA9IChFT2JqZWN0KSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJCi0JCQkJaWYgKHJvb3QgPT0gbnVsbCB8fCBtb2R1bGVzLmNvbnRhaW5zKGNvbXBvbmVudCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIE9yZGVyIEVhcnMgZmlyc3QuLi4KLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQotCQkJCQltb2R1bGVzLmFkZCgwLCBjb21wb25lbnQpOwotCQkJCWVsc2UKLQkJCQkJbW9kdWxlcy5hZGQoY29tcG9uZW50KTsKLQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXREZXBsb3llcnMKLQkgKiBAcGFyYW0gc2VydmVyVGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRhcmdldERlcGxveWVycyhIYXNoTWFwIHRhcmdldERlcGxveWVycywgU3RyaW5nIHNlcnZlclRhcmdldCkgewotCQlpZiAodGFyZ2V0RGVwbG95ZXJzLmdldChzZXJ2ZXJUYXJnZXQpID09IG51bGwpCi0JCQl0YXJnZXREZXBsb3llcnMucHV0KHNlcnZlclRhcmdldCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJcmV0dXJuIChMaXN0KSB0YXJnZXREZXBsb3llcnMuZ2V0KHNlcnZlclRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hdHVyZUlECi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKFN0cmluZyBuYXR1cmVJRCkgewotCQlpZiAoZ2V0RGVwbG95TW9kdWxlRXh0ZW5zaW9ucygpLmdldChuYXR1cmVJRCkgPT0gbnVsbCkKLQkJCWdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMoKS5wdXQobmF0dXJlSUQsIG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gKEhhc2hNYXApIGdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMoKS5nZXQobmF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVwbG95RXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZGVwbG95TW9kdWxlRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVwbG95RXh0ZW5zaW9ucwotCSAqICAgICAgICAgICAgVGhlIGRlcGxveUV4dGVuc2lvbnMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveU1vZHVsZUV4dGVuc2lvbnMoSGFzaE1hcCBkZXBsb3lFeHRlbnNpb25zKSB7Ci0JCXRoaXMuZGVwbG95TW9kdWxlRXh0ZW5zaW9ucyA9IGRlcGxveUV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBydW50aW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMoRU9iamVjdCBtb2R1bGUsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KG1vZHVsZSk7Ci0JCXJldHVybiBnZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKGNvbXAuZ2V0UHJvamVjdCgpLCBydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVwbG95TW9kdWxlRXh0ZW5zaW9ucyhJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCVN0cmluZyB0eXBlSUQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpCi0JCQl0eXBlSUQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpCi0JCQl0eXBlSUQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuU1RBVElDX1dFQjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpKQotCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCOwotCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkpCi0JCQl0eXBlSUQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0E7Ci0JCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocHJvamVjdCkpCi0JCQl0eXBlSUQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZOwotCQlTdHJpbmcgcnVudGltZUlEID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCXJldHVybiBnZXREZXBsb3llcnModHlwZUlELCBydW50aW1lSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0RlcGxveWVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4NGNmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0RlcGxveWVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95ZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQkvKioKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX0RFUExPWUVSX0VYVEVOU0lPTl9QT0lOVCA9ICJEZXBsb3llckV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TRVJWRVJfUlVOVElNRV9JRCA9ICJydW50aW1lX3NlcnZlcl9pZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUUgPSAicnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUVSID0gImRlcGxveWVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUVSX0NMQVNTID0gImRlcGxveWVyX2NsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfTkFUVVJFX0lEID0gIm1vZHVsZV9uYXR1cmVfaWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkUgPSAibmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEVfSUQgPSAiY29tcG9uZW50X3R5cGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlQgPSAiY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlcGxveWVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKEoyRUVQbHVnaW4uUExVR0lOX0lELCBKMkVFX0RFUExPWUVSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhERVBMT1lFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgcnVudGltZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmF0dXJlYW5kY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVudGltZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKFJVTlRJTUUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVudGltZSA9IHJ1bnRpbWVzW2ldOwotCQkJU3RyaW5nIHNlcnZlclRhcmdldCA9IHJ1bnRpbWUuZ2V0QXR0cmlidXRlKFRBUkdFVF9TRVJWRVJfUlVOVElNRV9JRCk7Ci0JCQlydW50aW1lTGlzdC5hZGQoc2VydmVyVGFyZ2V0KTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBuYXR1cmVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihOQVRVUkUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBuYXR1cmUgPSBuYXR1cmVzW2ldOwotCQkJU3RyaW5nIG5hdHVyZUlEID0gbmF0dXJlLmdldEF0dHJpYnV0ZShNT0RVTEVfVFlQRV9OQVRVUkVfSUQpOwotCQkJbmF0dXJlYW5kY29tcG9uZW50cy5hZGQobmF0dXJlSUQpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbXBvbmVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKENPTVBPTkVOVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07Ci0JCQlTdHJpbmcgY29tcFR5cGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKENPTVBPTkVOVF9UWVBFX0lEKTsKLQkJCW5hdHVyZWFuZGNvbXBvbmVudHMuYWRkKGNvbXBUeXBlKTsKLQkJfQotCi0JCVN0cmluZyBkZXBsb3llciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKERFUExPWUVSX0NMQVNTKTsKLQkJaWYgKGRlcGxveWVyICE9IG51bGwpIHsKLQkJCURlcGxveWVyUmVnaXN0cnkuaW5zdGFuY2UoKS5yZWdpc3RlcihlbGVtZW50LCBydW50aW1lTGlzdCwgbmF0dXJlYW5kY29tcG9uZW50cyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0ZhdGFsRGVwbG95ZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvRmF0YWxEZXBsb3llckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQyZmU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvRmF0YWxEZXBsb3llckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95OwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRmF0YWxEZXBsb3llckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogV2FybmluZyBjbGVhbi11cCAxMi8wNS8yMDA1Ci0gICAgICovICAgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc5OTE1MDU0Mzk5NzkyMDE3NTdMOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBGYXRhbERlcGxveWVyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBGYXRhbERlcGxveWVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBGYXRhbERlcGxveWVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgRmF0YWxEZXBsb3llckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3lIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY4ZWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSUNvbW1hbmRDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveUhlbHBlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm5zIGZpcnN0IEVKQkphciBmb3VuZCBpbiB0aGUgcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUpCSmFyIGdldEVKQkphcihJUmVzb3VyY2UgcmVzb3VyY2UsIElDb21tYW5kQ29udGV4dCBjb250ZXh0KSB7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpcmVzb3VyY2UpOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCWVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdClDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCQkJcmV0dXJuIChFSkJKYXIpZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oSVJlc291cmNlIHJlc291cmNlLCBJQ29tbWFuZENvbnRleHQgY29udGV4dCkgewotCQlFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoKElQcm9qZWN0KXJlc291cmNlKTsKLQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKLQkJCQkJCWVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdClDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCQkJCXJldHVybiAoQXBwbGljYXRpb24pZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcENsaWVudChJUmVzb3VyY2UgcmVzb3VyY2UsIElDb21tYW5kQ29udGV4dCBjb250ZXh0KSB7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpcmVzb3VyY2UpOwotCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQllZGl0ID0gKEVudGVycHJpc2VBcnRpZmFjdEVkaXQpQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCQkJCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcHAgZ2V0V2ViQXBwKElSZXNvdXJjZSByZXNvdXJjZSwgSUNvbW1hbmRDb250ZXh0IGNvbnRleHQpIHsKLQkJRW50ZXJwcmlzZUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJZWRpdCA9IChFbnRlcnByaXNlQXJ0aWZhY3RFZGl0KUNvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJCQkJcmV0dXJuIChXZWJBcHApZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoSVJlc291cmNlIHJlc291cmNlLCBJQ29tbWFuZENvbnRleHQgY29udGV4dCkgewotCQlFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoKElQcm9qZWN0KXJlc291cmNlKTsKLQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKLQkJCQkJCWVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdClDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCQkJCXJldHVybiAoQ29ubmVjdG9yKWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9KMkVFRGVwbG95T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3lPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwYzYwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3lPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ29tbWFuZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JQ29tbWFuZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveU9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgT2JqZWN0W10gc2VsZWN0aW9uOwotCXByaXZhdGUgSVN0YXR1cyBtdWx0aVN0YXR1czsKLQlwcml2YXRlIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OwotCXByaXZhdGUgYm9vbGVhbiB3YXNBdXRvQnVpbGRpbmc7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVEZXBsb3lPcGVyYXRpb24oT2JqZWN0W10gZGVwbG95YWJsZU9iamVjdHMpIHsKLQkJc3VwZXIoKTsKLQkJc2VsZWN0aW9uID0gZGVwbG95YWJsZU9iamVjdHM7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgeyAKLQkJCXR1cm5BdXRvQnVpbGRPZmYoKTsKLQkJCURlcGxveWVyUmVnaXN0cnkgcmVnID0gRGVwbG95ZXJSZWdpc3RyeS5pbnN0YW5jZSgpOwotCQkJTGlzdCBjb21wb25lbnRzID0gZ2V0U2VsZWN0ZWRNb2R1bGVzKHNlbGVjdGlvbik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLkoyRUVEZXBsb3lPcGVyYXRpb25fVUlfMCwgY29tcG9uZW50cy5zaXplKCkpOyAKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQkJY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnRzLmdldChpKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlydW50aW1lID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U2VydmVyUnVudGltZShwcm9qKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJCWlmIChydW50aW1lID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUxpc3QgdmlzaXRvcnMgPSByZWcuZ2V0RGVwbG95TW9kdWxlRXh0ZW5zaW9ucyhwcm9qLCBydW50aW1lKTsKLQkJCQlkZXBsb3kodmlzaXRvcnMsIGNvbXBvbmVudCwgbW9uaXRvcik7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZXN0b3JlQnVpbGRTZXR0aW5ncygpOwotCQl9Ci0JCXJldHVybiBnZXRNdWx0aVN0YXR1cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHVybkF1dG9CdWlsZE9mZigpIHsKLQkJLy8gdHVybiBvZmYgYXV0b2J1aWxkIAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCi0JCXdhc0F1dG9CdWlsZGluZyA9IHdvcmtzcGFjZS5pc0F1dG9CdWlsZGluZygpOwotCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQl0cnkgewotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlQnVpbGRTZXR0aW5ncygpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbj0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmICh3YXNBdXRvQnVpbGRpbmcpIHsKLQkJCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCXRyeSB7Ci0JCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlzaXRvcnMKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlcGxveShMaXN0IHZpc2l0b3JzLCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvamVjdCBwcm9qID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpdG9ycy5zaXplKCk7IGkrKykgewotCQkJaWYgKCEodmlzaXRvcnMuZ2V0KGkpIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQkJCUlDb21tYW5kIGRlcCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRlcCA9IChJQ29tbWFuZCkgKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHZpc2l0b3JzLmdldChpKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihEZXBsb3llclJlZ2lzdHJ5UmVhZGVyLkRFUExPWUVSX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGRlcCA9PSBudWxsKSBjb250aW51ZTsKLQkJCWRlcC5pbml0KHNlbGVjdGlvbik7Ci0JCQkKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5KMkVFRGVwbG95T3BlcmF0aW9uXzFfVUlfLCBuZXcgT2JqZWN0W117cHJvai5nZXROYW1lKCksIGRlcC5nZXRDbGFzcygpLmdldE5hbWUoKX0pKTsgCi0JCQl0cnkgewotCQkJCUlNb2RlbFByb3ZpZGVyIG1vZGVsUHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2opOwotCQkJCS8vIHdlIGp1c3QgaGFwcGVuIHRvIGtub3cgaXQKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgbW9kZWxQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQotCQkJCWlmKGVPYmplY3QgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJCi0JCQkJSUNvbW1hbmRDb250ZXh0IGN0eCA9IG5ldyBDb21tYW5kQ29udGV4dChtb25pdG9yLCBudWxsLCBlT2JqZWN0LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkJZGVwLmV4ZWN1dGUocHJvaiwgbnVsbCwgY3R4KTsKLQkJCQlhZGRPS1N0YXR1cyhkZXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJVGhyb3dhYmxlIHN0YXR1c0V4Y2VwdGlvbiA9IChleC5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSA/IGV4LmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpIDogZXg7Ci0JCQkJYWRkRXJyb3JTdGF0dXMoZXguZ2V0U3RhdHVzKCksIGRlcC5nZXRDbGFzcygpLmdldE5hbWUoKSwgc3RhdHVzRXhjZXB0aW9uKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkT0tTdGF0dXMoU3RyaW5nIERlcGxveWVyTmFtZSkgewotCi0JCUlTdGF0dXMgc3RhdHVzTG9jYWwgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssICIgIiwgSVN0YXR1cy5PSywgKEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJKMkVFRGVwbG95T3BlcmF0aW9uXzJfVUlfIiwgbmV3IE9iamVjdFtde0RlcGxveWVyTmFtZX0pKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCi0JCS8vVE9ETwotCQlnZXRNdWx0aVN0YXR1cygpLmFkZChzdGF0dXNMb2NhbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhjZXB0aW9uU3RhdHVzCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFcnJvclN0YXR1cyhJU3RhdHVzIGV4Y2VwdGlvblN0YXR1cywgU3RyaW5nIERlcGxveWVyTmFtZSwgVGhyb3dhYmxlIGV4KSB7Ci0KLQkJVGhyb3dhYmxlIG1haW5DYXVzZSA9IG51bGw7Ci0JCWludCBzZXZlcml0eSA9IGV4Y2VwdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoZXhjZXB0aW9uU3RhdHVzIGluc3RhbmNlb2YgTXVsdGlTdGF0dXMpIHsKLQkJCUlTdGF0dXNbXSBzdGF0aSA9ICgoTXVsdGlTdGF0dXMpIGV4Y2VwdGlvblN0YXR1cykuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGkubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRFcnJvclN0YXR1cyhzdGF0aVtpXSwgRGVwbG95ZXJOYW1lLCBzdGF0aVtpXS5nZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCX0KLQkJbWFpbkNhdXNlID0gKGV4ICE9IG51bGwgJiYgZXguZ2V0Q2F1c2UoKSAhPSBudWxsKSA/IGV4LmdldENhdXNlKCkgOiBleDsKLQotCQkvL1N0cmluZyBlcnJvck5vdGVzID0gKG1haW5DYXVzZSAhPSBudWxsICYmIG1haW5DYXVzZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgPyBtYWluQ2F1c2UuZ2V0TWVzc2FnZSgpIDogIiI7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmJpbmQoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5KMkVFRGVwbG95T3BlcmF0aW9uXzNfVUlfLERlcGxveWVyTmFtZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlTdGF0dXMgc3RhdHVzTG9jYWwgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbklEKCksIHNldmVyaXR5LCBtZXNzYWdlLCBtYWluQ2F1c2UpOyAvLyROT04tTkxTLTEkCi0JCWdldE11bHRpU3RhdHVzKCkuYWRkKHN0YXR1c0xvY2FsKTsKLQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRNYWluU3RhdHVzKElQcm9qZWN0IHByb2opIHsKLQotCQlJU3RhdHVzIGFTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5JRCgpLCBJU3RhdHVzLk9LLCBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLkoyRUVEZXBsb3lPcGVyYXRpb25fNF9VSV8sIG5ldyBPYmplY3RbXXtwcm9qLmdldE5hbWUoKX0pLCBudWxsKTsgCi0KLQkJcmV0dXJuIGFTdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtdWx0aVN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgTXVsdGlTdGF0dXMgZ2V0TXVsdGlTdGF0dXMoKSB7Ci0JCWlmIChtdWx0aVN0YXR1cyA9PSBudWxsKQotCQkJbXVsdGlTdGF0dXMgPSBnZXRNYWluU3RhdHVzKGN1cnJlbnRQcm9qZWN0KTsKLQkJcmV0dXJuIChNdWx0aVN0YXR1cyltdWx0aVN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXVsdGlTdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBtdWx0aVN0YXR1cyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlTdGF0dXMoSVN0YXR1cyBuZXdTdGF0dXMpIHsKLQkJdGhpcy5tdWx0aVN0YXR1cyA9IG5ld1N0YXR1czsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0ZWRNb2R1bGVzKE9iamVjdFtdIG15U2VsZWN0aW9ucykgewotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXlTZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gbXlTZWxlY3Rpb25zW2ldOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlvYmplY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qob2JqZWN0KTsKLQkJCQljdXJyZW50UHJvamVjdCA9IChJUHJvamVjdClvYmplY3Q7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQljdXJyZW50UHJvamVjdCA9IChJUHJvamVjdClvYmplY3Q7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoKElQcm9qZWN0KW9iamVjdCk7Ci0JCQkJaWYgKGNvbXBvbmVudHMuY29udGFpbnMoY29tcG9uZW50KSl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBPcmRlciBFYXJzIGZpcnN0Li4uCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQljb21wb25lbnRzLmFkZCgwLGNvbXBvbmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb21wb25lbnRzLmFkZChjb21wb25lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3llci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9KMkVFRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhZDQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qCi0gKiBEZXBsb3llciBpbnRlcmZhY2UgZm9yIHRoZSBKMkVFRGVwbG95bWVudEZyYW1ld29yawotICovCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICogQGRlcHJlY2F0ZWQgLSBDaGFuZ2UgdG8gdXNlIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi51dGlsaXRpZXMuSUNvbW1hbmQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRURlcGxveWVyIHsKLQkvKgotCSAqIFRoaXMgd2lsbCBjb250YWluIHRoZSBtdWx0aS1zZWxlY3Rpb24gb2Ygb2JqZWN0cyB0byBkZXBsb3kuIFRoaXMgc2VsZWN0aW9uIGNvdWxkIGJlIHVzZWQgdG8KLQkgKiBmaWx0ZXIgZWxlbWVudHMgd2l0aGluIGEgTW9kdWxlLiBBbnkgb3RoZXIgc2V0dXAgY29kZSBzaG91bGQgYmUgZG9uZSBoZXJlLi4uCi0JICovCi0Jdm9pZCBpbml0KE9iamVjdFtdIHNlbGVjdGlvbik7Ci0KLQkvKgotCSAqIFRoaXMgd2lsbCB2aXNpdCBlYWNoIGV4dGVuc2lvbidzIGRlcGxveSBvcGVyYXRpb24gb24gdGhlIGRlcGxveWFibGUgb2JqZWN0LiBBIE11bHRpLVN0YXR1cwotCSAqIHNob3VsZCBiZSByZXR1cm5lZAotCSAqLwotCUlTdGF0dXMgdmlzaXQoRUpCSmFyIGRlcGxveWFibGUpIHRocm93cyBGYXRhbERlcGxveWVyRXhjZXB0aW9uOwotCi0JSVN0YXR1cyB2aXNpdChBcHBsaWNhdGlvbkNsaWVudCBkZXBsb3lhYmxlKSB0aHJvd3MgRmF0YWxEZXBsb3llckV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgdmlzaXQoQXBwbGljYXRpb24gZGVwbG95YWJsZSkgdGhyb3dzIEZhdGFsRGVwbG95ZXJFeGNlcHRpb247Ci0KLQlJU3RhdHVzIHZpc2l0KFdlYkFwcCBkZXBsb3lhYmxlKSB0aHJvd3MgRmF0YWxEZXBsb3llckV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgdmlzaXQoQ29ubmVjdG9yIGRlcGxveWFibGUpIHRocm93cyBGYXRhbERlcGxveWVyRXhjZXB0aW9uOwotCi0JLyoKLQkgKiBBbnkgY2xlYW51cCBzaG91bGQgYmUgZG9uZSBoZXJlLi4uCi0JICovCi0Jdm9pZCBmaW5pc2goKTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ2N2EyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTnVsbE1vZHVsZUFydGlmYWN0OwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIE9iamVjdCBhZGFwdGVyIGZvciBlYXIgcHJvamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVPYmplY3RBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVPYmplY3RBZGFwdGVyCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBvYmplY3QgZm9yIGEgdHlwZSBvZiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqIC0gT2JqZWN0IHRvIGFkYXB0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKEFwcGxpY2F0aW9uKSBvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChJUHJvamVjdCkgb2JqKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoSUZpbGUpIG9iaik7Ci0JCXJldHVybiBudWxsOwotCX0vLyBnZXREZXBsb3lhYmxlT2JqZWN0Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdCBmb3IgZWFyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBBcHBsaWNhdGlvbgotCSAqICAgICAgICAgICAgYXBwbGljYXRpb24gLSBFQVIgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKGFwcGxpY2F0aW9uKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXApOwotCX0vLyBnZXREZXBsb3lhYmxlT2JqZWN0Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdCBmb3IgcHJvamVjdCBpbnN0YW5jZXMuCi0JICogCi0JICogQHBhcmFtIElQcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IC0gUHJvamVjdCBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIElNb2R1bGVPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZShwcm9qZWN0LG51bGwpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCk7Ci0JfS8vIGdldE1vZHVsZU9iamVjdAotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwbG95YWJsZSBvYmplY3QgZm9yIGZpbGUgaW5zdGFuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBJRmlsZQotCSAqICAgICAgICAgICAgZmlsZSAtIEZpbGUgaW5zdGFuY2UuCi0JICogQHJldHVybiBJTW9kdWxlT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKSB7Ci0JCQl7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPD0gMCkKLQkJCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZ2V0TW9kdWxlKGZpbGUuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpKTsKLQkJCX0KLQkJfS8vIGlmCi0JCXJldHVybiBudWxsOwotCX0vLyBnZXRNb2R1bGVPYmplY3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGxveWFibGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICByZWZPYmplY3QgLSBUaGUgY3VycmVudCByZWZPYmplY3QuCi0JICogQHJldHVybiBJTW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShFT2JqZWN0IHJlZk9iamVjdCkgewotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZk9iamVjdCk7Ci0JCVJlc291cmNlIHNlcnZSZXNvdXJjZSA9IHJlZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZWNsaXBlU2VydlJlc29ydWNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShzZXJ2UmVzb3VyY2UpOwotCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsKQotCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlyZXR1cm4gZ2V0TW9kdWxlKHByb2osY29tcG9uZW50KTsKLQl9Ly8gZ2V0TW9kdWxlCi0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkuaXRlcmF0b3IoKTsgCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gbnVsbDsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRNb2R1bGVQcm9qZWN0KHByb2plY3QsIGl0ZXJhdG9yKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVwbG95YWJsZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIElNb2R1bGVPYmplY3QKLQkgKiAgICAgICAgICAgIGRlcGxveWFibGUgLSBUaGUgY3VycmVudCBtb2R1bGUgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGNyZWF0ZU1vZHVsZU9iamVjdChJTW9kdWxlIG1vZHVsZSkgewotCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBOdWxsTW9kdWxlQXJ0aWZhY3QobW9kdWxlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0vLyBjcmVhdGVEZXBsb3lhYmxlT2JqZWN0Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3RBZGFwdGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjZ2V0T2JqZWN0Q2xhc3NOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdENsYXNzTmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3RBZGFwdGVyI2lzUGx1Z2luQWN0aXZhdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BsdWdpbkFjdGl2YXRlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ly8gRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9GbGV4aWJsZVByb2plY3RTZXJ2ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRmxleGlibGVQcm9qZWN0U2VydmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMwYmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9GbGV4aWJsZVByb2plY3RTZXJ2ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUoyRUVNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIEZsZXhpYmxlUHJvamVjdFNlcnZlclV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgSUoyRUVNb2R1bGUgZ2V0TW9kdWxlRGVsZWdhdGUoV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShjb21wb25lbnQpOwotCQlyZXR1cm4gZ2V0TW9kdWxlRGVsZWdhdGUobW9kdWxlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBTZXJ2ZXJVdGlsLmdldE1vZHVsZShwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElKMkVFTW9kdWxlIGdldE1vZHVsZURlbGVnYXRlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXJldHVybiAoSUoyRUVNb2R1bGUpIG1vZHVsZS5sb2FkQWRhcHRlcihJSjJFRU1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRNb2R1bGUoU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChjb21wb25lbnQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTM3YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0KLS8qKgotICogSjJFRSBtb2R1bGUgZmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZXBsb3lhYmxlRmFjdG9yeSBleHRlbmRzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewotCXByb3RlY3RlZCBNYXAgbW9kdWxlRGVsZWdhdGVzID0gbmV3IEhhc2hNYXAoNSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSjJFRURlcGxveWFibGVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZihjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlRGVsZWdhdGVzKGNvbXBvbmVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlIHtAbGluayAjY3JlYXRlTW9kdWxlKElQcm9qZWN0KX0gaW5zdGVhZC4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBuYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKE1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlKSB7Ci0JCWlmKG5hdHVyZSAhPSBudWxsKXsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVzKG5hdHVyZS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGVEZWxlZ2F0ZXMuZ2V0KG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmKGNvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IHByb2plY3RNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQl0cnkgewotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzTGVnYWN5SjJFRVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0JCQkJU3RyaW5nIHR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIHR5cGUsIHZlcnNpb24sIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCUoyRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBuZXcgSjJFRUZsZXhQcm9qRGVwbG95YWJsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpOwotCQkJCW1vZHVsZURlbGVnYXRlcy5wdXQobW9kdWxlLCBtb2R1bGVEZWxlZ2F0ZSk7Ci0JCQkJcHJvamVjdE1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0KLQkJCQkvLyBDaGVjayB0byBhZGQgYW55IGJpbmFyeSBtb2R1bGVzCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04uZXF1YWxzKHR5cGUpKQotCQkJCQlwcm9qZWN0TW9kdWxlcy5hZGRBbGwoY3JlYXRlQmluYXJ5TW9kdWxlcyhjb21wb25lbnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiAoSU1vZHVsZVtdKSBwcm9qZWN0TW9kdWxlcy50b0FycmF5KG5ldyBJTW9kdWxlW3Byb2plY3RNb2R1bGVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IGNyZWF0ZUJpbmFyeU1vZHVsZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUxpc3Q8SU1vZHVsZT4gcHJvamVjdE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50ID0gcmVmZXJlbmNlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkvLyBJcyByZWZlcmVuY2VkIGNvbXBvbmVudCBhIEoyRUUgYmluYXJ5IG1vZHVsZSBhcmNoaXZlIG9yIGJpbmFyeQotCQkJLy8gdXRpbGl0eSBwcm9qZWN0PwotCQkJaWYgKG1vZHVsZUNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0KLQkJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKG1vZHVsZUNvbXBvbmVudCk7Ci0JCQkJLy8gSWYgaXQgaXMgbm90IGEgajJlZSBtb2R1bGUgYW5kIHRoZSBjb21wb25lbnQgcHJvamVjdCBpcyB0aGUKLQkJCQkvLyBlYXIsIGl0IGlzIGp1c3QgYW4gYXJjaGl2ZQotCQkJCS8vIGFuZCB3ZSBjYW4gaWdub3JlIGFzIGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBFQVIKLQkJCQkvLyBkZXBsb3lhYmxlLm1lbWJlcnMoKSBtZXRob2QKLQkJCQlpZiAocXAuZ2V0VHlwZSgpID09IEphdmFFRVF1aWNrUGVlay5VTktOT1dOKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBtb2R1bGVUeXBlID0gbnVsbDsKLQkJCQlTdHJpbmcgbW9kdWxlVmVyc2lvbiA9IG51bGw7Ci0KLQkJCQlzd2l0Y2ggKHFwLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5FSkI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5KQ0E7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT047Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFk7Ci0JCQkJCW1vZHVsZVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUOwotCQkJCX0KLQotCQkJCWludCB2ZXJzaW9uID0gcXAuZ2V0VmVyc2lvbigpOwotCQkJCW1vZHVsZVZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyh2ZXJzaW9uKTsKLQotCQkJCUlNb2R1bGUgbmVzdGVkTW9kdWxlID0gY3JlYXRlTW9kdWxlKG1vZHVsZUNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSwgbW9kdWxlQ29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBtb2R1bGVUeXBlLCBtb2R1bGVWZXJzaW9uLCBtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQlpZiAobmVzdGVkTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJSjJFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSA9IG5ldyBKMkVFRmxleFByb2pEZXBsb3lhYmxlKG1vZHVsZUNvbXBvbmVudC5nZXRQcm9qZWN0KCksIG1vZHVsZUNvbXBvbmVudCk7Ci0JCQkJCW1vZHVsZURlbGVnYXRlcy5wdXQobmVzdGVkTW9kdWxlLCBtb2R1bGVEZWxlZ2F0ZSk7Ci0JCQkJCXByb2plY3RNb2R1bGVzLmFkZChuZXN0ZWRNb2R1bGUpOwotCQkJCQltb2R1bGVEZWxlZ2F0ZS5nZXRVUkkobmVzdGVkTW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdE1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCB0aGUgbW9kdWxlIHNob3VsZCBsaXN0ZW4gdG8gZm9yIHN0YXRlCi0JICogY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLiBTdWJjbGFzc2VzIGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHBhdGhzLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwotCSAqLwotCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgSVBhdGhbXSB7IG5ldyBQYXRoKCIucHJvamVjdCIpLCAvLyBuYXR1cmUKLQkJCQluZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSksIC8vIGNvbXBvbmVudAotCQkJCW5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIikgLy8gZmFjZXRzCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJbW9kdWxlRGVsZWdhdGVzID0gbmV3IEhhc2hNYXAoNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVGbGV4UHJvakRlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWM0ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVGbGV4UHJvakRlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JQXBwbGljYXRpb25DbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklDb25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFSkJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKMkVFTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLkNvbXBvbmVudERlcGxveWFibGU7Ci0vKioKLSAqIEoyRUUgbW9kdWxlIHN1cGVyY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRmxleFByb2pEZXBsb3lhYmxlIGV4dGVuZHMgQ29tcG9uZW50RGVwbG95YWJsZSBpbXBsZW1lbnRzIElKMkVFTW9kdWxlLCBJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLCBJQXBwbGljYXRpb25DbGllbnRNb2R1bGUsIElDb25uZWN0b3JNb2R1bGUsIElFSkJNb2R1bGUsIElXZWJNb2R1bGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0NMQVNTRVNfUEFUSCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQYXRoIE1BTklGRVNUX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfTElCKS5tYWtlQWJzb2x1dGUoKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNFX1NJTkdMRV9ST09UX1BST1BFUlRZID0gInVzZVNpbmdsZVJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290W10gY2FjaGVkU291cmNlQ29udGFpbmVyczsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lcltdIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY2FjaGVkT3V0cHV0TWFwcGluZ3M7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY2FjaGVkU291cmNlT3V0cHV0UGFpcnM7Ci0JcHJvdGVjdGVkIExpc3QgY2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeVVSSXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVGbGV4UHJvakRlcGxveWFibGUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gYUNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBKMkVFRmxleFByb2pEZXBsb3lhYmxlKElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJc3VwZXIocHJvamVjdCwgYUNvbXBvbmVudCk7Ci0JfQotCQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVGbGV4UHJvakRlcGxveWFibGUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSjJFRUZsZXhQcm9qRGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcmVzb3VyY2UgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0UmVzb3VyY2VGb2xkZXJzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlpZiAodmMgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxGb2xkZXIgdkZvbGRlciA9IHZjLmdldFJvb3RGb2xkZXIoKTsKLQkJCWlmICh2Rm9sZGVyICE9IG51bGwpIHsKLQkJCQlJQ29udGFpbmVyW10gdW5kZXJseWluZ0ZvbGRlcnMgPSB2Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KHVuZGVybHlpbmdGb2xkZXJzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29udGFpbmVyW10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ29udGFpbmVyW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgY29udGFpbmluZyBKYXZhIG91dHB1dCBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgSmF2YSBvdXRwdXQgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKSB7Ci0JCWlmIChjYWNoZWRPdXRwdXRDb250YWluZXJzID09IG51bGwpCi0JCQljYWNoZWRPdXRwdXRDb250YWluZXJzID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JfQotCQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyWzBdOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlVXRpbGl0eUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCxJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsIEFydGlmYWN0RWRpdCBlZGl0KSB7Ci0JCS8vIElmIHRoZSBjb21wb25lbnQgbW9kdWxlIGlzIGFuIEVBUiB3ZSBrbm93IGFsbCBhcmNoaXZlcyBhcmUgZmlsdGVyZWQgb3V0IG9mIHZpcnR1YWwgY29tcG9uZW50IG1lbWJlcnMKLQkJLy8gYW5kIHdlIHdpbGwgcmV0dXJuIG9ubHkgdGhvc2UgYXJjaGl2ZXMgd2hpY2ggYXJlIG5vdCBiaW5hcnkgSjJFRSBtb2R1bGVzIGluIHRoZSBFQVIgREQuICBUaGVzZSBKMkVFIG1vZHVsZXMgd2lsbAotCQkvLyBiZSByZXR1cm5lZCBieSBnZXRDaGlsZE1vZHVsZXMoKQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlyZXR1cm4gdmlydHVhbENvbXAgIT0gbnVsbCAmJiB2aXJ0dWFsQ29tcC5pc0JpbmFyeSgpICYmICFpc05lc3RlZEoyRUVNb2R1bGUodmlydHVhbENvbXAsIHJlZmVyZW5jZXMsIChFQVJBcnRpZmFjdEVkaXQpZWRpdCk7Ci0JCX0gZWxzZSB7IAotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KHZpcnR1YWxDb21wLCByZWZlcmVuY2VzLCBlZGl0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVdGlsTWVtYmVyKElWaXJ0dWFsQ29tcG9uZW50IHBhcmVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBJUGF0aCBydW50aW1lUGF0aCkgewotCQkvLyBkbyBub3QgYWRkIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgd2hvc2UgcnVudGltZSBwYXRoICguLi8pIG1hcHMgdG8gdGhlIHBhcmVudCBjb21wb25lbnQgb3IgdGhhdCByZXByZXNlbnQKLQkJLy8gY2xhc3MgZm9sZGVycwotCQlpZiAoIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCi0JCQkJJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJSZWZlcmVuY2UocmVmZXJlbmNlKSkgewotCQkJc3VwZXIuYWRkVXRpbE1lbWJlcihwYXJlbnQsIHJlZmVyZW5jZSwgcnVudGltZVBhdGgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRCaW5hcnlNb2R1bGVNZW1iZXJzKCkgewotCQlJUGF0aCBhcmNoaXZlUGF0aCA9ICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCU1vZHVsZUZpbGUgbWYgPSBudWxsOwotCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCkgeyAvL0luIFdvcmtzcGFjZQotCQkJSUZpbGUgdXRpbEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYXJjaGl2ZVBhdGgpOwotCQkJbWYgPSBuZXcgTW9kdWxlRmlsZSh1dGlsRmlsZSwgdXRpbEZpbGUuZ2V0TmFtZSgpLCAoKEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCljb21wb25lbnQpLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQl9IGVsc2UgewotCQkJRmlsZSBleHRGaWxlID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpY29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCW1mID0gbmV3IE1vZHVsZUZpbGUoZXh0RmlsZSwgZXh0RmlsZS5nZXROYW1lKCksICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbXSB7bWZ9OwotCX0KLQkKLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbWVtYmVycy5jbGVhcigpOwotCQljbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5jbGVhcigpOwotCi0JCS8vIEhhbmRsZSBiaW5hcnkgY29tcG9uZW50cwotCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KQotCQkJcmV0dXJuIGdldEJpbmFyeU1vZHVsZU1lbWJlcnMoKTsKLQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkvLyBJZiBhbiBFQVIsIGFkZCBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgYWxsIHJlZmVyZW5jZWQgbW9kdWxlcwotCQkJYWRkUmVmZXJlbmNlZENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhjb21wb25lbnQsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJLy8gSWYgYSB3ZWIsIGFkZCBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgYWxsIFdFQi1JTkYvbGliIG1vZHVsZXMKLQkJCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGNvbXBvbmVudCwgdHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAoY2FuRXhwb3J0Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGNvbXBvbmVudCkpewotCQkJCXNhdmVDbGFzc3BhdGhEZXBlbmRlbmN5VVJJcyhjb21wb25lbnQpOwotCQkJfQotCQkJLy8gQWRkIGFsbCBKYXZhIG91dHB1dCBmb2xkZXJzIHRoYXQgaGF2ZSBwdWJsaXNoL2V4cG9ydCBhdHRyaWJ1dGVzCi0JCQlhZGRDbGFzc0ZvbGRlckRlcGVuZGVuY2llcyhjb21wb25lbnQpOwotCQl9Ci0JCQotCQkvLyBJZiBqMmVlIHByb2plY3Qgc3RydWN0dXJlIGlzIGEgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBqdXN0IHJldHVybiBvcHRpbWl6ZWQgbWVtYmVycwotCQlpZiAoaXNTaW5nbGVSb290U3RydWN0dXJlKCkpIHsKLQkJCWZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldE9wdGltaXplZE1lbWJlcnMoKTsKLQkJCWlmICghY2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeVVSSXMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlc1tpXTsKLQkJCQkJCWlmIChmb2xkZXIuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKSkgewotCQkJCQkJCUlNb2R1bGVSZXNvdXJjZVtdIGZpbGVzID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChmaWxlc1tqXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlmaWxlc1tqXSA9IHJlcGxhY2VNYW5pZmVzdEZpbGUoKElNb2R1bGVGaWxlKSBmaWxlc1tqXSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgdG8gYW55IHBvdGVudGlhbGx5IG1hcHBlZCBKYXZhIGNsYXNzIGZvbGRlcnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWVtYmVycy5hZGQocmVzb3VyY2VzW2ldKTsKLQkJCX0KLQkJCXJldHVybiAoSU1vZHVsZVJlc291cmNlW10pIG1lbWJlcnMudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlW21lbWJlcnMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCWNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKGdldFByb2plY3QoKSk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBqYXZhUGF0aCA9IFBhdGguRU1QVFk7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLQkJCQlqYXZhUGF0aCA9IFdFQl9DTEFTU0VTX1BBVEg7Ci0JCQkKLQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyh2Rm9sZGVyLCBQYXRoLkVNUFRZKTsKLQkJCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJCQltZW1iZXJzLmFkZChtcltqXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJQ29udGFpbmVyW10gamF2YUNvbnQgPSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpOwkJCi0JCQlpbnQgc2l6ZSA9IGphdmFDb250Lmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJLy9JZiB0aGUgamF2YSBvdXRwdXQgaXMgaW4gdGhlIHNjb3BlIG9mIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCwgaWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKLQkJCQlpZiAoQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoamF2YUNvbnRbaV0pLmxlbmd0aCA+IDApIAotCQkJCQljb250aW51ZTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnMoamF2YUNvbnRbaV0sIGphdmFQYXRoLCBqYXZhUGF0aCwgamF2YUNvbnQpOwotCQkJCWludCBzaXplMiA9IG1yLmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJbWVtYmVycy5hZGQobXJbal0pOwotCQkJCX0KLQkJCX0KLQkJCQkJCQkJCQotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJYWRkVXRpbE1lbWJlcnMoY29tcG9uZW50KTsKLQkJCQlMaXN0IGNvbnN1bWFibGVNZW1iZXJzID0gZ2V0Q29uc3VtYWJsZVJlZmVyZW5jZWRNZW1iZXJzKGNvbXBvbmVudCk7Ci0JCQkJaWYgKCFjb25zdW1hYmxlTWVtYmVycy5pc0VtcHR5KCkpCi0JCQkJCW1lbWJlcnMuYWRkQWxsKGNvbnN1bWFibGVNZW1iZXJzKTsKLQkJCX0KLQkJCQotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBuZXcgSU1vZHVsZVJlc291cmNlW21lbWJlcnMuc2l6ZSgpXTsKLQkJCW1lbWJlcnMudG9BcnJheShtcik7Ci0JCQlyZXR1cm4gbXI7Ci0JCX0gZmluYWxseSB7Ci0JCQljYWNoZWRTb3VyY2VDb250YWluZXJzID0gbnVsbDsKLQkJCWNhY2hlZE91dHB1dENvbnRhaW5lcnMgPSBudWxsOwotCQkJY2FjaGVkT3V0cHV0TWFwcGluZ3MgPSBudWxsOwotCQkJY2FjaGVkU291cmNlT3V0cHV0UGFpcnMgPSBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJTW9kdWxlRmlsZSBjcmVhdGVNb2R1bGVGaWxlKElGaWxlIGZpbGUsIElQYXRoIHBhdGgpIHsKLQkJLy8gaWYgdGhpcyBpcyB0aGUgTUFOSUZFU1QuTUYgZmlsZSBhbmQgd2UgaGF2ZSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcywgCi0JCS8vIHVwZGF0ZSBpdAotCQlyZXR1cm4gcmVwbGFjZU1hbmlmZXN0RmlsZShzdXBlci5jcmVhdGVNb2R1bGVGaWxlKGZpbGUsIHBhdGgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVGaWxlIHJlcGxhY2VNYW5pZmVzdEZpbGUoSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlmaW5hbCBJRmlsZSBmaWxlID0gKElGaWxlKSBtb2R1bGVGaWxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlmaW5hbCBJUGF0aCBwYXRoID0gbW9kdWxlRmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKTsKLQkJLy8gaWYgdGhlIE1BTklGRVNULk1GIGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgd2UgaGF2ZSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcywgCi0JCS8vIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgY3VzdG9taXplZCBNQU5JRkVTVC5NRiBhbmQgcmV0dXJuIHRoYXQgCi0JCWlmIChwYXRoLmFwcGVuZChmaWxlLmdldE5hbWUoKSkuZXF1YWxzKE1BTklGRVNUX1BBVEgpICYmICFjbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5pc0VtcHR5KCkpIHsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWZpbmFsIElQYXRoIHdvcmtpbmdMb2NhdGlvbiA9IHByb2plY3QuZ2V0V29ya2luZ0xvY2F0aW9uKEoyRUVQbHVnaW4uUExVR0lOX0lEKTsKLQkJCS8vIGNyZWF0ZSBwYXRoIHRvIHRlbXAgTUFOSUZFU1QuTUYKLQkJCWZpbmFsIElQYXRoIHRlbXBNYW5pZmVzdFBhdGggPSB3b3JraW5nTG9jYXRpb24uYXBwZW5kKE1BTklGRVNUX1BBVEgpOwotCQkJZmluYWwgRmlsZSBmc0ZpbGUgPSB0ZW1wTWFuaWZlc3RQYXRoLnRvRmlsZSgpOwotCQkJaWYgKCFmc0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyBjcmVhdGUgcGFyZW50IGRpcnMgZm9yIHRlbXAgTUFOSUZFU1QuTUYKLQkJCQlmaW5hbCBGaWxlIHBhcmVudCA9IGZzRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKCFwYXJlbnQubWtkaXJzKCkpIHsKLQkJCQkJCXJldHVybiBtb2R1bGVGaWxlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIHRlbXAgTUFOSUZFU1QuTUYgdXNpbmcgdXRpbCBtZXRob2QKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbC51cGRhdGVNYW5pZmVzdENsYXNzcGF0aChmaWxlLCBjbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcywgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZnNGaWxlKSk7Ci0JCQkJLy8gY3JlYXRlIG5ldyBNb2R1bGVGaWxlIHRoYXQgcG9pbnRzIHRvIHRlbXAgTUFOSUZFU1QuTUYKLQkJCQlyZXR1cm4gbmV3IE1vZHVsZUZpbGUoZnNGaWxlLCBmaWxlLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGhhbmRsZUphdmFQYXRoKElQYXRoIHBhdGgsIElQYXRoIGphdmFQYXRoLCBJUGF0aCBjdXJQYXRoLCBJQ29udGFpbmVyW10gamF2YUNvbnQsIElNb2R1bGVSZXNvdXJjZVtdIG1yLCBJQ29udGFpbmVyIGNjKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdXJQYXRoLmVxdWFscyhqYXZhUGF0aCkpIHsKLQkJCWludCBzaXplID0gamF2YUNvbnQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtcjIgPSBnZXRNZW1iZXJzKGphdmFDb250W2ldLCBwYXRoLmFwcGVuZChjYy5nZXROYW1lKCkpLCBudWxsLCBudWxsKTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtcjMgPSBuZXcgSU1vZHVsZVJlc291cmNlW21yLmxlbmd0aCArIG1yMi5sZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobXIsIDAsIG1yMywgMCwgbXIubGVuZ3RoKTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1yMiwgMCwgbXIzLCBtci5sZW5ndGgsIG1yMi5sZW5ndGgpOwotCQkJCW1yID0gbXIzOwotCQkJfQotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBjb250YWluc0ZvbGRlciA9IGZhbHNlOwotCQkJU3RyaW5nIG5hbWUgPSBqYXZhUGF0aC5zZWdtZW50KGN1clBhdGguc2VnbWVudENvdW50KCkpOwotCQkJaW50IHNpemUgPSBtci5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgIWNvbnRhaW5zRm9sZGVyOyBpKyspIHsKLQkJCQlpZiAobXJbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJCUlNb2R1bGVGb2xkZXIgbWYyID0gKElNb2R1bGVGb2xkZXIpIG1yW2ldOwotCQkJCQlpZiAobmFtZS5lcXVhbHMobWYyLmdldE5hbWUoKSkpIHsKLQkJCQkJCWNvbnRhaW5zRm9sZGVyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFjb250YWluc0ZvbGRlciAmJiBqYXZhQ29udC5sZW5ndGggPiAwKSB7Ci0JCQkJTW9kdWxlRm9sZGVyIG1mMiA9IG5ldyBNb2R1bGVGb2xkZXIoamF2YUNvbnRbMF0sIG5hbWUsIGN1clBhdGgpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yZiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07Ci0JCQkJc2l6ZSA9IGphdmFDb250Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtcmYyID0gZ2V0TWVtYmVycyhqYXZhQ29udFtpXSwgamF2YVBhdGgsIG51bGwsIG51bGwpOwotCQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtcmYzID0gbmV3IElNb2R1bGVSZXNvdXJjZVttcmYubGVuZ3RoICsgbXJmMi5sZW5ndGhdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1yZiwgMCwgbXJmMywgMCwgbXJmLmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkobXJmMiwgMCwgbXJmMywgbXJmLmxlbmd0aCwgbXJmMi5sZW5ndGgpOwotCQkJCQltcmYgPSBtcmYzOwotCQkJCX0KLQkJCQkKLQkJCQltZjIuc2V0TWVtYmVycyhtcmYpOwotCQkJCQotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yMyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbXIubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtciwgMCwgbXIzLCAwLCBtci5sZW5ndGgpOwotCQkJCW1yM1ttci5sZW5ndGhdID0gbWYyOwotCQkJCW1yID0gbXIzOwotCQkJfQotCQl9Ci0JCXJldHVybiBtcjsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggYXMgYSBsaXN0IG9mIGFic29sdXRlIElQYXRocy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBhdGhzCi0gICAgICovCi0gICAgcHVibGljIElQYXRoW10gZ2V0Q2xhc3NwYXRoKCkgewotCQlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJSmF2YVByb2plY3QgcHJvaiA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgVVJMW10gdXJscyA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0Q2xhc3NwYXRoQXNVUkxBcnJheShwcm9qKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlVUkwgdXJsID0gdXJsc1tpXTsKLQkJCXBhdGhzLmFkZChQYXRoLmZyb21PU1N0cmluZyh1cmwuZ2V0UGF0aCgpKSk7Ci0JCX0KLSAgICAgICAgcmV0dXJuICAoSVBhdGhbXSkgcGF0aHMudG9BcnJheShuZXcgSVBhdGhbcGF0aHMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWUoU3RyaW5nIGVqYk5hbWUpIHsKLSAgICAJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpCi0gICAgCQlyZXR1cm4gbnVsbDsKLQkJRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZEhlbHBlciA9IG51bGw7Ci0JCUVKQkphciBqYXIgPSBudWxsOwotCQlBcnRpZmFjdEVkaXQgZWpiRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllamJFZGl0ID0gQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCWlmIChlamJFZGl0ICE9IG51bGwpIHsKLQkJCQlqYXIgPSAoRUpCSmFyKSBlamJFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCQltb2RIZWxwZXIgPSBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKG51bGwpOwotCQkJCXJldHVybiBtb2RIZWxwZXIgPT0gbnVsbCA/IG51bGwgOiBtb2RIZWxwZXIuZ2V0Sk5ESU5hbWUoamFyLCBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChlamJOYW1lKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVqYkVkaXQgIT0gbnVsbCkKLQkJCQllamJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBhIG51bWJlciBvZiBKMkVFIHJlbGF0ZWQgc2NlbmFyaW9zLiAgSWYgdGhpcyBpcyBhbiBlYXIgYW5kIGEgY2hpbGQgbW9kdWxlIGlzIHBhc3NlZCBpbiwKLSAgICAgKiB0aGUgVVJJIGZvciB0aGF0IGNoaWxkIG1vZHVsZSB3aWxsIGJlIHJldHVybmVkLiAgSWYgbm8gY2hpbGQgbW9kdWxlIHdhcyBwYXNzZWQsIHRoZSBVUkkgb2YgdGhlIEVBUiBpcyByZXR1cm5lZC4KLSAgICAgKiBJZiB0aGlzIGlzIGEgY2hpbGQgY29tcG9uZW50IGFuZCB0aGUgbW9kdWxlIHBhc3NlZCBpbiBpcyB0aGUgRUFSLCB3ZSBncmFiIHRoZSBtb2R1bGUgdXJpIGZvciB0aGlzIGNvbXBhcmVkIHRvIHRoYXQKLSAgICAgKiBFQVIuICBJZiBubyBlYXIgbW9kdWxlIGlzIHBhc3NlZCBpbiB3ZSBsb29rIGZvciBvbmUgYW5kIHVzZSBpdCBhbmQgcmV0dXJuIFVSSSByZWxhdGl2ZSB0byBmb3VuZCBFQVIuICBJZiBubyBFQVIncyAKLSAgICAgKiBhcmUgZm91bmQgdGhlIFVSSSBpcyByZXR1cm5lZCBpbiBhIGRlZmF1bHQgbWFubmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVVJJIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKSB7Ci0gICAgCS8vIElmIHRoZSBjb21wb25lbnQgaXMgYW4gZWFyIGFuZCB0aGUgbW9kdWxlIHBhc3NlZCBpbiBpcyBhIGNoaWxkIG1vZHVsZQotICAgIAlpZiAoY29tcG9uZW50IT1udWxsICYmIG1vZHVsZSE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpCi0gCQkJcmV0dXJuIGdldENvbnRhaW5lZFVSSShtb2R1bGUpOwotCi0gICAgCUlWaXJ0dWFsQ29tcG9uZW50IGVhciA9IG51bGw7Ci0gICAgCVN0cmluZyBhVVJJID0gbnVsbDsKLSAgICAJLy8gSWYgdGhlIGNvbXBvbmVudCBpcyBhIGNoaWxkIG1vZHVsZSBhbmQgdGhlIG1vZHVsZSBwYXNzZWQgaW4gaXMgdGhlIGVhcgotICAgIAlpZiAobW9kdWxlICE9IG51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKQotICAgIAkJZWFyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQobW9kdWxlLmdldFByb2plY3QoKSk7Ci0gICAgCS8vIGVsc2UgaWYgdGhlIGNvbXBvbmVudCBpcyBhIGNoaWxkIG1vZHVsZSBhbmQgdGhlIG1vZHVsZSBwYXNzZWQgaW4gaXMgbnVsbCwgc2VhcmNoIGZvciBmaXJzdCBlYXIKLSAgICAJZWxzZSBpZiAobW9kdWxlPT1udWxsICYmIGNvbXBvbmVudCAhPSBudWxsKSB7Ci0gICAgCQlJUHJvamVjdFtdIGVhclByb2plY3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkgICAgICAgIGlmIChlYXJQcm9qZWN0cy5sZW5ndGg+MCkKLQkgICAgICAgIAllYXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0c1swXSk7Ci0gICAgCX0KLSAgICAJLy8gV2UgaGF2ZSBhIHZhbGlkIGVhciBhbmQgdGhlIGNvbXBvbmVudCBpcyBhIHZhbGlkIGNoaWxkCi0gICAgCWlmIChlYXIgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewotICAgIAkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyKTsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCQlhVVJJID0gZWFyRWRpdC5nZXRNb2R1bGVVUkkoY29tcG9uZW50KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQkJZWFyRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0gICAgCX0gCi0gICAgCS8vIFdlIGhhdmUgYW4gZWFyIGNvbXBvbmVudCBhbmQgbm8gY2hpbGQgbW9kdWxlCi0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCWFVUkkgPSBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkrSUoyRUVNb2R1bGVDb25zdGFudHMuRUFSX0VYVDsKLSAgICAJfSAKLSAgICAJLy8gV2UgaGF2ZSBjaGlsZCBjb21wb25lbnRzIGJ1dCBjb3VsZCBub3QgZmluZCB2YWxpZCBlYXJzCi0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlleHRlbnNpb24gPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwotCQkJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCWV4dGVuc2lvbiA9IElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQ7Ci0JCQkJfQotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHdlYkNvbXAuZ2V0UmVmZXJlbmNlKG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCQlpZihyZWZlcmVuY2UgIT0gbnVsbCl7Ci0JCQkJCWFVUkkgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0RGVwbG95VXJpT2ZDb21wb25lbnQocmVmZXJlbmNlLCBleHRlbnNpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFVUkkgPSB3ZWJDb21wLmdldERlcGxveWVkTmFtZSgpICsgZXh0ZW5zaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFVUkkgPSBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwotCQkJfQotCQl9IAotICAgIAllbHNlIGlmIChjb21wb25lbnQhPW51bGwgJiYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSB8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkpIHsKLSAgICAJCWFVUkkgPSBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkrSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKLSAgICAJfSAKLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotICAgIAkJYVVSSSA9IGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKStJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOwotICAgIAl9Ci0gICAgCQotICAgIAlpZiAoYVVSSSAhPW51bGwgJiYgYVVSSS5sZW5ndGgoKT4xICYmIGFVUkkuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgCQlhVVJJID0gYVVSSS5zdWJzdHJpbmcoMSk7Ci0gICAgCXJldHVybiBhVVJJOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JpbmFyeU1vZHVsZUFyY2hpdmUoSU1vZHVsZSBtb2R1bGUpIHsKLSAgICAJaWYgKG1vZHVsZSE9bnVsbCAmJiBtb2R1bGUuZ2V0TmFtZSgpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpIHx8IG1vZHVsZS5nZXROYW1lKCkuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkgfHwKLSAgICAJCQltb2R1bGUuZ2V0TmFtZSgpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQpKSB7Ci0gICAgCQlpZiAoY29tcG9uZW50IT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLSAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldENvbnRhaW5lZFVSSShJTW9kdWxlIG1vZHVsZSkgewotICAgIAlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHx8IGlzQmluYXJ5TW9kdWxlQXJjaGl2ZShtb2R1bGUpKQotICAgIAkJcmV0dXJuIG5ldyBQYXRoKG1vZHVsZS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCk7Ci0gICAgCQotICAgIAlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQobW9kdWxlLmdldFByb2plY3QoKSk7Ci0gICAgCVN0cmluZyBhVVJJID0gbnVsbDsKLSAgICAJaWYgKGNvbXAhPW51bGwgJiYgY29tcG9uZW50IT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCQlhVVJJID0gZWFyRWRpdC5nZXRNb2R1bGVVUkkoY29tcCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChlYXJFZGl0ICE9IG51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotICAgIAl9Ci0gICAgCWlmIChhVVJJICE9bnVsbCAmJiBhVVJJLmxlbmd0aCgpPjEgJiYgYVVSSS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJCWFVUkkgPSBhVVJJLnN1YnN0cmluZygxKTsKLSAgICAJcmV0dXJuIGFVUkk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNvbnRleHQgcm9vdCBwcm9wZXJ0eSBmcm9tIHRoZSBkZXBsb3lhYmxlIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gY29tcG9uZW50LmdldE1ldGFQcm9wZXJ0aWVzKCk7Ci0JCWlmKHByb3BzLmNvbnRhaW5zS2V5KEoyRUVDb25zdGFudHMuQ09OVEVYVFJPT1QpKQotCQkJcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KEoyRUVDb25zdGFudHMuQ09OVEVYVFJPT1QpOwotCSAgICByZXR1cm4gY29tcG9uZW50LmdldE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgYXBwbGljYWJsZSBmb3IgYSB3ZWIgZGVwbG95YWJsZS4gIFRoZSBtb2R1bGUgcGFzc2VkIGluIHNob3VsZCBlaXRoZXIgYmUgbnVsbCBvcgotICAgICAqIHRoZSBFQVIgbW9kdWxlIHRoZSB3ZWIgZGVwbG95YWJsZSBpcyBjb250YWluZWQgaW4uICBJdCB3aWxsIHJldHVybiB0aGUgY29udGV4dCByb290IGZyb20gdGhlIEVBUgotICAgICAqIGlmIGl0IGhhcyBvbmUgb3IgcmV0dXJuIHRoZSAuY29tcG9uZW50IHZhbHVlIGluIHRoZSB3ZWIgcHJvamVjdCBpZiBpdCBpcyBzdGFuZGFsb25lLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICogQHJldHVybiBjb250ZXh0Um9vdCBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KElNb2R1bGUgZWFyTW9kdWxlKSB7Ci0gICAgCUlQcm9qZWN0IGRlcGxveVByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotICAgIAlTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotICAgIAlpZiAoZWFyTW9kdWxlID09IG51bGwpCi0gICAgCQlyZXR1cm4gZ2V0Q29udGV4dFJvb3QoKTsKLSAgICAJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhck1vZHVsZS5nZXRQcm9qZWN0KCkpICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoZGVwbG95UHJvamVjdCkpIHsKLSAgICAJCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLSAgICAJCXRyeSB7Ci0gICAgCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhck1vZHVsZS5nZXRQcm9qZWN0KCkpOwotICAgIAkJCWNvbnRleHRSb290ID0gZWRpdC5nZXRXZWJDb250ZXh0Um9vdChkZXBsb3lQcm9qZWN0KTsKLSAgICAJCX0gZmluYWxseSB7Ci0gICAgCQkJaWYgKGVkaXQhPW51bGwpCi0gICAgCQkJCWVkaXQuZGlzcG9zZSgpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBjb250ZXh0Um9vdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgc291cmNlIGNvbnRhaW5lciwgaWYgYW55LCBmb3IgdGhlIGdpdmVuIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiBAcmV0dXJuIElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUNvbnRhaW5lciBmb3IgSUZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlQ29udGFpbmVyKElGaWxlIGZpbGUpIHsKLSAgICAJaWYgKGZpbGUgPT0gbnVsbCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNyY0NvbnRhaW5lcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKCk7Ci0gICAgCWZvciAoaW50IGk9MDsgaTxzcmNDb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQlJUGF0aCBzcmNQYXRoID0gc3JjQ29udGFpbmVyc1tpXS5nZXRQYXRoKCk7Ci0gICAgCQlpZiAoc3JjUGF0aC5pc1ByZWZpeE9mKGZpbGUuZ2V0RnVsbFBhdGgoKSkpCi0gICAgCQkJcmV0dXJuIHNyY0NvbnRhaW5lcnNbaV07Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEVpdGhlciByZXR1cm5zIHZhbHVlIGZyb20gY2FjaGUgb3Igc3RvcmVzIHJlc3VsdCBhcyB2YWx1ZSBpbiBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBvdXRwdXQgY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gc291cmNlIGNvbnRhaW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlQ29udGFpbmVyCi0gICAgICogQHJldHVybiBJQ29udGFpbmVyIG91dHB1dCBjb250YWluZXIgZm9yIGdpdmVuIHNvdXJjZSBjb250YWluZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRPdXRwdXRDb250YWluZXIoSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlQ29udGFpbmVyKSB7Ci0gICAgCWlmIChzb3VyY2VDb250YWluZXIgPT0gbnVsbCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAkKLSAgICAJSGFzaE1hcCBwYWlycyA9IGdldENhY2hlZFNvdXJjZU91dHB1dFBhaXJzKCk7Ci0gICAgCUlDb250YWluZXIgb3V0cHV0ID0gKElDb250YWluZXIpIHBhaXJzLmdldChzb3VyY2VDb250YWluZXIpOwotICAgIAlpZiAob3V0cHV0ID09IG51bGwpIHsKLSAgICAJCW91dHB1dCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE91dHB1dENvbnRhaW5lcihnZXRQcm9qZWN0KCksIHNvdXJjZUNvbnRhaW5lcik7Ci0gICAgCQlwYWlycy5wdXQoc291cmNlQ29udGFpbmVyLG91dHB1dCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFNvdXJjZUNvbnRhaW5lcnMoKSB7Ci0JCWlmIChjYWNoZWRTb3VyY2VDb250YWluZXJzICE9IG51bGwpCi0JCQlyZXR1cm4gY2FjaGVkU291cmNlQ29udGFpbmVyczsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMoZ2V0UHJvamVjdCgpKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q29uc3VtYWJsZVJlZmVyZW5jZWRNZW1iZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZjKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgY29uc3VtYWJsZU1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IHZjLmdldFJlZmVyZW5jZXMoKTsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZDb21wb25lbnRzW2ldOwotICAgIAkJaWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpPT1JVmlydHVhbFJlZmVyZW5jZS5ERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMpIHsKLSAgICAJCQlJVmlydHVhbENvbXBvbmVudCBjb25zdW1lZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgCQkJaWYgKGNvbnN1bWVkQ29tcG9uZW50IT1udWxsICYmIGlzUHJvamVjdE9mVHlwZShjb25zdW1lZENvbXBvbmVudC5nZXRQcm9qZWN0KCksSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpKSB7Ci0gICAgCQkJCWlmIChjb25zdW1lZENvbXBvbmVudCAhPSBudWxsICYmIGNvbnN1bWVkQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSE9bnVsbCkgewotICAgIAkJCQkJSVZpcnR1YWxGb2xkZXIgdkZvbGRlciA9IGNvbnN1bWVkQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLSAgICAJCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyh2Rm9sZGVyLCByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0gICAgCQkJCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLSAgICAJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgCQkJCQkJaWYgKCFtZW1iZXJzLmNvbnRhaW5zKG1yW2pdKSkKLSAgICAJCQkJCQkJbWVtYmVycy5hZGQobXJbal0pOwotICAgIAkJCQkJfQotICAgIAkJCQkJYWRkVXRpbE1lbWJlcnMoY29uc3VtZWRDb21wb25lbnQpOwotICAgIAkJCQkJTGlzdCBjaGlsZENvbnN1bWFibGVNZW1iZXJzID0gZ2V0Q29uc3VtYWJsZVJlZmVyZW5jZWRNZW1iZXJzKGNvbnN1bWVkQ29tcG9uZW50KTsKLSAgICAJCQkJCWlmICghY2hpbGRDb25zdW1hYmxlTWVtYmVycy5pc0VtcHR5KCkpCi0gICAgCQkJCQkJbWVtYmVycy5hZGRBbGwoY2hpbGRDb25zdW1hYmxlTWVtYmVycyk7Ci0gICAgCQkJCX0KLSAgICAJCQkJCi0gICAgCQkJCUlDb250YWluZXJbXSBqYXZhQ29udCA9IGdldEphdmFPdXRwdXRGb2xkZXJzKGNvbnN1bWVkQ29tcG9uZW50LmdldFByb2plY3QoKSk7CQkKLSAgICAJCQkJaW50IHNpemUgPSBqYXZhQ29udC5sZW5ndGg7Ci0gICAgCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgCQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnMoamF2YUNvbnRbal0sIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLCByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSwgamF2YUNvbnQpOwotICAgIAkJCQkJaW50IHNpemUyID0gbXIubGVuZ3RoOwotICAgIAkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzaXplMjsgaysrKSB7Ci0gICAgCQkJCQkJaWYgKCFtZW1iZXJzLmNvbnRhaW5zKG1yW2tdKSkKLSAgICAJCQkJCQkJbWVtYmVycy5hZGQobXJba10pOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0JCXJldHVybiBjb25zdW1hYmxlTWVtYmVyczsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElNb2R1bGUgZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ICkgewotICAgIAlJTW9kdWxlIG1vZHVsZSA9IHN1cGVyLmdhdGhlck1vZHVsZVJlZmVyZW5jZShjb21wb25lbnQsIHRhcmdldENvbXBvbmVudCk7Ci0gICAgCS8vIEhhbmRsZSBiaW5hcnkgbW9kdWxlIGNvbXBvbmVudHMKLSAgICAJaWYgKHRhcmdldENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotICAgIAkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSB8fCB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpIT1jb21wb25lbnQuZ2V0UHJvamVjdCgpKQotICAgIAkJCW1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKEoyRUVEZXBsb3lhYmxlRmFjdG9yeS5JRCsiOiIrdGFyZ2V0Q29tcG9uZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotCQlyZXR1cm4gbW9kdWxlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGNvbXBvbmVudCBpcyBuZXN0ZWQgSjJFRSBtb2R1bGUgb24gdGhlIGFwcGxpY2F0aW9uLnhtbCBvZiB0aGlzIEVBUgotICAgICAqIEBwYXJhbSBhQ29tcG9uZW50Ci0gICAgICogQHJldHVybiBib29sZWFuIGlzIHBhc3NlZCBpbiBjb21wb25lbnQgYSBuZXN0ZWQgSjJFRSBtb2R1bGUgb24gdGhpcyBFQVIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRKMkVFTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcywgRUFSQXJ0aWZhY3RFZGl0IGVkaXQpIHsKLSAgICAJaWYgKGVkaXQ9PW51bGwpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlBcHBsaWNhdGlvbiBhcHAgPSBlZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCWlmIChhcHAgPT0gbnVsbCkgeyAvLyBpZiBubyBhcHBsaWNhdGlvbi54bWwsIHJldHVybiBmYWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZU5hbWVkKHJlZmVyZW5jZXMsYUNvbXBvbmVudC5nZXROYW1lKCkpOwotCQkvLyBFbnN1cmUgbW9kdWxlIFVSSSBleGlzdHMgb24gRUFSIEREIGZvciBiaW5hcnkgYXJjaGl2ZQotCQlib29sZWFuIGluREQgPSBhcHAuZ2V0Rmlyc3RNb2R1bGUocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpICE9IG51bGw7Ci0JCXJldHVybiBpbkREICYmIEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsoYUNvbXBvbmVudCkuZ2V0VHlwZSgpICE9IEphdmFFRVF1aWNrUGVlay5VTktOT1dOOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlTmFtZWQoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzLCBTdHJpbmcgbmFtZSkgewotICAgIAlmb3IgKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotICAgIAkJaWYgKHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgCQkJcmV0dXJuIHJlZmVyZW5jZXNbaV07Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBBcnRpZmFjdEVkaXQgZ2V0Q29tcG9uZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcmVmZXJlbmNlcyBmb3IgSjJFRSBtb2R1bGUgZGVwbG95bWVudCBhcmUgb25seSB0aG9zZSBjaGlsZCBtb2R1bGVzIG9mIEVBUnMgb3Igd2ViIG1vZHVsZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLSAgICAJaWYgKGFDb21wb25lbnQgPT0gbnVsbCB8fCBhQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLSAgICAJCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbXSB7fTsKLSAgICAJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotICAgIAkJcmV0dXJuIGdldFdlYkxpYk1vZHVsZXMoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KWFDb21wb25lbnQpOwotICAgIAl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLSAgICAJCXJldHVybiBzdXBlci5nZXRSZWZlcmVuY2VzKGFDb21wb25lbnQpOwotICAgIAl9IGVsc2UgewotICAgIAkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVtdIHt9OwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIGRlcGVuZGVudCBtb2R1bGVzIHdoaWNoIGFyZSB1dGlsaXR5IGphcnMgaW4gdGhlIHdlYiBsaWIKLQkgKiBmb2xkZXIgb2YgdGhlIGRlcGxveWVkIHBhdGggb2YgdGhlIG1vZHVsZS4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiB0aGUgd2ViIGxpYnJhcnkgZGVwZW5kZW50IG1vZHVsZXMKLQkgKi8KLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0V2ViTGliTW9kdWxlcyhKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBjb21wLmdldE5vbk1hbmlmZXN0UmVmZXJlbmNlcygpOwotCQkvLyBDaGVjayB0aGUgZGVwbG95ZWQgcGF0aCB0byBtYWtlIHN1cmUgaXQgaGFzIGEgbGliIHBhcmVudCBmb2xkZXIgYW5kIG1hdGNocyB0aGUgd2ViLnhtbAotCQkvLyBiYXNlIHBhdGgKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVmQ29tcG9uZW50c1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpKQotCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSByZXN1bHQudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQkvKgotCSAqIEFkZCBhbnkgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgZnJvbSB0aGlzIGNvbXBvbmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgZmluYWwgYm9vbGVhbiB3ZWIpIHsKLQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZmluYWwgU2V0IGFic29sdXRlUGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkKLQkJCS8vIGlmIHdlIGFyZSBhZGRpbmcgdG8gYSB3ZWIgcHJvamVjdCwgb25seSBwcm9jZXNzIHJlZmVyZW5jZXMgd2l0aCB0aGUgL1dFQi1JTkYvbGliIHJ1bnRpbWUgcGF0aAotCQkJaWYgKHdlYiAmJiAhcnVudGltZVBhdGguZXF1YWxzKFdFQkxJQikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gaWYgdGhlIHJlZmVyZW5jZSBjYW5ub3QgZXhwb3J0IGRlcGVuZGVuY2llcywgc2tpcAotCQkJaWYgKCFjYW5FeHBvcnRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCFyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2pdOwotCQkJCQlJUGF0aCBjcFJlZlJ1bnRpbWVQYXRoID0gY3BSZWYuZ2V0UnVudGltZVBhdGgoKTsKLQotCQkJCQlpZiAoY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQkJCS8vIHdhbnQgdG8gYXZvaWQgYWRkaW5nIGR1cHMKLQkJCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNwQ29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJLy8gZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGNsYXNzIGZvbGRlciByZWZzIGhlcmUKLQkJCQkJCWlmIChjcENvbXAuaXNDbGFzc0ZvbGRlcigpKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY3BSZWZSdW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCQkJLy8gcnVudGltZSBwYXRoIHdpdGhpbiBkZXBsb3llZCBhcHAgd2lsbCBiZSBydW50aW1lIHBhdGggb2YgcGFyZW50IGNvbXBvbmVudAotCQkJCQkJCWNwUmVmUnVudGltZVBhdGggPSBydW50aW1lUGF0aDsKLQkJCQkJCX0gCQkJCQkJCi0JCQkJCQlmaW5hbCBJUGF0aCBhYnNvbHV0ZVBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDbGFzc3BhdGhWaXJ0dWFsUmVmZXJlbmNlTG9jYXRpb24oY3BSZWYpOwotCQkJCQkJaWYgKGFic29sdXRlUGF0aHMuY29udGFpbnMoYWJzb2x1dGVQYXRoKSkgewotCQkJCQkJCS8vIGhhdmUgYWxyZWFkeSBhZGRlZCBhIG1lbWJlciBmb3IgdGhpcyBhcmNoaXZlCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWFkZFV0aWxNZW1iZXIoY29tcG9uZW50LCBjcFJlZiwgY3BSZWZSdW50aW1lUGF0aCk7Ci0JCQkJCQkJYWJzb2x1dGVQYXRocy5hZGQoYWJzb2x1dGVQYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuRXhwb3J0Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJLy8gY2hlY2sgZm9yIHZhbGlkIHByb2plY3QgdHlwZQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpIAotCQkJCXx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkKLQkJCQl8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkKLSAgICAJCQl8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzYXZlQ2xhc3NwYXRoRGVwZW5kZW5jeVVSSXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmICghY29tcG9uZW50LmlzQmluYXJ5KCkgJiYgY29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBjcFJlZiA9IGNwUmVmc1tqXTsKLQkJCQkvLyBpZiB3ZSBhcmUgYWRkaW5nIHRvIGFuIEVBUiBwcm9qZWN0LCBvbmx5IHByb2Nlc3MgcmVmZXJlbmNlcyB3aXRoIHRoZSByb290IG1hcHBpbmcKLQkJCQlpZiAoIWNwUmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewotCQkJCQkvLyBmYWlscyB0aGUgcnVudGltZSBwYXRoIHRlc3QKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotCQkJCQljbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5hZGQoY3BSZWYuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc0ZvbGRlckRlcGVuZGVuY2llcyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSAmJiBjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnQpLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNwUmVmcy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2ldOwotCQkJCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gY3BSZWYuZ2V0UnVudGltZVBhdGgoKTsKLQkJCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wID0gY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wIGluc3RhbmNlb2YgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY3BDb21wID0gKENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSBjb21wOwotCQkJCQlpZiAoY3BDb21wLmlzQ2xhc3NGb2xkZXIoKSkgewotCQkJCQkJSVBhdGggdGFyZ2V0UGF0aCA9IG51bGw7Ci0JCQkJCQlpZiAocnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKSkgewotCQkJCQkJCXRhcmdldFBhdGggPSBQYXRoLkVNUFRZOwotCQkJCQkJfSBlbHNlIGlmIChydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTX1BBVEgpKSB7Ci0JCQkJCQkJdGFyZ2V0UGF0aCA9ICBXRUJfQ0xBU1NFU19QQVRIOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gY3BDb21wLmdldENsYXNzRm9sZGVyKCk7Ci0JCQkJCQlmaW5hbCBJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnMoY29udGFpbmVyLCB0YXJnZXRQYXRoLCB0YXJnZXRQYXRoLCBuZXcgSUNvbnRhaW5lcltde2NvbnRhaW5lcn0pOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtci5sZW5ndGg7IGorKykgewotCQkJCQkJCW1lbWJlcnMuYWRkKG1yW2pdKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLSAgICAvKgotICAgICAqIElmIHRoZSByZXNvdXJjZSB0byBjaGVjayBpcyBhIGZpbGUgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIGxpbmtlZC4gSWYgdGhlIHJlc291cmNlIHRvCi0gICAgICogY2hlY2sgaXMgYSBmb2xkZXIgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIGl0LCBhbnkgb2YgaXRzIHN1YiBkaXJlY3Rvcmllcywgb3IgYW55IGZpbGUgY29udGFpbmVkCi0gICAgICogd2l0aC1pbiB0aGlzIGRpcmVjdG9yeSBvZiBhbnkgb2YgaXQncyBzdWIgZGlyZWN0b3JpZXMgYXJlIGxpbmtlZC4gT3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNMaW5rZWRDb250ZW50KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZVRvQ2hlY2spIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgIAlpZiAoKHJlc291cmNlVG9DaGVjayAhPSBudWxsKSAmJiByZXNvdXJjZVRvQ2hlY2suaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAJCS8vIHNraXAgbm9uLWFjY2Vzc2libGUgZmlsZXMKLSAgICAJCWlmIChyZXNvdXJjZVRvQ2hlY2suaXNMaW5rZWQoKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAkJZWxzZSB7Ci0gICAgCQkJc3dpdGNoIChyZXNvdXJjZVRvQ2hlY2suZ2V0VHlwZSgpKSB7Ci0gICAgCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUjoKLSAgICAJCQkJCS8vIHJlY3Vyc2l2ZWx5IGNoZWNrIHN1YiBkaXJlY3RvcnkgY29udGVudHMKLSAgICAJCQkJCWZpbmFsIElSZXNvdXJjZVtdIHN1YkRpckNvbnRlbnRzID0gKChJRm9sZGVyKSByZXNvdXJjZVRvQ2hlY2spLm1lbWJlcnMoKTsKLSAgICAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViRGlyQ29udGVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQkJCQlpZiAoaGFzTGlua2VkQ29udGVudChzdWJEaXJDb250ZW50c1tpXSkpIHsKLSAgICAJCQkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJCQkJfQotICAgIAkJCQkJfQotICAgIAkJCQkJYnJlYWs7Ci0gICAgCQkJCWNhc2UgSVJlc291cmNlLkZJTEU6Ci0gICAgCQkJCQlyZXR1cm4gcmVzb3VyY2VUb0NoZWNrLmlzTGlua2VkKCk7Ci0gICAgCQkJCWRlZmF1bHQ6Ci0gICAgCQkJCQkvLyBza2lwIGFzIHdlIG9ubHkgY2FyZSBhYm91dCBmaWxlcyBhbmQgZm9sZGVycwotICAgIAkJCQkJYnJlYWs7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm9vdCBmb2xkZXJzIG9mIHRoaXMgY29tcG9uZW50IGhhdmUgYW55IGxpbmtlZCByZXNvdXJjZXMgKGZvbGRlciBvciBmaWxlKTsKLSAgICAgKiBPdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvb3RGb2xkZXJzSGF2ZUxpbmtlZENvbnRlbnQoKSB7Ci0KLSAgICAJaWYgKHRoaXMuY29tcG9uZW50ICE9IG51bGwpIHsKLSAgICAJCWZpbmFsIElDb250YWluZXJbXSByb290Rm9sZGVycyA9IHRoaXMuY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotICAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290Rm9sZGVycy5sZW5ndGg7IGkrKykgewotICAgIAkJCXRyeSB7Ci0gICAgCQkJCWJvb2xlYW4gaGFzTGlua2VkQ29udGVudCA9IHRoaXMuaGFzTGlua2VkQ29udGVudChyb290Rm9sZGVyc1tpXSk7Ci0gICAgCQkJCWlmIChoYXNMaW5rZWRDb250ZW50KSB7Ci0gICAgCQkJCQlyZXR1cm4gdHJ1ZTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXgpIHsKLSAgICAJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjb3JlRXgpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2ltcGxlIHN0cnVjdHVyZSBiYXNlZCBvbiBhCi0JICogc2luZ2xlIHJvb3QgZm9sZGVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8cD4KLQkgKiBJbiBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYWxsIGZpbGVzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJvb3QgZm9sZGVyCi0JICogYXJlIHBhcnQgb2YgdGhlIG1vZHVsZSwgYW5kIGFyZSBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG1vZHVsZSBzdHJ1Y3R1cmUuIE5vCi0JICogbW9kdWxlIHJlc291cmNlcyBleGlzdCBvdXRzaWRlIG9mIHRoaXMgc2luZ2xlIGZvbGRlci4KLQkgKiAKLQkgKiBGb3IgSjJFRSwgdGhpcyBtZXRob2Qgd2lsbCBjaGVjayBpZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5IGluIEoyRUUgc3BlYyBzdGFuZGFyZCBvdXRwdXQgZm9ybS4gIAotCSAqIFRoZSBwcm9qZWN0IG11c3QgZm9sbG93IGNlcnRhaW4gcnVsZXMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgcHJvamVjdCdzIGNvbnRlbnQgcm9vdHMgbXVzdCBiZSBzb3VyY2UgZm9sZGVycwotCSAqIGFuZCB0aGUgb3V0cHV0IGZvbGRlciBtdXN0IGFsc28gYmUgdGhlIHRoZSBjb250ZW50IHJvb3QgZm9sZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9kdWxlIGhhcyBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlUm9vdFN0cnVjdHVyZSgpIHsKLQkJaXNTaW5nbGVKYXZhT3V0cHV0Tm9uU291cmNlID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGVkaXQgPT0gbnVsbCB8fCBlZGl0LmdldENvbXBvbmVudCgpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCA9IGVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCQlMaXN0IHJlc291cmNlTWFwcyA9IHdiQ29tcC5nZXRSZXNvdXJjZXMoKTsKLQkJCQotCQkJLy8gMjI5NjUwIC0gY2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9wZXJ0eSAndXNlU2luZ2xlUm9vdCcgaXMgZGVmaW5lZC4gSWYgaXQgaXMgc2V0IGFuZAotCQkJLy8gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyB0cnVlIHRoZW4gaXQgd2lsbCBvdmVycmlkZSB0aGUgbG9naWMgY2hlY2tzIGJlbG93Ci0JCQlmaW5hbCBMaXN0IGNvbXBvbmVudFByb3BlcnRpZXMgPSB3YkNvbXAuZ2V0UHJvcGVydGllcygpOwotCQkJaWYgKGNvbXBvbmVudFByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJCWZpbmFsIEl0ZXJhdG9yIGNvbXBvbmVudFByb3BlcnRpZXNJdGVyYXRvciA9IGNvbXBvbmVudFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY29tcG9uZW50UHJvcGVydGllc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlQcm9wZXJ0eSB3YlByb3BlcnR5ID0gKFByb3BlcnR5KSBjb21wb25lbnRQcm9wZXJ0aWVzSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoSjJFRUZsZXhQcm9qRGVwbG95YWJsZS5VU0VfU0lOR0xFX1JPT1RfUFJPUEVSVFkuZXF1YWxzKHdiUHJvcGVydHkuZ2V0TmFtZSgpKSkgewotCQkJCQkJYm9vbGVhbiB1c2VTaW5nbGVSb290ID0gQm9vbGVhbi52YWx1ZU9mKHdiUHJvcGVydHkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlpZiAodXNlU2luZ2xlUm9vdCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGdldFByb2plY3QoKSkpIHsKLQkJCQkvLyBBbHdheXMgcmV0dXJuIGZhbHNlIGZvciBFQVJzIHNvIHRoYXQgbWVtYmVycyBmb3IgRUFSIGFyZSBhbHdheXMgY2FsY3VsYXRlZCBhbmQgajJlZSBtb2R1bGVzCi0JCQkJLy8gYXJlIGZpbHRlcmVkIG91dAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBsaW5rZWQgcmVzb3VyY2VzIHRoZW4gdGhpcyBpcyBub3QgYSBzaW5nbGVyb290IG1vZHVsZQotCQkJCWlmICh0aGlzLnJvb3RGb2xkZXJzSGF2ZUxpbmtlZENvbnRlbnQoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgb25seSBiYXNpYyBjb21wb25lbnQgcmVzb3VyY2UgbWFwcGluZ3MgLS0gb25lIGZvciB0aGUgY29udGVudCBmb2xkZXIgCi0JCQkJLy8gYW5kIGFueSBmb3Igc3JjIGZvbGRlcnMgbWFwcGVkIHRvIFdFQi1JTkYvY2xhc3NlcwotCQkJCWlmIChoYXNEZWZhdWx0V2ViUmVzb3VyY2VNYXBwaW5ncyhyZXNvdXJjZU1hcHMpKSB7Ci0JCQkJCS8vIFZlcmlmeSBvbmx5IG9uZSBqYXZhIG91dHB1dCBmb2xkZXIKLQkJCQkJaWYgKGdldEphdmFPdXRwdXRGb2xkZXJzKCkubGVuZ3RoPT0xKSB7Ci0JCQkJCQkvLyBWZXJpZnkgdGhlIGphdmEgb3V0cHV0IGZvbGRlciBpcyB0byA8Y29udGVudCByb290Pi9XRUItSU5GL2NsYXNzZXMKLQkJCQkJCUlQYXRoIGphdmFPdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCQlJUGF0aCBjb21wUm9vdFBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCQlpZiAoY29tcFJvb3RQYXRoLmFwcGVuZChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykuZXF1YWxzKGphdmFPdXRwdXRQYXRoKSkgCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChnZXRQcm9qZWN0KCkpIHx8IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KGdldFByb2plY3QoKSkKLQkJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpIHx8IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBsaW5rZWQgcmVzb3VyY2VzIHRoZW4gdGhpcyBpcyBub3QgYSBzaW5nbGVyb290IG1vZHVsZQotCQkJCWlmICh0aGlzLnJvb3RGb2xkZXJzSGF2ZUxpbmtlZENvbnRlbnQoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgb25seSBzb3VyY2UgZm9sZGVyIGNvbXBvbmVudCByZXNvdXJjZSBtYXBwaW5ncyB0byB0aGUgcm9vdCBjb250ZW50IGZvbGRlcgotCQkJCWlmIChpc1Jvb3RSZXNvdXJjZU1hcHBpbmcocmVzb3VyY2VNYXBzLGZhbHNlKSkgewotCQkJCQlJQ29udGFpbmVyW10gamF2YU91dHB1dEZvbGRlcnMgPSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpOwotCQkJCQkvLyBWZXJpZnkgb25seSBvbmUgamF2YSBvdXRwdXRmb2xkZXIKLQkJCQkJaWYgKGphdmFPdXRwdXRGb2xkZXJzLmxlbmd0aD09MSkgewotCQkJCQkJLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgd2Uga25vdzogZm9yIGFueSBmb2xkZXJzIGRlZmluZWQgYXMgc291cmNlIGluIHRoZSAKLQkJCQkJCS8vIC5jb21wb25lbnQgZmlsZSB0aGF0IHRoZXkgYXJlIGFsc28gamF2YSBzb3VyY2UgZm9sZGVycy4KLQkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QoZ2V0UHJvamVjdCgpKSB8fCAKLQkJCQkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoZ2V0UHJvamVjdCgpKSB8fCAKLQkJCQkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQkJaWYgKCEgaXNTb3VyY2VDb250YWluZXIoamF2YU91dHB1dEZvbGRlcnNbMF0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkJLy8gVGhlIHNpbmdsZSBvdXRwdXQgZm9sZGVyIGlzIE5PVCBhIHNvdXJjZSBmb2xkZXIgc28gdGhpcyBpcyBzaW5nbGUtcm9vdGVkLiBTaW5jZSB0aGUKLQkJCQkJCQkJLy8gb3V0cHV0IGZvbGRlciAoc29tZXRoaW5nIGxpa2UgY2xhc3NlcyBvciBiaW4pIGlzIG5vdCBhIHNvdXJjZSBmb2xkZXIsIEpEVCBjb3BpZXMgYWxsIGZpbGVzCi0JCQkJCQkJCS8vIChpbmNsdWRpbmcgbm9uIEphdmEgZmlsZXMpIHRvIHRoaXMgZm9sZGVyLCBzbyBldmVyeSByZXNvdXJjZSBuZWVkZWQgYXQgcnVudGltZSBpcyBsb2NhdGVkIAotCQkJCQkJCQkvLyBpbiBhIHNpbmdsZSBkaXJlY3RvcnkuCi0JCQkJCQkJCWlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0gZWxzZSB7Ci0vLyBEb24ndCBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLiBDdXJyZW50bHksIHdlIGNsYWltIHNpbmdsZS1yb290ZWQgd2hlbiBlamJNb2RsdWxlIGlzIHRoZSBvdXRwdXQgZm9sZGVyLiAgSG93ZXZlciwKLS8vIHdlIGtub3cgdGhpcyBpcyBub3QgdHJ1ZSBiZWNhdXNlIGl0IGNhbm5vdCBjb250YWluIG5vbiBKYXZhIGZpbGVzIHVubGVzcyBpdCBpcyB0aGUgb25seSBzb3VyY2UgZm9sZGVyLiBCdXQsIGZpeGluZwotLy8gYXQgdGhpcyB0aW1lIHdvdWxkIGJyZWFrIGFsbCBjdXJyZW50IHVzZXJzLgotLy8JCQkJCQkJCS8vIFRoZSBzaW5nbGUgb3V0cHV0IGZvbGRlciBJUyBhIHNvdXJjZSBmb2xkZXIuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlcgotLy8JCQkJCQkJCS8vIHRoZW4gdGhpcyBjYW5ub3QgYmUgc2luZ2xlLXJvb3RlZCBiZWNhdXNlIEpEVCBkb2VzIE5PVGNvcHkgbm9uIEphdmEgcmVzb3VyY2VzIGludG8gdGhlCi0vLwkJCQkJCQkJLy8gb3V0cHV0IGZvbGRlciB3aGVuIGl0IGlzIGEgc291cmNlIGZvbGRlci4KLS8vCQkJCQkJCQlpZiAoZ2V0U291cmNlQ29udGFpbmVycygpLmxlbmd0aCA+IDEpIHsKLS8vCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJCS8vIFRoZXJlIGlzIG9ubHkgb25lIHNvdXJjZSBmb2xkZXIgYW5kIHNpbmNlIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGEgc291cmNlIGZvbGRlcgotLy8JCQkJCQkJCQkvLyB0aGlzIGlzIHNpbmdsZS1yb290ZWQuCi0vLwkJCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0vLwkJCQkJCS8vIEF0IHRoaXMgcG9pbnQgZm9yIHV0aWxpdHkgcHJvamVjdHMsIHRoaXMgcHJvamVjdCBpcyBvcHRpbWl6ZWQsIHdlIGNhbiBqdXN0IHVzZSB0aGUgb3V0cHV0IGZvbGRlcgotLy8JCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChnZXRQcm9qZWN0KCkpKQotLy8JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkvLyBWZXJpZnkgdGhlIGphdmEgb3V0cHV0IGZvbGRlciBpcyB0aGUgc2FtZSBhcyBvbmUgb2YgdGhlIGNvbnRlbnQgcm9vdHMKLQkJCQkJCUlQYXRoIGphdmFPdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCQlJQ29udGFpbmVyW10gcm9vdEZvbGRlcnMgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8cm9vdEZvbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJUGF0aCBjb21wUm9vdFBhdGggPSByb290Rm9sZGVyc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCQkJaWYgKGphdmFPdXRwdXRQYXRoLmVxdWFscyhjb21wUm9vdFBhdGgpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9bnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmUgdGhhdCBhbnkgY29tcG9uZW50IHJlc291cmNlIG1hcHBpbmdzIGFyZSBmb3Igc291cmNlIGZvbGRlcnMgYW5kIAotCSAqIHRoYXQgdGhleSBtYXAgdG8gdGhlIHJvb3QgY29udGVudCBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VNYXBzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUm9vdFJlc291cmNlTWFwcGluZyhMaXN0IHJlc291cmNlTWFwcywgYm9vbGVhbiBpc0ZvckVBUikgewotCQkvLyBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIGZhbHNlCi0JCWlmIChyZXNvdXJjZU1hcHMuc2l6ZSgpPDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VNYXBzLnNpemUoKTsgaSsrKSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZU1hcCA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVzb3VyY2VNYXBzLmdldChpKTsKLQkJCS8vIFZlcmlmeSBpdCBtYXBzIHRvICIvIiBmb3IgdGhlIGNvbnRlbnQgcm9vdAotCQkJaWYgKCFyZXNvdXJjZU1hcC5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhQYXRoLlJPT1QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIElmIHRoaXMgaXMgbm90IGZvciBhbiBFQVIsIHZlcmlmeSBpdCBpcyBhbHNvIGEgc3JjIGNvbnRhaW5lcgotCQkJaWYgKCFpc0ZvckVBUikgewotCQkJCUlQYXRoIHNvdXJjZVBhdGggPSBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVzb3VyY2VNYXAuZ2V0U291cmNlUGF0aCgpKTsKLQkJCQlpZiAoIWlzU291cmNlQ29udGFpbmVyKHNvdXJjZVBhdGgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGF0aCBhcmd1bWVudCBpcyB0byBhIHNvdXJjZSBjb250YWluZXIgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhIHdvcmtzcGFjZSByZWxhdGl2ZSBmdWxsIHBhdGgKLQkgKiBAcmV0dXJuIGlzIHBhdGggYSBzb3VyY2UgY29udGFpbmVyPwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZUNvbnRhaW5lcihJUGF0aCBwYXRoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc3JjQ29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNyY0NvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNDb250YWluZXJzW2ldLmdldFBhdGgoKS5lcXVhbHMocGF0aCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGF0aCBhcmd1bWVudCBleGlzdHMgcmVsYXRpdmUgdG8gdGhpcyB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiAKLQkgKiBAcGFyYW0gYSB3b3Jrc3BhY2UgcmVsYXRpdmUgZnVsbCBwYXRoCi0JICogQHJldHVybiBpcyBwYXRoIGluIHRoZSB3b3Jrc3BhY2U/Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlyZXR1cm4gd29ya3NwYWNlUm9vdC5leGlzdHMocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoZSBkZWZhdWx0IHdlYiBzZXR1cCBpcyBjb3JyZWN0IHdpdGggb25lIHJlc291cmNlIG1hcCBhbmQgYW55IG51bWJlciBvZiBqYXZhIAotCSAqIHJlc291cmNlIG1hcHMgdG8gV0VCLUlORi9jbGFzc2VzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlTWFwcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNEZWZhdWx0V2ViUmVzb3VyY2VNYXBwaW5ncyhMaXN0IHJlc291cmNlTWFwcykgewotCQlpbnQgcm9vdFZhbGlkTWFwcyA9IDA7Ci0JCWludCBqYXZhVmFsaWRSb290cyA9IDA7Ci0JCQotCQkvLyBJZiB0aGVyZSBhcmVuJ3QgYXQgbGVhc3QgMiBtYXBzLCByZXR1cm4gZmFsc2UKLQkJaWYgKHJlc291cmNlTWFwcy5zaXplKCk8MikKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlQYXRoIHdlYkluZkNsYXNzZXMgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykubWFrZUFic29sdXRlKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZU1hcHMuc2l6ZSgpOyBpKyspIHsKLQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlTWFwID0gKENvbXBvbmVudFJlc291cmNlKSByZXNvdXJjZU1hcHMuZ2V0KGkpOwotCQkJSVBhdGggc291cmNlUGF0aCA9IGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZChyZXNvdXJjZU1hcC5nZXRTb3VyY2VQYXRoKCkpOwotCQkJCi0JCQkvLyBWZXJpZnkgaWYgdGhlIG1hcCBpcyBmb3IgdGhlIGNvbnRlbnQgcm9vdAotCQkJaWYgKHJlc291cmNlTWFwLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFBhdGguUk9PVCkpIHsKLQkJCQlyb290VmFsaWRNYXBzKys7Ci0JCQkvLyBWZXJpZnkgaWYgdGhlIG1hcCBpcyBmb3IgYSBqYXZhIHNyYyBmb2xkZXIgYW5kIGlzIG1hcHBlZCB0byAiV0VCLUlORi9jbGFzc2VzIgotCQkJfSBlbHNlIGlmIChyZXNvdXJjZU1hcC5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyh3ZWJJbmZDbGFzc2VzKSAmJiBpc1NvdXJjZUNvbnRhaW5lcihzb3VyY2VQYXRoKSkgewotCQkJCWphdmFWYWxpZFJvb3RzKys7Ci0JCQkvLyBPdGhlcndpc2Ugd2UgYmFpbCBiZWNhdXNlIHdlIGhhdmUgYSBub24gb3B0aW1pemVkIG1hcAotCQkJLy8gRXhjZXB0IGlmICB0aGUgc291cmNlIHBhdGggaXMgdG8gYSBub25leGlzdGVudCByZXNvdXJjZSB0aGVuIGp1c3QgaWdub3JlIHRoZSBtYXAgYW5kIGtlZXAgdHJ5aW5nCi0JCQl9IGVsc2UgaWYgKGV4aXN0cyhzb3VyY2VQYXRoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBNYWtlIHN1cmUgb25seSBvbmUgb2YgdGhlIG1hcHMgaXMgdGhlIGNvbnRlbnQgcm9vdCwgYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGlzIGZvciB0aGUgamF2YSBmb2xkZXIKLQkJcmV0dXJuIHJvb3RWYWxpZE1hcHM9PTEgJiYgamF2YVZhbGlkUm9vdHM+MDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYWRkZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEl0IGNhbiBPTkxZIGJlIGNhbGxlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIHNpbmdsZSByb290LgotCSAqIEBzZWUgaXNTaW5nbGVSb290U3RydWN0dXJlKCkuICBJZiB0aGUgcHJvamVjdCBoYXMgYW4gb3V0cHV0IGZvbGRlciB0aGF0IGlzIGFsc28gYSBzb3VyY2UgZm9sZGVyIHRoZW4sCi0JICogaXQgYXNzdW1lcyB0aGUgdmlydHVhbCBjb21wb25lbnQgaXMgbm90IHVzaW5nIGFueSBmbGV4aWJsZSBmZWF0dXJlcyBhbmQgaXMgaW4gYSBzdGFuZGFyZCBKMkVFIGZvcm1hdAotCSAqIHdpdGggb25lIGNvbXBvbmVudCByb290IGZvbGRlciBhbmQgYW4gb3V0cHV0IGZvbGRlciB0aGUgc2FtZSBhcyBpdHMgY29udGVudCBmb2xkZXIuICBUaGlzIHdpbGwgYnlwYXNzIAotCSAqIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBBUEkgYW5kIGp1c3QgcmV0dXJuIHRoZSBtb2R1bGUgcmVzb3VyY2VzIGFzIHRoZXkgYXJlIG9uIGRpc2suCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBNb2R1bGVSZXNvdXJjZXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIGdldE9wdGltaXplZE1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJaWYgKGlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZSkgewotCQkJCS8vIFdlIGRldGVybWluZWQgd2hlbiB0ZXN0aW5nIGZvciBhIHNpbmdsZSByb290IHN0cnVjdHVyZSB0aGF0IHRoaXMgcHJvamVjdCBoYXMKLQkJCQkvLyBvbmUgb3V0cHV0IGZvbGRlciBhbmQgdGhhdCBvdXRwdXQgZm9sZGVyIGlzIG5vdCBhIHNvdXJjZSBmb2xkZXIuIFNpbmNlIHRoZQotCQkJCS8vIG91dHB1dCBmb2xkZXIgKGZvciBleGFtcGxlLCBjbGFzc2VzIG9yIGJpbikgaXMgbm90IGEgc291cmNlIGZvbGRlciwgSkRUIGNvcGllcyBhbGwgZmlsZXMKLQkJCQkvLyAoaW5jbHVkaW5nIG5vbiBKYXZhIGZpbGVzKSB0byB0aGlzIGZvbGRlciwgc28gZXZlcnkgcmVzb3VyY2UgbmVlZGVkIGF0IHJ1bnRpbWUgaXMgbG9jYXRlZCAKLQkJCQkvLyBpbiB0aGF0IHNpbmdsZSBvdXRwdXQgZGlyZWN0b3J5LgotCQkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXSk7Ci0JCQl9Ci0JCQkvLyBGb3IgSjJFRSBtb2R1bGVzLCB3ZSB1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250ZW50IHJvb3QKLQkJCWVsc2UgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgdkZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlW10ge307Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZyb20gY2FjaGUgb3IgYWRkIHRvIGNhY2hlIHdoZXRoZXIgb3Igbm90IGFuIG91dHB1dCBjb250YWluZXIKLQkgKiBpcyBtYXBwZWQgaW4gdGhlIHZpcnR1YWwgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBvdXRwdXRDb250YWluZXIKLQkgKiBAcmV0dXJuIGlmIG91dHB1dCBjb250YWluZXIgaXMgbWFwcGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzT3V0cHV0Q29udGFpbmVyTWFwcGVkKElDb250YWluZXIgb3V0cHV0Q29udGFpbmVyKSB7Ci0JCWlmIChvdXRwdXRDb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUhhc2hNYXAgb3V0cHV0TWFwcyA9IGdldENhY2hlZE91dHB1dE1hcHBpbmdzKCk7Ci0JCUJvb2xlYW4gcmVzdWx0ID0gKEJvb2xlYW4pIG91dHB1dE1hcHMuZ2V0KG91dHB1dENvbnRhaW5lcik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlcmUgYXJlIGFueSBjb21wb25lbnQgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyLCB3ZSBrbm93IGl0IGlzIG1hcHBlZAotCQkJaWYgKENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKG91dHB1dENvbnRhaW5lcikubGVuZ3RoID4gMCkKLQkJCQlyZXN1bHQgPSBCb29sZWFuLlRSVUU7CQotCQkJLy8gT3RoZXJ3aXNlIGl0IGlzIG5vdCBtYXBwZWQKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBCb29sZWFuLkZBTFNFOwotCQkJLy8gQ2FjaGUgdGhlIHJlc3VsdCBpbiB0aGUgbWFwIGZvciB0aGlzIG91dHB1dCBjb250YWluZXIKLQkJCW91dHB1dE1hcHMucHV0KG91dHB1dENvbnRhaW5lciwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemUgdGhlIGNhY2hlZCBvdXRwdXQgbWFwcGluZ3MKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0Q2FjaGVkT3V0cHV0TWFwcGluZ3MoKSB7Ci0JCWlmIChjYWNoZWRPdXRwdXRNYXBwaW5ncz09bnVsbCkKLQkJCWNhY2hlZE91dHB1dE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZE91dHB1dE1hcHBpbmdzOwotCX0KLQkKLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemUgdGhlIGNhY2hlZCBzb3VyY2UgLSBvdXRwdXQgcGFpcmluZ3MKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0Q2FjaGVkU291cmNlT3V0cHV0UGFpcnMoKSB7Ci0JCWlmIChjYWNoZWRTb3VyY2VPdXRwdXRQYWlycz09bnVsbCkKLQkJCWNhY2hlZFNvdXJjZU91dHB1dFBhaXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZFNvdXJjZU91dHB1dFBhaXJzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtZW1iZXJzIGxpc3QgZnJvbSB0aGUgdmlydHVhbCBjb21wb25lbnQgbWFwcyBvbmx5IGlmOgotCSAqIGEpIGl0IGlzIG5vdCBpbiBhIHNvdXJjZSBmb2xkZXIKLQkgKiBiKSBpdCBpcyBpbiBhIHNvdXJjZSBmb2xkZXIsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZm9sZGVyIGlzIGEgbWFwcGVkIGNvbXBvbmVudCByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBzaG91bGQgZmlsZSBiZSBhZGRlZCB0byBtZW1iZXJzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkQ29tcG9uZW50RmlsZShJRmlsZSBmaWxlKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUNvbnRhaW5lciA9IGdldFNvdXJjZUNvbnRhaW5lcihmaWxlKTsKLQkJLy8gSWYgdGhlIGZpbGUgaXMgbm90IGluIGEgc291cmNlIGNvbnRhaW5lciwgcmV0dXJuIHRydWUKLQkJaWYgKHNvdXJjZUNvbnRhaW5lcj09bnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIEVsc2UgaWYgaXQgaXMgYSBzb3VyY2UgY29udGFpbmVyIGFuZCB0aGUgb3V0cHV0IGNvbnRhaW5lciBpcyBtYXBwZWQgaW4gdGhlIGNvbXBvbmVudCwgcmV0dXJuIHRydWUKLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuCi0JCX0gZWxzZSB7Ci0JCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IGdldE91dHB1dENvbnRhaW5lcihzb3VyY2VDb250YWluZXIpOwotCQkJcmV0dXJuIG91dHB1dENvbnRhaW5lciE9bnVsbCAmJiBpc091dHB1dENvbnRhaW5lck1hcHBlZChvdXRwdXRDb250YWluZXIpOwkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0lKMkVFTW9kdWxlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0lKMkVFTW9kdWxlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTBhOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9JSjJFRU1vZHVsZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVNb2R1bGVDb25zdGFudHMgZXh0ZW5kcyBJTW9kdWxlQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhUID0gIi5lYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVCA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9FWFQgPSAiLndhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJfRVhUID0gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1RfRUFSX1RFTVBMQVRFID0gInRlbXBsYXRlLmpzdC5lYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNUX1VUSUxJVFlfVEVNUExBVEUgPSAidGVtcGxhdGUuanN0LnV0aWxpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNUX0FQUENMSUVOVF9URU1QTEFURSA9ICJ0ZW1wbGF0ZS5qc3QuYXBwY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVF9FSkJfVEVNUExBVEUgPSAidGVtcGxhdGUuanN0LmVqYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1RfSkNBX1RFTVBMQVRFID0gInRlbXBsYXRlLmpzdC5jb25uZWN0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNUX1dFQl9URU1QTEFURSA9ICJ0ZW1wbGF0ZS5qc3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTVF9XRUJfVEVNUExBVEUgPSAidGVtcGxhdGUud3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1RfQ09NUE9ORU5UX0ZJTEUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSUoyRUVQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9JSjJFRVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzJmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9JSjJFRVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKMkVFUHJlZmVyZW5jZXMgewotCi0JU3RyaW5nIFBSRUZfSjJFRVdFQkNPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJlZmVyZW5jZS5qMmVlV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSRUZfU1RBVElDV0VCQ09OVEVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcmVmZXJlbmNlLnN0YXRpY1dlYkNvbnRlbnROYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVGX0pBVkFTT1VSQ0UgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJlZmVyZW5jZS5qYXZhU291cmNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9KMkVFV0VCQ09OVEVOVCA9ICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUZBVUxUX1NUQVRJQ1dFQkNPTlRFTlQgPSAiV2ViQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9KQVZBU09VUkNFID0gIkphdmFTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFUlZFUl9UQVJHRVRfU1VQUE9SVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcmVmZXJlbmNlLnNlcnZlcnRhcmdldHN1cHBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUdyb3VwSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUdyb3VwSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljYjc1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVHcm91cEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JR3JvdXBJbml0aWFsaXplcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVHcm91cEluaXRpYWxpemVyIGltcGxlbWVudHMgSUdyb3VwSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFR3JvdXBJbml0aWFsaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5ncm91cC5JR3JvdXBJbml0aWFsaXplciNpc0dyb3VwRW5hYmxlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dyb3VwRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4NzA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkFwcENsaWVudEVkaXRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFRGVwZW5kZW5jeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVhckVkaXRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLmxpc3RlbmVycy5KMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5saXN0ZW5lcnMuUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgdG9wLWxldmVsIGNsYXNzIG9mIHRoZSBqMmVlIHBsdWdpbi4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSjJFRVBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiBpbXBsZW1lbnRzIFJlc291cmNlTG9jYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBJUGF0aCBpY29uc0ZvbGRlciA9IG5ldyBQYXRoKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpLmdldEVudHJ5KCJpY29ucyIpLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkvLyBMaWJEaXIgQ2hhbmdlIExpc3RlbmVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCRElSQ0hBTkdFX0JVSUxERVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLkxpYkRpckJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gTGliQ29weSBidWlsZGVyIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCQ09QWV9CVUlMREVSX0lEID0gUExVR0lOX0lEICsgIi5MaWJDb3B5QnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBWYWxpZGF0aW9uIHBhcnQgb2YgdGhlIHBsdWdpbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQlVJTERFUl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEOyAvLyBwbHVnaW4KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1RSQU5TTEFUSU9OX09GX0pFVF9URU1QTEFURVNfUFJFRl9LRVkgPSAiZHluYW1pY1RyYW5zbGF0aW9uT2ZKZXRUZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET1VCTEVfUFJFRklYID0gIiUlIjsgLy8kTk9OLU5MUy0xJAkKLQkvLyBpZAotCS8vIG9mCi0JLy8gdGhlCi0JLy8gdmFsaWRhdGlvbgotCS8vIGJ1aWxkZXIvLyROT04tTkxTLTEkCi0JLy9HbG9iYWwgUmVzb3VyY2VTZXQgKHNvbWV3aGF0IGdsb2JhbCkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRJc1dvcmtzcGFjZVJlbGF0aXZlU2NoZW1hID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgZmV4dGVuZGVkRWRpdE1vZGVsczsKLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBsb2NhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSUNPTl9ESVJTID0gbmV3IFN0cmluZ1tdeyJpY29ucy9mdWxsL29iajE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N2aWV3MTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jbGNsMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvb3ZyMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvd2l6YmFuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgQm9vbGVhbiBFSkJfQVZBSUxBQkxFID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIEhBU19ERVZfUk9MRTsKLQotCXByaXZhdGUgSjJFRVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIEoyRUVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTG9nRW50cnkgX2VudHJ5OwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKMkVFIHBsdWdpbiBhbmQgY2FjaGUgaXRzIGRlZmF1bHQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSjJFRVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpCi0JCQlJTlNUQU5DRSA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE2LzIwMDEgNzozODo1NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVmYXVsdElzV29ya3NwYWNlUmVsYXRpdmVTY2hlbWEoKSB7Ci0JCXJldHVybiBkZWZhdWx0SXNXb3Jrc3BhY2VSZWxhdGl2ZVNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9uZSBhcHBsaWNhdGlvbiBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uRmFjdG9yeSkgZ2V0QXBwbGljYXRpb25QYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGVqYiBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblBhY2thZ2UgZ2V0QXBwbGljYXRpb25QYWNrYWdlKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25GYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSjJFRVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0SjJFRVdlYlByb2plY3RNaWdyYXRpb25FeHRlbnNpb25zKCkgewotCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgiSjJFRVdlYlByb2plY3RNaWdyYXRpb25FeHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHJldCA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHBjdCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9uID0gcGN0LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGwgPSAwOyBsIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytsKSB7Ci0JCQkJSUV4dGVuc2lvbiBjb25maWcgPSBleHRlbnNpb25bbF07Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjRWxlbXMgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGQgPSBjRWxlbXNbaV07Ci0JCQkJCWlmIChkLmdldE5hbWUoKS5lcXVhbHMoIm1pZ3JhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQl0cnkgewotCQkJCQkJCU9iamVjdCBtZSA9IGQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigicnVuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCXJldC5hZGQobWUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gaWdub3JlIHRoaXMgZXh0ZW5zaW9uLCBrZWVwIGdvaW5nCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFeHRlbmRlZEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsS2V5KSB7Ci0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBjdCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KCJFZGl0TW9kZWxFeHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb24gPSBwY3QuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBsID0gMDsgbCA8IGV4dGVuc2lvbi5sZW5ndGg7ICsrbCkgewotCQkJSUV4dGVuc2lvbiBjb25maWcgPSBleHRlbnNpb25bbF07Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNFbGVtcyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY0VsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGQgPSBjRWxlbXNbaV07Ci0JCQkJaWYgKGQuZ2V0TmFtZSgpLmVxdWFscygiZWRpdG1vZGVsIikgJiYgZWRpdE1vZGVsS2V5LmVxdWFscyhkLmdldEF0dHJpYnV0ZSgia2V5IikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7IC8vIGVkaXRtb2RlbCBjbGFzcwotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIChFZGl0TW9kZWwpIGQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigicnVuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRFZGl0TW9kZWxzKCkgewotCi0JCWlmIChmZXh0ZW5kZWRFZGl0TW9kZWxzICE9IG51bGwpCi0JCQlyZXR1cm4gZmV4dGVuZGVkRWRpdE1vZGVsczsKLQkJTGlzdCBlZGl0TW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcGN0ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIkVkaXRNb2RlbEV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbiA9IHBjdC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGwgPSAwOyBsIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytsKSB7Ci0JCQlJRXh0ZW5zaW9uIGNvbmZpZyA9IGV4dGVuc2lvbltsXTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY0VsZW1zID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZCA9IGNFbGVtc1tpXTsKLQkJCQlpZiAoZC5nZXROYW1lKCkuZXF1YWxzKCJlZGl0bW9kZWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gZWRpdG1vZGVsIGNsYXNzCi0JCQkJCXRyeSB7Ci0JCQkJCQllZGl0TW9kZWxzLmFkZChkLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInJ1biIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmV4dGVuZGVkRWRpdE1vZGVscyA9IGVkaXRNb2RlbHM7Ci0JCXJldHVybiBmZXh0ZW5kZWRFZGl0TW9kZWxzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7Ci0JCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9hZF9JbWFnZV9FcnJvcl8iLCBuZXcgT2JqZWN0W117a2V5fSkpOyAvLyROT04tTkxTLTEkCi0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW1hZ2VVUkwoa2V5LHRoaXMuZ2V0QnVuZGxlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SW5zdGFsbExvY2F0aW9uKCkgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IGdldEluc3RhbGxVUkwoKTsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGluc3RhbGxMb2NhdGlvbiA9ICgoUGxhdGZvcm1VUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKSkuZ2V0VVJMQXNMb2NhbCgpLmdldEZpbGUoKTsKLQkJCQlsb2NhdGlvbiA9IG5ldyBQYXRoKGluc3RhbGxMb2NhdGlvbik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbnN0YWxsX0xvY2F0aW9uX0Vycm9yXyIsIG5ldyBPYmplY3RbXXt1cmx9KSArIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCQlyZXR1cm4gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YU1vZGVsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUphdmFNb2RlbCBtb2RlbCA9IGdldEphdmFNb2RlbChwcm9qZWN0KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdC5nZXROYW1lKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpIHsKLQkJaWYgKF9lbnRyeSA9PSBudWxsKV9lbnRyeSA9IG5ldyBMb2dFbnRyeSgpOwotCQllbHNlIF9lbnRyeS5yZXNldCgpOwotCQkKLQkJLy8gQWx3YXlzIHNldCB0aGUgbG9nIGVudHJ5J3MgTG9jYWxlIGJlZm9yZSB5b3UgdXNlIGl0Ci0JCS8vIGJlY2F1c2UgdGhlIHVzZXIgY2FuIHJlc2V0IGl0IG9uIHRoZSBmbHkuCi0JCV9lbnRyeS5zZXRMb2NhbGVPZk9yaWdpbihMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gX2VudHJ5OwotCX0KLQotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgaGFzaHRhYmxlIG9mIGEgbG9nZ2VyJ3MgcHJlZmVyZW5jZXMgaW5pdGlhbGx5IGZyb20gdGhlCi0JICogY29tLmlibS5ldG9vbHMubG9nZ2luZy51dGlsLmxvZ2dpbmdEZWZhdWx0cyBleHRlbnNpb24gcG9pbnQgaWYgc3BlY2lmaWVkIGluIHRoZQotCSAqIGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbCBwbHVnaW4ueG1sIGZpbGUuIElmIHNwZWNpZmllZCwgdGhlCi0JICogY29tLmlibS5ldG9vbHMubG9nZ2luZy51dGlsLmxvZ2dpbmdPcHRpb25zIGV4dGVuc2lvbiBwb2ludCBwcmVmZXJlbmNlcyBpbiB0aGUgcGFyYW1ldGVyCi0JICogcGx1Z2luJ3MgcGx1Z2luLnhtbCBmaWxlIGFyZSByZXR1cm5lZC4KLQkgKiAKLQkgKiBUaGUgbG9nZ2VyJ3MgcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB0aGUgcmV0dXJuIGhhc2h0YWJsZSB1c2luZyB0aGUgc3RhdGljIGluc3RhbmNlCi0JICogdmFyaWFibGVzIGluIExvZ2dlclN0YXRlSGFzaEtleXMgYXMga2V5cy4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICB0aGUgUGx1Z2luIHBvbGxlZCBmb3IgdGhlaXIgbG9nZ2VyJ3MgcHJlZmVyZW5jZXMgaW4gdGhlIHBsdWdpbi54bWwgZmlsZQotCSAqIEByZXR1cm4gaGFzaHRhYmxlIG9mIGEgbG9nZ2VyJ3MgcHJlZmVyZW5jZXMKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGdldE1zZ0xvZ2dlckNvbmZpZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luIHBsdWdpbikgewotCSAqIHJldHVybiAobmV3IFBsdWdpbkhlbHBlckltcGwoKS5nZXRNc2dMb2dnZXJDb25maWcocGx1Z2luKSk7IH0KLQkgKi8KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEoyRUVQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGxvY2F0aW9uLSB0aGUgZGlyZWN0b3J5IHRoYXQgYWxsIHRoZSBwbHVnaW5zIGFyZSBsb2NhdGVkIGluIChpLmUuCi0JICogZDpcaW5zdGFsbGRpclxwbHVnaW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJLy9JRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlQYXRoIGluc3RhbGxQYXRoID0gbmV3IFBhdGgoYnVuZGxlLmdldEVudHJ5KCIvIikudG9FeHRlcm5hbEZvcm0oKSkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwotCQkJCXJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJZ2V0SjJFRVByZWZlcmVuY2VzKCkuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbiBvcGVyYXRpb24sIGluIHJlc3BvbnNlIHRvIHNvbWUgb3RoZXIgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodCwKLQkgKiB0aGVuIHRoZSBjbGllbnQgY29kZSBzaG91bGQgdGhyb3cge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndmdC51dGlsLldGVFdyYXBwZWRFeGNlcHRpb259OwotCSAqIG90aGVyd2lzZSB0aGlzIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHNpZ25hbCBzb21lIG90aGVyIGVycm9yIGNvbmRpdGlvbiB3aXRoaW4gdGhlIG9wZXJhdGlvbiwKLQkgKiBvciB0byB0aHJvdyBhIGNvcmUgZXhjZXB0aW9uIGluIGEgY29udGV4dCBvdGhlciB0aGFuIGV4ZWN1dGluZyBhbiBvcGVyYXRpb24KLQkgKiAKLQkgKiBDcmVhdGUgYSBuZXcgSVN0YXR1cyBvZiB0eXBlIEVSUk9SIHVzaW5nIHRoZSBKMkVFUGx1Z2luIElELiBhQ29kZSBpcyBqdXN0IGFuIGludGVybmFsIGNvZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIG5ld0Vycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24sCi0JICogb3IgdG8gdGhyb3cgYSBjb3JlIGV4Y2VwdGlvbiBpbiBhIGNvbnRleHQgb3RoZXIgdGhhbiBleGVjdXRpbmcgYW4gb3BlcmF0aW9uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdFcnJvclN0YXR1cyhTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKDAsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdPcGVyYXRpb25GYWlsZWRTdGF0dXMoU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSVJlc291cmNlU3RhdHVzLk9QRVJBVElPTl9GQUlMRUQsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBJU3RhdHVzIHdpdGggYSBzZXZlcml0eSB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRC4gYUNvZGUgaXMganVzdCBhbiBpbnRlcm5hbCBjb2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0QnVuZGxlKCksIGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQkJLy9UT0RPIERvbid0IHRocm93IGVycm9yIC0ganVzdCBzaG93IHVucmVzb2x2ZWQga2V5Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgc3Vic3RpdHV0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xNi8yMDAxIDc6Mzg6NTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0RlZmF1bHRJc1dvcmtzcGFjZVJlbGF0aXZlU2NoZW1hCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJc1dvcmtzcGFjZVJlbGF0aXZlU2NoZW1hKGJvb2xlYW4gbmV3RGVmYXVsdElzV29ya3NwYWNlUmVsYXRpdmVTY2hlbWEpIHsKLQkJZGVmYXVsdElzV29ya3NwYWNlUmVsYXRpdmVTY2hlbWEgPSBuZXdEZWZhdWx0SXNXb3Jrc3BhY2VSZWxhdGl2ZVNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIEVKQiBVSSBzdXBwb3J0IGlzIGN1cnJlbnRseSBwYWNrYWdlZCBpbiB0aGUKLQkgKiBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJTdXBwb3J0QXZhaWxhYmxlKCkgewotCQlpZiAoRUpCX0FWQUlMQUJMRSA9PSBudWxsKSB7Ci0JCQkvL1RPRE8gV2UgbmVlZCBhIGJldHRlciBtZWNoYW5pc20gZm9yIHRoZSBkZXRlY3Rpb24gb2YgdGhlIEVKQiBzdXBwb3J0LgotCQkJLy9JUGx1Z2luRGVzY3JpcHRvciBkZXNjID0KLQkJCS8vIFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpIik7Ci0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQkvLyBFSkJfQVZBSUxBQkxFID0gbmV3IEJvb2xlYW4oZGVzYyAhPSBudWxsKTsKLQkJCUVKQl9BVkFJTEFCTEUgPSBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJcmV0dXJuIEVKQl9BVkFJTEFCTEUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB3b3JrYmVuY2ggaXMgcnVubmluZyBpbiBVSSBvciBIZWFkbGVzcwotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlVJQ29udGV4dERldGVybWluYXRpb259Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGVhZGxlc3MoKSB7Ci0JCXJldHVybiBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmdldEN1cnJlbnRDb250ZXh0KCkgPT0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUOwotCX0KLQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQkJCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRSA9IG5ldyBDYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyKCk7Ci0JCURPTVV0aWxpdGllcy5zZXREZWZhdWx0RW50aXR5UmVzb2x2ZXIoSjJFRVhtbER0REVudGl0eVJlc29sdmVyLklOU1RBTkNFKTsgCi0JCS8vSGF2ZSB0byBkbyB0aGUgbmV4dCBsaW5lIGltbWVkaWF0ZWx5IHRvIGZpeCB0aW1pbmcgcHJvYmxlbXMgd2l0aCBmYWN0b3J5IHJlZ2lzdHJhdGlvbgotCQlBcmNoaXZlSW5pdC5pbml0KGZhbHNlKTsKLQkJCQotCQkvL01vZHVsZU1hcHMgYXJlIHRoZSBtYXBzIGZyb20gbW9kdWxlcyBpbiBhbiBlYXIgcHJvamVjdCB0byB0aGUgajJlZSBwcm9qZWN0cyBmb3IgdGhlCi0JCS8vIG1vZHVsZXMKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcEluaXQuaW5pdChmYWxzZSk7Ci0JCWVuc3VyZUZhY3RvcnlSZWdpc3RyYXRpb24oKTsKLQkJVmFsaWRhdG9yTWFuYWdlci5zZXRSZXNvdXJjZVV0aWxDbGFzcyhSZXNvdXJjZVV0aWwuY2xhc3MpOwotCQlJQWRhcHRlck1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhuZXcgRWFyRWRpdEFkYXB0ZXJGYWN0b3J5KCksIEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBBcHBDbGllbnRFZGl0QWRhcHRlckZhY3RvcnkoKSwgQXJ0aWZhY3RFZGl0TW9kZWwuY2xhc3MpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50QWRhcHRlckZhY3RvcnkoKSwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQuY2xhc3MgKTsKLQkJCi0JCWZpbmFsIFByb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyKCk7Ly9Qcm9qZWN0RGVwZW5kZW5jeUNhY2hlLmdldENhY2hlKCkpOwotCQkvLyByZWdpc3RlciB0aGUgcHJvamVjdCByZW5hbWUvZGVsZXRlIHJlZmFjdG9yaW5nIGxpc3RlbmVyCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLAotCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSk7Ci0JCQotCQkvLyByZWdpc3RlciB0aGUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVyIHRoYXQgdXBkYXRlcyB0aGUgLmNvbXBvbmVudCBmaWxlIGluIAotCQkvLyByZXNwb25zZSB0byAuY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihuZXcgSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKMkVFRGVwZW5kZW5jeUxpc3RlbmVyLklOU1RBTkNFLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkpOwotCQl0cnkgewotCQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKCBKMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lci5QUk9KRUNUX0NPTVBPTkVOVF9VUERBVEVfSk9CX0ZBTUlMWSwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQl9CQkKLQl9Ci0KLQkvKgotCSAqIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IGZhY3RvcmllcyBnZXQgbG9hZGVkIHdoZW4gd2UgYXJlIGluIHRoZSBVSQotCSAqLwotCXByaXZhdGUgdm9pZCBlbnN1cmVGYWN0b3J5UmVnaXN0cmF0aW9uKCkgewotCQkvL0luc2lkZSB0aGUgd29ya2JlbmNoIHdlIGRvIG5vdCB3YW50IHRoZSBnbG9iYWwgb3ZlcnJpZGUgZGVmaW5lZCBoZXJlLgotCQllbnN1cmVEZWZhdWx0UmVmZXJlbmNlZFhNSVJlc291cmNlRmFjdG9yeVJlZ2lzdHJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlRGVmYXVsdFJlZmVyZW5jZWRYTUlSZXNvdXJjZUZhY3RvcnlSZWdpc3RyYXRpb24oKSB7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWcxID0gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFOwotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWcyID0gV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0U7Ci0JCVJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3RvcnkoKTsKLQkJcmVnMS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgZmFjdG9yeSk7Ci0JCXJlZzIuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIGZhY3RvcnkpOwotCQkvLyBhZGQgeG1pIGJlY2F1c2Ugb3RoZXIgcGx1Z2lucyBhcmUgcmVnaXN0ZXJpbmcgaXQgZ2xvYmFsbHkKLQkJcmVnMS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhtaSIsIGZhY3RvcnkpOyAvLyROT04tTkxTLTEkCi0JCXJlZzIuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4bWkiLCBmYWN0b3J5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgYSBjb252ZW5pZW5jZSBhcGkgZm9yIHRoZSBBQVcgdG8gdHVybiBvZmYgdW53YW50ZWQgYWN0aW9ucy4gSXQgd2lsbAotCSAqIGN1cnJlbnRseSBiZSBpbml0aWFsaXplZCBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIHRoZSBBQVcgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEZXZlbG9wbWVudFJvbGUoKSB7Ci0JCWlmIChIQVNfREVWX1JPTEUgPT0gbnVsbCkgewotCQkJQnVuZGxlIGRlc2MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmFzc2VtYmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUhBU19ERVZfUk9MRSA9IGRlc2MgIT0gbnVsbCA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJcmV0dXJuIEhBU19ERVZfUk9MRS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2VSdW5uYWJsZSBnZXRXb3Jrc3BhY2VSdW5uYWJsZShmaW5hbCBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCkgewotCQlyZXR1cm4gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlvcC5ydW4obW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ld0Vycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXdFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIEoyRUVQcmVmZXJlbmNlcyBnZXRKMkVFUHJlZmVyZW5jZXMoKSB7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLnByZWZlcmVuY2VzID0gbmV3IEoyRUVQcmVmZXJlbmNlcyh0aGlzKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMsIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXksc3Vic3RpdHV0aW9ucyk7Ci0JfQotCQotCi0JLyoqCi0JICogUmVjb3JkIGFuIGVycm9yIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBhbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwJCQkJCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7IAotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0gCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzI2MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSjJFRVBsdWdpblJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiajJlZXd0cHBsdWdpbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfX0NvbnNpZGVyaW5nX2RlbHRhX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfTUVUQUZPTERFUl9NSVNTSU5HX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb3RfYV9KMkVFX3Byb2plY3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvcmVFeGNlcHRpb25fY291bGRfbm90X2luaXRpYWxpemVfV2ViX1NlcnZpY2VfY2xhc3NfcGF0aF92YXJpYWJsZXNfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29wZW5pbmdfYXJjaGl2ZV9mb3JfZXhwb3J0XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRURlcGxveU9wZXJhdGlvbl8yX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19saWJyYXJ5X2ZvbGRlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRURlcGxveU9wZXJhdGlvbl9VSV9OdWxsX1N0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSQVJfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVNURURfSkFWQV9PVVRQVVRfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVNb2R1bGVQb3N0SW1wb3J0SGVscGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb21lX3NvdXJjZV90eXBlc19oYXZlX19fX19faW5fdGhlaXJfbmFtZV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRURlcGxveU9wZXJhdGlvbl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBsb3lPcGVyYXRpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUGFyYW1WYWx1ZV90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBsb3lPcGVyYXRpb25fMV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fZXJyb3Jfb2NjdXJyZWRfd2hpbGVfc2FfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfRklMRV9NSVNTSU5HX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RfbG9hZF9FSkJKYXJfYmVjYXVzZV9tb2RlbF9pc19udWxsX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfX0JhZF9idWlsZGVyX29yZGVyX2Zvcl9wcm9qZWN0X0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX3NvdXJjZV90eXBlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCUHJvamVjdFJlc291cmNlc19nZXRFSkJKYXJfRUpCRWRpdE1vZGVsX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19Ob19pbXBvcnRlZF9jbGFzc2VzX2ZvbGRlcl9fcXVpdHRpbmdfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBsb3lPcGVyYXRpb25fNF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19GdWxsX2ZpcnN0X2J1aWxkX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29jY3VycmVkX3NhdmluZ190aGVfbWFuaWZlc3RfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RfbG9hZF9FSkJGaWxlX2JlY2F1c2VfZWpiTmF0dXJlX2FzRUpCSmFyRmlsZV9fX3JldHVybnNfbnVsbF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19EZWx0YV9idWlsZF9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfX1N0YXJ0X2J1aWxkX3Byb2plY3RfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2Fubm90X2xvYWRfRUpCRmlsZV9iZWNhdXNlX0VKQk5hdHVyZVJ1bnRpbWVfaXNfbnVsbF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWluaW1pemluZ19wcm9qZWN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9nZXR0aW5nX3Byb2plY3RfbmF0dXJlX3J1bnRpbWVfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19Db25uZWN0b3JfUHJvamVjdF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX2dldHRpbmdfcHJvamVjdF9uYXR1cmVfcnVudGltZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBsb3lPcGVyYXRpb25fM19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5hYmxlX3RvX3NhdmVfcmVhZF9vbmx5X2ZfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvdWxkX25vdF9maW5kX3Jvb3Rfb2JqZWN0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RfcnVuX0oyRUVVSVdvcmtpbmdDb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2Fubm90X2xvYWRfRUpCRmlsZV9iZWNhdXNlX0VKQkVkaXRNb2RlbF9pc19udWxsX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vY2N1cnJlZF9sb2FkaW5nX3JhX3htbF9fNDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM3MThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVByZWZlcmVuY2VzIHsKLQotCXB1YmxpYyBpbnRlcmZhY2UgS2V5cyB7Ci0JCQotCQkKLQkJLyoqCi0JCSAqIEBkZXByZWNhdGVkLCB1c2UgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5ERUZBVUxUX1NPVVJDRV9GT0xERVIgb3IgdXNlCi0JCSAqIGdldEphdmFTb3VyY2VGb2xkZXJOYW1lKCkKLQkJICogZG8gbm90IGNhbGwgSjJFRVBsdWdpbi5nZXRKMkVFUHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEpBVkFfU09VUkNFKQotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU09VUkNFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2UuamF2YVNvdXJjZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVEFSR0VUX1NVUFBPUlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zZXJ2ZXJ0YXJnZXRzdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FSkJfQ0xJRU5UX0pBUiA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLmNyZWF0ZUNsaWVudEphciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX1ZFUlNJT04gPSAib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJlZmVyZW5jZS5qMmVlVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2UuY2xpZW50amFyLmNwLmNvbXBhdGliaWxpdHkiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DUkVNRU5UQUxfREVQTE9ZTUVOVF9TVVBQT1JUID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByZWZlcmVuY2UuaW5jcmVtZW50YWxEZXBsb3ltZW50IjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZmluYWwgc3RhdGljIFN0cmluZyBVU0VfRUFSX0xJQlJBUklFUyA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlcy51c2VFQVJMaWJyYXJpZXMiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgc3RhdGljIFN0cmluZyBVU0VfV0VCX0FQUF9MSUJSQVJJRVMgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZXMudXNlV2ViQXBwTGlicmFyaWVzIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VBUl9MSUJSQVJJRVNfSkRUX0VYUE9SVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlcy51c2VFQVJMaWJyYXJpZXNKRFRFeHBvcnQiOy8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBAZGVwcmVjYXRlZCwgCi0JCSAqIGJ1dCBzaG91bGQgaXQgYmUgZGVwcmVjYXRlZCA/IGlzIGoyZWVfd2ViX2NvbnRlbnQgYSBiZXR0ZXIgbmFtZSB0aGFuIHdlYl9jb250ZW50X2ZvbGRlciA/Ci0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9XRUJfQ09OVEVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLmoyZWVXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBkZXByZWNhdGVkLCBzdGF0aWMgd2ViIGNvbnRlbnQgaXMgZ290IGZyb20gUHJvZHVjdE1hbmFnZXIKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zdGF0aWNXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUjsKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSOwotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5FSkJfQ09OVEVOVF9GT0xERVI7Ci0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSOwotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5KQ0FfQ09OVEVOVF9GT0xERVI7Ci0JCQotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSX0JZX0RFRkFVTFQgPSBJUHJvZHVjdENvbnN0YW50cy5BRERfVE9fRUFSX0JZX0RFRkFVTFQ7Ci0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0dFTkVSQVRFX0REID0gImFwcGxpY2F0aW9uX2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1dFQl9HRU5FUkFURV9ERCA9ICJkeW5hbWljX3dlYl9nZW5lcmF0ZV9kZCI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0dFTkVSQVRFX0REID0gImVqYl9nZW5lcmF0ZV9kZCI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9HRU5FUkFURV9ERCA9ICJhcHBfY2xpZW50X2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAotCQkvKioKLQkJICogQHNpbmNlIDMuMAotCQkgKi8KLQkJc3RhdGljIFN0cmluZyBJRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyA9ICJwZXJzcGVjdGl2ZV9oaWVyYXJjaHlfdmlld19pZCI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fMV8yID0gIkoyRUVfMV8yIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzMgPSAiSjJFRV8xXzMiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OXzFfNCA9ICJKMkVFXzFfNCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1dFQl9DT05URU5UID0gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSKTsKLQkJLyoqCi0JCSAqIEBkZXByZWNhdGVkLCBzZWUgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIGl0IHVzZXMgUHJvZHVjdE1hbmFnZXIKLQkJICovCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSKTsKLQkJLyoqCi0JCSAqIEBkZXByZWNhdGVkLCB1c2UgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5ERUZBVUxUX1NPVVJDRV9GT0xERVIKLQkJICovCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9TT1VSQ0UgPSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25GcmFtZXdvcmtzUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEZWZhdWx0cyB7Ci0KLQkJLyoqCi0JCSAqIEBkZXByZWNhdGVkLCBzZWUgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIGl0IHVzZXMgUHJvZHVjdE1hbmFnZXIKLQkJICovCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9XRUJfQ09OVEVOVCA9IFZhbHVlcy5KMkVFX1dFQl9DT05URU5UOwotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBWYWx1ZXMuU1RBVElDX1dFQl9DT05URU5UOwotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHNlZSBERUZBVUxUX1NPVVJDRV9GT0xERVIKLQkJICovCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9TT1VSQ0UgPSBWYWx1ZXMuSkFWQV9TT1VSQ0U7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OID0gVmFsdWVzLkoyRUVfVkVSU0lPTl8xXzQ7Ci0JCWZpbmFsIHN0YXRpYyBpbnQgSjJFRV9WRVJTSU9OX0lEID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCWZpbmFsIHN0YXRpYyBib29sZWFuIENSRUFURV9FSkJfQ0xJRU5UX0pBUiA9IGZhbHNlOwotCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBFSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZID0gdHJ1ZTsKLQkJZmluYWwgc3RhdGljIGJvb2xlYW4gSU5DUkVNRU5UQUxfREVQTE9ZTUVOVF9TVVBQT1JUID0gdHJ1ZTsKLQkJZmluYWwgc3RhdGljIGJvb2xlYW4gVVNFX0VBUl9MSUJSQVJJRVNfSkRUX0VYUE9SVCA9IGZhbHNlOwotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIElEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBQbHVnaW4gb3duZXIgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UgPSBmYWxzZTsKLQotCXB1YmxpYyBKMkVFUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkoyRUVfVkVSU0lPTiwgRGVmYXVsdHMuSjJFRV9WRVJTSU9OKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuQ1JFQVRFX0VKQl9DTElFTlRfSkFSLCBEZWZhdWx0cy5DUkVBVEVfRUpCX0NMSUVOVF9KQVIpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5FSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZLCBEZWZhdWx0cy5FSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSU5DUkVNRU5UQUxfREVQTE9ZTUVOVF9TVVBQT1JULCBEZWZhdWx0cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQpOwotCQkKLQkJLy8gc2luY2UgMi4wCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkoyRUVfV0VCX0NPTlRFTlQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQkvLyBzaW5jZSAyLjAKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSkFWQV9TT1VSQ0UsIEZhY2V0Q29yZVBsdWdpbi5nZXRKYXZhU3JjRm9sZGVyKCkpOwotCQkvLyBkb25lIGluIENvbW1vbkZyYW1ld29ya3NQcmVmLi5Jbml0aWFsaXplcgotCQkvL2dldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkRFRkFVTFRfU09VUkNFX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9TT1VSQ0VfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5XRUJfQ09OVEVOVF9GT0xERVIsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkVKQl9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRUpCX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkpDQV9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuSkNBX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFERF9UT19FQVJfQllfREVGQVVMVCwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUREX1RPX0VBUl9CWV9ERUZBVUxUKSk7Ci0JCS8vIGRvbmUgaW4gQ29tbW9uRnJhbWV3b3Jrc1ByZWYuLkluaXRpYWxpemVyCi0JCS8vZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuT1VUUFVUX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuT1VUUFVUX0ZPTERFUikpOwotCQkKLQkJLy8gc2luY2UgMi4wLCBmb3IgamF2YSBlZSBwcm9qZWN0cwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5BUFBMSUNBVElPTl9HRU5FUkFURV9ERCwgZmFsc2UpOwotCQkvLyBmb3IgZWU1IGplZSB3ZWIgcHJvamVjdHMgZGVmYXVsdCBpdCB0byB0cnVlIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBzZXJ2bGV0cywgb3RoZXJ3aXNlIGZhbHNlCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkRZTkFNSUNfV0VCX0dFTkVSQVRFX0RELCB0cnVlKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuRUpCX0dFTkVSQVRFX0RELCBmYWxzZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFQUF9DTElFTlRfR0VORVJBVEVfREQsIGZhbHNlKTsJCi0JCQotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5VU0VfRUFSX0xJQlJBUklFUywgdHJ1ZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUywgdHJ1ZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQsIERlZmF1bHRzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQpOwotCQlTdHJpbmcgcGVyc3BlY3RpdmVJRCA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcsIChwZXJzcGVjdGl2ZUlEICE9IG51bGwpID8gcGVyc3BlY3RpdmVJRCA6IERlZmF1bHRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNldHRpbmcoU3RyaW5nIGtleSl7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhrZXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXR0aW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSl7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRVc2VFQVJMaWJyYXJpZXMoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oS2V5cy5VU0VfRUFSX0xJQlJBUklFUyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUVBUkxpYnJhcmllcyhib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5VU0VfRUFSX0xJQlJBUklFUywgdmFsdWUpOwotCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0VXNlRUFSTGlicmFyaWVzSkRURXhwb3J0KCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEtleXMuVVNFX0VBUl9MSUJSQVJJRVNfSkRUX0VYUE9SVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUVBUkxpYnJhcmllc0pEVEV4cG9ydChib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5VU0VfRUFSX0xJQlJBUklFU19KRFRfRVhQT1JULCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRVc2VXZWJMaWJhcmllcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZVdlYkxpYnJhcmllcyhib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5VU0VfV0VCX0FQUF9MSUJSQVJJRVMsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCQkJCi0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFV2ViQ29udGVudEZvbGRlck5hbWUoKSB7Ci0JCS8vcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuSjJFRV9XRUJfQ09OVEVOVCk7Ci0JCS8vYnV0IHNob3VsZCBpdCBiZSBkZXByZWNhdGVkID8gaXMgajJlZV93ZWJfY29udGVudCBhIGJldHRlciBuYW1lIHRoYW4gd2ViX2NvbnRlbnRfZm9sZGVyID8KLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuV0VCX0NPTlRFTlRfRk9MREVSKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhU291cmNlRm9sZGVyTmFtZSgpIHsKLQkJLy9yZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5KQVZBX1NPVVJDRSk7Ci0JCS8vIFRPRE8gaXMgSkFWQV9TT1VSQ0UgYSBiZXR0ZXIgbmFtZSBvciBpcyBERUZBVUxUX1NPVVJDRS4uLgotICAgICAgICByZXR1cm4gRmFjZXRDb3JlUGx1Z2luLmdldEphdmFTcmNGb2xkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhpZ2hlc3RKMkVFVmVyc2lvblNldHRpbmcoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLkoyRUVfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJUYXJnZXRpbmdFbmFibGVkKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEtleXMuU0VSVkVSX1RBUkdFVF9TVVBQT1JUKTsKLQl9Ci0KLQkvLy8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFV2ViQ29udGVudEZvbGRlck5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCS8vZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShLZXlzLkoyRUVfV0VCX0NPTlRFTlQsIHZhbHVlKTsKLQkJLy8gVE9ETyBidXQgc2hvdWxkIGl0IGJlIGRlcHJlY2F0ZWQgPyBpcyBqMmVlX3dlYl9jb250ZW50IGEgYmV0dGVyIG5hbWUgdGhhbiB3ZWJfY29udGVudF9mb2xkZXIgPwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuV0VCX0NPTlRFTlRfRk9MREVSLCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlck5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCS8vZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShLZXlzLkpBVkFfU09VUkNFLCB2YWx1ZSk7Ci0JCS8vIFRPRE8gaXMgSkFWQV9TT1VSQ0UgYSBiZXR0ZXIgbmFtZSBvciBpcyBERUZBVUxUX1NPVVJDRS4uLgotICAgICAgICBGYWNldENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoRmFjZXRDb3JlUGx1Z2luLlBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSwgdmFsdWUpOwotICAgICAgICBGYWNldENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwkJCi0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhpZ2hlc3RKMkVFVmVyc2lvblNldHRpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5KMkVFX1ZFUlNJT04sIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0aW5nRW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5TRVJWRVJfVEFSR0VUX1NVUFBPUlQsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jcmVtZW50YWxEZXBsb3ltZW50RW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmNyZW1lbnRhbERlcGxveW1lbnRFbmFibGVkKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEtleXMuSU5DUkVNRU5UQUxfREVQTE9ZTUVOVF9TVVBQT1JUKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9uZSBvZiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFX1ZFUlNJT05fWF9YIChAc2VlIEoyRUVWZXJzaW9uQ29uc3RhbnRzKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGlnaGVzdEoyRUVWZXJzaW9uSUQoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uUHJlZmVyZW5jZSA9IGdldEhpZ2hlc3RKMkVFVmVyc2lvblNldHRpbmcoKTsKLQkJaWYgKFZhbHVlcy5KMkVFX1ZFUlNJT05fMV8yLmVxdWFscyh2ZXJzaW9uUHJlZmVyZW5jZSkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCWVsc2UgaWYgKFZhbHVlcy5KMkVFX1ZFUlNJT05fMV8zLmVxdWFscyh2ZXJzaW9uUHJlZmVyZW5jZSkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCWlmIChpc1BlcnNpc3RPbkNoYW5nZSgpKQotCQkJcGVyc2lzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcnNpc3QoKSB7Ci0JCWdldE93bmVyKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwZXJzaXN0T25DaGFuZ2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0T25DaGFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RPbkNoYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGVyc2lzdE9uQ2hhbmdlCi0JICogICAgICAgICAgICBUaGUgcGVyc2lzdE9uQ2hhbmdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0T25DaGFuZ2UoYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UpIHsKLQkJdGhpcy5wZXJzaXN0T25DaGFuZ2UgPSBwZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMucHJlZmVyZW5jZXMgPSBnZXRPd25lcigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3duZXIuCi0JICovCi0JcHJpdmF0ZSBQbHVnaW4gZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eQotCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0JICogaXMgbm8gZGVmYXVsdCBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLQkgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0JICogVGhlIGdpdmVuIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eSB3aXRoIHRoZQotCSAqIGdpdmVuIG5hbWUuCi0JICogVGhlIGdpdmVuIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eSB3aXRoIHRoZQotCSAqIGdpdmVuIG5hbWUuIFRoZSBnaXZlbiBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByb3BlcnR5Ci0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KSAKLQkgKiBpcyBubyBkZWZhdWx0IHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotCSAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotCSAqIFRoZSBnaXZlbiBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJvcGVydHkgd2l0aCB0aGUKLQkgKiBnaXZlbiBuYW1lLgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pCi0JICogaWYgdGhlcmUgaXMgbm8gcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHN0cmluZy12YWx1ZWQgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcm9wZXJ0eSB3aXRoIHRoZQotCSAqIGdpdmVuIG5hbWUuIFRoZSBnaXZlbiBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0xpYkNvcHlCdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0xpYkNvcHlCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWQ0MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9MaWJDb3B5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotCi0vKioKLSAqIEFuIGV4YW1wbGUgaW5jcmVtZW50YWwgcHJvamVjdCBidWlsZGVyIHRoYXQgY29waWVzIGFkZGl0aW9uYWwgY2xhc3MgZmlsZXMgZnJvbSBhIGxpYnJhcnkgcGFja2FnZQotICogZnJhZ21lbnQgcm9vdCBmb2xkZXIgaW50byBhIEphdmEgcHJvamVjdCdzIG91dHB1dCBkaXJlY3RvcnkuCi0gKiAKLSAqIEdlbmVyYWwgcGFyYW1ldGVyczoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgcHJvamVjdCBzaG91bGQgYmUgYSBKYXZhIHByb2plY3QuPC9saT4KLSAqIDxsaT5UaGUgY2xhc3MgZmlsZXMgYXJlIGluIHRoZSAiaW1wb3J0ZWRfY2xhc3NlcyIgZm9sZGVyIG9mIHRoZSBwcm9qZWN0LjwvbGk+Ci0gKiA8bGk+VGhpcyBidWlsZGVyIHNob3VsZCBydW4gPGI+YWZ0ZXIgPC9iPiB0aGUgSmF2YSBidWlsZGVyLjwvbGk+Ci0gKiA8bGk+RnVsbCBidWlsZCBzaG91bGQgY29weSBjbGFzcyBmaWxlcyBmcm9tIGEgc2Vjb25kYXJ5IGxpYnJhcnkgZm9sZGVyIGludG8gdGhlIG91dHB1dCBmb2xkZXIKLSAqIG1haW50YWluaW5nIHBhY2thZ2UgaGllcmFyY2h5OyBleGlzdGluZyBjbGFzcyBmaWxlcyBtdXN0IG5ldmVyIGJlIG92ZXJ3cml0dGVuLjwvbGk+Ci0gKiA8bGk+T25seSAqLmNsYXNzIGZpbGVzIHNob3VsZCBiZSBjb3BpZWQgKG5vdCBvdGhlciByZXNvdXJjZSBmaWxlcykuPC9saT4KLSAqIDxsaT5JbmNyZW1lbnRhbCBidWlsZCBhbmQgYXV0by1idWlsZCBzaG91bGQgd2lsbCBwZXJmb3JtIHRoZSBjb3B5IHdoZW4gdGhlcmUgaXMgYW4gYWRkL2NoYW5nZSBpbgotICogdGhlICJpbXBvcnRlZF9jbGFzc2VzIiBmb2xkZXIuPC9saT4KLSAqIDxsaT5DaGFuZ2luZyB0aGUgcHJvamVjdCdzIG91dHB1dCBmb2xkZXIgc2hvdWxkIGJlIGhhbmRsZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiBOb3RlOiB0aGUgYnVpbGRlciBpcyBub3QgY3VycmVudGx5IGludm9raW5nIHRoZSBNaW5pbWl6ZSBoZWxwZXIsIGl0IGlzIHJlbHlpbmcgb24gdGhlIGNvcHkgdG8gbm90Ci0gKiByZXBsYWNlIGV4aXN0aW5nIGNsYXNzIGZpbGVzLCBhbmQgdGhlIGJ1aWxkIHBhdGggb3JkZXIgdG8gZW5zdXJlIHRoYXQgY29tcGlsZWQgY2xhc3NlcyBvdmVycmlkZQotICogaW1wb3J0ZWQgb25lcy4KLSAqIAotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaWJDb3B5QnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCS8qKgotCSAqIEludGVybmFsIGRlYnVnIHRyYWNpbmcuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIEJ1aWxkZXIgaWQgb2YgdGhpcyBpbmNyZW1lbnRhbCBwcm9qZWN0IGJ1aWxkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9IEoyRUVQbHVnaW4uTElCQ09QWV9CVUlMREVSX0lEOwotCi0JLyoqCi0JICogVGhlIHBhdGggd2hlcmUgd2UgZXhwZWN0IHRvIGZpbmQgdGhlIC5jbGFzcyBmaWxlcyB0byBiZSBjb3BpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JURURfQ0xBU1NFU19QQVRIID0gImltcG9ydGVkX2NsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGF0aCBvZiB0aGUgb3V0cHV0IGZvbGRlciB0aGF0IHdlIGxhc3QgY29waWVkIGNsYXNzIGZpbGVzIGludG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBidWlsZGVyIGhhcyBub3QgYnVpbHQgdGhpcyBwcm9qZWN0IGJlZm9yZS4KLQkgKi8KLS8vCXByaXZhdGUgSVBhdGggbGFzdE91dHB1dFBhdGggPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IHNvdXJjZUNvbnRhaW5lcnM7Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBuZWVkT3V0cHV0UmVmcmVzaDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGxpYnJhcnkgY29weWluZyBidWlsZGVyLgotCSAqIDxwPgotCSAqIEFsbCBpbmNyZW1lbnRhbCBwcm9qZWN0IGJ1aWxkZXJzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBMaWJDb3B5QnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIFRoZSA8Y29kZT5MaWJDb3B5QnVpbGRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqIDxjb2RlPkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI8L2NvZGU+IG1ldGhvZCBjb3BpZXMgYWRkaXRpb25hbCBjbGFzcyBmaWxlcyBpbnRvIHRoZSBvdXRwdXQKLQkgKiBmb2xkZXIuCi0JICogPHA+Ci0JICogW0lzc3VlOiB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJlcG9ydCBwcm9ncmVzcy5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtJc3N1ZTogdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBwcm9iYWJseSB1c2UgYSB3b3Jrc3BhY2UgcnVubmFibGUuXQotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyB0aGlzIGJ1aWxkZXIgaXMgdW5uZWNlc3NhcnkgaW4gV1RQIDEuNQotCQlyZXR1cm4gbnVsbDsKLS8vCQlzb3VyY2VDb250YWluZXJzID0gbnVsbDsKLS8vCQluZWVkT3V0cHV0UmVmcmVzaCA9IGZhbHNlOwotLy8JCWlmIChERUJVRykgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oQlVJTERFUl9JRCArIEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuX19TdGFydF9idWlsZF9wcm9qZWN0X0lORk9fICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7IAotLy8JCX0KLS8vCi0vLwkJYm9vbGVhbiBidWlsZGVyT3JkZXJPSyA9IGNoZWNrQnVpbGRlck9yZGVyaW5nKCk7Ci0vLwotLy8JCWlmIChERUJVRyAmJiAhYnVpbGRlck9yZGVyT0spIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLl9fQmFkX2J1aWxkZXJfb3JkZXJfZm9yX3Byb2plY3RfSU5GT18gKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsgCi0vLwkJfQotLy8KLS8vCQlJRm9sZGVyW10gY2xhc3NGb2xkZXJzID0gZ2V0Q2xhc3Nlc0ZvbGRlcnMoKTsKLS8vCQlpZiAoY2xhc3NGb2xkZXJzLmxlbmd0aCA9PSAwKSB7Ci0vLwkJCS8vIG5vIGZpbGVzIHRvIGNvcHkKLS8vCQkJaWYgKERFQlVHKQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLl9fTm9faW1wb3J0ZWRfY2xhc3Nlc19mb2xkZXJfX3F1aXR0aW5nX0lORk9fKTsgCi0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCi0vLwkJSUphdmFQcm9qZWN0IGpwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7Ci0vLwkJaWYgKGpwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJLy8gbm90IGEgamF2YSBwcm9qZWN0IChhbnltb3JlPykKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8KLS8vCQlJUGF0aCBvdXRwdXRQYXRoID0ganByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLS8vCQlJRm9sZGVyIG91dHB1dEZvbGRlciA9IGdldFByb2plY3QoKS5nZXRQYXJlbnQoKS5nZXRGb2xkZXIob3V0cHV0UGF0aCk7Ci0vLwkJaWYgKG91dHB1dFBhdGguZXF1YWxzKGxhc3RPdXRwdXRQYXRoKSkgewotLy8JCQlpZiAoa2luZCA9PSBJTkNSRU1FTlRBTF9CVUlMRCB8fCBraW5kID09IEFVVE9fQlVJTEQpIHsKLS8vCQkJCXByb2Nlc3NEZWx0YShnZXREZWx0YShnZXRQcm9qZWN0KCkpLCBvdXRwdXRGb2xkZXIsIG1vbml0b3IsIGNsYXNzRm9sZGVycyk7Ci0vLwkJCQlyZWZyZXNoT3V0cHV0SWZOZWNlc3Nhcnkob3V0cHV0Rm9sZGVyKTsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlpZiAoREVCVUcpIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLl9fRnVsbF9maXJzdF9idWlsZF9JTkZPXyk7Ci0vLwkJfQotLy8JCWNvcHlBbGxDbGFzc0ZvbGRlcnMobW9uaXRvciwgY2xhc3NGb2xkZXJzLCBvdXRwdXRGb2xkZXIpOwotLy8JCWxhc3RPdXRwdXRQYXRoID0gb3V0cHV0UGF0aDsKLS8vCQlyZWZyZXNoT3V0cHV0SWZOZWNlc3Nhcnkob3V0cHV0Rm9sZGVyKTsKLS8vCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0vLwlwcml2YXRlIHZvaWQgcmVmcmVzaE91dHB1dElmTmVjZXNzYXJ5KElGb2xkZXIgb3V0cHV0Rm9sZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJaWYgKG5lZWRPdXRwdXRSZWZyZXNoICYmIG91dHB1dEZvbGRlciAhPSBudWxsICYmIG91dHB1dEZvbGRlci5leGlzdHMoKSkKLS8vCQkJb3V0cHV0Rm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlBbGxDbGFzc0ZvbGRlcnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRm9sZGVyW10gY2xhc3NGb2xkZXJzLCBJRm9sZGVyIG91dHB1dEZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRm9sZGVycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFjbGFzc0ZvbGRlcnNbaV0uZXF1YWxzKG91dHB1dEZvbGRlcikpCi0JCQkJY29weUNsYXNzRmlsZXMoY2xhc3NGb2xkZXJzW2ldLCBvdXRwdXRGb2xkZXIsIG1vbml0b3IpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFByb2Nlc3MgYW4gaW5jcmVtZW50YWwgYnVpbGQgZGVsdGEuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsdGEgcmVxdWlyZXMgYSBjb3B5Ci0JICogQHBhcmFtIGRlc3QKLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXI7IG1heSBvciBtYXkgbm90IGV4aXN0Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEsIGZpbmFsIElGb2xkZXIgb3V0cHV0Rm9sZGVyLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElGb2xkZXJbXSBjbGFzc2VzRm9sZGVycykgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihCVUlMREVSX0lEICsgSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5fX0NvbnNpZGVyaW5nX2RlbHRhX0lORk9fICsgZGVsdGEpOyAKLQkJfQotCQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQlwcml2YXRlIExpc3QgY29waWVkQ2xhc3NGb2xkZXJzID0gbmV3IEFycmF5TGlzdChjbGFzc2VzRm9sZGVycy5sZW5ndGgpOwotCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHN1YmRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQlJRm9sZGVyIGNsYXNzZXNGb2xkZXIgPSByZXRyaWV2ZUNsYXNzZXNGb2xkZXIocmVzb3VyY2UsIGNsYXNzZXNGb2xkZXJzKTsKLQkJCQkJaWYgKGNsYXNzZXNGb2xkZXIgIT0gbnVsbCAmJiAhY29waWVkQ2xhc3NGb2xkZXJzLmNvbnRhaW5zKGNsYXNzZXNGb2xkZXIpKSB7Ci0JCQkJCQlpbnQga2luZCA9IHN1YmRlbHRhLmdldEtpbmQoKTsKLQkJCQkJCXN3aXRjaCAoa2luZCkgewotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLl9fRGVsdGFfYnVpbGRfSU5GT18gKyBzdWJkZWx0YSk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJCWNvcHlDbGFzc0ZpbGVzKGNsYXNzZXNGb2xkZXIsIG91dHB1dEZvbGRlciwgbW9uaXRvcik7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCQkJCWRlbGV0ZUNvcnJlc3BvbmRpbmdGaWxlKChJRmlsZSkgcmVzb3VyY2UsIGNsYXNzZXNGb2xkZXIsIG91dHB1dEZvbGRlciwgbW9uaXRvcik7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDoKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgJiYgcmVzb3VyY2UuZXF1YWxzKG91dHB1dEZvbGRlcikpIHsKLQkJCQkJY29weUFsbENsYXNzRm9sZGVycyhudWxsLCBjbGFzc2VzRm9sZGVycywgb3V0cHV0Rm9sZGVyKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGNsYXNzZXNGb2xkZXIKLQkgKiBAcGFyYW0gb3V0cHV0Rm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb3JyZXNwb25kaW5nRmlsZShJRmlsZSBmaWxlLCBJRm9sZGVyIGNsYXNzZXNGb2xkZXIsIElGb2xkZXIgb3V0cHV0Rm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJaW50IHNlZ0NvdW50ID0gY2xhc3Nlc0ZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ0NvdW50KTsKLQkJSUZpbGUgamF2YUZpbGUgPSBmaW5kQ29ycmVzcG9uZGluZ0phdmFGaWxlKHBhdGgpOwotCQlpZiAoamF2YUZpbGUgIT0gbnVsbCAmJiBqYXZhRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybjsgLy9UaGVyZSBpcyBub3RoaW5nIHRvIGRvIGJlY2F1c2UgdGhlIGZpbGUgaW4gdGhlIG91dHB1dCBsb2NhdGlvbiBpcyBmcm9tIHRoZQotCQkvLyBqYXZhIGNvbXBpbGF0aW9uIG5vdCB0aGUgY29weS4KLQkJSUZpbGUgb3V0RmlsZSA9IG91dHB1dEZvbGRlci5nZXRGaWxlKHBhdGgpOwotCQlpZiAob3V0RmlsZS5leGlzdHMoKSkKLQkJCW91dEZpbGUuZGVsZXRlKHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQl9Ci0KLQotCS8qKgotCSAqIE1ldGhvZCByZXRyaWV2ZUNsYXNzZXNGb2xkZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJRm9sZGVyCi0JICovCi0JcHJvdGVjdGVkIElGb2xkZXIgcmV0cmlldmVDbGFzc2VzRm9sZGVyKElSZXNvdXJjZSByZXNvdXJjZSwgSUZvbGRlcltdIGNsYXNzZXNGb2xkZXJzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlc0ZvbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjbGFzc2VzRm9sZGVyc1tpXS5nZXROYW1lKCkuZXF1YWxzKHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50KDApKSkKLQkJCQlyZXR1cm4gY2xhc3Nlc0ZvbGRlcnNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ1aWxkZXIgaXMgY29uZmlndXJlZCB0byBydW4gPGI+YWZ0ZXIgPC9iPiB0aGUgSmF2YSBidWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1aWxkZXIgb3JkZXIgaXMgY29ycmVjdCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLS8vCXByaXZhdGUgYm9vbGVhbiBjaGVja0J1aWxkZXJPcmRlcmluZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZGV0ZXJtaW5lIHJlbGF0aXZlIGJ1aWxkZXIgcG9zaXRpb24gZnJvbSBwcm9qZWN0J3MgYnVpbGRzcGVjCi0vLwkJSUNvbW1hbmRbXSBjcyA9IGdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOwotLy8JCWludCBteUluZGV4ID0gLTE7Ci0vLwkJaW50IGphdmFCdWlsZGVySW5kZXggPSAtMTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCWlmIChjc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhKYXZhQ29yZS5CVUlMREVSX0lEKSkgewotLy8JCQkJamF2YUJ1aWxkZXJJbmRleCA9IGk7Ci0vLwkJCX0gZWxzZSBpZiAoY3NbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoQlVJTERFUl9JRCkpIHsKLS8vCQkJCW15SW5kZXggPSBpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBteUluZGV4ID4gamF2YUJ1aWxkZXJJbmRleDsKLS8vCX0KLQotCS8qKgotCSAqIENvcGllcyBjbGFzcyBmaWxlcyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVyIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBmb2xkZXIuIFRoZQotCSAqIGRlc3RpbmF0aW9uIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaWYgcmVxdWlyZWQsIGJ1dCBvbmx5IGlmIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIGlzCi0JICogY29waWVkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZm9sZGVyOyBtdXN0IGV4aXN0Ci0JICogQHBhcmFtIGRlc3QKLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXI7IG1heSBvciBtYXkgbm90IGV4aXN0Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weUNsYXNzRmlsZXMoSUZvbGRlciBzb3VyY2UsIGZpbmFsIElGb2xkZXIgZGVzdCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyAiOiBCZWdpbiBjb3B5aW5nIGNsYXNzIGZpbGVzIGZyb20gIiArIHNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIiB0byAiICsgZGVzdC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlmaW5hbCBpbnQgc291cmNlUGF0aExlbmd0aCA9IHNvdXJjZS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCi0JCWNsYXNzIFZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VWaXNpdG9yIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXM7Ci0KLQkJCQkJLy8gY29tcHV0ZSByZWxhdGl2ZSBwYXRoIGZyb20gc291cmNlIGZvbGRlciB0byB0aGlzIGZpbGUKLQkJCQkJSVBhdGggZmlsZVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCUlQYXRoIGRwYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VQYXRoTGVuZ3RoKTsKLQkJCQkJSUZpbGUgdGFyZ2V0RmlsZSA9IGRlc3QuZ2V0RmlsZShkcGF0aCk7Ci0JCQkJCWNvcHlGaWxlKGZpbGUsIHRhcmdldEZpbGUsIGRwYXRoLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJc291cmNlLmFjY2VwdChuZXcgVmlzaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbm90IGhhcHBlbgotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGdpdmVuIGZpbGUgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGZpbGUuIERvZXMgbm90aGluZyBpZiB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZTsgbXVzdCBleGlzdAotCSAqIEBwYXJhbSBkZXN0Ci0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZTsgbWF5IG9yIG1heSBub3QgZXhpc3Q7IG5ldmVyIG92ZXJ3cml0dGVuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weUZpbGUoSUZpbGUgc291cmNlLCBJRmlsZSBkZXN0LCBJUGF0aCBmaWxlUmVsYXRpdmVQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBydW5lRm9ySmF2YVNvdXJjZShzb3VyY2UsIGZpbGVSZWxhdGl2ZVBhdGgsIG1vbml0b3IpKQotCQkJcmV0dXJuOyAvL25vIGNvcHkgbmVjZXNzYXJ5LgotCQlGaWxlIHNvdXJjZUZpbGUgPSBudWxsLCBkZXN0RmlsZSA9IG51bGw7Ci0JCWlmIChzb3VyY2UuZXhpc3RzKCkpCi0JCQlzb3VyY2VGaWxlID0gc291cmNlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCWlmIChkZXN0LmV4aXN0cygpKQotCQkJZGVzdEZpbGUgPSBkZXN0LmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0KLQkJaWYgKGRlc3RGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyAiOiAiICsgZGVzdC5nZXRGdWxsUGF0aCgpICsgIiBhbHJlYWR5IGV4aXN0cy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZGVzdEZpbGUubGFzdE1vZGlmaWVkKCkgPT0gc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQlkZXN0LnNldENvbnRlbnRzKHNvdXJjZS5nZXRDb250ZW50cyhmYWxzZSksIHRydWUsIGZhbHNlLCBtb25pdG9yKTsgLy93ZSBoYXZlIHRvIGZvcmNlCi0JCQkvLyBiL2Mgc2V0IHRoZSBtb2QKLQkJCS8vIHN0YW1wIG1ha2VzIGl0Ci0JCQkvLyB0aGluayBpdCBpcyBvdXQgb2YKLQkJCS8vIHN5bmNoLgotCQkJc3luY2hyb25pemVNb2RpZmljYXRpb25TdGFtcHMoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKEJVSUxERVJfSUQgKyAiOiBDcmVhdGluZyAiICsgZGVzdC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUNvbnRhaW5lciBwYXJlbnQgPSBkZXN0LmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQlta2RpcnMoKElGb2xkZXIpIHBhcmVudCwgbW9uaXRvcik7Ci0JCX0KLQkJZGVzdC5jcmVhdGUoc291cmNlLmdldENvbnRlbnRzKGZhbHNlKSwgZmFsc2UsIG1vbml0b3IpOwotCQlkZXN0RmlsZSA9IGRlc3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJc3luY2hyb25pemVNb2RpZmljYXRpb25TdGFtcHMoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCQlkZXN0LnNldERlcml2ZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSBjb3JyZXNwb25kaW5nIC5qYXZhIGZpbGUgaXMgZm91bmQuIFJlbW92ZSB0aGUgLmNsYXNzIGZpbGUgZnJvbSB0aGUKLQkgKiBpbXBvcnRlZF9jbGFzc2VzIGZvbGRlciAoaS5lLiwgZGVsZXRlIHRoZSBzb3VyY2UgZmlsZSkuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwcnVuZUZvckphdmFTb3VyY2UoSUZpbGUgY2xhc3NGaWxlLCBJUGF0aCBmaWxlUmVsYXRpdmVQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNsYXNzRmlsZS5leGlzdHMoKSkgewotCQkJSUZpbGUgamF2YUZpbGUgPSBmaW5kQ29ycmVzcG9uZGluZ0phdmFGaWxlKGZpbGVSZWxhdGl2ZVBhdGgpOwotCQkJaWYgKGphdmFGaWxlICE9IG51bGwgJiYgamF2YUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtde2phdmFGaWxlfSwgbnVsbCk7Ci0JCQkJY2xhc3NGaWxlLmRlbGV0ZSh0cnVlLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXNzRmlsZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBmaW5kQ29ycmVzcG9uZGluZ0phdmFGaWxlKElQYXRoIGNsYXNzRmlsZVBhdGgpIHsKLQkJSVBhdGggamF2YVBhdGggPSBjb252ZXJ0VG9KYXZhUGF0aChjbGFzc0ZpbGVQYXRoKTsKLQkJTGlzdCBzb3VyY2VGb2xkZXJzID0gZ2V0U291cmNlQ29udGFpbmVycygpOwotCQlJQ29udGFpbmVyIGNvbnQ7Ci0JCUlGaWxlIGphdmFGaWxlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWNvbnQgPSAoSUNvbnRhaW5lcikgc291cmNlRm9sZGVycy5nZXQoaSk7Ci0JCQlqYXZhRmlsZSA9IGNvbnQuZ2V0RmlsZShqYXZhUGF0aCk7Ci0JCQlpZiAoamF2YUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGphdmFGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0IGdldFNvdXJjZUNvbnRhaW5lcnMoKSB7Ci0JCWlmIChzb3VyY2VDb250YWluZXJzID09IG51bGwpCi0JCQlzb3VyY2VDb250YWluZXJzID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiBzb3VyY2VDb250YWluZXJzOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXNzRmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGNvbnZlcnRUb0phdmFQYXRoKElQYXRoIGNsYXNzRmlsZVBhdGgpIHsKLQkJSVBhdGggamF2YVBhdGggPSBjbGFzc0ZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJLy9oYW5kbGUgaW5uZXIgY2xhc3Nlcy4uLmxvb2sgZm9yIG91dGVybW9zdCBqYXZhIGZpbGUKLQkJU3RyaW5nIGZpbGVOYW1lID0gY2xhc3NGaWxlUGF0aC5sYXN0U2VnbWVudCgpOwotCQlpbnQgaW5uZXJJbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoJyQnKTsKLQkJaWYgKGlubmVySW5kZXggPiAtMSkgewotCQkJamF2YVBhdGggPSBqYXZhUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlqYXZhUGF0aCA9IGphdmFQYXRoLmFwcGVuZChmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5uZXJJbmRleCkpOwotCQl9Ci0JCWphdmFQYXRoID0gamF2YVBhdGguYWRkRmlsZUV4dGVuc2lvbigiamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBqYXZhUGF0aDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdAotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZU1vZGlmaWNhdGlvblN0YW1wcyhGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUpIHsKLQkJaWYgKGRlc3RGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQlkZXN0RmlsZS5zZXRMYXN0TW9kaWZpZWQoc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0vLwkJCW5lZWRPdXRwdXRSZWZyZXNoID0gdHJ1ZTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZ2l2ZW4gZm9sZGVyLCBhbmQgaXRzIGNvbnRhaW5pbmcgZm9sZGVycywgaWYgcmVxdWlyZWQuIERvZXMgbm90aGluZyBpZiB0aGUgZ2l2ZW4KLQkgKiBmb2xkZXIgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGZvbGRlcgotCSAqICAgICAgICAgICAgdGhlIGZvbGRlciB0byBjcmVhdGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXByaXZhdGUgdm9pZCBta2RpcnMoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWlmICghcGFyZW50LmV4aXN0cygpICYmIHBhcmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJbWtkaXJzKChJRm9sZGVyKSBwYXJlbnQsIG1vbml0b3IpOwotCQl9Ci0JCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG1vbml0b3IpOwotCX0KLQotLy8JcHJpdmF0ZSBJRm9sZGVyW10gZ2V0Q2xhc3Nlc0ZvbGRlcnMoKSB7Ci0vLwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLS8vCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotLy8JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotLy8JCQlyZXR1cm4gbmV3IElGb2xkZXJbMF07Ci0vLwkJTGlzdCByZXN1bHQgPSBudWxsOwotLy8JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM7Ci0vLwkJdHJ5IHsKLS8vCQkJZW50cmllcyA9IGphdmFQcm9qLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotLy8JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCXJldHVybiBuZXcgSUZvbGRlclswXTsKLS8vCQl9Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0vLwkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLS8vCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0vLwkJCQlJUmVzb3VyY2UgcmVzID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLS8vCQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNBY2Nlc3NpYmxlKCkgJiYgcmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHJlcy5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0vLwkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotLy8JCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotLy8JCQkJCXJlc3VsdC5hZGQocmVzKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlpZiAocmVzdWx0ID09IG51bGwpCi0vLwkJCXJldHVybiBuZXcgSUZvbGRlclswXTsKLS8vCQlyZXR1cm4gKElGb2xkZXJbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElGb2xkZXJbcmVzdWx0LnNpemUoKV0pOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQVdvcmtiZW5jaE1PRkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQVdvcmtiZW5jaE1PRkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVmYzdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0FXb3JrYmVuY2hNT0ZIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHJlZ2lzdHJhdGlvbiBvZiBzeW1ib2xpYyBtb2RlbCBuYW1lcywgYW5kIGFsc28gcHJvdmlkZXMgdGhlIG1lY2hhbmlzbSBmb3IKLSAqIHJlZ2lzdGVyaW5nIHRoZSBsb2FkIG1vZGVsIG1ldGhvZCB3aGljaCBsb2FkcyBhIHNwZWNpZmljIHR5cGUgb2YgTU9GIG1vZGVsLCBhcyBpZGVudGlmaWVkIGJ5IHRoZQotICogc3ltYm9saWMgbW9kZWwgbmFtZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFXb3JrYmVuY2hNT0ZIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0IHsKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKE9iamVjdCBvYmopIHsKLQkJSVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmICgob2JqICE9IG51bGwpICYmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSkgewotCQkJSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBnZXRNT0ZOYXR1cmUoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCUVPYmplY3Qgcm8gPSAoRU9iamVjdCkgb2JqOwotCQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocm8uZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKChyZXMgPT0gbnVsbCkgfHwgKCFyZXMuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2Uob2JqKTsKLQkJfQotCi0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIEphdmFFTUZOYXR1cmUgZ2V0TU9GTmF0dXJlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCQkJZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IEoyRUVQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoQ29udGV4dC5nZXRNT0ZOYXR1cmUoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBkZXNjLmdldE5hdHVyZUlkcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJZHNbaV0pOwotCQkJCWlmIChuYXR1cmUgaW5zdGFuY2VvZiBKYXZhRU1GTmF0dXJlKSB7Ci0JCQkJCXJldHVybiAoSmF2YUVNRk5hdHVyZSkgbmF0dXJlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gbG9nIGFuZCBhdHRlbXB0IG5leHQgbmF0dXJlCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBKMkVFUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0LmdldE1PRk5hdHVyZShJUHJvamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGM4ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzkvMjAwMSAxMToyMjo1MyBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRIZWxwZXIgZXh0ZW5kcyBKMkVFVmFsaWRhdGlvbkhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGU7Ci0KLQkvKioKLQkgKiBBcHBsaWNhdGlvbkNsaWVudEhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJcmVnaXN0ZXJNb2RlbChBcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuQVBQQ0xJRU5UX01PREVMX05BTUUsICJsb2FkQXBwbGljYXRpb25DbGllbnRGaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHJlc291cmNlLCByZXR1cm4gaXRzIG5vbi1lY2xpcHNlLXNwZWNpZmljIGxvY2F0aW9uLiBJZiB0aGlzIHJlc291cmNlLCBvciB0eXBlIG9mCi0JICogcmVzb3VyY2UsIGlzbid0IGhhbmRsZWQgYnkgdGhpcyBoZWxwZXIsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gImFwcGxpY2F0aW9uLWNsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBBcHBDbGllbnQgZmlsZSBmb3IgdmFsaWRhdGlvbgotCSAqLwotCi0JcHVibGljIEVPYmplY3QgbG9hZEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCi0JCXRyeSB7Ci0JCQlhcHBDbGllbnRGaWxlID0gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkoKEFwcENsaWVudEFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlKTsKLQkJCXJldHVybiBhcHBDbGllbnRGaWxlOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCX1maW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJY2xvc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQlpZiAoYXBwQ2xpZW50RmlsZSAhPSBudWxsKQotCQkJYXBwQ2xpZW50RmlsZS5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlcGVuZGVuY3lVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNmYzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlcGVuZGVuY3lVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBzaW5nbGV0b24ga2VlcHMgYW4gaW50ZXJuYWwgcmVjb3JkIG9mIHByb2plY3QgZGVwZW5kZW5jaWVzLiBUaGF0IGlzLCBldmVyeSBJUHJvamVjdCBjYW4KLSAqIGRlcGVuZCBvbiwgYW5kIGJlIGRlcGVuZGVkIG9uIGJ5LCBvdGhlciBJUHJvamVjdHMuIERpdHRvIElKYXZhUHJvamVjdC4gVGhpcyBjbGFzcyBpcyB1cGRhdGVkIHdoZW4KLSAqIGEgcHJvamVjdChzKSBjbGFzc3BhdGggY2hhbmdlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlcGVuZGVuY3lVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdFtdIEVNUFRZX1BST0pFQ1RTID0gbmV3IElQcm9qZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElKYXZhUHJvamVjdFtdIEVNUFRZX0pBVkFQUk9KRUNUUyA9IG5ldyBJSmF2YVByb2plY3RbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQgX3RlbXBTZXQgPSBudWxsOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNldCBmb3IgdGVtcG9yYXJ5IGNhbGN1bGF0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgZ2V0VGVtcFNldCgpIHsKLQkJaWYgKF90ZW1wU2V0ID09IG51bGwpIHsKLQkJCV90ZW1wU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJfSBlbHNlIHsKLQkJCV90ZW1wU2V0LmNsZWFyKCk7Ci0JCX0KLQkJcmV0dXJuIF90ZW1wU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBvcGVuIElQcm9qZWN0cyB3aGljaCBkZXBlbmQgb24gdGhlIGdpdmVuIElQcm9qZWN0IHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0RGVwZW5kZW50UHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfUFJPSkVDVFM7Ci0JCX0KLQotCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJU2V0IHRlbXBTZXQgPSBnZXRUZW1wU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHAgPSBhbGxQcm9qZWN0c1tpXTsKLQkJCUlQcm9qZWN0W10gcmVxdWlyZXMgPSBnZXRSZXF1aXJlZFByb2plY3RzKHApOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXF1aXJlcy5sZW5ndGg7IGorKykgewotCQkJCUlQcm9qZWN0IHIgPSByZXF1aXJlc1tqXTsKLQkJCQlpZiAocHJvamVjdC5lcXVhbHMocikpIHsKLQkJCQkJdGVtcFNldC5hZGQocCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJUHJvamVjdFtdIGRlcGVuZGVuY3kgPSBuZXcgSVByb2plY3RbdGVtcFNldC5zaXplKCldOwotCQl0ZW1wU2V0LnRvQXJyYXkoZGVwZW5kZW5jeSk7Ci0JCXJldHVybiBkZXBlbmRlbmN5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBvcGVuIElQcm9qZWN0cyB3aGljaCB0aGUgZ2l2ZW4gSVByb2plY3QgcGFyYW1ldGVyIGRlcGVuZHMgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFJlcXVpcmVkUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfUFJPSkVDVFM7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGF0IGVhY2ggcHJvamVjdCBpbiB0aGlzIGxpc3QgZXhpc3RzIGFuZCBpcyBvcGVuCi0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gcHJvamVjdC5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCWlmICgocmVmUHJvamVjdHMgPT0gbnVsbCkgfHwgKHJlZlByb2plY3RzLmxlbmd0aCA9PSAwKSkgewotCQkJCXJldHVybiBFTVBUWV9QUk9KRUNUUzsKLQkJCX0KLQotCQkJSVByb2plY3RbXSB0ZW1wID0gbmV3IElQcm9qZWN0W3JlZlByb2plY3RzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHJQcm9qZWN0ID0gcmVmUHJvamVjdHNbaV07Ci0JCQkJaWYgKHJQcm9qZWN0LmV4aXN0cygpICYmIHJQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCXRlbXBbY291bnQrK10gPSByUHJvamVjdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNUFRZX1BST0pFQ1RTOwotCQkJfQotCi0JCQlpZiAoY291bnQgPT0gdGVtcC5sZW5ndGgpIHsKLQkJCQlyZXR1cm4gdGVtcDsKLQkJCX0KLQotCQkJSVByb2plY3RbXSByZXN1bHQgPSBuZXcgSVByb2plY3RbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IEoyRUVQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRGVwZW5kZW5jeUNhY2hlOjpnZXRSZXF1aXJlZFByb2plY3RzKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCi0JCQlyZXR1cm4gRU1QVFlfUFJPSkVDVFM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygb3BlbiBJSmF2YVByb2plY3RzIHdoaWNoIGRlcGVuZCBvbiB0aGUgZ2l2ZW4gSUphdmFQcm9qZWN0IHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdFtdIGdldERlcGVuZGVudEphdmFQcm9qZWN0cyhJSmF2YVByb2plY3QgamF2YXByb2plY3QpIHsKLQkJaWYgKGphdmFwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBUFJPSkVDVFM7Ci0JCX0KLQotCQkvLyBjYWxjdWxhdGUgdGhlIGRlcGVuZGVuY2llcyBub3cuCi0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IGphdmFwcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOwotCQkJU2V0IHRlbXBTZXQgPSBnZXRUZW1wU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUphdmFQcm9qZWN0IHAgPSBhbGxQcm9qZWN0c1tpXTsKLQkJCQlJSmF2YVByb2plY3RbXSByZXF1aXJlcyA9IGdldFJlcXVpcmVkSmF2YVByb2plY3RzKHApOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVxdWlyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUphdmFQcm9qZWN0IHIgPSByZXF1aXJlc1tqXTsKLQkJCQkJaWYgKGphdmFwcm9qZWN0LmVxdWFscyhyKSkgewotCQkJCQkJdGVtcFNldC5hZGQocCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlKYXZhUHJvamVjdFtdIGRlcGVuZGVuY3kgPSBuZXcgSUphdmFQcm9qZWN0W3RlbXBTZXQuc2l6ZSgpXTsKLQkJCXRlbXBTZXQudG9BcnJheShkZXBlbmRlbmN5KTsKLQkJCXJldHVybiBkZXBlbmRlbmN5OwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IEoyRUVQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRGVwZW5kZW5jeUNhY2hlOjpnZXREZXBlbmRlbnRKYXZhUHJvamVjdHMoIiArIGphdmFwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQotCQkJcmV0dXJuIEVNUFRZX0pBVkFQUk9KRUNUUzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBvcGVuIElKYXZhUHJvamVjdHMgd2hpY2ggdGhlIGdpdmVuIElKYXZhUHJvamVjdCBwYXJhbWV0ZXIgZGVwZW5kcyBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdFtdIGdldFJlcXVpcmVkSmF2YVByb2plY3RzKElKYXZhUHJvamVjdCBqYXZhcHJvamVjdCkgewotCQlpZiAoamF2YXByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVNUFRZX0pBVkFQUk9KRUNUUzsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJSmF2YU1vZGVsIGptID0gamF2YXByb2plY3QuZ2V0SmF2YU1vZGVsKCk7Ci0JCQlpZiAoam0gPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBKMkVFUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJEZXBlbmRlbmN5Q2FjaGU6OmdldFJlcXVpcmVkSmF2YVByb2plY3RzKCIgKyBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQkvL2VudHJ5LnNldFRleHQoIklKYXZhTW9kZWwgPT0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJSmF2YU1vZGVsID09IG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gRU1QVFlfSkFWQVBST0pFQ1RTOwotCQkJfQotCi0JCQlTdHJpbmdbXSByZXF1aXJlZFByb2plY3RzID0gamF2YXByb2plY3QuZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKTsKLQkJCWlmICgocmVxdWlyZWRQcm9qZWN0cyA9PSBudWxsKSB8fCAocmVxdWlyZWRQcm9qZWN0cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlyZXR1cm4gRU1QVFlfSkFWQVBST0pFQ1RTOwotCQkJfQotCi0JCQlJSmF2YVByb2plY3RbXSB0ZW1wID0gbmV3IElKYXZhUHJvamVjdFtyZXF1aXJlZFByb2plY3RzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gcmVxdWlyZWRQcm9qZWN0c1tpXTsKLQkJCQlJSmF2YVByb2plY3QganAgPSBqbS5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKChqcCA9PSBudWxsKSB8fCAoIWpwLmdldFByb2plY3QoKS5leGlzdHMoKSkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmICghanAuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmICghanAuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXRlbXBbY291bnQrK10gPSBqcDsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSBKMkVFUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRGVwZW5kZW5jeUNhY2hlOjpnZXRSZXF1aXJlZEphdmFQcm9qZWN0cygiICsgamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNUFRZX0pBVkFQUk9KRUNUUzsKLQkJCX0KLQotCQkJaWYgKGNvdW50ID09IHRlbXAubGVuZ3RoKSB7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0KLQkJCUlKYXZhUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJSmF2YVByb2plY3RbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gSjJFRVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJEZXBlbmRlbmN5Q2FjaGU6OmdldFJlcXVpcmVkSmF2YVByb2plY3RzKCIgKyBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBFTVBUWV9KQVZBUFJPSkVDVFM7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VhckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZmODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VhckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFYXJIZWxwZXIgZXh0ZW5kcyBKMkVFVmFsaWRhdGlvbkhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCi0KLQkvKioKLQkgKiBXYXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFySGVscGVyKCkgewotCQlzdXBlcigpOwotCi0JCXJlZ2lzdGVyTW9kZWwoSjJFRUNvbnN0YW50cy5FQVJfTU9ERUxfTkFNRSwgImxvYWRFYXJGaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uWE1MRmlsZSgpIHsKLQotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMX0lEOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgcmVzb3VyY2UsIHJldHVybiBpdHMgbm9uLWVjbGlwc2Utc3BlY2lmaWMgbG9jYXRpb24uIElmIHRoaXMgcmVzb3VyY2UsIG9yIHR5cGUgb2YKLQkgKiByZXNvdXJjZSwgaXNuJ3QgaGFuZGxlZCBieSB0aGlzIGhlbHBlciwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAiYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyLmdldFRhcmdldE9iamVjdE5hbWUob2JqKTsKLQotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgRUFSRmlsZSkgewotCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uWE1MRmlsZSgpOwotCQl9Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkltcGwpIHsKLQkJCXJldHVybiAiYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgV0FSIGZpbGUgZm9yIHZhbGlkYXRpb24KLQkgKi8KLQkKLQlwdWJsaWMgRU9iamVjdCBsb2FkRWFyRmlsZSgpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJZWRpdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkKLQkJdHJ5IHsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9ICgoRW50ZXJwcmlzZUFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlLCBmYWxzZSk7Ci0JCQllYXJGaWxlID0gKEVBUkZpbGUpYXJjaGl2ZTsKLQkJCXJldHVybiBhcmNoaXZlOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlRUFSRmlsZSgpIHsKLQkJaWYgKGVhckZpbGUgIT0gbnVsbCkgewotCQkJZWFyRmlsZS5jbG9zZSgpOwotCQkJZWFyRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJCWVkaXQgPSBudWxsOwotCQl9Ci0JCWlmIChlYXJGaWxlICE9IG51bGwpIHsKLQkJCWVhckZpbGUuY2xvc2UoKTsKLQkJCWVhckZpbGUgPSBudWxsOwotCQl9CQkKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDNlYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVWYWxpZGF0aW9uSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dCB7Ci0JCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFVmFsaWRhdGlvbkhlbHBlci4KLQkgKi8KLQlwdWJsaWMgSjJFRVZhbGlkYXRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXb3JrYmVuY2hDb250ZXh0I2dldEZpbGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmVzb3VyY2UgPSAoKEVPYmplY3QpIG9iamVjdCkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHJlc291cmNlLCByZXR1cm4gaXRzIG5vbi1lY2xpcHNlLXNwZWNpZmljIGxvY2F0aW9uLiBJZiB0aGlzIHJlc291cmNlLCBvciB0eXBlIG9mCi0JICogcmVzb3VyY2UsIGlzbid0IGhhbmRsZWQgYnkgdGhpcyBoZWxwZXIsIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWUoSUZpbGUgZmlsZSwgSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMpIHsKLQkJaWYgKChmaWxlID09IG51bGwpIHx8IChjb250YWluZXJzID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGMgPSAwOyBjIDwgY29udGFpbmVycy5sZW5ndGg7IGMrKykgewotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKGZpbGUsIGNvbnRhaW5lcnNbY10pOwotCQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsKSB7Ci0JCQkJLy8gZmlsZSBoYXMgYmVlbiBmb3VuZAotCQkJCXJldHVybiByZXNvdXJjZVBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSBuYW1lLCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgSUZpbGUsIGlmIG9uZSBleGlzdHMuIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUKLQkgKiBJQ29udGFpbmVyIHBhc3NlZCBpbiBjb250YWlucyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiBJZiB0aGUgY29udGFpbmVyIGRvZXMgbm90IGhhdmUKLQkgKiB0aGUgSUZpbGUsIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVOYW1lLCBJQ29udGFpbmVyW10gY29udGFpbmVycykgewotCQlJRmlsZSBjbGF6ekZpbGUgPSBudWxsOwotCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChjb250YWluZXJzID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGMgPSAwOyBjIDwgY29udGFpbmVycy5sZW5ndGg7IGMrKykgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBjb250YWluZXJzW2NdOwotCQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJY2xhenpGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoZmlsZVBhdGguYXBwZW5kKGZpbGVOYW1lKSk7Ci0KLQkJCWlmIChjbGF6ekZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gY2xhenpGaWxlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgSUZpbGUgZ2V0WG1sRmlsZShTdHJpbmcgeG1sRmlsZU5hbWUsIEoyRUVOYXR1cmUgbmF0dXJlKSB7Ci0vLwkJaWYgKG5hdHVyZSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gbmF0dXJlLmdldE1ldGFGb2xkZXIoKS5nZXRGaWxlKHhtbEZpbGVOYW1lKTsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dCNnZXRUYXJnZXRPYmplY3ROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vTWFuaWZlc3RMaW5lVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYW5pZmVzdExpbmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhYzA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYW5pZmVzdExpbmVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RMaW5lVmFsaWRhdG9yIGV4dGVuZHMgT2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTElORV9MRU5HVEggPSA3MjsKLQlwcm90ZWN0ZWQgaW50IGxpbmVOdW1iZXI7Ci0JcHJvdGVjdGVkIGludCBjdXJyZW50Qnl0ZTsKLQlwcm90ZWN0ZWQgaW50IGJ5dGVDb3VudDsKLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0JcHJvdGVjdGVkIExpc3QgbGluZU51bWJlcnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5kc1dpdGhMaW5lQnJlYWsgPSB0cnVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpbmVWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIE1hbmlmZXN0TGluZVZhbGlkYXRvcihJbnB1dFN0cmVhbSBpbikgewotCQlzdXBlcigpOwotCQlpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluKTsKLQkJbGluZU51bWJlciA9IDA7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TGluZU51bWJlcnMoKSB7Ci0JCWlmIChsaW5lTnVtYmVycyA9PSBudWxsKQotCQkJbGluZU51bWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBsaW5lTnVtYmVyczsKLQl9Ci0KLQlwdWJsaWMgaW50W10gZ2V0TGluZU51bWJlcnNFeGNlZWRpbmdMaW1pdCgpIHsKLQkJaWYgKGxpbmVOdW1iZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IGludFswXTsKLQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xpbmVOdW1iZXJzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZU51bWJlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUludGVnZXIgbGlzdF9lbGVtZW50ID0gKEludGVnZXIpIGxpbmVOdW1iZXJzLmdldChpKTsKLQkJCXJlc3VsdFtpXSA9IGxpc3RfZWxlbWVudC5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZWFkTmV4dCgpOwotCQl3aGlsZSAoY3VycmVudEJ5dGUgIT0gLTEpIHsKLQkJCXZhbGlkYXRlTmV4dExpbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQlyZXR1cm4gbGluZU51bWJlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWN1cnJlbnRCeXRlID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTmV4dExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlsaW5lTnVtYmVyKys7Ci0JCWJ5dGVDb3VudCA9IDA7Ci0JCWJvb2xlYW4gZW9sUmVhY2hlZCA9IGZhbHNlOwotCQl3aGlsZSAoY3VycmVudEJ5dGUgIT0gLTEpIHsKLQkJCWlmIChjdXJyZW50Qnl0ZSA9PSAnXHInKSB7Ci0JCQkJZW9sUmVhY2hlZCA9IHRydWU7Ci0JCQkJcmVhZE5leHQoKTsKLQkJCQlpZiAoY3VycmVudEJ5dGUgPT0gJ1xuJykgewotCQkJCQlyZWFkTmV4dCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoY3VycmVudEJ5dGUgPT0gJ1xuJykgewotCQkJCWVvbFJlYWNoZWQgPSB0cnVlOwotCQkJCXJlYWROZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJ5dGVDb3VudCsrOwotCQkJCXJlYWROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnRCeXRlID09IC0xICYmICFlb2xSZWFjaGVkICYmIGJ5dGVDb3VudCA+IDApCi0JCQllbmRzV2l0aExpbmVCcmVhayA9IGZhbHNlOwotCQlpZiAoYnl0ZUNvdW50ID4gNzIpCi0JCQlnZXRMaW5lTnVtYmVycygpLmFkZChuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5kc1dpdGhMaW5lQnJlYWsoKSB7Ci0JCXJldHVybiBlbmRzV2l0aExpbmVCcmVhazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0JCXJldHVybiAhZW5kc1dpdGhMaW5lQnJlYWsgfHwgKGxpbmVOdW1iZXJzICE9IG51bGwgJiYgIWxpbmVOdW1iZXJzLmlzRW1wdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vUHJvamVjdFZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1Byb2plY3RWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTA5MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vUHJvamVjdFZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVByb2plY3RWYWxpZGF0aW9uSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgaW1wbGVtZW50cyBJUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRhaW5lcltdIEVNUFRZX1JFU1VMVCA9IG5ldyBJQ29udGFpbmVyW10ge307Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyW10gb3V0cHV0czsKLQlwcml2YXRlIElDb250YWluZXJbXSBzb3VyY2VzOwotCQotCXB1YmxpYyBzdGF0aWMgUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgZ2V0SW5zdGFuY2UoKXsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpCi0JCQlJTlNUQU5DRSA9IG5ldyBQcm9qZWN0VmFsaWRhdGlvbkhlbHBlcigpOwotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VJbnN0YW5jZSgpewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JfQotCXByaXZhdGUgSUNvbnRhaW5lcltdIGdldENhY2hlZE91dHB1dENvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAob3V0cHV0cyAhPSBudWxsKQotCQkJcmV0dXJuIG91dHB1dHM7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KT09bnVsbCkgewotCQkJb3V0cHV0cyA9IEVNUFRZX1JFU1VMVDsKLQkJCXJldHVybiBFTVBUWV9SRVNVTFQ7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcCA9PSBudWxsIHx8ICFjb21wLmV4aXN0cygpKSB7Ci0JCQlvdXRwdXRzID0gRU1QVFlfUkVTVUxUOwotCQkJcmV0dXJuIEVNUFRZX1JFU1VMVDsKLQkJfQotCQlvdXRwdXRzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKLQkJcmV0dXJuIG91dHB1dHM7Ci0JCi0JfQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0T3V0cHV0Q29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldENhY2hlZE91dHB1dENvbnRhaW5lcnMocHJvamVjdCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRhaW5lcltdIGdldENhY2hlZFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoc291cmNlcyAhPSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZXM7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KT09bnVsbCkgewotCQkJc291cmNlcyA9IEVNUFRZX1JFU1VMVDsKLQkJCXJldHVybiBFTVBUWV9SRVNVTFQ7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcCA9PSBudWxsIHx8ICFjb21wLmV4aXN0cygpKSB7Ci0JCQlzb3VyY2VzID0gRU1QVFlfUkVTVUxUOwotCQkJcmV0dXJuIEVNUFRZX1JFU1VMVDsKLQkJfQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJvb3RzW2ldLmdldFJlc291cmNlKCkgIT0gbnVsbCAmJiByb290c1tpXS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCQlyZXN1bHQuYWRkKHJvb3RzW2ldLmdldFJlc291cmNlKCkpOwotCQl9Ci0JCXNvdXJjZXMgPSAoSUNvbnRhaW5lcltdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbnRhaW5lcltyZXN1bHQuc2l6ZSgpXSk7Ci0JCXJldHVybiBzb3VyY2VzOwotCQkKLQl9Ci0JcHVibGljIElDb250YWluZXJbXSBnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0Q2FjaGVkU291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1Jlc291cmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vUmVzb3VyY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTllNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KRE9NQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsIGltcGxlbWVudHMgSVJlc291cmNlVXRpbCB7Ci0JcHVibGljIFJlc291cmNlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7IC8vIEVycm9yIGRpc2NvdmVyZWQgdXNpbmcgTU9GIG9iamVjdHMKLQotCQkJRU9iamVjdCBybyA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQlKRE9NQWRhcHRvciBqZG9tQWRhcHRlciA9IG51bGw7Ci0KLQkJCUNvbGxlY3Rpb24gYyA9IHJvLmVBZGFwdGVycygpOwotCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJQWRhcHRlciBhID0gKEFkYXB0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKChhICE9IG51bGwpICYmIGEuaXNBZGFwdGVyRm9yVHlwZShSZWFkQWRhcHRvci5UWVBFX0tFWSkgJiYgKGEgaW5zdGFuY2VvZiBKRE9NQWRhcHRvcikpIHsKLQkJCQkJCWpkb21BZGFwdGVyID0gKEpET01BZGFwdG9yKSBhOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoamRvbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWludCBsaW5lTm8gPSBqZG9tQWRhcHRlci5nZXRMaW5lTm8oKTsKLQkJCQlpZiAobGluZU5vICE9IEpET01BZGFwdG9yLklOVkFMSURfTElORU5PKQotCQkJCQlyZXR1cm4gbGluZU5vICsgMTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzUyYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlBcHBsaWNhdGlvbkNsaWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0vKioKLSAqIENyZWF0ZXMgdGhlIGhlbHBlciBmb3IgdGhlIFdTQUQgYXBwbGljYXRpb24gY2xpZW50IHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIgZXh0ZW5kcyBBcHBsaWNhdGlvbkNsaWVudEhlbHBlciB7Ci0KLQkvKioKLQkgKiBVSUFwcGxpY2F0aW9uQ2xpZW50SGVscGVyCi0JICovCi0JcHVibGljIFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIKLQotfS8vIFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJiOTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIE1lc3NhZ2VzIGZvciB0aGUgV1NBRCBhcHBsaWNhdGlvbiBjbGllbnQgdmFsaWRhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVUlBcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMgZXh0ZW5kcyBBcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV8xXzIgPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfMV8zID0gIjEuMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8gPSAiQVBQQ0xJRU5UX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotfS8vIFVJQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWNjMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIENyZWF0ZXMgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCB2YWxpZGF0b3IgZm9yIFdTQUQKLSAqLwotcHVibGljIGNsYXNzIFVJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IgZXh0ZW5kcyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvciBpbXBsZW1lbnRzIFVJQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzIHsKLQotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ly8gVUlBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcgotCi0KLQkvKioKLQkgKiBEb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQotCSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIgaGVscGVyID0gKFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIpIGluSGVscGVyOwotCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgaW5IZWxwZXIpLmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmlyQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotICAgICAgICAgICAgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvaikpIHsKLQkJCQlJVmlydHVhbEZpbGUgZGRGaWxlID0gdmlyQ29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKLQkJCQlpZiggZGRGaWxlLmV4aXN0cygpKSB7CQkJCQkJCi0JCQkJCXN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCBpblJlcG9ydGVyKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0JCQkvL3ZhbGlkYXRlRG9jVHlwZShoZWxwZXIsIGVkaXRNb2RlbCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotCX0KLQkKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbmF0dXJlIGlzIGNvbnNpc3RlbnQgd2l0aCBkb2MgdHlwZS4KLQkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRG9jVHlwZShVSUFwcGxpY2F0aW9uQ2xpZW50SGVscGVyIGhlbHBlciwgQXBwQ2xpZW50RWRpdE1vZGVsIGVkaXRNb2RlbCkgewotLy8JCWlmIChlZGl0TW9kZWwuZ2V0SjJFRU5hdHVyZSgpLmdldEoyRUVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgJiYgZ2V0QXBwQ2xpZW50REQoKS5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSB7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0vLwkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV8yOwotLy8JCQlwYXJhbXNbMV0gPSBoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLS8vCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzM7Ci0vLwkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIEFQUENMSUVOVF9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLS8vCQl9IGVsc2UgaWYgKGVkaXRNb2RlbC5nZXRKMkVFTmF0dXJlKCkuZ2V0SjJFRVZlcnNpb24oKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGdldEFwcENsaWVudEREKCkuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpIHsKLS8vCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLS8vCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzM7Ci0vLwkJCXBhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotLy8JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMjsKLS8vCQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgQVBQQ0xJRU5UX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfLCBwYXJhbXMpOwotLy8JCX0vLyBpZgotLy8JfS8vIHZhbGlkYXRlRG9jVHlwZVZzTmF0dXJlCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlFYXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJRWFySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2M4Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlFYXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgMjoxMjo0NyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVUlFYXJIZWxwZXIgZXh0ZW5kcyBFYXJIZWxwZXIgewotCS8qKgotCSAqIFVJRWFySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJRWFySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJRWFyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUVhclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NhMTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJRWFyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlZhbGlkYXRlWG1sQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTWFuaWZlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVhclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgMjoxMTowMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVUlFYXJWYWxpZGF0b3IgZXh0ZW5kcyBFYXJWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFyVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0dST1VQX05BTUUgPSAiV1NBRC5FQVIuTUFOSUZFU1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV8xXzIgPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfMV8zID0gIjEuMyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgVUlFYXJIZWxwZXIgZWFySGVscGVyOwotLy8JcHJpdmF0ZSBFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFVJRWFyVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJRWFyVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZCgpIHsKLQotCQlWYWxpZGF0ZVhtbENvbW1hbmQgY21kID0gKFZhbGlkYXRlWG1sQ29tbWFuZCkgc3VwZXIuY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kKCk7Ci0JCWNtZC5zZXRWYWxpZGF0ZU5lc3RlZChmYWxzZSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiAoKEVhckhlbHBlcikgX2hlbHBlcikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdXBsaWNhdGVQcm9qZWN0TWFwRXJyb3IoU3RyaW5nIGVhclByb2plY3ROYW1lLCBTdHJpbmcgbW9kdWxlVXJpLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQotCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQlwYXJhbXNbMF0gPSBwcm9qZWN0TmFtZTsKLQkJcGFyYW1zWzFdID0gZWFyUHJvamVjdE5hbWU7Ci0JCXBhcmFtc1syXSA9IG1vZHVsZVVyaTsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkRVUExJQ0FURV9NT0RVTEVfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl8sIHBhcmFtcyk7Ci0JCi0JCWFkZExvY2FsaXplZEVycm9yKG1zZywgYXBwREQpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwU3ViVGFza01lc3NhZ2VzKEVPYmplY3QgcmVmKSB7Ci0JCVN0cmluZyBncm91cE5hbWUgPSBFSkJfUkVGX0dST1VQX05BTUU7Ci0JCWlmIChyZWYgaW5zdGFuY2VvZiBFamJSZWYpCi0JCXsKLS8vCQkJcmVmID0gKEVqYlJlZikgcmVmOwotCQl9Ci0JCWVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFJlc291cmNlUmVmKSB7Ci0vLwkJCXJlZiA9IChSZXNvdXJjZVJlZikgcmVmOwotCQkJZ3JvdXBOYW1lID0gUkVTX1JFRl9HUk9VUF9OQU1FOwotCQl9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLS8vCQkJcmVmID0gKFNlcnZpY2VSZWYpIHJlZjsKLQkJCWdyb3VwTmFtZSA9IFNFUlZJQ0VfUkVGX0dST1VQX05BTUU7Ci0JCX0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgUmVzb3VyY2VFbnZSZWYpIHsKLS8vCQkJcmVmID0gKFJlc291cmNlRW52UmVmKSByZWY7Ci0JCQlncm91cE5hbWUgPSBSRVNfRU5WX1JFRl9HUk9VUF9OQU1FOwotCQl9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNlY3VyaXR5Um9sZVJlZikgewotLy8JCQlyZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSByZWY7Ci0JCQlncm91cE5hbWUgPSBTRUNfUk9MRV9SRUZfR1JPVVBfTkFNRTsKLQkJfSBlbHNlIGlmIChyZWYgaW5zdGFuY2VvZiBNZXNzYWdlRGVzdGluYXRpb25SZWYpIHsKLS8vCQkJcmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgcmVmOwotCQkJZ3JvdXBOYW1lID0gTUVTU0FHRV9SRUZfR1JPVVBfTkFNRTsKLQkJfQotCQlSZXNvdXJjZSByZXMgPSByZWYuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJX3JlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQodGhpcywgZmlsZSwgZ3JvdXBOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBBbGxSZWZTdWJUYXNrTWVzc2FnZXMoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJX3JlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQodGhpcywgZmlsZSwgRUpCX1JFRl9HUk9VUF9OQU1FKTsKLQkJCV9yZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHRoaXMsIGZpbGUsIFJFU19SRUZfR1JPVVBfTkFNRSk7Ci0JCQlfcmVwb3J0ZXIucmVtb3ZlTWVzc2FnZVN1YnNldCh0aGlzLCBmaWxlLCBTRVJWSUNFX1JFRl9HUk9VUF9OQU1FKTsKLQkJCV9yZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHRoaXMsIGZpbGUsIFNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FKTsKLQkJCV9yZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHRoaXMsIGZpbGUsIE1FU1NBR0VfUkVGX0dST1VQX05BTUUpOwotCQkJX3JlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQodGhpcywgZmlsZSwgUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgMjo1NjozMiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lYXIud29ya2JlbmNoaW1wbC5VSUVhckhlbHBlcgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFySGVscGVyIGdldEVhckhlbHBlcigpIHsKLQkJcmV0dXJuIGVhckhlbHBlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZhbGlkQ2xhc3NQYXRoRW50cnlXYXJuaW5nKFN0cmluZyBlbnRyeSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1syXTsKLQkJcGFyYW1zWzBdID0gYW5BcmNoaXZlLmdldFVSSSgpOwotCQlwYXJhbXNbMV0gPSBlbnRyeTsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLklOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX09ORV9XQVJOXywgcGFyYW1zKTsKLQkJYWRkTG9jYWxpemVkV2FybmluZyhtc2csIGdldE1hbmlmZXN0RmlsZShhbkFyY2hpdmUpLCBNQU5JRkVTVF9HUk9VUF9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZhbGlkQ2xhc3NQYXRoRW50cnlXYXJuaW5nKFN0cmluZyBlbnRyeSwgU3RyaW5nIHJlc29sdmVkRW50cnksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCXBhcmFtc1swXSA9IGFuQXJjaGl2ZS5nZXRVUkkoKTsKLQkJcGFyYW1zWzFdID0gZW50cnk7Ci0JCXBhcmFtc1syXSA9IHJlc29sdmVkRW50cnk7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9UV09fV0FSTl8sIHBhcmFtcyk7CQkKLQkJYWRkTG9jYWxpemVkV2FybmluZyhtc2csIGdldE1hbmlmZXN0RmlsZShhbkFyY2hpdmUpLCBNQU5JRkVTVF9HUk9VUF9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZhbGlkRGVwZWRlbmN5V2FybmluZyhTdHJpbmcgZW50cnksIEFyY2hpdmUgYW5BcmNoaXZlLCBNb2R1bGVGaWxlIG0pIHsKLQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJcGFyYW1zWzBdID0gbS5nZXRVUkkoKTsKLQkJcGFyYW1zWzFdID0gZW50cnk7Ci0JCXBhcmFtc1syXSA9IGFuQXJjaGl2ZS5nZXRVUkkoKTsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLklOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX0RFUEVOREVOQ1lfV0FSTl8sIHBhcmFtcyk7Ci0JCQotCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKG1zZywgZ2V0TWFuaWZlc3RGaWxlKGFuQXJjaGl2ZSksIE1BTklGRVNUX0dST1VQX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvMTAvMjAwMSAyOjU2OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFYXJIZWxwZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lYXIud29ya2JlbmNoaW1wbC5VSUVhckhlbHBlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhckhlbHBlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFySGVscGVyIG5ld0VhckhlbHBlcikgewotCQllYXJIZWxwZXIgPSBuZXdFYXJIZWxwZXI7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBJVmFsaWRhdG9ySm9iLk9LX1NUQVRVUzsKLQkJSVByb2plY3QgZWFyUHJvaiA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGluSGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhck1vZHVsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2opOwotICAgICAgICAgICAgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2opKXsKLQkJCQlJVmlydHVhbEZpbGUgZGRGaWxlID0gZWFyTW9kdWxlLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKLQkJCQlpZiggZGRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWluUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCQkJCQotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGVhclJlZmVyZW5jZXM7Ci0JCQkJCWJvb2xlYW4gaXNNaXhlZEVBUiA9IGZhbHNlOwotCQkJCQlib29sZWFuIGlzSmF2YUVFRml2ZVByb2plY3QgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBpc0xlZ2FjeUVBUiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzTGVnYWN5SjJFRVByb2plY3QoZWFyUHJvaik7Ci0JCQkJCQotCQkJCQkvL2JlY2F1c2Ugb2YgWzIyNDQ4NF0gNS4wIEVBUnMgbWF5IGdldCB0byB0aGlzIHZhbGlkYXRvciB3aGVuIHRoZXkgc2hvdWxkIG5vdCwgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgdGhpcwotCQkJCQlpZihpc0xlZ2FjeUVBUikgewotCQkJCQkJZWFyUmVmZXJlbmNlcyA9IGVhck1vZHVsZS5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW5ldDsKLQkJCQkJCUlQcm9qZWN0IGVhclJlZmVkUHJvajsKLQkJCQkJCS8vW0J1ZyAgMjQxNTI1XSBuZWVkIHRvIHVzZSByZWZlcmVuY2VkIGNvbXBvbmVudHMgYmVjYXVzZSByZWZlcmVuY2VkIHByb2plY3RzIHJldHVybiB0aGUgRUFSIGZvciByZWZlcmVuY2VkIGJpbmFyeSBhcmNoaXZlcwotCQkJCQkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIGVhclJlZmVyZW5jZSA6IGVhclJlZmVyZW5jZXMpIHsKLQkJCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW5ldCA9IGVhclJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy9bQnVnICAyNDE1MjVdaWYgaXRzIGEgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgdGhlbiB3ZSBuZWVkIHRvIHVzZQotCQkJCQkJCS8vCWNvbXBvbmVudHMgdG8gZ2V0IHZlcnNpb24sIG90aGVyd2lzZSB1c2UgSVByb2plY3QKLQkJCQkJCQlpZihyZWZlcmVuY2VkQ29tcG9uZW5ldCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCQkJCWlzSmF2YUVFRml2ZVByb2plY3QgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbmV0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQllYXJSZWZlZFByb2ogPSByZWZlcmVuY2VkQ29tcG9uZW5ldC5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCWlzSmF2YUVFRml2ZVByb2plY3QgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QoZWFyUmVmZWRQcm9qKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaWYoaXNKYXZhRUVGaXZlUHJvamVjdCkgewotCQkJCQkJCQkgLy9IQUNLOiB0aGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgdGhlIGNhbGwgdG8gc3VwZXIudmFsaWRhdGVJbkpvYiBidXQgaW4gdGhpcyBjYXNlIHdlIGFyZSBwdXJwb3NlbHkgYXZvaWRpbmcgdGhhdCBjYWxsCi0JCQkJCQkJCV9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0JCQkJCQkJCQotCQkJCQkJCQlTdHJpbmdbXSBwYXJhbXMgPSB7ZWFyUHJvai5nZXROYW1lKCksIHJlZmVyZW5jZWRDb21wb25lbmV0LmdldE5hbWUoKX07Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5KRUU1X1BST0pFQ1RfUkVGRVJFTkNFRF9CWV9QUkVfSkVFNV9FQVIsIHBhcmFtcyk7Ci0JCQkJCQkJCWFkZExvY2FsaXplZFdhcm5pbmcobXNnLGVhclByb2opOwotCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvL2lmIGFueSByZWZlcmVuY2VkIHByb2plY3QgaXMgYSBKRUUgNSBwcm9qZWN0IHRoZW4gZWFyIGlzIG1peGVkCi0JCQkJCQkJaWYoIWlzTWl4ZWRFQVIpIHsKLQkJCQkJCQkJaXNNaXhlZEVBUiA9IGlzSmF2YUVFRml2ZVByb2plY3Q7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vc2hvdWxkIG9ubHkgY29udGludWUgdmFsaWRhdGlvbiBpZiB0aGlzIGlzIG5vdCBhbiBpbnZhbGlkIG1peGVkIEVBUgotCQkJCQkvL2lzTGVnYWN5RUFSIGNoZWNrIG5lZWRlZCBiZWNhdXNlIG9mIFsyMjQ0ODRdIDUuMCBFQVJzIG1heSBnZXQgdG8gdGhpcyB2YWxpZGF0b3Igd2hlbiB0aGV5IHNob3VsZCBub3QsIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoaXMKLQkJCQkJaWYoaXNMZWdhY3lFQVIgJiYgIWlzTWl4ZWRFQVIpIHsKLQkJCQkJCXN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlSW5Kb2IoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCQkJCQkJdmFsaWRhdGVNb2R1bGVNYXBzKGVhck1vZHVsZSk7Ci0JCQkJCQl2YWxpZGF0ZU1hbmlmZXN0cygpOwotCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklzKGVhck1vZHVsZSk7Ci0JCS8vCQkJCXZhbGlkYXRlVXRpbEphck1hcHMoZWFyRWRpdCxlYXJNb2R1bGUpOwotCQkvLwkJCQl2YWxpZGF0ZVVyaUFscmVhZHlFeGlzdHNJbkVhcihlYXJFZGl0LGVhck1vZHVsZSk7Ci0JCS8vCQkJCXZhbGlkYXRlRG9jVHlwZShlYXJFZGl0LGVhck1vZHVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0gICAgICAgICAgICB9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQkKLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlJU2NoZWR1bGluZ1J1bGUgY29tYmluZWRSdWxlID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoIHByb2plY3QgKTsKLQkJSUZpbGUgYXBwRGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCQlpZiggY29tcCAhPSBudWxsICl7Ci0JCQlJVmlydHVhbEZpbGUgdmYgPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7Ci0JCQlpZiggdmYhPSBudWxsICl7Ci0JCQkJYXBwRGVwbG95bWVudERlc2NyaXB0b3IgPSB2Zi5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJCWNvbWJpbmVkUnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKGFwcERlcGxveW1lbnREZXNjcmlwdG9yLCBjb21iaW5lZFJ1bGUpOwotCQkJfQotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IoIGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKysgKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZDb21wID0gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYoIHJlZkNvbXAgIT0gbnVsbCAmJiAhcmVmQ29tcC5pc0JpbmFyeSgpICl7Ci0JCQkJCVN0cmluZyB0eXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUoIHJlZkNvbXAgKTsKLQkJCQkJSVZpcnR1YWxGaWxlIHJlZkRERmlsZSA9IG51bGw7Ci0JCQkJCWlmKCB0eXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSl7Ci0JCQkJCQlyZWZEREZpbGUgPSByZWZDb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkpOwotCQkJCQl9ZWxzZSBpZiAoIHR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEUpKXsKLQkJCQkJCXJlZkRERmlsZSA9IHJlZkNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKSk7Ci0JCQkJCX1lbHNlIGlmKCB0eXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKSl7Ci0JCQkJCQlyZWZEREZpbGUgPSByZWZDb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSkpOwotCQkJCQl9ZWxzZSBpZiggdHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkpewotCQkJCQkJcmVmRERGaWxlID0gcmVmQ29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwotCQkJCQl9Ci0JCQkJCWlmKCByZWZEREZpbGUhPSBudWxsICl7Ci0JCQkJCQlJRmlsZSBkZCA9IHJlZkRERmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJCQkJY29tYmluZWRSdWxlID0gTXVsdGlSdWxlLmNvbWJpbmUoZGQsIGNvbWJpbmVkUnVsZSk7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gY29tYmluZWRSdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRHVwbGljYXRlQ2xhc3NwYXRoQ29tcG9uZW50VVJJcyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKLQkJaWYgKGVhckZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIFNldCBtb2R1bGVVUklzID0gbmV3IEhhc2hTZXQoKTsKLQkJZmluYWwgTGlzdCBhcmNoaXZlcyA9IGVhckZpbGUuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWZpbmFsIEFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCW1vZHVsZVVSSXMuYWRkKGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCX0KLQotCQlmaW5hbCBNYXAgYXJjaGl2ZVRvUGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29tcG9uZW50c1tpXTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCQkvLyByZXRyaWV2ZSBhbGwgSmF2YSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcwotCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07Ci0JCQkJCS8vIG9ubHkgLi4vIHJ1bnRpbWUgcGF0aHMgY29udHJpYnV0ZSB0byB0aGUgRUFSCi0JCQkJCWlmIChyZWYuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IHtyZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKS5nZXROYW1lKCksIGFyY2hpdmVOYW1lfTsKLQkJCQkJCWlmIChtb2R1bGVVUklzLmNvbnRhaW5zKGFyY2hpdmVOYW1lKSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSV9NQVRDSEVTX0FSQ0hJVkVfVVJJLCBwYXJhbXMpOwotCQkJCQkJCWFkZExvY2FsaXplZEVycm9yKG1zZywgcHJvamVjdCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUlQYXRoIGNwRW50cnlQYXRoPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDbGFzc3BhdGhWaXJ0dWFsUmVmZXJlbmNlTG9jYXRpb24ocmVmKTsKLQkJCQkJCQlpZiAoY3BFbnRyeVBhdGggIT0gbnVsbCkgewotCQkJCQkJCQlJUGF0aCBleGlzdGluZ1BhdGggPSAoSVBhdGgpIGFyY2hpdmVUb1BhdGguZ2V0KGFyY2hpdmVOYW1lKTsKLQkJCQkJCQkJaWYgKGV4aXN0aW5nUGF0aCAhPSBudWxsICYmICFleGlzdGluZ1BhdGguZXF1YWxzKGNwRW50cnlQYXRoKSkgewotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkRVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSwgcGFyYW1zKTsKLQkJCQkJCQkJCWFkZExvY2FsaXplZEVycm9yKG1zZywgcHJvamVjdCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlhcmNoaXZlVG9QYXRoLnB1dChhcmNoaXZlTmFtZSwgY3BFbnRyeVBhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWFuaWZlc3RzKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZiAoZWFyRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlMaXN0IGFyY2hpdmVzID0gZWFyRmlsZS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCi0JCQlmaW5hbCBBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQlJRmlsZSB0YXJnZXQgPSBnZXRNYW5pZmVzdEZpbGUoYW5BcmNoaXZlKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCQlfcmVwb3J0ZXIucmVtb3ZlTWVzc2FnZVN1YnNldCh0aGlzLCB0YXJnZXQsIE1BTklGRVNUX0dST1VQX05BTUUpOwotCQkJdmFsaWRhdGVNYW5pZmVzdENhc2UoYW5BcmNoaXZlKTsKLQkJCXZhbGlkYXRlTWFuaWZlc3RMaW5lcyhhbkFyY2hpdmUpOwotCQkJdmFsaWRhdGVNYW5pZmVzdENsYXNzcGF0aChhbkFyY2hpdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYW5pZmVzdENhc2UoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIG1mdXJpID0gSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkk7Ci0KLQkJLy9JbmRpY2F0ZXMgYSBtYW5pZmVzdCBmaWxlIHdpdGggdGhlIHZhbGlkIG5hbWUgZXhpc3RzLAotCQkvL25vdGhpbmcgbGVmdCB0byBkbwotCQlpZiAoYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShtZnVyaSkpCi0JCQlyZXR1cm47Ci0KLQkJLy9PdGhlcndpc2UgaXRlcmF0ZSB0aGUgbGlzdCBvZiBmaWxlcwotCQkvL0Vuc3VyZSB0aGUgYXJjaGl2ZSBpcyByZWFkLW9ubHkgZmlyc3QKLQkJYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5zZXRJc1JlYWRPbmx5KHRydWUpOwotCQlMaXN0IGZpbGVzID0gYW5BcmNoaXZlLmdldEZpbGVzKCk7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCXVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQkJaWYgKG1mdXJpLmVxdWFsc0lnbm9yZUNhc2UodXJpKSAmJiAhbWZ1cmkuZXF1YWxzKHVyaSkpIHsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSB7dXJpLCBhbkFyY2hpdmUuZ2V0VVJJKCl9OwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5JTlZBTElEX0NBU0VfRk9SX01BTklGRVNUX0VSUk9SXywgcGFyYW1zKTsKLQkJCQlhZGRMb2NhbGl6ZWRFcnJvcihtc2csIG51bGwpOwkJCQkKLQkJCX0KLQkJfQotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG51bGw7Ci0JCXRyeXsKLQkJCW1hbmlmZXN0ID0gYW5BcmNoaXZlLmdldE1hbmlmZXN0KCk7Ci0JCX1jYXRjaCggTWFuaWZlc3RFeGNlcHRpb24gbWYpewotCQkJLy9tZi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCW1mLmdldE1lc3NhZ2UoKTsKLQkJCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW117YW5BcmNoaXZlLmdldFVSSSgpfTsKLQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXywgYXJncyk7Ci0JCQkKLQkJCWFkZExvY2FsaXplZEVycm9yKHRtcCwgYXJncyk7Ci0JCX0KLQkJCi0JCWlmKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nW10gY3AgPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjcFtpXSwgYW5BcmNoaXZlKTsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCWludmFsaWRDbGFzc1BhdGhFbnRyeVdhcm5pbmcoY3BbaV0sIGFuQXJjaGl2ZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlGaWxlIGYgPSBudWxsOwotCQkJLy9JRmlsZSByZiA9IG51bGw7Ci0JCQl0cnkgewotLy8JCQkJCWlmICh1cmkuZW5kc1dpdGgoSjJFRUltcG9ydENvbnN0YW50cy5JTVBPUlRFRF9KQVJfU1VGRklYKSkgewotCQkJCQkJLy9UT0RPIE5lZWRzIHdvcmsgaGVyZSB0byBpbml0aWFsaXplIHJmIGFzIHJmIGlzIGFuIElGaWxlIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IGFuIElGaWxlIGN1cnJlbnRseQotLy8JCQkJCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2UgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmZpbmRNZW1iZXIobmV3IFBhdGgodXJpKSk7Ci0vLwkJCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotLy8JCQkJCQkJaW52YWxpZENsYXNzUGF0aEVudHJ5V2FybmluZyhjcFtpXSwgdXJpLCBhbkFyY2hpdmUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJIGVsc2UKLQkJCQkJZiA9IGVhckZpbGUuZ2V0RmlsZSh1cmkpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQlpbnZhbGlkQ2xhc3NQYXRoRW50cnlXYXJuaW5nKGNwW2ldLCBlYXJGaWxlLmdldFVSSSgpLCBhbkFyY2hpdmUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmlzQXJjaGl2ZSgpICYmIGFuQXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkgewotCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKSBmOwotCQkJCU1vZHVsZUZpbGUgbSA9IChNb2R1bGVGaWxlKSBhbkFyY2hpdmU7Ci0JCQkJaWYgKCFBcmNoaXZlVXRpbC5pc1ZhbGlkRGVwZW5kZW5jeShhcmNoaXZlLCBtKSkKLQkJCQkJaW52YWxpZERlcGVkZW5jeVdhcm5pbmcoY3BbaV0sIGFyY2hpdmUsIG0pOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hbmlmZXN0TGluZXMoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpcyA9IGFuQXJjaGl2ZS5nZXRJbnB1dFN0cmVhbShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQlNYW5pZmVzdExpbmVWYWxpZGF0b3IgbGluZVZhbCA9IG5ldyBNYW5pZmVzdExpbmVWYWxpZGF0b3IoaXMpOwotCQkJbGluZVZhbC52YWxpZGF0ZSgpOwotCQkJYWRkRXJyb3JzSWZOZWNlc3NhcnkoYW5BcmNoaXZlLCBsaW5lVmFsKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQloYW5kbGVNYW5pZmVzdEV4Y2VwdGlvbihleCwgYW5BcmNoaXZlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJaGFuZGxlTWFuaWZlc3RFeGNlcHRpb24oZXgsIGFuQXJjaGl2ZSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JzSWZOZWNlc3NhcnkoQXJjaGl2ZSBhbkFyY2hpdmUsIE1hbmlmZXN0TGluZVZhbGlkYXRvciBtZlZhbCkgewotCQlpZiAoIW1mVmFsLmhhc0Vycm9ycygpKQotCQkJcmV0dXJuOwotCQlJRmlsZSB0YXJnZXQgPSBnZXRNYW5pZmVzdEZpbGUoYW5BcmNoaXZlKTsKLQkJaWYgKCFtZlZhbC5lbmRzV2l0aExpbmVCcmVhaygpKQotCQkJYWRkRmlsZUVuZEVycm9yKGFuQXJjaGl2ZSwgbWZWYWwsIHRhcmdldCk7Ci0JCWludFtdIGxpbmVzID0gbWZWYWwuZ2V0TGluZU51bWJlcnNFeGNlZWRpbmdMaW1pdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGRMaW5lTGVuZ3RoRXJyb3IoYW5BcmNoaXZlLCB0YXJnZXQsIGxpbmVzW2ldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpbmVMZW5ndGhFcnJvcihBcmNoaXZlIGFuQXJjaGl2ZSwgSUZpbGUgdGFyZ2V0LCBpbnQgbGluZU5vKSB7Ci0JCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzJdOwotCQlhcmdzWzBdID0gSW50ZWdlci50b1N0cmluZyhsaW5lTm8pOwotCQlhcmdzWzFdID0gYW5BcmNoaXZlLmdldFVSSSgpOwotCQkKLQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLk1BTklGRVNUX0xJTkVfRVhDRUVEU19MRU5HVEhfRVJST1JfLCBhcmdzKTsKLQkJCi0JCWlmKCBsaW5lTm8gPj0gMCApewotCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCB0YXJnZXQsIE1BTklGRVNUX0dST1VQX05BTUUsIGxpbmVObyApOwotCQl9ZWxzZXsKLQkJCWFkZExvY2FsaXplZEVycm9yKHRtcCwgdGFyZ2V0LCBNQU5JRkVTVF9HUk9VUF9OQU1FICk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEZpbGVFbmRFcnJvcihBcmNoaXZlIGFuQXJjaGl2ZSwgTWFuaWZlc3RMaW5lVmFsaWRhdG9yIG1mVmFsLCBJRmlsZSB0YXJnZXQpIHsKLQkJU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbXXthbkFyY2hpdmUuZ2V0VVJJKCl9OwotCQkKLQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLk1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXywgYXJncyk7Ci0JCQotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGdldE1hbmlmZXN0RmlsZShhbkFyY2hpdmUpLCBNQU5JRkVTVF9HUk9VUF9OQU1FLCBtZlZhbC5nZXRMaW5lQ291bnQoKSk7Ci0JCWVsc2UKLQkJCWFkZExvY2FsaXplZEVycm9yKHRtcCwgbnVsbCwgTUFOSUZFU1RfR1JPVVBfTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTWFuaWZlc3RFeGNlcHRpb24oSU9FeGNlcHRpb24gZXgsIEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXywgbmV3IFN0cmluZ1tde2FuQXJjaGl2ZS5nZXRVUkkoKX0pOwkJCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCB0bXApOwotCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihtZXNzYWdlLCBleCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHV0aWxqYXIgbWFwcwotCSAqLwotLy8JcHVibGljIHZvaWQgdmFsaWRhdGVVdGlsSmFyTWFwcyhFQVJBcnRpZmFjdEVkaXQgZWRpdCwgSVZpcnR1YWxDb21wb25lbnQgd29ya2JlbmNoTW9kdWxlKSB7Ci0vLwkJTGlzdCB1dGlsSmFyTW9kdWxlcyA9IGVkaXQuZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoKTsKLS8vCQlpZiAoIXV0aWxKYXJNb2R1bGVzLmlzRW1wdHkoKSB8fCAhdXRpbEphck1vZHVsZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXRpbEphck1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFVdGlsSmFyID0gKChJVmlydHVhbFJlZmVyZW5jZSkgdXRpbEphck1vZHVsZXMuZ2V0KGkpKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0vLwkJCQlpZiAoYVV0aWxKYXIgIT0gbnVsbCkgewotLy8JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFVdGlsSmFyLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotLy8JCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vCQkJCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0vLwkJCQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCksIGFVdGlsSmFyLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKSwgZWFySGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCl9OwotLy8JCQkJCQkJYWRkV2FybmluZyhnZXRCYXNlTmFtZSgpLCBQUk9KRUNUX0RPRVNfTk9UX0VYSVNUX1dBUk5fLCBwYXJhbXMpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJLy92YWxpZGF0ZU1vZHVsZVByb2plY3RGb3JWYWxpZFNlcnZlclRhcmdldChwcm9qZWN0KTsKLS8vCQkJCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotLy8JCQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX07Ci0vLwkJCQkJCQkJYWRkV2FybmluZyhnZXRCYXNlTmFtZSgpLCBQUk9KRUNUX0lTX0NMT1NFRF9XQVJOXywgcGFyYW1zKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0gCi0vLwkJdmFsaWRhdGVEdXBsaWNhdGVVdGlsSmFycyhlZGl0LHdvcmtiZW5jaE1vZHVsZSk7Ci0vLwkJdmFsaWRhdGVVdGlsSmFyTmFtZUNvbGxpc2lvbihlZGl0LHdvcmtiZW5jaE1vZHVsZSk7Ci0vLwkJdmFsaWRhdGVVdGlsSmFyQ29udGFpbnNOb1NwYWNlcyhlZGl0LHdvcmtiZW5jaE1vZHVsZSk7Ci0vLwkJCi0vLwl9Ly8gdmFsaWRhdGVVdGlsSmFyTWFwcwotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSB1dGlsIGphciBjb250YWlucyBzcGFjZXMgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBFQVJFZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIGVhckVkaXRNb2RlbCAtIFRoZSBlYXIgZWRpdG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVXRpbEphckNvbnRhaW5zTm9TcGFjZXMoRUFSQXJ0aWZhY3RFZGl0IGVkaXQsIElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSkgewotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHV0aWxKYXJzID0gZWRpdC5nZXRVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcygpOwotCi0JCWlmICh1dGlsSmFycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXRpbEphcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHV0aWxNb2R1bGUgPSB1dGlsSmFyc1tpXTsKLQkJCWlmICh1dGlsTW9kdWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocHJvamVjdCkudG9TdHJpbmcoKTsKLQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmluZGV4T2YoIiAiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IHVyaTsKLQkJCQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLlVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfLCBwYXJhbXMpOwotCQkJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKLQkJCQl9Ly8gaWYKLQkJCX0vLyBpZgotCQl9Ly8gZm9yCi0KLQl9Ly8gdmFsaWRhdGVVdGlsSmFyQ29udGFpbnNOb1NwYWNlcwotCi0JLyoqCi0JICogVmFsaWRhdGVzIGlmIHRoZSBhIHV0aWwgamFyIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGFub3RoZXIgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBFQVJFZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIGVhckVkaXRNb2RlbCAtIFRoZSBlYXIgZWRpdG1vZGVsLgotCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVdGlsSmFyTmFtZUNvbGxpc2lvbihFQVJBcnRpZmFjdEVkaXQgZWRpdCwgSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlKSB7Ci0vLwkJTGlzdCB1dGlsSmFycyA9IGVkaXQuZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoKTsKLS8vCQlpZiAodXRpbEphcnMgPT0gbnVsbCkKLS8vCQkJcmV0dXJuOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgdXRpbEphcnMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJVXRpbGl0eUpBUk1hcHBpbmcgdXRpbE1vZHVsZSA9IChVdGlsaXR5SkFSTWFwcGluZykgdXRpbEphcnMuZ2V0KGkpOwotLy8KLS8vCQkJaWYgKHV0aWxNb2R1bGUgIT0gbnVsbCkgewotLy8JCQkJaWYgKGVkaXQudXJpRXhpc3RzKHV0aWxNb2R1bGUuZ2V0VXJpKCkpKSB7Ci0vLwotLy8JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXXt1dGlsTW9kdWxlLmdldFVyaSgpLCBtb2R1bGUuZ2V0TmFtZSgpfTsKLS8vCQkJCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBNRVNTQUdFX1VUSUxfVVJJX05BTUVfQ09MTElTSU9OX0VSUk9SXywgcGFyYW1zKTsKLS8vCi0vLwkJCQl9IGVsc2UgaWYgKHV0aWxNb2R1bGUuZ2V0UHJvamVjdE5hbWUoKSAhPSBudWxsIHx8IHV0aWxNb2R1bGUuZ2V0UHJvamVjdE5hbWUoKS5sZW5ndGgoKSAhPSAwKSB7Ci0vLwkJCQkJaWYgKGVkaXQudXJpRXhpc3RzKHV0aWxNb2R1bGUuZ2V0VXJpKCkpKSB7Ci0vLwkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXXt1dGlsTW9kdWxlLmdldFVyaSgpLCB1dGlsTW9kdWxlLmdldFByb2plY3ROYW1lKCl9OwotLy8JCQkJCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBNRVNTQUdFX1VUSUxfUFJPSkVDVF9OQU1FX0NPTExJU0lPTl9FUlJPUl8sIHBhcmFtcyk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfSAKLQkJCi0KLQotCS8qKgotCSAqIHZhbGlkYXRlIGlzIHRoZXJlIGFyZSBkdXBsaWNhdGUgdXRpbCBqYXJzLgotCSAqIAotCSAqIEBwYXJhbSBFQVJFZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIGVhckVkaXRNb2RlbCAtIFRoZSBlYXIgZWRpdG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVVdGlsSmFycyhFQVJBcnRpZmFjdEVkaXQgZWRpdCwgSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gdXRpbEphcnMgPSBlZGl0LmdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKCk7Ci0JCVNldCB2aXNpdGVkVXRpbFVyaSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmICh1dGlsSmFycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHV0aWxKYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSB1dGlsTW9kdWxlID0gdXRpbEphcnNbaV07Ci0JCQlpZiAodXRpbE1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKHByb2plY3QpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHZpc2l0ZWRVdGlsVXJpLmNvbnRhaW5zKHVyaSkpIHsKLQkJCQkJU3RyaW5nIGNvbXBOYW1lID0gbW9kdWxlLmdldE5hbWUoKTsKLQkJCQkJZHVwbGljYXRlVXRpbEVycm9yKG1vZHVsZS5nZXROYW1lKCksdXJpLCBjb21wTmFtZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXZpc2l0ZWRVdGlsVXJpLmFkZCh1cmkpOwotCQkJfSAvLyBpZgotCQl9IC8vIGZvcgotCX0gLy8gdmFsaWRhdGVNb2R1bGVNYXBzRHVwbGljYXRlVXRpbAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlcnJvciBmb3IgZHVwbGljYXRlIHV0aWwgamFycy4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBlYXJQcm9qZWN0TmFtZSAtIFRoZSBlYXJzIHByb2plY3QgbmFtZS4KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBtb2R1bGVVcmkgLSBUaGUgbW9kdWxlcyB1cmkuCi0JICogQHBhcmFtIFN0cmluZwotCSAqICAgICAgICAgICAgcHJvamVjdE5hbWUgLSBUaGUgcHJvamVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1cGxpY2F0ZVV0aWxFcnJvcihTdHJpbmcgZWFyUHJvamVjdE5hbWUsIFN0cmluZyBtb2R1bGVVcmksIFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQlwYXJhbXNbMF0gPSBwcm9qZWN0TmFtZTsKLQkJcGFyYW1zWzFdID0gZWFyUHJvamVjdE5hbWU7Ci0JCXBhcmFtc1syXSA9IG1vZHVsZVVyaTsKLQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkRVUExJQ0FURV9VVElMSkFSX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfLCBwYXJhbXMpOwotCQkKLQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBudWxsKTsKLQl9Ly8gZHVwbGljYXRlVXRpbEVycm9yCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1vZHVsZU1hcHMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlWaXJ0dWFsRmlsZSBkZEZpbGUgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwotCQlpZiggZGRGaWxlLmV4aXN0cygpKXsKLQkJCUVMaXN0IG1vZHVsZXMgPSBhcHBERC5nZXRNb2R1bGVzKCk7Ci0JCQlpZiAoIW1vZHVsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQkJCXRyeXsKLQkJCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKCBjb21wb25lbnQuZ2V0UHJvamVjdCgpICk7Ci0JCQkJCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCQkJCVN0cmluZyB1cmkgPSBtb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcCA9IGVkaXQuZ2V0TW9kdWxlQnlNYW5pZmVzdFVSSSggdXJpICk7Ci0JCQkJCQlpZiggcmVmZXJlbmNlZENvbXAgPT0gbnVsbCApewotCQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXXt1cmksIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfTsKLQkJCQkJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUlTU0lOR19QUk9KRUNUX0ZPUk1PRFVMRV9XQVJOXywgcGFyYW1zKTsKLQkJCQkJCQkKLQkJCQkJCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKHRtcCwgbnVsbCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJdmFsaWRhdGVNb2R1bGVVUklFeHRlbnNpb24obW9kdWxlKTsKLQkJCQkJfQotCQkJCX1maW5hbGx5ewotCQkJCQlpZiggZWRpdCAhPSBudWxsICkKLQkJCQkJCWVkaXQuZGlzcG9zZSgpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1vZHVsZVVSSUV4dGVuc2lvbihNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyBuZXdVcmkgPSBtb2R1bGUuZ2V0VXJpKCk7Ci0JCWlmIChuZXdVcmkgIT0gbnVsbCAmJiBuZXdVcmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAobW9kdWxlIGluc3RhbmNlb2YgRWpiTW9kdWxlICYmICFuZXdVcmkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJhbXNbMF0gPSBtb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJSVJlc291cmNlIHRhcmdldCA9IGVhckhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0RmlsZShBcmNoaXZlQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7Ci0JCQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLklOVkFMSURfVVJJX0ZPUl9NT0RVTEVfRVJST1JfLCBwYXJhbXMpOwotCQkJCWFkZExvY2FsaXplZFdhcm5pbmcodG1wLCB0YXJnZXQpOwotCQkJfSBlbHNlIGlmIChtb2R1bGUgaW5zdGFuY2VvZiBXZWJNb2R1bGUgJiYgIW5ld1VyaS5lbmRzV2l0aCgiLndhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcmFtc1swXSA9IG1vZHVsZS5nZXRVcmkoKTsKLQkJCQlJUmVzb3VyY2UgdGFyZ2V0ID0gZWFySGVscGVyLmdldFByb2plY3QoKS5nZXRGaWxlKEFyY2hpdmVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKLQkJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuSU5WQUxJRF9VUklfRk9SX01PRFVMRV9FUlJPUl8sIHBhcmFtcyk7CQkJCQotCQkJCWFkZExvY2FsaXplZFdhcm5pbmcodG1wLCB0YXJnZXQpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGVhckhlbHBlciAhPSBudWxsKQotCQkJZWFySGVscGVyLmNsb3NlRUFSRmlsZSgpOwotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotCi0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBnZXRNYW5pZmVzdEZpbGUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJVVJJQ29udmVydGVyIGNvbnYgPSBhbkFyY2hpdmUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnYgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHsKLQkJCVdvcmtiZW5jaFVSSUNvbnZlcnRlciB3YkNvbnYgPSAoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252OwotCQkJSUNvbnRhaW5lciBpbnB1dCA9IHdiQ29udi5nZXRJbnB1dENvbnRhaW5lcigpOwotCQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJUHJvamVjdCBwID0gaW5wdXQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHAgPT0gbnVsbCB8fCBKZW1Qcm9qZWN0VXRpbGl0aWVzLmlzQmluYXJ5UHJvamVjdChwKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUlGaWxlIHJlc3VsdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZShwLCBmYWxzZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmV4aXN0cygpKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBuYXR1cmUgaXMgY29uc2lzdGVudCB3aXRoIGRvYyB0eXBlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRG9jVHlwZShFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGVkaXQsSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlKSB7Ci0JCWlmIChlZGl0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlZGl0LmdldEoyRUVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgJiYgYXBwREQuZ2V0VmVyc2lvbklEKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV8yOwotCQkJcGFyYW1zWzFdID0gZ2V0UmVzb3VyY2VOYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMzsKLQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FQVJfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7CQkJCi0JCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKLQkJfSBlbHNlIGlmIChlZGl0LmdldEoyRUVWZXJzaW9uKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcHBERC5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV8zOwotCQkJcGFyYW1zWzFdID0gZ2V0UmVzb3VyY2VOYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMjsKLQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FQVJfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7CQkJCi0JCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGF0IGNvbmZsaWN0aW5nIGphciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZWFyIHByb2plY3QuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVVcmlBbHJlYWR5RXhpc3RzSW5FYXIoRUFSQXJ0aWZhY3RFZGl0IGVkaXQsSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gbW9kdWxlcyA9IGVkaXQuZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoKTsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBtb2R1bGVzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldFJ1bnRpbWVQYXRoKCkgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IGN1cnJlbnRFQVJQcm9qZWN0ID0gZWFySGVscGVyLmdldFByb2plY3QoKTsKLQkJCQl0cnkgewotCQkJCQlJRmlsZSBleEZpbGUgPSBjdXJyZW50RUFSUHJvamVjdC5nZXRGaWxlKG1vZHVsZS5nZXRSb290Rm9sZGVyKCkuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJCWlmIChleEZpbGUgIT0gbnVsbCAmJiBleEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlwYXJhbXNbMF0gPSBtb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCXBhcmFtc1sxXSA9IGN1cnJlbnRFQVJQcm9qZWN0LmdldE5hbWUoKTsKLQkJCQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5VUklfQUxSRUFEWV9FWElTVFNfSU5fRUFSX1dBUk5fLCBwYXJhbXMpOwkJCQkJCQotCQkJCQkJYWRkTG9jYWxpemVkV2FybmluZyh0bXAsIGFwcEREKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGlhZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCVJlc291cmNlIHJlcyA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmKHJlcyAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQkJaWYoZmlsZSAhPSBudWxsKQotCQkJCV9yZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHRoaXMsZmlsZSxncm91cE5hbWUpOwotCQl9Ci0JfQotCQotfS8vIFVJRWFyVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2xpY2Vuc2UvYmVya2VsZXlfbGljZW5zZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9saWNlbnNlL2JlcmtlbGV5X2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyZTY2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2xpY2Vuc2UvYmVya2VsZXlfbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+ICAgICAgICAgICAgICAgICAgICAgICAgCi08dGl0bGU+TGljZW5zZTwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHA+Ci08Yj5Db3B5cmlnaHQgMTk5NC0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsICBSaWdodHMgUmVzZXJ2ZWQuPC9iPgotPC9wPiAgICAgIAotPHA+UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci08L3A+Ci08dWw+Ci08bGk+UmVkaXN0cmlidXRpb24gb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgIAotbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuPGJyPjxicj48L2xpPgotPGxpPlJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKLXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIAotb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi48L2xpPgotPC91bD4KLTxwPk5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBvciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSAKLWJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi1zcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi08L3A+Ci08cD5UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICZxdW90O0FTIElTLCZxdW90OyB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIAotQUxMIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyAKLUFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuICgmcXVvdDtTVU4mcXVvdDspIAotQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgU1VGRkVSRUQgQlkgTElDRU5TRUUgCi1BUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyAKLURFUklWQVRJVkVTLiBJTiBOTyBFVkVOVCBXSUxMIFNVTiBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIAotTE9TVCBSRVZFTlVFLCBQUk9GSVQgT1IgREFUQSwgT1IgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIAotQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRSBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgCi1SRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIAotSU5BQklMSVRZIFRPIFVTRSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIFNVTiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSAKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLTwvcD4KLTxwPllvdSBhY2tub3dsZWRnZSB0aGF0IHRoaXMgc29mdHdhcmUgaXMgbm90IGRlc2lnbmVkLCBsaWNlbnNlZCBvciBpbnRlbmRlZCAKLWZvciB1c2UgaW4gdGhlIGRlc2lnbiwgY29uc3RydWN0aW9uLCBvcGVyYXRpb24gb3IgbWFpbnRlbmFuY2Ugb2YgYW55IG51Y2xlYXIgZmFjaWxpdHkuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkN2JkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lYXJfdmFsaWRhdG9yX1VJXz1FQVIgVmFsaWRhdG9yCi13YXJfdmFsaWRhdG9yX1VJXz1XQVIgVmFsaWRhdG9yCi1hcHBsaWNhdGlvbl9jbGllbnRfdmFsaWRhdG9yX1VJXz1BcHBsaWNhdGlvbiBDbGllbnQgVmFsaWRhdG9yCi12YWxpZGF0aW9uX1VJXz1NaWdyYXRpb24gT2YgVmFsaWRhdGlvbgotX1VJX1BhcmFtVmFsdWVfdHlwZT1QYXJhbToKLUVBUl9WQUxJREFUSU9OX1BST0JMRU1NQVJLRVJfTkFNRT1FQVIgVmFsaWRhdG9yIE1lc3NhZ2UKLUVBUl9GQUNFVF9MQUJFTD1FQVIKLUVBUl9GQUNFVF9ERVNDUklQVElPTj1FbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGFuIEVBUiBtb2R1bGUuCi1FQVJfRkFDRVRfVEVNUExBVEU9RUFSIFByb2plY3QKLVVUSUxJVFlfRkFDRVRfTEFCRUw9VXRpbGl0eSBNb2R1bGUKLVVUSUxJVFlfRkFDRVRfREVTQ1JJUFRJT049RW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSByZWZlcmVuY2VkIGJ5IEphdmEgRUUgbW9kdWxlcy4KLVVUSUxJVFlfRkFDRVRfVEVNUExBVEU9SmF2YSBVdGlsaXR5IFByb2plY3QKLUFQUENMSUVOVF9GQUNFVF9MQUJFTD1BcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlCi1BUFBDTElFTlRfRkFDRVRfREVTQ1JJUFRJT049RW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIEphdmEgRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZS4KLUFQUENMSUVOVF9GQUNFVF9URU1QTEFURT1BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotZGlmZmVyZW50UnVudGltZXNEZXRlY3RlZE1hcmtlck5hbWUgPSBGYWNldGVkIFByb2plY3QgUHJvYmxlbSAoTWlzbWF0Y2hlZCBSdW50aW1lcykKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gSmF2YSBFRSBDb21wb25lbnQKLWNsYXNzcGF0aF9jb21wb25lbnRfZGVwZW5kZW5jeV92YWxpZGF0b3JfVUlfPUNsYXNzcGF0aCBEZXBlbmRlbmN5IFZhbGlkYXRvcgotY2xhc3NwYXRoX2RlcGVuZGVuY3lfdmFsaWRhdG9yX3Byb2JsZW1tYXJrZXJfbmFtZT1DbGFzc3BhdGggRGVwZW5kZW5jeSBWYWxpZGF0b3IgTWVzc2FnZQotZWpiRWRpdG9yQ29udGVudFR5cGU9RUpCIFByb2plY3QgQ29udGVudAotd2ViRWRpdG9yQ29udGVudFR5cGU9V2ViIFByb2plY3QgQ29udGVudAotZWFyRWRpdG9yQ29udGVudFR5cGU9RUFSIHByb2plY3QgQ29udGVudAotYXBwY2xpZW50RWRpdG9yQ29udGVudFR5cGU9QXBwbGljYXRpb24gQ2xpZW50IENvbnRlbnQKLUNvbm5lY3RvckNvbnRlbnRUeXBlPUNvbm5lY3RvciBDb250ZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODg3NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tIEV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBzcGVjaWFsaXplZCBlZGl0IG1vZGVscyB3aXRoIHRoZSBFSkJOYXR1cmUgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBzcGVjaWFsaXplZCBFSkIgY29tbWFuZHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJFSkJDb21tYW5kRXh0ZW5zaW9uIiBuYW1lPSJFSkJDb21tYW5kRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9FSkJDb21tYW5kRXh0ZW5zaW9uLmV4c2QiLz4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIENvZGVnZW4gQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkoyRUVNb2R1bGVQb3N0SW1wb3J0IiBuYW1lPSJKMkVFTW9kdWxlUG9zdEltcG9ydCIgc2NoZW1hPSJzY2hlbWEvSjJFRU1vZHVsZVBvc3RJbXBvcnQuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJFQVJNb2R1bGVFeHRlbnNpb24iIG5hbWU9IkVBUk1vZHVsZUV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvRUFSTW9kdWxlRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRlcGxveWVyRXh0ZW5zaW9uIiBuYW1lPSJKMkVFIERlcGxveWVyIEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvRGVwbG95ZXJFeHRlbnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VFbnZSZWZUeXBlIiBuYW1lPSJSZXNvdXJjZSBFbnZpcm9ubWVudCBSZWZlcmVuY2UgVHlwZSIgc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VFbnZSZWZUeXBlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlUmVmVHlwZSIgbmFtZT0iUmVzb3VyY2UgUmVmZXJlbmNlIFR5cGUiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlUmVmVHlwZS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJXZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yIiBuYW1lPSJXZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yIiBzY2hlbWE9InNjaGVtYS9XZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IldTRExTZXJ2aWNlSGVscGVyIiBuYW1lPSJXU0RMU2VydmljZUhlbHBlciIgc2NoZW1hPSJzY2hlbWEvV1NETFNlcnZpY2VIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib3B0aW9uYWxSZWZhY3RvckhhbmRsZXIiIG5hbWU9Im9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyIiBzY2hlbWE9InNjaGVtYS9vcHRpb25hbFJlZmFjdG9ySGFuZGxlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjbGFzc3BhdGhkZXAiIG5hbWU9ImNsYXNzcGF0aGRlcCIgc2NoZW1hPSJzY2hlbWEvQ2xhc3NwYXRoRGVwLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkoyRUVNb2RlbFByb3ZpZGVyIiBuYW1lPSJKMkVFIE1vZGVsIFByb3ZpZGVyIiBzY2hlbWE9InNjaGVtYS9KMkVFTW9kZWxQcm92aWRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzIiBuYW1lPSJBcmNoaXZlIEV4cG9ydCBQYXJ0aWNpcGFudHMgRXh0ZW5zaW9uIFBvaW50IiBzY2hlbWE9InNjaGVtYS9hcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzLmV4c2QiLz4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gTW9kdWxlIENvcmUgTmF0dXJlICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0gIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJNb2R1bGVDb3JlTmF0dXJlIgotICAgICAgICAgbmFtZT0iTW9kdWxlIENvcmUgUHJvcGVydGllcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4KLSAgICAgIDxydW50aW1lPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+IC0tPgotCi0gCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QuZWFyIgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBhdXRvbG9hZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIvPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxhcnRpZmFjdGVkaXQKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmVhciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0Ij4KLSAgICAgIDwvYXJ0aWZhY3RlZGl0PgotICAgPC9leHRlbnNpb24+IAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCI+Ci0gICAgICA8ZWRpdE1vZGVsCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeSI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIGF1dG9sb2FkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCIvPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxhcnRpZmFjdGVkaXQKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwuQXBwQ2xpZW50QXJ0aWZhY3RFZGl0Ij4KLSAgICAgIDwvYXJ0aWZhY3RlZGl0PgotICAgPC9leHRlbnNpb24+IAotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIExpYkNvcHkgQnVpbGRlciBDb250cmlidXRpb25zICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iTGliQ29weUJ1aWxkZXIiCi0gICAgICAgICBuYW1lPSJMaWJyYXJ5IENvcHlpbmcgQnVpbGRlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5idWlsZGVycyI+Ci0gICAgICA8YnVpbGRlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uTGliQ29weUJ1aWxkZXIiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2J1aWxkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJFYXJWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlZWFyX3ZhbGlkYXRvcl9VSV8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgCQk8YW5kPgotICAgICAgICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3QuZWFyOjEuNF0iLz4KLQkJCTwvYW5kPgotCQk8L2VuYWJsZW1lbnQ+IAotICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyREQiPgotICAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnhtaSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamFyIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iLm1vZHVsZW1hcHMiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxkZXBlbmRlbnRWYWxpZGF0b3IKLSAgICAgICAgICAgICAgIGRlcFZhbFZhbHVlPSJ0cnVlIj4KLSAgICAgICAgIDwvZGVwZW5kZW50VmFsaWRhdG9yPgotICAgICAgICAgPG1hcmtlcklkCi0gICAgICAgICAgICAgICBtYXJrZXJJZFZhbHVlPSJFQVJWYWxpZGF0b3JNYXJrZXIiPgotICAgICAgICAgPC9tYXJrZXJJZD4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJRWFyVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uVUlFYXJIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJFQVJWYWxpZGF0b3JNYXJrZXIiCi0gICAgICAgICBuYW1lPSIlRUFSX1ZBTElEQVRJT05fUFJPQkxFTU1BUktFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3duZXIiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ2YWxpZGF0aW9uU2V2ZXJpdHkiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ0YXJnZXRPYmplY3QiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJncm91cE5hbWUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJtZXNzYWdlSWQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJWNsYXNzcGF0aF9jb21wb25lbnRfZGVwZW5kZW5jeV92YWxpZGF0b3JfVUlfIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgICBmYWNldElkPSJqc3QuamF2YSI+Ci0gICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iLmNsYXNzcGF0aCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ii5jb21wb25lbnQiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZGVwZW5kZW50VmFsaWRhdG9yIGRlcFZhbFZhbHVlPSJ0cnVlIj4KLSAgICAgICAgIDwvZGVwZW5kZW50VmFsaWRhdG9yPgotICAgICAgICAgPG1hcmtlcklkCi0gICAgICAgICAgICAgICBtYXJrZXJJZFZhbHVlPSJDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyIj4KLSAgICAgICAgIDwvbWFya2VySWQ+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXIiCi0gICAgICAgICBuYW1lPSIlY2xhc3NwYXRoX2RlcGVuZGVuY3lfdmFsaWRhdG9yX3Byb2JsZW1tYXJrZXJfbmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmFsaWRhdGlvblNldmVyaXR5Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idGFyZ2V0T2JqZWN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZ3JvdXBOYW1lIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWVzc2FnZUlkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlYXBwbGljYXRpb25fY2xpZW50X3ZhbGlkYXRvcl9VSV8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgIAkJPGFuZD4KLSAgICAgICAgCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LmphdmEiLz4KLQkgIAkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3QuYXBwY2xpZW50OjEuNF0iLz4KLQkJCTwvYW5kPgotCQkgPC9lbmFibGVtZW50PiAKLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ik1BTklGRVNULk1GIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iYXBwbGljYXRpb24tY2xpZW50LnhtbCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxkZXBlbmRlbnRWYWxpZGF0b3IKLSAgICAgICAgICAgICAgIGRlcFZhbFZhbHVlPSJ0cnVlIj4KLSAgICAgICAgIDwvZGVwZW5kZW50VmFsaWRhdG9yPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uVUlBcHBsaWNhdGlvbkNsaWVudEhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLU1vZHVsZU1hcEluaXQtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEoyRUUgRXh0ZW5zaW9uIFBvaW50IFJlZ2lzdHJ5LS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJtb2R1bGVtYXAueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gU2V2ZXJhbCB0aGF0IGhhdmUgbm90IGNoYW5nZWQgYXJlIHN0aWxsIHJlZ2lzdGVyZWQgYXMgIC0tPgotPCEtLSBhIHBsYWNlIGhvbGRlciBmb3IgdGhlIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi5wYWNrYWdlVVJJTWFwIj4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0ibW9kdWxlbWFwLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0ibW9kdWxlbWFwIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5kYWJsZSBPcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGVzZSBvcGVyYXRpb24gYXJlIGV4dGVuZGFibGUgaW4gb3RoZXIgcGx1Z2lucyAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgbmFtZT0iSjJFRSB0b29scyBmdW5jdGlvbiBncm91cCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZnVuY3Rpb25Hcm91cCI+Ci0gICAgICA8ZnVuY3Rpb25Hcm91cAotICAgICAgICAgICAgaW5pdGlhbGl6ZXJDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFR3JvdXBJbml0aWFsaXplciIKLSAgICAgICAgICAgIG5hbWU9IkoyRUUgQ29yZSB0b29scyIKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBwcmlvcml0eT0iMCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJKMkVFIENvcmUgdG9vbHMiPgotICAgICAgPC9mdW5jdGlvbkdyb3VwPgotICAgICAgPGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLioiPgotICAgICAgPC9mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImNvbW1vbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24ucHJvdmlkZXIuQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImNsaWVudC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnByb3ZpZGVyLkNsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0ibW9kdWxlbWFwLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXIubW9kdWxlbWFwLnByb3ZpZGVyLk1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkgCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIAotICAgCi0gICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBQdXJwb3NlOiBEZWZpbmUgdGhlIGRlZmF1bHQgZGVwbG95YWJsZSBwcm9qZWN0IGZhY3RvcnkgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogY29tLmlibS5ldG9vbHMuc2VydmVyLmNvcmUuZGVwbG95YWJsZUZhY3RvcmllcyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVGYWN0b3JpZXMiPgotICAgICAgPG1vZHVsZUZhY3RvcnkKLSAgICAgICAgICAgIHByb2plY3RzPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkoyRUVEZXBsb3lhYmxlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIiPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjEuMiwxLjMsMS40Ij4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjIsMS4zLDEuNCI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMi4yLDIuMywyLjQiPgotICAgICAgICAgPC9tb2R1bGVUeXBlPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjEuMSwyLjAsMi4xIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjAsMS41Ij4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMS4wIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgIDwvbW9kdWxlRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gV1RQIE9wZXJhdGlvbiBleHRlbmRhYmxlIG9wZXJhdGlvbnMJCQkJCQkgICAgICAgIC0tPgotPCEtLSAJCQkJCQkJCQkJCQkJCQkJCSAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8IS0tIEJ1aWxkZXIgUHJvdmlkZXIgcmVnaXN0cmF0aW9ucy0tPgotICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3ZpZGVyIi8+ICAgICAgICAgCi0gICAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFByb2plY3QgRmFjZXRzIC0tPgotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0ianN0LmVhciI+Ci0gICAgICA8bGFiZWw+JUVBUl9GQUNFVF9MQUJFTDwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+JUVBUl9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8aWNvbj5pY29ucy9FQVIuZ2lmPC9pY29uPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIxLjQiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSIxLjIiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImpzdC5qYXZhIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPiAgICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iMS4zIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJqc3QuamF2YSIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgICAKLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSIxLjQiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImpzdC5qYXZhIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPiAgICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgICAKLSAgICA8YWN0aW9uIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSJbMS4yLTEuNF0iIHR5cGU9IklOU1RBTEwiIGlkPSJqc3QuZWFyLmluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iWzEuMi0xLjRdIiB0eXBlPSJQT1NUX0lOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvZXZlbnQtaGFuZGxlcj4gIAotCi0gICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IlsxLjItMS40XSIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFJ1bnRpbWVIYW5kbGVyJFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KLQk8L2V2ZW50LWhhbmRsZXI+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0ianN0LnV0aWxpdHkiPgotICAgICAgPGxhYmVsPiVVVElMSVRZX0ZBQ0VUX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj4lVVRJTElUWV9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaGlkZS52ZXJzaW9uIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC51dGlsaXR5IiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJpbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gdHlwZT0idW5pbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldFVuSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGV2ZW50LWhhbmRsZXIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KLSAgICAgIDwvZXZlbnQtaGFuZGxlcj4KLQk8ZXZlbnQtaGFuZGxlciB0eXBlPSJQT1NUX0lOU1RBTEwiIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSJbMS4yLTEuNF0iPgotCSAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLQk8L2V2ZW50LWhhbmRsZXI+ICAKLQkgICAgICAKLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPiAgICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJqc3QuYXBwY2xpZW50Ij4KLSAgICAgIDxsYWJlbD4lQVBQQ0xJRU5UX0ZBQ0VUX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj4lQVBQQ0xJRU5UX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxpY29uPmljb25zL2Vhci5naWY8L2ljb24+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjEuNCIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IjEuMiI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgICAKLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuYXBwY2xpZW50IiB2ZXJzaW9uPSIxLjMiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+ICAgICAgCi0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iMS40Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IlsxLjMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPiAgICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IjUuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IjYuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgICAgICAgCi0gICAgPGFjdGlvbiB0eXBlPSJpbnN0YWxsIiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iWzEuMi02LjBdIiBpZD0ianN0LmFwcGNsaWVudC5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5BcHBDbGllbnRGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0gICAgPC9hY3Rpb24+Ci0JICAKLSAgICA8ZXZlbnQtaGFuZGxlciB0eXBlPSJQT1NUX0lOU1RBTEwiIGZhY2V0PSJqc3QuYXBwY2xpZW50IiB2ZXJzaW9uPSJbMS4yLTYuMF0iPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkFwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvZXZlbnQtaGFuZGxlcj4KLSAgICAgICAgCi0gICAgPGV2ZW50LWhhbmRsZXIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iWzEuMi02LjBdIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+Ci0gICAgPC9ldmVudC1oYW5kbGVyPgotCQotICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUuanN0LmVhciI+Ci0gICAgICA8bGFiZWw+JUVBUl9GQUNFVF9URU1QTEFURTwvbGFiZWw+Ci0gICAgICA8Zml4ZWQgZmFjZXQ9ImpzdC5lYXIiLz4KLSAgICA8L3RlbXBsYXRlPgotICAgIAotICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUuanN0LnV0aWxpdHkiPgotICAgICAgPGxhYmVsPiVVVElMSVRZX0ZBQ0VUX1RFTVBMQVRFPC9sYWJlbD4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LnV0aWxpdHkiLz4KLSAgICA8L3RlbXBsYXRlPgotCi0gICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5qc3QuYXBwY2xpZW50Ij4KLSAgICAgIDxsYWJlbD4lQVBQQ0xJRU5UX0ZBQ0VUX1RFTVBMQVRFPC9sYWJlbD4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmFwcGNsaWVudCIvPgotICAgIDwvdGVtcGxhdGU+ICAgIAotCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdG9ycyI+Ci0gICAgPHZhbGlkYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFZhbGlkYXRvciIvPgotICA8L2V4dGVuc2lvbj4gICAgCi0KLSAgPGV4dGVuc2lvbiAKLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLSAgICBpZD0iZGlmZmVyZW50UnVudGltZXNEZXRlY3RlZCIKLSAgICBuYW1lPSIlZGlmZmVyZW50UnVudGltZXNEZXRlY3RlZE1hcmtlck5hbWUiPgotICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS52YWxpZGF0aW9uLm1hcmtlciIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlUHJvamVjdCIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZTEiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUyIi8+Ci0gICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25IZWxwZXIiPgotICAgIDx2YWxpZGF0aW9uSGVscGVyCi0gICAgCWlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Qcm9qZWN0VmFsaWRhdGlvbkhlbHBlciIKLSAgICAJaGVscGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uUHJvamVjdFZhbGlkYXRpb25IZWxwZXIiPgotICAgIDwvdmFsaWRhdGlvbkhlbHBlcj4JICAgCi0gPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+Ci0gICAgPGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoSW5pdGlhbGl6ZXIiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlLmNvbnRhaW5lciIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gICA8IS0tCi0JICBPcGVyYXRpb24gZXh0ZW5zaW9uIHRoYXQgdXBkYXRlcyB0aGUgY29udGV4dC1yb290IGVudHJpZXMgaW4gYXBwbGljYXRpb24ueG1sCi0gIC0tPgotICA8ZXh0ZW5zaW9uCi0gICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uIgotICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVDb250ZXh0Um9vdCI+Ci0gICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5TZXJ2ZXJDb250ZXh0Um9vdFVwZGF0ZU9wZXJhdGlvbiIKLSAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNvbXB1dGVFQVJzRm9yQ29udGV4dFJvb3RVcGRhdGVPcCIvPgotICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb24iCi0gICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTW9kdWxlQ29udGV4dFJvb3RJbkVBUk9wIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuY29tcG9uZW50aW1wbCI+Ci0gICAgICA8Y29tcG9uZW50aW1wbAotICAgICAgICAgICAgdHlwZUlEPSJqc3QuZWFyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgIDwvY29tcG9uZW50aW1wbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwiPgotICAgICAgPGNvbXBvbmVudGltcGwKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LnV0aWxpdHkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCI+Ci0gICAgICA8L2NvbXBvbmVudGltcGw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwiPgotICAgICAgPGNvbXBvbmVudGltcGwKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LndlYiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgIDwvY29tcG9uZW50aW1wbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwiPgotICAgICAgPGNvbXBvbmVudGltcGwKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgIDwvY29tcG9uZW50aW1wbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwiPgotICAgICAgPGNvbXBvbmVudGltcGwKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmVqYiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgIDwvY29tcG9uZW50aW1wbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwiPgotICAgICAgPGNvbXBvbmVudGltcGwKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgIDwvY29tcG9uZW50aW1wbD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJlamItamFyLnhtbCIKLSAgICAgICAgICAgIGlkPSJlamJERCIKLSAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVlamJFZGl0b3JDb250ZW50VHlwZSIKLSAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIj4KLSAgICAgICAgIDxkZXNjcmliZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb250ZW50dHlwZS5KMkVFQ29udGVudERlc2NyaWJlciI+Ci0gICAgICAgICA8L2Rlc2NyaWJlcj4KLSAgICAgIDwvY29udGVudC10eXBlPgotICAJPC9leHRlbnNpb24+ICAgCi0gIAkKLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJ3ZWIueG1sIgotICAgICAgICAgICAgaWQ9IndlYkREIgotICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgICAgICAgbmFtZT0iJXdlYkVkaXRvckNvbnRlbnRUeXBlIgotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICAgICAgICAgPGRlc2NyaWJlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbnRlbnR0eXBlLkoyRUVDb250ZW50RGVzY3JpYmVyIj4KLSAgICAgICAgIDwvZGVzY3JpYmVyPgotICAgICAgPC9jb250ZW50LXR5cGU+Ci0gIAk8L2V4dGVuc2lvbj4gICAKLSAgCQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgIGZpbGUtbmFtZXM9ImFwcGxpY2F0aW9uLnhtbCIKLSAgICAgICAgICAgIGlkPSJlYXJERCIKLSAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVlYXJFZGl0b3JDb250ZW50VHlwZSIKLSAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIj4KLSAgICAgICAgIDxkZXNjcmliZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb250ZW50dHlwZS5KMkVFQ29udGVudERlc2NyaWJlciI+Ci0gICAgICAgICA8L2Rlc2NyaWJlcj4KLSAgICAgIDwvY29udGVudC10eXBlPgotICAJPC9leHRlbnNpb24+ICAgCi0gIAkKLSAgCQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgIGZpbGUtbmFtZXM9ImFwcGxpY2F0aW9uLWNsaWVudC54bWwiCi0gICAgICAgICAgICBpZD0iYXBwY2xpZW50REQiCi0gICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBuYW1lPSIlYXBwY2xpZW50RWRpdG9yQ29udGVudFR5cGUiCi0gICAgICAgICAgICBwcmlvcml0eT0iaGlnaCI+Ci0gICAgICAgICA8ZGVzY3JpYmVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29udGVudHR5cGUuSjJFRUNvbnRlbnREZXNjcmliZXIiPgotICAgICAgICAgPC9kZXNjcmliZXI+Ci0gICAgICA8L2NvbnRlbnQtdHlwZT4KLSAgCTwvZXh0ZW5zaW9uPiAgIAotICAJCi0gIAk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJyYS54bWwiCi0gICAgICAgICAgICBpZD0iY29ubmVjdG9yREQiCi0gICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ29ubmVjdG9yQ29udGVudFR5cGUiCi0gICAgICAgICAgICBwcmlvcml0eT0iaGlnaCI+Ci0gICAgICAgICA8ZGVzY3JpYmVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29udGVudHR5cGUuSjJFRUNvbnRlbnREZXNjcmliZXIiPgotICAgICAgICAgPC9kZXNjcmliZXI+Ci0gICAgICA8L2NvbnRlbnQtdHlwZT4KLSAgCTwvZXh0ZW5zaW9uPiAgIAotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwIj4KLSAgCTxmaWx0ZXJlZENsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlLmNvbnRhaW5lciIvPgotICAJPGZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIi8+Ci0gIAk8ZmlsdGVyZWRDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVySUQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5jb250YWluZXIiLz4KLSAgCTxmaWx0ZXJlZENsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJJRD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFTW9kZWxQcm92aWRlciI+Ci0gICAgICAgIDxwcm92aWRlcj4KLSAgICAgICAgCTxtb2RlbFByb3ZpZGVyIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdCIvPgkKLSAgICAgIAkJPGZhY2V0IGlkPSJqc3QuZWFyIiB2ZXJzaW9ucz0iMS4yLDEuMywxLjQiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRU1vZGVsUHJvdmlkZXIiPgotICAgICAgICA8cHJvdmlkZXI+Ci0gICAgICAgIAk8bW9kZWxQcm92aWRlciBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQiLz4JCi0gICAgICAJCTxmYWNldCBpZD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbnM9IjEuMiwxLjMsMS40Ii8+Ci0gICAgICAJPC9wcm92aWRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIgotICAgICAgcHJvcGVydGllcz0icHJvamVjdEZhY2V0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLQk8cHJvcGVydHlUZXN0ZXIKLSAgCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3RlciIKLSAgCQl0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIgotICAJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvdmlkZXIiCi0gIAkJcHJvcGVydGllcz0icHJvamVjdEZhY2V0IgotICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIj4KLQk8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDwhLS0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogV1RQIFVzZXIgTGlicmFyeSBQcm92aWRlciAqCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgLS0+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgotICAgIDxwcm92aWRlciBpZD0id3RwLXVzZXItbGlicmFyeS1wcm92aWRlciIgYWJzdHJhY3Q9InRydWUiIGV4dGVuZHM9InVzZXItbGlicmFyeS1wcm92aWRlciI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8Y29uZmlnIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24iLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvdmlkZXI+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVmZXJlbmNlcy5pbmkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3ByZWZlcmVuY2VzLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZTdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3ByZWZlcmVuY2VzLmluaQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWR5bmFtaWNUcmFuc2xhdGlvbk9mSmV0VGVtcGxhdGVzID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVwYXJlQWxsUElJLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJlcGFyZUFsbFBJSS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDU1MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVwYXJlQWxsUElJLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJCdWlsZCIgZGVmYXVsdD0iQWxsIiBiYXNlZGlyPSIuIj4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy5lamIudWkiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0uZXRvb2xzLmVqYi51aS4uLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS5ldG9vbHMuZWpiLnVpL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4JCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC5lamIudWkiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmVqYi51aS4uLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuZWpiLnVpL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4JCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLnVpIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLnVpLi4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLnVpL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4JCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS4uLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS5ldG9vbHMuajJlZS5jb3JlL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4JCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLnJlZmVyZW5jZS5zbmlwcGV0cyI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS5ldG9vbHMuajJlZS5yZWZlcmVuY2Uuc25pcHBldHMuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUucmVmZXJlbmNlLnNuaXBwZXRzL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUudWkiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0uZXRvb2xzLmoyZWUudWkuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUudWkvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgkJCi08L3RhcmdldD4KLQotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24iPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24vcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotCQkJCQotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci0JCQkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnVpIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnVpLi4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnVpL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZSI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZS4uLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy51aSI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMudWkuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0ud3RwLmFubm90YXRpb25zLnVpL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLQkJCQkJCi08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC5jb21tb24iPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmNvbW1vbi4uLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuY29tbW9uL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmNvbW1vbi5uYXZpZ2F0b3IiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmNvbW1vbi5uYXZpZ2F0b3IuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0ud3RwLmNvbW1vbi5uYXZpZ2F0b3IvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAuY29tbW9uLnVpIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLnd0cC5jb21tb24udWkuLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0ud3RwLmNvbW1vbi51aS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC5lamIiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmVqYi4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC5lamIvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAuZW1mIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLnd0cC5lbWYuLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuZW1mL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2giPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuZW1mLndvcmtiZW5jaC9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC5lbWYud29ya2JlbmNoLmVkaXQiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guZWRpdC4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC5lbWYud29ya2JlbmNoLmVkaXQvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAuajJlZSI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAuajJlZS4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC5qMmVlL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmoyZWUudWkiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLmoyZWUudWkuLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS53dHAuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmpjYSI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAuamNhLi4iLz4KLQkJCQk8YW50IGFudGZpbGU9Ii4uL2NvbS5pYm0ud3RwLmpjYS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLnd0cC53ZWIiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0ud3RwLndlYi4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC53ZWIvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAud2Vic2VydmljZSI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAud2Vic2VydmljZS4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLnByb2plY3QuaW50ZXJjaGFuZ2UiPgotCQkJCTxlY2hvIG1lc3NhZ2U9ImNvbS5pYm0uZXRvb2xzLnByb2plY3QuaW50ZXJjaGFuZ2UuLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS5ldG9vbHMucHJvamVjdC5pbnRlcmNoYW5nZS9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJjb20uaWJtLmV0b29scy5lamIuc2FtcGxlcyI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS5ldG9vbHMuZWpiLnNhbXBsZXMuLiIvPgotCQkJCTxhbnQgYW50ZmlsZT0iLi4vY29tLmlibS5ldG9vbHMuZWpiLnNhbXBsZXMvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iY29tLmlibS53dHAuYWN0aXZpdGllcyI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0iY29tLmlibS53dHAuYWN0aXZpdGllcy4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC5hY3Rpdml0aWVzL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yIj4KLQkJCQk8ZWNobyBtZXNzYWdlPSJjb20uaWJtLnd0cC5qMmVlLnVpLm5hdmlnYXRvci4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9jb20uaWJtLnd0cC5qMmVlLnVpLm5hdmlnYXRvci9wcmVwYXJlZm9ycGlpLnhtbCIgdGFyZ2V0PSJtYWluIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IiPgotCQkJCTxlY2hvIG1lc3NhZ2U9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9vcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IvcHJlcGFyZWZvcnBpaS54bWwiIHRhcmdldD0ibWFpbiIvPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRvciI+Ci0JCQkJPGVjaG8gbWVzc2FnZT0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRvci4uIi8+Ci0JCQkJPGFudCBhbnRmaWxlPSIuLi9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmF2aWdhdG9yL3ByZXBhcmVmb3JwaWkueG1sIiB0YXJnZXQ9Im1haW4iLz4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9IkFsbCI+Ci0JCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLmV0b29scy5lamIudWkiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLmVqYi51aSIvPgotCSAJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2gudWkiLz4KLQkgCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUiLz4KLQkgCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLmV0b29scy5qMmVlLnJlZmVyZW5jZS5zbmlwcGV0cyIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMuajJlZS51aSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbiIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi51aSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29udHJvbGxlciIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMudWkiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLmNvbW1vbiIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuZWpiIi8+Ci0JCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLnd0cC5lbWYiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2giLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guZWRpdCIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuajJlZSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuajJlZS51aSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuamNhIi8+Ci0JCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLnd0cC53ZWIiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLndlYnNlcnZpY2UiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbS5pYm0ud3RwLmNvbW1vbi51aSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuY29tbW9uLm5hdmlnYXRvciIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMucHJvamVjdC5pbnRlcmNoYW5nZSIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMuZWpiLnNhbXBsZXMiLz4JCi0JCQkJPGFudGNhbGwgdGFyZ2V0PSJjb20uaWJtLnd0cC5hY3Rpdml0aWVzIi8+CQotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlIi8+CQotCQkJCTxhbnRjYWxsIHRhcmdldD0iY29tLmlibS53dHAuajJlZS51aS5uYXZpZ2F0b3IiLz4KLQkJCQk8YW50Y2FsbCB0YXJnZXQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvciIvPgotCQkJCTxhbnRjYWxsIHRhcmdldD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRvciIvPgkJCQkJCQkJCQotPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MWYzZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBjbGllbnRhcmNoaXZlb3BzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2FwcGNsaWVudGFyY2hpdmVvcHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMTQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2FwcGNsaWVudGFyY2hpdmVvcHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIHN0cmluZyBmb3IgQXJjaGl2ZSBvcGVyYXRpb25zIG9mIEFwcGxpY2F0aW9uIENsaWVudHMuCi0KLUFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVGaWxlPUVycm9yIG9jY3VycmVkIHNhdmluZyB0aGUgZmlsZS4uCi1BUkNISVZFX09QRVJBVElPTl9Qcm9qZWN0TmF0dXJlPUVycm9yIGdldHRpbmcgcHJvamVjdCBuYXR1cmUgcnVudGltZS4uCi1BUkNISVZFX09QRVJBVElPTl9TYXZlTWFuaWZlc3Q9RXJyb3Igb2NjdXJyZWQgc2F2aW5nIHRoZSBtYW5pZmVzdC4uCi1BUkNISVZFX09QRVJBVElPTl9GaWxlTm90Rm91bmQ9RXJyb3I6IEZpbGUgbm90IGZvdW5kLi4KLUFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlPUVycm9yIG9wZW5pbmcgYXJjaGl2ZSBmb3IgZXhwb3J0Li4KLUFSQ0hJVkVfT1BFUkFUSU9OX0ltcG9ydE9wZXJhdGlvbj1JbXBvcnQgT3BlcmF0aW9uIEZhaWxlZCEKLUlNUE9SVF9NT0ZSRVNPVVJDRV9TVFJJTkc9SW1wb3J0aW5nIG1ldGEtZGF0YS4uCi1BUFBDTElFTlRfSU1QT1JUX09QRVJBVElPTl9TVFJJTkc9SW1wb3J0aW5nIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIuLgotQVBQQ0xJRU5UX0lNUE9SVF9GSUxFX1NUUklORz1JbXBvcnRpbmcgZmlsZS4uCi1BUFBDTElFTlRfSU1QT1JUX0VSUk9SPUVycm9yIGltcG9ydGluZyBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZS4uCi1BUkNISVZFX09QRVJBVElPTl9FcnJvck9jY3VyZWQ9RXJyb3Igb2NjdXJyZWQgZ2V0dGluZyBtb2R1bGUgZm9sZGVyIG5hbWUuLgotQXBwbGljYXRpb25fQ2xpZW50X0ZpbGVfVUlfPUFwcGxpY2F0aW9uIENsaWVudCBGaWxlCi1fY19fQ29weXJpZ2h0X0lCTV9Db3Jwb3JhdGlvbl8yMDAxXzE9KGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBjbGllbnRjcmVhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBjbGllbnRjcmVhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJkMmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvYXBwY2xpZW50Y3JlYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXJyb3Jfb2NjdXJlZF9nZXR0aW5nX2FwcGxfRVJST1JfPUlXQUUwMDAxRSBFcnJvciBvY2N1cnJlZCBnZXR0aW5nIGFwcGxpY2F0aW9uLnhtbDoKLUNyZWF0aW5nX0FwcGxpY2F0aW9uX0NsaWVuX1VJXz1DcmVhdGluZyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdC4uLgotRXJyb3Jfb2NjdXJlZF9sb2FkaW5nX2FwcGxfVUlfPUVycm9yIG9jY3VyZWQgbG9hZGluZyBhcHBsaWNhdGlvbi1jbGllbnQueG1sOgotTm90X2FuX0FwcGxpY2F0aW9uX0NsaWVudF9wcm9qZWN0X0VSUk9SXz1JV0FFMDAwMkUgTm90IGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNWM4OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZHMgYWxsIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0Ci0jCi0jIDpCZWdpbjogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6QmVnaW46Ci0jQ09NUE9ORU5UUFJFRklYIENIS0oKLSNDT01QT05FTlROQU1FRk9SIENIS0ogSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uCi0jQ01WQ1BBVEhOQU1FIG5jZi9zcmMvamF2YS9jb20vaWJtL3dlYnNwaGVyZS92YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLQotCi1FUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFPUNIS0oxMDAwRTogVmFsaWRhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUgaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDFFOiBWYWxpZGF0aW9uIGZhaWxlZDoKLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUpCX1JFRlM9Q0hLSjEwMDJFOiBVbnJlc29sdmFibGUgRUpCIHJlZmVyZW5jZXMgaW4gezB9OwotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1JTlZBTElEX0REPUNIS0oxMDAzRTogVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGhhcyBhbiBpbnZhbGlkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkk9Q0hLSjEwMDRFOiBUaGUgVVJJLCB7MH0sIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDVFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gYW4gdW5rbm93biBzeW50YXggZXJyb3IuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaGVscCBpZGVudGlmeSB0aGUgYmFkIHNlY3Rpb24uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYW5ub3QgYmUgb3BlbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXz1JV0FFMDAwMkUgRHVwbGljYXRlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSAiezB9IiBpbiBhcHBsaWNhdGlvbi1jbGllbnQueG1sLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwMDNFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgYXBwbGljYXRpb24tY2xpZW50LnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl89SVdBRTAwMDRFIER1cGxpY2F0ZSBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlICJ7MH0iIGluIGFwcGxpY2F0aW9uLWNsaWVudC54bWwuCi1BUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl89SVdBRTAwMzVFIFRoZSBNYWluLUNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2FwcGxpY2F0aW9ucHJvdmlkZXJzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2FwcGxpY2F0aW9ucHJvdmlkZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjZhZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9hcHBsaWNhdGlvbnByb3ZpZGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWxsQXV0aGVudGljYXRlZFVzZXJzX1VJXz1BbGxBdXRoZW50aWNhdGVkVXNlcnMKLUFwcE5hbWVfVUlfPUFwcE5hbWUKLVRoZV9hcHBOYW1lX3Byb3BlcnR5X1VJXz1UaGUgYXBwTmFtZSBwcm9wZXJ0eQotQXBwbGljYXRpb25fVUlfPUFwcGxpY2F0aW9uCi1UaGVfYXBwbGljYXRpb25fcHJvcGVydHlfVUlfPVRoZSBhcHBsaWNhdGlvbiBwcm9wZXJ0eQotQXV0aG9yaXphdGlvblRhYmxlX1VJXz1BdXRob3JpemF0aW9uVGFibGUKLVRoZV9hdXRob3JpemF0aW9uVGFibGVfcHJvcGVydHlfVUlfPVRoZSBhdXRob3JpemF0aW9uVGFibGUgcHJvcGVydHkKLVJ1bkFzTWFwX1VJXz1SdW5Bc01hcAotVGhlX3J1bkFzTWFwX3Byb3BlcnR5X1VJXz1UaGUgcnVuQXNNYXAgcHJvcGVydHkKLUFwcGxpY2F0aW9uQmluZGluZ19VSV89QXBwbGljYXRpb25CaW5kaW5nCi1GYWlsZWRfdG9fbG9hZF9pbWFnZV9mb3JfRVJST1JfPUlXQUUwMDAxRSBGYWlsZWQgdG8gbG9hZCBpbWFnZSBmb3IKLUNyZWF0ZV9DaGlsZF9VSV89Q3JlYXRlIENoaWxkCi1DcmVhdGVfYV9uZXdfY2hpbGRfZm9yX3RoZV9zZWxlY3RlZF9VSV89Q3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQKLUNyZWF0ZV9Sb2xlQXNzaWdubWVudF9VSV89Q3JlYXRlIFJvbGVBc3NpZ25tZW50Ci1DcmVhdGVfYV9jaGlsZF9vZl90eXBlX1JvbGVBc3NpZ25tZW50X2Zvcl90aGVfc2VsZWN0ZWRfVUlfPUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgUm9sZUFzc2lnbm1lbnQgZm9yIHRoZSBzZWxlY3RlZAotRXZlcnlvbmVfVUlfPUV2ZXJ5b25lCi1DcmVhdGVfVXNlcl9VSV89Q3JlYXRlIFVzZXIKLUNyZWF0ZV9hX2NoaWxkX29mX3R5cGVfVXNlcl9mb3JfdGhlX3NlbGVjdGVkX1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFVzZXIgZm9yIHRoZSBzZWxlY3RlZAotUm9sZV9VSV89Um9sZQotVGhlX3JvbGVfcHJvcGVydHlfVUlfPVRoZSByb2xlIHByb3BlcnR5Ci1Sb2xlQXNzaWdubWVudF9VSV89Um9sZUFzc2lnbm1lbnQKLUNyZWF0ZV9hX25ld19jaGlsZF9vZl90eXBlX2Zvcl90aGVfc2VsZWN0ZWRfVUlfPUNyZWF0ZSBhIGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQKLUF1dGhEYXRhX1VJXz1BdXRoRGF0YQotVGhlX2F1dGhEYXRhX3Byb3BlcnR5X1VJXz1UaGUgYXV0aERhdGEgcHJvcGVydHkKLVNlY3VyaXR5Um9sZV9VSV89U2VjdXJpdHlSb2xlCi1UaGVfc2VjdXJpdHlSb2xlX3Byb3BlcnR5X1VJXz1UaGUgc2VjdXJpdHlSb2xlIHByb3BlcnR5Ci1SdW5Bc0JpbmRpbmdfVUlfPVJ1bkFzQmluZGluZwotQ3JlYXRlX1J1bkFzQmluZGluZ19VSV89Q3JlYXRlIFJ1bkFzQmluZGluZwotQ3JlYXRlX2FfY2hpbGRfb2ZfdHlwZV9SdW5Bc0JpbmRpbmdfZm9yX3RoZV9zZWxlY3RlZF9VSV89Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBSdW5Bc0JpbmRpbmcgZm9yIHRoZSBzZWxlY3RlZAotU3BlY2lhbFN1YmplY3RfVUlfPVNwZWNpYWxTdWJqZWN0Ci1OYW1lX1VJXz1OYW1lCi1UaGVfbmFtZV9wcm9wZXJ0eV9VSV89VGhlIG5hbWUgcHJvcGVydHkKLUFjY2Vzc0lkX1VJXz1BY2Nlc3NJZAotVGhlX2FjY2Vzc0lkX3Byb3BlcnR5X1VJXz1UaGUgYWNjZXNzSWQgcHJvcGVydHkKLVN1YmplY3RfVUlfPVN1YmplY3QKLUNyZWF0ZV9XZWJNb2R1bGVFeHRlbnNpb25fVUlfPUNyZWF0ZSBXZWJNb2R1bGVFeHRlbnNpb24KLUNyZWF0ZV9hX2NoaWxkX29mX3R5cGVfV2ViTW9kdWxlRXh0ZW5zaW9uX2Zvcl90aGVfc2VsZWN0ZWRfVUlfPUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgV2ViTW9kdWxlRXh0ZW5zaW9uIGZvciB0aGUgc2VsZWN0ZWQKLVJlbG9hZEludGVydmFsX1VJXz1SZWxvYWRJbnRlcnZhbAotVGhlX3JlbG9hZEludGVydmFsX3Byb3BlcnR5X1VJXz1UaGUgcmVsb2FkSW50ZXJ2YWwgcHJvcGVydHkKLUFwcGxpY2F0aW9uRXh0ZW5zaW9uX1VJXz1BcHBsaWNhdGlvbkV4dGVuc2lvbgotRUpCX01vZHVsZV9FeHRlbnNpb25fVUlfPUVKQiBNb2R1bGUgRXh0ZW5zaW9uCi1DbGllbnRfTW9kdWxlX0V4dGVuc2lvbl9VSV89Q2xpZW50IE1vZHVsZSBFeHRlbnNpb24KLUFsdEJpbmRpbmdzX1VJXz1BbHRCaW5kaW5ncwotVGhlX2FsdEJpbmRpbmdzX3Byb3BlcnR5X1VJXz1UaGUgYWx0QmluZGluZ3MgcHJvcGVydHkKLUFsdEV4dGVuc2lvbnNfVUlfPUFsdEV4dGVuc2lvbnMKLVRoZV9hbHRFeHRlbnNpb25zX3Byb3BlcnR5X1VJXz1UaGUgYWx0RXh0ZW5zaW9ucyBwcm9wZXJ0eQotRGVwZW5kZW50Q2xhc3NwYXRoX1VJXz1EZXBlbmRlbnRDbGFzc3BhdGgKLVRoZV9kZXBlbmRlbnRDbGFzc3BhdGhfcHJvcGVydHlfVUlfPVRoZSBkZXBlbmRlbnRDbGFzc3BhdGggcHJvcGVydHkKLUFic29sdXRlUGF0aF9VSV89QWJzb2x1dGVQYXRoCi1UaGVfYWJzb2x1dGVQYXRoX3Byb3BlcnR5X1VJXz1UaGUgYWJzb2x1dGVQYXRoIHByb3BlcnR5Ci1BcHBsaWNhdGlvbkV4dGVuc2lvbl8xX1VJXz1BcHBsaWNhdGlvbkV4dGVuc2lvbgotVGhlX2FwcGxpY2F0aW9uRXh0ZW5zaW9uX3Byb3BlcnR5X1VJXz1UaGUgYXBwbGljYXRpb25FeHRlbnNpb24gcHJvcGVydHkKLU1vZHVsZV9VSV89TW9kdWxlCi1UaGVfbW9kdWxlX3Byb3BlcnR5X1VJXz1UaGUgbW9kdWxlIHByb3BlcnR5Ci08PFVucmVzb2x2YWJsZV9FUlJPUl89SVdBRTAwMDJFIDw8VW5yZXNvbHZhYmxlCi1DcmVhdGVfTW9kdWxlX1VJXz1DcmVhdGUgTW9kdWxlCi1DcmVhdGVfYV9jaGlsZF9vZl90eXBlX01vZHVsZV9mb3JfdGhlX3NlbGVjdGVkX1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIE1vZHVsZSBmb3IgdGhlIHNlbGVjdGVkCi1TbWFsbEljb25fVUlfPVNtYWxsSWNvbgotVGhlX3NtYWxsSWNvbl9wcm9wZXJ0eV9VSV89VGhlIHNtYWxsSWNvbiBwcm9wZXJ0eQotTGFyZ2VJY29uX1VJXz1MYXJnZUljb24KLVRoZV9sYXJnZUljb25fcHJvcGVydHlfVUlfPVRoZSBsYXJnZUljb24gcHJvcGVydHkKLURlc2NyaXB0aW9uX1VJXz1EZXNjcmlwdGlvbgotVGhlX2Rlc2NyaXB0aW9uX3Byb3BlcnR5X1VJXz1UaGUgZGVzY3JpcHRpb24gcHJvcGVydHkKLURpc3BsYXlOYW1lX1VJXz1EaXNwbGF5TmFtZQotVGhlX2Rpc3BsYXlOYW1lX3Byb3BlcnR5X1VJXz1UaGUgZGlzcGxheU5hbWUgcHJvcGVydHkKLTw8Tm9fZGlzcGxheV9uYW1lPj5fRVJST1JfPUlXQUUwMDAzRSA8PE5vIGRpc3BsYXkgbmFtZT4+Ci1VcmlfVUlfPVVyaQotVGhlX3VyaV9wcm9wZXJ0eV9VSV89VGhlIFVSSSBwcm9wZXJ0eQotQWx0RERfVUlfPUFsdERECi1UaGVfYWx0RERfcHJvcGVydHlfVUlfPVRoZSBhbHRERCBwcm9wZXJ0eQotPDxVUklfbm90X3NldD4+X0VSUk9SXz1JV0FFMDAwNEUgPDxVUkkgbm90IHNldD4+Ci1Db250ZXh0Um9vdF9VSV89Q29udGV4dFJvb3QKLVRoZV9jb250ZXh0Um9vdF9wcm9wZXJ0eV9VSV89VGhlIGNvbnRleHRSb290IHByb3BlcnR5Ci1DcmVhdGVfYV9jaGlsZF9mb3JfdGhlX3NlbGVjdGVkX1VJXz1DcmVhdGUgYSBjaGlsZCBmb3IgdGhlIHNlbGVjdGVkCi1Nb2R1bGVfRXh0ZW5zaW9uX1VJXz1Nb2R1bGUgRXh0ZW5zaW9uCi1XZWJfTW9kdWxlX0V4dGVuc2lvbl9VSV89V2ViIE1vZHVsZSBFeHRlbnNpb24KLUVBUlByb2plY3RNYXBfVUlfPUVBUlByb2plY3RNYXAKLVByb2plY3RfTmFtZV9VSV89UHJvamVjdCBOYW1lCi1UaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV9tb2R1bGVfbWFwcGluZ19VSV89VGhlIHByb2plY3QgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgbW9kdWxlIG1hcHBpbmcKLVRoZV9tb2R1bGVfb2ZfdGhlX21vZHVsZV9tYXBwaW5nX1VJXz1UaGUgbW9kdWxlIG9mIHRoZSBtb2R1bGUgbWFwcGluZwotTW9kdWxlTWFwcGluZ19VSV89TW9kdWxlTWFwcGluZwotUHJvamVjdF9OYW1lXzE9UHJvamVjdCBOYW1lCi1UaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXz1UaGUgcHJvamVjdCBuYW1lIHByb3BlcnR5IG9mIHRoZSB1dGlsaXR5IEpBUiBtYXBwaW5nCi1UaGVfdXJpX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXz1UaGUgdXJpIHByb3BlcnR5IG9mIHRoZSB1dGlsaXR5IEpBUiBtYXBwaW5nCi1fVUlfSmF2YUNsaWVudE1vZHVsZV90eXBlPUphdmFDbGllbnQKLV9VSV9FamJNb2R1bGVfdHlwZT1FSkIKLV9VSV9XZWJNb2R1bGVfdHlwZT1XZWIKLV9VSV9Db25uZWN0b3JNb2R1bGVfdHlwZT1Db25uZWN0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvYmFzZWNvZGVnZW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvYmFzZWNvZGVnZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMjQ1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2Jhc2Vjb2RlZ2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Ob19hbmFseXNpc19yZWFzb25fcHJvdmlkZV9JTkZPXz1JV0FFMDAwMUkgTm8gYW5hbHlzaXMgcmVhc29uIGlzIHByb3ZpZGVkIGZvciB0aGUgcmVzdWx0LCBmcm9tIFwiezB9XCIgdG8gXCJ7MX1cIi4KLV9taXNzaW5nXz08bWlzc2luZz4KLUFuYWx5c2lzX3N0YXR1c19vdXRfb2ZfcmFuX0VYQ189SVdBRTAwMDJFIEFuYWx5c2lzIHN0YXR1cyBvdXQgb2YgcmFuZ2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2NsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZjMWRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgQkVBIFN5c3RlbXMsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUR1cGxpY2F0ZUNsYXNzRm9sZGVyRW50cnk9SW52YWxpZCBjbGFzc3BhdGggcHVibGlzaC9leHBvcnQgZGVwZW5kZW5jeSB7MH0uIFRoaXMgY2xhc3MgZm9sZGVyIGlzIGFscmVhZHkgZXhwb3NlZCB2aWEgdGhlIGNvbXBvbmVudCBmaWxlLiAKLU5vbldlYk5vbkV4cG9ydGVkPUNsYXNzcGF0aCBlbnRyeSB7MH0gaXMgbWFya2VkIGZvciBwdWJsaXNoL2V4cG9ydCBidXQgaXMgbm90IGV4cG9ydGVkIG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gQ2xhc3NwYXRoIHZpc2liaWxpdHkgd2l0aGluIEVjbGlwc2UgYW5kIGF0IHJ1bnRpbWUgd2lsbCBkaWZmZXIuCi1EdXBsaWNhdGVBcmNoaXZlTmFtZT1JbnZhbGlkIGNsYXNzcGF0aCBwdWJsaXNoL2V4cG9ydCBkZXBlbmRlbmN5IHswfS4gVGhlIHByb2plY3QgY29udGFpbnMgYW5vdGhlciBkZXBlbmRlbmN5IHdpdGggdGhlIHNhbWUgYXJjaGl2ZSBuYW1lLgotUm9vdE1hcHBpbmdOb25FQVJXQVJSZWY9UHJvamVjdHMgbXVzdCBiZSByZWZlcmVuY2VkIGJ5IGFuIEVBUiBvciBhIFdBUiB0byB1c2UgY2xhc3NwYXRoIHB1Ymxpc2gvZXhwb3J0IGRlcGVuZGVuY2llcyB3aG9zZSBydW50aW1lIHBhdGggKC4uLykgbWFwcyBpbnRvIHRoZSBwYXJlbnQgY29tcG9uZW50LgotQXBwQ2xpZW50UHJvamVjdD1DbGFzc3BhdGggcHVibGlzaC9leHBvcnQgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdHMuCi1Qcm9qZWN0Q2xhc3NwYXRoRW50cnk9SW52YWxpZCBjbGFzc3BhdGggcHVibGlzaC9leHBvcnQgZGVwZW5kZW5jeSB7MH0uIFByb2plY3QgZW50cmllcyBub3Qgc3VwcG9ydGVkLgotU291cmNlRW50cnk9SW52YWxpZCBjbGFzc3BhdCBwdWJsaXNoL2V4cG9ydCBkZXBlbmRlbmN5IHswfS4gU291cmNlIGVudHJpZXMgbm90IHN1cHBvcnRlZC4KLUZpbHRlcmVkQ29udGFpbmVyPUludmFsaWQgY2xhc3NwYXRoIHB1Ymxpc2gvZXhwb3J0IGRlcGVuZGVuY3kgezB9LiBUaGUgYXNzb2NpYXRlZCBjbGFzc3BhdGggY29udGFpbmVyIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGVkL2V4cG9ydGVkIG1vZHVsZS4KLU5vblRhZ2dlZEV4cG9ydGVkQ2xhc3Nlcz1DbGFzc3BhdGggZW50cnkgezB9IHdpbGwgbm90IGJlIGV4cG9ydGVkIG9yIHB1Ymxpc2hlZC4gUnVudGltZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9ucyBtYXkgcmVzdWx0LiAgCi1JbnZhbGlkTm9uV2ViUnVudGltZVBhdGg9SW52YWxpZCBydW50aW1lIHBhdGggezF9IGZvciBjbGFzc3BhdGggcHVibGlzaC9leHBvcnQgZGVwZW5kZW5jeSB7MH0uIE9ubHkgdGhlIHBhcmVudCBvciBtb2R1bGUgcm9vdCBwYXRocyBjYW4gYmUgdXNlZCBpbiBub24td2ViIHByb2plY3RzLgotSW52YWxpZFdlYlJ1bnRpbWVQYXRoPUludmFsaWQgcnVudGltZSBwYXRoIHsxfSBmb3IgY2xhc3NwYXRoIHB1Ymxpc2gvZXhwb3J0IGRlcGVuZGVuY3kgezB9LiBSdW50aW1lIHBhdGggbXVzdCBiZSByb290LCBXRUItSU5GL2xpYiBvciBXRUItSU5GL2NsYXNzZXMgZm9yIHdlYiBwcm9qZWN0cy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvY29tbW9uZWRpdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9jb21tb25lZGl0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2JiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9jb21tb25lZGl0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DcmVhdGVfVHdvX0NoaWxkcmVuX1VJXz1DcmVhdGUgVHdvIENoaWxkcmVuCi1DcmVhdGVfQ2hpbGRfVUlfPUNyZWF0ZSBDaGlsZAotTmFtZV9VSV89TmFtZQotVGhlX25hbWVfcHJvcGVydHlfVUlfPVRoZSBuYW1lIHByb3BlcnR5Ci1UeXBlX1VJXz1UeXBlCi1UaGVfdHlwZV9wcm9wZXJ0eV9VSV89VGhlIHR5cGUgcHJvcGVydHkKLUhvbWVfVUlfPUhvbWUKLVRoZV9ob21lX3Byb3BlcnR5X1VJXz1UaGUgaG9tZSBwcm9wZXJ0eQotUmVtb3RlX1VJXz1SZW1vdGUKLVRoZV9yZW1vdGVfcHJvcGVydHlfVUlfPVRoZSByZW1vdGUgcHJvcGVydHkKLV9VSV9FSkJMb2NhbFJlZl9sb2NhbEhvbWVfZmVhdHVyZV9kZXNjPVRoZSBsb2NhbCBob21lIHByb3BlcnR5Ci1fVUlfRUpCTG9jYWxSZWZfbG9jYWxfZmVhdHVyZV9kZXNjPVRoZSBsb2NhbCBwcm9wZXJ0eQotTGlua19VSV89TGluawotVGhlX2xpbmtfcHJvcGVydHlfVUlfPVRoZSBsaW5rIHByb3BlcnR5Ci1EZXNjcmlwdGlvbl9VSV89RGVzY3JpcHRpb24KLVRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV89VGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5Ci1DbGllbnRfVUlfPUNsaWVudAotVGhlX2NsaWVudF9wcm9wZXJ0eV9VSV89VGhlIGNsaWVudCBwcm9wZXJ0eQotV2ViQXBwX1VJXz1XZWJBcHAKLVRoZV93ZWJBcHBfcHJvcGVydHlfVUlfPVRoZSB3ZWJBcHAgcHJvcGVydHkKLUVqYl9VSV89RWpiCi1UaGVfZWpiX3Byb3BlcnR5X1VJXz1UaGUgRUpCIHByb3BlcnR5Ci1WYWx1ZV9VSV89VmFsdWUKLVRoZV92YWx1ZV9wcm9wZXJ0eV9VSV89VGhlIHZhbHVlIHByb3BlcnR5Ci1BdXRoX1VJXz1BdXRoCi1UaGVfYXV0aF9wcm9wZXJ0eV9VSV89VGhlIGF1dGggcHJvcGVydHkKLVJvbGVOYW1lX1VJXz1Sb2xlTmFtZQotVGhlX3JvbGVOYW1lX3Byb3BlcnR5X1VJXz1UaGUgcm9sZU5hbWUgcHJvcGVydHkKLUFwcGxpY2F0aW9uX1VJXz1BcHBsaWNhdGlvbgotVGhlX2FwcGxpY2F0aW9uX3Byb3BlcnR5X1VJXz1UaGUgYXBwbGljYXRpb24gcHJvcGVydHkKLVNlcnZsZXRfVUlfPVNlcnZsZXQKLVRoZV9zZXJ2bGV0X3Byb3BlcnR5X1VJXz1UaGUgc2VydmxldCBwcm9wZXJ0eQotRUpCX1JlZmVyZW5jZV9VSV89RUpCIFJlZmVyZW5jZQotX1VJX0VKQkxvY2FsUmVmX3R5cGU9RUpCIExvY2FsIFJlZmVyZW5jZQotTmV3X1VJXz1BZGQKLURlbGV0ZV9VSV89UmVtb3ZlCi1EZWxldGVfRUpCX3JlZmVyZW5jZXNfVUlfPURlbGV0ZSBFSkIgcmVmZXJlbmNlcwotVmFyaWFibGVfVUlfPVZhcmlhYmxlCi1EZWxldGVfZW52aXJvbm1lbnRfZW50cmllc19VSV89RGVsZXRlIGVudmlyb25tZW50IGVudHJpZXMKLShOZXdfVmFyaWFibGUpX1VJXz0oTmV3IFZhcmlhYmxlKQotTmV3X2Vudmlyb25tZW50X2VudHJ5X1VJXz1OZXcgZW52aXJvbm1lbnQgZW50cnkKLURlbGV0ZV9yZXNvdXJjZV9yZWZlcmVuY2VzX1VJXz1EZWxldGUgcmVzb3VyY2UgcmVmZXJlbmNlcwotUmVmZXJlbmNlX05hbWVfVUlfPVJlZmVyZW5jZSBOYW1lCi1BdXRoZW50aWNhdGlvbl9VSV89QXV0aGVudGljYXRpb24KLShOZXdfUmVzb3VyY2VSZWYpX1VJXz0oTmV3IFJlc291cmNlUmVmKQotTmV3X3Jlc291cmNlX3JlZmVyZW5jZV9VSV89TmV3IHJlc291cmNlIHJlZmVyZW5jZQotU2VjdXJpdHlfUm9sZXNfVUlfPVNlY3VyaXR5IFJvbGVzCi0oTmV3X1NlY3VyaXR5X1JvbGUpX1VJXz0oTmV3IFNlY3VyaXR5IFJvbGUpCi1OZXdfc2VjdXJpdHlfcm9sZV9VSV89TmV3IHNlY3VyaXR5IHJvbGUKLURlbGV0ZV9zZWN1cml0eV9yb2xlc19VSV89RGVsZXRlIHNlY3VyaXR5IHJvbGVzCi1CYWRfcGFyZW50X0VSUk9SXz1JV0FFMDAwMUUgQmFkIHBhcmVudAotQ2hvb3NlX0ljb25zX1VJXz1DaG9vc2UgSWNvbnMKLVByZXZpZXdfVUlfPVByZXZpZXcKLUJyb3dzZS4uLl9VSV89QnJvd3NlLi4uCi1SZXNvdXJjZV9tdXN0X2V4aXN0Ll9FUlJPUl89SVdBRTAwMDJFIFJlc291cmNlIG11c3QgZXhpc3QuCi1SZXNvdXJjZV9tdXN0X2JlX2FjY2Vzc2libF9FUlJPUl89SVdBRTAwMDNFIFJlc291cmNlIG11c3QgYmUgYWNjZXNzaWJsZS4KLVdoYXRfcmVzb3VyY2VzX2RvX3lvdV93YW50X1VJXz1XaGF0IHJlc291cmNlcyBkbyB5b3Ugd2FudCB0byBleHBvcnQ/Ci1XaGVyZV9kb195b3Vfd2FudF90b19leHBvcl9VSV89V2hlcmUgZG8geW91IHdhbnQgdG8gZXhwb3J0IHJlc291cmNlcyB0bz8KLU9wdGlvbnNfX1VJXz1PcHRpb25zOgotRXhwb3J0X3NvdXJjZV9maWxlc19VSV89RXhwb3J0IHNvdXJjZSBmaWxlcwotQ3JlYXRlX2RpcmVjdG9yeV9zdHJ1Y3R1cmVfVUlfPUNyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi1DcmVhdGVfZGlyZWN0b3JpZXNfZm9yX3NlbF9VSV89Q3JlYXRlIGRpcmVjdG9yaWVzIGZvciBzZWxlY3RlZCBmb2xkZXJzCi1JbXBvcnRfaW50b19uZXdfb3JfZXhpc3Rpbl9VSV89SW1wb3J0IGludG8gbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotQ3JlYXRlX2NvbXBsZXRlX2NvbnRhaW5lcl9fVUlfPUNyZWF0ZSBjb21wbGV0ZSBmb2xkZXIgc3RydWN0dXJlCi1GaWxlX1NlbGVjdGlvbl9VSV89RmlsZSBTZWxlY3Rpb24KLVNlbGVjdF9hX2ZpbGVfX1VJXz1TZWxlY3QgYSBmaWxlOgotTGFiZWxfRWFyX1Byb2plY3RfTmFtZV9VST1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgbmFtZToKLUxhYmVsX1doZXJlX1RvX0ltcG9ydF9VSV89V2hlcmUgZG8geW91IHdhbnQgdGhlIGltcG9ydGVkIHJlc291cmNlcyB0byBnbz8KLU92ZXJ3cml0ZV9leGlzdGluZ19yZXNvdXJjZXNfVUlfPU92ZXJ3cml0ZSBleGlzdGluZyByZXNvdXJjZXMgd2l0aG91dCB3YXJuaW5nCi1PdmVyd3JpdGVfZXhpc3RpbmdfcmVzb3VyY2VzX2V4cG9ydF9VSV89T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZwotKE5ld19FSkJfUmVmKV9VSV89KE5ldyBFSkIgUmVmKQotU21hbGxfKDE2eDE2KV9fVUlfPVNtYWxsICgxNngxNik6Ci1MYXJnZV8oMzJ4MzIpX19VSV89TGFyZ2UgKDMyeDMyKToKLUNob29zZV9TbWFsbF9JY29uX1VJXz1DaG9vc2UgU21hbGwgSWNvbgotU2VsZWN0X3RoZV9TbWFsbF9JY29uX1VJXz1TZWxlY3QgdGhlIFNtYWxsIEljb24KLUNob29zZV9MYXJnZV9JY29uX1VJXz1DaG9vc2UgTGFyZ2UgSWNvbgotU2VsZWN0X3RoZV9MYXJnZV9JY29uX1VJXz1TZWxlY3QgdGhlIExhcmdlCi1JY29uMjljb25jYXQ9Q3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotMWNvbmNhdF9VSV89Q3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotM2NvbmNhdF9VSV89QmFzaWNBdXRoRGF0YSB7MH0KLTRjb25jYXRfVUlfPUVqYlJlZkJpbmRpbmcgezB9Ci0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUsIGRvIG5vdCB0cmFuc2xhdGU6ICAgQ0hJTERfQ0xBU1NfTkFNRSAgIyMKLTVjb25jYXRfVUlfPUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgI0NISUxEX0NMQVNTX05BTUUjIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotNmNvbmNhdF9VSV89UmVzb3VyY2VSZWZCaW5kaW5nIHswfQotOWNvbmNhdF9FWENfPUlXQUUwMDA0RSBGYWlsZWQgdG8gbG9hZCBpbWFnZSBmb3IgJyd7MH0nJwotMTFjb25jYXRfRVJST1JfPUlXQUUwMDA1RSBDYW5ub3QgZmluZCB0aGUgaW1hZ2UgZm9yIHRoZSBmaWxlOiB7MH0KLTEyY29uY2F0X0VSUk9SXz1JV0FFMDAwNkUgUHJvYmxlbXMgd2l0aCBVUkwgZm9ybWF0IG9mIHRoZSBpbWFnZSBmaWxlOiB7MH0KLTI4Y29uY2F0X1VJXz17MH0gaXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIgaW4gYSByZXNvdXJjZSBuYW1lLgotMjljb25jYXRfVUlfPUVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciB7MH0uCi0zMGNvbmNhdF9VSV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBtdXN0IGJlIGFic29sdXRlLiBVc2UgL3swfS4KLTEzY29uY2F0X1VJXz17MH0gaXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIgaW4gYSByZXNvdXJjZSBuYW1lLgotMTRjb25jYXRfVUlfPUVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciB7MH0uCi0xNWNvbmNhdF9VSV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBtdXN0IGJlIGFic29sdXRlLiBVc2UgL3swfS4KLTE2Y29uY2F0X1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsxfS4KLTE4Y29uY2F0X1VJXz1DcmVhdGUgezB9Ci0xOWNvbmNhdF9VSV89Q3JlYXRlIHR3byBuZXcgY2hpbGRyZW4gZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi0yMGNvbmNhdF9VSV89Q3JlYXRlIHR3byBuZXcgY2hpbGRyZW4gb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uCi0yMWNvbmNhdD1DcmVhdGUgVHdvIHswfXMKLVVuZG9AQ3RybCtaX1VJXz1VbmRvQEN0cmwrWgotezB9X2NoYW5nZV9VSV89ezB9IGNoYW5nZQotUHJvamVjdF9hbmRfRUFSX25hbWVzX2Nhbl9fVUlfPURlc3RpbmF0aW9uIFByb2plY3QgYW5kIEVudGVycHJpc2UgQXBwbGljYXRpb24gbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lCi1Zb3VfbXVzdF9zcGVjaWZ5X2FuX0VBUl9wcl9VSV89WW91IG11c3Qgc3BlY2lmeSBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgdGhhdCBleGlzdHMgb3Igc2hvdWxkIGJlIGNyZWF0ZWQKLUludmFsaWRfRUFSX3Byb2plY3RfbmFtZV9VSV89SW52YWxpZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgbmFtZQotUHJvamVjdF9leGlzdCxfYnV0X2l0X2lzX25fVUlfPVByb2plY3QgZXhpc3QsIGJ1dCBpdCBpcyBub3QgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0Ci1FQVJfUHJvamVjdF9OYW1lX19VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG5hbWU6Ci1DcmVhdGVfQ2hpbGRfVUlfX1VJXz1DcmVhdGUgQ2hpbGQKLVVzZXJJZF9VSV89VXNlcklkCi1UaGVfdXNlcklkX3Byb3BlcnR5X1VJXz1UaGUgdXNlcklkIHByb3BlcnR5Ci1QYXNzd29yZF9VSV89UGFzc3dvcmQKLVRoZV9wYXNzd29yZF9wcm9wZXJ0eV9VSV89VGhlIHBhc3N3b3JkIHByb3BlcnR5Ci1KbmRpTmFtZV9VSV89Sm5kaU5hbWUKLVRoZV9qbmRpTmFtZV9wcm9wZXJ0eV9VSV89VGhlIGpuZGlOYW1lIHByb3BlcnR5Ci0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUsIGRvIG5vdCB0cmFuc2xhdGU6ICBiaW5kaW5nRWpiUmVmICAjIwotVGhlX2JpbmRpbmdFamJSZWZfcHJvcGVydHlfVUlfPVRoZSBiaW5kaW5nRWpiUmVmIHByb3BlcnR5Ci0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUsIGRvIG5vdCB0cmFuc2xhdGU6IGJpbmRpbmdSZXNvdXJjZVJlZiAgIyMKLVRoZV9iaW5kaW5nUmVzb3VyY2VSZWZfcHJvX1VJXz1UaGUgYmluZGluZ1Jlc291cmNlUmVmIHByb3BlcnR5Ci0jIyBkbyBub3QgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgbGluZSAjIwotRGVmYXVsdEF1dGhfVUlfPURlZmF1bHRBdXRoCi0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUsIGRvIG5vdCB0cmFuc2xhdGU6ICBkZWZhdWx0QXV0aCAjIwotVGhlX2RlZmF1bHRBdXRoX3Byb3BlcnR5X1VJXz1UaGUgZGVmYXVsdEF1dGggcHJvcGVydHkKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSwgZG8gbm90IHRyYW5zbGF0ZTogICBDSElMRF9DTEFTU19OQU1FICAjIwotQ3JlYXRlXyNDSElMRF9DTEFTU19OQU1FI19VSV89Q3JlYXRlICNDSElMRF9DTEFTU19OQU1FIwotUXVlc3Rpb25fVUlfPVF1ZXN0aW9uCi1SZXNvdXJjZV9fVUlfPVJlc291cmNlIHswfSBhbHJlYWR5IGV4aXN0cy4gIFdvdWxkIHlvdSBsaWtlIHRvIG92ZXJ3cml0ZSBpdD8KLU5ld19FSkJfcmVmZXJlbmNlX1VJXz1OZXcgRUpCIHJlZmVyZW5jZQotVGhlX0VKQl9wcm9wZXJ0eV9VSV89VGhlIEVKQiBwcm9wZXJ0eQotQW5fZXJyb3Jfb2NjdXJyZWRfcmVhZGluZ19fRVJST1JfPUlXQUUwMDA3RSBBbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHRoZSBtZXRhLWRhdGEgaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHswfToKLUVycm9yX2luX0VBUl9wcm9qZWN0X1VJXz1FcnJvciBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QKLU1hbmlmZXN0X0NsYXNzLVBhdGhfX1VJXz1NYW5pZmVzdCBDbGFzcy1QYXRoOgotTW9kdWxlX0RlcGVuZGVuY2llc19VSV89TW9kdWxlIERlcGVuZGVuY2llcwotU2VsZWN0X2RlcGVuZGVudF9KQVJzX2Zvcl9fVUlfPVNlbGVjdCBkZXBlbmRlbnQgSkFScyBmb3IgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4KLVByb2plY3RfbmFtZV9fVUlfPVByb2plY3QgbmFtZToKLU5PX0VBUl9KQVJERVBfRk9SX01PRF9VSV89U2VsZWN0ZWQgbW9kdWxlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBtb2R1bGUuCi1FQVJfUHJvamVjdF9OYW1lX19VSV9fVUlfPUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBuYW1lOgotUHJvamVjdF9VSV89UHJvamVjdAotQXZhaWxhYmxlX2RlcGVuZGVudF9KQVJzX19VSV89QXZhaWxhYmxlIGRlcGVuZGVudCBKQVJzOgotUHJvamVjdF97MH1faXNfbm90X3JlZmVyZW5fRVJST1JfPUlXQUUwMDA4RSBQcm9qZWN0IHswfSBpcyBub3QgcmVmZXJlbmNlZCBieSBhbnkgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LgotVW5hYmxlX3RvX2VkaXRfbW9kdWxlX2RlcGVfVUlfPVVuYWJsZSB0byBlZGl0IG1vZHVsZSBkZXBlbmRlbmNpZXMKLURlZmluZV9KYXZhX0J1aWxkX1NldHRpbmdzX1VJXz1EZWZpbmUgSmF2YSBCdWlsZCBTZXR0aW5ncwotU3BlY2lmeV90aGVfc291cmNlX2FuZF9vdXRfVUlfPVNwZWNpZnkgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMsIGFzIHdlbGwgYXMgdGhlIEphdmEgY2xhc3NwYXRoIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4KLUVudGVyX2FfdmFsaWRfcHJvamVjdF9uYW1lX1VJXz1FbnRlciBhIHZhbGlkIHByb2plY3QgbmFtZQotUHJvamVjdF9uYW1lX2hhc19pbnZhbGlkX2NfVUlfPVByb2plY3QgbmFtZSBoYXMgaW52YWxpZCBjaGFyYWN0ZXJzCi1Qcm9qZWN0X2RvZXNfbm90X2V4aXN0X29yX19VSV89UHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBJbnZhbGlkIHByb2plY3QgbmF0dXJlLiBFbnRlciBhIHZhbGlkIHByb2plY3QgbmFtZQotRUFSX1Byb2plY3RfTmFtZV9VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG5hbWU6Ci1JbnZhbGlkX2Rlc3RpbmF0aW9uX3Byb2plY19VSV89SW52YWxpZCBkZXN0aW5hdGlvbiBwcm9qZWN0Ci1DYW5ub3RfaW1wb3J0X2ludG9fYV9jbG9zZV9VSV89Q2Fubm90IGltcG9ydCBpbnRvIGEgY2xvc2VkIHByb2plY3QKLVByb2plY3RfbmFtZV9tdXN0X2JlX3NwZWNpX1VJXz1Qcm9qZWN0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLVNlbGVjdF9hbl9FQVJfUHJvamVjdF9VSV89U2VsZWN0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotVGhlX3Byb2plY3RfaXNfcmVmZXJlbmNlZF9fRVJST1JfPUlXQUUwMDA5RSBUaGUgcHJvamVjdCBpcyByZWZlcmVuY2VkIGJ5IG1vcmUgdGhhbiBvbmUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiAgUGxlYXNlIHNlbGVjdCB0aGUgcHJpbWFyeSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi1Bbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl89SVdBRTAwMTBFIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkOgotMmNvbmNhdF9JTkZPXz1JV0FFMDAxMUkgVGhlIGZpbGUgezB9IGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNhdmVkLiAgV291bGQgeW91IGxpa2UgdG8gbWFrZSBpdCBlZGl0YWJsZSBhbmQgc2F2ZSBhbnl3YXk/Ci1JbmZvcm1hdGlvbl9VSV89SW5mb3JtYXRpb24KLVRoZV9jaG9zZW5fb3BlcmF0aW9uX2lzX25vX0lORk9fPUlXQUUwMDEySSBUaGUgY2hvc2VuIG9wZXJhdGlvbiBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KLVNhdmVfcHJvYmxlbXNfVUlfPVNhdmUgcHJvYmxlbXMKLVNhdmVfY291bGRfbm90X2JlX2NvbXBsZXRlX0lORk9fPUlXQUUwMDEzSSBTYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuICBTb21lIHJlbGF0ZWQgZmlsZXMgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHNhdmVkLlxuXG5SZWFzb24KLVllc19VSV89WWVzCi1ZZXNfVG9fQWxsX1VJXz1ZZXMgVG8gQWxsCi1Ob19VSV89Tm8KLVNhdmluZ19SZWFkLU9ubHlfRmlsZV9VSV89U2F2aW5nIFJlYWQtT25seSBGaWxlCi1BX3NvdXJjZV9mb2xkZXJfbXVzdF9iZV9zcF9VSV89QSBzb3VyY2UgZm9sZGVyIG11c3QgYmUgc3BlY2lmaWVkCi1FQVJfcHJvamVjdF9pc19ub3Rfb3Blbl9VSV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGlzIG5vdCBvcGVuCi0xY29uY2F0X0VYQ189SVdBRTAwMTRFIEludmFsaWQgaW5pdGlhbCBkZWxheTogezB9Ci0yY29uY2F0X0VYQ189SVdBRTAwMTVFIEludmFsaWQgZGVsYXk6IHswfQotSW5mb3JtYXRpb25fVUlfX1VJXz1JbmZvcm1hdGlvbgotRXJyb3JfVUlfPUVycm9yCi1Db25maXJtX1VJXz1Db25maXJtCi1DYW4ndF9zdGFydF9hX1RpbWVyUXVldWVfdF9FWENfPUlXQUUwMDE2RSBDYW4ndCBzdGFydCBhIFRpbWVyUXVldWUgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcKLU1vZHVsZV9EZXBlbmRlbmN5X0RpYWxvZ19UaXRsZV9VSV89TW9kdWxlIERlcGVuZGVuY2llcyBEaWFsb2cKLUpBUi9Nb2R1bGVfVUlfPUpBUi9Nb2R1bGUKLU11c3RfYmVfYW5fQ29ubmVjdG9yX0NsaTFfVUlfPU11c3QgYmUgYSBDb25uZWN0b3IgcHJvamVjdC4KLU11c3RfYmVfYW5fQXBwbGljYXRpb25fQ2xpX1VJXz1NdXN0IGJlIGFuIEFwcGxpY2F0aW9uIENsaWVudCwgRUpCLCBvciBXZWIgcHJvamVjdC4KLU11c3RfYmVfYW5fRUpCX3Byb2plY3QuX1VJXz1NdXN0IGJlIGFuIEVKQiBwcm9qZWN0LgotU2VsZWN0aW9uX211c3RfYmVfYV9XZWJfcHJfVUlfPVNlbGVjdGlvbiBtdXN0IGJlIGEgV2ViIHByb2plY3QuCi1NdXN0X2JlX2FuX0VudGVycHJpc2VfQXBwbF9VSV89TXVzdCBiZSBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi1NdXN0X2JlX2FuX0FwcGxpY2F0aW9uX0NsaTFfajJlZTEzX1VJXz1NdXN0IGJlIGFuIEphdmEgRUUgMS4zIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0LgotTXVzdF9iZV9hbl9BcHBsaWNhdGlvbl9DbGkxX1VJXz1NdXN0IGJlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0LgotU2VsZWN0X3RoZV9oaWdoZXN0X0oyRUVfdmVyc2lvbl90aGF0X2lzX3RvX2JlX3VzZWRfX1VJXz0mSGlnaGVzdCBKYXZhIEVFIHZlcnNpb24gdXNlZCBmb3IgZGV2ZWxvcG1lbnQ6Ci1VbmV4cGVjdGVkX0lPX2V4Y2VwdGlvbl9vY2N1cnJlZF9jcmVhdGluZ194bWxfZG9jdW1lbnRfMV9FWENfPUlXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQKLURlbGV0ZV8xPURlbGV0ZS4uLgotRGVsZXRlX3NlbGVjdGVkX3Byb2plY3QocylfMj1EZWxldGUgc2VsZWN0ZWQgcHJvamVjdChzKQotUmVtb3ZlX21vZHVsZShzKV9mcm9tX2FsbF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uc18zPVJlbW92ZSBtb2R1bGUocykgZnJvbSBhbGwgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbW92ZV9tb2R1bGUocylfZnJvbV9hbGxfb3RoZXJfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfND1SZW1vdmUgbW9kdWxlKHMpIGZyb20gYWxsIG90aGVyIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1SZW1vdmVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0KHMpXzU9UmVtb3ZlIG1vZHVsZSBkZXBlbmRlbmNpZXMgcmVmZXJlbmNpbmcgc2VsZWN0ZWQgcHJvamVjdChzKQotRGVsZXRlX01vZHVsZV9PcHRpb25zXzY9RGVsZXRlIE1vZHVsZSBPcHRpb25zCi1EZWxldGVfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9PcHRpb25zXzc9RGVsZXRlIEVudGVycHJpc2UgQXBwbGljYXRpb24gT3B0aW9ucwotRGVsZXRlX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOD1EZWxldGUgY291bGQgbm90IGJlIGNvbXBsZXRlZAotRGVsZXRlX2Vycm9yXzk9RGVsZXRlIGVycm9yCi1XaGF0X3dvdWxkX3lvdV9saWtlX3RvX2RlbGV0ZV9fMTA9V2hhdCB3b3VsZCB5b3UgbGlrZSB0byBkZWxldGU/Ci1EZWxldGVfc2VsZWN0ZWRfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9wcm9qZWN0KHMpX29ubHlfMTE9RGVsZXRlIHNlbGVjdGVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdChzKSBvbmx5Ci1BbHNvX2RlbGV0ZV9tb2R1bGVfYW5kX3V0aWxpdHlfSmF2YV9wcm9qZWN0c18xMj1BbHNvIGRlbGV0ZSBtb2R1bGUgYW5kIHV0aWxpdHkgSmF2YSBwcm9qZWN0cwotRGVsZXRlX3NlbGVjdGVkX3Byb2plY3Qocylfb25seV8xMz1EZWxldGUgc2VsZWN0ZWQgcHJvamVjdChzKSBvbmx5Ci1BbHNvX2RlbGV0ZV9yZWZlcmVuY2VzX3RvX3NlbGVjdGVkX3Byb2plY3QocylfMTQ9QWxzbyBkZWxldGUgcmVmZXJlbmNlcyB0byBzZWxlY3RlZCBwcm9qZWN0KHMpCi1SZW5hbWVfMT1SZW5hbWUuLi4KLVJlbmFtZV9zZWxlY3RlZF9wcm9qZWN0XzI9UmVuYW1lIHNlbGVjdGVkIHByb2plY3QKLVJlbmFtZV9tb2R1bGVfaW5fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzM9UmVuYW1lIG1vZHVsZSBpbiBhbGwgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbmFtZV9tb2R1bGVfaW5fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQ9UmVuYW1lIG1vZHVsZSBpbiBhbGwgb3RoZXIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbmFtZV9tb2R1bGVfZGVwZW5kZW5jaWVzX3JlZmVyZW5jaW5nX3NlbGVjdGVkX3Byb2plY3RfNT1SZW5hbWUgbW9kdWxlIGRlcGVuZGVuY2llcyByZWZlcmVuY2luZyBzZWxlY3RlZCBwcm9qZWN0Ci1SZW5hbWVfTW9kdWxlX09wdGlvbnNfNj1SZW5hbWUgTW9kdWxlIE9wdGlvbnMKLVJlbmFtZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNz1SZW5hbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBPcHRpb25zCi1SZW5hbWVfY291bGRfbm90X2JlX2NvbXBsZXRlZF84PVJlbmFtZSBjb3VsZCBub3QgYmUgY29tcGxldGVkCi1SZW5hbWVfZXJyb3JfOT1SZW5hbWUgZXJyb3IKLVdoYXRfd291bGRfeW91X2xpa2VfdG9fcmVuYW1lX3RoaXNfdG9fXzEwPVdoYXQgd291bGQgeW91IGxpa2UgdG8gcmVuYW1lIHRoaXMgdG8/Ci1Db250ZXh0X1Jvb3RfXzExPUNvbnRleHQgcm9vdDoKLVJlbmFtZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Rfb25seV8xMj1SZW5hbWUgc2VsZWN0ZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IG9ubHkKLUFsc29fcmVuYW1lX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEzPUFsc28gcmVuYW1lIG1vZHVsZSBhbmQgdXRpbGl0eSBKYXZhIHByb2plY3RzCi1Tb3VyY2VfMT1Tb3VyY2UKLUVycm9yX2NyZWF0aW5nX25lc3RlZF90ZXh0X2VkaXRvcl8yPUVycm9yIGNyZWF0aW5nIG5lc3RlZCB0ZXh0IGVkaXRvcgotUmVkaXJlY3RpbmdfRWRpdG9yXzE9UmVkaXJlY3RpbmcgRWRpdG9yCi1Qcm9ibGVtc19PcGVuaW5nX0VkaXRvcl8yX0VSUk9SXz1JV0FFMDAxOEUgUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IKLVRoZV9zZWxlY3RlZF9pbnB1dF9pc19ub3RfdmFsaWRfZm9yX3RoaXNfdHlwZV9vZl9lZGl0b3IuX19SZWRpcmVjdGluZ190b190aGVfWE1MX2VkaXRvcl8zX0VSUk9SXz1JV0FFMDAxOUUgVGhlIHNlbGVjdGVkIGlucHV0IGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB0eXBlIG9mIGVkaXRvci4gIFJlZGlyZWN0aW5nIHRvIHRoZSBYTUwgZWRpdG9yLgotUkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfPVRoZSBzZWxlY3RlZCBpbnB1dCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdHlwZSBvZiBlZGl0b3IuICBSZWRpcmVjdGluZyB0byB0aGUgdGV4dCBlZGl0b3IuCi1SRURJUkVDVF9URVhUX0VESVRPUl9CSU5BUllfUFJPSkVDVF9VSV89VGhlIHNlbGVjdGVkIGlucHV0IGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB0eXBlIG9mIGVkaXRvci4gIEZvciBiaW5hcnkgcHJvamVjdHMsIHlvdSBjYW4gb3BlbiB0aGUgZWRpdG9yIHJlYWQtb25seSBmcm9tIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igbm9kZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LiAgUmVkaXJlY3RpbmcgdG8gdGhlIHRleHQgZWRpdG9yLgotRXJyb3JfY2hlY2tpbmdfb3V0X2ZpbGVzXzEwPUVycm9yIGNoZWNraW5nIG91dCBmaWxlcwotSW5jb25zaXN0ZW50X2ZpbGVzX2RldGVjdGVkXzExPUluY29uc2lzdGVudCBmaWxlcyBkZXRlY3RlZAotVGhlX2ZvbGxvd2luZ19maWxlc19hcmVfaW5jb25zaXN0ZW50X3dpdGhfdGhlX2ZpbGVfc3lzdGVtLl9Eb195b3Vfd2FudF90b19zYXZlX2FuZF9vdmVyd3JpdGVfdGhlc2VfZmlsZXNfb25fdGhlX2ZpbGVfc3lzdGVtX18xMl9XQVJOXz1JV0FFMDAyMFcgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtLlxuRG8geW91IHdhbnQgdG8gc2F2ZSBhbmQgb3ZlcndyaXRlIHRoZXNlIGZpbGVzIG9uIHRoZSBmaWxlIHN5c3RlbT8KLVByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVhDXz1JV0FFMDAyMUUgUHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwKLU5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VYQ189SVdBRTAwMjJFIE5vbi1wcm9qZWN0IGluIHNlbGVjdGlvbgotUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FUlJPUl89SVdBRTAwMjNFIFByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsCi1Ob24tcHJvamVjdF9pbl9zZWxlY3Rpb25fMl9FUlJPUl89SVdBRTAwMjRFIE5vbi1wcm9qZWN0IGluIHNlbGVjdGlvbgotVXBfMT0mVXAKLURvd25fMj0mRG93bgotU2VsZWN0X0FsbF8zPVNlbGVjdCAmQWxsCi1EZXNlbGVjdF9BbGxfND1EJmVzZWxlY3QgQWxsCi1Qcm9qZWN0XzM9UHJvamVjdAotRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9Qcm9qZWN0XzQ9RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OgotTmV3X2VqYl9wcm9qZWN0X2FuZF9fZWFyX3Byb2plY3RfY2Fubm90X2hhdmVfdGhlX3NhbWVfbm9uX2RlZmF1bHRfbG9jYXRpb25fNV9VSV89TmV3IEVKQiBwcm9qZWN0IGFuZCAgRUFSIHByb2plY3QgY2Fubm90IGhhdmUgdGhlIHNhbWUgbm9uIGRlZmF1bHQgbG9jYXRpb24KLU5ld19lamJfcHJvamVjdF9hbmRfX2Vhcl9wcm9qZWN0X2Nhbm5vdF9oYXZlX3RoZV9zYW1lX25vbl9kZWZhdWx0X2xvY2F0aW9uXzZfVUlfPU5ldyBFSkIgcHJvamVjdCBhbmQgIEVBUiBwcm9qZWN0IGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5vbiBkZWZhdWx0IGxvY2F0aW9uCi1Qcm9qZWN0X2FscmVhZHlfZXhpc3RzLF9lbnRlcl9hX25ld19wcm9qZWN0X25hbWVfdG9fY3JlYXRlX2FfbmV3X0VKQl9wcm9qZWN0XzdfVUlfPVByb2plY3QgYWxyZWFkeSBleGlzdHMsIGVudGVyIGEgbmV3IHByb2plY3QgbmFtZSB0byBjcmVhdGUgYSBuZXcgRUpCIHByb2plY3QKLVByb2plY3RfYWxyZWFkeV9leGlzdHMsX2VudGVyX2FfbmV3X3Byb2plY3RfbmFtZV90b19jcmVhdGVfYV9uZXdfRUFSX3Byb2plY3RfOF9VSV89UHJvamVjdCBhbHJlYWR5IGV4aXN0cywgZW50ZXIgYSBuZXcgcHJvamVjdCBuYW1lIHRvIGNyZWF0ZSBhIG5ldyBFQVIgcHJvamVjdAotSmFyX2ZpbGVfbmFtZV9tdXN0X2JlX2VudGVyZWRfOV9VSV89SkFSIGZpbGUgbmFtZSBtdXN0IGJlIGVudGVyZWQKLU5ld19wcm9qZWN0X25hbWVfXzE9TmV3IHByb2plY3QgbmFtZToKLU5ld19wcm9qZWN0X2xvY2F0aW9uX18yPU5ldyBwcm9qZWN0IGxvY2F0aW9uOgotTmV3XzQ9TmV3Ci1FeGlzdGluZ181PUV4aXN0aW5nCi1FeGlzdGluZ19wcm9qZWN0X25hbWVfXzY9RXhpc3RpbmcgcHJvamVjdCBuYW1lOgotU2VsZWN0X1Byb2plY3RfNz1TZWxlY3QgUHJvamVjdAotUHJvamVjdF9kb2VzX25vdF9leGlzdF84PVByb2plY3QgZG9lcyBub3QgZXhpc3QKLU5vdF9hX3Byb2plY3RfOT1Ob3QgYSBwcm9qZWN0Ci1TZWxlY3RfYV9wcm9qZWN0XzEwPVNlbGVjdCBhIHByb2plY3QKLURlZmF1bHRFQVJfMT1EZWZhdWx0RUFSCi1EZWZhdWx0MTNFQVJfMj1EZWZhdWx0MTNFQVIKLUVudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF8zPUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDoKLU5ld19lamJfcHJvamVjdF9hbmRfdGhlX25ld19lYXJfcHJvamVjdF9jYW5ub3RfaGF2ZV90aGVfc2FtZV9ub25fZGVmYXVsdF9sb2NhdGlvbl80X0VSUk9SXz1JV0FFMDAyNUUgTmV3IEVKQiBwcm9qZWN0IGFuZCB0aGUgbmV3IEVBUiBwcm9qZWN0IGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5vbiBkZWZhdWx0IGxvY2F0aW9uCi1OZXdfcHJvamVjdF9sb2NhdGlvbl9fMT1OZXcgcHJvamVjdCBsb2NhdGlvbjoKLU1hcEluZm9QYXRoLmFwcGx5UGF0aCgpXy1fQ291bGRfbm90X3N1Y2Nlc3NmdWxseV9hcHBseV9wYXRoXzFfRVhDXz1JV0FFMDAyNkUgTWFwSW5mb1BhdGguYXBwbHlQYXRoKCkgLSBDb3VsZCBub3Qgc3VjY2Vzc2Z1bGx5IGFwcGx5IHBhdGgKLUVudGVyX2FfdmFsaWRfbmFtZT1FbnRlciBhIHZhbGlkIHswfSBuYW1lCi1UaGVfbm9uX2RlZmF1bHRfbG9jYXRpb25fX18xPVRoZSBub24gZGVmYXVsdCBsb2NhdGlvbjogezB9IGZvciBtb2R1bGUgezF9IGlzIGluIHVzZS4KLVRoZV9wcm9qZWN0X2xvY2F0aW9uX2luX3VzZV9VST1UaGUgbm9uIGRlZmF1bHQgbG9jYXRpb246IHswfSBmb3IgezF9IGlzIGluIHVzZS4KLUluY29uc2lzdGVudF9GaWxlXzE9SW5jb25zaXN0ZW50IEZpbGUKLUluY29uc2lzdGVudF9GaWxlc18zPUluY29uc2lzdGVudCBGaWxlcwotVGhlX2ZvbGxvd2luZ193b3Jrc3BhY2VfZmlsZXNfYXJlX2luY29uc2lzdGVudF93aXRoX3RoZV9lZGl0b3JfND1UaGUgZm9sbG93aW5nIHdvcmtzcGFjZSBmaWxlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIGVkaXRvcjogXG4KLVVwZGF0ZV90aGVfZWRpdG9yX3dpdGhfdGhlX3dvcmtzcGFjZV9jb250ZW50c19fNT1VcGRhdGUgdGhlIGVkaXRvciB3aXRoIHRoZSB3b3Jrc3BhY2UgY29udGVudHM/Ci1UaGVfZm9sbG93aW5nX3dvcmtzcGFjZV9maWxlX2lzX2luY29uc2lzdGVudF93aXRoX3RoZV9lZGl0b3JfMT1UaGUgZm9sbG93aW5nIHdvcmtzcGFjZSBmaWxlIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBlZGl0b3I6IHswfSBcbgotRUFSX3Byb2plY3RfMT1FQVIgcHJvamVjdDoKLUVKQl9wcm9qZWN0XzI9RUpCIHByb2plY3QKLUVYUE9SVF9TT1VSQ0VfWklQX1VJXz1BbHNvIGV4cG9ydCBhIHNvdXJjZSBaSVAgZmlsZQotRUFSX3Byb2plY3RfVUlfPUVBUiBwcm9qZWN0OgotUHJvamVjdF9hbmRfRUFSX3Byb2plY3Rfbm9uX2RlZmF1bHRfbG9jYXRpb25fVUlfPVByb2plY3QgYW5kIEVBUiBwcm9qZWN0IGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5vbiBkZWZhdWx0IGxvY2F0aW9uCi1JbnZhbGlkX25vbl9kZWZhdWx0X2xvY2F0aW9uX1VJXz1JbnZhbGlkIG5vbiBkZWZhdWx0IGxvY2F0aW9uCi1Qcm9qZWN0X01haW5fVUlfPVByb2plY3QKLVRoZXJlX2FyZV9ub19wcm9qZWN0c19hdmFpbGFibGVfdGhhdF9tYXRjaF90aGVfc2VsZWN0aW9uX2NyaXRlcmlhLl8xPVRoZXJlIGFyZSBubyBwcm9qZWN0cyBhdmFpbGFibGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLgotSW5jb21wYXRpYmxlX0VBUl9hbmRfV2ViX1Byb2plY3RfTGV2ZWxfMT1JbmNvbXBhdGlibGUgRUFSIGFuZCBXZWIgUHJvamVjdCBMZXZlbAotWW91X2hhdmVfc2VsZWN0ZWRfYV8xLjJfbGV2ZWxfRUFSLl9fWW91cl9XZWJfUHJvamVjdF9KMkVFX2xldmVsX3dpbGxfYmVfY2hhbmdlZF90b18xLjIuX19Xb3VsZF95b3VfbGlrZV90b19wcm9jZWVkX0VSUk9SXzI9SVdBRTAwMjdFIFlvdSBoYXZlIHNlbGVjdGVkIGEgMS4yIGxldmVsIEVBUi4gIFlvdXIgV2ViIFByb2plY3QncyBKYXZhIEVFIGxldmVsIHdpbGwgYmUgY2hhbmdlZCB0byAxLjIuICBXb3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPwotSjJFRV9MZXZlbF80PUoyRUUgTGV2ZWwKLVByb2plY3RfMT1Qcm9qZWN0Ci1KMkVFX0xldmVsXzI9SjJFRSBMZXZlbAotUGxlYXNlX2Nob29zZV9hX0oyRUVfMS4yX2xldmVsX3Byb2plY3RfMz1QbGVhc2UgY2hvb3NlIGEgSmF2YSBFRSAxLjIgbGV2ZWwgcHJvamVjdAotUGxlYXNlX2Nob29zZV9hX0oyRUVfMS4zX2xldmVsX3Byb2plY3RfND1QbGVhc2UgY2hvb3NlIGEgSmF2YSBFRSAxLjMgbGV2ZWwgcHJvamVjdAotUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfMj1Qcm9ibGVtcyBPcGVuaW5nIEVkaXRvcgotVGhlX3NlbGVjdGVkX2lucHV0X2lzX25vdF92YWxpZF9mb3JfdGhpc190eXBlX29mX2VkaXRvci5fX1JlZGlyZWN0aW5nX3RvX3RoZV9YTUxfZWRpdG9yLl9FUlJPUl89SVdBRTAwMjhFIFRoZSBzZWxlY3RlZCBpbnB1dCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdHlwZSBvZiBlZGl0b3IuICBSZWRpcmVjdGluZyB0byB0aGUgWE1MIGVkaXRvci4KLUVudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF9fMj1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIFByb2plY3Q6Ci1Db250ZXh0X3Jvb3RfXzM9Q29udGV4dCByb290OgotQ0FOVF9JTVBPUlRfVE9fQklOQVJZX1BST0pFQ1RfVUlfPUNhbm5vdCBpbXBvcnQgaW50byB0aGUgZXhpc3RpbmcgcHJvamVjdCAiezB9IiBiZWNhdXNlIHRoZSBwcm9qZWN0IGlzIGJpbmFyeS4KLU9uZV9vcl9tb3JlX3JlZmVyZW5jZWRfV2ViX0xpYnJhcnlfUHJvamVjdHNfZG9fbm90X2V4aXN0PU9uZSBvciBtb3JlIFdlYiBMaWJyYXJ5IFByb2plY3RzIHJlZmVyZW5jZWQgYnkgezB9IGRvIG5vdCBleGlzdCBvciBhcmUgY2xvc2VkLlxuXG5EbyB5b3Ugd2FudCB0byBjb250aW51ZSB3aXRob3V0IGV4cG9ydGluZyB0aGVzZSBXZWIgTGlicmFyeSBQcm9qZWN0cz8KLVdhcm5pbmdfMT1XYXJuaW5nCi1Qcm9qZWN0X0RvY19Sb290PUNvbnRleHQgcm9vdDoKLU5PX0VBUl9KQVJERVBfVUlfPVByb2plY3QgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi1UaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfb2ZfdGhlX2lkZW50aXR5XzI9VGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBpZGVudGl0eQotVGhlX3JvbGVfbmFtZV9wcm9wZXJ0eV9vZl90aGVfaWRlbnRpdHlfND1UaGUgcm9sZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBpZGVudGl0eQotVGhlX2lkZW50aXR5X29mX3RoZV9ydW5fYXNfc3BlY2lmaWVkX2lkZW50aXR5XzI9VGhlIGlkZW50aXR5IG9mIHRoZSBydW4gYXMgc3BlY2lmaWVkIGlkZW50aXR5Ci1UaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfb2ZfdGhlX3NlY3VyaXR5X2lkZW50aXR5XzI9VGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotQmluYXJ5X1Byb2plY3RfMT1CaW5hcnkgUHJvamVjdAotSW5jbHVkZV9wcm9qZWN0X2J1aWxkX3BhdGhzX2FuZF9tZXRhLWRhdGFfZmlsZXNfMT1JbmNsdWRlIHByb2plY3QgYnVpbGQgcGF0aHMgYW5kIG1ldGEtZGF0YSBmaWxlcwotbmV3X0VBUl9wcm9qZWN0XzE9bmV3IEVBUiBwcm9qZWN0Ci1fRVJST1JfVGhlX2phcl9maWxlX2RvZXNfbm90X2V4aXN0XzI9SVdBRTAwMjlFIFRoZSBKQVIgZmlsZSBkb2VzIG5vdCBleGlzdAotX0VSUk9SX1RoZV9KMkVFX2xldmVsX29mX3RoZV9KYXJfZmlsZV9kb2VzX25vdF9tYXRjaF90aGVfUHJvamVjdF9sZXZlbF8zPUlXQUUwMDMwRSBUaGUgSmF2YSBFRSBsZXZlbCBvZiB0aGUgSkFSIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIFByb2plY3QgbGV2ZWwKLV9FUlJPUl9UaGVfSjJFRV9sZXZlbF9vZl90aGVfamFyX2ZpbGVfZG9lc19ub3RfbWF0Y2hfdGhlX0VudGVycHJpc2VfQXBwbGljYXRpb25fbGV2ZWxfND1JV0FFMDAzMUUgVGhlIEphdmEgRUUgbGV2ZWwgb2YgdGhlIEpBUiBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIGxldmVsCi1UaGVfYWN0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWRfb25fdGhlX3NlbGVjdGlvbixfd2hpY2hfaXNfcGFydF9vZl9hX2JpbmFyeV9wcm9qZWN0X1VJXz1UaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGlvbiwgd2hpY2ggaXMgcGFydCBvZiBhIGJpbmFyeSBwcm9qZWN0LgotZGVzdGluYXRpb25fcHJvamVjdF8xPWRlc3RpbmF0aW9uIHByb2plY3QKLUNVU1RPTV9ERUxFVEVfTUlYX01BVENIX1VJXz1UaGUgY3VzdG9tIEphdmEgRUUgZGVsZXRlIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBKYXZhIEVFIHByb2plY3RzLiAgVGhlIHN0YW5kYXJkIGRlbGV0ZSBvcHRpb25zIHdpbGwgYmUgdXNlZC4KLVBST0pFQ1RfTk9UX0FDQ0VTU0lCTEU9VGhlIHByb2plY3QgezB9IGlzIG5vdCBhY2Nlc3NpYmxlLgotSU1QT1JUX0ZBSUxFRF9VSV89SW1wb3J0IEZhaWxlZAotRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfVElUTEU9RXJyb3IgUmVhZGluZyBNYW5pZmVzdAotU0FWRV9NQU5JRkVTVF9XSVRIX0VSUk9SPVRoZSBtYW5pZmVzdCBmaWxlIGNvbnRhaW5zIGVycm9ycyBhbmQgY2FuIG5vdCBiZSBwYXJzZWQuICBUaGUgZmlsZSB3aWxsIGJlIHNhdmVkIGJ1dCB0aGUgSmF2YSBidWlsZCBwYXRoIHdpbGwgbm90IGJlIHVwZGF0ZWQuICBGb2xsb3dpbmcgYXJlIGNvbW1vbiBsaW1pdGF0aW9ucyB3aGljaCBjYW4gY2F1c2UgcHJvYmxlbXM6Ci1FUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19NRVNTQUdFX0VESVRPUj1UaGUgbWFuaWZlc3QgZmlsZSBjb250YWlucyBlcnJvcnMgYW5kIGNhbiBub3QgYmUgcGFyc2VkLiAgT3RoZXIgcGFnZXMgY2Fubm90IGJlIHVzZWQgdW50aWwgdGhlc2UgZXJyb3JzIGFyZSBjb3JyZWN0ZWQuICBGb2xsb3dpbmcgYXJlIGNvbW1vbiBsaW1pdGF0aW9ucyB3aGljaCBjYW4gY2F1c2UgcHJvYmxlbXM6Ci1FUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19NRVNTQUdFX1BST1BfUEFHRT1UaGUgbWFuaWZlc3QgZmlsZSBjb250YWlucyBlcnJvcnMgYW5kIGNhbiBub3QgYmUgcGFyc2VkLiAgRm9sbG93aW5nIGFyZSBjb21tb24gbGltaXRhdGlvbnMgd2hpY2ggY2FuIGNhdXNlIHByb2JsZW1zOgotTUFOSUZFU1RfUFJPQkxFTV8xPSogTGluZXMgaW4gdGhlIGZpbGUgbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gNzIgYnl0ZXMuIENvbnRpbnVhdGlvbiBvZiBsb25nIGxpbmVzIGlzIGluZGljYXRlZCBieSBhIG5ldyBsaW5lIGFuZCBhIHNwYWNlLgotTUFOSUZFU1RfUFJPQkxFTV8yPSogVGhlIGxhc3QgbGluZSBpbiB0aGUgZmlsZSBtdXN0IGVuZCB3aXRoIGEgbmV3IGxpbmUgb3IgaXQgd2lsbCBub3QgYmUgcGFyc2VkLgotTUFOSUZFU1RfUFJPQkxFTV8zPSogQmxhbmsgbGluZXMgd2l0aCBleHRyYSB3aGl0ZSBzcGFjZSBtYXkgY2F1c2UgcGFyc2UgdG8gZmFpbC4KLU1BTklGRVNUX1BST0JMRU1fND0qIFRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgZm9ybWF0dGVkIGNvcnJlY3RseS4gIFJlZmVyIHRvIHRoZSBtYW5pZmVzdCBhbmQgSkFSIGZpbGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUVSUk9SX09DQ1VSUkVEX1RJVExFPUVycm9yCi1FUlJPUl9PQ0NVUlJFRF9NRVNTQUdFPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHBlcmZvcm1pbmcgdGhlIHNlbGVjdGVkIGFjdGlvbi4KLVNBVkVfT05fQklOQVJZX1BST0pFQ1RfVElUTEVfVUlfPUJpbmFyeSBQcm9qZWN0cwotU0FWRV9PTl9CSU5BUllfUFJPSkVDVF9NRVNTQUdFX1VJXz1DYW5ub3QgZWRpdCBiaW5hcnkgcHJvamVjdHMuIEFsbCBjaGFuZ2VzIHdpbGwgYmUgbG9zdCB3aGVuIHlvdSBjbGljayBPSy4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotVGhlX0pBUl9maWxlX2RvZXNfbm90X2V4aXN0PVRoZSBKQVIgZmlsZSBkb2VzIG5vdCBleGlzdC4KLVRoZV9KMkVFX2xldmVsX29mX3RoZV9KYXJfZmlsZV9kb2VzX25vdF9tYXRjaF90aGVfUHJvamVjdF9sZXZlbC5fNz1UaGUgSmF2YSBFRSBsZXZlbCBvZiB0aGUgSkFSIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIHByb2plY3QgbGV2ZWwuCi1Qcm9qZWN0X2FscmVhZHlfZXhpc3RzLj1Qcm9qZWN0IHswfSBhbHJlYWR5IGV4aXN0cy4KLUVudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF9kb2VzX25vdF9leGlzdC49RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHswfSBkb2VzIG5vdCBleGlzdC4KLUVudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF9uYW1lX211c3RfYmVfc3BlY2lmaWVkLj1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLUFuX0VudGVycHJpc2VfQXBwbGljYXRpb25fUHJvamVjdF93aXRoX3RoZV9uYW1lX2FscmVhZHlfZXhpc3RzX2luX3RoZV93b3Jrc3BhY2UuPUVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MH0gYWxyZWFkeSBleGlzdHMuCi1Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcF9VSV89Q29udGV4dCBSb290IGNhbm5vdCBiZSBlbXB0eQotUHJvamVjdF9XaXRoX1NhbWVfTmFtZV9FeGlzdHNfVUlfPVRoZSBwcm9qZWN0IG5hbWVkIFwiezB9XCIgYWxyZWFkeSBleGlzdHMuCi1Vc2VfZGVmYXVsdF9sYWJlbF8xPVVzZSBkZWZhdWx0Ci1NdXN0X2JlX2FuX0oyRUUxM19FQVJfUHJvamVjdF9VSV89TXVzdCBiZSBhbiBKYXZhIEVFIDEuMyBsZXZlbCBFQVIgUHJvamVjdAotQXNzZW1ibHlfQXBwbGljYXRpb25fUHJvamVjdF9TdWZmaXg9RUFSCi1Bc3NlbWJseV9FSkJKQVJfUHJvamVjdF9TdWZmaXg9RUpCCi1Bc3NlbWJseV9XZWJfUHJvamVjdF9TdWZmaXg9V2ViCi1Bc3NlbWJseV9DbGllbnRKQVJfUHJvamVjdF9TdWZmaXg9Q2xpZW50Ci1Bc3NlbWJseV9Db25uZWN0b3JfUHJvamVjdF9TdWZmaXg9Q29ubmVjdG9yCi1BZHZhbmNlZC4uLl9VST1BZHZhbmNlZC4uLgotUHJvamVjdF9Mb2NhdGlvbl9VSV89UHJvamVjdCBsb2NhdGlvbjoKLUREX0dFTkVSQUxfTkFNRT1EZXBsb3ltZW50IERlc2NyaXB0b3IKLURlc3RpbmF0aW9uX18xPURlc3RpbmF0aW9uOgotUmVzb3VyY2VfXzI9UmVzb3VyY2U6Ci1UaGVfZmlsZV9kb2VzX25vdF9leGlzdC5fMT1UaGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLVJlc291cmNlX18yPVJlc291cmNlOgotTXVzdF9iZV9hbl9KMkVFMTJfTW9kdWxlX09ubHlfVUlfPU11c3QgYmUgYSBKYXZhIEVFIDEuMiBMZXZlbCBtb2R1bGUgZmlsZSBvbmx5LgotUHJvamVjdF9sb2NhdGlvbl9fMT1Qcm9qZWN0IGxvY2F0aW9uOgotUHJvamVjdF9fMT1Qcm9qZWN0OgotQnJvd3NlLi4uXzI9QnJvd3NlLi4uCi1OZXcuLi5fMz1OZXcuLi4KLUludmFsaWRfRUFSX0Zvcl9TZWxlY3RlZF9Nb2R1bGU9VGhlIEphdmEgRUUgbGV2ZWwgb2YgdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBpcyBub3QgdmFsaWQgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUgZmlsZQotSW52YWxpZF9Qcm9qZWN0X0Zvcl9TZWxlY3RlZF9Nb2R1bGU9VGhlIEphdmEgRUUgbGV2ZWwgb2YgdGhlIGRlc3RpbmF0aW9uIHByb2plY3QgaXMgbm90IHZhbGlkIGZvciB0aGUgc2VsZWN0ZWQgbW9kdWxlIGZpbGUKLUludmFsaWRfRUFSX05hbWVfRm9yX1Byb2plY3RfQ3JlYXRpb249VGhlIEphdmEgRUUgbGV2ZWwgb2YgdGhlIGV4aXNpdGluZyBFQVIgcHJvamVjdDogezB9IGRvZXMgbm90IG1hdGNoIHRoZSBKYXZhIEVFIGxldmVsIG9mIHRoZSBwcm9qZWN0IGJlaW5nIGNyZWF0aW9uCi1KMkVFSW1wb3J0V2l6YXJkUGFnZTEuRUFSX3Byb2plY3Q9RUFSIHByb2plY3Q6Ci1KMkVFSW1wb3J0V2l6YXJkUGFnZTEuVGhlX2ZpbGVfZG9lc19ub3RfZXhpc3Q9VGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCi1OZXdKMkVFUHJvamVjdENyZWF0aW9uUGFnZS5Qcm9qZWN0X25hbWU9UHJvamVjdCBuYW1lOgotTmV3SjJFRVByb2plY3RDcmVhdGlvblBhZ2UuUHJvamVjdF9sb2NhdGlvbj1Qcm9qZWN0IGxvY2F0aW9uOgotTmV3SjJFRVByb2plY3RDcmVhdGlvblBhZ2UuRUFSX3Byb2plY3Q9RUFSIHByb2plY3Q6Ci1Qcm9qX0VBUl9Qcm9qX05hbWVfQ2Fubm90X0JlX1NhbWVfVUlfPVByb2plY3QgYW5kIEVBUiBwcm9qZWN0IG5hbWVzIGNhbm5vdCBiZSBzYW1lCi1FbmFibGVfTGFiZWxfVUlfPUVuYWJsZSBzZXJ2ZXIgdGFyZ2V0aW5nIHN1cHBvcnQKLURpc2FibGVfTGFiZWxfVUlfPURpc2FibGUgc2VydmVyIHRhcmdldGluZyBzdXBwb3J0Ci1DaGFuZ2VfTW9kdWxlX1NlcnZlcl9UYXJnZXRfRGlhbG9nX01lc3NhZ2VfVUlfPUVBUiB0YXJnZXQgc2VydmVyOiAiezB9IiBcbk1vZHVsZSB0YXJnZXQgc2VydmVyOiAiezF9IlxuXG5DaGFuZ2UgbW9kdWxlIHRhcmdldCBzZXJ2ZXIgdG8gRUFSIHRhcmdldCBzZXJ2ZXI/Ci1DaGFuZ2VfRUFSX1NlcnZlcl9UYXJnZXRfRGlhbG9nX01lc3NhZ2VfVUlfPVNlbGVjdGVkIG1vZHVsZSB0YXJnZXQgc2VydmVyOiAiezB9IlxuRXhpc3RpbmcgRUFSIHRhcmdldCBzZXJ2ZXI6ICJ7MX0iIFxuXG5DaGFuZ2UgRUFSIHRhcmdldCBzZXJ2ZXIgdG8gc2VsZWN0ZWQgbW9kdWxlIHRhcmdldCBzZXJ2ZXI/Ci1DUkVBVEVfRUpCX0NMSUVOVF9KQVJfVUlfPUNyZWF0ZSBFSkIgY2xpZW50IEpBUiBwcm9qZWN0cyBmb3IgbmV3IEVKQiBwcm9qZWN0cwotQ2hhbmdlX1NlcnZlcl9UYXJnZXRfRGlhbG9nX1RpdGxlX1VJXz1DaGFuZ2UgVGFyZ2V0IFNlcnZlcgotTW9kaWZ5X1NlcnZlcl9UYXJnZXRfVGl0bGVfVUlfPU1vZGlmeSBUYXJnZXQgU2VydmVyCi1TZXJ2ZXJfVGFyZ2V0X1VJXz1UYXJnZXQgc2VydmVyOgotU2VydmVyX1RhcmdldF9EZXNjX1VJXz1TZWxlY3QgYSB0YXJnZXQgc2VydmVyIGZvciB0aGUgXCJ7MH1cIiBwcm9qZWN0LgotU2VydmVyX1RhcmdldF9DaGVja2JveF9MYWJlbF9VSV89VXBkYXRlIEVBUiBtb2R1bGVzIGFuZCB1dGlsaXR5IHByb2plY3RzIHRvIHRoZSBzZWxlY3RlZCB0YXJnZXQgc2VydmVyCi1TZXJ2ZXJfVGFyZ2V0X0NoYW5nZV9EZXNjX1VJXz1UaGUgdGFyZ2V0IHNlcnZlciAiezB9IiBvZiB0aGUgZXhpc3RpbmcgRUFSIHByb2plY3QgInsxfSIgaXMgaW5jb21wYXRpYmxlIFxud2l0aCB0aGUgbW9kdWxlIHByb2plY3QgYmVpbmcgY3JlYXRlZC4gXG5cbkRvIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgRUFSIHByb2plY3QgdG8gdGhlIG1vZHVsZSB0YXJnZXQgc2VydmVyOlxuXG57Mn0gPwotRUpCX0NMSUVOVF9SQURJT19VSV89UmVmZXJlbmNlcyB0byBFSkIgSkFScyB3aXRoIEVKQiBDbGllbnQgSkFScwotVVNFX0VKQl9TRVJWRVJfSkFSc19VSV89VXNlIEVKQiBKQVJzCi1VU0VfRUpCX0NMSUVOVF9KQVJzX1VJXz1Vc2UgRUpCIGNsaWVudCBKQVJzCi1VU0VfQk9USF9VSV89QWxsb3cgYm90aAotRUpCX0NMSUVOVF9KQVJTX1VJXz1FSkIgQ2xpZW50IEpBUnMKLUpBUl9ERVBTX0NMSUVOVF9VSV89SmF2YSBKQVIgRGVwZW5kZW5jaWVzIGZvciByZWZlcmVuY2VzIHRvIEVKQiBKQVJzOgotVVNFX0VKQl9KQVJfVUk9VXNlIEVKQiBKQVIKLVVTRV9FSkJfSkFSX0RFU0NfVUk9QWxsIHJlZmVyZW5jaW5nIG1vZHVsZXMgYW5kIEpBUnMgZGVwZW5kIG9uIHRoZSBFSkIgSkFSLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggV2ViU3BoZXJlIDQueCwgNS54LCBhbmQgbW9zdCBhcHBsaWNhdGlvbiBzZXJ2ZXJzLgotVVNFX0VKQl9DTElFTlRfSkFSX1VJXz1Vc2UgRUpCIENsaWVudCBKQVIsIGlmIGl0IGV4aXN0cwotVVNFX0VKQl9DTElFTlRfSkFSX0RFU0NfVUk9QWxsIHJlZmVyZW5jaW5nIG1vZHVsZXMgYW5kIEpBUnMgZGVwZW5kIG9uIHRoZSBFSkIgY2xpZW50IEpBUi4gIFRoaXMgaXMgYmVzdCBwcmFjdGljZSwgYnV0IGlzIG9ubHkgY29tcGF0aWJpbGUgd2l0aCBXZWJTcGhlcmUgNS4xIGFuZCBhbnkgYXBwbGljYXRpb24gc2VydmVycyB0aGF0IHN1cHBvcnQgRUpCIGNsaWVudCBKQVIgZGVwbG95bWVudC4KLU5PTkVfU0VSVkVSX1RBUkdFVF9TVFJJTkdfVUlfPU5vIHRhcmdldCBzZXJ2ZXIgc3BlY2lmaWVkCi1TZXJ2ZXJfSW52YWxpZF9Gb3JfRXhpc2l0bmdfRUFSX1VJXz1TZWxlY3RlZCB0YXJnZXQgc2VydmVyICJ7MH0iIGlzIGludmFsaWQgZm9yIHRoZSBleGlzdGluZyBFQVIgcHJvamVjdCAiezF9IgotQ2Fubm90X1NldF9TZXJ2ZXJfVGFyZ2V0X1VJXz1Db3VsZCBub3Qgc2V0IHNlcnZlciB0YXJnZXRcblxuCi1fVUlfRUpCTG9jYWxSZWZfbG9jYWxIb21lX2ZlYXR1cmU9TG9jYWwgSG9tZQotX1VJX0VKQkxvY2FsUmVmX2xvY2FsX2ZlYXR1cmU9TG9jYWwKLV9VSV9FSkJMb2NhbFJlZl90eXBlPUxvY2FsIFJlZgotX1VJX1FOYW1lX3R5cGU9UU5hbWU6Ci1fVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25fZmVhdHVyZT1EZXNjcmlwdGlvbgotX1VJX0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uX2ZlYXR1cmVfZGVzYz0KLV9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZV9mZWF0dXJlPURpc3BsYXkgbmFtZQotX1VJX0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lX2ZlYXR1cmVfZGVzYz0KLV9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9zbWFsbEljb25fZmVhdHVyZT1TbWFsbCBpY29uCi1fVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfc21hbGxJY29uX2ZlYXR1cmVfZGVzYz0KLV9VSV9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9sYXJnZUljb25fZmVhdHVyZT1MYXJnZSBpY29uCi1fVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfbGFyZ2VJY29uX2ZlYXR1cmVfZGVzYz0KLU1lc3NhZ2VEZXN0aW5hdGlvbl9VSV89TWVzc2FnZSBEZXN0aW5hdGlvbgotTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyX1VJXzA9TWVzc2FnZURlc3RSZWYKLUlOQ1JFTUVOVEFMX0RFUExPWU1FTlRfTEFCRUw9UGVyZm9ybSBJbmNyZW1lbnRhbCBEZXBsb3ltZW50Ci1HUk9VUF9ERVBMT1lNRU5UX0xBQkVMPURlcGxveW1lbnQKLQotX1VJX1FOYW1lX2xvY2FsUGFydF9mZWF0dXJlPUxvY2FsIFBhcnQKLV9VSV9RTmFtZV9sb2NhbFBhcnRfZmVhdHVyZV9kZXNjPVRoZSBRTmFtZSBsb2NhbCBwYXJ0LgotX1VJX1FOYW1lX25hbWVzcGFjZVVSSV9mZWF0dXJlPU5hbWVzcGFjZSBVUkkKLV9VSV9RTmFtZV9uYW1lc3BhY2VVUklfZmVhdHVyZV9kZXNjPVRoZSBRTmFtZSBuYW1lc3BhY2UgVVJJCi1Vc2FnZV9VSV89VXNhZ2UKLVRoZV91c2FnZV9wcm9wZXJ0eV9VSV89VGhlIHVzYWdlIHByb3BlcnR5Ci1fVUlfUGFyYW1WYWx1ZV9kZXNjcmlwdGlvbl9mZWF0dXJlPURlc2NyaXB0aW9uCi1fVUlfUGFyYW1WYWx1ZV9uYW1lX2ZlYXR1cmU9TmFtZQotX1VJX1BhcmFtVmFsdWVfdmFsdWVfZmVhdHVyZT1WYWx1ZQotX1VJX1BhcmFtVmFsdWVfdHlwZT1QYXJhbQotX1VJX1BhcmFtVmFsdWVfdmFsdWU9VmFsdWUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9lYXJhcmNoaXZlb3BzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VhcmFyY2hpdmVvcHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNjAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VhcmFyY2hpdmVvcHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIHN0cmluZyBmb3IgQXJjaGl2ZSBvcGVyYXRpb25zIG9mIEVBUnMKLQotCi1BUkNISVZFX09QRVJBVElPTl9TYXZlTW9mUmVzb3VyY2VzPUVycm9yIG9jY3VycmVkIHNhdmluZyB0aGUgbWV0YWRhdGEgZmlsZS4KLUFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVGaWxlPUVycm9yIG9jY3VycmVkIHNhdmluZyB0aGUgZmlsZS4KLUFSQ0hJVkVfT1BFUkFUSU9OX1Byb2plY3ROYXR1cmU9RXJyb3IgZ2V0dGluZyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLgotQVJDSElWRV9PUEVSQVRJT05fU2F2ZU1hbmlmZXN0PUVycm9yIG9jY3VycmVkIHNhdmluZyB0aGUgbWFuaWZlc3QuCi1BUkNISVZFX09QRVJBVElPTl9GaWxlTm90Rm91bmQ9RXJyb3I6IEZpbGUgbm90IGZvdW5kLgotQVJDSElWRV9PUEVSQVRJT05fRmlsZUNvbnRlbnRzPUNvcmUgZXhjZXB0aW9uIGNhdWdodCBpbiBnZXR0aW5nIGZpbGUgY29udGVudHMuCi1BUkNISVZFX09QRVJBVElPTl9FcnJvT2NjdXJlZD1FcnJvciBvY2N1cnJlZC4KLUFSQ0hJVkVfT1BFUkFUSU9OX0ZpbGVzRnJvbVByb2plY3Q9VW5hYmxlIHRvIGdldCBmaWxlcywgbW9kdWxlcywgb3IgdXRpbGl0eSBKQVJzIGluIHRoZSBFQVIuICBDaGVjayBsb2cgZmlsZXMuCi1BUkNISVZFX09QRVJBVElPTl9PcGVuaW5nQXJjaGl2ZT1FcnJvciBvcGVuaW5nIGFyY2hpdmUgZm9yIGV4cG9ydC4KLUFSQ0hJVkVfT1BFUkFUSU9OX0ltcG9ydE9wZXJhdGlvbj1JbXBvcnQgT3BlcmF0aW9uIEZhaWxlZCEKLUlNUE9SVF9NT0ZSRVNPVVJDRV9TVFJJTkc9SW1wb3J0aW5nIG1ldGFkYXRhLi4KLUVBUl9JTVBPUlRfRklMRV9TVFJJTkc9SW1wb3J0aW5nIGZpbGUuLgotRVJST1JfSU1QT1JUSU5HX0VBUl9GSUxFPUVycm9yIGltcG9ydGluZyBFQVIgZmlsZS4KLUVSUk9SX0VYUE9SVElOR19FQVJfRklMRT1FcnJvciBleHBvcnRpbmcgRUFSIGZpbGUuCi1JTVBPUlRJTkdfRUFSX0ZJTEVfVUlfPUltcG9ydGluZyBFQVIgZmlsZS4uLgotCi1VcGRhdGluZ19wcm9qZWN0X2NsYXNzcGF0aF9VSV89VXBkYXRpbmcgcHJvamVjdCBjbGFzc3BhdGhzLi4uCi0KLVVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl89SVdBRTAwMDFFIFRoZSBtb2R1bGUgXCIgezB9IFwiIGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBcIiB7MX0gXCIgY291bGQgbm90IGJlIGxvYWRlZC5cbiB7Mn07Ci1famFyX1VJXz0uamFyCi1VcGRhdGluZ19tYW5pZmVzdF9DbGFzc19QYXRoX19hdHRyaWJ1dGVzX1VJXz1VcGRhdGluZyBtYW5pZmVzdCBDbGFzcy1QYXRoOiBhdHRyaWJ1dGVzCi1fcHJlRGVwbG95X0VSUk9SXz1JV0FFMDAwMkUgezB9LnByZURlcGxveQotbm9SdW50aW1lU2VsZWN0ZWRMYWJlbCA9IDxub25lPgotTUlTU0lOR19DTElFTlRfSkFSPUVKQiBDbGllbnQgSmFyIFwiezB9XCIgZm9yIEVKQiBKYXIgXCJ7MX1cIiBtaXNzaW5nIGZyb20gRUFSIFwiezJ9XCIuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VhcmNyZWF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VhcmNyZWF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWZkNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9lYXJjcmVhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FcnJvcl9vY2N1cmVkX2dldHRpbmdfYXBwbF9FUlJPUl89SVdBRTAwMDFFIEVycm9yIG9jY3VycmVkIGdldHRpbmcgYXBwbGljdGlvbi54bWw6Ci1FcnJvcl9vY2N1cmVkX2dldHRpbmdfYXBwbDFfRVJST1JfPUlXQUUwMDAyRSBFcnJvciBvY2N1cnJlZCBnZXR0aW5nIGFwcGxpY2F0aW9uLnhtbDoKLUNyZWF0aW5nX19VSV89Q3JlYXRpbmc6Ci1DcmVhdGluZ19FQVJfUHJvamVjdF9VSV89Q3JlYXRpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0Li4uCi1UaGVfcHJvamVjdF9hbHJlYWR5X2V4aXN0X0VSUk9SXz1JV0FFMDAwM0UgVGhlIHByb2plY3QgYWxyZWFkeSBleGlzdC4KLUVBUlByb2plY3RDcmVhdGlvbk9wZXJhdGlvX0VSUk9SXz1JV0FFMDAwNEUgRUFSUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmdldE5ld1Byb2plY3QgOgotQUJTX1BBVEhfQ0hBTkdFRF9VSV89VGhlIElCTSBleHRlbnNpb25zIGZpbGUgY29udGFpbnMgZGVwcmVjYXRlZCBhYnNvbHV0ZSBwYXRocy4gIFRoaXMgY2FuIGJlIGF1dG8tY29ycmVjdGVkIGFuZCBzaG91bGQgYmUgc2F2ZWQuICBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBwYXRocyBmcm9tIHRoZSBmaWxlLCBhbmQgb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UuICBXb3VsZCB5b3UgbGlrZSB0byBhdXRvLWNvcnJlY3Q/Ci1VTlNBVkVEX0NIQU5HRVNfV0FSTl89SVdBRTAwMDVXIFVuc2F2ZWQgY2hhbmdlcyBleGlzdCBpbiBBcHBsaWNhdGlvbi4gIFByb2plY3Q6IHswfQotUFJPSkVDVF9NQVBfUFJPQkxFTVNfRVJST1JfPUlXQUUwMDA2RSBQcm9ibGVtcyBleGlzdCBpbiBwcm9qZWN0IG1hcHBpbmdzIGZvciBvbmUgb3IgbW9yZSBtb2R1bGVzIGluIEFwcGxpY2F0aW9uLiAgVXNlIEFwcGxpY2F0aW9uIGVkaXRvciB0byBjb3JyZWN0LiAgUHJvamVjdDogezB9Ci1NT0RVTEVfUFJPSkVDVFNfQ0xPU0VEX1dBUk5fPUlXQUUwMDA3VyBPbmUgb3IgbW9yZSBtb2R1bGUgcHJvamVjdHMgaXMgY2xvc2VkLiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3Q6IHswfS4KLUFkZF9Nb2R1bGVfQ29tbWFuZF9MYWJlbF9VSV89QWRkIE1vZHVsZQotUmVtb3ZlX01vZHVsZV9Db21tYW5kX0xhYmVsX1VJXz1SZW1vdmUgTW9kdWxlCi0KLVNldF9wcm9qZWN0X1VJXz1TZXQgcHJvamVjdAotQWRkX1V0aWxpdHlfSkFSX1VJPUFkZCBVdGlsaXR5IEpBUgotUkVNX1VUSUxfSkFSX1VJPVJlbW92ZSBVdGlsaXR5IEpBUgotUFJPSl9ERVNDX1VQREFURV9FUlJPUl9VSV89SVdBRTAwMDhFIFRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIGNvdWxkIG5vdCBiZSB1cGRhdGVkLgotTm90X2FuX2Vhcl9wcm9qZWN0X1VJXz1Ob3QgYW4gRUFSIHByb2plY3QuCi1FQVJfUFJPSkVDVF9NVVNUX0JFX09QRU5fVUlfPUFuIEVBUiBwcm9qZWN0IG11c3QgYmUgb3BlbiBhbmQgbXVzdCBleGlzdCBmb3IgcHJvcGVydGllcyB0byBiZSBlZGl0ZWQuCi1VcGRhdGluZ19hYnNvbHV0ZV9wYXRoc19VSV89VXBkYXRpbmcgYWJzb2x1dGUgcGF0aHMgZm9yIHRoZSBzZXJ2ZXIgcnVudGltZS4KLUR1cGxpY2F0ZU1vZHVsZU5hbWVzPUR1cGxpY2F0ZSBtb2R1bGUgbmFtZXMgOiB7MH0KLU5vTW9kdWxlc1NlbGVjdGVkPU5vIG1vZHVsZSB0eXBlcyBzZWxlY3RlZC4KLQotCi1LRVlfMT1Qcm9qZWN0IG11c3QgYmUgb2YgdHlwZSBXZWIsIEVKQiwgQXBwbGljYXRpb24gY2xpZW50IG9yIENvbm5lY3RvcgotS0VZXzI9TW9kdWxlIGFscmVhZHkgZXhpc3RzLgotS0VZXzM9U2VsZWN0ZWQgcHJvamVjdCBpcyBjbG9zZWQuCi1LRVlfND1TZWxlY3QgYSBwcm9qZWN0IGZyb20gdGhlIGxpc3QuCi1LRVlfNT1VUkkgZXhpc3RzLgotS0VZXzY9U2VsZWN0ZWQgcHJvamVjdCBpcyBub3QgYSBKYXZhIHByb2plY3QuCi1LRVlfNz1UaGUgdXJpIG11c3QgZW5kIHdpdGggJy5qYXInLgotS0VZXzg9VXRpbGl0eSBKQVIgYWxyZWFkeSBleGlzdHMuCi1LRVlfOT1BbiBvcGVuIEVBUiBwcm9qZWN0IGlzIHJlcXVpcmVkLgotS0VZXzEwPVVSSSBjYW5ub3QgYmUgZW1wdHkuCi1LRVlfMTE9VGhlIG1vZHVsZSAiezB9IiBpcyBub3QgYW4gQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZS4KLUtFWV8xMj1UaGUgbW9kdWxlICJ7MH0iIGlzIG5vdCBhbiBFQVIgbW9kdWxlLgotS0VZXzEzPVRoZSBtb2R1bGUgInswfSIgaXMgbm90IGFuIEVKQiBtb2R1bGUuCi1LRVlfMTQ9VGhlIG1vZHVsZSAiezB9IiBpcyBub3QgYSBSQVIgbW9kdWxlLgotS0VZXzE1PVRoZSBtb2R1bGUgInswfSIgaXMgbm90IGEgV0FSIG1vZHVsZS4KLUtFWV8xNj1UaGUgc2VsZWN0ZWQgc2VydmVyIHRhcmdldCBpcyBub3QgdmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgRUFSIGNvbXBvbmVudC4gVGhlIHNlbGVjdGVkIHNlcnZlciBtYXkgbm90IHN1cHBvcnQgRUFSIGNvbXBvbmVudC4KLUVBUkltcG9ydERhdGFNb2RlbF9VSV8wPVRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYW1lIFwiIHswfSBcIiBmb3IgYXJjaGl2ZSBcIiB7MX0gXCIgYWxyZWFkeSBleGlzdHMuIENob29zZSBhIGRpZmZlcmVudCBuYW1lLgotRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzE9Q29sbGlkaW5nIHByb2plY3QgbmFtZSBcIiB7MH0gXCIgYmV0d2VlbiBFQVIgcHJvamVjdCBuYW1lIGFuZCBcIiB7MX0gXCIgYXJjaGl2ZS4KLUVBUkltcG9ydERhdGFNb2RlbF9VSV8xYT1Db2xsaWRpbmcgY2FzZSBpbnNlbnNpdGl2ZSBwcm9qZWN0IG5hbWVzIFwiIHswfSBcIiwgXCIgezF9IFwiIGJldHdlZW4gRUFSIHByb2plY3QgbmFtZSBhbmQgXCIgezJ9IFwiIGFyY2hpdmUuCi1FQVJJbXBvcnREYXRhTW9kZWxfVUlfMj1Db2xsaWRpbmcgcHJvamVjdCBuYW1lIFwiIHswfSBcIiBiZXR3ZWVuIGFyY2hpdmVzIFwiIHsxfSBcIiBhbmQgXCIgezJ9IFwiLgotRUFSSW1wb3J0RGF0YU1vZGVsX1VJXzJhPUNvbGxpZGluZyBjYXNlIGluc2Vuc2l0aXZlIHByb2plY3QgbmFtZXMgXCIgezB9IFwiLCBcIiB7MX0gXCIgYmV0d2VlbiBhcmNoaXZlcyBcIiB7Mn0gXCIgYW5kIFwiIHszfSBcIi4KLUVBUkltcG9ydERhdGFNb2RlbF9VSV8zPVRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYW1lIFwiIHswfSBcIiBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuCi1FQVJJbXBvcnREYXRhTW9kZWxfVUlfND1UaGUgbmVzdGVkIGFyY2hpdmUgXCIgezB9IFwiIGNvdWxkIG5vdCBiZSBsb2FkZWQgYmVjYXVzZSBpdCBoYXMgZXJyb3JzIGFuZCBjYW4gbm90IGJlIGltcG9ydGVkIGFzIGEgcHJvamVjdC4gIENoZWNrIHRoZSBlcnJvciBsb2cgZm9yIGRldGFpbHMuCi1Nb2R1bGVNYXBwaW5nSW1wbF9VSV8wPXByb2plY3ROYW1lOiB7MH0KLVV0aWxpdHlKQVJNYXBwaW5nSW1wbF9VSV8wPXByb2plY3ROYW1lOiB7MH0sIHVyaTogezF9Ci1pbXBvcnRXcm9uZ1R5cGU9VGhlIHNwZWNpZmllZCBwcm9qZWN0IFwiIHswfSBcIiBpcyBub3QgdGhlIGNvcnJlY3QgSmF2YSBFRSB0eXBlLgotaW1wb3J0V3JvbmdWZXJzaW9uPVRoZSBzcGVjaWZpZWQgcHJvamVjdCBcIiB7MH0gXCIgaXMgbm90IEphdmEgRUUgdmVyc2lvbiBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBhcmNoaXZlLgotRUFSX1BST0pFQ1ROQU1FX1NBTUVBU19NT0RVTEU9VGhlIEVBUiBQcm9qZWN0IG5hbWUgY2Fubm90IGJlIHNhbWUgYXMgdGhlIFByb2plY3QgTmFtZS4KLQotCi0jSjJFRSBVdGlsaXR5IEltcG9ydCBzdHJpbmdzCi1KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb25fVUlfSW1wb3J0X1V0aWxpdHlfSmFycz1JbXBvcnQgVXRpbGl0eSBKYXJzCi1KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb25fVUlfUHJlcGFyaW5nX3RvX2ltcG9ydD1QcmVwYXJpbmcgdG8gaW1wb3J0IHV0aWxpdHkgamFycy4uLgotSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJXzI9UHJvYmxlbSBpbXBvcnRpbmcgVXRpbGl0eSBKYXIKLUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF8wPUludmFsaWQgcGF0aCBsb2NhdGlvbi4KLUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X1ZhbGlkX1Byb2plY3Q9UGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QuCi1KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxfU2VsZWN0X0phcj1QbGVhc2Ugc2VsZWN0IG9uZSBvciBtb3JlIFV0aWxpdHkgSmFycy4KLUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9TcGVjaWZ5X0xpbmtlZF9QYXRoPVBsZWFzZSBzcGVjaWZ5IGEgbm9uLWVtcHR5IHZhbHVlIGZvciB0aGUgTGlua2VkIFBhdGggVmFyaWFibGUgbmFtZS4KLUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbF9MaW5rZWRfUGF0aF9FeGlzdHM9QSBMaW5rZWQgUGF0aCBWYXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLiBcblRoZSBwYXRoIGhhcyBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCi1KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb25fVGhlcmVfd2VyZV9ub191dGlsaXR5X2phcnNfc2VsZWN0ZWQ9VGhlcmUgd2VyZSBubyB1dGlsaXR5IGphcnMgc2VsZWN0ZWQuCi0KLQotCi1DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbl9DYW5ub3RfbGlua191dGlsaXR5X2phcl9pbnRvX2FfY2xvc189Q2Fubm90IGxpbmsgdXRpbGl0eSBqYXIgaW50byBhIGNsb3NlZCBwcm9qZWN0LgotQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbl9Gb3VuZF9leGlzdGluZ19maWxlXzBfPUZvdW5kIGV4aXN0aW5nIGZpbGUgInswfSIuCi1DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbl9GaWxlX2FscmVhZHlfZXhpc3RzXzBfPUZpbGUgYWxyZWFkeSBleGlzdHNcOiAiezB9Ii4KLUNvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb25fQ29weWluZ19hcmNoaXZlX2ludG9fc2VsZWN0ZWRfcHJvamVfPUNvcHlpbmcgYXJjaGl2ZSBpbnRvIHNlbGVjdGVkIHByb2plY3RcOiAiezB9Ii4KLUNyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uX0NyZWF0aW5nX3Byb2plY3Rfd2l0aF9saW5rZWRfYXJjaGl2Xz1DcmVhdGluZyBwcm9qZWN0IHdpdGggbGlua2VkIGFyY2hpdmVcOiAiezB9Ii4KLUxpbmtBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb25fTGlua2luZ19hcmNoaXZlX2ludG9fc2VsZWN0ZWRfcHJvamVfPUxpbmtpbmcgYXJjaGl2ZSBpbnRvIHNlbGVjdGVkIHByb2plY3RcOiAiezB9Ii4KLUNyZWF0ZVByb2plY3RXaXRoRXh0cmFjdGVkSmFyT3BlcmF0aW9uX0NyZWF0ZV9wcm9qZWN0X3dpdGhfZXh0cmFjdGVkX2NvbnRlXz1DcmVhdGUgcHJvamVjdCB3aXRoIGV4dHJhY3RlZCBjb250ZW50c1w6ICJ7MH0iLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9lamJhcmNoaXZlb3BzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VqYmFyY2hpdmVvcHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiNjY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VqYmFyY2hpdmVvcHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIHN0cmluZyBmb3IgQXJjaGl2ZSBvcGVyYXRpb25zIG9mIEVBUnMsRUpCcyBhbmQgQXBwbGljYXRpb24gQ2xpZW50cy4KLQotQVJDSElWRV9PUEVSQVRJT05fU2F2ZU1vZlJlc291cmNlcz1FcnJvciBvY2N1cmVkIHNhdmluZyB0aGUgbWV0YWRhdGEgZmlsZS4KLUFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVGaWxlPUVycm9yIG9jY3VyZWQgc2F2aW5nIHRoZSBGaWxlLi4KLUFSQ0hJVkVfT1BFUkFUSU9OX1Byb2plY3ROYXR1cmU9RXJyb3IgZ2V0dGluZyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLi4KLUFSQ0hJVkVfT1BFUkFUSU9OX1NhdmVNYW5pZmVzdD1FcnJvciBvY2N1cmVkIHNhdmluZyB0aGUgbWFuaWZlc3QuLgotQVJDSElWRV9PUEVSQVRJT05fRmlsZU5vdEZvdW5kPUVycm9yOiBGaWxlIG5vdCBmb3VuZAotQVJDSElWRV9PUEVSQVRJT05fRmlsZUNvbnRlbnRzPUNvcmUgZXhjZXB0aW9uIGNhdWdodCBpbiBnZXR0dGluZyBmaWxlIGNvbnRlbnRzLi4KLUFSQ0hJVkVfT1BFUkFUSU9OX0Vycm9PY2N1cmVkPUVycm9yIG9jY3VyZWQuLi4KLUFSQ0hJVkVfT1BFUkFUSU9OX0ZpbGVzRnJvbVByb2plY3Q9VW5hYmxlIHRvIGdldCBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0Li4KLUFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlPUVycm9yIG9wZW5pbmcgYXJjaGl2ZSBmb3IgZXhwb3J0Li4KLUFSQ0hJVkVfT1BFUkFUSU9OX0ludmFsaWRFSkJKYXI9VGhlIEpBUiBmaWxlIGlzIG5vdCBhIHZhbGlkIEVKQiBKQVIKLUFSQ0hJVkVfT1BFUkFUSU9OX0ludmFsaWRJbXBvcnRFSkJKYXI9VGhlIGltcG9ydCBmaWxlIGlzIG5vdCBhIHZhbGlkIEVKQiBKQVIKLUFSQ0hJVkVfT1BFUkFUSU9OX0ltcG9ydE9wZXJhdGlvbj1JbXBvcnQgT3BlcmF0aW9uIEZhaWxlZCEKLUVKQl9JTVBPUlRfT1BFUkFUSU9OX1NUUklORz1JbXBvcnRpbmcgRUpCIEpBUi4uCi1FSkJfSU1QT1JUX0ZJTEVfU1RSSU5HPUltcG9ydGluZyBmaWxlLi4KLUlNUE9SVF9NT0ZSRVNPVVJDRV9TVFJJTkc9SW1wb3J0aW5nIG1ldGEtZGF0YS4uCi1JTVBPUlRfT1BFUkFUSU9OX1NUUklORz1JbXBvcnRpbmcgSkFSLi4KLUVSUk9SX0NPUFlJTkdfRklMRVNfRlJPTV9PUklHSU5BTF9KQVI9QW4gZXJyb3Igb2NjdXJyZWQgY29weWluZyBmaWxlcyBmcm9tIHRoZSBvcmlnaW5hbCBFSkIgSkFSIGZpbGUKLUVSUk9SX0lNUE9SVElOR19NT0RVTEVfRklMRT1FcnJvciBpbXBvcnRpbmcgTW9kdWxlIEZpbGUKLVllc19VST1ZZXMKLU5vX1VJPU5vCi1ZZXNfVG9fQWxsX1VJPVllcyB0byBBbGwKLUNhbmNlbF9VSV89Q2FuY2VsCi1FcnJvcl9leHBvcnRpbmdfX1VJXz1FcnJvciBleHBvcnRpbmcKLUVKQl9KYXJfRmlsZV9VSV89RUpCIEpBUiBGaWxlCi1Db3B5X0RlcF9KQVJTX1VJPUNvcHkgRGVwZW5kZW50IEpBUnMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJiOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIEoyRUUgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLSMgMTQtT2N0b2Jlci0yMDAxOgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRT1DSEtKMzAwOUU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi1uYW1lJycgZWxlbWVudCBpbiAgZWpiLXJlZjogezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFPUNIS0ozMDEwRTogSW4gbW9kdWxlIHsxfSwgJydlamItcmVmLXR5cGUnJyBlbGVtZW50IGluIGVqYi1yZWY6IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRT1DSEtKMzAxNEU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi10eXBlJycgZWxlbWVudCBpbiBlamItcmVmOiB7MH0gaXMgbWlzc2luZy4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRT1DSEtKMzAxMUU6IEluIG1vZHVsZSB7MX0sIEhvbWUgaW50ZXJmYWNlIGlzIG1pc3NpbmcgZnJvbSBlamItcmVmOiB7MH0gZWxlbWVudC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRlJFTU9URT1DSEtKMzAxMkU6IEluIG1vZHVsZSB7MX0sIFJlbW90ZSBpbnRlcmZhY2UgaXMgbWlzc2luZyBmcm9tIGVqYi1yZWY6IHswfSBlbGVtZW50LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRT1DSEtKMjgyN1c6ICcnc2VjdXJpdHktcm9sZS1yZWYnJyBlbGVtZW50IHswfSBkZWZpbmVzIHRoZSAnJ3JvbGUtbGluaycnIGVsZW1lbnQgYnV0IG5vICcnc2VjdXJpdHktcm9sZScnIGVsZW1lbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXNjcmlwdG9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU1JFRj1DSEtKMzAxM0U6IER1cGxpY2F0ZSAnJ3Jlc291cmNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIG5ldyBzdHJpbmcgYWRkZWQgZm9yIHZlcnNpb24gNSBXU0FECi1VTlJFU09MVkVEX0VKQl9SRUZfV0FSTl89SVdBRTAwMzRXIEVKQiBsaW5rIGVsZW1lbnQgezB9IGlzIHVucmVzb2x2YWJsZSBpbiBtb2R1bGUgezF9IGFuZCBFQVIgezJ9LgotCi1FUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUY9Q0hLSjMwMTVFOiBEdXBsaWNhdGUgJydzZXJ2aWNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUY9Q0hLSjMwMTZFOiBEdXBsaWNhdGUgJydzZWN1cml0eSByb2xlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUY9Q0hLSjMwMTdFOiBEdXBsaWNhdGUgJydlamItcmVmJycgZWxlbWVudCBuYW1lZCB7MH0uCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU0VOVlJFRj1DSEtKMzAxOEU6IER1cGxpY2F0ZSAnJ3Jlc291cmNlIGVudmlyb25tZW50LXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGPUNIS0ozMDE5RTogRHVwbGljYXRlICcnbWVzc2FnZSBkZXN0aW5hdGlvbi1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT049TWVzc2FnZSBkZXN0aW5hdGlvbiBsaW5rICcnezB9JycgZm9yIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmICcnezF9JycgaXMgdW5yZXNvbHZhYmxlIGluIG1vZHVsZSAnJ3syfScnIGFuZCBFQVIgJyd7M30nJy4KLUVSUk9SX1VOUkVTT0xWRURfTURCX01JU1NJTkdfTUVTU0FHRV9ERVNUSU5BVElPTj1NZXNzYWdlIGRlc3RpbmF0aW9uIGxpbmsgJyd7MH0nJyBvZiBNREIgJyd7MX0nJyBpcyB1bnJlc29sdmFibGUgaW4gbW9kdWxlICcnezJ9JycgYW5kIEVBUiAnJ3szfScnLgotRVJST1JfRUFSX01JU1NJTkdfRU1QVFlfTUVTU1NBR0VERVNUSU5BVElPTj1NZXNzYWdlIGRlc3RpbmF0aW9uIGxpbmsgaXMgZW1wdHkgZm9yIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmICcnezB9JycgaW4gbW9kdWxlICcnezF9JycgYW5kIEVBUiAnJ3syfScnLgotRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5EPVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgdGhlIG1vZHVsZSAnJ3swfScnIGNhbm5vdCBiZSBsb2FkZWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWVfY29tbW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWVfY29tbW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzM3MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVlX2NvbW1vbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FUlJfU0VDVVJJVFlfUk9MRV9FTVBUWT1UaGUgcm9sZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9TRUNVUklUWV9ST0xFX0VYSVNUPVRoZSBzZWN1cml0eSByb2xlIG5hbWVkICJ7MH0iIGFscmVhZHkgZXhpc3RzLgotRVJSX0pBVkFfQ0xBU1NfTkFNRV9FTVBUWT1UaGUgY2xhc3MgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFWQV9DTEFTU19OQU1FX0VYSVNUPVRoZSBjbGFzcyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcGFja2FnZS4KLUVSUl9KQVZBX0NMQVNTX0ZJTEVfTkFNRV9FWElTVD1GaWxlIHdpdGggc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBleGlzdHMuCi1FUlJfSkFWQV9DTEFTU19GT0xERVJfTkFNRV9FTVBUWT1UaGUgc291cmNlIGZvbGRlciBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFWQV9DTEFTU19GT0xERVJfUFJPSkVDVF9OT1RfT1BFTj1UaGUgcHJvamVjdCBpcyBub3Qgb3Blbi4KLUVSUl9KQVZBX0NMQVNTX05PVF9KQVZBX1BST0pFQ1Q9Tm90IGEgSmF2YSBwcm9qZWN0LgotRVJSX0pBVkFfQ0xBU1NfRk9MREVSX1NUQVRJQ19QUk9KRUNUPUNhbm5vdCBiZSBhIHN0YXRpYyB3ZWIgcHJvamVjdC4KLUVSUl9KQVZBX0NMQVNTX0ZPTERFUl9OT1RfU09VUkNFPU5vdCBhIEphdmEgc291cmNlIGZvbGRlci4KLUVSUl9KQVZBX0NMQVNTX05BTUVfUVVBTElGSUVEPURvIG5vdCB1c2UgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi1FUlJfSkFWQV9DTEFTU19OQU1FX0lOVkFMSUQ9SW52YWxpZCBKYXZhIGNsYXNzIG5hbWU6IAotRVJSX0pBVkFfQ0xBU1NfTkFNRV9XQVJOSU5HPVdhcm5pbmc6IAotRVJSX0pBVkFfQ0xBU1NfU1VQRVJDTEFTU19OT1RfRVhJU1Q9VGhlIHN1cGVyIGNsYXNzIGRvZXMgbm90IGV4aXN0LgotRVJSX0pBVkFfQ0xBU1NfU1VQRVJDTEFTU19GSU5BTD1UaGUgc3VwZXIgY2xhc3MgY2Fubm90IGJlIGEgZmluYWwgY2xhc3MuCi1FUlJfVFlQRV9ESUZGRVJFTlRfQ0FTRV9FWElTVD1UeXBlICcnezB9JycgYWxyZWFkeSBleGlzdHMgd2l0aCBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBjYXNlLgotRVJSX1RZUEVfQUxSRUFEWV9FWElTVD1UeXBlICcnezB9JycgYWxyZWFkeSBleGlzdHMuCi1FUlJfSkFWQV9QQUNBS0dFX05BTUVfSU5WQUxJRD1JbnZhbGlkIEphdmEgcGFja2FnZSBuYW1lOiAKLUVSUl9KQVZBX1BBQ0tBR0VfTkFNRV9XQVJOSU5HPVdhcm5pbmc6IAotRVJSX0JPVEhfRklOQUxfQU5EX0FCU1RSQUNUPUNsYXNzIGNhbm5vdCBiZSBib3RoIGZpbmFsIGFuZCBhYnN0cmFjdC4KLVdlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3JfVUlfMD1HZW5lcmljIEphdmEgRUUgQ29udGFpbmVyCi1FUlJfU0VDVVJJVFlfUk9MRV9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIHNlY3VyaXR5IHJvbGVzIHRvIGJlIHJlbW92ZWQgY2Fubm90IGJlIGVtcHR5LgotCi1FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0VYSVNUPVRoZSBzb3VyY2UgZm9sZGVyIGRvZXMgbm90IGV4aXN0LgotCi1FUlJfRU1QVFlfTU9EVUxFX05BTUU9TW9kdWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VNUFRZX1BST0pFQ1RfTkFNRT1Qcm9qZWN0IGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9QUk9KRUNUX0lOQUNDRVNTSUJMRT1Qcm9qZWN0ICJ7MH0iIGlzIG1pc3Npbmcgb3IgaW5hY2Nlc3NpYmxlLgotRVJSX1BST0pFQ1RfTkFNRV9FWElTVFM9UHJvamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX1ZFUlNJT05fTk9UX1NVUFBPUlRFRD1UaGlzIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotRVJSX05PVF9TVVBQT1JURUQ9Tm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05PVF9BQlNPTFVURT1Tb3VyY2UgZm9sZGVyIHBhdGggbXVzdCBiZSBhIHdvcmtzcGFjZSByZWxhdGl2ZSBhYnNvbHV0ZSBwYXRoLgotRVJSX05PX01PREVMX1BST1ZJREVSX0ZPUl9QUk9KRUNUPU5vIElNb2RlbFByb3ZpZGVyIGV4aXN0cyBmb3IgcHJvamVjdCB7MH0gb2YgdmVyc2lvbjogezF9Ci1FUlJfTk9fTU9ERUxfUFJPVklERVJfRk9SX1ZJUlRVQUxfQ09NUE9ORU5UPU5vIElNb2RlbFByb3ZpZGVyIGV4aXN0cyBmb3IgdmlydHVhbCBjb21wb25lbnQgezB9IG9mIHZlcnNpb246IHsxfQotCi1KMkVFX01PRFVMRV9DTEFTU1BBVEhfQ09OVEFJTkVSX05BTUU9RUFSIExpYnJhcmllcwotCi1DTEFTU1BBVEhfRU5UUllfREVQRU5ERU5DWV9QUkVGSVg9KENsYXNzcGF0aCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvajJlZWNyZWF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWVjcmVhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTU3ZjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvajJlZWNyZWF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DcmVhdGluZ19fVUlfPUNyZWF0aW5nOgotRXJyb3JfY3JlYXRpbmdfYW5fRUFSX3Byb2pfVUlfPUVycm9yIGNyZWF0aW5nIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4KLUpka0phckZpbGVEb2VzTm90RXhpc3RfVUk9VGhlIGZpbGUgezB9IGRvZXMgbm90IGV4aXN0LgotQVBQX1BST0pFQ1RfRVJST1JfRVhDXz1JV0FFMDAwMUUgQW4gZXJyb3Igb2NjdXJyZWQgYWNjZXNzaW5nIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi1VTktOT1dOX1VJXz0/PwotQ3JlYXRpbmdfSmF2YV9Qcm9qZWN0X1VJXz1DcmVhdGluZyBKYXZhIFByb2plY3QKLUVycm9yc19vY2N1cnJlZF9kZWxldGluZ19tb2R1bGVfZGVwZW5kZW5jaWVzX1VJXz1FcnJvcnMgb2NjdXJyZWQgZGVsZXRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcy4KLUNhbl9ub3RfcmVtb3ZlX21vZHVsZV9kZXBlbmRlbmN5X2Zyb21fcHJvamVjdF9VSV89Q2FuIG5vdCByZW1vdmUgbW9kdWxlIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHswfSBiZWNhdXNlIHRoZSBwcm9qZWN0IGlzIGJpbmFyeS4KLUVycm9yc19vY2N1cnJlZF9yZW5hbWluZ19tb2R1bGVfZGVwZW5kZW5jaWVzX1VJXz1FcnJvcnMgb2NjdXJyZWQgcmVuYW1pbmcgbW9kdWxlIGRlcGVuZGVuY2llcy4KLUNhbl9ub3RfcmVuYW1lX21vZHVsZV9kZXBlbmRlbmN5X2Zyb21fcHJvamVjdF9VSV89Q2FuIG5vdCByZW5hbWUgbW9kdWxlIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHswfSBiZWNhdXNlIHRoZSBwcm9qZWN0IGlzIGJpbmFyeS4KLQotSjJFRV9QUk9KRUNUX01JR1JBVElPTl9USVRMRV9VSV89SjJFRSBQcm9qZWN0IE1pZ3JhdGlvbgotRU5URVJQUklTRV9BUFBMSUNBVElPTlNfVUlfPUVudGVycHJpc2UgQXBwbGljYXRpb25zCi1XSVpfQkFOX0RFU0NfVUlfPVNlbGVjdCB0aGUgezB9IHByb2plY3RzIHRvIGJlIG1pZ3JhdGVkLiAgSWYgbmVlZGVkLCB0aGUgcHJvamVjdCBzdHJ1Y3R1cmVzIHdpbGwgYmUgbWlncmF0ZWQuCi1FTlRFUlBSSVNFX0FQUF9QUk9KRUNUU19VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czoKLU1JR1JBVEVfSjJFRV9TUEVDX1VJXz1NaWdyYXRlIHByb2plY3QgZnJvbSB2ZXJzaW9uIGxldmVsIEphdmEgRUUgMS4yIHRvIEphdmEgRUUgMS4zCi1NSUdSQVRFX0VKQl9TUEVDX1VJXz1NaWdyYXRlIHByb2plY3QgZnJvbSB2ZXJzaW9uIGxldmVsIEVKQiAxLjEgdG8gRUpCIDIuMAotTUlHUkFURV9NT0RVTEVfUFJPSkVDVFNfVUlfPU1pZ3JhdGUgbW9kdWxlIHByb2plY3RzCi1BUFBMSUNBVElPTl9DTElFTlRTX1VJXz1BcHBsaWNhdGlvbiBDbGllbnRzCi1BUFBMSUNBVElPTl9DTElFTlRfUFJPSkVDVFNfVUlfPUFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czoKLUVOVEVSUFJJU0VfQkVBTlNfQkFOX1VJXz1FbnRlcnByaXNlIEJlYW5zCi1FSkJfUFJPSkVDVFNfVUlfPUVKQiBwcm9qZWN0czoKLUFERF9MT0NBTF9DTElFTlRfVklFV1NfQ0hFQ0tfVUlfPUFkZCBsb2NhbCBjbGllbnQgdmlld3MKLU1JR1JBVEVfQ01QX0JFQU5TX1VJXz1NaWdyYXRlIENNUCAxLjEgYmVhbnMgdG8gQ01QIDIuMCBiZWFucwotQUREX0xPQ0FMX0NMSUVOVF9WSUVXU19CQU5fVUlfPUFkZCBMb2NhbCBDbGllbnQgVmlld3MKLVNFTEVDVF9FSkJfQ0xJRU5UX1ZJRVdTX1VJXz1TZWxlY3QgdGhlIGVudGVycHJpc2UgYmVhbnMgdGhhdCB3aWxsIGhhdmUgbG9jYWwgY2xpZW50IHZpZXdzIGFkZGVkLgotRU5URVJQUklTRV9CRUFOU19MSVNUX1VJXz1FbnRlcnByaXNlIGJlYW5zOgotREVMRVRFX1JFTV9DTElFTlRfVklFV1NfVUlfPURlbGV0ZSByZW1vdGUgY2xpZW50IHZpZXdzCi1MT0NBTF9DTElFTlRfVklFV19TQ0hFTUVfVUlfPUxvY2FsIGNsaWVudCB2aWV3IG5hbWluZyBzY2hlbWU6Ci1SRVVTRV9ERUxFVEVEX0NMSUVOVF9WSUVXX05BTUVfVUlfPVJldXNlIHRoZSBkZWxldGVkIHJlbW90ZSBjbGllbnQgdmlldyBuYW1lCi1TUEVDSUZZX1NVRkZJWF9VSV89U3BlY2lmeSBzdWZmaXg6Ci1TVUZGSVhfRVhBTVBMRV9VSV89KEZvciBleGFtcGxlLCBlbnRlcnByaXNlIGJlYW4gXCdmb29cJyB3aWxsIGhhdmUgbG9jYWwgY2xpZW50IHZpZXdzIG5hbWVkOiBcJ2Zvb0xvY2FsXCcgYW5kIFwnZm9vTG9jYWxIb21lXCcuKQotTUlHUkFUSU9OX1NVQ0NFU1NfUkVQT1JUX1VJXz1NaWdyYXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgotTUlHUkFUSU9OX1dBUk5JTkdTX1JFUE9SVF9VSV89TWlncmF0aW9uIGZpbmlzaGVkIHdpdGggd2FybmluZ3M7IHNlZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMuCi1NSUdSQVRJT05fRVJST1JTX1JFUE9SVF9VSV89TWlncmF0aW9uIGZpbmlzaGVkIHdpdGggZXJyb3JzOyBzZWUgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotUFJPSkVDVF9TVFJVQ1RVUkVfU1VDQ0VTU19VSV89UHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIHN1Y2Nlc3NmdWw6IHswfS4KLVBST0pFQ1RfU1RSVUNUVVJFX0ZBSUxFRF9VSV89UHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIGZhaWxlZDogezB9LgotUFJPSkVDVF9OT1RfTkVFRF9NSUdSQVRJT05fVUlfPVByb2plY3Qgc3RydWN0dXJlIGRpZCBub3QgbmVlZCBtaWdyYXRpb246IHswfS4KLUoyRUVfVkVSU0lPTl9TVUNDRVNTX1VJXz1KMkVFIHZlcnNpb24gbGV2ZWwgbWlncmF0aW9uIHN1Y2Nlc3NmdWw6IHswfS4KLUoyRUVfVkVSU0lPTl9GQUlMRURfVUlfPUoyRUUgdmVyc2lvbiBsZXZlbCBtaWdyYXRpb24gZmFpbGVkOiB7MH0uCi1KMkVFX1ZFUlNJT05fTk9UX05FRURfTUlHUkFUSU9OX1VJXz1KMkVFIHZlcnNpb24gbGV2ZWwgZGlkIG5vdCBuZWVkIG1pZ3JhdGlvbjogezB9LgotTE9DQUxfQ0xJRU5UX0FERF9TVUNDRVNTX1VJXz1Mb2NhbCBjbGllbnQgdmlld3MgYWRkZWQgc3VjY2Vzc2Z1bGx5OiB7MH0uCi1MT0NBTF9DTElFTlRfQUREX0ZBSUxFRF9VSV89TG9jYWwgY2xpZW50IHZpZXdzIGZhaWxlZCBvbiBhZGQ6IHswfS4KLUxPQ0FMX0NMSUVOVF9WSUVXU19FWElTVF9VSV89TG9jYWwgY2xpZW50IHZpZXdzIGFscmVhZHkgZXhpc3Q6IHswfS4KLVJFTU9URV9DTElFTlRfREVMRVRFX1NVQ0NFU1NfVUlfPVJlbW90ZSBjbGllbnQgdmlld3MgZGVsZXRlZCBzdWNjZXNzZnVsbHk6IHswfS4KLVJFTU9URV9DTElFTlRfREVMRVRFX0ZBSUxFRF9VSV89UmVtb3RlIGNsaWVudCB2aWV3cyBmYWlsZWQgb24gZGVsZXRlOiB7MH0uCi1SRU1PVEVfQ0xJRU5UX1ZJRVdTX05PVF9FWElTVF9VSV89UmVtb3RlIGNsaWVudCB2aWV3cyBkaWQgbm90IGV4aXN0OiB7MH0uCi1KQVJfMTFfSU1QT1JUXzIwX1VJXz1UaGUgMS4xIEpBUiBpcyBiZWluZyBpbXBvcnRlZCBpbnRvIGFuIEVKQiAyLjAgbW9kdWxlLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB3aWxsIGJlIGNvbnZlcnRlZCwgYnV0IHRoZSBDTVAgYmVhbnMgcmVtYWluIHZlcnNpb24gMS4xLgotQ01QXzExX0lNUE9SVF8yMF9VSV89VGhlIGZvbGxvd2luZyBDTVAgMS4xIGJlYW5zIGFyZSBiZWluZyBpbXBvcnRlZCBpbnRvIGFuIEVKQiAyLjAgbW9kdWxlLiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHdpbGwgYmUgY29udmVydGVkLCBidXQgdGhlIENNUCBiZWFucyByZW1haW4gdmVyc2lvbiAxLjEuCi1PTERfUFJPSkVDVF9TVFJVQ1RVUkVfVUlfPVRoZSBKMkVFIHByb2plY3QgezB9IGhhcyBhbiBvbGQgcHJvamVjdCBzdHJ1Y3R1cmUsIGFuZCBzaG91bGQgYmUgbWlncmF0ZWQuCi1QUk9KRUNUX01VU1RfQkVfU0VMRUNURURfVUlfPUEgezB9IHByb2plY3QgbXVzdCBiZSBzZWxlY3RlZC4KLUVOVEVSUFJJU0VfQVBQTElDQVRJT05fVUlfPWVudGVycHJpc2UgYXBwbGljYXRpb24KLUFQUExJQ0FUSU9OX0NMSUVOVF9VSV89YXBwbGljYXRpb24gY2xpZW50Ci1FSkJfVUlfPUVKQgotV0VCX1VJXz1XRUIKLUVKQl9NVVNUX0JFX1NFTEVDVEVEX1VJXz1BbiBlbnRlcnByaXNlIGJlYW4gbXVzdCBiZSBzZWxlY3RlZC4KLU1JR1JBVEVfVUlfPU1pZ3JhdGUuLi4KLU1JR1JBVEVfSjJFRV9QUk9KRUNUU19VSV89TWlncmF0ZSBKYXZhIEVFIFByb2plY3RzLi4uCi1PUEVOX0oyRUVfTUlHUkFUSU9OX1dJWkFSRF9VSV89T3BlbiBKYXZhIEVFIE1pZ3JhdGlvbiBXaXphcmQuLi4KLU1JR1JBVElOR19QUk9KRUNUX1NUUlVDVFVSRVNfVUlfPU1pZ3JhdGluZyBwcm9qZWN0IHN0cnVjdHVyZS4uLgotTUlHUkFUSU5HX0oyRUVfVkVSU0lPTl9VSV89TWlncmF0aW5nIHByb2plY3QgSmF2YSBFRSB2ZXJzaW9uIGxldmVsLi4uCi1BRERJTkdfTE9DQUxfQ0xJRU5UX1ZJRVdTX1VJXz1BZGRpbmcgbG9jYWwgY2xpZW50IHZpZXdzLi4uCi1ERUxFVElOR19SRU1PVEVfQ0xJRU5UX1ZJRVdTX1VJXz1EZWxldGluZyByZW1vdGUgY2xpZW50IHZpZXdzLi4uCi1NSUdSQVRJT05fTk9UX05FRURFRF9SRVBPUlQ9TWlncmF0aW9uIHdhcyBub3QgbmVlZGVkIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMuCi1NSUdSQVRJT05fTk9UX1BPU1NJQkxFX1JFUE9SVD1NaWdyYXRpb24gd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHNlbGVjdGVkIGl0ZW1zLgotU09VUkNFX0ZPTERFUl9SRU5BTUVfRkFJTEVEPVVuYWJsZSB0byByZW5hbWUgdGhlIEphdmEgc291cmNlIGZvbGRlciB7MH0uCi1TT1VSQ0VfRk9MREVSX1JFTkFNRV9TS0lQUEVEPVRoZSBKYXZhIHNvdXJjZSBmb2xkZXJzIGFyZSBub3QgcmVuYW1lZCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlci4KLVdFQkNPTlRFTlRfRk9MREVSX1JFTkFNRV9GQUlMRUQ9VW5hYmxlIHRvIHJlbmFtZSB0aGUgd2ViIGNvbnRlbnQgZm9sZGVyIHswfS4KLVdFQkNPTlRFTlRfRk9MREVSX1JFTkFNRV9TS0lQUEVEPVRoZSB3ZWIgY29udGVudCBmb2xkZXIgezB9IG5vdCByZW5hbWVkLgotV0VCUFJPSkVDVF9WRVJTSU9OX01JR1JBVEVfRkFJTEVEPVVuYWJsZSB0byBtaWdyYXRlIHRoZSB3ZWIgcHJvamVjdCB2ZXJzaW9uLgotQUJTX1BBVEhTX0FQUF9FWFRfUkVNT1ZFRD1BYnNvbHV0ZSBwYXRocyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9ucyBmaWxlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0uCi1QUk9KRUNUX1JFRkVSRU5DRVNfVVBEQVRFRD1Qcm9qZWN0IHJlZmVyZW5jZXMgd2VyZSB1cGRhdGVkIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0uCi1QUk9KRUNUX0NMQVNTUEFUSF9VUERBVEVEPVByb2plY3QgSmF2YSBidWlsZCBwYXRoIHdhcyB1cGRhdGVkIGZvciBwcm9qZWN0IHswfS4KLUZBSUxFRF9NSUdSQVRJTkdfSU1QT1JURURfQ0xBU1NFUz1VbmFibGUgdG8gbWlncmF0ZSB0aGUgaW1wb3J0ZWRfY2xhc3NlcyBKQVIgZmlsZS4gIEV4Y2VwdGlvbjogezB9Ci1FWFRSQUNURURfSU1QT1JURURfQ0xBU1NFUz1JbXBvcnRlZCBjbGFzc2VzIHdlcmUgZXh0cmFjdGVkIGZyb20gZmlsZSB7MH0uCi1JTVBPUlRFRF9DTEFTU0VTX0ZJTEVfREVMRVRFRD1JbXBvcnRlZCBjbGFzc2VzIGZpbGUgezB9IHdhcyBkZWxldGVkLgotQkFDS0VORF9NSUdSQVRJT05fRkFJTEVEPVVuYWJsZSB0byBtaWdyYXRlIHRoZSBNYXAgYW5kIFNjaGVtYSBmaWxlIHN0cnVjdHVyZSBpbiBwcm9qZWN0IHswfQotQklOQVJZX01JR1JBVElPTl9GQUlMRUQ9VW5hYmxlIHRvIG1pZ3JhdGUgYmluYXJ5IHByb2plY3QgezB9LgotQ09NUExFVEVEX0JBQ0tFTkRfTUlHPVRoZSBiYWNrZW5kIChNYXAgYW5kIFNjaGVtYSkgbWV0YS1kYXRhIG9mIHRoZSB7MH0gcHJvamVjdCBtaWdyYXRlZCBzdWNjZXNzZnVsbHkuCi1OT1RfTkVFREVEX0RFUExPWU1FTlRfREVTQ19NSUc9VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm9qZWN0IHswfS4KLU5PVF9ORUVERURfQkFDS0VORF9NSUc9VGhlIG9sZCBiYWNrZW5kIChNYXAgYW5kIFNjaGVtYSkgc3RydWN0dXJlIHdhcyBub3QgZm91bmQgaW4gdGhlIHByb2plY3QgezB9LgotTUlHUkFUSU9OX0NPTVBMRVRFPU1pZ3JhdGlvbiBDb21wbGV0ZQotTUlHUkFUSU9OX0VSUk9SUz1NaWdyYXRpb24gRXJyb3JzCi1NSUdSQVRJT05fTk9UX05FRURFRD1NaWdyYXRpb24gTm90IE5lZWRlZAotQ09ORklSTUFUSU9OX1RJVExFPUNvbmZpcm0gTWlncmF0aW9uCi1PUEVOX0VESVRPUlNfVElUTEU9T3BlbiBFZGl0b3JzCi1DT05GSVJNX01JR1JBVEVfUFJPSkVDVF9TVFJVQ1RVUkU9VGhpcyB3aWxsIG1pZ3JhdGUgdGhlIHByb2plY3Qgc3RydWN0dXJlIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMgdG8gdGhlIGxhdGVzdCBmb3JtYXQuICBDb250aW51ZT8KLUNPTkZJUk1fTUlHUkFURV9KMkVFXzEzPVRoaXMgd2lsbCBtaWdyYXRlIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBmb3IgdGhlIHNlbGVjdGVkIGl0ZW1zIGlmIG5lY2Vzc2FyeSwgYW5kIG1pZ3JhdGUgdGhlIEphdmEgRUUgdmVyc2lvbiBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgZnJvbSAxLjIgdG8gMS4zLiAgQ29udGludWU/Ci1JTkZPUk1fT1BFTl9FRElUT1JTPU9wZW4gZWRpdG9ycyBleGlzdCBpbiB0aGUgd29ya2JlbmNoLiAgUGxlYXNlIGNsb3NlIGFsbCBlZGl0b3JzIGJlZm9yZSBydW5uaW5nIG1pZ3JhdGlvbi4KLVdFQkNPTlRFTlRfTElCUEFUSF9VUERBVEVfRkFJTEVEPVVuYWJsZSB0byByZW1vdmUgSkFSIGZpbGUgZnJvbSBjbGFzc3BhdGguCi1GQUlMRURfREVQTE9ZX0RFTEVURT1GYWlsZWQgZGVsZXRpbmcgZGVwbG95IGNvZGUgaW4gezB9IHByb2plY3QuCi1DT01QTEVURURfREVQTE9ZX0RFTEVURT1Db21wbGV0ZWQgZGVsZXRlIG9mIGRlcGxveSBjb2RlIGluIHswfSBwcm9qZWN0LgotRkFJTEVEX0xPQ0FMX0NMSUVOVF9DUkVBVEU9RmFpbGVkIGNyZWF0aW5nIGxvY2FsIGNsaWVudCB2aWV3IGZvciB7MH0uCi1DT01QTEVURURfTE9DQUxfQ0xJRU5UX0NSRUFURT1Db21wbGV0ZWQgY3JlYXRpb24gb2YgYSBsb2NhbCBjbGllbnQgdmlldyBmb3IgezB9LgotQ09NUExFVEVEX0NNUDIwX0NPREVHRU49Q29tcGxldGVkIENNUCAyLjAgY29kZSBnZW5lcmF0aW9uIGluIHswfSBwcm9qZWN0LgotTE9DQUxfQ0xJRU5UX05PVF9ORUVERUQ9QSBsb2NhbCBjbGllbnQgdmlldyB3YXMgbm90IGNyZWF0ZWQgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIGZvciB7MH0uCi1JTlZBTElEX1NFTEVDVElPTl9USVRMRT1JbnZhbGlkIFNlbGVjdGlvbgotSU5GT1JNX1BST1BFUl9TRUxFQ1RJT049U2VsZWN0aW9uIG11c3QgYmUgb25lIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBvciBhbnkgY29tYmluYXRpb24gb2YgRUpCLCB3ZWIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHByb2plY3RzLgotUkVRVUlSRURfQ0xJRU5UX1ZJRVdfVElUTEU9Q2xpZW50IFZpZXcgUmVxdWlyZWQKLUNPTkZJUk1fQ0xJRU5UX1ZJRVdfUkVRVUlSRUQ9VGhlIGZvbGxvd2luZyBiZWFucyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBjbGllbnQgdmlld3MgYmVjYXVzZSBvZiBpbmhlcml0YW5jZSBvciByZWxhdGlvbnNoaXAgcnVsZXMuICBUaGVzZSBiZWFucyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgYW5kIGNsaWVudCB2aWV3cyB3aWxsIGJlIGdlbmVyYXRlZC4KLUZJTEVTX09VVF9PRl9TWU5DPUNhbm5vdCBtaWdyYXRlIGJlY2F1c2Ugc29tZSByZXNvdXJjZXMgYXJlIG91dC1vZi1zeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtIGluIHByb2plY3QgezB9LiAgUmVmcmVzaCB0aGUgcHJvamVjdCBhbmQgdHJ5IGFnYWluLgotRGVsZXRlTW9kdWxlT3BlcmF0aW9uX1VJXzA9Tm8gUHJvamVjdHMgdG8gZGVsZXRlCi1SZXNvdXJjZVJlZmVyZW5jZURhdGFNb2RlbF9VSV8wPVR5cGUgbXVzdCBiZSBpbmRpY2F0ZWQuCi1SZXNvdXJjZVJlZmVyZW5jZURhdGFNb2RlbF9VSV8xPUF1dGhlbnRpY2F0aW9uIG11c3QgYmUgaW5kaWNhdGVkLgotUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzM9Tm8gT3duZXIgZm9yIHRoZSByZWZlcmVuY2UgaGFzIGJlZW4gaW5kaWNhdGVkLgotUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzU9UmVmZXJlbmNlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzY9UmVmZXJlbmNlIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1TZXJ2aWNlUmVmZXJlbmNlRGF0YU1vZGVsX0VSUk9SXzg9SVdBRTAwNDFFIEEgdGFyZ2V0IFdlYiBTZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQuCi1FSkJSZWZlcmVuY2VEYXRhTW9kZWxfVUlfMTA9U2VsZWN0ZWQgdGFyZ2V0IEVKQiBkb2VzIG5vdCBoYXZlIGxvY2FsIGludGVyZmFjZXMuCi1FSkJSZWZlcmVuY2VEYXRhTW9kZWxfVUlfMTE9U2VsZWN0ZWQgdGFyZ2V0IEVKQiBkb2VzIG5vdCBoYXZlIHJlbW90ZSBpbnRlcmZhY2VzLgotRUpCUmVmZXJlbmNlRGF0YU1vZGVsX1VJXzEyPVRhcmdldCBiZWFuIG11c3QgYmUgc2VsZWN0ZWQuCi1Qb3J0Q29tcG9uZW50UmVmZXJlbmNlRGF0YU1vZGVsX0VSUk9SXzQ9SVdBRTAwNDJFIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG11c3QgYmUgaW5kaWNhdGVkLgotTWVzc2FnZURlc3RSZWZlcmVuY2VEYXRhTW9kZWxfNz1UeXBlIG11c3QgYmUgaW5kaWNhdGVkLgotTWVzc2FnZURlc3RSZWZlcmVuY2VEYXRhTW9kZWxfOD1Vc2FnZSBtdXN0IGJlIGluZGljYXRlZC4KLU1lc3NhZ2VEZXN0UmVmZXJlbmNlRGF0YU1vZGVsXzk9TGluayBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gRUFSLgotUmVzb3VyY2VFbnZpcm9ubWVudFJlZmVyZW5jZURhdGFNb2RlbF8yPVR5cGUgbXVzdCBiZSBzZWxlY3RlZC4KLVJlbmFtZU1vZHVsZU9wZXJhdGlvbl9VSV8wPU5vIFByb2plY3RzIHRvIHJlbmFtZS4KLVNlcnZlclRhcmdldERhdGFNb2RlbF9VSV83PVRoZXJlIGFyZSBubyBhdmFpbGFibGUgdGFyZ2V0IHNlcnZlcnMuCi1TZXJ2ZXJUYXJnZXREYXRhTW9kZWxfVUlfOD1BIHRhcmdldCBzZXJ2ZXIgbXVzdCBiZSBzZXQuCi1TZXJ2ZXJUYXJnZXREYXRhTW9kZWxfVUlfOT1JbnZhbGlkIHRhcmdldCBzZXJ2ZXIgc2VsZWN0ZWQuCi1JbnZhbGlkQ2hhcnNFcnJvcj1JbnZhbGlkIGNoYXJhY3RlciAjLgotUmVtb3RlX2Nhbm5vdF9iZV9lbXB0eV9VSV89UmVtb3RlIGludGVyZmFjZSBjYW5ub3QgYmUgZW1wdHkuCi1Ib21lX2Nhbm5vdF9iZV9lbXB0eV9VSV89SG9tZSBpbnRlcmZhY2UgY2Fubm90IGJlIGVtcHR5LgotTG9jYWxfaG9tZV9jYW5ub3RfYmVfZW1wdHlfVUlfPUxvY2FsIGhvbWUgaW50ZXJmYWNlIGNhbm5vdCBiZSBlbXB0eS4KLUxvY2FsX2Nhbm5vdF9iZV9lbXB0eV9VSV89TG9jYWwgaW50ZXJmYWNlIGNhbm5vdCBiZSBlbXB0eS4KLQotVVNFX1JFTU9URV9GT1JfRElGRkVSRU5UX0VBUj1CZXN0IHByYWN0aWNlIGlzIHRvIGNyZWF0ZSAncmVtb3RlJyByZWZlcmVuY2UgZm9yIGFuIEVKQiBpZiBpdCdzIGluIGRpZmZlcmVudCBFQVIuCi1VU0VfTE9DQUxfRk9SX0RJRkZFUkVOVF9FQVI9QmVzdCBwcmFjdGljZSBpcyB0byBjcmVhdGUgJ2xvY2FsJyByZWZlcmVuY2UgZm9yIGFuIEVKQiBpZiBpdHMgaW4gc2FtZSBFQVIuCi1UQVJHRVRfQUxTT19FWElTVF9JTl9TQU1FX0VBUj1UaGUgc2VsZWN0ZWQgIEVKQiB3YXMgZGV0ZWN0ZWQgaW4gJyd7MH0nJyBFQVIgd2hpY2ggY29udGFpbnMgdGhlICcnezF9JycgbW9kdWxlIHByb2plY3QgLiBEaWQgeW91IG1lYW4gdG8gc2VsZWN0IHRoZSBFSkIgZnJvbSB0aGUgJyd7MH0nJyBFQVI/Ci1BUFBfQ0xJRU5UX09OTFlfSEFWRV9SRU1PVEU9QXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSBjYW4gb25seSBoYXZlIHJlbW90ZSByZWZlcmVuY2VzLgotSjJFRV8xXzJfT05MWV9IQVZFX1JFTU9URT1KMkVFIDEuMiBtb2R1bGVzIGNhbiBvbmx5IGhhdmUgcmVtb3RlIHJlZmVyZW5jZXMuCi1DT01QT05FTlRfQUxSRUFEWUlORUFSPVRoZSBzcGVjaWZpZWQgY29tcG9uZW50IG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgRUFSLgotVkVSU0lPTl9OT1RfU1VQUE9SVEVEPVRoZSBzZWxlY3RlZCBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgdGhlIHZlcnNpb24gb2YgdGhlIGFyY2hpdmUuIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVld3RwcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWV3dHBwbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNjAwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWV3dHBwbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ291bGRfbm90X2ZpbmRfcm9vdF9vYmplY3RfRVJST1JfPUlXQUUwMDAxRSBDb3VsZCBub3QgZmluZCByb290IG9iamVjdCBpbiByZXNvdXJjZTogezB9Ci1Bbl9lcnJvcl9vY2N1cnJlZF93aGlsZV9zYV9FUlJPUl89SVdBRTAwMDJFIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZy4KLUNhbm5vdF9ydW5fSjJFRVVJV29ya2luZ0NvX0VSUk9SXz1JV0FFMDAwM0UgQ2Fubm90IHJ1biBKMkVFVUlXb3JraW5nQ29weU1hbmFnZXIgb3BlcmF0aW9uIGJlY2F1c2UgdGhlIFdvcmtzcGFjZSB0cmVlIGlzIGxvY2tlZC4KLVVuYWJsZV90b19zYXZlX3JlYWRfb25seV9mX0VSUk9SXz1JV0FFMDAwNEUgVW5hYmxlIHRvIHNhdmUgcmVhZC1vbmx5IGZpbGU6IHswfQotVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfPVRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzIG5lZWQgdG8gYmUgc2F2ZWQgYnV0IGFyZSBjdXJyZW50bHkgc2hhcmVkLCBkbyB5b3Ugd2FudCB0byBzYXZlIG5vdz8KLUNhbm5vdF9sb2FkX0VKQkZpbGVfYmVjYXVzZV9FSkJFZGl0TW9kZWxfaXNfbnVsbF9VSV89Q2Fubm90IGxvYWQgRUpCRmlsZSBiZWNhdXNlIEVKQkVkaXRNb2RlbCBpcyBudWxsCi1XQVJOSU5HX01FVEFGT0xERVJfTUlTU0lOR19VSV89V0FSTklOR19NRVRBRk9MREVSX01JU1NJTkcKLUNhbm5vdF9sb2FkX0VKQkZpbGVfYmVjYXVzZV9lamJOYXR1cmVfYXNFSkJKYXJGaWxlX19fcmV0dXJuc19udWxsX1VJXz1DYW5ub3QgbG9hZCBFSkJGaWxlIGJlY2F1c2UgZWpiTmF0dXJlLmFzRUpCSmFyRmlsZSgpIHJldHVybnMgbnVsbAotRUpCUHJvamVjdFJlc291cmNlc19nZXRFSkJKYXJfRUpCRWRpdE1vZGVsX19VSV89RUpCUHJvamVjdFJlc291cmNlcy5nZXRFSkJKYXIoRUpCRWRpdE1vZGVsKQotQ2Fubm90X2xvYWRfRUpCSmFyX2JlY2F1c2VfbW9kZWxfaXNfbnVsbF9VSV89Q2Fubm90IGxvYWQgRUpCSmFyIGJlY2F1c2UgbW9kZWwgaXMgbnVsbAotQ2Fubm90X2xvYWRfRUpCRmlsZV9iZWNhdXNlX0VKQk5hdHVyZVJ1bnRpbWVfaXNfbnVsbF9VSV89Q2Fubm90IGxvYWQgRUpCRmlsZSBiZWNhdXNlIEVKQk5hdHVyZVJ1bnRpbWUgaXMgbnVsbAotV0FSTklOR19GSUxFX01JU1NJTkdfVUlfPVdBUk5JTkdfRklMRV9NSVNTSU5HCi1Db3JlRXhjZXB0aW9uX2NvdWxkX25vdF9pbml0aWFsaXplX1dlYl9TZXJ2aWNlX2NsYXNzX3BhdGhfdmFyaWFibGVzX0VSUk9SXz1JV0FFMDAwNUUgQ29yZUV4Y2VwdGlvbiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXZWIgU2VydmljZSBjbGFzcyBwYXRoIHZhcmlhYmxlcwotX19TdGFydF9idWlsZF9wcm9qZWN0X0lORk9fPUlXQUUwMDA2SSA6IFN0YXJ0IGJ1aWxkIHByb2plY3QKLV9fQmFkX2J1aWxkZXJfb3JkZXJfZm9yX3Byb2plY3RfSU5GT189SVdBRTAwMDdJIDogQmFkIGJ1aWxkZXIgb3JkZXIgZm9yIHByb2plY3QKLV9fTm9faW1wb3J0ZWRfY2xhc3Nlc19mb2xkZXJfX3F1aXR0aW5nX0lORk9fPUlXQUUwMDA4SSA6IE5vIGltcG9ydGVkIGNsYXNzZXMgZm9sZGVyLCBxdWl0dGluZwotX19GdWxsX2ZpcnN0X2J1aWxkX0lORk9fPUlXQUUwMDA5SSA6IEZ1bGwvZmlyc3QgYnVpbGQKLV9fQ29uc2lkZXJpbmdfZGVsdGFfSU5GT189SVdBRTAwMTBJIDogQ29uc2lkZXJpbmcgZGVsdGEKLV9fRGVsdGFfYnVpbGRfSU5GT189SVdBRTAwMTFJIDogRGVsdGEgYnVpbGQKLU1pbmltaXppbmdfcHJvamVjdF9VSV89TWluaW1pemluZyBwcm9qZWN0Ci1Ob19saWJyYXJ5X2ZvbGRlcl9VSV89Tm8gbGlicmFyeSBmb2xkZXIKLU5vdF9hX0oyRUVfcHJvamVjdF9VSV89Tm90IGEgSmF2YSBFRSBwcm9qZWN0Ci1Ob19zb3VyY2VfdHlwZXNfVUlfPU5vIHNvdXJjZSB0eXBlcwotU29tZV9zb3VyY2VfdHlwZXNfaGF2ZV9fX19fX2luX3RoZWlyX25hbWVfRVJST1JfPUlXQUUwMDEyRSBTb21lIHNvdXJjZSB0eXBlcyBoYXZlIFwnJFwnIGluIHRoZWlyIG5hbWUKLVJBUl9GaWxlPVJBUiBGaWxlCi1FcnJvcl9vcGVuaW5nX2FyY2hpdmVfZm9yX2V4cG9ydF8yPUVycm9yIG9wZW5pbmcgYXJjaGl2ZSBmb3IgZXhwb3J0Ci1FcnJvcl9nZXR0aW5nX3Byb2plY3RfbmF0dXJlX3J1bnRpbWVfMz1FcnJvciBnZXR0aW5nIHByb2plY3QgbmF0dXJlIHJ1bnRpbWUKLUVycm9yX29jY3VycmVkX2xvYWRpbmdfcmFfeG1sX180PUVycm9yIG9jY3VycmVkIGxvYWRpbmcgcmEueG1sOgotQ3JlYXRpbmdfQ29ubmVjdG9yX1Byb2plY3RfNT1DcmVhdGluZyBDb25uZWN0b3IgUHJvamVjdAotRXJyb3JfZ2V0dGluZ19wcm9qZWN0X25hdHVyZV9ydW50aW1lXzY9RXJyb3IgZ2V0dGluZyBwcm9qZWN0IG5hdHVyZSBydW50aW1lCi1FcnJvcl9vY2N1cnJlZF9zYXZpbmdfdGhlX21hbmlmZXN0Xzc9RXJyb3Igb2NjdXJyZWQgc2F2aW5nIHRoZSBtYW5pZmVzdAotX1VJX1BhcmFtVmFsdWVfdHlwZT1QYXJhbToKLUoyRUVNb2R1bGVQb3N0SW1wb3J0SGVscGVyXzA9V0VCCi1KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlcl8xPUVKQgotSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMj1BcHBsaWNhdGlvbkNsaWVudAotSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXJfMz1Db25uZWN0b3IKLUoyRUVEZXBsb3lPcGVyYXRpb25fVUlfMD1EZXBsb3lpbmcgc2VsZWN0ZWQgbW9kdWxlcwotSjJFRURlcGxveU9wZXJhdGlvbl9VSV8xPUZhdGFsIEV4Y2VwdGlvbiBvY2N1cmVkCi1KMkVFRGVwbG95T3BlcmF0aW9uX1VJX051bGxfU3RhdHVzPURlcGxveWVkIHN1Y2Nlc3NmdWxseS4KLUoyRUVEZXBsb3lPcGVyYXRpb25fMV9VSV89RGVwbG95aW5nIHswfSBVc2luZyB7MX0KLUoyRUVEZXBsb3lPcGVyYXRpb25fMl9VSV89RGVwbG95bWVudCBmcm9tIHswfSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci1KMkVFRGVwbG95T3BlcmF0aW9uXzNfVUlfPURlcGxveW1lbnQgZnJvbSB7MH0gaGFkIGVycm9yczogezF9IFxyXG4KLUoyRUVEZXBsb3lPcGVyYXRpb25fNF9VSV89RGVwbG95aW5nIHswfQotTkVTVEVEX0pBVkFfT1VUUFVUX0VSUk9SPU5lc3RlZCBKYXZhIG91dHB1dCBwYXRocyBkZWZpbmVkIGluIC53dHBtb2R1bGVzIGZpbGUgYXJlIG5vdCBhbGxvd2VkLgotX1VJX1BhcmFtVmFsdWVfdHlwZT1QYXJhbQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2phdmFjb2RlZ2VuLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2phdmFjb2RlZ2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjFhN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qYXZhY29kZWdlbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTm9fc291cmNlX3BhY2thZ2VfZnJhZ21lbnRfRVhDXz1JV0FFMDAwMUUgTm8gc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb3VsZCBiZSBmb3VuZC4KLVNwZWNpZmllZF9yb290X2lzX25vdF9hX3NvX0VYQ189SVdBRTAwMDJFIFNwZWNpZmllZCByb290IGlzIG5vdCBhIHNvdXJjZSByb290LgotUHJvamVjdF9uYW1lX25vdF9zcGVjaWZpZWRfRVhDXz1JV0FFMDAwM0UgUHJvamVjdCBuYW1lIG5vdCBzcGVjaWZpZWQuCi1Bbl9hbmFseXNpc19pbXBvcnRfY2FuX29ubF9FWENfPUlXQUUwMDA0RSBBbiBhbmFseXNpcyBpbXBvcnQgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZHVyaW5nIHJ1bigpLgotSWZfdGhpc19nZW5lcmF0aW9uX2NvbnRpbnVfV0FSTl89SVdBRTAwMDVXIElmIHRoaXMgZ2VuZXJhdGlvbiBjb250aW51ZXMsIHRoZSBKYXZhIHNvdXJjZSBmaWxlIFwiezB9XCIgd2lsbCBiZSBvdmVyd3JpdHRlbi4KLUphdmFfZ2VuZXJhdGlvbl9yZXF1aXJlc19hX0VYQ189SVdBRTAwMDZFIEphdmEgZ2VuZXJhdGlvbiByZXF1aXJlcyBhIEphdmFUb3BMZXZlbEdlbmVyYXRpb25IZWxwZXIuCi1UaGVfcHJlcGFyZV9tZXRob2RfY2FuX29fRVhDXz1JV0FFMDAwN0UgVGhlIHByZXBhcmUoKSBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBydW4oKS4KLU1lbWJlcl9nZW5lcmF0b3JfZG9lc19ub3RfX0VYQ189SVdBRTAwMDhFIE1lbWJlciBnZW5lcmF0b3IgZG9lcyBub3QgaGF2ZSBhIGRlY2xhcmluZyB0eXBlIGdlbmVyYXRvci4KLUVuY2xvc2luZ19jb21waWxhdGlvbl91bml0X0VYQ189SVdBRTAwMDlFIEVuY2xvc2luZyBjb21waWxhdGlvbiB1bml0IGdlbmVyYXRvciBub3QgZm91bmQuCi1SZW5hbWVzX29mX21haW5fdHlwZXNfYXJlX19FWENfPUlXQUUwMDEwRSBSZW5hbWVzIG9mIG1haW4gdHlwZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdGlvbiBmcmFtZXdvcmsgdmlhIGEgY29tcGlsYXRpb24gdW5pdCByZW5hbWUuCi1UaGVfZmllbGRfd2lsbF9ub3RfZ2VuX0lORk9fPUlXQUUwMDExSSBUaGUgZmllbGQgXCJ7MX1cIiB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYmVjYXVzZSBhIG5vbi1nZW5lcmF0ZWQgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotVGhlX2ZpZWxkX3dpbGxfbm90X2RlbF9JTkZPXz1JV0FFMDAxMkkgVGhlIGZpZWxkIFwiezB9XCIgd2lsbCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGlzIG5vdCBtYXJrZWQgZ2VuZXJhdGVkLgotVGhlX21ldGhvZF93aWxsX25vdF9nZW5fSU5GT189SVdBRTAwMTNJIFRoZSBtZXRob2QgXCJ7MX1cIiB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYmVjYXVzZSBhIG5vbi1nZW5lcmF0ZWQgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLgotVGhlX21ldGhvZF93aWxsX25vdF9kZWxfSU5GT189SVdBRTAwMTRJIFRoZSBtZXRob2QgXCJ7MH1cIiB3aWxsIG5vdCBiZSBkZWxldGVkIGJlY2F1c2UgaXQgaXMgbm90IG1hcmtlZCBnZW5lcmF0ZWQuCi1UaGVfdHlwZV93aWxsX25vdF9nZW5fSU5GT189SVdBRTAwMTVJIFRoZSB0eXBlIFwiezF9XCIgd2lsbCBub3QgYmUgZ2VuZXJhdGVkIGJlY2F1c2UgYSBub24tZ2VuZXJhdGVkIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotVGhlX3R5cGVfd2lsbF9ub3RfZGVsX0lORk9fPUlXQUUwMDE2SSBUaGUgdHlwZSBcInswfVwiIHdpbGwgbm90IGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCBpcyBub3QgbWFya2VkIGdlbmVyYXRlZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcHJvamVjdHN1cHBvcnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcHJvamVjdHN1cHBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YTYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL3Byb2plY3RzdXBwb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNyZWF0aW5nX1dlYl9Qcm9qZWN0X19fX1VJXz1DcmVhdGluZyBXZWIgUHJvamVjdC4uLgotVGhlX3BhdGhfZm9yX3RoZV9saW5rc19zdGFfRVhDXz1JV0FFMDAwMUUgVGhlIHBhdGggZm9yIHRoZSBsaW5rcyBzdGF0ZSBmaWxlIGlzIGluY29ycmVjdAotU3ludGF4X0Vycm9yX2luX3RoZV9saW5rc19VSV89U3ludGF4IEVycm9yIGluIHRoZSBsaW5rcyBzdGF0ZSBmaWxlCi1FcnJvcl93aGlsZV9zYXZpbmdfbGlua3Nfc19FWENfPUlXQUUwMDAyRSBFcnJvciB3aGlsZSBzYXZpbmcgbGlua3Mgc3RhdGUgZmlsZQotT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fU0FfRVJST1JfPUlXQUUwMDAzRSBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBTQVggZXJyb3I6Ci1PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19JT19FUlJPUl89SVdBRTAwMDRFIE9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIElPIGVycm9yOgotT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fQ29fRVJST1JfPUlXQUUwMDA1RSBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBDb3JlIGVycm9yOgotT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fSmFfRVJST1JfPUlXQUUwMDA2RSBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBKYXZhIE1vZGVsIGVycm9yOgotXzFjb25jYXRfRVhDXz1JV0FFMDAwN0UgRXJyb3Igb2NjdXJlZCBnZXR0aW5nIHdlYi54bWw6IHswfQotRXJyb3JfaW1wb3J0aW5nX01vZHVsZV9GaWxfRVhDXz1JV0FFMDAwOEUgRXJyb3IgaW1wb3J0aW5nIE1vZHVsZSBGaWxlCi1DYW5ub3RfY2xvbmVfVGFnbGliSW5mb18xX0VYQ189SVdBRTAwMDlFIENhbm5vdCBjbG9uZSBUYWdsaWJJbmZvCi1Db3VsZF9ub3RfcmVhZF9UTERfMTU9Q291bGQgbm90IHJlYWQgVExECi1GaWxlX1NlcnZpbmdfRW5hYmxlcl83PUZpbGUgU2VydmluZyBFbmFibGVyCi1BdXRvX0dlbmVyYXRlZF9fX0ZpbGVfRW5hYmxlcl85PUF1dG8gR2VuZXJhdGVkIC0gRmlsZSBFbmFibGVyCi1HZW5lcmF0ZWRfYnlfV2ViX1Rvb2xpbmdfMjM9R2VuZXJhdGVkIGJ5IFdlYiBUb29saW5nCi1Ob3RfYV93ZWJfcHJvamVjdF8yOT1Ob3QgYSB3ZWIgcHJvamVjdAotQV93ZWJfcHJvamVjdF9tdXN0X2JlX29wZW5fYW5kX211c3RfZXhpc3RfZm9yX3Byb3BlcnRpZXNfdG9fYmVfZWRpdGVkXzMwPUEgd2ViIHByb2plY3QgbXVzdCBiZSBvcGVuIGFuZCBtdXN0IGV4aXN0IGZvciBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZAotSW52YWxpZF9TZXJ2bGV0X0xldmVsX3NldF9vbl9XZWJOYXR1cmVfM19FWENfPUlXQUUwMDEwRSBJbnZhbGlkIFNlcnZsZXQgTGV2ZWwgc2V0IG9uIFdlYk5hdHVyZQotQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yPUNvbnRleHQgcm9vdCBjYW5ub3QgYmUgZW1wdHkKLU5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzU9TmFtZXMgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UKLU5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2VfPUNvbnRleHQgcm9vdCBjYW5ub3QgY29udGFpbiB3aGl0ZXNwYWNlIAotVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290PVRoZSBjaGFyYWN0ZXIgJyd7MH0nJyBpcyBpbnZhbGlkIGluIGEgY29udGV4dCByb290LgotRm9sZGVyX25hbWVfY2Fubm90X2JlX2VtcHR5XzI9Rm9sZGVyIG5hbWUgY2Fubm90IGJlIGVtcHR5Ci1Gb2xkZXJfbmFtZXNfY2Fubm90X2JlX2VxdWFsXzQ9Rm9sZGVyIG5hbWVzIGNhbm5vdCBiZSBlcXVhbAotRm9sZGVyX25hbWVfY2Fubm90X2JlX3RoZV9zYW1lX2FzX0phdmFfc291cmNlX2ZvbGRlcl81PUZvbGRlciBuYW1lIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyBKYXZhIHNvdXJjZSBmb2xkZXIKLUZvbGRlcl9uYW1lX2Nhbm5vdF9iZV90aGVfc2FtZV9hc19KYXZhX2NsYXNzX2ZvbGRlcl82PUZvbGRlciBuYW1lIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyBKYXZhIGNsYXNzIGZvbGRlcgotRm9sZGVyX25hbWVfaXNfbm90X3ZhbGlkPUZvbGRlciBuYW1lIHswfSBpcyBub3QgdmFsaWQKLUNvdWxkX25vdF9yZW5hbWVfX19fXzI9Q291bGQgbm90IHJlbmFtZTogJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4KLVN5bmNfV0xQX09wPVN5bmNocm9uaXppbmcgV2ViIExpYnJhcnkgUHJvamVjdHNcblx0Ci1UYXJnZXRfVXBkYXRlX09wPVVwZGF0aW5nIHRhcmdldCBzZXJ2ZXIgZm9yIHswfVxuXHQKLVNldF9DbGFzc1BhdGhfX1VJXz1TZXQgQ2xhc3NQYXRoOgotVXBkYXRlX0NsYXNzUGF0aF9fVUlfPVVwZGF0ZSBDbGFzc1BhdGg6Ci1DYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXz1DYXRhbG9nIExpYiBEaXJlY3Rvcnk6Ci1TeWNocm9uaXplX0NsYXNzX1BhdGhfVUlfPVN5Y2hyb25pemUgQ2xhc3MgUGF0aAotVU5BQkxFX1RPX0xPQURfTU9EVUxFX0VSUk9SXz1VTkFCTEVfVE9fTE9BRF9NT0RVTEVfRVJST1JfCi1JbXBvcnRpbmdfYXJjaGl2ZT1JbXBvcnRpbmcgYXJjaGl2ZSAnJ3swfScnLgotRXhwb3J0aW5nX2FyY2hpdmU9RXhwb3J0aW5nIGFyY2hpdmUgJyd7MH0nJy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcmVmYWN0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcmVmYWN0b3IucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0MWI1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL3JlZmFjdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jICBDb250cmlidXRvcnM6Ci0jICAgQkVBIFN5c3RlbXMsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBjb250YWlucyBzdHJpbmcgZm9yIHJlZmFjdG9yaW5nIGxvZ2ljCi0KLXByZV9kZWxldGVfbm90X3JlY2VpdmVkX2Zvcl9yZW1vdmVkPU1pc3NlZCBQUkVfREVMRVRFIGV2ZW50IGZvciByZW1vdmVkIHByb2plY3QgezB9LCB1bmFibGUgdG8gdXBkYXRlIGRlcGVuZGVuY2llcy4KLXByZV9kZWxldGVfbm90X3JlY2VpdmVkX2Zvcl9yZW5hbWVkPU1pc3NlZCBQUkVfREVMRVRFIGV2ZW50IGZvciByZW5hbWVkIHByb2plY3QgezB9LCB1bmFibGUgdG8gdXBkYXRlIGRlcGVuZGVuY2llcy4KLWludmFsaWRfcHJvcGVydHlfbmFtZT1JbnZhbGlkIHByb3BlcnR5IG5hbWU6IHswfQotdGFza19uYW1lPVByb2plY3QgcmVmYWN0b3JpbmcKLW1pc3NpbmdfbmF0dXJlcz1SZWZhY3RvcmVkIHByb2plY3QgZG9lcyBub3QgaGF2ZSBlaXRoZXIgdGhlIE1vZHVsZUNvcmVOYXR1cmUgb3IgSmF2YU5hdHVyZQotZXJyb3JfcmVhZGluZ19tYW5pZmVzdD1FcnJvciByZWFkaW5nIG1hbmlmZXN0Ci1lcnJvcl91cGRhdGluZ19wcm9qZWN0X29uX2RlbGV0ZT1FcnJvciB1cGRhdGluZyBkZXBlbmRlbmNpZXMgZm9yIGRlbGV0ZWQgSmF2YSBFRSBwcm9qZWN0IHswfQotZXJyb3JfdXBkYXRpbmdfcHJvamVjdF9vbl9yZW5hbWU9RXJyb3IgdXBkYXRpbmcgZGVwZW5kZW5jaWVzIGZvciByZW5hbWVkIEphdmEgRUUgcHJvamVjdCB7MH0KLWVycm9yX3VwZGF0aW5nX3NlcnZlcj1FcnJvciB1cGRhdGluZyBzZXJ2ZXIgezB9IG9uIHJlZmFjdG9yIG9mIHByb2plY3QgezF9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3B1c2hmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wdXNoZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3ZDFlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3B1c2hmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlRyYW5zbGF0ZSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPCEtLSBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYSB2YWx1ZSBmb3IgdGhlc2UgdmFyaWFibGVzLCBpdCBvdmVycmlkZXMgdGhlIHZhbHVlcyBzZXQgaW4gdGhpcyB0YXJnZXQgLS0+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJpbnB1dC5kaXIiIHZhbHVlPSJEOlxOTFNcQ29yb25hXFRWVFJldHVybnMiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiB2YWx1ZT0iRDpcTkxTXENvcm9uYVxUVlRQcm9jZXNzZWQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2IiB2YWx1ZT0idHJ1ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iV0FTIiB2YWx1ZT0iV0FTIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJXU0FEIiB2YWx1ZT0iV1NBRCIvPgotCQk8cHJvcGVydHkgbmFtZT0icHJvZHVjdCIgdmFsdWU9IiR7V1NBRH0iLz4KLQkJCi0JCTx0YXNrZGVmIG5hbWU9ImdvTmF0aXZlIgotICAgICAgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5pYm0uZXRvb2xzLmFudC50YXNrcy5Hb05hdGl2ZSIKLSAgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSJEOlxlY2xpcHNlLVNESy0zLjAtd2luMzJcZWNsaXBzZVxwbHVnaW5zXGNvbS5pYm0ucnRwLnRvb2xzXzMuMC4wXGxpYlx0b29scy5qYXIiLz4KLQkJCi0JCTwhLS0gUGx1Z2luIHZhcnMgLS0+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbWYud29ya2JlbmNodWkubmwxIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC51aS5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImoyZWVjb3JlIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqMmVlLnNuaXBwZXRzLm5sMSIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUucmVmZXJlbmNlLnNuaXBwZXRzLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0iajJlZS51aS5ubDEiIHZhbHVlPSJjb20uaWJtLmV0b29scy5qMmVlLnVpLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0icHJvamVjdC5pbnRlcmNoYW5nZS5ubDEiIHZhbHVlPSJjb20uaWJtLmV0b29scy5wcm9qZWN0LmludGVyY2hhbmdlLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdGlvbi5ubDEiIHZhbHVlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmFsaWRhdGlvbi5jb3JlIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2YWxpZGF0aW9uLnVpLm5sMSIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udWkubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3dHAuYWN0aXZpdGVzLm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLmFjdGl2aXRpZXMubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhbm5vdGF0aW9ucy5jb250cm9sbGVyLm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhbm5vdGF0aW9ucy5jb3JlLm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvcmUubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhbm5vdGF0aW9ucy51aS5ubDEiIHZhbHVlPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy51aS5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ind0cC5jb21tb24iIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbW1vbi5uYXZpZ2F0b3IubmwxIiB2YWx1ZT0iY29tLmlibS53dHAuY29tbW9uLm5hdmlnYXRvci5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbW1vbi51aS5ubDEiIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24udWkubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlamIubmwxIiB2YWx1ZT0iY29tLmlibS53dHAuZWpiLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0id3RwLmVtZiIgdmFsdWU9ImNvbS5pYm0ud3RwLmVtZiIvPgotCQk8cHJvcGVydHkgbmFtZT0iZW1mLndvcmtiZW5jaC5lZGl0Lm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guZWRpdC5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImoyZWUubmwxIiB2YWx1ZT0iY29tLmlibS53dHAuajJlZS5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9Ind0cC5qMmVldWkubmwxIiB2YWx1ZT0iY29tLmlibS53dHAuajJlZS51aS5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtZi53b3JrYmVuY2guZWRpdC5ubDEiIHZhbHVlPSJjb20uaWJtLnd0cC5lbWYud29ya2JlbmNoLmVkaXQubmwxIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqY2EubmwxIiB2YWx1ZT0iY29tLmlibS53dHAuamNhLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2ViLm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLndlYi5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndlYnNlcnZpY2UubmwxIiB2YWx1ZT0iY29tLmlibS53dHAud2Vic2VydmljZS5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImoyZWUudWkubmF2aWdhdG9yLm5sMSIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmlld3MubmF2aWdhdG9yLm5sMSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtiZW5jaC5uYXZpZ2F0b3IubmwxIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRvci5ubDEiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImV0b29scy5lamIudWkubmwxIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuZWpiLnVpLm5sMSIvPgotCQk8cHJvcGVydHkgbmFtZT0id3RwLmVqYi51aS5ubDEiIHZhbHVlPSJjb20uaWJtLnd0cC5lamIudWkubmwxIi8+Ci0JCQotCQkKLQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImluaXQiPgotCQotCQk8IS0tIEVNRiBXb3JrYmVuY2ggVUkgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2gudWkvcHJvcGVydHlfZmlsZXMvY29tbW9uYXBwZWpiLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtlbWYud29ya2JlbmNodWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2gudWkvcHJvcGVydHlfZmlsZXMvY29tbW9uZWRpdC5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ZW1mLndvcmtiZW5jaHVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iY29tbW9uZm9udF93aW5kb3dzMjAwMC5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ZW1mLndvcmtiZW5jaHVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iZW1mdWkucHJvcGVydGllcyIgcGx1Z2luPSIke2VtZi53b3JrYmVuY2h1aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgSjJFRSBDb3JlICAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V0FTfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJjb21tb25hcmNoaXZlLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlY29yZX0vY29tbW9uYXJjaGl2ZSIvPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlL21vZmoyZWUvZWpiLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlY29yZX0vbW9majJlZSIvPgkKLQkJCTxwdXNoIG5hbWU9ImoyZWVwbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWVjb3JlfS9tb2ZqMmVlIi8+Ci0JCQk8cHVzaCBuYW1lPSJqMmVleG1sLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlY29yZX0vbW9majJlZSIvPgkKLQkJCTxwdXNoIG5hbWU9Im1vZmoyZWUucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWVjb3JlfS9tb2ZqMmVlIi8+CQkKLQkJCTxwdXNoIG5hbWU9InhtbHBhcnNlLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlY29yZX0vbW9majJlZSIvPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWVjb3JlfS9qMmVlLXZhbGlkYXRpb24iLz4JCi0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWVjb3JlfS9qMmVlLXZhbGlkYXRpb24iLz4JCi0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VqYnZhbGlkYXRvci5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZWNvcmV9L2oyZWUtdmFsaWRhdGlvbiIvPgkKLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWVjb3JlfS9qMmVlLXZhbGlkYXRpb24iLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZWNvcmV9L2oyZWUtdmFsaWRhdGlvbiIvPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlY29yZX0vajJlZS12YWxpZGF0aW9uIi8+Ci0JCTwvZ29OYXRpdmU+Ci0JCi0JCTwhLS0gIEoyRUUgUmVmZXJlbmNlIFNuaXBwZXRzIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJSZWZlcmVuY2VTbmlwcGV0c1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5zbmlwcGV0cy5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gIEoyRUUgVUkgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImFwcGNsaWVudGFyY2hpdmV1aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS51aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iYXBwY2xpZW50dWkucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImFwcGxpY2F0aW9uZWRpdG9yLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2NvbW1vbmVkaXQucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbm5lY3RvcnVpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJlYXJjcmVhdGlvbnVpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJlamJhcmNoaXZldWkucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImVqYmNyZWF0aW9udWkucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbm5lY3RvcnVpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJlamJleHR1aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS51aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iZWpidWkucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImoyZWV1aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS51aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0icmFyYXJjaGl2ZXVpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJ3ZWJzZXJ2aWNldWkucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9IndlYnVpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJ3aXphcmRzLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS51aS5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgUHJvamVjdCBJbnRlcmNoYW5nZSAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0icHJvamVjdGludGVyY2hhbmdlLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtwcm9qZWN0LmludGVyY2hhbmdlLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy5wcm9qZWN0LmludGVyY2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7cHJvamVjdC5pbnRlcmNoYW5nZS5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgVmFsaWRhdGlvbiAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7cHJvZHVjdH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV9iYXNlLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt2YWxpZGF0aW9uLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7dmFsaWRhdGlvbi5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgVmFsaWRhdGlvbiBDb3JlIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvdmFsaWRhdGVfYmFzZS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7dmFsaWRhdGlvbi5jb3JlfS9wcm9wZXJ0eV9maWxlcyIvPgotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgVmFsaWRhdGlvbiBVSSAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0idmFsaWRhdGVfdWkucHJvcGVydGllcyIgcGx1Z2luPSIke3ZhbGlkYXRpb24udWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt2YWxpZGF0aW9uLnVpLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQkKLQkJCi0JCTwhLS0gIFdUUCBFTUYgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9IndmdHV0aWxzLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuZW1mfS93dHBlbWYiLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBBbm5vdGF0aW9uIENvbnRyb2xsZXIgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImFubm90YXRpb25jb250cm9sbGVyLnByb3BlcnRpZXMiIHBsdWdpbj0iJHthbm5vdGF0aW9ucy5jb250cm9sbGVyLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgQW5ub3RhdGlvbiBDb3JlIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJhbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7YW5ub3RhdGlvbnMuY29yZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gIEFubm90YXRpb24gVUkgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9InRhZ2hhbmRsZXJ1aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7YW5ub3RhdGlvbnMudWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBXVFAgQ29tbW9uIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJ3dHBfY29tbW9uLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuY29tbW9ufS9zcmMiLz4KLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gIFdUUCBDb21tb24gTmF2aWdhdG9yIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJ3dHBuYXZpZ2F0b3IucHJvcGVydGllcyIgcGx1Z2luPSIke2NvbW1vbi5uYXZpZ2F0b3IubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmNvbW1vbi5uYXZpZ2F0b3IvcGx1Z2luLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtjb21tb24ubmF2aWdhdG9yLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBXVFAgQ29tbW9uIFVJIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJ3dHBjb21tb251aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7Y29tbW9uLnVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7Y29tbW9uLnVpLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBFSkIgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmVqYi9wcm9wZXJ0eV9maWxlcy9lamJhcmNoaXZlb3BzLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtlamIubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4JCi0JCQk8cHVzaCBuYW1lPSJlamJjb2RlZ2VuLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtlamIubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4JCi0JCQk8cHVzaCBuYW1lPSJlamJjcmVhdGlvbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ZWpiLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iZWpicHJvdmlkZXJsaWJyYXJpZXMucHJvcGVydGllcyIgcGx1Z2luPSIke2VqYi5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmVqYi9wcm9wZXJ0eV9maWxlcy9lamJ2YWxpZGF0b3IucHJvcGVydGllcyIgcGx1Z2luPSIke2VqYi5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmVqYi9wbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2VqYi5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJCi0JCQotCQkKLQkJPCEtLSAgSjJFRSAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0iYXBwY2xpZW50YXJjaGl2ZW9wcy5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iYXBwY2xpZW50Y3JlYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImFwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iYXBwbGljYXRpb25wcm92aWRlcnMucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImJhc2Vjb2RlZ2VuLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLnd0cC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2NvbW1vbmVkaXQucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImVhcmFyY2hpdmVvcHMucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImVhcmNyZWF0aW9uLnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLnd0cC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmoyZWUvcHJvcGVydHlfZmlsZXMvZWpiYXJjaGl2ZW9wcy5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAuajJlZS9wcm9wZXJ0eV9maWxlcy9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iajJlZV9jb21tb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImoyZWVjcmVhdGlvbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iajJlZXd0cHBsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0iamF2YWNvZGVnZW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9InByb2plY3RzdXBwb3J0LnByb3BlcnRpZXMiIHBsdWdpbj0iJHtqMmVlLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLnd0cC5qMmVlL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ajJlZS5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgV1RQIEoyRUUgVUkgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImVqYl9maWd1cmVzLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuajJlZXVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJlamJfdWkucHJvcGVydGllcyIgcGx1Z2luPSIke3d0cC5qMmVldWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImoyZWVfdWkucHJvcGVydGllcyIgcGx1Z2luPSIke3d0cC5qMmVldWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImpjYV91aS5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d3RwLmoyZWV1aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0ibWlnd2l6YXJkcy5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d3RwLmoyZWV1aS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgotCQkJPHB1c2ggbmFtZT0id2ViX3VpLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuajJlZXVpLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+Ci0JCQk8cHVzaCBuYW1lPSJ3ZWJzZXJ2aWNldWkucHJvcGVydGllcyIgcGx1Z2luPSIke3d0cC5qMmVldWkubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmoyZWUudWkvcGx1Z2luLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuajJlZXVpLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBKQ0EgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9InJhci5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7amNhLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAuamNhL3Byb3BlcnR5X2ZpbGVzL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke2pjYS5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmpjYS9wbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2pjYS5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQkJPCEtLSAgV2ViIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJQcm9qZWN0U3VwcG9ydC5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d2ViLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAud2ViL3Byb3BlcnR5X2ZpbGVzL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcyIgcGx1Z2luPSIke3dlYi5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJCTxwdXNoIG5hbWU9IndlYi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d2ViLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0id2ViZWRpdC5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d2ViLm5sMX0vcHJvcGVydHlfZmlsZXNfbmwxIi8+CQotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAud2ViL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d2ViLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tICBXZWIgU2VydmljZXMgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9IndlYnNlcnZpY2UucHJvcGVydGllcyIgcGx1Z2luPSIke3dlYnNlcnZpY2UubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4JCQotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAud2Vic2VydmljZS9wbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke3dlYnNlcnZpY2UubmwxfSIvPgkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gIEoyRUUgVUkgTmF2aWdhdG9yIC0tPgotCQk8Z29OYXRpdmUgYXJjaGl2ZVBhdGg9IiR7aW5wdXQuZGlyfSIgYXJjaGl2ZT0iajJlZSoiIG5hdGl2ZTJhc2NpaURpcj0iJHtvdXRwdXQuZGlyfSIgZnJhZ21lbnRzPSJmYWxzZSIgcHJvZHVjdD0iJHtXU0FEfSIgdmVyYm9zZT0iJHt2fSI+Ci0JCQk8cHVzaCBuYW1lPSJjb20uaWJtLnd0cC5qMmVlLnVpLm5hdmlnYXRvci9wbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2oyZWUudWkubmF2aWdhdG9yLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tIFZpZXdzIE5hdmlnYXRvciAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0ibWVzc2FnZXMucHJvcGVydGllcyIgcGx1Z2luPSIke3ZpZXdzLm5hdmlnYXRvci5ubDF9L3Byb3BlcnR5X2ZpbGVzX25sMSIvPgkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gV29ya2JlbmNoIE5hdmlnYXRvciAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0id2JuYXZpZ2F0b3IucHJvcGVydGllcyIgcGx1Z2luPSIke3dvcmtiZW5jaC5uYXZpZ2F0b3IubmwxfS9wcm9wZXJ0eV9maWxlc19ubDEiLz4JCi0JCQk8cHVzaCBuYW1lPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gubmF2aWdhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7d29ya2JlbmNoLm5hdmlnYXRvci5ubDF9Ii8+CQkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gV1RQIEFjdGl2aXRpZXMgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0ud3RwLmFjdGl2aXRpZXMvcGx1Z2luLnByb3BlcnRpZXMiIHBsdWdpbj0iJHt3dHAuYWN0aXZpdGVzLm5sMX0iLz4JCi0JCTwvZ29OYXRpdmU+Ci0JCQotCQk8IS0tIEV0b29scyBFSkIgVUkgLS0+Ci0JCTxnb05hdGl2ZSBhcmNoaXZlUGF0aD0iJHtpbnB1dC5kaXJ9IiBhcmNoaXZlPSJqMmVlKiIgbmF0aXZlMmFzY2lpRGlyPSIke291dHB1dC5kaXJ9IiBmcmFnbWVudHM9ImZhbHNlIiBwcm9kdWN0PSIke1dTQUR9IiB2ZXJib3NlPSIke3Z9Ij4KLQkJCTxwdXNoIG5hbWU9ImNvbS5pYm0uZXRvb2xzLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcyIgcGx1Z2luPSIke2V0b29scy5lamIudWkubmwxfSIvPgkKLQkJPC9nb05hdGl2ZT4KLQkJCi0JCTwhLS0gV1RQIEVKQiBVSSAtLT4KLQkJPGdvTmF0aXZlIGFyY2hpdmVQYXRoPSIke2lucHV0LmRpcn0iIGFyY2hpdmU9ImoyZWUqIiBuYXRpdmUyYXNjaWlEaXI9IiR7b3V0cHV0LmRpcn0iIGZyYWdtZW50cz0iZmFsc2UiIHByb2R1Y3Q9IiR7V1NBRH0iIHZlcmJvc2U9IiR7dn0iPgotCQkJPHB1c2ggbmFtZT0iY29tLmlibS53dHAuZWpiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIiBwbHVnaW49IiR7ZXRvb2xzLmVqYi51aS5ubDF9Ii8+CQotCQk8L2dvTmF0aXZlPgotCQkKLQk8L3RhcmdldD4JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlYWRtZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2NGJjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlYWRtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PHRpdGxlPjwvdGl0bGU+PC9oZWFkPgotPGJvZHk+Ci08cHJlPgotPCEtLSBFbnRlciB5b3VyIHJlYWRtZSB0ZXh0IGJlbG93IHRoaXMgbGluZS4gIC0tPgotCi0KLQotCi0KLQotCi0KLTwhLS0gRW50ZXIgeW91ciByZWFkbWUgdGV4dCBhYm92ZSB0aGlzIGxpbmUuICAtLT4KLTwvcHJlPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvUHJvamVjdERlcGVuZGVuY3lDYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9Qcm9qZWN0RGVwZW5kZW5jeUNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YzVlMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9Qcm9qZWN0RGVwZW5kZW5jeUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIE1haW50YWlucyBhIGNhY2hlIG9mIHByb2plY3QgZGVwZW5kZW5jaWVzIGFzIHJlcHJlc2VudGVkIGJ5IHJlZmVyZW5jZXMgaW4gdGhlIC5wcm9qZWN0IGZpbGUuCi0gKiAKLSAqIFhYWCBEZXBlbmRlbmN5TWFuYWdlckdyYXBoIGlzIGJlaW5nIHVzZWQgaW5zdGVhZCBub3cgdGhhdCBpbnRlci1wcm9qZWN0IGRlcGVuZGVuY2llcyBoYXZlCi0gKiBkZXBlbmRlbnQtbW9kdWxlIGVudHJpZXMsIGhvd2V2ZXIsIHRoaXMgdHlwZSBvZiBkZXBlbmRlbmN5IHJlcHJlc2VudGF0aW9uIG1pZ2h0IGJlIHVzZWZ1bCBpZgotICogd2Ugd2FudCB0byBjYXB0dXJlIGRlcGVuZGVuY2llcyBvbiBwcm9qZWN0cyBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3REZXBlbmRlbmN5Q2FjaGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvamVjdERlcGVuZGVuY3lDYWNoZSBjYWNoZTsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQcm9qZWN0RGVwZW5kZW5jeUNhY2hlIGdldENhY2hlKCkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljYWNoZSA9IG5ldyBQcm9qZWN0RGVwZW5kZW5jeUNhY2hlKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGU7Ci0JfQotCQotCS8qCi0JICogTWFwIGZyb20gdGFyZ2V0IElQcm9qZWN0IHRvIExpc3Qgb2YgZGVwZW5kZW50IElQcm9qZWN0cwotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwIGRlcGVuZGVuY3lDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoKLQkgKiBNYXAgZnJvbSBkZXBlbmRlbnQgSVByb2plY3QgdG8gTGlzdCBvZiB0YXJnZXQgSVByb2plY3QKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCByZWZlcmVuY2VDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0RGVwZW5kZW5jeUNhY2hlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZyZXNoRGVwZW5kZW5jaWVzKHByb2plY3RzW2ldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElQcm9qZWN0W10gZ2V0RGVwZW5kZW50UHJvamVjdHMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IGRlcGVuZGVuY2llcyA9IChMaXN0KSBkZXBlbmRlbmN5Q2FjaGUuZ2V0KHByb2plY3QpOwotCQlpZiAoZGVwZW5kZW5jaWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSVByb2plY3RbMF07Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBkZXBlbmRlbmNpZXMudG9BcnJheShuZXcgSVByb2plY3RbZGVwZW5kZW5jaWVzLnNpemUoKV0pOwkJCi0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoRGVwZW5kZW5jaWVzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCBvbGRSZWZzID0gKExpc3QpIHJlZmVyZW5jZUNhY2hlLmdldChwcm9qZWN0KTsKLQkJaWYgKG9sZFJlZnMgPT0gbnVsbCkgewotCQkJb2xkUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmaW5hbCBJUHJvamVjdFtdIHJlZlByb2plY3RzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQlmaW5hbCBMaXN0IG5ld1JlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBqKyspIHsKLQkJCWFkZERlcGVuZGVuY3kocmVmUHJvamVjdHNbal0sIHByb2plY3QpOwotCQkJbmV3UmVmcy5hZGQocmVmUHJvamVjdHNbal0pOwotCQkJb2xkUmVmcy5yZW1vdmUocmVmUHJvamVjdHNbal0pOwotCQl9Ci0JCXJlZmVyZW5jZUNhY2hlLnB1dChwcm9qZWN0LCBuZXdSZWZzKTsKLQkJCi0JCS8vIG5lZWQgdG8gY3VsbCB0aGUgc3RhbGUgcmVmcyBmcm9tIHRoZSByZXZlcnNlIG1hcAotCQlJdGVyYXRvciBpID0gb2xkUmVmcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCXJlbW92ZURlcGVuZGVuY3koKElQcm9qZWN0KSBpLm5leHQoKSwgcHJvamVjdCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2hEZXBlbmRlbmNpZXNGb3JUYXJnZXQoZmluYWwgSVByb2plY3QgdGFyZ2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0W10gZGVwZW5kZW50cz0gZ2V0RGVwZW5kZW50UHJvamVjdHModGFyZ2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZyZXNoRGVwZW5kZW5jaWVzKGRlcGVuZGVudHNbaV0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVtb3ZlIGZyb20gdGhlIGRlcGVuZGVuY3kgY2FjaGUKLQkJZGVwZW5kZW5jeUNhY2hlLnJlbW92ZShwcm9qZWN0KTsKLQkJLy8gcmVtb3ZlIGZyb20gdGhlIHJlZmVyZW5jZSBjYWNoZSBhbmQgY2xlYXIgdGhlIGZyb20gdGhlIGNhY2hlIG9mIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMKLQkJTGlzdCBkZXBlbmRlbmNpZXMgPSAoTGlzdCkgcmVmZXJlbmNlQ2FjaGUucmVtb3ZlKHByb2plY3QpOwotCQlpZiAoZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKLQkJCWZpbmFsIEl0ZXJhdG9yIGkgPSBkZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXJlbW92ZURlcGVuZGVuY3koKElQcm9qZWN0KSBpLm5leHQoKSwgcHJvamVjdCk7IAotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXBsYWNlUHJvamVjdChmaW5hbCBJUHJvamVjdCBvcmlnaW5hbFByb2plY3QsIGZpbmFsIElQcm9qZWN0IG5ld1Byb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVuYW1lIGRlcGVuZGVuY3lDYWNoZSBlbnRyeQotCQlkZXBlbmRlbmN5Q2FjaGUucHV0KG5ld1Byb2plY3QsIGRlcGVuZGVuY3lDYWNoZS5yZW1vdmUob3JpZ2luYWxQcm9qZWN0KSk7Ci0JCQotCQkvLyByZW5hbWUgcmVmZXJlbmNlIGNhY2hlIGFuZCBjbGVhciB0aGUgZnJvbSB0aGUgY2FjaGUgb2YgYWxsIGRlcGVuZGVudCBwcm9qZWN0cwotCQlMaXN0IGRlcGVuZGVuY2llcyA9IChMaXN0KSByZWZlcmVuY2VDYWNoZS5yZW1vdmUob3JpZ2luYWxQcm9qZWN0KTsKLQkJcmVmZXJlbmNlQ2FjaGUucHV0KG5ld1Byb2plY3QsIGRlcGVuZGVuY2llcyk7Ci0JCWlmIChkZXBlbmRlbmNpZXMgIT0gbnVsbCkgewotCQkJZmluYWwgSXRlcmF0b3IgaSA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgSVByb2plY3QgcmVmID0gKElQcm9qZWN0KSBpLm5leHQoKTsKLQkJCQlyZW1vdmVEZXBlbmRlbmN5KHJlZiwgb3JpZ2luYWxQcm9qZWN0KTsgCi0JCQkJYWRkRGVwZW5kZW5jeShyZWYsIG5ld1Byb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVEZXBlbmRlbmN5KGZpbmFsIElQcm9qZWN0IHRhcmdldCwgZmluYWwgSVByb2plY3QgZGVwZW5kZW50KSB7Ci0JCUxpc3QgZGVwZW5kZW50UHJvamVjdHMgPSAoTGlzdCkgZGVwZW5kZW5jeUNhY2hlLmdldCh0YXJnZXQpOwotCQlpZiAoZGVwZW5kZW50UHJvamVjdHMgIT0gbnVsbCkgewotCQkJZGVwZW5kZW50UHJvamVjdHMucmVtb3ZlKGRlcGVuZGVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZERlcGVuZGVuY3koZmluYWwgSVByb2plY3QgdGFyZ2V0LCBmaW5hbCBJUHJvamVjdCBkZXBlbmRlbnQpIHsKLQkJTGlzdCBkZXBlbmRlbnRQcm9qZWN0cyA9IChMaXN0KSBkZXBlbmRlbmN5Q2FjaGUuZ2V0KHRhcmdldCk7Ci0JCWlmIChkZXBlbmRlbnRQcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRlcGVuZGVuY3lDYWNoZS5wdXQodGFyZ2V0LCBkZXBlbmRlbnRQcm9qZWN0cyk7Ci0JCX0KLQkJaWYgKCFkZXBlbmRlbnRQcm9qZWN0cy5jb250YWlucyhkZXBlbmRlbnQpKSB7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0cy5hZGQoZGVwZW5kZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNGYzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL1JlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBTdXBwb3J0cyBhY2Nlc3MgdG8gcmVzb3VyY2Ugc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgicmVmYWN0b3IiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG5sc0NvbmNhdGVuYXRpb25GaW5kZXIoKSB7Ci0JCS8vIHVzZWQgdG8gdGFnIG1ldGhvZHMgd2hpY2ggaGF2ZSBjb25jYXRlbmF0ZWQgc3RyaW5ncwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL0oyRUVFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGExNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLmxpc3RlbmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHRoYXQgdXBkYXRlcyBtYXBwaW5ncyBmb3Igc3JjIGZvbGRlcnMKLSAqIGluIHRoZSAuY29tcG9uZW50IGZpbGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyBpbiBhIHByb2plY3QncyBKYXZhIGNsYXNzcGF0aC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIEpvYiBmYW1pbHkgaW4gd2hpY2ggYWxsIGNvbXBvbmVudCB1cGRhdGUgam9icyBiZWxvbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DT01QT05FTlRfVVBEQVRFX0pPQl9GQU1JTFkgPSAgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lciNlbGVtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcHJvY2Vzc0phdmFFbGVtZW50RGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnREZWx0YShmaW5hbCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgewotCQkJZmluYWwgaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCWZpbmFsIElKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YU1vZGVsKSB7Ci0JCQkJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pID09IElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pIHsKLQkJCQkJZmluYWwgSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldENoYW5nZWRDaGlsZHJlbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkvLyBoYW5kbGUgYWxsIG9mIHRoZSBJSmF2YVByb2plY3QgY2hpbGRyZW4KLQkJCQkJCXByb2Nlc3NKYXZhRWxlbWVudERlbHRhKGNoaWxkcmVuW2ldKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5vdCBhIEphdmEgcHJvamVjdCAoaS5lLiBjb3VsZCBiZSBhbiBFQVIgcHJvamVjdCkKLQkJCQkJcHJvY2Vzc1Jlc291cmNlRGVsdGFzKGZsYWdzLCBraW5kLCBkZWx0YSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQkJcHJvY2Vzc0phdmFQcm9qZWN0KChJSmF2YVByb2plY3QpIGVsZW1lbnQsIGZsYWdzLCBraW5kLCBkZWx0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NKYXZhUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QsIGZpbmFsIGludCBmbGFncywgZmluYWwgaW50IGtpbmQsIGZpbmFsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGpwcm9qZWN0LmdldFByb2plY3QoKTsKLQkJZmluYWwgTGlzdCBwYXRoc1RvQWRkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmFsIExpc3QgY2hhbmdlZEphdmFQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIG1ha2UgY2VydGFpbiB0aGlzIGlzIGEgSjJFRSBwcm9qZWN0Ci0JCWlmIChNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJdHJ5IHsKLQkJCQkvLyBEaWQgdGhlIGNsYXNzcGF0aCBjaGFuZ2U/Ci0JCQkJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pID09IElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pIHsKLQkJCQkJZmluYWwgYm9vbGVhbiBjcENoYW5nZWQgPSAoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwOyAKLQkJCQkJZ2V0SmF2YVNyY01hcHBpbmdzKGMsIGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSwgY3BDaGFuZ2VkLCBqcHJvamVjdCwgcGF0aHNUb0FkZCwgcGF0aHNUb1JlbW92ZSwgY2hhbmdlZEphdmFQYXRocyk7Ci0JCQkJfQotCi0JCQkJLy8gRGlkIGEgbm9uLUphdmEgZm9sZGVyIGNoYW5nZSBuYW1lPwotCQkJCWZpbmFsIElSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXMoKTsKLQkJCQlpZiAoZGVsdGFzICE9IG51bGwgJiYgZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJZ2V0Tm9uSmF2YUZvbGRlck1hcHBpbmdzKGRlbHRhcywgYywgcGF0aHNUb0FkZCwgcGF0aHNUb1JlbW92ZSwgY2hhbmdlZEphdmFQYXRocyk7Ci0JCQkJfQotCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihjZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdXBkYXRlTWFwcGluZ3NJbkpvYihwYXRoc1RvQWRkLCBwYXRoc1RvUmVtb3ZlKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVzb3VyY2VEZWx0YXMoZmluYWwgaW50IGZsYWdzLCBmaW5hbCBpbnQga2luZCwgZmluYWwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJZmluYWwgTGlzdCBwYXRoc1RvQWRkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZmluYWwgSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRSZXNvdXJjZURlbHRhcygpOwotCQlpZiAoZGVsdGFzICE9IG51bGwgJiYgZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0Tm9uSmF2YUZvbGRlck1hcHBpbmdzKGRlbHRhcywgbnVsbCwgcGF0aHNUb0FkZCwgcGF0aHNUb1JlbW92ZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoY2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJdXBkYXRlTWFwcGluZ3NJbkpvYihwYXRoc1RvQWRkLCBwYXRoc1RvUmVtb3ZlKTsKLQl9Ci0JCi0JLyoKLQkgKiBBZGRzIGFuZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHJlc291cmNlIG1hcHBpbmdzIGluIGEgV29ya3NwYWNlSm9iCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcHBpbmdzSW5Kb2IoZmluYWwgTGlzdCBwYXRoc1RvQWRkLCBmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUpIHsKLQkJLy8gSWYgdGhlcmUgYXJlIGNvcnJlY3Rpb25zIHRvIHRoZSB2aXJ0dWFsIHBhdGggbWFwcGluZ3MsIGV4ZWN1dGUgdGhlbSBpbiBhIEpvYgotCQlpZiAoIXBhdGhzVG9BZGQuaXNFbXB0eSgpIHx8ICFwYXRoc1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJV29ya3NwYWNlSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoIkoyRUVDb21wb25lbnRNYXBwaW5nVXBkYXRlSm9iIikgewkJCQkJCQkKLQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZm9yKGludCBpPTA7aTxwYXRoc1RvQWRkLnNpemUoKTsgaSsrKXsKLQkJCQkJCU9iamVjdFtdIHRvQWRkID0gKE9iamVjdFtdKSBwYXRoc1RvQWRkLmdldChpKTsKLQkJCQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGRlc3RGb2xkZXIgPSAoSVZpcnR1YWxGb2xkZXIpIHRvQWRkWzFdOwotCQkJCQkJZmluYWwgSVBhdGggcGF0aFRvQWRkID0gKElQYXRoKSB0b0FkZFswXTsKLQkJCQkJCWRlc3RGb2xkZXIuY3JlYXRlTGluayhwYXRoVG9BZGQsIDAsIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWZvcihpbnQgaT0wO2k8cGF0aHNUb1JlbW92ZS5zaXplKCk7IGkrKyl7Ci0JCQkJCQlPYmplY3RbXSB0b1JlbW92ZSA9IChPYmplY3RbXSkgcGF0aHNUb1JlbW92ZS5nZXQoaSk7Ci0JCQkJCQlmaW5hbCBJVmlydHVhbEZvbGRlciBkZXN0Rm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSB0b1JlbW92ZVsxXTsKLQkJCQkJCWZpbmFsIElQYXRoIHBhdGhUb1JlbW92ZSA9IChJUGF0aCkgdG9SZW1vdmVbMF07Ci0JCQkJCQlkZXN0Rm9sZGVyLnJlbW92ZUxpbmsocGF0aFRvUmVtb3ZlLCAwLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKGZpbmFsIE9iamVjdCBmYW1pbHkpIHsKLQkJCQkJcmV0dXJuIFBST0pFQ1RfQ09NUE9ORU5UX1VQREFURV9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQkJCX07Ci0JCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9CQkJCQkJCi0JfQotCQotCS8qCi0JICogQ29tcHV0ZXMgdGhlIHZpcnR1YWwgY29tcG9uZW50IHBhdGggbWFwcGluZyBjaGFuZ2VzIHRoZSBuZWVkIHRvIGJlIG1hZGUgZHVlIHRvIAotCSAqIEphdmEgc3JjIHBhdGggY2hhbmdlcy4KLQkgKi8gCi0JcHJpdmF0ZSB2b2lkIGdldEphdmFTcmNNYXBwaW5ncyhmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCwgZmluYWwgSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiwgZmluYWwgYm9vbGVhbiBjcENoYW5nZWQsIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCwgZmluYWwgTGlzdCBwYXRoc1RvQWRkLCBmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUsIGZpbmFsIExpc3QgY2hhbmdlZFBhdGhzKSAKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gZ2V0IHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGZvbGRlcgotCQlmaW5hbCBJVmlydHVhbEZvbGRlciBkZWZhdWx0RGVzdEZvbGRlciA9IGdldERlc3RpbmF0aW9uRm9sZGVyKHZpcnR1YWxDb21wKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gY2hpbGRyZW5baV07Ci0JCQlmaW5hbCBJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKXsKLQkJCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotCQkJCWludCBjcGVLaW5kID0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0JCQkJYm9vbGVhbiBhYm9ydEFkZCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWNwZUtpbmQgPSByb290LmdldEtpbmQoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJCS8vIHRoaXMgaXMgdGhyb3duIGlmIHRoZSBmb2xkZXIgY29ycmVzcG9uZGluZyB0byB0aGUgQ1BFIGhhcyBiZWVuIGRlbGV0ZWQKLQkJCQkJLy8gc2luY2UgaXQgY291bGQgcmVwcmVzZW50IGFub3RoZXIgZXJyb3IsIHdlIG5lZWQgdG8gYWJvcnQgYWRkaW5nLiAKLQkJCQkJYWJvcnRBZGQgPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBvbmx5IHVwZGF0ZSBpZiB3ZSBrbm93IGl0IGlzIGEgc3JjIGZvbGRlcgotCQkJCWlmIChjcGVLaW5kID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJCWZpbmFsIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwkJCQkJCi0JCQkJCWlmICghY3BDaGFuZ2VkKSB7Ci0JCQkJCQkvLyBpZiB0aGUgY2xhc3NwYXRoIGlzIG5vdCBjaGFuZ2VkLCBzYXZlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEphdmEgc3JjIHBhdGgKLQkJCQkJCWlmIChraW5kID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgfHwga2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQkJY2hhbmdlZFBhdGhzLmFkZChyb290LmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsJCQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkKLQkJCQkJCS8vIGtpbmQgYW5kIGZsYWdzIGZvciBDUCBhZGRpdGlvbnMgYXJlIHNvbWV3aGF0IHNwb3JhZGljOyBlaXRoZXI6Ci0JCQkJCQkvLyAta2luZCBpcyBBRERFRCBhbmQgZmxhZ3MgYXJlIDAKLQkJCQkJCS8vICAgb3IKLQkJCQkJCS8vIC1raW5kIGlzIENIQU5HRUQgYW5kIGZsYWdzIGFyZSBGX0FEREVEX1RPX0NMQVNTUEFUSAotCQkJCQkJZmluYWwgaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQotCQkJCQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgfHwgCi0JCQkJCQkJCShmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgewotCQkJCQkJCWlmICghYWJvcnRBZGQpIHsKLQkJCQkJCQkJZmluYWwgSVBhdGggcGF0aFRvQWRkID0gcm9vdC5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCQkJcGF0aHNUb0FkZC5hZGQobmV3IE9iamVjdFtde3BhdGhUb0FkZCwgZGVmYXVsdERlc3RGb2xkZXJ9KTsKLQkJCQkJCQkJLy8gaWYgdGhlIGFkZGVkIHNyYyBwYXRoIHdhcyBtb3ZlZCBmcm9tIGFub3RoZXIgbG9jYXRpb24sIHJlbW92ZSBhbnkgbWFwcGluZyBmb3IgdGhhdAotCQkJCQkJCQkvLyBsb2NhdGlvbgotCQkJCQkJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9GUk9NKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pIHsKLQkJCQkJCQkJCWZpbmFsIElKYXZhRWxlbWVudCBtb3ZlZEZyb21FbGVtZW50ID0gZGVsdGEuZ2V0TW92ZWRGcm9tRWxlbWVudCgpOwotCQkJCQkJCQkJZmluYWwgSVBhdGggcGF0aFRvUmVtb3ZlID0gbW92ZWRGcm9tRWxlbWVudC5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCQkJCXBhdGhzVG9SZW1vdmUuYWRkKG5ldyBPYmplY3RbXXtwYXRoVG9SZW1vdmUsIGRlZmF1bHREZXN0Rm9sZGVyfSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gZ2V0dGluZyBhIGtpbmQgPSBSRU1PVkVEIGFuZCBmbGFncyA9IDAgZm9yIHJlbW92YWwgb2YgdGhlIGZvbGRlciAody9vIHJlbW92aW5nIHRoZSBDUEUpLCBwcm9iYWJseQotCQkJCQkJCS8vIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkCi0JCQkJCQl9IGVsc2UgaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgPT0gSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSB7Ci0JCQkJCQkJSVBhdGggcGF0aCA9IHJvb3QuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQkJcGF0aHNUb1JlbW92ZS5hZGQobmV3IE9iamVjdFtde3BhdGgsIGRlZmF1bHREZXN0Rm9sZGVyfSk7Ci0JCQkJCQl9IAotCQkJCQl9CQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQ29tcHV0ZXMgdGhlIHZpcnR1YWwgY29tcG9uZW50IHBhdGggbWFwcGluZyBjaGFuZ2VzIHRoZSBuZWVkIHRvIGJlIG1hZGUgZHVlIHRvIGNoYW5nZXMgdG8KLQkgKiBub24tSmF2YSBmb2xkZXJzLiAKLQkgKi8gCi0JcHJpdmF0ZSB2b2lkIGdldE5vbkphdmFGb2xkZXJNYXBwaW5ncyhmaW5hbCBJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcywgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAsIGZpbmFsIExpc3QgcGF0aHNUb0FkZCwgZmluYWwgTGlzdCBwYXRoc1RvUmVtb3ZlLCBmaW5hbCBMaXN0IGNoYW5nZWRKYXZhUGF0aHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IG51bGw7Ci0JCWlmICh2aXJ0dWFsQ29tcCAhPSBudWxsKSB7Ci0JCQlyb290Rm9sZGVyID0gdmlydHVhbENvbXAuZ2V0Um9vdEZvbGRlcigpOwotCQl9Ci0JCU1hcCBzb3VyY2VUb1J1bnRpbWUgPSBudWxsOwotCQlpZiAodmlydHVhbENvbXAgIT0gbnVsbCkgewotCQkJc291cmNlVG9SdW50aW1lID0gZ2V0UmVzb3VyY2VNYXBwaW5ncyh2aXJ0dWFsQ29tcC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGRlbHRhc1tpXTsKLQkJCXByb2Nlc3NSZXNvdXJjZURlbHRhKGRlbHRhLCByb290Rm9sZGVyLCBzb3VyY2VUb1J1bnRpbWUsIHBhdGhzVG9BZGQsIHBhdGhzVG9SZW1vdmUsIGNoYW5nZWRKYXZhUGF0aHMpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUHJvY2Vzc2VzIGEgc2luZ2xlIElSZXNvdXJjZURlbHRhLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVzb3VyY2VEZWx0YShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciwgTWFwIHNvdXJjZVRvUnVudGltZSwgZmluYWwgTGlzdCBwYXRoc1RvQWRkLCBmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUsIGZpbmFsIExpc3QgY2hhbmdlZEphdmFQYXRocykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGREZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9jZXNzUmVzb3VyY2VEZWx0YShjaGlsZERlbHRhc1tpXSwgcm9vdEZvbGRlciwgc291cmNlVG9SdW50aW1lLCBwYXRoc1RvQWRkLCBwYXRoc1RvUmVtb3ZlLCBjaGFuZ2VkSmF2YVBhdGhzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZpbmFsIGludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPT0gSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgewotCQkJCWlmIChyb290Rm9sZGVyID09IG51bGwpIHsKLQkJCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQkJCQkvLyBtYWtlIGNlcnRhaW4gdGhpcyBpcyBhIEoyRUUgcHJvamVjdAotCQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpICE9IG51bGwpIHsKLQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQkJCXJvb3RGb2xkZXIgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCQkJCXNvdXJjZVRvUnVudGltZSA9IGdldFJlc291cmNlTWFwcGluZ3MocHJvamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBub3QgYSBKMkVFIHByb2plY3QKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbCBJUGF0aCBtb3ZlZEZyb20gPSBkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQlpZiAoY2hhbmdlZEphdmFQYXRocy5jb250YWlucyhtb3ZlZEZyb20pKSB7Ci0JCQkJCS8vIGRvbid0IHVwZGF0ZSByZW5hbWVkIEphdmEgc3JjIHBhdGhzCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZmluYWwgSVBhdGggbW92ZWRUbyA9IGRlbHRhLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IChJUGF0aCkgc291cmNlVG9SdW50aW1lLmdldChtb3ZlZEZyb20pOwotCQkJCS8vIGRvZXMgdGhlIG9sZCBwYXRoIGhhdmUgYSB2aXJ0dWFsIGNvbXBvbmVudCBtYXBwaW5nPwotCQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKHJ1bnRpbWVQYXRoKTsKLQkJCQkJLy8gb25seSBhZGQgaWYgdGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aHMgYXJlIG5vdCBlcXVhbCAodGhlc2UgY2FuIGJlIGVxdWFsIHdoZW4gdGhlIHJvb3QgZm9sZGVyIGlzIG1hcHBlZCBhbmQgdGhlIHByb2plY3QgaXMgcmVuYW1lZCkKLQkJCQkJaWYgKCFtb3ZlZEZyb20uZXF1YWxzKG1vdmVkVG8pKSB7Ci0JCQkJCQlwYXRoc1RvUmVtb3ZlLmFkZChuZXcgT2JqZWN0W117bW92ZWRGcm9tLCBmb2xkZXJ9KTsKLQkJCQkJCXBhdGhzVG9BZGQuYWRkKG5ldyBPYmplY3RbXXttb3ZlZFRvLCBmb2xkZXJ9KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE1hcCBnZXRSZXNvdXJjZU1hcHBpbmdzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpewotCQlmaW5hbCBNYXAgc291cmNlVG9SdW50aW1lID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJZmluYWwgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBjb21wb25lbnQpIHsKLQkJCQlmaW5hbCBMaXN0IGN1cnJlbnRSZXNvdXJjZXMgPSBjb21wb25lbnQuZ2V0UmVzb3VyY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY3VycmVudFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJZmluYWwgQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlzb3VyY2VUb1J1bnRpbWUucHV0KHJlc291cmNlLmdldFNvdXJjZVBhdGgoKS5tYWtlUmVsYXRpdmUoKSwgcmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZVRvUnVudGltZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHJpZXZlcyB0aGUgSVZpcnR1YWxGb2xkZXIgdG8gd2hpY2ggSmF2YSBzcmMgZm9sZGVycyBzaG91bGQgYmUgbWFwcGVkCi0JICovCi0JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciBnZXREZXN0aW5hdGlvbkZvbGRlcihmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElWaXJ0dWFsRm9sZGVyIHJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYy5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkvLyB3ZWIgcHJvamVjdHMgbWFwIHRvIFdFQi1JTkYvY2xhc3NlcwotCQkJcmV0dXJuIHJvb3QuZ2V0Rm9sZGVyKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTKSk7Ci0JCX0KLQkJLy8gYWxsIG90aGVyIEoyRUUgcHJvamVjdCB0eXBlcyAodGhhdCBhcmUgSmF2YSBwcm9qZWN0cykgbWFwIAotCQkvLyBKYXZhIHNyYyBmb2xkZXJzIHRvIHRoZSBwcm9qZWN0IHJvb3QKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL1Byb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDQ3NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3IubGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3IuUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5PcHRpb25hbFJlZmFjdG9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3REZWxldGVEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuRGVwZW5kZW5jeUdyYXBoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIExpc3RlbnMgZm9yIHByb2plY3QgcmVuYW1lL2RlbGV0ZSBldmVudHMgYW5kLCBpZiB0aGUgcHJvamVjdCBoYWQgdGhlCi0gKiBNb2R1bGVDb3JlIG5hdHVyZSwgZXhlY3V0ZXMgdGhlIGFwcHJvcHJpYXRlIGxvZ2ljIHRvIHVwZGF0ZQotICogcHJvamVjdCByZWZlcmVuY2VzLgotICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgSm9iIGZhbWlseSBpbiB3aGljaCBhbGwgcHJvamVjdCByZW5hbWUvZGVsZXRlIHJlZmFjdG9yaW5nIGpvYnMgYmVsb25nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUkVGQUNUT1JJTkdfSk9CX0ZBTUlMWSA9ICAib3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3IucHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIE1hcCBmcm9tIG5hbWUgb2YgZGVsZXRlZCBwcm9qZWN0IHRvIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGluc3RhbmNlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBkZWxldGVkUHJvamVjdE1ldGFkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBNYWludGFpbnMgYSBjYWNoZSBvZiBwcm9qZWN0IGRlcGVuY2VuY2llczsKLQkgKi8KLQkvL3ByaXZhdGUgZmluYWwgUHJvamVjdERlcGVuZGVuY3lDYWNoZSBjYWNoZTsKLQkKLQlwdWJsaWMgUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXIoKSB7Ly9maW5hbCBQcm9qZWN0RGVwZW5kZW5jeUNhY2hlIGRlcGVuZGVuY3lDYWNoZSkgewotCQkvL2NhY2hlID0gZGVwZW5kZW5jeUNhY2hlOwotCQkvLyBmb3JjZSBhIHJlZnJlc2ggb2YgdGhlIERlcGVuZGVuY3lHcmFwaE1hbmFnZXI7IHdhcyBoaXR0aW5nIGFuIE5QRQotCQkvLyBpbiBTdHJ1Y3R1cmVFZGl0IHdoZW4gdGhlIERHTSB3YXMgZ2V0dGluZyBjb25zdHJ1Y3RlZCBkdXJpbmcgdGhlIHJlY2VpcHQgb2YgdGhlCi0JCS8vIGZpcnN0IHByZS1kZWxldGUgZXZlbnQKLQkJRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5lZWQgdG8gY2FwdHVyZSBQUkVfREVMRVRFIGV2ZW50cyBzbyB0aGF0IG1ldGFkYXRhIGFib3V0IHRoZQotCQkvLyBkZWxldGVkIHByb2plY3QgY2FuIGJlIGNvbGxlY3RlZCBhbmQgY2FjaGVkCi0JCXRyeSB7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpIHsKLQkJCQkvLyBmb3Igbm93LCBvbmx5IGRlcGVuZGVuY2llcyBvbiBNb2R1bGVDb3JlTmF0dXJlIHByb2plY3RzCi0JCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvamVjdCBpcyBhY2Nlc3NpYmxlIGFuZCBoYXMgYm90aCBtb2R1bGUgY29yZSBhbmQgZmFjZXRlZCBuYXR1cmVzCi0JCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCkgIT0gbnVsbCkgewotCQkJCQljYWNoZURlbGV0ZWRQcm9qZWN0TWV0YWRhdGEocHJvamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlldmVudC5nZXREZWx0YSgpLmFjY2VwdCh0aGlzKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNhY2hlRGVsZXRlZFByb2plY3RNZXRhZGF0YShmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKHByb2plY3QsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhLlJFRkVSRVJfQ0FDSElORyk7Ci0JCS8vIHByZWNvbXB1dGUgdGhlIG1ldGFkYXRhIHdoaWxlIHRoZSBwcm9qZWN0IHN0aWxsIGV4aXN0cwotCQltZXRhZGF0YS5jb21wdXRlTWV0YWRhdGEoKTsKLQkJbWV0YWRhdGEuY29tcHV0ZVNlcnZlcnMoKTsKLQkJbWV0YWRhdGEuY29tcHV0ZURlcGVuZGVudE1ldGFkYXRhKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhLlJFRl9DQUNISU5HLAotCQkJCURlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmN5R3JhcGgoKS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMocHJvamVjdCkpOwotCQkvLywgY2FjaGUuZ2V0RGVwZW5kZW50UHJvamVjdHMocHJvamVjdCkpOwotCQlkZWxldGVkUHJvamVjdE1ldGFkYXRhLnB1dChwcm9qZWN0LmdldE5hbWUoKSwgbWV0YWRhdGEpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpIHsKLQkJCS8vIGRlbHRhIGlzIGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdCBzbyBrZWVwIGdvaW5nCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlwcm9jZXNzUHJvamVjdERlbHRhKChJUHJvamVjdCkgcmVzb3VyY2UsIGRlbHRhKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBQcm9jZXNzIHRoZSBwcm9qZWN0IGRlbHRhIGluIGEgc3luYyBibG9jay4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NQcm9qZWN0RGVsdGEoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWZpbmFsIGludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0KLQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJaWYgKGhhc0RlbGV0ZWRSZW1vdmVkRmxhZ3MoZmxhZ3MpKSB7Ci0JCQkJLy8gUmVtb3ZlIGFsbCBlbnRyaWVzIGludCB0aGUgcHJvamVjdCBkZXBlbmRlbmN5IGNhY2hlCi0JCQkJLy9jYWNoZS5yZW1vdmVQcm9qZWN0KHByb2plY3QpOwotCQkJCS8vIGlmIHRoZSBraW5kIGlzIFJFTU9WRUQgYW5kIHRoZXJlIGFyZSBubyBzcGVjaWFsIGZsYWdzLCB0aGUgcHJvamVjdCB3YXMgZGVsZXRlZAotCQkJCVByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBkZWxldGVkUHJvamVjdE1ldGFkYXRhLnJlbW92ZShwcm9qZWN0LmdldE5hbWUoKSk7IAotCQkJCS8vIG5vdGU6IG9ubHkgcHJvamVjdHMgd2l0aCBNb2R1bGVDb3JlTmF0dXJlIHdpbGwgaGF2ZSBjYWNoZWQgbWV0YWRhdGEKLQkJCQlpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiBPcHRpb25hbFJlZmFjdG9ySGFuZGxlci5nZXRJbnN0YW5jZSgpLnNob3VsZFJlZmFjdG9yRGVsZXRlZFByb2plY3QobWV0YWRhdGEpKSB7Ci0JCQkJICAgIHByb2Nlc3NEZWxldGUobWV0YWRhdGEpOwotCQkJCX0gCi0JCQl9IAotCQl9IGVsc2UgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgJiYgaGFzUmVuYW1lZEFkZGVkRmxhZ3MoZmxhZ3MpKSB7IC8vIHdhcyByZW5hbWVkCi0JCQkvLyBnZXQgdGhlIG9yaWdpbmFsIG5hbWUKLQkJCWZpbmFsIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8oIkFkZGVkIGV2ZW50IGZvciAiICsgb3JpZ2luYWxOYW1lICsgIiB3aXRoIGZsYWdzICIgKyBmbGFncyk7Ci0JCQkvLyB3ZSBnZXQgUFJFX0RFTEVURSBldmVudHMgb24gcmVuYW1lIHNvIHJldHJpZXZlIHRoaXMKLQkJCVByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIGRlbGV0ZWRQcm9qZWN0TWV0YWRhdGEucmVtb3ZlKG9yaWdpbmFsTmFtZSk7Ci0JCQkvLyBnZXQgdGhlIG1ldGFkYXRhIGZvciB0aGUgbmV3IHByb2plY3QKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG5ld01ldGFkYXRhID0gbmV3IFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKHByb2plY3QpOwotCQkJLy8gbm90ZTogb25seSBwcm9qZWN0cyB3aXRoIE1vZHVsZUNvcmVOYXR1cmUgd2lsbCBoYXZlIGNhY2hlZCBtZXRhZGF0YQotCQkJaWYgKG9yaWdpbmFsTWV0YWRhdGEgIT0gbnVsbCAmJiBPcHRpb25hbFJlZmFjdG9ySGFuZGxlci5nZXRJbnN0YW5jZSgpLnNob3VsZFJlZmFjdG9yUmVuYW1lZFByb2plY3Qob3JpZ2luYWxNZXRhZGF0YSkpIHsKLQkJCQluZXdNZXRhZGF0YS5jb21wdXRlTWV0YWRhdGEob3JpZ2luYWxNZXRhZGF0YS5nZXRQcm9qZWN0KCkpOwotCQkJCXByb2Nlc3NSZW5hbWUob3JpZ2luYWxNZXRhZGF0YSwgbmV3TWV0YWRhdGEsIGRlbHRhKTsKLQkJCQkvLyBSZW5hbWUgYWxsIGVudHJpZXMgaW4gdGhlIHByb2plY3QgZGVwZW5kZW5jeSBjYWNoZQotCQkJCS8vY2FjaGUucmVwbGFjZVByb2plY3Qob3JpZ2luYWxQcm9qZWN0LCBwcm9qZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbGlrZWx5IGR1ZSB0byBtaXNzaW5nIHRoZSBwcmUtZGVsZXRlIGV2ZW50LCBzbyBzZXQgdGhlIG9yaWdpbmFsIHRvIGEgbWV0YWRhdGEgYmFzZWQgb24gbmV3IHByb2plY3QKLQkJCQkvLyBhbmQgcmVzZXQgcHJvamVjdCB0byBvbmUgYmFzZWQgb24gb3JpZ2luYWwgbmFtZQotCQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJwcmVfZGVsZXRlX25vdF9yZWNlaXZlZF9mb3JfcmVuYW1lZCIsIG5ldyBPYmplY3RbXXtvcmlnaW5hbE5hbWUgKyAiICIgKyBmbGFnc30pKTsKLQkJCX0KLQkJfSAKLQkJLy9lbHNlIGlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgeyAKLQkJLy8gKHJlKWNvbXB1dGUgdGhlIGRlcGVuZGVuY2llcwotCQkvL2NhY2hlLnJlZnJlc2hEZXBlbmRlbmNpZXMocHJvamVjdCk7Ci0JCS8vfQkJCi0JfQotCQotCS8qCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgYWRkZWQgcHJvamVjdCB3YXMgcmVuYW1lZCBiYXNlZCBvbiB0aGUgSVJlc291cmNlRGVsdGEgZmxhZ3MgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1JlbmFtZWRBZGRlZEZsYWdzKGZpbmFsIGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pID4gMAotCQkJJiYgKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAgIAotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcmVtb3ZlZCBwcm9qZWN0IHdhcyBkZWxldGVkIGJhc2VkIG9uIHRoZSBJUmVzb3VyY2VEZWx0YSBmbGFncyAKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGVsZXRlZFJlbW92ZWRGbGFncyhmaW5hbCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSA9PSAwIAotICAgICAgICAgICAgICAgICYmIChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCQotCS8qCi0JICogUHJvY2Vzc2VzIHRoZSByZW5hbWluZyBvZiBhIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZW5hbWUoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgb3JpZ2luYWxNZXRhZGF0YSwgZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgbmV3TWV0YWRhdGEsIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCVdvcmtzcGFjZUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKCJKMkVFUHJvamVjdFJlbmFtZUpvYiIpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIuUFJPSkVDVF9NRVRBREFUQSwgbmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIuT1JJR0lOQUxfUFJPSkVDVF9NRVRBREFUQSwgb3JpZ2luYWxNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5SRVNPVVJDRV9ERUxUQSwgZGVsdGEpOyAgICAgICAgICAgICAgICAKLQkJCQl0cnkgewotCQkJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZmluYWwgU3RyaW5nIG1zZyA9IFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfdXBkYXRpbmdfcHJvamVjdF9vbl9yZW5hbWUiLCBuZXcgT2JqZWN0W117b3JpZ2luYWxNZXRhZGF0YS5nZXRQcm9qZWN0TmFtZSgpfSk7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOwotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgZSk7Ci0JCQkJfQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKGZpbmFsIE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gUFJPSkVDVF9SRUZBQ1RPUklOR19KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQkJfQotCQl9OwotCQkvLyBYWFggbm90ZTogbWlnaHQgd2FudCB0byBjb25zaWRlciBzd2l0Y2hpbmcgdG8gYSBNdWx0aVJ1bGUgZm9yIG9wdGltaXphdGlvbgotCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCQotCS8qCi0JICogUHJvY2Vzc2VzIHRoZSBkZWxldGlvbiBvZiBhIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWxldGUoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgbWV0YWRhdGEpIHsKLQkJV29ya3NwYWNlSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoIkoyRUVQcm9qZWN0RGVsZXRlSm9iIikgewotCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUHJvamVjdERlbGV0ZURhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlci5QUk9KRUNUX01FVEFEQVRBLCBtZXRhZGF0YSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBtc2cgPSBSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3VwZGF0aW5nX3Byb2plY3Rfb25fZGVsZXRlIiwgbmV3IE9iamVjdFtde21ldGFkYXRhLmdldFByb2plY3ROYW1lKCl9KTsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG1zZyk7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhmaW5hbCBPYmplY3QgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIFBST0pFQ1RfUkVGQUNUT1JJTkdfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJCX0KLQkJfTsKLQkJLy8gWFhYIG5vdGU6IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgc3dpdGNoaW5nIHRvIGEgTXVsdGlSdWxlIGZvciBvcHRpbWl6YXRpb24KLQkJam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9BYnN0cmFjdE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQWJzdHJhY3RPcHRpb25hbFJlZmFjdG9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdkMTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9BYnN0cmFjdE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyIGltcGxlbWVudHMgSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyewotCQotCXB1YmxpYyBBYnN0cmFjdE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyKCl7Ci0JCQotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLklPcHRpb25hbFJlZmFjdG9ySGFuZGxlciNzaG91bGRSZWZhY3RvckRlbGV0ZWRQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZWxldGVkUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5JT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIjc2hvdWxkUmVmYWN0b3JSZW5hbWVkUHJvamVjdChvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck1ldGFkYXRhKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFJlZmFjdG9yUmVuYW1lZFByb2plY3QoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5JT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIjc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25EZWxldGUob3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSwgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPbkRlbGV0ZShmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZWxldGVkTWV0YWRhdGEsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyI3Nob3VsZFJlZmFjdG9yRGVwZW5kZW50UHJvamVjdE9uUmVuYW1lKG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25SZW5hbWUoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVuYW1lZE1ldGFkYXRhLCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL0NyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViMGZiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBFeHRlbnNpb24gb2YgPGNvZGU+Q3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wPC9jb2RlPiB0aGF0IHN1cHBvcnRzIHRoZSBvcHRpb25hbCBjcmVhdGlvbiBvZgotICogdGhlIGNvbXBvbmVudCBhbmQgcHJvamVjdCByZWZlcmVuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcCBleHRlbmRzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCB7Ci0JCi0JcHVibGljIENyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3AoZmluYWwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIXZhbGlkYXRlRWRpdCgpLmlzT0soKSkKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0NPTVBPTkVOVF9SRUYpKSB7Ci0JCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50cyhtb25pdG9yKTsKLQkJfQotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfUFJPSkVDVF9SRUYpKSB7Ci0JCQlhZGRQcm9qZWN0UmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL0NyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL0NyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg1MTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9DcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBQcm9wZXJ0eSB0aGF0IGhvbGRzIGEgQm9vbGVuIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgaXMKLQkgKiBhZGRlZC9yZW1vdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9DT01QT05FTlRfUkVGID0gIklPcHRpb25hbFJlZmVyZW5jZVByb3BlcnRpZXMuQ1JFQVRFX0NPTVBPTkVOVF9SRUYiOwotCS8qKgotCSAqIFByb3BlcnR5IHRoYXQgaG9sZHMgYSBCb29sZW4gd2hpY2ggY29udHJvbHMgd2hldGhlciB0aGUgLnByb2plY3QgcmVmZXJlbmNlIGlzCi0JICogYWRkZWQvcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUFJPSkVDVF9SRUYgPSAiSU9wdGlvbmFsUmVmZXJlbmNlUHJvcGVydGllcy5DUkVBVEVfUFJPSkVDVF9SRUYiOwotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wKG1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX0NPTVBPTkVOVF9SRUYpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfUFJPSkVDVF9SRUYpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChDUkVBVEVfQ09NUE9ORU5UX1JFRi5lcXVhbHMocHJvcGVydHlOYW1lKSAKLQkJCQl8fENSRUFURV9QUk9KRUNUX1JFRi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSAKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9JT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9JT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmNWY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBjb21wdXRlIHdoZXRoZXIgdGhlIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZWQgSjJFRQotICogcmVmYWN0b3JpbmcgbG9naWMgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4gYSBwcm9qZWN0IGlzIGRlbGV0ZWQgb3IgcmVuYW1lZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGRldGVybWluZSBpZiBhdXRvbWF0aWMgcmVmYWN0b3JpbmcgbG9naWMgc2hvdWxkIGJlIGV4ZWN1dGVkCi0gICAgICogZm9yIGEgZ2l2ZW4gZGVsZXRlZCBwcm9qZWN0LiBUaGUgcHJvamVjdCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQuICAKLSAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIGZvciB0aGUgZGVsZXRlZCBwcm9qZWN0LgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIFRydWUgdG8gcmVmYWN0b3IsIGZhbHNlIHRvIHNraXAgcmVmYWN0b3JpbmcgZm9yIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMuCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZWxldGVkUHJvamVjdChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGRldGVybWluZSBpZiBhdXRvbWF0aWMgcmVmYWN0b3JpbmcgbG9naWMgc2hvdWxkIGJlIGV4ZWN1dGVkCi0gICAgICogZm9yIGEgZ2l2ZW4gcmVuYW1lZCBwcm9qZWN0LiBUaGUgcHJvamVjdCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGJlIHJlbmFtZWQgd2hlbgotICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgZm9yIHRoZSByZW5hbWVkIHByb2plY3QgKHByZS1yZW5hbWUpLgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIFRydWUgdG8gcmVmYWN0b3IsIGZhbHNlIHRvIHNraXAgcmVmYWN0b3JpbmcgZm9yIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JSZW5hbWVkUHJvamVjdChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIGF1dG9tYXRpYyByZWZhY3RvcmluZyBsb2dpYyBzaG91bGQgYmUgZXhlY3V0ZWQKLSAgICAgKiBvbiB0aGUgc3BlY2lmaWVkIGRlcGVuZGVudCBwcm9qZWN0IHdoZW4gYSByZWZlcmVuY2VkIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KLSAgICAgKiBUaGUgcmVmZXJlbmNlZCBwcm9qZWN0IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVsZXRlZE1ldGFkYXRhIE1ldGFkYXRhIGZvciB0aGUgZGVsZXRlZCBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBkZXBlbmRlbnRNZXRhZGF0YSBNZXRhZGF0YSBmb3IgdGhlIGRlcGVuZGVudCBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVHJ1ZSB0byByZWZhY3RvciB0aGUgZGVwZW5kZW50IHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25EZWxldGUoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVsZXRlZE1ldGFkYXRhLCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIGF1dG9tYXRpYyByZWZhY3RvcmluZyBsb2dpYyBzaG91bGQgYmUgZXhlY3V0ZWQKLSAgICAgKiBvbiB0aGUgc3BlY2lmaWVkIGRlcGVuZGVudCBwcm9qZWN0IHdoZW4gYSByZWZlcmVuY2VkIHByb2plY3QgaGFzIGJlZW4gcmVuYW1lZC4KLSAgICAgKiBUaGUgcmVmZXJlbmNlZCBwcm9qZWN0IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gcmVuYW1lZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVuYW1lZE1ldGFkYXRhIE1ldGFkYXRhIGZvciB0aGUgcmVuYW1lZCBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBkZXBlbmRlbnRNZXRhZGF0YSBNZXRhZGF0YSBmb3IgdGhlIGRlcGVuZGVudCBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVHJ1ZSB0byByZWZhY3RvciB0aGUgZGVwZW5kZW50IHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25SZW5hbWUoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVuYW1lZE1ldGFkYXRhLCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9PcHRpb25hbFJlZmFjdG9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNkN2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9PcHRpb25hbFJlZmFjdG9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBPcHRpb25hbFJlZmFjdG9ySGFuZGxlciBpbXBsZW1lbnRzIElPcHRpb25hbFJlZmFjdG9ySGFuZGxlcnsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlQgPSAib3B0aW9uYWxSZWZhY3RvckhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PUFRJT05BTF9SRUZBQ1RPUiA9ICJvcHRpb25hbFJlZmFjdG9ySGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyIGluc3RhbmNlID0gbmV3IE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyKCk7Ci0JcHJpdmF0ZSBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIgW10gaGFuZGxlcnMgPSBudWxsOwotCQotCXByaXZhdGUgT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIgKCkgewotCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKTsKLQkJCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCQkJaGFuZGxlcnMgPSByZWFkZXIuZ2V0SGFuZGxlcnMoKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPcHRpb25hbFJlZmFjdG9ySGFuZGxlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLklPcHRpb25hbFJlZmFjdG9ySGFuZGxlciNzaG91bGRSZWZhY3RvckRlbGV0ZWRQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZWxldGVkUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBmb3IoaW50IGk9MDtpPGhhbmRsZXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGlmKCFoYW5kbGVyc1tpXS5zaG91bGRSZWZhY3RvckRlbGV0ZWRQcm9qZWN0KG1ldGFkYXRhKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLklPcHRpb25hbFJlZmFjdG9ySGFuZGxlciNzaG91bGRSZWZhY3RvclJlbmFtZWRQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JSZW5hbWVkUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBmb3IoaW50IGk9MDtpPGhhbmRsZXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGlmKCFoYW5kbGVyc1tpXS5zaG91bGRSZWZhY3RvclJlbmFtZWRQcm9qZWN0KG1ldGFkYXRhKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyI3Nob3VsZFJlZmFjdG9yRGVwZW5kZW50UHJvamVjdE9uRGVsZXRlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25EZWxldGUoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVsZXRlZE1ldGFkYXRhLCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSkgewotICAgICAgICBmb3IoaW50IGk9MDtpPGhhbmRsZXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGlmKCFoYW5kbGVyc1tpXS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPbkRlbGV0ZShkZWxldGVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyI3Nob3VsZFJlZmFjdG9yRGVwZW5kZW50UHJvamVjdE9uUmVuYW1lKG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25SZW5hbWUoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVuYW1lZE1ldGFkYXRhLCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSkgewotICAgICAgICBmb3IoaW50IGk9MDtpPGhhbmRsZXJzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGlmKCFoYW5kbGVyc1tpXS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPblJlbmFtZShyZW5hbWVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLQotCXByaXZhdGUgY2xhc3MgT3B0aW9uYWxSZWZhY3RvckhhbmRsZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwcml2YXRlIExpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJcHVibGljIE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCQlzdXBlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UKTsKLQkJfSAKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoVEFHX09QVElPTkFMX1JFRkFDVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQotCQkJCS8qCi0JCQkJICogQmVjYXVzZSB0aGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgaXMgY3JlYXRlZCBmcm9tIGEgc3RhdGljIHNpbmdsZXRvbiBmaWVsZCwgYW5kCi0JCQkJICogdGhlIHJlZ2lzdHJ5IGlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIHR5cGUsIG90aGVyIHRocmVhZHMgY2Fubm90Ci0JCQkJICogY29tcGV0ZSB3aXRoIHJlYWRFbGVtZW50KCkgZm9yIGFjY2VzcyB0byA8aT5kZXNjcmlwdG9yczwvaT4KLQkJCQkgKi8KLQkJCQlmaW5hbCBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXJbXSBoYW5kbGVyQXJyYXkgPSBuZXcgSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyWzFdOwotCi0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJaGFuZGxlckFycmF5WzBdID0gKElPcHRpb25hbFJlZmFjdG9ySGFuZGxlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQkJaGFuZGxlcnMuYWRkKGhhbmRsZXJBcnJheVswXSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIgW10gZ2V0SGFuZGxlcnMoKSB7Ci0JCQlJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIgW10gaGFuZGxlcnNBcnJheSA9IG5ldyBJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXJbaGFuZGxlcnMuc2l6ZSgpXTsKLQkJCWZvcihpbnQgaT0wO2k8aGFuZGxlcnNBcnJheS5sZW5ndGg7aSsrKXsKLQkJCQloYW5kbGVyc0FycmF5W2ldID0gKElPcHRpb25hbFJlZmFjdG9ySGFuZGxlciloYW5kbGVycy5nZXQoaSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGFuZGxlcnNBcnJheTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0RGVsZXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0RGVsZXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2YWJlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdERlbGV0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFByb2plY3REZWxldGVEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCVByb2plY3RSZWZhY3RvcmluZ0RhdGFNb2RlbFByb3ZpZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdERlbGV0ZU9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdERlbGV0ZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3REZWxldGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMTU3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdERlbGV0ZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBTdWJjbGFzcyBvZiA8Y29kZT5Qcm9qZWN0UmVmYWN0b3JPcGVyYXRpb248L2NvZGU+IHRoYXQgY29udGFpbnMgZGVsZXRpb24tc3BlY2lmaWMgbG9naWMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0RGVsZXRlT3BlcmF0aW9uIGV4dGVuZHMgUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBQcm9qZWN0RGVsZXRlT3BlcmF0aW9uKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck9wZXJhdGlvbiN1cGRhdGVQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEpIAotCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBtZXRhZGF0YSBmb3IgZGVwZW5kZW50IHByb2plY3RzCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXBlbmRlbnRQcm9qZWN0cyhmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEsCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCSAgICAvLyBJZiB0aGlzIGlzIG5vdCBhbiBFQVIsIHVwZGF0ZSBtZXRhZGF0YSBmb3IgZGVwZW5kZW50IHByb2plY3RzCi0gICAgICAgIC8vIChub3QgcGVyZm9ybWluZyBhbnkgcmVmYWN0b3JpbmcgZm9yIHByb2plY3RzIHRoYXQgZGVwZW5kIG9uIEVBUidzIHJpZ2h0IG5vdykKLSAgICAgICAgaWYgKCFyZWZhY3RvcmVkTWV0YWRhdGEuaXNFQVIoKSkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlRGVwZW5kZW50UHJvamVjdHMocmVmYWN0b3JlZE1ldGFkYXRhLCBtb25pdG9yKTsKLSAgICAgICAgfQotCQkvLyB1cGRhdGUgYW55IHNlcnZlciBpbnN0YW5jZSByZWZzIHRvIHRoZSByZWZhY3RvcmVkIHByb2plY3QKLQkJc3VwZXIudXBkYXRlU2VydmVyUmVmcyhyZWZhY3RvcmVkTWV0YWRhdGEsIG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck9wZXJhdGlvbiN1cGRhdGVEZXBlbmRlbnRFQVJQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVwZW5kZW50RUFSUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZ2V0SW5zdGFuY2UoKS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPbkRlbGV0ZShyZWZhY3RvcmVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhKSkgewotICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBjcmVhdGVEYXRhTW9kZWwoZGVwZW5kZW50TWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JPcGVyYXRpb24jdXBkYXRlRGVwZW5kZW50TW9kdWxlUHJvamVjdChvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck1ldGFkYXRhLCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck1ldGFkYXRhKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlcGVuZGVudE1vZHVsZVByb2plY3QoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVwZW5kZW50TWV0YWRhdGEsIAotCQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmdldEluc3RhbmNlKCkuc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25EZWxldGUocmVmYWN0b3JlZE1ldGFkYXRhLCBkZXBlbmRlbnRNZXRhZGF0YSkpIHsKLSAgICAgICAgICAgIGZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gY3JlYXRlRGF0YU1vZGVsKGRlcGVuZGVudE1ldGFkYXRhLCByZWZhY3RvcmVkTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBVcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyKCkpOwotICAgICAgICAgICAgZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotICAgICAgICB9Ci0JfQotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEsCi0JCQlmaW5hbCBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9NRVRBREFUQSwgcmVmYWN0b3JlZE1ldGFkYXRhKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KERFUEVOREVOVF9QUk9KRUNUX01FVEFEQVRBLCBkZXBlbmRlbnRNZXRhZGF0YSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3Rvck1ldGFkYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1Yjc4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0vKioKLSAqIElEYXRhTW9kZWwgb2JqZWN0IHByb3BlcnR5IHN0b3JlZCB1bmRlciB0aGUgcHJvcGVydHkgbmFtZSAKLSAqIHtAbGluayBQcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlciNQUk9KRUNUX01FVEFEQVRBfS4KLSAqIAotICogIE5vdGU6IHRoaXMgY2xhc3MgaXMgbm90IG11bHRpLXRocmVhZCBzYWZlLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgewotCQotCXB1YmxpYyBzdGF0aWMgaW50IE5PTl9DQUNISU5HID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBSRUZfQ0FDSElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgUkVGRVJFUl9DQUNISU5HID0gMjsKLQkKLQlwcml2YXRlIGludCBfdmlydHVhbENvbXBDYWNoaW5nID0gTk9OX0NBQ0hJTkc7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBfcHJvamVjdDsKLQlwcml2YXRlIElTZXJ2ZXJbXSBzZXJ2ZXJzOwotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAgPSBudWxsOwotCXByaXZhdGUgZmluYWwgTGlzdCBkZXBlbmRlbnRNZXRhZGF0YSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gamF2YU5hdHVyZTsKLQlwcml2YXRlIGJvb2xlYW4gbW9kdWxlQ29yZU5hdHVyZTsKLQlwcml2YXRlIElNb2R1bGUgbW9kdWxlOwotCXByaXZhdGUgU2V0IGZhY2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgZWFyVG9Nb2R1bGVVUkkgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YShmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGludCB2aXJ0dWFsQ29tcENhY2hpbmcpIHsKLQkJdGhpcyhwcm9qZWN0KTsKLQkJX3ZpcnR1YWxDb21wQ2FjaGluZyA9IHZpcnR1YWxDb21wQ2FjaGluZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tcHV0ZU1ldGFkYXRhKCkgewotICAgICAgICBjb21wdXRlTWV0YWRhdGEoX3Byb2plY3QpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjb21wdXRlTWV0YWRhdGEoZmluYWwgSVByb2plY3Qgb2xkUHJvamVjdCkgewotCQl0cnkgewotCQkJamF2YU5hdHVyZSA9IF9wcm9qZWN0Lmhhc05hdHVyZSgib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCQltb2R1bGVDb3JlTmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKF9wcm9qZWN0KSAhPSBudWxsOwotCQkJaWYgKG1vZHVsZUNvcmVOYXR1cmUpIHsKLQkJCQlpZiAoX3ZpcnR1YWxDb21wQ2FjaGluZyA9PSBSRUZfQ0FDSElORykgewotCQkJCQl2aXJ0dWFsQ29tcCA9IG5ldyBSZWZDYWNoaW5nVmlydHVhbENvbXBvbmVudChDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChfcHJvamVjdCkpOwotCQkJCX0gZWxzZSBpZiAoX3ZpcnR1YWxDb21wQ2FjaGluZyA9PSBSRUZFUkVSX0NBQ0hJTkcpIHsKLQkJCQkJdmlydHVhbENvbXAgPSBuZXcgUmVmZXJlckNhY2hpbmdWaXJ0dWFsQ29tcG9uZW50KENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KF9wcm9qZWN0KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmlydHVhbENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChfcHJvamVjdCk7CQkJCi0JCQkJfQotCQkJCWZpbmFsIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShfcHJvamVjdCk7Ci0JCQkJbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUoX3Byb2plY3QpOwotICAgICAgICAgICAgICAgIC8vIFhYWCBEdWUgdG8gcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyIG9yZGVyIHVuY2VydGFpbnR5LCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgLy8gbW9kdWxlIG1heSBiZSBlaXRoZXIgdGhlIG5ldyAoY29ycmVjdCkgcHJvamVjdCBvciB0aGUgb2xkIHByb2plY3Qgc28gbmVlZCB0byB0cnkgYm90aAotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCAmJiAhX3Byb2plY3QuZXF1YWxzKG9sZFByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKG9sZFByb2plY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYWNldHMgPSBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9IAotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXB1dGVTZXJ2ZXJzKCkgewotCQlzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUobW9kdWxlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKCkgewotCQlyZXR1cm4gc2VydmVyczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tcHV0ZURlcGVuZGVudE1ldGFkYXRhKGZpbmFsIGludCB2aXJ0dWFsQ29tcG9uZW50Q2FjaGluZywgZmluYWwgSVByb2plY3RbXSBkZXBlbmRlbnRQcm9qZWN0cykgewotCQkvLyBnZXQgYWxsIHJlZmVyZW5jaW5nIHByb2plY3RzIGFuZCBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBlYWNoIG9uZQotCQlQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBtZXRhZGF0YTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbnRQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSVByb2plY3QgZGVwZW5kZW50UHJvamVjdCA9IGRlcGVuZGVudFByb2plY3RzW2ldOwotCQkJaWYgKGRlcGVuZGVudFByb2plY3QuZXhpc3RzKCkgJiYgZGVwZW5kZW50UHJvamVjdC5pc09wZW4oKSkgewotCQkJCW1ldGFkYXRhID0gbmV3IFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKGRlcGVuZGVudFByb2plY3RzW2ldLCB2aXJ0dWFsQ29tcG9uZW50Q2FjaGluZyk7Ci0JCQkJbWV0YWRhdGEuY29tcHV0ZU1ldGFkYXRhKCk7Ci0JCQkJZGVwZW5kZW50TWV0YWRhdGEuYWRkKG1ldGFkYXRhKTsKLQkJCQlpZiAobWV0YWRhdGEuaXNFQVIoKSkgewotCQkJCQlmaW5hbCBTdHJpbmcgdXJpID0gZ2V0TW9kdWxlVVJJKGRlcGVuZGVudFByb2plY3QsIHZpcnR1YWxDb21wKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQllYXJUb01vZHVsZVVSSS5wdXQoZGVwZW5kZW50UHJvamVjdC5nZXROYW1lKCksIHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhpcyBwcm9qZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVBUiBwcm9qZWN0LCByZXRyaWV2ZXMgdGhlIG1vZHVsZSBVUkkgZm9yIHRoZSBkZXBlbmRlbmN5IG9yIG51bGwgaWYKLQkgKiBpdCBjb3VsZCBub3QgYmUgcmV0cmlldmVkLgotCSAqIEBwYXJhbSBlYXJOYW1lIE5hbWUgb2YgdGhlIEVBUiBwcm9qZWN0LgotCSAqIEByZXR1cm4gTW9kdWxlIFVSSSBmb3IgdGhlIHByb2plY3QgaW4gdGhlIGNvbnRleHQgb2YgdGhhdCBFQVIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVVUkkoZmluYWwgU3RyaW5nIGVhck5hbWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGVhclRvTW9kdWxlVVJJLmdldChlYXJOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kdWxlVVJJKGZpbmFsIElQcm9qZWN0IGVhclByb2plY3QsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWxQcm92aWRlciA9IG51bGw7Ci0JCWVhck1vZGVsUHJvdmlkZXIgPSAoSUVBUk1vZGVsUHJvdmlkZXIpIE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZWFyUHJvamVjdCk7Ci0JCWlmIChlYXJNb2RlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBlYXJNb2RlbFByb3ZpZGVyLmdldE1vZHVsZVVSSShjb21wKTsgCi0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBJUHJvamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIElNb2R1bGUgZm9yIHRoZSBwcm9qZWN0LCBvciBudWxsIGlmIG5vIElNb2R1bGUgcmVwcmVzZW50YXRpb24KLQkgKiBleGlzdHMuCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gX3Byb2plY3QuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgYWxsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGZvciBkZXBlbmRlbnQgcHJvamVjdHMuCi0JICogV2lsbCBiZSBlbXB0eSBpZiBub3QgY29tcHV0ZWQuCi0JICovCi0JcHVibGljIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhW10gZ2V0RGVwZW5kZW50TWV0YWRhdGEoKSB7Ci0JCXJldHVybiAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGFbXSkgZGVwZW5kZW50TWV0YWRhdGEudG9BcnJheShuZXcgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGFbZGVwZW5kZW50TWV0YWRhdGEuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIElWaXJ0dWFsQ29tcG9uZW50IGZvciB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VmlydHVhbENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHZpcnR1YWxDb21wOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNKYXZhTmF0dXJlKCkgeyAKLQkJcmV0dXJuIGphdmFOYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc01vZHVsZUNvcmVOYXR1cmUoKSB7Ci0JCXJldHVybiBtb2R1bGVDb3JlTmF0dXJlOwotCX0KLQkKLQlwdWJsaWMgU2V0IGdldFByb2plY3RGYWNldHMoKSB7Ci0JCXJldHVybiBmYWNldHM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0ZhY2V0KGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQpIHsKLQkJIGZvcihJdGVyYXRvciBpdHIgPSBmYWNldHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiAgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgaWYoZnYuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZmFjZXQpIHsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRUFSKCkgewotCQlyZXR1cm4gaGFzRmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpKTsgCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFSkIoKSB7Ci0JCXJldHVybiBoYXNGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkpOyAKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNXZWIoKSB7Ci0JCXJldHVybiBoYXNGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FwcENsaWVudCgpIHsKLQkJcmV0dXJuIGhhc0ZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSk7IAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGhhc0ZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXRpbGl0eSgpIHsKLQkJcmV0dXJuIGhhc0ZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkpOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQgaW1wbGVtZW50cyBJVmlydHVhbENvbXBvbmVudCB7Ci0JCXByb3RlY3RlZCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCBfY29tcDsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gX2NhY2hpbmcgPSB0cnVlOwotCQlwdWJsaWMgQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQkJX2NvbXAgPSBjb21wOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCQlfY29tcC5hZGRSZWZlcmVuY2VzKHJlZmVyZW5jZXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCV9jb21wLmNyZWF0ZSh1cGRhdGVGbGFncywgYU1vbml0b3IpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBfY29tcC5leGlzdHMoKTsKLQkJfQotCQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQkJcmV0dXJuIF9jb21wLmdldENvbXBvbmVudCgpOwotCQl9Ci0JCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIF9jb21wLmdldE1ldGFQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcHVibGljIElQYXRoW10gZ2V0TWV0YVJlc291cmNlcygpIHsKLQkJCXJldHVybiBfY29tcC5nZXRNZXRhUmVzb3VyY2VzKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIF9jb21wLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlcGxveWVkTmFtZSgpIHsKLQkJCXJldHVybiBfY29tcC5nZXREZXBsb3llZE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCXJldHVybiBfY29tcC5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJCXJldHVybiBfY29tcC5nZXRSZWZlcmVuY2UoYUNvbXBvbmVudE5hbWUpOwotCQl9Ci0JCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCQlyZXR1cm4gX2NvbXAuZ2V0UmVmZXJlbmNlcygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENhY2hpbmcoYm9vbGVhbiBjYWNoaW5nKSB7Ci0JCQlfY2FjaGluZyA9IGNhY2hpbmc7Ci0JCX0KLQkJcHVibGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCkgewotCQkJcmV0dXJuIF9jb21wLmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCQl9Ci0JCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotCQkJcmV0dXJuIF9jb21wLmdldFJvb3RGb2xkZXIoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJCXJldHVybiBfY29tcC5pc0JpbmFyeSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQkJX2NvbXAuc2V0TWV0YVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TWV0YVByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJCV9jb21wLnNldE1ldGFQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TWV0YVJlc291cmNlcyhJUGF0aFtdIHRoZU1ldGFSZXNvdXJjZVBhdGhzKSB7Ci0JCQlfY29tcC5zZXRNZXRhUmVzb3VyY2VzKHRoZU1ldGFSZXNvdXJjZVBhdGhzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gdGhlUmVmZXJlbmNlcykgewotCQkJX2NvbXAuc2V0UmVmZXJlbmNlcyh0aGVSZWZlcmVuY2VzKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIF9jb21wLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJcmV0dXJuIF9jb21wLmVxdWFscyhvKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBfY29tcC5oYXNoQ29kZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIF9jb21wLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShJVmlydHVhbFJlZmVyZW5jZSBhUmVmZXJlbmNlKSB7Ci0JCQkoKFZpcnR1YWxDb21wb25lbnQpX2NvbXApLnJlbW92ZVJlZmVyZW5jZShhUmVmZXJlbmNlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVmQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBDYWNoaW5nVmlydHVhbENvbXBvbmVudCB7Ci0JCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBjYWNoZWRSZWZzOwotCQlwdWJsaWMgUmVmQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQkJc3VwZXIoY29tcCk7Ci0JCQljYWNoZWRSZWZzID0gKChWaXJ0dWFsQ29tcG9uZW50KWNvbXApLmdldEFsbFJlZmVyZW5jZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBnZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZzW2ldOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKS5lcXVhbHMoYUNvbXBvbmVudE5hbWUpKQotCQkJCQlyZXR1cm4gcmVmZXJlbmNlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCWlmIChfY2FjaGluZykgewotCQkJCXJldHVybiBjYWNoZWRSZWZzOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBSZWZlcmVyQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBDYWNoaW5nVmlydHVhbENvbXBvbmVudCB7Ci0JCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnRbXSBjYWNoZWRSZWZlcmVyczsKLQkJcHVibGljIFJlZmVyZXJDYWNoaW5nVmlydHVhbENvbXBvbmVudChmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCQlzdXBlcihjb21wKTsKLQkJCWNhY2hlZFJlZmVyZXJzID0gY29tcC5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKTsKLQkJfQotCi0JCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpIHsKLQkJCWlmIChfY2FjaGluZykgewotCQkJCXJldHVybiBjYWNoZWRSZWZlcmVyczsKLQkJCX0KLQkJCXJldHVybiBfY29tcC5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhOWZkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5SZWZhY3RvclJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuRGVsZXRlZE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2plY3QgcmVmYWN0b3Jpbmcgb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RSZWZhY3Rvck9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJlZmFjdG9yaW5nIG9wZXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBkYXRhIG1vZGVsLgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgZGF0YSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSBnZXRQcm9qZWN0TWV0YWRhdGEoKTsKLQotCQkJLy8gVXBkYXRlIHRoaXMgcHJvamVjdCdzIG1ldGFkYXRhCi0JCQlpZiAocmVmYWN0b3JlZE1ldGFkYXRhLmhhc01vZHVsZUNvcmVOYXR1cmUoKSkgewotCQkJCXVwZGF0ZVByb2plY3QocmVmYWN0b3JlZE1ldGFkYXRhKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlRGVwZW5kZW50UHJvamVjdHMocmVmYWN0b3JlZE1ldGFkYXRhLCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHByb2plY3QncyBvd24gbWV0YWRhdGEuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEpIAotCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgbWV0YWRhdGEgZm9yIGRlcGVuZGVudCBwcm9qZWN0cwotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVwZW5kZW50UHJvamVjdHMoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhLAotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gZ2V0IHRoZSBtZXRhZGF0YSBmb3IgYWxsIGRlcGVuZGVudCBwcm9qZWN0cwotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YVtdIGRlcGVuZGVudE1ldGFkYXRhID0gcmVmYWN0b3JlZE1ldGFkYXRhLmdldERlcGVuZGVudE1ldGFkYXRhKCk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygidGFza19uYW1lIiksIGRlcGVuZGVudE1ldGFkYXRhLmxlbmd0aCk7IAotCQl9Ci0JCVByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG1ldGFkYXRhOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVudE1ldGFkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQltZXRhZGF0YSA9IGRlcGVuZGVudE1ldGFkYXRhW2ldOwotCQkJLy8gaWYgdGhlIHByb2plY3QgaXMgYW4gRUFSLCBleGVjdXRlIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGNyZWF0ZWQgYnkgdGhlCi0JCQkvLyBEZXBlbmRlbnRFQVJVcGRhdGVQcm92aWRlcjsgaWYgdGhlIHByb2plY3QgaXMgYSBub24tRUFSIHByb2plY3Qgd2l0aCB0aGUKLQkJCS8vIG1vZHVsZSBjb3JlIG5hdHVyZSwgZXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgdXBkYXRlCi0JCQlpZiAobWV0YWRhdGEuaXNFQVIoKSkgewotCQkJCXVwZGF0ZURlcGVuZGVudEVBUlByb2plY3QobWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSk7Ci0JCQl9IGVsc2UgaWYgKG1ldGFkYXRhLmhhc01vZHVsZUNvcmVOYXR1cmUoKSkgeyAKLQkJCQl1cGRhdGVEZXBlbmRlbnRNb2R1bGVQcm9qZWN0KG1ldGFkYXRhLCByZWZhY3RvcmVkTWV0YWRhdGEpOwotCQkJfQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgYW55IHNlcnZlciByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlcnZlclJlZnMoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgb3JpZ2luYWxNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBuZXdNZXRhZGF0YSkKLQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElNb2R1bGUgb3JpZ2luYWxNb2R1bGUgPSBvcmlnaW5hbE1ldGFkYXRhLmdldE1vZHVsZSgpOwotCQlpZiAob3JpZ2luYWxNb2R1bGUgPT0gbnVsbCkgewotCQkJLy8gbm8gbW9kdWxlIGZvciB0aGUgb3JpZ2luYWwgcHJvamVjdCwgc28gcmV0dXJuCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gTmVlZCB0byByZXBsYWNlIHRoZSBvcmlnaW5hbCBtb2R1bGUgd2l0aCBhIERlbGV0ZWRNb2R1bGUKLQkJZmluYWwgSU1vZHVsZVtdIHRvUmVtb3ZlID0gbmV3IElNb2R1bGVbMV07Ci0JCXRvUmVtb3ZlWzBdID0gbmV3IERlbGV0ZWRNb2R1bGUob3JpZ2luYWxNb2R1bGUuZ2V0SWQoKSwgb3JpZ2luYWxNb2R1bGUuZ2V0TmFtZSgpLAotCQkJCW9yaWdpbmFsTW9kdWxlLmdldE1vZHVsZVR5cGUoKSk7Ci0JCQotCQlJTW9kdWxlIG5ld01vZHVsZSA9IG51bGw7Ci0JCUlNb2R1bGVbXSB0b0FkZCA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAobmV3TWV0YWRhdGEgIT0gbnVsbCkgewotCQkJbmV3TW9kdWxlID0gbmV3TWV0YWRhdGEuZ2V0TW9kdWxlKCk7Ci0JCQlpZiAobmV3TW9kdWxlID09IG51bGwpIHsKLQkJCQkvLyBubyBtb2R1bGUgZm9yIHRoZSBuZXcgcHJvamVjdCwgc28gcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gWFhYIER1ZSB0byBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MjkyLAotCQkJLy8gbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgSU1vZHVsZSBmb3IgdGhlIHJlbmFtZWQgcHJvamVjdCBoYXMgdGhlCi0JCQkvLyBpZCBhbmQgbmFtZSBmb3IgdGhlIHJlbmFtZWQgSVByb2plY3QgYW5kIG5vdCB0aGUgb2xkIG5hbWUKLQkJCWZpbmFsIElQcm9qZWN0IG5ld1Byb2plY3QgPSBuZXdNZXRhZGF0YS5nZXRQcm9qZWN0KCk7Ci0JCQlmaW5hbCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlID0gbmV3TW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLSAgICAgICAgICAgICgoTW9kdWxlKSBuZXdNb2R1bGUpLmdldE1vZHVsZUZhY3RvcnkoKS5nZXRNb2R1bGVzKCk7Ci0JCQluZXdNb2R1bGUgPSBuZXcgTW9kdWxlKCgoTW9kdWxlKSBuZXdNb2R1bGUpLmdldE1vZHVsZUZhY3RvcnkoKSwgbmV3UHJvamVjdC5nZXROYW1lKCksIG5ld1Byb2plY3QuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldElkKCksIAotCQkJCQltb2R1bGVUeXBlLmdldFZlcnNpb24oKSwgbmV3UHJvamVjdCk7Ci0JCQl0b0FkZCA9IG5ldyBJTW9kdWxlW117bmV3TW9kdWxlfTsKLQkJfQotCQkKLQkJZmluYWwgSVNlcnZlcltdIHNlcnZlciA9IG9yaWdpbmFsTWV0YWRhdGEuZ2V0U2VydmVycygpOwotCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlci5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQl3YyA9IHNlcnZlcltpXS5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCUxpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmVyW2ldLmdldE1vZHVsZXMoKSk7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMob3JpZ2luYWxNb2R1bGUpKSB7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgb3JpZ2luYWwgYW5kIHBvdGVudGlhbGx5IGFkZCBhIG5ldwotCQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIHRvQWRkLCB0b1JlbW92ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJlcnJvcl91cGRhdGluZ19zZXJ2ZXIiLCAKLQkJCQkJCW5ldyBPYmplY3RbXXtzZXJ2ZXJbaV0uZ2V0SWQoKSwgb3JpZ2luYWxNZXRhZGF0YS5nZXRQcm9qZWN0TmFtZSgpfSksIGNlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2Muc2F2ZUFsbCh0cnVlLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJlcnJvcl91cGRhdGluZ19zZXJ2ZXIiLCAKLQkJCQkJCQluZXcgT2JqZWN0W117c2VydmVyW2ldLmdldElkKCksIG9yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKX0pLCBjZSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGVwZW5kZW50IEVBUiBwcm9qZWN0IHRvIGFjY291bnQgZm9yIHRoZSByZWZhY3RvcmluZyBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHVwZGF0ZURlcGVuZGVudEVBUlByb2plY3QoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVwZW5kZW50TWV0YWRhdGEsIAotCQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlcGVuZGVudCBtb2R1bGUgcHJvamVjdCB0byBhY2NvdW50IGZvciB0aGUgcmVmYWN0b3Jpbmcgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEZXBlbmRlbnRNb2R1bGVQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcHJvcGVydHkuCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGdldFByb2plY3RNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9NRVRBREFUQSk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGRpc2FibGUgcmVkbyBzdXBwb3J0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2NhblJlZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBkaXNhYmxlIHVuZG8gc3VwcG9ydC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3RvcmluZ0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjczYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3RvcmluZ0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5SZWZhY3RvclJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCUFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTUVUQURBVEEpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFByb3BlcnR5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKGkubmV4dCgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdmFsaWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghdmFsaWQpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAKLQkJCQkJUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpbnZhbGlkX3Byb3BlcnR5X25hbWUiLCBuZXcgT2JqZWN0W117cHJvcGVydHlOYW1lfSksIG51bGwpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmY3OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMgewotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBob2xkcyBhbiBpbnN0YW5jZSBvZiBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBmb3IgdGhlCi0JICogcmVmYWN0b3JlZCBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVUQURBVEEgPSAiUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcy5QUk9KRUNUX01FVEFEQVRBIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaG9sZHMgYW4gaW5zdGFuY2Ugb2YgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZm9yIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mCi0JICogdGhlIHJlZmFjdG9yZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9QUk9KRUNUX01FVEFEQVRBID0gIlByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMuT1JJR0lOQUxfUFJPSkVDVF9NRVRBREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhvbGRzIGFuIGluc3RhbmNlIG9mIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGZvciB0aGUKLSAgICAgKiBkZXBlbmRlbnQgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSA9ICJQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzLkRFUEVOREVOVF9QUk9KRUNUX01FVEFEQVRBIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaG9sZHMgYW4gaW5zdGFuY2Ugb2YgdGhlIElSZXNvdXJjZURlbHRhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfREVMVEE9ICJQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzLlJFU09VUkNFX0RFTFRBIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTVmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMJUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICBwcm9wZXJ0eU5hbWVzLmFkZChPUklHSU5BTF9QUk9KRUNUX01FVEFEQVRBKTsKLSAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoUkVTT1VSQ0VfREVMVEEpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQcm9qZWN0UmVuYW1lT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZW5hbWVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NTM4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVuYW1lT3BlcmF0aW9uIGV4dGVuZHMgUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBQcm9qZWN0UmVuYW1lT3BlcmF0aW9uKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0byByZXR1cm4gdGhlIHByZS1yZW5hbWUgbWV0YWRhdGEuCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGdldFByb2plY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkgbW9kZWwuZ2V0UHJvcGVydHkoUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLk9SSUdJTkFMX1BST0pFQ1RfTUVUQURBVEEpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwcm9qZWN0J3Mgb3duIG1ldGFkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3QoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgb3JpZ2luYWxNZXRhZGF0YSkgCi0JCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkgIAotCQkvLyBVcGRhdGUgdGhlIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUKLQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhID0gc3VwZXIuZ2V0UHJvamVjdE1ldGFkYXRhKCk7Ci0JCWZpbmFsIFN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IG9yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKTsKLQkJZmluYWwgU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gcmVmYWN0b3JlZE1ldGFkYXRhLmdldFByb2plY3ROYW1lKCk7Ci0JCUlQcm9qZWN0IG5ld1Byb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuIGdldFJvb3QoKS5nZXRQcm9qZWN0KG5ld1Byb2plY3ROYW1lKTsKLQkJU3RyaW5nIG9yaWdpbmFsQ29udGV4dFJvb3QgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U2VydmVyQ29udGV4dFJvb3QobmV3UHJvamVjdCk7Ci0JCWlmIChvbGRQcm9qZWN0TmFtZS5lcXVhbHMob3JpZ2luYWxDb250ZXh0Um9vdCkpIHsKLQkJCS8vIGlmIG9sZCBjb250ZXh0IHJvb3QgPSBwcm9qZWN0IG5hbWUsIGxldHMgdXBkYXRlIGl0Ci0JCQlDb21wb25lbnRVdGlsaXRpZXMuc2V0U2VydmVyQ29udGV4dFJvb3QobmV3UHJvamVjdCwgbmV3UHJvamVjdE5hbWUpOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgZGVwbG95LW5hbWUgZXF1YWxzIHRoZSBvbGQgcHJvamVjdCBuYW1lLCB1cGRhdGUgaXQgaW4gdGhlIG1vZHVsZS1zcGVjaWZpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkJZmluYWwgSVByb2plY3QgcmVmYWN0b3JlZFByb2plY3QgPSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0UHJvamVjdCgpOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChyZWZhY3RvcmVkUHJvamVjdCkpIHsKLQkJCS8vIHNraXAgaWYgYSB1dGlsaXR5IHByb2plY3QgKHdpbGwgbm90IGhhdmUgYSBNb2RlbFByb3ZpZGVyIGFuZCBjaGVja2luZyBsb2dzIGFuIGVycm9yCi0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSU1vZGVsUHJvdmlkZXIgbW9kZWwgPSAoSU1vZGVsUHJvdmlkZXIpTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihyZWZhY3RvcmVkUHJvamVjdCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQltb2RlbC5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmluYWwgT2JqZWN0IG1vZGVsT2JqZWN0ID0gbW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApIHsKLQkJCQkJCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGNkZyA9IChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCkgbW9kZWxPYmplY3Q7Ci0JCQkJCQlpZiAoY2RnLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKG9sZFByb2plY3ROYW1lKSkgewotCQkJCQkJCWNkZy5zZXREaXNwbGF5TmFtZShuZXdQcm9qZWN0TmFtZSk7Ci0JCQkJCQl9CQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJRGlzcGxheU5hbWUgZG4gPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotCQkJCQkJZG4uc2V0VmFsdWUobmV3UHJvamVjdE5hbWUpOwotCQkJCQkJTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCQkJCQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKLQkJCQkJCQlkaXNwbGF5TmFtZXMgPSAoKEFwcGxpY2F0aW9uKSBtb2RlbE9iamVjdCkuZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKSB7Ci0JCQkJCQkJZGlzcGxheU5hbWVzID0gKChXZWJBcHApbW9kZWxPYmplY3QpLmdldERpc3BsYXlOYW1lcygpOwotCQkJCQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KSB7Ci0JCQkJCQkJZGlzcGxheU5hbWVzID0gKChBcHBsaWNhdGlvbkNsaWVudCltb2RlbE9iamVjdCkuZ2V0RGlzcGxheU5hbWVzKCk7CQkKLQkJCQkJCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLQkJCQkJCQlkaXNwbGF5TmFtZXMgPSAoKEVKQkphciltb2RlbE9iamVjdCkuZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlEaXNwbGF5TmFtZSBvbGRETiA9IChEaXNwbGF5TmFtZSkgZGlzcGxheU5hbWVzLmdldCgwKTsKLQkJCQkJCQlpZiAob2xkRE4uZ2V0VmFsdWUoKS5lcXVhbHMob2xkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCQkJCWRpc3BsYXlOYW1lcy5zZXQoMCwgZG4pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0sIG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1ldGFkYXRhIGZvciBkZXBlbmRlbnQgcHJvamVjdHMKLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlcGVuZGVudFByb2plY3RzKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEsCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCSAgICAvLyBJZiB0aGlzIGlzIG5vdCBhbiBFQVIsIHVwZGF0ZSBtZXRhZGF0YSBmb3IgZGVwZW5kZW50IHByb2plY3RzCi0gICAgICAgIC8vIChub3QgcGVyZm9ybWluZyBhbnkgcmVmYWN0b3JpbmcgZm9yIHByb2plY3RzIHRoYXQgZGVwZW5kIG9uIEVBUidzIHJpZ2h0IG5vdykKLSAgICAgICAgaWYgKCFvcmlnaW5hbE1ldGFkYXRhLmlzRUFSKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZURlcGVuZGVudFByb2plY3RzKG9yaWdpbmFsTWV0YWRhdGEsIG1vbml0b3IpOwotICAgICAgICB9Ci0JCS8vIHVwZGF0ZSBhbnkgc2VydmVyIGluc3RhbmNlIHJlZnMgdG8gdGhlIHJlZmFjdG9yZWQgcHJvamVjdAotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSBzdXBlci5nZXRQcm9qZWN0TWV0YWRhdGEoKTsKLSAgICAgICAgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5oYW5kbGVHbG9iYWxQcm9qZWN0Q2hhbmdlKHJlZmFjdG9yZWRNZXRhZGF0YS5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgKElSZXNvdXJjZURlbHRhKSBtb2RlbC5nZXRQcm9wZXJ0eShQcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIuUkVTT1VSQ0VfREVMVEEpKTsgICAgICAgICAgIAotCQlzdXBlci51cGRhdGVTZXJ2ZXJSZWZzKG9yaWdpbmFsTWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlcGVuZGVudCBFQVIgcHJvamVjdCB0byBhY2NvdW50IGZvciB0aGUgcmVuYW1pbmcgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXBlbmRlbnRFQVJQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZ2V0SW5zdGFuY2UoKS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPblJlbmFtZShvcmlnaW5hbE1ldGFkYXRhLCBkZXBlbmRlbnRNZXRhZGF0YSkpIHsKLQkJICAgIGZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gY3JlYXRlRGF0YU1vZGVsKGRlcGVuZGVudE1ldGFkYXRhLCBvcmlnaW5hbE1ldGFkYXRhLAotCQkgICAgICAgICAgICBuZXcgVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVQcm92aWRlcigpKTsKLQkJICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXBlbmRlbnQgbW9kdWxlIHByb2plY3QgdG8gYWNjb3VudCBmb3IgdGhlIHJlbmFtaW5nIG9mIHRoZSByZWZlcmVuY2VkIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVwZW5kZW50TW9kdWxlUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBvcmlnaW5hbE1ldGFkYXRhKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmdldEluc3RhbmNlKCkuc2hvdWxkUmVmYWN0b3JEZXBlbmRlbnRQcm9qZWN0T25SZW5hbWUob3JpZ2luYWxNZXRhZGF0YSwgZGVwZW5kZW50TWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGNyZWF0ZURhdGFNb2RlbChkZXBlbmRlbnRNZXRhZGF0YSwgb3JpZ2luYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBvcmlnaW5hbE1ldGFkYXRhLAotCQkJZmluYWwgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBwcm92aWRlcikgewotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSBzdXBlci5nZXRQcm9qZWN0TWV0YWRhdGEoKTsKLQkJZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX01FVEFEQVRBLCByZWZhY3RvcmVkTWV0YWRhdGEpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoREVQRU5ERU5UX1BST0pFQ1RfTUVUQURBVEEsIGRlcGVuZGVudE1ldGFkYXRhKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9SSUdJTkFMX1BST0pFQ1RfTUVUQURBVEEsIG9yaWdpbmFsTWV0YWRhdGEpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTU5NmQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFJlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFSRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBfbWV0YWRhdGE7Ci0JcHVibGljIFJlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFSRGF0YU1vZGVsUHJvdmlkZXIoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgbWV0YWRhdGEpIHsKLQkJc3VwZXIoKTsKLQkJX21ldGFkYXRhID0gbWV0YWRhdGE7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlMaXN0IGNvbXBvbmVudHMgPSAoTGlzdCkgZ2V0UHJvcGVydHkoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50cy5nZXQoaSk7Ci0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCQkJaWYgKF9tZXRhZGF0YS5pc1dlYigpKSB7Ci0JCQkJCW5hbWUgKz0gIi53YXIiOyAvLyROT04tTkxTLTEkCQkJCi0JCQkJfSBlbHNlIGlmIChfbWV0YWRhdGEuaXNFSkIoKSkgewotCQkJCQluYW1lICs9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAkJCQotCQkJCX0gZWxzZSBpZiAoX21ldGFkYXRhLmlzQXBwQ2xpZW50KCkpIHsKLQkJCQkJbmFtZSArPSAiLmphciI7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCQl9IGVsc2UgaWYgKF9tZXRhZGF0YS5pc0Nvbm5lY3RvcigpKSB7Ci0JCQkJCW5hbWUgKz0gIi5yYXIiOyAvLyROT04tTkxTLTEkCQkJCi0JCQkJfQotCQkJCW1hcC5wdXQoY29tcG9uZW50LCBuYW1lKTsKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJPcGVyYXRpb24obW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1JlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmMwZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1JlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbiBleHRlbmRzIFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24gewotCi0JcHVibGljIFJlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVVUkkoZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCkgewotCQlTdHJpbmcgdXJpID0gZWFyTW9kZWwuZ2V0TW9kdWxlVVJJKHRhcmdldENvbXBvbmVudCk7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJTWFwIGNvbXBUb1VSSSA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KFJlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFSRGF0YU1vZGVsUHJvdmlkZXIuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCk7IAotCQkJdXJpID0gKFN0cmluZykgY29tcFRvVVJJLmdldCh0YXJnZXRDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTY2MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogU3ViY2xhc3Mgb2YgPGNvZGU+VXBkYXRlRGVwZW5kZW50UHJvamVjdE9wPC9jb2RlPiB0aGF0IHVwZGF0ZXMgYSBkZXBlbmRlbnQKLSAqIEVBUiBwcm9qZWN0IHdoZW4gb25lIG9mIHRoZSByZWZlcmVuY2VkIHByb2plY3RzIGhhcyBiZWVuIGRlbGV0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdE9wIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVmYWN0b3Jpbmcgb3BlcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEgbW9kZWwuCi0JICogQHBhcmFtIG1vZGVsIFRoZSBkYXRhIG1vZGVsLgotCSAqLwotCXB1YmxpYyBVcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSA9IChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkgbW9kZWwuZ2V0UHJvcGVydHkoREVQRU5ERU5UX1BST0pFQ1RfTUVUQURBVEEpOwotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTUVUQURBVEEpOwotCQlyZW1vdmVFQVJEZXBlbmRlbmN5KGRlcGVuZGVudE1ldGFkYXRhLCByZWZhY3RvcmVkTWV0YWRhdGEpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGVwZW5kZW50IEVBUiBwcm9qZWN0IHRvIGFjY291bnQgZm9yIHRoZSBkZWxldGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0LgotCSAqLwkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVtb3ZlRUFSRGVwZW5kZW5jeShmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCS8vIGNyZWF0ZSBJVmlydHVhbENvbXBvbmVudHMgZm9yIHRoZSBFQVIgYW5kIHRoZSByZWZhY3RvcmVkIHByb2plY3QKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcCA9IGRlcGVuZGVudE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmYWN0b3JlZENvbXAgPSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0VmlydHVhbENvbXBvbmVudCgpOwotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIHRoZSBkZWxldGVkIHByb2plY3QKLQkJaWYgKHJlZmFjdG9yZWRDb21wICE9IG51bGwpIHsKLQkJCWZpbmFsIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJEYXRhTW9kZWxQcm92aWRlcihyZWZhY3RvcmVkTWV0YWRhdGEpKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wKTsKLQkJCWZpbmFsIExpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCQltb2RIYW5kbGVzTGlzdC5hZGQocmVmYWN0b3JlZENvbXApOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkJZmluYWwgU3RyaW5nIG1vZHVsZVVSSSA9IHJlZmFjdG9yZWRNZXRhZGF0YS5nZXRNb2R1bGVVUkkoZGVwZW5kZW50TWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQlpZiAobW9kdWxlVVJJICE9IG51bGwpIHsKLQkJCQlmaW5hbCBNYXAgY29tcFRvVVJJID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJEYXRhTW9kZWxQcm92aWRlci5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQKTsKLQkJCQljb21wVG9VUkkucHV0KHJlZmFjdG9yZWRDb21wLCBtb2R1bGVVUkkpOyAKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShSZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUkRhdGFNb2RlbFByb3ZpZGVyLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAsIGNvbXBUb1VSSSk7Ci0JCQl9Ci0JCQltb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRmMGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlUHJvdmlkZXIgZXh0ZW5kcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKLQkKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlT3AobW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvblJlbmFtZU9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODUyZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3IuUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YS5SZWZDYWNoaW5nVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBTdWJjbGFzcyBvZiA8Y29kZT5VcGRhdGVEZXBlbmRlbnRQcm9qZWN0T3A8L2NvZGU+IHRoYXQgdXBkYXRlcyBhIGRlcGVuZGVudAotICogRUFSIHByb2plY3Qgd2hlbiBhIHJlZmVyZW5jZWQgcHJvamVjdCBoYXMgYmVlbiByZW5hbWVkLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVPcCBleHRlbmRzIFVwZGF0ZURlcGVuZGVudFByb2plY3RPcCB7Ci0KLQlwdWJsaWMgVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVPcChmaW5hbCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7Ci0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KE9SSUdJTkFMX1BST0pFQ1RfTUVUQURBVEEpOwotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTUVUQURBVEEpOwotCQkKLQkJLy8gY3JlYXRlIElWaXJ0dWFsQ29tcG9uZW50cyBmb3IgdGhlIEVBUiBhbmQgdGhlIHJlZmFjdG9yZWQgcHJvamVjdAotCQlmaW5hbCBSZWZDYWNoaW5nVmlydHVhbENvbXBvbmVudCBlYXJDb21wID0gKFJlZkNhY2hpbmdWaXJ0dWFsQ29tcG9uZW50KSBkZXBlbmRlbnRNZXRhZGF0YS5nZXRWaXJ0dWFsQ29tcG9uZW50KCk7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmFjdG9yZWRDb21wID0gcmVmYWN0b3JlZE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQotCQlpZiAocmVmYWN0b3JlZENvbXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gaGFkTW9kdWxlUmVmZXJlbmNlID0gaGFkUmVmZXJlbmNlKGRlcGVuZGVudE1ldGFkYXRhLCBvcmlnaW5hbE1ldGFkYXRhKSAhPSBudWxsOwotCQlib29sZWFuIGhhZFByb2plY3RSZWZlcmVuY2UgPSBoYWRQcm9qZWN0UmVmZXJlbmNlKGRlcGVuZGVudE1ldGFkYXRhLCBvcmlnaW5hbE1ldGFkYXRhKTsKLQkJCi0JCS8vIGZpcnN0LCByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gdGhlIG9sZCBwcm9qZWN0IG5hbWUgdmlhIHRoZSAKLQkJLy8gUHJvamVjdERlbGV0ZU9wZXJhdGlvbgotCQlVcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wLnJlbW92ZUVBUkRlcGVuZGVuY3koZGVwZW5kZW50TWV0YWRhdGEsIG9yaWdpbmFsTWV0YWRhdGEpOwotCQkKLQkJLy8gY2hhbmdlIHRvIHVzZSBub3QgdXNlIGNhY2hpbmcKLQkJZWFyQ29tcC5zZXRDYWNoaW5nKGZhbHNlKTsKLQkJCi0JCS8vIGFkZCBiYWNrIGEgZGVwZW5kZW5jeSBvbiB0aGUgcmVuYW1lZCBwcm9qZWN0Ci0JCWlmIChyZWZhY3RvcmVkTWV0YWRhdGEuaGFzTW9kdWxlQ29yZU5hdHVyZSgpKSB7Ci0JCQkvLyB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0IHdhcyBhIG1vZHVsZSBwcm9qZWN0Ci0JCQlmaW5hbCBJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcCk7IAotCQkJZmluYWwgTGlzdCBkZXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVwTGlzdC5hZGQocmVmYWN0b3JlZENvbXApOwotCQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgZGVwTGlzdCk7Ci0JCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJfSBlbHNlIGlmIChyZWZhY3RvcmVkTWV0YWRhdGEuaGFzSmF2YU5hdHVyZSgpKSB7Ci0JCQkvLyB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0IHdhcyBhIHBsYWluIGphdmEgcHJvamVjdAotCQkJZmluYWwgSURhdGFNb2RlbCBtaWdyYXRpb25kbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJbWlncmF0aW9uZG0uc2V0UHJvcGVydHkoSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHJlZmFjdG9yZWRNZXRhZGF0YS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCW1pZ3JhdGlvbmRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJZmluYWwgSURhdGFNb2RlbCByZWZkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlmaW5hbCBMaXN0IHRhcmdldENvbXBMaXN0ID0gKExpc3QpIHJlZmRtLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJdGFyZ2V0Q29tcExpc3QuYWRkKHJlZmFjdG9yZWRDb21wKTsKLQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wKTsKLQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIHRhcmdldENvbXBMaXN0KTsKLQkJCXJlZmRtLnNldEJvb2xlYW5Qcm9wZXJ0eShDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX0NPTVBPTkVOVF9SRUYsaGFkTW9kdWxlUmVmZXJlbmNlKTsgCi0JCQlyZWZkbS5zZXRCb29sZWFuUHJvcGVydHkoQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9QUk9KRUNUX1JFRixoYWRQcm9qZWN0UmVmZXJlbmNlKTsKLQkJCXJlZmRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm1pc3NpbmdfbmF0dXJlcyIpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhYmMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRFQVJvblJlbmFtZVByb3ZpZGVyIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lT3AobW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZU9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWFiN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5SZWZhY3RvclJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFN1YmNsYXNzIG9mIDxjb2RlPlVwZGF0ZURlcGVuZGVudFByb2plY3RPcDwvY29kZT4gdGhhdCB1cGRhdGVzIGEgZGVwZW5kZW50Ci0gKiBtb2R1bGUgcHJvamVjdCB3aGVuIG9uZSBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0cyBoYXMgYmVlbiBkZWxldGVkLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlRGVwZW5kZW50TW9kdWxlb25EZWxldGVPcCBleHRlbmRzIFVwZGF0ZURlcGVuZGVudFByb2plY3RPcCB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZWZhY3RvcmluZyBvcGVyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZGF0YSBtb2RlbC4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIGRhdGEgbW9kZWwuCi0JICovCi0JcHVibGljIFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AoZmluYWwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7Ci0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSA9IChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9NRVRBREFUQSk7Ci0JCXJlbW92ZU1vZHVsZURlcGVuZGVuY3koZGVwZW5kZW50TWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXBlbmRlbnQgbW9kdWxlIHByb2plY3QgdG8gYWNjb3VudCBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoZSByZWZlcmVuY2VkIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZU1vZHVsZURlcGVuZGVuY3koZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVwZW5kZW50TWV0YWRhdGEsIAotCQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCS8vIGNyZWF0ZSBJVmlydHVhbENvbXBvbmVudHMgZm9yIHRoZSBkZXBlbmRlbnQgYW5kIHRoZSByZWZhY3RvcmVkIHByb2plY3QKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZGVwZW5kZW50Q29tcCA9IGRlcGVuZGVudE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmYWN0b3JlZENvbXAgPSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0VmlydHVhbENvbXBvbmVudCgpOwotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0JCS8vIERvZXMgdGhlIGRlcGVuZGVudCBwcm9qZWN0IGhhdmUgYSAuY29tcG9uZW50IHJlZmVyZW5jZSBvbiB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0PwotCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBoYWRSZWZlcmVuY2UoZGVwZW5kZW50TWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSk7Ci0JCWZpbmFsIGJvb2xlYW4gd2ViTGliRGVwID0gaGFzV2ViTGliRGVwZW5kZW5jeShyZWYpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBjb21wb25lbnQgcmVmZXJlbmNlIG9uIHRoZSBkZWxldGVkIHByb2plY3QKLQkJaWYgKHJlZmFjdG9yZWRDb21wICE9IG51bGwpIHsKLQkJCWZpbmFsIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGRlcGVuZGVudENvbXApOwotCQkJZmluYWwgTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCW1vZEhhbmRsZXNMaXN0LmFkZChyZWZhY3RvcmVkQ29tcCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RIYW5kbGVzTGlzdCk7Ci0JCQlpZiAod2ViTGliRGVwKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCX0KLQkJCi0JCS8vIHVwZGF0ZSB0aGUgbWFuaWZlc3QKLQkJaWYgKCF3ZWJMaWJEZXApIHsKLQkJCXVwZGF0ZU1hbmlmZXN0RGVwZW5kZW5jeShyZWZhY3RvcmVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhLCB0cnVlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdXBkYXRlTWFuaWZlc3REZXBlbmRlbmN5KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSwKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCBmaW5hbCBib29sZWFuIHJlbW92ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGRlcGVuZGVudENvbXAgPSBkZXBlbmRlbnRNZXRhZGF0YS5nZXRWaXJ0dWFsQ29tcG9uZW50KCk7Ci0JCUlQcm9qZWN0IHByb2plY3Q9IGRlcGVuZGVudENvbXAuZ2V0UHJvamVjdCgpOwotCQlpZihwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKLQkJCWZpbmFsIFN0cmluZyBkZXBlbmRlbnRQcm9qTmFtZSA9IGRlcGVuZGVudE1ldGFkYXRhLmdldFByb2plY3ROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgcmVmYWN0b3JlZFByb2pOYW1lID0gcmVmYWN0b3JlZE1ldGFkYXRhLmdldFByb2plY3ROYW1lKCk7Ci0JCQlmaW5hbCBJVmlydHVhbEZpbGUgdmYgPSBkZXBlbmRlbnRDb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSApOwotCQkJZmluYWwgSUZpbGUgbWFuaWZlc3RtZiA9IHZmLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkvLyBhZGRpbmcgdGhpcyBjaGVjayBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDA3NAotCQkJLy8gKHNvbWUgYWRvcHRlcnMgaGF2ZSBub24tanN0LmVhciBtb2R1bGUgcHJvamVjdHMgdGhhdCBhcmUgbWlzc2luZyBtYW5pZmVzdHMpCi0JCQlpZiAoIW1hbmlmZXN0bWYuZXhpc3RzKCkpIHsgIAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQlmaW5hbCBJRGF0YU1vZGVsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBkZXBlbmRlbnRQcm9qTmFtZSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgbWFuaWZlc3RtZik7Ci0JCQlmaW5hbCBBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRBcmNoaXZlTWFuaWZlc3QobWFuaWZlc3RtZik7Ci0JCQlTdHJpbmdbXSBjcCA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJTGlzdCBjcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgbmV3Q3AgPSByZWZhY3RvcmVkUHJvak5hbWUgKyAiLmphciI7Ly8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJCWlmICghY3BbaV0uZXF1YWxzKG5ld0NwKSkgewotCQkJCQljcExpc3QuYWRkKGNwW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXJlbW92ZSkgewotCQkJCWNwTGlzdC5hZGQobmV3Q3ApOwotCQkJfQotCQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNULCBjcExpc3QpOwotCQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEFyY2hpdmVNYW5pZmVzdCBnZXRBcmNoaXZlTWFuaWZlc3QoZmluYWwgSUZpbGUgbWFuaWZlc3RGaWxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBtYW5pZmVzdEZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCUFyY2hpdmVNYW5pZmVzdCBtZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKG5ldyBNYW5pZmVzdChpbikpOwotCQkJcmV0dXJuIG1mOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfcmVhZGluZ19tYW5pZmVzdCIpLCBjZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfcmVhZGluZ19tYW5pZmVzdCIpLCBpbyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25EZWxldGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM2NWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlUHJvdmlkZXIgZXh0ZW5kcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKLQkKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AobW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZU9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmZjYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEuUmVmQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBTdWJjbGFzcyBvZiA8Y29kZT5VcGRhdGVEZXBlbmRlbnRQcm9qZWN0T3A8L2NvZGU+IHRoYXQgdXBkYXRlcyBhIGRlcGVuZGVudAotICogbW9kdWxlIHByb2plY3Qgd2hlbiBhIHJlZmVyZW5jZWQgcHJvamVjdCBoYXMgYmVlbiByZW5hbWVkLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVPcCBleHRlbmRzIFVwZGF0ZURlcGVuZGVudFByb2plY3RPcCB7Ci0KLQlwdWJsaWMgVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVPcChmaW5hbCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7Ci0JCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KE9SSUdJTkFMX1BST0pFQ1RfTUVUQURBVEEpOwotCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTUVUQURBVEEpOwotCQkKLQkJLy8gY3JlYXRlIElWaXJ0dWFsQ29tcG9uZW50cyBmb3IgdGhlIGRlcGVuZGVudCBwcm9qZWN0IGFuZCB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0Ci0JCWZpbmFsIFJlZkNhY2hpbmdWaXJ0dWFsQ29tcG9uZW50IGRlcGVuZGVudENvbXAgPSAoUmVmQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQpIGRlcGVuZGVudE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmYWN0b3JlZENvbXAgPSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0VmlydHVhbENvbXBvbmVudCgpOwotCQkKLQkJLy8gRG9lcyB0aGUgZGVwZW5kZW50IHByb2plY3QgaGF2ZSBhIGNvbXBvbmVudCBhbmQvb3IgcHJvamVjdCByZWZlcmVuY2VzIG9uIHRoZSByZWZhY3RvcmVkIHByb2plY3Q/Ci0JCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGhhZFJlZmVyZW5jZShkZXBlbmRlbnRNZXRhZGF0YSwgb3JpZ2luYWxNZXRhZGF0YSk7Ci0JCWJvb2xlYW4gaGFkTW9kdWxlUmVmID0gcmVmICE9IG51bGw7Ci0JCWJvb2xlYW4gaGFkUHJvamVjdFJlZiA9IGhhZFByb2plY3RSZWZlcmVuY2UoZGVwZW5kZW50TWV0YWRhdGEsIG9yaWdpbmFsTWV0YWRhdGEpOwotCQlmaW5hbCBib29sZWFuIHdlYkxpYkRlcCA9IGhhc1dlYkxpYkRlcGVuZGVuY3kocmVmKTsKLQkKLQkJLy8gZmlyc3QsIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgb2xkIHByb2plY3QgbmFtZSB2aWEgdGhlIAotCQkvLyBQcm9qZWN0RGVsZXRlT3BlcmF0aW9uCi0JCVVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AucmVtb3ZlTW9kdWxlRGVwZW5kZW5jeShkZXBlbmRlbnRNZXRhZGF0YSwgb3JpZ2luYWxNZXRhZGF0YSk7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gdXNlIG5vdCB1c2UgY2FjaGluZwotCQlkZXBlbmRlbnRDb21wLnNldENhY2hpbmcoZmFsc2UpOwotCQkKLQkJLy8gYWRkIGEgcmVmZXJlbmNlIHRvIHRoZSByZW5hbWVkIHByb2plY3QgKG5lZWQgdG8gYmUgYWRkaW5nIGVpdGhlciBhIGNvbXBvbmVudCBvciBwcm9qZWN0IHJlZikKLQkJaWYgKHJlZmFjdG9yZWRDb21wICE9IG51bGwgJiYgKGhhZE1vZHVsZVJlZiB8fCBoYWRQcm9qZWN0UmVmKSkgewotCQkJZmluYWwgSURhdGFNb2RlbCByZWZkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlmaW5hbCBMaXN0IHRhcmdldENvbXBMaXN0ID0gKExpc3QpIHJlZmRtLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJdGFyZ2V0Q29tcExpc3QuYWRkKHJlZmFjdG9yZWRDb21wKTsKLQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBkZXBlbmRlbnRDb21wKTsKLQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIHRhcmdldENvbXBMaXN0KTsKLQkJCWlmICh3ZWJMaWJEZXApIHsKLQkJCQlyZWZkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZWZkbS5zZXRCb29sZWFuUHJvcGVydHkoQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9DT01QT05FTlRfUkVGLGhhZE1vZHVsZVJlZik7IAotCQkJcmVmZG0uc2V0Qm9vbGVhblByb3BlcnR5KENyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfUFJPSkVDVF9SRUYsaGFkUHJvamVjdFJlZik7Ci0JCQlyZWZkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJfQotCQotCQkvLyB1cGRhdGUgdGhlIG1hbmlmZXN0LCB1bmxlc3MgdGhpcyB3YXMgYSB3ZWIgbGlicmFyeSBkZXBlbmRlbmN5Ci0JCWlmICghd2ViTGliRGVwKSB7Ci0JCQlVcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZU9wLnVwZGF0ZU1hbmlmZXN0RGVwZW5kZW5jeShyZWZhY3RvcmVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhLCBmYWxzZSk7Ci0JCX0KLQkJCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxYjQwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZVByb3ZpZGVyIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZU9wKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0ZmQ0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBQcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIFByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFUEVOREVOVF9QUk9KRUNUX01FVEFEQVRBKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RPcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ4MmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0T3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIG9wZXJhdGlvbnMgdGhhdCB1cGRhdGUgZGVwZW5kZW50IHByb2plY3RzIHdoZW4gYSAKLSAqIHJlZmVyZW5jZWQgcHJvamVjdCBpcyByZWZhY3RvcmVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlRGVwZW5kZW50UHJvamVjdE9wIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVmYWN0b3Jpbmcgb3BlcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEgbW9kZWwuCi0JICogQHBhcmFtIG1vZGVsIFRoZSBkYXRhIG1vZGVsLgotCSAqLwotCXB1YmxpYyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0T3AoZmluYWwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIERvZXMgdGhlIGRlcGVuZGVudCBwcm9qZWN0IGhhdmUgYSAuY29tcG9uZW50IHJlZmVyZW5jZSBvbiB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0PwotCSAqIEByZXR1cm4gSVZpcnR1YWxSZWZlcmVuY2Ugb3IgbnVsbCBpZiBvbmUgZGlkbid0IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgaGFkUmVmZXJlbmNlKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLAotCQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhKSB7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmFjdG9yZWRDb21wID0gcmVmYWN0b3JlZE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQkJaWYgKHJlZmFjdG9yZWRDb21wID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGRlcGVuZGVudE1ldGFkYXRhLmdldFZpcnR1YWxDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VzKCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyhyZWZhY3RvcmVkQ29tcCkpIHsKLQkJCQlyZWYgPSByZWZzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWY7Ci0JfQotCQotCS8qKgotCSAqIERvZXMgdGhlIGRlcGVuZGVudCBwcm9qZWN0IGhhdmUgYSAucHJvamVjdCByZWZlcmVuY2Ugb24gdGhlIHJlZmFjdG9yZWQgcHJvamVjdD8KLQkgKiAoZHluYW1pYyBwcm9qZWN0IHJlZnMgZG9uJ3QgY291bnQpCi0JICogQHJldHVybiBUcnVlIGlmIGEgcHJvamVjdCByZWZlcmVuY2UgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYWRQcm9qZWN0UmVmZXJlbmNlKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLAotCQkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhKSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBJUHJvamVjdFtdIHJlZnMgPSBkZXBlbmRlbnRNZXRhZGF0YS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKS5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCWZpbmFsIElQcm9qZWN0IHJlZmFjdG9yZWRQcm9qZWN0PSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0UHJvamVjdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlZnNbaV0uZXF1YWxzKHJlZmFjdG9yZWRQcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXBlbmRlbmN5IHdhcyBhIHdlYiBsaWJyYXJ5IGRlcGVuZGVuY3kuIAotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc1dlYkxpYkRlcGVuZGVuY3koZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiByZWYuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMobmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0byBkaXNhYmxlIHJlZG8gc3VwcG9ydAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5SZWRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gZGlzYWJsZSB1bmRvIHN1cHBvcnQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWQ0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoREVQRU5ERU5UX1BST0pFQ1RfTUVUQURBVEEpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcm9zZS9tb2R1bGVNYXAuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Jvc2UvbW9kdWxlTWFwLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAxZmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcm9zZS9tb2R1bGVNYXAuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMuajJlZS9lYXJwcm9qZWN0IgotICAgIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy5qMmVlL2FwcGxpY2F0aW9uZWRpdCIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMuajJlZS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im1vZHVsZW1hcCIgbW9kZWxOYW1lPSJNb2R1bGVtYXAiIGVkaXRQbHVnaW5DbGFzcz0ibW9kdWxlbWFwLnByb3ZpZGVyLk1vZHVsZW1hcEVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9ImNvbS5pYm0uZXRvb2xzLmoyZWUucGx1Z2luLkoyRUVQbHVnaW4iIHVwZGF0ZUNsYXNzcGF0aD0iZmFsc2UiCi0gICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9jb20uaWJtLmV0b29scy5qMmVlLmNvcmUvcm9zZS9qMmVlLmdlbm1vZGVsIy8vQGdlblBhY2thZ2VzLjUgLi4vLi4vY29tLmlibS5ldG9vbHMuamF2YS5jb3JlL3Jvc2UvamF2YU1vZGVsLmdlbm1vZGVsIy8vQGdlblBhY2thZ2VzLjAgLi4vLi4vY29tLmlibS5ldG9vbHMuajJlZS5jb3JlL3Jvc2UvajJlZS5nZW5tb2RlbCMvL0BnZW5QYWNrYWdlcy4xIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9zcmMvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9AZ2VuUGFja2FnZXMuMCI+Ci0gIDxmb3JlaWduTW9kZWw+bW9kdWxlTWFwLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iTW9kdWxlbWFwIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMuZWFyIiBlY29yZVBhY2thZ2U9Im1vZHVsZW1hcC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVtYXAuZWNvcmUjLy9Nb2R1bGVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlbWFwLmVjb3JlIy8vTW9kdWxlTWFwcGluZy9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVtYXAuZWNvcmUjLy9Nb2R1bGVNYXBwaW5nL21vZHVsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVtYXAuZWNvcmUjLy9FQVJQcm9qZWN0TWFwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVtYXAuZWNvcmUjLy9FQVJQcm9qZWN0TWFwL21hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlbWFwLmVjb3JlIy8vRUFSUHJvamVjdE1hcC91dGlsaXR5SkFSTWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlbWFwLmVjb3JlIy8vVXRpbGl0eUpBUk1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVtYXAuZWNvcmUjLy9VdGlsaXR5SkFSTWFwcGluZy9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVtYXAuZWNvcmUjLy9VdGlsaXR5SkFSTWFwcGluZy91cmkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yb3NlL21vZHVsZU1hcC5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Jvc2UvbW9kdWxlTWFwLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmMjZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Jvc2UvbW9kdWxlTWFwLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDczMjMgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0NA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjEuOTY0Mi4yNyINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgcXVpZCAgICAgICAJIjNCNzA0NTY1MDE4OSINCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNCNzA0NTY1MDE4QiINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNCNzA0NTY1MDE5RSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQjcwNDU2NTAxOEEiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0I3MDQ1NjUwMThDIg0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYXBwbGljYXRpb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcY29tLmlibS5ldG9vbHMuajJlZS5jb3JlXFxyb3NlXFxhcHBsaWNhdGlvbi5jYXQiDQotCQlxdWlkICAgICAgIAkiMzhDMDMwMDgwMTRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1vZHVsZW1hcCINCi0JCXF1aWQgICAgICAgCSIzQjcwNDVCQjAzMTQiDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJNb2R1bGVNYXBwaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQjcwNDYwMTAwNkIiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvamVjdE5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjcwNDdENjAwRkMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRUFSUHJvamVjdE1hcCINCi0JCQlxdWlkICAgICAgIAkiM0I3MDQ2MTgwMjI3Ig0KLQkJCXJlYWxpemVkX2ludGVyZmFjZXMgCShsaXN0IHJlYWxpemVfcmVsX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSZWFsaXplX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MDQ2NTcwMDI5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVtYXA6Ok1vZHVsZU1hcHBpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjcwNDYwMTAwNkIiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVXRpbGl0eUpBUk1hcHBpbmciDQotCQkJcXVpZCAgICAgICAJIjNDNTcwNTk1MDA5RiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9qZWN0TmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNTcwNUQwMDJBRCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVyaSINCi0JCQkJcXVpZCAgICAgICAJIjNDNTcwNUUyMDE0QSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkJCXF1aWQgICAgICAgCSIzQjcwNDY2MzAyNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAibWFwcGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQjcwNDY2NDAyQTgiDQotCQkJCWxhYmVsICAgICAgCSJtYXBwaW5ncyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlbWFwOjpNb2R1bGVNYXBwaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MDQ2MDEwMDZCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I3MDQ2NjQwMkIyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVtYXA6OkVBUlByb2plY3RNYXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjcwNDYxODAyMjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCQkJcXVpZCAgICAgICAJIjNCNzA0ODBBMDBFMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2R1bGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjcwNDgwQzAxMTciDQotCQkJCWxhYmVsICAgICAgCSJtb2R1bGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiDQotCQkJCXF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I3MDQ4MEMwMTJDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVtYXA6Ok1vZHVsZU1hcHBpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjcwNDYwMTAwNkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCQkJcXVpZCAgICAgICAJIjNDNTcwOUQyMDEwRSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ1dGlsaXR5SkFSTWFwcGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQzU3MDlEMzAxOUIiDQotCQkJCWxhYmVsICAgICAgCSJ1dGlsaXR5SkFSTWFwcGluZ3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZW1hcDo6VXRpbGl0eUpBUk1hcHBpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQzU3MDU5NTAwOUYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkJCXF1aWQgICAgICAgCSIzQzU3MDlEMzAxOUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZW1hcDo6RUFSUHJvamVjdE1hcCINCi0JCQkJcXVpZHUgICAgICAJIjNCNzA0NjE4MDIyNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQkJcXVpZCAgICAgICAJIjNCNzA0NUU2MDBEMSINCi0JCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAxDQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNTA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTMwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAk4DQotCQkJCSAgICBtYXhfd2lkdGggIAk3NzcNCi0JCQkJICAgIGxhYmVsICAgICAgCSJUaGVzZSBjb3VsZCBoYXZlIGhhZCBhIGNvbW1vbiBzdXBlcnR5cGU7IGhvd2V2ZXIsIHdlIGhhdmUgdG8gbWFpbnRhaW4gY29tcGF0aWxpYmlsaXR5IHdpdGggZXhpc3RpbmcgZG9jdW1lbnRzIGZyb20gdjQsIHNvIHdlIGNhbid0IGNoYW5nZSB0aGUgaGllcmFyY2h5IG9mIE1vZHVsZU1hcHBpbmcuICBXZSBtYXkgZGVjaWRlIGxhdGVyIHRvIGFkZCBhIGNvbW1vbiBpbnRlcmZhY2UuIikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQl3aWR0aCAgICAgIAk4MzcNCi0JCQkJaGVpZ2h0ICAgICAJNDEyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiIEAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDY3MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNb2R1bGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzhDMDMyMkMwMDA2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjgyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVtYXA6Ok1vZHVsZU1hcHBpbmciIEAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTIsIDE3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNb2R1bGVNYXBwaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzA0NjAxMDA2QiINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBANA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgNTA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcwNDgwQTAwRTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kdWxlIiBANQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTYsIDI0OCkNCi0JCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjIsIDU5NCkNCi0JCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZHVsZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NzQxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzA0ODBDMDExNyINCi0JCQkJCWNsaWVudCAgICAgCUA0DQotCQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTIwLCA1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyMCwgNjU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTc0LCA2NDIpDQotCQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDgNCi0JCQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCQkJbG9jYXRpb24gICAJKDE2LCAyNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3MDQ4MEMwMTJDIg0KLQkJCQkJY2xpZW50ICAgICAJQDQNCi0JCQkJCXN1cHBsaWVyICAgCUAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjAsIDUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTIwLCAzNDkpKSkpDQotCQkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBAOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJY2xpZW50ICAgICAJQDMNCi0JCQkJc3VwcGxpZXIgICAJQDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDksIDM0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDEyOTcpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZW1hcDo6VXRpbGl0eUpBUk1hcHBpbmciIEAxMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU0NCwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzIsIDY2OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJVdGlsaXR5SkFSTWFwcGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzU3MDU5NTAwOUYiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQljbGllbnQgICAgIAlAMQ0KLQkJCQlzdXBwbGllciAgIAlAMTANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTA4OCwgMTI5NykNCi0JCQkJICAgICgxMDg4LCA3ODYpDQotCQkJCSAgICAoNzY1LCA3ODYpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzY4LCAxMjk4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY4LCA5NDMpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZW1hcDo6RUFSUHJvamVjdE1hcCIgQDEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTQ0LCAyMjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3NiwgMTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkVBUlByb2plY3RNYXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MDQ2MTgwMjI3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwMiwgMjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcwNDY2MzAyNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWFwcGluZ3MiIEAxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCQkJbG9jYXRpb24gICAJKDczMCwgLTI0KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjI3LCAxNzUpDQotCQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXBwaW5ncyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3MDQ2NjQwMkE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzDQotCQkJCQlzdXBwbGllciAgIAlAMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDAyLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4MywgMjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDI3MCkNCi0JCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzAsIC0yNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjcwNDY2NDAyQjIiDQotCQkJCQljbGllbnQgICAgIAlAMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDAyLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzIxLCAyMTYpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMTgNCi0JCQkJbG9jYXRpb24gICAJKDU0NCwgNDcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzU3MDlEMjAxMEUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidXRpbGl0eUpBUk1hcHBpbmdzIiBAMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgwLCAyNDcpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0MSwgNTcxKQ0KLQkJCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJCXNpemUgICAgICAgCTEwDQotCQkJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkJY29sb3IgICAgICAJMA0KLQkJCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzc0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdXRpbGl0eUpBUk1hcHBpbmdzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1OTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjA0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M1NzA5RDMwMTlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTANCi0JCQkJCWxpbmVfc3R5bGUgCTANCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTgsIDYzNykNCi0JCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3Mjk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgwLCAyNDcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M1NzA5RDMwMTlEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTINCi0JCQkJCWxpbmVfc3R5bGUgCTApKSkpKSkpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcY29tLmlibS5ldG9vbHMuajJlZS5jb3JlXFxyb3NlXFxjb21tb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzA4RjBGMDM4RCIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXHNyY1xcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcY29tLmlibS5ldG9vbHMuamF2YS5jb3JlXFxyb3NlXFxlZG9jamF2YTIuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNCNzA0NTY1MDE5MyINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb24iIEAyMw0KLQkJCWxvY2F0aW9uICAgCSgxMTM2LCA5MTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDk5MiwgODI4KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJhcHBsaWNhdGlvbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzAzMDA4MDE0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0I3MDQ1NjUwMThDIg0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0I3MDQ1NjUwMTlEIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0I3MDQ1NjUwMThEIg0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQjcwNDU2NTAxOEYiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzVGFzayINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIm1fIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJzXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQlxdWlkICAgICAgIAkiM0I3MDQ1NjUwMThFIikpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yb3NlL21vZHVsZW1hcC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcm9zZS9tb2R1bGVtYXAuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTgwZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yb3NlL21vZHVsZW1hcC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2R1bGVtYXAiCi0gICAgbnNVUkk9Imh0dHA6Ly8vbW9kdWxlbWFwLmVjb3JlIiBuc1ByZWZpeD0ibW9kdWxlbWFwIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2R1bGVNYXBwaW5nIj4KLSAgICA8ZVJlZmVyZW5jZXMgbmFtZT0ibW9kdWxlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS9yb3NlL2FwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIi8+Ci0gICAgPGVBdHRyaWJ1dGVzIG5hbWU9InByb2plY3ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVBUlByb2plY3RNYXAiPgotICAgIDxlUmVmZXJlbmNlcyBuYW1lPSJtYXBwaW5ncyIgZVR5cGU9IiMvL01vZHVsZU1hcHBpbmciIHVwcGVyQm91bmQ9Ii0xIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlUmVmZXJlbmNlcyBuYW1lPSJ1dGlsaXR5SkFSTWFwcGluZ3MiIGVUeXBlPSIjLy9VdGlsaXR5SkFSTWFwcGluZyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlV0aWxpdHlKQVJNYXBwaW5nIj4KLSAgICA8ZUF0dHJpYnV0ZXMgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZUF0dHJpYnV0ZXMgbmFtZT0idXJpIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL0NsYXNzcGF0aERlcC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvQ2xhc3NwYXRoRGVwLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmIwZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvQ2xhc3NwYXRoRGVwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpZD0iY2xhc3NwYXRoZGVwIiBuYW1lPSJDbGFzc3BhdGggRGVwZW5kZW5jeSBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgc3VwcG9ydHMgY3VzdG9taXphdGlvbiBvZiB0aGUgY2xhc3NwYXRoIGRlcGVuZGVuY3kgZnVuY3Rpb25hbGl0eSB3aGVyZWJ5IHByb2plY3QgY2xhc3NwYXRoIGVudHJpZXMgY2FuIGJlIHRhZ2dlZCBmb3IgY29udHJpYnV0aW9uIHRvIHRoZSBwdWJsaXNoZWQvZXhwb3J0ZWQgc3RydWN0dXJlIG9mIHRoZSBtb2R1bGUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbHRlcmVkQ2xhc3NwYXRoQ29udGFpbmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZWQgYSBjbGFzc3BhdGggY29udGFpbmVyIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkIGZyb20gdGhlIGxpc3Qgb2YgY2xhc3NwYXRoIGNvbnRhaW5lcnMgY29uc2lkZXJlZCBhcyBwb3RlbnRpYWwgY29udHJpYnV0aW9ucyB0byB0aGUgcHVibGlzaGVkL2V4cG9ydGVkIHN0cnVjdHVyZSBvZiB0aGUgbW9kdWxlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJJRCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBDbGFzc3BhdGggY29udGFpbmVyIElELgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvRGVwbG95ZXJFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL0RlcGxveWVyRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjZiMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvRGVwbG95ZXJFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IkRlcGxveWVyRXh0ZW5zaW9uIiBuYW1lPSJKMkVFIERlcGxveWVyIEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZXh0ZW5zaW9uIHBvaW50IGdpdmVzIHRoZSBhYmlsaXR5IHRvIGV4dGVuZCBkZXBsb3llciBvcGVyYXRpb25zIG9uIEoyRUUgYXJ0aWZhY3RzLCBmb3IgZWcsIEVKQiBkZXBsb3ltZW50IGFuZCBXZWJzZXJ2aWNlcyBkZXBsb3ltZW50LiBSZWdpc3RyYXRpb24gb2YgdGhlIGRlcGxveWVyIGlzIGJhc2VkIG9uIG1vZHVsZSB0eXBlIGFuZCBzZXJ2ZXIgdGFyZ2V0Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVwbG95ZXIiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImRlcGxveWVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJuYXR1cmUiLz4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbXBvbmVudCIvPg0KLSAgICAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3llcl9jbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMgdGhlIGRlcGxveWVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lX3NlcnZlcl9pZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgcnVudGltZSBzZXJ2ZXIgaWQgZm9yIHRoaXMgZGVwbG95ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdHVyZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlX25hdHVyZV9pZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgc3VwcG9ydCBtb2R1bGUgbmF0dXJlIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBvbmVudF90eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBzdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgZGVwbG95ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvRUFSTW9kdWxlRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9FQVJNb2R1bGVFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5MjA2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9FQVJNb2R1bGVFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IkVBUk1vZHVsZUV4dGVuc2lvbiIgbmFtZT0iRUFSIE1vZHVsZSBFeHRlbnNpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGFwaSZhcG9zO3MgZm9yIEVKQiwgSkNBIGFuZCBXZWIgbW9kdWxlcyBhcmUgZGVmaW5lZCBpbiBwbHVnaW5zIHNlcGFyYXRlIGZyb20gSjJFRSBwbHVnaW4uIFRob3NlIHBsdWdpbnMgaGF2ZSBkZXBlbmRlbmNpZXMgb24gdGhlIEoyRUUgcGx1Z2luLCBidXQgbm90IHZpY2UgdmVyc2EuIEluIG9yZGVyIGZvciBjb2RlIGRlZmluZWQgd2l0aGluIHRoZSBKMkVFIHBsdWdpbiB0byBhY2Nlc3MgYXBpJmFwb3M7cyBpbiB0aGVzZSBtb2R1bGVzIHdlIG5lZWQgdGhpcyBleHRlbnNpb24gcG9pbnQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlYXJNb2R1bGVFeHRlbnNpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVhck1vZHVsZUV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIGZvciB0aGUgbW9kdWxlIGV4dGVuc2lvbi4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvRUpCQ29tbWFuZEV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvRUpCQ29tbWFuZEV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZmZTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL0VKQkNvbW1hbmRFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IkVKQkNvbW1hbmRFeHRlbnNpb24iIG5hbWU9IkVKQiBDb21tYW5kIEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBNYWlubHkgdXNlZCB0byBvdmVyd3JpdGUgZGVsZXRlIGFuZCB1cGRhdGUgY29tbWFuZHMgZm9yIGVqYiZhcG9zO3MuIEZvciBlZyB0aGUgZXh0ZW5zaW9uIHdhcyB1c2VkIHRvIG92ZXJ3cml0ZSBkZWxldGUgYmVhbiBjb21tYW5kLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29tbWFuZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iY29tbWFuZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1biIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW4iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9KMkVFTW9kZWxQcm92aWRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvSjJFRU1vZGVsUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwY2I4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9KMkVFTW9kZWxQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IkoyRUVNb2RlbFByb3ZpZGVyIiBuYW1lPSJKMkVFIE1vZGVsIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kZWxQcm92aWRlciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsUHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVmYXVsdCBwcmlvcml0eSBpcyAxMDAsIHVzZSBhIHNtYWxsZXIgIyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9ucyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsaXN0IG9mIGZhY2V0IHZlcnNpb25zIGNvbW1hIHNlcGVyYXRlZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvSjJFRU1vZHVsZVBvc3RJbXBvcnQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL0oyRUVNb2R1bGVQb3N0SW1wb3J0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTdkYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvSjJFRU1vZHVsZVBvc3RJbXBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IkoyRUVNb2R1bGVQb3N0SW1wb3J0IiBuYW1lPSJKMkVFIE1vZHVsZSBQb3N0IEltcG9ydCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbi1wb2ludCBzZW5kcyBub3RpZmljYXRpb24gdG8gYWxsIGV4dGVuc2lvbnMgd2hlbiBKMkVFTW9kdWxlcyBhcmUgaW1wb3J0ZWQuIEVhY2ggZXh0ZW5zaW9uIGNhbiBzcGVjaWZ5IGEgc2V0IG9mIGRpZmZlcmVudCBtb2R1bGUgdHlwZXMgdG8gbGlzdGVuIGZvciBvciBsaXN0ZW4gdG8gdGhlbSBhbGwuICBUaGUgZGVmYXVsdCBpcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG1vZHVsZSB0eXBlcy4gIE5vdGlmaWNhdGlvbiBpcyBzZW50DQotdG8gdGhlIHNwZWNpZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgY29tLmlibS5ldG9vbHMuajJlZS5KMkVFTW9kdWxlUG9zdEltcG9ydEhhbmRsZXIuDQotDQotQm90aCBvZiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gZm9yIGFsbCBKMkVFTW9kdWxlIHR5cGVzLCB0aGUgZmlyc3QgdXNlcyB0aGUgZGVmYXVsdHMsIHdoaWxlIHRoZSBzZWNvbmQgc3BlY2lmaWVzIGVhY2ggbW9kdWxlIHR5cGUuICBUbyBsaXN0ZW4gZm9yIG9ubHkgc3BlY2lmaWMgbW9kdWxlIHR5cGVzLCB1c2UgdGhlIHNlY29uZCBleGFtcGxlIGFuZCBzcGVjaWZ5IG9ubHkgdGhlIHR5cGVzIHRvIGxpc3RlbiB0by4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBvc3RJbXBvcnQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InBvc3RJbXBvcnQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byBjYWxsIGR1cmluZyBwb3N0IGltcG9ydA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBKMkVFIG1vZHVsZSB0eXBlIHRvIHJ1biBwb3N0IGltcG9ydCBvbg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9XU0RMU2VydmljZUhlbHBlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvV1NETFNlcnZpY2VIZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1NDY4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9XU0RMU2VydmljZUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9IlNwZWNpYWxpemVkTW9kdWxlSW1wb3J0IiBuYW1lPSJTcGVjaWFsaXplZCBNb2R1bGUgSW1wb3J0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGdpdmVzIHRoZSBhYmlsaXR5IHRvIHRyZWF0IGEgamFyIGZpbGUgd2hpY2ggaXMgbm90IGFuIGVqYiBqYXIgZmlsZSBhcyBhbiBlamIgamFyIGZpbGUgZHVyaW5nIGVqYiBqYXIgaW1wb3J0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3c2RsSGVscGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id3NkbEhlbHBlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlbHBlckNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGhlbHBlckNsYXNzIGlzIHRoZSBoYW5kbGVyIGNsYXNzIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9XZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9XZWJTZXJ2aWNlQ2xpZW50R2VuZXJhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTQzODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvV2ViU2VydmljZUNsaWVudEdlbmVyYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpZD0iV2ViU2VydmljZUNsaWVudEdlbmVyYXRvciIgbmFtZT0iV2ViIFNlcnZpY2UgQ2xpZW50IEdlbmVyYXRvciIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFeHRlbmRlZCBieSBXQVMgb3IgYXhpcyBpbiBnZW5lcmF0aW5nIHdlYiBzZXJ2aWNlIGNsaWVudCBzcGVjaWZpYyBhcnRpZmFjdHMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJnZW5lcmF0b3IiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImdlbmVyYXRvciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBxdWFsaWZlZCBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgYXMgdGhlIHdlYiBzZXJ2aWNlIGNsaWVudCBnZW5lcmF0b3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlclRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiBydW50aW1lIHNlcnZlciB0YXJnZXQgd2hlcmUgdGhpcyBjbGllbnQgZ2VuZXJhdG9yIGlzIHVzZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50cy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ0NTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL2FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGlkPSJhcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzIiBuYW1lPSJBcmNoaXZlIEV4cG9ydCBQYXJ0aWNpcGFudHMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFVzZWQgZm9yIGV4dGVuZGluZyB0aGUgYXJjaGl2ZSBleHBvcnQgb3BlcmF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFydGljaXBhbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGFydGljaXBhbnQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFJlZ2lzdGVycyBhIHNpbmdsZSBhcmNoaXZlIGV4cG9ydCBwYXJ0aWNpcGFudC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhcnRpY2lwYW50LiBUaGlzIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgcGx1Z2luIGlkLiBQbHVnaW4gaWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHByZXBlbmRlZCB0byB0aGUgc3VwcGxpZWQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWUtY29tcG9uZW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHRoYXQgaGFzIHRvIGJlIHByZXNlbnQgaW4gdGhlIHNlbGVjdGVkIHJ1bnRpbWUgaW4gb3JkZXIgZm9yIHRoaXMgcGFydGljaXBhbnQgdG8gYmUgYXBwbGljYWJsZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBpZCBvZiB0aGUgcnVudGltZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbCB2ZXJzaW9uIG9yIGEgdmVyc2lvbiBleHByZXNzaW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBSZWdpc3RlcnMgdGhlIGZhY3RvcnkgY2xhc3MgdGhhdCB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIGZvciBjb25zdHJ1Y3RpbmcgdGhlIHBhcnRpY2lwYW50JmFwb3M7cyBkYXRhIG1vZGVsIGFuZCBvcGVyYXRpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleGFtcGxlIHJlZ2lzdGVycyBhbiBleHBvcnQgcGFydGljaXBhbnQgdGhhdCZhcG9zO3MgYXBwbGljYWJsZSB0byBydW50aW1lcyB0aGF0IGNvbnRhaW4gJnF1b3Q7bXkucnVudGltZS50eXBlJnF1b3Q7IGNvbXBvbmVudCB0eXBlIGFuZCB0byBwcm9qZWN0cyB0aGF0IGhhdmUgZWl0aGVyIHRoZSB3ZWIgb3IgZWFyIHByb2plY3QgZmFjZXQuCi0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHMmcXVvdDsmZ3Q7Ci0gICZsdDtwYXJ0aWNpcGFudCBpZD0mcXVvdDtNeUV4cG9ydFBhcnRpY2lwYW50JnF1b3Q7Jmd0OwotICAgICZsdDtydW50aW1lLWNvbXBvbmVudCB0eXBlPSZxdW90O215LnJ1bnRpbWUudHlwZSZxdW90OyB2ZXJzaW9uPSZxdW90O1sxLjAtMy4wKSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2ZhY3RvcnkgY2xhc3M9JnF1b3Q7Y29tLnNvbWVjb3JwLk15RXhwb3J0UGFydGljaXBhbnQmcXVvdDsvJmd0OwotICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgJmx0O29yJmd0OwotICAgICAgICAmbHQ7dGVzdCAKLSAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgIHByb3BlcnR5PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCZxdW90OwotICAgICAgICAgIHZhbHVlPSZxdW90O2pzdC53ZWImcXVvdDsvJmd0OwotICAgICAgICAmbHQ7dGVzdCAKLSAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgIHByb3BlcnR5PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCZxdW90OwotICAgICAgICAgIHZhbHVlPSZxdW90O2pzdC5lYXImcXVvdDsvJmd0OwotICAgICAgJmx0Oy9vciZndDsKLSAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICZsdDsvcGFydGljaXBhbnQmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9vcHRpb25hbFJlZmFjdG9ySGFuZGxlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvb3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3MmEzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9vcHRpb25hbFJlZmFjdG9ySGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaWQ9Im9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyIiBuYW1lPSJvcHRpb25hbFJlZmFjdG9ySGFuZGxlcmUiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3B0aW9uYWxSZWZhY3RvckhhbmRsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuQWJzdHJhY3RPcHRpb25hbFJlZmFjdG9ySGFuZGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9yZXNvdXJjZUVudlJlZlR5cGUuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL3Jlc291cmNlRW52UmVmVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU1YmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL3Jlc291cmNlRW52UmVmVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpZD0icmVzb3VyY2VFbnZSZWZUeXBlIiBuYW1lPSJSZXNvdXJjZSBFbnZpcm9ubWVudCBSZWZlcmVuY2UgVHlwZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCB0eXBlcyB0byB0aGUgZHJvcCBkb3duIG9wdGlvbnMgYXZhaWxhYmxlIHdoZW4gY3JlYXRpbmcgb3IgbW9kaWZ5aW5nIFJlc291cmNlIEVudmlyb25tZW50IFJlZmVyZW5jZXMgZm9yIGEgQXBwbGljYXRpb24gQ2xpZW50IG9yIEVKQiBQcm9qZWN0Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNlIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVmFsaWQgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGVzLiAgRXhhbXBsZTogamF2YXguam1zLlRvcGljDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVzYWdlIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdXNhZ2UgZmllbGQgaXMgcmVxdWlyZWQuICBWYWxpZCB0eXBlcyBhcmUgQ29tbW9uLCBFSkIgSmFyLiANCi1BIHVzYWdlIHRhZyB3aXRoIHRoZSB2YWx1ZSBDb21tb24gaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBhdmlsYWJsZSBmb3IgYWxsIEoyRUUgcHJvamVjdHMuDQotQSB1c2FnZSB0YWcgd2l0aCB0aGUgdmFsdWUgRUpCIEphciBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgb25seSBhcHBsaWNhYmxlIHRvIEVKQiBwcm9qZWN0cy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24gQ2xpZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRUpCIEphciI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbiI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldC1zZXJ2ZXItaWRzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgdGFyZ2V0IHNlcnZlciBpZCBmb3IgdGhpcyB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGV4dGVuc2lvbjoNCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5yZXNvdXJjZUVudlJlZlR5cGUmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3JlZmVyZW5jZSB1c2FnZT0mcXVvdDtDb21tb24mcXVvdDsgdHlwZT0mcXVvdDtqYXZheC5zcWwuRGF0YVNvdXJjZSZxdW90Oy8mZ3Q7DQotICAgICAgJmx0O3JlZmVyZW5jZSB1c2FnZT0mcXVvdDtFSkIgSmFyJnF1b3Q7IHR5cGU9JnF1b3Q7amF2YXguam1zLlRvcGljJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCByZXF1aXJlcyB0aGF0IHRoZSBleHRlbnNpb24gYmUgZGVmaW5lZCBpbiB0aGUgcGx1Z2luIGZpbGUgb2YgdGhlIGV4dGVuZGluZyBwbHVnaW4uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9yZXNvdXJjZVJlZlR5cGUuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL3Jlc291cmNlUmVmVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAxMTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL3Jlc291cmNlUmVmVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpZD0icmVzb3VyY2VSZWZUeXBlIiBuYW1lPSJSZXNvdXJjZSBSZWYgVHlwZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCB0eXBlcyB0byB0aGUgZHJvcCBkb3duIG9wdGlvbnMgYXZhaWxhYmxlIHdoZW4gY3JlYXRpbmcgb3IgbW9kaWZ5aW5nIFJlc291cmNlIFJlZmVyZW5jZXMgZm9yIGEgQXBwbGljYXRpb24gQ2xpZW50IG9yIEVKQiBQcm9qZWN0Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNlIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVmFsaWQgcmVzb3VyY2UgcmVmZXJlbmNlIHR5cGVzLiAgRXhhbXBsZTogamF2YXguam1zLlRvcGljDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVzYWdlIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdXNhZ2UgZmllbGQgaXMgcmVxdWlyZWQuICBWYWxpZCB0eXBlcyBhcmUgQ29tbW9uLCBFSkIgSmFyLiANCi1BIHVzYWdlIHRhZyB3aXRoIHRoZSB2YWx1ZSBDb21tb24gaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBhdmlsYWJsZSBmb3IgYWxsIEoyRUUgcHJvamVjdHMuDQotQSB1c2FnZSB0YWcgd2l0aCB0aGUgdmFsdWUgRUpCIEphciBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgb25seSBhcHBsaWNhYmxlIHRvIEVKQiBwcm9qZWN0cy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24gQ2xpZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRUpCIEphciI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbiI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldC1zZXJ2ZXItaWRzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgdGFyZ2V0IHNlcnZlciBpZCBmb3IgdGhpcyByZXNvdXJjZSByZWZlcmVuY2UgdGFyZ2V0Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb246DQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LmoyZWUudWkucmVzb3VyY2VSZWZUeXBlJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtyZWZlcmVuY2UgdXNhZ2U9JnF1b3Q7Q29tbW9uJnF1b3Q7IHR5cGU9JnF1b3Q7amF2YXguam1zLlF1ZXVlJnF1b3Q7LyZndDsgICAgDQotICAgICAgJmx0O3JlZmVyZW5jZSB1c2FnZT0mcXVvdDtFSkIgSmFyJnF1b3Q7IHR5cGU9JnF1b3Q7amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgDQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcmVxdWlyZXMgdGhhdCB0aGUgZXh0ZW5zaW9uIGJlIGRlZmluZWQgaW4gdGhlIHBsdWdpbiBmaWxlIG9mIHRoZSBleHRlbmRpbmcgcGx1Z2luLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zbW9rZS9jb25zdHJ1Y3Rpb24zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2UvY29uc3RydWN0aW9uMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NThkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zbW9rZS9jb25zdHJ1Y3Rpb24zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2UvZGV0b3VyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2UvZGV0b3VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2Y2Q4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Ntb2tlL2RldG91ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Ntb2tlL2VqYnJkYl9zbW9rZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zbW9rZS9lamJyZGJfc21va2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczNWZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Ntb2tlL2VqYnJkYl9zbW9rZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IlJheW1vbmQgTGV1bmciPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkVKQi1SREIgTWFwcGluZyBTbW9rZSBUZXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci1FSkItUkRCIE1hcHBpbmcgU21va2UgVGVzdCAoMDcvMTIvMDEpPC9oMj4KLQotPGgzPgotVG9wLWRvd24gU2NlbmFyaW8gKGFsc28gdGVzdHMgbWVldC1pbi1taWRkbGUgZnVuY3Rpb25zKTo8L2gzPgotCi08b2w+Ci08bGk+Ci1PcGVuIGFuIGVtcHR5IHdvcmtiZW5jaC48L2xpPgotCi08bGk+Ci1JbXBvcnQgdW5pdmVyc2l0eTMuamFyPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCBNZW51ICJGaWxlL0ltcG9ydCIuPC9saT4KLQotPGxpPgotU2VsZWN0ICJFSkIgSmFyIEZpbGUiIGFzIGltcG9ydCBzb3VyY2UuIEhpdCB0aGUgIk5leHQiIGJ1dHRvbi48L2xpPgotCi08bGk+Ci1FbnRlciB0aGUgcGF0aCBuYW1lIHRvIHRoZSBFSkIgSmFyIGZpbGUgInVuaXZlcnNpdHkzLmphciIgb3IgdXNlIHRoZSAiYnJvd3NlIgotYnV0dG9uIHRvIGxvY2F0ZSB0aGUgamFyIGZpbGUuPC9saT4KLQotPGxpPgotR2l2ZSBhbiBFSkIgUHJvamVjdCBuYW1lICJVbml2ZXJzaXR5Ii48L2xpPgotCi08bGk+Ci1IaXQgdGhlICJGaW5pc2giIGJ1dHRvbiB0byBpbXBvcnQgZXZlcnl0aGluZyBpbiB0aGUgamFyIGZpbGUuPC9saT4KLQotPGxpPgotVGhlIHdpemFyZCB3aWxsIHRha2UgYSB3aGlsZSB0byBpbXBvcnQgdGhlIEVKQiBqYXIgZmlsZS48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBhIHByb2plY3QgbmFtZWQgIlVuaXZlcnNpdHkiIGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIE5hdmlnYXRvcgotdmlldy48L2xpPgotPC9vbD4KLQotPGxpPgotQ3JlYXRpbmcgYSBUb3AtRG93biBFSkItUkRCIE1hcHBpbmc8L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IHRoZSAiVW5pdmVyc2l0eSIgcHJvamVjdCwgcmlnaHQgY2xpY2sgdG8gYnJpbmcgdXAgdGhlIHBvcC11cCBtZW51Ci1hbmQgc2VsZWN0ICJOZXcvT3RoZXJzLi4uIi48L2xpPgotCi08bGk+Ci1BIGRpYWxvZ3VlIHdpbGwgY29tZSB1cC4gT24gdGhlIGxlZnQgcGFuZSwgc2VsZWN0ICJFSkIiLiBUaGVuIG9uIHRoZSByaWdodAotcGFuZSwgc2VsZWN0ICJFSkIgdG8gUkRCIE1hcHBpbmciLjwvbGk+Ci0KLTxsaT4KLUhpdCB0aGUgIk5leHQiIGJ1dHRvbi48L2xpPgotCi08bGk+Ci1BY2NlcHQgdGhlIGRlZmF1bHQgdG8gY3JlYXRlIGEgVG9wIERvd24gbWFwcGluZy4gSGl0IHRoZSAiTmV4dCIgYnV0dG9uLjwvbGk+Ci0KLTxsaT4KLUFjY2VwdCB0aGUgZGVmYXVsdCBmb3IgVGFyZ2V0IERhdGFiYXNlIGV0Yy4gYW5kIGhpdCB0aGUgIk5leHQiIGJ1dHRvbiB0bwotZ28gdG8gdGhlIEFkdmFuY2VkIE9wdGlvbiBwYWdlLjwvbGk+Ci0KLTxsaT4KLU1hcmsgdGhlIGNoZWNrYm94ZXMgZm9yICJWYXBGYWN1bHR5IiwgIlZhcEluc3RydWN0b3IiIGFuZCAiVmFwUGFydFRpbWVJbnN0cnVjdG9yIgotYW5kIGxlYXZlIHRoZSBjaGVja2JveCBmb3IgIlZhcFN1YnN0aXR1dGVJbnN0cnVjdG9yIiB1bmNoZWNrZWQuPC9saT4KLQotPGxpPgotSGl0IHRoZSAiRmluaXNoIiBidXR0b24uIFRoZSB3aXphcmQgd2lsbCBub3cgY3JlYXRlIHRoZSBtYXBwaW5ncy48L2xpPgotCi08bGk+Ci1FeHBhbmQgdGhlICJ1bml2ZXJzaXR5IiBwcm9qZWN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGV4cGFuZGVkIGJ5IGNsaWNraW5nCi1vbiB0aGUgIisiIHNpZ24uPC9saT4KLQotPGxpPgotRXhwYW5kIGFsb25nIHRoZSBmb2xkZXJzICJVbml2ZXJzaXR5L2VqYk1vZHVsZS9NRVRBLUlORiIuIFZlcmlmeSB0aGF0IHRoZXJlCi1pcyBhIGZvbGRlciAiU2NoZW1hIi48L2xpPgotCi08bGk+Ci1FeHBhbmQgdGhlIGZvbGRlciAiU2NoZW1hIiBhbmQgdmVyaWZ5IHRoZXJlIGlzIGEgZmlsZSAiU2NoZW1hLmRieG1pIiBpbgotaXQuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlcmUgaXMgYWxzbyBhIGZpbGUgIk1hcC5tYXB4bWkiIGluIHRoZSAiTUVUQS1JTkYiIGZvbGRlci48L2xpPgotPC9vbD4KLQotPGxpPgotT3BlbiB0aGUgTWFwcGluZzwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1TZWxlY3QgdGhlIGZpbGUgIk1hcC5tYXB4bWkiLjwvbGk+Ci0KLTxsaT4KLURvdWJsZS1jbGljayBvbiBpdCBvciBzZWxlY3QgdGhlIG1lbnUgaXRlbSAiT3BlbiIgaW4gdGhlIHBvcC11cCBtZW51LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBtYXBwaW5nIGVkaXRvciBpcyBsYXVuY2hlZCBpbiB0aGUgbWFpbiB3aW5kb3cuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgYXQgdGhlIHVwcGVyIGxlZnQgb2YgdGhlIG1haW4gd2luZG93LCB0aGUgY29udGVudHMgb2YgdGhlIEVKQgotSmFyIGlzIGRpc3BsYXllZCwgIlZhcEZhY3VsdHkiLCAiVmFwQ291cnNlIi4uLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IGF0IHRoZSB1cHBlciByaWdodCBvZiB0aGUgbWFpbiB3aW5kb3csIHRoZSBjb250ZW50cyBjb250YWlucwotYSBkYXRhYmFzZSBuYW1lZCAiU0FNUExFIiBjb250YWluaW5nIFJEQiBUYWJsZXMgIlZBUEZBQ1VMVFkiLCAiVkFQQ09VUlNFIi4uLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IGJlbG93IHRoZSBFSkIgSmFyIGFuZCBSREIgVGFibGUgdmlld3MgaXMgdGhlIE92ZXJ2aWV3IG9mIHRoZQotbWFwcGluZy4gVmVyaWZ5IHRoYXQgYm90aCBjb2x1bW5zIChFSkJzIGFuZCBUYWJsZXMpIGFyZSBub3QgZW1wdHkuPC9saT4KLQotPGxpPgotTG9vayBmb3IgdGhlIE91dGxpbmUgVmlldy4gSWYgaXQgaXMgbm90IG9wZW4sIGl0IGNhbiBiZSBvcGVuZWQgYnkgc2VsZWN0aW5nCi1mcm9tIHRoZSAiUGVyc3BlY3RpdmUiIG1lbnUgIlBlcnNwZWN0aXZlL1Nob3cgVmlldy9PdXRsaW5lIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgb3V0bGluZSB2aWV3IGlzIG5vdCBlbXB0eS4gTWFwcGluZ3MgYXJlIGRpc3BsYXllZCB1c2luZwotdGhlIHN5bWJvbCAiJmx0Oy0+Ii48L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBiZWFucyBhcmUgaW1wb3J0ZWQuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLUV4cGFuZCB0aGUgIlZhcEZhY3VsdHkiIEVKQiBpbiB0aGUgRUpCcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgIlZhcEluc3RydWN0b3IiIEVKQiBuZXN0ZWQgaW4gaXQuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgImhpcmVEYXRlIiwgIm5hbWUiLCAibnVtYmVyT2ZEZXBlbmRlbnRzIiwKLSJzYWxhcnkiLCAiZmFjdWx0eU51bWJlciIsICJhZGRyZXNzIiBhbmQgImRlcHRTb3J0S2V5Ii4gVmVyaWZ5IHRoYXQgImZhY3VsdHlOdW1iZXIiCi1pcyBhIGtleS48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGVyZSBhcmUgcmVsYXRpb25zaGlwIHJvbGVzICJhZHZpc2VkU3R1ZGVudHMiLCAiaGVhZHNEZXBhcnRtZW50IiwKLSJjbGFzc2VzIiBhbmQgImRlcGFydG1lbnQiLjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCB0aGUgIlZhcEluc3RydWN0b3IiIEVKQi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGVyZSBhcmUgdHdvIEVKQnMgbmVzdGVkIGluc2lkZSBpdDogIlZhcFN1YnN0aXR1dGVJbnN0cnVjdG9yIgotYW5kICJWYXBQYXJ0VGltZUluc3RydWN0b3IiLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZXJlIGlzIGFsc28gYW4gYXR0cmlidXRlICJ0ZXJtaW5hdGlvbkRhdGUiIHVuZGVyICJWYXBJbnN0cnVjdG9yIi48L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgbGVhZiB0YWJsZXMgYXJlIGNyZWF0ZWQuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLUluc3BlY3QgdGhlIFRhYmxlcyB2aWV3IG9uIHRoZSByaWdodCBoYW5kIHNpZGUuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIHRhYmxlcyAiVkFQRkFDVUxUWSIsICJWQVBJTlNUUlVDVE9SIiwgIlZBUFBBUlRUSU1FSU5TVFJVQ1RPUiIuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlcmUgaXMgTk8gdGFibGUgbmFtZWQgIlZBUFNVQlNUSVRVVEVJTlNUUlVDVE9SIi4gUmVtZW1iZXIKLSJWYXBTdWJzdGl0dXRlSW5zdHJ1Y3RvciIgd2FpcyBub3QgbWFya2VkIGFzIGEgbGVhZiB0YWJsZSB3aGVuIHRoZSBtYXBwaW5nCi13YXMgY3JlYXRlZC48L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIHZhcmlvdXMgdmlld3MgYXJlIGluIHN5bmMuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLUNvbGxhcHNlICJWYXBGYWN1bHR5IiBpbiB0aGUgRUpCcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgIlZhcEZhY3VsdHkgJmx0Oy0+IFZBUEZBQ1VMVFkiIGl0ZW0gKG1hcHBpbmcpIGluIHRoZSBPdXRsaW5lCi12aWV3LiBWZXJpZnkgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiB0aGUgRUpCcyB2aWV3LCBUYWJsZXMgdmlldwotYW5kIE92ZXJ2aWV3IHZpZXcgYXJlIHNlbGVjdGVkLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgIlZhcENvdXJzZSAmbHQ7LT4gVkFQQ09VUlNFIiBpdGVtIGluIHRoZSBPdXRsaW5lIHZpZXcmbmJzcDsKLWFuZCB2ZXJpZnkgdGhlIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSBvdGhlciB2aWV3cyBhcmUgdXBkYXRlZCBjb3JyZXNwb25kaW5nbHkuPC9saT4KLQotPGxpPgotTm93LCBnbyB0byB0aGUgRUpCcyB2aWV3ICh1cHBlciBsZWZ0IGluIHRoZSBtYWluIHdpbmRvdykgYW5kIHNlbGVjdCB0aGUKLSJWYXBTdHVkZW50IiAoc2luZ2xlIGNsaWNrKS4gVmVyaWZ5IHRoYXQgdGhlICJWYXBTdHVkZW50ICZsdDstPiBWQVBTVFVERU5UIgotaXRlbSBpbiB0aGUgT3V0bGluZSB2aWV3IGlzIHNlbGVjdGVkLiBBbHNvIHZlcmlmeSB0aGF0ICJWYXBTdHVkZW50IiBpcwotc2VsZWN0ZWQgaW4gdGhlIE92ZXJ2aWV3IHZpZXcuIEhvd2V2ZXIsIHRoZSBUYWJsZXMgdmlldyBzaG91bGQgc3RpbGwgc3RheQotb24gIlZBUENPVVJTRSIuPC9saT4KLQotPGxpPgotTm93LCBkb3VibGUtY2xpY2sgIlZhcFN0dWRlbnQiIGluIHRoZSBFSkJzIHZpZXcsIHZlcmlmeSB0aGF0ICJWQVBTVFVERU5UIgotaW4gdGhlIFRhYmxlcyB2aWV3IGlzIHNlbGVjdGVkIGFuZCBubyBvdGhlciBzZWxlY3Rpb25zIHNob3VsZCBjaGFuZ2UuPC9saT4KLQotPGxpPgotTmV4dCwgc2VsZWN0ICJWQVBTQ0hFRFVMRURDTEFTUyIgaW4gdGhlIFRhYmxlcyB2aWV3ICh1cHBlciByaWdodCBpbiB0aGUKLW1haW4gd2luZG93KSBhbmQgdmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSBPdXRsaW5lIHZpZXcgYW5kCi1PdmVydmlldyB2aWV3IGNoYW5nZSB0byAiVmFwU2NoZWR1bGVkQ2xhc3MiIGFuZCAiVmFwU2NoZWR1bGVkQ2xhc3MgJmx0Oy0+Ci1WQVBTQ0hFRFVMRURDTEFTUyIgY29ycmVzcG9uZGluZ2x5LiBIb3dldmVyLCB0aGUgc2VsZWN0aW9uIGluIHRoZSBFSkJzCi12aWV3IHNob3VsZCBzdGlsbCBzdGF5IG9uICJWYXBTdHVkZW50Ii48L2xpPgotCi08bGk+Ci1Ob3csIGRvdWJsZS1jbGljayBvbiAiVkFQU0NIRURVTEVEQ0xBU1MiIGluIHRoZSBUYWJsZXMgdmlldy4gdmVyaWZ5IHRoYXQKLSJWYXBTaGVkdWxlZENsYXNzIiBpbiB0aGUgRUpCcyB2aWV3IGlzIHNlbGVjdGVkLiBObyBvdGhlciBzZWxlY3Rpb25zIHNob3VsZAotY2hhbmdlLjwvbGk+Ci0KLTxsaT4KLU5vdywgc2VsZWN0ICJWYXBEZXBhcnRtZW50IiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBPdmVydmlldyB2aWV3IGFuZAotdmVyaWZ5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gdGhlIG90aGVyIHZpZXdzIGFyZSB1cGRhdGVkLjwvbGk+Ci0KLTxsaT4KLU5vdywgc2VsZWN0ICJWQVBTVEFGRiIgaW4gdGhlIDJuZCBjb2x1bW4gb2YgdGhlIE92ZXJ2aWV3IHZpZXcgYW5kIHZlcmlmeQotdGhhdCB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiBvdGhlciB2aWV3cyBhcmUgdXBkYXRlZC48L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IG5lc3RlZCBFSkIgbWFwcGluZ3M8L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotRG91YmxlLWNsaWNrIG9uICJWYXBGYWN1bHR5IiBpbiB0aGUgRUpCcyB2aWV3LiBWZXJpZnkgdGhhdCBvbmx5ICJWQVBGQUNVTFRZIgotaW4gdGhlIFRhYmxlcyB2aWV3IGlzIHNlbGVjdGVkLjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCAiVmFwRmFjdWx0eSIgaW4gdGhlIEVKQnMgdmlldy4gRG91YmxlLWNsaWNrIG9uICJWYXBJbnN0cnVjdG9yIi4KLVZlcmlmeSB0aGF0IGJvdGggIlZBUEZBQ1VMVFkiIGFuZCAiVkFQSU5TVFJVQ1RPUiIgYXJlIHNlbGVjdGVkIGluIHRoZSBUYWJsZXMKLXZpZXcuPC9saT4KLQotPGxpPgotRXhwYW5kICJWYXBJbnN0cnVjdG9yIiBpbiB0aGUgRUpCcyB2aWV3LiBEb3VibGUtY2xpY2sgb24gIlZhcFN1YnN0aXR1dGVJbnN0cnVjdG9yIi4KLVZlcmlmeSB0aGF0IGJvdGggIlZBUEZBQ1VMVFkiIGFuZCAiVkFQSU5TVFJVQ1RPUiIgYXJlIHNlbGVjdGVkIGluIHRoZSBUYWJsZXMKLXZpZXcsIGkuZS4gc2FtZSBhcyBmb3IgIlZhcEluc3RydWN0b3IiLjwvbGk+Ci0KLTxsaT4KLURvdWJsZS1jbGljayBvbiAiVmFwUGFydFRpbWVJbnN0cnVjdG9yIiBpbiB0aGUgRUpCcyB2aWV3IGFuZCB2ZXJpZnkgdGhhdAotIlZBUEZBQ1VMVFkiLCAiVkFQSU5TVFJVQ1RPUiIgYW5kICJWQVBQQVJUVElNRUlOU1RSVUNUT1IiIGluIFRhYmxlcyB2aWV3Ci1hcmUgc2VsZWN0ZWQuPC9saT4KLQotPGxpPgotTm93LCBkb3VibGUtY2xpY2smbmJzcDsgb24gIlZBUEZBQ1VMVFkiIGluIFRhYmxlcyB2aWV3LiBWZXJpZnkgdGhhdCAiVmFwRmFjdWx0eSIsCi0iVmFwSW5zdHJ1Y3RvciIsICJWYXBTdWJzdGl0dXRlSW5zdHJ1Y3RvciIgYW5kICJWYXBQYXJ0VGltZUluc3RydWN0b3IiCi1pbiB0aGUgRUpCcyB2aWV3IGFyZSBzZWxlY3RlZC4gQWxzbyB2ZXJpZnkgdGhhdCB0aGUgNCBjb3JyZXNwb25kaW5nIG1hcHBpbmdzCi1hcmUgc2VsZWN0ZWQgaW4gdGhlIE91dGxpbmUgYW5kIE92ZXJ2aWV3IHZpZXdzLjwvbGk+Ci0KLTxsaT4KLURvdWJsZS1jbGljayBvbiAiVkFQSU5TVFJVQ1RPUiIgaW4gdGhlIFRhYmxlcyB2aWV3LiBWZXJpZnkgdGhhdCAiVmFwSW5zdHJ1Y3RvciIsCi0iVmFwU3Vic3RpdHV0ZUluc3RydWN0b3IiIGFuZCAiVmFwUGFydFRpbWVJbnN0cnVjdG9yIiBpbiB0aGUgRUpCcyB2aWV3Ci1hcmUgc2VsZWN0ZWQuIEFsc28gdmVyaWZ5IHRoZSAzIGNvcnJlc3BvbmRpbmcgbWFwcGluZ3MgYXJlIHNlbGVjdGVkIGluCi10aGUgT3V0bGluZSBhbmQgT3ZlcnZpZXcgdmlld3MuPC9saT4KLQotPGxpPgotRG91YmxlLWNsaWNrIG9uICJWQVBQQVJUVElNRUlOU1RSVUNUT1IiIGluIHRoZSBUYWJsZXMgdmlldy4gVmVyaWZ5IHRoYXQKLW9ubHkgIlZhcFBhcnRUaW1lSW5zdHJ1Y3RvciIgaW4gdGhlIEVKQnMgdmlldyBpcyBzZWxlY3RlZC48L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IHRoYXQgZGVsZXRpb24gYW5kIHVuZG8vcmVkbyB3b3JrPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCAiVmFwQ291cnNlICZsdDstPiBWQVBDT1VSU0UiIG1hcHBpbmcgaW4gdGhlIE91dGxpbmUgdmlldy48L2xpPgotCi08bGk+Ci1SaWdodC1jbGljayB0byBicmluZyB1cCB0aGUgcG9wLXVwIG1lbnUgYW5kIHNlbGVjdCAiRGVsZXRlIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgcm93IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtYXBwaW5nIGluIHRoZSBPdmVydmlldyB2aWV3Ci1kaXNhcHBlYXJlZC48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgbWFwcGluZyBpY29ucyBmb3IgIlZhcEZhY3VsdHkiIGluIHRoZSBFSkJzIHZpZXcgYW5kICJWQVBGQUNVTFRZIgotaW4gdGhlIFRhYmxlcyB2aWV3IG5vdyBoYXZlIGEgaG9sbG93IGNpcmNsZSBpbmRpY2F0aW5nIHRoZSBpdGVtcyBhcmUgbm90Ci1tYXBwZWQuPC9saT4KLQotPGxpPgotRnJvbSB0aGUgbWVudSBiYXIsIHNlbGVjdCAiRWRpdC9VbmRvIFJlbW92ZSIgdG8gdW5kbyB0aGUgZGVsZXRpb24uIFZlcmlmeQotdGhhdCAiVmFwRmFjdWx0eSIgYW5kICJWQVBGQUNVTFRZIiByZWFwcGVhciBpbiB0aGUgT3ZlcnZpZXcgdmlldywgdGhlIG1hcHBpbmcKLSJWYXBGYWN1bHR5ICZsdDstPiBWQVBGQUNVTFRZIiByZWFwcGVhcnMgaW4gdGhlIE91dGxpbmUgdmlldyBhbmQgdGhlIG1hcHBpbmcKLWljb25zIGluIHRoZSBFSkJzIHZpZXcgYW5kIFRhYmxlcyB2aWV3IGJlY29tZSBzb2xpZCBhZ2Fpbi48L2xpPgotCi08bGk+Ci1SaWdodC1jbGljayBvbiB0aGUgIlZhcEZhY3VsdHkiIGl0ZW0gaW4gdGhlIEVKQnMgdmlldyB0byBicmluZyB1cCB0aGUgcG9wLXVwCi1tZW51IGFuZCBzZWxlY3QgIlJlZG8gUmVtb3ZlIi4gVmVyaWZ5IHRoYXQgaXQgZ29lcyBiYWNrIHRvIHRoZSBzdGF0ZSBiZWZvcmUKLXRoZSB1bmRvIHN0ZXAuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVJlbW92ZSBhbGwgdGFibGVzLiBUaGlzIGlzIHRvIHByZXBhcmUgZm9yIHRoZSBuZXh0IHR3byB0ZXN0cy48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IGFsbCB0aGUgdGFibGVzIGluIHRoZSBUYWJsZXMgdmlldyBieSBjbGlja2luZyBvbiB0aGUgZmlyc3QgdGFibGUKLWFuZCB0aGVuIGhvbGRpbmcgZG93biB0aGUgc2hpZnQta2V5IGFuZCBjbGlja2luZyBvbiB0aGUgbGFzdCB0YWJsZS48L2xpPgotCi08bGk+Ci1TZWxlY3QgdGhlICJEZWxldGUiIGl0ZW0gZnJvbSB0aGUgIkVkaXQiIG1lbnUgaW4gdGhlIG1lbnUgYmFyLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBtYXBwaW5ncywgb3RoZXIgdGhhbiB0aGUgcm9vdCBFSkIgJmx0Oy0+IERhdGFiYXNlCi1tYXBwaW5nLCBpbiB0aGUgT3ZlcnZpZXcgYW5kIE91dGxpbmUgdmlld3MuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IGNvcHkgYW5kIHBhc3RlIHdvcmtzLjwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1TZWxlY3QgIlZhcFN0YWZmIiBpbiB0aGUgRUpCcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLVJpZ2h0LWNsaWNrIHRvIGJyaW5nIHVwIHRoZSBwb3AtdXAgbWVudSBhbmQgc2VsZWN0ICJDb3B5Ii48L2xpPgotCi08bGk+Ci1Nb3ZlIG92ZXIgdG8gdGhlIFRhYmxlcyB2aWV3LCByaWdodC1jbGljayBvbiAiU0FNUExFIiBhbmQgc2VsZWN0ICJQYXN0ZSIuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgYSB0YWJsZSAiVkFQU1RBRkYiIGlzIGNyZWF0ZWQgYW5kIG1hcHBpbmdzIGFyZSBlc3RhYmxpc2hlZAotYmV0d2VlbiB0aGUgYXR0cmlidXRlcyBpbiAiVmFwU3RhZmYiIGFuZCB0aGUgY29sdW1ucyBpbiAiVkFQU1RBRkYiLjwvbGk+Ci08L29sPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBkcmFnIGFuZCBkcm9wIHdvcmtzLjwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1TZWxlY3QgIlZhcERlcGFydG1lbnQiIGluIHRoZSBFSkJzIHZpZXcuPC9saT4KLQotPGxpPgotRHJhZyBhbmQgZHJvcCBpdCBvbnRvICJTQU1QTEUiIGluIHRoZSBUYWJsZXMgdmlldy48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBhIHRhYmxlICJWQVBERVBBUlRNRU5UIiBpcyBjcmVhdGVkIGFuZCBtYXBwaW5ncyBhcmUgZXN0YWJsaXNoZWQKLWJldHdlZW4gdGhlIGF0dHJpYnV0ZXMgaW4gIlZhcERlcGFydG1lbnQiIGFuZCB0aGUgY29sdW1ucyBpbiAiVkFQREVQQVJUTUVOVCIuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBpbnRlcm5hbCBlcnJvcnM8L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotQmVjYXVzZSB0aGUgRUpCcyBjcm9zcyByZWZlcmVuY2UgZWFjaCBvdGhlciBhbmQgdGhlc2UgY3Jvc3MgcmVmZXJlbmNlcwotYXJlIG1hcHBlZCB0byBmb3JlaWduIGtleXMgaW4gVGFibGVzLCB0aGUgY29sdW1ucyBhbmQgdGhlaXIgbWFwcGluZ3MgYXJlCi1ub3QgY29tcGxldGUgdW50aWwgdGFibGVzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHRoZSBFSkJzIGFyZSBjcmVhdGVkLiBFeHBhbmQKLXRoZSB0YWJsZXMgIlZBUFNUQUZGIiBhbmQgIlZBUERFUEFSVE1FTlQiIGFuZCBjbGljayBvbiBzb21lIG9mIHRoZSBjb2x1bW5zCi0oZXNwZWNpYWxseSB0aGUgZm9yZWlnaCBrZXlzKSB0byBkaXNwbGF5IHRoZWlyIHByb3BlcnRpZXMuIFZlcmlmeSB0aGF0Ci10aGVyZSBhcmUgbm8gaW50ZXJuYWwgZXJyb3JzIG9yIGV4Y2VwdGlvbnMuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSBhZGQvZGVsZXRlIG1hcHBpbmcgYWN0aW9ucyBhcmUgcHJvcGVybHkgZW5hYmxlZDwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1TZWxlY3QgIlZhcFN0YWZmIiBvbiB0aGUgRUpCcyB2aWV3LiAoc2luZ2xlIGNsaWNrKTwvbGk+Ci0KLTxsaT4KLVNlbGVjdCAiVkFQU1RBRkYiIG9uIHRoZSBUYWJsZXMgdmlldy4gKHNpbmdsZSBjbGljayk8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgaWNvbnMgZm9yIHJlbW92aW5nL2NyZWF0aW5nIG1hcHBpbmdzIGFuZCBtYXRjaGluZyBpdGVtcwotYXJlIGRpc2FibGVkLjwvbGk+Ci0KLTxsaT4KLUNsaWNrIG9uIHRoZSBtZW51IGl0ZW0gIkVKQiB0byBSREIgTWFwcGluZyBFZGl0b3IiIGluIHRoZSBtZW51IGJhciBhbmQKLXZlcmlmeSB0aGF0IGFsbCB0aGUgbWVudSBpdGVtcyBmb3IgY3JlYXRpbmcvcmVtb3ZpbmcgbWFwcGluZ3MgKGluY2x1ZGluZwotbWF0Y2hpbmcgaXRlbXMpIGFyZSBkaXNhYmxlZC48L2xpPgotCi08bGk+Ci1FeHBhbmQgIlZhcFN0YWZmIiBpbiB0aGUgRUpCcyB2aWV3IGFuZCBzZWxlY3QgInNhbGFyeSIuPC9saT4KLQotPGxpPgotRXhwYW5kICJWQVBTVEFGRiIgaW4gdGhlIFRhYmxlcyB2aWV3IGFuZCBzZWxlY3QgIlNBTEFSWSIuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIHJlbW92ZSBtYXBwaW5nIGljb24gaXMgZW5hYmxlZC48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgIlJlbW92ZSBNYXBwaW5nIiBtZW51IGl0ZW0gaXMgZW5hYmxlZCBpbiB0aGUgIkVKQiB0byBSREIKLU1hcHBpbmcgRWRpdG9yIiBtZW51LjwvbGk+Ci08L29sPgotCi08bGk+Ci1SZW1vdmUgbWFwcGluZ3MuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVJlbW92ZSB0aGUgbWFwcGluZyBieSBjbGlja2luZyBvbiB0aGUgcmVtb3ZlIG1hcHBpbmcgaWNvbiAodGhlIHNjaXNzb3JzCi1pY29uKS48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgaWNvbnMgZm9yICJzYWxhcnkiIGFuZCAiU0FMQVJZIiBoYXZlIGEgaG9sbG93IGNpcmNsZSBpbmRpY2F0aW5nCi10aGVyZSBhcmUgbm8gbWFwcGluZ3MgZm9yIHRoZSB0d28gaXRlbXMuPC9saT4KLQotPGxpPgotVmVyaWZ5IGFsc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyByZXByZXNlbnRpbmcgdGhlIG1hcHBpbmcgd2VyZQotcmVtb3ZlZCBmcm9tIHRoZSBPdmVydmlldyBhbmQgT3V0bGluZSB2aWV3cy48L2xpPgotCi08bGk+Ci1HbyB0byB0aGUgT3ZlcnZpZXcgdmlldyBhbmQgZXhwYW5kICJWYXBTdGFmZiIgaWYgaXQgaXMgbm90IGFscmVhZHkgZXhwYW5kZWQuPC9saT4KLQotPGxpPgotU2VsZWN0IGFsbCB0aGUgaXRlbXMgdW5kZXIgIlZhcFN0YWZmIiAoYnV0IG5vdCAiVmFwU3RhZmYiIGl0c2VsZikgaW4gdGhlCi1maXJzdCBjb2x1bW4uIFVzZSBTaGlmdC1jbGljayBvciBDdHJsLUNsaWNrLjwvbGk+Ci0KLTxsaT4KLVJpZ2h0IGNsaWNrIHRvIGJyaW5nIHVwIHRoZSBwb3AtdXAgbWVudSBhbmQgc2VsZWN0ICJEZWxldGUiLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSBhbGwgdGhlIG1hcHBpbmdzIHVuZGVyICJWYXBTdGFmZiIgYXJlIGRlbGV0ZWQgaW4gYm90aCB0aGUgT3ZlcnZpZXcKLWFuZCBPdXRsaW5lIHZpZXdzLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGUgY29sdW1ucyAiU0FMQVJZIiwgIk5VTUJFUiIsICJOQU1FIiBldGMuIHN0aWxsIGV4aXN0IHVuZGVyICJWQVBTVEFGRiIKLWluIHRoZSBUYWJsZXMgdmlldy4gT25seSB0aGUgbWFwcGluZ3Mgd2VyZSBkZWxldGVkLCBub3QgdGhlIGNvbHVtbnMgdGhlbXNlbHZlcy48L2xpPgotCi08bGk+Ci1WZXJpZnkgYWxsIHRoZSBhdHRyaWJ1dGVzIHVuZGVyICJWYXBTdGFmZiIgYW5kIGNvbHVtbnMgdW5kZXIgIlZBUFNUQUZGIgotaGF2ZSBubyBtYXBwaW5ncyBieSBpbnNwZWN0aW5nIHRoZWlyIGljb25zLjwvbGk+Ci08L29sPgotCi08bGk+Ci1WZXJpZnkgdGhhdCAiUmVtb3ZlIE1hcHBpbmciIGlzIGVuYWJsZWQgb25seSB3aGVuIHRoZXJlIGFyZSBubyBzdWItbWFwcGluZ3MuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCAiVmFwU3RhZmYiIGluIHRoZSBFSkJzIHZpZXcgYW5kIHNlbGVjdCAiVkFQU1RBRkYiIGluIHRoZSBUYWJsZXMKLXZpZXcuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlICJSZW1vdmUgTWFwcGluZyIsICJNYXRjaCBieSBOYW1lIiBhbmQgIk1hdGNoIGJ5IFR5cGUiIGljb25zCi1hbmQgbWVudSBpdG1lcyB1bmRlciAiRUpCIHRvIFJEQiBNYXBwaW5nIEVkaXRvciIgYXJlIGVuYWJsZWQuIFZlcmlmeSB0aGF0Ci10aGUgIkNyZWF0ZSBNYXBwaW5nIiBtZW51IGl0ZW0gaXMgZGlzYWJsZWQgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGluZwotYmV0d2VlbiAiVmFwU3RhZmYiIGFuZCAiVkFQU1RBRkYiLiBXZSBvbmx5IGRlbGV0ZWQgdGhlIG1hcHBpbmdzIGJldHdlZW4KLXRoZSBhdHRyaWJ1dGVzIGFuZCBjb2x1bW5zLCBub3QgYmV0d2VlbiB0aGUgRUpCIGFuZCBUYWJsZS48L2xpPgotPC9vbD4KLQotPGxpPgotUmVuYW1lIGNvbHVtbiAoUHJlcGFyZSBmb3IgTWF0Y2ggYnkgVHlwZS9OYW1lKTwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1GaW5kIHRoZSBQcm9wZXJ0aWVzIHZpZXcuIElmIGl0IGlzIG5vdCB2aXNpYmxlLCB5b3UgY2FuIGFkZCBpdCB0byB5b3VyCi13b3JrYmVuY2ggdGhyb3VnaCB0aGUgbWVudSAiUGVyc3BlY3RpdmUvU2hvdyBWaWV3L1Byb3BlcnRpZXMiLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCB0aGUgQ29sdW1uICJTQUxBUlkiIGluIFRhYmxlICJWQVBTVEFGRiIuPC9saT4KLQotPGxpPgotR28gdG8gdGhlIFByb3BlcnRpZXMgdmlldyBhbmQgY2xpY2sgb24gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAiTmFtZSIuCi1UaGlzIHdpbGwgbWFrZSB0aGUgc3RyaW5nIGVkaXRhYmxlLjwvbGk+Ci0KLTxsaT4KLU1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCBhZGQgYSAiMiIsIGkuZS4gY2hhbmdlIHRoZSBuYW1lIGZyb20KLSJTQUxBUlkiIHRvICJTQUxBUlkyIi48L2xpPgotCi08bGk+Ci1IaXQgdGhlICJFbnRlciIga2V5IGFuZCB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIHVwZGF0ZWQgb24KLWFsbCB0aGUgb3RoZXIgdmlld3MuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLU1hdGNoIGJ5IFR5cGUvTmFtZS48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotV2l0aCAiVmFwU3RhZmYiIHNlbGVjdGVkIGluIHRoZSBFSkJzIHZpZXcgYW5kICJWQVBTVEFGRiIgaW4gdGhlIFRhYmxlcwotdmlldywgY2xpY2sgdGhlICJNYXRjaCBieSBOYW1lIiBpY29uIG9yIHNlbGVjdCB0aGUgIk1hdGNoIGJ5IE5hbWUiIG1lbnUKLWl0ZW0gdW5kZXIgdGhlICJFSkIgdG8gUkRCIE1hcHBpbmcgRWRpdG9yIiBtZW51LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0ICJudW1iZXIiLCAibmFtZSIsICJ0aXRsZSIsIGFuZCAiZGVwYXJ0bWVudCIgYXJlIG1hcHBlZC48L2xpPgotCi08bGk+Ci1SZXNlbGVjdCAiVmFwU3RhZmYiIGluIHRoZSBFSkJzIHZpZXcgYW5kICJWQVBTVEFGRiIgaW4gdGhlIFRhYmxlcyB2aWV3LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IG5vdyBvbmx5IHRoZSAiTWF0Y2ggYnkgVHlwZSIgaWNvbiBhbmQgbWVudSBpdGVtIGlzIGVuYWJsZWQuPC9saT4KLQotPGxpPgotQ2xpY2sgdGhlICJNYXRjaCBieSBUeXBlIiBpY29uLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSAic2FsYXJ5IiBhdHRyaWJ1dGUgdW5kZXIgIlZhcFN0YWZmIiBpcyBtYXBwZWQuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSByb2xlIC8gZm9yZWlnbiBrZXkgbWFwcGluZy48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotRG91YmxlLWNsaWNrIG9uICJkZXBhcnRtZW50IiB1bmRlciAiVmFwU3RhZmYiLiBWZXJpZnkgdGhhdCB0aGUgIkRFUEFSVE1FTlQiCi1mb3JlaWduIGtleSB1bmRlciAiVkFQU1RBRkYiIGluIHRoZSBUYWJsZXMgdmlldyBpcyBzZWxlY3RlZC48L2xpPgotCi08bGk+Ci1Eb3VibGUtY2xpY2sgb24gIkRFUEFSVE1FTlQiIHVuZGVyICJWQVBTVEFGRiIgaW4gdGhlIFRhYmxlcyB2aWV3LiBWZXJpZnkKLXRoYXQgdHdvIHJvbGVzIGFyZSBzZWxlY3RlZCBpbiB0aGUgRUpCcyB2aWV3OiB0aGUgImRlcGFydG1lbnQiIHJvbGUgdW5kZXIKLSJWYXBTdGFmZiIgYW5kIHRoZSAic3RhZmYiIChyZXZlcnNlKSByb2xlIHVuZGVyICJWYXBEZXBhcnRtZW50Ii48L2xpPgotPC9vbD4KLQotPGxpPgotVW5kbyB0aGUgY3JlYXRhdGlvbiBvZiBtYXBwaW5ncy48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IHRoZSAiVW5kbyIgbWVudSBpdGVtIHVuZGVyIHRoZSAiRWRpdCIgbWVudSB0byB1bmRvIHRoZSAiTWF0Y2ggYnkKLVR5cGUiIGFjdGlvbi48L2xpPgotCi08bGk+Ci1TZWxlY3QgdGhlICJVbmRvIiBtZW51IGl0ZW0gYWdhaW4gdG8gdW5kbyB0aGUgIk1hdGNoIGJ5IE5hbWUiIGFjdGlvbi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBhbGwgdGhlIGl0ZW1zIHVuZGVyICJWYXBTdGFmZiIgYW5kICJWQVBTVEFGRiIgYXJlIG5vdCBtYXBwZWQKLWJ5IGluc3BlY3RpbmcgdGhlaXIgaWNvbnMuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IG1hcHBpbmcgaWNvbnMgYXJlIGVuYWJsZWQgYmFzZSBvbiB0eXBlcy48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0ICJzYWxhcnkiIHVuZGVyICJWYXBTdGFmZiIgaW4gdGhlIEVKQnMgdmlldy48L2xpPgotCi08bGk+Ci1TZWxlY3QgIlNBTEFSWSIgdW5kZXIgIlZBUFNUQUZGIiBpbiB0aGUgVGFibGVzIHZpZXcuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlICJDcmVhdGUgTWFwcGluZyIsICJNYXRjaCBieSBUeXBlIiBhbmQgIk1hdGNoIGJ5IE5hbWUiIGljb25zCi1hbmQgbWVudSBpdGVtcyBhcmUgZW5hYmxlZC48L2xpPgotCi08bGk+Ci1TZWxlY3QgIk5VTUJFUiIgdW5kZXIgIlZBUFNUQUZGIiBpbiB0aGUgVGFibGVzIHZpZXcuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlICJDcmVhdGUgTWFwcGluZyIsICJNYXRjaCBieSBUeXBlIiBhbmQgIk1hdGNoIGJ5IE5hbWUiIGljb25zCi1hbmQgbWVudSBpdGVtcyBhcmUgbm93IGRpc2FibGVkLjwvbGk+Ci08L29sPgotCi08bGk+Ci1WZXJpZnkgUmVkbyBvZiBNYXRjaCBjb21tYW5kcyB3b3JrLjwvbGk+Ci0KLTxvbCBUWVBFPWE+Ci08bGk+Ci1TZWxlY3QgIlJlZG8gTWF0Y2ggYnkgTmFtZSIgdW5kZXIgdGhlICJFZGl0IiBtZW51IG9uIHRoZSBtZW51IGJhci48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBub3cgIm51bWJlciIsICJuYW1lIiwgInRpdGxlIiwgYW5kICJkZXBhcnRtZW50IiBhcmUgbWFwcGVkLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGVyZSBhcmUgbm8gZXhjZXB0aW9ucyBvciBpbnRlcm5hbCBlcnJvcnMuPC9saT4KLQotPGxpPgotU2VsZWN0ICJSZWRvIE1hdGNoIGJ5IFR5cGUiIHVuZGVyIHRoZSAiRWRpdCIgbWVudSBvbiB0aGUgbWVudSBiYXIuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgbm93ICJzYWxhcnkiIGlzIGFsc28gbWFwcGVkLjwvbGk+Ci08L29sPgotPC9vbD4KLQotPGgzPgotQm90dG9tLVVwIFNjZW5hcmlvOjwvaDM+Ci0KLTxvbD4KLTxsaT4KLU9wZW4gYW4gZW1wdHkgd29ya2JlbmNoIG9yIGNsb3NlIGFsbCBlZGl0b3JzIGFuZCBkZWxldGUgdGhlICJVbml2ZXJzaXR5IgotcHJvamVjdC48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBEYXRhYmFzZSBieSBpbXBvcnRpbmcgdGhlIHVuaXZlcmlzdHkzLmphciwgY3JlYXRpbmcgYSB0b3AtZG93bgotbWFwcGluZyBhbmQgdGhlbiBkZWxldGluZyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgdGFibGVzIGluIHRoZSBkYXRhYmFzZS48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotSW1wb3J0IHVuaXZlcnNpdHkzLmphciBhbmQgY3JlYXRlIGEgVG9wLURvd24gRUpCLVJEQiBNYXBwaW5nIGFzIGRlc2NyaWJlZAotaW4gc3RlcCAyIGFuZCAzIGFib3ZlLjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCAiVW5pdmVyc2l0eS9lamJNb2R1bGUvTUVUQS1JTkYiIGluIHRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPgotCi08bGk+Ci1EZWxldGUgZXZlcnl0aGluZyB1bmRlciB0aGUgIlVuaXZlcnNpdHkiIHByb2plY3QgZXhjZXB0ICJlamJNb2R1bGUvTUVUQS1JTkYvU2NoZW1hL1NjaGVtYS5kYnhtaSIsCi1lc3BlY2lhbGx5IHRoZSAiTWFwLm1hcHhtaSIsICJlamItamFyLnhtaSIsICJpYm0tZWpiLWphci1ibmQueG1pIiwgImlibS1lamItamFyLWV4dC54bWkiCi1maWxlcyB1bmRlciAiZWpiTW9kdWxlL01FVEEtSU5GIi48L2xpPgotPC9vbD4KLQotPGxpPgotQ3JlYXRlIGEgQm90dG9tLVVwIE1hcHBpbmcuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCB0aGUgcHJvamVjdCAiVW5pdmVyc2l0eSIgaW4gdGhlIE5hdmlnYXRvciB2aWV3LjwvbGk+Ci0KLTxsaT4KLVJpZ2h0LWNsaWNrIHRvIGJyaW5nIHVwIHRoZSBwb3AtdXAgbWVudS4gU2VsZWN0ICJHZW5lcmF0ZSBmb3IgZW50ZXJwcmlzZQotYmVhbihzKS9DcmVhdGUgRUpCIHRvIFJEQiBNYXBwaW5nIi48L2xpPgotCi08bGk+Ci1BICJDcmVhdGUgbmV3IEVKQi9SREIgTWFwcGluZyIgZGlhbG9nIHdpbGwgY29tZSB1cCB3aXRoIHRoZSAiQm90dG9tIFVwIgotb3B0aW9uIHNlbGVjdGVkLjwvbGk+Ci0KLTxsaT4KLUhpdCB0aGUgIkZpbmlzaCIgYnV0dG9uLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0ICJlamItamFyLnhtbCIsICJpYm0tZWpiLWphci1leHQueG1pIiBhbmQgIk1hcC5tYXB4bWkiIGFyZSBjcmVhdGVkCi11bmRlciAiZWpiTW9kdWxlL01FVEEtSU5GIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBzb21lIGphdmEgZmlsZXMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhlICJib3R0b20vdXAiIGZvbGRlci48L2xpPgotPC9vbD4KLQotPGxpPgotT3BlbiB0aGUgbWFwcGluZy48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0ICJNYXAubWFweG1pIiBhbmQgZG91YmxlLWNsaWNrIG9uIGl0LjwvbGk+Ci0KLTxsaT4KLUV4cGFuZCBhbGwgdGhlIEVKQnMgYW5kIHZlcmlmeSB0aGF0IGFsbCB0aGUgYXR0cmlidXRlcyBhbmQgcm9sZXMgYXJlIG1hcHBlZAotKGkuZS4gdGhlIGljb25zIGhhdmUgc29saWQgY2lyY2xlcyk8L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCBhbGwgdGhlIGF0dHJpYnV0ZXMgaGF2ZSBhIHR5cGUuPC9saT4KLQotPGxpPgotRXhwYW5kIHRoZSBFSkIgIlZhcHN0YWZmIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgInNhbGFyeSIgYXR0cmlidXRlIGhhcyBhIHR5cGUgImphdmEubWF0aC5CaWdEZWNpbWFsIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgIm51bWJlciIgYXR0cmlidXRlIGlzIGEga2V5ICh0aGUgaWNvbiBoYXMgYSBrZXkpLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSB0eXBlIGZvciAibnVtYmVyIiBpcyAiYnl0ZVtdIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGVyZSBpcyBhIHJvbGUgImRlcGFydG1lbnQiIGFuZCB0aGUgdHlwZSBpcyAiVmFwZGVwYXJ0bWVudCIuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRhYmxlcyBjYW5ub3QgYmUgZGVsZXRlZC48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IHRoZSB0YWJsZSAiVkFQU1RBRkYiIGluIHRoZSBUYWJsZXMgdmlldy48L2xpPgotCi08bGk+Ci1SaWdodC1jbGljayB0byBicmluZyB1cCB0aGUgcG9wLXVwIG1lbnUgYW5kIHZlcmlmeSB0aGF0IHRoZSAiRGVsZXRlIiBpdGVtCi1pcyBkaXNhYmxlZC48L2xpPgotCi08bGk+Ci1DbGljayBvbiB0aGUgIkVkaXQnIG1lbnUgb24gdGhlIG1lbnUgYmFyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgIkRlbGV0ZSIgaXRlbQotaXMgZGlzYWJsZWQuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLURlbGV0ZSBhbiBFSkIgYW5kIHVuZG8uPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCB0aGUgRUpCICJWYXBzdGFmZiIgaW4gdGhlIEVKQnMgdmlldy48L2xpPgotCi08bGk+Ci1SaWdodC1jbGljayB0byBicmluZyB1cCB0aGUgcG9wLXVwIG1lbnUgYW5kIHNlbGVjdCAiRGVsZXRlIiB0byBkZWxldGUgdGhlCi1FSkIgIlZhcHN0YWZmIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgRUpCICJWYXBzdGFmZiIgZGlzYXBwZWFycyBmcm9tIHRoZSBFSkJzIHZpZXcuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIG1hcHBpbmdzIGluIHRoZSBPdXRsaW5lIGFuZCBPdmVydmlldyB2aWV3cyB0aGF0Ci1yZWZlcmVuY2UgIlZhcHN0YWZmIiBhbmQgIlZBUFNUQUZGIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGVyZSBpcyBubyBtYXBwaW5ncyBpbiB0aGUgT3V0bGluZSBhbmQgT3ZlcnZpZXcgdmlld3MgdGhhdAotcmVmZXJlbmNlIGEgbnVsbCBvYmplY3QuPC9saT4KLQotPGxpPgotU2VsZWN0ICJFZGl0L1VuZG8gUmVtb3ZlIiBmcm9tIHRoZSBtZW51IGJhci48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgRUpCICJWYXBzdGFmZiIgcmVhcHBlYXJzIGFuZCBhbGwgdGhlIG1hcHBpbmdzIGJldHdlZW4gIlZhcHN0YWZmIgotYW5kICJWQVBTVEFGRiIgYWxzbyByZWFwcGVhci48L2xpPgotPC9vbD4KLQotPGxpPgotQ2hhbmdlIHRoZSBuYW1lIG9mIGFuIEVKQi48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotT3BlbiB0aGUgUHJvcGVydGllcyB2aWV3IGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW4gYnkgc2VsZWN0aW5nICJQZXJzcGVjdGl2ZS9TaG93Ci1WaWV3L1Byb3BlcnRpZXMiLjwvbGk+Ci0KLTxsaT4KLVNlbGVjdCAiVmFwc3RhZmYiIGluIHRoZSBFSkJzIHZpZXcuPC9saT4KLQotPGxpPgotQ2xpY2sgb24gdGhlIHZhbHVlIGZpZWxkIG9mIHRoZSBwcm9wZXJ0eSAiTmFtZSIsIGkuZS4gdGhlIHN0cmluZyAiVmFwc3RhZmYiLgotVGhpcyBzaG91bGQgZW5hYmxlIGVkaXRpbmcgb2YgdGhlIGNlbGwuPC9saT4KLQotPGxpPgotQ2hhbmdlIHRoZSBzdHJpbmcgdG8gIlZhcHN0YWZmMiIuIEhpdCB0aGUgZW50ZXIga2V5LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0ICJWYXBzdGFmZiIgaXMgbm93IGNoYW5nZWQgdG8gIlZhcHN0YWZmMiIgaW4gdGhlIEVKQnMgdmlldyBhcwotd2VsbCBhcyBpbiB0aGUgT3ZlcnZpZXcgYW5kIE91dGxpbmUgdmlld3MuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLUNoYW5nZSBwcm9wZXJ0aWVzIG9mIGFuIEVKQiBhdHRyaWJ1dGUuPC9saT4KLQotPG9sIFRZUEU9YT4KLTxsaT4KLVNlbGVjdCB0aGUgInNhbGFyeSIgYXR0cmlidXRlIG9mICJWYXBzdGFmZjIiLjwvbGk+Ci0KLTxsaT4KLUdvIHRvIHRoZSBQcm9wZXJ0aWVzIHZpZXcgYW5kIGNoYW5nZSB0aGUgbmFtZSB0byAic2FsYXJ5MiIuPC9saT4KLQotPGxpPgotSGl0IHRoZSByZXR1cm4ga2V5IGFuZCB2ZXJpZnkgdGhhdCAic2FsYXJ5IiBpcyBjaGFuZ2VkIHRvICJzYWxhcnkyIiBldmVyeXdoZXJlLjwvbGk+Ci0KLTxsaT4KLUNsaWNrIG9uIHRoZSB2YWx1ZSBmaWVsZCBmb3IgIlR5cGUiIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuIFRoZSBmaWVsZCBzaG91bGQKLXR1cm4gaW50byBhIGNvbWJvIGJveCB3aXRoIGEgYnV0dG9uIG9uIHRoZSByaWdodC48L2xpPgotCi08bGk+Ci1DbGljayBvbiB0aGUgYnV0dG9uIHRvIHJldmVhbCB0aGUgbGlzdCBvZiBwb3NzaWJsZSB0eXBlcy4gU2VsZWN0IGEgZGlmZmVyZW50Ci10eXBlLCBzYXksICJqYXZhLmxhbmcuSW50ZWdlciIuPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIHR5cGUgb2YgdGhlICJzYWxhcnkyIiBpcyBjaGFuZ2VkIGluIGFsbCB0aGUgdmFyaW91cyB2aWV3cy48L2xpPgotPC9vbD4KLQotPGxpPgotT3JkZXIgb2YgRUpCcyBjYW4gYmUgcmUtYXJyYW5nZWQgYnkgZHJhZy1hbmQtZHJvcC48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IHRoZSBFSkIgIlZhcHN0YWZmMiIgaW4gdGhlIEVKQnMgdmlldy48L2xpPgotCi08bGk+Ci1Ib2xkIGRvd24gdGhlIGxlZnQgbW91c2UgYnV0dG9uIGFuZCBkcmFnIHRoZSBpdGVtIGF3YXkgZnJvbSBpdHMgbG9jYXRpb24uCi1BIGhvcml6b250YWwgbGluZSBzaG91bGQgYXBwZWFyIGFzIGFuIGluZGljYXRpb24gdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUKLWRyYWdnZWQgaXRlbS4gTW92ZSB0aGUgbW91c2UgdXB3YXJkcyB1bnRpbCB0aGUgbGluZSBpbmRpY2F0ZSB0aGF0ICJWYXBzdGFmZjIiCi13aWxsIGJlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBlamItamFyLiBSZWxlYXNlIHRoZSBtb3VzZSBidXR0b24uPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgIlZhcHN0YWZmMiIgaXMgbm93IHRoZSBmaXJzdCBFSkIgaW4gdGhlIGVqYi1qYXIuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLUVKQnMgY2FuIGJlIG1hZGUgc3VidHlwZXMgYnkgZHJhZy1hbmQtZHJvcC48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IHRoZSBFSkIgIlZhcHN0YWZmMiIgaW4gdGhlIEVKQnMgdmlldy48L2xpPgotCi08bGk+Ci1Ib2xkIGRvd24gdGhlIGxlZnQgbW91c2UgYnV0dG9uIGFuZCBkcmFnIGFuZCBkcm9wIGl0IG9udG8gRUpCICJWYXBzdHVkZW50Ii48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCAiVmFwc3RhZmYyIiBpcyBub3cgYW4gdW5tYXBwZWQgc3VidHlwZSBvZiAiVmFwc3R1ZGVudCIuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBEYXRhYmFzZSBjYW5ub3QgYmUgY2hhbmdlZC48L2xpPgotCi08b2wgVFlQRT1hPgotPGxpPgotU2VsZWN0IFRhYmxlICJWQVBTVEFGRiIuIENsaWNrIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBhbmQgZHJhZyB0aGUgaXRlbQotYXdheSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uLjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IG5vIGhvcml6b250YWwgbGluZSBhcHBlYXJzIGFuZCB0aGUgb3JkZXIgb2YgdGhlIHRhYmxlcyBjYW5ub3QKLWJlIGNoYW5nZWQuPC9saT4KLTwvb2w+Ci08L29sPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Ntb2tlL3NsaXBwZXJ5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2Uvc2xpcHBlcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2VmNGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2Uvc2xpcHBlcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zbW9rZS9zbW9rZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zbW9rZS9zbW9rZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNlMTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc21va2Uvc21va2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJMb3R1cyBXb3JkIFBybyI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NCBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+Qm9keTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLQotPGgyPgotSjJFRSAoRUpCKSBTbW9rZSBUZXN0PC9oMj4KLQotPG9sPgotPGxpPgotT3BlbiBhbiBlbXB0eSB3b3JrYmVuY2guPC9saT4KLQotPGxpPgotU3dpdGNoIHRvIHRoZSBKMkVFIHBlcnNwZWN0aXZlOiBQZXJzcGVjdGl2ZS0+T3Blbi0+T3RoZXItPkoyRUU8L2xpPgotCi08b2w+Ci08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgSjJFRSB0b29sYmFyIGFjdGlvbnMgYXBwZWFyIChjcmVhdGUgYW4gRUpCLCBjcmVhdGUgYSBTZXJ2bGV0LAotY3JlYXRlIGFuIEVKQiBwcm9qZWN0LCBjcmVhdGUgYW4gQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSwgY3JlYXRlIGEgV2ViCi1Qcm9qZWN0LCBjcmVhdGUgRUpCIHRvIFJEQiBtYXBwaW5nLCBjcmVhdGUgYW5kIEVudGVycHJpc2UgQXBwbGljYXRpb24pPC9saT4KLQotPGxpPgotVmVyaWZ5IHRoYXQgdGhlIEoyRUUgdmlldyBhcHBlYXJzIGluIHRoZSBuYXZpZ2F0b3IgZnJhbWUuIEl0IHdpbGwgcHJvYmFibHkKLWJlIGVtcHR5LjwvbGk+Ci0KLTxsaT4KLVZlcmlmeSB0aGF0IHRoZSBhcHByb3ByaWF0ZSBOZXcgbWVudSBpdGVtcyBhcmUgdmlzaWJsZSwgdGhlc2UgYXJlIHRoZSBwcm9qZWN0Ci1hY3Rpb25zIGZyb20gdGhlIHRvb2xiYXIsIHBsdXMgY3JlYXRlIGEgbmV3IEVKQiBleGFtcGxlPC9saT4KLTwvb2w+Ci0KLTxsaT4KLUNyZWF0ZSBhIG5ldyBFSkIgcHJvamVjdCBmb3IgdGVzdGluZyBFSkIgY3JlYXRpb24uIFByZXNzIHRoZSAiTmV3IEVKQiBQcm9qZWN0IgotdG9vbGJhciBidXR0b24uIENhbGwgdGhlIHByb2plY3QgIlRlc3RFSkJzIiwgdXNlIHRoZSBkZWZhdWx0IGxvY2F0aW9uLAotY2hlY2sgdGhlICJBZGQgdG8gYW4gRUFSIiBvcHRpb24gYW5kIGNhbGwgdGhlIGVhciAiZGVmYXVsdF9lYXIiLjwvbGk+Ci0KLTxvbD4KLTxsaT4KLVZlcmlmeSB0aGF0IGEgbmV3IEVKQiBwcm9qZWN0IGNhbGxlZCAiVGVzdEVKQnMiIGlzIGNyZWF0ZWQuPC9saT4KLQotPG9sPgotPGxpPgotVGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHNob3VsZCBhcHBlYXIgaW4gdGhlIEoyRUUgdmlldyBpbiB0aGUgRUpCIE1vZHVsZXMKLWZvbGRlci4gKDE3NTkxNiAtIHRoZSBtb2R1bGUgZG9lcyBub3QgYXBwZWFyIHVudGlsIGl0IGNvbnRhaW5zIGF0IGxlYXN0Ci1vbmUgRUpCLik8L2xpPgotPC9vbD4KLQotPGxpPgotVmVyaWZ5IHRoYXQgYSBuZXcgRUFSIHByb2plY3QgY2FsbGVkICJkZWZhdWx0X2FwcCIgaXMgY3JlYXRlZC48L2xpPgotCi08b2w+Ci08bGk+Ci1UaGUgY29ycmVzcG9uZGluZyBtb2R1bGUgc2hvdWxkIGFwcGVhciBpbiB0aGUgSjJFRSB2aWV3IGluIHRoZSBFbnRlcnByaXNlCi1BcHBsaWNhdGlvbnMgZm9sZGVyLiBJdCBzaG91bGQgY29udGFpbiB0aGUgbmVzdGVkIEVKQiBtb2R1bGUuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLU9wZW4gImRlZmF1bHRfYXBwIiBieSBkb3VibGUtY2xpY2tpbmcgaW4gdGhlIEoyRUUgdmlldy4gVGhlIEVBUiBlZGl0b3IKLXNob3VsZCBiZSBvcGVuZWQuIFZlcmlmeSB0aGF0IHRoZSBhcHBsaWNhdGlvbi54bWwgc291cmNlIGxvb2tzIGdvb2QgaW4KLXRoZSBzb3VyY2UgcGFnZS48L2xpPgotCi08bGk+Ci1Nb2RpZnkgdGhlIG1vZHVsZSBkaXNwbGF5IG5hbWUgaW4gdGhlIHNvdXJjZSBwYWdlLCBzd2l0Y2ggdG8gdGhlIEdlbmVyYWwKLXBhZ2UgYW5kIHZlcmlmeSB0aGF0IHRoZSBjaGFuZ2UgaXMgcmVmbGVjdGVkLiBWZXJpZnkgdGhhdCBzYXZlIGlzIGVuYWJsZWQKLWZvciB0aGUgYXBwbGljYXRpb24ueG1sLiBTYXZlIGFuZCBjbG9zZSB0aGUgZWRpdG9yLiBSZS1vcGVuIHRoZSBlZGl0b3IKLWFuZCB2ZXJpZnkgdGhlIGRlc2NyaXB0aW9uIGNoYW5nZS48L2xpPgotCi08bGk+Ci1Nb2RpZnkgdGhlIGRpc3BsYXkgbmFtZSBvbiB0aGUgZ2VuZXJhbCBwYWdlLCBhbmQgdmVyaWZ5IGl0IGluIHRoZSBzb3VyY2UKLXBhZ2UuIFNhdmUgc2hvdWxkIGJlIGVuYWJsZWQsIGFuZCB0aGUgcmVzb3VyY2UgdGFiIHNob3VsZCBiZSBtYXJrZWQgZGlydHkKLSh3aXRoIGEgIioiKS48L2xpPgotPC9vbD4KLQotPGxpPgotQWRkIGEgbmV3IHNlc3Npb24gYmVhbiB0byB0aGUgRUpCIG1vZHVsZS48L2xpPgotCi08b2w+Ci08bGk+Ci1QcmVzcyB0aGUgQ3JlYXRlIGFuIEVudGVycHJpc2UgSmF2YSBCZWFuIHRvb2xiYXIgYnV0dG9uLiZuYnNwOyBUaGlzIHdpbGwKLWxhdW5jaCB0aGUgbmV3IEVudGVycHJpc2UgSmF2YSBCZWFuIHdpemFyZC4mbmJzcDsgTmFtZSB0aGUgYmVhbiAiSGVsbG8iLAotc2VsZWN0ICJTZXNzaW9uIGJlYW4iIGFzIHRoZSBFSkIgdHlwZS4mbmJzcDsgVmVyaWZ5IHRoYXQgdGhlIHRhcmdldCBwcm9qZWN0Ci1pcyBhbHJlYWR5IHNlbGVjdGVkLjwvbGk+Ci0KLTxicj48aW1nIFNSQz0iY29uc3RydWN0aW9uMy5naWYiIGhlaWdodD00MyB3aWR0aD00OT4oMTc1ODQ1KSBQcm9qZWN0IHNlbGVjdGlvbgotaXMgbm90IGJlaW5nIHBpY2tlZCB1cCBmcm9tIHRoZSBKMkVFIHZpZXcsIHNvIHlvdSdsbCBuZWVkIHRvIG1hbnVhbGx5IHNlbGVjdAotdGhlIHByb2plY3QgZm9yIG5vdy4KLTxsaT4KLVByb3ZpZGUgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGJ5IGVudGVyaW5nICJ0ZXN0aW5nIgotaW50byB0aGUgZmlyc3QgcGFja2FnZSBuYW1lIGZpZWxkLiZuYnNwOyBWZXJpZnkgdGhhdCBpdCBwcm9wb2dhdGVzIHRvIHRoZQotb3RoZXIgZmllbGRzLjwvbGk+Ci0KLTxsaT4KLVByZXNzIEZpbmlzaCB0byBnZW5lcmF0ZSB0aGUgU2Vzc2lvbiBiZWFuIGNsYXNzZXMuPC9saT4KLQotPGxpPgotT3BlbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZTogUGVyc3BlY3RpdmUtPk9wZW4gUGVyc3BlY3RpdmUtPk90aGVyLi4uLT5KYXZhLjwvbGk+Ci0KLTxicj48aW1nIFNSQz0iZGV0b3VyLmdpZiIgaGVpZ2h0PTIxIHdpZHRoPTY4IGFsaWduPUFCU0NFTlRFUj4gRm9yIG5vdyB0aGlzCi1oYXMgdG8gYmUgZG9uZSBpbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZSwgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdpbGwgYXBwZWFyCi1pbiB0aGUgSjJFRSB2aWV3IHVuZGVyIHRoZSBFSkIgd2hlbiAxNzU2MDggaXMgaW1wbGVtZW50ZWQuCi08b2w+Ci08bGk+Ci1JbiB0aGUgcGFja2FnZSB2aWV3LCB2ZXJpZnkgdGhhdCB0aGUgcGFja2FnZSAidGVzdGluZyIgYXBwZWFycyB1bmRlciAiVGVzdEVKQnNcZWpiTW9kdWxlIi48L2xpPgotCi08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgZmlsZXMgaGVsbG8uamF2YSwgaGVsbG9iZWFuLmphdmEsIGFuZCBoZWxsb2hvbWUuamF2YSBleGlzdC48L2xpPgotCi08bGk+Ci1Td2l0Y2ggdG8gdGhlIEoyRUUgdmlldywgdGhlIG5ldyBFSkIgc2hvdWxkIGFwcGVhciB1bmRlciB0aGUgIlRlc3RfRUpCIgotbW9kdWxlIGluICJFSkIgTW9kdWxlcyIuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLUFkZCBhIHRlc3QgbWV0aG9kIHRvIEhlbGxvLiZuYnNwOyBPcGVuIHRoZSBqYXZhIGVkaXRvciBvbiBoZWxsb2JlYW4uamF2YQotYnkgZG91YmxlLWNsaWNraW5nIG9uIGl0LiZuYnNwOyBBZGQgYSBuZXcgbWV0aG9kIFN0cmluZyBzYXlIZWxsbyhTdHJpbmcpCi11c2luZyB0aGUgSmF2YSB0b29saW5nIGxpa2Ugc286PC9saT4KLQotPGJyPiZuYnNwOyZuYnNwOyBwdWJsaWMgU3RyaW5nIHNheUhlbGxvKFN0cmluZyBtZXNzYWdlKSB7Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiAiSGVsbG8sICIgKyBtZXNzYWdlICsgIiEiOwotPGJyPiZuYnNwOyZuYnNwOyB9Ci08bGk+Ci1BZGQgdGhlIG1ldGhvZCB0byB0aGUgcmVtb3RlIGludGVyZmFjZS48L2xpPgotCi08YnI+PGltZyBTUkM9ImRldG91ci5naWYiIGhlaWdodD0yMSB3aWR0aD02OCBhbGlnbj1BQlNDRU5URVI+IFRoaXMgaXMgY3VycmVudGx5Ci1kb25lIG1hbnVhbGx5LCBieSBjb3B5aW5nIGFuZCBwYXN0aW5nIHRoZSBtZXRob2QgaW50byB0aGUgcmVtb3RlIGludGVyZmFjZS4mbmJzcDsKLVRoZSBtZXRob2QgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugc2hvdWxkIGFwcGVhciBsaWtlIHRoaXM6Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBTdHJpbmcgc2F5SGVsbG8oU3RyaW5nCi1tZXNzYWdlKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotPGJyPlVzZSBjb2RlIGFzc2lzdCwgY3RybC1TcGFjZSB0byBsb29rdXAgUmVtb3RlRXhjZXB0aW9uLCB0byB2ZXJpZnkgdGhhdAotdGhlIHByb2plY3QncyBKYXZhIGVudmlyb25tZW50IGlzIHdvcmtpbmcgcHJvcGVybHkuCi08YnI+V2hlbiAxNzU2MTAgaXMgY29tcGxldGVkLCB0aGVyZSB3aWxsIGJlIGEgIlByb21vdGUgdG8gcmVtb3RlIGludGVyZmFjZSIKLW1lbnUgaXRlbSBhdmFpbGFibGUgb24gdGhlIHNwZWNpYWxpemVkIEJlYW4gY2xhc3MgSmF2YSBlZGl0b3Igd2hpY2ggd2lsbAotZG8gdGhpcyBmb3IgeW91Ljwvb2w+Ci0KLTxsaT4KLU9wZW4gdGhlIEVKQiBlZGl0b3IgZm9yICJUZXN0RUpCcyIgYnkgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBtb2R1bGUgdW5kZXIKLSJFSkIgTW9kdWxlcyI8L2xpPgotCi08b2w+Ci08bGk+Ci1UaGUgRUpCIGVkaXRvciBzaG91bGQgYmUgb3BlbmVkLiBWZXJpZnkgdGhhdCB0aGUgc291cmNlIGZvciB0aGUgZWpiLWphcgotbG9va3MgcmVhc29uYWJsZS48L2xpPgotCi08YnI+PGltZyBTUkM9ImNvbnN0cnVjdGlvbjMuZ2lmIiBoZWlnaHQ9NDMgd2lkdGg9NDkgYWxpZ249VEVYVFRPUD4oMTc1ODE3KQotT25jZSB3ZSBnZXQgb3VyIERURCdzIHJlZ2lzdGVyZWQsIGFkZCBhIHN0ZXAgdG8gdXNlIGNvZGUtYXNzaXN0IGluIHRoZQotc291cmNlIHBhZ2UuCi08b2w+Ci08bGk+Ci1WZXJpZnkgdGhhdCB0aGUgRUpCIGVkaXRvciBpcyB3b3JraW5nIHByb3Blcmx5LiZuYnNwOyBFZGl0IHRoZSBkaXNwbGF5Ci1uYW1lIGZpZWxkLiZuYnNwOyBXaGVuIHlvdSB0YWIgb3V0IG9mIHRoYXQgZmllbGQsIHRoZSBkaXNwbGF5IG5hbWUgaW4gdGhlCi1KMkVFIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuJm5ic3A7IFNpdGNoIHRvIHRoZSBzb3VyY2UgcGFnZSBhbmQgdmVyaWZ5Ci10aGF0IHRoZSBYTUwgaXMgYWxzbyB1cGRhdGVkLjwvbGk+Ci0KLTxicj5WZXJpZnkgdGhhdCBzb3VyY2UgY2hhbmdlcyBmbG93IHRvIHRoZSBnZW5lcmFsIHBhZ2UsIHRvby4mbmJzcDsgSW4KLXRoZSBzb3VyY2UgcGFnZSwgY29weSBhbmQgcGFzdGUgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGZyb20gdGhlIEpBUiB0bwotdGhlIEhlbGxvIGVudGl0eS4mbmJzcDsgVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQKLXVuZGVyICZsdDtzZXNzaW9uPi4mbmJzcDsgU3dpdGNoIHRvIHRoZSBnZW5lcmFsIHRhYiwgc2VsZWN0IEhlbGxvIGluIHRoZQotRW50ZXJwcmlzZSBCZWFucyBsaXN0LCBhbmQgdmVyaWZ5IHRoZSBkaXNwbGF5IG5hbWUgeW91IGVudGVyZWQuPC9vbD4KLTwvb2w+Ci0KLTxsaT4KLUdlbmVyYXRlIERlcGxveWVkIGNvZGUgZm9yIEhlbGxvLiZuYnNwOyBTZWxlY3QgdGhlIHByb2plY3QgVGVzdEVKQnMsIHBvcC11cAotR2VuZXJhdGUgZm9yIGVudGVycHJpc2UgYmVhbnMuLi4tPkdlbmVyYXRlIGRlcGxveWVkIGNvZGUuJm5ic3A7IE1ha2Ugc3VyZQotSGVsbG8gaXMgY2hlY2tlZCBvbiB0aGUgcHJvbXB0ZXIsIGFuZCBoaXQgZmluaXNoLjwvbGk+Ci0KLTxvbD4KLTxsaT4KLVN3aXRjaCB0byB0aGUgSmF2YSBwZXJzcGVjdGl2ZSwgYW5kIHZlcmlmeSB0aGF0IHRocmVlIG5ldyAuamF2YSBmaWxlcyB3ZXJlCi1nZW5lcmF0ZWQgYW5kIGRvIG5vdCBoYXZlIGNvbXBpbGUgZXJyb3JzLiZuYnNwOyBUaGV5IGFyZSBFSlNSZW1vdGVTdGF0ZWxlc3NIZWxsby5qYXZhLAotRUpCUmVtb3RlU3RhdGVsZXNzSGVsbG9Ib21lLmphdmEsIGFuZCBFSlNTdGF0ZWxlc3NIZWxsb0hvbWVCZWFuLmphdmEuPC9saT4KLTwvb2w+Ci0KLTxsaT4KLUdlbmVyYXRlIFJNSUMgY29kZSBmb3IgSGVsbG8uJm5ic3A7IFNlbGVjdCB0aGUgcHJvamVjdCBUZXN0RUpCcywgcG9wLXVwCi1HZW5lcmF0ZSBmb3IgZW50ZXJwcmlzZSBiZWFucy4uLi0+R2VuZXJhdGUgUk1JQyBzdHViIGFuZCB0aWUgY29kZS4mbmJzcDsKLU1ha2Ugc3VyZSBIZWxsbyBpcyBjaGVja2VkIG9uIHRoZSBwcm9tcHRlciwgYW5kIGhpdCBmaW5pc2guPC9saT4KLQotPG9sPgotPGxpPgotU3dpdGNoIHRvIHRoZSBKYXZhIHBlcnNwZWN0aXZlLCBhbmQgdmVyaWZ5IHRoYXQgYSB3aG9sZSBzbGV3IG9mIGluY29tcHJlaGVuc2libGUKLWNsYXNzZXMgd2VyZSBnZW5lcmF0ZWQgaW4gbXVsdGlwbGUgcGFja2FnZXMsIHNvbWUgb2Ygd2hpY2ggaGF2ZSBuYW1lcyBsaWtlCi1fSGVsbG9fU3R1Yi5qYXZhLCBhbmQgX0hlbGxvSG9tZV9zdHViLmphdmEuJm5ic3A7IENoZWNrIHRoZSB0YXNrIGxpc3QgYW5kCi1tYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvbXBpbGUgZXJyb3JzLiZuYnNwOyBFdmVuIGJldHRlciwgbWFrZSBzdXJlIHRoZQotY29ycmVzcG9uZGluZyAuY2xhc3MgZmlsZXMgZXhpc3QgaW4gXGJpblwuLi4uPC9saT4KLTwvb2w+Ci0KLTxsaT4KLTxpbWcgU1JDPSJzbGlwcGVyeS5naWYiIGhlaWdodD02NiB3aWR0aD03Nj5OZXh0LCB0ZXN0aW5nIHdpdGggdGhlIHVuaXQKLXRlc3QgZW52aXJvbm1lbnQuLi48L2xpPgotCi08b2w+Ci08bGk+Ci08L2xpPgotPC9vbD4KLTwvb2w+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyMmJjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjMzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmplZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4MTBmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6MzY6NDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc3NjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuamVlLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDIsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudCwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhlMTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy8zMF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy8zMF9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZjUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvMzBfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50XzUwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9hcHBjbGllbnRfNTAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhYjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9hcHBjbGllbnRfNTAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ODQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJfNTAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Vhcl81MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMGUzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Vhcl81MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWViM2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZGIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2J1c2luZXNzX2xvY2FsX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2J1c2luZXNzX2xvY2FsX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODc4MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19sb2NhbF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19yZW1vdGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvYnVzaW5lc3NfcmVtb3RlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTRlMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19yZW1vdGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvaG9tZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9ob21lX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmZlNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9ob21lX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2xvY2FsX2hvbWVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfaG9tZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfaG9tZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9sb2NhbF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9sb2NhbF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UxNjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvcmVtb3RlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL3JlbW90ZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM5Y2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvcmVtb3RlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViYXBwXzI1LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy93ZWJhcHBfMjUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4YzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy93ZWJhcHBfMjUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzMDE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LmplZS51aQotQnVuZGxlLU5hbWUuMCA9IFVpIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1jcmVhdGVfZGVwbG95X2ZpbGVzPUdlbmVyYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBTdHViCi1qMmVlPUphdmEgRUUKLWoyZWUuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSmF2YSBFRSBEZXZlbG9wbWVudAotRU5URVJQUklTRV9CRUFOX0RFQ09SQVRPUj1KYXZhIEVFIDUgRW50ZXJwcmlzZSBCZWFucyBhbmQgSW50ZXJmYWNlcyBEZWNvcmF0b3IKLUVOVEVSUFJJU0VfQkVBTl9ERUNPUkFUT1IuREVTQ1JJUFRJT049SmF2YSBFRSA1IEVudGVycHJpc2UgQmVhbnMgYXJlIGRlY29yYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZSBTZXNzaW9uL01lc3NhZ2UgRHJpdmVuL0VudGl0eS4gVGhlIHNhbWUgZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBCdXNpbmVzcyBhbmQgMi54IGludGVyZmFjZXMKLUpBVkFfRUVfNV9QUk9CTEVNX01BUktFUl9SRVNPVVJDRV9ERUNPUkFUT1I9SmF2YSBFRSA1IFByb2plY3QgUHJvYmxlbSBNYXJrZXIgUmVzb3VyY2UgRGVjb3JhdG9yCi1KQVZBX0VFXzVfUFJPQkxFTV9NQVJLRVJfUkVTT1VSQ0VfREVDT1JBVE9SLkRFU0NSSVBUSU9OPVJlc291cmNlIERlY29yYXRvciBlbmFibGVzIGVycm9yIG1hcmtlcnMgdG8gYmUgcHV0IG9uIHRoZSBwcm9qZWN0IG5vZGUuCi1qZWVQcm9qZWN0RGVjb3JhdG9yPUphdmEgRUUgNSBQcm9qZWN0IERlY29yYXRvcgotamVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbj1EZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIEphdmEgRUUgNSBwcm9qZWN0cyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjk4NTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyI+Ci0gICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImpzdC5lYXIjNS4wI2luc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldC5FYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotCi0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICAgIDwvZmFjdG9yeT4KLQotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+ICAgICAgIAotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4gCi0KLSAgIDwvZXh0ZW5zaW9uPiAgCi0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+IAotICAgICAgIDwvZmFjdG9yeT4KLQotCSAgIAk8ZmFjdG9yeQotCSAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0JICAgICAJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIj4KLQkgICAgIAk8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLQkJPC9mYWN0b3J5PgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotCSAgICAgCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIj4KLQkgICAgIAk8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLQkgICAJPC9mYWN0b3J5PgotCSAgIAkJCi0JCTxmYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLQkgICAgIAlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JICAgCTwvZmFjdG9yeT4JCi0JICAgCQotCSAgIAk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0JICAgICAJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JICAgCTwvZmFjdG9yeT4gICAgICAgCi0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gIAotICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVhcjEiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gCi0gICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lYXIyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIAk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjo1LjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgICAKLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lYXIzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIAk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjo1LjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWFyNCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx3aXRoCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICA8L2V4dGVuc2lvbj4KLQotCi0gPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5ldG9vbHMuc2VydmVyLmNvcmUubW9kdWxlT2JqZWN0QWRhcHRlcnMgLS0+Ci08IS0tIFB1cnBvc2U6IERlZmluZSBhZGFwdGVycyBmb3IgV2ViIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4gIAotICAgIAotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiAKLSAgICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2UyIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlMyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi41IiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gICAgIAotICAgICAgIAotICAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlNCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2U1IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi41IiAvPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHVycG9zZTogRGVmaW5lIGFkYXB0ZXJzIGZvciBFSkIgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lamIyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiMyIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiNCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYjozLjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiNSIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamI6My4wIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYjYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYjciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lamIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lamI6My4wIj4KLSAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVqYjc3Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHdpdGgKLSAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLkNyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYiCi0gICAgICAgICAgICAgICBpZD0iY3JlYXRlRGVwbG95bWVudEZpbGVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVjcmVhdGVfZGVwbG95X2ZpbGVzIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImphdmVlVUlQb3B1cE1lbnVDYXRlZ29yeS9zbG90MiI+Ci0JCTwvYWN0aW9uPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIAkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYjpbMy4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjpbMi41IiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjpbNS4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudDpbNS4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLSAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICA8L2luc3RhbmNlb2Y+Ci0JCSAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PiAgICAgICAgIAkJICAgCQkKLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9InNob3dfZGVwX3Byb3BfcGFnZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLk1vZHVsZXNOb2RlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuU2hvd0RlcFByb3BQYWdlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJzaG93X2RlcF9wcm9wX3BhZ2UiCi0gICAgICAgICAgICAgICBsYWJlbD0iQWRkL1JlbW92ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5DcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0iamF2YS5sYW5nLk9iamVjdCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5DcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmIgotICAgICAgICAgICAgICAgaWQ9ImNyZWF0ZURlcGxveW1lbnRGaWxlcyIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlY3JlYXRlX2RlcGxveV9maWxlcyI+Ci0JCTwvYWN0aW9uPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudC5Hcm91cEFwcENsaWVudFByb3ZpZGVyIj4KLSAgICAgIDwvaW5zdGFuY2VvZj4KLQkJICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+ICAgICAgICAgCQkgICAJCQotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkIj4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5CIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQSIvPgotIAotIAk8L2V4dGVuc2lvbj4KLSAgICAtLT4KLSAgICA8ZXh0ZW5zaW9uICAKLQkgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0gICA8bmF2aWdhdG9yQ29udGVudAotICAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5FamIzQ29udGVudFByb3ZpZGVyIgotICAgICAgICAgaWNvbj0iaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmVqYiIKLSAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkVqYjNMYWJlbFByb3ZpZGVyIgotICAgICAgICAgbmFtZT0iSkVFIE5hdmlnYXRvciBDb250ZW50IEVKQiIKLSAgICAgICAgIHByaW9yaXR5PSJoaWdoZXN0Ij4KLSAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiOjMuMCIvPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuYXBwY2xpZW50OjUuMCI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgPC9hZGFwdD4KLQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSIgLz4KLQkJIAk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIiAvPgotICAJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdCIgLz4KLSAgIDxpbnN0YW5jZW9mCi0gICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgIDwvaW5zdGFuY2VvZj4KLSAgIDxpbnN0YW5jZW9mCi0gICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICA8b3I+Ci0JCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiIC8+Ci0JCSAJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSIgLz4KLSAgCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiIC8+Ci0gICA8aW5zdGFuY2VvZgotICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvcG9zc2libGVDaGlsZHJlbj4KLSAgICAKLQotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRTZXNzaW9uQmVhbldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVqYlNlc3Npb24iPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSI+Ci0gICAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5iZWFuVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImlzU2Vzc2lvbkJlYW4iPgotICAgICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkFkZE1lc3NhZ2VEcml2ZW5CZWFuV2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRWpiTWVzc2FnZURyaXZlbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIj4KLSAgICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmJlYW5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iaXNNZXNzYWdlRHJpdmVuQmVhbiI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAKLSAgICAgCi0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSkVFQWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLnVpLkpFRUFjdGlvblByb3ZpZGVyIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIi8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZSIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdCIgLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuYXBwY2xpZW50Lkdyb3VwQXBwQ2xpZW50UHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgCi0KLSAgICAgPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuSkVFTmV3QWN0aW9ucyI+Ci0JCQk8ZW5hYmxlbWVudD4KLSAgICA8b3I+Ci0gICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiPgotICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgIDwvaW5zdGFuY2VvZj4KLQotICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICA8L2luc3RhbmNlb2Y+PC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAKLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuUmVzb3VyY2VNZ210QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFUmVzb3VyY2VNZ210QWN0aW9uIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotCi0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuV29ya01hbmFnZW1lbnRBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVXb3JrTWdtdEFjdGlvbiI+Ci0gICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLQotCQkgICAgICAgPGluc3RhbmNlb2YKLQkJICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLQkJICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgPC9hZGFwdD4KLQotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlBvcnRpbmdBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVQb3J0aW5nQWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotCi0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi5leHBvcnQxIgotICAgICAgICAgICB0eXBlPSJleHBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRFeHBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIAkgCi0gICAgIAkgCi0gIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgCi0gIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuV2ViMjVDb250ZW50UHJvdmlkZXIiCi0gICAgICAgIGljb249Imljb25zL3dlYmdyb3VwX29iai5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLndlYiIKLSAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuV2ViMjVMYWJlbFByb3ZpZGVyIgotICAgICAgICBuYW1lPSJKRUUgTmF2aWdhdG9yIENvbnRlbnQgV0VCIgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0gICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LndlYjoyLjUiLz4KLSAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgIDxpbnN0YW5jZW9mCi0gICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgIDwvaW5zdGFuY2VvZj4KLSAgIDxpbnN0YW5jZW9mCi0gICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC90cmlnZ2VyUG9pbnRzPgotICAgICA8cG9zc2libGVDaGlsZHJlbj4KLSAgICAgICAgPG9yPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFydGlmYWN0Tm9kZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgotICAgICAKLSAgICAgCi0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlJlc291cmNlTWdtdEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVdlYlJlc291cmNlTWdtdEFjdGlvbiI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuQWJzdHJhY3RTdWJXZWJQcm92aWRlcnMiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDwhLS08aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPi0tPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLldvcmtNYW5hZ2VtZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFV2ViV3JrTW5nbW50QWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLQotCQkgICAgICAgPGluc3RhbmNlb2YKLQkJICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLQkJICAgICAgIDwvaW5zdGFuY2VvZj4KLQotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlBvcnRpbmdBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVXZWJQb3J0aW5nQWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPi0tPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIAotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYmNsYXNzIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmciPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+PC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJjbGFzcyIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZEZpbHRlcldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmciPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPjwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLmV4cG9ydCIKLSAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkVhcjVDb250ZW50UHJvdmlkZXIiCi0gICAgICAgIGljb249Imljb25zL2Vhcmdyb3VwX29iai5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmVhciIKLSAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuRWFyNUxhYmVsUHJvdmlkZXIiCi0gICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBFQVIiCi0gICAgICAgIHByaW9yaXR5PSJoaWdoZXN0Ij4KLSAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWROb2RlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWFyOjUuMCI+Ci0gICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Nb2R1bGVzTm9kZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5CdW5kbGVkTGlic05vZGUiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEuaW8uRmlsZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3Qud2ViIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QudXRpbGl0eSI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVhciI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudCI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmNvbm5lY3RvciI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Nb2R1bGVzTm9kZSIvPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWROb2RlIi8+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5GaWxlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdCI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlByb2plY3QiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgIDxjb21tb25Tb3J0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlciI+Ci0gICAgIDwvY29tbW9uU29ydGVyPgotICAgICA8ZHJvcEFzc2lzdGFudAotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZG5kLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLm5hdmlnYXRvci51aS5BZGRNb2R1bGVzVG9FQVIiPgotICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWFyIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BYnN0cmFjdEVhck5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9wb3NzaWJsZURyb3BUYXJnZXRzPgotICAgICA8L2Ryb3BBc3Npc3RhbnQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkucHJvamVjdC5mYWNldC5FamJQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudC5BcHBDbGllbnRQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aSIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5leHBvcnQiCi0gICAgICAgICAgIHR5cGU9ImV4cG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmltcG9ydCIKLSAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5pbXBvcnQiCi0gICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldyI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmltcG9ydCIKLSAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFwcENsaWVudDVDb250ZW50UHJvdmlkZXIiCi0gICAgICAgIGljb249Imljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmFwcGNsaWVudCIKLSAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIiCi0gICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBBcHAgQ2xpZW50IgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0gICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudDo1LjAiPgotICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5hcHBjbGllbnQ6NS4wIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLQk8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgCi0gICAgCi0gICAgPGZhY3RvcnkKLSAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUVNRkFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckFjdGlvbkJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGFjdGlvbkV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLnVpLkpFRUFjdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgPC92aWV3ZXJBY3Rpb25CaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX1JJR0hUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iJUVOVEVSUFJJU0VfQkVBTl9ERUNPUkFUT1IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkRlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkRlY29yYXRvciI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGUiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRU5URVJQUklTRV9CRUFOX0RFQ09SQVRPUi5ERVNDUklQVElPTgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+ICAKLSAgICAgIDxleHRlbnNpb24KLSAgIAkJIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIj4KLSAgICAgIDx2aWV3ZXJDb250ZW50QmluZGluZwotICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLioiLz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5maWx0ZXJzLioiLz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KLSAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuKiI+Ci0gICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBMYWJlbCBEZWNvcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iJWplZVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSkVFUHJvamVjdERlY29yYXRvciI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ii8+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlamVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFWQV9FRV81X1BST0JMRU1fTUFSS0VSX1JFU09VUkNFX0RFQ09SQVRPUiIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC51aS5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUubmF2aWdhdG9yLnVpLmphdmEucmVzb3VyY2UuZGVjb3JhdG9yIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4gCi0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlSkFWQV9FRV81X1BST0JMRU1fTUFSS0VSX1JFU09VUkNFX0RFQ09SQVRPUi5ERVNDUklQVElPTgotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlUHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5CZWFuTm9kZVByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIgotICAgICAgICAgICAgcHJvcGVydGllcz0iYmVhblR5cGUiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAKLSAgICAgIAotICAgICAgCi0gICA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9DcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL0NyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZDQxZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL0NyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIHJhbWFuZGF5Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgYVNlbGVjdGlvbik7Ci0JCWJvb2xlYW4gaXNFbmFibGVkID0gZmFsc2U7Ci0JCWlmIChhU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFTZWxlY3Rpb247Ci0JCQlpc0VuYWJsZWQgPSBpc1ZhbGlkU2VsZWN0aW9uKGdldFByb2plY3RGcm9tU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pLCBudWxsKTsKLQkJfQotCQlzZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JfQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbil7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpewotCQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoSUFkYXB0YWJsZS5jbGFzcy5pc0luc3RhbmNlKGZpcnN0RWxlbWVudCkpewotCQkJCXJldHVybiAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZmlyc3RFbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTaGVsbCBzaGVsbCkgewotCQlyZXR1cm4gKHByb2plY3QgIT0gbnVsbAotCQkJCSYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChwcm9qZWN0KQotCQkJCSYmICFoYXNEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBzaGVsbCkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbmZvcm1JbnZhbGlkU2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmZvcm1JbnZhbGlkU2VsZWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBNZXNzYWdlcy5JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTl9USVRMRSwKLQkJCQlNZXNzYWdlcy5JTkZPUk1fSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT04pOyAgCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0RlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIFNoZWxsIHNoZWxsKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJSVBhdGggZGRGaWxlUGF0aCA9IG51bGw7Ci0JCWlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRkRmlsZVBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRkRmlsZVBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSAhPSBudWxsCi0JCQkJJiYgY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkgIT0gbnVsbCl7Ci0JCQlJRmlsZSBkZFhtbEZpbGUgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRGaWxlKGRkRmlsZVBhdGgpOwotCQkJcmV0ID0gZGRYbWxGaWxlLmV4aXN0cygpOwotCQkJaWYoc2hlbGwgIT0gbnVsbCAmJiByZXQpCi0JCQkJaW5mb3JtSW52YWxpZFNlbGVjdGlvbihzaGVsbCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCS8qCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJaWYgKCF2YWxpZGF0ZVNlbGVjdGlvbihwcm9qZWN0LCBzaGVsbCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlnZXREYXRhTW9kZWwocHJvamVjdCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGdldERhdGFNb2RlbChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUNsYXNzIGRhdGFNb2RlbENsYXNzID0gbnVsbDsKLQkJaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRhdGFNb2RlbENsYXNzID0gSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M7Ci0JCX0gZWxzZSBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkpewotCQkJZGF0YU1vZGVsQ2xhc3MgPSBJRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzczsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewotCQkJZGF0YU1vZGVsQ2xhc3MgPSBJV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzczsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRhdGFNb2RlbENsYXNzID0gSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M7Ci0JCX0KLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChkYXRhTW9kZWxDbGFzcyk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUFJPSkVDVCwgcHJvamVjdCk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTaGVsbCBzaGVsbCkgewotCQlib29sZWFuIHZhbGlkU2VsZWN0aW9uID0gdHJ1ZTsKLQkJaWYgKCFpc1ZhbGlkU2VsZWN0aW9uKHByb2plY3QsIHNoZWxsKSkgewotCQkJdmFsaWRTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdmFsaWRTZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzMmFhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5GT1JNX0lOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVNTSU9OX0JFQU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9CRUFOUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0RSSVZFTl9CRUFOUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVEVSUFJJU0VfQkVBTl9DTEFTU19ERVNDUklQVElPTjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTElTVEVORVJfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGSUxURVJTX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRklMVEVSX01BUFBJTkdfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX01BUFBJTkdfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9QQUdFU19JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFTENPTUVfUEFHRVNfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05URVhUX1BBUkFNU19JVEVNX1BST1ZJREVSOwotCQotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRkVSRU5DRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVORExFRF9MSUJSQVJJRVNfTk9ERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMSUJSQVJZX0RJUkVDVE9SWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfTU9EVUxFU19OT0RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQkxPQ0FMX1JFRkVSRU5DRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCX1JFRkVSRU5DRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5WSVJPTUVOVF9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0VOVklST01FTlRfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9SRUZFUkVOQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9wcm9qZWN0XzBfY2Fubm90X2JlX2FjY2Vzc2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEpFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRKRUVNb2R1bGVEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9yZWNvZ25pemVfZXh0ZW5zaW9uXzBfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2RkNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLSAgICAgIHJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SUxhdW5jaGFibGUuY2xhc3N9OwotCX0KLQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3RbXSBnZXRNb2R1bGVBcnRpZmFjdHMoT2JqZWN0IG9iaikgewotCQkKLQkJIGlmIChvYmogaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikKLQkJCXJldHVybiBFSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3RzKChTZXNzaW9uQmVhbikgb2JqKTsKLQkJIElNb2R1bGVBcnRpZmFjdCBhcnRpZmFjdCA9IGdldE1vZHVsZUFydGlmYWN0KG9iaik7Ci0JCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IElNb2R1bGVBcnRpZmFjdFtdIHsgYXJ0aWZhY3QgfTsKLQkJIHJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1ZjU2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmludGVybmFsLmRlcGxveWFibGVzLkpFRUZsZXhQcm9qRGVwbG95YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRUpCQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5OdWxsTW9kdWxlQXJ0aWZhY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbCB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVKQkRlcGxveWFibGVPYmplY3RBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBFSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRUpCSmFyKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoRUpCSmFyKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKFNlc3Npb25CZWFuKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKE1lc3NhZ2VEcml2ZW5CZWFuKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFbnRpdHlCZWFuKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoRW50aXR5QmVhbikgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpIAotCQkJcmV0dXJuICBnZXRNb2R1bGVPYmplY3QoKElQcm9qZWN0KSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIAotCQkJcmV0dXJuICBnZXRNb2R1bGVPYmplY3QoKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChJRmlsZSkgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKElDb21waWxhdGlvblVuaXQpIG9iaik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSmF2YU9iamVjdChmaWxlKTsKLQkJCX0KLQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoRUpCSmFyIGVqYkphcikgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdCllamJKYXIpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoU2Vzc2lvbkJlYW4gZWpiKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWVqYik7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwLCBlamIuZ2V0RWpiTmFtZSgpLCBmYWxzZSwgZmFsc2UpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoRW50aXR5QmVhbiBlamIpIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpZWpiKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXAsIGVqYi5nZXRFamJOYW1lKCksIGZhbHNlLCBmYWxzZSk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChNZXNzYWdlRHJpdmVuQmVhbiBlamIpIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpZWpiKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXAsIGVqYi5nZXRFamJOYW1lKCksIGZhbHNlLCBmYWxzZSk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0W10gZ2V0TW9kdWxlT2JqZWN0cyhTZXNzaW9uQmVhbiBlamIpIHsKLQkJTGlzdCBtb2RBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWVqYik7Ci0JCUxpc3QgYnVzTG9jYWxzID0gZWpiLmdldEJ1c2luZXNzTG9jYWxzKCk7Ci0JCUxpc3QgYnVzUmVtb3RlcyA9IGVqYi5nZXRCdXNpbmVzc1JlbW90ZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJ1c0xvY2Fscy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJbW9kQXJ0aWZhY3RzLmFkZChjcmVhdGVNb2R1bGVPYmplY3RGb3JTZXNzaW9uQmVhbihkZXAsIGVqYi5nZXRFamJOYW1lKCksIGxvY2FsTmFtZSwgZmFsc2UsdHJ1ZSkpOwotCQkJCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJ1c1JlbW90ZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHJlbW90ZU5hbWUgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltb2RBcnRpZmFjdHMuYWRkKGNyZWF0ZU1vZHVsZU9iamVjdEZvclNlc3Npb25CZWFuKGRlcCwgZWpiLmdldEVqYk5hbWUoKSwgcmVtb3RlTmFtZSwgdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCQlyZXR1cm4gKElNb2R1bGVBcnRpZmFjdFtdKW1vZEFydGlmYWN0cy50b0FycmF5KG5ldyBJTW9kdWxlQXJ0aWZhY3RbbW9kQXJ0aWZhY3RzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkgewotCQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUocHJvamVjdCwgbnVsbCk7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSUZpbGUgZmlsZSkgewotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoIDw9IDApCi0JCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhmaWxlLmdldFByb2plY3QoKSkpIHsKLQkJCVN0cmluZyBleHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmICgiamF2YSIuZXF1YWxzKGV4dCkgfHwgImNsYXNzIi5lcXVhbHMoZXh0KSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIGdldE1vZHVsZUphdmFPYmplY3QoZmlsZSk7Ci0JCQlpZiAoZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpKQotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZ2V0TW9kdWxlKGZpbGUuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZWZPYmplY3QpOwotCQlSZXNvdXJjZSByZWZSZXNvdXJjZSA9IHJlZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZWNsaXBlU2VydlJlc29ydWNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZWZSZXNvdXJjZSk7Ci0JCQlyZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhlY2xpcGVTZXJ2UmVzb3J1Y2UpOwotCQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsKQotCQkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGdldE1vZHVsZShwcm9qLCBjb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKSkuaXRlcmF0b3IoKTsgIAotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IG51bGw7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLQkJCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0TW9kdWxlUHJvamVjdChwcm9qZWN0LCBpdGVyYXRvcik7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldE5hbWUoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUphdmFPYmplY3QoSUZpbGUgZmlsZSkgewotCi0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWZpbGUuZ2V0QWRhcHRlcihJVmlydHVhbENvbXBvbmVudC5jbGFzcyk7Ci0JCQkvLyBUT0RPIHdoYXQgZG8gd2UgcmV0dXJuIGZvciBKYXZhIGNsYXNzPwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBjcmVhdGVNb2R1bGVPYmplY3QoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBlamJOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCkgewotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBqbmRpTmFtZSA9IG51bGw7Ci0JCQlpZiAoZWpiTmFtZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlKRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSAoSkVFRmxleFByb2pEZXBsb3lhYmxlKW1vZHVsZS5nZXRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzKTsKLQkJCQlqbmRpTmFtZSA9IG1vZHVsZURlbGVnYXRlLmdldEpORElOYW1lKGVqYk5hbWUpOwotCQkJCXJldHVybiBuZXcgRUpCQmVhbihtb2R1bGUsIGpuZGlOYW1lLCByZW1vdGUsIGxvY2FsLEVKQkJlYW4uRUpCXzMwKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgTnVsbE1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgY3JlYXRlTW9kdWxlT2JqZWN0Rm9yU2Vzc2lvbkJlYW4oSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBlamJOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiByZW1vdGUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgam5kaU5hbWUgPSBudWxsOwotCQkJaWYgKGVqYk5hbWUgIT0gbnVsbCkgewotCQkJCW1vZHVsZS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSkVFRmxleFByb2pEZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gKEpFRUZsZXhQcm9qRGVwbG95YWJsZSltb2R1bGUuZ2V0QWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcyk7Ci0JCQkJam5kaU5hbWUgPSBtb2R1bGVEZWxlZ2F0ZS5nZXRKTkRJTmFtZShlamJOYW1lLCBpbnRlcmZhY2VOYW1lKTsKLQkJCQlyZXR1cm4gbmV3IEVKQkJlYW4obW9kdWxlLCBqbmRpTmFtZSwgcmVtb3RlLCBsb2NhbCxFSkJCZWFuLkVKQl8zMCwgaW50ZXJmYWNlTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE51bGxNb2R1bGVBcnRpZmFjdChtb2R1bGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDliNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTnVsbE1vZHVsZUFydGlmYWN0OwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIE9iamVjdCBhZGFwdGVyIGZvciBlYXIgcHJvamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVPYmplY3RBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVPYmplY3RBZGFwdGVyCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBvYmplY3QgZm9yIGEgdHlwZSBvZiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqIC0gT2JqZWN0IHRvIGFkYXB0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKEFwcGxpY2F0aW9uKSBvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChJUHJvamVjdCkgb2JqKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoSUZpbGUpIG9iaik7Ci0JCXJldHVybiBudWxsOwotCX0vLyBnZXREZXBsb3lhYmxlT2JqZWN0Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdCBmb3IgZWFyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBBcHBsaWNhdGlvbgotCSAqICAgICAgICAgICAgYXBwbGljYXRpb24gLSBFQVIgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWFwcGxpY2F0aW9uKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGxveWFibGUgb2JqZWN0IGZvciBwcm9qZWN0IGluc3RhbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gSVByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgLSBQcm9qZWN0IGluc3RhbmNlLgotCSAqIEByZXR1cm4gSU1vZHVsZU9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKHByb2plY3QsbnVsbCk7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwKTsKLQl9Ly8gZ2V0TW9kdWxlT2JqZWN0Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdCBmb3IgZmlsZSBpbnN0YW5jZXMuCi0JICogCi0JICogQHBhcmFtIElGaWxlCi0JICogICAgICAgICAgICBmaWxlIC0gRmlsZSBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIElNb2R1bGVPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpIHsKLQkJCXsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA8PSAwKQotCQkJCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChnZXRNb2R1bGUoZmlsZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCkpOwotCQkJfQotCQl9Ly8gaWYKLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGdldE1vZHVsZU9iamVjdAotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwbG95YWJsZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIHJlZk9iamVjdCAtIFRoZSBjdXJyZW50IHJlZk9iamVjdC4KLQkgKiBAcmV0dXJuIElNb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmT2JqZWN0KTsKLQkJUmVzb3VyY2Ugc2VydlJlc291cmNlID0gcmVmT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBlY2xpcGVTZXJ2UmVzb3J1Y2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHNlcnZSZXNvdXJjZSk7Ci0JCQlyZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhlY2xpcGVTZXJ2UmVzb3J1Y2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwpCi0JCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCXJldHVybiBnZXRNb2R1bGUocHJvaixjb21wb25lbnQpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRNb2R1bGVzKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04pKS5pdGVyYXRvcigpOyAKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZXBsb3lhYmxlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gSU1vZHVsZU9iamVjdAotCSAqICAgICAgICAgICAgZGVwbG95YWJsZSAtIFRoZSBjdXJyZW50IG1vZHVsZSBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgY3JlYXRlTW9kdWxlT2JqZWN0KElNb2R1bGUgbW9kdWxlKSB7Ci0KLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxNb2R1bGVBcnRpZmFjdChtb2R1bGUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGNyZWF0ZURlcGxveWFibGVPYmplY3QKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0QWRhcHRlciNnZXRPYmplY3RDbGFzc05hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0Q2xhc3NOYW1lKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjaXNQbHVnaW5BY3RpdmF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luQWN0aXZhdGVkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0vLyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlT2JqZWN0QWRhcHRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjY0YWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgIHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJTGF1bmNoYWJsZS5jbGFzcyB9OwotCX0KLQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmdldE1vZHVsZU9iamVjdChvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjMmQ4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lMYXVuY2hhYmxlLmNsYXNzfTsKLQl9Ci0KLQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjFlNjhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5qZmFjZXMuZXh0ZW5zaW9uLkZpbGVVUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb24uRmlsZVVSTEV4dGVuc2lvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEdFTkVSSUNfU0VSVkxFVF9DTEFTU19UWVBFID0gImphdmF4LnNlcnZsZXQuR2VuZXJpY1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBQ1RVU19TRVJWTEVUX0NMQVNTX1RZUEUgPSAib3JnLmFwYWNoZS5jYWN0dXMuc2VydmVyLlNlcnZsZXRUZXN0UmVkaXJlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIG9iajsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVBcnRpZmFjdCkKLQkJCXJlc291cmNlID0gKChJTW9kdWxlQXJ0aWZhY3QpIG9iaikuZ2V0TW9kdWxlKCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTZXJ2bGV0KSB7Ci0JCQkJU2VydmxldEltcGwgc2VydmxldCA9ICgoU2VydmxldEltcGwpIG9iaik7Ci0JCQkJUmVzb3VyY2Ugc2VydlJlc291cmNlID0gc2VydmxldC5lUmVzb3VyY2UoKTsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2UgZWNsaXBlU2VydlJlc29ydWNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShzZXJ2UmVzb3VyY2UpOwotCQkJCQlyZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhlY2xpcGVTZXJ2UmVzb3J1Y2UpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsKQotCQkJCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwotCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gZ2V0U2VydmxldE1hcHBpbmdzKHJlc291cmNlLCBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpKTsKLQotCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0JCQkJCVVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm4gPSAoVXJsUGF0dGVyblR5cGUpbWFwLmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQkJCQltYXBwaW5nID0gdXJsUGF0dGVybi5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJCX0KLQkJCQkKLS8vCQkJCVdlYlR5cGUgd2ViVHlwZSA9ICgoU2VydmxldCkgb2JqKS5nZXRXZWJUeXBlKCk7Ci0vLwkJCQlpZiAod2ViVHlwZS5pc0pzcFR5cGUoKSkgewotLy8JCQkJCXJlc291cmNlID0gKChJUHJvamVjdCkgcmVzb3VyY2UpLmdldEZpbGUoKChKU1BUeXBlKSB3ZWJUeXBlKS5nZXRKc3BGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9IGVsc2UgaWYgKHdlYlR5cGUuaXNTZXJ2bGV0VHlwZSgpKSB7Ci0vLwkJCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aCgic2VydmxldC8iICsgKChTZXJ2bGV0VHlwZSkgd2ViVHlwZSkuZ2V0Q2xhc3NOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKQotCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHByb2plY3QsIG51bGwpLCBwcm9qZWN0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJCi0JCWlmICghaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCQlpZiAoaXNDYWN0dXNKdW5pdFRlc3QocmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPD0gMCB8fCByZXNvdXJjZXNbMF0gPT0gbnVsbCApCi0JCQlyZXR1cm4gbnVsbDsKLQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2VydmxldENsYXNzTmFtZShyZXNvdXJjZSk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1hcHBpbmcgPSBnZXRTZXJ2bGV0TWFwcGluZyhyZXNvdXJjZSwgdHJ1ZSwgY2xhc3NOYW1lLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJCWlmIChtYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKLQkJCX0KLQkJCS8vIGlmIHRoZXJlIGlzIG5vIHNlcnZsZXQgbWFwcGluZywgcHJvdmlkZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzZXJ2bGV0Ci0JCQkvLyB0aHJvdWdoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aCgic2VydmxldC8iICsgY2xhc3NOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotLy8JCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLS8vCQkJCUxpc3Qgc2VydmxldHMgPSB3ZWJFZGl0LmdldFdlYkFwcCgpLmdldFNlcnZsZXRzKCk7Ci0vLwkJCQlmb3IgKGludCBpPTA7IGk8c2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMuZ2V0KGkpOwotLy8JCQkJCVdlYlR5cGUgdHlwZSA9IHNlcnZsZXQuZ2V0V2ViVHlwZSgpOwotLy8JCQkJCWlmICh0eXBlLmlzSnNwVHlwZSgpKSB7Ci0vLwkJCQkJCUpTUFR5cGUganNwID0gKEpTUFR5cGUpdHlwZTsKLS8vCQkJCQkJU3RyaW5nIGpzcFBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotLy8JCQkJCQlpZiAoanNwLmdldEpzcEZpbGUoKS5lcXVhbHMoanNwUGF0aCkpIHsKLS8vCQkJCQkJCUxpc3QgbWFwcGluZ3MgPSBzZXJ2bGV0LmdldE1hcHBpbmdzKCk7Ci0vLwkJCQkJCQlTdHJpbmcgbWFwcGluZyA9IG51bGw7Ci0vLwkJCQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0vLwkJCQkJCQkJbWFwcGluZyA9IG1hcC5nZXRVcmxQYXR0ZXJuKCk7Ci0vLwkJCQkJCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkgCi0vLwkJCQkJCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9IGZpbmFsbHkgewotLy8JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLS8vCQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLS8vCQkJfQotCQl9Ci0gICAgICAgIHJlc291cmNlUGF0aCA9IHJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpOwotICAgICAgICAKLQkJdHJ5IHsvL2FkZGluZyB0cnkvY2F0Y2ggdG8gYXZvaWQgZnV0dXJlIGlzc3VlcyB0aGF0IHdvdWxkIHJlcXVpcmUgY29tbWVudGluZyB0aGlzIG91dC4KLQkJCS8vIEV4dGVuc2lvbiByZWFkIHRvIGdldCB0aGUgY29ycmVjdCBVUkwgZm9yIEphdmEgU2VydmVyIEZhY2VzIGZpbGUgaWYKLQkJCS8vIHRoZSBqc3AgaXMgb2YgdHlwZSBqc2ZhY2VzLgotCQkJRmlsZVVSTCBqc3BVUkwgPSBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmlsZXNVUkwoKTsKLQkJCWlmIChqc3BVUkwgIT0gbnVsbCkgewotCQkJCUlQYXRoIGNvcnJlY3RKU1BQYXRoID0ganNwVVJMLmdldEZpbGVVUkwocmVzb3VyY2UsIHJlc291cmNlUGF0aCk7Ci0JCQkJaWYgKGNvcnJlY3RKU1BQYXRoICE9IG51bGwgJiYgY29ycmVjdEpTUFBhdGgudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApCi0JCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgY29ycmVjdEpTUFBhdGgpOwotCQkJfQotCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkKLQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCByZXNvdXJjZVBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpKS5pdGVyYXRvcigpOyAKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBWZXJ5IHRlbXBvcmFyeSBhcGkgLSBUT0RPIC0gcmlwIHRoaXMgb3V0IGJ5IDEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDYWN0dXNKdW5pdFRlc3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRDbGFzc05hbWVGb3JUeXBlKHJlc291cmNlLCBDQUNUVVNfU0VSVkxFVF9DTEFTU19UWVBFKSAhPSBudWxsOwotCX0KLQotCi0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZVtdIGdldFR5cGVzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5nZXRBbGxUeXBlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lRm9yVHlwZShyZXNvdXJjZSwgR0VORVJJQ19TRVJWTEVUX0NMQVNTX1RZUEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZUZvclR5cGUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgc3VwZXJUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSB8fCBwYXRoID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQlpZiAoIWphdmFQcm9qZWN0LmlzT3BlbigpKQotCQkJCWphdmFQcm9qZWN0Lm9wZW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCS8vIG91dHB1dCBsb2NhdGlvbiBtYXkgbm90IGJlIG9uIGNsYXNzcGF0aAotCQkJSVBhdGggb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsICYmICJjbGFzcyIuZXF1YWxzKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiBvdXRwdXRQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBjb3VudCA9IG91dHB1dFBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpbml0aWFsIHBhcnQgb2YgY2xhc3NwYXRoCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc1BhdGhFbnRyeSA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJaWYgKGNsYXNzUGF0aEVudHJ5ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNsYXNzUGF0aEVudHJ5Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUGF0aCBjbGFzc1BhdGggPSBjbGFzc1BhdGhFbnRyeVtpXS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChjbGFzc1BhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJaW50IGNvdW50ID0gY2xhc3NQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQkJCQlpICs9IHNpemU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBqYXZhIGVsZW1lbnQKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGphdmFQcm9qZWN0LmZpbmRFbGVtZW50KHBhdGgpOwotCi0JCQlJVHlwZVtdIHR5cGVzID0gZ2V0VHlwZXMoamF2YUVsZW1lbnQpOwotCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZTIgPSB0eXBlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChoYXNTdXBlcmNsYXNzKHR5cGVzW2ldLCBzdXBlclR5cGUpKQotCQkJCQkJcmV0dXJuIHR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU3VwZXJjbGFzcyhJVHlwZSB0eXBlLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCi0JCQlpbnQgc2l6ZSA9IHN1cGVyQ2xhc3Nlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoc3VwZXJDbGFzc2VzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0TWFwcGluZyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNTZXJ2bGV0LCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lKSB7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsIHx8IHR5cGVOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKCByZXNvdXJjZS5nZXRQcm9qZWN0KCkgKTsKLQkJT2JqZWN0IG1PYmogPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQkKLQkJaWYgKCBtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKXsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1PYmo7Ci0JCQlMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0JCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQkJLy8gRW5zdXJlIHRoZSBkaXNwbGF5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCQkJaWYgKHNlcnZsZXRzICE9IG51bGwgJiYgIXNlcnZsZXRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQpc2VydmxldHMuZ2V0KGkpOwotCQkJCQlpZiggc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKS5lcXVhbHModHlwZU5hbWUpKXsKLQkJCQkKLQkJCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotCQkJCQkJaWYgKG1hcHBpbmdzICE9IG51bGwgJiYgIW1hcHBpbmdzLmlzRW1wdHkoKSkgewotCQkJCQkJCUl0ZXJhdG9yIGl0ID0gbWFwcGluZ3MuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZSggaXQuaGFzTmV4dCgpICl7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nIG1hcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZykgaXQubmV4dCgpOwotCQkJCQkJCQlpZiggbWFwLmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkpewotCQkJCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm4gPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlKW1hcC5nZXRVcmxQYXR0ZXJucygpLmdldCgwKTsKLQkJCQkJCQkJCXJldHVybiAgdXJsUGF0dGVybi5nZXRWYWx1ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkKLQkJCQl9Ci0JCQl9Ci0KLQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpeyAKLQkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKCByZXNvdXJjZS5nZXRQcm9qZWN0KCkgKTsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCi0JCUxpc3Qgc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzZXJ2bGV0cyAhPSBudWxsICYmICFzZXJ2bGV0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldClzZXJ2bGV0cy5nZXQoaSk7Ci0JCQkJaWYoIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZXF1YWxzKHR5cGVOYW1lKSl7Ci0JCQkKLQkJCQkJamF2YS51dGlsLkxpc3QgbWFwcGluZ3MgPSB3ZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCUl0ZXJhdG9yIGl0ID0gbWFwcGluZ3MuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlKCBpdC5oYXNOZXh0KCkgKXsKLQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBtYXAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiggbWFwLmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkpewotCQkJCQkJCQlsaXN0LmFkZChtYXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2NlYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTl9USVRMRT1JbnZhbGlkIFNlbGVjdGlvbgotSU5GT1JNX0lOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OPU9uZSBvciBtb3JlIEphdmEgRUUgcHJvamVjdHMgc2VsZWN0ZWQgYWxyZWFkeSBoYXMgYSBEZXBsb3ltZW50IERlc2NyaXB0b3IuCi0KLUlOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OX1RJVExFPUludmFsaWQgU2VsZWN0aW9uCi1JTkZPUk1fSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT049T25lIG9yIG1vcmUgSmF2YSBFRSBwcm9qZWN0cyBzZWxlY3RlZCBhbHJlYWR5IGhhcyBhIERlcGxveW1lbnQgRGVzY3JpcHRvci4KLURFUExPWU1FTlRfREVTQ1JJUFRPUj1EZXBsb3ltZW50IERlc2NyaXB0b3I6IAotU0VTU0lPTl9CRUFOUz1TZXNzaW9uIEJlYW5zCi1FTlRJVFlfQkVBTlM9RW50aXR5IEJlYW5zKDEueC0yLngpCi1NRVNTQUdFX0RSSVZFTl9CRUFOUz1NZXNzYWdlLURyaXZlbiBCZWFucwotQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUz1BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzCi1FTlRFUlBSSVNFX0JFQU5fQ0xBU1NfREVTQ1JJUFRJT049RW50ZXJwcmlzZSBCZWFuIENsYXNzIC0gCi0KLVNFUlZMRVRfSVRFTV9QUk9WSURFUj1TZXJ2bGV0cwotTElTVEVORVJfSVRFTV9QUk9WSURFUj1MaXN0ZW5lcnMKLUZJTFRFUlNfSVRFTV9QUk9WSURFUj1GaWx0ZXJzCi1GSUxURVJfTUFQUElOR19JVEVNX1BST1ZJREVSPUZpbHRlciBNYXBwaW5ncwotU0VSVkxFVF9NQVBQSU5HX0lURU1fUFJPVklERVI9U2VydmxldCBNYXBwaW5ncwotRVJST1JfUEFHRVNfSVRFTV9QUk9WSURFUj1FcnJvciBQYWdlcwotV0VMQ09NRV9QQUdFU19JVEVNX1BST1ZJREVSPVdlbGNvbWUgUGFnZXMKLUNPTlRFWFRfUEFSQU1TX0lURU1fUFJPVklERVI9Q29udGV4dCBQYXJhbWV0ZXJzCi1CVU5ETEVEX0xJQlJBUklFU19OT0RFPUJ1bmRsZWQgTGlicmFyaWVzCi1MSUJSQVJZX0RJUkVDVE9SWT1MaWJyYXJ5IERpcmVjdG9yeQotRUFSX01PRFVMRVNfTk9ERT1Nb2R1bGVzCi1FSkJMT0NBTF9SRUZFUkVOQ0VTPUVqYiBMb2NhbCBSZWZlcmVuY2VzCi1FSkJfUkVGRVJFTkNFUz1FamIgUmVmZXJlbmNlcwotRU5WSVJPTUVOVF9FTlRSSUVTPUVudmlyb25tZW50IEVudHJpZXMKLVJFU09VUkNFX0VOVklST01FTlRfRU5UUklFUz1SZXNvdXJjZSBFbnZpcm9ubWVudCBFbnRyaWVzCi1SRVNPVVJDRV9SRUZFUkVOQ0VTPVJlc291cmNlIFJlZmVyZW5jZXMKLVNFUlZJQ0VfUkVGRVJFTkNFUz1TZXJ2aWNlIFJlZmVyZW5jZXMKLVJFRkVSRU5DRVM9UmVmZXJlbmNlcwotCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXz1UaGUgZHJhZ2dlZCBwcm9qZWN0IGNhbm5vdCBiZSBhZGRlZAotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXz1UaGUgcHJvamVjdCBjYW5ub3QgYmUgYWNjZXNzZWQKLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV89Q291bGQgbm90IGFkZCBtb2R1bGUgdG8gRW50ZXJwcmlzZQotQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfPUFkZGluZyBtb2R1bGUgdG8gZWFyCi1JbXBvcnRKRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHM9SW1wb3J0aW5nIEphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIGFydGlmYWN0cwotSW1wb3J0SkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXz1Db3VsZCBub3QgcmVjb2duaXplIGV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdERETm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdERETm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQwMjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RERE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEFic3RyYWN0IERlcGxveW1lbnQgRGVzY3JpcHRvciBOb2RlIGlzIGFuIGFic3RyYWN0IHdyYXBwZXIgY2xhc3MgZm9yIHRoZSBub2RlcyBpbiB0aGUgRGVwbG95bWVudAotICogRGVzY3JpcHRvciBpdCBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGxhYmVsIHByb3ZpZGVyIHNvbWUgZGVzY3JpcHRpb24gZm9yIHRvb2wgdGlwLCBhbiBpbWFnZQotICogYW5kIHRoZSBvYmplY3QgdGhhdCBpdCBpcyB3cmFwcGluZy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0REROb2RlIHsKLQotCXByb3RlY3RlZCBPYmplY3QgYWRhcHRlck5vZGU7Ci0JcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCXByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJOb2RlIC0gdGhlIHdyYXBwZWQgb2JqZWN0IAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERETm9kZShPYmplY3QgYWRhcHRlck5vZGUpewotCQl0aGlzLmFkYXB0ZXJOb2RlID0gYWRhcHRlck5vZGU7Ci0JCWltYWdlID0gbnVsbDsKLQkJdGV4dCA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRDaGlsZHJlbigpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLQotCXB1YmxpYyB2b2lkIGRlY29yYXRlKElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZywgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsgCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyTm9kZSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdChKYXZhRUVPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJYWRhcHRlck5vZGUgPSBtb2RlbE9iamVjdDsKLQl9CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdEdyb3VwUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RHcm91cFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTFlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdEdyb3VwUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQWJzdHJhY3QgZ3JvdXAgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBoYXMgYSBudW1iZXIgb2Ygc3ViIG5vZGVzIAotICogKGxpa2UgRW50aXR5IEJlYW5zLCBTZXNzaW9uIEJlYW5zLCBNZXNzYWdlIERyaXZlbiBCZWFucykuCi0gKiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQlwcm90ZWN0ZWQgSmF2YUVFT2JqZWN0IGphdmFlZTsKLQlwcm90ZWN0ZWQgIFN0cmluZyB0ZXh0OwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCi0JcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiBpc1ZhbGlkKSB7Ci0JCXRoaXMuaXNWYWxpZCA9IGlzVmFsaWQ7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0R3JvdXBQcm92aWRlcihKYXZhRUVPYmplY3QgamF2YWVlKSB7Ci0JCXRoaXMuamF2YWVlID0gamF2YWVlOwotCQl0ZXh0ID0gTWVzc2FnZXMuREVQTE9ZTUVOVF9ERVNDUklQVE9SICsgamF2YWVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IExpc3QgZ2V0Q2hpbGRyZW4oKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJbWFnZSBnZXRJbWFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dCA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEphdmFFRU9iamVjdCBnZXRKYXZhRUVPYmplY3QoKSB7Ci0JCXJldHVybiBqYXZhZWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVpbml0KEphdmFFRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQl0aGlzLmphdmFlZSA9IG1vZGVsT2JqZWN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKXsKLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRkNDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQuR3JvdXBBcHBDbGllbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuTW9kdWxlc05vZGU7Ci0KLS8qKgotICogRWFyIDUuMCBDb250ZW50IHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBjb250ZW50IHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50NUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEpFRTVDb250ZW50UHJvdmlkZXIgewotCi0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKCgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgYVBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCkpOwotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkgJiYKLQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBnZXRDYWNoZWRDb250ZW50UHJvdmlkZXIocHJvamVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJcmV0dXJuICEoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIGVsZW1lbnQpLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTW9kdWxlc05vZGUpewotCQkJcmV0dXJuICgoTW9kdWxlc05vZGUpIG9iamVjdCkuZ2V0RWFyUHJvamVjdCgpOyAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR3JvdXBBcHBDbGllbnRQcm92aWRlcigoQXBwbGljYXRpb25DbGllbnQpIGdldENhY2hlZE1vZGVsUHJvdmlkZXIocHJvamVjdCkuZ2V0TW9kZWxPYmplY3QoKSwgcHJvamVjdCk7Ci0JfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjkzMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuYXBwY2xpZW50Lkdyb3VwQXBwQ2xpZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEFwcGxpY2F0aW9uIENsZW50IDUuMCBMYWJlbCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbGFiZWwgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgZGVjb3JhdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTGFiZWxQcm92aWRlciB7Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJcmV0ID0gKChHcm91cEFwcENsaWVudFByb3ZpZGVyKWVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0gCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCXJldCA9ICAoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwMmEzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQWJzdHJhY3RFYXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBBcHBsaWNhdGlvbiBDbGllbnQgNS4wIENvbnRlbnQgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGNvbnRlbnQgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgY29uc3RydWN0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBFYXI1Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgSkVFNUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFQVJfREVGQVVMVF9MSUIgPSAiL2xpYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KExpc3QgY29tcG9uZW50VHlwZXMsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gdmlydHVhbENvbXBvbmVudDsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IHJlZkNvbXBvbmVudHNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChtb2R1bGUgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJLy8gaWYgY29tcG9uZW50IHR5cGVzIHBhc3NlZCBpbiBpcyBudWxsIHRoZW4gcmV0dXJuIGFsbCBjb21wb25lbnRzCi0JCQkJaWYgKGNvbXBvbmVudFR5cGVzID09IG51bGwgfHwgY29tcG9uZW50VHlwZXMuc2l6ZSgpID09IDApIHsKLQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGNvbXBvbmVudFR5cGVzLmNvbnRhaW5zKEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUobW9kdWxlKSkpIHsKLQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeyAgCi0JCUxpc3QgZXhwbGljaXRVdGlsaXR5UmVmZXJlbmNlcyA9IAotCQkJZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFkpLCBjb21wb25lbnQsIG51bGwpOwotCi0JCS8vIGZldGNoIG90aGVyIFV0aWxpdHkgSmFycyBhdHRhY2hlZCB0byB0aGUgRUFSIHByb2plY3QgCi0JCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMgPQotCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgCi0JCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUsCi0JCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUsCSAKLQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSAKLQkJCX0pOwotCi0JCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcyA9IAotCQkJZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcywgY29tcG9uZW50LCBudWxsKTsKLQotCQlMaXN0IGFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoZXhwbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7Ci0JCWFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLmFkZEFsbChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzKTsKLQotCQlpZihhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSBhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVswXTsKLQotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoR3JvdXBFQVJQcm92aWRlcilhUGFyZW50RWxlbWVudCkuZ2V0UHJvamVjdCgpOwotCi0JCQlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiAKLQkJCQkJCWZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldCgKLQkJCQkJCQkJUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpLmdldFZlcnNpb24oCi0JCQkJCQkJCQkJSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpKSB7Ci0KLQkJCQkJTGlzdCBsaWJzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFkpLCBwcm9qZWN0Q29tcG9uZW50LAotCQkJCQkJCW5ldyBQYXRoKCIvIiArIEVBUl9ERUZBVUxUX0xJQikpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQlBcnJheUxpc3QgYnVuZGxlZExpYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJQXJyYXlMaXN0IGFwcExpYnNJblRoZVJvb3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBsaWJzLmdldChpKTsKLQkJCQkJCQkJSVBhdGggcnVudGltZVBhdGggPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKTsKLQotCQkJCQkJCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCAmJiBydW50aW1lUGF0aC5zZWdtZW50KDApICE9IG51bGwgJiYgCi0vLwkJCQkJCQkJCQlydW50aW1lUGF0aC5lcXVhbHMobmV3IFBhdGgoRUFSX0RFRkFVTFRfTElCKSkpIHsKLQkJCQkJCQkJCSFydW50aW1lUGF0aC5pc1Jvb3QoKSkgewotCQkJCQkJCQkJYnVuZGxlZExpYnMuYWRkKGxpYnMuZ2V0KGkpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWFwcExpYnNJblRoZVJvb3QuYWRkKGxpYnMuZ2V0KGkpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgbGliRGlyID0gRUFSX0RFRkFVTFRfTElCOwotCQkJCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJCQkJU3RyaW5nIG9sZExpYkRpciA9ICgoQXBwbGljYXRpb24pTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpKS5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCQkJCQkJCWlmIChvbGRMaWJEaXIgPT0gbnVsbCkgb2xkTGliRGlyID0gRUFSX0RFRkFVTFRfTElCOwotCQkJCQkJCQlsaWJEaXIgPSBvbGRMaWJEaXI7Ci0JCQkJCQkJfQotLy8KLS8vCQkJCQkJCUxpc3QgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMgPQotLy8JCQkJCQkJCUFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIAotLy8JCQkJCQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwKLS8vCQkJCQkJCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUsCi0vLwkJCQkJCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFLAotLy8JCQkJCQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRX0pOwotLy8KLQotLy8JCQkJCQkJTGlzdCBtb2R1bGVzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcywgcHJvamVjdENvbXBvbmVudCwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCU1vZHVsZXNOb2RlIG1vZHVsZXNOb2RlID0gbmV3IE1vZHVsZXNOb2RlKHByb2plY3QpOwotCi0vLwkJCQkJCQljaGlsZHJlbi5hZGQobW9kdWxlc05vZGUpOwotLy8JCQkJCQkJY2hpbGRyZW4uYWRkKGJ1bmRsZWRMaWJzTm9kZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICJFcnJvciBpbiB0aGUgSkVFQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKCkgZm9yIHBhcmVudDoiICsgIGFQYXJlbnRFbGVtZW50OyAvLyROT04tTkxTLTEkCi0JCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEVhck5vZGUpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0RWFyTm9kZSkgYVBhcmVudEVsZW1lbnQpLmdldE1vZHVsZXMoKS50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGFQYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCQkJCXRyeSB7Ci0JCQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiAKLQkJCQkJCQlmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoCi0JCQkJCQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkuZ2V0VmVyc2lvbigKLQkJCQkJCQkJCQkJSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpKSB7Ci0JCQkJCQlHcm91cEVBUlByb3ZpZGVyIGVsZW1lbnQgPSAoR3JvdXBFQVJQcm92aWRlcikgZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKHByb2plY3QpOwotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSAiRXJyb3IgaW4gdGhlIEpFRUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbigpIGZvciBwYXJlbnQ6IiArICBhUGFyZW50RWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcmV0dXJuICgoQWJzdHJhY3RFYXJOb2RlKSBlbGVtZW50KS5nZXRNb2R1bGVzKCkuc2l6ZSgpID4gMDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcil7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdEVhck5vZGUpewotCQkJcmV0dXJuICgoQWJzdHJhY3RFYXJOb2RlKSBvYmplY3QpLmdldEVhclByb2plY3QoKTsgCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR3JvdXBFQVJQcm92aWRlcigoQXBwbGljYXRpb24pIGdldENhY2hlZE1vZGVsUHJvdmlkZXIocHJvamVjdCkuZ2V0TW9kZWxPYmplY3QoKSwgKEVBUlZpcnR1YWxDb21wb25lbnQpQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4Yzk0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZG5kLklNb2R1bGVFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BYnN0cmFjdEVhck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEVBUiA1LjAgTGFiZWwgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGxhYmVsIHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGRlY29yYXRpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVhcjVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUxhYmVsUHJvdmlkZXIgewotCQotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFU19OT0RFOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFX1VUSUw7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVfV0VCOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFX0VKQjsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRV9DTElFTlQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVfQ09OTkVDVE9SOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUlNR19NT0RVTEVTX05PREUgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZvbGRlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1HX01PRFVMRV9VVElMID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgidXRpbGphcl9vYmoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNR19NT0RVTEVfV0VCID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tb2R1bGVfd2ViX29iaiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1HX01PRFVMRV9FSkIgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L21vZHVsZV9lamJfb2JqIikpOyAvLyROT04tTkxTLTEkCi0JCQlJTUdfTU9EVUxFX0NMSUVOVCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIm1vZHVsZV9jbGllbnRhcHBfb2JqIikpOyAvLyROT04tTkxTLTEkCi0JCQlJTUdfTU9EVUxFX0NPTk5FQ1RPUiA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29ubmVjdG9yX21vZHVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJCUlNR19NT0RVTEVTX05PREUgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJSU1HX01PRFVMRV9VVElMID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCUlNR19NT0RVTEVfV0VCID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCUlNR19NT0RVTEVfRUpCID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCUlNR19NT0RVTEVfQ0xJRU5UID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCUlNR19NT0RVTEVfQ09OTkVDVE9SID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXQgPSBudWxsOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKSB7Ci0JCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFU19OT0RFKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9ICgoSVZpcnR1YWxSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgeyAKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX1VUSUwpOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9XRUIpOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX0VKQik7Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9DTElFTlQpOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX0NPTk5FQ1RPUik7Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfVVRJTCk7Ci0JCQl9IGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9VVElMKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcil7Ci0JCQlyZXQgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKSB7Ci0JCQlyZXQgPSAgKChBYnN0cmFjdEVhck5vZGUpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9ICgoSVZpcnR1YWxSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQotCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCXJldCA9ICJXZWIgIiArIGNvbXBvbmVudC5nZXROYW1lKCkgKyBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpKTsKLQkJCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCWlmICghY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJcmV0ID0gIkVKQiAiICsgY29tcG9uZW50LmdldE5hbWUoKSArIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkpOwotCQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KGNvbXBvbmVudCkpewotCQkJCWlmICghY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJcmV0ID0gIkFQUCBDbGllbnQgIiArIGNvbXBvbmVudC5nZXROYW1lKCkgKyBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpKTsKLQkJCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJcmV0ID0gIkNvbm5lY3RvciAiICsgY29tcG9uZW50LmdldE5hbWUoKSArIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJcmV0ID0gY29tcG9uZW50LmdldE5hbWUoKSArIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7Ci0JCQl9IGVsc2UgaWYgKGNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJVmlydHVhbEFyY2hpdmVDb21wb25lbnQgdmlydHVhbEFyY2hpdmVDb21wb25lbnQgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpY29tcG9uZW50OwotCQkJCVN0cmluZyBkZXBsb3llZE5hbWUgPSB2aXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXBsb3llZE5hbWUpOwotCQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQl9Ci0JCX0gIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKXsKLQkJCXJldCA9ICgoR3JvdXBFQVJQcm92aWRlcikgZWxlbWVudCkuZ2V0VGV4dCgpOyAKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhODIzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSm5kaVJlZk5vZGUuS0lORFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEVqYiAzLjAgQ29udGVudCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgY29udGVudCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBjb25zdHJ1Y3Rpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVqYjNDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBKRUU1Q29udGVudFByb3ZpZGVyIHsKLQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKSB7Ci0JCQlMaXN0IGxzdCA9ICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBhUGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWNoaWxkcmVuLmFkZEFsbChsc3QpOwotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RERE5vZGUpIHsKLQkJCUxpc3QgbHN0ID0gKChBYnN0cmFjdERETm9kZSkgYVBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQljaGlsZHJlbi5hZGRBbGwobHN0KTsKLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSB7Ci0JCQlTZXNzaW9uQmVhbiBzYiA9ICgoU2Vzc2lvbkJlYW4pYVBhcmVudEVsZW1lbnQpOwotCQkJYWRkU2Vzc2lvbkJlYW5TdWJOb2RlcyhzYiwgY2hpbGRyZW4pOwotCi0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKSB7Ci0JCQlFbnRpdHlCZWFuIGViID0gKChFbnRpdHlCZWFuKWFQYXJlbnRFbGVtZW50KTsKLQotCQkJYWRkRW50aXR5QmVhblN1Yk5vZGVzKGViLCBjaGlsZHJlbik7Ci0KLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSB7Ci0JCQlPYmplY3QgbXNnQmVhbiA9IG5ldyBCZWFuTm9kZSgoTWVzc2FnZURyaXZlbkJlYW4pIGFQYXJlbnRFbGVtZW50KTsKLQkJCWFkZEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKChNZXNzYWdlRHJpdmVuQmVhbikgYVBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuLmFkZChtc2dCZWFuKTsKLQkJfSBlbHNlIAotCQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgYVBhcmVudEVsZW1lbnQpCi0JCQkJLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGlzRWpiTW9kdWxlUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQkJR3JvdXBFSkJQcm92aWRlciByb290ID0gKEdyb3VwRUpCUHJvdmlkZXIpIGdldENhY2hlZENvbnRlbnRQcm92aWRlcihwcm9qZWN0KTsKLQkJCQkJCWNoaWxkcmVuLmFkZChyb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoTWVzc2FnZURyaXZlbkJlYW4gcGFyZW50RWxlbWVudCwKLQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbikgewotCQlpZiAocGFyZW50RWxlbWVudC5nZXRBY3RpdmF0aW9uQ29uZmlnKCkgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50LmdldEFjdGl2YXRpb25Db25maWcoKS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpICE9IG51bGwgJiYgIXBhcmVudEVsZW1lbnQuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMocGFyZW50RWxlbWVudC5nZXRBY3RpdmF0aW9uQ29uZmlnKCkuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVudGl0eUJlYW5TdWJOb2RlcyhFbnRpdHlCZWFuIGViLCBMaXN0PE9iamVjdD4gY2hpbGRyZW4pIHsKLQkJaWYgKGViLmdldExvY2FsKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShlYiwgKFN0cmluZyllYi5nZXRMb2NhbCgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTCkpOwotCQl9Ci0JCWlmIChlYi5nZXRMb2NhbEhvbWUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKGViLCAoU3RyaW5nKWViLmdldExvY2FsSG9tZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTF9IT01FKSk7Ci0JCX0KLQotCQlpZiAoZWIuZ2V0UmVtb3RlKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShlYiwgKFN0cmluZyllYi5nZXRSZW1vdGUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFKSk7Ci0JCX0KLQkJaWYgKGViLmdldEhvbWUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKGViLCAoU3RyaW5nKWViLmdldEhvbWUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFX0hPTUUpKTsKLQkJfQotCi0KLQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuTm9kZSgoRW50aXR5QmVhbikgZWIpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXNzaW9uQmVhblN1Yk5vZGVzKFNlc3Npb25CZWFuIHNiLCBMaXN0IGNoaWxkcmVuKSB7Ci0JCWFkZENsYXNzUmVsYXRlZEluZm8oc2IsIGNoaWxkcmVuKTsKLQkJYWRkU2Vzc2lvbkpORElSZWZJbmZvKHNiLCBjaGlsZHJlbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25KTkRJUmVmSW5mbyhTZXNzaW9uQmVhbiBzYiwgTGlzdCBjaGlsZHJlbikgewotCQlpZiAoc2IuZ2V0RWpiTG9jYWxSZWZzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0RWpiTG9jYWxSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0RWpiTG9jYWxSZWZzKCksIEtJTkRTLkVKQkxPQ0FMUkVGKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0RWpiUmVmcygpICE9IG51bGwgJiYgIXNiLmdldEVqYlJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRFamJSZWZzKCksIEtJTkRTLkVKQlJFRikpOwotCQl9Ci0KLQkJaWYgKHNiLmdldFJlc291cmNlRW52UmVmcygpICE9IG51bGwgJiYgIXNiLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldFJlc291cmNlRW52UmVmcygpLCBLSU5EUy5SRVNFTlZFTlRZKSk7Ci0JCX0KLQkJaWYgKHNiLmdldEVudkVudHJpZXMoKSAhPSBudWxsICYmICFzYi5nZXRFbnZFbnRyaWVzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0RW52RW50cmllcygpLCBLSU5EUy5FTlZFTlRSWSkpOwotCQl9Ci0KLQkJaWYgKHNiLmdldFJlc291cmNlUmVmcygpICE9IG51bGwgJiYgIXNiLmdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldFJlc291cmNlUmVmcygpLCBLSU5EUy5SRVNSRUYpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRTZXJ2aWNlUmVmcygpICE9IG51bGwgJiYgIXNiLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0U2VydmljZVJlZnMoKSwgS0lORFMuU0VSVklDRVJFRikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25KTkRJUmVmSW5mbyhFbnRpdHlCZWFuIGViLCBMaXN0IGNoaWxkcmVuKSB7Ci0JCWlmIChlYi5nZXRFamJMb2NhbFJlZnMoKSAhPSBudWxsICYmICFlYi5nZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRFamJMb2NhbFJlZnMoKSwgS0lORFMuRUpCTE9DQUxSRUYpKTsKLQkJfQotCi0JCWlmIChlYi5nZXRFamJSZWZzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0RWpiUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldEVqYlJlZnMoKSwgS0lORFMuRUpCUkVGKSk7Ci0JCX0KLQotCQlpZiAoZWIuZ2V0UmVzb3VyY2VFbnZSZWZzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0UmVzb3VyY2VFbnZSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0UmVzb3VyY2VFbnZSZWZzKCksIEtJTkRTLlJFU0VOVkVOVFkpKTsKLQkJfQotCQlpZiAoZWIuZ2V0RW52RW50cmllcygpICE9IG51bGwgJiYgIWViLmdldEVudkVudHJpZXMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRFbnZFbnRyaWVzKCksIEtJTkRTLkVOVkVOVFJZKSk7Ci0JCX0KLQotCQlpZiAoZWIuZ2V0UmVzb3VyY2VSZWZzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0UmVzb3VyY2VSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0UmVzb3VyY2VSZWZzKCksIEtJTkRTLlJFU1JFRikpOwotCQl9Ci0KLQkJaWYgKGViLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRTZXJ2aWNlUmVmcygpLCBLSU5EUy5TRVJWSUNFUkVGKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NSZWxhdGVkSW5mbyhTZXNzaW9uQmVhbiBzYiwgTGlzdCBjaGlsZHJlbikgewotCQlpZiAoc2IuZ2V0TG9jYWwoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKXNiLmdldExvY2FsKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMKSk7Ci0JCX0KLQkJCi0JCWlmIChzYi5nZXRMb2NhbEhvbWUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKXNiLmdldExvY2FsSG9tZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTF9IT01FKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0UmVtb3RlKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylzYi5nZXRSZW1vdGUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFKSk7Ci0JCX0KLQkJCi0JCWlmIChzYi5nZXRIb21lKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylzYi5nZXRIb21lKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URV9IT01FKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0RWpiQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5Ob2RlKChTZXNzaW9uQmVhbikgc2IpKTsKLQkJfQotCQkKLQkJTGlzdCByID0gc2IuZ2V0QnVzaW5lc3NMb2NhbHMoKTsKLQkJZm9yIChPYmplY3QgbG9jYWxzIDogcikgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylsb2NhbHMsIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19MT0NBTCkpOwotCQl9Ci0JCQotCQlyID0gc2IuZ2V0QnVzaW5lc3NSZW1vdGVzKCk7Ci0JCWZvciAoT2JqZWN0IGxvY2FscyA6IHIpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpbG9jYWxzLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5CVVNTSU5FU1NfUkVNT1RFKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFamJNb2R1bGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGluc3RhbGxlZFZlcnNpb24gPSBmYWNldGVkUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQikuZ2V0VmVyc2lvbihJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQl8zMC5nZXRWZXJzaW9uU3RyaW5nKCkpLmdldFByb2plY3RGYWNldCgpKTsKLQkJCXJldHVybiBpbnN0YWxsZWRWZXJzaW9uICE9IG51bGw7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoIkNhbiBub3QgYWNjZXMgcHJvamVjdCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0REROb2RlKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdERETm9kZSkgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0TmV3Q29udGVudFByb3ZpZGVySW5zdGFuY2UoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kZWxQcm92aWRlciBjYWNoZWRNb2RlbFByb3ZpZGVyID0gZ2V0Q2FjaGVkTW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJR3JvdXBFSkJQcm92aWRlciByb290ID0gbmV3IEdyb3VwRUpCUHJvdmlkZXIoKEVKQkphcikgY2FjaGVkTW9kZWxQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpKTsKLQkJcm9vdC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCXJldHVybiByb290OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0xhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0xhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhOGEzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5JSjJFRU5hdmlnYXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkxvYWRpbmdERE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEVqYiAzLjAgTGFiZWwgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGxhYmVsIHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGRlY29yYXRpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVqYjNMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUxhYmVsUHJvdmlkZXIgewotCi0gIHByaXZhdGUgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLSAgCi0gIHB1YmxpYyBFamIzTGFiZWxQcm92aWRlcigpIHsKLSAgICBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgPSBuZXcgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KElKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLlZJRVdFUl9JRCkpOwotICB9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIHJldCA9IG51bGw7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBMb2FkaW5nREROb2RlKQotICAgICAgICAgIHJldHVybiAoKExvYWRpbmdERE5vZGUpZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEVKQlByb3ZpZGVyKSB7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpFRVVJUGx1Z2luSWNvbnMuSU1HX0VKQkVFTU9ERUwpOwotICAgICAgICByZXR1cm4gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RERE5vZGUpewotICAgICAgICByZXR1cm4gKChBYnN0cmFjdERETm9kZSllbGVtZW50ICkuZ2V0SW1hZ2UoKTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2Vzc2lvbkJlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtZXNzYWdlX2JlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImNtcEVudGl0eV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFamJMb2NhbFJlZiB8fCBlbGVtZW50IGluc3RhbmNlb2YgRWpiUmVmKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImVqYlJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRW52RW50cnkpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlRW52UmVmKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZVJlZil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmljZVJlZil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJhdHRyaWJ1dGVfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImFjY2Vzc19pbnRlbnRfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgICAgIAotICAgICAgcmV0dXJuIHJldDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKSB7Ci0JCQlyZXQgPSAoZWxlbWVudCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSA/ICgoU2Vzc2lvbkJlYW4pIGVsZW1lbnQpLmdldEVqYk5hbWUoKSA6IAotCQkJICAgICAgICAgIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pID8gKChNZXNzYWdlRHJpdmVuQmVhbikgZWxlbWVudCkuZ2V0RWpiTmFtZSgpIDogCi0JCQkgICAgICAgICAgICAoZWxlbWVudCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pID8gKChFbnRpdHlCZWFuKSBlbGVtZW50KS5nZXRFamJOYW1lKCkgOiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdERETm9kZSkgewotCQkJcmV0ID0gKChBYnN0cmFjdERETm9kZSkgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIHsKLQkJCXJldCA9ICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVqYkxvY2FsUmVmIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBFamJSZWYpewotCQkgIHJldCAgPSBlbGVtZW50IGluc3RhbmNlb2YgRWpiTG9jYWxSZWYgPyAoKEVqYkxvY2FsUmVmKWVsZW1lbnQpLmdldEVqYlJlZk5hbWUoKSA6IGVsZW1lbnQgaW5zdGFuY2VvZiBFamJSZWYgPyAoKEVqYlJlZillbGVtZW50KS5nZXRFamJSZWZOYW1lKCkgOiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnZFbnRyeSl7Ci0JCSAgcmV0ID0gKChFbnZFbnRyeSkgZWxlbWVudCkuZ2V0RW52RW50cnlOYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlRW52UmVmKXsKLQkJICByZXQgPSAoKFJlc291cmNlRW52UmVmKSBlbGVtZW50KS5nZXRSZXNvdXJjZUVudlJlZk5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VSZWYpewotCQkgIHJldCA9ICgoUmVzb3VyY2VSZWYpIGVsZW1lbnQpLmdldFJlc1JlZk5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmljZVJlZil7Ci0JCSAgcmV0ID0gKChTZXJ2aWNlUmVmKSBlbGVtZW50KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KXsKLQkJICByZXQgPSAoKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSllbGVtZW50KS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkgKyAiOiIgKygoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KWVsZW1lbnQpLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IHN1cGVyLmdldERlc2NyaXB0aW9uKGFuRWxlbWVudCk7Ci0KLQkJaWYgKGFuRWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0REROb2RlKSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoQWJzdHJhY3RERE5vZGUpIGFuRWxlbWVudCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCQl9Ci0JCX0gCi0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUU1Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRTVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2ZWRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRTVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GUm9vdE9iamVjdFByb3ZpZGVyLklSZWZyZXNoSGFuZGxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpFRTVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCXByb3RlY3RlZCBzdGF0aWMgTWFwPElQcm9qZWN0LCBJTW9kZWxQcm92aWRlcj4gZ3JvdXBQcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSU1vZGVsUHJvdmlkZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxJUHJvamVjdCwgQWJzdHJhY3RHcm91cFByb3ZpZGVyPiBncm91cENvbnRlbnRQcm92aWRlcnMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgQWJzdHJhY3RHcm91cFByb3ZpZGVyPigpOwotCi0KLQlwdWJsaWMgSkVFNUNvbnRlbnRQcm92aWRlcigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQl2aWV3ZXIgPSBhVmlld2VyOwotCX0KLQotCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGdldENhY2hlZE1vZGVsUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGdyb3VwUHJvdmlkZXJzTWFwLmdldChwcm9qZWN0KTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpewotCQkJcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQkJcHJvdmlkZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQlncm91cFByb3ZpZGVyc01hcC5wdXQocHJvamVjdCxwcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQWJzdHJhY3RHcm91cFByb3ZpZGVyIHByb3ZpZGVyID0gZ3JvdXBDb250ZW50UHJvdmlkZXJzLmdldChwcm9qZWN0KTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpewotCQkJcHJvdmlkZXIgPSBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShwcm9qZWN0KTsKLQkJCWdyb3VwQ29udGVudFByb3ZpZGVycy5wdXQocHJvamVjdCwgcHJvdmlkZXIpOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwotCQkJaWYgKHByb3ZpZGVyLmdldEphdmFFRU9iamVjdCgpICE9IG1vZGVsT2JqZWN0KXsKLQkJCQlpZiAobW9kZWxPYmplY3QgPT0gbnVsbCl7Ci0JCQkJCXByb3ZpZGVyLnNldFZhbGlkKGZhbHNlKTsKLQkJCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJCX0KLQotCQkJCXByb3ZpZGVyLnJlaW5pdCgoSmF2YUVFT2JqZWN0KW1vZGVsT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KTsKLQotCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUnVubmFibGUgcmVmcmVzaFRocmVhZCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJSVNlbGVjdGlvbiBzZWwgPSAoKFRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSAoKFRyZWVWaWV3ZXIpIHZpZXdlcikKLQkJCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJCQkJCWNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihwcm9qZWN0KTsKLQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5yZWZyZXNoKHByb2plY3QpOwotCQkJCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLnNldFNlbGVjdGlvbihzZWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyZWZyZXNoVGhyZWFkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBkdXJpbmcgcmVmcmVzaCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbHNDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJcHJvamVjdENoYW5nZWQoZXZlbnQuZ2V0UHJvamVjdCgpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG9uUmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotCQkJCSgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpLnJlZnJlc2goZWxlbWVudCwgdHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIENyZWF0ZSBhbmQgc2NoZWR1bGUgYSBVSSBKb2IgdG8gdXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgKi8KLQkJCQlKb2Igam9iID0gbmV3IFVJSm9iKCJVcGRhdGUgdGhlIE5hdmlnYXRvciBDb250ZW50IFZpZXdlciBKb2IiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCSgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpLnJlZnJlc2goZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBuZXcgSVNjaGVkdWxpbmdSdWxlKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQkJCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsJCi0JCQkJCX0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQkJCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlqb2Iuc2V0UnVsZShydWxlKTsKLQkJCQl9Ci0JCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlncm91cFByb3ZpZGVyc01hcC5jbGVhcigpOwotCQlncm91cENvbnRlbnRQcm92aWRlcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFICYmIGV2ZW50LmdldFJlc291cmNlKCkgIT0gbnVsbCAmJiBldmVudC5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCl7Ci0JCQlncm91cENvbnRlbnRQcm92aWRlcnMucmVtb3ZlKGV2ZW50LmdldFJlc291cmNlKCkpOwkKLQkJCWdyb3VwUHJvdmlkZXJzTWFwLnJlbW92ZShldmVudC5nZXRSZXNvdXJjZSgpKTsJCQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxN2ViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkphdmFFRUFyY2hpdmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5Db21wb25lbnRBcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5JbnRlcmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5wbHVnaW4uV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBTdGFuZGFyZCBvcGVyYXRpb25zIEphdmEgRUUgQWN0aW9uIFByb3ZpZGVyLgotICogSW50cm9kdWNlcyBzdGFuZGFyZCBvcGVyYXRpb25zIGZvciBEZXBsb3ltZW50IGRlc2NyaXB0b3IgdHJlZSBub2Rlcy4gKGxpa2Ugb3BlbikgCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSkVFQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQkKLQlwcml2YXRlIE9wZW5KRUVSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOyAKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSkVFQWN0aW9uUHJvdmlkZXIoKSB7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgYUNvbmZpZykgewkgIAotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5KRUVSZXNvdXJjZUFjdGlvbigpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI3NldEFjdGlvbkNvbnRleHQob3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBhQ29udGV4dCkgewotCQkKLQkJaWYgKGFDb250ZXh0ICE9IG51bGwgJiYgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLQotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0KLQkJCU9iamVjdFtdIGFycmF5ID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWlmIChpc1V0aWxpdHlKYXJzKGFycmF5KSkgewotCQkJCUoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyIHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IChKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcikgYXJyYXlbaV07Ci0JCQkJCW5ld1NlbGVjdGlvbi5hZGRBbGwodXRpbGl0eUphckl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihudWxsKSk7Ci0JCQkJfQotCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0Q29udGV4dChhQ29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNmaWxsQWN0aW9uQmFycyhvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCWlmKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpIAotCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2ZpbGxDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsJCQotCQlpZiAoZ2V0Q29udGV4dCgpPT1udWxsIHx8IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZighYWRhcHRzVG9SZXNvdXJjZShzZWxlY3Rpb24udG9BcnJheSgpKSkgewotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0vLwkJCWNyZWF0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsKLS8vCQkJaWYgKGNyZWF0ZUFjdGlvbi5pc0VuYWJsZWQoKSkKLS8vCQkJCWFNZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIGNyZWF0ZUFjdGlvbik7Ci0JCQlhZGRPcGVuV2l0aE1lbnUoYU1lbnUpOwotCQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRhcHRzVG9SZXNvdXJjZShPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYob2JqZWN0c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChvYmplY3RzW2ldIGluc3RhbmNlb2YgSUFkYXB0YWJsZSAmJiAoKChJQWRhcHRhYmxlKW9iamVjdHNbaV0pLmdldEFkYXB0ZXIoSVJFU09VUkNFX0NMQVNTKSAhPSBudWxsKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzVXRpbGl0eUphcnMoT2JqZWN0W10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXNbaV0gPT0gbnVsbCB8fCBpdGVtc1tpXS5nZXRDbGFzcygpICE9IEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmNsYXNzKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSAKLQkgCi0JcHJpdmF0ZSB2b2lkIGFkZE9wZW5XaXRoTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbj0gZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3M9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCWlmIChzcy5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQotCQlPYmplY3Qgc3JjT2JqZWN0ID0gc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCU9iamVjdCByZXNvdXJjZSA9IG51bGw7Ci0JCQotCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmVzb3VyY2UgPSBvcGVuRU9iamVjdCgoRU9iamVjdCkgc3JjT2JqZWN0KTsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBCZWFuSW50ZXJmYWNlTm9kZSkgewotCQkJcmVzb3VyY2UgPSAoKEJlYW5JbnRlcmZhY2VOb2RlKSBzcmNPYmplY3QpLmdldF9mcW4oKTsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBCZWFuTm9kZSkgewotCQkJcmVzb3VyY2UgPSAoKEJlYW5Ob2RlKSBzcmNPYmplY3QpLmdldEVqYkNsYXNzUXVhbGlmaWVkTmFtZSgpOwotCi0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKFdlYkFwcFByb3ZpZGVyKSBzcmNPYmplY3QpLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewkJCQkKLQkJCQlyZXNvdXJjZSA9IGZpbGU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgewotCQkJcmVzb3VyY2UgPSBvcGVuRU9iamVjdCgoRU9iamVjdCkgKChHcm91cEVKQlByb3ZpZGVyKXNyY09iamVjdCkuZ2V0RWpiSmFyKCkpOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIHNyY09iamVjdCkuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCXJldHVybjsgCi0KLQkJLy8gQ3JlYXRlIGEgbWVudS4KLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnU9IG5ldyBNZW51TWFuYWdlcihXb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5PcGVuQWN0aW9uUHJvdmlkZXJfT3BlbldpdGhNZW51X2xhYmVsLCAKLQkJCQlJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgpOyAKLQkJc3VibWVudS5hZGQobmV3IE9wZW5XaXRoTWVudShwYWdlLCAoSUZpbGUpIHJlc291cmNlKSk7Ci0KLQkJLy8gQWRkIHRoZSBzdWJtZW51LgotCQltZW51LmFwcGVuZFRvR3JvdXAoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgc3VibWVudSk7Ci0JfQotCQotCXByaXZhdGUgSVJlc291cmNlIG9wZW5FT2JqZWN0KEVPYmplY3QgX3NyY09iamVjdCkgewotCQlFT2JqZWN0IHJvID0gKEVPYmplY3QpIF9zcmNPYmplY3Q7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyCi0JCS5nZXRGaWxlKChFT2JqZWN0KSBfc3JjT2JqZWN0KTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZTsKLQkJfSBlbHNlIHsKLQkJCU1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IEFyY2hpdmVVdGlsLmdldE1vZHVsZUZpbGUocm8pOwotCQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCkgewotCQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBtb2R1bGVGaWxlLmdldE9wdGlvbnMoKTsKLQkJCQlpZiAob3B0aW9ucyBpbnN0YW5jZW9mIENvbXBvbmVudEFyY2hpdmVPcHRpb25zKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9ICgoQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnMpIG9wdGlvbnMpCi0JCQkJCS5nZXRDb21wb25lbnQoKTsKLS8vCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoY29tcG9uZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmZpbmRBcmNoaXZlKHJvKTsKLQkJCQlpZihhcmNoaXZlICE9IG51bGwpewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmZpbmRDb21wb25lbnQoYXJjaGl2ZSk7Ci0JCQkJCWlmKGNvbXBvbmVudCAhPSBudWxsKXsKLS8vCQkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGNvbXBvbmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KbmRpUmVmTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KbmRpUmVmTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlhNTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSm5kaVJlZk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IEpOREkgcmVmZXJlbmNlcy4KLSAqIExpa2U6IEVqYiByZWZlcmVuY2UsIEVqYiBMb2NhbCBSZWZlcmVuY2UsIFJlc291cmNlIFJlZmVyZW5jZSwgUmVzb3VyY2UgRW52aXJvbm1lbnQgUmVmZXJlbmNlLAotICogRW52aXJvbm1lbnQgRW50cnksIFNlcnZpY2UgUmVmZXJlbmNlIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEpuZGlSZWZOb2RlIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0gIHByaXZhdGUgZmluYWwgaW50IGtpbmQ7Ci0KLSAgcHVibGljIGNsYXNzIEtJTkRTIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJMT0NBTFJFRiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCUkVGID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlZFTlRSWSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRU5WRU5UWSA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUkVGID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFUkVGID0gNTsKLSAgfQotCi0gIHB1YmxpYyBKbmRpUmVmTm9kZShPYmplY3QgYWRhcHRlck5vZGUsIGludCBraW5kKSB7Ci0gICAgc3VwZXIoYWRhcHRlck5vZGUpOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0KLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLSAgICByZXR1cm4ga2luZDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gKExpc3QpIGFkYXB0ZXJOb2RlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICBjYXNlIEtJTkRTLkVKQkxPQ0FMUkVGOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLkVKQkxPQ0FMX1JFRkVSRU5DRVM7Ci0KLSAgICBjYXNlIEtJTkRTLkVKQlJFRjoKLSAgICAgIHJldHVybiBNZXNzYWdlcy5FSkJfUkVGRVJFTkNFUzsKLSAgICBjYXNlIEtJTkRTLkVOVkVOVFJZOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLkVOVklST01FTlRfRU5UUklFUzsKLSAgICBjYXNlIEtJTkRTLlJFU0VOVkVOVFk6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuUkVTT1VSQ0VfRU5WSVJPTUVOVF9FTlRSSUVTOwotICAgIGNhc2UgS0lORFMuUkVTUkVGOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLlJFU09VUkNFX1JFRkVSRU5DRVM7Ci0gICAgY2FzZSBLSU5EUy5TRVJWSUNFUkVGOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLlNFUlZJQ0VfUkVGRVJFTkNFUzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRleHQoKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICBjYXNlIEtJTkRTLkVKQkxPQ0FMUkVGOnsKLSAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlamJSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgfQotICAgIGNhc2UgS0lORFMuRUpCUkVGOnsKLSAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlamJSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgCi0gICAgY2FzZSBLSU5EUy5FTlZFTlRSWToKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgY2FzZSBLSU5EUy5SRVNFTlZFTlRZOgotICAgICAgewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICBjYXNlIEtJTkRTLlJFU1JFRjoKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgY2FzZSBLSU5EUy5TRVJWSUNFUkVGOgotICAgICAgewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldEltYWdlKCk7Ci0gIH0KLQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9PcGVuSkVFUmVzb3VyY2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvT3BlbkpFRVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2E1ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9PcGVuSkVFUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQWJzdHJhY3RPcGVuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQ29tcG9uZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudC5Hcm91cEFwcENsaWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogT3BlbiBBY3Rpb24gZm9yIERlcGxveW1lbnQgZGVzY3JpcHRvciB0cmVlIG5vZGVzLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuSkVFUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5BY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29tLnNhcC5pZGUuajJlZS51aS5hY3Rpb25zLk9wZW5KRUVSZXNvdXJjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIudWkuamF2YS5FbnRlcnByaXNlQmVhbkphdmFFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9KQVZBX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQudWkuQ29tcGlsYXRpb25Vbml0RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBqYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICovCi0JcHVibGljIE9wZW5KRUVSZXNvdXJjZUFjdGlvbigpIHsKLQkJc3VwZXIoIk9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRKYXZhRWRpdG9yRGVzY3JpcHRvcigpIHsKLQkJaWYgKGphdmFFZGl0b3JEZXNjcmlwdG9yID09IG51bGwpCi0JCQlqYXZhRWRpdG9yRGVzY3JpcHRvciA9IGZpbmRFZGl0b3JEZXNjcmlwdG9yKEpBVkFfRURJVE9SX0lEKTsKLQkJcmV0dXJuIGphdmFFZGl0b3JEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZ2V0QmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yKCkgewotCQlpZiAoYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yID09IG51bGwpCi0JCQliYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IgPSBmaW5kRWRpdG9yRGVzY3JpcHRvcihCQVNFX0pBVkFfRURJVE9SX0lEKTsKLQkJcmV0dXJuIGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQXBwcm9wcmlhdGVFZGl0b3IoU3RyaW5nIGMpIHsKLQkJaWYoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbil7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSAoKFRyZWVQYXRoKSgoVHJlZVNlbGVjdGlvbilnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpLmdldFBhdGhzKClbMF0pLmdldFNlZ21lbnQoMCk7Ci0JCQlJVHlwZSBmaW5kVHlwZTsKLQkJCXRyeSB7Ci0JCQkJZmluZFR5cGUgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZmluZFR5cGUoYyk7Ci0JCQkJaWYoZmluZFR5cGUgPT0gbnVsbCl7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGZpbmRUeXBlLmdldFJlc291cmNlKCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKRUVVSVBsdWdpbi5sb2dFcnJvcigiRXJyb3IgZHVyaW5nIG9wZW4gZWRpdG9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKElWaXJ0dWFsQ29tcG9uZW50IGMpIHsKLQkJaWYgKGMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQllZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IENvbXBvbmVudEVkaXRvcklucHV0KGMpLAotCQkJCQljdXJyZW50RGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZWRpdG9yKQotCQkJCS5zZWxlY3RSZXZlYWwoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCS5vcGVuRXJyb3IoCi0JCQkJCXBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJSjJFRVVJTWVzc2FnZXMKLQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJSmF2YVVJLm9wZW5JbkVkaXRvcihlbGVtZW50KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCS5vcGVuRXJyb3IoCi0JCQkJCXBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJSjJFRVVJTWVzc2FnZXMKLQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgotCQl9Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKElSZXNvdXJjZSByKSB7Ci0JCWlmIChyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlTdHJpbmcgSUQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihyLmdldExvY2F0aW9uKCkKLQkJCQkJLnRvUG9ydGFibGVTdHJpbmcoKSkuZ2V0SWQoKTsKLQkJCWVkaXRvciA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSkgciksIElEKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZWRpdG9yKQotCQkJCS5zZWxlY3RSZXZlYWwoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCS5vcGVuRXJyb3IoCi0JCQkJCXBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJSjJFRVVJTWVzc2FnZXMKLQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVzZXIgaGFzIGludm9rZWQgdGhpcyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICghaXNFbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgewotCQkJKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIHNyY09iamVjdCkub3BlbkluRWRpdG9yKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vW0J1ZyAyNDA1MTJdIGRlYWwgd2l0aCBpZiBhbnkgb2YgdGhlc2Ugbm9kZSB0eXBlcyBuZG8gbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBjbGFzcwotCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4gfHwKLQkJCQlzcmNPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbiB8fAotCQkJCXNyY09iamVjdCBpbnN0YW5jZW9mIEVudGl0eUJlYW4gfHwKLQkJCQlzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0IHx8Ci0JCQkJc3JjT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyIHx8Ci0JCQkJc3JjT2JqZWN0IGluc3RhbmNlb2YgTGlzdGVuZXIpewotCQkJCi0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiggc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4gKXsKLQkJCQlTZXNzaW9uQmVhbiBiZWFuID0gKFNlc3Npb25CZWFuKXNyY09iamVjdDsKLQkJCQluYW1lID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQkJfSBlbHNlIGlmKHNyY09iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKXsKLQkJCQlNZXNzYWdlRHJpdmVuQmVhbiAgYmVhbiA9IChNZXNzYWdlRHJpdmVuQmVhbilzcmNPYmplY3Q7Ci0JCQkJbmFtZSA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCX0gZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKXsKLQkJCQlFbnRpdHlCZWFuIGJlYW4gPSAoRW50aXR5QmVhbilzcmNPYmplY3Q7Ci0JCQkJbmFtZSA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCX0gZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KXsKLQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldClzcmNPYmplY3Q7Ci0JCQkJbmFtZSA9IHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCk7Ci0JCQl9IGVsc2UgaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyKSB7Ci0JICAgICAgICAJRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpc3JjT2JqZWN0OwkJCi0JICAgICAgICAJbmFtZSA9IGZpbHRlci5nZXRGaWx0ZXJDbGFzcygpOwotCQkJfSBlbHNlIGlmKHNyY09iamVjdCBpbnN0YW5jZW9mIExpc3RlbmVyKXsKLQkgICAgICAgIAlMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcilzcmNPYmplY3Q7Ci0JICAgICAgICAJbmFtZSA9IGxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKTsKLQkJCX0KLQkJCQotCQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClzcmNPYmplY3QpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsJCQkKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmKGphdmFQcm9qZWN0LmV4aXN0cygpKXsKLQkJCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvL2lmIG5hbWUgaXMgbnVsbCB0aGVuIGNhbid0IGdldCB0eXBlCi0JCQkJCWlmKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCBuYW1lICk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vaWYgdHlwZSBpcyBudWxsIHRoZW4gY2FuJ3Qgb3BlbiBpdHMgZWRpdG9yLCBzbyBvcGVuIGVkaXRvciBmb3IgdGhlIHJlc291cmNlCi0JCQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQlFZGl0b3JVdGlsaXR5Lm9wZW5JbkVkaXRvcihjdSk7Ci0JCQkJCX0gZWxzZXsKLQkJCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKRUVVSVBsdWdpbi5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlKRUVVSVBsdWdpbi5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkKLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCW9wZW5FT2JqZWN0KChFT2JqZWN0KSBzcmNPYmplY3QpOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEJlYW5JbnRlcmZhY2VOb2RlKSB7Ci0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoKChCZWFuSW50ZXJmYWNlTm9kZSkgc3JjT2JqZWN0KS5nZXRfZnFuKCkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEJlYW5Ob2RlKSB7Ci0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoKChCZWFuTm9kZSkgc3JjT2JqZWN0KS5nZXRFamJDbGFzc1F1YWxpZmllZE5hbWUoKSk7Ci0JCQlyZXR1cm47Ci0KLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoV2ViQXBwUHJvdmlkZXIpIHNyY09iamVjdCkuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7CQkJCQotCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihmaWxlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgewotCQkJb3BlbkVPYmplY3QoKEVPYmplY3QpICgoR3JvdXBFSkJQcm92aWRlcilzcmNPYmplY3QpLmdldEVqYkphcigpKTsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChHcm91cEVBUlByb3ZpZGVyKSBzcmNPYmplY3QpLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihmaWxlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJIGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCQlJRmlsZSBmaWxlID0gKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBzcmNPYmplY3QpLmdldERERmlsZSgpOwotCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGZpbGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfWVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKQotCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKFdvcmtiZW5jaFJlc291cmNlSGVscGVyCi0JCQkJCS5nZXRGaWxlKChSZXNvdXJjZSkgc3JjT2JqZWN0KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FT2JqZWN0KEVPYmplY3QgX3NyY09iamVjdCkgewotCQlFT2JqZWN0IHJvID0gKEVPYmplY3QpIF9zcmNPYmplY3Q7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyCi0JCS5nZXRGaWxlKChFT2JqZWN0KSBfc3JjT2JqZWN0KTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihyZXNvdXJjZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSBBcmNoaXZlVXRpbC5nZXRNb2R1bGVGaWxlKHJvKTsKLQkJCWlmIChtb2R1bGVGaWxlICE9IG51bGwpIHsKLQkJCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbW9kdWxlRmlsZS5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBDb21wb25lbnRBcmNoaXZlT3B0aW9ucykgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoKENvbXBvbmVudEFyY2hpdmVPcHRpb25zKSBvcHRpb25zKQotCQkJCQkuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuZmluZEFyY2hpdmUocm8pOwotCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCl7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuZmluZENvbXBvbmVudChhcmNoaXZlKTsKLQkJCQkJaWYoY29tcG9uZW50ICE9IG51bGwpewotCQkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGNvbXBvbmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmVhY3QgdG8gdGhlIGNoYW5nZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3Rpb24KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCB0aGUgc3VwZXIgbWV0aG9kIG11c3QgYWx3YXlzIGJlIGludm9rZWQuCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWwKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBNYWtlIHN1cmUgdGhpcyBpcyBvbmUgb2YgdGhlIHNlbGVjdGlvbnMgd2UgY2FuIGhhbmRsZSwKLQkJLy8gdGhlbiBzZXQgdGhlIHNvdXJjZSBvYmplY3QgYXMgaXMuIFRoZSBydW4oKSB3aWxsIGRvIHRoZSBoYXJkIHN0dWZmLgotCQlPYmplY3Qgb2JqID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJc2V0VGV4dCgiT3BlbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gZ2V0SmF2YUVkaXRvckRlc2NyaXB0b3IoKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmVhbkxpbmspCi0JCQljdXJyZW50RGVzY3JpcHRvciA9IGdldEJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KSBvYmopOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmKCgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKSAhPSBudWxsKXsKLQkJCQkJU3RyaW5nIG5hbWUgPSAobmV3IFBhdGgoKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCQkJLnRvU3RyaW5nKCkpKS5sYXN0U2VnbWVudCgpOwotCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IobmFtZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChSZXNvdXJjZSkgb2JqKTsKLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJY29udGVudFR5cGUpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIG9iaikuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9ZWxzZXsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIG9iaikuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9ZWxzZXsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChXZWJBcHBQcm92aWRlcikgb2JqKS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCZWFuTm9kZSkgewotCi0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCUphdmFFRU9iamVjdCBlbnRlcnByaXNlQmVhbiA9ICgoQmVhbk5vZGUpIG9iaikuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KWVudGVycHJpc2VCZWFuKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZigoKEVPYmplY3QpIGVudGVycHJpc2VCZWFuKS5lUmVzb3VyY2UoKSAhPSBudWxsKXsKLQkJCQkJU3RyaW5nIG5hbWUgPSAobmV3IFBhdGgoKChFT2JqZWN0KSBlbnRlcnByaXNlQmVhbikuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9TdHJpbmcoKSkpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihuYW1lLCBudWxsKTsKLQkJCQl9Ci0JCQl9ICAgICAgCi0JCX0gZWxzZSAgaWYgKG9iaiBpbnN0YW5jZW9mIEJlYW5JbnRlcmZhY2VOb2RlKSB7Ci0KLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJSmF2YUVFT2JqZWN0IGJlYW5JbnRlcmZhY2UgPSAoSmF2YUVFT2JqZWN0KSAoKEJlYW5JbnRlcmZhY2VOb2RlKSBvYmopLmdldEFkYXB0ZXJOb2RlKCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdCliZWFuSW50ZXJmYWNlKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZigoKEVPYmplY3QpIGJlYW5JbnRlcmZhY2UpLmVSZXNvdXJjZSgpICE9IG51bGwpewotCQkJCQlTdHJpbmcgbmFtZSA9IChuZXcgUGF0aCgoKEVPYmplY3QpIGJlYW5JbnRlcmZhY2UpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCkpKS5sYXN0U2VnbWVudCgpOwotCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IobmFtZSwgbnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGZxbiA9ICgoQmVhbkludGVyZmFjZU5vZGUpIG9iaikuZ2V0X2ZxbigpOwotCQkJCQlpZiAoZnFuICE9IG51bGwpewotCQkJCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKCgoQmVhbkludGVyZmFjZU5vZGUpIG9iaikuZ2V0VGV4dCgpLCBudWxsKTsKLS8vCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNldEF0dHJpYnV0ZXNGcm9tRGVzY3JpcHRvcigpOwotCQlzcmNPYmplY3QgPSBvYmo7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1M2MwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci0KLS8qKgotICogV2ViIDIuNSBDb250ZW50IHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBjb250ZW50IHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgV2ViMjVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBKRUU1Q29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQotCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChJUHJvamVjdC5jbGFzcy5pc0luc3RhbmNlKGFQYXJlbnRFbGVtZW50KSkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgYVBhcmVudEVsZW1lbnQ7Ci0JCQkJQWJzdHJhY3RHcm91cFByb3ZpZGVyIGNhY2hlZENvbnRlbnRQcm92aWRlciA9IGdldENhY2hlZENvbnRlbnRQcm92aWRlcihwcm9qZWN0KTsKLQkJCQlpZiAoY2FjaGVkQ29udGVudFByb3ZpZGVyLmlzVmFsaWQoKSl7Ci0JCQkJCWNoaWxkcmVuLmFkZChjYWNoZWRDb250ZW50UHJvdmlkZXIpOwotCQkJCX0KLQkJfSBlbHNlIGlmIChXZWJBcHBQcm92aWRlci5jbGFzcy5pc0luc3RhbmNlKGFQYXJlbnRFbGVtZW50KSl7Ci0JCQljaGlsZHJlbi5hZGRBbGwoKChXZWJBcHBQcm92aWRlcikgYVBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCkpOwotCQl9IGVsc2UgaWYgKEFic3RyYWN0R3JvdXBQcm92aWRlci5jbGFzcy5pc0luc3RhbmNlKGFQYXJlbnRFbGVtZW50KSl7Ci0JCQljaGlsZHJlbi5hZGRBbGwoKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJcmV0dXJuICgoV2ViQXBwUHJvdmlkZXIpZWxlbWVudCkuaXNWYWxpZCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldE5ld0NvbnRlbnRQcm92aWRlckluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBXZWJBcHBQcm92aWRlcigoV2ViQXBwKSBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCksIHByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY1ZTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXJ0aWZhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFdlYiAyLjUgTGFiZWwgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGxhYmVsIHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGRlY29yYXRpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIFdlYjI1TGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVMYWJlbFByb3ZpZGVyIHsKLQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAoKFdlYkFwcFByb3ZpZGVyKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpewotCQkJcmV0ID0gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJcmV0ID0gR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyLmdldFNlcnZsZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0TWFwcGluZyl7Ci0JCQlyZXQgPSBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmdldFNlcnZsZXRNYXBwaW5nSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsdGVyKXsKLQkJCXJldCA9IEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5nZXRGaWx0ZXJzSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdGVuZXIpewotCQkJcmV0ID0gR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlci5nZXRMaXN0ZW5lcnNJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nKXsKLQkJCXJldCA9IEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5nZXRGaWx0ZXJNYXBwaW5nSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXJ0aWZhY3ROb2RlKXsKLQkJICByZXQgPSAoKFdlYkFydGlmYWN0Tm9kZSllbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFcnJvclBhZ2UpewotCQkgIHJldCA9IEdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlci5nZXRFcnJvclBhZ2VzSW1hZ2UoKEVycm9yUGFnZSllbGVtZW50KTsgCi0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtVmFsdWUpewotICAgICAgICAgIHJldCA9IEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5nZXRDb250ZXh0UGFyYW1zSW1hZ2UoKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0ID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCXJldCA9ICgoV2ViQXBwUHJvdmlkZXIpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKXsKLQkJCXJldCA9ICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJcmV0ID0gKChTZXJ2bGV0KSBlbGVtZW50KS5nZXRTZXJ2bGV0TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0TWFwcGluZykgewotCQkJcmV0ID0gZ2V0U2VydmxldE1hcHBpbmdEaXNwbGF5KChTZXJ2bGV0TWFwcGluZykgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbHRlcil7Ci0JCQlyZXQgPSAoKEZpbHRlcikgZWxlbWVudCkuZ2V0RmlsdGVyTmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0ZW5lcil7Ci0JCQlyZXQgPSAoKExpc3RlbmVyKSBlbGVtZW50KS5nZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmcpIHsKLQkJCXJldCA9IGdldEZpbHRlck1hcHBpbmdEaXNwbGF5KChGaWx0ZXJNYXBwaW5nKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXJ0aWZhY3ROb2RlKSB7Ci0gICAgICAgICAgICByZXQgPSAoKFdlYkFydGlmYWN0Tm9kZSkgZWxlbWVudCkuZ2V0VGV4dCgpOyAKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRXJyb3JQYWdlICl7Ci0gICAgICAgIAlFcnJvclBhZ2UgcGFnZSA9ICgoRXJyb3JQYWdlKSBlbGVtZW50KTsKLQkJCWlmIChwYWdlLmdldEVycm9yQ29kZSgpID09IG51bGwpIHsKLQkJCQlyZXQgPSBwYWdlLmdldEV4Y2VwdGlvblR5cGUoKSArICIgLT4gIiArIHBhZ2UuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXQgPSBwYWdlLmdldEVycm9yQ29kZSgpICsgIiAtPiAiICsgcGFnZS5nZXRMb2NhdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtVmFsdWUpewotICAgICAgICAJcmV0ID0gKChQYXJhbVZhbHVlKWVsZW1lbnQpLmdldFBhcmFtTmFtZSgpICsgIiA9ICIgKyAoKFBhcmFtVmFsdWUpZWxlbWVudCkuZ2V0UGFyYW1WYWx1ZSgpOy8vJE5PTi1OTFMtMSQgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlyZXQgPSBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsdGVyTWFwcGluZ0Rpc3BsYXkoRmlsdGVyTWFwcGluZyBlbGVtZW50KSB7Ci0JCVVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm5zID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0VXJsUGF0dGVybnMoKS5zaXplKCkgPiAwKXsKLQkJCXVybFBhdHRlcm5zID0gKFVybFBhdHRlcm5UeXBlKSBlbGVtZW50LmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQkJdmFsdWUgPSB1cmxQYXR0ZXJucy5nZXRWYWx1ZSgpOwotCQl9ZWxzZXsKLQkJCUZlYXR1cmVNYXAgZ3JvdXAgPSBlbGVtZW50LmdldEdyb3VwKCk7Ci0JCQlpZiAoZ3JvdXAuc2l6ZSgpID4wKSB7Ci0JCQkJRW50cnkgZW50cnkgPSBncm91cC5nZXQoMCk7Ci0JCQkJdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlICsgIi0+ICIgKyBlbGVtZW50LmdldEZpbHRlck5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nRGlzcGxheShTZXJ2bGV0TWFwcGluZyBlbGVtZW50KSB7Ci0JCVVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm5zID0gKFVybFBhdHRlcm5UeXBlKSBlbGVtZW50LmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQlyZXR1cm4gdXJsUGF0dGVybnMuZ2V0VmFsdWUoKSArICItPiAiICsgZWxlbWVudC5nZXRTZXJ2bGV0TmFtZSgpOyAvLyROT04tTkxTLTEkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9hcHBjbGllbnQvR3JvdXBBcHBDbGllbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9hcHBjbGllbnQvR3JvdXBBcHBDbGllbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFlNTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvYXBwY2xpZW50L0dyb3VwQXBwQ2xpZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBBcHBsaWNhdGlvbiBDbGllbnQgNS4wIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEFwcENsaWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0KLQotCXB1YmxpYyBHcm91cEFwcENsaWVudFByb3ZpZGVyKEFwcGxpY2F0aW9uQ2xpZW50IGphdmFlZSwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihqYXZhZWUpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1JFTEFUSVZFX1BBVEggPSAiTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBBUFBfQ0xJRU5UNTA7Ci0KLQlwcml2YXRlIElGaWxlIGRkRmlsZTsKLQotCi0JcHJpdmF0ZSBBcHBsaWNhdGlvbkNsaWVudCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMuamF2YWVlICE9IG51bGwpCi0JCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KSB0aGlzLmphdmFlZTsKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyCi0JCS5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWxPYmplY3QgPSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKRUVVSVBsdWdpbi5sb2dFcnJvcigiRXJyb3IgZHVyaW5nIGluaXRpYWxpemluZyBtb2RlbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAobW9kZWxPYmplY3QgIT0gbnVsbCAmJiBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KSB7Ci0JCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KSBtb2RlbE9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGhpcy5wcm9qZWN0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUiArIHRoaXMucHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChqYXZhZWUgIT0gbnVsbCl7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0RWpiUmVmcygpKTsKLQkJCS8vcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0UmVzb3VyY2VFbnZSZWZzKCkpOwotCQkJcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldEVudkVudHJpZXMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJCS8vcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChBUFBfQ0xJRU5UNTAgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UNTApOwotCQkJQVBQX0NMSUVOVDUwID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIEFQUF9DTElFTlQ1MDsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldERERmlsZSgpIHsKLQkJaWYgKGRkRmlsZSAhPSBudWxsKXsKLQkJCXJldHVybiBkZEZpbGU7Ci0JCX0KLQkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpLmdldFJvb3RGb2xkZXIoKTsKLQkJZGRGaWxlID0gdmlydHVhbEZvbGRlci5nZXRGaWxlKFBST0pFQ1RfUkVMQVRJVkVfUEFUSCkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJcmV0dXJuIGRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJUHJvamVjdC5jbGFzcyA9PSBhZGFwdGVyKXsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRkNGJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0FkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkRlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FQVJGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQWJzdHJhY3RFYXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5CdW5kbGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlckFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEhhbmRsZXMgZHJvcCBvZiBKRUUgcmVzb3VyY2VzIG9uIEVBUiBwcm9qZWN0IHRodXMgYWRkaW5nIHRoZW0gYXMgbW9kdWxlcy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCBleHRlbmRzIENvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBudWxsOwotCXByaXZhdGUgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGliRGlyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUNvbmZsaWN0cyA9IGZhbHNlOwotCi0JcHVibGljIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSBhVHJhbnNmZXJUeXBlKSB7Ci0JCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGFUcmFuc2ZlclR5cGUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGhhbmRsZURyb3AoQ29tbW9uRHJvcEFkYXB0ZXIgYURyb3BBZGFwdGVyLCBEcm9wVGFyZ2V0RXZlbnQgYURyb3BUYXJnZXRFdmVudCwgZmluYWwgT2JqZWN0IGFUYXJnZXQpIHsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoYURyb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpKSkgewotCQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkJcmVzb2x2ZUNvbmZsaWN0cyA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHNvdXJjZU9iamVjdCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoc291cmNlT2JqZWN0IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBzb3VyY2VPYmplY3Q7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIGEgcmVmZXJlbmNlIGlzIG1vdmVkIGZyb20gdGhlIHJvb3QgdG8gdGhlIGxpYgotCQkJCQkgKiBkaXJlY3RvcnkgY2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIHByb2plY3RzIHJlZmVyZW5jZWQgYnkKLQkJCQkJICogdGhlIGVhciByZWZlcmVuY2luZyB0aGUgc2FtZSBsaWIKLQkJCQkJICovCi0JCQkJCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwICYmICFsaWJEaXIuZXF1YWxzKHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkpKSB7Ci0JCQkJCQlpZiAoaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKHJlZmVyZW5jZSkpIHsKLQkJCQkJCQlEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGRsZyA9IG5ldyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKGdldFNoZWxsKCksIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMik7Ci0JCQkJCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5CVE5fSURfQ0FOQ0VMKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXNvbHZlQ29uZmxpY3RzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobGliRGlyLmxlbmd0aCgpID4gMCl7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KHNvdXJjZU9iamVjdCk7Ci0JCQkJCQlpZiAoaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKHByb2plY3RUb0FkZCkpIHsKLQkJCQkJCQlEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGRsZyA9IG5ldyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKGdldFNoZWxsKCksIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMik7Ci0JCQkJCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5CVE5fSURfQ0FOQ0VMKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXNvbHZlQ29uZmxpY3RzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlKb2IgYWRkUHJvamVjdFRvRWFySm9iID0gbmV3IEpvYihnZXRKb2JUaXRsZShlYXJDb21wb25lbnQpKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQotCQkJCQlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzVG9BZGQgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJCQlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCi0JCQkJCWZvciAoSXRlcmF0b3Igc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHNvdXJjZU9iamVjdCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQkJaWYgKHNvdXJjZU9iamVjdCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IGphclBhY2thZ2VGcmFnbWVudCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBzb3VyY2VPYmplY3Q7Ci0KLQkJCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgdHlwZSArIGphclBhY2thZ2VGcmFnbWVudC5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJY29tcG9uZW50c1RvQWRkLmFkZChhcmNoaXZlKTsKLQkJCQkJCX0gZWxzZSBpZiAoc291cmNlT2JqZWN0IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHNvdXJjZU9iamVjdDsKLQkJCQkJCQlpZiAocmVzb2x2ZUNvbmZsaWN0cykgewotCQkJCQkJCQlzdGF0dXMgPSByZXNvbHZlQ29uZmxpY3RzKHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJY29tcG9uZW50c1RvUmVtb3ZlLmFkZChhcmNoaXZlKTsKLQkJCQkJCQlzdGF0dXMgPSByZW1vdmVDb21wb25lbnRzRnJvbUVhcihjb21wb25lbnRzVG9SZW1vdmUsIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQljb21wb25lbnRzVG9BZGQuYWRkKGFyY2hpdmUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KHNvdXJjZU9iamVjdCk7Ci0JCQkJCQkJaWYgKHJlc29sdmVDb25mbGljdHMpIHsKLQkJCQkJCQkJc3RhdHVzID0gcmVzb2x2ZUNvbmZsaWN0cyhDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0VG9BZGQpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNvbXBvbmVudHNUb0FkZC5hZGQoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdFRvQWRkKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIWNvbXBvbmVudHNUb0FkZC5pc0VtcHR5KCkpIHsKLQkJCQkJCXN0YXR1cyA9IGFkZENvbXBvbmVudHNUb0Vhcihjb21wb25lbnRzVG9BZGQsIGxpYkRpcik7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCi0JCQl9OwotCQkJc2VydmljZS5zaG93SW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBhZGRQcm9qZWN0VG9FYXJKb2IpOwotCQkJYWRkUHJvamVjdFRvRWFySm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlhZGRQcm9qZWN0VG9FYXJKb2Iuc2NoZWR1bGUoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlsaWJEaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpIHx8IFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJZWFyUHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KTsKLQkJCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQl9Ci0JCQkJZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCQkJaW50IGVhclZlcnNpb24gPSBnZXRFYXJWZXJzaW9uKGVhclByb2plY3QpOwotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBCdW5kbGVkTm9kZSAmJiAoKEJ1bmRsZWROb2RlKSB0YXJnZXQpLmdldEJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSgpID09IG51bGwpIHsKLQkJCQkJbGliRGlyID0gKChBcHBsaWNhdGlvbikgTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpKS5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCQkJCWlmIChsaWJEaXIgPT0gbnVsbCkgewotCQkJCQkJbGliRGlyID0gSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkvL2NoZWNrIGlmIGxpYnJhcnkgaXMgcGh5c2ljYWxseSBwcmVzZW50IGluIHRoZSBFYXIgcGF0aAotCQkJCQlpZiAoSVZpcnR1YWxSZWZlcmVuY2UuY2xhc3MuaXNJbnN0YW5jZShuZXh0KSl7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKChJVmlydHVhbFJlZmVyZW5jZSluZXh0KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpICYmIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmNsYXNzLmlzSW5zdGFuY2UocmVmZXJlbmNlZENvbXBvbmVudCkpewotCQkJCQkJCWlmIChpc1BoeXNpY2FsbHlBZGRlZCgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpKXsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgaWYgd2UgdHJ5IHRvIGFkZCBhIEphclBhY2thZ2VGcmFnbWVudCB0aGF0IGlzCi0JCQkJCSAqIGFscmVhZHkgcmVmZXJlbmNlZAotCQkJCQkgKi8KLQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IGphciA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBuZXh0OwotCQkJCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgOiBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpKSB7Ci0JCQkJCQkJaWYgKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyhqYXIuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgaWYgd2UgdHJ5IHRvIGFkZCBhIG1vZHVsZSB0aGF0IGlzIGFscmVhZHkKLQkJCQkJICogcmVmZXJlbmNlZCBieSB0aGUgZWFyIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGFsbG93IHRvCi0JCQkJCSAqIGNoYW5nZSBpdHMgbG9jYXRpb24gZnJvbSB0aGUgcm9vdCB0byB0aGUgbGliIGRpcmVjdG9yeQotCQkJCQkgKiBhbmQgdGhlIG9wcG9zaXRlLgotCQkJCQkgKi8KLQkJCQkJSVByb2plY3QgcHJvamVjdFRvQWRkID0gZ2V0UHJvamVjdChuZXh0KTsKLQkJCQkJaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RUb0FkZCkpOwotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCA6IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpIHsKLQkJCQkJCQlpZiAocmVmZXJlbmNlZFByb2plY3QgPT0gcHJvamVjdFRvQWRkKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCXN0YXR1cyA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKTsKLQkJCQkJfQotCi0JCQkJCWlmICgoc3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TWF5QmVBZGRlZChlYXJQcm9qZWN0LCBwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pKS5pc09LKCkpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUGh5c2ljYWxseUFkZGVkKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQl0cnkgewotCQkJY29tcG9uZW50LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TWF5QmVBZGRlZChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgcHJvamVjdFRvQWRkID09IG51bGwgfHwgZWFyVmVyc2lvbiA8IDApCi0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfLCBudWxsKTsKLQkJZWxzZSBpZiAoIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE5MUy5iaW5kKE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV8sIGVhclByb2plY3QuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoIXByb2plY3RUb0FkZC5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF8sIG51bGwpOwotCQl9Ci0KLQkJSVN0YXR1cyBpc1ZhbGlkID0gdmFsaWRhdGVQcm9qZWN0VG9BZGQocHJvamVjdFRvQWRkLCBlYXJWZXJzaW9uKTsKLQkJaWYgKCFpc1ZhbGlkLmlzT0soKSkgewotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gLTEgb24gZXJyb3IKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEVhclZlcnNpb24oSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpbnQgZWFyVmVyc2lvbiA9IC0xOwotCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0KTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGVhclByb2plY3QpOwotCi0JCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCWRvdWJsZSBkb3VibGUxID0gRG91YmxlLnBhcnNlRG91YmxlKGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJZWFyVmVyc2lvbiA9IChpbnQpIChkb3VibGUxICogMTApOwotCQkJfSBlbHNlIHsKLQkJCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IoIkNvdWxkIG5vdCBhY3F1aXJlIG1vZGVsIGVsZW1lbnRzIGZvciBwcm9qZWN0IFwiIiArIGVhclByb2plY3QuZ2V0TmFtZSgpICsgIlwiLiIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZTEuZ2V0TWVzc2FnZSgpIDogZTEudG9TdHJpbmcoKTsKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUxKTsKLQkJfQotCi0JCXJldHVybiBlYXJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmYWNldGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNFYXJGYWNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZTEuZ2V0TWVzc2FnZSgpIDogZTEudG9TdHJpbmcoKTsKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUxKTsKLQkJfQotCQlyZXR1cm4gZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgY2FsY3VsYXRlVmFsaWRQcm9qZWN0TmFtZShmaW5hbCBTdHJpbmcgb3JpZ2luYWxOYW1lKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgdmFsaWROYW1lID0gb3JpZ2luYWxOYW1lOwotCQlpbnQgY291bnQgPSAxOwotCQl3aGlsZSAocm9vdC5nZXRQcm9qZWN0KHZhbGlkTmFtZSkuZXhpc3RzKCkpIHsKLQkJCXZhbGlkTmFtZSA9IG9yaWdpbmFsTmFtZSArIGNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvYlRpdGxlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfLCBlYXJDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyBub3QgYW4gRUFSIGl0c2VsZgotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgewotCQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YWZhY2V0dmVyc2lvbiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoamF2YWZhY2V0dmVyc2lvbiwgbnVsbCwgbnVsbCk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gdXRpbGl0eWZhY2V0dmVyc2lvbiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQkJCQlmYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KHV0aWxpdHlmYWNldHZlcnNpb24sIG51bGwsIG51bGwpOwotCQkJfQotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCkpCi0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQllbHNlCi0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgdG8gYWRkIGlzIHdpdGggSmF2YSBFRSB2ZXJzaW9uIGVxdWFsIG9yCi0JCQkvLyBsZXNzZXIgdGhhbiB0aGF0IG9mIHRoZSBFQVIKLQkJCVN0cmluZyB2ZXJTdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24ocHJvamVjdFRvQWRkKTsKLQkJCWlmICh2ZXJTdHIgIT0gbnVsbCkgewotCQkJCWludCB2ZXJzaW9uOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlclN0cik7Ci0KLQkJCQlpZiAodmVyc2lvbiA+IGVhclZlcnNpb24pCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCWVsc2UKLQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJZWxzZQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcHJvamVjdCA9ICgoQWJzdHJhY3RFYXJOb2RlKSBlbGVtZW50KS5nZXRFYXJQcm9qZWN0KCk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCXByb2plY3QgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIGVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCXByb2plY3QgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUZpbGUgYXNzb2NpYXRlZEZpbGUgPSAoKEoyRUVJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmdldEFzc29jaWF0ZWRGaWxlKCk7Ci0JCQkJaWYgKGFzc29jaWF0ZWRGaWxlICE9IG51bGwpCi0JCQkJCXByb2plY3QgPSBhc3NvY2lhdGVkRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFVSSShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCVN0cmluZyBuYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfRUFSOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfUkFSOwotCQl9IGVsc2UgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb25mbGljdGluZ1Byb2plY3RJbk1ldGFJbmYoT2JqZWN0IGxpYikgewotCQlJUHJvamVjdCBsaWJQcm9qID0gbnVsbDsgCi0JCQlpZiAobGliIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlsaWJQcm9qID0gKElQcm9qZWN0KSBsaWI7IAotCQkJfSBlbHNlIGlmIChsaWIgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCWxpYlByb2ogPSAoKElWaXJ0dWFsQ29tcG9uZW50KSBsaWIpLmdldFByb2plY3QoKTsgCi0JCQl9IGVsc2UgaWYgKGxpYiBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKXsKLQkJCQlsaWJQcm9qID0gKChJVmlydHVhbFJlZmVyZW5jZSkgbGliKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQlpZihsaWJQcm9qID09IG51bGwpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQl0cnkgewotCQkJSVByb2plY3RbXSBlYXJSZWZQcm9qZWN0cyA9IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUmVmUHJvamVjdHNbaV0pICYmICFlYXJSZWZQcm9qZWN0c1tpXS5lcXVhbHMobGliUHJvaikpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY21wMSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclJlZlByb2plY3RzW2ldKTsKLQkJCQkJaWYgKGNtcDEgPT0gbnVsbCl7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjbXAxLmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhsaWJQcm9qKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaW50IGsgPSAwOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBhZGRDb21wb25lbnRzVG9FYXIoTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50cywgU3RyaW5nIGxpYkRpcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUlEYXRhTW9kZWwgZGF0YW1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0KLQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQltb2R1bGVDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGl0ci5uZXh0KCk7Ci0JCQljb21wb25lbnRUb1VSSU1hcC5wdXQobW9kdWxlQ29tcG9uZW50LCBnZXREZWZhdWx0VVJJKG1vZHVsZUNvbXBvbmVudCkpOwotCQl9Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudHMpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wb25lbnRUb1VSSU1hcCk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBsaWJEaXIpOwotCQl0cnkgewotCQkJcmV0dXJuIGRhdGFtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlbW92ZUNvbXBvbmVudHNGcm9tRWFyKExpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFN0cmluZyBsaWJEaXIpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudHMpOwotCQl0cnkgewotCQkJc3RhdHVzID0gZGF0YW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlUmVmZXJlbmNlcyhjb21wb25lbnRzLCBsaWJEaXIsIGVhckNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVtb3ZlUmVmZXJlbmNlcyhMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzLCBTdHJpbmcgbGliRGlyLCBJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gc291cmNlQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWYgOiByZWZzKSB7Ci0JCQlyZWYuZ2V0UnVudGltZVBhdGgoKTsKLQkJfQotCQlNYXAgY29tcG9uZW50VG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgaXRyLm5leHQoKTsKLQkJCWNvbXBvbmVudFRvVVJJTWFwLnB1dChtb2R1bGVDb21wb25lbnQsIGdldERlZmF1bHRVUkkobW9kdWxlQ29tcG9uZW50KSk7Ci0JCX0KLQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXApOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50cyk7Ci0JCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIGxpYkRpcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVzb2x2ZUNvbmZsaWN0cyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGVhclJlZlByb2plY3RzID0gZWFyUHJvamVjdC5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJSZWZQcm9qZWN0c1tpXSkpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY21wMSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclJlZlByb2plY3RzW2ldKTsKLQkJCQkJaWYoY21wMSA9PSBudWxsKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNtcDEuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoY29tcG9uZW50KSkgewotCQkJCQkJCUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHJlbW92ZVJlZmVyZW5jZXMoY29tcG9uZW50cywgcmVmc1tqXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCksIHJlZnNbal0uZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZW1vdmVNYW5pZmVzdERlcGVuZGVuY3kocmVmc1tqXS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSwgcmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaW50IGsgPSAwOwotCQl9Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hbmlmZXN0RGVwZW5kZW5jeShmaW5hbCBJVmlydHVhbENvbXBvbmVudCBzb3VyY2UsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBzb3VyY2VQcm9qTmFtZSA9IHNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgdGFyZ2V0UHJvak5hbWU7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCXRhcmdldFByb2pOYW1lID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHRhcmdldCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGF0aFNlZ21lbnRzID0gdGFyZ2V0UHJvak5hbWUuc3BsaXQoIiIgKyBJUGF0aC5TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCi0JCQl0YXJnZXRQcm9qTmFtZSA9IHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV07Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRQcm9qTmFtZSA9IHRhcmdldC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWZpbmFsIElGaWxlIG1hbmlmZXN0bWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUoc291cmNlLmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIEFyY2hpdmVNYW5pZmVzdCBtZiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG1mID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIElEYXRhTW9kZWwgdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgc291cmNlUHJvak5hbWUpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GSUxFLCBtYW5pZmVzdG1mKTsKLQkJU3RyaW5nW10gY3AgPSBtZi5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJTGlzdCBjcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBjcFRvUmVtb3ZlID0gKHRhcmdldFByb2pOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpKSA/IAotCQkJCXRhcmdldFByb2pOYW1lIDogdGFyZ2V0UHJvak5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNwW2ldLmVxdWFscyhjcFRvUmVtb3ZlKSkgewotCQkJCWNwTGlzdC5hZGQoY3BbaV0pOwotCQkJfQotCQl9Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCwgY3BMaXN0KTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWUxNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmRuZDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRXh0ZW5zaW9ucyB7Ci0KLQlTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfSkFSID0gIi5qYXIiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBET1RfUkFSID0gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERPVF9FQVIgPSAiLmVhciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0Fic3RyYWN0RWFyTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQWJzdHJhY3RFYXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YWZkYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQWJzdHJhY3RFYXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgZ29ybW92Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFYXJOb2RlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVBUl9ERUZBVUxUX0xJQiA9ICJsaWIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGludCBNT0RVTEVTX1RZUEUgPSAwOyAgICAKLQlwdWJsaWMgc3RhdGljIGludCBMSUJTX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIGludCB0eXBlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzID0KLQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgCi0JCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwKLQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLAotCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUsCi0JCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRX0pOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBlYXJQcm9qZWN0OwotCi0JcHVibGljIEFic3RyYWN0RWFyTm9kZShJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCXRoaXMuZWFyUHJvamVjdCA9IGVhclByb2plY3Q7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldEVhclByb2plY3QoKSB7Ci0JCXJldHVybiBlYXJQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldE1vZHVsZXMoKTsKLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoKTsKLQotCXByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoTGlzdCBjb21wb25lbnRUeXBlcywgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSB2aXJ0dWFsQ29tcG9uZW50OwotCQlpZiAoZWFyQ29tcG9uZW50ICE9IG51bGwgKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gcmVmQ29tcG9uZW50c1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkvLyBpZiBjb21wb25lbnQgdHlwZXMgcGFzc2VkIGluIGlzIG51bGwgdGhlbiByZXR1cm4gYWxsIGNvbXBvbmVudHMKLQkJCQlpZiAoY29tcG9uZW50VHlwZXMgPT0gbnVsbCB8fCBjb21wb25lbnRUeXBlcy5zaXplKCkgPT0gMCkgewotCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJUGF0aCBydW50aW1lUGF0aDIgPSBnZXRSZWFsUnVudGltZVBhdGgocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJCWlmIChydW50aW1lUGF0aDIuZXF1YWxzKHJ1bnRpbWVQYXRoKSAmJiBjb21wb25lbnRUeXBlcy5jb250YWlucyhKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKG1vZHVsZSkpKSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBjb21wbGV0ZSBsaXN0IG9mIHRoZSBiaW5hcmllcyBjb250YWluZWQgaW4gdGhlIGxpYiBkaXIuCi0JICogCi0JICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKLQkgKiBAcGFyYW0gcnVudGltZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QmluYXJpZXNJbkxpYkRpcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50LCBJUGF0aCBydW50aW1lUGF0aCwgTGlzdCBjb21wb25lbnRUeXBlcykgewotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IHZpcnR1YWxDb21wb25lbnQ7Ci0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCApIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGUgPSByZWZDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAobW9kdWxlID09IG51bGwpIGNvbnRpbnVlOwotCQkJCS8vIGlmIGNvbXBvbmVudCB0eXBlcyBwYXNzZWQgaW4gaXMgbnVsbCB0aGVuIHJldHVybiBhbGwgY29tcG9uZW50cwotCQkJCWlmIChtb2R1bGUuaXNCaW5hcnkoKSAmJiBnZXRSZWFsUnVudGltZVBhdGgocmVmQ29tcG9uZW50c1tpXSkuZXF1YWxzKHJ1bnRpbWVQYXRoKSkgewotCQkJCQlpZiAoY29tcG9uZW50VHlwZXMgIT0gbnVsbCAmJiAhY29tcG9uZW50VHlwZXMuY29udGFpbnMoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShtb2R1bGUpKSApIHsKLQkJCQkJCWlmICghcnVudGltZVBhdGguZXF1YWxzKG5ldyBQYXRoKCIvIikpKXsvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCi0KLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgdGhlIGJpbmFyaWVzIGNvbnRhaW5lZCBpbiB0aGUgbGliIGRpci4KLQkgKiBJdCB3aWxsIG5vdCBjb25zaWRlciBtb2R1bGVzIGluIGxpYiBkaXIgYXMgbGlicmFyaWVzIGZvciB0aGF0IHVzZSAKLQkgKiBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoLCBMaXN0IGNvbXBvbmVudFR5cGVzKQotCSAqIAotCSAqIEBwYXJhbSB2aXJ0dWFsQ29tcG9uZW50Ci0JICogQHBhcmFtIHJ1bnRpbWVQYXRoCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIGl0IGlzIG5vdCByZXR1cm5pbmcgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbGlicmFyaWVzCi0JICogIHVzZTogZ2V0QmluYXJpZXNJbkxpYkRpcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50LCBJUGF0aCBydW50aW1lUGF0aCwgTGlzdCBjb21wb25lbnRUeXBlcykKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBnZXRCaW5hcmllc0luTGliRGlyKHZpcnR1YWxDb21wb25lbnQsIHJ1bnRpbWVQYXRoLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlY29tcHV0ZUxpYkZvbGRlcihJUHJvamVjdCBwcm9qZWN0KXsKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCU9iamVjdCBtb2RlbE9iamVjdCA9IG1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKEFwcGxpY2F0aW9uLmNsYXNzLmlzSW5zdGFuY2UobW9kZWxPYmplY3QpKXsKLQkJCVN0cmluZyBsaWJyYXJ5RGlyZWN0b3J5ID0gKChBcHBsaWNhdGlvbiltb2RlbE9iamVjdCkuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJcmV0dXJuIGxpYnJhcnlEaXJlY3RvcnkgIT0gbnVsbCAmJiBsaWJyYXJ5RGlyZWN0b3J5Lmxlbmd0aCgpPjAgPyBsaWJyYXJ5RGlyZWN0b3J5IDogRUFSX0RFRkFVTFRfTElCOwotCQl9Ci0JCXJldHVybiBFQVJfREVGQVVMVF9MSUI7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFJlYWxSdW50aW1lUGF0aChJVmlydHVhbFJlZmVyZW5jZSB2cil7Ci0JCUlQYXRoIHJ1bnRpbWVQYXRoMiA9IHZyLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCWlmKHZyLmdldEFyY2hpdmVOYW1lKCkgIT0gbnVsbCl7Ci0JCQlJUGF0aCBuYW1lUGF0aCA9IG5ldyBQYXRoICh2ci5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCWlmIChuYW1lUGF0aC5zZWdtZW50Q291bnQoKT4xICYmIHJ1bnRpbWVQYXRoMi5zZWdtZW50Q291bnQoKT09MCl7Ci0JCQkJcnVudGltZVBhdGgyID0gbmV3IFBhdGgoIi8iK25hbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1BvcnRhYmxlU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJ1bnRpbWVQYXRoMjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQXBwbGljYXRpb241Vmlld2VyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9BcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkMTE3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9BcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkFwcGxpY2F0aW9uVmlld2VyU29ydGVyOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb241Vmlld2VyU29ydGVyIGV4dGVuZHMgQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIgewotICAKLSAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0gICAgaWYoZTEgaW5zdGFuY2VvZiBCdW5kbGVkTm9kZSl7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYoZTIgaW5zdGFuY2VvZiBCdW5kbGVkTm9kZSl7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9CdW5kbGVkTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQnVuZGxlZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2ZjZhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9CdW5kbGVkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogCi0gKiBCdW5kbGVkIExpYnJhcmllcyBub2RlLiBTdWItbm9kZSBvZiBFQVIgNSBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQnVuZGxlZE5vZGUgZXh0ZW5kcyBBYnN0cmFjdEVhck5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFVUSUxJVFkgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFkpOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5vZGVOYW1lOwotCXByaXZhdGUgZmluYWwgQnVuZGxlZE5vZGUgYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlOwotCi0JCi0KLQlwdWJsaWMgQnVuZGxlZE5vZGUoSVByb2plY3QgZWFyUHJvamVjdCwgU3RyaW5nIG5vZGVOYW1lLCBCdW5kbGVkTm9kZSBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUpIHsKLQkJc3VwZXIoZWFyUHJvamVjdCk7Ci0JCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKLQkJdGhpcy5idW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgPSBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGU7Ci0JCXR5cGUgPSBMSUJTX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCXB1YmxpYyBCdW5kbGVkTm9kZSBnZXRCdW5kbGVkTGlic0RpcmVjdG9yeU5vZGUoKSB7Ci0JCXJldHVybiBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlcygpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldEVhclByb2plY3QoKSk7Ci0KLQkJUGF0aCBsaWJQYXRoID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlID09IG51bGwpewotCQkJbGliUGF0aCA9IG5ldyBQYXRoKCIvIiArIHJlY29tcHV0ZUxpYkZvbGRlcihnZXRFYXJQcm9qZWN0KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IGxpYnMgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KFVUSUxJVFksIHByb2plY3RDb21wb25lbnQsCi0JCQkJbGliUGF0aCk7Ci0JCWxpYnMuYWRkQWxsKGdldEJpbmFyaWVzSW5MaWJEaXIocHJvamVjdENvbXBvbmVudCxsaWJQYXRoLCBVVElMSVRZKSk7Ci0KLQkJTGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgbGlicy5nZXQoaSk7Ci0JCQkKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gIGdldFJlYWxSdW50aW1lUGF0aChyZWZlcmVuY2UpOwotCi0JCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCAmJiBydW50aW1lUGF0aC5zZWdtZW50KDApICE9IG51bGwgJiYgCi0JCQkJCXJ1bnRpbWVQYXRoLmVxdWFscyhsaWJQYXRoKSkgewotCQkJCWlmIChidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgPT0gbnVsbCl7Ci0JCQkJCW1vZHVsZXMuYWRkKGxpYnMuZ2V0KGkpKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSAhPSBudWxsKXsKLQkJCQkJbW9kdWxlcy5hZGQobGlicy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlICE9IG51bGwpewotCQkJbW9kdWxlcy5hZGQoYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0dyb3VwRUFSUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0dyb3VwRUFSUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYzUzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Hcm91cEVBUlByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBFYXIgNSBEZXBsb3ltZW50IGRlc2NyaXB0b3Igbm9kZS4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVBUlByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9SRUxBVElWRV9QQVRIID0gIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFQVJfREVGQVVMVF9MSUIgPSAibGliIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEltYWdlIEVBUl9JTUFHRTsKLQlwcml2YXRlIEVBUlZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50OwotCXByaXZhdGUgSUZpbGUgZGRGaWxlOwotCQotCXByaXZhdGUgQnVuZGxlZE5vZGUgYnVuZGxlZExpYnNOb2RlOwotCXByaXZhdGUgTW9kdWxlc05vZGUgbW9kdWxlc05vZGU7Ci0JCi0JcHVibGljIEdyb3VwRUFSUHJvdmlkZXIoQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEVBUlZpcnR1YWxDb21wb25lbnQgd3RwQ29tcG9uZW50KSB7Ci0JCXN1cGVyKGFwcGxpY2F0aW9uKTsKLQkJZWFyQ29tcG9uZW50ID0gd3RwQ29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZWFyQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiAiRGVwbG95bWVudCBEZXNjcmlwdG9yOiAiICsgZWFyQ29tcG9uZW50LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBFQVJWaXJ0dWFsQ29tcG9uZW50IGdldEVBUlZpcnR1YWxDb21wb25lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmVhckNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQotCQlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiAKLQkJCQkJZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KAotCQkJCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKS5nZXRWZXJzaW9uKAotCQkJCQkJCQkJSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpKSB7Ci0KLQkJCQlpZihidW5kbGVkTGlic05vZGUgPT0gbnVsbCl7Ci0JCQkJCUJ1bmRsZWROb2RlIGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSA9IG5ldyBCdW5kbGVkTm9kZShwcm9qZWN0LCBNZXNzYWdlcy5MSUJSQVJZX0RJUkVDVE9SWSArICI6IC8iICsgRUFSX0RFRkFVTFRfTElCLCBudWxsKTsvLyROT04tTkxTLTEkCi0JCQkJCWJ1bmRsZWRMaWJzTm9kZSA9IG5ldyBCdW5kbGVkTm9kZShwcm9qZWN0LCBNZXNzYWdlcy5CVU5ETEVEX0xJQlJBUklFU19OT0RFLCBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtb2R1bGVzTm9kZSA9PSBudWxsKXsKLQkJCQkJbW9kdWxlc05vZGUgPSBuZXcgTW9kdWxlc05vZGUocHJvamVjdCk7Ci0JCQkJfQotCQkJCQotCi0JCQkJY2hpbGRyZW4uYWRkKG1vZHVsZXNOb2RlKTsKLQkJCQljaGlsZHJlbi5hZGQoYnVuZGxlZExpYnNOb2RlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gIkVycm9yIGluIHRoZSBKRUVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSBmb3IgcGFyZW50OiIgKyAgdGhpczsgLy8kTk9OLU5MUy0xJAotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEVhckltYWdlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFYXJJbWFnZSgpIHsKLQkJaWYgKEVBUl9JTUFHRSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKRUVVSVBsdWdpbkljb25zLkVBUl9JTUFHRSk7Ci0JCQlFQVJfSU1BR0UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gRUFSX0lNQUdFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotCX0KLQlwdWJsaWMgSUZpbGUgZ2V0RERGaWxlKCkgewotCQlpZiAoZGRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGRkRmlsZTsKLQkJfQotCQlJVmlydHVhbEZvbGRlciB2aXJ0dWFsRm9sZGVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKS5nZXRSb290Rm9sZGVyKCk7Ci0JCWRkRmlsZSA9IHZpcnR1YWxGb2xkZXIuZ2V0RmlsZShQUk9KRUNUX1JFTEFUSVZFX1BBVEgpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCXJldHVybiBkZEZpbGU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJUHJvamVjdC5jbGFzcyA9PSBhZGFwdGVyKXsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Nb2R1bGVzTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvTW9kdWxlc05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2OTJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Nb2R1bGVzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogCi0gKiBNb2R1bGVzIHN1Yi1ub2RlIG9mIEVBUiBEZXBsb3ltZW50IGRlc2NyaXB0b3Igbm9kZSBKYXZhIEVFIDUgCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlc05vZGUgZXh0ZW5kcyBBYnN0cmFjdEVhck5vZGUgewotCi0JcHVibGljIE1vZHVsZXNOb2RlKElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkJc3VwZXIoZWFyUHJvamVjdCk7Ci0JCXR5cGUgPSBNT0RVTEVTX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkgICAgcmV0dXJuIE1lc3NhZ2VzLkVBUl9NT0RVTEVTX05PREU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuRUFSX01PRFVMRVNfTk9ERTsKLQl9Ci0JCi0JIHB1YmxpYyBMaXN0IGdldE1vZHVsZXMoKSB7Ci0JICAgIAlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0RWFyUHJvamVjdCgpKTsKLQkgICAgCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzLCBwcm9qZWN0Q29tcG9uZW50LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCSB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9TaG93RGVwUHJvcFBhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL1Nob3dEZXBQcm9wUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWEzMzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL1Nob3dEZXBQcm9wUGFnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBTaG93RGVwUHJvcFBhZ2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWw7CQotCQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHNlbCA9IHNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgfQotCSAgCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWwgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTW9kdWxlc05vZGUpIHsKLQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSAoKE1vZHVsZXNOb2RlKXNlbGVjdGVkT2JqZWN0KS5nZXRFYXJQcm9qZWN0KCk7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByb3BlcnR5RGlhbG9nLmNyZWF0ZURpYWxvZ09uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuCi0gICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIsIGVhclByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzFjOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0gIHB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyhPYmplY3QgYWRhcHRlck5vZGUpIHsKLSAgICBzdXBlcihhZGFwdGVyTm9kZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIChMaXN0KSBhZGFwdGVyTm9kZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICByZXR1cm4gTWVzc2FnZXMuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiYWNjZXNzX2ludGVudF9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVkNTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotCi1wdWJsaWMgY2xhc3MgQmVhbkRlY29yYXRvciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5JbnRlcmZhY2VOb2RlKXsKLQkJCUJlYW5JbnRlcmZhY2VOb2RlIGJlYW5JbnRlcmFjZU5vZGUgPSAoQmVhbkludGVyZmFjZU5vZGUpIGVsZW1lbnQ7Ci0JCQlzd2l0Y2ggKGJlYW5JbnRlcmFjZU5vZGUuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19MT0NBTDoKLQkJCQlhcHBseURlY29yYXRvcihKRUVVSVBsdWdpbkljb25zLkJVU1NJTkVTU19MT0NBTCwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19SRU1PVEU6Ci0JCQkJYXBwbHlEZWNvcmF0b3IoSkVFVUlQbHVnaW5JY29ucy5CVVNTSU5FU1NfUkVNT1RFLCBkZWNvcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuUkVNT1RFLCBkZWNvcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFX0hPTUU6Ci0JCQkJYXBwbHlEZWNvcmF0b3IoSkVFVUlQbHVnaW5JY29ucy5SRU1PVEVfSE9NRSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuTE9DQUwsIGRlY29yYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTF9IT01FOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuTE9DQUxfSE9NRSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5Ob2RlKXsKLQkJICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImVqYl9tb2R1bGVfb3ZyIikpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseURlY29yYXRvcihTdHJpbmcgaWQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoaWQpOwotCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuSW50ZXJmYWNlTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkludGVyZmFjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlYTQ2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuSW50ZXJmYWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBTZXNzaW9uIG9yIEVudGl0eQotICogYmVhbnMgaW50ZXJmYWNlcyAoQnVzaW5lc3MsIENvbXBvbmVudCBhbmQgTG9jYWwgaW50ZXJmYWNlcykuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW50ZXJmYWNlTm9kZSBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotCXByaXZhdGUgZmluYWwgaW50IGtpbmQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZxbjsKLQotCXB1YmxpYyBjbGFzcyBLSU5EUyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVU1NJTkVTU19MT0NBTCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVU1NJTkVTU19SRU1PVEUgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUUgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEVfSE9NRSA9IDU7Ci0JfQotCi0JcHVibGljIEJlYW5JbnRlcmZhY2VOb2RlKE9iamVjdCBhZGFwdGVyTm9kZSwgU3RyaW5nIF9mcW4sIGludCBraW5kKSB7Ci0JCXN1cGVyKGFkYXB0ZXJOb2RlKTsKLQkJdGhpcy5fZnFuID0gX2ZxbjsKLQkJdGhpcy5raW5kID0ga2luZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShfZnFuKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ1VOSVQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0X2ZxbigpIHsKLQkJcmV0dXJuIF9mcW47Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU0ZjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgRW50ZXJwcmlzZSBiZWFucy4KLSAqIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEJlYW5Ob2RlIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotICAKLSAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIEJFQU5fT1ZSOwotICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgV0VCX1NFUlZJQ0VfT1ZSOwotICAKLSAgcHVibGljIEJlYW5Ob2RlKEphdmFFRU9iamVjdCBiZWFuKSB7Ci0gICAgc3VwZXIoYmVhbik7Ci0gICAgaW1hZ2UgPSBudWxsOwotICAgIFN0cmluZyBxdWFsaWZpZWQgPSBnZXRFamJDbGFzc1F1YWxpZmllZE5hbWUoKTsKLSAgICBpZiAocXVhbGlmaWVkICE9IG51bGwpIHsKLSAgICAgIHRleHQgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpOwotICAgICAgZGVzY3JpcHRpb24gPSBNZXNzYWdlcy5FTlRFUlBSSVNFX0JFQU5fQ0xBU1NfREVTQ1JJUFRJT04gKyBxdWFsaWZpZWQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzUXVhbGlmaWVkTmFtZSgpIHsKLSAgICBpZiAoYWRhcHRlck5vZGUgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil7Ci0gICAgICByZXR1cm4gKChTZXNzaW9uQmVhbilhZGFwdGVyTm9kZSkuZ2V0RWpiQ2xhc3MoKTsKLSAgICB9IGVsc2UgaWYgKGFkYXB0ZXJOb2RlIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pewotICAgICAgcmV0dXJuICgoTWVzc2FnZURyaXZlbkJlYW4pYWRhcHRlck5vZGUpLmdldEVqYkNsYXNzKCk7Ci0gICAgfWVsc2UgaWYgKGFkYXB0ZXJOb2RlIGluc3RhbmNlb2YgRW50aXR5QmVhbil7Ci0gICAgICByZXR1cm4gKChFbnRpdHlCZWFuKWFkYXB0ZXJOb2RlKS5nZXRFamJDbGFzcygpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBKYXZhRUVPYmplY3QgZ2V0RW50ZXJwcmlzZUJlYW4oKXsKLQkgIHJldHVybiAoSmF2YUVFT2JqZWN0KSBhZGFwdGVyTm9kZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ1VOSVQpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbk5vZGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbk5vZGVQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM1NWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci0KLXB1YmxpYyBjbGFzcyBCZWFuTm9kZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9UWVBFID0gImJlYW5UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NFU1NJT05fQkVBTiA9ICJpc1Nlc3Npb25CZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX01FU1NBR0VfRFJJVkVOID0gImlzTWVzc2FnZURyaXZlbkJlYW4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLAotCQkJT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQotCQlpZiAoIShyZWNlaXZlciBpbnN0YW5jZW9mIEJlYW5Ob2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJT2JqZWN0IGFkYXB0ZXJOb2RlID0gKChCZWFuTm9kZSkgcmVjZWl2ZXIpLmdldEFkYXB0ZXJOb2RlKCk7Ci0KLQkJU3RyaW5nIHZhbCA9IChTdHJpbmcpIGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChCRUFOX1RZUEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJaWYgKElTX1NFU1NJT05fQkVBTi5lcXVhbHModmFsKSkgewotCQkJCXJldHVybiBpc1Nlc3Npb25CZWFuKGFkYXB0ZXJOb2RlKTsKLQkJCX0gZWxzZSBpZiAoSVNfTUVTU0FHRV9EUklWRU4uZXF1YWxzKHZhbCkpIHsKLQkJCQlyZXR1cm4gaXNNZXNzYWdlRHJpdmVuQmVhbihhZGFwdGVyTm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW5CZWFuKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2Vzc2lvbkJlYW4oT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFSkJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFSkJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjM1MDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRUpCUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIHJvb3Qgbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFSkJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCi0JcHJpdmF0ZSBHcm91cEVqYlNlc3Npb24gZ3JvdXBFamJTZXNzaW9uOwotCXByaXZhdGUgR3JvdXBFamJNZXNzYWdlRHJpdmVuIGdyb3VwRWpiTWVzc2FnZURyaXZlbjsKLQlwcml2YXRlIEdyb3VwRWpiRW50aXR5IGdyb3VwRWpiRW50aXR5OwotCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lID0gbnVsbDsKLQotCi0JcHVibGljIEdyb3VwRUpCUHJvdmlkZXIoRUpCSmFyIGVqYkphcikgewotCQlzdXBlcihlamJKYXIpOwotCi0JCWdyb3VwRWpiU2Vzc2lvbiA9IG5ldyBHcm91cEVqYlNlc3Npb24oZWpiSmFyKTsKLQkJZ3JvdXBFamJNZXNzYWdlRHJpdmVuID0gbmV3IEdyb3VwRWpiTWVzc2FnZURyaXZlbihlamJKYXIpOwotCQlncm91cEVqYkVudGl0eSA9IG5ldyBHcm91cEVqYkVudGl0eShlamJKYXIpOwotCi0JCWNoaWxkcmVuLmFkZChncm91cEVqYlNlc3Npb24pOwotCQljaGlsZHJlbi5hZGQoZ3JvdXBFamJNZXNzYWdlRHJpdmVuKTsKLQkJY2hpbGRyZW4uYWRkKGdyb3VwRWpiRW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlyZXR1cm4gKEVKQkphcikgamF2YWVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUiArIHByb2plY3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVpbml0KEphdmFFRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzdXBlci5yZWluaXQobW9kZWxPYmplY3QpOwotCQlncm91cEVqYlNlc3Npb24ucmVpbml0KG1vZGVsT2JqZWN0KTsKLQkJZ3JvdXBFamJNZXNzYWdlRHJpdmVuLnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JCWdyb3VwRWpiRW50aXR5LnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElQcm9qZWN0LmNsYXNzID09IGFkYXB0ZXIpewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRQcm9qZWN0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYkVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0N2U1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYkVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBFbnRpdHkgQmVhbnMgZ3JvdXAgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBoYXMgYSBudW1iZXIgb2Ygc3ViIG5vZGVzIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRWpiRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0JcHVibGljIEdyb3VwRWpiRW50aXR5KEVKQkphciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLSAgICBpbWFnZSA9IG51bGw7Ci0gICAgdGV4dCA9IE1lc3NhZ2VzLkVOVElUWV9CRUFOUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbnRpdGllcyA9IG51bGw7Ci0JCSBFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gKChFSkJKYXIpIGFkYXB0ZXJOb2RlKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJIGlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCSBlbnRpdGllcyA9IGVudGVycHJpc2VCZWFucy5nZXRFbnRpdHlCZWFucygpOwotCQlpZiAoZW50aXRpZXMgIT0gbnVsbCAmJiBlbnRpdGllcy5zaXplKCkgPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKGVudGl0aWVzKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJjbXBFbnRpdHlfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJNZXNzYWdlRHJpdmVuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYk1lc3NhZ2VEcml2ZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhNjY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYk1lc3NhZ2VEcml2ZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIE1lc3NhZ2UgRHJpdmVuIEJlYW5zIGdyb3VwIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgaGFzIGEgbnVtYmVyIG9mIHN1YiBub2RlcyAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVqYk1lc3NhZ2VEcml2ZW4gZXh0ZW5kcyBBYnN0cmFjdERETm9kZSB7Ci0KLQlwdWJsaWMgR3JvdXBFamJNZXNzYWdlRHJpdmVuKEVKQkphciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW1hZ2UgPSBudWxsOwotCQl0ZXh0ID0gTWVzc2FnZXMuTUVTU0FHRV9EUklWRU5fQkVBTlM7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbXNnQmVhbnMgPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gKChFSkJKYXIpIGFkYXB0ZXJOb2RlKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJIGlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCSBtc2dCZWFucyA9IGVudGVycHJpc2VCZWFucy5nZXRNZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQkJaWYgKG1zZ0JlYW5zICE9IG51bGwgJiYgbXNnQmVhbnMuc2l6ZSgpPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKG1zZ0JlYW5zKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYlNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlN2M4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYlNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBTZXNzaW9uIEJlYW5zIGdyb3VwIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgaGFzIGEgbnVtYmVyIG9mIHN1YiBub2RlcyAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRWpiU2Vzc2lvbiBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotCXB1YmxpYyBHcm91cEVqYlNlc3Npb24oRUpCSmFyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotICAgIGltYWdlID0gbnVsbDsKLSAgICB0ZXh0ID0gTWVzc2FnZXMuU0VTU0lPTl9CRUFOUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXNzaW9uQmVhbnMgPSBudWxsOwotCQkgRW50ZXJwcmlzZUJlYW5zIGVudGVycHJpc2VCZWFucyA9ICgoRUpCSmFyKSBhZGFwdGVyTm9kZSkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCSBpZiAoZW50ZXJwcmlzZUJlYW5zICE9IG51bGwpCi0JCQkgc2Vzc2lvbkJlYW5zID0gZW50ZXJwcmlzZUJlYW5zLmdldFNlc3Npb25CZWFucygpOwotCQkgCi0JCWlmIChzZXNzaW9uQmVhbnMgIT0gbnVsbCAmJiBzZXNzaW9uQmVhbnMuc2l6ZSgpPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKHNlc3Npb25CZWFucyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIXRoaXMuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZXNzaW9uQmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRkMjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb250ZXh0IFBhcmFtZXRlcnMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIENPTlRFWFRfUEFSQU1fSU1BR0U7Ci0KLSAgICBwdWJsaWMgR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLkNPTlRFWFRfUEFSQU1TX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmIChqYXZhZWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0Q29udGV4dFBhcmFtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRleHRQYXJhbXNJbWFnZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Q29udGV4dFBhcmFtc0ltYWdlKCkgewotICAgICAgICBpZiAoQ09OVEVYVF9QQVJBTV9JTUFHRSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0NPTlRFWFRfUEFSQU0pOwotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICAgICAgQ09OVEVYVF9QQVJBTV9JTUFHRSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDT05URVhUX1BBUkFNX0lNQUdFOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YThlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEVycm9yIHBhZ2VzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBFUlJPUl9QQUdFUzsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBFWENFUFRJT05fRVJST1JfUEFHRVM7Ci0KLSAgICBwdWJsaWMgR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLkVSUk9SX1BBR0VTX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmIChqYXZhZWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0RXJyb3JQYWdlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEVycm9yUGFnZXNJbWFnZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXJyb3JQYWdlc0ltYWdlKCkgewotICAgICAgICBpZiAoRVJST1JfUEFHRVMgPT0gbnVsbCkgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9FUlJPUl9QQUdFKTsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICAgIEVSUk9SX1BBR0VTID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVSUk9SX1BBR0VTOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXJyb3JQYWdlc0ltYWdlKEVycm9yUGFnZSBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRFcnJvckNvZGUoKSAhPSBudWxsKXsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAoRVhDRVBUSU9OX0VSUk9SX1BBR0VTID09IG51bGwpIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9FUlJPUl9QQUdFKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICBFWENFUFRJT05fRVJST1JfUEFHRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVYQ0VQVElPTl9FUlJPUl9QQUdFUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZWVlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpbHRlciBtYXBwaW5ncyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIEZJTFRFUl9NQVBQSU5HOwotCi0JcHVibGljIEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5GSUxURVJfTUFQUElOR19JVEVNX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PD8+IGdldENoaWxkcmVuKCkgewotCQlpZiAoamF2YWVlICE9IG51bGwpewotCQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0RmlsdGVyTWFwcGluZ0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGaWx0ZXJNYXBwaW5nSW1hZ2UoKSB7Ci0JCWlmIChGSUxURVJfTUFQUElORyA9PSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0ZJTFRFUl9NQVBQSU5HKTsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLQkJCUZJTFRFUl9NQVBQSU5HID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIEZJTFRFUl9NQVBQSU5HOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhmMjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBGaWx0ZXJzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBGSUxURVI7Ci0KLQlwdWJsaWMgR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIod2ViQXBwKTsKLQkJdGV4dCA9IE1lc3NhZ2VzLkZJTFRFUlNfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRGaWx0ZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0RmlsdGVyc0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGaWx0ZXJzSW1hZ2UoKSB7Ci0JCWlmIChGSUxURVIgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5GSUxURVJfTUFQUElORyk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlGSUxURVIgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gRklMVEVSOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDMzODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBMaXN0ZW5lciBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIExJU1RFTkVSOwotCi0JcHVibGljIEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuTElTVEVORVJfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldExpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldExpc3RlbmVyc0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRMaXN0ZW5lcnNJbWFnZSgpIHsKLQkJaWYgKExJU1RFTkVSID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfTElTVEVORVIpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotCQkJTElTVEVORVIgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIExJU1RFTkVSOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmM2Y1NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBKTkRJIFJlZmVyZW5jZXMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgUkVGRVJFTkNFUzsKLQotICAgIHB1YmxpYyBHcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIHN1cGVyKHdlYkFwcCk7Ci0gICAgICAgIHRleHQgPSBNZXNzYWdlcy5SRUZFUkVOQ0VTOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldEVqYlJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRFamJMb2NhbFJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRFbnZFbnRyaWVzKCkpOwotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpOwotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0U2VydmljZVJlZnMoKSk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZXNJbWFnZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRSZWZlcmVuY2VzSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChSRUZFUkVOQ0VTID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuUkVTT1VSQ0VfUkVGRVJFTkNFX09CSik7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0gICAgICAgICAgICBSRUZFUkVOQ0VTID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJFRkVSRU5DRVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcyNjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBTZXJ2bGV0cyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgU0VSVkxFVDsKLQotCXB1YmxpYyBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuU0VSVkxFVF9JVEVNX1BST1ZJREVSOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChqYXZhZWUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0U2VydmxldHMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldFNlcnZsZXRJbWFnZSgpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2bGV0SW1hZ2UoKSB7Ci0JCWlmIChTRVJWTEVUID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfU0VSVkxFVCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlTRVJWTEVUID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIFNFUlZMRVQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjE2YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBTZXJ2bGV0IE1hcHBpbmdzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgU0VSVkxFVE1BUFBJTkc7Ci0KLQlwdWJsaWMgR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5TRVJWTEVUX01BUFBJTkdfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRTZXJ2bGV0TWFwcGluZ0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2bGV0TWFwcGluZ0ltYWdlKCkgewotCQlpZiAoU0VSVkxFVE1BUFBJTkcgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5TRVJWTEVUX01BUFBJTkcpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotCQkJU0VSVkxFVE1BUFBJTkcgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gU0VSVkxFVE1BUFBJTkc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBXZWxjb21lUGFnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkY2MyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBXZWxjb21lIHBhZ2VzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIFdFTENPTUVfUEFHRVM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBXRUxDT01FX1BBR0U7Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQotICAgIHB1YmxpYyBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIHN1cGVyKHdlYkFwcCk7Ci0gICAgICAgIHRleHQgPSBNZXNzYWdlcy5XRUxDT01FX1BBR0VTX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCl7Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgIH0KLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICBMaXN0IHdlbGNvbWVGaWxlTGlzdHMgPSAoKFdlYkFwcCkgamF2YWVlKS5nZXRXZWxjb21lRmlsZUxpc3RzKCk7Ci0gICAgICAgICAgaWYgKHdlbGNvbWVGaWxlTGlzdHMuc2l6ZSgpPjApewotICAgICAgICAgICAgY2hpbGRyZW4gPSAgbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogd2VsY29tZUZpbGVMaXN0cykgewotICAgICAgICAgICAgICBMaXN0IHdlbGNvbWVGaWxlcyA9ICgoV2VsY29tZUZpbGVMaXN0KW9iamVjdCkuZ2V0V2VsY29tZUZpbGVzKCk7Ci0gICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdDIgOiB3ZWxjb21lRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZihvYmplY3QyICE9IG51bGwgJiYgISIiLmVxdWFscyggKChTdHJpbmcpb2JqZWN0MikudHJpbSgpKSl7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgV2ViQXJ0aWZhY3ROb2RlKChTdHJpbmcpIG9iamVjdDIsIGdldFdlbGNvbWVQYWdlSW1hZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFdlbGNvbWVQYWdlc0ltYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRXZWxjb21lUGFnZXNJbWFnZSgpIHsKLSAgICAgICAgaWYgKFdFTENPTUVfUEFHRVMgPT0gbnVsbCkgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9XRUxDT01FX1BBR0VTKTsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICAgIFdFTENPTUVfUEFHRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV0VMQ09NRV9QQUdFUzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRXZWxjb21lUGFnZUltYWdlKCkgewotICAgICAgaWYgKFdFTENPTUVfUEFHRSA9PSBudWxsKSB7Ci0gICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9XRUxDT01FX1BBR0UpOwotICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICBXRUxDT01FX1BBR0UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBXRUxDT01FX1BBR0U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXBwUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL1dlYkFwcFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2M1YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXBwUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogQ29udGVudCBhbmQgTGFiZWwgUHJvdmlkZXIgaGVscGVyIGNsYXNzIGZvciBXZWJBcHAgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotICAKLSAgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUkVMQVRJVkVfUEFUSCA9ICJXRUItSU5GL3dlYi54bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIgZXJyb3JzOwotCXByaXZhdGUgR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyIHNlcnZsZXRzOwotCXByaXZhdGUgR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyIGZpbHRlcnM7Ci0JcHJpdmF0ZSBHcm91cExpc3RlbmVySXRlbVByb3ZpZGVyIGxpc3RlbmVyczsKLQlwcml2YXRlIEdyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmxldE1hcHBpbmc7Ci0JcHJpdmF0ZSBHcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgZmlsdGVyTWFwcGluZzsKLQlwcml2YXRlIEdyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyIHJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlciB3ZWxjb21lOwotCXByaXZhdGUgR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyIGNvbnRleHRQYXJhbXM7Ci0JCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgSW1hZ2UgV0VCX0FQUF9JTUFHRTsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByamN0ID0gbnVsbDsKLQlwcml2YXRlIElGaWxlIGRkRmlsZSA9IG51bGw7Ci0KLQotICAKLQotCQotCXB1YmxpYyBXZWJBcHBQcm92aWRlcihXZWJBcHAgd2ViQXBwLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5ERVBMT1lNRU5UX0RFU0NSSVBUT1IgKyBwcm9qZWN0LmdldE5hbWUoKTsKLQkJY29udGV4dFBhcmFtcyA9IG5ldyBHcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJZXJyb3JzID0gbmV3IEdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlzZXJ2bGV0cyA9IG5ldyBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJc2VydmxldE1hcHBpbmcgPSBuZXcgR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlmaWx0ZXJzID0gbmV3IEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlmaWx0ZXJNYXBwaW5nID0gbmV3IEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlsaXN0ZW5lcnMgPSBuZXcgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlyZWZlcmVuY2VzID0gbmV3IEdyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCXdlbGNvbWUgPSBuZXcgR3JvdXBXZWxjb21lUGFnZXNJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJY2hpbGRyZW4uYWRkKGNvbnRleHRQYXJhbXMpOwotCQljaGlsZHJlbi5hZGQoZXJyb3JzKTsKLQkJY2hpbGRyZW4uYWRkKHNlcnZsZXRzKTsKLQkJY2hpbGRyZW4uYWRkKGZpbHRlcnMpOwotCQljaGlsZHJlbi5hZGQobGlzdGVuZXJzKTsKLQkJY2hpbGRyZW4uYWRkKHNlcnZsZXRNYXBwaW5nKTsKLQkJY2hpbGRyZW4uYWRkKGZpbHRlck1hcHBpbmcpOwotCQljaGlsZHJlbi5hZGQocmVmZXJlbmNlcyk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWxjb21lKTsKLQkJcHJqY3QgPSBwcm9qZWN0OwotCX0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCl7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChXRUJfQVBQX0lNQUdFID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZVdlYkRlc2NyaXB0b3IgPSBKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSkVFVUlQbHVnaW5JY29ucy5JTUdfV0VCRUVNT0RFTCk7Ci0JCQlXRUJfQVBQX0lNQUdFID0gaW1hZ2VXZWJEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIFdFQl9BUFBfSU1BR0U7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLQkJcmV0dXJuIHByamN0OwotCX0KLQlwdWJsaWMgSUZpbGUgZ2V0RERGaWxlKCkgewotCQlpZiAoZGRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGRkRmlsZTsKLQkJfQotCi0JCUlWaXJ0dWFsRm9sZGVyIHZpcnR1YWxGb2xkZXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpLmdldFJvb3RGb2xkZXIoKTsKLQkJcmV0dXJuIHZpcnR1YWxGb2xkZXIuZ2V0RmlsZShQUk9KRUNUX1JFTEFUSVZFX1BBVEgpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlaW5pdChKYXZhRUVPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJc3VwZXIucmVpbml0KG1vZGVsT2JqZWN0KTsKLQkJZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpY2hpbGQpLnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JCX0KLQl9Ci0JCi0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSVByb2plY3QuY2xhc3MgPT0gYWRhcHRlcil7Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL1dlYkFydGlmYWN0Tm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXJ0aWZhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODcwOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXJ0aWZhY3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogCi0gKiBXcmFwcGVyIG5vZGUgZm9yIHJlcHJlc2VudGluZyBzdHJpbmcgdmFsdWVzIG9mIHRoZSBtb2RlbCBpbiBEZXBsb3ltZW50IGRlc2NyaXB0b3IgdHJlZS4KLSAqIChlLmcuIFdlbGNvbWUgRmlsZXMpCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXJ0aWZhY3ROb2RlIHsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXB1YmxpYyBXZWJBcnRpZmFjdE5vZGUoU3RyaW5nIHRleHQsIEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM4ODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEpFRVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpFRVVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSkVFVUlQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKRUVVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsdWdpbi4KLQkgKiAgCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsCi0JCQlTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgYUNvZGUsCi0JCQkJYU1lc3NhZ2UgIT0gbnVsbCA/IGFNZXNzYWdlIDogIk5vIG1lc3NhZ2UuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLQkJbG9nKElTdGF0dXMuRVJST1IsIElTdGF0dXMuRVJST1IsbWVzc2FnZSxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcGx1Z2luL0pFRVVJUGx1Z2luSWNvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW5JY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjllOTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW5JY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEpFRVVJUGx1Z2luSWNvbnMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU1HX0VKQkVFTU9ERUwgPSAiMzBfZWpiamFyX29iaiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTUdfV0VCRUVNT0RFTCA9ICJ3ZWJhcHBfMjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HID0gIndlYnVpSWNvbnMvc2VydmxldF9tYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HID0gIndlYnVpSWNvbnMvZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX0ZJTFRFUl9NQVBQSU5HID0gIndlYnVpSWNvbnMvZmlsdGVyX21hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfTElTVEVORVIgPSAid2VidWlJY29ucy9saXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9TRVJWTEVUID0gIndlYnVpSWNvbnMvc2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9FUlJPUl9QQUdFID0gIndlYnVpSWNvbnMvZXJyb3JfcGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9DT05URVhUX1BBUkFNID0gIndlYnVpSWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX1dFTENPTUVfUEFHRVMgPSAid2VidWlJY29ucy93ZWxjb21lX2xpc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfV0VMQ09NRV9QQUdFID0gIndlYnVpSWNvbnMvd2VsY29tZV9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1JFRkVSRU5DRV9PQkogPSAicmVzb3VyY2VSZWZfb2JqIjsgLy8kTk9OLU5MUy0xJAotCQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVNTSU5FU1NfTE9DQUwgPSAib3ZyL2J1c2luZXNzX2xvY2FsX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVNTSU5FU1NfUkVNT1RFID0gIm92ci9idXNpbmVzc19yZW1vdGVfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9URSA9ICJvdnIvcmVtb3RlX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfSE9NRSA9ICJvdnIvaG9tZV9vdnIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUwgPSAib3ZyL2xvY2FsX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9IT01FID0gIm92ci9sb2NhbF9ob21lX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfSU1BR0U9ImVhcl81MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBfQ0xJRU5UNTA9ImFwcGNsaWVudF81MCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2UxZmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L0VhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLXB1YmxpYyBjbGFzcyBFYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxQYWdlIHsKLQotCXByb3RlY3RlZCBCdXR0b24gYWRkREQ7Ci0KLQlwdWJsaWMgRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZUREU2VjdGlvbihjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRERTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlhZGRERCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlhZGRERC5zZXRUZXh0KE1lc3NhZ2VzLkVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2VfMCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkREQsIEdFTkVSQVRFX0RELCBudWxsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlhZGRERC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZTA4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlXzA7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODMwNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2VfMD1HZW5lcmF0ZSBEZXBsb3ltZW50IERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlYjgyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFiMjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotamF2YUNvbXBpbGVyLi4uYXJncwotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzAxYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qZWUud2ViPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzJlZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVGh1IE1heSAxMCAxODozNjo0OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxYzA0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qZWUud2ViO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAyLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnMsCi0gb3JnLmVjbGlwc2UuanN0LmplZS53ZWIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTliZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjcyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSB3ZWIvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmEyOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3QuamVlLndlYgotQnVuZGxlLU5hbWUuMCA9IEpFRSBXZWIgUGx1Zy1pbgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGUzMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFTW9kZWxQcm92aWRlciI+Ci0gICAgICAJPHByb3ZpZGVyPgotCi0gICAgICAgIAk8bW9kZWxQcm92aWRlciBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuV2ViMjVNZXJnZWRNb2RlbFByb3ZpZGVyRmFjdG9yeSIvPgotICAgICAgICAJPCEtLTxtb2RlbFByb3ZpZGVyIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5XZWIyNU1vZGVsUHJvdmlkZXJGYWN0b3J5Ii8+LS0+Ci0gICAgICAJCTxmYWNldCBpZD0ianN0LndlYiIgdmVyc2lvbnM9IjIuNSIvPgotICAgICAgCTwvcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYWM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYjI1TWVyZ2VkTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1lcmdlZE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwYWEwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYjI1TWVyZ2VkTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbi5BYnN0cmFjdE1lcmdlZE1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzLk1vZGVsRWxlbWVudE1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnMuTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzLldlYkFwcE1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEtpcmlsIE1pdG92IGsubWl0b3ZAc2FwLmNvbQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWIyNU1lcmdlZE1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlZE1vZGVsUHJvdmlkZXI8V2ViQXBwPiB7Ci0KLQlwdWJsaWMgV2ViMjVNZXJnZWRNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGxvYWRBbm5vdGF0aW9uTW9kZWwoV2ViQXBwIGRkTW9kZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBXZWJBbm5vdGF0aW9uUmVhZGVyKFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KSwgZGRNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGxvYWREZXBsb3ltZW50RGVzY3JpcHRvck1vZGVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFdlYjI1TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIFdlYkFwcCBnZXRBbm5vdGF0aW9uV2ViQXBwKCkgewotCQlyZXR1cm4gKFdlYkFwcCkgYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQl9Ci0KLQlwcml2YXRlIFdlYkFwcCBnZXRYbWxXZWJBcHAoKSB7Ci0JCXJldHVybiAoV2ViQXBwKSBkZFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbFBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJLyoKLQkJICogU29tZW9uZSBoYXMgY2FsbGVkIG1vZGlmeSBiZWZvcmUgbG9hZGluZyB0aGUgbW9kZWwuIFRyeSB0byBsb2FkIHRoZQotCQkgKiBtb2RlbC4KLQkJICovCi0JCWlmIChtZXJnZWRNb2RlbCA9PSBudWxsKQotCQkJZ2V0TWVyZ2VkTW9kZWwoKTsKLQkJaWYgKGlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8qCi0JCSAqIFN0aWxsIG5vdCBzdXBwb3J0aW5nIG1vZGlmaWNhdGlvbnMgb2YgdGhlIG1lcmdlZCBtb2RlbC4gRHVyaW5nIG1vZGlmeQotCQkgKiB0aGUgbW9kZWwgaXMgYmVjb21pbmcgdGhlIGRkTW9kZWwuIEFmdGVyIG1vZGlmeWluZyB0aGUgbW9kZWwgaXMKLQkJICogdW5sb2FkZWQuCi0JCSAqLwotCQlXZWJBcHAgYmFja3VwID0gbWVyZ2VkTW9kZWw7Ci0JCXRyeSB7Ci0JCQltZXJnZWRNb2RlbCA9IChXZWJBcHApIGRkUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCWRkUHJvdmlkZXIubW9kaWZ5KHJ1bm5hYmxlLCBtb2RlbFBhdGgpOwotCQl9IGZpbmFsbHkgewotCQkJbWVyZ2VkTW9kZWwgPSBiYWNrdXA7Ci0JCX0KLQkJbWVyZ2UoZ2V0WG1sV2ViQXBwKCksIGdldEFubm90YXRpb25XZWJBcHAoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTW9kZWwoV2ViQXBwIGFwcCkgewotCQlpZiAoYXBwID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhcHAuZ2V0Q29udGV4dFBhcmFtcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQlhcHAuZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJYXBwLmdldERpc3RyaWJ1dGFibGVzKCkuY2xlYXIoKTsKLQkJYXBwLmdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJYXBwLmdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQlhcHAuZ2V0RXJyb3JQYWdlcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRGaWx0ZXJNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRGaWx0ZXJzKCkuY2xlYXIoKTsKLQkJYXBwLmdldEljb25zKCkuY2xlYXIoKTsKLQkJYXBwLmdldEpzcENvbmZpZ3MoKS5jbGVhcigpOwotCQlhcHAuZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJYXBwLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkuY2xlYXIoKTsKLQkJYXBwLmdldExvZ2luQ29uZmlncygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJYXBwLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQlhcHAuZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJYXBwLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQlhcHAuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQlhcHAuZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJYXBwLmdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5jbGVhcigpOwotCQlhcHAuZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCWFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOwotCQlhcHAuZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQlhcHAuZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5jbGVhcigpOwotCQlhcHAuZ2V0V2VsY29tZUZpbGVMaXN0cygpLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYW5ub3RhdGlvbk1vZGVsQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCWludGVybmFsTW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB4bWxNb2RlbENoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQlpbnRlcm5hbE1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoKLQkgKiBOb3RpZmljYXRpb25zIGZyb20geG1sIGFuZCBhbm5vdGF0aW9uIG1heSBjb21lIGluIGRpZmZlcmVudCB0aHJlYWRzLiBUaGlzCi0JICogZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIHByb3ZpZGVycywgYnV0IHRvIG1ha2Ugc3VyZQotCSAqIHRoYXQgbm8gcmFjZSBjb25kaXRpb25zIG9jY3VycyBJIGFtIHN5bmNocm9uaXppbmcgdGhpcyBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbnRlcm5hbE1vZGVsQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCW1lcmdlKGdldFhtbFdlYkFwcCgpLCBnZXRBbm5vdGF0aW9uV2ViQXBwKCkpOwotCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXZWJBcHAgbWVyZ2UoV2ViQXBwIGRkTW9kZWwsIFdlYkFwcCBhbm5vdGF0aW9uc01vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobWVyZ2VkTW9kZWwgIT0gZGRNb2RlbCkgewotCQkJCWNsZWFyTW9kZWwobWVyZ2VkTW9kZWwpOwotCQkJCW1lcmdlV2l0aE1vZGVsKGRkTW9kZWwpOwotCQkJCW1lcmdlV2l0aE1vZGVsKGFubm90YXRpb25zTW9kZWwpOwotCQkJfQotCQl9IGNhdGNoIChNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBtZXJnZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VXaXRoTW9kZWwoV2ViQXBwIG1vZGVsKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotCQlXZWJBcHBNZXJnZXIgbWVyZ2VyID0gbmV3IFdlYkFwcE1lcmdlcihtZXJnZWRNb2RlbCwgbW9kZWwsIE1vZGVsRWxlbWVudE1lcmdlci5BREQpOwotCQltZXJnZXIucHJvY2VzcygpOwotCX0KLQotCXByb3RlY3RlZCBXZWJBcHAgY3JlYXRlTmV3TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYkFwcCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1lcmdlZE1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYjI1TWVyZ2VkTW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3Zjk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYjI1TWVyZ2VkTW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdlYjI1TWVyZ2VkTW9kZWxQcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwPElQcm9qZWN0LCBJTW9kZWxQcm92aWRlcj4geG1sUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIElNb2RlbFByb3ZpZGVyPigpOwotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2RlbFByb3ZpZGVyIHJlc3VsdCA9IGdldFJlc291cmNlKHByb2plY3QpOwotCQlpZihyZXN1bHQgPT0gbnVsbCB8fCAoKFdlYjI1TWVyZ2VkTW9kZWxQcm92aWRlcilyZXN1bHQpLmlzRGlzcG9zZWQoKSl7Ci0JCQlyZXN1bHQgPSBuZXcgV2ViMjVNZXJnZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQkJYWRkUmVzb3VyY2UocHJvamVjdCwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBjcmVhdGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlc291cmNlKElQcm9qZWN0IHByb2plY3QsIElNb2RlbFByb3ZpZGVyIG1vZGVsUHJvdmlkZXIpewotCQl4bWxSZXNvdXJjZXMucHV0KHByb2plY3QsIG1vZGVsUHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgSU1vZGVsUHJvdmlkZXIgZ2V0UmVzb3VyY2UoSVByb2plY3QgcHJvamVjdCl7Ci0JCXJldHVybiB4bWxSZXNvdXJjZXMuZ2V0KHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvV2ViMjVNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjI2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBXZWIyNU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKRUU1TW9kZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBJV2ViUmVzb3VyY2Ugd2ViUmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQVIyNV9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmplZS5lZTV3ZWJERCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgV2ViMjVNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2opIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qID0gcHJvajsKLQkJc2V0RGVmYXVsdFJlc291cmNlUGF0aChuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlciNnZXRNb2RlbE9iamVjdChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbFBhdGgpIHsKLQkJSVdlYlJlc291cmNlIHdlYlJlcyA9IChJV2ViUmVzb3VyY2UpZ2V0TW9kZWxSZXNvdXJjZShtb2RlbFBhdGgpOwotCQlpZiAod2ViUmVzICE9IG51bGwgJiYgd2ViUmVzLmdldFJvb3RPYmplY3QoKSAhPSBudWxsKSAKLQkJCXJldHVybiB3ZWJSZXMuZ2V0V2ViQXBwKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkgewotCQlyZXR1cm4gV0FSMjVfQ09OVEVOVF9UWVBFOwotCX0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVJvb3QoWE1MUmVzb3VyY2VJbXBsIHJlcywgU3RyaW5nIG5hbWUpIHsKLQkJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgZGQgPSBXZWJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlkZC5nZXRYTUxOU1ByZWZpeE1hcCgpLnB1dCgiIiwgSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMKTsgIC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WE1MTlNQcmVmaXhNYXAoKS5wdXQoInhzaSIsIEoyRUVDb25zdGFudHMuWFNJX05TX1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5wdXQoSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMLCBKMkVFQ29uc3RhbnRzLldFQl9BUFBfU0NIRU1BX0xPQ18yXzUpOwotCQlXZWJBcHAgd2FyID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViQXBwKCk7Ci0JCURpc3BsYXlOYW1lIGRuID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKTsKLQkJZG4uc2V0VmFsdWUobmFtZSk7Ci0JCXdhci5nZXREaXNwbGF5TmFtZXMoKS5hZGQoZG4pOwotCQlkZC5zZXRXZWJBcHAod2FyKTsKLQkJd2FyLnNldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUuXzI1X0xJVEVSQUwpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpIGRkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvV2ViMjVNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzJkOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWIyNU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgV2ViMjVNb2RlbFByb3ZpZGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBXZWIyNU1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBXZWIyNU1vZGVsUHJvdmlkZXIoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYkFubm90YXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYkFubm90YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGIwMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWJBbm5vdGF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uLkFic3RyYWN0QW5ub3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb24uUmVzdWx0OwotCi0vKioKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdlYkFubm90YXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCID0gIkVKQiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX0FTID0gIlJ1bkFzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRSA9ICJSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VTID0gIlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSRV9ST0xFUyA9ICJEZWNsYXJlUm9sZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdlYkFubm90YXRpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViQW5ub3RhdGlvbkZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBXZWJBbm5vdGF0aW9uRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBSZXN1bHQgY3JlYXRlU2VydmxldChJVHlwZSByb290VHlwZSwgU3RyaW5nIHNlcnZsZXROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLQkJU2VydmxldCBzZXJ2bGV0ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpOwotCQlzZXJ2bGV0LnNldFNlcnZsZXROYW1lKHNlcnZsZXROYW1lKTsKLQkJc2VydmxldC5zZXRTZXJ2bGV0Q2xhc3Mocm9vdFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlyZXN1bHQuc2V0TWFpbk9iamVjdChzZXJ2bGV0KTsKLQkJcHJvY2Vzc1R5cGVBbm5vdGF0aW9ucyhyZXN1bHQsIHJvb3RUeXBlKTsKLQkJcHJvY2Vzc01ldGhvZEFubm90YXRpb25zKHJlc3VsdCwgcm9vdFR5cGUpOwotCQlwcm9jZXNzRmllbGRBbm5vdGF0aW9ucyhyZXN1bHQsIHJvb3RUeXBlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUmVzdWx0IGNyZWF0ZUxpc3RlbmVyKElUeXBlIHJvb3RUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaXN0ZW5lcigpOwotCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKHJvb3RUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJcmVzdWx0LnNldE1haW5PYmplY3QobGlzdGVuZXIpOwotCQlwcm9jZXNzVHlwZUFubm90YXRpb25zKHJlc3VsdCwgcm9vdFR5cGUpOwotCQlwcm9jZXNzTWV0aG9kQW5ub3RhdGlvbnMocmVzdWx0LCByb290VHlwZSk7Ci0JCXByb2Nlc3NGaWVsZEFubm90YXRpb25zKHJlc3VsdCwgcm9vdFR5cGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZXN1bHQgY3JlYXRlRmlsdGVyKElUeXBlIHJvb3RUeXBlLCBTdHJpbmcgZmlsdGVyTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0JCUZpbHRlciBmaWx0ZXIgPSBXZWJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXIoKTsKLQkJZmlsdGVyLnNldEZpbHRlck5hbWUoZmlsdGVyTmFtZSk7Ci0JCWZpbHRlci5zZXRGaWx0ZXJDbGFzcyhyb290VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCXJlc3VsdC5zZXRNYWluT2JqZWN0KGZpbHRlcik7Ci0JCXByb2Nlc3NUeXBlQW5ub3RhdGlvbnMocmVzdWx0LCByb290VHlwZSk7Ci0JCXByb2Nlc3NNZXRob2RBbm5vdGF0aW9ucyhyZXN1bHQsIHJvb3RUeXBlKTsKLQkJcHJvY2Vzc0ZpZWxkQW5ub3RhdGlvbnMocmVzdWx0LCByb290VHlwZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUeXBlQW5ub3RhdGlvbnMoUmVzdWx0IHJlc3VsdCwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUphdmFFRU9iamVjdCBtYWluT2JqZWN0ID0gcmVzdWx0LmdldE1haW5PYmplY3QoKTsKLQkJYm9vbGVhbiBpc1NlcnZsZXQgPSBTZXJ2bGV0LmNsYXNzLmlzSW5zdGFuY2UobWFpbk9iamVjdCk7Ci0JCWZvciAoSUFubm90YXRpb24gYW5ub3RhdGlvbiA6IHR5cGUuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKGlzU2VydmxldCAmJiBERUNMQVJFX1JPTEVTLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlMaXN0PFNlY3VyaXR5Um9sZVJlZj4gcmVmcyA9IG5ldyBBcnJheUxpc3Q8U2VjdXJpdHlSb2xlUmVmPigpOwotCQkJCXByb2Nlc3NEZWNsYXJlUm9sZXMocmVzdWx0LCByZWZzLCBhbm5vdGF0aW9uLCB0eXBlKTsKLQkJCQkoKFNlcnZsZXQpIG1haW5PYmplY3QpLmdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwocmVmcyk7Ci0JCQl9IGVsc2UgaWYgKFJFU09VUkNFUy5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJTGlzdDxSZXNvdXJjZVJlZj4gcmVzb3VyY2VSZWZzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVJlZj4oMik7Ci0JCQkJcHJvY2Vzc1Jlc291cmNlc0Fubm90YXRpb24oYW5ub3RhdGlvbiwgcmVzb3VyY2VSZWZzLCB0eXBlLCByZXN1bHQuZ2V0RGVwZW5kZWRUeXBlcygpKTsKLQkJCQlyZXN1bHQuZ2V0QWRkaXRpb25hbCgpLmFkZEFsbChyZXNvdXJjZVJlZnMpOwotCQkJfSBlbHNlIGlmIChSRVNPVVJDRS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJTGlzdDxSZXNvdXJjZVJlZj4gcmVzb3VyY2VSZWZzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVJlZj4oMik7Ci0JCQkJcHJvY2Vzc1Jlc291cmNlUmVmQW5ub3RhdGlvbihhbm5vdGF0aW9uLCByZXNvdXJjZVJlZnMsIHR5cGUsIHJlc3VsdC5nZXREZXBlbmRlZFR5cGVzKCkpOwotCQkJCXJlc3VsdC5nZXRBZGRpdGlvbmFsKCkuYWRkQWxsKHJlc291cmNlUmVmcyk7Ci0JCQl9IGVsc2UgaWYgKGlzU2VydmxldCAmJiBSVU5fQVMuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCVJ1bkFzIHJ1bkFzID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXMoKTsKLQkJCQlwcm9jZXNzUnVuQXMoYW5ub3RhdGlvbiwgcnVuQXMpOwotCQkJCSgoU2VydmxldCkgbWFpbk9iamVjdCkuc2V0UnVuQXMocnVuQXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWVsZEFubm90YXRpb25zKFJlc3VsdCByZXN1bHQsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlmb3IgKElGaWVsZCBmaWVsZCA6IHR5cGUuZ2V0RmllbGRzKCkpIHsKLQkJCWZvciAoSUFubm90YXRpb24gYW5ub3RhdGlvbiA6IGZpZWxkLmdldEFubm90YXRpb25zKCkpIHsKLQkJCQlwcm9jZXNzTWVtYmVyQW5ub3RhdGlvbnMocmVzdWx0LCBmaWVsZCwgYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGhvZEFubm90YXRpb25zKFJlc3VsdCByZXN1bHQsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpIHsKLQkJCWZvciAoSUFubm90YXRpb24gYW5ub3RhdGlvbiA6IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJcHJvY2Vzc01lbWJlckFubm90YXRpb25zKHJlc3VsdCwgbWV0aG9kLCBhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTWVtYmVyQW5ub3RhdGlvbnMoUmVzdWx0IHJlc3VsdCwgSU1lbWJlciBtZW1iZXIsIElBbm5vdGF0aW9uIGFubm90YXRpb24pCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoRUpCLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUxpc3Q8RWpiTG9jYWxSZWY+IHJlZnMgPSBuZXcgQXJyYXlMaXN0PEVqYkxvY2FsUmVmPigxKTsKLQkJCXByb2Nlc3NFamJBbm5vdGF0aW9uKGFubm90YXRpb24sIHJlZnMsIG1lbWJlciwgcmVzdWx0LmdldERlcGVuZGVkVHlwZXMoKSk7Ci0JCQlyZXN1bHQuZ2V0QWRkaXRpb25hbCgpLmFkZEFsbChyZWZzKTsKLQkJfSBlbHNlIGlmIChSRVNPVVJDRS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQlMaXN0PFJlc291cmNlUmVmPiByZWZzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVJlZj4oMSk7Ci0JCQlwcm9jZXNzUmVzb3VyY2VSZWZBbm5vdGF0aW9uKGFubm90YXRpb24sIHJlZnMsIG1lbWJlciwgcmVzdWx0LmdldERlcGVuZGVkVHlwZXMoKSk7Ci0JCQlyZXN1bHQuZ2V0QWRkaXRpb25hbCgpLmFkZEFsbChyZWZzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9XZWJBbm5vdGF0aW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYkFubm90YXRpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlNDA2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL1dlYkFubm90YXRpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbi5BYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uLk1hbnlUb09uZVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uLlJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciBLaXJpbCBNaXRvdiBrLm1pdG92QHNhcC5jb20KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV2ViQW5ub3RhdGlvblJlYWRlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvbk1vZGVsUHJvdmlkZXI8V2ViQXBwPiB7Ci0KLQlwcml2YXRlIE1hbnlUb09uZVJlbGF0aW9uPEphdmFFRU9iamVjdCwgSUNvbXBpbGF0aW9uVW5pdD4gbW9kZWxUb1VuaXQ7Ci0KLQlwcml2YXRlIE1hbnlUb09uZVJlbGF0aW9uPEphdmFFRU9iamVjdCwgSUNvbXBpbGF0aW9uVW5pdD4gbW9kZWxUb0ludGVyZmFjZVVuaXQ7Ci0KLQlwcml2YXRlIFdlYkFubm90YXRpb25GYWN0b3J5IGFubm90YXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBXZWJBcHAgZGRBcHA7Ci0KLQlwdWJsaWMgV2ViQW5ub3RhdGlvblJlYWRlcihJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsIFdlYkFwcCBkZEFwcCkgewotCQlzdXBlcihmYWNldGVkUHJvamVjdCk7Ci0JCWlmIChkZEFwcCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtb2RlbCBjYW4gbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZEFwcCA9IGRkQXBwOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWQoKSB7Ci0JCW1vZGVsT2JqZWN0ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViQXBwKCk7Ci0JCWFubm90YXRpb25GYWN0b3J5ID0gV2ViQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlRmFjdG9yeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxvYWRNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4gamF2YVVuaXRzID0gbmV3IEhhc2hTZXQ8SUNvbXBpbGF0aW9uVW5pdD4oKTsKLQkJZm9yIChmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJdmlzaXRKYXZhRmlsZXMoamF2YVVuaXRzLCByb290KTsKLQkJfQotCQlhbm5vdGF0aW9uRmFjdG9yeSA9IFdlYkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUZhY3RvcnkoKTsKLQotCQltb2RlbFRvSW50ZXJmYWNlVW5pdCA9IG5ldyBNYW55VG9PbmVSZWxhdGlvbjxKYXZhRUVPYmplY3QsIElDb21waWxhdGlvblVuaXQ+KCk7Ci0JCW1vZGVsVG9Vbml0ID0gbmV3IE1hbnlUb09uZVJlbGF0aW9uPEphdmFFRU9iamVjdCwgSUNvbXBpbGF0aW9uVW5pdD4oKTsKLQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IHVuaXQgOiBqYXZhVW5pdHMpIHsKLQkJCVJlc3VsdCByZXN1bHQgPSBhbmFseXplQ29tcGlsYXRpb25Vbml0KHVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJcHJvY2Vzc1Jlc3VsdCh1bml0LCByZXN1bHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW5hbHl6ZSB0aGlzIHVuaXQgZm9yIGEgd2ViIGFydGlmYWN0LiBJZiB0aGUgZmlsZSBpcyBub3QgYSB2YWxpZCBqYXZhCi0JICogY29tcGlsYXRpb24gdW5pdCBvciBpdCBkb2VzIG5vdCBjb250YWluIGEgY2xhc3MgdGhlIG1ldGhvZCByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBPbmx5IHRoZSBwcmltYXJ5IHR5cGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgcHJvY2Vzc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0Ci0JICogICAgICAgICAgICB0aGUgdW5pdCB0byBiZSBwcm9jZXNzZWQuCi0JICogQHJldHVybiByZXN1bHQgZnJvbSBwcm9jZXNzaW5nIHRoZSBmaWxlCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFJlc3VsdCBhbmFseXplQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgdW5pdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlUeXBlIHJvb3RUeXBlID0gdW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLQkJLyoKLQkJICogSWYgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IHZhbGlkIGFuZCBjYW4gbm90IGJlIGNvbXBpbGVkIHRoZQotCQkgKiByb290VHlwZSBtYXkgYmUgbnVsbC4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgY2xhc3MgaXMgZGVmaW5lIGFzIGZvbGxvd3MKLQkJICogPGNvZGU+IEBTdGF0ZWxlc3MgcHVibGljIFNvbWVDbGFzcyBpbXBsZW1lbnRzIFNvbWVJbnRlcmZhY2V7fTwvY29kZT4uCi0JCSAqIEhlcmUgdGhlICJjbGFzcyIgd29yZCBpcyBtaXNzZWQgYW5kIHRoZSB0eXBlIGlzIG5vdCB2YWxpZC4KLQkJICovCi0JCWlmIChyb290VHlwZSA9PSBudWxsIHx8ICFyb290VHlwZS5pc0NsYXNzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGRBcHAuZ2V0U2VydmxldHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChyb290VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKSkpCi0JCQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXQocm9vdFR5cGUsIHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGRBcHAuZ2V0TGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAocm9vdFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKSkpCi0JCQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUxpc3RlbmVyKHJvb3RUeXBlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZEFwcC5nZXRGaWx0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGaWx0ZXIgZmlsdGVyID0gKEZpbHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAocm9vdFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGZpbHRlci5nZXRGaWx0ZXJDbGFzcygpKSkgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVGaWx0ZXIocm9vdFR5cGUsIGZpbHRlci5nZXRGaWx0ZXJOYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIHJlc3VsdCBmcm9tIHBhcnNpbmcgdGhlIHVuaXQuIERlcGVuZGluZyBvbiB0aGUgcmVzdWx0IHRoaXMKLQkgKiBtaWdodCBpbmNsdWRlIGFkZGluZyBhIHNlc3Npb24gYmVhbiwgbWVzc2FnZSBkcml2ZW4gYmVhbiwgc2VjdXJpdHlSb2xlCi0JICogZXRjLgotCSAqIAotCSAqIEBwYXJhbSB1bml0Ci0JICogQHBhcmFtIHJlc3VsdAotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXN1bHQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSmF2YUVFT2JqZWN0IG1haW5PYmplY3QgPSByZXN1bHQuZ2V0TWFpbk9iamVjdCgpOwotCQlpZiAoU2VydmxldC5jbGFzcy5pc0luc3RhbmNlKG1haW5PYmplY3QpKQotCQkJc2VydmxldEZvdW5kKHVuaXQsIChTZXJ2bGV0KSByZXN1bHQuZ2V0TWFpbk9iamVjdCgpLCByZXN1bHQuZ2V0RGVwZW5kZWRUeXBlcygpKTsKLQkJZm9yIChKYXZhRUVPYmplY3QgYWRkaXRpb25hbCA6IHJlc3VsdC5nZXRBZGRpdGlvbmFsKCkpIHsKLQkJCWlmIChFamJMb2NhbFJlZi5jbGFzcy5pc0luc3RhbmNlKGFkZGl0aW9uYWwpKSB7Ci0JCQkJZWpiTG9jYWxSZWZGb3VuZCh1bml0LCAoRWpiTG9jYWxSZWYpIGFkZGl0aW9uYWwsIHJlc3VsdC5nZXREZXBlbmRlZFR5cGVzKCkpOwotCQkJfSBlbHNlIGlmIChSZXNvdXJjZVJlZi5jbGFzcy5pc0luc3RhbmNlKGFkZGl0aW9uYWwpKSB7Ci0JCQkJcmVzb3VyY2VSZWZGb3VuZCh1bml0LCAoUmVzb3VyY2VSZWYpIGFkZGl0aW9uYWwsIHJlc3VsdC5nZXREZXBlbmRlZFR5cGVzKCkpOwotCQkJfSBlbHNlIGlmIChTZWN1cml0eVJvbGUuY2xhc3MuaXNJbnN0YW5jZShhZGRpdGlvbmFsKSkgewotCQkJCXNlY3VyaXR5Um9sZUZvdW5kKHJlc3VsdC5nZXRNYWluT2JqZWN0KCksIChTZWN1cml0eVJvbGUpIGFkZGl0aW9uYWwpOwotCQkJfSBlbHNlIGlmIChTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcy5pc0luc3RhbmNlKGFkZGl0aW9uYWwpKSB7Ci0JCQkJc2VjdXJpdHlJZGVudGl0eVR5cGVGb3VuZCh1bml0LCAoU2VjdXJpdHlJZGVudGl0eVR5cGUpIGFkZGl0aW9uYWwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlcnZsZXRGb3VuZChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFNlcnZsZXQgc2VydmxldCwgQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQltb2RlbE9iamVjdC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsKLQkJY29ubmVjdE9iamVjdFdpdGhGaWxlKHVuaXQsIHNlcnZsZXQsIGRlcGVuZGVkVHlwZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWN1cml0eUlkZW50aXR5VHlwZUZvdW5kKElDb21waWxhdGlvblVuaXQgZmlsZSwgU2VjdXJpdHlJZGVudGl0eVR5cGUgYWRkaXRpb25hbCkgewotCX0KLQotCXByaXZhdGUgdm9pZCByZXNvdXJjZVJlZkZvdW5kKElDb21waWxhdGlvblVuaXQgdW5pdCwgUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYsIENvbGxlY3Rpb248SVR5cGU+IGRlcGVuZGVkVHlwZXMpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJbW9kZWxPYmplY3QuZ2V0UmVzb3VyY2VSZWZzKCkuYWRkKHJlc291cmNlUmVmKTsKLQkJY29ubmVjdE9iamVjdFdpdGhGaWxlKHVuaXQsIHJlc291cmNlUmVmLCBkZXBlbmRlZFR5cGVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWpiTG9jYWxSZWZGb3VuZChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIEVqYkxvY2FsUmVmIGxvY2FsUmVmLCBDb2xsZWN0aW9uPElUeXBlPiBkZXBlbmRlZFR5cGVzKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCW1vZGVsT2JqZWN0LmdldEVqYkxvY2FsUmVmcygpLmFkZChsb2NhbFJlZik7Ci0JCWNvbm5lY3RPYmplY3RXaXRoRmlsZSh1bml0LCBsb2NhbFJlZiwgZGVwZW5kZWRUeXBlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3RPYmplY3RXaXRoRmlsZShJQ29tcGlsYXRpb25Vbml0IHVuaXQsIEphdmFFRU9iamVjdCBsb2NhbFJlZiwgQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQltb2RlbFRvVW5pdC5jb25uZWN0KGxvY2FsUmVmLCB1bml0KTsKLQkJZm9yIChJVHlwZSB0eXBlIDogZGVwZW5kZWRUeXBlcykgewotCQkJaWYgKHR5cGUuaXNCaW5hcnkoKSB8fCB0eXBlLmlzSW50ZXJmYWNlKCkgPT0gZmFsc2UpCi0JCQkJY29udGludWU7Ci0JCQltb2RlbFRvSW50ZXJmYWNlVW5pdC5jb25uZWN0KGxvY2FsUmVmLCB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZGRlZENvbXBpbGF0aW9uVW5pdChJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElDb21waWxhdGlvblVuaXQgdW5pdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzdWx0IHJlc3VsdCA9IGFuYWx5emVDb21waWxhdGlvblVuaXQodW5pdCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlwcm9jZXNzUmVzdWx0KHVuaXQsIHJlc3VsdCk7Ci0JCW1vZGVsRXZlbnQuYWRkUmVzb3VyY2UodW5pdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoYW5nZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbFRvVW5pdC5jb250YWluc1RhcmdldCh1bml0KSkKLQkJCXByb2Nlc3NDaGFuZ2VkTW9kZWxVbml0KG1vZGVsRXZlbnQsIHVuaXQpOwotCQllbHNlCi0JCQlwcm9jZXNzQWRkZWRDb21waWxhdGlvblVuaXQobW9kZWxFdmVudCwgdW5pdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDaGFuZ2VkTW9kZWxVbml0KElNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCwgSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3NSZW1vdmVkQ29tcGlsYXRpb25Vbml0KG1vZGVsRXZlbnQsIHVuaXQpOwotCQlwcm9jZXNzQWRkZWRDb21waWxhdGlvblVuaXQobW9kZWxFdmVudCwgdW5pdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbW92ZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbFRvVW5pdC5jb250YWluc1RhcmdldCh1bml0KSkKLQkJCXByb2Nlc3NSZW1vdmVkTW9kZWxSZXNvdXJjZShtb2RlbEV2ZW50LCB1bml0KTsKLQkJZWxzZSBpZiAobW9kZWxUb0ludGVyZmFjZVVuaXQuY29udGFpbnNUYXJnZXQodW5pdCkpCi0JCQlwcm9jZXNzUmVtb3ZlSW50ZXJmYWNlKG1vZGVsRXZlbnQsIHVuaXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVtb3ZlSW50ZXJmYWNlKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQsIElDb21waWxhdGlvblVuaXQgdW5pdCkgewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZW1vdmVkUGFja2FnZShJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoSUNvbXBpbGF0aW9uVW5pdCB1bml0IDogbW9kZWxUb1VuaXQuZ2V0VGFyZ2V0cygpKSB7Ci0JCQlpZiAodW5pdC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQlwcm9jZXNzUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChtb2RlbEV2ZW50LCB1bml0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVtb3ZlZE1vZGVsUmVzb3VyY2UoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCwgSUNvbXBpbGF0aW9uVW5pdCBmaWxlKSB7Ci0JCUNvbGxlY3Rpb248SmF2YUVFT2JqZWN0PiBtb2RlbE9iamVjdHMgPSBtb2RlbFRvVW5pdC5nZXRTb3VyY2VzKGZpbGUpOwotCQlmb3IgKEphdmFFRU9iamVjdCBvIDogbW9kZWxPYmplY3RzKSB7Ci0JCQlpZiAoU2VydmxldC5jbGFzcy5pc0luc3RhbmNlKG8pKQotCQkJCWRpc2Nvbm5lY3RGcm9tUm9sZXMobyk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBvKTsKLQkJfQotCQltb2RlbFRvVW5pdC5kaXNjb25uZWN0KGZpbGUpOwotCQlldmVudC5zZXRFdmVudENvZGUoZXZlbnQuZ2V0RXZlbnRDb2RlKCkgfCBJTW9kZWxQcm92aWRlckV2ZW50LlJFTU9WRURfUkVTT1VSQ0UpOwotCQlldmVudC5hZGRSZXNvdXJjZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJUGF0aCBtb2RlbFBhdGgsIE9iamVjdCBjb250ZXh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZVJlZj4gZ2V0U2VjdXJpdHlSb2xlUmVmcyhKYXZhRUVPYmplY3QgdGFyZ2V0KSB7Ci0JCWlmIChTZXJ2bGV0LmNsYXNzLmlzSW5zdGFuY2UodGFyZ2V0KSkKLQkJCXJldHVybiAoKFNlcnZsZXQpIHRhcmdldCkuZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTZWN1cml0eVJvbGU+IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiBtb2RlbE9iamVjdC5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvV2ViQXBwTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvV2ViQXBwTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkM2Q0MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1dlYkFwcE1lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2Vycy5KTkRJUmVmc01lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnMuTW9kZWxFbGVtZW50TWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2Vycy5Nb2RlbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBXZWJBcHAgbWVyZ2VyIG1lcmdlcyB0aGUgV2ViQXBwIGFydGlmYWN0LiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcE1lcmdlciAgZXh0ZW5kcyBNb2RlbEVsZW1lbnRNZXJnZXIgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB3aGljaCBnZXRzIHRoZSBiYXNlIGFuZCB0byBtZXJnZSBXZWJBcHAgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBfYmFzZSAtIGlzIHRoZSBiYXNlIGVsZW1lbnQsIGludG8gd2hpY2ggdGhlIHZhbHVlcyB3aWxsIGJlIG1lcmdlZC4KLSAgICogQHBhcmFtIG1lcmdlIC0gaXMgdGhlIGNvbmZsaWN0aW5nIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgbWVyZ2VkIGludG8gYmFzZS4KLSAgICogQHBhcmFtIGtpbmQKLSAgICovCi0gIHB1YmxpYyBXZWJBcHBNZXJnZXIoSmF2YUVFT2JqZWN0IF9iYXNlLCBKYXZhRUVPYmplY3QgbWVyZ2UsIGludCBraW5kKSB7Ci0gICAgc3VwZXIoX2Jhc2UsIG1lcmdlLCBraW5kKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiYXNlIGVsZW1lbnQsIGludG8gd2hpY2ggdGhlIHZhbHVlcyB3aWxsIGJlIG1lcmdlZC4KLSAgICogCi0gICAqIEByZXR1cm4gYmFzZSBlbGVtZW50LCBpbnRvIHdoaWNoIHRoZSB2YWx1ZXMgd2lsbCBiZSBtZXJnZWQuCi0gICAqLwotICBXZWJBcHAgZ2V0QmFzZVdlYkFwcCgpewotICAgIHJldHVybiAoV2ViQXBwKSBnZXRCYXNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmxpY3RpbmcgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBtZXJnZWQgaW50byBiYXNlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgY29uZmxpY3RpbmcgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBtZXJnZWQgaW50byBiYXNlLgotICAgKi8KLSAgV2ViQXBwIGdldFRvTWVyZ2VXZWJBcHAoKXsKLSAgICByZXR1cm4gKFdlYkFwcCkgZ2V0VG9NZXJnZSgpOwotICB9Ci0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5Nb2RlbEVsZW1lbnRNZXJnZXIjcHJvY2VzcygpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgTGlzdCB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZihnZXRUb01lcmdlV2ViQXBwKCkgPT0gbnVsbCB8fCBnZXRCYXNlV2ViQXBwKCkgPT0gbnVsbCl7Ci0gICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBtZXJnZVNlcnZsZXRzKHdhcm5pbmdzKTsKLSAgICAgIG1lcmdlRmlsdGVycyh3YXJuaW5ncyk7Ci0gICAgICBtZXJnZUxpc3RlbmVycyh3YXJuaW5ncyk7Ci0KLSAgICAgIGNvcHlHZW5lcmFsRGF0YSh3YXJuaW5ncyk7Ci0KLSAgICAgIG1lcmdlUnVuQXMod2FybmluZ3MpOwotICAgICAgbWVyZ2VKTkRJUmVmcyh3YXJuaW5ncyk7Ci0gICAgICBtZXJnZVNlY3VyaXR5Um9sZXMod2FybmluZ3MpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgTW9kZWxFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIHJldHVybiB3YXJuaW5nczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtZXJnZUZpbHRlcnMoTGlzdCB3YXJuaW5ncykgewotICAgIGlmIChnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RmlsdGVycygpICE9IG51bGwpewotICAgICAgY29weU1pc3NpbmdDb250ZW50SW5CYXNlKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRGaWx0ZXJzKCksIGdldEJhc2VXZWJBcHAoKS5nZXRGaWx0ZXJzKCkpOwotICAgIH0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEZpbHRlck1hcHBpbmdzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5QWxsQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RmlsdGVyTWFwcGluZ3MoKSwgZ2V0QmFzZVdlYkFwcCgpLmdldEZpbHRlck1hcHBpbmdzKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtZXJnZUxpc3RlbmVycyhMaXN0IHdhcm5pbmdzKSB7Ci0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRMaXN0ZW5lcnMoKSAhPSBudWxsKXsKLSAgICAgIGNvcHlNaXNzaW5nQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0TGlzdGVuZXJzKCksIGdldEJhc2VXZWJBcHAoKS5nZXRMaXN0ZW5lcnMoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG1lcmdlU2VydmxldHMoTGlzdCB3YXJuaW5ncykgewotCi0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRTZXJ2bGV0cygpICE9IG51bGwpewotICAgICAgY29weU1pc3NpbmdDb250ZW50SW5CYXNlKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRTZXJ2bGV0cygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0U2VydmxldHMoKSk7Ci0gICAgfQotCi0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKSAhPSBudWxsKXsKLSAgICAgIGNvcHlBbGxDb250ZW50SW5CYXNlKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKSwgZ2V0QmFzZVdlYkFwcCgpLmdldFNlcnZsZXRNYXBwaW5ncygpKTsKLSAgICB9Ci0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIG1lcmdlSk5ESVJlZnMoTGlzdCB3YXJuaW5ncykgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICBKTkRJUmVmc01lcmdlciBqbmRpUmVmc01lcmdlciA9IG5ldyBKTkRJUmVmc01lcmdlcihnZXRCYXNlV2ViQXBwKCksIGdldFRvTWVyZ2VXZWJBcHAoKSwgZ2V0S2luZCgpKTsKLSAgICB3YXJuaW5ncy5hZGRBbGwoam5kaVJlZnNNZXJnZXIucHJvY2VzcygpKTsKLSAgfSAKLQotCi0gIHByaXZhdGUgdm9pZCBtZXJnZVJ1bkFzKExpc3Qgd2FybmluZ3MpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgTGlzdCBiYXNlU2VydmxldHMgPSBnZXRCYXNlV2ViQXBwKCkuZ2V0U2VydmxldHMoKTsKLSAgICBMaXN0IHRvTWVyZ2VTZXJ2bGV0cyA9IGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRTZXJ2bGV0cygpOwotICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IHRvTWVyZ2VTZXJ2bGV0cykgewotICAgICAgU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIG9iamVjdDsKLSAgICAgIFNlcnZsZXQgc2VydmxldEluQmFzZSA9IGZpbmRTZXJ2bGV0SW5CYXNlKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSwgYmFzZVNlcnZsZXRzKTsKLSAgICAgIGlmKHNlcnZsZXRJbkJhc2UgIT0gbnVsbCl7Ci0gICAgICAgIFJ1bkFzIGJhc2VTZWNJZCA9IHNlcnZsZXRJbkJhc2UuZ2V0UnVuQXMoKTsKLSAgICAgICAgUnVuQXMgdG9NZXJnZVNlY0lkID0gc2VydmxldC5nZXRSdW5BcygpOwotICAgICAgICBpZihiYXNlU2VjSWQgPT0gbnVsbCAmJiB0b01lcmdlU2VjSWQgIT0gbnVsbCl7Ci0gICAgICAgICAgc2VydmxldEluQmFzZS5zZXRSdW5BcygoUnVuQXMpIEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KXRvTWVyZ2VTZWNJZCkpOyAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByaXZhdGUgU2VydmxldCBmaW5kU2VydmxldEluQmFzZShTdHJpbmcgc2VydmxldE5hbWUsIExpc3QgYmFzZVNlcnZsZXRzKSB7Ci0gICAgZm9yIChPYmplY3Qgb2JqZWN0IDogYmFzZVNlcnZsZXRzKSB7Ci0gICAgICBTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgb2JqZWN0OwotCQkJaWYoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGwgJiYgc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0TmFtZSkpewotICAgICAgICByZXR1cm4gc2VydmxldDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbWVyZ2VTZWN1cml0eVJvbGVzKExpc3Qgd2FybmluZ3MpIHsKLSAgICBMaXN0IHNlY3VyaXR5Um9sZXNCYXNlID0gZ2V0QmFzZVdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKTsKLSAgICBMaXN0IHNlY3VyaXR5Um9sZXNUb01lcmdlID0gZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKTsKLSAgICBpZiAoc2VjdXJpdHlSb2xlc1RvTWVyZ2UgPT0gbnVsbCl7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoT2JqZWN0IHNSb2xlcyA6IHNlY3VyaXR5Um9sZXNUb01lcmdlKSB7Ci0gICAgICBpZighY29udGFpbnNTZWNSb2xlKChTZWN1cml0eVJvbGUpIHNSb2xlcywgc2VjdXJpdHlSb2xlc0Jhc2UpKXsKLSAgICAgICAgc2VjdXJpdHlSb2xlc0Jhc2UuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBzUm9sZXMpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNTZWNSb2xlKFNlY3VyaXR5Um9sZSBzZWNSb2xlLCBMaXN0IHNlY1JvbGVzKXsKLSAgICBmb3IgKE9iamVjdCBzUm9sZXMgOiBzZWNSb2xlcykgewotICAgICAgaWYoKChTZWN1cml0eVJvbGUpc1JvbGVzKS5nZXRSb2xlTmFtZSgpID09IG51bGwgfHwgc2VjUm9sZS5nZXRSb2xlTmFtZSgpID09IG51bGwpewotICAgICAgICByZXR1cm4gKChTZWN1cml0eVJvbGUpc1JvbGVzKS5nZXRSb2xlTmFtZSgpID09IHNlY1JvbGUuZ2V0Um9sZU5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGlmICgoKFNlY3VyaXR5Um9sZSlzUm9sZXMpLmdldFJvbGVOYW1lKCkuZXF1YWxzKHNlY1JvbGUuZ2V0Um9sZU5hbWUoKSkpewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlHZW5lcmFsRGF0YShMaXN0IHdhcm5pbmdzKXsKLSAgICBjb3B5SmF2YUVFR3JvdXAoKTsKLQotICAgIGlmIChnZXRUb01lcmdlV2ViQXBwKCkuZ2V0Q29udGV4dFBhcmFtcygpICE9IG51bGwgJiYgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldENvbnRleHRQYXJhbXMoKS5zaXplKCkgPiAwKXsKLSAgICAgIGNvcHlNaXNzaW5nQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0Q29udGV4dFBhcmFtcygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0Q29udGV4dFBhcmFtcygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldERpc3RyaWJ1dGFibGVzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldERpc3RyaWJ1dGFibGVzKCksIGdldEJhc2VXZWJBcHAoKS5nZXREaXN0cmlidXRhYmxlcygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEVycm9yUGFnZXMoKSAhPSBudWxsKXsKLSAgICAgIGNvcHlNaXNzaW5nQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RXJyb3JQYWdlcygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0RXJyb3JQYWdlcygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEpzcENvbmZpZ3MoKSAhPSBudWxsKXsKLSAgICAgIGNvcHlNaXNzaW5nQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0SnNwQ29uZmlncygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0SnNwQ29uZmlncygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCksIGdldEJhc2VXZWJBcHAoKS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpKTsKLSAgICB9Ci0KLQotICAgIGlmIChnZXRUb01lcmdlV2ViQXBwKCkuZ2V0TG9naW5Db25maWdzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldExvZ2luQ29uZmlncygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0TG9naW5Db25maWdzKCkpOwotICAgIH0KLQotCi0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgZ2V0QmFzZVdlYkFwcCgpLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldE1pbWVNYXBwaW5ncygpICE9IG51bGwpewotICAgICAgY29weU1pc3NpbmdDb250ZW50SW5CYXNlKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRNaW1lTWFwcGluZ3MoKSwgZ2V0QmFzZVdlYkFwcCgpLmdldE1pbWVNYXBwaW5ncygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFNlc3Npb25Db25maWdzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFNlc3Npb25Db25maWdzKCksIGdldEJhc2VXZWJBcHAoKS5nZXRTZXNzaW9uQ29uZmlncygpKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFdlbGNvbWVGaWxlTGlzdHMoKSAhPSBudWxsKXsKLSAgICAgIGNvcHlNaXNzaW5nQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0V2VsY29tZUZpbGVMaXN0cygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0V2VsY29tZUZpbGVMaXN0cygpKTsKLSAgICB9Ci0KLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlBbGxDb250ZW50SW5CYXNlKExpc3QgbGlzdFNvdXJjZSwgTGlzdCB0YXJnZXQpIHsKLSAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBsaXN0U291cmNlKSB7Ci0JCQlpZiAoYXJ0aWZhY3RJc1ZhbGlkKG9iamVjdCkpewotICAgICAgdGFyZ2V0LmFkZChFY29yZVV0aWwuY29weSgoRU9iamVjdCkgb2JqZWN0KSk7Ci0gICAgfQotCQl9Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5TWlzc2luZ0NvbnRlbnRJbkJhc2UoTGlzdCBsaXN0U291cmNlLCBMaXN0IHRhcmdldCkgewotICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGxpc3RTb3VyY2UpIHsKLQkJCWlmKGFydGlmYWN0SXNWYWxpZChvYmplY3QpICYmICFhcnRpZmFjdEV4aXN0cyhvYmplY3QsIHRhcmdldCkpewotICAgICAgICB0YXJnZXQuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvYmplY3QpKTsgICAgICAgIAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXJ0aWZhY3RJc1ZhbGlkKE9iamVjdCBqYXZhRUVPYmplY3QpIHsKLQkJaWYgKGphdmFFRU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJcmV0dXJuICggKFNlcnZsZXQpamF2YUVFT2JqZWN0KS5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGw7Ci0JCX0gZWxzZSBpZiAoamF2YUVFT2JqZWN0IGluc3RhbmNlb2YgTGlzdGVuZXIpeyAgICAgICAgCi0JCQlyZXR1cm4gKChMaXN0ZW5lcilqYXZhRUVPYmplY3QpLmdldExpc3RlbmVyQ2xhc3MoKSAhPSBudWxsOwotCQl9IGVsc2UgaWYgKGphdmFFRU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlcil7Ci0JCQlyZXR1cm4gKChGaWx0ZXIpamF2YUVFT2JqZWN0KS5nZXRGaWx0ZXJOYW1lKCkgIT0gbnVsbDsKLQkJfSAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gIHByaXZhdGUgYm9vbGVhbiBhcnRpZmFjdEV4aXN0cyhPYmplY3QgamF2YUVFT2JqZWN0LCBMaXN0IHRhcmdldCkgewotICAgIGZvciAoT2JqZWN0IHRhcmdldEFydGlmYWN0IDogdGFyZ2V0KSB7Ci0JCQlpZiggIWFydGlmYWN0SXNWYWxpZCh0YXJnZXRBcnRpZmFjdCkgKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLSAgICAgIGlmIChqYXZhRUVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KXsKLQkJCQkKLSAgICAgICAgaWYoKChTZXJ2bGV0KSB0YXJnZXRBcnRpZmFjdCkuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoKChTZXJ2bGV0KWphdmFFRU9iamVjdCkuZ2V0U2VydmxldE5hbWUoKSkpewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGphdmFFRU9iamVjdCBpbnN0YW5jZW9mIExpc3RlbmVyKXsgICAgICAgIAotICAgICAgICBpZigoKExpc3RlbmVyKSB0YXJnZXRBcnRpZmFjdCkuZ2V0TGlzdGVuZXJDbGFzcygpLmVxdWFscygoKExpc3RlbmVyKWphdmFFRU9iamVjdCkuZ2V0TGlzdGVuZXJDbGFzcygpKSl7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoamF2YUVFT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyKXsKLSAgICAgICAgaWYoKChGaWx0ZXIpIHRhcmdldEFydGlmYWN0KS5nZXRGaWx0ZXJOYW1lKCkuZXF1YWxzKCgoRmlsdGVyKWphdmFFRU9iamVjdCkuZ2V0RmlsdGVyTmFtZSgpKSl7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoamF2YUVFT2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRpb24pewotICAgICAgICBpZigoKERlc2NyaXB0aW9uKSB0YXJnZXRBcnRpZmFjdCkuZ2V0VmFsdWUoKS5lcXVhbHMoKChEZXNjcmlwdGlvbilqYXZhRUVPYmplY3QpLmdldFZhbHVlKCkpKXsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChqYXZhRUVPYmplY3QgaW5zdGFuY2VvZiBXZWxjb21lRmlsZSl7Ci0gICAgICAgIGlmKCgoV2VsY29tZUZpbGUpIHRhcmdldEFydGlmYWN0KS5nZXRXZWxjb21lRmlsZSgpLmVxdWFscygoKFdlbGNvbWVGaWxlKWphdmFFRU9iamVjdCkuZ2V0V2VsY29tZUZpbGUoKSkpewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5SmF2YUVFR3JvdXAoKXsKLSAgICBpZiAoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldERlc2NyaXB0aW9ucygpICE9IG51bGwpewotICAgICAgY29weUFsbENvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldERlc2NyaXB0aW9ucygpLCBnZXRCYXNlV2ViQXBwKCkuZ2V0RGVzY3JpcHRpb25zKCkpOwotICAgIH0KLQotICAgIGlmIChnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RGlzcGxheU5hbWVzKCkgIT0gbnVsbCl7Ci0gICAgICBjb3B5QWxsQ29udGVudEluQmFzZShnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RGlzcGxheU5hbWVzKCksIGdldEJhc2VXZWJBcHAoKS5nZXREaXNwbGF5TmFtZXMoKSk7Ci0gICAgfQotCi0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRJY29ucygpICE9IG51bGwpewotICAgICAgY29weUFsbENvbnRlbnRJbkJhc2UoZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEljb25zKCksIGdldEJhc2VXZWJBcHAoKS5nZXRJY29ucygpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldFRvTWVyZ2VXZWJBcHAoKS5pc1NldFZlcnNpb24oKSl7Ci0gICAgICBnZXRCYXNlV2ViQXBwKCkuc2V0VmVyc2lvbihnZXRUb01lcmdlV2ViQXBwKCkuZ2V0VmVyc2lvbigpKTsKLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTU1YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotV2ViQW5ub3RhdGlvblJlYWRlci5EaXNwb3NlV2ViQW5ub3RhdGlvblJlYWRlcj1EaXNwb3NlIHdlYiBhbm5vdGF0aW9uIHJlYWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2plZS93ZWIvQWN0aXZhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL3dlYi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2OWQ1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvamVlL3dlYi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFdUUFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0JewotCQlmaW5hbCBJTG9nIGxvZyA9IGdldERlZmF1bHQoKS5nZXRMb2coKTsKLQkJZmluYWwgU3RyaW5nIG1zZyA9ICJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2cubG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ViM2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmxldF91aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTkxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXNlcnZsZXR1aS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjA5YmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzlhODE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI01vbiBGZWIgMTggMTU6NTc6MDkgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY0NWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWk7YnVuZGxlLXZlcnNpb249IjEuMC4xMDAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmY1NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzZXJ2bGV0X3VpLyxcCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ4NTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2ZpbHRlcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZmlsdGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2FmYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZmlsdGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdsaXN0ZW5lcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3bGlzdGVuZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMmE4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdsaXN0ZW5lcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVlYWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTQ0ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYmphdmEtaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJqYXZhLWljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2NiNGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYmphdmEtaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL3dhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL3dhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy93YXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGFlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPVdUUCBTZXJ2bGV0IFVJIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwotY3JlYXRlLndlYi5tb2R1bGVfdWlfPUNyZWF0ZSBhIEoyRUUgV2ViIE1vZHVsZQotY3JlYXRlLndlYi5wcm9qZWN0X3VpXz1DcmVhdGUgYSBKMkVFIFdlYiBtb2R1bGUKLXdlYi5hY3Rpb25zLmRlc2NyaXB0aW9uX3VpXz1BY3Rpb25zIGZvciBKMkVFIFdlYiBEZXZlbG9wbWVudAotY3JlYXRlX3NlcnZsZXRfdWlfPUNyZWF0ZSBKYXZhIFNlcnZsZXQgZmlsZQotd2FyLmltcG9ydC5kZXNjcmlwdGlvbl91aV89SW1wb3J0IGFuIGV4dGVybmFsIFdBUiBmaWxlIGludG8gYW4gV2ViIHByb2plY3QKLXdhci5pbXBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgV0FSIEZpbGUuLi4KLXdhci5leHBvcnQuZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBhIFdlYiBwcm9qZWN0IGludG8gYSBXQVIgZmlsZQotd2FyLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBXQVIgRmlsZS4uLgotV2FyZXhwb3J0V2l6YXJkLm5hbWU9V0FSIGZpbGUKLVdhcmV4cG9ydFdpemFyZC5kZXNjcmlwdGlvbj1FeHBvcnQgYSBXZWIgTW9kdWxlIGludG8gYW4gZXh0ZXJuYWwgV0FSIGZpbGUKLVdhckltcG9ydFdpemFyZC5uYW1lPVdBUiBmaWxlCi1XYXJJbXBvcnRXaXphcmQuZGVzY3JpcHRpb249SW1wb3J0IGFuIGV4dGVybmFsIFdBUiBmaWxlIGludG8gYSBXZWIgUHJvamVjdAotd2ViLmNhdGVnb3J5X3VpXz1XZWIKLXdlYi5wcm9qZWN0X3VpXz1EeW5hbWljIFdlYiBQcm9qZWN0Ci1zdGF0aWMud2ViLnByb2plY3RfdWlfPVN0YXRpYyBXZWIgUHJvamVjdAotbmV3LndlYi5wcm9qZWN0LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBEeW5hbWljIFdlYiBwcm9qZWN0Ci1Db252ZXJ0V2ViUHJvamVjdFR5cGU9Q29udmVydCBXZWIgUHJvamVjdAotY29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLmxhYmVsPUNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBwcm9qZWN0Li4uCi1Db252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24udG9vbHRpcD1XZWIgTW9kdWxlIENvbnZlcnNpb24gV2l6YXJkCi1jb252ZXJ0VG9EeW5hbWljPUNvbnZlcnQgdG8gV2ViIE1vZHVsZS4uLgotU2VydmxldFdlYlJlZ2lvbldpemFyZC5uYW1lPVNlcnZsZXQKLVNlcnZsZXRXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IFNlcnZsZXQKLVNlcnZsZXRXZWJSZWdpb25XaXphcmQudGl0bGU9TmV3IFNlcnZsZXQKLVNlcnZsZXRfVUlfPVNlcnZsZXQuLi4KLUZpbHRlcldlYlJlZ2lvbldpemFyZC5uYW1lPUZpbHRlcgotRmlsdGVyV2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBGaWx0ZXIKLXNlcnZsZXRBbm5vdGF0aW9uRGVjb3JhdG9yPVNlcnZsZXQgQW5ub3RhdGlvbiBEZWNvcmF0b3IKLXNlcnZsZXRBbm5vdGF0aW9uRGVjb3JhdG9yLmRlc2NyaXB0aW9uPUFkZHMgYSBkZWNvcmF0b3IgdG8gYW4gYW5ub3RhdGVkIHNlcnZsZXQuCi13ZWItcHJvamVjdC13aXphcmQtbmFtZSA9IFdlYiBQcm9qZWN0Ci13ZWItcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBXZWIgcHJvamVjdAotd2ViQXBwTGlicmFyaWVzQ29udGFpbmVyTmFtZSA9IFdlYiBBcHAgTGlicmFyaWVzCi0KLUxpc3RlbmVyV2ViUmVnaW9uV2l6YXJkLm5hbWU9TGlzdGVuZXIKLUxpc3RlbmVyV2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgTGlzdGVuZXIKLQotZW5oYW5jZWQuamF2YS5mb3Iud2ViLm5hbWU9RW5oYW5jZWQgSmF2YSBSZW5kZXJpbmcgZm9yIFdlYgotajJlZT1KYXZhIEVFCi1qMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfPUFjdGlvbnMgZm9yIEoyRUUgRGV2ZWxvcG1lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5MTZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8IS0tIENyZWF0ZSBKYXZhIEVFIFByb2plY3RzIGRyb3AgZG93biB0b29sYmFyIGJ1dHRvbiAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlajJlZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlajJlZS5hY3Rpb25zLmRlc2NyaXB0aW9uX3VpXyIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyZWVNYWluQWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0phdmFFRUFydGlmYWN0IgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3REcm9wRG93bkFjdGlvbiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYiCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlcnZsZXRXZWJSZWdpb25XaXphcmQubmFtZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVTZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uIiAvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3SmF2YUVFUHJvamVjdCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJKMkVFTWFpbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0phdmFFRVByb2plY3REcm9wRG93bkFjdGlvbiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIld2ViLnByb2plY3RfdWlfIgotICAgICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW5ldy53ZWIucHJvamVjdC5kZXNjcmlwdGlvbl91aV8iIC8+Ci0gICAgICA8L2FjdGlvblNldD4gCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBXZWIgTW9kdWxlIFdpemFyZCAtLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSjJFRVVJUHJvamVjdFdpemFyZHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIucHJvamVjdF91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICAgICAgICBmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlcHJvamVjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMTAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy53ZWIucHJvamVjdC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotICAgICAgPC93aXphcmQ+Ci0KLSAgICAgIDwhLS1uZXcgc2VydmxldCBjb250cmlidXRpb24tLT4KLSAJICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlU2VydmxldFdlYlJlZ2lvbldpemFyZC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLSAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlcnZsZXRXaXphcmQiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMTAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVNlcnZsZXRXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIAotICAgICAgPCEtLW5ldyBmaWx0ZXIgY29udHJpYnV0aW9uLS0+ICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdmaWx0ZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkRmlsdGVyV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJUZpbHRlcldlYlJlZ2lvbldpemFyZC5uYW1lIj4KLSAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZEZpbHRlcldpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZWFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIyMCIgLz4KLSAgICAgICAgIDwvY2xhc3M+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRmlsdGVyV2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICAKLSAgICAgIDwhLS1uZXcgbGlzdGVuZXIgY29udHJpYnV0aW9uLS0+Ci0gCSAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUxpc3RlbmVyV2ViUmVnaW9uV2l6YXJkLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3bGlzdGVuZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZWFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIzMCIgLz4KLSAgICAgICAgIDwvY2xhc3M+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlTGlzdGVuZXJXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+ICAgICAgICAgCi0gICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVdhckltcG9ydFdpemFyZC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXYXJJbXBvcnRXaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICAKLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiPgotICAgICAgPC9jYXRlZ29yeT4gICAgICAgICAKLSAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlV2FyZXhwb3J0V2l6YXJkLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRFeHBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdhcmV4cG9ydFdpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS5leHRlbmRhYmxlV2l6YXJkIj4KLSAgICAgIDxleHRlbmRhYmxlV2l6YXJkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuV2ViTW9kdWxlQ3JlYXRpb25XaXphcmQiPgotICAgICAgPC9leHRlbmRhYmxlV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLQkJPGFjdGlvblNldAotCQkJbGFiZWw9IiVDb252ZXJ0V2ViUHJvamVjdFR5cGUiCi0JCQlkZXNjcmlwdGlvbj0iJUNvbnZlcnRXZWJQcm9qZWN0VHlwZSIKLQkJCXZpc2libGU9InRydWUiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9ucy5Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uU2V0Ij4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJWNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi5sYWJlbCIKLQkJCQl0b29sdGlwPSIlQ29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9InByb2plY3QvYWRkaXRpb25zIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0iY29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiI+ICAgCi0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCTwhLS08b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZhY2V0IgotCSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IndzdC53ZWIiPgotCSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+IC0tPgotCQkJCQk8L2FuZD4KLQkJCQk8L2VuYWJsZW1lbnQ+ICAgICAgICAgICAgCi0JCQk8L2FjdGlvbj4KLQkJPC9hY3Rpb25TZXQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQgPSAiY29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVzdGF0aWMud2ViLnByb2plY3RfdWlfIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9IkNvbnZlcnRXZWJQcm9qZWN0VHlwZSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJDb252ZXJ0V2ViUHJvamVjdFR5cGUiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgIDxhY3Rpb24KLQkJCQlsYWJlbD0iJWNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi5sYWJlbCIKLQkJCQl0b29sdGlwPSIlQ29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9IkNvbnZlcnRXZWJQcm9qZWN0VHlwZS9Db252ZXJ0V2ViUHJvamVjdFR5cGUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnMuQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJjb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIj4KLQkJPC9hY3Rpb24+Ci0JCTxlbmFibGVtZW50PgotCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0id3N0LndlYiIgLz4KLQkJCQkJPC9hZGFwdD4KLQkJPC9lbmFibGVtZW50PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICA8L2V4dGVuc2lvbj4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmV0b29scy5zZXJ2ZXIuY29yZS5tb2R1bGVPYmplY3RBZGFwdGVycyAtLT4KLTwhLS0gUHVycG9zZTogRGVmaW5lIGFkYXB0ZXJzIGZvciBXZWIgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPiAgCi0gICAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gCi0gICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTIiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZsZXQiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgIAotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjoyLjRdIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gICAgIAotICAgICAgIAotICAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2U0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNF0iIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2U1IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24ucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNF0iIC8+Ci0JCQk8L2FkYXB0PgkJCQkgICAgICAgICAgICAgCi0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PiAKLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmxldCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgICAgCi0gICA8L2V4dGVuc2lvbj4gIAotICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgTGFiZWwgRGVjb3JhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJXNlcnZsZXRBbm5vdGF0aW9uRGVjb3JhdG9yIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWwuQW5ub3RhdGlvbkljb25EZWNvcmF0b3IiCi0gICAgICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSJUT1BfTEVGVCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS51dGlsLkFubm90YXRpb25JY29uRGVjb3JhdG9yX3NlcnZsZXQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJXNlcnZsZXRBbm5vdGF0aW9uRGVjb3JhdG9yLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQiPgotICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJqc3Qud2ViLmluc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBmYWNldD0ianN0LndlYiIgcGF0aD0iaWNvbnMvd2FyLmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJQYWdlCi0gICAgICBuYW1lPSIld2ViQXBwTGlicmFyaWVzQ29udGFpbmVyTmFtZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIj4KLSAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0gICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuV2ViSmF2YUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L3dlYmphdmEtaWNvbi5naWYiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5FbmhhbmNlZEphdmFSZW5kZXJpbmciCi0gICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5XZWJKYXZhTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgbmFtZT0iJWVuaGFuY2VkLmphdmEuZm9yLndlYi5uYW1lIgotICAgICAgICAgICBwcmlvcml0eT0iaGlnaGVyIj4KLSAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICAgIHBvbGljeT0iSW52b2tlT25seUlmU3VwcHJlc3NlZEV4dEFsc29WaXNpYmxlQW5kQWN0aXZlIgotICAgICAgICAgICAgICBzdXBwcmVzc2VkRXh0ZW5zaW9uSWQ9Im9yZy5lY2xpcHNlLmpkdC5qYXZhLnVpLmphdmFDb250ZW50Ii8+CQkJCQkgICAKLSAgICAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIAk8b3I+Ci0JCQkJPGFuZD4KLQkJCQkJPGFkYXB0Ci0JCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkJPC9vcj4gICAgICAgIAotICAgICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFQcm9qZWN0Ii8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LkNsYXNzUGF0aENvbnRhaW5lciIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhTGlicmFyaWVzIi8+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4gCi0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5OZXdBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5FbmhhbmNlZEphdmFSZW5kZXJpbmcuYWN0aW9ucy5OZXdBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4gICAgICAgIAotICAgICAgICA8Y29tbW9uU29ydGVyCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFTb3J0ZXIiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5FbmhhbmNlZEphdmFSZW5kZXJpbmcuc29ydGVyIj4KLSAgICAgICAgICAgPHBhcmVudEV4cHJlc3Npb24+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFQcm9qZWN0Ii8+Ci0gICAgICAgICAgIDwvcGFyZW50RXhwcmVzc2lvbj4KLSAgICAgICAgPC9jb21tb25Tb3J0ZXI+Ci0gCi0JCSAgIDxjb21tb25XaXphcmQKLQkJICAgICAgICB0eXBlPSJuZXciCi0JCSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1BhY2thZ2VDcmVhdGlvbldpemFyZCI+Ci0JCSAgICAgPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCSAgICAgPC9lbmFibGVtZW50PgotCQkgIDwvY29tbW9uV2l6YXJkPgotCQkgIDxjb21tb25XaXphcmQKLQkJICAgICAgICB0eXBlPSJuZXciCi0JCSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiPgotCQkgICAgIDxlbmFibGVtZW50PgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkgICAgIDwvZW5hYmxlbWVudD4KLQkJICA8L2NvbW1vbldpemFyZD4KLQotICAgCSAgICAgIDxjb21tb25XaXphcmQKLQkJICAgICAgICB0eXBlPSJuZXciCi0JCSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0ludGVyZmFjZUNyZWF0aW9uV2l6YXJkIj4KLQkJICAgICA8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJICAgICA8L2VuYWJsZW1lbnQ+Ci0JCSAgPC9jb21tb25XaXphcmQ+IAotCQkgICAgPGNvbW1vbldpemFyZAotCQkgICAgICAgICAgdHlwZT0ibmV3IgotCQkgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1NvdXJjZUZvbGRlckNyZWF0aW9uV2l6YXJkIj4KLQkJCQk8ZW5hYmxlbWVudD4JCQkJICAgICAgICAKLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkJICAgICA8L2VuYWJsZW1lbnQ+Ci0JCQkgPC9jb21tb25XaXphcmQ+ICAgICAgICAJCQkgCi0gICAgIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICA8dmlld2VyQ29udGVudEJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLkVuaGFuY2VkSmF2YVJlbmRlcmluZyIvPgotICAgICAgICA8L2luY2x1ZGVzPgotICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhUHJvamVjdCIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkTm9kZUFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ii8+Ci0gICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCIvPgotICAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcy93ZWJfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcHJvcGVydHlfZmlsZXMvd2ViX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMmJkMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcy93ZWJfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV8wPUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLV8xPU5ldyBEeW5hbWljIFdlYiBQcm9qZWN0Ci1fMj1TZXJ2bGV0IHZlcnNpb246Ci1fMz1EeW5hbWljIFdlYiBQcm9qZWN0Ci1fND1DcmVhdGUgYSBzdGFuZGFsb25lIER5bmFtaWMgV2ViIHByb2plY3Qgb3IgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24uCi1fNT1XZWIgcHJvamVjdDoKLV82PVdBUiBmaWxlOgotXzc9SW1wb3J0IGEgV0FSIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLV84PVdBUiBJbXBvcnQKLV85PVdBUiBFeHBvcnQKLV8xMD1FeHBvcnQgV2ViIHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotXzExPUNvbnRleHQgcm9vdDoKLV8xMj1Db252ZXJ0IFNpbXBsZSBXZWIgdG8gV2ViIE1vZHVsZQotXzEzPUNvbnZlcnQgU2ltcGxlIFdlYiB0byBXZWIgTW9kdWxlLgotXzE0PVdBUiBJbXBvcnQ6IFdlYiBsaWJyYXJpZXMKLV8xNT1TZWxlY3QgdGhlIHdlYiBsaWJyYXJ5IGphcnMgZnJvbSB0aGUgbGlzdCBiZWxvdyB0byBiZSBpbXBvcnRlZCBhcyB3ZWIgbGlicmFyeSBwcm9qZWN0cy4gIFVuc2VsZWN0ZWQgd2ViIGxpYnJhcmllcyB3aWxsIGJlIGltcG9ydGVkIGFzIGphcnMgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLV8xNj1TZWxlY3QgQWxsCi1fMTc9RGVzZWxlY3QgQWxsCi0KLUFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU9Q3JlYXRlIFNlcnZsZXQKLUFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFPUNyZWF0ZSBTZXJ2bGV0Ci1BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDPUVudGVyIHNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9yIHNwZWNpZmljIGluZm9ybWF0aW9uLgotCi1BRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU9Q3JlYXRlIEZpbHRlcgotQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRT1DcmVhdGUgRmlsdGVyCi1BRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0M9RW50ZXIgc2VydmxldCBmaWx0ZXIgZGVwbG95bWVudCBkZXNjcmlwdG9yIHNwZWNpZmljIGluZm9ybWF0aW9uLgotCi1BRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRT1DcmVhdGUgTGlzdGVuZXIKLUFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRT1DcmVhdGUgTGlzdGVuZXIKLUFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDPVNlbGVjdCB0aGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGV2ZW50cyB0byBsaXN0ZW4gdG8uIAotCi1ESVNQQVRDSEVSX1JFUVVFU1Q9UkVRVUVTVAotRElTUEFUQ0hFUl9GT1JXQVJEPUZPUldBUkQKLURJU1BBVENIRVJfSU5DTFVERT1JTkNMVURFCi1ESVNQQVRDSEVSX0VSUk9SPUVSUk9SCi0KLURFRkFVTFRfUEFDS0FHRT0oZGVmYXVsdCBwYWNrYWdlKQotU0VMRUNUX0NMQVNTX1RJVExFPVNlbGVjdCBDbGFzcwotTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHPUlXQUUwMDYwRSBDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MuCi1FTVBUWV9MSVNUX01TRz1FbXB0eSBMaXN0Ci1BRERfTEFCRUw9QWRkCi1VU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUz1Vc2UgYW4gZXhpc3RpbmcgU2VydmxldCBjbGFzcyBvciBKU1AKLVVTRV9FWElTVElOR19GSUxURVJfQ0xBU1M9VXNlIGV4aXN0aW5nIEZpbHRlciBjbGFzcwotVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTPVVzZSBleGlzdGluZyBMaXN0ZW5lciBjbGFzcwotSU5JVF9QQVJBTV9USVRMRT1Jbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzCi1JTklUX1BBUkFNX0xBQkVMPUluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM6Ci1VUkxfTUFQUElOR1NfVElUTEU9VVJMIE1hcHBpbmdzCi1VUkxfTUFQUElOR1NfTEFCRUw9VVJMIE1hcHBpbmdzOgotQ0hPT1NFX1NFUlZMRVRfQ0xBU1M9Q2hvb3NlIGEgc2VydmxldCBjbGFzczoKLQotTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRT1OZXcgU2VydmxldAotTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU9U2VydmxldAotTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQz1DcmVhdGUgYSBuZXcgc2VydmxldC4KLVNFUlZMRVRfUEFDS0FHRV9MQUJFTD1KYXZhIHBhY2thZ2U6Ci1TRVJWTEVUX05BTUVfTEFCRUw9U2VydmxldCBuYW1lOgotCi1ORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU9TmV3IEZpbHRlcgotQ0hPT1NFX0ZJTFRFUl9DTEFTUz1DaG9vc2UgYSBmaWx0ZXIgY2xhc3MKLVNFUlZMRVRfTUFQUElOR1NfTEFCRUw9U2VydmxldCBNYXBwaW5nczoKLUZJTFRFUl9NQVBQSU5HU19MQUJFTD1GaWx0ZXIgTWFwcGluZ3M6Ci0KLUFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUz1TZXJ2bGV0IENvbnRleHQgRXZlbnRzCi1BRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFM9SFRUUCBTZXNzaW9uIEV2ZW50cwotQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTPVNlcnZsZXQgUmVxdWVzdCBFdmVudHMKLUFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFPUxpZmVjeWNsZQotQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVM9Q2hhbmdlcyB0byBhdHRyaWJ1dGVzCi1BRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OPVNlc3Npb24gbWlncmF0aW9uCi1BRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HPU9iamVjdCBiaW5kaW5nCi0KLUFERF9CVVRUT05fTEFCRUw9QWRkLi4uCi1FRElUX0JVVFRPTl9MQUJFTD1FZGl0Li4uCi1SRU1PVkVfQlVUVE9OX0xBQkVMPVJlbW92ZQotVVJMX1BBVFRFUk5fVElUTEU9VVJMIFBhdHRlcm5zCi1VUkxfUEFUVEVSTl9MQUJFTD1QYXR0ZXJuOgotRk9MREVSX0xBQkVMPUZvbGRlcjoKLUpBVkFfUEFDS0FHRV9MQUJFTD1KYXZhIHBhY2thZ2U6Ci1DTEFTU19OQU1FX0xBQkVMPUNsYXNzIG5hbWU6Ci1TVVBFUkNMQVNTX0xBQkVMPVN1cGVyY2xhc3M6Ci1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Db250YWluZXIgU2VsZWN0aW9uCi1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIENvbnRhaW5lcjoKLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHPUNob29zZSB0aGUgV2ViIENvbnRlbnQgRm9sZGVyIG9yIGl0cyBzdWJmb2xkZXIKLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1QYWNrYWdlIFNlbGVjdGlvbgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgcGFja2FnZToKLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORT1ObyBwYWNrYWdlcyB0byBjaG9vc2UgZnJvbQotU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFPVN1cGVyY2xhc3MgU2VsZWN0aW9uCi1TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBzdXBlcmNsYXNzOgotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9SW50ZXJmYWNlIFNlbGVjdGlvbgotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgaW50ZXJmYWNlczoKLUlOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FPScnezB9JycgYWRkZWQuCi1KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTD1Nb2RpZmllcnM6Ci1KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTD1QdWJsaWMKLUpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUw9QWJzdHJhY3QKLUpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUw9RmluYWwKLUpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTD1JbnRlcmZhY2VzOgotSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw9V2hpY2ggbWV0aG9kIHN0dWJzIHdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZT8KLUpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTD1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTD1Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzCi1KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw9SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKLUpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19USVRMRT1KYXZhIENsYXNzIEJyb3dzZXIKLUpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFPUJyb3dzZSBmb3IgYSBKYXZhIGNsYXNzCi0KLU5BTUVfVElUTEU9TmFtZQotTkFNRV9MQUJFTD1OYW1lOgotREVTQ1JJUFRJT05fVElUTEU9RGVzY3JpcHRpb24KLURFU0NSSVBUSU9OX0xBQkVMPURlc2NyaXB0aW9uOgotVkFMVUVfVElUTEU9VmFsdWUKLVZBTFVFX0xBQkVMPVZhbHVlOgotVVJMX1NFUlZMRVRfTEFCRUw9VVJMIFBhdHRlcm4gLyBTZXJ2bGV0IE5hbWUKLURJU1BBVENIRVJTX0xBQkVMPURpc3BhdGNoZXJzCi0KLUJST1dTRV9CVVRUT05fTEFCRUw9QnJvd3NlLi4uCi1SRU1PVkVfQlVUVE9OPVJlbW92ZQotU0VMRUNUX0FMTF9CVVRUT049U2VsZWN0ICZBbGwKLUNMRUFSX0JVVFRPTj0mQ2xlYXIKLQotTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQz1TcGVjaWZ5IGNsYXNzIGZpbGUgZGVzdGluYXRpb24uCi1ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M9U3BlY2lmeSBtb2RpZmllcnMsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LCBhbmQgbWV0aG9kIHN0dWJzIHRvIGdlbmVyYXRlLgotCi1JbXBvcnRXQVJBY3Rpb25fVUlfPUltcG9ydCBXZWIgTW9kdWxlLi4uCi1FeHBvcnRXQVJBY3Rpb25fVUlfPUV4cG9ydCBXQVIgZmlsZS4uLgotCi1OT19XRUJfUFJPSkVDVFM9Tm8gV2ViIFByb2plY3RzCi0KLVNFUlZMRVRTID1TZXJ2bGV0cwotCi1XRUJfQ09OVF9OQU1FID0gV2ViQXBwQ29udGFpbmVyUGFnZQotV0VCX0NPTlRfUEFHRV9USVRMRSA9IFdlYiBBcHAgTGlicmFyaWVzIENvbnRhaW5lcgotV0VCX0NPTlRfUEFHRV9ERVNDUklQVElPTiA9IFRoaXMgY29udGFpbmVyIGR5bmFtaWNhbGx5IHBvcHVsYXRlcyBjbGFzc3BhdGggZW50cmllcyBmcm9tIHRoZSBXRUItSU5GL2xpYiBhbmQgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yaWVzIG9mIGEgd2ViIGFwcC4KLVdFQl9DT05UX1BBR0VfQ09NUF9MQUJFTCA9IENvbXBvbmVudDoKLVdFQkNPTlRFTlQ9V2ViIENvbnRlbnQgZm9sZGVyOgotCi0KLUNvbXByZXNzZWRfTGlicmFyaWVzPSBMaWJyYXJpZXMKLUNvbXByZXNzZWRfSmF2YVJlc291cmNlcz0gSmF2YSBSZXNvdXJjZXN7MH0KLQotQ29udmVydFRvV2ViVGl0bGU9Q29udmVydCB0byBEeW5hbWljIFdlYiBQcm9qZWN0Ci1TZWxlY3RXZWJWZXJzaW9uPVNlbGVjdCBhIER5bmFtaWMgV2ViIG1vZHVsZSB2ZXJzaW9uOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL0lXZWJVSUNvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9JV2ViVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjE1ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL0lXZWJVSUNvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpOwotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJVSUNvbnRleHRJZHMgewotCi1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fU0VSVkxFVF9VSSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RZTkFNSUNfV0VCX1BST0pFQ1RfUEFHRTEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJ3MTAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRFlOQU1JQ19XRUJfUFJPSkVDVF9QQUdFMiA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYncxMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19EWU5BTUlDX1dFQl9QUk9KRUNUX1BBR0UzID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2VidzEyMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0lNUE9SVF9QQUdFMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYmkxMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9JTVBPUlRfUEFHRTIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJpMTEwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfRVhQT1JUX1BBR0UxID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2ViZTEwMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgInNydncxMDUwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJzcnZ3MTEwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8zID0gUExVR0lOX1NFUlZMRVRfVUkgKyAic3J2dzEyMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8xID0gUExVR0lOX1NFUlZMRVRfVUkgKyAibHN0dzEwNTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMiA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImxzdHcxMTAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzMgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJsc3R3MTIwMCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImZsdHcxMDUwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMiA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImZsdHcxMTAwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMyA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImZsdHcxMjAwIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmMWY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5Db252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgc2ltcGxlIHN0YXRpYyB3ZWIgcHJvamVjdCB0byBhIEoyRUUgRHluYW1pYyBXZWIgUHJvamVjdAotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uID0gbnVsbDsKLQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQlJV29ya2JlbmNoV2luZG93IGZXaW5kb3c7Ci0KLQkvKioKLQkgKiBDb252ZXJ0TGlua3NEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIHN1cmUgYSB3ZWIgcHJvamVjdCBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoYVByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiBiRW5hYmxlID0gZmFsc2U7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJYkVuYWJsZSA9IHZhbGlkYXRlU2VsZWN0ZWQoZlNlbGVjdGlvbik7Ci0JCX0KLQkJKChBY3Rpb24pIGFjdGlvbikuc2V0RW5hYmxlZChiRW5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZWxlY3Rpb25DaGFuZ2VkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VsZWN0ZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQlPYmplY3Qgc2VsZWN0ZWRQcm9qZWN0ID0gZlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKCEoc2VsZWN0ZWRQcm9qZWN0IGluc3RhbmNlb2YgSVByb2plY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXByb2plY3QgPSAoSVByb2plY3QpIHNlbGVjdGVkUHJvamVjdDsKLQkJcmV0dXJuIGlzVmFsaWRQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIERlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIERlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKClbMF07Ci0JCQlDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCXJldHVybjsKLQkJCQotCQkJZG9Db252ZXJ0KENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cuZ2V0U2VsZWN0ZWRWZXJzaW9uKCkpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvQ29udmVydChTdHJpbmcgc2VsZWN0ZWRWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3MpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCwgcHJvamVjdCk7Ci0JCW1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5DT05WRVJUX1RPX1dFQl9WRVJTSU9OLCBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nLmdldFNlbGVjdGVkVmVyc2lvbigpKTsKLQkJbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2ViQ29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXZWJDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxZWY0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXZWJDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLXB1YmxpYyBjbGFzcyBOZXdXZWJDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gV0VCVUlNZXNzYWdlcy5XRUJfTU9EVUxFX1dJWl9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJ3YXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBOZXdXZWJDb21wb25lbnRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOyAKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0JCi0JcHVibGljIE5ld1dlYkNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjdGl2YXRlZE9uVHlwZXMsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWN0aXZhdGVkT25UeXBlcywgYWNjZXB0RW1wdHlTZWxlY3Rpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQkKLQlwdWJsaWMgTmV3V2ViQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0RW1wdHlTZWxlY3Rpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IFdlYlByb2plY3RXaXphcmQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7IAotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjRjMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lMYXVuY2hhYmxlLmNsYXNzfTsKLQl9Ci0KLQotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2MzgwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhTGlicmFyaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyBpbXBsZW1lbnRzIElDb21wcmVzc2VkTm9kZSB7Ci0JCi0JCi0JcHJpdmF0ZSBDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZFByb2plY3Q7Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCXB1YmxpYyBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyhDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZFByb2plY3QpIHsgCi0JCXRoaXMuY29tcHJlc3NlZFByb2plY3QgPSBjb21wcmVzc2VkUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgeyAKLQkJaWYoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19MSUJSQVJZKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CQkKLQkJcmV0dXJuIFdFQlVJTWVzc2FnZXMuQ29tcHJlc3NlZF9MaWJyYXJpZXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihJVHJlZUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcikgewotCQkKLQkJTGlzdCBjbGFzc3BhdGhDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBkZWxlZ2F0ZUNoaWxkcmVuID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oY29tcHJlc3NlZFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGVsZWdhdGVDaGlsZHJlbltpXSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJhd0NsYXNzcGF0aEVudHJ5ID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZGVsZWdhdGVDaGlsZHJlbltpXSkuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLQkJCQkJaWYgKHJhd0NsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmIAotCQkJCQkJCQlyYXdDbGFzc3BhdGhFbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCQkJCWNsYXNzcGF0aENvbnRhaW5lcnMuYWRkKGRlbGVnYXRlQ2hpbGRyZW5baV0pOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCEoZGVsZWdhdGVDaGlsZHJlbltpXSBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgJiYgIShkZWxlZ2F0ZUNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSkgewotCQkJCWNsYXNzcGF0aENvbnRhaW5lcnMuYWRkKGRlbGVnYXRlQ2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGhDb250YWluZXJzLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcHJlc3NlZEphdmFQcm9qZWN0IGdldENvbXByZXNzZWRQcm9qZWN0KCkgewotCQlyZXR1cm4gY29tcHJlc3NlZFByb2plY3Q7Ci0JfQotCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVByb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjAyNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3NlZEphdmFQcm9qZWN0IGltcGxlbWVudHMgSUNvbXByZXNzZWROb2RlLCBJQWRhcHRhYmxlIHsgCi0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMgY29tcHJlc3NlZExpYnJhcmllczsKLQlwcml2YXRlIEltYWdlIGltYWdlOyAKLSAKLQlwdWJsaWMgQ29tcHJlc3NlZEphdmFQcm9qZWN0KFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7IAotCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZihpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLRlJBR19ST09UKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBkZXRlcm1pbmVMYWJlbCgpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGbGF0dGVuaW5nU291cmNlRm9sZGVyKCkgewotCQlyZXR1cm4gZ2V0Tm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzKCkuc2l6ZSgpID09IDE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lTGFiZWwoKSB7Ci0JCUxpc3Qgbm9uZXh0U291cmNlRm9sZGVycyA9IGdldE5vbkV4dGVybmFsU291cmNlRm9sZGVycygpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzaW5nbGVSb290ID0gbnVsbDsKLQkJaWYgKG5vbmV4dFNvdXJjZUZvbGRlcnMuc2l6ZSgpID09IDEpIHsKLQkJCXNpbmdsZVJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIG5vbmV4dFNvdXJjZUZvbGRlcnMuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBOTFMuYmluZChXRUJVSU1lc3NhZ2VzLkNvbXByZXNzZWRfSmF2YVJlc291cmNlcywgKChzaW5nbGVSb290ICE9IG51bGwpID8gIjogIiArIHNpbmdsZVJvb3QuZ2V0RWxlbWVudE5hbWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oSVRyZWVDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCi0JCUxpc3Qgbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzID0gZ2V0Tm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzKCk7Ci0JCWlmIChub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdFtdIHNvdXJjZUZvbGRlckNoaWxkcmVuID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4obm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLmdldCgwKSk7Ci0JCQlub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuY2xlYXIoKTsKLQkJCW5vbkV4dGVybmFsU291cmNlRm9sZGVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzb3VyY2VGb2xkZXJDaGlsZHJlbikpOwotCQl9IAotCQlub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuYWRkKGdldENvbXByZXNzZWRKYXZhTGlicmFyaWVzKCkpOwotCQlyZXR1cm4gbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb25FeHRlcm5hbFNvdXJjZUZvbGRlcnMoKSB7Ci0JCUxpc3Qgbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzID0gbnVsbDsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VGb2xkZXJzOwotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJc291cmNlRm9sZGVycyA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQlub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qoc291cmNlRm9sZGVycykpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChyb290LmlzRXh0ZXJuYWwoKSB8fCByb290LmlzQXJjaGl2ZSgpIHx8IHJvb3QuZ2V0S2luZCgpPT1JUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG5vbkV4dGVybmFsU291cmNlRm9sZGVycyAhPSBudWxsID8gbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JcHVibGljIENvbXByZXNzZWRKYXZhTGlicmFyaWVzIGdldENvbXByZXNzZWRKYXZhTGlicmFyaWVzKCkgewkJCi0JCWlmKGNvbXByZXNzZWRMaWJyYXJpZXMgPT0gbnVsbCkgCi0JCQljb21wcmVzc2VkTGlicmFyaWVzID0gbmV3IENvbXByZXNzZWRKYXZhTGlicmFyaWVzKHRoaXMpOwotCQlyZXR1cm4gY29tcHJlc3NlZExpYnJhcmllczsKLQkJCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsgCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJTGlzdCBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgPSBnZXROb25FeHRlcm5hbFNvdXJjZUZvbGRlcnMoKTsKLQkJaWYgKG5vbkV4dGVybmFsU291cmNlRm9sZGVycy5zaXplKCkgPT0gMSkgewotCQkJcmV0dXJuIChJSmF2YUVsZW1lbnQpIG5vbkV4dGVybmFsU291cmNlRm9sZGVycy5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4MTQ4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2VkSmF2YVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCi0JcHJpdmF0ZSBKYXZhRWxlbWVudFNvcnRlciBzb3J0ZXIgPSBuZXcgSmF2YUVsZW1lbnRTb3J0ZXIoKTsKLQkKLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7IAotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSByZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWlmKGUxIGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZihlMiBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKQotCQkJcmV0dXJuIC0xOwotCQkKLQkJcmV0dXJuIHNvcnRlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3M2IwODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci0KLS8vIAotcHVibGljIGNsYXNzIENvbXByZXNzZWROb2RlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElKQVZBX1BST0pFQ1RfQ0xBU1MgPSBJSmF2YVByb2plY3QuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUpBVkFfRUxFTUVOVF9DTEFTUyA9IElKYXZhRWxlbWVudC5jbGFzczsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSUpBVkFfUFJPSkVDVF9DTEFTUyB9OwotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhUHJvamVjdCkgewotCQkJaWYoYWRhcHRlclR5cGUgPT0gSUpBVkFfUFJPSkVDVF9DTEFTUykgewotCQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhUHJvamVjdClhZGFwdGFibGVPYmplY3QpLmdldFByb2plY3QoKTsKLQkJCX0gZWxzZSBpZiAoYWRhcHRlclR5cGUgPT0gSUpBVkFfRUxFTUVOVF9DTEFTUykgewotCQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhUHJvamVjdClhZGFwdGFibGVPYmplY3QpLmdldEphdmFFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7IAotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9JQ29tcHJlc3NlZE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSUNvbXByZXNzZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWJiNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9JQ29tcHJlc3NlZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogCi0gKiBQcm92aWRlcyBhIHNpbXBsZSBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIHJlbmRlcmluZyBvZiBKYXZhIGVsZW1lbnRzIHRvIGEgZm9ybWF0Ci0gKiB0aGF0IGlzIGZyaWVuZGxpZXIgZm9yIFdlYiBQcm9qZWN0cy4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wcmVzc2VkTm9kZSAgIHsKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSB0byBkaXNwbGF5IGZvciB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IGxhYmVsIHRvIGRpc3BsYXkgZm9yIHRoaXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgc2hvdWxkIHVzZWQgZm9yIGFueSBjaGlsZHJlbiB0aGF0IEkgY2Fubm90IHByb3ZpZGUKLQkgKiAgICAgICAgICAgIGNoaWxkcmVuIGZvci4KLQkgKiBAcmV0dXJuIFRoZSBjaGlsZHJlbiBlaXRoZXIgZnJvbSBtZSBvciB0aGUgZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKElUcmVlQ29udGVudFByb3ZpZGVyIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEphdmEgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLCBpZiBhbnkuCi0JICovCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5Y2I3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JUGlwZWxpbmVkVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUGlwZWxpbmVkU2hhcGVNb2RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlBpcGVsaW5lZFZpZXdlclVwZGF0ZTsKLQotcHVibGljIGNsYXNzIFdlYkphdmFDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJUGlwZWxpbmVkVHJlZUNvbnRlbnRQcm92aWRlciAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTk9fQ0hJTERSRU4gPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VYVEVOU0lPTl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuamF2YS51aS5qYXZhQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogSkRUIGxpa2VzIHRvIG1ha2UgaXQgaW50ZXJlc3Rpbmcgc28ganVzdCBvbmUgb2YgdGhlaXIgdmlld2VyIHR5cGVzIGlzIG1hZGUgaW50ZXJuYWwgVG8gYXZvaWQKLQkgKiB0aGUgZGVwZW5kZW5jeSwgd2UgdXNlIHNvbWUgcmVmbGVjdGlvbiBoZXJlIHRvIGZpbHRlciB0aGUgdHlwZS4KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIENsYXNzIElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUzsKLQlzdGF0aWMgewotCQl0cnkgewotCQkJSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LkNsYXNzUGF0aENvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBpZ25vcmUgaWYgdGhlIGNsYXNzIGhhcyBiZWVuIHJlbW92ZWQgb3IgcmVuYW1lZC4KLQkJCUlOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcjsKLQlwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgZmluYWwgTWFwIGNvbXByZXNzZWROb2RlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgdm9pZCBnZXRQaXBlbGluZWRDaGlsZHJlbihPYmplY3QgYVBhcmVudCwgU2V0IHRoZUN1cnJlbnRDaGlsZHJlbikgewotCQl0cnkgewotCQkJaWYgKGFQYXJlbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAoKElQcm9qZWN0KWFQYXJlbnQpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoKElQcm9qZWN0KWFQYXJlbnQpKSB7Ci0JCQkJY2xlYW5KYXZhQ29udHJpYnV0aW9uKHRoZUN1cnJlbnRDaGlsZHJlbik7Ci0JCQkJdGhlQ3VycmVudENoaWxkcmVuLmFkZChnZXRDb21wcmVzc2VkTm9kZSgoSVByb2plY3QpYVBhcmVudCkpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCX0gCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuSmF2YUNvbnRyaWJ1dGlvbihTZXQgdGhlQ3VycmVudENoaWxkcmVuKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhlQ3VycmVudENoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJUmVzb3VyY2UgJiYgKChlbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKChJUmVzb3VyY2UpIGNoaWxkKSkgIT0gbnVsbCkgJiYgZWxlbWVudC5leGlzdHMoKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCWVsc2UgaWYgKElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUyAhPSBudWxsICYmIElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUy5pc0luc3RhbmNlKGNoaWxkKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wcmVzc2VkSmF2YVByb2plY3QgZ2V0Q29tcHJlc3NlZE5vZGUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29tcHJlc3NlZEphdmFQcm9qZWN0IHJlc3VsdCA9IChDb21wcmVzc2VkSmF2YVByb2plY3QpIGNvbXByZXNzZWROb2Rlcy5nZXQocHJvamVjdCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJY29tcHJlc3NlZE5vZGVzLnB1dChwcm9qZWN0LCByZXN1bHQgPSBuZXcgQ29tcHJlc3NlZEphdmFQcm9qZWN0KGNvbW1vblZpZXdlciwgcHJvamVjdCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0UGlwZWxpbmVkRWxlbWVudHMoT2JqZWN0IGFuSW5wdXQsIFNldCB0aGVDdXJyZW50RWxlbWVudHMpIHsgCi0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBpcGVsaW5lZFBhcmVudChPYmplY3QgYW5PYmplY3QsIE9iamVjdCBhU3VnZ2VzdGVkUGFyZW50KSB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgYW5PYmplY3Q7Ci0JCQkJaWYgKCFyb290LmlzRXh0ZXJuYWwoKSkgewotCQkJCQlpZiggYVN1Z2dlc3RlZFBhcmVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCApIHsKLQkJCQkJCXJldHVybiBnZXRDb21wcmVzc2VkTm9kZSggKChJSmF2YVByb2plY3QpIGFTdWdnZXN0ZWRQYXJlbnQpLmdldFByb2plY3QoKSApOwotCQkJCQl9IGVsc2UgaWYgKCBhU3VnZ2VzdGVkUGFyZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgKChJUHJvamVjdClhU3VnZ2VzdGVkUGFyZW50KS5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KChJUHJvamVjdClhU3VnZ2VzdGVkUGFyZW50KSApewotCQkJCQkJcmV0dXJuIGdldENvbXByZXNzZWROb2RlKCAoKElQcm9qZWN0KSBhU3VnZ2VzdGVkUGFyZW50KSApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmKElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUy5pc0luc3RhbmNlKGFuT2JqZWN0KSkgewotCQkJCWlmKCBhU3VnZ2VzdGVkUGFyZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0ICkgewotCQkJCQlyZXR1cm4gZ2V0Q29tcHJlc3NlZE5vZGUoICgoSUphdmFQcm9qZWN0KSBhU3VnZ2VzdGVkUGFyZW50KS5nZXRQcm9qZWN0KCkgKS5nZXRDb21wcmVzc2VkSmF2YUxpYnJhcmllcygpOwotCQkJCX0gZWxzZSBpZiAoIGFTdWdnZXN0ZWRQYXJlbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAoKElQcm9qZWN0KWFTdWdnZXN0ZWRQYXJlbnQpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoKElQcm9qZWN0KWFTdWdnZXN0ZWRQYXJlbnQpKXsKLQkJCQkJcmV0dXJuIGdldENvbXByZXNzZWROb2RlKCAoKElQcm9qZWN0KSBhU3VnZ2VzdGVkUGFyZW50KSApLmdldENvbXByZXNzZWRKYXZhTGlicmFyaWVzKCk7Ci0JCQkJfSAKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUGlwZWxpbmVkU2hhcGVNb2RpZmljYXRpb24gaW50ZXJjZXB0QWRkKFBpcGVsaW5lZFNoYXBlTW9kaWZpY2F0aW9uIGFuQWRkTW9kaWZpY2F0aW9uKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhbkFkZE1vZGlmaWNhdGlvbi5nZXRQYXJlbnQoKTsKLQkJCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBwYXJlbnQ7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWROb2RlID0gZ2V0Q29tcHJlc3NlZE5vZGUoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQlpZihjb21wcmVzc2VkTm9kZS5pc0ZsYXR0ZW5pbmdTb3VyY2VGb2xkZXIoKSkgewotCQkJCQlhbkFkZE1vZGlmaWNhdGlvbi5zZXRQYXJlbnQoY29tcHJlc3NlZE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfSAKLQkJCi0JCXJldHVybiBhbkFkZE1vZGlmaWNhdGlvbjsKLQl9Ci0JCi0KLQlwdWJsaWMgUGlwZWxpbmVkU2hhcGVNb2RpZmljYXRpb24gaW50ZXJjZXB0UmVtb3ZlKFBpcGVsaW5lZFNoYXBlTW9kaWZpY2F0aW9uIGFSZW1vdmVNb2RpZmljYXRpb24pIHsKLQotCQlPYmplY3QgcGFyZW50ID0gYVJlbW92ZU1vZGlmaWNhdGlvbi5nZXRQYXJlbnQoKTsKLQkJCi0JCVNldCBjaGlsZHJlbiA9IGFSZW1vdmVNb2RpZmljYXRpb24uZ2V0Q2hpbGRyZW4oKTsKLQkJCi0JCWZvciAoT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGb2xkZXIpewotCQkJCXRyeSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnQgbG9jYXRlUGFja2FnZUZyYWdtZW50ID0gbG9jYXRlUGFja2FnZUZyYWdtZW50KChJRm9sZGVyKWNoaWxkKTsKLQkJCQkJaWYobG9jYXRlUGFja2FnZUZyYWdtZW50ICE9IG51bGwpewotCQkJCQkJYVJlbW92ZU1vZGlmaWNhdGlvbi5nZXRDaGlsZHJlbigpLnJlbW92ZShjaGlsZCk7Ci0JCQkJCQlhUmVtb3ZlTW9kaWZpY2F0aW9uLmdldENoaWxkcmVuKCkuYWRkKGxvY2F0ZVBhY2thZ2VGcmFnbWVudCk7Ci0JCQkJCQkKLQkJCQkJCXJldHVybiBhUmVtb3ZlTW9kaWZpY2F0aW9uOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBwYXJlbnQ7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWROb2RlID0gZ2V0Q29tcHJlc3NlZE5vZGUoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQlpZihjb21wcmVzc2VkTm9kZS5pc0ZsYXR0ZW5pbmdTb3VyY2VGb2xkZXIoKSkgewotCQkJCQlhUmVtb3ZlTW9kaWZpY2F0aW9uLnNldFBhcmVudChjb21wcmVzc2VkTm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0gCi0JCQotCQlyZXR1cm4gYVJlbW92ZU1vZGlmaWNhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgbG9jYXRlUGFja2FnZUZyYWdtZW50KElGb2xkZXIgY2hpbGQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY2hpbGQuZ2V0UHJvamVjdCgpKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCi0JCUlKYXZhRWxlbWVudCBlbGVtID0gSmF2YUNvcmUuY3JlYXRlKGNoaWxkKTsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KWVsZW07Ci0JCQlmb3IgKElKYXZhRWxlbWVudCBqYXZhRWxlbSA9IHBhY2thZ2VGcmFnbWVudCA7IGphdmFFbGVtICE9IG51bGwgOyBqYXZhRWxlbSA9IGphdmFFbGVtLmdldFBhcmVudCgpKSB7Ci0JCQkJaWYgKGphdmFFbGVtIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgZnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KWphdmFFbGVtOwotCQkJCQlpZiAoIWZyYWdtZW50Um9vdC5pc1JlYWRPbmx5KCkgJiYgIWZyYWdtZW50Um9vdC5pc0V4dGVybmFsKCkpIHsKLQkJCQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW50ZXJjZXB0UmVmcmVzaChQaXBlbGluZWRWaWV3ZXJVcGRhdGUgYVJlZnJlc2hTeW5jaHJvbml6YXRpb24pIHsKLQkJCi0JCVNldCByZWZyZXNoVGFyZ2V0cyA9IGFSZWZyZXNoU3luY2hyb25pemF0aW9uLmdldFJlZnJlc2hUYXJnZXRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hUYXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJlZnJlc2hUYXJnZXQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWZyZXNoVGFyZ2V0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXIgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHJlZnJlc2hUYXJnZXQ7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZE5vZGUgPSBnZXRDb21wcmVzc2VkTm9kZShzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCQlpZihjb21wcmVzc2VkTm9kZS5pc0ZsYXR0ZW5pbmdTb3VyY2VGb2xkZXIoKSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsgLy8gdm9pZHMgdGhlIGl0ZXIgYnV0IGlzIG9rYXkgYmVjYXVzZSB3ZSdyZSBkb25lIHdpdGggaXQKLQkJCQkJCXJlZnJlc2hUYXJnZXRzLmFkZChjb21wcmVzc2VkTm9kZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaW50ZXJjZXB0VXBkYXRlKFBpcGVsaW5lZFZpZXdlclVwZGF0ZSBhblVwZGF0ZVN5bmNocm9uaXphdGlvbikgewotCQlTZXQgcmVmcmVzaFRhcmdldHMgPSBhblVwZGF0ZVN5bmNocm9uaXphdGlvbi5nZXRSZWZyZXNoVGFyZ2V0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZyZXNoVGFyZ2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCByZWZyZXNoVGFyZ2V0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmcmVzaFRhcmdldCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSByZWZyZXNoVGFyZ2V0OwotCQkJCWlmIChzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKSE9bnVsbCAmJiBzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5leGlzdHMoKSAmJiBzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5pc09wZW4oKSAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQkJQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWROb2RlID0gZ2V0Q29tcHJlc3NlZE5vZGUoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQkJaWYoY29tcHJlc3NlZE5vZGUuaXNGbGF0dGVuaW5nU291cmNlRm9sZGVyKCkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7IC8vIHZvaWRzIHRoZSBpdGVyYXRvcjsgYnV0IGlzIG9rYXkgYmVjYXVzZSB3ZSdyZSBkb25lIHdpdGggaXQKLQkJCQkJCXJlZnJlc2hUYXJnZXRzLmFkZChjb21wcmVzc2VkTm9kZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZSBhU2l0ZSkgeyAKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFQcm9qZWN0KXBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKGRlbGVnYXRlQ29udGVudFByb3ZpZGVyKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKSB7IAotCQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhTGlicmFyaWVzKXBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKGRlbGVnYXRlQ29udGVudFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YVByb2plY3QpCi0JCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcykgCi0JCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YUxpYnJhcmllcykgZWxlbWVudCkuZ2V0Q29tcHJlc3NlZFByb2plY3QoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIE5PX0NISUxEUkVOOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IAotCQljb21wcmVzc2VkTm9kZXMuY2xlYXIoKTsgCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDb21tb25WaWV3ZXIpIHsKLQkJCWNvbW1vblZpZXdlciA9IChDb21tb25WaWV3ZXIpIHZpZXdlcjsKLQkJCUlOYXZpZ2F0b3JDb250ZW50U2VydmljZSBzZXJ2aWNlID0gY29tbW9uVmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCk7Ci0JCQlJTmF2aWdhdG9yQ29udGVudEV4dGVuc2lvbiBqYXZhZXh0ID0gc2VydmljZS5nZXRDb250ZW50RXh0ZW5zaW9uQnlJZChKQVZBX0VYVEVOU0lPTl9JRCk7Ci0JCQlpZiAoamF2YWV4dCAhPSBudWxsKQotCQkJCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyID0gamF2YWV4dC5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWNvbXByZXNzZWROb2Rlcy5jbGVhcigpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NwYXRoQ29udGFpbmVyKE9iamVjdCBvKSB7CQkKLQkJcmV0dXJuIElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUyAhPSBudWxsICYmIElOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUy5pc0luc3RhbmNlKG8pOwotCX0gCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3ZWQ1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgV2ViSmF2YUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yID0gbmV3IFByb2JsZW1zTGFiZWxEZWNvcmF0b3IoKTsKLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcHJlc3NlZE5vZGUpCi0JCQlpbWFnZSA9ICgoSUNvbXByZXNzZWROb2RlKWVsZW1lbnQpLmdldEltYWdlKCk7IAotCQkKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gbnVsbDsKLQkJaWYoaW1hZ2UgIT0gbnVsbCAmJiAoIGphdmFFbGVtZW50ID0gKChJQ29tcHJlc3NlZE5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSkgIT0gbnVsbCApIHsJCQkKLQkJCWltYWdlID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGphdmFFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wcmVzc2VkTm9kZSkKLQkJCXRleHQgPSAoKElDb21wcmVzc2VkTm9kZSllbGVtZW50KS5nZXRMYWJlbCgpOyAKLQotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBudWxsOwotCQlpZih0ZXh0ICE9IG51bGwgJiYgKCBqYXZhRWxlbWVudCA9ICgoSUNvbXByZXNzZWROb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkpICE9IG51bGwgKSB7Ci0JCQl0ZXh0ID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBqYXZhRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeyAKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IAotCQlkZWNvcmF0b3IuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeyAKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9TZXJ2bGV0VUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vU2VydmxldFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDVhYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9TZXJ2bGV0VUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpIjsgLy8kTk9OLU5MUy0xJAotCS8vCVRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmxldFVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZsZXRVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmxldFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSArICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coIHN0YXR1cyApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vV0VCVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9XRUJVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmVlY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9XRUJVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotcHVibGljIGNsYXNzIFdFQlVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndlYl91aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXRUJVSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xERVJfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMX01BUFBJTkdTX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTF9NQVBQSU5HU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX01BUFBJTkdTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxfU0VSVkxFVF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05UX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9QQUNLQUdFX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVNUFRZX0xJU1RfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFdBUkFjdGlvbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fV0VCX1BST0pFQ1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTF9QQVRURVJOX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1M7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUxFQ1RfQ0xBU1NfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0V0FSQWN0aW9uX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFDS0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBfQ0xBU1NfTkFNRV9UT19DTEFTU19FUlJPUl9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlJPV1NFX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSVRfUEFSQU1fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5JVF9QQVJBTV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX05BTUVfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTkFNRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfUEFDS0FHRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRURJVF9CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMVUVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMVUVfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRfUEFHRV9DT01QX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9TRVJWTEVUX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9GSUxURVJfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRfUEFHRV9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUxFQ1RfQUxMX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDTEVBUl9CVVRUT047Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NlZF9MaWJyYXJpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NlZF9KYXZhUmVzb3VyY2VzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRUb1dlYlRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFdlYlZlcnNpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSX1JFUVVFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUl9GT1JXQVJEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJfSU5DTFVERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSX0VSUk9SOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV0VCVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTE9BRF9FUlJPUiA9IF8wOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfV0laX1RJVExFID0gXzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1ZFUlNJT05fTEJMID0gXzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9IF8zOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX01BSU5fUEdfREVTQyA9IF80OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX0xCTCA9IF81OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GSUxFX0xCTCA9IF82OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfTUFJTl9QR19ERVNDID0gXzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gXzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0VYUE9SVF9NQUlOX1BHX1RJVExFID0gXzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0VYUE9SVF9NQUlOX1BHX0RFU0MgPSBfMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9DT05URVhUX1JPT1QgPSBfMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlZFUlRfTUFJTl9QR19ERVNDID0gXzEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05WRVJUX01BSU5fUEdfVElUTEUgPSBfMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9XRUJfTElCX1BHX1RJVExFID0gXzE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfV0VCX0xJQl9QR19ERVNDID0gXzE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9JTVBPUlRfU0VMRUNUX0FMTF9MSUJTX0JVVFRPTiA9IF8xNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9MSUJTX0JVVFRPTiA9IF8xNzsKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ZWJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5FUlJPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRk9SV0FSRDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSU5DTFVERTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX1BBVFRFUk5fTEFCRUw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5Ud29BcnJheVF1aWNrU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklGaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5sYXlvdXQuQ2VsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNy8zMC8yMDAxIDExOjE2OjM2IEFNKQotICovCi1wdWJsaWMgY2xhc3MgQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25TdGF0dXNEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7CQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVSZW5kZXJlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEltYWdlIFNFUlZMRVRfSUNPTiA9IAotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldCIpKS5jcmVhdGVJbWFnZSgpOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBlbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIFNFUlZMRVRfSUNPTjsKLSAgICAgICAgfQotCi0JfQotCQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFUlZMRVQgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVSTF9QQVRURVJOID0gMTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTZXJ2bGV0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlVSTFBhdHRlcm5CdXR0b247Ci0JcHJvdGVjdGVkIGludCBmU2VsZWN0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIGZQYWdlQm9vayA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZlVSTFBhdHRlcm5Db250cm9sID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29udHJvbCBmU2VydmxldENvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZkNoaWxkID0gbnVsbDsKLQkvLyBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVycwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGZSdW5uYWJsZUNvbnRleHQ7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGZFbGVtZW50UmVuZGVyZXI7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVDYXNlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBmVXBwZXJMaXN0TGFiZWw7Ci0KLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgVGFibGUgZlVwcGVyTGlzdDsKLQlwcm90ZWN0ZWQgVGV4dCBmVVJMVGV4dDsKLQlwcml2YXRlIFN0cmluZ1tdIGZTZXJ2bGV0TmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUmVuZGVyZWRTdHJpbmdzOwotCXByaXZhdGUgaW50IGRpc3BhdGNoZXJzOwotCXByaXZhdGUgQnV0dG9uIGZSZXF1ZXN0OwotCXByaXZhdGUgQnV0dG9uIGZGb3J3YXJkOwotCXByaXZhdGUgQnV0dG9uIGZJbmNsdWRlOwotCXByaXZhdGUgQnV0dG9uIGZFcm9ycjsKLQlwcml2YXRlIElGaWx0ZXJNYXBwaW5nSXRlbSBzZWxlY3RlZEl0ZW07Ci0KLQkvKioKLQkgKiBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnQgU2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgU3RyaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmVudCBleHRlbnNpb25zIFN0cmluZ1tdCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgSVByb2plY3QgcHJvamVjdCwgCi0JICAgICAgICBMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gZWxlbWVudHMsIElGaWx0ZXJNYXBwaW5nSXRlbSBpdGVtKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNlbGVjdGVkSXRlbSA9IGl0ZW07Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJaWYgKHRpdGxlID09IG51bGwpCi0JCQlzZXRUaXRsZShXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9TZWxlY3Rpb25fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWVsc2Ugc2V0VGl0bGUodGl0bGUpOwotCQkKLQkJU3RhdHVzIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5PSywgU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCwgU3RhdHVzLk9LLCAiIiwgbnVsbCk7Ci0JCQotCQl1cGRhdGVTdGF0dXMoY3VyclN0YXR1cyk7Ci0JCWZFbGVtZW50UmVuZGVyZXIgPSBuZXcgVHlwZVJlbmRlcmVyKCk7Ci0JCWZSdW5uYWJsZUNvbnRleHQgPSBTZXJ2bGV0VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl0cnkgewotICAgICAgICAgICAgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotICAgICAgICAgICAgT2JqZWN0IG1PYmogPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc2VydmxldHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBpZiAobU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgewotICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSBtT2JqOwotICAgICAgICAgICAgICAgIExpc3Q8U2VydmxldD4gc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNlcnZsZXQgc2VydmxldCA6IHNlcnZsZXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9IHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2bGV0TmFtZS5lcXVhbHMoaXRlbSAhPSBudWxsID8gaXRlbS5nZXROYW1lKCkgOiBudWxsKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FscmVhZHlBZGRlZChzZXJ2bGV0TmFtZSwgZWxlbWVudHMpKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmxldHNMaXN0LmFkZChzZXJ2bGV0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcD0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLSAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ+IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VydmxldE5hbWUuZXF1YWxzKGl0ZW0gIT0gbnVsbCA/IGl0ZW0uZ2V0TmFtZSgpIDogbnVsbCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbHJlYWR5QWRkZWQoc2VydmxldE5hbWUsIGVsZW1lbnRzKSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZsZXRzTGlzdC5hZGQoc2VydmxldE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGZTZXJ2bGV0TmFtZXMgPSAoU3RyaW5nW10pIHNlcnZsZXRzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbc2VydmxldHNMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgc2VydmxldHNMaXN0ID0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIH0KLQl9Ci0JCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxyZWFkeUFkZGVkKFN0cmluZyBzZXJ2bGV0LCBMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gZWxlbWVudHMpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElGaWx0ZXJNYXBwaW5nSXRlbSBpdGVtID0gKElGaWx0ZXJNYXBwaW5nSXRlbSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGl0ZW0uaXNTZXJ2bGV0TmFtZVR5cGUoKSAmJiBpdGVtLmdldE5hbWUoKS5lcXVhbHMoc2VydmxldCkpIAotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAcHJpdmF0ZQotCSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0gICAgICAgIGlmIChmU2VsZWN0aW9uID09IFVSTF9QQVRURVJOKSB7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOyAgICAgICAgICAgCi0gICAgICAgICAgICBkaXNwYXRjaGVycyA9IGdldERpc3BhdGNoZXJzKCk7Ci0gICAgICAgICAgICBGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nSXRlbSA9IAotICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShGaWx0ZXJNYXBwaW5nSXRlbS5VUkxfUEFUVEVSTiwgZlVSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVycyk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKG1hcHBpbmdJdGVtKTsKLSAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gKFN0cmluZykgZ2V0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmxldE5hbWUgPT0gbnVsbCkgewotLy8gICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfQ2xhc3NfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0IENsYXNzIgotLy8gICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvdWxkX25vdF91bmlxdWVseV9tYXBfdGhlX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4iCi0vLyAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHNldFJlc3VsdChudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hlcnMgPSBnZXREaXNwYXRjaGVycygpOwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgICAgICAgICAgICAgRmlsdGVyTWFwcGluZ0l0ZW0gbWFwcGluZ0l0ZW0gPSAKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlck1hcHBpbmdJdGVtKEZpbHRlck1hcHBpbmdJdGVtLlNFUlZMRVRfTkFNRSwgc2VydmxldE5hbWUsIGRpc3BhdGNoZXJzKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG1hcHBpbmdJdGVtKTsKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldERpc3BhdGNoZXJzKCkgewotICAgICAgICBpbnQgZGlzcGF0Y2hlcnMgPSAwOwotICAgICAgICBpZiAoZlJlcXVlc3QuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoZXJzIHw9IElGaWx0ZXJNYXBwaW5nSXRlbS5SRVFVRVNUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmRm9yd2FyZC5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgZGlzcGF0Y2hlcnMgfD0gSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZJbmNsdWRlLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaGVycyB8PSBJRmlsdGVyTWFwcGluZ0l0ZW0uSU5DTFVERTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkVyb3JyLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaGVycyB8PSBJRmlsdGVyTWFwcGluZ0l0ZW0uRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJzOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtID09IG51bGwgJiYgKGZTZXJ2bGV0TmFtZXMgIT0gbnVsbCAmJiBmU2VydmxldE5hbWVzLmxlbmd0aCA+IDApKSBmU2VsZWN0aW9uID0gU0VSVkxFVDsgCi0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBkaWFsb2cncyAKLQkgKiBidXR0b24gYmFyLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGxheXMgb3V0IGEgYnV0dG9uIGJhciBhbmQgY2FsbHMgdGhlIDxjb2RlPmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXI8L2NvZGU+Ci0JICogZnJhbWV3b3JrIG1ldGhvZCB0byBwb3B1bGF0ZSBpdC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBidXR0b24gYmFyCi0JICogQHJldHVybiB0aGUgYnV0dG9uIGJhciBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUyID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkvLyBjcmVhdGUgYSBsYXlvdXQgd2l0aCBzcGFjaW5nIGFuZCBtYXJnaW5zIGFwcHJvcHJpYXRlIGZvciB0aGUgZm9udCBzaXplLgotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDA7IC8vIHRoaXMgaXMgaW5jcmVtZW50ZWQgYnkgY3JlYXRlQnV0dG9uCi0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0KLQkJY29tcG9zaXRlMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJY29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbXBvc2l0ZTIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoY29tcG9zaXRlMik7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCWZDaGlsZCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNoaWxkLCAiY29tLmlibS5ldG9vbHMud2ViYXBwbGljYXRpb25lZGl0LndlYngyMDEwIik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCQlmQ2hpbGQuc2V0TGF5b3V0KGdsKTsKLQotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZkNoaWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSB0aGUgV2ViIFR5cGUgcmFkaW8gYnV0dG9ucyBhbmQgdGV4dCBmaWVsZHMuCi0JCWZTZXJ2bGV0QnV0dG9uID0gbmV3IEJ1dHRvbihmQ2hpbGQsIFNXVC5SQURJTyk7Ci0JCWZTZXJ2bGV0QnV0dG9uLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlcnZsZXRfVUlfIikpOyAvLyROT04tTkxTLTEkID0gU2VydmxldAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlmU2VydmxldEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlNlcnZsZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZlVSTFBhdHRlcm5CdXR0b24gPSBuZXcgQnV0dG9uKGZDaGlsZCwgU1dULlJBRElPKTsKLQkJZlVSTFBhdHRlcm5CdXR0b24uc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVVJMX3BhdHRlcm5fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZVUkxQYXR0ZXJuQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmVVJMUGF0dGVybkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvL0NyZWF0ZSBVUkwgUGF0dGVybiBwYWdlIAotCQlmUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soZkNoaWxkLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlBhZ2VCb29rLnNldExheW91dERhdGEoZ2QpOwotCQkKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFVSTF9QQVRURVJOX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZVUkxUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0gICAgICAgIHNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIHNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgICAgIGZVUkxUZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0gICAgICAgIExpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVPa1N0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGZVUkxUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGwpOwotICAgICAgICBmVVJMUGF0dGVybkNvbnRyb2wgPSBjb21wb3NpdGU7Ci0KLSAgICAgICAgLy9DcmVhdGUgU2VydmxldCBwYWdlCi0gICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBtZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNob29zZV9hX3NlcnZsZXRfXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmVXBwZXJMaXN0ID0gY3JlYXRlVXBwZXJMaXN0KGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZlNlcnZsZXRDb250cm9sID0gY29tcG9zaXRlOwotCi0gICAgICAgIC8vQ3JlYXRlIERpc3BhdGNoZXJzIGNvbnRyb2wKLSAgICAgICAgR3JvdXAgZGlzcGF0Y2hlcnMgPSBuZXcgR3JvdXAoZkNoaWxkLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgZGlzcGF0Y2hlcnMuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X0Rpc3BhdGNoZXJzX1VJXyIpKTsKLSAgICAgICAgZGlzcGF0Y2hlcnMuc2V0TGF5b3V0KG5ldyBDZWxsTGF5b3V0KDIpLnNldE1hcmdpbnMoMTAsMTApLnNldFNwYWNpbmcoNSw1KSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZGlzcGF0Y2hlcnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGZSZXF1ZXN0ID0gbmV3IEJ1dHRvbihkaXNwYXRjaGVycywgU1dULkNIRUNLKTsKLSAgICAgICAgZlJlcXVlc3Quc2V0VGV4dChSRVFVRVNUKTsKLSAgICAgICAgZkZvcndhcmQgPSBuZXcgQnV0dG9uKGRpc3BhdGNoZXJzLCBTV1QuQ0hFQ0spOwotICAgICAgICBmRm9yd2FyZC5zZXRUZXh0KEZPUldBUkQpOwotICAgICAgICBmSW5jbHVkZSA9IG5ldyBCdXR0b24oZGlzcGF0Y2hlcnMsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGZJbmNsdWRlLnNldFRleHQoSU5DTFVERSk7Ci0gICAgICAgIGZFcm9yciA9IG5ldyBCdXR0b24oZGlzcGF0Y2hlcnMsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGZFcm9yci5zZXRUZXh0KEVSUk9SKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbS5pc1VybFBhdHRlcm5UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBmU2VsZWN0aW9uID0gVVJMX1BBVFRFUk47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZTZWxlY3Rpb24gPSBTRVJWTEVUOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZTZXJ2bGV0TmFtZXMgPT0gbnVsbCB8fCBmU2VydmxldE5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZlNlbGVjdGlvbiA9IFVSTF9QQVRURVJOOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVVwcGVyTGlzdFdpZGdldCgpOwotCi0gICAgICAgIGZTZXJ2bGV0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGlmIChmU2VsZWN0aW9uID09IFVSTF9QQVRURVJOKSB7Ci0gICAgICAgICAgICBmVVJMUGF0dGVybkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBmUGFnZUJvb2suc2hvd1BhZ2UoZlVSTFBhdHRlcm5Db250cm9sKTsKLSAgICAgICAgICAgIGZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZlNlcnZsZXROYW1lcyA9PSBudWxsIHx8IGZTZXJ2bGV0TmFtZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBmU2VydmxldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZVUkxUZXh0LnNldFRleHQoc2VsZWN0ZWRJdGVtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RGlzcGF0Y2hlcnMoc2VsZWN0ZWRJdGVtLmdldERpc3BhdGNoZXJzKCkpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBmUGFnZUJvb2suc2hvd1BhZ2UoZlNlcnZsZXRDb250cm9sKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZVcHBlckxpc3Quc2V0U2VsZWN0aW9uKGdldFNlcnZsZXRJbmRleChmVXBwZXJMaXN0LCBzZWxlY3RlZEl0ZW0uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgc2V0RGlzcGF0Y2hlcnMoc2VsZWN0ZWRJdGVtLmdldERpc3BhdGNoZXJzKCkpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJdXBkYXRlT2tTdGF0ZSgpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLSAgICBwcml2YXRlIGludCBnZXRTZXJ2bGV0SW5kZXgoVGFibGUgbGlzdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgIGlmICh0YWJsZUl0ZW0uZ2V0VGV4dCgpLmVxdWFscyhuYW1lKSkgcmV0dXJuIGk7IAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGF0Y2hlcnMoaW50IGRpc3BhdGNoZXJzKSB7Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uUkVRVUVTVCkgPiAwKSB7Ci0gICAgICAgICAgICBmUmVxdWVzdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5GT1JXQVJEKSA+IDApIHsKLSAgICAgICAgICAgIGZGb3J3YXJkLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLklOQ0xVREUpID4gMCkgewotICAgICAgICAgICAgZkluY2x1ZGUuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRVJST1IpID4gMCkgewotICAgICAgICAgICAgZkVyb3JyLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLQkgKi8KLQlwcml2YXRlIFRhYmxlIGNyZWF0ZVVwcGVyTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmVXBwZXJMaXN0TGFiZWwgIT0gbnVsbCkKLQkJCSAobmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpKS5zZXRUZXh0KGZVcHBlckxpc3RMYWJlbCk7Ci0KLQkJVGFibGUgbGlzdCA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotLy8JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLS8vCQkJCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotLy8JCQl9Ci0vLwkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZFbGVtZW50UmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNCk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgSUQgb2YgdGhlIGJ1dHRvbiB0aGF0IGlzICdwcmVzc2VkJyBvbiBkb3VibGVDbGljayBpbiB0aGUgbGlzdHMuCi0JICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgT0sgYnV0dG9uLgotCSAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0QnV0dG9uSUQoKSB7Ci0JCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICBpbnQgaW5kZXggPSBmVXBwZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gZkVsZW1lbnRzW2luZGV4XSA6IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVcHBlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0gICAgICAgIGlmIChmU2VydmxldE5hbWVzID09IG51bGwgfHwgZlNlcnZsZXROYW1lcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgZlNlbGVjdGlvbiA9IFVSTF9QQVRURVJOOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0RWxlbWVudHMoZlNlcnZsZXROYW1lcyk7Ci0gICAgICAgIHNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7ICIiIH0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHAgb3JnLmVjbGlwc2UuamZhY2UuZWxlbWVudHMuSUluZGV4ZWRQcm9wZXJ0eQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gcmVuZGVyU3RyaW5ncyhPYmplY3RbXSBwKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3AubGVuZ3RoXTsKLQkJaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXN0cmluZ3NbaV0gPSBmRWxlbWVudFJlbmRlcmVyLmdldFRleHQocFtpXSk7Ci0JCX0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQoc3RyaW5ncywgcCk7Ci0JCXJldHVybiBzdHJpbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSBlbGVtZW50cyA9IG5ldyBPYmplY3RbMF07IAotCQlmRWxlbWVudHMgPSBlbGVtZW50czsKLQkJZlJlbmRlcmVkU3RyaW5ncyA9IHJlbmRlclN0cmluZ3MoZkVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oaW50IG5ld1NlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlT2tTdGF0ZSgpIHsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCSAgICBpZiAoZlNlbGVjdGlvbiA9PSBTRVJWTEVUKSB7Ci0JCSAgICAgICAgb2tCdXR0b24uc2V0RW5hYmxlZChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKTsKLQkJICAgIH0gZWxzZSB7Ci0JCSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZVUkxUZXh0LmdldFRleHQoKS50cmltKCk7CQkgICAgICAgIAotCQkgICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQocmVzdWx0Lmxlbmd0aCgpID4gMCk7Ci0JCSAgICB9Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVVcHBlckxpc3RXaWRnZXQoKSB7Ci0gICAgICAgIGZVcHBlckxpc3Quc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgICAgZlVwcGVyTGlzdC5jbGVhckFsbCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZSZW5kZXJlZFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0oZlVwcGVyTGlzdCwgU1dULk5PTkUpOwotICAgICAgICAgICAgdGkuc2V0VGV4dChmUmVuZGVyZWRTdHJpbmdzW2ldKTsKLSAgICAgICAgICAgIC8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotICAgICAgICAgICAgSW1hZ2UgaW1nID0gZkVsZW1lbnRSZW5kZXJlci5nZXRJbWFnZShmUmVuZGVyZWRTdHJpbmdzW2ldKTsKLSAgICAgICAgICAgIHRpLnNldEltYWdlKGltZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZVcHBlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBmVXBwZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLSAgICAgICAgfQotICAgICAgICBmVXBwZXJMaXN0LnNldFJlZHJhdyh0cnVlKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogU2VudCB3aGVuIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzCi0JICogaW4gYSBMaXN0IHdoZW4gdGhlIHVzZXIgZG91YmxlLWNsaWNrcyBhbiBpdGVtIG9yIHR5cGVzCi0JICogcmV0dXJuIGluIGEgVGV4dC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogU2VudCB3aGVuIHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIHNvbWUgcGxhdGZvcm1zIHNlbGVjdGlvbiBvY2N1cnMgaW4KLQkgKiBhIExpc3Qgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gb3IgaXRlbXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gZlVSTFBhdHRlcm5CdXR0b24pIHsKLQkJCWZTZWxlY3Rpb24gPSBVUkxfUEFUVEVSTjsKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmVVJMUGF0dGVybkNvbnRyb2wpOwotCQkJdXBkYXRlT2tTdGF0ZSgpOwotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGZTZXJ2bGV0QnV0dG9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gU0VSVkxFVDsKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmU2VydmxldENvbnRyb2wpOwotCQkJZ2V0U2hlbGwoKS5wYWNrKCk7Ci0JCX0gZWxzZQotCQkJZlNlbGVjdGlvbiA9IC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdmZWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogTmV3IHNlcnZsZXQgZmlsdGVyIHdpemFyZAotICovCi1wdWJsaWMgY2xhc3MgQWRkRmlsdGVyV2l6YXJkIGV4dGVuZHMgTmV3V2ViQXJ0aWZhY3RXaXphcmQgewotCQotICAgIHB1YmxpYyBBZGRGaWx0ZXJXaXphcmQoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0JcHVibGljIEFkZEZpbHRlcldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRJbWFnZUZyb21KMkVFUGx1Z2luKCJuZXdmaWx0ZXJfd2l6Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlIHBhZ2UxID0gbmV3IE5ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZSgKLQkJICAgICAgICBnZXREYXRhTW9kZWwoKSwKLQkJICAgICAgICBQQUdFX09ORSwKLQkJICAgICAgICBORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDLAotCQkJCUFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEUsIAotCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQkJcGFnZTEuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzEpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQlBZGRGaWx0ZXJXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEFkZEZpbHRlcldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIFBBR0VfVFdPKTsKLQkJcGFnZTIuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzIpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLSAgICAgICAgCi0gICAgICAgIE5ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgcGFnZTMgPSBuZXcgTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSgKLSAgICAgICAgICAgICAgICBnZXREYXRhTW9kZWwoKSwgCi0gICAgICAgICAgICAgICAgUEFHRV9USFJFRSwKLSAgICAgICAgICAgICAgICBORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0MsCi0gICAgICAgICAgICAgICAgQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0gICAgICAgIHBhZ2UzLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8zKTsKLSAgICAgICAgYWRkUGFnZShwYWdlMyk7Ci0JfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAJLy9vcGVuIG5ldyBmaWx0ZXIgY2xhc3MgaW4gamF2YSBlZGl0b3IKLSAgICAgICAgb3BlbkphdmFDbGFzcygpOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTMzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTFRFUl9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU0NSSVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVTQ1JJUFRJT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFU0NSSVBUSU9OX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ESVNQQVRDSEVSU19MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRURJVF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLklOSVRfUEFSQU1fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLklOSVRfUEFSQU1fVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5BTUVfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5BTUVfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5PX1dFQl9QUk9KRUNUUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX1NFUlZMRVRfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlZBTFVFX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5WQUxVRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSUZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEZpbHRlciBXaXphcmQgU2V0dGluZyBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRGaWx0ZXJXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JCi0JZmluYWwgc3RhdGljIFN0cmluZ1tdIEZJTFRFUkVYVEVOU0lPTlMgPSB7ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGRpc3BsYXlOYW1lVGV4dDsKLQotCUZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gbWFwcGluZ1NlY3Rpb247Ci0KLQlwdWJsaWMgQWRkRmlsdGVyV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDKTsKLQkJc2V0VGl0bGUoQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgRElTUExBWV9OQU1FLCAKLQkJICAgICAgICBJTklUX1BBUkFNLCAKLQkJICAgICAgICBGSUxURVJfTUFQUElOR1MgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZU5hbWVEZXNjcmlwdGlvbihjb21wb3NpdGUpOwotCQkKLQkJU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrKCk7Ci0JCVN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uIGluaXRTZWN0aW9uID0gbmV3IFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJSU5JVF9QQVJBTV9MQUJFTCwgCi0JCQkJSU5JVF9QQVJBTV9USVRMRSwgCi0JCQkJQUREX0JVVFRPTl9MQUJFTCwgCi0JCQkJRURJVF9CVVRUT05fTEFCRUwsIAotCQkJCVJFTU9WRV9CVVRUT05fTEFCRUwsIAotCQkJCW5ldyBTdHJpbmdbXSB7IE5BTUVfVElUTEUsIFZBTFVFX1RJVExFLCBERVNDUklQVElPTl9USVRMRSB9LCAKLQkJCQluZXcgU3RyaW5nW10geyBOQU1FX0xBQkVMLCBWQUxVRV9MQUJFTCwgREVTQ1JJUFRJT05fTEFCRUwgfSwgCi0JCQkJbnVsbCwvLyBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpbml0aWFsaXpfcGFyYW1ldGVyIiksCi0JCQkJbW9kZWwsIAotCQkJCUlOSVRfUEFSQU0pOwotCQlpbml0U2VjdGlvbi5zZXRDYWxsYmFjayhjYWxsYmFjayk7Ci0JCQotCQlTdHJpbmdbXSBidXR0b25zID0gbmV3IFN0cmluZ1tdIHsKLQkJICAgICAgICBBRERfQlVUVE9OX0xBQkVMLCAKLQkJICAgICAgICBFRElUX0JVVFRPTl9MQUJFTCwgCi0JCSAgICAgICAgUkVNT1ZFX0JVVFRPTl9MQUJFTAotCQl9OwotCQlTdHJpbmdbXSBjb2x1bW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSAgICAgICAgbnVsbCwKLQkJICAgICAgICBVUkxfU0VSVkxFVF9MQUJFTCwKLQkJICAgICAgICBESVNQQVRDSEVSU19MQUJFTAotCQl9OwotCQltYXBwaW5nU2VjdGlvbiA9IG5ldyBGaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uKGNvbXBvc2l0ZSwgCi0JCSAgICAgICAgIG1vZGVsLCBGSUxURVJfTUFQUElOR1MpOwotCi0JCVN0cmluZyB0ZXh0ID0gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJLy8gU2V0IGRlZmF1bHQgVVJMIFBhdHRlcm4KLQkJTGlzdCBpbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5wdXQuYWRkKG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShJRmlsdGVyTWFwcGluZ0l0ZW0uVVJMX1BBVFRFUk4sICIvIiArIHRleHQpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFwcGluZ1NlY3Rpb24gIT0gbnVsbCkKLQkJICAgIG1hcHBpbmdTZWN0aW9uLnNldElucHV0KGlucHV0KTsKLQkJZGlzcGxheU5hbWVUZXh0LnNldEZvY3VzKCk7Ci0KLQkJSVN0YXR1cyBwcm9qZWN0U3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TmFtZSgpOwotCQlpZiAoIXByb2plY3RTdGF0dXMuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocHJvamVjdFN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3ROYW1lKCkgewotCQkvLyBjaGVjayBmb3IgZW1wdHkKLQkJaWYgKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkgPT0gbnVsbCB8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKE5PX1dFQl9QUk9KRUNUUyk7Ci0JCX0KLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZURlc2NyaXB0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkvLyBkaXNwbGF5IG5hbWUKLQkJTGFiZWwgZGlzcGxheU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRUZXh0KE5BTUVfTEFCRUwpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJLy8gU2V0IGRlZmF1bHQgVVJMIFBhdHRlcm4KLQkJCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlucHV0LmFkZChuZXcgRmlsdGVyTWFwcGluZ0l0ZW0oSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOLCAiLyIgKyB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobWFwcGluZ1NlY3Rpb24gIT0gbnVsbCkKLQkJCQkgICAgbWFwcGluZ1NlY3Rpb24uc2V0SW5wdXQoaW5wdXQpOwotCQkJfQotCi0JCX0pOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZGlzcGxheU5hbWVUZXh0LCBESVNQTEFZX05BTUUsIG51bGwpOwotCi0JCS8vIGRlc2NyaXB0aW9uCi0JCUxhYmVsIGRlc2NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGVzY0xhYmVsLnNldFRleHQoREVTQ1JJUFRJT05fTEFCRUwpOwotCQlkZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJVGV4dCBkZXNjVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGRlc2NUZXh0LCBERVNDUklQVElPTiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9FWElTVElOR19DTEFTUykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jYW5GbGlwVG9OZXh0UGFnZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5MDAyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogTmV3IGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIEFkZExpc3RlbmVyV2l6YXJkIGV4dGVuZHMgTmV3V2ViQXJ0aWZhY3RXaXphcmQgewotCQotCXB1YmxpYyBBZGRMaXN0ZW5lcldpemFyZCgpIHsKLQkgICAgdGhpcyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIEFkZExpc3RlbmVyV2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBBRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0SW1hZ2VGcm9tSjJFRVBsdWdpbigibmV3bGlzdGVuZXJfd2l6Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UgcGFnZTEgPSBuZXcgTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UoCi0JCQkJZ2V0RGF0YU1vZGVsKCksIAotCQkJCVBBR0VfT05FLAotCQkJCU5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFLCBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0JCXBhZ2UxLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlBZGRMaXN0ZW5lcldpemFyZFBhZ2UgcGFnZTIgPSBuZXcgQWRkTGlzdGVuZXJXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBQQUdFX1RXTyk7Ci0JCXBhZ2UyLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMik7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCQlOZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgcGFnZTMgPSBuZXcgTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlKAotCQkJCWdldERhdGFNb2RlbCgpLCAKLQkJCQlQQUdFX1RIUkVFLAotCQkJCU5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQywKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEUpOwotCQlwYWdlMy5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzMpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIG9wZW4gbmV3IGxpc3RlbmVyIGNsYXNzIGluIGphdmEgZWRpdG9yCi0JCW9wZW5KYXZhQ2xhc3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjMTc4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLkxJU1RFTkVSX0lOVEVSRkFDRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FDVElWQVRJT05fTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQ0xFQVJfQlVUVE9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5TRUxFQ1RfQUxMX0JVVFRPTjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgQWRkTGlzdGVuZXJXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSAgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIElNR19JTlRFUkZBQ0UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX0lOVEVSRkFDRSk7Ci0KLQlwcm90ZWN0ZWQgU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIgc3luY2hIZWxwZXI7Ci0JCi0JcHVibGljIEFkZExpc3RlbmVyV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0MpOwotCQlzZXRUaXRsZShBRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEUpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBTZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlciBpbml0aWFsaXplU3luY2hIZWxwZXIoSURhdGFNb2RlbCBkbSkgewotCQlyZXR1cm4gbmV3IFNlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyKGRtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVTZXJ2bGV0Q29udGV4dEV2ZW50cyhjb21wb3NpdGUpOwotCQljcmVhdGVIdHRwU2Vzc2lvbkV2ZW50cyhjb21wb3NpdGUpOwotCQljcmVhdGVTZXJ2bGV0UmVxdWVzdEV2ZW50cyhjb21wb3NpdGUpOwotCQljcmVhdGVTZWxlY3RBbGxHcm91cChjb21wb3NpdGUpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAKLQkJCQlJTlRFUkZBQ0VTCi0JCX07Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJc3luY2hIZWxwZXIuc3luY2hVSVdpdGhNb2RlbChJTlRFUkZBQ0VTLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2bGV0Q29udGV4dEV2ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFMpOwotCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFLCAKLQkJCQlRVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0xJU1RFTkVSLAotCQkJCUlOVEVSRkFDRVMpOwotCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTLCAKLQkJCQlRVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVIdHRwU2Vzc2lvbkV2ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBBRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFMpOwotCQkKLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEUsIAotCQkJCVFVQUxJRklFRF9IVFRQX1NFU1NJT05fTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCQkKLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVMsIAotCQkJCVFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQkJCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT04sIAotCQkJCVFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JCQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HLCAKLQkJCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmxldFJlcXVlc3RFdmVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTKTsKLQkJCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFLCAKLQkJCQlRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUywgCi0JCQkJUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCX0KLQkKLQlwcml2YXRlIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwotCQkKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZXZlbnQsIFN0cmluZyBsaXN0ZW5lciwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWNyZWF0ZUNoZWNrYm94KHBhcmVudCwgZXZlbnQsIGxpc3RlbmVyLCBwcm9wZXJ0eSk7Ci0JCWNyZWF0ZUludGVyZmFjZUljb24ocGFyZW50KTsKLQkJY3JlYXRlSW50ZXJmYWNlTGFiZWwocGFyZW50LCBsaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTdHJpbmcgdmFsdWUsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChidXR0b24sIHZhbHVlLCBwcm9wZXJ0eSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUludGVyZmFjZUljb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDUwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlJJR0hUKTsKLQkJbGFiZWwuc2V0SW1hZ2UoSU1HX0lOVEVSRkFDRSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlSW50ZXJmYWNlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCQotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3RBbGxHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCi0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gY2xlYXIgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljbGVhci5zZXRUZXh0KENMRUFSX0JVVFRPTik7Ci0JCWNsZWFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdE5vbmUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbCgpIHsKLQkJTGlzdCBpbnRlcmZhY2VzID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElOVEVSRkFDRVMpOwotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5URVJGQUNFUywgaW50ZXJmYWNlcyk7Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIGlmYWNlIDogTElTVEVORVJfSU5URVJGQUNFUykgewotCQkJaWYgKCFpbnRlcmZhY2VzLmNvbnRhaW5zKGlmYWNlKSkgewotCQkJCWludGVyZmFjZXMuYWRkKGlmYWNlKTsKLQkJCX0KLQkJfQotCQkKLQkJc3luY2hIZWxwZXIuc3luY2hVSVdpdGhNb2RlbChJTlRFUkZBQ0VTLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShJTlRFUkZBQ0VTLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3ROb25lKCkgewotCQlMaXN0IGludGVyZmFjZXMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5URVJGQUNFUyk7Ci0JCWlmIChpbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJTlRFUkZBQ0VTLCBpbnRlcmZhY2VzKTsKLQkJfQotCQkKLQkJaW50ZXJmYWNlcy5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChMSVNURU5FUl9JTlRFUkZBQ0VTKSk7Ci0JCQotCQlzeW5jaEhlbHBlci5zeW5jaFVJV2l0aE1vZGVsKElOVEVSRkFDRVMsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVEVSRkFDRVMsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2EzNWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklTX1NFUlZMRVRfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIE5ldyBzZXJ2bGV0IHdpemFyZAotICovCi1wdWJsaWMgY2xhc3MgQWRkU2VydmxldFdpemFyZCBleHRlbmRzIE5ld1dlYkFydGlmYWN0V2l6YXJkIHsKLQkKLQlwdWJsaWMgQWRkU2VydmxldFdpemFyZCgpIHsKLQkgICAgdGhpcyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIEFkZFNlcnZsZXRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJuZXdzZXJ2bGV0X3dpeiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCU5ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UgcGFnZTEgPSBuZXcgTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZSgKLQkJCQlnZXREYXRhTW9kZWwoKSwgCi0JCQkJUEFHRV9PTkUsCi0JCQkJTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQywKLQkJCQlBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSwgSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwotCQlwYWdlMS5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8xKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0JCUFkZFNlcnZsZXRXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEFkZFNlcnZsZXRXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBQQUdFX1RXTyk7Ci0JCXBhZ2UyLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzIpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQkJTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UgcGFnZTMgPSBuZXcgTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UoCi0JCQkJZ2V0RGF0YU1vZGVsKCksIAotCQkJCVBBR0VfVEhSRUUsCi0JCQkJTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDLAotCQkJCUFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFKTsKLQkJcGFnZTMuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMyk7Ci0JCWFkZFBhZ2UocGFnZTMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBpc1NlcnZsZXQgPSBnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSVNfU0VSVkxFVF9UWVBFKTsKLQkJaWYgKGlzU2VydmxldCkgewotCQkJLy8gb3BlbiBuZXcgc2VydmxldCBjbGFzcyBpbiBqYXZhIGVkaXRvcgotCQkJb3BlbkphdmFDbGFzcygpOwotCQl9IGVsc2UgewotCQkJLy8gb3BlbiBuZXcganNwIGZpbGUgaW4ganNwIGVkaXRvcgotCQkJb3BlbldlYkZpbGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg2MWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVF9QQVJBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVJMX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU0NSSVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERVNDUklQVElPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVTQ1JJUFRJT05fVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkVESVRfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5JTklUX1BBUkFNX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5JTklUX1BBUkFNX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OQU1FX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OQU1FX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OT19XRUJfUFJPSkVDVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlJFTU9WRV9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9NQVBQSU5HU19MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX01BUFBJTkdTX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfUEFUVEVSTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX1BBVFRFUk5fVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlZBTFVFX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5WQUxVRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLlN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogU2VydmxldCBXaXphcmQgU2V0dGluZyBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2bGV0V2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKU1BFWFRFTlNJT05TID0geyJqc3AifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGRpc3BsYXlOYW1lVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gdXJsU2VjdGlvbjsKLQotCXB1YmxpYyBBZGRTZXJ2bGV0V2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQyk7Ci0JCXRoaXMuc2V0VGl0bGUoQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IERJU1BMQVlfTkFNRSwgSU5JVF9QQVJBTSwgVVJMX01BUFBJTkdTIH07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVOYW1lRGVzY3JpcHRpb24oY29tcG9zaXRlKTsKLQkJCi0JCVN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjaygpOwotCQlTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBpbml0U2VjdGlvbiA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbigKLQkJCQljb21wb3NpdGUsIAotCQkJCUlOSVRfUEFSQU1fTEFCRUwsIAotCQkJCUlOSVRfUEFSQU1fVElUTEUsIAotCQkJCUFERF9CVVRUT05fTEFCRUwsIAotCQkJCUVESVRfQlVUVE9OX0xBQkVMLCAKLQkJCQlSRU1PVkVfQlVUVE9OX0xBQkVMLCAKLQkJCQluZXcgU3RyaW5nW10geyBOQU1FX1RJVExFLCBWQUxVRV9USVRMRSwgREVTQ1JJUFRJT05fVElUTEUgfSwgCi0JCQkJbmV3IFN0cmluZ1tdIHsgTkFNRV9MQUJFTCwgVkFMVUVfTEFCRUwsIERFU0NSSVBUSU9OX0xBQkVMIH0sIAotCQkJCW51bGwsLy8gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpLAotCQkJCW1vZGVsLCAKLQkJCQlJTklUX1BBUkFNKTsKLQkJaW5pdFNlY3Rpb24uc2V0Q2FsbGJhY2soY2FsbGJhY2spOwotCQl1cmxTZWN0aW9uID0gbmV3IFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJVVJMX01BUFBJTkdTX0xBQkVMLCAKLQkJCQlVUkxfTUFQUElOR1NfVElUTEUsIAotCQkJCUFERF9CVVRUT05fTEFCRUwsIAotCQkJCUVESVRfQlVUVE9OX0xBQkVMLCAKLQkJCQlSRU1PVkVfQlVUVE9OX0xBQkVMLAotCQkJCW5ldyBTdHJpbmdbXSB7IFVSTF9QQVRURVJOX1RJVExFIH0sIAotCQkJCW5ldyBTdHJpbmdbXSB7IFVSTF9QQVRURVJOX0xBQkVMIH0sIAotCQkJCW51bGwsLy8gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXJsX3R5cGUiKSwKLQkJCQltb2RlbCwgCi0JCQkJVVJMX01BUFBJTkdTKTsKLQkJdXJsU2VjdGlvbi5zZXRDYWxsYmFjayhjYWxsYmFjayk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCS8vIFNldCBkZWZhdWx0IFVSTCBQYXR0ZXJuCi0JCUxpc3QgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlucHV0LmFkZChuZXcgU3RyaW5nW117Ii8iICsgdGV4dH0pOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmxTZWN0aW9uICE9IG51bGwpCi0JCQl1cmxTZWN0aW9uLnNldElucHV0KGlucHV0KTsKLQkJZGlzcGxheU5hbWVUZXh0LnNldEZvY3VzKCk7Ci0KLQkJSVN0YXR1cyBwcm9qZWN0U3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TmFtZSgpOwotCQlpZiAoIXByb2plY3RTdGF0dXMuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocHJvamVjdFN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3ROYW1lKCkgewotCQkvLyBjaGVjayBmb3IgZW1wdHkKLQkJaWYgKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkgPT0gbnVsbCB8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKE5PX1dFQl9QUk9KRUNUUyk7Ci0JCX0KLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZURlc2NyaXB0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkvLyBkaXNwbGF5IG5hbWUKLQkJTGFiZWwgZGlzcGxheU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRUZXh0KE5BTUVfTEFCRUwpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJLy8gU2V0IGRlZmF1bHQgVVJMIFBhdHRlcm4KLQkJCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlucHV0LmFkZChuZXcgU3RyaW5nW117Ii8iICsgdGV4dH0pOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHVybFNlY3Rpb24gIT0gbnVsbCkKLQkJCQkJdXJsU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkaXNwbGF5TmFtZVRleHQsIERJU1BMQVlfTkFNRSwgbnVsbCk7Ci0KLQkJLy8gZGVzY3JpcHRpb24KLQkJTGFiZWwgZGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkZXNjTGFiZWwuc2V0VGV4dChERVNDUklQVElPTl9MQUJFTCk7Ci0JCWRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlUZXh0IGRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRlc2NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZGVzY1RleHQsIERFU0NSSVBUSU9OLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFX0VYSVNUSU5HX0NMQVNTKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNhbkZsaXBUb05leHRQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVXZWJMaWJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVXZWJMaWJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U1ZTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXZhaWxhYmxlSmFyc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEF2YWlsYWJsZVdlYkxpYlByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEF2YWlsYWJsZVdlYkxpYlByb3ZpZGVyKCkgewotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBBcmNoaXZlV3JhcHBlcikgewotCQkJT2JqZWN0W10gYXJyYXkgPSAoKEFyY2hpdmVXcmFwcGVyKSBpbnB1dEVsZW1lbnQpLmdldFdlYkxpYnMoKS50b0FycmF5KCk7Ci0JCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCXJldHVybiBnZXRDb2x1bW5UZXh0KG8xLCAwKS5jb21wYXJlVG8oZ2V0Q29sdW1uVGV4dChvMiwgMCkpOwotCQkJCX0KLQotCQkJfSk7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIEF2YWlsYWJsZUphcnNQcm92aWRlci5nZXRVdGlsSW1hZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlBcmNoaXZlV3JhcHBlciB3cmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKWVsZW1lbnQ7Ci0JCXJldHVybiB3cmFwcGVyLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTViNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5JU2hlbGxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlNoZWxsVGl0bGUgPSBJV2ViV2l6YXJkQ29uc3RhbnRzLkNPTlZFUlRfVE9fV0VCX1RJVExFOwotCXByaXZhdGUgU3RyaW5nIGZMYWJlbFRleHQgPSBJV2ViV2l6YXJkQ29uc3RhbnRzLlNFTEVDVF9XRUJfVkVSU0lPTjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZlNlbGVjdGlvbj0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGZBbGxvd2VkU3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7SjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVCwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzNfVEVYVCwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzRfVEVYVCwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzVfVEVYVCwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVH07Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxTZWxlY3Rpb25JbmRleCA9IGZBbGxvd2VkU3RyaW5ncy5sZW5ndGgtMTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWxlY3RlZFZlcnNpb24oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nKElTaGVsbFByb3ZpZGVyIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dChmU2hlbGxUaXRsZSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUNvbXBvc2l0ZSBpbm5lckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlubmVyQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlHcmlkTGF5b3V0IGdsPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zPSAyOwotCQlpbm5lckNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCQkKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGZMYWJlbFRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlmaW5hbCBDb21ibyBjb21ibz0gbmV3IENvbWJvKGlubmVyQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWxsb3dlZFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWNvbWJvLmFkZChmQWxsb3dlZFN0cmluZ3NbaV0pOwotCQl9Ci0JCWNvbWJvLnNlbGVjdChmSW5pdGlhbFNlbGVjdGlvbkluZGV4KTsKLQkJZlNlbGVjdGlvbj0gY29tYm8uZ2V0SXRlbShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmU2VsZWN0aW9uPSBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0ZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmE3ZmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRElTUEFUQ0hFUlNfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkVESVRfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5GSUxURVJfTUFQUElOR1NfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlJFTU9WRV9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9TRVJWTEVUX0xBQkVMOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklGaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByb3RlY3RlZCBjbGFzcyBTdHJpbmdBcnJheUxpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdDxGaWx0ZXJNYXBwaW5nSXRlbT4pIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FycmF5TGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgVVJMX1BBVFRFUk5fSUNPTiA9IAotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXJsX21hcHBpbmciKSkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZSBTRVJWTEVUX0lDT04gPSAKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXQiKSkuY3JlYXRlSW1hZ2UoKTsKLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkgICAgaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJICAgICAgICBGaWx0ZXJNYXBwaW5nSXRlbSBpdGVtID0gKEZpbHRlck1hcHBpbmdJdGVtKSBlbGVtZW50OwotCQkgICAgICAgIGlmIChpdGVtLmlzU2VydmxldE5hbWVUeXBlKCkpIHsKLQkJICAgICAgICAgICAgcmV0dXJuIFNFUlZMRVRfSUNPTjsKLQkJICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaXNVcmxQYXR0ZXJuVHlwZSgpKSB7Ci0JCSAgICAgICAgICAgIHJldHVybiBVUkxfUEFUVEVSTl9JQ09OOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJICAgIH0KLQkJICAgIHJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkgICAgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJICAgICAgICByZXR1cm4gKChGaWx0ZXJNYXBwaW5nSXRlbSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkgICAgfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCSAgICAgICAgcmV0dXJuICgoRmlsdGVyTWFwcGluZ0l0ZW0pIGVsZW1lbnQpLmdldERpc3BhdGNoZXJzQXNTdHJpbmcoKTsKLQkJICAgIH0KLQkJICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLQl9Ci0JCi0JZmluYWwgc3RhdGljIGludCBJQ09OX1dJRFRIID0gMjU7Ci0JZmluYWwgc3RhdGljIGludCBESVNQQVRDSEVSU19XSURUSCA9IDEwMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUNPTl9QUk9QID0gIklDT05fUFJPUCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUCA9ICJOQU1FX1BST1AiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSU19QUk9QID0gIkRJU1BBVENIRVJTX1BST1AiOwotCQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0gICAgcHVibGljIEZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkgICAgCi0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIAotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgTGFiZWwgdGl0bGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0VGV4dChGSUxURVJfTUFQUElOR1NfTEFCRUwpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB0aXRsZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgICAgIHRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICB2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTdHJpbmdBcnJheUxpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTdHJpbmdBcnJheUxpc3RMYWJlbFByb3ZpZGVyKCkpOwotCi0JCWZpbmFsIENvbXBvc2l0ZSBidXR0b25Db21wbyA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgYnV0dG9uQ29tcG8uc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotICAgICAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KEFERF9CVVRUT05fTEFCRUwpOwotICAgICAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRUZXh0KEVESVRfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoUkVNT1ZFX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGVkaXRCdXR0b24gIT0gbnVsbCkgewotCQkJCQlib29sZWFuIGVuYWJsZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA9PSAxOwotCQkJCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJfQotICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotCQlpZiAoZWRpdEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCQloYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLSAgICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJdGFibGVDb2x1bW4uc2V0V2lkdGgoSUNPTl9XSURUSCk7Ci0JCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCXRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoVVJMX1NFUlZMRVRfTEFCRUwpOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoRElTUEFUQ0hFUlNfTEFCRUwpOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aChESVNQQVRDSEVSU19XSURUSCk7Ci0gICAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0gICAgICAgIHZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7SUNPTl9QUk9QLCBOQU1FX1BST1AsIERJU1BBVENIRVJTX1BST1B9KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGhpcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJICAgICAgICBUYWJsZSB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwotCQkgICAgICAgIFRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJICAgICAgICBQb2ludCBidXR0b25BcmVhID0gYnV0dG9uQ29tcG8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJICAgICAgICBSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplID0gdmlld2VyLmdldFRhYmxlKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJICAgICAgICBpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMip0YWJsZS5nZXRCb3JkZXJXaWR0aCgpIC0gYnV0dG9uQXJlYS54IC0gY29sdW1ucy5sZW5ndGgqMjsKLQkJICAgICAgICBpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSkgewotCQkgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotCQkgICAgICAgICAgICAvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCSAgICAgICAgICAgIFBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCSAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIFBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkgICAgICAgICAgICBpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkgICAgICAgICAgICAgICAgLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMgCi0JCSAgICAgICAgICAgICAgICAvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJICAgICAgICAgICAgICAgIC8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIElDT05fV0lEVEggLSBESVNQQVRDSEVSU19XSURUSCk7Ci0JCSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCoyLCBhcmVhLmhlaWdodCk7Ci0JCSAgICAgICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgICAgICAgICAgICAvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZSAKLQkJICAgICAgICAgICAgICAgIC8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCSAgICAgICAgICAgICAgICAvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJICAgICAgICAgICAgICAgIHRhYmxlLnNldFNpemUoYXJlYS53aWR0aCAtIGJ1dHRvbkFyZWEueCAtIGNvbHVtbnMubGVuZ3RoKjIsIGFyZWEuaGVpZ2h0KTsKLQkJICAgICAgICAgICAgICAgIGlmIChpID09IDEpIGNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLSBJQ09OX1dJRFRIIC0gRElTUEFUQ0hFUlNfV0lEVEgpOwotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JICAgIFN0cmluZyB0aXRsZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBZGRfRmlsdGVyX01hcHBpbmdfVGl0bGVfVUlfIik7Ci0JICAgIElQcm9qZWN0IHAgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCSAgICBMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkgICAgQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cgZGlhbG9nID0gCi0JICAgICAgICBuZXcgQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIHAsIHZhbHVlTGlzdCwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCi0JCWFkZEZpbHRlck1hcHBpbmcoKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IChJRmlsdGVyTWFwcGluZ0l0ZW0pIHJlc3VsdFswXSA6IG51bGwpOwotCX0KLQotICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCkgewotICAgICAgICAgU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVkaXRfRmlsdGVyX01hcHBpbmdfVGl0bGVfVUlfIik7Ci0JCUlTZWxlY3Rpb24gcyA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlGaWx0ZXJNYXBwaW5nSXRlbSB2YWx1ZSA9IChGaWx0ZXJNYXBwaW5nSXRlbSkgc2VsZWN0ZWRPYmo7Ci0JCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQlBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyBkaWFsb2cgPSAKLSAgICAgICAgICAgIG5ldyBBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgcCwgdmFsdWVMaXN0LCB2YWx1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQllZGl0RmlsdGVyTWFwcGluZyh2YWx1ZSwgKElGaWx0ZXJNYXBwaW5nSXRlbSkgcmVzdWx0WzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUxpc3Qgc2VsZWN0ZWRPYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCQlyZW1vdmVGaWx0ZXJNYXBwaW5ncyhzZWxlY3RlZE9iaik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRGaWx0ZXJNYXBwaW5nKElGaWx0ZXJNYXBwaW5nSXRlbSBmaWx0ZXJNYXBwaW5nKSB7Ci0JCWlmIChmaWx0ZXJNYXBwaW5nID09IG51bGwpIHJldHVybjsKLQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkgewotCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXZhbHVlTGlzdC5hZGQoZmlsdGVyTWFwcGluZyk7Ci0JCXNldElucHV0KHZhbHVlTGlzdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0RmlsdGVyTWFwcGluZyhJRmlsdGVyTWFwcGluZ0l0ZW0gb2xkRmlsdGVyTWFwcGluZywgSUZpbHRlck1hcHBpbmdJdGVtIG5ld0ZpbHRlck1hcHBpbmcpIHsKLQkJaWYgKG5ld0ZpbHRlck1hcHBpbmcgPT0gbnVsbCkgcmV0dXJuOwkJCi0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpbnQgaW5kZXggPSB2YWx1ZUxpc3QuaW5kZXhPZihvbGRGaWx0ZXJNYXBwaW5nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl2YWx1ZUxpc3QuYWRkKG5ld0ZpbHRlck1hcHBpbmcpOwotCQl9IGVsc2UgewotCQkJdmFsdWVMaXN0LnNldChpbmRleCwgbmV3RmlsdGVyTWFwcGluZyk7Ci0JCX0KLQkJCi0JCXNldElucHV0KHZhbHVlTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZpbHRlck1hcHBpbmdzKENvbGxlY3Rpb24gc2VsZWN0ZWRGaWx0ZXJNYXBwaW5ncykgewotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJdmFsdWVMaXN0LnJlbW92ZUFsbChzZWxlY3RlZEZpbHRlck1hcHBpbmdzKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0KSB7Ci0JCXZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCS8vIENyZWF0ZSBhIG5ldyBsaXN0IHRvIHRyaWdnZXIgcHJvcGVydHkgY2hhbmdlCi0JCUxpc3QgbmV3SW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0lucHV0LmFkZEFsbChpbnB1dCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3SW5wdXQpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRJbnB1dCgpIHsKLQkgICAgTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgIGlmICh2YWx1ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZUxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0lXZWJXaXphcmRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvSVdlYldpemFyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI3NTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvSVdlYldpemFyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJXaXphcmRDb25zdGFudHMgewotCQotCS8vIEFkZFNlcnZsZXRXaXphcmQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QQUNLQUdFID0gV0VCVUlNZXNzYWdlcy5ERUZBVUxUX1BBQ0tBR0U7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUX0NMQVNTX1RJVExFID0gV0VCVUlNZXNzYWdlcy5TRUxFQ1RfQ0xBU1NfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHID0gV0VCVUlNZXNzYWdlcy5NQVBfQ0xBU1NfTkFNRV9UT19DTEFTU19FUlJPUl9NU0c7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1QVFlfTElTVF9NU0cgPSBXRUJVSU1lc3NhZ2VzLkVNUFRZX0xJU1RfTVNHOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuQUREX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5VU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTklUX1BBUkFNX1RJVExFID0gV0VCVUlNZXNzYWdlcy5JTklUX1BBUkFNX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOSVRfUEFSQU1fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLklOSVRfUEFSQU1fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX01BUFBJTkdTX1RJVExFID0gV0VCVUlNZXNzYWdlcy5VUkxfTUFQUElOR1NfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX01BUFBJTkdTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5VUkxfTUFQUElOR1NfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX1NFUlZMRVRfQ0xBU1MgPSBXRUJVSU1lc3NhZ2VzLkNIT09TRV9TRVJWTEVUX0NMQVNTOwotCQotCS8vIE5ld1NlcnZsZXRXaXphcmQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5ORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFID0gV0VCVUlNZXNzYWdlcy5ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfUEFDS0FHRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuU0VSVkxFVF9QQUNLQUdFX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTkFNRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuU0VSVkxFVF9OQU1FX0xBQkVMOwotCQotICAgIC8vIEFkZEZpbHRlcldpemFyZAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5BRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5VU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIT09TRV9GSUxURVJfQ0xBU1MgPSBXRUJVSU1lc3NhZ2VzLkNIT09TRV9GSUxURVJfQ0xBU1M7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuU0VSVkxFVF9NQVBQSU5HU19MQUJFTDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxURVJfTUFQUElOR1NfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkZJTFRFUl9NQVBQSU5HU19MQUJFTDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfU0VSVkxFVF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuVVJMX1NFUlZMRVRfTEFCRUw7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUlNfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkRJU1BBVENIRVJTX0xBQkVMOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUVVFU1QgPSBXRUJVSU1lc3NhZ2VzLkRJU1BBVENIRVJfUkVRVUVTVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGT1JXQVJEID0gV0VCVUlNZXNzYWdlcy5ESVNQQVRDSEVSX0ZPUldBUkQ7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOQ0xVREUgPSBXRUJVSU1lc3NhZ2VzLkRJU1BBVENIRVJfSU5DTFVERTsgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1IgPSBXRUJVSU1lc3NhZ2VzLkRJU1BBVENIRVJfRVJST1I7IAotICAgIAotICAgIC8vIE5ld0ZpbHRlcldpemFyZAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRSA9IFdFQlVJTWVzc2FnZXMuTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCi0JLy8gQWRkTGlzdGVuZXJXaXphcmQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5VU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkcgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkc7Ci0JCi0JLy8gY29tbW9uCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JVVFRPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuQUREX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFRElUX0JVVFRPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuRURJVF9CVVRUT05fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JVVFRPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfUEFUVEVSTl9USVRMRSA9IFdFQlVJTWVzc2FnZXMuVVJMX1BBVFRFUk5fVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlVSTF9QQVRURVJOX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTERFUl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuRk9MREVSX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfUEFDS0FHRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9QQUNLQUdFX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkNMQVNTX05BTUVfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuU1VQRVJDTEFTU19MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IFdFQlVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRyA9IFdFQlVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0c7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSA9IFdFQlVJTWVzc2FnZXMuUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gV0VCVUlNZXNzYWdlcy5TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IFdFQlVJTWVzc2FnZXMuSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSA9IFdFQlVJTWVzc2FnZXMuSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX01FU1NBR0UgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuTkFNRV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5OQU1FX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OX1RJVExFID0gV0VCVUlNZXNzYWdlcy5ERVNDUklQVElPTl9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuREVTQ1JJUFRJT05fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMVUVfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlZBTFVFX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5WQUxVRV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0JVVFRPTiA9IFdFQlVJTWVzc2FnZXMuUkVNT1ZFX0JVVFRPTjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RfQUxMX0JVVFRPTiA9IFdFQlVJTWVzc2FnZXMuU0VMRUNUX0FMTF9CVVRUT047Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xFQVJfQlVUVE9OID0gV0VCVUlNZXNzYWdlcy5DTEVBUl9CVVRUT047Ci0JCi0gICAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLk5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJbXBvcnRXQVJBY3Rpb25fVUlfID0gV0VCVUlNZXNzYWdlcy5JbXBvcnRXQVJBY3Rpb25fVUlfOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEV4cG9ydFdBUkFjdGlvbl9VSV8gPSBXRUJVSU1lc3NhZ2VzLkV4cG9ydFdBUkFjdGlvbl9VSV87Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9fV0VCX1BST0pFQ1RTID0gV0VCVUlNZXNzYWdlcy5OT19XRUJfUFJPSkVDVFM7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVFMgPSBXRUJVSU1lc3NhZ2VzLlNFUlZMRVRTOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfVE9fV0VCX1RJVExFID0gV0VCVUlNZXNzYWdlcy5Db252ZXJ0VG9XZWJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfV0VCX1ZFUlNJT04gPSBXRUJVSU1lc3NhZ2VzLlNlbGVjdFdlYlZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzZjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfUEFDS0FHRTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR3b0FycmF5UXVpY2tTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlZEZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg3LzMwLzIwMDEgMTE6MTY6MzYgQU0pCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzCi0JCUZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhY2thZ2VSZW5kZXJlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIEltYWdlIFBBQ0tBR0VfSUNPTiA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOyAKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgcCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWlmICgiIi5lcXVhbHMocCkpIC8vJE5PTi1OTFMtMSQKLQkJCQlwID0gREVGQVVMVF9QQUNLQUdFOwotCQkJcmV0dXJuIChwICsgIiAtICIgKyB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpLmdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIFBBQ0tBR0VfSUNPTjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVSZW5kZXJlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIEltYWdlIENMQVNTX0lDT04gPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19DTEFTUyk7IAotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJSVR5cGUgZSA9ICgoSVR5cGUpIGVsZW1lbnQpOwotCQkJcmV0dXJuIGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIENMQVNTX0lDT047Ci0JCX0KLQotCX0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBKU1AgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFUlZMRVQgPSAxOwotCXByb3RlY3RlZCBCdXR0b24gZlNlcnZsZXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmSlNQQnV0dG9uOwotCXByb3RlY3RlZCBpbnQgZlNlbGVjdGlvbiA9IC0xOwotCXByb3RlY3RlZCBQYWdlQm9vayBmUGFnZUJvb2sgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZKc3BDb250cm9sID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29udHJvbCBmU2VydmxldENvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZkNoaWxkID0gbnVsbDsKLQkvLyBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVycwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGZSdW5uYWJsZUNvbnRleHQ7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGZFbGVtZW50UmVuZGVyZXI7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGZRdWFsaWZpZXJSZW5kZXJlcjsKLQlwcml2YXRlIE9iamVjdFtdIGZFbGVtZW50czsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUNhc2UgPSB0cnVlOwotCXByaXZhdGUgU3RyaW5nIGZVcHBlckxpc3RMYWJlbDsKLQlwcml2YXRlIFN0cmluZyBmTG93ZXJMaXN0TGFiZWw7Ci0JLy8gU1dUIHdpZGdldHMKLQlwcml2YXRlIFRhYmxlIGZVcHBlckxpc3Q7Ci0JcHJpdmF0ZSBUYWJsZSBmTG93ZXJMaXN0OwotCXByb3RlY3RlZCBUZXh0IGZUZXh0OwotCXByaXZhdGUgSVR5cGVbXSBmSVQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUmVuZGVyZWRTdHJpbmdzOwotCXByaXZhdGUgaW50W10gZkVsZW1lbnRNYXA7Ci0JcHJpdmF0ZSBJbnRlZ2VyW10gZlF1YWxpZmllck1hcDsKLQotCXByaXZhdGUgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBmTG9jYWxWYWxpZGF0b3IgPSBudWxsOwotCS8qKgotCSAqIE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHBhcmVudCBTaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKiBAcGFyZW50IGV4dGVuc2lvbnMgU3RyaW5nW10KLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZSBib29sZWFuCi0JICovCi0JcHVibGljIE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gZXh0ZW5zaW9ucywgYm9vbGVhbiBhbGxvd011bHRpcGxlLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIGV4dGVuc2lvbnMsIGFsbG93TXVsdGlwbGUpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCi0JCWlmICh0aXRsZSA9PSBudWxsKQotCQkJc2V0VGl0bGUoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbGVfU2VsZWN0aW9uX1VJXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfYV9maWxlX19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlzZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlhZGRGaWx0ZXIobmV3IFR5cGVkRmlsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JCWZMb2NhbFZhbGlkYXRvciA9IG5ldyBTaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IobmV3IENsYXNzW10geyBJRmlsZS5jbGFzcyB9LCBhbGxvd011bHRpcGxlKTsKLQkJc2V0VmFsaWRhdG9yKGZMb2NhbFZhbGlkYXRvcik7Ci0JCQotCQkvL1N0YXR1c0luZm8gY3VyclN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKCk7Ci0JCS8vY3VyclN0YXR1cy5zZXRPSygpOwotCQlTdGF0dXMgY3VyclN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLk9LLCBTZXJ2bGV0VUlQbHVnaW4uUExVR0lOX0lELCBTdGF0dXMuT0ssICIiLCBudWxsKTsKLQkJCi0JCXVwZGF0ZVN0YXR1cyhjdXJyU3RhdHVzKTsKLQkJZkVsZW1lbnRSZW5kZXJlciA9IG5ldyBUeXBlUmVuZGVyZXIoKTsKLQkJZlF1YWxpZmllclJlbmRlcmVyID0gbmV3IFBhY2thZ2VSZW5kZXJlcigpOwotCQlmUnVubmFibGVDb250ZXh0ID0gU2VydmxldFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJdHJ5IHsKLQkJCUlKYXZhRWxlbWVudCBqZWxlbSA9IG51bGw7Ci0JCQlJUHJvamVjdCBwcm9qID0gbnVsbDsKLQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgcHJvamVjdC5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHByb2plY3QuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXByb2ogPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChwcm9qICE9IG51bGwpIHsKLQkJCQkJCWplbGVtID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSUphdmFQcm9qZWN0IGpwID0gamVsZW0uZ2V0SmF2YVByb2plY3QoKTsKLQotCQkJSVR5cGUgc2VydmxldFR5cGUgPSBqcC5maW5kVHlwZShRVUFMSUZJRURfU0VSVkxFVCk7Ci0JCQkvLyBuZXh0IDMgbGluZXMgZml4IGRlZmVjdCAxNzc2ODYKLQkJCWlmIChzZXJ2bGV0VHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlBcnJheUxpc3Qgc2VydmxldENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJVHlwZUhpZXJhcmNoeSB0SCA9IHNlcnZsZXRUeXBlLm5ld1R5cGVIaWVyYXJjaHkoanAsIG51bGwpOwotCQkJSVR5cGVbXSB0eXBlcyA9IHRILmdldEFsbFN1YnR5cGVzKHNlcnZsZXRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZXNbaV0uaXNDbGFzcygpICYmICFzZXJ2bGV0Q2xhc3Nlcy5jb250YWlucyh0eXBlc1tpXSkpCi0JCQkJCXNlcnZsZXRDbGFzc2VzLmFkZCh0eXBlc1tpXSk7Ci0JCQl9Ci0JCQlmSVQgPSAoSVR5cGVbXSkgc2VydmxldENsYXNzZXMudG9BcnJheShuZXcgSVR5cGVbc2VydmxldENsYXNzZXMuc2l6ZSgpXSk7Ci0JCQlzZXJ2bGV0Q2xhc3NlcyA9IG51bGw7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotCQlpZiAoZlNlbGVjdGlvbiA9PSBKU1ApIHsKLQkJCXN1cGVyLmNvbXB1dGVSZXN1bHQoKTsKLQkJfSBlbHNlIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGdldFdpZGdldFNlbGVjdGlvbigpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9DbGFzc19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQ2xhc3MiCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvdWxkX25vdF91bmlxdWVseV9tYXBfdGhlX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4iCi0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCQkJc2V0UmVzdWx0KG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJCXJlc3VsdC5hZGQodHlwZSk7Ci0JCQkJCXNldFJlc3VsdChyZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlmVGV4dC5zZXRGb2N1cygpOwotCQlyZW1hdGNoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlhbG9nJ3MgCi0JICogYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBsYXlzIG91dCBhIGJ1dHRvbiBiYXIgYW5kIGNhbGxzIHRoZSA8Y29kZT5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyPC9jb2RlPgotCSAqIGZyYW1ld29yayBtZXRob2QgdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgYnV0dG9uIGJhcgotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUyID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkvLyBjcmVhdGUgYSBsYXlvdXQgd2l0aCBzcGFjaW5nIGFuZCBtYXJnaW5zIGFwcHJvcHJpYXRlIGZvciB0aGUgZm9udCBzaXplLgotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDA7IC8vIHRoaXMgaXMgaW5jcmVtZW50ZWQgYnkgY3JlYXRlQnV0dG9uCi0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0KLQkJY29tcG9zaXRlMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJY29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbXBvc2l0ZTIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoY29tcG9zaXRlMik7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCWZDaGlsZCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNoaWxkLCAiY29tLmlibS5ldG9vbHMud2ViYXBwbGljYXRpb25lZGl0LndlYngyMDEwIik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCQlmQ2hpbGQuc2V0TGF5b3V0KGdsKTsKLQotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZkNoaWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSB0aGUgV2ViIFR5cGUgcmFkaW8gYnV0dG9ucyBhbmQgdGV4dCBmaWVsZHMuCi0JCWZTZXJ2bGV0QnV0dG9uID0gbmV3IEJ1dHRvbihmQ2hpbGQsIFNXVC5SQURJTyk7Ci0JCWZTZXJ2bGV0QnV0dG9uLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlcnZsZXRfVUlfIikpOyAvLyROT04tTkxTLTEkID0gU2VydmxldAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlmU2VydmxldEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlNlcnZsZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkpTUEJ1dHRvbiA9IG5ldyBCdXR0b24oZkNoaWxkLCBTV1QuUkFESU8pOwotCQlmSlNQQnV0dG9uLnNldFRleHQoIkpTUCIpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZKU1BCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZKU1BCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJaWYgKGZTZWxlY3Rpb24gPT0gSlNQKQotCQkJZkpTUEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UgewotCQkJZlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZlNlbGVjdGlvbiA9IFNFUlZMRVQ7Ci0JCX0KLQotCQlmUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soZkNoaWxkLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlBhZ2VCb29rLnNldExheW91dERhdGEoZ2QpOwotCQlmSnNwQ29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoZlBhZ2VCb29rKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmUGFnZUJvb2ssIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJTGFiZWwgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaG9vc2VfYV9zZXJ2bGV0X18xIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZlRleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNYXRjaGluZ19zZXJ2bGV0c19fMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZVcHBlckxpc3QgPSBjcmVhdGVVcHBlckxpc3QoY29tcG9zaXRlKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlF1YWxpZmllcl9fMyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZMb3dlckxpc3QgPSBjcmVhdGVMb3dlckxpc3QoY29tcG9zaXRlKTsKLQotCQlmU2VydmxldENvbnRyb2wgPSBjb21wb3NpdGU7Ci0KLQkJaWYgKGZTZWxlY3Rpb24gPT0gSlNQKQotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZKc3BDb250cm9sKTsKLQkJZWxzZQotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlTG93ZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZMb3dlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZkxvd2VyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVMb3dlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmUXVhbGlmaWVyUmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGV4dCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJcmVtYXRjaChmVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGwpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVVcHBlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlVwcGVyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmVXBwZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZFbGVtZW50UmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTUpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCBpcyAncHJlc3NlZCcgb24gZG91YmxlQ2xpY2sgaW4gdGhlIGxpc3RzLgotCSAqIEJ5IGRlZmF1bHQgaXQgaXMgdGhlIE9LIGJ1dHRvbi4KLQkgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEJ1dHRvbklEKCkgewotCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PS19JRDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IGkgPSBmTG93ZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChmUXVhbGlmaWVyTWFwICE9IG51bGwpIHsKLQkJCWlmIChmUXVhbGlmaWVyTWFwLmxlbmd0aCA9PSAxKQotCQkJCWkgPSAwOwotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IAotCQkJSW50ZWdlciBpbmRleCA9IGZRdWFsaWZpZXJNYXBbaV07Ci0JCQlyZXR1cm4gZkVsZW1lbnRzW2luZGV4LmludFZhbHVlKCldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlpbnQgc2VsZWN0aW9uID0gZlVwcGVyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uID49IDApIHsKLQkJCWludCBpID0gZkVsZW1lbnRNYXBbc2VsZWN0aW9uXTsKLQkJCWludCBrID0gaTsKLQkJCWludCBsZW5ndGggPSBmUmVuZGVyZWRTdHJpbmdzLmxlbmd0aDsKLQkJCXdoaWxlIChrIDwgbGVuZ3RoICYmIGZSZW5kZXJlZFN0cmluZ3Nba10uZXF1YWxzKGZSZW5kZXJlZFN0cmluZ3NbaV0pKSB7Ci0JCQkJaysrOwotCQkJfQotCQkJdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGksIGspOwotCQl9IGVsc2UKLQkJCXVwZGF0ZUxvd2VyTGlzdFdpZGdldCgwLCAwKTsKLQl9Ci0JCi0JcHVibGljIGludCBvcGVuKCkgewotCi0JCWlmIChmSVQgPT0gbnVsbCB8fCBmSVQubGVuZ3RoID09IDApIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFbXB0eV9MaXN0XzEiKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9JTkZPX05vX3NlcnZsZXRzX2V4aXN0X3RvX2FkZC5fMSIpKTsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENBTkNFTDsKLQkJfQotCi0JCXNldEVsZW1lbnRzKGZJVCk7Ci0JCXNldEluaXRpYWxTZWxlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgbGlzdCB0byByZWZsZWN0IGEgbmV3IG1hdGNoIHN0cmluZy4KLQkgKiBAcGFyYW0gbWF0Y2hTdHJpbmcgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbWF0Y2goU3RyaW5nIG1hdGNoU3RyaW5nKSB7Ci0JCWludCBrID0gMDsKLQkJU3RyaW5nIHRleHQgPSBmVGV4dC5nZXRUZXh0KCk7Ci0JCVN0cmluZ01hdGNoZXIgbWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHRleHQgKyAiKiIsIGZJZ25vcmVDYXNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhc3RTdHJpbmcgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gZkVsZW1lbnRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgZlJlbmRlcmVkU3RyaW5nc1tpXS5lcXVhbHMobGFzdFN0cmluZykpCi0JCQkJaSsrOwotCQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCQlsYXN0U3RyaW5nID0gZlJlbmRlcmVkU3RyaW5nc1tpXTsKLQkJCQlpZiAobWF0Y2hlci5tYXRjaChmUmVuZGVyZWRTdHJpbmdzW2ldKSkgewotCQkJCQlmRWxlbWVudE1hcFtrXSA9IGk7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkVsZW1lbnRNYXBba10gPSAtMTsKLQotCQl1cGRhdGVVcHBlckxpc3RXaWRnZXQoZkVsZW1lbnRNYXAsIGspOwotCX0KLQkKLQkvKioKLQkJICogCi0JCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JCSAqIEBwYXJhbSBwIG9yZy5lY2xpcHNlLmpmYWNlLmVsZW1lbnRzLklJbmRleGVkUHJvcGVydHkKLQkJICovCi0JcHJpdmF0ZSBTdHJpbmdbXSByZW5kZXJTdHJpbmdzKE9iamVjdFtdIHApIHsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbcC5sZW5ndGhdOwotCQlpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3RyaW5nc1tpXSA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0VGV4dChwW2ldKTsKLQkJfQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChzdHJpbmdzLCBwKTsKLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCWZFbGVtZW50TWFwID0gbmV3IGludFtmRWxlbWVudHMubGVuZ3RoICsgMV07Ci0JCWZSZW5kZXJlZFN0cmluZ3MgPSByZW5kZXJTdHJpbmdzKGZFbGVtZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKGludCBuZXdTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGludCBmcm9tLCBpbnQgdG8pIHsKLQkJZkxvd2VyTGlzdC5yZW1vdmVBbGwoKTsKLQkJZlF1YWxpZmllck1hcCA9IG5ldyBJbnRlZ2VyW3RvIC0gZnJvbV07Ci0JCVN0cmluZ1tdIHF1YWxpZmllcnMgPSBuZXcgU3RyaW5nW3RvIC0gZnJvbV07Ci0JCWZvciAoaW50IGkgPSBmcm9tOyBpIDwgdG87IGkrKykgewotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlxdWFsaWZpZXJzW2kgLSBmcm9tXSA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRUZXh0KGZFbGVtZW50c1tpXSk7Ci0JCQlmUXVhbGlmaWVyTWFwW2kgLSBmcm9tXSA9IG5ldyBJbnRlZ2VyKGkpOwotCQl9Ci0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQocXVhbGlmaWVycywgZlF1YWxpZmllck1hcCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0byAtIGZyb207IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbShmTG93ZXJMaXN0LCBpKTsKLQkJCXRpLnNldFRleHQocXVhbGlmaWVyc1tpXSk7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCUltYWdlIGltZyA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRJbWFnZShmRWxlbWVudHNbZnJvbSArIGldKTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQl0aS5zZXRJbWFnZShpbWcpOwotCQl9Ci0KLQkJaWYgKGZMb3dlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJZkxvd2VyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU9rU3RhdGUoKSB7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVwcGVyTGlzdFdpZGdldChpbnRbXSBpbmRpY2VzLCBpbnQgc2l6ZSkgewotCQlmVXBwZXJMaXN0LnNldFJlZHJhdyhmYWxzZSk7Ci0JCWludCBpdGVtQ291bnQgPSBmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpOwotCQlpZiAoc2l6ZSA8IGl0ZW1Db3VudCkKLQkJCWZVcHBlckxpc3QucmVtb3ZlKDAsIGl0ZW1Db3VudCAtIHNpemUgLSAxKTsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmVXBwZXJMaXN0LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBudWxsOwotCQkJaWYgKGkgPCBpdGVtQ291bnQpCi0JCQkJdGkgPSBpdGVtc1tpXTsKLQkJCWVsc2UKLQkJCQl0aSA9IG5ldyBUYWJsZUl0ZW0oZlVwcGVyTGlzdCwgaSk7Ci0JCQl0aS5zZXRUZXh0KGZSZW5kZXJlZFN0cmluZ3NbaW5kaWNlc1tpXV0pOwotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlJbWFnZSBpbWcgPSBmRWxlbWVudFJlbmRlcmVyLmdldEltYWdlKGZFbGVtZW50c1tpbmRpY2VzW2ldXSk7Ci0JCQlpZiAoaW1nICE9IG51bGwpCi0JCQkJdGkuc2V0SW1hZ2UoaW1nKTsKLQkJfQotCQlpZiAoZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlmVXBwZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJZlVwcGVyTGlzdC5zZXRSZWRyYXcodHJ1ZSk7Ci0JCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMKLQkgKiBpbiBhIExpc3Qgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIGFuIGl0ZW0gb3IgdHlwZXMKLQkgKiByZXR1cm4gaW4gYSBUZXh0LgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgc2VsZWN0aW9uIG9jY3VycyBpbgotCSAqIGEgTGlzdCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBvciBpdGVtcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBmSlNQQnV0dG9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gSlNQOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZKc3BDb250cm9sKTsKLQkJCXVwZGF0ZU9LU3RhdHVzKCk7Ci0JCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZlNlcnZsZXRCdXR0b24pIHsKLQkJCWZTZWxlY3Rpb24gPSBTRVJWTEVUOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCX0gZWxzZQotCQkJZlNlbGVjdGlvbiA9IC0xOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nI3VwZGF0ZU9LU3RhdHVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS1N0YXR1cygpIHsKLQkJc3VwZXIudXBkYXRlT0tTdGF0dXMoKTsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGZMb2NhbFZhbGlkYXRvci52YWxpZGF0ZShnZXRSZXN1bHQoKSkuaXNPSygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0MjA4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVGQVVMVF9QQUNLQUdFOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHdvQXJyYXlRdWlja1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVkRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg3LzMwLzIwMDEgMTE6MTY6MzYgQU0pCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzCi0JCUZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyB7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWNrYWdlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBQQUNLQUdFX0lDT04gPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLQUdFKTsgCi0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJVHlwZSB0eXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJU3RyaW5nIHAgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZiAoIiIuZXF1YWxzKHApKSAvLyROT04tTkxTLTEkCi0JCQkJcCA9IERFRkFVTFRfUEFDS0FHRTsKLQkJCXJldHVybiAocCArICIgLSAiICsgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBQQUNLQUdFX0lDT047Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBDTEFTU19JQ09OID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfQ0xBU1MpOyAKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUlUeXBlIGUgPSAoKElUeXBlKSBlbGVtZW50KTsKLQkJCXJldHVybiBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBDTEFTU19JQ09OOwotCQl9Ci0KLQl9Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIGZQYWdlQm9vayA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZlNlcnZsZXRDb250cm9sID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZDaGlsZCA9IG51bGw7Ci0JLy8gY29uc3RydWN0aW9uIHBhcmFtZXRlcnMKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBmUnVubmFibGVDb250ZXh0OwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBmRWxlbWVudFJlbmRlcmVyOwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBmUXVhbGlmaWVyUmVuZGVyZXI7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVDYXNlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBmVXBwZXJMaXN0TGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxvd2VyTGlzdExhYmVsOwotCS8vIFNXVCB3aWRnZXRzCi0JcHJpdmF0ZSBUYWJsZSBmVXBwZXJMaXN0OwotCXByaXZhdGUgVGFibGUgZkxvd2VyTGlzdDsKLQlwcm90ZWN0ZWQgVGV4dCBmVGV4dDsKLQlwcml2YXRlIElUeXBlW10gZklUOwotCXByaXZhdGUgU3RyaW5nW10gZlJlbmRlcmVkU3RyaW5nczsKLQlwcml2YXRlIGludFtdIGZFbGVtZW50TWFwOwotCXByaXZhdGUgSW50ZWdlcltdIGZRdWFsaWZpZXJNYXA7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgZkxvY2FsVmFsaWRhdG9yID0gbnVsbDsKLQkvKioKLQkgKiBUaGlzIGlzIGEgc2VsZWN0aW9uIGRpYWxvZyBmb3IgYXZhaWxhYmxlIHNlcnZsZXQuCi0JICogQHBhcmFtIHBhcmVudCBTaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKiBAcGFyZW50IGV4dGVuc2lvbnMgU3RyaW5nW10KLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZSBib29sZWFuCi0JICovCi0JcHVibGljIE11bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gZXh0ZW5zaW9ucywgYm9vbGVhbiBhbGxvd011bHRpcGxlLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIGV4dGVuc2lvbnMsIGFsbG93TXVsdGlwbGUpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCi0JCWlmICh0aXRsZSA9PSBudWxsKQotCQkJc2V0VGl0bGUoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbGVfU2VsZWN0aW9uX1VJXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfYV9maWxlX19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlzZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlhZGRGaWx0ZXIobmV3IFR5cGVkRmlsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JCWZMb2NhbFZhbGlkYXRvciA9IG5ldyBTaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IobmV3IENsYXNzW10geyBJRmlsZS5jbGFzcyB9LCBhbGxvd011bHRpcGxlKTsKLQkJc2V0VmFsaWRhdG9yKGZMb2NhbFZhbGlkYXRvcik7Ci0JCQotCQkvL1N0YXR1c0luZm8gY3VyclN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKCk7Ci0JCS8vY3VyclN0YXR1cy5zZXRPSygpOwotCQlTdGF0dXMgY3VyclN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLk9LLCBTZXJ2bGV0VUlQbHVnaW4uUExVR0lOX0lELCBTdGF0dXMuT0ssICIiLCBudWxsKTsKLQkJCi0JCXVwZGF0ZVN0YXR1cyhjdXJyU3RhdHVzKTsKLQkJZkVsZW1lbnRSZW5kZXJlciA9IG5ldyBUeXBlUmVuZGVyZXIoKTsKLQkJZlF1YWxpZmllclJlbmRlcmVyID0gbmV3IFBhY2thZ2VSZW5kZXJlcigpOwotCQlmUnVubmFibGVDb250ZXh0ID0gU2VydmxldFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJdHJ5IHsKLQkJCUlKYXZhRWxlbWVudCBqZWxlbSA9IG51bGw7Ci0JCQlJUHJvamVjdCBwcm9qID0gbnVsbDsKLQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgcHJvamVjdC5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHByb2plY3QuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXByb2ogPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChwcm9qICE9IG51bGwpIHsKLQkJCQkJCWplbGVtID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSUphdmFQcm9qZWN0IGpwID0gamVsZW0uZ2V0SmF2YVByb2plY3QoKTsKLQkJCSBJVHlwZSBmaWx0ZXJUeXBlID0ganAuZmluZFR5cGUoUVVBTElGSUVEX0ZJTFRFUik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5leHQgMyBsaW5lcyBmaXggZGVmZWN0IDE3NzY4NgotCQkJaWYgKGZpbHRlclR5cGUgPT0gbnVsbCkgewotCQkJICAgIHJldHVybjsKLQkJCX0KLQkJCUFycmF5TGlzdCBmaWx0ZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVR5cGVIaWVyYXJjaHkgdEggPSBmaWx0ZXJUeXBlLm5ld1R5cGVIaWVyYXJjaHkoanAsIG51bGwpOwotCQkJSVR5cGVbXSB0eXBlcyA9IHRILmdldEFsbFN1YnR5cGVzKGZpbHRlclR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJICAgIGlmICh0eXBlc1tpXS5pc0NsYXNzKCkgJiYgIWZpbHRlckNsYXNzZXMuY29udGFpbnModHlwZXNbaV0pKQotCQkJICAgICAgICBmaWx0ZXJDbGFzc2VzLmFkZCh0eXBlc1tpXSk7Ci0JCQl9Ci0JCQlmSVQgPSAoSVR5cGVbXSkgZmlsdGVyQ2xhc3Nlcy50b0FycmF5KG5ldyBJVHlwZVtmaWx0ZXJDbGFzc2VzLnNpemUoKV0pOwotCQkJZmlsdGVyQ2xhc3NlcyA9IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwcml2YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLQkgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgZ2V0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JICAgIGlmICh0eXBlICE9IG51bGwpIHsKLQkgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLQkgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X0NsYXNzX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIlNlbGVjdCBDbGFzcyIKLQkgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb3VsZF9ub3RfdW5pcXVlbHlfbWFwX3RoZV9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MuIgotCSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkgICAgICAgICAgICBzZXRSZXN1bHQobnVsbCk7Ci0JICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JICAgICAgICAgICAgcmVzdWx0LmFkZCh0eXBlKTsKLQkgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0KTsKLQkgICAgICAgIH0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlmVGV4dC5zZXRGb2N1cygpOwotCQlyZW1hdGNoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlhbG9nJ3MgCi0JICogYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBsYXlzIG91dCBhIGJ1dHRvbiBiYXIgYW5kIGNhbGxzIHRoZSA8Y29kZT5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyPC9jb2RlPgotCSAqIGZyYW1ld29yayBtZXRob2QgdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgYnV0dG9uIGJhcgotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlMiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJLy8gY3JlYXRlIGEgbGF5b3V0IHdpdGggc3BhY2luZyBhbmQgbWFyZ2lucyBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbnQgc2l6ZS4KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAwOyAvLyB0aGlzIGlzIGluY3JlbWVudGVkIGJ5IGNyZWF0ZUJ1dHRvbgotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCi0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb21wb3NpdGUyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJLy8gQWRkIHRoZSBidXR0b25zIHRvIHRoZSBidXR0b24gYmFyLgotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKGNvbXBvc2l0ZTIpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlmQ2hpbGQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDaGlsZCwgImNvbS5pYm0uZXRvb2xzLndlYmFwcGxpY2F0aW9uZWRpdC53ZWJ4MjAxMCIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zID0gMjsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gNTsKLQkJZkNoaWxkLnNldExheW91dChnbCk7Ci0KLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlmQ2hpbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZlBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGZDaGlsZCwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShmUGFnZUJvb2spOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZQYWdlQm9vaywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlMYWJlbCBtZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNob29zZV9hX2ZpbHRlcl9fMSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUpOwotCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTWF0Y2hpbmdfZmlsdGVyc19fMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZVcHBlckxpc3QgPSBjcmVhdGVVcHBlckxpc3QoY29tcG9zaXRlKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlF1YWxpZmllcl9fMyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZMb3dlckxpc3QgPSBjcmVhdGVMb3dlckxpc3QoY29tcG9zaXRlKTsKLQotCQlmU2VydmxldENvbnRyb2wgPSBjb21wb3NpdGU7Ci0KLQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlTG93ZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZMb3dlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZkxvd2VyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVMb3dlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmUXVhbGlmaWVyUmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGV4dCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJcmVtYXRjaChmVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGwpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVVcHBlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlVwcGVyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmVXBwZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZFbGVtZW50UmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXNwZWMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTUpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCBpcyAncHJlc3NlZCcgb24gZG91YmxlQ2xpY2sgaW4gdGhlIGxpc3RzLgotCSAqIEJ5IGRlZmF1bHQgaXQgaXMgdGhlIE9LIGJ1dHRvbi4KLQkgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEJ1dHRvbklEKCkgewotCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PS19JRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkxvd2VyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoZlF1YWxpZmllck1hcCAhPSBudWxsKSB7Ci0JCQlpZiAoZlF1YWxpZmllck1hcC5sZW5ndGggPT0gMSkKLQkJCQlpID0gMDsKLQkJCWlmIChpIDwgMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSAKLQkJCUludGVnZXIgaW5kZXggPSBmUXVhbGlmaWVyTWFwW2ldOwotCQkJcmV0dXJuIGZFbGVtZW50c1tpbmRleC5pbnRWYWx1ZSgpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaW50IHNlbGVjdGlvbiA9IGZVcHBlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbiA+PSAwKSB7Ci0JCQlpbnQgaSA9IGZFbGVtZW50TWFwW3NlbGVjdGlvbl07Ci0JCQlpbnQgayA9IGk7Ci0JCQlpbnQgbGVuZ3RoID0gZlJlbmRlcmVkU3RyaW5ncy5sZW5ndGg7Ci0JCQl3aGlsZSAoayA8IGxlbmd0aCAmJiBmUmVuZGVyZWRTdHJpbmdzW2tdLmVxdWFscyhmUmVuZGVyZWRTdHJpbmdzW2ldKSkgewotCQkJCWsrKzsKLQkJCX0KLQkJCXVwZGF0ZUxvd2VyTGlzdFdpZGdldChpLCBrKTsKLQkJfSBlbHNlCi0JCQl1cGRhdGVMb3dlckxpc3RXaWRnZXQoMCwgMCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJaWYgKGZJVCA9PSBudWxsIHx8IGZJVC5sZW5ndGggPT0gMCkgewotCQkgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgCi0JCSAgICAgICAgICAgIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFbXB0eV9MaXN0XzEiKSwgCi0JCSAgICAgICAgICAgIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfSU5GT19Ob19maWx0ZXJzX2V4aXN0X3RvX2FkZC5fMSIpKTsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENBTkNFTDsKLQkJfQotCi0JCXNldEVsZW1lbnRzKGZJVCk7Ci0JCXNldEluaXRpYWxTZWxlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgbGlzdCB0byByZWZsZWN0IGEgbmV3IG1hdGNoIHN0cmluZy4KLQkgKiBAcGFyYW0gbWF0Y2hTdHJpbmcgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbWF0Y2goU3RyaW5nIG1hdGNoU3RyaW5nKSB7Ci0JCWludCBrID0gMDsKLQkJU3RyaW5nIHRleHQgPSBmVGV4dC5nZXRUZXh0KCk7Ci0JCVN0cmluZ01hdGNoZXIgbWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHRleHQgKyAiKiIsIGZJZ25vcmVDYXNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhc3RTdHJpbmcgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gZkVsZW1lbnRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgZlJlbmRlcmVkU3RyaW5nc1tpXS5lcXVhbHMobGFzdFN0cmluZykpCi0JCQkJaSsrOwotCQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCQlsYXN0U3RyaW5nID0gZlJlbmRlcmVkU3RyaW5nc1tpXTsKLQkJCQlpZiAobWF0Y2hlci5tYXRjaChmUmVuZGVyZWRTdHJpbmdzW2ldKSkgewotCQkJCQlmRWxlbWVudE1hcFtrXSA9IGk7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkVsZW1lbnRNYXBba10gPSAtMTsKLQotCQl1cGRhdGVVcHBlckxpc3RXaWRnZXQoZkVsZW1lbnRNYXAsIGspOwotCX0KLQkKLQkvKioKLQkJICogCi0JCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JCSAqIEBwYXJhbSBwIG9yZy5lY2xpcHNlLmpmYWNlLmVsZW1lbnRzLklJbmRleGVkUHJvcGVydHkKLQkJICovCi0JcHJpdmF0ZSBTdHJpbmdbXSByZW5kZXJTdHJpbmdzKE9iamVjdFtdIHApIHsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbcC5sZW5ndGhdOwotCQlpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3RyaW5nc1tpXSA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0VGV4dChwW2ldKTsKLQkJfQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChzdHJpbmdzLCBwKTsKLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCWZFbGVtZW50TWFwID0gbmV3IGludFtmRWxlbWVudHMubGVuZ3RoICsgMV07Ci0JCWZSZW5kZXJlZFN0cmluZ3MgPSByZW5kZXJTdHJpbmdzKGZFbGVtZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvd2VyTGlzdFdpZGdldChpbnQgZnJvbSwgaW50IHRvKSB7Ci0JCWZMb3dlckxpc3QucmVtb3ZlQWxsKCk7Ci0JCWZRdWFsaWZpZXJNYXAgPSBuZXcgSW50ZWdlclt0byAtIGZyb21dOwotCQlTdHJpbmdbXSBxdWFsaWZpZXJzID0gbmV3IFN0cmluZ1t0byAtIGZyb21dOwotCQlmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJcXVhbGlmaWVyc1tpIC0gZnJvbV0gPSBmUXVhbGlmaWVyUmVuZGVyZXIuZ2V0VGV4dChmRWxlbWVudHNbaV0pOwotCQkJZlF1YWxpZmllck1hcFtpIC0gZnJvbV0gPSBuZXcgSW50ZWdlcihpKTsKLQkJfQotCi0JCW5ldyBUd29BcnJheVF1aWNrU29ydGVyKGZJZ25vcmVDYXNlKS5zb3J0KHF1YWxpZmllcnMsIGZRdWFsaWZpZXJNYXApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG8gLSBmcm9tOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0oZkxvd2VyTGlzdCwgaSk7Ci0JCQl0aS5zZXRUZXh0KHF1YWxpZmllcnNbaV0pOwotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlJbWFnZSBpbWcgPSBmUXVhbGlmaWVyUmVuZGVyZXIuZ2V0SW1hZ2UoZkVsZW1lbnRzW2Zyb20gKyBpXSk7Ci0JCQlpZiAoaW1nICE9IG51bGwpCi0JCQkJdGkuc2V0SW1hZ2UoaW1nKTsKLQkJfQotCi0JCWlmIChmTG93ZXJMaXN0LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCWZMb3dlckxpc3Quc2V0U2VsZWN0aW9uKDApOwotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVPa1N0YXRlKCkgewotCQlCdXR0b24gb2tCdXR0b24gPSBnZXRPa0J1dHRvbigpOwotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVVcHBlckxpc3RXaWRnZXQoaW50W10gaW5kaWNlcywgaW50IHNpemUpIHsKLQkJZlVwcGVyTGlzdC5zZXRSZWRyYXcoZmFsc2UpOwotCQlpbnQgaXRlbUNvdW50ID0gZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKTsKLQkJaWYgKHNpemUgPCBpdGVtQ291bnQpCi0JCQlmVXBwZXJMaXN0LnJlbW92ZSgwLCBpdGVtQ291bnQgLSBzaXplIC0gMSk7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gZlVwcGVyTGlzdC5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbnVsbDsKLQkJCWlmIChpIDwgaXRlbUNvdW50KQotCQkJCXRpID0gaXRlbXNbaV07Ci0JCQllbHNlCi0JCQkJdGkgPSBuZXcgVGFibGVJdGVtKGZVcHBlckxpc3QsIGkpOwotCQkJdGkuc2V0VGV4dChmUmVuZGVyZWRTdHJpbmdzW2luZGljZXNbaV1dKTsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJSW1hZ2UgaW1nID0gZkVsZW1lbnRSZW5kZXJlci5nZXRJbWFnZShmRWxlbWVudHNbaW5kaWNlc1tpXV0pOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXRpLnNldEltYWdlKGltZyk7Ci0JCX0KLQkJaWYgKGZVcHBlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJZlVwcGVyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCWZVcHBlckxpc3Quc2V0UmVkcmF3KHRydWUpOwotCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VudCB3aGVuIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzCi0JICogaW4gYSBMaXN0IHdoZW4gdGhlIHVzZXIgZG91YmxlLWNsaWNrcyBhbiBpdGVtIG9yIHR5cGVzCi0JICogcmV0dXJuIGluIGEgVGV4dC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyN1cGRhdGVPS1N0YXR1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tTdGF0dXMoKSB7Ci0JCXN1cGVyLnVwZGF0ZU9LU3RhdHVzKCk7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmTG9jYWxWYWxpZGF0b3IudmFsaWRhdGUoZ2V0UmVzdWx0KCkpLmlzT0soKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE1OWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNUUk9ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuRmlsdGVyU3VwZXJ0eXBlc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzCi0JCU5ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGluaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXN0cm95QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9GaWx0ZXJCdXR0b247Ci0JCi0JcHVibGljIE5ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb21wb3NpdGUgd2l0aCBhbGwgdGhlIHN0dWJzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3R1YnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTdHVic0NvbXBvc2l0ZShwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShtZXRob2RTdHVicywgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaW5pdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJaW5pdEJ1dHRvbi5zZXRUZXh0KCImaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goaW5pdEJ1dHRvbiwgSU5JVCwgbnVsbCk7Ci0KLQkJZGVzdHJveUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZGVzdHJveUJ1dHRvbi5zZXRUZXh0KCJkZXN0cm8meSIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZGVzdHJveUJ1dHRvbiwgREVTVFJPWSwgbnVsbCk7Ci0KLQkJZG9GaWx0ZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvRmlsdGVyQnV0dG9uLnNldFRleHQoImRvJkZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9GaWx0ZXJCdXR0b24sIERPX0ZJTFRFUiwgbnVsbCk7Ci0JCQotCQlpbnRlcmZhY2VWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBkaXNhYmxlZAotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGZpbHRlciBleHRlbmRzIGEgY2xhc3Mgd2hpY2gKLQkJLy8gaW1wbGVtZW50cyBqYXZheC5zZXJ2bGV0LkZpbHRlciwgdGhlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBlbmFibGVkCi0JCWlmIChGaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yLmlzRmlsdGVyU3VwZXJjbGFzcyhtb2RlbCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJcmV0dXJuOwotCQl9IAotCQkKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIHRoZSBmaWx0ZXIgZG9lcyBub3QgZXh0ZW5kIGEgY2xhc3MKLQkJLy8gd2hpY2ggaW1wbGVtZW50cyBqYXZheC5zZXJ2bGV0LkZpbHRlciwgdGhlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcwotCQkvLyBkaXNhYmxlZCBvbmx5IGlmIHRoZSBGaWx0ZXIgaW50ZXJmYWNlIGlzIGluIHRoZSBzZWxlY3Rpb24KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChRVUFMSUZJRURfRklMVEVSLmVxdWFscyhpdGVyLm5leHQoKSkpCi0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpbiBhbGwgb3RoZXIgY2FzZXMgdGhlIHJlbW92ZSBidXR0b24gaXMgZW5hYmxlZAotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5MGU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQ0hPT1NFX0ZJTFRFUl9DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cEZpbHRlcnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld1dlYkNsYXNzV2l6YXJkUGFnZSB7Ci0JCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gRklMVEVSRVhURU5TSU9OUyA9IHsgImphdmEiIH07IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlwdWJsaWMgTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLCBTdHJpbmcgbW9kdWxlVHlwZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUsIG1vZHVsZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nQ2hlY2tib3hUZXh0KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX0NMQVNTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3QoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkoKFdlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQYXJlbnQoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfWVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpewotCQkJcmV0dXJuICgoV2ViQXBwUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQl9IGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcil7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgKChHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0SmF2YUVFT2JqZWN0KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChzZWxlY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDbGFzc0J1dHRvblNlbGVjdGVkKCkgewotICAgICAgICBnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICAgIE11bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nIG1zID0gbmV3IE11bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFLAotICAgICAgICAgICAgICAgIENIT09TRV9GSUxURVJfQ0xBU1MsIAotICAgICAgICAgICAgICAgIEZJTFRFUkVYVEVOU0lPTlMsIAotICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICBwcm9qZWN0KTsKLSAgICAgICAgSUNvbnRhaW5lciByb290ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0gICAgICAgIG1zLnNldElucHV0KHJvb3QpOwotICAgICAgICBtcy5vcGVuKCk7Ci0gICAgICAgIGlmIChtcy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIG1zLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4aXN0aW5nQ2xhc3NUZXh0LnNldFRleHQocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG51bGwpOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDRkMjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSAgewotCQotCXB1YmxpYyBOZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZmMzM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdXZWJDbGFzc1dpemFyZFBhZ2UgewotCi0JcHVibGljIE5ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLCBTdHJpbmcgbW9kdWxlVHlwZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUsIG1vZHVsZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nQ2hlY2tib3hUZXh0KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nUHJvcGVydHkoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfQ0xBU1M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJCi0JCWV4aXN0aW5nQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSgoV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQYXJlbnQoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfWVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpewotCQkJcmV0dXJuICgoV2ViQXBwUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcil7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgKChHcm91cExpc3RlbmVySXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldEphdmFFRU9iamVjdCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpIHsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzIyMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIGJ1ZyAxNDI1MDAKLSAqICAgICBLaXJpbCBNaXRvdiwgay5taXRvdkBzYXAuY29tCS0gYnVnIDIwNDE2MAotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcwotCQlOZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbml0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzdHJveUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGdldENvbmZpZ0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGdldEluZm9CdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZXJ2aWNlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9HZXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb1Bvc3RCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb1B1dEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvRGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9IZWFkQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9PcHRpb25zQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9UcmFjZUJ1dHRvbjsKLQkKLQlwdWJsaWMgTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCQotCQlib29sZWFuIGh0dHBTZXJ2bGV0ID0gU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuaXNIdHRwU2VydmxldFN1cGVyY2xhc3MobW9kZWwpOwotCQlkb0dldEJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9Qb3N0QnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb1B1dEJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9EZWxldGVCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvSGVhZEJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9PcHRpb25zQnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb1RyYWNlQnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB3aXRoIGFsbCB0aGUgc3R1YnMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdHVic0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVN0dWJzQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQlpbmhlcml0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIGVuYWJsZSA9IGluaGVyaXRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZW5hYmxlR2VuZXJpY1NlcnZsZXRCdXR0b25zKGVuYWJsZSk7Ci0JCQkJZW5hYmxlSHR0cFNlcnZsZXRCdXR0b25zKGVuYWJsZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgdm9pZCBlbmFibGVHZW5lcmljU2VydmxldEJ1dHRvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJCQlpZiAoU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQkJCWluaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQlkZXN0cm95QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQkJZ2V0Q29uZmlnQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQkJZ2V0SW5mb0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJCXNlcnZpY2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSB2b2lkIGVuYWJsZUh0dHBTZXJ2bGV0QnV0dG9ucyhib29sZWFuIGVuYWJsZSkgewotCQkJCWRvR2V0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb1Bvc3RCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvUHV0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb0RlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9IZWFkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb09wdGlvbnNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvVHJhY2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShtZXRob2RTdHVicywgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaW5pdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJaW5pdEJ1dHRvbi5zZXRUZXh0KCImaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goaW5pdEJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVCwgbnVsbCk7Ci0KLQkJZGVzdHJveUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZGVzdHJveUJ1dHRvbi5zZXRUZXh0KCJkZXN0cm8meSIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZGVzdHJveUJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWSwgbnVsbCk7Ci0KLQkJZ2V0Q29uZmlnQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlnZXRDb25maWdCdXR0b24uc2V0VGV4dCgiZ2V0U2VydmxldCZDb25maWciKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGdldENvbmZpZ0J1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VUX1NFUlZMRVRfQ09ORklHLCBudWxsKTsKLQotCQlnZXRJbmZvQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlnZXRJbmZvQnV0dG9uLnNldFRleHQoImdldFNlcnZsZXRJJm5mbyIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZ2V0SW5mb0J1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VUX1NFUlZMRVRfSU5GTywgbnVsbCk7Ci0JCQotCQlzZXJ2aWNlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlzZXJ2aWNlQnV0dG9uLnNldFRleHQoIiZzZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChzZXJ2aWNlQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TRVJWSUNFLCBudWxsKTsKLQkJCi0JCWRvR2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb0dldEJ1dHRvbi5zZXRUZXh0KCJkbyZHZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvR2V0QnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19HRVQsIG51bGwpOwotCi0JCWRvUG9zdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9Qb3N0QnV0dG9uLnNldFRleHQoImRvJlBvc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvUG9zdEJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fUE9TVCwgbnVsbCk7Ci0KLQkJZG9QdXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvUHV0QnV0dG9uLnNldFRleHQoImRvUCZ1dCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9QdXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BVVCwgbnVsbCk7Ci0KLQkJZG9EZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvRGVsZXRlQnV0dG9uLnNldFRleHQoImRvJkRlbGV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9EZWxldGVCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0RFTEVURSwgbnVsbCk7Ci0KLQkJZG9IZWFkQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb0hlYWRCdXR0b24uc2V0VGV4dCgiZG8mSGVhZCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9IZWFkQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19IRUFELCBudWxsKTsKLQotCQlkb09wdGlvbnNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvT3B0aW9uc0J1dHRvbi5zZXRUZXh0KCJkbyZPcHRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb09wdGlvbnNCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX09QVElPTlMsIG51bGwpOwotCi0JCWRvVHJhY2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvVHJhY2VCdXR0b24uc2V0VGV4dCgiZG8mVHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvVHJhY2VCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1RSQUNFLCBudWxsKTsKLQkJCi0JCWludGVyZmFjZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoY2FuUmVtb3ZlU2VsZWN0ZWRJbnRlcmZhY2VzKHNlbGVjdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgS2V5TGlzdGVuZXIgZ2V0SW50ZXJmYWNlS2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuREVMKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgaW50ZXJmYWNlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoY2FuUmVtb3ZlU2VsZWN0ZWRJbnRlcmZhY2VzKHNlbGVjdGlvbikpIHsKLQkJCQkJCWhhbmRsZUludGVyZmFjZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZVNlbGVjdGVkSW50ZXJmYWNlcyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlbiByZW1vdmUgaXMgbm90IHBvc3NpYmxlCi0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCB0aGUgc2VydmxldCBleHRlbmRzIEdlbmVyaWNTZXJ2bGV0LCB0aGVuCi0JCS8vIHJlbW92ZSBpcyBwb3NzaWJsZSAKLQkJaWYgKFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gCi0JCQotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgdGhlIHNlcnZsZXQgZG9lcyBub3QgZXh0ZW5kIEdlbmVyaWNTZXJ2bGV0LCAKLQkJLy8gdGhlbiByZW1vdmUgaXMgbm90IHBvc3NpYmxlIG9ubHkgaWYgdGhlIFNlcnZsZXQgaW50ZXJmYWNlIGlzIGluIHRoZSBzZWxlY3Rpb24KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChRVUFMSUZJRURfU0VSVkxFVC5lcXVhbHMoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gaW4gYWxsIG90aGVyIGNhc2VzIHJlbW92ZSBpcyBwb3NzaWJsZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWI3ZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JU19TRVJWTEVUX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5DSE9PU0VfU0VSVkxFVF9DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdXZWJDbGFzc1dpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSlNQRVhURU5TSU9OUyA9IHsgImpzcCIgfTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBOZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLCBTdHJpbmcgbW9kdWxlVHlwZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUsIG1vZHVsZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nQ2hlY2tib3hUZXh0KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19DTEFTUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3QoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgKChXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX0gZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcil7Ci0JCQlyZXR1cm4gKChXZWJBcHBQcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCX0gZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIpewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApICgoR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldEphdmFFRU9iamVjdCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpIHsKLQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBtcyA9IG5ldyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCU5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEUsCi0JCQkJQ0hPT1NFX1NFUlZMRVRfQ0xBU1MsIAotCQkJCUpTUEVYVEVOU0lPTlMsIAotCQkJCWZhbHNlLCAKLQkJCQlwcm9qZWN0KTsKLQkJSUNvbnRhaW5lciByb290ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JCW1zLnNldElucHV0KHJvb3QpOwotCQltcy5vcGVuKCk7Ci0JCWlmIChtcy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtcy5nZXRTZWxlY3RlZEl0ZW0oKSA9PSBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5KU1ApIHsKLQkJCQlPYmplY3Qgb2JqID0gbXMuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBvYmo7Ci0JCQkJCQlJUGF0aCBwRnVsbCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCUlQYXRoIHBCYXNlID0gcm9vdC5nZXRGdWxsUGF0aCgpOwotCQkJCQkJSVBhdGggcGF0aCA9IHBGdWxsLnJlbW92ZUZpcnN0U2VnbWVudHMocEJhc2Uuc2VnbWVudENvdW50KCkpOwotCQkJCQkJcXVhbGlmaWVkQ2xhc3NOYW1lID0gcGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotCQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoSVNfU0VSVkxFVF9UWVBFLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCWVsc2UgewotCQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIG1zLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlxdWFsaWZpZWRDbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJU19TRVJWTEVUX1RZUEUsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlleGlzdGluZ0NsYXNzVGV4dC5zZXRUZXh0KHF1YWxpZmllZENsYXNzTmFtZSk7Ci0JCX0KLQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkFydGlmYWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkFydGlmYWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTg0NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJBcnRpZmFjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuT1BFTl9JTl9FRElUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlFVQUxJRklFRF9DTEFTU19OQU1FOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dlYkFydGlmYWN0V2l6YXJkIGV4dGVuZHMgTmV3V2ViV2l6YXJkIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX09ORSA9ICJwYWdlT25lIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVFdPID0gInBhZ2VUd28iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9USFJFRSA9ICJwYWdlVGhyZWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmV3V2ViQXJ0aWZhY3RXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKGdldFRpdGxlKCkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihnZXRJbWFnZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5Gb3JrZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRpdGxlKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZSgpOwotCQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VGcm9tSjJFRVBsdWdpbihTdHJpbmcga2V5KSB7Ci0JCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShrZXkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuSmF2YUNsYXNzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KFFVQUxJRklFRF9DTEFTU19OQU1FKTsKLQkJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSjJFRUVkaXRvclV0aWxpdHkuZ2V0SmF2YVByb2plY3QocCk7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpLmdldFJlc291cmNlKCk7Ci0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coY2FudE9wZW4pOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuV2ViRmlsZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsKLQkJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocCk7Ci0JCQlJQ29udGFpbmVyIHdlYkNvbnRlbnQgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJCUlGaWxlIGZpbGUgPSB3ZWJDb250ZW50LmdldEZpbGUobmV3IFBhdGgoY2xhc3NOYW1lKSk7Ci0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coY2FudE9wZW4pOwotCQl9CQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KE9QRU5fSU5fRURJVE9SKSkgewotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTVjY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgIHsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG1ldGhvZFN0dWJzOwotCQotCXB1YmxpYyBOZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IElOVEVSRkFDRVMgfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0dWJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgc3R1YkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlzdHViTGFiZWwuc2V0VGV4dChKQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0dWJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1ldGhvZFN0dWJzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbWV0aG9kU3R1YnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJbWV0aG9kU3R1YnMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb25zdHJ1Y3RvckJ1dHRvbiA9IG5ldyBCdXR0b24obWV0aG9kU3R1YnMsIFNXVC5DSEVDSyk7Ci0JCWNvbnN0cnVjdG9yQnV0dG9uLnNldFRleHQoSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY29uc3RydWN0b3JCdXR0b24sIENPTlNUUlVDVE9SLCBudWxsKTsKLQkJCi0JCWluaGVyaXRCdXR0b24gPSBuZXcgQnV0dG9uKG1ldGhvZFN0dWJzLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0QnV0dG9uLnNldFRleHQoSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChpbmhlcml0QnV0dG9uLCBBQlNUUkFDVF9NRVRIT0RTLCBudWxsKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3ZWY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5CUk9XU0VfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5DTEFTU19OQU1FX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5Bbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuTmV3SmF2YUNsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dlYkNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld0phdmFDbGFzc1dpemFyZFBhZ2UgewotCi0JcHJvdGVjdGVkIEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwIGFubm90YXRpb25zR3JvdXA7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBleGlzdGluZ0NsYXNzQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBleGlzdGluZ0NsYXNzTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgZXhpc3RpbmdDbGFzc1RleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBleGlzdGluZ0J1dHRvbjsKLQkKLQlwdWJsaWMgTmV3V2ViQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLCBTdHJpbmcgbW9kdWxlVHlwZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUsIG1vZHVsZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9MQkwpOwotCQkKLQkJYWRkU2VwZXJhdG9yKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVVzZUV4aXN0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQW5ub3RhdGlvbnNHcm91cChjb21wb3NpdGUpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhUHJvamVjdCkgewotCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFQcm9qZWN0KSBzZWxlY3Rpb24pLmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChzZWxlY3Rpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVzZUV4aXN0aW5nQ2hlY2tib3hUZXh0KCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVc2VFeGlzdGluZ1Byb3BlcnR5KCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbm5vdGF0aW9ucyBncm91cCBhbmQgc2V0IGRlZmF1bHQgZW5hYmxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGlzV2ViRG9jbGV0UHJvamVjdCgpKSB7Ci0JCQlhbm5vdGF0aW9uc0dyb3VwID0gbmV3IEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKHBhcmVudCwgbW9kZWwsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQi5lcXVhbHMocHJvamVjdFR5cGUpLAotCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQi5lcXVhbHMocHJvamVjdFR5cGUpKTsKLQkJCWlmICghbW9kZWwuaXNQcm9wZXJ0eVNldChQUk9KRUNUX05BTUUpKQotCQkJCXJldHVybjsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCQlhbm5vdGF0aW9uc0dyb3VwLnNldEVuYWJsZW1lbnQocHJvamVjdCk7Ci0JCQkvLyBhbm5vdGF0aW9uc0dyb3VwLnNldFVzZUFubm90YXRpb25zKHRydWUpOwotCQl9IGVsc2UgewotCQkJLy8gbm90IGEgV2ViIERvY2xldCBwcm9qZWN0IC0gbWFrZSBzdXJlIHRoYXQgdGhlIFVTRV9BTk5PVEFUSU9OUyBwcm9wZXJ0eSBpcyBvZmYKLQkJCW1vZGVsLnNldFByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUywgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVzZUV4aXN0aW5nR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlleGlzdGluZ0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlleGlzdGluZ0J1dHRvbi5zZXRUZXh0KGdldFVzZUV4aXN0aW5nQ2hlY2tib3hUZXh0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlleGlzdGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGV4aXN0aW5nQnV0dG9uLCBnZXRVc2VFeGlzdGluZ1Byb3BlcnR5KCksIG51bGwpOwotCQlleGlzdGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVFeGlzdGluZ0J1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhpc3RpbmdDbGFzc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlleGlzdGluZ0NsYXNzTGFiZWwuc2V0VGV4dChDTEFTU19OQU1FX0xBQkVMKTsKLQkJZXhpc3RpbmdDbGFzc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlleGlzdGluZ0NsYXNzVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZXhpc3RpbmdDbGFzc1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWV4aXN0aW5nQ2xhc3NUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZXhpc3RpbmdDbGFzc1RleHQsIENMQVNTX05BTUUsIG51bGwpOwotCi0JCWV4aXN0aW5nQ2xhc3NCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlleGlzdGluZ0NsYXNzQnV0dG9uLnNldFRleHQoQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4aXN0aW5nQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlID0gZXhpc3RpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlwYWNrYWdlVGV4dC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlwYWNrYWdlQnV0dG9uLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXBhY2thZ2VMYWJlbC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQljbGFzc1RleHQuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJY2xhc3NMYWJlbC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlzdXBlclRleHQuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJc3VwZXJCdXR0b24uc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJc3VwZXJMYWJlbC5zZXRFbmFibGVkKCFlbmFibGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1dlYkRvY2xldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmKHByb2plY3ROYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhwcm9qZWN0TmFtZS50cmltKCkpKXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJdHJ5IHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJcmV0dXJuIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChXZWJGYWNldFV0aWxzLldFQl9YRE9DTEVUX0ZBQ0VUKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJvamVjdFJlcXVpcmVtZW50cyhJUHJvamVjdCBwcm9qZWN0KQotCXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmKGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkgIT0gbnVsbAotCQkJCSYmIGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpICE9IG51bGwpewotCQkJSUZpbGUgZGRYbWxGaWxlID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKLQkJCWlmICghZGRYbWxGaWxlLmV4aXN0cygpKQotCQkJewotCQkJCS8vIGFkZCBhIGZsYWcgaW50byB0aGUgbW9kZWwgdG8gY3JlYXRlIHRoZSBERCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGVyYXRpb24KLQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoR0VORVJBVEVfREQsIEJvb2xlYW4uVFJVRSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZG9uJ3QgY3JlYXRlIGEgREQsIHNpbmNlIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoR0VORVJBVEVfREQsIEJvb2xlYW4uRkFMU0UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjZmYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViV2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgTmV3V2ViV2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTmV3V2ViV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlnZXREYXRhTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBTZXJ2bGV0VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYTA3N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlciBleHRlbmRzIERhdGFNb2RlbFN5bmNoSGVscGVyIHsKLQlwcm90ZWN0ZWQgTWFwIHdpZGdldFRvVmFsdWVIYXNoOwotCXByb3RlY3RlZCBNdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgbXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIFNlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBVSSB0byBoYXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAbGluayBJRGF0YU1vZGVsTGlzdGVuZXIgZm9yIHRoZSBmbGFnIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoICYmIHByb3BlcnR5VG9XaWRnZXRIYXNoLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcGVydHlUb1dpZGdldEhhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJCQlMaXN0IHdpZGdldHMgPSAoTGlzdCkgb2JqOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJCWN1cnJlbnRXaWRnZXQgPSAoV2lkZ2V0KSB3aWRnZXRzLmdldChpKTsKLQkJCQkJCQkJCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnLCBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWN1cnJlbnRXaWRnZXQgPSAoV2lkZ2V0KSBvYmo7Ci0JCQkJCQkJCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnLCBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQljdXJyZW50V2lkZ2V0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcsIFdpZGdldCBjdXJyZW50V2lkZ2V0KSB7Ci0JCWlmIChjdXJyZW50V2lkZ2V0ICE9IG51bGwgJiYgY3VycmVudFdpZGdldCAhPSBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50KSB7Ci0JCQkvL1dlIG11c3QgaG9sZCBhIGNvcHkgaW4gYSB0ZW1wIHZhcmlhYmxlIGJlY2F1c2Ugc2V0dGluZyB0aGUgd2lkZ2V0IHZhbHVlCi0JCQkvL21heSB0cmlnZ2VyIGFuIGV2ZW50IHRoYXQgd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4uCi0JCQlXaWRnZXQgd2lkZ2V0ID0gY3VycmVudFdpZGdldDsKLQkJCXRyeSB7Ci0JCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCWlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGV4dCkKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVGV4dCkgY3VycmVudFdpZGdldCk7Ci0JCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKENvbWJvKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBCdXR0b24pCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKEJ1dHRvbikgY3VycmVudFdpZGdldCk7Ci0JCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExhYmVsKQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChMYWJlbCkgY3VycmVudFdpZGdldCk7Ci0JCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QpIGN1cnJlbnRXaWRnZXQpOwotCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBUYWJsZSkKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVGFibGUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBUcmVlKQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUcmVlKSBjdXJyZW50V2lkZ2V0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vUGFzcyB0aGUgY29weSBvZiB0aGUgY3VycmVudFdpZGdldAotCQkJc2V0RW5hYmxlbWVudCgoQ29udHJvbCkgd2lkZ2V0LCBkYXRhTW9kZWwuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIEJ1dHRvbiBidXR0b24pIHsKLQkJaWYgKChidXR0b24uZ2V0U3R5bGUoKSAmIFNXVC5DSEVDSykgPT0gU1dULkNIRUNLKSB7Ci0JCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdCkgewotCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgcHJvcGVydHlWYWx1ZTsKLQkJCQlPYmplY3QgYnV0dG9uVmFsdWUgPSB3aWRnZXRUb1ZhbHVlSGFzaC5nZXQoYnV0dG9uKTsKLQkJCQlib29sZWFuIGV4aXN0cyA9IHZhbHVlLmNvbnRhaW5zKGJ1dHRvblZhbHVlKTsKLQkJCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpICE9IGV4aXN0cykgewotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKGV4aXN0cyk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIE11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBidXR0b24pCi0JCQkJcmV0dXJuOwotCQkJdHJ5IHsKLQkJCQljdXJyZW50V2lkZ2V0RnJvbUV2ZW50ID0gYnV0dG9uOwotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQoYnV0dG9uKTsKLQkJCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHdpZGdldFRvVmFsdWVIYXNoLmdldChidXR0b24pOwotCQkJCQotCQkJCU9iamVjdCBjb250ZW50cyA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJCQotCQkJCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQkJCWNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQlpZiAoY29udGVudHMgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdCkgewotCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY29udGVudHM7Ci0JCQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCWlmICghbGlzdC5jb250YWlucyhwcm9wZXJ0eVZhbHVlKSkgCi0JCQkJCQkJbGlzdC5hZGQocHJvcGVydHlWYWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0LnJlbW92ZShwcm9wZXJ0eVZhbHVlKTsKLQkJCQkJfQotCQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGxpc3QpOwotCQkJCQlkYXRhTW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tib3goQnV0dG9uIGNoZWNrYm94LCBTdHJpbmcgdGV4dFZhbHVlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc2V0Q29tcG9zaXRlVmFsdWUoY2hlY2tib3gsIHRleHRWYWx1ZSk7Ci0JCXN5bmNoQ29tcG9zaXRlKGNoZWNrYm94LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQltdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgTXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29tcG9zaXRlVmFsdWUoV2lkZ2V0IHdpZGdldCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3aWRnZXRUb1ZhbHVlSGFzaCA9PSBudWxsKQotCQkJd2lkZ2V0VG9WYWx1ZUhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl3aWRnZXRUb1ZhbHVlSGFzaC5wdXQod2lkZ2V0LCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNoQ29tcG9zaXRlKFdpZGdldCB3aWRnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBDb250cm9scykgewotCQlpZiAobnVsbCA9PSB3aWRnZXRUb1Byb3BlcnR5SGFzaCkKLQkJCXdpZGdldFRvUHJvcGVydHlIYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKHByb3BlcnR5VG9XaWRnZXRIYXNoID09IG51bGwpCi0JCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdpZGdldFRvUHJvcGVydHlIYXNoLnB1dCh3aWRnZXQsIHByb3BlcnR5TmFtZSk7Ci0JCU9iamVjdCB2YWx1ZSA9IHByb3BlcnR5VG9XaWRnZXRIYXNoLmdldChwcm9wZXJ0eU5hbWUpOwotCQlMaXN0IHdpZGdldHM7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkgewotCQkJd2lkZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCXdpZGdldHMgPSAoTGlzdCkgdmFsdWU7Ci0JCX0KLQkJd2lkZ2V0cy5hZGQod2lkZ2V0KTsKLQkJcHJvcGVydHlUb1dpZGdldEhhc2gucHV0KHByb3BlcnR5TmFtZSwgd2lkZ2V0cyk7Ci0JCQotCQlpZiAoZGVwQ29udHJvbHMgIT0gbnVsbCkgewotCQkJaWYgKHdpZGdldFRvRGVwQ29udHJvbHMgPT0gbnVsbCkKLQkJCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdpZGdldFRvRGVwQ29udHJvbHMucHV0KHdpZGdldCwgZGVwQ29udHJvbHMpOwotCQl9Ci0JCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVjY2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIDxjb2RlPklTZWxlY3Rpb25WYWxpZGF0b3I8L2NvZGU+IHRvIHZhbGlkYXRlIHRoZSB0eXBlCi0gKiBvZiBhbiBlbGVtZW50LiBFbXB0eSBzZWxlY3Rpb25zIGFyZSBub3QgYWNjZXB0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgSVN0YXR1cyBmZ0Vycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2bGV0VUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElTdGF0dXMgZmdPS1N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENsYXNzW10gZkFjY2VwdGVkVHlwZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGZBbGxvd011bHRpcGxlU2VsZWN0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGFjY2VwdGVkVHlwZXMKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlcyBhY2NlcHRlZCBieSB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHZhbGlkYXRvciBhbGxvd3MKLQkgKiAgICAgICAgICAgIG11bHRpcGxlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKENsYXNzW10gYWNjZXB0ZWRUeXBlcywgYm9vbGVhbiBhbGxvd011bHRpcGxlU2VsZWN0aW9uKSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQuaXNOb3ROdWxsKGFjY2VwdGVkVHlwZXMpOwotCQlmQWNjZXB0ZWRUeXBlcyA9IGFjY2VwdGVkVHlwZXM7Ci0JCWZBbGxvd011bHRpcGxlU2VsZWN0aW9uID0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBlbGVtZW50cykgewotCQlpZiAoaXNWYWxpZChlbGVtZW50cykpIHsKLQkJCXJldHVybiBmZ09LU3RhdHVzOwotCQl9Ci0JCXJldHVybiBmZ0Vycm9yU3RhdHVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc09mQWNjZXB0ZWRUeXBlKE9iamVjdCBvKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkFjY2VwdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmQWNjZXB0ZWRUeXBlc1tpXS5pc0luc3RhbmNlKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWZBbGxvd011bHRpcGxlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvID0gc2VsZWN0aW9uW2ldOwotCQkJaWYgKCFpc09mQWNjZXB0ZWRUeXBlKG8pKSAgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVmNmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uU3RyaW5nQXJyYXlEaWFsb2dDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5TdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrPC9jb2RlPiBpbnRlcmZhY2UgZm9yIAotICogYm90aCAiSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVycyIgYW5kICJVUkwgTWFwcGluZ3MiIHRhYmxlIHZpZXdzLiAKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2sgaW1wbGVtZW50cwotCQlTdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrIHsKLQotCS8qKgotCSAqIFRoZSBmaXJzdCB0ZXh0IGZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHRbXSB0ZXh0cykgewotCQlpZiAodGV4dHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIHRleHRzWzBdLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUcmltcyB0aGUgdGV4dCB2YWx1ZXMuIAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoVGV4dFtdIHRleHRzKSB7Ci0JCWludCBuID0gdGV4dHMubGVuZ3RoOwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW25dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJcmVzdWx0W2ldID0gdGV4dHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdNYXRjaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0MzA0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgCi0gKiAgICAgTm90ZTogdGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gb3JnLmVjbGlwc2UuanN0LmludGVybmFsLnVpLnV0aWwKLSAqICAgICBJdCBoYXMgbXVjaCByZXF1ZXN0ZWQgYXMgYW4gQVBJIHNpbmNlIHRoZXJlIGFyZSBhIGRvemVuIHN1Y2ggY29waWVzIHRocm91Z2hvdXQgCi0gKiAgICAgRWNsaXBzZSBhbmQgcmVsYXRlZCBwcm9qZWN0cy4gKFN1Y2ggYXMsIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyMTQpCi0gKiAgICAgVGhlc2UgcmVxdWVzdHMgaGF2ZSBiZWVuIHJlamVjdGVkIHNpbmNlLCBhbGwgdXNlcnMgc2hvdWxkIGV2ZW50dWFsbHkgbWlncmF0ZSB0byB1c2UgamF2YXgucmVneAotICogICAgIGNvdW50ZXJwYXJ0cyBpbnN0ZWFkLiAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBzdHJpbmcgcGF0dGVybiBtYXRjaGVyLiBTdXBwb3J0cyAnKicgYW5kICc/JyB3aWxkY2FyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZQYXR0ZXJuOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsgLy8gcGF0dGVybiBsZW5ndGgKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlV2lsZENhcmRzOwotCXByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVDYXNlOwotCXByb3RlY3RlZCBib29sZWFuIGZIYXNMZWFkaW5nU3RhcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzVHJhaWxpbmdTdGFyOwotCXByb3RlY3RlZCBTdHJpbmcgZlNlZ21lbnRzW107IC8vdGhlIGdpdmVuIHBhdHRlcm4gaXMgc3BsaXQgaW50byAqIHNlcGFyYXRlZCBzZWdtZW50cwotCi0JLyogYm91bmRhcnkgdmFsdWUgYmV5b25kIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gc2VhcmNoIGluIHRoZSB0ZXh0ICovCi0JcHJvdGVjdGVkIGludCBmQm91bmQ9IDA7Ci0JCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgZlNpbmdsZVdpbGRDYXJkPSAnXHUwMDAwJzsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBvc2l0aW9uIHsKLQkJaW50IHN0YXJ0OyAvL2luY2x1c2l2ZQotCQlpbnQgZW5kOyAvL2V4Y2x1c2l2ZQotCQlwdWJsaWMgUG9zaXRpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLnN0YXJ0PSBzdGFydDsKLQkJCXRoaXMuZW5kPSBlbmQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiBzdGFydDsKLQkJfQotCQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJCXJldHVybiBlbmQ7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZSAKLQkgKiBwYXR0ZXJuLiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiAnKicgZm9yIDAgYW5kIG1hbnkgY2hhcmFjdGVycyBhbmQKLQkgKiAnPycgZm9yIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4gIAotCSAqCi0JICogTGl0ZXJhbCAnKicgYW5kICc/JyBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCBpbiB0aGUgcGF0dGVybiAKLQkgKiBlLmcuLCAiXCoiIG1lYW5zIGxpdGVyYWwgIioiLCBldGMuCi0JICoKLQkgKiBFc2NhcGluZyBhbnkgb3RoZXIgY2hhcmFjdGVyIChpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXRzZWxmKSwgCi0JICoganVzdCByZXN1bHRzIGluIHRoYXQgY2hhcmFjdGVyIGluIHRoZSBwYXR0ZXJuLgotCSAqIGUuZy4sICJcYSIgbWVhbnMgImEiIGFuZCAiXFwiIG1lYW5zICJcIgotCSAqCi0JICogSWYgaW52b2tpbmcgdGhlIFN0cmluZ01hdGNoZXIgd2l0aCBzdHJpbmcgbGl0ZXJhbHMgaW4gSmF2YSwgZG9uJ3QgZm9yZ2V0Ci0JICogZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0JICoKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaCB0ZXh0IGFnYWluc3QKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSBpZiB0cnVlLCBjYXNlIGlzIGlnbm9yZWQKLQkgKiBAcGFyYW0gaWdub3JlV2lsZENhcmRzIGlmIHRydWUsIHdpbGQgY2FyZHMgYW5kIHRoZWlyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGlnbm9yZWQKLQkgKiAJCSAgKGV2ZXJ5dGhpbmcgaXMgdGFrZW4gbGl0ZXJhbGx5KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBpZ25vcmVDYXNlLCBib29sZWFuIGlnbm9yZVdpbGRDYXJkcykgewotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlmSWdub3JlQ2FzZT0gaWdub3JlQ2FzZTsKLQkJZklnbm9yZVdpbGRDYXJkcz0gaWdub3JlV2lsZENhcmRzOwotCQlmUGF0dGVybj0gcGF0dGVybjsKLQkJZkxlbmd0aD0gcGF0dGVybi5sZW5ndGgoKTsKLQkJCi0JCWlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQlwYXJzZU5vV2lsZENhcmRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJzZVdpbGRDYXJkcygpOwotCQl9Ci0JfQotCS8qKgotCSAqIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gYmV0d2VlbiA8Y29kZT5zdGFydDwvY29kZSkoaW5jbHVzaXZlKSAKLQkgKiBhbmQgPGNvZGU+ZW5kPC9jb2RlPihleGNsdXNpdmUpLiAgCi0JICogQHBhcmFtIHRleHQgdGhlIFN0cmluZyBvYmplY3QgdG8gc2VhcmNoIGluIAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGV4Y2x1c2l2ZQotCSAqIEByZXR1cm4gYW4gPGNvZGU+U3RyaW5nTWF0Y2hlci5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IHRoYXQga2VlcHMgdGhlIHN0YXJ0aW5nIAotCSAqIChpbmNsdXNpdmUpIGFuZCBlbmRpbmcgcG9zaXRpb25zIChleGNsdXNpdmUpIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSAKLQkgKiBwYXR0ZXJuIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIHRleHQ7IHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCBvciBzdWJ0ZXh0Ci0JICogaXMgZW1wdHkgKHN0YXJ0PT1lbmQpLiBBIHBhaXIgb2YgemVyb3MgaXMgcmV0dXJuZWQgaWYgcGF0dGVybiBpcyBlbXB0eSBzdHJpbmcKLQkgKiBOb3RlIHRoYXQgZm9yIHBhdHRlcm4gbGlrZSAiKmFiYyoiIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgc3RhcnMsIHBvc2l0aW9uIG9mICJhYmMiCi0JICogaXMgcmV0dXJuZWQuIEZvciBhIHBhdHRlcm4gbGlrZSIqPz8qIiBpbiB0ZXh0ICJhYmNkZiIsICgxLDMpIGlzIHJldHVybmVkCi0JICovCi0JcHVibGljIFN0cmluZ01hdGNoZXIuUG9zaXRpb24gZmluZChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkKLQkJaW50IHRsZW49IHRleHQubGVuZ3RoKCk7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydD0gMDsKLQkJaWYgKGVuZCA+IHRsZW4pCi0JCQllbmQ9IHRsZW47Ci0JCWlmIChlbmQgPCAwIHx8c3RhcnQgPj0gZW5kICkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZkxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbihzdGFydCwgc3RhcnQpOwotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCQkJaW50IHg9IHBvc0luKHRleHQsIHN0YXJ0LCBlbmQpOwotCQkJaWYgKHggPCAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbih4LCB4K2ZMZW5ndGgpOwotCQl9Ci0KLQkJaW50IHNlZ0NvdW50PSBmU2VnbWVudHMubGVuZ3RoOwotCQlpZiAoc2VnQ291bnQgPT0gMCkvL3BhdHRlcm4gY29udGFpbnMgb25seSAnKicocykKLQkJCXJldHVybiBuZXcgUG9zaXRpb24gKHN0YXJ0LCBlbmQpOwotCQkJCQkKLQkJaW50IGN1clBvcz0gc3RhcnQ7Ci0JCWludCBtYXRjaFN0YXJ0PSAtMTsKLQkJaW50IGk7Ci0JCWZvciAoaT0gMDsgaSA8IHNlZ0NvdW50ICYmIGN1clBvcyA8IGVuZDsgKytpKSB7Ci0JCQlTdHJpbmcgY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQkJaW50IG5leHRNYXRjaD0gcmVnRXhwUG9zSW4odGV4dCwgY3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJaWYgKG5leHRNYXRjaCA8IDAgKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYoaSA9PSAwKQotCQkJCW1hdGNoU3RhcnQ9IG5leHRNYXRjaDsKLQkJCWN1clBvcz0gbmV4dE1hdGNoICsgY3VycmVudC5sZW5ndGgoKTsKLQkJfQotCQlpZiAoaSA8IHNlZ0NvdW50KQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUG9zaXRpb24obWF0Y2hTdGFydCwgY3VyUG9zKTsKLQl9Ci0JLyoqCi0JICogbWF0Y2ggdGhlIGdpdmVuIDxjb2RlPnRleHQ8L2NvZGU+IHdpdGggdGhlIHBhdHRlcm4gCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZWQgZWl0aGVyd2lzZSBmYWxzZQotCSAqIEBwYXJhbSB0ZXh0IGEgU3RyaW5nIG9iamVjdCAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbWF0Y2godGV4dCwgMCwgdGV4dC5sZW5ndGgoKSk7Ci0JfQotCS8qKgotCSAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMgaW4gdGhlICAgCi0JICogPGNvZGU+dGV4dDwvY29kZT4sIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gc3Vic3RyaW5nIG1hdGNoZXMgd2l0aCBhUGF0dGVybiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSBwYXR0ZXJuCi0JICogQHBhcmFtIHRleHQgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaCAKLQkgKiBAcGFyYW0gc3RhcnQgbWFya3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIChpbmNsdXNpdmUpIG9mIHRoZSBzdWJzdHJpbmcKLQkgKiBAcGFyYW0gZW5kIG1hcmtzIHRoZSBlbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZyAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChudWxsID09IHRleHQpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkKLQkJaWYgKHN0YXJ0ID4gZW5kKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpCi0JCQlyZXR1cm4gKGVuZCAtIHN0YXJ0ID09IGZMZW5ndGgpICYmIGZQYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoZklnbm9yZUNhc2UsIDAsIHRleHQsIHN0YXJ0LCBmTGVuZ3RoKTsKLQkJaW50IHNlZ0NvdW50PSBmU2VnbWVudHMubGVuZ3RoOwotCQlpZiAoc2VnQ291bnQgPT0gMCAmJiAoZkhhc0xlYWRpbmdTdGFyIHx8IGZIYXNUcmFpbGluZ1N0YXIpKSAgLy8gcGF0dGVybiBjb250YWlucyBvbmx5ICcqJyhzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChzdGFydCA9PSBlbmQpCi0JCQlyZXR1cm4gZkxlbmd0aCA9PSAwOwotCQlpZiAoZkxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHN0YXJ0ID09IGVuZDsJCi0JCSAKLQkJaW50IHRsZW49IHRleHQubGVuZ3RoKCk7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydD0gMDsKLQkJaWYgKGVuZCA+IHRsZW4pCi0JCQllbmQ9IHRsZW47IAotCQkJCQkKLQkJaW50IHRDdXJQb3M9IHN0YXJ0OwotCQlpbnQgYm91bmQ9IGVuZCAtIGZCb3VuZDsKLQkJaWYgKCBib3VuZCA8IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpPTA7Ci0JCVN0cmluZyBjdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCWludCBzZWdMZW5ndGg9IGN1cnJlbnQubGVuZ3RoKCk7Ci0KLQkJLyogcHJvY2VzcyBmaXJzdCBzZWdtZW50ICovCi0JCWlmICghZkhhc0xlYWRpbmdTdGFyKXsgCi0JCQlpZighcmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBzdGFydCwgY3VycmVudCwgMCwgc2VnTGVuZ3RoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKytpOwotCQkJCXRDdXJQb3M9IHRDdXJQb3MgKyBzZWdMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJaWYgKChmU2VnbWVudHMubGVuZ3RoID09IDEpICYmICghZkhhc0xlYWRpbmdTdGFyKSAmJiAoIWZIYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkvLyBvbmx5IG9uZSBzZWdtZW50IHRvIG1hdGNoLCBubyB3aWxkY2FyZHMgc3BlY2lmaWVkCi0JCQlyZXR1cm4gdEN1clBvcyA9PSBlbmQ7Ci0JCX0KLQkJLyogcHJvY2VzcyBtaWRkbGUgc2VnbWVudHMgKi8JCi0JCXdoaWxlIChpIDwgc2VnQ291bnQpIHsKLQkJCWN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJCWludCBjdXJyZW50TWF0Y2g7Ci0JCQlpbnQgaz0gY3VycmVudC5pbmRleE9mKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQljdXJyZW50TWF0Y2g9IHRleHRQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJCWlmIChjdXJyZW50TWF0Y2ggPCAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgeyAKLQkJCQljdXJyZW50TWF0Y2g9IHJlZ0V4cFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQkJaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRDdXJQb3M9IGN1cnJlbnRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQlpKys7Ci0JCX0KLQotCQkvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLQkJaWYgKCFmSGFzVHJhaWxpbmdTdGFyICYmIHRDdXJQb3MgIT0gZW5kKSB7Ci0JCQlpbnQgY2xlbj0gY3VycmVudC5sZW5ndGgoKTsKLQkJCXJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGNsZW4sIGN1cnJlbnQsIDAsIGNsZW4pOwotCQl9Ci0JCXJldHVybiBpID09IHNlZ0NvdW50IDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0JICogU2luY2Ugd2lsZGNhcmRzIGFyZSBub3QgYmVpbmcgdXNlZCBpbiB0aGlzIGNhc2UsIHRoZSBwYXR0ZXJuIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHNlZ21lbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTm9XaWxkQ2FyZHMoKSB7Ci0JCWZTZWdtZW50cz0gbmV3IFN0cmluZ1sxXTsKLQkJZlNlZ21lbnRzWzBdPSBmUGF0dGVybjsKLQkJZkJvdW5kPSBmTGVuZ3RoOwotCX0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCQlpZihmUGF0dGVybi5zdGFydHNXaXRoKCIqIikpLy8kTk9OLU5MUy0xJAotCQkJZkhhc0xlYWRpbmdTdGFyPSB0cnVlOwotCQlpZihmUGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLyogbWFrZSBzdXJlIGl0J3Mgbm90IGFuIGVzY2FwZWQgd2lsZGNhcmQgKi8KLQkJCWlmIChmTGVuZ3RoID4gMSAmJiBmUGF0dGVybi5jaGFyQXQoZkxlbmd0aCAtIDIpICE9ICdcXCcpIHsKLQkJCQlmSGFzVHJhaWxpbmdTdGFyPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJVmVjdG9yIHRlbXA9IG5ldyBWZWN0b3IoKTsKLQotCQlpbnQgcG9zPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChwb3MgPCBmTGVuZ3RoKSB7Ci0JCQljaGFyIGM9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcXCc6Ci0JCQkJCWlmIChwb3MgPj0gZkxlbmd0aCkgewotCQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNoYXIgbmV4dD0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLQkJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCi0JCQkJCQlpZiAobmV4dCA9PSAnKicgfHwgbmV4dCA9PSAnPycgfHwgbmV4dCA9PSAnXFwnKSB7Ci0JCQkJCQkJYnVmLmFwcGVuZChuZXh0KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLyogbm90IGFuIGVzY2FwZSBzZXF1ZW5jZSwganVzdCBpbnNlcnQgbGl0ZXJhbGx5ICovCi0JCQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKic6Ci0JCQkJCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvKiBuZXcgc2VnbWVudCAqLwotCQkJCQkJdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJCWZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCQkJCQlidWYuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPyc6Ci0JCQkJCS8qIGFwcGVuZCBzcGVjaWFsIGNoYXJhY3RlciByZXByZXNlbnRpbmcgc2luZ2xlIG1hdGNoIHdpbGRjYXJkICovCi0JCQkJCWJ1Zi5hcHBlbmQoZlNpbmdsZVdpbGRDYXJkKTsKLQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0KLQkJLyogYWRkIGxhc3QgYnVmZmVyIHRvIHNlZ21lbnQgbGlzdCAqLwotCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLQkJCWZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCX0KLQkJCQotCQlmU2VnbWVudHM9IG5ldyBTdHJpbmdbdGVtcC5zaXplKCldOwotCQl0ZW1wLmNvcHlJbnRvKGZTZWdtZW50cyk7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCBhIHN0cmluZyB3aGljaCBjb250YWlucyBubyB3aWxkY2FyZAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsvL25vIHdpbGQgY2FyZCBpbiBwYXR0ZXJuCi0JCWludCBtYXg9IGVuZCAtIGZMZW5ndGg7Ci0JCQotCQlpZiAoIWZJZ25vcmVDYXNlKSB7Ci0JCQlpbnQgaT0gdGV4dC5pbmRleE9mKGZQYXR0ZXJuLCBzdGFydCk7Ci0JCQlpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBmUGF0dGVybiwgMCwgZkxlbmd0aCkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCXJldHVybiAtMTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBvbmx5IGNvbnRhaW4gJz8nKHMpCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEBwYXJhbSBwIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBjb250YWlucyAnPycKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJlZ0V4cFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7Ci0JCWludCBwbGVuPSBwLmxlbmd0aCgpOwotCQkKLQkJaW50IG1heD0gZW5kIC0gcGxlbjsKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWdFeHBSZWdpb25NYXRjaGVzKFN0cmluZyB0ZXh0LCBpbnQgdFN0YXJ0LCBTdHJpbmcgcCwgaW50IHBTdGFydCwgaW50IHBsZW4pIHsKLQkJd2hpbGUgKHBsZW4tLSA+IDApIHsKLQkJCWNoYXIgdGNoYXI9IHRleHQuY2hhckF0KHRTdGFydCsrKTsKLQkJCWNoYXIgcGNoYXI9IHAuY2hhckF0KHBTdGFydCsrKTsKLQotCQkJLyogcHJvY2VzcyB3aWxkIGNhcmRzICovCi0JCQlpZiAoIWZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCQkvKiBza2lwIHNpbmdsZSB3aWxkIGNhcmRzICovCi0JCQkJaWYgKHBjaGFyID09IGZTaW5nbGVXaWxkQ2FyZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGNoYXIgPT0gdGNoYXIpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZklnbm9yZUNhc2UpIHsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbCBjYXNlczsKLQkJCQkvLyBhbHNvIGNvbXBhcmUgYWZ0ZXIgY29udmVydGluZyB0byBsb3dlciBjYXNlCi0JCQkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHBjaGFyKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIG1hdGNoCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEBwYXJhbSBwIGEgc3RyaW5nIHRoYXQgaGFzIG5vIHdpbGRjYXJkCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCB0ZXh0UG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsgCi0JCQotCQlpbnQgcGxlbj0gcC5sZW5ndGgoKTsKLQkJaW50IG1heD0gZW5kIC0gcGxlbjsKLQkJCi0JCWlmICghZklnbm9yZUNhc2UpIHsKLQkJCWludCBpPSB0ZXh0LmluZGV4T2YocCwgc3RhcnQpOwotCQkJaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmICh0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgcCwgMCwgcGxlbikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk4YTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSUNsYXNzcGF0aENvbnRhaW5lclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3RWxlbWVudFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNsYXNzcGF0aC5XZWJBcHBMaWJyYXJpZXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlIAotCi0gICAgZXh0ZW5kcyBOZXdFbGVtZW50V2l6YXJkUGFnZSAKLSAgICBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXJQYWdlLCBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZUV4dGVuc2lvbiAKLSAgICAKLXsKLSAgICBwcml2YXRlIElQcm9qZWN0IG93bmVyUHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBsaWJzUHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBDb21ibyBwcm9qZWN0c0NvbWJvOwotICAgIAotICAgIHB1YmxpYyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlKCkgCi0gICAgewotICAgICAgICBzdXBlciggIldlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHNldFRpdGxlKCBSZXNvdXJjZXMucGFnZVRpdGxlICk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCBSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0U2VsZWN0aW9uKCkgCi0gICAgewotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lci5DT05UQUlORVJfSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IHRoaXMucHJvamVjdHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZihpbmRleCAhPSAtMSl7Ci0JICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0ZWRQcm9qZWN0TmFtZSA9IHRoaXMucHJvamVjdHNDb21iby5nZXRJdGVtKCBpbmRleCApOwotCSAgICAgICAgCi0JICAgICAgICBpZiggdGhpcy5vd25lclByb2plY3QgPT0gbnVsbCB8fCAKLQkgICAgICAgICAgICAhIHNlbGVjdGVkUHJvamVjdE5hbWUuZXF1YWxzKCB0aGlzLm93bmVyUHJvamVjdC5nZXROYW1lKCkgKSApCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKCBzZWxlY3RlZFByb2plY3ROYW1lICk7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSggcGF0aCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiggZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZW50cnkgKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBjcGVudHJ5ID09IG51bGwgPyBudWxsIDogY3BlbnRyeS5nZXRQYXRoKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggcGF0aCA9PSBudWxsIHx8IHBhdGguc2VnbWVudENvdW50KCkgPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLm93bmVyUHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxpYnNQcm9qZWN0TmFtZSA9IHRoaXMub3duZXJQcm9qZWN0LmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlic1Byb2plY3ROYW1lID0gcGF0aC5zZWdtZW50KCAxICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggZmluYWwgQ29tcG9zaXRlIHBhcmVudCApIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoIDIsIGZhbHNlICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoIFJlc291cmNlcy5wcm9qZWN0c0xhYmVsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmdbXSB3ZWJQcm9qZWN0cyA9IGdldFdlYlByb2plY3RzKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnByb2plY3RzQ29tYm8gPSBuZXcgQ29tYm8oIGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSApOwotICAgICAgICB0aGlzLnByb2plY3RzQ29tYm8uc2V0SXRlbXMoIHdlYlByb2plY3RzICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5vd25lclByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4ID0gaW5kZXhPZiggd2ViUHJvamVjdHMsIHRoaXMubGlic1Byb2plY3ROYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0c0NvbWJvLmdldEl0ZW1Db3VudCgpID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBpbmRleCAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvamVjdHNDb21iby5zZWxlY3QoIGluZGV4ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBnZC5taW5pbXVtV2lkdGggPSAxMDA7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnByb2plY3RzQ29tYm8uc2V0TGF5b3V0RGF0YSggZ2QgKTsKLSAgICAgICAgCi0gICAgICAgIHNldENvbnRyb2woIGNvbXBvc2l0ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudEVudHJpZXMgKSAKLSAgICB7Ci0gICAgICAgIHRoaXMub3duZXJQcm9qZWN0ID0gKCBwcm9qZWN0ID09IG51bGwgPyBudWxsIDogcHJvamVjdC5nZXRQcm9qZWN0KCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0V2ViUHJvamVjdHMoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFNldCBwcm9qZWN0cwotICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKCBXZWJGYWNldFV0aWxzLldFQl9GQUNFVCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbIHByb2plY3RzLnNpemUoKSBdOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IHByb2plY3RzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gKElGYWNldGVkUHJvamVjdCkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBuYW1lc1sgaSBdID0gZnByb2ouZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXJyYXlzLnNvcnQoIG5hbWVzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuYW1lczsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgU2VydmxldFVJUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbIDAgXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZiggZmluYWwgU3RyaW5nW10gYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhcnJheVsgaSBdLmVxdWFscyggc3RyICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9qZWN0c0xhYmVsOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjIxYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wYWdlVGl0bGUgPSBXZWIgQXBwIExpYnJhcmllcwotcGFnZURlc2NyaXB0aW9uID0gVGhpcyBjb250YWluZXIgZHluYW1pY2FsbHkgbWFuYWdlcyBjbGFzc3BhdGggZW50cmllcyBmb3IgdHlwZXMgaW4gdGhlIFdFQi1JTkYvbGliIGFuZCBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3JpZXMuCi1wcm9qZWN0c0xhYmVsID0gUHJvamVjdDpcIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3MTZjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlRXhwb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRXhwb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9FWFBPUlRfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKFdFQlVJTWVzc2FnZXMuV0VCX0VYUE9SVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldBUl9FWFBPUlRfUEFHRTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLldFQl9QUk9KX0xCTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Iioud2FyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFRXhwb3J0UGFnZSNpc01ldGFUeXBlU3VwcG9ydGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7Ci0JCXJldHVybiAiSlNUX1dFQiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjIxZjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBleHBvcnQgSjJFRSBXZWIgQXBwbGljYXRpb24gbW9kdWxlIHN0cnVjdHVyZXMgCi0gKiBmcm9tIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB0byBhIGRlcGxveWFibGUgV2ViIEFwcGxpY2F0aW9uIAotICogQXJjaGl2ZSAqLndhciBmaWxlLiAgCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCAKLQkgKiBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCAKLQkgKiBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scwotCSAqIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIHRoZSBmb2xsb3dpbmcgcGFnZXM6Ci0JICogPHVsPgotCSAqIAk8bGk+IHtAbGluayBXZWJDb21wb25lbnRFeHBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkgCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgV2ViQ29tcG9uZW50RXhwb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRywgZ2V0U2VsZWN0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9ICAgCi0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4gCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlOWNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEltcG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlSW1wb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEltcG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX0lNUE9SVF9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oV0VCVUlNZXNzYWdlcy5XRUJfSU1QT1JUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0FSX0lNUE9SVF9QQUdFMSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBXRUJVSU1lc3NhZ2VzLldFQl9GSUxFX0xCTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi53YXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9MQkw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgd2l0aCBuZXcgaW1wb3J0IHdpemFyZHMKLQkJLy8gbmV3IEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSwgZ2V0V2ViRGF0YU1vZGVsKCksIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKXsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGE2ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UgZXh0ZW5kcyBKMkVFSW1wb3J0UGFnZSB7Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBBcmNoaXZlV3JhcHBlciBhcmNoaXZlV3JhcHBlcjsKLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyOwotCXB1YmxpYyBib29sZWFuIHV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX0lNUE9SVF9XRUJfTElCX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oV0VCVUlNZXNzYWdlcy5XRUJfSU1QT1JUX1dFQl9MSUJfUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldBUl9JTVBPUlRfUEFHRTIpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljcmVhdGVBdmFpbGFibGVKYXJzTGlzdChjb21wb3NpdGUpOwotCQljcmVhdGVCdXR0b25zR3JvdXAoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgYWxsIGJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVtZW50cygpIHsKLQkJdXRpbEphclNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KENvbXBvc2l0ZSBsaXN0R3JvdXApIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGxpc3RHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWdEYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCUF2YWlsYWJsZVdlYkxpYlByb3ZpZGVyIGxpYnNQcm92aWRlciA9IG5ldyBBdmFpbGFibGVXZWJMaWJQcm92aWRlcigpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihsaWJzUHJvdmlkZXIpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGlic1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCk7Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQltb2RlbC5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKSkgewotCQkJCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENoZWNrZWRFbGVtZW50cygoKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpKS50b0FycmF5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJQXJyYXlMaXN0IGVtcHR5U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCwgZW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlBcnJheUxpc3QgYWxsU2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyAobnVsbCAhPSAoc2VsZWN0aW9uID0gYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRFbGVtZW50QXQoaSkpKTsgaSsrKSB7Ci0JCQlhbGxTZWxlY3Rpb24uYWRkKHNlbGVjdGlvbik7Ci0JCX0KLQkJbW9kZWwuc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCwgYWxsU2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoV0VCVUlNZXNzYWdlcy5XQVJfSU1QT1JUX1NFTEVDVF9BTExfTElCU19CVVRUT04pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLmhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJZ2Qud2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoV0VCVUlNZXNzYWdlcy5XQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9MSUJTX0JVVFRPTik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOwotCQlnZC53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGlzRUFSRmlsZUNoYW5nZWQoKSkgewotCQkJYXJjaGl2ZVdyYXBwZXIgPSAoQXJjaGl2ZVdyYXBwZXIpIG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SkFSc0NvbXBvc2l0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbEdyYXllZCghZW5hYmxlZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KGFyY2hpdmVXcmFwcGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGVDaGFuZ2VkKCkgewotCQlyZXR1cm4gYXJjaGl2ZVdyYXBwZXIgIT0gbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQsIGdldEpBUnNGb3JQcm9qZWN0cygpKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SkFSc0ZvclByb2plY3RzKCkgewotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde307Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzlmMWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBXZWIgQXBwbGljYXRpb24gbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbSBhbgotICogZXhpc3RpbmcgV2ViIEFwcGxpY2F0aW9uICoud2FyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9MSUJTX1BHID0gIldFQl9MSUJTX1BHIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBXQVJJbXBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IFdlYkNvbXBvbmVudEltcG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQkJYWRkUGFnZShuZXcgV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UoZ2V0RGF0YU1vZGVsKCksIFdFQl9MSUJTX1BHKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSU1QT1JUX1dJWl9USVRMRSkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJLy8gdXBkYXRlRUFSVG9Nb2RlbEZyb21TZWxlY3Rpb24oZ2V0U3BlY2lmaWNEYXRhTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi52YWxpZGF0aW9uLlVJV2FyVmFsaWRhdG9yIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotCS8vIC8vIEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBwcm9qQ3JlYXRpb25Nb2RlbCA9Ci0JLy8gLy8gZ2V0U3BlY2lmaWNEYXRhTW9kZWwoKS5nZXRKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwoKTsKLQkvLyAvLyByZXR1cm4gcHJvakNyZWF0aW9uTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRklOQUxfUEVSU1BFQ1RJVkUpOwotCS8vIHJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5GSU5BTF9QRVJTUEVDVElWRSk7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1dFQik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjNkZDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXZWJGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHJpdmF0ZSBMYWJlbCBjb250ZXh0Um9vdExhYmVsOwotCXByaXZhdGUgVGV4dCBjb250ZXh0Um9vdDsKLQlwcml2YXRlIExhYmVsIGNvbnRlbnREaXJMYWJlbDsKLQlwcml2YXRlIFRleHQgY29udGVudERpcjsKLQotCXB1YmxpYyBXZWJGYWNldEluc3RhbGxQYWdlKCkgewotCQlzdXBlcigid2ViLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFJlc291cmNlcy5wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuTkVXX0RZTkFNSUNfV0VCX1BST0pFQ1RfUEFHRTMpOwotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXRoaXMuY29udGV4dFJvb3RMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5jb250ZXh0Um9vdExhYmVsLnNldFRleHQoUmVzb3VyY2VzLmNvbnRleHRSb290TGFiZWwpOwotCQl0aGlzLmNvbnRleHRSb290TGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCi0JCXRoaXMuY29udGV4dFJvb3QgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0aGlzLmNvbnRleHRSb290LnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJdGhpcy5jb250ZXh0Um9vdC5zZXREYXRhKCJsYWJlbCIsIHRoaXMuY29udGV4dFJvb3RMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbnRleHRSb290LCBDT05URVhUX1JPT1QsIG5ldyBDb250cm9sW117Y29udGV4dFJvb3RMYWJlbH0pOwotCi0JCXRoaXMuY29udGVudERpckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5jb250ZW50RGlyTGFiZWwpOwotCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0KLQkJdGhpcy5jb250ZW50RGlyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGhpcy5jb250ZW50RGlyLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJdGhpcy5jb250ZW50RGlyLnNldERhdGEoImxhYmVsIiwgdGhpcy5jb250ZW50RGlyTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChjb250ZW50RGlyLCBDT05GSUdfRk9MREVSLCBudWxsKTsKLQkJCi0JCWNyZWF0ZUdlbmVyYXRlRGVzY3JpcHRvckNvbnRyb2woIGNvbXBvc2l0ZSApOwotCQlyZWdpc3RlckZhY2V0VmVyc2lvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gICAgICAgIAotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGYWNldFZlcnNpb25DaGFuZ2VkRXZlbnQoKQotCXsKLQkgICAgU3RyaW5nIGZ2ID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfVkVSU0lPTl9TVFIpOwotCSAgICBib29sZWFuIGlzV2ViMjVPckdyZWF0ZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChmdikgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKLQkgICAgdGhpcy5hZGRERC5zZXRWaXNpYmxlKGlzV2ViMjVPckdyZWF0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RUFSX1BST0pFQ1RfTkFNRSwgQ09OVEVYVF9ST09ULCBDT05GSUdfRk9MREVSLCBTT1VSQ0VfRk9MREVSfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGV4dFJvb3RMYWJlbDsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGV4dFJvb3RMYWJlbEludmFsaWQ7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbDsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudERpckxhYmVsSW52YWxpZDsKLQotCQlzdGF0aWMgewotCQkJaW5pdGlhbGl6ZU1lc3NhZ2VzKFdlYkZhY2V0SW5zdGFsbFBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MpOwotCQl9Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTgyODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWdlVGl0bGUgPSBXZWIgTW9kdWxlCi1wYWdlRGVzY3JpcHRpb24gPSBDb25maWd1cmUgd2ViIG1vZHVsZSBzZXR0aW5ncy4KLWNvbnRleHRSb290TGFiZWwgPSBDb250ZXh0IHJvb3Q6Ci1jb250ZXh0Um9vdExhYmVsSW52YWxpZCA9IENvbnRleHQgcm9vdCAoaW52YWxpZCk6Ci1jb250ZW50RGlyTGFiZWwgPSBDb250ZW50IGRpcmVjdG9yeToKLWNvbnRlbnREaXJMYWJlbEludmFsaWQgPSBDb250ZW50IGRpcmVjdG9yeSAoaW52YWxpZCk6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDZlZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0Rmlyc3RQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBXZWJQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX01BSU5fUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLk5FV19EWU5BTUlDX1dFQl9QUk9KRUNUX1BBR0UxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0RmFjZXRDb25maWd1cmF0aW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBwcmltYXJ5RmFjZXRWZXJzaW9uICkKLQl7Ci0JICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCAyICk7Ci0JICAgIAotCSAgICBmYWNldHMuYWRkKCBwcmltYXJ5RmFjZXRWZXJzaW9uICk7Ci0JICAgIAotCSAgICBpZiggcHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8zMCB8fCAKLQkgICAgCXByaW1hcnlGYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjUgKQotCSAgICB7Ci0JICAgICAgICBmYWNldHMuYWRkKCBKYXZhRmFjZXRVdGlscy5KQVZBXzUwICk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiggcHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8yNCApCi0JICAgIHsKLQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfMTQgKTsKLQkgICAgfQotCSAgICBlbHNlIGlmKCBwcmltYXJ5RmFjZXRWZXJzaW9uID09IFdlYkZhY2V0VXRpbHMuV0VCXzIzIHx8Ci0JICAgICAgICAgICAgIHByaW1hcnlGYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjIgKQotCSAgICB7Ci0JICAgICAgICBmYWNldHMuYWRkKCBKYXZhRmFjZXRVdGlscy5KQVZBXzEzICk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIGZhY2V0cyApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE0N2ZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQotCXB1YmxpYyBXZWJQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9NT0RVTEVfV0laX1RJVExFKTsKLQl9Ci0JCi0JcHVibGljIFdlYlByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JICAgIH0KLQkgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLQkgICAgewotCSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JfQotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC53ZWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgV2ViUHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9XRUIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjMwOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN0YXRpY193ZWJfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTA4OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotdWkuamFyCi11aXNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1OGY5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzAyZTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgSnVsIDI2IDEzOjM5OjAyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA4MWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM5OjM0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1MDEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuV1NUV2ViVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjczODNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHN0YXRpY193ZWJfdWkvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU2YjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdmlldzE2L3dlYl9wZXJzcGVjdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdmlldzE2L3dlYl9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjMyNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi93ZWJfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkZDA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQwNTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuCi0jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLQotU3RhdGljV2ViUHJvamVjdC5uYW1lPVN0YXRpYyBXZWIgUHJvamVjdAotU3RhdGljV2ViUHJvamVjdC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBXZWIgcHJvamVjdCBmb3Igc3RhdGljIGNvbnRlbnQgKEhUTUwgZmlsZXMpIG9ubHkKLQotU3RhdGljV2ViU2V0dGluZ3M9U2ltcGxlIFdlYgotV2ViUHJvamVjdEZlYXR1cmVzLm5hbWU9V2ViIFByb2plY3QgRmVhdHVyZXMKLXdlYi5jYXRlZ29yeV91aV89V2ViCi1TdGF0aWNXZWJNb2R1bGUubmFtZT1TaW1wbGUgV2ViIE1vZHVsZQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBTaW1wbGUgV2ViIFVJIFBsdWctaW4KLXBlcnNwZWN0aXZlLm5hbWUgPSBXZWIKLXdlYkFjdGlvblNldC5sYWJlbCA9IFdlYiBQcm9qZWN0IFdpemFyZHMgQWN0aW9uIFNldAotYWN0aW9uLmxhYmVsLkNTUyA9IENTUwotYWN0aW9uLnRvb2x0aXAuQ1NTID0gQ3JlYXRlIGEgbmV3IENhc2NhZGluZyBTdHlsZSBTaGVldAotYWN0aW9uLmxhYmVsLkpTID0gSmF2YVNjcmlwdAotYWN0aW9uLnRvb2x0aXAuSlMgPSBDcmVhdGUgYSBuZXcgSmF2YVNjcmlwdCBmaWxlCi1hY3Rpb24ubGFiZWwuSFRNTCA9IEhUTUwKLWFjdGlvbi50b29sdGlwLkhUTUwgPSBDcmVhdGUgYSBuZXcgSFRNTCBwYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4ZThiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8IS0tIHN0YXRpYyB3ZWIgcHJvamVjdCB3aXphcmQgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlU3RhdGljV2ViUHJvamVjdC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLlNpbXBsZVdlYlByb2plY3RXaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTdGF0aWNXZWJQcm9qZWN0LmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+IC0tPgotICAgCi0gICA8IS0tIHRoZSBmb2xsb3dpbmcgMiBhcmUgbmVlZGVkIHRvIGFkZCBhbiBpbWFnZSBmb3IgU1dQcyBpbnRvIHRoZSAiQWRkL1JlbW92ZSBQcm9qZWN0IiBkaWFsb2cgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLQkJPG1vZHVsZVR5cGUKLQkJCWlkPSJ3ZWIuc3RhdGljIgotCQkJbmFtZT0iJVN0YXRpY1dlYk1vZHVsZS5uYW1lIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotCQk8aW1hZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnN0YXRpYyIKLQkJCXR5cGVJZHM9IndlYi5zdGF0aWMiCi0JCQlpY29uPSJpY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLnByb2plY3ROYXR1cmVJbWFnZXMgICAgLS0+Ci08IS0tIFB1cnBvc2U6IEF0dGFjaCBpY29uIG92ZXJsYXlzIGZvciBKMkVFIHByb2plY3QgbmF0dXJlcyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5wcm9qZWN0TmF0dXJlSW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYiCi0gICAgICAgICAgICBuYXR1cmVJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5TdGF0aWNXZWJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuc2ltcGxlV2ViUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJ3c3Qud2ViLmluc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0JPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zIj4KLSAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+Ci0gIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IiVwZXJzcGVjdGl2ZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdmlldzE2L3dlYl9wZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5XZWJEZXZlbG9wbWVudFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViRGV2UGVyc3BlY3RpdmUiPgotICAgICAgPC9wZXJzcGVjdGl2ZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4gCi0gICAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJEZXZQZXJzcGVjdGl2ZSI+Ci0gICAgICAgIAkKLSAgICAgICAgCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEFjdGlvblNldCIvPgotICAgICAgICAJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53aXphcmRzQWN0aW9uU2V0IiAvPgotICAgICAgICAJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyLmFjdGlvblNldCIvPgotICAgICAgICAJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuYnJlYWtwb2ludEFjdGlvblNldCIvPgotICAgICAgICAgCi0gICAgICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJQcm9qZWN0V2l6YXJkIi8+Ci0gICAgICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCIvPgotICAgICAgICAgICAgPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZC5OZXdDU1NXaXphcmQiLz4KLSAgICAgICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiLz4KLSAgICAgICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTV2l6YXJkIi8+Ci0gICAgICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIvPgotICAgICAgICAgICAgPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIi8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiLz4gCi0gICAgICAgICAgICA8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIvPiAKLSAgICAgICAgICAgIDx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiLz4gCi0gICAgICAgICAgICA8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIvPiAKLSAgICAgICAgICAgIDx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciLz4KLQotICAgICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLz4KLSAgICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4gCi0gICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRvb2xiYXIgYWN0aW9uIHNldCBmb3Igd2ViIHByb2plY3QgYW5kIEhUTUwsIEpTIGFuZCBDU1MgZmlsZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0JCTxhY3Rpb25TZXQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53aXphcmRzQWN0aW9uU2V0IgotCQkJCWxhYmVsPSIld2ViQWN0aW9uU2V0LmxhYmVsIj4KLQkJCTxhY3Rpb24KLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuQ1NTV2l6YXJkQWN0aW9uIgotCQkJCQlpY29uPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmIgotCQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5hY3Rpb25zLm5ld0NTU0ZpbGUiCi0JCQkJCWxhYmVsPSIlYWN0aW9uLmxhYmVsLkNTUyIKLQkJCQkJc3R5bGU9InB1c2giCi0JCQkJCXRvb2xiYXJQYXRoPSJOb3JtYWwvd2ViQWN0aW9ucyIKLQkJCQkJdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLkNTUyIgLz4KLQkJCTxhY3Rpb24KLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSlNXaXphcmRBY3Rpb24iCi0JCQkJCWljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2pzY3JpcHRfd2l6LmdpZiIKLQkJCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuYWN0aW9ucy5uZXdKU0ZpbGUiCi0JCQkJCWxhYmVsPSIlYWN0aW9uLmxhYmVsLkpTIgotCQkJCQlzdHlsZT0icHVzaCIKLQkJCQkJdG9vbGJhclBhdGg9Ik5vcm1hbC93ZWJBY3Rpb25zIgotCQkJCQl0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuSlMiIC8+Ci0JCQk8YWN0aW9uCi0JCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLmFjdGlvbnMuT3BlbkhUTUxXaXphcmRBY3Rpb24iCi0JCQkJCWljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZiIKLQkJCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuYWN0aW9ucy5uZXdIVE1MRmlsZSIKLQkJCQkJbGFiZWw9IiVhY3Rpb24ubGFiZWwuSFRNTCIKLQkJCQkJc3R5bGU9InB1c2giCi0JCQkJCXRvb2xiYXJQYXRoPSJOb3JtYWwvd2ViQWN0aW9ucyIKLQkJCQkJdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLkhUTUwiIC8+Ci0JCTwvYWN0aW9uU2V0PgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU0ZjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHRydWUgaWYgYm90aCBwbGF0Zm9ybSBhbmQgdGhpcyBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Qud2ViLnVpL2RlYnVnIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogS2VlcCBvdXIgb3duIGNvcHkgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBvdGhlciBzZXZlcml0eSBsZXZlbHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhsZXZlbCwgUExVR0lOX0lELCBsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGEgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIHRvIHRoZSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIEVSUk9SLCBXQVJOSU5HLCBJTkZPLCBPSwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZyBhbG9uZyB3aXRoIGFuIGFjY29tcGFueWluZwotCSAqIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZXhjZXB0aW9uIGFzIGFuIGVycm9yIGluIHRoZSBsb2cKLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ViYmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlTWlncmF0b3JNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMKLQotICAgIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAKLXsKLSAgICBwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyggSU1hcmtlciBtYXJrZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIAotICAgICAgICB7IAotICAgICAgICAgICAgbmV3IE1vZHVsZUNvcmVNaWdyYXRpb25SZXNvbHV0aW9uKCBtYXJrZXIgKSAKLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBNb2R1bGVDb3JlTWlncmF0aW9uUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24KLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbixJTWFya2VyUmVzb2x1dGlvbjIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIElNYXJrZXIgdGhlTWFya2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBNQVJLRVJUWVBFID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyIjsKLS8vICAgICAgICBwcml2YXRlIGZpbmFsIElNYXJrZXJbXSBOT19NQVJLRVJTPSBuZXcgSU1hcmtlclswXTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNb2R1bGVDb3JlTWlncmF0aW9uUmVzb2x1dGlvbiggSU1hcmtlciBtYXJrZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnRoZU1hcmtlciA9IG1hcmtlcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMubWlncmF0ZU1ldGFEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBydW4oIElNYXJrZXIgbWFya2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBJUHJvamVjdCBwcm9qID0gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgCQlNb2R1bGVNaWdyYXRvck1hbmFnZXIgbWFuYWdlciA9IE1vZHVsZU1pZ3JhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKHByb2opOwotICAgICAgICAJCWlmICghbWFuYWdlci5pc01pZ3JhdGluZygpICYmICFSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpIAotICAgICAgICAJCQkJbWFuYWdlci5taWdyYXRlT2xkTWV0YURhdGEocHJvaix0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzLm1pZ3JhdGVNZXRhRGF0YTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElNYXJrZXJbXSBmaW5kT3RoZXJNYXJrZXJzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCQlMaXN0IG1hcmtzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhNQVJLRVJUWVBFKSAmJiAhKG1hcmtlci5lcXVhbHModGhlTWFya2VyKSkpCi0JCQkJCQltYXJrcy5hZGQobWFya2VyKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoSU1hcmtlcltdKW1hcmtzLnRvQXJyYXkobmV3IElNYXJrZXJbbWFya3Muc2l6ZSgpXSk7Ci0JCX0KLSAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAJcHVibGljIHN0YXRpYyBTdHJpbmcgbWlncmF0ZU1ldGFEYXRhOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTI2NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1pZ3JhdGVNZXRhRGF0YT1NaWdyYXRlIFdUUCBtZXRhZGF0YQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzFmOWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV1NUV2ViUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIFdTVFdlYlByZWZlcmVuY2VzIHsKLQlwdWJsaWMgaW50ZXJmYWNlIEtleXMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLnN0YXRpY1dlYkNvbnRlbnROYW1lIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgaW50ZXJmYWNlIFZhbHVlcyB7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdHMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9IFZhbHVlcy5TVEFUSUNfV0VCX0NPTlRFTlQ7Ci0JfQotCXByaXZhdGUgUGx1Z2luIG93bmVyID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlID0gZmFsc2U7Ci0KLQlwdWJsaWMgV1NUV2ViUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuU1RBVElDX1dFQl9DT05URU5ULCBEZWZhdWx0cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCkgewotCQlpZiAoaXNQZXJzaXN0T25DaGFuZ2UoKSkKLQkJCXBlcnNpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJzaXN0KCkgewotCQlnZXRPd25lcigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGVyc2lzdE9uQ2hhbmdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdE9uQ2hhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBlcnNpc3RPbkNoYW5nZQotCSAqICAgICAgICAgICAgVGhlIHBlcnNpc3RPbkNoYW5nZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdE9uQ2hhbmdlKGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlKSB7Ci0JCXRoaXMucGVyc2lzdE9uQ2hhbmdlID0gcGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLnByZWZlcmVuY2VzID0gZ2V0T3duZXIoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdGhpcy5wcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG93bmVyLgotCSAqLwotCXByaXZhdGUgUGx1Z2luIGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL1dTVFdlYlVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL1dTVFdlYlVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzM4ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTVFdlYlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIudWkiOyAvLyROT04tTkxTLTEkCi0gICAgCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXU1RXZWJVSVBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL2N0b29sMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NUV2ViVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCVVSTCBpbWFnZVVSTCA9IGdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCQlpZiAoaW1hZ2VVUkw9PW51bGwpCi0JCQlpbWFnZVVSTCA9IGdldFBOR0ltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCQlpZiAoaW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSwgQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgZ2lmID0gIi8iICsga2V5ICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSUNPTl9ESVJTLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVJTW2ldKS5hcHBlbmQoZ2lmKTsKLQkJCWlmIChidW5kbGUuZ2V0RW50cnkocGF0aC50b1N0cmluZygpKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJMb2FkX0ltYWdlX0Vycm9yXyIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAucG5nIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRQTkdJbWFnZVVSTChTdHJpbmcga2V5LCBCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBnaWYgPSAiLyIgKyBrZXkgKyAiLnBuZyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBJQ09OX0RJUlMubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGggPSBuZXcgUGF0aChJQ09OX0RJUlNbaV0pLmFwcGVuZChnaWYpOwotCQkJaWYgKGJ1bmRsZS5nZXRFbnRyeShwYXRoLnRvU3RyaW5nKCkpID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkxvYWRfSW1hZ2VfRXJyb3JfIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTVFdlYlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL1dlYkRldmVsb3BtZW50UGVyc3BlY3RpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV2ViRGV2ZWxvcG1lbnRQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ1ZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV2ViRGV2ZWxvcG1lbnRQZXJzcGVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV2ViRGV2ZWxvcG1lbnRQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJEZXZQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtTiQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUF9MRUZUX0xPQ0FUSU9OID0gInRvcExlZnQiOyAvLyROT04tTkxTLU4kCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9UVE9NX0xFRlRfTE9DQVRJT04gPSAiYm90dG9tTGVmdCI7IC8vJE5PTi1OTFMtTiQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT1RUT01fUklHSFRfTE9DQVRJT04gPSAiYm90dG9tUmlnaHQiOyAvLyROT04tTkxTLU4kCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QX1JJR0hUX0xPQ0FUSU9OID0gInRvcFJpZ2h0IjsgLy8kTk9OLU5MUy1OJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPVFRPTV9MT0NBVElPTiA9ICJib3R0b20iOyAvLyROT04tTkxTLU4kCi0KLQkvLyB2aWV3IGlkJ3MKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJRF9QUk9KRUNUX0VYUExPUkVSID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOyAvLyROT04tTkxTLU4kCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0VSVkVSID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIElEX1dTVF9TTklQUEVUU19WSUVXID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdlYkRldmVsb3BtZW50UGVyc3BlY3RpdmUoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vSWYgcHJlZmVyZW5jZSBleGlzdHMgZm9yIGFsdGVybmF0ZSB2aWV3LCByZXBsYWNlLgotCQlTdHJpbmcgdmlld2VySUQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5JRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyk7Ci0JCWlmICh2aWV3ZXJJRCAhPSBudWxsKQotCQkJSURfUFJPSkVDVF9FWFBMT1JFUiA9IHZpZXdlcklEOwotCX0KLQotCS8qCi0JICpfX19fIF9fX19fX19fX19fX19fX18gX19fX18KLQkgKnwgICAgfCAgICAgICAgICAgICAgICB8ICAgICB8Ci0JICp8IFAgIHwgICAgICAgICAgICAgICAgfCAgTyAgfAotCSAqfCBSICB8ICAgICBFRCAgICAgICAgIHwgIHUgIHwKLQkgKnwgbyAgfCAgICAgICAgICAgICAgICB8ICB0ICB8Ci0JICp8IGogIHwgICAgICAgICAgICAgICAgfCAgbCAgfAotCSAqfCAgICB8X19fX19fX19fX19fX19fX3wgIGkgIHwKLQkgKnwgRSAgfCAgICAgICAgICAgICAgICB8ICBuICB8Ci0JICp8IFggIHwgUFJPQi9TRVJWL1BST1AgfCAgZSAgfAotCSAqfF9QX198X19fX19fX19fX19fX19fX3xfX19fX3wKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgYmFzZWQgb2ZmIHRoZSBlZGl0b3IgYXJlYQotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0KLQkJLy8gTEVGVCBBcmVhIChQcm9qZWN0IEV4cGxvcmVyKQotCQlJRm9sZGVyTGF5b3V0IHRvcExlZnQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKFRPUF9MRUZUX0xPQ0FUSU9OLAotCQkJCUlQYWdlTGF5b3V0LkxFRlQsIDAuMjVmLCBlZGl0b3JBcmVhKTsKLQkJdG9wTGVmdC5hZGRWaWV3KElEX1BST0pFQ1RfRVhQTE9SRVIpOwotCQl0b3BMZWZ0LmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCi0JCS8vIFRPUCBSSUdIVCBBcmVhIChPdXRsaW5lKQotCQlJRm9sZGVyTGF5b3V0IHRvcFJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcihUT1BfUklHSFRfTE9DQVRJT04sCi0JCQkJSVBhZ2VMYXlvdXQuUklHSFQsIDAuODBmLCBlZGl0b3JBcmVhKTsKLQkJdG9wUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJdG9wUmlnaHQuYWRkVmlldyhJRF9XU1RfU05JUFBFVFNfVklFVyk7Ci0KLQkJLy8gQk9UVE9NIEFyZWEgKFByb2JsZW1zLCBTZXJ2ZXIsIFByb3BlcnRpZXMpCi0JCUlGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcihCT1RUT01fTE9DQVRJT04sCi0JCQkJSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjcwZiwgZWRpdG9yQXJlYSk7Ci0JCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWJvdHRvbS5hZGRWaWV3KElEX1NFUlZFUik7Ci0JCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlib3R0b20uYWRkUGxhY2Vob2xkZXIoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQlib3R0b20uYWRkUGxhY2Vob2xkZXIoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLQkJYm90dG9tLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUyk7Ci0JCWJvdHRvbS5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7Ci0JCWJvdHRvbS5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMyYzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHVibGljIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ICkKLQl7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIHJ1biggSUFjdGlvbiBhY3Rpb24gKTsKLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoIElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbldpemFyZERpYWxvZyggSVdvcmtiZW5jaFdpemFyZCB3aXphcmQgKQotCXsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQotCQlpZiAoIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkKLQkJewotCQkJd2l6YXJkLmluaXQoIHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24gKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXdpemFyZC5pbml0KCB3aW5kb3cuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgKTsKLQkJfQotCQotCQlTaGVsbCBwYXJlbnQgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coIHBhcmVudCwgd2l6YXJkICk7Ci0JCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuQ1NTV2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkNTU1dpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjYwZjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuQ1NTV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwud2l6YXJkLk5ld0NTU1dpemFyZDsKLQotcHVibGljIGNsYXNzIE9wZW5DU1NXaXphcmRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLXsKLQotCXB1YmxpYyB2b2lkIHJ1biggSUFjdGlvbiBhY3Rpb24gKQotCXsKLQkJb3BlbldpemFyZERpYWxvZyggbmV3IE5ld0NTU1dpemFyZCgpICk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkhUTUxXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSFRNTFdpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFmYTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSFRNTFdpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQuTmV3SFRNTFdpemFyZDsKLQotcHVibGljIGNsYXNzIE9wZW5IVE1MV2l6YXJkQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0KLQlwdWJsaWMgdm9pZCBydW4oIElBY3Rpb24gYWN0aW9uICkKLQl7Ci0JCW9wZW5XaXphcmREaWFsb2coIG5ldyBOZXdIVE1MV2l6YXJkKCkgKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSlNXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSlNXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNWI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpTV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgT3BlbkpTV2l6YXJkQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0KLQlwdWJsaWMgdm9pZCBydW4oIElBY3Rpb24gYWN0aW9uICkKLQl7Ci0JCW9wZW5XaXphcmREaWFsb2coIG5ldyBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld0pTV2l6YXJkKCkgKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTUzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldvcmtpbmdTZXRDb25maWd1cmF0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Xb3JraW5nU2V0R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5OZXdQcm9qZWN0R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuQWJzdHJhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5GaWx0ZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5QcmVzZXRTZWxlY3Rpb25QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmZhY2V0LlJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1JVTlRJTUUgPSAiTlVMTF9SVU5USU1FIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNUlVfUlVOVElNRV9TVE9SRSA9ICJNUlVfUlVOVElNRV9TVE9SRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9XT1JLSU5HX1NFVCA9ICJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfV09SS0lOR19TRVQgPSAib3JnLmVjbGlwc2UuamR0LnVpLkphdmFXb3JraW5nU2V0UGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgSVByb2plY3RGYWNldCBwcmltYXJ5UHJvamVjdEZhY2V0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29tYm8gcHJpbWFyeVZlcnNpb25Db21ibyA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIFdvcmtpbmdTZXRHcm91cCB3b3JraW5nU2V0R3JvdXA7Ci0JCi0JcHJvdGVjdGVkIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0RmFjZXRDb25maWd1cmF0aW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBwcmltYXJ5RmFjZXRWZXJzaW9uICkKLQl7Ci0JICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gY29uZmlnID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0JICAgIAotCSAgICBmb3IoIElQcm9qZWN0RmFjZXQgZml4ZWRGYWNldCA6IHRoaXMuZnBqd2MuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKQotCSAgICB7Ci0JICAgICAgICBpZiggZml4ZWRGYWNldCA9PSBwcmltYXJ5RmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBjb25maWcuYWRkKCBwcmltYXJ5RmFjZXRWZXJzaW9uICk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgY29uZmlnLmFkZCggdGhpcy5mcGp3Yy5nZXRIaWdoZXN0QXZhaWxhYmxlVmVyc2lvbiggZml4ZWRGYWNldCApICk7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBjb25maWc7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEQVRJT05fUFJPUEVSVElFUyA9IAotCXsKLQkgICAgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FLCAKLQkgICAgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9MT0NBVElPTiwgCi0JICAgIEZBQ0VUX1JVTlRJTUUsCi0JICAgIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkKLQl9OwotCQotCXByb3RlY3RlZCBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpIHsKLQkJcmV0dXJuIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEdyaWREYXRhIGhzcGFuKCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhbiApIAotICAgIHsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotICAgICAgICByZXR1cm4gZ2Q7Ci0gICAgfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRvcCwgZ2V0SW5mb3BvcElEKCkpOwotCQl0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0b3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNyZWF0ZVByb2plY3RHcm91cCh0b3ApOwotCQljcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUodG9wKTsKLQkJY3JlYXRlUHJpbWFyeUZhY2V0Q29tcG9zaXRlKHRvcCk7Ci0gICAgICAgIGNyZWF0ZVByZXNldFBhbmVsKHRvcCk7Ci0gICAgICAgIHJldHVybiB0b3A7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFByaW1hcnlGYWNldENvbXBvc2l0ZUxhYmVsKCkKLQl7Ci0JICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkgICAgYm9vbGVhbiBmaXJzdFdvcmQgPSB0cnVlOwotCSAgICAKLQkgICAgZm9yKCBTdHJpbmcgd29yZCA6IHByaW1hcnlQcm9qZWN0RmFjZXQuZ2V0TGFiZWwoKS5zcGxpdCggIiAiICkgKQotCSAgICB7Ci0JICAgICAgICBpZiggZmlyc3RXb3JkICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBidWYuYXBwZW5kKCB3b3JkICk7Ci0JICAgICAgICAgICAgZmlyc3RXb3JkID0gZmFsc2U7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgYnVmLmFwcGVuZCggJyAnICk7Ci0JICAgICAgICAgICAgCi0gICAgCSAgICAgICAgaWYoIHdvcmQubGVuZ3RoKCkgPT0gMSB8fCAhIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSggd29yZC5jaGFyQXQoIDEgKSApICkKLSAgICAJICAgICAgICB7Ci0gICAgCSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIENoYXJhY3Rlci50b0xvd2VyQ2FzZSggd29yZC5jaGFyQXQoIDAgKSApICk7Ci0gICAgCSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHdvcmQuc3Vic3RyaW5nKCAxICkgKTsKLSAgICAJICAgICAgICB9Ci0gICAgCSAgICAgICAgZWxzZQotICAgIAkgICAgICAgIHsKLSAgICAJICAgICAgICAgICAgYnVmLmFwcGVuZCggd29yZCApOwotICAgIAkgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgYnVmLmFwcGVuZCggJyAnICk7Ci0JICAgIGJ1Zi5hcHBlbmQoIE1lc3NhZ2VzLkZBQ0VUX1ZFUlNJT04gKTsKLQkgICAgCi0JICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcmltYXJ5RmFjZXRDb21wb3NpdGUoQ29tcG9zaXRlIHRvcCkgewotCQlwcmltYXJ5UHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBnZXRNb2R1bGVUeXBlSUQoKSApOwotCQlpZiAocHJpbWFyeVByb2plY3RGYWNldC5nZXRWZXJzaW9ucygpLnNpemUoKSAgPD0gMSl7Ci0JCQkvL3RoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIHRoaXMgc2VjdGlvbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQotCQkJLy9mYWNldCB2ZXJzaW9uIHRvIGNob29zZSBmcm9tIChlLmcuIHV0aWxpdHkgYW5kIHN0YXRpYyB3ZWIpCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZpbmFsIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKCB0b3AsIFNXVC5OT05FICk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICBncm91cC5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCAxLCBmYWxzZSApICk7Ci0gICAgICAgIGdyb3VwLnNldFRleHQoIGdldFByaW1hcnlGYWNldENvbXBvc2l0ZUxhYmVsKCkgKTsKLQkJCi0gICAgICAgIHByaW1hcnlWZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8oIGdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgICAgICBwcmltYXJ5VmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICB1cGRhdGVQcmltYXJ5VmVyc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIHByaW1hcnlWZXJzaW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVByaW1hcnlGYWNldFZlcnNpb25TZWxlY3RlZEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgZnBqd2MuYWRkTGlzdGVuZXIobmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQpIHsKLQkJCQlpZihldmVudC5nZXRUeXBlKCkgPT0gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX0ZBQ0VUU19DSEFOR0VEKXsKLQkJCQkJLy90aGlzIGJsb2NrIGlzIHRvIHVwZGF0ZSB0aGUgY29tYm8gd2hlbiB0aGUgdW5kZXJseWluZyBmYWNldCB2ZXJzaW9uIGNoYW5nZXMKLQkJCQkJSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQgYWN0aW9uRXZlbnQgPSAoSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQpZXZlbnQ7Ci0JCQkJCVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gY2hhbmdlZFZlcnNpb25zID0gYWN0aW9uRXZlbnQuZ2V0RmFjZXRzV2l0aENoYW5nZWRWZXJzaW9ucygpOwotCQkJCQkKLQkJCQkJYm9vbGVhbiBmb3VuZENvbWJvVmVyc2lvbiA9IGZhbHNlOwotCQkJCQlmb3IoSXRlcmF0b3IgPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBpdGVyYXRvciA9IGNoYW5nZWRWZXJzaW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCkgJiYgIWZvdW5kQ29tYm9WZXJzaW9uOyl7Ci0JCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYobmV4dC5nZXRQcm9qZWN0RmFjZXQoKS5lcXVhbHMocHJpbWFyeVByb2plY3RGYWNldCkpewotCQkJCQkJCWZvdW5kQ29tYm9WZXJzaW9uID0gdHJ1ZTsKLQkJCQkJCQlmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBzZWxlY3RlZFZlcnNpb24gPSBuZXh0OwotCQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IHByaW1hcnlWZXJzaW9uQ29tYm8uZ2V0SXRlbShwcmltYXJ5VmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCQkJCQkJaWYoIXNlbGVjdGVkVGV4dC5lcXVhbHMoc2VsZWN0ZWRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSkpewotCQkJCQkJCQkJCVN0cmluZyBbXSBpdGVtcyA9IHByaW1hcnlWZXJzaW9uQ29tYm8uZ2V0SXRlbXMoKTsKLQkJCQkJCQkJCQlpbnQgc2VsZWN0ZWRWZXJzaW9uSW5kZXggPSAtMTsKLQkJCQkJCQkJCQlmb3IoaW50IGk9MDtpPGl0ZW1zLmxlbmd0aCAmJiBzZWxlY3RlZFZlcnNpb25JbmRleCA9PSAtMTsgaSsrKXsKLQkJCQkJCQkJCQkJaWYoaXRlbXNbaV0uZXF1YWxzKHNlbGVjdGVkVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpKXsKLQkJCQkJCQkJCQkJCXNlbGVjdGVkVmVyc2lvbkluZGV4ID0gaTsKLQkJCQkJCQkJCQkJCXByaW1hcnlWZXJzaW9uQ29tYm8uc2VsZWN0KHNlbGVjdGVkVmVyc2lvbkluZGV4KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0JCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZihldmVudC5nZXRUeXBlKCkgPT0gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCl7Ci0JCQkJCS8vdGhpcyBibG9jayB1cGRhdGVzIHRoZSBpdGVtcyBpbiB0aGUgY29tYm8gd2hlbiB0aGUgcnVudGltZSBjaGFuZ2VzCi0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl1cGRhdGVQcmltYXJ5VmVyc2lvbnMoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotICAgICAgICAJCi0gICAgICAgIH0sIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0IGdldFByaW1hcnlGYWNldCgpCi0JewotCSAgICByZXR1cm4gdGhpcy5wcmltYXJ5UHJvamVjdEZhY2V0OwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJpbWFyeUZhY2V0VmVyc2lvbigpCi0JewotCSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IG51bGw7Ci0JICAgIAotCSAgICBpZiggdGhpcy5wcmltYXJ5UHJvamVjdEZhY2V0LmdldFZlcnNpb25zKCkuc2l6ZSgpID4gMSApCi0JICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxlY3RlZEluZGV4ID0gdGhpcy5wcmltYXJ5VmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgCi0gICAgICAgICAgICBpZiggc2VsZWN0ZWRJbmRleCAhPSAtMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ2c3RyID0gdGhpcy5wcmltYXJ5VmVyc2lvbkNvbWJvLmdldEl0ZW0oIHNlbGVjdGVkSW5kZXggKTsKLSAgICAgICAgICAgICAgICBmdiA9IHRoaXMucHJpbWFyeVByb2plY3RGYWNldC5nZXRWZXJzaW9uKCBmdnN0ciApOwotICAgICAgICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgZnYgPSB0aGlzLnByaW1hcnlQcm9qZWN0RmFjZXQuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQkgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZ2OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcmltYXJ5RmFjZXRWZXJzaW9uU2VsZWN0ZWRFdmVudCgpCi0JewotCSAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGdldFByaW1hcnlGYWNldFZlcnNpb24oKTsKLSAgICAgICAgaWYoIGZ2ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgIAlTdHJpbmcgcHJlc2V0SUQgPSBudWxsOwotICAgICAgICAJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOwotICAgICAgICAJaWYocnVudGltZSAhPSBudWxsKXsKLSAgICAgICAgCQlpZihydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkuc2l6ZSgpID4gMCl7Ci0gICAgICAgIAkJCUlSdW50aW1lQ29tcG9uZW50IHJ1bnRpbWVDb21wb25lbnQgPSBydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkuZ2V0KDApOwotICAgICAgICAJCQlTdHJpbmcgZmFjZXRSdW50aW1lVHlwZUlEID0gcnVudGltZUNvbXBvbmVudC5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAkJCVN0cmluZyBmYWNldFJ1bnRpbWVWZXJzaW9uID0gcnVudGltZUNvbXBvbmVudC5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgCQkJU3RyaW5nIGZhY2V0SUQgPSBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotCQkgICAgCSAgICBTdHJpbmcgZmFjZXRWZXJzaW9uID0gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotCQkgICAgCSAgICBwcmVzZXRJRCA9IFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlc2V0SUQoZmFjZXRSdW50aW1lVHlwZUlELCBmYWNldFJ1bnRpbWVWZXJzaW9uLCBmYWNldElELCBmYWNldFZlcnNpb24pOwkKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLSAgICAgICAgCWlmKCBwcmVzZXRJRCA9PSBudWxsICkKLSAgICAgICAgCXsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IGdldEZhY2V0Q29uZmlndXJhdGlvbiggZnYgKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZwandjLnNldFByb2plY3RGYWNldHMoIGZhY2V0cyApOwotICAgICAgICAJfQotICAgICAgICAJZWxzZQotICAgICAgICAJeyAgLy8gc2V0dGluZyB0aGUgZmFjZXRzIHByaW9yIHRvIHNldHRpbmcgdGhlIHByZXNldCBpcyB0byBsZXQgdGhlIGR5bmFtaWMgcHJlc2V0cyBhZGp1c3QKLSAgICAgICAgCQlmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IGdldEZhY2V0Q29uZmlndXJhdGlvbiggZnYgKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZwandjLnNldFByb2plY3RGYWNldHMoIGZhY2V0cyApOwotICAgICAgICAJCXRoaXMuZnBqd2Muc2V0U2VsZWN0ZWRQcmVzZXQocHJlc2V0SUQpOwotICAgICAgICAJCQotICAgICAgICAJfQotICAgICAgICB9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJpbWFyeVZlcnNpb25zKCl7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHNlbGVjdGVkVmVyc2lvbiA9IGZwandjLmdldFByb2plY3RGYWNldFZlcnNpb24ocHJpbWFyeVByb2plY3RGYWNldCk7Ci0JCVNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gaW5pdGlhbFZlcnNpb25zID0gZnBqd2MuZ2V0QXZhaWxhYmxlVmVyc2lvbnMocHJpbWFyeVByb2plY3RGYWNldCk7Ci0gICAgICAgIFN0cmluZyBbXSBpdGVtcyA9IG5ldyBTdHJpbmdbaW5pdGlhbFZlcnNpb25zLnNpemUoKV07Ci0gICAgICAgIGludCBpPTA7Ci0gICAgICAgIGludCBzZWxlY3RlZFZlcnNpb25JbmRleCA9IC0xOwotICAgICAgICBmb3IoSXRlcmF0b3IgPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBpdGVyYXRvciA9IGluaXRpYWxWZXJzaW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7IGkrKyl7Ci0gICAgICAgIAlpdGVtc1tpXSA9IGl0ZXJhdG9yLm5leHQoKS5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgIAlpZihzZWxlY3RlZFZlcnNpb25JbmRleCA9PSAtMSAmJiBpdGVtc1tpXS5lcXVhbHMoc2VsZWN0ZWRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSkpewotICAgICAgICAJCXNlbGVjdGVkVmVyc2lvbkluZGV4ID0gaTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBwcmltYXJ5VmVyc2lvbkNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIHByaW1hcnlWZXJzaW9uQ29tYm8uc2V0SXRlbXMoaXRlbXMpOwotICAgICAgICBwcmltYXJ5VmVyc2lvbkNvbWJvLnNlbGVjdChzZWxlY3RlZFZlcnNpb25JbmRleCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLmZhY2V0Y3JlYXRpb25wYWdlbWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgRkFDRVRfVkVSU0lPTjsKLQkJCi0JCXN0YXRpYyB7Ci0JCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCQl9Ci0KLQkJcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcmVzZXRQYW5lbChDb21wb3NpdGUgdG9wKSB7Ci0JCWZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjCi0gICAgICAgICAgICA9ICggKE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKSApLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKTsKLQkJCi0JCWZpbmFsIElGaWx0ZXI8SVByZXNldD4gZmlsdGVyID0gbmV3IEFic3RyYWN0RmlsdGVyPElQcmVzZXQ+KCkKLQkJewotCQkgICAgewotCQkgICAgICAgIGZwandjLmFkZExpc3RlbmVyCi0JCSAgICAgICAgKAotCQkgICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotCQkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQoIChJUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudCkgZXZlbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgfSwgCi0JCSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCAKLQkJICAgICAgICApOwotCQkgICAgfQotCQkgICAgCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVjayggZmluYWwgSVByZXNldCBwcmVzZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIHByaW1hcnlGYWNldFZlcnNpb24gPSBnZXRQcmltYXJ5RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnMoIHByaW1hcnlGYWNldFZlcnNpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQoIGZpbmFsIElQcm9qZWN0RmFjZXRzQ2hhbmdlZEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZXZlbnQuZ2V0RmFjZXRzV2l0aENoYW5nZWRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSA9PSBnZXRQcmltYXJ5RmFjZXQoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGaWx0ZXJFdmVudDxJUHJlc2V0PiBmaWx0ZXJFdmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEZpbHRlckV2ZW50PElQcmVzZXQ+KCB0aGlzLCBJRmlsdGVyRXZlbnQuVHlwZS5GSUxURVJfQ0hBTkdFRCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIGZpbHRlckV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCX07Ci0KLSAgICAgICAgZmluYWwgUHJlc2V0U2VsZWN0aW9uUGFuZWwgcHBhbmVsID0gbmV3IFByZXNldFNlbGVjdGlvblBhbmVsKCB0b3AsIGZwandjLCBmaWx0ZXIgKTsKLSAgICAgICAgCi0gICAgICAgIHBwYW5lbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG1vZGVsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBzZXJ2ZXJUeXBlSUQpIAotCXsKLQkgICAgaWYoIG1vZGVsID09IG51bGwgKQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgICAgCi0JCWZpbmFsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIHByZUFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRkFDRVRfUlVOVElNRSk7Ci0JCQotCQlmaW5hbCBib29sZWFuW10ga2VlcFdhaXRpbmcgPSB7IHRydWUgfTsKLQkJCi0JCWZpbmFsIElEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKQotCQl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoIGZpbmFsIERhdGFNb2RlbEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCBGQUNFVF9SVU5USU1FICkgJiYKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKCBrZWVwV2FpdGluZyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBXYWl0aW5nWyAwIF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBXYWl0aW5nLm5vdGlmeSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtb2RlbC5yZW1vdmVMaXN0ZW5lciggdGhpcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfTsKLQkJCi0JCW1vZGVsLmFkZExpc3RlbmVyKCBsaXN0ZW5lciApOwotCQkKLQkJYm9vbGVhbiBpc09LID0gU2VydmVyVUlVdGlsLnNob3dOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBzZXJ2ZXJUeXBlSUQsIG51bGwpOwotCQkKLQkJaWYoIGlzT0sgKSAKLQkJewotCQkgICAgLy8gRG8gdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmcgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFNpbmNlIHdlIGFyZSBnb2luZyB0byBibG9jawotCQkgICAgLy8gYW5kIHdhaXQsIGRvaW5nIHRoaXMgb24gdGhlIFVJIHRocmVhZCBjYW4gY2F1c2UgaGFuZ3MuCi0JCSAgICAKLQkJICAgIGZpbmFsIFRocmVhZCBuZXdSdW50aW1lU2VsZWN0aW9uVGhyZWFkID0gbmV3IFRocmVhZCgpCi0JCSAgICB7Ci0JCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJICAgICAgICB7Ci0gICAgICAgIAkJICAgIC8vIENhdXNlcyB0aGUgbGlzdCBvZiBydW50aW1lcyBoZWxkIGJ5IHRoZSBSdW50aW1lTWFuYWdlciB0byBiZSByZWZyZXNoZWQgYW5kIAotICAgICAgICAJCSAgICAvLyB0cmlnZ2VycyBldmVudHMgdG8gbGlzdGVuZXJzIG9uIHRoYXQgbGlzdC4KLSAgICAgICAgCQkgICAgCi0gICAgICAgIAkJICAgIFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCk7Ci0gICAgICAgIAkJICAgIAotICAgICAgICAJCSAgICAvLyBXYWl0IHVudGlsIHRoZSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBoYXMgdXBkYXRlZCB0byBpbmNsdWRlIHRoZSBuZXcgcnVudGltZS4KLSAgICAgICAgCQkgICAgCi0gICAgICAgIAkJICAgIHN5bmNocm9uaXplZCgga2VlcFdhaXRpbmcgKQotICAgICAgICAJCSAgICB7Ci0gICAgICAgIAkJICAgICAgICB3aGlsZSgga2VlcFdhaXRpbmdbIDAgXSA9PSB0cnVlICkKLSAgICAgICAgCQkgICAgICAgIHsKLSAgICAgICAgCQkgICAgICAgICAgICB0cnkKLSAgICAgICAgCQkgICAgICAgICAgICB7Ci0gICAgICAgIAkJICAgICAgICAgICAgICAgIGtlZXBXYWl0aW5nLndhaXQoKTsKLSAgICAgICAgCQkgICAgICAgICAgICB9Ci0gICAgICAgIAkJICAgICAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAJCSAgICAgICAgfQotICAgICAgICAJCSAgICB9Ci0gICAgICAgIAkJICAgIAotICAgICAgICAJCSAgICAvLyBTZWxlY3QgdGhlIG5ldyBydW50aW1lLgotICAgICAgICAJCSAgICAKLSAgICAgICAgCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRkFDRVRfUlVOVElNRSk7Ci0gICAgICAgIAkJCU9iamVjdFtdIHByZUFkZGl0aW9uID0gbmV3IE9iamVjdFtwcmVBZGRpdGlvbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0gICAgICAgIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlQWRkaXRpb24ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCQkJCXByZUFkZGl0aW9uW2ldID0gcHJlQWRkaXRpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQkJT2JqZWN0W10gcG9zdEFkZGl0aW9uID0gbmV3IE9iamVjdFtwb3N0QWRkaXRpb25EZXNjcmlwdG9ycy5sZW5ndGhdOwotICAgICAgICAJCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3RBZGRpdGlvbi5sZW5ndGg7IGkrKykgewotICAgICAgICAJCQkJcG9zdEFkZGl0aW9uW2ldID0gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJCU9iamVjdCBuZXdBZGRpdGlvbiA9IGdldE5ld09iamVjdChwcmVBZGRpdGlvbiwgcG9zdEFkZGl0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIAkJCWlmIChuZXdBZGRpdGlvbiAhPSBudWxsKSAvLyBjYW4gdGhpcyBldmVyIGJlIG51bGw/Ci0gICAgICAgIAkJCQltb2RlbC5zZXRQcm9wZXJ0eShGQUNFVF9SVU5USU1FLCBuZXdBZGRpdGlvbik7Ci0JCSAgICAgICAgfQotCQkgICAgfTsKLQkJICAgIAotCQkgICAgbmV3UnVudGltZVNlbGVjdGlvblRocmVhZC5zdGFydCgpOwotCQkgICAgCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIG1vZGVsLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGludGVybmFsTGF1bmNoTmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gbGF1bmNoTmV3UnVudGltZVdpemFyZChzaGVsbCwgbW9kZWwsIGdldE1vZHVsZVR5cGVJRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUeXBlSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm87Ci0JcHJvdGVjdGVkIE5ld1Byb2plY3RHcm91cCBwcm9qZWN0TmFtZUdyb3VwOwotCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2M7Ci0JcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBmcGp3Y0xpc3RlbmVyOwotCi0JcHVibGljIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIAotCXsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCQotICAgICAgICB0aGlzLmZwandjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZwandjTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGp3Yy5hZGRMaXN0ZW5lciggdGhpcy5mcGp3Y0xpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlZBTElEQVRJT05fUFJPQkxFTVNfQ0hBTkdFRCApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBncm91cC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5UYXJnZXRSdW50aW1lKTsKLSAgICAgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8uc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQlCdXR0b24gbmV3U2VydmVyVGFyZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULk5PTkUpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuTmV3RG90RG90RG90KTsKLQkJbmV3U2VydmVyVGFyZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghaW50ZXJuYWxMYXVuY2hOZXdSdW50aW1lV2l6YXJkKGdldFNoZWxsKCksIG1vZGVsKSkgewotCQkJCQkvL0J1Z3ppbGxhIDEzNTI4OAotCQkJCQkvL3NldEVycm9yTWVzc2FnZShSZXNvdXJjZUhhbmRsZXIuSW52YWxpZFNlcnZlclRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde25ld1NlcnZlclRhcmdldEJ1dHRvbn07Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oc2VydmVyVGFyZ2V0Q29tYm8sIEZBQ0VUX1JVTlRJTUUsIGRlcHMpOwotCQlpZiAoc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSAmJiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRWaXNpYmxlSXRlbUNvdW50KCkgIT0gMCkKLQkJCXNlcnZlclRhcmdldENvbWJvLnNlbGVjdCgwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJRGF0YU1vZGVsIG5lc3RlZFByb2plY3RETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9QUk9KRUNUX0RNKTsKLQkJbmVzdGVkUHJvamVjdERNLmFkZExpc3RlbmVyKHRoaXMpOwotCQlwcm9qZWN0TmFtZUdyb3VwID0gbmV3IE5ld1Byb2plY3RHcm91cChwYXJlbnQsIG5lc3RlZFByb2plY3RETSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgCi0JewotCSAgICByZXR1cm4gVkFMSURBVElPTl9QUk9QRVJUSUVTOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2plY3ROYW1lR3JvdXAgIT0gbnVsbCkKLQkJCXByb2plY3ROYW1lR3JvdXAuZGlzcG9zZSgpOwotCQkKLQkJdGhpcy5mcGp3Yy5yZW1vdmVMaXN0ZW5lciggdGhpcy5mcGp3Y0xpc3RlbmVyICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCURhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLnNhdmVSdW50aW1lU2V0dGluZ3Moc2V0dGluZ3MsIG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5yZXN0b3JlUnVudGltZVNldHRpbmdzKHNldHRpbmdzLCBtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUnVudGltZVNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncywgSURhdGFNb2RlbCBtb2RlbCl7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBtcnVSdW50aW1lQXJyYXkgPSBzZXR0aW5ncy5nZXRBcnJheShNUlVfUlVOVElNRV9TVE9SRSk7Ci0JCQlMaXN0IG1ydVJ1bnRpbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYobXJ1UnVudGltZUFycmF5ICE9IG51bGwpCi0JCQkJbXJ1UnVudGltZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobXJ1UnVudGltZUFycmF5KSk7Ci0JCQkKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCQlTdHJpbmcgcnVudGltZU5hbWUgPSBydW50aW1lID09IG51bGwgPyBOVUxMX1JVTlRJTUUgOiBydW50aW1lLmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKG1ydVJ1bnRpbWVzLmNvbnRhaW5zKHJ1bnRpbWVOYW1lKSkgewotCQkJCW1ydVJ1bnRpbWVzLnJlbW92ZShydW50aW1lTmFtZSk7Ci0JCQl9Ci0JCQltcnVSdW50aW1lcy5hZGQoMCwgcnVudGltZU5hbWUpOwotCQkJd2hpbGUgKG1ydVJ1bnRpbWVzLnNpemUoKSA+IDUpIHsKLQkJCQltcnVSdW50aW1lcy5yZW1vdmUoNSk7Ci0JCQl9Ci0JCQltcnVSdW50aW1lQXJyYXkgPSBuZXcgU3RyaW5nW21ydVJ1bnRpbWVzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ydVJ1bnRpbWVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCW1ydVJ1bnRpbWVBcnJheVtpXSA9IChTdHJpbmcpIG1ydVJ1bnRpbWVzLmdldChpKTsKLQkJCX0KLQkJCXNldHRpbmdzLnB1dChNUlVfUlVOVElNRV9TVE9SRSwgbXJ1UnVudGltZUFycmF5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZVJ1bnRpbWVTZXR0aW5ncyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MsIElEYXRhTW9kZWwgbW9kZWwpewotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpIHsKLQkJCQlib29sZWFuIHJ1bnRpbWVTZXQgPSBmYWxzZTsKLQkJCQlTdHJpbmdbXSBtcnVSdW50aW1lQXJyYXkgPSBzZXR0aW5ncy5nZXRBcnJheShNUlVfUlVOVElNRV9TVE9SRSk7Ci0JCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCQlMaXN0IG1ydVJ1bnRpbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChtcnVSdW50aW1lQXJyYXkgPT0gbnVsbCkgewotCQkJCQlMaXN0IGRlZlJ1bnRpbWVzID0gUHJvZHVjdE1hbmFnZXIuZ2V0RGVmYXVsdFJ1bnRpbWVzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlZlJ1bnRpbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQkJCW1ydVJ1bnRpbWVzLmFkZCgoKElSdW50aW1lKSBpdGVyLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltcnVSdW50aW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtcnVSdW50aW1lQXJyYXkpKTsKLQkJCQl9Ci0JCQkJaWYgKCFtcnVSdW50aW1lcy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcnVSdW50aW1lcy5zaXplKCkgJiYgIXJ1bnRpbWVTZXQ7IGkrKykgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGgtMSAmJiAhcnVudGltZVNldDsgaisrKSB7Ci0JCQkJCQkJaWYgKG1ydVJ1bnRpbWVzLmdldChpKS5lcXVhbHMoKChJUnVudGltZSlkZXNjcmlwdG9yc1tqXS5nZXRQcm9wZXJ0eVZhbHVlKCkpLmdldE5hbWUoKSkpIHsKLQkJCQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBkZXNjcmlwdG9yc1tqXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQkJCQlydW50aW1lU2V0ID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighcnVudGltZVNldCAmJiBtcnVSdW50aW1lcy5nZXQoaSkuZXF1YWxzKE5VTExfUlVOVElNRSkpewotCQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgZGVzY3JpcHRvcnNbZGVzY3JpcHRvcnMubGVuZ3RoIC0xXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQkJCXJ1bnRpbWVTZXQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghcnVudGltZVNldCAmJiBkZXNjcmlwdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgZGVzY3JpcHRvcnNbMF0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBGaW5kIGZpcnN0IG5ld09iamVjdCB0aGF0IGlzIG5vdCBpbiB0aGUgb2xkT2JqZWN0cyBhcnJheSAodXNpbmcgIj09IikuCi0JICogCi0JICogQHBhcmFtIG9sZE9iamVjdHMKLQkgKiBAcGFyYW0gbmV3T2JqZWN0cwotCSAqIEByZXR1cm4gZmlyc3QgbmV3T2JqZWN0IG5vdCBmb3VuZCBpbiBvbGRPYmplY3RzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldE5ld09iamVjdChPYmplY3RbXSBvbGRPYmplY3RzLCBPYmplY3RbXSBuZXdPYmplY3RzKSB7Ci0JCWlmIChvbGRPYmplY3RzICE9IG51bGwgJiYgbmV3T2JqZWN0cyAhPSBudWxsICYmIG9sZE9iamVjdHMubGVuZ3RoIDwgbmV3T2JqZWN0cy5sZW5ndGgpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3T2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gbmV3T2JqZWN0c1tpXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZE9iamVjdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG9sZE9iamVjdHNbal0gPT0gb2JqZWN0KSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKQotCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCWlmIChvbGRPYmplY3RzID09IG51bGwgJiYgbmV3T2JqZWN0cyAhPSBudWxsICYmIG5ld09iamVjdHMubGVuZ3RoID09IDEpCi0JCQlyZXR1cm4gbmV3T2JqZWN0c1swXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBXb3JraW5nU2V0R3JvdXAgY3JlYXRlV29ya2luZ1NldEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZ1tdIHN1cHBvcnRlZFdvcmtpbmdTZXRUeXBlcykgewotCQlpZiAod29ya2luZ1NldEdyb3VwICE9IG51bGwpCi0JCQlyZXR1cm4gd29ya2luZ1NldEdyb3VwOwotCQl3b3JraW5nU2V0R3JvdXAgPSBuZXcgV29ya2luZ1NldEdyb3VwKGNvbXBvc2l0ZSwgc2VsZWN0aW9uLAotCQkJCXN1cHBvcnRlZFdvcmtpbmdTZXRUeXBlcyk7Ci0JCXJldHVybiB3b3JraW5nU2V0R3JvdXA7Ci0JfQotCQotCXByb3RlY3RlZCBXb3JraW5nU2V0R3JvdXAgY3JlYXRlV29ya2luZ1NldEdyb3VwUGFuZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nW10gd29ya2luZ1NldFR5cGVzKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBudWxsOwotCQlJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3VycmVudFNlbGVjdGlvbjsKLQkJfQotCQlXb3JraW5nU2V0R3JvdXAgZ3JvdXAgPSBjcmVhdGVXb3JraW5nU2V0R3JvdXAoY29tcG9zaXRlLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uLCB3b3JraW5nU2V0VHlwZXMpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfSAKLQkKLQlwdWJsaWMgSVdvcmtpbmdTZXRbXSBnZXRTZWxlY3RlZFdvcmtpbmdTZXRzKCkgewotCQlyZXR1cm4gd29ya2luZ1NldEdyb3VwID09IG51bGwgPyBuZXcgSVdvcmtpbmdTZXRbMF0gOiB3b3JraW5nU2V0R3JvdXAKLQkJCQkuZ2V0U2VsZWN0ZWRXb3JraW5nU2V0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTAzMWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JRmFjZXRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JV2l6YXJkQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSUZhY2V0V2l6YXJkUGFnZSwgSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCS8vIFRPRE8gZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyB3aXRob3V0IGNvbXByb21pc2luZyB0aGUgSURhdGFNb2RlbFdpemFyZAotCQkvLyBmcmFtZXdvcmsuCi0JCXN1cGVyKERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQl9KSwgcGFnZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpIHsKLQkJcmV0dXJuIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpemFyZENvbnRleHQoSVdpemFyZENvbnRleHQgY29udGV4dCkgewotCQkvLyBJbnRlbnRpb25hbGx5IGVtcHR5Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCkgewotCQkvLyBJbnRlbnRpb25hbGx5IGVtcHR5Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKGZpbmFsIE9iamVjdCBjb25maWcpIHsKLQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQotCQltb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvSVdzdFdlYlVJQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL0lXc3RXZWJVSUNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1YTlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvSVdzdFdlYlVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotcHVibGljIGludGVyZmFjZSBJV3N0V2ViVUlDb250ZXh0SWRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9XU1RfV0VCX1VJID0gIm9yZy5lY2xpcHNlLndzdC53ZWIudWkuIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TVEFUSUNfV0VCX1BST0pFQ1RfUEFHRTEgPSBQTFVHSU5fV1NUX1dFQl9VSSArICJ3ZWJ3MjAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU1RBVElDX1dFQl9QUk9KRUNUX1BBR0UyID0gUExVR0lOX1dTVF9XRUJfVUkgKyAid2VidzIxMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NUQVRJQ19XRUJfUFJPSkVDVF9QQUdFMyA9IFBMVUdJTl9XU1RfV0VCX1VJICsgIndlYncyMjAwIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL05ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL05ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZlYjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLldTVFdlYlVJUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIGV4dGVuZHMgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlOwotCXByaXZhdGUgSVdpemFyZFBhZ2VbXSBiZWdpbmluZ1BhZ2VzOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0JcHVibGljIE5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSAKLQl7Ci0JCXRoaXMubW9kZWwgPSAoIG1vZGVsID09IG51bGwgPyBjcmVhdGVEYXRhTW9kZWwoKSA6IG1vZGVsICk7Ci0JCXRoaXMudGVtcGxhdGUgPSBnZXRUZW1wbGF0ZSgpOwotCQkKLQkJc2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKSk7Ci0JCWdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5zZXRGaXhlZFByb2plY3RGYWNldHMoIHRoaXMudGVtcGxhdGUuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCXNldFNob3dGYWNldHNTZWxlY3Rpb25QYWdlKCBmYWxzZSApOwotCX0KLQkKLQlwdWJsaWMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkKCkgCi0JewotCSAgICB0aGlzKCBudWxsICk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHBhZ2UgdGhhdCBzaG93cyB1cCBiZWZvcmUgdGhlIGZhY2V0cyBwYWdlLiBJZiBtdWx0aXBsZSBwYWdlcyBhcmUgcmVxdWlyZWQsCi0JICogYWxzbyBvdmVycmlkZSB7QGxpbmsgI2NyZWF0ZUJlZ2luaW5nUGFnZXMoKX0uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKTsKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGFkZCBtb3JlIHRoYW4gb25lIHBhZ2UgYmVmb3JlIHRoZSBmYWNldHMgcGFnZS4gSWYgb25seSBvbmUgcGFnZQotCSAqIGlzIHJlcXVpcmVkLCB0aGVuIHVzZSB7QGxpbmsgI2NyZWF0ZUZpcnN0UGFnZSgpfS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCByZXR1cm4gdGhlCi0JICogcmVzdWx0IG9mIHtAbGluayAjY3JlYXRlRmlyc3RQYWdlKCl9LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2VbXSBjcmVhdGVCZWdpbmluZ1BhZ2VzKCkgewotCQlyZXR1cm4gbmV3IElXaXphcmRQYWdlW117Y3JlYXRlRmlyc3RQYWdlKCl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQliZWdpbmluZ1BhZ2VzID0gY3JlYXRlQmVnaW5pbmdQYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJlZ2luaW5nUGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZFBhZ2UoYmVnaW5pbmdQYWdlc1tpXSk7Ci0JCX0KLQotCQlzdXBlci5hZGRQYWdlcygpOwotCi0gICAgICAgIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5hZGRMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNldFNlbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfRkFDRVRTX0NIQU5HRUQKLSAgICAgICAgKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMoY29udGFpbmVyKTsKLQotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IHRoaXMudGVtcGxhdGUuZ2V0SW5pdGlhbFByZXNldCgpOwotICAgICAgICBmaW5hbCBJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBtb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRfUlVOVElNRSApOwotCi0gICAgICAgIGlmKCBwcmVzZXQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG5vIHByZXNldCBpcyBzcGVjaWZpZWQsIHNlbGVjdCB0aGUgcnVudGltZSBhbmQgaXQncyBkZWZhdWx0Ci0gICAgICAgICAgICAvLyBmYWNldHMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNldFJ1bnRpbWVBbmREZWZhdWx0RmFjZXRzKCBydW50aW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBwcmVzZXQgaXMgc3BlY2lmaWVkLCBzZWxlY3QgdGhlIHJ1bnRpbWUgb25seSBpZiBzdXBwb3J0cyBhbGwKLSAgICAgICAgICAgIC8vIG9mIHRoZSBmYWNldHMgaW5jbHVkZWQgaW4gdGhlIHByZXNldC4KLQotICAgICAgICAgICAgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLnNldFNlbGVjdGVkUHJlc2V0KCBwcmVzZXQuZ2V0SWQoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBydW50aW1lICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cHBvcnRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggISBydW50aW1lLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc3VwcG9ydHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5zZXRUYXJnZXRlZFJ1bnRpbWVzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHJ1bnRpbWUgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KCBGQUNFVF9SVU5USU1FLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN5bmNoUnVudGltZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRQYWdlcygpIHsKLQkJZmluYWwgSVdpemFyZFBhZ2VbXSBiYXNlID0gc3VwZXIuZ2V0UGFnZXMoKTsKLQkJZmluYWwgSVdpemFyZFBhZ2VbXSBwYWdlcyA9IG5ldyBJV2l6YXJkUGFnZVtiYXNlLmxlbmd0aCArIGJlZ2luaW5nUGFnZXMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJlZ2luaW5nUGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhZ2VzW2ldID0gYmVnaW5pbmdQYWdlc1tpXTsKLQkJfQotCi0JCVN5c3RlbS5hcnJheWNvcHkoYmFzZSwgMCwgcGFnZXMsIGJlZ2luaW5nUGFnZXMubGVuZ3RoLCBiYXNlLmxlbmd0aCk7Ci0KLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNoUnVudGltZXMoKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJvb2xlYW5bXSBzdXBwcmVzc0JhY2tFdmVudHMgPSB7IEJvb2xlYW4uRkFMU0UgfTsKLSAgICAgICAgCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSURhdGFNb2RlbC5WQUxVRV9DSEcgPT0gZXZlbnQuZ2V0RmxhZygpIHx8IElEYXRhTW9kZWwuREVGQVVMVF9DSEcgPT0gZXZlbnQuZ2V0RmxhZygpKSB7Ci0JCQkJCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHN1cHByZXNzQmFja0V2ZW50c1sgMCBdLmJvb2xlYW5WYWx1ZSgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGV2ZW50LmdldFByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UnVudGltZUFuZERlZmF1bHRGYWNldHMoIHJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLSAgICAgICAgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLmFkZExpc3RlbmVyCi0gICAgICAgICggCi0gICAgICAgICAgICBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc0JhY2tFdmVudHNbIDAgXSA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpLmdldFByaW1hcnlSdW50aW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc0JhY2tFdmVudHNbIDAgXSA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQKLSAgICAgICAgKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UnVudGltZUFuZERlZmF1bHRGYWNldHMoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZG0gPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0KLSAgICAgICAgZG0uc2V0VGFyZ2V0ZWRSdW50aW1lcyggQ29sbGVjdGlvbnMuPElSdW50aW1lPmVtcHR5U2V0KCkgKTsKLQotICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBtaW5GYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBkbS5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtaW5GYWNldHMuYWRkKCBmLmdldExhdGVzdFN1cHBvcnRlZFZlcnNpb24oIHJ1bnRpbWUgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRtLnNldFByb2plY3RGYWNldHMoIG1pbkZhY2V0cyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkbS5zZXRUYXJnZXRlZFJ1bnRpbWVzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHJ1bnRpbWUgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkbS5zZXRTZWxlY3RlZFByZXNldCggRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuREVGQVVMVF9DT05GSUdVUkFUSU9OX1BSRVNFVF9JRCApOwotICAgIH0KLSAgICAKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1GaW5pc2goZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCi0JdGhyb3dzIENvcmVFeGNlcHRpb24KLQotCXsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwKTsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCQl0cnkgewotCQkJc3VwZXIucGVyZm9ybUZpbmlzaChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDgpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRGYWNldFByb2plY3ROb3RpZmljYXRpb25PcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYoIG1zZyA9PSBudWxsICkgbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgV1NUV2ViVUlQbHVnaW4uUExVR0lOX0lELCAwLCBtc2csIGUgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHN1cGVyLnBlcmZvcm1GaW5pc2goKSA9PSBmYWxzZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBvc3RQZXJmb3JtRmluaXNoKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE92ZXJyaWRlIHRvIHJldHVybiB0aGUgZmluYWwgcGVyc3BlY3RpdmUgSUQgKGlmIGFueSkuIFRoZSBmaW5hbCBwZXJzcGVjdGl2ZSBJRCBjYW4gYmUKLQkgKiBoYXJkY29kZWQgYnkgdGhlIHN1YmNsYXNzIG9yIGRldGVybWluZWQgcHJvZ3JhbW1hdGljYWxseSAocG9zc2libHkgdXNpbmcgdGhlIHZhbHVlIG9mIGEgZmllbGQKLQkgKiBvbiB0aGUgV2l6YXJkJ3MgV1RQIE9wZXJhdGlvbiBEYXRhIE1vZGVsKS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBubyBwZXJzcGVjdGl2ZSBpZCB1bmxlc3Mgb3ZlcnJpZGVuIGJ5IHByb2R1Y3QgZGVmaW5pdGlvbgotCSAqIHZpYSB0aGUgInd0cC5wcm9qZWN0LmZpbmFsLnBlcnNwZWN0aXZlIiBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgUGVyc3BlY3RpdmUgd2hpY2ggaXMgcHJlZmVycmVkIGJ5IHRoaXMgd2l6YXJkIHVwb24gY29tcGxldGlvbi4KLQkgKi8KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpcyBzYXZlZCB0byB1c2Ugd2hlbiB0aGUgd2l6YXJkIGNvbXBsZXRlcyBpbiBvcmRlciB0byBjaGFuZ2UgdGhlCi0JICogY3VycmVudCBwZXJzcGVjdGl2ZSB1c2luZyBlaXRoZXIgKDEpIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkge0BsaW5rICNnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKX0KLQkgKiBvciAoMikgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgZmluYWxQZXJzcGVjdGl2ZSBhdHRyaWJ1dGUgaW4gdGhlIFdpemFyZCdzIGNvbmZpZ3VyYXRpb24KLQkgKiBlbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZyBhUHJvcGVydHlOYW1lLCBPYmplY3QgdGhlRGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGFDb25maWd1cmF0aW9uRWxlbWVudDsKLQkJZG9TZXRJbml0aWFsaXplRGF0YShhQ29uZmlndXJhdGlvbkVsZW1lbnQsIGFQcm9wZXJ0eU5hbWUsIHRoZURhdGEpOwotCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT3ZlcnJpZGUgbWV0aG9kIGZvciBjbGllbnRzIHRoYXQgd2lzaCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKLQkgKiB7QHNlZSAjc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nLCBPYmplY3QpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFDb25maWd1cmF0aW9uRWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBwcm92aWRlZCBmcm9tIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgotCSAqIEBwYXJhbSBhUHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkgbmFtZSBwcm92aWRlZCBmcm9tIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgotCSAqIEBwYXJhbSB0aGVEYXRhCi0JICogICAgICAgICAgICBUaGUgZGF0YSBwcm92aWRlZCBmcm9tIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0SW5pdGlhbGl6ZURhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIE9iamVjdCB0aGVEYXRhKSB7Ci0JCS8vIERlZmF1bHQgZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFuIGlkIGNvbXBvbmVudCB1c2VkIGZvciBBY3Rpdml0eSBmaWx0ZXJpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBQbHVnaW4gSUQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmaWVkIGluCi0JICoge0BzZWUgI3NldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZywgT2JqZWN0KX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGx1Z2luIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgPyBjb25maWd1cmF0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogPHA+Ci0JICogSW52b2tlZCBhZnRlciB0aGUgdXNlciBoYXMgY2xpY2tlZCB0aGUgIkZpbmlzaCIgYnV0dG9uIG9mIHRoZSB3aXphcmQuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgZmluYWwgcGVyc3BlY3RpdmUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieQotCSAqIHtAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgfQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkI3Bvc3RQZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByb2pOYW1lID0gZ2V0UHJvamVjdE5hbWUoKTsKLQkJSVByb2plY3QgbmV3UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qTmFtZSk7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gV1NUV2ViVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkKLQkJLy8gYWRkIHRvIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldHMKLQkJaWYgKG5ld1Byb2plY3QgIT0gbnVsbCAmJiAKLQkJCQliZWdpbmluZ1BhZ2VzICE9IG51bGwgJiYgCi0JCQkJYmVnaW5pbmdQYWdlcy5sZW5ndGggPiAwICYmIAotCQkJCWJlZ2luaW5nUGFnZXNbMF0gaW5zdGFuY2VvZiBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZSkgewotCQkJRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UgbWFpblBhZ2UgPSAoRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UpIGJlZ2luaW5nUGFnZXNbMF07Ci0JCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gbWFpblBhZ2UuZ2V0U2VsZWN0ZWRXb3JraW5nU2V0cygpOwotCQkJd29ya2JlbmNoLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuYWRkVG9Xb3JraW5nU2V0cyhuZXdQcm9qZWN0LCB3b3JraW5nU2V0cyk7Ci0JCX0KLQkJCi0JCS8vIG9wZW4gdGhlICJmaW5hbCIgcGVyc3BlY3RpdmUKLQkJaWYgKGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpICE9IG51bGwgJiYgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG5ldyBEZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50KGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JCQkJCWlmIChhTmFtZS5lcXVhbHMoImZpbmFsUGVyc3BlY3RpdmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShhTmFtZSk7Ci0JCQkJfQotCQkJfTsKLQkJCUJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkLnVwZGF0ZVBlcnNwZWN0aXZlKGVsZW1lbnQpOwotCQl9IGVsc2UKLQkJCUJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkLnVwZGF0ZVBlcnNwZWN0aXZlKGNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLQotCQkvLyBzZWxlY3QgYW5kIHJldmVhbAotCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChuZXdQcm9qZWN0LCB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldEZhY2V0UHJvamVjdE5vdGlmaWNhdGlvbk9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwobmV3IEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKHRoaXMubW9kZWwpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQkJcmV0dXJuIE5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCXJldHVybiBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBrZWVwIHRoZSBtb2RlbCBpbiBzeW5jIHdpdGggdGhlIFVJLiBUaGlzIG1ldGhvZCB3aWxsIHBpY2t1cCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotCSAqIFVJIGFuZCBwdXNoIHRoZW0gaW50byB0aGUgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmYWNldFNlbGVjdGlvbkNoYW5nZWRFdmVudCgpIHsKLQkgICAgU2V0IGFjdGlvbnMgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJU2V0IGFjdGl2ZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uID0gKElGYWNldGVkUHJvamVjdC5BY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKTsKLQkJCWFjdGl2ZUlkcy5hZGQoaWQpOwotCQl9Ci0JCS8vIEZpcnN0IGhhbmRsZSBhbGwgdGhlIGFjdGlvbnMgdHJhY2tlZCBieSBJRGF0YU1vZGVscwotCQlGYWNldERhdGFNb2RlbE1hcCBkYXRhTW9kZWxNYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7Ci0JCWl0ZXJhdG9yID0gZGF0YU1vZGVsTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlEYXRhTW9kZWwgY29uZmlnRE0gPSAoSURhdGFNb2RlbCkgZGF0YU1vZGVsTWFwLmdldChpZCk7Ci0JCQlib29sZWFuIGFjdGl2ZSA9IGFjdGl2ZUlkcy5jb250YWlucyhpZCk7Ci0JCQljb25maWdETS5zZXRCb29sZWFuUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5TSE9VTERfRVhFQ1VURSwgYWN0aXZlKTsKLQkJCWFjdGl2ZUlkcy5yZW1vdmUoaWQpOwotCQl9Ci0JCS8vIE5vdyBoYW5kbGUgdGhlIGFjdGlvbnMgbm90IHRyYWNrZWQgYnkgSURhdGFNb2RlbHMKLQkJRmFjZXRBY3Rpb25NYXAgYWN0aW9uTWFwID0gKEZhY2V0QWN0aW9uTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShGQUNFVF9BQ1RJT05fTUFQKTsKLQkJYWN0aW9uTWFwLmNsZWFyKCk7Ci0JCWl0ZXJhdG9yID0gYWN0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA9IChJRmFjZXRlZFByb2plY3QuQWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpLmdldElkKCk7Ci0JCQlpZiAoYWN0aXZlSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCWFjdGlvbk1hcC5hZGQoYWN0aW9uKTsKLQkJCX0KLQkJfQotCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykKLQkJCXN0b3JlRGVmYXVsdFNldHRpbmdzKHBhZ2VzW2ldLCBpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiB0aGV5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgd2hlbiBzdG9yaW5nIHRoZSBkZWZhdWx0Ci0JICogc2V0dGluZ3MgZm9yIGEgcGFydGljdWxhciBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogQHBhcmFtIHBhZ2VJbmRleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKElXaXphcmRQYWdlIHBhZ2UsIGludCBwYWdlSW5kZXgpIHsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmRQYWdlKQotCQkJKChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlKS5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGU3NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRJbnN0YWxsUGFnZSBleHRlbmRzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwcml2YXRlIExhYmVsIGNvbmZpZ0ZvbGRlckxhYmVsOwotCXByaXZhdGUgVGV4dCBjb25maWdGb2xkZXI7Ci0JcHJpdmF0ZSBMYWJlbCBjb250ZXh0Um9vdExhYmVsOwotCXByaXZhdGUgVGV4dCBjb250ZXh0Um9vdDsKLQkKLQlwdWJsaWMgU2ltcGxlV2ViRmFjZXRJbnN0YWxsUGFnZSgpIHsKLQkJc3VwZXIoInNpbXBsZXdlYi5mYWNldC5pbnN0YWxsLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZUhhbmRsZXIuQ29uZmlndXJlU2V0dGluZ3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtDT05URU5UX0RJUn07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNldEluZm9wb3BJRChJV3N0V2ViVUlDb250ZXh0SWRzLk5FV19TVEFUSUNfV0VCX1BST0pFQ1RfUEFHRTMpOwotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJdGhpcy5jb250ZXh0Um9vdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0aGlzLmNvbnRleHRSb290TGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuU3RhdGljQ29udGV4dFJvb3RDb21wb3NpdGVfQ29udGV4dF9Sb290X0xhYmVsKTsKLQkJdGhpcy5jb250ZXh0Um9vdExhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQotCQl0aGlzLmNvbnRleHRSb290ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGhpcy5jb250ZXh0Um9vdC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCXRoaXMuY29udGV4dFJvb3Quc2V0RGF0YSgibGFiZWwiLCB0aGlzLmNvbnRleHRSb290TGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChjb250ZXh0Um9vdCwgQ09OVEVYVF9ST09ULCBuZXcgQ29udHJvbFtde2NvbnRleHRSb290TGFiZWx9KTsKLQkJCi0JCWNvbmZpZ0ZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb25maWdGb2xkZXJMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlX1dlYl9Db250ZW50X0xhYmVsKTsKLQkJY29uZmlnRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCi0JCWNvbmZpZ0ZvbGRlciA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWNvbmZpZ0ZvbGRlci5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCWNvbmZpZ0ZvbGRlci5zZXREYXRhKCJsYWJlbCIsIGNvbmZpZ0ZvbGRlckxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY29uZmlnRm9sZGVyLCBDT05URU5UX0RJUiwgbnVsbCk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYlByb2plY3RGaXJzdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlM2VkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLldTVFdlYlVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBTaW1wbGVXZWJQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9EZXNjcmlwdGlvbik7IAotCQlzZXRUaXRsZShSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGUpOyAKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTVFdlYlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld3dwcmpfd2l6IikpOyAvLyROT04tTkxTLTEkCi0JCXNldEluZm9wb3BJRChJV3N0V2ViVUlDb250ZXh0SWRzLk5FV19TVEFUSUNfV0VCX1BST0pFQ1RfUEFHRTEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVR5cGVJRCgpIHsKLQkJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgICBjcmVhdGVXb3JraW5nU2V0R3JvdXBQYW5lbCh0b3AsIG5ldyBTdHJpbmdbXSB7IFJFU09VUkNFX1dPUktJTkdfU0VUIH0pOwotCQlyZXR1cm4gdG9wOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYlByb2plY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGU3MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLldTVFdlYlVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViUHJvamVjdFdpemFyZCBleHRlbmRzIE5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZCB7Ci0KLQlwdWJsaWMgU2ltcGxlV2ViUHJvamVjdFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoUmVzb3VyY2VIYW5kbGVyLlN0YXRpY1dlYlByb2plY3RDcmVhdGlvbldpemFyZF9XaXphcmRfVGl0bGUpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVXZWJQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdENyZWF0aW9uV2l6YXJkX1dpemFyZF9UaXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFNpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFdTVFdlYlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld3dwcmpfd2l6Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUud3N0LndlYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVXZWJQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfU1RBVElDV0VCKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldGNyZWF0aW9ucGFnZW1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXRjcmVhdGlvbnBhZ2VtZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRiYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldGNyZWF0aW9ucGFnZW1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1GQUNFVF9WRVJTSU9OPSB2ZXJzaW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhOTBmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3RhdGljX3dlYl9wcm9qZWN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDA4NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotcnVudGltZQotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2NTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjVjMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM5OjE4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk5OTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud2ViOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5XU1RXZWJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LAotIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5mYWNldCwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDU4NTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLgotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHN0YXRpY193ZWJfcHJvamVjdC8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjA3Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53ZWIiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2Vic3RhdGljX2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTMxZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2Vic3RhdGljX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkZDA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGE2ODkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuCi0jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFNpbXBsZSBXZWIgUGx1Zy1pbgotCi1TSU1QTEVfV0VCX0xBQkVMPVN0YXRpYyBXZWIgTW9kdWxlCi1TSU1QTEVfV0VCX0RFU0NSSVBUSU9OPUVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBzdGF0aWMgd2ViIG1vZHVsZS4KLVNJTVBMRV9XRUJfVEVNUExBVEU9U3RhdGljIFdlYiBQcm9qZWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkOGI0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZVByZXNldE1hcHBpbmdzIiBuYW1lPSJSdW50aW1lIFByZXNldCBNYXBwaW5ncyBFeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVQcmVzZXRNYXBwaW5ncy5leHNkIi8+IAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVGYWN0b3JpZXMiPgotICAgICAgPG1vZHVsZUZhY3RvcnkKLSAgICAgICAgICAgIHByb2plY3RzPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5zdGF0aWMiPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuMiwgMS4zLCAxLjQiCi0gICAgICAgICAgICAgICB0eXBlcz0id3N0LndlYiI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICA8L21vZHVsZUZhY3Rvcnk+Ci0gICAgIDwvZXh0ZW5zaW9uPgotICAgICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJzdGF0aWMxIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJzdGF0aWMyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+ICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLlN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyIgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuSVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0Ii8+Ci0gICAgICAgIDwvZmFjdG9yeT4gICAgCi0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPCEtLSBCdWlsZGVyIFByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMtLT4KLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgIAk8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9IndzdC53ZWIuYnVpbGRlciIKLSAgICAgIAkJcHJvdmlkZXJJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuV29ya2JlbmNoQ29tcG9uZW50QnVpbGRlckRhdGFNb2RlbFByb3ZpZGVyIi8+Ci0JCTxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uLlNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5vcGVyYXRpb24uU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciIvPgotCTwvZXh0ZW5zaW9uPgotCQotICA8IS0tIFByb2plY3QgRmFjZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0id3N0LndlYiI+Ci0gICAgICA8bGFiZWw+JVNJTVBMRV9XRUJfTEFCRUw8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPiVTSU1QTEVfV0VCX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoaWRlLnZlcnNpb24iIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0id3N0LndlYiIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iaW5zdGFsbCIgaWQ9IndzdC53ZWIuaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgICAgPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgICA8YWN0aW9uIHR5cGU9InVuaW5zdGFsbCIgaWQ9IndzdC53ZWIudW5pbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5TaW1wbGVXZWJGYWNldFVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAgICAgCi0gICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS53c3Qud2ViIj4KLSAgICAgIDxsYWJlbD4lU0lNUExFX1dFQl9URU1QTEFURTwvbGFiZWw+Ci0gICAgICA8Zml4ZWQgZmFjZXQ9IndzdC53ZWIiLz4KLSAgICA8L3RlbXBsYXRlPgotCi0gIDwvZXh0ZW5zaW9uPgkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3Byb3BlcnR5X2ZpbGVzL3N0YXRpY3dlYnByb2plY3QucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wcm9wZXJ0eV9maWxlcy9zdGF0aWN3ZWJwcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYWE3NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3Byb3BlcnR5X2ZpbGVzL3N0YXRpY3dlYnByb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVN0YXRpY1dlYlByb2plY3RDcmVhdGlvbldpemFyZF9XaXphcmRfVGl0bGU9TmV3IFN0YXRpYyBXZWIgUHJvamVjdAotU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfRGVzY3JpcHRpb249Q3JlYXRlIGEgV2ViIHByb2plY3QgZm9yIHNpbXBsZSBjb250ZW50IChIVE1MIGZpbGVzKSBvbmx5LgotU3RhdGljV2ViU2V0dGluZ3NQcm9wZXJ0aWVzUGFnZV9XZWJfQ29udGVudF9MYWJlbD1XZWIgY29udGVudCBmb2xkZXIgbmFtZToKLVN0YXRpY0NvbnRleHRSb290Q29tcG9zaXRlX0NvbnRleHRfUm9vdF9MYWJlbD1Db250ZXh0IHJvb3QKLVN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX1RpdGxlPVN0YXRpYyBXZWIgUHJvamVjdAotU3RhdGljV2ViU2V0dGluZ3NQcm9wZXJ0aWVzUGFnZV9Ob3RfYXZhaWxhYmxlX2Zvcl9jbG9zZWRfcHJvamVjdHM9V2ViIHNldHRpbmdzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhIGNsb3NlZCBwcm9qZWN0LgotVGFyZ2V0UnVudGltZT1UYXJnZXQgcnVudGltZQotTmV3RG90RG90RG90PU4mZXcuLi4KLUludmFsaWRTZXJ2ZXJUYXJnZXQ9SW52YWxpZCB0YXJnZXQgc2VydmVyIHNlbGVjdGVkLgotQ29uZmlndXJlU2V0dGluZ3M9Q29uZmlndXJlIFN0YXRpYyBXZWIgbW9kdWxlIHNldHRpbmdzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zY2hlbWEvcnVudGltZVByZXNldE1hcHBpbmdzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc2NoZW1hL3J1bnRpbWVQcmVzZXRNYXBwaW5ncy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDI3MTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zY2hlbWEvcnVudGltZVByZXNldE1hcHBpbmdzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndlYiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud2ViIiBpZD0iUnVudGltZVByZXNldE1hcHBpbmdzIiBuYW1lPSJSdW50aW1lIFByZXNldCBNYXBwaW5ncyBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZGVmYXVsdCBmYWNldCBwcmVzZXQgZm9yIGFueSBSdW50aW1lIFR5cGUgSUQsIEZhY2V0IElEICZhbXA7IEZhY3QgVmVyc2lvbiBjb21iaW5hdGlvbi4gIEZvciBleGFtcGxlLCBnaXZlbiBydW50aW1lIHR5cGUgWCwgZmFjZXQganN0LndlYiwgYW5kIHZlcnNpb24gMi40LCB0aGUgcHJlc2V0IFkgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgd2hlcmUgYXMgZ2l2ZW4gcnVudGltZSB0eXBlIFgsIGZhY2V0IGpzdC53ZWIsIGFuZCB2ZXJzaW9uIDIuNSwgdGhlIHByZXNldCBaIHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgotCi1Gb3IgZWFjaCBvZiB0aGUgZm91ciBmYWNldFJ1bnRpbWVUeXBlSUQsIGZhY2V0UnVudGltZVZlcnNpb24sIGZhY2V0SUQsIGZhY2V0VmVyc2lvbiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gaXMgdXNlZCB0byBlYXNlIHRoZSBkZWZpbml0aW9uIHByb2Nlc3MuICBUaGUgcGF0dGVybiBzcGVjaWZpZWQgYWxsb3dzIGEgY29tbWEgZGVsaW1pbmF0ZWQgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMuICBGb3IgZXhhbXBsZSB0byBtYXRjaCBvbmx5ICZxdW90OzEuMCZxdW90OyB0aGUgcGF0dGVybiBzaG91bGQgYmUgJnF1b3Q7MS4wJnF1b3Q7LiAgVG8gbWF0Y2ggbXVsdGlwbGUgdmFsdWVzLCBzYXkgMS4wLCAyLjAsIGFuZCAzLjAsIHVzZSAmcXVvdDsxLjAsMi4wLDMuMCZxdW90Oy4gIEFzdGVyZXN0cyBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIHZhbHVlcy4gIEZvciBleGFtcGxlLCAmcXVvdDsxLiomcXVvdDsgd2lsbCBtYXRjaCBhbnkgdmFsdWVzIHN0YXJ0aW5nIHdpdGggJmFwb3M7MS4mYXBvczsgaW5jbHVkaW5nIDEuLCAxLjAsIDEuMSwgMS4yLCBidXQgbm90IDEgIExpa2V3aXNlLCAmcXVvdDsqLjAmcXVvdDsgd2lsbCBtYXRjaCBhbnkgdmFsdWVzIGVuZGluZyB3aXRoICZhcG9zOy4wJmFwb3M7IGluY2x1ZGluZyAxLjAsIDIuMCwgMy4wLCBidXQgbm90IDEgb3IgMCAgQXN0ZXJpc3RzIG1heSBiZSBhZGRlZCBib3RoIGF0IHRoZSBiZWdpbmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nLCBzbyAmcXVvdDsqMDAqJnF1b3Q7IHdpbGwgbWF0Y2ggYW55IHN0cmluZyB0aGF0IGNvbnRhaW5zICZhcG9zOzAwJmFwb3M7IHN1Y2ggYXMgMDAsIDEwMCwgMTAwMS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcHBpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFwcGluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRWFjaCBtYXBwaW5nIGVsZW1lbnQgZGVmaW5lZHMgYSBtYXBwaW5nIGZyb20gKHJ1bnRpbWVpZCwgZmFjZXRpZCwgZmFjZXR2ZXJzaW9uKSB0byBwcmVzZXRpZC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXRSdW50aW1lVHlwZUlEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEZvbGxvd3MgdGhlIHBhdHRlcm4gb3V0bGluZWQgaW4gdGhlIG92ZXJ2aWV3Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXRSdW50aW1lVmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGb2xsb3dzIHRoZSBwYXR0ZXJuIG91dGxpbmVkIGluIHRoZSBvdmVydmlldwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRm9sbG93cyB0aGUgcGF0dGVybiBvdXRsaW5lZCBpbiB0aGUgb3ZlcnZpZXcKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldFZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRm9sbG93cyB0aGUgcGF0dGVybiBvdXRsaW5lZCBpbiB0aGUgb3ZlcnZpZXcKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVzZXRJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVByb2R1Y3RDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVByb2R1Y3RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNjU1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lQcm9kdWN0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQ7Ci0KLS8qKgotICogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgc2V0IG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIHBsdWdpbmcgZXhwZWN0cyB0bwotICogYmUgYXZhaWxhYmxlIHZpYSA8Y29kZT5JUHJvZHVjdC5nZXRQcm9wZXJ0eShTdHJpbmcpPC9jb2RlPi4gVGhlIHN0YXR1cyBvZgotICogdGhpcyBpbnRlcmZhY2UgYW5kIHRoZSBmYWNpbGl0aWVzIG9mZmVyZWQgaXMgaGlnaGx5IHByb3Zpc2lvbmFsLiAKLSAqIFByb2R1Y3RpemF0aW9uIHN1cHBvcnQgd2lsbCBiZSByZXZpZXdlZCBhbmQgcG9zc2libHkgbW9kaWZpZWQgaW4gZnV0dXJlIAotICogcmVsZWFzZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldFByb3BlcnR5KFN0cmluZykKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9kdWN0Q29uc3RhbnRzIHsgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUiA9ICJlYXJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX0ZPTERFUiA9ICJ3ZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DT05URU5UX0ZPTERFUiA9ICJlamJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIgPSAiYXBwQ2xpZW50Q29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfQ09OVEVOVF9GT0xERVIgPSAiamNhQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPVVJDRV9GT0xERVIgPSAiZGVmYXVsdFNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSX0JZX0RFRkFVTFQgPSAiYWRkVG9FYXJCeURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPTERFUiA9ICJvdXRwdXRGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NJTkdMRV9ST09UX1NUUlVDVFVSRSA9ICJ1c2VTaW5nbGVSb290U3RydWN0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXID0gImlkUGVyc3BlY3RpdmVIaWVyYXJjaHlWaWV3IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotICAgICAqIEFsdGVycyB0aGUgZmluYWwgcGVyc3BlY3RpdmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIG5ldyBwcm9qZWN0IHdpemFyZHMKLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9XRUIgPSAiZmluYWxQZXJzcGVjdGl2ZVdlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9FSkIgPSAiZmluYWxQZXJzcGVjdGl2ZUVqYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9FQVIgPSAiZmluYWxQZXJzcGVjdGl2ZUVhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9BUFBDTElFTlQgPSAiZmluYWxQZXJzcGVjdGl2ZUFwcENsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9KQ0EgPSAiZmluYWxQZXJzcGVjdGl2ZUpjYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9VVElMSVRZID0gImZpbmFsUGVyc3BlY3RpdmVVdGlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1BFUlNQRUNUSVZFX1NUQVRJQ1dFQiA9ICJmaW5hbFBlcnNwZWN0aXZlU3RhdGljV2ViIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEFiaWxpdHkgdG8gZGVmYXVsdCBpbml0aWFsIHJ1bnRpbWVzIGNob3NlbiBpbiB3aXphcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FXzEgPSAiZGVmYXVsdFJ1bnRpbWUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV8yID0gImRlZmF1bHRSdW50aW1lMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfMyA9ICJkZWZhdWx0UnVudGltZTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX1NZTkNfRk9SX1dFQlNFUlZJQ0VTID0gInZpZXdlclN5bmNGb3JXZWJzZXJ2aWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMjYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCS8qKgotCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgSXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBhbmQgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBfcHJvdmlkZXJfY2xhc3MgPSBTaW1wbGVXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVIgPSAiSVN0YXRpY1dlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklTdGF0aWNXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvUHJvZHVjdE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvUHJvZHVjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5YWEyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1Byb2R1Y3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFByb2R1Y3RNYW5hZ2VyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgdmFsdWVzIGZvciBXVFAgbGV2ZWwgcHJvZHVjdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUiA9ICJFYXJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09OVEVOVF9GT0xERVIgPSAiV2ViQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NPTlRFTlRfRk9MREVSID0gImVqYk1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUiA9ICJhcHBDbGllbnRNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9DT05URU5UX0ZPTERFUiA9ICJjb25uZWN0b3JNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09VUkNFX0ZPTERFUiA9ICJzcmMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UT19FQVJfQllfREVGQVVMVCA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPTERFUiA9ICJidWlsZC9jbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfU0lOR0xFX1JPT1RfU1RSVUNUVVJFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfU1lOQ19GT1JfV0VCU0VSVklDRVMgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlVOVElNRV9TRVBBUkFUT1IgPSAnOic7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9SVU5USU1FX0tFWVMgPSAKLQkJCQkJCQluZXcgU3RyaW5nW117SVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzEsCi0JCQkJCQkJCQkJSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzIsCi0JCQkJCQkJCQkJSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzN9OwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhc3NvY2lhdGVkIGtleSBmcm9tIHRoZSBQbGF0Zm9ybSBQcm9kdWN0IHJlZ2lzdHJ5IG9yIHJldHVybiB0aGUKLQkgKiBXVFAgZGVmYXVsdCBmb3IgdGhlIEoyRUUgY2FzZXMuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHByb2R1Y3QncyBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWlmIChQbGF0Zm9ybS5nZXRQcm9kdWN0KCkhPW51bGwpCi0JCQl2YWx1ZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIpKQotCQkJCXJldHVybiBBUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUjsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSKSkKLQkJCQlyZXR1cm4gV0VCX0NPTlRFTlRfRk9MREVSOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5FSkJfQ09OVEVOVF9GT0xERVIpKQotCQkJCXJldHVybiBFSkJfQ09OVEVOVF9GT0xERVI7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIpKQotCQkJCXJldHVybiBBUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5KQ0FfQ09OVEVOVF9GT0xERVIpKQotCQkJCXJldHVybiBKQ0FfQ09OVEVOVF9GT0xERVI7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfU09VUkNFX0ZPTERFUikpCi0JCQkJcmV0dXJuIERFRkFVTFRfU09VUkNFX0ZPTERFUjsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuQUREX1RPX0VBUl9CWV9ERUZBVUxUKSkKLQkJCQlyZXR1cm4gQUREX1RPX0VBUl9CWV9ERUZBVUxUOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5VU0VfU0lOR0xFX1JPT1RfU1RSVUNUVVJFKSkKLQkJCQlyZXR1cm4gVVNFX1NJTkdMRV9ST09UX1NUUlVDVFVSRTsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuVklFV0VSX1NZTkNfRk9SX1dFQlNFUlZJQ0VTKSkKLQkJCQlyZXR1cm4gVklFV0VSX1NZTkNfRk9SX1dFQlNFUlZJQ0VTOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5PVVRQVVRfRk9MREVSKSkKLQkJCQlyZXR1cm4gT1VUUFVUX0ZPTERFUjsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcpKQotCQkJCXJldHVybiBJRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVzsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfQVBQQ0xJRU5UKSkKLQkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0VBUikpCi0JCQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9FSkIpKQotCQkJCXJldHVybiBGSU5BTF9QRVJTUEVDVElWRTsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfSkNBKSkKLQkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1NUQVRJQ1dFQikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1VUSUxJVFkpKQotCQkJCXJldHVybiBGSU5BTF9QRVJTUEVDVElWRTsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfV0VCKSkKLQkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkQWRkVG9FQVJCeURlZmF1bHQoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFERF9UT19FQVJfQllfREVGQVVMVCk7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlU2luZ2xlUm9vdFN0cnVjdHVyZSgpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuVVNFX1NJTkdMRV9ST09UX1NUUlVDVFVSRSk7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlVmlld2VyU3luY0ZvcldlYnNlcnZpY2VzKCkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5WSUVXRVJfU1lOQ19GT1JfV0VCU0VSVklDRVMpOwotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QvKjxJUnVudGltZT4qLyBnZXREZWZhdWx0UnVudGltZXMoKSB7Ci0JCUxpc3QgdGhlUnVudGltZXMgPSBudWxsOwotCQlTZXQgcnVudGltZXMgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpOwotCQlpZiAoIXJ1bnRpbWVzLmlzRW1wdHkoKSkgewotCQkJSVJ1bnRpbWUgZGVmYXVsdFJ1bnRpbWUgPSBudWxsOwotCQkJLy8JRmlyc3QgY2hlY2sgaWYgZGVmYXVsdHMgYXJlIGRlZmluZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVF9SVU5USU1FX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWZhdWx0UnVudGltZSA9IGdldE1hdGNoaW5nUnVudGltZShERUZBVUxUX1JVTlRJTUVfS0VZU1tpXSwgcnVudGltZXMpOwotCQkJCWlmIChkZWZhdWx0UnVudGltZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0aGVSdW50aW1lcyA9PSBudWxsKSB7Ci0JCQkJCQl0aGVSdW50aW1lcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCQkJCX0KLQkJCQkJdGhlUnVudGltZXMuYWRkKGRlZmF1bHRSdW50aW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoZVJ1bnRpbWVzID09IG51bGwpIHsKLQkJCXRoZVJ1bnRpbWVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gdGhlUnVudGltZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElSdW50aW1lIGdldE1hdGNoaW5nUnVudGltZShTdHJpbmcgZGVmYXVsdFByb2R1Y3RSdW50aW1lUHJvcGVydHksIFNldCBydW50aW1lcykgewotCQlTdHJpbmcgZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5ID0gZ2V0UHJvcGVydHkoZGVmYXVsdFByb2R1Y3RSdW50aW1lUHJvcGVydHkpOwotCQlpZiAoZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5ID09IG51bGwgfHwgZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vVGhlIGRlZmF1bHRQcm9kdWN0UnVudGltZUtleSBuZWVkcyB0byBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdAotCQkvLzxmYWNldCBydW50aW1lIGlkPjo8ZmFjZXQgdmVyc2lvbj4uCi0JCWludCBzZXBlcmF0b3JJbmRleCA9IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5pbmRleE9mKFJVTlRJTUVfU0VQQVJBVE9SKTsKLQkJaWYgKHNlcGVyYXRvckluZGV4IDwgMCAmJiBzZXBlcmF0b3JJbmRleCA8IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5sZW5ndGgoKSkgewotCQkJLy9Db25zaWRlciB0aHJvd2luZyBhbiBleGNlcHRpb24gaGVyZS4KLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW52YWxpZCBkZWZhdWx0IHByb2R1Y3QgcnVudGltZSBpZC4gIEl0IHNob3VsZCBmb2xsb3cgdGhlIGZvcm1hdCA8ZmFjZXQgcnVudGltZSBpZD46PGZhY2V0IHZlcnNpb24+LiAgSWQgcHJvY2Vzc2VkOiAiICsgZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBkZWZhdWx0UnVudGltZUlEID0gZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5LnN1YnN0cmluZygwLCBzZXBlcmF0b3JJbmRleCk7Ci0JCVN0cmluZyBkZWZhdWx0RmFjZXRWZXJzaW9uID0gZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5LnN1YnN0cmluZyhzZXBlcmF0b3JJbmRleCArIDEpOwotCQlmb3IgKEl0ZXJhdG9yIHJ1bnRpbWVJdCA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7IHJ1bnRpbWVJdC5oYXNOZXh0KCk7KSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBydW50aW1lSXQubmV4dCgpOwotCQkJTGlzdCBydW50aW1lQ29tcHMgPSBydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCk7Ci0JCQlpZiAoIXJ1bnRpbWVDb21wcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNvbXBzSXRlciA9IHJ1bnRpbWVDb21wcy5pdGVyYXRvcigpOyBjb21wc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJUnVudGltZUNvbXBvbmVudCBydW50aW1lQ29tcCA9IChJUnVudGltZUNvbXBvbmVudCkgY29tcHNJdGVyLm5leHQoKTsKLQkJCQkJaWYgKGRlZmF1bHRSdW50aW1lSUQuZXF1YWxzKHJ1bnRpbWVDb21wLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkuZ2V0SWQoKSkgJiYKLQkJCQkJCShkZWZhdWx0RmFjZXRWZXJzaW9uLmVxdWFscyhydW50aW1lQ29tcC5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKSkpKSB7Ci0JCQkJCQkJcmV0dXJuIHJ1bnRpbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9ObyBtYXRjaGVzIGZvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzQ1MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIFNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoQ09OVEVOVF9ESVIpOwotCQluYW1lcy5hZGQoQ09OVEVYVF9ST09UKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVOVF9ESVIpKSB7Ci0JCQlyZXR1cm4gIldlYkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05URVhUX1JPT1QpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX0lEKSkgewotCQkJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05URVhUX1JPT1QsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM1NmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXZWJGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQlhZGROYXR1cmVzKHByb2plY3QpOwotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGZhbHNlKTsKLQkJCWMuY3JlYXRlKDAsIG51bGwpOwotCQkJCi0JCQlmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJZmluYWwgSVBhdGggcGpwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJZmluYWwgSVBhdGggY29udGVudGRpciA9IHNldENvbnRlbnRQcm9wZXJ0eUlmTmVlZGVkKG1vZGVsLCBwanBhdGgsIHByb2plY3QpOwotCQkJbWtkaXJzKHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY29udGVudGRpcikpOwotCQkJCi0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciB3ZWJyb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlpZiAod2Vicm9vdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl3ZWJyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIpKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJQ29tcG9uZW50VXRpbGl0aWVzLnNldFNlcnZlckNvbnRleHRSb290KHByb2plY3QsbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UKSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVBhdGggc2V0Q29udGVudFByb3BlcnR5SWZOZWVkZWQoZmluYWwgSURhdGFNb2RlbCBtb2RlbCwgZmluYWwgSVBhdGggcGpwYXRoLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGMuZXhpc3RzKCkpIHsKLQkJCWlmKCAhYy5nZXRSb290Rm9sZGVyKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmlzUm9vdCgpICl7Ci0JCQkJcmV0dXJuIGMuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBqcGF0aC5hcHBlbmQobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmF0dXJlcyhmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZmluYWwgU3RyaW5nW10gY3VycmVudCA9IGRlc2MuZ2V0TmF0dXJlSWRzKCk7Ci0JCWZpbmFsIFN0cmluZ1tdIHJlcGxhY2VtZW50ID0gbmV3IFN0cmluZ1tjdXJyZW50Lmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnQsIDAsIHJlcGxhY2VtZW50LCAwLCBjdXJyZW50Lmxlbmd0aCk7Ci0JCXJlcGxhY2VtZW50W2N1cnJlbnQubGVuZ3RoXSA9IElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRDsKLQkJZGVzYy5zZXROYXR1cmVJZHMocmVwbGFjZW1lbnQpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBJRm9sZGVyIGZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJaWYgKGZvbGRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlta2RpcnMoKElGb2xkZXIpIGZvbGRlci5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ5ZjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0gICAgICAgIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSkpOwotICAgICAgICBzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0NTc5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgU2ltcGxlV2ViRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJLy8gUmVtb3ZlIHRoZSAuY29tcG9uZW50IGZpbGUKLQkJCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQkJZmlsZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0JCQkKLQkJCS8vIFJlbW92ZSB0aGUgbW9kdWxlIGNvcmUgbmF0dXJlCi0JCQlQcm9qZWN0VXRpbGl0aWVzLnJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0RlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9EZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGJkNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0RlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSB1c2VyLWRlZmluZWQgY29udGVudHMgb2YgYW4gZXh0ZW5zaW9uIGluIGEgcGx1Zy1pbiBtYW5pZmVzdC4KLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgewotCi0JcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVsZWdhdGVFbGVtZW50OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFR0FURV9OQU1FID0gImRlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQiOyAvLyROT04tTkxTLTEkIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFR0FURV9OQU1FU1BBQ0UgPSAiZGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVHQVRFX05VTExfU1RSSU5HID0gImRlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQ6IE5VTEwiOyAvLyROT04tTkxTLTEkIAotCi0JcHVibGljIERlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFEZWxlZ2F0ZSkgewotCQlkZWxlZ2F0ZUVsZW1lbnQgPSBhRGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZXF1YWxzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVBc0lzKFN0cmluZyBuYW1lKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0QXR0cmlidXRlQXNJcyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRDaGlsZHJlbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDaGlsZHJlbihTdHJpbmcgbmFtZSkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldENoaWxkcmVuKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUV4dGVuc2lvbiBnZXREZWNsYXJpbmdFeHRlbnNpb24oKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERFTEVHQVRFX05BTUU7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gREVMRUdBVEVfTkFNRVNQQUNFOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldE5hbWVzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNJcygpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRWYWx1ZUFzSXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCi0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5pc1ZhbGlkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gREVMRUdBVEVfTlVMTF9TVFJJTkc7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRvRXF1aW5veCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRyaWJ1dG9yIGdldENvbnRyaWJ1dG9yKCkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRDb250cmlidXRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gREVMRUdBVEVfTkFNRVNQQUNFOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0lTaW1wbGVXZWJNb2R1bGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4ZTI2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVXZWJNb2R1bGVDb25zdGFudHMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHX0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1BST0pFQ1RfVFlQRSA9ICJTVEFUSUMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RJUkVDVE9SWSA9ICJ0aGVtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0RJUkVDVE9SWSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfRElSRUNUT1JZID0gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTX0RJUkVDVE9SWSA9ICJjbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0lXU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0lXU1RXZWJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjRlN2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JV1NUV2ViUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJV1NUV2ViUHJlZmVyZW5jZXMgewotCVN0cmluZyBQUkVGX1NUQVRJQ1dFQkNPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zdGF0aWNXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjMjdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInN0YXRpY3dlYnByb2plY3QiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25XaXphcmRfV2l6YXJkX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2VfV2ViX0NvbnRlbnRfTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhdGljQ29udGV4dFJvb3RDb21wb3NpdGVfQ29udGV4dF9Sb290X0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2VfTm90X2F2YWlsYWJsZV9mb3JfY2xvc2VkX3Byb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RG90RG90RG90OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRTZXJ2ZXJUYXJnZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlU2V0dGluZ3M7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV1NUV2ViUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV1NUV2ViUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTZlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgamF2YS5sYW5nLlRocm93YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU1RXZWJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV1NUV2ViUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgV1NUV2ViUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9CVUlMREVSX0lEID0gVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQ7IC8vIHBsdWdpbgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSUNPTl9ESVJTID0gbmV3IFN0cmluZ1tdeyJpY29ucy9mdWxsL29iajE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N0b29sMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvd2l6YmFuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vdGhlIElEIGZvciB0aGlzIHBsdWdpbiAoYWRkZWQgYXV0b21hdGljYWxseSBieSBsb2dnaW5nIHF1aWNrZml4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NUV2ViUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTVFdlYlBsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJZ2V0V1NUV2ViUHJlZmVyZW5jZXMoKS5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFdTVFdlYlByZWZlcmVuY2VzIGdldFdTVFdlYlByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBXU1RXZWJQcmVmZXJlbmNlcyh0aGlzKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsSVN0YXR1cy5FUlJPUixuZXcgSVN0YXR1c1tde2V4Y2VwdGlvbi5nZXRTdGF0dXMoKX0sbWVzc2FnZSxleGNlcHRpb24pOwotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggc3RhdHVzICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV1NUV2ViUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1MjU2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV1NUV2ViUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBXU1RXZWJQcmVmZXJlbmNlcyB7Ci0JcHVibGljIGludGVyZmFjZSBLZXlzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zdGF0aWNXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIGludGVyZmFjZSBWYWx1ZXMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9ICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBWYWx1ZXMuU1RBVElDX1dFQl9DT05URU5UOwotCX0KLQlwcml2YXRlIFBsdWdpbiBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RPbkNoYW5nZSA9IGZhbHNlOwotCQotCXB1YmxpYyBXU1RXZWJQcmVmZXJlbmNlcyhQbHVnaW4gb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIERlZmF1bHRzLlNUQVRJQ19XRUJfQ09OVEVOVCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuU1RBVElDX1dFQl9DT05URU5ULCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCWlmIChpc1BlcnNpc3RPbkNoYW5nZSgpKQotCQkJcGVyc2lzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcnNpc3QoKSB7Ci0JCWdldE93bmVyKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwZXJzaXN0T25DaGFuZ2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0T25DaGFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RPbkNoYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGVyc2lzdE9uQ2hhbmdlCi0JICogICAgICAgICAgICBUaGUgcGVyc2lzdE9uQ2hhbmdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0T25DaGFuZ2UoYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UpIHsKLQkJdGhpcy5wZXJzaXN0T25DaGFuZ2UgPSBwZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMucHJlZmVyZW5jZXMgPSBnZXRPd25lcigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3duZXIuCi0JICovCi0JcHJpdmF0ZSBQbHVnaW4gZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjQ5ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFdlYlByb3BlcnRpZXNVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFEX0NIQVJTID0geycvJywgJ1xcJywgJzonfTsKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QKLQkgKi8KLQkvKioKLQkgKiBSZXR1cm5zIGEgZXJyb3IgbWVzc2FnZSB0aGF0IHN0YXRlcyB3aGV0aGVyIGEgY29udGV4dCByb290IGlzIHZhbGlkIG9yIG5vdCByZXR1cm5zIG51bGwgaWYKLQkgKiBjb250ZXh0IHJvb3QgaXMgZmluZQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb250ZXh0Um9vdAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGV4dFJvb3QoU3RyaW5nIGNvbnRleHRSb290KSB7Ci0KLQkJaWYgKGNvbnRleHRSb290ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGNvbnRleHRSb290OwotCQlpZiAobmFtZS5lcXVhbHMoIiIpIHx8IG5hbWUgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyAgdGhpcyB3YXMgYWRkZWQgYmVjYXVzZSB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGRudCBiZSBzaG93biBpbml0aWFsbHkuIEl0IHNob3VsZCBiZQotCQkJLy8gc2hvd24gb25seSBpZiBjb250ZXh0IHJvb3QgZmllbGQgaXMgZWRpdGVkIHRvCi0JCQllcnJvck1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGU7IAotCQkJCi0JCQkvL2Vycm9yTWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiAvLyBKWiAtIGZpeCB0byBkZWZlY3QgMjA0MjY0LCAiLyIgaXMgdmFsaWQgaW4gY29udGV4dCByb290IGlmIChuYW1lLmluZGV4T2YoIi8vIikgIT0gLTEpIHsKLQkJICogLy8kTk9OLU5MUy0xJCBlcnJvck1lc3NhZ2UgPSAiLy8gYXJlIGludmFsaWQgY2hhcmFjdGVycyBpbiBhIHJlc291cmNlIG5hbWUiOyByZXR1cm4KLQkJICogZXJyb3JNZXNzYWdlOwotCQkgKiAgfQotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JCWlmIChuYW1lLnRyaW0oKS5lcXVhbHMobmFtZSkpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRlciA6IHdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmICghKHRva2VuLmNoYXJBdChpKSA9PSAnXycpICYmICEodG9rZW4uY2hhckF0KGkpID09ICctJykgJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy8nKSAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHRva2VuLmNoYXJBdChpKSkgPT0gZmFsc2UpIHsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRva2VuLmNoYXJBdChpKSkpIHsKLQkJCQkJCQkvL1JlbW92ZWQgYmVjYXVzZSBjb250ZXh0IHJvb3RzIGNhbiBjb250YWluIHdoaXRlIHNwYWNlCi0JCQkJCQkJLy9lcnJvck1lc3NhZ2UgPQotCQkJCQkJCS8vCVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9Db250ZXh0X3Jvb3RfY2Fubm90X2NvbnRhX1VJXyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyA9ICIgQ29udGV4dCByb290IGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2VzLiIKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXJyb3JNZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLlN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX1RpdGxlOyAKLQkJCQkJCQkKLQkJCQkJCQkvL2Vycm9yTWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290IiwgbmV3IE9iamVjdFtdeyhuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuLyBlbmQgb2YgaWYobmFtZS50cmltCi0JCWVsc2UKLQkJCWVycm9yTWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsgCi0JCQkvL2Vycm9yTWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTmFtZXNfY2Fubm90X2JlZ2luX29yX2VuZF93aXRoX3doaXRlc3BhY2VfNSIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBhcnJheS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBzdHIsIGNoYXJbXSBjaGFycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc3RyLmluZGV4T2YoY2hhcnNbaV0pICE9IC0xKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlRm9sZGVyTmFtZShTdHJpbmcgZm9sZGVyTmFtZSkgewotCQlpZiAoZm9sZGVyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsgCi0JCQkKLQkJCS8vcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRm9sZGVyX25hbWVfY2Fubm90X2JlX2VtcHR5XzIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb250YWlucyhmb2xkZXJOYW1lLCBCQURfQ0hBUlMpKQotCQkJcmV0dXJuIFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsgCi0JCQkKLQkJCS8vcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRm9sZGVyX25hbWVfaXNfbm90X3ZhbGlkIiwgbmV3IE9iamVjdFtde2ZvbGRlck5hbWV9KTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0NvbXBvbmVudERlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db21wb25lbnREZXBsb3lhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTEzNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0NvbXBvbmVudERlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnREZXBsb3lhYmxlIGV4dGVuZHMgUHJvamVjdE1vZHVsZSB7Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDb21wb25lbnREZXBsb3lhYmxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcyhwcm9qZWN0LENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpKTsKLQl9Ci0JCi0JcHVibGljIENvbXBvbmVudERlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlzdXBlcihwcm9qZWN0KTsKLQkJdGhpcy5jb21wb25lbnQgPSBhQ29tcG9uZW50OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSjJFRU1vZHVsZSNpc0JpbmFyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKSB7Ci0JCWlmIChjb21wb25lbnQ9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb21wb25lbnQuaXNCaW5hcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSByZXNvdXJjZXMgZnJvbSBtciB0byB0aGUgZXhpc3RpbmcgcmVzb3VyY2VzIGluIE1vZHVsZSBGb2xkZXIgbWYKLQkgKiBAcGFyYW0gTW9kdWxlRm9sZGVyIG1mCi0JICogQHBhcmFtIElNb2R1bGVSZXNvdXJjZVtdIG1yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihNb2R1bGVGb2xkZXIgbWYsIElNb2R1bGVSZXNvdXJjZVtdIG1yKSB7Ci0JCS8vIElmIHRoZSBmb2xkZXIgaXMgbnVsbCBvciB0aGUgcmVzb3VyY2VzIHRvIGFkZCBhcmUgbnVsbCBvciBlbXB0eSwgYmFpbCBhbmQgcmV0dXJuCi0JCWlmIChtZiA9PSBudWxsIHx8IG1yID09IG51bGwgfHwgbXIubGVuZ3RoPT0wKSAKLQkJCXJldHVybjsKLQkJLy8gR2V0IHRoZSBleGlzdGluZyBtZW1iZXJzIGluIHRoZSBtb2R1bGUgZm9sZGVyCi0JCUlNb2R1bGVSZXNvdXJjZVtdIG1mX21lbWJlcnMgPSBtZi5tZW1iZXJzKCk7Ci0JCWludCBtZl9zaXplID0gMDsKLQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGV4aXN0aW5nIG1lbWJlcnMgaW4gdGhlIG1vZHVsZSBmb2xkZXIKLQkJaWYgKG1mX21lbWJlcnMgIT0gbnVsbCkKLQkJCW1mX3NpemUgPSBtZl9tZW1iZXJzLmxlbmd0aDsKLQkJLy8gQ3JlYXRlIGEgbmV3IGFycmF5IHRvIHNldCBvbiB0aGUgbW9kdWxlIGZvbGRlciB3aGljaCB3aWxsIGNvbWJpbmUgdGhlIGV4aXN0aW5nIGFuZAotCQkvLyBuZXcgbW9kdWxlIHJlc291cmNlcwotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlW21mX3NpemUgKyBtci5sZW5ndGhdOwotCQkvLyBDb3B5IHRoZSBleGlzdGluZyBtZW1iZXJzIGludG8gdGhlIGFycmF5IGlmIHRoZXJlIGFyZSBhbnkKLQkJaWYgKG1mX21lbWJlcnMgIT0gbnVsbCAmJiBtZl9zaXplID4gMCkKLQkJCVN5c3RlbS5hcnJheWNvcHkobWZfbWVtYmVycywgMCwgcmVzLCAwLCBtZl9zaXplKTsKLQkJLy8gQ29weSB0aGUgbmV3IG1lbWJlcnMgaW50byB0aGUgYXJyYXkKLQkJU3lzdGVtLmFycmF5Y29weShtciwgMCwgcmVzLCBtZl9zaXplLCBtci5sZW5ndGgpOwotCQkvLyBTZXQgdGhlIG5ldyBtZW1iZXJzIGFycmF5IG9uIHRoZSBtb2R1bGUgZm9sZGVyCi0JCW1mLnNldE1lbWJlcnMocmVzKTsKLQl9Ci0KLQkgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlW10KLSAgICAgKi8KLSAgICBwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldE1vZHVsZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQlMaXN0IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCSAgICAJSVZpcnR1YWxSZWZlcmVuY2VbXSBjb21wb25lbnRzID0gZ2V0UmVmZXJlbmNlcyhjb21wb25lbnQpOwotCSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29tcG9uZW50c1tpXTsKLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk9PUlWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9VU0VTKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoY29tcG9uZW50LCB2aXJ0dWFsQ29tcCk7Ci0JCQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiAhbW9kdWxlcy5jb250YWlucyhtb2R1bGUpKQotCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgcmV0dXJuIChJTW9kdWxlW10pIG1vZHVsZXMudG9BcnJheShuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV0pOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLSAgICAJcmV0dXJuIGFDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSU1vZHVsZSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgKSB7Ci0gICAgCS8vIEhhbmRsZSB3b3Jrc3BhY2UgcHJvamVjdCBtb2R1bGUgY29tcG9uZW50cwotCQlpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwgJiYgdGFyZ2V0Q29tcG9uZW50LmdldFByb2plY3QoKSE9Y29tcG9uZW50LmdldFByb2plY3QoKSkgewotCQkJaWYgKCF0YXJnZXRDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCQlyZXR1cm4gU2VydmVyVXRpbC5nZXRNb2R1bGUodGFyZ2V0Q29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEZpbmQgdGhlIG1vZHVsZSByZXNvdXJjZXMgZm9yIGEgZ2l2ZW4gY29udGFpbmVyIGFuZCBwYXRoLiBJbnNlcnRzIGluIHRoZSBqYXZhIGNvbnRhaW5lcnMKLQkgKiBhdCBhIGdpdmVuIHBhdGggaWYgbm90IG51bGwuCi0JICogCi0JICogQHBhcmFtIGNvbnQgYSBjb250YWluZXIKLQkgKiBAcGFyYW0gcGF0aCB0aGUgY3VycmVudCBtb2R1bGUgcmVsYXRpdmUgcGF0aAotCSAqIEBwYXJhbSBqYXZhUGF0aCB0aGUgcGF0aCB3aGVyZSBKYXZhIHJlc291cmNlcyBmaXQgaW4gdGhlIHJvb3QKLQkgKiBAcGFyYW0gamF2YUNvbnQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNZW1iZXJzKElDb250YWluZXIgY29udCwgSVBhdGggcGF0aCwgSVBhdGggamF2YVBhdGgsIElDb250YWluZXJbXSBqYXZhQ29udCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSByZXMgPSBjb250Lm1lbWJlcnMoKTsKLQkJaW50IHNpemUyID0gcmVzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJaWYgKHJlc1tqXSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQlJQ29udGFpbmVyIGNjID0gKElDb250YWluZXIpIHJlc1tqXTsKLQkJCQkKLQkJCQlJUGF0aCBuZXdQYXRoID0gcGF0aC5hcHBlbmQoY2MuZ2V0TmFtZSgpKS5tYWtlUmVsYXRpdmUoKTsKLQkJCQkvLyBSZXRyaWV2ZSBhbHJlYWR5IGV4aXN0aW5nIG1vZHVsZSBmb2xkZXIgaWYgYXBwbGljYWJsZQotCQkJCU1vZHVsZUZvbGRlciBtZiA9IChNb2R1bGVGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycyxuZXdQYXRoKTsKLQkJCQlpZiAobWYgPT0gbnVsbCkgewotCQkJCQltZiA9IG5ldyBNb2R1bGVGb2xkZXIoY2MsIGNjLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQkJCU1vZHVsZUZvbGRlciBwYXJlbnQgPSAoTW9kdWxlRm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsIHBhdGgpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJCQltZW1iZXJzLmFkZChtZik7Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQkJCXBhcmVudCA9IGVuc3VyZVBhcmVudEV4aXN0cyhwYXRoLCBjYyk7Ci0JCQkJCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIocGFyZW50LCBuZXcgSU1vZHVsZVJlc291cmNlW10ge21mfSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRNZW1iZXJzKGNjLCBuZXdQYXRoLCBqYXZhUGF0aCwgamF2YUNvbnQpOwotCQkJCQotCQkJCWlmIChqYXZhUGF0aCAhPSBudWxsICYmIG5ld1BhdGguaXNQcmVmaXhPZihqYXZhUGF0aCkpCi0JCQkJCW1yID0gaGFuZGxlSmF2YVBhdGgocGF0aCwgamF2YVBhdGgsIG5ld1BhdGgsIGphdmFDb250LCBtciwgY2MpOwotCi0JCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKG1mLCBtcik7Ci0JCQkJCi0JCQl9IGVsc2UgewotCQkJCUlGaWxlIGYgPSAoSUZpbGUpIHJlc1tqXTsKLQkJCQkvLyBIYW5kbGUgdGhlIGRlZmF1bHQgcGFja2FnZSBjYXNlCi0JCQkJaWYgKHBhdGguZXF1YWxzKGphdmFQYXRoKSkgewotCQkJCQlNb2R1bGVGb2xkZXIgbUZvbGRlciA9IChNb2R1bGVGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycyxqYXZhUGF0aCk7Ci0JCQkJCUlNb2R1bGVGaWxlIG1GaWxlID0gY3JlYXRlTW9kdWxlRmlsZShmLCBqYXZhUGF0aCk7Ci0JCQkJCWlmIChtRm9sZGVyICE9IG51bGwpCi0JCQkJCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIobUZvbGRlcixuZXcgSU1vZHVsZVJlc291cmNlW117bUZpbGV9KTsKLQkJCQkJZWxzZQotCQkJCQkJbGlzdC5hZGQobUZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlNb2R1bGVGaWxlIG1mID0gY3JlYXRlTW9kdWxlRmlsZShmLCBwYXRoKTsKLQkJCQkJbGlzdC5hZGQobWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobXIpOwotCQlyZXR1cm4gbXI7Ci0JfQotCQotCXByb3RlY3RlZCBJTW9kdWxlRmlsZSBjcmVhdGVNb2R1bGVGaWxlKGZpbmFsIElGaWxlIGZpbGUsIGZpbmFsIElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIG5ldyBNb2R1bGVGaWxlKGZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBwYXRoLCBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyBmaWxlLmdldExvY2FsVGltZVN0YW1wKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TWVtYmVycyhJVmlydHVhbENvbnRhaW5lciBjb250LCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXMgPSBjb250Lm1lbWJlcnMoKTsKLQkJaW50IHNpemUyID0gcmVzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJaWYgKHJlc1tqXSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29udGFpbmVyKSB7Ci0JCQkJSVZpcnR1YWxDb250YWluZXIgY2MgPSAoSVZpcnR1YWxDb250YWluZXIpIHJlc1tqXTsKLQkJCQkvLyBSZXRyaWV2ZSBhbHJlYWR5IGV4aXN0aW5nIG1vZHVsZSBmb2xkZXIgaWYgYXBwbGljYWJsZQotCQkJCU1vZHVsZUZvbGRlciBtZiA9IChNb2R1bGVGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycyxwYXRoLmFwcGVuZChuZXcgUGF0aChjYy5nZXROYW1lKCkpLm1ha2VSZWxhdGl2ZSgpKSk7Ci0JCQkJaWYgKG1mID09IG51bGwpIHsKLQkJCQkJbWYgPSBuZXcgTW9kdWxlRm9sZGVyKChJQ29udGFpbmVyKWNjLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLCBjYy5nZXROYW1lKCksIHBhdGgpOwotCQkJCQlNb2R1bGVGb2xkZXIgcGFyZW50ID0gKE1vZHVsZUZvbGRlcikgZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShtZW1iZXJzLCBwYXRoKTsKLQkJCQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJCQkJbWVtYmVycy5hZGQobWYpOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCQlwYXJlbnQgPSBlbnN1cmVQYXJlbnRFeGlzdHMocGF0aCwgKElDb250YWluZXIpY2MuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQkJCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKHBhcmVudCwgbmV3IElNb2R1bGVSZXNvdXJjZVtdIHttZn0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyhjYywgcGF0aC5hcHBlbmQoY2MuZ2V0TmFtZSgpKSk7Ci0JCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKG1mLCBtcik7Ci0JCQl9IGVsc2UgewotCQkJCUlGaWxlIGYgPSAoSUZpbGUpIHJlc1tqXS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQlJTW9kdWxlRmlsZSBtZiA9IG51bGw7Ci0JCQkJaWYgKHNob3VsZEFkZENvbXBvbmVudEZpbGUoZikpIHsKLQkJCQkJbWYgPSBjcmVhdGVNb2R1bGVGaWxlKGYsIHBhdGgpOwotCQkJCQlsaXN0LmFkZChtZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gbmV3IElNb2R1bGVSZXNvdXJjZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtcik7Ci0JCXJldHVybiBtcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1vZHVsZUZvbGRlciBlbnN1cmVQYXJlbnRFeGlzdHMoSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjYykgewotCQlNb2R1bGVGb2xkZXIgcGFyZW50ID0gKE1vZHVsZUZvbGRlcikgZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShtZW1iZXJzLCBwYXRoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9sZGVyTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCUlQYXRoIGZvbGRlclBhdGggPSBQYXRoLkVNUFRZOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCk+MSkKLQkJCQlmb2xkZXJQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlwYXJlbnQgPSBuZXcgTW9kdWxlRm9sZGVyKGNjLCBmb2xkZXJOYW1lLCBmb2xkZXJQYXRoKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpPjEpCi0JCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKGVuc3VyZVBhcmVudEV4aXN0cyhwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSxjYyksIG5ldyBJTW9kdWxlUmVzb3VyY2VbXSB7cGFyZW50fSk7Ci0JCQllbHNlCi0JCQkJbWVtYmVycy5hZGQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuICBSZXR1cm4gd2hldGhlciBvciBub3QgdG8gYWRkIHRoaXMgZmlsZQotCSAqIHRvIHRoZSBtZW1iZXJzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gc2hvdWxkIGFkZCBmaWxlPwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZENvbXBvbmVudEZpbGUoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIGN1cnJlbnQgY2FjaGUgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtb2R1bGUgcmVzb3VyY2UgZm9yCi0JICogdGhlIGdpdmVuIHBhdGguCi0JICogQHBhcmFtIGFMaXN0Ci0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIGFuIGV4aXN0aW5nIG1vZHVsZVJlc291cmNlIGZyb20gdGhlIGNhY2hlZCByZXN1bHQKLQkgKi8KLQkgCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKExpc3QgYUxpc3QsIElQYXRoIHBhdGgpIHsgCi0gICAgCS8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gbnVsbAotICAgIAlpZiAoYUxpc3Q9PW51bGwgfHwgYUxpc3QuaXNFbXB0eSgpIHx8IHBhdGggPT0gbnVsbCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAkvLyBPdGhlcndpc2UgcmVjdXJzaXZlbHkgY2hlY2sgdG8gc2VlIGlmIGdpdmVuIHJlc291cmNlIG1hdGNoZXMgY3VycmVudCByZXNvdXJjZSBvciBpZiBpdCBpcyBhIGNoaWxkCi0gICAgCVN0cmluZ1tdIHBhdGhTZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsgCi0gICAgCUlNb2R1bGVSZXNvdXJjZSBtb2R1bGVSZXNvdXJjZSA9IG51bGw7Ci0gICAgCQotICAgIAlpZihwYXRoU2VnbWVudHMubGVuZ3RoID09IDApCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJZm9yIChJdGVyYXRvciBpdGVyID0gYUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgCQltb2R1bGVSZXNvdXJjZSA9IChJTW9kdWxlUmVzb3VyY2UpIGl0ZXIubmV4dCgpOyAgICAgCQotICAgIAkJU3RyaW5nW10gbW9kdWxlU2VnbWVudHMgPSBtb2R1bGVSZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5zZWdtZW50cygpOwotICAgIAkJLy8gSWYgdGhlIGxhc3Qgc2VnbWVudCBpbiBwYXNzZWQgaW4gcGF0aCBlcXVhbHMgdGhlIG1vZHVsZSByZXNvdXJjZSBuYW1lIAotICAgIAkJLy8gYW5kIHNlZ21lbnQgY291bnQgaXMgdGhlIHNhbWUgYW5kIHRoZSBwYXRoIHNlZ21lbnRzIHN0YXJ0IHdpdGggdGhlIG1vZHVsZSBwYXRoIHNlZ21lbnRzCi0gICAgCQkvLyB0aGVuIHdlIGhhdmUgYSBtYXRjaCBhbmQgd2UgcmV0dXJuIHRoZSBleGlzdGluZyBtb2R1bGVSZXNvdXJjZQotICAgIAkJaWYgKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0uZXF1YWxzKG1vZHVsZVJlc291cmNlLmdldE5hbWUoKSkgJiYgCi0JCSAgICAJCShtb2R1bGVTZWdtZW50cy5sZW5ndGggKyAxKSA9PSBwYXRoU2VnbWVudHMubGVuZ3RoICYmIAotCQkgICAgCQlzdGFydHNXaXRoKG1vZHVsZVNlZ21lbnRzLCBwYXRoU2VnbWVudHMpKQotCQkgICAgCXJldHVybiBtb2R1bGVSZXNvdXJjZTsgCi0gICAgCQkKLSAgICAJCS8vIE90aGVyd2lzZSwgaWYgaXQgaXMgYSBmb2xkZXIsIGNoZWNrIGl0cyBjaGlsZHJlbiBmb3IgdGhlIGV4aXN0aW5nIHJlc291cmNlIHBhdGgKLSAgICAJCS8vIGJ1dCBvbmx5IGNoZWNrIGlmIHRoZSBiZWdpbm5pbmcgc2VnbWVudHMgYXJlIGEgbWF0Y2gKLQkgICAgCWlmKG1vZHVsZVJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlciAmJiAKLQkgICAgCQkJc3RhcnRzV2l0aChtb2R1bGVTZWdtZW50cywgcGF0aFNlZ21lbnRzKSAmJiBwYXRoU2VnbWVudHMubGVuZ3RoID4gbW9kdWxlU2VnbWVudHMubGVuZ3RoICYmCi0JICAgIAkJCW1vZHVsZVJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMocGF0aFNlZ21lbnRzW21vZHVsZVNlZ21lbnRzLmxlbmd0aCA+IDAgPyBtb2R1bGVTZWdtZW50cy5sZW5ndGggOiAwXSkpCSAgICAJICAKLSAgICAJCQlpZiAoKChJTW9kdWxlRm9sZGVyKW1vZHVsZVJlc291cmNlKS5tZW1iZXJzKCkhPW51bGwpCi0gICAgCQkJCXJldHVybiBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKEFycmF5cy5hc0xpc3QoKChJTW9kdWxlRm9sZGVyKW1vZHVsZVJlc291cmNlKS5tZW1iZXJzKCkpLHBhdGgpOwkJCi0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiZWdpbm5pbmdTZWdtZW50cwotCSAqIEBwYXJhbSB0ZXN0U2VnbWVudHMKLQkgKiBAcmV0dXJuIFRydWUgaWYgYmVnaW5uaW5nU2VnbWVudHNbaV0gPT0gdGVzdFNlZ21lbnRzW2ldIGZvciBhbGwgMDw9aTxiZWdpbm5pbmdTZWdtZW50c1tpXSAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmdbXSBiZWdpbm5pbmdTZWdtZW50cywgU3RyaW5nW10gdGVzdFNlZ21lbnRzKSB7IAotCQlmb3IoaW50IGk9MDsgaSA8IGJlZ2lubmluZ1NlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZighYmVnaW5uaW5nU2VnbWVudHNbaV0uZXF1YWxzKHRlc3RTZWdtZW50c1tpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBoYW5kbGVKYXZhUGF0aChJUGF0aCBwYXRoLCBJUGF0aCBqYXZhUGF0aCwgSVBhdGggY3VyUGF0aCwgSUNvbnRhaW5lcltdIGphdmFDb250LCBJTW9kdWxlUmVzb3VyY2VbXSBtciwgSUNvbnRhaW5lciBjYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL3N1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0JCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlW117fTsKLQl9Ci0JCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1lbWJlcnMuY2xlYXIoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlpZiAodmMgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxGb2xkZXIgdkZvbGRlciA9IHZjLmdldFJvb3RGb2xkZXIoKTsKLQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyh2Rm9sZGVyLCBQYXRoLkVNUFRZKTsKLQkJCWludCBzaXplID0gbXIubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQltZW1iZXJzLmFkZChtcltqXSk7Ci0JCQl9Ci0JCQlhZGRVdGlsTWVtYmVycyh2Yyk7Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gbmV3IElNb2R1bGVSZXNvdXJjZVttZW1iZXJzLnNpemUoKV07Ci0JCW1lbWJlcnMudG9BcnJheShtcik7Ci0JCXJldHVybiBtcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZVV0aWxpdHlDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAsIElWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cywgQXJ0aWZhY3RFZGl0IGVkaXQpIHsKLQkJcmV0dXJuIHZpcnR1YWxDb21wICE9IG51bGwgJiYgdmlydHVhbENvbXAuaXNCaW5hcnkoKSAmJiB2aXJ0dWFsQ29tcC5nZXRQcm9qZWN0KCk9PWNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFV0aWxNZW1iZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZjKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBnZXRDb21wb25lbnRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBvbmVudHMgPSB2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0JICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkgICAgCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb21wb25lbnRzW2ldOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAoc2hvdWxkSW5jbHVkZVV0aWxpdHlDb21wb25lbnQodmlydHVhbENvbXAsY29tcG9uZW50cyxlZGl0KSkgewotCQkJCQlhZGRVdGlsTWVtYmVyKHZjLCByZWZlcmVuY2UsIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKTsKLQkJCQl9Ci0JICAgIAl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCE9bnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVdGlsTWVtYmVyKElWaXJ0dWFsQ29tcG9uZW50IHBhcmVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlJTW9kdWxlRmlsZSBtZiA9IG51bGw7Ci0JCWZpbmFsIFN0cmluZyBhcmNoaXZlTmFtZSA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOwotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCWZpbmFsIElQYXRoIGFyY2hpdmVQYXRoID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCl2aXJ0dWFsQ29tcCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsKSB7IC8vSW4gV29ya3NwYWNlCi0JCQlJRmlsZSB1dGlsRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShhcmNoaXZlUGF0aCk7Ci0JCQlTdHJpbmcgbmFtZSA9IG51bGwgIT0gYXJjaGl2ZU5hbWUgPyBhcmNoaXZlTmFtZSA6IHV0aWxGaWxlLmdldE5hbWUoKTsKLQkJCW1mID0gbmV3IE1vZHVsZUZpbGUodXRpbEZpbGUsIG5hbWUsIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZXh0RmlsZSA9ICgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdmlydHVhbENvbXApLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsICE9IGFyY2hpdmVOYW1lID8gYXJjaGl2ZU5hbWUgOiBleHRGaWxlLmdldE5hbWUoKTsKLQkJCW1mID0gbmV3IE1vZHVsZUZpbGUoZXh0RmlsZSwgbmFtZSwgcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkpOwotCQl9Ci0JCWlmIChtZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSU1vZHVsZVJlc291cmNlIG1vZHVsZVBhcmVudCA9IGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycywgbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpOwotCQlpZiAobW9kdWxlUGFyZW50ICE9IG51bGwgJiYgbW9kdWxlUGFyZW50IGluc3RhbmNlb2YgTW9kdWxlRm9sZGVyKSB7Ci0JCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIoKE1vZHVsZUZvbGRlciltb2R1bGVQYXJlbnQsIG5ldyBJTW9kdWxlUmVzb3VyY2VbXXttZn0pOwotCQl9IGVsc2UgewotCQkJaWYgKG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmlzRW1wdHkoKSkgewotCQkJCW1lbWJlcnMuYWRkKG1mKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1vZHVsZVBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCW1vZHVsZVBhcmVudCA9IGVuc3VyZVBhcmVudEV4aXN0cyhtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSwgKElDb250YWluZXIpcGFyZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcigoTW9kdWxlRm9sZGVyKW1vZHVsZVBhcmVudCwgbmV3IElNb2R1bGVSZXNvdXJjZVtdIHttZn0pOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgZ2V0Q29tcG9uZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUHJvamVjdE9mVHlwZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlEKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChmYWNldGVkUHJvamVjdCAhPW51bGwgJiYgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKHR5cGVJRCkpIHsKLQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQlyZXR1cm4gcHJvamVjdEZhY2V0IT1udWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlpZiAodmMgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxGb2xkZXIgdkZvbGRlciA9IHZjLmdldFJvb3RGb2xkZXIoKTsKLQkJCWlmICh2Rm9sZGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHZGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb250YWluZXJbXXt9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ1YmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9JU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODcyMDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSVN0YXRpY1dlYjsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGUgZXh0ZW5kcyBDb21wb25lbnREZXBsb3lhYmxlIGltcGxlbWVudHMgSVN0YXRpY1dlYiB7Ci0KLQlwdWJsaWMgU3RhdGljV2ViRGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBjb21wb25lbnQuZ2V0TWV0YVByb3BlcnRpZXMoKTsKLQkJaWYocHJvcHMuY29udGFpbnNLZXkoImNvbnRleHQtcm9vdCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoImNvbnRleHQtcm9vdCIpOyAvLyROT04tTkxTLTEkCi0JICAgIHJldHVybiBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgIH0KLQkKLQkgcHVibGljIFN0cmluZyBnZXRVUkkoSU1vZHVsZSBtb2R1bGUpIHsKLQkgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCSAgICBTdHJpbmcgYVVSSSA9IG51bGw7Ci0JICAgIGlmIChjb21wICE9bnVsbCkgewotCSAgICAJaWYgKCFjb21wLmlzQmluYXJ5KCkgJiYgaXNQcm9qZWN0T2ZUeXBlKG1vZHVsZS5nZXRQcm9qZWN0KCksSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSkpIHsKLSAgICAgICAgCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKLSAgICAgICAgCQlhVVJJID0gcmVmLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGNvbXAuZ2V0TmFtZSgpKyIud2FyIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJfQotCSAgICB9Ci0JICAgIAkKLSAgICAJaWYgKGFVUkkgIT1udWxsICYmIGFVUkkubGVuZ3RoKCk+MSAmJiBhVVJJLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgIAkJYVVSSSA9IGFVUkkuc3Vic3RyaW5nKDEpOwotICAgIAlyZXR1cm4gYVVSSTsKLQkgfQotCSAKLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChmYWNldGVkUHJvamVjdCAhPW51bGwgJiYgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSk7Ci0JCQkJcmV0dXJuIGZhY2V0ZWRQcm9qZWN0LmdldEluc3RhbGxlZFZlcnNpb24ocHJvamVjdEZhY2V0KS5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwZDUzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkgZXh0ZW5kcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5zdGF0aWMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBtb2R1bGVEZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIEBzZWUgRGVwbG95YWJsZVByb2plY3RGYWN0b3J5RGVsZWdhdGUjZ2V0RmFjdG9yeUlEKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIHtAbGluayAjY3JlYXRlTW9kdWxlcyhJUHJvamVjdCl9IGluc3RlYWQuCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gbmF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSkgewotCQlpZihuYXR1cmUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlcyhuYXR1cmUuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9qZWN0IHJlcHJlc2VudHMgYSBkZXBsb3lhYmxlIHByb2plY3Qgb2YgdGhpcyB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSVByb2plY3RGYWNldCB3ZWJGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFKTsKLQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQod2ViRmFjZXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZURlbGVnYXRlKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlKQotCSAqLwotCXB1YmxpYyBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2R1bGVEZWxlZ2F0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNb2R1bGVEZWxlZ2F0ZSBlbGVtZW50ID0gKE1vZHVsZURlbGVnYXRlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChtb2R1bGUgPT0gZWxlbWVudC5nZXRNb2R1bGUoKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZihjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoY29tcG9uZW50KTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZURlbGVnYXRlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29tcG9uZW50ID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RhdGljV2ViRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSA9IG51bGw7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKGlzVmFsaWRNb2R1bGUoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQltb2R1bGVEZWxlZ2F0ZSA9IG5ldyBTdGF0aWNXZWJEZXBsb3lhYmxlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCksY29tcG9uZW50KTsKLQkJCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldE5hbWUoKSwgSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSwgbW9kdWxlRGVsZWdhdGUuZ2V0VmVyc2lvbigpLCBtb2R1bGVEZWxlZ2F0ZS5nZXRQcm9qZWN0KCkpOwotCQkJCW1vZHVsZURlbGVnYXRlLmluaXRpYWxpemUobW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCWlmIChnZXRNb2R1bGVEZWxlZ2F0ZShtb2R1bGUpID09IG51bGwpCi0JCQkJCW1vZHVsZURlbGVnYXRlcy5hZGQobW9kdWxlRGVsZWdhdGUpOwotCQkJfQotCQl9Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IElNb2R1bGVbXSB7bW9kdWxlfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCB0aGUgbW9kdWxlIHNob3VsZCBsaXN0ZW4gdG8KLQkgKiBmb3Igc3RhdGUgY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHBhdGhzLgotCSAqCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCi0JICovCi0JcHJvdGVjdGVkIElQYXRoW10gZ2V0TGlzdGVuZXJQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBJUGF0aFtdIHsKLQkJCW5ldyBQYXRoKCIucHJvamVjdCIpLCAvLyBuYXR1cmUgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFBhdGgoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpLCAvLyBjb21wb25lbnQKLQkJCW5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIikgLy8gZmFjZXRzIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk5MzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotCi17Ci0KLQlwdWJsaWMgU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0LmNsYXNzfTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc5MTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZXh0ZW5zaW9uc1RvRXhjbHVkZSA9IG5ldyBTdHJpbmdbXXsic3FsIiwgInhtaSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgU3RyaW5nIElORk9fRElSRUNUT1JZID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBvYmo7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKQotCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHByb2plY3QpLCBuZXcgUGF0aCgiIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsJCi0JCX0KLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzb3VyY2UpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkvLyBkZXRlcm1pbmUgcGF0aAotCQlJUGF0aCByb290UGF0aCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCi0JCS8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmVzb3VyY2UgaXMgdW5kZXIgdGhlIHdlYkFwcGxpY2F0aW9uIGRpcmVjdG9yeQotCQlpZiAocmVzb3VyY2VQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyb290UGF0aCkgIT0gcm9vdFBhdGguc2VnbWVudENvdW50KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBEbyBub3QgYWxsb3cgcmVzb3VyY2UgdW5kZXIgdGhlIHdlYi1pbmYgZGlyZWN0b3J5Ci0JCXJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3RQYXRoLnNlZ21lbnRDb3VudCgpKTsKLQkJaWYgKHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKElORk9fRElSRUNUT1JZKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChzaG91bGRFeGNsdWRlKHJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIHJldHVybiBXZWIgcmVzb3VyY2UgdHlwZQotCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShwcm9qZWN0KSwgcmVzb3VyY2VQYXRoKTsKLQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzaG91bGRFeGNsdWRlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkRXhjbHVkZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIGZpbGVFeHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQkJLy8gRXhjbHVkZSBmaWxlcyBvZiBjZXJ0YWluIGV4dGVuc2lvbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zVG9FeGNsdWRlLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1RvRXhjbHVkZVtpXTsKLQkJCWlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmaWxlRXh0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLmdldE1vZHVsZShwcm9qZWN0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RPZlR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKHR5cGVJRCkpIHsKLQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQlyZXR1cm4gcHJvamVjdEZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHByb2plY3RGYWNldCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9NYXBwaW5nRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2ZhY2V0L01hcHBpbmdEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDkwNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2ZhY2V0L01hcHBpbmdEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0Rlc2NyaXB0b3IgewotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBNYXBwaW5nRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5BVFRSSUJVVEVfSUQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZhY2V0UnVudGltZVR5cGVJRCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGYWNldFJ1bnRpbWVWZXJzaW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5BVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYWNldElEKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5BVFRSSUJVVEVfRkFDRVRfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5BVFRSSUJVVEVfRkFDRVRfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZXRJRCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX1BSRVNFVF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmYuYXBwZW5kKCJpZDoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0SUQoKSk7Ci0JCWJ1ZmYuYXBwZW5kKCIgZmFjZXRSdW50aW1lVHlwZUlEOiIpOwotCQlidWZmLmFwcGVuZChnZXRGYWNldFJ1bnRpbWVUeXBlSUQoKSk7Ci0JCWJ1ZmYuYXBwZW5kKCIgZmFjZXRSdW50aW1lVmVyc2lvbjoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRSdW50aW1lVmVyc2lvbigpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldElEOiIpOwotCQlidWZmLmFwcGVuZChnZXRGYWNldElEKCkpOwotCQlidWZmLmFwcGVuZCgiIGZhY2V0VmVyc2lvbjoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRWZXJzaW9uKCkpOwotCQlidWZmLmFwcGVuZCgiIHByZXNldElEOiIpOwotCQlidWZmLmFwcGVuZChnZXRQcmVzZXRJRCgpKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9SdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzczMjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9SdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuV1NUV2ViUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeSB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJydW50aW1lUHJlc2V0TWFwcGluZ3MiOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX01BUFBJTkcgPSAibWFwcGluZyI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JRCA9ICJpZCI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQgPSAiZmFjZXRSdW50aW1lVHlwZUlEIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTiA9ICJmYWNldFJ1bnRpbWVWZXJzaW9uIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZBQ0VUX0lEID0gImZhY2V0SUQiOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkFDRVRfVkVSU0lPTiA9ICJmYWNldFZlcnNpb24iOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJFU0VUX0lEID0gInByZXNldElEIjsKLQotCXB1YmxpYyBzdGF0aWMgUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5KCk7Ci0KLQlwcml2YXRlIExpc3Q8TWFwcGluZ0Rlc2NyaXB0b3I+IGRlc2NyaXB0b3JzID0gbnVsbDsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2V0SUQoU3RyaW5nIGZhY2V0UnVudGltZVR5cGVJRCwKLQkJCVN0cmluZyBmYWNldFJ1bnRpbWVWZXJzaW9uLCBTdHJpbmcgZmFjZXRJRCwgU3RyaW5nIGZhY2V0VmVyc2lvbikgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJcmVhZERlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJZm9yIChNYXBwaW5nRGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKLQkJCWlmKG1hdGNoZXMoZmFjZXRSdW50aW1lVHlwZUlELCBkZXNjcmlwdG9yLmdldEZhY2V0UnVudGltZVR5cGVJRCgpKSAmJgotCQkJICAgbWF0Y2hlcyhmYWNldFJ1bnRpbWVWZXJzaW9uLCBkZXNjcmlwdG9yLmdldEZhY2V0UnVudGltZVZlcnNpb24oKSkgJiYKLQkJCSAgIG1hdGNoZXMoZmFjZXRJRCwgZGVzY3JpcHRvci5nZXRGYWNldElEKCkpICYmCi0JCQkgICBtYXRjaGVzKGZhY2V0VmVyc2lvbiwgZGVzY3JpcHRvci5nZXRGYWNldFZlcnNpb24oKSkpewotCQkJCXJldHVybiBkZXNjcmlwdG9yLmdldFByZXNldElEKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGNvbnNpc3RzCi0JICogb2YgYSBjb21tb24gZGVsaW1pbmF0ZWQgbGlzdCBvZiBzaW1wbGUgcGF0dGVybnMgRWFjaCBzaW1wbGUgcGF0dGVybiBoYXMKLQkgKiBhbiBvcHRpb25hbCBzdGFydGluZyBvciBlbmRpbmcgKiBzbyBhIFN0cmluZy5zdGFydHNXaXRoKCkgb3IKLQkgKiBTdHJpbmcuZW5kc1dpdGgoKS4gQm90aCBtYXkgYmUgY29tYmluZWQgdG8gY29tcHV0ZSBhIFN0cmluZy5pbmRleE9mKCkgIT0KLQkgKiAtMQotCSAqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHBhdHRlcm4pewotCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuLCAiLCIpOwotCQl3aGlsZShzdHJUb2suaGFzTW9yZVRva2VucygpKXsKLQkJCVN0cmluZyBzaW1wbGVQYXR0ZXJuID0gc3RyVG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmKHNpbXBsZVBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKXsKLQkJCQlpZihzaW1wbGVQYXR0ZXJuLmxlbmd0aCgpIDwgMil7Ci0JCQkJCXJldHVybiB0cnVlOyAvLyBpLmUuICoKLQkJCQl9Ci0JCQkJaWYoc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsKLQkJCQkJaWYoc2ltcGxlUGF0dGVybi5sZW5ndGgoKSA8IDMpeyAKLQkJCQkJCXJldHVybiB0cnVlOyAvLyBpLmUuICoqCi0JCQkJCX0KLQkJCQkJaWYodmFsdWUuaW5kZXhPZihzaW1wbGVQYXR0ZXJuLnN1YnN0cmluZygxLCBzaW1wbGVQYXR0ZXJuLmxlbmd0aCgpLTIpKSAhPSAtMSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKHZhbHVlLmVuZHNXaXRoKHNpbXBsZVBhdHRlcm4uc3Vic3RyaW5nKDEpKSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZihzaW1wbGVQYXR0ZXJuLmVuZHNXaXRoKCIqIikpewotCQkJCWlmKHZhbHVlLnN0YXJ0c1dpdGgoc2ltcGxlUGF0dGVybi5zdWJzdHJpbmcoMCwgc2ltcGxlUGF0dGVybi5sZW5ndGgoKS0yKSkpewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYodmFsdWUuZXF1YWxzKHNpbXBsZVBhdHRlcm4pKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgPFN0cmluZz4gZ2V0U3RhdGljVG9rZW5zKFN0cmluZyBwYXR0ZXJuKXsKLQkJTGlzdCA8U3RyaW5nPiBzdGF0aWNUb2tlbnMgPSBuZXcgQXJyYXlMaXN0IDxTdHJpbmc+ICgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJuLCAiLCIpOwotCQl3aGlsZShzdHJUb2suaGFzTW9yZVRva2VucygpKXsKLQkJCVN0cmluZyBzaW1wbGVQYXR0ZXJuID0gc3RyVG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmKCFzaW1wbGVQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSAmJiAhc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsKLQkJCQlzdGF0aWNUb2tlbnMuYWRkKHNpbXBsZVBhdHRlcm4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0aWNUb2tlbnM7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCByZWFkRGVzY3JpcHRvcnMoKSB7Ci0JCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxNYXBwaW5nRGVzY3JpcHRvcj4oKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChXU1RXZWJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChFTEVNRU5UX01BUFBJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0JCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfSUQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcnVudGltZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCk7Ci0JCQkJaWYgKG51bGwgPT0gcnVudGltZUlEIHx8IHJ1bnRpbWVJRC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlMaXN0IDxTdHJpbmc+IHN0YXRpY1J1bnRpbWVJRHMgPSBnZXRTdGF0aWNUb2tlbnMocnVudGltZUlEKTsKLQkJCQlMaXN0IDxJUnVudGltZUNvbXBvbmVudFR5cGU+IHN0YXRpY1J1bnRpbWVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDb21wb25lbnRUeXBlPigpOwotCQkJCWZvcihTdHJpbmcgc3RhdGljUnVudGltZUlEIDogc3RhdGljUnVudGltZUlEcyl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUnVudGltZUNvbXBvbmVudFR5cGUgcnVudGltZVR5cGUgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZShzdGF0aWNSdW50aW1lSUQpOwotCQkJCQkJaWYocnVudGltZVR5cGUgIT0gbnVsbCl7Ci0JCQkJCQkJc3RhdGljUnVudGltZVR5cGVzLmFkZChydW50aW1lVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCArICI6ICIgKyBydW50aW1lSUQgKyIgdW5hYmxlIHRvIHJlc29sdmUgcnVudGltZTogIitzdGF0aWNSdW50aW1lSUQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkKLQkJCQlTdHJpbmcgcnVudGltZVZlcnNpb25TdHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OKTsKLQkJCQlpZiAobnVsbCA9PSBydW50aW1lVmVyc2lvblN0ciB8fCBydW50aW1lVmVyc2lvblN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1ZFUlNJT04pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYoIXN0YXRpY1J1bnRpbWVUeXBlcy5pc0VtcHR5KCkpewotCQkJCQlMaXN0IDxTdHJpbmc+IHN0YXRpY1J1bnRpbWVWZXJzaW9ucyA9IGdldFN0YXRpY1Rva2VucyhydW50aW1lVmVyc2lvblN0cik7Ci0JCQkJCWZvcihTdHJpbmcgc3RhdGljVmVyc2lvbiA6IHN0YXRpY1J1bnRpbWVWZXJzaW9ucyl7Ci0JCQkJCQlib29sZWFuIGZvdW5kVmVyc2lvbiA9IGZhbHNlOwotCQkJCQkJZm9yKGludCBrPTA7azxzdGF0aWNSdW50aW1lVHlwZXMuc2l6ZSgpICYmICFmb3VuZFZlcnNpb247aysrKXsKLQkJCQkJCQlJUnVudGltZUNvbXBvbmVudFR5cGUgcnVudGltZVR5cGUgPSBzdGF0aWNSdW50aW1lVHlwZXMuZ2V0KGspOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUlSdW50aW1lQ29tcG9uZW50VmVyc2lvbiB2ZXJzaW9uID0gcnVudGltZVR5cGUuZ2V0VmVyc2lvbihzdGF0aWNWZXJzaW9uKTsKLQkJCQkJCQkJZm91bmRWZXJzaW9uID0gdHJ1ZTsKLQkJCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvL2VhdCBpdAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKCFmb3VuZFZlcnNpb24pewotCQkJCQkJCVN0cmluZ0J1ZmZlciB2YWxpZFZlcnNpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigiIHZhbGlkIHZlcnNpb25zIGluY2x1ZGU6ICIpOwotCQkJCQkJCWZvcihJUnVudGltZUNvbXBvbmVudFR5cGUgcnVudGltZVR5cGUgOiBzdGF0aWNSdW50aW1lVHlwZXMpIHsKLQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiOiAiKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvcjxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IGl0ZXJhdG9yID0gcnVudGltZVR5cGUuZ2V0VmVyc2lvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZChpdGVyYXRvci5uZXh0KCkuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJCQkJCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiICIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OICsgIjogIiArIHN0YXRpY1ZlcnNpb24KLQkJCQkJCQkJCSsgdmFsaWRWZXJzaW9ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIGZhY2V0SUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRkFDRVRfSUQpOwotCQkJCWlmIChudWxsID09IGZhY2V0SUQgfHwgZmFjZXRJRC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9JRCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlMaXN0IDxTdHJpbmc+IHN0YXRpY0ZhY2V0SURzID0gZ2V0U3RhdGljVG9rZW5zKGZhY2V0SUQpOwotCQkJCUxpc3QgPElQcm9qZWN0RmFjZXQ+IHN0YXRpY0ZhY2V0cyA9IG5ldyBBcnJheUxpc3QgPElQcm9qZWN0RmFjZXQ+KCk7Ci0JCQkJZm9yKFN0cmluZyBzdGF0aWNGYWNldElEOnN0YXRpY0ZhY2V0SURzKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoc3RhdGljRmFjZXRJRCk7Ci0JCQkJCQlpZihudWxsICE9IGZhY2V0KXsKLQkJCQkJCQlzdGF0aWNGYWNldHMuYWRkKGZhY2V0KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfSUQgKyAiOiAiICsgc3RhdGljRmFjZXRJRCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIGZhY2V0VmVyc2lvblN0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OKTsKLQkJCQlpZiAobnVsbCA9PSBmYWNldFZlcnNpb25TdHIgfHwgZmFjZXRWZXJzaW9uU3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJTGlzdCA8U3RyaW5nPnN0YXRpY0ZhY2V0VmVyc2lvblN0cnMgPSBnZXRTdGF0aWNUb2tlbnMoZmFjZXRWZXJzaW9uU3RyKTsKLQkJCQlpZighc3RhdGljRmFjZXRzLmlzRW1wdHkoKSAmJiAhc3RhdGljRmFjZXRWZXJzaW9uU3Rycy5pc0VtcHR5KCkpewotCQkJCQlmb3IoU3RyaW5nIHN0YXRpY0ZhY2V0VmVyc2lvbjpzdGF0aWNGYWNldFZlcnNpb25TdHJzKXsKLQkJCQkJCWJvb2xlYW4gZm91bmRGYWNldFZlcnNpb24gPSBmYWxzZTsKLQkJCQkJCWZvcihpbnQgaz0wO2s8IHN0YXRpY0ZhY2V0cy5zaXplKCkgJiYgIWZvdW5kRmFjZXRWZXJzaW9uOyBrKyspIHsKLQkJCQkJCQlJUHJvamVjdEZhY2V0IHN0YXRpY0ZhY2V0ID0gc3RhdGljRmFjZXRzLmdldChrKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBzdGF0aWNWZXJzaW9uID0gc3RhdGljRmFjZXQuZ2V0VmVyc2lvbihzdGF0aWNGYWNldFZlcnNpb24pOwotCQkJCQkJCQlpZihzdGF0aWNWZXJzaW9uICE9IG51bGwpewotCQkJCQkJCQkJZm91bmRGYWNldFZlcnNpb24gPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy9lYXQgaXQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighZm91bmRGYWNldFZlcnNpb24pewotCQkJCQkJCVN0cmluZ0J1ZmZlciB2YWxpZFZlcnNpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigiIHZhbGlkIHZlcnNpb25zIGluY2x1ZGU6ICIpOwotCQkJCQkJCWZvcihJUHJvamVjdEZhY2V0IHN0YXRpY0ZhY2V0OnN0YXRpY0ZhY2V0cyl7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCJcbiIpOwotCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZChzdGF0aWNGYWNldC5nZXRJZCgpKTsKLQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIjogIik7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3I8SVByb2plY3RGYWNldFZlcnNpb24+IGl0ZXJhdG9yID0gc3RhdGljRmFjZXQuZ2V0VmVyc2lvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZChpdGVyYXRvci5uZXh0KCkuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJCQkJCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiICIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfVkVSU0lPTiArICI6ICIgKyBzdGF0aWNGYWNldFZlcnNpb24KLQkJCQkJCQkJCSsgdmFsaWRWZXJzaW9ucyk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0JCi0JCQkJfQotCQkJCVN0cmluZyBwcmVzZXRJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUkVTRVRfSUQpOwotCQkJCWlmIChudWxsID09IHByZXNldElEIHx8IHByZXNldElELnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX1BSRVNFVF9JRCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQocHJlc2V0SUQpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfUFJFU0VUX0lEICsgIjogIiArIHByZXNldElELCBlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCU1hcHBpbmdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgTWFwcGluZ0Rlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQkJZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkVsZW1lbnRzIG11c3QgYmUgbmFtZWQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIHdpdGhpbiB0aGUgZXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UKTsKLQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkVsZW1lbnQ6ICIgKyBlbGVtZW50LmdldE5hbWUoKSArICIgaXMgaW52YWxpZCB3aXRoaW4gdGhlIGV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDc2MjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rIElTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXN9Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAiSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JPT1QgPSAiSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcy5DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYWFmZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSB7QGxpbmsgU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlcn0KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3ZpZGVyIAotIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotIGltcGxlbWVudHMgSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllc3sKLQotCXB1YmxpYyBXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3ZpZGVyKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChQUk9KRUNUKTsKLQkJbmFtZXMuYWRkKENPTlRFWFRfUk9PVCk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFhZTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5TZXJ2ZXJDb250ZXh0Um9vdFVwZGF0ZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgCi0gKiAgIFJlcGxhY2VkIGJ5IHtAbGluayBTZXJ2ZXJDb250ZXh0Um9vdFVwZGF0ZU9wZXJhdGlvbn0gCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbiAKLSBleHRlbmRzICBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLSBpbXBsZW1lbnRzIElXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXN7Ci0JCi0KLQlwdWJsaWMgV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpbW9kZWwuZ2V0UHJvcGVydHkoIElXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCApOwotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcy5DT05URVhUX1JPT1QgKTsKLQkJaWYgKGNvbnRleHRSb290ICE9IG51bGwpIHsKLQkJCUNvbXBvbmVudFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0LCBjb250ZXh0Um9vdCk7CQkJCi0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0K